ZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9BV1RFdmVudC5qYXZhIGIvYXd0L2phdmEvYXd0L0FXVEV2ZW50LmphdmEKaW5kZXggMWVkOWEzNy4uYThkYzgzYSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L0FXVEV2ZW50LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L0FXVEV2ZW50LmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgRG1pdHJ5IEEuIER1cm5ldiwgTWljaGFlbCBEYW5pbG92CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dDsKIAogaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKQEAgLTI3LDE5MCArMjgsMjUyIEBACiBpbXBvcnQgamF2YS5hd3QuZXZlbnQuKjsKIAogLyoqCi0gKiBUaGUgYWJzdHJhY3QgQVdUIGV2ZW50cyBpcyBiYXNlIGNsYXNzIGZvciBhbGwgQVdUIGV2ZW50cy4gCi0gKiBUaGlzIGNsYXNzIGFuZCBpdHMgc3ViY2xhc3NlcyBzdXBlcmNlZGUgdGhlIG9yaWdpbmFsIGphdmEuYXd0LkV2ZW50IGNsYXNzLgorICogVGhlIGFic3RyYWN0IGNsYXNzIEFXVEV2ZW50IGlzIHRoZSBiYXNlIGNsYXNzIGZvciBhbGwgQVdUIGV2ZW50cy4gVGhpcyBjbGFzcworICogYW5kIGl0cyBzdWJjbGFzc2VzIHN1cGVyc2VkZSB0aGUgb3JpZ2luYWwgamF2YS5hd3QuRXZlbnQgY2xhc3MuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQVdURXZlbnQgZXh0ZW5kcyBFdmVudE9iamVjdCB7Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELiAqLworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTE4MjUzMTQ3NzkxNjA0MDk0MDVMOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBDT01QT05FTlRfRVZFTlRfTUFTSyBpbmRpY2F0ZXMgdGhlIGV2ZW50IHJlbGF0ZXMgdG8gYSBjb21wb25lbnQuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IENPTVBPTkVOVF9FVkVOVF9NQVNLIGluZGljYXRlcyB0aGUgZXZlbnQgcmVsYXRlcyB0byBhCisgICAgICogY29tcG9uZW50LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBDT01QT05FTlRfRVZFTlRfTUFTSyA9IDE7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IENPTlRBSU5FUl9FVkVOVF9NQVNLIGluZGljYXRlcyB0aGUgZXZlbnQgcmVsYXRlcyB0byBhIGNvbnRhaW5lci4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgQ09OVEFJTkVSX0VWRU5UX01BU0sgaW5kaWNhdGVzIHRoZSBldmVudCByZWxhdGVzIHRvIGEKKyAgICAgKiBjb250YWluZXIuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIENPTlRBSU5FUl9FVkVOVF9NQVNLID0gMjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgRk9DVVNfRVZFTlRfTUFTSyBpbmRpY2F0ZXMgdGhlIGV2ZW50IHJlbGF0ZXMgdG8gdGhlIGZvY3VzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBGT0NVU19FVkVOVF9NQVNLIGluZGljYXRlcyB0aGUgZXZlbnQgcmVsYXRlcyB0byB0aGUgZm9jdXMuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEZPQ1VTX0VWRU5UX01BU0sgPSA0OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBLRVlfRVZFTlRfTUFTSyBpbmRpY2F0ZXMgdGhlIGV2ZW50IHJlbGF0ZXMgdG8gYSBrZXkuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEtFWV9FVkVOVF9NQVNLIGluZGljYXRlcyB0aGUgZXZlbnQgcmVsYXRlcyB0byBhIGtleS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgS0VZX0VWRU5UX01BU0sgPSA4OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBNT1VTRV9FVkVOVF9NQVNLIGluZGljYXRlcyB0aGUgZXZlbnQgcmVsYXRlcyB0byB0aGUgbW91c2UuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IE1PVVNFX0VWRU5UX01BU0sgaW5kaWNhdGVzIHRoZSBldmVudCByZWxhdGVzIHRvIHRoZSBtb3VzZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgTU9VU0VfRVZFTlRfTUFTSyA9IDE2OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBNT1VTRV9NT1RJT05fRVZFTlRfTUFTSyBpbmRpY2F0ZXMgdGhlIGV2ZW50IHJlbGF0ZXMgdG8gYSBtb3VzZSBtb3Rpb24uICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IE1PVVNFX01PVElPTl9FVkVOVF9NQVNLIGluZGljYXRlcyB0aGUgZXZlbnQgcmVsYXRlcyB0byBhCisgICAgICogbW91c2UgbW90aW9uLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBNT1VTRV9NT1RJT05fRVZFTlRfTUFTSyA9IDMyOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBXSU5ET1dfRVZFTlRfTUFTSyBpbmRpY2F0ZXMgdGhlIGV2ZW50IHJlbGF0ZXMgdG8gYSB3aW5kb3cuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFdJTkRPV19FVkVOVF9NQVNLIGluZGljYXRlcyB0aGUgZXZlbnQgcmVsYXRlcyB0byBhIHdpbmRvdy4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgV0lORE9XX0VWRU5UX01BU0sgPSA2NDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgQUNUSU9OX0VWRU5UX01BU0sgaW5kaWNhdGVzIHRoZSBldmVudCByZWxhdGVzIHRvIGFuIGFjdGlvbi4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgQUNUSU9OX0VWRU5UX01BU0sgaW5kaWNhdGVzIHRoZSBldmVudCByZWxhdGVzIHRvIGFuIGFjdGlvbi4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQUNUSU9OX0VWRU5UX01BU0sgPSAxMjg7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IEFESlVTVE1FTlRfRVZFTlRfTUFTSyBpbmRpY2F0ZXMgdGhlIGV2ZW50IHJlbGF0ZXMgdG8gYW4gYWRqdXN0bWVudC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgQURKVVNUTUVOVF9FVkVOVF9NQVNLIGluZGljYXRlcyB0aGUgZXZlbnQgcmVsYXRlcyB0byBhbgorICAgICAqIGFkanVzdG1lbnQuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEFESlVTVE1FTlRfRVZFTlRfTUFTSyA9IDI1NjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgSVRFTV9FVkVOVF9NQVNLIGluZGljYXRlcyB0aGUgZXZlbnQgcmVsYXRlcyB0byBhbiBpdGVtLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBJVEVNX0VWRU5UX01BU0sgaW5kaWNhdGVzIHRoZSBldmVudCByZWxhdGVzIHRvIGFuIGl0ZW0uCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIElURU1fRVZFTlRfTUFTSyA9IDUxMjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgVEVYVF9FVkVOVF9NQVNLIGluZGljYXRlcyB0aGUgZXZlbnQgcmVsYXRlcyB0byB0ZXh0LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBURVhUX0VWRU5UX01BU0sgaW5kaWNhdGVzIHRoZSBldmVudCByZWxhdGVzIHRvIHRleHQuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFRFWFRfRVZFTlRfTUFTSyA9IDEwMjQ7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IElOUFVUX01FVEhPRF9FVkVOVF9NQVNLIGluZGljYXRlcyB0aGUgZXZlbnQgcmVsYXRlcyB0byBhbiBpbnB1dCBtZXRob2QuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IElOUFVUX01FVEhPRF9FVkVOVF9NQVNLIGluZGljYXRlcyB0aGUgZXZlbnQgcmVsYXRlcyB0byBhbgorICAgICAqIGlucHV0IG1ldGhvZC4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgSU5QVVRfTUVUSE9EX0VWRU5UX01BU0sgPSAyMDQ4OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBQQUlOVF9FVkVOVF9NQVNLIGluZGljYXRlcyB0aGUgZXZlbnQgcmVsYXRlcyB0byBhIHBhaW50IG1ldGhvZC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgUEFJTlRfRVZFTlRfTUFTSyBpbmRpY2F0ZXMgdGhlIGV2ZW50IHJlbGF0ZXMgdG8gYSBwYWludAorICAgICAqIG1ldGhvZC4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgUEFJTlRfRVZFTlRfTUFTSyA9IDgxOTI7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IElOVk9DQVRJT05fRVZFTlRfTUFTSyBpbmRpY2F0ZXMgdGhlIGV2ZW50IHJlbGF0ZXMgdG8gYSBtZXRob2QgaW52b2NhdGlvbi4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgSU5WT0NBVElPTl9FVkVOVF9NQVNLIGluZGljYXRlcyB0aGUgZXZlbnQgcmVsYXRlcyB0byBhCisgICAgICogbWV0aG9kIGludm9jYXRpb24uCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIElOVk9DQVRJT05fRVZFTlRfTUFTSyA9IDE2Mzg0OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBISUVSQVJDSFlfRVZFTlRfTUFTSyBpbmRpY2F0ZXMgdGhlIGV2ZW50IHJlbGF0ZXMgdG8gYSBoaWVyYXJjaHkuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEhJRVJBUkNIWV9FVkVOVF9NQVNLIGluZGljYXRlcyB0aGUgZXZlbnQgcmVsYXRlcyB0byBhCisgICAgICogaGllcmFyY2h5LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBISUVSQVJDSFlfRVZFTlRfTUFTSyA9IDMyNzY4OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBISUVSQVJDSFlfQk9VTkRTX0VWRU5UX01BU0sgaW5kaWNhdGVzIHRoZSBldmVudCByZWxhdGVzIHRvIGhpZXJhcmNoeSBib3VuZHMuCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEhJRVJBUkNIWV9CT1VORFNfRVZFTlRfTUFTSyBpbmRpY2F0ZXMgdGhlIGV2ZW50IHJlbGF0ZXMgdG8KKyAgICAgKiBoaWVyYXJjaHkgYm91bmRzLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBISUVSQVJDSFlfQk9VTkRTX0VWRU5UX01BU0sgPSA2NTUzNjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgTU9VU0VfV0hFRUxfRVZFTlRfTUFTSyBpbmRpY2F0ZXMgdGhlIGV2ZW50IHJlbGF0ZXMgdG8gdGhlIG1vdXNlIHdoZWVsLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBNT1VTRV9XSEVFTF9FVkVOVF9NQVNLIGluZGljYXRlcyB0aGUgZXZlbnQgcmVsYXRlcyB0byB0aGUKKyAgICAgKiBtb3VzZSB3aGVlbC4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgTU9VU0VfV0hFRUxfRVZFTlRfTUFTSyA9IDEzMTA3MjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgV0lORE9XX1NUQVRFX0VWRU5UX01BU0sgaW5kaWNhdGVzIHRoZSBldmVudCByZWxhdGVzIHRvIGEgd2luZG93IHN0YXRlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBXSU5ET1dfU1RBVEVfRVZFTlRfTUFTSyBpbmRpY2F0ZXMgdGhlIGV2ZW50IHJlbGF0ZXMgdG8gYQorICAgICAqIHdpbmRvdyBzdGF0ZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgV0lORE9XX1NUQVRFX0VWRU5UX01BU0sgPSAyNjIxNDQ7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFdJTkRPV19GT0NVU19FVkVOVF9NQVNLIGluZGljYXRlcyB0aGUgZXZlbnQgcmVsYXRlcyB0byBhIHdpbmRvdyBmb2N1cy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgV0lORE9XX0ZPQ1VTX0VWRU5UX01BU0sgaW5kaWNhdGVzIHRoZSBldmVudCByZWxhdGVzIHRvIGEKKyAgICAgKiB3aW5kb3cgZm9jdXMuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFdJTkRPV19GT0NVU19FVkVOVF9NQVNLID0gNTI0Mjg4OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBSRVNFUlZFRF9JRF9NQVggaW5kaWNhdGVzIHRoZSBtYXhpbXVtIHZhbHVlIGZvciByZXNlcnZlZCAKLSAgICAgKiBBV1QgZXZlbnQgSURzLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBSRVNFUlZFRF9JRF9NQVggaW5kaWNhdGVzIHRoZSBtYXhpbXVtIHZhbHVlIGZvciByZXNlcnZlZCBBV1QKKyAgICAgKiBldmVudCBJRHMuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTRVJWRURfSURfTUFYID0gMTk5OTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgZXZlbnRzTWFwLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBldmVudHNNYXAuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaHRhYmxlPEludGVnZXIsIEV2ZW50RGVzY3JpcHRvcj4gZXZlbnRzTWFwID0gbmV3IEhhc2h0YWJsZTxJbnRlZ2VyLCBFdmVudERlc2NyaXB0b3I+KCk7CiAKLSAgICAvKiogVGhlIGNvbnZlcnRlci4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY29udmVydGVyLgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIEV2ZW50Q29udmVydGVyIGNvbnZlcnRlcjsKIAotICAgIC8qKiBUaGUgSUQgb2YgdGhlIGV2ZW50LiAqLworICAgIC8qKgorICAgICAqIFRoZSBJRCBvZiB0aGUgZXZlbnQuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBpZDsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgY29uc3VtZWQgaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBldmVudCBpcyBzZW50IGJhY2sgZG93biB0byAKLSAgICAgKiB0aGUgcGVlciBvbmNlIHRoZSBzb3VyY2UgaGFzIHByb2Nlc3NlZCBpdCAoZmFsc2UgbWVhbnMgaXQncyBzZW50IHRvIHRoZSBwZWVyLAorICAgIC8qKgorICAgICAqIFRoZSBjb25zdW1lZCBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIGV2ZW50IGlzIHNlbnQgYmFjayBkb3duIHRvIHRoZQorICAgICAqIHBlZXIgb25jZSB0aGUgc291cmNlIGhhcyBwcm9jZXNzZWQgaXQgKGZhbHNlIG1lYW5zIGl0J3Mgc2VudCB0byB0aGUgcGVlciwKICAgICAgKiB0cnVlIG1lYW5zIGl0J3Mgbm90KS4KLSAgICAgKi8gCisgICAgICovCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY29uc3VtZWQ7CiAKLSAgICAvKiogVGhlIGRpc3BhdGNoZWQgYnkga2ZtLiAqLworICAgIC8qKgorICAgICAqIFRoZSBkaXNwYXRjaGVkIGJ5IGtmbS4KKyAgICAgKi8KICAgICBib29sZWFuIGRpc3BhdGNoZWRCeUtGTTsKLSAgICAKLSAgICAvKiogVGhlIGlzIHBvc3RlZC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBpcyBwb3N0ZWQuCisgICAgICovCiAgICAgdHJhbnNpZW50IGJvb2xlYW4gaXNQb3N0ZWQ7CiAKICAgICBzdGF0aWMgewotICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKEtleUV2ZW50LktFWV9UWVBFRCksCi0gICAgICAgICAgICAgICAgbmV3IEV2ZW50RGVzY3JpcHRvcihLRVlfRVZFTlRfTUFTSywgS2V5TGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihLZXlFdmVudC5LRVlfUFJFU1NFRCksCi0gICAgICAgICAgICAgICAgbmV3IEV2ZW50RGVzY3JpcHRvcihLRVlfRVZFTlRfTUFTSywgS2V5TGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihLZXlFdmVudC5LRVlfUkVMRUFTRUQpLAotICAgICAgICAgICAgICAgIG5ldyBFdmVudERlc2NyaXB0b3IoS0VZX0VWRU5UX01BU0ssIEtleUxpc3RlbmVyLmNsYXNzKSk7Ci0gICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoTW91c2VFdmVudC5NT1VTRV9DTElDS0VEKSwKLSAgICAgICAgICAgICAgICBuZXcgRXZlbnREZXNjcmlwdG9yKE1PVVNFX0VWRU5UX01BU0ssIE1vdXNlTGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihNb3VzZUV2ZW50Lk1PVVNFX1BSRVNTRUQpLAotICAgICAgICAgICAgICAgIG5ldyBFdmVudERlc2NyaXB0b3IoTU9VU0VfRVZFTlRfTUFTSywgTW91c2VMaXN0ZW5lci5jbGFzcykpOwotICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKE1vdXNlRXZlbnQuTU9VU0VfUkVMRUFTRUQpLAotICAgICAgICAgICAgICAgIG5ldyBFdmVudERlc2NyaXB0b3IoTU9VU0VfRVZFTlRfTUFTSywgTW91c2VMaXN0ZW5lci5jbGFzcykpOwotICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKE1vdXNlRXZlbnQuTU9VU0VfTU9WRUQpLAotICAgICAgICAgICAgICAgIG5ldyBFdmVudERlc2NyaXB0b3IoTU9VU0VfTU9USU9OX0VWRU5UX01BU0ssIE1vdXNlTW90aW9uTGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihNb3VzZUV2ZW50Lk1PVVNFX0VOVEVSRUQpLAotICAgICAgICAgICAgICAgIG5ldyBFdmVudERlc2NyaXB0b3IoTU9VU0VfRVZFTlRfTUFTSywgTW91c2VMaXN0ZW5lci5jbGFzcykpOwotICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKE1vdXNlRXZlbnQuTU9VU0VfRVhJVEVEKSwKLSAgICAgICAgICAgICAgICBuZXcgRXZlbnREZXNjcmlwdG9yKE1PVVNFX0VWRU5UX01BU0ssIE1vdXNlTGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihNb3VzZUV2ZW50Lk1PVVNFX0RSQUdHRUQpLAotICAgICAgICAgICAgICAgIG5ldyBFdmVudERlc2NyaXB0b3IoTU9VU0VfTU9USU9OX0VWRU5UX01BU0ssIE1vdXNlTW90aW9uTGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihNb3VzZUV2ZW50Lk1PVVNFX1dIRUVMKSwKLSAgICAgICAgICAgICAgICBuZXcgRXZlbnREZXNjcmlwdG9yKE1PVVNFX1dIRUVMX0VWRU5UX01BU0ssIE1vdXNlV2hlZWxMaXN0ZW5lci5jbGFzcykpOwotICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKENvbXBvbmVudEV2ZW50LkNPTVBPTkVOVF9NT1ZFRCksCi0gICAgICAgICAgICAgICAgbmV3IEV2ZW50RGVzY3JpcHRvcihDT01QT05FTlRfRVZFTlRfTUFTSywgQ29tcG9uZW50TGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihDb21wb25lbnRFdmVudC5DT01QT05FTlRfUkVTSVpFRCksCi0gICAgICAgICAgICAgICAgbmV3IEV2ZW50RGVzY3JpcHRvcihDT01QT05FTlRfRVZFTlRfTUFTSywgQ29tcG9uZW50TGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihDb21wb25lbnRFdmVudC5DT01QT05FTlRfU0hPV04pLAotICAgICAgICAgICAgICAgIG5ldyBFdmVudERlc2NyaXB0b3IoQ09NUE9ORU5UX0VWRU5UX01BU0ssIENvbXBvbmVudExpc3RlbmVyLmNsYXNzKSk7Ci0gICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoQ29tcG9uZW50RXZlbnQuQ09NUE9ORU5UX0hJRERFTiksCi0gICAgICAgICAgICAgICAgbmV3IEV2ZW50RGVzY3JpcHRvcihDT01QT05FTlRfRVZFTlRfTUFTSywgQ29tcG9uZW50TGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihGb2N1c0V2ZW50LkZPQ1VTX0dBSU5FRCksCi0gICAgICAgICAgICAgICAgbmV3IEV2ZW50RGVzY3JpcHRvcihGT0NVU19FVkVOVF9NQVNLLCBGb2N1c0xpc3RlbmVyLmNsYXNzKSk7Ci0gICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoRm9jdXNFdmVudC5GT0NVU19MT1NUKSwKLSAgICAgICAgICAgICAgICBuZXcgRXZlbnREZXNjcmlwdG9yKEZPQ1VTX0VWRU5UX01BU0ssIEZvY3VzTGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihQYWludEV2ZW50LlBBSU5UKSwKLSAgICAgICAgICAgICAgICBuZXcgRXZlbnREZXNjcmlwdG9yKFBBSU5UX0VWRU5UX01BU0ssIG51bGwpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihQYWludEV2ZW50LlVQREFURSksCi0gICAgICAgICAgICAgICAgbmV3IEV2ZW50RGVzY3JpcHRvcihQQUlOVF9FVkVOVF9NQVNLLCBudWxsKSk7Ci0gICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoV2luZG93RXZlbnQuV0lORE9XX09QRU5FRCksCi0gICAgICAgICAgICAgICAgbmV3IEV2ZW50RGVzY3JpcHRvcihXSU5ET1dfRVZFTlRfTUFTSywgV2luZG93TGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihXaW5kb3dFdmVudC5XSU5ET1dfQ0xPU0lORyksCi0gICAgICAgICAgICAgICAgbmV3IEV2ZW50RGVzY3JpcHRvcihXSU5ET1dfRVZFTlRfTUFTSywgV2luZG93TGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihXaW5kb3dFdmVudC5XSU5ET1dfQ0xPU0VEKSwKLSAgICAgICAgICAgICAgICBuZXcgRXZlbnREZXNjcmlwdG9yKFdJTkRPV19FVkVOVF9NQVNLLCBXaW5kb3dMaXN0ZW5lci5jbGFzcykpOwotICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKFdpbmRvd0V2ZW50LldJTkRPV19ERUlDT05JRklFRCksCi0gICAgICAgICAgICAgICAgbmV3IEV2ZW50RGVzY3JpcHRvcihXSU5ET1dfRVZFTlRfTUFTSywgV2luZG93TGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihXaW5kb3dFdmVudC5XSU5ET1dfSUNPTklGSUVEKSwKLSAgICAgICAgICAgICAgICBuZXcgRXZlbnREZXNjcmlwdG9yKFdJTkRPV19FVkVOVF9NQVNLLCBXaW5kb3dMaXN0ZW5lci5jbGFzcykpOwotICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKFdpbmRvd0V2ZW50LldJTkRPV19TVEFURV9DSEFOR0VEKSwKLSAgICAgICAgICAgICAgICBuZXcgRXZlbnREZXNjcmlwdG9yKFdJTkRPV19TVEFURV9FVkVOVF9NQVNLLCBXaW5kb3dTdGF0ZUxpc3RlbmVyLmNsYXNzKSk7Ci0gICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoV2luZG93RXZlbnQuV0lORE9XX0xPU1RfRk9DVVMpLAotICAgICAgICAgICAgICAgIG5ldyBFdmVudERlc2NyaXB0b3IoV0lORE9XX0ZPQ1VTX0VWRU5UX01BU0ssIFdpbmRvd0ZvY3VzTGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihXaW5kb3dFdmVudC5XSU5ET1dfR0FJTkVEX0ZPQ1VTKSwKLSAgICAgICAgICAgICAgICBuZXcgRXZlbnREZXNjcmlwdG9yKFdJTkRPV19GT0NVU19FVkVOVF9NQVNLLCBXaW5kb3dGb2N1c0xpc3RlbmVyLmNsYXNzKSk7Ci0gICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoV2luZG93RXZlbnQuV0lORE9XX0RFQUNUSVZBVEVEKSwKLSAgICAgICAgICAgICAgICBuZXcgRXZlbnREZXNjcmlwdG9yKFdJTkRPV19FVkVOVF9NQVNLLCBXaW5kb3dMaXN0ZW5lci5jbGFzcykpOwotICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKFdpbmRvd0V2ZW50LldJTkRPV19BQ1RJVkFURUQpLAotICAgICAgICAgICAgICAgIG5ldyBFdmVudERlc2NyaXB0b3IoV0lORE9XX0VWRU5UX01BU0ssIFdpbmRvd0xpc3RlbmVyLmNsYXNzKSk7Ci0gICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoSGllcmFyY2h5RXZlbnQuSElFUkFSQ0hZX0NIQU5HRUQpLAotICAgICAgICAgICAgICAgIG5ldyBFdmVudERlc2NyaXB0b3IoSElFUkFSQ0hZX0VWRU5UX01BU0ssIEhpZXJhcmNoeUxpc3RlbmVyLmNsYXNzKSk7Ci0gICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoSGllcmFyY2h5RXZlbnQuQU5DRVNUT1JfTU9WRUQpLAotICAgICAgICAgICAgICAgIG5ldyBFdmVudERlc2NyaXB0b3IoSElFUkFSQ0hZX0JPVU5EU19FVkVOVF9NQVNLLCBIaWVyYXJjaHlCb3VuZHNMaXN0ZW5lci5jbGFzcykpOwotICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKEhpZXJhcmNoeUV2ZW50LkFOQ0VTVE9SX1JFU0laRUQpLAotICAgICAgICAgICAgICAgIG5ldyBFdmVudERlc2NyaXB0b3IoSElFUkFSQ0hZX0JPVU5EU19FVkVOVF9NQVNLLCBIaWVyYXJjaHlCb3VuZHNMaXN0ZW5lci5jbGFzcykpOwotICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKENvbnRhaW5lckV2ZW50LkNPTVBPTkVOVF9BRERFRCksCi0gICAgICAgICAgICAgICAgbmV3IEV2ZW50RGVzY3JpcHRvcihDT05UQUlORVJfRVZFTlRfTUFTSywgQ29udGFpbmVyTGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihDb250YWluZXJFdmVudC5DT01QT05FTlRfUkVNT1ZFRCksCi0gICAgICAgICAgICAgICAgbmV3IEV2ZW50RGVzY3JpcHRvcihDT05UQUlORVJfRVZFTlRfTUFTSywgQ29udGFpbmVyTGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihJbnB1dE1ldGhvZEV2ZW50LklOUFVUX01FVEhPRF9URVhUX0NIQU5HRUQpLAotICAgICAgICAgICAgICAgIG5ldyBFdmVudERlc2NyaXB0b3IoSU5QVVRfTUVUSE9EX0VWRU5UX01BU0ssIElucHV0TWV0aG9kTGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihJbnB1dE1ldGhvZEV2ZW50LkNBUkVUX1BPU0lUSU9OX0NIQU5HRUQpLAotICAgICAgICAgICAgICAgIG5ldyBFdmVudERlc2NyaXB0b3IoSU5QVVRfTUVUSE9EX0VWRU5UX01BU0ssIElucHV0TWV0aG9kTGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihJbnZvY2F0aW9uRXZlbnQuSU5WT0NBVElPTl9ERUZBVUxUKSwKLSAgICAgICAgICAgICAgICBuZXcgRXZlbnREZXNjcmlwdG9yKElOVk9DQVRJT05fRVZFTlRfTUFTSywgbnVsbCkpOwotICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKEl0ZW1FdmVudC5JVEVNX1NUQVRFX0NIQU5HRUQpLAotICAgICAgICAgICAgICAgIG5ldyBFdmVudERlc2NyaXB0b3IoSVRFTV9FVkVOVF9NQVNLLCBJdGVtTGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihUZXh0RXZlbnQuVEVYVF9WQUxVRV9DSEFOR0VEKSwKLSAgICAgICAgICAgICAgICBuZXcgRXZlbnREZXNjcmlwdG9yKFRFWFRfRVZFTlRfTUFTSywgVGV4dExpc3RlbmVyLmNsYXNzKSk7Ci0gICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoQWN0aW9uRXZlbnQuQUNUSU9OX1BFUkZPUk1FRCksCi0gICAgICAgICAgICAgICAgbmV3IEV2ZW50RGVzY3JpcHRvcihBQ1RJT05fRVZFTlRfTUFTSywgQWN0aW9uTGlzdGVuZXIuY2xhc3MpKTsKLSAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihBZGp1c3RtZW50RXZlbnQuQURKVVNUTUVOVF9WQUxVRV9DSEFOR0VEKSwKLSAgICAgICAgICAgICAgICBuZXcgRXZlbnREZXNjcmlwdG9yKEFESlVTVE1FTlRfRVZFTlRfTUFTSywgQWRqdXN0bWVudExpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoS2V5RXZlbnQuS0VZX1RZUEVEKSwgbmV3IEV2ZW50RGVzY3JpcHRvcihLRVlfRVZFTlRfTUFTSywKKyAgICAgICAgICAgICAgICBLZXlMaXN0ZW5lci5jbGFzcykpOworICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKEtleUV2ZW50LktFWV9QUkVTU0VEKSwgbmV3IEV2ZW50RGVzY3JpcHRvcihLRVlfRVZFTlRfTUFTSywKKyAgICAgICAgICAgICAgICBLZXlMaXN0ZW5lci5jbGFzcykpOworICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKEtleUV2ZW50LktFWV9SRUxFQVNFRCksIG5ldyBFdmVudERlc2NyaXB0b3IoS0VZX0VWRU5UX01BU0ssCisgICAgICAgICAgICAgICAgS2V5TGlzdGVuZXIuY2xhc3MpKTsKKyAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihNb3VzZUV2ZW50Lk1PVVNFX0NMSUNLRUQpLCBuZXcgRXZlbnREZXNjcmlwdG9yKE1PVVNFX0VWRU5UX01BU0ssCisgICAgICAgICAgICAgICAgTW91c2VMaXN0ZW5lci5jbGFzcykpOworICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKE1vdXNlRXZlbnQuTU9VU0VfUFJFU1NFRCksIG5ldyBFdmVudERlc2NyaXB0b3IoTU9VU0VfRVZFTlRfTUFTSywKKyAgICAgICAgICAgICAgICBNb3VzZUxpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoTW91c2VFdmVudC5NT1VTRV9SRUxFQVNFRCksIG5ldyBFdmVudERlc2NyaXB0b3IoTU9VU0VfRVZFTlRfTUFTSywKKyAgICAgICAgICAgICAgICBNb3VzZUxpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoTW91c2VFdmVudC5NT1VTRV9NT1ZFRCksIG5ldyBFdmVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgTU9VU0VfTU9USU9OX0VWRU5UX01BU0ssIE1vdXNlTW90aW9uTGlzdGVuZXIuY2xhc3MpKTsKKyAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihNb3VzZUV2ZW50Lk1PVVNFX0VOVEVSRUQpLCBuZXcgRXZlbnREZXNjcmlwdG9yKE1PVVNFX0VWRU5UX01BU0ssCisgICAgICAgICAgICAgICAgTW91c2VMaXN0ZW5lci5jbGFzcykpOworICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKE1vdXNlRXZlbnQuTU9VU0VfRVhJVEVEKSwgbmV3IEV2ZW50RGVzY3JpcHRvcihNT1VTRV9FVkVOVF9NQVNLLAorICAgICAgICAgICAgICAgIE1vdXNlTGlzdGVuZXIuY2xhc3MpKTsKKyAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihNb3VzZUV2ZW50Lk1PVVNFX0RSQUdHRUQpLCBuZXcgRXZlbnREZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgIE1PVVNFX01PVElPTl9FVkVOVF9NQVNLLCBNb3VzZU1vdGlvbkxpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoTW91c2VFdmVudC5NT1VTRV9XSEVFTCksIG5ldyBFdmVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgTU9VU0VfV0hFRUxfRVZFTlRfTUFTSywgTW91c2VXaGVlbExpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoQ29tcG9uZW50RXZlbnQuQ09NUE9ORU5UX01PVkVEKSwgbmV3IEV2ZW50RGVzY3JpcHRvcigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfRVZFTlRfTUFTSywgQ29tcG9uZW50TGlzdGVuZXIuY2xhc3MpKTsKKyAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihDb21wb25lbnRFdmVudC5DT01QT05FTlRfUkVTSVpFRCksIG5ldyBFdmVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX0VWRU5UX01BU0ssIENvbXBvbmVudExpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoQ29tcG9uZW50RXZlbnQuQ09NUE9ORU5UX1NIT1dOKSwgbmV3IEV2ZW50RGVzY3JpcHRvcigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfRVZFTlRfTUFTSywgQ29tcG9uZW50TGlzdGVuZXIuY2xhc3MpKTsKKyAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihDb21wb25lbnRFdmVudC5DT01QT05FTlRfSElEREVOKSwgbmV3IEV2ZW50RGVzY3JpcHRvcigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfRVZFTlRfTUFTSywgQ29tcG9uZW50TGlzdGVuZXIuY2xhc3MpKTsKKyAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihGb2N1c0V2ZW50LkZPQ1VTX0dBSU5FRCksIG5ldyBFdmVudERlc2NyaXB0b3IoRk9DVVNfRVZFTlRfTUFTSywKKyAgICAgICAgICAgICAgICBGb2N1c0xpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoRm9jdXNFdmVudC5GT0NVU19MT1NUKSwgbmV3IEV2ZW50RGVzY3JpcHRvcihGT0NVU19FVkVOVF9NQVNLLAorICAgICAgICAgICAgICAgIEZvY3VzTGlzdGVuZXIuY2xhc3MpKTsKKyAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihQYWludEV2ZW50LlBBSU5UKSwgbmV3IEV2ZW50RGVzY3JpcHRvcihQQUlOVF9FVkVOVF9NQVNLLCBudWxsKSk7CisgICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoUGFpbnRFdmVudC5VUERBVEUpLCBuZXcgRXZlbnREZXNjcmlwdG9yKFBBSU5UX0VWRU5UX01BU0ssIG51bGwpKTsKKyAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihXaW5kb3dFdmVudC5XSU5ET1dfT1BFTkVEKSwgbmV3IEV2ZW50RGVzY3JpcHRvcigKKyAgICAgICAgICAgICAgICBXSU5ET1dfRVZFTlRfTUFTSywgV2luZG93TGlzdGVuZXIuY2xhc3MpKTsKKyAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihXaW5kb3dFdmVudC5XSU5ET1dfQ0xPU0lORyksIG5ldyBFdmVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgV0lORE9XX0VWRU5UX01BU0ssIFdpbmRvd0xpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoV2luZG93RXZlbnQuV0lORE9XX0NMT1NFRCksIG5ldyBFdmVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgV0lORE9XX0VWRU5UX01BU0ssIFdpbmRvd0xpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoV2luZG93RXZlbnQuV0lORE9XX0RFSUNPTklGSUVEKSwgbmV3IEV2ZW50RGVzY3JpcHRvcigKKyAgICAgICAgICAgICAgICBXSU5ET1dfRVZFTlRfTUFTSywgV2luZG93TGlzdGVuZXIuY2xhc3MpKTsKKyAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihXaW5kb3dFdmVudC5XSU5ET1dfSUNPTklGSUVEKSwgbmV3IEV2ZW50RGVzY3JpcHRvcigKKyAgICAgICAgICAgICAgICBXSU5ET1dfRVZFTlRfTUFTSywgV2luZG93TGlzdGVuZXIuY2xhc3MpKTsKKyAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihXaW5kb3dFdmVudC5XSU5ET1dfU1RBVEVfQ0hBTkdFRCksIG5ldyBFdmVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgV0lORE9XX1NUQVRFX0VWRU5UX01BU0ssIFdpbmRvd1N0YXRlTGlzdGVuZXIuY2xhc3MpKTsKKyAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihXaW5kb3dFdmVudC5XSU5ET1dfTE9TVF9GT0NVUyksIG5ldyBFdmVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgV0lORE9XX0ZPQ1VTX0VWRU5UX01BU0ssIFdpbmRvd0ZvY3VzTGlzdGVuZXIuY2xhc3MpKTsKKyAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihXaW5kb3dFdmVudC5XSU5ET1dfR0FJTkVEX0ZPQ1VTKSwgbmV3IEV2ZW50RGVzY3JpcHRvcigKKyAgICAgICAgICAgICAgICBXSU5ET1dfRk9DVVNfRVZFTlRfTUFTSywgV2luZG93Rm9jdXNMaXN0ZW5lci5jbGFzcykpOworICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKFdpbmRvd0V2ZW50LldJTkRPV19ERUFDVElWQVRFRCksIG5ldyBFdmVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgV0lORE9XX0VWRU5UX01BU0ssIFdpbmRvd0xpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoV2luZG93RXZlbnQuV0lORE9XX0FDVElWQVRFRCksIG5ldyBFdmVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgV0lORE9XX0VWRU5UX01BU0ssIFdpbmRvd0xpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoSGllcmFyY2h5RXZlbnQuSElFUkFSQ0hZX0NIQU5HRUQpLCBuZXcgRXZlbnREZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgIEhJRVJBUkNIWV9FVkVOVF9NQVNLLCBIaWVyYXJjaHlMaXN0ZW5lci5jbGFzcykpOworICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKEhpZXJhcmNoeUV2ZW50LkFOQ0VTVE9SX01PVkVEKSwgbmV3IEV2ZW50RGVzY3JpcHRvcigKKyAgICAgICAgICAgICAgICBISUVSQVJDSFlfQk9VTkRTX0VWRU5UX01BU0ssIEhpZXJhcmNoeUJvdW5kc0xpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoSGllcmFyY2h5RXZlbnQuQU5DRVNUT1JfUkVTSVpFRCksIG5ldyBFdmVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgSElFUkFSQ0hZX0JPVU5EU19FVkVOVF9NQVNLLCBIaWVyYXJjaHlCb3VuZHNMaXN0ZW5lci5jbGFzcykpOworICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKENvbnRhaW5lckV2ZW50LkNPTVBPTkVOVF9BRERFRCksIG5ldyBFdmVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgQ09OVEFJTkVSX0VWRU5UX01BU0ssIENvbnRhaW5lckxpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoQ29udGFpbmVyRXZlbnQuQ09NUE9ORU5UX1JFTU9WRUQpLCBuZXcgRXZlbnREZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgIENPTlRBSU5FUl9FVkVOVF9NQVNLLCBDb250YWluZXJMaXN0ZW5lci5jbGFzcykpOworICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKElucHV0TWV0aG9kRXZlbnQuSU5QVVRfTUVUSE9EX1RFWFRfQ0hBTkdFRCksIG5ldyBFdmVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgSU5QVVRfTUVUSE9EX0VWRU5UX01BU0ssIElucHV0TWV0aG9kTGlzdGVuZXIuY2xhc3MpKTsKKyAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihJbnB1dE1ldGhvZEV2ZW50LkNBUkVUX1BPU0lUSU9OX0NIQU5HRUQpLCBuZXcgRXZlbnREZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgIElOUFVUX01FVEhPRF9FVkVOVF9NQVNLLCBJbnB1dE1ldGhvZExpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoSW52b2NhdGlvbkV2ZW50LklOVk9DQVRJT05fREVGQVVMVCksIG5ldyBFdmVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgSU5WT0NBVElPTl9FVkVOVF9NQVNLLCBudWxsKSk7CisgICAgICAgIGV2ZW50c01hcC5wdXQobmV3IEludGVnZXIoSXRlbUV2ZW50LklURU1fU1RBVEVfQ0hBTkdFRCksIG5ldyBFdmVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgSVRFTV9FVkVOVF9NQVNLLCBJdGVtTGlzdGVuZXIuY2xhc3MpKTsKKyAgICAgICAgZXZlbnRzTWFwLnB1dChuZXcgSW50ZWdlcihUZXh0RXZlbnQuVEVYVF9WQUxVRV9DSEFOR0VEKSwgbmV3IEV2ZW50RGVzY3JpcHRvcigKKyAgICAgICAgICAgICAgICBURVhUX0VWRU5UX01BU0ssIFRleHRMaXN0ZW5lci5jbGFzcykpOworICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKEFjdGlvbkV2ZW50LkFDVElPTl9QRVJGT1JNRUQpLCBuZXcgRXZlbnREZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgIEFDVElPTl9FVkVOVF9NQVNLLCBBY3Rpb25MaXN0ZW5lci5jbGFzcykpOworICAgICAgICBldmVudHNNYXAucHV0KG5ldyBJbnRlZ2VyKEFkanVzdG1lbnRFdmVudC5BREpVU1RNRU5UX1ZBTFVFX0NIQU5HRUQpLCBuZXcgRXZlbnREZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgIEFESlVTVE1FTlRfRVZFTlRfTUFTSywgQWRqdXN0bWVudExpc3RlbmVyLmNsYXNzKSk7CiAgICAgICAgIGNvbnZlcnRlciA9IG5ldyBFdmVudENvbnZlcnRlcigpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBBV1QgZXZlbnQgZnJvbSB0aGUgc3BlY2lmaWVkIEV2ZW50IG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIEV2ZW50IG9iamVjdC4KKyAgICAgKiBAcGFyYW0gZXZlbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBFdmVudCBvYmplY3QuCiAgICAgICovCiAgICAgcHVibGljIEFXVEV2ZW50KEV2ZW50IGV2ZW50KSB7CiAgICAgICAgIHRoaXMoZXZlbnQudGFyZ2V0LCBldmVudC5pZCk7CkBAIC0yMTksOCArMjgyLDEwIEBACiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEFXVCBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFuZCB0eXBlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSBPYmplY3QuCi0gICAgICogQHBhcmFtIGlkIHRoZSBldmVudCdzIHR5cGUuCisgICAgICogQHBhcmFtIHNvdXJjZQorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBPYmplY3QuCisgICAgICogQHBhcmFtIGlkCisgICAgICogICAgICAgICAgICB0aGUgZXZlbnQncyB0eXBlLgogICAgICAqLwogICAgIHB1YmxpYyBBV1RFdmVudChPYmplY3Qgc291cmNlLCBpbnQgaWQpIHsKICAgICAgICAgc3VwZXIoc291cmNlKTsKQEAgLTI0MCw3ICszMDUsOCBAQAogICAgIC8qKgogICAgICAqIFNldHMgYSBuZXcgc291cmNlIGZvciB0aGUgQVdURXZlbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIG5ld1NvdXJjZSB0aGUgbmV3IHNvdXJjZSBPYmplY3QgZm9yIHRoZSBBV1RFdmVudC4KKyAgICAgKiBAcGFyYW0gbmV3U291cmNlCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHNvdXJjZSBPYmplY3QgZm9yIHRoZSBBV1RFdmVudC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2UoT2JqZWN0IG5ld1NvdXJjZSkgewogICAgICAgICBzb3VyY2UgPSBuZXdTb3VyY2U7CkBAIC0yNTMsMzMgKzMxOSwzMiBAQAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIC8qIFRoZSBmb3JtYXQgaXMgYmFzZWQgb24gMS41IHJlbGVhc2UgYmVoYXZpb3IgCi0gICAgICAgICAqIHdoaWNoIGNhbiBiZSByZXZlYWxlZCBieSB0aGUgZm9sbG93aW5nIGNvZGU6Ci0gICAgICAgICAqIAotICAgICAgICAgKiBBV1RFdmVudCBldmVudCA9IG5ldyBBV1RFdmVudChuZXcgQ29tcG9uZW50KCl7fSwgMSl7fTsKLSAgICAgICAgICogU3lzdGVtLm91dC5wcmludGxuKGV2ZW50KTsKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIGZvcm1hdCBpcyBiYXNlZCBvbiAxLjUgcmVsZWFzZSBiZWhhdmlvciB3aGljaCBjYW4gYmUgcmV2ZWFsZWQgYnkKKyAgICAgICAgICogdGhlIGZvbGxvd2luZyBjb2RlOiBBV1RFdmVudCBldmVudCA9IG5ldyBBV1RFdmVudChuZXcgQ29tcG9uZW50KCl7fSwKKyAgICAgICAgICogMSl7fTsgU3lzdGVtLm91dC5wcmludGxuKGV2ZW50KTsKICAgICAgICAgICovCiAgICAgICAgIFN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCisKICAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIENvbXBvbmVudCAmJiAoc291cmNlICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBDb21wb25lbnQgY29tcCA9IChDb21wb25lbnQpIGdldFNvdXJjZSgpOworICAgICAgICAgICAgQ29tcG9uZW50IGNvbXAgPSAoQ29tcG9uZW50KWdldFNvdXJjZSgpOwogICAgICAgICAgICAgbmFtZSA9IGNvbXAuZ2V0TmFtZSgpOwogICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHJldHVybiAoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiWyIgKyBwYXJhbVN0cmluZygpICsgIl0iIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogICAgICAgICAgICAgICAgICsgIiBvbiAiICsgKG5hbWUubGVuZ3RoKCkgPiAwID8gbmFtZSA6IHNvdXJjZSkpOyAvLyROT04tTkxTLTEkCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgQVdURXZlbnQgc3RhdGUuIAotICAgICAqICAKKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBBV1RFdmVudCBzdGF0ZS4KKyAgICAgKiAKICAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBBV1RFdmVudCBzdGF0ZS4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHBhcmFtU3RyaW5nKCkgewotICAgICAgICAvL25vdGhpbmcgdG8gaW1wbGVtZW50OiBhbGwgZXZlbnQgdHlwZXMgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZAorICAgICAgICAvLyBub3RoaW5nIHRvIGltcGxlbWVudDogYWxsIGV2ZW50IHR5cGVzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QKICAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCiAgICAgfQogCkBAIC0yOTYsNzMgKzM2MSw3NyBAQAogICAgICAqIENvbnN1bWVzIHRoZSBBV1RFdmVudC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBjb25zdW1lKCkgewotICAgICAgIGNvbnN1bWVkID0gdHJ1ZTsKKyAgICAgICAgY29uc3VtZWQgPSB0cnVlOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIENvbnZlcnQgQVdURXZlbnQgb2JqZWN0IHRvIGEgY29ycmVzcG9uZGluZyAoZGVwcmVjYXRlZCkgRXZlbnQgb2JqZWN0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gbmV3IEV2ZW50IG9iamVjdCB3aGljaCBpcyBhIGNvbnZlcnRlZCBBV1RFdmVudCBvYmplY3Qgb3IgbnVsbAotICAgICAqIGlmIHRoZSBjb252ZXJzaW9uIGlzIG5vdCBwb3NzaWJsZQorICAgICAqIEByZXR1cm4gbmV3IEV2ZW50IG9iamVjdCB3aGljaCBpcyBhIGNvbnZlcnRlZCBBV1RFdmVudCBvYmplY3Qgb3IgbnVsbCBpZgorICAgICAqICAgICAgICAgdGhlIGNvbnZlcnNpb24gaXMgbm90IHBvc3NpYmxlCiAgICAgICovCiAgICAgRXZlbnQgZ2V0RXZlbnQoKSB7Ci0gICAgICAgIAorCiAgICAgICAgIGlmIChpZCA9PSBBY3Rpb25FdmVudC5BQ1RJT05fUEVSRk9STUVEKSB7Ci0gICAgICAgICAgICBBY3Rpb25FdmVudCBhZSA9IChBY3Rpb25FdmVudCkgdGhpczsKKyAgICAgICAgICAgIEFjdGlvbkV2ZW50IGFlID0gKEFjdGlvbkV2ZW50KXRoaXM7CiAgICAgICAgICAgICByZXR1cm4gY29udmVydGVyLmNvbnZlcnRBY3Rpb25FdmVudChhZSk7CiAKICAgICAgICAgfSBlbHNlIGlmIChpZCA9PSBBZGp1c3RtZW50RXZlbnQuQURKVVNUTUVOVF9WQUxVRV9DSEFOR0VEKSB7Ci0gICAgICAgICAgICBBZGp1c3RtZW50RXZlbnQgYWUgPSAoQWRqdXN0bWVudEV2ZW50KSB0aGlzOworICAgICAgICAgICAgQWRqdXN0bWVudEV2ZW50IGFlID0gKEFkanVzdG1lbnRFdmVudCl0aGlzOwogICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlci5jb252ZXJ0QWRqdXN0bWVudEV2ZW50KGFlKTsKIAotLy8/Pz9BV1QKLS8vICAgICAgICB9IGVsc2UgaWYgKGlkID09IENvbXBvbmVudEV2ZW50LkNPTVBPTkVOVF9NT1ZFRAotLy8gICAgICAgICAgICAgICAgJiYgc291cmNlIGluc3RhbmNlb2YgV2luZG93KSB7Ci0vLyAgICAgICAgICAgIC8vdGhlIG9ubHkgdHlwZSBvZiBDb21wb25lbnQgZXZlbnRzIGlzIENPTVBPTkVOVF9NT1ZFRCBvbiB3aW5kb3cKLS8vICAgICAgICAgICAgQ29tcG9uZW50RXZlbnQgY2UgPSAoQ29tcG9uZW50RXZlbnQpIHRoaXM7Ci0vLyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXIuY29udmVydENvbXBvbmVudEV2ZW50KGNlKTsKKyAgICAgICAgICAgIC8vID8/P0FXVAorICAgICAgICAgICAgLy8gfSBlbHNlIGlmIChpZCA9PSBDb21wb25lbnRFdmVudC5DT01QT05FTlRfTU9WRUQKKyAgICAgICAgICAgIC8vICYmIHNvdXJjZSBpbnN0YW5jZW9mIFdpbmRvdykgeworICAgICAgICAgICAgLy8gLy90aGUgb25seSB0eXBlIG9mIENvbXBvbmVudCBldmVudHMgaXMgQ09NUE9ORU5UX01PVkVEIG9uIHdpbmRvdworICAgICAgICAgICAgLy8gQ29tcG9uZW50RXZlbnQgY2UgPSAoQ29tcG9uZW50RXZlbnQpIHRoaXM7CisgICAgICAgICAgICAvLyByZXR1cm4gY29udmVydGVyLmNvbnZlcnRDb21wb25lbnRFdmVudChjZSk7CiAKICAgICAgICAgfSBlbHNlIGlmIChpZCA+PSBGb2N1c0V2ZW50LkZPQ1VTX0ZJUlNUICYmIGlkIDw9IEZvY3VzRXZlbnQuRk9DVVNfTEFTVCkgewotICAgICAgICAgICAgLy9ub3RoaW5nIHRvIGNvbnZlcnQKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gY29udmVydAogCi0vLz8/P0FXVAotLy8gICAgICAgIH0gZWxzZSBpZiAoaWQgPT0gSXRlbUV2ZW50LklURU1fU1RBVEVfQ0hBTkdFRCkgewotLy8gICAgICAgICAgICBJdGVtRXZlbnQgaWUgPSAoSXRlbUV2ZW50KSB0aGlzOwotLy8gICAgICAgICAgICByZXR1cm4gY29udmVydGVyLmNvbnZlcnRJdGVtRXZlbnQoaWUpOworICAgICAgICAgICAgLy8gPz8/QVdUCisgICAgICAgICAgICAvLyB9IGVsc2UgaWYgKGlkID09IEl0ZW1FdmVudC5JVEVNX1NUQVRFX0NIQU5HRUQpIHsKKyAgICAgICAgICAgIC8vIEl0ZW1FdmVudCBpZSA9IChJdGVtRXZlbnQpIHRoaXM7CisgICAgICAgICAgICAvLyByZXR1cm4gY29udmVydGVyLmNvbnZlcnRJdGVtRXZlbnQoaWUpOwogCiAgICAgICAgIH0gZWxzZSBpZiAoaWQgPT0gS2V5RXZlbnQuS0VZX1BSRVNTRUQgfHwgaWQgPT0gS2V5RXZlbnQuS0VZX1JFTEVBU0VEKSB7Ci0gICAgICAgICAgICBLZXlFdmVudCBrZSA9IChLZXlFdmVudCkgdGhpczsKKyAgICAgICAgICAgIEtleUV2ZW50IGtlID0gKEtleUV2ZW50KXRoaXM7CiAgICAgICAgICAgICByZXR1cm4gY29udmVydGVyLmNvbnZlcnRLZXlFdmVudChrZSk7CiAgICAgICAgIH0gZWxzZSBpZiAoaWQgPj0gTW91c2VFdmVudC5NT1VTRV9GSVJTVCAmJiBpZCA8PSBNb3VzZUV2ZW50Lk1PVVNFX0xBU1QpIHsKLSAgICAgICAgICAgIE1vdXNlRXZlbnQgbWUgPSAoTW91c2VFdmVudCkgdGhpczsKKyAgICAgICAgICAgIE1vdXNlRXZlbnQgbWUgPSAoTW91c2VFdmVudCl0aGlzOwogICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlci5jb252ZXJ0TW91c2VFdmVudChtZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoaWQgPT0gV2luZG93RXZlbnQuV0lORE9XX0NMT1NJTkcKLSAgICAgICAgICAgICAgICB8fCBpZCA9PSBXaW5kb3dFdmVudC5XSU5ET1dfSUNPTklGSUVECisgICAgICAgIH0gZWxzZSBpZiAoaWQgPT0gV2luZG93RXZlbnQuV0lORE9XX0NMT1NJTkcgfHwgaWQgPT0gV2luZG93RXZlbnQuV0lORE9XX0lDT05JRklFRAogICAgICAgICAgICAgICAgIHx8IGlkID09IFdpbmRvd0V2ZW50LldJTkRPV19ERUlDT05JRklFRCkgewotICAgICAgICAgICAgLy9ub3RoaW5nIHRvIGNvbnZlcnQKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gY29udmVydAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG5ldyBFdmVudChzb3VyY2UsIGlkLCBudWxsKTsKICAgICB9CiAKLQogICAgIC8qKgotICAgICAqIFRoZSBDbGFzcyBFdmVudERlc2NyaXB0b3IuCisgICAgICogVGhlIGNsYXNzIEV2ZW50RGVzY3JpcHRvci4KICAgICAgKi8KICAgICBzdGF0aWMgZmluYWwgY2xhc3MgRXZlbnREZXNjcmlwdG9yIHsKIAotICAgICAgICAvKiogVGhlIGV2ZW50IG1hc2suICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZXZlbnQgbWFzay4KKyAgICAgICAgICovCiAgICAgICAgIGZpbmFsIGxvbmcgZXZlbnRNYXNrOwogCi0gICAgICAgIC8qKiBUaGUgbGlzdGVuZXIgdHlwZS4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBsaXN0ZW5lciB0eXBlLgorICAgICAgICAgKi8KICAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyVHlwZTsKIAogICAgICAgICAvKioKICAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGV2ZW50IGRlc2NyaXB0b3IuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gZXZlbnRNYXNrIHRoZSBldmVudCBtYXNrCi0gICAgICAgICAqIEBwYXJhbSBsaXN0ZW5lclR5cGUgdGhlIGxpc3RlbmVyIHR5cGUKKyAgICAgICAgICogQHBhcmFtIGV2ZW50TWFzaworICAgICAgICAgKiAgICAgICAgICAgIHRoZSBldmVudCBtYXNrLgorICAgICAgICAgKiBAcGFyYW0gbGlzdGVuZXJUeXBlCisgICAgICAgICAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHR5cGUuCiAgICAgICAgICAqLwogICAgICAgICBFdmVudERlc2NyaXB0b3IobG9uZyBldmVudE1hc2ssIENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBsaXN0ZW5lclR5cGUpIHsKICAgICAgICAgICAgIHRoaXMuZXZlbnRNYXNrID0gZXZlbnRNYXNrOwpAQCAtMzcwLDI0ICs0MzksMjggQEAKICAgICAgICAgfQogCiAgICAgfQotICAgIAorCiAgICAgLyoqCi0gICAgICogVGhlIENsYXNzIEV2ZW50VHlwZUxvb2t1cC4KKyAgICAgKiBUaGUgY2xhc3MgRXZlbnRUeXBlTG9va3VwLgogICAgICAqLwogICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBFdmVudFR5cGVMb29rdXAgewotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBsYXN0IGV2ZW50LiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbGFzdCBldmVudC4KKyAgICAgICAgICovCiAgICAgICAgIHByaXZhdGUgQVdURXZlbnQgbGFzdEV2ZW50ID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgbGFzdCBldmVudCBkZXNjcmlwdG9yLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbGFzdCBldmVudCBkZXNjcmlwdG9yLgorICAgICAgICAgKi8KICAgICAgICAgcHJpdmF0ZSBFdmVudERlc2NyaXB0b3IgbGFzdEV2ZW50RGVzY3JpcHRvciA9IG51bGw7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEdldHMgdGhlIGV2ZW50IGRlc2NyaXB0b3IuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIGV2ZW50Ci0gICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBldmVudCBkZXNjcmlwdG9yCisgICAgICAgICAqIEBwYXJhbSBldmVudAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBldmVudC4KKyAgICAgICAgICogQHJldHVybiB0aGUgZXZlbnQgZGVzY3JpcHRvci4KICAgICAgICAgICovCiAgICAgICAgIEV2ZW50RGVzY3JpcHRvciBnZXRFdmVudERlc2NyaXB0b3IoQVdURXZlbnQgZXZlbnQpIHsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewpAQCAtNDAzLDkgKzQ3Niw5IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBHZXRzIHRoZSBldmVudCBtYXNrLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGV2ZW50IHRoZSBldmVudAotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgZXZlbnQgbWFzaworICAgICAgICAgKiBAcGFyYW0gZXZlbnQKKyAgICAgICAgICogICAgICAgICAgICB0aGUgZXZlbnQuCisgICAgICAgICAqIEByZXR1cm4gdGhlIGV2ZW50IG1hc2suCiAgICAgICAgICAqLwogICAgICAgICBsb25nIGdldEV2ZW50TWFzayhBV1RFdmVudCBldmVudCkgewogICAgICAgICAgICAgZmluYWwgRXZlbnREZXNjcmlwdG9yIGVkID0gZ2V0RXZlbnREZXNjcmlwdG9yKGV2ZW50KTsKQEAgLTQxNCw2NSArNDg3LDYyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhlIENsYXNzIEV2ZW50Q29udmVydGVyLgorICAgICAqIFRoZSBjbGFzcyBFdmVudENvbnZlcnRlci4KICAgICAgKi8KICAgICBzdGF0aWMgZmluYWwgY2xhc3MgRXZlbnRDb252ZXJ0ZXIgewotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBDb25zdGFudCBPTERfTU9EX01BU0suICovCi0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgT0xEX01PRF9NQVNLID0gRXZlbnQuQUxUX01BU0sgfCBFdmVudC5DVFJMX01BU0sKLSAgICAgICAgfCBFdmVudC5NRVRBX01BU0sgfCBFdmVudC5TSElGVF9NQVNLOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY29uc3RhbnQgT0xEX01PRF9NQVNLLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBPTERfTU9EX01BU0sgPSBFdmVudC5BTFRfTUFTSyB8IEV2ZW50LkNUUkxfTUFTSyB8IEV2ZW50Lk1FVEFfTUFTSworICAgICAgICAgICAgICAgIHwgRXZlbnQuU0hJRlRfTUFTSzsKIAogICAgICAgICAvKioKICAgICAgICAgICogQ29udmVydCBhY3Rpb24gZXZlbnQuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gYWUgdGhlIGFlCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBldmVudAorICAgICAgICAgKiBAcGFyYW0gYWUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgYWUuCisgICAgICAgICAqIEByZXR1cm4gdGhlIGV2ZW50LgogICAgICAgICAgKi8KICAgICAgICAgRXZlbnQgY29udmVydEFjdGlvbkV2ZW50KEFjdGlvbkV2ZW50IGFlKSB7CiAgICAgICAgICAgICBFdmVudCBldnQgPSBuZXcgRXZlbnQoYWUuZ2V0U291cmNlKCksIGFlLmdldElEKCksIGFlLmdldEFjdGlvbkNvbW1hbmQoKSk7CiAgICAgICAgICAgICBldnQud2hlbiA9IGFlLmdldFdoZW4oKTsKICAgICAgICAgICAgIGV2dC5tb2RpZmllcnMgPSBhZS5nZXRNb2RpZmllcnMoKSAmIE9MRF9NT0RfTUFTSzsKIAotICAgICAgICAgICAvKiBpZiAoc291cmNlIGluc3RhbmNlb2YgQnV0dG9uKSB7Ci0gICAgICAgICAgICAgICAgYXJnID0gKChCdXR0b24pIHNvdXJjZSkuZ2V0TGFiZWwoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgQ2hlY2tib3gpIHsKLSAgICAgICAgICAgICAgICBhcmcgPSBuZXcgQm9vbGVhbigoKENoZWNrYm94KSBzb3VyY2UpLmdldFN0YXRlKCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBDaGVja2JveE1lbnVJdGVtKSB7Ci0gICAgICAgICAgICAgICAgYXJnID0gKChDaGVja2JveE1lbnVJdGVtKSBzb3VyY2UpLmdldExhYmVsKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIENob2ljZSkgewotICAgICAgICAgICAgICAgIGFyZyA9ICgoQ2hvaWNlKSBzb3VyY2UpLmdldFNlbGVjdGVkSXRlbSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBMaXN0KSB7Ci0gICAgICAgICAgICAgICAgYXJnID0gKChMaXN0KSBzb3VyY2UpLmdldFNlbGVjdGVkSXRlbSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBNZW51SXRlbSkgewotICAgICAgICAgICAgICAgIGFyZyA9ICgoTWVudUl0ZW0pIHNvdXJjZSkuZ2V0TGFiZWwoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgVGV4dEZpZWxkKSB7Ci0gICAgICAgICAgICAgICAgYXJnID0gKChUZXh0RmllbGQpIHNvdXJjZSkuZ2V0VGV4dCgpOwotICAgICAgICAgICAgfQotKi8KKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBpZiAoc291cmNlIGluc3RhbmNlb2YgQnV0dG9uKSB7IGFyZyA9ICgoQnV0dG9uKQorICAgICAgICAgICAgICogc291cmNlKS5nZXRMYWJlbCgpOyB9IGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIENoZWNrYm94KSB7IGFyZworICAgICAgICAgICAgICogPSBuZXcgQm9vbGVhbigoKENoZWNrYm94KSBzb3VyY2UpLmdldFN0YXRlKCkpOyB9IGVsc2UgaWYgKHNvdXJjZQorICAgICAgICAgICAgICogaW5zdGFuY2VvZiBDaGVja2JveE1lbnVJdGVtKSB7IGFyZyA9ICgoQ2hlY2tib3hNZW51SXRlbSkKKyAgICAgICAgICAgICAqIHNvdXJjZSkuZ2V0TGFiZWwoKTsgfSBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBDaG9pY2UpIHsgYXJnID0KKyAgICAgICAgICAgICAqICgoQ2hvaWNlKSBzb3VyY2UpLmdldFNlbGVjdGVkSXRlbSgpOyB9IGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mCisgICAgICAgICAgICAgKiBMaXN0KSB7IGFyZyA9ICgoTGlzdCkgc291cmNlKS5nZXRTZWxlY3RlZEl0ZW0oKTsgfSBlbHNlIGlmCisgICAgICAgICAgICAgKiAoc291cmNlIGluc3RhbmNlb2YgTWVudUl0ZW0pIHsgYXJnID0gKChNZW51SXRlbSkKKyAgICAgICAgICAgICAqIHNvdXJjZSkuZ2V0TGFiZWwoKTsgfSBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBUZXh0RmllbGQpIHsgYXJnCisgICAgICAgICAgICAgKiA9ICgoVGV4dEZpZWxkKSBzb3VyY2UpLmdldFRleHQoKTsgfQorICAgICAgICAgICAgICovCiAgICAgICAgICAgICByZXR1cm4gZXZ0OwogICAgICAgICB9CiAKLQogICAgICAgICAvKioKICAgICAgICAgICogQ29udmVydCBhZGp1c3RtZW50IGV2ZW50LgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGFlIHRoZSBhZQotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgZXZlbnQKKyAgICAgICAgICogQHBhcmFtIGFlCisgICAgICAgICAqICAgICAgICAgICAgdGhlIGFlLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBldmVudC4KICAgICAgICAgICovCiAgICAgICAgIEV2ZW50IGNvbnZlcnRBZGp1c3RtZW50RXZlbnQoQWRqdXN0bWVudEV2ZW50IGFlKSB7Ci0gICAgICAgICAgICAvL1RPRE86IEV2ZW50LlNDUk9MTF9CRUdJTi9TQ1JPTExfRU5ECi0gICAgICAgICAgICByZXR1cm4gbmV3IEV2ZW50KGFlLnNvdXJjZSwgYWUuaWQgKyBhZS5nZXRBZGp1c3RtZW50VHlwZSgpIC0gMSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIoYWUuZ2V0VmFsdWUoKSkpOworICAgICAgICAgICAgLy8gVE9ETzogRXZlbnQuU0NST0xMX0JFR0lOL1NDUk9MTF9FTkQKKyAgICAgICAgICAgIHJldHVybiBuZXcgRXZlbnQoYWUuc291cmNlLCBhZS5pZCArIGFlLmdldEFkanVzdG1lbnRUeXBlKCkgLSAxLCBuZXcgSW50ZWdlcihhZQorICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsdWUoKSkpOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIENvbnZlcnQgY29tcG9uZW50IGV2ZW50LgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGNlIHRoZSBjZQotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgZXZlbnQKKyAgICAgICAgICogQHBhcmFtIGNlCisgICAgICAgICAqICAgICAgICAgICAgdGhlIGNlLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBldmVudC4KICAgICAgICAgICovCiAgICAgICAgIEV2ZW50IGNvbnZlcnRDb21wb25lbnRFdmVudChDb21wb25lbnRFdmVudCBjZSkgewogICAgICAgICAgICAgQ29tcG9uZW50IGNvbXAgPSBjZS5nZXRDb21wb25lbnQoKTsKQEAgLTQ4MiwzNSArNTUyLDI3IEBACiAgICAgICAgICAgICByZXR1cm4gZXZ0OwogICAgICAgICB9CiAKLSAgICAgICAgLy8/Pz9BV1QKKyAgICAgICAgLy8gPz8/QVdUCiAgICAgICAgIC8qCi0gICAgICAgIEV2ZW50IGNvbnZlcnRJdGVtRXZlbnQoSXRlbUV2ZW50IGllKSB7Ci0gICAgICAgICAgICBpbnQgb2xkSWQgPSBpZS5pZCArIGllLmdldFN0YXRlQ2hhbmdlKCkgLSAxOwotICAgICAgICAgICAgT2JqZWN0IHNvdXJjZSA9IGllLnNvdXJjZTsKLSAgICAgICAgICAgIGludCBpZHggPSAtMTsKLSAgICAgICAgICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBMaXN0KSB7Ci0gICAgICAgICAgICAgICAgTGlzdCBsaXN0ID0gKExpc3QpIHNvdXJjZTsKLSAgICAgICAgICAgICAgICBpZHggPSBsaXN0LmdldFNlbGVjdGVkSW5kZXgoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIENob2ljZSkgewotICAgICAgICAgICAgICAgIENob2ljZSBjaG9pY2UgPSAoQ2hvaWNlKSBzb3VyY2U7Ci0gICAgICAgICAgICAgICAgaWR4ID0gY2hvaWNlLmdldFNlbGVjdGVkSW5kZXgoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE9iamVjdCBhcmcgPSBpZHggPj0gMCA/IG5ldyBJbnRlZ2VyKGlkeCkgOiBudWxsOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBFdmVudChzb3VyY2UsIG9sZElkLCBhcmcpOwotICAgICAgICB9Ci0gICAgICAgICovCi0gICAgICAgIAorICAgICAgICAgKiBFdmVudCBjb252ZXJ0SXRlbUV2ZW50KEl0ZW1FdmVudCBpZSkgeyBpbnQgb2xkSWQgPSBpZS5pZCArCisgICAgICAgICAqIGllLmdldFN0YXRlQ2hhbmdlKCkgLSAxOyBPYmplY3Qgc291cmNlID0gaWUuc291cmNlOyBpbnQgaWR4ID0gLTE7IGlmCisgICAgICAgICAqIChzb3VyY2UgaW5zdGFuY2VvZiBMaXN0KSB7IExpc3QgbGlzdCA9IChMaXN0KSBzb3VyY2U7IGlkeCA9CisgICAgICAgICAqIGxpc3QuZ2V0U2VsZWN0ZWRJbmRleCgpOyB9IGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIENob2ljZSkgeworICAgICAgICAgKiBDaG9pY2UgY2hvaWNlID0gKENob2ljZSkgc291cmNlOyBpZHggPSBjaG9pY2UuZ2V0U2VsZWN0ZWRJbmRleCgpOyB9CisgICAgICAgICAqIE9iamVjdCBhcmcgPSBpZHggPj0gMCA/IG5ldyBJbnRlZ2VyKGlkeCkgOiBudWxsOyByZXR1cm4gbmV3CisgICAgICAgICAqIEV2ZW50KHNvdXJjZSwgb2xkSWQsIGFyZyk7IH0KKyAgICAgICAgICovCisKICAgICAgICAgLyoqCiAgICAgICAgICAqIENvbnZlcnQga2V5IGV2ZW50LgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGtlIHRoZSBrZQotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgZXZlbnQKKyAgICAgICAgICogQHBhcmFtIGtlCisgICAgICAgICAqICAgICAgICAgICAgdGhlIGtlLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBldmVudC4KICAgICAgICAgICovCiAgICAgICAgIEV2ZW50IGNvbnZlcnRLZXlFdmVudChLZXlFdmVudCBrZSkgewogICAgICAgICAgICAgaW50IG9sZElkID0ga2UuaWQ7Ci0gICAgICAgICAgICAvL2xlYXZlIG9ubHkgb2xkIEV2ZW50J3MgbW9kaWZpZXJzCisgICAgICAgICAgICAvLyBsZWF2ZSBvbmx5IG9sZCBFdmVudCdzIG1vZGlmaWVycwogCiAgICAgICAgICAgICBpbnQgbW9kID0ga2UuZ2V0TW9kaWZpZXJzKCkgJiBPTERfTU9EX01BU0s7CiAgICAgICAgICAgICBDb21wb25lbnQgY29tcCA9IGtlLmdldENvbXBvbmVudCgpOwpAQCAtNTE4LDcgKzU4MCw3IEBACiAgICAgICAgICAgICBpbnQga2V5Q29kZSA9IGtlLmdldEtleUNvZGUoKTsKICAgICAgICAgICAgIGludCBrZXkgPSBjb252ZXJ0S2V5KGtleUNoYXIsIGtleUNvZGUpOwogICAgICAgICAgICAgaWYgKGtleSA+PSBFdmVudC5IT01FICYmIGtleSA8PSBFdmVudC5JTlNFUlQpIHsKLSAgICAgICAgICAgICAgICBvbGRJZCArPSAyOyAvL25vbi1BU0NJSSBrZXkgLT4gYWN0aW9uIGtleQorICAgICAgICAgICAgICAgIG9sZElkICs9IDI7IC8vIG5vbi1BU0NJSSBrZXkgLT4gYWN0aW9uIGtleQogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIG5ldyBFdmVudChjb21wLCBrZS5nZXRXaGVuKCksIG9sZElkLCAwLCAwLCBrZXksIG1vZCk7CiAgICAgICAgIH0KQEAgLTUyNiw5ICs1ODgsOSBAQAogICAgICAgICAvKioKICAgICAgICAgICogQ29udmVydCBtb3VzZSBldmVudC4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBtZSB0aGUgbWUKLSAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIGV2ZW50CisgICAgICAgICAqIEBwYXJhbSBtZQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBtZS4KKyAgICAgICAgICogQHJldHVybiB0aGUgZXZlbnQuCiAgICAgICAgICAqLwogICAgICAgICBFdmVudCBjb252ZXJ0TW91c2VFdmVudChNb3VzZUV2ZW50IG1lKSB7CiAgICAgICAgICAgICBpbnQgaWQgPSBtZS5pZDsKQEAgLTUzNyw3ICs1OTksNyBAQAogICAgICAgICAgICAgICAgIGV2dC54ID0gbWUuZ2V0WCgpOwogICAgICAgICAgICAgICAgIGV2dC55ID0gbWUuZ2V0WSgpOwogICAgICAgICAgICAgICAgIGludCBtb2QgPSBtZS5nZXRNb2RpZmllcnMoKTsKLSAgICAgICAgICAgICAgICAvL2luIEV2ZW50IG1vZGlmaWVycyBtZWFuIGJ1dHRvbiBudW1iZXIgZm9yIG1vdXNlIGV2ZW50czoKKyAgICAgICAgICAgICAgICAvLyBpbiBFdmVudCBtb2RpZmllcnMgbWVhbiBidXR0b24gbnVtYmVyIGZvciBtb3VzZSBldmVudHM6CiAgICAgICAgICAgICAgICAgZXZ0Lm1vZGlmaWVycyA9IG1vZCAmIChFdmVudC5BTFRfTUFTSyB8IEV2ZW50Lk1FVEFfTUFTSyk7CiAgICAgICAgICAgICAgICAgaWYgKGlkID09IE1vdXNlRXZlbnQuTU9VU0VfUFJFU1NFRCkgewogICAgICAgICAgICAgICAgICAgICBldnQuY2xpY2tDb3VudCA9IG1lLmdldENsaWNrQ291bnQoKTsKQEAgLTU0Niw2OCArNjA4LDY5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICAvKioKICAgICAgICAgICogQ29udmVydCBrZXkuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0ga2V5Q2hhciB0aGUga2V5IGNoYXIKLSAgICAgICAgICogQHBhcmFtIGtleUNvZGUgdGhlIGtleSBjb2RlCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBpbnQKKyAgICAgICAgICogQHBhcmFtIGtleUNoYXIKKyAgICAgICAgICogICAgICAgICAgICB0aGUga2V5IGNoYXIuCisgICAgICAgICAqIEBwYXJhbSBrZXlDb2RlCisgICAgICAgICAqICAgICAgICAgICAgdGhlIGtleSBjb2RlLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBpbnQuCiAgICAgICAgICAqLwogICAgICAgICBpbnQgY29udmVydEtleShjaGFyIGtleUNoYXIsIGludCBrZXlDb2RlKSB7CiAgICAgICAgICAgICBpbnQga2V5OwotICAgICAgICAgICAgLy9GMSAtIEYxMgorICAgICAgICAgICAgLy8gRjEgLSBGMTIKICAgICAgICAgICAgIGlmIChrZXlDb2RlID49IEtleUV2ZW50LlZLX0YxICYmIGtleUNvZGUgPD0gS2V5RXZlbnQuVktfRjEyKSB7CiAgICAgICAgICAgICAgICAga2V5ID0gRXZlbnQuRjEgKyBrZXlDb2RlIC0gS2V5RXZlbnQuVktfRjE7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHN3aXRjaCAoa2V5Q29kZSkgewotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IC8vbm9uLWFjdGlvbiBrZXkKLSAgICAgICAgICAgICAgICAgICAga2V5ID0ga2V5Q2hhcjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgLy9hY3Rpb24ga2V5czoKLSAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LlZLX0hPTUU6Ci0gICAgICAgICAgICAgICAgICAgIGtleSA9IEV2ZW50LkhPTUU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuVktfRU5EOgotICAgICAgICAgICAgICAgICAgICBrZXkgPSBFdmVudC5FTkQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuVktfUEFHRV9VUDoKLSAgICAgICAgICAgICAgICAgICAga2V5ID0gRXZlbnQuUEdVUDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5WS19QQUdFX0RPV046Ci0gICAgICAgICAgICAgICAgICAgIGtleSA9IEV2ZW50LlBHRE47Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuVktfVVA6Ci0gICAgICAgICAgICAgICAgICAgIGtleSA9IEV2ZW50LlVQOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LlZLX0RPV046Ci0gICAgICAgICAgICAgICAgICAgIGtleSA9IEV2ZW50LkRPV047Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuVktfTEVGVDoKLSAgICAgICAgICAgICAgICAgICAga2V5ID0gRXZlbnQuTEVGVDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5WS19SSUdIVDoKLSAgICAgICAgICAgICAgICAgICAga2V5ID0gRXZlbnQuUklHSFQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuVktfUFJJTlRTQ1JFRU46Ci0gICAgICAgICAgICAgICAgICAgIGtleSA9IEV2ZW50LlBSSU5UX1NDUkVFTjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5WS19TQ1JPTExfTE9DSzoKLSAgICAgICAgICAgICAgICAgICAga2V5ID0gRXZlbnQuU0NST0xMX0xPQ0s7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuVktfQ0FQU19MT0NLOgotICAgICAgICAgICAgICAgICAgICBrZXkgPSBFdmVudC5DQVBTX0xPQ0s7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuVktfTlVNX0xPQ0s6Ci0gICAgICAgICAgICAgICAgICAgIGtleSA9IEV2ZW50Lk5VTV9MT0NLOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LlZLX1BBVVNFOgotICAgICAgICAgICAgICAgICAgICBrZXkgPSBFdmVudC5QQVVTRTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5WS19JTlNFUlQ6Ci0gICAgICAgICAgICAgICAgICAgIGtleSA9IEV2ZW50LklOU0VSVDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IC8vIG5vbi1hY3Rpb24ga2V5CisgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXlDaGFyOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8vIGFjdGlvbiBrZXlzOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LlZLX0hPTUU6CisgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBFdmVudC5IT01FOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuVktfRU5EOgorICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gRXZlbnQuRU5EOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuVktfUEFHRV9VUDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IEV2ZW50LlBHVVA7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5WS19QQUdFX0RPV046CisgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBFdmVudC5QR0ROOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuVktfVVA6CisgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBFdmVudC5VUDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LlZLX0RPV046CisgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBFdmVudC5ET1dOOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuVktfTEVGVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IEV2ZW50LkxFRlQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5WS19SSUdIVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IEV2ZW50LlJJR0hUOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuVktfUFJJTlRTQ1JFRU46CisgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBFdmVudC5QUklOVF9TQ1JFRU47CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5WS19TQ1JPTExfTE9DSzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IEV2ZW50LlNDUk9MTF9MT0NLOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuVktfQ0FQU19MT0NLOgorICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gRXZlbnQuQ0FQU19MT0NLOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuVktfTlVNX0xPQ0s6CisgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBFdmVudC5OVU1fTE9DSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LlZLX1BBVVNFOgorICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gRXZlbnQuUEFVU0U7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5WS19JTlNFUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBFdmVudC5JTlNFUlQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4ga2V5OwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L0FXVEV4Y2VwdGlvbi5qYXZhIGIvYXd0L2phdmEvYXd0L0FXVEV4Y2VwdGlvbi5qYXZhCmluZGV4IDcwY2U2ZTEuLjY1OTBiNzMgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9BV1RFeGNlcHRpb24uamF2YQorKysgYi9hd3QvamF2YS9hd3QvQVdURXhjZXB0aW9uLmphdmEKQEAgLTE4LDI2ICsxOCwzMCBAQAogICogQGF1dGhvciBNaWNoYWVsIERhbmlsb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0OwogCi0KIC8qKgotICogVGhlIEFXVEV4Y2VwdGlvbiBjbGFzcyBpcyB1c2VkIHRvIHByb3ZpZGUgbm90aWZpY2F0aW9uIGFuZCBpbmZvcm1hdGlvbgotICogYWJvdXQgQVdUIGVycm9ycy4KKyAqIFRoZSBBV1RFeGNlcHRpb24gY2xhc3MgaXMgdXNlZCB0byBwcm92aWRlIG5vdGlmaWNhdGlvbiBhbmQgaW5mb3JtYXRpb24gYWJvdXQKKyAqIEFXVCBlcnJvcnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQVdURXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLSAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgc2VyaWFsVmVyc2lvblVJRC4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTkwMDQxNDIzMTE1MTMyMzg3OUw7CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQVdUIGV4Y2VwdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbWVzc2FnZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbXNnIHRoZSBzcGVjaWZpYyBtZXNzYWdlIGZvciBjdXJyZW50IGV4Y2VwdGlvbi4KKyAgICAgKiBAcGFyYW0gbXNnCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWMgbWVzc2FnZSBmb3IgY3VycmVudCBleGNlcHRpb24uCiAgICAgICovCiAgICAgcHVibGljIEFXVEV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CiAgICAgICAgIHN1cGVyKG1zZyk7CiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9BV1RLZXlTdHJva2UuamF2YSBiL2F3dC9qYXZhL2F3dC9BV1RLZXlTdHJva2UuamF2YQppbmRleCA1ZTdkZTRlLi5mMDFmNmYwIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvQVdUS2V5U3Ryb2tlLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L0FXVEtleVN0cm9rZS5qYXZhCkBAIC0xOCw3ICsxOCw5IEBACiAgKiBAYXV0aG9yIERtaXRyeSBBLiBEdXJuZXYKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0OworCiBpbXBvcnQgamF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudDsKIGltcG9ydCBqYXZhLmF3dC5ldmVudC5LZXlFdmVudDsKIGltcG9ydCBqYXZhLmlvLk9iamVjdFN0cmVhbUV4Y2VwdGlvbjsKQEAgLTM2LDcgKzM4LDcgQEAKICAqIFRoZSBBV1RLZXlTdHJva2UgaG9sZHMgYWxsIG9mIHRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGNvbXBsZXRlIGFjdCBvZiAKICAqIHR5cGluZyBhIGNoYXJhY3Rlci4gVGhpcyBpbmNsdWRlcyB0aGUgZXZlbnRzIHRoYXQgYXJlIGdlbmVyYXRlZCB3aGVuIAogICogdGhlIGtleSBpcyBwcmVzc2VkLCByZWxlYXNlZCwgb3IgdHlwZWQgKHByZXNzZWQgYW5kIHJlbGVhc2VkIGdlbmVyYXRpbmcKLSAqIGEgdW5pY29kZSBjaGFyYWN0ZXIgcmVzdWx0KSB3aGljaCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudAorICogYSBVbmljb2RlIGNoYXJhY3RlciByZXN1bHQpIHdoaWNoIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIGV2ZW50CiAgKiBvYmplY3RzIEtleUV2ZW50LktFWV9QUkVTU0VELCBLZXlFdmVudC5LRVlfUkVMRUFTRUQsIG9yIEtleUV2ZW50LktFWV9UWVBFRC4KICAqIEl0IGFsc28gaG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgd2hpY2ggbW9kaWZpZXJzIChzdWNoIGFzIGNvbnRyb2wgb3IgCiAgKiBzaGlmdCkgd2VyZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGtleXN0cm9rZS4gVGhlIGZvbGxvd2luZyBtYXNrcyAKQEAgLTU3LDE5ICs1OSw0MSBAQAogICogIFRoZSBBV1RLZXlTdHJva2UgaXMgdW5pcXVlLCBhbmQgYXBwbGljYXRpb25zIHNob3VsZCBub3QgY3JlYXRlIHRoZWlyIG93biAKICAqICBpbnN0YW5jZXMgb2YgQVdUS2V5U3Ryb2tlLiBBbGwgYXBwbGljYXRpb25zIHNob3VsZCB1c2UgZ2V0QVdUS2V5U3Ryb2tlIAogICogIG1ldGhvZHMgZm9yIG9idGFpbmluZyBpbnN0YW5jZXMgb2YgQVdUS2V5U3Ryb2tlLgorICogIAorICogIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQVdUS2V5U3Ryb2tlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLSAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgc2VyaWFsVmVyc2lvblVJRC4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjQzMDUzOTY5MTE1NTE2MTg3MUw7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGNhY2hlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxBV1RLZXlTdHJva2UsIEFXVEtleVN0cm9rZT4gY2FjaGUgPSBuZXcgSGFzaE1hcDxBV1RLZXlTdHJva2UsIEFXVEtleVN0cm9rZT4oKTsgLy9NYXA8QVdUS2V5U3Ryb2tlLCA/IGV4dGVuZHMgQVdUS2V5U3Ryb2tlPgotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQga2V5RXZlbnRUeXBlc01hcC4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8SW50ZWdlciwgU3RyaW5nPiBrZXlFdmVudFR5cGVzTWFwID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPigpOyAvL01hcDxpbnQsIFN0cmluZz4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgY2FjaGUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPEFXVEtleVN0cm9rZSwgQVdUS2V5U3Ryb2tlPiBjYWNoZSA9IG5ldyBIYXNoTWFwPEFXVEtleVN0cm9rZSwgQVdUS2V5U3Ryb2tlPigpOyAvLyBNYXAKIAotICAgIHByaXZhdGUgc3RhdGljIENvbnN0cnVjdG9yPD8+IHN1YkNvbnN0cnVjdG9yOyAgIAorICAgIC8vIDwKKyAgICAvLyBBV1RLZXlTdHJva2UKKyAgICAvLyAsCisgICAgLy8gPworICAgIC8vIGV4dGVuZHMKKyAgICAvLyBBV1RLZXlTdHJva2UKKyAgICAvLyA+CisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQga2V5RXZlbnRUeXBlc01hcC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8SW50ZWdlciwgU3RyaW5nPiBrZXlFdmVudFR5cGVzTWFwID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPigpOyAvLyBNYXAKKworICAgIC8vIDwKKyAgICAvLyBpbnQKKyAgICAvLyAsCisgICAgLy8gU3RyaW5nCisgICAgLy8gPgorCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29uc3RydWN0b3I8Pz4gc3ViQ29uc3RydWN0b3I7CiAKICAgICBzdGF0aWMgewogICAgICAgICBrZXlFdmVudFR5cGVzTWFwLnB1dChuZXcgSW50ZWdlcihLZXlFdmVudC5LRVlfUFJFU1NFRCksICJwcmVzc2VkIik7IC8vJE5PTi1OTFMtMSQKQEAgLTc3LDUzICsxMDEsNjYgQEAKICAgICAgICAga2V5RXZlbnRUeXBlc01hcC5wdXQobmV3IEludGVnZXIoS2V5RXZlbnQuS0VZX1RZUEVEKSwgInR5cGVkIik7IC8vJE5PTi1OTFMtMSQKICAgICB9CiAKLSAgICAvKiogVGhlIGtleSBjaGFyLiAqLwotICAgIHByaXZhdGUgY2hhciBrZXlDaGFyOwotICAgIAotICAgIC8qKiBUaGUga2V5IGNvZGUuICovCi0gICAgcHJpdmF0ZSBpbnQga2V5Q29kZTsKLSAgICAKLSAgICAvKiogVGhlIG1vZGlmaWVycy4gKi8KLSAgICBwcml2YXRlIGludCBtb2RpZmllcnM7Ci0gICAgCi0gICAgLyoqIFRoZSBvbiBrZXkgcmVsZWFzZS4gKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gb25LZXlSZWxlYXNlOwotICAgIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBBV1RLZXlTdHJva2UuIAotICAgICAqIGdldEFXVEtleVN0cm9rZSBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zIGNvZGUuICAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5Q2hhciB0aGUga2V5IGNoYXIKLSAgICAgKiBAcGFyYW0ga2V5Q29kZSB0aGUga2V5IGNvZGUKLSAgICAgKiBAcGFyYW0gbW9kaWZpZXJzIHRoZSBtb2RpZmllcnMKLSAgICAgKiBAcGFyYW0gb25LZXlSZWxlYXNlIHRydWUgaWYgQVdUS2V5U3Ryb2tlIGlzIGZvciBhIGtleSByZWxlYXNlLCBvdmVyd2lzZSBmYWxzZS4gCisgICAgICogVGhlIGtleSBjaGFyLgogICAgICAqLwotICAgIHByb3RlY3RlZCBBV1RLZXlTdHJva2UoY2hhciBrZXlDaGFyLCBpbnQga2V5Q29kZSwgaW50IG1vZGlmaWVycywKLSAgICAgICAgICAgIGJvb2xlYW4gb25LZXlSZWxlYXNlKQotICAgIHsKLSAgICAgICBzZXRBV1RLZXlTdHJva2Uoa2V5Q2hhciwga2V5Q29kZSwgbW9kaWZpZXJzLCBvbktleVJlbGVhc2UpOworICAgIHByaXZhdGUgY2hhciBrZXlDaGFyOworCisgICAgLyoqCisgICAgICogVGhlIGtleSBjb2RlLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGtleUNvZGU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbW9kaWZpZXJzLgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1vZGlmaWVyczsKKworICAgIC8qKgorICAgICAqIFRoZSBvbiBrZXkgcmVsZWFzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gb25LZXlSZWxlYXNlOworCisgICAgLyoqCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEFXVEtleVN0cm9rZS4gZ2V0QVdUS2V5U3Ryb2tlIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBieQorICAgICAqIGFwcGxpY2F0aW9ucyBjb2RlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXlDaGFyCisgICAgICogICAgICAgICAgICB0aGUga2V5IGNoYXIuCisgICAgICogQHBhcmFtIGtleUNvZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgY29kZS4KKyAgICAgKiBAcGFyYW0gbW9kaWZpZXJzCisgICAgICogICAgICAgICAgICB0aGUgbW9kaWZpZXJzLgorICAgICAqIEBwYXJhbSBvbktleVJlbGVhc2UKKyAgICAgKiAgICAgICAgICAgIHRydWUgaWYgQVdUS2V5U3Ryb2tlIGlzIGZvciBhIGtleSByZWxlYXNlLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFXVEtleVN0cm9rZShjaGFyIGtleUNoYXIsIGludCBrZXlDb2RlLCBpbnQgbW9kaWZpZXJzLCBib29sZWFuIG9uS2V5UmVsZWFzZSkgeworICAgICAgICBzZXRBV1RLZXlTdHJva2Uoa2V5Q2hhciwga2V5Q29kZSwgbW9kaWZpZXJzLCBvbktleVJlbGVhc2UpOwogICAgIH0KIAotICAgIC8qKiBTZXRzIHRoZSBhd3Qga2V5IHN0cm9rZS4KKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBBV1Qga2V5IHN0cm9rZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5Q2hhciB0aGUga2V5IGNoYXIKLSAgICAgKiBAcGFyYW0ga2V5Q29kZSB0aGUga2V5IGNvZGUKLSAgICAgKiBAcGFyYW0gbW9kaWZpZXJzIHRoZSBtb2RpZmllcnMKLSAgICAgKiBAcGFyYW0gb25LZXlSZWxlYXNlIHRoZSBvbiBrZXkgcmVsZWFzZQorICAgICAqIEBwYXJhbSBrZXlDaGFyCisgICAgICogICAgICAgICAgICB0aGUga2V5IGNoYXIuCisgICAgICogQHBhcmFtIGtleUNvZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgY29kZS4KKyAgICAgKiBAcGFyYW0gbW9kaWZpZXJzCisgICAgICogICAgICAgICAgICB0aGUgbW9kaWZpZXJzLgorICAgICAqIEBwYXJhbSBvbktleVJlbGVhc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBvbiBrZXkgcmVsZWFzZS4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0QVdUS2V5U3Ryb2tlKCBjaGFyIGtleUNoYXIsIGludCBrZXlDb2RlLCBpbnQgbW9kaWZpZXJzLAotICAgICAgICAgICAgYm9vbGVhbiBvbktleVJlbGVhc2UpCi0gICAgeworICAgIHByaXZhdGUgdm9pZCBzZXRBV1RLZXlTdHJva2UoY2hhciBrZXlDaGFyLCBpbnQga2V5Q29kZSwgaW50IG1vZGlmaWVycywgYm9vbGVhbiBvbktleVJlbGVhc2UpIHsKICAgICAgICAgdGhpcy5rZXlDaGFyID0ga2V5Q2hhcjsKICAgICAgICAgdGhpcy5rZXlDb2RlID0ga2V5Q29kZTsKICAgICAgICAgdGhpcy5tb2RpZmllcnMgPSBtb2RpZmllcnM7CiAgICAgICAgIHRoaXMub25LZXlSZWxlYXNlID0gb25LZXlSZWxlYXNlOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBBV1RLZXlTdHJva2Ugd2l0aCBkZWZhdWx0IHBhcmFtZXRlcnM6Ci0gICAgICogS2V5RXZlbnQuQ0hBUl9VTkRFRklORUQga2V5IGNoYXIsIEtleUV2ZW50LlZLX1VOREVGSU5FRCBrZXkgY29kZSwKLSAgICAgKiB3aXRob3V0IG1vZGlmaWVycyBhbmQgZmFsc2Uga2V5IHJlYWxpc2VkIHZhbHVlLgorICAgICAqIEtleUV2ZW50LkNIQVJfVU5ERUZJTkVEIGtleSBjaGFyLCBLZXlFdmVudC5WS19VTkRFRklORUQga2V5IGNvZGUsIHdpdGhvdXQKKyAgICAgKiBtb2RpZmllcnMgYW5kIGZhbHNlIGtleSByZWFsaXplZCB2YWx1ZS4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgQVdUS2V5U3Ryb2tlKCkgewogICAgICAgICB0aGlzKEtleUV2ZW50LkNIQVJfVU5ERUZJTkVELCBLZXlFdmVudC5WS19VTkRFRklORUQsIDAsIGZhbHNlKTsKQEAgLTEzMiw0MiArMTY5LDQ0IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgdW5pcXVlIG51bWJlciB2YWx1ZSBmb3IgQVdUS2V5U3Ryb2tlIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnQgdW5pcXVlIHZhbHVlIG9mIHRoZSBBV1RLZXlTdHJva2Ugb2JqZWN0LgorICAgICAqIEByZXR1cm4gdGhlIGludGVnZXIgdW5pcXVlIHZhbHVlIG9mIHRoZSBBV1RLZXlTdHJva2Ugb2JqZWN0LgogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBtb2RpZmllcnMgKyAoIGtleUNvZGUgIT0gS2V5RXZlbnQuVktfVU5ERUZJTkVEID8KLSAgICAgICAgICAgICAgICBrZXlDb2RlIDoga2V5Q2hhcikgKyAob25LZXlSZWxlYXNlID8gLTEgOiAwKTsKKyAgICAgICAgcmV0dXJuIG1vZGlmaWVycyArIChrZXlDb2RlICE9IEtleUV2ZW50LlZLX1VOREVGSU5FRCA/IGtleUNvZGUgOiBrZXlDaGFyKQorICAgICAgICAgICAgICAgICsgKG9uS2V5UmVsZWFzZSA/IC0xIDogMCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgc2V0IG9mIG1vZGlmaWVycyBmb3IgdGhlIEFXVEtleVN0cm9rZSBvYmplY3QuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW50IHZhbHVlIHdoaWNoIGNvbnRhaW5zIG1vZGlmaWVycy4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnRlZ2VyIHZhbHVlIHdoaWNoIGNvbnRhaW5zIG1vZGlmaWVycy4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGdldE1vZGlmaWVycygpIHsKICAgICAgICAgcmV0dXJuIG1vZGlmaWVyczsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUgQVdUS2V5U3Ryb2tlIG9iamVjdCB0byB0aGUgc3BlY2lmaWVkIG9iamVjdC4KKyAgICAgKiBDb21wYXJlcyB0aGlzIEFXVEtleVN0cm9rZSBvYmplY3QgdG8gdGhlIHNwZWNpZmllZCBvYmplY3QuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiBvYmplY3RzIGFyZSBpZGVudGljYWwsIG92ZXJ3aXNlIGZhbHNlLgorICAgICAqIEBwYXJhbSBhbk9iamVjdAorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBBV1RLZXlTdHJva2Ugb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzCisgICAgICogICAgICAgICAgICBpbnN0YW5jZS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgb2JqZWN0cyBhcmUgaWRlbnRpY2FsLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBhbk9iamVjdCkgewogICAgICAgICBpZiAoYW5PYmplY3QgaW5zdGFuY2VvZiBBV1RLZXlTdHJva2UpIHsKICAgICAgICAgICAgIEFXVEtleVN0cm9rZSBrZXkgPSAoQVdUS2V5U3Ryb2tlKWFuT2JqZWN0OwotICAgICAgICAgICAgcmV0dXJuICgoa2V5LmtleUNvZGUgPT0ga2V5Q29kZSkgJiYgKGtleS5rZXlDaGFyID09IGtleUNoYXIpICYmCi0gICAgICAgICAgICAgICAgICAgIChrZXkubW9kaWZpZXJzID09IG1vZGlmaWVycykgJiYKLSAgICAgICAgICAgICAgICAgICAgKGtleS5vbktleVJlbGVhc2UgPT0gb25LZXlSZWxlYXNlKSk7CisgICAgICAgICAgICByZXR1cm4gKChrZXkua2V5Q29kZSA9PSBrZXlDb2RlKSAmJiAoa2V5LmtleUNoYXIgPT0ga2V5Q2hhcikKKyAgICAgICAgICAgICAgICAgICAgJiYgKGtleS5tb2RpZmllcnMgPT0gbW9kaWZpZXJzKSAmJiAoa2V5Lm9uS2V5UmVsZWFzZSA9PSBvbktleVJlbGVhc2UpKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBBV1RLZXlTdHJva2UuCi0gICAgICogVGhpcyBzdHJpbmcgc2hvdWxkIGNvbnRhaW4ga2V5IHN0cm9rZSBwcm9wZXJ0aWVzLgorICAgICAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgQVdUS2V5U3Ryb2tlLiBUaGlzIHN0cmluZyBzaG91bGQKKyAgICAgKiBjb250YWluIGtleSBzdHJva2UgcHJvcGVydGllcy4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIEFXVEtleVN0cm9rZS4KICAgICAgKi8KQEAgLTE3NSw5ICsyMTQsMTAgQEAKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICBpbnQgdHlwZSA9IGdldEtleUV2ZW50VHlwZSgpOwogICAgICAgICByZXR1cm4gSW5wdXRFdmVudC5nZXRNb2RpZmllcnNFeFRleHQoZ2V0TW9kaWZpZXJzKCkpICsgIiAiICsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAga2V5RXZlbnRUeXBlc01hcC5nZXQobmV3IEludGVnZXIodHlwZSkpICsgICIgIiArIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICh0eXBlID09IEtleUV2ZW50LktFWV9UWVBFRCA/IG5ldyBTdHJpbmcobmV3IGNoYXJbXSB7a2V5Q2hhcn0pIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50LmdldEtleVRleHQoa2V5Q29kZSkpOworICAgICAgICAgICAgICAgIGtleUV2ZW50VHlwZXNNYXAuZ2V0KG5ldyBJbnRlZ2VyKHR5cGUpKSArICIgIiArIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICAodHlwZSA9PSBLZXlFdmVudC5LRVlfVFlQRUQgPyBuZXcgU3RyaW5nKG5ldyBjaGFyW10geworICAgICAgICAgICAgICAgICAgICBrZXlDaGFyCisgICAgICAgICAgICAgICAgfSkgOiBLZXlFdmVudC5nZXRLZXlUZXh0KGtleUNvZGUpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIwMSwxNiArMjQxLDE4IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgQVdUIGtleSBzdHJva2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGtleUNoYXIgdGhlIGtleSBjaGFyCi0gICAgICogQHBhcmFtIGtleUNvZGUgdGhlIGtleSBjb2RlCi0gICAgICogQHBhcmFtIG1vZGlmaWVycyB0aGUgbW9kaWZpZXJzCi0gICAgICogQHBhcmFtIG9uS2V5UmVsZWFzZSB0aGUgb24ga2V5IHJlbGVhc2UKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBBV1Qga2V5IHN0cm9rZQorICAgICAqIEBwYXJhbSBrZXlDaGFyCisgICAgICogICAgICAgICAgICB0aGUga2V5IGNoYXIuCisgICAgICogQHBhcmFtIGtleUNvZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgY29kZS4KKyAgICAgKiBAcGFyYW0gbW9kaWZpZXJzCisgICAgICogICAgICAgICAgICB0aGUgbW9kaWZpZXJzLgorICAgICAqIEBwYXJhbSBvbktleVJlbGVhc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBvbiBrZXkgcmVsZWFzZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBBV1Qga2V5IHN0cm9rZS4KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBBV1RLZXlTdHJva2UgZ2V0QVdUS2V5U3Ryb2tlKGNoYXIga2V5Q2hhciwgaW50IGtleUNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kaWZpZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBvbktleVJlbGVhc2UpIHsKKyAgICBwcml2YXRlIHN0YXRpYyBBV1RLZXlTdHJva2UgZ2V0QVdUS2V5U3Ryb2tlKGNoYXIga2V5Q2hhciwgaW50IGtleUNvZGUsIGludCBtb2RpZmllcnMsCisgICAgICAgICAgICBib29sZWFuIG9uS2V5UmVsZWFzZSkgewogICAgICAgICBBV1RLZXlTdHJva2Uga2V5ID0gbmV3SW5zdGFuY2Uoa2V5Q2hhciwga2V5Q29kZSwgbW9kaWZpZXJzLCBvbktleVJlbGVhc2UpOwogCiAgICAgICAgIEFXVEtleVN0cm9rZSB2YWx1ZSA9IGNhY2hlLmdldChrZXkpOwpAQCAtMjI0LDI4ICsyNjYsMzAgQEAKICAgICAvKioKICAgICAgKiBOZXcgaW5zdGFuY2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGtleUNoYXIgdGhlIGtleSBjaGFyCi0gICAgICogQHBhcmFtIGtleUNvZGUgdGhlIGtleSBjb2RlCi0gICAgICogQHBhcmFtIG1vZGlmaWVycyB0aGUgbW9kaWZpZXJzCi0gICAgICogQHBhcmFtIG9uS2V5UmVsZWFzZSB0aGUgb24ga2V5IHJlbGVhc2UKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBBV1Qga2V5IHN0cm9rZQorICAgICAqIEBwYXJhbSBrZXlDaGFyCisgICAgICogICAgICAgICAgICB0aGUga2V5IGNoYXIuCisgICAgICogQHBhcmFtIGtleUNvZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgY29kZS4KKyAgICAgKiBAcGFyYW0gbW9kaWZpZXJzCisgICAgICogICAgICAgICAgICB0aGUgbW9kaWZpZXJzLgorICAgICAqIEBwYXJhbSBvbktleVJlbGVhc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBvbiBrZXkgcmVsZWFzZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBBV1Qga2V5IHN0cm9rZS4KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBBV1RLZXlTdHJva2UgbmV3SW5zdGFuY2UoY2hhciBrZXlDaGFyLCBpbnQga2V5Q29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGlmaWVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBvbktleVJlbGVhc2UpIHsKKyAgICBwcml2YXRlIHN0YXRpYyBBV1RLZXlTdHJva2UgbmV3SW5zdGFuY2UoY2hhciBrZXlDaGFyLCBpbnQga2V5Q29kZSwgaW50IG1vZGlmaWVycywKKyAgICAgICAgICAgIGJvb2xlYW4gb25LZXlSZWxlYXNlKSB7CiAgICAgICAgIEFXVEtleVN0cm9rZSBrZXk7Ci0gICAgICAgIC8vPz8/QVdUCi0vLyAgICAgICAgaWYgKHN1YkNvbnN0cnVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIGtleSA9IG5ldyBBV1RLZXlTdHJva2UoKTsKLSAgICAgICAgLy8/Pz9BV1QKLS8vICAgICAgICB9IGVsc2UgewotLy8gICAgICAgICAgICB0cnkgewotLy8gICAgICAgICAgICAgICAga2V5ID0gKEFXVEtleVN0cm9rZSkgc3ViQ29uc3RydWN0b3IubmV3SW5zdGFuY2UoKTsKLS8vICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgfQorICAgICAgICAvLyA/Pz9BV1QKKyAgICAgICAgLy8gaWYgKHN1YkNvbnN0cnVjdG9yID09IG51bGwpIHsKKyAgICAgICAga2V5ID0gbmV3IEFXVEtleVN0cm9rZSgpOworICAgICAgICAvLyA/Pz9BV1QKKyAgICAgICAgLy8gfSBlbHNlIHsKKyAgICAgICAgLy8gdHJ5IHsKKyAgICAgICAgLy8ga2V5ID0gKEFXVEtleVN0cm9rZSkgc3ViQ29uc3RydWN0b3IubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgLy8gfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgLy8gdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIC8vIH0KKyAgICAgICAgLy8gfQogICAgICAgICBpbnQgYWxsTW9kaWZpZXJzID0gZ2V0QWxsTW9kaWZpZXJzKG1vZGlmaWVycyk7CiAgICAgICAgIGtleS5zZXRBV1RLZXlTdHJva2Uoa2V5Q2hhciwga2V5Q29kZSwgYWxsTW9kaWZpZXJzLCBvbktleVJlbGVhc2UpOwogICAgICAgICByZXR1cm4ga2V5OwpAQCAtMjU0LDIxICsyOTgsMjIgQEAKICAgICAvKioKICAgICAgKiBBZGRzIHRoZSBtYXNrLgogICAgICAqIAotICAgICAqIEBwYXJhbSBtb2QgdGhlIG1vZAotICAgICAqIEBwYXJhbSBtYXNrIHRoZSBtYXNrCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW50CisgICAgICogQHBhcmFtIG1vZAorICAgICAqICAgICAgICAgICAgdGhlIG1vZC4KKyAgICAgKiBAcGFyYW0gbWFzaworICAgICAqICAgICAgICAgICAgdGhlIG1hc2suCisgICAgICogQHJldHVybiB0aGUgaW50LgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGludCBhZGRNYXNrKGludCBtb2QsIGludCBtYXNrKSB7CiAgICAgICAgIHJldHVybiAoKG1vZCAmIG1hc2spICE9IDApID8gKG1vZCB8IG1hc2spIDogbW9kOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIHJldHVybiBhbGwgKG9sZCAmIG5ldykgbW9kaWZpZXJzIGNvcnJlc3BvbmRpbmcgdG8uCisgICAgICogUmV0dXJuIGFsbCAob2xkICYgbmV3KSBtb2RpZmllcnMgY29ycmVzcG9uZGluZyB0by4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbW9kIG9sZCBvciBuZXcgbW9kaWZpZXJzCi0gICAgICogCi0gICAgICogQHJldHVybiBvbGQgYW5kIG5ldyBtb2RpZmllcnMgdG9nZXRoZXIKKyAgICAgKiBAcGFyYW0gbW9kCisgICAgICogICAgICAgICAgICBvbGQgb3IgbmV3IG1vZGlmaWVycy4KKyAgICAgKiBAcmV0dXJuIG9sZCBhbmQgbmV3IG1vZGlmaWVycyB0b2dldGhlci4KICAgICAgKi8KICAgICBzdGF0aWMgaW50IGdldEFsbE1vZGlmaWVycyhpbnQgbW9kKSB7CiAgICAgICAgIGludCBhbGxNb2QgPSBtb2Q7CkBAIC0yODksMjcgKzMzNCwyMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgQVdUS2V5U3Ryb2tlIGZvciBwYXJzZWQgc3RyaW5nLgotICAgICAqIAotICAgICAqIFRoZSBzdHJpbmcgbXVzdCBoYXZlIHRoZSBmb2xsb3dpbmcgc3ludGF4OgorICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgQVdUS2V5U3Ryb2tlIGZvciBwYXJzZWQgc3RyaW5nLiBUaGUgc3RyaW5nIG11c3QKKyAgICAgKiBoYXZlIHRoZSBmb2xsb3dpbmcgc3ludGF4OgogICAgICAqPHA+CiAgICAgICogJmx0O21vZGlmaWVycyZndDsqICgmbHQ7dHlwZWRJRCZndDsgfCAmbHQ7cHJlc3NlZFJlbGVhc2VkSUQmZ3Q7KQogICAgICAqPHA+Ci0gICAgICogbW9kaWZpZXJzIDo9IHNoaWZ0IHwgY29udHJvbCB8IGN0cmwgfCBtZXRhIHwgYWx0IHwgYWx0R3JhcGgKLSAgICAgKiA8YnI+IAotICAgICAqIHR5cGVkSUQgOj0gdHlwZWQgPHR5cGVkS2V5PgotICAgICAqIDxicj4KLSAgICAgKiB0eXBlZEtleSA6PSBzdHJpbmcgb2YgbGVuZ3RoIDEgZ2l2aW5nIHRoZSBVbmljb2RlIGNoYXJhY3Rlci4KLSAgICAgKiA8YnI+Ci0gICAgICogcHJlc3NlZFJlbGVhc2VkSUQgOj0gKHByZXNzZWQgfCByZWxlYXNlZCkgPGtleT4KLSAgICAgKiA8YnI+CisgICAgICogbW9kaWZpZXJzIDo9IHNoaWZ0IHwgY29udHJvbCB8IGN0cmwgfCBtZXRhIHwgYWx0IHwgYWx0R3JhcGggPGJyPgorICAgICAqIHR5cGVkSUQgOj0gdHlwZWQgPHR5cGVkS2V5PiA8YnI+CisgICAgICogdHlwZWRLZXkgOj0gc3RyaW5nIG9mIGxlbmd0aCAxIGdpdmluZyB0aGUgVW5pY29kZSBjaGFyYWN0ZXIuIDxicj4KKyAgICAgKiBwcmVzc2VkUmVsZWFzZWRJRCA6PSAocHJlc3NlZCB8IHJlbGVhc2VkKSA8a2V5PiA8YnI+CiAgICAgICoga2V5IDo9IEtleUV2ZW50IGtleSBjb2RlIG5hbWUsIGkuZS4gdGhlIG5hbWUgZm9sbG93aW5nICJWS18iLgogICAgICAqIDxwPgotICAgICAqIEBwYXJhbSBzIHRoZSBTdHJpbmcgd2hpY2ggY29udGFpbnMga2V5IHN0cm9rZSBwYXJhbWV0ZXJzLgogICAgICAqIAorICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICB0aGUgU3RyaW5nIHdoaWNoIGNvbnRhaW5zIGtleSBzdHJva2UgcGFyYW1ldGVycy4KICAgICAgKiBAcmV0dXJuIHRoZSBBV1RLZXlTdHJva2UgZm9yIHN0cmluZy4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBzdHJpbmcgaGFzIGluY29ycmVjdCBmb3JtYXQgb3IgbnVsbC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHN0cmluZyBoYXMgaW5jb3JyZWN0IGZvcm1hdCBvciBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQVdUS2V5U3Ryb2tlIGdldEFXVEtleVN0cm9rZShTdHJpbmcgcykgewogICAgICAgICBpZiAocyA9PSBudWxsKSB7CkBAIC0zNTEsMTYgKzM5MiwxNSBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC42NiIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIGdldEFXVEtleVN0cm9rZShrZXlDaGFyLCBrZXlDb2RlLCBtb2RpZmllcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZSA9PSBCb29sZWFuLlRSVUUpOworICAgICAgICByZXR1cm4gZ2V0QVdUS2V5U3Ryb2tlKGtleUNoYXIsIGtleUNvZGUsIG1vZGlmaWVycywgcmVsZWFzZSA9PSBCb29sZWFuLlRSVUUpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG5leHQgdG9rZW4uCiAgICAgICogCi0gICAgICogQHBhcmFtIHRva2VuaXplciB0aGUgdG9rZW5pemVyCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV4dCB0b2tlbgorICAgICAqIEBwYXJhbSB0b2tlbml6ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSB0b2tlbml6ZXIuCisgICAgICogQHJldHVybiB0aGUgbmV4dCB0b2tlbi4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TmV4dFRva2VuKFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIpIHsKICAgICAgICAgdHJ5IHsKQEAgLTM3NCw5ICs0MTQsOSBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGtleSBjb2RlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzIHRoZSBzCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUga2V5IGNvZGUKKyAgICAgKiBAcGFyYW0gcworICAgICAqICAgICAgICAgICAgdGhlIHMuCisgICAgICogQHJldHVybiB0aGUga2V5IGNvZGUuCiAgICAgICovCiAgICAgc3RhdGljIGludCBnZXRLZXlDb2RlKFN0cmluZyBzKSB7CiAgICAgICAgIHRyeSB7CkBAIC0zOTQsOCArNDM0LDggQEAKICAgICAvKioKICAgICAgKiBHZXRzIGFuIGluc3RhbmNlIG9mIHRoZSBBV1RLZXlTdHJva2UgZm9yIHNwZWNpZmllZCBjaGFyYWN0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGtleUNoYXIgdGhlIGtleWJvYXJkIGNoYXJhY3RlciB2YWx1ZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5Q2hhcgorICAgICAqICAgICAgICAgICAgdGhlIGtleWJvYXJkIGNoYXJhY3RlciB2YWx1ZS4KICAgICAgKiBAcmV0dXJuIGEgQVdUS2V5U3Ryb2tlIGZvciBzcGVjaWZpZWQgY2hhcmFjdGVyLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQVdUS2V5U3Ryb2tlIGdldEFXVEtleVN0cm9rZShjaGFyIGtleUNoYXIpIHsKQEAgLTQwMywxMjAgKzQ0MywxMjEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIEFXVEtleVN0cm9rZSBmb3IgYSBnaXZlbiBrZXkgY29kZSwgc2V0IAotICAgICAqIG9mIG1vZGlmaWVycywgYW5kIHNwZWNpZmllZCBrZXkgcmVsZWFzZWQgZmxhZyB2YWx1ZS4KLSAgICAgKiBUaGUga2V5IGNvZGVzIGFyZSBkZWZpbmVkIGluIGphdmEuYXd0LmV2ZW50LktleUV2ZW50IGNsYXNzLiAKLSAgICAgKiBUaGUgc2V0IG9mIG1vZGlmaWVycyBpcyBnaXZlbiBhcyBhIGJpdHdpc2UgY29tYmluYXRpb24gCi0gICAgICogb2YgbWFza3MgdGFrZW4gZnJvbSB0aGUgZm9sbG93aW5nIGxpc3Q6CisgICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiBBV1RLZXlTdHJva2UgZm9yIGEgZ2l2ZW4ga2V5IGNvZGUsIHNldCBvZgorICAgICAqIG1vZGlmaWVycywgYW5kIHNwZWNpZmllZCBrZXkgcmVsZWFzZWQgZmxhZyB2YWx1ZS4gVGhlIGtleSBjb2RlcyBhcmUKKyAgICAgKiBkZWZpbmVkIGluIGphdmEuYXd0LmV2ZW50LktleUV2ZW50IGNsYXNzLiBUaGUgc2V0IG9mIG1vZGlmaWVycyBpcyBnaXZlbgorICAgICAqIGFzIGEgYml0d2lzZSBjb21iaW5hdGlvbiBvZiBtYXNrcyB0YWtlbiBmcm9tIHRoZSBmb2xsb3dpbmcgbGlzdDoKICAgICAgKiA8dWw+Ci0gICAgICogPGxpPmphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuQUxUX0dSQVBIX0RPV05fTUFTSzwvbGk+Ci0gICAgICogPGxpPmphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuQUxUX0RPV05fTUFTSzwvbGk+Ci0gICAgICogPGxpPmphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuQ1RSTF9ET1dOX01BU0s8L2xpPgotICAgICAqIDxsaT5qYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50Lk1FVEFfRE9XTl9NQVNLPC9saT4KLSAgICAgKiA8bGk+amF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudC5TSElGVF9ET1dOX01BU0s8L2xpPgotICAgICAqIDxsaT5qYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50LkFMVF9HUkFQSF9NQVNLPC9saT4KLSAgICAgKiA8bGk+amF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudC5BTFRfTUFTSzwvbGk+Ci0gICAgICogPGxpPmphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuQ1RSTF9NQVNLPC9saT4KLSAgICAgKiA8bGk+amF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudC5NRVRBX01BU0s8L2xpPiAgCi0gICAgICogPGxpPmphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuU0hJRlRfTUFTSzwvbGk+CisgICAgICogPGxpPmphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuQUxUX0dSQVBIX0RPV05fTUFTSzwvbGk+IDxsaT4KKyAgICAgKiBqYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50LkFMVF9ET1dOX01BU0s8L2xpPiA8bGk+CisgICAgICogamF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudC5DVFJMX0RPV05fTUFTSzwvbGk+IDxsaT4KKyAgICAgKiBqYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50Lk1FVEFfRE9XTl9NQVNLPC9saT4gPGxpPgorICAgICAqIGphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuU0hJRlRfRE9XTl9NQVNLPC9saT4gPGxpPgorICAgICAqIGphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuQUxUX0dSQVBIX01BU0s8L2xpPiA8bGk+CisgICAgICogamF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudC5BTFRfTUFTSzwvbGk+IDxsaT4KKyAgICAgKiBqYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50LkNUUkxfTUFTSzwvbGk+IDxsaT4KKyAgICAgKiBqYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50Lk1FVEFfTUFTSzwvbGk+IDxsaT4KKyAgICAgKiBqYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50LlNISUZUX01BU0s8L2xpPgogICAgICAqIDwvdWw+Ci0gICAgICogIDxicj4KLSAgICAgKiAgCi0gICAgICogQHBhcmFtIGtleUNvZGUgdGhlIHNwZWNpZmllZCBrZXkgY29kZSBvZiBrZXlib2FyZC4KLSAgICAgKiBAcGFyYW0gbW9kaWZpZXJzIHRoZSBiaXQgc2V0IG9mIG1vZGlmaWVycy4KKyAgICAgKiA8YnI+CiAgICAgICogCisgICAgICogQHBhcmFtIGtleUNvZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQga2V5IGNvZGUgb2Yga2V5Ym9hcmQuCisgICAgICogQHBhcmFtIG1vZGlmaWVycworICAgICAqICAgICAgICAgICAgdGhlIGJpdCBzZXQgb2YgbW9kaWZpZXJzLgorICAgICAqIEBwYXJhbSBvbktleVJlbGVhc2UKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB3aGljaCByZXByZXNlbnRzIHdoZXRoZXIgdGhpcyBBV1RLZXlTdHJva2Ugc2hhbGwKKyAgICAgKiAgICAgICAgICAgIHJlcHJlc2VudHMgYSBrZXkgcmVsZWFzZS4KICAgICAgKiBAcmV0dXJuIHRoZSBBV1RLZXlTdHJva2UuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBBV1RLZXlTdHJva2UgZ2V0QVdUS2V5U3Ryb2tlKGludCBrZXlDb2RlLCBpbnQgbW9kaWZpZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG9uS2V5UmVsZWFzZSkgewotICAgICAgICByZXR1cm4gZ2V0QVdUS2V5U3Ryb2tlKEtleUV2ZW50LkNIQVJfVU5ERUZJTkVELCBrZXlDb2RlLCBtb2RpZmllcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25LZXlSZWxlYXNlKTsKKyAgICBwdWJsaWMgc3RhdGljIEFXVEtleVN0cm9rZSBnZXRBV1RLZXlTdHJva2UoaW50IGtleUNvZGUsIGludCBtb2RpZmllcnMsIGJvb2xlYW4gb25LZXlSZWxlYXNlKSB7CisgICAgICAgIHJldHVybiBnZXRBV1RLZXlTdHJva2UoS2V5RXZlbnQuQ0hBUl9VTkRFRklORUQsIGtleUNvZGUsIG1vZGlmaWVycywgb25LZXlSZWxlYXNlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIEFXVEtleVN0cm9rZSBmb3IgYSBzcGVjaWZpZWQgY2hhcmFjdGVyIGFuZCBzZXQgb2YgbW9kaWZpZXJzLiAKLSAgICAgKiBUaGUgc2V0IG9mIG1vZGlmaWVycyBpcyBnaXZlbiBhcyBhIGJpdHdpc2UgY29tYmluYXRpb24gCi0gICAgICogb2YgbWFza3MgdGFrZW4gZnJvbSB0aGUgZm9sbG93aW5nIGxpc3Q6CisgICAgICogUmV0dXJucyBBV1RLZXlTdHJva2UgZm9yIGEgc3BlY2lmaWVkIGNoYXJhY3RlciBhbmQgc2V0IG9mIG1vZGlmaWVycy4gVGhlCisgICAgICogc2V0IG9mIG1vZGlmaWVycyBpcyBnaXZlbiBhcyBhIGJpdHdpc2UgY29tYmluYXRpb24gb2YgbWFza3MgdGFrZW4gZnJvbQorICAgICAqIHRoZSBmb2xsb3dpbmcgbGlzdDoKICAgICAgKiA8dWw+Ci0gICAgICogPGxpPmphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuQUxUX0dSQVBIX0RPV05fTUFTSzwvbGk+Ci0gICAgICogPGxpPmphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuQUxUX0RPV05fTUFTSzwvbGk+Ci0gICAgICogPGxpPmphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuQ1RSTF9ET1dOX01BU0s8L2xpPgotICAgICAqIDxsaT5qYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50Lk1FVEFfRE9XTl9NQVNLPC9saT4KLSAgICAgKiA8bGk+amF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudC5TSElGVF9ET1dOX01BU0s8L2xpPgotICAgICAqIDxsaT5qYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50LkFMVF9HUkFQSF9NQVNLPC9saT4KLSAgICAgKiA8bGk+amF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudC5BTFRfTUFTSzwvbGk+Ci0gICAgICogPGxpPmphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuQ1RSTF9NQVNLPC9saT4KLSAgICAgKiA8bGk+amF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudC5NRVRBX01BU0s8L2xpPiAgCi0gICAgICogPGxpPmphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuU0hJRlRfTUFTSzwvbGk+CisgICAgICogPGxpPmphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuQUxUX0dSQVBIX0RPV05fTUFTSzwvbGk+IDxsaT4KKyAgICAgKiBqYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50LkFMVF9ET1dOX01BU0s8L2xpPiA8bGk+CisgICAgICogamF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudC5DVFJMX0RPV05fTUFTSzwvbGk+IDxsaT4KKyAgICAgKiBqYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50Lk1FVEFfRE9XTl9NQVNLPC9saT4gPGxpPgorICAgICAqIGphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuU0hJRlRfRE9XTl9NQVNLPC9saT4gPGxpPgorICAgICAqIGphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuQUxUX0dSQVBIX01BU0s8L2xpPiA8bGk+CisgICAgICogamF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudC5BTFRfTUFTSzwvbGk+IDxsaT4KKyAgICAgKiBqYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50LkNUUkxfTUFTSzwvbGk+IDxsaT4KKyAgICAgKiBqYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50Lk1FVEFfTUFTSzwvbGk+IDxsaT4KKyAgICAgKiBqYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50LlNISUZUX01BU0s8L2xpPgogICAgICAqIDwvdWw+CiAgICAgICogCi0gICAgICogQHBhcmFtIGtleUNoYXIgdGhlIENoYXJhY3RlciBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyBrZXlib2FyZCBjaGFyYWN0ZXIgdmFsdWUuCi0gICAgICogQHBhcmFtIG1vZGlmaWVycyB0aGUgYml0IHNldCBvZiBtb2RpZmllcnMuCi0gICAgICogCisgICAgICogQHBhcmFtIGtleUNoYXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBDaGFyYWN0ZXIgb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMga2V5Ym9hcmQgY2hhcmFjdGVyCisgICAgICogICAgICAgICAgICB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gbW9kaWZpZXJzCisgICAgICogICAgICAgICAgICB0aGUgYml0IHNldCBvZiBtb2RpZmllcnMuCiAgICAgICogQHJldHVybiB0aGUgQVdUS2V5U3Ryb2tlIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBrZXlDaGFyIHZhbHVlIGlzIG51bGwuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBrZXlDaGFyIHZhbHVlIGlzIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBBV1RLZXlTdHJva2UgZ2V0QVdUS2V5U3Ryb2tlKENoYXJhY3RlciBrZXlDaGFyLCBpbnQgbW9kaWZpZXJzKSB7CiAgICAgICAgIGlmIChrZXlDaGFyID09IG51bGwpIHsKICAgICAgICAgICAgIC8vIGF3dC4wMT0nezB9JyBwYXJhbWV0ZXIgaXMgbnVsbAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4wMSIsICJrZXlDaGFyIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKICAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0QVdUS2V5U3Ryb2tlKGtleUNoYXIuY2hhclZhbHVlKCksIEtleUV2ZW50LlZLX1VOREVGSU5FRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllcnMsIGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIGdldEFXVEtleVN0cm9rZShrZXlDaGFyLmNoYXJWYWx1ZSgpLCBLZXlFdmVudC5WS19VTkRFRklORUQsIG1vZGlmaWVycywgZmFsc2UpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgQVdUS2V5U3Ryb2tlIGZvciBhIHNwZWNpZmllZCBrZXkgY29kZSBhbmQgCi0gICAgICogc2V0IG9mIG1vZGlmaWVycy4KLSAgICAgKiBUaGUga2V5IGNvZGVzIGFyZSBkZWZpbmVkIGluIGphdmEuYXd0LmV2ZW50LktleUV2ZW50IGNsYXNzLiAKLSAgICAgKiBUaGUgc2V0IG9mIG1vZGlmaWVycyBpcyBnaXZlbiBhcyBhIGJpdHdpc2UgY29tYmluYXRpb24gCi0gICAgICogb2YgbWFza3MgdGFrZW4gZnJvbSB0aGUgZm9sbG93aW5nIGxpc3Q6CisgICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiBBV1RLZXlTdHJva2UgZm9yIGEgc3BlY2lmaWVkIGtleSBjb2RlIGFuZCBzZXQgb2YKKyAgICAgKiBtb2RpZmllcnMuIFRoZSBrZXkgY29kZXMgYXJlIGRlZmluZWQgaW4gamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQgY2xhc3MuCisgICAgICogVGhlIHNldCBvZiBtb2RpZmllcnMgaXMgZ2l2ZW4gYXMgYSBiaXR3aXNlIGNvbWJpbmF0aW9uIG9mIG1hc2tzIHRha2VuCisgICAgICogZnJvbSB0aGUgZm9sbG93aW5nIGxpc3Q6CiAgICAgICogPHVsPgotICAgICAqIDxsaT5qYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50LkFMVF9HUkFQSF9ET1dOX01BU0s8L2xpPgotICAgICAqIDxsaT5qYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50LkFMVF9ET1dOX01BU0s8L2xpPgotICAgICAqIDxsaT5qYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50LkNUUkxfRE9XTl9NQVNLPC9saT4KLSAgICAgKiA8bGk+amF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudC5NRVRBX0RPV05fTUFTSzwvbGk+Ci0gICAgICogPGxpPmphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuU0hJRlRfRE9XTl9NQVNLPC9saT4KLSAgICAgKiA8bGk+amF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudC5BTFRfR1JBUEhfTUFTSzwvbGk+Ci0gICAgICogPGxpPmphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuQUxUX01BU0s8L2xpPgotICAgICAqIDxsaT5qYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50LkNUUkxfTUFTSzwvbGk+Ci0gICAgICogPGxpPmphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuTUVUQV9NQVNLPC9saT4gIAotICAgICAqIDxsaT5qYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50LlNISUZUX01BU0s8L2xpPgorICAgICAqIDxsaT5qYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50LkFMVF9HUkFQSF9ET1dOX01BU0s8L2xpPiA8bGk+CisgICAgICogamF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudC5BTFRfRE9XTl9NQVNLPC9saT4gPGxpPgorICAgICAqIGphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuQ1RSTF9ET1dOX01BU0s8L2xpPiA8bGk+CisgICAgICogamF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudC5NRVRBX0RPV05fTUFTSzwvbGk+IDxsaT4KKyAgICAgKiBqYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50LlNISUZUX0RPV05fTUFTSzwvbGk+IDxsaT4KKyAgICAgKiBqYXZhLmF3dC5ldmVudC5JbnB1dEV2ZW50LkFMVF9HUkFQSF9NQVNLPC9saT4gPGxpPgorICAgICAqIGphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQuQUxUX01BU0s8L2xpPiA8bGk+CisgICAgICogamF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudC5DVFJMX01BU0s8L2xpPiA8bGk+CisgICAgICogamF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudC5NRVRBX01BU0s8L2xpPiA8bGk+CisgICAgICogamF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudC5TSElGVF9NQVNLPC9saT4KICAgICAgKiA8L3VsPgotICAgICAqICAKLSAgICAgKiBAcGFyYW0ga2V5Q29kZSB0aGUgc3BlY2lmaWVkIGtleSBjb2RlIG9mIGtleWJvYXJkLgotICAgICAqIEBwYXJhbSBtb2RpZmllcnMgdGhlIGJpdCBzZXQgb2YgbW9kaWZpZXJzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIEFXVEtleVN0cm9rZQorICAgICAqIEBwYXJhbSBrZXlDb2RlCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGtleSBjb2RlIG9mIGtleWJvYXJkLgorICAgICAqIEBwYXJhbSBtb2RpZmllcnMKKyAgICAgKiAgICAgICAgICAgIHRoZSBiaXQgc2V0IG9mIG1vZGlmaWVycy4KKyAgICAgKiBAcmV0dXJuIHRoZSBBV1RLZXlTdHJva2UuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBBV1RLZXlTdHJva2UgZ2V0QVdUS2V5U3Ryb2tlKGludCBrZXlDb2RlLCBpbnQgbW9kaWZpZXJzKSB7CiAgICAgICAgIHJldHVybiBnZXRBV1RLZXlTdHJva2Uoa2V5Q29kZSwgbW9kaWZpZXJzLCBmYWxzZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgQVdUS2V5U3Ryb2tlIGZvciBhIGtleSBldmVudC4gVGhpcyBtZXRob2Qgb2J0YWlucyB0aGUga2V5IGNoYXIgCisgICAgICogR2V0cyB0aGUgQVdUS2V5U3Ryb2tlIGZvciBhIGtleSBldmVudC4gVGhpcyBtZXRob2Qgb2J0YWlucyB0aGUga2V5IGNoYXIKICAgICAgKiBhbmQga2V5IGNvZGUgZnJvbSB0aGUgc3BlY2lmaWVkIGtleSBldmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYW5FdmVudCB0aGUga2V5IGV2ZW50IHdoaWNoIGlkZW50aWZpZXMgdGhlIGRlc2lyZWQgQVdUS2V5U3Ryb2tlLgotICAgICAqIAorICAgICAqIEBwYXJhbSBhbkV2ZW50CisgICAgICogICAgICAgICAgICB0aGUga2V5IGV2ZW50IHdoaWNoIGlkZW50aWZpZXMgdGhlIGRlc2lyZWQgQVdUS2V5U3Ryb2tlLgogICAgICAqIEByZXR1cm4gdGhlIEFXVEtleVN0cm9rZSBmb3IgdGhlIGtleSBldmVudC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEFXVEtleVN0cm9rZSBnZXRBV1RLZXlTdHJva2VGb3JFdmVudChLZXlFdmVudCBhbkV2ZW50KSB7CiAgICAgICAgIGludCBpZCA9IGFuRXZlbnQuZ2V0SUQoKTsKICAgICAgICAgY2hhciB1bmRlZiA9IEtleUV2ZW50LkNIQVJfVU5ERUZJTkVEOwotICAgICAgICBjaGFyIGtleUNoYXIgPSAoaWQgPT0gS2V5RXZlbnQuS0VZX1RZUEVEID8gYW5FdmVudC5nZXRLZXlDaGFyKCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYpOwotICAgICAgICBpbnQga2V5Q29kZSA9IChrZXlDaGFyID09IHVuZGVmID8gYW5FdmVudC5nZXRLZXlDb2RlKCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5RXZlbnQuVktfVU5ERUZJTkVEKTsKKyAgICAgICAgY2hhciBrZXlDaGFyID0gKGlkID09IEtleUV2ZW50LktFWV9UWVBFRCA/IGFuRXZlbnQuZ2V0S2V5Q2hhcigpIDogdW5kZWYpOworICAgICAgICBpbnQga2V5Q29kZSA9IChrZXlDaGFyID09IHVuZGVmID8gYW5FdmVudC5nZXRLZXlDb2RlKCkgOiBLZXlFdmVudC5WS19VTkRFRklORUQpOwogICAgICAgICByZXR1cm4gZ2V0QVdUS2V5U3Ryb2tlKGtleUNoYXIsIGtleUNvZGUsIGFuRXZlbnQuZ2V0TW9kaWZpZXJzRXgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCA9PSBLZXlFdmVudC5LRVlfUkVMRUFTRUQpOworICAgICAgICAgICAgICAgIGlkID09IEtleUV2ZW50LktFWV9SRUxFQVNFRCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUga2V5IGV2ZW50IHR5cGUgZm9yIHRoZSBBV1RLZXlTdHJva2Ugb2JqZWN0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGtleSBldmVudCB0eXBlOiBLZXlFdmVudC5LRVlfUFJFU1NFRCwgS2V5RXZlbnQuS0VZX1RZUEVELCBvciBLZXlFdmVudC5LRVlfUkVMRUFTRUQKKyAgICAgKiBAcmV0dXJuIHRoZSBrZXkgZXZlbnQgdHlwZTogS2V5RXZlbnQuS0VZX1BSRVNTRUQsIEtleUV2ZW50LktFWV9UWVBFRCwgb3IKKyAgICAgKiAgICAgICAgIEtleUV2ZW50LktFWV9SRUxFQVNFRC4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGdldEtleUV2ZW50VHlwZSgpIHsKICAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuVktfVU5ERUZJTkVEKSB7CkBAIC01MjYsMTEgKzU2NywxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVucyB0cnVlIGlmIHRoZSBrZXkgZXZlbnQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBBV1RLZXlTdHJva2UgaXMgCi0gICAgICogS0VZX1JFTEVBU0VELCBvdmVyd2lzZSBmYWxzZS4KKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGtleSBldmVudCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIEFXVEtleVN0cm9rZSBpcworICAgICAqIEtFWV9SRUxFQVNFRCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgaWYgdGhlIGtleSBldmVudCBhc3NvY2lhdGVkIHdpdGggdGhlIEFXVEtleVN0cm9rZSBpcyAKLSAgICAgKiBLRVlfUkVMRUFTRUQsIG92ZXJ3aXNlIGZhbHNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgaWYgdGhlIGtleSBldmVudCBhc3NvY2lhdGVkIHdpdGggdGhlIEFXVEtleVN0cm9rZSBpcworICAgICAqICAgICAgICAgS0VZX1JFTEVBU0VELCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNPbktleVJlbGVhc2UoKSB7CiAgICAgICAgIHJldHVybiBvbktleVJlbGVhc2U7CkBAIC01MzksNTAgKzU4MCw0NCBAQAogICAgIC8qKgogICAgICAqIFJlYWQgcmVzb2x2ZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiB0aGUgb2JqZWN0IHN0cmVhbSBleGNlcHRpb24KKyAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QuCisgICAgICogQHRocm93cyBPYmplY3RTdHJlYW1FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICB0aGUgb2JqZWN0IHN0cmVhbSBleGNlcHRpb24uCiAgICAgICovCiAgICAgcHJvdGVjdGVkIE9iamVjdCByZWFkUmVzb2x2ZSgpIHRocm93cyBPYmplY3RTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0QVdUS2V5U3Ryb2tlKHRoaXMua2V5Q2hhciwgdGhpcy5rZXlDb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9kaWZpZXJzLCB0aGlzLm9uS2V5UmVsZWFzZSk7CisgICAgICAgIHJldHVybiBnZXRBV1RLZXlTdHJva2UodGhpcy5rZXlDaGFyLCB0aGlzLmtleUNvZGUsIHRoaXMubW9kaWZpZXJzLCB0aGlzLm9uS2V5UmVsZWFzZSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogUmVnaXN0ZXIgc3ViY2xhc3MuCiAgICAgICogCi0gICAgICogQHBhcmFtIHN1YmNsYXNzIHRoZSBzdWJjbGFzcworICAgICAqIEBwYXJhbSBzdWJjbGFzcworICAgICAqICAgICAgICAgICAgdGhlIHN1YmNsYXNzLgogICAgICAqLwogICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCByZWdpc3RlclN1YmNsYXNzKENsYXNzPD8+IHN1YmNsYXNzKSB7Ci0gICAgICAgIC8vPz8/QVdUCisgICAgICAgIC8vID8/P0FXVAogICAgICAgICAvKgotICAgICAgICBpZiAoc3ViY2xhc3MgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gYXd0LjAxPSd7MH0nIHBhcmFtZXRlciBpcyBudWxsCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjAxIiwgInN1YmNsYXNzIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgfQotICAgICAgICBpZiAoISBBV1RLZXlTdHJva2UuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShzdWJjbGFzcykpIHsKLSAgICAgICAgICAgIC8vIGF3dC42Nz1zdWJjbGFzcyBpcyBub3QgZGVyaXZlZCBmcm9tIEFXVEtleVN0cm9rZQotICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC42NyIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdWJDb25zdHJ1Y3RvciA9IHN1YmNsYXNzLmdldERlY2xhcmVkQ29uc3RydWN0b3IoKTsKLSAgICAgICAgICAgIHN1YkNvbnN0cnVjdG9yLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gYXd0LjY4PXN1YmNsYXNzIGNvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNjgiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBjYWNoZS5jbGVhcigpOyAvL2ZsdXNoIHRoZSBjYWNoZQotICAgICAgICAqLworICAgICAgICAgKiBpZiAoc3ViY2xhc3MgPT0gbnVsbCkgeyAvLyBhd3QuMDE9J3swfScgcGFyYW1ldGVyIGlzIG51bGwgdGhyb3cgbmV3CisgICAgICAgICAqIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4wMSIsICJzdWJjbGFzcyIpKTsKKyAgICAgICAgICogLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIH0gaWYgKCEKKyAgICAgICAgICogQVdUS2V5U3Ryb2tlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oc3ViY2xhc3MpKSB7IC8vIGF3dC42Nz1zdWJjbGFzcworICAgICAgICAgKiBpcyBub3QgZGVyaXZlZCBmcm9tIEFXVEtleVN0cm9rZSB0aHJvdyBuZXcKKyAgICAgICAgICogQ2xhc3NDYXN0RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjY3IikpOyAvLyROT04tTkxTLTEkIH0gdHJ5CisgICAgICAgICAqIHsgc3ViQ29uc3RydWN0b3IgPSBzdWJjbGFzcy5nZXREZWNsYXJlZENvbnN0cnVjdG9yKCk7CisgICAgICAgICAqIHN1YkNvbnN0cnVjdG9yLnNldEFjY2Vzc2libGUodHJ1ZSk7IH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICogdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7IH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7IC8vCisgICAgICAgICAqIGF3dC42OD1zdWJjbGFzcyBjb3VsZCBub3QgYmUgaW5zdGFudGlhdGVkIHRocm93IG5ldworICAgICAgICAgKiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNjgiKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICogfSBjYWNoZS5jbGVhcigpOyAvL2ZsdXNoIHRoZSBjYWNoZQorICAgICAgICAgKi8KICAgICB9CiAKICAgICAvKioKICAgICAgKiBQYXJzZXMgdGhlIG1vZGlmaWVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzdHJNb2QgdGhlIHN0ciBtb2QKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBsb25nCisgICAgICogQHBhcmFtIHN0ck1vZAorICAgICAqICAgICAgICAgICAgdGhlIHN0ciBtb2QuCisgICAgICogQHJldHVybiB0aGUgbG9uZy4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBsb25nIHBhcnNlTW9kaWZpZXIoU3RyaW5nIHN0ck1vZCkgewogICAgICAgICBsb25nIG1vZGlmaWVycyA9IDBsOwpAQCAtNjA5LDkgKzY0NCw5IEBACiAgICAgLyoqCiAgICAgICogUGFyc2VzIHRoZSB0eXBlZCBpZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RyVHlwZWQgdGhlIHN0ciB0eXBlZAotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgc3VjY2Vzc2Z1bAorICAgICAqIEBwYXJhbSBzdHJUeXBlZAorICAgICAqICAgICAgICAgICAgdGhlIHN0ciB0eXBlZC4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHN1Y2Nlc3NmdWwuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBwYXJzZVR5cGVkSUQoU3RyaW5nIHN0clR5cGVkKSB7CiAgICAgICAgIGlmIChzdHJUeXBlZC5lcXVhbHMoInR5cGVkIikpIHsgLy8kTk9OLU5MUy0xJApAQCAtNjI0LDkgKzY1OSw5IEBACiAgICAgLyoqCiAgICAgICogUGFyc2VzIHRoZSB0eXBlZCBrZXkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHN0ckNoYXIgdGhlIHN0ciBjaGFyCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY2hhcgorICAgICAqIEBwYXJhbSBzdHJDaGFyCisgICAgICogICAgICAgICAgICB0aGUgc3RyIGNoYXIuCisgICAgICogQHJldHVybiB0aGUgY2hhci4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBjaGFyIHBhcnNlVHlwZWRLZXkoU3RyaW5nIHN0ckNoYXIpIHsKICAgICAgICAgY2hhciBrZXlDaGFyID0gS2V5RXZlbnQuQ0hBUl9VTkRFRklORUQ7CkBAIC02NDIsOSArNjc3LDkgQEAKICAgICAvKioKICAgICAgKiBQYXJzZXMgdGhlIHByZXNzZWQgcmVsZWFzZWQgaWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHN0ciB0aGUgc3RyCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYm9vbGVhbgorICAgICAqIEBwYXJhbSBzdHIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHIuCisgICAgICogQHJldHVybiB0aGUgYm9vbGVhbi4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBCb29sZWFuIHBhcnNlUHJlc3NlZFJlbGVhc2VkSUQoU3RyaW5nIHN0cikgewogCkBAIC02NTksOSArNjk0LDkgQEAKICAgICAvKioKICAgICAgKiBQYXJzZXMgdGhlIGtleS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RyQ29kZSB0aGUgc3RyIGNvZGUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnQKKyAgICAgKiBAcGFyYW0gc3RyQ29kZQorICAgICAqICAgICAgICAgICAgdGhlIHN0ciBjb2RlLgorICAgICAqIEByZXR1cm4gdGhlIGludC4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBpbnQgcGFyc2VLZXkoU3RyaW5nIHN0ckNvZGUpIHsKICAgICAgICAgaW50IGtleUNvZGUgPSBLZXlFdmVudC5WS19VTkRFRklORUQ7CkBAIC02NzUsNCArNzEwLDMgQEAKICAgICAgICAgcmV0dXJuIGtleUNvZGU7CiAgICAgfQogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvQVdUUGVybWlzc2lvbi5qYXZhIGIvYXd0L2phdmEvYXd0L0FXVFBlcm1pc3Npb24uamF2YQppbmRleCAyNTMyNmFiLi40YmQ4MzU3IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvQVdUUGVybWlzc2lvbi5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9BV1RQZXJtaXNzaW9uLmphdmEKQEAgLTE4LDI0ICsxOCwzMSBAQAogICogQGF1dGhvciBQYXZlbCBEb2xnb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0OwogCiBpbXBvcnQgamF2YS5zZWN1cml0eS5CYXNpY1Blcm1pc3Npb247CiAKIC8qKgotICogVGhlIEFXVFBlcm1pc3Npb24gc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBwZXJtaXNzaW9uIGFuZCB0aGUgCi0gKiBjb3JyZXNwb25kaW5nIGFjdGlvbiBsaXN0LgorICogVGhlIEFXVFBlcm1pc3Npb24gc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBwZXJtaXNzaW9uIGFuZCB0aGUgY29ycmVzcG9uZGluZworICogYWN0aW9uIGxpc3QuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgQVdUUGVybWlzc2lvbiBleHRlbmRzIEJhc2ljUGVybWlzc2lvbiB7Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELiAqLworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODg5MDM5MjQwMjU4ODgxNDQ2NUw7CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQVdUUGVybWlzc2lvbiB3aXRoIGRlZmluZWQgbmFtZSBhbmQgYWN0aW9ucy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiBhIG5ldyBBV1RQZXJtaXNzaW9uLiAKLSAgICAgKiBAcGFyYW0gYWN0aW9ucyB0aGUgYWN0aW9ucyBvZiBhIG5ldyBBV1RQZXJtaXNzaW9uLgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiBhIG5ldyBBV1RQZXJtaXNzaW9uLgorICAgICAqIEBwYXJhbSBhY3Rpb25zCisgICAgICogICAgICAgICAgICB0aGUgYWN0aW9ucyBvZiBhIG5ldyBBV1RQZXJtaXNzaW9uLgogICAgICAqLwogICAgIHB1YmxpYyBBV1RQZXJtaXNzaW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgYWN0aW9ucykgewogICAgICAgICBzdXBlcihuYW1lLCBhY3Rpb25zKTsKQEAgLTQ0LDExICs1MSwxMSBAQAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBBV1QgcGVybWlzc2lvbiB3aXRoIHRoZSBkZWZpbmVkIG5hbWUuCiAgICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgYSBuZXcgQVdUUGVybWlzc2lvbi4gCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIGEgbmV3IEFXVFBlcm1pc3Npb24uCiAgICAgICovCiAgICAgcHVibGljIEFXVFBlcm1pc3Npb24oU3RyaW5nIG5hbWUpIHsKICAgICAgICAgc3VwZXIobmFtZSk7CiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9BY3RpdmVFdmVudC5qYXZhIGIvYXd0L2phdmEvYXd0L0FjdGl2ZUV2ZW50LmphdmEKaW5kZXggNDEzMzc1Mi4uNzA0NDYyMyAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L0FjdGl2ZUV2ZW50LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L0FjdGl2ZUV2ZW50LmphdmEKQEAgLTE4LDE4ICsxOCwyMSBAQAogICogQGF1dGhvciBNaWNoYWVsIERhbmlsb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0OwogCiAvKioKLSAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgZXZlbnRzIHRoYXQga25vdyBob3cgdG8gZGlzcGF0Y2ggdGhlbXNlbHZlcy4gCi0gKiBTdWNoIGV2ZW50IGNhbiBiZSBwbGFjZWQgdXBvbiB0aGUgZXZlbnQgcXVldWUgYW5kIGl0cyBkaXNwYXRjaCBtZXRob2QgCi0gKiB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBldmVudCBpcyBkaXNwYXRjaGVkLgorICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBldmVudHMgdGhhdCBrbm93IGhvdyB0byBkaXNwYXRjaCB0aGVtc2VsdmVzLiBTdWNoCisgKiBldmVudCBjYW4gYmUgcGxhY2VkIHVwb24gdGhlIGV2ZW50IHF1ZXVlIGFuZCBpdHMgZGlzcGF0Y2ggbWV0aG9kIHdpbGwgYmUKKyAqIGNhbGxlZCB3aGVuIHRoZSBldmVudCBpcyBkaXNwYXRjaGVkLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBBY3RpdmVFdmVudCB7CiAKICAgICAvKioKLSAgICAgKiBEaXNwYXRjaGVzIHRoZSBldmVudCB0byB0aGUgbGlzdGVuZXJzIG9mIHRoZSBldmVudCdzIHNvdXJjZSwgCi0gICAgICogb3IgZG9lcyB3aGF0ZXZlciBpdCBpcyB0aGlzIGV2ZW50IGlzIHN1cHBvc2VkIHRvIGRvLgorICAgICAqIERpc3BhdGNoZXMgdGhlIGV2ZW50IHRvIHRoZSBsaXN0ZW5lcnMgb2YgdGhlIGV2ZW50J3Mgc291cmNlLCBvciBkb2VzCisgICAgICogd2hhdGV2ZXIgaXQgaXMgdGhpcyBldmVudCBpcyBzdXBwb3NlZCB0byBkby4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaCgpOwogCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvQWRqdXN0YWJsZS5qYXZhIGIvYXd0L2phdmEvYXd0L0FkanVzdGFibGUuamF2YQppbmRleCAzMjQxY2FkLi5iYWY4MGY3IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvQWRqdXN0YWJsZS5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9BZGp1c3RhYmxlLmphdmEKQEAgLTE4LDMyICsxOCwzNSBAQAogICogQGF1dGhvciBQYXZlbCBEb2xnb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0OwogCiBpbXBvcnQgamF2YS5hd3QuZXZlbnQuQWRqdXN0bWVudExpc3RlbmVyOwogCiAvKioKLSAqIFRoZSBBZGp1c3RhYmxlIGludGVyZmFjZSByZXByZXNlbnRzIGFuIGFkanVzdGFibGUgbnVtZXJpYyB2YWx1ZSAKLSAqIGNvbnRhaW5lZCB3aXRoaW4gYSBib3VuZGVkIHJhbmdlIG9mIHZhbHVlcywgc3VjaCBhcyB0aGUgY3VycmVudCAKLSAqIGxvY2F0aW9uIGluIHNjcm9sbGFibGUgcmVnaW9uIG9yIHRoZSB2YWx1ZSBvZiBhIGdhdWdlLgorICogVGhlIEFkanVzdGFibGUgaW50ZXJmYWNlIHJlcHJlc2VudHMgYW4gYWRqdXN0YWJsZSBudW1lcmljIHZhbHVlIGNvbnRhaW5lZAorICogd2l0aGluIGEgYm91bmRlZCByYW5nZSBvZiB2YWx1ZXMsIHN1Y2ggYXMgdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gc2Nyb2xsYWJsZQorICogcmVnaW9uIG9yIHRoZSB2YWx1ZSBvZiBhIGdhdWdlLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBBZGp1c3RhYmxlIHsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgSE9SSVpPTlRBTCBpbmRpY2F0ZXMgdGhhdCB0aGUgQWRqdXN0YWJsZSdzIG9yaWVudGF0aW9uIAotICAgICAqIGlzIGhvcml6b250YWwuIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBIT1JJWk9OVEFMIGluZGljYXRlcyB0aGF0IHRoZSBBZGp1c3RhYmxlJ3Mgb3JpZW50YXRpb24gaXMKKyAgICAgKiBob3Jpem9udGFsLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhPUklaT05UQUwgPSAwOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBWRVJUSUNBTCBpbmRpY2F0ZXMgdGhhdCB0aGUgQWRqdXN0YWJsZSdzIG9yaWVudGF0aW9uIAotICAgICAqIGlzIHZlcnRpY2FsLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVkVSVElDQUwgaW5kaWNhdGVzIHRoYXQgdGhlIEFkanVzdGFibGUncyBvcmllbnRhdGlvbiBpcworICAgICAqIHZlcnRpY2FsLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlRJQ0FMID0gMTsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgTk9fT1JJRU5UQVRJT04gaW5kaWNhdGVzIHRoYXQgdGhlIEFkanVzdGFibGUgCi0gICAgICogaGFzIG5vIG9yaWVudGF0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBOT19PUklFTlRBVElPTiBpbmRpY2F0ZXMgdGhhdCB0aGUgQWRqdXN0YWJsZSBoYXMgbm8KKyAgICAgKiBvcmllbnRhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19PUklFTlRBVElPTiA9IDI7CiAKQEAgLTU3LDE0ICs2MCwxNiBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHZhbHVlIHRvIHRoZSBBZGp1c3RhYmxlIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYTAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgQWRqdXN0YWJsZSBvYmplY3QuIAorICAgICAqIEBwYXJhbSBhMAorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgQWRqdXN0YWJsZSBvYmplY3QuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoaW50IGEwKTsKIAogICAgIC8qKgogICAgICAqIEFkZHMgdGhlIEFkanVzdG1lbnRMaXN0ZW5lciB0byBjdXJyZW50IEFkanVzdG1lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGEwIHRoZSBBZGp1c3RtZW50TGlzdGVuZXIgb2JqZWN0LgorICAgICAqIEBwYXJhbSBhMAorICAgICAqICAgICAgICAgICAgdGhlIEFkanVzdG1lbnRMaXN0ZW5lciBvYmplY3QuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkQWRqdXN0bWVudExpc3RlbmVyKEFkanVzdG1lbnRMaXN0ZW5lciBhMCk7CiAKQEAgLTg1LDcgKzkwLDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHRoZSBBZGp1c3RhYmxlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1pbmltdW0gdmFsdWUgb2YgdGhlIEFkanVzdGFibGUuIAorICAgICAqIEByZXR1cm4gdGhlIG1pbmltdW0gdmFsdWUgb2YgdGhlIEFkanVzdGFibGUuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRNaW5pbXVtKCk7CiAKQEAgLTExMyw0NCArMTE4LDQ5IEBACiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyB0aGUgYWRqdXN0bWVudCBsaXN0ZW5lciBvZiB0aGUgQWRqdXN0YWJsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYTAgdGhlIHNwZWNpZmllZCBBZGp1c3RtZW50TGlzdGVuZXIgdG8gYmUgcmVtb3ZlZC4KKyAgICAgKiBAcGFyYW0gYTAKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgQWRqdXN0bWVudExpc3RlbmVyIHRvIGJlIHJlbW92ZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVtb3ZlQWRqdXN0bWVudExpc3RlbmVyKEFkanVzdG1lbnRMaXN0ZW5lciBhMCk7CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBibG9jayBpbmNyZW1lbnQgZm9yIHRoZSBBZGp1c3RhYmxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBhMCB0aGUgbmV3IGJsb2NrIGluY3JlbWVudC4KKyAgICAgKiBAcGFyYW0gYTAKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgYmxvY2sgaW5jcmVtZW50LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEJsb2NrSW5jcmVtZW50KGludCBhMCk7CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSBBZGp1c3RhYmxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBhMCB0aGUgbmV3IG1heGltdW0gb2YgdGhlIEFkanVzdGFibGUuCisgICAgICogQHBhcmFtIGEwCisgICAgICogICAgICAgICAgICB0aGUgbmV3IG1heGltdW0gb2YgdGhlIEFkanVzdGFibGUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TWF4aW11bShpbnQgYTApOwogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgbWluaW11bSB2YWx1ZSBvZiB0aGUgQWRqdXN0YWJsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYTAgdGhlIG5ldyBtaW5pbXVtIG9mIHRoZSBBZGp1c3RhYmxlLgorICAgICAqIEBwYXJhbSBhMAorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBtaW5pbXVtIG9mIHRoZSBBZGp1c3RhYmxlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldE1pbmltdW0oaW50IGEwKTsKIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHVuaXQgaW5jcmVtZW50IG9mIHRoZSBBZGp1c3RhYmxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBhMCB0aGUgbmV3IHVuaXQgaW5jcmVtZW50IG9mIHRoZSBBZGp1c3RhYmxlLgorICAgICAqIEBwYXJhbSBhMAorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB1bml0IGluY3JlbWVudCBvZiB0aGUgQWRqdXN0YWJsZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRVbml0SW5jcmVtZW50KGludCBhMCk7CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSB2aXNpYmxlIGFtb3VudCBvZiB0aGUgQWRqdXN0YWJsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYTAgdGhlIG5ldyB2aXNpYmxlIGFtb3VudCBvZiB0aGUgQWRqdXN0YWJsZS4KKyAgICAgKiBAcGFyYW0gYTAKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmlzaWJsZSBhbW91bnQgb2YgdGhlIEFkanVzdGFibGUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VmlzaWJsZUFtb3VudChpbnQgYTApOwogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9BbHBoYUNvbXBvc2l0ZS5qYXZhIGIvYXd0L2phdmEvYXd0L0FscGhhQ29tcG9zaXRlLmphdmEKaW5kZXggZDI2NzUzYy4uODM4OWViNCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L0FscGhhQ29tcG9zaXRlLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L0FscGhhQ29tcG9zaXRlLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgSWdvciBWLiBTdG9seWFyb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0OwogCiBpbXBvcnQgamF2YS5hd3QuQ29tcG9zaXRlOwpAQCAtMjgsMTQ4ICsyOSwxODEgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmdsLklDb21wb3NpdGVDb250ZXh0OwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCi0KIC8qKgotICogVGhlIEFscGhhQ29tcG9zaXRlIGNsYXNzIGRlZmluZXMgYSBiYXNpYyBhbHBoYSBjb21wb3NpdGluZyBydWxlcyBmb3IgCi0gKiBjb21iaW5pbmcgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBjb2xvcnMgdG8gYWNoaWV2ZSBibGVuZGluZyBhbmQgCi0gKiB0cmFuc3BhcmVuY3kgZWZmZWN0cyB3aXRoIGdyYXBoaWNzIGFuZCBpbWFnZXMuCisgKiBUaGUgQWxwaGFDb21wb3NpdGUgY2xhc3MgZGVmaW5lcyBhIGJhc2ljIGFscGhhIGNvbXBvc2l0aW5nIHJ1bGVzIGZvcgorICogY29tYmluaW5nIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gY29sb3JzIHRvIGFjaGlldmUgYmxlbmRpbmcgYW5kIHRyYW5zcGFyZW5jeQorICogZWZmZWN0cyB3aXRoIGdyYXBoaWNzIGFuZCBpbWFnZXMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgQWxwaGFDb21wb3NpdGUgaW1wbGVtZW50cyBDb21wb3NpdGUgewogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBDTEVBUiBpbmRpY2F0ZXMgdGhhdCBib3RoIHRoZSBjb2xvciBhbmQgdGhlIGFscGhhIG9mIAotICAgICAqIHRoZSBkZXN0aW5hdGlvbiBhcmUgY2xlYXJlZCAoUG9ydGVyLUR1ZmYgQ2xlYXIgcnVsZSkuCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IENMRUFSIGluZGljYXRlcyB0aGF0IGJvdGggdGhlIGNvbG9yIGFuZCB0aGUgYWxwaGEgb2YgdGhlCisgICAgICogZGVzdGluYXRpb24gYXJlIGNsZWFyZWQgKFBvcnRlci1EdWZmIENsZWFyIHJ1bGUpLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMRUFSID0gMTsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgU1JDIGluZGljYXRlcyB0aGF0IHRoZSBzb3VyY2UgaXMgY29waWVkIHRvIHRoZSBkZXN0aW5hdGlvbiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgU1JDIGluZGljYXRlcyB0aGF0IHRoZSBzb3VyY2UgaXMgY29waWVkIHRvIHRoZSBkZXN0aW5hdGlvbgogICAgICAqIChQb3J0ZXItRHVmZiBTb3VyY2UgcnVsZSkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1JDID0gMjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgRFNUIGluZGljYXRlcyB0aGF0IHRoZSBkZXN0aW5hdGlvbiBpcyBsZWZ0IHVudG91Y2hlZCAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgRFNUIGluZGljYXRlcyB0aGF0IHRoZSBkZXN0aW5hdGlvbiBpcyBsZWZ0IHVudG91Y2hlZAogICAgICAqIChQb3J0ZXItRHVmZiBEZXN0aW5hdGlvbiBydWxlKS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEU1QgPSA5OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBTUkNfT1ZFUiBpbmRpY2F0ZXMgdGhhdCB0aGUgc291cmNlIGlzIGNvbXBvc2l0ZWQgb3ZlciAKLSAgICAgKiB0aGUgZGVzdGluYXRpb24gKFBvcnRlci1EdWZmIFNvdXJjZSBPdmVyIERlc3RpbmF0aW9uIHJ1bGUpLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBTUkNfT1ZFUiBpbmRpY2F0ZXMgdGhhdCB0aGUgc291cmNlIGlzIGNvbXBvc2l0ZWQgb3ZlciB0aGUKKyAgICAgKiBkZXN0aW5hdGlvbiAoUG9ydGVyLUR1ZmYgU291cmNlIE92ZXIgRGVzdGluYXRpb24gcnVsZSkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1JDX09WRVIgPSAzOwogCiAgICAgLyoqCi0gICAgICogVGhlIENvbnN0YW50IERTVF9PVkVSIGluZGljYXRlcyB0aGF0IFRoZSBkZXN0aW5hdGlvbiBpcyBjb21wb3NpdGVkIG92ZXIgCi0gICAgICogdGhlIHNvdXJjZSBhbmQgdGhlIHJlc3VsdCByZXBsYWNlcyB0aGUgZGVzdGluYXRpb24gCi0gICAgICogKFBvcnRlci1EdWZmIERlc3RpbmF0aW9uIE92ZXIgU291cmNlIHJ1bGUpLgorICAgICAqIFRoZSBDb25zdGFudCBEU1RfT1ZFUiBpbmRpY2F0ZXMgdGhhdCBUaGUgZGVzdGluYXRpb24gaXMgY29tcG9zaXRlZCBvdmVyCisgICAgICogdGhlIHNvdXJjZSBhbmQgdGhlIHJlc3VsdCByZXBsYWNlcyB0aGUgZGVzdGluYXRpb24gKFBvcnRlci1EdWZmCisgICAgICogRGVzdGluYXRpb24gT3ZlciBTb3VyY2UgcnVsZSkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFNUX09WRVIgPSA0OwogCiAgICAgLyoqCi0gICAgICogVGhlIENvbnN0YW50IFNSQ19JTiBpbmRpY2F0ZXMgdGhhdCB0aGUgcGFydCBvZiB0aGUgc291cmNlIGx5aW5nIAotICAgICAqIGluc2lkZSBvZiB0aGUgZGVzdGluYXRpb24gcmVwbGFjZXMgdGhlIGRlc3RpbmF0aW9uIChQb3J0ZXItRHVmZiAKLSAgICAgKiBTb3VyY2UgSW4gRGVzdGluYXRpb24gcnVsZSkuCisgICAgICogVGhlIENvbnN0YW50IFNSQ19JTiBpbmRpY2F0ZXMgdGhhdCB0aGUgcGFydCBvZiB0aGUgc291cmNlIGx5aW5nIGluc2lkZSBvZgorICAgICAqIHRoZSBkZXN0aW5hdGlvbiByZXBsYWNlcyB0aGUgZGVzdGluYXRpb24gKFBvcnRlci1EdWZmIFNvdXJjZSBJbgorICAgICAqIERlc3RpbmF0aW9uIHJ1bGUpLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNSQ19JTiA9IDU7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IERTVF9JTiBpbmRpY2F0ZXMgdGhhdCB0aGUgcGFydCBvZiB0aGUgZGVzdGluYXRpb24gCi0gICAgICogbHlpbmcgaW5zaWRlIG9mIHRoZSBzb3VyY2UgcmVwbGFjZXMgdGhlIGRlc3RpbmF0aW9uIAotICAgICAqIChQb3J0ZXItRHVmZiBEZXN0aW5hdGlvbiBJbiBTb3VyY2UgcnVsZSkuCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IERTVF9JTiBpbmRpY2F0ZXMgdGhhdCB0aGUgcGFydCBvZiB0aGUgZGVzdGluYXRpb24gbHlpbmcKKyAgICAgKiBpbnNpZGUgb2YgdGhlIHNvdXJjZSByZXBsYWNlcyB0aGUgZGVzdGluYXRpb24gKFBvcnRlci1EdWZmIERlc3RpbmF0aW9uIEluCisgICAgICogU291cmNlIHJ1bGUpLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERTVF9JTiA9IDY7CiAKICAgICAvKioKLSAgICAgKiBUaGUgQ29uc3RhbnQgU1JDX09VVCBpbmRpY2F0ZXMgdGhhdCB0aGUgcGFydCBvZiB0aGUgc291cmNlIGx5aW5nIAotICAgICAqIG91dHNpZGUgb2YgdGhlIGRlc3RpbmF0aW9uIHJlcGxhY2VzIHRoZSBkZXN0aW5hdGlvbiAoUG9ydGVyLUR1ZmYgCi0gICAgICogU291cmNlIEhlbGQgT3V0IEJ5IERlc3RpbmF0aW9uIHJ1bGUpLgorICAgICAqIFRoZSBDb25zdGFudCBTUkNfT1VUIGluZGljYXRlcyB0aGF0IHRoZSBwYXJ0IG9mIHRoZSBzb3VyY2UgbHlpbmcgb3V0c2lkZQorICAgICAqIG9mIHRoZSBkZXN0aW5hdGlvbiByZXBsYWNlcyB0aGUgZGVzdGluYXRpb24gKFBvcnRlci1EdWZmIFNvdXJjZSBIZWxkIE91dAorICAgICAqIEJ5IERlc3RpbmF0aW9uIHJ1bGUpLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNSQ19PVVQgPSA3OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBEU1RfT1VUIGluZGljYXRlcyB0aGF0IHRoZSBwYXJ0IG9mIHRoZSBkZXN0aW5hdGlvbiAKLSAgICAgKiBseWluZyBvdXRzaWRlIG9mIHRoZSBzb3VyY2UgcmVwbGFjZXMgdGhlIGRlc3RpbmF0aW9uIChQb3J0ZXItRHVmZiAKLSAgICAgKiBEZXN0aW5hdGlvbiBIZWxkIE91dCBCeSBTb3VyY2UgcnVsZSkuCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IERTVF9PVVQgaW5kaWNhdGVzIHRoYXQgdGhlIHBhcnQgb2YgdGhlIGRlc3RpbmF0aW9uIGx5aW5nCisgICAgICogb3V0c2lkZSBvZiB0aGUgc291cmNlIHJlcGxhY2VzIHRoZSBkZXN0aW5hdGlvbiAoUG9ydGVyLUR1ZmYgRGVzdGluYXRpb24KKyAgICAgKiBIZWxkIE91dCBCeSBTb3VyY2UgcnVsZSkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFNUX09VVCA9IDg7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFNSQ19BVE9QIGluZGljYXRlcyB0aGF0IHRoZSBwYXJ0IG9mIHRoZSBzb3VyY2UgbHlpbmcgCi0gICAgICogaW5zaWRlIG9mIHRoZSBkZXN0aW5hdGlvbiBpcyBjb21wb3NpdGVkIG9udG8gdGhlIGRlc3RpbmF0aW9uIAotICAgICAqIChQb3J0ZXItRHVmZiBTb3VyY2UgQXRvcCBEZXN0aW5hdGlvbiBydWxlKS4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgU1JDX0FUT1AgaW5kaWNhdGVzIHRoYXQgdGhlIHBhcnQgb2YgdGhlIHNvdXJjZSBseWluZyBpbnNpZGUKKyAgICAgKiBvZiB0aGUgZGVzdGluYXRpb24gaXMgY29tcG9zaXRlZCBvbnRvIHRoZSBkZXN0aW5hdGlvbiAoUG9ydGVyLUR1ZmYgU291cmNlCisgICAgICogQXRvcCBEZXN0aW5hdGlvbiBydWxlKS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUkNfQVRPUCA9IDEwOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBEU1RfQVRPUCBpbmRpY2F0ZXMgdGhhdCB0aGUgcGFydCBvZiB0aGUgZGVzdGluYXRpb24gCi0gICAgICogbHlpbmcgaW5zaWRlIG9mIHRoZSBzb3VyY2UgaXMgY29tcG9zaXRlZCBvdmVyIHRoZSBzb3VyY2UgYW5kIHJlcGxhY2VzIAotICAgICAqIHRoZSBkZXN0aW5hdGlvbiAoUG9ydGVyLUR1ZmYgRGVzdGluYXRpb24gQXRvcCBTb3VyY2UgcnVsZSkuCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IERTVF9BVE9QIGluZGljYXRlcyB0aGF0IHRoZSBwYXJ0IG9mIHRoZSBkZXN0aW5hdGlvbiBseWluZworICAgICAqIGluc2lkZSBvZiB0aGUgc291cmNlIGlzIGNvbXBvc2l0ZWQgb3ZlciB0aGUgc291cmNlIGFuZCByZXBsYWNlcyB0aGUKKyAgICAgKiBkZXN0aW5hdGlvbiAoUG9ydGVyLUR1ZmYgRGVzdGluYXRpb24gQXRvcCBTb3VyY2UgcnVsZSkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFNUX0FUT1AgPSAxMTsKIAogICAgIC8qKgotICAgICAqIFRoZSBDb25zdGFudCBYT1IgaW5kaWNhdGVzIHRoYXQgdGhlIHBhcnQgb2YgdGhlIHNvdXJjZSB0aGF0IGxpZXMgCi0gICAgICogb3V0c2lkZSBvZiB0aGUgZGVzdGluYXRpb24gaXMgY29tYmluZWQgd2l0aCB0aGUgcGFydCBvZiB0aGUgZGVzdGluYXRpb24gCi0gICAgICogdGhhdCBsaWVzIG91dHNpZGUgb2YgdGhlIHNvdXJjZSAoUG9ydGVyLUR1ZmYgU291cmNlIFhvciBEZXN0aW5hdGlvbiBydWxlKS4KKyAgICAgKiBUaGUgQ29uc3RhbnQgWE9SIGluZGljYXRlcyB0aGF0IHRoZSBwYXJ0IG9mIHRoZSBzb3VyY2UgdGhhdCBsaWVzIG91dHNpZGUKKyAgICAgKiBvZiB0aGUgZGVzdGluYXRpb24gaXMgY29tYmluZWQgd2l0aCB0aGUgcGFydCBvZiB0aGUgZGVzdGluYXRpb24gdGhhdCBsaWVzCisgICAgICogb3V0c2lkZSBvZiB0aGUgc291cmNlIChQb3J0ZXItRHVmZiBTb3VyY2UgWG9yIERlc3RpbmF0aW9uIHJ1bGUpLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhPUiA9IDEyOwogCi0gICAgLyoqIEFscGhhQ29tcG9zaXRlIG9iamVjdCB3aXRoIHRoZSBvcGFxdWUgQ0xFQVIgcnVsZSBhbmQgYW4gYWxwaGEgb2YgMS4wZi4gKi8KKyAgICAvKioKKyAgICAgKiBBbHBoYUNvbXBvc2l0ZSBvYmplY3Qgd2l0aCB0aGUgb3BhcXVlIENMRUFSIHJ1bGUgYW5kIGFuIGFscGhhIG9mIDEuMGYuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBbHBoYUNvbXBvc2l0ZSBDbGVhciA9IG5ldyBBbHBoYUNvbXBvc2l0ZShDTEVBUik7CiAKLSAgICAvKiogQWxwaGFDb21wb3NpdGUgb2JqZWN0IHdpdGggdGhlIG9wYXF1ZSBTUkMgcnVsZSBhbmQgYW4gYWxwaGEgb2YgMS4wZi4gKi8KKyAgICAvKioKKyAgICAgKiBBbHBoYUNvbXBvc2l0ZSBvYmplY3Qgd2l0aCB0aGUgb3BhcXVlIFNSQyBydWxlIGFuZCBhbiBhbHBoYSBvZiAxLjBmLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQWxwaGFDb21wb3NpdGUgU3JjID0gbmV3IEFscGhhQ29tcG9zaXRlKFNSQyk7CiAKLSAgICAvKiogQWxwaGFDb21wb3NpdGUgb2JqZWN0IHdpdGggdGhlIG9wYXF1ZSBEU1QgcnVsZSBhbmQgYW4gYWxwaGEgb2YgMS4wZi4gKi8KKyAgICAvKioKKyAgICAgKiBBbHBoYUNvbXBvc2l0ZSBvYmplY3Qgd2l0aCB0aGUgb3BhcXVlIERTVCBydWxlIGFuZCBhbiBhbHBoYSBvZiAxLjBmLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQWxwaGFDb21wb3NpdGUgRHN0ID0gbmV3IEFscGhhQ29tcG9zaXRlKERTVCk7CiAKLSAgICAvKiogQWxwaGFDb21wb3NpdGUgb2JqZWN0IHdpdGggdGhlIG9wYXF1ZSBTUkNfT1ZFUiBydWxlIGFuZCBhbiBhbHBoYSBvZiAxLjBmLiAqLworICAgIC8qKgorICAgICAqIEFscGhhQ29tcG9zaXRlIG9iamVjdCB3aXRoIHRoZSBvcGFxdWUgU1JDX09WRVIgcnVsZSBhbmQgYW4gYWxwaGEgb2YgMS4wZi4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFscGhhQ29tcG9zaXRlIFNyY092ZXIgPSBuZXcgQWxwaGFDb21wb3NpdGUoU1JDX09WRVIpOwogCi0gICAgLyoqIEFscGhhQ29tcG9zaXRlIG9iamVjdCB3aXRoIHRoZSBvcGFxdWUgRFNUX09WRVIgcnVsZSBhbmQgYW4gYWxwaGEgb2YgMS4wZi4gKi8KKyAgICAvKioKKyAgICAgKiBBbHBoYUNvbXBvc2l0ZSBvYmplY3Qgd2l0aCB0aGUgb3BhcXVlIERTVF9PVkVSIHJ1bGUgYW5kIGFuIGFscGhhIG9mIDEuMGYuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBbHBoYUNvbXBvc2l0ZSBEc3RPdmVyID0gbmV3IEFscGhhQ29tcG9zaXRlKERTVF9PVkVSKTsKIAotICAgIC8qKiBBbHBoYUNvbXBvc2l0ZSBvYmplY3Qgd2l0aCB0aGUgb3BhcXVlIFNSQ19JTiBydWxlIGFuZCBhbiBhbHBoYSBvZiAxLjBmLiAqLworICAgIC8qKgorICAgICAqIEFscGhhQ29tcG9zaXRlIG9iamVjdCB3aXRoIHRoZSBvcGFxdWUgU1JDX0lOIHJ1bGUgYW5kIGFuIGFscGhhIG9mIDEuMGYuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBbHBoYUNvbXBvc2l0ZSBTcmNJbiA9IG5ldyBBbHBoYUNvbXBvc2l0ZShTUkNfSU4pOwogCi0gICAgLyoqIEFscGhhQ29tcG9zaXRlIG9iamVjdCB3aXRoIHRoZSBvcGFxdWUgRFNUX0lOIHJ1bGUgYW5kIGFuIGFscGhhIG9mIDEuMGYuICovCisgICAgLyoqCisgICAgICogQWxwaGFDb21wb3NpdGUgb2JqZWN0IHdpdGggdGhlIG9wYXF1ZSBEU1RfSU4gcnVsZSBhbmQgYW4gYWxwaGEgb2YgMS4wZi4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFscGhhQ29tcG9zaXRlIERzdEluID0gbmV3IEFscGhhQ29tcG9zaXRlKERTVF9JTik7CiAKLSAgICAvKiogQWxwaGFDb21wb3NpdGUgb2JqZWN0IHdpdGggdGhlIG9wYXF1ZSBTUkNfT1VUIHJ1bGUgYW5kIGFuIGFscGhhIG9mIDEuMGYuICovCisgICAgLyoqCisgICAgICogQWxwaGFDb21wb3NpdGUgb2JqZWN0IHdpdGggdGhlIG9wYXF1ZSBTUkNfT1VUIHJ1bGUgYW5kIGFuIGFscGhhIG9mIDEuMGYuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBbHBoYUNvbXBvc2l0ZSBTcmNPdXQgPSBuZXcgQWxwaGFDb21wb3NpdGUoU1JDX09VVCk7CiAKLSAgICAvKiogQWxwaGFDb21wb3NpdGUgb2JqZWN0IHdpdGggdGhlIG9wYXF1ZSBEU1RfT1VUIHJ1bGUgYW5kIGFuIGFscGhhIG9mIDEuMGYuICovCisgICAgLyoqCisgICAgICogQWxwaGFDb21wb3NpdGUgb2JqZWN0IHdpdGggdGhlIG9wYXF1ZSBEU1RfT1VUIHJ1bGUgYW5kIGFuIGFscGhhIG9mIDEuMGYuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBbHBoYUNvbXBvc2l0ZSBEc3RPdXQgPSBuZXcgQWxwaGFDb21wb3NpdGUoRFNUX09VVCk7CiAKLSAgICAvKiogQWxwaGFDb21wb3NpdGUgb2JqZWN0IHdpdGggdGhlIG9wYXF1ZSBTUkNfQVRPUCBydWxlIGFuZCBhbiBhbHBoYSBvZiAxLjBmLiAqLworICAgIC8qKgorICAgICAqIEFscGhhQ29tcG9zaXRlIG9iamVjdCB3aXRoIHRoZSBvcGFxdWUgU1JDX0FUT1AgcnVsZSBhbmQgYW4gYWxwaGEgb2YgMS4wZi4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFscGhhQ29tcG9zaXRlIFNyY0F0b3AgPSBuZXcgQWxwaGFDb21wb3NpdGUoU1JDX0FUT1ApOwogCi0gICAgLyoqIEFscGhhQ29tcG9zaXRlIG9iamVjdCB3aXRoIHRoZSBvcGFxdWUgRFNUX0FUT1AgcnVsZSBhbmQgYW4gYWxwaGEgb2YgMS4wZi4gKi8KKyAgICAvKioKKyAgICAgKiBBbHBoYUNvbXBvc2l0ZSBvYmplY3Qgd2l0aCB0aGUgb3BhcXVlIERTVF9BVE9QIHJ1bGUgYW5kIGFuIGFscGhhIG9mIDEuMGYuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBbHBoYUNvbXBvc2l0ZSBEc3RBdG9wID0gbmV3IEFscGhhQ29tcG9zaXRlKERTVF9BVE9QKTsKIAotICAgIC8qKiBBbHBoYUNvbXBvc2l0ZSBvYmplY3Qgd2l0aCB0aGUgb3BhcXVlIFhPUiBydWxlIGFuZCBhbiBhbHBoYSBvZiAxLjBmLiAqLworICAgIC8qKgorICAgICAqIEFscGhhQ29tcG9zaXRlIG9iamVjdCB3aXRoIHRoZSBvcGFxdWUgWE9SIHJ1bGUgYW5kIGFuIGFscGhhIG9mIDEuMGYuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBbHBoYUNvbXBvc2l0ZSBYb3IgPSBuZXcgQWxwaGFDb21wb3NpdGUoWE9SKTsKIAotICAgIC8qKiBUaGUgcnVsZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgcnVsZS4KKyAgICAgKi8KICAgICBwcml2YXRlIGludCBydWxlOwotICAgIAotICAgIC8qKiBUaGUgYWxwaGEuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgYWxwaGEuCisgICAgICovCiAgICAgcHJpdmF0ZSBmbG9hdCBhbHBoYTsKIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBhbHBoYSBjb21wb3NpdGUuCi0gICAgICogQ3JlYXRlcyBhIGNvbnRleHQgZm9yIHRoZSBjb21wb3NpdGluZyBvcGVyYXRpb24uIFRoZSBjb250ZXh0IGNvbnRhaW5zIHN0YXRlIHRoYXQgaXMgdXNlZCBpbiBwZXJmb3JtaW5nIHRoZSBjb21wb3NpdGluZyBvcGVyYXRpb24uCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGFscGhhIGNvbXBvc2l0ZS4gQ3JlYXRlcyBhIGNvbnRleHQgZm9yIHRoZSBjb21wb3NpdGluZworICAgICAqIG9wZXJhdGlvbi4gVGhlIGNvbnRleHQgY29udGFpbnMgc3RhdGUgdGhhdCBpcyB1c2VkIGluIHBlcmZvcm1pbmcgdGhlCisgICAgICogY29tcG9zaXRpbmcgb3BlcmF0aW9uLgogICAgICAqIAotICAgICAqIEBwYXJhbSBydWxlIHRoZSBydWxlCi0gICAgICogQHBhcmFtIGFscGhhIHRoZSBhbHBoYQorICAgICAqIEBwYXJhbSBydWxlCisgICAgICogICAgICAgICAgICB0aGUgcnVsZS4KKyAgICAgKiBAcGFyYW0gYWxwaGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbHBoYS4KICAgICAgKi8KLSAgICBwcml2YXRlIEFscGhhQ29tcG9zaXRlKGludCBydWxlLCBmbG9hdCBhbHBoYSl7Ci0gICAgICAgIGlmKHJ1bGUgPCBDTEVBUiB8fCBydWxlID4gWE9SKSB7CisgICAgcHJpdmF0ZSBBbHBoYUNvbXBvc2l0ZShpbnQgcnVsZSwgZmxvYXQgYWxwaGEpIHsKKyAgICAgICAgaWYgKHJ1bGUgPCBDTEVBUiB8fCBydWxlID4gWE9SKSB7CiAgICAgICAgICAgICAvLyBhd3QuMTFEPVVua25vd24gcnVsZQogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4xMUQiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQotICAgICAgICBpZihhbHBoYSA8IDAuMGYgfHwgYWxwaGEgPiAxLjBmKSB7CisgICAgICAgIGlmIChhbHBoYSA8IDAuMGYgfHwgYWxwaGEgPiAxLjBmKSB7CiAgICAgICAgICAgICAvLyBhd3QuMTFFPVdyb25nIGFscGhhIHZhbHVlCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjExRSIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CkBAIC0xODEsNDEgKzIxNSw0NCBAQAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBhbHBoYSBjb21wb3NpdGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHJ1bGUgdGhlIHJ1bGUKKyAgICAgKiBAcGFyYW0gcnVsZQorICAgICAqICAgICAgICAgICAgdGhlIHJ1bGUuCiAgICAgICovCi0gICAgcHJpdmF0ZSBBbHBoYUNvbXBvc2l0ZShpbnQgcnVsZSl7CisgICAgcHJpdmF0ZSBBbHBoYUNvbXBvc2l0ZShpbnQgcnVsZSkgewogICAgICAgICB0aGlzKHJ1bGUsIDEuMGYpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgYSBDb21wb3NpdGVDb250ZXh0IG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIENvbG9yTW9kZWwsCi0gICAgICogZGVzdGluYXRpb24gQ29sb3JNb2RlbCBhbmQgUmVuZGVyaW5nSGludHMgcGFyYW1ldGVycyBmb3IgYSBjb21wb3NpbmcgCisgICAgICogZGVzdGluYXRpb24gQ29sb3JNb2RlbCBhbmQgUmVuZGVyaW5nSGludHMgcGFyYW1ldGVycyBmb3IgYSBjb21wb3NpbmcKICAgICAgKiBvcGVyYXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIHNyY0NvbG9yTW9kZWwgdGhlIHNvdXJjZSdzIENvbG9yTW9kZWwuCi0gICAgICogQHBhcmFtIGRzdENvbG9yTW9kZWwgdGhlIGRlc3RpbmF0aW9uJ3MgQ29sb3JNb2RlbC4KLSAgICAgKiBAcGFyYW0gaGludHMgdGhlIFJlbmRlcmluZ0hpbnRzIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBDb21wb3NpdGVDb250ZXh0IG9iamVjdC4gICAgCi0gICAgICogCi0gICAgICogQHNlZSBqYXZhLmF3dC5Db21wb3NpdGUjY3JlYXRlQ29udGV4dChqYXZhLmF3dC5pbWFnZS5Db2xvck1vZGVsLCBqYXZhLmF3dC5pbWFnZS5Db2xvck1vZGVsLCBqYXZhLmF3dC5SZW5kZXJpbmdIaW50cykKKyAgICAgKiBAcGFyYW0gc3JjQ29sb3JNb2RlbAorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSdzIENvbG9yTW9kZWwuCisgICAgICogQHBhcmFtIGRzdENvbG9yTW9kZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbidzIENvbG9yTW9kZWwuCisgICAgICogQHBhcmFtIGhpbnRzCisgICAgICogICAgICAgICAgICB0aGUgUmVuZGVyaW5nSGludHMgb2JqZWN0LgorICAgICAqIEByZXR1cm4gdGhlIENvbXBvc2l0ZUNvbnRleHQgb2JqZWN0LgorICAgICAqIEBzZWUgamF2YS5hd3QuQ29tcG9zaXRlI2NyZWF0ZUNvbnRleHQoamF2YS5hd3QuaW1hZ2UuQ29sb3JNb2RlbCwKKyAgICAgKiAgICAgIGphdmEuYXd0LmltYWdlLkNvbG9yTW9kZWwsIGphdmEuYXd0LlJlbmRlcmluZ0hpbnRzKQogICAgICAqLwotICAgIHB1YmxpYyBDb21wb3NpdGVDb250ZXh0IGNyZWF0ZUNvbnRleHQoQ29sb3JNb2RlbCBzcmNDb2xvck1vZGVsLAotICAgICAgICAgICAgQ29sb3JNb2RlbCBkc3RDb2xvck1vZGVsLCBSZW5kZXJpbmdIaW50cyBoaW50cykgeworICAgIHB1YmxpYyBDb21wb3NpdGVDb250ZXh0IGNyZWF0ZUNvbnRleHQoQ29sb3JNb2RlbCBzcmNDb2xvck1vZGVsLCBDb2xvck1vZGVsIGRzdENvbG9yTW9kZWwsCisgICAgICAgICAgICBSZW5kZXJpbmdIaW50cyBoaW50cykgewogICAgICAgICByZXR1cm4gbmV3IElDb21wb3NpdGVDb250ZXh0KHRoaXMsIHNyY0NvbG9yTW9kZWwsIGRzdENvbG9yTW9kZWwpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIENvbXBhcmVzIHRoZSBBbHBoYUNvbXBvc2l0ZSBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqIHRoZSBPYmplY3QgdG8gYmUgY29tcGFyZWQuCi0gICAgICogCisgICAgICogQHBhcmFtIG9iagorICAgICAqICAgICAgICAgICAgdGhlIE9iamVjdCB0byBiZSBjb21wYXJlZC4KICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBBbHBoYUNvbXBvc2l0ZSBvYmplY3QgaXMgZXF1YWwgdG8gdGhlIHNwZWNpZmllZAotICAgICAqIG9iamVjdC4KKyAgICAgKiAgICAgICAgIG9iamVjdC4KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZighKG9iaiBpbnN0YW5jZW9mIEFscGhhQ29tcG9zaXRlKSkgeworICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBBbHBoYUNvbXBvc2l0ZSkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBBbHBoYUNvbXBvc2l0ZSBvdGhlciA9IChBbHBoYUNvbXBvc2l0ZSlvYmo7CkBAIC0yNDcsMTEgKzI4NCwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGFscGhhIHZhbHVlIG9mIHRoaXMgQWxwaGFDb21wb3NpdGUgb2JqZWN0OyByZXR1cm5zIDEuMCBpZiAKLSAgICAgKiB0aGlzIEFscGhhQ29tcG9zaXRlIG9iamVjdCBkb2Vzbid0IGhhdmUgYWxwaGEgdmFsdWUuCisgICAgICogR2V0cyB0aGUgYWxwaGEgdmFsdWUgb2YgdGhpcyBBbHBoYUNvbXBvc2l0ZSBvYmplY3Q7IHJldHVybnMgMS4wIGlmIHRoaXMKKyAgICAgKiBBbHBoYUNvbXBvc2l0ZSBvYmplY3QgZG9lc24ndCBoYXZlIGFscGhhIHZhbHVlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGFscGhhIHZhbHVlIG9mIHRoaXMgQWxwaGFDb21wb3NpdGUgb2JqZWN0IG9yIDEuMCBpZiAKLSAgICAgKiB0aGlzIEFscGhhQ29tcG9zaXRlIG9iamVjdCBkb2Vzbid0IGhhdmUgYWxwaGEgdmFsdWUuCisgICAgICogQHJldHVybiB0aGUgYWxwaGEgdmFsdWUgb2YgdGhpcyBBbHBoYUNvbXBvc2l0ZSBvYmplY3Qgb3IgMS4wIGlmIHRoaXMKKyAgICAgKiAgICAgICAgIEFscGhhQ29tcG9zaXRlIG9iamVjdCBkb2Vzbid0IGhhdmUgYWxwaGEgdmFsdWUuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldEFscGhhKCkgewogICAgICAgICByZXR1cm4gYWxwaGE7CkBAIC0yNjAsMTMgKzI5NywxNCBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIEFscGhhQ29tcG9zaXRlIGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCBydWxlIGFuZCBhbHBoYSB2YWx1ZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcnVsZSB0aGUgY29tcG9zaXRpbmcgcnVsZS4KLSAgICAgKiBAcGFyYW0gYWxwaGEgdGhlIGFscGhhIHZhbHVlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gQWxwaGFDb21wb3NpdGUgaW5zdGFuY2UuCisgICAgICogQHBhcmFtIHJ1bGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb21wb3NpdGluZyBydWxlLgorICAgICAqIEBwYXJhbSBhbHBoYQorICAgICAqICAgICAgICAgICAgdGhlIGFscGhhIHZhbHVlLgorICAgICAqIEByZXR1cm4gdGhlIEFscGhhQ29tcG9zaXRlIGluc3RhbmNlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQWxwaGFDb21wb3NpdGUgZ2V0SW5zdGFuY2UoaW50IHJ1bGUsIGZsb2F0IGFscGhhKSB7Ci0gICAgICAgIGlmKGFscGhhID09IDEuMGYpIHsKKyAgICAgICAgaWYgKGFscGhhID09IDEuMGYpIHsKICAgICAgICAgICAgIHJldHVybiBnZXRJbnN0YW5jZShydWxlKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbmV3IEFscGhhQ29tcG9zaXRlKHJ1bGUsIGFscGhhKTsKQEAgLTI3NSw0MSArMzEzLDQwIEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgQWxwaGFDb21wb3NpdGUgaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHJ1bGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHJ1bGUgdGhlIGNvbXBvc2l0aW5nIHJ1bGUuCi0gICAgICogCi0gICAgICogQHJldHVybiBBbHBoYUNvbXBvc2l0ZSBpbnN0YW5jZS4KKyAgICAgKiBAcGFyYW0gcnVsZQorICAgICAqICAgICAgICAgICAgdGhlIGNvbXBvc2l0aW5nIHJ1bGUuCisgICAgICogQHJldHVybiB0aGUgQWxwaGFDb21wb3NpdGUgaW5zdGFuY2UuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBBbHBoYUNvbXBvc2l0ZSBnZXRJbnN0YW5jZShpbnQgcnVsZSkgewotICAgICAgICBzd2l0Y2gocnVsZSl7Ci0gICAgICAgIGNhc2UgQ0xFQVI6Ci0gICAgICAgICAgICByZXR1cm4gQ2xlYXI7Ci0gICAgICAgIGNhc2UgU1JDOgotICAgICAgICAgICAgcmV0dXJuIFNyYzsKLSAgICAgICAgY2FzZSBEU1Q6Ci0gICAgICAgICAgICByZXR1cm4gRHN0OwotICAgICAgICBjYXNlIFNSQ19PVkVSOgotICAgICAgICAgICAgcmV0dXJuIFNyY092ZXI7Ci0gICAgICAgIGNhc2UgRFNUX09WRVI6Ci0gICAgICAgICAgICByZXR1cm4gRHN0T3ZlcjsKLSAgICAgICAgY2FzZSBTUkNfSU46Ci0gICAgICAgICAgICByZXR1cm4gU3JjSW47Ci0gICAgICAgIGNhc2UgRFNUX0lOOgotICAgICAgICAgICAgcmV0dXJuIERzdEluOwotICAgICAgICBjYXNlIFNSQ19PVVQ6Ci0gICAgICAgICAgICByZXR1cm4gU3JjT3V0OwotICAgICAgICBjYXNlIERTVF9PVVQ6Ci0gICAgICAgICAgICByZXR1cm4gRHN0T3V0OwotICAgICAgICBjYXNlIFNSQ19BVE9QOgotICAgICAgICAgICAgcmV0dXJuIFNyY0F0b3A7Ci0gICAgICAgIGNhc2UgRFNUX0FUT1A6Ci0gICAgICAgICAgICByZXR1cm4gRHN0QXRvcDsKLSAgICAgICAgY2FzZSBYT1I6Ci0gICAgICAgICAgICByZXR1cm4gWG9yOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gYXd0LjExRD1Vbmtub3duIHJ1bGUKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMTFEIikpOyAvLyROT04tTkxTLTEkCisgICAgICAgIHN3aXRjaCAocnVsZSkgeworICAgICAgICAgICAgY2FzZSBDTEVBUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gQ2xlYXI7CisgICAgICAgICAgICBjYXNlIFNSQzoKKyAgICAgICAgICAgICAgICByZXR1cm4gU3JjOworICAgICAgICAgICAgY2FzZSBEU1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIERzdDsKKyAgICAgICAgICAgIGNhc2UgU1JDX09WRVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNyY092ZXI7CisgICAgICAgICAgICBjYXNlIERTVF9PVkVSOgorICAgICAgICAgICAgICAgIHJldHVybiBEc3RPdmVyOworICAgICAgICAgICAgY2FzZSBTUkNfSU46CisgICAgICAgICAgICAgICAgcmV0dXJuIFNyY0luOworICAgICAgICAgICAgY2FzZSBEU1RfSU46CisgICAgICAgICAgICAgICAgcmV0dXJuIERzdEluOworICAgICAgICAgICAgY2FzZSBTUkNfT1VUOgorICAgICAgICAgICAgICAgIHJldHVybiBTcmNPdXQ7CisgICAgICAgICAgICBjYXNlIERTVF9PVVQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIERzdE91dDsKKyAgICAgICAgICAgIGNhc2UgU1JDX0FUT1A6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNyY0F0b3A7CisgICAgICAgICAgICBjYXNlIERTVF9BVE9QOgorICAgICAgICAgICAgICAgIHJldHVybiBEc3RBdG9wOworICAgICAgICAgICAgY2FzZSBYT1I6CisgICAgICAgICAgICAgICAgcmV0dXJuIFhvcjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8gYXd0LjExRD1Vbmtub3duIHJ1bGUKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjExRCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9CYXNpY1N0cm9rZS5qYXZhIGIvYXd0L2phdmEvYXd0L0Jhc2ljU3Ryb2tlLmphdmEKaW5kZXggOTU1ZGM2Yi4uMjQ1NzgxNSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L0Jhc2ljU3Ryb2tlLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L0Jhc2ljU3Ryb2tlLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgRGVuaXMgTS4gS2lzaGVua28KICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0OwogCiBpbXBvcnQgamF2YS5hd3QuZ2VvbS5HZW5lcmFsUGF0aDsKQEAgLTI3LDEzOSArMjgsMTg4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lm1pc2MuSGFzaENvZGU7CiAKIC8qKgotICogVGhlIEJhc2ljU3Ryb2tlIGNsYXNzIHNwZWNpZmllcyBhIHNldCBvZiByZW5kZXJpbmcgYXR0cmlidXRlcyBmb3IgdGhlIG91dGxpbmVzIAotICogb2YgZ3JhcGhpY3MgcHJpbWl0aXZlcy4gVGhlIEJhc2ljU3Ryb2tlIGF0dHJpYnV0ZXMgZGVzY3JpYmUgdGhlIHNoYXBlIG9mIHRoZSAKLSAqIHBlbiB3aGljaCBkcmF3cyB0aGUgb3V0bGluZSBvZiBhIFNoYXBlIGFuZCB0aGUgZGVjb3JhdGlvbnMgYXBwbGllZCBhdCB0aGUgZW5kcwotICogYW5kIGpvaW5zIG9mIHBhdGggc2VnbWVudHMgb2YgdGhlIFNoYXBlLiBUaGUgQmFzaWNTdHJva2UgaGFzIHRoZSBmb2xsb3dpbmcKLSAqIHJlbmRlcmluZyBhdHRyaWJ1dGVzOgorICogVGhlIEJhc2ljU3Ryb2tlIGNsYXNzIHNwZWNpZmllcyBhIHNldCBvZiByZW5kZXJpbmcgYXR0cmlidXRlcyBmb3IgdGhlCisgKiBvdXRsaW5lcyBvZiBncmFwaGljcyBwcmltaXRpdmVzLiBUaGUgQmFzaWNTdHJva2UgYXR0cmlidXRlcyBkZXNjcmliZSB0aGUKKyAqIHNoYXBlIG9mIHRoZSBwZW4gd2hpY2ggZHJhd3MgdGhlIG91dGxpbmUgb2YgYSBTaGFwZSBhbmQgdGhlIGRlY29yYXRpb25zCisgKiBhcHBsaWVkIGF0IHRoZSBlbmRzIGFuZCBqb2lucyBvZiBwYXRoIHNlZ21lbnRzIG9mIHRoZSBTaGFwZS4gVGhlIEJhc2ljU3Ryb2tlCisgKiBoYXMgdGhlIGZvbGxvd2luZyByZW5kZXJpbmcgYXR0cmlidXRlczoKICAqIDxwPgogICogPHVsPgotICogPGxpPiBsaW5lIHdpZHRoIC10aGUgcGVuIHdpZHRoIHdoaWNoIGRyYXdzIHRoZSBvdXRsaW5lcy48L2xpPgotICogPGxpPiBlbmQgY2FwcyAtIGluZGljYXRlcyB0aGUgZGVjb3JhdGlvbiBhcHBsaWVkIHRvIHRoZSBlbmRzIG9mIHVuY2xvc2VkIAotICogc3VicGF0aHMgYW5kIGRhc2ggc2VnbWVudHMuIFRoZSBCYXNpY1N0cm9rZSBkZWZpbmVzIHRocmVlIGRpZmZlcmVudCBkZWNvcmF0aW9uczoKLSAqIENBUF9CVVRULCBDQVBfUk9VTkQsIGFuZCBDQVBfU1FVQVJFLjwvbGk+Ci0gKiA8bGk+bGluZSBqb2lucyAtIGluZGljYXRlcyB0aGUgZGVjb3JhdGlvbiBhcHBsaWVkIGF0IHRoZSBpbnRlcnNlY3Rpb24gb2YgCi0gKiB0d28gcGF0aCBzZWdtZW50cyBhbmQgYXQgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgZW5kcG9pbnRzIG9mIGEgc3VicGF0aC4KLSAqIFRoZSBCYXNpY1N0cm9rZSBkZWZpbmVzIHRocmVlIGRlY29yYXRpb25zOiBKT0lOX0JFVkVMLCBKT0lOX01JVEVSLCAKLSAqIGFuZCBKT0lOX1JPVU5ELjwvbGk+Ci0gKiA8bGk+bWl0ZXIgbGltaXQgLSB0aGUgbGltaXQgdG8gdHJpbSBhIGxpbmUgam9pbiB0aGF0IGhhcyBhIEpPSU5fTUlURVIgCisgKiA8bGk+bGluZSB3aWR0aCAtdGhlIHBlbiB3aWR0aCB3aGljaCBkcmF3cyB0aGUgb3V0bGluZXMuPC9saT4KKyAqIDxsaT5lbmQgY2FwcyAtIGluZGljYXRlcyB0aGUgZGVjb3JhdGlvbiBhcHBsaWVkIHRvIHRoZSBlbmRzIG9mIHVuY2xvc2VkCisgKiBzdWJwYXRocyBhbmQgZGFzaCBzZWdtZW50cy4gVGhlIEJhc2ljU3Ryb2tlIGRlZmluZXMgdGhyZWUgZGlmZmVyZW50CisgKiBkZWNvcmF0aW9uczogQ0FQX0JVVFQsIENBUF9ST1VORCwgYW5kIENBUF9TUVVBUkUuPC9saT4KKyAqIDxsaT5saW5lIGpvaW5zIC0gaW5kaWNhdGVzIHRoZSBkZWNvcmF0aW9uIGFwcGxpZWQgYXQgdGhlIGludGVyc2VjdGlvbiBvZiB0d28KKyAqIHBhdGggc2VnbWVudHMgYW5kIGF0IHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIGVuZHBvaW50cyBvZiBhIHN1YnBhdGguIFRoZQorICogQmFzaWNTdHJva2UgZGVmaW5lcyB0aHJlZSBkZWNvcmF0aW9uczogSk9JTl9CRVZFTCwgSk9JTl9NSVRFUiwgYW5kCisgKiBKT0lOX1JPVU5ELjwvbGk+CisgKiA8bGk+bWl0ZXIgbGltaXQgLSB0aGUgbGltaXQgdG8gdHJpbSBhIGxpbmUgam9pbiB0aGF0IGhhcyBhIEpPSU5fTUlURVIKICAqIGRlY29yYXRpb24uPC9saT4KLSAqIDxsaT5kYXNoIGF0dHJpYnV0ZXMgLSB0aGUgZGVmaW5pdGlvbiBvZiBob3cgdG8gbWFrZSBhIGRhc2ggcGF0dGVybiBieSAKLSAqIGFsdGVybmF0aW5nIGJldHdlZW4gb3BhcXVlIGFuZCB0cmFuc3BhcmVudCBzZWN0aW9ucyA8L2xpPgorICogPGxpPmRhc2ggYXR0cmlidXRlcyAtIHRoZSBkZWZpbml0aW9uIG9mIGhvdyB0byBtYWtlIGEgZGFzaCBwYXR0ZXJuIGJ5CisgKiBhbHRlcm5hdGluZyBiZXR3ZWVuIG9wYXF1ZSBhbmQgdHJhbnNwYXJlbnQgc2VjdGlvbnM8L2xpPgogICogPC91bD4KKyAqIDwvcD4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBCYXNpY1N0cm9rZSBpbXBsZW1lbnRzIFN0cm9rZSB7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IENBUF9CVVRUIGluZGljYXRlcyB0aGUgZW5kcyBvZiB1bmNsb3NlZCBzdWJwYXRocyAKLSAgICAgKiBhbmQgZGFzaCBzZWdtZW50cyBoYXZlIG5vIGFkZGVkIGRlY29yYXRpb24uCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IENBUF9CVVRUIGluZGljYXRlcyB0aGUgZW5kcyBvZiB1bmNsb3NlZCBzdWJwYXRocyBhbmQgZGFzaAorICAgICAqIHNlZ21lbnRzIGhhdmUgbm8gYWRkZWQgZGVjb3JhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVBfQlVUVCA9IDA7Ci0gICAgCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBDQVBfUk9VTkQgaW5kaWNhdGVzIHRoZSBlbmRzIG9mIHVuY2xvc2VkIHN1YnBhdGhzIAotICAgICAqIGFuZCBkYXNoIHNlZ21lbnRzIGhhdmUgYSByb3VuZCBkZWNvcmF0aW9uLgorCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IENBUF9ST1VORCBpbmRpY2F0ZXMgdGhlIGVuZHMgb2YgdW5jbG9zZWQgc3VicGF0aHMgYW5kIGRhc2gKKyAgICAgKiBzZWdtZW50cyBoYXZlIGEgcm91bmQgZGVjb3JhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVBfUk9VTkQgPSAxOwotICAgIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgQ0FQX1NRVUFSRSBpbmRpY2F0ZXMgdGhlIGVuZHMgb2YgdW5jbG9zZWQgc3VicGF0aHMgCi0gICAgICogYW5kIGRhc2ggc2VnbWVudHMgaGF2ZSBhIHNxdWFyZSBwcm9qZWN0aW9uLgorCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IENBUF9TUVVBUkUgaW5kaWNhdGVzIHRoZSBlbmRzIG9mIHVuY2xvc2VkIHN1YnBhdGhzIGFuZCBkYXNoCisgICAgICogc2VnbWVudHMgaGF2ZSBhIHNxdWFyZSBwcm9qZWN0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBUF9TUVVBUkUgPSAyOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBKT0lOX01JVEVSIGluZGljYXRlcyB0aGF0IHBhdGggc2VnbWVudHMgYXJlIGpvaW5lZCBieSAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgSk9JTl9NSVRFUiBpbmRpY2F0ZXMgdGhhdCBwYXRoIHNlZ21lbnRzIGFyZSBqb2luZWQgYnkKICAgICAgKiBleHRlbmRpbmcgdGhlaXIgb3V0c2lkZSBlZGdlcyB1bnRpbCB0aGV5IG1lZXQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSk9JTl9NSVRFUiA9IDA7Ci0gICAgCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBKT0lOX1JPVU5EIGluZGljYXRlcyB0aGF0IHBhdGggc2VnbWVudHMgYXJlIGpvaW5lZCBieSAKKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBKT0lOX1JPVU5EIGluZGljYXRlcyB0aGF0IHBhdGggc2VnbWVudHMgYXJlIGpvaW5lZCBieQogICAgICAqIHJvdW5kaW5nIG9mZiB0aGUgY29ybmVyIGF0IGEgcmFkaXVzIG9mIGhhbGYgdGhlIGxpbmUgd2lkdGguCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSk9JTl9ST1VORCA9IDE7Ci0gICAgCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBKT0lOX0JFVkVMIGluZGljYXRlcyB0aGF0IHBhdGggc2VnbWVudHMgYXJlIGpvaW5lZCBieSAKLSAgICAgKiBjb25uZWN0aW5nIHRoZSBvdXRlciBjb3JuZXJzIG9mIHRoZWlyIHdpZGUgb3V0bGluZXMgd2l0aCAKLSAgICAgKiBhIHN0cmFpZ2h0IHNlZ21lbnQuCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgSk9JTl9CRVZFTCBpbmRpY2F0ZXMgdGhhdCBwYXRoIHNlZ21lbnRzIGFyZSBqb2luZWQgYnkKKyAgICAgKiBjb25uZWN0aW5nIHRoZSBvdXRlciBjb3JuZXJzIG9mIHRoZWlyIHdpZGUgb3V0bGluZXMgd2l0aCBhIHN0cmFpZ2h0CisgICAgICogc2VnbWVudC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKT0lOX0JFVkVMID0gMjsKLSAgICAKLSAgICAvKiogQ29uc3RhbnRzIGZvciBjYWxjdWxhdGluZy4gKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IE1BWF9MRVZFTCA9IDIwOyAgICAgICAgLy8gTWF4aW1hbCBkZWVwbmVzcyBvZiBjdXJ2ZSBzdWJkaXZpc2lvbgotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgQ1VSVkVfREVMVEEuICovCi0gICAgc3RhdGljIGZpbmFsIGRvdWJsZSBDVVJWRV9ERUxUQSA9IDIuMDsgIC8vIFdpZHRoIHRvbGVyYW5jZQotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgQ09STkVSX0FOR0xFLiAqLworCisgICAgLyoqCisgICAgICogQ29uc3RhbnRzIGZvciBjYWxjdWxhdGluZy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IE1BWF9MRVZFTCA9IDIwOyAvLyBNYXhpbWFsIGRlZXBuZXNzIG9mIGN1cnZlIHN1YmRpdmlzaW9uCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgQ1VSVkVfREVMVEEuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGRvdWJsZSBDVVJWRV9ERUxUQSA9IDIuMDsgLy8gV2lkdGggdG9sZXJhbmNlCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgQ09STkVSX0FOR0xFLgorICAgICAqLwogICAgIHN0YXRpYyBmaW5hbCBkb3VibGUgQ09STkVSX0FOR0xFID0gNC4wOyAvLyBNaW5pbXVtIGNvcm5lciBhbmdsZQotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgQ09STkVSX1pFUk8uICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgQ09STkVSX1pFUk8uCisgICAgICovCiAgICAgc3RhdGljIGZpbmFsIGRvdWJsZSBDT1JORVJfWkVSTyA9IDAuMDE7IC8vIFplcm8gYW5nbGUKLSAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IENVQklDX0FSQy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBDVUJJQ19BUkMuCisgICAgICovCiAgICAgc3RhdGljIGZpbmFsIGRvdWJsZSBDVUJJQ19BUkMgPSA0LjAgLyAzLjAgKiAoTWF0aC5zcXJ0KDIuMCkgLSAxKTsKIAotICAgIC8qKiBTdHJva2Ugd2lkdGguICovCisgICAgLyoqCisgICAgICogU3Ryb2tlIHdpZHRoLgorICAgICAqLwogICAgIGZsb2F0IHdpZHRoOwotICAgIAotICAgIC8qKiBTdHJva2UgY2FwIHR5cGUuICovCisKKyAgICAvKioKKyAgICAgKiBTdHJva2UgY2FwIHR5cGUuCisgICAgICovCiAgICAgaW50IGNhcDsKLSAgICAKLSAgICAvKiogU3Ryb2tlIGpvaW4gdHlwZS4gKi8KKworICAgIC8qKgorICAgICAqIFN0cm9rZSBqb2luIHR5cGUuCisgICAgICovCiAgICAgaW50IGpvaW47Ci0gICAgCi0gICAgLyoqIFN0cm9rZSBtaXRlciBsaW1pdC4gKi8KKworICAgIC8qKgorICAgICAqIFN0cm9rZSBtaXRlciBsaW1pdC4KKyAgICAgKi8KICAgICBmbG9hdCBtaXRlckxpbWl0OwotICAgIAotICAgIC8qKiBTdHJva2UgZGFzaGVzIGFycmF5LiAqLworCisgICAgLyoqCisgICAgICogU3Ryb2tlIGRhc2hlcyBhcnJheS4KKyAgICAgKi8KICAgICBmbG9hdCBkYXNoW107Ci0gICAgCi0gICAgLyoqIFN0cm9rZSBkYXNoIHBoYXNlLiAqLworCisgICAgLyoqCisgICAgICogU3Ryb2tlIGRhc2ggcGhhc2UuCisgICAgICovCiAgICAgZmxvYXQgZGFzaFBoYXNlOwogCi0gICAgLyoqIFRoZSB0ZW1wb3JhcnkgcHJlLWNhbGN1bGF0ZWQgdmFsdWVzLiAqLworICAgIC8qKgorICAgICAqIFRoZSB0ZW1wb3JhcnkgcHJlLWNhbGN1bGF0ZWQgdmFsdWVzLgorICAgICAqLwogICAgIGRvdWJsZSBjdXJ2ZURlbHRhOwotICAgIAotICAgIC8qKiBUaGUgY29ybmVyIGRlbHRhLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGNvcm5lciBkZWx0YS4KKyAgICAgKi8KICAgICBkb3VibGUgY29ybmVyRGVsdGE7Ci0gICAgCi0gICAgLyoqIFRoZSB6ZXJvIGRlbHRhLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHplcm8gZGVsdGEuCisgICAgICovCiAgICAgZG91YmxlIHplcm9EZWx0YTsKIAotICAgIC8qKiBUaGUgdzIuICovCisgICAgLyoqCisgICAgICogVGhlIHcyLgorICAgICAqLwogICAgIGRvdWJsZSB3MjsKLSAgICAKLSAgICAvKiogVGhlIGZteS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBmbXkuCisgICAgICovCiAgICAgZG91YmxlIGZteCwgZm15OwotICAgIAotICAgIC8qKiBUaGUgc215LiAqLworCisgICAgLyoqCisgICAgICogVGhlIHNteS4KKyAgICAgKi8KICAgICBkb3VibGUgc2N4LCBzY3ksIHNteCwgc215OwotICAgIAotICAgIC8qKiBUaGUgY3kuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgY3kuCisgICAgICovCiAgICAgZG91YmxlIG14LCBteSwgY3gsIGN5OwogCi0gICAgLyoqIFRoZSB0ZW1wb3JhcnkgaW5kaWNhdG9ycy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgdGVtcG9yYXJ5IGluZGljYXRvcnMuCisgICAgICovCiAgICAgYm9vbGVhbiBpc01vdmU7Ci0gICAgCi0gICAgLyoqIFRoZSBpcyBmaXJzdC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBpcyBmaXJzdC4KKyAgICAgKi8KICAgICBib29sZWFuIGlzRmlyc3Q7Ci0gICAgCi0gICAgLyoqIFRoZSBjaGVjayBtb3ZlLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGNoZWNrIG1vdmUuCisgICAgICovCiAgICAgYm9vbGVhbiBjaGVja01vdmU7Ci0gICAgCi0gICAgLyoqIFRoZSB0ZW1wb3JhcnkgYW5kIGRlc3RpbmF0aW9uIHdvcmsgcGF0aHMuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgdGVtcG9yYXJ5IGFuZCBkZXN0aW5hdGlvbiB3b3JrIHBhdGhzLgorICAgICAqLwogICAgIEJ1ZmZlcmVkUGF0aCBkc3QsIGxwLCBycCwgc3A7Ci0gICAgCi0gICAgLyoqIFN0cm9rZSBkYXNoZXIgY2xhc3MuICovCisKKyAgICAvKioKKyAgICAgKiBTdHJva2UgZGFzaGVyIGNsYXNzLgorICAgICAqLwogICAgIERhc2hlciBkYXNoZXI7CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQmFzaWNTdHJva2Ugd2l0aCBkZWZhdWx0IHdpZHRoLCBjYXAsIGpvaW4sIGxpbWl0LAotICAgICAqIGRhc2ggYXR0cmlidXRlcyBwYXJhbWV0ZXJzLiBUaGUgZGVmYXVsdCBwYXJhbWV0ZXJzIGFyZSBhIHNvbGlkIGxpbmUgb2YgCi0gICAgICogd2lkdGggMS4wLCBDQVBfU1FVQVJFLCBKT0lOX01JVEVSLCBhIG1pdGVyIGxpbWl0IG9mIDEwLjAsIG51bGwgZGFzaCBhdHRyaWJ1dGVzLAorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBCYXNpY1N0cm9rZSB3aXRoIGRlZmF1bHQgd2lkdGgsIGNhcCwgam9pbiwgbGltaXQsIGRhc2gKKyAgICAgKiBhdHRyaWJ1dGVzIHBhcmFtZXRlcnMuIFRoZSBkZWZhdWx0IHBhcmFtZXRlcnMgYXJlIGEgc29saWQgbGluZSBvZiB3aWR0aAorICAgICAqIDEuMCwgQ0FQX1NRVUFSRSwgSk9JTl9NSVRFUiwgYSBtaXRlciBsaW1pdCBvZiAxMC4wLCBudWxsIGRhc2ggYXR0cmlidXRlcywKICAgICAgKiBhbmQgYSBkYXNoIHBoYXNlIG9mIDAuMGYuCiAgICAgICovCiAgICAgcHVibGljIEJhc2ljU3Ryb2tlKCkgewpAQCAtMTY3LDE3ICsyMTcsMjQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQmFzaWNTdHJva2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHdpZHRoLCAgCi0gICAgICogY2Fwcywgam9pbnMsIGxpbWl0LCBkYXNoIGF0dHJpYnV0ZXMsIGRhc2ggcGhhc2UgcGFyYW1ldGVycy4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQmFzaWNTdHJva2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHdpZHRoLCBjYXBzLCBqb2lucywKKyAgICAgKiBsaW1pdCwgZGFzaCBhdHRyaWJ1dGVzLCBkYXNoIHBoYXNlIHBhcmFtZXRlcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiBCYXNpa1N0cm9rZS4KLSAgICAgKiBAcGFyYW0gY2FwIHRoZSBlbmQgZGVjb3JhdGlvbiBvZiBCYXNpa1N0cm9rZS4KLSAgICAgKiBAcGFyYW0gam9pbiB0aGUgam9pbiBzZWdtZW50cyBkZWNvcmF0aW9uLgotICAgICAqIEBwYXJhbSBtaXRlckxpbWl0IHRoZSBsaW1pdCB0byB0cmltIHRoZSBtaXRlciBqb2luLgotICAgICAqIEBwYXJhbSBkYXNoIHRoZSBhcnJheSB3aXRoIHRoZSBkYXNoaW5nIHBhdHRlcm4uCi0gICAgICogQHBhcmFtIGRhc2hQaGFzZSB0aGUgb2Zmc2V0IHRvIHN0YXJ0IHRoZSBkYXNoaW5nIHBhdHRlcm4uCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgQmFzaWtTdHJva2UuCisgICAgICogQHBhcmFtIGNhcAorICAgICAqICAgICAgICAgICAgdGhlIGVuZCBkZWNvcmF0aW9uIG9mIEJhc2lrU3Ryb2tlLgorICAgICAqIEBwYXJhbSBqb2luCisgICAgICogICAgICAgICAgICB0aGUgam9pbiBzZWdtZW50cyBkZWNvcmF0aW9uLgorICAgICAqIEBwYXJhbSBtaXRlckxpbWl0CisgICAgICogICAgICAgICAgICB0aGUgbGltaXQgdG8gdHJpbSB0aGUgbWl0ZXIgam9pbi4KKyAgICAgKiBAcGFyYW0gZGFzaAorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IHdpdGggdGhlIGRhc2hpbmcgcGF0dGVybi4KKyAgICAgKiBAcGFyYW0gZGFzaFBoYXNlCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IHRvIHN0YXJ0IHRoZSBkYXNoaW5nIHBhdHRlcm4uCiAgICAgICovCi0gICAgcHVibGljIEJhc2ljU3Ryb2tlKGZsb2F0IHdpZHRoLCBpbnQgY2FwLCBpbnQgam9pbiwgZmxvYXQgbWl0ZXJMaW1pdCwgZmxvYXRbXSBkYXNoLCBmbG9hdCBkYXNoUGhhc2UpIHsKKyAgICBwdWJsaWMgQmFzaWNTdHJva2UoZmxvYXQgd2lkdGgsIGludCBjYXAsIGludCBqb2luLCBmbG9hdCBtaXRlckxpbWl0LCBmbG9hdFtdIGRhc2gsCisgICAgICAgICAgICBmbG9hdCBkYXNoUGhhc2UpIHsKICAgICAgICAgaWYgKHdpZHRoIDwgMC4wZikgewogICAgICAgICAgICAgLy8gYXd0LjEzMz1OZWdhdGl2ZSB3aWR0aAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4xMzMiKSk7IC8vJE5PTi1OTFMtMSQKQEAgLTIwNCw3ICsyNjEsNyBAQAogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMTM4IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBaRVJPOiB7Ci0gICAgICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGRhc2gubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhc2gubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGRhc2hbaV0gPCAwLjApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF3dC4xMzk9TmVnYXRpdmUgZGFzaFt7MH1dCiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjEzOSIsIGkpKTsgLy8kTk9OLU5MUy0xJApAQCAtMjI2LDM1ICsyODMsNDMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQmFzaWNTdHJva2Ugd2l0aCBzcGVjaWZpZWQgd2lkdGgsIGNhcCwgam9pbiwgbGltaXQKLSAgICAgKiBhbmQgZGVmYXVsdCBkYXNoIGF0dHJpYnV0ZXMgcGFyYW1ldGVycy4gCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEJhc2ljU3Ryb2tlIHdpdGggc3BlY2lmaWVkIHdpZHRoLCBjYXAsIGpvaW4sIGxpbWl0IGFuZAorICAgICAqIGRlZmF1bHQgZGFzaCBhdHRyaWJ1dGVzIHBhcmFtZXRlcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiBCYXNpa1N0cm9rZS4KLSAgICAgKiBAcGFyYW0gY2FwIHRoZSBlbmQgZGVjb3JhdGlvbiBvZiBCYXNpa1N0cm9rZS4KLSAgICAgKiBAcGFyYW0gam9pbiB0aGUgam9pbiBzZWdtZW50cyBkZWNvcmF0aW9uLgotICAgICAqIEBwYXJhbSBtaXRlckxpbWl0IHRoZSBsaW1pdCB0byB0cmltIHRoZSBtaXRlciBqb2luLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIEJhc2lrU3Ryb2tlLgorICAgICAqIEBwYXJhbSBjYXAKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbmQgZGVjb3JhdGlvbiBvZiBCYXNpa1N0cm9rZS4KKyAgICAgKiBAcGFyYW0gam9pbgorICAgICAqICAgICAgICAgICAgdGhlIGpvaW4gc2VnbWVudHMgZGVjb3JhdGlvbi4KKyAgICAgKiBAcGFyYW0gbWl0ZXJMaW1pdAorICAgICAqICAgICAgICAgICAgdGhlIGxpbWl0IHRvIHRyaW0gdGhlIG1pdGVyIGpvaW4uCiAgICAgICovCiAgICAgcHVibGljIEJhc2ljU3Ryb2tlKGZsb2F0IHdpZHRoLCBpbnQgY2FwLCBpbnQgam9pbiwgZmxvYXQgbWl0ZXJMaW1pdCkgewogICAgICAgICB0aGlzKHdpZHRoLCBjYXAsIGpvaW4sIG1pdGVyTGltaXQsIG51bGwsIDAuMGYpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBCYXNpY1N0cm9rZSB3aXRoIHNwZWNpZmllZCB3aWR0aCwgY2FwLCBqb2luCi0gICAgICogYW5kIGRlZmF1bHQgbGltaXQgYW5kIGRhc2ggYXR0cmlidXRlcyBwYXJhbWV0ZXJzLiAKKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQmFzaWNTdHJva2Ugd2l0aCBzcGVjaWZpZWQgd2lkdGgsIGNhcCwgam9pbiBhbmQKKyAgICAgKiBkZWZhdWx0IGxpbWl0IGFuZCBkYXNoIGF0dHJpYnV0ZXMgcGFyYW1ldGVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIEJhc2lrU3Ryb2tlLgotICAgICAqIEBwYXJhbSBjYXAgdGhlIGVuZCBkZWNvcmF0aW9uIG9mIEJhc2lrU3Ryb2tlLgotICAgICAqIEBwYXJhbSBqb2luIHRoZSBqb2luIHNlZ21lbnRzIGRlY29yYXRpb24uCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgQmFzaWtTdHJva2UuCisgICAgICogQHBhcmFtIGNhcAorICAgICAqICAgICAgICAgICAgdGhlIGVuZCBkZWNvcmF0aW9uIG9mIEJhc2lrU3Ryb2tlLgorICAgICAqIEBwYXJhbSBqb2luCisgICAgICogICAgICAgICAgICB0aGUgam9pbiBzZWdtZW50cyBkZWNvcmF0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBCYXNpY1N0cm9rZShmbG9hdCB3aWR0aCwgaW50IGNhcCwgaW50IGpvaW4pIHsKICAgICAgICAgdGhpcyh3aWR0aCwgY2FwLCBqb2luLCAxMC4wZiwgbnVsbCwgMC4wZik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEJhc2ljU3Ryb2tlIHdpdGggc3BlY2lmaWVkIHdpZHRoIGFuZCBkZWZhdWx0IGNhcCwgam9pbiwKLSAgICAgKiBsaW1pdCwgZGFzaCBhdHRyaWJ1dGVzIHBhcmFtZXRlcnMuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEJhc2ljU3Ryb2tlIHdpdGggc3BlY2lmaWVkIHdpZHRoIGFuZCBkZWZhdWx0IGNhcCwKKyAgICAgKiBqb2luLCBsaW1pdCwgZGFzaCBhdHRyaWJ1dGVzIHBhcmFtZXRlcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiBCYXNpY1N0cm9rZS4KKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiBCYXNpY1N0cm9rZS4KICAgICAgKi8KICAgICBwdWJsaWMgQmFzaWNTdHJva2UoZmxvYXQgd2lkdGgpIHsKICAgICAgICAgdGhpcyh3aWR0aCwgQ0FQX1NRVUFSRSwgSk9JTl9NSVRFUiwgMTAuMGYsIG51bGwsIDAuMGYpOwpAQCAtMjg4LDcgKzM1Myw4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWl0ZXIgbGltaXQgb2YgdGhlIEJhc2ljU3Ryb2tlICh0aGUgbGltaXQgdG8gdHJpbSB0aGUgbWl0ZXIgam9pbikuCisgICAgICogR2V0cyB0aGUgbWl0ZXIgbGltaXQgb2YgdGhlIEJhc2ljU3Ryb2tlICh0aGUgbGltaXQgdG8gdHJpbSB0aGUgbWl0ZXIKKyAgICAgKiBqb2luKS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBtaXRlciBsaW1pdCBvZiB0aGUgQmFzaWNTdHJva2UuCiAgICAgICovCkBAIC0zMzgsMTAgKzQwNCwxMCBAQAogICAgIC8qKgogICAgICAqIENvbXBhcmVzIHRoaXMgQmFzaWNTdHJva2Ugb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBPYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIG9iaiB0aGUgT2JqZWN0IHRvIGJlIGNvbXBhcmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIE9iamVjdCBpcyBhIEJhc2ljU3Ryb2tlIHdpdGggdGhlIHNhbWUgZGF0YQotICAgICAqIHZhbHVlcyBhcyB0aGlzIEJhc2ljU3Ryb2tlOyBmYWxzZSBvdGhlcndpc2UuIAorICAgICAqIEBwYXJhbSBvYmoKKyAgICAgKiAgICAgICAgICAgIHRoZSBPYmplY3QgdG8gYmUgY29tcGFyZWQuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgT2JqZWN0IGlzIGEgQmFzaWNTdHJva2Ugd2l0aCB0aGUgc2FtZSBkYXRhIHZhbHVlcyBhcworICAgICAqICAgICAgICAgdGhpcyBCYXNpY1N0cm9rZTsgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CkBAIC0zNTAsMTMgKzQxNiw5IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEJhc2ljU3Ryb2tlKSB7CiAgICAgICAgICAgICBCYXNpY1N0cm9rZSBicyA9IChCYXNpY1N0cm9rZSlvYmo7Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBicy53aWR0aCA9PSB3aWR0aCAmJgotICAgICAgICAgICAgICAgIGJzLmNhcCA9PSBjYXAgJiYKLSAgICAgICAgICAgICAgICBicy5qb2luID09IGpvaW4gJiYKLSAgICAgICAgICAgICAgICBicy5taXRlckxpbWl0ID09IG1pdGVyTGltaXQgJiYKLSAgICAgICAgICAgICAgICBicy5kYXNoUGhhc2UgPT0gZGFzaFBoYXNlICYmCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5cy5lcXVhbHMoYnMuZGFzaCwgZGFzaCk7CisgICAgICAgICAgICByZXR1cm4gYnMud2lkdGggPT0gd2lkdGggJiYgYnMuY2FwID09IGNhcCAmJiBicy5qb2luID09IGpvaW4KKyAgICAgICAgICAgICAgICAgICAgJiYgYnMubWl0ZXJMaW1pdCA9PSBtaXRlckxpbWl0ICYmIGJzLmRhc2hQaGFzZSA9PSBkYXNoUGhhc2UKKyAgICAgICAgICAgICAgICAgICAgJiYgamF2YS51dGlsLkFycmF5cy5lcXVhbHMoYnMuZGFzaCwgZGFzaCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTM2NCw5ICs0MjYsOSBAQAogICAgIC8qKgogICAgICAqIENhbGN1bGF0ZXMgYWxsb3dhYmxlIGN1cnZlIGRlcml2YXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGN1cnZlIGRlbHRhCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGguCisgICAgICogQHJldHVybiB0aGUgY3VydmUgZGVsdGEuCiAgICAgICovCiAgICAgZG91YmxlIGdldEN1cnZlRGVsdGEoZG91YmxlIHdpZHRoKSB7CiAgICAgICAgIGRvdWJsZSBhID0gd2lkdGggKyBDVVJWRV9ERUxUQTsKQEAgLTM3OCw5ICs0NDAsOSBAQAogICAgIC8qKgogICAgICAqIENhbGN1bGF0ZXMgdGhlIHZhbHVlIHRvIGRldGVjdCBhIHNtYWxsIGFuZ2xlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGgKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjb3JuZXIgZGVsdGEKKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aC4KKyAgICAgKiBAcmV0dXJuIHRoZSBjb3JuZXIgZGVsdGEuCiAgICAgICovCiAgICAgZG91YmxlIGdldENvcm5lckRlbHRhKGRvdWJsZSB3aWR0aCkgewogICAgICAgICByZXR1cm4gd2lkdGggKiB3aWR0aCAqIE1hdGguc2luKE1hdGguUEkgKiBDT1JORVJfQU5HTEUgLyAxODAuMCk7CkBAIC0zODksMjIgKzQ1MSwyMSBAQAogICAgIC8qKgogICAgICAqIENhbGN1bGF0ZXMgdmFsdWUgdG8gZGV0ZWN0IGEgemVybyBhbmdsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgemVybyBkZWx0YQorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoLgorICAgICAqIEByZXR1cm4gdGhlIHplcm8gZGVsdGEuCiAgICAgICovCiAgICAgZG91YmxlIGdldFplcm9EZWx0YShkb3VibGUgd2lkdGgpIHsKICAgICAgICAgcmV0dXJuIHdpZHRoICogd2lkdGggKiBNYXRoLnNpbihNYXRoLlBJICogQ09STkVSX1pFUk8gLyAxODAuMCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIFNoYXBlIGZyb20gdGhlIG91dGxpbmUgb2YgdGhlIHNwZWNpZmllZCBzaGFwZSAKLSAgICAgKiBkcmF3biB3aXRoIHRoaXMgQmFzaWNTdHJva2UuCisgICAgICogQ3JlYXRlcyBhIFNoYXBlIGZyb20gdGhlIG91dGxpbmUgb2YgdGhlIHNwZWNpZmllZCBzaGFwZSBkcmF3biB3aXRoIHRoaXMKKyAgICAgKiBCYXNpY1N0cm9rZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcyB0aGUgc3BlY2lmaWVkIFNoYXBlIHRvIGJlIHN0cm9rZWQuCi0gICAgICogCisgICAgICogQHBhcmFtIHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgU2hhcGUgdG8gYmUgc3Ryb2tlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBTaGFwZSBvZiB0aGUgc3Ryb2tlZCBvdXRsaW5lLgotICAgICAqIAogICAgICAqIEBzZWUgamF2YS5hd3QuU3Ryb2tlI2NyZWF0ZVN0cm9rZWRTaGFwZShqYXZhLmF3dC5TaGFwZSkKICAgICAgKi8KICAgICBwdWJsaWMgU2hhcGUgY3JlYXRlU3Ryb2tlZFNoYXBlKFNoYXBlIHMpIHsKQEAgLTQyOSw3ICs0OTAsOCBAQAogICAgIC8qKgogICAgICAqIEdlbmVyYXRlcyBhIHNoYXBlIHdpdGggYSBzb2xpZCAobm90IGRhc2hlZCkgb3V0bGluZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcCAtIHRoZSBQYXRoSXRlcmF0b3Igb2Ygc291cmNlIHNoYXBlCisgICAgICogQHBhcmFtIHAKKyAgICAgKiAgICAgICAgICAgIHRoZSBQYXRoSXRlcmF0b3Igb2Ygc291cmNlIHNoYXBlLgogICAgICAqLwogICAgIHZvaWQgY3JlYXRlU29saWRTaGFwZShQYXRoSXRlcmF0b3IgcCkgewogICAgICAgICBkb3VibGUgY29vcmRzW10gPSBuZXcgZG91YmxlWzZdOwpAQCAtNDM5LDM2ICs1MDEsMzcgQEAKICAgICAgICAgY2hlY2tNb3ZlID0gdHJ1ZTsKICAgICAgICAgYm9vbGVhbiBpc0Nsb3NlZCA9IHRydWU7CiAKLSAgICAgICAgd2hpbGUoIXAuaXNEb25lKCkpIHsKLSAgICAgICAgICAgIHN3aXRjaChwLmN1cnJlbnRTZWdtZW50KGNvb3JkcykpIHsKLSAgICAgICAgICAgIGNhc2UgUGF0aEl0ZXJhdG9yLlNFR19NT1ZFVE86Ci0gICAgICAgICAgICAgICAgaWYgKCFpc0Nsb3NlZCkgewotICAgICAgICAgICAgICAgICAgICBjbG9zZVNvbGlkU2hhcGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcnAuY2xlYW4oKTsKLSAgICAgICAgICAgICAgICBteCA9IGN4ID0gY29vcmRzWzBdOwotICAgICAgICAgICAgICAgIG15ID0gY3kgPSBjb29yZHNbMV07Ci0gICAgICAgICAgICAgICAgaXNNb3ZlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpc0Nsb3NlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQYXRoSXRlcmF0b3IuU0VHX0xJTkVUTzoKLSAgICAgICAgICAgICAgICBhZGRMaW5lKGN4LCBjeSwgY3ggPSBjb29yZHNbMF0sIGN5ID0gY29vcmRzWzFdLCB0cnVlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUGF0aEl0ZXJhdG9yLlNFR19RVUFEVE86Ci0gICAgICAgICAgICAgICAgYWRkUXVhZChjeCwgY3ksIGNvb3Jkc1swXSwgY29vcmRzWzFdLCBjeCA9IGNvb3Jkc1syXSwgY3kgPSBjb29yZHNbM10pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQYXRoSXRlcmF0b3IuU0VHX0NVQklDVE86Ci0gICAgICAgICAgICAgICAgYWRkQ3ViaWMoY3gsIGN5LCBjb29yZHNbMF0sIGNvb3Jkc1sxXSwgY29vcmRzWzJdLCBjb29yZHNbM10sIGN4ID0gY29vcmRzWzRdLCBjeSA9IGNvb3Jkc1s1XSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFBhdGhJdGVyYXRvci5TRUdfQ0xPU0U6Ci0gICAgICAgICAgICAgICAgYWRkTGluZShjeCwgY3ksIG14LCBteSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIGFkZEpvaW4obHAsIG14LCBteSwgbHAueE1vdmUsIGxwLnlNb3ZlLCB0cnVlKTsKLSAgICAgICAgICAgICAgICBhZGRKb2luKHJwLCBteCwgbXksIHJwLnhNb3ZlLCBycC55TW92ZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIGxwLmNsb3NlUGF0aCgpOwotICAgICAgICAgICAgICAgIHJwLmNsb3NlUGF0aCgpOwotICAgICAgICAgICAgICAgIGxwLmFwcGVuZFJldmVyc2UocnApOwotICAgICAgICAgICAgICAgIGlzQ2xvc2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgd2hpbGUgKCFwLmlzRG9uZSgpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHAuY3VycmVudFNlZ21lbnQoY29vcmRzKSkgeworICAgICAgICAgICAgICAgIGNhc2UgUGF0aEl0ZXJhdG9yLlNFR19NT1ZFVE86CisgICAgICAgICAgICAgICAgICAgIGlmICghaXNDbG9zZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlU29saWRTaGFwZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJwLmNsZWFuKCk7CisgICAgICAgICAgICAgICAgICAgIG14ID0gY3ggPSBjb29yZHNbMF07CisgICAgICAgICAgICAgICAgICAgIG15ID0gY3kgPSBjb29yZHNbMV07CisgICAgICAgICAgICAgICAgICAgIGlzTW92ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlzQ2xvc2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUGF0aEl0ZXJhdG9yLlNFR19MSU5FVE86CisgICAgICAgICAgICAgICAgICAgIGFkZExpbmUoY3gsIGN5LCBjeCA9IGNvb3Jkc1swXSwgY3kgPSBjb29yZHNbMV0sIHRydWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFBhdGhJdGVyYXRvci5TRUdfUVVBRFRPOgorICAgICAgICAgICAgICAgICAgICBhZGRRdWFkKGN4LCBjeSwgY29vcmRzWzBdLCBjb29yZHNbMV0sIGN4ID0gY29vcmRzWzJdLCBjeSA9IGNvb3Jkc1szXSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUGF0aEl0ZXJhdG9yLlNFR19DVUJJQ1RPOgorICAgICAgICAgICAgICAgICAgICBhZGRDdWJpYyhjeCwgY3ksIGNvb3Jkc1swXSwgY29vcmRzWzFdLCBjb29yZHNbMl0sIGNvb3Jkc1szXSwgY3ggPSBjb29yZHNbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3kgPSBjb29yZHNbNV0pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFBhdGhJdGVyYXRvci5TRUdfQ0xPU0U6CisgICAgICAgICAgICAgICAgICAgIGFkZExpbmUoY3gsIGN5LCBteCwgbXksIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkSm9pbihscCwgbXgsIG15LCBscC54TW92ZSwgbHAueU1vdmUsIHRydWUpOworICAgICAgICAgICAgICAgICAgICBhZGRKb2luKHJwLCBteCwgbXksIHJwLnhNb3ZlLCBycC55TW92ZSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBscC5jbG9zZVBhdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgcnAuY2xvc2VQYXRoKCk7CisgICAgICAgICAgICAgICAgICAgIGxwLmFwcGVuZFJldmVyc2UocnApOworICAgICAgICAgICAgICAgICAgICBpc0Nsb3NlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcC5uZXh0KCk7CiAgICAgICAgIH0KQEAgLTQ5Miw3ICs1NTUsOCBAQAogICAgIC8qKgogICAgICAqIEdlbmVyYXRlcyBkYXNoZWQgc3Ryb2tlZCBzaGFwZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcCAtIHRoZSBQYXRoSXRlcmF0b3Igb2Ygc291cmNlIHNoYXBlCisgICAgICogQHBhcmFtIHAKKyAgICAgKiAgICAgICAgICAgIHRoZSBQYXRoSXRlcmF0b3Igb2Ygc291cmNlIHNoYXBlLgogICAgICAqLwogICAgIHZvaWQgY3JlYXRlRGFzaGVkU2hhcGUoUGF0aEl0ZXJhdG9yIHApIHsKICAgICAgICAgZG91YmxlIGNvb3Jkc1tdID0gbmV3IGRvdWJsZVs2XTsKQEAgLTUwMiw1MiArNTY2LDUzIEBACiAgICAgICAgIGNoZWNrTW92ZSA9IGZhbHNlOwogICAgICAgICBib29sZWFuIGlzQ2xvc2VkID0gdHJ1ZTsKIAotICAgICAgICB3aGlsZSghcC5pc0RvbmUoKSkgewotICAgICAgICAgICAgc3dpdGNoKHAuY3VycmVudFNlZ21lbnQoY29vcmRzKSkgewotICAgICAgICAgICAgY2FzZSBQYXRoSXRlcmF0b3IuU0VHX01PVkVUTzoKKyAgICAgICAgd2hpbGUgKCFwLmlzRG9uZSgpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHAuY3VycmVudFNlZ21lbnQoY29vcmRzKSkgeworICAgICAgICAgICAgICAgIGNhc2UgUGF0aEl0ZXJhdG9yLlNFR19NT1ZFVE86CiAKLSAgICAgICAgICAgICAgICBpZiAoIWlzQ2xvc2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsb3NlRGFzaGVkU2hhcGUoKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghaXNDbG9zZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlRGFzaGVkU2hhcGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgZGFzaGVyID0gbmV3IERhc2hlcihkYXNoLCBkYXNoUGhhc2UpOwotICAgICAgICAgICAgICAgIGxwLmNsZWFuKCk7Ci0gICAgICAgICAgICAgICAgcnAuY2xlYW4oKTsKLSAgICAgICAgICAgICAgICBzcCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaXNGaXJzdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaXNNb3ZlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpc0Nsb3NlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG14ID0gY3ggPSBjb29yZHNbMF07Ci0gICAgICAgICAgICAgICAgbXkgPSBjeSA9IGNvb3Jkc1sxXTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUGF0aEl0ZXJhdG9yLlNFR19MSU5FVE86Ci0gICAgICAgICAgICAgICAgYWRkRGFzaExpbmUoY3gsIGN5LCBjeCA9IGNvb3Jkc1swXSwgY3kgPSBjb29yZHNbMV0pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQYXRoSXRlcmF0b3IuU0VHX1FVQURUTzoKLSAgICAgICAgICAgICAgICBhZGREYXNoUXVhZChjeCwgY3ksIGNvb3Jkc1swXSwgY29vcmRzWzFdLCBjeCA9IGNvb3Jkc1syXSwgY3kgPSBjb29yZHNbM10pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQYXRoSXRlcmF0b3IuU0VHX0NVQklDVE86Ci0gICAgICAgICAgICAgICAgYWRkRGFzaEN1YmljKGN4LCBjeSwgY29vcmRzWzBdLCBjb29yZHNbMV0sIGNvb3Jkc1syXSwgY29vcmRzWzNdLCBjeCA9IGNvb3Jkc1s0XSwgY3kgPSBjb29yZHNbNV0pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQYXRoSXRlcmF0b3IuU0VHX0NMT1NFOgotICAgICAgICAgICAgICAgIGFkZERhc2hMaW5lKGN4LCBjeSwgY3ggPSBteCwgY3kgPSBteSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZGFzaGVyLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ29ubmVjdCBjdXJyZW50IGFuZCBoZWFkIHNlZ21lbnRzCi0gICAgICAgICAgICAgICAgICAgIGFkZEpvaW4obHAsIGZteCwgZm15LCBzcC54TW92ZSwgc3AueU1vdmUsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICBscC5qb2luKHNwKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkSm9pbihscCwgZm14LCBmbXksIHJwLnhMYXN0LCBycC55TGFzdCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGxwLmNvbWJpbmUocnApOwotICAgICAgICAgICAgICAgICAgICBhZGRDYXAobHAsIHNteCwgc215LCBscC54TW92ZSwgbHAueU1vdmUpOwotICAgICAgICAgICAgICAgICAgICBscC5jbG9zZVBhdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgZHN0LmFwcGVuZChscCk7CisgICAgICAgICAgICAgICAgICAgIGRhc2hlciA9IG5ldyBEYXNoZXIoZGFzaCwgZGFzaFBoYXNlKTsKKyAgICAgICAgICAgICAgICAgICAgbHAuY2xlYW4oKTsKKyAgICAgICAgICAgICAgICAgICAgcnAuY2xlYW4oKTsKICAgICAgICAgICAgICAgICAgICAgc3AgPSBudWxsOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsb3NlRGFzaGVkU2hhcGUoKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlzRmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpc01vdmUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpc0Nsb3NlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBteCA9IGN4ID0gY29vcmRzWzBdOworICAgICAgICAgICAgICAgICAgICBteSA9IGN5ID0gY29vcmRzWzFdOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFBhdGhJdGVyYXRvci5TRUdfTElORVRPOgorICAgICAgICAgICAgICAgICAgICBhZGREYXNoTGluZShjeCwgY3ksIGN4ID0gY29vcmRzWzBdLCBjeSA9IGNvb3Jkc1sxXSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUGF0aEl0ZXJhdG9yLlNFR19RVUFEVE86CisgICAgICAgICAgICAgICAgICAgIGFkZERhc2hRdWFkKGN4LCBjeSwgY29vcmRzWzBdLCBjb29yZHNbMV0sIGN4ID0gY29vcmRzWzJdLCBjeSA9IGNvb3Jkc1szXSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUGF0aEl0ZXJhdG9yLlNFR19DVUJJQ1RPOgorICAgICAgICAgICAgICAgICAgICBhZGREYXNoQ3ViaWMoY3gsIGN5LCBjb29yZHNbMF0sIGNvb3Jkc1sxXSwgY29vcmRzWzJdLCBjb29yZHNbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ggPSBjb29yZHNbNF0sIGN5ID0gY29vcmRzWzVdKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQYXRoSXRlcmF0b3IuU0VHX0NMT1NFOgorICAgICAgICAgICAgICAgICAgICBhZGREYXNoTGluZShjeCwgY3ksIGN4ID0gbXgsIGN5ID0gbXkpOwogCi0gICAgICAgICAgICAgICAgaXNDbG9zZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBpZiAoZGFzaGVyLmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbm5lY3QgY3VycmVudCBhbmQgaGVhZCBzZWdtZW50cworICAgICAgICAgICAgICAgICAgICAgICAgYWRkSm9pbihscCwgZm14LCBmbXksIHNwLnhNb3ZlLCBzcC55TW92ZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBscC5qb2luKHNwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZEpvaW4obHAsIGZteCwgZm15LCBycC54TGFzdCwgcnAueUxhc3QsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgbHAuY29tYmluZShycCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRDYXAobHAsIHNteCwgc215LCBscC54TW92ZSwgbHAueU1vdmUpOworICAgICAgICAgICAgICAgICAgICAgICAgbHAuY2xvc2VQYXRoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkc3QuYXBwZW5kKGxwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlRGFzaGVkU2hhcGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlzQ2xvc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwLm5leHQoKTsKICAgICAgICAgfQpAQCAtNTgzLDExICs2NDgsMTYgQEAKICAgICAvKioKICAgICAgKiBBZGRzIGNhcCB0byB0aGUgd29yayBwYXRoLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwIC0gdGhlIEJ1ZmZlcmVkUGF0aCBvYmplY3Qgb2Ygd29yayBwYXRoCi0gICAgICogQHBhcmFtIHgwIC0gdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc291cmNlIHBhdGgKLSAgICAgKiBAcGFyYW0geTAgLSB0aGUgeSBjb29yZGluYXRlIG9uIHRoZSBzb3VyY2UgcGF0aAotICAgICAqIEBwYXJhbSB4MiAtIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIG5leHQgcG9pbnQgb24gdGhlIHdvcmsgcGF0aAotICAgICAqIEBwYXJhbSB5MiAtIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIG5leHQgcG9pbnQgb24gdGhlIHdvcmsgcGF0aAorICAgICAqIEBwYXJhbSBwCisgICAgICogICAgICAgICAgICB0aGUgQnVmZmVyZWRQYXRoIG9iamVjdCBvZiB3b3JrIHBhdGguCisgICAgICogQHBhcmFtIHgwCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzb3VyY2UgcGF0aC4KKyAgICAgKiBAcGFyYW0geTAKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb24gdGhlIHNvdXJjZSBwYXRoLgorICAgICAqIEBwYXJhbSB4MgorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgbmV4dCBwb2ludCBvbiB0aGUgd29yayBwYXRoLgorICAgICAqIEBwYXJhbSB5MgorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgbmV4dCBwb2ludCBvbiB0aGUgd29yayBwYXRoLgogICAgICAqLwogICAgIHZvaWQgYWRkQ2FwKEJ1ZmZlcmVkUGF0aCBwLCBkb3VibGUgeDAsIGRvdWJsZSB5MCwgZG91YmxlIHgyLCBkb3VibGUgeTIpIHsKICAgICAgICAgZG91YmxlIHgxID0gcC54TGFzdDsKQEAgLTU5Nyw0MiArNjY3LDQ5IEBACiAgICAgICAgIGRvdWJsZSB4MjAgPSB4MiAtIHgwOwogICAgICAgICBkb3VibGUgeTIwID0geTIgLSB5MDsKIAotICAgICAgICBzd2l0Y2goY2FwKSB7Ci0gICAgICAgIGNhc2UgQ0FQX0JVVFQ6Ci0gICAgICAgICAgICBwLmxpbmVUbyh4MiwgeTIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0FQX1JPVU5EOgotICAgICAgICAgICAgZG91YmxlIG14ID0geDEwICogQ1VCSUNfQVJDOwotICAgICAgICAgICAgZG91YmxlIG15ID0geTEwICogQ1VCSUNfQVJDOworICAgICAgICBzd2l0Y2ggKGNhcCkgeworICAgICAgICAgICAgY2FzZSBDQVBfQlVUVDoKKyAgICAgICAgICAgICAgICBwLmxpbmVUbyh4MiwgeTIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDQVBfUk9VTkQ6CisgICAgICAgICAgICAgICAgZG91YmxlIG14ID0geDEwICogQ1VCSUNfQVJDOworICAgICAgICAgICAgICAgIGRvdWJsZSBteSA9IHkxMCAqIENVQklDX0FSQzsKIAotICAgICAgICAgICAgZG91YmxlIHgzID0geDAgKyB5MTA7Ci0gICAgICAgICAgICBkb3VibGUgeTMgPSB5MCAtIHgxMDsKKyAgICAgICAgICAgICAgICBkb3VibGUgeDMgPSB4MCArIHkxMDsKKyAgICAgICAgICAgICAgICBkb3VibGUgeTMgPSB5MCAtIHgxMDsKIAotICAgICAgICAgICAgeDEwICo9IENVQklDX0FSQzsKLSAgICAgICAgICAgIHkxMCAqPSBDVUJJQ19BUkM7Ci0gICAgICAgICAgICB4MjAgKj0gQ1VCSUNfQVJDOwotICAgICAgICAgICAgeTIwICo9IENVQklDX0FSQzsKKyAgICAgICAgICAgICAgICB4MTAgKj0gQ1VCSUNfQVJDOworICAgICAgICAgICAgICAgIHkxMCAqPSBDVUJJQ19BUkM7CisgICAgICAgICAgICAgICAgeDIwICo9IENVQklDX0FSQzsKKyAgICAgICAgICAgICAgICB5MjAgKj0gQ1VCSUNfQVJDOwogCi0gICAgICAgICAgICBwLmN1YmljVG8oeDEgKyB5MTAsIHkxIC0geDEwLCB4MyArIG14LCB5MyArIG15LCB4MywgeTMpOwotICAgICAgICAgICAgcC5jdWJpY1RvKHgzIC0gbXgsIHkzIC0gbXksIHgyIC0geTIwLCB5MiArIHgyMCwgeDIsIHkyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENBUF9TUVVBUkU6Ci0gICAgICAgICAgICBwLmxpbmVUbyh4MSArIHkxMCwgeTEgLSB4MTApOwotICAgICAgICAgICAgcC5saW5lVG8oeDIgLSB5MjAsIHkyICsgeDIwKTsKLSAgICAgICAgICAgIHAubGluZVRvKHgyLCB5Mik7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBwLmN1YmljVG8oeDEgKyB5MTAsIHkxIC0geDEwLCB4MyArIG14LCB5MyArIG15LCB4MywgeTMpOworICAgICAgICAgICAgICAgIHAuY3ViaWNUbyh4MyAtIG14LCB5MyAtIG15LCB4MiAtIHkyMCwgeTIgKyB4MjAsIHgyLCB5Mik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENBUF9TUVVBUkU6CisgICAgICAgICAgICAgICAgcC5saW5lVG8oeDEgKyB5MTAsIHkxIC0geDEwKTsKKyAgICAgICAgICAgICAgICBwLmxpbmVUbyh4MiAtIHkyMCwgeTIgKyB4MjApOworICAgICAgICAgICAgICAgIHAubGluZVRvKHgyLCB5Mik7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKICAgICAgKiBBZGRzIGJldmVsIGFuZCBtaXRlciBqb2luIHRvIHRoZSB3b3JrIHBhdGguCiAgICAgICogCi0gICAgICogQHBhcmFtIHAgLSB0aGUgQnVmZmVyZWRQYXRoIG9iamVjdCBvZiB3b3JrIHBhdGgKLSAgICAgKiBAcGFyYW0geDAgLSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzb3VyY2UgcGF0aAotICAgICAqIEBwYXJhbSB5MCAtIHRoZSB5IGNvb3JkaW5hdGUgb24gdGhlIHNvdXJjZSBwYXRoCi0gICAgICogQHBhcmFtIHgyIC0gdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgbmV4dCBwb2ludCBvbiB0aGUgd29yayBwYXRoCi0gICAgICogQHBhcmFtIHkyIC0gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgbmV4dCBwb2ludCBvbiB0aGUgd29yayBwYXRoCi0gICAgICogQHBhcmFtIGlzTGVmdCAtIHRoZSBvcmllbnRhdGlvbiBvZiB3b3JrIHBhdGgsIHRydWUgaWYgd29yayBwYXRoIGxpZXMgdG8gdGhlIGxlZnQgZnJvbSBzb3VyY2UgcGF0aCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogQHBhcmFtIHAKKyAgICAgKiAgICAgICAgICAgIHRoZSBCdWZmZXJlZFBhdGggb2JqZWN0IG9mIHdvcmsgcGF0aC4KKyAgICAgKiBAcGFyYW0geDAKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNvdXJjZSBwYXRoLgorICAgICAqIEBwYXJhbSB5MAorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvbiB0aGUgc291cmNlIHBhdGguCisgICAgICogQHBhcmFtIHgyCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBuZXh0IHBvaW50IG9uIHRoZSB3b3JrIHBhdGguCisgICAgICogQHBhcmFtIHkyCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBuZXh0IHBvaW50IG9uIHRoZSB3b3JrIHBhdGguCisgICAgICogQHBhcmFtIGlzTGVmdAorICAgICAqICAgICAgICAgICAgdGhlIG9yaWVudGF0aW9uIG9mIHdvcmsgcGF0aCwgdHJ1ZSBpZiB3b3JrIHBhdGggbGllcyB0byB0aGUKKyAgICAgKiAgICAgICAgICAgIGxlZnQgZnJvbSBzb3VyY2UgcGF0aCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHZvaWQgYWRkSm9pbihCdWZmZXJlZFBhdGggcCwgZG91YmxlIHgwLCBkb3VibGUgeTAsIGRvdWJsZSB4MiwgZG91YmxlIHkyLCBib29sZWFuIGlzTGVmdCkgewogICAgICAgICBkb3VibGUgeDEgPSBwLnhMYXN0OwpAQCAtNjY3LDI2ICs3NDQsMjYgQEAKICAgICAgICAgICAgIHAubGluZVRvKHgwLCB5MCk7CiAgICAgICAgICAgICBwLmxpbmVUbyh4MiwgeTIpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3dpdGNoKGpvaW4pIHsKLSAgICAgICAgICAgIGNhc2UgSk9JTl9CRVZFTDoKLSAgICAgICAgICAgICAgICBwLmxpbmVUbyh4MiwgeTIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBKT0lOX01JVEVSOgotICAgICAgICAgICAgICAgIGRvdWJsZSBzMSA9IHgxICogeDEwICsgeTEgKiB5MTA7Ci0gICAgICAgICAgICAgICAgZG91YmxlIHMyID0geDIgKiB4MjAgKyB5MiAqIHkyMDsKLSAgICAgICAgICAgICAgICBkb3VibGUgeDMgPSAoczEgKiB5MjAgLSBzMiAqIHkxMCkgLyBzaW4wOwotICAgICAgICAgICAgICAgIGRvdWJsZSB5MyA9IChzMiAqIHgxMCAtIHMxICogeDIwKSAvIHNpbjA7Ci0gICAgICAgICAgICAgICAgZG91YmxlIHgzMCA9IHgzIC0geDA7Ci0gICAgICAgICAgICAgICAgZG91YmxlIHkzMCA9IHkzIC0geTA7Ci0gICAgICAgICAgICAgICAgZG91YmxlIG1pdGVyTGVuZ3RoID0gTWF0aC5zcXJ0KHgzMCAqIHgzMCArIHkzMCAqIHkzMCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1pdGVyTGVuZ3RoIDwgbWl0ZXJMaW1pdCAqIHcyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHAubGluZVRvKHgzLCB5Myk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHAubGluZVRvKHgyLCB5Mik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEpPSU5fUk9VTkQ6Ci0gICAgICAgICAgICAgICAgYWRkUm91bmRKb2luKHAsIHgwLCB5MCwgeDIsIHkyLCBpc0xlZnQpOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgc3dpdGNoIChqb2luKSB7CisgICAgICAgICAgICAgICAgY2FzZSBKT0lOX0JFVkVMOgorICAgICAgICAgICAgICAgICAgICBwLmxpbmVUbyh4MiwgeTIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEpPSU5fTUlURVI6CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBzMSA9IHgxICogeDEwICsgeTEgKiB5MTA7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBzMiA9IHgyICogeDIwICsgeTIgKiB5MjA7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB4MyA9IChzMSAqIHkyMCAtIHMyICogeTEwKSAvIHNpbjA7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB5MyA9IChzMiAqIHgxMCAtIHMxICogeDIwKSAvIHNpbjA7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB4MzAgPSB4MyAtIHgwOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgeTMwID0geTMgLSB5MDsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1pdGVyTGVuZ3RoID0gTWF0aC5zcXJ0KHgzMCAqIHgzMCArIHkzMCAqIHkzMCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtaXRlckxlbmd0aCA8IG1pdGVyTGltaXQgKiB3MikgeworICAgICAgICAgICAgICAgICAgICAgICAgcC5saW5lVG8oeDMsIHkzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwLmxpbmVUbyh4MiwgeTIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEpPSU5fUk9VTkQ6CisgICAgICAgICAgICAgICAgICAgIGFkZFJvdW5kSm9pbihwLCB4MCwgeTAsIHgyLCB5MiwgaXNMZWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC02OTQsMTIgKzc3MSwxOSBAQAogICAgIC8qKgogICAgICAqIEFkZHMgcm91bmQgam9pbiB0byB0aGUgd29yayBwYXRoLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwIC0gdGhlIEJ1ZmZlcmVkUGF0aCBvYmplY3Qgb2Ygd29yayBwYXRoCi0gICAgICogQHBhcmFtIHgwIC0gdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc291cmNlIHBhdGgKLSAgICAgKiBAcGFyYW0geTAgLSB0aGUgeSBjb29yZGluYXRlIG9uIHRoZSBzb3VyY2UgcGF0aAotICAgICAqIEBwYXJhbSB4MiAtIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIG5leHQgcG9pbnQgb24gdGhlIHdvcmsgcGF0aAotICAgICAqIEBwYXJhbSB5MiAtIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIG5leHQgcG9pbnQgb24gdGhlIHdvcmsgcGF0aAotICAgICAqIEBwYXJhbSBpc0xlZnQgLSB0aGUgb3JpZW50YXRpb24gb2Ygd29yayBwYXRoLCB0cnVlIGlmIHdvcmsgcGF0aCBsaWVzIHRvIHRoZSBsZWZ0IGZyb20gc291cmNlIHBhdGgsIGZhbHNlIG90aGVyd2lzZQorICAgICAqIEBwYXJhbSBwCisgICAgICogICAgICAgICAgICB0aGUgQnVmZmVyZWRQYXRoIG9iamVjdCBvZiB3b3JrIHBhdGguCisgICAgICogQHBhcmFtIHgwCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzb3VyY2UgcGF0aC4KKyAgICAgKiBAcGFyYW0geTAKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb24gdGhlIHNvdXJjZSBwYXRoLgorICAgICAqIEBwYXJhbSB4MgorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgbmV4dCBwb2ludCBvbiB0aGUgd29yayBwYXRoLgorICAgICAqIEBwYXJhbSB5MgorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgbmV4dCBwb2ludCBvbiB0aGUgd29yayBwYXRoLgorICAgICAqIEBwYXJhbSBpc0xlZnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvcmllbnRhdGlvbiBvZiB3b3JrIHBhdGgsIHRydWUgaWYgd29yayBwYXRoIGxpZXMgdG8gdGhlCisgICAgICogICAgICAgICAgICBsZWZ0IGZyb20gc291cmNlIHBhdGgsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICB2b2lkIGFkZFJvdW5kSm9pbihCdWZmZXJlZFBhdGggcCwgZG91YmxlIHgwLCBkb3VibGUgeTAsIGRvdWJsZSB4MiwgZG91YmxlIHkyLCBib29sZWFuIGlzTGVmdCkgewogICAgICAgICBkb3VibGUgeDEgPSBwLnhMYXN0OwpAQCAtNzYzLDExICs4NDcsMTYgQEAKICAgICAvKioKICAgICAgKiBBZGRzIHNvbGlkIGxpbmUgc2VnbWVudCB0byB0aGUgd29yayBwYXRoLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4MSAtIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0IGxpbmUgcG9pbnQKLSAgICAgKiBAcGFyYW0geTEgLSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydCBsaW5lIHBvaW50Ci0gICAgICogQHBhcmFtIHgyIC0gdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIGxpbmUgcG9pbnQKLSAgICAgKiBAcGFyYW0geTIgLSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgbGluZSBwb2ludAotICAgICAqIEBwYXJhbSB6ZXJvIC0gaWYgdHJ1ZSBpdCdzIGFsbG93YWJsZSB0byBhZGQgemVybyBsZW5ndGggbGluZSBzZWdtZW50CisgICAgICogQHBhcmFtIHgxCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydCBsaW5lIHBvaW50LgorICAgICAqIEBwYXJhbSB5MQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnQgbGluZSBwb2ludC4KKyAgICAgKiBAcGFyYW0geDIKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBsaW5lIHBvaW50LgorICAgICAqIEBwYXJhbSB5MgorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIGxpbmUgcG9pbnQuCisgICAgICogQHBhcmFtIHplcm8KKyAgICAgKiAgICAgICAgICAgIGlmIHRydWUgaXQncyBhbGxvd2FibGUgdG8gYWRkIHplcm8gbGVuZ3RoIGxpbmUgc2VnbWVudC4KICAgICAgKi8KICAgICB2b2lkIGFkZExpbmUoZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSB4MiwgZG91YmxlIHkyLCBib29sZWFuIHplcm8pIHsKICAgICAgICAgZG91YmxlIGR4ID0geDIgLSB4MTsKQEAgLTgwOCwxMiArODk3LDE4IEBACiAgICAgLyoqCiAgICAgICogQWRkcyBzb2xpZCBxdWFkIHNlZ21lbnQgdG8gdGhlIHdvcmsgcGF0aC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geDEgLSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHkxIC0gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSB4MiAtIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHkyIC0gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0geDMgLSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB0aGlyZCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHkzIC0gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdGhpcmQgY29udHJvbCBwb2ludAorICAgICAqIEBwYXJhbSB4MQorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0geTEKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuCisgICAgICogQHBhcmFtIHgyCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0geTIKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSB4MworICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdGhpcmQgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0geTMKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHRoaXJkIGNvbnRyb2wgcG9pbnQuCiAgICAgICovCiAgICAgdm9pZCBhZGRRdWFkKGRvdWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUgeDIsIGRvdWJsZSB5MiwgZG91YmxlIHgzLCBkb3VibGUgeTMpIHsKICAgICAgICAgZG91YmxlIHgyMSA9IHgyIC0geDE7CkBAIC04NDEsMTEgKzkzNiwxMSBAQAogCiAgICAgICAgIGRvdWJsZSB3OwogICAgICAgICB3ID0gdzIgLyBsMjE7Ci0gICAgICAgIGRvdWJsZSBteDEgPSAtIHkyMSAqIHc7Ci0gICAgICAgIGRvdWJsZSBteTEgPSAgIHgyMSAqIHc7CisgICAgICAgIGRvdWJsZSBteDEgPSAteTIxICogdzsKKyAgICAgICAgZG91YmxlIG15MSA9IHgyMSAqIHc7CiAgICAgICAgIHcgPSB3MiAvIGwyMzsKLSAgICAgICAgZG91YmxlIG14MyA9ICAgeTIzICogdzsKLSAgICAgICAgZG91YmxlIG15MyA9IC0geDIzICogdzsKKyAgICAgICAgZG91YmxlIG14MyA9IHkyMyAqIHc7CisgICAgICAgIGRvdWJsZSBteTMgPSAteDIzICogdzsKIAogICAgICAgICBkb3VibGUgbHgxID0geDEgKyBteDE7CiAgICAgICAgIGRvdWJsZSBseTEgPSB5MSArIG15MTsKQEAgLTkwMywxNSArOTk4LDIzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU3ViZGl2aWRlcyBzb2xpZCBxdWFkIGN1cnZlIHRvIG1ha2Ugb3V0bGluZSBmb3Igc291cmNlIHF1YWQgc2VnbWVudCBhbmQgYWRkcyBpdCB0byB3b3JrIHBhdGguCisgICAgICogU3ViZGl2aWRlcyBzb2xpZCBxdWFkIGN1cnZlIHRvIG1ha2Ugb3V0bGluZSBmb3Igc291cmNlIHF1YWQgc2VnbWVudCBhbmQKKyAgICAgKiBhZGRzIGl0IHRvIHdvcmsgcGF0aC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geDEgLSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHkxIC0gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSB4MiAtIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHkyIC0gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0geDMgLSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB0aGlyZCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHkzIC0gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdGhpcmQgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSBsZXZlbCAtIHRoZSBtYXhpbXVtIGxldmVsIG9mIHN1YmRpdmlzaW9uIGRlZXBuZXNzCisgICAgICogQHBhcmFtIHgxCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSB5MQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0geDIKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSB5MgorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuCisgICAgICogQHBhcmFtIHgzCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB0aGlyZCBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSB5MworICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdGhpcmQgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0gbGV2ZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIGxldmVsIG9mIHN1YmRpdmlzaW9uIGRlZXBuZXNzLgogICAgICAqLwogICAgIHZvaWQgYWRkU3ViUXVhZChkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIHgyLCBkb3VibGUgeTIsIGRvdWJsZSB4MywgZG91YmxlIHkzLCBpbnQgbGV2ZWwpIHsKICAgICAgICAgZG91YmxlIHgyMSA9IHgyIC0geDE7CkBAIC05MzksOCArMTA0Miw4IEBACiAgICAgICAgICAgICBkb3VibGUgbXgyID0gKHgyMSAqIGwyMyArIHgyMyAqIGwyMSkgKiB3OwogICAgICAgICAgICAgZG91YmxlIG15MiA9ICh5MjEgKiBsMjMgKyB5MjMgKiBsMjEpICogdzsKICAgICAgICAgICAgIHcgPSB3MiAvIGwyMzsKLSAgICAgICAgICAgIGRvdWJsZSBteDMgPSAgIHkyMyAqIHc7Ci0gICAgICAgICAgICBkb3VibGUgbXkzID0gLSB4MjMgKiB3OworICAgICAgICAgICAgZG91YmxlIG14MyA9IHkyMyAqIHc7CisgICAgICAgICAgICBkb3VibGUgbXkzID0gLXgyMyAqIHc7CiAgICAgICAgICAgICBscC5xdWFkVG8oeDIgKyBteDIsIHkyICsgbXkyLCB4MyArIG14MywgeTMgKyBteTMpOwogICAgICAgICAgICAgcnAucXVhZFRvKHgyIC0gbXgyLCB5MiAtIG15MiwgeDMgLSBteDMsIHkzIC0gbXkzKTsKICAgICAgICAgfQpAQCAtOTQ5LDE2ICsxMDUyLDI1IEBACiAgICAgLyoqCiAgICAgICogQWRkcyBzb2xpZCBjdWJpYyBzZWdtZW50IHRvIHRoZSB3b3JrIHBhdGguCiAgICAgICogCi0gICAgICogQHBhcmFtIHgxIC0gdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSB5MSAtIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0geDIgLSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSB5MiAtIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHgzIC0gdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdGhpcmQgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSB5MyAtIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHRoaXJkIGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0geDQgLSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBmb3VycyBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHk0IC0gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZm91cnMgY29udHJvbCBwb2ludAorICAgICAqIEBwYXJhbSB4MQorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0geTEKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuCisgICAgICogQHBhcmFtIHgyCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0geTIKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSB4MworICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdGhpcmQgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0geTMKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHRoaXJkIGNvbnRyb2wgcG9pbnQuCisgICAgICogQHBhcmFtIHg0CisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBmb3VycyBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSB5NAorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZm91cnMgY29udHJvbCBwb2ludC4KICAgICAgKi8KLSAgICB2b2lkIGFkZEN1YmljKGRvdWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUgeDIsIGRvdWJsZSB5MiwgZG91YmxlIHgzLCBkb3VibGUgeTMsIGRvdWJsZSB4NCwgZG91YmxlIHk0KSB7CisgICAgdm9pZCBhZGRDdWJpYyhkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIHgyLCBkb3VibGUgeTIsIGRvdWJsZSB4MywgZG91YmxlIHkzLCBkb3VibGUgeDQsCisgICAgICAgICAgICBkb3VibGUgeTQpIHsKICAgICAgICAgZG91YmxlIHgxMiA9IHgxIC0geDI7CiAgICAgICAgIGRvdWJsZSB5MTIgPSB5MSAtIHkyOwogICAgICAgICBkb3VibGUgeDIzID0geDIgLSB4MzsKQEAgLTk5NywzNSArMTEwOSwzMiBAQAogCiAgICAgICAgIGlmIChsMTIgPT0gMC4wKSB7CiAgICAgICAgICAgICB3ID0gdzIgLyBsMjM7Ci0gICAgICAgICAgICBteDEgPSAgIHkyMyAqIHc7Ci0gICAgICAgICAgICBteTEgPSAtIHgyMyAqIHc7CisgICAgICAgICAgICBteDEgPSB5MjMgKiB3OworICAgICAgICAgICAgbXkxID0gLXgyMyAqIHc7CiAgICAgICAgICAgICB3ID0gdzIgLyBsMzQ7Ci0gICAgICAgICAgICBteDQgPSAgIHkzNCAqIHc7Ci0gICAgICAgICAgICBteTQgPSAtIHgzNCAqIHc7Ci0gICAgICAgICAgICBvbkxpbmUgPSAtIHgyMyAqIHkzNCArIHkyMyAqIHgzNCA9PSAwLjA7IC8vIHNpbjMKLSAgICAgICAgfSBlbHNlCi0gICAgICAgIGlmIChsMzQgPT0gMC4wKSB7CisgICAgICAgICAgICBteDQgPSB5MzQgKiB3OworICAgICAgICAgICAgbXk0ID0gLXgzNCAqIHc7CisgICAgICAgICAgICBvbkxpbmUgPSAteDIzICogeTM0ICsgeTIzICogeDM0ID09IDAuMDsgLy8gc2luMworICAgICAgICB9IGVsc2UgaWYgKGwzNCA9PSAwLjApIHsKICAgICAgICAgICAgIHcgPSB3MiAvIGwxMjsKLSAgICAgICAgICAgIG14MSA9ICAgeTEyICogdzsKLSAgICAgICAgICAgIG15MSA9IC0geDEyICogdzsKKyAgICAgICAgICAgIG14MSA9IHkxMiAqIHc7CisgICAgICAgICAgICBteTEgPSAteDEyICogdzsKICAgICAgICAgICAgIHcgPSB3MiAvIGwyMzsKLSAgICAgICAgICAgIG14NCA9ICAgeTIzICogdzsKLSAgICAgICAgICAgIG15NCA9IC0geDIzICogdzsKLSAgICAgICAgICAgIG9uTGluZSA9IC0geDEyICogeTIzICsgeTEyICogeDIzID09IDAuMDsgLy8gc2luMgorICAgICAgICAgICAgbXg0ID0geTIzICogdzsKKyAgICAgICAgICAgIG15NCA9IC14MjMgKiB3OworICAgICAgICAgICAgb25MaW5lID0gLXgxMiAqIHkyMyArIHkxMiAqIHgyMyA9PSAwLjA7IC8vIHNpbjIKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHcgPSB3MiAvIGwxMjsKLSAgICAgICAgICAgIG14MSA9ICAgeTEyICogdzsKLSAgICAgICAgICAgIG15MSA9IC0geDEyICogdzsKKyAgICAgICAgICAgIG14MSA9IHkxMiAqIHc7CisgICAgICAgICAgICBteTEgPSAteDEyICogdzsKICAgICAgICAgICAgIHcgPSB3MiAvIGwzNDsKLSAgICAgICAgICAgIG14NCA9ICAgeTM0ICogdzsKLSAgICAgICAgICAgIG15NCA9IC0geDM0ICogdzsKKyAgICAgICAgICAgIG14NCA9IHkzNCAqIHc7CisgICAgICAgICAgICBteTQgPSAteDM0ICogdzsKICAgICAgICAgICAgIGlmIChsMjMgPT0gMC4wKSB7Ci0gICAgICAgICAgICAgICAgb25MaW5lID0gLSB4MTIgKiB5MzQgKyB5MTIgKiB4MzQgPT0gMC4wOworICAgICAgICAgICAgICAgIG9uTGluZSA9IC14MTIgKiB5MzQgKyB5MTIgKiB4MzQgPT0gMC4wOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvbkxpbmUgPQotICAgICAgICAgICAgICAgICAgICAtIHgxMiAqIHkzNCArIHkxMiAqIHgzNCA9PSAwLjAgJiYKLSAgICAgICAgICAgICAgICAgICAgLSB4MTIgKiB5MjMgKyB5MTIgKiB4MjMgPT0gMC4wICYmIC8vIHNpbjIKLSAgICAgICAgICAgICAgICAgICAgLSB4MjMgKiB5MzQgKyB5MjMgKiB4MzQgPT0gMC4wOyAgIC8vIHNpbjMKKyAgICAgICAgICAgICAgICBvbkxpbmUgPSAteDEyICogeTM0ICsgeTEyICogeDM0ID09IDAuMCAmJiAteDEyICogeTIzICsgeTEyICogeDIzID09IDAuMCAmJiAvLyBzaW4yCisgICAgICAgICAgICAgICAgICAgICAgICAteDIzICogeTM0ICsgeTIzICogeDM0ID09IDAuMDsgLy8gc2luMwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTEwNjMsOCArMTE3Miw3IEBACiAgICAgICAgICAgICAgICAgaWYgKDAuMCA8IHQgJiYgdCA8IDEuMCkgewogICAgICAgICAgICAgICAgICAgICByb290c1tyYysrXSA9IHQ7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBpZiAoZCA+IDAuMCkgeworICAgICAgICAgICAgfSBlbHNlIGlmIChkID4gMC4wKSB7CiAgICAgICAgICAgICAgICAgZCA9IE1hdGguc3FydChkKTsKICAgICAgICAgICAgICAgICBkb3VibGUgeiA9IGwxMiArIGwzNCAtIGwyMyAtIGwyMzsKICAgICAgICAgICAgICAgICBkb3VibGUgdDsKQEAgLTEwODcsMTUgKzExOTUsMTUgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcm9vdHNbcmMrK10gPSAxLjA7CiAKLSAgICAgICAgICAgICAgICBkb3VibGUgYXggPSAtIHgzNCAtIHgxMiArIHgyMyArIHgyMzsKLSAgICAgICAgICAgICAgICBkb3VibGUgYXkgPSAtIHkzNCAtIHkxMiArIHkyMyArIHkyMzsKLSAgICAgICAgICAgICAgICBkb3VibGUgYnggPSAzLjAgKiAoLSB4MjMgKyB4MTIpOwotICAgICAgICAgICAgICAgIGRvdWJsZSBieSA9IDMuMCAqICgtIHkyMyArIHkxMik7Ci0gICAgICAgICAgICAgICAgZG91YmxlIGN4ID0gMy4wICogKC0geDEyKTsKLSAgICAgICAgICAgICAgICBkb3VibGUgY3kgPSAzLjAgKiAoLSB5MTIpOworICAgICAgICAgICAgICAgIGRvdWJsZSBheCA9IC14MzQgLSB4MTIgKyB4MjMgKyB4MjM7CisgICAgICAgICAgICAgICAgZG91YmxlIGF5ID0gLXkzNCAtIHkxMiArIHkyMyArIHkyMzsKKyAgICAgICAgICAgICAgICBkb3VibGUgYnggPSAzLjAgKiAoLXgyMyArIHgxMik7CisgICAgICAgICAgICAgICAgZG91YmxlIGJ5ID0gMy4wICogKC15MjMgKyB5MTIpOworICAgICAgICAgICAgICAgIGRvdWJsZSBjeCA9IDMuMCAqICgteDEyKTsKKyAgICAgICAgICAgICAgICBkb3VibGUgY3kgPSAzLjAgKiAoLXkxMik7CiAgICAgICAgICAgICAgICAgZG91YmxlIHhQcmV2ID0geDE7CiAgICAgICAgICAgICAgICAgZG91YmxlIHlQcmV2ID0geTE7Ci0gICAgICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHJjOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJjOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHQgPSByb290c1tpXTsKICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHB4ID0gdCAqICh0ICogKHQgKiBheCArIGJ4KSArIGN4KSArIHgxOwogICAgICAgICAgICAgICAgICAgICBkb3VibGUgcHkgPSB0ICogKHQgKiAodCAqIGF5ICsgYnkpICsgY3kpICsgeTE7CkBAIC0xMTA5LDggKzEyMTcsOCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHhQcmV2ID0gcHg7CiAgICAgICAgICAgICAgICAgICAgIHlQcmV2ID0gcHk7Ci0gICAgICAgICAgICAgICAgICAgIG14MSA9IC0gbXgxOwotICAgICAgICAgICAgICAgICAgICBteTEgPSAtIG15MTsKKyAgICAgICAgICAgICAgICAgICAgbXgxID0gLW14MTsKKyAgICAgICAgICAgICAgICAgICAgbXkxID0gLW15MTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGxwLmN1YmljVG8oeDIgKyBteDEsIHkyICsgbXkxLCB4MyArIG14NCwgeTMgKyBteTQsIHg0ICsgbXg0LCB5NCArIG15NCk7CkBAIC0xMTIyLDE5ICsxMjMwLDMwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU3ViZGl2aWRlcyBzb2xpZCBjdWJpYyBjdXJ2ZSB0byBtYWtlIG91dGxpbmUgZm9yIHNvdXJjZSBxdWFkIHNlZ21lbnQgYW5kIGFkZHMgaXQgdG8gd29yayBwYXRoLgorICAgICAqIFN1YmRpdmlkZXMgc29saWQgY3ViaWMgY3VydmUgdG8gbWFrZSBvdXRsaW5lIGZvciBzb3VyY2UgcXVhZCBzZWdtZW50IGFuZAorICAgICAqIGFkZHMgaXQgdG8gd29yayBwYXRoLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4MSAtIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0geTEgLSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHgyIC0gdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0geTIgLSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSB4MyAtIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHRoaXJkIGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0geTMgLSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSB0aGlyZCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHg0IC0gdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZm91cnMgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSB5NCAtIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGZvdXJzIGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0gbGV2ZWwgLSB0aGUgbWF4aW11bSBsZXZlbCBvZiBzdWJkaXZpc2lvbiBkZWVwbmVzcworICAgICAqIEBwYXJhbSB4MQorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0geTEKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuCisgICAgICogQHBhcmFtIHgyCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0geTIKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSB4MworICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdGhpcmQgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0geTMKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHRoaXJkIGNvbnRyb2wgcG9pbnQuCisgICAgICogQHBhcmFtIHg0CisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBmb3VycyBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSB5NAorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZm91cnMgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0gbGV2ZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIGxldmVsIG9mIHN1YmRpdmlzaW9uIGRlZXBuZXNzLgogICAgICAqLwotICAgIHZvaWQgYWRkU3ViQ3ViaWMoZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSB4MiwgZG91YmxlIHkyLCBkb3VibGUgeDMsIGRvdWJsZSB5MywgZG91YmxlIHg0LCBkb3VibGUgeTQsIGludCBsZXZlbCkgeworICAgIHZvaWQgYWRkU3ViQ3ViaWMoZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSB4MiwgZG91YmxlIHkyLCBkb3VibGUgeDMsIGRvdWJsZSB5MywgZG91YmxlIHg0LAorICAgICAgICAgICAgZG91YmxlIHk0LCBpbnQgbGV2ZWwpIHsKICAgICAgICAgZG91YmxlIHgxMiA9IHgxIC0geDI7CiAgICAgICAgIGRvdWJsZSB5MTIgPSB5MSAtIHkyOwogICAgICAgICBkb3VibGUgeDIzID0geDIgLSB4MzsKQEAgLTExNDIsMTkgKzEyNjEsMTggQEAKICAgICAgICAgZG91YmxlIHgzNCA9IHgzIC0geDQ7CiAgICAgICAgIGRvdWJsZSB5MzQgPSB5MyAtIHk0OwogCi0gICAgICAgIGRvdWJsZSBjb3MyID0gLSB4MTIgKiB4MjMgLSB5MTIgKiB5MjM7Ci0gICAgICAgIGRvdWJsZSBjb3MzID0gLSB4MjMgKiB4MzQgLSB5MjMgKiB5MzQ7Ci0gICAgICAgIGRvdWJsZSBzaW4yID0gLSB4MTIgKiB5MjMgKyB5MTIgKiB4MjM7Ci0gICAgICAgIGRvdWJsZSBzaW4zID0gLSB4MjMgKiB5MzQgKyB5MjMgKiB4MzQ7Ci0gICAgICAgIGRvdWJsZSBzaW4wID0gLSB4MTIgKiB5MzQgKyB5MTIgKiB4MzQ7Ci0gICAgICAgIGRvdWJsZSBjb3MwID0gLSB4MTIgKiB4MzQgLSB5MTIgKiB5MzQ7CisgICAgICAgIGRvdWJsZSBjb3MyID0gLXgxMiAqIHgyMyAtIHkxMiAqIHkyMzsKKyAgICAgICAgZG91YmxlIGNvczMgPSAteDIzICogeDM0IC0geTIzICogeTM0OworICAgICAgICBkb3VibGUgc2luMiA9IC14MTIgKiB5MjMgKyB5MTIgKiB4MjM7CisgICAgICAgIGRvdWJsZSBzaW4zID0gLXgyMyAqIHkzNCArIHkyMyAqIHgzNDsKKyAgICAgICAgZG91YmxlIHNpbjAgPSAteDEyICogeTM0ICsgeTEyICogeDM0OworICAgICAgICBkb3VibGUgY29zMCA9IC14MTIgKiB4MzQgLSB5MTIgKiB5MzQ7CiAKLSAgICAgICAgaWYgKGxldmVsIDwgTUFYX0xFVkVMICYmIChzaW4yICE9IDAuMCB8fCBzaW4zICE9IDAuMCB8fCBzaW4wICE9IDAuMCkgJiYKLSAgICAgICAgICAgIChjb3MyID49IDAuMCB8fCBjb3MzID49IDAuMCB8fCBjb3MwID49IDAuMCB8fAotICAgICAgICAgICAgKE1hdGguYWJzKHNpbjIgLyBjb3MyKSA+IGN1cnZlRGVsdGEpIHx8Ci0gICAgICAgICAgICAoTWF0aC5hYnMoc2luMyAvIGNvczMpID4gY3VydmVEZWx0YSkgfHwKLSAgICAgICAgICAgIChNYXRoLmFicyhzaW4wIC8gY29zMCkgPiBjdXJ2ZURlbHRhKSkpCi0gICAgICAgIHsKKyAgICAgICAgaWYgKGxldmVsIDwgTUFYX0xFVkVMCisgICAgICAgICAgICAgICAgJiYgKHNpbjIgIT0gMC4wIHx8IHNpbjMgIT0gMC4wIHx8IHNpbjAgIT0gMC4wKQorICAgICAgICAgICAgICAgICYmIChjb3MyID49IDAuMCB8fCBjb3MzID49IDAuMCB8fCBjb3MwID49IDAuMAorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKE1hdGguYWJzKHNpbjIgLyBjb3MyKSA+IGN1cnZlRGVsdGEpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoTWF0aC5hYnMoc2luMyAvIGNvczMpID4gY3VydmVEZWx0YSkgfHwgKE1hdGguYWJzKHNpbjAgLyBjb3MwKSA+IGN1cnZlRGVsdGEpKSkgewogICAgICAgICAgICAgZG91YmxlIGN4ID0gKHgyICsgeDMpIC8gMi4wOwogICAgICAgICAgICAgZG91YmxlIGN5ID0gKHkyICsgeTMpIC8gMi4wOwogICAgICAgICAgICAgZG91YmxlIGx4MiA9ICh4MiArIHgxKSAvIDIuMDsKQEAgLTExNzcsMjcgKzEyOTUsMjYgQEAKIAogICAgICAgICAgICAgaWYgKGwxMiA9PSAwLjApIHsKICAgICAgICAgICAgICAgICB3ID0gdzIgLyBsMjM7Ci0gICAgICAgICAgICAgICAgbXgxID0gICB5MjMgKiB3OwotICAgICAgICAgICAgICAgIG15MSA9IC0geDIzICogdzsKKyAgICAgICAgICAgICAgICBteDEgPSB5MjMgKiB3OworICAgICAgICAgICAgICAgIG15MSA9IC14MjMgKiB3OwogICAgICAgICAgICAgICAgIHcgPSB3MiAvIGwzNDsKLSAgICAgICAgICAgICAgICBteDQgPSAgIHkzNCAqIHc7Ci0gICAgICAgICAgICAgICAgbXk0ID0gLSB4MzQgKiB3OwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBpZiAobDM0ID09IDAuMCkgeworICAgICAgICAgICAgICAgIG14NCA9IHkzNCAqIHc7CisgICAgICAgICAgICAgICAgbXk0ID0gLXgzNCAqIHc7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGwzNCA9PSAwLjApIHsKICAgICAgICAgICAgICAgICB3ID0gdzIgLyBsMTI7Ci0gICAgICAgICAgICAgICAgbXgxID0gICB5MTIgKiB3OwotICAgICAgICAgICAgICAgIG15MSA9IC0geDEyICogdzsKKyAgICAgICAgICAgICAgICBteDEgPSB5MTIgKiB3OworICAgICAgICAgICAgICAgIG15MSA9IC14MTIgKiB3OwogICAgICAgICAgICAgICAgIHcgPSB3MiAvIGwyMzsKLSAgICAgICAgICAgICAgICBteDQgPSAgIHkyMyAqIHc7Ci0gICAgICAgICAgICAgICAgbXk0ID0gLSB4MjMgKiB3OworICAgICAgICAgICAgICAgIG14NCA9IHkyMyAqIHc7CisgICAgICAgICAgICAgICAgbXk0ID0gLXgyMyAqIHc7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIENvbW1vbiBjYXNlCiAgICAgICAgICAgICAgICAgdyA9IHcyIC8gbDEyOwotICAgICAgICAgICAgICAgIG14MSA9ICAgeTEyICogdzsKLSAgICAgICAgICAgICAgICBteTEgPSAtIHgxMiAqIHc7CisgICAgICAgICAgICAgICAgbXgxID0geTEyICogdzsKKyAgICAgICAgICAgICAgICBteTEgPSAteDEyICogdzsKICAgICAgICAgICAgICAgICB3ID0gdzIgLyBsMzQ7Ci0gICAgICAgICAgICAgICAgbXg0ID0gICB5MzQgKiB3OwotICAgICAgICAgICAgICAgIG15NCA9IC0geDM0ICogdzsKKyAgICAgICAgICAgICAgICBteDQgPSB5MzQgKiB3OworICAgICAgICAgICAgICAgIG15NCA9IC14MzQgKiB3OwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoc2luMiA9PSAwLjApIHsKQEAgLTEyMjUsMTAgKzEzNDIsMTQgQEAKICAgICAvKioKICAgICAgKiBBZGRzIGRhc2hlZCBsaW5lIHNlZ21lbnQgdG8gdGhlIHdvcmsgcGF0aC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geDEgLSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydCBsaW5lIHBvaW50Ci0gICAgICogQHBhcmFtIHkxIC0gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnQgbGluZSBwb2ludAotICAgICAqIEBwYXJhbSB4MiAtIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBsaW5lIHBvaW50Ci0gICAgICogQHBhcmFtIHkyIC0gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIGxpbmUgcG9pbnQKKyAgICAgKiBAcGFyYW0geDEKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0IGxpbmUgcG9pbnQuCisgICAgICogQHBhcmFtIHkxCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydCBsaW5lIHBvaW50LgorICAgICAqIEBwYXJhbSB4MgorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIGxpbmUgcG9pbnQuCisgICAgICogQHBhcmFtIHkyCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgbGluZSBwb2ludC4KICAgICAgKi8KICAgICB2b2lkIGFkZERhc2hMaW5lKGRvdWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUgeDIsIGRvdWJsZSB5MikgewogICAgICAgICBkb3VibGUgeDIxID0geDIgLSB4MTsKQEAgLTEyNDMsMTIgKzEzNjQsMTIgQEAKICAgICAgICAgZG91YmxlIHB4MSwgcHkxOwogICAgICAgICBweDEgPSBweTEgPSAwLjA7CiAgICAgICAgIGRvdWJsZSB3ID0gdzIgLyBsMjE7Ci0gICAgICAgIGRvdWJsZSBteCA9IC0geTIxICogdzsKLSAgICAgICAgZG91YmxlIG15ID0gICB4MjEgKiB3OworICAgICAgICBkb3VibGUgbXggPSAteTIxICogdzsKKyAgICAgICAgZG91YmxlIG15ID0geDIxICogdzsKIAogICAgICAgICBkYXNoZXIuaW5pdChuZXcgRGFzaEl0ZXJhdG9yLkxpbmUobDIxKSk7CiAKLSAgICAgICAgd2hpbGUoIWRhc2hlci5lb2YoKSkgeworICAgICAgICB3aGlsZSAoIWRhc2hlci5lb2YoKSkgewogICAgICAgICAgICAgZG91YmxlIHQgPSBkYXNoZXIuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgIHNjeCA9IHgxICsgdCAqIHgyMTsKICAgICAgICAgICAgIHNjeSA9IHkxICsgdCAqIHkyMTsKQEAgLTEyNzEsMjggKzEzOTIsMjcgQEAKICAgICAgICAgICAgICAgICAgICAgYWRkSm9pbihscCwgeDEsIHkxLCBseDEsIGx5MSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgIGFkZEpvaW4ocnAsIHgxLCB5MSwgcngxLCByeTEsIGZhbHNlKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBpZiAoZGFzaGVyLmlzQ29udGludWUoKSkgewotICAgICAgICAgICAgICAgICAgICBkb3VibGUgcHgyID0gc2N4OwotICAgICAgICAgICAgICAgICAgICBkb3VibGUgcHkyID0gc2N5OwotICAgICAgICAgICAgICAgICAgICBscC5saW5lVG8ocHgyICsgbXgsIHB5MiArIG15KTsKLSAgICAgICAgICAgICAgICAgICAgcnAubGluZVRvKHB4MiAtIG14LCBweTIgLSBteSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkYXNoZXIuY2xvc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZENhcChscCwgcHgyLCBweTIsIHJwLnhMYXN0LCBycC55TGFzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBscC5jb21iaW5lKHJwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0ZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNGaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZteCA9IHNteDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXkgPSBzbXk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3AgPSBscDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBscCA9IG5ldyBCdWZmZXJlZFBhdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkQ2FwKGxwLCBzbXgsIHNteSwgbHAueE1vdmUsIGxwLnlNb3ZlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC5jbG9zZVBhdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlzTW92ZSA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRhc2hlci5pc0NvbnRpbnVlKCkpIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgcHgyID0gc2N4OworICAgICAgICAgICAgICAgIGRvdWJsZSBweTIgPSBzY3k7CisgICAgICAgICAgICAgICAgbHAubGluZVRvKHB4MiArIG14LCBweTIgKyBteSk7CisgICAgICAgICAgICAgICAgcnAubGluZVRvKHB4MiAtIG14LCBweTIgLSBteSk7CisgICAgICAgICAgICAgICAgaWYgKGRhc2hlci5jbG9zZSkgeworICAgICAgICAgICAgICAgICAgICBhZGRDYXAobHAsIHB4MiwgcHkyLCBycC54TGFzdCwgcnAueUxhc3QpOworICAgICAgICAgICAgICAgICAgICBscC5jb21iaW5lKHJwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzRmlyc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzRmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZteCA9IHNteDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZteSA9IHNteTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwID0gbHA7CisgICAgICAgICAgICAgICAgICAgICAgICBscCA9IG5ldyBCdWZmZXJlZFBhdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZENhcChscCwgc214LCBzbXksIGxwLnhNb3ZlLCBscC55TW92ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBscC5jbG9zZVBhdGgoKTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpc01vdmUgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgZGFzaGVyLm5leHQoKTsKICAgICAgICAgfQpAQCAtMTMwMSwxMiArMTQyMSwxOCBAQAogICAgIC8qKgogICAgICAqIEFkZHMgZGFzaGVkIHF1YWQgc2VnbWVudCB0byB0aGUgd29yayBwYXRoLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4MSAtIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0geTEgLSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHgyIC0gdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0geTIgLSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSB4MyAtIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHRoaXJkIGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0geTMgLSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSB0aGlyZCBjb250cm9sIHBvaW50CisgICAgICogQHBhcmFtIHgxCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSB5MQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0geDIKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSB5MgorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuCisgICAgICogQHBhcmFtIHgzCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB0aGlyZCBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSB5MworICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdGhpcmQgY29udHJvbCBwb2ludC4KICAgICAgKi8KICAgICB2b2lkIGFkZERhc2hRdWFkKGRvdWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUgeDIsIGRvdWJsZSB5MiwgZG91YmxlIHgzLCBkb3VibGUgeTMpIHsKIApAQCAtMTM0NSw3ICsxNDcxLDcgQEAKIAogICAgICAgICBkYXNoZXIuaW5pdChuZXcgRGFzaEl0ZXJhdG9yLlF1YWQoeDEsIHkxLCB4MiwgeTIsIHgzLCB5MykpOwogCi0gICAgICAgIHdoaWxlKCFkYXNoZXIuZW9mKCkpIHsKKyAgICAgICAgd2hpbGUgKCFkYXNoZXIuZW9mKCkpIHsKICAgICAgICAgICAgIGRvdWJsZSB0ID0gZGFzaGVyLmdldFZhbHVlKCk7CiAgICAgICAgICAgICBkb3VibGUgZHggPSB0ICogYXggKyBieDsKICAgICAgICAgICAgIGRvdWJsZSBkeSA9IHQgKiBheSArIGJ5OwpAQCAtMTM1Nyw4ICsxNDgzLDggQEAKICAgICAgICAgICAgICAgICBkeDEgPSBkeDsKICAgICAgICAgICAgICAgICBkeTEgPSBkeTsKICAgICAgICAgICAgICAgICBkb3VibGUgdyA9IHcyIC8gTWF0aC5zcXJ0KGR4MSAqIGR4MSArIGR5MSAqIGR5MSk7Ci0gICAgICAgICAgICAgICAgZG91YmxlIG14MSA9IC0gZHkxICogdzsKLSAgICAgICAgICAgICAgICBkb3VibGUgbXkxID0gICBkeDEgKiB3OworICAgICAgICAgICAgICAgIGRvdWJsZSBteDEgPSAtZHkxICogdzsKKyAgICAgICAgICAgICAgICBkb3VibGUgbXkxID0gZHgxICogdzsKICAgICAgICAgICAgICAgICBkb3VibGUgbHgxID0gcHgxICsgbXgxOwogICAgICAgICAgICAgICAgIGRvdWJsZSBseTEgPSBweTEgKyBteTE7CiAgICAgICAgICAgICAgICAgZG91YmxlIHJ4MSA9IHB4MSAtIG14MTsKQEAgLTEzNzQsMzMgKzE1MDAsMzIgQEAKICAgICAgICAgICAgICAgICAgICAgYWRkSm9pbihscCwgeDEsIHkxLCBseDEsIGx5MSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgIGFkZEpvaW4ocnAsIHgxLCB5MSwgcngxLCByeTEsIGZhbHNlKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgCi0gICAgICAgICAgICAgICAgaWYgKGRhc2hlci5pc0NvbnRpbnVlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlIHB4MyA9IHNjeDsKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlIHB5MyA9IHNjeTsKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlIHN4ID0geDIgLSB4MjMgKiBwcmV2OwotICAgICAgICAgICAgICAgICAgICBkb3VibGUgc3kgPSB5MiAtIHkyMyAqIHByZXY7Ci0gICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0MiA9ICh0IC0gcHJldikgLyAoMSAtIHByZXYpOwotICAgICAgICAgICAgICAgICAgICBkb3VibGUgcHgyID0gcHgxICsgKHN4IC0gcHgxKSAqIHQyOwotICAgICAgICAgICAgICAgICAgICBkb3VibGUgcHkyID0gcHkxICsgKHN5IC0gcHkxKSAqIHQyOworICAgICAgICAgICAgfSBlbHNlIGlmIChkYXNoZXIuaXNDb250aW51ZSgpKSB7CisgICAgICAgICAgICAgICAgZG91YmxlIHB4MyA9IHNjeDsKKyAgICAgICAgICAgICAgICBkb3VibGUgcHkzID0gc2N5OworICAgICAgICAgICAgICAgIGRvdWJsZSBzeCA9IHgyIC0geDIzICogcHJldjsKKyAgICAgICAgICAgICAgICBkb3VibGUgc3kgPSB5MiAtIHkyMyAqIHByZXY7CisgICAgICAgICAgICAgICAgZG91YmxlIHQyID0gKHQgLSBwcmV2KSAvICgxIC0gcHJldik7CisgICAgICAgICAgICAgICAgZG91YmxlIHB4MiA9IHB4MSArIChzeCAtIHB4MSkgKiB0MjsKKyAgICAgICAgICAgICAgICBkb3VibGUgcHkyID0gcHkxICsgKHN5IC0gcHkxKSAqIHQyOwogCi0gICAgICAgICAgICAgICAgICAgIGFkZFF1YWQocHgxLCBweTEsIHB4MiwgcHkyLCBweDMsIHB5Myk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkYXNoZXIuaXNDbG9zZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkQ2FwKGxwLCBweDMsIHB5MywgcnAueExhc3QsIHJwLnlMYXN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxwLmNvbWJpbmUocnApOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0ZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm14ID0gc214OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZteSA9IHNteTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcCA9IGxwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwID0gbmV3IEJ1ZmZlcmVkUGF0aCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRDYXAobHAsIHNteCwgc215LCBscC54TW92ZSwgbHAueU1vdmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLmNsb3NlUGF0aCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaXNNb3ZlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBhZGRRdWFkKHB4MSwgcHkxLCBweDIsIHB5MiwgcHgzLCBweTMpOworICAgICAgICAgICAgICAgIGlmIChkYXNoZXIuaXNDbG9zZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBhZGRDYXAobHAsIHB4MywgcHkzLCBycC54TGFzdCwgcnAueUxhc3QpOworICAgICAgICAgICAgICAgICAgICBscC5jb21iaW5lKHJwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzRmlyc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzRmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZteCA9IHNteDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZteSA9IHNteTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwID0gbHA7CisgICAgICAgICAgICAgICAgICAgICAgICBscCA9IG5ldyBCdWZmZXJlZFBhdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZENhcChscCwgc214LCBzbXksIGxwLnhNb3ZlLCBscC55TW92ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBscC5jbG9zZVBhdGgoKTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpc01vdmUgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcHJldiA9IHQ7CiAgICAgICAgICAgICBkYXNoZXIubmV4dCgpOwpAQCAtMTQxMCwxNiArMTUzNSwyNSBAQAogICAgIC8qKgogICAgICAqIEFkZHMgZGFzaGVkIGN1YmljIHNlZ21lbnQgdG8gdGhlIHdvcmsgcGF0aC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geDEgLSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHkxIC0gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSB4MiAtIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHkyIC0gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0geDMgLSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB0aGlyZCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHkzIC0gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdGhpcmQgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSB4NCAtIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGZvdXJzIGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0geTQgLSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBmb3VycyBjb250cm9sIHBvaW50CisgICAgICogQHBhcmFtIHgxCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSB5MQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0geDIKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSB5MgorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuCisgICAgICogQHBhcmFtIHgzCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB0aGlyZCBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSB5MworICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdGhpcmQgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0geDQKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGZvdXJzIGNvbnRyb2wgcG9pbnQuCisgICAgICogQHBhcmFtIHk0CisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBmb3VycyBjb250cm9sIHBvaW50LgogICAgICAqLwotICAgIHZvaWQgYWRkRGFzaEN1YmljKGRvdWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUgeDIsIGRvdWJsZSB5MiwgZG91YmxlIHgzLCBkb3VibGUgeTMsIGRvdWJsZSB4NCwgZG91YmxlIHk0KSB7CisgICAgdm9pZCBhZGREYXNoQ3ViaWMoZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSB4MiwgZG91YmxlIHkyLCBkb3VibGUgeDMsIGRvdWJsZSB5MywgZG91YmxlIHg0LAorICAgICAgICAgICAgZG91YmxlIHk0KSB7CiAKICAgICAgICAgZG91YmxlIHgxMiA9IHgxIC0geDI7CiAgICAgICAgIGRvdWJsZSB5MTIgPSB5MSAtIHkyOwpAQCAtMTQ2OSw3ICsxNjAzLDcgQEAKIAogICAgICAgICBkYXNoZXIuaW5pdChuZXcgRGFzaEl0ZXJhdG9yLkN1YmljKHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHg0LCB5NCkpOwogCi0gICAgICAgIHdoaWxlKCFkYXNoZXIuZW9mKCkpIHsKKyAgICAgICAgd2hpbGUgKCFkYXNoZXIuZW9mKCkpIHsKIAogICAgICAgICAgICAgZG91YmxlIHQgPSBkYXNoZXIuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgIHNjeCA9IHQgKiAodCAqICh0ICogYXggKyBieCkgKyBjeCkgKyBkeDsKQEAgLTE0ODAsOCArMTYxNCw4IEBACiAgICAgICAgICAgICAgICAgZG91YmxlIGR4MSA9IHQgKiAodCAqIChheCArIGF4ICsgYXgpICsgYnggKyBieCkgKyBjeDsKICAgICAgICAgICAgICAgICBkb3VibGUgZHkxID0gdCAqICh0ICogKGF5ICsgYXkgKyBheSkgKyBieSArIGJ5KSArIGN5OwogICAgICAgICAgICAgICAgIGRvdWJsZSB3ID0gdzIgLyBNYXRoLnNxcnQoZHgxICogZHgxICsgZHkxICogZHkxKTsKLSAgICAgICAgICAgICAgICBkb3VibGUgbXgxID0gLSBkeTEgKiB3OwotICAgICAgICAgICAgICAgIGRvdWJsZSBteTEgPSAgIGR4MSAqIHc7CisgICAgICAgICAgICAgICAgZG91YmxlIG14MSA9IC1keTEgKiB3OworICAgICAgICAgICAgICAgIGRvdWJsZSBteTEgPSBkeDEgKiB3OwogICAgICAgICAgICAgICAgIGRvdWJsZSBseDEgPSBweDEgKyBteDE7CiAgICAgICAgICAgICAgICAgZG91YmxlIGx5MSA9IHB5MSArIG15MTsKICAgICAgICAgICAgICAgICBkb3VibGUgcngxID0gcHgxIC0gbXgxOwpAQCAtMTQ5Nyw0MiArMTYzMSw0MSBAQAogICAgICAgICAgICAgICAgICAgICBhZGRKb2luKGxwLCB4MSwgeTEsIGx4MSwgbHkxLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgYWRkSm9pbihycCwgeDEsIHkxLCByeDEsIHJ5MSwgZmFsc2UpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSAKLSAgICAgICAgICAgICAgICBpZiAoZGFzaGVyLmlzQ29udGludWUoKSkgewotICAgICAgICAgICAgICAgICAgICBkb3VibGUgc3gxID0geDIgLSB4MjMgKiBwcmV2OwotICAgICAgICAgICAgICAgICAgICBkb3VibGUgc3kxID0geTIgLSB5MjMgKiBwcmV2OwotICAgICAgICAgICAgICAgICAgICBkb3VibGUgc3gyID0geDMgLSB4MzQgKiBwcmV2OwotICAgICAgICAgICAgICAgICAgICBkb3VibGUgc3kyID0geTMgLSB5MzQgKiBwcmV2OwotICAgICAgICAgICAgICAgICAgICBkb3VibGUgc3gzID0gc3gxICsgKHN4MiAtIHN4MSkgKiBwcmV2OwotICAgICAgICAgICAgICAgICAgICBkb3VibGUgc3kzID0gc3kxICsgKHN5MiAtIHN5MSkgKiBwcmV2OwotICAgICAgICAgICAgICAgICAgICBkb3VibGUgdDIgPSAodCAtIHByZXYpIC8gKDEgLSBwcmV2KTsKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlIHN4NCA9IHN4MyArIChzeDIgLSBzeDMpICogdDI7Ci0gICAgICAgICAgICAgICAgICAgIGRvdWJsZSBzeTQgPSBzeTMgKyAoc3kyIC0gc3kzKSAqIHQyOworICAgICAgICAgICAgfSBlbHNlIGlmIChkYXNoZXIuaXNDb250aW51ZSgpKSB7CisgICAgICAgICAgICAgICAgZG91YmxlIHN4MSA9IHgyIC0geDIzICogcHJldjsKKyAgICAgICAgICAgICAgICBkb3VibGUgc3kxID0geTIgLSB5MjMgKiBwcmV2OworICAgICAgICAgICAgICAgIGRvdWJsZSBzeDIgPSB4MyAtIHgzNCAqIHByZXY7CisgICAgICAgICAgICAgICAgZG91YmxlIHN5MiA9IHkzIC0geTM0ICogcHJldjsKKyAgICAgICAgICAgICAgICBkb3VibGUgc3gzID0gc3gxICsgKHN4MiAtIHN4MSkgKiBwcmV2OworICAgICAgICAgICAgICAgIGRvdWJsZSBzeTMgPSBzeTEgKyAoc3kyIC0gc3kxKSAqIHByZXY7CisgICAgICAgICAgICAgICAgZG91YmxlIHQyID0gKHQgLSBwcmV2KSAvICgxIC0gcHJldik7CisgICAgICAgICAgICAgICAgZG91YmxlIHN4NCA9IHN4MyArIChzeDIgLSBzeDMpICogdDI7CisgICAgICAgICAgICAgICAgZG91YmxlIHN5NCA9IHN5MyArIChzeTIgLSBzeTMpICogdDI7CiAKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlIHB4NCA9IHNjeDsKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlIHB5NCA9IHNjeTsKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlIHB4MiA9IHB4MSArIChzeDMgLSBweDEpICogdDI7Ci0gICAgICAgICAgICAgICAgICAgIGRvdWJsZSBweTIgPSBweTEgKyAoc3kzIC0gcHkxKSAqIHQyOwotICAgICAgICAgICAgICAgICAgICBkb3VibGUgcHgzID0gcHgyICsgKHN4NCAtIHB4MikgKiB0MjsKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlIHB5MyA9IHB5MiArIChzeTQgLSBweTIpICogdDI7CisgICAgICAgICAgICAgICAgZG91YmxlIHB4NCA9IHNjeDsKKyAgICAgICAgICAgICAgICBkb3VibGUgcHk0ID0gc2N5OworICAgICAgICAgICAgICAgIGRvdWJsZSBweDIgPSBweDEgKyAoc3gzIC0gcHgxKSAqIHQyOworICAgICAgICAgICAgICAgIGRvdWJsZSBweTIgPSBweTEgKyAoc3kzIC0gcHkxKSAqIHQyOworICAgICAgICAgICAgICAgIGRvdWJsZSBweDMgPSBweDIgKyAoc3g0IC0gcHgyKSAqIHQyOworICAgICAgICAgICAgICAgIGRvdWJsZSBweTMgPSBweTIgKyAoc3k0IC0gcHkyKSAqIHQyOwogCi0gICAgICAgICAgICAgICAgICAgIGFkZEN1YmljKHB4MSwgcHkxLCBweDIsIHB5MiwgcHgzLCBweTMsIHB4NCwgcHk0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRhc2hlci5pc0Nsb3NlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRDYXAobHAsIHB4NCwgcHk0LCBycC54TGFzdCwgcnAueUxhc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgbHAuY29tYmluZShycCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNGaXJzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXggPSBzbXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm15ID0gc215OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwID0gbHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAgPSBuZXcgQnVmZmVyZWRQYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZENhcChscCwgc214LCBzbXksIGxwLnhNb3ZlLCBscC55TW92ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAuY2xvc2VQYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc01vdmUgPSB0cnVlOworICAgICAgICAgICAgICAgIGFkZEN1YmljKHB4MSwgcHkxLCBweDIsIHB5MiwgcHgzLCBweTMsIHB4NCwgcHk0KTsKKyAgICAgICAgICAgICAgICBpZiAoZGFzaGVyLmlzQ2xvc2VkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkQ2FwKGxwLCBweDQsIHB5NCwgcnAueExhc3QsIHJwLnlMYXN0KTsKKyAgICAgICAgICAgICAgICAgICAgbHAuY29tYmluZShycCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0ZpcnN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpc0ZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmbXggPSBzbXg7CisgICAgICAgICAgICAgICAgICAgICAgICBmbXkgPSBzbXk7CisgICAgICAgICAgICAgICAgICAgICAgICBzcCA9IGxwOworICAgICAgICAgICAgICAgICAgICAgICAgbHAgPSBuZXcgQnVmZmVyZWRQYXRoKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRDYXAobHAsIHNteCwgc215LCBscC54TW92ZSwgbHAueU1vdmUpOworICAgICAgICAgICAgICAgICAgICAgICAgbHAuY2xvc2VQYXRoKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaXNNb3ZlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHByZXYgPSB0OwogICAgICAgICAgICAgZGFzaGVyLm5leHQoKTsKQEAgLTE1NDMsMzAgKzE2NzYsNDQgQEAKICAgICAgKiBEYXNoZXIgY2xhc3MgcHJvdmlkZXMgZGFzaGluZyBmb3IgcGFydGljdWxhciBkYXNoIHN0eWxlLgogICAgICAqLwogICAgIGNsYXNzIERhc2hlciB7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHBvcy4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHBvcy4KKyAgICAgICAgICovCiAgICAgICAgIGRvdWJsZSBwb3M7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIGZpcnN0LiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZmlyc3QuCisgICAgICAgICAqLwogICAgICAgICBib29sZWFuIGNsb3NlLCB2aXNpYmxlLCBmaXJzdDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgZGFzaC4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRhc2guCisgICAgICAgICAqLwogICAgICAgICBmbG9hdCBkYXNoW107Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHBoYXNlLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcGhhc2UuCisgICAgICAgICAqLwogICAgICAgICBmbG9hdCBwaGFzZTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgaW5kZXguICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBpbmRleC4KKyAgICAgICAgICovCiAgICAgICAgIGludCBpbmRleDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgaXRlci4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGl0ZXIuCisgICAgICAgICAqLwogICAgICAgICBEYXNoSXRlcmF0b3IgaXRlcjsKLSAgICAgICAgCisKICAgICAgICAgLyoqCiAgICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkYXNoZXIuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gZGFzaCB0aGUgZGFzaAotICAgICAgICAgKiBAcGFyYW0gcGhhc2UgdGhlIHBoYXNlCisgICAgICAgICAqIEBwYXJhbSBkYXNoCisgICAgICAgICAqICAgICAgICAgICAgdGhlIGRhc2guCisgICAgICAgICAqIEBwYXJhbSBwaGFzZQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBwaGFzZS4KICAgICAgICAgICovCiAgICAgICAgIERhc2hlcihmbG9hdCBkYXNoW10sIGZsb2F0IHBoYXNlKSB7CiAgICAgICAgICAgICB0aGlzLmRhc2ggPSBkYXNoOwpAQCAtMTU3OCw1MiArMTcyNSw1MyBAQAogICAgICAgICAgICAgICAgIHZpc2libGUgPSAhdmlzaWJsZTsKICAgICAgICAgICAgICAgICBwb3MgLT0gZGFzaFtpbmRleF07CiAgICAgICAgICAgICAgICAgaW5kZXggPSAoaW5kZXggKyAxKSAlIGRhc2gubGVuZ3RoOwotICAgICAgICAgICAgfSAgICAgICAgICAgIAorICAgICAgICAgICAgfQogICAgICAgICAgICAgcG9zID0gLXBvczsKICAgICAgICAgICAgIGZpcnN0ID0gdmlzaWJsZTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICAvKioKICAgICAgICAgICogSW5pdHMgdGhlLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGl0ZXIgdGhlIGl0ZXIKKyAgICAgICAgICogQHBhcmFtIGl0ZXIKKyAgICAgICAgICogICAgICAgICAgICB0aGUgaXRlci4KICAgICAgICAgICovCiAgICAgICAgIHZvaWQgaW5pdChEYXNoSXRlcmF0b3IgaXRlcikgewogICAgICAgICAgICAgdGhpcy5pdGVyID0gaXRlcjsKICAgICAgICAgICAgIGNsb3NlID0gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICAvKioKICAgICAgICAgICogQ2hlY2tzIGlmIGlzIG9wZW4uCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIG9wZW4KKyAgICAgICAgICogQHJldHVybiB0cnVlLCBpZiBpcyBvcGVuLgogICAgICAgICAgKi8KICAgICAgICAgYm9vbGVhbiBpc09wZW4oKSB7CiAgICAgICAgICAgICByZXR1cm4gdmlzaWJsZSAmJiBwb3MgPCBpdGVyLmxlbmd0aDsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICAvKioKICAgICAgICAgICogQ2hlY2tzIGlmIGlzIGNvbnRpbnVlLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0cnVlLCBpZiBpcyBjb250aW51ZQorICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIGNvbnRpbnVlLgogICAgICAgICAgKi8KICAgICAgICAgYm9vbGVhbiBpc0NvbnRpbnVlKCkgewogICAgICAgICAgICAgcmV0dXJuICF2aXNpYmxlICYmIHBvcyA+IDA7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgLyoqCiAgICAgICAgICAqIENoZWNrcyBpZiBpcyBjbG9zZWQuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIGNsb3NlZAorICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIGNsb3NlZC4KICAgICAgICAgICovCiAgICAgICAgIGJvb2xlYW4gaXNDbG9zZWQoKSB7CiAgICAgICAgICAgICByZXR1cm4gY2xvc2U7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgLyoqCiAgICAgICAgICAqIENoZWNrcyBpZiBpcyBjb25uZWN0ZWQuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIGNvbm5lY3RlZAorICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIGNvbm5lY3RlZC4KICAgICAgICAgICovCiAgICAgICAgIGJvb2xlYW4gaXNDb25uZWN0ZWQoKSB7CiAgICAgICAgICAgICByZXR1cm4gZmlyc3QgJiYgIWNsb3NlOwpAQCAtMTYzMiw3ICsxNzgwLDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEVvZi4KICAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgc3VjY2Vzc2Z1bAorICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHN1Y2Nlc3NmdWwuCiAgICAgICAgICAqLwogICAgICAgICBib29sZWFuIGVvZigpIHsKICAgICAgICAgICAgIGlmICghY2xvc2UpIHsKQEAgLTE2NDgsNyArMTc5Niw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgLyoqCiAgICAgICAgICAqIE5leHQuCiAgICAgICAgICAqLwpAQCAtMTY2MywxNyArMTgxMSwxNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgdmlzaWJsZSA9ICF2aXNpYmxlOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIC8qKgogICAgICAgICAgKiBHZXRzIHRoZSB2YWx1ZS4KICAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIHZhbHVlCisgICAgICAgICAqIEByZXR1cm4gdGhlIHZhbHVlLgogICAgICAgICAgKi8KICAgICAgICAgZG91YmxlIGdldFZhbHVlKCkgewogICAgICAgICAgICAgZG91YmxlIHQgPSBpdGVyLmdldE5leHQocG9zKTsKICAgICAgICAgICAgIHJldHVybiB0IDwgMCA/IDAgOiAodCA+IDEgPyAxIDogdCk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICB9CiAKICAgICAvKioKQEAgLTE2ODEsNyArMTgyOSw5IEBACiAgICAgICovCiAgICAgc3RhdGljIGFic3RyYWN0IGNsYXNzIERhc2hJdGVyYXRvciB7CiAKLSAgICAgICAgLyoqIFRoZSBDb25zdGFudCBGTEFUTkVTUy4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBDb25zdGFudCBGTEFUTkVTUy4KKyAgICAgICAgICovCiAgICAgICAgIHN0YXRpYyBmaW5hbCBkb3VibGUgRkxBVE5FU1MgPSAxLjA7CiAKICAgICAgICAgLyoqCkBAIC0xNjkyLDcgKzE4NDIsOCBAQAogICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgbGluZS4KICAgICAgICAgICAgICAqIAotICAgICAgICAgICAgICogQHBhcmFtIGxlbiB0aGUgbGVuCisgICAgICAgICAgICAgKiBAcGFyYW0gbGVuCisgICAgICAgICAgICAgKiAgICAgICAgICAgIHRoZSBsZW4uCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIExpbmUoZG91YmxlIGxlbikgewogICAgICAgICAgICAgICAgIGxlbmd0aCA9IGxlbjsKQEAgLTE3MTAsMzYgKzE4NjEsNTYgQEAKICAgICAgICAgICovCiAgICAgICAgIHN0YXRpYyBjbGFzcyBRdWFkIGV4dGVuZHMgRGFzaEl0ZXJhdG9yIHsKIAotICAgICAgICAgICAgLyoqIFRoZSB2YWwgc2l6ZS4gKi8KKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIHZhbCBzaXplLgorICAgICAgICAgICAgICovCiAgICAgICAgICAgICBpbnQgdmFsU2l6ZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqIFRoZSB2YWwgcG9zLiAqLworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFRoZSB2YWwgcG9zLgorICAgICAgICAgICAgICovCiAgICAgICAgICAgICBpbnQgdmFsUG9zOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiogVGhlIGN1ciBsZW4uICovCisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIGN1ciBsZW4uCisgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGRvdWJsZSBjdXJMZW47Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKiBUaGUgcHJldiBsZW4uICovCisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIHByZXYgbGVuLgorICAgICAgICAgICAgICovCiAgICAgICAgICAgICBkb3VibGUgcHJldkxlbjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqIFRoZSBsYXN0IGxlbi4gKi8KKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgbGFzdCBsZW4uCisgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGRvdWJsZSBsYXN0TGVuOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiogVGhlIHZhbHVlcy4gKi8KKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgdmFsdWVzLgorICAgICAgICAgICAgICovCiAgICAgICAgICAgICBkb3VibGVbXSB2YWx1ZXM7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKiBUaGUgc3RlcC4gKi8KKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgc3RlcC4KKyAgICAgICAgICAgICAqLwogICAgICAgICAgICAgZG91YmxlIHN0ZXA7CiAKICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHF1YWQuCiAgICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIEBwYXJhbSB4MSB0aGUgeDEKLSAgICAgICAgICAgICAqIEBwYXJhbSB5MSB0aGUgeTEKLSAgICAgICAgICAgICAqIEBwYXJhbSB4MiB0aGUgeDIKLSAgICAgICAgICAgICAqIEBwYXJhbSB5MiB0aGUgeTIKLSAgICAgICAgICAgICAqIEBwYXJhbSB4MyB0aGUgeDMKLSAgICAgICAgICAgICAqIEBwYXJhbSB5MyB0aGUgeTMKKyAgICAgICAgICAgICAqIEBwYXJhbSB4MQorICAgICAgICAgICAgICogICAgICAgICAgICB0aGUgeDEuCisgICAgICAgICAgICAgKiBAcGFyYW0geTEKKyAgICAgICAgICAgICAqICAgICAgICAgICAgdGhlIHkxLgorICAgICAgICAgICAgICogQHBhcmFtIHgyCisgICAgICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4Mi4KKyAgICAgICAgICAgICAqIEBwYXJhbSB5MgorICAgICAgICAgICAgICogICAgICAgICAgICB0aGUgeTIuCisgICAgICAgICAgICAgKiBAcGFyYW0geDMKKyAgICAgICAgICAgICAqICAgICAgICAgICAgdGhlIHgzLgorICAgICAgICAgICAgICogQHBhcmFtIHkzCisgICAgICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5My4KICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgUXVhZChkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIHgyLCBkb3VibGUgeTIsIGRvdWJsZSB4MywgZG91YmxlIHkzKSB7CiAKQEAgLTE3NjYsNyArMTkzNyw3IEBACiAgICAgICAgICAgICAgICAgZG91YmxlIHB2eCA9IHZ4OwogICAgICAgICAgICAgICAgIGRvdWJsZSBwdnkgPSB2eTsKICAgICAgICAgICAgICAgICBsZW5ndGggPSAwLjA7Ci0gICAgICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIHZ4ICs9IGR4MTsKICAgICAgICAgICAgICAgICAgICAgdnkgKz0gZHkxOwogICAgICAgICAgICAgICAgICAgICBkeDEgKz0gZHgyOwpAQCAtMTgwNCw0MCArMTk3NSw2MyBAQAogICAgICAgICAgKi8KICAgICAgICAgc3RhdGljIGNsYXNzIEN1YmljIGV4dGVuZHMgRGFzaEl0ZXJhdG9yIHsKIAotICAgICAgICAgICAgLyoqIFRoZSB2YWwgc2l6ZS4gKi8KKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIHZhbCBzaXplLgorICAgICAgICAgICAgICovCiAgICAgICAgICAgICBpbnQgdmFsU2l6ZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqIFRoZSB2YWwgcG9zLiAqLworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFRoZSB2YWwgcG9zLgorICAgICAgICAgICAgICovCiAgICAgICAgICAgICBpbnQgdmFsUG9zOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiogVGhlIGN1ciBsZW4uICovCisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIGN1ciBsZW4uCisgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGRvdWJsZSBjdXJMZW47Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKiBUaGUgcHJldiBsZW4uICovCisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIHByZXYgbGVuLgorICAgICAgICAgICAgICovCiAgICAgICAgICAgICBkb3VibGUgcHJldkxlbjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqIFRoZSBsYXN0IGxlbi4gKi8KKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgbGFzdCBsZW4uCisgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGRvdWJsZSBsYXN0TGVuOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiogVGhlIHZhbHVlcy4gKi8KKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgdmFsdWVzLgorICAgICAgICAgICAgICovCiAgICAgICAgICAgICBkb3VibGVbXSB2YWx1ZXM7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKiBUaGUgc3RlcC4gKi8KKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgc3RlcC4KKyAgICAgICAgICAgICAqLwogICAgICAgICAgICAgZG91YmxlIHN0ZXA7CiAKICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGN1YmljLgogICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBAcGFyYW0geDEgdGhlIHgxCi0gICAgICAgICAgICAgKiBAcGFyYW0geTEgdGhlIHkxCi0gICAgICAgICAgICAgKiBAcGFyYW0geDIgdGhlIHgyCi0gICAgICAgICAgICAgKiBAcGFyYW0geTIgdGhlIHkyCi0gICAgICAgICAgICAgKiBAcGFyYW0geDMgdGhlIHgzCi0gICAgICAgICAgICAgKiBAcGFyYW0geTMgdGhlIHkzCi0gICAgICAgICAgICAgKiBAcGFyYW0geDQgdGhlIHg0Ci0gICAgICAgICAgICAgKiBAcGFyYW0geTQgdGhlIHk0CisgICAgICAgICAgICAgKiBAcGFyYW0geDEKKyAgICAgICAgICAgICAqICAgICAgICAgICAgdGhlIHgxLgorICAgICAgICAgICAgICogQHBhcmFtIHkxCisgICAgICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5MS4KKyAgICAgICAgICAgICAqIEBwYXJhbSB4MgorICAgICAgICAgICAgICogICAgICAgICAgICB0aGUgeDIuCisgICAgICAgICAgICAgKiBAcGFyYW0geTIKKyAgICAgICAgICAgICAqICAgICAgICAgICAgdGhlIHkyLgorICAgICAgICAgICAgICogQHBhcmFtIHgzCisgICAgICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4My4KKyAgICAgICAgICAgICAqIEBwYXJhbSB5MworICAgICAgICAgICAgICogICAgICAgICAgICB0aGUgeTMuCisgICAgICAgICAgICAgKiBAcGFyYW0geDQKKyAgICAgICAgICAgICAqICAgICAgICAgICAgdGhlIHg0LgorICAgICAgICAgICAgICogQHBhcmFtIHk0CisgICAgICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5NC4KICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgQ3ViaWMoZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSB4MiwgZG91YmxlIHkyLCBkb3VibGUgeDMsIGRvdWJsZSB5MywgZG91YmxlIHg0LCBkb3VibGUgeTQpIHsKKyAgICAgICAgICAgIEN1YmljKGRvdWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUgeDIsIGRvdWJsZSB5MiwgZG91YmxlIHgzLCBkb3VibGUgeTMsIGRvdWJsZSB4NCwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHk0KSB7CiAKICAgICAgICAgICAgICAgICBkb3VibGUgbngxID0geDEgKyB4MyAtIHgyIC0geDI7CiAgICAgICAgICAgICAgICAgZG91YmxlIG55MSA9IHkxICsgeTMgLSB5MiAtIHkyOwpAQCAtMTg2OSw3ICsyMDYzLDcgQEAKICAgICAgICAgICAgICAgICBkb3VibGUgcHZ4ID0gdng7CiAgICAgICAgICAgICAgICAgZG91YmxlIHB2eSA9IHZ5OwogICAgICAgICAgICAgICAgIGxlbmd0aCA9IDAuMDsKLSAgICAgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgdnggKz0gZHgxOwogICAgICAgICAgICAgICAgICAgICB2eSArPSBkeTE7CiAgICAgICAgICAgICAgICAgICAgIGR4MSArPSBkeDI7CkBAIC0xOTA0LDE1ICsyMDk4LDE3IEBACiAKICAgICAgICAgfQogCi0gICAgICAgIC8qKiBUaGUgbGVuZ3RoLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGxlbmd0aC4KKyAgICAgICAgICovCiAgICAgICAgIGRvdWJsZSBsZW5ndGg7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEdldHMgdGhlIG5leHQuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gZGFzaFBvcyB0aGUgZGFzaCBwb3MKLSAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIG5leHQKKyAgICAgICAgICogQHBhcmFtIGRhc2hQb3MKKyAgICAgICAgICogICAgICAgICAgICB0aGUgZGFzaCBwb3MuCisgICAgICAgICAqIEByZXR1cm4gdGhlIG5leHQuCiAgICAgICAgICAqLwogICAgICAgICBhYnN0cmFjdCBkb3VibGUgZ2V0TmV4dChkb3VibGUgZGFzaFBvcyk7CiAKQEAgLTE5MjMsMzkgKzIxMTksNjAgQEAKICAgICAgKi8KICAgICBzdGF0aWMgY2xhc3MgQnVmZmVyZWRQYXRoIHsKIAotICAgICAgICAvKiogVGhlIENvbnN0YW50IGJ1ZkNhcGFjaXR5LiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIENvbnN0YW50IGJ1ZkNhcGFjaXR5LgorICAgICAgICAgKi8KICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGJ1ZkNhcGFjaXR5ID0gMTA7CiAKLSAgICAgICAgLyoqIFRoZSBwb2ludCBzaGlmdC4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBwb2ludCBzaGlmdC4KKyAgICAgICAgICovCiAgICAgICAgIHN0YXRpYyBpbnQgcG9pbnRTaGlmdFtdID0gewotICAgICAgICAgICAgICAgIDIsICAvLyBNT1ZFVE8KLSAgICAgICAgICAgICAgICAyLCAgLy8gTElORVRPCi0gICAgICAgICAgICAgICAgNCwgIC8vIFFVQURUTwotICAgICAgICAgICAgICAgIDYsICAvLyBDVUJJQ1RPCi0gICAgICAgICAgICAgICAgMH07IC8vIENMT1NFCisgICAgICAgICAgICAgICAgMiwgLy8gTU9WRVRPCisgICAgICAgICAgICAgICAgMiwgLy8gTElORVRPCisgICAgICAgICAgICAgICAgNCwgLy8gUVVBRFRPCisgICAgICAgICAgICAgICAgNiwgLy8gQ1VCSUNUTworICAgICAgICAgICAgICAgIDAKKyAgICAgICAgfTsgLy8gQ0xPU0UKIAotICAgICAgICAvKiogVGhlIHR5cGVzLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHR5cGVzLgorICAgICAgICAgKi8KICAgICAgICAgYnl0ZVtdIHR5cGVzOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBwb2ludHMuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBwb2ludHMuCisgICAgICAgICAqLwogICAgICAgICBmbG9hdFtdIHBvaW50czsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgdHlwZSBzaXplLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdHlwZSBzaXplLgorICAgICAgICAgKi8KICAgICAgICAgaW50IHR5cGVTaXplOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBwb2ludCBzaXplLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcG9pbnQgc2l6ZS4KKyAgICAgICAgICovCiAgICAgICAgIGludCBwb2ludFNpemU7CiAKLSAgICAgICAgLyoqIFRoZSB4IGxhc3QuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeCBsYXN0LgorICAgICAgICAgKi8KICAgICAgICAgZmxvYXQgeExhc3Q7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHkgbGFzdC4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHkgbGFzdC4KKyAgICAgICAgICovCiAgICAgICAgIGZsb2F0IHlMYXN0OwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB4IG1vdmUuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB4IG1vdmUuCisgICAgICAgICAqLwogICAgICAgICBmbG9hdCB4TW92ZTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeSBtb3ZlLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeSBtb3ZlLgorICAgICAgICAgKi8KICAgICAgICAgZmxvYXQgeU1vdmU7CiAKICAgICAgICAgLyoqCkBAIC0xOTY5LDggKzIxODYsMTAgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIENoZWNrIGJ1Zi4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSB0eXBlQ291bnQgdGhlIHR5cGUgY291bnQKLSAgICAgICAgICogQHBhcmFtIHBvaW50Q291bnQgdGhlIHBvaW50IGNvdW50CisgICAgICAgICAqIEBwYXJhbSB0eXBlQ291bnQKKyAgICAgICAgICogICAgICAgICAgICB0aGUgdHlwZSBjb3VudC4KKyAgICAgICAgICogQHBhcmFtIHBvaW50Q291bnQKKyAgICAgICAgICogICAgICAgICAgICB0aGUgcG9pbnQgY291bnQuCiAgICAgICAgICAqLwogICAgICAgICB2b2lkIGNoZWNrQnVmKGludCB0eXBlQ291bnQsIGludCBwb2ludENvdW50KSB7CiAgICAgICAgICAgICBpZiAodHlwZVNpemUgKyB0eXBlQ291bnQgPiB0eXBlcy5sZW5ndGgpIHsKQEAgLTE5ODgsNyArMjIwNyw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBDaGVja3MgaWYgaXMgZW1wdHkuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIGVtcHR5CisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgaXMgZW1wdHkuCiAgICAgICAgICAqLwogICAgICAgICBib29sZWFuIGlzRW1wdHkoKSB7CiAgICAgICAgICAgICByZXR1cm4gdHlwZVNpemUgPT0gMDsKQEAgLTIwMDUsOCArMjIyNCwxMCBAQAogICAgICAgICAvKioKICAgICAgICAgICogTW92ZSB0by4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSB4IHRoZSB4Ci0gICAgICAgICAqIEBwYXJhbSB5IHRoZSB5CisgICAgICAgICAqIEBwYXJhbSB4CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHguCisgICAgICAgICAqIEBwYXJhbSB5CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHkuCiAgICAgICAgICAqLwogICAgICAgICB2b2lkIG1vdmVUbyhkb3VibGUgeCwgZG91YmxlIHkpIHsKICAgICAgICAgICAgIGNoZWNrQnVmKDEsIDIpOwpAQCAtMjAxOCw4ICsyMjM5LDEwIEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBMaW5lIHRvLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHggdGhlIHgKLSAgICAgICAgICogQHBhcmFtIHkgdGhlIHkKKyAgICAgICAgICogQHBhcmFtIHgKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeC4KKyAgICAgICAgICogQHBhcmFtIHkKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeS4KICAgICAgICAgICovCiAgICAgICAgIHZvaWQgbGluZVRvKGRvdWJsZSB4LCBkb3VibGUgeSkgewogICAgICAgICAgICAgY2hlY2tCdWYoMSwgMik7CkBAIC0yMDMxLDEwICsyMjU0LDE0IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBRdWFkIHRvLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHgxIHRoZSB4MQotICAgICAgICAgKiBAcGFyYW0geTEgdGhlIHkxCi0gICAgICAgICAqIEBwYXJhbSB4MiB0aGUgeDIKLSAgICAgICAgICogQHBhcmFtIHkyIHRoZSB5MgorICAgICAgICAgKiBAcGFyYW0geDEKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeDEuCisgICAgICAgICAqIEBwYXJhbSB5MQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5MS4KKyAgICAgICAgICogQHBhcmFtIHgyCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHgyLgorICAgICAgICAgKiBAcGFyYW0geTIKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeTIuCiAgICAgICAgICAqLwogICAgICAgICB2b2lkIHF1YWRUbyhkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIHgyLCBkb3VibGUgeTIpIHsKICAgICAgICAgICAgIGNoZWNrQnVmKDEsIDQpOwpAQCAtMjA0OCwxMiArMjI3NSwxOCBAQAogICAgICAgICAvKioKICAgICAgICAgICogQ3ViaWMgdG8uCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0geDEgdGhlIHgxCi0gICAgICAgICAqIEBwYXJhbSB5MSB0aGUgeTEKLSAgICAgICAgICogQHBhcmFtIHgyIHRoZSB4MgotICAgICAgICAgKiBAcGFyYW0geTIgdGhlIHkyCi0gICAgICAgICAqIEBwYXJhbSB4MyB0aGUgeDMKLSAgICAgICAgICogQHBhcmFtIHkzIHRoZSB5MworICAgICAgICAgKiBAcGFyYW0geDEKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeDEuCisgICAgICAgICAqIEBwYXJhbSB5MQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5MS4KKyAgICAgICAgICogQHBhcmFtIHgyCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHgyLgorICAgICAgICAgKiBAcGFyYW0geTIKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeTIuCisgICAgICAgICAqIEBwYXJhbSB4MworICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4My4KKyAgICAgICAgICogQHBhcmFtIHkzCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHkzLgogICAgICAgICAgKi8KICAgICAgICAgdm9pZCBjdWJpY1RvKGRvdWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUgeDIsIGRvdWJsZSB5MiwgZG91YmxlIHgzLCBkb3VibGUgeTMpIHsKICAgICAgICAgICAgIGNoZWNrQnVmKDEsIDYpOwpAQCAtMjA3Nyw4ICsyMzEwLDEwIEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBTZXRzIHRoZSBsYXN0LgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHggdGhlIHgKLSAgICAgICAgICogQHBhcmFtIHkgdGhlIHkKKyAgICAgICAgICogQHBhcmFtIHgKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeC4KKyAgICAgICAgICogQHBhcmFtIHkKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeS4KICAgICAgICAgICovCiAgICAgICAgIHZvaWQgc2V0TGFzdChkb3VibGUgeCwgZG91YmxlIHkpIHsKICAgICAgICAgICAgIHBvaW50c1twb2ludFNpemUgLSAyXSA9IHhMYXN0ID0gKGZsb2F0KXg7CkBAIC0yMDg4LDcgKzIzMjMsOCBAQAogICAgICAgICAvKioKICAgICAgICAgICogQXBwZW5kLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHAgdGhlIHAKKyAgICAgICAgICogQHBhcmFtIHAKKyAgICAgICAgICogICAgICAgICAgICB0aGUgcC4KICAgICAgICAgICovCiAgICAgICAgIHZvaWQgYXBwZW5kKEJ1ZmZlcmVkUGF0aCBwKSB7CiAgICAgICAgICAgICBjaGVja0J1ZihwLnR5cGVTaXplLCBwLnBvaW50U2l6ZSk7CkBAIC0yMTAzLDE4ICsyMzM5LDE5IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBBcHBlbmQgcmV2ZXJzZS4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBwIHRoZSBwCisgICAgICAgICAqIEBwYXJhbSBwCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHAuCiAgICAgICAgICAqLwogICAgICAgICB2b2lkIGFwcGVuZFJldmVyc2UoQnVmZmVyZWRQYXRoIHApIHsKICAgICAgICAgICAgIGNoZWNrQnVmKHAudHlwZVNpemUsIHAucG9pbnRTaXplKTsKICAgICAgICAgICAgIC8vIFNraXAgbGFzdCBwb2ludCwgYmVhY2F1c2UgaXQncyB0aGUgZmlyc3QgcG9pbnQgb2YgdGhlIHNlY29uZCBwYXRoCi0gICAgICAgICAgICBmb3IoaW50IGkgPSBwLnBvaW50U2l6ZSAtIDI7IGkgPj0gMDsgaSAtPSAyKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gcC5wb2ludFNpemUgLSAyOyBpID49IDA7IGkgLT0gMikgewogICAgICAgICAgICAgICAgIHBvaW50c1twb2ludFNpemUrK10gPSBwLnBvaW50c1tpICsgMF07CiAgICAgICAgICAgICAgICAgcG9pbnRzW3BvaW50U2l6ZSsrXSA9IHAucG9pbnRzW2kgKyAxXTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFNraXAgZmlyc3QgdHlwZSwgYmVhY3VzZSBpdCdzIGFsd2F5cyBNT1ZFVE8KICAgICAgICAgICAgIGludCBjbG9zZUluZGV4ID0gMDsKLSAgICAgICAgICAgIGZvcihpbnQgaSA9IHAudHlwZVNpemUgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHAudHlwZVNpemUgLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgICAgIGJ5dGUgdHlwZSA9IHAudHlwZXNbaV07CiAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gUGF0aEl0ZXJhdG9yLlNFR19NT1ZFVE8pIHsKICAgICAgICAgICAgICAgICAgICAgdHlwZXNbY2xvc2VJbmRleF0gPSBQYXRoSXRlcmF0b3IuU0VHX01PVkVUTzsKQEAgLTIxMzMsNyArMjM3MCw4IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBKb2luLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHAgdGhlIHAKKyAgICAgICAgICogQHBhcmFtIHAKKyAgICAgICAgICogICAgICAgICAgICB0aGUgcC4KICAgICAgICAgICovCiAgICAgICAgIHZvaWQgam9pbihCdWZmZXJlZFBhdGggcCkgewogICAgICAgICAgICAgLy8gU2tpcCBNT1ZFVE8KQEAgLTIxNDksMTcgKzIzODcsMTggQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIENvbWJpbmUuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gcCB0aGUgcAorICAgICAgICAgKiBAcGFyYW0gcAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBwLgogICAgICAgICAgKi8KICAgICAgICAgdm9pZCBjb21iaW5lKEJ1ZmZlcmVkUGF0aCBwKSB7CiAgICAgICAgICAgICBjaGVja0J1ZihwLnR5cGVTaXplIC0gMSwgcC5wb2ludFNpemUgLSAyKTsKICAgICAgICAgICAgIC8vIFNraXAgbGFzdCBwb2ludCwgYmVhY2F1c2UgaXQncyB0aGUgZmlyc3QgcG9pbnQgb2YgdGhlIHNlY29uZCBwYXRoCi0gICAgICAgICAgICBmb3IoaW50IGkgPSBwLnBvaW50U2l6ZSAtIDQ7IGkgPj0gMDsgaSAtPSAyKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gcC5wb2ludFNpemUgLSA0OyBpID49IDA7IGkgLT0gMikgewogICAgICAgICAgICAgICAgIHBvaW50c1twb2ludFNpemUrK10gPSBwLnBvaW50c1tpICsgMF07CiAgICAgICAgICAgICAgICAgcG9pbnRzW3BvaW50U2l6ZSsrXSA9IHAucG9pbnRzW2kgKyAxXTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFNraXAgZmlyc3QgdHlwZSwgYmVhY3VzZSBpdCdzIGFsd2F5cyBNT1ZFVE8KLSAgICAgICAgICAgIGZvcihpbnQgaSA9IHAudHlwZVNpemUgLSAxOyBpID49IDE7IGktLSkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHAudHlwZVNpemUgLSAxOyBpID49IDE7IGktLSkgewogICAgICAgICAgICAgICAgIHR5cGVzW3R5cGVTaXplKytdID0gcC50eXBlc1tpXTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHhMYXN0ID0gcG9pbnRzW3BvaW50U2l6ZSAtIDJdOwpAQCAtMjE2OSwyOSArMjQwOCwzMCBAQAogICAgICAgICAvKioKICAgICAgICAgICogQ3JlYXRlcyB0aGUgZ2VuZXJhbCBwYXRoLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgZ2VuZXJhbCBwYXRoCisgICAgICAgICAqIEByZXR1cm4gdGhlIGdlbmVyYWwgcGF0aC4KICAgICAgICAgICovCiAgICAgICAgIEdlbmVyYWxQYXRoIGNyZWF0ZUdlbmVyYWxQYXRoKCkgewogICAgICAgICAgICAgR2VuZXJhbFBhdGggcCA9IG5ldyBHZW5lcmFsUGF0aCgpOwogICAgICAgICAgICAgaW50IGogPSAwOwotICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHR5cGVTaXplOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVNpemU7IGkrKykgewogICAgICAgICAgICAgICAgIGludCB0eXBlID0gdHlwZXNbaV07Ci0gICAgICAgICAgICAgICAgc3dpdGNoKHR5cGUpewotICAgICAgICAgICAgICAgIGNhc2UgUGF0aEl0ZXJhdG9yLlNFR19NT1ZFVE86Ci0gICAgICAgICAgICAgICAgICAgIHAubW92ZVRvKHBvaW50c1tqXSwgcG9pbnRzW2ogKyAxXSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgUGF0aEl0ZXJhdG9yLlNFR19MSU5FVE86Ci0gICAgICAgICAgICAgICAgICAgIHAubGluZVRvKHBvaW50c1tqXSwgcG9pbnRzW2ogKyAxXSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgUGF0aEl0ZXJhdG9yLlNFR19RVUFEVE86Ci0gICAgICAgICAgICAgICAgICAgIHAucXVhZFRvKHBvaW50c1tqXSwgcG9pbnRzW2ogKyAxXSwgcG9pbnRzW2ogKyAyXSwgcG9pbnRzW2ogKyAzXSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgUGF0aEl0ZXJhdG9yLlNFR19DVUJJQ1RPOgotICAgICAgICAgICAgICAgICAgICBwLmN1cnZlVG8ocG9pbnRzW2pdLCBwb2ludHNbaiArIDFdLCBwb2ludHNbaiArIDJdLCBwb2ludHNbaiArIDNdLCBwb2ludHNbaiArIDRdLCBwb2ludHNbaiArIDVdKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBQYXRoSXRlcmF0b3IuU0VHX0NMT1NFOgotICAgICAgICAgICAgICAgICAgICBwLmNsb3NlUGF0aCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQYXRoSXRlcmF0b3IuU0VHX01PVkVUTzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHAubW92ZVRvKHBvaW50c1tqXSwgcG9pbnRzW2ogKyAxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQYXRoSXRlcmF0b3IuU0VHX0xJTkVUTzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHAubGluZVRvKHBvaW50c1tqXSwgcG9pbnRzW2ogKyAxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQYXRoSXRlcmF0b3IuU0VHX1FVQURUTzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHAucXVhZFRvKHBvaW50c1tqXSwgcG9pbnRzW2ogKyAxXSwgcG9pbnRzW2ogKyAyXSwgcG9pbnRzW2ogKyAzXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQYXRoSXRlcmF0b3IuU0VHX0NVQklDVE86CisgICAgICAgICAgICAgICAgICAgICAgICBwLmN1cnZlVG8ocG9pbnRzW2pdLCBwb2ludHNbaiArIDFdLCBwb2ludHNbaiArIDJdLCBwb2ludHNbaiArIDNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHNbaiArIDRdLCBwb2ludHNbaiArIDVdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFBhdGhJdGVyYXRvci5TRUdfQ0xPU0U6CisgICAgICAgICAgICAgICAgICAgICAgICBwLmNsb3NlUGF0aCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGogKz0gcG9pbnRTaGlmdFt0eXBlXTsKICAgICAgICAgICAgIH0KQEAgLTIyMDEsNCArMjQ0MSwzIEBACiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9CdWZmZXJDYXBhYmlsaXRpZXMuamF2YSBiL2F3dC9qYXZhL2F3dC9CdWZmZXJDYXBhYmlsaXRpZXMuamF2YQppbmRleCA4MGU4YWRkLi5jZDVmZTdiIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvQnVmZmVyQ2FwYWJpbGl0aWVzLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L0J1ZmZlckNhcGFiaWxpdGllcy5qYXZhCkBAIC0xOCwzNSArMTgsNDUgQEAKICAqIEBhdXRob3IgQWxleGV5IEEuIFBldHJlbmtvCiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dDsKIAotCiAvKioKLSAqIFRoZSBCdWZmZXJDYXBhYmlsaXRpZXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgY2FwYWJpbGl0aWVzIAotICogYW5kIG90aGVyIHByb3BlcnRpZXMgb2YgdGhlIGltYWdlIGJ1ZmZlcnMuCisgKiBUaGUgQnVmZmVyQ2FwYWJpbGl0aWVzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGNhcGFiaWxpdGllcyBhbmQgb3RoZXIgcHJvcGVydGllcworICogb2YgdGhlIGltYWdlIGJ1ZmZlcnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQnVmZmVyQ2FwYWJpbGl0aWVzIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKLSAgICAKLSAgICAvKiogVGhlIGZyb250IGJ1ZmZlciBjYXBhYmlsaXRpZXMuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgZnJvbnQgYnVmZmVyIGNhcGFiaWxpdGllcy4KKyAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIEltYWdlQ2FwYWJpbGl0aWVzIGZyb250QnVmZmVyQ2FwYWJpbGl0aWVzOwotICAgIAotICAgIC8qKiBUaGUgYmFjayBidWZmZXIgY2FwYWJpbGl0aWVzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGJhY2sgYnVmZmVyIGNhcGFiaWxpdGllcy4KKyAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIEltYWdlQ2FwYWJpbGl0aWVzIGJhY2tCdWZmZXJDYXBhYmlsaXRpZXM7Ci0gICAgCi0gICAgLyoqIFRoZSBmbGlwIGNvbnRlbnRzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGZsaXAgY29udGVudHMuCisgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBGbGlwQ29udGVudHMgZmxpcENvbnRlbnRzOwogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEJ1ZmZlckNhcGFiaWxpdGllcyBvYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIGZyb250QnVmZmVyQ2FwYWJpbGl0aWVzIHRoZSBmcm9udCBidWZmZXIgY2FwYWJpbGl0aWVzLCAKLSAgICAgKiBjYW4gbm90IGJlIG51bGwuCi0gICAgICogQHBhcmFtIGJhY2tCdWZmZXJDYXBhYmlsaXRpZXMgdGhlIHRoZSBiYWNrIGFuZCBpbnRlcm1lZGlhdGUgCi0gICAgICogYnVmZmVycyBjYXBhYmlsaXRpZXMsIGNhbiBub3QgYmUgbnVsbC4KLSAgICAgKiBAcGFyYW0gZmxpcENvbnRlbnRzIHRoZSBiYWNrIGJ1ZmZlciBjb250ZW50cyBhZnRlciBwYWdlIGZsaXBwaW5nLCAKLSAgICAgKiBudWxsIGlmIHBhZ2UgZmxpcHBpbmcgaXMgbm90IHVzZWQuCisgICAgICogQHBhcmFtIGZyb250QnVmZmVyQ2FwYWJpbGl0aWVzCisgICAgICogICAgICAgICAgICB0aGUgZnJvbnQgYnVmZmVyIGNhcGFiaWxpdGllcywgY2FuIG5vdCBiZSBudWxsLgorICAgICAqIEBwYXJhbSBiYWNrQnVmZmVyQ2FwYWJpbGl0aWVzCisgICAgICogICAgICAgICAgICB0aGUgdGhlIGJhY2sgYW5kIGludGVybWVkaWF0ZSBidWZmZXJzIGNhcGFiaWxpdGllcywgY2FuIG5vdCBiZQorICAgICAqICAgICAgICAgICAgbnVsbC4KKyAgICAgKiBAcGFyYW0gZmxpcENvbnRlbnRzCisgICAgICogICAgICAgICAgICB0aGUgYmFjayBidWZmZXIgY29udGVudHMgYWZ0ZXIgcGFnZSBmbGlwcGluZywgbnVsbCBpZiBwYWdlCisgICAgICogICAgICAgICAgICBmbGlwcGluZyBpcyBub3QgdXNlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgQnVmZmVyQ2FwYWJpbGl0aWVzKEltYWdlQ2FwYWJpbGl0aWVzIGZyb250QnVmZmVyQ2FwYWJpbGl0aWVzLCAKKyAgICBwdWJsaWMgQnVmZmVyQ2FwYWJpbGl0aWVzKEltYWdlQ2FwYWJpbGl0aWVzIGZyb250QnVmZmVyQ2FwYWJpbGl0aWVzLAogICAgICAgICAgICAgSW1hZ2VDYXBhYmlsaXRpZXMgYmFja0J1ZmZlckNhcGFiaWxpdGllcywgRmxpcENvbnRlbnRzIGZsaXBDb250ZW50cykgewogICAgICAgICBpZiAoZnJvbnRCdWZmZXJDYXBhYmlsaXRpZXMgPT0gbnVsbCB8fCBiYWNrQnVmZmVyQ2FwYWJpbGl0aWVzID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKQEAgLTcwLDggKzgwLDggQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBpbWFnZSBjYXBhYmlsaXRpZXMgb2YgdGhlIGZyb250IGJ1ZmZlci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBJbWFnZUNhcGFiaWxpdGllcyBvYmplY3QgcmVwcmVzZW50ZWQgY2FwYWJpbGl0aWVzIAotICAgICAqIG9mIHRoZSBmcm9udCBidWZmZXIuIAorICAgICAqIEByZXR1cm4gdGhlIEltYWdlQ2FwYWJpbGl0aWVzIG9iamVjdCByZXByZXNlbnRlZCBjYXBhYmlsaXRpZXMgb2YgdGhlCisgICAgICogICAgICAgICBmcm9udCBidWZmZXIuCiAgICAgICovCiAgICAgcHVibGljIEltYWdlQ2FwYWJpbGl0aWVzIGdldEZyb250QnVmZmVyQ2FwYWJpbGl0aWVzKCkgewogICAgICAgICByZXR1cm4gZnJvbnRCdWZmZXJDYXBhYmlsaXRpZXM7CkBAIC04MCwxNSArOTAsMTUgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBpbWFnZSBjYXBhYmlsaXRpZXMgb2YgdGhlIGJhY2sgYnVmZmVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIEltYWdlQ2FwYWJpbGl0aWVzIG9iamVjdCByZXByZXNlbnRlZCBjYXBhYmlsaXRpZXMgCi0gICAgICogb2YgdGhlIGJhY2sgYnVmZmVyLiAKKyAgICAgKiBAcmV0dXJuIHRoZSBJbWFnZUNhcGFiaWxpdGllcyBvYmplY3QgcmVwcmVzZW50ZWQgY2FwYWJpbGl0aWVzIG9mIHRoZSBiYWNrCisgICAgICogICAgICAgICBidWZmZXIuCiAgICAgICovCiAgICAgcHVibGljIEltYWdlQ2FwYWJpbGl0aWVzIGdldEJhY2tCdWZmZXJDYXBhYmlsaXRpZXMoKSB7CiAgICAgICAgIHJldHVybiBiYWNrQnVmZmVyQ2FwYWJpbGl0aWVzOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGZsaXAgY29udGVudHMgb2YgdGhlIGJhY2sgYnVmZmVyIGFmdGVyIHBhZ2UtZmxpcHBpbmcuIAorICAgICAqIEdldHMgdGhlIGZsaXAgY29udGVudHMgb2YgdGhlIGJhY2sgYnVmZmVyIGFmdGVyIHBhZ2UtZmxpcHBpbmcuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgRmxpcENvbnRlbnRzIG9mIHRoZSBiYWNrIGJ1ZmZlciBhZnRlciBwYWdlLWZsaXBwaW5nLgogICAgICAqLwpAQCAtOTksOCArMTA5LDcgQEAKICAgICAvKioKICAgICAgKiBDaGVja3MgaWYgdGhlIGJ1ZmZlciBzdHJhdGVneSB1c2VzIHBhZ2UgZmxpcHBpbmcuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgYnVmZmVyIHN0cmF0ZWd5IHVzZXMgcGFnZSBmbGlwcGluZywKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgYnVmZmVyIHN0cmF0ZWd5IHVzZXMgcGFnZSBmbGlwcGluZywgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzUGFnZUZsaXBwaW5nKCkgewogICAgICAgICByZXR1cm4gZmxpcENvbnRlbnRzICE9IG51bGw7CkBAIC0xMTAsNyArMTE5LDcgQEAKICAgICAgKiBDaGVja3MgaWYgcGFnZSBmbGlwcGluZyBpcyBvbmx5IGF2YWlsYWJsZSBpbiBmdWxsLXNjcmVlbiBtb2RlLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgcGFnZSBmbGlwcGluZyBpcyBvbmx5IGF2YWlsYWJsZSBpbiBmdWxsLXNjcmVlbiBtb2RlLAotICAgICAqIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0Z1bGxTY3JlZW5SZXF1aXJlZCgpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTE5LDM5ICsxMjgsNDAgQEAKICAgICAvKioKICAgICAgKiBDaGVja3MgaWYgcGFnZSBmbGlwcGluZyBjYW4gYmUgcGVyZm9ybWVkIHVzaW5nIG1vcmUgdGhhbiB0d28gYnVmZmVycy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHBhZ2UgZmxpcHBpbmcgY2FuIGJlIHBlcmZvcm1lZCB1c2luZyBtb3JlIHRoYW4gdHdvIGJ1ZmZlcnMsCi0gICAgICogZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgcGFnZSBmbGlwcGluZyBjYW4gYmUgcGVyZm9ybWVkIHVzaW5nIG1vcmUgdGhhbiB0d28KKyAgICAgKiAgICAgICAgIGJ1ZmZlcnMsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc011bHRpQnVmZmVyQXZhaWxhYmxlKCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhlIEZsaXBDb250ZW50cyBjbGFzcyByZXByZXNlbnRzIGEgc2V0IG9mIHBvc3NpYmxlIGJhY2sgYnVmZmVyIGNvbnRlbnRzIAorICAgICAqIFRoZSBGbGlwQ29udGVudHMgY2xhc3MgcmVwcmVzZW50cyBhIHNldCBvZiBwb3NzaWJsZSBiYWNrIGJ1ZmZlciBjb250ZW50cwogICAgICAqIGFmdGVyIHBhZ2UtZmxpcHBpbmcuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGbGlwQ29udGVudHMgewotICAgICAgICAKKwogICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGJhY2sgYnVmZmVyZWQgY29udGVudHMgYXJlIGNsZWFyZWQgd2l0aCB0aGUgYmFja2dyb3VuZCBjb2xvciAKKyAgICAgICAgICogVGhlIGJhY2sgYnVmZmVyZWQgY29udGVudHMgYXJlIGNsZWFyZWQgd2l0aCB0aGUgYmFja2dyb3VuZCBjb2xvcgogICAgICAgICAgKiBhZnRlciBmbGlwcGluZy4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRmxpcENvbnRlbnRzIEJBQ0tHUk9VTkQgPSBuZXcgRmxpcENvbnRlbnRzKCk7Ci0gICAgICAgIAotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBiYWNrIGJ1ZmZlcmVkIGNvbnRlbnRzIGFyZSBjb3BpZWQgdG8gdGhlIGZyb250IGJ1ZmZlciBiZWZvcmUgCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBiYWNrIGJ1ZmZlcmVkIGNvbnRlbnRzIGFyZSBjb3BpZWQgdG8gdGhlIGZyb250IGJ1ZmZlciBiZWZvcmUKICAgICAgICAgICogZmxpcHBpbmcuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEZsaXBDb250ZW50cyBDT1BJRUQgPSBuZXcgRmxpcENvbnRlbnRzKCk7Ci0gICAgICAgIAotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBiYWNrIGJ1ZmZlciBjb250ZW50cyBhcmUgdGhlIHByaW9yIGNvbnRlbnRzIG9mIHRoZSAKLSAgICAgICAgICogZnJvbnQgYnVmZmVyLgorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgYmFjayBidWZmZXIgY29udGVudHMgYXJlIHRoZSBwcmlvciBjb250ZW50cyBvZiB0aGUgZnJvbnQgYnVmZmVyLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBGbGlwQ29udGVudHMgUFJJT1IgPSBuZXcgRmxpcENvbnRlbnRzKCk7Ci0gICAgICAgIAotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBiYWNrIGJ1ZmZlciBjb250ZW50cyBhcmUgdW5kZWZpbmVkIGFmdGVyIGZsaXBwaW5nIAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgYmFjayBidWZmZXIgY29udGVudHMgYXJlIHVuZGVmaW5lZCBhZnRlciBmbGlwcGluZwogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBGbGlwQ29udGVudHMgVU5ERUZJTkVEID0gbmV3IEZsaXBDb250ZW50cygpOwogCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvQ29sb3IuamF2YSBiL2F3dC9qYXZhL2F3dC9Db2xvci5qYXZhCmluZGV4IGUxZTQxNzguLjkzYzUzMmQgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9Db2xvci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9Db2xvci5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIE9sZWcgVi4gS2hhc2NoYW5za3kKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0OwogCiBpbXBvcnQgamF2YS5hd3QuY29sb3IuQ29sb3JTcGFjZTsKQEAgLTMzLDE1NSArMzQsMjMwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogVGhlIENvbG9yIGNsYXNzIGRlZmluZXMgY29sb3JzIGluIHRoZSBkZWZhdWx0IHNSR0IgY29sb3IgCi0gKiBzcGFjZSBvciBpbiB0aGUgc3BlY2lmaWVkIENvbG9yU3BhY2UuIEV2ZXJ5IENvbG9yIGNvbnRhaW5zIGFscGhhIHZhbHVlLgotICogVGhlIGFscGhhIHZhbHVlIGRlZmluZXMgdGhlIHRyYW5zcGFyZW5jeSBvZiBhIGNvbG9yIGFuZCBjYW4gYmUgcmVwcmVzZW50ZWQKLSAqIGJ5IGEgZmxvYXQgdmFsdWUgaW4gdGhlIHJhbmdlIDAuMCAtIDEuMCBvciAwIC0gMjU1LiAKLSAgKi8KKyAqIFRoZSBDb2xvciBjbGFzcyBkZWZpbmVzIGNvbG9ycyBpbiB0aGUgZGVmYXVsdCBzUkdCIGNvbG9yIHNwYWNlIG9yIGluIHRoZQorICogc3BlY2lmaWVkIENvbG9yU3BhY2UuIEV2ZXJ5IENvbG9yIGNvbnRhaW5zIGFscGhhIHZhbHVlLiBUaGUgYWxwaGEgdmFsdWUKKyAqIGRlZmluZXMgdGhlIHRyYW5zcGFyZW5jeSBvZiBhIGNvbG9yIGFuZCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgYSBmbG9hdCB2YWx1ZQorICogaW4gdGhlIHJhbmdlIDAuMCAtIDEuMCBvciAwIC0gMjU1LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGNsYXNzIENvbG9yIGltcGxlbWVudHMgUGFpbnQsIFNlcmlhbGl6YWJsZSB7Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELiAqLworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTE4NTI2ODE2ODgxMTYxMDc3TDsKIAogICAgIC8qCi0gICAgICogVGhlIHZhbHVlcyBvZiB0aGUgZm9sbG93aW5nIGNvbG9ycyBhcmUgYmFzZWQgb24gMS41IHJlbGVhc2UgYmVoYXZpb3Igd2hpY2gKLSAgICAgKiBjYW4gYmUgcmV2ZWFsZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBvciBzaW1pbGFyIGNvZGU6Ci0gICAgICogICBDb2xvciBjID0gQ29sb3Iud2hpdGU7Ci0gICAgICogICBTeXN0ZW0ub3V0LnByaW50bG4oYyk7CisgICAgICogVGhlIHZhbHVlcyBvZiB0aGUgZm9sbG93aW5nIGNvbG9ycyBhcmUgYmFzZWQgb24gMS41IHJlbGVhc2UgYmVoYXZpb3IKKyAgICAgKiB3aGljaCBjYW4gYmUgcmV2ZWFsZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBvciBzaW1pbGFyIGNvZGU6IENvbG9yIGMgPQorICAgICAqIENvbG9yLndoaXRlOyBTeXN0ZW0ub3V0LnByaW50bG4oYyk7CiAgICAgICovCiAKLSAgICAvKiogVGhlIGNvbG9yIHdoaXRlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBjb2xvciB3aGl0ZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIHdoaXRlID0gbmV3IENvbG9yKDI1NSwgMjU1LCAyNTUpOwogCi0gICAgLyoqIFRoZSBjb2xvciB3aGl0ZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY29sb3Igd2hpdGUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBXSElURSA9IHdoaXRlOwogCi0gICAgLyoqIFRoZSBjb2xvciBsaWdodCBncmF5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBjb2xvciBsaWdodCBncmF5LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgbGlnaHRHcmF5ID0gbmV3IENvbG9yKDE5MiwgMTkyLCAxOTIpOwogCi0gICAgLyoqIFRoZSBjb2xvciBsaWdodCBncmF5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBjb2xvciBsaWdodCBncmF5LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgTElHSFRfR1JBWSA9IGxpZ2h0R3JheTsKIAotICAgIC8qKiBUaGUgY29sb3IgZ3JheS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY29sb3IgZ3JheS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIGdyYXkgPSBuZXcgQ29sb3IoMTI4LCAxMjgsIDEyOCk7CiAKLSAgICAvKiogVGhlIGNvbG9yIGdyYXkuICovCisgICAgLyoqCisgICAgICogVGhlIGNvbG9yIGdyYXkuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBHUkFZID0gZ3JheTsKIAotICAgIC8qKiBUaGUgY29sb3IgZGFyayBncmF5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBjb2xvciBkYXJrIGdyYXkuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBkYXJrR3JheSA9IG5ldyBDb2xvcig2NCwgNjQsIDY0KTsKIAotICAgIC8qKiBUaGUgY29sb3IgZGFyayBncmF5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBjb2xvciBkYXJrIGdyYXkuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBEQVJLX0dSQVkgPSBkYXJrR3JheTsKIAotICAgIC8qKiBUaGUgY29sb3IgYmxhY2suICovCisgICAgLyoqCisgICAgICogVGhlIGNvbG9yIGJsYWNrLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgYmxhY2sgPSBuZXcgQ29sb3IoMCwgMCwgMCk7CiAKLSAgICAvKiogVGhlIGNvbG9yIGJsYWNrLiAqLworICAgIC8qKgorICAgICAqIFRoZSBjb2xvciBibGFjay4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIEJMQUNLID0gYmxhY2s7CiAKLSAgICAvKiogVGhlIGNvbG9yIHJlZC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY29sb3IgcmVkLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgcmVkID0gbmV3IENvbG9yKDI1NSwgMCwgMCk7CiAKLSAgICAvKiogVGhlIGNvbG9yIHJlZC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY29sb3IgcmVkLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgUkVEID0gcmVkOwogCi0gICAgLyoqIFRoZSBjb2xvciBwaW5rLiAqLworICAgIC8qKgorICAgICAqIFRoZSBjb2xvciBwaW5rLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgcGluayA9IG5ldyBDb2xvcigyNTUsIDE3NSwgMTc1KTsKIAotICAgIC8qKiBUaGUgY29sb3IgcGluay4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY29sb3IgcGluay4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIFBJTksgPSBwaW5rOwogCi0gICAgLyoqIFRoZSBjb2xvciBvcmFuZ2UuICovCisgICAgLyoqCisgICAgICogVGhlIGNvbG9yIG9yYW5nZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIG9yYW5nZSA9IG5ldyBDb2xvcigyNTUsIDIwMCwgMCk7CiAKLSAgICAvKiogVGhlIGNvbG9yIG9yYW5nZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY29sb3Igb3JhbmdlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgT1JBTkdFID0gb3JhbmdlOwogCi0gICAgLyoqIFRoZSBjb2xvciB5ZWxsb3cuICovCisgICAgLyoqCisgICAgICogVGhlIGNvbG9yIHllbGxvdy4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIHllbGxvdyA9IG5ldyBDb2xvcigyNTUsIDI1NSwgMCk7CiAKLSAgICAvKiogVGhlIGNvbG9yIHllbGxvdy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY29sb3IgeWVsbG93LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgWUVMTE9XID0geWVsbG93OwogCi0gICAgLyoqIFRoZSBjb2xvciBncmVlbi4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY29sb3IgZ3JlZW4uCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBncmVlbiA9IG5ldyBDb2xvcigwLCAyNTUsIDApOwogCi0gICAgLyoqIFRoZSBjb2xvciBncmVlbi4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY29sb3IgZ3JlZW4uCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBHUkVFTiA9IGdyZWVuOwogCi0gICAgLyoqIFRoZSBjb2xvciBtYWdlbnRhLiAqLworICAgIC8qKgorICAgICAqIFRoZSBjb2xvciBtYWdlbnRhLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgbWFnZW50YSA9IG5ldyBDb2xvcigyNTUsIDAsIDI1NSk7CiAKLSAgICAvKiogVGhlIGNvbG9yIG1hZ2VudGEuICovCisgICAgLyoqCisgICAgICogVGhlIGNvbG9yIG1hZ2VudGEuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBNQUdFTlRBID0gbWFnZW50YTsKIAotICAgIC8qKiBUaGUgY29sb3IgY3lhbi4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY29sb3IgY3lhbi4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIGN5YW4gPSBuZXcgQ29sb3IoMCwgMjU1LCAyNTUpOwogCi0gICAgLyoqIFRoZSBjb2xvciBjeWFuLiAqLworICAgIC8qKgorICAgICAqIFRoZSBjb2xvciBjeWFuLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgQ1lBTiA9IGN5YW47CiAKLSAgICAvKiogVGhlIGNvbG9yIGJsdWUuICovCisgICAgLyoqCisgICAgICogVGhlIGNvbG9yIGJsdWUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBibHVlID0gbmV3IENvbG9yKDAsIDAsIDI1NSk7CiAKLSAgICAvKiogVGhlIGNvbG9yIGJsdWUuICovCisgICAgLyoqCisgICAgICogVGhlIGNvbG9yIGJsdWUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBCTFVFID0gYmx1ZTsKIAotICAgIC8qKiBpbnRlZ2VyIFJHQiB2YWx1ZS4gKi8KKyAgICAvKioKKyAgICAgKiBpbnRlZ2VyIFJHQiB2YWx1ZS4KKyAgICAgKi8KICAgICBpbnQgdmFsdWU7CiAKLSAgICAvKiogRmxvYXQgc1JHQiB2YWx1ZS4gKi8KKyAgICAvKioKKyAgICAgKiBGbG9hdCBzUkdCIHZhbHVlLgorICAgICAqLwogICAgIHByaXZhdGUgZmxvYXRbXSBmcmdidmFsdWU7CiAKLSAgICAvKiogQ29sb3IgaW4gYW4gYXJiaXRyYXJ5IGNvbG9yIHNwYWNlIHdpdGggPGNvZGU+ZmxvYXQ8L2NvZGU+IGNvbXBvbmVudHMuIElmIG51bGwsIG90aGVyIHZhbHVlIHNob3VsZCBiZSB1c2VkLiAqLworICAgIC8qKgorICAgICAqIENvbG9yIGluIGFuIGFyYml0cmFyeSBjb2xvciBzcGFjZSB3aXRoIDxjb2RlPmZsb2F0PC9jb2RlPiBjb21wb25lbnRzLiBJZgorICAgICAqIG51bGwsIG90aGVyIHZhbHVlIHNob3VsZCBiZSB1c2VkLgorICAgICAqLwogICAgIHByaXZhdGUgZmxvYXQgZnZhbHVlW107CiAKLSAgICAvKiogRmxvYXQgYWxwaGEgdmFsdWUuIElmIGZyZ2J2YWx1ZSBpcyBudWxsLCB0aGlzIGlzIG5vdCB2YWxpZCBkYXRhLiAqLworICAgIC8qKgorICAgICAqIEZsb2F0IGFscGhhIHZhbHVlLiBJZiBmcmdidmFsdWUgaXMgbnVsbCwgdGhpcyBpcyBub3QgdmFsaWQgZGF0YS4KKyAgICAgKi8KICAgICBwcml2YXRlIGZsb2F0IGZhbHBoYTsKIAotICAgIC8qKiBUaGUgY29sb3IncyBjb2xvciBzcGFjZSBpZiBhcHBsaWNhYmxlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBjb2xvcidzIGNvbG9yIHNwYWNlIGlmIGFwcGxpY2FibGUuCisgICAgICovCiAgICAgcHJpdmF0ZSBDb2xvclNwYWNlIGNzOwogCiAgICAgLyoKLSAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIFNDQUxFX0ZBQ1RPUiBpcyBiYXNlZCBvbiAxLjUgcmVsZWFzZSBiZWhhdmlvciB3aGljaAotICAgICAqIGNhbiBiZSByZXZlYWxlZCB1c2luZyB0aGUgZm9sbG93aW5nIGNvZGU6Ci0gICAgICogICBDb2xvciBjID0gbmV3IENvbG9yKDEwMCwgMTAwLCAxMDApOwotICAgICAqICAgQ29sb3IgYmMgPSBjLmJyaWdodGVyKCk7Ci0gICAgICogICBTeXN0ZW0ub3V0LnByaW50bG4oIkJyaWdodGVyIGZhY3RvcjogIiArICgoZmxvYXQpYy5nZXRSZWQoKSkvKChmbG9hdCliYy5nZXRSZWQoKSkpOwotICAgICAqICAgQ29sb3IgZGMgPSBjLmRhcmtlcigpOwotICAgICAqICAgU3lzdGVtLm91dC5wcmludGxuKCJEYXJrZXIgZmFjdG9yOiAiICsgKChmbG9hdClkYy5nZXRSZWQoKSkvKChmbG9hdCljLmdldFJlZCgpKSk7Ci0gICAgICogVGhlIHJlc3VsdCBpcyB0aGUgc2FtZSBmb3IgYnJpZ2h0ZXIgYW5kIGRhcmtlciBtZXRob2RzLCBzbyB3ZSBuZWVkIG9ubHkKLSAgICAgKiBvbmUgc2NhbGUgZmFjdG9yIGZvciBib3RoLgorICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgU0NBTEVfRkFDVE9SIGlzIGJhc2VkIG9uIDEuNSByZWxlYXNlIGJlaGF2aW9yIHdoaWNoIGNhbgorICAgICAqIGJlIHJldmVhbGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29kZTogQ29sb3IgYyA9IG5ldyBDb2xvcigxMDAsIDEwMCwgMTAwKTsKKyAgICAgKiBDb2xvciBiYyA9IGMuYnJpZ2h0ZXIoKTsgU3lzdGVtLm91dC5wcmludGxuKCJCcmlnaHRlciBmYWN0b3I6ICIgKworICAgICAqICgoZmxvYXQpYy5nZXRSZWQoKSkvKChmbG9hdCliYy5nZXRSZWQoKSkpOyBDb2xvciBkYyA9IGMuZGFya2VyKCk7CisgICAgICogU3lzdGVtLm91dC5wcmludGxuKCJEYXJrZXIgZmFjdG9yOiAiICsKKyAgICAgKiAoKGZsb2F0KWRjLmdldFJlZCgpKS8oKGZsb2F0KWMuZ2V0UmVkKCkpKTsgVGhlIHJlc3VsdCBpcyB0aGUgc2FtZSBmb3IKKyAgICAgKiBicmlnaHRlciBhbmQgZGFya2VyIG1ldGhvZHMsIHNvIHdlIG5lZWQgb25seSBvbmUgc2NhbGUgZmFjdG9yIGZvciBib3RoLgogICAgICAqLwotICAgIC8qKiBUaGUgQ29uc3RhbnQgU0NBTEVfRkFDVE9SLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBTQ0FMRV9GQUNUT1IuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIFNDQUxFX0ZBQ1RPUiA9IDAuNzsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgTUlOX1NDQUxBQkxFLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fU0NBTEFCTEUgPSAzOyAvLyBzaG91bGQgaW5jcmVhc2Ugd2hlbiBtdWx0aXBsaWVkIGJ5IFNDQUxFX0ZBQ1RPUgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBNSU5fU0NBTEFCTEUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9TQ0FMQUJMRSA9IDM7IC8vIHNob3VsZCBpbmNyZWFzZSB3aGVuCiAKLSAgICAvKiogVGhlIGN1cnJlbnQgcGFpbnQgY29udGV4dC4gKi8KKyAgICAvLyBtdWx0aXBsaWVkIGJ5IFNDQUxFX0ZBQ1RPUgorCisgICAgLyoqCisgICAgICogVGhlIGN1cnJlbnQgcGFpbnQgY29udGV4dC4KKyAgICAgKi8KICAgICB0cmFuc2llbnQgcHJpdmF0ZSBQYWludENvbnRleHQgY3VycmVudFBhaW50Q29udGV4dDsKIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBjb2xvciBpbiB0aGUgc3BlY2lmaWVkIENvbG9yU3BhY2UsIHRoZSBzcGVjaWZpZWQgY29sb3IgCi0gICAgICogY29tcG9uZW50cyBhbmQgdGhlIHNwZWNpZmllZCBhbHBoYS4gCisgICAgICogQ3JlYXRlcyBhIGNvbG9yIGluIHRoZSBzcGVjaWZpZWQgQ29sb3JTcGFjZSwgdGhlIHNwZWNpZmllZCBjb2xvcgorICAgICAqIGNvbXBvbmVudHMgYW5kIHRoZSBzcGVjaWZpZWQgYWxwaGEuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNzcGFjZSB0aGUgQ29sb3JTcGFjZSB0byBiZSB1c2VkIHRvIGRlZmluZSB0aGUgY29tcG9uZW50cy4KLSAgICAgKiBAcGFyYW0gY29tcG9uZW50cyB0aGUgY29tcG9uZW50cy4KLSAgICAgKiBAcGFyYW0gYWxwaGEgdGhlIGFscGhhLgorICAgICAqIEBwYXJhbSBjc3BhY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBDb2xvclNwYWNlIHRvIGJlIHVzZWQgdG8gZGVmaW5lIHRoZSBjb21wb25lbnRzLgorICAgICAqIEBwYXJhbSBjb21wb25lbnRzCisgICAgICogICAgICAgICAgICB0aGUgY29tcG9uZW50cy4KKyAgICAgKiBAcGFyYW0gYWxwaGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbHBoYS4KICAgICAgKi8KICAgICBwdWJsaWMgQ29sb3IoQ29sb3JTcGFjZSBjc3BhY2UsIGZsb2F0W10gY29tcG9uZW50cywgZmxvYXQgYWxwaGEpIHsKICAgICAgICAgaW50IG5Db21wcyA9IGNzcGFjZS5nZXROdW1Db21wb25lbnRzKCk7CiAgICAgICAgIGZsb2F0IGNvbXA7CiAgICAgICAgIGZ2YWx1ZSA9IG5ldyBmbG9hdFtuQ29tcHNdOwogCi0gICAgICAgIGZvcihpbnQgaT0wIDsgaTxuQ29tcHM7IGkrKykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Db21wczsgaSsrKSB7CiAgICAgICAgICAgICBjb21wID0gY29tcG9uZW50c1tpXTsKLSAgICAgICAgICAgIGlmKGNvbXAgPCAwLjBmIHx8IGNvbXAgPiAxLjBmKSB7Ci0gICAgICAgICAgICAgICAgLy8gYXd0LjEwNz1Db2xvciBwYXJhbWV0ZXIgb3V0c2lkZSBvZiBleHBlY3RlZCByYW5nZTogY29tcG9uZW50IHswfS4KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMTA3IiwgaSkpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICBpZiAoY29tcCA8IDAuMGYgfHwgY29tcCA+IDEuMGYpIHsKKyAgICAgICAgICAgICAgICAvLyBhd3QuMTA3PUNvbG9yIHBhcmFtZXRlciBvdXRzaWRlIG9mIGV4cGVjdGVkIHJhbmdlOiBjb21wb25lbnQKKyAgICAgICAgICAgICAgICAvLyB7MH0uCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4xMDciLCBpKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZ2YWx1ZVtpXSA9IGNvbXBvbmVudHNbaV07CiAgICAgICAgIH0KQEAgLTE5NiwyMiArMjcyLDIyIEBACiAKICAgICAgICAgZnJnYnZhbHVlID0gY3MudG9SR0IoZnZhbHVlKTsKIAotICAgICAgICB2YWx1ZSA9ICAoKGludCkoZnJnYnZhbHVlWzJdKjI1NSArIDAuNSkpICAgIHwKLSAgICAgICAgICAgICAgICAoKChpbnQpKGZyZ2J2YWx1ZVsxXSoyNTUgKyAwLjUpKSA8PCA4ICkgIHwKLSAgICAgICAgICAgICAgICAoKChpbnQpKGZyZ2J2YWx1ZVswXSoyNTUgKyAwLjUpKSA8PCAxNiApIHwKLSAgICAgICAgICAgICAgICAoKChpbnQpKGZhbHBoYSoyNTUgKyAwLjUpKSA8PCAyNCApOworICAgICAgICB2YWx1ZSA9ICgoaW50KShmcmdidmFsdWVbMl0gKiAyNTUgKyAwLjUpKSB8ICgoKGludCkoZnJnYnZhbHVlWzFdICogMjU1ICsgMC41KSkgPDwgOCkKKyAgICAgICAgICAgICAgICB8ICgoKGludCkoZnJnYnZhbHVlWzBdICogMjU1ICsgMC41KSkgPDwgMTYpIHwgKCgoaW50KShmYWxwaGEgKiAyNTUgKyAwLjUpKSA8PCAyNCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHNSR0IgY29sb3Igd2l0aCB0aGUgc3BlY2lmaWVkIGNvbWJpbmVkIAotICAgICAqIFJHQkEgdmFsdWUgY29uc2lzdGluZyBvZiB0aGUgYWxwaGEgY29tcG9uZW50IGluIGJpdHMgMjQtMzEsIAotICAgICAqIHRoZSByZWQgY29tcG9uZW50IGluIGJpdHMgMTYtMjMsIHRoZSBncmVlbiBjb21wb25lbnQgaW4gYml0cyA4LTE1LCAKLSAgICAgKiBhbmQgdGhlIGJsdWUgY29tcG9uZW50IGluIGJpdHMgMC03LiBJZiB0aGUgaGFzYWxwaGEgYXJndW1lbnQgaXMgCi0gICAgICogZmFsc2UsIHRoZSBhbHBoYSBoYXMgZGVmYXVsdCB2YWx1ZSAtIDI1NS4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgc1JHQiBjb2xvciB3aXRoIHRoZSBzcGVjaWZpZWQgY29tYmluZWQgUkdCQSB2YWx1ZQorICAgICAqIGNvbnNpc3Rpbmcgb2YgdGhlIGFscGhhIGNvbXBvbmVudCBpbiBiaXRzIDI0LTMxLCB0aGUgcmVkIGNvbXBvbmVudCBpbgorICAgICAqIGJpdHMgMTYtMjMsIHRoZSBncmVlbiBjb21wb25lbnQgaW4gYml0cyA4LTE1LCBhbmQgdGhlIGJsdWUgY29tcG9uZW50IGluCisgICAgICogYml0cyAwLTcuIElmIHRoZSBoYXNhbHBoYSBhcmd1bWVudCBpcyBmYWxzZSwgdGhlIGFscGhhIGhhcyBkZWZhdWx0IHZhbHVlCisgICAgICogLSAyNTUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHJnYmEgdGhlIFJHQkEgY29tcG9uZW50cy4KLSAgICAgKiBAcGFyYW0gaGFzQWxwaGEgYWxwaGEgcGFyYW1ldGVyIGlzIHRydWUgaWYgYWxwaGEgYml0cyBhcmUgdmFsaWQsCi0gICAgICogZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEBwYXJhbSByZ2JhCisgICAgICogICAgICAgICAgICB0aGUgUkdCQSBjb21wb25lbnRzLgorICAgICAqIEBwYXJhbSBoYXNBbHBoYQorICAgICAqICAgICAgICAgICAgdGhlIGFscGhhIHBhcmFtZXRlciBpcyB0cnVlIGlmIGFscGhhIGJpdHMgYXJlIHZhbGlkLCBmYWxzZQorICAgICAqICAgICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBDb2xvcihpbnQgcmdiYSwgYm9vbGVhbiBoYXNBbHBoYSkgewogICAgICAgICBpZiAoIWhhc0FscGhhKSB7CkBAIC0yMjIsMTMgKzI5OCwxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBjb2xvciB3aXRoIHRoZSBzcGVjaWZpZWQgcmVkLCBncmVlbiwgYmx1ZSBhbmQgYWxwaGEgCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGNvbG9yIHdpdGggdGhlIHNwZWNpZmllZCByZWQsIGdyZWVuLCBibHVlIGFuZCBhbHBoYQogICAgICAqIGNvbXBvbmVudHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHIgdGhlIHJlZCBjb21wb25lbnQuCi0gICAgICogQHBhcmFtIGcgdGhlIGdyZWVuIGNvbXBvbmVudC4KLSAgICAgKiBAcGFyYW0gYiB0aGUgYmx1ZSBjb21wb25lbnQuCi0gICAgICogQHBhcmFtIGEgdGhlIGFscGhhIGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gcgorICAgICAqICAgICAgICAgICAgdGhlIHJlZCBjb21wb25lbnQuCisgICAgICogQHBhcmFtIGcKKyAgICAgKiAgICAgICAgICAgIHRoZSBncmVlbiBjb21wb25lbnQuCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBibHVlIGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gYQorICAgICAqICAgICAgICAgICAgdGhlIGFscGhhIGNvbXBvbmVudC4KICAgICAgKi8KICAgICBwdWJsaWMgQ29sb3IoaW50IHIsIGludCBnLCBpbnQgYiwgaW50IGEpIHsKICAgICAgICAgaWYgKChyICYgMHhGRikgIT0gciB8fCAoZyAmIDB4RkYpICE9IGcgfHwgKGIgJiAweEZGKSAhPSBiIHx8IChhICYgMHhGRikgIT0gYSkgewpAQCAtMjM5LDEyICszMTksMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgb3BhcXVlIHNSR0IgY29sb3Igd2l0aCB0aGUgc3BlY2lmaWVkIHJlZCwgZ3JlZW4sIAotICAgICAqIGFuZCBibHVlIHZhbHVlcy4gVGhlIEFscGhhIGNvbXBvbmVudCBpcyBzZXQgdG8gdGhlIGRlZmF1bHQgLSAxLjAuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IG9wYXF1ZSBzUkdCIGNvbG9yIHdpdGggdGhlIHNwZWNpZmllZCByZWQsIGdyZWVuLCBhbmQKKyAgICAgKiBibHVlIHZhbHVlcy4gVGhlIEFscGhhIGNvbXBvbmVudCBpcyBzZXQgdG8gdGhlIGRlZmF1bHQgLSAxLjAuCiAgICAgICogCi0gICAgICogQHBhcmFtIHIgdGhlIHJlZCBjb21wb25lbnQuIAotICAgICAqIEBwYXJhbSBnIHRoZSBncmVlbiBjb21wb25lbnQuCi0gICAgICogQHBhcmFtIGIgdGhlIGJsdWUgY29tcG9uZW50LgorICAgICAqIEBwYXJhbSByCisgICAgICogICAgICAgICAgICB0aGUgcmVkIGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gZworICAgICAqICAgICAgICAgICAgdGhlIGdyZWVuIGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIGJsdWUgY29tcG9uZW50LgogICAgICAqLwogICAgIHB1YmxpYyBDb2xvcihpbnQgciwgaW50IGcsIGludCBiKSB7CiAgICAgICAgIGlmICgociAmIDB4RkYpICE9IHIgfHwgKGcgJiAweEZGKSAhPSBnIHx8IChiICYgMHhGRikgIT0gYikgewpAQCAtMjU2LDMxICszMzksMzIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgc1JHQiBjb2xvciB3aXRoIHRoZSBzcGVjaWZpZWQgCi0gICAgICogUkdCIHZhbHVlIGNvbnNpc3Rpbmcgb2YgdGhlIHJlZCBjb21wb25lbnQgaW4gYml0cyAxNi0yMywgCi0gICAgICogdGhlIGdyZWVuIGNvbXBvbmVudCBpbiBiaXRzIDgtMTUsIGFuZCB0aGUgYmx1ZSBjb21wb25lbnQgCi0gICAgICogaW4gYml0cyAwLTcuIEFscGhhIGhhcyBkZWZhdWx0IHZhbHVlIC0gMjU1LgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBzUkdCIGNvbG9yIHdpdGggdGhlIHNwZWNpZmllZCBSR0IgdmFsdWUgY29uc2lzdGluZyBvZgorICAgICAqIHRoZSByZWQgY29tcG9uZW50IGluIGJpdHMgMTYtMjMsIHRoZSBncmVlbiBjb21wb25lbnQgaW4gYml0cyA4LTE1LCBhbmQKKyAgICAgKiB0aGUgYmx1ZSBjb21wb25lbnQgaW4gYml0cyAwLTcuIEFscGhhIGhhcyBkZWZhdWx0IHZhbHVlIC0gMjU1LgogICAgICAqIAotICAgICAqIEBwYXJhbSByZ2IgdGhlIFJHQiBjb21wb25lbnRzLgorICAgICAqIEBwYXJhbSByZ2IKKyAgICAgKiAgICAgICAgICAgIHRoZSBSR0IgY29tcG9uZW50cy4KICAgICAgKi8KICAgICBwdWJsaWMgQ29sb3IoaW50IHJnYikgewogICAgICAgICB2YWx1ZSA9IHJnYiB8IDB4RkYwMDAwMDA7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGNvbG9yIHdpdGggdGhlIHNwZWNpZmllZCByZWQsIGdyZWVuLCBibHVlIGFuZCBhbHBoYSAKKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgY29sb3Igd2l0aCB0aGUgc3BlY2lmaWVkIHJlZCwgZ3JlZW4sIGJsdWUgYW5kIGFscGhhCiAgICAgICogY29tcG9uZW50cy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gciB0aGUgcmVkIGNvbXBvbmVudC4KLSAgICAgKiBAcGFyYW0gZyB0aGUgZ3JlZW4gY29tcG9uZW50LgotICAgICAqIEBwYXJhbSBiIHRoZSBibHVlIGNvbXBvbmVudC4KLSAgICAgKiBAcGFyYW0gYSB0aGUgYWxwaGEgY29tcG9uZW50LgorICAgICAqIEBwYXJhbSByCisgICAgICogICAgICAgICAgICB0aGUgcmVkIGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gZworICAgICAqICAgICAgICAgICAgdGhlIGdyZWVuIGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIGJsdWUgY29tcG9uZW50LgorICAgICAqIEBwYXJhbSBhCisgICAgICogICAgICAgICAgICB0aGUgYWxwaGEgY29tcG9uZW50LgogICAgICAqLwogICAgIHB1YmxpYyBDb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKSB7Ci0gICAgICAgIHRoaXMoKGludCkocioyNTUrMC41KSwKLSAgICAgICAgICAgICAgICAoaW50KShnKjI1NSswLjUpLAotICAgICAgICAgICAgICAgIChpbnQpKGIqMjU1KzAuNSksCi0gICAgICAgICAgICAgICAgKGludCkoYSoyNTUrMC41KSk7CisgICAgICAgIHRoaXMoKGludCkociAqIDI1NSArIDAuNSksIChpbnQpKGcgKiAyNTUgKyAwLjUpLCAoaW50KShiICogMjU1ICsgMC41KSwgKGludCkoYSAqIDI1NSArIDAuNSkpOwogICAgICAgICBmYWxwaGEgPSBhOwogICAgICAgICBmdmFsdWUgPSBuZXcgZmxvYXRbM107CiAgICAgICAgIGZ2YWx1ZVswXSA9IHI7CkBAIC0yOTAsMjUgKzM3NCwyMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBjb2xvciB3aXRoIHRoZSBzcGVjaWZpZWQgcmVkLCBncmVlbiwgYW5kIGJsdWUgCi0gICAgICogY29tcG9uZW50cyBhbmQgZGVmYXVsdCBhbGZhIHZhbHVlIC0gMS4wLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBjb2xvciB3aXRoIHRoZSBzcGVjaWZpZWQgcmVkLCBncmVlbiwgYW5kIGJsdWUKKyAgICAgKiBjb21wb25lbnRzIGFuZCBkZWZhdWx0IGFscGhhIHZhbHVlIC0gMS4wLgogICAgICAqIAotICAgICAqIEBwYXJhbSByIHRoZSByZWQgY29tcG9uZW50LgotICAgICAqIEBwYXJhbSBnIHRoZSBncmVlbiBjb21wb25lbnQuCi0gICAgICogQHBhcmFtIGIgdGhlIGJsdWUgY29tcG9uZW50LgorICAgICAqIEBwYXJhbSByCisgICAgICogICAgICAgICAgICB0aGUgcmVkIGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gZworICAgICAqICAgICAgICAgICAgdGhlIGdyZWVuIGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIGJsdWUgY29tcG9uZW50LgogICAgICAqLwogICAgIHB1YmxpYyBDb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiKSB7CiAgICAgICAgIHRoaXMociwgZywgYiwgMS4wZik7CiAgICAgfQogCi0gICAgcHVibGljIFBhaW50Q29udGV4dCBjcmVhdGVDb250ZXh0KAotICAgICAgICAgICAgQ29sb3JNb2RlbCBjbSwKLSAgICAgICAgICAgIFJlY3RhbmdsZSByLAotICAgICAgICAgICAgUmVjdGFuZ2xlMkQgcjJkLAotICAgICAgICAgICAgQWZmaW5lVHJhbnNmb3JtIHhmb3JtLAotICAgICAgICAgICAgUmVuZGVyaW5nSGludHMgcmhzCi0gICAgKSB7Ci0gICAgICAgIGlmKGN1cnJlbnRQYWludENvbnRleHQgIT0gbnVsbCkgeworICAgIHB1YmxpYyBQYWludENvbnRleHQgY3JlYXRlQ29udGV4dChDb2xvck1vZGVsIGNtLCBSZWN0YW5nbGUgciwgUmVjdGFuZ2xlMkQgcjJkLAorICAgICAgICAgICAgQWZmaW5lVHJhbnNmb3JtIHhmb3JtLCBSZW5kZXJpbmdIaW50cyByaHMpIHsKKyAgICAgICAgaWYgKGN1cnJlbnRQYWludENvbnRleHQgIT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRQYWludENvbnRleHQ7CiAgICAgICAgIH0KICAgICAgICAgY3VycmVudFBhaW50Q29udGV4dCA9IG5ldyBDb2xvci5Db2xvclBhaW50Q29udGV4dCh2YWx1ZSk7CkBAIC0zMjMsMTUgKzQwNSwxMiBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIC8qCi0gICAgICAgICAgIFRoZSBmb3JtYXQgb2YgdGhlIHN0cmluZyBpcyBiYXNlZCBvbiAxLjUgcmVsZWFzZSBiZWhhdmlvciB3aGljaAotICAgICAgICAgICBjYW4gYmUgcmV2ZWFsZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBjb2RlOgorICAgICAgICAgKiBUaGUgZm9ybWF0IG9mIHRoZSBzdHJpbmcgaXMgYmFzZWQgb24gMS41IHJlbGVhc2UgYmVoYXZpb3Igd2hpY2ggY2FuCisgICAgICAgICAqIGJlIHJldmVhbGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29kZTogQ29sb3IgYyA9IG5ldyBDb2xvcigxLCAyLCAzKTsKKyAgICAgICAgICogU3lzdGVtLm91dC5wcmludGxuKGMpOworICAgICAgICAgKi8KIAotICAgICAgICAgICBDb2xvciBjID0gbmV3IENvbG9yKDEsIDIsIDMpOwotICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oYyk7Ci0gICAgICAgICovCi0gICAgICAgIAotICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKwotICAgICAgICAgICAgICAgICJbcj0iICsgZ2V0UmVkKCkgKyAvLyROT04tTkxTLTEkCisgICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArICJbcj0iICsgZ2V0UmVkKCkgKyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICAgICAgIixnPSIgKyBnZXRHcmVlbigpICsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAgICIsYj0iICsgZ2V0Qmx1ZSgpICsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAgICJdIjsgLy8kTk9OLU5MUy0xJApAQCAtMzQwLDY1ICs0MTksNjcgQEAKICAgICAvKioKICAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIE9iamVjdCB0byB0aGUgQ29sb3IuCiAgICAgICogCi0gICAgICogQHBhcmFtIG9iaiB0aGUgT2JqZWN0IHRvIGJlIGNvbXBhcmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCBPYmplY3QgaXMgYSBDb2xvciB3aG9zZSAKLSAgICAgKiB2YWx1ZSBpcyBlcXVhbCB0byB0aGlzIENvbG9yLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIG9iagorICAgICAqICAgICAgICAgICAgdGhlIE9iamVjdCB0byBiZSBjb21wYXJlZC4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgT2JqZWN0IGlzIGEgQ29sb3Igd2hvc2UgdmFsdWUgaXMgZXF1YWwgdG8KKyAgICAgKiAgICAgICAgIHRoaXMgQ29sb3IsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZihvYmogaW5zdGFuY2VvZiBDb2xvcikgeworICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQ29sb3IpIHsKICAgICAgICAgICAgIHJldHVybiAoKENvbG9yKW9iaikudmFsdWUgPT0gdGhpcy52YWx1ZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIGZsb2F0IGFycmF5IGNvbnRhaW5pbmcgdGhlIGNvbG9yIGFuZCBhbHBoYSBjb21wb25lbnRzIG9mIAotICAgICAqIHRoZSBDb2xvciBpbiB0aGUgc3BlY2lmaWVkIENvbG9yU3BhY2UuIAorICAgICAqIFJldHVybnMgYSBmbG9hdCBhcnJheSBjb250YWluaW5nIHRoZSBjb2xvciBhbmQgYWxwaGEgY29tcG9uZW50cyBvZiB0aGUKKyAgICAgKiBDb2xvciBpbiB0aGUgc3BlY2lmaWVkIENvbG9yU3BhY2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNvbG9yU3BhY2UgdGhlIHNwZWNpZmllZCBDb2xvclNwYWNlLgotICAgICAqIEBwYXJhbSBjb21wb25lbnRzIHRoZSByZXN1bHRzIG9mIHRoaXMgbWV0aG9kIHdpbGwgYmUgd3JpdHRlbiB0bwotICAgICAqIHRoaXMgZmxvYXQgYXJyYXkuIElmIG51bGwsIGEgZmxvYXQgYXJyYXkgd2lsbCBiZSBjcmVhdGVkLgotICAgICAqIAorICAgICAqIEBwYXJhbSBjb2xvclNwYWNlCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIENvbG9yU3BhY2UuCisgICAgICogQHBhcmFtIGNvbXBvbmVudHMKKyAgICAgKiAgICAgICAgICAgIHRoZSByZXN1bHRzIG9mIHRoaXMgbWV0aG9kIHdpbGwgYmUgd3JpdHRlbiB0byB0aGlzIGZsb2F0CisgICAgICogICAgICAgICAgICBhcnJheS4gSWYgbnVsbCwgYSBmbG9hdCBhcnJheSB3aWxsIGJlIGNyZWF0ZWQuCiAgICAgICogQHJldHVybiB0aGUgY29sb3IgYW5kIGFscGhhIGNvbXBvbmVudHMgaW4gYSBmbG9hdCBhcnJheS4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXRbXSBnZXRDb21wb25lbnRzKENvbG9yU3BhY2UgY29sb3JTcGFjZSwgZmxvYXRbXSBjb21wb25lbnRzKSB7CiAgICAgICAgIGludCBuQ29tcHMgPSBjb2xvclNwYWNlLmdldE51bUNvbXBvbmVudHMoKTsKLSAgICAgICAgaWYoY29tcG9uZW50cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjb21wb25lbnRzID0gbmV3IGZsb2F0W25Db21wcysxXTsKKyAgICAgICAgaWYgKGNvbXBvbmVudHMgPT0gbnVsbCkgeworICAgICAgICAgICAgY29tcG9uZW50cyA9IG5ldyBmbG9hdFtuQ29tcHMgKyAxXTsKICAgICAgICAgfQogCiAgICAgICAgIGdldENvbG9yQ29tcG9uZW50cyhjb2xvclNwYWNlLCBjb21wb25lbnRzKTsKIAotICAgICAgICBpZihmcmdidmFsdWUgIT0gbnVsbCkgeworICAgICAgICBpZiAoZnJnYnZhbHVlICE9IG51bGwpIHsKICAgICAgICAgICAgIGNvbXBvbmVudHNbbkNvbXBzXSA9IGZhbHBoYTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbXBvbmVudHNbbkNvbXBzXSA9IGdldEFscGhhKCkvMjU1ZjsKKyAgICAgICAgICAgIGNvbXBvbmVudHNbbkNvbXBzXSA9IGdldEFscGhhKCkgLyAyNTVmOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIGZsb2F0IGFycmF5IGNvbnRhaW5pbmcgdGhlIGNvbG9yIGNvbXBvbmVudHMgb2YgCi0gICAgICogdGhlIENvbG9yIGluIHRoZSBzcGVjaWZpZWQgQ29sb3JTcGFjZS4KKyAgICAgKiBSZXR1cm5zIGEgZmxvYXQgYXJyYXkgY29udGFpbmluZyB0aGUgY29sb3IgY29tcG9uZW50cyBvZiB0aGUgQ29sb3IgaW4gdGhlCisgICAgICogc3BlY2lmaWVkIENvbG9yU3BhY2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNvbG9yU3BhY2UgdGhlIHNwZWNpZmllZCBDb2xvclNwYWNlLgotICAgICAqIEBwYXJhbSBjb21wb25lbnRzIHRoZSByZXN1bHRzIG9mIHRoaXMgbWV0aG9kIHdpbGwgYmUgd3JpdHRlbiB0bwotICAgICAqIHRoaXMgZmxvYXQgYXJyYXkuIElmIG51bGwsIGEgZmxvYXQgYXJyYXkgd2lsbCBiZSBjcmVhdGVkLgotICAgICAqIAorICAgICAqIEBwYXJhbSBjb2xvclNwYWNlCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIENvbG9yU3BhY2UuCisgICAgICogQHBhcmFtIGNvbXBvbmVudHMKKyAgICAgKiAgICAgICAgICAgIHRoZSByZXN1bHRzIG9mIHRoaXMgbWV0aG9kIHdpbGwgYmUgd3JpdHRlbiB0byB0aGlzIGZsb2F0CisgICAgICogICAgICAgICAgICBhcnJheS4gSWYgbnVsbCwgYSBmbG9hdCBhcnJheSB3aWxsIGJlIGNyZWF0ZWQuCiAgICAgICogQHJldHVybiB0aGUgY29sb3IgY29tcG9uZW50cyBpbiBhIGZsb2F0IGFycmF5LgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdFtdIGdldENvbG9yQ29tcG9uZW50cyhDb2xvclNwYWNlIGNvbG9yU3BhY2UsIGZsb2F0W10gY29tcG9uZW50cykgewogICAgICAgICBmbG9hdFtdIGNpZVhZWkNvbXBvbmVudHMgPSBnZXRDb2xvclNwYWNlKCkudG9DSUVYWVooZ2V0Q29sb3JDb21wb25lbnRzKG51bGwpKTsKICAgICAgICAgZmxvYXRbXSBjc0NvbXBvbmVudHMgPSBjb2xvclNwYWNlLmZyb21DSUVYWVooY2llWFlaQ29tcG9uZW50cyk7CiAKLSAgICAgICAgaWYoY29tcG9uZW50cyA9PSBudWxsKSB7CisgICAgICAgIGlmIChjb21wb25lbnRzID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBjc0NvbXBvbmVudHM7CiAgICAgICAgIH0KIAotICAgICAgICBmb3IoaW50IGk9MDsgaTxjc0NvbXBvbmVudHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjc0NvbXBvbmVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgIGNvbXBvbmVudHNbaV0gPSBjc0NvbXBvbmVudHNbaV07CiAgICAgICAgIH0KIApAQCAtNDE5LDE2ICs1MDAsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IENvbG9yIHdoaWNoIGlzIGEgZGFya2VyIHRoYW4gdGhpcyBDb2xvcgotICAgICAqIGFjY29yZGluZyB0byBhIGZpeGVkIHNjYWxlIGZhY3Rvci4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IENvbG9yIHdoaWNoIGlzIGEgZGFya2VyIHRoYW4gdGhpcyBDb2xvciBhY2NvcmRpbmcgdG8gYQorICAgICAqIGZpeGVkIHNjYWxlIGZhY3Rvci4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBkYXJrZXIgQ29sb3IuCiAgICAgICovCiAgICAgcHVibGljIENvbG9yIGRhcmtlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDb2xvcigKLSAgICAgICAgICAgICAgICAoaW50KShnZXRSZWQoKSpTQ0FMRV9GQUNUT1IpLAotICAgICAgICAgICAgICAgIChpbnQpKGdldEdyZWVuKCkqU0NBTEVfRkFDVE9SKSwKLSAgICAgICAgICAgICAgICAoaW50KShnZXRCbHVlKCkqU0NBTEVfRkFDVE9SKSk7CisgICAgICAgIHJldHVybiBuZXcgQ29sb3IoKGludCkoZ2V0UmVkKCkgKiBTQ0FMRV9GQUNUT1IpLCAoaW50KShnZXRHcmVlbigpICogU0NBTEVfRkFDVE9SKSwKKyAgICAgICAgICAgICAgICAoaW50KShnZXRCbHVlKCkgKiBTQ0FMRV9GQUNUT1IpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQ0MiwyOCArNTIxLDI4IEBACiAgICAgICAgIGludCBiID0gZ2V0Qmx1ZSgpOwogICAgICAgICBpbnQgZyA9IGdldEdyZWVuKCk7CiAKLSAgICAgICAgaWYociA9PSAwICYmIGIgPT0gMCAmJiBnID09IDApIHsKKyAgICAgICAgaWYgKHIgPT0gMCAmJiBiID09IDAgJiYgZyA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IENvbG9yKE1JTl9TQ0FMQUJMRSwgTUlOX1NDQUxBQkxFLCBNSU5fU0NBTEFCTEUpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYociA8IE1JTl9TQ0FMQUJMRSAmJiByICE9IDApIHsKKyAgICAgICAgaWYgKHIgPCBNSU5fU0NBTEFCTEUgJiYgciAhPSAwKSB7CiAgICAgICAgICAgICByID0gTUlOX1NDQUxBQkxFOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgciA9IChpbnQpIChyL1NDQUxFX0ZBQ1RPUik7CisgICAgICAgICAgICByID0gKGludCkociAvIFNDQUxFX0ZBQ1RPUik7CiAgICAgICAgICAgICByID0gKHIgPiAyNTUpID8gMjU1IDogcjsKICAgICAgICAgfQogCi0gICAgICAgIGlmKGIgPCBNSU5fU0NBTEFCTEUgJiYgYiAhPSAwKSB7CisgICAgICAgIGlmIChiIDwgTUlOX1NDQUxBQkxFICYmIGIgIT0gMCkgewogICAgICAgICAgICAgYiA9IE1JTl9TQ0FMQUJMRTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGIgPSAoaW50KSAoYi9TQ0FMRV9GQUNUT1IpOworICAgICAgICAgICAgYiA9IChpbnQpKGIgLyBTQ0FMRV9GQUNUT1IpOwogICAgICAgICAgICAgYiA9IChiID4gMjU1KSA/IDI1NSA6IGI7CiAgICAgICAgIH0KIAotICAgICAgICBpZihnIDwgTUlOX1NDQUxBQkxFICYmIGcgIT0gMCkgeworICAgICAgICBpZiAoZyA8IE1JTl9TQ0FMQUJMRSAmJiBnICE9IDApIHsKICAgICAgICAgICAgIGcgPSBNSU5fU0NBTEFCTEU7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBnID0gKGludCkgKGcvU0NBTEVfRkFDVE9SKTsKKyAgICAgICAgICAgIGcgPSAoaW50KShnIC8gU0NBTEVfRkFDVE9SKTsKICAgICAgICAgICAgIGcgPSAoZyA+IDI1NSkgPyAyNTUgOiBnOwogICAgICAgICB9CiAKQEAgLTQ3MSwyNCArNTUwLDI0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIGZsb2F0IGFycmF5IGNvbnRhaW5pbmcgdGhlIGNvbG9yIGFuZCBhbHBoYSBjb21wb25lbnRzIG9mIAotICAgICAqIHRoZSBDb2xvciBpbiB0aGUgZGVmYXVsdCBzUkdCIGNvbG9yIHNwYWNlLiAKKyAgICAgKiBSZXR1cm5zIGEgZmxvYXQgYXJyYXkgY29udGFpbmluZyB0aGUgY29sb3IgYW5kIGFscGhhIGNvbXBvbmVudHMgb2YgdGhlCisgICAgICogQ29sb3IgaW4gdGhlIGRlZmF1bHQgc1JHQiBjb2xvciBzcGFjZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29tcG9uZW50cyB0aGUgcmVzdWx0cyBvZiB0aGlzIG1ldGhvZCB3aWxsIGJlIHdyaXR0ZW4gdG8KLSAgICAgKiB0aGlzIGZsb2F0IGFycmF5LiBBIG5ldyBmbG9hdCBhcnJheSB3aWxsIGJlIGNyZWF0ZWQgaWYgdGhpcwotICAgICAqIGFyZ3VtZW50IGlzIG51bGwuCi0gICAgICogCisgICAgICogQHBhcmFtIGNvbXBvbmVudHMKKyAgICAgKiAgICAgICAgICAgIHRoZSByZXN1bHRzIG9mIHRoaXMgbWV0aG9kIHdpbGwgYmUgd3JpdHRlbiB0byB0aGlzIGZsb2F0CisgICAgICogICAgICAgICAgICBhcnJheS4gQSBuZXcgZmxvYXQgYXJyYXkgd2lsbCBiZSBjcmVhdGVkIGlmIHRoaXMgYXJndW1lbnQgaXMKKyAgICAgKiAgICAgICAgICAgIG51bGwuCiAgICAgICogQHJldHVybiB0aGUgUkdCIGNvbG9yIGFuZCBhbHBoYSBjb21wb25lbnRzIGluIGEgZmxvYXQgYXJyYXkuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0W10gZ2V0UkdCQ29tcG9uZW50cyhmbG9hdFtdIGNvbXBvbmVudHMpIHsKLSAgICAgICAgaWYoY29tcG9uZW50cyA9PSBudWxsKSB7CisgICAgICAgIGlmIChjb21wb25lbnRzID09IG51bGwpIHsKICAgICAgICAgICAgIGNvbXBvbmVudHMgPSBuZXcgZmxvYXRbNF07CiAgICAgICAgIH0KIAotICAgICAgICBpZihmcmdidmFsdWUgIT0gbnVsbCkgeworICAgICAgICBpZiAoZnJnYnZhbHVlICE9IG51bGwpIHsKICAgICAgICAgICAgIGNvbXBvbmVudHNbM10gPSBmYWxwaGE7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb21wb25lbnRzWzNdID0gZ2V0QWxwaGEoKS8yNTVmOworICAgICAgICAgICAgY29tcG9uZW50c1szXSA9IGdldEFscGhhKCkgLyAyNTVmOwogICAgICAgICB9CiAKICAgICAgICAgZ2V0UkdCQ29sb3JDb21wb25lbnRzKGNvbXBvbmVudHMpOwpAQCAtNDk3LDUyICs1NzYsNTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgZmxvYXQgYXJyYXkgY29udGFpbmluZyB0aGUgY29sb3IgY29tcG9uZW50cyBvZiAKLSAgICAgKiB0aGUgQ29sb3IgaW4gdGhlIGRlZmF1bHQgc1JHQiBjb2xvciBzcGFjZS4gCisgICAgICogUmV0dXJucyBhIGZsb2F0IGFycmF5IGNvbnRhaW5pbmcgdGhlIGNvbG9yIGNvbXBvbmVudHMgb2YgdGhlIENvbG9yIGluIHRoZQorICAgICAqIGRlZmF1bHQgc1JHQiBjb2xvciBzcGFjZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29tcG9uZW50cyB0aGUgcmVzdWx0cyBvZiB0aGlzIG1ldGhvZCB3aWxsIGJlIHdyaXR0ZW4gdG8KLSAgICAgKiB0aGlzIGZsb2F0IGFycmF5LiBBIG5ldyBmbG9hdCBhcnJheSB3aWxsIGJlIGNyZWF0ZWQgaWYgdGhpcwotICAgICAqIGFyZ3VtZW50IGlzIG51bGwuCi0gICAgICogCisgICAgICogQHBhcmFtIGNvbXBvbmVudHMKKyAgICAgKiAgICAgICAgICAgIHRoZSByZXN1bHRzIG9mIHRoaXMgbWV0aG9kIHdpbGwgYmUgd3JpdHRlbiB0byB0aGlzIGZsb2F0CisgICAgICogICAgICAgICAgICBhcnJheS4gQSBuZXcgZmxvYXQgYXJyYXkgd2lsbCBiZSBjcmVhdGVkIGlmIHRoaXMgYXJndW1lbnQgaXMKKyAgICAgKiAgICAgICAgICAgIG51bGwuCiAgICAgICogQHJldHVybiB0aGUgUkdCIGNvbG9yIGNvbXBvbmVudHMgaW4gYSBmbG9hdCBhcnJheS4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXRbXSBnZXRSR0JDb2xvckNvbXBvbmVudHMoZmxvYXRbXSBjb21wb25lbnRzKSB7Ci0gICAgICAgIGlmKGNvbXBvbmVudHMgPT0gbnVsbCkgeworICAgICAgICBpZiAoY29tcG9uZW50cyA9PSBudWxsKSB7CiAgICAgICAgICAgICBjb21wb25lbnRzID0gbmV3IGZsb2F0WzNdOwogICAgICAgICB9CiAKLSAgICAgICAgaWYoZnJnYnZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgaWYgKGZyZ2J2YWx1ZSAhPSBudWxsKSB7CiAgICAgICAgICAgICBjb21wb25lbnRzWzJdID0gZnJnYnZhbHVlWzJdOwogICAgICAgICAgICAgY29tcG9uZW50c1sxXSA9IGZyZ2J2YWx1ZVsxXTsKICAgICAgICAgICAgIGNvbXBvbmVudHNbMF0gPSBmcmdidmFsdWVbMF07CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb21wb25lbnRzWzJdID0gZ2V0Qmx1ZSgpLzI1NWY7Ci0gICAgICAgICAgICBjb21wb25lbnRzWzFdID0gZ2V0R3JlZW4oKS8yNTVmOwotICAgICAgICAgICAgY29tcG9uZW50c1swXSA9IGdldFJlZCgpLzI1NWY7CisgICAgICAgICAgICBjb21wb25lbnRzWzJdID0gZ2V0Qmx1ZSgpIC8gMjU1ZjsKKyAgICAgICAgICAgIGNvbXBvbmVudHNbMV0gPSBnZXRHcmVlbigpIC8gMjU1ZjsKKyAgICAgICAgICAgIGNvbXBvbmVudHNbMF0gPSBnZXRSZWQoKSAvIDI1NWY7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gY29tcG9uZW50czsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgZmxvYXQgYXJyYXkgd2hpY2ggY29udGFpbnMgdGhlIGNvbG9yIGFuZCBhbHBoYSBjb21wb25lbnRzIG9mIAorICAgICAqIFJldHVybnMgYSBmbG9hdCBhcnJheSB3aGljaCBjb250YWlucyB0aGUgY29sb3IgYW5kIGFscGhhIGNvbXBvbmVudHMgb2YKICAgICAgKiB0aGUgQ29sb3IgaW4gdGhlIENvbG9yU3BhY2Ugb2YgdGhlIENvbG9yLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjb21wb25lbnRzIHRoZSByZXN1bHRzIG9mIHRoaXMgbWV0aG9kIHdpbGwgYmUgd3JpdHRlbiB0bwotICAgICAqIHRoaXMgZmxvYXQgYXJyYXkuIEEgbmV3IGZsb2F0IGFycmF5IHdpbGwgYmUgY3JlYXRlZCBpZiB0aGlzCi0gICAgICogYXJndW1lbnQgaXMgbnVsbC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29tcG9uZW50cworICAgICAqICAgICAgICAgICAgdGhlIHJlc3VsdHMgb2YgdGhpcyBtZXRob2Qgd2lsbCBiZSB3cml0dGVuIHRvIHRoaXMgZmxvYXQKKyAgICAgKiAgICAgICAgICAgIGFycmF5LiBBIG5ldyBmbG9hdCBhcnJheSB3aWxsIGJlIGNyZWF0ZWQgaWYgdGhpcyBhcmd1bWVudCBpcworICAgICAqICAgICAgICAgICAgbnVsbC4KICAgICAgKiBAcmV0dXJuIHRoZSBjb2xvciBhbmQgYWxwaGEgY29tcG9uZW50cyBpbiBhIGZsb2F0IGFycmF5LgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdFtdIGdldENvbXBvbmVudHMoZmxvYXRbXSBjb21wb25lbnRzKSB7Ci0gICAgICAgIGlmKGZ2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIGlmIChmdmFsdWUgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIGdldFJHQkNvbXBvbmVudHMoY29tcG9uZW50cyk7CiAgICAgICAgIH0KIAogICAgICAgICBpbnQgbkNvbG9yQ29tcHMgPSBmdmFsdWUubGVuZ3RoOwogCi0gICAgICAgIGlmKGNvbXBvbmVudHMgPT0gbnVsbCkgewotICAgICAgICAgICAgY29tcG9uZW50cyA9IG5ldyBmbG9hdFtuQ29sb3JDb21wcysxXTsKKyAgICAgICAgaWYgKGNvbXBvbmVudHMgPT0gbnVsbCkgeworICAgICAgICAgICAgY29tcG9uZW50cyA9IG5ldyBmbG9hdFtuQ29sb3JDb21wcyArIDFdOwogICAgICAgICB9CiAKICAgICAgICAgZ2V0Q29sb3JDb21wb25lbnRzKGNvbXBvbmVudHMpOwpAQCAtNTUzLDI1ICs2MzIsMjUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgZmxvYXQgYXJyYXkgd2hpY2ggY29udGFpbnMgdGhlIGNvbG9yIGNvbXBvbmVudHMgb2YgCi0gICAgICogdGhlIENvbG9yIGluIHRoZSBDb2xvclNwYWNlIG9mIHRoZSBDb2xvci4KKyAgICAgKiBSZXR1cm5zIGEgZmxvYXQgYXJyYXkgd2hpY2ggY29udGFpbnMgdGhlIGNvbG9yIGNvbXBvbmVudHMgb2YgdGhlIENvbG9yIGluCisgICAgICogdGhlIENvbG9yU3BhY2Ugb2YgdGhlIENvbG9yLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjb21wb25lbnRzIHRoZSByZXN1bHRzIG9mIHRoaXMgbWV0aG9kIHdpbGwgYmUgd3JpdHRlbiB0bwotICAgICAqIHRoaXMgZmxvYXQgYXJyYXkuIEEgbmV3IGZsb2F0IGFycmF5IHdpbGwgYmUgY3JlYXRlZCBpZiB0aGlzCi0gICAgICogYXJndW1lbnQgaXMgbnVsbC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29tcG9uZW50cworICAgICAqICAgICAgICAgICAgdGhlIHJlc3VsdHMgb2YgdGhpcyBtZXRob2Qgd2lsbCBiZSB3cml0dGVuIHRvIHRoaXMgZmxvYXQKKyAgICAgKiAgICAgICAgICAgIGFycmF5LiBBIG5ldyBmbG9hdCBhcnJheSB3aWxsIGJlIGNyZWF0ZWQgaWYgdGhpcyBhcmd1bWVudCBpcworICAgICAqICAgICAgICAgICAgbnVsbC4KICAgICAgKiBAcmV0dXJuIHRoZSBjb2xvciBjb21wb25lbnRzIGluIGEgZmxvYXQgYXJyYXkuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0W10gZ2V0Q29sb3JDb21wb25lbnRzKGZsb2F0W10gY29tcG9uZW50cykgewotICAgICAgICBpZihmdmFsdWUgPT0gbnVsbCkgeworICAgICAgICBpZiAoZnZhbHVlID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBnZXRSR0JDb2xvckNvbXBvbmVudHMoY29tcG9uZW50cyk7CiAgICAgICAgIH0KIAotICAgICAgICBpZihjb21wb25lbnRzID09IG51bGwpIHsKKyAgICAgICAgaWYgKGNvbXBvbmVudHMgPT0gbnVsbCkgewogICAgICAgICAgICAgY29tcG9uZW50cyA9IG5ldyBmbG9hdFtmdmFsdWUubGVuZ3RoXTsKICAgICAgICAgfQogCi0gICAgICAgIGZvcihpbnQgaT0wOyBpPGZ2YWx1ZS5sZW5ndGg7IGkrKykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZ2YWx1ZS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgY29tcG9uZW50c1tpXSA9IGZ2YWx1ZVtpXTsKICAgICAgICAgfQogCkBAIC01ODksNyArNjY4LDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgaW50IGdldFRyYW5zcGFyZW5jeSgpIHsKLSAgICAgICAgc3dpdGNoKGdldEFscGhhKCkpIHsKKyAgICAgICAgc3dpdGNoIChnZXRBbHBoYSgpKSB7CiAgICAgICAgICAgICBjYXNlIDB4ZmY6CiAgICAgICAgICAgICAgICAgcmV0dXJuIFRyYW5zcGFyZW5jeS5PUEFRVUU7CiAgICAgICAgICAgICBjYXNlIDA6CkBAIC02MDksNyArNjg4LDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBSR0IgdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSBjb2xvciBpbiB0aGUgZGVmYXVsdCBzUkdCIENvbG9yTW9kZWwuCisgICAgICogR2V0cyB0aGUgUkdCIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgY29sb3IgaW4gdGhlIGRlZmF1bHQgc1JHQgorICAgICAqIENvbG9yTW9kZWwuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgUkdCIGNvbG9yIHZhbHVlIGluIHRoZSBkZWZhdWx0IHNSR0IgQ29sb3JNb2RlbC4KICAgICAgKi8KQEAgLTY0NSwxNCArNzI1LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgQ29sb3IgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZywgb3IgcmV0dXJucyB0aGUgQ29sb3IKLSAgICAgKiBzcGVjaWZpZWQgYnkgdGhlIHNlY29uZCBwYXJhbWV0ZXIuCisgICAgICogR2V0cyB0aGUgQ29sb3IgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZywgb3IgcmV0dXJucyB0aGUgQ29sb3Igc3BlY2lmaWVkCisgICAgICogYnkgdGhlIHNlY29uZCBwYXJhbWV0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIG5tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLgotICAgICAqIEBwYXJhbSBkZWYgdGhlIGRlZmF1bHQgQ29sb3IuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29sb3IgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZywgb3IgdGhlIENvbG9yCi0gICAgICogc3BlY2lmaWVkIGJ5IHRoZSBzZWNvbmQgcGFyYW1ldGVyLgorICAgICAqIEBwYXJhbSBubQorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBzdHJpbmcuCisgICAgICogQHBhcmFtIGRlZgorICAgICAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgQ29sb3IuCisgICAgICogQHJldHVybiB0aGUgY29sb3IgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZywgb3IgdGhlIENvbG9yIHNwZWNpZmllZCBieQorICAgICAqICAgICAgICAgdGhlIHNlY29uZCBwYXJhbWV0ZXIuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBDb2xvciBnZXRDb2xvcihTdHJpbmcgbm0sIENvbG9yIGRlZikgewogICAgICAgICBJbnRlZ2VyIGludGVnZXIgPSBJbnRlZ2VyLmdldEludGVnZXIobm0pOwpAQCAtNjY4LDExICs3NDksMTIgQEAKICAgICAgKiBHZXRzIHRoZSBDb2xvciBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLCBvciByZXR1cm5zIHRoZSBDb2xvciBjb252ZXJ0ZWQKICAgICAgKiBmcm9tIHRoZSBzZWNvbmQgcGFyYW1ldGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBubSB0aGUgc3BlY2lmaWVkIHN0cmluZy4KLSAgICAgKiBAcGFyYW0gZGVmIHRoZSBkZWZhdWx0IENvbG9yLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvbG9yIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcsIG9yIHRoZSBDb2xvcgotICAgICAqIGNvbnZlcnRlZCBmcm9tIHRoZSBzZWNvbmQgcGFyYW1ldGVyLgorICAgICAqIEBwYXJhbSBubQorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBzdHJpbmcuCisgICAgICogQHBhcmFtIGRlZgorICAgICAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgQ29sb3IuCisgICAgICogQHJldHVybiB0aGUgY29sb3IgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZywgb3IgdGhlIENvbG9yIGNvbnZlcnRlZCBmcm9tCisgICAgICogICAgICAgICB0aGUgc2Vjb25kIHBhcmFtZXRlci4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIENvbG9yIGdldENvbG9yKFN0cmluZyBubSwgaW50IGRlZikgewogICAgICAgICBJbnRlZ2VyIGludGVnZXIgPSBJbnRlZ2VyLmdldEludGVnZXIobm0pOwpAQCAtNjg3LDggKzc2OSw4IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgQ29sb3IgZnJvbSB0aGUgc3BlY2lmaWVkIFN0cmluZy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbm0gdGhlIHNwZWNpZmllZCBzdHJpbmcuCi0gICAgICogCisgICAgICogQHBhcmFtIG5tCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHN0cmluZy4KICAgICAgKiBAcmV0dXJuIHRoZSBDb2xvciBvYmplY3QsIG9yIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBDb2xvciBnZXRDb2xvcihTdHJpbmcgbm0pIHsKQEAgLTcwNCwxMCArNzg2LDEyIEBACiAgICAgLyoqCiAgICAgICogRGVjb2RlcyBhIFN0cmluZyB0byBhbiBpbnRlZ2VyIGFuZCByZXR1cm5zIHRoZSBzcGVjaWZpZWQgb3BhcXVlIENvbG9yLgogICAgICAqIAotICAgICAqIEBwYXJhbSBubSBhIFN0cmluZyB3aGljaCByZXByZXNlbnRzIGFuIG9wYXF1ZSBjb2xvciBhcyBhIDI0LWJpdCBpbnRlZ2VyLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGNhbiBub3QgYmUKLSAgICAgKiBjb252ZXJ0ZWQgdG8gYW4gaW50ZWdlci4KKyAgICAgKiBAcGFyYW0gbm0KKyAgICAgKiAgICAgICAgICAgIHRoZSBTdHJpbmcgd2hpY2ggcmVwcmVzZW50cyBhbiBvcGFxdWUgY29sb3IgYXMgYSAyNC1iaXQKKyAgICAgKiAgICAgICAgICAgIGludGVnZXIuCisgICAgICogQHJldHVybiB0aGUgQ29sb3Igb2JqZWN0IGZyb20gdGhlIGdpdmVuIFN0cmluZy4KKyAgICAgKiBAdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGNhbiBub3QgYmUgY29udmVydGVkIHRvIGFuIGludGVnZXIuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBDb2xvciBkZWNvZGUoU3RyaW5nIG5tKSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKICAgICAgICAgSW50ZWdlciBpbnRlZ2VyID0gSW50ZWdlci5kZWNvZGUobm0pOwpAQCAtNzE3LDMxICs4MDEsMzYgQEAKICAgICAvKioKICAgICAgKiBHZXRzIGEgQ29sb3Igb2JqZWN0IHVzaW5nIHRoZSBzcGVjaWZpZWQgdmFsdWVzIG9mIHRoZSBIU0IgY29sb3IgbW9kZWwuCiAgICAgICogCi0gICAgICogQHBhcmFtIGggdGhlIGh1ZSBjb21wb25lbnQgb2YgdGhlIENvbG9yLgotICAgICAqIEBwYXJhbSBzIHRoZSBzYXR1cmF0aW9uIG9mIHRoZSBDb2xvci4KLSAgICAgKiBAcGFyYW0gYiB0aGUgYnJpZ2h0bmVzcyBvZiB0aGUgQ29sb3IuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGNvbG9yIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgaHVlLCBzYXR1cmF0aW9uIGFuZCAKLSAgICAgKiBicmlnaHRuZXNzIHZhbHVlcy4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGh1ZSBjb21wb25lbnQgb2YgdGhlIENvbG9yLgorICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICB0aGUgc2F0dXJhdGlvbiBvZiB0aGUgQ29sb3IuCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBicmlnaHRuZXNzIG9mIHRoZSBDb2xvci4KKyAgICAgKiBAcmV0dXJuIGEgY29sb3Igb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBodWUsIHNhdHVyYXRpb24gYW5kIGJyaWdodG5lc3MKKyAgICAgKiAgICAgICAgIHZhbHVlcy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIENvbG9yIGdldEhTQkNvbG9yKGZsb2F0IGgsIGZsb2F0IHMsIGZsb2F0IGIpIHsKICAgICAgICAgcmV0dXJuIG5ldyBDb2xvcihIU0J0b1JHQihoLCBzLCBiKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29udmVydHMgdGhlIENvbG9yIHNwZWNpZmllZCBieSB0aGUgUkdCIG1vZGVsIHRvIGFuIGVxdWl2YWxlbnQgCi0gICAgICogY29sb3IgaW4gdGhlIEhTQiBtb2RlbC4KKyAgICAgKiBDb252ZXJ0cyB0aGUgQ29sb3Igc3BlY2lmaWVkIGJ5IHRoZSBSR0IgbW9kZWwgdG8gYW4gZXF1aXZhbGVudCBjb2xvciBpbgorICAgICAqIHRoZSBIU0IgbW9kZWwuCiAgICAgICogCi0gICAgICogQHBhcmFtIHIgdGhlIHJlZCBjb21wb25lbnQuCi0gICAgICogQHBhcmFtIGcgdGhlIGdyZWVuIGNvbXBvbmVudC4KLSAgICAgKiBAcGFyYW0gYiB0aGUgYmx1ZSBjb21wb25lbnQuCi0gICAgICogQHBhcmFtIGhzYnZhbHMgdGhlIGFycmF5IG9mIHJlc3VsdCBodWUsIHNhdHVyYXRpb24sIGJyaWdodG5lc3MKLSAgICAgKiB2YWx1ZXMgb3IgbnVsbC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gcgorICAgICAqICAgICAgICAgICAgdGhlIHJlZCBjb21wb25lbnQuCisgICAgICogQHBhcmFtIGcKKyAgICAgKiAgICAgICAgICAgIHRoZSBncmVlbiBjb21wb25lbnQuCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBibHVlIGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gaHNidmFscworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIHJlc3VsdCBodWUsIHNhdHVyYXRpb24sIGJyaWdodG5lc3MgdmFsdWVzIG9yCisgICAgICogICAgICAgICAgICBudWxsLgogICAgICAqIEByZXR1cm4gdGhlIGZsb2F0IGFycmF5IG9mIGh1ZSwgc2F0dXJhdGlvbiwgYnJpZ2h0bmVzcyB2YWx1ZXMuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmbG9hdFtdIFJHQnRvSFNCKGludCByLCBpbnQgZywgaW50IGIsIGZsb2F0W10gaHNidmFscykgewotICAgICAgICBpZihoc2J2YWxzID09IG51bGwpIHsKKyAgICAgICAgaWYgKGhzYnZhbHMgPT0gbnVsbCkgewogICAgICAgICAgICAgaHNidmFscyA9IG5ldyBmbG9hdFszXTsKICAgICAgICAgfQogCkBAIC03NTAsMTIgKzgzOSwxMiBAQAogCiAgICAgICAgIGZsb2F0IEgsIFMsIEI7CiAKLSAgICAgICAgQiA9IFYvMjU1LmY7CisgICAgICAgIEIgPSBWIC8gMjU1LmY7CiAKLSAgICAgICAgaWYoViA9PSB0ZW1wKSB7CisgICAgICAgIGlmIChWID09IHRlbXApIHsKICAgICAgICAgICAgIEggPSBTID0gMDsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFMgPSAoViAtIHRlbXApLygoZmxvYXQpVik7CisgICAgICAgICAgICBTID0gKFYgLSB0ZW1wKSAvICgoZmxvYXQpVik7CiAKICAgICAgICAgICAgIGZsb2F0IENyID0gKFYgLSByKSAvIChmbG9hdCkoViAtIHRlbXApOwogICAgICAgICAgICAgZmxvYXQgQ2cgPSAoViAtIGcpIC8gKGZsb2F0KShWIC0gdGVtcCk7CkBAIC03NzAsNyArODU5LDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgSCAvPSA2LmY7Ci0gICAgICAgICAgICBpZihIIDwgMCkgeworICAgICAgICAgICAgaWYgKEggPCAwKSB7CiAgICAgICAgICAgICAgICAgSCsrOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC03ODMsNTAgKzg3Miw3MCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoZSBDb2xvciBzcGVjaWZpZWQgYnkgdGhlIEhTQiBtb2RlbCB0byBhbiBlcXVpdmFsZW50IAotICAgICAqIGNvbG9yIGluIHRoZSBkZWZhdWx0IFJHQiBtb2RlbC4KKyAgICAgKiBDb252ZXJ0cyB0aGUgQ29sb3Igc3BlY2lmaWVkIGJ5IHRoZSBIU0IgbW9kZWwgdG8gYW4gZXF1aXZhbGVudCBjb2xvciBpbgorICAgICAqIHRoZSBkZWZhdWx0IFJHQiBtb2RlbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaHVlIHRoZSBodWUgY29tcG9uZW50IG9mIHRoZSBDb2xvci4KLSAgICAgKiBAcGFyYW0gc2F0dXJhdGlvbiB0aGUgc2F0dXJhdGlvbiBvZiB0aGUgQ29sb3IuCi0gICAgICogQHBhcmFtIGJyaWdodG5lc3MgdGhlIGJyaWdodG5lc3Mgb2YgdGhlIENvbG9yLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIFJHQiB2YWx1ZSBvZiB0aGUgY29sb3Igd2l0aCB0aGUgc3BlY2lmaWVkIGh1ZSwgCi0gICAgICogc2F0dXJhdGlvbiBhbmQgYnJpZ2h0bmVzcy4KKyAgICAgKiBAcGFyYW0gaHVlCisgICAgICogICAgICAgICAgICB0aGUgaHVlIGNvbXBvbmVudCBvZiB0aGUgQ29sb3IuCisgICAgICogQHBhcmFtIHNhdHVyYXRpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBzYXR1cmF0aW9uIG9mIHRoZSBDb2xvci4KKyAgICAgKiBAcGFyYW0gYnJpZ2h0bmVzcworICAgICAqICAgICAgICAgICAgdGhlIGJyaWdodG5lc3Mgb2YgdGhlIENvbG9yLgorICAgICAqIEByZXR1cm4gdGhlIFJHQiB2YWx1ZSBvZiB0aGUgY29sb3Igd2l0aCB0aGUgc3BlY2lmaWVkIGh1ZSwgc2F0dXJhdGlvbiBhbmQKKyAgICAgKiAgICAgICAgIGJyaWdodG5lc3MuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgSFNCdG9SR0IoZmxvYXQgaHVlLCBmbG9hdCBzYXR1cmF0aW9uLCBmbG9hdCBicmlnaHRuZXNzKSB7CiAgICAgICAgIGZsb2F0IGZyLCBmZywgZmI7CiAKLSAgICAgICAgaWYoc2F0dXJhdGlvbiA9PSAwKSB7CisgICAgICAgIGlmIChzYXR1cmF0aW9uID09IDApIHsKICAgICAgICAgICAgIGZyID0gZmcgPSBmYiA9IGJyaWdodG5lc3M7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBmbG9hdCBIID0gKGh1ZSAtIChmbG9hdClNYXRoLmZsb29yKGh1ZSkpICogNjsKLSAgICAgICAgICAgIGludCBJID0gKGludCkgTWF0aC5mbG9vcihIKTsKKyAgICAgICAgICAgIGludCBJID0gKGludClNYXRoLmZsb29yKEgpOwogICAgICAgICAgICAgZmxvYXQgRiA9IEggLSBJOwogICAgICAgICAgICAgZmxvYXQgTSA9IGJyaWdodG5lc3MgKiAoMSAtIHNhdHVyYXRpb24pOwogICAgICAgICAgICAgZmxvYXQgTiA9IGJyaWdodG5lc3MgKiAoMSAtIHNhdHVyYXRpb24gKiBGKTsKICAgICAgICAgICAgIGZsb2F0IEsgPSBicmlnaHRuZXNzICogKDEgLSBzYXR1cmF0aW9uICogKDEgLSBGKSk7CiAKLSAgICAgICAgICAgIHN3aXRjaChJKSB7CisgICAgICAgICAgICBzd2l0Y2ggKEkpIHsKICAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICAgIGZyID0gYnJpZ2h0bmVzczsgZmcgPSBLOyBmYiA9IE07IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBmciA9IGJyaWdodG5lc3M7CisgICAgICAgICAgICAgICAgICAgIGZnID0gSzsKKyAgICAgICAgICAgICAgICAgICAgZmIgPSBNOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIGZyID0gTjsgZmcgPSBicmlnaHRuZXNzOyBmYiA9IE07IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBmciA9IE47CisgICAgICAgICAgICAgICAgICAgIGZnID0gYnJpZ2h0bmVzczsKKyAgICAgICAgICAgICAgICAgICAgZmIgPSBNOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgIGZyID0gTTsgZmcgPSBicmlnaHRuZXNzOyBmYiA9IEs7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBmciA9IE07CisgICAgICAgICAgICAgICAgICAgIGZnID0gYnJpZ2h0bmVzczsKKyAgICAgICAgICAgICAgICAgICAgZmIgPSBLOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgICAgIGZyID0gTTsgZmcgPSBOOyBmYiA9IGJyaWdodG5lc3M7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBmciA9IE07CisgICAgICAgICAgICAgICAgICAgIGZnID0gTjsKKyAgICAgICAgICAgICAgICAgICAgZmIgPSBicmlnaHRuZXNzOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgICAgIGZyID0gSzsgZmcgPSBNOyBmYiA9IGJyaWdodG5lc3M7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBmciA9IEs7CisgICAgICAgICAgICAgICAgICAgIGZnID0gTTsKKyAgICAgICAgICAgICAgICAgICAgZmIgPSBicmlnaHRuZXNzOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgICAgICAgIGZyID0gYnJpZ2h0bmVzczsgZmcgPSBNOyBmYiA9IE47IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBmciA9IGJyaWdodG5lc3M7CisgICAgICAgICAgICAgICAgICAgIGZnID0gTTsKKyAgICAgICAgICAgICAgICAgICAgZmIgPSBOOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICBmciA9IGZiID0gZmcgPSAwOyAvLyBpbXBvc3NpYmxlLCB0byBzdXByZXNzIGNvbXBpbGVyIGVycm9yCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpbnQgciA9IChpbnQpIChmciAqIDI1NS4gKyAwLjUpOwotICAgICAgICBpbnQgZyA9IChpbnQpIChmZyAqIDI1NS4gKyAwLjUpOwotICAgICAgICBpbnQgYiA9IChpbnQpIChmYiAqIDI1NS4gKyAwLjUpOworICAgICAgICBpbnQgciA9IChpbnQpKGZyICogMjU1LiArIDAuNSk7CisgICAgICAgIGludCBnID0gKGludCkoZmcgKiAyNTUuICsgMC41KTsKKyAgICAgICAgaW50IGIgPSAoaW50KShmYiAqIDI1NS4gKyAwLjUpOwogCiAgICAgICAgIHJldHVybiAociA8PCAxNikgfCAoZyA8PCA4KSB8IGIgfCAweEZGMDAwMDAwOwogICAgIH0KQEAgLTgzNSwxNyArOTQ0LDIyIEBACiAgICAgICogVGhlIENsYXNzIENvbG9yUGFpbnRDb250ZXh0LgogICAgICAqLwogICAgIGNsYXNzIENvbG9yUGFpbnRDb250ZXh0IGltcGxlbWVudHMgUGFpbnRDb250ZXh0IHsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgcmdiIHZhbHVlLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgUkdCIHZhbHVlLgorICAgICAgICAgKi8KICAgICAgICAgaW50IHJnYlZhbHVlOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBzYXZlZCByYXN0ZXIuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzYXZlZCByYXN0ZXIuCisgICAgICAgICAqLwogICAgICAgICBXcml0YWJsZVJhc3RlciBzYXZlZFJhc3RlciA9IG51bGw7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBjb2xvciBwYWludCBjb250ZXh0LgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHJnYiB0aGUgcmdiCisgICAgICAgICAqIEBwYXJhbSByZ2IKKyAgICAgICAgICogICAgICAgICAgICB0aGUgUkdCIHZhbHVlLgogICAgICAgICAgKi8KICAgICAgICAgcHJvdGVjdGVkIENvbG9yUGFpbnRDb250ZXh0KGludCByZ2IpIHsKICAgICAgICAgICAgIHJnYlZhbHVlID0gcmdiOwpAQCAtODYwLDE1ICs5NzQsMTEgQEAKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBSYXN0ZXIgZ2V0UmFzdGVyKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKSB7Ci0gICAgICAgICAgICBpZiAoc2F2ZWRSYXN0ZXIgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICB3ICE9IHNhdmVkUmFzdGVyLmdldFdpZHRoKCkgfHwKLSAgICAgICAgICAgICAgICAgICAgaCAhPSBzYXZlZFJhc3Rlci5nZXRIZWlnaHQoKSkgewotICAgICAgICAgICAgICAgIHNhdmVkUmFzdGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbG9yTW9kZWwoKS5jcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIodywgaCk7CisgICAgICAgICAgICBpZiAoc2F2ZWRSYXN0ZXIgPT0gbnVsbCB8fCB3ICE9IHNhdmVkUmFzdGVyLmdldFdpZHRoKCkgfHwgaCAhPSBzYXZlZFJhc3Rlci5nZXRIZWlnaHQoKSkgeworICAgICAgICAgICAgICAgIHNhdmVkUmFzdGVyID0gZ2V0Q29sb3JNb2RlbCgpLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3Rlcih3LCBoKTsKIAogICAgICAgICAgICAgICAgIC8vIFN1cHBvc2Ugd2UgaGF2ZSBoZXJlIHNpbXBsZSBJTlQvUkdCIGNvbG9yL3NhbXBsZSBtb2RlbAotICAgICAgICAgICAgICAgIERhdGFCdWZmZXJJbnQgaW50QnVmZmVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChEYXRhQnVmZmVySW50KSBzYXZlZFJhc3Rlci5nZXREYXRhQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgRGF0YUJ1ZmZlckludCBpbnRCdWZmZXIgPSAoRGF0YUJ1ZmZlckludClzYXZlZFJhc3Rlci5nZXREYXRhQnVmZmVyKCk7CiAgICAgICAgICAgICAgICAgaW50IHJnYlZhbHVlc1tdID0gaW50QnVmZmVyLmdldERhdGEoKTsKICAgICAgICAgICAgICAgICBpbnQgcmdiRmlsbFZhbHVlID0gcmdiVmFsdWU7CiAgICAgICAgICAgICAgICAgQXJyYXlzLmZpbGwocmdiVmFsdWVzLCByZ2JGaWxsVmFsdWUpOwpAQCAtODc4LDQgKzk4OCwzIEBACiAgICAgICAgIH0KICAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9Db21wb25lbnQuamF2YSBiL2F3dC9qYXZhL2F3dC9Db21wb25lbnQuamF2YQppbmRleCBmMTlkMjg1Li5jNTJhOWY0IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvQ29tcG9uZW50LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L0NvbXBvbmVudC5qYXZhCkBAIC03OCw1NDcgKzc4LDI3MyBAQAogLy9pbXBvcnQgamF2YXguYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlU3RhdGU7CiAvL2ltcG9ydCBqYXZheC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVTdGF0ZVNldDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuQ2xpcFJlZ2lvbjsKLS8vaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuRmllbGRzQWNjZXNzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5DbGlwUmVnaW9uOyAvL2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LkZpZWxkc0FjY2Vzc29yOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuZ2wuTXVsdGlSZWN0QXJlYTsKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmludGVybmFsLm5scy5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LnN0YXRlLlN0YXRlOwotLy9pbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC50ZXh0LlRleHRGaWVsZEtpdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LnN0YXRlLlN0YXRlOyAvL2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LnRleHQuVGV4dEZpZWxkS2l0OwogLy9pbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC50ZXh0LlRleHRLaXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC53dGsuTmF0aXZlV2luZG93OworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTm90SW1wbGVtZW50ZWRFeGNlcHRpb247CiAKIC8qKgotICogVGhlIGFic3RyYWN0IENvbXBvbmVudCBjbGFzcyBzcGVjaWZpZXMgYW4gb2JqZWN0IHdpdGggYSBncmFwaGljYWwgCi0gKiByZXByZXNlbnRhdGlvbiB0aGF0IGNhbiBiZSBkaXNwbGF5ZWQgb24gdGhlIHNjcmVlbiBhbmQgdGhhdCBjYW4gCi0gKiBpbnRlcmFjdCB3aXRoIHRoZSB1c2VyIChmb3IgZXhhbXBsZTogc2Nyb2xsYmFycywgYnV0dG9ucywgY2hlY2tib3hlcykuCisgKiBUaGUgYWJzdHJhY3QgQ29tcG9uZW50IGNsYXNzIHNwZWNpZmllcyBhbiBvYmplY3Qgd2l0aCBhIGdyYXBoaWNhbAorICogcmVwcmVzZW50YXRpb24gdGhhdCBjYW4gYmUgZGlzcGxheWVkIG9uIHRoZSBzY3JlZW4gYW5kIHRoYXQgY2FuIGludGVyYWN0IHdpdGgKKyAqIHRoZSB1c2VyIChmb3IgZXhhbXBsZTogc2Nyb2xsYmFycywgYnV0dG9ucywgY2hlY2tib3hlcykuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tcG9uZW50IGltcGxlbWVudHMgSW1hZ2VPYnNlcnZlciwgTWVudUNvbnRhaW5lciwgU2VyaWFsaXphYmxlIHsKLSAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgc2VyaWFsVmVyc2lvblVJRC4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzY0NDExNDUxMjcxNDYxOTc1MEw7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFRPUF9BTElHTk1FTlQgaW5kaWNhdGVzIHRoZSB0b3AgYWxpZ25tZW50IG9mIHRoZSBjb21wb25lbnQuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRPUF9BTElHTk1FTlQgaW5kaWNhdGVzIHRoZSB0b3AgYWxpZ25tZW50IG9mIHRoZSBjb21wb25lbnQuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdCBUT1BfQUxJR05NRU5UID0gMC4wZjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgQ0VOVEVSX0FMSUdOTUVOVCBpbmRpY2F0ZXMgdGhlIGNlbnRlciBhbGlnbm1lbnQgb2YgdGhlIGNvbXBvbmVudC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgQ0VOVEVSX0FMSUdOTUVOVCBpbmRpY2F0ZXMgdGhlIGNlbnRlciBhbGlnbm1lbnQgb2YgdGhlCisgICAgICogY29tcG9uZW50LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgQ0VOVEVSX0FMSUdOTUVOVCA9IDAuNWY7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IEJPVFRPTV9BTElHTk1FTlQgaW5kaWNhdGVzIHRoZSBib3R0b20gYWxpZ25tZW50IG9mIHRoZSBjb21wb25lbnQuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEJPVFRPTV9BTElHTk1FTlQgaW5kaWNhdGVzIHRoZSBib3R0b20gYWxpZ25tZW50IG9mIHRoZQorICAgICAqIGNvbXBvbmVudC4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IEJPVFRPTV9BTElHTk1FTlQgPSAxLjBmOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBMRUZUX0FMSUdOTUVOVCBpbmRpY2F0ZXMgdGhlIGxlZnQgYWxpZ25tZW50IG9mIHRoZSBjb21wb25lbnQuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IExFRlRfQUxJR05NRU5UIGluZGljYXRlcyB0aGUgbGVmdCBhbGlnbm1lbnQgb2YgdGhlCisgICAgICogY29tcG9uZW50LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgTEVGVF9BTElHTk1FTlQgPSAwLjBmOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBSSUdIVF9BTElHTk1FTlQgaW5kaWNhdGVzIHRoZSByaWdodCBhbGlnbm1lbnQgb2YgdGhlIGNvbXBvbmVudC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgUklHSFRfQUxJR05NRU5UIGluZGljYXRlcyB0aGUgcmlnaHQgYWxpZ25tZW50IG9mIHRoZQorICAgICAqIGNvbXBvbmVudC4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IFJJR0hUX0FMSUdOTUVOVCA9IDEuMGY7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGNoaWxkQ2xhc3Nlc0ZsYWdzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBjaGlsZENsYXNzZXNGbGFncy4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNodGFibGU8Q2xhc3M8Pz4sIEJvb2xlYW4+IGNoaWxkQ2xhc3Nlc0ZsYWdzID0gbmV3IEhhc2h0YWJsZTxDbGFzczw/PiwgQm9vbGVhbj4oKTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgcGVlci4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgcGVlci4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wb25lbnRQZWVyIHBlZXIgPSBuZXcgQ29tcG9uZW50UGVlcigpIHsKICAgICB9OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpbmNyZW1lbnRhbEltYWdlVXBkYXRlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpbmNyZW1lbnRhbEltYWdlVXBkYXRlLgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gaW5jcmVtZW50YWxJbWFnZVVwZGF0ZTsKIAotICAgIC8qKiBUaGUgdG9vbGtpdC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgdG9vbGtpdC4KKyAgICAgKi8KICAgICBmaW5hbCB0cmFuc2llbnQgVG9vbGtpdCB0b29sa2l0ID0gVG9vbGtpdC5nZXREZWZhdWx0VG9vbGtpdCgpOwogCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBjbGFzcyBBY2Nlc3NpYmxlQVdUQ29tcG9uZW50IGV4dGVuZHMgQWNjZXNzaWJsZUNvbnRleHQgaW1wbGVtZW50cwotICAgICAgICAgICAgU2VyaWFsaXphYmxlLCBBY2Nlc3NpYmxlQ29tcG9uZW50IHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjQyMzIxNjU1NzU3ODAwMTkxTDsKLQotICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgQWNjZXNzaWJsZUFXVENvbXBvbmVudEhhbmRsZXIgaW1wbGVtZW50cyBDb21wb25lbnRMaXN0ZW5lciB7Ci0gICAgICAgICAgICBwcm90ZWN0ZWQgQWNjZXNzaWJsZUFXVENvbXBvbmVudEhhbmRsZXIoKSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbXBvbmVudEhpZGRlbihDb21wb25lbnRFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJlaGF2aW91ci5pc0xpZ2h0d2VpZ2h0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoQWNjZXNzaWJsZUNvbnRleHQuQUNDRVNTSUJMRV9TVEFURV9QUk9QRVJUWSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc2libGVTdGF0ZS5WSVNJQkxFLCBudWxsKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgY29tcG9uZW50TW92ZWQoQ29tcG9uZW50RXZlbnQgZSkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjb21wb25lbnRSZXNpemVkKENvbXBvbmVudEV2ZW50IGUpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgY29tcG9uZW50U2hvd24oQ29tcG9uZW50RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGlmIChiZWhhdmlvdXIuaXNMaWdodHdlaWdodCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKEFjY2Vzc2libGVDb250ZXh0LkFDQ0VTU0lCTEVfU1RBVEVfUFJPUEVSVFksIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NpYmxlU3RhdGUuVklTSUJMRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgQWNjZXNzaWJsZUFXVEZvY3VzSGFuZGxlciBpbXBsZW1lbnRzIEZvY3VzTGlzdGVuZXIgewotICAgICAgICAgICAgcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJlaGF2aW91ci5pc0xpZ2h0d2VpZ2h0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoQWNjZXNzaWJsZUNvbnRleHQuQUNDRVNTSUJMRV9TVEFURV9QUk9QRVJUWSwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc2libGVTdGF0ZS5GT0NVU0VEKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGlmIChiZWhhdmlvdXIuaXNMaWdodHdlaWdodCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKEFjY2Vzc2libGVDb250ZXh0LkFDQ0VTU0lCTEVfU1RBVEVfUFJPUEVSVFksCi0gICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NpYmxlU3RhdGUuRk9DVVNFRCwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgcHJvdGVjdGVkIENvbXBvbmVudExpc3RlbmVyIGFjY2Vzc2libGVBV1RDb21wb25lbnRIYW5kbGVyOwotICAgIAotICAgICAgICBwcm90ZWN0ZWQgRm9jdXNMaXN0ZW5lciBhY2Nlc3NpYmxlQVdURm9jdXNIYW5kbGVyOwotICAgICAgICAqLwotICAgICAgICAvKgotICAgICAgICAgKiBOdW1iZXIgb2YgcmVnaXN0ZXJlZCBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXJzLgotICAgICAgICAgKi8KLSAgICAgICAgLyoKLSAgICAgICAgaW50IGxpc3RlbmVyc0NvdW50OwotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZEZvY3VzTGlzdGVuZXIoRm9jdXNMaXN0ZW5lciBsKSB7Ci0gICAgICAgICAgICBDb21wb25lbnQudGhpcy5hZGRGb2N1c0xpc3RlbmVyKGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHN1cGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICAgICAgICAgIGxpc3RlbmVyc0NvdW50Kys7Ci0gICAgICAgICAgICAgICAgaWYgKGFjY2Vzc2libGVBV1RDb21wb25lbnRIYW5kbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYWNjZXNzaWJsZUFXVENvbXBvbmVudEhhbmRsZXIgPSBuZXcgQWNjZXNzaWJsZUFXVENvbXBvbmVudEhhbmRsZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50LnRoaXMuYWRkQ29tcG9uZW50TGlzdGVuZXIoYWNjZXNzaWJsZUFXVENvbXBvbmVudEhhbmRsZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYWNjZXNzaWJsZUFXVEZvY3VzSGFuZGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFjY2Vzc2libGVBV1RGb2N1c0hhbmRsZXIgPSBuZXcgQWNjZXNzaWJsZUFXVEZvY3VzSGFuZGxlcigpOwotICAgICAgICAgICAgICAgICAgICBDb21wb25lbnQudGhpcy5hZGRGb2N1c0xpc3RlbmVyKGFjY2Vzc2libGVBV1RGb2N1c0hhbmRsZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoUG9pbnQgcCkgewotICAgICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBDb21wb25lbnQudGhpcy5jb250YWlucyhwKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBBY2Nlc3NpYmxlIGdldEFjY2Vzc2libGVBdChQb2ludCBhcmcwKSB7Ci0gICAgICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQ29sb3IgZ2V0QmFja2dyb3VuZCgpIHsKLSAgICAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ29tcG9uZW50LnRoaXMuZ2V0QmFja2dyb3VuZCgpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFJlY3RhbmdsZSBnZXRCb3VuZHMoKSB7Ci0gICAgICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENvbXBvbmVudC50aGlzLmdldEJvdW5kcygpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEN1cnNvciBnZXRDdXJzb3IoKSB7Ci0gICAgICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENvbXBvbmVudC50aGlzLmdldEN1cnNvcigpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEZvbnQgZ2V0Rm9udCgpIHsKLSAgICAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ29tcG9uZW50LnRoaXMuZ2V0Rm9udCgpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEZvbnRNZXRyaWNzIGdldEZvbnRNZXRyaWNzKEZvbnQgZikgewotICAgICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBDb21wb25lbnQudGhpcy5nZXRGb250TWV0cmljcyhmKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBDb2xvciBnZXRGb3JlZ3JvdW5kKCkgewotICAgICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBDb21wb25lbnQudGhpcy5nZXRGb3JlZ3JvdW5kKCk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgUG9pbnQgZ2V0TG9jYXRpb24oKSB7Ci0gICAgICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENvbXBvbmVudC50aGlzLmdldExvY2F0aW9uKCk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgUG9pbnQgZ2V0TG9jYXRpb25PblNjcmVlbigpIHsKLSAgICAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ29tcG9uZW50LnRoaXMuZ2V0TG9jYXRpb25PblNjcmVlbigpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIERpbWVuc2lvbiBnZXRTaXplKCkgewotICAgICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBDb21wb25lbnQudGhpcy5nZXRTaXplKCk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0gICAgICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENvbXBvbmVudC50aGlzLmlzRW5hYmxlZCgpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNGb2N1c1RyYXZlcnNhYmxlKCkgewotICAgICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBDb21wb25lbnQudGhpcy5pc0ZvY3VzVHJhdmVyc2FibGUoKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzU2hvd2luZygpIHsKLSAgICAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ29tcG9uZW50LnRoaXMuaXNTaG93aW5nKCk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7Ci0gICAgICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENvbXBvbmVudC50aGlzLmlzVmlzaWJsZSgpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlRm9jdXNMaXN0ZW5lcihGb2N1c0xpc3RlbmVyIGwpIHsKLSAgICAgICAgICAgIENvbXBvbmVudC50aGlzLnJlbW92ZUZvY3VzTGlzdGVuZXIobCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXJzQ291bnQtLTsKLSAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXJzQ291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgYXJlIG5vIG1vcmUgbGlzdGVuZXJzLCByZW1vdmUgaGFuZGxlcnM6Ci0gICAgICAgICAgICAgICAgQ29tcG9uZW50LnRoaXMucmVtb3ZlRm9jdXNMaXN0ZW5lcihhY2Nlc3NpYmxlQVdURm9jdXNIYW5kbGVyKTsKLSAgICAgICAgICAgICAgICBDb21wb25lbnQudGhpcy5yZW1vdmVDb21wb25lbnRMaXN0ZW5lcihhY2Nlc3NpYmxlQVdUQ29tcG9uZW50SGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgYWNjZXNzaWJsZUFXVENvbXBvbmVudEhhbmRsZXIgPSBudWxsOwotICAgICAgICAgICAgICAgIGFjY2Vzc2libGVBV1RGb2N1c0hhbmRsZXIgPSBudWxsOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVxdWVzdEZvY3VzKCkgewotICAgICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIENvbXBvbmVudC50aGlzLnJlcXVlc3RGb2N1cygpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZChDb2xvciBjb2xvcikgewotICAgICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIENvbXBvbmVudC50aGlzLnNldEJhY2tncm91bmQoY29sb3IpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Qm91bmRzKFJlY3RhbmdsZSByKSB7Ci0gICAgICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQ29tcG9uZW50LnRoaXMuc2V0Qm91bmRzKHIpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Q3Vyc29yKEN1cnNvciBjdXJzb3IpIHsKLSAgICAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBDb21wb25lbnQudGhpcy5zZXRDdXJzb3IoY3Vyc29yKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQ29tcG9uZW50LnRoaXMuc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEZvbnQoRm9udCBmKSB7Ci0gICAgICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQ29tcG9uZW50LnRoaXMuc2V0Rm9udChmKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEZvcmVncm91bmQoQ29sb3IgY29sb3IpIHsKLSAgICAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBDb21wb25lbnQudGhpcy5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFBvaW50IHApIHsKLSAgICAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBDb21wb25lbnQudGhpcy5zZXRMb2NhdGlvbihwKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFNpemUoRGltZW5zaW9uIHNpemUpIHsKLSAgICAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBDb21wb25lbnQudGhpcy5zZXRTaXplKHNpemUpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLSAgICAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBDb21wb25lbnQudGhpcy5zZXRWaXNpYmxlKHZpc2libGUpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEFjY2Vzc2libGUgZ2V0QWNjZXNzaWJsZVBhcmVudCgpIHsKLSAgICAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBBY2Nlc3NpYmxlIGFQYXJlbnQgPSBzdXBlci5nZXRBY2Nlc3NpYmxlUGFyZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGFQYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYVBhcmVudDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ29udGFpbmVyIHBhcmVudCA9IGdldFBhcmVudCgpOwotICAgICAgICAgICAgICAgIHJldHVybiAocGFyZW50IGluc3RhbmNlb2YgQWNjZXNzaWJsZSA/IChBY2Nlc3NpYmxlKSBwYXJlbnQgOiBudWxsKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQWNjZXNzaWJsZSBnZXRBY2Nlc3NpYmxlQ2hpbGQoaW50IGkpIHsKLSAgICAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldEFjY2Vzc2libGVDaGlsZHJlbkNvdW50KCkgewotICAgICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBBY2Nlc3NpYmxlQ29tcG9uZW50IGdldEFjY2Vzc2libGVDb21wb25lbnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFjY2Vzc2libGVEZXNjcmlwdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRBY2Nlc3NpYmxlRGVzY3JpcHRpb24oKTsgLy8gd2h5IG92ZXJyaWRlPwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0QWNjZXNzaWJsZUluZGV4SW5QYXJlbnQoKSB7Ci0gICAgICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdldEFjY2Vzc2libGVQYXJlbnQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICBDb250YWluZXIgcGFyZW50ID0gZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJlbnQuZ2V0Q29tcG9uZW50Q291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIENvbXBvbmVudCBhQ29tcCA9IHBhcmVudC5nZXRDb21wb25lbnQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhQ29tcCBpbnN0YW5jZW9mIEFjY2Vzc2libGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhQ29tcCA9PSBDb21wb25lbnQudGhpcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb3VudDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICsrY291bnQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBBY2Nlc3NpYmxlUm9sZSBnZXRBY2Nlc3NpYmxlUm9sZSgpIHsKLSAgICAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQWNjZXNzaWJsZVJvbGUuQVdUX0NPTVBPTkVOVDsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQWNjZXNzaWJsZVN0YXRlU2V0IGdldEFjY2Vzc2libGVTdGF0ZVNldCgpIHsKLSAgICAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBBY2Nlc3NpYmxlU3RhdGVTZXQgc2V0ID0gbmV3IEFjY2Vzc2libGVTdGF0ZVNldCgpOwotICAgICAgICAgICAgICAgIGlmIChpc0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKEFjY2Vzc2libGVTdGF0ZS5FTkFCTEVEKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGlzRm9jdXNhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0LmFkZChBY2Nlc3NpYmxlU3RhdGUuRk9DVVNBQkxFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGhhc0ZvY3VzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0LmFkZChBY2Nlc3NpYmxlU3RhdGUuRk9DVVNFRCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChpc09wYXF1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldC5hZGQoQWNjZXNzaWJsZVN0YXRlLk9QQVFVRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChpc1Nob3dpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKEFjY2Vzc2libGVTdGF0ZS5TSE9XSU5HKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGlzVmlzaWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldC5hZGQoQWNjZXNzaWJsZVN0YXRlLlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gc2V0OwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBMb2NhbGUgZ2V0TG9jYWxlKCkgdGhyb3dzIElsbGVnYWxDb21wb25lbnRTdGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENvbXBvbmVudC50aGlzLmdldExvY2FsZSgpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgICovCisgICAgICogcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzIEFjY2Vzc2libGVBV1RDb21wb25lbnQgZXh0ZW5kcyBBY2Nlc3NpYmxlQ29udGV4dAorICAgICAqIGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBBY2Nlc3NpYmxlQ29tcG9uZW50IHsgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZworICAgICAqIHNlcmlhbFZlcnNpb25VSUQgPSA2NDIzMjE2NTU3NTc4MDAxOTFMOyBwcm90ZWN0ZWQgY2xhc3MKKyAgICAgKiBBY2Nlc3NpYmxlQVdUQ29tcG9uZW50SGFuZGxlciBpbXBsZW1lbnRzIENvbXBvbmVudExpc3RlbmVyIHsgcHJvdGVjdGVkCisgICAgICogQWNjZXNzaWJsZUFXVENvbXBvbmVudEhhbmRsZXIoKSB7IH0gcHVibGljIHZvaWQKKyAgICAgKiBjb21wb25lbnRIaWRkZW4oQ29tcG9uZW50RXZlbnQgZSkgeyBpZiAoYmVoYXZpb3VyLmlzTGlnaHR3ZWlnaHQoKSkgeworICAgICAqIHJldHVybjsgfSBmaXJlUHJvcGVydHlDaGFuZ2UoQWNjZXNzaWJsZUNvbnRleHQuQUNDRVNTSUJMRV9TVEFURV9QUk9QRVJUWSwKKyAgICAgKiBBY2Nlc3NpYmxlU3RhdGUuVklTSUJMRSwgbnVsbCk7IH0gcHVibGljIHZvaWQKKyAgICAgKiBjb21wb25lbnRNb3ZlZChDb21wb25lbnRFdmVudCBlKSB7IH0gcHVibGljIHZvaWQKKyAgICAgKiBjb21wb25lbnRSZXNpemVkKENvbXBvbmVudEV2ZW50IGUpIHsgfSBwdWJsaWMgdm9pZAorICAgICAqIGNvbXBvbmVudFNob3duKENvbXBvbmVudEV2ZW50IGUpIHsgaWYgKGJlaGF2aW91ci5pc0xpZ2h0d2VpZ2h0KCkpIHsKKyAgICAgKiByZXR1cm47IH0gZmlyZVByb3BlcnR5Q2hhbmdlKEFjY2Vzc2libGVDb250ZXh0LkFDQ0VTU0lCTEVfU1RBVEVfUFJPUEVSVFksCisgICAgICogbnVsbCwgQWNjZXNzaWJsZVN0YXRlLlZJU0lCTEUpOyB9IH0gcHJvdGVjdGVkIGNsYXNzCisgICAgICogQWNjZXNzaWJsZUFXVEZvY3VzSGFuZGxlciBpbXBsZW1lbnRzIEZvY3VzTGlzdGVuZXIgeyBwdWJsaWMgdm9pZAorICAgICAqIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgeyBpZiAoYmVoYXZpb3VyLmlzTGlnaHR3ZWlnaHQoKSkgeyByZXR1cm47IH0KKyAgICAgKiBmaXJlUHJvcGVydHlDaGFuZ2UoQWNjZXNzaWJsZUNvbnRleHQuQUNDRVNTSUJMRV9TVEFURV9QUk9QRVJUWSwgbnVsbCwKKyAgICAgKiBBY2Nlc3NpYmxlU3RhdGUuRk9DVVNFRCk7IH0gcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgeyBpZgorICAgICAqIChiZWhhdmlvdXIuaXNMaWdodHdlaWdodCgpKSB7IHJldHVybjsgfQorICAgICAqIGZpcmVQcm9wZXJ0eUNoYW5nZShBY2Nlc3NpYmxlQ29udGV4dC5BQ0NFU1NJQkxFX1NUQVRFX1BST1BFUlRZLAorICAgICAqIEFjY2Vzc2libGVTdGF0ZS5GT0NVU0VELCBudWxsKTsgfSB9IHByb3RlY3RlZCBDb21wb25lbnRMaXN0ZW5lcgorICAgICAqIGFjY2Vzc2libGVBV1RDb21wb25lbnRIYW5kbGVyOyBwcm90ZWN0ZWQgRm9jdXNMaXN0ZW5lcgorICAgICAqIGFjY2Vzc2libGVBV1RGb2N1c0hhbmRsZXI7CisgICAgICovCisgICAgLyoKKyAgICAgKiBOdW1iZXIgb2YgcmVnaXN0ZXJlZCBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXJzLgorICAgICAqLworICAgIC8qCisgICAgICogaW50IGxpc3RlbmVyc0NvdW50OyBwdWJsaWMgdm9pZCBhZGRGb2N1c0xpc3RlbmVyKEZvY3VzTGlzdGVuZXIgbCkgeworICAgICAqIENvbXBvbmVudC50aGlzLmFkZEZvY3VzTGlzdGVuZXIobCk7IH0KKyAgICAgKiBAT3ZlcnJpZGUgcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCisgICAgICogbGlzdGVuZXIpIHsgdG9vbGtpdC5sb2NrQVdUKCk7IHRyeSB7CisgICAgICogc3VwZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7IGxpc3RlbmVyc0NvdW50Kys7IGlmCisgICAgICogKGFjY2Vzc2libGVBV1RDb21wb25lbnRIYW5kbGVyID09IG51bGwpIHsgYWNjZXNzaWJsZUFXVENvbXBvbmVudEhhbmRsZXIgPQorICAgICAqIG5ldyBBY2Nlc3NpYmxlQVdUQ29tcG9uZW50SGFuZGxlcigpOworICAgICAqIENvbXBvbmVudC50aGlzLmFkZENvbXBvbmVudExpc3RlbmVyKGFjY2Vzc2libGVBV1RDb21wb25lbnRIYW5kbGVyKTsgfSBpZgorICAgICAqIChhY2Nlc3NpYmxlQVdURm9jdXNIYW5kbGVyID09IG51bGwpIHsgYWNjZXNzaWJsZUFXVEZvY3VzSGFuZGxlciA9IG5ldworICAgICAqIEFjY2Vzc2libGVBV1RGb2N1c0hhbmRsZXIoKTsKKyAgICAgKiBDb21wb25lbnQudGhpcy5hZGRGb2N1c0xpc3RlbmVyKGFjY2Vzc2libGVBV1RGb2N1c0hhbmRsZXIpOyB9IH0gZmluYWxseSB7CisgICAgICogdG9vbGtpdC51bmxvY2tBV1QoKTsgfSB9IHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFBvaW50IHApIHsKKyAgICAgKiB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsgcmV0dXJuIENvbXBvbmVudC50aGlzLmNvbnRhaW5zKHApOyB9IGZpbmFsbHkgeworICAgICAqIHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfSBwdWJsaWMgQWNjZXNzaWJsZSBnZXRBY2Nlc3NpYmxlQXQoUG9pbnQgYXJnMCkgeworICAgICAqIHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeyByZXR1cm4gbnVsbDsgfSBmaW5hbGx5IHsgdG9vbGtpdC51bmxvY2tBV1QoKTsgfQorICAgICAqIH0gcHVibGljIENvbG9yIGdldEJhY2tncm91bmQoKSB7IHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeyByZXR1cm4KKyAgICAgKiBDb21wb25lbnQudGhpcy5nZXRCYWNrZ3JvdW5kKCk7IH0gZmluYWxseSB7IHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfQorICAgICAqIHB1YmxpYyBSZWN0YW5nbGUgZ2V0Qm91bmRzKCkgeyB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsgcmV0dXJuCisgICAgICogQ29tcG9uZW50LnRoaXMuZ2V0Qm91bmRzKCk7IH0gZmluYWxseSB7IHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfSBwdWJsaWMKKyAgICAgKiBDdXJzb3IgZ2V0Q3Vyc29yKCkgeyB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsgcmV0dXJuCisgICAgICogQ29tcG9uZW50LnRoaXMuZ2V0Q3Vyc29yKCk7IH0gZmluYWxseSB7IHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfSBwdWJsaWMKKyAgICAgKiBGb250IGdldEZvbnQoKSB7IHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeyByZXR1cm4KKyAgICAgKiBDb21wb25lbnQudGhpcy5nZXRGb250KCk7IH0gZmluYWxseSB7IHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfSBwdWJsaWMKKyAgICAgKiBGb250TWV0cmljcyBnZXRGb250TWV0cmljcyhGb250IGYpIHsgdG9vbGtpdC5sb2NrQVdUKCk7IHRyeSB7IHJldHVybgorICAgICAqIENvbXBvbmVudC50aGlzLmdldEZvbnRNZXRyaWNzKGYpOyB9IGZpbmFsbHkgeyB0b29sa2l0LnVubG9ja0FXVCgpOyB9IH0KKyAgICAgKiBwdWJsaWMgQ29sb3IgZ2V0Rm9yZWdyb3VuZCgpIHsgdG9vbGtpdC5sb2NrQVdUKCk7IHRyeSB7IHJldHVybgorICAgICAqIENvbXBvbmVudC50aGlzLmdldEZvcmVncm91bmQoKTsgfSBmaW5hbGx5IHsgdG9vbGtpdC51bmxvY2tBV1QoKTsgfSB9CisgICAgICogcHVibGljIFBvaW50IGdldExvY2F0aW9uKCkgeyB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsgcmV0dXJuCisgICAgICogQ29tcG9uZW50LnRoaXMuZ2V0TG9jYXRpb24oKTsgfSBmaW5hbGx5IHsgdG9vbGtpdC51bmxvY2tBV1QoKTsgfSB9IHB1YmxpYworICAgICAqIFBvaW50IGdldExvY2F0aW9uT25TY3JlZW4oKSB7IHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeyByZXR1cm4KKyAgICAgKiBDb21wb25lbnQudGhpcy5nZXRMb2NhdGlvbk9uU2NyZWVuKCk7IH0gZmluYWxseSB7IHRvb2xraXQudW5sb2NrQVdUKCk7IH0KKyAgICAgKiB9IHB1YmxpYyBEaW1lbnNpb24gZ2V0U2l6ZSgpIHsgdG9vbGtpdC5sb2NrQVdUKCk7IHRyeSB7IHJldHVybgorICAgICAqIENvbXBvbmVudC50aGlzLmdldFNpemUoKTsgfSBmaW5hbGx5IHsgdG9vbGtpdC51bmxvY2tBV1QoKTsgfSB9IHB1YmxpYworICAgICAqIGJvb2xlYW4gaXNFbmFibGVkKCkgeyB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsgcmV0dXJuCisgICAgICogQ29tcG9uZW50LnRoaXMuaXNFbmFibGVkKCk7IH0gZmluYWxseSB7IHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfSBwdWJsaWMKKyAgICAgKiBib29sZWFuIGlzRm9jdXNUcmF2ZXJzYWJsZSgpIHsgdG9vbGtpdC5sb2NrQVdUKCk7IHRyeSB7IHJldHVybgorICAgICAqIENvbXBvbmVudC50aGlzLmlzRm9jdXNUcmF2ZXJzYWJsZSgpOyB9IGZpbmFsbHkgeyB0b29sa2l0LnVubG9ja0FXVCgpOyB9IH0KKyAgICAgKiBwdWJsaWMgYm9vbGVhbiBpc1Nob3dpbmcoKSB7IHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeyByZXR1cm4KKyAgICAgKiBDb21wb25lbnQudGhpcy5pc1Nob3dpbmcoKTsgfSBmaW5hbGx5IHsgdG9vbGtpdC51bmxvY2tBV1QoKTsgfSB9IHB1YmxpYworICAgICAqIGJvb2xlYW4gaXNWaXNpYmxlKCkgeyB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsgcmV0dXJuCisgICAgICogQ29tcG9uZW50LnRoaXMuaXNWaXNpYmxlKCk7IH0gZmluYWxseSB7IHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfSBwdWJsaWMKKyAgICAgKiB2b2lkIHJlbW92ZUZvY3VzTGlzdGVuZXIoRm9jdXNMaXN0ZW5lciBsKSB7CisgICAgICogQ29tcG9uZW50LnRoaXMucmVtb3ZlRm9jdXNMaXN0ZW5lcihsKTsgfQorICAgICAqIEBPdmVycmlkZSBwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIKKyAgICAgKiBsaXN0ZW5lcikgeyB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsKKyAgICAgKiBzdXBlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsgbGlzdGVuZXJzQ291bnQtLTsgaWYKKyAgICAgKiAobGlzdGVuZXJzQ291bnQgPiAwKSB7IHJldHVybjsgfSAvLyBpZiB0aGVyZSBhcmUgbm8gbW9yZSBsaXN0ZW5lcnMsCisgICAgICogcmVtb3ZlIGhhbmRsZXJzOgorICAgICAqIENvbXBvbmVudC50aGlzLnJlbW92ZUZvY3VzTGlzdGVuZXIoYWNjZXNzaWJsZUFXVEZvY3VzSGFuZGxlcik7CisgICAgICogQ29tcG9uZW50LnRoaXMucmVtb3ZlQ29tcG9uZW50TGlzdGVuZXIoYWNjZXNzaWJsZUFXVENvbXBvbmVudEhhbmRsZXIpOworICAgICAqIGFjY2Vzc2libGVBV1RDb21wb25lbnRIYW5kbGVyID0gbnVsbDsgYWNjZXNzaWJsZUFXVEZvY3VzSGFuZGxlciA9IG51bGw7IH0KKyAgICAgKiBmaW5hbGx5IHsgdG9vbGtpdC51bmxvY2tBV1QoKTsgfSB9IHB1YmxpYyB2b2lkIHJlcXVlc3RGb2N1cygpIHsKKyAgICAgKiB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsgQ29tcG9uZW50LnRoaXMucmVxdWVzdEZvY3VzKCk7IH0gZmluYWxseSB7CisgICAgICogdG9vbGtpdC51bmxvY2tBV1QoKTsgfSB9IHB1YmxpYyB2b2lkIHNldEJhY2tncm91bmQoQ29sb3IgY29sb3IpIHsKKyAgICAgKiB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsgQ29tcG9uZW50LnRoaXMuc2V0QmFja2dyb3VuZChjb2xvcik7IH0gZmluYWxseSB7CisgICAgICogdG9vbGtpdC51bmxvY2tBV1QoKTsgfSB9IHB1YmxpYyB2b2lkIHNldEJvdW5kcyhSZWN0YW5nbGUgcikgeworICAgICAqIHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeyBDb21wb25lbnQudGhpcy5zZXRCb3VuZHMocik7IH0gZmluYWxseSB7CisgICAgICogdG9vbGtpdC51bmxvY2tBV1QoKTsgfSB9IHB1YmxpYyB2b2lkIHNldEN1cnNvcihDdXJzb3IgY3Vyc29yKSB7CisgICAgICogdG9vbGtpdC5sb2NrQVdUKCk7IHRyeSB7IENvbXBvbmVudC50aGlzLnNldEN1cnNvcihjdXJzb3IpOyB9IGZpbmFsbHkgeworICAgICAqIHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfSBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAqIHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeyBDb21wb25lbnQudGhpcy5zZXRFbmFibGVkKGVuYWJsZWQpOyB9IGZpbmFsbHkgeworICAgICAqIHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfSBwdWJsaWMgdm9pZCBzZXRGb250KEZvbnQgZikgeyB0b29sa2l0LmxvY2tBV1QoKTsKKyAgICAgKiB0cnkgeyBDb21wb25lbnQudGhpcy5zZXRGb250KGYpOyB9IGZpbmFsbHkgeyB0b29sa2l0LnVubG9ja0FXVCgpOyB9IH0KKyAgICAgKiBwdWJsaWMgdm9pZCBzZXRGb3JlZ3JvdW5kKENvbG9yIGNvbG9yKSB7IHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeworICAgICAqIENvbXBvbmVudC50aGlzLnNldEZvcmVncm91bmQoY29sb3IpOyB9IGZpbmFsbHkgeyB0b29sa2l0LnVubG9ja0FXVCgpOyB9IH0KKyAgICAgKiBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihQb2ludCBwKSB7IHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeworICAgICAqIENvbXBvbmVudC50aGlzLnNldExvY2F0aW9uKHApOyB9IGZpbmFsbHkgeyB0b29sa2l0LnVubG9ja0FXVCgpOyB9IH0KKyAgICAgKiBwdWJsaWMgdm9pZCBzZXRTaXplKERpbWVuc2lvbiBzaXplKSB7IHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeworICAgICAqIENvbXBvbmVudC50aGlzLnNldFNpemUoc2l6ZSk7IH0gZmluYWxseSB7IHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfSBwdWJsaWMKKyAgICAgKiB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7IHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeworICAgICAqIENvbXBvbmVudC50aGlzLnNldFZpc2libGUodmlzaWJsZSk7IH0gZmluYWxseSB7IHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfQorICAgICAqIEBPdmVycmlkZSBwdWJsaWMgQWNjZXNzaWJsZSBnZXRBY2Nlc3NpYmxlUGFyZW50KCkgeyB0b29sa2l0LmxvY2tBV1QoKTsKKyAgICAgKiB0cnkgeyBBY2Nlc3NpYmxlIGFQYXJlbnQgPSBzdXBlci5nZXRBY2Nlc3NpYmxlUGFyZW50KCk7IGlmIChhUGFyZW50ICE9CisgICAgICogbnVsbCkgeyByZXR1cm4gYVBhcmVudDsgfSBDb250YWluZXIgcGFyZW50ID0gZ2V0UGFyZW50KCk7IHJldHVybiAocGFyZW50CisgICAgICogaW5zdGFuY2VvZiBBY2Nlc3NpYmxlID8gKEFjY2Vzc2libGUpIHBhcmVudCA6IG51bGwpOyB9IGZpbmFsbHkgeworICAgICAqIHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfQorICAgICAqIEBPdmVycmlkZSBwdWJsaWMgQWNjZXNzaWJsZSBnZXRBY2Nlc3NpYmxlQ2hpbGQoaW50IGkpIHsKKyAgICAgKiB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsgcmV0dXJuIG51bGw7IH0gZmluYWxseSB7IHRvb2xraXQudW5sb2NrQVdUKCk7IH0KKyAgICAgKiB9CisgICAgICogQE92ZXJyaWRlIHB1YmxpYyBpbnQgZ2V0QWNjZXNzaWJsZUNoaWxkcmVuQ291bnQoKSB7IHRvb2xraXQubG9ja0FXVCgpOworICAgICAqIHRyeSB7IHJldHVybiAwOyB9IGZpbmFsbHkgeyB0b29sa2l0LnVubG9ja0FXVCgpOyB9IH0KKyAgICAgKiBAT3ZlcnJpZGUgcHVibGljIEFjY2Vzc2libGVDb21wb25lbnQgZ2V0QWNjZXNzaWJsZUNvbXBvbmVudCgpIHsgcmV0dXJuCisgICAgICogdGhpczsgfQorICAgICAqIEBPdmVycmlkZSBwdWJsaWMgU3RyaW5nIGdldEFjY2Vzc2libGVEZXNjcmlwdGlvbigpIHsgcmV0dXJuCisgICAgICogc3VwZXIuZ2V0QWNjZXNzaWJsZURlc2NyaXB0aW9uKCk7IC8vIHdoeSBvdmVycmlkZT8gfQorICAgICAqIEBPdmVycmlkZSBwdWJsaWMgaW50IGdldEFjY2Vzc2libGVJbmRleEluUGFyZW50KCkgeyB0b29sa2l0LmxvY2tBV1QoKTsKKyAgICAgKiB0cnkgeyBpZiAoZ2V0QWNjZXNzaWJsZVBhcmVudCgpID09IG51bGwpIHsgcmV0dXJuIC0xOyB9IGludCBjb3VudCA9IDA7CisgICAgICogQ29udGFpbmVyIHBhcmVudCA9IGdldFBhcmVudCgpOyBmb3IgKGludCBpID0gMDsgaSA8CisgICAgICogcGFyZW50LmdldENvbXBvbmVudENvdW50KCk7IGkrKykgeyBDb21wb25lbnQgYUNvbXAgPQorICAgICAqIHBhcmVudC5nZXRDb21wb25lbnQoaSk7IGlmIChhQ29tcCBpbnN0YW5jZW9mIEFjY2Vzc2libGUpIHsgaWYgKGFDb21wID09CisgICAgICogQ29tcG9uZW50LnRoaXMpIHsgcmV0dXJuIGNvdW50OyB9ICsrY291bnQ7IH0gfSByZXR1cm4gLTE7IH0gZmluYWxseSB7CisgICAgICogdG9vbGtpdC51bmxvY2tBV1QoKTsgfSB9CisgICAgICogQE92ZXJyaWRlIHB1YmxpYyBBY2Nlc3NpYmxlUm9sZSBnZXRBY2Nlc3NpYmxlUm9sZSgpIHsgdG9vbGtpdC5sb2NrQVdUKCk7CisgICAgICogdHJ5IHsgcmV0dXJuIEFjY2Vzc2libGVSb2xlLkFXVF9DT01QT05FTlQ7IH0gZmluYWxseSB7CisgICAgICogdG9vbGtpdC51bmxvY2tBV1QoKTsgfSB9CisgICAgICogQE92ZXJyaWRlIHB1YmxpYyBBY2Nlc3NpYmxlU3RhdGVTZXQgZ2V0QWNjZXNzaWJsZVN0YXRlU2V0KCkgeworICAgICAqIHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeyBBY2Nlc3NpYmxlU3RhdGVTZXQgc2V0ID0gbmV3CisgICAgICogQWNjZXNzaWJsZVN0YXRlU2V0KCk7IGlmIChpc0VuYWJsZWQoKSkgeworICAgICAqIHNldC5hZGQoQWNjZXNzaWJsZVN0YXRlLkVOQUJMRUQpOyB9IGlmIChpc0ZvY3VzYWJsZSgpKSB7CisgICAgICogc2V0LmFkZChBY2Nlc3NpYmxlU3RhdGUuRk9DVVNBQkxFKTsgfSBpZiAoaGFzRm9jdXMoKSkgeworICAgICAqIHNldC5hZGQoQWNjZXNzaWJsZVN0YXRlLkZPQ1VTRUQpOyB9IGlmIChpc09wYXF1ZSgpKSB7CisgICAgICogc2V0LmFkZChBY2Nlc3NpYmxlU3RhdGUuT1BBUVVFKTsgfSBpZiAoaXNTaG93aW5nKCkpIHsKKyAgICAgKiBzZXQuYWRkKEFjY2Vzc2libGVTdGF0ZS5TSE9XSU5HKTsgfSBpZiAoaXNWaXNpYmxlKCkpIHsKKyAgICAgKiBzZXQuYWRkKEFjY2Vzc2libGVTdGF0ZS5WSVNJQkxFKTsgfSByZXR1cm4gc2V0OyB9IGZpbmFsbHkgeworICAgICAqIHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfQorICAgICAqIEBPdmVycmlkZSBwdWJsaWMgTG9jYWxlIGdldExvY2FsZSgpIHRocm93cyBJbGxlZ2FsQ29tcG9uZW50U3RhdGVFeGNlcHRpb24KKyAgICAgKiB7IHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeyByZXR1cm4gQ29tcG9uZW50LnRoaXMuZ2V0TG9jYWxlKCk7IH0gZmluYWxseSB7CisgICAgICogdG9vbGtpdC51bmxvY2tBV1QoKTsgfSB9IH0KKyAgICAgKi8KICAgICAvKioKLSAgICAgKiBUaGUgQmx0QnVmZmVyU3RyYXRlZ3kgY2xhc3MgcHJvdmlkZXMgb3Bwb3J0dW5pdHkgb2YgYmxpdHRpbmcgCi0gICAgICogb2Zmc2NyZWVuIHN1cmZhY2VzIHRvIGEgY29tcG9uZW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiAKLSAgICAgKiBibGl0dGluZywgc2VlIDxhIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQml0X2JsaXQiPkJpdCBibGl0PC9hPi4KKyAgICAgKiBUaGUgQmx0QnVmZmVyU3RyYXRlZ3kgY2xhc3MgcHJvdmlkZXMgb3Bwb3J0dW5pdHkgb2YgYmxpdHRpbmcgb2Zmc2NyZWVuCisgICAgICogc3VyZmFjZXMgdG8gYSBjb21wb25lbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGJsaXR0aW5nLCBzZWUgPGEKKyAgICAgKiBocmVmPSJodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpdF9ibGl0Ij5CaXQgYmxpdDwvYT4uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGNsYXNzIEJsdEJ1ZmZlclN0cmF0ZWd5IGV4dGVuZHMgQnVmZmVyU3RyYXRlZ3kgewotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBiYWNrIGJ1ZmZlcnMuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBiYWNrIGJ1ZmZlcnMuCisgICAgICAgICAqLwogICAgICAgICBwcm90ZWN0ZWQgVm9sYXRpbGVJbWFnZVtdIGJhY2tCdWZmZXJzOwogCi0gICAgICAgIC8qKiBUaGUgY2Fwcy4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjYXBzLgorICAgICAgICAgKi8KICAgICAgICAgcHJvdGVjdGVkIEJ1ZmZlckNhcGFiaWxpdGllcyBjYXBzOwogCi0gICAgICAgIC8qKiBUaGUgd2lkdGguICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgd2lkdGguCisgICAgICAgICAqLwogICAgICAgICBwcm90ZWN0ZWQgaW50IHdpZHRoOwogCi0gICAgICAgIC8qKiBUaGUgaGVpZ2h0LiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGhlaWdodC4KKyAgICAgICAgICovCiAgICAgICAgIHByb3RlY3RlZCBpbnQgaGVpZ2h0OwogCi0gICAgICAgIC8qKiBUaGUgdmFsaWRhdGVkIGNvbnRlbnRzLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHZhbGlkYXRlZCBjb250ZW50cy4KKyAgICAgICAgICovCiAgICAgICAgIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlZENvbnRlbnRzOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQmx0QnVmZmVyU3RyYXRlZ3kgYnVmZmVyIHN0cmF0ZWd5LgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIG51bUJ1ZmZlcnMgdGhlIG51bWJlciBvZiBidWZmZXJzLgotICAgICAgICAgKiBAcGFyYW0gY2FwcyB0aGUgQnVmZmVyQ2FwYWJpbGl0aWVzLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHRocm93cyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiB0aGUgbm90IGltcGxlbWVudGVkIGV4Y2VwdGlvbi4KKyAgICAgICAgICogQHBhcmFtIG51bUJ1ZmZlcnMKKyAgICAgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMuCisgICAgICAgICAqIEBwYXJhbSBjYXBzCisgICAgICAgICAqICAgICAgICAgICAgdGhlIEJ1ZmZlckNhcGFiaWxpdGllcy4KKyAgICAgICAgICogQHRocm93cyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbgorICAgICAgICAgKiAgICAgICAgICAgICB0aGUgbm90IGltcGxlbWVudGVkIGV4Y2VwdGlvbi4KICAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCBCbHRCdWZmZXJTdHJhdGVneShpbnQgbnVtQnVmZmVycywgQnVmZmVyQ2FwYWJpbGl0aWVzIGNhcHMpIHRocm93cyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk5vdEltcGxlbWVudGVkRXhjZXB0aW9uIHsKKyAgICAgICAgcHJvdGVjdGVkIEJsdEJ1ZmZlclN0cmF0ZWd5KGludCBudW1CdWZmZXJzLCBCdWZmZXJDYXBhYmlsaXRpZXMgY2FwcykKKyAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Ob3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBpZiAodHJ1ZSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJNZXRob2QgaXMgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRyYXdpbmcgYnVmZmVyIGhhcyBiZWVuIGxvc3Qgc2luY2UgdGhlIGxhc3QgY2FsbCAKLSAgICAgICAgICogdG8gZ2V0RHJhd0dyYXBoaWNzLiAKKyAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBkcmF3aW5nIGJ1ZmZlciBoYXMgYmVlbiBsb3N0IHNpbmNlIHRoZSBsYXN0IGNhbGwKKyAgICAgICAgICogdG8gZ2V0RHJhd0dyYXBoaWNzLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBkcmF3aW5nIGJ1ZmZlciBoYXMgYmVlbiBsb3N0IHNpbmNlIHRoZSBsYXN0IGNhbGwgCi0gICAgICAgICAqIHRvIGdldERyYXdHcmFwaGljcywgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAgICAgKiAgCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZHJhd2luZyBidWZmZXIgaGFzIGJlZW4gbG9zdCBzaW5jZSB0aGUgbGFzdCBjYWxsCisgICAgICAgICAqICAgICAgICAgdG8gZ2V0RHJhd0dyYXBoaWNzLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICAqIEBzZWUgamF2YS5hd3QuaW1hZ2UuQnVmZmVyU3RyYXRlZ3kjY29udGVudHNMb3N0KCkKICAgICAgICAgICovCiAgICAgICAgIEBPdmVycmlkZQpAQCAtNjM0LDkgKzM2MCw4IEBACiAgICAgICAgICAqIHN0YXRlIGFuZCByZWluaXRpYWxpemVkIHRvIHRoZSBkZWZhdWx0IGJhY2tncm91bmQgY29sb3IuCiAgICAgICAgICAqIAogICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRyYXdpbmcgYnVmZmVyIGhhcyBiZWVuIHJlc3RvcmVkIGZyb20gYSBsb3N0Ci0gICAgICAgICAqIHN0YXRlIGFuZCByZWluaXRpYWxpemVkIHRvIHRoZSBkZWZhdWx0IGJhY2tncm91bmQgY29sb3IsCi0gICAgICAgICAqIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgICAgICogICAgICAgICAgIAorICAgICAgICAgKiAgICAgICAgIHN0YXRlIGFuZCByZWluaXRpYWxpemVkIHRvIHRoZSBkZWZhdWx0IGJhY2tncm91bmQgY29sb3IsCisgICAgICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAgKiBAc2VlIGphdmEuYXd0LmltYWdlLkJ1ZmZlclN0cmF0ZWd5I2NvbnRlbnRzUmVzdG9yZWQoKQogICAgICAgICAgKi8KICAgICAgICAgQE92ZXJyaWRlCkBAIC02NTAsNyArMzc1LDggQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIENyZWF0ZXMgdGhlIGJhY2sgYnVmZmVycy4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBudW1CdWZmZXJzIHRoZSBudW1iZXIgb2YgYnVmZmVycy4KKyAgICAgICAgICogQHBhcmFtIG51bUJ1ZmZlcnMKKyAgICAgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMuCiAgICAgICAgICAqLwogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCYWNrQnVmZmVycyhpbnQgbnVtQnVmZmVycykgewogICAgICAgICAgICAgaWYgKHRydWUpIHsKQEAgLTY2MiwxOSArMzg4LDE3IEBACiAgICAgICAgICAqIFJldHVybnMgdGhlIEJ1ZmZlckNhcGFiaWxpdGllcyBvZiB0aGUgYnVmZmVyIHN0cmF0ZWd5LgogICAgICAgICAgKiAKICAgICAgICAgICogQHJldHVybiB0aGUgQnVmZmVyQ2FwYWJpbGl0aWVzLgotICAgICAgICAgKiAKICAgICAgICAgICogQHNlZSBqYXZhLmF3dC5pbWFnZS5CdWZmZXJTdHJhdGVneSNnZXRDYXBhYmlsaXRpZXMoKQogICAgICAgICAgKi8KICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBCdWZmZXJDYXBhYmlsaXRpZXMgZ2V0Q2FwYWJpbGl0aWVzKCkgewotICAgICAgICAgICAgcmV0dXJuIChCdWZmZXJDYXBhYmlsaXRpZXMpIGNhcHMuY2xvbmUoKTsKKyAgICAgICAgICAgIHJldHVybiAoQnVmZmVyQ2FwYWJpbGl0aWVzKWNhcHMuY2xvbmUoKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBHZXRzIEdyYXBoaWNzIG9mIGN1cnJlbnQgYnVmZmVyIHN0cmF0ZWd5LgogICAgICAgICAgKiAKICAgICAgICAgICogQHJldHVybiB0aGUgR3JhcGhpY3Mgb2YgY3VycmVudCBidWZmZXIgc3RyYXRlZ3kuCi0gICAgICAgICAqIAogICAgICAgICAgKiBAc2VlIGphdmEuYXd0LmltYWdlLkJ1ZmZlclN0cmF0ZWd5I2dldERyYXdHcmFwaGljcygpCiAgICAgICAgICAqLwogICAgICAgICBAT3ZlcnJpZGUKQEAgLTcwOCw1NiArNDMyLDY4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhlIEZsaXBCdWZmZXJTdHJhdGVneSBjbGFzcyBpcyBmb3IgZmxpcHBpbmcgYnVmZmVycyBvbiBhIGNvbXBvbmVudC4gCisgICAgICogVGhlIEZsaXBCdWZmZXJTdHJhdGVneSBjbGFzcyBpcyBmb3IgZmxpcHBpbmcgYnVmZmVycyBvbiBhIGNvbXBvbmVudC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgY2xhc3MgRmxpcEJ1ZmZlclN0cmF0ZWd5IGV4dGVuZHMgQnVmZmVyU3RyYXRlZ3kgewotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBCdWZmZXIgQ2FwYWJpbGl0aWVzLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgQnVmZmVyIENhcGFiaWxpdGllcy4KKyAgICAgICAgICovCiAgICAgICAgIHByb3RlY3RlZCBCdWZmZXJDYXBhYmlsaXRpZXMgY2FwczsKIAotICAgICAgICAvKiogVGhlIGRyYXdpbmcgYnVmZmVyLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRyYXdpbmcgYnVmZmVyLgorICAgICAgICAgKi8KICAgICAgICAgcHJvdGVjdGVkIEltYWdlIGRyYXdCdWZmZXI7CiAKLSAgICAgICAgLyoqIFRoZSBkcmF3aW5nIFZvbGF0aWxlSW1hZ2UgYnVmZmVyLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRyYXdpbmcgVm9sYXRpbGVJbWFnZSBidWZmZXIuCisgICAgICAgICAqLwogICAgICAgICBwcm90ZWN0ZWQgVm9sYXRpbGVJbWFnZSBkcmF3VkJ1ZmZlcjsKIAotICAgICAgICAvKiogVGhlIG51bWJlciBvZiBidWZmZXJzLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG51bWJlciBvZiBidWZmZXJzLgorICAgICAgICAgKi8KICAgICAgICAgcHJvdGVjdGVkIGludCBudW1CdWZmZXJzOwogCi0gICAgICAgIC8qKiBUaGUgdmFsaWRhdGVkIGNvbnRlbnRzIGluZGljYXRlcyBpZiB0aGUgZHJhd2luZyBidWZmZXIgaXMgcmVzdG9yZWQgZnJvbQotICAgICAgICAgKiBsb3N0IHN0YXRlLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHZhbGlkYXRlZCBjb250ZW50cyBpbmRpY2F0ZXMgaWYgdGhlIGRyYXdpbmcgYnVmZmVyIGlzIHJlc3RvcmVkCisgICAgICAgICAqIGZyb20gbG9zdCBzdGF0ZS4KKyAgICAgICAgICovCiAgICAgICAgIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlZENvbnRlbnRzOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZmxpcCBidWZmZXIgc3RyYXRlZ3kuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gbnVtQnVmZmVycyB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMuCi0gICAgICAgICAqIEBwYXJhbSBjYXBzIHRoZSBCdWZmZXJDYXBhYmlsaXRpZXMuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAdGhyb3dzIEFXVEV4Y2VwdGlvbiBpZiB0aGUgY2FwYWJpbGl0aWVzIHN1cHBsaWVkIGNvdWxkIG5vdCAKLSAgICAgICAgICogYmUgc3VwcG9ydGVkIG9yIG1ldC4KKyAgICAgICAgICogQHBhcmFtIG51bUJ1ZmZlcnMKKyAgICAgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMuCisgICAgICAgICAqIEBwYXJhbSBjYXBzCisgICAgICAgICAqICAgICAgICAgICAgdGhlIEJ1ZmZlckNhcGFiaWxpdGllcy4KKyAgICAgICAgICogQHRocm93cyBBV1RFeGNlcHRpb24KKyAgICAgICAgICogICAgICAgICAgICAgaWYgdGhlIGNhcGFiaWxpdGllcyBzdXBwbGllZCBjb3VsZCBub3QgYmUgc3VwcG9ydGVkIG9yCisgICAgICAgICAqICAgICAgICAgICAgIG1ldC4KICAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCBGbGlwQnVmZmVyU3RyYXRlZ3koaW50IG51bUJ1ZmZlcnMsIEJ1ZmZlckNhcGFiaWxpdGllcyBjYXBzKQotICAgICAgICAgICAgICAgIHRocm93cyBBV1RFeGNlcHRpb24gewotICAgICAgICAgICAgLy8/Pz9BV1QKKyAgICAgICAgcHJvdGVjdGVkIEZsaXBCdWZmZXJTdHJhdGVneShpbnQgbnVtQnVmZmVycywgQnVmZmVyQ2FwYWJpbGl0aWVzIGNhcHMpIHRocm93cyBBV1RFeGNlcHRpb24geworICAgICAgICAgICAgLy8gPz8/QVdUCiAgICAgICAgICAgICAvKgotICAgICAgICAgICAgaWYgKCEoQ29tcG9uZW50LnRoaXMgaW5zdGFuY2VvZiBXaW5kb3cpICYmICEoQ29tcG9uZW50LnRoaXMgaW5zdGFuY2VvZiBDYW52YXMpKSB7Ci0gICAgICAgICAgICAgICAgLy8gYXd0LjE0Qj1Pbmx5IENhbnZhcyBvciBXaW5kb3cgaXMgYWxsb3dlZAotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMTRCIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqLworICAgICAgICAgICAgICogaWYgKCEoQ29tcG9uZW50LnRoaXMgaW5zdGFuY2VvZiBXaW5kb3cpICYmICEoQ29tcG9uZW50LnRoaXMKKyAgICAgICAgICAgICAqIGluc3RhbmNlb2YgQ2FudmFzKSkgeyAvLyBhd3QuMTRCPU9ubHkgQ2FudmFzIG9yIFdpbmRvdyBpcyBhbGxvd2VkCisgICAgICAgICAgICAgKiB0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjE0QiIpKTsKKyAgICAgICAgICAgICAqIC8vJE5PTi1OTFMtMSQgfQorICAgICAgICAgICAgICovCiAgICAgICAgICAgICAvLyBUT0RPOiB0aHJvdyBuZXcgQVdURXhjZXB0aW9uKCJDYXBhYmlsaXRpZXMgYXJlIG5vdCBzdXBwb3J0ZWQiKTsKICAgICAgICAgICAgIHRoaXMubnVtQnVmZmVycyA9IG51bUJ1ZmZlcnM7Ci0gICAgICAgICAgICB0aGlzLmNhcHMgPSAoQnVmZmVyQ2FwYWJpbGl0aWVzKSBjYXBzLmNsb25lKCk7CisgICAgICAgICAgICB0aGlzLmNhcHMgPSAoQnVmZmVyQ2FwYWJpbGl0aWVzKWNhcHMuY2xvbmUoKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRyYXdpbmcgYnVmZmVyIGhhcyBiZWVuIGxvc3Qgc2luY2UgdGhlIGxhc3QgY2FsbCAKLSAgICAgICAgICogdG8gZ2V0RHJhd0dyYXBoaWNzLiAKKyAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBkcmF3aW5nIGJ1ZmZlciBoYXMgYmVlbiBsb3N0IHNpbmNlIHRoZSBsYXN0IGNhbGwKKyAgICAgICAgICogdG8gZ2V0RHJhd0dyYXBoaWNzLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBkcmF3aW5nIGJ1ZmZlciBoYXMgYmVlbiBsb3N0IHNpbmNlIHRoZSBsYXN0IGNhbGwgCi0gICAgICAgICAqIHRvIGdldERyYXdHcmFwaGljcywgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAgICAgKiAKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBkcmF3aW5nIGJ1ZmZlciBoYXMgYmVlbiBsb3N0IHNpbmNlIHRoZSBsYXN0IGNhbGwKKyAgICAgICAgICogICAgICAgICB0byBnZXREcmF3R3JhcGhpY3MsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgICogQHNlZSBqYXZhLmF3dC5pbWFnZS5CdWZmZXJTdHJhdGVneSNjb250ZW50c0xvc3QoKQogICAgICAgICAgKi8KICAgICAgICAgQE92ZXJyaWRlCkBAIC03NzMsOSArNTA5LDggQEAKICAgICAgICAgICogc3RhdGUgYW5kIHJlaW5pdGlhbGl6ZWQgdG8gdGhlIGRlZmF1bHQgYmFja2dyb3VuZCBjb2xvci4KICAgICAgICAgICogCiAgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZHJhd2luZyBidWZmZXIgaGFzIGJlZW4gcmVzdG9yZWQgZnJvbSBhIGxvc3QKLSAgICAgICAgICogc3RhdGUgYW5kIHJlaW5pdGlhbGl6ZWQgdG8gdGhlIGRlZmF1bHQgYmFja2dyb3VuZCBjb2xvciwKLSAgICAgICAgICogZmFsc2Ugb3RoZXJ3aXNlLiAKLSAgICAgICAgICogCisgICAgICAgICAqICAgICAgICAgc3RhdGUgYW5kIHJlaW5pdGlhbGl6ZWQgdG8gdGhlIGRlZmF1bHQgYmFja2dyb3VuZCBjb2xvciwKKyAgICAgICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICAqIEBzZWUgamF2YS5hd3QuaW1hZ2UuQnVmZmVyU3RyYXRlZ3kjY29udGVudHNSZXN0b3JlZCgpCiAgICAgICAgICAqLwogICAgICAgICBAT3ZlcnJpZGUKQEAgLTc4OSwxNCArNTI0LDE0IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBDcmVhdGVzIGZsaXBwaW5nIGJ1ZmZlcnMgd2l0aCB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBjYXBhYmlsaXRpZXMuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gbnVtQnVmZmVycyB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMuCi0gICAgICAgICAqIEBwYXJhbSBjYXBzIHRoZSBCdWZmZXJDYXBhYmlsaXRpZXMuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAdGhyb3dzIEFXVEV4Y2VwdGlvbiBpZiB0aGUgY2FwYWJpbGl0aWVzIGNvdWxkIG5vdCBiZSAKLSAgICAgICAgICogc3VwcG9ydGVkIG9yIG1ldC4KKyAgICAgICAgICogQHBhcmFtIG51bUJ1ZmZlcnMKKyAgICAgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMuCisgICAgICAgICAqIEBwYXJhbSBjYXBzCisgICAgICAgICAqICAgICAgICAgICAgdGhlIEJ1ZmZlckNhcGFiaWxpdGllcy4KKyAgICAgICAgICogQHRocm93cyBBV1RFeGNlcHRpb24KKyAgICAgICAgICogICAgICAgICAgICAgaWYgdGhlIGNhcGFiaWxpdGllcyBjb3VsZCBub3QgYmUgc3VwcG9ydGVkIG9yIG1ldC4KICAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1ZmZlcnMoaW50IG51bUJ1ZmZlcnMsIEJ1ZmZlckNhcGFiaWxpdGllcyBjYXBzKQotICAgICAgICAgICAgICAgIHRocm93cyBBV1RFeGNlcHRpb24geworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdWZmZXJzKGludCBudW1CdWZmZXJzLCBCdWZmZXJDYXBhYmlsaXRpZXMgY2FwcykgdGhyb3dzIEFXVEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBpZiAobnVtQnVmZmVycyA8IDIpIHsKICAgICAgICAgICAgICAgICAvLyBhd3QuMTRDPU51bWJlciBvZiBidWZmZXJzIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9uZQogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMTRDIikpOyAvLyROT04tTkxTLTEkCkBAIC04MjcsNyArNTYyLDggQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEZsaXBzIHRoZSBjb250ZW50cyBvZiB0aGUgYmFjayBidWZmZXIgdG8gdGhlIGZyb250IGJ1ZmZlci4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBmbGlwQWN0aW9uIHRoZSBmbGlwIGFjdGlvbi4KKyAgICAgICAgICogQHBhcmFtIGZsaXBBY3Rpb24KKyAgICAgICAgICogICAgICAgICAgICB0aGUgZmxpcCBhY3Rpb24uCiAgICAgICAgICAqLwogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBmbGlwKEJ1ZmZlckNhcGFiaWxpdGllcy5GbGlwQ29udGVudHMgZmxpcEFjdGlvbikgewogICAgICAgICAgICAgaWYgKHRydWUpIHsKQEAgLTg1MSwxOSArNTg3LDE3IEBACiAgICAgICAgICAqIFJldHVybnMgdGhlIEJ1ZmZlckNhcGFiaWxpdGllcyBvZiB0aGUgYnVmZmVyIHN0cmF0ZWd5LgogICAgICAgICAgKiAKICAgICAgICAgICogQHJldHVybiB0aGUgQnVmZmVyQ2FwYWJpbGl0aWVzLgotICAgICAgICAgKiAKICAgICAgICAgICogQHNlZSBqYXZhLmF3dC5pbWFnZS5CdWZmZXJTdHJhdGVneSNnZXRDYXBhYmlsaXRpZXMoKQogICAgICAgICAgKi8KICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBCdWZmZXJDYXBhYmlsaXRpZXMgZ2V0Q2FwYWJpbGl0aWVzKCkgewotICAgICAgICAgICAgcmV0dXJuIChCdWZmZXJDYXBhYmlsaXRpZXMpIGNhcHMuY2xvbmUoKTsKKyAgICAgICAgICAgIHJldHVybiAoQnVmZmVyQ2FwYWJpbGl0aWVzKWNhcHMuY2xvbmUoKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBHZXRzIEdyYXBoaWNzIG9mIGN1cnJlbnQgYnVmZmVyIHN0cmF0ZWd5LgogICAgICAgICAgKiAKICAgICAgICAgICogQHJldHVybiB0aGUgR3JhcGhpY3Mgb2YgY3VycmVudCBidWZmZXIgc3RyYXRlZ3kuCi0gICAgICAgICAqIAogICAgICAgICAgKiBAc2VlIGphdmEuYXd0LmltYWdlLkJ1ZmZlclN0cmF0ZWd5I2dldERyYXdHcmFwaGljcygpCiAgICAgICAgICAqLwogICAgICAgICBAT3ZlcnJpZGUKQEAgLTkwMCwxNCArNjM0LDE2IEBACiAgICAgICogVGhlIGludGVybmFsIGNvbXBvbmVudCdzIHN0YXRlIHV0aWxpemVkIGJ5IHRoZSB2aXN1YWwgdGhlbWUuCiAgICAgICovCiAgICAgY2xhc3MgQ29tcG9uZW50U3RhdGUgaW1wbGVtZW50cyBTdGF0ZSB7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIGRlZmF1bHQgbWluaW11bSBzaXplLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGVmYXVsdCBtaW5pbXVtIHNpemUuCisgICAgICAgICAqLwogICAgICAgICBwcml2YXRlIERpbWVuc2lvbiBkZWZhdWx0TWluaW11bVNpemUgPSBuZXcgRGltZW5zaW9uKCk7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIENoZWNrcyBpZiB0aGUgY29tcG9uZW50IGlzIGVuYWJsZWQuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBjb21wb25lbnQgaXMgZW5hYmxlZAorICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBjb21wb25lbnQgaXMgZW5hYmxlZC4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKICAgICAgICAgICAgIHJldHVybiBlbmFibGVkOwpAQCAtOTE2LDcgKzY1Miw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBDaGVja3MgaWYgdGhlIGNvbXBvbmVudCBpcyB2aXNpYmxlLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgY29tcG9uZW50IGlzIHZpc2libGUKKyAgICAgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgY29tcG9uZW50IGlzIHZpc2libGUuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7CiAgICAgICAgICAgICByZXR1cm4gdmlzaWJsZTsKQEAgLTkyNSwxNyArNjYxLDE3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBDaGVja3MgaWYgaXMgZm9jdXNlZC4KICAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgaXMgZm9jdXNlZAorICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIGZvY3VzZWQuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZvY3VzZWQoKSB7Ci0gICAgICAgICAgICAvLz8/P0FXVDogcmV0dXJuIGlzRm9jdXNPd25lcigpOworICAgICAgICAgICAgLy8gPz8/QVdUOiByZXR1cm4gaXNGb2N1c093bmVyKCk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKICAgICAgICAgICogR2V0cyB0aGUgZm9udC4KICAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIGZvbnQKKyAgICAgICAgICogQHJldHVybiB0aGUgZm9udC4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBGb250IGdldEZvbnQoKSB7CiAgICAgICAgICAgICByZXR1cm4gQ29tcG9uZW50LnRoaXMuZ2V0Rm9udCgpOwpAQCAtOTQ0LDcgKzY4MCw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBDaGVja3MgaWYgdGhlIGZvbnQgaGFzIGJlZW4gc2V0LgogICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgZm9udCBoYXMgYmVlbiBzZXQKKyAgICAgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgZm9udCBoYXMgYmVlbiBzZXQuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZvbnRTZXQoKSB7CiAgICAgICAgICAgICByZXR1cm4gZm9udCAhPSBudWxsOwpAQCAtOTUzLDcgKzY4OSw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBHZXRzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgYmFja2dyb3VuZCBjb2xvcgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIENvbG9yIGdldEJhY2tncm91bmQoKSB7CiAgICAgICAgICAgICBDb2xvciBjID0gQ29tcG9uZW50LnRoaXMuZ2V0QmFja2dyb3VuZCgpOwpAQCAtOTYzLDcgKzY5OSw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBDaGVja3MgaWYgdGhlIGJhY2tncm91bmQgaXMgc2V0LgogICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgYmFja2dyb3VuZCBpcyBzZXQKKyAgICAgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgYmFja2dyb3VuZCBpcyBzZXQuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0JhY2tncm91bmRTZXQoKSB7CiAgICAgICAgICAgICByZXR1cm4gYmFja0NvbG9yICE9IG51bGw7CkBAIC05NzIsNyArNzA4LDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEdldHMgdGhlIHRleHQgY29sb3IuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSB0ZXh0IGNvbG9yCisgICAgICAgICAqIEByZXR1cm4gdGhlIHRleHQgY29sb3IuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgQ29sb3IgZ2V0VGV4dENvbG9yKCkgewogICAgICAgICAgICAgQ29sb3IgYyA9IGdldEZvcmVncm91bmQoKTsKQEAgLTk4Miw3ICs3MTgsNyBAQAogICAgICAgICAvKioKICAgICAgICAgICogQ2hlY2tzIGlmIHRoZSB0ZXh0IGNvbG9yIGlzIHNldC4KICAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHRleHQgY29sb3IgaXMgc2V0CisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHRleHQgY29sb3IgaXMgc2V0LgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNUZXh0Q29sb3JTZXQoKSB7CiAgICAgICAgICAgICByZXR1cm4gZm9yZUNvbG9yICE9IG51bGw7CkBAIC05OTEsNyArNzI3LDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEdldHMgdGhlIGZvbnQgbWV0cmljcy4KICAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIGZvbnQgbWV0cmljcworICAgICAgICAgKiBAcmV0dXJuIHRoZSBmb250IG1ldHJpY3MuCiAgICAgICAgICAqLwogICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgICAgICBwdWJsaWMgRm9udE1ldHJpY3MgZ2V0Rm9udE1ldHJpY3MoKSB7CkBAIC0xMDAxLDcgKzczNyw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBHZXRzIHRoZSBib3VuZGluZyByZWN0YW5nbGUuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBib3VuZGluZyByZWN0YW5nbGUKKyAgICAgICAgICogQHJldHVybiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIFJlY3RhbmdsZSBnZXRCb3VuZHMoKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFJlY3RhbmdsZSh4LCB5LCB3LCBoKTsKQEAgLTEwMTAsNyArNzQ2LDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEdldHMgdGhlIHNpemUgb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZS4KICAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZQorICAgICAgICAgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgRGltZW5zaW9uIGdldFNpemUoKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IERpbWVuc2lvbih3LCBoKTsKQEAgLTEwMTksNyArNzU1LDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEdldHMgdGhlIHdpbmRvdyBpZC4KICAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIHdpbmRvdyBpZAorICAgICAgICAgKiBAcmV0dXJuIHRoZSB3aW5kb3cgaWQuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgbG9uZyBnZXRXaW5kb3dJZCgpIHsKICAgICAgICAgICAgIE5hdGl2ZVdpbmRvdyB3aW4gPSBnZXROYXRpdmVXaW5kb3coKTsKQEAgLTEwMjksNyArNzY1LDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEdldHMgdGhlIGRlZmF1bHQgbWluaW11bSBzaXplLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBtaW5pbXVtIHNpemUKKyAgICAgICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBtaW5pbXVtIHNpemUuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgRGltZW5zaW9uIGdldERlZmF1bHRNaW5pbXVtU2l6ZSgpIHsKICAgICAgICAgICAgIGlmIChkZWZhdWx0TWluaW11bVNpemUgPT0gbnVsbCkgewpAQCAtMTA0MSw3ICs3NzcsOCBAQAogICAgICAgICAvKioKICAgICAgICAgICogU2V0cyB0aGUgZGVmYXVsdCBtaW5pbXVtIHNpemUuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgbmV3IGRlZmF1bHQgbWluaW11bSBzaXplCisgICAgICAgICAqIEBwYXJhbSBzaXplCisgICAgICAgICAqICAgICAgICAgICAgdGhlIG5ldyBkZWZhdWx0IG1pbmltdW0gc2l6ZS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRNaW5pbXVtU2l6ZShEaW1lbnNpb24gc2l6ZSkgewogICAgICAgICAgICAgZGVmYXVsdE1pbmltdW1TaXplID0gc2l6ZTsKQEAgLTEwNjIsMTc5ICs3OTksMjgzIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLz8/P0FXVDogcHJpdmF0ZSB0cmFuc2llbnQgQWNjZXNzaWJsZUNvbnRleHQgYWNjZXNzaWJsZUNvbnRleHQ7CisgICAgLy8gPz8/QVdUOiBwcml2YXRlIHRyYW5zaWVudCBBY2Nlc3NpYmxlQ29udGV4dCBhY2Nlc3NpYmxlQ29udGV4dDsKIAotICAgIC8qKiBUaGUgYmVoYXZpb3VyLiAqLworICAgIC8qKgorICAgICAqIFRoZSBiZWhhdmlvdXIuCisgICAgICovCiAgICAgZmluYWwgdHJhbnNpZW50IENvbXBvbmVudEJlaGF2aW9yIGJlaGF2aW91cjsKIAotICAgIC8vPz8/QVdUOiBDb250YWluZXIgcGFyZW50OworICAgIC8vID8/P0FXVDogQ29udGFpbmVyIHBhcmVudDsKIAotICAgIC8qKiBUaGUgbmFtZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZS4KKyAgICAgKi8KICAgICBwcml2YXRlIFN0cmluZyBuYW1lOwogCi0gICAgLyoqIFRoZSBhdXRvIG5hbWUuICovCisgICAgLyoqCisgICAgICogVGhlIGF1dG8gbmFtZS4KKyAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gYXV0b05hbWUgPSB0cnVlOwogCi0gICAgLyoqIFRoZSBmb250LiAqLworICAgIC8qKgorICAgICAqIFRoZSBmb250LgorICAgICAqLwogICAgIHByaXZhdGUgRm9udCBmb250OwogCi0gICAgLyoqIFRoZSBiYWNrIGNvbG9yLiAqLworICAgIC8qKgorICAgICAqIFRoZSBiYWNrIGNvbG9yLgorICAgICAqLwogICAgIHByaXZhdGUgQ29sb3IgYmFja0NvbG9yOwogCi0gICAgLyoqIFRoZSBmb3JlIGNvbG9yLiAqLworICAgIC8qKgorICAgICAqIFRoZSBmb3JlIGNvbG9yLgorICAgICAqLwogICAgIHByaXZhdGUgQ29sb3IgZm9yZUNvbG9yOwogCi0gICAgLyoqIFRoZSBkZXByZWNhdGVkIGV2ZW50IGhhbmRsZXIuICovCisgICAgLyoqCisgICAgICogVGhlIGRlcHJlY2F0ZWQgZXZlbnQgaGFuZGxlci4KKyAgICAgKi8KICAgICBib29sZWFuIGRlcHJlY2F0ZWRFdmVudEhhbmRsZXIgPSB0cnVlOwogCi0gICAgLyoqIFRoZSBlbmFibGVkIGV2ZW50cy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgZW5hYmxlZCBldmVudHMuCisgICAgICovCiAgICAgcHJpdmF0ZSBsb25nIGVuYWJsZWRFdmVudHM7CiAKLSAgICAvKiogVGhlIGVuYWJsZWQgYXd0IGV2ZW50cy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgZW5hYmxlZCBBV1QgZXZlbnRzLgorICAgICAqLwogICAgIHByaXZhdGUgbG9uZyBlbmFibGVkQVdURXZlbnRzOwogCi0gICAgLyoqIFRoZSBjb21wb25lbnQgbGlzdGVuZXJzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBjb21wb25lbnQgbGlzdGVuZXJzLgorICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgQVdUTGlzdGVuZXJMaXN0PENvbXBvbmVudExpc3RlbmVyPiBjb21wb25lbnRMaXN0ZW5lcnMgPSBuZXcgQVdUTGlzdGVuZXJMaXN0PENvbXBvbmVudExpc3RlbmVyPigKICAgICAgICAgICAgIHRoaXMpOwogCi0gICAgLyoqIFRoZSBmb2N1cyBsaXN0ZW5lcnMuICovCisgICAgLyoqCisgICAgICogVGhlIGZvY3VzIGxpc3RlbmVycy4KKyAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIEFXVExpc3RlbmVyTGlzdDxGb2N1c0xpc3RlbmVyPiBmb2N1c0xpc3RlbmVycyA9IG5ldyBBV1RMaXN0ZW5lckxpc3Q8Rm9jdXNMaXN0ZW5lcj4oCiAgICAgICAgICAgICB0aGlzKTsKIAotICAgIC8qKiBUaGUgaGllcmFyY2h5IGxpc3RlbmVycy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgaGllcmFyY2h5IGxpc3RlbmVycy4KKyAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIEFXVExpc3RlbmVyTGlzdDxIaWVyYXJjaHlMaXN0ZW5lcj4gaGllcmFyY2h5TGlzdGVuZXJzID0gbmV3IEFXVExpc3RlbmVyTGlzdDxIaWVyYXJjaHlMaXN0ZW5lcj4oCiAgICAgICAgICAgICB0aGlzKTsKIAotICAgIC8qKiBUaGUgaGllcmFyY2h5IGJvdW5kcyBsaXN0ZW5lcnMuICovCisgICAgLyoqCisgICAgICogVGhlIGhpZXJhcmNoeSBib3VuZHMgbGlzdGVuZXJzLgorICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgQVdUTGlzdGVuZXJMaXN0PEhpZXJhcmNoeUJvdW5kc0xpc3RlbmVyPiBoaWVyYXJjaHlCb3VuZHNMaXN0ZW5lcnMgPSBuZXcgQVdUTGlzdGVuZXJMaXN0PEhpZXJhcmNoeUJvdW5kc0xpc3RlbmVyPigKICAgICAgICAgICAgIHRoaXMpOwogCi0gICAgLyoqIFRoZSBrZXkgbGlzdGVuZXJzLiAqLwotICAgIHByaXZhdGUgZmluYWwgQVdUTGlzdGVuZXJMaXN0PEtleUxpc3RlbmVyPiBrZXlMaXN0ZW5lcnMgPSBuZXcgQVdUTGlzdGVuZXJMaXN0PEtleUxpc3RlbmVyPigKLSAgICAgICAgICAgIHRoaXMpOworICAgIC8qKgorICAgICAqIFRoZSBrZXkgbGlzdGVuZXJzLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQVdUTGlzdGVuZXJMaXN0PEtleUxpc3RlbmVyPiBrZXlMaXN0ZW5lcnMgPSBuZXcgQVdUTGlzdGVuZXJMaXN0PEtleUxpc3RlbmVyPih0aGlzKTsKIAotICAgIC8qKiBUaGUgbW91c2UgbGlzdGVuZXJzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBtb3VzZSBsaXN0ZW5lcnMuCisgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBBV1RMaXN0ZW5lckxpc3Q8TW91c2VMaXN0ZW5lcj4gbW91c2VMaXN0ZW5lcnMgPSBuZXcgQVdUTGlzdGVuZXJMaXN0PE1vdXNlTGlzdGVuZXI+KAogICAgICAgICAgICAgdGhpcyk7CiAKLSAgICAvKiogVGhlIG1vdXNlIG1vdGlvbiBsaXN0ZW5lcnMuICovCisgICAgLyoqCisgICAgICogVGhlIG1vdXNlIG1vdGlvbiBsaXN0ZW5lcnMuCisgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBBV1RMaXN0ZW5lckxpc3Q8TW91c2VNb3Rpb25MaXN0ZW5lcj4gbW91c2VNb3Rpb25MaXN0ZW5lcnMgPSBuZXcgQVdUTGlzdGVuZXJMaXN0PE1vdXNlTW90aW9uTGlzdGVuZXI+KAogICAgICAgICAgICAgdGhpcyk7CiAKLSAgICAvKiogVGhlIG1vdXNlIHdoZWVsIGxpc3RlbmVycy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgbW91c2Ugd2hlZWwgbGlzdGVuZXJzLgorICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgQVdUTGlzdGVuZXJMaXN0PE1vdXNlV2hlZWxMaXN0ZW5lcj4gbW91c2VXaGVlbExpc3RlbmVycyA9IG5ldyBBV1RMaXN0ZW5lckxpc3Q8TW91c2VXaGVlbExpc3RlbmVyPigKICAgICAgICAgICAgIHRoaXMpOwogCi0gICAgLyoqIFRoZSBpbnB1dCBtZXRob2QgbGlzdGVuZXJzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBpbnB1dCBtZXRob2QgbGlzdGVuZXJzLgorICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgQVdUTGlzdGVuZXJMaXN0PElucHV0TWV0aG9kTGlzdGVuZXI+IGlucHV0TWV0aG9kTGlzdGVuZXJzID0gbmV3IEFXVExpc3RlbmVyTGlzdDxJbnB1dE1ldGhvZExpc3RlbmVyPigKICAgICAgICAgICAgIHRoaXMpOwogCi0gICAgLyoqIFRoZSB4LiAqLworICAgIC8qKgorICAgICAqIFRoZSB4LgorICAgICAqLwogICAgIGludCB4OwogCi0gICAgLyoqIFRoZSB5LiAqLworICAgIC8qKgorICAgICAqIFRoZSB5LgorICAgICAqLwogICAgIGludCB5OwogCi0gICAgLyoqIFRoZSB3LiAqLworICAgIC8qKgorICAgICAqIFRoZSB3LgorICAgICAqLwogICAgIGludCB3OwogCi0gICAgLyoqIFRoZSBoLiAqLworICAgIC8qKgorICAgICAqIFRoZSBoLgorICAgICAqLwogICAgIGludCBoOwogCi0gICAgLyoqIFRoZSBtYXhpbXVtIHNpemUuICovCisgICAgLyoqCisgICAgICogVGhlIG1heGltdW0gc2l6ZS4KKyAgICAgKi8KICAgICBwcml2YXRlIERpbWVuc2lvbiBtYXhpbXVtU2l6ZTsKIAotICAgIC8qKiBUaGUgbWluaW11bSBzaXplLiAqLworICAgIC8qKgorICAgICAqIFRoZSBtaW5pbXVtIHNpemUuCisgICAgICovCiAgICAgcHJpdmF0ZSBEaW1lbnNpb24gbWluaW11bVNpemU7CiAKLSAgICAvKiogVGhlIHByZWZlcnJlZCBzaXplLiAqLworICAgIC8qKgorICAgICAqIFRoZSBwcmVmZXJyZWQgc2l6ZS4KKyAgICAgKi8KICAgICBwcml2YXRlIERpbWVuc2lvbiBwcmVmZXJyZWRTaXplOwogCi0gICAgLyoqIFRoZSBib3VuZHMgbWFzayBwYXJhbS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgYm91bmRzIG1hc2sgcGFyYW0uCisgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgYm91bmRzTWFza1BhcmFtOwogCi0gICAgLyoqIFRoZSBpZ25vcmUgcmVwYWludC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgaWdub3JlIHJlcGFpbnQuCisgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIGlnbm9yZVJlcGFpbnQ7CiAKLSAgICAvKiogVGhlIGVuYWJsZWQuICovCisgICAgLyoqCisgICAgICogVGhlIGVuYWJsZWQuCisgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIGVuYWJsZWQgPSB0cnVlOwogCi0gICAgLyoqIFRoZSBpbnB1dCBtZXRob2RzIGVuYWJsZWQuICovCisgICAgLyoqCisgICAgICogVGhlIGlucHV0IG1ldGhvZHMgZW5hYmxlZC4KKyAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gaW5wdXRNZXRob2RzRW5hYmxlZCA9IHRydWU7CiAKLSAgICAvKiogVGhlIGRpc3BhdGNoIHRvIGltLiAqLworICAgIC8qKgorICAgICAqIFRoZSBkaXNwYXRjaCB0byBpbS4KKyAgICAgKi8KICAgICB0cmFuc2llbnQgYm9vbGVhbiBkaXNwYXRjaFRvSU0gPSB0cnVlOwogCi0gICAgLyoqIFRoZSBmb2N1c2FibGUuICovCisgICAgLyoqCisgICAgICogVGhlIGZvY3VzYWJsZS4KKyAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gZm9jdXNhYmxlID0gdHJ1ZTsgLy8gQnkgZGVmYXVsdCwgYWxsIENvbXBvbmVudHMgcmV0dXJuCiAKICAgICAvLyB0cnVlIGZyb20gaXNGb2N1c2FibGUoKSBtZXRob2QKLSAgICAvKiogVGhlIHZpc2libGUuICovCisgICAgLyoqCisgICAgICogVGhlIHZpc2libGUuCisgICAgICovCiAgICAgYm9vbGVhbiB2aXNpYmxlID0gdHJ1ZTsKIAotICAgIC8qKiBUaGUgY2FsbGVkIHNldCBmb2N1c2FibGUuICovCisgICAgLyoqCisgICAgICogVGhlIGNhbGxlZCBzZXQgZm9jdXNhYmxlLgorICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBjYWxsZWRTZXRGb2N1c2FibGU7CiAKLSAgICAvKiogVGhlIG92ZXJyaWRlbiBpcyBmb2N1c2FibGUuICovCisgICAgLyoqCisgICAgICogVGhlIG92ZXJyaWRkZW4gaXMgZm9jdXNhYmxlLgorICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBvdmVycmlkZW5Jc0ZvY3VzYWJsZSA9IHRydWU7CiAKLSAgICAvKiogVGhlIGZvY3VzIHRyYXZlcnNhbCBrZXlzIGVuYWJsZWQuICovCisgICAgLyoqCisgICAgICogVGhlIGZvY3VzIHRyYXZlcnNhbCBrZXlzIGVuYWJsZWQuCisgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIGZvY3VzVHJhdmVyc2FsS2V5c0VuYWJsZWQgPSB0cnVlOwogCi0gICAgLyoqIFBvc3NpYmxlIGtleXMgYXJlOiBGT1JXQVJEX1RSQVZFUlNBTF9LRVlTLCBCQUNLV0FSRF9UUkFWRVJTQUxfS0VZUywgVVBfQ1lDTEVfVFJBVkVSU0FMX0tFWVMuICovCisgICAgLyoqCisgICAgICogUG9zc2libGUga2V5cyBhcmU6IEZPUldBUkRfVFJBVkVSU0FMX0tFWVMsIEJBQ0tXQVJEX1RSQVZFUlNBTF9LRVlTLAorICAgICAqIFVQX0NZQ0xFX1RSQVZFUlNBTF9LRVlTLgorICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgTWFwPEludGVnZXIsIFNldDw/IGV4dGVuZHMgQVdUS2V5U3Ryb2tlPj4gdHJhdmVyc2FsS2V5cyA9IG5ldyBIYXNoTWFwPEludGVnZXIsIFNldDw/IGV4dGVuZHMgQVdUS2V5U3Ryb2tlPj4oKTsKIAotICAgIC8qKiBUaGUgdHJhdmVyc2FsIGkgZHMuICovCisgICAgLyoqCisgICAgICogVGhlIHRyYXZlcnNhbCBpIGRzLgorICAgICAqLwogICAgIGludFtdIHRyYXZlcnNhbElEczsKIAotICAgIC8qKiBUaGUgbG9jYWxlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBsb2NhbGUuCisgICAgICovCiAgICAgcHJpdmF0ZSBMb2NhbGUgbG9jYWxlOwogCi0gICAgLyoqIFRoZSBvcmllbnRhdGlvbi4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgb3JpZW50YXRpb24uCisgICAgICovCiAgICAgcHJpdmF0ZSBDb21wb25lbnRPcmllbnRhdGlvbiBvcmllbnRhdGlvbjsKIAotICAgIC8qKiBUaGUgcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQuICovCisgICAgLyoqCisgICAgICogVGhlIHByb3BlcnR5IGNoYW5nZSBzdXBwb3J0LgorICAgICAqLwogICAgIHByaXZhdGUgUHJvcGVydHlDaGFuZ2VTdXBwb3J0IHByb3BlcnR5Q2hhbmdlU3VwcG9ydDsKIAotICAgIC8vPz8/QVdUOiBwcml2YXRlIEFycmF5TGlzdDxQb3B1cE1lbnU+IHBvcHVwczsKKyAgICAvLyA/Pz9BV1Q6IHByaXZhdGUgQXJyYXlMaXN0PFBvcHVwTWVudT4gcG9wdXBzOwogCi0gICAgLyoqIFRoZSBjb2FsZXNjZXIuICovCisgICAgLyoqCisgICAgICogVGhlIGNvYWxlc2Nlci4KKyAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gY29hbGVzY2VyOwogCi0gICAgLyoqIFRoZSBldmVudHMgdGFibGUuICovCisgICAgLyoqCisgICAgICogVGhlIGV2ZW50cyB0YWJsZS4KKyAgICAgKi8KICAgICBwcml2YXRlIEhhc2h0YWJsZTxJbnRlZ2VyLCBMaW5rZWRMaXN0PEFXVEV2ZW50Pj4gZXZlbnRzVGFibGU7CiAKLSAgICAvKiogQ2FzaGVkIHJlZmVyZW5jZSB1c2VkIGR1cmluZyBFdmVudFF1ZXVlLnBvc3RFdmVudCgpICovCisgICAgLyoqCisgICAgICogQ2FzaGVkIHJlZmVyZW5jZSB1c2VkIGR1cmluZyBFdmVudFF1ZXVlLnBvc3RFdmVudCgpCisgICAgICovCiAgICAgcHJpdmF0ZSBMaW5rZWRMaXN0PEFXVEV2ZW50PiBldmVudHNMaXN0OwogCi0gICAgLyoqIFRoZSBoaWVyYXJjaHkgY2hhbmdpbmcgY291bnRlci4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgaGllcmFyY2h5IGNoYW5naW5nIGNvdW50ZXIuCisgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgaGllcmFyY2h5Q2hhbmdpbmdDb3VudGVyOwogCi0gICAgLyoqIFRoZSB3YXMgc2hvd2luZy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgd2FzIHNob3dpbmcuCisgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIHdhc1Nob3dpbmc7CiAKLSAgICAvKiogVGhlIHdhcyBkaXNwbGF5YWJsZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgd2FzIGRpc3BsYXlhYmxlLgorICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiB3YXNEaXNwbGF5YWJsZTsKIAotICAgIC8qKiBUaGUgY3Vyc29yLiAqLworICAgIC8qKgorICAgICAqIFRoZSBjdXJzb3IuCisgICAgICovCiAgICAgQ3Vyc29yIGN1cnNvcjsKIAotICAgIC8vPz8/QVdUOiBEcm9wVGFyZ2V0IGRyb3BUYXJnZXQ7CisgICAgLy8gPz8/QVdUOiBEcm9wVGFyZ2V0IGRyb3BUYXJnZXQ7CiAKLSAgICAvKiogVGhlIG1vdXNlIGV4aXRlZCBleHBlY3RlZC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgbW91c2UgZXhpdGVkIGV4cGVjdGVkLgorICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBtb3VzZUV4aXRlZEV4cGVjdGVkOwogCi0gICAgLyoqIFRoZSByZXBhaW50IHJlZ2lvbi4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgcmVwYWludCByZWdpb24uCisgICAgICovCiAgICAgdHJhbnNpZW50IE11bHRpUmVjdEFyZWEgcmVwYWludFJlZ2lvbjsKIAotICAgIC8vPz8/QVdUOiB0cmFuc2llbnQgUmVkcmF3TWFuYWdlciByZWRyYXdNYW5hZ2VyOwotICAgIC8qKiBUaGUgcmVkcmF3IG1hbmFnZXIuICovCisgICAgLy8gPz8/QVdUOiB0cmFuc2llbnQgUmVkcmF3TWFuYWdlciByZWRyYXdNYW5hZ2VyOworICAgIC8qKgorICAgICAqIFRoZSByZWRyYXcgbWFuYWdlci4KKyAgICAgKi8KICAgICB0cmFuc2llbnQgT2JqZWN0IHJlZHJhd01hbmFnZXI7CiAKLSAgICAvKiogVGhlIHZhbGlkLiAqLworICAgIC8qKgorICAgICAqIFRoZSB2YWxpZC4KKyAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gdmFsaWQ7CiAKLSAgICAvKiogVGhlIHVwZGF0ZWQgaW1hZ2VzLiAqLworICAgIC8qKgorICAgICAqIFRoZSB1cGRhdGVkIGltYWdlcy4KKyAgICAgKi8KICAgICBwcml2YXRlIEhhc2hNYXA8SW1hZ2UsIEltYWdlUGFyYW1ldGVycz4gdXBkYXRlZEltYWdlczsKIAogICAgIC8qKgpAQCAtMTI0NCw3ICsxMDg1LDkgQEAKICAgICBwcml2YXRlIGNsYXNzIENvbXBvbmVudExvY2sgewogICAgIH0KIAotICAgIC8qKiBUaGUgY29tcG9uZW50IGxvY2suICovCisgICAgLyoqCisgICAgICogVGhlIGNvbXBvbmVudCBsb2NrLgorICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgdHJhbnNpZW50IE9iamVjdCBjb21wb25lbnRMb2NrID0gbmV3IENvbXBvbmVudExvY2soKTsKICAgICBzdGF0aWMgewogICAgICAgICBQcml2aWxlZ2VkQWN0aW9uPFN0cmluZ1tdPiBhY3Rpb24gPSBuZXcgUHJpdmlsZWdlZEFjdGlvbjxTdHJpbmdbXT4oKSB7CkBAIC0xMjc2LDE3ICsxMTE5LDE2IEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBvcmllbnRhdGlvbiA9IENvbXBvbmVudE9yaWVudGF0aW9uLlVOS05PV047CiAgICAgICAgICAgICByZWRyYXdNYW5hZ2VyID0gbnVsbDsKLSAgICAgICAgICAgIC8vPz8/QVdUCisgICAgICAgICAgICAvLyA/Pz9BV1QKICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICB0cmF2ZXJzYWxJRHMgPSB0aGlzIGluc3RhbmNlb2YgQ29udGFpbmVyID8gS2V5Ym9hcmRGb2N1c01hbmFnZXIuY29udFRyYXZlcnNhbElEcwotICAgICAgICAgICAgICAgICAgICA6IEtleWJvYXJkRm9jdXNNYW5hZ2VyLmNvbXBUcmF2ZXJzYWxJRHM7Ci0gICAgICAgICAgICBmb3IgKGludCBlbGVtZW50IDogdHJhdmVyc2FsSURzKSB7Ci0gICAgICAgICAgICAgICAgdHJhdmVyc2FsS2V5cy5wdXQobmV3IEludGVnZXIoZWxlbWVudCksIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYmVoYXZpb3VyID0gY3JlYXRlQmVoYXZpb3IoKTsKLSAgICAgICAgICAgICovCisgICAgICAgICAgICAgKiB0cmF2ZXJzYWxJRHMgPSB0aGlzIGluc3RhbmNlb2YgQ29udGFpbmVyID8KKyAgICAgICAgICAgICAqIEtleWJvYXJkRm9jdXNNYW5hZ2VyLmNvbnRUcmF2ZXJzYWxJRHMgOgorICAgICAgICAgICAgICogS2V5Ym9hcmRGb2N1c01hbmFnZXIuY29tcFRyYXZlcnNhbElEczsgZm9yIChpbnQgZWxlbWVudCA6CisgICAgICAgICAgICAgKiB0cmF2ZXJzYWxJRHMpIHsgdHJhdmVyc2FsS2V5cy5wdXQobmV3IEludGVnZXIoZWxlbWVudCksIG51bGwpOyB9CisgICAgICAgICAgICAgKiBiZWhhdmlvdXIgPSBjcmVhdGVCZWhhdmlvcigpOworICAgICAgICAgICAgICovCiAgICAgICAgICAgICBiZWhhdmlvdXIgPSBudWxsOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGRlcml2ZUNvYWxlc2NlckZsYWcoKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7CkBAIC0xMzA3LDggKzExNDksOCBAQAogICAgICAgICAgICAgICAgIGZvciAoQ2xhc3M8Pz4gYyA9IHRoaXNDbGFzczsgYyAhPSBDb21wb25lbnQuY2xhc3M7IGMgPSBjLmdldFN1cGVyY2xhc3MoKSkgewogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgY29hbGVzY2VNZXRob2QgPSBjLmdldERlY2xhcmVkTWV0aG9kKCJjb2FsZXNjZUV2ZW50cyIsIG5ldyBDbGFzc1tdIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCJqYXZhLmF3dC5BV1RFdmVudCIpLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoImphdmEuYXd0LkFXVEV2ZW50IikgfSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCJqYXZhLmF3dC5BV1RFdmVudCIpLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSgiamF2YS5hd3QuQVdURXZlbnQiKX0pOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKGNvYWxlc2NlTWV0aG9kICE9IG51bGwpIHsKQEAgLTEzMzIsNyArMTE3NCw4IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgQ29tcG9uZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuZXcgbmFtZSBvZiB0aGUgQ29tcG9uZW50LgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmV3IG5hbWUgb2YgdGhlIENvbXBvbmVudC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CiAgICAgICAgIFN0cmluZyBvbGROYW1lOwpAQCAtMTM2NywxNSArMTIxMCwxNSBAQAogICAgIC8qKgogICAgICAqIEF1dG8gbmFtZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcKKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcuCiAgICAgICovCiAgICAgU3RyaW5nIGF1dG9OYW1lKCkgewogICAgICAgICBTdHJpbmcgbmFtZSA9IGdldENsYXNzKCkuZ2V0TmFtZSgpOwogICAgICAgICBpZiAobmFtZS5pbmRleE9mKCIkIikgIT0gLTEpIHsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KLSAgICAgICAgLy8/Pz9BV1QKLSAgICAgICAgLy9pbnQgbnVtYmVyID0gdG9vbGtpdC5hdXRvTnVtYmVyLm5leHRDb21wb25lbnQrKzsKKyAgICAgICAgLy8gPz8/QVdUCisgICAgICAgIC8vIGludCBudW1iZXIgPSB0b29sa2l0LmF1dG9OdW1iZXIubmV4dENvbXBvbmVudCsrOwogICAgICAgICBpbnQgbnVtYmVyID0gMDsKICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKG5hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpICsgSW50ZWdlci50b1N0cmluZyhudW1iZXIpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIHJldHVybiBuYW1lOwpAQCAtMTM5MCwxMCArMTIzMyw4IEBACiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgLyoKICAgICAgICAgICogVGhlIGZvcm1hdCBpcyBiYXNlZCBvbiAxLjUgcmVsZWFzZSBiZWhhdmlvciB3aGljaCBjYW4gYmUgcmV2ZWFsZWQgYnkKLSAgICAgICAgICogdGhlIGZvbGxvd2luZyBjb2RlOgotICAgICAgICAgKiAKLSAgICAgICAgICogQ29tcG9uZW50IGMgPSBuZXcgQ29tcG9uZW50KCl7fTsgYy5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgICogU3lzdGVtLm91dC5wcmludGxuKGMpOworICAgICAgICAgKiB0aGUgZm9sbG93aW5nIGNvZGU6IENvbXBvbmVudCBjID0gbmV3IENvbXBvbmVudCgpe307CisgICAgICAgICAqIGMuc2V0VmlzaWJsZShmYWxzZSk7IFN5c3RlbS5vdXQucHJpbnRsbihjKTsKICAgICAgICAgICovCiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwogICAgICAgICB0cnkgewpAQCAtMTQwMywzMiArMTI0NCwyMSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIHB1YmxpYyB2b2lkIGFkZChQb3B1cE1lbnUgcG9wdXApIHsKLSAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAocG9wdXAuZ2V0UGFyZW50KCkgPT0gdGhpcykgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwb3B1cHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBvcHVwcyA9IG5ldyBBcnJheUxpc3Q8UG9wdXBNZW51PigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcG9wdXAuc2V0UGFyZW50KHRoaXMpOwotICAgICAgICAgICAgcG9wdXBzLmFkZChwb3B1cCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICB9Ci0gICAgfQotICAgICovCisgICAgICogcHVibGljIHZvaWQgYWRkKFBvcHVwTWVudSBwb3B1cCkgeyB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsgaWYKKyAgICAgKiAocG9wdXAuZ2V0UGFyZW50KCkgPT0gdGhpcykgeyByZXR1cm47IH0gaWYgKHBvcHVwcyA9PSBudWxsKSB7IHBvcHVwcyA9CisgICAgICogbmV3IEFycmF5TGlzdDxQb3B1cE1lbnU+KCk7IH0gcG9wdXAuc2V0UGFyZW50KHRoaXMpOyBwb3B1cHMuYWRkKHBvcHVwKTsgfQorICAgICAqIGZpbmFsbHkgeyB0b29sa2l0LnVubG9ja0FXVCgpOyB9IH0KKyAgICAgKi8KIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSwgaWYgdGhlIGNvbXBvbmVudCBjb250YWlucyB0aGUgc3BlY2lmaWVkIFBvaW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBwIHRoZSBQb2ludC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBjb21wb25lbnQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBQb2ludCwKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIHAKKyAgICAgKiAgICAgICAgICAgIHRoZSBQb2ludC4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBjb21wb25lbnQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBQb2ludCwgZmFsc2UKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhQb2ludCBwKSB7CiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwpAQCAtMTQ0MCwxNCArMTI3MCwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSwgaWYgdGhlIGNvbXBvbmVudCBjb250YWlucyB0aGUgcG9pbnQgd2l0aCAKLSAgICAgKiB0aGUgc3BlY2lmaWVkIGNvb3JkaW5hdGVzLgorICAgICAqIFJldHVybnMgdHJ1ZSwgaWYgdGhlIGNvbXBvbmVudCBjb250YWlucyB0aGUgcG9pbnQgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogY29vcmRpbmF0ZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIHggY29vcmRpbmF0ZS4KLSAgICAgKiBAcGFyYW0geSB0aGUgeSBjb29yZGluYXRlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIGNvbXBvbmVudCBjb250YWlucyB0aGUgcG9pbnQgd2l0aCAKLSAgICAgKiB0aGUgc3BlY2lmaWVkIGNvb3JkaW5hdGVzLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgY29tcG9uZW50IGNvbnRhaW5zIHRoZSBwb2ludCB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgIGNvb3JkaW5hdGVzLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IHgsIGludCB5KSB7CiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwpAQCAtMTQ2Miw3ICsxMjkzLDYgQEAKICAgICAgKiBEZXByZWNhdGVkOiByZXBsYWNlZCBieSByZXBsYWNlZCBieSBnZXRTaXplKCkgbWV0aG9kLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGRpbWVuc2lvbi4KLSAgICAgKiAKICAgICAgKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSBnZXRTaXplKCkgbWV0aG9kLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCkBAIC0xNDc0LDkwICsxMzA0LDYzIEBACiAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwogICAgICAgICB9CiAgICAgfQotICAgIAotICAgIC8vPz8/QVdUCisKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIHB1YmxpYyBDb250YWluZXIgZ2V0UGFyZW50KCkgewotICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQ7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICB9Ci0gICAgfQotICAgICovCi0gICAgCisgICAgICogcHVibGljIENvbnRhaW5lciBnZXRQYXJlbnQoKSB7IHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeyByZXR1cm4gcGFyZW50OyB9CisgICAgICogZmluYWxseSB7IHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfQorICAgICAqLworCiAgICAgLyoqCiAgICAgICogTGlzdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gb3V0IHRoZSBvdXQKLSAgICAgKiBAcGFyYW0gaW5kZW50IHRoZSBpbmRlbnQKLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3V0CisgICAgICogICAgICAgICAgICB0aGUgb3V0LgorICAgICAqIEBwYXJhbSBpbmRlbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRlbnQKICAgICAgKiBAcmV0dXJuIHRoZSBuZWFyZXN0IGhlYXZ5d2VpZ2h0IGFuY2VzdG9yIGluIGhpZXJhcmNoeSBvcgotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBmb3VuZAorICAgICAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGZvdW5kLgogICAgICAqLwotICAgIC8vPz8/QVdUCisgICAgLy8gPz8/QVdUCiAgICAgLyoKLSAgICBDb21wb25lbnQgZ2V0SFdBbmNlc3RvcigpIHsKLSAgICAgICAgcmV0dXJuIChwYXJlbnQgIT0gbnVsbCA/IHBhcmVudC5nZXRIV1N1cmZhY2UoKSA6IG51bGwpOwotICAgIH0KLSAgICAqLwotICAgIAorICAgICAqIENvbXBvbmVudCBnZXRIV0FuY2VzdG9yKCkgeyByZXR1cm4gKHBhcmVudCAhPSBudWxsID8KKyAgICAgKiBwYXJlbnQuZ2V0SFdTdXJmYWNlKCkgOiBudWxsKTsgfQorICAgICAqLworCiAgICAgLyoqCiAgICAgICogQHJldHVybiBoZWF2eXdlaWdodCBjb21wb25lbnQgdGhhdCBpcyBlcXVhbCB0byBvciBpcyBhIG5lYXJlc3QKICAgICAgKiAgICAgICAgIGhlYXZ5d2VpZ2h0IGNvbnRhaW5lciBvZiB0aGUgY3VycmVudCBjb21wb25lbnQsIG9yCi0gICAgICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgZm91bmQKKyAgICAgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBmb3VuZC4KICAgICAgKi8KLSAgICAvLz8/P0FXVAorICAgIC8vID8/P0FXVAogICAgIC8qCi0gICAgQ29tcG9uZW50IGdldEhXU3VyZmFjZSgpIHsKLSAgICAgICAgQ29tcG9uZW50IHBhcmVudDsKLSAgICAgICAgZm9yIChwYXJlbnQgPSB0aGlzOyAocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQuaXNMaWdodHdlaWdodCgpKTsgcGFyZW50ID0gcGFyZW50Ci0gICAgICAgICAgICAgICAgLmdldFBhcmVudCgpKSB7Ci0gICAgICAgICAgICA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBhcmVudDsKLSAgICB9CisgICAgICogQ29tcG9uZW50IGdldEhXU3VyZmFjZSgpIHsgQ29tcG9uZW50IHBhcmVudDsgZm9yIChwYXJlbnQgPSB0aGlzOyAocGFyZW50CisgICAgICogIT0gbnVsbCkgJiYgKHBhcmVudC5pc0xpZ2h0d2VpZ2h0KCkpOyBwYXJlbnQgPSBwYXJlbnQgLmdldFBhcmVudCgpKSB7IDsgfQorICAgICAqIHJldHVybiBwYXJlbnQ7IH0gV2luZG93IGdldFdpbmRvd0FuY2VzdG9yKCkgeyBDb21wb25lbnQgcGFyOyBmb3IgKHBhciA9CisgICAgICogdGhpczsgcGFyICE9IG51bGwgJiYgIShwYXIgaW5zdGFuY2VvZiBXaW5kb3cpOyBwYXIgPSBwYXIuZ2V0UGFyZW50KCkpIHsgOworICAgICAqIH0gcmV0dXJuIChXaW5kb3cpIHBhcjsgfQorICAgICAqLwogCi0gICAgV2luZG93IGdldFdpbmRvd0FuY2VzdG9yKCkgewotICAgICAgICBDb21wb25lbnQgcGFyOwotICAgICAgICBmb3IgKHBhciA9IHRoaXM7IHBhciAhPSBudWxsICYmICEocGFyIGluc3RhbmNlb2YgV2luZG93KTsgcGFyID0gcGFyLmdldFBhcmVudCgpKSB7Ci0gICAgICAgICAgICA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChXaW5kb3cpIHBhcjsKLSAgICB9Ci0gICAgKi8KLSAgICAKLSAgICAvKiogVG8gYmUgY2FsbGVkIGJ5IGNvbnRhaW5lciAqLwotICAgIC8vPz8/QVdUCi0gICAgLyoKLSAgICB2b2lkIHNldFBhcmVudChDb250YWluZXIgcGFyZW50KSB7Ci0gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgICBzZXRSZWRyYXdNYW5hZ2VyKCk7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRSZWRyYXdNYW5hZ2VyKCkgewotICAgICAgICByZWRyYXdNYW5hZ2VyID0gZ2V0UmVkcmF3TWFuYWdlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZShNZW51Q29tcG9uZW50IG1lbnUpIHsKLSAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobWVudS5nZXRQYXJlbnQoKSA9PSB0aGlzKSB7Ci0gICAgICAgICAgICAgICAgbWVudS5zZXRQYXJlbnQobnVsbCk7Ci0gICAgICAgICAgICAgICAgcG9wdXBzLnJlbW92ZShtZW51KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKi8KICAgICAvKioKLSAgICAgKiBQcmludHMgYSBsaXN0IG9mIHRoaXMgY29tcG9uZW50IHdpdGggdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgCi0gICAgICogbGVhZGluZyB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgdG8gdGhlIHNwZWNpZmllZCBQcmludFN0cmVhbS4KKyAgICAgKiBUbyBiZSBjYWxsZWQgYnkgY29udGFpbmVyCisgICAgICovCisgICAgLy8gPz8/QVdUCisgICAgLyoKKyAgICAgKiB2b2lkIHNldFBhcmVudChDb250YWluZXIgcGFyZW50KSB7IHRoaXMucGFyZW50ID0gcGFyZW50OworICAgICAqIHNldFJlZHJhd01hbmFnZXIoKTsgfSB2b2lkIHNldFJlZHJhd01hbmFnZXIoKSB7IHJlZHJhd01hbmFnZXIgPQorICAgICAqIGdldFJlZHJhd01hbmFnZXIoKTsgfSBwdWJsaWMgdm9pZCByZW1vdmUoTWVudUNvbXBvbmVudCBtZW51KSB7CisgICAgICogdG9vbGtpdC5sb2NrQVdUKCk7IHRyeSB7IGlmIChtZW51LmdldFBhcmVudCgpID09IHRoaXMpIHsKKyAgICAgKiBtZW51LnNldFBhcmVudChudWxsKTsgcG9wdXBzLnJlbW92ZShtZW51KTsgfSB9IGZpbmFsbHkgeworICAgICAqIHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfQorICAgICAqLworICAgIC8qKgorICAgICAqIFByaW50cyBhIGxpc3Qgb2YgdGhpcyBjb21wb25lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBsZWFkaW5nCisgICAgICogd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHRvIHRoZSBzcGVjaWZpZWQgUHJpbnRTdHJlYW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIG91dCB0aGUgb3V0cHV0IFByaW50U3RyZWFtIG9iamVjdC4KLSAgICAgKiBAcGFyYW0gaW5kZW50IGhvdyBtYW55IGxlYWRpbmcgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHRvIHByZXBlbmQKKyAgICAgKiBAcGFyYW0gb3V0CisgICAgICogICAgICAgICAgICB0aGUgb3V0cHV0IFByaW50U3RyZWFtIG9iamVjdC4KKyAgICAgKiBAcGFyYW0gaW5kZW50CisgICAgICogICAgICAgICAgICBob3cgbWFueSBsZWFkaW5nIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB0byBwcmVwZW5kLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGxpc3QoUHJpbnRTdHJlYW0gb3V0LCBpbnQgaW5kZW50KSB7CiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwpAQCAtMTU3MSw3ICsxMzc0LDggQEAKICAgICAvKioKICAgICAgKiBQcmludHMgYSBsaXN0IG9mIHRoaXMgY29tcG9uZW50IHRvIHRoZSBzcGVjaWZpZWQgUHJpbnRXcml0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIG91dCB0aGUgb3V0cHV0IFByaW50V3JpdGVyIG9iamVjdC4KKyAgICAgKiBAcGFyYW0gb3V0CisgICAgICogICAgICAgICAgICB0aGUgb3V0cHV0IFByaW50V3JpdGVyIG9iamVjdC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBsaXN0KFByaW50V3JpdGVyIG91dCkgewogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKQEAgLTE1ODMsMTEgKzEzODcsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcmludHMgYSBsaXN0IG9mIHRoaXMgY29tcG9uZW50IHdpdGggdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgCi0gICAgICogbGVhZGluZyB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgdG8gdGhlIHNwZWNpZmllZCBQcmludFdyaXRlci4KKyAgICAgKiBQcmludHMgYSBsaXN0IG9mIHRoaXMgY29tcG9uZW50IHdpdGggdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbGVhZGluZworICAgICAqIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB0byB0aGUgc3BlY2lmaWVkIFByaW50V3JpdGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBvdXQgdGhlIG91dHB1dCBQcmludFdyaXRlciBvYmplY3QuCi0gICAgICogQHBhcmFtIGluZGVudCBob3cgbWFueSBsZWFkaW5nIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB0byBwcmVwZW5kCisgICAgICogQHBhcmFtIG91dAorICAgICAqICAgICAgICAgICAgdGhlIG91dHB1dCBQcmludFdyaXRlciBvYmplY3QuCisgICAgICogQHBhcmFtIGluZGVudAorICAgICAqICAgICAgICAgICAgaG93IG1hbnkgbGVhZGluZyB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgdG8gcHJlcGVuZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBsaXN0KFByaW50V3JpdGVyIG91dCwgaW50IGluZGVudCkgewogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKQEAgLTE1OTksMTMgKzE0MDUsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGEgc3RyaW5nIGNvbXBvc2VkIG9mIHRoZSBkZXNpcmVkIG51bWJlciBvZiAKLSAgICAgKiB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuCisgICAgICogR2V0cyBhIHN0cmluZyBjb21wb3NlZCBvZiB0aGUgZGVzaXJlZCBudW1iZXIgb2Ygd2hpdGVzcGFjZSBjaGFyYWN0ZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbmRlbnQgdGhlIGxlbmd0aCBvZiB0aGUgU3RyaW5nIHRvIHJldHVybgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyBjb21wb3NlZCBvZiB0aGUgZGVzaXJlZCBudW1iZXIgb2YgCi0gICAgICogd2hpdGVzcGFjZSBjaGFyYWN0ZXJzCisgICAgICogQHBhcmFtIGluZGVudAorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgU3RyaW5nIHRvIHJldHVybi4KKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgY29tcG9zZWQgb2YgdGhlIGRlc2lyZWQgbnVtYmVyIG9mIHdoaXRlc3BhY2UKKyAgICAgKiAgICAgICAgIGNoYXJhY3RlcnMuCiAgICAgICovCiAgICAgU3RyaW5nIGdldEluZGVudFN0cihpbnQgaW5kZW50KSB7CiAgICAgICAgIGNoYXJbXSBpbmQgPSBuZXcgY2hhcltpbmRlbnRdOwpAQCAtMTYxNiw5ICsxNDIxLDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJpbnRzIGEgbGlzdCBvZiB0aGlzIGNvbXBvbmVudCB0byB0aGUgc3BlY2lmaWVkIFByaW50U3RyZWFtCisgICAgICogUHJpbnRzIGEgbGlzdCBvZiB0aGlzIGNvbXBvbmVudCB0byB0aGUgc3BlY2lmaWVkIFByaW50U3RyZWFtLgogICAgICAqIAotICAgICAqIEBwYXJhbSBvdXQgdGhlIG91dHB1dCBQcmludFN0cmVhbSBvYmplY3QuCisgICAgICogQHBhcmFtIG91dAorICAgICAqICAgICAgICAgICAgdGhlIG91dHB1dCBQcmludFN0cmVhbSBvYmplY3QuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgbGlzdChQcmludFN0cmVhbSBvdXQpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC0xNjMxLDggKzE0MzcsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByaW50cyBhIGxpc3Qgb2YgdGhpcyBjb21wb25lbnQgdG8gdGhlIHN0YW5kYXJkIHN5c3RlbSAKLSAgICAgKiBvdXRwdXQgc3RyZWFtLgorICAgICAqIFByaW50cyBhIGxpc3Qgb2YgdGhpcyBjb21wb25lbnQgdG8gdGhlIHN0YW5kYXJkIHN5c3RlbSBvdXRwdXQgc3RyZWFtLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGxpc3QoKSB7CiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwpAQCAtMTY0NCw5ICsxNDQ5LDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJpbnRzIHRoaXMgY29tcG9uZW50LiAKKyAgICAgKiBQcmludHMgdGhpcyBjb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGcgdGhlIEdyYXBoaWNzIHRvIGJlIHVzZWQgZm9yIHBhaW50aW5nLiAKKyAgICAgKiBAcGFyYW0gZworICAgICAqICAgICAgICAgICAgdGhlIEdyYXBoaWNzIHRvIGJlIHVzZWQgZm9yIHBhaW50aW5nLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHByaW50KEdyYXBoaWNzIGcpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC0xNjYwLDcgKzE0NjYsOCBAQAogICAgIC8qKgogICAgICAqIFByaW50cyB0aGUgY29tcG9uZW50IGFuZCBhbGwgb2YgaXRzIHN1YmNvbXBvbmVudHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGcgdGhlIEdyYXBoaWNzIHRvIGJlIHVzZWQgZm9yIHBhaW50aW5nLgorICAgICAqIEBwYXJhbSBnCisgICAgICogICAgICAgICAgICB0aGUgR3JhcGhpY3MgdG8gYmUgdXNlZCBmb3IgcGFpbnRpbmcuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcHJpbnRBbGwoR3JhcGhpY3MgZykgewogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKQEAgLTE2NzIsMTEgKzE0NzksMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzaXplIG9mIHRoZSBDb21wb25lbnQgc3BlY2lmaWVkIGJ5IHdpZHRoIGFuZCBoZWlnaHQKLSAgICAgKiBwYXJhbWV0ZXJzLgorICAgICAqIFNldHMgdGhlIHNpemUgb2YgdGhlIENvbXBvbmVudCBzcGVjaWZpZWQgYnkgd2lkdGggYW5kIGhlaWdodCBwYXJhbWV0ZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIENvbXBvbmVudC4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIENvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgQ29tcG9uZW50LgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIENvbXBvbmVudC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKQEAgLTE2OTAsNyArMTQ5OCw4IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgc2l6ZSBvZiB0aGUgQ29tcG9uZW50IHNwZWNpZmllZCBieSBEaW1lbnNpb24gb2JqZWN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBkIHRoZSBuZXcgc2l6ZSBvZiB0aGUgQ29tcG9uZW50LgorICAgICAqIEBwYXJhbSBkCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHNpemUgb2YgdGhlIENvbXBvbmVudC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTaXplKERpbWVuc2lvbiBkKSB7CiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwpAQCAtMTcwNCw5ICsxNTEzLDEwIEBACiAgICAgLyoqCiAgICAgICogRGVwcmVjYXRlZDogcmVwbGFjZWQgYnkgc2V0U2l6ZShpbnQsIGludCkgbWV0aG9kLgogICAgICAqIAotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGguCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0LgotICAgICAqIAorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQuCiAgICAgICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgc2V0U2l6ZShpbnQsIGludCkgbWV0aG9kLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCkBAIC0xNzIzLDggKzE1MzMsOCBAQAogICAgIC8qKgogICAgICAqIERlcHJlY2F0ZWQ6IHJlcGxhY2VkIGJ5IHNldFNpemUoaW50LCBpbnQpIG1ldGhvZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIHNpemUuCiAgICAgICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgc2V0U2l6ZShpbnQsIGludCkgbWV0aG9kLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCkBAIC0xNzQwLDggKzE1NTAsNyBAQAogICAgIC8qKgogICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGNvbXBvbmVudCBpcyBjb21wbGV0ZWx5IG9wYXF1ZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgY29tcG9uZW50IGlzIGNvbXBsZXRlbHkgb3BhcXVlLCAKLSAgICAgKiAgZmFsc2UgYnkgZGVmYXVsdC4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgY29tcG9uZW50IGlzIGNvbXBsZXRlbHkgb3BhcXVlLCBmYWxzZSBieSBkZWZhdWx0LgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzT3BhcXVlKCkgewogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKQEAgLTE3NjUsNyArMTU3NCw3IEBACiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwogICAgICAgICB9Ci0gICAgICAgIC8vPz8/QVdUOiBmaXJlQWNjZXNzaWJsZVN0YXRlQ2hhbmdlKEFjY2Vzc2libGVTdGF0ZS5FTkFCTEVELCBmYWxzZSk7CisgICAgICAgIC8vID8/P0FXVDogZmlyZUFjY2Vzc2libGVTdGF0ZUNoYW5nZShBY2Nlc3NpYmxlU3RhdGUuRU5BQkxFRCwgZmFsc2UpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTc4MSwxNSArMTU5MCwxNSBAQAogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKICAgICAgICAgfQotICAgICAgICAvLz8/P0FXVDogZmlyZUFjY2Vzc2libGVTdGF0ZUNoYW5nZShBY2Nlc3NpYmxlU3RhdGUuRU5BQkxFRCwgdHJ1ZSk7CisgICAgICAgIC8vID8/P0FXVDogZmlyZUFjY2Vzc2libGVTdGF0ZUNoYW5nZShBY2Nlc3NpYmxlU3RhdGUuRU5BQkxFRCwgdHJ1ZSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogRW5hYmxlcyBvciBkaXNhYmxlIHRoaXMgY29tcG9uZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBiIHRoZSBib29sZWFuIHBhcmFtZXRlci4KLSAgICAgKiAKLSAgICAgKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSBzZXRFbmFibGVkKGJvb2xlYW4pIG1ldGhvZC4gCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBib29sZWFuIHBhcmFtZXRlci4KKyAgICAgKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSBzZXRFbmFibGVkKGJvb2xlYW4pIG1ldGhvZC4KICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIGVuYWJsZShib29sZWFuIGIpIHsKQEAgLTE4MDksOSArMTYxOCw5IEBACiAgICAgICogU3RvcmVzIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGNvbXBvbmVudCB0byB0aGUgc3BlY2lmaWVkIFBvaW50IG9iamVjdDsKICAgICAgKiByZXR1cm5zIHRoZSBwb2ludCBvZiB0aGUgY29tcG9uZW50J3MgdG9wLWxlZnQgY29ybmVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBydiB0aGUgUG9pbnQgb2JqZWN0IHdoZXJlIHRoZSBjb21wb25lbnQncyB0b3AtbGVmdCBjb3JuZXIKLSAgICAgKiBwb3NpdGlvbiB3aWxsIGJlIHN0b3JlZC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gcnYKKyAgICAgKiAgICAgICAgICAgIHRoZSBQb2ludCBvYmplY3Qgd2hlcmUgdGhlIGNvbXBvbmVudCdzIHRvcC1sZWZ0IGNvcm5lcgorICAgICAqICAgICAgICAgICAgcG9zaXRpb24gd2lsbCBiZSBzdG9yZWQuCiAgICAgICogQHJldHVybiB0aGUgUG9pbnQgd2hpY2ggc3BlY2lmaWVzIHRoZSBjb21wb25lbnQncyB0b3AtbGVmdCBjb3JuZXIuCiAgICAgICovCiAgICAgcHVibGljIFBvaW50IGdldExvY2F0aW9uKFBvaW50IHJ2KSB7CkBAIC0xODI4LDggKzE2MzcsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGxvY2F0aW9uIG9mIHRoaXMgY29tcG9uZW50IG9uIHRoZSBmb3JtOwotICAgICAqIHJldHVybnMgdGhlIHBvaW50IG9mIHRoZSBjb21wb25lbnQncyB0b3AtbGVmdCBjb3JuZXIuCisgICAgICogR2V0cyB0aGUgbG9jYXRpb24gb2YgdGhpcyBjb21wb25lbnQgb24gdGhlIGZvcm07IHJldHVybnMgdGhlIHBvaW50IG9mIHRoZQorICAgICAqIGNvbXBvbmVudCdzIHRvcC1sZWZ0IGNvcm5lci4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBQb2ludCB3aGljaCBzcGVjaWZpZXMgdGhlIGNvbXBvbmVudCdzIHRvcC1sZWZ0IGNvcm5lci4KICAgICAgKi8KQEAgLTE4NTcsMTIgKzE2NjYsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTdG9yZXMgdGhlIHNpemUgb2YgdGhpcyBDb21wb25lbnQgdG8gdGhlIHNwZWNpZmllZCBEaW1lbnNpb24gCi0gICAgICogb2JqZWN0LgorICAgICAqIFN0b3JlcyB0aGUgc2l6ZSBvZiB0aGlzIENvbXBvbmVudCB0byB0aGUgc3BlY2lmaWVkIERpbWVuc2lvbiBvYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIHJ2IHRoZSBEaW1lbnNpb24gb2JqZWN0IHdoZXJlIHRoZSBzaXplIG9mIHRoZSBDb21wb25lbnQgCi0gICAgICogd2lsbCBiZSBzdG9yZWQuCi0gICAgICogCisgICAgICogQHBhcmFtIHJ2CisgICAgICogICAgICAgICAgICB0aGUgRGltZW5zaW9uIG9iamVjdCB3aGVyZSB0aGUgc2l6ZSBvZiB0aGUgQ29tcG9uZW50IHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgIHN0b3JlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBEaW1lbnNpb24gb2YgdGhpcyBDb21wb25lbnQuCiAgICAgICovCiAgICAgcHVibGljIERpbWVuc2lvbiBnZXRTaXplKERpbWVuc2lvbiBydikgewpAQCAtMTg3OSw5ICsxNjg3LDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhpcyBDb21wb25lbnQgaXMgdmFsaWQuIEEgY29tcG9uZW50IGlzIHZhbGlkIAotICAgICAqIGlmIGl0IGlzIGNvcnJlY3RseSBzaXplZCBhbmQgcG9zaXRpb25lZCB3aXRoaW4gaXRzIHBhcmVudCBjb250YWluZXIKLSAgICAgKiAgYW5kIGFsbCBpdHMgY2hpbGRyZW4gYXJlIGFsc28gdmFsaWQuIAorICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGlzIENvbXBvbmVudCBpcyB2YWxpZC4gQSBjb21wb25lbnQgaXMgdmFsaWQgaWYgaXQKKyAgICAgKiBpcyBjb3JyZWN0bHkgc2l6ZWQgYW5kIHBvc2l0aW9uZWQgd2l0aGluIGl0cyBwYXJlbnQgY29udGFpbmVyIGFuZCBhbGwgaXRzCisgICAgICogY2hpbGRyZW4gYXJlIGFsc28gdmFsaWQuCiAgICAgICogCiAgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgQ29tcG9uZW50IGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCkBAIC0xODk4LDcgKzE3MDYsNiBAQAogICAgICAqIERlcHJlY2F0ZWQ6IHJlcGxhY2VkIGJ5IGdldENvbXBvbmVudEF0KGludCwgaW50KSBtZXRob2QuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgUG9pbnQuCi0gICAgICogCiAgICAgICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgZ2V0Q29tcG9uZW50QXQoaW50LCBpbnQpIG1ldGhvZC4KICAgICAgKi8KICAgICBARGVwcmVjYXRlZApAQCAtMTkxMiw3ICsxNzE5LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25uZWN0cyB0aGlzIENvbXBvbmVudCB0byBhIG5hdGl2ZSBzY3JlZW4gcmVzb3VyY2UgYW5kIG1ha2VzIGl0IAorICAgICAqIENvbm5lY3RzIHRoaXMgQ29tcG9uZW50IHRvIGEgbmF0aXZlIHNjcmVlbiByZXNvdXJjZSBhbmQgbWFrZXMgaXQKICAgICAgKiBkaXNwbGF5YWJsZS4gVGhpcyBtZXRob2Qgbm90IGJlIGNhbGxlZCBkaXJlY3RseSBieSB1c2VyIGFwcGxpY2F0aW9ucy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGROb3RpZnkoKSB7CkBAIC0xOTIwLDExICsxNzI3LDExIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBwcmVwYXJlNEhpZXJhcmNoeUNoYW5nZSgpOwogICAgICAgICAgICAgYmVoYXZpb3VyLmFkZE5vdGlmeSgpOwotICAgICAgICAgICAgLy8/Pz9BV1QKLS8vICAgICAgICAgICAgZmluaXNoSGllcmFyY2h5Q2hhbmdlKHRoaXMsIHBhcmVudCwgMCk7Ci0vLyAgICAgICAgICAgIGlmIChkcm9wVGFyZ2V0ICE9IG51bGwpIHsKLS8vICAgICAgICAgICAgICAgIGRyb3BUYXJnZXQuYWRkTm90aWZ5KHBlZXIpOwotLy8gICAgICAgICAgICB9CisgICAgICAgICAgICAvLyA/Pz9BV1QKKyAgICAgICAgICAgIC8vIGZpbmlzaEhpZXJhcmNoeUNoYW5nZSh0aGlzLCBwYXJlbnQsIDApOworICAgICAgICAgICAgLy8gaWYgKGRyb3BUYXJnZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gZHJvcFRhcmdldC5hZGROb3RpZnkocGVlcik7CisgICAgICAgICAgICAvLyB9CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwogICAgICAgICB9CkBAIC0xOTMzLDQ1ICsxNzQwLDMyIEBACiAgICAgLyoqCiAgICAgICogTWFwIHRvIGRpc3BsYXkuCiAgICAgICogCi0gICAgICogQHBhcmFtIGIgdGhlIGIKKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIGIuCiAgICAgICovCiAgICAgdm9pZCBtYXBUb0Rpc3BsYXkoYm9vbGVhbiBiKSB7Ci0gICAgICAgIC8vPz8/QVdUCisgICAgICAgIC8vID8/P0FXVAogICAgICAgICAvKgotICAgICAgICBpZiAoYiAmJiAhaXNEaXNwbGF5YWJsZSgpKSB7Ci0gICAgICAgICAgICBpZiAoKHRoaXMgaW5zdGFuY2VvZiBXaW5kb3cpIHx8ICgocGFyZW50ICE9IG51bGwpICYmIHBhcmVudC5pc0Rpc3BsYXlhYmxlKCkpKSB7Ci0gICAgICAgICAgICAgICAgYWRkTm90aWZ5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoIWIgJiYgaXNEaXNwbGF5YWJsZSgpKSB7Ci0gICAgICAgICAgICByZW1vdmVOb3RpZnkoKTsKLSAgICAgICAgfQotICAgICAgICAqLworICAgICAgICAgKiBpZiAoYiAmJiAhaXNEaXNwbGF5YWJsZSgpKSB7IGlmICgodGhpcyBpbnN0YW5jZW9mIFdpbmRvdykgfHwgKChwYXJlbnQKKyAgICAgICAgICogIT0gbnVsbCkgJiYgcGFyZW50LmlzRGlzcGxheWFibGUoKSkpIHsgYWRkTm90aWZ5KCk7IH0gfSBlbHNlIGlmICghYgorICAgICAgICAgKiAmJiBpc0Rpc3BsYXlhYmxlKCkpIHsgcmVtb3ZlTm90aWZ5KCk7IH0KKyAgICAgICAgICovCiAgICAgfQogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgdG9vbGtpdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFjY2Vzc2libGUgY29udGV4dCBzcGVjaWZpYyBmb3IgcGFydGljdWxhciBjb21wb25lbnQKKyAgICAgKiBAcmV0dXJuIGFjY2Vzc2libGUgY29udGV4dCBzcGVjaWZpYyBmb3IgcGFydGljdWxhciBjb21wb25lbnQuCiAgICAgICovCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIEFjY2Vzc2libGVDb250ZXh0IGNyZWF0ZUFjY2Vzc2libGVDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9CisgICAgICogQWNjZXNzaWJsZUNvbnRleHQgY3JlYXRlQWNjZXNzaWJsZUNvbnRleHQoKSB7IHJldHVybiBudWxsOyB9IHB1YmxpYworICAgICAqIEFjY2Vzc2libGVDb250ZXh0IGdldEFjY2Vzc2libGVDb250ZXh0KCkgeyB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsgaWYKKyAgICAgKiAoYWNjZXNzaWJsZUNvbnRleHQgPT0gbnVsbCkgeyBhY2Nlc3NpYmxlQ29udGV4dCA9CisgICAgICogY3JlYXRlQWNjZXNzaWJsZUNvbnRleHQoKTsgfSByZXR1cm4gYWNjZXNzaWJsZUNvbnRleHQ7IH0gZmluYWxseSB7CisgICAgICogdG9vbGtpdC51bmxvY2tBV1QoKTsgfSB9CisgICAgICovCiAKLSAgICBwdWJsaWMgQWNjZXNzaWJsZUNvbnRleHQgZ2V0QWNjZXNzaWJsZUNvbnRleHQoKSB7Ci0gICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGFjY2Vzc2libGVDb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhY2Nlc3NpYmxlQ29udGV4dCA9IGNyZWF0ZUFjY2Vzc2libGVDb250ZXh0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYWNjZXNzaWJsZUNvbnRleHQ7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICB9Ci0gICAgfQotICAgICovCi0gCiAgICAgLyoqCiAgICAgICogR2V0cyBUb29sa2l0IGZvciB0aGUgY3VycmVudCBDb21wb25lbnQuCiAgICAgICogCkBAIC0xOTgyLDggKzE3NzYsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhpcyBjb21wb25lbnQncyBsb2NraW5nIG9iamVjdCBmb3IgQVdUIGNvbXBvbmVudCB0cmVlIAotICAgICAqIGFuZCBsYXlvdXQgb3BlcmF0aW9ucy4KKyAgICAgKiBHZXRzIHRoaXMgY29tcG9uZW50J3MgbG9ja2luZyBvYmplY3QgZm9yIEFXVCBjb21wb25lbnQgdHJlZSBhbmQgbGF5b3V0CisgICAgICogb3BlcmF0aW9ucy4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSB0cmVlIGxvY2tpbmcgb2JqZWN0LgogICAgICAqLwpAQCAtMTk5MiwxMiArMTc4NiwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBwYXJhbSBldnQgdGhlIEV2ZW50LgotICAgICAqIEBwYXJhbSB3aGF0IHRoZSBldmVudCdzIGtleS4KKyAgICAgKiBIYW5kbGVzIHRoZSBldmVudC4gVXNlIEFjdGlvbkxpc3RlbmVyIGluc3RlYWQgb2YgdGhpcy4KICAgICAgKiAKKyAgICAgKiBAcGFyYW0gZXZ0CisgICAgICogICAgICAgICAgICB0aGUgRXZlbnQuCisgICAgICogQHBhcmFtIHdoYXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBldmVudCdzIGtleS4KICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHN1Y2Nlc3NmdWwuCi0gICAgICogCi0gICAgICogQGRlcHJlY2F0ZWQgVXNlIEFjdGlvbkxpc3RlbmVyIGNsYXNzIGZvciByZWdpc3RlcmluZyBldmVudCBsaXN0ZW5lci4gICAKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2UgQWN0aW9uTGlzdGVuZXIgY2xhc3MgZm9yIHJlZ2lzdGVyaW5nIGV2ZW50IGxpc3RlbmVyLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGJvb2xlYW4gYWN0aW9uKEV2ZW50IGV2dCwgT2JqZWN0IHdoYXQpIHsKQEAgLTIwMDYsMTEgKzE4MDIsMTAgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQKKyAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSBjaGFuZ2Ugc3VwcG9ydC4KICAgICAgKi8KICAgICBwcml2YXRlIFByb3BlcnR5Q2hhbmdlU3VwcG9ydCBnZXRQcm9wZXJ0eUNoYW5nZVN1cHBvcnQoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAoY29tcG9uZW50TG9jaykgewpAQCAtMjAyMCwzNiArMTgxNSwyOSBAQAogICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5Q2hhbmdlU3VwcG9ydDsKICAgICAgICAgfQogICAgIH0KLSAgICAKLSAgICAvLz8/P0FXVAorCisgICAgLy8gPz8/QVdUCiAgICAgLyoKLSAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgZ2V0UHJvcGVydHlDaGFuZ2VTdXBwb3J0KCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIGdldFByb3BlcnR5Q2hhbmdlU3VwcG9ydCgpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCBsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwbHlDb21wb25lbnRPcmllbnRhdGlvbihDb21wb25lbnRPcmllbnRhdGlvbiBvcmllbnRhdGlvbikgewotICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNldENvbXBvbmVudE9yaWVudGF0aW9uKG9yaWVudGF0aW9uKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKi8KKyAgICAgKiBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgKiBnZXRQcm9wZXJ0eUNoYW5nZVN1cHBvcnQoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsgfSBwdWJsaWMKKyAgICAgKiB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwKKyAgICAgKiBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICogZ2V0UHJvcGVydHlDaGFuZ2VTdXBwb3J0KCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsCisgICAgICogbGlzdGVuZXIpOyB9IHB1YmxpYyB2b2lkIGFwcGx5Q29tcG9uZW50T3JpZW50YXRpb24oQ29tcG9uZW50T3JpZW50YXRpb24KKyAgICAgKiBvcmllbnRhdGlvbikgeyB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsKKyAgICAgKiBzZXRDb21wb25lbnRPcmllbnRhdGlvbihvcmllbnRhdGlvbik7IH0gZmluYWxseSB7IHRvb2xraXQudW5sb2NrQVdUKCk7IH0KKyAgICAgKiB9CisgICAgICovCiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNldCBvZiBmb2N1cyB0cmF2ZXJzYWwga2V5cyBmb3IgdGhlIGdpdmVuIGZvY3VzIAotICAgICAqIHRyYXZlcnNhbCBvcGVyYXRpb24gaGFzIGJlZW4gZXhwbGljaXRseSBkZWZpbmVkIGZvciB0aGlzIENvbXBvbmVudC4gCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZXQgb2YgZm9jdXMgdHJhdmVyc2FsIGtleXMgZm9yIHRoZSBnaXZlbiBmb2N1cworICAgICAqIHRyYXZlcnNhbCBvcGVyYXRpb24gaGFzIGJlZW4gZXhwbGljaXRseSBkZWZpbmVkIGZvciB0aGlzIENvbXBvbmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWQgdGhlIElEIG9mIHRyYXZlcnNhbCBrZXkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc2V0IG9mIGZvY3VzIHRyYXZlcnNhbCBrZXlzIGZvciB0aGUgZ2l2ZW4gZm9jdXMgCi0gICAgICogdHJhdmVyc2FsIG9wZXJhdGlvbiBoYXMgYmVlbiBleHBsaWNpdGx5IGRlZmluZWQgZm9yIHRoaXMgQ29tcG9uZW50LAotICAgICAqIGZhbHNlIG90aGVyd2lzZS4gCisgICAgICogQHBhcmFtIGlkCisgICAgICogICAgICAgICAgICB0aGUgSUQgb2YgdHJhdmVyc2FsIGtleS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzZXQgb2YgZm9jdXMgdHJhdmVyc2FsIGtleXMgZm9yIHRoZSBnaXZlbiBmb2N1cy4KKyAgICAgKiAgICAgICAgIHRyYXZlcnNhbCBvcGVyYXRpb24gaGFzIGJlZW4gZXhwbGljaXRseSBkZWZpbmVkIGZvciB0aGlzCisgICAgICogICAgICAgICBDb21wb25lbnQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBhcmVGb2N1c1RyYXZlcnNhbEtleXNTZXQoaW50IGlkKSB7CiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwpAQCAtMjA2OSw3ICsxODU3LDYgQEAKICAgICAgKiBHZXRzIHRoZSBib3VuZHMgb2YgdGhlIENvbXBvbmVudC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSByZWN0YW5nbGUgYm91bmRzIG9mIHRoZSBDb21wb25lbnQuCi0gICAgICogCiAgICAgICogQGRlcHJlY2F0ZWQgVXNlIGdldEJvdW5kcygpIG1ldGhvb2QuCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKQEAgLTIwODMsMTYgKzE4NzAsMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb25zdHJ1Y3Rpb24gc3RhdHVzIG9mIGEgc3BlY2lmaWVkIGltYWdlCi0gICAgICogd2l0aCB0aGUgc3BlY2lmaWVkIHdpZHRoIGFuZCBoZWlnaHQgdGhhdCBpcyBiZWluZyBjcmVhdGVkLgorICAgICAqIFJldHVybnMgdGhlIGNvbnN0cnVjdGlvbiBzdGF0dXMgb2YgYSBzcGVjaWZpZWQgaW1hZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogd2lkdGggYW5kIGhlaWdodCB0aGF0IGlzIGJlaW5nIGNyZWF0ZWQuCiAgICAgICogCi0gICAgICogCi0gICAgICogQHBhcmFtIGltYWdlIHRoZSBpbWFnZSB0byBiZSBjaGVja2VkLgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2Ygc2NhbGVkIGltYWdlIHdoaWNoIHN0YXR1cyBpcyBiZWluZyBjaGVja2VkLCBvciAtMS4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2Ygc2NhbGVkIGltYWdlIHdoaWNoIHN0YXR1cyBpcyBiZWluZyBjaGVja2VkLCBvciAtMS4KLSAgICAgKiBAcGFyYW0gb2JzZXJ2ZXIgdGhlIEltYWdlT2JzZXJ2ZXIgb2JqZWN0IHRvIGJlIG5vdGlmaWVkIHdoaWxlIAotICAgICAqIHRoZSBpbWFnZSBpcyBiZWluZyBwcmVwYXJlZC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW1hZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSB0byBiZSBjaGVja2VkLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHNjYWxlZCBpbWFnZSB3aGljaCBzdGF0dXMgaXMgYmVpbmcgY2hlY2tlZCwgb3IKKyAgICAgKiAgICAgICAgICAgIC0xLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2Ygc2NhbGVkIGltYWdlIHdoaWNoIHN0YXR1cyBpcyBiZWluZyBjaGVja2VkLCBvcgorICAgICAqICAgICAgICAgICAgLTEuCisgICAgICogQHBhcmFtIG9ic2VydmVyCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VPYnNlcnZlciBvYmplY3QgdG8gYmUgbm90aWZpZWQgd2hpbGUgdGhlIGltYWdlIGlzCisgICAgICogICAgICAgICAgICBiZWluZyBwcmVwYXJlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBJbWFnZU9ic2VydmVyIGZsYWdzIG9mIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBpbWFnZSBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgY2hlY2tJbWFnZShJbWFnZSBpbWFnZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBJbWFnZU9ic2VydmVyIG9ic2VydmVyKSB7CkBAIC0yMTA1LDEzICsxODk2LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29uc3RydWN0aW9uIHN0YXR1cyBvZiBhIHNwZWNpZmllZCBpbWFnZSB0aGF0IGlzIGJlaW5nIGNyZWF0ZWQuCisgICAgICogUmV0dXJucyB0aGUgY29uc3RydWN0aW9uIHN0YXR1cyBvZiBhIHNwZWNpZmllZCBpbWFnZSB0aGF0IGlzIGJlaW5nCisgICAgICogY3JlYXRlZC4KICAgICAgKiAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1hZ2UgdGhlIGltYWdlIHRvIGJlIGNoZWNrZWQuCi0gICAgICogQHBhcmFtIG9ic2VydmVyIHRoZSBJbWFnZU9ic2VydmVyIG9iamVjdCB0byBiZSBub3RpZmllZCB3aGlsZSAKLSAgICAgKiB0aGUgaW1hZ2UgaXMgYmVpbmcgcHJlcGFyZWQuCi0gICAgICogCisgICAgICogQHBhcmFtIGltYWdlCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgdG8gYmUgY2hlY2tlZC4KKyAgICAgKiBAcGFyYW0gb2JzZXJ2ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZU9ic2VydmVyIG9iamVjdCB0byBiZSBub3RpZmllZCB3aGlsZSB0aGUgaW1hZ2UgaXMKKyAgICAgKiAgICAgICAgICAgIGJlaW5nIHByZXBhcmVkLgogICAgICAqIEByZXR1cm4gdGhlIEltYWdlT2JzZXJ2ZXIgZmxhZ3Mgb2YgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGltYWdlIGRhdGEuCiAgICAgICovCiAgICAgcHVibGljIGludCBjaGVja0ltYWdlKEltYWdlIGltYWdlLCBJbWFnZU9ic2VydmVyIG9ic2VydmVyKSB7CkBAIC0yMTI2LDEwICsxOTE4LDExIEBACiAgICAgLyoqCiAgICAgICogQ29hbGVzY2VzIHRoZSBleGlzdGVkIGV2ZW50IHdpdGggbmV3IGV2ZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBleGlzdGluZ0V2ZW50IHRoZSBleGlzdGluZyBldmVudCBpbiB0aGUgRXZlbnRRdWV1ZS4KLSAgICAgKiBAcGFyYW0gbmV3RXZlbnQgdGhlIG5ldyBldmVudCB0byBiZSBwb3N0ZWQgdG8gdGhlIEV2ZW50UXVldWUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29hbGVzY2VkIEFXVEV2ZW50LCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIGNvYWxlc2NpbmcgZG9uZS4gCisgICAgICogQHBhcmFtIGV4aXN0aW5nRXZlbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBleGlzdGluZyBldmVudCBpbiB0aGUgRXZlbnRRdWV1ZS4KKyAgICAgKiBAcGFyYW0gbmV3RXZlbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgZXZlbnQgdG8gYmUgcG9zdGVkIHRvIHRoZSBFdmVudFF1ZXVlLgorICAgICAqIEByZXR1cm4gdGhlIGNvYWxlc2NlZCBBV1RFdmVudCwgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBjb2FsZXNjaW5nIGRvbmUuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIEFXVEV2ZW50IGNvYWxlc2NlRXZlbnRzKEFXVEV2ZW50IGV4aXN0aW5nRXZlbnQsIEFXVEV2ZW50IG5ld0V2ZW50KSB7CiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwpAQCAtMjE0Nyw3ICsxOTQwLDcgQEAKICAgICAvKioKICAgICAgKiBDaGVja3MgaWYgdGhpcyBDb21wb25lbnQgaXMgYSBjb2FsZXNjZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiBpcyBjb2FsZXNjZXIKKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIGNvYWxlc2Nlci4KICAgICAgKi8KICAgICBib29sZWFuIGlzQ29hbGVzY2VyKCkgewogICAgICAgICByZXR1cm4gY29hbGVzY2VyOwpAQCAtMjE1Niw5ICsxOTQ5LDkgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSByZWxhdGl2ZSBldmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWQgdGhlIGlkCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVsYXRpdmUgZXZlbnQKKyAgICAgKiBAcGFyYW0gaWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpZC4KKyAgICAgKiBAcmV0dXJuIHRoZSByZWxhdGl2ZSBldmVudC4KICAgICAgKi8KICAgICBBV1RFdmVudCBnZXRSZWxhdGl2ZUV2ZW50KGludCBpZCkgewogICAgICAgICBJbnRlZ2VyIGlkV3JhcHBlciA9IG5ldyBJbnRlZ2VyKGlkKTsKQEAgLTIxNzcsNyArMTk3MCw4IEBACiAgICAgLyoqCiAgICAgICogQWRkcyB0aGUgbmV3IGV2ZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBldmVudCB0aGUgZXZlbnQKKyAgICAgKiBAcGFyYW0gZXZlbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBldmVudC4KICAgICAgKi8KICAgICB2b2lkIGFkZE5ld0V2ZW50KEFXVEV2ZW50IGV2ZW50KSB7CiAgICAgICAgIGV2ZW50c0xpc3QuYWRkTGFzdChldmVudCk7CkBAIC0yMTkzLDcgKzE5ODcsOCBAQAogICAgIC8qKgogICAgICAqIFJlbW92ZXMgdGhlIG5leHQgZXZlbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGlkIHRoZSBpZAorICAgICAqIEBwYXJhbSBpZAorICAgICAqICAgICAgICAgICAgdGhlIGlkLgogICAgICAqLwogICAgIHZvaWQgcmVtb3ZlTmV4dEV2ZW50KGludCBpZCkgewogICAgICAgICBldmVudHNUYWJsZS5nZXQobmV3IEludGVnZXIoaWQpKS5yZW1vdmVGaXJzdCgpOwpAQCAtMjIwMiw4ICsxOTk3LDggQEAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIHRoZSBpbWFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgSW1hZ2VQcm9kdWNlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvZHVjZXIgdGhlIEltYWdlUHJvZHVjZXIgdG8gYmUgdXNlZCBmb3IgaW1hZ2UgY3JlYXRpb24uCi0gICAgICogCisgICAgICogQHBhcmFtIHByb2R1Y2VyCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VQcm9kdWNlciB0byBiZSB1c2VkIGZvciBpbWFnZSBjcmVhdGlvbi4KICAgICAgKiBAcmV0dXJuIHRoZSBpbWFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgSW1hZ2VQcm9kdWNlci4KICAgICAgKi8KICAgICBwdWJsaWMgSW1hZ2UgY3JlYXRlSW1hZ2UoSW1hZ2VQcm9kdWNlciBwcm9kdWNlcikgewpAQCAtMjIxOCwxMSArMjAxMywxMyBAQAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgYW4gb2ZmLXNjcmVlbiBkcmF3YWJsZSBpbWFnZSB0byBiZSB1c2VkIGZvciBkb3VibGUgYnVmZmVyaW5nLgogICAgICAqIAotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIGltYWdlLgotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgb2ZmLXNjcmVlbiBkcmF3YWJsZSBpbWFnZSBvciBudWxsIGlmIHRoZSBjb21wb25lbnQgaXMgbm90IAotICAgICAqIGRpc3BsYXlhYmxlIG9yIEdyYXBoaWNzRW52aXJvbm1lbnQuaXNIZWFkbGVzcygpIG1ldGhvZCByZXR1cm5zIHRydWUuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGltYWdlLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlLgorICAgICAqIEByZXR1cm4gdGhlIG9mZi1zY3JlZW4gZHJhd2FibGUgaW1hZ2Ugb3IgbnVsbCBpZiB0aGUgY29tcG9uZW50IGlzIG5vdAorICAgICAqICAgICAgICAgZGlzcGxheWFibGUgb3IgR3JhcGhpY3NFbnZpcm9ubWVudC5pc0hlYWRsZXNzKCkgbWV0aG9kIHJldHVybnMKKyAgICAgKiAgICAgICAgIHRydWUuCiAgICAgICovCiAgICAgcHVibGljIEltYWdlIGNyZWF0ZUltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKQEAgLTIyNDUsMTcgKzIwNDIsMTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIG9mZi1zY3JlZW4gZHJhd2FibGUgaW1hZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHdpZHRoLAotICAgICAqIGhlaWdodCBhbmQgSW1hZ2VDYXBhYmlsaXRpZXMuCisgICAgICogQ3JlYXRlcyBhbiBvZmYtc2NyZWVuIGRyYXdhYmxlIGltYWdlIHdpdGggdGhlIHNwZWNpZmllZCB3aWR0aCwgaGVpZ2h0IGFuZAorICAgICAqIEltYWdlQ2FwYWJpbGl0aWVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGgKLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQKLSAgICAgKiBAcGFyYW0gY2FwcyB0aGUgSW1hZ2VDYXBhYmlsaXRpZXMuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdm9sYXRpbGUgaW1hZ2UKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEFXVEV4Y2VwdGlvbiBpZiBhbiBpbWFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgY2FwYWJpbGl0aWVzIAotICAgICAqIGNhbm5vdCBiZSBjcmVhdGVkLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQuCisgICAgICogQHBhcmFtIGNhcHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZUNhcGFiaWxpdGllcy4KKyAgICAgKiBAcmV0dXJuIHRoZSB2b2xhdGlsZSBpbWFnZS4KKyAgICAgKiBAdGhyb3dzIEFXVEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGltYWdlIHdpdGggdGhlIHNwZWNpZmllZCBjYXBhYmlsaXRpZXMgY2Fubm90IGJlCisgICAgICogICAgICAgICAgICAgY3JlYXRlZC4KICAgICAgKi8KICAgICBwdWJsaWMgVm9sYXRpbGVJbWFnZSBjcmVhdGVWb2xhdGlsZUltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCwgSW1hZ2VDYXBhYmlsaXRpZXMgY2FwcykKICAgICAgICAgICAgIHRocm93cyBBV1RFeGNlcHRpb24gewpAQCAtMjI3NywxNiArMjA3NiwxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB2b2xhdGlsZSBvZmYtc2NyZWVuIGRyYXdhYmxlIGltYWdlIHdoaWNoIGlzIHVzZWQgCi0gICAgICogZm9yIGRvdWJsZSBidWZmZXJpbmcuCisgICAgICogQ3JlYXRlcyBhIHZvbGF0aWxlIG9mZi1zY3JlZW4gZHJhd2FibGUgaW1hZ2Ugd2hpY2ggaXMgdXNlZCBmb3IgZG91YmxlCisgICAgICogYnVmZmVyaW5nLgogICAgICAqIAotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgaW1hZ2UuCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIGltYWdlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZvbGF0aWxlIGltYWdlIGEgdm9sYXRpbGUgb2ZmLXNjcmVlbiBkcmF3YWJsZSBpbWFnZSAKLSAgICAgKiB3aGljaCBpcyB1c2VkIGZvciBkb3VibGUgYnVmZmVyaW5nIG9yIG51bGwgaWYgdGhlIGNvbXBvbmVudCAKLSAgICAgKiBpcyBub3QgZGlzcGxheWFibGUsIG9yIEdyYXBoaWNzRW52aXJvbm1lbnQuaXNIZWFkbGVzcygpIG1ldGhvZAotICAgICAqIHJldHVybnMgdHJ1ZS4KKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiBpbWFnZS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIGltYWdlLgorICAgICAqIEByZXR1cm4gdGhlIHZvbGF0aWxlIGltYWdlIGEgdm9sYXRpbGUgb2ZmLXNjcmVlbiBkcmF3YWJsZSBpbWFnZSB3aGljaCBpcworICAgICAqICAgICAgICAgdXNlZCBmb3IgZG91YmxlIGJ1ZmZlcmluZyBvciBudWxsIGlmIHRoZSBjb21wb25lbnQgaXMgbm90CisgICAgICogICAgICAgICBkaXNwbGF5YWJsZSwgb3IgR3JhcGhpY3NFbnZpcm9ubWVudC5pc0hlYWRsZXNzKCkgbWV0aG9kIHJldHVybnMKKyAgICAgKiAgICAgICAgIHRydWUuCiAgICAgICovCiAgICAgcHVibGljIFZvbGF0aWxlSW1hZ2UgY3JlYXRlVm9sYXRpbGVJbWFnZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC0yMzExLDkgKzIxMTEsMTIgQEAKICAgICAgKiB3aXRoIHRoZSBjb21wb25lbnQncyBiYWNrZ3JvdW5kIGNvbG9yIHRvIHByZXBhcmUgaXQgZm9yIGRvdWJsZS1idWZmZXJlZAogICAgICAqIHBhaW50aW5nLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZSB0aGUgaW1hZ2UKLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0CisgICAgICogQHBhcmFtIGltYWdlCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGguCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodC4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgZmlsbEltYWdlQmFja2dyb3VuZChJbWFnZSBpbWFnZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CiAgICAgICAgIEdyYXBoaWNzIGdyID0gaW1hZ2UuZ2V0R3JhcGhpY3MoKTsKQEAgLTIzMjUsOCArMjEyOCw4IEBACiAgICAgLyoqCiAgICAgICogRGVsaXZlcnMgZXZlbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGV2dCB0aGUgZXZlbnQuCi0gICAgICogCisgICAgICogQHBhcmFtIGV2dAorICAgICAqICAgICAgICAgICAgdGhlIGV2ZW50LgogICAgICAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IGRpc3BhdGNoRXZlbnQoQVdURXZlbnQgZSkgbWV0aG9kLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCkBAIC0yMzM1LDcgKzIxMzgsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByb21wdHMgdGhlIGxheW91dCBtYW5hZ2VyIHRvIGxheSBvdXQgdGhpcyBjb21wb25lbnQuIAorICAgICAqIFByb21wdHMgdGhlIGxheW91dCBtYW5hZ2VyIHRvIGxheSBvdXQgdGhpcyBjb21wb25lbnQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZG9MYXlvdXQoKSB7CiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwpAQCAtMjM1MCw5ICsyMTUzLDEyIEBACiAgICAgLyoqCiAgICAgICogRmlyZSBwcm9wZXJ0eSBjaGFuZ2UgaW1wbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIHRoZSBwcm9wZXJ0eSBuYW1lCi0gICAgICogQHBhcmFtIG9sZFZhbHVlIHRoZSBvbGQgdmFsdWUKLSAgICAgKiBAcGFyYW0gbmV3VmFsdWUgdGhlIG5ldyB2YWx1ZQorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lLgorICAgICAqIEBwYXJhbSBvbGRWYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIG9sZCB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gbmV3VmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZUltcGwoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKICAgICAgICAgUHJvcGVydHlDaGFuZ2VTdXBwb3J0IHBjczsKQEAgLTIzNjgsMzIgKzIxNzQsNDAgQEAKICAgICAvKioKICAgICAgKiBSZXBvcnRzIGEgYm91bmQgcHJvcGVydHkgY2hhbmdlcyBmb3IgaW50IHByb3BlcnRpZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSB0aGUgcHJvcGVydHkgbmFtZS4KLSAgICAgKiBAcGFyYW0gb2xkVmFsdWUgdGhlIG9sZCBwcm9wZXJ0eSdzIHZhbHVlLgotICAgICAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgbmV3IHByb3BlcnR5J3MgdmFsdWUuCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUuCisgICAgICogQHBhcmFtIG9sZFZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgb2xkIHByb3BlcnR5J3MgdmFsdWUuCisgICAgICogQHBhcmFtIG5ld1ZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHByb3BlcnR5J3MgdmFsdWUuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBvbGRWYWx1ZSwgaW50IG5ld1ZhbHVlKSB7CiAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZUltcGwocHJvcGVydHlOYW1lLCBuZXcgSW50ZWdlcihvbGRWYWx1ZSksIG5ldyBJbnRlZ2VyKG5ld1ZhbHVlKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVwb3J0IGEgYm91bmQgcHJvcGVydHkgY2hhbmdlIGZvciBhIGJvb2xlYW4tdmFsdWVkIHByb3BlcnR5LiAKLSAgICAgKiAgCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSB0aGUgcHJvcGVydHkgbmFtZS4KLSAgICAgKiBAcGFyYW0gb2xkVmFsdWUgdGhlIHByb3BlcnR5J3Mgb2xkIHZhbHVlLgotICAgICAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgcHJvcGVydHkncyBuZXcgdmFsdWUuCisgICAgICogUmVwb3J0IGEgYm91bmQgcHJvcGVydHkgY2hhbmdlIGZvciBhIGJvb2xlYW4tdmFsdWVkIHByb3BlcnR5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lLgorICAgICAqIEBwYXJhbSBvbGRWYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5J3Mgb2xkIHZhbHVlLgorICAgICAqIEBwYXJhbSBuZXdWYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5J3MgbmV3IHZhbHVlLgogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShTdHJpbmcgcHJvcGVydHlOYW1lLCBib29sZWFuIG9sZFZhbHVlLCBib29sZWFuIG5ld1ZhbHVlKSB7Ci0gICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZUltcGwocHJvcGVydHlOYW1lLCBCb29sZWFuLnZhbHVlT2Yob2xkVmFsdWUpLCBCb29sZWFuCi0gICAgICAgICAgICAgICAgLnZhbHVlT2YobmV3VmFsdWUpKTsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlSW1wbChwcm9wZXJ0eU5hbWUsIEJvb2xlYW4udmFsdWVPZihvbGRWYWx1ZSksIEJvb2xlYW4udmFsdWVPZihuZXdWYWx1ZSkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlcG9ydHMgYSBib3VuZCBwcm9wZXJ0eSBjaGFuZ2UgZm9yIGFuIE9iamVjdC12YWx1ZWQgcHJvcGVydHkuIAorICAgICAqIFJlcG9ydHMgYSBib3VuZCBwcm9wZXJ0eSBjaGFuZ2UgZm9yIGFuIE9iamVjdC12YWx1ZWQgcHJvcGVydHkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSB0aGUgcHJvcGVydHkgbmFtZS4KLSAgICAgKiBAcGFyYW0gb2xkVmFsdWUgdGhlIHByb3BlcnR5J3Mgb2xkIHZhbHVlCi0gICAgICogQHBhcmFtIG5ld1ZhbHVlIHRoZSBwcm9wZXJ0eSdzIG5ldyB2YWx1ZQorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lLgorICAgICAqIEBwYXJhbSBvbGRWYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5J3Mgb2xkIHZhbHVlLgorICAgICAqIEBwYXJhbSBuZXdWYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5J3MgbmV3IHZhbHVlLgogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBPYmplY3Qgb2xkVmFsdWUsCiAgICAgICAgICAgICBmaW5hbCBPYmplY3QgbmV3VmFsdWUpIHsKQEAgLTI0MDEsNzUgKzIyMTUsOTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXBvcnQgYSBib3VuZCBwcm9wZXJ0eSBjaGFuZ2UgZm9yIGEgYnl0ZS12YWx1ZWQgcHJvcGVydHkuIAorICAgICAqIFJlcG9ydCBhIGJvdW5kIHByb3BlcnR5IGNoYW5nZSBmb3IgYSBieXRlLXZhbHVlZCBwcm9wZXJ0eS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIHRoZSBwcm9wZXJ0eSBuYW1lLgotICAgICAqIEBwYXJhbSBvbGRWYWx1ZSB0aGUgcHJvcGVydHkncyBvbGQgdmFsdWUuCi0gICAgICogQHBhcmFtIG5ld1ZhbHVlIHRoZSBwcm9wZXJ0eSdzIG5ldyB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lCisgICAgICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZS4KKyAgICAgKiBAcGFyYW0gb2xkVmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSdzIG9sZCB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gbmV3VmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSdzIG5ldyB2YWx1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2UoU3RyaW5nIHByb3BlcnR5TmFtZSwgYnl0ZSBvbGRWYWx1ZSwgYnl0ZSBuZXdWYWx1ZSkgewogICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2VJbXBsKHByb3BlcnR5TmFtZSwgbmV3IEJ5dGUob2xkVmFsdWUpLCBuZXcgQnl0ZShuZXdWYWx1ZSkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlcG9ydCBhIGJvdW5kIHByb3BlcnR5IGNoYW5nZSBmb3IgYSBjaGFyLXZhbHVlZCBwcm9wZXJ0eS4gCisgICAgICogUmVwb3J0IGEgYm91bmQgcHJvcGVydHkgY2hhbmdlIGZvciBhIGNoYXItdmFsdWVkIHByb3BlcnR5LgogICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgdGhlIHByb3BlcnR5IG5hbWUuCi0gICAgICogQHBhcmFtIG9sZFZhbHVlIHRoZSBvbGQgcHJvcGVydHkncyB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gbmV3VmFsdWUgdGhlIG5ldyBwcm9wZXJ0eSdzIHZhbHVlLgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lLgorICAgICAqIEBwYXJhbSBvbGRWYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIG9sZCBwcm9wZXJ0eSdzIHZhbHVlLgorICAgICAqIEBwYXJhbSBuZXdWYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBwcm9wZXJ0eSdzIHZhbHVlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShTdHJpbmcgcHJvcGVydHlOYW1lLCBjaGFyIG9sZFZhbHVlLCBjaGFyIG5ld1ZhbHVlKSB7CiAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZUltcGwocHJvcGVydHlOYW1lLCBuZXcgQ2hhcmFjdGVyKG9sZFZhbHVlKSwgbmV3IENoYXJhY3RlcihuZXdWYWx1ZSkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlcG9ydCBhIGJvdW5kIHByb3BlcnR5IGNoYW5nZSBmb3IgYSBzaG9ydC12YWx1ZWQgcHJvcGVydHkuIAorICAgICAqIFJlcG9ydCBhIGJvdW5kIHByb3BlcnR5IGNoYW5nZSBmb3IgYSBzaG9ydC12YWx1ZWQgcHJvcGVydHkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSB0aGUgcHJvcGVydHkgbmFtZS4KLSAgICAgKiBAcGFyYW0gb2xkVmFsdWUgdGhlIG9sZCBwcm9wZXJ0eSdzIHZhbHVlLgotICAgICAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgbmV3IHByb3BlcnR5J3MgdmFsdWUuCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUuCisgICAgICogQHBhcmFtIG9sZFZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgb2xkIHByb3BlcnR5J3MgdmFsdWUuCisgICAgICogQHBhcmFtIG5ld1ZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHByb3BlcnR5J3MgdmFsdWUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIHNob3J0IG9sZFZhbHVlLCBzaG9ydCBuZXdWYWx1ZSkgewogICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2VJbXBsKHByb3BlcnR5TmFtZSwgbmV3IFNob3J0KG9sZFZhbHVlKSwgbmV3IFNob3J0KG5ld1ZhbHVlKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVwb3J0IGEgYm91bmQgcHJvcGVydHkgY2hhbmdlIGZvciBhIGxvbmctdmFsdWVkIHByb3BlcnR5LiAKKyAgICAgKiBSZXBvcnQgYSBib3VuZCBwcm9wZXJ0eSBjaGFuZ2UgZm9yIGEgbG9uZy12YWx1ZWQgcHJvcGVydHkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSB0aGUgcHJvcGVydHkgbmFtZS4KLSAgICAgKiBAcGFyYW0gb2xkVmFsdWUgdGhlIG9sZCBwcm9wZXJ0eSdzIHZhbHVlLgotICAgICAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgbmV3IHByb3BlcnR5J3MgdmFsdWUuCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUuCisgICAgICogQHBhcmFtIG9sZFZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgb2xkIHByb3BlcnR5J3MgdmFsdWUuCisgICAgICogQHBhcmFtIG5ld1ZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHByb3BlcnR5J3MgdmFsdWUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGxvbmcgb2xkVmFsdWUsIGxvbmcgbmV3VmFsdWUpIHsKICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlSW1wbChwcm9wZXJ0eU5hbWUsIG5ldyBMb25nKG9sZFZhbHVlKSwgbmV3IExvbmcobmV3VmFsdWUpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXBvcnQgYSBib3VuZCBwcm9wZXJ0eSBjaGFuZ2UgZm9yIGEgZmxvYXQtdmFsdWVkIHByb3BlcnR5LiAKKyAgICAgKiBSZXBvcnQgYSBib3VuZCBwcm9wZXJ0eSBjaGFuZ2UgZm9yIGEgZmxvYXQtdmFsdWVkIHByb3BlcnR5LgogICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgdGhlIHByb3BlcnR5IG5hbWUuCi0gICAgICogQHBhcmFtIG9sZFZhbHVlIHRoZSBvbGQgcHJvcGVydHkncyB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gbmV3VmFsdWUgdGhlIG5ldyBwcm9wZXJ0eSdzIHZhbHVlLgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lLgorICAgICAqIEBwYXJhbSBvbGRWYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIG9sZCBwcm9wZXJ0eSdzIHZhbHVlLgorICAgICAqIEBwYXJhbSBuZXdWYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBwcm9wZXJ0eSdzIHZhbHVlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShTdHJpbmcgcHJvcGVydHlOYW1lLCBmbG9hdCBvbGRWYWx1ZSwgZmxvYXQgbmV3VmFsdWUpIHsKICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlSW1wbChwcm9wZXJ0eU5hbWUsIG5ldyBGbG9hdChvbGRWYWx1ZSksIG5ldyBGbG9hdChuZXdWYWx1ZSkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlcG9ydCBhIGJvdW5kIHByb3BlcnR5IGNoYW5nZSBmb3IgYSBkb3VibGUtdmFsdWVkIHByb3BlcnR5LiAKKyAgICAgKiBSZXBvcnQgYSBib3VuZCBwcm9wZXJ0eSBjaGFuZ2UgZm9yIGEgZG91YmxlLXZhbHVlZCBwcm9wZXJ0eS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIHRoZSBwcm9wZXJ0eSBuYW1lLgotICAgICAqIEBwYXJhbSBvbGRWYWx1ZSB0aGUgb2xkIHByb3BlcnR5J3MgdmFsdWUuCi0gICAgICogQHBhcmFtIG5ld1ZhbHVlIHRoZSBuZXcgcHJvcGVydHkncyB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lCisgICAgICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZS4KKyAgICAgKiBAcGFyYW0gb2xkVmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBvbGQgcHJvcGVydHkncyB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gbmV3VmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgcHJvcGVydHkncyB2YWx1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2UoU3RyaW5nIHByb3BlcnR5TmFtZSwgZG91YmxlIG9sZFZhbHVlLCBkb3VibGUgbmV3VmFsdWUpIHsKICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlSW1wbChwcm9wZXJ0eU5hbWUsIG5ldyBEb3VibGUob2xkVmFsdWUpLCBuZXcgRG91YmxlKG5ld1ZhbHVlKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgYWxpZ25tZW50IGFsb25nIHRoZSB4IGF4aXMuIAorICAgICAqIEdldHMgdGhlIGFsaWdubWVudCBhbG9uZyB0aGUgeCBheGlzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGFsaWdubWVudCBhbG9uZyB0aGUgeCBheGlzLiAKKyAgICAgKiBAcmV0dXJuIHRoZSBhbGlnbm1lbnQgYWxvbmcgdGhlIHggYXhpcy4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0QWxpZ25tZW50WCgpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC0yNDgxLDcgKzIzMTMsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGFsaWdubWVudCBhbG9uZyB0aGUgeSBheGlzLiAKKyAgICAgKiBHZXRzIHRoZSBhbGlnbm1lbnQgYWxvbmcgdGhlIHkgYXhpcy4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBhbGlnbm1lbnQgYWxvbmcgeSBheGlzLgogICAgICAqLwpAQCAtMjUwMiwxMiArMjMzNCwxMSBAQAogICAgIHB1YmxpYyBDb2xvciBnZXRCYWNrZ3JvdW5kKCkgewogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vPz8/QVdUCisgICAgICAgICAgICAvLyA/Pz9BV1QKICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICBpZiAoKGJhY2tDb2xvciA9PSBudWxsKSAmJiAocGFyZW50ICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5nZXRCYWNrZ3JvdW5kKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqLworICAgICAgICAgICAgICogaWYgKChiYWNrQ29sb3IgPT0gbnVsbCkgJiYgKHBhcmVudCAhPSBudWxsKSkgeyByZXR1cm4KKyAgICAgICAgICAgICAqIHBhcmVudC5nZXRCYWNrZ3JvdW5kKCk7IH0KKyAgICAgICAgICAgICAqLwogICAgICAgICAgICAgcmV0dXJuIGJhY2tDb2xvcjsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7CkBAIC0yNTI5LDExICsyMzYwLDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBkYXRhIG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUgdG8gdGhlIHNwZWNpZmllZCAKLSAgICAgKiBSZWN0YW5nbGUgb2JqZWN0LgorICAgICAqIFdyaXRlcyB0aGUgZGF0YSBvZiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIHRvIHRoZSBzcGVjaWZpZWQgUmVjdGFuZ2xlCisgICAgICogb2JqZWN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBydiB0aGUgUmVjdGFuZ2xlIG9iamVjdCB3aGVyZSB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlJ3MgZGF0YSBpcyBzdG9yZWQuICAKLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gcnYKKyAgICAgKiAgICAgICAgICAgIHRoZSBSZWN0YW5nbGUgb2JqZWN0IHdoZXJlIHRoZSBib3VuZGluZyByZWN0YW5nbGUncyBkYXRhIGlzCisgICAgICogICAgICAgICAgICBzdG9yZWQuCiAgICAgICogQHJldHVybiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlLgogICAgICAqLwogICAgIHB1YmxpYyBSZWN0YW5nbGUgZ2V0Qm91bmRzKFJlY3RhbmdsZSBydikgewpAQCAtMjU2Niw4ICsyMzk4LDggQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBDb21wb25lbnQgd2hpY2ggY29udGFpbnMgdGhlIHNwZWNpZmllZCBQb2ludC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcCB0aGUgUG9pbnQuCi0gICAgICogCisgICAgICogQHBhcmFtIHAKKyAgICAgKiAgICAgICAgICAgIHRoZSBQb2ludC4KICAgICAgKiBAcmV0dXJuIHRoZSBDb21wb25lbnQgd2hpY2ggY29udGFpbnMgdGhlIHNwZWNpZmllZCBQb2ludC4KICAgICAgKi8KICAgICBwdWJsaWMgQ29tcG9uZW50IGdldENvbXBvbmVudEF0KFBvaW50IHApIHsKQEAgLTI1ODAsMTQgKzI0MTIsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBDb21wb25lbnQgd2hpY2ggY29udGFpbnMgdGhlIHBvaW50IHdpdGggdGhlCi0gICAgICogc3BlY2lmaWVkIGNvb3JkaW5hdGVzLgorICAgICAqIEdldHMgdGhlIENvbXBvbmVudCB3aGljaCBjb250YWlucyB0aGUgcG9pbnQgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogY29vcmRpbmF0ZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQuCi0gICAgICogQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgQ29tcG9uZW50IHdoaWNoIGNvbnRhaW5zIHRoZSBwb2ludCB3aXRoIHRoZQotICAgICAqIHNwZWNpZmllZCBjb29yZGluYXRlcy4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LgorICAgICAqIEByZXR1cm4gdGhlIENvbXBvbmVudCB3aGljaCBjb250YWlucyB0aGUgcG9pbnQgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICBjb29yZGluYXRlcy4KICAgICAgKi8KICAgICBwdWJsaWMgQ29tcG9uZW50IGdldENvbXBvbmVudEF0KGludCB4LCBpbnQgeSkgewogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKQEAgLTI2MjIsMTEgKzI0NTUsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHJldHVybiBjdXJzb3I7Ci0gICAgICAgICAgICAvLz8/P0FXVAotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50LmdldEN1cnNvcigpOwotICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAvLyA/Pz9BV1QKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIH0gZWxzZSBpZiAocGFyZW50ICE9IG51bGwpIHsgcmV0dXJuIHBhcmVudC5nZXRDdXJzb3IoKTsKKyAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBDdXJzb3IuZ2V0RGVmYXVsdEN1cnNvcigpOwogICAgICAgICB9IGZpbmFsbHkgewpAQCAtMjYzNCw1NyArMjQ2NiwyOSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIHB1YmxpYyBEcm9wVGFyZ2V0IGdldERyb3BUYXJnZXQoKSB7Ci0gICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGRyb3BUYXJnZXQ7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBDb250YWluZXIgZ2V0Rm9jdXNDeWNsZVJvb3RBbmNlc3RvcigpIHsKLSAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmb3IgKENvbnRhaW5lciBjID0gcGFyZW50OyBjICE9IG51bGw7IGMgPSBjLmdldFBhcmVudCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGMuaXNGb2N1c0N5Y2xlUm9vdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgU2V0PEFXVEtleVN0cm9rZT4gZ2V0Rm9jdXNUcmF2ZXJzYWxLZXlzKGludCBpZCkgewotICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEludGVnZXIga0lkID0gbmV3IEludGVnZXIoaWQpOwotICAgICAgICAgICAgS2V5Ym9hcmRGb2N1c01hbmFnZXIuY2hlY2tUcmF2ZXJzYWxLZXlzSUQodHJhdmVyc2FsS2V5cywga0lkKTsKLSAgICAgICAgICAgIFNldDw/IGV4dGVuZHMgQVdUS2V5U3Ryb2tlPiBrZXlzID0gdHJhdmVyc2FsS2V5cy5nZXQoa0lkKTsKLSAgICAgICAgICAgIGlmIChrZXlzID09IG51bGwgJiYgcGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBrZXlzID0gcGFyZW50LmdldEZvY3VzVHJhdmVyc2FsS2V5cyhpZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoa2V5cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAga2V5cyA9IEtleWJvYXJkRm9jdXNNYW5hZ2VyLmdldEN1cnJlbnRLZXlib2FyZEZvY3VzTWFuYWdlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdEZvY3VzVHJhdmVyc2FsS2V5cyhpZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gKFNldDxBV1RLZXlTdHJva2U+KSBrZXlzOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAqLwotICAgIAorICAgICAqIHB1YmxpYyBEcm9wVGFyZ2V0IGdldERyb3BUYXJnZXQoKSB7IHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeyByZXR1cm4KKyAgICAgKiBkcm9wVGFyZ2V0OyB9IGZpbmFsbHkgeyB0b29sa2l0LnVubG9ja0FXVCgpOyB9IH0gcHVibGljIENvbnRhaW5lcgorICAgICAqIGdldEZvY3VzQ3ljbGVSb290QW5jZXN0b3IoKSB7IHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeyBmb3IgKENvbnRhaW5lciBjID0KKyAgICAgKiBwYXJlbnQ7IGMgIT0gbnVsbDsgYyA9IGMuZ2V0UGFyZW50KCkpIHsgaWYgKGMuaXNGb2N1c0N5Y2xlUm9vdCgpKSB7CisgICAgICogcmV0dXJuIGM7IH0gfSByZXR1cm4gbnVsbDsgfSBmaW5hbGx5IHsgdG9vbGtpdC51bmxvY2tBV1QoKTsgfSB9CisgICAgICogQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIHB1YmxpYyBTZXQ8QVdUS2V5U3Ryb2tlPgorICAgICAqIGdldEZvY3VzVHJhdmVyc2FsS2V5cyhpbnQgaWQpIHsgdG9vbGtpdC5sb2NrQVdUKCk7IHRyeSB7IEludGVnZXIga0lkID0KKyAgICAgKiBuZXcgSW50ZWdlcihpZCk7IEtleWJvYXJkRm9jdXNNYW5hZ2VyLmNoZWNrVHJhdmVyc2FsS2V5c0lEKHRyYXZlcnNhbEtleXMsCisgICAgICoga0lkKTsgU2V0PD8gZXh0ZW5kcyBBV1RLZXlTdHJva2U+IGtleXMgPSB0cmF2ZXJzYWxLZXlzLmdldChrSWQpOyBpZiAoa2V5cworICAgICAqID09IG51bGwgJiYgcGFyZW50ICE9IG51bGwpIHsga2V5cyA9IHBhcmVudC5nZXRGb2N1c1RyYXZlcnNhbEtleXMoaWQpOyB9CisgICAgICogaWYgKGtleXMgPT0gbnVsbCkgeyBrZXlzID0KKyAgICAgKiBLZXlib2FyZEZvY3VzTWFuYWdlci5nZXRDdXJyZW50S2V5Ym9hcmRGb2N1c01hbmFnZXIoKQorICAgICAqIC5nZXREZWZhdWx0Rm9jdXNUcmF2ZXJzYWxLZXlzKGlkKTsgfSByZXR1cm4gKFNldDxBV1RLZXlTdHJva2U+KSBrZXlzOyB9CisgICAgICogZmluYWxseSB7IHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfQorICAgICAqLworCiAgICAgLyoqCiAgICAgICogQ2hlY2tzIGlmIHRoZSB0aGUgZm9jdXMgdHJhdmVyc2FsIGtleXMgYXJlIGVuYWJsZWQgZm9yIHRoaXMgY29tcG9uZW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHRoZSBmb2N1cyB0cmF2ZXJzYWwga2V5cyBhcmUgZW5hYmxlZCBmb3IgCi0gICAgICogdGhpcyBjb21wb25lbnQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSB0aGUgZm9jdXMgdHJhdmVyc2FsIGtleXMgYXJlIGVuYWJsZWQgZm9yIHRoaXMKKyAgICAgKiAgICAgICAgIGNvbXBvbmVudCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGdldEZvY3VzVHJhdmVyc2FsS2V5c0VuYWJsZWQoKSB7CiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwpAQCAtMjY5OCw4ICsyNTAyLDggQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBmb250IG1ldHJpY3Mgb2YgdGhlIHNwZWNpZmllZCBGb250LgogICAgICAqIAotICAgICAqIEBwYXJhbSBmIHRoZSBGb250LgotICAgICAqIAorICAgICAqIEBwYXJhbSBmCisgICAgICogICAgICAgICAgICB0aGUgRm9udC4KICAgICAgKiBAcmV0dXJuIHRoZSBGb250TWV0cmljcyBvZiB0aGUgc3BlY2lmaWVkIEZvbnQuCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKQEAgLTI3MTUsMTIgKzI1MTksMTEgQEAKICAgICBwdWJsaWMgQ29sb3IgZ2V0Rm9yZWdyb3VuZCgpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLz8/P0FXVAorICAgICAgICAgICAgLy8gPz8/QVdUCiAgICAgICAgICAgICAvKgotICAgICAgICAgICAgaWYgKGZvcmVDb2xvciA9PSBudWxsICYmIHBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5nZXRGb3JlZ3JvdW5kKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqLworICAgICAgICAgICAgICogaWYgKGZvcmVDb2xvciA9PSBudWxsICYmIHBhcmVudCAhPSBudWxsKSB7IHJldHVybgorICAgICAgICAgICAgICogcGFyZW50LmdldEZvcmVncm91bmQoKTsgfQorICAgICAgICAgICAgICovCiAgICAgICAgICAgICByZXR1cm4gZm9yZUNvbG9yOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKQEAgLTI3MjgsMTEgKzI1MzEsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBHcmFwaGljcyBvZiB0aGUgQ29tcG9uZW50IG9yIG51bGwgaWYgdGhpcyBDb21wb25lbnQKLSAgICAgKiBpcyBub3QgZGlzcGxheWFibGUuCisgICAgICogR2V0cyB0aGUgR3JhcGhpY3Mgb2YgdGhlIENvbXBvbmVudCBvciBudWxsIGlmIHRoaXMgQ29tcG9uZW50IGlzIG5vdAorICAgICAqIGRpc3BsYXlhYmxlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIEdyYXBoaWNzIG9mIHRoZSBDb21wb25lbnQgb3IgbnVsbCBpZiB0aGlzIENvbXBvbmVudAotICAgICAqIGlzIG5vdCBkaXNwbGF5YWJsZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBHcmFwaGljcyBvZiB0aGUgQ29tcG9uZW50IG9yIG51bGwgaWYgdGhpcyBDb21wb25lbnQgaXMgbm90CisgICAgICogICAgICAgICBkaXNwbGF5YWJsZS4KICAgICAgKi8KICAgICBwdWJsaWMgR3JhcGhpY3MgZ2V0R3JhcGhpY3MoKSB7CiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwpAQCAtMjc0OSwyNiArMjU1MiwxOCBAQAogICAgICAgICB9CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBHcmFwaGljc0NvbmZpZ3VyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgQ29tcG9uZW50LgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIEdyYXBoaWNzQ29uZmlndXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBDb21wb25lbnQuCiAgICAgICovCiAgICAgcHVibGljIEdyYXBoaWNzQ29uZmlndXJhdGlvbiBnZXRHcmFwaGljc0NvbmZpZ3VyYXRpb24oKSB7Ci0gICAgICAgIC8vPz8/QVdUCisgICAgICAgIC8vID8/P0FXVAogICAgICAgICAvKgotICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFdpbmRvdyB3aW4gPSBnZXRXaW5kb3dBbmNlc3RvcigpOwotICAgICAgICAgICAgaWYgKHdpbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gd2luLmdldEdyYXBoaWNzQ29uZmlndXJhdGlvbigpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgfQotICAgICAgICAqLworICAgICAgICAgKiB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsgV2luZG93IHdpbiA9IGdldFdpbmRvd0FuY2VzdG9yKCk7IGlmICh3aW4gPT0KKyAgICAgICAgICogbnVsbCkgeyByZXR1cm4gbnVsbDsgfSByZXR1cm4gd2luLmdldEdyYXBoaWNzQ29uZmlndXJhdGlvbigpOyB9CisgICAgICAgICAqIGZpbmFsbHkgeyB0b29sa2l0LnVubG9ja0FXVCgpOyB9CisgICAgICAgICAqLwogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKQEAgLTI3ODcsMTEgKzI1ODIsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgcGFpbnQgbWVzc2FnZXMgcmVjZWl2ZWQgZnJvbSB0aGUgb3BlcmF0aW5nIHN5c3RlbSAKLSAgICAgKiBzaG91bGQgYmUgaWdub3JlZC4KKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgcGFpbnQgbWVzc2FnZXMgcmVjZWl2ZWQgZnJvbSB0aGUgb3BlcmF0aW5nIHN5c3RlbSBzaG91bGQKKyAgICAgKiBiZSBpZ25vcmVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBwYWludCBtZXNzYWdlcyByZWNlaXZlZCBmcm9tIHRoZSBvcGVyYXRpbmcgc3lzdGVtIAotICAgICAqIHNob3VsZCBiZSBpZ25vcmVkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlIGlmIHBhaW50IG1lc3NhZ2VzIHJlY2VpdmVkIGZyb20gdGhlIG9wZXJhdGluZyBzeXN0ZW0gc2hvdWxkCisgICAgICogICAgICAgICBiZSBpZ25vcmVkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZ2V0SWdub3JlUmVwYWludCgpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC0yODAzLDIzICsyNTk4LDIwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgaW5wdXQgY29udGV4dCBvZiB0aGlzIGNvbXBvbmVudCBmb3IgaGFuZGxpbmcgCi0gICAgICogdGhlIGNvbW11bmljYXRpb24gd2l0aCBpbnB1dCBtZXRob2RzIHdoZW4gdGV4dCBpcyBlbnRlcmVkIAotICAgICAqIGluIHRoaXMgY29tcG9uZW50LgorICAgICAqIEdldHMgdGhlIGlucHV0IGNvbnRleHQgb2YgdGhpcyBjb21wb25lbnQgZm9yIGhhbmRsaW5nIHRoZSBjb21tdW5pY2F0aW9uCisgICAgICogd2l0aCBpbnB1dCBtZXRob2RzIHdoZW4gdGV4dCBpcyBlbnRlcmVkIGluIHRoaXMgY29tcG9uZW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIElucHV0Q29udGV4dCB1c2VkIGJ5IHRoaXMgQ29tcG9uZW50IG9yIAotICAgICAqIG51bGwgaWYgbm8gY29udGV4dCBpcyBzcGVjaWZpbmVkLgorICAgICAqIEByZXR1cm4gdGhlIElucHV0Q29udGV4dCB1c2VkIGJ5IHRoaXMgQ29tcG9uZW50IG9yIG51bGwgaWYgbm8gY29udGV4dCBpcworICAgICAqICAgICAgICAgc3BlY2lmaW5lZC4KICAgICAgKi8KICAgICBwdWJsaWMgSW5wdXRDb250ZXh0IGdldElucHV0Q29udGV4dCgpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLz8/P0FXVAorICAgICAgICAgICAgLy8gPz8/QVdUCiAgICAgICAgICAgICAvKgotICAgICAgICAgICAgQ29udGFpbmVyIHBhcmVudCA9IGdldFBhcmVudCgpOwotICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5nZXRJbnB1dENvbnRleHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICovCisgICAgICAgICAgICAgKiBDb250YWluZXIgcGFyZW50ID0gZ2V0UGFyZW50KCk7IGlmIChwYXJlbnQgIT0gbnVsbCkgeyByZXR1cm4KKyAgICAgICAgICAgICAqIHBhcmVudC5nZXRJbnB1dENvbnRleHQoKTsgfQorICAgICAgICAgICAgICovCiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7CkBAIC0yODI3LDExICsyNjE5LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgaW5wdXQgbWV0aG9kIHJlcXVlc3QgaGFuZGxlciB3aGljaCBzdXBwb3J0cyByZXF1ZXN0cwotICAgICAqIGZyb20gaW5wdXQgbWV0aG9kcyBmb3IgdGhpcyBjb21wb25lbnQsIG9yIG51bGwgZm9yIGRlZmF1bHQuCisgICAgICogR2V0cyB0aGUgaW5wdXQgbWV0aG9kIHJlcXVlc3QgaGFuZGxlciB3aGljaCBzdXBwb3J0cyByZXF1ZXN0cyBmcm9tIGlucHV0CisgICAgICogbWV0aG9kcyBmb3IgdGhpcyBjb21wb25lbnQsIG9yIG51bGwgZm9yIGRlZmF1bHQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW5wdXQgbWV0aG9kIHJlcXVlc3QgaGFuZGxlciB3aGljaCBzdXBwb3J0cyByZXF1ZXN0cwotICAgICAqIGZyb20gaW5wdXQgbWV0aG9kcyBmb3IgdGhpcyBjb21wb25lbnQsIG9yIG51bGwgZm9yIGRlZmF1bHQuCisgICAgICogQHJldHVybiB0aGUgaW5wdXQgbWV0aG9kIHJlcXVlc3QgaGFuZGxlciB3aGljaCBzdXBwb3J0cyByZXF1ZXN0cyBmcm9tCisgICAgICogICAgICAgICBpbnB1dCBtZXRob2RzIGZvciB0aGlzIGNvbXBvbmVudCwgb3IgbnVsbCBmb3IgZGVmYXVsdC4KICAgICAgKi8KICAgICBwdWJsaWMgSW5wdXRNZXRob2RSZXF1ZXN0cyBnZXRJbnB1dE1ldGhvZFJlcXVlc3RzKCkgewogICAgICAgICByZXR1cm4gbnVsbDsKQEAgLTI4NDUsMTkgKzI2MzcsMTQgQEAKICAgICBwdWJsaWMgTG9jYWxlIGdldExvY2FsZSgpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLz8/P0FXVAorICAgICAgICAgICAgLy8gPz8/QVdUCiAgICAgICAgICAgICAvKgotICAgICAgICAgICAgaWYgKGxvY2FsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgV2luZG93KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTG9jYWxlLmdldERlZmF1bHQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBhd3QuMTUwPW5vIHBhcmVudAotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbENvbXBvbmVudFN0YXRlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjE1MCIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UGFyZW50KCkuZ2V0TG9jYWxlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqLworICAgICAgICAgICAgICogaWYgKGxvY2FsZSA9PSBudWxsKSB7IGlmIChwYXJlbnQgPT0gbnVsbCkgeyBpZiAodGhpcyBpbnN0YW5jZW9mCisgICAgICAgICAgICAgKiBXaW5kb3cpIHsgcmV0dXJuIExvY2FsZS5nZXREZWZhdWx0KCk7IH0gLy8gYXd0LjE1MD1ubyBwYXJlbnQKKyAgICAgICAgICAgICAqIHRocm93IG5ldworICAgICAgICAgICAgICogSWxsZWdhbENvbXBvbmVudFN0YXRlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjE1MCIpKTsKKyAgICAgICAgICAgICAqIC8vJE5PTi1OTFMtMSQgfSByZXR1cm4gZ2V0UGFyZW50KCkuZ2V0TG9jYWxlKCk7IH0KKyAgICAgICAgICAgICAqLwogICAgICAgICAgICAgcmV0dXJuIGxvY2FsZTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7CkBAIC0yODY1LDM1ICsyNjUyLDMwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgbG9jYXRpb24gb2YgdGhpcyBjb21wb25lbnQgaW4gdGhlIGZvcm0gb2YgYSBwb2ludCAKLSAgICAgKiBzcGVjaWZ5aW5nIHRoZSBjb21wb25lbnQncyB0b3AtbGVmdCBjb3JuZXIgaW4gdGhlIAotICAgICAqIHNjcmVlbidzIGNvb3JkaW5hdGUgc3BhY2UuCisgICAgICogR2V0cyB0aGUgbG9jYXRpb24gb2YgdGhpcyBjb21wb25lbnQgaW4gdGhlIGZvcm0gb2YgYSBwb2ludCBzcGVjaWZ5aW5nIHRoZQorICAgICAqIGNvbXBvbmVudCdzIHRvcC1sZWZ0IGNvcm5lciBpbiB0aGUgc2NyZWVuJ3MgY29vcmRpbmF0ZSBzcGFjZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBQb2ludCBnaXZpbmcgdGhlIGNvbXBvbmVudCdzIGxvY2F0aW9uIGluIHRoZSAKLSAgICAgKiBzY3JlZW4ncyBjb29yZGluYXRlIHNwYWNlLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSWxsZWdhbENvbXBvbmVudFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBjb21wb25lbnQgaXMgCi0gICAgICogbm90IHNob3duIG9uIHRoZSBzY3JlZW4uCisgICAgICogQHJldHVybiB0aGUgUG9pbnQgZ2l2aW5nIHRoZSBjb21wb25lbnQncyBsb2NhdGlvbiBpbiB0aGUgc2NyZWVuJ3MKKyAgICAgKiAgICAgICAgIGNvb3JkaW5hdGUgc3BhY2UuCisgICAgICogQHRocm93cyBJbGxlZ2FsQ29tcG9uZW50U3RhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY29tcG9uZW50IGlzIG5vdCBzaG93biBvbiB0aGUgc2NyZWVuLgogICAgICAqLwogICAgIHB1YmxpYyBQb2ludCBnZXRMb2NhdGlvbk9uU2NyZWVuKCkgdGhyb3dzIElsbGVnYWxDb21wb25lbnRTdGF0ZUV4Y2VwdGlvbiB7CiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgUG9pbnQgcCA9IG5ldyBQb2ludCgpOwogICAgICAgICAgICAgaWYgKGlzU2hvd2luZygpKSB7Ci0gICAgICAgICAgICAgICAgLy8/Pz9BV1QKKyAgICAgICAgICAgICAgICAvLyA/Pz9BV1QKICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgIENvbXBvbmVudCBjb21wOwotICAgICAgICAgICAgICAgIGZvciAoY29tcCA9IHRoaXM7IGNvbXAgIT0gbnVsbCAmJiAhKGNvbXAgaW5zdGFuY2VvZiBXaW5kb3cpOyBjb21wID0gY29tcAotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFBhcmVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHAudHJhbnNsYXRlKGNvbXAuZ2V0WCgpLCBjb21wLmdldFkoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjb21wIGluc3RhbmNlb2YgV2luZG93KSB7Ci0gICAgICAgICAgICAgICAgICAgIHAudHJhbnNsYXRlKGNvbXAuZ2V0WCgpLCBjb21wLmdldFkoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICogQ29tcG9uZW50IGNvbXA7IGZvciAoY29tcCA9IHRoaXM7IGNvbXAgIT0gbnVsbCAmJiAhKGNvbXAKKyAgICAgICAgICAgICAgICAgKiBpbnN0YW5jZW9mIFdpbmRvdyk7IGNvbXAgPSBjb21wIC5nZXRQYXJlbnQoKSkgeworICAgICAgICAgICAgICAgICAqIHAudHJhbnNsYXRlKGNvbXAuZ2V0WCgpLCBjb21wLmdldFkoKSk7IH0gaWYgKGNvbXAgaW5zdGFuY2VvZgorICAgICAgICAgICAgICAgICAqIFdpbmRvdykgeyBwLnRyYW5zbGF0ZShjb21wLmdldFgoKSwgY29tcC5nZXRZKCkpOyB9CisgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgcmV0dXJuIHA7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBhd3QuMTUxPWNvbXBvbmVudCBtdXN0IGJlIHNob3dpbmcgb24gdGhlIHNjcmVlbiB0byBkZXRlcm1pbmUgaXRzIGxvY2F0aW9uCisgICAgICAgICAgICAvLyBhd3QuMTUxPWNvbXBvbmVudCBtdXN0IGJlIHNob3dpbmcgb24gdGhlIHNjcmVlbiB0byBkZXRlcm1pbmUgaXRzCisgICAgICAgICAgICAvLyBsb2NhdGlvbgogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxDb21wb25lbnRTdGF0ZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4xNTEiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7CkBAIC0yOTAxLDExICsyNjgzLDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgcGVlci4gVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkgYnkKLSAgICAgKiB1c2VyIGFwcGxpY2F0aW9ucy4KKyAgICAgKiBHZXRzIHRoZSBwZWVyLiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseSBieSB1c2VyCisgICAgICogYXBwbGljYXRpb25zLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIENvbXBvbmVudFBlZXIuCi0gICAgICogCiAgICAgICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgaXNEaXNwbGF5YWJsZSgpLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCkBAIC0yOTIyLDI0ICsyNzAzLDI0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbiBhcnJheSBvZiB0aGUgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVycyByZWdpc3RlcmVkIHRvCi0gICAgICogdGhpcyBDb21wb25lbnQuCisgICAgICogR2V0cyBhbiBhcnJheSBvZiB0aGUgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVycyByZWdpc3RlcmVkIHRvIHRoaXMKKyAgICAgKiBDb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMgcmVnaXN0ZXJlZCB0bwotICAgICAqIHRoaXMgQ29tcG9uZW50LgorICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzIHJlZ2lzdGVyZWQgdG8gdGhpcworICAgICAqICAgICAgICAgQ29tcG9uZW50LgogICAgICAqLwogICAgIHB1YmxpYyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyW10gZ2V0UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoKSB7CiAgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eUNoYW5nZVN1cHBvcnQoKS5nZXRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycygpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYW4gYXJyYXkgb2YgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBvYmplY3RzIHJlZ2lzdGVyZWQKLSAgICAgKiB0byB0aGlzIENvbXBvbmVudCBmb3IgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS4KKyAgICAgKiBHZXRzIGFuIGFycmF5IG9mIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgb2JqZWN0cyByZWdpc3RlcmVkIHRvIHRoaXMKKyAgICAgKiBDb21wb25lbnQgZm9yIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSB0aGUgcHJvcGVydHkgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgb2JqZWN0cyByZWdpc3RlcmVkCi0gICAgICogdG8gdGhpcyBDb21wb25lbnQgZm9yIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUuCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIG9iamVjdHMgcmVnaXN0ZXJlZCB0byB0aGlzCisgICAgICogICAgICAgICBDb21wb25lbnQgZm9yIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuCiAgICAgICovCiAgICAgcHVibGljIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJbXSBnZXRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7CiAgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eUNoYW5nZVN1cHBvcnQoKS5nZXRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhwcm9wZXJ0eU5hbWUpOwpAQCAtMjk5MCwxMSArMjc3MSwxMSBAQAogICAgIC8qKgogICAgICAqIEdvdCB0aGUgZm9jdXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGV2dCB0aGUgRXZlbnQuCi0gICAgICogQHBhcmFtIHdoYXQgdGhlIE9iamVjdC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZXZ0CisgICAgICogICAgICAgICAgICB0aGUgRXZlbnQuCisgICAgICogQHBhcmFtIHdoYXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBPYmplY3QuCiAgICAgICogQHJldHVybiB0cnVlLCBpZiBzdWNjZXNzZnVsLgotICAgICAqIAogICAgICAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IHByb2Nlc3NGb2N1c0V2ZW50KEZvY3VzRXZlbnQpIG1ldGhvZC4KICAgICAgKi8KICAgICBARGVwcmVjYXRlZApAQCAtMzAwNywxMCArMjc4OCw5IEBACiAgICAgLyoqCiAgICAgICogSGFuZGxlcyBldmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXZ0IHRoZSBFdmVudC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZXZ0CisgICAgICogICAgICAgICAgICB0aGUgRXZlbnQuCiAgICAgICogQHJldHVybiB0cnVlLCBpZiBzdWNjZXNzZnVsLgotICAgICAqIAogICAgICAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IHByb2Nlc3NFdmVudChBV1RFdmVudCkgbWV0aG9kLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCkBAIC0zMDUyLDcgKzI4MzIsNyBAQAogICAgIHB1YmxpYyBib29sZWFuIGhhc0ZvY3VzKCkgewogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vPz8/QVdUOiByZXR1cm4gaXNGb2N1c093bmVyKCk7CisgICAgICAgICAgICAvLyA/Pz9BV1Q6IHJldHVybiBpc0ZvY3VzT3duZXIoKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7CkBAIC0zMDc2LDI0ICsyODU2LDI0IEBACiAgICAgICAgICAgICBtb3ZlRm9jdXNPbkhpZGUoKTsKICAgICAgICAgICAgIGJlaGF2aW91ci5zZXRWaXNpYmxlKGZhbHNlKTsKICAgICAgICAgICAgIHBvc3RFdmVudChuZXcgQ29tcG9uZW50RXZlbnQodGhpcywgQ29tcG9uZW50RXZlbnQuQ09NUE9ORU5UX0hJRERFTikpOwotICAgICAgICAgICAgLy8/Pz9BV1Q6IGZpbmlzaEhpZXJhcmNoeUNoYW5nZSh0aGlzLCBwYXJlbnQsIDApOworICAgICAgICAgICAgLy8gPz8/QVdUOiBmaW5pc2hIaWVyYXJjaHlDaGFuZ2UodGhpcywgcGFyZW50LCAwKTsKICAgICAgICAgICAgIG5vdGlmeUlucHV0TWV0aG9kKG51bGwpOwotICAgICAgICAgICAgLy8/Pz9BV1Q6IGludmFsaWRhdGVSZWFsUGFyZW50KCk7CisgICAgICAgICAgICAvLyA/Pz9BV1Q6IGludmFsaWRhdGVSZWFsUGFyZW50KCk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBwb2ludCB3aXRoIHRoZSBzcGVjaWZpZWQgY29vcmRpbmF0ZXMgCi0gICAgICogYmVsb25ncyB0byB0aGUgQ29tbXBvbmVudC4KKyAgICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhlIHBvaW50IHdpdGggdGhlIHNwZWNpZmllZCBjb29yZGluYXRlcyBiZWxvbmdzIHRvCisgICAgICogdGhlIENvbW1wb25lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgUG9pbnQuCi0gICAgICogQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgUG9pbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgcG9pbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGNvb3JkaW5hdGVzIAotICAgICAqIGJlbG9uZ3MgdG8gdGhlIENvbW1wb25lbnQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgUG9pbnQuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIFBvaW50LgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHBvaW50IHdpdGggdGhlIHNwZWNpZmllZCBjb29yZGluYXRlcyBiZWxvbmdzIHRvIHRoZQorICAgICAqICAgICAgICAgQ29tbXBvbmVudCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IGNvbnRhaW5zKGludCwgaW50KSBtZXRob2QuCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKQEAgLTMxMDcsMTUgKzI4ODcsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnZhbGlkYXRlcyB0aGUgY29tcG9uZW50LCB0aGlzIGNvbXBvbmVudCBhbmQgYWxsIHBhcmVudHMgCi0gICAgICogYWJvdmUgaXQgYXJlIG1hcmtlZCBhcyBuZWVkaW5nIHRvIGJlIGxhaWQgb3V0LiAKKyAgICAgKiBJbnZhbGlkYXRlcyB0aGUgY29tcG9uZW50LCB0aGlzIGNvbXBvbmVudCBhbmQgYWxsIHBhcmVudHMgYWJvdmUgaXQgYXJlCisgICAgICogbWFya2VkIGFzIG5lZWRpbmcgdG8gYmUgbGFpZCBvdXQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgaW52YWxpZGF0ZSgpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgcmVzZXREZWZhdWx0U2l6ZSgpOwotICAgICAgICAgICAgLy8/Pz9BV1Q6IGludmFsaWRhdGVSZWFsUGFyZW50KCk7CisgICAgICAgICAgICAvLyA/Pz9BV1Q6IGludmFsaWRhdGVSZWFsUGFyZW50KCk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwogICAgICAgICB9CkBAIC0zMTI0LDggKzI5MDQsOCBAQAogICAgIC8qKgogICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgYmFja2dyb3VuZCBjb2xvciBpcyBzZXQgdG8gdGhpcyBDb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgYmFja2dyb3VuZCBjb2xvciBpcyBzZXQgdG8gdGhpcyBDb21wb25lbnQsCi0gICAgICogZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIGJhY2tncm91bmQgY29sb3IgaXMgc2V0IHRvIHRoaXMgQ29tcG9uZW50LCBmYWxzZQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzQmFja2dyb3VuZFNldCgpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC0zMTM5LDggKzI5MTksNyBAQAogICAgIC8qKgogICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCBhIGN1cnNvciBpcyBzZXQgZm9yIHRoZSBDb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiBhIGN1cnNvciBpcyBzZXQgZm9yIHRoZSBDb21wb25lbnQsCi0gICAgICogZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgYSBjdXJzb3IgaXMgc2V0IGZvciB0aGUgQ29tcG9uZW50LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNDdXJzb3JTZXQoKSB7CiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwpAQCAtMzE2NiwxMSArMjk0NSwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGNvbXBvbmVudCBpcyBwYWludGVkIHRvIGFuIGJ1ZmZlcgotICAgICAqIHdoaWNoIGlzIGNvcGllZCB0byB0aGUgc2NyZWVuIGxhdGVyLgorICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGNvbXBvbmVudCBpcyBwYWludGVkIHRvIGFuIGJ1ZmZlciB3aGljaCBpcworICAgICAqIGNvcGllZCB0byB0aGUgc2NyZWVuIGxhdGVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBjb21wb25lbnQgaXMgcGFpbnRlZCB0byBhbiBidWZmZXIKLSAgICAgKiB3aGljaCBpcyBjb3BpZWQgdG8gdGhlIHNjcmVlbiBsYXRlciwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBjb21wb25lbnQgaXMgcGFpbnRlZCB0byBhbiBidWZmZXIgd2hpY2ggaXMgY29waWVkCisgICAgICogICAgICAgICB0byB0aGUgc2NyZWVuIGxhdGVyLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNEb3VibGVCdWZmZXJlZCgpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC0zMjAwLDcgKzI5NzksNyBAQAogICAgICAqICJSZWN1cnNpdmUiIGlzRW5hYmxlZCgpLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBub3Qgb25seSBjb21wb25lbnQgaXRzZWxmIGlzIGVuYWJsZWQgYnV0IGl0cyBoZWF2eXdlaWdodAotICAgICAqIHBhcmVudCBpcyBhbHNvICJpbmRpcmVjdGx5IiBlbmFibGVkCisgICAgICogICAgICAgICBwYXJlbnQgaXMgYWxzbyAiaW5kaXJlY3RseSIgZW5hYmxlZC4KICAgICAgKi8KICAgICBib29sZWFuIGlzSW5kaXJlY3RseUVuYWJsZWQoKSB7CiAgICAgICAgIENvbXBvbmVudCBjb21wID0gdGhpczsKQEAgLTMyMDgsNyArMjk4Nyw3IEBACiAgICAgICAgICAgICBpZiAoIWNvbXAuaXNMaWdodHdlaWdodCgpICYmICFjb21wLmlzRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8/Pz9BV1Q6IGNvbXAgPSBjb21wLmdldFJlYWxQYXJlbnQoKTsKKyAgICAgICAgICAgIC8vID8/P0FXVDogY29tcCA9IGNvbXAuZ2V0UmVhbFBhcmVudCgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KQEAgLTMyMTYsNyArMjk5NSw3IEBACiAgICAgLyoqCiAgICAgICogQ2hlY2tzIGlmIHRoZSBjb21wb25lbnQgaXMga2V5IGVuYWJsZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgY29tcG9uZW50IGlzIGVuYWJsZWQgYW5kIGluZGlyZWN0bHkgZW5hYmxlZAorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIGNvbXBvbmVudCBpcyBlbmFibGVkIGFuZCBpbmRpcmVjdGx5IGVuYWJsZWQuCiAgICAgICovCiAgICAgYm9vbGVhbiBpc0tleUVuYWJsZWQoKSB7CiAgICAgICAgIGlmICghaXNFbmFibGVkKCkpIHsKQEAgLTMyMjksMzkgKzMwMDgsMjQgQEAKICAgICAgKiBHZXRzIG9ubHkgcGFyZW50IG9mIGEgY2hpbGQgY29tcG9uZW50LCBidXQgbm90IG93bmVyIG9mIGEgd2luZG93LgogICAgICAqIAogICAgICAqIEByZXR1cm4gcGFyZW50IG9mIGNoaWxkIGNvbXBvbmVudCwgbnVsbCBpZiBjb21wb25lbnQgaXMgYSB0b3AtbGV2ZWwKLSAgICAgKiAoV2luZG93IGluc3RhbmNlKQorICAgICAqICAgICAgICAgKFdpbmRvdyBpbnN0YW5jZSkuCiAgICAgICovCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIENvbnRhaW5lciBnZXRSZWFsUGFyZW50KCkgewotICAgICAgICByZXR1cm4gKCEodGhpcyBpbnN0YW5jZW9mIFdpbmRvdykgPyBnZXRQYXJlbnQoKSA6IG51bGwpOwotICAgIH0KKyAgICAgKiBDb250YWluZXIgZ2V0UmVhbFBhcmVudCgpIHsgcmV0dXJuICghKHRoaXMgaW5zdGFuY2VvZiBXaW5kb3cpID8KKyAgICAgKiBnZXRQYXJlbnQoKSA6IG51bGwpOyB9IHB1YmxpYyBib29sZWFuIGlzRm9jdXNDeWNsZVJvb3QoQ29udGFpbmVyCisgICAgICogY29udGFpbmVyKSB7IHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeyByZXR1cm4gZ2V0Rm9jdXNDeWNsZVJvb3RBbmNlc3RvcigpCisgICAgICogPT0gY29udGFpbmVyOyB9IGZpbmFsbHkgeyB0b29sa2l0LnVubG9ja0FXVCgpOyB9IH0gcHVibGljIGJvb2xlYW4KKyAgICAgKiBpc0ZvY3VzT3duZXIoKSB7IHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeyByZXR1cm4KKyAgICAgKiBLZXlib2FyZEZvY3VzTWFuYWdlci5nZXRDdXJyZW50S2V5Ym9hcmRGb2N1c01hbmFnZXIoKS5nZXRGb2N1c093bmVyKCkgPT0KKyAgICAgKiB0aGlzOyB9IGZpbmFsbHkgeyB0b29sa2l0LnVubG9ja0FXVCgpOyB9IH0KKyAgICAgKi8KIAotICAgIHB1YmxpYyBib29sZWFuIGlzRm9jdXNDeWNsZVJvb3QoQ29udGFpbmVyIGNvbnRhaW5lcikgewotICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRGb2N1c0N5Y2xlUm9vdEFuY2VzdG9yKCkgPT0gY29udGFpbmVyOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRm9jdXNPd25lcigpIHsKLSAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gS2V5Ym9hcmRGb2N1c01hbmFnZXIuZ2V0Q3VycmVudEtleWJvYXJkRm9jdXNNYW5hZ2VyKCkuZ2V0Rm9jdXNPd25lcigpID09IHRoaXM7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICB9Ci0gICAgfQotICAgICovCi0gICAgCiAgICAgLyoqCiAgICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoaXMgQ29tcG9uZW50IGNhbiBiZSBmb2N1c2FibGUuCiAgICAgICogCiAgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGlzIENvbXBvbmVudCBjYW4gYmUgZm9jdXNhYmxlLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICogCi0gICAgICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgaXNGb2N1c2FibGUoKS4gCisgICAgICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgaXNGb2N1c2FibGUoKS4KICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBib29sZWFuIGlzRm9jdXNUcmF2ZXJzYWJsZSgpIHsKQEAgLTMzMDYsOCArMzA3MCw4IEBACiAgICAgLyoqCiAgICAgICogQ2hlY2tzIGlmIGZvcmVncm91bmQgY29sb3IgaXMgc2V0IGZvciB0aGUgQ29tcG9uZW50IG9yIG5vdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIGZvcmVncm91bmQgY29sb3IgaXMgc2V0IGZvciB0aGUgQ29tcG9uZW50LAotICAgICAqIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIGZvcmVncm91bmQgY29sb3IgaXMgc2V0IGZvciB0aGUgQ29tcG9uZW50LCBmYWxzZQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzRm9yZWdyb3VuZFNldCgpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC0zMzIxLDggKzMwODUsOCBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNvbXBvbmVudCBoYXMgYSBsaWdodHdlaWdodCBwZWVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBjb21wb25lbnQgaGFzIGEgbGlnaHR3ZWlnaHQgcGVlciwKLSAgICAgKiBmYWxzZSBpZiBpdCBoYXMgYSBuYXRpdmUgcGVlciBvciBubyBwZWVyLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBjb21wb25lbnQgaGFzIGEgbGlnaHR3ZWlnaHQgcGVlciwgZmFsc2UgaWYgaXQgaGFzIGEKKyAgICAgKiAgICAgICAgIG5hdGl2ZSBwZWVyIG9yIG5vIHBlZXIuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNMaWdodHdlaWdodCgpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC0zMzMzLDIyICszMDk3LDE4IEBACiAgICAgICAgIH0KICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGlzIENvbXBvbmVudCBpcyBzaG93bi4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgQ29tcG9uZW50IGlzIHNob3duLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNTaG93aW5nKCkgewotICAgICAgICAvLz8/P0FXVAorICAgICAgICAvLyA/Pz9BV1QKICAgICAgICAgLyoKLSAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gKGlzVmlzaWJsZSgpICYmIGlzRGlzcGxheWFibGUoKSAmJiAocGFyZW50ICE9IG51bGwpICYmIHBhcmVudC5pc1Nob3dpbmcoKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICB9Ci0gICAgICAgICovCisgICAgICAgICAqIHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeyByZXR1cm4gKGlzVmlzaWJsZSgpICYmIGlzRGlzcGxheWFibGUoKSAmJgorICAgICAgICAgKiAocGFyZW50ICE9IG51bGwpICYmIHBhcmVudC5pc1Nob3dpbmcoKSk7IH0gZmluYWxseSB7CisgICAgICAgICAqIHRvb2xraXQudW5sb2NrQVdUKCk7IH0KKyAgICAgICAgICovCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTMzNjksMTEgKzMxMjksMTEgQEAKICAgICAvKioKICAgICAgKiBEZXByZWNhdGVkOiByZXBsYWNlZCBieSBwcm9jZXNzS2V5RXZlbnQoS2V5RXZlbnQpIG1ldGhvZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXZ0IHRoZSBFdmVudC4KLSAgICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgY29kZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZXZ0CisgICAgICogICAgICAgICAgICB0aGUgRXZlbnQuCisgICAgICogQHBhcmFtIGtleQorICAgICAqICAgICAgICAgICAgdGhlIGtleSBjb2RlLgogICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgc3VjY2Vzc2Z1bC4KLSAgICAgKiAKICAgICAgKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSByZXBsYWNlZCBieSBwcm9jZXNzS2V5RXZlbnQoS2V5RXZlbnQpIG1ldGhvZC4KICAgICAgKi8KICAgICBARGVwcmVjYXRlZApAQCAtMzM4NiwxMSArMzE0NiwxMSBAQAogICAgIC8qKgogICAgICAqIERlcHJlY2F0ZWQ6IHJlcGxhY2VkIGJ5IHByb2Nlc3NLZXlFdmVudChLZXlFdmVudCkgbWV0aG9kLgogICAgICAqIAotICAgICAqIEBwYXJhbSBldnQgdGhlIEV2ZW50LgotICAgICAqIEBwYXJhbSBrZXkgdGhlIGtleSBjb2RlLgotICAgICAqIAorICAgICAqIEBwYXJhbSBldnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBFdmVudC4KKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUga2V5IGNvZGUuCiAgICAgICogQHJldHVybiB0cnVlLCBpZiBzdWNjZXNzZnVsLgotICAgICAqIAogICAgICAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IHByb2Nlc3NLZXlFdmVudChLZXlFdmVudCkgbWV0aG9kLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCkBAIC0zNDE4LDExICszMTc4LDExIEBACiAgICAgLyoqCiAgICAgICogRGVwcmVjYXRlZDogcmVwbGFjZWQgYnkgZ2V0Q29tcG9uZW50QXQoaW50LCBpbnQpIG1ldGhvZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgeCBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUuCi0gICAgICogCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUuCiAgICAgICogQHJldHVybiBUaGUgY29tcG9uZW50LgotICAgICAqIAogICAgICAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IGdldENvbXBvbmVudEF0KGludCwgaW50KSBtZXRob2QuCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKQEAgLTM0MzksMTMgKzMxOTksMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBEZXByZWNhdGVkOiByZXBsYWNlZCBieSBwcm9jZXNzRm9jdXNFdmVudChGb2N1c0V2ZW50KS4gCisgICAgICogRGVwcmVjYXRlZDogcmVwbGFjZWQgYnkgcHJvY2Vzc0ZvY3VzRXZlbnQoRm9jdXNFdmVudCkuCiAgICAgICogCi0gICAgICogQHBhcmFtIGV2dCB0aGUgRXZlbnQuCi0gICAgICogQHBhcmFtIHdoYXQgdGhlIE9iamVjdC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZXZ0CisgICAgICogICAgICAgICAgICB0aGUgRXZlbnQuCisgICAgICogQHBhcmFtIHdoYXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBPYmplY3QuCiAgICAgICogQHJldHVybiB0cnVlLCBpZiBzdWNjZXNzZnVsLgotICAgICAqIAogICAgICAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IHByb2Nlc3NGb2N1c0V2ZW50KEZvY3VzRXZlbnQpLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCkBAIC0zNDU4LDEyICszMjE4LDEzIEBACiAgICAgLyoqCiAgICAgICogRGVwcmVjYXRlZDogcmVwbGFjZWQgYnkgcHJvY2Vzc01vdXNlRXZlbnQoTW91c2VFdmVudCkgbWV0aG9kLgogICAgICAqIAotICAgICAqIEBwYXJhbSBldnQgdGhlIE1vdXNlRXZlbnQuCi0gICAgICogQHBhcmFtIHggdGhlIHggY29vcmRpbmF0ZS4KLSAgICAgKiBAcGFyYW0geSB0aGUgeSBjb29yZGluYXRlLgotICAgICAqIAorICAgICAqIEBwYXJhbSBldnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBNb3VzZUV2ZW50LgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlLgogICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgc3VjY2Vzc2Z1bC4KLSAgICAgKiAKICAgICAgKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSBwcm9jZXNzTW91c2VFdmVudChNb3VzZUV2ZW50KSBtZXRob2QuCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKQEAgLTM0NzYsMTIgKzMyMzcsMTMgQEAKICAgICAvKioKICAgICAgKiBEZXByZWNhdGVkOiByZXBsYWNlZCBieSBnZXRNaW5pbXVtU2l6ZSgpIG1ldGhvZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXZ0IHRoZSBFdmVudC4KLSAgICAgKiBAcGFyYW0geCB0aGUgeCBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUuCi0gICAgICogCisgICAgICogQHBhcmFtIGV2dAorICAgICAqICAgICAgICAgICAgdGhlIEV2ZW50LgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlLgogICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgc3VjY2Vzc2Z1bC4KLSAgICAgKiAKICAgICAgKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSBnZXRNaW5pbXVtU2l6ZSgpIG1ldGhvZC4KICAgICAgKi8KICAgICBARGVwcmVjYXRlZApAQCAtMzQ5NCwxMiArMzI1NiwxMyBAQAogICAgIC8qKgogICAgICAqIFJlcGxhY2VkIGJ5IHByb2Nlc3NNb3VzZUV2ZW50KE1vdXNlRXZlbnQpIG1ldGhvZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXZ0IHRoZSBFdmVudC4KLSAgICAgKiBAcGFyYW0geCB0aGUgeCBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUuCi0gICAgICogCisgICAgICogQHBhcmFtIGV2dAorICAgICAqICAgICAgICAgICAgdGhlIEV2ZW50LgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlLgogICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgc3VjY2Vzc2Z1bC4KLSAgICAgKiAKICAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSBwcm9jZXNzTW91c2VFdmVudChNb3VzZUV2ZW50KSBtZXRob2QuCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKQEAgLTM1MTIsMTIgKzMyNzUsMTMgQEAKICAgICAvKioKICAgICAgKiBSZXBsYWNlZCBieSBwcm9jZXNzTW91c2VFdmVudChNb3VzZUV2ZW50KSBtZXRob2QuCiAgICAgICogCi0gICAgICogQHBhcmFtIGV2dCB0aGUgRXZlbnQuCi0gICAgICogQHBhcmFtIHggdGhlIHggY29vcmRpbmF0ZS4KLSAgICAgKiBAcGFyYW0geSB0aGUgeSBjb29yZGluYXRlLgotICAgICAqIAorICAgICAqIEBwYXJhbSBldnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBFdmVudC4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZS4KICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHN1Y2Nlc3NmdWwuCi0gICAgICogCiAgICAgICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgcHJvY2Vzc01vdXNlRXZlbnQoTW91c2VFdmVudCkgbWV0aG9kLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCkBAIC0zNTMwLDEyICszMjk0LDEzIEBACiAgICAgLyoqCiAgICAgICogUmVwbGFjZWQgYnkgcHJvY2Vzc01vdXNlRXZlbnQoTW91c2VFdmVudCkgbWV0aG9kLgogICAgICAqIAotICAgICAqIEBwYXJhbSBldnQgdGhlIEV2ZW50LgotICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUuCi0gICAgICogQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZXZ0CisgICAgICogICAgICAgICAgICB0aGUgRXZlbnQuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUuCiAgICAgICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgcHJvY2Vzc01vdXNlRXZlbnQoTW91c2VFdmVudCkgbWV0aG9kLgotICAgICAqIAogICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgc3VjY2Vzc2Z1bC4KICAgICAgKi8KICAgICBARGVwcmVjYXRlZApAQCAtMzU0OCwxMiArMzMxMywxMyBAQAogICAgIC8qKgogICAgICAqIFJlcGxhY2VkIGJ5IHByb2Nlc3NNb3VzZUV2ZW50KE1vdXNlRXZlbnQpIG1ldGhvZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXZ0IHRoZSBFdmVudC4KLSAgICAgKiBAcGFyYW0geCB0aGUgeCBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUuCi0gICAgICogCisgICAgICogQHBhcmFtIGV2dAorICAgICAqICAgICAgICAgICAgdGhlIEV2ZW50LgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlLgogICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgc3VjY2Vzc2Z1bC4KLSAgICAgKiAKICAgICAgKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSBwcm9jZXNzTW91c2VFdmVudChNb3VzZUV2ZW50KSBtZXRob2QuCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKQEAgLTM1NjYsOSArMzMzMiwxMCBAQAogICAgIC8qKgogICAgICAqIERlcHJlY2F0ZWQ6IHJlcGxhY2VkIGJ5IHNldExvY2F0aW9uKGludCwgaW50KSBtZXRob2QuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIHggY29vcmRpbmF0ZXMuCi0gICAgICogQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZXMuCi0gICAgICogCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGVzLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlcy4KICAgICAgKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSBzZXRMb2NhdGlvbihpbnQsIGludCkgbWV0aG9kLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCkBAIC0zNTgyLDE4ICszMzQ5LDEyIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLz8/P0FXVAorICAgIC8vID8/P0FXVAogICAgIC8qCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgdm9pZCBuZXh0Rm9jdXMoKSB7Ci0gICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdHJhbnNmZXJGb2N1cyhLZXlib2FyZEZvY3VzTWFuYWdlci5GT1JXQVJEX1RSQVZFUlNBTF9LRVlTKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKi8KKyAgICAgKiBARGVwcmVjYXRlZCBwdWJsaWMgdm9pZCBuZXh0Rm9jdXMoKSB7IHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeworICAgICAqIHRyYW5zZmVyRm9jdXMoS2V5Ym9hcmRGb2N1c01hbmFnZXIuRk9SV0FSRF9UUkFWRVJTQUxfS0VZUyk7IH0gZmluYWxseSB7CisgICAgICogdG9vbGtpdC51bmxvY2tBV1QoKTsgfSB9CisgICAgICovCiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb21wb25lbnQncyBzdGF0ZS4KQEAgLTM2MDMsMTAgKzMzNjQsOCBAQAogICAgIHByb3RlY3RlZCBTdHJpbmcgcGFyYW1TdHJpbmcoKSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIFRoZSBmb3JtYXQgaXMgYmFzZWQgb24gMS41IHJlbGVhc2UgYmVoYXZpb3Igd2hpY2ggY2FuIGJlIHJldmVhbGVkIGJ5Ci0gICAgICAgICAqIHRoZSBmb2xsb3dpbmcgY29kZToKLSAgICAgICAgICogCi0gICAgICAgICAqIENvbXBvbmVudCBjID0gbmV3IENvbXBvbmVudCgpe307IGMuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAqIFN5c3RlbS5vdXQucHJpbnRsbihjKTsKKyAgICAgICAgICogdGhlIGZvbGxvd2luZyBjb2RlOiBDb21wb25lbnQgYyA9IG5ldyBDb21wb25lbnQoKXt9OworICAgICAgICAgKiBjLnNldFZpc2libGUoZmFsc2UpOyBTeXN0ZW0ub3V0LnByaW50bG4oYyk7CiAgICAgICAgICAqLwogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKICAgICAgICAgdHJ5IHsKQEAgLTM2MjQsMzUgKzMzODMsMjcgQEAKICAgICAgICAgaWYgKGhhbmRsZWQpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIC8vPz8/QVdUCisgICAgICAgIC8vID8/P0FXVAogICAgICAgICAvKgotCi0gICAgICAgIC8vIHByb3BhZ2F0ZSBub24taGFuZGxlZCBldmVudHMgdXAgdG8gcGFyZW50Ci0gICAgICAgIENvbXBvbmVudCBwYXIgPSBwYXJlbnQ7Ci0gICAgICAgIC8vIHRyeSB0byBjYWxsIHBvc3RFdmVudCBvbmx5IG9uIGNvbXBvbmVudHMgd2hpY2gKLSAgICAgICAgLy8gb3ZlcnJpZGUgYW55IG9mIGRlcHJlY2F0ZWQgbWV0aG9kIGhhbmRsZXJzCi0gICAgICAgIC8vIHdoaWxlIChwYXIgIT0gbnVsbCAmJiAhcGFyLmRlcHJlY2F0ZWRFdmVudEhhbmRsZXIpIHsKLSAgICAgICAgLy8gcGFyID0gcGFyLnBhcmVudDsKLSAgICAgICAgLy8gfQotICAgICAgICAvLyB0cmFuc2xhdGUgZXZlbnQgY29vcmRpbmF0ZXMgYmVmb3JlIHBvc3RpbmcgaXQgdG8gcGFyZW50Ci0gICAgICAgIGlmIChwYXIgIT0gbnVsbCkgewotICAgICAgICAgICAgZXZ0LnRyYW5zbGF0ZSh4LCB5KTsKLSAgICAgICAgICAgIHBhci5wb3N0RXZlbnQoZXZ0KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgKi8KKyAgICAgICAgICogLy8gcHJvcGFnYXRlIG5vbi1oYW5kbGVkIGV2ZW50cyB1cCB0byBwYXJlbnQgQ29tcG9uZW50IHBhciA9IHBhcmVudDsKKyAgICAgICAgICogLy8gdHJ5IHRvIGNhbGwgcG9zdEV2ZW50IG9ubHkgb24gY29tcG9uZW50cyB3aGljaCAvLyBvdmVycmlkZSBhbnkgb2YKKyAgICAgICAgICogZGVwcmVjYXRlZCBtZXRob2QgaGFuZGxlcnMgLy8gd2hpbGUgKHBhciAhPSBudWxsICYmCisgICAgICAgICAqICFwYXIuZGVwcmVjYXRlZEV2ZW50SGFuZGxlcikgeyAvLyBwYXIgPSBwYXIucGFyZW50OyAvLyB9IC8vIHRyYW5zbGF0ZQorICAgICAgICAgKiBldmVudCBjb29yZGluYXRlcyBiZWZvcmUgcG9zdGluZyBpdCB0byBwYXJlbnQgaWYgKHBhciAhPSBudWxsKSB7CisgICAgICAgICAqIGV2dC50cmFuc2xhdGUoeCwgeSk7IHBhci5wb3N0RXZlbnQoZXZ0KTsgfQorICAgICAgICAgKi8KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByZXBhcmVzIGFuIGltYWdlIGZvciByZW5kZXJpbmcgb24gdGhlIENvbXBvbmVudC4gCi0gICAgICogIAotICAgICAqIEBwYXJhbSBpbWFnZSB0aGUgSW1hZ2UgdG8gYmUgcHJlcGFyZWQuCi0gICAgICogQHBhcmFtIG9ic2VydmVyIHRoZSBJbWFnZU9ic2VydmVyIG9iamVjdCB0byBiZSBub3RpZmllZCBhcyBzb29uIGFzIAotICAgICAqIHRoZSBpbWFnZSBpcyBwcmVwYXJlZC4KKyAgICAgKiBQcmVwYXJlcyBhbiBpbWFnZSBmb3IgcmVuZGVyaW5nIG9uIHRoZSBDb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBpbWFnZSBoYXMgYmVlbiBmdWxseSBwcmVwYXJlZCwKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIGltYWdlCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2UgdG8gYmUgcHJlcGFyZWQuCisgICAgICogQHBhcmFtIG9ic2VydmVyCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VPYnNlcnZlciBvYmplY3QgdG8gYmUgbm90aWZpZWQgYXMgc29vbiBhcyB0aGUgaW1hZ2UKKyAgICAgKiAgICAgICAgICAgIGlzIHByZXBhcmVkLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgaW1hZ2UgaGFzIGJlZW4gZnVsbHkgcHJlcGFyZWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBwcmVwYXJlSW1hZ2UoSW1hZ2UgaW1hZ2UsIEltYWdlT2JzZXJ2ZXIgb2JzZXJ2ZXIpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC0zNjY0LDE3ICszNDE1LDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJlcGFyZXMgYW4gaW1hZ2UgZm9yIHJlbmRlcmluZyBvbiB0aGUgQ29tcG9uZW50IHdpdGggdGhlCi0gICAgICogc3BlY2lmaWVkIHdpZHRoLCBoZWlnaHQsIGFuZCBJbWFnZU9ic2VydmVyLiAKKyAgICAgKiBQcmVwYXJlcyBhbiBpbWFnZSBmb3IgcmVuZGVyaW5nIG9uIHRoZSBDb21wb25lbnQgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogd2lkdGgsIGhlaWdodCwgYW5kIEltYWdlT2JzZXJ2ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGltYWdlIHRoZSBJbWFnZSB0byBiZSBwcmVwYXJlZC4KLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHNjYWxlZCBpbWFnZS4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2Ygc2NhbGVkIGhlaWdodC4KLSAgICAgKiBAcGFyYW0gb2JzZXJ2ZXIgdGhlIEltYWdlT2JzZXJ2ZXIgb2JqZWN0IHRvIGJlIG5vdGlmaWVkIGFzIHNvb24gYXMgCi0gICAgICogdGhlIGltYWdlIGlzIHByZXBhcmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgaW1hZ2UgaXMgYmVlbiBmdWxseSBwcmVwYXJlZCwKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIGltYWdlCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2UgdG8gYmUgcHJlcGFyZWQuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2Ygc2NhbGVkIGltYWdlLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2Ygc2NhbGVkIGhlaWdodC4KKyAgICAgKiBAcGFyYW0gb2JzZXJ2ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZU9ic2VydmVyIG9iamVjdCB0byBiZSBub3RpZmllZCBhcyBzb29uIGFzIHRoZSBpbWFnZQorICAgICAqICAgICAgICAgICAgaXMgcHJlcGFyZWQuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBpbWFnZSBpcyBiZWVuIGZ1bGx5IHByZXBhcmVkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gcHJlcGFyZUltYWdlKEltYWdlIGltYWdlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIEltYWdlT2JzZXJ2ZXIgb2JzZXJ2ZXIpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC0zNjkxLDE2ICszNDQ0LDE0IEBACiAgICAgcHVibGljIHZvaWQgcmVtb3ZlTm90aWZ5KCkgewogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vPz8/QVdUCisgICAgICAgICAgICAvLyA/Pz9BV1QKICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICBpZiAoZHJvcFRhcmdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZHJvcFRhcmdldC5yZW1vdmVOb3RpZnkocGVlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqLworICAgICAgICAgICAgICogaWYgKGRyb3BUYXJnZXQgIT0gbnVsbCkgeyBkcm9wVGFyZ2V0LnJlbW92ZU5vdGlmeShwZWVyKTsgfQorICAgICAgICAgICAgICovCiAgICAgICAgICAgICBwcmVwYXJlNEhpZXJhcmNoeUNoYW5nZSgpOwotICAgICAgICAgICAgLy8vPz8/QVdUOiBtb3ZlRm9jdXMoKTsKKyAgICAgICAgICAgIC8vIC8/Pz9BV1Q6IG1vdmVGb2N1cygpOwogICAgICAgICAgICAgYmVoYXZpb3VyLnJlbW92ZU5vdGlmeSgpOwotICAgICAgICAgICAgLy8/Pz9BV1Q6IGZpbmlzaEhpZXJhcmNoeUNoYW5nZSh0aGlzLCBwYXJlbnQsIDApOworICAgICAgICAgICAgLy8gPz8/QVdUOiBmaW5pc2hIaWVyYXJjaHlDaGFuZ2UodGhpcywgcGFyZW50LCAwKTsKICAgICAgICAgICAgIHJlbW92ZU5vdGlmeUlucHV0Q29udGV4dCgpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKQEAgLTM3MDgsNyArMzQ1OSw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2FsbHMgSW5wdXRDb250ZXh0LnJlbW92ZU5vdGlmeQorICAgICAqIENhbGxzIElucHV0Q29udGV4dC5yZW1vdmVOb3RpZnkuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZU5vdGlmeUlucHV0Q29udGV4dCgpIHsKICAgICAgICAgaWYgKCFpbnB1dE1ldGhvZHNFbmFibGVkKSB7CkBAIC0zNzE2LDcgKzM0NjcsNyBAQAogICAgICAgICB9CiAgICAgICAgIElucHV0Q29udGV4dCBpYyA9IGdldElucHV0Q29udGV4dCgpOwogICAgICAgICBpZiAoaWMgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8/Pz9BV1Q6IGljLnJlbW92ZU5vdGlmeSh0aGlzKTsKKyAgICAgICAgICAgIC8vID8/P0FXVDogaWMucmVtb3ZlTm90aWZ5KHRoaXMpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zNzI2LDQ2ICszNDc3LDI1IEBACiAgICAgICogc2V0Rm9jdXNhYmxlKGZhbHNlKSBpcyBjYWxsZWQsIGFuZCB0aGVyZWZvcmUgYXV0b21hdGljIGZvcndhcmQgZm9jdXMKICAgICAgKiB0cmF2ZXJzYWwgaXMgbmVjZXNzYXJ5CiAgICAgICovCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIHZvaWQgbW92ZUZvY3VzKCkgewotICAgICAgICAvLyBkb24ndCB1c2UgdHJhbnNmZXJGb2N1cygpLCBidXQgcXVlcnkgZm9jdXMgdHJhdmVyc2FsIHBvbGljeSBkaXJlY3RseQotICAgICAgICAvLyBhbmQgaWYgaXQgcmV0dXJucyBudWxsLCB0cmFuc2ZlciBmb2N1cyB1cCBjeWNsZQotICAgICAgICAvLyBhbmQgZmluZCBuZXh0IGZvY3VzYWJsZSBjb21wb25lbnQgdGhlcmUKLSAgICAgICAgS2V5Ym9hcmRGb2N1c01hbmFnZXIga2ZtID0gS2V5Ym9hcmRGb2N1c01hbmFnZXIuZ2V0Q3VycmVudEtleWJvYXJkRm9jdXNNYW5hZ2VyKCk7Ci0gICAgICAgIENvbnRhaW5lciByb290ID0ga2ZtLmdldEN1cnJlbnRGb2N1c0N5Y2xlUm9vdCgpOwotICAgICAgICBDb21wb25lbnQgbmV4dENvbXAgPSB0aGlzOwotICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSAhaXNGb2N1c093bmVyKCk7Ci0gICAgICAgIHdoaWxlICghc3VjY2VzcykgewotICAgICAgICAgICAgaWYgKHJvb3QgIT0gbmV4dENvbXAuZ2V0Rm9jdXNDeWNsZVJvb3RBbmNlc3RvcigpKSB7Ci0gICAgICAgICAgICAgICAgLy8gY29tcG9uZW50IHdhcyBwcm9iYWJseSByZW1vdmVkIGZyb20gY29udGFpbmVyCi0gICAgICAgICAgICAgICAgLy8gc28gZm9jdXMgd2lsbCBiZSBsb3N0IGluIHNvbWUgdGltZQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5leHRDb21wID0gcm9vdC5nZXRGb2N1c1RyYXZlcnNhbFBvbGljeSgpLmdldENvbXBvbmVudEFmdGVyKHJvb3QsIG5leHRDb21wKTsKLSAgICAgICAgICAgIGlmIChuZXh0Q29tcCA9PSB0aGlzKSB7Ci0gICAgICAgICAgICAgICAgbmV4dENvbXAgPSBudWxsOyAvLyBhdm9pZCBsb29waW5nCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobmV4dENvbXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBuZXh0Q29tcC5yZXF1ZXN0Rm9jdXNJbldpbmRvdygpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBuZXh0Q29tcCA9IHJvb3Q7Ci0gICAgICAgICAgICAgICAgcm9vdCA9IHJvb3QuZ2V0Rm9jdXNDeWNsZVJvb3RBbmNlc3RvcigpOwotICAgICAgICAgICAgICAgIC8vIGlmIG5vIGFjY2VwdGFibGUgY29tcG9uZW50IGlzIGZvdW5kIGF0IGFsbCAtIGNsZWFyIGdsb2JhbAotICAgICAgICAgICAgICAgIC8vIGZvY3VzIG93bmVyCi0gICAgICAgICAgICAgICAgaWYgKHJvb3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobmV4dENvbXAgaW5zdGFuY2VvZiBXaW5kb3cpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFdpbmRvdyB3bmQgPSAoV2luZG93KSBuZXh0Q29tcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHduZC5zZXRGb2N1c093bmVyKG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgd25kLnNldFJlcXVlc3RlZEZvY3VzKG51bGwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGtmbS5jbGVhckdsb2JhbEZvY3VzT3duZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAqLworICAgICAqIHZvaWQgbW92ZUZvY3VzKCkgeyAvLyBkb24ndCB1c2UgdHJhbnNmZXJGb2N1cygpLCBidXQgcXVlcnkgZm9jdXMKKyAgICAgKiB0cmF2ZXJzYWwgcG9saWN5IGRpcmVjdGx5IC8vIGFuZCBpZiBpdCByZXR1cm5zIG51bGwsIHRyYW5zZmVyIGZvY3VzIHVwCisgICAgICogY3ljbGUgLy8gYW5kIGZpbmQgbmV4dCBmb2N1c2FibGUgY29tcG9uZW50IHRoZXJlIEtleWJvYXJkRm9jdXNNYW5hZ2VyIGtmbQorICAgICAqID0gS2V5Ym9hcmRGb2N1c01hbmFnZXIuZ2V0Q3VycmVudEtleWJvYXJkRm9jdXNNYW5hZ2VyKCk7IENvbnRhaW5lciByb290ID0KKyAgICAgKiBrZm0uZ2V0Q3VycmVudEZvY3VzQ3ljbGVSb290KCk7IENvbXBvbmVudCBuZXh0Q29tcCA9IHRoaXM7IGJvb2xlYW4KKyAgICAgKiBzdWNjZXNzID0gIWlzRm9jdXNPd25lcigpOyB3aGlsZSAoIXN1Y2Nlc3MpIHsgaWYgKHJvb3QgIT0KKyAgICAgKiBuZXh0Q29tcC5nZXRGb2N1c0N5Y2xlUm9vdEFuY2VzdG9yKCkpIHsgLy8gY29tcG9uZW50IHdhcyBwcm9iYWJseSByZW1vdmVkCisgICAgICogZnJvbSBjb250YWluZXIgLy8gc28gZm9jdXMgd2lsbCBiZSBsb3N0IGluIHNvbWUgdGltZSByZXR1cm47IH0gbmV4dENvbXAgPQorICAgICAqIHJvb3QuZ2V0Rm9jdXNUcmF2ZXJzYWxQb2xpY3koKS5nZXRDb21wb25lbnRBZnRlcihyb290LCBuZXh0Q29tcCk7IGlmCisgICAgICogKG5leHRDb21wID09IHRoaXMpIHsgbmV4dENvbXAgPSBudWxsOyAvLyBhdm9pZCBsb29waW5nIH0gaWYgKG5leHRDb21wICE9CisgICAgICogbnVsbCkgeyBzdWNjZXNzID0gbmV4dENvbXAucmVxdWVzdEZvY3VzSW5XaW5kb3coKTsgfSBlbHNlIHsgbmV4dENvbXAgPQorICAgICAqIHJvb3Q7IHJvb3QgPSByb290LmdldEZvY3VzQ3ljbGVSb290QW5jZXN0b3IoKTsgLy8gaWYgbm8gYWNjZXB0YWJsZQorICAgICAqIGNvbXBvbmVudCBpcyBmb3VuZCBhdCBhbGwgLSBjbGVhciBnbG9iYWwgLy8gZm9jdXMgb3duZXIgaWYgKHJvb3QgPT0gbnVsbCkKKyAgICAgKiB7IGlmIChuZXh0Q29tcCBpbnN0YW5jZW9mIFdpbmRvdykgeyBXaW5kb3cgd25kID0gKFdpbmRvdykgbmV4dENvbXA7CisgICAgICogd25kLnNldEZvY3VzT3duZXIobnVsbCk7IHduZC5zZXRSZXF1ZXN0ZWRGb2N1cyhudWxsKTsgfQorICAgICAqIGtmbS5jbGVhckdsb2JhbEZvY3VzT3duZXIoKTsgcmV0dXJuOyB9IH0gfSB9CisgICAgICovCiAKICAgICAvKioKICAgICAgKiBGb3IgQ29udGFpbmVyIHRoZXJlJ3MgYSBkaWZmZXJlbmNlIGJldHdlZW4gbW92aW5nIGZvY3VzIHdoZW4gYmVpbmcgbWFkZQpAQCAtMzc3NCw4MCArMzUwNCw3MyBAQAogICAgICAqIHNldFZpc2libGUoKSBpcyBub3QgY2FsbGVkLgogICAgICAqLwogICAgIHZvaWQgbW92ZUZvY3VzT25IaWRlKCkgewotICAgICAgICAvLz8/P0FXVDogbW92ZUZvY3VzKCk7CisgICAgICAgIC8vID8/P0FXVDogbW92ZUZvY3VzKCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyB0aGUgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHJlZ2lzdGVyZWQgZm9yIHRoaXMgY29tcG9uZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lci4KKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewogICAgICAgICBnZXRQcm9wZXJ0eUNoYW5nZVN1cHBvcnQoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgcmVnaXN0ZXJlZCBmb3QgdGhpcyBjb21wb25lbnQgCi0gICAgICogZm9yIHRoZSBzcGVjaWZpZWQgcHJvcGVydHl5LgorICAgICAqIFJlbW92ZXMgdGhlIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciByZWdpc3RlcmVkIGZvdCB0aGlzIGNvbXBvbmVudCBmb3IKKyAgICAgKiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5eS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIHRoZSBwcm9wZXJ0eSBuYW1lLgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lci4KKyAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lCisgICAgICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZS4KKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwKLSAgICAgICAgICAgIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKICAgICAgICAgZ2V0UHJvcGVydHlDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIGxpc3RlbmVyKTsKICAgICB9CiAKLQogICAgIC8qKgotICAgICAqIFJlcGFpbnRzIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ2xlIG9mIHRoaXMgY29tcG9uZW50IHdpdGhpbiAKLSAgICAgKiB0bSBtaWxsaXNlY29uZHMuCisgICAgICogUmVwYWludHMgdGhlIHNwZWNpZmllZCByZWN0YW5nbGUgb2YgdGhpcyBjb21wb25lbnQgd2l0aGluIHRtCisgICAgICogbWlsbGlzZWNvbmRzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0bSB0aGUgdGltZSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHVwZGF0aW5nLgotICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUgb2YgUmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUgb2YgUmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgUmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiBSZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHRtCisgICAgICogICAgICAgICAgICB0aGUgdGltZSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHVwZGF0aW5nLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIFJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiBSZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgUmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgUmVjdGFuZ2xlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlcGFpbnQobG9uZyB0bSwgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgLy8/Pz9BV1QKKyAgICAgICAgLy8gPz8/QVdUCiAgICAgICAgIC8qCi0gICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDAgfHwgKHJlZHJhd01hbmFnZXIgPT0gbnVsbCkgfHwgIWlzU2hvd2luZygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJlaGF2aW91ciBpbnN0YW5jZW9mIExXQmVoYXZpb3IpIHsKLSAgICAgICAgICAgICAgICBpZiAocGFyZW50ID09IG51bGwgfHwgIXBhcmVudC52aXNpYmxlIHx8ICFwYXJlbnQuYmVoYXZpb3VyLmlzRGlzcGxheWFibGUoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZXBhaW50UmVnaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwYWludFJlZ2lvbiA9IG5ldyBNdWx0aVJlY3RBcmVhKG5ldyBSZWN0YW5nbGUoeCwgeSwgd2lkdGgsIGhlaWdodCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXBhaW50UmVnaW9uLmludGVyc2VjdChuZXcgUmVjdGFuZ2xlKDAsIDAsIHRoaXMudywgdGhpcy5oKSk7Ci0gICAgICAgICAgICAgICAgcmVwYWludFJlZ2lvbi50cmFuc2xhdGUodGhpcy54LCB0aGlzLnkpOwotICAgICAgICAgICAgICAgIHBhcmVudC5yZXBhaW50UmVnaW9uID0gcmVwYWludFJlZ2lvbjsKLSAgICAgICAgICAgICAgICByZXBhaW50UmVnaW9uID0gbnVsbDsKLSAgICAgICAgICAgICAgICBwYXJlbnQucmVwYWludCh0bSwgeCArIHRoaXMueCwgeSArIHRoaXMueSwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChyZXBhaW50UmVnaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVkcmF3TWFuYWdlci5hZGRVcGRhdGVSZWdpb24odGhpcywgcmVwYWludFJlZ2lvbik7Ci0gICAgICAgICAgICAgICAgICAgIHJlcGFpbnRSZWdpb24gPSBudWxsOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZHJhd01hbmFnZXIuYWRkVXBkYXRlUmVnaW9uKHRoaXMsIG5ldyBSZWN0YW5nbGUoeCwgeSwgd2lkdGgsIGhlaWdodCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0b29sa2l0LmdldFN5c3RlbUV2ZW50UXVldWVDb3JlKCkubm90aWZ5RXZlbnRNb25pdG9yKHRvb2xraXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgfQotICAgICAgICAqLworICAgICAgICAgKiB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDAgfHwKKyAgICAgICAgICogKHJlZHJhd01hbmFnZXIgPT0gbnVsbCkgfHwgIWlzU2hvd2luZygpKSB7IHJldHVybjsgfSBpZiAoYmVoYXZpb3VyCisgICAgICAgICAqIGluc3RhbmNlb2YgTFdCZWhhdmlvcikgeyBpZiAocGFyZW50ID09IG51bGwgfHwgIXBhcmVudC52aXNpYmxlIHx8CisgICAgICAgICAqICFwYXJlbnQuYmVoYXZpb3VyLmlzRGlzcGxheWFibGUoKSkgeyByZXR1cm47IH0gaWYgKHJlcGFpbnRSZWdpb24gPT0KKyAgICAgICAgICogbnVsbCkgeyByZXBhaW50UmVnaW9uID0gbmV3IE11bHRpUmVjdEFyZWEobmV3IFJlY3RhbmdsZSh4LCB5LCB3aWR0aCwKKyAgICAgICAgICogaGVpZ2h0KSk7IH0gcmVwYWludFJlZ2lvbi5pbnRlcnNlY3QobmV3IFJlY3RhbmdsZSgwLCAwLCB0aGlzLncsCisgICAgICAgICAqIHRoaXMuaCkpOyByZXBhaW50UmVnaW9uLnRyYW5zbGF0ZSh0aGlzLngsIHRoaXMueSk7CisgICAgICAgICAqIHBhcmVudC5yZXBhaW50UmVnaW9uID0gcmVwYWludFJlZ2lvbjsgcmVwYWludFJlZ2lvbiA9IG51bGw7CisgICAgICAgICAqIHBhcmVudC5yZXBhaW50KHRtLCB4ICsgdGhpcy54LCB5ICsgdGhpcy55LCB3aWR0aCwgaGVpZ2h0KTsgfSBlbHNlIHsKKyAgICAgICAgICogaWYgKHJlcGFpbnRSZWdpb24gIT0gbnVsbCkgeyByZWRyYXdNYW5hZ2VyLmFkZFVwZGF0ZVJlZ2lvbih0aGlzLAorICAgICAgICAgKiByZXBhaW50UmVnaW9uKTsgcmVwYWludFJlZ2lvbiA9IG51bGw7IH0gZWxzZSB7CisgICAgICAgICAqIHJlZHJhd01hbmFnZXIuYWRkVXBkYXRlUmVnaW9uKHRoaXMsIG5ldyBSZWN0YW5nbGUoeCwgeSwgd2lkdGgsCisgICAgICAgICAqIGhlaWdodCkpOyB9CisgICAgICAgICAqIHRvb2xraXQuZ2V0U3lzdGVtRXZlbnRRdWV1ZUNvcmUoKS5ub3RpZnlFdmVudE1vbml0b3IodG9vbGtpdCk7IH0gfQorICAgICAgICAgKiBmaW5hbGx5IHsgdG9vbGtpdC51bmxvY2tBV1QoKTsgfQorICAgICAgICAgKi8KICAgICB9CiAKICAgICAvKioKICAgICAgKiBQb3N0IGV2ZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBlIHRoZSBlCisgICAgICogQHBhcmFtIGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlLgogICAgICAqLwogICAgIHZvaWQgcG9zdEV2ZW50KEFXVEV2ZW50IGUpIHsKICAgICAgICAgZ2V0VG9vbGtpdCgpLmdldFN5c3RlbUV2ZW50UXVldWVJbXBsKCkucG9zdEV2ZW50KGUpOwpAQCAtMzg1NiwxMCArMzU3OSwxNCBAQAogICAgIC8qKgogICAgICAqIFJlcGFpbnRzIHRoZSBzcGVjaWZpZWQgUmVjdGFuZ2xlIG9mIHRoaXMgQ29tcG9uZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUgb2YgUmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUgb2YgUmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgUmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiBSZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgUmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIFJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiBSZWN0YW5nbGUuCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiBSZWN0YW5nbGUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVwYWludChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKQEAgLTM4ODcsNyArMzYxNCw4IEBACiAgICAgLyoqCiAgICAgICogUmVwYWludHMgdGhlIGNvbXBvbmVudCB3aXRoaW4gdG0gbWlsbGlzZWNvbmRzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0bSB0aGUgdGltZSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHVwZGF0aW5nLgorICAgICAqIEBwYXJhbSB0bQorICAgICAqICAgICAgICAgICAgdGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSB1cGRhdGluZy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZXBhaW50KGxvbmcgdG0pIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC0zODk5LDI5ICszNjI3LDI4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVxdWVzdHMgdGhhdCB0aGlzIENvbXBvbmVudCBnZXQgdGhlIGlucHV0IGZvY3VzIHRlbXBvcmFyaWx5LiAKLSAgICAgKiBUaGlzIGNvbXBvbmVudCBtdXN0IGJlIGRpc3BsYXlhYmxlLCB2aXNpYmxlLCBhbmQgZm9jdXNhYmxlLgorICAgICAqIFJlcXVlc3RzIHRoYXQgdGhpcyBDb21wb25lbnQgZ2V0IHRoZSBpbnB1dCBmb2N1cyB0ZW1wb3JhcmlseS4gVGhpcworICAgICAqIGNvbXBvbmVudCBtdXN0IGJlIGRpc3BsYXlhYmxlLCB2aXNpYmxlLCBhbmQgZm9jdXNhYmxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0ZW1wb3JhcnkgdGhpcyBwYXJhbWV0ZXIgaXMgdHJ1ZSBpZiB0aGUgZm9jdXMgY2hhbmdlIAotICAgICAqIGlzIHRlbXBvcmFyeSwgd2hlbiB0aGUgd2luZG93IGxvc2VzIHRoZSBmb2N1cy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZvY3VzIGNoYW5nZSByZXF1ZXN0IGlzIHN1Y2NlZWRlZCwKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIHRlbXBvcmFyeQorICAgICAqICAgICAgICAgICAgdGhpcyBwYXJhbWV0ZXIgaXMgdHJ1ZSBpZiB0aGUgZm9jdXMgY2hhbmdlIGlzIHRlbXBvcmFyeSwgd2hlbgorICAgICAqICAgICAgICAgICAgdGhlIHdpbmRvdyBsb3NlcyB0aGUgZm9jdXMuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBmb2N1cyBjaGFuZ2UgcmVxdWVzdCBpcyBzdWNjZWVkZWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZXF1ZXN0Rm9jdXMoYm9vbGVhbiB0ZW1wb3JhcnkpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLz8/P0FXVDogcmV0dXJuIHJlcXVlc3RGb2N1c0ltcGwodGVtcG9yYXJ5LCB0cnVlLCBmYWxzZSk7CisgICAgICAgICAgICAvLyA/Pz9BV1Q6IHJldHVybiByZXF1ZXN0Rm9jdXNJbXBsKHRlbXBvcmFyeSwgdHJ1ZSwgZmFsc2UpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKICAgICAgICAgfQotICAgICAgICAvLz8/P0FXVAorICAgICAgICAvLyA/Pz9BV1QKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlcXVlc3RzIHRoYXQgdGhpcyBDb21wb25lbnQgZ2V0IHRoZSBpbnB1dCBmb2N1cy4gCi0gICAgICogVGhpcyBjb21wb25lbnQgbXVzdCBiZSBkaXNwbGF5YWJsZSwgdmlzaWJsZSwgYW5kIGZvY3VzYWJsZS4KKyAgICAgKiBSZXF1ZXN0cyB0aGF0IHRoaXMgQ29tcG9uZW50IGdldCB0aGUgaW5wdXQgZm9jdXMuIFRoaXMgY29tcG9uZW50IG11c3QgYmUKKyAgICAgKiBkaXNwbGF5YWJsZSwgdmlzaWJsZSwgYW5kIGZvY3VzYWJsZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZXF1ZXN0Rm9jdXMoKSB7CiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwpAQCAtMzkzMiw1NSArMzY1OSwzNSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIHByb3RlY3RlZCBib29sZWFuIHJlcXVlc3RGb2N1c0luV2luZG93KGJvb2xlYW4gdGVtcG9yYXJ5KSB7Ci0gICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgV2luZG93IHduZCA9IGdldFdpbmRvd0FuY2VzdG9yKCk7Ci0gICAgICAgICAgICBpZiAoKHduZCA9PSBudWxsKSB8fCAhd25kLmlzRm9jdXNlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3RGb2N1c0ltcGwodGVtcG9yYXJ5LCBmYWxzZSwgZmFsc2UpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGJvb2xlYW4gcmVxdWVzdEZvY3VzSW1wbChib29sZWFuIHRlbXBvcmFyeSwgYm9vbGVhbiBjcm9zc1dpbmRvdywgYm9vbGVhbiByZWplY3Rpb25SZWNvdmVyeSkgewotICAgICAgICBpZiAoIXJlamVjdGlvblJlY292ZXJ5ICYmIGlzRm9jdXNPd25lcigpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBXaW5kb3cgd25kID0gZ2V0V2luZG93QW5jZXN0b3IoKTsKLSAgICAgICAgQ29udGFpbmVyIHBhciA9IGdldFJlYWxQYXJlbnQoKTsKLSAgICAgICAgaWYgKChwYXIgIT0gbnVsbCkgJiYgcGFyLmlzUmVtb3ZlZCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghaXNTaG93aW5nKCkgfHwgIWlzRm9jdXNhYmxlKCkgfHwgIXduZC5pc0ZvY3VzYWJsZVdpbmRvdygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEtleWJvYXJkRm9jdXNNYW5hZ2VyLmdldEN1cnJlbnRLZXlib2FyZEZvY3VzTWFuYWdlcigpLnJlcXVlc3RGb2N1cyh0aGlzLAotICAgICAgICAgICAgICAgIHRlbXBvcmFyeSwgY3Jvc3NXaW5kb3csIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJlcXVlc3RGb2N1c0luV2luZG93KCkgewotICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiByZXF1ZXN0Rm9jdXNJbldpbmRvdyhmYWxzZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICB9Ci0gICAgfQotICAgICovCisgICAgICogcHJvdGVjdGVkIGJvb2xlYW4gcmVxdWVzdEZvY3VzSW5XaW5kb3coYm9vbGVhbiB0ZW1wb3JhcnkpIHsKKyAgICAgKiB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsgV2luZG93IHduZCA9IGdldFdpbmRvd0FuY2VzdG9yKCk7IGlmICgod25kID09CisgICAgICogbnVsbCkgfHwgIXduZC5pc0ZvY3VzZWQoKSkgeyByZXR1cm4gZmFsc2U7IH0gcmV0dXJuCisgICAgICogcmVxdWVzdEZvY3VzSW1wbCh0ZW1wb3JhcnksIGZhbHNlLCBmYWxzZSk7IH0gZmluYWxseSB7CisgICAgICogdG9vbGtpdC51bmxvY2tBV1QoKTsgfSB9IGJvb2xlYW4gcmVxdWVzdEZvY3VzSW1wbChib29sZWFuIHRlbXBvcmFyeSwKKyAgICAgKiBib29sZWFuIGNyb3NzV2luZG93LCBib29sZWFuIHJlamVjdGlvblJlY292ZXJ5KSB7IGlmICghcmVqZWN0aW9uUmVjb3ZlcnkKKyAgICAgKiAmJiBpc0ZvY3VzT3duZXIoKSkgeyByZXR1cm4gdHJ1ZTsgfSBXaW5kb3cgd25kID0gZ2V0V2luZG93QW5jZXN0b3IoKTsKKyAgICAgKiBDb250YWluZXIgcGFyID0gZ2V0UmVhbFBhcmVudCgpOyBpZiAoKHBhciAhPSBudWxsKSAmJiBwYXIuaXNSZW1vdmVkKSB7CisgICAgICogcmV0dXJuIGZhbHNlOyB9IGlmICghaXNTaG93aW5nKCkgfHwgIWlzRm9jdXNhYmxlKCkgfHwKKyAgICAgKiAhd25kLmlzRm9jdXNhYmxlV2luZG93KCkpIHsgcmV0dXJuIGZhbHNlOyB9IHJldHVybgorICAgICAqIEtleWJvYXJkRm9jdXNNYW5hZ2VyLmdldEN1cnJlbnRLZXlib2FyZEZvY3VzTWFuYWdlcigpLnJlcXVlc3RGb2N1cyh0aGlzLAorICAgICAqIHRlbXBvcmFyeSwgY3Jvc3NXaW5kb3csIHRydWUpOyB9IHB1YmxpYyBib29sZWFuIHJlcXVlc3RGb2N1c0luV2luZG93KCkgeworICAgICAqIHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeyByZXR1cm4gcmVxdWVzdEZvY3VzSW5XaW5kb3coZmFsc2UpOyB9IGZpbmFsbHkgeworICAgICAqIHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfQorICAgICAqLwogCiAgICAgLyoqCiAgICAgICogRGVwcmVjYXRlZDogcmVwbGFjZWQgYnkgc2V0Qm91bmRzKGludCwgaW50LCBpbnQsIGludCkgbWV0aG9kLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUuCi0gICAgICogQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZS4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGguIAotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQuCi0gICAgICogCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aC4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodC4KICAgICAgKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSBzZXRCb3VuZHMoaW50LCBpbnQsIGludCwgaW50KSBtZXRob2QuCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKQEAgLTM5OTUsMTMgKzM3MDIsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHJlY3RhbmdsZSBmb3IgdGhpcyBDb21wb25lbnQgdG8gYmUgdGhlIHJlY3RhbmdsZSB3aXRoIHRoZSBzcGVjaWZpZWQgCisgICAgICogU2V0cyByZWN0YW5nbGUgZm9yIHRoaXMgQ29tcG9uZW50IHRvIGJlIHRoZSByZWN0YW5nbGUgd2l0aCB0aGUgc3BlY2lmaWVkCiAgICAgICogeCx5IGNvb3JkaW5hdGVzIG9mIHRoZSB0b3AtbGVmdCBjb3JuZXIgYW5kIHRoZSB3aWR0aCBhbmQgaGVpZ2h0LgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHRvcC1sZWZ0IGNvcm5lci4KLSAgICAgKiBAcGFyYW0geSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB0b3AtbGVmdCBjb3JuZXIuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHJlY3RhbmdsZS4gCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHRvcC1sZWZ0IGNvcm5lci4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdG9wLWxlZnQgY29ybmVyLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHJlY3RhbmdsZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRCb3VuZHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC00MDEzLDE2ICszNzI0LDIyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyByZWN0YW5nbGUgZm9yIHRoaXMgQ29tcG9uZW50IHRvIGJlIHRoZSByZWN0YW5nbGUgd2l0aCB0aGUgc3BlY2lmaWVkIAotICAgICAqIHgseSBjb29yZGluYXRlcyBvZiB0aGUgdG9wLWxlZnQgY29ybmVyIGFuZCB0aGUgd2lkdGggYW5kIGhlaWdodAotICAgICAqIGFuZCBwb3N0cyB0aGUgYXBwcm9wcmlhdGUgZXZlbnRzLgorICAgICAqIFNldHMgcmVjdGFuZ2xlIGZvciB0aGlzIENvbXBvbmVudCB0byBiZSB0aGUgcmVjdGFuZ2xlIHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIHgseSBjb29yZGluYXRlcyBvZiB0aGUgdG9wLWxlZnQgY29ybmVyIGFuZCB0aGUgd2lkdGggYW5kIGhlaWdodCBhbmQgcG9zdHMKKyAgICAgKiB0aGUgYXBwcm9wcmlhdGUgZXZlbnRzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHRvcC1sZWZ0IGNvcm5lci4KLSAgICAgKiBAcGFyYW0geSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB0b3AtbGVmdCBjb3JuZXIuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHJlY3RhbmdsZS4gCi0gICAgICogQHBhcmFtIGJNYXNrIHRoZSBiaXRtYXNrIG9mIGJvdW5kcyBvcHRpb25zCi0gICAgICogQHBhcmFtIHVwZGF0ZUJlaGF2aW9yIHRoZSB3aGV0aGVyIHRvIHVwZGF0ZSB0aGUgYmVoYXZvaXIncyBib3VuZHMgYXMgd2VsbAorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB0b3AtbGVmdCBjb3JuZXIuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHRvcC1sZWZ0IGNvcm5lci4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIGJNYXNrCisgICAgICogICAgICAgICAgICB0aGUgYml0bWFzayBvZiBib3VuZHMgb3B0aW9ucy4KKyAgICAgKiBAcGFyYW0gdXBkYXRlQmVoYXZpb3IKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aGV0aGVyIHRvIHVwZGF0ZSB0aGUgYmVoYXZvaXIncyBib3VuZHMgYXMgd2VsbC4KICAgICAgKi8KICAgICB2b2lkIHNldEJvdW5kcyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGJNYXNrLCBib29sZWFuIHVwZGF0ZUJlaGF2aW9yKSB7CiAgICAgICAgIGludCBvbGRYID0gdGhpcy54OwpAQCAtNDAzMiw3ICszNzQ5LDcgQEAKICAgICAgICAgc2V0Qm91bmRzRmllbGRzKHgsIHksIHcsIGgsIGJNYXNrKTsKICAgICAgICAgLy8gTW92ZWQKICAgICAgICAgaWYgKChvbGRYICE9IHRoaXMueCkgfHwgKG9sZFkgIT0gdGhpcy55KSkgewotICAgICAgICAgICAgLy8/Pz9BV1Q6IGludmFsaWRhdGVSZWFsUGFyZW50KCk7CisgICAgICAgICAgICAvLyA/Pz9BV1Q6IGludmFsaWRhdGVSZWFsUGFyZW50KCk7CiAgICAgICAgICAgICBwb3N0RXZlbnQobmV3IENvbXBvbmVudEV2ZW50KHRoaXMsIENvbXBvbmVudEV2ZW50LkNPTVBPTkVOVF9NT1ZFRCkpOwogICAgICAgICAgICAgc3ByZWFkSGllcmFyY2h5Qm91bmRzRXZlbnRzKHRoaXMsIEhpZXJhcmNoeUV2ZW50LkFOQ0VTVE9SX01PVkVEKTsKICAgICAgICAgfQpAQCAtNDA1MSw3ICszNzY4LDggQEAKICAgICAvKioKICAgICAgKiBDYWxscyBJbnB1dENvbnRleHRJbXBsLm5vdGlmeUNsaWVudFdpbmRvd0NoYW5nZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGJvdW5kcyB0aGUgYm91bmRzCisgICAgICogQHBhcmFtIGJvdW5kcworICAgICAqICAgICAgICAgICAgdGhlIGJvdW5kcy4KICAgICAgKi8KICAgICB2b2lkIG5vdGlmeUlucHV0TWV0aG9kKFJlY3RhbmdsZSBib3VuZHMpIHsKICAgICAgICAgLy8gb25seSBXaW5kb3cgYWN0dWFsbHkgbm90aWZpZXMgSU0gb2YgYm91bmRzIGNoYW5nZQpAQCAtNDA2MCwxMSArMzc3OCwxNiBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGJvdW5kcyBmaWVsZHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIHgKLSAgICAgKiBAcGFyYW0geSB0aGUgeQotICAgICAqIEBwYXJhbSB3IHRoZSB3Ci0gICAgICogQHBhcmFtIGggdGhlIGgKLSAgICAgKiBAcGFyYW0gYk1hc2sgdGhlIGIgbWFzaworICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgeC4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIHkuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3LgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaC4KKyAgICAgKiBAcGFyYW0gYk1hc2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBiIG1hc2suCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHNldEJvdW5kc0ZpZWxkcyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGJNYXNrKSB7CiAgICAgICAgIGlmICgoYk1hc2sgJiBOYXRpdmVXaW5kb3cuQk9VTkRTX05PU0laRSkgPT0gMCkgewpAQCAtNDA4MCw3ICszODAzLDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBuYXRpdmUgaW5zZXRzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hdGl2ZSBpbnNldHMKKyAgICAgKiBAcmV0dXJuIHRoZSBuYXRpdmUgaW5zZXRzLgogICAgICAqLwogICAgIEluc2V0cyBnZXROYXRpdmVJbnNldHMoKSB7CiAgICAgICAgIHJldHVybiBuZXcgSW5zZXRzKDAsIDAsIDAsIDApOwpAQCAtNDA4OSw3ICszODEyLDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBpbnNldHMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW5zZXRzCisgICAgICogQHJldHVybiB0aGUgaW5zZXRzLgogICAgICAqLwogICAgIEluc2V0cyBnZXRJbnNldHMoKSB7CiAgICAgICAgIHJldHVybiBuZXcgSW5zZXRzKDAsIDAsIDAsIDApOwpAQCAtNDA5OCw3ICszODIxLDcgQEAKICAgICAvKioKICAgICAgKiBDaGVja3MgaWYgaXMgbW91c2UgZXhpdGVkIGV4cGVjdGVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgaXMgbW91c2UgZXhpdGVkIGV4cGVjdGVkCisgICAgICogQHJldHVybiB0cnVlLCBpZiBpcyBtb3VzZSBleGl0ZWQgZXhwZWN0ZWQuCiAgICAgICovCiAgICAgYm9vbGVhbiBpc01vdXNlRXhpdGVkRXhwZWN0ZWQoKSB7CiAgICAgICAgIHJldHVybiBtb3VzZUV4aXRlZEV4cGVjdGVkOwpAQCAtNDEwNyw3ICszODMwLDggQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBtb3VzZSBleGl0ZWQgZXhwZWN0ZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGV4cGVjdGVkIHRoZSBuZXcgbW91c2UgZXhpdGVkIGV4cGVjdGVkCisgICAgICogQHBhcmFtIGV4cGVjdGVkCisgICAgICogICAgICAgICAgICB0aGUgbmV3IG1vdXNlIGV4aXRlZCBleHBlY3RlZC4KICAgICAgKi8KICAgICB2b2lkIHNldE1vdXNlRXhpdGVkRXhwZWN0ZWQoYm9vbGVhbiBleHBlY3RlZCkgewogICAgICAgICBtb3VzZUV4aXRlZEV4cGVjdGVkID0gZXhwZWN0ZWQ7CkBAIC00MTE2LDcgKzM4NDAsOCBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIG5ldyBib3VuZGluZyByZWN0YW5nbGUgZm9yIHRoaXMgQ29tcG9uZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSByIHRoZSBuZXcgYm91bmRpbmcgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSByCisgICAgICogICAgICAgICAgICB0aGUgbmV3IGJvdW5kaW5nIHJlY3RhbmdsZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRCb3VuZHMoUmVjdGFuZ2xlIHIpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC00MTI4LDEwICszODUzLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgY29tcG9uZW50IG9yaWVudGF0aW9uIHdoaWNoIGFmZmVjdHMgdGhlIGNvbXBvbmVudCdzCi0gICAgICogZWxlbWVudHMgYW5kIHRleHQgd2l0aGluIHRoaXMgY29tcG9uZW50LiAKKyAgICAgKiBTZXRzIHRoZSBjb21wb25lbnQgb3JpZW50YXRpb24gd2hpY2ggYWZmZWN0cyB0aGUgY29tcG9uZW50J3MgZWxlbWVudHMgYW5kCisgICAgICogdGV4dCB3aXRoaW4gdGhpcyBjb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIG8gdGhlIENvbXBvbmVudE9yaWVudGF0aW9uIG9iamVjdC4KKyAgICAgKiBAcGFyYW0gbworICAgICAqICAgICAgICAgICAgdGhlIENvbXBvbmVudE9yaWVudGF0aW9uIG9iamVjdC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRPcmllbnRhdGlvbihDb21wb25lbnRPcmllbnRhdGlvbiBvKSB7CiAgICAgICAgIENvbXBvbmVudE9yaWVudGF0aW9uIG9sZE9yaWVudGF0aW9uOwpAQCAtNDE0OSw3ICszODc1LDggQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBzcGVjaWZpZWQgY3Vyc29yIGZvciB0aGlzIENvbXBvbmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY3Vyc29yIHRoZSBuZXcgQ3Vyc29yLgorICAgICAqIEBwYXJhbSBjdXJzb3IKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgQ3Vyc29yLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEN1cnNvcihDdXJzb3IgY3Vyc29yKSB7CiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwpAQCAtNDE2OCwyNiArMzg5NSwyMCBAQAogICAgICAgICBpZiAoaXNEaXNwbGF5YWJsZSgpICYmIGlzU2hvd2luZygpKSB7CiAgICAgICAgICAgICBSZWN0YW5nbGUgYWJzUmVjdCA9IG5ldyBSZWN0YW5nbGUoZ2V0TG9jYXRpb25PblNjcmVlbigpLCBnZXRTaXplKCkpOwogICAgICAgICAgICAgUG9pbnQgYWJzUG9pbnRlclBvcyA9IHRvb2xraXQuZGlzcGF0Y2hlci5tb3VzZURpc3BhdGNoZXIuZ2V0UG9pbnRlclBvcygpOwotICAgICAgICAgICAgLy8/Pz9BV1QKKyAgICAgICAgICAgIC8vID8/P0FXVAogICAgICAgICAgICAgLyoKLSAgICAgICAgICAgIGlmIChhYnNSZWN0LmNvbnRhaW5zKGFic1BvaW50ZXJQb3MpKSB7Ci0gICAgICAgICAgICAgICAgLy8gc2V0IEN1cnNvciBvbmx5IG9uIHRvcC1sZXZlbCBXaW5kb3dzKG9uIFgxMSkKLSAgICAgICAgICAgICAgICBXaW5kb3cgdG9wTGV2ZWxXbmQgPSBnZXRXaW5kb3dBbmNlc3RvcigpOwotICAgICAgICAgICAgICAgIGlmICh0b3BMZXZlbFduZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFBvaW50IHBvaW50ZXJQb3MgPSBNb3VzZURpc3BhdGNoZXIuY29udmVydFBvaW50KG51bGwsIGFic1BvaW50ZXJQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wTGV2ZWxXbmQpOwotICAgICAgICAgICAgICAgICAgICBDb21wb25lbnQgY29tcFVuZGVyQ3Vyc29yID0gdG9wTGV2ZWxXbmQuZmluZENvbXBvbmVudEF0KHBvaW50ZXJQb3MpOwotICAgICAgICAgICAgICAgICAgICAvLyBpZiAoY29tcFVuZGVyQ3Vyc29yID09IHRoaXMgfHwKLSAgICAgICAgICAgICAgICAgICAgLy8gY29tcFVuZGVyQ3Vyc29yLmdldEN1cnNvckFuY2VzdG9yKCkgPT0gdGhpcykgewotICAgICAgICAgICAgICAgICAgICBOYXRpdmVXaW5kb3cgd25kID0gdG9wTGV2ZWxXbmQuZ2V0TmF0aXZlV2luZG93KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb21wVW5kZXJDdXJzb3IgIT0gbnVsbCAmJiB3bmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29tcFVuZGVyQ3Vyc29yLmdldFJlYWxDdXJzb3IoKS5nZXROYXRpdmVDdXJzb3IoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q3Vyc29yKHduZC5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAqIGlmIChhYnNSZWN0LmNvbnRhaW5zKGFic1BvaW50ZXJQb3MpKSB7IC8vIHNldCBDdXJzb3Igb25seSBvbgorICAgICAgICAgICAgICogdG9wLWxldmVsIFdpbmRvd3Mob24gWDExKSBXaW5kb3cgdG9wTGV2ZWxXbmQgPQorICAgICAgICAgICAgICogZ2V0V2luZG93QW5jZXN0b3IoKTsgaWYgKHRvcExldmVsV25kICE9IG51bGwpIHsgUG9pbnQgcG9pbnRlclBvcworICAgICAgICAgICAgICogPSBNb3VzZURpc3BhdGNoZXIuY29udmVydFBvaW50KG51bGwsIGFic1BvaW50ZXJQb3MsIHRvcExldmVsV25kKTsKKyAgICAgICAgICAgICAqIENvbXBvbmVudCBjb21wVW5kZXJDdXJzb3IgPQorICAgICAgICAgICAgICogdG9wTGV2ZWxXbmQuZmluZENvbXBvbmVudEF0KHBvaW50ZXJQb3MpOyAvLyBpZiAoY29tcFVuZGVyQ3Vyc29yCisgICAgICAgICAgICAgKiA9PSB0aGlzIHx8IC8vIGNvbXBVbmRlckN1cnNvci5nZXRDdXJzb3JBbmNlc3RvcigpID09IHRoaXMpIHsKKyAgICAgICAgICAgICAqIE5hdGl2ZVdpbmRvdyB3bmQgPSB0b3BMZXZlbFduZC5nZXROYXRpdmVXaW5kb3coKTsgaWYKKyAgICAgICAgICAgICAqIChjb21wVW5kZXJDdXJzb3IgIT0gbnVsbCAmJiB3bmQgIT0gbnVsbCkgeworICAgICAgICAgICAgICogY29tcFVuZGVyQ3Vyc29yLmdldFJlYWxDdXJzb3IoKS5nZXROYXRpdmVDdXJzb3IoKQorICAgICAgICAgICAgICogLnNldEN1cnNvcih3bmQuZ2V0SWQoKSk7IH0gLy8gfSB9IH0KKyAgICAgICAgICAgICAqLwogICAgICAgICB9CiAgICAgfQogCkBAIC00MTk1LDY4ICszOTE2LDQ0IEBACiAgICAgICogR2V0cyB0aGUgYW5jZXN0b3IgQ3Vyc29yIGlmIENvbXBvbmVudCBpcyBkaXNhYmxlZCAoZGlyZWN0bHkgb3IgdmlhIGFuCiAgICAgICogYW5jZXN0b3IpIGV2ZW4gaWYgQ3Vyc29yIGlzIGV4cGxpY2l0bHkgc2V0LgogICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFjdHVhbCBDdXJzb3IgdG8gYmUgZGlzcGxheWVkCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUuCisgICAgICogQHJldHVybiB0aGUgYWN0dWFsIEN1cnNvciB0byBiZSBkaXNwbGF5ZWQuCiAgICAgICovCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIEN1cnNvciBnZXRSZWFsQ3Vyc29yKCkgewotICAgICAgICBDb21wb25lbnQgY3Vyc29yQW5jZXN0b3IgPSBnZXRDdXJzb3JBbmNlc3RvcigpOwotICAgICAgICByZXR1cm4gY3Vyc29yQW5jZXN0b3IgIT0gbnVsbCA/IGN1cnNvckFuY2VzdG9yLmdldEN1cnNvcigpIDogQ3Vyc29yLmdldERlZmF1bHRDdXJzb3IoKTsKLSAgICB9Ci0gICAgKi8KKyAgICAgKiBDdXJzb3IgZ2V0UmVhbEN1cnNvcigpIHsgQ29tcG9uZW50IGN1cnNvckFuY2VzdG9yID0gZ2V0Q3Vyc29yQW5jZXN0b3IoKTsKKyAgICAgKiByZXR1cm4gY3Vyc29yQW5jZXN0b3IgIT0gbnVsbCA/IGN1cnNvckFuY2VzdG9yLmdldEN1cnNvcigpIDoKKyAgICAgKiBDdXJzb3IuZ2V0RGVmYXVsdEN1cnNvcigpOyB9CisgICAgICovCiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBhbmNlc3RvcihvciBjb21wb25lbnQgaXRzZWxmKSB3aG9zZSBjdXJzb3IgaXMgc2V0IHdoZW4gcG9pbnRlcgogICAgICAqIGlzIGluc2lkZSBjb21wb25lbnQKICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFjdHVhbCBDdXJzb3IgdG8gYmUgZGlzcGxheWVkCisgICAgICogQHJldHVybiB0aGUgYWN0dWFsIEN1cnNvciB0byBiZSBkaXNwbGF5ZWQuCiAgICAgICovCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIENvbXBvbmVudCBnZXRDdXJzb3JBbmNlc3RvcigpIHsKLSAgICAgICAgQ29tcG9uZW50IGNvbXA7Ci0gICAgICAgIGZvciAoY29tcCA9IHRoaXM7IGNvbXAgIT0gbnVsbDsgY29tcCA9IGNvbXAuZ2V0UGFyZW50KCkpIHsKLSAgICAgICAgICAgIGlmIChjb21wIGluc3RhbmNlb2YgV2luZG93IHx8IGNvbXAuaXNDdXJzb3JTZXQoKSAmJiBjb21wLmlzS2V5RW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorICAgICAqIENvbXBvbmVudCBnZXRDdXJzb3JBbmNlc3RvcigpIHsgQ29tcG9uZW50IGNvbXA7IGZvciAoY29tcCA9IHRoaXM7IGNvbXAgIT0KKyAgICAgKiBudWxsOyBjb21wID0gY29tcC5nZXRQYXJlbnQoKSkgeyBpZiAoY29tcCBpbnN0YW5jZW9mIFdpbmRvdyB8fAorICAgICAqIGNvbXAuaXNDdXJzb3JTZXQoKSAmJiBjb21wLmlzS2V5RW5hYmxlZCgpKSB7IHJldHVybiBjb21wOyB9IH0gcmV0dXJuCisgICAgICogbnVsbDsgfSBwdWJsaWMgdm9pZCBzZXREcm9wVGFyZ2V0KERyb3BUYXJnZXQgZHQpIHsgdG9vbGtpdC5sb2NrQVdUKCk7IHRyeQorICAgICAqIHsgaWYgKGRyb3BUYXJnZXQgPT0gZHQpIHsgcmV0dXJuOyB9IERyb3BUYXJnZXQgb2xkRHJvcFRhcmdldCA9CisgICAgICogZHJvcFRhcmdldDsgZHJvcFRhcmdldCA9IGR0OyBpZiAob2xkRHJvcFRhcmdldCAhPSBudWxsKSB7IGlmCisgICAgICogKGJlaGF2aW91ci5pc0Rpc3BsYXlhYmxlKCkpIHsgb2xkRHJvcFRhcmdldC5yZW1vdmVOb3RpZnkocGVlcik7IH0KKyAgICAgKiBvbGREcm9wVGFyZ2V0LnNldENvbXBvbmVudChudWxsKTsgfSBpZiAoZHQgIT0gbnVsbCkgeworICAgICAqIGR0LnNldENvbXBvbmVudCh0aGlzKTsgaWYgKGJlaGF2aW91ci5pc0Rpc3BsYXlhYmxlKCkpIHsKKyAgICAgKiBkdC5hZGROb3RpZnkocGVlcik7IH0gfSB9IGZpbmFsbHkgeyB0b29sa2l0LnVubG9ja0FXVCgpOyB9IH0KKyAgICAgKi8KIAotICAgIHB1YmxpYyB2b2lkIHNldERyb3BUYXJnZXQoRHJvcFRhcmdldCBkdCkgewotICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChkcm9wVGFyZ2V0ID09IGR0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRHJvcFRhcmdldCBvbGREcm9wVGFyZ2V0ID0gZHJvcFRhcmdldDsKLSAgICAgICAgICAgIGRyb3BUYXJnZXQgPSBkdDsKLSAgICAgICAgICAgIGlmIChvbGREcm9wVGFyZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoYmVoYXZpb3VyLmlzRGlzcGxheWFibGUoKSkgewotICAgICAgICAgICAgICAgICAgICBvbGREcm9wVGFyZ2V0LnJlbW92ZU5vdGlmeShwZWVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb2xkRHJvcFRhcmdldC5zZXRDb21wb25lbnQobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGR0LnNldENvbXBvbmVudCh0aGlzKTsKLSAgICAgICAgICAgICAgICBpZiAoYmVoYXZpb3VyLmlzRGlzcGxheWFibGUoKSkgewotICAgICAgICAgICAgICAgICAgICBkdC5hZGROb3RpZnkocGVlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAqLwotICAgIAogICAgIC8qKgotICAgICAqIFNldHMgdGhpcyBjb21wb25lbnQgdG8gdGhlICJlbmFibGVkIiBvciAiZGlzYWJsZWQiIHN0YXRlIGRlcGVuZGluZwotICAgICAqIG9uIHRoZSBzcGVjaWZpZWQgYm9vbGVhbiBwYXJhbWV0ZXIuCisgICAgICogU2V0cyB0aGlzIGNvbXBvbmVudCB0byB0aGUgImVuYWJsZWQiIG9yICJkaXNhYmxlZCIgc3RhdGUgZGVwZW5kaW5nIG9uIHRoZQorICAgICAqIHNwZWNpZmllZCBib29sZWFuIHBhcmFtZXRlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUgdHJ1ZSBpZiB0aGlzIGNvbXBvbmVudCBzaG91bGQgYmUgZW5hYmxlZDsgZmFsc2UKLSAgICAgKiBpZiB0aGlzIGNvbXBvbmVudCBzaG91bGQgYmUgZGlzYWJsZWQuCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgICAgICAgICB0cnVlIGlmIHRoaXMgY29tcG9uZW50IHNob3VsZCBiZSBlbmFibGVkOyBmYWxzZSBpZiB0aGlzCisgICAgICogICAgICAgICAgICBjb21wb25lbnQgc2hvdWxkIGJlIGRpc2FibGVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiB2YWx1ZSkgewogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKQEAgLTQyNzAsNyArMzk2Nyw4IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgZW5hYmxlZCBpbXBsLgogICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGVuYWJsZWQgaW1wbAorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBlbmFibGVkIGltcGwuCiAgICAgICovCiAgICAgdm9pZCBzZXRFbmFibGVkSW1wbChib29sZWFuIHZhbHVlKSB7CiAgICAgICAgIGlmIChlbmFibGVkICE9IHZhbHVlKSB7CkBAIC00MjgzLDc3ICszOTgxLDQ5IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLz8/P0FXVAorICAgIC8vID8/P0FXVAogICAgIC8qCi0gICAgcHJpdmF0ZSB2b2lkIGZpcmVBY2Nlc3NpYmxlU3RhdGVDaGFuZ2UoQWNjZXNzaWJsZVN0YXRlIHN0YXRlLCBib29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIGlmIChiZWhhdmlvdXIuaXNMaWdodHdlaWdodCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgQWNjZXNzaWJsZUNvbnRleHQgYWMgPSBnZXRBY2Nlc3NpYmxlQ29udGV4dCgpOwotICAgICAgICBpZiAoYWMgIT0gbnVsbCkgewotICAgICAgICAgICAgQWNjZXNzaWJsZVN0YXRlIG9sZFZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIEFjY2Vzc2libGVTdGF0ZSBuZXdWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBpZiAodmFsdWUpIHsKLSAgICAgICAgICAgICAgICBuZXdWYWx1ZSA9IHN0YXRlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvbGRWYWx1ZSA9IHN0YXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWMuZmlyZVByb3BlcnR5Q2hhbmdlKEFjY2Vzc2libGVDb250ZXh0LkFDQ0VTU0lCTEVfU1RBVEVfUFJPUEVSVFksIG9sZFZhbHVlLAotICAgICAgICAgICAgICAgICAgICBuZXdWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKi8KKyAgICAgKiBwcml2YXRlIHZvaWQgZmlyZUFjY2Vzc2libGVTdGF0ZUNoYW5nZShBY2Nlc3NpYmxlU3RhdGUgc3RhdGUsIGJvb2xlYW4KKyAgICAgKiB2YWx1ZSkgeyBpZiAoYmVoYXZpb3VyLmlzTGlnaHR3ZWlnaHQoKSkgeyByZXR1cm47IH0gQWNjZXNzaWJsZUNvbnRleHQgYWMKKyAgICAgKiA9IGdldEFjY2Vzc2libGVDb250ZXh0KCk7IGlmIChhYyAhPSBudWxsKSB7IEFjY2Vzc2libGVTdGF0ZSBvbGRWYWx1ZSA9CisgICAgICogbnVsbDsgQWNjZXNzaWJsZVN0YXRlIG5ld1ZhbHVlID0gbnVsbDsgaWYgKHZhbHVlKSB7IG5ld1ZhbHVlID0gc3RhdGU7IH0KKyAgICAgKiBlbHNlIHsgb2xkVmFsdWUgPSBzdGF0ZTsgfQorICAgICAqIGFjLmZpcmVQcm9wZXJ0eUNoYW5nZShBY2Nlc3NpYmxlQ29udGV4dC5BQ0NFU1NJQkxFX1NUQVRFX1BST1BFUlRZLAorICAgICAqIG9sZFZhbHVlLCBuZXdWYWx1ZSk7IH0gfQorICAgICAqLwogCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIHB1YmxpYyB2b2lkIHNldEZvY3VzVHJhdmVyc2FsS2V5cyhpbnQgaWQsIFNldDw/IGV4dGVuZHMgQVdUS2V5U3Ryb2tlPiBrZXlzdHJva2VzKSB7Ci0gICAgICAgIFNldDw/IGV4dGVuZHMgQVdUS2V5U3Ryb2tlPiBvbGRUcmF2ZXJzYWxLZXlzOwotICAgICAgICBTdHJpbmcgcHJvcE5hbWUgPSAiRm9jdXNUcmF2ZXJzYWxLZXlzIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEludGVnZXIga0lkID0gbmV3IEludGVnZXIoaWQpOwotICAgICAgICAgICAgS2V5Ym9hcmRGb2N1c01hbmFnZXIuY2hlY2tUcmF2ZXJzYWxLZXlzSUQodHJhdmVyc2FsS2V5cywga0lkKTsKLSAgICAgICAgICAgIE1hcDxJbnRlZ2VyLCBTZXQ8PyBleHRlbmRzIEFXVEtleVN0cm9rZT4+IGtleXMgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBTZXQ8PyBleHRlbmRzIEFXVEtleVN0cm9rZT4+KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBraWQgOiB0cmF2ZXJzYWxJRHMpIHsKLSAgICAgICAgICAgICAgICBJbnRlZ2VyIGtleSA9IG5ldyBJbnRlZ2VyKGtpZCk7Ci0gICAgICAgICAgICAgICAga2V5cy5wdXQoa2V5LCBnZXRGb2N1c1RyYXZlcnNhbEtleXMoa2lkKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBLZXlib2FyZEZvY3VzTWFuYWdlci5jaGVja0tleVN0cm9rZXModHJhdmVyc2FsSURzLCBrZXlzLCBrSWQsIGtleXN0cm9rZXMpOwotICAgICAgICAgICAgb2xkVHJhdmVyc2FsS2V5cyA9IHRyYXZlcnNhbEtleXMuZ2V0KG5ldyBJbnRlZ2VyKGlkKSk7Ci0gICAgICAgICAgICAvLyBwdXQgYSBjb3B5IG9mIGtleXN0cm9rZXMgb2JqZWN0IGludG8gbWFwOgotICAgICAgICAgICAgU2V0PD8gZXh0ZW5kcyBBV1RLZXlTdHJva2U+IG5ld0tleXMgPSBrZXlzdHJva2VzOwotICAgICAgICAgICAgaWYgKGtleXN0cm9rZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG5ld0tleXMgPSBuZXcgSGFzaFNldDxBV1RLZXlTdHJva2U+KGtleXN0cm9rZXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJhdmVyc2FsS2V5cy5wdXQoa0lkLCBuZXdLZXlzKTsKLSAgICAgICAgICAgIFN0cmluZyBkaXJlY3Rpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgc3dpdGNoIChpZCkgewotICAgICAgICAgICAgICAgIGNhc2UgS2V5Ym9hcmRGb2N1c01hbmFnZXIuRk9SV0FSRF9UUkFWRVJTQUxfS0VZUzoKLSAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImZvcndhcmQiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgS2V5Ym9hcmRGb2N1c01hbmFnZXIuQkFDS1dBUkRfVFJBVkVSU0FMX0tFWVM6Ci0gICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJiYWNrd2FyZCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBLZXlib2FyZEZvY3VzTWFuYWdlci5VUF9DWUNMRV9UUkFWRVJTQUxfS0VZUzoKLSAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gInVwQ3ljbGUiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgS2V5Ym9hcmRGb2N1c01hbmFnZXIuRE9XTl9DWUNMRV9UUkFWRVJTQUxfS0VZUzoKLSAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImRvd25DeWNsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcm9wTmFtZSA9IGRpcmVjdGlvbiArIHByb3BOYW1lOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgfQotICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UocHJvcE5hbWUsIG9sZFRyYXZlcnNhbEtleXMsIGtleXN0cm9rZXMpOwotICAgIH0KLSAgICAqLworICAgICAqIHB1YmxpYyB2b2lkIHNldEZvY3VzVHJhdmVyc2FsS2V5cyhpbnQgaWQsIFNldDw/IGV4dGVuZHMgQVdUS2V5U3Ryb2tlPgorICAgICAqIGtleXN0cm9rZXMpIHsgU2V0PD8gZXh0ZW5kcyBBV1RLZXlTdHJva2U+IG9sZFRyYXZlcnNhbEtleXM7IFN0cmluZworICAgICAqIHByb3BOYW1lID0gIkZvY3VzVHJhdmVyc2FsS2V5cyI7IC8vJE5PTi1OTFMtMSQgdG9vbGtpdC5sb2NrQVdUKCk7IHRyeSB7CisgICAgICogSW50ZWdlciBrSWQgPSBuZXcgSW50ZWdlcihpZCk7CisgICAgICogS2V5Ym9hcmRGb2N1c01hbmFnZXIuY2hlY2tUcmF2ZXJzYWxLZXlzSUQodHJhdmVyc2FsS2V5cywga0lkKTsKKyAgICAgKiBNYXA8SW50ZWdlciwgU2V0PD8gZXh0ZW5kcyBBV1RLZXlTdHJva2U+PiBrZXlzID0gbmV3IEhhc2hNYXA8SW50ZWdlciwKKyAgICAgKiBTZXQ8PyBleHRlbmRzIEFXVEtleVN0cm9rZT4+KCk7IGZvciAoaW50IGtpZCA6IHRyYXZlcnNhbElEcykgeyBJbnRlZ2VyCisgICAgICoga2V5ID0gbmV3IEludGVnZXIoa2lkKTsga2V5cy5wdXQoa2V5LCBnZXRGb2N1c1RyYXZlcnNhbEtleXMoa2lkKSk7IH0KKyAgICAgKiBLZXlib2FyZEZvY3VzTWFuYWdlci5jaGVja0tleVN0cm9rZXModHJhdmVyc2FsSURzLCBrZXlzLCBrSWQsCisgICAgICoga2V5c3Ryb2tlcyk7IG9sZFRyYXZlcnNhbEtleXMgPSB0cmF2ZXJzYWxLZXlzLmdldChuZXcgSW50ZWdlcihpZCkpOyAvLworICAgICAqIHB1dCBhIGNvcHkgb2Yga2V5c3Ryb2tlcyBvYmplY3QgaW50byBtYXA6IFNldDw/IGV4dGVuZHMgQVdUS2V5U3Ryb2tlPgorICAgICAqIG5ld0tleXMgPSBrZXlzdHJva2VzOyBpZiAoa2V5c3Ryb2tlcyAhPSBudWxsKSB7IG5ld0tleXMgPSBuZXcKKyAgICAgKiBIYXNoU2V0PEFXVEtleVN0cm9rZT4oa2V5c3Ryb2tlcyk7IH0gdHJhdmVyc2FsS2V5cy5wdXQoa0lkLCBuZXdLZXlzKTsKKyAgICAgKiBTdHJpbmcgZGlyZWN0aW9uID0gIiI7IC8vJE5PTi1OTFMtMSQgc3dpdGNoIChpZCkgeyBjYXNlCisgICAgICogS2V5Ym9hcmRGb2N1c01hbmFnZXIuRk9SV0FSRF9UUkFWRVJTQUxfS0VZUzogZGlyZWN0aW9uID0gImZvcndhcmQiOworICAgICAqIC8vJE5PTi1OTFMtMSQgYnJlYWs7IGNhc2UgS2V5Ym9hcmRGb2N1c01hbmFnZXIuQkFDS1dBUkRfVFJBVkVSU0FMX0tFWVM6CisgICAgICogZGlyZWN0aW9uID0gImJhY2t3YXJkIjsgLy8kTk9OLU5MUy0xJCBicmVhazsgY2FzZQorICAgICAqIEtleWJvYXJkRm9jdXNNYW5hZ2VyLlVQX0NZQ0xFX1RSQVZFUlNBTF9LRVlTOiBkaXJlY3Rpb24gPSAidXBDeWNsZSI7CisgICAgICogLy8kTk9OLU5MUy0xJCBicmVhazsgY2FzZSBLZXlib2FyZEZvY3VzTWFuYWdlci5ET1dOX0NZQ0xFX1RSQVZFUlNBTF9LRVlTOgorICAgICAqIGRpcmVjdGlvbiA9ICJkb3duQ3ljbGUiOyAvLyROT04tTkxTLTEkIGJyZWFrOyB9IHByb3BOYW1lID0gZGlyZWN0aW9uICsKKyAgICAgKiBwcm9wTmFtZTsgfSBmaW5hbGx5IHsgdG9vbGtpdC51bmxvY2tBV1QoKTsgfSBmaXJlUHJvcGVydHlDaGFuZ2UocHJvcE5hbWUsCisgICAgICogb2xkVHJhdmVyc2FsS2V5cywga2V5c3Ryb2tlcyk7IH0KKyAgICAgKi8KIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGZvY3VzIHRyYXZlcnNhbCBrZXlzIHN0YXRlIGZvciB0aGlzIGNvbXBvbmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUgdHJ1ZSBpZiB0aGUgZm9jdXMgdHJhdmVyc2FsIGtleXMgc3RhdGUgaXMgZW5hYmxlZCwKLSAgICAgKiBmYWxzZSBpZiB0aGUgZm9jdXMgdHJhdmVyc2FsIGtleXMgc3RhdGUgaXMgZGlzYWJsZWQuCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgICAgICAgICB0cnVlIGlmIHRoZSBmb2N1cyB0cmF2ZXJzYWwga2V5cyBzdGF0ZSBpcyBlbmFibGVkLCBmYWxzZSBpZgorICAgICAqICAgICAgICAgICAgdGhlIGZvY3VzIHRyYXZlcnNhbCBrZXlzIHN0YXRlIGlzIGRpc2FibGVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZvY3VzVHJhdmVyc2FsS2V5c0VuYWJsZWQoYm9vbGVhbiB2YWx1ZSkgewogICAgICAgICBib29sZWFuIG9sZEZvY3VzVHJhdmVyc2FsS2V5c0VuYWJsZWQ7CkBAIC00MzY4LDM4ICs0MDM4LDIzIEBACiAgICAgICAgICAgICAgICAgZm9jdXNUcmF2ZXJzYWxLZXlzRW5hYmxlZCk7CiAgICAgfQogCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIHB1YmxpYyB2b2lkIHNldEZvY3VzYWJsZShib29sZWFuIGZvY3VzYWJsZSkgewotICAgICAgICBib29sZWFuIG9sZEZvY3VzYWJsZTsKLSAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjYWxsZWRTZXRGb2N1c2FibGUgPSB0cnVlOwotICAgICAgICAgICAgb2xkRm9jdXNhYmxlID0gdGhpcy5mb2N1c2FibGU7Ci0gICAgICAgICAgICB0aGlzLmZvY3VzYWJsZSA9IGZvY3VzYWJsZTsKLSAgICAgICAgICAgIGlmICghZm9jdXNhYmxlKSB7Ci0gICAgICAgICAgICAgICAgbW92ZUZvY3VzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICB9Ci0gICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgiZm9jdXNhYmxlIiwgb2xkRm9jdXNhYmxlLCBmb2N1c2FibGUpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHVibGljIEZvbnQgZ2V0Rm9udCgpIHsKLSAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gKGZvbnQgPT0gbnVsbCkgJiYgKHBhcmVudCAhPSBudWxsKSA/IHBhcmVudC5nZXRGb250KCkgOiBmb250OwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAqLworICAgICAqIHB1YmxpYyB2b2lkIHNldEZvY3VzYWJsZShib29sZWFuIGZvY3VzYWJsZSkgeyBib29sZWFuIG9sZEZvY3VzYWJsZTsKKyAgICAgKiB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsgY2FsbGVkU2V0Rm9jdXNhYmxlID0gdHJ1ZTsgb2xkRm9jdXNhYmxlID0KKyAgICAgKiB0aGlzLmZvY3VzYWJsZTsgdGhpcy5mb2N1c2FibGUgPSBmb2N1c2FibGU7IGlmICghZm9jdXNhYmxlKSB7CisgICAgICogbW92ZUZvY3VzKCk7IH0gfSBmaW5hbGx5IHsgdG9vbGtpdC51bmxvY2tBV1QoKTsgfQorICAgICAqIGZpcmVQcm9wZXJ0eUNoYW5nZSgiZm9jdXNhYmxlIiwgb2xkRm9jdXNhYmxlLCBmb2N1c2FibGUpOyAvLyROT04tTkxTLTEkIH0KKyAgICAgKiBwdWJsaWMgRm9udCBnZXRGb250KCkgeyB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsgcmV0dXJuIChmb250ID09IG51bGwpICYmCisgICAgICogKHBhcmVudCAhPSBudWxsKSA/IHBhcmVudC5nZXRGb250KCkgOiBmb250OyB9IGZpbmFsbHkgeworICAgICAqIHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfQorICAgICAqLwogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgZm9udCBmb3IgdGhpcyBDb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGYgdGhlIG5ldyBmb250IG9mIHRoZSBDb21wb25lbnQuCisgICAgICogQHBhcmFtIGYKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgZm9udCBvZiB0aGUgQ29tcG9uZW50LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZvbnQoRm9udCBmKSB7CiAgICAgICAgIEZvbnQgb2xkRm9udDsKQEAgLTQ0MTYsNyArNDA3MSw4IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgZm9udCBpbXBsLgogICAgICAqIAotICAgICAqIEBwYXJhbSBmIHRoZSBuZXcgZm9udCBpbXBsCisgICAgICogQHBhcmFtIGYKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgZm9udCBpbXBsLgogICAgICAqLwogICAgIHZvaWQgc2V0Rm9udEltcGwoRm9udCBmKSB7CiAgICAgICAgIGZvbnQgPSBmOwpAQCAtNDQyNiwxMiArNDA4MiwxMSBAQAogICAgICAgICB9CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBJbnZhbGlkYXRlIHRoZSBjb21wb25lbnQgaWYgaXQgaW5oZXJpdHMgdGhlIGZvbnQgZnJvbSB0aGUgcGFyZW50LiBUaGlzCiAgICAgICogbWV0aG9kIGlzIG92ZXJyaWRkZW4gaW4gQ29udGFpbmVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29tcG9uZW50IHdhcyBpbnZhbGlkYXRlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb21wb25lbnQgd2FzIGludmFsaWRhdGVkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgYm9vbGVhbiBwcm9wYWdhdGVGb250KCkgewogICAgICAgICBpZiAoZm9udCA9PSBudWxsKSB7CkBAIC00NDQ0LDcgKzQwOTksOCBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGZvcmVncm91bmQgY29sb3IgZm9yIHRoaXMgQ29tcG9uZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBjIHRoZSBuZXcgZm9yZWdyb3VuZCBjb2xvci4KKyAgICAgKiBAcGFyYW0gYworICAgICAqICAgICAgICAgICAgdGhlIG5ldyBmb3JlZ3JvdW5kIGNvbG9yLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZvcmVncm91bmQoQ29sb3IgYykgewogICAgICAgICBDb2xvciBvbGRGZ0NvbG9yOwpAQCAtNDQ2Miw3ICs0MTE4LDggQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGZvciB0aGUgQ29tcG9uZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBjIHRoZSBuZXcgYmFja2dyb3VuZCBjb2xvciBmb3IgdGhpcyBjb21wb25lbnQuCisgICAgICogQHBhcmFtIGMKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgYmFja2dyb3VuZCBjb2xvciBmb3IgdGhpcyBjb21wb25lbnQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZChDb2xvciBjKSB7CiAgICAgICAgIENvbG9yIG9sZEJrQ29sb3I7CkBAIC00NDc4LDExICs0MTM1LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgZmxhZyBmb3Igd2hldGhlciBwYWludCBtZXNzYWdlcyByZWNlaXZlZCBmcm9tIHRoZSBvcGVyYXRpbmcgCi0gICAgICogc3lzdGVtIHNob3VsZCBiZSBpZ25vcmVkIG9yIG5vdC4gCisgICAgICogU2V0cyB0aGUgZmxhZyBmb3Igd2hldGhlciBwYWludCBtZXNzYWdlcyByZWNlaXZlZCBmcm9tIHRoZSBvcGVyYXRpbmcKKyAgICAgKiBzeXN0ZW0gc2hvdWxkIGJlIGlnbm9yZWQgb3Igbm90LgogICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSB0cnVlIGlmIHBhaW50IG1lc3NhZ2VzIHJlY2VpdmVkIGZyb20gdGhlIG9wZXJhdGluZyAKLSAgICAgKiBzeXN0ZW0gc2hvdWxkIGJlIGlnbm9yZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRydWUgaWYgcGFpbnQgbWVzc2FnZXMgcmVjZWl2ZWQgZnJvbSB0aGUgb3BlcmF0aW5nIHN5c3RlbQorICAgICAqICAgICAgICAgICAgc2hvdWxkIGJlIGlnbm9yZWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRJZ25vcmVSZXBhaW50KGJvb2xlYW4gdmFsdWUpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC00NDk2LDcgKzQxNTQsOCBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGxvY2FsZSBvZiB0aGUgY29tcG9uZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBsb2NhbGUgdGhlIG5ldyBMb2NhbGUuCisgICAgICogQHBhcmFtIGxvY2FsZQorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBMb2NhbGUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TG9jYWxlKExvY2FsZSBsb2NhbGUpIHsKICAgICAgICAgTG9jYWxlIG9sZExvY2FsZTsKQEAgLTQ1MTMsNyArNDE3Miw4IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgbG9jYXRpb24gb2YgdGhlIENvbXBvbmVudCB0byB0aGUgc3BlY2lmaWVkIHBvaW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBwIHRoZSBuZXcgbG9jYXRpb24gb2YgdGhlIENvbXBvbmVudAorICAgICAqIEBwYXJhbSBwCisgICAgICogICAgICAgICAgICB0aGUgbmV3IGxvY2F0aW9uIG9mIHRoZSBDb21wb25lbnQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TG9jYXRpb24oUG9pbnQgcCkgewogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKQEAgLTQ1MjUsMTAgKzQxODUsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBsb2NhdGlvbiBvZiB0aGUgQ29tcG9uZW50IHRvIHRoZSBzcGVjaWZpZWQgeCwgeSBjb29yZGluYXRlcy4gIAorICAgICAqIFNldHMgdGhlIGxvY2F0aW9uIG9mIHRoZSBDb21wb25lbnQgdG8gdGhlIHNwZWNpZmllZCB4LCB5IGNvb3JkaW5hdGVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUuCi0gICAgICogQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihpbnQgeCwgaW50IHkpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC00NTQyLDggKzQyMDQsOSBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHZpc2liaWxpdHkgc3RhdGUgb2YgdGhlIGNvbXBvbmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYiB0cnVlIGlmIHRoZSBjb21wb25lbnQgaXMgdmlzaWJsZSwgZmFsc2UgaWYgdGhlIGNvbXBvbmVudAotICAgICAqIGlzIG5vdCBzaG93bi4KKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdHJ1ZSBpZiB0aGUgY29tcG9uZW50IGlzIHZpc2libGUsIGZhbHNlIGlmIHRoZSBjb21wb25lbnQgaXMKKyAgICAgKiAgICAgICAgICAgIG5vdCBzaG93bi4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gYikgewogICAgICAgICAvLyBzaG93KCkgJiBoaWRlKCkgYXJlIG5vdCBkZXByZWNhdGVkIGZvciBXaW5kb3csCkBAIC00NTY5LDkgKzQyMzIsOSBAQAogICAgICAgICAgICAgdmlzaWJsZSA9IHRydWU7CiAgICAgICAgICAgICBiZWhhdmlvdXIuc2V0VmlzaWJsZSh0cnVlKTsKICAgICAgICAgICAgIHBvc3RFdmVudChuZXcgQ29tcG9uZW50RXZlbnQodGhpcywgQ29tcG9uZW50RXZlbnQuQ09NUE9ORU5UX1NIT1dOKSk7Ci0gICAgICAgICAgICAvLz8/P0FXVDogZmluaXNoSGllcmFyY2h5Q2hhbmdlKHRoaXMsIHBhcmVudCwgMCk7CisgICAgICAgICAgICAvLyA/Pz9BV1Q6IGZpbmlzaEhpZXJhcmNoeUNoYW5nZSh0aGlzLCBwYXJlbnQsIDApOwogICAgICAgICAgICAgbm90aWZ5SW5wdXRNZXRob2QobmV3IFJlY3RhbmdsZSh4LCB5LCB3LCBoKSk7Ci0gICAgICAgICAgICAvLz8/P0FXVDogaW52YWxpZGF0ZVJlYWxQYXJlbnQoKTsKKyAgICAgICAgICAgIC8vID8/P0FXVDogaW52YWxpZGF0ZVJlYWxQYXJlbnQoKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7CiAgICAgICAgIH0KQEAgLTQ1ODAsOCArNDI0Myw4IEBACiAgICAgLyoqCiAgICAgICogRGVwcmVjYXRlZDogcmVwbGFjZWQgYnkgc2V0VmlzaWJsZShib29sZWFuKSBtZXRob2QuCiAgICAgICogCi0gICAgICogQHBhcmFtIGIgdGhlIHZpc2liaWxpdHkncyBzdGF0ZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIHZpc2liaWxpdHkncyBzdGF0ZS4KICAgICAgKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSBzZXRWaXNpYmxlKGJvb2xlYW4pIG1ldGhvZC4KICAgICAgKi8KICAgICBARGVwcmVjYXRlZApAQCAtNDU5Myw5NyArNDI1Niw0MCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIHZvaWQgdHJhbnNmZXJGb2N1cyhpbnQgZGlyKSB7Ci0gICAgICAgIENvbnRhaW5lciByb290ID0gbnVsbDsKLSAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBDb250YWluZXIpIHsKLSAgICAgICAgICAgIENvbnRhaW5lciBjb250ID0gKENvbnRhaW5lcikgdGhpczsKLSAgICAgICAgICAgIGlmIChjb250LmlzRm9jdXNDeWNsZVJvb3QoKSkgewotICAgICAgICAgICAgICAgIHJvb3QgPSBjb250LmdldEZvY3VzVHJhdmVyc2FsUm9vdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChyb290ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJvb3QgPSBnZXRGb2N1c0N5Y2xlUm9vdEFuY2VzdG9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gdHJhbnNmZXIgZm9jdXMgdXAgY3ljbGUgaWYgcm9vdCBpcyB1bnJlYWNoYWJsZQotICAgICAgICBDb21wb25lbnQgY29tcCA9IHRoaXM7Ci0gICAgICAgIHdoaWxlICgocm9vdCAhPSBudWxsKQotICAgICAgICAgICAgICAgICYmICEocm9vdC5pc0ZvY3VzQ3ljbGVSb290KCkgJiYgcm9vdC5pc1Nob3dpbmcoKSAmJiByb290LmlzRW5hYmxlZCgpICYmIHJvb3QKLSAgICAgICAgICAgICAgICAgICAgICAgIC5pc0ZvY3VzYWJsZSgpKSkgewotICAgICAgICAgICAgY29tcCA9IHJvb3Q7Ci0gICAgICAgICAgICByb290ID0gcm9vdC5nZXRGb2N1c0N5Y2xlUm9vdEFuY2VzdG9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJvb3QgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIEZvY3VzVHJhdmVyc2FsUG9saWN5IHBvbGljeSA9IHJvb3QuZ2V0Rm9jdXNUcmF2ZXJzYWxQb2xpY3koKTsKLSAgICAgICAgQ29tcG9uZW50IG5leHRDb21wID0gbnVsbDsKLSAgICAgICAgc3dpdGNoIChkaXIpIHsKLSAgICAgICAgICAgIGNhc2UgS2V5Ym9hcmRGb2N1c01hbmFnZXIuRk9SV0FSRF9UUkFWRVJTQUxfS0VZUzoKLSAgICAgICAgICAgICAgICBuZXh0Q29tcCA9IHBvbGljeS5nZXRDb21wb25lbnRBZnRlcihyb290LCBjb21wKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgS2V5Ym9hcmRGb2N1c01hbmFnZXIuQkFDS1dBUkRfVFJBVkVSU0FMX0tFWVM6Ci0gICAgICAgICAgICAgICAgbmV4dENvbXAgPSBwb2xpY3kuZ2V0Q29tcG9uZW50QmVmb3JlKHJvb3QsIGNvbXApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuZXh0Q29tcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBuZXh0Q29tcC5yZXF1ZXN0Rm9jdXMoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRyYW5zZmVyRm9jdXMoKSB7Ci0gICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmV4dEZvY3VzKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdHJhbnNmZXJGb2N1c0JhY2t3YXJkKCkgewotICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRyYW5zZmVyRm9jdXMoS2V5Ym9hcmRGb2N1c01hbmFnZXIuQkFDS1dBUkRfVFJBVkVSU0FMX0tFWVMpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRyYW5zZmVyRm9jdXNVcEN5Y2xlKCkgewotICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEtleWJvYXJkRm9jdXNNYW5hZ2VyIGtmbSA9IEtleWJvYXJkRm9jdXNNYW5hZ2VyLmdldEN1cnJlbnRLZXlib2FyZEZvY3VzTWFuYWdlcigpOwotICAgICAgICAgICAgQ29udGFpbmVyIHJvb3QgPSBrZm0uZ2V0Q3VycmVudEZvY3VzQ3ljbGVSb290KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKHJvb3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICBDb21wb25lbnQgbmV4dENvbXAgPSBudWxsOwotICAgICAgICAgICAgQ29udGFpbmVyIG5ld1Jvb3QgPSByb290OwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIG5leHRDb21wID0gbmV3Um9vdCBpbnN0YW5jZW9mIFdpbmRvdyA/IG5ld1Jvb3QuZ2V0Rm9jdXNUcmF2ZXJzYWxQb2xpY3koKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldERlZmF1bHRDb21wb25lbnQobmV3Um9vdCkgOiBuZXdSb290OwotICAgICAgICAgICAgICAgIG5ld1Jvb3QgPSBuZXdSb290LmdldEZvY3VzQ3ljbGVSb290QW5jZXN0b3IoKTsKLSAgICAgICAgICAgICAgICBpZiAobmV4dENvbXAgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3VjY2VzcyA9IG5leHRDb21wLnJlcXVlc3RGb2N1c0luV2luZG93KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld1Jvb3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAga2ZtLnNldEdsb2JhbEN1cnJlbnRGb2N1c0N5Y2xlUm9vdChuZXdSb290KTsKLSAgICAgICAgICAgIH0gd2hpbGUgKCFzdWNjZXNzKTsKLSAgICAgICAgICAgIGlmICghc3VjY2VzcyAmJiByb290ICE9IG5ld1Jvb3QpIHsKLSAgICAgICAgICAgICAgICBrZm0uc2V0R2xvYmFsQ3VycmVudEZvY3VzQ3ljbGVSb290KHJvb3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAqLworICAgICAqIHZvaWQgdHJhbnNmZXJGb2N1cyhpbnQgZGlyKSB7IENvbnRhaW5lciByb290ID0gbnVsbDsgaWYgKHRoaXMgaW5zdGFuY2VvZgorICAgICAqIENvbnRhaW5lcikgeyBDb250YWluZXIgY29udCA9IChDb250YWluZXIpIHRoaXM7IGlmCisgICAgICogKGNvbnQuaXNGb2N1c0N5Y2xlUm9vdCgpKSB7IHJvb3QgPSBjb250LmdldEZvY3VzVHJhdmVyc2FsUm9vdCgpOyB9IH0gaWYKKyAgICAgKiAocm9vdCA9PSBudWxsKSB7IHJvb3QgPSBnZXRGb2N1c0N5Y2xlUm9vdEFuY2VzdG9yKCk7IH0gLy8gdHJhbnNmZXIgZm9jdXMKKyAgICAgKiB1cCBjeWNsZSBpZiByb290IGlzIHVucmVhY2hhYmxlIENvbXBvbmVudCBjb21wID0gdGhpczsgd2hpbGUgKChyb290ICE9CisgICAgICogbnVsbCkgJiYgIShyb290LmlzRm9jdXNDeWNsZVJvb3QoKSAmJiByb290LmlzU2hvd2luZygpICYmCisgICAgICogcm9vdC5pc0VuYWJsZWQoKSAmJiByb290IC5pc0ZvY3VzYWJsZSgpKSkgeyBjb21wID0gcm9vdDsgcm9vdCA9CisgICAgICogcm9vdC5nZXRGb2N1c0N5Y2xlUm9vdEFuY2VzdG9yKCk7IH0gaWYgKHJvb3QgPT0gbnVsbCkgeyByZXR1cm47IH0KKyAgICAgKiBGb2N1c1RyYXZlcnNhbFBvbGljeSBwb2xpY3kgPSByb290LmdldEZvY3VzVHJhdmVyc2FsUG9saWN5KCk7IENvbXBvbmVudAorICAgICAqIG5leHRDb21wID0gbnVsbDsgc3dpdGNoIChkaXIpIHsgY2FzZQorICAgICAqIEtleWJvYXJkRm9jdXNNYW5hZ2VyLkZPUldBUkRfVFJBVkVSU0FMX0tFWVM6IG5leHRDb21wID0KKyAgICAgKiBwb2xpY3kuZ2V0Q29tcG9uZW50QWZ0ZXIocm9vdCwgY29tcCk7IGJyZWFrOyBjYXNlCisgICAgICogS2V5Ym9hcmRGb2N1c01hbmFnZXIuQkFDS1dBUkRfVFJBVkVSU0FMX0tFWVM6IG5leHRDb21wID0KKyAgICAgKiBwb2xpY3kuZ2V0Q29tcG9uZW50QmVmb3JlKHJvb3QsIGNvbXApOyBicmVhazsgfSBpZiAobmV4dENvbXAgIT0gbnVsbCkgeworICAgICAqIG5leHRDb21wLnJlcXVlc3RGb2N1cyhmYWxzZSk7IH0gfSBwdWJsaWMgdm9pZCB0cmFuc2ZlckZvY3VzKCkgeworICAgICAqIHRvb2xraXQubG9ja0FXVCgpOyB0cnkgeyBuZXh0Rm9jdXMoKTsgfSBmaW5hbGx5IHsgdG9vbGtpdC51bmxvY2tBV1QoKTsgfQorICAgICAqIH0gcHVibGljIHZvaWQgdHJhbnNmZXJGb2N1c0JhY2t3YXJkKCkgeyB0b29sa2l0LmxvY2tBV1QoKTsgdHJ5IHsKKyAgICAgKiB0cmFuc2ZlckZvY3VzKEtleWJvYXJkRm9jdXNNYW5hZ2VyLkJBQ0tXQVJEX1RSQVZFUlNBTF9LRVlTKTsgfSBmaW5hbGx5IHsKKyAgICAgKiB0b29sa2l0LnVubG9ja0FXVCgpOyB9IH0gcHVibGljIHZvaWQgdHJhbnNmZXJGb2N1c1VwQ3ljbGUoKSB7CisgICAgICogdG9vbGtpdC5sb2NrQVdUKCk7IHRyeSB7IEtleWJvYXJkRm9jdXNNYW5hZ2VyIGtmbSA9CisgICAgICogS2V5Ym9hcmRGb2N1c01hbmFnZXIuZ2V0Q3VycmVudEtleWJvYXJkRm9jdXNNYW5hZ2VyKCk7IENvbnRhaW5lciByb290ID0KKyAgICAgKiBrZm0uZ2V0Q3VycmVudEZvY3VzQ3ljbGVSb290KCk7IGlmKHJvb3QgPT0gbnVsbCkgeyByZXR1cm47IH0gYm9vbGVhbgorICAgICAqIHN1Y2Nlc3MgPSBmYWxzZTsgQ29tcG9uZW50IG5leHRDb21wID0gbnVsbDsgQ29udGFpbmVyIG5ld1Jvb3QgPSByb290OyBkbworICAgICAqIHsgbmV4dENvbXAgPSBuZXdSb290IGluc3RhbmNlb2YgV2luZG93ID8KKyAgICAgKiBuZXdSb290LmdldEZvY3VzVHJhdmVyc2FsUG9saWN5KCkgLmdldERlZmF1bHRDb21wb25lbnQobmV3Um9vdCkgOgorICAgICAqIG5ld1Jvb3Q7IG5ld1Jvb3QgPSBuZXdSb290LmdldEZvY3VzQ3ljbGVSb290QW5jZXN0b3IoKTsgaWYgKG5leHRDb21wID09CisgICAgICogbnVsbCkgeyBicmVhazsgfSBzdWNjZXNzID0gbmV4dENvbXAucmVxdWVzdEZvY3VzSW5XaW5kb3coKTsgaWYgKG5ld1Jvb3QKKyAgICAgKiA9PSBudWxsKSB7IGJyZWFrOyB9IGtmbS5zZXRHbG9iYWxDdXJyZW50Rm9jdXNDeWNsZVJvb3QobmV3Um9vdCk7IH0gd2hpbGUKKyAgICAgKiAoIXN1Y2Nlc3MpOyBpZiAoIXN1Y2Nlc3MgJiYgcm9vdCAhPSBuZXdSb290KSB7CisgICAgICoga2ZtLnNldEdsb2JhbEN1cnJlbnRGb2N1c0N5Y2xlUm9vdChyb290KTsgfSB9IGZpbmFsbHkgeworICAgICAqIHRvb2xraXQudW5sb2NrQVdUKCk7IH0gfQorICAgICAqLwogCiAgICAgLyoqCiAgICAgICogVmFsaWRhdGVzIHRoYXQgdGhpcyBjb21wb25lbnQgaGFzIGEgdmFsaWQgbGF5b3V0LgpAQCAtNDcxMCw3ICs0MzE2LDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBuYXRpdmUgd2luZG93LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hdGl2ZSB3aW5kb3cKKyAgICAgKiBAcmV0dXJuIHRoZSBuYXRpdmUgd2luZG93LgogICAgICAqLwogICAgIE5hdGl2ZVdpbmRvdyBnZXROYXRpdmVXaW5kb3coKSB7CiAgICAgICAgIHJldHVybiBiZWhhdmlvdXIuZ2V0TmF0aXZlV2luZG93KCk7CkBAIC00NzE5LDggKzQzMjUsOCBAQAogICAgIC8qKgogICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCBhIG1heGltdW0gc2l6ZSBpcyBzZXQgZm9yIHRoZSBDb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgbWF4aW11bSBzaXplIGlzIHNldCBmb3IgdGhlIENvbXBvbmVudCwKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgbWF4aW11bSBzaXplIGlzIHNldCBmb3IgdGhlIENvbXBvbmVudCwgZmFsc2UKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc01heGltdW1TaXplU2V0KCkgewogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKQEAgLTQ3MzQsOCArNDM0MCw4IEBACiAgICAgLyoqCiAgICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBtaW5pbXVtIHNpemUgaXMgc2V0IGZvciB0aGUgY29tcG9uZW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIG1pbmltdW0gc2l6ZSBpcyBzZXQgZm9yIHRoZSBjb21wb25lbnQsCi0gICAgICogZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIG1pbmltdW0gc2l6ZSBpcyBzZXQgZm9yIHRoZSBjb21wb25lbnQsIGZhbHNlCisgICAgICogICAgICAgICBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNNaW5pbXVtU2l6ZVNldCgpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC00NzQ5LDggKzQzNTUsOCBAQAogICAgIC8qKgogICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgcHJlZmVycmVkIHNpemUgaXMgc2V0IGZvciB0aGUgQ29tcG9uZW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHByZWZlcnJlZCBzaXplIGlzIHNldCBmb3IgdGhlIENvbXBvbmVudCwKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgcHJlZmVycmVkIHNpemUgaXMgc2V0IGZvciB0aGUgQ29tcG9uZW50LCBmYWxzZQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzUHJlZmVycmVkU2l6ZVNldCgpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC00NzY5LDggKzQzNzUsOCBAQAogICAgIHB1YmxpYyBEaW1lbnNpb24gZ2V0TWF4aW11bVNpemUoKSB7CiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGlzTWF4aW11bVNpemVTZXQoKSA/IG5ldyBEaW1lbnNpb24obWF4aW11bVNpemUpIDogbmV3IERpbWVuc2lvbigKLSAgICAgICAgICAgICAgICAgICAgU2hvcnQuTUFYX1ZBTFVFLCBTaG9ydC5NQVhfVkFMVUUpOworICAgICAgICAgICAgcmV0dXJuIGlzTWF4aW11bVNpemVTZXQoKSA/IG5ldyBEaW1lbnNpb24obWF4aW11bVNpemUpIDogbmV3IERpbWVuc2lvbihTaG9ydC5NQVhfVkFMVUUsCisgICAgICAgICAgICAgICAgICAgIFNob3J0Lk1BWF9WQUxVRSk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwogICAgICAgICB9CkBAIC00Nzk0LDcgKzQ0MDAsNiBAQAogICAgICAqIERlcHJlY2F0ZWQ6IHJlcGxhY2VkIGJ5IGdldE1pbmltdW1TaXplKCkgbWV0aG9kLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIERpbWVuc2lvbi4KLSAgICAgKiAKICAgICAgKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSBnZXRNaW5pbXVtU2l6ZSgpIG1ldGhvZC4KICAgICAgKi8KICAgICBARGVwcmVjYXRlZApAQCAtNDgwOCw3ICs0NDEzLDcgQEAKICAgICAgICAgICAgIGlmIChkZWZTaXplICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gKERpbWVuc2lvbilkZWZTaXplLmNsb25lKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gaXNEaXNwbGF5YWJsZSgpPyBuZXcgRGltZW5zaW9uKDEsIDEpIDogbmV3IERpbWVuc2lvbih3LCBoKTsKKyAgICAgICAgICAgIHJldHVybiBpc0Rpc3BsYXlhYmxlKCkgPyBuZXcgRGltZW5zaW9uKDEsIDEpIDogbmV3IERpbWVuc2lvbih3LCBoKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7CiAgICAgICAgIH0KQEAgLTQ4MzIsNyArNDQzNyw2IEBACiAgICAgICogRGVwcmVjYXRlZDogcmVwbGFjZWQgYnkgZ2V0UHJlZmVycmVkU2l6ZSgpIG1ldGhvZC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBEaW1lbnNpb24uCi0gICAgICogCiAgICAgICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgZ2V0UHJlZmVycmVkU2l6ZSgpIG1ldGhvZC4KICAgICAgKi8KICAgICBARGVwcmVjYXRlZApAQCAtNDg1NSw3ICs0NDU5LDggQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIENvbXBvbmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWF4aW11bVNpemUgdGhlIG5ldyBtYXhpbXVtIHNpemUgb2YgdGhlIENvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gbWF4aW11bVNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgbWF4aW11bSBzaXplIG9mIHRoZSBDb21wb25lbnQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TWF4aW11bVNpemUoRGltZW5zaW9uIG1heGltdW1TaXplKSB7CiAgICAgICAgIERpbWVuc2lvbiBvbGRNYXhpbXVtU2l6ZTsKQEAgLTQ4ODIsNyArNDQ4Nyw3IEBACiAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZSgibWF4aW11bVNpemUiLCBvbGRNYXhpbXVtU2l6ZSwgdGhpcy5tYXhpbXVtU2l6ZSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLz8/P0FXVDogaW52YWxpZGF0ZVJlYWxQYXJlbnQoKTsKKyAgICAgICAgICAgIC8vID8/P0FXVDogaW52YWxpZGF0ZVJlYWxQYXJlbnQoKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7CiAgICAgICAgIH0KQEAgLTQ4OTEsNyArNDQ5Niw4IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgbWluaW11bSBzaXplIG9mIHRoZSBDb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIG1pbmltdW1TaXplIHRoZSBuZXcgbWluaW11bSBzaXplIG9mIHRoZSBDb21wb25lbnQuCisgICAgICogQHBhcmFtIG1pbmltdW1TaXplCisgICAgICogICAgICAgICAgICB0aGUgbmV3IG1pbmltdW0gc2l6ZSBvZiB0aGUgQ29tcG9uZW50LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldE1pbmltdW1TaXplKERpbWVuc2lvbiBtaW5pbXVtU2l6ZSkgewogICAgICAgICBEaW1lbnNpb24gb2xkTWluaW11bVNpemU7CkBAIC00OTE4LDcgKzQ1MjQsNyBAQAogICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoIm1pbmltdW1TaXplIiwgb2xkTWluaW11bVNpemUsIHRoaXMubWluaW11bVNpemUpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8/Pz9BV1Q6IGludmFsaWRhdGVSZWFsUGFyZW50KCk7CisgICAgICAgICAgICAvLyA/Pz9BV1Q6IGludmFsaWRhdGVSZWFsUGFyZW50KCk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwogICAgICAgICB9CkBAIC00OTI3LDcgKzQ1MzMsOCBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHByZWZlcnJlZCBzaXplIG9mIHRoZSBDb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHByZWZlcnJlZFNpemUgdGhlIG5ldyBwcmVmZXJyZWQgc2l6ZSBvZiB0aGUgQ29tcG9uZW50LgorICAgICAqIEBwYXJhbSBwcmVmZXJyZWRTaXplCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHByZWZlcnJlZCBzaXplIG9mIHRoZSBDb21wb25lbnQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UHJlZmVycmVkU2l6ZShEaW1lbnNpb24gcHJlZmVycmVkU2l6ZSkgewogICAgICAgICBEaW1lbnNpb24gb2xkUHJlZmVycmVkU2l6ZTsKQEAgLTQ5NTQsNDcgKzQ1NjEsMzggQEAKICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKCJwcmVmZXJyZWRTaXplIiwgb2xkUHJlZmVycmVkU2l6ZSwgdGhpcy5wcmVmZXJyZWRTaXplKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vPz8/QVdUOiBpbnZhbGlkYXRlUmVhbFBhcmVudCgpOworICAgICAgICAgICAgLy8gPz8/QVdUOiBpbnZhbGlkYXRlUmVhbFBhcmVudCgpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vPz8/QVdUCisgICAgLy8gPz8/QVdUCiAgICAgLyoKLSAgICBSZWRyYXdNYW5hZ2VyIGdldFJlZHJhd01hbmFnZXIoKSB7Ci0gICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBhcmVudC5nZXRSZWRyYXdNYW5hZ2VyKCk7Ci0gICAgfQotICAgICovCisgICAgICogUmVkcmF3TWFuYWdlciBnZXRSZWRyYXdNYW5hZ2VyKCkgeyBpZiAocGFyZW50ID09IG51bGwpIHsgcmV0dXJuIG51bGw7IH0KKyAgICAgKiByZXR1cm4gcGFyZW50LmdldFJlZHJhd01hbmFnZXIoKTsgfQorICAgICAqLwogCiAgICAgLyoqCiAgICAgICogQ2hlY2tzIGlmIGlzIGZvY3VzYWJpbGl0eSBleHBsaWNpdGx5IHNldC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgY29tcG9uZW50IGhhcyBhIGZvY3VzYWJsZSBwZWVyCisgICAgICogQHJldHVybiB0cnVlIGlmIGNvbXBvbmVudCBoYXMgYSBmb2N1c2FibGUgcGVlci4KICAgICAgKi8KLSAgICAvLz8/P0FXVAorICAgIC8vID8/P0FXVAogICAgIC8qCi0gICAgYm9vbGVhbiBpc1BlZXJGb2N1c2FibGUoKSB7Ci0gICAgICAgIC8vIFRoZSByZWNvbW1lbmRhdGlvbnMgZm9yIFdpbmRvd3MgYW5kIFVuaXggYXJlIHRoYXQKLSAgICAgICAgLy8gQ2FudmFzZXMsIExhYmVscywgUGFuZWxzLCBTY3JvbGxiYXJzLCBTY3JvbGxQYW5lcywgV2luZG93cywKLSAgICAgICAgLy8gYW5kIGxpZ2h0d2VpZ2h0IENvbXBvbmVudHMgaGF2ZSBub24tZm9jdXNhYmxlIHBlZXJzLAotICAgICAgICAvLyBhbmQgYWxsIG90aGVyIENvbXBvbmVudHMgaGF2ZSBmb2N1c2FibGUgcGVlcnMuCi0gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgQ2FudmFzIHx8IHRoaXMgaW5zdGFuY2VvZiBMYWJlbCB8fCB0aGlzIGluc3RhbmNlb2YgUGFuZWwKLSAgICAgICAgICAgICAgICB8fCB0aGlzIGluc3RhbmNlb2YgU2Nyb2xsYmFyIHx8IHRoaXMgaW5zdGFuY2VvZiBTY3JvbGxQYW5lCi0gICAgICAgICAgICAgICAgfHwgdGhpcyBpbnN0YW5jZW9mIFdpbmRvdyB8fCBpc0xpZ2h0d2VpZ2h0KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgKi8KKyAgICAgKiBib29sZWFuIGlzUGVlckZvY3VzYWJsZSgpIHsgLy8gVGhlIHJlY29tbWVuZGF0aW9ucyBmb3IgV2luZG93cyBhbmQgVW5peAorICAgICAqIGFyZSB0aGF0IC8vIENhbnZhc2VzLCBMYWJlbHMsIFBhbmVscywgU2Nyb2xsYmFycywgU2Nyb2xsUGFuZXMsIFdpbmRvd3MsCisgICAgICogLy8gYW5kIGxpZ2h0d2VpZ2h0IENvbXBvbmVudHMgaGF2ZSBub24tZm9jdXNhYmxlIHBlZXJzLCAvLyBhbmQgYWxsIG90aGVyCisgICAgICogQ29tcG9uZW50cyBoYXZlIGZvY3VzYWJsZSBwZWVycy4gaWYgKHRoaXMgaW5zdGFuY2VvZiBDYW52YXMgfHwgdGhpcworICAgICAqIGluc3RhbmNlb2YgTGFiZWwgfHwgdGhpcyBpbnN0YW5jZW9mIFBhbmVsIHx8IHRoaXMgaW5zdGFuY2VvZiBTY3JvbGxiYXIgfHwKKyAgICAgKiB0aGlzIGluc3RhbmNlb2YgU2Nyb2xsUGFuZSB8fCB0aGlzIGluc3RhbmNlb2YgV2luZG93IHx8IGlzTGlnaHR3ZWlnaHQoKSkKKyAgICAgKiB7IHJldHVybiBmYWxzZTsgfSByZXR1cm4gdHJ1ZTsgfQorICAgICAqLwogCiAgICAgLyoqCiAgICAgICogQHJldHVybiB0cnVlIGlmIGZvY3VzYWJpbGl0eSB3YXMgZXhwbGljaXRseSBzZXQgdmlhIGEgY2FsbCB0bwogICAgICAqICAgICAgICAgc2V0Rm9jdXNhYmxlKCkgb3IgdmlhIG92ZXJyaWRpbmcgaXNGb2N1c2FibGUoKSBvcgotICAgICAqICAgICAgICAgaXNGb2N1c1RyYXZlcnNhYmxlKCkKKyAgICAgKiAgICAgICAgIGlzRm9jdXNUcmF2ZXJzYWJsZSgpLgogICAgICAqLwogICAgIGJvb2xlYW4gaXNGb2N1c2FiaWxpdHlFeHBsaWNpdGx5U2V0KCkgewogICAgICAgICByZXR1cm4gY2FsbGVkU2V0Rm9jdXNhYmxlIHx8IG92ZXJyaWRlbklzRm9jdXNhYmxlOwpAQCAtNTAwMyw3ICs0NjAxLDggQEAKICAgICAvKioKICAgICAgKiBQYWludHMgdGhlIGNvbXBvbmVudCBhbmQgYWxsIG9mIGl0cyBzdWJjb21wb25lbnRzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBnIHRoZSBHcmFwaGljcyB0byBiZSB1c2VkIGZvciBwYWludGluZy4KKyAgICAgKiBAcGFyYW0gZworICAgICAqICAgICAgICAgICAgdGhlIEdyYXBoaWNzIHRvIGJlIHVzZWQgZm9yIHBhaW50aW5nLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHBhaW50QWxsKEdyYXBoaWNzIGcpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC01MDE3LDcgKzQ2MTYsOCBAQAogICAgIC8qKgogICAgICAqIFVwZGF0ZXMgdGhpcyBDb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGcgdGhlIEdyYXBoaWNzIHRvIGJlIHVzZWQgZm9yIHVwZGF0aW5nLgorICAgICAqIEBwYXJhbSBnCisgICAgICogICAgICAgICAgICB0aGUgR3JhcGhpY3MgdG8gYmUgdXNlZCBmb3IgdXBkYXRpbmcuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdXBkYXRlKEdyYXBoaWNzIGcpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC01MDM2LDcgKzQ2MzYsOCBAQAogICAgIC8qKgogICAgICAqIFBhaW50cyB0aGlzIGNvbXBvbmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZyB0aGUgR3JhcGhpY3MgdG8gYmUgdXNlZCBmb3IgcGFpbnRpbmcuCisgICAgICogQHBhcmFtIGcKKyAgICAgKiAgICAgICAgICAgIHRoZSBHcmFwaGljcyB0byBiZSB1c2VkIGZvciBwYWludGluZy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBwYWludChHcmFwaGljcyBnKSB7CiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwpAQCAtNTA1MCw3ICs0NjUxLDggQEAKICAgICAvKioKICAgICAgKiBQcmVwYXJlcyB0aGUgY29tcG9uZW50IHRvIGJlIHBhaW50ZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGcgdGhlIEdyYXBoaWNzIHRvIGJlIHVzZWQgZm9yIHBhaW50aW5nLgorICAgICAqIEBwYXJhbSBnCisgICAgICogICAgICAgICAgICB0aGUgR3JhcGhpY3MgdG8gYmUgdXNlZCBmb3IgcGFpbnRpbmcuCiAgICAgICovCiAgICAgdm9pZCBwcmVwYWludChHcmFwaGljcyBnKSB7CiAgICAgICAgIC8vIEp1c3QgdG8gbm90aGluZy4gRm9yIG92ZXJyaWRpbmcuCkBAIC01MDU5LDcgKzQ2NjEsNyBAQAogICAgIC8qKgogICAgICAqIENoZWNrcyBpZiBpcyBwcmVwYWludGVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgaXMgcHJlcGFpbnRlcgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgaXMgcHJlcGFpbnRlci4KICAgICAgKi8KICAgICBib29sZWFuIGlzUHJlcGFpbnRlcigpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNTA4Myw0MSArNDY4NSwyOSBAQAogICAgICAgICAvLyBUbyBiZSBpbmhlcml0ZWQgYnkgQ29udGFpbmVyCiAgICAgfQogCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIHZvaWQgZmluaXNoSGllcmFyY2h5Q2hhbmdlKENvbXBvbmVudCBjaGFuZ2VkLCBDb250YWluZXIgY2hhbmdlZFBhcmVudCwgaW50IGFuY2VzdG9yRmxhZ3MpIHsKLSAgICAgICAgaWYgKC0taGllcmFyY2h5Q2hhbmdpbmdDb3VudGVyID09IDApIHsKLSAgICAgICAgICAgIGludCBjaGFuZ2VGbGFncyA9IGFuY2VzdG9yRmxhZ3M7Ci0gICAgICAgICAgICBpZiAod2FzU2hvd2luZyAhPSBpc1Nob3dpbmcoKSkgewotICAgICAgICAgICAgICAgIGNoYW5nZUZsYWdzIHw9IEhpZXJhcmNoeUV2ZW50LlNIT1dJTkdfQ0hBTkdFRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh3YXNEaXNwbGF5YWJsZSAhPSBpc0Rpc3BsYXlhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICBjaGFuZ2VGbGFncyB8PSBIaWVyYXJjaHlFdmVudC5ESVNQTEFZQUJJTElUWV9DSEFOR0VEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNoYW5nZUZsYWdzID4gMCkgewotICAgICAgICAgICAgICAgIHBvc3RFdmVudChuZXcgSGllcmFyY2h5RXZlbnQodGhpcywgSGllcmFyY2h5RXZlbnQuSElFUkFSQ0hZX0NIQU5HRUQsIGNoYW5nZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkUGFyZW50LCBjaGFuZ2VGbGFncykpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluaXNoQ2hpbGRyZW5IaWVyYXJjaHlDaGFuZ2UoY2hhbmdlZCwgY2hhbmdlZFBhcmVudCwgYW5jZXN0b3JGbGFncyk7Ci0gICAgICAgIH0KLSAgICB9CisgICAgICogdm9pZCBmaW5pc2hIaWVyYXJjaHlDaGFuZ2UoQ29tcG9uZW50IGNoYW5nZWQsIENvbnRhaW5lciBjaGFuZ2VkUGFyZW50LAorICAgICAqIGludCBhbmNlc3RvckZsYWdzKSB7IGlmICgtLWhpZXJhcmNoeUNoYW5naW5nQ291bnRlciA9PSAwKSB7IGludAorICAgICAqIGNoYW5nZUZsYWdzID0gYW5jZXN0b3JGbGFnczsgaWYgKHdhc1Nob3dpbmcgIT0gaXNTaG93aW5nKCkpIHsgY2hhbmdlRmxhZ3MKKyAgICAgKiB8PSBIaWVyYXJjaHlFdmVudC5TSE9XSU5HX0NIQU5HRUQ7IH0gaWYgKHdhc0Rpc3BsYXlhYmxlICE9CisgICAgICogaXNEaXNwbGF5YWJsZSgpKSB7IGNoYW5nZUZsYWdzIHw9IEhpZXJhcmNoeUV2ZW50LkRJU1BMQVlBQklMSVRZX0NIQU5HRUQ7CisgICAgICogfSBpZiAoY2hhbmdlRmxhZ3MgPiAwKSB7IHBvc3RFdmVudChuZXcgSGllcmFyY2h5RXZlbnQodGhpcywKKyAgICAgKiBIaWVyYXJjaHlFdmVudC5ISUVSQVJDSFlfQ0hBTkdFRCwgY2hhbmdlZCwgY2hhbmdlZFBhcmVudCwgY2hhbmdlRmxhZ3MpKTsKKyAgICAgKiB9IGZpbmlzaENoaWxkcmVuSGllcmFyY2h5Q2hhbmdlKGNoYW5nZWQsIGNoYW5nZWRQYXJlbnQsIGFuY2VzdG9yRmxhZ3MpOyB9CisgICAgICogfSB2b2lkIGZpbmlzaENoaWxkcmVuSGllcmFyY2h5Q2hhbmdlKENvbXBvbmVudCBjaGFuZ2VkLCBDb250YWluZXIKKyAgICAgKiBjaGFuZ2VkUGFyZW50LCBpbnQgYW5jZXN0b3JGbGFncykgeyAvLyBUbyBiZSBpbmhlcml0ZWQgYnkgQ29udGFpbmVyIH0KKyAgICAgKiB2b2lkIHBvc3RIaWVyYXJjaHlCb3VuZHNFdmVudHMoQ29tcG9uZW50IGNoYW5nZWQsIGludCBpZCkgeyBwb3N0RXZlbnQobmV3CisgICAgICogSGllcmFyY2h5RXZlbnQodGhpcywgaWQsIGNoYW5nZWQsIG51bGwsIDApKTsgfQorICAgICAqLwogCi0KLSAgICB2b2lkIGZpbmlzaENoaWxkcmVuSGllcmFyY2h5Q2hhbmdlKENvbXBvbmVudCBjaGFuZ2VkLCBDb250YWluZXIgY2hhbmdlZFBhcmVudCwKLSAgICAgICAgICAgIGludCBhbmNlc3RvckZsYWdzKSB7Ci0gICAgICAgIC8vIFRvIGJlIGluaGVyaXRlZCBieSBDb250YWluZXIKLSAgICB9Ci0KLSAgICB2b2lkIHBvc3RIaWVyYXJjaHlCb3VuZHNFdmVudHMoQ29tcG9uZW50IGNoYW5nZWQsIGludCBpZCkgewotICAgICAgICBwb3N0RXZlbnQobmV3IEhpZXJhcmNoeUV2ZW50KHRoaXMsIGlkLCBjaGFuZ2VkLCBudWxsLCAwKSk7Ci0gICAgfQotICAgICovCi0gICAgCiAgICAgLyoqCiAgICAgICogU3ByZWFkIGhpZXJhcmNoeSBib3VuZHMgZXZlbnRzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjaGFuZ2VkIHRoZSBjaGFuZ2VkCi0gICAgICogQHBhcmFtIGlkIHRoZSBpZAorICAgICAqIEBwYXJhbSBjaGFuZ2VkCisgICAgICogICAgICAgICAgICB0aGUgY2hhbmdlZC4KKyAgICAgKiBAcGFyYW0gaWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpZC4KICAgICAgKi8KICAgICB2b2lkIHNwcmVhZEhpZXJhcmNoeUJvdW5kc0V2ZW50cyhDb21wb25lbnQgY2hhbmdlZCwgaW50IGlkKSB7CiAgICAgICAgIC8vIFRvIGJlIGluaGVyaXRlZCBieSBDb250YWluZXIKQEAgLTUxMjYsNTkgKzQ3MTYsNDAgQEAKICAgICAvKioKICAgICAgKiBEaXNwYXRjaGVzIGFuIGV2ZW50IHRvIHRoaXMgY29tcG9uZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBlIHRoZSBFdmVudC4KKyAgICAgKiBAcGFyYW0gZQorICAgICAqICAgICAgICAgICAgdGhlIEV2ZW50LgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGRpc3BhdGNoRXZlbnQoQVdURXZlbnQgZSkgewotICAgICAgICAvLz8/P0FXVAorICAgICAgICAvLyA/Pz9BV1QKICAgICAgICAgLyoKLSAgICAgICAgaWYgKGUuaXNDb25zdW1lZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBQYWludEV2ZW50KSB7Ci0gICAgICAgICAgICB0b29sa2l0LmRpc3BhdGNoQVdURXZlbnQoZSk7Ci0gICAgICAgICAgICBwcm9jZXNzUGFpbnRFdmVudCgoUGFpbnRFdmVudCkgZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgS2V5Ym9hcmRGb2N1c01hbmFnZXIga2ZtID0gS2V5Ym9hcmRGb2N1c01hbmFnZXIuZ2V0Q3VycmVudEtleWJvYXJkRm9jdXNNYW5hZ2VyKCk7Ci0gICAgICAgIGlmICghZS5kaXNwYXRjaGVkQnlLRk0gJiYga2ZtLmRpc3BhdGNoRXZlbnQoZSkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEtleUV2ZW50KSB7Ci0gICAgICAgICAgICBLZXlFdmVudCBrZSA9IChLZXlFdmVudCkgZTsKLSAgICAgICAgICAgIC8vIGNvbnN1bWVzIEtleUV2ZW50IHdoaWNoIHJlcHJlc2VudHMgYSBmb2N1cyB0cmF2ZXJzYWwga2V5Ci0gICAgICAgICAgICBpZiAoZ2V0Rm9jdXNUcmF2ZXJzYWxLZXlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAga2ZtLnByb2Nlc3NLZXlFdmVudCh0aGlzLCBrZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGtlLmlzQ29uc3VtZWQoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dE1ldGhvZHNFbmFibGVkICYmIGRpc3BhdGNoVG9JTSAmJiBlLmlzUG9zdGVkICYmIGRpc3BhdGNoRXZlbnRUb0lNKGUpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGUuZ2V0SUQoKSA9PSBXaW5kb3dFdmVudC5XSU5ET1dfSUNPTklGSUVEKSB7Ci0gICAgICAgICAgICBub3RpZnlJbnB1dE1ldGhvZChudWxsKTsKLSAgICAgICAgfQotICAgICAgICBBV1RFdmVudC5FdmVudERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IHRvb2xraXQuZXZlbnRUeXBlTG9va3VwLmdldEV2ZW50RGVzY3JpcHRvcihlKTsKLSAgICAgICAgdG9vbGtpdC5kaXNwYXRjaEFXVEV2ZW50KGUpOwotICAgICAgICBpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoaXNFdmVudEVuYWJsZWQoZGVzY3JpcHRvci5ldmVudE1hc2spCi0gICAgICAgICAgICAgICAgICAgIHx8IChnZXRMaXN0ZW5lcnMoZGVzY3JpcHRvci5saXN0ZW5lclR5cGUpLmxlbmd0aCA+IDApKSB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0V2ZW50KGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gaW5wdXQgZXZlbnRzIGNhbiBiZSBjb25zdW1lZCBieSB1c2VyIGxpc3RlbmVyczoKLSAgICAgICAgICAgIGlmICghZS5pc0NvbnN1bWVkKCkgJiYgKChlbmFibGVkQVdURXZlbnRzICYgZGVzY3JpcHRvci5ldmVudE1hc2spICE9IDApKSB7Ci0gICAgICAgICAgICAgICAgcG9zdHByb2Nlc3NFdmVudChlLCBkZXNjcmlwdG9yLmV2ZW50TWFzayk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcG9zdERlcHJlY2F0ZWRFdmVudChlKTsKLSAgICAgICAgKi8KKyAgICAgICAgICogaWYgKGUuaXNDb25zdW1lZCgpKSB7IHJldHVybjsgfSBpZiAoZSBpbnN0YW5jZW9mIFBhaW50RXZlbnQpIHsKKyAgICAgICAgICogdG9vbGtpdC5kaXNwYXRjaEFXVEV2ZW50KGUpOyBwcm9jZXNzUGFpbnRFdmVudCgoUGFpbnRFdmVudCkgZSk7CisgICAgICAgICAqIHJldHVybjsgfSBLZXlib2FyZEZvY3VzTWFuYWdlciBrZm0gPQorICAgICAgICAgKiBLZXlib2FyZEZvY3VzTWFuYWdlci5nZXRDdXJyZW50S2V5Ym9hcmRGb2N1c01hbmFnZXIoKTsgaWYKKyAgICAgICAgICogKCFlLmRpc3BhdGNoZWRCeUtGTSAmJiBrZm0uZGlzcGF0Y2hFdmVudChlKSkgeyByZXR1cm47IH0gaWYgKGUKKyAgICAgICAgICogaW5zdGFuY2VvZiBLZXlFdmVudCkgeyBLZXlFdmVudCBrZSA9IChLZXlFdmVudCkgZTsgLy8gY29uc3VtZXMKKyAgICAgICAgICogS2V5RXZlbnQgd2hpY2ggcmVwcmVzZW50cyBhIGZvY3VzIHRyYXZlcnNhbCBrZXkgaWYKKyAgICAgICAgICogKGdldEZvY3VzVHJhdmVyc2FsS2V5c0VuYWJsZWQoKSkgeyBrZm0ucHJvY2Vzc0tleUV2ZW50KHRoaXMsIGtlKTsgaWYKKyAgICAgICAgICogKGtlLmlzQ29uc3VtZWQoKSkgeyByZXR1cm47IH0gfSB9IGlmIChpbnB1dE1ldGhvZHNFbmFibGVkICYmCisgICAgICAgICAqIGRpc3BhdGNoVG9JTSAmJiBlLmlzUG9zdGVkICYmIGRpc3BhdGNoRXZlbnRUb0lNKGUpKSB7IHJldHVybjsgfSBpZgorICAgICAgICAgKiAoZS5nZXRJRCgpID09IFdpbmRvd0V2ZW50LldJTkRPV19JQ09OSUZJRUQpIHsKKyAgICAgICAgICogbm90aWZ5SW5wdXRNZXRob2QobnVsbCk7IH0gQVdURXZlbnQuRXZlbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPQorICAgICAgICAgKiB0b29sa2l0LmV2ZW50VHlwZUxvb2t1cC5nZXRFdmVudERlc2NyaXB0b3IoZSk7CisgICAgICAgICAqIHRvb2xraXQuZGlzcGF0Y2hBV1RFdmVudChlKTsgaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgeyBpZgorICAgICAgICAgKiAoaXNFdmVudEVuYWJsZWQoZGVzY3JpcHRvci5ldmVudE1hc2spIHx8CisgICAgICAgICAqIChnZXRMaXN0ZW5lcnMoZGVzY3JpcHRvci5saXN0ZW5lclR5cGUpLmxlbmd0aCA+IDApKSB7CisgICAgICAgICAqIHByb2Nlc3NFdmVudChlKTsgfSAvLyBpbnB1dCBldmVudHMgY2FuIGJlIGNvbnN1bWVkIGJ5IHVzZXIgbGlzdGVuZXJzOgorICAgICAgICAgKiBpZiAoIWUuaXNDb25zdW1lZCgpICYmICgoZW5hYmxlZEFXVEV2ZW50cyAmIGRlc2NyaXB0b3IuZXZlbnRNYXNrKSAhPQorICAgICAgICAgKiAwKSkgeyBwb3N0cHJvY2Vzc0V2ZW50KGUsIGRlc2NyaXB0b3IuZXZlbnRNYXNrKTsgfSB9CisgICAgICAgICAqIHBvc3REZXByZWNhdGVkRXZlbnQoZSk7CisgICAgICAgICAqLwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFBvc3QgZGVwcmVjYXRlZCBldmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZSB0aGUgZQorICAgICAqIEBwYXJhbSBlCisgICAgICogICAgICAgICAgICB0aGUgZS4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgcG9zdERlcHJlY2F0ZWRFdmVudChBV1RFdmVudCBlKSB7CiAgICAgICAgIGlmIChkZXByZWNhdGVkRXZlbnRIYW5kbGVyKSB7CkBAIC01MTkyLDI3ICs0NzYzLDI5IEBACiAgICAgLyoqCiAgICAgICogUG9zdHByb2Nlc3MgZXZlbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGUgdGhlIGUKLSAgICAgKiBAcGFyYW0gZXZlbnRNYXNrIHRoZSBldmVudCBtYXNrCisgICAgICogQHBhcmFtIGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlLgorICAgICAqIEBwYXJhbSBldmVudE1hc2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBldmVudCBtYXNrLgogICAgICAqLwogICAgIHZvaWQgcG9zdHByb2Nlc3NFdmVudChBV1RFdmVudCBlLCBsb25nIGV2ZW50TWFzaykgewogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIC8vIGNhbGwgc3lzdGVtIGxpc3RlbmVycyB1bmRlciBBV1QgbG9jawogICAgICAgICAgICAgaWYgKGV2ZW50TWFzayA9PSBBV1RFdmVudC5GT0NVU19FVkVOVF9NQVNLKSB7Ci0gICAgICAgICAgICAgICAgcHJlcHJvY2Vzc0ZvY3VzRXZlbnQoKEZvY3VzRXZlbnQpIGUpOworICAgICAgICAgICAgICAgIHByZXByb2Nlc3NGb2N1c0V2ZW50KChGb2N1c0V2ZW50KWUpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudE1hc2sgPT0gQVdURXZlbnQuS0VZX0VWRU5UX01BU0spIHsKLSAgICAgICAgICAgICAgICBwcmVwcm9jZXNzS2V5RXZlbnQoKEtleUV2ZW50KSBlKTsKKyAgICAgICAgICAgICAgICBwcmVwcm9jZXNzS2V5RXZlbnQoKEtleUV2ZW50KWUpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudE1hc2sgPT0gQVdURXZlbnQuTU9VU0VfRVZFTlRfTUFTSykgewotICAgICAgICAgICAgICAgIHByZXByb2Nlc3NNb3VzZUV2ZW50KChNb3VzZUV2ZW50KSBlKTsKKyAgICAgICAgICAgICAgICBwcmVwcm9jZXNzTW91c2VFdmVudCgoTW91c2VFdmVudCllKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRNYXNrID09IEFXVEV2ZW50Lk1PVVNFX01PVElPTl9FVkVOVF9NQVNLKSB7Ci0gICAgICAgICAgICAgICAgcHJlcHJvY2Vzc01vdXNlTW90aW9uRXZlbnQoKE1vdXNlRXZlbnQpIGUpOworICAgICAgICAgICAgICAgIHByZXByb2Nlc3NNb3VzZU1vdGlvbkV2ZW50KChNb3VzZUV2ZW50KWUpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudE1hc2sgPT0gQVdURXZlbnQuQ09NUE9ORU5UX0VWRU5UX01BU0spIHsKLSAgICAgICAgICAgICAgICBwcmVwcm9jZXNzQ29tcG9uZW50RXZlbnQoKENvbXBvbmVudEV2ZW50KSBlKTsKKyAgICAgICAgICAgICAgICBwcmVwcm9jZXNzQ29tcG9uZW50RXZlbnQoKENvbXBvbmVudEV2ZW50KWUpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudE1hc2sgPT0gQVdURXZlbnQuTU9VU0VfV0hFRUxfRVZFTlRfTUFTSykgewotICAgICAgICAgICAgICAgIHByZXByb2Nlc3NNb3VzZVdoZWVsRXZlbnQoKE1vdXNlV2hlZWxFdmVudCkgZSk7CisgICAgICAgICAgICAgICAgcHJlcHJvY2Vzc01vdXNlV2hlZWxFdmVudCgoTW91c2VXaGVlbEV2ZW50KWUpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudE1hc2sgPT0gQVdURXZlbnQuSU5QVVRfTUVUSE9EX0VWRU5UX01BU0spIHsKLSAgICAgICAgICAgICAgICBwcmVwcm9jZXNzSW5wdXRNZXRob2RFdmVudCgoSW5wdXRNZXRob2RFdmVudCkgZSk7CisgICAgICAgICAgICAgICAgcHJlcHJvY2Vzc0lucHV0TWV0aG9kRXZlbnQoKElucHV0TWV0aG9kRXZlbnQpZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICB0b29sa2l0LnVubG9ja0FXVCgpOwpAQCAtNTIyMiw3ICs0Nzk1LDggQEAKICAgICAvKioKICAgICAgKiBQcmVwcm9jZXNzIGlucHV0IG1ldGhvZCBldmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZSB0aGUgZQorICAgICAqIEBwYXJhbSBlCisgICAgICogICAgICAgICAgICB0aGUgZS4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgcHJlcHJvY2Vzc0lucHV0TWV0aG9kRXZlbnQoSW5wdXRNZXRob2RFdmVudCBlKSB7CiAgICAgICAgIHByb2Nlc3NJbnB1dE1ldGhvZEV2ZW50SW1wbChlLCBpbnB1dE1ldGhvZExpc3RlbmVycy5nZXRTeXN0ZW1MaXN0ZW5lcnMoKSk7CkBAIC01MjMxLDcgKzQ4MDUsOCBAQAogICAgIC8qKgogICAgICAqIFByZXByb2Nlc3MgbW91c2Ugd2hlZWwgZXZlbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGUgdGhlIGUKKyAgICAgKiBAcGFyYW0gZQorICAgICAqICAgICAgICAgICAgdGhlIGUuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHByZXByb2Nlc3NNb3VzZVdoZWVsRXZlbnQoTW91c2VXaGVlbEV2ZW50IGUpIHsKICAgICAgICAgcHJvY2Vzc01vdXNlV2hlZWxFdmVudEltcGwoZSwgbW91c2VXaGVlbExpc3RlbmVycy5nZXRTeXN0ZW1MaXN0ZW5lcnMoKSk7CkBAIC01MjQwLDggKzQ4MTUsMTAgQEAKICAgICAvKioKICAgICAgKiBQcm9jZXNzIG1vdXNlIHdoZWVsIGV2ZW50IGltcGwuCiAgICAgICogCi0gICAgICogQHBhcmFtIGUgdGhlIGUKLSAgICAgKiBAcGFyYW0gYyB0aGUgYworICAgICAqIEBwYXJhbSBlCisgICAgICogICAgICAgICAgICB0aGUgZS4KKyAgICAgKiBAcGFyYW0gYworICAgICAqICAgICAgICAgICAgdGhlIGMuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NNb3VzZVdoZWVsRXZlbnRJbXBsKE1vdXNlV2hlZWxFdmVudCBlLCBDb2xsZWN0aW9uPE1vdXNlV2hlZWxMaXN0ZW5lcj4gYykgewogICAgICAgICBmb3IgKE1vdXNlV2hlZWxMaXN0ZW5lciBsaXN0ZW5lciA6IGMpIHsKQEAgLTUyNTYsNyArNDgzMyw4IEBACiAgICAgLyoqCiAgICAgICogUHJlcHJvY2VzcyBjb21wb25lbnQgZXZlbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGUgdGhlIGUKKyAgICAgKiBAcGFyYW0gZQorICAgICAqICAgICAgICAgICAgdGhlIGUuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHByZXByb2Nlc3NDb21wb25lbnRFdmVudChDb21wb25lbnRFdmVudCBlKSB7CiAgICAgICAgIHByb2Nlc3NDb21wb25lbnRFdmVudEltcGwoZSwgY29tcG9uZW50TGlzdGVuZXJzLmdldFN5c3RlbUxpc3RlbmVycygpKTsKQEAgLTUyNjUsNyArNDg0Myw4IEBACiAgICAgLyoqCiAgICAgICogUHJlcHJvY2VzcyBtb3VzZSBtb3Rpb24gZXZlbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGUgdGhlIGUKKyAgICAgKiBAcGFyYW0gZQorICAgICAqICAgICAgICAgICAgdGhlIGUuCiAgICAgICovCiAgICAgdm9pZCBwcmVwcm9jZXNzTW91c2VNb3Rpb25FdmVudChNb3VzZUV2ZW50IGUpIHsKICAgICAgICAgcHJvY2Vzc01vdXNlTW90aW9uRXZlbnRJbXBsKGUsIG1vdXNlTW90aW9uTGlzdGVuZXJzLmdldFN5c3RlbUxpc3RlbmVycygpKTsKQEAgLTUyNzQsNyArNDg1Myw4IEBACiAgICAgLyoqCiAgICAgICogUHJlcHJvY2VzcyBtb3VzZSBldmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZSB0aGUgZQorICAgICAqIEBwYXJhbSBlCisgICAgICogICAgICAgICAgICB0aGUgZQogICAgICAqLwogICAgIHZvaWQgcHJlcHJvY2Vzc01vdXNlRXZlbnQoTW91c2VFdmVudCBlKSB7CiAgICAgICAgIHByb2Nlc3NNb3VzZUV2ZW50SW1wbChlLCBtb3VzZUxpc3RlbmVycy5nZXRTeXN0ZW1MaXN0ZW5lcnMoKSk7CkBAIC01MjgzLDcgKzQ4NjMsOCBAQAogICAgIC8qKgogICAgICAqIFByZXByb2Nlc3Mga2V5IGV2ZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBlIHRoZSBlCisgICAgICogQHBhcmFtIGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlLgogICAgICAqLwogICAgIHZvaWQgcHJlcHJvY2Vzc0tleUV2ZW50KEtleUV2ZW50IGUpIHsKICAgICAgICAgcHJvY2Vzc0tleUV2ZW50SW1wbChlLCBrZXlMaXN0ZW5lcnMuZ2V0U3lzdGVtTGlzdGVuZXJzKCkpOwpAQCAtNTI5Miw3OSArNDg3Myw4MiBAQAogICAgIC8qKgogICAgICAqIFByZXByb2Nlc3MgZm9jdXMgZXZlbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGUgdGhlIGUKKyAgICAgKiBAcGFyYW0gZQorICAgICAqICAgICAgICAgICAgdGhlIGUuCiAgICAgICovCiAgICAgdm9pZCBwcmVwcm9jZXNzRm9jdXNFdmVudChGb2N1c0V2ZW50IGUpIHsKICAgICAgICAgcHJvY2Vzc0ZvY3VzRXZlbnRJbXBsKGUsIGZvY3VzTGlzdGVuZXJzLmdldFN5c3RlbUxpc3RlbmVycygpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgQVdURXZlbnQgb2NjdXJyZWQgb24gdGhpcyBjb21wb25lbnQuIAorICAgICAqIFByb2Nlc3NlcyBBV1RFdmVudCBvY2N1cnJlZCBvbiB0aGlzIGNvbXBvbmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZSB0aGUgQVdURXZlbnQuCisgICAgICogQHBhcmFtIGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBBV1RFdmVudC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRXZlbnQoQVdURXZlbnQgZSkgewogICAgICAgICBsb25nIGV2ZW50TWFzayA9IHRvb2xraXQuZXZlbnRUeXBlTG9va3VwLmdldEV2ZW50TWFzayhlKTsKICAgICAgICAgaWYgKGV2ZW50TWFzayA9PSBBV1RFdmVudC5DT01QT05FTlRfRVZFTlRfTUFTSykgewotICAgICAgICAgICAgcHJvY2Vzc0NvbXBvbmVudEV2ZW50KChDb21wb25lbnRFdmVudCkgZSk7CisgICAgICAgICAgICBwcm9jZXNzQ29tcG9uZW50RXZlbnQoKENvbXBvbmVudEV2ZW50KWUpOwogICAgICAgICB9IGVsc2UgaWYgKGV2ZW50TWFzayA9PSBBV1RFdmVudC5GT0NVU19FVkVOVF9NQVNLKSB7Ci0gICAgICAgICAgICBwcm9jZXNzRm9jdXNFdmVudCgoRm9jdXNFdmVudCkgZSk7CisgICAgICAgICAgICBwcm9jZXNzRm9jdXNFdmVudCgoRm9jdXNFdmVudCllKTsKICAgICAgICAgfSBlbHNlIGlmIChldmVudE1hc2sgPT0gQVdURXZlbnQuS0VZX0VWRU5UX01BU0spIHsKLSAgICAgICAgICAgIHByb2Nlc3NLZXlFdmVudCgoS2V5RXZlbnQpIGUpOworICAgICAgICAgICAgcHJvY2Vzc0tleUV2ZW50KChLZXlFdmVudCllKTsKICAgICAgICAgfSBlbHNlIGlmIChldmVudE1hc2sgPT0gQVdURXZlbnQuTU9VU0VfRVZFTlRfTUFTSykgewotICAgICAgICAgICAgcHJvY2Vzc01vdXNlRXZlbnQoKE1vdXNlRXZlbnQpIGUpOworICAgICAgICAgICAgcHJvY2Vzc01vdXNlRXZlbnQoKE1vdXNlRXZlbnQpZSk7CiAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRNYXNrID09IEFXVEV2ZW50Lk1PVVNFX1dIRUVMX0VWRU5UX01BU0spIHsKLSAgICAgICAgICAgIHByb2Nlc3NNb3VzZVdoZWVsRXZlbnQoKE1vdXNlV2hlZWxFdmVudCkgZSk7CisgICAgICAgICAgICBwcm9jZXNzTW91c2VXaGVlbEV2ZW50KChNb3VzZVdoZWVsRXZlbnQpZSk7CiAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRNYXNrID09IEFXVEV2ZW50Lk1PVVNFX01PVElPTl9FVkVOVF9NQVNLKSB7Ci0gICAgICAgICAgICBwcm9jZXNzTW91c2VNb3Rpb25FdmVudCgoTW91c2VFdmVudCkgZSk7CisgICAgICAgICAgICBwcm9jZXNzTW91c2VNb3Rpb25FdmVudCgoTW91c2VFdmVudCllKTsKICAgICAgICAgfSBlbHNlIGlmIChldmVudE1hc2sgPT0gQVdURXZlbnQuSElFUkFSQ0hZX0VWRU5UX01BU0spIHsKLSAgICAgICAgICAgIHByb2Nlc3NIaWVyYXJjaHlFdmVudCgoSGllcmFyY2h5RXZlbnQpIGUpOworICAgICAgICAgICAgcHJvY2Vzc0hpZXJhcmNoeUV2ZW50KChIaWVyYXJjaHlFdmVudCllKTsKICAgICAgICAgfSBlbHNlIGlmIChldmVudE1hc2sgPT0gQVdURXZlbnQuSElFUkFSQ0hZX0JPVU5EU19FVkVOVF9NQVNLKSB7Ci0gICAgICAgICAgICBwcm9jZXNzSGllcmFyY2h5Qm91bmRzRXZlbnQoKEhpZXJhcmNoeUV2ZW50KSBlKTsKKyAgICAgICAgICAgIHByb2Nlc3NIaWVyYXJjaHlCb3VuZHNFdmVudCgoSGllcmFyY2h5RXZlbnQpZSk7CiAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRNYXNrID09IEFXVEV2ZW50LklOUFVUX01FVEhPRF9FVkVOVF9NQVNLKSB7Ci0gICAgICAgICAgICBwcm9jZXNzSW5wdXRNZXRob2RFdmVudCgoSW5wdXRNZXRob2RFdmVudCkgZSk7CisgICAgICAgICAgICBwcm9jZXNzSW5wdXRNZXRob2RFdmVudCgoSW5wdXRNZXRob2RFdmVudCllKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYW4gYXJyYXkgb2YgYWxsIGxpc3RlbmVyJ3Mgb2JqZWN0cyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkCi0gICAgICogbGlzdGVuZXIgdHlwZSBhbmQgcmVnaXN0ZXJlZCB0byB0aGlzIENvbXBvbmVudC4KKyAgICAgKiBHZXRzIGFuIGFycmF5IG9mIGFsbCBsaXN0ZW5lcidzIG9iamVjdHMgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBsaXN0ZW5lcgorICAgICAqIHR5cGUgYW5kIHJlZ2lzdGVyZWQgdG8gdGhpcyBDb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGxpc3RlbmVyVHlwZSB0aGUgbGlzdGVuZXIgdHlwZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXJUeXBlCisgICAgICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgdHlwZS4KICAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGFsbCBsaXN0ZW5lcidzIG9iamVjdHMgYmFzZWQgb24gdGhlIHNwZWNpZmllZAotICAgICAqIGxpc3RlbmVyIHR5cGUgYW5kIHJlZ2lzdGVyZWQgdG8gdGhpcyBDb21wb25lbnQuIAorICAgICAqICAgICAgICAgbGlzdGVuZXIgdHlwZSBhbmQgcmVnaXN0ZXJlZCB0byB0aGlzIENvbXBvbmVudC4KICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgPFQgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBUW10gZ2V0TGlzdGVuZXJzKENsYXNzPFQ+IGxpc3RlbmVyVHlwZSkgewogICAgICAgICBpZiAoQ29tcG9uZW50TGlzdGVuZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShsaXN0ZW5lclR5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKFRbXSkgZ2V0Q29tcG9uZW50TGlzdGVuZXJzKCk7CisgICAgICAgICAgICByZXR1cm4gKFRbXSlnZXRDb21wb25lbnRMaXN0ZW5lcnMoKTsKICAgICAgICAgfSBlbHNlIGlmIChGb2N1c0xpc3RlbmVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20obGlzdGVuZXJUeXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIChUW10pIGdldEZvY3VzTGlzdGVuZXJzKCk7CisgICAgICAgICAgICByZXR1cm4gKFRbXSlnZXRGb2N1c0xpc3RlbmVycygpOwogICAgICAgICB9IGVsc2UgaWYgKEhpZXJhcmNoeUJvdW5kc0xpc3RlbmVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20obGlzdGVuZXJUeXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIChUW10pIGdldEhpZXJhcmNoeUJvdW5kc0xpc3RlbmVycygpOworICAgICAgICAgICAgcmV0dXJuIChUW10pZ2V0SGllcmFyY2h5Qm91bmRzTGlzdGVuZXJzKCk7CiAgICAgICAgIH0gZWxzZSBpZiAoSGllcmFyY2h5TGlzdGVuZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShsaXN0ZW5lclR5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKFRbXSkgZ2V0SGllcmFyY2h5TGlzdGVuZXJzKCk7CisgICAgICAgICAgICByZXR1cm4gKFRbXSlnZXRIaWVyYXJjaHlMaXN0ZW5lcnMoKTsKICAgICAgICAgfSBlbHNlIGlmIChJbnB1dE1ldGhvZExpc3RlbmVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20obGlzdGVuZXJUeXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIChUW10pIGdldElucHV0TWV0aG9kTGlzdGVuZXJzKCk7CisgICAgICAgICAgICByZXR1cm4gKFRbXSlnZXRJbnB1dE1ldGhvZExpc3RlbmVycygpOwogICAgICAgICB9IGVsc2UgaWYgKEtleUxpc3RlbmVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20obGlzdGVuZXJUeXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIChUW10pIGdldEtleUxpc3RlbmVycygpOworICAgICAgICAgICAgcmV0dXJuIChUW10pZ2V0S2V5TGlzdGVuZXJzKCk7CiAgICAgICAgIH0gZWxzZSBpZiAoTW91c2VXaGVlbExpc3RlbmVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20obGlzdGVuZXJUeXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIChUW10pIGdldE1vdXNlV2hlZWxMaXN0ZW5lcnMoKTsKKyAgICAgICAgICAgIHJldHVybiAoVFtdKWdldE1vdXNlV2hlZWxMaXN0ZW5lcnMoKTsKICAgICAgICAgfSBlbHNlIGlmIChNb3VzZU1vdGlvbkxpc3RlbmVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20obGlzdGVuZXJUeXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIChUW10pIGdldE1vdXNlTW90aW9uTGlzdGVuZXJzKCk7CisgICAgICAgICAgICByZXR1cm4gKFRbXSlnZXRNb3VzZU1vdGlvbkxpc3RlbmVycygpOwogICAgICAgICB9IGVsc2UgaWYgKE1vdXNlTGlzdGVuZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShsaXN0ZW5lclR5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKFRbXSkgZ2V0TW91c2VMaXN0ZW5lcnMoKTsKKyAgICAgICAgICAgIHJldHVybiAoVFtdKWdldE1vdXNlTGlzdGVuZXJzKCk7CiAgICAgICAgIH0gZWxzZSBpZiAoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGxpc3RlbmVyVHlwZSkpIHsKLSAgICAgICAgICAgIHJldHVybiAoVFtdKSBnZXRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycygpOworICAgICAgICAgICAgcmV0dXJuIChUW10pZ2V0UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gKFRbXSkgQXJyYXkubmV3SW5zdGFuY2UobGlzdGVuZXJUeXBlLCAwKTsKKyAgICAgICAgcmV0dXJuIChUW10pQXJyYXkubmV3SW5zdGFuY2UobGlzdGVuZXJUeXBlLCAwKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBQcm9jZXNzIHBhaW50IGV2ZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBldmVudCB0aGUgZXZlbnQKKyAgICAgKiBAcGFyYW0gZXZlbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBldmVudC4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1BhaW50RXZlbnQoUGFpbnRFdmVudCBldmVudCkgewogICAgICAgICBpZiAocmVkcmF3TWFuYWdlciA9PSBudWxsKSB7CkBAIC01MzkyLDEzICs0OTc2LDE1IEBACiAgICAgLyoqCiAgICAgICogSW5pdHMgdGhlIGdyYXBoaWNzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBnIHRoZSBnCi0gICAgICogQHBhcmFtIGUgdGhlIGUKKyAgICAgKiBAcGFyYW0gZworICAgICAqICAgICAgICAgICAgdGhlIGcuCisgICAgICogQHBhcmFtIGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlLgogICAgICAqLwogICAgIHZvaWQgaW5pdEdyYXBoaWNzKEdyYXBoaWNzIGcsIFBhaW50RXZlbnQgZSkgewogICAgICAgICBSZWN0YW5nbGUgY2xpcCA9IGUuZ2V0VXBkYXRlUmVjdCgpOwogICAgICAgICBpZiAoY2xpcCBpbnN0YW5jZW9mIENsaXBSZWdpb24pIHsKLSAgICAgICAgICAgIGcuc2V0Q2xpcCgoKENsaXBSZWdpb24pIGNsaXApLmdldENsaXAoKSk7CisgICAgICAgICAgICBnLnNldENsaXAoKChDbGlwUmVnaW9uKWNsaXApLmdldENsaXAoKSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBnLnNldENsaXAoY2xpcCk7CiAgICAgICAgIH0KQEAgLTU0MTMsMTEgKzQ5OTksMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBFbmFibGVzIHRoZSBldmVudHMgd2l0aCB0aGUgc3BlY2lmaWVkIGV2ZW50IG1hc2sgdG8gYmUgZGVsaXZlcmVkIHRvIAotICAgICAqIHRoaXMgY29tcG9uZW50LgorICAgICAqIEVuYWJsZXMgdGhlIGV2ZW50cyB3aXRoIHRoZSBzcGVjaWZpZWQgZXZlbnQgbWFzayB0byBiZSBkZWxpdmVyZWQgdG8gdGhpcworICAgICAqIGNvbXBvbmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXZlbnRzVG9FbmFibGUgdGhlIGV2ZW50cyBtYXNrIHdoaWNoIHNwZWNpZmllcyB0aGUgdHlwZXMgCi0gICAgICogb2YgZXZlbnRzIHRvIGVuYWJsZS4KKyAgICAgKiBAcGFyYW0gZXZlbnRzVG9FbmFibGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBldmVudHMgbWFzayB3aGljaCBzcGVjaWZpZXMgdGhlIHR5cGVzIG9mIGV2ZW50cyB0byBlbmFibGUuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgZW5hYmxlRXZlbnRzKGxvbmcgZXZlbnRzVG9FbmFibGUpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC01NDMyLDE3ICs1MDE4LDE5IEBACiAgICAgLyoqCiAgICAgICogRW5hYmxlIGF3dCBldmVudHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGV2ZW50c1RvRW5hYmxlIHRoZSBldmVudHMgdG8gZW5hYmxlCisgICAgICogQHBhcmFtIGV2ZW50c1RvRW5hYmxlCisgICAgICogICAgICAgICAgICB0aGUgZXZlbnRzIHRvIGVuYWJsZS4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgZW5hYmxlQVdURXZlbnRzKGxvbmcgZXZlbnRzVG9FbmFibGUpIHsKICAgICAgICAgZW5hYmxlZEFXVEV2ZW50cyB8PSBldmVudHNUb0VuYWJsZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBEaXNhYmxlcyB0aGUgZXZlbnRzIHdpdGggdHlwZXMgc3BlY2lmaWVkIGJ5IHRoZSBzcGVjaWZpZWQgZXZlbnQgbWFzayAKLSAgICAgKiBmcm9tIGJlaW5nIGRlbGl2ZXJlZCB0byB0aGlzIGNvbXBvbmVudC4KKyAgICAgKiBEaXNhYmxlcyB0aGUgZXZlbnRzIHdpdGggdHlwZXMgc3BlY2lmaWVkIGJ5IHRoZSBzcGVjaWZpZWQgZXZlbnQgbWFzayBmcm9tCisgICAgICogYmVpbmcgZGVsaXZlcmVkIHRvIHRoaXMgY29tcG9uZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBldmVudHNUb0Rpc2FibGUgdGhlIGV2ZW50IG1hc2sgc3BlY2lmeWluZyB0aGUgZXZlbnQgdHlwZXMuIAorICAgICAqIEBwYXJhbSBldmVudHNUb0Rpc2FibGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBldmVudCBtYXNrIHNwZWNpZnlpbmcgdGhlIGV2ZW50IHR5cGVzLgogICAgICAqLwogICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGRpc2FibGVFdmVudHMobG9uZyBldmVudHNUb0Rpc2FibGUpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC01NDU5LDkgKzUwNDcsOSBAQAogICAgIC8qKgogICAgICAqIENoZWNrcyBpZiBpcyBtb3VzZSBldmVudCBlbmFibGVkLgogICAgICAqIAotICAgICAqIEBwYXJhbSBldmVudE1hc2sgdGhlIGV2ZW50IG1hc2sKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIG1vdXNlIGV2ZW50IGVuYWJsZWQKKyAgICAgKiBAcGFyYW0gZXZlbnRNYXNrCisgICAgICogICAgICAgICAgICB0aGUgZXZlbnQgbWFzay4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIG1vdXNlIGV2ZW50IGVuYWJsZWQuCiAgICAgICovCiAgICAgYm9vbGVhbiBpc01vdXNlRXZlbnRFbmFibGVkKGxvbmcgZXZlbnRNYXNrKSB7CiAgICAgICAgIHJldHVybiAoaXNFdmVudEVuYWJsZWQoZXZlbnRNYXNrKSB8fCAoZW5hYmxlZEFXVEV2ZW50cyAmIGV2ZW50TWFzaykgIT0gMCk7CkBAIC01NDcwLDE4ICs1MDU4LDE5IEBACiAgICAgLyoqCiAgICAgICogQ2hlY2tzIGlmIGlzIGV2ZW50IGVuYWJsZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGV2ZW50TWFzayB0aGUgZXZlbnQgbWFzawotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgaXMgZXZlbnQgZW5hYmxlZAorICAgICAqIEBwYXJhbSBldmVudE1hc2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBldmVudCBtYXNrLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgaXMgZXZlbnQgZW5hYmxlZC4KICAgICAgKi8KICAgICBib29sZWFuIGlzRXZlbnRFbmFibGVkKGxvbmcgZXZlbnRNYXNrKSB7CiAgICAgICAgIHJldHVybiAoKGVuYWJsZWRFdmVudHMgJiBldmVudE1hc2spICE9IDApOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgaW5wdXQgbWV0aG9kIHN1cHBvcnQgZm9yIHRoaXMgY29tcG9uZW50LiAKKyAgICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIGlucHV0IG1ldGhvZCBzdXBwb3J0IGZvciB0aGlzIGNvbXBvbmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZW5hYmxlIHRydWUgdG8gZW5hYmxlIGlucHV0IG1ldGhvZCBzdXBwb3J0LCBmYWxzZSB0byBkaXNhYmxlIGl0LiAKKyAgICAgKiBAcGFyYW0gZW5hYmxlCisgICAgICogICAgICAgICAgICB0cnVlIHRvIGVuYWJsZSBpbnB1dCBtZXRob2Qgc3VwcG9ydCwgZmFsc2UgdG8gZGlzYWJsZSBpdC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBlbmFibGVJbnB1dE1ldGhvZHMoYm9vbGVhbiBlbmFibGUpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC01NDk2LDExICs1MDg1LDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbiBhcnJheSBvZiBhbGwgY29tcG9uZW50J3MgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgZm9yIHRoaXMKLSAgICAgKiBjb21wb25lbnQuCisgICAgICogR2V0cyBhbiBhcnJheSBvZiBhbGwgY29tcG9uZW50J3MgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgZm9yIHRoaXMgY29tcG9uZW50LgogICAgICAqIAogICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgYWxsIGNvbXBvbmVudCdzIGxpc3RlbmVycyByZWdpc3RlcmVkIGZvciB0aGlzCi0gICAgICogY29tcG9uZW50LgorICAgICAqICAgICAgICAgY29tcG9uZW50LgogICAgICAqLwogICAgIHB1YmxpYyBDb21wb25lbnRMaXN0ZW5lcltdIGdldENvbXBvbmVudExpc3RlbmVycygpIHsKICAgICAgICAgcmV0dXJuIGNvbXBvbmVudExpc3RlbmVycy5nZXRVc2VyTGlzdGVuZXJzKG5ldyBDb21wb25lbnRMaXN0ZW5lclswXSk7CkBAIC01NTEwLDcgKzUwOTgsOCBAQAogICAgICAqIEFkZHMgdGhlIHNwZWNpZmllZCBjb21wb25lbnQgbGlzdGVuZXIgdG8gdGhlIENvbXBvbmVudCBmb3IgcmVjZWl2aW5nCiAgICAgICogY29tcG9uZW50J3MgZXZlbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGwgdGhlIENvbXBvbmVudExpc3RlbmVyLgorICAgICAqIEBwYXJhbSBsCisgICAgICogICAgICAgICAgICB0aGUgQ29tcG9uZW50TGlzdGVuZXIuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkQ29tcG9uZW50TGlzdGVuZXIoQ29tcG9uZW50TGlzdGVuZXIgbCkgewogICAgICAgICBjb21wb25lbnRMaXN0ZW5lcnMuYWRkVXNlckxpc3RlbmVyKGwpOwpAQCAtNTUxOSwxNyArNTEwOCwxOSBAQAogICAgIC8qKgogICAgICAqIFJlbW92ZXMgdGhlIGNvbXBvbmVudCBsaXN0ZW5lciByZWdpc3RlcmVkIGZvciB0aGlzIENvbXBvbmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbCB0aGUgQ29tcG9uZW50TGlzdGVuZXIuCisgICAgICogQHBhcmFtIGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBDb21wb25lbnRMaXN0ZW5lci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZW1vdmVDb21wb25lbnRMaXN0ZW5lcihDb21wb25lbnRMaXN0ZW5lciBsKSB7CiAgICAgICAgIGNvbXBvbmVudExpc3RlbmVycy5yZW1vdmVVc2VyTGlzdGVuZXIobCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIGEgY29tcG9uZW50IGV2ZW50IHRoYXQgaGFzIG9jY3VycmVkIG9uIHRoaXMgY29tcG9uZW50IAotICAgICAqIGJ5IGRpc3BhdGNoaW5nIHRoZW0gdG8gYW55IHJlZ2lzdGVyZWQgQ29tcG9uZW50TGlzdGVuZXIgb2JqZWN0cy4KKyAgICAgKiBQcm9jZXNzZXMgYSBjb21wb25lbnQgZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQgb24gdGhpcyBjb21wb25lbnQgYnkKKyAgICAgKiBkaXNwYXRjaGluZyB0aGVtIHRvIGFueSByZWdpc3RlcmVkIENvbXBvbmVudExpc3RlbmVyIG9iamVjdHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGUgdGhlIENvbXBvbmVudEV2ZW50LgorICAgICAqIEBwYXJhbSBlCisgICAgICogICAgICAgICAgICB0aGUgQ29tcG9uZW50RXZlbnQuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0NvbXBvbmVudEV2ZW50KENvbXBvbmVudEV2ZW50IGUpIHsKICAgICAgICAgcHJvY2Vzc0NvbXBvbmVudEV2ZW50SW1wbChlLCBjb21wb25lbnRMaXN0ZW5lcnMuZ2V0VXNlckxpc3RlbmVycygpKTsKQEAgLTU1MzgsOCArNTEyOSwxMCBAQAogICAgIC8qKgogICAgICAqIFByb2Nlc3MgY29tcG9uZW50IGV2ZW50IGltcGwuCiAgICAgICogCi0gICAgICogQHBhcmFtIGUgdGhlIGUKLSAgICAgKiBAcGFyYW0gYyB0aGUgYworICAgICAqIEBwYXJhbSBlCisgICAgICogICAgICAgICAgICB0aGUgZS4KKyAgICAgKiBAcGFyYW0gYworICAgICAqICAgICAgICAgICAgdGhlIGMuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDb21wb25lbnRFdmVudEltcGwoQ29tcG9uZW50RXZlbnQgZSwgQ29sbGVjdGlvbjxDb21wb25lbnRMaXN0ZW5lcj4gYykgewogICAgICAgICBmb3IgKENvbXBvbmVudExpc3RlbmVyIGxpc3RlbmVyIDogYykgewpAQCAtNTU3MCwxMCArNTE2MywxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFkZHMgdGhlIHNwZWNpZmllZCBmb2N1cyBsaXN0ZW5lciB0byB0aGUgQ29tcG9uZW50IGZvciByZWNlaXZpbmcKLSAgICAgKiBmb2N1cyBldmVudHMuCisgICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIGZvY3VzIGxpc3RlbmVyIHRvIHRoZSBDb21wb25lbnQgZm9yIHJlY2VpdmluZyBmb2N1cworICAgICAqIGV2ZW50cy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbCB0aGUgRm9jdXNMaXN0ZW5lci4KKyAgICAgKiBAcGFyYW0gbAorICAgICAqICAgICAgICAgICAgdGhlIEZvY3VzTGlzdGVuZXIuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkRm9jdXNMaXN0ZW5lcihGb2N1c0xpc3RlbmVyIGwpIHsKICAgICAgICAgZm9jdXNMaXN0ZW5lcnMuYWRkVXNlckxpc3RlbmVyKGwpOwpAQCAtNTU4Miw3ICs1MTc2LDggQEAKICAgICAvKioKICAgICAgKiBBZGRzIHRoZSBhd3QgZm9jdXMgbGlzdGVuZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGwgdGhlIGwKKyAgICAgKiBAcGFyYW0gbAorICAgICAqICAgICAgICAgICAgdGhlIGwuCiAgICAgICovCiAgICAgdm9pZCBhZGRBV1RGb2N1c0xpc3RlbmVyKEZvY3VzTGlzdGVuZXIgbCkgewogICAgICAgICBlbmFibGVBV1RFdmVudHMoQVdURXZlbnQuRk9DVVNfRVZFTlRfTUFTSyk7CkBAIC01NTkyLDE3ICs1MTg3LDE5IEBACiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyB0aGUgZm9jdXMgbGlzdGVuZXIgcmVnaXN0ZXJlZCBmb3IgdGhpcyBDb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGwgdGhlIEZvY3VzTGlzdGVuZXIuCisgICAgICogQHBhcmFtIGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBGb2N1c0xpc3RlbmVyLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlbW92ZUZvY3VzTGlzdGVuZXIoRm9jdXNMaXN0ZW5lciBsKSB7CiAgICAgICAgIGZvY3VzTGlzdGVuZXJzLnJlbW92ZVVzZXJMaXN0ZW5lcihsKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgYSBGb2N1c0V2ZW50IHRoYXQgaGFzIG9jY3VycmVkIG9uIHRoaXMgY29tcG9uZW50Ci0gICAgICogYnkgZGlzcGF0Y2hpbmcgaXQgdG8gdGhlIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotICAgICAqICAKLSAgICAgKiBAcGFyYW0gZSB0aGUgRm9jdXNFdmVudC4KKyAgICAgKiBQcm9jZXNzZXMgYSBGb2N1c0V2ZW50IHRoYXQgaGFzIG9jY3VycmVkIG9uIHRoaXMgY29tcG9uZW50IGJ5IGRpc3BhdGNoaW5nCisgICAgICogaXQgdG8gdGhlIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBlCisgICAgICogICAgICAgICAgICB0aGUgRm9jdXNFdmVudC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRm9jdXNFdmVudChGb2N1c0V2ZW50IGUpIHsKICAgICAgICAgcHJvY2Vzc0ZvY3VzRXZlbnRJbXBsKGUsIGZvY3VzTGlzdGVuZXJzLmdldFVzZXJMaXN0ZW5lcnMoKSk7CkBAIC01NjExLDggKzUyMDgsMTAgQEAKICAgICAvKioKICAgICAgKiBQcm9jZXNzIGZvY3VzIGV2ZW50IGltcGwuCiAgICAgICogCi0gICAgICogQHBhcmFtIGUgdGhlIGUKLSAgICAgKiBAcGFyYW0gYyB0aGUgYworICAgICAqIEBwYXJhbSBlCisgICAgICogICAgICAgICAgICB0aGUgZS4KKyAgICAgKiBAcGFyYW0gYworICAgICAqICAgICAgICAgICAgdGhlIGMuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NGb2N1c0V2ZW50SW1wbChGb2N1c0V2ZW50IGUsIENvbGxlY3Rpb248Rm9jdXNMaXN0ZW5lcj4gYykgewogICAgICAgICBmb3IgKEZvY3VzTGlzdGVuZXIgbGlzdGVuZXIgOiBjKSB7CkBAIC01NjI4LDExICs1MjI3LDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIGFycmF5IG9mIHJlZ2lzdGVyZWQgSGllcmFyY2h5TGlzdGVuZXJzIGZvcgotICAgICAqIHRoaXMgQ29tcG9uZW50LgorICAgICAqIEdldHMgYW4gYXJyYXkgb2YgcmVnaXN0ZXJlZCBIaWVyYXJjaHlMaXN0ZW5lcnMgZm9yIHRoaXMgQ29tcG9uZW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgcmVnaXN0ZXJlZCBIaWVyYXJjaHlMaXN0ZW5lcnMgZm9yCi0gICAgICogdGhpcyBDb21wb25lbnQuCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiByZWdpc3RlcmVkIEhpZXJhcmNoeUxpc3RlbmVycyBmb3IgdGhpcyBDb21wb25lbnQuCiAgICAgICovCiAgICAgcHVibGljIEhpZXJhcmNoeUxpc3RlbmVyW10gZ2V0SGllcmFyY2h5TGlzdGVuZXJzKCkgewogICAgICAgICByZXR1cm4gaGllcmFyY2h5TGlzdGVuZXJzLmdldFVzZXJMaXN0ZW5lcnMobmV3IEhpZXJhcmNoeUxpc3RlbmVyWzBdKTsKQEAgLTU2NDEsNyArNTIzOCw4IEBACiAgICAgLyoqCiAgICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIGhpZXJhcmNoeSBsaXN0ZW5lci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbCB0aGUgSGllcmFyY2h5TGlzdGVuZXIuCisgICAgICogQHBhcmFtIGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBIaWVyYXJjaHlMaXN0ZW5lci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRIaWVyYXJjaHlMaXN0ZW5lcihIaWVyYXJjaHlMaXN0ZW5lciBsKSB7CiAgICAgICAgIGhpZXJhcmNoeUxpc3RlbmVycy5hZGRVc2VyTGlzdGVuZXIobCk7CkBAIC01NjUwLDE3ICs1MjQ4LDE5IEBACiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyB0aGUgaGllcmFyY2h5IGxpc3RlbmVyIHJlZ2lzdGVyZWQgZm9yIHRoaXMgY29tcG9uZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBsIHRoZSBIaWVyYXJjaHlMaXN0ZW5lci4KKyAgICAgKiBAcGFyYW0gbAorICAgICAqICAgICAgICAgICAgdGhlIEhpZXJhcmNoeUxpc3RlbmVyLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlbW92ZUhpZXJhcmNoeUxpc3RlbmVyKEhpZXJhcmNoeUxpc3RlbmVyIGwpIHsKICAgICAgICAgaGllcmFyY2h5TGlzdGVuZXJzLnJlbW92ZVVzZXJMaXN0ZW5lcihsKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgYSBoaWVyYXJjaHkgZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQgb24gdGhpcyBjb21wb25lbnQKLSAgICAgKiBieSBkaXNwYXRjaGluZyBpdCB0byB0aGUgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuIAorICAgICAqIFByb2Nlc3NlcyBhIGhpZXJhcmNoeSBldmVudCB0aGF0IGhhcyBvY2N1cnJlZCBvbiB0aGlzIGNvbXBvbmVudCBieQorICAgICAqIGRpc3BhdGNoaW5nIGl0IHRvIHRoZSByZWdpc3RlcmVkIGxpc3RlbmVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZSB0aGUgSGllcmFyY2h5RXZlbnQuCisgICAgICogQHBhcmFtIGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBIaWVyYXJjaHlFdmVudC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSGllcmFyY2h5RXZlbnQoSGllcmFyY2h5RXZlbnQgZSkgewogICAgICAgICBmb3IgKEhpZXJhcmNoeUxpc3RlbmVyIGxpc3RlbmVyIDogaGllcmFyY2h5TGlzdGVuZXJzLmdldFVzZXJMaXN0ZW5lcnMoKSkgewpAQCAtNTY3Myw4ICs1MjczLDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIGFycmF5IG9mIEhpZXJhcmNoeUJvdW5kc0xpc3RlbmVyIG9iamVjdHMgcmVnaXN0ZXJlZAotICAgICAqIHRvIHRoaXMgQ29tcG9uZW50LgorICAgICAqIEdldHMgYW4gYXJyYXkgb2YgSGllcmFyY2h5Qm91bmRzTGlzdGVuZXIgb2JqZWN0cyByZWdpc3RlcmVkIHRvIHRoaXMKKyAgICAgKiBDb21wb25lbnQuCiAgICAgICogCiAgICAgICogQHJldHVybiBhbiBhcnJheSBvZiBIaWVyYXJjaHlCb3VuZHNMaXN0ZW5lciBvYmplY3RzLgogICAgICAqLwpAQCAtNTY4NSw3ICs1Mjg1LDggQEAKICAgICAvKioKICAgICAgKiBBZGRzIHRoZSBzcGVjaWZpZWQgaGllcmFyY2h5IGJvdW5kcyBsaXN0ZW5lci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbCB0aGUgSGllcmFyY2h5Qm91bmRzTGlzdGVuZXIuCisgICAgICogQHBhcmFtIGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBIaWVyYXJjaHlCb3VuZHNMaXN0ZW5lci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRIaWVyYXJjaHlCb3VuZHNMaXN0ZW5lcihIaWVyYXJjaHlCb3VuZHNMaXN0ZW5lciBsKSB7CiAgICAgICAgIGhpZXJhcmNoeUJvdW5kc0xpc3RlbmVycy5hZGRVc2VyTGlzdGVuZXIobCk7CkBAIC01Njk0LDE3ICs1Mjk1LDE5IEBACiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyB0aGUgaGllcmFyY2h5IGJvdW5kcyBsaXN0ZW5lciByZWdpc3RlcmVkIGZvciB0aGlzIENvbXBvbmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbCB0aGUgSGllcmFyY2h5Qm91bmRzTGlzdGVuZXIuCisgICAgICogQHBhcmFtIGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBIaWVyYXJjaHlCb3VuZHNMaXN0ZW5lci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZW1vdmVIaWVyYXJjaHlCb3VuZHNMaXN0ZW5lcihIaWVyYXJjaHlCb3VuZHNMaXN0ZW5lciBsKSB7CiAgICAgICAgIGhpZXJhcmNoeUJvdW5kc0xpc3RlbmVycy5yZW1vdmVVc2VyTGlzdGVuZXIobCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIGEgaGllcmFyY2h5IGJvdW5kcyBldmVudCB0aGF0IGhhcyBvY2N1cnJlZCBvbiB0aGlzIGNvbXBvbmVudAotICAgICAqIGJ5IGRpc3BhdGNoaW5nIGl0IHRvIHRoZSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLSAgICAgKiAgCi0gICAgICogQHBhcmFtIGUgdGhlIEhpZXJhcmNoeUJvdW5kc0V2ZW50LgorICAgICAqIFByb2Nlc3NlcyBhIGhpZXJhcmNoeSBib3VuZHMgZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQgb24gdGhpcyBjb21wb25lbnQgYnkKKyAgICAgKiBkaXNwYXRjaGluZyBpdCB0byB0aGUgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCisgICAgICogCisgICAgICogQHBhcmFtIGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBIaWVyYXJjaHlCb3VuZHNFdmVudC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSGllcmFyY2h5Qm91bmRzRXZlbnQoSGllcmFyY2h5RXZlbnQgZSkgewogICAgICAgICBmb3IgKEhpZXJhcmNoeUJvdW5kc0xpc3RlbmVyIGxpc3RlbmVyIDogaGllcmFyY2h5Qm91bmRzTGlzdGVuZXJzLmdldFVzZXJMaXN0ZW5lcnMoKSkgewpAQCAtNTczMSw3ICs1MzM0LDggQEAKICAgICAvKioKICAgICAgKiBBZGRzIHRoZSBzcGVjaWZpZWQga2V5IGxpc3RlbmVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBsIHRoZSBLZXlMaXN0ZW5lci4KKyAgICAgKiBAcGFyYW0gbAorICAgICAqICAgICAgICAgICAgdGhlIEtleUxpc3RlbmVyLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZEtleUxpc3RlbmVyKEtleUxpc3RlbmVyIGwpIHsKICAgICAgICAga2V5TGlzdGVuZXJzLmFkZFVzZXJMaXN0ZW5lcihsKTsKQEAgLTU3NDAsNyArNTM0NCw4IEBACiAgICAgLyoqCiAgICAgICogQWRkcyB0aGUgYXd0IGtleSBsaXN0ZW5lci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbCB0aGUgbAorICAgICAqIEBwYXJhbSBsCisgICAgICogICAgICAgICAgICB0aGUgbC4KICAgICAgKi8KICAgICB2b2lkIGFkZEFXVEtleUxpc3RlbmVyKEtleUxpc3RlbmVyIGwpIHsKICAgICAgICAgZW5hYmxlQVdURXZlbnRzKEFXVEV2ZW50LktFWV9FVkVOVF9NQVNLKTsKQEAgLTU3NTAsMTcgKzUzNTUsMTkgQEAKICAgICAvKioKICAgICAgKiBSZW1vdmVzIHRoZSBrZXkgbGlzdGVuZXIgcmVnaXN0ZXJlZCBmb3IgdGhpcyBDb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGwgdGhlIEtleUxpc3RlbmVyLgorICAgICAqIEBwYXJhbSBsCisgICAgICogICAgICAgICAgICB0aGUgS2V5TGlzdGVuZXIuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVtb3ZlS2V5TGlzdGVuZXIoS2V5TGlzdGVuZXIgbCkgewogICAgICAgICBrZXlMaXN0ZW5lcnMucmVtb3ZlVXNlckxpc3RlbmVyKGwpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyBhIGtleSBldmVudCB0aGF0IGhhcyBvY2N1cnJlZCBvbiB0aGlzIGNvbXBvbmVudAotICAgICAqIGJ5IGRpc3BhdGNoaW5nIGl0IHRvIHRoZSByZWdpc3RlcmVkIGxpc3RlbmVycy4KKyAgICAgKiBQcm9jZXNzZXMgYSBrZXkgZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQgb24gdGhpcyBjb21wb25lbnQgYnkgZGlzcGF0Y2hpbmcKKyAgICAgKiBpdCB0byB0aGUgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGUgdGhlIEtleUV2ZW50LgorICAgICAqIEBwYXJhbSBlCisgICAgICogICAgICAgICAgICB0aGUgS2V5RXZlbnQuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0tleUV2ZW50KEtleUV2ZW50IGUpIHsKICAgICAgICAgcHJvY2Vzc0tleUV2ZW50SW1wbChlLCBrZXlMaXN0ZW5lcnMuZ2V0VXNlckxpc3RlbmVycygpKTsKQEAgLTU3NjksOCArNTM3NiwxMCBAQAogICAgIC8qKgogICAgICAqIFByb2Nlc3Mga2V5IGV2ZW50IGltcGwuCiAgICAgICogCi0gICAgICogQHBhcmFtIGUgdGhlIGUKLSAgICAgKiBAcGFyYW0gYyB0aGUgYworICAgICAqIEBwYXJhbSBlCisgICAgICogICAgICAgICAgICB0aGUgZS4KKyAgICAgKiBAcGFyYW0gYworICAgICAqICAgICAgICAgICAgdGhlIGMuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NLZXlFdmVudEltcGwoS2V5RXZlbnQgZSwgQ29sbGVjdGlvbjxLZXlMaXN0ZW5lcj4gYykgewogICAgICAgICBmb3IgKEtleUxpc3RlbmVyIGxpc3RlbmVyIDogYykgewpAQCAtNTgwMCw3ICs1NDA5LDggQEAKICAgICAvKioKICAgICAgKiBBZGRzIHRoZSBzcGVjaWZpZWQgbW91c2UgbGlzdGVuZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGwgdGhlIE1vdXNlTGlzdGVuZXIuCisgICAgICogQHBhcmFtIGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBNb3VzZUxpc3RlbmVyLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZE1vdXNlTGlzdGVuZXIoTW91c2VMaXN0ZW5lciBsKSB7CiAgICAgICAgIG1vdXNlTGlzdGVuZXJzLmFkZFVzZXJMaXN0ZW5lcihsKTsKQEAgLTU4MDksNyArNTQxOSw4IEBACiAgICAgLyoqCiAgICAgICogQWRkcyB0aGUgYXd0IG1vdXNlIGxpc3RlbmVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBsIHRoZSBsCisgICAgICogQHBhcmFtIGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBsLgogICAgICAqLwogICAgIHZvaWQgYWRkQVdUTW91c2VMaXN0ZW5lcihNb3VzZUxpc3RlbmVyIGwpIHsKICAgICAgICAgZW5hYmxlQVdURXZlbnRzKEFXVEV2ZW50Lk1PVVNFX0VWRU5UX01BU0spOwpAQCAtNTgxOSw3ICs1NDMwLDggQEAKICAgICAvKioKICAgICAgKiBBZGRzIHRoZSBhd3QgbW91c2UgbW90aW9uIGxpc3RlbmVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBsIHRoZSBsCisgICAgICogQHBhcmFtIGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBsLgogICAgICAqLwogICAgIHZvaWQgYWRkQVdUTW91c2VNb3Rpb25MaXN0ZW5lcihNb3VzZU1vdGlvbkxpc3RlbmVyIGwpIHsKICAgICAgICAgZW5hYmxlQVdURXZlbnRzKEFXVEV2ZW50Lk1PVVNFX01PVElPTl9FVkVOVF9NQVNLKTsKQEAgLTU4MjksNyArNTQ0MSw4IEBACiAgICAgLyoqCiAgICAgICogQWRkcyB0aGUgYXd0IGNvbXBvbmVudCBsaXN0ZW5lci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbCB0aGUgbAorICAgICAqIEBwYXJhbSBsCisgICAgICogICAgICAgICAgICB0aGUgbC4KICAgICAgKi8KICAgICB2b2lkIGFkZEFXVENvbXBvbmVudExpc3RlbmVyKENvbXBvbmVudExpc3RlbmVyIGwpIHsKICAgICAgICAgZW5hYmxlQVdURXZlbnRzKEFXVEV2ZW50LkNPTVBPTkVOVF9FVkVOVF9NQVNLKTsKQEAgLTU4MzksNyArNTQ1Miw4IEBACiAgICAgLyoqCiAgICAgICogQWRkcyB0aGUgYXd0IGlucHV0IG1ldGhvZCBsaXN0ZW5lci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbCB0aGUgbAorICAgICAqIEBwYXJhbSBsCisgICAgICogICAgICAgICAgICB0aGUgbC4KICAgICAgKi8KICAgICB2b2lkIGFkZEFXVElucHV0TWV0aG9kTGlzdGVuZXIoSW5wdXRNZXRob2RMaXN0ZW5lciBsKSB7CiAgICAgICAgIGVuYWJsZUFXVEV2ZW50cyhBV1RFdmVudC5JTlBVVF9NRVRIT0RfRVZFTlRfTUFTSyk7CkBAIC01ODQ5LDcgKzU0NjMsOCBAQAogICAgIC8qKgogICAgICAqIEFkZHMgdGhlIGF3dCBtb3VzZSB3aGVlbCBsaXN0ZW5lci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbCB0aGUgbAorICAgICAqIEBwYXJhbSBsCisgICAgICogICAgICAgICAgICB0aGUgbC4KICAgICAgKi8KICAgICB2b2lkIGFkZEFXVE1vdXNlV2hlZWxMaXN0ZW5lcihNb3VzZVdoZWVsTGlzdGVuZXIgbCkgewogICAgICAgICBlbmFibGVBV1RFdmVudHMoQVdURXZlbnQuTU9VU0VfV0hFRUxfRVZFTlRfTUFTSyk7CkBAIC01ODU5LDE3ICs1NDc0LDE5IEBACiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyB0aGUgbW91c2UgbGlzdGVuZXIgcmVnaXN0ZXJlZCBmb3IgdGhpcyBDb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGwgdGhlIE1vdXNlTGlzdGVuZXIuCisgICAgICogQHBhcmFtIGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBNb3VzZUxpc3RlbmVyLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlbW92ZU1vdXNlTGlzdGVuZXIoTW91c2VMaXN0ZW5lciBsKSB7CiAgICAgICAgIG1vdXNlTGlzdGVuZXJzLnJlbW92ZVVzZXJMaXN0ZW5lcihsKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgYSBtb3VzZSBldmVudCB0aGF0IGhhcyBvY2N1cnJlZCBvbiB0aGlzIGNvbXBvbmVudAotICAgICAqIGJ5IGRpc3BhdGNoaW5nIGl0IHRvIHRoZSByZWdpc3RlcmVkIGxpc3RlbmVycy4KKyAgICAgKiBQcm9jZXNzZXMgYSBtb3VzZSBldmVudCB0aGF0IGhhcyBvY2N1cnJlZCBvbiB0aGlzIGNvbXBvbmVudCBieQorICAgICAqIGRpc3BhdGNoaW5nIGl0IHRvIHRoZSByZWdpc3RlcmVkIGxpc3RlbmVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZSB0aGUgTW91c2VFdmVudC4KKyAgICAgKiBAcGFyYW0gZQorICAgICAqICAgICAgICAgICAgdGhlIE1vdXNlRXZlbnQuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc01vdXNlRXZlbnQoTW91c2VFdmVudCBlKSB7CiAgICAgICAgIHByb2Nlc3NNb3VzZUV2ZW50SW1wbChlLCBtb3VzZUxpc3RlbmVycy5nZXRVc2VyTGlzdGVuZXJzKCkpOwpAQCAtNTg3OCw4ICs1NDk1LDEwIEBACiAgICAgLyoqCiAgICAgICogUHJvY2VzcyBtb3VzZSBldmVudCBpbXBsLgogICAgICAqIAotICAgICAqIEBwYXJhbSBlIHRoZSBlCi0gICAgICogQHBhcmFtIGMgdGhlIGMKKyAgICAgKiBAcGFyYW0gZQorICAgICAqICAgICAgICAgICAgdGhlIGUuCisgICAgICogQHBhcmFtIGMKKyAgICAgKiAgICAgICAgICAgIHRoZSBjLgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTW91c2VFdmVudEltcGwoTW91c2VFdmVudCBlLCBDb2xsZWN0aW9uPE1vdXNlTGlzdGVuZXI+IGMpIHsKICAgICAgICAgZm9yIChNb3VzZUxpc3RlbmVyIGxpc3RlbmVyIDogYykgewpAQCAtNTkwNiw4ICs1NTI1LDEwIEBACiAgICAgLyoqCiAgICAgICogUHJvY2VzcyBtb3VzZSBtb3Rpb24gZXZlbnQgaW1wbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZSB0aGUgZQotICAgICAqIEBwYXJhbSBjIHRoZSBjCisgICAgICogQHBhcmFtIGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlLgorICAgICAqIEBwYXJhbSBjCisgICAgICogICAgICAgICAgICB0aGUgYy4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc01vdXNlTW90aW9uRXZlbnRJbXBsKE1vdXNlRXZlbnQgZSwgQ29sbGVjdGlvbjxNb3VzZU1vdGlvbkxpc3RlbmVyPiBjKSB7CiAgICAgICAgIGZvciAoTW91c2VNb3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA6IGMpIHsKQEAgLTU5MjMsMTEgKzU1NDQsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYW4gYXJyYXkgb2YgdGhlIG1vdXNlIG1vdGlvbiBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCB0bwotICAgICAqIHRoZSBDb21wb25lbnQuCisgICAgICogR2V0cyBhbiBhcnJheSBvZiB0aGUgbW91c2UgbW90aW9uIGxpc3RlbmVycyByZWdpc3RlcmVkIHRvIHRoZSBDb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUgTW91c2VNb3Rpb25MaXN0ZW5lcnMgcmVnaXN0ZXJlZCB0bwotICAgICAqIHRoZSBDb21wb25lbnQuCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUgTW91c2VNb3Rpb25MaXN0ZW5lcnMgcmVnaXN0ZXJlZCB0byB0aGUgQ29tcG9uZW50LgogICAgICAqLwogICAgIHB1YmxpYyBNb3VzZU1vdGlvbkxpc3RlbmVyW10gZ2V0TW91c2VNb3Rpb25MaXN0ZW5lcnMoKSB7CiAgICAgICAgIHJldHVybiBtb3VzZU1vdGlvbkxpc3RlbmVycy5nZXRVc2VyTGlzdGVuZXJzKG5ldyBNb3VzZU1vdGlvbkxpc3RlbmVyWzBdKTsKQEAgLTU5MzYsNyArNTU1NSw4IEBACiAgICAgLyoqCiAgICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIG1vdXNlIG1vdGlvbiBsaXN0ZW5lci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbCB0aGUgTW91c2VNb3Rpb25MaXN0ZW5lci4KKyAgICAgKiBAcGFyYW0gbAorICAgICAqICAgICAgICAgICAgdGhlIE1vdXNlTW90aW9uTGlzdGVuZXIuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkTW91c2VNb3Rpb25MaXN0ZW5lcihNb3VzZU1vdGlvbkxpc3RlbmVyIGwpIHsKICAgICAgICAgbW91c2VNb3Rpb25MaXN0ZW5lcnMuYWRkVXNlckxpc3RlbmVyKGwpOwpAQCAtNTk0NSwyOCArNTU2NSwyOCBAQAogICAgIC8qKgogICAgICAqIFJlbW92ZXMgdGhlIG1vdXNlIG1vdGlvbiBsaXN0ZW5lciByZWdpc3RlcmVkIGZvciB0aGlzIGNvbXBvbmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbCB0aGUgTW91c2VNb3Rpb25MaXN0ZW5lci4KKyAgICAgKiBAcGFyYW0gbAorICAgICAqICAgICAgICAgICAgdGhlIE1vdXNlTW90aW9uTGlzdGVuZXIuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVtb3ZlTW91c2VNb3Rpb25MaXN0ZW5lcihNb3VzZU1vdGlvbkxpc3RlbmVyIGwpIHsKICAgICAgICAgbW91c2VNb3Rpb25MaXN0ZW5lcnMucmVtb3ZlVXNlckxpc3RlbmVyKGwpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyBhIG1vdXNlIG1vdGlvbiBldmVudCB0aGF0IGhhcyBvY2N1cnJlZCBvbiB0aGlzIGNvbXBvbmVudAotICAgICAqIGJ5IGRpc3BhdGNoaW5nIGl0IHRvIHRoZSByZWdpc3RlcmVkIGxpc3RlbmVycy4KKyAgICAgKiBQcm9jZXNzZXMgYSBtb3VzZSBtb3Rpb24gZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQgb24gdGhpcyBjb21wb25lbnQgYnkKKyAgICAgKiBkaXNwYXRjaGluZyBpdCB0byB0aGUgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGUgdGhlIE1vdXNlRXZlbnQuCisgICAgICogQHBhcmFtIGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBNb3VzZUV2ZW50LgogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NNb3VzZU1vdGlvbkV2ZW50KE1vdXNlRXZlbnQgZSkgewogICAgICAgICBwcm9jZXNzTW91c2VNb3Rpb25FdmVudEltcGwoZSwgbW91c2VNb3Rpb25MaXN0ZW5lcnMuZ2V0VXNlckxpc3RlbmVycygpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIGFycmF5IG9mIHRoZSBtb3VzZSB3aGVlbCBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCB0bwotICAgICAqIHRoZSBDb21wb25lbnQuCisgICAgICogR2V0cyBhbiBhcnJheSBvZiB0aGUgbW91c2Ugd2hlZWwgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgdG8gdGhlIENvbXBvbmVudC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBNb3VzZVdoZWVsTGlzdGVuZXJzIHJlZ2lzdGVyZWQgdG8KLSAgICAgKiB0aGUgQ29tcG9uZW50LgorICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIE1vdXNlV2hlZWxMaXN0ZW5lcnMgcmVnaXN0ZXJlZCB0byB0aGUgQ29tcG9uZW50LgogICAgICAqLwogICAgIHB1YmxpYyBNb3VzZVdoZWVsTGlzdGVuZXJbXSBnZXRNb3VzZVdoZWVsTGlzdGVuZXJzKCkgewogICAgICAgICByZXR1cm4gbW91c2VXaGVlbExpc3RlbmVycy5nZXRVc2VyTGlzdGVuZXJzKG5ldyBNb3VzZVdoZWVsTGlzdGVuZXJbMF0pOwpAQCAtNTk3NSw3ICs1NTk1LDggQEAKICAgICAvKioKICAgICAgKiBBZGRzIHRoZSBzcGVjaWZpZWQgbW91c2Ugd2hlZWwgbGlzdGVuZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGwgdGhlIE1vdXNlV2hlZWxMaXN0ZW5lci4KKyAgICAgKiBAcGFyYW0gbAorICAgICAqICAgICAgICAgICAgdGhlIE1vdXNlV2hlZWxMaXN0ZW5lci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRNb3VzZVdoZWVsTGlzdGVuZXIoTW91c2VXaGVlbExpc3RlbmVyIGwpIHsKICAgICAgICAgbW91c2VXaGVlbExpc3RlbmVycy5hZGRVc2VyTGlzdGVuZXIobCk7CkBAIC01OTg0LDI4ICs1NjA1LDMwIEBACiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyB0aGUgbW91c2Ugd2hlZWwgbGlzdGVuZXIgcmVnaXN0ZXJlZCBmb3IgdGhpcyBjb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGwgdGhlIE1vdXNlV2hlZWxMaXN0ZW5lci4KKyAgICAgKiBAcGFyYW0gbAorICAgICAqICAgICAgICAgICAgdGhlIE1vdXNlV2hlZWxMaXN0ZW5lci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZW1vdmVNb3VzZVdoZWVsTGlzdGVuZXIoTW91c2VXaGVlbExpc3RlbmVyIGwpIHsKICAgICAgICAgbW91c2VXaGVlbExpc3RlbmVycy5yZW1vdmVVc2VyTGlzdGVuZXIobCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIGEgbW91c2Ugd2hlZWwgZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQgb24gdGhpcyBjb21wb25lbnQKLSAgICAgKiBieSBkaXNwYXRjaGluZyBpdCB0byB0aGUgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCisgICAgICogUHJvY2Vzc2VzIGEgbW91c2Ugd2hlZWwgZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQgb24gdGhpcyBjb21wb25lbnQgYnkKKyAgICAgKiBkaXNwYXRjaGluZyBpdCB0byB0aGUgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGUgdGhlIE1vdXNlV2hlZWxFdmVudC4KKyAgICAgKiBAcGFyYW0gZQorICAgICAqICAgICAgICAgICAgdGhlIE1vdXNlV2hlZWxFdmVudC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzTW91c2VXaGVlbEV2ZW50KE1vdXNlV2hlZWxFdmVudCBlKSB7CiAgICAgICAgIHByb2Nlc3NNb3VzZVdoZWVsRXZlbnRJbXBsKGUsIG1vdXNlV2hlZWxMaXN0ZW5lcnMuZ2V0VXNlckxpc3RlbmVycygpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIGFycmF5IG9mIHRoZSBJbnB1dE1ldGhvZExpc3RlbmVyIGxpc3RlbmVycyAKLSAgICAgKiByZWdpc3RlcmVkIHRvIHRoZSBDb21wb25lbnQuCisgICAgICogR2V0cyBhbiBhcnJheSBvZiB0aGUgSW5wdXRNZXRob2RMaXN0ZW5lciBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCB0byB0aGUKKyAgICAgKiBDb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUgSW5wdXRNZXRob2RMaXN0ZW5lciBsaXN0ZW5lcnMgCi0gICAgICogcmVnaXN0ZXJlZCB0byB0aGUgQ29tcG9uZW50LgorICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIElucHV0TWV0aG9kTGlzdGVuZXIgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgdG8gdGhlCisgICAgICogICAgICAgICBDb21wb25lbnQuCiAgICAgICovCiAgICAgcHVibGljIElucHV0TWV0aG9kTGlzdGVuZXJbXSBnZXRJbnB1dE1ldGhvZExpc3RlbmVycygpIHsKICAgICAgICAgcmV0dXJuIGlucHV0TWV0aG9kTGlzdGVuZXJzLmdldFVzZXJMaXN0ZW5lcnMobmV3IElucHV0TWV0aG9kTGlzdGVuZXJbMF0pOwpAQCAtNjAxNCw3ICs1NjM3LDggQEAKICAgICAvKioKICAgICAgKiBBZGRzIHRoZSBzcGVjaWZpZWQgaW5wdXQgbWV0aG9kIGxpc3RlbmVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBsIHRoZSBJbnB1dE1ldGhvZExpc3RlbmVyLgorICAgICAqIEBwYXJhbSBsCisgICAgICogICAgICAgICAgICB0aGUgSW5wdXRNZXRob2RMaXN0ZW5lci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRJbnB1dE1ldGhvZExpc3RlbmVyKElucHV0TWV0aG9kTGlzdGVuZXIgbCkgewogICAgICAgICBpbnB1dE1ldGhvZExpc3RlbmVycy5hZGRVc2VyTGlzdGVuZXIobCk7CkBAIC02MDIzLDE3ICs1NjQ3LDE5IEBACiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyB0aGUgaW5wdXQgbWV0aG9kIGxpc3RlbmVyIHJlZ2lzdGVyZWQgZm9yIHRoaXMgY29tcG9uZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBsIHRoZSBJbnB1dE1ldGhvZExpc3RlbmVyLgorICAgICAqIEBwYXJhbSBsCisgICAgICogICAgICAgICAgICB0aGUgSW5wdXRNZXRob2RMaXN0ZW5lci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZW1vdmVJbnB1dE1ldGhvZExpc3RlbmVyKElucHV0TWV0aG9kTGlzdGVuZXIgbCkgewogICAgICAgICBpbnB1dE1ldGhvZExpc3RlbmVycy5yZW1vdmVVc2VyTGlzdGVuZXIobCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIGFuIGlucHV0IG1ldGhvZCBldmVudCB0aGF0IGhhcyBvY2N1cnJlZCBvbiB0aGlzIGNvbXBvbmVudAotICAgICAqIGJ5IGRpc3BhdGNoaW5nIGl0IHRvIHRoZSByZWdpc3RlcmVkIGxpc3RlbmVycy4KKyAgICAgKiBQcm9jZXNzZXMgYW4gaW5wdXQgbWV0aG9kIGV2ZW50IHRoYXQgaGFzIG9jY3VycmVkIG9uIHRoaXMgY29tcG9uZW50IGJ5CisgICAgICogZGlzcGF0Y2hpbmcgaXQgdG8gdGhlIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBlIHRoZSBJbnB1dE1ldGhvZEV2ZW50LgorICAgICAqIEBwYXJhbSBlCisgICAgICogICAgICAgICAgICB0aGUgSW5wdXRNZXRob2RFdmVudC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSW5wdXRNZXRob2RFdmVudChJbnB1dE1ldGhvZEV2ZW50IGUpIHsKICAgICAgICAgcHJvY2Vzc0lucHV0TWV0aG9kRXZlbnRJbXBsKGUsIGlucHV0TWV0aG9kTGlzdGVuZXJzLmdldFVzZXJMaXN0ZW5lcnMoKSk7CkBAIC02MDQyLDExICs1NjY4LDEyIEBACiAgICAgLyoqCiAgICAgICogUHJvY2VzcyBpbnB1dCBtZXRob2QgZXZlbnQgaW1wbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZSB0aGUgZQotICAgICAqIEBwYXJhbSBjIHRoZSBjCisgICAgICogQHBhcmFtIGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlLgorICAgICAqIEBwYXJhbSBjCisgICAgICogICAgICAgICAgICB0aGUgYy4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0lucHV0TWV0aG9kRXZlbnRJbXBsKElucHV0TWV0aG9kRXZlbnQgZSwKLSAgICAgICAgICAgIENvbGxlY3Rpb248SW5wdXRNZXRob2RMaXN0ZW5lcj4gYykgeworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzSW5wdXRNZXRob2RFdmVudEltcGwoSW5wdXRNZXRob2RFdmVudCBlLCBDb2xsZWN0aW9uPElucHV0TWV0aG9kTGlzdGVuZXI+IGMpIHsKICAgICAgICAgZm9yIChJbnB1dE1ldGhvZExpc3RlbmVyIGxpc3RlbmVyIDogYykgewogICAgICAgICAgICAgc3dpdGNoIChlLmdldElEKCkpIHsKICAgICAgICAgICAgICAgICBjYXNlIElucHV0TWV0aG9kRXZlbnQuQ0FSRVRfUE9TSVRJT05fQ0hBTkdFRDoKQEAgLTYwNTksMzEgKzU2ODYsMjggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vPz8/QVdUCisgICAgLy8gPz8/QVdUCiAgICAgLyoKLSAgICBwdWJsaWMgUG9pbnQgZ2V0TW91c2VQb3NpdGlvbigpIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiB7Ci0gICAgICAgIFBvaW50IGFic1BvaW50ZXJQb3MgPSBNb3VzZUluZm8uZ2V0UG9pbnRlckluZm8oKS5nZXRMb2NhdGlvbigpOwotICAgICAgICBXaW5kb3cgd2luVW5kZXJQdHIgPSB0b29sa2l0LmRpc3BhdGNoZXIubW91c2VEaXNwYXRjaGVyLmZpbmRXaW5kb3dBdChhYnNQb2ludGVyUG9zKTsKLSAgICAgICAgUG9pbnQgcG9pbnRlclBvcyA9IE1vdXNlRGlzcGF0Y2hlci5jb252ZXJ0UG9pbnQobnVsbCwgYWJzUG9pbnRlclBvcywgd2luVW5kZXJQdHIpOwotICAgICAgICBib29sZWFuIGlzVW5kZXJQb2ludGVyID0gZmFsc2U7Ci0gICAgICAgIGlmICh3aW5VbmRlclB0ciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpc1VuZGVyUG9pbnRlciA9IHdpblVuZGVyUHRyLmlzQ29tcG9uZW50QXQodGhpcywgcG9pbnRlclBvcyk7Ci0gICAgICAgIGlmIChpc1VuZGVyUG9pbnRlcikgewotICAgICAgICAgICAgcmV0dXJuIE1vdXNlRGlzcGF0Y2hlci5jb252ZXJ0UG9pbnQobnVsbCwgYWJzUG9pbnRlclBvcywgdGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgICovCisgICAgICogcHVibGljIFBvaW50IGdldE1vdXNlUG9zaXRpb24oKSB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24geyBQb2ludAorICAgICAqIGFic1BvaW50ZXJQb3MgPSBNb3VzZUluZm8uZ2V0UG9pbnRlckluZm8oKS5nZXRMb2NhdGlvbigpOyBXaW5kb3cKKyAgICAgKiB3aW5VbmRlclB0ciA9CisgICAgICogdG9vbGtpdC5kaXNwYXRjaGVyLm1vdXNlRGlzcGF0Y2hlci5maW5kV2luZG93QXQoYWJzUG9pbnRlclBvcyk7IFBvaW50CisgICAgICogcG9pbnRlclBvcyA9IE1vdXNlRGlzcGF0Y2hlci5jb252ZXJ0UG9pbnQobnVsbCwgYWJzUG9pbnRlclBvcywKKyAgICAgKiB3aW5VbmRlclB0cik7IGJvb2xlYW4gaXNVbmRlclBvaW50ZXIgPSBmYWxzZTsgaWYgKHdpblVuZGVyUHRyID09IG51bGwpIHsKKyAgICAgKiByZXR1cm4gbnVsbDsgfSBpc1VuZGVyUG9pbnRlciA9IHdpblVuZGVyUHRyLmlzQ29tcG9uZW50QXQodGhpcywKKyAgICAgKiBwb2ludGVyUG9zKTsgaWYgKGlzVW5kZXJQb2ludGVyKSB7IHJldHVybgorICAgICAqIE1vdXNlRGlzcGF0Y2hlci5jb252ZXJ0UG9pbnQobnVsbCwgYWJzUG9pbnRlclBvcywgdGhpcyk7IH0gcmV0dXJuIG51bGw7IH0KKyAgICAgKi8KIAogICAgIC8qKgogICAgICAqIFNldCBuYXRpdmUgY2FyZXQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uIDxicj4KICAgICAgKiBOb3RlOiB0aGlzIG1ldGhvZCB0YWtlcyBBV1QgbG9jayBpbnNpZGUgYmVjYXVzZSBpdCB3YWxrcyB0aHJvdWdoIHRoZQogICAgICAqIGNvbXBvbmVudCBoaWVyYXJjaHkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIHgKLSAgICAgKiBAcGFyYW0geSB0aGUgeQorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgeC4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIHkuCiAgICAgICovCiAgICAgdm9pZCBzZXRDYXJldFBvcyhmaW5hbCBpbnQgeCwgZmluYWwgaW50IHkpIHsKICAgICAgICAgUnVubmFibGUgciA9IG5ldyBSdW5uYWJsZSgpIHsKQEAgLTYxMDYsMzUgKzU3MzAsMzQgQEAKICAgICAvKioKICAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIG9ubHkgYXQgZXZlbnQgZGlzcGF0Y2ggdGhyZWFkLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSB4Ci0gICAgICogQHBhcmFtIHkgdGhlIHkKKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIHguCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5LgogICAgICAqLwogICAgIHZvaWQgc2V0Q2FyZXRQb3NJbXBsKGludCB4LCBpbnQgeSkgewogICAgICAgICBDb21wb25lbnQgYyA9IHRoaXM7CiAgICAgICAgIHdoaWxlICgoYyAhPSBudWxsKSAmJiBjLmJlaGF2aW91ci5pc0xpZ2h0d2VpZ2h0KCkpIHsKICAgICAgICAgICAgIHggKz0gYy54OwogICAgICAgICAgICAgeSArPSBjLnk7Ci0gICAgICAgICAgICAvLz8/P0FXVDogYyA9IGMuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICAvLyA/Pz9BV1Q6IGMgPSBjLmdldFBhcmVudCgpOwogICAgICAgICB9CiAgICAgICAgIGlmIChjID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICAvLz8/P0FXVAorICAgICAgICAvLyA/Pz9BV1QKICAgICAgICAgLyoKLSAgICAgICAgaWYgKGMgaW5zdGFuY2VvZiBXaW5kb3cpIHsKLSAgICAgICAgICAgIEluc2V0cyBpbnNldHMgPSBjLmdldE5hdGl2ZUluc2V0cygpOwotICAgICAgICAgICAgeCAtPSBpbnNldHMubGVmdDsKLSAgICAgICAgICAgIHkgLT0gaW5zZXRzLnRvcDsKLSAgICAgICAgfQotICAgICAgICB0b29sa2l0LmdldFdpbmRvd0ZhY3RvcnkoKS5zZXRDYXJldFBvc2l0aW9uKHgsIHkpOwotICAgICAgICAqLworICAgICAgICAgKiBpZiAoYyBpbnN0YW5jZW9mIFdpbmRvdykgeyBJbnNldHMgaW5zZXRzID0gYy5nZXROYXRpdmVJbnNldHMoKTsgeCAtPQorICAgICAgICAgKiBpbnNldHMubGVmdDsgeSAtPSBpbnNldHMudG9wOyB9CisgICAgICAgICAqIHRvb2xraXQuZ2V0V2luZG93RmFjdG9yeSgpLnNldENhcmV0UG9zaXRpb24oeCwgeSk7CisgICAgICAgICAqLwogICAgIH0KIAogICAgIC8vIHRvIGJlIG92ZXJyaWRkZW4gaW4gc3RhbmRhcmQgY29tcG9uZW50cyBzdWNoIGFzIEJ1dHRvbiBhbmQgTGlzdAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGRlZmF1bHQgbWluaW11bSBzaXplLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgbWluaW11bSBzaXplCisgICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBtaW5pbXVtIHNpemUuCiAgICAgICovCiAgICAgRGltZW5zaW9uIGdldERlZmF1bHRNaW5pbXVtU2l6ZSgpIHsKICAgICAgICAgcmV0dXJuIG51bGw7CkBAIC02MTQ0LDcgKzU3NjcsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGRlZmF1bHQgcHJlZmVycmVkIHNpemUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBwcmVmZXJyZWQgc2l6ZQorICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgcHJlZmVycmVkIHNpemUuCiAgICAgICovCiAgICAgRGltZW5zaW9uIGdldERlZmF1bHRQcmVmZXJyZWRTaXplKCkgewogICAgICAgICByZXR1cm4gbnVsbDsKQEAgLTYxNTcsMzAgKzU3ODAsMjggQEAKICAgICB2b2lkIHJlc2V0RGVmYXVsdFNpemUoKSB7CiAgICAgfQogCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIENvbXBvbmVudEJlaGF2aW9yIGNyZWF0ZUJlaGF2aW9yKCkgewotICAgICAgICByZXR1cm4gbmV3IExXQmVoYXZpb3IodGhpcyk7Ci0gICAgfQotICAgICovCisgICAgICogQ29tcG9uZW50QmVoYXZpb3IgY3JlYXRlQmVoYXZpb3IoKSB7IHJldHVybiBuZXcgTFdCZWhhdmlvcih0aGlzKTsgfQorICAgICAqLwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgZGVmYXVsdCBiYWNrZ3JvdW5kLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgYmFja2dyb3VuZAorICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgYmFja2dyb3VuZC4KICAgICAgKi8KICAgICBDb2xvciBnZXREZWZhdWx0QmFja2dyb3VuZCgpIHsKLSAgICAgICAgLy8/Pz9BV1Q6IHJldHVybiBnZXRXaW5kb3dBbmNlc3RvcigpLmdldERlZmF1bHRCYWNrZ3JvdW5kKCk7CisgICAgICAgIC8vID8/P0FXVDogcmV0dXJuIGdldFdpbmRvd0FuY2VzdG9yKCkuZ2V0RGVmYXVsdEJhY2tncm91bmQoKTsKICAgICAgICAgcmV0dXJuIGdldEJhY2tncm91bmQoKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IGZvcmVncm91bmQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBmb3JlZ3JvdW5kCisgICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBmb3JlZ3JvdW5kLgogICAgICAqLwogICAgIENvbG9yIGdldERlZmF1bHRGb3JlZ3JvdW5kKCkgewotICAgICAgICAvLz8/P0FXVCByZXR1cm4gZ2V0V2luZG93QW5jZXN0b3IoKS5nZXREZWZhdWx0Rm9yZWdyb3VuZCgpOworICAgICAgICAvLyA/Pz9BV1QgcmV0dXJuIGdldFdpbmRvd0FuY2VzdG9yKCkuZ2V0RGVmYXVsdEZvcmVncm91bmQoKTsKICAgICAgICAgcmV0dXJuIGdldEZvcmVncm91bmQoKTsKICAgICB9CiAKQEAgLTYxODgsNyArNTgwOSw4IEBACiAgICAgICogQ2FsbGVkIHdoZW4gbmF0aXZlIHJlc291cmNlIGZvciB0aGlzIGNvbXBvbmVudCBpcyBjcmVhdGVkIChmb3IKICAgICAgKiBoZWF2eXdlaWdodHMgb25seSkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHdpbiB0aGUgd2luCisgICAgICogQHBhcmFtIHdpbgorICAgICAqICAgICAgICAgICAgdGhlIHdpbi4KICAgICAgKi8KICAgICB2b2lkIG5hdGl2ZVdpbmRvd0NyZWF0ZWQoTmF0aXZlV2luZG93IHdpbikgewogICAgICAgICAvLyB0byBiZSBvdmVycmlkZGVuCkBAIC02MTk4LDQ4ICs1ODIwLDM3IEBACiAgICAgICogRGV0ZXJtaW5lIHRoZSBjb21wb25lbnQncyBhcmVhIGhpZGRlbiBiZWhpbmQgdGhlIHdpbmRvd3MgdGhhdCBoYXZlIGhpZ2hlcgogICAgICAqIFotb3JkZXIsIGluY2x1ZGluZyB3aW5kb3dzIG9mIG90aGVyIGFwcGxpY2F0aW9ucy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1hZ2UgdGhlIGltYWdlCi0gICAgICogQHBhcmFtIGRlc3RMb2NhdGlvbiB0aGUgZGVzdCBsb2NhdGlvbgotICAgICAqIEBwYXJhbSBkZXN0U2l6ZSB0aGUgZGVzdCBzaXplCi0gICAgICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY2FsY3VsYXRlZCByZWdpb24sIG9yIG51bGwgaWYgaXQgY2Fubm90IGJlIGRldGVybWluZWQKKyAgICAgKiBAcGFyYW0gaW1hZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZS4KKyAgICAgKiBAcGFyYW0gZGVzdExvY2F0aW9uCisgICAgICogICAgICAgICAgICB0aGUgZGVzdCBsb2NhdGlvbi4KKyAgICAgKiBAcGFyYW0gZGVzdFNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXN0IHNpemUuCisgICAgICogQHBhcmFtIHNvdXJjZQorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjYWxjdWxhdGVkIHJlZ2lvbiwgb3IgbnVsbCBpZiBpdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4KICAgICAgKi8KLSAgICAvLz8/P0FXVAorICAgIC8vID8/P0FXVAogICAgIC8qCi0gICAgTXVsdGlSZWN0QXJlYSBnZXRPYnNjdXJlZFJlZ2lvbihSZWN0YW5nbGUgcGFydCkgewotICAgICAgICBpZiAoIXZpc2libGUgfHwgcGFyZW50ID09IG51bGwgfHwgIXBhcmVudC52aXNpYmxlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBSZWN0YW5nbGUgciA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgdywgaCk7Ci0gICAgICAgIGlmIChwYXJ0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHIgPSByLmludGVyc2VjdGlvbihwYXJ0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHIudHJhbnNsYXRlKHgsIHkpOwotICAgICAgICBNdWx0aVJlY3RBcmVhIHJldCA9IHBhcmVudC5nZXRPYnNjdXJlZFJlZ2lvbihyKTsKLSAgICAgICAgaWYgKHJldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwYXJlbnQuYWRkT2JzY3VyZWRSZWdpb25zKHJldCwgdGhpcyk7Ci0gICAgICAgICAgICByZXQudHJhbnNsYXRlKC14LCAteSk7Ci0gICAgICAgICAgICByZXQuaW50ZXJzZWN0KG5ldyBSZWN0YW5nbGUoMCwgMCwgdywgaCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgICovCisgICAgICogTXVsdGlSZWN0QXJlYSBnZXRPYnNjdXJlZFJlZ2lvbihSZWN0YW5nbGUgcGFydCkgeyBpZiAoIXZpc2libGUgfHwgcGFyZW50CisgICAgICogPT0gbnVsbCB8fCAhcGFyZW50LnZpc2libGUpIHsgcmV0dXJuIG51bGw7IH0gUmVjdGFuZ2xlIHIgPSBuZXcKKyAgICAgKiBSZWN0YW5nbGUoMCwgMCwgdywgaCk7IGlmIChwYXJ0ICE9IG51bGwpIHsgciA9IHIuaW50ZXJzZWN0aW9uKHBhcnQpOyB9IGlmCisgICAgICogKHIuaXNFbXB0eSgpKSB7IHJldHVybiBudWxsOyB9IHIudHJhbnNsYXRlKHgsIHkpOyBNdWx0aVJlY3RBcmVhIHJldCA9CisgICAgICogcGFyZW50LmdldE9ic2N1cmVkUmVnaW9uKHIpOyBpZiAocmV0ICE9IG51bGwpIHsKKyAgICAgKiBwYXJlbnQuYWRkT2JzY3VyZWRSZWdpb25zKHJldCwgdGhpcyk7IHJldC50cmFuc2xhdGUoLXgsIC15KTsKKyAgICAgKiByZXQuaW50ZXJzZWN0KG5ldyBSZWN0YW5nbGUoMCwgMCwgdywgaCkpOyB9IHJldHVybiByZXQ7IH0KKyAgICAgKi8KIAotICAgIC8vPz8/QVdUCisgICAgLy8gPz8/QVdUCiAgICAgLyoKLSAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwKLSAgICAgICAgICAgIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBzdHJlYW0uZGVmYXVsdFJlYWRPYmplY3QoKTsKLSAgICAgICAgRmllbGRzQWNjZXNzb3IgYWNjZXNzb3IgPSBuZXcgRmllbGRzQWNjZXNzb3IoQ29tcG9uZW50LmNsYXNzLCB0aGlzKTsKLSAgICAgICAgYWNjZXNzb3Iuc2V0KCJ0b29sa2l0IiwgVG9vbGtpdC5nZXREZWZhdWx0VG9vbGtpdCgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhY2Nlc3Nvci5zZXQoImJlaGF2aW91ciIsIGNyZWF0ZUJlaGF2aW9yKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGFjY2Vzc29yLnNldCgiY29tcG9uZW50TG9jayIsIG5ldyBPYmplY3QoKSk7IC8vICROT04tTE9DSy0xJCAvLyROT04tTkxTLTEkCi0gICAgfQotICAgICovCisgICAgICogcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sCisgICAgICogQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7IHN0cmVhbS5kZWZhdWx0UmVhZE9iamVjdCgpOyBGaWVsZHNBY2Nlc3NvcgorICAgICAqIGFjY2Vzc29yID0gbmV3IEZpZWxkc0FjY2Vzc29yKENvbXBvbmVudC5jbGFzcywgdGhpcyk7CisgICAgICogYWNjZXNzb3Iuc2V0KCJ0b29sa2l0IiwgVG9vbGtpdC5nZXREZWZhdWx0VG9vbGtpdCgpKTsgLy8kTk9OLU5MUy0xJAorICAgICAqIGFjY2Vzc29yLnNldCgiYmVoYXZpb3VyIiwgY3JlYXRlQmVoYXZpb3IoKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgKiBhY2Nlc3Nvci5zZXQoImNvbXBvbmVudExvY2siLCBuZXcgT2JqZWN0KCkpOyAvLyAkTk9OLUxPQ0stMSQKKyAgICAgKiAvLyROT04tTkxTLTEkIH0KKyAgICAgKi8KIAogICAgIGZpbmFsIHZvaWQgb25EcmF3SW1hZ2UoSW1hZ2UgaW1hZ2UsIFBvaW50IGRlc3RMb2NhdGlvbiwgRGltZW5zaW9uIGRlc3RTaXplLCBSZWN0YW5nbGUgc291cmNlKSB7CiAgICAgICAgIEltYWdlUGFyYW1ldGVycyBpbWFnZVBhcmFtczsKQEAgLTYyNzIsMzMgKzU4ODMsMzcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vPz8/QVdUCisgICAgLy8gPz8/QVdUCiAgICAgLyoKLSAgICBwcml2YXRlIHZvaWQgaW52YWxpZGF0ZVJlYWxQYXJlbnQoKSB7Ci0gICAgICAgIENvbnRhaW5lciByZWFsUGFyZW50ID0gZ2V0UmVhbFBhcmVudCgpOwotICAgICAgICBpZiAoKHJlYWxQYXJlbnQgIT0gbnVsbCkgJiYgcmVhbFBhcmVudC5pc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgIHJlYWxQYXJlbnQuaW52YWxpZGF0ZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgICovCisgICAgICogcHJpdmF0ZSB2b2lkIGludmFsaWRhdGVSZWFsUGFyZW50KCkgeyBDb250YWluZXIgcmVhbFBhcmVudCA9CisgICAgICogZ2V0UmVhbFBhcmVudCgpOyBpZiAoKHJlYWxQYXJlbnQgIT0gbnVsbCkgJiYgcmVhbFBhcmVudC5pc1ZhbGlkKCkpIHsKKyAgICAgKiByZWFsUGFyZW50LmludmFsaWRhdGUoKTsgfSB9CisgICAgICovCiAKICAgICAvKioKICAgICAgKiBUaGUgQ2xhc3MgSW1hZ2VQYXJhbWV0ZXJzLgogICAgICAqLwogICAgIHByaXZhdGUgY2xhc3MgSW1hZ2VQYXJhbWV0ZXJzIHsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgZHJhd2luZyBwYXJhbXMuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBkcmF3aW5nIHBhcmFtcy4KKyAgICAgICAgICovCiAgICAgICAgIHByaXZhdGUgZmluYWwgTGlua2VkTGlzdDxEcmF3aW5nUGFyYW1ldGVycz4gZHJhd2luZ1BhcmFtcyA9IG5ldyBMaW5rZWRMaXN0PERyYXdpbmdQYXJhbWV0ZXJzPigpOwogCi0gICAgICAgIC8qKiBUaGUgc2l6ZS4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzaXplLgorICAgICAgICAgKi8KICAgICAgICAgRGltZW5zaW9uIHNpemUgPSBuZXcgRGltZW5zaW9uKENvbXBvbmVudC50aGlzLncsIENvbXBvbmVudC50aGlzLmgpOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBBZGRzIHRoZSBkcmF3aW5nLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGRlc3RMb2NhdGlvbiB0aGUgZGVzdCBsb2NhdGlvbgotICAgICAgICAgKiBAcGFyYW0gZGVzdFNpemUgdGhlIGRlc3Qgc2l6ZQotICAgICAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBzb3VyY2UKKyAgICAgICAgICogQHBhcmFtIGRlc3RMb2NhdGlvbgorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBkZXN0IGxvY2F0aW9uLgorICAgICAgICAgKiBAcGFyYW0gZGVzdFNpemUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgZGVzdCBzaXplLgorICAgICAgICAgKiBAcGFyYW0gc291cmNlCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZS4KICAgICAgICAgICovCiAgICAgICAgIHZvaWQgYWRkRHJhd2luZyhQb2ludCBkZXN0TG9jYXRpb24sIERpbWVuc2lvbiBkZXN0U2l6ZSwgUmVjdGFuZ2xlIHNvdXJjZSkgewogICAgICAgICAgICAgZHJhd2luZ1BhcmFtcy5hZGQobmV3IERyYXdpbmdQYXJhbWV0ZXJzKGRlc3RMb2NhdGlvbiwgZGVzdFNpemUsIHNvdXJjZSkpOwpAQCAtNjMwNyw3ICs1OTIyLDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIERyYXdpbmcgcGFyYW1ldGVycyBpdGVyYXRvci4KICAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIGl0ZXJhdG9yPCBkcmF3aW5nIHBhcmFtZXRlcnM+CisgICAgICAgICAqIEByZXR1cm4gdGhlIGl0ZXJhdG9yPCBkcmF3aW5nIHBhcmFtZXRlcnM+LgogICAgICAgICAgKi8KICAgICAgICAgSXRlcmF0b3I8RHJhd2luZ1BhcmFtZXRlcnM+IGRyYXdpbmdQYXJhbWV0ZXJzSXRlcmF0b3IoKSB7CiAgICAgICAgICAgICByZXR1cm4gZHJhd2luZ1BhcmFtcy5pdGVyYXRvcigpOwpAQCAtNjMxNywyMiArNTkzMiwzMSBAQAogICAgICAgICAgKiBUaGUgQ2xhc3MgRHJhd2luZ1BhcmFtZXRlcnMuCiAgICAgICAgICAqLwogICAgICAgICBjbGFzcyBEcmF3aW5nUGFyYW1ldGVycyB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKiBUaGUgZGVzdCBsb2NhdGlvbi4gKi8KKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgZGVzdCBsb2NhdGlvbi4KKyAgICAgICAgICAgICAqLwogICAgICAgICAgICAgUG9pbnQgZGVzdExvY2F0aW9uOwogCi0gICAgICAgICAgICAvKiogVGhlIGRlc3Qgc2l6ZS4gKi8KKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIGRlc3Qgc2l6ZS4KKyAgICAgICAgICAgICAqLwogICAgICAgICAgICAgRGltZW5zaW9uIGRlc3RTaXplOwogCi0gICAgICAgICAgICAvKiogVGhlIHNvdXJjZS4gKi8KKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIHNvdXJjZS4KKyAgICAgICAgICAgICAqLwogICAgICAgICAgICAgUmVjdGFuZ2xlIHNvdXJjZTsKIAogICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZHJhd2luZyBwYXJhbWV0ZXJzLgogICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBAcGFyYW0gZGVzdExvY2F0aW9uIHRoZSBkZXN0IGxvY2F0aW9uCi0gICAgICAgICAgICAgKiBAcGFyYW0gZGVzdFNpemUgdGhlIGRlc3Qgc2l6ZQotICAgICAgICAgICAgICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlCisgICAgICAgICAgICAgKiBAcGFyYW0gZGVzdExvY2F0aW9uCisgICAgICAgICAgICAgKiAgICAgICAgICAgIHRoZSBkZXN0IGxvY2F0aW9uLgorICAgICAgICAgICAgICogQHBhcmFtIGRlc3RTaXplCisgICAgICAgICAgICAgKiAgICAgICAgICAgIHRoZSBkZXN0IHNpemUuCisgICAgICAgICAgICAgKiBAcGFyYW0gc291cmNlCisgICAgICAgICAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UuCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIERyYXdpbmdQYXJhbWV0ZXJzKFBvaW50IGRlc3RMb2NhdGlvbiwgRGltZW5zaW9uIGRlc3RTaXplLCBSZWN0YW5nbGUgc291cmNlKSB7CiAgICAgICAgICAgICAgICAgdGhpcy5kZXN0TG9jYXRpb24gPSBuZXcgUG9pbnQoZGVzdExvY2F0aW9uKTsKQEAgLTYzNTMsNDQgKzU5NzcsMzIgQEAKICAgICAvKioKICAgICAgKiBUZXh0Q29tcG9uZW50IHN1cHBvcnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGUgdGhlIGUKKyAgICAgKiBAcGFyYW0gZQorICAgICAqICAgICAgICAgICAgdGhlIGUuCisgICAgICogQHJldHVybiB0cnVlLCBpZiBkaXNwYXRjaCBldmVudCB0byBpbS4KKyAgICAgKi8KKyAgICAvLyA/Pz9BV1QKKyAgICAvKgorICAgICAqIHByaXZhdGUgVGV4dEtpdCB0ZXh0S2l0ID0gbnVsbDsgVGV4dEtpdCBnZXRUZXh0S2l0KCkgeyByZXR1cm4gdGV4dEtpdDsgfQorICAgICAqIHZvaWQgc2V0VGV4dEtpdChUZXh0S2l0IGtpdCkgeyB0ZXh0S2l0ID0ga2l0OyB9CisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBUZXh0RmllbGQgc3VwcG9ydC4KKyAgICAgKi8KKyAgICAvLyA/Pz9BV1QKKyAgICAvKgorICAgICAqIHByaXZhdGUgVGV4dEZpZWxkS2l0IHRleHRGaWVsZEtpdCA9IG51bGw7IFRleHRGaWVsZEtpdCBnZXRUZXh0RmllbGRLaXQoKQorICAgICAqIHsgcmV0dXJuIHRleHRGaWVsZEtpdDsgfSB2b2lkIHNldFRleHRGaWVsZEtpdChUZXh0RmllbGRLaXQga2l0KSB7CisgICAgICogdGV4dEZpZWxkS2l0ID0ga2l0OyB9CisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBEaXNwYXRjaGVzIGlucHV0ICYgZm9jdXMgZXZlbnRzIHRvIGlucHV0IG1ldGhvZCBjb250ZXh0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgZGlzcGF0Y2ggZXZlbnQgdG8gaW0KLSAgICAgKi8KLSAgICAvLz8/P0FXVAotICAgIC8qCi0gICAgcHJpdmF0ZSBUZXh0S2l0IHRleHRLaXQgPSBudWxsOwotCi0gICAgVGV4dEtpdCBnZXRUZXh0S2l0KCkgewotICAgICAgICByZXR1cm4gdGV4dEtpdDsKLSAgICB9Ci0KLSAgICB2b2lkIHNldFRleHRLaXQoVGV4dEtpdCBraXQpIHsKLSAgICAgICAgdGV4dEtpdCA9IGtpdDsKLSAgICB9Ci0gICAgKi8KLQotICAgIC8qKgotICAgICAqIFRleHRGaWVsZCBzdXBwb3J0Ci0gICAgICovCi0gICAgLy8/Pz9BV1QKLSAgICAvKgotICAgIHByaXZhdGUgVGV4dEZpZWxkS2l0IHRleHRGaWVsZEtpdCA9IG51bGw7Ci0KLSAgICBUZXh0RmllbGRLaXQgZ2V0VGV4dEZpZWxkS2l0KCkgewotICAgICAgICByZXR1cm4gdGV4dEZpZWxkS2l0OwotICAgIH0KLQotICAgIHZvaWQgc2V0VGV4dEZpZWxkS2l0KFRleHRGaWVsZEtpdCBraXQpIHsKLSAgICAgICAgdGV4dEZpZWxkS2l0ID0ga2l0OwotICAgIH0KLSAgICAqLwotCi0gICAgLyoqCi0gICAgICogRGlzcGF0Y2hlcyBpbnB1dCAmIGZvY3VzIGV2ZW50cyB0byBpbnB1dCBtZXRob2QKLSAgICAgKiBjb250ZXh0LgotICAgICAqIEBwYXJhbSBlIGV2ZW50IHRvIHBhc3MgdG8gSW5wdXRDb250ZXh0LmRpc3BhdGNoRXZlbnQoKQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBldmVudCB3YXMgY29uc3VtZWQgYnkgSU0sIGZhbHNlIG90aGVyd2lzZQorICAgICAqIEBwYXJhbSBlCisgICAgICogICAgICAgICAgICBldmVudCB0byBwYXNzIHRvIElucHV0Q29udGV4dC5kaXNwYXRjaEV2ZW50KCkuCisgICAgICogQHJldHVybiB0cnVlIGlmIGV2ZW50IHdhcyBjb25zdW1lZCBieSBJTSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBkaXNwYXRjaEV2ZW50VG9JTShBV1RFdmVudCBlKSB7CiAgICAgICAgIElucHV0Q29udGV4dCBpYyA9IGdldElucHV0Q29udGV4dCgpOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L0NvbXBvbmVudEJlaGF2aW9yLmphdmEgYi9hd3QvamF2YS9hd3QvQ29tcG9uZW50QmVoYXZpb3IuamF2YQppbmRleCA4OWM5OTk5Li5mNGU4ZmZiIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvQ29tcG9uZW50QmVoYXZpb3IuamF2YQorKysgYi9hd3QvamF2YS9hd3QvQ29tcG9uZW50QmVoYXZpb3IuamF2YQpAQCAtMjQsNyArMjQsNyBAQAogCiAvKioKICAqIFRoZSBpbnRlcmZhY2Ugb2YgdGhlIGhlbHBlciBvYmplY3QgdGhhdCBlbmNhcHN1bGF0ZXMgdGhlIGRpZmZlcmVuY2UKLSAqIGJldHdlZW4gbGlnaHR3ZWlnaHQgYW5kIGhlYXZ5d2VpZ2h0IGNvbXBvbmVudHMuIAorICogYmV0d2VlbiBsaWdodHdlaWdodCBhbmQgaGVhdnl3ZWlnaHQgY29tcG9uZW50cy4KICAqLwogaW50ZXJmYWNlIENvbXBvbmVudEJlaGF2aW9yIHsKIApkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L0NvbXBvbmVudE9yaWVudGF0aW9uLmphdmEgYi9hd3QvamF2YS9hd3QvQ29tcG9uZW50T3JpZW50YXRpb24uamF2YQppbmRleCBkZGIxMThkLi41YWNjMTFhIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvQ29tcG9uZW50T3JpZW50YXRpb24uamF2YQorKysgYi9hd3QvamF2YS9hd3QvQ29tcG9uZW50T3JpZW50YXRpb24uamF2YQpAQCAtMTgsNDQgKzE4LDU5IEBACiAgKiBAYXV0aG9yIE1pY2hhZWwgRGFuaWxvdiwgRG1pdHJ5IEEuIER1cm5ldgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3Q7CiAKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIGltcG9ydCBqYXZhLnV0aWwuKjsKIAogLyoqCi0gKiBUaGUgQ29tcG9uZW50T3JpZW50YXRpb24gY2xhc3Mgc3BlY2lmaWVzIHRoZSBsYW5ndWFnZS1zZW5zaXRpdmUgb3JpZW50YXRpb24gCi0gKiBvZiBjb21wb25lbnQncyBlbGVtZW50cyBvciB0ZXh0LiBJdCBpcyB1c2VkIHRvIHJlZmxlY3QgdGhlIGRpZmZlcmVuY2VzIGluIHRoaXMgCi0gKiBvcmRlcmluZyBiZXR3ZWVuIGRpZmZlcmVudCB3cml0dGluZyBzeXN0ZW1zLiBUaGUgQ29tcG9uZW50T3JpZW50YXRpb24gY2xhc3MgCi0gKiBpbmRpY2F0ZXMgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBlbGVtZW50cy90ZXh0IGluIHRoZSBob3Jpem9udGFsIGRpcmVjdGlvbgotICogKCJsZWZ0IHRvIHJpZ2h0IiBvciAicmlnaHQgdG8gbGVmdCIpIGFuZCBpbiB0aGUgdmVydGljYWwgZGlyZWN0aW9uCisgKiBUaGUgQ29tcG9uZW50T3JpZW50YXRpb24gY2xhc3Mgc3BlY2lmaWVzIHRoZSBsYW5ndWFnZS1zZW5zaXRpdmUgb3JpZW50YXRpb24KKyAqIG9mIGNvbXBvbmVudCdzIGVsZW1lbnRzIG9yIHRleHQuIEl0IGlzIHVzZWQgdG8gcmVmbGVjdCB0aGUgZGlmZmVyZW5jZXMgaW4KKyAqIHRoaXMgb3JkZXJpbmcgYmV0d2VlbiBkaWZmZXJlbnQgd3JpdGluZyBzeXN0ZW1zLiBUaGUgQ29tcG9uZW50T3JpZW50YXRpb24KKyAqIGNsYXNzIGluZGljYXRlcyB0aGUgb3JpZW50YXRpb24gb2YgdGhlIGVsZW1lbnRzL3RleHQgaW4gdGhlIGhvcml6b250YWwKKyAqIGRpcmVjdGlvbiAoImxlZnQgdG8gcmlnaHQiIG9yICJyaWdodCB0byBsZWZ0IikgYW5kIGluIHRoZSB2ZXJ0aWNhbCBkaXJlY3Rpb24KICAqICgidG9wIHRvIGJvdHRvbSIgb3IgImJvdHRvbSB0byB0b3AiKS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBDb21wb25lbnRPcmllbnRhdGlvbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELiAqLworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQxMTMyOTEzOTIxNDM1NjM4MjhMOwogCi0gICAgLyoqIAorICAgIC8qKgogICAgICAqIFRoZSBDb25zdGFudCBMRUZUX1RPX1JJR0hUIGluZGljYXRlcyB0aGF0IGl0ZW1zIHJ1biBsZWZ0IHRvIHJpZ2h0LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50T3JpZW50YXRpb24gTEVGVF9UT19SSUdIVCA9IG5ldyBDb21wb25lbnRPcmllbnRhdGlvbih0cnVlLCB0cnVlKTsKIAotICAgIC8qKiAKKyAgICAvKioKICAgICAgKiBUaGUgQ29uc3RhbnQgUklHSFRfVE9fTEVGVCBpbmRpY2F0ZXMgdGhhdCBpdGVtcyBydW4gcmlnaHQgdG8gbGVmdC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudE9yaWVudGF0aW9uIFJJR0hUX1RPX0xFRlQgPSBuZXcgQ29tcG9uZW50T3JpZW50YXRpb24odHJ1ZSwgZmFsc2UpOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBVTktOT1dOIGluZGljYXRlcyB0aGF0IGEgY29tcG9uZW50J3Mgb3JpZW50YXRpb24gaXMgbm90IHNldC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVU5LTk9XTiBpbmRpY2F0ZXMgdGhhdCBhIGNvbXBvbmVudCdzIG9yaWVudGF0aW9uIGlzIG5vdCBzZXQuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnRPcmllbnRhdGlvbiBVTktOT1dOID0gbmV3IENvbXBvbmVudE9yaWVudGF0aW9uKHRydWUsIHRydWUpOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBybExhbmdzLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IHJsTGFuZ3MgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7IC8vUklHSFRfVE9fTEVGVCBsYW5ndWFnZXMKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgcmxMYW5ncy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBybExhbmdzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOyAvLyBSSUdIVF9UT19MRUZUCiAKLSAgICAvKiogVGhlIGhvcml6b250YWwuICovCisgICAgLy8gbGFuZ3VhZ2VzCisKKyAgICAvKioKKyAgICAgKiBUaGUgaG9yaXpvbnRhbC4KKyAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaG9yaXpvbnRhbDsKIAotICAgIC8qKiBUaGUgbGVmdDJyaWdodC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgbGVmdDJyaWdodC4KKyAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbGVmdDJyaWdodDsKIAogICAgIHN0YXRpYyB7CkBAIC02OCwxMCArODMsOSBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG9yaWVudGF0aW9uIGZvciB0aGUgZ2l2ZW4gUmVzb3VyY2VCdW5kbGUncyBsb2NhbGl6YXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIGJkbCB0aGUgUmVzb3VyY2VCdW5kbGUuCi0gICAgICogCisgICAgICogQHBhcmFtIGJkbAorICAgICAqICAgICAgICAgICAgdGhlIFJlc291cmNlQnVuZGxlLgogICAgICAqIEByZXR1cm4gdGhlIENvbXBvbmVudE9yaWVudGF0aW9uLgotICAgICAqIAogICAgICAqIEBkZXByZWNhdGVkIFVzZSBnZXRPcmllbnRhdGlvbihqYXZhLnV0aWwuTG9jYWxlKSBtZXRob2QuCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKQEAgLTc5LDEyICs5MywxMSBAQAogICAgICAgICBPYmplY3Qgb2JqID0gbnVsbDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG9iaiA9IGJkbC5nZXRPYmplY3QoIk9yaWVudGF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIG1yZSkgeworICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gbXJlKSB7CiAgICAgICAgICAgICBvYmogPSBudWxsOwogICAgICAgICB9CiAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBDb21wb25lbnRPcmllbnRhdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIChDb21wb25lbnRPcmllbnRhdGlvbikgb2JqOworICAgICAgICAgICAgcmV0dXJuIChDb21wb25lbnRPcmllbnRhdGlvbilvYmo7CiAgICAgICAgIH0KICAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGJkbC5nZXRMb2NhbGUoKTsKICAgICAgICAgaWYgKGxvY2FsZSA9PSBudWxsKSB7CkBAIC05Niw4ICsxMDksOCBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG9yaWVudGF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGxvY2FsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbG9jYWxlIHRoZSBzcGVjaWZpZWQgTG9jYWxlLgotICAgICAqIAorICAgICAqIEBwYXJhbSBsb2NhbGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgTG9jYWxlLgogICAgICAqIEByZXR1cm4gdGhlIENvbXBvbmVudE9yaWVudGF0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQ29tcG9uZW50T3JpZW50YXRpb24gZ2V0T3JpZW50YXRpb24oTG9jYWxlIGxvY2FsZSkgewpAQCAtMTA4LDggKzEyMSwxMCBAQAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBjb21wb25lbnQgb3JpZW50YXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIGhvciB3aGV0aGVyIHRoZSBpdGVtcyBzaG91bGQgYmUgYXJyYW5nZWQgaG9yaXpvbnRhbGx5Ci0gICAgICogQHBhcmFtIGwyciB3aGV0aGVyIHRoaXMgb3JpZW50YXRpb24gc3BlY2lmaWVzIGEgbGVmdC10by1yaWdodCBmbG93CisgICAgICogQHBhcmFtIGhvcgorICAgICAqICAgICAgICAgICAgd2hldGhlciB0aGUgaXRlbXMgc2hvdWxkIGJlIGFycmFuZ2VkIGhvcml6b250YWxseS4KKyAgICAgKiBAcGFyYW0gbDJyCisgICAgICogICAgICAgICAgICB3aGV0aGVyIHRoaXMgb3JpZW50YXRpb24gc3BlY2lmaWVzIGEgbGVmdC10by1yaWdodCBmbG93LgogICAgICAqLwogICAgIHByaXZhdGUgQ29tcG9uZW50T3JpZW50YXRpb24oYm9vbGVhbiBob3IsIGJvb2xlYW4gbDJyKSB7CiAgICAgICAgIGhvcml6b250YWwgPSBob3I7CkBAIC0xMTcsMTEgKzEzMiwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGV4dCBvZiB0aGUgb2Ygd3JpdGluZyBzeXN0ZW1zIGFycmFuZ2VkCi0gICAgICogaG9yaXpvbnRhbGx5LgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGV4dCBvZiB0aGUgb2Ygd3JpdGluZyBzeXN0ZW1zIGFycmFuZ2VkIGhvcml6b250YWxseS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSB0ZXh0IGlzIHdyaXR0ZW4gaG9yaXpvbnRhbGx5LCBmYWxzZSAKLSAgICAgKiBmb3IgYSB2ZXJ0aWNhbCBhcnJhbmdlbWVudC4gCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgdGV4dCBpcyB3cml0dGVuIGhvcml6b250YWxseSwgZmFsc2UgZm9yIGEgdmVydGljYWwKKyAgICAgKiAgICAgICAgIGFycmFuZ2VtZW50LgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzSG9yaXpvbnRhbCgpIHsKICAgICAgICAgcmV0dXJuIGhvcml6b250YWw7CkBAIC0xMzAsOCArMTQ0LDggQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRleHQgaXMgYXJyYW5nZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgZm9yIHdyaXRpbmcgc3lzdGVtcyB3cml0dGVuIGZyb20gbGVmdCB0byByaWdodDsgCi0gICAgICogZmFsc2UgZm9yIHJpZ2h0LXRvLWxlZnQuCisgICAgICogQHJldHVybiB0cnVlLCBmb3Igd3JpdGluZyBzeXN0ZW1zIHdyaXR0ZW4gZnJvbSBsZWZ0IHRvIHJpZ2h0OyBmYWxzZSBmb3IKKyAgICAgKiAgICAgICAgIHJpZ2h0LXRvLWxlZnQuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNMZWZ0VG9SaWdodCgpIHsKICAgICAgICAgcmV0dXJuIGxlZnQycmlnaHQ7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvQ29tcG9zaXRlLmphdmEgYi9hd3QvamF2YS9hd3QvQ29tcG9zaXRlLmphdmEKaW5kZXggOGU1YjkwYS4uZDE3MzBmZSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L0NvbXBvc2l0ZS5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9Db21wb3NpdGUuamF2YQpAQCAtMTgsMzAgKzE4LDM0IEBACiAgKiBAYXV0aG9yIElnb3IgVi4gU3RvbHlhcm92CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dDsKIAogaW1wb3J0IGphdmEuYXd0LmltYWdlLkNvbG9yTW9kZWw7CiAKIC8qKgotICogVGhlIENvbXBvc2l0ZSBpbnRlcmZhY2UgYWxsb3dzIHRoZSBtZXRob2RzIHRvIGNvbXBvc2UgYSBkcmF3IHByaW1pdGl2ZSAKLSAqIG9uIHRoZSBncmFwaGljcyBhcmVhLiBUaGUgY2xhc3NlcyBpbXBsZW1lbnRpbmcgdGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgCi0gKiB0aGUgcnVsZXMgYW5kIGEgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgY29udGV4dCBmb3IgYSBwYXJ0aWN1bGFyIG9wZXJhdGlvbi4KKyAqIFRoZSBDb21wb3NpdGUgaW50ZXJmYWNlIGFsbG93cyB0aGUgbWV0aG9kcyB0byBjb21wb3NlIGEgZHJhdyBwcmltaXRpdmUgb24gdGhlCisgKiBncmFwaGljcyBhcmVhLiBUaGUgY2xhc3NlcyBpbXBsZW1lbnRpbmcgdGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgdGhlIHJ1bGVzIGFuZAorICogYSBtZXRob2QgdG8gY3JlYXRlIHRoZSBjb250ZXh0IGZvciBhIHBhcnRpY3VsYXIgb3BlcmF0aW9uLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBDb21wb3NpdGUgewogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIENvbXBvc2l0ZUNvbnRleHQgd2hpY2ggZGVmaW5lcyB0aGUgZW5jYXBzdWxhdGVkIGFuZCAKLSAgICAgKiBvcHRpbWl6ZWQgZW52aXJvbm1lbnQgZm9yIGEgY29tcG9zaXRpbmcgb3BlcmF0aW9uLiBTZXZlcmFsIGNvbnRleHRzIAotICAgICAqIGNhbiBleGlzdCBmb3IgYSBzaW5nbGUgQ29tcG9zaXRlIG9iamVjdC4KKyAgICAgKiBDcmVhdGVzIGEgQ29tcG9zaXRlQ29udGV4dCB3aGljaCBkZWZpbmVzIHRoZSBlbmNhcHN1bGF0ZWQgYW5kIG9wdGltaXplZAorICAgICAqIGVudmlyb25tZW50IGZvciBhIGNvbXBvc2l0aW5nIG9wZXJhdGlvbi4gU2V2ZXJhbCBjb250ZXh0cyBjYW4gZXhpc3QgZm9yIGEKKyAgICAgKiBzaW5nbGUgQ29tcG9zaXRlIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3JjQ29sb3JNb2RlbCB0aGUgc291cmNlJ3MgQ29sb3JNb2RlbC4KLSAgICAgKiBAcGFyYW0gZHN0Q29sb3JNb2RlbCB0aGUgZGVzdGluYXRpb24ncyBDb2xvck1vZGVsLgotICAgICAqIEBwYXJhbSBoaW50cyB0aGUgUmVuZGVyaW5nSGludHMuCi0gICAgICogCisgICAgICogQHBhcmFtIHNyY0NvbG9yTW9kZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UncyBDb2xvck1vZGVsLgorICAgICAqIEBwYXJhbSBkc3RDb2xvck1vZGVsCisgICAgICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24ncyBDb2xvck1vZGVsLgorICAgICAqIEBwYXJhbSBoaW50cworICAgICAqICAgICAgICAgICAgdGhlIFJlbmRlcmluZ0hpbnRzLgogICAgICAqIEByZXR1cm4gdGhlIENvbXBvc2l0ZUNvbnRleHQgb2JqZWN0LgogICAgICAqLwotICAgIHB1YmxpYyBDb21wb3NpdGVDb250ZXh0IGNyZWF0ZUNvbnRleHQoQ29sb3JNb2RlbCBzcmNDb2xvck1vZGVsLAotICAgICAgICAgICAgQ29sb3JNb2RlbCBkc3RDb2xvck1vZGVsLCBSZW5kZXJpbmdIaW50cyBoaW50cyk7CisgICAgcHVibGljIENvbXBvc2l0ZUNvbnRleHQgY3JlYXRlQ29udGV4dChDb2xvck1vZGVsIHNyY0NvbG9yTW9kZWwsIENvbG9yTW9kZWwgZHN0Q29sb3JNb2RlbCwKKyAgICAgICAgICAgIFJlbmRlcmluZ0hpbnRzIGhpbnRzKTsKIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvQ29tcG9zaXRlQ29udGV4dC5qYXZhIGIvYXd0L2phdmEvYXd0L0NvbXBvc2l0ZUNvbnRleHQuamF2YQppbmRleCBjNjc2MDMyLi43OTU2NDBkIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvQ29tcG9zaXRlQ29udGV4dC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9Db21wb3NpdGVDb250ZXh0LmphdmEKQEAgLTE4LDI1ICsxOCwzMSBAQAogICogQGF1dGhvciBJZ29yIFYuIFN0b2x5YXJvdgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3Q7CiAKIGltcG9ydCBqYXZhLmF3dC5pbWFnZS5SYXN0ZXI7CiBpbXBvcnQgamF2YS5hd3QuaW1hZ2UuV3JpdGFibGVSYXN0ZXI7CiAKIC8qKgotICogVGhlIENvbXBvc2l0ZUNvbnRleHQgaW50ZXJmYWNlIHNwZWNpZmllcyB0aGUgZW5jYXBzdWxhdGVkIGFuZCBvcHRpbWl6ZWQgCi0gKiBlbnZpcm9ubWVudCBmb3IgYSBjb21wb3NpdGluZyBvcGVyYXRpb24uIAorICogVGhlIENvbXBvc2l0ZUNvbnRleHQgaW50ZXJmYWNlIHNwZWNpZmllcyB0aGUgZW5jYXBzdWxhdGVkIGFuZCBvcHRpbWl6ZWQKKyAqIGVudmlyb25tZW50IGZvciBhIGNvbXBvc2l0aW5nIG9wZXJhdGlvbi4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgQ29tcG9zaXRlQ29udGV4dCB7CiAKICAgICAvKioKLSAgICAgKiBDb21wb3NlcyB0aGUgdHdvIHNvdXJjZSBSYXN0ZXIgb2JqZWN0cyBhbmQgcGxhY2VzIHRoZSByZXN1bHQgaW4gdGhlIAotICAgICAqIGRlc3RpbmF0aW9uIFdyaXRhYmxlUmFzdGVyLiAKKyAgICAgKiBDb21wb3NlcyB0aGUgdHdvIHNvdXJjZSBSYXN0ZXIgb2JqZWN0cyBhbmQgcGxhY2VzIHRoZSByZXN1bHQgaW4gdGhlCisgICAgICogZGVzdGluYXRpb24gV3JpdGFibGVSYXN0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNyYyB0aGUgc291cmNlIFJhc3Rlci4KLSAgICAgKiBAcGFyYW0gZHN0SW4gdGhlIGRlc3RpbmF0aW9uIFJhc3Rlci4KLSAgICAgKiBAcGFyYW0gZHN0T3V0IHRoZSBXcml0YWJsZVJhc3RlciBvYmplY3Qgd2hlcmUgdGhlIHJlc3VsdCBvZgotICAgICAqIGNvbXBvc2luZyBvcGVyYXRpb24gaXMgc3RvcmVkLgorICAgICAqIEBwYXJhbSBzcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgUmFzdGVyLgorICAgICAqIEBwYXJhbSBkc3RJbgorICAgICAqICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIFJhc3Rlci4KKyAgICAgKiBAcGFyYW0gZHN0T3V0CisgICAgICogICAgICAgICAgICB0aGUgV3JpdGFibGVSYXN0ZXIgb2JqZWN0IHdoZXJlIHRoZSByZXN1bHQgb2YgY29tcG9zaW5nCisgICAgICogICAgICAgICAgICBvcGVyYXRpb24gaXMgc3RvcmVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNvbXBvc2UoUmFzdGVyIHNyYywgUmFzdGVyIGRzdEluLCBXcml0YWJsZVJhc3RlciBkc3RPdXQpOwogCkBAIC00Niw0ICs1MiwzIEBACiAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpOwogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9DdXJzb3IuamF2YSBiL2F3dC9qYXZhL2F3dC9DdXJzb3IuamF2YQppbmRleCA2MjU2ODZjLi4wYTBjYzg0IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvQ3Vyc29yLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L0N1cnNvci5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIERtaXRyeSBBLiBEdXJuZXYKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0OwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtMzUsNjEgKzM2LDk5IEBACiAKIC8qKgogICogVGhlIEN1cnNvciBjbGFzcyByZXByZXNlbnRzIHRoZSBiaXRtYXAgb2YgdGhlIG1vdXNlIGN1cnNvci4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBDdXJzb3IgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgc2VyaWFsVmVyc2lvblVJRC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDgwMjgyMzc0OTc1Njg5ODU1MDRMOwotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgREVGQVVMVF9DVVJTT1IgaW5kaWNhdGVzIHRoZSBkZWZhdWx0IGN1cnNvciB0eXBlLiAqLworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IERFRkFVTFRfQ1VSU09SIGluZGljYXRlcyB0aGUgZGVmYXVsdCBjdXJzb3IgdHlwZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0NVUlNPUiA9IDA7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IENST1NTSEFJUl9DVVJTT1IgY3Vyc29yIHR5cGUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IENST1NTSEFJUl9DVVJTT1IgY3Vyc29yIHR5cGUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1JPU1NIQUlSX0NVUlNPUiA9IDE7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFRFWFRfQ1VSU09SIGN1cnNvciB0eXBlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBURVhUX0NVUlNPUiBjdXJzb3IgdHlwZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVhUX0NVUlNPUiA9IDI7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFdBSVRfQ1VSU09SIGN1cnNvciB0eXBlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBXQUlUX0NVUlNPUiBjdXJzb3IgdHlwZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQUlUX0NVUlNPUiA9IDM7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFNXX1JFU0laRV9DVVJTT1IgY3Vyc29yIHR5cGUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFNXX1JFU0laRV9DVVJTT1IgY3Vyc29yIHR5cGUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1dfUkVTSVpFX0NVUlNPUiA9IDQ7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFNFX1JFU0laRV9DVVJTT1IgY3Vyc29yIHR5cGUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFNFX1JFU0laRV9DVVJTT1IgY3Vyc29yIHR5cGUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VfUkVTSVpFX0NVUlNPUiA9IDU7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IE5XX1JFU0laRV9DVVJTT1IgY3Vyc29yIHR5cGUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IE5XX1JFU0laRV9DVVJTT1IgY3Vyc29yIHR5cGUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTldfUkVTSVpFX0NVUlNPUiA9IDY7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IE5FX1JFU0laRV9DVVJTT1IgY3Vyc29yIHR5cGUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IE5FX1JFU0laRV9DVVJTT1IgY3Vyc29yIHR5cGUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkVfUkVTSVpFX0NVUlNPUiA9IDc7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IE5fUkVTSVpFX0NVUlNPUiBjdXJzb3IgdHlwZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgTl9SRVNJWkVfQ1VSU09SIGN1cnNvciB0eXBlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5fUkVTSVpFX0NVUlNPUiA9IDg7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFNfUkVTSVpFX0NVUlNPUiBjdXJzb3IgdHlwZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgU19SRVNJWkVfQ1VSU09SIGN1cnNvciB0eXBlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfUkVTSVpFX0NVUlNPUiA9IDk7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFdfUkVTSVpFX0NVUlNPUiBjdXJzb3IgdHlwZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgV19SRVNJWkVfQ1VSU09SIGN1cnNvciB0eXBlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdfUkVTSVpFX0NVUlNPUiA9IDEwOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBFX1JFU0laRV9DVVJTT1IgY3Vyc29yIHR5cGUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEVfUkVTSVpFX0NVUlNPUiBjdXJzb3IgdHlwZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFX1JFU0laRV9DVVJTT1IgPSAxMTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgSEFORF9DVVJTT1IgY3Vyc29yIHR5cGUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEhBTkRfQ1VSU09SIGN1cnNvciB0eXBlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhBTkRfQ1VSU09SID0gMTI7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IE1PVkVfQ1VSU09SIGN1cnNvciB0eXBlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBNT1ZFX0NVUlNPUiBjdXJzb3IgdHlwZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT1ZFX0NVUlNPUiA9IDEzOwogCi0gICAgLyoqIEEgbWFwcGluZyBmcm9tIG5hbWVzIHRvIHN5c3RlbSBjdXN0b20gY3Vyc29ycy4gKi8KKyAgICAvKioKKyAgICAgKiBBIG1hcHBpbmcgZnJvbSBuYW1lcyB0byBzeXN0ZW0gY3VzdG9tIGN1cnNvcnMuCisgICAgICovCiAgICAgc3RhdGljIE1hcDxTdHJpbmcsIEN1cnNvcj4gc3lzdGVtQ3VzdG9tQ3Vyc29yczsKLSAgICAKLSAgICAvKiogVGhlIGN1cnNvciBwcm9wcy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBjdXJzb3IgcHJvcHMuCisgICAgICovCiAgICAgc3RhdGljIFByb3BlcnRpZXMgY3Vyc29yUHJvcHM7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IHByZWRlZmluZWROYW1lcy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgcHJlZGVmaW5lZE5hbWVzLgorICAgICAqLwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBwcmVkZWZpbmVkTmFtZXMgPSB7CiAgICAgICAgICAgICAiRGVmYXVsdCIsICJDcm9zc2hhaXIiLCAiVGV4dCIsICJXYWl0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAogICAgICAgICAgICAgIlNvdXRod2VzdCBSZXNpemUiLCAiU291dGhlYXN0IFJlc2l6ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJApAQCAtOTksNDEgKzEzOCw1MiBAQAogCiAgICAgfTsKIAotICAgIC8qKiBUaGUgcHJlZGVmaW5lZCBzZXQgb2YgY3Vyc29ycy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgcHJlZGVmaW5lZCBzZXQgb2YgY3Vyc29ycy4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgc3RhdGljIEN1cnNvcltdIHByZWRlZmluZWQgPSB7Ci0gICAgICAgICAgICBuZXcgQ3Vyc29yKERFRkFVTFRfQ1VSU09SKSwgbnVsbCwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsIG51bGwsCi0gICAgICAgICAgICBudWxsLCBudWxsLCBudWxsLCBudWxsLAotICAgICAgICAgICAgbnVsbCwgbnVsbAorICAgICAgICAgICAgbmV3IEN1cnNvcihERUZBVUxUX0NVUlNPUiksIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsCisgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsCiAgICAgfTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgQ1VTVE9NX0NVUlNPUiBpcyBhc3NvY2lhdGVkIHdpdGggYWxsIGN1c3RvbSBjdXJzb3IgdHlwZXMuIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBDVVNUT01fQ1VSU09SIGlzIGFzc29jaWF0ZWQgd2l0aCBhbGwgY3VzdG9tIGN1cnNvciB0eXBlcy4KICAgICAgKiAoVGhvc2Ugd2hpY2ggYXJlIG5vdCBwcmVkZWZpbmVkKQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENVU1RPTV9DVVJTT1IgPSAtMTsKIAotICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgY3Vyc29yLiAqLworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjdXJzb3IuCisgICAgICovCiAgICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lOwogCi0gICAgLyoqIFRoZSB0eXBlIG9mIHRoZSBjdXJzb3IsIGNob3NlbiBmcm9tIHRoZSBsaXN0IG9mIGN1cnNvciB0eXBlIGNvbnN0YW50cy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB0aGUgY3Vyc29yLCBjaG9zZW4gZnJvbSB0aGUgbGlzdCBvZiBjdXJzb3IgdHlwZSBjb25zdGFudHMuCisgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgdHlwZTsKLSAgICAKLSAgICAvKiogVGhlIG5hdGl2ZSBjdXJzb3IuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgbmF0aXZlIGN1cnNvci4KKyAgICAgKi8KICAgICBwcml2YXRlIHRyYW5zaWVudCBOYXRpdmVDdXJzb3IgbmF0aXZlQ3Vyc29yOwotICAgIAotICAgIC8qKiBUaGUgZXhhY3QgcG9pbnQgb24gdGhlIGN1cnNvciBpbWFnZSB0aGF0IGluZGljYXRlcyB3aGljaCBwb2ludCAKLSAgICAgKiB0aGUgY3Vyc29yIGlzIHNlbGVjdGluZyAocG9pbnRpbmcgdG8pLiBUaGUgY29vcmRpbmF0ZXMgYXJlIGdpdmVuIAotICAgICAqIHdpdGggcmVzcGVjdCB0aGUgb3JpZ2luIG9mIHRoZSBJbWFnZSAoaXRzIHVwcGVyIGxlZnQgY29ybmVyKS4KKworICAgIC8qKgorICAgICAqIFRoZSBleGFjdCBwb2ludCBvbiB0aGUgY3Vyc29yIGltYWdlIHRoYXQgaW5kaWNhdGVzIHdoaWNoIHBvaW50IHRoZSBjdXJzb3IKKyAgICAgKiBpcyBzZWxlY3RpbmcgKHBvaW50aW5nIHRvKS4gVGhlIGNvb3JkaW5hdGVzIGFyZSBnaXZlbiB3aXRoIHJlc3BlY3QgdGhlCisgICAgICogb3JpZ2luIG9mIHRoZSBJbWFnZSAoaXRzIHVwcGVyIGxlZnQgY29ybmVyKS4KICAgICAgKi8KICAgICBwcml2YXRlIFBvaW50IGhvdFNwb3Q7Ci0gICAgCi0gICAgLyoqIFRoZSBpbWFnZSB0byBkcmF3IG9uIHRoZSBzY3JlZW4gcmVwcmVzZW50aW5nIHRoZSBjdXJzb3IuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgaW1hZ2UgdG8gZHJhdyBvbiB0aGUgc2NyZWVuIHJlcHJlc2VudGluZyB0aGUgY3Vyc29yLgorICAgICAqLwogICAgIHByaXZhdGUgSW1hZ2UgaW1hZ2U7CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgY3Vyc29yIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgogICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIGN1cnNvci4KKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgY3Vyc29yLgogICAgICAqLwogICAgIHByb3RlY3RlZCBDdXJzb3IoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgdGhpcyhuYW1lLCBudWxsLCBuZXcgUG9pbnQoKSk7CkBAIC0xNDIsNyArMTkyLDggQEAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgY3Vyc29yIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiBjdXJzb3IuCisgICAgICogQHBhcmFtIHR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIGN1cnNvci4KICAgICAgKi8KICAgICBwdWJsaWMgQ3Vyc29yKGludCB0eXBlKSB7CiAgICAgICAgIGNoZWNrVHlwZSh0eXBlKTsKQEAgLTE1NSw5ICsyMDYsMTIgQEAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgY3Vyc29yLgogICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lCi0gICAgICogQHBhcmFtIGltZyB0aGUgaW1nCi0gICAgICogQHBhcmFtIGhvdFNwb3QgdGhlIGhvdCBzcG90CisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lLgorICAgICAqIEBwYXJhbSBpbWcKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWcuCisgICAgICogQHBhcmFtIGhvdFNwb3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBob3Qgc3BvdC4KICAgICAgKi8KICAgICBDdXJzb3IoU3RyaW5nIG5hbWUsIEltYWdlIGltZywgUG9pbnQgaG90U3BvdCkgewogICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwpAQCAtMTY3LDEwICsyMjEsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBGaW5hbGl6ZSBtZXRob2Qgb3ZlcnJpZGVkIGZpbmFsaXplIG1ldGhvZCBmcm9tIE9iamVjdCBjbGFzcy4KKyAgICAgKiBGaW5hbGl6ZSBtZXRob2Qgb3ZlcnJpZGVzIHRoZSBmaW5hbGl6ZSBtZXRob2QgZnJvbSBPYmplY3QgY2xhc3MuCiAgICAgICogCi0gICAgICogQHRocm93cyBUaHJvd2FibGUgaWYgdGhlIG5hdGl2ZSBjdXJzb3IgaXMgbm90IG51bGwgYW5kIHRocm93cwotICAgICAqIGEgdGhyb3dhYmxlIHdoZW4gZGVzdHJveWVkLgorICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlCisgICAgICogICAgICAgICAgICAgaWYgdGhlIG5hdGl2ZSBjdXJzb3IgaXMgbm90IG51bGwgYW5kIHRocm93cyBhIFRocm93YWJsZSB3aGVuCisgICAgICogICAgICAgICAgICAgZGVzdHJveWVkLgogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7CkBAIC0yMDEsNyArMjU2LDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBjdXJzb3IgdHlwZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjdXJzb3IgdHlwZQorICAgICAqIEByZXR1cm4gdGhlIGN1cnNvciB0eXBlLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKICAgICAgICAgcmV0dXJuIHR5cGU7CkBAIC0yMTAsOCArMjY1LDggQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBwcmVkZWZpbmVkIGN1cnNvciB3aXRoIHRoZSBzcGVjaWZpZWQgdHlwZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiBjdXJzb3IuCi0gICAgICogCisgICAgICogQHBhcmFtIHR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIGN1cnNvci4KICAgICAgKiBAcmV0dXJuIHRoZSBwcmVkZWZpbmVkIGN1cnNvciB3aXRoIHRoZSBzcGVjaWZpZWQgdHlwZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEN1cnNvciBnZXRQcmVkZWZpbmVkQ3Vyc29yKGludCB0eXBlKSB7CkBAIC0yMzYsMzMgKzI5MSwzMyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHNwZWNpZmllZCBzeXN0ZW0gY3VzdG9tIGN1cnNvci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZGVzaXJlZCBzeXN0ZW0gY3Vyc29yLgotICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZGVzaXJlZCBzeXN0ZW0gY3Vyc29yLgogICAgICAqIEByZXR1cm4gdGhlIHNwZWNpZmljIHN5c3RlbSBjdXJzb3Igd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0gICAgICogCi0gICAgICogQHRocm93cyBBV1RFeGNlcHRpb24gaWYgdGhlIGRlc2lyZWQgY3Vyc29yIGhhcyBtYWxmb3JtZWQgZGF0YQotICAgICAqIHN1Y2ggYXMgYW4gaW5jb3JyZWN0bHkgZGVmaW5lZCBob3Qgc3BvdC4KLSAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIGlmIHRoZSBpc0hlYWRsZXNzIG1ldGhvZCBvZiB0aGUgR3JhcGhpY3NFbnZpcm9ubWVudAotICAgICAqIHJldHVybnMgdHJ1ZS4KKyAgICAgKiBAdGhyb3dzIEFXVEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBkZXNpcmVkIGN1cnNvciBoYXMgbWFsZm9ybWVkIGRhdGEgc3VjaCBhcyBhbgorICAgICAqICAgICAgICAgICAgIGluY29ycmVjdGx5IGRlZmluZWQgaG90IHNwb3QuCisgICAgICogQHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBpc0hlYWRsZXNzIG1ldGhvZCBvZiB0aGUgR3JhcGhpY3NFbnZpcm9ubWVudCByZXR1cm5zCisgICAgICogICAgICAgICAgICAgdHJ1ZS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEN1cnNvciBnZXRTeXN0ZW1DdXN0b21DdXJzb3IoU3RyaW5nIG5hbWUpCi0gICAgdGhyb3dzIEFXVEV4Y2VwdGlvbiwgSGVhZGxlc3NFeGNlcHRpb24geworICAgIHB1YmxpYyBzdGF0aWMgQ3Vyc29yIGdldFN5c3RlbUN1c3RvbUN1cnNvcihTdHJpbmcgbmFtZSkgdGhyb3dzIEFXVEV4Y2VwdGlvbiwgSGVhZGxlc3NFeGNlcHRpb24gewogICAgICAgICBUb29sa2l0LmNoZWNrSGVhZGxlc3MoKTsKICAgICAgICAgcmV0dXJuIGdldFN5c3RlbUN1c3RvbUN1cnNvckZyb21NYXAobmFtZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgc3BlY2lmaWVkIHN5c3RlbSBjdXN0b20gY3Vyc29yIGZyb20gdGhlIG1hcCBvZiBzeXN0ZW0gY3VzdG9tIGN1cnNvcnMuCisgICAgICogR2V0cyB0aGUgc3BlY2lmaWVkIHN5c3RlbSBjdXN0b20gY3Vyc29yIGZyb20gdGhlIG1hcCBvZiBzeXN0ZW0gY3VzdG9tCisgICAgICogY3Vyc29ycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZGVzaXJlZCBjdXJzb3IuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGVzaXJlZCBzeXN0ZW0gY3VzdG9tIGN1cnNvciBmcm9tIHRoZSAKLSAgICAgKiBtYXAgb2Ygc3lzdGVtIGN1c3RvbSBjdXJzb3JzLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgQVdURXhjZXB0aW9uIHRoZSBBV1QgZXhjZXB0aW9uCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIGN1cnNvci4KKyAgICAgKiBAcmV0dXJuIHRoZSBkZXNpcmVkIHN5c3RlbSBjdXN0b20gY3Vyc29yIGZyb20gdGhlIG1hcCBvZiBzeXN0ZW0gY3VzdG9tCisgICAgICogICAgICAgICBjdXJzb3JzLgorICAgICAqIEB0aHJvd3MgQVdURXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgdGhlIEFXVCBleGNlcHRpb24uCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ3Vyc29yIGdldFN5c3RlbUN1c3RvbUN1cnNvckZyb21NYXAgKFN0cmluZyBuYW1lKQotICAgIHRocm93cyBBV1RFeGNlcHRpb24geworICAgIHByaXZhdGUgc3RhdGljIEN1cnNvciBnZXRTeXN0ZW1DdXN0b21DdXJzb3JGcm9tTWFwKFN0cmluZyBuYW1lKSB0aHJvd3MgQVdURXhjZXB0aW9uIHsKICAgICAgICAgbG9hZEN1cnNvclByb3BzKCk7CiAgICAgICAgIGlmIChzeXN0ZW1DdXN0b21DdXJzb3JzID09IG51bGwpIHsKICAgICAgICAgICAgIHN5c3RlbUN1c3RvbUN1cnNvcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEN1cnNvcj4oKTsKQEAgLTI4NCw4ICszMzksNyBAQAogICAgICAgICBpbnQgeCwgeTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHggPSBuZXcgSW50ZWdlcihob3RTcG90U3RyLnN1YnN0cmluZygwLCBpZHgpKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgeSA9IG5ldyBJbnRlZ2VyKGhvdFNwb3RTdHIuc3Vic3RyaW5nKGlkeCArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG90U3BvdFN0ci5sZW5ndGgoKSkpLmludFZhbHVlKCk7CisgICAgICAgICAgICB5ID0gbmV3IEludGVnZXIoaG90U3BvdFN0ci5zdWJzdHJpbmcoaWR4ICsgMSwgaG90U3BvdFN0ci5sZW5ndGgoKSkpLmludFZhbHVlKCk7CiAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBBV1RFeGNlcHRpb24oZXhNc2cpOwogICAgICAgICB9CkBAIC0yOTksNyArMzUzLDggQEAKICAgICAvKioKICAgICAgKiBMb2FkIGN1cnNvciBwcm9wcy4KICAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEFXVEV4Y2VwdGlvbiB0aGUgQVdUIGV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgQVdURXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgdGhlIEFXVCBleGNlcHRpb24uCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2FkQ3Vyc29yUHJvcHMoKSB0aHJvd3MgQVdURXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGN1cnNvclByb3BzICE9IG51bGwpIHsKQEAgLTMwOCwxOCArMzYzLDE4IEBACiAgICAgICAgIFN0cmluZyBzZXAgPSBGaWxlLnNlcGFyYXRvcjsKICAgICAgICAgU3RyaW5nIGN1cnNvcnNEaXIgPSAibGliIiArIHNlcCArICJpbWFnZXMiICsgc2VwICsgImN1cnNvcnMiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAogICAgICAgICBTdHJpbmcgY3Vyc29yc0Fic0RpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikgKyBzZXAgKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcnNEaXI7CisgICAgICAgICAgICAgICAgY3Vyc29yc0RpcjsKICAgICAgICAgU3RyaW5nIGN1cnNvclByb3BzRmlsZU5hbWUgPSAiY3Vyc29ycy5wcm9wZXJ0aWVzIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmcgY3Vyc29yUHJvcHNGdWxsRmlsZU5hbWUgPSAoY3Vyc29yc0Fic0RpciArIHNlcCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3JQcm9wc0ZpbGVOYW1lKTsKKyAgICAgICAgU3RyaW5nIGN1cnNvclByb3BzRnVsbEZpbGVOYW1lID0gKGN1cnNvcnNBYnNEaXIgKyBzZXAgKyBjdXJzb3JQcm9wc0ZpbGVOYW1lKTsKICAgICAgICAgY3Vyc29yUHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgY3Vyc29yUHJvcHMubG9hZChuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKAotICAgICAgICAgICAgICAgICAgICBjdXJzb3JQcm9wc0Z1bGxGaWxlTmFtZSkpKTsKKyAgICAgICAgICAgIGN1cnNvclByb3BzLmxvYWQobmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShjdXJzb3JQcm9wc0Z1bGxGaWxlTmFtZSkpKTsKICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIC8vIGF3dC4xNDI9RXhjZXB0aW9uOiBjbGFzcyB7MH0gezF9IG9jY3VycmVkIHdoaWxlIGxvYWRpbmc6IHsyfQogICAgICAgICAgICAgdGhyb3cgbmV3IEFXVEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4xNDIiLC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117ZS5nZXRDbGFzcygpLCBlLmdldE1lc3NhZ2UoKSwgY3Vyc29yUHJvcHNGdWxsRmlsZU5hbWV9KSk7CisgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRDbGFzcygpLCBlLmdldE1lc3NhZ2UoKSwgY3Vyc29yUHJvcHNGdWxsRmlsZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQVdURXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICAgfQpAQCAtMzI5LDcgKzM4NCw4IEBACiAgICAgLyoqCiAgICAgICogQ2hlY2sgdHlwZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZQorICAgICAqIEBwYXJhbSB0eXBlCisgICAgICogICAgICAgICAgICB0aGUgdHlwZS4KICAgICAgKi8KICAgICBzdGF0aWMgdm9pZCBjaGVja1R5cGUoaW50IHR5cGUpIHsKICAgICAgICAgLy8gY2FuJ3QgdXNlIHByZWRlZmluZWQgYXJyYXkgaGVyZSBiZWNhdXNlIGl0IG1heSBub3QgaGF2ZSBiZWVuCkBAIC0zNDQsNyArNDAwLDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBuYXRpdmUgY3Vyc29yLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hdGl2ZSBjdXJzb3IKKyAgICAgKiBAcmV0dXJuIHRoZSBuYXRpdmUgY3Vyc29yLgogICAgICAqLwogICAgIE5hdGl2ZUN1cnNvciBnZXROYXRpdmVDdXJzb3IoKSB7CiAgICAgICAgIGlmIChuYXRpdmVDdXJzb3IgIT0gbnVsbCkgewpAQCAtMzU0LDggKzQxMCw3IEBACiAgICAgICAgIGlmICh0eXBlICE9IENVU1RPTV9DVVJTT1IpIHsKICAgICAgICAgICAgIG5hdGl2ZUN1cnNvciA9IHRvb2xraXQuY3JlYXRlTmF0aXZlQ3Vyc29yKHR5cGUpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbmF0aXZlQ3Vyc29yID0gdG9vbGtpdC5jcmVhdGVDdXN0b21OYXRpdmVDdXJzb3IoaW1hZ2UsIGhvdFNwb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICAgICAgICAgIG5hdGl2ZUN1cnNvciA9IHRvb2xraXQuY3JlYXRlQ3VzdG9tTmF0aXZlQ3Vyc29yKGltYWdlLCBob3RTcG90LCBuYW1lKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbmF0aXZlQ3Vyc29yOwogICAgIH0KQEAgLTM2MywxMCArNDE4LDEwIEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgbmF0aXZlIGN1cnNvci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmF0aXZlQ3Vyc29yIHRoZSBuZXcgbmF0aXZlIGN1cnNvcgorICAgICAqIEBwYXJhbSBuYXRpdmVDdXJzb3IKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgbmF0aXZlIGN1cnNvci4KICAgICAgKi8KICAgICB2b2lkIHNldE5hdGl2ZUN1cnNvcihOYXRpdmVDdXJzb3IgbmF0aXZlQ3Vyc29yKSB7CiAgICAgICAgIHRoaXMubmF0aXZlQ3Vyc29yID0gbmF0aXZlQ3Vyc29yOwogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L0RpbWVuc2lvbi5qYXZhIGIvYXd0L2phdmEvYXd0L0RpbWVuc2lvbi5qYXZhCmluZGV4IDgxMzc4NDYuLjY3Nzc5NjIgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9EaW1lbnNpb24uamF2YQorKysgYi9hd3QvamF2YS9hd3QvRGltZW5zaW9uLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgRGVuaXMgTS4gS2lzaGVua28KICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0OwogCiBpbXBvcnQgamF2YS5hd3QuZ2VvbS5EaW1lbnNpb24yRDsKQEAgLTI2LDI2ICsyNywzNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5taXNjLkhhc2hDb2RlOwogCiAvKioKLSAqIFRoZSBEaW1lbnNpb24gcmVwcmVzZW50cyB0aGUgc2l6ZSAod2lkdGggYW5kIGhlaWdodCkgb2YgYSBjb21wb25lbnQuCi0gKiBUaGUgd2lkdGggYW5kIGhlaWdodCB2YWx1ZXMgY2FuIGJlIG5lZ2F0aXZlLCBidXQgaW4gdGhhdCBjYXNlIHRoZSAKLSAqIGJlaGF2aW9yIG9mIHNvbWUgbWV0aG9kcyBpcyB1bmV4cGVjdGVkLiAKKyAqIFRoZSBEaW1lbnNpb24gcmVwcmVzZW50cyB0aGUgc2l6ZSAod2lkdGggYW5kIGhlaWdodCkgb2YgYSBjb21wb25lbnQuIFRoZQorICogd2lkdGggYW5kIGhlaWdodCB2YWx1ZXMgY2FuIGJlIG5lZ2F0aXZlLCBidXQgaW4gdGhhdCBjYXNlIHRoZSBiZWhhdmlvciBvZgorICogc29tZSBtZXRob2RzIGlzIHVuZXhwZWN0ZWQuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgRGltZW5zaW9uIGV4dGVuZHMgRGltZW5zaW9uMkQgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewogCi0gICAgLyoqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQ3MjM5NTI1Nzk0OTEzNDk1MjRMOwogCi0gICAgLyoqIFRoZSB3aWR0aCBkaW1lbnNpb24uICovCisgICAgLyoqCisgICAgICogVGhlIHdpZHRoIGRpbWVuc2lvbi4KKyAgICAgKi8KICAgICBwdWJsaWMgaW50IHdpZHRoOwotICAgIAotICAgIC8qKiBUaGUgaGVpZ2h0IGRpbWVuc2lvbi4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBoZWlnaHQgZGltZW5zaW9uLgorICAgICAqLwogICAgIHB1YmxpYyBpbnQgaGVpZ2h0OwogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IERpbWVuc2lvbiB3aXRoIHRoZSBzYW1lIGRhdGEgYXMgdGhlIHNwZWNpZmllZCBEaW1lbnNpb24uCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IERpbWVuc2lvbiB3aXRoIHRoZSBzYW1lIGRhdGEgYXMgdGhlIHNwZWNpZmllZAorICAgICAqIERpbWVuc2lvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZCB0aGUgRGltZW5zaW9uIHRvIGNvcHkgdGhlIGRhdGEgZnJvbSB3aGVuIGNyZWF0aW5nIHRoZSAKLSAgICAgKiBuZXcgRGltZW5zaW9uIG9iamVjdC4KKyAgICAgKiBAcGFyYW0gZAorICAgICAqICAgICAgICAgICAgdGhlIERpbWVuc2lvbiB0byBjb3B5IHRoZSBkYXRhIGZyb20gd2hlbiBjcmVhdGluZyB0aGUgbmV3CisgICAgICogICAgICAgICAgICBEaW1lbnNpb24gb2JqZWN0LgogICAgICAqLwogICAgIHB1YmxpYyBEaW1lbnNpb24oRGltZW5zaW9uIGQpIHsKICAgICAgICAgdGhpcyhkLndpZHRoLCBkLmhlaWdodCk7CkBAIC02MSw4ICs3MiwxMCBAQAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBEaW1lbnNpb24gd2l0aCB0aGUgc3BlY2lmaWVkIHdpZHRoIGFuZCBoZWlnaHQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgbmV3IERpbWVuc2lvbi4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIG5ldyBEaW1lbnNpb24uCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIG5ldyBEaW1lbnNpb24uCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgbmV3IERpbWVuc2lvbi4KICAgICAgKi8KICAgICBwdWJsaWMgRGltZW5zaW9uKGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICAgICAgICBzZXRTaXplKHdpZHRoLCBoZWlnaHQpOwpAQCAtODQsMTAgKzk3LDEwIEBACiAgICAgLyoqCiAgICAgICogQ29tcGFyZXMgdGhpcyBEaW1lbnNpb24gb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIG9iaiB0aGUgT2JqZWN0IHRvIGJlIGNvbXBhcmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCBPYmplY3QgaXMgYSBEaW1lbnNpb24gd2l0aCAKLSAgICAgKiB0aGUgc2FtZSB3aWR0aCBhbmQgaGVpZ2h0IGRhdGEgYXMgdGhpcyBEaW1lbnNpb24uIAorICAgICAqIEBwYXJhbSBvYmoKKyAgICAgKiAgICAgICAgICAgIHRoZSBPYmplY3QgdG8gYmUgY29tcGFyZWQuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIE9iamVjdCBpcyBhIERpbWVuc2lvbiB3aXRoIHRoZSBzYW1lIHdpZHRoCisgICAgICogICAgICAgICBhbmQgaGVpZ2h0IGRhdGEgYXMgdGhpcyBEaW1lbnNpb24uCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKQEAgLTEwOCwxNiArMTIxLDIwIEBACiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgLy8gVGhlIG91dHB1dCBmb3JtYXQgYmFzZWQgb24gMS41IHJlbGVhc2UgYmVoYXZpb3VyLiBJdCBjb3VsZCBiZSBvYnRhaW5lZCBpbiB0aGUgZm9sbG93aW5nIHdheQorICAgICAgICAvLyBUaGUgb3V0cHV0IGZvcm1hdCBiYXNlZCBvbiAxLjUgcmVsZWFzZSBiZWhhdmlvdXIuIEl0IGNvdWxkIGJlCisgICAgICAgIC8vIG9idGFpbmVkIGluIHRoZSBmb2xsb3dpbmcgd2F5CiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbihuZXcgRGltZW5zaW9uKCkudG9TdHJpbmcoKSkKICAgICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIlt3aWR0aD0iICsgd2lkdGggKyAiLGhlaWdodD0iICsgaGVpZ2h0ICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHNpemUgb2YgdGhpcyBEaW1lbnNpb24gb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCB3aWR0aCBhbmQgaGVpZ2h0LgorICAgICAqIFNldHMgdGhlIHNpemUgb2YgdGhpcyBEaW1lbnNpb24gb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCB3aWR0aCBhbmQKKyAgICAgKiBoZWlnaHQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgRGltZW5zaW9uLgotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgRGltZW5zaW9uLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBEaW1lbnNpb24uCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgRGltZW5zaW9uLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CiAgICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDsKQEAgLTEyNSwyMiArMTQyLDI0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgc2l6ZSBvZiB0aGlzIERpbWVuc2lvbiBvYmplY3QgYnkgY29weWluZyB0aGUgCi0gICAgICogZGF0YSBmcm9tIHRoZSBzcGVjaWZpZWQgRGltZW5zaW9uIG9iamVjdC4KKyAgICAgKiBTZXRzIHRoZSBzaXplIG9mIHRoaXMgRGltZW5zaW9uIG9iamVjdCBieSBjb3B5aW5nIHRoZSBkYXRhIGZyb20gdGhlCisgICAgICogc3BlY2lmaWVkIERpbWVuc2lvbiBvYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIGQgdGhlIERpbWVuc2lvbiB0aGF0IGdpdmVzIHRoZSBuZXcgc2l6ZSB2YWx1ZXMuCisgICAgICogQHBhcmFtIGQKKyAgICAgKiAgICAgICAgICAgIHRoZSBEaW1lbnNpb24gdGhhdCBnaXZlcyB0aGUgbmV3IHNpemUgdmFsdWVzLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFNpemUoRGltZW5zaW9uIGQpIHsKICAgICAgICAgc2V0U2l6ZShkLndpZHRoLCBkLmhlaWdodCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgc2l6ZSBvZiB0aGlzIERpbWVuc2lvbiBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIGRvdWJsZSB3aWR0aCAKKyAgICAgKiBTZXRzIHRoZSBzaXplIG9mIHRoaXMgRGltZW5zaW9uIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgZG91YmxlIHdpZHRoCiAgICAgICogYW5kIGhlaWdodC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSBEaW1lbnNpb24uCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBEaW1lbnNpb24uCi0gICAgICogCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIERpbWVuc2lvbi4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBEaW1lbnNpb24uCiAgICAgICogQHNlZSBqYXZhLmF3dC5nZW9tLkRpbWVuc2lvbjJEI3NldFNpemUoZG91YmxlLCBkb3VibGUpCiAgICAgICovCiAgICAgQE92ZXJyaWRlCkBAIC0xNjEsNyArMTgwLDYgQEAKICAgICAgKiBHZXRzIHRoZSBoZWlnaHQgb2YgdGhlIERpbWVuc2lvbi4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBoZWlnaHQgb2YgdGhlIERpbWVuc2lvbi4KLSAgICAgKiAKICAgICAgKiBAc2VlIGphdmEuYXd0Lmdlb20uRGltZW5zaW9uMkQjZ2V0SGVpZ2h0KCkKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKQEAgLTE3Myw3ICsxOTEsNiBAQAogICAgICAqIEdldHMgdGhlIHdpZHRoIG9mIHRoZSBEaW1lbnNpb24uCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgd2lkdGggb2YgdGhlIERpbWVuc2lvbi4KLSAgICAgKiAKICAgICAgKiBAc2VlIGphdmEuYXd0Lmdlb20uRGltZW5zaW9uMkQjZ2V0V2lkdGgoKQogICAgICAqLwogICAgIEBPdmVycmlkZQpAQCAtMTgyLDQgKzE5OSwzIEBACiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9EaXNwbGF5TW9kZS5qYXZhIGIvYXd0L2phdmEvYXd0L0Rpc3BsYXlNb2RlLmphdmEKaW5kZXggMDgyYzdiOC4uODAyMTAxMCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L0Rpc3BsYXlNb2RlLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L0Rpc3BsYXlNb2RlLmphdmEKQEAgLTE4LDQxICsxOCw2MCBAQAogICogQGF1dGhvciBBbGV4ZXkgQS4gUGV0cmVua28KICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0OwogCiAvKioKLSAqIFRoZSBEaXNwbGF5TW9kZSBjbGFzcyBjb250YWluZXMgdGhlIGJpdCBkZXB0aCwgaGVpZ2h0LCB3aWR0aCBhbmQgCi0gKiByZWZyZXNoIHJhdGUgb2YgYSBHcmFwaGljc0RldmljZS4KKyAqIFRoZSBEaXNwbGF5TW9kZSBjbGFzcyBjb250YWlucyB0aGUgYml0IGRlcHRoLCBoZWlnaHQsIHdpZHRoIGFuZCByZWZyZXNoIHJhdGUKKyAqIG9mIGEgR3JhcGhpY3NEZXZpY2UuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgRGlzcGxheU1vZGUgewotICAgIAotICAgIC8qKiBUaGUgd2lkdGguICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgd2lkdGguCisgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgd2lkdGg7CiAKLSAgICAvKiogVGhlIGhlaWdodC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgaGVpZ2h0LgorICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgaW50IGhlaWdodDsKIAotICAgIC8qKiBUaGUgYml0IGRlcHRoLiAqLworICAgIC8qKgorICAgICAqIFRoZSBiaXQgZGVwdGguCisgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgYml0RGVwdGg7CiAKLSAgICAvKiogVGhlIHJlZnJlc2ggcmF0ZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgcmVmcmVzaCByYXRlLgorICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgaW50IHJlZnJlc2hSYXRlOwogCi0gICAvKiogVGhlIENvbnN0YW50IFZhbHVlIEJJVF9ERVBUSF9NVUxUSSBpbmRpY2F0ZXMgdGhlIGJpdCBkZXB0aCAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBWYWx1ZSBCSVRfREVQVEhfTVVMVEkgaW5kaWNhdGVzIHRoZSBiaXQgZGVwdGgKKyAgICAgKi8KIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJVF9ERVBUSF9NVUxUSSA9IC0xOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBSRUZSRVNIX1JBVEVfVU5LTk9XTiBpbmRpY2F0ZXMgdGhlIHJlZnJlc2ggcmF0ZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgUkVGUkVTSF9SQVRFX1VOS05PV04gaW5kaWNhdGVzIHRoZSByZWZyZXNoIHJhdGUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVGUkVTSF9SQVRFX1VOS05PV04gPSAwOwogCi0gICAvKioKLSAgICAqIENyZWF0ZXMgYSBuZXcgRGlzcGxheU1vZGUgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgotICAgICogIAotICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgZGlzcGxheS4KLSAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgZGlzcGxheS4KLSAgICAqIEBwYXJhbSBiaXREZXB0aCB0aGUgYml0IGRlcHRoIG9mIHRoZSBkaXNwbGF5LgotICAgICogQHBhcmFtIHJlZnJlc2hSYXRlIHRoZSByZWZyZXNoIHJhdGUgb2YgdGhlIGRpc3BsYXkuCi0gICAgKi8KKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IERpc3BsYXlNb2RlIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgZGlzcGxheS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBkaXNwbGF5LgorICAgICAqIEBwYXJhbSBiaXREZXB0aAorICAgICAqICAgICAgICAgICAgdGhlIGJpdCBkZXB0aCBvZiB0aGUgZGlzcGxheS4KKyAgICAgKiBAcGFyYW0gcmVmcmVzaFJhdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSByZWZyZXNoIHJhdGUgb2YgdGhlIGRpc3BsYXkuCisgICAgICovCiAKICAgICBwdWJsaWMgRGlzcGxheU1vZGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYml0RGVwdGgsIGludCByZWZyZXNoUmF0ZSkgewogICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7CkBAIC02MSwxNSArODAsMTQgQEAKICAgICAgICAgdGhpcy5yZWZyZXNoUmF0ZSA9IHJlZnJlc2hSYXRlOwogICAgIH0KIAotCi0gICAvKioKLSAgICAqIENvbXBhcmVzIGlmIHRoaXMgRGlzcGxheU1vZGUgaXMgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCBvYmplY3Qgb3Igbm90LgotICAgICogCi0gICAgKiBAcGFyYW0gZG0gdGhlIE9iamVjdCB0byBiZSBjb21wYXJlZC4KLSAgICAqIAotICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBhIERpc3BsYXlNb2RlIHdpdGggdGhlIHNhbWUKLSAgICAqIGRhdGEgdmFsdWVzIGFzIHRoaXMgRGlzcGxheU1vZGUsIGZhbHNlIG90aGVyd2lzZS4KLSAgICAqLworICAgIC8qKgorICAgICAqIENvbXBhcmVzIGlmIHRoaXMgRGlzcGxheU1vZGUgaXMgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCBvYmplY3Qgb3Igbm90LgorICAgICAqIAorICAgICAqIEBwYXJhbSBkbQorICAgICAqICAgICAgICAgICAgdGhlIE9iamVjdCB0byBiZSBjb21wYXJlZC4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGEgRGlzcGxheU1vZGUgd2l0aCB0aGUgc2FtZSBkYXRhCisgICAgICogICAgICAgICB2YWx1ZXMgYXMgdGhpcyBEaXNwbGF5TW9kZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLwogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBkbSkgewpAQCAtODAsMTMgKzk4LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgKiBDb21wYXJlcyBpZiB0aGlzIERpc3BsYXlNb2RlIGlzIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgRGlzcGxheU1vZGUgb2JqZWN0Ci0gICAgKiBvciBub3QuCi0gICAgKiAKLSAgICAqIEBwYXJhbSBkbSB0aGUgRGlzcGxheU1vZGUgdG8gYmUgY29tcGFyZWQuCi0gICAgKiAKLSAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgYWxsIG9mIHRoZSBkYXRhIHZhbHVlcyBvZiB0aGlzIERpc3BsYXlNb2RlIGFyZSBlcXVhbCAKLSAgICAqIHRvIHRoZSB2YWx1ZXMgb2YgdGhlIHNwZWNpZmllZCBEaXNwbGF5TW9kZSBvYmplY3QsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBDb21wYXJlcyBpZiB0aGlzIERpc3BsYXlNb2RlIGlzIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgRGlzcGxheU1vZGUgb2JqZWN0CisgICAgICogb3Igbm90LgorICAgICAqIAorICAgICAqIEBwYXJhbSBkbQorICAgICAqICAgICAgICAgICAgdGhlIERpc3BsYXlNb2RlIHRvIGJlIGNvbXBhcmVkLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgYWxsIG9mIHRoZSBkYXRhIHZhbHVlcyBvZiB0aGlzIERpc3BsYXlNb2RlIGFyZSBlcXVhbCB0bworICAgICAqICAgICAgICAgdGhlIHZhbHVlcyBvZiB0aGUgc3BlY2lmaWVkIERpc3BsYXlNb2RlIG9iamVjdCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhEaXNwbGF5TW9kZSBkbSkgewogICAgICAgICBpZiAoZG0gPT0gbnVsbCkgewpAQCAtMTA4LDggKzEyNiw4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgYml0IGRlcHRoIG9mIHRoZSBEaXNwbGF5TW9kZSwgcmV0dXJucyBCSVRfREVQVEhfTVVMVEkgdmFsdWUKLSAgICAgKiBpZiBtdWx0aXBsZSBiaXQgZGVwdGhzIGFyZSBzdXBwb3J0ZWQgaW4gdGhpcyBkaXNwbGF5IG1vZGUuCisgICAgICogR2V0cyB0aGUgYml0IGRlcHRoIG9mIHRoZSBEaXNwbGF5TW9kZSwgcmV0dXJucyBCSVRfREVQVEhfTVVMVEkgdmFsdWUgaWYKKyAgICAgKiBtdWx0aXBsZSBiaXQgZGVwdGhzIGFyZSBzdXBwb3J0ZWQgaW4gdGhpcyBkaXNwbGF5IG1vZGUuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgYml0IGRlcHRoIG9mIHRoZSBEaXNwbGF5TW9kZS4KICAgICAgKi8KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9FdmVudC5qYXZhIGIvYXd0L2phdmEvYXd0L0V2ZW50LmphdmEKaW5kZXggZjA3NDI1OC4uMjI2YTYxZiAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L0V2ZW50LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L0V2ZW50LmphdmEKQEAgLTE4LDIyNCArMTgsMjkzIEBACiAgKiBAYXV0aG9yIERtaXRyeSBBLiBEdXJuZXYKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0OwogCiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CiAKIC8qKgotICogVGhlIEV2ZW50IENsYXNzIGlzIG9ic29sZXRlIGFuZCBoYXMgYmVlbiByZXBsYWNlZCBieSBBV1RFdmVudCBjbGFzcy4KKyAqIFRoZSBFdmVudCBjbGFzcyBpcyBvYnNvbGV0ZSBhbmQgaGFzIGJlZW4gcmVwbGFjZWQgYnkgQVdURXZlbnQgY2xhc3MuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgRXZlbnQgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgc2VyaWFsVmVyc2lvblVJRC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDU0ODg5MjI1MDk0MDA1MDQ3MDNMOwotICAgIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgU0hJRlRfTUFTSyBpbmRpY2F0ZXMgdGhhdCB0aGUgU2hpZnQga2V5IGlzIGRvd24gd2hlbiAKLSAgICAgKiB0aGUgZXZlbnQgb2NjdXJyZWQuCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgU0hJRlRfTUFTSyBpbmRpY2F0ZXMgdGhhdCB0aGUgU2hpZnQga2V5IGlzIGRvd24gd2hlbiB0aGUKKyAgICAgKiBldmVudCBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSElGVF9NQVNLID0gMTsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgQ1RSTF9NQVNLIGluZGljYXRlcyB0aGF0IHRoZSBDb250cm9sIGtleSBpcyBkb3duIHdoZW4gCi0gICAgICogdGhlIGV2ZW50IG9jY3VycmVkLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBDVFJMX01BU0sgaW5kaWNhdGVzIHRoYXQgdGhlIENvbnRyb2wga2V5IGlzIGRvd24gd2hlbiB0aGUKKyAgICAgKiBldmVudCBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDVFJMX01BU0sgPSAyOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBNRVRBX01BU0sgaW5kaWNhdGVzIHRoYXQgdGhlIE1ldGEga2V5IGlzIGRvd24gd2hlbiB0Ci0gICAgICogaGUgZXZlbnQgb2NjdXJyZWQgKG9yIHRoZSByaWdodCBtb3VzZSBidXR0b24pLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBNRVRBX01BU0sgaW5kaWNhdGVzIHRoYXQgdGhlIE1ldGEga2V5IGlzIGRvd24gd2hlbiB0IGhlCisgICAgICogZXZlbnQgb2NjdXJyZWQgKG9yIHRoZSByaWdodCBtb3VzZSBidXR0b24pLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEFfTUFTSyA9IDQ7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IEFMVF9NQVNLIGluZGljYXRlcyB0aGF0IHRoZSBBbHQga2V5IGlzIGRvd24gd2hlbiAKLSAgICAgKiB0aGUgZXZlbnQgb2NjdXJyZWQgKG9yIHRoZSBtaWRkbGUgbW91c2UgYnV0dG9uKS4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEFMVF9NQVNLIGluZGljYXRlcyB0aGF0IHRoZSBBbHQga2V5IGlzIGRvd24gd2hlbiB0aGUgZXZlbnQKKyAgICAgKiBvY2N1cnJlZCAob3IgdGhlIG1pZGRsZSBtb3VzZSBidXR0b24pLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMVF9NQVNLID0gODsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgSE9NRSBpbmRpY2F0ZXMgSG9tZSBrZXkuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEhPTUUgaW5kaWNhdGVzIEhvbWUga2V5LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhPTUUgPSAxMDAwOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBFTkQgaW5kaWNhdGVzIEVuZCBrZXkuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEVORCBpbmRpY2F0ZXMgRW5kIGtleS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkQgPSAxMDAxOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBQR1VQIGluZGljYXRlcyBQYWdlIFVwIGtleS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgUEdVUCBpbmRpY2F0ZXMgUGFnZSBVcCBrZXkuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEdVUCA9IDEwMDI7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFBHRE4gaW5kaWNhdGVzIFBhZ2UgRG93biBrZXkuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFBHRE4gaW5kaWNhdGVzIFBhZ2UgRG93biBrZXkuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEdETiA9IDEwMDM7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFVQIGluZGljYXRlcyBVcCBrZXkuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFVQIGluZGljYXRlcyBVcCBrZXkuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVAgPSAxMDA0OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBET1dOIGluZGljYXRlcyBEb3duIGtleS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgRE9XTiBpbmRpY2F0ZXMgRG93biBrZXkuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRE9XTiA9IDEwMDU7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IExFRlQgaW5kaWNhdGVzIExlZnQga2V5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBMRUZUIGluZGljYXRlcyBMZWZ0IGtleS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRUZUID0gMTAwNjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgUklHSFQgaW5kaWNhdGVzIFJpZ2h0IGtleS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgUklHSFQgaW5kaWNhdGVzIFJpZ2h0IGtleS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUdIVCA9IDEwMDc7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IEYxIGluZGljYXRlcyBGMSBrZXkuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEYxIGluZGljYXRlcyBGMSBrZXkuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRjEgPSAxMDA4OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBGMiBpbmRpY2F0ZXMgRjIga2V5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBGMiBpbmRpY2F0ZXMgRjIga2V5LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEYyID0gMTAwOTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgRjMgaW5kaWNhdGVzIEYzIGtleS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgRjMgaW5kaWNhdGVzIEYzIGtleS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGMyA9IDEwMTA7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IEY0IGluZGljYXRlcyBGNCBrZXkuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEY0IGluZGljYXRlcyBGNCBrZXkuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRjQgPSAxMDExOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBGNSBpbmRpY2F0ZXMgRjUga2V5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBGNSBpbmRpY2F0ZXMgRjUga2V5LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEY1ID0gMTAxMjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgRjYgaW5kaWNhdGVzIEY2IGtleS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgRjYgaW5kaWNhdGVzIEY2IGtleS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGNiA9IDEwMTM7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IEY3IGluZGljYXRlcyBGNyBrZXkuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEY3IGluZGljYXRlcyBGNyBrZXkuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRjcgPSAxMDE0OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBGOCBpbmRpY2F0ZXMgRjgga2V5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBGOCBpbmRpY2F0ZXMgRjgga2V5LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEY4ID0gMTAxNTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgRjkgaW5kaWNhdGVzIEY5IGtleS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgRjkgaW5kaWNhdGVzIEY5IGtleS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGOSA9IDEwMTY7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IEYxMCBpbmRpY2F0ZXMgRjEwIGtleS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgRjEwIGluZGljYXRlcyBGMTAga2V5LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEYxMCA9IDEwMTc7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IEYxMSBpbmRpY2F0ZXMgRjExIGtleS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgRjExIGluZGljYXRlcyBGMTEga2V5LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEYxMSA9IDEwMTg7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IEYxMiBpbmRpY2F0ZXMgRjEyIGtleS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgRjEyIGluZGljYXRlcyBGMTIga2V5LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEYxMiA9IDEwMTk7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFBSSU5UX1NDUkVFTiAgaW5kaWNhdGVzIFByaW50IFNjcmVlbiBrZXkuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFBSSU5UX1NDUkVFTiBpbmRpY2F0ZXMgUHJpbnQgU2NyZWVuIGtleS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklOVF9TQ1JFRU4gPSAxMDIwOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBTQ1JPTExfTE9DSyBpbmRpY2F0ZXMgU2Nyb2xsIExvY2sga2V5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBTQ1JPTExfTE9DSyBpbmRpY2F0ZXMgU2Nyb2xsIExvY2sga2V5LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDUk9MTF9MT0NLID0gMTAyMTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgQ0FQU19MT0NLIGluZGljYXRlcyBDYXBzIExvY2sga2V5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBDQVBTX0xPQ0sgaW5kaWNhdGVzIENhcHMgTG9jayBrZXkuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FQU19MT0NLID0gMTAyMjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgTlVNX0xPQ0sgaW5kaWNhdGVzIE51bSBMb2NrIGtleS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgTlVNX0xPQ0sgaW5kaWNhdGVzIE51bSBMb2NrIGtleS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVU1fTE9DSyA9IDEwMjM7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFBBVVNFIGluZGljYXRlcyBQYXVzZSBrZXkuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFBBVVNFIGluZGljYXRlcyBQYXVzZSBrZXkuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFVU0UgPSAxMDI0OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBJTlNFUlQgaW5kaWNhdGVzIEluc2VydCBrZXkuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IElOU0VSVCBpbmRpY2F0ZXMgSW5zZXJ0IGtleS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlNFUlQgPSAxMDI1OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBFTlRFUiBpbmRpY2F0ZXMgRW50ZXIga2V5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBFTlRFUiBpbmRpY2F0ZXMgRW50ZXIga2V5LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVEVSID0gMTA7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IEJBQ0tfU1BBQ0UgaW5kaWNhdGVzIEJhY2sgU3BhY2Uga2V5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBCQUNLX1NQQUNFIGluZGljYXRlcyBCYWNrIFNwYWNlIGtleS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQUNLX1NQQUNFID0gODsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgVEFCIGluZGljYXRlcyBUQWIga2V5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUIgaW5kaWNhdGVzIFRBYiBrZXkuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFCID0gOTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgRVNDQVBFIGluZGljYXRlcyBFc2NhcGUga2V5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBFU0NBUEUgaW5kaWNhdGVzIEVzY2FwZSBrZXkuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVNDQVBFID0gMjc7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IERFTEVURSBpbmRpY2F0ZXMgRGVsZXRlIGtleS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgREVMRVRFIGluZGljYXRlcyBEZWxldGUga2V5LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFTEVURSA9IDEyNzsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgV0lORE9XX0RFU1RST1kgaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIHVzZXIgaGFzIGFza2VkIHRoZQotICAgICAqIHdpbmRvdyBtYW5hZ2VyIHRvIGtpbGwgdGhlIHdpbmRvdy4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgV0lORE9XX0RFU1RST1kgaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIHVzZXIgaGFzIGFza2VkCisgICAgICogdGhlIHdpbmRvdyBtYW5hZ2VyIHRvIGtpbGwgdGhlIHdpbmRvdy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSU5ET1dfREVTVFJPWSA9IDIwMTsKIAotICAgIC8qKiAKKyAgICAvKioKICAgICAgKiBUaGUgQ29uc3RhbnQgV0lORE9XX0VYUE9TRSBpbmRpY2F0ZXMgYW4gZXZlbnQgd2hlbiB0aGUgdXNlciBoYXMgYXNrZWQgdGhlCiAgICAgICogd2luZG93IG1hbmFnZXIgdG8gZXhwb3NlIHRoZSB3aW5kb3cuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lORE9XX0VYUE9TRSA9IDIwMjsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgV0lORE9XX0lDT05JRlkgaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIHVzZXIgaGFzIGFza2VkIHRoZQotICAgICAqIHdpbmRvdyBtYW5hZ2VyIHRvIGluY29uaWZ5IHRoZSB3aW5kb3cuCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFdJTkRPV19JQ09OSUZZIGluZGljYXRlcyBhbiBldmVudCB3aGVuIHRoZSB1c2VyIGhhcyBhc2tlZAorICAgICAqIHRoZSB3aW5kb3cgbWFuYWdlciB0byBpY29uaWZ5IHRoZSB3aW5kb3cuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lORE9XX0lDT05JRlkgPSAyMDM7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFdJTkRPV19ERUlDT05JRlkgaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIHVzZXIgaGFzIGFza2VkIHRoZQotICAgICAqIHdpbmRvdyBtYW5hZ2VyIHRvIGRlaW5jb25pZnkgdGhlIHdpbmRvdy4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFdJTkRPV19ERUlDT05JRlkgaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIHVzZXIgaGFzIGFza2VkCisgICAgICogdGhlIHdpbmRvdyBtYW5hZ2VyIHRvIGRlaWNvbmlmeSB0aGUgd2luZG93LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJTkRPV19ERUlDT05JRlkgPSAyMDQ7CiAKLSAgICAvKiogCisgICAgLyoqCiAgICAgICogVGhlIENvbnN0YW50IFdJTkRPV19NT1ZFRCBpbmRpY2F0ZXMgYW4gZXZlbnQgd2hlbiB0aGUgdXNlciBoYXMgYXNrZWQgdGhlCi0gICAgICogd2luZG93IG1hbmFnZXIgdG8gbW92ZSB0aGUgd2luZG93LiAKKyAgICAgKiB3aW5kb3cgbWFuYWdlciB0byBtb3ZlIHRoZSB3aW5kb3cuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lORE9XX01PVkVEID0gMjA1OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBLRVlfUFJFU1MgaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIHVzZXIgcHJlc3NlcyAKLSAgICAgKiBhIG5vcm1hbCBrZXkuIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBLRVlfUFJFU1MgaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIHVzZXIgcHJlc3NlcyBhIG5vcm1hbAorICAgICAqIGtleS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlfUFJFU1MgPSA0MDE7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IEtFWV9SRUxFQVNFIGluZGljYXRlcyBhbiBldmVudCB3aGVuIHRoZSB1c2VyIHJlbGVhc2VzIAotICAgICAqIGEgbm9ybWFsIGtleS4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgS0VZX1JFTEVBU0UgaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIHVzZXIgcmVsZWFzZXMgYQorICAgICAqIG5vcm1hbCBrZXkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZX1JFTEVBU0UgPSA0MDI7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IEtFWV9BQ1RJT04gaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIHVzZXIgcHJlc3NlZCAKLSAgICAgKiBhIG5vbi1BU0NJSSBhY3Rpb24ga2V5LiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgS0VZX0FDVElPTiBpbmRpY2F0ZXMgYW4gZXZlbnQgd2hlbiB0aGUgdXNlciBwcmVzc2VkIGEKKyAgICAgKiBub24tQVNDSUkgYWN0aW9uIGtleS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlfQUNUSU9OID0gNDAzOwogCiAgICAgLyoqCi0gICAgICogVGhlIENvbnN0YW50IEtFWV9BQ1RJT05fUkVMRUFTRSBpbmRpY2F0ZXMgYW4gZXZlbnQgd2hlbiB0aGUgdXNlciByZWxlYXNlZCAKLSAgICAgKiBhIG5vbi1BU0NJSSBhY3Rpb24ga2V5LiAKKyAgICAgKiBUaGUgQ29uc3RhbnQgS0VZX0FDVElPTl9SRUxFQVNFIGluZGljYXRlcyBhbiBldmVudCB3aGVuIHRoZSB1c2VyIHJlbGVhc2VkCisgICAgICogYSBub24tQVNDSUkgYWN0aW9uIGtleS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlfQUNUSU9OX1JFTEVBU0UgPSA0MDQ7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IE1PVVNFX0RPV04gaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIHVzZXIgaGFzIHByZXNzZWQgCi0gICAgICogdGhlIG1vdXNlIGJ1dHRvbi4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IE1PVVNFX0RPV04gaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIHVzZXIgaGFzIHByZXNzZWQgdGhlCisgICAgICogbW91c2UgYnV0dG9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PVVNFX0RPV04gPSA1MDE7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IE1PVVNFX1VQIGluZGljYXRlcyBhbiBldmVudCB3aGVuIHRoZSB1c2VyIGhhcyByZWxlYXNlZCAKLSAgICAgKiB0aGUgbW91c2UgYnV0dG9uLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgTU9VU0VfVVAgaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIHVzZXIgaGFzIHJlbGVhc2VkIHRoZQorICAgICAqIG1vdXNlIGJ1dHRvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT1VTRV9VUCA9IDUwMjsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgTU9VU0VfTU9WRSBpbmRpY2F0ZXMgYW4gZXZlbnQgd2hlbiB0aGUgdXNlciBoYXMgbW92ZWQKLSAgICAgKiB0aGUgbW91c2Ugd2l0aCBubyBidXR0b24gcHJlc3NlZC4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgTU9VU0VfTU9WRSBpbmRpY2F0ZXMgYW4gZXZlbnQgd2hlbiB0aGUgdXNlciBoYXMgbW92ZWQgdGhlCisgICAgICogbW91c2Ugd2l0aCBubyBidXR0b24gcHJlc3NlZC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT1VTRV9NT1ZFID0gNTAzOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBNT1VTRV9FTlRFUiBpbmRpY2F0ZXMgYW4gZXZlbnQgd2hlbiB0aGUgbW91c2UKLSAgICAgKiBoYXMgZW50ZXJlZCBhIGNvbXBvbmVudC4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgTU9VU0VfRU5URVIgaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIG1vdXNlIGhhcyBlbnRlcmVkIGEKKyAgICAgKiBjb21wb25lbnQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9VU0VfRU5URVIgPSA1MDQ7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IE1PVVNFX0VYSVQgaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIG1vdXNlCi0gICAgICogaGFzIGV4aXRlZCBhIGNvbXBvbmVudC4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IE1PVVNFX0VYSVQgaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIG1vdXNlIGhhcyBleGl0ZWQgYQorICAgICAqIGNvbXBvbmVudC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT1VTRV9FWElUID0gNTA1OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBNT1VTRV9EUkFHIGluZGljYXRlcyBhbiBldmVudCB3aGVuIHRoZSB1c2VyCi0gICAgICogaGFzIG1vdmVkIGEgbW91c2Ugd2l0aCB0aGUgcHJlc3NlZCBidXR0b24uIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBNT1VTRV9EUkFHIGluZGljYXRlcyBhbiBldmVudCB3aGVuIHRoZSB1c2VyIGhhcyBtb3ZlZCBhCisgICAgICogbW91c2Ugd2l0aCB0aGUgcHJlc3NlZCBidXR0b24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9VU0VfRFJBRyA9IDUwNjsKIAotICAgIC8qKiAKKyAgICAvKioKICAgICAgKiBUaGUgQ29uc3RhbnQgU0NST0xMX0xJTkVfVVAgaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIHVzZXIgaGFzCiAgICAgICogYWN0aXZhdGVkIGxpbmUtdXAgYXJlYSBvZiBzY3JvbGxiYXIuCiAgICAgICovCkBAIC0yNDMsMTAxICszMTIsMTM2IEBACiAKICAgICAvKioKICAgICAgKiBUaGUgQ29uc3RhbnQgU0NST0xMX0xJTkVfRE9XTiBpbmRpY2F0ZXMgYW4gZXZlbnQgd2hlbiB0aGUgdXNlciBoYXMKLSAgICAgKiBhY3RpdmF0ZWQgbGluZS1kb3duIGFyZWEgb2Ygc2Nyb2xsYmFyLiAKKyAgICAgKiBhY3RpdmF0ZWQgbGluZS1kb3duIGFyZWEgb2Ygc2Nyb2xsYmFyLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDUk9MTF9MSU5FX0RPV04gPSA2MDI7CiAKICAgICAvKioKICAgICAgKiBUaGUgQ29uc3RhbnQgU0NST0xMX1BBR0VfVVAgaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIHVzZXIgaGFzCi0gICAgICogYWN0aXZhdGVkIHBhZ2UgdXAgYXJlYSBvZiBzY3JvbGxiYXIuIAorICAgICAqIGFjdGl2YXRlZCBwYWdlIHVwIGFyZWEgb2Ygc2Nyb2xsYmFyLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDUk9MTF9QQUdFX1VQID0gNjAzOwogCiAgICAgLyoqCiAgICAgICogVGhlIENvbnN0YW50IFNDUk9MTF9QQUdFX0RPV04gaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIHVzZXIgaGFzCi0gICAgICogYWN0aXZhdGVkIHBhZ2UgZG93biBhcmVhIG9mIHNjcm9sbGJhci4gCisgICAgICogYWN0aXZhdGVkIHBhZ2UgZG93biBhcmVhIG9mIHNjcm9sbGJhci4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ1JPTExfUEFHRV9ET1dOID0gNjA0OwogCiAgICAgLyoqCi0gICAgICogVGhlIENvbnN0YW50IFNDUk9MTF9BQlNPTFVURSBpbmRpY2F0ZXMgYW4gZXZlbnQgd2hlbiB0aGUgdXNlciAKLSAgICAgKiBoYXMgbW92ZWQgdGhlIGJ1YmJsZSBpbiBhIHNjcm9sbCBiYXIuIAorICAgICAqIFRoZSBDb25zdGFudCBTQ1JPTExfQUJTT0xVVEUgaW5kaWNhdGVzIGFuIGV2ZW50IHdoZW4gdGhlIHVzZXIgaGFzIG1vdmVkCisgICAgICogdGhlIGJ1YmJsZSBpbiBhIHNjcm9sbCBiYXIuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NST0xMX0FCU09MVVRFID0gNjA1OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBTQ1JPTExfQkVHSU4gaW5kaWNhdGVzIGEgc2Nyb2xsIGJlZ2luIGV2ZW50LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBTQ1JPTExfQkVHSU4gaW5kaWNhdGVzIGEgc2Nyb2xsIGJlZ2luIGV2ZW50LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDUk9MTF9CRUdJTiA9IDYwNjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgU0NST0xMX0VORCBpbmRpY2F0ZXMgYSBzY3JvbGwgZW5kIGV2ZW50LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBTQ1JPTExfRU5EIGluZGljYXRlcyBhIHNjcm9sbCBlbmQgZXZlbnQuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NST0xMX0VORCA9IDYwNzsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgTElTVF9TRUxFQ1QgaW5kaWNhdGVzIHRoYXQgYW4gaXRlbSBpbiBhIGxpc3QgCi0gICAgICogaGFzIGJlZW4gc2VsZWN0ZWQuCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IExJU1RfU0VMRUNUIGluZGljYXRlcyB0aGF0IGFuIGl0ZW0gaW4gYSBsaXN0IGhhcyBiZWVuCisgICAgICogc2VsZWN0ZWQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTElTVF9TRUxFQ1QgPSA3MDE7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IExJU1RfREVTRUxFQ1QgaW5kaWNhdGVzIHRoYXQgYW4gaXRlbSBpbiBhIGxpc3QgCi0gICAgICogaGFzIGJlZW4gZGVzZWxlY3RlZC4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IExJU1RfREVTRUxFQ1QgaW5kaWNhdGVzIHRoYXQgYW4gaXRlbSBpbiBhIGxpc3QgaGFzIGJlZW4KKyAgICAgKiB1bnNlbGVjdGVkLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJU1RfREVTRUxFQ1QgPSA3MDI7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IEFDVElPTl9FVkVOVCBpbmRpY2F0ZXMgdGhhdCB0aGUgdXNlciB3YW50cyBzb21lIAotICAgICAqIGFjdGlvbiB0byBvY2N1ci4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgQUNUSU9OX0VWRU5UIGluZGljYXRlcyB0aGF0IHRoZSB1c2VyIHdhbnRzIHNvbWUgYWN0aW9uIHRvCisgICAgICogb2NjdXIuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX0VWRU5UID0gMTAwMTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgTE9BRF9GSUxFIGluZGljYXRlcyBhIGZpbGUgbG9hZGluZyBldmVudC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgTE9BRF9GSUxFIGluZGljYXRlcyBhIGZpbGUgbG9hZGluZyBldmVudC4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0FEX0ZJTEUgPSAxMDAyOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBTQVZFX0ZJTEUgaW5kaWNhdGVzIGEgZmlsZSBzYXZpbmcgZXZlbnQuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFNBVkVfRklMRSBpbmRpY2F0ZXMgYSBmaWxlIHNhdmluZyBldmVudC4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQVZFX0ZJTEUgPSAxMDAzOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBHT1RfRk9DVVMgaW5kaWNhdGVzIHRoYXQgYSBjb21wb25lbnQgZ290IHRoZSBmb2N1cy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgR09UX0ZPQ1VTIGluZGljYXRlcyB0aGF0IGEgY29tcG9uZW50IGdvdCB0aGUgZm9jdXMuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR09UX0ZPQ1VTID0gMTAwNDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgTE9TVF9GT0NVUyBpbmRpY2F0ZXMgdGhhdCB0aGUgY29tcG9uZW50IGxvc3QgdGhlIGZvY3VzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBMT1NUX0ZPQ1VTIGluZGljYXRlcyB0aGF0IHRoZSBjb21wb25lbnQgbG9zdCB0aGUgZm9jdXMuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9TVF9GT0NVUyA9IDEwMDU7CiAKLSAgICAvKiogVGhlIHRhcmdldCBpcyB0aGUgY29tcG9uZW50IHdpdGggd2hpY2ggdGhlIGV2ZW50IGlzIGFzc29jaWF0ZWQuICovCisgICAgLyoqCisgICAgICogVGhlIHRhcmdldCBpcyB0aGUgY29tcG9uZW50IHdpdGggd2hpY2ggdGhlIGV2ZW50IGlzIGFzc29jaWF0ZWQuCisgICAgICovCiAgICAgcHVibGljIE9iamVjdCB0YXJnZXQ7CiAKLSAgICAvKiogVGhlIHdoZW4gaXMgdGltZXN0YW1wIHdoZW4gZXZlbnQgaGFzIG9jY3VyZWQuICovCisgICAgLyoqCisgICAgICogVGhlIHdoZW4gaXMgdGltZXN0YW1wIHdoZW4gZXZlbnQgaGFzIG9jY3VyZWQuCisgICAgICovCiAgICAgcHVibGljIGxvbmcgd2hlbjsKIAotICAgIC8qKiBUaGUgaWQgaW5kaWNhdGVzIHRoZSB0eXBlIG9mIHRoZSBldmVudC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgaWQgaW5kaWNhdGVzIHRoZSB0eXBlIG9mIHRoZSBldmVudC4KKyAgICAgKi8KICAgICBwdWJsaWMgaW50IGlkOwogCi0gICAgLyoqIFRoZSB4IGNvb3JkaW5hdGUgb2YgZXZlbnQuICovCisgICAgLyoqCisgICAgICogVGhlIHggY29vcmRpbmF0ZSBvZiBldmVudC4KKyAgICAgKi8KICAgICBwdWJsaWMgaW50IHg7CiAKLSAgICAvKiogVGhlIHkgY29vcmRpbmF0ZSBvZiBldmVudC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgeSBjb29yZGluYXRlIG9mIGV2ZW50LgorICAgICAqLwogICAgIHB1YmxpYyBpbnQgeTsKIAotICAgIC8qKiBUaGUga2V5IGNvZGUgb2Yga2V5IGV2ZW50LiAqLworICAgIC8qKgorICAgICAqIFRoZSBrZXkgY29kZSBvZiBrZXkgZXZlbnQuCisgICAgICovCiAgICAgcHVibGljIGludCBrZXk7CiAKLSAgICAvKiogVGhlIHN0YXRlIG9mIHRoZSBtb2RpZmllciBrZXlzIChnaXZlbiBieSBhIGJpdG1hc2spLiAqLworICAgIC8qKgorICAgICAqIFRoZSBzdGF0ZSBvZiB0aGUgbW9kaWZpZXIga2V5cyAoZ2l2ZW4gYnkgYSBiaXRtYXNrKS4KKyAgICAgKi8KICAgICBwdWJsaWMgaW50IG1vZGlmaWVyczsKIAotICAgIC8qKiBUaGUgY2xpY2sgY291bnQgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgY2xpY2tzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBjbGljayBjb3VudCBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBjbGlja3MuCisgICAgICovCiAgICAgcHVibGljIGludCBjbGlja0NvdW50OwogCi0gICAgLyoqIFRoZSBhcmd1bWVudCBvZiB0aGUgZXZlbnQuICovCisgICAgLyoqCisgICAgICogVGhlIGFyZ3VtZW50IG9mIHRoZSBldmVudC4KKyAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGFyZzsKIAotICAgIC8qKiBUaGUgbmV4dCBldmVudC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgbmV4dCBldmVudC4KKyAgICAgKi8KICAgICBwdWJsaWMgRXZlbnQgZXZ0OwogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCB0YXJnZXQgY29tcG9uZW50LCAKLSAgICAgKiBldmVudCB0eXBlLCBhbmQgYXJndW1lbnQuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCB0YXJnZXQgY29tcG9uZW50LCBldmVudCB0eXBlLAorICAgICAqIGFuZCBhcmd1bWVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSB0YXJnZXQgY29tcG9uZW50LgotICAgICAqIEBwYXJhbSBpZCB0aGUgZXZlbnQgdHlwZS4KLSAgICAgKiBAcGFyYW0gYXJnIHRoZSBhcmd1bWVudC4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0CisgICAgICogICAgICAgICAgICB0aGUgdGFyZ2V0IGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gaWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBldmVudCB0eXBlLgorICAgICAqIEBwYXJhbSBhcmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcmd1bWVudC4KICAgICAgKi8KICAgICBwdWJsaWMgRXZlbnQoT2JqZWN0IHRhcmdldCwgaW50IGlkLCBPYmplY3QgYXJnKSB7CiAgICAgICAgIHRoaXModGFyZ2V0LCAwbCwgaWQsIDAsIDAsIDAsIDAsIGFyZyk7CkBAIC0zNDgsMTMgKzQ1MiwyMCBAQAogICAgICAqIGV2ZW50IHR5cGUsIHggYW5kIHkgY29vcmRpbmF0ZXMsIGtleWJvYXJkIGtleSwgc3RhdGUgb2YgdGhlIG1vZGlmaWVyCiAgICAgICoga2V5cywgYW5kIGFuIGFyZ3VtZW50IHNldCB0byBudWxsLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0YXJnZXQgdGhlIHRhcmdldCBjb21wb25lbnQuCi0gICAgICogQHBhcmFtIHdoZW4gdGhlIHRpbWUgc3RhbXAuCi0gICAgICogQHBhcmFtIGlkIHRoZSBldmVudCB0eXBlLgotICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUuCi0gICAgICogQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZS4KLSAgICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkuCi0gICAgICogQHBhcmFtIG1vZGlmaWVycyB0aGUgbW9kaWZpZXIga2V5cyBzdGF0ZS4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0CisgICAgICogICAgICAgICAgICB0aGUgdGFyZ2V0IGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gd2hlbgorICAgICAqICAgICAgICAgICAgdGhlIHRpbWUgc3RhbXAuCisgICAgICogQHBhcmFtIGlkCisgICAgICogICAgICAgICAgICB0aGUgZXZlbnQgdHlwZS4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUga2V5LgorICAgICAqIEBwYXJhbSBtb2RpZmllcnMKKyAgICAgKiAgICAgICAgICAgIHRoZSBtb2RpZmllciBrZXlzIHN0YXRlLgogICAgICAqLwogICAgIHB1YmxpYyBFdmVudChPYmplY3QgdGFyZ2V0LCBsb25nIHdoZW4sIGludCBpZCwgaW50IHgsIGludCB5LCBpbnQga2V5LCBpbnQgbW9kaWZpZXJzKSB7CiAgICAgICAgIHRoaXModGFyZ2V0LCB3aGVuLCBpZCwgeCwgeSwga2V5LCBtb2RpZmllcnMsIG51bGwpOwpAQCAtMzY1LDE0ICs0NzYsMjIgQEAKICAgICAgKiBldmVudCB0eXBlLCB4IGFuZCB5IGNvb3JkaW5hdGVzLCBrZXlib2FyZCBrZXksIHN0YXRlIG9mIHRoZSBtb2RpZmllcgogICAgICAqIGtleXMsIGFuZCBhbiBhcmd1bWVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSB0YXJnZXQgY29tcG9uZW50LgotICAgICAqIEBwYXJhbSB3aGVuIHRoZSB0aW1lIHN0YW1wLgotICAgICAqIEBwYXJhbSBpZCB0aGUgZXZlbnQgdHlwZS4KLSAgICAgKiBAcGFyYW0geCB0aGUgeCBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUuCi0gICAgICogQHBhcmFtIGtleSB0aGUga2V5LgotICAgICAqIEBwYXJhbSBtb2RpZmllcnMgdGhlIG1vZGlmaWVyIGtleXMgc3RhdGUuCi0gICAgICogQHBhcmFtIGFyZyB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50LgorICAgICAqIEBwYXJhbSB0YXJnZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgY29tcG9uZW50LgorICAgICAqIEBwYXJhbSB3aGVuCisgICAgICogICAgICAgICAgICB0aGUgdGltZSBzdGFtcC4KKyAgICAgKiBAcGFyYW0gaWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBldmVudCB0eXBlLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkuCisgICAgICogQHBhcmFtIG1vZGlmaWVycworICAgICAqICAgICAgICAgICAgdGhlIG1vZGlmaWVyIGtleXMgc3RhdGUuCisgICAgICogQHBhcmFtIGFyZworICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBhcmd1bWVudC4KICAgICAgKi8KICAgICBwdWJsaWMgRXZlbnQoT2JqZWN0IHRhcmdldCwgbG9uZyB3aGVuLCBpbnQgaWQsIGludCB4LCBpbnQgeSwgaW50IGtleSwgaW50IG1vZGlmaWVycywgT2JqZWN0IGFyZykgewogICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsKQEAgLTM5MiwxMSArNTExLDEwIEBACiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgLyogVGhlIGZvcm1hdCBpcyBiYXNlZCBvbiAxLjUgcmVsZWFzZSBiZWhhdmlvciAKLSAgICAgICAgICogd2hpY2ggY2FuIGJlIHJldmVhbGVkIGJ5IHRoZSBmb2xsb3dpbmcgY29kZToKLSAgICAgICAgICogCi0gICAgICAgICAqIEV2ZW50IGUgPSBuZXcgRXZlbnQobmV3IEJ1dHRvbigpLCAwbCwgRXZlbnQuS0VZX1BSRVNTLCAKLSAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAwLCAwLCBFdmVudC5UQUIsIEV2ZW50LlNISUZUX01BU0ssICJhcmciKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIGZvcm1hdCBpcyBiYXNlZCBvbiAxLjUgcmVsZWFzZSBiZWhhdmlvciB3aGljaCBjYW4gYmUgcmV2ZWFsZWQgYnkKKyAgICAgICAgICogdGhlIGZvbGxvd2luZyBjb2RlOiBFdmVudCBlID0gbmV3IEV2ZW50KG5ldyBCdXR0b24oKSwgMGwsCisgICAgICAgICAqIEV2ZW50LktFWV9QUkVTUywgMCwgMCwgRXZlbnQuVEFCLCBFdmVudC5TSElGVF9NQVNLLCAiYXJnIik7CiAgICAgICAgICAqIFN5c3RlbS5vdXQucHJpbnRsbihlKTsKICAgICAgICAgICovCiAKQEAgLTQxMCwxNSArNTI4LDE1IEBACiAgICAgICovCiAgICAgcHJvdGVjdGVkIFN0cmluZyBwYXJhbVN0cmluZygpIHsKICAgICAgICAgcmV0dXJuICJpZD0iICsgaWQgKyAiLHg9IiArIHggKyAiLHk9IiArIHkgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgICAoa2V5ICE9IDAgPyAiLGtleT0iICsga2V5ICArIGdldE1vZGlmaWVyc1N0cmluZygpIDogIiIpICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICIsdGFyZ2V0PSIgKyB0YXJnZXQgKyAvLyROT04tTkxTLTEkCi0gICAgICAgIChhcmcgIT0gbnVsbCA/ICIsYXJnPSIgKyBhcmcgOiAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICAgICAgICAgICAgICAgIChrZXkgIT0gMCA/ICIsa2V5PSIgKyBrZXkgKyBnZXRNb2RpZmllcnNTdHJpbmcoKSA6ICIiKSArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICAgICAgICAgICAgICAgICIsdGFyZ2V0PSIgKyB0YXJnZXQgKyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgKGFyZyAhPSBudWxsID8gIixhcmc9IiArIGFyZyA6ICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAgICAgfQogCiAgICAgLyoqCiAgICAgICogR2V0cyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kaWZpZXJzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGlmaWVycworICAgICAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGlmaWVycy4KICAgICAgKi8KICAgICBwcml2YXRlIFN0cmluZyBnZXRNb2RpZmllcnNTdHJpbmcoKSB7CiAgICAgICAgIFN0cmluZyBzdHJNb2QgPSAiIjsgLy8kTk9OLU5MUy0xJApAQCAtNDM1LDEzICs1NTMsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUcmFuc2xhdGVzIHggYW5kIHkgY29vcmRpbmF0ZXMgb2YgaGlzIGV2ZW50IHRvIHRoZSB4K2R4IGFuZCB4K2R5IAorICAgICAqIFRyYW5zbGF0ZXMgeCBhbmQgeSBjb29yZGluYXRlcyBvZiBoaXMgZXZlbnQgdG8gdGhlIHgrZHggYW5kIHgrZHkKICAgICAgKiBjb29yZGluYXRlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZHggdGhlIGR4IC0gdGhlIGRpc3RhbmNlIGJ5IHdoaWNoIHRoZSBldmVudCdzIHggY29vcmRpbmF0ZQotICAgICAqIGlzIGluY3JlYXNlZCAKLSAgICAgKiBAcGFyYW0gZHkgdGhlIGR5IC0gdGhlIGRpc3RhbmNlIGJ5IHdoaWNoIHRoZSBldmVudCdzIHkgY29vcmRpbmF0ZQotICAgICAqIGlzIGluY3JlYXNlZCAKKyAgICAgKiBAcGFyYW0gZHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBkaXN0YW5jZSBieSB3aGljaCB0aGUgZXZlbnQncyB4IGNvb3JkaW5hdGUgaXMgaW5jcmVhc2VkLgorICAgICAqIEBwYXJhbSBkeQorICAgICAqICAgICAgICAgICAgdGhlIGRpc3RhbmNlIGJ5IHdoaWNoIHRoZSBldmVudCdzIHkgY29vcmRpbmF0ZSBpcyBpbmNyZWFzZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdHJhbnNsYXRlKGludCBkeCwgaW50IGR5KSB7CiAgICAgICAgIHggKz0gZHg7CkBAIC00NzYsNCArNTk0LDMgQEAKICAgICB9CiAKIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L0V2ZW50UXVldWUuamF2YSBiL2F3dC9qYXZhL2F3dC9FdmVudFF1ZXVlLmphdmEKaW5kZXggMzk5NzU0Ni4uMTI2YTU5MyAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L0V2ZW50UXVldWUuamF2YQorKysgYi9hd3QvamF2YS9hd3QvRXZlbnRRdWV1ZS5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIE1pY2hhZWwgRGFuaWxvdiwgUGF2ZWwgRG9sZ292CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dDsKIAogaW1wb3J0IGphdmEuYXd0LmV2ZW50Lkludm9jYXRpb25FdmVudDsKQEAgLTI1LDYwICsyNiw2OSBAQAogaW1wb3J0IGphdmEudXRpbC5FbXB0eVN0YWNrRXhjZXB0aW9uOwogCiAvKioKLSAqIFRoZSBFdmVudFF1ZXVlIGNsYXNzIG1hbmFnZXMgZXZlbnRzLiBJdCBpcyBhIHBsYXRmb3JtLWluZGVwZW5kZW50IGNsYXNzIAotICogdGhhdCBxdWV1ZXMgZXZlbnRzIGJvdGggZnJvbSB0aGUgdW5kZXJseWluZyBwZWVyIGNsYXNzZXMgYW5kIGZyb20gdHJ1c3RlZCAKKyAqIFRoZSBFdmVudFF1ZXVlIGNsYXNzIG1hbmFnZXMgZXZlbnRzLiBJdCBpcyBhIHBsYXRmb3JtLWluZGVwZW5kZW50IGNsYXNzIHRoYXQKKyAqIHF1ZXVlcyBldmVudHMgYm90aCBmcm9tIHRoZSB1bmRlcmx5aW5nIHBlZXIgY2xhc3NlcyBhbmQgZnJvbSB0cnVzdGVkCiAgKiBhcHBsaWNhdGlvbiBjbGFzc2VzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEV2ZW50UXVldWUgewotICAgIAotICAgIC8qKiBUaGUgY29yZSByZWYuICovCi0gICAgcHJpdmF0ZSBmaW5hbCBFdmVudFF1ZXVlQ29yZUF0b21pY1JlZmVyZW5jZSBjb3JlUmVmID0gCi0gICAgICAgICAgICBuZXcgRXZlbnRRdWV1ZUNvcmVBdG9taWNSZWZlcmVuY2UoKTsKLSAgICAKKworICAgIC8qKgorICAgICAqIFRoZSBjb3JlIHJlZi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIEV2ZW50UXVldWVDb3JlQXRvbWljUmVmZXJlbmNlIGNvcmVSZWYgPSBuZXcgRXZlbnRRdWV1ZUNvcmVBdG9taWNSZWZlcmVuY2UoKTsKKwogICAgIC8qKgogICAgICAqIFRoZSBDbGFzcyBFdmVudFF1ZXVlQ29yZUF0b21pY1JlZmVyZW5jZS4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBFdmVudFF1ZXVlQ29yZUF0b21pY1JlZmVyZW5jZSB7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIGNvcmUuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb3JlLgorICAgICAgICAgKi8KICAgICAgICAgcHJpdmF0ZSBFdmVudFF1ZXVlQ29yZSBjb3JlOwogCi0gICAgICAgIC8qc3luY2hyb25pemVkKi8gLyoqCisgICAgICAgIC8qIHN5bmNocm9uaXplZCAqLworICAgICAgICAvKioKICAgICAgICAgICogR2V0cyB0aGUuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBldmVudCBxdWV1ZSBjb3JlCisgICAgICAgICAqIEByZXR1cm4gdGhlIGV2ZW50IHF1ZXVlIGNvcmUuCiAgICAgICAgICAqLwotICAgICAgICBFdmVudFF1ZXVlQ29yZSBnZXQoKSB7IAorICAgICAgICBFdmVudFF1ZXVlQ29yZSBnZXQoKSB7CiAgICAgICAgICAgICByZXR1cm4gY29yZTsKICAgICAgICAgfQogCi0gICAgICAgIC8qc3luY2hyb25pemVkKi8gLyoqCisgICAgICAgIC8qIHN5bmNocm9uaXplZCAqLworICAgICAgICAvKioKICAgICAgICAgICogU2V0cyB0aGUuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gbmV3Q29yZSB0aGUgbmV3IGNvcmUKKyAgICAgICAgICogQHBhcmFtIG5ld0NvcmUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgbmV3IGNvcmUuCiAgICAgICAgICAqLwotICAgICAgICB2b2lkIHNldChFdmVudFF1ZXVlQ29yZSBuZXdDb3JlKSB7IAorICAgICAgICB2b2lkIHNldChFdmVudFF1ZXVlQ29yZSBuZXdDb3JlKSB7CiAgICAgICAgICAgICBjb3JlID0gbmV3Q29yZTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2FsbGluZyB0aHJlYWQgaXMgdGhlIGN1cnJlbnQgCi0gICAgICogQVdUIEV2ZW50UXVldWUncyBkaXNwYXRjaCB0aHJlYWQuIAorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2FsbGluZyB0aHJlYWQgaXMgdGhlIGN1cnJlbnQgQVdUIEV2ZW50UXVldWUncworICAgICAqIGRpc3BhdGNoIHRocmVhZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBjYWxsaW5nIHRocmVhZCBpcyB0aGUgY3VycmVudCAKLSAgICAgKiBBV1QgRXZlbnRRdWV1ZSdzIGRpc3BhdGNoIHRocmVhZDsgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIGNhbGxpbmcgdGhyZWFkIGlzIHRoZSBjdXJyZW50IEFXVCBFdmVudFF1ZXVlJ3MKKyAgICAgKiAgICAgICAgIGRpc3BhdGNoIHRocmVhZDsgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Rpc3BhdGNoVGhyZWFkKCkgewogICAgICAgICByZXR1cm4gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSBpbnN0YW5jZW9mIEV2ZW50RGlzcGF0Y2hUaHJlYWQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUG9zdHMgYW4gSW52b2NhdGlvbkV2ZW50IHdoaWNoIGV4ZWN1dGVzIHRoZSBydW4oKSBtZXRob2Qgb24gYSBSdW5uYWJsZSAKKyAgICAgKiBQb3N0cyBhbiBJbnZvY2F0aW9uRXZlbnQgd2hpY2ggZXhlY3V0ZXMgdGhlIHJ1bigpIG1ldGhvZCBvbiBhIFJ1bm5hYmxlCiAgICAgICogd2hlbiBkaXNwYXRjaGVkIGJ5IHRoZSBBV1QgZXZlbnQgZGlzcGF0Y2hlciB0aHJlYWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHJ1bm5hYmxlIHRoZSBSdW5uYWJsZSB3aG9zZSBydW4gbWV0aG9kIHNob3VsZCBiZSBleGVjdXRlZCAKLSAgICAgKiBzeW5jaHJvbm91c2x5IG9uIHRoZSBFdmVudFF1ZXVlLgorICAgICAqIEBwYXJhbSBydW5uYWJsZQorICAgICAqICAgICAgICAgICAgdGhlIFJ1bm5hYmxlIHdob3NlIHJ1biBtZXRob2Qgc2hvdWxkIGJlIGV4ZWN1dGVkIHN5bmNocm9ub3VzbHkKKyAgICAgKiAgICAgICAgICAgIG9uIHRoZSBFdmVudFF1ZXVlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbnZva2VMYXRlcihSdW5uYWJsZSBydW5uYWJsZSkgewogICAgICAgICBUb29sa2l0IHRvb2xraXQgPSBUb29sa2l0LmdldERlZmF1bHRUb29sa2l0KCk7CkBAIC04NywyOSArOTcsMjggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQb3N0cyBhbiBJbnZvY2F0aW9uRXZlbnQgd2hpY2ggZXhlY3V0ZXMgdGhlIHJ1bigpIG1ldGhvZCBvbiBhIFJ1bm5hYmxlIAotICAgICAqIHdoZW4gZGlzcGF0Y2hlZCBieSB0aGUgQVdUIGV2ZW50IGRpc3BhdGNoZXIgdGhyZWFkIGFuZCB0aGUgCi0gICAgICogbm90aWZ5QWxsIG1ldGhvZCBpcyBjYWxsZWQgb24gaXQgaW1tZWRpYXRlbHkgYWZ0ZXIgcnVuIHJldHVybnMuCisgICAgICogUG9zdHMgYW4gSW52b2NhdGlvbkV2ZW50IHdoaWNoIGV4ZWN1dGVzIHRoZSBydW4oKSBtZXRob2Qgb24gYSBSdW5uYWJsZQorICAgICAqIHdoZW4gZGlzcGF0Y2hlZCBieSB0aGUgQVdUIGV2ZW50IGRpc3BhdGNoZXIgdGhyZWFkIGFuZCB0aGUgbm90aWZ5QWxsCisgICAgICogbWV0aG9kIGlzIGNhbGxlZCBvbiBpdCBpbW1lZGlhdGVseSBhZnRlciBydW4gcmV0dXJucy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcnVubmFibGUgdGhlIFJ1bm5hYmxlIHdob3NlIHJ1biBtZXRob2Qgc2hvdWxkIGJlIGV4ZWN1dGVkIAotICAgICAqIHN5bmNocm9ub3VzbHkgb24gdGhlIEV2ZW50UXVldWUuCi0gICAgICogCi0gICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiBhbm90aGVyIHRocmVhZCBoYXMgaW50ZXJydXB0ZWQgCi0gICAgICogdGhpcyB0aHJlYWQuCi0gICAgICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGlmIGEgdGhyb3dhYmxlIGlzIHRocm93biAKLSAgICAgKiB3aGVuIHJ1bm5pbmcgdGhlIHJ1bm5hYmxlLiAKKyAgICAgKiBAcGFyYW0gcnVubmFibGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBSdW5uYWJsZSB3aG9zZSBydW4gbWV0aG9kIHNob3VsZCBiZSBleGVjdXRlZCBzeW5jaHJvbm91c2x5CisgICAgICogICAgICAgICAgICBvbiB0aGUgRXZlbnRRdWV1ZS4KKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW5vdGhlciB0aHJlYWQgaGFzIGludGVycnVwdGVkIHRoaXMgdGhyZWFkLgorICAgICAqIEB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHJ1bm5pbmcgdGhlIHJ1bm5hYmxlLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbnZva2VBbmRXYWl0KFJ1bm5hYmxlIHJ1bm5hYmxlKQotICAgICAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW52b2tlQW5kV2FpdChSdW5uYWJsZSBydW5uYWJsZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7CiAKICAgICAgICAgaWYgKGlzRGlzcGF0Y2hUaHJlYWQoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7CiAgICAgICAgIH0KIAogICAgICAgICBmaW5hbCBUb29sa2l0IHRvb2xraXQgPSBUb29sa2l0LmdldERlZmF1bHRUb29sa2l0KCk7Ci0gICAgICAgIGZpbmFsIE9iamVjdCBub3RpZmllciA9IG5ldyBPYmplY3QoKTsgIC8vJE5PTi1MT0NLLTEkCi0gICAgICAgIEludm9jYXRpb25FdmVudCBldmVudCA9IG5ldyBJbnZvY2F0aW9uRXZlbnQoCi0gICAgICAgICAgICAgICAgdG9vbGtpdCwgcnVubmFibGUsIG5vdGlmaWVyLCB0cnVlKTsKKyAgICAgICAgZmluYWwgT2JqZWN0IG5vdGlmaWVyID0gbmV3IE9iamVjdCgpOyAvLyAkTk9OLUxPQ0stMSQKKyAgICAgICAgSW52b2NhdGlvbkV2ZW50IGV2ZW50ID0gbmV3IEludm9jYXRpb25FdmVudCh0b29sa2l0LCBydW5uYWJsZSwgbm90aWZpZXIsIHRydWUpOwogCiAgICAgICAgIHN5bmNocm9uaXplZCAobm90aWZpZXIpIHsKICAgICAgICAgICAgIHRvb2xraXQuZ2V0U3lzdGVtRXZlbnRRdWV1ZUltcGwoKS5wb3N0RXZlbnQoZXZlbnQpOwpAQCAtMTI2LDcgKzEzNSw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgc3lzdGVtIGV2ZW50IHF1ZXVlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN5c3RlbSBldmVudCBxdWV1ZQorICAgICAqIEByZXR1cm4gdGhlIHN5c3RlbSBldmVudCBxdWV1ZS4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBFdmVudFF1ZXVlIGdldFN5c3RlbUV2ZW50UXVldWUoKSB7CiAgICAgICAgIFRocmVhZCB0aCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7CkBAIC0xMzUsNDggKzE0NCw0NSBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KLSAgICAKKwogICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1vc3QgcmVjZW50IGV2ZW50J3MgdGltZXN0YW1wLgotICAgICAqIFRoaXMgZXZlbnQgd2FzIGRpc3BhdGNoZWQgZnJvbSB0aGUgRXZlbnRRdWV1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIAotICAgICAqIGNhbGxpbmcgdGhyZWFkLgorICAgICAqIEdldHMgdGhlIG1vc3QgcmVjZW50IGV2ZW50J3MgdGltZXN0YW1wLiBUaGlzIGV2ZW50IHdhcyBkaXNwYXRjaGVkIGZyb20KKyAgICAgKiB0aGUgRXZlbnRRdWV1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNhbGxpbmcgdGhyZWFkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBFdmVudCB0byBiZSBkaXNwYXRjaGVkLCAKLSAgICAgKiBvciBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSBpZiB0aGlzIG1ldGhvZCBpcyBpbnZva2VkIGZyb20gCi0gICAgICogYSB0aHJlYWQgb3RoZXIgdGhhbiBhbiBldmVudC1kaXNwYXRjaGluZyB0aHJlYWQuCisgICAgICogQHJldHVybiB0aGUgdGltZXN0YW1wIG9mIHRoZSBsYXN0IEV2ZW50IHRvIGJlIGRpc3BhdGNoZWQsIG9yCisgICAgICogICAgICAgICBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSBpZiB0aGlzIG1ldGhvZCBpcyBpbnZva2VkIGZyb20gYQorICAgICAqICAgICAgICAgdGhyZWFkIG90aGVyIHRoYW4gYW4gZXZlbnQtZGlzcGF0Y2hpbmcgdGhyZWFkLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBnZXRNb3N0UmVjZW50RXZlbnRUaW1lKCkgewogICAgICAgICBFdmVudFF1ZXVlIGVxID0gZ2V0U3lzdGVtRXZlbnRRdWV1ZSgpOwotICAgICAgICByZXR1cm4gKGVxICE9IG51bGwpID8gCi0gICAgICAgICAgICAgICAgZXEuZ2V0TW9zdFJlY2VudEV2ZW50VGltZUltcGwoKSA6IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICByZXR1cm4gKGVxICE9IG51bGwpID8gZXEuZ2V0TW9zdFJlY2VudEV2ZW50VGltZUltcGwoKSA6IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG1vc3QgcmVjZW50IGV2ZW50IHRpbWUgaW1wbC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtb3N0IHJlY2VudCBldmVudCB0aW1lIGltcGwKKyAgICAgKiBAcmV0dXJuIHRoZSBtb3N0IHJlY2VudCBldmVudCB0aW1lIGltcGwuCiAgICAgICovCiAgICAgcHJpdmF0ZSBsb25nIGdldE1vc3RSZWNlbnRFdmVudFRpbWVJbXBsKCkgewogICAgICAgICByZXR1cm4gZ2V0Q29yZSgpLmdldE1vc3RSZWNlbnRFdmVudFRpbWUoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0aGUgY3VycmVudGx5IGRpc3BhdGNoZWQgZXZlbnQgYnkgdGhlIEV2ZW50UXVldWUgCi0gICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSBjYWxsaW5nIHRocmVhZC4KKyAgICAgKiBSZXR1cm5zIHRoZSB0aGUgY3VycmVudGx5IGRpc3BhdGNoZWQgZXZlbnQgYnkgdGhlIEV2ZW50UXVldWUgYXNzb2NpYXRlZAorICAgICAqIHdpdGggdGhlIGNhbGxpbmcgdGhyZWFkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnRseSBkaXNwYXRjaGVkIGV2ZW50IG9yIG51bGwgaWYgdGhpcyBtZXRob2QgCi0gICAgICogaXMgaW52b2tlZCBmcm9tIGEgdGhyZWFkIG90aGVyIHRoYW4gYW4gZXZlbnQtZGlzcGF0Y2hpbmcgdGhyZWFkLgorICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnRseSBkaXNwYXRjaGVkIGV2ZW50IG9yIG51bGwgaWYgdGhpcyBtZXRob2QgaXMgaW52b2tlZAorICAgICAqICAgICAgICAgZnJvbSBhIHRocmVhZCBvdGhlciB0aGFuIGFuIGV2ZW50LWRpc3BhdGNoaW5nIHRocmVhZC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEFXVEV2ZW50IGdldEN1cnJlbnRFdmVudCgpIHsKICAgICAgICAgRXZlbnRRdWV1ZSBlcSA9IGdldFN5c3RlbUV2ZW50UXVldWUoKTsKLSAgICAgICAgcmV0dXJuIChlcSAhPSBudWxsKSA/IAotICAgICAgICAgICAgICAgIGVxLmdldEN1cnJlbnRFdmVudEltcGwoKSA6IG51bGw7CisgICAgICAgIHJldHVybiAoZXEgIT0gbnVsbCkgPyBlcS5nZXRDdXJyZW50RXZlbnRJbXBsKCkgOiBudWxsOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGN1cnJlbnQgZXZlbnQgaW1wbC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGV2ZW50IGltcGwKKyAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGV2ZW50IGltcGwuCiAgICAgICovCiAgICAgcHJpdmF0ZSBBV1RFdmVudCBnZXRDdXJyZW50RXZlbnRJbXBsKCkgewogICAgICAgICByZXR1cm4gZ2V0Q29yZSgpLmdldEN1cnJlbnRFdmVudCgpOwpAQCAtMTkyLDcgKzE5OCw4IEBACiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGV2ZW50IHF1ZXVlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0IHRoZSB0CisgICAgICogQHBhcmFtIHQKKyAgICAgKiAgICAgICAgICAgIHRoZSB0LgogICAgICAqLwogICAgIEV2ZW50UXVldWUoVG9vbGtpdCB0KSB7CiAgICAgICAgIHNldENvcmUobmV3IEV2ZW50UXVldWVDb3JlKHRoaXMsIHQpKTsKQEAgLTIwMSw3ICsyMDgsOCBAQAogICAgIC8qKgogICAgICAqIFBvc3RzIGEgZXZlbnQgdG8gdGhlIEV2ZW50UXVldWUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGV2ZW50IEFXVEV2ZW50LgorICAgICAqIEBwYXJhbSBldmVudAorICAgICAqICAgICAgICAgICAgQVdURXZlbnQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcG9zdEV2ZW50KEFXVEV2ZW50IGV2ZW50KSB7CiAgICAgICAgIGV2ZW50LmlzUG9zdGVkID0gdHJ1ZTsKQEAgLTIwOSwyOSArMjE3LDI4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBldmVudCBmcm9tIHRoZSBFdmVudFF1ZXVlIGFuZCByZW1vdmVzIGl0IGZyb20gdGhpcyBxdWV1ZS4gCi0gICAgICogIAotICAgICAqIEByZXR1cm4gdGhlIG5leHQgQVdURXZlbnQuCisgICAgICogUmV0dXJucyBhbiBldmVudCBmcm9tIHRoZSBFdmVudFF1ZXVlIGFuZCByZW1vdmVzIGl0IGZyb20gdGhpcyBxdWV1ZS4KICAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlzIHRocm93biBpZiBhbm90aGVyIHRocmVhZCAKLSAgICAgKiBpbnRlcnJ1cHRzIHRoaXMgdGhyZWFkLgorICAgICAqIEByZXR1cm4gdGhlIG5leHQgQVdURXZlbnQuCisgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlzIHRocm93biBpZiBhbm90aGVyIHRocmVhZCBpbnRlcnJ1cHRzIHRoaXMgdGhyZWFkLgogICAgICAqLwogICAgIHB1YmxpYyBBV1RFdmVudCBnZXROZXh0RXZlbnQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gZ2V0Q29yZSgpLmdldE5leHRFdmVudCgpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG5leHQgZXZlbnQgbm8gd2FpdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGV2ZW50IG5vIHdhaXQKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGV2ZW50IG5vIHdhaXQuCiAgICAgICovCiAgICAgQVdURXZlbnQgZ2V0TmV4dEV2ZW50Tm9XYWl0KCkgewogICAgICAgICByZXR1cm4gZ2V0Q29yZSgpLmdldE5leHRFdmVudE5vV2FpdCgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpcnN0IGV2ZW50IG9mIHRoZSBFdmVudFF1ZXVlICh3aXRob3V0IHJlbW92aW5nIGl0IAotICAgICAqIGZyb20gdGhlIHF1ZXVlKS4KKyAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBldmVudCBvZiB0aGUgRXZlbnRRdWV1ZSAod2l0aG91dCByZW1vdmluZyBpdCBmcm9tIHRoZQorICAgICAqIHF1ZXVlKS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSB0aGUgZmlyc3QgQVdUIGV2ZW50IG9mIHRoZSBFdmVudFF1ZXVlLgogICAgICAqLwpAQCAtMjQwLDExICsyNDcsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBldmVudCBvZiB0aGUgRXZlbnRRdWV1ZSB3aXRoIHRoZSBzcGVjaWZpZWQgSUQKLSAgICAgKiAod2l0aG91dCByZW1vdmluZyBpdCBmcm9tIHRoZSBxdWV1ZSkuCisgICAgICogUmV0dXJucyB0aGUgZmlyc3QgZXZlbnQgb2YgdGhlIEV2ZW50UXVldWUgd2l0aCB0aGUgc3BlY2lmaWVkIElEICh3aXRob3V0CisgICAgICogcmVtb3ZpbmcgaXQgZnJvbSB0aGUgcXVldWUpLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpZCB0aGUgdHlwZSBJRCBvZiBldmVudC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaWQKKyAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIElEIG9mIGV2ZW50LgogICAgICAqIEByZXR1cm4gdGhlIGZpcnN0IGV2ZW50IG9mIHRoZSBFdmVudFF1ZXVlIHdpdGggdGhlIHNwZWNpZmllZCBJRC4KICAgICAgKi8KICAgICBwdWJsaWMgQVdURXZlbnQgcGVla0V2ZW50KGludCBpZCkgewpAQCAtMjUyLDIxICsyNTksMjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXBsYWNlcyB0aGUgZXhpc3RpbmcgRXZlbnRRdWV1ZSB3aXRoIHRoZSBzcGVjaWZpZWQgRXZlbnRRdWV1ZS4gCi0gICAgICogQW55IHBlbmRpbmcgZXZlbnRzIGFyZSB0cmFuc2ZlcnJlZCB0byB0aGUgbmV3IEV2ZW50UXVldWUuIAorICAgICAqIFJlcGxhY2VzIHRoZSBleGlzdGluZyBFdmVudFF1ZXVlIHdpdGggdGhlIHNwZWNpZmllZCBFdmVudFF1ZXVlLiBBbnkKKyAgICAgKiBwZW5kaW5nIGV2ZW50cyBhcmUgdHJhbnNmZXJyZWQgdG8gdGhlIG5ldyBFdmVudFF1ZXVlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBuZXdFdmVudFF1ZXVlIHRoZSBuZXcgZXZlbnQgcXVldWUuCisgICAgICogQHBhcmFtIG5ld0V2ZW50UXVldWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgZXZlbnQgcXVldWUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcHVzaChFdmVudFF1ZXVlIG5ld0V2ZW50UXVldWUpIHsKICAgICAgICAgZ2V0Q29yZSgpLnB1c2gobmV3RXZlbnRRdWV1ZSk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCi0gICAgICogU3RvcHMgZGlzcGF0Y2hpbmcgZXZlbnRzIHVzaW5nIHRoaXMgRXZlbnRRdWV1ZS4gCi0gICAgICogQW55IHBlbmRpbmcgZXZlbnRzIGFyZSB0cmFuc2ZlcnJlZCB0byB0aGUgcHJldmlvdXMgRXZlbnRRdWV1ZS4KKyAgICAgKiBTdG9wcyBkaXNwYXRjaGluZyBldmVudHMgdXNpbmcgdGhpcyBFdmVudFF1ZXVlLiBBbnkgcGVuZGluZyBldmVudHMgYXJlCisgICAgICogdHJhbnNmZXJyZWQgdG8gdGhlIHByZXZpb3VzIEV2ZW50UXVldWUuCiAgICAgICogCi0gICAgICogQHRocm93cyBFbXB0eVN0YWNrRXhjZXB0aW9uIGlzIHRocm93biBpZiBubyBwcmV2aW91cyBwdXNoIAotICAgICAqIHdhcyBtYWRlIG9uIHRoaXMgRXZlbnRRdWV1ZS4KKyAgICAgKiBAdGhyb3dzIEVtcHR5U3RhY2tFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpcyB0aHJvd24gaWYgbm8gcHJldmlvdXMgcHVzaCB3YXMgbWFkZSBvbiB0aGlzIEV2ZW50UXVldWUuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgcG9wKCkgdGhyb3dzIEVtcHR5U3RhY2tFeGNlcHRpb24gewogICAgICAgICBnZXRDb3JlKCkucG9wKCk7CkBAIC0yNzUsNyArMjgzLDggQEAKICAgICAvKioKICAgICAgKiBEaXNwYXRjaGVzIHRoZSBzcGVjaWZpZWQgZXZlbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGV2ZW50IHRoZSBBV1RFdmVudC4KKyAgICAgKiBAcGFyYW0gZXZlbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBBV1RFdmVudC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBkaXNwYXRjaEV2ZW50KEFXVEV2ZW50IGV2ZW50KSB7CiAgICAgICAgIGdldENvcmUoKS5kaXNwYXRjaEV2ZW50SW1wbChldmVudCk7CkBAIC0yODQsNyArMjkzLDcgQEAKICAgICAvKioKICAgICAgKiBDaGVja3MgaWYgdGhlIHF1ZXVlIGlzIGVtcHR5LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgaXMgZW1wdHkKKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIGVtcHR5LgogICAgICAqLwogICAgIGJvb2xlYW4gaXNFbXB0eSgpIHsKICAgICAgICAgcmV0dXJuIGdldENvcmUoKS5pc0VtcHR5KCk7CkBAIC0yOTMsMTYgKzMwMiwxNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGNvcmUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29yZQorICAgICAqIEByZXR1cm4gdGhlIGNvcmUuCiAgICAgICovCiAgICAgRXZlbnRRdWV1ZUNvcmUgZ2V0Q29yZSgpIHsKICAgICAgICAgcmV0dXJuIGNvcmVSZWYuZ2V0KCk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgY29yZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmV3Q29yZSB0aGUgbmV3IGNvcmUKKyAgICAgKiBAcGFyYW0gbmV3Q29yZQorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBjb3JlLgogICAgICAqLwogICAgIHZvaWQgc2V0Q29yZShFdmVudFF1ZXVlQ29yZSBuZXdDb3JlKSB7CiAgICAgICAgIGNvcmVSZWYuc2V0KChuZXdDb3JlICE9IG51bGwpID8gbmV3Q29yZSA6IG5ldyBFdmVudFF1ZXVlQ29yZSh0aGlzKSk7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvRm9udC5qYXZhIGIvYXd0L2phdmEvYXd0L0ZvbnQuamF2YQppbmRleCAxMzlhZTY4Li40ZWQ5MzQzIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvRm9udC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9Gb250LmphdmEKQEAgLTQ2LDEzMCArNDYsMTY1IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5nbC5mb250LkZvbnRNZXRyaWNzSW1wbDsKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmdsLmZvbnQuTGluZU1ldHJpY3NJbXBsOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTm90SW1wbGVtZW50ZWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lm1pc2MuSGFzaENvZGU7CiAKLQogLyoqCi0gKiBUaGUgRm9udCBjbGFzcyByZXByZXNlbnRzIGZvbnRzIGZvciByZW5kZXJpbmcgdGV4dC4gCi0gKiBUaGlzIGNsYXNzIGFsbG93IHRvIG1hcCBjaGFyYWN0ZXJzIHRvIGdseXBocy4KLSAqIDxwPiAKLSAqIEEgZ2x5cGggaXMgYSBzaGFwZSB1c2VkIHRvIHJlbmRlciBhIGNoYXJhY3RlciBvciBhIHNlcXVlbmNlIG9mIAotICogY2hhcmFjdGVycy4gRm9yIGV4YW1wbGUgb25lIGNoYXJhY3RlciBvZiBMYXRpbiB3cml0aW5nIHN5c3RlbSAKLSAqIHJlcHJlc2VudGVkIGJ5IG9uZSBnbHl0aCwgYnV0IGluIGNvbXBsZXggd3JpdGluZyBzeXN0ZW0gc3VjaCBhcyAKLSAqIFNvdXRoIGFuZCBTb3V0aC1FYXN0IEFzaWFuIHRoZXJlIGlzIG1vcmUgY29tcGxpY2F0ZWQgY29ycmVzcG9uZGVuY2UgCi0gKiBiZXR3ZWVuIGNoYXJhY3RlcnMgYW5kIGdseXBocy4KKyAqIFRoZSBGb250IGNsYXNzIHJlcHJlc2VudHMgZm9udHMgZm9yIHJlbmRlcmluZyB0ZXh0LiBUaGlzIGNsYXNzIGFsbG93IHRvIG1hcAorICogY2hhcmFjdGVycyB0byBnbHlwaHMuCiAgKiA8cD4KLSAqIFRoZSBGb250IG9iamVjdCBpcyBpZGVudGlmaWVkIGJ5IHR3byB0eXBlcyBvZiBuYW1lcy4gVGhlIGxvZ2ljYWwgZm9udCBuYW1lIAotICogaXMgdGhlIG5hbWUgdGhhdCBpcyB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgZm9udC4gVGhlIGZvbnQgbmFtZQotICogaXMgdGhlIG5hbWUgb2YgYSBwYXJ0aWN1bGFyIGZvbnQgZmFjZSAoZm9yIGV4YW1wbGUsIEFyaWFsIEJvbGQpLiAKLSAqIFRoZSBmYW1pbHkgbmFtZSBpcyB0aGUgZm9udCdzIGZhbWlseSBuYW1lIHRoYXQgc3BlY2lmaWVzIAotICogdGhlIHR5cG9ncmFwaGljIGRlc2lnbiBhY3Jvc3Mgc2V2ZXJhbCBmYWNlcyAoZm9yIGV4YW1wbGUsIEFyaWFsKS4gSW4gCi0gKiBhbGwgdGhlIEZvbnQgaXMgaWRlbnRpZmllZCBieSB0aHJlZSBhdHRyaWJ1dGVzOiB0aGUgZmFtaWx5IG5hbWUsIAotICogdGhlIHN0eWxlIChzdWNoIGFzIGJvbGQgb3IgaXRhbGljKSwgYW5kIHRoZSBzaXplLgorICogQSBnbHlwaCBpcyBhIHNoYXBlIHVzZWQgdG8gcmVuZGVyIGEgY2hhcmFjdGVyIG9yIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycy4KKyAqIEZvciBleGFtcGxlIG9uZSBjaGFyYWN0ZXIgb2YgTGF0aW4gd3JpdGluZyBzeXN0ZW0gcmVwcmVzZW50ZWQgYnkgb25lIGdseXBoLAorICogYnV0IGluIGNvbXBsZXggd3JpdGluZyBzeXN0ZW0gc3VjaCBhcyBTb3V0aCBhbmQgU291dGgtRWFzdCBBc2lhbiB0aGVyZSBpcworICogbW9yZSBjb21wbGljYXRlZCBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIGNoYXJhY3RlcnMgYW5kIGdseXBocy4KKyAqIDxwPgorICogVGhlIEZvbnQgb2JqZWN0IGlzIGlkZW50aWZpZWQgYnkgdHdvIHR5cGVzIG9mIG5hbWVzLiBUaGUgbG9naWNhbCBmb250IG5hbWUgaXMKKyAqIHRoZSBuYW1lIHRoYXQgaXMgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIGZvbnQuIFRoZSBmb250IG5hbWUgaXMgdGhlIG5hbWUgb2YgYQorICogcGFydGljdWxhciBmb250IGZhY2UgKGZvciBleGFtcGxlLCBBcmlhbCBCb2xkKS4gVGhlIGZhbWlseSBuYW1lIGlzIHRoZSBmb250J3MKKyAqIGZhbWlseSBuYW1lIHRoYXQgc3BlY2lmaWVzIHRoZSB0eXBvZ3JhcGhpYyBkZXNpZ24gYWNyb3NzIHNldmVyYWwgZmFjZXMgKGZvcgorICogZXhhbXBsZSwgQXJpYWwpLiBJbiBhbGwgdGhlIEZvbnQgaXMgaWRlbnRpZmllZCBieSB0aHJlZSBhdHRyaWJ1dGVzOiB0aGUKKyAqIGZhbWlseSBuYW1lLCB0aGUgc3R5bGUgKHN1Y2ggYXMgYm9sZCBvciBpdGFsaWMpLCBhbmQgdGhlIHNpemUuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgRm9udCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQyMDYwMjEzMTE1OTE0NTkyMTNMOwogCiAgICAgLy8gSWRlbnRpdHkgVHJhbnNmb3JtIGF0dHJpYnV0ZQotICAgIC8qKiBUaGUgQ29uc3RhbnQgSURFTlRJVFlfVFJBTlNGT1JNLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBJREVOVElUWV9UUkFOU0ZPUk0uCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNmb3JtQXR0cmlidXRlIElERU5USVRZX1RSQU5TRk9STSA9IG5ldyBUcmFuc2Zvcm1BdHRyaWJ1dGUoCiAgICAgICAgICAgICBuZXcgQWZmaW5lVHJhbnNmb3JtKCkpOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBQTEFJTiBpbmRpY2F0ZXMgZm9udCdzIHBsYWluIHN0eWxlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBQTEFJTiBpbmRpY2F0ZXMgZm9udCdzIHBsYWluIHN0eWxlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQUlOID0gMDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgQk9MRCBpbmRpY2F0ZXMgZm9udCdzIGJvbGQgc3R5bGUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEJPTEQgaW5kaWNhdGVzIGZvbnQncyBib2xkIHN0eWxlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJPTEQgPSAxOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBJVEFMSUMgaW5kaWNhdGVzIGZvbnQncyBpdGFsaWMgc3R5bGUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IElUQUxJQyBpbmRpY2F0ZXMgZm9udCdzIGl0YWxpYyBzdHlsZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJVEFMSUMgPSAyOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBST01BTl9CQVNFTElORSBpbmRpY2F0ZWQgcm9tYW4gYmFzZWxpbmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFJPTUFOX0JBU0VMSU5FIGluZGljYXRlZCByb21hbiBiYXNlbGluZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBST01BTl9CQVNFTElORSA9IDA7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IENFTlRFUl9CQVNFTElORSBpbmRpY2F0ZXMgY2VudGVyIGJhc2VsaW5lLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBDRU5URVJfQkFTRUxJTkUgaW5kaWNhdGVzIGNlbnRlciBiYXNlbGluZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDRU5URVJfQkFTRUxJTkUgPSAxOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBIQU5HSU5HX0JBU0VMSU5FIGluZGljYXRlcyBoYW5naW5nIGJhc2VsaW5lLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBIQU5HSU5HX0JBU0VMSU5FIGluZGljYXRlcyBoYW5naW5nIGJhc2VsaW5lLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhBTkdJTkdfQkFTRUxJTkUgPSAyOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUUlVFVFlQRV9GT05UIGluZGljYXRlcyBhIGZvbnQgcmVzb3VyY2Ugb2YgCi0gICAgICogdHlwZSBUUlVFVFlQRS4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRSVUVUWVBFX0ZPTlQgaW5kaWNhdGVzIGEgZm9udCByZXNvdXJjZSBvZiB0eXBlIFRSVUVUWVBFLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSVUVUWVBFX0ZPTlQgPSAwOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUWVBFMV9GT05UIGluZGljYXRlcyBhIGZvbnQgcmVzb3VyY2Ugb2YKLSAgICAgKiB0eXBlIFRZUEUxLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRTFfRk9OVCBpbmRpY2F0ZXMgYSBmb250IHJlc291cmNlIG9mIHR5cGUgVFlQRTEuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRTFfRk9OVCA9IDE7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IExBWU9VVF9MRUZUX1RPX1JJR0hUIGluZGljYXRlcyB0aGF0IHRleHQgaXMKLSAgICAgKiBsZWZ0IHRvIHJpZ2h0LiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgTEFZT1VUX0xFRlRfVE9fUklHSFQgaW5kaWNhdGVzIHRoYXQgdGV4dCBpcyBsZWZ0IHRvIHJpZ2h0LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBWU9VVF9MRUZUX1RPX1JJR0hUID0gMDsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgTEFZT1VUX1JJR0hUX1RPX0xFRlQgaW5kaWNhdGVzIHRoYXQgdGV4dCBpcwotICAgICAqIHJpZ2h0IHRvIGxlZnQuIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBMQVlPVVRfUklHSFRfVE9fTEVGVCBpbmRpY2F0ZXMgdGhhdCB0ZXh0IGlzIHJpZ2h0IHRvIGxlZnQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFZT1VUX1JJR0hUX1RPX0xFRlQgPSAxOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBMQVlPVVRfTk9fU1RBUlRfQ09OVEVYVCBpbmRpY2F0ZXMgdGhhdCB0aGUgdGV4dAotICAgICAqIGluIHRoZSBjaGFyIGFycmF5IGJlZm9yZSB0aGUgaW5kaWNhdGVkIHN0YXJ0IHNob3VsZCBub3QgYmUgZXhhbWluZWQuIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBMQVlPVVRfTk9fU1RBUlRfQ09OVEVYVCBpbmRpY2F0ZXMgdGhhdCB0aGUgdGV4dCBpbiB0aGUgY2hhcgorICAgICAqIGFycmF5IGJlZm9yZSB0aGUgaW5kaWNhdGVkIHN0YXJ0IHNob3VsZCBub3QgYmUgZXhhbWluZWQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFZT1VUX05PX1NUQVJUX0NPTlRFWFQgPSAyOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBMQVlPVVRfTk9fTElNSVRfQ09OVEVYVCBpbmRpY2F0ZXMgdGhhdCB0ZXh0IGluIAotICAgICAqIHRoZSBjaGFyIGFycmF5IGFmdGVyIHRoZSBpbmRpY2F0ZWQgbGltaXQgc2hvdWxkIG5vdCBiZSBleGFtaW5lZC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgTEFZT1VUX05PX0xJTUlUX0NPTlRFWFQgaW5kaWNhdGVzIHRoYXQgdGV4dCBpbiB0aGUgY2hhcgorICAgICAqIGFycmF5IGFmdGVyIHRoZSBpbmRpY2F0ZWQgbGltaXQgc2hvdWxkIG5vdCBiZSBleGFtaW5lZC4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQVlPVVRfTk9fTElNSVRfQ09OVEVYVCA9IDQ7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IERFRkFVTFRfRk9OVC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgREVGQVVMVF9GT05ULgorICAgICAqLwogICAgIHN0YXRpYyBmaW5hbCBGb250IERFRkFVTFRfRk9OVCA9IG5ldyBGb250KCJEaWFsb2ciLCBGb250LlBMQUlOLCAxMik7IC8vJE5PTi1OTFMtMSQKIAotICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgRm9udC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgRm9udC4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7CiAKLSAgICAvKiogVGhlIHN0eWxlIG9mIHRoZSBGb250LiAqLworICAgIC8qKgorICAgICAqIFRoZSBzdHlsZSBvZiB0aGUgRm9udC4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IHN0eWxlOwogCi0gICAgLyoqIFRoZSBzaXplIG9mIHRoZSBGb250LiAqLworICAgIC8qKgorICAgICAqIFRoZSBzaXplIG9mIHRoZSBGb250LgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgc2l6ZTsKIAotICAgIC8qKiBUaGUgcG9pbnQgc2l6ZSBvZiB0aGUgRm9udC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgcG9pbnQgc2l6ZSBvZiB0aGUgRm9udC4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgZmxvYXQgcG9pbnRTaXplOwogCiAgICAgLy8gRmxhZyBpZiB0aGUgRm9udCBvYmplY3QgdHJhbnNmb3JtZWQKLSAgICAvKiogVGhlIHRyYW5zZm9ybWVkLiAqLworICAgIC8qKgorICAgICAqIFRoZSB0cmFuc2Zvcm1lZC4KKyAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gdHJhbnNmb3JtZWQ7CiAKICAgICAvLyBTZXQgb2YgZm9udCBhdHRyaWJ1dGVzCi0gICAgLyoqIFRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlcy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgcmVxdWVzdGVkIGF0dHJpYnV0ZXMuCisgICAgICovCiAgICAgcHJpdmF0ZSBIYXNodGFibGU8QXR0cmlidXRlLCBPYmplY3Q+IGZSZXF1ZXN0ZWRBdHRyaWJ1dGVzOwogCiAgICAgLy8gZm9udCBwZWVyIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgRm9udAotICAgIC8qKiBUaGUgZm9udCBwZWVyLiAqLworICAgIC8qKgorICAgICAqIFRoZSBmb250IHBlZXIuCisgICAgICovCiAgICAgcHJpdmF0ZSB0cmFuc2llbnQgRm9udFBlZXJJbXBsIGZvbnRQZWVyOwogCiAgICAgLy8gbnVtYmVyIG9mIGdseXBocyBpbiB0aGlzIEZvbnQKLSAgICAvKiogVGhlIG51bSBnbHlwaHMuICovCisgICAgLyoqCisgICAgICogVGhlIG51bSBnbHlwaHMuCisgICAgICovCiAgICAgcHJpdmF0ZSB0cmFuc2llbnQgaW50IG51bUdseXBocyA9IC0xOwogCiAgICAgLy8gY29kZSBmb3IgbWlzc2luZyBnbHlwaCBmb3IgdGhpcyBGb250Ci0gICAgLyoqIFRoZSBtaXNzaW5nIGdseXBoIGNvZGUuICovCisgICAgLyoqCisgICAgICogVGhlIG1pc3NpbmcgZ2x5cGggY29kZS4KKyAgICAgKi8KICAgICBwcml2YXRlIHRyYW5zaWVudCBpbnQgbWlzc2luZ0dseXBoQ29kZSA9IC0xOwogCiAgICAgLyoqCiAgICAgICogV3JpdGVzIG9iamVjdCB0byBPYmplY3RPdXRwdXRTdHJlYW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIG91dCBPYmplY3RPdXRwdXRTdHJlYW0KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gb3V0CisgICAgICogICAgICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBvdXQuZGVmYXVsdFdyaXRlT2JqZWN0KCk7CkBAIC0xNzksMTAgKzIxNCwxMiBAQAogICAgICAqIFJlYWRzIG9iamVjdCBmcm9tIE9iamVjdElucHV0U3RyZWFtIG9iamVjdCBhbmQgc2V0IG5hdGl2ZSBwbGF0Zm9ybQogICAgICAqIGRlcGVuZGVudCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGluIE9iamVjdElucHV0U3RyZWFtIG9iamVjdAotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB0aGUgY2xhc3Mgbm90IGZvdW5kIGV4Y2VwdGlvbgorICAgICAqIEBwYXJhbSBpbgorICAgICAqICAgICAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gb2JqZWN0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgdGhlIGNsYXNzIG5vdCBmb3VuZCBleGNlcHRpb24uCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uLAogICAgICAgICAgICAgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CkBAIC0xOTQsMTEgKzIzMSwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBGb250IHdpdGggdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGVzLiAKLSAgICAgKiBUaGUgRm9udCB3aWxsIGJlIGNyZWF0ZWQgd2l0aCBkZWZhdWx0IGF0dHJpYnV0ZXMgCi0gICAgICogaWYgdGhlIGF0dHJpYnV0ZSdzIHBhcmFtZXRlciBpcyBudWxsLiAKKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgRm9udCB3aXRoIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlcy4gVGhlIEZvbnQgd2lsbCBiZQorICAgICAqIGNyZWF0ZWQgd2l0aCBkZWZhdWx0IGF0dHJpYnV0ZXMgaWYgdGhlIGF0dHJpYnV0ZSdzIHBhcmFtZXRlciBpcyBudWxsLgogICAgICAqIAotICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIHRoZSBhdHRyaWJ1dGVzIHRvIGJlIGFzc2lnbmVkIHRvIHRoZSBuZXcgRm9udCwgb3IgbnVsbC4KKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlcworICAgICAqICAgICAgICAgICAgdGhlIGF0dHJpYnV0ZXMgdG8gYmUgYXNzaWduZWQgdG8gdGhlIG5ldyBGb250LCBvciBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyBGb250KE1hcDw/IGV4dGVuZHMgQXR0cmlidXRlLCA/PiBhdHRyaWJ1dGVzKSB7CiAgICAgICAgIE9iamVjdCBjdXJyQXR0cjsKQEAgLTIxNyw0MyArMjU0LDM4IEBACiAKICAgICAgICAgICAgIGN1cnJBdHRyID0gYXR0cmlidXRlcy5nZXQoVGV4dEF0dHJpYnV0ZS5TSVpFKTsKICAgICAgICAgICAgIGlmIChjdXJyQXR0ciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5wb2ludFNpemUgPSAoKEZsb2F0KSBjdXJyQXR0cikuZmxvYXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIHRoaXMuc2l6ZSA9IChpbnQpIE1hdGguY2VpbCh0aGlzLnBvaW50U2l6ZSk7CisgICAgICAgICAgICAgICAgdGhpcy5wb2ludFNpemUgPSAoKEZsb2F0KWN1cnJBdHRyKS5mbG9hdFZhbHVlKCk7CisgICAgICAgICAgICAgICAgdGhpcy5zaXplID0gKGludClNYXRoLmNlaWwodGhpcy5wb2ludFNpemUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBjdXJyQXR0ciA9IGF0dHJpYnV0ZXMuZ2V0KFRleHRBdHRyaWJ1dGUuUE9TVFVSRSk7Ci0gICAgICAgICAgICBpZiAoY3VyckF0dHIgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiBjdXJyQXR0ci5lcXVhbHMoVGV4dEF0dHJpYnV0ZS5QT1NUVVJFX09CTElRVUUpKSB7CisgICAgICAgICAgICBpZiAoY3VyckF0dHIgIT0gbnVsbCAmJiBjdXJyQXR0ci5lcXVhbHMoVGV4dEF0dHJpYnV0ZS5QT1NUVVJFX09CTElRVUUpKSB7CiAgICAgICAgICAgICAgICAgdGhpcy5zdHlsZSB8PSBGb250LklUQUxJQzsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgY3VyckF0dHIgPSBhdHRyaWJ1dGVzLmdldChUZXh0QXR0cmlidXRlLldFSUdIVCk7CiAgICAgICAgICAgICBpZiAoKGN1cnJBdHRyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICYmICgoKEZsb2F0KSBjdXJyQXR0cikuZmxvYXRWYWx1ZSgpID49IChUZXh0QXR0cmlidXRlLldFSUdIVF9CT0xEKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mbG9hdFZhbHVlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICYmICgoKEZsb2F0KWN1cnJBdHRyKS5mbG9hdFZhbHVlKCkgPj0gKFRleHRBdHRyaWJ1dGUuV0VJR0hUX0JPTEQpLmZsb2F0VmFsdWUoKSkpIHsKICAgICAgICAgICAgICAgICB0aGlzLnN0eWxlIHw9IEZvbnQuQk9MRDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgY3VyckF0dHIgPSBhdHRyaWJ1dGVzLmdldChUZXh0QXR0cmlidXRlLkZBTUlMWSk7CiAgICAgICAgICAgICBpZiAoY3VyckF0dHIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IChTdHJpbmcpIGN1cnJBdHRyOworICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IChTdHJpbmcpY3VyckF0dHI7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGN1cnJBdHRyID0gYXR0cmlidXRlcy5nZXQoVGV4dEF0dHJpYnV0ZS5UUkFOU0ZPUk0pOwogICAgICAgICAgICAgaWYgKGN1cnJBdHRyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBpZiAoY3VyckF0dHIgaW5zdGFuY2VvZiBUcmFuc2Zvcm1BdHRyaWJ1dGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1lZCA9ICEoKFRyYW5zZm9ybUF0dHJpYnV0ZSkgY3VyckF0dHIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFRyYW5zZm9ybSgpLmlzSWRlbnRpdHkoKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1lZCA9ICEoKFRyYW5zZm9ybUF0dHJpYnV0ZSljdXJyQXR0cikuZ2V0VHJhbnNmb3JtKCkuaXNJZGVudGl0eSgpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyckF0dHIgaW5zdGFuY2VvZiBBZmZpbmVUcmFuc2Zvcm0pIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1lZCA9ICEoKEFmZmluZVRyYW5zZm9ybSkgY3VyckF0dHIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlzSWRlbnRpdHkoKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1lZCA9ICEoKEFmZmluZVRyYW5zZm9ybSljdXJyQXR0cikuaXNJZGVudGl0eSgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZlJlcXVlc3RlZEF0dHJpYnV0ZXMgPSBuZXcgSGFzaHRhYmxlPEF0dHJpYnV0ZSwgT2JqZWN0Pig1KTsKLSAgICAgICAgICAgIGZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLnB1dChUZXh0QXR0cmlidXRlLlRSQU5TRk9STSwKLSAgICAgICAgICAgICAgICAgICAgSURFTlRJVFlfVFJBTlNGT1JNKTsKKyAgICAgICAgICAgIGZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLnB1dChUZXh0QXR0cmlidXRlLlRSQU5TRk9STSwgSURFTlRJVFlfVFJBTlNGT1JNKTsKIAogICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1lZCA9IGZhbHNlOwogCkBAIC0yNjIsMTggKzI5NCwxNCBAQAogICAgICAgICAgICAgZlJlcXVlc3RlZEF0dHJpYnV0ZXMucHV0KFRleHRBdHRyaWJ1dGUuU0laRSwgbmV3IEZsb2F0KHRoaXMuc2l6ZSkpOwogCiAgICAgICAgICAgICBpZiAoKHRoaXMuc3R5bGUgJiBGb250LkJPTEQpICE9IDApIHsKLSAgICAgICAgICAgICAgICBmUmVxdWVzdGVkQXR0cmlidXRlcy5wdXQoVGV4dEF0dHJpYnV0ZS5XRUlHSFQsCi0gICAgICAgICAgICAgICAgICAgICAgICBUZXh0QXR0cmlidXRlLldFSUdIVF9CT0xEKTsKKyAgICAgICAgICAgICAgICBmUmVxdWVzdGVkQXR0cmlidXRlcy5wdXQoVGV4dEF0dHJpYnV0ZS5XRUlHSFQsIFRleHRBdHRyaWJ1dGUuV0VJR0hUX0JPTEQpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmUmVxdWVzdGVkQXR0cmlidXRlcy5wdXQoVGV4dEF0dHJpYnV0ZS5XRUlHSFQsCi0gICAgICAgICAgICAgICAgICAgICAgICBUZXh0QXR0cmlidXRlLldFSUdIVF9SRUdVTEFSKTsKKyAgICAgICAgICAgICAgICBmUmVxdWVzdGVkQXR0cmlidXRlcy5wdXQoVGV4dEF0dHJpYnV0ZS5XRUlHSFQsIFRleHRBdHRyaWJ1dGUuV0VJR0hUX1JFR1VMQVIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCh0aGlzLnN0eWxlICYgRm9udC5JVEFMSUMpICE9IDApIHsKLSAgICAgICAgICAgICAgICBmUmVxdWVzdGVkQXR0cmlidXRlcy5wdXQoVGV4dEF0dHJpYnV0ZS5QT1NUVVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgVGV4dEF0dHJpYnV0ZS5QT1NUVVJFX09CTElRVUUpOworICAgICAgICAgICAgICAgIGZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLnB1dChUZXh0QXR0cmlidXRlLlBPU1RVUkUsIFRleHRBdHRyaWJ1dGUuUE9TVFVSRV9PQkxJUVVFKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZlJlcXVlc3RlZEF0dHJpYnV0ZXMucHV0KFRleHRBdHRyaWJ1dGUuUE9TVFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRleHRBdHRyaWJ1dGUuUE9TVFVSRV9SRUdVTEFSKTsKKyAgICAgICAgICAgICAgICBmUmVxdWVzdGVkQXR0cmlidXRlcy5wdXQoVGV4dEF0dHJpYnV0ZS5QT1NUVVJFLCBUZXh0QXR0cmlidXRlLlBPU1RVUkVfUkVHVUxBUik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgfQpAQCAtMjgyLDkgKzMxMCwxMiBAQAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBGb250IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCBzdHlsZSBhbmQgc2l6ZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiBmb250LgotICAgICAqIEBwYXJhbSBzdHlsZSB0aGUgc3R5bGUgb2YgZm9udC4KLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSBvZiBmb250LgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiBmb250LgorICAgICAqIEBwYXJhbSBzdHlsZQorICAgICAqICAgICAgICAgICAgdGhlIHN0eWxlIG9mIGZvbnQuCisgICAgICogQHBhcmFtIHNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzaXplIG9mIGZvbnQuCiAgICAgICovCiAgICAgcHVibGljIEZvbnQoU3RyaW5nIG5hbWUsIGludCBzdHlsZSwgaW50IHNpemUpIHsKIApAQCAtMzAzLDQ2ICszMzQsNDMgQEAKICAgICAgICAgZlJlcXVlc3RlZEF0dHJpYnV0ZXMucHV0KFRleHRBdHRyaWJ1dGUuU0laRSwgbmV3IEZsb2F0KHRoaXMuc2l6ZSkpOwogCiAgICAgICAgIGlmICgodGhpcy5zdHlsZSAmIEZvbnQuQk9MRCkgIT0gMCkgewotICAgICAgICAgICAgZlJlcXVlc3RlZEF0dHJpYnV0ZXMucHV0KFRleHRBdHRyaWJ1dGUuV0VJR0hULAotICAgICAgICAgICAgICAgICAgICBUZXh0QXR0cmlidXRlLldFSUdIVF9CT0xEKTsKKyAgICAgICAgICAgIGZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLnB1dChUZXh0QXR0cmlidXRlLldFSUdIVCwgVGV4dEF0dHJpYnV0ZS5XRUlHSFRfQk9MRCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmUmVxdWVzdGVkQXR0cmlidXRlcy5wdXQoVGV4dEF0dHJpYnV0ZS5XRUlHSFQsCi0gICAgICAgICAgICAgICAgICAgIFRleHRBdHRyaWJ1dGUuV0VJR0hUX1JFR1VMQVIpOworICAgICAgICAgICAgZlJlcXVlc3RlZEF0dHJpYnV0ZXMucHV0KFRleHRBdHRyaWJ1dGUuV0VJR0hULCBUZXh0QXR0cmlidXRlLldFSUdIVF9SRUdVTEFSKTsKICAgICAgICAgfQogICAgICAgICBpZiAoKHRoaXMuc3R5bGUgJiBGb250LklUQUxJQykgIT0gMCkgewotICAgICAgICAgICAgZlJlcXVlc3RlZEF0dHJpYnV0ZXMucHV0KFRleHRBdHRyaWJ1dGUuUE9TVFVSRSwKLSAgICAgICAgICAgICAgICAgICAgVGV4dEF0dHJpYnV0ZS5QT1NUVVJFX09CTElRVUUpOworICAgICAgICAgICAgZlJlcXVlc3RlZEF0dHJpYnV0ZXMucHV0KFRleHRBdHRyaWJ1dGUuUE9TVFVSRSwgVGV4dEF0dHJpYnV0ZS5QT1NUVVJFX09CTElRVUUpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZlJlcXVlc3RlZEF0dHJpYnV0ZXMucHV0KFRleHRBdHRyaWJ1dGUuUE9TVFVSRSwKLSAgICAgICAgICAgICAgICAgICAgVGV4dEF0dHJpYnV0ZS5QT1NUVVJFX1JFR1VMQVIpOworICAgICAgICAgICAgZlJlcXVlc3RlZEF0dHJpYnV0ZXMucHV0KFRleHRBdHRyaWJ1dGUuUE9TVFVSRSwgVGV4dEF0dHJpYnV0ZS5QT1NUVVJFX1JFR1VMQVIpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgRm9udCBoYXMgYSBnbHlwaCBmb3IgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGMgdGhlIGNoYXJhY3Rlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBGb250IGhhcyBhIGdseXBoIGZvciB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciwKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIGMKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgRm9udCBoYXMgYSBnbHlwaCBmb3IgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIsIGZhbHNlCisgICAgICogICAgICAgICBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY2FuRGlzcGxheShjaGFyIGMpIHsKLSAgICAgICAgRm9udFBlZXJJbXBsIHBlZXIgPSAoRm9udFBlZXJJbXBsKSB0aGlzLmdldFBlZXIoKTsKKyAgICAgICAgRm9udFBlZXJJbXBsIHBlZXIgPSAoRm9udFBlZXJJbXBsKXRoaXMuZ2V0UGVlcigpOwogICAgICAgICByZXR1cm4gcGVlci5jYW5EaXNwbGF5KGMpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgRm9udCBjYW4gZGlzcGxheSB0aGUgY2hhcmFjdGVycyBvZiB0aGUgCi0gICAgICogdGhlIHNwZWNpZmllZCB0ZXh0IGZyb20gdGhlIHNwZWNpZmllZCBzdGFydCBwb3NpdGlvbiAKLSAgICAgKiB0byB0aGUgc3BlY2lmaWVkIGxpbWl0IHBvc2l0aW9uLiAKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIEZvbnQgY2FuIGRpc3BsYXkgdGhlIGNoYXJhY3RlcnMgb2YgdGhlIHRoZSBzcGVjaWZpZWQKKyAgICAgKiB0ZXh0IGZyb20gdGhlIHNwZWNpZmllZCBzdGFydCBwb3NpdGlvbiB0byB0aGUgc3BlY2lmaWVkIGxpbWl0IHBvc2l0aW9uLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0LgotICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgb2Zmc2V0IChpbiB0aGUgY2hhcmFjdGVyIGFycmF5KS4KLSAgICAgKiBAcGFyYW0gbGltaXQgdGhlIGxpbWl0IG9mZnNldCAoaW4gdGhlIGNoYXJhY3RlciBhcnJheSkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYSBjaGFyYWN0ZXIncyBwb3NpdGlvbiBpbiB0aGUgdGV4dCB0aGF0IHRoaXMgRm9udCAKLSAgICAgKiBjYW4gbm90IGRpc3BsYXksIG9yIC0xIGlmIHRoaXMgRm9udCBjYW4gZGlzcGxheSBhbGwgY2hhcmFjdGVycyAKLSAgICAgKiBpbiB0aGlzIHRleHQuCisgICAgICogQHBhcmFtIHRleHQKKyAgICAgKiAgICAgICAgICAgIHRoZSB0ZXh0LgorICAgICAqIEBwYXJhbSBzdGFydAorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IG9mZnNldCAoaW4gdGhlIGNoYXJhY3RlciBhcnJheSkuCisgICAgICogQHBhcmFtIGxpbWl0CisgICAgICogICAgICAgICAgICB0aGUgbGltaXQgb2Zmc2V0IChpbiB0aGUgY2hhcmFjdGVyIGFycmF5KS4KKyAgICAgKiBAcmV0dXJuIHRoZSBhIGNoYXJhY3RlcidzIHBvc2l0aW9uIGluIHRoZSB0ZXh0IHRoYXQgdGhpcyBGb250IGNhbiBub3QKKyAgICAgKiAgICAgICAgIGRpc3BsYXksIG9yIC0xIGlmIHRoaXMgRm9udCBjYW4gZGlzcGxheSBhbGwgY2hhcmFjdGVycyBpbiB0aGlzCisgICAgICogICAgICAgICB0ZXh0LgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgY2FuRGlzcGxheVVwVG8oY2hhcltdIHRleHQsIGludCBzdGFydCwgaW50IGxpbWl0KSB7CiAgICAgICAgIGludCBzdCA9IHN0YXJ0OwpAQCAtMzYxLDE3ICszODksMTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIEZvbnQgY2FuIGRpc3BsYXkgdGhlIGNoYXJhY3RlcnMgb2YgdGhlIAotICAgICAqIHRoZSBzcGVjaWZpZWQgQ2hhcmFjdGVySXRlcmF0b3IgZnJvbSB0aGUgc3BlY2lmaWVkIHN0YXJ0IHBvc2l0aW9uIAotICAgICAqIGFuZCB0aGUgc3BlY2lmaWVkIGxpbWl0IHBvc2l0aW9uLiAKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIEZvbnQgY2FuIGRpc3BsYXkgdGhlIGNoYXJhY3RlcnMgb2YgdGhlIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBDaGFyYWN0ZXJJdGVyYXRvciBmcm9tIHRoZSBzcGVjaWZpZWQgc3RhcnQgcG9zaXRpb24gYW5kIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBsaW1pdCBwb3NpdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaXRlciB0aGUgQ2hhcmFjdGVySXRlcmF0b3IuCi0gICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBvZmZzZXQuCi0gICAgICogQHBhcmFtIGxpbWl0IHRoZSBsaW1pdCBvZmZzZXQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYSBjaGFyYWN0ZXIncyBwb3NpdGlvbiBpbiB0aGUgQ2hhcmFjdGVySXRlcmF0b3IKLSAgICAgKiB0aGF0IHRoaXMgRm9udCBjYW4gbm90IGRpc3BsYXksIG9yIC0xIGlmIHRoaXMgRm9udCBjYW4gZGlzcGxheSAKLSAgICAgKiBhbGwgY2hhcmFjdGVycyBpbiB0aGlzIHRleHQuCisgICAgICogQHBhcmFtIGl0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBDaGFyYWN0ZXJJdGVyYXRvci4KKyAgICAgKiBAcGFyYW0gc3RhcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBvZmZzZXQuCisgICAgICogQHBhcmFtIGxpbWl0CisgICAgICogICAgICAgICAgICB0aGUgbGltaXQgb2Zmc2V0LgorICAgICAqIEByZXR1cm4gdGhlIGEgY2hhcmFjdGVyJ3MgcG9zaXRpb24gaW4gdGhlIENoYXJhY3Rlckl0ZXJhdG9yIHRoYXQgdGhpcworICAgICAqICAgICAgICAgRm9udCBjYW4gbm90IGRpc3BsYXksIG9yIC0xIGlmIHRoaXMgRm9udCBjYW4gZGlzcGxheSBhbGwKKyAgICAgKiAgICAgICAgIGNoYXJhY3RlcnMgaW4gdGhpcyB0ZXh0LgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgY2FuRGlzcGxheVVwVG8oQ2hhcmFjdGVySXRlcmF0b3IgaXRlciwgaW50IHN0YXJ0LCBpbnQgbGltaXQpIHsKICAgICAgICAgaW50IHN0ID0gc3RhcnQ7CkBAIC0zOTQsMTEgKzQyNCwxMSBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIEZvbnQgY2FuIGRpc3BsYXkgYSBzcGVjaWZpZWQgU3RyaW5nLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzdHIgdGhlIFN0cmluZy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhIGNoYXJhY3RlcidzIHBvc2l0aW9uIGluIHRoZSBTdHJpbmcgdGhhdCAKLSAgICAgKiB0aGlzIEZvbnQgY2FuIG5vdCBkaXNwbGF5LCBvciAtMSBpZiB0aGlzIEZvbnQgY2FuIGRpc3BsYXkgCi0gICAgICogYWxsIGNoYXJhY3RlcnMgaW4gdGhpcyB0ZXh0LgorICAgICAqIEBwYXJhbSBzdHIKKyAgICAgKiAgICAgICAgICAgIHRoZSBTdHJpbmcuCisgICAgICogQHJldHVybiB0aGUgYSBjaGFyYWN0ZXIncyBwb3NpdGlvbiBpbiB0aGUgU3RyaW5nIHRoYXQgdGhpcyBGb250IGNhbiBub3QKKyAgICAgKiAgICAgICAgIGRpc3BsYXksIG9yIC0xIGlmIHRoaXMgRm9udCBjYW4gZGlzcGxheSBhbGwgY2hhcmFjdGVycyBpbiB0aGlzCisgICAgICogICAgICAgICB0ZXh0LgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgY2FuRGlzcGxheVVwVG8oU3RyaW5nIHN0cikgewogICAgICAgICBjaGFyW10gY2hhcnMgPSBzdHIudG9DaGFyQXJyYXkoKTsKQEAgLTQwNiw0NSArNDM2LDQ5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIEdseXBoVmVjdG9yIG9mIGFzc29jaWF0aW5nIGNoYXJhY3RlcnMgdG8gZ2x5cGhzIAotICAgICAqIGJhc2VkIG9uIHRoZSB1bmljb2RlIG1hcCBvZiB0aGlzIEZvbnQuIAorICAgICAqIENyZWF0ZXMgYSBHbHlwaFZlY3RvciBvZiBhc3NvY2lhdGluZyBjaGFyYWN0ZXJzIHRvIGdseXBocyBiYXNlZCBvbiB0aGUKKyAgICAgKiBVbmljb2RlIG1hcCBvZiB0aGlzIEZvbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGZyYyB0aGUgRm9udFJlbmRlckNvbnRleHQuCi0gICAgICogQHBhcmFtIGNoYXJzIHRoZSBjaGFyYWN0ZXJzIGFycmF5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIEdseXBoVmVjdG9yIG9mIGFzc29jaWF0aW5nIGNoYXJhY3RlcnMgdG8gZ2x5cGhzIAotICAgICAqIGJhc2VkIG9uIHRoZSB1bmljb2RlIG1hcCBvZiB0aGlzIEZvbnQuCisgICAgICogQHBhcmFtIGZyYworICAgICAqICAgICAgICAgICAgdGhlIEZvbnRSZW5kZXJDb250ZXh0LgorICAgICAqIEBwYXJhbSBjaGFycworICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlcnMgYXJyYXkuCisgICAgICogQHJldHVybiB0aGUgR2x5cGhWZWN0b3Igb2YgYXNzb2NpYXRpbmcgY2hhcmFjdGVycyB0byBnbHlwaHMgYmFzZWQgb24gdGhlCisgICAgICogICAgICAgICBVbmljb2RlIG1hcCBvZiB0aGlzIEZvbnQuCiAgICAgICovCiAgICAgcHVibGljIEdseXBoVmVjdG9yIGNyZWF0ZUdseXBoVmVjdG9yKEZvbnRSZW5kZXJDb250ZXh0IGZyYywgY2hhcltdIGNoYXJzKSB7CiAgICAgICAgIHJldHVybiBuZXcgQW5kcm9pZEdseXBoVmVjdG9yKGNoYXJzLCBmcmMsIHRoaXMsIDApOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBHbHlwaFZlY3RvciBvZiBhc3NvY2lhdGluZyBjaGFyYWN0ZXJzIGNvbnRhaW5lZAotICAgICAqIGluIHRoZSBzcGVjaWZpZWQgQ2hhcmFjdGVySXRlcmF0b3IgdG8gZ2x5cGhzIGJhc2VkIG9uIAotICAgICAqIHRoZSB1bmljb2RlIG1hcCBvZiB0aGlzIEZvbnQuIAorICAgICAqIENyZWF0ZXMgYSBHbHlwaFZlY3RvciBvZiBhc3NvY2lhdGluZyBjaGFyYWN0ZXJzIGNvbnRhaW5lZCBpbiB0aGUKKyAgICAgKiBzcGVjaWZpZWQgQ2hhcmFjdGVySXRlcmF0b3IgdG8gZ2x5cGhzIGJhc2VkIG9uIHRoZSBVbmljb2RlIG1hcCBvZiB0aGlzCisgICAgICogRm9udC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZnJjIHRoZSBGb250UmVuZGVyQ29udGV4dC4KLSAgICAgKiBAcGFyYW0gaXRlciB0aGUgQ2hhcmFjdGVySXRlcmF0b3IuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgR2x5cGhWZWN0b3Igb2YgYXNzb2NpYXRpbmcgY2hhcmFjdGVycyBjb250YWluZWQKLSAgICAgKiBpbiB0aGUgc3BlY2lmaWVkIENoYXJhY3Rlckl0ZXJhdG9yIHRvIGdseXBocyAKLSAgICAgKiBiYXNlZCBvbiB0aGUgdW5pY29kZSBtYXAgb2YgdGhpcyBGb250LgorICAgICAqIEBwYXJhbSBmcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBGb250UmVuZGVyQ29udGV4dC4KKyAgICAgKiBAcGFyYW0gaXRlcgorICAgICAqICAgICAgICAgICAgdGhlIENoYXJhY3Rlckl0ZXJhdG9yLgorICAgICAqIEByZXR1cm4gdGhlIEdseXBoVmVjdG9yIG9mIGFzc29jaWF0aW5nIGNoYXJhY3RlcnMgY29udGFpbmVkIGluIHRoZQorICAgICAqICAgICAgICAgc3BlY2lmaWVkIENoYXJhY3Rlckl0ZXJhdG9yIHRvIGdseXBocyBiYXNlZCBvbiB0aGUgVW5pY29kZSBtYXAgb2YKKyAgICAgKiAgICAgICAgIHRoaXMgRm9udC4KICAgICAgKi8KLSAgICBwdWJsaWMgR2x5cGhWZWN0b3IgY3JlYXRlR2x5cGhWZWN0b3IoRm9udFJlbmRlckNvbnRleHQgZnJjLAotICAgICAgICAgICAgQ2hhcmFjdGVySXRlcmF0b3IgaXRlcikgewotICAgIAl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkISIpOyAvLyROT04tTkxTLTEkICAgIAorICAgIHB1YmxpYyBHbHlwaFZlY3RvciBjcmVhdGVHbHlwaFZlY3RvcihGb250UmVuZGVyQ29udGV4dCBmcmMsIENoYXJhY3Rlckl0ZXJhdG9yIGl0ZXIpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCEiKTsgLy8kTk9OLU5MUy0xJCAgICAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgR2x5cGhWZWN0b3Igb2YgYXNzb2NpYXRpbmcgY2hhcmFjdGVycyB0byBnbHlwaHMgYmFzZWQgb24gCi0gICAgICogdGhlIHVuaWNvZGUgbWFwIG9mIHRoaXMgRm9udC4gCisgICAgICogQ3JlYXRlcyBhIEdseXBoVmVjdG9yIG9mIGFzc29jaWF0aW5nIGNoYXJhY3RlcnMgdG8gZ2x5cGhzIGJhc2VkIG9uIHRoZQorICAgICAqIFVuaWNvZGUgbWFwIG9mIHRoaXMgRm9udC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZnJjIHRoZSBGb250UmVuZGVyQ29udGV4dC4KLSAgICAgKiBAcGFyYW0gZ2x5cGhDb2RlcyB0aGUgc3BlY2lmaWVkIGludGVnZXIgYXJyYXkgb2YgZ2x5cGggY29kZXMuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgR2x5cGhWZWN0b3Igb2YgYXNzb2NpYXRpbmcgY2hhcmFjdGVycyB0byBnbHlwaHMgCi0gICAgICogYmFzZWQgb24gdGhlIHVuaWNvZGUgbWFwIG9mIHRoaXMgRm9udC4KKyAgICAgKiBAcGFyYW0gZnJjCisgICAgICogICAgICAgICAgICB0aGUgRm9udFJlbmRlckNvbnRleHQuCisgICAgICogQHBhcmFtIGdseXBoQ29kZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgaW50ZWdlciBhcnJheSBvZiBnbHlwaCBjb2Rlcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBHbHlwaFZlY3RvciBvZiBhc3NvY2lhdGluZyBjaGFyYWN0ZXJzIHRvIGdseXBocyBiYXNlZCBvbiB0aGUKKyAgICAgKiAgICAgICAgIFVuaWNvZGUgbWFwIG9mIHRoaXMgRm9udC4KKyAgICAgKiBAdGhyb3dzIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkIGJ5IGEgc3ViY2xhc3MuCiAgICAgICovCiAgICAgcHVibGljIEdseXBoVmVjdG9yIGNyZWF0ZUdseXBoVmVjdG9yKEZvbnRSZW5kZXJDb250ZXh0IGZyYywgaW50W10gZ2x5cGhDb2RlcykKICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk5vdEltcGxlbWVudGVkRXhjZXB0aW9uIHsKQEAgLTQ1MiwxNCArNDg2LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIEdseXBoVmVjdG9yIG9mIGFzc29jaWF0aW5nIGNoYXJhY3RlcnMgdG8gZ2x5cGhzIGJhc2VkIG9uIAotICAgICAqIHRoZSB1bmljb2RlIG1hcCBvZiB0aGlzIEZvbnQuIAorICAgICAqIENyZWF0ZXMgYSBHbHlwaFZlY3RvciBvZiBhc3NvY2lhdGluZyBjaGFyYWN0ZXJzIHRvIGdseXBocyBiYXNlZCBvbiB0aGUKKyAgICAgKiBVbmljb2RlIG1hcCBvZiB0aGlzIEZvbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGZyYyB0aGUgRm9udFJlbmRlckNvbnRleHQuCi0gICAgICogQHBhcmFtIHN0ciB0aGUgc3BlY2lmaWVkIFN0cmluZy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBHbHlwaFZlY3RvciBvZiBhc3NvY2lhdGluZyBjaGFyYWN0ZXJzIHRvIGdseXBocyAKLSAgICAgKiBiYXNlZCBvbiB0aGUgdW5pY29kZSBtYXAgb2YgdGhpcyBGb250LgorICAgICAqIEBwYXJhbSBmcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBGb250UmVuZGVyQ29udGV4dC4KKyAgICAgKiBAcGFyYW0gc3RyCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIFN0cmluZy4KKyAgICAgKiBAcmV0dXJuIHRoZSBHbHlwaFZlY3RvciBvZiBhc3NvY2lhdGluZyBjaGFyYWN0ZXJzIHRvIGdseXBocyBiYXNlZCBvbiB0aGUKKyAgICAgKiAgICAgICAgIFVuaWNvZGUgbWFwIG9mIHRoaXMgRm9udC4KICAgICAgKi8KICAgICBwdWJsaWMgR2x5cGhWZWN0b3IgY3JlYXRlR2x5cGhWZWN0b3IoRm9udFJlbmRlckNvbnRleHQgZnJjLCBTdHJpbmcgc3RyKSB7CiAgICAgICAgIHJldHVybiBuZXcgQW5kcm9pZEdseXBoVmVjdG9yKHN0ci50b0NoYXJBcnJheSgpLCBmcmMsIHRoaXMsIDApOwpAQCAtNDY3LDE0ICs1MDIsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmb250IHN0eWxlIGNvbnN0YW50IHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gb25lIG9mIHRoZSBmb250IHN0eWxlCi0gICAgICogbmFtZXMgKCJCT0xEIiwgIklUQUxJQyIsICJCT0xESVRBTElDIikuIFRoaXMgbWV0aG9kIHJldHVybnMgRm9udC5QTEFJTiBpZgotICAgICAqIHRoZSBhcmd1bWVudCBpcyBub3Qgb25lIG9mIHRoZSBwcmVkZWZpbmVkIHN0eWxlIG5hbWVzLgorICAgICAqIFJldHVybnMgdGhlIGZvbnQgc3R5bGUgY29uc3RhbnQgdmFsdWUgY29ycmVzcG9uZGluZyB0byBvbmUgb2YgdGhlIGZvbnQKKyAgICAgKiBzdHlsZSBuYW1lcyAoIkJPTEQiLCAiSVRBTElDIiwgIkJPTERJVEFMSUMiKS4gVGhpcyBtZXRob2QgcmV0dXJucworICAgICAqIEZvbnQuUExBSU4gaWYgdGhlIGFyZ3VtZW50IGlzIG5vdCBvbmUgb2YgdGhlIHByZWRlZmluZWQgc3R5bGUgbmFtZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGZvbnRTdHlsZU5hbWUgZm9udCBzdHlsZSBuYW1lCi0gICAgICogCisgICAgICogQHBhcmFtIGZvbnRTdHlsZU5hbWUKKyAgICAgKiAgICAgICAgICAgIGZvbnQgc3R5bGUgbmFtZS4KICAgICAgKiBAcmV0dXJuIGZvbnQgc3R5bGUgY29uc3RhbnQgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgZm9udCBzdHlsZSBuYW1lCi0gICAgICogc3BlY2lmaWVkLgorICAgICAqICAgICAgICAgc3BlY2lmaWVkLgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRGb250U3R5bGUoU3RyaW5nIGZvbnRTdHlsZU5hbWUpIHsKICAgICAgICAgaW50IHJlc3VsdCA9IEZvbnQuUExBSU47CkBAIC00OTEsMTIgKzUyNiwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIERlY29kZXMgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2hpY2ggZGVzY3JpYmVkIHRoZSBGb250LiBUaGUgc3RyaW5nIAotICAgICAqIHNob3VsZCBoYXZlIHRoZSBmb2xsb3dpbmcgZm9ybWF0OiBmb250bmFtZS1zdHlsZS1wb2ludHNpemUuIAotICAgICAqIFRoZSBzdHlsZSBjYW4gYmUgUExBSU4sIEJPTEQsIEJPTERJVEFMSUMsIG9yIElUQUxJQy4KKyAgICAgKiBEZWNvZGVzIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdoaWNoIGRlc2NyaWJlZCB0aGUgRm9udC4gVGhlIHN0cmluZyBzaG91bGQKKyAgICAgKiBoYXZlIHRoZSBmb2xsb3dpbmcgZm9ybWF0OiBmb250bmFtZS1zdHlsZS1wb2ludHNpemUuIFRoZSBzdHlsZSBjYW4gYmUKKyAgICAgKiBQTEFJTiwgQk9MRCwgQk9MRElUQUxJQywgb3IgSVRBTElDLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyB3aGljaCBkZXNjcmliZXMgdGhlIGZvbnQuCi0gICAgICogCisgICAgICogQHBhcmFtIHN0cgorICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyB3aGljaCBkZXNjcmliZXMgdGhlIGZvbnQuCiAgICAgICogQHJldHVybiB0aGUgRm9udCBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgRm9udCBkZWNvZGUoU3RyaW5nIHN0cikgewpAQCAtNTUzLDE1ICs1ODgsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQZXJmb21zIHRoZSBzcGVjaWZpZWQgYWZmaW5lIHRyYW5zZm9ybSB0byB0aGUgRm9udCBhbmQgcmV0dXJucyAKLSAgICAgKiBhIG5ldyBGb250LgorICAgICAqIFBlcmZvcm1zIHRoZSBzcGVjaWZpZWQgYWZmaW5lIHRyYW5zZm9ybSB0byB0aGUgRm9udCBhbmQgcmV0dXJucyBhIG5ldworICAgICAqIEZvbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHRyYW5zIHRoZSBBZmZpbmVUcmFuc2Zvcm0uCi0gICAgICogCisgICAgICogQHBhcmFtIHRyYW5zCisgICAgICogICAgICAgICAgICB0aGUgQWZmaW5lVHJhbnNmb3JtLgogICAgICAqIEByZXR1cm4gdGhlIEZvbnQgb2JqZWN0LgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFmZmluZSB0cmFuc2Zvcm0gcGFyYW1ldGVyCi0gICAgICogaXMgbnVsbC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFmZmluZSB0cmFuc2Zvcm0gcGFyYW1ldGVyIGlzIG51bGwuCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIEZvbnQgZGVyaXZlRm9udChBZmZpbmVUcmFuc2Zvcm0gdHJhbnMpIHsKQEAgLTU3MSw1NSArNjA1LDUyIEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0Ljk0IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICBIYXNodGFibGU8QXR0cmlidXRlLCBPYmplY3Q+IGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzID0gKEhhc2h0YWJsZTxBdHRyaWJ1dGUsIE9iamVjdD4pIGZSZXF1ZXN0ZWRBdHRyaWJ1dGVzCisgICAgICAgIEhhc2h0YWJsZTxBdHRyaWJ1dGUsIE9iamVjdD4gZGVyaXZlZlJlcXVlc3RlZEF0dHJpYnV0ZXMgPSAoSGFzaHRhYmxlPEF0dHJpYnV0ZSwgT2JqZWN0PilmUmVxdWVzdGVkQXR0cmlidXRlcwogICAgICAgICAgICAgICAgIC5jbG9uZSgpOwogCi0gICAgICAgIGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLnB1dChUZXh0QXR0cmlidXRlLlRSQU5TRk9STSwKLSAgICAgICAgICAgICAgICBuZXcgVHJhbnNmb3JtQXR0cmlidXRlKHRyYW5zKSk7CisgICAgICAgIGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLnB1dChUZXh0QXR0cmlidXRlLlRSQU5TRk9STSwgbmV3IFRyYW5zZm9ybUF0dHJpYnV0ZSh0cmFucykpOwogCiAgICAgICAgIHJldHVybiBuZXcgRm9udChkZXJpdmVmUmVxdWVzdGVkQXR0cmlidXRlcyk7CiAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IEZvbnQgdGhhdCBpcyBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgRm9udCAKLSAgICAgKiBtb2RpZmllZCBzbyB0aGF0IHRoZSBzaXplIGlzIHRoZSBzcGVjaWZpZWQgc2l6ZS4KKyAgICAgKiBSZXR1cm5zIGEgbmV3IEZvbnQgdGhhdCBpcyBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgRm9udCBtb2RpZmllZCBzbyB0aGF0CisgICAgICogdGhlIHNpemUgaXMgdGhlIHNwZWNpZmllZCBzaXplLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzaXplIHRoZSBzaXplIG9mIGZvbnQuCi0gICAgICogCisgICAgICogQHBhcmFtIHNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzaXplIG9mIGZvbnQuCiAgICAgICogQHJldHVybiB0aGUgRm9udCBvYmplY3QuCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIEZvbnQgZGVyaXZlRm9udChmbG9hdCBzaXplKSB7Ci0gICAgICAgIEhhc2h0YWJsZTxBdHRyaWJ1dGUsIE9iamVjdD4gZGVyaXZlZlJlcXVlc3RlZEF0dHJpYnV0ZXMgPSAoSGFzaHRhYmxlPEF0dHJpYnV0ZSwgT2JqZWN0PikgZlJlcXVlc3RlZEF0dHJpYnV0ZXMKKyAgICAgICAgSGFzaHRhYmxlPEF0dHJpYnV0ZSwgT2JqZWN0PiBkZXJpdmVmUmVxdWVzdGVkQXR0cmlidXRlcyA9IChIYXNodGFibGU8QXR0cmlidXRlLCBPYmplY3Q+KWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzCiAgICAgICAgICAgICAgICAgLmNsb25lKCk7CiAgICAgICAgIGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLnB1dChUZXh0QXR0cmlidXRlLlNJWkUsIG5ldyBGbG9hdChzaXplKSk7CiAgICAgICAgIHJldHVybiBuZXcgRm9udChkZXJpdmVmUmVxdWVzdGVkQXR0cmlidXRlcyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBGb250IHRoYXQgaXMgYSBjb3B5IG9mIHRoZSBjdXJyZW50IEZvbnQgCi0gICAgICogbW9kaWZpZWQgc28gdGhhdCB0aGUgc3R5bGUgaXMgdGhlIHNwZWNpZmllZCBzdHlsZS4KKyAgICAgKiBSZXR1cm5zIGEgbmV3IEZvbnQgdGhhdCBpcyBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgRm9udCBtb2RpZmllZCBzbyB0aGF0CisgICAgICogdGhlIHN0eWxlIGlzIHRoZSBzcGVjaWZpZWQgc3R5bGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHN0eWxlIHRoZSBzdHlsZSBvZiBmb250LgotICAgICAqIAorICAgICAqIEBwYXJhbSBzdHlsZQorICAgICAqICAgICAgICAgICAgdGhlIHN0eWxlIG9mIGZvbnQuCiAgICAgICogQHJldHVybiB0aGUgRm9udCBvYmplY3QuCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIEZvbnQgZGVyaXZlRm9udChpbnQgc3R5bGUpIHsKLSAgICAgICAgSGFzaHRhYmxlPEF0dHJpYnV0ZSwgT2JqZWN0PiBkZXJpdmVmUmVxdWVzdGVkQXR0cmlidXRlcyA9IChIYXNodGFibGU8QXR0cmlidXRlLCBPYmplY3Q+KSBmUmVxdWVzdGVkQXR0cmlidXRlcworICAgICAgICBIYXNodGFibGU8QXR0cmlidXRlLCBPYmplY3Q+IGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzID0gKEhhc2h0YWJsZTxBdHRyaWJ1dGUsIE9iamVjdD4pZlJlcXVlc3RlZEF0dHJpYnV0ZXMKICAgICAgICAgICAgICAgICAuY2xvbmUoKTsKIAogICAgICAgICBpZiAoKHN0eWxlICYgRm9udC5CT0xEKSAhPSAwKSB7Ci0gICAgICAgICAgICBkZXJpdmVmUmVxdWVzdGVkQXR0cmlidXRlcy5wdXQoVGV4dEF0dHJpYnV0ZS5XRUlHSFQsCi0gICAgICAgICAgICAgICAgICAgIFRleHRBdHRyaWJ1dGUuV0VJR0hUX0JPTEQpOworICAgICAgICAgICAgZGVyaXZlZlJlcXVlc3RlZEF0dHJpYnV0ZXMucHV0KFRleHRBdHRyaWJ1dGUuV0VJR0hULCBUZXh0QXR0cmlidXRlLldFSUdIVF9CT0xEKTsKICAgICAgICAgfSBlbHNlIGlmIChkZXJpdmVmUmVxdWVzdGVkQXR0cmlidXRlcy5nZXQoVGV4dEF0dHJpYnV0ZS5XRUlHSFQpICE9IG51bGwpIHsKICAgICAgICAgICAgIGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLnJlbW92ZShUZXh0QXR0cmlidXRlLldFSUdIVCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoKHN0eWxlICYgRm9udC5JVEFMSUMpICE9IDApIHsKLSAgICAgICAgICAgIGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLnB1dChUZXh0QXR0cmlidXRlLlBPU1RVUkUsCi0gICAgICAgICAgICAgICAgICAgIFRleHRBdHRyaWJ1dGUuUE9TVFVSRV9PQkxJUVVFKTsKKyAgICAgICAgICAgIGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLnB1dChUZXh0QXR0cmlidXRlLlBPU1RVUkUsIFRleHRBdHRyaWJ1dGUuUE9TVFVSRV9PQkxJUVVFKTsKICAgICAgICAgfSBlbHNlIGlmIChkZXJpdmVmUmVxdWVzdGVkQXR0cmlidXRlcy5nZXQoVGV4dEF0dHJpYnV0ZS5QT1NUVVJFKSAhPSBudWxsKSB7CiAgICAgICAgICAgICBkZXJpdmVmUmVxdWVzdGVkQXR0cmlidXRlcy5yZW1vdmUoVGV4dEF0dHJpYnV0ZS5QT1NUVVJFKTsKICAgICAgICAgfQpAQCAtNjI4LDEzICs2NTksMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IEZvbnQgdGhhdCBpcyBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgRm9udAotICAgICAqIG1vZGlmaWVkIHRvIG1hdGNoIHRoZSBzcGVjaWZpZWQgc3R5bGUgYW5kIHdpdGggdGhlIHNwZWNpZmllZAotICAgICAqIGFmZmluZSB0cmFuc2Zvcm0gYXBwbGllZCB0byBpdHMgZ2x5cGhzLgorICAgICAqIFJldHVybnMgYSBuZXcgRm9udCB0aGF0IGlzIGEgY29weSBvZiB0aGUgY3VycmVudCBGb250IG1vZGlmaWVkIHRvIG1hdGNoCisgICAgICogdGhlIHNwZWNpZmllZCBzdHlsZSBhbmQgd2l0aCB0aGUgc3BlY2lmaWVkIGFmZmluZSB0cmFuc2Zvcm0gYXBwbGllZCB0bworICAgICAqIGl0cyBnbHlwaHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHN0eWxlIHRoZSBzdHlsZSBvZiBmb250LgotICAgICAqIEBwYXJhbSB0cmFucyB0aGUgQWZmaW5lVHJhbnNmb3JtLgotICAgICAqIAorICAgICAqIEBwYXJhbSBzdHlsZQorICAgICAqICAgICAgICAgICAgdGhlIHN0eWxlIG9mIGZvbnQuCisgICAgICogQHBhcmFtIHRyYW5zCisgICAgICogICAgICAgICAgICB0aGUgQWZmaW5lVHJhbnNmb3JtLgogICAgICAqIEByZXR1cm4gdGhlIEZvbnQgb2JqZWN0LgogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQpAQCAtNjQ0LDUzICs2NzYsNDggQEAKICAgICAgICAgICAgIC8vIGF3dC45ND10cmFuc2Zvcm0gY2FuIG5vdCBiZSBudWxsCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0Ljk0IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KLSAgICAgICAgSGFzaHRhYmxlPEF0dHJpYnV0ZSwgT2JqZWN0PiBkZXJpdmVmUmVxdWVzdGVkQXR0cmlidXRlcyA9IChIYXNodGFibGU8QXR0cmlidXRlLCBPYmplY3Q+KSBmUmVxdWVzdGVkQXR0cmlidXRlcworICAgICAgICBIYXNodGFibGU8QXR0cmlidXRlLCBPYmplY3Q+IGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzID0gKEhhc2h0YWJsZTxBdHRyaWJ1dGUsIE9iamVjdD4pZlJlcXVlc3RlZEF0dHJpYnV0ZXMKICAgICAgICAgICAgICAgICAuY2xvbmUoKTsKIAogICAgICAgICBpZiAoKHN0eWxlICYgQk9MRCkgIT0gMCkgewotICAgICAgICAgICAgZGVyaXZlZlJlcXVlc3RlZEF0dHJpYnV0ZXMucHV0KFRleHRBdHRyaWJ1dGUuV0VJR0hULAotICAgICAgICAgICAgICAgICAgICBUZXh0QXR0cmlidXRlLldFSUdIVF9CT0xEKTsKKyAgICAgICAgICAgIGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLnB1dChUZXh0QXR0cmlidXRlLldFSUdIVCwgVGV4dEF0dHJpYnV0ZS5XRUlHSFRfQk9MRCk7CiAgICAgICAgIH0gZWxzZSBpZiAoZGVyaXZlZlJlcXVlc3RlZEF0dHJpYnV0ZXMuZ2V0KFRleHRBdHRyaWJ1dGUuV0VJR0hUKSAhPSBudWxsKSB7CiAgICAgICAgICAgICBkZXJpdmVmUmVxdWVzdGVkQXR0cmlidXRlcy5yZW1vdmUoVGV4dEF0dHJpYnV0ZS5XRUlHSFQpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKChzdHlsZSAmIElUQUxJQykgIT0gMCkgewotICAgICAgICAgICAgZGVyaXZlZlJlcXVlc3RlZEF0dHJpYnV0ZXMucHV0KFRleHRBdHRyaWJ1dGUuUE9TVFVSRSwKLSAgICAgICAgICAgICAgICAgICAgVGV4dEF0dHJpYnV0ZS5QT1NUVVJFX09CTElRVUUpOworICAgICAgICAgICAgZGVyaXZlZlJlcXVlc3RlZEF0dHJpYnV0ZXMucHV0KFRleHRBdHRyaWJ1dGUuUE9TVFVSRSwgVGV4dEF0dHJpYnV0ZS5QT1NUVVJFX09CTElRVUUpOwogICAgICAgICB9IGVsc2UgaWYgKGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLmdldChUZXh0QXR0cmlidXRlLlBPU1RVUkUpICE9IG51bGwpIHsKICAgICAgICAgICAgIGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLnJlbW92ZShUZXh0QXR0cmlidXRlLlBPU1RVUkUpOwogICAgICAgICB9Ci0gICAgICAgIGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLnB1dChUZXh0QXR0cmlidXRlLlRSQU5TRk9STSwKLSAgICAgICAgICAgICAgICBuZXcgVHJhbnNmb3JtQXR0cmlidXRlKHRyYW5zKSk7CisgICAgICAgIGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLnB1dChUZXh0QXR0cmlidXRlLlRSQU5TRk9STSwgbmV3IFRyYW5zZm9ybUF0dHJpYnV0ZSh0cmFucykpOwogCiAgICAgICAgIHJldHVybiBuZXcgRm9udChkZXJpdmVmUmVxdWVzdGVkQXR0cmlidXRlcyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBGb250IHRoYXQgaXMgYSBjb3B5IG9mIHRoZSBjdXJyZW50IEZvbnQgCi0gICAgICogbW9kaWZpZWQgc28gdGhhdCB0aGUgc2l6ZSBhbmQgc3R5bGUgYXJlIHRoZSBzcGVjaWZpZWQgCi0gICAgICogc2l6ZSBhbmQgc3R5bGUuCisgICAgICogUmV0dXJucyBhIG5ldyBGb250IHRoYXQgaXMgYSBjb3B5IG9mIHRoZSBjdXJyZW50IEZvbnQgbW9kaWZpZWQgc28gdGhhdAorICAgICAqIHRoZSBzaXplIGFuZCBzdHlsZSBhcmUgdGhlIHNwZWNpZmllZCBzaXplIGFuZCBzdHlsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3R5bGUgdGhlIHN0eWxlIG9mIGZvbnQuCi0gICAgICogQHBhcmFtIHNpemUgdGhlIHNpemUgb2YgZm9udC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3R5bGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHlsZSBvZiBmb250LgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgc2l6ZSBvZiBmb250LgogICAgICAqIEByZXR1cm4gdGhlIEZvbnQgb2JqZWN0LgogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyBGb250IGRlcml2ZUZvbnQoaW50IHN0eWxlLCBmbG9hdCBzaXplKSB7Ci0gICAgICAgIEhhc2h0YWJsZTxBdHRyaWJ1dGUsIE9iamVjdD4gZGVyaXZlZlJlcXVlc3RlZEF0dHJpYnV0ZXMgPSAoSGFzaHRhYmxlPEF0dHJpYnV0ZSwgT2JqZWN0PikgZlJlcXVlc3RlZEF0dHJpYnV0ZXMKKyAgICAgICAgSGFzaHRhYmxlPEF0dHJpYnV0ZSwgT2JqZWN0PiBkZXJpdmVmUmVxdWVzdGVkQXR0cmlidXRlcyA9IChIYXNodGFibGU8QXR0cmlidXRlLCBPYmplY3Q+KWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzCiAgICAgICAgICAgICAgICAgLmNsb25lKCk7CiAKICAgICAgICAgaWYgKChzdHlsZSAmIEJPTEQpICE9IDApIHsKLSAgICAgICAgICAgIGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLnB1dChUZXh0QXR0cmlidXRlLldFSUdIVCwKLSAgICAgICAgICAgICAgICAgICAgVGV4dEF0dHJpYnV0ZS5XRUlHSFRfQk9MRCk7CisgICAgICAgICAgICBkZXJpdmVmUmVxdWVzdGVkQXR0cmlidXRlcy5wdXQoVGV4dEF0dHJpYnV0ZS5XRUlHSFQsIFRleHRBdHRyaWJ1dGUuV0VJR0hUX0JPTEQpOwogICAgICAgICB9IGVsc2UgaWYgKGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLmdldChUZXh0QXR0cmlidXRlLldFSUdIVCkgIT0gbnVsbCkgewogICAgICAgICAgICAgZGVyaXZlZlJlcXVlc3RlZEF0dHJpYnV0ZXMucmVtb3ZlKFRleHRBdHRyaWJ1dGUuV0VJR0hUKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmICgoc3R5bGUgJiBJVEFMSUMpICE9IDApIHsKLSAgICAgICAgICAgIGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLnB1dChUZXh0QXR0cmlidXRlLlBPU1RVUkUsCi0gICAgICAgICAgICAgICAgICAgIFRleHRBdHRyaWJ1dGUuUE9TVFVSRV9PQkxJUVVFKTsKKyAgICAgICAgICAgIGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzLnB1dChUZXh0QXR0cmlidXRlLlBPU1RVUkUsIFRleHRBdHRyaWJ1dGUuUE9TVFVSRV9PQkxJUVVFKTsKICAgICAgICAgfSBlbHNlIGlmIChkZXJpdmVmUmVxdWVzdGVkQXR0cmlidXRlcy5nZXQoVGV4dEF0dHJpYnV0ZS5QT1NUVVJFKSAhPSBudWxsKSB7CiAgICAgICAgICAgICBkZXJpdmVmUmVxdWVzdGVkQXR0cmlidXRlcy5yZW1vdmUoVGV4dEF0dHJpYnV0ZS5QT1NUVVJFKTsKICAgICAgICAgfQpAQCAtNzAzLDE1ICs3MzAsMTUgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgbmV3IEZvbnQgb2JqZWN0IHdpdGggYSBuZXcgc2V0IG9mIGZvbnQgYXR0cmlidXRlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyB0aGUgbWFwIG9mIGF0dHJpYnV0ZXMuCi0gICAgICogCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXAgb2YgYXR0cmlidXRlcy4KICAgICAgKiBAcmV0dXJuIHRoZSBGb250LgogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyBGb250IGRlcml2ZUZvbnQoTWFwPD8gZXh0ZW5kcyBBdHRyaWJ1dGUsID8+IGF0dHJpYnV0ZXMpIHsKICAgICAgICAgQXR0cmlidXRlW10gYXZhbEF0dHJpYnV0ZXMgPSB0aGlzLmdldEF2YWlsYWJsZUF0dHJpYnV0ZXMoKTsKIAotICAgICAgICBIYXNodGFibGU8QXR0cmlidXRlLCBPYmplY3Q+IGRlcml2ZWZSZXF1ZXN0ZWRBdHRyaWJ1dGVzID0gKEhhc2h0YWJsZTxBdHRyaWJ1dGUsIE9iamVjdD4pIGZSZXF1ZXN0ZWRBdHRyaWJ1dGVzCisgICAgICAgIEhhc2h0YWJsZTxBdHRyaWJ1dGUsIE9iamVjdD4gZGVyaXZlZlJlcXVlc3RlZEF0dHJpYnV0ZXMgPSAoSGFzaHRhYmxlPEF0dHJpYnV0ZSwgT2JqZWN0PilmUmVxdWVzdGVkQXR0cmlidXRlcwogICAgICAgICAgICAgICAgIC5jbG9uZSgpOwogICAgICAgICBPYmplY3QgY3VyckF0dHJpYnV0ZTsKICAgICAgICAgZm9yIChBdHRyaWJ1dGUgZWxlbWVudCA6IGF2YWxBdHRyaWJ1dGVzKSB7CkBAIC03MjYsMTAgKzc1MywxMCBAQAogICAgIC8qKgogICAgICAqIENvbXBhcmVzIHRoZSBzcGVjaWZpZWQgT2JqZWN0IHdpdGggdGhlIGN1cnJlbnQgRm9udC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqIHRoZSBPYmplY3QgdG8gYmUgY29tcGFyZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIE9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiBGb250Ci0gICAgICogd2l0aCB0aGUgc2FtZSBmYW1pbHksIHNpemUsIGFuZCBzdHlsZSBhcyB0aGlzIEZvbnQsIGZhbHNlIG90aGVyd2lzZS4gCisgICAgICogQHBhcmFtIG9iagorICAgICAqICAgICAgICAgICAgdGhlIE9iamVjdCB0byBiZSBjb21wYXJlZC4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgT2JqZWN0IGlzIGFuIGluc3RhbmNlIG9mIEZvbnQgd2l0aCB0aGUKKyAgICAgKiAgICAgICAgIHNhbWUgZmFtaWx5LCBzaXplLCBhbmQgc3R5bGUgYXMgdGhpcyBGb250LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKQEAgLTczOSwxMSArNzY2LDEwIEBACiAKICAgICAgICAgaWYgKG9iaiAhPSBudWxsKSB7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEZvbnQgZm9udCA9IChGb250KSBvYmo7CisgICAgICAgICAgICAgICAgRm9udCBmb250ID0gKEZvbnQpb2JqOwogCiAgICAgICAgICAgICAgICAgcmV0dXJuICgodGhpcy5zdHlsZSA9PSBmb250LnN0eWxlKSAmJiAodGhpcy5zaXplID09IGZvbnQuc2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoaXMubmFtZS5lcXVhbHMoZm9udC5uYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHRoaXMucG9pbnRTaXplID09IGZvbnQucG9pbnRTaXplKSAmJiAodGhpcworICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5uYW1lLmVxdWFscyhmb250Lm5hbWUpICYmICh0aGlzLnBvaW50U2l6ZSA9PSBmb250LnBvaW50U2l6ZSkgJiYgKHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRUcmFuc2Zvcm0oKSkuZXF1YWxzKGZvbnQuZ2V0VHJhbnNmb3JtKCkpKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB9CkBAIC03NTksNyArNzg1LDcgQEAKICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgTWFwPFRleHRBdHRyaWJ1dGUsID8+IGdldEF0dHJpYnV0ZXMoKSB7Ci0gICAgICAgIHJldHVybiAoTWFwPFRleHRBdHRyaWJ1dGUsID8+KSBmUmVxdWVzdGVkQXR0cmlidXRlcy5jbG9uZSgpOworICAgICAgICByZXR1cm4gKE1hcDxUZXh0QXR0cmlidXRlLCA/PilmUmVxdWVzdGVkQXR0cmlidXRlcy5jbG9uZSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzY4LDE4ICs3OTQsMTkgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBrZXlzIGFycmF5IG9mIGFsbCBhdmFpbGFibGUgYXR0cmlidXRlcy4KICAgICAgKi8KICAgICBwdWJsaWMgQXR0cmlidXRlW10gZ2V0QXZhaWxhYmxlQXR0cmlidXRlcygpIHsKLSAgICAgICAgQXR0cmlidXRlW10gYXR0cnMgPSB7IFRleHRBdHRyaWJ1dGUuRkFNSUxZLCBUZXh0QXR0cmlidXRlLlBPU1RVUkUsCi0gICAgICAgICAgICAgICAgVGV4dEF0dHJpYnV0ZS5TSVpFLCBUZXh0QXR0cmlidXRlLlRSQU5TRk9STSwKLSAgICAgICAgICAgICAgICBUZXh0QXR0cmlidXRlLldFSUdIVCwgVGV4dEF0dHJpYnV0ZS5TVVBFUlNDUklQVCwKLSAgICAgICAgICAgICAgICBUZXh0QXR0cmlidXRlLldJRFRIIH07CisgICAgICAgIEF0dHJpYnV0ZVtdIGF0dHJzID0geworICAgICAgICAgICAgICAgIFRleHRBdHRyaWJ1dGUuRkFNSUxZLCBUZXh0QXR0cmlidXRlLlBPU1RVUkUsIFRleHRBdHRyaWJ1dGUuU0laRSwKKyAgICAgICAgICAgICAgICBUZXh0QXR0cmlidXRlLlRSQU5TRk9STSwgVGV4dEF0dHJpYnV0ZS5XRUlHSFQsIFRleHRBdHRyaWJ1dGUuU1VQRVJTQ1JJUFQsCisgICAgICAgICAgICAgICAgVGV4dEF0dHJpYnV0ZS5XSURUSAorICAgICAgICB9OwogICAgICAgICByZXR1cm4gYXR0cnM7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgYmFzZWxpbmUgZm9yIHRoaXMgY2hhcmFjdGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjIHRoZSBjaGFyYWN0ZXIuCi0gICAgICogCisgICAgICogQHBhcmFtIGMKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIuCiAgICAgICogQHJldHVybiB0aGUgYmFzZWxpbmUgZm9yIHRoaXMgY2hhcmFjdGVyLgogICAgICAqLwogICAgIHB1YmxpYyBieXRlIGdldEJhc2VsaW5lRm9yKGNoYXIgYykgewpAQCAtODAwLDE5ICs4MjcsMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmYW1pbHkgbmFtZSBvZiB0aGlzIEZvbnQgYXNzb2NpYXRlZCB3aXRoIAotICAgICAqIHRoZSBzcGVjaWZpZWQgbG9jYWxlLgorICAgICAqIFJldHVybnMgdGhlIGZhbWlseSBuYW1lIG9mIHRoaXMgRm9udCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIGxvY2FsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbCB0aGUgbG9jYWxlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZhbWlseSBuYW1lIG9mIHRoaXMgRm9udCBhc3NvY2lhdGVkIHdpdGggCi0gICAgICogdGhlIHNwZWNpZmllZCBsb2NhbGUuCisgICAgICogQHBhcmFtIGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBsb2NhbGUuCisgICAgICogQHJldHVybiB0aGUgZmFtaWx5IG5hbWUgb2YgdGhpcyBGb250IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICBsb2NhbGUuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRGYW1pbHkoTG9jYWxlIGwpIHsKICAgICAgICAgaWYgKGwgPT0gbnVsbCkgewogICAgICAgICAgICAgLy8gYXd0LjAxPSd7MH0nIHBhcmFtZXRlciBpcyBudWxsCi0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAiYXd0LjAxIiwgIkxvY2FsZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAorICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjAxIiwgIkxvY2FsZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBnZXRGYW1pbHkoKTsKICAgICB9CkBAIC04MjAsMTIgKzg0NiwxMiBAQAogICAgIC8qKgogICAgICAqIEdldHMgYSBGb250IHdpdGggdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgc2V0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIHRoZSBhdHRyaWJ1dGVzIHRvIGJlIGFzc2lnbmVkIHRvIHRoZSBuZXcgRm9udC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlcworICAgICAqICAgICAgICAgICAgdGhlIGF0dHJpYnV0ZXMgdG8gYmUgYXNzaWduZWQgdG8gdGhlIG5ldyBGb250LgogICAgICAqIEByZXR1cm4gdGhlIEZvbnQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBGb250IGdldEZvbnQoTWFwPD8gZXh0ZW5kcyBBdHRyaWJ1dGUsID8+IGF0dHJpYnV0ZXMpIHsKLSAgICAgICAgRm9udCBmbnQgPSAoRm9udCkgYXR0cmlidXRlcy5nZXQoVGV4dEF0dHJpYnV0ZS5GT05UKTsKKyAgICAgICAgRm9udCBmbnQgPSAoRm9udClhdHRyaWJ1dGVzLmdldChUZXh0QXR0cmlidXRlLkZPTlQpOwogICAgICAgICBpZiAoZm50ICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBmbnQ7CiAgICAgICAgIH0KQEAgLTgzMywxNCArODU5LDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhIEZvbnQgb2JqZWN0IGZyb20gdGhlIHN5c3RlbSBwcm9wZXJ0aWVzIGxpc3Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKLSAgICAgKiBvciByZXR1cm5zIHRoZSBzcGVjaWZpZWQgRm9udCBpZiB0aGVyZSBpcyBubyBzdWNoIHByb3BlcnR5LgorICAgICAqIEdldHMgYSBGb250IG9iamVjdCBmcm9tIHRoZSBzeXN0ZW0gcHJvcGVydGllcyBsaXN0IHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIG5hbWUgb3IgcmV0dXJucyB0aGUgc3BlY2lmaWVkIEZvbnQgaWYgdGhlcmUgaXMgbm8gc3VjaCBwcm9wZXJ0eS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3AgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBuYW1lLgotICAgICAqIEBwYXJhbSBmIHRoZSBGb250LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIEZvbnQgb2JqZWN0IGZyb20gdGhlIHN5c3RlbSBwcm9wZXJ0aWVzIGxpc3QgIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lCi0gICAgICogb3IgdGhlIHNwZWNpZmllZCBGb250IGlmIHRoZXJlIGlzIG5vIHN1Y2ggcHJvcGVydHkuCisgICAgICogQHBhcmFtIHNwCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IG5hbWUuCisgICAgICogQHBhcmFtIGYKKyAgICAgKiAgICAgICAgICAgIHRoZSBGb250LgorICAgICAqIEByZXR1cm4gdGhlIEZvbnQgb2JqZWN0IGZyb20gdGhlIHN5c3RlbSBwcm9wZXJ0aWVzIGxpc3Qgd2l0aCB0aGUKKyAgICAgKiAgICAgICAgIHNwZWNpZmllZCBuYW1lIG9yIHRoZSBzcGVjaWZpZWQgRm9udCBpZiB0aGVyZSBpcyBubyBzdWNoCisgICAgICogICAgICAgICBwcm9wZXJ0eS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEZvbnQgZ2V0Rm9udChTdHJpbmcgc3AsIEZvbnQgZikgewogICAgICAgICBTdHJpbmcgcHIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoc3ApOwpAQCAtODUxLDEyICs4NzksMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGEgRm9udCBvYmplY3QgZnJvbSB0aGUgc3lzdGVtIHByb3BlcnRpZXMgbGlzdCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKiBHZXRzIGEgRm9udCBvYmplY3QgZnJvbSB0aGUgc3lzdGVtIHByb3BlcnRpZXMgbGlzdCB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBuYW1lLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzcCB0aGUgc3lzdGVtIHByb3BlcnR5IG5hbWUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgRm9udCwgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBzaHVjaCBwcm9wZXJ0eQotICAgICAqIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiAKKyAgICAgKiBAcGFyYW0gc3AKKyAgICAgKiAgICAgICAgICAgIHRoZSBzeXN0ZW0gcHJvcGVydHkgbmFtZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBGb250LCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIHN1Y2ggcHJvcGVydHkgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICBuYW1lLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgRm9udCBnZXRGb250KFN0cmluZyBzcCkgewogICAgICAgICByZXR1cm4gZ2V0Rm9udChzcCwgbnVsbCk7CkBAIC04NzcsOCArOTA2LDggQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBmb250IG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgbG9jYWxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBsIHRoZSBsb2NhbGUuCi0gICAgICogCisgICAgICogQHBhcmFtIGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBsb2NhbGUuCiAgICAgICogQHJldHVybiB0aGUgZm9udCBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGxvY2FsZS4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldEZvbnROYW1lKExvY2FsZSBsKSB7CkBAIC04ODgsMzggKzkxNyw0NSBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBMaW5lTWV0cmljcyBvYmplY3QgY3JlYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2hhcnMgdGhlIGNoYXJzIGFycmF5LgotICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgb2Zmc2V0LgotICAgICAqIEBwYXJhbSBlbmQgdGhlIGVuZCBvZmZzZXQuCi0gICAgICogQHBhcmFtIGZyYyB0aGUgRm9udFJlbmRlckNvbnRleHQuCi0gICAgICogCisgICAgICogQHBhcmFtIGNoYXJzCisgICAgICogICAgICAgICAgICB0aGUgY2hhcnMgYXJyYXkuCisgICAgICogQHBhcmFtIHN0YXJ0CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgb2Zmc2V0LgorICAgICAqIEBwYXJhbSBlbmQKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbmQgb2Zmc2V0LgorICAgICAqIEBwYXJhbSBmcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBGb250UmVuZGVyQ29udGV4dC4KICAgICAgKiBAcmV0dXJuIHRoZSBMaW5lTWV0cmljcyBmb3IgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgogICAgICAqLwotICAgIHB1YmxpYyBMaW5lTWV0cmljcyBnZXRMaW5lTWV0cmljcyhjaGFyW10gY2hhcnMsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgIEZvbnRSZW5kZXJDb250ZXh0IGZyYykgeworICAgIHB1YmxpYyBMaW5lTWV0cmljcyBnZXRMaW5lTWV0cmljcyhjaGFyW10gY2hhcnMsIGludCBzdGFydCwgaW50IGVuZCwgRm9udFJlbmRlckNvbnRleHQgZnJjKSB7CiAgICAgICAgIGlmIChmcmMgPT0gbnVsbCkgewogICAgICAgICAgICAgLy8gYXd0LjAwPUZvbnRSZW5kZXJDb250ZXh0IGlzIG51bGwKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4wMCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgLy9Gb250TWV0cmljcyBmbSA9IEFuZHJvaWRHcmFwaGljczJELmdldEluc3RhbmNlKCkuZ2V0Rm9udE1ldHJpY3MoKTsKKyAgICAgICAgLy8gRm9udE1ldHJpY3MgZm0gPSBBbmRyb2lkR3JhcGhpY3MyRC5nZXRJbnN0YW5jZSgpLmdldEZvbnRNZXRyaWNzKCk7CiAgICAgICAgIEZvbnRNZXRyaWNzIGZtID0gbmV3IEZvbnRNZXRyaWNzSW1wbCh0aGlzKTsKLSAgICAgICAgZmxvYXRbXSBmbWV0ID0ge2ZtLmdldEFzY2VudCgpLCBmbS5nZXREZXNjZW50KCksIGZtLmdldExlYWRpbmcoKX07IAorICAgICAgICBmbG9hdFtdIGZtZXQgPSB7CisgICAgICAgICAgICAgICAgZm0uZ2V0QXNjZW50KCksIGZtLmdldERlc2NlbnQoKSwgZm0uZ2V0TGVhZGluZygpCisgICAgICAgIH07CiAgICAgICAgIHJldHVybiBuZXcgTGluZU1ldHJpY3NJbXBsKGNoYXJzLmxlbmd0aCwgZm1ldCwgbnVsbCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIExpbmVNZXRyaWNzIG9iamVjdCBjcmVhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpdGVyIHRoZSBDaGFyYWN0ZXJJdGVyYXRvci4KLSAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IG9mZnNldC4KLSAgICAgKiBAcGFyYW0gZW5kIHRoZSBlbmQgb2Zmc2V0LgotICAgICAqIEBwYXJhbSBmcmMgdGhlIEZvbnRSZW5kZXJDb250ZXh0LgotICAgICAqIAorICAgICAqIEBwYXJhbSBpdGVyCisgICAgICogICAgICAgICAgICB0aGUgQ2hhcmFjdGVySXRlcmF0b3IuCisgICAgICogQHBhcmFtIHN0YXJ0CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgb2Zmc2V0LgorICAgICAqIEBwYXJhbSBlbmQKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbmQgb2Zmc2V0LgorICAgICAqIEBwYXJhbSBmcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBGb250UmVuZGVyQ29udGV4dC4KICAgICAgKiBAcmV0dXJuIHRoZSBMaW5lTWV0cmljcyBmb3IgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgogICAgICAqLwotICAgIHB1YmxpYyBMaW5lTWV0cmljcyBnZXRMaW5lTWV0cmljcyhDaGFyYWN0ZXJJdGVyYXRvciBpdGVyLCBpbnQgc3RhcnQsCi0gICAgICAgICAgICBpbnQgZW5kLCBGb250UmVuZGVyQ29udGV4dCBmcmMpIHsKKyAgICBwdWJsaWMgTGluZU1ldHJpY3MgZ2V0TGluZU1ldHJpY3MoQ2hhcmFjdGVySXRlcmF0b3IgaXRlciwgaW50IHN0YXJ0LCBpbnQgZW5kLAorICAgICAgICAgICAgRm9udFJlbmRlckNvbnRleHQgZnJjKSB7CiAKICAgICAgICAgaWYgKGZyYyA9PSBudWxsKSB7CiAgICAgICAgICAgICAvLyBhd3QuMDA9Rm9udFJlbmRlckNvbnRleHQgaXMgbnVsbApAQCAtOTM1LDggKzk3MSw4IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjaGFyW10gY2hhcnMgPSBuZXcgY2hhcltpdGVyQ291bnRdOwogICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgZm9yIChjaGFyIGMgPSBpdGVyLnNldEluZGV4KHN0YXJ0KTsgYyAhPSBDaGFyYWN0ZXJJdGVyYXRvci5ET05FCi0gICAgICAgICAgICAgICAgICAgICYmIChpIDwgaXRlckNvdW50KTsgYyA9IGl0ZXIubmV4dCgpKSB7CisgICAgICAgICAgICBmb3IgKGNoYXIgYyA9IGl0ZXIuc2V0SW5kZXgoc3RhcnQpOyBjICE9IENoYXJhY3Rlckl0ZXJhdG9yLkRPTkUgJiYgKGkgPCBpdGVyQ291bnQpOyBjID0gaXRlcgorICAgICAgICAgICAgICAgICAgICAubmV4dCgpKSB7CiAgICAgICAgICAgICAgICAgY2hhcnNbaV0gPSBjOwogICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgIH0KQEAgLTk0OCwxNiArOTg0LDE5IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIExpbmVNZXRyaWNzIG9iamVjdCBjcmVhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzdHIgdGhlIFN0cmluZy4KLSAgICAgKiBAcGFyYW0gZnJjIHRoZSBGb250UmVuZGVyQ29udGV4dC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3RyCisgICAgICogICAgICAgICAgICB0aGUgU3RyaW5nLgorICAgICAqIEBwYXJhbSBmcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBGb250UmVuZGVyQ29udGV4dC4KICAgICAgKiBAcmV0dXJuIHRoZSBMaW5lTWV0cmljcyBmb3IgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgogICAgICAqLwogICAgIHB1YmxpYyBMaW5lTWV0cmljcyBnZXRMaW5lTWV0cmljcyhTdHJpbmcgc3RyLCBGb250UmVuZGVyQ29udGV4dCBmcmMpIHsKLSAgICAgICAgLy9Gb250TWV0cmljcyBmbSA9IEFuZHJvaWRHcmFwaGljczJELmdldEluc3RhbmNlKCkuZ2V0Rm9udE1ldHJpY3MoKTsKKyAgICAgICAgLy8gRm9udE1ldHJpY3MgZm0gPSBBbmRyb2lkR3JhcGhpY3MyRC5nZXRJbnN0YW5jZSgpLmdldEZvbnRNZXRyaWNzKCk7CiAgICAgICAgIEZvbnRNZXRyaWNzIGZtID0gbmV3IEZvbnRNZXRyaWNzSW1wbCh0aGlzKTsKLSAgICAgICAgZmxvYXRbXSBmbWV0ID0ge2ZtLmdldEFzY2VudCgpLCBmbS5nZXREZXNjZW50KCksIGZtLmdldExlYWRpbmcoKX07Ci0gICAgICAgIC8vTG9nLmkoIkZPTlQgRk1FVCIsIGZtZXQudG9TdHJpbmcoKSk7CisgICAgICAgIGZsb2F0W10gZm1ldCA9IHsKKyAgICAgICAgICAgICAgICBmbS5nZXRBc2NlbnQoKSwgZm0uZ2V0RGVzY2VudCgpLCBmbS5nZXRMZWFkaW5nKCkKKyAgICAgICAgfTsKKyAgICAgICAgLy8gTG9nLmkoIkZPTlQgRk1FVCIsIGZtZXQudG9TdHJpbmcoKSk7CiAgICAgICAgIHJldHVybiBuZXcgTGluZU1ldHJpY3NJbXBsKHN0ci5sZW5ndGgoKSwgZm1ldCwgbnVsbCk7CiAKICAgICB9CkBAIC05NjUsNDUgKzEwMDQsNDggQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgTGluZU1ldHJpY3Mgb2JqZWN0IGNyZWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHN0ciB0aGUgU3RyaW5nLgotICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgb2Zmc2V0LgotICAgICAqIEBwYXJhbSBlbmQgdGhlIGVuZCBvZmZzZXQuCi0gICAgICogQHBhcmFtIGZyYyB0aGUgRm9udFJlbmRlckNvbnRleHQuCi0gICAgICogCisgICAgICogQHBhcmFtIHN0cgorICAgICAqICAgICAgICAgICAgdGhlIFN0cmluZy4KKyAgICAgKiBAcGFyYW0gc3RhcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBvZmZzZXQuCisgICAgICogQHBhcmFtIGVuZAorICAgICAqICAgICAgICAgICAgdGhlIGVuZCBvZmZzZXQuCisgICAgICogQHBhcmFtIGZyYworICAgICAqICAgICAgICAgICAgdGhlIEZvbnRSZW5kZXJDb250ZXh0LgogICAgICAqIEByZXR1cm4gdGhlIExpbmVNZXRyaWNzIGZvciB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCiAgICAgICovCi0gICAgcHVibGljIExpbmVNZXRyaWNzIGdldExpbmVNZXRyaWNzKFN0cmluZyBzdHIsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgIEZvbnRSZW5kZXJDb250ZXh0IGZyYykgeworICAgIHB1YmxpYyBMaW5lTWV0cmljcyBnZXRMaW5lTWV0cmljcyhTdHJpbmcgc3RyLCBpbnQgc3RhcnQsIGludCBlbmQsIEZvbnRSZW5kZXJDb250ZXh0IGZyYykgewogICAgICAgICByZXR1cm4gdGhpcy5nZXRMaW5lTWV0cmljcyhzdHIuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpLCBmcmMpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGxvZ2ljYWwgYm91bmRzIG9mIHRoZSBzcGVjaWZpZWQgU3RyaW5nIGluIAotICAgICAqIHRoZSBzcGVjaWZpZWQgRm9udFJlbmRlckNvbnRleHQuIFRoZSBsb2dpY2FsIGJvdW5kcyBjb250YWlucyAKLSAgICAgKiB0aGUgb3JpZ2luLCBhc2NlbnQsIGFkdmFuY2UsIGFuZCBoZWlnaHQuCisgICAgICogR2V0cyB0aGUgbG9naWNhbCBib3VuZHMgb2YgdGhlIHNwZWNpZmllZCBTdHJpbmcgaW4gdGhlIHNwZWNpZmllZAorICAgICAqIEZvbnRSZW5kZXJDb250ZXh0LiBUaGUgbG9naWNhbCBib3VuZHMgY29udGFpbnMgdGhlIG9yaWdpbiwgYXNjZW50LAorICAgICAqIGFkdmFuY2UsIGFuZCBoZWlnaHQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNpIHRoZSBzcGVjaWZpZWQgQ2hhcmFjdGVySXRlcmF0b3IuCi0gICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBvZmZzZXQuCi0gICAgICogQHBhcmFtIGVuZCB0aGUgZW5kIG9mZnNldC4KLSAgICAgKiBAcGFyYW0gZnJjIHRoZSBGb250UmVuZGVyQ29udGV4dC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2kKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgQ2hhcmFjdGVySXRlcmF0b3IuCisgICAgICogQHBhcmFtIHN0YXJ0CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgb2Zmc2V0LgorICAgICAqIEBwYXJhbSBlbmQKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbmQgb2Zmc2V0LgorICAgICAqIEBwYXJhbSBmcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBGb250UmVuZGVyQ29udGV4dC4KICAgICAgKiBAcmV0dXJuIGEgUmVjdGFuZ2xlMkQgb2JqZWN0LgogICAgICAqLwotICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRTdHJpbmdCb3VuZHMoQ2hhcmFjdGVySXRlcmF0b3IgY2ksIGludCBzdGFydCwKLSAgICAgICAgICAgIGludCBlbmQsIEZvbnRSZW5kZXJDb250ZXh0IGZyYykgeworICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRTdHJpbmdCb3VuZHMoQ2hhcmFjdGVySXRlcmF0b3IgY2ksIGludCBzdGFydCwgaW50IGVuZCwKKyAgICAgICAgICAgIEZvbnRSZW5kZXJDb250ZXh0IGZyYykgewogICAgICAgICBpbnQgZmlyc3QgPSBjaS5nZXRCZWdpbkluZGV4KCk7CiAgICAgICAgIGludCBmaW5pc2ggPSBjaS5nZXRFbmRJbmRleCgpOwogICAgICAgICBjaGFyW10gY2hhcnM7CiAKICAgICAgICAgaWYgKHN0YXJ0IDwgZmlyc3QpIHsKICAgICAgICAgICAgIC8vIGF3dC45NT1Xcm9uZyBzdGFydCBpbmRleDogezB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICJhd3QuOTUiLCBzdGFydCkpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC45NSIsIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogICAgICAgICBpZiAoZW5kID4gZmluaXNoKSB7CiAgICAgICAgICAgICAvLyBhd3QuOTY9V3JvbmcgZmluaXNoIGluZGV4OiB7MH0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgImF3dC45NiIsIGVuZCkpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC45NiIsIGVuZCkpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KICAgICAgICAgaWYgKHN0YXJ0ID4gZW5kKSB7CiAgICAgICAgICAgICAvLyBhd3QuOTc9V3JvbmcgcmFuZ2UgbGVuZ3RoOiB7MH0KQEAgLTEwMjgsMTMgKzEwNzAsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsb2dpY2FsIGJvdW5kcyBvZiB0aGUgc3BlY2lmaWVkIFN0cmluZyBpbiAKLSAgICAgKiB0aGUgc3BlY2lmaWVkIEZvbnRSZW5kZXJDb250ZXh0LiBUaGUgbG9naWNhbCBib3VuZHMgY29udGFpbnMgCi0gICAgICogdGhlIG9yaWdpbiwgYXNjZW50LCBhZHZhbmNlLCBhbmQgaGVpZ2h0LgorICAgICAqIEdldHMgdGhlIGxvZ2ljYWwgYm91bmRzIG9mIHRoZSBzcGVjaWZpZWQgU3RyaW5nIGluIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBGb250UmVuZGVyQ29udGV4dC4gVGhlIGxvZ2ljYWwgYm91bmRzIGNvbnRhaW5zIHRoZSBvcmlnaW4sIGFzY2VudCwKKyAgICAgKiBhZHZhbmNlLCBhbmQgaGVpZ2h0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBzdHIgdGhlIHNwZWNpZmllZCBTdHJpbmcuCi0gICAgICogQHBhcmFtIGZyYyB0aGUgRm9udFJlbmRlckNvbnRleHQuCi0gICAgICogCisgICAgICogQHBhcmFtIHN0cgorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBTdHJpbmcuCisgICAgICogQHBhcmFtIGZyYworICAgICAqICAgICAgICAgICAgdGhlIEZvbnRSZW5kZXJDb250ZXh0LgogICAgICAqIEByZXR1cm4gYSBSZWN0YW5nbGUyRCBvYmplY3QuCiAgICAgICovCiAgICAgcHVibGljIFJlY3RhbmdsZTJEIGdldFN0cmluZ0JvdW5kcyhTdHJpbmcgc3RyLCBGb250UmVuZGVyQ29udGV4dCBmcmMpIHsKQEAgLTEwNDQsNDYgKzEwODcsNDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsb2dpY2FsIGJvdW5kcyBvZiB0aGUgc3BlY2lmaWVkIFN0cmluZyBpbiAKLSAgICAgKiB0aGUgc3BlY2lmaWVkIEZvbnRSZW5kZXJDb250ZXh0LiBUaGUgbG9naWNhbCBib3VuZHMgY29udGFpbnMgCi0gICAgICogdGhlIG9yaWdpbiwgYXNjZW50LCBhZHZhbmNlLCBhbmQgaGVpZ2h0LgorICAgICAqIEdldHMgdGhlIGxvZ2ljYWwgYm91bmRzIG9mIHRoZSBzcGVjaWZpZWQgU3RyaW5nIGluIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBGb250UmVuZGVyQ29udGV4dC4gVGhlIGxvZ2ljYWwgYm91bmRzIGNvbnRhaW5zIHRoZSBvcmlnaW4sIGFzY2VudCwKKyAgICAgKiBhZHZhbmNlLCBhbmQgaGVpZ2h0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBzdHIgdGhlIHNwZWNpZmllZCBTdHJpbmcuCi0gICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBvZmZzZXQuCi0gICAgICogQHBhcmFtIGVuZCB0aGUgZW5kIG9mZnNldC4KLSAgICAgKiBAcGFyYW0gZnJjIHRoZSBGb250UmVuZGVyQ29udGV4dC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3RyCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIFN0cmluZy4KKyAgICAgKiBAcGFyYW0gc3RhcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBvZmZzZXQuCisgICAgICogQHBhcmFtIGVuZAorICAgICAqICAgICAgICAgICAgdGhlIGVuZCBvZmZzZXQuCisgICAgICogQHBhcmFtIGZyYworICAgICAqICAgICAgICAgICAgdGhlIEZvbnRSZW5kZXJDb250ZXh0LgogICAgICAqIEByZXR1cm4gYSBSZWN0YW5nbGUyRCBvYmplY3QuCiAgICAgICovCi0gICAgcHVibGljIFJlY3RhbmdsZTJEIGdldFN0cmluZ0JvdW5kcyhTdHJpbmcgc3RyLCBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICBGb250UmVuZGVyQ29udGV4dCBmcmMpIHsKKyAgICBwdWJsaWMgUmVjdGFuZ2xlMkQgZ2V0U3RyaW5nQm91bmRzKFN0cmluZyBzdHIsIGludCBzdGFydCwgaW50IGVuZCwgRm9udFJlbmRlckNvbnRleHQgZnJjKSB7CiAKICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQm91bmRzKChzdHIuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpKSwgZnJjKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsb2dpY2FsIGJvdW5kcyBvZiB0aGUgc3BlY2lmaWVkIFN0cmluZyBpbiAKLSAgICAgKiB0aGUgc3BlY2lmaWVkIEZvbnRSZW5kZXJDb250ZXh0LiBUaGUgbG9naWNhbCBib3VuZHMgY29udGFpbnMgCi0gICAgICogdGhlIG9yaWdpbiwgYXNjZW50LCBhZHZhbmNlLCBhbmQgaGVpZ2h0LgorICAgICAqIEdldHMgdGhlIGxvZ2ljYWwgYm91bmRzIG9mIHRoZSBzcGVjaWZpZWQgU3RyaW5nIGluIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBGb250UmVuZGVyQ29udGV4dC4gVGhlIGxvZ2ljYWwgYm91bmRzIGNvbnRhaW5zIHRoZSBvcmlnaW4sIGFzY2VudCwKKyAgICAgKiBhZHZhbmNlLCBhbmQgaGVpZ2h0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBjaGFycyB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBhcnJheS4KLSAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IG9mZnNldC4KLSAgICAgKiBAcGFyYW0gZW5kIHRoZSBlbmQgb2Zmc2V0LgotICAgICAqIEBwYXJhbSBmcmMgdGhlIEZvbnRSZW5kZXJDb250ZXh0LgotICAgICAqIAorICAgICAqIEBwYXJhbSBjaGFycworICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXJyYXkuCisgICAgICogQHBhcmFtIHN0YXJ0CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgb2Zmc2V0LgorICAgICAqIEBwYXJhbSBlbmQKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbmQgb2Zmc2V0LgorICAgICAqIEBwYXJhbSBmcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBGb250UmVuZGVyQ29udGV4dC4KICAgICAgKiBAcmV0dXJuIGEgUmVjdGFuZ2xlMkQgb2JqZWN0LgogICAgICAqLwotICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRTdHJpbmdCb3VuZHMoY2hhcltdIGNoYXJzLCBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICBGb250UmVuZGVyQ29udGV4dCBmcmMpIHsKKyAgICBwdWJsaWMgUmVjdGFuZ2xlMkQgZ2V0U3RyaW5nQm91bmRzKGNoYXJbXSBjaGFycywgaW50IHN0YXJ0LCBpbnQgZW5kLCBGb250UmVuZGVyQ29udGV4dCBmcmMpIHsKICAgICAgICAgaWYgKHN0YXJ0IDwgMCkgewogICAgICAgICAgICAgLy8gYXd0Ljk1PVdyb25nIHN0YXJ0IGluZGV4OiB7MH0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgImF3dC45NSIsIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0Ljk1Iiwgc3RhcnQpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAgICAgICAgIGlmIChlbmQgPiBjaGFycy5sZW5ndGgpIHsKICAgICAgICAgICAgIC8vIGF3dC45Nj1Xcm9uZyBmaW5pc2ggaW5kZXg6IHswfQotICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAiYXd0Ljk2IiwgZW5kKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0Ljk2IiwgZW5kKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogICAgICAgICBpZiAoc3RhcnQgPiBlbmQpIHsKICAgICAgICAgICAgIC8vIGF3dC45Nz1Xcm9uZyByYW5nZSBsZW5ndGg6IHswfQpAQCAtMTA5NSw3ICsxMTQwLDcgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4wMCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgRm9udFBlZXJJbXBsIHBlZXIgPSAoRm9udFBlZXJJbXBsKSB0aGlzLmdldFBlZXIoKTsKKyAgICAgICAgRm9udFBlZXJJbXBsIHBlZXIgPSAoRm9udFBlZXJJbXBsKXRoaXMuZ2V0UGVlcigpOwogCiAgICAgICAgIGZpbmFsIGludCBUUkFOU0ZPUk1fTUFTSyA9IEFmZmluZVRyYW5zZm9ybS5UWVBFX0dFTkVSQUxfUk9UQVRJT04KICAgICAgICAgICAgICAgICB8IEFmZmluZVRyYW5zZm9ybS5UWVBFX0dFTkVSQUxfVFJBTlNGT1JNOwpAQCAtMTExMCwxMyArMTE1NSwxMyBAQAogICAgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgICAgICAgICAgICB3aWR0aCArPSBwZWVyLmNoYXJXaWR0aChjaGFyc1tpXSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL0xpbmVNZXRyaWNzIG5sbSA9IHBlZXIuZ2V0TGluZU1ldHJpY3MoKTsKLSAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gTGluZU1ldHJpY3MgbmxtID0gcGVlci5nZXRMaW5lTWV0cmljcygpOworCiAgICAgICAgICAgICBMaW5lTWV0cmljcyBubG0gPSBnZXRMaW5lTWV0cmljcyhjaGFycywgc3RhcnQsIGVuZCwgZnJjKTsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBib3VuZHMgPSB0cmFuc2Zvcm0uY3JlYXRlVHJhbnNmb3JtZWRTaGFwZSgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFJlY3RhbmdsZTJELkZsb2F0KDAsIC1ubG0uZ2V0QXNjZW50KCksIHdpZHRoLCBubG0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SGVpZ2h0KCkpKS5nZXRCb3VuZHMyRCgpOworICAgICAgICAgICAgICAgICAgICBuZXcgUmVjdGFuZ2xlMkQuRmxvYXQoMCwgLW5sbS5nZXRBc2NlbnQoKSwgd2lkdGgsIG5sbS5nZXRIZWlnaHQoKSkpCisgICAgICAgICAgICAgICAgICAgIC5nZXRCb3VuZHMyRCgpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaW50IGxlbiA9IGVuZCAtIHN0YXJ0OwogICAgICAgICAgICAgY2hhcltdIHN1YkNoYXJzID0gbmV3IGNoYXJbbGVuXTsKQEAgLTExMjcsMTEgKzExNzIsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjaGFyYWN0ZXIncyBtYXhpbXVtIGJvdW5kcyBhcyBkZWZpbmVkIGluIAotICAgICAqIHRoZSBzcGVjaWZpZWQgRm9udFJlbmRlckNvbnRleHQuCisgICAgICogR2V0cyB0aGUgY2hhcmFjdGVyJ3MgbWF4aW11bSBib3VuZHMgYXMgZGVmaW5lZCBpbiB0aGUgc3BlY2lmaWVkCisgICAgICogRm9udFJlbmRlckNvbnRleHQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGZyYyB0aGUgRm9udFJlbmRlckNvbnRleHQuCi0gICAgICogCisgICAgICogQHBhcmFtIGZyYworICAgICAqICAgICAgICAgICAgdGhlIEZvbnRSZW5kZXJDb250ZXh0LgogICAgICAqIEByZXR1cm4gdGhlIGNoYXJhY3RlcidzIG1heGltdW0gYm91bmRzLgogICAgICAqLwogICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRNYXhDaGFyQm91bmRzKEZvbnRSZW5kZXJDb250ZXh0IGZyYykgewpAQCAtMTE0MCw3ICsxMTg1LDcgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4wMCIpKTsgLy8kTk9OLU5MUy0xJCAKICAgICAgICAgfQogCi0gICAgICAgIEZvbnRQZWVySW1wbCBwZWVyID0gKEZvbnRQZWVySW1wbCkgdGhpcy5nZXRQZWVyKCk7CisgICAgICAgIEZvbnRQZWVySW1wbCBwZWVyID0gKEZvbnRQZWVySW1wbCl0aGlzLmdldFBlZXIoKTsKIAogICAgICAgICBSZWN0YW5nbGUyRCBib3VuZHMgPSBwZWVyLmdldE1heENoYXJCb3VuZHMoZnJjKTsKICAgICAgICAgQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybSA9IGdldFRyYW5zZm9ybSgpOwpAQCAtMTE1NSw0MiArMTIwMCw0MCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgR2x5cGhWZWN0b3Igb2JqZWN0IHBlcmZvcm1pbmcgZnVsbCBsYXlvdXQgb2YKLSAgICAgKiB0aGUgdGV4dC4KKyAgICAgKiBSZXR1cm5zIGEgbmV3IEdseXBoVmVjdG9yIG9iamVjdCBwZXJmb3JtaW5nIGZ1bGwgbGF5b3V0IG9mIHRoZSB0ZXh0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBmcmMgdGhlIEZvbnRSZW5kZXJDb250ZXh0LgotICAgICAqIEBwYXJhbSBjaGFycyB0aGUgY2hhcmFjdGVyIGFycmF5IHRvIGJlIGxheW91dC4KLSAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUgdGV4dCB0byB1c2UgZm9yIAotICAgICAqIHRoZSBHbHlwaFZlY3Rvci4KLSAgICAgKiBAcGFyYW0gY291bnQgdGhlIGNvdW50IG9mIGNoYXJhY3RlcnMgdG8gdXNlIGZvciAKLSAgICAgKiB0aGUgR2x5cGhWZWN0b3IuCi0gICAgICogQHBhcmFtIGZsYWdzIHRoZSBmbGFnIGluZGljYXRpbmcgdGV4dCBkaXJlY3Rpb246IAotICAgICAqIExBWU9VVF9SSUdIVF9UT19MRUZULCBMQVlPVVRfTEVGVF9UT19SSUdIVC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZnJjCisgICAgICogICAgICAgICAgICB0aGUgRm9udFJlbmRlckNvbnRleHQuCisgICAgICogQHBhcmFtIGNoYXJzCisgICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIGFycmF5IHRvIGJlIGxheW91dC4KKyAgICAgKiBAcGFyYW0gc3RhcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIHRleHQgdG8gdXNlIGZvciB0aGUgR2x5cGhWZWN0b3IuCisgICAgICogQHBhcmFtIGNvdW50CisgICAgICogICAgICAgICAgICB0aGUgY291bnQgb2YgY2hhcmFjdGVycyB0byB1c2UgZm9yIHRoZSBHbHlwaFZlY3Rvci4KKyAgICAgKiBAcGFyYW0gZmxhZ3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbGFnIGluZGljYXRpbmcgdGV4dCBkaXJlY3Rpb246IExBWU9VVF9SSUdIVF9UT19MRUZULAorICAgICAqICAgICAgICAgICAgTEFZT1VUX0xFRlRfVE9fUklHSFQuCiAgICAgICogQHJldHVybiB0aGUgR2x5cGhWZWN0b3IuCiAgICAgICovCi0gICAgcHVibGljIEdseXBoVmVjdG9yIGxheW91dEdseXBoVmVjdG9yKEZvbnRSZW5kZXJDb250ZXh0IGZyYywgY2hhcltdIGNoYXJzLAotICAgICAgICAgICAgaW50IHN0YXJ0LCBpbnQgY291bnQsIGludCBmbGFncykgeworICAgIHB1YmxpYyBHbHlwaFZlY3RvciBsYXlvdXRHbHlwaFZlY3RvcihGb250UmVuZGVyQ29udGV4dCBmcmMsIGNoYXJbXSBjaGFycywgaW50IHN0YXJ0LCBpbnQgY291bnQsCisgICAgICAgICAgICBpbnQgZmxhZ3MpIHsKICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IG1ldGhvZCBmb3IgYmlkaXJlY3Rpb25hbCB0ZXh0LgogICAgICAgICAvLyBBdCB0aGUgbW9tZW50IG9ubHkgTFRSIGFuZCBSVEwgdGV4dHMgc3VwcG9ydGVkLgogICAgICAgICBpZiAoc3RhcnQgPCAwKSB7CiAgICAgICAgICAgICAvLyBhd3QuOTU9V3Jvbmcgc3RhcnQgaW5kZXg6IHswfQotICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICJhd3QuOTUiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0Ljk1IiwgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAgICAgICBzdGFydCkpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGNvdW50IDwgMCkgewogICAgICAgICAgICAgLy8gYXd0Ljk4PVdyb25nIGNvdW50IHZhbHVlLCBjYW4gbm90IGJlIG5lZ2F0aXZlOiB7MH0KLSAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAiYXd0Ljk4IiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC45OCIsIC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgICAgICAgICAgY291bnQpKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChzdGFydCArIGNvdW50ID4gY2hhcnMubGVuZ3RoKSB7CiAgICAgICAgICAgICAvLyBhd3QuOTk9V3JvbmcgW3N0YXJ0ICsgY291bnRdIGlzIG91dCBvZiByYW5nZTogezB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgImF3dC45OSIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuOTkiLCAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICAgICAgICAgIChzdGFydCArIGNvdW50KSkpOwogICAgICAgICB9CiAKQEAgLTEyMzQsNyArMTI3Nyw3IEBACiAgICAgICogQHJldHVybiB0aGUgcG9zdHNjcmlwdCBuYW1lIG9mIHRoaXMgRm9udC4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFBTTmFtZSgpIHsKLSAgICAgICAgRm9udFBlZXJJbXBsIHBlZXIgPSAoRm9udFBlZXJJbXBsKSB0aGlzLmdldFBlZXIoKTsKKyAgICAgICAgRm9udFBlZXJJbXBsIHBlZXIgPSAoRm9udFBlZXJJbXBsKXRoaXMuZ2V0UGVlcigpOwogICAgICAgICByZXR1cm4gcGVlci5nZXRQU05hbWUoKTsKICAgICB9CiAKQEAgLTEyNTEsMzkgKzEyOTQsMzcgQEAKICAgICAgKiBHZXRzIHRoZSBwZWVyIG9mIHRoaXMgRm9udC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBwZWVyIG9mIHRoaXMgRm9udC4KLSAgICAgKiAKICAgICAgKiBAZGVwcmVjYXRlZCBGb250IHJlbmRlcmluZyBpcyBwbGF0Zm9ybSBpbmRlcGVuZGVudCBub3cuCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgamF2YS5hd3QucGVlci5Gb250UGVlciBnZXRQZWVyKCkgewogICAgICAgICBpZiAoZm9udFBlZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgZm9udFBlZXIgPSAoRm9udFBlZXJJbXBsKSBUb29sa2l0LmdldERlZmF1bHRUb29sa2l0KCkKLSAgICAgICAgICAgICAgICAgICAgLmdldEdyYXBoaWNzRmFjdG9yeSgpLmdldEZvbnRQZWVyKHRoaXMpOworICAgICAgICAgICAgZm9udFBlZXIgPSAoRm9udFBlZXJJbXBsKVRvb2xraXQuZ2V0RGVmYXVsdFRvb2xraXQoKS5nZXRHcmFwaGljc0ZhY3RvcnkoKS5nZXRGb250UGVlcigKKyAgICAgICAgICAgICAgICAgICAgdGhpcyk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZvbnRQZWVyOwogCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdHJhbnNmb3JtIGFjdGluZyBvbiB0aGlzIEZvbnQgKGZyb20gdGhlIEZvbnQncyAKLSAgICAgKiBhdHRyaWJ1dGVzKS4KKyAgICAgKiBHZXRzIHRoZSB0cmFuc2Zvcm0gYWN0aW5nIG9uIHRoaXMgRm9udCAoZnJvbSB0aGUgRm9udCdzIGF0dHJpYnV0ZXMpLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHRyYW5zZm9ybWF0aW9uIG9mIHRoaXMgRm9udC4gCisgICAgICogQHJldHVybiB0aGUgdHJhbnNmb3JtYXRpb24gb2YgdGhpcyBGb250LgogICAgICAqLwogICAgIHB1YmxpYyBBZmZpbmVUcmFuc2Zvcm0gZ2V0VHJhbnNmb3JtKCkgewogICAgICAgICBPYmplY3QgdHJhbnNmb3JtID0gZlJlcXVlc3RlZEF0dHJpYnV0ZXMuZ2V0KFRleHRBdHRyaWJ1dGUuVFJBTlNGT1JNKTsKIAogICAgICAgICBpZiAodHJhbnNmb3JtICE9IG51bGwpIHsKICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm0gaW5zdGFuY2VvZiBUcmFuc2Zvcm1BdHRyaWJ1dGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChUcmFuc2Zvcm1BdHRyaWJ1dGUpIHRyYW5zZm9ybSkuZ2V0VHJhbnNmb3JtKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoVHJhbnNmb3JtQXR0cmlidXRlKXRyYW5zZm9ybSkuZ2V0VHJhbnNmb3JtKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAodHJhbnNmb3JtIGluc3RhbmNlb2YgQWZmaW5lVHJhbnNmb3JtKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBZmZpbmVUcmFuc2Zvcm0oKEFmZmluZVRyYW5zZm9ybSkgdHJhbnNmb3JtKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFmZmluZVRyYW5zZm9ybSgoQWZmaW5lVHJhbnNmb3JtKXRyYW5zZm9ybSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0cmFuc2Zvcm0gPSBuZXcgQWZmaW5lVHJhbnNmb3JtKCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChBZmZpbmVUcmFuc2Zvcm0pIHRyYW5zZm9ybTsKKyAgICAgICAgcmV0dXJuIChBZmZpbmVUcmFuc2Zvcm0pdHJhbnNmb3JtOwogCiAgICAgfQogCkBAIC0xMzI0LDEzICsxMzY1LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgRm9udCBoYXMgdW5pZm9ybSBsaW5lIG1ldHJpY3MuIAorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIEZvbnQgaGFzIHVuaWZvcm0gbGluZSBtZXRyaWNzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIEZvbnQgaGFzIHVuaWZvcm0gbGluZSBtZXRyaWNzLCAKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgRm9udCBoYXMgdW5pZm9ybSBsaW5lIG1ldHJpY3MsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBoYXNVbmlmb3JtTGluZU1ldHJpY3MoKSB7Ci0gICAgICAgIEZvbnRQZWVySW1wbCBwZWVyID0gKEZvbnRQZWVySW1wbCkgdGhpcy5nZXRQZWVyKCk7CisgICAgICAgIEZvbnRQZWVySW1wbCBwZWVyID0gKEZvbnRQZWVySW1wbCl0aGlzLmdldFBlZXIoKTsKICAgICAgICAgcmV0dXJuIHBlZXIuaGFzVW5pZm9ybUxpbmVNZXRyaWNzKCk7CiAgICAgfQogCkBAIC0xMzM4LDcgKzEzNzgsNiBAQAogICAgICAqIFJldHVybnMgaGFzaCBjb2RlIG9mIHRoaXMgRm9udCBvYmplY3QuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgaGFzaCBjb2RlIG9mIHRoaXMgRm9udCBvYmplY3QuCi0KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewpAQCAtMTM3NiwyMSArMTQxNSwyMSBAQAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TnVtR2x5cGhzKCkgewogICAgICAgICBpZiAobnVtR2x5cGhzID09IC0xKSB7Ci0gICAgICAgICAgICBGb250UGVlckltcGwgcGVlciA9IChGb250UGVlckltcGwpIHRoaXMuZ2V0UGVlcigpOworICAgICAgICAgICAgRm9udFBlZXJJbXBsIHBlZXIgPSAoRm9udFBlZXJJbXBsKXRoaXMuZ2V0UGVlcigpOwogICAgICAgICAgICAgdGhpcy5udW1HbHlwaHMgPSBwZWVyLmdldE51bUdseXBocygpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiB0aGlzLm51bUdseXBoczsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBnbHlwaENvZGUgd2hpY2ggaXMgdXNlZCBhcyBkZWZhdWx0IGdseXBoIHdoZW4gdGhpcyBGb250Ci0gICAgICogZG9lcyBub3QgaGF2ZSBhIGdseXBoIGZvciBhIHNwZWNpZmllZCB1bmljb2RlLgorICAgICAqIEdldHMgdGhlIGdseXBoQ29kZSB3aGljaCBpcyB1c2VkIGFzIGRlZmF1bHQgZ2x5cGggd2hlbiB0aGlzIEZvbnQgZG9lcyBub3QKKyAgICAgKiBoYXZlIGEgZ2x5cGggZm9yIGEgc3BlY2lmaWVkIFVuaWNvZGUuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgbWlzc2luZyBnbHlwaCBjb2RlLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TWlzc2luZ0dseXBoQ29kZSgpIHsKICAgICAgICAgaWYgKG1pc3NpbmdHbHlwaENvZGUgPT0gLTEpIHsKLSAgICAgICAgICAgIEZvbnRQZWVySW1wbCBwZWVyID0gKEZvbnRQZWVySW1wbCkgdGhpcy5nZXRQZWVyKCk7CisgICAgICAgICAgICBGb250UGVlckltcGwgcGVlciA9IChGb250UGVlckltcGwpdGhpcy5nZXRQZWVyKCk7CiAgICAgICAgICAgICB0aGlzLm1pc3NpbmdHbHlwaENvZGUgPSBwZWVyLmdldE1pc3NpbmdHbHlwaENvZGUoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gdGhpcy5taXNzaW5nR2x5cGhDb2RlOwpAQCAtMTQwNywyOSArMTQ0NiwzMCBAQAogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgaXRhbGljIGFuZ2xlIG9mIHRoaXMgRm9udC4KLSAgICAgICogCisgICAgICogCiAgICAgICogQHJldHVybiB0aGUgaXRhbGljIGFuZ2xlIG9mIHRoaXMgRm9udC4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0SXRhbGljQW5nbGUoKSB7Ci0gICAgICAgIEZvbnRQZWVySW1wbCBwZWVyID0gKEZvbnRQZWVySW1wbCkgdGhpcy5nZXRQZWVyKCk7CisgICAgICAgIEZvbnRQZWVySW1wbCBwZWVyID0gKEZvbnRQZWVySW1wbCl0aGlzLmdldFBlZXIoKTsKICAgICAgICAgcmV0dXJuIHBlZXIuZ2V0SXRhbGljQW5nbGUoKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIHRoZSBmb250IHdpdGggdGhlIHNwZWNpZmllZCBmb250IGZvcm1hdCBhbmQgZm9udCBmaWxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBmb250Rm9ybWF0IHRoZSBmb250IGZvcm1hdC4KLSAgICAgKiBAcGFyYW0gZm9udEZpbGUgdGhlIGZpbGUgb2JqZWN0IHJlcHJlc2VudGVkIHRoZSBpbnB1dCBkYXRhIAotICAgICAqIGZvciB0aGUgZm9udC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZm9udEZvcm1hdAorICAgICAqICAgICAgICAgICAgdGhlIGZvbnQgZm9ybWF0LgorICAgICAqIEBwYXJhbSBmb250RmlsZQorICAgICAqICAgICAgICAgICAgdGhlIGZpbGUgb2JqZWN0IHJlcHJlc2VudGVkIHRoZSBpbnB1dCBkYXRhIGZvciB0aGUgZm9udC4KICAgICAgKiBAcmV0dXJuIHRoZSBGb250LgotICAgICAqIAotICAgICAqIEB0aHJvd3MgRm9udEZvcm1hdEV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgZm9udEZpbGUgZG9lcyBub3QgY29udGFpbiAKLSAgICAgKiB0aGUgcmVxdWlyZWQgZm9udCB0YWJsZXMgZm9yIHRoZSBzcGVjaWZpZWQgZm9ybWF0LgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gc2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgRm9udEZvcm1hdEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlzIHRocm93biBpZiBmb250RmlsZSBkb2VzIG5vdCBjb250YWluIHRoZSByZXF1aXJlZCBmb250CisgICAgICogICAgICAgICAgICAgdGFibGVzIGZvciB0aGUgc3BlY2lmaWVkIGZvcm1hdC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgc2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRm9udCBjcmVhdGVGb250KGludCBmb250Rm9ybWF0LCBGaWxlIGZvbnRGaWxlKQotICAgICAgICAgICAgdGhyb3dzIEZvbnRGb3JtYXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgc3RhdGljIEZvbnQgY3JlYXRlRm9udChpbnQgZm9udEZvcm1hdCwgRmlsZSBmb250RmlsZSkgdGhyb3dzIEZvbnRGb3JtYXRFeGNlcHRpb24sCisgICAgICAgICAgICBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vID8/P0FXVCBub3Qgc3VwcG9ydGVkCiAgICAgICAgIElucHV0U3RyZWFtIGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmb250RmlsZSk7CiAgICAgICAgIHRyeSB7CkBAIC0xNDQyLDE1ICsxNDgyLDE2IEBACiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyB0aGUgZm9udCB3aXRoIHRoZSBzcGVjaWZpZWQgZm9udCBmb3JtYXQgYW5kIGlucHV0IHN0cmVhbS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZm9udEZvcm1hdCB0aGUgZm9udCBmb3JtYXQuCi0gICAgICogQHBhcmFtIGZvbnRTdHJlYW0gdGhlIGlucHV0IHN0cmVhbSByZXByZXNlbnRlZCBpbnB1dCBkYXRhIGZvciAKLSAgICAgKiB0aGUgZm9udC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZm9udEZvcm1hdAorICAgICAqICAgICAgICAgICAgdGhlIGZvbnQgZm9ybWF0LgorICAgICAqIEBwYXJhbSBmb250U3RyZWFtCisgICAgICogICAgICAgICAgICB0aGUgaW5wdXQgc3RyZWFtIHJlcHJlc2VudGVkIGlucHV0IGRhdGEgZm9yIHRoZSBmb250LgogICAgICAqIEByZXR1cm4gdGhlIEZvbnQuCi0gICAgICogCi0gICAgICogQHRocm93cyBGb250Rm9ybWF0RXhjZXB0aW9uIGlzIHRocm93biBpZiBmb250RmlsZSBkb2VzIG5vdCBjb250YWluIAotICAgICAqIHRoZSByZXF1aXJlZCBmb250IHRhYmxlcyBmb3IgdGhlIHNwZWNpZmllZCBmb3JtYXQuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBzaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBGb250Rm9ybWF0RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaXMgdGhyb3duIGlmIGZvbnRGaWxlIGRvZXMgbm90IGNvbnRhaW4gdGhlIHJlcXVpcmVkIGZvbnQKKyAgICAgKiAgICAgICAgICAgICB0YWJsZXMgZm9yIHRoZSBzcGVjaWZpZWQgZm9ybWF0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBzaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBGb250IGNyZWF0ZUZvbnQoaW50IGZvbnRGb3JtYXQsIElucHV0U3RyZWFtIGZvbnRTdHJlYW0pCiAgICAgICAgICAgICB0aHJvd3MgRm9udEZvcm1hdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewpAQCAtMTQ2NiwxNSArMTUwNywxNSBAQAogICAgICAgICBpZiAoZm9udEZvcm1hdCAhPSBUUlVFVFlQRV9GT05UKSB7IC8vIGF3dC45QT1VbnN1cHBvcnRlZCBmb250IGZvcm1hdAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC45QSIpKTsgLy8kTk9OLU5MUy0xJCAKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICAvKiBHZXQgZm9udCBmaWxlIGluIHN5c3RlbS1zcGVjaWZpYyBkaXJlY3RvcnkgKi8KIAotICAgICAgICBGaWxlIGZvbnRGaWxlID0gVG9vbGtpdC5nZXREZWZhdWx0VG9vbGtpdCgpLmdldEdyYXBoaWNzRmFjdG9yeSgpCi0gICAgICAgICAgICAgICAgLmdldEZvbnRNYW5hZ2VyKCkuZ2V0VGVtcEZvbnRGaWxlKCk7CisgICAgICAgIEZpbGUgZm9udEZpbGUgPSBUb29sa2l0LmdldERlZmF1bHRUb29sa2l0KCkuZ2V0R3JhcGhpY3NGYWN0b3J5KCkuZ2V0Rm9udE1hbmFnZXIoKQorICAgICAgICAgICAgICAgIC5nZXRUZW1wRm9udEZpbGUoKTsKIAotICAgICAgICAgICAgICAgIC8vIEJFR0lOIGFuZHJvaWQtbW9kaWZpZWQKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1tb2RpZmllZAogICAgICAgICBidWZmU3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oZm9udFN0cmVhbSwgODE5Mik7Ci0gICAgICAgICAgICAgICAgLy8gRU5EIGFuZHJvaWQtbW9kaWZpZWQKKyAgICAgICAgLy8gRU5EIGFuZHJvaWQtbW9kaWZpZWQKICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmT3V0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZm9udEZpbGUpOwogCiAgICAgICAgIGJSZWFkID0gYnVmZlN0cmVhbS5yZWFkKGJ1ZiwgMCwgc2l6ZSk7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvRm9udEZvcm1hdEV4Y2VwdGlvbi5qYXZhIGIvYXd0L2phdmEvYXd0L0ZvbnRGb3JtYXRFeGNlcHRpb24uamF2YQppbmRleCBjMDE3ZmQyLi44MDY3MTFhIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvRm9udEZvcm1hdEV4Y2VwdGlvbi5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9Gb250Rm9ybWF0RXhjZXB0aW9uLmphdmEKQEAgLTE4LDIxICsxOCwyNyBAQAogICogQGF1dGhvciBJbHlhIFMuIE9rb21pbgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3Q7CiAKIC8qKgotICogVGhlIEZvbnRGb3JtYXRFeGNlcHRpb24gY2xhc3MgaXMgdXNlZCB0byBwcm92aWRlIG5vdGlmaWNhdGlvbgotICogYW5kIGluZm9ybWF0aW9uIHRoYXQgZm9udCBjYW4ndCBiZSBjcmVhdGVkLgorICogVGhlIEZvbnRGb3JtYXRFeGNlcHRpb24gY2xhc3MgaXMgdXNlZCB0byBwcm92aWRlIG5vdGlmaWNhdGlvbiBhbmQgaW5mb3JtYXRpb24KKyAqIHRoYXQgZm9udCBjYW4ndCBiZSBjcmVhdGVkLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEZvbnRGb3JtYXRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgc2VyaWFsVmVyc2lvblVJRC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00NDgxMjkwMTQ3ODExMzYxMjcyTDsKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBmb250IGZvcm1hdCBleGNlcHRpb24gd2l0aCBkZXRhaWxlZCBtZXNzYWdlLgogICAgICAqIAotICAgICAqIEBwYXJhbSByZWFzb24gdGhlIGRldGFpbGVkIG1lc3NhZ2UuCisgICAgICogQHBhcmFtIHJlYXNvbgorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbGVkIG1lc3NhZ2UuCiAgICAgICovCiAgICAgcHVibGljIEZvbnRGb3JtYXRFeGNlcHRpb24oU3RyaW5nIHJlYXNvbikgewogICAgICAgICBzdXBlcihyZWFzb24pOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L0ZvbnRNZXRyaWNzLmphdmEgYi9hd3QvamF2YS9hd3QvRm9udE1ldHJpY3MuamF2YQppbmRleCAzOTQ4ZDczLi45MDgyNjI2IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvRm9udE1ldHJpY3MuamF2YQorKysgYi9hd3QvamF2YS9hd3QvRm9udE1ldHJpY3MuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBJbHlhIFMuIE9rb21pbgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3Q7CiAKIGltcG9ydCBqYXZhLmF3dC5mb250LkZvbnRSZW5kZXJDb250ZXh0OwpAQCAtMjksMzQgKzMwLDQwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogVGhlIEZvbnRNZXRyaWNzIGNsYXNzIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZW5kZXJpbmcgCi0gKiBvZiBhIHBhcnRpY3VsYXIgZm9udCBvbiBhIHBhcnRpY3VsYXIgc2NyZWVuLgorICogVGhlIEZvbnRNZXRyaWNzIGNsYXNzIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZW5kZXJpbmcgb2YgYQorICogcGFydGljdWxhciBmb250IG9uIGEgcGFydGljdWxhciBzY3JlZW4uCiAgKiA8cD4KLSAqIEVhY2ggY2hhcmFjdGVyIGluIHRoZSBGb250IGhhcyB0aHJlZSB2YWx1ZXMgdGhhdCBoZWxwIGRlZmluZSB3aGVyZSAKLSAqIHRvIHBsYWNlIGl0OiBhbiBhc2NlbnQsIGEgZGVzY2VudCwgYW5kIGFuIGFkdmFuY2UuIFRoZSBhc2NlbnQgaXMgdGhlIAotICogZGlzdGFuY2UgdGhlIGNoYXJhY3RlciBleHRlbmRzIGFib3ZlIHRoZSBiYXNlbGluZS4gVGhlIGRlc2NlbnQgaXMKLSAqIHRoZSBkaXN0YW5jZSB0aGUgY2hhcmFjdGVyIGV4dGVuZHMgYmVsb3cgdGhlIGJhc2VsaW5lLiAKLSAqIFRoZSBhZHZhbmNlIHdpZHRoIGRlZmluZXMgdGhlIHBvc2l0aW9uIGF0IHdoaWNoIHRoZSBuZXh0IGNoYXJhY3RlcgotICogc2hvdWxkIGJlIHBsYWNlZC4KKyAqIEVhY2ggY2hhcmFjdGVyIGluIHRoZSBGb250IGhhcyB0aHJlZSB2YWx1ZXMgdGhhdCBoZWxwIGRlZmluZSB3aGVyZSB0byBwbGFjZQorICogaXQ6IGFuIGFzY2VudCwgYSBkZXNjZW50LCBhbmQgYW4gYWR2YW5jZS4gVGhlIGFzY2VudCBpcyB0aGUgZGlzdGFuY2UgdGhlCisgKiBjaGFyYWN0ZXIgZXh0ZW5kcyBhYm92ZSB0aGUgYmFzZWxpbmUuIFRoZSBkZXNjZW50IGlzIHRoZSBkaXN0YW5jZSB0aGUKKyAqIGNoYXJhY3RlciBleHRlbmRzIGJlbG93IHRoZSBiYXNlbGluZS4gVGhlIGFkdmFuY2Ugd2lkdGggZGVmaW5lcyB0aGUgcG9zaXRpb24KKyAqIGF0IHdoaWNoIHRoZSBuZXh0IGNoYXJhY3RlciBzaG91bGQgYmUgcGxhY2VkLgogICogPHA+Ci0gKiBBbiBhcnJheSBvZiBjaGFyYWN0ZXJzIG9yIGEgc3RyaW5nIGhhcyBhbiBhc2NlbnQsIGEgZGVzY2VudCwKLSAqICBhbmQgYW4gYWR2YW5jZSB3aWR0aCB0b28uIFRoZSBhc2NlbnQgb3IgZGVzY2VudCBvZiB0aGUgYXJyYXkgCi0gKiAgaXMgc3BlY2lmaWVkIGJ5IHRoZSBtYXhpbXVtIGFzY2VudCBvciBkZXNjZW50IG9mIHRoZSBjaGFyYWN0ZXJzIAotICogIGluIHRoZSBhcnJheS4gVGhlIGFkdmFuY2Ugd2lkdGggaXMgdGhlIHN1bSBvZiB0aGUgYWR2YW5jZSB3aWR0aHMgCi0gKiAgb2YgZWFjaCBvZiB0aGUgY2hhcmFjdGVycyBpbiB0aGUgY2hhcmFjdGVyIGFycmF5LgorICogQW4gYXJyYXkgb2YgY2hhcmFjdGVycyBvciBhIHN0cmluZyBoYXMgYW4gYXNjZW50LCBhIGRlc2NlbnQsIGFuZCBhbiBhZHZhbmNlCisgKiB3aWR0aCB0b28uIFRoZSBhc2NlbnQgb3IgZGVzY2VudCBvZiB0aGUgYXJyYXkgaXMgc3BlY2lmaWVkIGJ5IHRoZSBtYXhpbXVtCisgKiBhc2NlbnQgb3IgZGVzY2VudCBvZiB0aGUgY2hhcmFjdGVycyBpbiB0aGUgYXJyYXkuIFRoZSBhZHZhbmNlIHdpZHRoIGlzIHRoZQorICogc3VtIG9mIHRoZSBhZHZhbmNlIHdpZHRocyBvZiBlYWNoIG9mIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBjaGFyYWN0ZXIgYXJyYXkuCisgKiA8L3A+CisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRm9udE1ldHJpY3MgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgc2VyaWFsVmVyc2lvblVJRC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDE2ODExMjYyMjUyMDUwNTAxNDdMOwogCi0gICAgLyoqIFRoZSBmb250IGZyb20gd2hpY2ggdGhlIEZvbnRNZXRyaWNzIGlzIGNyZWF0ZWQuICovCisgICAgLyoqCisgICAgICogVGhlIGZvbnQgZnJvbSB3aGljaCB0aGUgRm9udE1ldHJpY3MgaXMgY3JlYXRlZC4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgRm9udCBmb250OwogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGZvbnQgbWV0cmljcyBmcm9tIHRoZSBzcGVjaWZpZWQgRm9udC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZm50IHRoZSBGb250LgorICAgICAqIEBwYXJhbSBmbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBGb250LgogICAgICAqLwogICAgIHByb3RlY3RlZCBGb250TWV0cmljcyhGb250IGZudCkgewogICAgICAgICB0aGlzLmZvbnQgPSBmbnQ7CkBAIC02NSwxMiArNzIsMTEgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBGb250TWV0cmljcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcKKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcuCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKwotICAgICAgICAgICAgICAgICJbZm9udD0iICsgdGhpcy5nZXRGb250KCkgKyAvLyROT04tTkxTLTEkCisgICAgICAgIHJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIltmb250PSIgKyB0aGlzLmdldEZvbnQoKSArIC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgICAgICAiYXNjZW50PSIgKyB0aGlzLmdldEFzY2VudCgpICsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAgICIsIGRlc2NlbnQ9IiArIHRoaXMuZ2V0RGVzY2VudCgpICsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAgICIsIGhlaWdodD0iICsgdGhpcy5nZXRIZWlnaHQoKSArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCkBAIC05NSw5ICsxMDEsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGZvbnQgYXNjZW50IG9mIHRoZSBGb250IGFzc29jaWF0ZWQgd2l0aCB0aGlzIEZvbnRNZXRyaWNzLgotICAgICAqIFRoZSBmb250IGFzY2VudCBpcyB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgZm9udCdzIGJhc2VsaW5lIHRvIAotICAgICAqIHRoZSB0b3Agb2YgbW9zdCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4KKyAgICAgKiBHZXRzIHRoZSBmb250IGFzY2VudCBvZiB0aGUgRm9udCBhc3NvY2lhdGVkIHdpdGggdGhpcyBGb250TWV0cmljcy4gVGhlCisgICAgICogZm9udCBhc2NlbnQgaXMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGZvbnQncyBiYXNlbGluZSB0byB0aGUgdG9wIG9mIG1vc3QKKyAgICAgKiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBhc2NlbnQgb2YgdGhlIEZvbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgRm9udE1ldHJpY3MuCiAgICAgICovCkBAIC0xMDYsOSArMTEyLDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBmb250IGRlc2NlbnQgb2YgdGhlIEZvbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgRm9udE1ldHJpY3MuCi0gICAgICogVGhlIGZvbnQgZGVzY2VudCBpcyB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgZm9udCdzIGJhc2VsaW5lIHRvIAotICAgICAqIHRoZSBib3R0b20gb2YgbW9zdCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyB3aXRoIGRlc2NlbmRlcnMuCisgICAgICogR2V0cyB0aGUgZm9udCBkZXNjZW50IG9mIHRoZSBGb250IGFzc29jaWF0ZWQgd2l0aCB0aGlzIEZvbnRNZXRyaWNzLiBUaGUKKyAgICAgKiBmb250IGRlc2NlbnQgaXMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGZvbnQncyBiYXNlbGluZSB0byB0aGUgYm90dG9tIG9mCisgICAgICogbW9zdCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyB3aXRoIGRlc2NlbmRlcnMuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgZGVzY2VudCBvZiB0aGUgRm9udCBhc3NvY2lhdGVkIHdpdGggdGhpcyBGb250TWV0cmljcy4KICAgICAgKi8KQEAgLTEyNiwxOTIgKzEzMiwxOTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBMaW5lTWV0cmljcyBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgQ2hhcmFjdGVySXRlcmF0b3IKLSAgICAgKiBpbiB0aGUgc3BlY2lmaWVkIEdyYXBoaWNzLgorICAgICAqIEdldHMgdGhlIExpbmVNZXRyaWNzIG9iamVjdCBmb3IgdGhlIHNwZWNpZmllZCBDaGFyYWN0ZXJJdGVyYXRvciBpbiB0aGUKKyAgICAgKiBzcGVjaWZpZWQgR3JhcGhpY3MuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNpIHRoZSBDaGFyYWN0ZXJJdGVyYXRvci4KLSAgICAgKiBAcGFyYW0gYmVnaW5JbmRleCB0aGUgb2Zmc2V0LgotICAgICAqIEBwYXJhbSBsaW1pdCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgdXNlZC4KLSAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgR3JhcGhpY3MuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgTGluZU1ldHJpY3Mgb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIENoYXJhY3Rlckl0ZXJhdG9yCi0gICAgICogaW4gdGhlIHNwZWNpZmllZCBHcmFwaGljcy4KKyAgICAgKiBAcGFyYW0gY2kKKyAgICAgKiAgICAgICAgICAgIHRoZSBDaGFyYWN0ZXJJdGVyYXRvci4KKyAgICAgKiBAcGFyYW0gYmVnaW5JbmRleAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldC4KKyAgICAgKiBAcGFyYW0gbGltaXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSB1c2VkLgorICAgICAqIEBwYXJhbSBjb250ZXh0CisgICAgICogICAgICAgICAgICB0aGUgR3JhcGhpY3MuCisgICAgICogQHJldHVybiB0aGUgTGluZU1ldHJpY3Mgb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIENoYXJhY3Rlckl0ZXJhdG9yIGluIHRoZQorICAgICAqICAgICAgICAgc3BlY2lmaWVkIEdyYXBoaWNzLgogICAgICAqLwotICAgIHB1YmxpYyBMaW5lTWV0cmljcyBnZXRMaW5lTWV0cmljcyhDaGFyYWN0ZXJJdGVyYXRvciBjaSwgaW50IGJlZ2luSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbWl0LCBHcmFwaGljcyBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBmb250LmdldExpbmVNZXRyaWNzKGNpLCBiZWdpbkluZGV4LCBsaW1pdCwgCi0gICAgICAgICAgICAgICAgdGhpcy5nZXRGUkNGcm9tR3JhcGhpY3MoY29udGV4dCkpOworICAgIHB1YmxpYyBMaW5lTWV0cmljcyBnZXRMaW5lTWV0cmljcyhDaGFyYWN0ZXJJdGVyYXRvciBjaSwgaW50IGJlZ2luSW5kZXgsIGludCBsaW1pdCwKKyAgICAgICAgICAgIEdyYXBoaWNzIGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIGZvbnQuZ2V0TGluZU1ldHJpY3MoY2ksIGJlZ2luSW5kZXgsIGxpbWl0LCB0aGlzLmdldEZSQ0Zyb21HcmFwaGljcyhjb250ZXh0KSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgTGluZU1ldHJpY3Mgb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIFN0cmluZwotICAgICAqIGluIHRoZSBzcGVjaWZpZWQgR3JhcGhpY3MuCisgICAgICogR2V0cyB0aGUgTGluZU1ldHJpY3Mgb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIFN0cmluZyBpbiB0aGUgc3BlY2lmaWVkCisgICAgICogR3JhcGhpY3MuCiAgICAgICogCi0gICAgICogQHBhcmFtIHN0ciB0aGUgU3RyaW5nLgotICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBHcmFwaGljcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBMaW5lTWV0cmljcyBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgU3RyaW5nCi0gICAgICogaW4gdGhlIHNwZWNpZmllZCBHcmFwaGljcy4KKyAgICAgKiBAcGFyYW0gc3RyCisgICAgICogICAgICAgICAgICB0aGUgU3RyaW5nLgorICAgICAqIEBwYXJhbSBjb250ZXh0CisgICAgICogICAgICAgICAgICB0aGUgR3JhcGhpY3MuCisgICAgICogQHJldHVybiB0aGUgTGluZU1ldHJpY3Mgb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIFN0cmluZyBpbiB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICBHcmFwaGljcy4KICAgICAgKi8KICAgICBwdWJsaWMgTGluZU1ldHJpY3MgZ2V0TGluZU1ldHJpY3MoU3RyaW5nIHN0ciwgR3JhcGhpY3MgY29udGV4dCkgewogICAgICAgICByZXR1cm4gZm9udC5nZXRMaW5lTWV0cmljcyhzdHIsIHRoaXMuZ2V0RlJDRnJvbUdyYXBoaWNzKGNvbnRleHQpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBMaW5lTWV0cmljcyBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIAotICAgICAqIGFycmF5IGluIHRoZSBzcGVjaWZpZWQgR3JhcGhpY3MuCisgICAgICogR2V0cyB0aGUgTGluZU1ldHJpY3Mgb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBhcnJheSBpbiB0aGUKKyAgICAgKiBzcGVjaWZpZWQgR3JhcGhpY3MuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNoYXJzIHRoZSBjaGFyYWN0ZXIgYXJyYXkuCi0gICAgICogQHBhcmFtIGJlZ2luSW5kZXggdGhlIG9mZnNldCBvZiBhcnJheS4KLSAgICAgKiBAcGFyYW0gbGltaXQgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHVzZWQuCi0gICAgICogQHBhcmFtIGNvbnRleHQgdGhlIEdyYXBoaWNzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIExpbmVNZXRyaWNzIG9iamVjdCBmb3IgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgCi0gICAgICogYXJyYXkgaW4gdGhlIHNwZWNpZmllZCBHcmFwaGljcy4KKyAgICAgKiBAcGFyYW0gY2hhcnMKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgYXJyYXkuCisgICAgICogQHBhcmFtIGJlZ2luSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgYXJyYXkuCisgICAgICogQHBhcmFtIGxpbWl0CisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgdXNlZC4KKyAgICAgKiBAcGFyYW0gY29udGV4dAorICAgICAqICAgICAgICAgICAgdGhlIEdyYXBoaWNzLgorICAgICAqIEByZXR1cm4gdGhlIExpbmVNZXRyaWNzIG9iamVjdCBmb3IgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXJyYXkgaW4gdGhlCisgICAgICogICAgICAgICBzcGVjaWZpZWQgR3JhcGhpY3MuCiAgICAgICovCi0gICAgcHVibGljIExpbmVNZXRyaWNzIGdldExpbmVNZXRyaWNzKGNoYXJbXSBjaGFycywgaW50IGJlZ2luSW5kZXgsIGludCBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljcyBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBmb250LmdldExpbmVNZXRyaWNzKGNoYXJzLCBiZWdpbkluZGV4LCBsaW1pdCwgCi0gICAgICAgICAgICAgICAgdGhpcy5nZXRGUkNGcm9tR3JhcGhpY3MoY29udGV4dCkpOworICAgIHB1YmxpYyBMaW5lTWV0cmljcyBnZXRMaW5lTWV0cmljcyhjaGFyW10gY2hhcnMsIGludCBiZWdpbkluZGV4LCBpbnQgbGltaXQsIEdyYXBoaWNzIGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIGZvbnQuZ2V0TGluZU1ldHJpY3MoY2hhcnMsIGJlZ2luSW5kZXgsIGxpbWl0LCB0aGlzLmdldEZSQ0Zyb21HcmFwaGljcyhjb250ZXh0KSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgTGluZU1ldHJpY3Mgb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIFN0cmluZwotICAgICAqIGluIHRoZSBzcGVjaWZpZWQgR3JhcGhpY3MuCisgICAgICogR2V0cyB0aGUgTGluZU1ldHJpY3Mgb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIFN0cmluZyBpbiB0aGUgc3BlY2lmaWVkCisgICAgICogR3JhcGhpY3MuCiAgICAgICogCi0gICAgICogQHBhcmFtIHN0ciB0aGUgU3RyaW5nLgotICAgICAqIEBwYXJhbSBiZWdpbkluZGV4IHRoZSBvZmZzZXQuCi0gICAgICogQHBhcmFtIGxpbWl0IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSB1c2VkLgotICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBHcmFwaGljcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBMaW5lTWV0cmljcyBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgU3RyaW5nCi0gICAgICogaW4gdGhlIHNwZWNpZmllZCBHcmFwaGljcy4KKyAgICAgKiBAcGFyYW0gc3RyCisgICAgICogICAgICAgICAgICB0aGUgU3RyaW5nLgorICAgICAqIEBwYXJhbSBiZWdpbkluZGV4CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0LgorICAgICAqIEBwYXJhbSBsaW1pdAorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHVzZWQuCisgICAgICogQHBhcmFtIGNvbnRleHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBHcmFwaGljcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBMaW5lTWV0cmljcyBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgU3RyaW5nIGluIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgIEdyYXBoaWNzLgogICAgICAqLwotICAgIHB1YmxpYyBMaW5lTWV0cmljcyBnZXRMaW5lTWV0cmljcyhTdHJpbmcgc3RyLCBpbnQgYmVnaW5JbmRleCwgaW50IGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzIGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIGZvbnQuZ2V0TGluZU1ldHJpY3Moc3RyLCBiZWdpbkluZGV4LCBsaW1pdCwgCi0gICAgICAgICAgICAgICAgdGhpcy5nZXRGUkNGcm9tR3JhcGhpY3MoY29udGV4dCkpOworICAgIHB1YmxpYyBMaW5lTWV0cmljcyBnZXRMaW5lTWV0cmljcyhTdHJpbmcgc3RyLCBpbnQgYmVnaW5JbmRleCwgaW50IGxpbWl0LCBHcmFwaGljcyBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBmb250LmdldExpbmVNZXRyaWNzKHN0ciwgYmVnaW5JbmRleCwgbGltaXQsIHRoaXMuZ2V0RlJDRnJvbUdyYXBoaWNzKGNvbnRleHQpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIncyBtYXhpbXVtIGJvdW5kcyBpbiB0aGUgc3BlY2lmaWVkIAotICAgICAqIEdyYXBoaWNzIGNvbnRleHQuCisgICAgICogUmV0dXJucyB0aGUgY2hhcmFjdGVyJ3MgbWF4aW11bSBib3VuZHMgaW4gdGhlIHNwZWNpZmllZCBHcmFwaGljcyBjb250ZXh0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBHcmFwaGljcyBjb250ZXh0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNoYXJhY3RlcidzIG1heGltdW0gYm91bmRzIGluIHRoZSBzcGVjaWZpZWQgCi0gICAgICogR3JhcGhpY3MgY29udGV4dC4KKyAgICAgKiBAcGFyYW0gY29udGV4dAorICAgICAqICAgICAgICAgICAgdGhlIEdyYXBoaWNzIGNvbnRleHQuCisgICAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyJ3MgbWF4aW11bSBib3VuZHMgaW4gdGhlIHNwZWNpZmllZCBHcmFwaGljcyBjb250ZXh0LgogICAgICAqLwogICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRNYXhDaGFyQm91bmRzKEdyYXBoaWNzIGNvbnRleHQpIHsKICAgICAgICAgcmV0dXJuIHRoaXMuZm9udC5nZXRNYXhDaGFyQm91bmRzKHRoaXMuZ2V0RlJDRnJvbUdyYXBoaWNzKGNvbnRleHQpKTsKICAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgYm91bmRzIG9mIHRoZSBzcGVjaWZpZWQgQ2hhcmFjdGVySXRlcmF0b3IgCi0gICAgICogaW4gdGhlIHNwZWNpZmllZCBHcmFwaGljcyBjb250ZXh0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBjaSB0aGUgQ2hhcmFjdGVySXRlcmF0b3IuCi0gICAgICogQHBhcmFtIGJlZ2luSW5kZXggdGhlIGJlZ2luIG9mZnNldCBvZiB0aGUgYXJyYXkuCi0gICAgICogQHBhcmFtIGxpbWl0IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycy4KLSAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgR3JhcGhpY3MuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYm91bmRzIG9mIHRoZSBzcGVjaWZpZWQgQ2hhcmFjdGVySXRlcmF0b3IgCi0gICAgICogaW4gdGhlIHNwZWNpZmllZCBHcmFwaGljcyBjb250ZXh0LgotICAgICAqLwotICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRTdHJpbmdCb3VuZHMoQ2hhcmFjdGVySXRlcmF0b3IgY2ksIGludCBiZWdpbkluZGV4LAotICAgICAgICAgICAgaW50IGxpbWl0LCBHcmFwaGljcyBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBmb250LmdldFN0cmluZ0JvdW5kcyhjaSwgYmVnaW5JbmRleCwgbGltaXQsIAotICAgICAgICAgICAgICAgIHRoaXMuZ2V0RlJDRnJvbUdyYXBoaWNzKGNvbnRleHQpKTsKLSAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBib3VuZHMgb2YgdGhlIHNwZWNpZmllZCBTdHJpbmcgCi0gICAgICogaW4gdGhlIHNwZWNpZmllZCBHcmFwaGljcyBjb250ZXh0LgorICAgICAqIEdldHMgdGhlIGJvdW5kcyBvZiB0aGUgc3BlY2lmaWVkIENoYXJhY3Rlckl0ZXJhdG9yIGluIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBHcmFwaGljcyBjb250ZXh0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBzdHIgdGhlIFN0cmluZy4KLSAgICAgKiBAcGFyYW0gYmVnaW5JbmRleCB0aGUgYmVnaW4gb2Zmc2V0IG9mIHRoZSBhcnJheS4KLSAgICAgKiBAcGFyYW0gbGltaXQgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzLgotICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBHcmFwaGljcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBib3VuZHMgb2YgdGhlIHNwZWNpZmllZCBTdHJpbmcgCi0gICAgICogaW4gdGhlIHNwZWNpZmllZCBHcmFwaGljcyBjb250ZXh0LgorICAgICAqIEBwYXJhbSBjaQorICAgICAqICAgICAgICAgICAgdGhlIENoYXJhY3Rlckl0ZXJhdG9yLgorICAgICAqIEBwYXJhbSBiZWdpbkluZGV4CisgICAgICogICAgICAgICAgICB0aGUgYmVnaW4gb2Zmc2V0IG9mIHRoZSBhcnJheS4KKyAgICAgKiBAcGFyYW0gbGltaXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycy4KKyAgICAgKiBAcGFyYW0gY29udGV4dAorICAgICAqICAgICAgICAgICAgdGhlIEdyYXBoaWNzLgorICAgICAqIEByZXR1cm4gdGhlIGJvdW5kcyBvZiB0aGUgc3BlY2lmaWVkIENoYXJhY3Rlckl0ZXJhdG9yIGluIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgIEdyYXBoaWNzIGNvbnRleHQuCiAgICAgICovCi0gICAgcHVibGljIFJlY3RhbmdsZTJEIGdldFN0cmluZ0JvdW5kcyhTdHJpbmcgc3RyLCBpbnQgYmVnaW5JbmRleCwgaW50IGxpbWl0LAorICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRTdHJpbmdCb3VuZHMoQ2hhcmFjdGVySXRlcmF0b3IgY2ksIGludCBiZWdpbkluZGV4LCBpbnQgbGltaXQsCiAgICAgICAgICAgICBHcmFwaGljcyBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBmb250LmdldFN0cmluZ0JvdW5kcyhzdHIsIGJlZ2luSW5kZXgsIGxpbWl0LCAKLSAgICAgICAgICAgICAgICB0aGlzLmdldEZSQ0Zyb21HcmFwaGljcyhjb250ZXh0KSk7CisgICAgICAgIHJldHVybiBmb250LmdldFN0cmluZ0JvdW5kcyhjaSwgYmVnaW5JbmRleCwgbGltaXQsIHRoaXMuZ2V0RlJDRnJvbUdyYXBoaWNzKGNvbnRleHQpKTsKICAgICB9CiAKLQogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGJvdW5kcyBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcnMgYXJyYXkgCi0gICAgICogaW4gdGhlIHNwZWNpZmllZCBHcmFwaGljcyBjb250ZXh0LgorICAgICAqIEdldHMgdGhlIGJvdW5kcyBvZiB0aGUgc3BlY2lmaWVkIFN0cmluZyBpbiB0aGUgc3BlY2lmaWVkIEdyYXBoaWNzCisgICAgICogY29udGV4dC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2hhcnMgdGhlIGNoYXJhY3RlcnMgYXJyYXkuCi0gICAgICogQHBhcmFtIGJlZ2luSW5kZXggdGhlIGJlZ2luIG9mZnNldCBvZiB0aGUgYXJyYXkuCi0gICAgICogQHBhcmFtIGxpbWl0IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycy4KLSAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgR3JhcGhpY3MuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYm91bmRzIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVycyBhcnJheSAKLSAgICAgKiBpbiB0aGUgc3BlY2lmaWVkIEdyYXBoaWNzIGNvbnRleHQuCisgICAgICogQHBhcmFtIHN0cgorICAgICAqICAgICAgICAgICAgdGhlIFN0cmluZy4KKyAgICAgKiBAcGFyYW0gYmVnaW5JbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGJlZ2luIG9mZnNldCBvZiB0aGUgYXJyYXkuCisgICAgICogQHBhcmFtIGxpbWl0CisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMuCisgICAgICogQHBhcmFtIGNvbnRleHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBHcmFwaGljcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBib3VuZHMgb2YgdGhlIHNwZWNpZmllZCBTdHJpbmcgaW4gdGhlIHNwZWNpZmllZCBHcmFwaGljcworICAgICAqICAgICAgICAgY29udGV4dC4KICAgICAgKi8KLSAgICBwdWJsaWMgUmVjdGFuZ2xlMkQgZ2V0U3RyaW5nQm91bmRzKGNoYXJbXSBjaGFycywgaW50IGJlZ2luSW5kZXgsIGludCBsaW1pdCwKLSAgICAgICAgICAgIEdyYXBoaWNzIGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIGZvbnQuZ2V0U3RyaW5nQm91bmRzKGNoYXJzLCBiZWdpbkluZGV4LCBsaW1pdCwgCi0gICAgICAgICAgICAgICAgdGhpcy5nZXRGUkNGcm9tR3JhcGhpY3MoY29udGV4dCkpOworICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRTdHJpbmdCb3VuZHMoU3RyaW5nIHN0ciwgaW50IGJlZ2luSW5kZXgsIGludCBsaW1pdCwgR3JhcGhpY3MgY29udGV4dCkgeworICAgICAgICByZXR1cm4gZm9udC5nZXRTdHJpbmdCb3VuZHMoc3RyLCBiZWdpbkluZGV4LCBsaW1pdCwgdGhpcy5nZXRGUkNGcm9tR3JhcGhpY3MoY29udGV4dCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGJvdW5kcyBvZiB0aGUgc3BlY2lmaWVkIFN0cmluZyAKLSAgICAgKiBpbiB0aGUgc3BlY2lmaWVkIEdyYXBoaWNzIGNvbnRleHQuCisgICAgICogR2V0cyB0aGUgYm91bmRzIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVycyBhcnJheSBpbiB0aGUgc3BlY2lmaWVkCisgICAgICogR3JhcGhpY3MgY29udGV4dC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RyIHRoZSBTdHJpbmcuCi0gICAgICogQHBhcmFtIGNvbnRleHQgdGhlIEdyYXBoaWNzLgorICAgICAqIEBwYXJhbSBjaGFycworICAgICAqICAgICAgICAgICAgdGhlIGNoYXJhY3RlcnMgYXJyYXkuCisgICAgICogQHBhcmFtIGJlZ2luSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBiZWdpbiBvZmZzZXQgb2YgdGhlIGFycmF5LgorICAgICAqIEBwYXJhbSBsaW1pdAorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzLgorICAgICAqIEBwYXJhbSBjb250ZXh0CisgICAgICogICAgICAgICAgICB0aGUgR3JhcGhpY3MuCisgICAgICogQHJldHVybiB0aGUgYm91bmRzIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVycyBhcnJheSBpbiB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICBHcmFwaGljcyBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRTdHJpbmdCb3VuZHMoY2hhcltdIGNoYXJzLCBpbnQgYmVnaW5JbmRleCwgaW50IGxpbWl0LCBHcmFwaGljcyBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBmb250LmdldFN0cmluZ0JvdW5kcyhjaGFycywgYmVnaW5JbmRleCwgbGltaXQsIHRoaXMuZ2V0RlJDRnJvbUdyYXBoaWNzKGNvbnRleHQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBib3VuZHMgb2YgdGhlIHNwZWNpZmllZCBTdHJpbmcgaW4gdGhlIHNwZWNpZmllZCBHcmFwaGljcworICAgICAqIGNvbnRleHQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgYm91bmRzIG9mIHRoZSBzcGVjaWZpZWQgU3RyaW5nIAotICAgICAqIGluIHRoZSBzcGVjaWZpZWQgR3JhcGhpY3MgY29udGV4dC4KKyAgICAgKiBAcGFyYW0gc3RyCisgICAgICogICAgICAgICAgICB0aGUgU3RyaW5nLgorICAgICAqIEBwYXJhbSBjb250ZXh0CisgICAgICogICAgICAgICAgICB0aGUgR3JhcGhpY3MuCisgICAgICogQHJldHVybiB0aGUgYm91bmRzIG9mIHRoZSBzcGVjaWZpZWQgU3RyaW5nIGluIHRoZSBzcGVjaWZpZWQgR3JhcGhpY3MKKyAgICAgKiAgICAgICAgIGNvbnRleHQuCiAgICAgICovCiAgICAgcHVibGljIFJlY3RhbmdsZTJEIGdldFN0cmluZ0JvdW5kcyhTdHJpbmcgc3RyLCBHcmFwaGljcyBjb250ZXh0KSB7CiAgICAgICAgIHJldHVybiBmb250LmdldFN0cmluZ0JvdW5kcyhzdHIsIHRoaXMuZ2V0RlJDRnJvbUdyYXBoaWNzKGNvbnRleHQpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgdGhlIEZvbnQgaGFzIHVuaWZvcm0gbGluZSBtZXRyaWNzIG9yIG5vdC4gCi0gICAgICogVGhlIEZvbnQgY2FuIGNvbnRhaW4gY2hhcmFjdGVycyBvZiBvdGhlciBmb250cyBmb3IgCi0gICAgICogY292ZXJpbmcgY2hhcmFjdGVyIHNldC4gSW4gdGhpcyBjYXNlIHRoZSBGb250IGlzbid0Ci0gICAgICogdW5pZm9ybS4gCi0gICAgICogIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIEZvbnQgaGFzIHVuaWZvcm0gbGluZSBtZXRyaWNzLCAKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQ2hlY2tzIGlmIHRoZSBGb250IGhhcyB1bmlmb3JtIGxpbmUgbWV0cmljcyBvciBub3QuIFRoZSBGb250IGNhbiBjb250YWluCisgICAgICogY2hhcmFjdGVycyBvZiBvdGhlciBmb250cyBmb3IgY292ZXJpbmcgY2hhcmFjdGVyIHNldC4gSW4gdGhpcyBjYXNlIHRoZQorICAgICAqIEZvbnQgaXNuJ3QgdW5pZm9ybS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBGb250IGhhcyB1bmlmb3JtIGxpbmUgbWV0cmljcywgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGhhc1VuaWZvcm1MaW5lTWV0cmljcygpIHsKICAgICAgICAgcmV0dXJuIHRoaXMuZm9udC5oYXNVbmlmb3JtTGluZU1ldHJpY3MoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBsZWZ0bW9zdCBwb2ludCB0byB0aGUgcmlnaHRtb3N0IAotICAgICAqIHBvaW50IG9uIHRoZSBzdHJpbmcncyBiYXNlbGluZSBzaG93aW5nIHRoZSBzcGVjaWZpZWQgYXJyYXkgCi0gICAgICogb2YgYnl0ZXMgaW4gdGhpcyBGb250LiAgIAorICAgICAqIFJldHVybnMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGxlZnRtb3N0IHBvaW50IHRvIHRoZSByaWdodG1vc3QgcG9pbnQgb24KKyAgICAgKiB0aGUgc3RyaW5nJ3MgYmFzZWxpbmUgc2hvd2luZyB0aGUgc3BlY2lmaWVkIGFycmF5IG9mIGJ5dGVzIGluIHRoaXMgRm9udC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgYXJyYXkgb2YgYnl0ZXMgdG8gYmUgbWVhc3VyZWQuCi0gICAgICogQHBhcmFtIG9mZiB0aGUgc3RhcnQgb2Zmc2V0LgotICAgICAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSBtZWFzdXJlZC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGJ5dGVzIHRvIGJlIG1lYXN1cmVkLgorICAgICAqIEBwYXJhbSBvZmYKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBvZmZzZXQuCisgICAgICogQHBhcmFtIGxlbgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSBtZWFzdXJlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBhZHZhbmNlIHdpZHRoIG9mIHRoZSBhcnJheS4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGJ5dGVzV2lkdGgoYnl0ZVtdIGRhdGEsIGludCBvZmYsIGludCBsZW4pIHsKICAgICAgICAgaW50IHdpZHRoID0gMDsKLSAgICAgICAgaWYgKChvZmYgPj0gZGF0YS5sZW5ndGgpIHx8IChvZmYgPCAwKSl7CisgICAgICAgIGlmICgob2ZmID49IGRhdGEubGVuZ3RoKSB8fCAob2ZmIDwgMCkpIHsKICAgICAgICAgICAgIC8vIGF3dC4xM0I9b2Zmc2V0IG9mZiBpcyBvdXQgb2YgcmFuZ2UKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMTNCIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICBpZiAoKG9mZitsZW4gPiBkYXRhLmxlbmd0aCkpeworICAgICAgICBpZiAoKG9mZiArIGxlbiA+IGRhdGEubGVuZ3RoKSkgewogICAgICAgICAgICAgLy8gYXd0LjEzQz1udW1iZXIgb2YgZWxlbWV0cyBsZW4gaXMgb3V0IG9mIHJhbmdlCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjEzQyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgZm9yIChpbnQgaSA9IG9mZjsgaSA8IG9mZitsZW47IGkrKyl7CisgICAgICAgIGZvciAoaW50IGkgPSBvZmY7IGkgPCBvZmYgKyBsZW47IGkrKykgewogICAgICAgICAgICAgd2lkdGggKz0gY2hhcldpZHRoKGRhdGFbaV0pOwogICAgICAgICB9CiAKQEAgLTMxOSwyOSArMzMxLDMxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgbGVmdG1vc3QgcG9pbnQgdG8gdGhlIHJpZ2h0bW9zdCAKLSAgICAgKiBwb2ludCBvbiB0aGUgc3RyaW5nJ3MgYmFzZWxpbmUgc2hvd2luZyB0aGUgc3BlY2lmaWVkIGFycmF5IAotICAgICAqIG9mIGNoYXJhY3RlcnMgaW4gdGhpcyBGb250LiAgIAorICAgICAqIFJldHVybnMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGxlZnRtb3N0IHBvaW50IHRvIHRoZSByaWdodG1vc3QgcG9pbnQgb24KKyAgICAgKiB0aGUgc3RyaW5nJ3MgYmFzZWxpbmUgc2hvd2luZyB0aGUgc3BlY2lmaWVkIGFycmF5IG9mIGNoYXJhY3RlcnMgaW4gdGhpcworICAgICAqIEZvbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGFycmF5IG9mIGNoYXJhY3RlcnMgdG8gYmUgbWVhc3VyZWQuCi0gICAgICogQHBhcmFtIG9mZiB0aGUgc3RhcnQgb2Zmc2V0LgotICAgICAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSBtZWFzdXJlZC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGNoYXJhY3RlcnMgdG8gYmUgbWVhc3VyZWQuCisgICAgICogQHBhcmFtIG9mZgorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IG9mZnNldC4KKyAgICAgKiBAcGFyYW0gbGVuCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIG1lYXN1cmVkLgogICAgICAqIEByZXR1cm4gdGhlIGFkdmFuY2Ugd2lkdGggb2YgdGhlIGFycmF5LgogICAgICAqLwotICAgIHB1YmxpYyBpbnQgY2hhcnNXaWR0aChjaGFyW10gZGF0YSwgaW50IG9mZiAsIGludCBsZW4peworICAgIHB1YmxpYyBpbnQgY2hhcnNXaWR0aChjaGFyW10gZGF0YSwgaW50IG9mZiwgaW50IGxlbikgewogICAgICAgICBpbnQgd2lkdGggPSAwOwotICAgICAgICBpZiAoKG9mZiA+PSBkYXRhLmxlbmd0aCkgfHwgKG9mZiA8IDApKXsKKyAgICAgICAgaWYgKChvZmYgPj0gZGF0YS5sZW5ndGgpIHx8IChvZmYgPCAwKSkgewogICAgICAgICAgICAgLy8gYXd0LjEzQj1vZmZzZXQgb2ZmIGlzIG91dCBvZiByYW5nZQogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4xM0IiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCi0gICAgICAgIGlmICgob2ZmK2xlbiA+IGRhdGEubGVuZ3RoKSl7CisgICAgICAgIGlmICgob2ZmICsgbGVuID4gZGF0YS5sZW5ndGgpKSB7CiAgICAgICAgICAgICAvLyBhd3QuMTNDPW51bWJlciBvZiBlbGVtZXRzIGxlbiBpcyBvdXQgb2YgcmFuZ2UKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMTNDIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICBmb3IgKGludCBpID0gb2ZmOyBpIDwgb2ZmK2xlbjsgaSsrKXsKKyAgICAgICAgZm9yIChpbnQgaSA9IG9mZjsgaSA8IG9mZiArIGxlbjsgaSsrKSB7CiAgICAgICAgICAgICB3aWR0aCArPSBjaGFyV2lkdGgoZGF0YVtpXSk7CiAgICAgICAgIH0KIApAQCAtMzQ5LDEyICszNjMsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBsZWZ0bW9zdCBwb2ludCB0byB0aGUgcmlnaHRtb3N0IAotICAgICAqIHBvaW50IG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGluIHRoaXMgRm9udC4gICAKKyAgICAgKiBSZXR1cm5zIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBsZWZ0bW9zdCBwb2ludCB0byB0aGUgcmlnaHRtb3N0IHBvaW50IG9mCisgICAgICogdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaW4gdGhpcyBGb250LgogICAgICAqIAotICAgICAqIEBwYXJhbSBjaCB0aGUgc3BlY2lmaWVkIHVuaWNvZGUgcG9pbnQgY29kZSBvZiAKLSAgICAgKiBjaGFyYWN0ZXIgdG8gYmUgbWVhc3VyZWQuCi0gICAgICogCisgICAgICogQHBhcmFtIGNoCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIFVuaWNvZGUgcG9pbnQgY29kZSBvZiBjaGFyYWN0ZXIgdG8gYmUgbWVhc3VyZWQuCiAgICAgICogQHJldHVybiB0aGUgYWR2YW5jZSB3aWR0aCBvZiB0aGUgY2hhcmFjdGVyLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgY2hhcldpZHRoKGludCBjaCkgewpAQCAtMzYyLDExICszNzUsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBsZWZ0bW9zdCBwb2ludCB0byB0aGUgcmlnaHRtb3N0IAotICAgICAqIHBvaW50IG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGluIHRoaXMgRm9udC4gICAKKyAgICAgKiBSZXR1cm5zIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBsZWZ0bW9zdCBwb2ludCB0byB0aGUgcmlnaHRtb3N0IHBvaW50IG9mCisgICAgICogdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaW4gdGhpcyBGb250LgogICAgICAqIAotICAgICAqIEBwYXJhbSBjaCB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciB0byBiZSBtZWFzdXJlZC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2gKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIHRvIGJlIG1lYXN1cmVkLgogICAgICAqIEByZXR1cm4gdGhlIGFkdmFuY2Ugd2lkdGggb2YgdGhlIGNoYXJhY3Rlci4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGNoYXJXaWR0aChjaGFyIGNoKSB7CkBAIC0zODMsMTEgKzM5NiwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1heGltdW0gZm9udCBhc2NlbnQgb2YgdGhlIEZvbnQgYXNzb2NpYXRlZCB3aXRoIAotICAgICAqIHRoaXMgRm9udE1ldHJpY3MuCisgICAgICogR2V0cyB0aGUgbWF4aW11bSBmb250IGFzY2VudCBvZiB0aGUgRm9udCBhc3NvY2lhdGVkIHdpdGggdGhpcworICAgICAqIEZvbnRNZXRyaWNzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0gZm9udCBhc2NlbnQgb2YgdGhlIEZvbnQgYXNzb2NpYXRlZCB3aXRoIAotICAgICAqIHRoaXMgRm9udE1ldHJpY3MuCisgICAgICogQHJldHVybiB0aGUgbWF4aW11bSBmb250IGFzY2VudCBvZiB0aGUgRm9udCBhc3NvY2lhdGVkIHdpdGggdGhpcworICAgICAqICAgICAgICAgRm9udE1ldHJpY3MuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRNYXhBc2NlbnQoKSB7CiAgICAgICAgIHJldHVybiAwOwpAQCAtMzk3LDcgKzQxMCw2IEBACiAgICAgICogR2V0cyB0aGUgbWF4aW11bSBmb250IGRlc2NlbnQgb2YgY2hhcmFjdGVyIGluIHRoaXMgRm9udC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIGZvbnQgZGVzY2VudCBvZiBjaGFyYWN0ZXIgaW4gdGhpcyBGb250LgotICAgICAqIAogICAgICAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IGdldE1heERlc2NlbnQoKSBtZXRob2QuCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKQEAgLTQyNiwyMyArNDM4LDIyIEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgYWR2YW5jZSB3aWR0aCBmb3IgdGhlIHNwZWNpZmllZCBTdHJpbmcgaW4gdGhpcyBGb250LgogICAgICAqIAotICAgICAqIEBwYXJhbSBzdHIgU3RyaW5nIHRvIGJlIG1lYXN1cmVkLiAKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0aGUgYWR2YW5jZSB3aWR0aCBmb3IgdGhlIHNwZWNpZmllZCBTdHJpbmcgCi0gICAgICogaW4gdGhpcyBGb250LgorICAgICAqIEBwYXJhbSBzdHIKKyAgICAgKiAgICAgICAgICAgIFN0cmluZyB0byBiZSBtZWFzdXJlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSB0aGUgYWR2YW5jZSB3aWR0aCBmb3IgdGhlIHNwZWNpZmllZCBTdHJpbmcgaW4gdGhpcyBGb250LgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgc3RyaW5nV2lkdGgoU3RyaW5nIHN0cikgewogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIEZvbnRSZW5kZXJDb250ZXh0IGluc3RhbnNlIG9mIHRoZSBHcmFwaGljcyBjb250ZXh0IHNwZWNpZmllZC4KKyAgICAgKiBSZXR1cm5zIGEgRm9udFJlbmRlckNvbnRleHQgaW5zdGFuY2Ugb2YgdGhlIEdyYXBoaWNzIGNvbnRleHQgc3BlY2lmaWVkLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBzcGVjaWZpZWQgR3JhcGhpY3MgY29udGV4dAotICAgICAqIAorICAgICAqIEBwYXJhbSBjb250ZXh0CisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIEdyYXBoaWNzIGNvbnRleHQuCiAgICAgICogQHJldHVybiBhIEZvbnRSZW5kZXJDb250ZXh0IG9mIHRoZSBzcGVjaWZpZWQgR3JhcGhpY3MgY29udGV4dC4KICAgICAgKi8KLSAgICBwcml2YXRlIEZvbnRSZW5kZXJDb250ZXh0IGdldEZSQ0Zyb21HcmFwaGljcyhHcmFwaGljcyBjb250ZXh0KXsKKyAgICBwcml2YXRlIEZvbnRSZW5kZXJDb250ZXh0IGdldEZSQ0Zyb21HcmFwaGljcyhHcmFwaGljcyBjb250ZXh0KSB7CiAgICAgICAgIEZvbnRSZW5kZXJDb250ZXh0IGZyYzsKICAgICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBHcmFwaGljczJEKSB7CiAgICAgICAgICAgICBmcmMgPSAoKEdyYXBoaWNzMkQpY29udGV4dCkuZ2V0Rm9udFJlbmRlckNvbnRleHQoKTsKQEAgLTQ1Myw0ICs0NjQsMyBAQAogICAgICAgICByZXR1cm4gZnJjOwogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L0dyYWRpZW50UGFpbnQuamF2YSBiL2F3dC9qYXZhL2F3dC9HcmFkaWVudFBhaW50LmphdmEKaW5kZXggMGUwNjUyOC4uM2IzMmVmNSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L0dyYWRpZW50UGFpbnQuamF2YQorKysgYi9hd3QvamF2YS9hd3QvR3JhZGllbnRQYWludC5qYXZhCkBAIC0yNiw1NiArMjYsNzEgQEAKIAogLyoqCiAgKiBUaGUgR3JhZGllbnRQYWludCBjbGFzcyBkZWZpbmVzIGEgd2F5IHRvIGZpbGwgYSBTaGFwZSB3aXRoIGEgbGluZWFyIGNvbG9yCi0gKiBncmFkaWVudCBwYXR0ZXJuLiAKKyAqIGdyYWRpZW50IHBhdHRlcm4uCiAgKiA8cD4KLSAqIFRoZSBHcmFkaWVudFBhaW50J3MgZmlsbCBwYXR0ZXJuIGlzIGRldGVybWluZWQgYnkgdHdvIHBvaW50cyBhbmQgdHdvIGNvbG9ycywgCi0gKiBwbHVzIHRoZSBjeWNsaWMgbW9kZSBvcHRpb24uCi0gKiBFYWNoIG9mIHRoZSB0d28gcG9pbnRzIGlzIHBhaW50ZWQgd2l0aCBpdHMgY29ycmVzcG9uZGluZyBjb2xvciwgYW5kIG9uIAotICogdGhlIGxpbmUgc2VnbWVudCBjb25uZWN0aW5nIHRoZSB0d28gcG9pbnRzLCB0aGUgY29sb3IgaXMgcHJvcG9ydGlvbmFsbHkKLSAqIGNoYW5nZWQgYmV0d2VlbiB0aGUgdHdvIGNvbG9ycy4gRm9yIHBvaW50cyBvbiB0aGUgc2FtZSBsaW5lIHdoaWNoIGFyZSBub3QgCi0gKiBiZXR3ZWVuIHRoZSB0d28gc3BlY2lmaWVkIHBvaW50cyAob3V0c2lkZSBvZiB0aGUgY29ubmVjdGluZyBzZWdtZW50KSB0aGVpcgotICogY29sb3IgaXMgZGV0ZXJtaW5lZCBieSB0aGUgY3ljbGljIG1vZGUgb3B0aW9uLiBJZiB0aGUgbW9kZSBpcyBjeWNsaWMsIHRoZW4KLSAqIHRoZSByZXN0IG9mIHRoZSBsaW5lIHJlcGVhdHMgdGhlIGNvbG9yIHBhdHRlcm4gb2YgdGhlIGNvbm5lY3Rpbmcgc2VnbWVudCwgCi0gKiBjeWNsaW5nIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gdGhlIHR3byBjb2xvcnMuIElmIG5vdCwgdGhlIG1vZGUgaXMgYWN5Y2xpYyAKLSAqIHdoaWNoIG1lYW5zIHRoYXQgYWxsIHBvaW50cyAKLSAqIG9uIHRoZSBsaW5lIG91dHNpZGUgdGhlIGNvbm5lY3RpbmcgbGluZSBzZWdtZW50IGFyZSBnaXZlbiB0aGUgc2FtZSAKLSAqIGNvbG9yIGFzIHRoZSBjbG9zZXN0IG9mIHRoZSB0d28gc3BlY2lmaWVkIHBvaW50cy4KKyAqIFRoZSBHcmFkaWVudFBhaW50J3MgZmlsbCBwYXR0ZXJuIGlzIGRldGVybWluZWQgYnkgdHdvIHBvaW50cyBhbmQgdHdvIGNvbG9ycywKKyAqIHBsdXMgdGhlIGN5Y2xpYyBtb2RlIG9wdGlvbi4gRWFjaCBvZiB0aGUgdHdvIHBvaW50cyBpcyBwYWludGVkIHdpdGggaXRzCisgKiBjb3JyZXNwb25kaW5nIGNvbG9yLCBhbmQgb24gdGhlIGxpbmUgc2VnbWVudCBjb25uZWN0aW5nIHRoZSB0d28gcG9pbnRzLCB0aGUKKyAqIGNvbG9yIGlzIHByb3BvcnRpb25hbGx5IGNoYW5nZWQgYmV0d2VlbiB0aGUgdHdvIGNvbG9ycy4gRm9yIHBvaW50cyBvbiB0aGUKKyAqIHNhbWUgbGluZSB3aGljaCBhcmUgbm90IGJldHdlZW4gdGhlIHR3byBzcGVjaWZpZWQgcG9pbnRzIChvdXRzaWRlIG9mIHRoZQorICogY29ubmVjdGluZyBzZWdtZW50KSB0aGVpciBjb2xvciBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBjeWNsaWMgbW9kZSBvcHRpb24uIElmCisgKiB0aGUgbW9kZSBpcyBjeWNsaWMsIHRoZW4gdGhlIHJlc3Qgb2YgdGhlIGxpbmUgcmVwZWF0cyB0aGUgY29sb3IgcGF0dGVybiBvZgorICogdGhlIGNvbm5lY3Rpbmcgc2VnbWVudCwgY3ljbGluZyBiYWNrIGFuZCBmb3J0aCBiZXR3ZWVuIHRoZSB0d28gY29sb3JzLiBJZgorICogbm90LCB0aGUgbW9kZSBpcyBhY3ljbGljIHdoaWNoIG1lYW5zIHRoYXQgYWxsIHBvaW50cyBvbiB0aGUgbGluZSBvdXRzaWRlIHRoZQorICogY29ubmVjdGluZyBsaW5lIHNlZ21lbnQgYXJlIGdpdmVuIHRoZSBzYW1lIGNvbG9yIGFzIHRoZSBjbG9zZXN0IG9mIHRoZSB0d28KKyAqIHNwZWNpZmllZCBwb2ludHMuCiAgKiA8cD4KLSAqIFRoZSBjb2xvciBvZiBwb2ludHMgdGhhdCBhcmUgbm90IG9uIHRoZSBsaW5lIGNvbm5lY3RpbmcgdGhlIHR3byAKLSAqIHNwZWNpZmllZCBwb2ludHMgYXJlIGdpdmVuIGJ5IHBlcnBlbmRpY3VsYXIgcHJvamVjdGlvbjogYnkgdGFraW5nIAotICogdGhlIHNldCBvZiBsaW5lcyBwZXJwZW5kaWN1bGFyIHRvIHRoZSBjb25uZWN0aW5nIGxpbmUgYW5kIGZvciBlYWNoIAotICogb25lLCB0aGUgd2hvbGUgbGluZSBpcyBjb2xvcmVkIHdpdGggdGhlIHNhbWUgY29sb3IuCisgKiBUaGUgY29sb3Igb2YgcG9pbnRzIHRoYXQgYXJlIG5vdCBvbiB0aGUgbGluZSBjb25uZWN0aW5nIHRoZSB0d28gc3BlY2lmaWVkCisgKiBwb2ludHMgYXJlIGdpdmVuIGJ5IHBlcnBlbmRpY3VsYXIgcHJvamVjdGlvbjogYnkgdGFraW5nIHRoZSBzZXQgb2YgbGluZXMKKyAqIHBlcnBlbmRpY3VsYXIgdG8gdGhlIGNvbm5lY3RpbmcgbGluZSBhbmQgZm9yIGVhY2ggb25lLCB0aGUgd2hvbGUgbGluZSBpcworICogY29sb3JlZCB3aXRoIHRoZSBzYW1lIGNvbG9yLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEdyYWRpZW50UGFpbnQgaW1wbGVtZW50cyBQYWludCB7Ci0gICAgCi0gICAgLyoqIFRoZSBzdGFydCBwb2ludCBjb2xvci4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBzdGFydCBwb2ludCBjb2xvci4KKyAgICAgKi8KICAgICBDb2xvciBjb2xvcjE7CiAKLSAgICAvKiogVGhlIGVuZCBjb2xvciBwb2ludC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgZW5kIGNvbG9yIHBvaW50LgorICAgICAqLwogICAgIENvbG9yIGNvbG9yMjsKIAotICAgIC8qKiBUaGUgbG9jYXRpb24gb2YgdGhlIHN0YXJ0IHBvaW50LiAqLworICAgIC8qKgorICAgICAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgc3RhcnQgcG9pbnQuCisgICAgICovCiAgICAgUG9pbnQyRCBwb2ludDE7CiAKLSAgICAvKiogVGhlIGxvY2F0aW9uIG9mIHRoZSBlbmQgcG9pbnQuICovCisgICAgLyoqCisgICAgICogVGhlIGxvY2F0aW9uIG9mIHRoZSBlbmQgcG9pbnQuCisgICAgICovCiAgICAgUG9pbnQyRCBwb2ludDI7CiAKLSAgICAvKiogVGhlIGluZGljYXRvciBvZiBjeWNsZSBmaWxsaW5nLiBJZiBUUlVFIGZpbGxpbmcgCi0gICAgICogcmVwZWF0ZWQgb3V0c2lkZSBwb2ludHMgc3RyaXBlLCBpZiBGQUxTRSBzb2xpZCBjb2xvciBmaWxsaW5nIG91dHNpZGUuICovCisgICAgLyoqCisgICAgICogVGhlIGluZGljYXRvciBvZiBjeWNsZSBmaWxsaW5nLiBJZiBUUlVFIGZpbGxpbmcgcmVwZWF0ZWQgb3V0c2lkZSBwb2ludHMKKyAgICAgKiBzdHJpcGUsIGlmIEZBTFNFIHNvbGlkIGNvbG9yIGZpbGxpbmcgb3V0c2lkZS4KKyAgICAgKi8KICAgICBib29sZWFuIGN5Y2xpYzsKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBHcmFkaWVudFBhaW50IHdpdGggY3ljbGljIG9yIGFjeWNsaWMgbW9kZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcG9pbnQxIHRoZSBmaXJzdCBzcGVjaWZpZWQgcG9pbnQuCi0gICAgICogQHBhcmFtIGNvbG9yMSB0aGUgQ29sb3Igb2YgdGhlIGZpcnN0IHNwZWNpZmllZCBwb2ludC4gCi0gICAgICogQHBhcmFtIHBvaW50MiB0aGUgc2Vjb25kIHNwZWNpZmllZCBwb2ludC4KLSAgICAgKiBAcGFyYW0gY29sb3IyIHRoZSBDb2xvciBvZiB0aGUgc2Vjb25kIHNwZWNpZmllZCBwb2ludC4KLSAgICAgKiBAcGFyYW0gY3ljbGljIHRoZSBjeWNsaWMgbW9kZSAtIHRydWUgaWYgdGhlIGdyYWRpZW50IHBhdHRlcm4gc2hvdWxkIGN5Y2xlIAotICAgICAqIHJlcGVhdGVkbHkgYmV0d2VlbiB0aGUgdHdvIGNvbG9yczsgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEBwYXJhbSBwb2ludDEKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBzcGVjaWZpZWQgcG9pbnQuCisgICAgICogQHBhcmFtIGNvbG9yMQorICAgICAqICAgICAgICAgICAgdGhlIENvbG9yIG9mIHRoZSBmaXJzdCBzcGVjaWZpZWQgcG9pbnQuCisgICAgICogQHBhcmFtIHBvaW50MgorICAgICAqICAgICAgICAgICAgdGhlIHNlY29uZCBzcGVjaWZpZWQgcG9pbnQuCisgICAgICogQHBhcmFtIGNvbG9yMgorICAgICAqICAgICAgICAgICAgdGhlIENvbG9yIG9mIHRoZSBzZWNvbmQgc3BlY2lmaWVkIHBvaW50LgorICAgICAqIEBwYXJhbSBjeWNsaWMKKyAgICAgKiAgICAgICAgICAgIHRoZSBjeWNsaWMgbW9kZSAtIHRydWUgaWYgdGhlIGdyYWRpZW50IHBhdHRlcm4gc2hvdWxkIGN5Y2xlCisgICAgICogICAgICAgICAgICByZXBlYXRlZGx5IGJldHdlZW4gdGhlIHR3byBjb2xvcnM7IGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KLSAgICBwdWJsaWMgR3JhZGllbnRQYWludChQb2ludDJEIHBvaW50MSwgQ29sb3IgY29sb3IxLCBQb2ludDJEIHBvaW50MiwKLSAgICAgICAgICAgIENvbG9yIGNvbG9yMiwgYm9vbGVhbiBjeWNsaWMpIHsKKyAgICBwdWJsaWMgR3JhZGllbnRQYWludChQb2ludDJEIHBvaW50MSwgQ29sb3IgY29sb3IxLCBQb2ludDJEIHBvaW50MiwgQ29sb3IgY29sb3IyLCBib29sZWFuIGN5Y2xpYykgewogICAgICAgICBpZiAocG9pbnQxID09IG51bGwgfHwgcG9pbnQyID09IG51bGwpIHsKICAgICAgICAgICAgIC8vIGF3dC42RD1Qb2ludCBpcyBudWxsCiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNkQiKSk7IC8vJE5PTi1OTFMtMSQKQEAgLTkzLDE3ICsxMDgsMjQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgR3JhZGllbnRQYWludCB3aXRoIGN5Y2xpYyBvciBhY3ljbGljIG1vZGU7Ci0gICAgICogcG9pbnRzIGFyZSBzcGVjaWZpZWQgYnkgY29vcmRpbmF0ZXMuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEdyYWRpZW50UGFpbnQgd2l0aCBjeWNsaWMgb3IgYWN5Y2xpYyBtb2RlOyBwb2ludHMgYXJlCisgICAgICogc3BlY2lmaWVkIGJ5IGNvb3JkaW5hdGVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4MSB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwb2ludC4KLSAgICAgKiBAcGFyYW0geTEgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcG9pbnQuCi0gICAgICogQHBhcmFtIGNvbG9yMSB0aGUgY29sb3Igb2YgdGhlIGZpcnN0IHBvaW50LgotICAgICAqIEBwYXJhbSB4MiB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgcG9pbnQuCi0gICAgICogQHBhcmFtIHkyIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBwb2ludC4KLSAgICAgKiBAcGFyYW0gY29sb3IyIHRoZSBjb2xvciBvZiB0aGUgc2Vjb25kIHBvaW50LgotICAgICAqIEBwYXJhbSBjeWNsaWMgdGhlIGN5Y2xpYyBtb2RlIC0gdHJ1ZSBpZiB0aGUgZ3JhZGllbnQgcGF0dGVybiBzaG91bGQgY3ljbGUgCi0gICAgICogcmVwZWF0ZWRseSBiZXR3ZWVuIHRoZSB0d28gY29sb3JzOyBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIHgxCisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwb2ludC4KKyAgICAgKiBAcGFyYW0geTEKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IHBvaW50LgorICAgICAqIEBwYXJhbSBjb2xvcjEKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2xvciBvZiB0aGUgZmlyc3QgcG9pbnQuCisgICAgICogQHBhcmFtIHgyCisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgcG9pbnQuCisgICAgICogQHBhcmFtIHkyCisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgcG9pbnQuCisgICAgICogQHBhcmFtIGNvbG9yMgorICAgICAqICAgICAgICAgICAgdGhlIGNvbG9yIG9mIHRoZSBzZWNvbmQgcG9pbnQuCisgICAgICogQHBhcmFtIGN5Y2xpYworICAgICAqICAgICAgICAgICAgdGhlIGN5Y2xpYyBtb2RlIC0gdHJ1ZSBpZiB0aGUgZ3JhZGllbnQgcGF0dGVybiBzaG91bGQgY3ljbGUKKyAgICAgKiAgICAgICAgICAgIHJlcGVhdGVkbHkgYmV0d2VlbiB0aGUgdHdvIGNvbG9yczsgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBHcmFkaWVudFBhaW50KGZsb2F0IHgxLCBmbG9hdCB5MSwgQ29sb3IgY29sb3IxLCBmbG9hdCB4MiwgZmxvYXQgeTIsIENvbG9yIGNvbG9yMiwKICAgICAgICAgICAgIGJvb2xlYW4gY3ljbGljKSB7CkBAIC0xMTEsMTUgKzEzMywyMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBhY3ljbGljIEdyYWRpZW50UGFpbnQ7Ci0gICAgICogcG9pbnRzIGFyZSBzcGVjaWZpZWQgYnkgY29vcmRpbmF0ZXMuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGFjeWNsaWMgR3JhZGllbnRQYWludDsgcG9pbnRzIGFyZSBzcGVjaWZpZWQgYnkKKyAgICAgKiBjb29yZGluYXRlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geDEgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcG9pbnQuCi0gICAgICogQHBhcmFtIHkxIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IHBvaW50LgotICAgICAqIEBwYXJhbSBjb2xvcjEgdGhlIGNvbG9yIG9mIHRoZSBmaXJzdCBwb2ludC4KLSAgICAgKiBAcGFyYW0geDIgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIHBvaW50LgotICAgICAqIEBwYXJhbSB5MiB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgcG9pbnQuCi0gICAgICogQHBhcmFtIGNvbG9yMiB0aGUgY29sb3Igb2YgdGhlIHNlY29uZCBwb2ludC4KKyAgICAgKiBAcGFyYW0geDEKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IHBvaW50LgorICAgICAqIEBwYXJhbSB5MQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcG9pbnQuCisgICAgICogQHBhcmFtIGNvbG9yMQorICAgICAqICAgICAgICAgICAgdGhlIGNvbG9yIG9mIHRoZSBmaXJzdCBwb2ludC4KKyAgICAgKiBAcGFyYW0geDIKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBwb2ludC4KKyAgICAgKiBAcGFyYW0geTIKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBwb2ludC4KKyAgICAgKiBAcGFyYW0gY29sb3IyCisgICAgICogICAgICAgICAgICB0aGUgY29sb3Igb2YgdGhlIHNlY29uZCBwb2ludC4KICAgICAgKi8KICAgICBwdWJsaWMgR3JhZGllbnRQYWludChmbG9hdCB4MSwgZmxvYXQgeTEsIENvbG9yIGNvbG9yMSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBDb2xvciBjb2xvcjIpIHsKICAgICAgICAgdGhpcyh4MSwgeTEsIGNvbG9yMSwgeDIsIHkyLCBjb2xvcjIsIGZhbHNlKTsKQEAgLTEyOCwyOSArMTU2LDM4IEBACiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGFjeWNsaWMgR3JhZGllbnRQYWludC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcG9pbnQxIHRoZSBmaXJzdCBzcGVjaWZpZWQgcG9pbnQuCi0gICAgICogQHBhcmFtIGNvbG9yMSB0aGUgQ29sb3Igb2YgdGhlIGZpcnN0IHNwZWNpZmllZCBwb2ludC4gCi0gICAgICogQHBhcmFtIHBvaW50MiB0aGUgc2Vjb25kIHNwZWNpZmllZCBwb2ludC4KLSAgICAgKiBAcGFyYW0gY29sb3IyIHRoZSBDb2xvciBvZiB0aGUgc2Vjb25kIHNwZWNpZmllZCBwb2ludC4KKyAgICAgKiBAcGFyYW0gcG9pbnQxCisgICAgICogICAgICAgICAgICB0aGUgZmlyc3Qgc3BlY2lmaWVkIHBvaW50LgorICAgICAqIEBwYXJhbSBjb2xvcjEKKyAgICAgKiAgICAgICAgICAgIHRoZSBDb2xvciBvZiB0aGUgZmlyc3Qgc3BlY2lmaWVkIHBvaW50LgorICAgICAqIEBwYXJhbSBwb2ludDIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgc3BlY2lmaWVkIHBvaW50LgorICAgICAqIEBwYXJhbSBjb2xvcjIKKyAgICAgKiAgICAgICAgICAgIHRoZSBDb2xvciBvZiB0aGUgc2Vjb25kIHNwZWNpZmllZCBwb2ludC4KICAgICAgKi8KICAgICBwdWJsaWMgR3JhZGllbnRQYWludChQb2ludDJEIHBvaW50MSwgQ29sb3IgY29sb3IxLCBQb2ludDJEIHBvaW50MiwgQ29sb3IgY29sb3IyKSB7CiAgICAgICAgIHRoaXMocG9pbnQxLCBjb2xvcjEsIHBvaW50MiwgY29sb3IyLCBmYWxzZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBQYWludENvbnRleHQgZm9yIGEgY29sb3IgcGF0dGVybiBnZW5lcmF0aW5nLiAKKyAgICAgKiBDcmVhdGVzIFBhaW50Q29udGV4dCBmb3IgYSBjb2xvciBwYXR0ZXJuIGdlbmVyYXRpbmcuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNtIHRoZSBDb2xvck1vZGVsIG9mIHRoZSBQYWludCBkYXRhLgotICAgICAqIEBwYXJhbSBkZXZpY2VCb3VuZHMgdGhlIGJvdW5kaW5nIFJlY3RhbmdsZSBvZiBncmFwaGljcyBwcmltaXRpdmVzCi0gICAgICogYmVpbmcgcmVuZGVyZWQgaW4gdGhlIGRldmljZSBzcGFjZS4gCi0gICAgICogQHBhcmFtIHVzZXJCb3VuZHMgdHRoZSBib3VuZGluZyBSZWN0YW5nbGUgb2YgZ3JhcGhpY3MgcHJpbWl0aXZlcwotICAgICAqIGJlaW5nIHJlbmRlcmVkIGluIHRoZSB1c2VyIHNwYWNlLiAKLSAgICAgKiBAcGFyYW0gdCB0aGUgQWZmaW5lVHJhbnNmb3JtIGZyb20gdXNlciBzcGFjZSBpbnRvIGRldmljZSBzcGFjZS4KLSAgICAgKiBAcGFyYW0gaGludHMgdGhlIFJyZW5kZXJpbmdIaW50cyBvYmplY3QuCi0gICAgICogCisgICAgICogQHBhcmFtIGNtCisgICAgICogICAgICAgICAgICB0aGUgQ29sb3JNb2RlbCBvZiB0aGUgUGFpbnQgZGF0YS4KKyAgICAgKiBAcGFyYW0gZGV2aWNlQm91bmRzCisgICAgICogICAgICAgICAgICB0aGUgYm91bmRpbmcgUmVjdGFuZ2xlIG9mIGdyYXBoaWNzIHByaW1pdGl2ZXMgYmVpbmcgcmVuZGVyZWQKKyAgICAgKiAgICAgICAgICAgIGluIHRoZSBkZXZpY2Ugc3BhY2UuCisgICAgICogQHBhcmFtIHVzZXJCb3VuZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBib3VuZGluZyBSZWN0YW5nbGUgb2YgZ3JhcGhpY3MgcHJpbWl0aXZlcyBiZWluZyByZW5kZXJlZAorICAgICAqICAgICAgICAgICAgaW4gdGhlIHVzZXIgc3BhY2UuCisgICAgICogQHBhcmFtIHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBBZmZpbmVUcmFuc2Zvcm0gZnJvbSB1c2VyIHNwYWNlIGludG8gZGV2aWNlIHNwYWNlLgorICAgICAqIEBwYXJhbSBoaW50cworICAgICAqICAgICAgICAgICAgdGhlIFJyZW5kZXJpbmdIaW50cyBvYmplY3QuCiAgICAgICogQHJldHVybiB0aGUgUGFpbnRDb250ZXh0IGZvciBjb2xvciBwYXR0ZXJuIGdlbmVyYXRpbmcuCi0gICAgICogCi0gICAgICogQHNlZSBqYXZhLmF3dC5QYWludCNjcmVhdGVDb250ZXh0KGphdmEuYXd0LmltYWdlLkNvbG9yTW9kZWwsIGphdmEuYXd0LlJlY3RhbmdsZSwgamF2YS5hd3QuZ2VvbS5SZWN0YW5nbGUyRCwgamF2YS5hd3QuZ2VvbS5BZmZpbmVUcmFuc2Zvcm0sIGphdmEuYXd0LlJlbmRlcmluZ0hpbnRzKQorICAgICAqIEBzZWUgamF2YS5hd3QuUGFpbnQjY3JlYXRlQ29udGV4dChqYXZhLmF3dC5pbWFnZS5Db2xvck1vZGVsLAorICAgICAqICAgICAgamF2YS5hd3QuUmVjdGFuZ2xlLCBqYXZhLmF3dC5nZW9tLlJlY3RhbmdsZTJELAorICAgICAqICAgICAgamF2YS5hd3QuZ2VvbS5BZmZpbmVUcmFuc2Zvcm0sIGphdmEuYXd0LlJlbmRlcmluZ0hpbnRzKQogICAgICAqLwogICAgIHB1YmxpYyBQYWludENvbnRleHQgY3JlYXRlQ29udGV4dChDb2xvck1vZGVsIGNtLCBSZWN0YW5nbGUgZGV2aWNlQm91bmRzLAogICAgICAgICAgICAgUmVjdGFuZ2xlMkQgdXNlckJvdW5kcywgQWZmaW5lVHJhbnNmb3JtIHQsIFJlbmRlcmluZ0hpbnRzIGhpbnRzKSB7CkBAIC0xNzgsNyArMjE1LDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBmaXJzdCBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBQb2ludCBvYmplY3QgLSB0aGUgZmlyc3QgcG9pbnQuIAorICAgICAqIEByZXR1cm4gdGhlIFBvaW50IG9iamVjdCAtIHRoZSBmaXJzdCBwb2ludC4KICAgICAgKi8KICAgICBwdWJsaWMgUG9pbnQyRCBnZXRQb2ludDEoKSB7CiAgICAgICAgIHJldHVybiBwb2ludDE7CkBAIC0xOTcsNyArMjM0LDYgQEAKICAgICAgKiBHZXRzIHRoZSB0cmFuc3BhcmVuY3kgbW9kZSBmb3IgdGhlIEdyYWRpZW50UGFpbnQuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgdHJhbnNwYXJlbmN5IG1vZGUgZm9yIHRoZSBHcmFkaWVudFBhaW50LgotICAgICAqIAogICAgICAqIEBzZWUgamF2YS5hd3QuVHJhbnNwYXJlbmN5I2dldFRyYW5zcGFyZW5jeSgpCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRUcmFuc3BhcmVuY3koKSB7CkBAIC0yMDcsMTEgKzI0MywxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEdyYWRpZW50UGFpbnQgbW9kZTogdHJ1ZSBmb3IgY3ljbGljIG1vZGUsIGZhbHNlIGZvcgotICAgICAqIGFjeWNsaWMgbW9kZS4KKyAgICAgKiBSZXR1cm5zIHRoZSBHcmFkaWVudFBhaW50IG1vZGU6IHRydWUgZm9yIGN5Y2xpYyBtb2RlLCBmYWxzZSBmb3IgYWN5Y2xpYworICAgICAqIG1vZGUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBncmFkaWVudCBjeWNsZXMgcmVwZWF0ZWRseSBiZXR3ZWVuIHRoZSB0d28gY29sb3JzOyAKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBncmFkaWVudCBjeWNsZXMgcmVwZWF0ZWRseSBiZXR3ZWVuIHRoZSB0d28gY29sb3JzOworICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzQ3ljbGljKCkgewogICAgICAgICByZXR1cm4gY3ljbGljOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L0dyYXBoaWNzLmphdmEgYi9hd3QvamF2YS9hd3QvR3JhcGhpY3MuamF2YQppbmRleCBjMjBmNmJjLi4yZDZlNzlmIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvR3JhcGhpY3MuamF2YQorKysgYi9hd3QvamF2YS9hd3QvR3JhcGhpY3MuamF2YQpAQCAtMTgsMjYgKzE4LDI3IEBACiAgKiBAYXV0aG9yIEFsZXhleSBBLiBQZXRyZW5rbwogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3Q7CiAKIGltcG9ydCBqYXZhLmF3dC5pbWFnZS5JbWFnZU9ic2VydmVyOwogaW1wb3J0IGphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3I7CiAKIC8qKgotICogVGhlIGFic3RyYWN0IEdyYXBoaWNzIGNsYXNzIGFsbG93cyBhcHBsaWNhdGlvbnMgdG8gZHJhdyBvbiBhIHNjcmVlbgotICogb3Igb3RoZXIgcmVuZGVyaW5nIHRhcmdldC4gVGhlcmUgYXJlIHNldmVyYWwgcHJvcGVydGllcyB3aGljaCAKLSAqIGRlZmluZSByZW5kZXJpbmcgb3B0aW9uczogb3JpZ2luIHBvaW50LCBjbGlwcGluZyBhcmVhLCBjb2xvciwgZm9udC4KLSAqIDxicj48YnI+Ci0gKiBUaGUgb3JpZ2luIHBvaW50IHNwZWNpZmllcyB0aGUgYmVnZ2luaW5nIG9mIHRoZSBjbGlwcGluZyBhcmVhIGNvb3JkaW5hdGUgCi0gKiBzeXN0ZW0uIEFsbCBjb29yZGluYXRlcyB1c2VkIGluIHJlbmRlcmluZyBvcGVyYXRpb25zIGFyZSBjb21wdXRlZCB3aXRoIAotICogcmVzcGVjdCB0byB0aGlzIHBvaW50LiBUaGUgY2xpcHBpbmcgYXJlYSBkZWZpbmVzIHRoZSBib3VuZGFyaWVzIHdoZXJlIAotICogcmVuZGVyaW5nIG9wZXJhdGlvbnMgY2FuIGJlIHBlcmZvcm1lZC4gUmVuZGVyaW5nIG9wZXJhdGlvbnMgY2FuJ3QgbW9kaWZ5IAotICogcGl4ZWxzIG91dHNpZGUgb2YgdGhlIGNsaXBwaW5nIGFyZWEuCi0gKiA8YnI+PGJyPgotICogVGhlIGRyYXcgYW5kIGZpbGwgbWV0aG9kcyBhbGxvdyBhcHBsaWNhdGlvbnMgdG8gZHJhd2luZyBzaGFwZXMsIHRleHQsIAotICogaW1hZ2VzIHdpdGggc3BlY2lmaWVkIGZvbnQgYW5kIGNvbG9yIG9wdGlvbnMgaW4gdGhlIHNwZWNpZmllZCBwYXJ0IAotICogb2YgdGhlIHNjcmVlbi4KLSAqICAgIAorICogVGhlIGFic3RyYWN0IEdyYXBoaWNzIGNsYXNzIGFsbG93cyBhcHBsaWNhdGlvbnMgdG8gZHJhdyBvbiBhIHNjcmVlbiBvciBvdGhlcgorICogcmVuZGVyaW5nIHRhcmdldC4gVGhlcmUgYXJlIHNldmVyYWwgcHJvcGVydGllcyB3aGljaCBkZWZpbmUgcmVuZGVyaW5nCisgKiBvcHRpb25zOiBvcmlnaW4gcG9pbnQsIGNsaXBwaW5nIGFyZWEsIGNvbG9yLCBmb250LiA8YnI+CisgKiA8YnI+CisgKiBUaGUgb3JpZ2luIHBvaW50IHNwZWNpZmllcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjbGlwcGluZyBhcmVhIGNvb3JkaW5hdGUKKyAqIHN5c3RlbS4gQWxsIGNvb3JkaW5hdGVzIHVzZWQgaW4gcmVuZGVyaW5nIG9wZXJhdGlvbnMgYXJlIGNvbXB1dGVkIHdpdGgKKyAqIHJlc3BlY3QgdG8gdGhpcyBwb2ludC4gVGhlIGNsaXBwaW5nIGFyZWEgZGVmaW5lcyB0aGUgYm91bmRhcmllcyB3aGVyZQorICogcmVuZGVyaW5nIG9wZXJhdGlvbnMgY2FuIGJlIHBlcmZvcm1lZC4gUmVuZGVyaW5nIG9wZXJhdGlvbnMgY2FuJ3QgbW9kaWZ5CisgKiBwaXhlbHMgb3V0c2lkZSBvZiB0aGUgY2xpcHBpbmcgYXJlYS4gPGJyPgorICogPGJyPgorICogVGhlIGRyYXcgYW5kIGZpbGwgbWV0aG9kcyBhbGxvdyBhcHBsaWNhdGlvbnMgdG8gZHJhd2luZyBzaGFwZXMsIHRleHQsIGltYWdlcworICogd2l0aCBzcGVjaWZpZWQgZm9udCBhbmQgY29sb3Igb3B0aW9ucyBpbiB0aGUgc3BlY2lmaWVkIHBhcnQgb2YgdGhlIHNjcmVlbi4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHcmFwaGljcyB7CiAKQEAgLTQ1LDcgKzQ2LDcgQEAKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBHcmFwaGljcy4gVGhpcyBjb25zdHJ1Y3RvciBpcyBkZWZhdWx0IGZvciBHcmFwaGljcyBhbmQKLSAgICAgKiBjYW4gbm90IGJlIGNhbGxlZCBkaXJlY3RseS4gCisgICAgICogY2FuIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIEdyYXBoaWNzKCkgewogICAgIH0KQEAgLTUzLDE5ICs1NCwyMiBAQAogICAgIC8vIFB1YmxpYyBtZXRob2RzCiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgY29weSBvZiB0aGUgR3JhcGhpY3Mgb2JqZWN0IHdpdGggYSBuZXcgb3JpZ2luIGFuZCBhIG5ldyAKLSAgICAgKiBzcGVjaWZpZWQgY2xpcCBhcmVhLiBUaGUgbmV3IGNsaXAgYXJlYSBpcyB0aGUgcmVjdGFuZ2xlIGRlZmluZWQgYnkgCi0gICAgICogdGhlIG9yaWdpbiBwb2ludCB3aXRoIGNvb3JkaW5hdGVzIFgsWSBhbmQgdGhlIGdpdmVuIHdpZHRoIGFuZCBoZWlnaHQuIAotICAgICAqIFRoZSBjb29yZGluYXRlcyBvZiBhbGwgc3Vic2VxdWVudCByZW5kZXJpbmcgb3BlcmF0aW9ucyB3aWxsIGJlIGNvbXB1dGVkCi0gICAgICogd2l0aCByZXNwZWN0IHRvIHRoZSBuZXcgb3JpZ2luIGFuZCBjYW4gYmUgcGVyZm9ybWVkIG9ubHkgd2l0aGluIHRoZSAKLSAgICAgKiByYW5nZSBvZiB0aGUgY2xpcHBpbmcgYXJlYSBkaW1lbnRpb25zLiAKLSAgICAgKiAgCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgb3JpZ2luYWwgcG9pbnQKLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBvcmlnaW5hbCBwb2ludAotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgY2xpcHBpbmcgYXJlYQotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiBjbGlwcGluZyBhcmVhCisgICAgICogQ3JlYXRlcyBhIGNvcHkgb2YgdGhlIEdyYXBoaWNzIG9iamVjdCB3aXRoIGEgbmV3IG9yaWdpbiBhbmQgYSBuZXcKKyAgICAgKiBzcGVjaWZpZWQgY2xpcCBhcmVhLiBUaGUgbmV3IGNsaXAgYXJlYSBpcyB0aGUgcmVjdGFuZ2xlIGRlZmluZWQgYnkgdGhlCisgICAgICogb3JpZ2luIHBvaW50IHdpdGggY29vcmRpbmF0ZXMgWCxZIGFuZCB0aGUgZ2l2ZW4gd2lkdGggYW5kIGhlaWdodC4gVGhlCisgICAgICogY29vcmRpbmF0ZXMgb2YgYWxsIHN1YnNlcXVlbnQgcmVuZGVyaW5nIG9wZXJhdGlvbnMgd2lsbCBiZSBjb21wdXRlZCB3aXRoCisgICAgICogcmVzcGVjdCB0byB0aGUgbmV3IG9yaWdpbiBhbmQgY2FuIGJlIHBlcmZvcm1lZCBvbmx5IHdpdGhpbiB0aGUgcmFuZ2Ugb2YKKyAgICAgKiB0aGUgY2xpcHBpbmcgYXJlYSBkaW1lbnNpb25zLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIEdyYXBoaWNzIG9iamVjdCB3aXRoIG5ldyBvcmlnaW4gcG9pbnQgYW5kIGNsaXBwaW5nIGFyZWEuIAorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBvcmlnaW5hbCBwb2ludC4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgb3JpZ2luYWwgcG9pbnQuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgY2xpcHBpbmcgYXJlYS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIGNsaXBwaW5nIGFyZWEuCisgICAgICogQHJldHVybiB0aGUgR3JhcGhpY3Mgb2JqZWN0IHdpdGggbmV3IG9yaWdpbiBwb2ludCBhbmQgY2xpcHBpbmcgYXJlYS4KICAgICAgKi8KICAgICBwdWJsaWMgR3JhcGhpY3MgY3JlYXRlKGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CiAgICAgICAgIEdyYXBoaWNzIHJlcyA9IGNyZWF0ZSgpOwpAQCAtNzUsMTggKzc5LDI0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRHJhd3MgdGhlIGhpZ2xpZ2h0ZWQgb3V0bGluZSBvZiBhIHJlY3RhbmdsZS4KKyAgICAgKiBEcmF3cyB0aGUgaGlnaGxpZ2h0ZWQgb3V0bGluZSBvZiBhIHJlY3RhbmdsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB0b3AgbGVmdCBjb3JuZXIuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdG9wIGxlZnQgY29ybmVyLgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIHJhaXNlZCBhIGJvb2xlYW4gdmFsdWUgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHJlY3RhbmdsZSAKLSAgICAgKiBpcyBkcmF3biBhcyByYWlzZWQgb3IgaW5kZW50ZWQuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHRvcCBsZWZ0IGNvcm5lci4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdG9wIGxlZnQgY29ybmVyLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gcmFpc2VkCisgICAgICogICAgICAgICAgICBhIGJvb2xlYW4gdmFsdWUgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHJlY3RhbmdsZSBpcyBkcmF3bgorICAgICAqICAgICAgICAgICAgYXMgcmFpc2VkIG9yIGluZGVudGVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRyYXczRFJlY3QoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGJvb2xlYW4gcmFpc2VkKSB7CiAgICAgICAgIC8vIE5vdGU6IGxpZ2h0ZXIvZGFya2VyIGNvbG9ycyBzaG91bGQgYmUgdXNlZCB0byBkcmF3IDNkIHJlY3QuCi0gICAgICAgIC8vIFRoZSByZXN1bHRpbmcgcmVjdCBpcyAod2lkdGgrMSl4KGhlaWdodCsxKS4gU3Ryb2tlIGFuZCBwYWludCBhdHRyaWJ1dGVzIG9mCisgICAgICAgIC8vIFRoZSByZXN1bHRpbmcgcmVjdCBpcyAod2lkdGgrMSl4KGhlaWdodCsxKS4gU3Ryb2tlIGFuZCBwYWludAorICAgICAgICAvLyBhdHRyaWJ1dGVzIG9mCiAgICAgICAgIC8vIHRoZSBHcmFwaGljczJEIHNob3VsZCBiZSByZXNldCB0byB0aGUgZGVmYXVsdCB2YWx1ZXMuCiAgICAgICAgIC8vIGZpbGxSZWN0IGlzIHVzZWQgaW5zdGVhZCBvZiBkcmF3TGluZSB0byBieXBhc3Mgc3Ryb2tlCiAgICAgICAgIC8vIHJlc2V0L3NldCBhbmQgcmFzdGVyaXphdGlvbi4KQEAgLTEwMywzNiArMTEzLDQ2IEBACiAKICAgICAgICAgc2V0Q29sb3IoY29sb3JVcCk7CiAgICAgICAgIGZpbGxSZWN0KHgsIHksIHdpZHRoLCAxKTsKLSAgICAgICAgZmlsbFJlY3QoeCwgeSsxLCAxLCBoZWlnaHQpOworICAgICAgICBmaWxsUmVjdCh4LCB5ICsgMSwgMSwgaGVpZ2h0KTsKIAogICAgICAgICBzZXRDb2xvcihjb2xvckRvd24pOwotICAgICAgICBmaWxsUmVjdCh4K3dpZHRoLCB5LCAxLCBoZWlnaHQpOwotICAgICAgICBmaWxsUmVjdCh4KzEsIHkraGVpZ2h0LCB3aWR0aCwgMSk7CisgICAgICAgIGZpbGxSZWN0KHggKyB3aWR0aCwgeSwgMSwgaGVpZ2h0KTsKKyAgICAgICAgZmlsbFJlY3QoeCArIDEsIHkgKyBoZWlnaHQsIHdpZHRoLCAxKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBEcmF3cyB0aGUgdGV4dCByZXByZXNlbnRlZCBieSBieXRlIGFycmF5LiBUaGlzIG1ldGhvZCB1c2VzIHRoZSBjdXJyZW50IAorICAgICAqIERyYXdzIHRoZSB0ZXh0IHJlcHJlc2VudGVkIGJ5IGJ5dGUgYXJyYXkuIFRoaXMgbWV0aG9kIHVzZXMgdGhlIGN1cnJlbnQKICAgICAgKiBmb250IGFuZCBjb2xvciBmb3IgcmVuZGVyaW5nLgogICAgICAqIAotICAgICAqIEBwYXJhbSBieXRlcyB0aGUgYnl0ZSBhcnJheSB3aGljaCBjb250YWlucyB0aGUgdGV4dCB0byBiZSBkcmF3bi4gCi0gICAgICogQHBhcmFtIG9mZiB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgYnl0ZSBhcnJheSBvZiB0aGUgdGV4dCB0byBiZSBkcmF3bi4KLSAgICAgKiBAcGFyYW0gbGVuIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgdGV4dCB0byBkcmF3LiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIHdoZXJlIHRoZSB0ZXh0IGlzIHRvIGJlIGRyYXduLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgd2hlcmUgdGhlIHRleHQgaXMgdG8gYmUgZHJhd24uCisgICAgICogQHBhcmFtIGJ5dGVzCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSBhcnJheSB3aGljaCBjb250YWlucyB0aGUgdGV4dCB0byBiZSBkcmF3bi4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgYnl0ZSBhcnJheSBvZiB0aGUgdGV4dCB0byBiZSBkcmF3bi4KKyAgICAgKiBAcGFyYW0gbGVuCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIHRleHQgdG8gZHJhdy4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSB3aGVyZSB0aGUgdGV4dCBpcyB0byBiZSBkcmF3bi4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSB3aGVyZSB0aGUgdGV4dCBpcyB0byBiZSBkcmF3bi4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBkcmF3Qnl0ZXMoYnl0ZVtdIGJ5dGVzLCBpbnQgb2ZmLCBpbnQgbGVuLCBpbnQgeCwgaW50IHkpIHsKICAgICAgICAgZHJhd1N0cmluZyhuZXcgU3RyaW5nKGJ5dGVzLCBvZmYsIGxlbiksIHgsIHkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIERyYXdzIHRoZSB0ZXh0IHJlcHJlc2VudGVkIGJ5IGNoYXJhY3RlciBhcnJheS4gVGhpcyBtZXRob2QgdXNlcyB0aGUgCisgICAgICogRHJhd3MgdGhlIHRleHQgcmVwcmVzZW50ZWQgYnkgY2hhcmFjdGVyIGFycmF5LiBUaGlzIG1ldGhvZCB1c2VzIHRoZQogICAgICAqIGN1cnJlbnQgZm9udCBhbmQgY29sb3IgZm9yIHJlbmRlcmluZy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2hhcnMgdGhlIGNoYXJhY3RlciBhcnJheS4gCi0gICAgICogQHBhcmFtIG9mZiB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgY2hhcmFjdGVyIGFycmF5IG9mIHRoZSB0ZXh0IHRvIGJlIGRyYXduLgotICAgICAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdoaWNoIHdpbGwgYmUgZHJhd24uIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgd2hlcmUgdGhlIHRleHQgaXMgdG8gYmUgZHJhd24uCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSB3aGVyZSB0aGUgdGV4dCBpcyB0byBiZSBkcmF3bi4KKyAgICAgKiBAcGFyYW0gY2hhcnMKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgYXJyYXkuCisgICAgICogQHBhcmFtIG9mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCB3aXRoaW4gdGhlIGNoYXJhY3RlciBhcnJheSBvZiB0aGUgdGV4dCB0byBiZSBkcmF3bi4KKyAgICAgKiBAcGFyYW0gbGVuCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd2hpY2ggd2lsbCBiZSBkcmF3bi4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSB3aGVyZSB0aGUgdGV4dCBpcyB0byBiZSBkcmF3bi4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSB3aGVyZSB0aGUgdGV4dCBpcyB0byBiZSBkcmF3bi4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBkcmF3Q2hhcnMoY2hhcltdIGNoYXJzLCBpbnQgb2ZmLCBpbnQgbGVuLCBpbnQgeCwgaW50IHkpIHsKICAgICAgICAgZHJhd1N0cmluZyhuZXcgU3RyaW5nKGNoYXJzLCBvZmYsIGxlbiksIHgsIHkpOwpAQCAtMTQxLDM3ICsxNjEsNTEgQEAKICAgICAvKioKICAgICAgKiBEcmF3cyB0aGUgb3V0bGluZSBvZiBhIHBvbHlnb24gd2hpY2ggaXMgZGVmaW5lZCBieSBQb2x5Z29uIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcCB0aGUgUG9seWdvbiBvYmplY3QuCisgICAgICogQHBhcmFtIHAKKyAgICAgKiAgICAgICAgICAgIHRoZSBQb2x5Z29uIG9iamVjdC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBkcmF3UG9seWdvbihQb2x5Z29uIHApIHsKICAgICAgICAgZHJhd1BvbHlnb24ocC54cG9pbnRzLCBwLnlwb2ludHMsIHAubnBvaW50cyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRHJhd3MgdGhlIHJlY3RhbmdsZSB3aXRoIHRoZSBzcGVjaWZpZWQgd2lkdGggYW5kIGxlbmd0aCBhbmQgdG9wIGxlZnQgCisgICAgICogRHJhd3MgdGhlIHJlY3RhbmdsZSB3aXRoIHRoZSBzcGVjaWZpZWQgd2lkdGggYW5kIGxlbmd0aCBhbmQgdG9wIGxlZnQKICAgICAgKiBjb3JuZXIgY29vcmRpbmF0ZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdG9wIGxlZnQgY29ybmVyLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHRvcCBsZWZ0IGNvcm5lci4KLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHRvcCBsZWZ0IGNvcm5lci4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdG9wIGxlZnQgY29ybmVyLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRyYXdSZWN0KGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIGludCBbXXhwb2ludHMgPSB7eCwgeCwgeCt3aWR0aCwgeCt3aWR0aH07Ci0gICAgICAgIGludCBbXXlwb2ludHMgPSB7eSwgeStoZWlnaHQsIHkraGVpZ2h0LCB5fTsKKyAgICAgICAgaW50W10geHBvaW50cyA9IHsKKyAgICAgICAgICAgICAgICB4LCB4LCB4ICsgd2lkdGgsIHggKyB3aWR0aAorICAgICAgICB9OworICAgICAgICBpbnRbXSB5cG9pbnRzID0geworICAgICAgICAgICAgICAgIHksIHkgKyBoZWlnaHQsIHkgKyBoZWlnaHQsIHkKKyAgICAgICAgfTsKIAogICAgICAgICBkcmF3UG9seWdvbih4cG9pbnRzLCB5cG9pbnRzLCA0KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBGaWxscyB0aGUgaGlnbGlnaHRlZCBvdXRsaW5lIG9mIGEgcmVjdGFuZ2xlLgorICAgICAqIEZpbGxzIHRoZSBoaWdobGlnaHRlZCBvdXRsaW5lIG9mIGEgcmVjdGFuZ2xlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHRvcCBsZWZ0IGNvcm5lci4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB0b3AgbGVmdCBjb3JuZXIuCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSByYWlzZWQgYSBib29sZWFuIHZhbHVlIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSByZWN0YW5nbGUgCi0gICAgICogaXMgZHJhd24gYXMgcmFpc2VkIG9yIGluZGVudGVkLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB0b3AgbGVmdCBjb3JuZXIuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHRvcCBsZWZ0IGNvcm5lci4KKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gcmFpc2VkCisgICAgICogICAgICAgICAgICBhIGJvb2xlYW4gdmFsdWUgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHJlY3RhbmdsZSBpcyBkcmF3bgorICAgICAqICAgICAgICAgICAgYXMgcmFpc2VkIG9yIGluZGVudGVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGZpbGwzRFJlY3QoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGJvb2xlYW4gcmFpc2VkKSB7CiAgICAgICAgIC8vIE5vdGU6IGxpZ2h0ZXIvZGFya2VyIGNvbG9ycyBzaG91bGQgYmUgdXNlZCB0byBkcmF3IDNkIHJlY3QuCkBAIC0xNzksNyArMjEzLDcgQEAKICAgICAgICAgLy8gU3Ryb2tlIGFuZCBwYWludCBhdHRyaWJ1dGVzIG9mIHRoZSBHcmFwaGljczJEIHNob3VsZCBiZSByZXNldAogICAgICAgICAvLyB0byB0aGUgZGVmYXVsdCB2YWx1ZXMuIGZpbGxSZWN0IGlzIHVzZWQgaW5zdGVhZCBvZiBkcmF3TGluZSB0bwogICAgICAgICAvLyBieXBhc3Mgc3Ryb2tlIHJlc2V0L3NldCBhbmQgbGluZSByYXN0ZXJpemF0aW9uLgotICAgICAgICAKKwogICAgICAgICBDb2xvciBjb2xvciA9IGdldENvbG9yKCk7CiAgICAgICAgIENvbG9yIGNvbG9yVXAsIGNvbG9yRG93bjsKICAgICAgICAgaWYgKHJhaXNlZCkgewpAQCAtMTk0LDIxICsyMjgsMjIgQEAKIAogICAgICAgICB3aWR0aC0tOwogICAgICAgICBoZWlnaHQtLTsKLSAgICAgICAgZmlsbFJlY3QoeCsxLCB5KzEsIHdpZHRoLTEsIGhlaWdodC0xKTsKKyAgICAgICAgZmlsbFJlY3QoeCArIDEsIHkgKyAxLCB3aWR0aCAtIDEsIGhlaWdodCAtIDEpOwogCiAgICAgICAgIHNldENvbG9yKGNvbG9yVXApOwogICAgICAgICBmaWxsUmVjdCh4LCB5LCB3aWR0aCwgMSk7Ci0gICAgICAgIGZpbGxSZWN0KHgsIHkrMSwgMSwgaGVpZ2h0KTsKKyAgICAgICAgZmlsbFJlY3QoeCwgeSArIDEsIDEsIGhlaWdodCk7CiAKICAgICAgICAgc2V0Q29sb3IoY29sb3JEb3duKTsKLSAgICAgICAgZmlsbFJlY3QoeCt3aWR0aCwgeSwgMSwgaGVpZ2h0KTsKLSAgICAgICAgZmlsbFJlY3QoeCsxLCB5K2hlaWdodCwgd2lkdGgsIDEpOworICAgICAgICBmaWxsUmVjdCh4ICsgd2lkdGgsIHksIDEsIGhlaWdodCk7CisgICAgICAgIGZpbGxSZWN0KHggKyAxLCB5ICsgaGVpZ2h0LCB3aWR0aCwgMSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogRmlsbHMgdGhlIHBvbHlnb24gd2l0aCB0aGUgY3VycmVudCBjb2xvci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcCB0aGUgUG9seWdvbiBvYmplY3QuCisgICAgICogQHBhcmFtIHAKKyAgICAgKiAgICAgICAgICAgIHRoZSBQb2x5Z29uIG9iamVjdC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBmaWxsUG9seWdvbihQb2x5Z29uIHApIHsKICAgICAgICAgZmlsbFBvbHlnb24ocC54cG9pbnRzLCBwLnlwb2ludHMsIHAubnBvaW50cyk7CkBAIC0yMjIsMTIgKzI1NywxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGJvdW5kcyBvZiB0aGUgY3VycmVudCBjbGlwcGluZyBhcmVhIGFzIGEgcmVjdGFuZ2xlIAotICAgICAqIGFuZCBjb3BpZXMgaXQgdG8gYW4gZXhpc3RpbmcgcmVjdGFuZ2xlLgotICAgICAqICAKLSAgICAgKiBAcGFyYW0gciBhIFJlY3RhbmdsZSBvYmplY3Qgd2hlcmUgdGhlIGN1cnJlbnQgY2xpcHBpbmcgYXJlYSAKLSAgICAgKiBib3VuZHMgYXJlIHRvIGJlIGNvcGllZC4KKyAgICAgKiBHZXRzIHRoZSBib3VuZHMgb2YgdGhlIGN1cnJlbnQgY2xpcHBpbmcgYXJlYSBhcyBhIHJlY3RhbmdsZSBhbmQgY29waWVzIGl0CisgICAgICogdG8gYW4gZXhpc3RpbmcgcmVjdGFuZ2xlLgogICAgICAqIAorICAgICAqIEBwYXJhbSByCisgICAgICogICAgICAgICAgICBhIFJlY3RhbmdsZSBvYmplY3Qgd2hlcmUgdGhlIGN1cnJlbnQgY2xpcHBpbmcgYXJlYSBib3VuZHMgYXJlCisgICAgICogICAgICAgICAgICB0byBiZSBjb3BpZWQuCiAgICAgICogQHJldHVybiB0aGUgYm91bmRzIG9mIHRoZSBjdXJyZW50IGNsaXBwaW5nIGFyZWEuCiAgICAgICovCiAgICAgcHVibGljIFJlY3RhbmdsZSBnZXRDbGlwQm91bmRzKFJlY3RhbmdsZSByKSB7CkBAIC0yNDgsOCArMjgzLDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBib3VuZHMgb2YgdGhlIGN1cnJlbnQgY2xpcHBpbmcgYXJlYSBhcyBhIHJlY3RhbmdsZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgUmVjdGFuZ2xlIG9iamVjdCAKLSAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgUmVjdGFuZ2xlIG9iamVjdC4KICAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRDbGlwQm91bmRzKCl9CiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKQEAgLTI1OCw5ICsyOTIsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGZvbnQgbWV0cmljcyBvZiB0aGUgY3VycmVudCBmb250LiAKLSAgICAgKiBUaGUgZm9udCBtZXRyaWNzIG9iamVjdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVuZGVyaW5nIAotICAgICAqIG9mIGEgcGFydGljdWxhciBmb250LgorICAgICAqIEdldHMgdGhlIGZvbnQgbWV0cmljcyBvZiB0aGUgY3VycmVudCBmb250LiBUaGUgZm9udCBtZXRyaWNzIG9iamVjdAorICAgICAqIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZW5kZXJpbmcgb2YgYSBwYXJ0aWN1bGFyIGZvbnQuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgZm9udCBtZXRyaWNzIG9mIGN1cnJlbnQgZm9udC4KICAgICAgKi8KQEAgLTI2OSwxOSArMzAyLDIzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIHJlY3RhbmdsZSBpbnRlcnNlY3RzIHRoZSAKLSAgICAgKiBjdXJyZW50IGNsaXBwaW5nIGFyZWEuCi0gICAgICogIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCByZWN0YW5nbGUgaW50ZXJzZWN0cyB0aGUgY3VycmVudAorICAgICAqIGNsaXBwaW5nIGFyZWEuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIHJlY3RhbmdsZSBpbnRlcnNlY3RzIHRoZSBjdXJyZW50IGNsaXBwaW5nIGFyZWEsIAotICAgICAqIG92ZXJ3aXNlIGZhbHNlLiAKKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIHJlY3RhbmdsZSBpbnRlcnNlY3RzIHRoZSBjdXJyZW50IGNsaXBwaW5nCisgICAgICogICAgICAgICBhcmVhLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaGl0Q2xpcChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICAvLyBUT0RPOiBDcmVhdGUgcGFja2FnZSBwcml2YXRlIG1ldGhvZCBSZWN0YW5nbGUuaW50ZXJzZWN0cyhpbnQsIGludCwgaW50LCBpbnQpOworICAgICAgICAvLyBUT0RPOiBDcmVhdGUgcGFja2FnZSBwcml2YXRlIG1ldGhvZCBSZWN0YW5nbGUuaW50ZXJzZWN0cyhpbnQsIGludCwKKyAgICAgICAgLy8gaW50LCBpbnQpOwogICAgICAgICByZXR1cm4gZ2V0Q2xpcEJvdW5kcygpLmludGVyc2VjdHMobmV3IFJlY3RhbmdsZSh4LCB5LCB3aWR0aCwgaGVpZ2h0KSk7CiAgICAgfQogCkBAIC0yOTksNDUgKzMzNiw1NiBAQAogICAgIC8vIEFic3RyYWN0IG1ldGhvZHMKIAogICAgIC8qKgotICAgICAqIENsZWFycyB0aGUgc3BlY2lmaWVkIHJlY3RhbmdsZS4gVGhpcyBtZXRob2QgZmlsbHMgc3BlY2lmaWVkIHJlY3RhbmdsZSAKLSAgICAgKiB3aXRoIGJhY2tncm91bmQgY29sb3IuICAKKyAgICAgKiBDbGVhcnMgdGhlIHNwZWNpZmllZCByZWN0YW5nbGUuIFRoaXMgbWV0aG9kIGZpbGxzIHNwZWNpZmllZCByZWN0YW5nbGUKKyAgICAgKiB3aXRoIGJhY2tncm91bmQgY29sb3IuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGNsZWFyUmVjdChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCk7CiAKICAgICAvKioKLSAgICAgKiBJbnRlcnNlY3RzIHRoZSBjdXJyZW50IGNsaXBwaW5nIGFyZWEgd2l0aCBhIG5ldyByZWN0YW5nbGUuIAotICAgICAqIElmIHRoZSBjdXJyZW50IGNsaXBwaW5nIGFyZWEgaXMgbm90IGRlZmluZWQsIHRoZSByZWN0YW5nbGUgCi0gICAgICogYmVjb21lcyBhIG5ldyBjbGlwcGluZyBhcmVhLiBSZW5kZXJpbmcgb3BlcmF0aW9ucyBhcmUgb25seSBhbGxvd2VkIAotICAgICAqIHdpdGhpbiB0aGUgbmV3IHRoZSBjbGlwcGluZyBhcmVhLiAgICAKLSAgICAgKiAgICAgICAgICAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgZm9yIGludGVyc2VjdGlvbi4gCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIGZvciBpbnRlcnNlY3Rpb24uCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlIGZvciBpbnRlcnNlY3Rpb24uCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgZm9yIGludGVyc2VjdGlvbi4KKyAgICAgKiBJbnRlcnNlY3RzIHRoZSBjdXJyZW50IGNsaXBwaW5nIGFyZWEgd2l0aCBhIG5ldyByZWN0YW5nbGUuIElmIHRoZSBjdXJyZW50CisgICAgICogY2xpcHBpbmcgYXJlYSBpcyBub3QgZGVmaW5lZCwgdGhlIHJlY3RhbmdsZSBiZWNvbWVzIGEgbmV3IGNsaXBwaW5nIGFyZWEuCisgICAgICogUmVuZGVyaW5nIG9wZXJhdGlvbnMgYXJlIG9ubHkgYWxsb3dlZCB3aXRoaW4gdGhlIG5ldyB0aGUgY2xpcHBpbmcgYXJlYS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIGZvciBpbnRlcnNlY3Rpb24uCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSBmb3IgaW50ZXJzZWN0aW9uLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUgZm9yIGludGVyc2VjdGlvbi4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgZm9yIGludGVyc2VjdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBjbGlwUmVjdChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCk7CiAKICAgICAvKioKLSAgICAgKiBDb3BpZXMgdGhlIHJlY3RhbmdsZSBhcmVhIHRvIGFub3RoZXIgYXJlYSBzcGVjaWZpZWQgYnkgCi0gICAgICogYSBkaXN0YW5jZSAoZHgsIGR5KSBmcm9tIHRoZSBvcmlnaW5hbCByZWN0YW5nbGUncyBsb2NhdGlvbi4gCi0gICAgICogUG9zaXRpdmUgZHggYW5kIGR5IHZhbHVlcyBnaXZlIGEgbmV3IGxvY2F0aW9uIGRlZmluZWQgYnkgCi0gICAgICogdHJhbnNsYXRpb24gdG8gdGhlIHJpZ2h0IGFuZCBkb3duIGZyb20gdGhlIG9yaWdpbmFsIGxvY2F0aW9uLCAKLSAgICAgKiBuZWdhdGl2ZSBkeCBhbmQgZHkgdmFsdWVzIC0gdG8gdGhlIGxlZnQgYW5kIHVwLgotICAgICAqIDxicj48YnI+CisgICAgICogQ29waWVzIHRoZSByZWN0YW5nbGUgYXJlYSB0byBhbm90aGVyIGFyZWEgc3BlY2lmaWVkIGJ5IGEgZGlzdGFuY2UgKGR4LAorICAgICAqIGR5KSBmcm9tIHRoZSBvcmlnaW5hbCByZWN0YW5nbGUncyBsb2NhdGlvbi4gUG9zaXRpdmUgZHggYW5kIGR5IHZhbHVlcworICAgICAqIGdpdmUgYSBuZXcgbG9jYXRpb24gZGVmaW5lZCBieSB0cmFuc2xhdGlvbiB0byB0aGUgcmlnaHQgYW5kIGRvd24gZnJvbSB0aGUKKyAgICAgKiBvcmlnaW5hbCBsb2NhdGlvbiwgbmVnYXRpdmUgZHggYW5kIGR5IHZhbHVlcyAtIHRvIHRoZSBsZWZ0IGFuZCB1cC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3ggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIHdoaWNoIHdpbGwgYmUgY29waWVkLiAKLSAgICAgKiBAcGFyYW0gc3kgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIHdoaWNoIHdpbGwgYmUgY29waWVkLgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZSB3aGljaCB3aWxsIGJlIGNvcGllZC4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSB3aGljaCB3aWxsIGJlIGNvcGllZC4KLSAgICAgKiBAcGFyYW0gZHggdGhlIGhvcml6b250YWwgZGlzdGFuY2UgZnJvbSB0aGUgc291cmNlIHJlY3RhbmdsZSdzIAotICAgICAqIGxvY2F0aW9uIHRvIHRoZSBjb3B5J3MgbG9jYXRpb24uIAotICAgICAqIEBwYXJhbSBkeSB0aGUgdmVydGljYWwgZGlzdGFuY2UgZnJvbSB0aGUgc291cmNlIHJlY3RhbmdsZSdzIAotICAgICAqIGxvY2F0aW9uIHRvIHRoZSBjb3B5J3MgbG9jYXRpb24uIAorICAgICAqIEBwYXJhbSBzeAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIHdoaWNoIHdpbGwgYmUgY29waWVkLgorICAgICAqIEBwYXJhbSBzeQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIHdoaWNoIHdpbGwgYmUgY29waWVkLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUgd2hpY2ggd2lsbCBiZSBjb3BpZWQuCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlIHdoaWNoIHdpbGwgYmUgY29waWVkLgorICAgICAqIEBwYXJhbSBkeAorICAgICAqICAgICAgICAgICAgdGhlIGhvcml6b250YWwgZGlzdGFuY2UgZnJvbSB0aGUgc291cmNlIHJlY3RhbmdsZSdzIGxvY2F0aW9uCisgICAgICogICAgICAgICAgICB0byB0aGUgY29weSdzIGxvY2F0aW9uLgorICAgICAqIEBwYXJhbSBkeQorICAgICAqICAgICAgICAgICAgdGhlIHZlcnRpY2FsIGRpc3RhbmNlIGZyb20gdGhlIHNvdXJjZSByZWN0YW5nbGUncyBsb2NhdGlvbiB0bworICAgICAqICAgICAgICAgICAgdGhlIGNvcHkncyBsb2NhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBjb3B5QXJlYShpbnQgc3gsIGludCBzeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZHgsIGludCBkeSk7CiAKQEAgLTM0OSwyMTUgKzM5NywzMTQgQEAKICAgICBwdWJsaWMgYWJzdHJhY3QgR3JhcGhpY3MgY3JlYXRlKCk7CiAKICAgICAvKioKLSAgICAgKiBEaXNwb3NlcyBvZiB0aGUgR3JhcGhpY3MuIFRoaXMgR3JhcGhpY3Mgb2JqZWN0IGNhbiBub3QgYmUgdXNlZCBhZnRlciAKLSAgICAgKiBjYWxsaW5nIHRoaXMgbWV0aG9kLiAgCisgICAgICogRGlzcG9zZXMgb2YgdGhlIEdyYXBoaWNzLiBUaGlzIEdyYXBoaWNzIG9iamVjdCBjYW4gbm90IGJlIHVzZWQgYWZ0ZXIKKyAgICAgKiBjYWxsaW5nIHRoaXMgbWV0aG9kLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGRpc3Bvc2UoKTsKIAogICAgIC8qKgotICAgICAqIERyYXdzIHRoZSBhcmMgY292ZXJpbmcgdGhlIHNwZWNpZmllZCByZWN0YW5nbGUgYW5kIHVzaW5nIHRoZSBjdXJyZW50IGNvbG9yLiAKLSAgICAgKiBUaGUgcmVjdGFuZ2xlIGlzIGRlZmluZWQgYnkgdGhlIG9yaWdpbiBwb2ludCAoWCwgWSkgYW5kIGRpbWVudGlvbnMgCi0gICAgICogKHdpZHRoIGFuZCBoZWlnaHQpLiBUaGUgYXJjIGNlbnRlciBpcyB0aGUgdGhlIGNlbnRlciBvZiBzcGVjaWZpZWQgcmVjdGFuZ2xlLiAKLSAgICAgKiBUaGUgYW5nbGUgb3JpZ2luIGlzIDMgbydjbG9jayBwb3NpdGlvbiwgdGhlIHBvc2l0aXZlIGFuZ2xlIGlzIGNvdW50ZWQgYXMgYSAKLSAgICAgKiBjb3VudGVyLWNsb2Nrd2lzZSByb3RhdGlvbiwgdGhlIG5lZ290aXZlIGFuZ2xlIGlzIGNvdW50ZWQgYXMgY2xvY2t3aXNlIHJvdGF0aW9uLiAgIAorICAgICAqIERyYXdzIHRoZSBhcmMgY292ZXJpbmcgdGhlIHNwZWNpZmllZCByZWN0YW5nbGUgYW5kIHVzaW5nIHRoZSBjdXJyZW50CisgICAgICogY29sb3IuIFRoZSByZWN0YW5nbGUgaXMgZGVmaW5lZCBieSB0aGUgb3JpZ2luIHBvaW50IChYLCBZKSBhbmQgZGltZW5zaW9ucworICAgICAqICh3aWR0aCBhbmQgaGVpZ2h0KS4gVGhlIGFyYyBjZW50ZXIgaXMgdGhlIHRoZSBjZW50ZXIgb2Ygc3BlY2lmaWVkCisgICAgICogcmVjdGFuZ2xlLiBUaGUgYW5nbGUgb3JpZ2luIGlzIDMgbydjbG9jayBwb3NpdGlvbiwgdGhlIHBvc2l0aXZlIGFuZ2xlIGlzCisgICAgICogY291bnRlZCBhcyBhIGNvdW50ZXItY2xvY2t3aXNlIHJvdGF0aW9uLCB0aGUgbmVnYXRpdmUgYW5nbGUgaXMgY291bnRlZCBhcworICAgICAqIGNsb2Nrd2lzZSByb3RhdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBvcmlnaW4gY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIHdoaWNoIHNjYWxlcyB0aGUgYXJjLiAKLSAgICAgKiBAcGFyYW0geSB0aGUgWSBvcmlnaW4gY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIHdoaWNoIHNjYWxlcyB0aGUgYXJjLgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZSB3aGljaCBzY2FsZXMgdGhlIGFyYy4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSB3aGljaCBzY2FsZXMgdGhlIGFyYy4KLSAgICAgKiBAcGFyYW0gc2Egc3RhcnQgYW5nbGUgLSB0aGUgb3JpZ2luIGFuZ2xlIG9mIGFyYy4KLSAgICAgKiBAcGFyYW0gZWEgYXJjIGFuZ2xlIC0gdGhlIGFuZ3VsYXIgYXJjIHZhbHVlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBhbmdsZS4gCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIG9yaWdpbiBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgd2hpY2ggc2NhbGVzIHRoZSBhcmMuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIG9yaWdpbiBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgd2hpY2ggc2NhbGVzIHRoZSBhcmMuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZSB3aGljaCBzY2FsZXMgdGhlIGFyYy4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgd2hpY2ggc2NhbGVzIHRoZSBhcmMuCisgICAgICogQHBhcmFtIHNhCisgICAgICogICAgICAgICAgICBzdGFydCBhbmdsZSAtIHRoZSBvcmlnaW4gYW5nbGUgb2YgYXJjLgorICAgICAqIEBwYXJhbSBlYQorICAgICAqICAgICAgICAgICAgYXJjIGFuZ2xlIC0gdGhlIGFuZ3VsYXIgYXJjIHZhbHVlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBhbmdsZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBkcmF3QXJjKGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc2EsIGludCBlYSk7CiAKICAgICAvKioKLSAgICAgKiBEcmF3cyB0aGUgc3BlY2lmaWVkIGltYWdlIHdpdGggdGhlIGRlZmluZWQgYmFja2dyb3VuZCBjb2xvci4gCi0gICAgICogVGhlIHRvcCBsZWZ0IGNvcm5lciBvZiBpbWFnZSB3aWxsIGJlIGRyYXduIGF0IHBvaW50ICh4LCB5KSAKLSAgICAgKiBpbiBjdXJyZW50IGNvb3JkaW5hdGUgc3lzdGVtLiBUaGUgaW1hZ2UgbG9hZGluZyBwcm9jZXNzIG5vdGlmaWVzIHRoZQotICAgICAqIHNwZWNpZmllZCBJbWFnZSBPYnNlcnZlci4gVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSBpbWFnZQotICAgICAqIGhhcyBsb2FkZWQsIG92ZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuICAgICAgIAorICAgICAqIERyYXdzIHRoZSBzcGVjaWZpZWQgaW1hZ2Ugd2l0aCB0aGUgZGVmaW5lZCBiYWNrZ3JvdW5kIGNvbG9yLiBUaGUgdG9wIGxlZnQKKyAgICAgKiBjb3JuZXIgb2YgaW1hZ2Ugd2lsbCBiZSBkcmF3biBhdCBwb2ludCAoeCwgeSkgaW4gY3VycmVudCBjb29yZGluYXRlCisgICAgICogc3lzdGVtLiBUaGUgaW1hZ2UgbG9hZGluZyBwcm9jZXNzIG5vdGlmaWVzIHRoZSBzcGVjaWZpZWQgSW1hZ2UgT2JzZXJ2ZXIuCisgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSBpbWFnZSBoYXMgbG9hZGVkLCBvdGhlcndpc2UgaXQgcmV0dXJucworICAgICAqIGZhbHNlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWcgdGhlIGltYWdlIHdoaWNoIHdpbGwgYmUgZHJhd24uIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIGltYWdlIHRvcCBsZWZ0IGNvcm5lci4gCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgaW1hZ2UgdG9wIGxlZnQgY29ybmVyLiAKLSAgICAgKiBAcGFyYW0gYmdjb2xvciB0aGUgYmFja2dyb3VuZCBjb2xvci4KLSAgICAgKiBAcGFyYW0gb2JzZXJ2ZXIgdGhlIEltYWdlT2JzZXJ2ZXIgb2JqZWN0IHdoaWNoIHNob3VsZCBiZSBub3RpZmllZCBhYm91dCBpbWFnZSBsb2FkaW5nIHByb2Nlc3MuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiBsb2FkaW5nIGltYWdlIGlzIHN1Y2Nlc3NmdWwgb3IgaW1hZ2UgaXMgbnVsbCwgb3Zlcndpc2UgZmFsc2UuCisgICAgICogQHBhcmFtIGltZworICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIHdoaWNoIHdpbGwgYmUgZHJhd24uCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIGltYWdlIHRvcCBsZWZ0IGNvcm5lci4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgaW1hZ2UgdG9wIGxlZnQgY29ybmVyLgorICAgICAqIEBwYXJhbSBiZ2NvbG9yCisgICAgICogICAgICAgICAgICB0aGUgYmFja2dyb3VuZCBjb2xvci4KKyAgICAgKiBAcGFyYW0gb2JzZXJ2ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZU9ic2VydmVyIG9iamVjdCB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQgYWJvdXQgaW1hZ2UKKyAgICAgKiAgICAgICAgICAgIGxvYWRpbmcgcHJvY2Vzcy4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGxvYWRpbmcgaW1hZ2UgaXMgc3VjY2Vzc2Z1bCBvciBpbWFnZSBpcyBudWxsLCBmYWxzZQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGRyYXdJbWFnZShJbWFnZSBpbWcsIGludCB4LCBpbnQgeSwgQ29sb3IgYmdjb2xvciwgSW1hZ2VPYnNlcnZlciBvYnNlcnZlcik7CiAKICAgICAvKioKLSAgICAgKiBEcmF3cyB0aGUgc3BlY2lmaWVkIGltYWdlLiAKLSAgICAgKiBUaGUgdG9wIGxlZnQgY29ybmVyIG9mIGltYWdlIHdpbGwgYmUgZHJhd24gYXQgcG9pbnQgKHgsIHkpIAotICAgICAqIGluIGN1cnJlbnQgY29vcmRpbmF0ZSBzeXN0ZW0uIFRoZSBpbWFnZSBsb2FkaW5nIHByb2Nlc3Mgbm90aWZpZXMgdGhlCi0gICAgICogc3BlY2lmaWVkIEltYWdlIE9ic2VydmVyLiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIGltYWdlCi0gICAgICogaGFzIGxvYWRlZCwgb3Zlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4gCisgICAgICogRHJhd3MgdGhlIHNwZWNpZmllZCBpbWFnZS4gVGhlIHRvcCBsZWZ0IGNvcm5lciBvZiBpbWFnZSB3aWxsIGJlIGRyYXduIGF0CisgICAgICogcG9pbnQgKHgsIHkpIGluIGN1cnJlbnQgY29vcmRpbmF0ZSBzeXN0ZW0uIFRoZSBpbWFnZSBsb2FkaW5nIHByb2Nlc3MKKyAgICAgKiBub3RpZmllcyB0aGUgc3BlY2lmaWVkIEltYWdlIE9ic2VydmVyLiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlCisgICAgICogaW1hZ2UgaGFzIGxvYWRlZCwgb3RoZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGltZyB0aGUgaW1hZ2Ugd2hpY2ggd2lsbCBiZSBkcmF3bi4gCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgaW1hZ2UgdG9wIGxlZnQgY29ybmVyLiAKLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBpbWFnZSB0b3AgbGVmdCBjb3JuZXIuIAotICAgICAqIEBwYXJhbSBvYnNlcnZlciB0aGUgSW1hZ2VPYnNlcnZlciBvYmplY3Qgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkIGFib3V0IGltYWdlIGxvYWRpbmcgcHJvY2Vzcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGxvYWRpbmcgaW1hZ2UgaXMgc3VjY2Vzc2Z1bCBvciBpbWFnZSBpcyBudWxsLCBvdmVyd2lzZSBmYWxzZS4KKyAgICAgKiBAcGFyYW0gaW1nCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2Ugd2hpY2ggd2lsbCBiZSBkcmF3bi4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgaW1hZ2UgdG9wIGxlZnQgY29ybmVyLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBpbWFnZSB0b3AgbGVmdCBjb3JuZXIuCisgICAgICogQHBhcmFtIG9ic2VydmVyCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VPYnNlcnZlciBvYmplY3Qgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkIGFib3V0IGltYWdlCisgICAgICogICAgICAgICAgICBsb2FkaW5nIHByb2Nlc3MuCisgICAgICogQHJldHVybiB0cnVlLCBpZiBsb2FkaW5nIGltYWdlIGlzIHN1Y2Nlc3NmdWwgb3IgaW1hZ2UgaXMgbnVsbCwgb3RoZXJ3aXNlCisgICAgICogICAgICAgICBmYWxzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBkcmF3SW1hZ2UoSW1hZ2UgaW1nLCBpbnQgeCwgaW50IHksIEltYWdlT2JzZXJ2ZXIgb2JzZXJ2ZXIpOwogCiAgICAgLyoqCi0gICAgICogU2NhbGVzIHRoZSBzcGVjaWZpZWQgaW1hZ2UgdG8gZml0IGluIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ2xlIGFuZCAKLSAgICAgKiBkcmF3cyBpdCB3aXRoIHRoZSBkZWZpbmVkIGJhY2tncm91bmQgY29sb3IuIFRoZSB0b3AgbGVmdCBjb3JuZXIgCi0gICAgICogb2YgdGhlIGltYWdlIHdpbGwgYmUgZHJhd24gYXQgdGhlIHBvaW50ICh4LCB5KSBpbiBjdXJyZW50IGNvb3JkaW5hdGUgCi0gICAgICogc3lzdGVtLiBUaGUgbm9uLW9wYXF1ZSBwaXhlbHMgd2lsbCBiZSBkcmF3biBpbiB0aGUgYmFja2dyb3VuZCBjb2xvci4gCi0gICAgICogVGhlIGltYWdlIGxvYWRpbmcgcHJvY2VzcyBub3RpZmllcyB0aGUgc3BlY2lmaWVkIEltYWdlIE9ic2VydmVyLiAKLSAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIGltYWdlIGhhcyBsb2FkZWQsIG92ZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuIAorICAgICAqIFNjYWxlcyB0aGUgc3BlY2lmaWVkIGltYWdlIHRvIGZpdCBpbiB0aGUgc3BlY2lmaWVkIHJlY3RhbmdsZSBhbmQgZHJhd3MgaXQKKyAgICAgKiB3aXRoIHRoZSBkZWZpbmVkIGJhY2tncm91bmQgY29sb3IuIFRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIGltYWdlIHdpbGwKKyAgICAgKiBiZSBkcmF3biBhdCB0aGUgcG9pbnQgKHgsIHkpIGluIGN1cnJlbnQgY29vcmRpbmF0ZSBzeXN0ZW0uIFRoZSBub24tb3BhcXVlCisgICAgICogcGl4ZWxzIHdpbGwgYmUgZHJhd24gaW4gdGhlIGJhY2tncm91bmQgY29sb3IuIFRoZSBpbWFnZSBsb2FkaW5nIHByb2Nlc3MKKyAgICAgKiBub3RpZmllcyB0aGUgc3BlY2lmaWVkIEltYWdlIE9ic2VydmVyLiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlCisgICAgICogaW1hZ2UgaGFzIGxvYWRlZCwgb3RoZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGltZyB0aGUgaW1hZ2Ugd2hpY2ggd2lsbCBiZSBkcmF3bi4KLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBpbWFnZSdzIHRvcCBsZWZ0IGNvcm5lci4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBpbWFnZSdzIHRvcCBsZWZ0IGNvcm5lci4gCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiByZWN0YW5nbGUgd2hpY2ggc2NhbGVzIHRoZSBpbWFnZS4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgcmVjdGFuZ2xlIHdoaWNoIHNjYWxlcyB0aGUgaW1hZ2UuCi0gICAgICogQHBhcmFtIGJnY29sb3IgdGhlIGJhY2tncm91bmQgY29sb3IuCi0gICAgICogQHBhcmFtIG9ic2VydmVyIHRoZSBJbWFnZU9ic2VydmVyIG9iamVjdCB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQgYWJvdXQgaW1hZ2UgbG9hZGluZyBwcm9jZXNzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgbG9hZGluZyBpbWFnZSBpcyBzdWNjZXNzZnVsIG9yIGltYWdlIGlzIG51bGwsIG92ZXJ3aXNlIGZhbHNlLgorICAgICAqIEBwYXJhbSBpbWcKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSB3aGljaCB3aWxsIGJlIGRyYXduLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBpbWFnZSdzIHRvcCBsZWZ0IGNvcm5lci4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgaW1hZ2UncyB0b3AgbGVmdCBjb3JuZXIuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgcmVjdGFuZ2xlIHdoaWNoIHNjYWxlcyB0aGUgaW1hZ2UuCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiByZWN0YW5nbGUgd2hpY2ggc2NhbGVzIHRoZSBpbWFnZS4KKyAgICAgKiBAcGFyYW0gYmdjb2xvcgorICAgICAqICAgICAgICAgICAgdGhlIGJhY2tncm91bmQgY29sb3IuCisgICAgICogQHBhcmFtIG9ic2VydmVyCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VPYnNlcnZlciBvYmplY3Qgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkIGFib3V0IGltYWdlCisgICAgICogICAgICAgICAgICBsb2FkaW5nIHByb2Nlc3MuCisgICAgICogQHJldHVybiB0cnVlLCBpZiBsb2FkaW5nIGltYWdlIGlzIHN1Y2Nlc3NmdWwgb3IgaW1hZ2UgaXMgbnVsbCwgb3RoZXJ3aXNlCisgICAgICogICAgICAgICBmYWxzZS4KICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBkcmF3SW1hZ2UoSW1hZ2UgaW1nLCBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgQ29sb3IgYmdjb2xvciwgSW1hZ2VPYnNlcnZlciBvYnNlcnZlcik7CisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZHJhd0ltYWdlKEltYWdlIGltZywgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICBDb2xvciBiZ2NvbG9yLCBJbWFnZU9ic2VydmVyIG9ic2VydmVyKTsKIAogICAgIC8qKgotICAgICAqIFNjYWxlcyB0aGUgc3BlY2lmaWVkIGltYWdlIHRvIGZpdCBpbiB0aGUgc3BlY2lmaWVkIHJlY3RhbmdsZSBhbmQgCi0gICAgICogZHJhd3MgaXQuIFRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIGltYWdlIHdpbGwgYmUgZHJhd24gYXQgdGhlIAotICAgICAqIHBvaW50ICh4LCB5KSBpbiBjdXJyZW50IGNvb3JkaW5hdGUgc3lzdGVtLiBUaGUgaW1hZ2UgbG9hZGluZyBwcm9jZXNzIAotICAgICAqIG5vdGlmaWVzIHRoZSBzcGVjaWZpZWQgSW1hZ2UgT2JzZXJ2ZXIuIAotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgaW1hZ2UgaGFzIGxvYWRlZCwgb3Zlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4gCisgICAgICogU2NhbGVzIHRoZSBzcGVjaWZpZWQgaW1hZ2UgdG8gZml0IGluIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ2xlIGFuZCBkcmF3cworICAgICAqIGl0LiBUaGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBpbWFnZSB3aWxsIGJlIGRyYXduIGF0IHRoZSBwb2ludCAoeCwgeSkgaW4KKyAgICAgKiBjdXJyZW50IGNvb3JkaW5hdGUgc3lzdGVtLiBUaGUgaW1hZ2UgbG9hZGluZyBwcm9jZXNzIG5vdGlmaWVzIHRoZQorICAgICAqIHNwZWNpZmllZCBJbWFnZSBPYnNlcnZlci4gVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSBpbWFnZSBoYXMKKyAgICAgKiBsb2FkZWQsIG90aGVyd2lzZSBpdCByZXR1cm5zIGZhbHNlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWcgdGhlIGltYWdlIHdoaWNoIHdpbGwgYmUgZHJhd24uCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgaW1hZ2UgdG9wIGxlZnQgY29ybmVyLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIGltYWdlIHRvcCBsZWZ0IGNvcm5lci4gCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiByZWN0YW5nbGUgd2hpY2ggc2NhbGVzIHRoZSBpbWFnZS4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgcmVjdGFuZ2xlIHdoaWNoIHNjYWxlcyB0aGUgaW1hZ2UuCi0gICAgICogQHBhcmFtIG9ic2VydmVyIHRoZSBJbWFnZU9ic2VydmVyIG9iamVjdCB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQgYWJvdXQgaW1hZ2UgbG9hZGluZyBwcm9jZXNzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgbG9hZGluZyBpbWFnZSBpcyBzdWNjZXNzZnVsIG9yIGltYWdlIGlzIG51bGwsIG92ZXJ3aXNlIGZhbHNlLgorICAgICAqIEBwYXJhbSBpbWcKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSB3aGljaCB3aWxsIGJlIGRyYXduLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBpbWFnZSB0b3AgbGVmdCBjb3JuZXIuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIGltYWdlIHRvcCBsZWZ0IGNvcm5lci4KKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiByZWN0YW5nbGUgd2hpY2ggc2NhbGVzIHRoZSBpbWFnZS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHJlY3RhbmdsZSB3aGljaCBzY2FsZXMgdGhlIGltYWdlLgorICAgICAqIEBwYXJhbSBvYnNlcnZlcgorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlT2JzZXJ2ZXIgb2JqZWN0IHdoaWNoIHNob3VsZCBiZSBub3RpZmllZCBhYm91dCBpbWFnZQorICAgICAqICAgICAgICAgICAgbG9hZGluZyBwcm9jZXNzLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgbG9hZGluZyBpbWFnZSBpcyBzdWNjZXNzZnVsIG9yIGltYWdlIGlzIG51bGwsIG90aGVyd2lzZQorICAgICAqICAgICAgICAgZmFsc2UuCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZHJhd0ltYWdlKEltYWdlIGltZywgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIEltYWdlT2JzZXJ2ZXIgb2JzZXJ2ZXIpOworICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGRyYXdJbWFnZShJbWFnZSBpbWcsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgSW1hZ2VPYnNlcnZlciBvYnNlcnZlcik7CiAKICAgICAvKioKLSAgICAgKiBTY2FsZXMgdGhlIHNwZWNpZmllZCBhcmVhIG9mIHRoZSBzcGVjaWZpZWQgaW1hZ2UgdG8gZml0IGluIHRoZSByZWN0YW5nbGUgYXJlYSAKLSAgICAgKiBkZWZpbmVkIGJ5IGl0cyBjb3JuZXJzIGNvb3JkaW5hdGVzIGFuZCBkcmF3cyB0aGUgc3ViLWltYWdlIHdpdGggdGhlIHNwZWNpZmllZCAKLSAgICAgKiBiYWNrZ3JvdW5kIGNvbG9yLiBUaGUgc3ViLWltYWdlIHRvIGJlIGRyYXduIGlzIGRlZmluZWQgYnkgaXRzIHRvcCBsZWZ0IAotICAgICAqIGNvcm5lciBjb29yZGluYXRlcyAoc3gxLCBzeTEpIGFuZCBib3R0b20gcmlnaHQgY29ybmVyIGNvb3JkaW5hdGVzIChzeDIsIHN5MikKLSAgICAgKiBjb21wdXRlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIG9yaWdpbiAodG9wIGxlZnQgY29ybmVyKSBvZiB0aGUgc291cmNlIGltYWdlLgotICAgICAqIFRoZSBub24gb3BhcXVlIHBpeGVscyB3aWxsIGJlIGRyYXduIGluIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLiBUaGUgCi0gICAgICogaW1hZ2UgbG9hZGluZyBwcm9jZXNzIG5vdGlmaWVzIHNwZWNpZmllZCBJbWFnZSBPYnNlcnZlci4gCi0gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSBpbWFnZQotICAgICAqIGhhcyBsb2FkZWQsIG92ZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuIAorICAgICAqIFNjYWxlcyB0aGUgc3BlY2lmaWVkIGFyZWEgb2YgdGhlIHNwZWNpZmllZCBpbWFnZSB0byBmaXQgaW4gdGhlIHJlY3RhbmdsZQorICAgICAqIGFyZWEgZGVmaW5lZCBieSBpdHMgY29ybmVycyBjb29yZGluYXRlcyBhbmQgZHJhd3MgdGhlIHN1Yi1pbWFnZSB3aXRoIHRoZQorICAgICAqIHNwZWNpZmllZCBiYWNrZ3JvdW5kIGNvbG9yLiBUaGUgc3ViLWltYWdlIHRvIGJlIGRyYXduIGlzIGRlZmluZWQgYnkgaXRzCisgICAgICogdG9wIGxlZnQgY29ybmVyIGNvb3JkaW5hdGVzIChzeDEsIHN5MSkgYW5kIGJvdHRvbSByaWdodCBjb3JuZXIKKyAgICAgKiBjb29yZGluYXRlcyAoc3gyLCBzeTIpIGNvbXB1dGVkIHdpdGggcmVzcGVjdCB0byB0aGUgb3JpZ2luICh0b3AgbGVmdAorICAgICAqIGNvcm5lcikgb2YgdGhlIHNvdXJjZSBpbWFnZS4gVGhlIG5vbiBvcGFxdWUgcGl4ZWxzIHdpbGwgYmUgZHJhd24gaW4gdGhlCisgICAgICogYmFja2dyb3VuZCBjb2xvci4gVGhlIGltYWdlIGxvYWRpbmcgcHJvY2VzcyBub3RpZmllcyBzcGVjaWZpZWQgSW1hZ2UKKyAgICAgKiBPYnNlcnZlci4gVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSBpbWFnZSBoYXMgbG9hZGVkLCBvdGhlcndpc2UgaXQKKyAgICAgKiByZXR1cm5zIGZhbHNlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWcgdGhlIGltYWdlIHdoaWNoIHdpbGwgYmUgZHJhd24uCi0gICAgICogQHBhcmFtIGR4MSB0aGUgWCB0b3AgbGVmdCBjb3JuZXIgY29vcmRpbmF0ZSBvZiB0aGUgZGVzdGluYXRpb24gcmVjdGFuZ2xlIGFyZWEuIAotICAgICAqIEBwYXJhbSBkeTEgdGhlIFkgdG9wIGxlZnQgY29ybmVyIGNvb3JkaW5hdGUgb2YgdGhlIGRlc3RpbmF0aW9uIHJlY3RhbmdsZSBhcmVhLgotICAgICAqIEBwYXJhbSBkeDIgdGhlIFggYm90dG9tIHJpZ2h0IGNvcm5lciBjb29yZGluYXRlIG9mIHRoZSBkZXN0aW5hdGlvbiByZWN0YW5nbGUgYXJlYS4KLSAgICAgKiBAcGFyYW0gZHkyIHRoZSBZIGJvdHRvbSByaWdodCBjb3JuZXIgY29vcmRpbmF0ZSBvZiB0aGUgZGVzdGluYXRpb24gcmVjdGFuZ2xlIGFyZWEuCi0gICAgICogQHBhcmFtIHN4MSB0aGUgWCB0b3AgbGVmdCBjb3JuZXIgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBiZSBkcmF3biB3aXRoaW4gdGhlIHNvdXJjZSBpbWFnZS4KLSAgICAgKiBAcGFyYW0gc3kxIHRoZSBZIHRvcCBsZWZ0IGNvcm5lciBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIGJlIGRyYXduIHdpdGhpbiB0aGUgc291cmNlIGltYWdlLgotICAgICAqIEBwYXJhbSBzeDIgdGhlIFggYm90dG9tIHJpZ2h0IGNvcm5lciBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIGJlIGRyYXduIHdpdGhpbiB0aGUgc291cmNlIGltYWdlLgotICAgICAqIEBwYXJhbSBzeTIgdGhlIFkgYm90dG9tIHJpZ2h0IGNvcm5lciBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIGJlIGRyYXduIHdpdGhpbiB0aGUgc291cmNlIGltYWdlLgotICAgICAqIEBwYXJhbSBiZ2NvbG9yIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLgotICAgICAqIEBwYXJhbSBvYnNlcnZlciB0aGUgSW1hZ2VPYnNlcnZlciBvYmplY3Qgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkIGFib3V0IGltYWdlIGxvYWRpbmcgcHJvY2Vzcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGxvYWRpbmcgaW1hZ2UgaXMgc3VjY2Vzc2Z1bCBvciBpbWFnZSBpcyBudWxsLCBvdmVyd2lzZSBmYWxzZS4KKyAgICAgKiBAcGFyYW0gaW1nCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2Ugd2hpY2ggd2lsbCBiZSBkcmF3bi4KKyAgICAgKiBAcGFyYW0gZHgxCisgICAgICogICAgICAgICAgICB0aGUgWCB0b3AgbGVmdCBjb3JuZXIgY29vcmRpbmF0ZSBvZiB0aGUgZGVzdGluYXRpb24gcmVjdGFuZ2xlCisgICAgICogICAgICAgICAgICBhcmVhLgorICAgICAqIEBwYXJhbSBkeTEKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIHRvcCBsZWZ0IGNvcm5lciBjb29yZGluYXRlIG9mIHRoZSBkZXN0aW5hdGlvbiByZWN0YW5nbGUKKyAgICAgKiAgICAgICAgICAgIGFyZWEuCisgICAgICogQHBhcmFtIGR4MgorICAgICAqICAgICAgICAgICAgdGhlIFggYm90dG9tIHJpZ2h0IGNvcm5lciBjb29yZGluYXRlIG9mIHRoZSBkZXN0aW5hdGlvbgorICAgICAqICAgICAgICAgICAgcmVjdGFuZ2xlIGFyZWEuCisgICAgICogQHBhcmFtIGR5MgorICAgICAqICAgICAgICAgICAgdGhlIFkgYm90dG9tIHJpZ2h0IGNvcm5lciBjb29yZGluYXRlIG9mIHRoZSBkZXN0aW5hdGlvbgorICAgICAqICAgICAgICAgICAgcmVjdGFuZ2xlIGFyZWEuCisgICAgICogQHBhcmFtIHN4MQorICAgICAqICAgICAgICAgICAgdGhlIFggdG9wIGxlZnQgY29ybmVyIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gYmUgZHJhd24KKyAgICAgKiAgICAgICAgICAgIHdpdGhpbiB0aGUgc291cmNlIGltYWdlLgorICAgICAqIEBwYXJhbSBzeTEKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIHRvcCBsZWZ0IGNvcm5lciBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIGJlIGRyYXduCisgICAgICogICAgICAgICAgICB3aXRoaW4gdGhlIHNvdXJjZSBpbWFnZS4KKyAgICAgKiBAcGFyYW0gc3gyCisgICAgICogICAgICAgICAgICB0aGUgWCBib3R0b20gcmlnaHQgY29ybmVyIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gYmUgZHJhd24KKyAgICAgKiAgICAgICAgICAgIHdpdGhpbiB0aGUgc291cmNlIGltYWdlLgorICAgICAqIEBwYXJhbSBzeTIKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGJvdHRvbSByaWdodCBjb3JuZXIgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBiZSBkcmF3bgorICAgICAqICAgICAgICAgICAgd2l0aGluIHRoZSBzb3VyY2UgaW1hZ2UuCisgICAgICogQHBhcmFtIGJnY29sb3IKKyAgICAgKiAgICAgICAgICAgIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLgorICAgICAqIEBwYXJhbSBvYnNlcnZlcgorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlT2JzZXJ2ZXIgb2JqZWN0IHdoaWNoIHNob3VsZCBiZSBub3RpZmllZCBhYm91dCBpbWFnZQorICAgICAqICAgICAgICAgICAgbG9hZGluZyBwcm9jZXNzLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgbG9hZGluZyBpbWFnZSBpcyBzdWNjZXNzZnVsIG9yIGltYWdlIGlzIG51bGwsIGZhbHNlCisgICAgICogICAgICAgICBvdGhlcndpc2UuCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZHJhd0ltYWdlKEltYWdlIGltZywgaW50IGR4MSwgaW50IGR5MSwgaW50IGR4MiwgaW50IGR5MiwgaW50IHN4MSwgaW50IHN5MSwgaW50IHN4MiwgaW50IHN5MiwgQ29sb3IgYmdjb2xvciwgSW1hZ2VPYnNlcnZlciBvYnNlcnZlcik7CisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZHJhd0ltYWdlKEltYWdlIGltZywgaW50IGR4MSwgaW50IGR5MSwgaW50IGR4MiwgaW50IGR5MiwgaW50IHN4MSwKKyAgICAgICAgICAgIGludCBzeTEsIGludCBzeDIsIGludCBzeTIsIENvbG9yIGJnY29sb3IsIEltYWdlT2JzZXJ2ZXIgb2JzZXJ2ZXIpOwogCiAgICAgLyoqCi0gICAgICogU2NhbGVzIHRoZSBzcGVjaWZpZWQgYXJlYSBvZiB0aGUgc3BlY2lmaWVkIGltYWdlIHRvIGZpdCBpbiB0aGUgcmVjdGFuZ2xlIGFyZWEgCi0gICAgICogZGVmaW5lZCBieSBpdHMgY29ybmVycyBjb29yZGluYXRlcyBhbmQgZHJhd3MgdGhlIHN1Yi1pbWFnZS4gVGhlIHN1Yi1pbWFnZSAKLSAgICAgKiB0byBiZSBkcmF3biBpcyBkZWZpbmVkIGJ5IGl0cyB0b3AgbGVmdCAKLSAgICAgKiBjb3JuZXIgY29vcmRpbmF0ZXMgKHN4MSwgc3kxKSBhbmQgYm90dG9tIHJpZ2h0IGNvcm5lciBjb29yZGluYXRlcyAoc3gyLCBzeTIpCi0gICAgICogY29tcHV0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBvcmlnaW4gKHRvcCBsZWZ0IGNvcm5lcikgb2YgdGhlIHNvdXJjZSBpbWFnZS4KLSAgICAgKiBUaGUgaW1hZ2UgbG9hZGluZyBwcm9jZXNzIG5vdGlmaWVzIHNwZWNpZmllZCBJbWFnZSBPYnNlcnZlci4gCi0gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSBpbWFnZQotICAgICAqIGhhcyBsb2FkZWQsIG92ZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuIAorICAgICAqIFNjYWxlcyB0aGUgc3BlY2lmaWVkIGFyZWEgb2YgdGhlIHNwZWNpZmllZCBpbWFnZSB0byBmaXQgaW4gdGhlIHJlY3RhbmdsZQorICAgICAqIGFyZWEgZGVmaW5lZCBieSBpdHMgY29ybmVycyBjb29yZGluYXRlcyBhbmQgZHJhd3MgdGhlIHN1Yi1pbWFnZS4gVGhlCisgICAgICogc3ViLWltYWdlIHRvIGJlIGRyYXduIGlzIGRlZmluZWQgYnkgaXRzIHRvcCBsZWZ0IGNvcm5lciBjb29yZGluYXRlcyAoc3gxLAorICAgICAqIHN5MSkgYW5kIGJvdHRvbSByaWdodCBjb3JuZXIgY29vcmRpbmF0ZXMgKHN4Miwgc3kyKSBjb21wdXRlZCB3aXRoIHJlc3BlY3QKKyAgICAgKiB0byB0aGUgb3JpZ2luICh0b3AgbGVmdCBjb3JuZXIpIG9mIHRoZSBzb3VyY2UgaW1hZ2UuIFRoZSBpbWFnZSBsb2FkaW5nCisgICAgICogcHJvY2VzcyBub3RpZmllcyBzcGVjaWZpZWQgSW1hZ2UgT2JzZXJ2ZXIuIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZgorICAgICAqIHRoZSBpbWFnZSBoYXMgbG9hZGVkLCBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1nIHRoZSBpbWFnZSB3aGljaCB3aWxsIGJlIGRyYXduLgotICAgICAqIEBwYXJhbSBkeDEgdGhlIFggdG9wIGxlZnQgY29ybmVyIGNvb3JkaW5hdGUgb2YgdGhlIGRlc3RpbmF0aW9uIHJlY3RhbmdsZSBhcmVhLiAKLSAgICAgKiBAcGFyYW0gZHkxIHRoZSBZIHRvcCBsZWZ0IGNvcm5lciBjb29yZGluYXRlIG9mIHRoZSBkZXN0aW5hdGlvbiByZWN0YW5nbGUgYXJlYS4KLSAgICAgKiBAcGFyYW0gZHgyIHRoZSBYIGJvdHRvbSByaWdodCBjb3JuZXIgY29vcmRpbmF0ZSBvZiB0aGUgZGVzdGluYXRpb24gcmVjdGFuZ2xlIGFyZWEuCi0gICAgICogQHBhcmFtIGR5MiB0aGUgWSBib3R0b20gcmlnaHQgY29ybmVyIGNvb3JkaW5hdGUgb2YgdGhlIGRlc3RpbmF0aW9uIHJlY3RhbmdsZSBhcmVhLgotICAgICAqIEBwYXJhbSBzeDEgdGhlIFggdG9wIGxlZnQgY29ybmVyIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gYmUgZHJhd24gd2l0aGluIHRoZSBzb3VyY2UgaW1hZ2UuCi0gICAgICogQHBhcmFtIHN5MSB0aGUgWSB0b3AgbGVmdCBjb3JuZXIgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBiZSBkcmF3biB3aXRoaW4gdGhlIHNvdXJjZSBpbWFnZS4KLSAgICAgKiBAcGFyYW0gc3gyIHRoZSBYIGJvdHRvbSByaWdodCBjb3JuZXIgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBiZSBkcmF3biB3aXRoaW4gdGhlIHNvdXJjZSBpbWFnZS4KLSAgICAgKiBAcGFyYW0gc3kyIHRoZSBZIGJvdHRvbSByaWdodCBjb3JuZXIgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBiZSBkcmF3biB3aXRoaW4gdGhlIHNvdXJjZSBpbWFnZS4KLSAgICAgKiBAcGFyYW0gb2JzZXJ2ZXIgdGhlIEltYWdlT2JzZXJ2ZXIgb2JqZWN0IHdoaWNoIHNob3VsZCBiZSBub3RpZmllZCBhYm91dCBpbWFnZSBsb2FkaW5nIHByb2Nlc3MuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiBsb2FkaW5nIGltYWdlIGlzIHN1Y2Nlc3NmdWwgb3IgaW1hZ2UgaXMgbnVsbCwgb3Zlcndpc2UgZmFsc2UuCisgICAgICogQHBhcmFtIGltZworICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIHdoaWNoIHdpbGwgYmUgZHJhd24uCisgICAgICogQHBhcmFtIGR4MQorICAgICAqICAgICAgICAgICAgdGhlIFggdG9wIGxlZnQgY29ybmVyIGNvb3JkaW5hdGUgb2YgdGhlIGRlc3RpbmF0aW9uIHJlY3RhbmdsZQorICAgICAqICAgICAgICAgICAgYXJlYS4KKyAgICAgKiBAcGFyYW0gZHkxCisgICAgICogICAgICAgICAgICB0aGUgWSB0b3AgbGVmdCBjb3JuZXIgY29vcmRpbmF0ZSBvZiB0aGUgZGVzdGluYXRpb24gcmVjdGFuZ2xlCisgICAgICogICAgICAgICAgICBhcmVhLgorICAgICAqIEBwYXJhbSBkeDIKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGJvdHRvbSByaWdodCBjb3JuZXIgY29vcmRpbmF0ZSBvZiB0aGUgZGVzdGluYXRpb24KKyAgICAgKiAgICAgICAgICAgIHJlY3RhbmdsZSBhcmVhLgorICAgICAqIEBwYXJhbSBkeTIKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGJvdHRvbSByaWdodCBjb3JuZXIgY29vcmRpbmF0ZSBvZiB0aGUgZGVzdGluYXRpb24KKyAgICAgKiAgICAgICAgICAgIHJlY3RhbmdsZSBhcmVhLgorICAgICAqIEBwYXJhbSBzeDEKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIHRvcCBsZWZ0IGNvcm5lciBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIGJlIGRyYXduCisgICAgICogICAgICAgICAgICB3aXRoaW4gdGhlIHNvdXJjZSBpbWFnZS4KKyAgICAgKiBAcGFyYW0gc3kxCisgICAgICogICAgICAgICAgICB0aGUgWSB0b3AgbGVmdCBjb3JuZXIgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSB0byBiZSBkcmF3bgorICAgICAqICAgICAgICAgICAgd2l0aGluIHRoZSBzb3VyY2UgaW1hZ2UuCisgICAgICogQHBhcmFtIHN4MgorICAgICAqICAgICAgICAgICAgdGhlIFggYm90dG9tIHJpZ2h0IGNvcm5lciBjb29yZGluYXRlIG9mIHRoZSBhcmVhIHRvIGJlIGRyYXduCisgICAgICogICAgICAgICAgICB3aXRoaW4gdGhlIHNvdXJjZSBpbWFnZS4KKyAgICAgKiBAcGFyYW0gc3kyCisgICAgICogICAgICAgICAgICB0aGUgWSBib3R0b20gcmlnaHQgY29ybmVyIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgdG8gYmUgZHJhd24KKyAgICAgKiAgICAgICAgICAgIHdpdGhpbiB0aGUgc291cmNlIGltYWdlLgorICAgICAqIEBwYXJhbSBvYnNlcnZlcgorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlT2JzZXJ2ZXIgb2JqZWN0IHdoaWNoIHNob3VsZCBiZSBub3RpZmllZCBhYm91dCBpbWFnZQorICAgICAqICAgICAgICAgICAgbG9hZGluZyBwcm9jZXNzLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgbG9hZGluZyBpbWFnZSBpcyBzdWNjZXNzZnVsIG9yIGltYWdlIGlzIG51bGwsIGZhbHNlCisgICAgICogICAgICAgICBvdGhlcndpc2UuCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZHJhd0ltYWdlKEltYWdlIGltZywgaW50IGR4MSwgaW50IGR5MSwgaW50IGR4MiwgaW50IGR5MiwgaW50IHN4MSwgaW50IHN5MSwgaW50IHN4MiwgaW50IHN5MiwgSW1hZ2VPYnNlcnZlciBvYnNlcnZlcik7Ci0gICAgCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZHJhd0ltYWdlKEltYWdlIGltZywgaW50IGR4MSwgaW50IGR5MSwgaW50IGR4MiwgaW50IGR5MiwgaW50IHN4MSwKKyAgICAgICAgICAgIGludCBzeTEsIGludCBzeDIsIGludCBzeTIsIEltYWdlT2JzZXJ2ZXIgb2JzZXJ2ZXIpOworCiAgICAgLyoqCi0gICAgICogRHJhd3MgYSBsaW5lIGZyb20gdGhlIHBvaW50ICh4MSwgeTEpIHRvIHRoZSBwb2ludCAoeDIsIHkyKS4gCi0gICAgICogVGhpcyBtZXRob2QgZHJhd3MgdGhlIGxpbmUgd2l0aCBjdXJyZW50IGNvbG9yIAotICAgICAqIHdoaWNoIGNhbiBiZSBjaGFuZ2VkIGJ5IHNldENvbG9yKENvbG9yIGMpIG1ldGhvZC4KKyAgICAgKiBEcmF3cyBhIGxpbmUgZnJvbSB0aGUgcG9pbnQgKHgxLCB5MSkgdG8gdGhlIHBvaW50ICh4MiwgeTIpLiBUaGlzIG1ldGhvZAorICAgICAqIGRyYXdzIHRoZSBsaW5lIHdpdGggY3VycmVudCBjb2xvciB3aGljaCBjYW4gYmUgY2hhbmdlZCBieSBzZXRDb2xvcihDb2xvcgorICAgICAqIGMpIG1ldGhvZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geDEgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcG9pbnQuCi0gICAgICogQHBhcmFtIHkxIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IHBvaW50LgotICAgICAqIEBwYXJhbSB4MiB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgcG9pbnQuCi0gICAgICogQHBhcmFtIHkyIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBwb2ludC4KKyAgICAgKiBAcGFyYW0geDEKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IHBvaW50LgorICAgICAqIEBwYXJhbSB5MQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcG9pbnQuCisgICAgICogQHBhcmFtIHgyCisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgcG9pbnQuCisgICAgICogQHBhcmFtIHkyCisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgcG9pbnQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZHJhd0xpbmUoaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyKTsKIAogICAgIC8qKgotICAgICAqIERyYXdzIHRoZSBvdWxpbmUgb2YgYW4gb3ZhbCB0byBmaXQgaW4gdGhlIHJlY3RhbmdsZSBkZWZpbmVkCi0gICAgICogYnkgdGhlIGdpdmVuIHdpZHRoLCBoZWlnaHQsIGFuZCB0b3AgbGVmdCBjb3JuZXIuCisgICAgICogRHJhd3MgdGhlIG91dGxpbmUgb2YgYW4gb3ZhbCB0byBmaXQgaW4gdGhlIHJlY3RhbmdsZSBkZWZpbmVkIGJ5IHRoZSBnaXZlbgorICAgICAqIHdpZHRoLCBoZWlnaHQsIGFuZCB0b3AgbGVmdCBjb3JuZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggdG9wIGxlZnQgY29ybmVyIG92YWwgY29vcmRpbmF0ZQotICAgICAqIEBwYXJhbSB5IHRoZSBZIHRvcCBsZWZ0IGNvcm5lciBvdmFsIGNvb3JkaW5hdGUKLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIG92YWwgd2lkdGgKLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBvdmFsIGhlaWdodAorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCB0b3AgbGVmdCBjb3JuZXIgb3ZhbCBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSB0b3AgbGVmdCBjb3JuZXIgb3ZhbCBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIG92YWwgd2lkdGguCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIG92YWwgaGVpZ2h0LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGRyYXdPdmFsKGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKIAogICAgIC8qKgotICAgICAqIERyYXdzIHRoZSBvdXRsaW5lIG9mIGEgcG9seWdvbi4gVGhlIHBvbHlnb24gdmVydGljZXMgYXJlIGRlZmluZWQgYnkgcG9pbnRzIAotICAgICAqIHdpdGggeHBvaW50c1tpXSwgeXBvaW50c1tpXSAgYXMgY29vcmRpbmF0ZXMuIFRoZSBwb2x5Z29uIGVkZ2VzIGFyZSB0aGUKLSAgICAgKiBsaW5lcyBmcm9tIHRoZSBwb2ludHMgd2l0aCAoeHBvaW50c1tpLTFdLCB5cG9pbnRzW2ktMV0pIGNvb3JkaW5hdGVzIHRvICAgCi0gICAgICogdGhlIHBvaW50cyB3aXRoICh4cG9pbnRzW2ldLCB5cG9pbnRzW2ldKSBjb29yZGluYXRlcywgZm9yIDAgPCBpIDwgbnBvaW50cyArMS4KKyAgICAgKiBEcmF3cyB0aGUgb3V0bGluZSBvZiBhIHBvbHlnb24uIFRoZSBwb2x5Z29uIHZlcnRpY2VzIGFyZSBkZWZpbmVkIGJ5CisgICAgICogcG9pbnRzIHdpdGggeHBvaW50c1tpXSwgeXBvaW50c1tpXSBhcyBjb29yZGluYXRlcy4gVGhlIHBvbHlnb24gZWRnZXMgYXJlCisgICAgICogdGhlIGxpbmVzIGZyb20gdGhlIHBvaW50cyB3aXRoICh4cG9pbnRzW2ktMV0sIHlwb2ludHNbaS0xXSkgY29vcmRpbmF0ZXMKKyAgICAgKiB0byB0aGUgcG9pbnRzIHdpdGggKHhwb2ludHNbaV0sIHlwb2ludHNbaV0pIGNvb3JkaW5hdGVzLCBmb3IgMCA8IGkgPAorICAgICAqIG5wb2ludHMgKzEuCiAgICAgICogCi0gICAgICogQHBhcmFtIHhwb2ludHMgdGhlIGFycmF5IG9mIFggY29vcmRpbmF0ZXMgb2YgdGhlIHBvbHlnb24gdmVydGljZXMuCi0gICAgICogQHBhcmFtIHlwb2ludHMgdGhlIGFycmF5IG9mIFkgY29vcmRpbmF0ZXMgb2YgdGhlIHBvbHlnb24gdmVydGljZXMuCi0gICAgICogQHBhcmFtIG5wb2ludHMgdGhlIG51bWJlciBvZiBwb2x5Z29uIHZlcnRpY2VzL3BvaW50cy4KKyAgICAgKiBAcGFyYW0geHBvaW50cworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIFggY29vcmRpbmF0ZXMgb2YgdGhlIHBvbHlnb24gdmVydGljZXMuCisgICAgICogQHBhcmFtIHlwb2ludHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBZIGNvb3JkaW5hdGVzIG9mIHRoZSBwb2x5Z29uIHZlcnRpY2VzLgorICAgICAqIEBwYXJhbSBucG9pbnRzCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHBvbHlnb24gdmVydGljZXMvcG9pbnRzLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGRyYXdQb2x5Z29uKGludFtdIHhwb2ludHMsIGludFtdIHlwb2ludHMsIGludCBucG9pbnRzKTsKIAogICAgIC8qKgotICAgICAqIERyYXdzIGEgc2V0IG9mIGNvbm5lY3RlZCBsaW5lcyB3aGljaCBhcmUgZGVmaW5lZCBieSB0aGUgeCBhbmQgeSBjb29yZGluYXRlIGFycmF5cy4gIAotICAgICAqIFRoZSBwb2x5bGluZSBpcyBjbG9zZWQgaWYgY29vcmRpbmF0ZXMgb2YgdGhlIGZpcnN0IHBvaW50IGFyZSB0aGUgc2FtZSBhcyAKLSAgICAgKiBjb29yZGluYXRlcyBvZiB0aGUgbGFzdCBwb2ludC4KKyAgICAgKiBEcmF3cyBhIHNldCBvZiBjb25uZWN0ZWQgbGluZXMgd2hpY2ggYXJlIGRlZmluZWQgYnkgdGhlIHggYW5kIHkKKyAgICAgKiBjb29yZGluYXRlIGFycmF5cy4gVGhlIHBvbHlsaW5lIGlzIGNsb3NlZCBpZiBjb29yZGluYXRlcyBvZiB0aGUgZmlyc3QKKyAgICAgKiBwb2ludCBhcmUgdGhlIHNhbWUgYXMgY29vcmRpbmF0ZXMgb2YgdGhlIGxhc3QgcG9pbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHhwb2ludHMgdGhlIGFycmF5IG9mIFggcG9pbnQgY29vcmRpbmF0ZXMuCi0gICAgICogQHBhcmFtIHlwb2ludHMgdGhlIGFycmF5IG9mIFkgcG9pbnQgY29vcmRpbmF0ZXMuCi0gICAgICogQHBhcmFtIG5wb2ludHMgdGhlIG51bWJlciBvZiBwb2ludHMuCisgICAgICogQHBhcmFtIHhwb2ludHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBYIHBvaW50IGNvb3JkaW5hdGVzLgorICAgICAqIEBwYXJhbSB5cG9pbnRzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgWSBwb2ludCBjb29yZGluYXRlcy4KKyAgICAgKiBAcGFyYW0gbnBvaW50cworICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBwb2ludHMuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZHJhd1BvbHlsaW5lKGludFtdIHhwb2ludHMsIGludFtdIHlwb2ludHMsIGludCBucG9pbnRzKTsKIAogICAgIC8qKgogICAgICAqIERyYXdzIHRoZSBvdXRsaW5lIG9mIGEgcmVjdGFuZ2xlIHdpdGggcm91bmQgY29ybmVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB0b3AgbGVmdCBjb3JuZXIuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdG9wIGxlZnQgY29ybmVyLgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gYXJjV2lkdGggdGhlIGFyYyB3aWR0aCBmb3IgdGhlIGNvcm5lcnMuCi0gICAgICogQHBhcmFtIGFyY0hlaWdodCB0aGUgYXJjIGhlaWdodCBmb3IgdGhlIGNvcm5lcnMuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHRvcCBsZWZ0IGNvcm5lci4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdG9wIGxlZnQgY29ybmVyLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSBhcmNXaWR0aAorICAgICAqICAgICAgICAgICAgdGhlIGFyYyB3aWR0aCBmb3IgdGhlIGNvcm5lcnMuCisgICAgICogQHBhcmFtIGFyY0hlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGFyYyBoZWlnaHQgZm9yIHRoZSBjb3JuZXJzLgogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGRyYXdSb3VuZFJlY3QoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBhcmNXaWR0aCwgaW50IGFyY0hlaWdodCk7CisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZHJhd1JvdW5kUmVjdChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGFyY1dpZHRoLAorICAgICAgICAgICAgaW50IGFyY0hlaWdodCk7CiAKICAgICAvKioKLSAgICAgKiBEcmF3cyBhIHRleHQgZGVmaW5lZCBieSBhbiBpdGVyYXRvci4gVGhlIGl0ZXJhdG9yIHNob3VsZCBzcGVjaWZ5IHRoZSBmb250IAotICAgICAqIGZvciBldmVyeSBjaGFyYWN0ZXIuIAotICAgICAqICAKLSAgICAgKiBAcGFyYW0gaXRlcmF0b3IgdGhlIGl0ZXJhdG9yLgotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnQgY2hhcmFjdGVyLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNoYXJhY3Rlci4KKyAgICAgKiBEcmF3cyBhIHRleHQgZGVmaW5lZCBieSBhbiBpdGVyYXRvci4gVGhlIGl0ZXJhdG9yIHNob3VsZCBzcGVjaWZ5IHRoZSBmb250CisgICAgICogZm9yIGV2ZXJ5IGNoYXJhY3Rlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaXRlcmF0b3IKKyAgICAgKiAgICAgICAgICAgIHRoZSBpdGVyYXRvci4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZHJhd1N0cmluZyhBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IgaXRlcmF0b3IsIGludCB4LCBpbnQgeSk7CiAKQEAgLTU2NSw4NiArNzEyLDExNyBAQAogICAgICAqIERyYXdzIGEgdGV4dCBkZWZpbmVkIGJ5IGEgc3RyaW5nLiBUaGlzIG1ldGhvZCBkcmF3cyB0aGUgdGV4dCB3aXRoIGN1cnJlbnQKICAgICAgKiBmb250IGFuZCBjb2xvci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcuIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnQgY2hhcmFjdGVyLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNoYXJhY3Rlci4KKyAgICAgKiBAcGFyYW0gc3RyCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNoYXJhY3Rlci4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBkcmF3U3RyaW5nKFN0cmluZyBzdHIsIGludCB4LCBpbnQgeSk7CiAKICAgICAvKioKLSAgICAgKiBGaWxscyB0aGUgYXJjIGNvdmVyaW5nIHRoZSByZWN0YW5nbGUgYW5kIHVzaW5nIHRoZSBjdXJyZW50IGNvbG9yLiAKLSAgICAgKiBUaGUgcmVjdGFuZ2xlIGlzIGRlZmluZWQgYnkgdGhlIG9yaWdpbiBwb2ludCAoWCwgWSkgYW5kIGRpbWVudGlvbnMgKHdpZHRoIGFuZCBoZWlnaHQpLiAKLSAgICAgKiBUaGUgYXJjIGNlbnRlciBpcyB0aGUgdGhlIGNlbnRlciBvZiBzcGVjaWZpZWQgcmVjdGFuZ2xlLiAKLSAgICAgKiBUaGUgYW5nbGUgb3JpZ2luIGlzIGF0IHRoZSAzIG8nY2xvY2sgcG9zaXRpb24sIGFuZCBhIHBvc2l0aXZlIGFuZ2xlIGdpdmVzICAKKyAgICAgKiBGaWxscyB0aGUgYXJjIGNvdmVyaW5nIHRoZSByZWN0YW5nbGUgYW5kIHVzaW5nIHRoZSBjdXJyZW50IGNvbG9yLiBUaGUKKyAgICAgKiByZWN0YW5nbGUgaXMgZGVmaW5lZCBieSB0aGUgb3JpZ2luIHBvaW50IChYLCBZKSBhbmQgZGltZW5zaW9ucyAod2lkdGggYW5kCisgICAgICogaGVpZ2h0KS4gVGhlIGFyYyBjZW50ZXIgaXMgdGhlIHRoZSBjZW50ZXIgb2Ygc3BlY2lmaWVkIHJlY3RhbmdsZS4gVGhlCisgICAgICogYW5nbGUgb3JpZ2luIGlzIGF0IHRoZSAzIG8nY2xvY2sgcG9zaXRpb24sIGFuZCBhIHBvc2l0aXZlIGFuZ2xlIGdpdmVzCiAgICAgICogY291bnRlci1jbG9ja3dpc2Ugcm90YXRpb24sIGEgbmVnYXRpdmUgYW5nbGUgZ2l2ZXMgY2xvY2t3aXNlIHJvdGF0aW9uLgotICAgICAqICAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBvcmlnaW4gY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIHdoaWNoIHNjYWxlcyB0aGUgYXJjLiAKLSAgICAgKiBAcGFyYW0geSB0aGUgWSBvcmlnaW4gY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIHdoaWNoIHNjYWxlcyB0aGUgYXJjLgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZSB3aGljaCBzY2FsZXMgdGhlIGFyYy4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSB3aGljaCBzY2FsZXMgdGhlIGFyYy4KLSAgICAgKiBAcGFyYW0gc2Egc3RhcnQgYW5nbGUgLSB0aGUgb3JpZ2luIGFuZ2xlIG9mIGFyYy4KLSAgICAgKiBAcGFyYW0gZWEgYXJjIGFuZ2xlIC0gdGhlIGFuZ3VsYXIgYXJjIHZhbHVlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBhbmdsZS4gCisgICAgICogCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIG9yaWdpbiBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgd2hpY2ggc2NhbGVzIHRoZSBhcmMuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIG9yaWdpbiBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgd2hpY2ggc2NhbGVzIHRoZSBhcmMuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZSB3aGljaCBzY2FsZXMgdGhlIGFyYy4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgd2hpY2ggc2NhbGVzIHRoZSBhcmMuCisgICAgICogQHBhcmFtIHNhCisgICAgICogICAgICAgICAgICBzdGFydCBhbmdsZSAtIHRoZSBvcmlnaW4gYW5nbGUgb2YgYXJjLgorICAgICAqIEBwYXJhbSBlYQorICAgICAqICAgICAgICAgICAgYXJjIGFuZ2xlIC0gdGhlIGFuZ3VsYXIgYXJjIHZhbHVlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBhbmdsZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBmaWxsQXJjKGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc2EsIGludCBlYSk7CiAKICAgICAvKioKLSAgICAgKiBGaWxscyBhbiBvdmFsIHdpdGggdGhlIGN1cnJlbnQgY29sb3Igd2hlcmUgdGhlIG92YWwgaXMgZGVmaW5lZCBieSB0aGUgCisgICAgICogRmlsbHMgYW4gb3ZhbCB3aXRoIHRoZSBjdXJyZW50IGNvbG9yIHdoZXJlIHRoZSBvdmFsIGlzIGRlZmluZWQgYnkgdGhlCiAgICAgICogYm91bmRpbmcgcmVjdGFuZ2xlIHdpdGggdGhlIGdpdmVuIHdpZHRoLCBoZWlnaHQsIGFuZCB0b3AgbGVmdCBjb3JuZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggdG9wIGxlZnQgY29ybmVyIG92YWwgY29vcmRpbmF0ZS4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSB0b3AgbGVmdCBjb3JuZXIgb3ZhbCBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgb3ZhbCB3aWR0aC4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBvdmFsIGhlaWdodC4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggdG9wIGxlZnQgY29ybmVyIG92YWwgY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgdG9wIGxlZnQgY29ybmVyIG92YWwgY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBvdmFsIHdpZHRoLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvdmFsIGhlaWdodC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBmaWxsT3ZhbChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCk7CiAKICAgICAvKioKLSAgICAgKiBGaWxscyBhIHBvbHlnb24gd2l0aCB0aGUgY3VycmVudCBjb2xvci4gVGhlIHBvbHlnb24gdmVydGljZXMgYXJlIGRlZmluZWQgYnkgdGhlIHBvaW50cyAKLSAgICAgKiB3aXRoIHhwb2ludHNbaV0sIHlwb2ludHNbaV0gYXMgY29vcmRpbmF0ZXMuIFRoZSBwb2x5Z29uIGVkZ2VzIGFyZSB0aGUKLSAgICAgKiBsaW5lcyBmcm9tIHRoZSBwb2ludHMgd2l0aCAoeHBvaW50c1tpLTFdLCB5cG9pbnRzW2ktMV0pIGNvb3JkaW5hdGVzIHRvICAgCi0gICAgICogdGhlIHBvaW50cyB3aXRoICh4cG9pbnRzW2ldLCB5cG9pbnRzW2ldKSBjb29yZGluYXRlcywgZm9yIDAgPCBpIDwgbnBvaW50cyArMS4KKyAgICAgKiBGaWxscyBhIHBvbHlnb24gd2l0aCB0aGUgY3VycmVudCBjb2xvci4gVGhlIHBvbHlnb24gdmVydGljZXMgYXJlIGRlZmluZWQKKyAgICAgKiBieSB0aGUgcG9pbnRzIHdpdGggeHBvaW50c1tpXSwgeXBvaW50c1tpXSBhcyBjb29yZGluYXRlcy4gVGhlIHBvbHlnb24KKyAgICAgKiBlZGdlcyBhcmUgdGhlIGxpbmVzIGZyb20gdGhlIHBvaW50cyB3aXRoICh4cG9pbnRzW2ktMV0sIHlwb2ludHNbaS0xXSkKKyAgICAgKiBjb29yZGluYXRlcyB0byB0aGUgcG9pbnRzIHdpdGggKHhwb2ludHNbaV0sIHlwb2ludHNbaV0pIGNvb3JkaW5hdGVzLCBmb3IKKyAgICAgKiAwIDwgaSA8IG5wb2ludHMgKzEuCiAgICAgICogCi0gICAgICogQHBhcmFtIHhwb2ludHMgdGhlIGFycmF5IG9mIFggY29vcmRpbmF0ZXMgb2YgdGhlIHBvbHlnb24gdmVydGljZXMuCi0gICAgICogQHBhcmFtIHlwb2ludHMgdGhlIGFycmF5IG9mIFkgY29vcmRpbmF0ZXMgb2YgdGhlIHBvbHlnb24gdmVydGljZXMuCi0gICAgICogQHBhcmFtIG5wb2ludHMgdGhlIG51bWJlciBvZiBwb2x5Z29uIHZlcnRpY2VzL3BvaW50cy4KKyAgICAgKiBAcGFyYW0geHBvaW50cworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIFggY29vcmRpbmF0ZXMgb2YgdGhlIHBvbHlnb24gdmVydGljZXMuCisgICAgICogQHBhcmFtIHlwb2ludHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBZIGNvb3JkaW5hdGVzIG9mIHRoZSBwb2x5Z29uIHZlcnRpY2VzLgorICAgICAqIEBwYXJhbSBucG9pbnRzCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHBvbHlnb24gdmVydGljZXMvcG9pbnRzLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGZpbGxQb2x5Z29uKGludFtdIHhwb2ludHMsIGludFtdIHlwb2ludHMsIGludCBucG9pbnRzKTsKIAogICAgIC8qKgotICAgICAqIEZpbGxzIGEgcmVjdGFuZ2xlIHdpdGggdGhlIGN1cnJlbnQgY29sb3IuIAotICAgICAqIFRoZSByZWN0YW5nbGUgaXMgZGVmaW5lZCBieSBpdHMgd2lkdGggYW5kIGxlbmd0aCBhbmQgdG9wIGxlZnQgY29ybmVyIGNvb3JkaW5hdGVzLgorICAgICAqIEZpbGxzIGEgcmVjdGFuZ2xlIHdpdGggdGhlIGN1cnJlbnQgY29sb3IuIFRoZSByZWN0YW5nbGUgaXMgZGVmaW5lZCBieSBpdHMKKyAgICAgKiB3aWR0aCBhbmQgbGVuZ3RoIGFuZCB0b3AgbGVmdCBjb3JuZXIgY29vcmRpbmF0ZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdG9wIGxlZnQgY29ybmVyLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHRvcCBsZWZ0IGNvcm5lci4KLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB0b3AgbGVmdCBjb3JuZXIuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHRvcCBsZWZ0IGNvcm5lci4KKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiByZWN0YW5nbGUuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZmlsbFJlY3QoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwogCiAgICAgLyoqCiAgICAgICogRmlsbHMgYSByb3VuZCBjb3JuZXJlZCByZWN0YW5nbGUgd2l0aCB0aGUgY3VycmVudCBjb2xvci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIGFyY1dpZHRoIHRoZSBhcmMgd2lkdGggYXQgdGhlIGNvcm5lcnMuCi0gICAgICogQHBhcmFtIGFyY0hlaWdodCB0aGUgYXJjIGhlaWdodCBhdCB0aGUgY29ybmVycy4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBib3VuZGluZworICAgICAqICAgICAgICAgICAgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nCisgICAgICogICAgICAgICAgICByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIGFyY1dpZHRoCisgICAgICogICAgICAgICAgICB0aGUgYXJjIHdpZHRoIGF0IHRoZSBjb3JuZXJzLgorICAgICAqIEBwYXJhbSBhcmNIZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcmMgaGVpZ2h0IGF0IHRoZSBjb3JuZXJzLgogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGZpbGxSb3VuZFJlY3QoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBhcmNXaWR0aCwgaW50IGFyY0hlaWdodCk7CisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZmlsbFJvdW5kUmVjdChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGFyY1dpZHRoLAorICAgICAgICAgICAgaW50IGFyY0hlaWdodCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjbGlwcGluZyBhcmVhLgotICAgICAqIDxicj4gPGJyPgotICAgICAqICAKKyAgICAgKiBHZXRzIHRoZSBjbGlwcGluZyBhcmVhLiA8YnI+CisgICAgICogPGJyPgorICAgICAqIAogICAgICAqIEByZXR1cm4gYSBTaGFwZSBvYmplY3Qgb2YgdGhlIGNsaXBwaW5nIGFyZWEgb3IgbnVsbCBpZiBpdCBpcyBub3Qgc2V0LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTaGFwZSBnZXRDbGlwKCk7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBib3VuZHMgb2YgdGhlIGN1cnJlbnQgY2xpcHBpbmcgYXJlYSBhcyBhIHJlY3RhbmdsZS4KLSAgICAgKiAgCi0gICAgICogQHJldHVybiBhIFJlY3RhbmdsZSBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyB0aGUgYm91bmRzIG9mIHRoZSBjdXJyZW50IGNsaXBwaW5nIGFyZWEuIAorICAgICAqIAorICAgICAqIEByZXR1cm4gYSBSZWN0YW5nbGUgb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgdGhlIGJvdW5kcyBvZiB0aGUgY3VycmVudAorICAgICAqICAgICAgICAgY2xpcHBpbmcgYXJlYS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgUmVjdGFuZ2xlIGdldENsaXBCb3VuZHMoKTsKIApAQCAtNjYzLDc1ICs4NDEsODQgQEAKICAgICBwdWJsaWMgYWJzdHJhY3QgRm9udCBnZXRGb250KCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBmb250IG1ldHJpY3Mgb2YgdGhlIHNwZWNpZmllZCBmb250LiAKLSAgICAgKiBUaGUgZm9udCBtZXRyaWNzIG9iamVjdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVuZGVyaW5nIG9mIGEgcGFydGljdWxhciBmb250LgorICAgICAqIEdldHMgdGhlIGZvbnQgbWV0cmljcyBvZiB0aGUgc3BlY2lmaWVkIGZvbnQuIFRoZSBmb250IG1ldHJpY3Mgb2JqZWN0CisgICAgICogY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlbmRlcmluZyBvZiBhIHBhcnRpY3VsYXIgZm9udC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZm9udCB0aGUgc3BlY2lmaWVkIGZvbnQKLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZm9udAorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBmb250LgogICAgICAqIEByZXR1cm4gdGhlIGZvbnQgbWV0cmljcyBmb3IgdGhlIHNwZWNpZmllZCBmb250LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBGb250TWV0cmljcyBnZXRGb250TWV0cmljcyhGb250IGZvbnQpOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmV3IGNsaXBwaW5nIGFyZWEgc3BlY2lmaWVkIGJ5IHJlY3RhbmdsZS4gVGhlIG5ldyBjbGlwcGluZyBhcmVhIAotICAgICAqIGRvZXNuJ3QgZGVwZW5kIG9uIHRoZSB3aW5kb3cncyB2aXNpYmlsaXR5LiBSZW5kZXJpbmcgb3BlcmF0aW9ucyBjYW4ndCBiZSBwZXJmb3JtZWQgCi0gICAgICogb3V0c2lkZSBuZXcgY2xpcHBpbmcgYXJlYS4KKyAgICAgKiBTZXRzIHRoZSBuZXcgY2xpcHBpbmcgYXJlYSBzcGVjaWZpZWQgYnkgcmVjdGFuZ2xlLiBUaGUgbmV3IGNsaXBwaW5nIGFyZWEKKyAgICAgKiBkb2Vzbid0IGRlcGVuZCBvbiB0aGUgd2luZG93J3MgdmlzaWJpbGl0eS4gUmVuZGVyaW5nIG9wZXJhdGlvbnMgY2FuJ3QgYmUKKyAgICAgKiBwZXJmb3JtZWQgb3V0c2lkZSBuZXcgY2xpcHBpbmcgYXJlYS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBuZXcgY2xpcHBpbmcgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIG5ldyBjbGlwcGluZyByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgbmV3IGNsaXBwaW5nIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIG5ldyBjbGlwcGluZyByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIG5ldyBjbGlwcGluZyByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIG5ldyBjbGlwcGluZyByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIG5ldyBjbGlwcGluZyByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgbmV3IGNsaXBwaW5nIHJlY3RhbmdsZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDbGlwKGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIG5ldyBjbGlwcGluZyBhcmVhIHRvIGJlIHRoZSBhcmVhIHNwZWNpZmllZCBieSBTaGFwZSBvYmplY3QuIAotICAgICAqIFRoZSBuZXcgY2xpcHBpbmcgYXJlYSBkb2Vzbid0IGRlcGVuZCBvbiB0aGUgd2luZG93J3MgdmlzaWJpbGl0eS4gCi0gICAgICogUmVuZGVyaW5nIG9wZXJhdGlvbnMgY2FuJ3QgYmUgcGVyZm9ybWVkIG91dHNpZGUgbmV3IGNsaXBwaW5nIGFyZWEuCisgICAgICogU2V0cyB0aGUgbmV3IGNsaXBwaW5nIGFyZWEgdG8gYmUgdGhlIGFyZWEgc3BlY2lmaWVkIGJ5IFNoYXBlIG9iamVjdC4gVGhlCisgICAgICogbmV3IGNsaXBwaW5nIGFyZWEgZG9lc24ndCBkZXBlbmQgb24gdGhlIHdpbmRvdydzIHZpc2liaWxpdHkuIFJlbmRlcmluZworICAgICAqIG9wZXJhdGlvbnMgY2FuJ3QgYmUgcGVyZm9ybWVkIG91dHNpZGUgbmV3IGNsaXBwaW5nIGFyZWEuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNsaXAgYSBTaGFwZSBvYmplY3Qgd2hpY2ggcmVwcmVzZW50ZXMgbmV3IGNsaXBwaW5nIGFyZWEuCisgICAgICogQHBhcmFtIGNsaXAKKyAgICAgKiAgICAgICAgICAgIHRoZSBTaGFwZSBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyBuZXcgY2xpcHBpbmcgYXJlYS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDbGlwKFNoYXBlIGNsaXApOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCBHcmFwaGljcyBjb2xvci4gQWxsIHJlbmRlcmluZyBvcGVyYXRpb25zIHdpdGggdGhpcyBHcmFwaGljcwotICAgICAqIHdpbGwgdXNlIHRoaXMgY29sb3IuCisgICAgICogU2V0cyB0aGUgY3VycmVudCBHcmFwaGljcyBjb2xvci4gQWxsIHJlbmRlcmluZyBvcGVyYXRpb25zIHdpdGggdGhpcworICAgICAqIEdyYXBoaWNzIHdpbGwgdXNlIHRoaXMgY29sb3IuCiAgICAgICogCi0gICAgICogQHBhcmFtIGMgdGhlIG5ldyBjb2xvci4KKyAgICAgKiBAcGFyYW0gYworICAgICAqICAgICAgICAgICAgdGhlIG5ldyBjb2xvci4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDb2xvcihDb2xvciBjKTsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgR3JhcGhpY3MgZm9udC4gQWxsIHJlbmRlcmluZyBvcGVyYXRpb25zIHdpdGggdGhpcyBHcmFwaGljcwotICAgICAqIHdpbGwgdXNlIHRoaXMgZm9udC4KKyAgICAgKiBTZXRzIHRoZSBjdXJyZW50IEdyYXBoaWNzIGZvbnQuIEFsbCByZW5kZXJpbmcgb3BlcmF0aW9ucyB3aXRoIHRoaXMKKyAgICAgKiBHcmFwaGljcyB3aWxsIHVzZSB0aGlzIGZvbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGZvbnQgdGhlIG5ldyBmb250LgorICAgICAqIEBwYXJhbSBmb250CisgICAgICogICAgICAgICAgICB0aGUgbmV3IGZvbnQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Rm9udChGb250IGZvbnQpOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgcGFpbnQgbW9kZSBmb3IgdGhlIEdyYXBoaWNzIHdoaWNoIG92ZXJ3cml0ZXMgYWxsIHJlbmRlcmluZyAKKyAgICAgKiBTZXRzIHRoZSBwYWludCBtb2RlIGZvciB0aGUgR3JhcGhpY3Mgd2hpY2ggb3ZlcndyaXRlcyBhbGwgcmVuZGVyaW5nCiAgICAgICogb3BlcmF0aW9ucyB3aXRoIHRoZSBjdXJyZW50IGNvbG9yLgotICAgICAqICAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRQYWludE1vZGUoKTsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIFhPUiBtb2RlIGZvciB0aGUgR3JhcGhpY3Mgd2hpY2ggY2hhbmdlcyBhIHBpeGVsIGZyb20KLSAgICAgKiB0aGUgY3VycmVudCBjb2xvciB0byB0aGUgc3BlY2lmaWVkIFhPUiBjb2xvci4KLSAgICAgKiA8YnI+IDxicj4KKyAgICAgKiBTZXRzIHRoZSBYT1IgbW9kZSBmb3IgdGhlIEdyYXBoaWNzIHdoaWNoIGNoYW5nZXMgYSBwaXhlbCBmcm9tIHRoZSBjdXJyZW50CisgICAgICogY29sb3IgdG8gdGhlIHNwZWNpZmllZCBYT1IgY29sb3IuIDxicj4KKyAgICAgKiA8YnI+CiAgICAgICogCi0gICAgICogQHBhcmFtIGNvbG9yIHRoZSBuZXcgWE9SIG1vZGUKKyAgICAgKiBAcGFyYW0gY29sb3IKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgWE9SIG1vZGUuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0WE9STW9kZShDb2xvciBjb2xvcik7CiAKICAgICAvKioKLSAgICAgKiBUcmFuc2xhdGVzIHRoZSBvcmlnaW4gb2YgR3JhcGhpY3MgY3VycmVudCBjb29yZGluYXRlIHN5c3RlbSAKLSAgICAgKiB0byB0aGUgcG9pbnQgd2l0aCBYLCBZIGNvb3JkaW5hdGVzIGluIHRoZSBjdXJyZW50IGNvb3JkaW5hdGUgc3lzdGVtLgotICAgICAqIEFsbCByZW5kZXJpbmcgb3BlcmF0aW9uIGluIHRoaXMgR3JhcGhpY3Mgd2lsbCBiZSByZWxhdGVkIHRvIHRoZSBuZXcgb3JpZ2luLgorICAgICAqIFRyYW5zbGF0ZXMgdGhlIG9yaWdpbiBvZiBHcmFwaGljcyBjdXJyZW50IGNvb3JkaW5hdGUgc3lzdGVtIHRvIHRoZSBwb2ludAorICAgICAqIHdpdGggWCwgWSBjb29yZGluYXRlcyBpbiB0aGUgY3VycmVudCBjb29yZGluYXRlIHN5c3RlbS4gQWxsIHJlbmRlcmluZworICAgICAqIG9wZXJhdGlvbiBpbiB0aGlzIEdyYXBoaWNzIHdpbGwgYmUgcmVsYXRlZCB0byB0aGUgbmV3IG9yaWdpbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBvcmlnaW4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBvcmlnaW4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgb3JpZ2luLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBvcmlnaW4uCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdHJhbnNsYXRlKGludCB4LCBpbnQgeSk7CiB9CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvR3JhcGhpY3MyRC5qYXZhIGIvYXd0L2phdmEvYXd0L0dyYXBoaWNzMkQuamF2YQppbmRleCAyZmY1ZTBjLi4wNGE3MzE5IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvR3JhcGhpY3MyRC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9HcmFwaGljczJELmphdmEKQEAgLTMwLDE5ICszMCwyMiBAQAogCiAvKioKICAqIFRoZSBHcmFwaGljczJEIGNsYXNzIGV4dGVuZHMgR3JhcGhpY3MgY2xhc3MgYW5kIHByb3ZpZGVzIG1vcmUgY2FwYWJpbGl0aWVzCi0gKiBmb3IgcmVuZGVyaW5nIHRleHQsIGltYWdlcywgc2hhcGVzLiBUaGlzIHByb3ZpZGVzIG1ldGhvZHMgdG8gcGVmb3JtIAotICogdHJhbnNmb3JtYXRpb24gb2YgY29vcmRpbmF0ZSBzeXN0ZW0sIGNvbG9yIG1hbmFnZW1lbnQsIGFuZCB0ZXh0IGxheW91dC4gCi0gKiBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgZXhpc3QgZm9yIHJlbmRlcmluZzoKKyAqIGZvciByZW5kZXJpbmcgdGV4dCwgaW1hZ2VzLCBzaGFwZXMuIFRoaXMgcHJvdmlkZXMgbWV0aG9kcyB0byBwZXJmb3JtCisgKiB0cmFuc2Zvcm1hdGlvbiBvZiBjb29yZGluYXRlIHN5c3RlbSwgY29sb3IgbWFuYWdlbWVudCwgYW5kIHRleHQgbGF5b3V0LiBUaGUKKyAqIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGV4aXN0IGZvciByZW5kZXJpbmc6CiAgKiA8dWw+CiAgKiA8bGk+Q29sb3IgLSBjdXJyZW50IEdyYXBoaWNzMkQgY29sb3I7PC9saT4KICAqIDxsaT5Gb250IC0gY3VycmVudCBHcmFwaGljczJEIGZvbnQ7PC9saT4KLSAqIDxsaT5TdHJva2UgLSBwZW4gd2l0aCBhIHdpZHRoIG9mIDEgcGl4ZWw7PC9saT4gIAorICogPGxpPlN0cm9rZSAtIHBlbiB3aXRoIGEgd2lkdGggb2YgMSBwaXhlbDs8L2xpPgogICogPGxpPlRyYW5zZm9ybSAtIGN1cnJlbnQgR3JhcGhpY3MyRCBUcmFuc2Zvcm1hdGlvbjs8L2xpPgotICogPGxpPkNvbXBvc2l0ZSAtIGFscGhhIGNvbXBvc2l0aW5nIHJ1bGVzIGZvciBjb21iaW5pbmcgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBjb2xvcnMuPC9saT4KLSAqIDwvdWw+IAorICogPGxpPkNvbXBvc2l0ZSAtIGFscGhhIGNvbXBvc2l0aW5nIHJ1bGVzIGZvciBjb21iaW5pbmcgc291cmNlIGFuZCBkZXN0aW5hdGlvbgorICogY29sb3JzLjwvbGk+CisgKiA8L3VsPgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEdyYXBoaWNzMkQgZXh0ZW5kcyBHcmFwaGljcyB7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgR3JhcGhpY3MyRCBvYmplY3QuIFRoaXMgY29uc3RydWN0b3Igc2hvdWxkIG5ldmVyIGJlCiAgICAgICogY2FsbGVkIGRpcmVjdGx5LgpAQCAtNTIsNDEgKzU1LDQ2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQWRkcyBwcmVmZXJlbmNlcyBmb3IgdGhlIHJlbmRlcmluZyBhbGdvcml0aG1zLiBUaGUgcHJlZmVyZW5jZXMKLSAgICAgKiBhcmUgYXJiaXRyYXJ5IGFuZCBzcGVjaWZpZWQgYnkgTWFwIG9iamVjdHMuIEFsbCBzcGVjaWZpZWQgYnkgTWFwIG9iamVjdAotICAgICAqIHByZWZlcmVuY2llcyBjYW4gYmUgbW9kaWZpZWQuIAorICAgICAqIEFkZHMgcHJlZmVyZW5jZXMgZm9yIHRoZSByZW5kZXJpbmcgYWxnb3JpdGhtcy4gVGhlIHByZWZlcmVuY2VzIGFyZQorICAgICAqIGFyYml0cmFyeSBhbmQgc3BlY2lmaWVkIGJ5IE1hcCBvYmplY3RzLiBBbGwgc3BlY2lmaWVkIGJ5IE1hcCBvYmplY3QKKyAgICAgKiBwcmVmZXJlbmNlcyBjYW4gYmUgbW9kaWZpZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGhpbnRzIHRoZSByZW5kZXJpbmcgaGludHMuCisgICAgICogQHBhcmFtIGhpbnRzCisgICAgICogICAgICAgICAgICB0aGUgcmVuZGVyaW5nIGhpbnRzLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZFJlbmRlcmluZ0hpbnRzKE1hcDw/LCA/PiBoaW50cyk7CiAKICAgICAvKioKLSAgICAgKiBJbnRlcnNlY3RzIHRoZSBjdXJyZW50IGNsaXBwaW5nIGFyZWEgd2l0aCB0aGUgc3BlY2lmaWVkIFNoYXBlIAotICAgICAqIGFuZCB0aGUgcmVzdWx0IGJlY29tZXMgYSBuZXcgY2xpcHBpbmcgYXJlYS4gCi0gICAgICogSWYgY3VycmVudCBjbGlwcGluZyBhcmVhIGlzIG5vdCBkZWZpbmVkLCB0aGUgU2hhcGUgCi0gICAgICogYmVjb21lcyB0aGUgbmV3IGNsaXBwaW5nIGFyZWEuIE5vIHJlbmRlcmluZyBvcGVyYXRpb25zIAotICAgICAqIGFyZSBhbGxvd2VkIG91dHNpZGUgdGhlIGNsaXBwaW5nIGFyZWEuICAKKyAgICAgKiBJbnRlcnNlY3RzIHRoZSBjdXJyZW50IGNsaXBwaW5nIGFyZWEgd2l0aCB0aGUgc3BlY2lmaWVkIFNoYXBlIGFuZCB0aGUKKyAgICAgKiByZXN1bHQgYmVjb21lcyBhIG5ldyBjbGlwcGluZyBhcmVhLiBJZiBjdXJyZW50IGNsaXBwaW5nIGFyZWEgaXMgbm90CisgICAgICogZGVmaW5lZCwgdGhlIFNoYXBlIGJlY29tZXMgdGhlIG5ldyBjbGlwcGluZyBhcmVhLiBObyByZW5kZXJpbmcgb3BlcmF0aW9ucworICAgICAqIGFyZSBhbGxvd2VkIG91dHNpZGUgdGhlIGNsaXBwaW5nIGFyZWEuCiAgICAgICogCi0gICAgICogQHBhcmFtIHMgdGhlIHNwZWNpZmllZCBTaGFwZSBvYmplY3Qgd2hpY2ggd2lsbCBiZSBpbnRlcnNlY3RlZCAKLSAgICAgKiB3aXRoIGN1cnJlbnQgY2xpcHBpbmcgYXJlYS4KKyAgICAgKiBAcGFyYW0gcworICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBTaGFwZSBvYmplY3Qgd2hpY2ggd2lsbCBiZSBpbnRlcnNlY3RlZCB3aXRoCisgICAgICogICAgICAgICAgICBjdXJyZW50IGNsaXBwaW5nIGFyZWEuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgY2xpcChTaGFwZSBzKTsKIAogICAgIC8qKgogICAgICAqIERyYXdzIHRoZSBvdXRsaW5lIG9mIHRoZSBzcGVjaWZpZWQgU2hhcGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHMgdGhlIFNoYXBlIHdoaWNoIG91bGluZSBpcyBkcmF3bi4KKyAgICAgKiBAcGFyYW0gcworICAgICAqICAgICAgICAgICAgdGhlIFNoYXBlIHdoaWNoIG91dGxpbmUgaXMgZHJhd24uCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZHJhdyhTaGFwZSBzKTsKIAogICAgIC8qKgotICAgICAqIERyYXdzIHRoZSBzcGVjaWZpZWQgR2x5cGhWZWN0b3Igb2JqZWN0J3MgdGV4dCBhdCB0aGUgcG9pbnQgeCwgeS4gCisgICAgICogRHJhd3MgdGhlIHNwZWNpZmllZCBHbHlwaFZlY3RvciBvYmplY3QncyB0ZXh0IGF0IHRoZSBwb2ludCB4LCB5LgogICAgICAqIAotICAgICAqIEBwYXJhbSBnIHRoZSBHbHlwaFZlY3RvciBvYmplY3QgdG8gYmUgZHJhd24uCi0gICAgICogQHBhcmFtIHggdGhlIFggcG9zaXRpb24gd2hlcmUgdGhlIEdseXBoVmVjdG9yJ3MgdGV4dCBzaG91bGQgCi0gICAgICogYmUgcmVuZGVyZWQuICAKLSAgICAgKiBAcGFyYW0geSB0aGUgWSBwb3NpdGlvbiB3aGVyZSB0aGUgR2x5cGhWZWN0b3IncyB0ZXh0IHNob3VsZCAKLSAgICAgKiBiZSByZW5kZXJlZC4KKyAgICAgKiBAcGFyYW0gZworICAgICAqICAgICAgICAgICAgdGhlIEdseXBoVmVjdG9yIG9iamVjdCB0byBiZSBkcmF3bi4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggcG9zaXRpb24gd2hlcmUgdGhlIEdseXBoVmVjdG9yJ3MgdGV4dCBzaG91bGQgYmUKKyAgICAgKiAgICAgICAgICAgIHJlbmRlcmVkLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBwb3NpdGlvbiB3aGVyZSB0aGUgR2x5cGhWZWN0b3IncyB0ZXh0IHNob3VsZCBiZQorICAgICAqICAgICAgICAgICAgcmVuZGVyZWQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZHJhd0dseXBoVmVjdG9yKEdseXBoVmVjdG9yIGcsIGZsb2F0IHgsIGZsb2F0IHkpOwogCkBAIC05NCw4NyArMTAyLDEwNyBAQAogICAgICAqIERyYXdzIHRoZSBCdWZmZXJlZEltYWdlIC0tIG1vZGlmaWVkIGFjY29yZGluZyB0byB0aGUgb3BlcmF0aW9uCiAgICAgICogQnVmZmVyZWRJbWFnZU9wIC0tIGF0IHRoZSBwb2ludCB4LCB5LgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWcgdGhlIEJ1ZmZlcmVkSW1hZ2UgdG8gYmUgcmVuZGVyZWQuCi0gICAgICogQHBhcmFtIG9wIHRoZSBmaWx0ZXIgdG8gYmUgYXBwbGllZCB0byB0aGUgaW1hZ2UgYmVmb3JlIHJlbmRlcmluZy4gCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgd2hlcmUgdGhlIGltYWdlJ3MgdXBwZXIgbGVmdCBjb3JuZXIKLSAgICAgKiB3aWxsIGJlIHBsYWNlZC4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBwb2ludCB3aGVyZSB0aGUgaW1hZ2UncyB1cHBlciBsZWZ0IGNvcm5lcgotICAgICAqIHdpbGwgYmUgcGxhY2VkLgorICAgICAqIEBwYXJhbSBpbWcKKyAgICAgKiAgICAgICAgICAgIHRoZSBCdWZmZXJlZEltYWdlIHRvIGJlIHJlbmRlcmVkLgorICAgICAqIEBwYXJhbSBvcAorICAgICAqICAgICAgICAgICAgdGhlIGZpbHRlciB0byBiZSBhcHBsaWVkIHRvIHRoZSBpbWFnZSBiZWZvcmUgcmVuZGVyaW5nLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBwb2ludCB3aGVyZSB0aGUgaW1hZ2UncyB1cHBlciBsZWZ0CisgICAgICogICAgICAgICAgICBjb3JuZXIgd2lsbCBiZSBwbGFjZWQuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50IHdoZXJlIHRoZSBpbWFnZSdzIHVwcGVyIGxlZnQKKyAgICAgKiAgICAgICAgICAgIGNvcm5lciB3aWxsIGJlIHBsYWNlZC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBkcmF3SW1hZ2UoQnVmZmVyZWRJbWFnZSBpbWcsIEJ1ZmZlcmVkSW1hZ2VPcCBvcCwgaW50IHgsIGludCB5KTsKIAogICAgIC8qKgotICAgICAqIERyYXdzIEJ1ZmZlcmVkSW1hZ2UgdHJhbnNmb3JtZWQgZnJvbSBpbWFnZSBzcGFjZSBpbnRvIHVzZXIgc3BhY2UgCisgICAgICogRHJhd3MgQnVmZmVyZWRJbWFnZSB0cmFuc2Zvcm1lZCBmcm9tIGltYWdlIHNwYWNlIGludG8gdXNlciBzcGFjZQogICAgICAqIGFjY29yZGluZyB0byB0aGUgQWZmaW5lVHJhbnNmb3JtIHhmb3JtIGFuZCBub3RpZmllcyB0aGUgSW1hZ2VPYnNlcnZlci4KLSAgICAgKiAgCi0gICAgICogQHBhcmFtIGltZyB0aGUgQnVmZmVyZWRJbWFnZSB0byBiZSByZW5kZXJlZC4KLSAgICAgKiBAcGFyYW0geGZvcm0gdGhlIGFmZmluZSB0cmFuc2Zvcm1hdGlvbiBmcm9tIHRoZSBpbWFnZSB0byB0aGUgdXNlciBzcGFjZS4KLSAgICAgKiBAcGFyYW0gb2JzIHRoZSBJbWFnZU9ic2VydmVyIHRvIGJlIG5vdGlmaWVkIGFib3V0IHRoZSBpbWFnZSBjb252ZXJzaW9uLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIGltYWdlIGlzIHN1Y2Nlc3NmdWxseSBsb2FkZWQgYW5kIHJlbmRlcmVkLCAKLSAgICAgKiBvciBpdCdzIG51bGwsIG90aGVyd2lzZSBmYWxzZS4KKyAgICAgKiBAcGFyYW0gaW1nCisgICAgICogICAgICAgICAgICB0aGUgQnVmZmVyZWRJbWFnZSB0byBiZSByZW5kZXJlZC4KKyAgICAgKiBAcGFyYW0geGZvcm0KKyAgICAgKiAgICAgICAgICAgIHRoZSBhZmZpbmUgdHJhbnNmb3JtYXRpb24gZnJvbSB0aGUgaW1hZ2UgdG8gdGhlIHVzZXIgc3BhY2UuCisgICAgICogQHBhcmFtIG9icworICAgICAqICAgICAgICAgICAgdGhlIEltYWdlT2JzZXJ2ZXIgdG8gYmUgbm90aWZpZWQgYWJvdXQgdGhlIGltYWdlIGNvbnZlcnNpb24uCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgaW1hZ2UgaXMgc3VjY2Vzc2Z1bGx5IGxvYWRlZCBhbmQgcmVuZGVyZWQsIG9yIGl0J3MKKyAgICAgKiAgICAgICAgIG51bGwsIG90aGVyd2lzZSBmYWxzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBkcmF3SW1hZ2UoSW1hZ2UgaW1nLCBBZmZpbmVUcmFuc2Zvcm0geGZvcm0sIEltYWdlT2JzZXJ2ZXIgb2JzKTsKIAogICAgIC8qKgotICAgICAqIERyYXdzIGEgUmVuZGVyYWJsZUltYWdlIHdoaWNoIGlzIHRyYW5zZm9ybWVkIGZyb20gaW1hZ2Ugc3BhY2UgaW50byB1c2VyIAorICAgICAqIERyYXdzIGEgUmVuZGVyYWJsZUltYWdlIHdoaWNoIGlzIHRyYW5zZm9ybWVkIGZyb20gaW1hZ2Ugc3BhY2UgaW50byB1c2VyCiAgICAgICogYWNjb3JkaW5nIHRvIHRoZSBBZmZpbmVUcmFuc2Zvcm0geGZvcm0uCi0gICAgICogIAotICAgICAqIEBwYXJhbSBpbWcgdGhlIFJlbmRlcmFibGVJbWFnZSB0byBiZSByZW5kZXJlZC4KLSAgICAgKiBAcGFyYW0geGZvcm0gdGhlIGFmZmluZSB0cmFuc2Zvcm1hdGlvbiBmcm9tIGltYWdlIHRvIHVzZXIgc3BhY2UuCisgICAgICogCisgICAgICogQHBhcmFtIGltZworICAgICAqICAgICAgICAgICAgdGhlIFJlbmRlcmFibGVJbWFnZSB0byBiZSByZW5kZXJlZC4KKyAgICAgKiBAcGFyYW0geGZvcm0KKyAgICAgKiAgICAgICAgICAgIHRoZSBhZmZpbmUgdHJhbnNmb3JtYXRpb24gZnJvbSBpbWFnZSB0byB1c2VyIHNwYWNlLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGRyYXdSZW5kZXJhYmxlSW1hZ2UoUmVuZGVyYWJsZUltYWdlIGltZywgQWZmaW5lVHJhbnNmb3JtIHhmb3JtKTsKIAogICAgIC8qKgotICAgICAqIERyYXdzIGEgUmVuZGVyZWRJbWFnZSB3aGljaCBpcyB0cmFuc2Zvcm1lZCBmcm9tIGltYWdlIHNwYWNlIGludG8gdXNlciAKKyAgICAgKiBEcmF3cyBhIFJlbmRlcmVkSW1hZ2Ugd2hpY2ggaXMgdHJhbnNmb3JtZWQgZnJvbSBpbWFnZSBzcGFjZSBpbnRvIHVzZXIKICAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIEFmZmluZVRyYW5zZm9ybSB4Zm9ybS4KLSAgICAgKiAgCi0gICAgICogQHBhcmFtIGltZyB0aGUgUmVuZGVyZWRJbWFnZSB0byBiZSByZW5kZXJlZC4KLSAgICAgKiBAcGFyYW0geGZvcm0gdGhlIGFmZmluZSB0cmFuc2Zvcm1hdGlvbiBmcm9tIGltYWdlIHRvIHVzZXIgc3BhY2UuCisgICAgICogCisgICAgICogQHBhcmFtIGltZworICAgICAqICAgICAgICAgICAgdGhlIFJlbmRlcmVkSW1hZ2UgdG8gYmUgcmVuZGVyZWQuCisgICAgICogQHBhcmFtIHhmb3JtCisgICAgICogICAgICAgICAgICB0aGUgYWZmaW5lIHRyYW5zZm9ybWF0aW9uIGZyb20gaW1hZ2UgdG8gdXNlciBzcGFjZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBkcmF3UmVuZGVyZWRJbWFnZShSZW5kZXJlZEltYWdlIGltZywgQWZmaW5lVHJhbnNmb3JtIHhmb3JtKTsKIAogICAgIC8qKgotICAgICAqIERyYXdzIHRoZSBzdHJpbmcgc3BlY2lmaWVkIGJ5IHRoZSBBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IuIAotICAgICAqIFRoZSBmaXJzdCBjaGFyYWN0ZXIncyBwb3NpdGlvbiBpcyBzcGVjaWZpZWQgYnkgdGhlIFgsIFkgcGFyYW1ldGVycy4gICAKKyAgICAgKiBEcmF3cyB0aGUgc3RyaW5nIHNwZWNpZmllZCBieSB0aGUgQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yLiBUaGUgZmlyc3QKKyAgICAgKiBjaGFyYWN0ZXIncyBwb3NpdGlvbiBpcyBzcGVjaWZpZWQgYnkgdGhlIFgsIFkgcGFyYW1ldGVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaXRlcmF0b3Igd2hvc2UgdGV4dCBpcyBkcmF3bi4KLSAgICAgKiBAcGFyYW0geCB0aGUgWCBwb3NpdGlvbiB3aGVyZSB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzIGRyYXduLiAKLSAgICAgKiBAcGFyYW0geSB0aGUgWSBwb3NpdGlvbiB3aGVyZSB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzIGRyYXduLgorICAgICAqIEBwYXJhbSBpdGVyYXRvcgorICAgICAqICAgICAgICAgICAgd2hvc2UgdGV4dCBpcyBkcmF3bi4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggcG9zaXRpb24gd2hlcmUgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyBkcmF3bi4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgcG9zaXRpb24gd2hlcmUgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyBkcmF3bi4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBkcmF3U3RyaW5nKEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciBpdGVyYXRvciwgZmxvYXQgeCwgZmxvYXQgeSk7CiAKICAgICAvKioKLSAgICAgKiBEcmF3cyB0aGUgc3RyaW5nIHNwZWNpZmllZCBieSB0aGUgQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yLiAKLSAgICAgKiBUaGUgZmlyc3QgY2hhcmFjdGVyJ3MgcG9zaXRpb24gaXMgc3BlY2lmaWVkIGJ5IHRoZSBYLCBZIHBhcmFtZXRlcnMuICAgCisgICAgICogRHJhd3MgdGhlIHN0cmluZyBzcGVjaWZpZWQgYnkgdGhlIEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvci4gVGhlIGZpcnN0CisgICAgICogY2hhcmFjdGVyJ3MgcG9zaXRpb24gaXMgc3BlY2lmaWVkIGJ5IHRoZSBYLCBZIHBhcmFtZXRlcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGl0ZXJhdG9yIHdob3NlIHRleHQgaXMgZHJhd24uCi0gICAgICogQHBhcmFtIHggdGhlIFggcG9zaXRpb24gd2hlcmUgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyBkcmF3bi4gCi0gICAgICogQHBhcmFtIHkgdGhlIFkgcG9zaXRpb24gd2hlcmUgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyBkcmF3bi4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaXRlcmF0b3IKKyAgICAgKiAgICAgICAgICAgIHdob3NlIHRleHQgaXMgZHJhd24uCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIHBvc2l0aW9uIHdoZXJlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgZHJhd24uCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIHBvc2l0aW9uIHdoZXJlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgZHJhd24uCiAgICAgICogQHNlZSBqYXZhLmF3dC5HcmFwaGljcyNkcmF3U3RyaW5nKEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciwgaW50LCBpbnQpCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZHJhd1N0cmluZyhBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IgaXRlcmF0b3IsIGludCB4LCBpbnQgeSk7CiAKICAgICAvKioKLSAgICAgKiBEcmF3cyB0aGUgU3RyaW5nIHdob3NlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcG9zaXRpb24gaXMgc3BlY2lmaWVkIAotICAgICAqIGJ5IHRoZSBwYXJhbWV0ZXJzIFgsIFkuICAgCisgICAgICogRHJhd3MgdGhlIFN0cmluZyB3aG9zZSB0aGUgZmlyc3QgY2hhcmFjdGVyIHBvc2l0aW9uIGlzIHNwZWNpZmllZCBieSB0aGUKKyAgICAgKiBwYXJhbWV0ZXJzIFgsIFkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHMgdGhlIFN0cmluZyB0byBiZSBkcmF3bi4KLSAgICAgKiBAcGFyYW0geCB0aGUgWCBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyLiAKLSAgICAgKiBAcGFyYW0geSB0aGUgWSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyLgorICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICB0aGUgU3RyaW5nIHRvIGJlIGRyYXduLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGRyYXdTdHJpbmcoU3RyaW5nIHMsIGZsb2F0IHgsIGZsb2F0IHkpOwogCiAgICAgLyoqCi0gICAgICogRHJhd3MgdGhlIFN0cmluZyB3aG9zZSB0aGUgZmlyc3QgY2hhcmFjdGVyIGNvb3JkaW5hdGVzIGFyZSBzcGVjaWZpZWQgCi0gICAgICogYnkgdGhlIHBhcmFtZXRlcnMgWCwgWS4gICAKKyAgICAgKiBEcmF3cyB0aGUgU3RyaW5nIHdob3NlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgY29vcmRpbmF0ZXMgYXJlIHNwZWNpZmllZCBieQorICAgICAqIHRoZSBwYXJhbWV0ZXJzIFgsIFkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHN0ciB0aGUgU3RyaW5nIHRvIGJlIGRyYXduLgotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNoYXJhY3Rlci4gCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyLgotICAgICAqIAorICAgICAqIEBwYXJhbSBzdHIKKyAgICAgKiAgICAgICAgICAgIHRoZSBTdHJpbmcgdG8gYmUgZHJhd24uCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNoYXJhY3Rlci4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyLgogICAgICAqIEBzZWUgamF2YS5hd3QuR3JhcGhpY3MjZHJhd1N0cmluZyhTdHJpbmcsIGludCwgaW50KQogICAgICAqLwogICAgIEBPdmVycmlkZQpAQCAtMTgzLDcgKzIxMSw4IEBACiAgICAgLyoqCiAgICAgICogRmlsbHMgdGhlIGludGVyaW9yIG9mIHRoZSBzcGVjaWZpZWQgU2hhcGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHMgdGhlIFNoYXBlIHRvIGJlIGZpbGxlZC4KKyAgICAgKiBAcGFyYW0gcworICAgICAqICAgICAgICAgICAgdGhlIFNoYXBlIHRvIGJlIGZpbGxlZC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBmaWxsKFNoYXBlIHMpOwogCkBAIC0yMDQsNyArMjMzLDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBkZXZpY2UgY29uZmlndXJhdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkZXZpY2UgY29uZmlndXJhdGlvbgorICAgICAqIEByZXR1cm4gdGhlIGRldmljZSBjb25maWd1cmF0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBHcmFwaGljc0NvbmZpZ3VyYXRpb24gZ2V0RGV2aWNlQ29uZmlndXJhdGlvbigpOwogCkBAIC0yMjMsMTcgKzI1MiwxNyBAQAogICAgIHB1YmxpYyBhYnN0cmFjdCBQYWludCBnZXRQYWludCgpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2Ygc2luZ2xlIHByZWZlcmVuY2UgZm9yIHNwZWNpZmllZCBrZXkuIAorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHNpbmdsZSBwcmVmZXJlbmNlIGZvciBzcGVjaWZpZWQga2V5LgogICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkgdGhlIHNwZWNpZmllZCBrZXkgb2YgdGhlIHJlbmRlcmluZyBoaW50LgotICAgICAqIAorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQga2V5IG9mIHRoZSByZW5kZXJpbmcgaGludC4KICAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiByZW5kZXJpbmcgaGludCBmb3Igc3BlY2lmaWVkIGtleS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldFJlbmRlcmluZ0hpbnQoUmVuZGVyaW5nSGludHMuS2V5IGtleSk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzZXQgb2YgdGhlIHJlbmRlcmluZyBwcmVmZXJlbmNlcyBhcyBhIGNvbGxlY3Rpb24gb2YgCi0gICAgICoga2V5L3ZhbHVlIHBhaXJzLgorICAgICAqIEdldHMgdGhlIHNldCBvZiB0aGUgcmVuZGVyaW5nIHByZWZlcmVuY2VzIGFzIGEgY29sbGVjdGlvbiBvZiBrZXkvdmFsdWUKKyAgICAgKiBwYWlycy4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBSZW5kZXJpbmdIaW50cyB3aGljaCBjb250YWlucyB0aGUgcmVuZGVyaW5nIHByZWZlcmVuY2VzLgogICAgICAqLwpAQCAtMjU0LDE3MiArMjgzLDE5NiBAQAogICAgIHB1YmxpYyBhYnN0cmFjdCBBZmZpbmVUcmFuc2Zvcm0gZ2V0VHJhbnNmb3JtKCk7CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIHdldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBTaGFwZSBpbnRlcnNlY3RzIHRoZSBzcGVjaWZpZWQgCi0gICAgICogUmVjdGFuZ2xlLiBJZiB0aGUgb25TdHJva2UgcGFyYW1ldGVyIGlzIHRydWUsIHRoaXMgbWV0aG9kIAotICAgICAqIGNoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIFNoYXBlIG91dGxpbmUgaW50ZXJzZWN0cyB0aGUgc3BlY2lmaWVkIAotICAgICAqIFJlY3RhbmdsZSwgb3RoZXJ3aXNlIHRoaXMgbWV0aG9kIGNoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIAotICAgICAqIFNoYXBlJ3MgaW50ZXJpb3IgaW50ZXJzZWN0cyB0aGUgc3BlY2lmaWVkIFJlY3RhbmdsZS4gICAKKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRoZSBzcGVjaWZpZWQgU2hhcGUgaW50ZXJzZWN0cyB0aGUgc3BlY2lmaWVkCisgICAgICogUmVjdGFuZ2xlLiBJZiB0aGUgb25TdHJva2UgcGFyYW1ldGVyIGlzIHRydWUsIHRoaXMgbWV0aG9kIGNoZWNrcyB3aGV0aGVyCisgICAgICogb3Igbm90IHRoZSBzcGVjaWZpZWQgU2hhcGUgb3V0bGluZSBpbnRlcnNlY3RzIHRoZSBzcGVjaWZpZWQgUmVjdGFuZ2xlLAorICAgICAqIG90aGVyd2lzZSB0aGlzIG1ldGhvZCBjaGVja3Mgd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBTaGFwZSdzCisgICAgICogaW50ZXJpb3IgaW50ZXJzZWN0cyB0aGUgc3BlY2lmaWVkIFJlY3RhbmdsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVjdCB0aGUgc3BlY2lmaWVkIFJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gcyB0aGUgU2hhcGUgdG8gY2hlY2sgZm9yIGludGVyc2VjdGlvbi4KLSAgICAgKiBAcGFyYW0gb25TdHJva2UgdGhlIHBhcmFtZXRlciBkZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRoaXMgbWV0aG9kIGNoZWNrcwotICAgICAqIGZvciBpbnRlcnNlY3Rpb24gb2YgdGhlIFNoYXBlIG91dGxpbmUgb3Igb2YgdGhlIFNoYXBlIGludGVyaW9yIHdpdGggCi0gICAgICogdGhlIFJlY3RhbmdsZS4gCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGVyZSBpcyBhIGhpdCwgb3RoZXJ3aXNlIGZhbHNlLgorICAgICAqIEBwYXJhbSByZWN0CisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIFJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gcworICAgICAqICAgICAgICAgICAgdGhlIFNoYXBlIHRvIGNoZWNrIGZvciBpbnRlcnNlY3Rpb24uCisgICAgICogQHBhcmFtIG9uU3Ryb2tlCisgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIGRldGVybWluZXMgd2hldGhlciBvciBub3QgdGhpcyBtZXRob2QgY2hlY2tzIGZvcgorICAgICAqICAgICAgICAgICAgaW50ZXJzZWN0aW9uIG9mIHRoZSBTaGFwZSBvdXRsaW5lIG9yIG9mIHRoZSBTaGFwZSBpbnRlcmlvcgorICAgICAqICAgICAgICAgICAgd2l0aCB0aGUgUmVjdGFuZ2xlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlcmUgaXMgYSBoaXQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoaXQoUmVjdGFuZ2xlIHJlY3QsIFNoYXBlIHMsIGJvb2xlYW4gb25TdHJva2UpOwogCiAgICAgLyoqCiAgICAgICogUGVyZm9ybXMgYSByb3RhdGlvbiB0cmFuc2Zvcm0gcmVsYXRpdmUgdG8gY3VycmVudCBHcmFwaGljczJEIFRyYW5zZm9ybS4KLSAgICAgKiBUaGUgY29vcmRpbmF0ZSBzeXN0ZW0gaXMgcm90YXRlZCBieSB0aGUgc3BlY2lmaWVkIGFuZ2xlIGluIHJhZGlhbnMgcmVsYXRpdmUgdG8gCi0gICAgICogY3VycmVudCBvcmlnaW4uCisgICAgICogVGhlIGNvb3JkaW5hdGUgc3lzdGVtIGlzIHJvdGF0ZWQgYnkgdGhlIHNwZWNpZmllZCBhbmdsZSBpbiByYWRpYW5zCisgICAgICogcmVsYXRpdmUgdG8gY3VycmVudCBvcmlnaW4uCiAgICAgICogCi0gICAgICogQHBhcmFtIHRoZXRhIHRoZSBhbmdsZSBvZiByb3RhdGlvbiBpbiByYWRpYW5zLgorICAgICAqIEBwYXJhbSB0aGV0YQorICAgICAqICAgICAgICAgICAgdGhlIGFuZ2xlIG9mIHJvdGF0aW9uIGluIHJhZGlhbnMuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcm90YXRlKGRvdWJsZSB0aGV0YSk7CiAKICAgICAvKioKLSAgICAgKiBQZXJmb3JtcyBhIHRyYW5zbGF0ZWQgcm90YXRpb24gdHJhbnNmb3JtIHJlbGF0aXZlIHRvIGN1cnJlbnQgR3JhcGhpY3MyRCAKLSAgICAgKiBUcmFuc2Zvcm0uIFRoZSBjb29yZGluYXRlIHN5c3RlbSBpcyByb3RhdGVkIGJ5IHRoZSBzcGVjaWZpZWQgYW5nbGUgaW4gcmFkaWFucyAKLSAgICAgKiByZWxhdGl2ZSB0byBjdXJyZW50IG9yaWdpbiBhbmQgdGhlbiBtb3ZlZCB0byBwb2ludCAoeCwgeSkuCisgICAgICogUGVyZm9ybXMgYSB0cmFuc2xhdGVkIHJvdGF0aW9uIHRyYW5zZm9ybSByZWxhdGl2ZSB0byBjdXJyZW50IEdyYXBoaWNzMkQKKyAgICAgKiBUcmFuc2Zvcm0uIFRoZSBjb29yZGluYXRlIHN5c3RlbSBpcyByb3RhdGVkIGJ5IHRoZSBzcGVjaWZpZWQgYW5nbGUgaW4KKyAgICAgKiByYWRpYW5zIHJlbGF0aXZlIHRvIGN1cnJlbnQgb3JpZ2luIGFuZCB0aGVuIG1vdmVkIHRvIHBvaW50ICh4LCB5KS4gSXMKKyAgICAgKiB0aGlzIHJpZ2h0PwogICAgICAqIAotICAgICAqIElzIHRoaXMgcmlnaHQ/Ci0gICAgICogCi0gICAgICogQHBhcmFtIHRoZXRhIHRoZSBhbmdsZSBvZiByb3RhdGlvbiBpbiByYWRpYW5zLgotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZS4gCisgICAgICogQHBhcmFtIHRoZXRhCisgICAgICogICAgICAgICAgICB0aGUgYW5nbGUgb2Ygcm90YXRpb24gaW4gcmFkaWFucy4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCByb3RhdGUoZG91YmxlIHRoZXRhLCBkb3VibGUgeCwgZG91YmxlIHkpOwogCiAgICAgLyoqCi0gICAgICogUGVyZm9ybXMgYSBsaW5lYXIgc2NhbGUgdHJhbnNmb3JtIHJlbGF0aXZlIHRvIGN1cnJlbnQgR3JhcGhpY3MyRCBUcmFuc2Zvcm0uCi0gICAgICogVGhlIGNvb3JkaW5hdGUgc3lzdGVtIGlzIHJlc2NhbGVkIHZlcnRpY2FsbHkgYW5kIGhvcml6b250YWxseSAKKyAgICAgKiBQZXJmb3JtcyBhIGxpbmVhciBzY2FsZSB0cmFuc2Zvcm0gcmVsYXRpdmUgdG8gY3VycmVudCBHcmFwaGljczJECisgICAgICogVHJhbnNmb3JtLiBUaGUgY29vcmRpbmF0ZSBzeXN0ZW0gaXMgcmVzY2FsZWQgdmVydGljYWxseSBhbmQgaG9yaXpvbnRhbGx5CiAgICAgICogYnkgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzeCB0aGUgc2NhbGluZyBmYWN0b3IgYnkgd2hpY2ggdGhlIFggY29vcmRpbmF0ZSBpcyBtdWx0aXBsaWVkLiAgIAotICAgICAqIEBwYXJhbSBzeSB0aGUgc2NhbGluZyBmYWN0b3IgYnkgd2hpY2ggdGhlIFkgY29vcmRpbmF0ZSBpcyBtdWx0aXBsaWVkLiAgIAorICAgICAqIEBwYXJhbSBzeAorICAgICAqICAgICAgICAgICAgdGhlIHNjYWxpbmcgZmFjdG9yIGJ5IHdoaWNoIHRoZSBYIGNvb3JkaW5hdGUgaXMgbXVsdGlwbGllZC4KKyAgICAgKiBAcGFyYW0gc3kKKyAgICAgKiAgICAgICAgICAgIHRoZSBzY2FsaW5nIGZhY3RvciBieSB3aGljaCB0aGUgWSBjb29yZGluYXRlIGlzIG11bHRpcGxpZWQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2NhbGUoZG91YmxlIHN4LCBkb3VibGUgc3kpOwogCiAgICAgLyoqCi0gICAgICogU2V0cyBhIG5ldyBiYWNrZ3JvdW5kIGNvbG9yIGZvciBjbGVhcmluZyByZWN0YW5ndWxhciBhcmVhcy4gCi0gICAgICogVGhlIGNsZWFyUmVjdCBtZXRob2QgdXNlcyB0aGUgY3VycmVudCBiYWNrZ3JvdW5kIGNvbG9yLiAKKyAgICAgKiBTZXRzIGEgbmV3IGJhY2tncm91bmQgY29sb3IgZm9yIGNsZWFyaW5nIHJlY3Rhbmd1bGFyIGFyZWFzLiBUaGUgY2xlYXJSZWN0CisgICAgICogbWV0aG9kIHVzZXMgdGhlIGN1cnJlbnQgYmFja2dyb3VuZCBjb2xvci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sb3IgdGhlIG5ldyBiYWNrZ3JvdW5kIGNvbG9yLgorICAgICAqIEBwYXJhbSBjb2xvcgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBiYWNrZ3JvdW5kIGNvbG9yLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEJhY2tncm91bmQoQ29sb3IgY29sb3IpOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCBjb21wb3NpdGUgZm9yIEdyYXBoaWNzMkQuIAorICAgICAqIFNldHMgdGhlIGN1cnJlbnQgY29tcG9zaXRlIGZvciBHcmFwaGljczJELgogICAgICAqIAotICAgICAqIEBwYXJhbSBjb21wIHRoZSBDb21wb3NpdGUgb2JqZWN0LgorICAgICAqIEBwYXJhbSBjb21wCisgICAgICogICAgICAgICAgICB0aGUgQ29tcG9zaXRlIG9iamVjdC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDb21wb3NpdGUoQ29tcG9zaXRlIGNvbXApOwogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgcGFpbnQgZm9yIEdyYXBoaWNzMkQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHBhaW50IHRoZSBQYWludCBvYmplY3QuCisgICAgICogQHBhcmFtIHBhaW50CisgICAgICogICAgICAgICAgICB0aGUgUGFpbnQgb2JqZWN0LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFBhaW50KFBhaW50IHBhaW50KTsKIAogICAgIC8qKgogICAgICAqIFNldHMgYSBrZXktdmFsdWUgcGFpciBpbiB0aGUgY3VycmVudCBSZW5kZXJpbmdIaW50cyBtYXAuCiAgICAgICogCi0gICAgICogQHBhcmFtIGtleSB0aGUga2V5IG9mIHRoZSByZW5kZXJpbmcgaGludCB0byBzZXQuCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBzZXQgZm9yIHRoZSByZW5kZXJpbmcgaGludC4KKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUga2V5IG9mIHRoZSByZW5kZXJpbmcgaGludCB0byBzZXQuCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gc2V0IGZvciB0aGUgcmVuZGVyaW5nIGhpbnQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UmVuZGVyaW5nSGludChSZW5kZXJpbmdIaW50cy5LZXkga2V5LCBPYmplY3QgdmFsdWUpOwogCiAgICAgLyoqCi0gICAgICogUmVwbGFjZXMgdGhlIGN1cnJlbnQgcmVuZGVyaW5nIGhpbnRzIHdpdGggdGhlIHNwZWNpZmllZCByZW5kZXJpbmcgcHJlZmVyZW5jZXMuCisgICAgICogUmVwbGFjZXMgdGhlIGN1cnJlbnQgcmVuZGVyaW5nIGhpbnRzIHdpdGggdGhlIHNwZWNpZmllZCByZW5kZXJpbmcKKyAgICAgKiBwcmVmZXJlbmNlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaGludHMgdGhlIG5ldyBNYXAgb2YgcmVuZGVyaW5nIGhpbnRzLgorICAgICAqIEBwYXJhbSBoaW50cworICAgICAqICAgICAgICAgICAgdGhlIG5ldyBNYXAgb2YgcmVuZGVyaW5nIGhpbnRzLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFJlbmRlcmluZ0hpbnRzKE1hcDw/LCA/PiBoaW50cyk7CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBzdHJva2UgZm9yIHRoZSBHcmFwaGljczJELgogICAgICAqIAotICAgICAqIEBwYXJhbSBzIHRoZSBTdHJva2Ugb2JqZWN0LgorICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICB0aGUgU3Ryb2tlIG9iamVjdC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTdHJva2UoU3Ryb2tlIHMpOwogCiAgICAgLyoqCi0gICAgICogT3ZlcndyaXRlIHRoZSBjdXJyZW50IFRyYW5zZm9ybSBvZiB0aGUgR3JhcGhpY3MyRC4gVGhlIHNwZWNpZmllZCBUcmFuc2Zvcm0gCi0gICAgICogc2hvdWxkIGJlIHJlY2VpdmVkIGZyb20gdGhlIGdldFRyYW5zZm9ybSgpIG1ldGhvZCBhbmQgc2hvdWxkIGJlIHVzZWQgCi0gICAgICogb25seSBmb3IgcmVzdG9yaW5nIHRoZSBvcmlnaW5hbCBHcmFwaGljczJEIHRyYW5zZm9ybSBhZnRlciBjYWxsaW5nCi0gICAgICogZHJhdyBvciBmaWxsIG1ldGhvZHMuIAorICAgICAqIE92ZXJ3cml0ZSB0aGUgY3VycmVudCBUcmFuc2Zvcm0gb2YgdGhlIEdyYXBoaWNzMkQuIFRoZSBzcGVjaWZpZWQKKyAgICAgKiBUcmFuc2Zvcm0gc2hvdWxkIGJlIHJlY2VpdmVkIGZyb20gdGhlIGdldFRyYW5zZm9ybSgpIG1ldGhvZCBhbmQgc2hvdWxkIGJlCisgICAgICogdXNlZCBvbmx5IGZvciByZXN0b3JpbmcgdGhlIG9yaWdpbmFsIEdyYXBoaWNzMkQgdHJhbnNmb3JtIGFmdGVyIGNhbGxpbmcKKyAgICAgKiBkcmF3IG9yIGZpbGwgbWV0aG9kcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gVHggdGhlIHNwZWNpZmllZCBUcmFuc2Zvcm0uCisgICAgICogQHBhcmFtIFR4CisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIFRyYW5zZm9ybS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUcmFuc2Zvcm0oQWZmaW5lVHJhbnNmb3JtIFR4KTsKIAogICAgIC8qKgotICAgICAqIFBlcmZvcm1zIGEgc2hlYXIgdHJhbnNmb3JtIHJlbGF0aXZlIHRvIGN1cnJlbnQgR3JhcGhpY3MyRCBUcmFuc2Zvcm0uCi0gICAgICogVGhlIGNvb3JkaW5hdGUgc3lzdGVtIGlzIHNoaWZ0ZWQgYnkgdGhlIHNwZWNpZmllZCBtdWx0aXBsaWVycyByZWxhdGl2ZSB0byAKKyAgICAgKiBQZXJmb3JtcyBhIHNoZWFyIHRyYW5zZm9ybSByZWxhdGl2ZSB0byBjdXJyZW50IEdyYXBoaWNzMkQgVHJhbnNmb3JtLiBUaGUKKyAgICAgKiBjb29yZGluYXRlIHN5c3RlbSBpcyBzaGlmdGVkIGJ5IHRoZSBzcGVjaWZpZWQgbXVsdGlwbGllcnMgcmVsYXRpdmUgdG8KICAgICAgKiBjdXJyZW50IHBvc2l0aW9uLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzaHggdGhlIG11bHRpcGxpZXIgYnkgd2hpY2ggdGhlIFggY29vcmRpbmF0ZXMgc2hpZnQgcG9zaXRpb24KLSAgICAgKiBhbG9uZyBYIGF4aXMgYXMgYSBmdW5jdGlvbiBvZiBZIGNvb3JkaW5hdGVzLiAgIAotICAgICAqIEBwYXJhbSBzaHkgdGhlIG11bHRpcGxpZXIgYnkgd2hpY2ggdGhlIFkgY29vcmRpbmF0ZXMgc2hpZnQgcG9zaXRpb24KLSAgICAgKiBhbG9uZyBZIGF4aXMgYXMgYSBmdW5jdGlvbiBvZiBYIGNvb3JkaW5hdGVzLiAgIAorICAgICAqIEBwYXJhbSBzaHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBtdWx0aXBsaWVyIGJ5IHdoaWNoIHRoZSBYIGNvb3JkaW5hdGVzIHNoaWZ0IHBvc2l0aW9uIGFsb25nCisgICAgICogICAgICAgICAgICBYIGF4aXMgYXMgYSBmdW5jdGlvbiBvZiBZIGNvb3JkaW5hdGVzLgorICAgICAqIEBwYXJhbSBzaHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBtdWx0aXBsaWVyIGJ5IHdoaWNoIHRoZSBZIGNvb3JkaW5hdGVzIHNoaWZ0IHBvc2l0aW9uIGFsb25nCisgICAgICogICAgICAgICAgICBZIGF4aXMgYXMgYSBmdW5jdGlvbiBvZiBYIGNvb3JkaW5hdGVzLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNoZWFyKGRvdWJsZSBzaHgsIGRvdWJsZSBzaHkpOwogCiAgICAgLyoqCi0gICAgICogQ29uY2F0ZW5hdGVzIHRoZSBBZmZpbmVUcmFuc2Zvcm0gb2JqZWN0IHdpdGggY3VycmVudCBUcmFuc2Zvcm0gCi0gICAgICogb2YgdGhpcyBHcmFwaGljczJELiBUaGUgdHJhbnNmb3JtcyBhcmUgYXBwbGllZCBpbiByZXZlcnNlIG9yZGVyCi0gICAgICogd2l0aCB0aGUgbGFzdCBzcGVjaWZpZWQgdHJhbnNmb3JtIGFwcGxpZWQgZmlyc3QgYW5kIHRoZSBuZXh0Ci0gICAgICogdHJhbnNmb3JtYXRpb24gYXBwbGllZCB0byB0aGUgcmVzdWx0IG9mIHByZXZpb3VzIHRyYW5zZm9ybWF0aW9uLiAKLSAgICAgKiBNb3JlIHByZWNpc2VseSwgaWYgQ3ggaXMgdGhlIGN1cnJlbnQgR3JhcGhpY3MyRCB0cmFuc2Zvcm0sIHRoZSAKLSAgICAgKiB0cmFuc2Zvcm0gbWV0aG9kJ3MgcmVzdWx0IHdpdGggVHggYXMgdGhlIHBhcmFtZXRlcgotICAgICAqIGlzIHRoZSB0cmFuc2Zvcm1hdGlvbiBSeCwgd2hlcmUgUngocCkgPSBDeChUeChwKSksIGZvciBwIC0gYSBwb2ludAotICAgICAqIGluIGN1cnJlbnQgY29vcmRpbmF0ZSBzeXN0ZW0uIFJ4IGJlY29tZXMgdGhlIGN1cnJlbnQgVHJhbnNmb3JtICAgCisgICAgICogQ29uY2F0ZW5hdGVzIHRoZSBBZmZpbmVUcmFuc2Zvcm0gb2JqZWN0IHdpdGggY3VycmVudCBUcmFuc2Zvcm0gb2YgdGhpcworICAgICAqIEdyYXBoaWNzMkQuIFRoZSB0cmFuc2Zvcm1zIGFyZSBhcHBsaWVkIGluIHJldmVyc2Ugb3JkZXIgd2l0aCB0aGUgbGFzdAorICAgICAqIHNwZWNpZmllZCB0cmFuc2Zvcm0gYXBwbGllZCBmaXJzdCBhbmQgdGhlIG5leHQgdHJhbnNmb3JtYXRpb24gYXBwbGllZCB0bworICAgICAqIHRoZSByZXN1bHQgb2YgcHJldmlvdXMgdHJhbnNmb3JtYXRpb24uIE1vcmUgcHJlY2lzZWx5LCBpZiBDeCBpcyB0aGUKKyAgICAgKiBjdXJyZW50IEdyYXBoaWNzMkQgdHJhbnNmb3JtLCB0aGUgdHJhbnNmb3JtIG1ldGhvZCdzIHJlc3VsdCB3aXRoIFR4IGFzCisgICAgICogdGhlIHBhcmFtZXRlciBpcyB0aGUgdHJhbnNmb3JtYXRpb24gUngsIHdoZXJlIFJ4KHApID0gQ3goVHgocCkpLCBmb3IgcCAtCisgICAgICogYSBwb2ludCBpbiBjdXJyZW50IGNvb3JkaW5hdGUgc3lzdGVtLiBSeCBiZWNvbWVzIHRoZSBjdXJyZW50IFRyYW5zZm9ybQogICAgICAqIGZvciB0aGlzIEdyYXBoaWNzMkQuCiAgICAgICogCi0gICAgICogQHBhcmFtIFR4IHRoZSBBZmZpbmVUcmFuc2Zvcm0gb2JqZWN0IHRvIGJlIGNvbmNhdGVuYXRlZCB3aXRoIAotICAgICAqIGN1cnJlbnQgVHJhbnNmb3JtLgorICAgICAqIEBwYXJhbSBUeAorICAgICAqICAgICAgICAgICAgdGhlIEFmZmluZVRyYW5zZm9ybSBvYmplY3QgdG8gYmUgY29uY2F0ZW5hdGVkIHdpdGggY3VycmVudAorICAgICAqICAgICAgICAgICAgVHJhbnNmb3JtLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHRyYW5zZm9ybShBZmZpbmVUcmFuc2Zvcm0gVHgpOwogCiAgICAgLyoqCiAgICAgICogUGVyZm9ybXMgYSB0cmFuc2xhdGUgdHJhbnNmb3JtIHJlbGF0aXZlIHRvIGN1cnJlbnQgR3JhcGhpY3MyRCBUcmFuc2Zvcm0uCi0gICAgICogVGhlIGNvb3JkaW5hdGUgc3lzdGVtIGlzIG1vdmVkIGJ5IHRoZSBzcGVjaWZpZWQgZGlzdGFuY2UgcmVsYXRpdmUgCi0gICAgICogdG8gY3VycmVudCBwb3NpdGlvbi4KKyAgICAgKiBUaGUgY29vcmRpbmF0ZSBzeXN0ZW0gaXMgbW92ZWQgYnkgdGhlIHNwZWNpZmllZCBkaXN0YW5jZSByZWxhdGl2ZSB0bworICAgICAqIGN1cnJlbnQgcG9zaXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIHR4IHRoZSB0cmFuc2xhdGlvbiBkaXN0YW5jZSBhbG9uZyB0aGUgWCBheGlzLgotICAgICAqIEBwYXJhbSB0eSB0aGUgdHJhbnNsYXRpb24gZGlzdGFuY2UgYWxvbmcgdGhlIFkgYXhpcy4KKyAgICAgKiBAcGFyYW0gdHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB0cmFuc2xhdGlvbiBkaXN0YW5jZSBhbG9uZyB0aGUgWCBheGlzLgorICAgICAqIEBwYXJhbSB0eQorICAgICAqICAgICAgICAgICAgdGhlIHRyYW5zbGF0aW9uIGRpc3RhbmNlIGFsb25nIHRoZSBZIGF4aXMuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdHJhbnNsYXRlKGRvdWJsZSB0eCwgZG91YmxlIHR5KTsKIAogICAgIC8qKgotICAgICAqIE1vdmVzIHRoZSBvcmlnaW4gR3JhcGhpY3MyRCBUcmFuc2Zvcm0gdG8gdGhlIHBvaW50IHdpdGggeCwgeQotICAgICAqIGNvb3JkaW5hdGVzIGluIGN1cnJlbnQgY29vcmRpbmF0ZSBzeXN0ZW0uIFRoZSBuZXcgb3JpZ2luIG9mIGNvb3JkaW5hdGUgCi0gICAgICogc3lzdGVtIGlzIG1vdmVkIHRvIHRoZSAoeCwgeSkgcG9pbnQgYWNjb3JkaW5nbHkuIEFsbCByZW5kZXJpbmcgYW5kIAotICAgICAqIHRyYW5zZm9ybSBvcGVyYXRpb25zIGFyZSBwZXJmb3JtZWQgcmVsYXRpdmUgdG8gdGhpcyBuZXcgb3JpZ2luLgorICAgICAqIE1vdmVzIHRoZSBvcmlnaW4gR3JhcGhpY3MyRCBUcmFuc2Zvcm0gdG8gdGhlIHBvaW50IHdpdGggeCwgeSBjb29yZGluYXRlcworICAgICAqIGluIGN1cnJlbnQgY29vcmRpbmF0ZSBzeXN0ZW0uIFRoZSBuZXcgb3JpZ2luIG9mIGNvb3JkaW5hdGUgc3lzdGVtIGlzCisgICAgICogbW92ZWQgdG8gdGhlICh4LCB5KSBwb2ludCBhY2NvcmRpbmdseS4gQWxsIHJlbmRlcmluZyBhbmQgdHJhbnNmb3JtCisgICAgICogb3BlcmF0aW9ucyBhcmUgcGVyZm9ybWVkIHJlbGF0aXZlIHRvIHRoaXMgbmV3IG9yaWdpbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUuIAotICAgICAqIAorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlLgogICAgICAqIEBzZWUgamF2YS5hd3QuR3JhcGhpY3MjdHJhbnNsYXRlKGludCwgaW50KQogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHRyYW5zbGF0ZShpbnQgeCwgaW50IHkpOwogCiAgICAgLyoqCi0gICAgICogRmlsbHMgYSAzRCByZWN0YW5nbGUgd2l0aCB0aGUgY3VycmVudCBjb2xvci4gCi0gICAgICogVGhlIHJlY3RhbmdsZSBpcyBzcGVjaWZpZWQgYnkgaXRzIHdpZHRoLCBoZWlnaHQsIGFuZCB0b3AgbGVmdCBjb3JuZXIgCi0gICAgICogY29vcmRpbmF0ZXMuCisgICAgICogRmlsbHMgYSAzRCByZWN0YW5nbGUgd2l0aCB0aGUgY3VycmVudCBjb2xvci4gVGhlIHJlY3RhbmdsZSBpcyBzcGVjaWZpZWQKKyAgICAgKiBieSBpdHMgd2lkdGgsIGhlaWdodCwgYW5kIHRvcCBsZWZ0IGNvcm5lciBjb29yZGluYXRlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB0b3AgbGVmdCBjb3JuZXIuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdG9wIGxlZnQgY29ybmVyLgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIHJhaXNlZCBhIGJvb2xlYW4gdmFsdWUgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHJlY3RhbmdsZSAKLSAgICAgKiBpcyBkcmF3biBhcyByYWlzZWQgb3IgaW5kZW50ZWQuCi0gICAgICogCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHRvcCBsZWZ0IGNvcm5lci4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdG9wIGxlZnQgY29ybmVyLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gcmFpc2VkCisgICAgICogICAgICAgICAgICBhIGJvb2xlYW4gdmFsdWUgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHJlY3RhbmdsZSBpcyBkcmF3bgorICAgICAqICAgICAgICAgICAgYXMgcmFpc2VkIG9yIGluZGVudGVkLgogICAgICAqIEBzZWUgamF2YS5hd3QuR3JhcGhpY3MjZmlsbDNEUmVjdChpbnQsIGludCwgaW50LCBpbnQsIGJvb2xlYW4pCiAgICAgICovCiAgICAgQE92ZXJyaWRlCkBAIC00MzMsMTUgKzQ4NiwxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIERyYXdzIHRoZSBoaWdsaWdodGVkIG91dGxpbmUgb2YgYSByZWN0YW5nbGUuCisgICAgICogRHJhd3MgdGhlIGhpZ2hsaWdodGVkIG91dGxpbmUgb2YgYSByZWN0YW5nbGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdG9wIGxlZnQgY29ybmVyLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHRvcCBsZWZ0IGNvcm5lci4KLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSByYWlzZWQgYSBib29sZWFuIHZhbHVlIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSByZWN0YW5nbGUgCi0gICAgICogaXMgZHJhd24gYXMgcmFpc2VkIG9yIGluZGVudGVkLgotICAgICAqICAgICAgIAorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB0b3AgbGVmdCBjb3JuZXIuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHRvcCBsZWZ0IGNvcm5lci4KKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHJhaXNlZAorICAgICAqICAgICAgICAgICAgYSBib29sZWFuIHZhbHVlIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSByZWN0YW5nbGUgaXMgZHJhd24KKyAgICAgKiAgICAgICAgICAgIGFzIHJhaXNlZCBvciBpbmRlbnRlZC4KICAgICAgKiBAc2VlIGphdmEuYXd0LkdyYXBoaWNzI2RyYXczRFJlY3QoaW50LCBpbnQsIGludCwgaW50LCBib29sZWFuKQogICAgICAqLwogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L0dyYXBoaWNzQ29uZmlndXJhdGlvbi5qYXZhIGIvYXd0L2phdmEvYXd0L0dyYXBoaWNzQ29uZmlndXJhdGlvbi5qYXZhCmluZGV4IDhiZWMyNTMuLmQ1OWU4OTYgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9HcmFwaGljc0NvbmZpZ3VyYXRpb24uamF2YQorKysgYi9hd3QvamF2YS9hd3QvR3JhcGhpY3NDb25maWd1cmF0aW9uLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgQWxleGV5IEEuIFBldHJlbmtvCiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dDsKIAogaW1wb3J0IGphdmEuYXd0Lmdlb20uQWZmaW5lVHJhbnNmb3JtOwpAQCAtMzAsNzAgKzMxLDc2IEBACiAvKioKICAqIFRoZSBHcmFwaGljc0NvbmZpZ3VyYXRpb24gY2xhc3MgY29udGFpbnMgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiBncmFwaGljcwogICogZGV2aWNlcyBzdWNoIGFzIGEgcHJpbnRlciBvciBtb25pdG9yLCBhbmQgcmVwcmVzZW50cyBkZXZpY2UncyBjYXBhYmlsaXRpZXMKLSAqIGFuZCBtb2Rlcy4gTWFueSBHcmFwaGljc0NvbmZpZ3VyYXRpb24gb2JqZWN0cyBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoCi0gKiBzaW5nbGUgZ3JhcGhpY3MgZGV2aWNlLgorICogYW5kIG1vZGVzLiBNYW55IEdyYXBoaWNzQ29uZmlndXJhdGlvbiBvYmplY3RzIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggc2luZ2xlCisgKiBncmFwaGljcyBkZXZpY2UuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgR3JhcGhpY3NDb25maWd1cmF0aW9uIHsKLSAgIAotICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgY291bGQgbm90IGJlIHVzZWQgZGlyZWN0bHkgYW5kIHNob3VsZCBiZSBvYnRhaW5lZCBpbiAKLSAgICAgKiBleHRlbmRlZCBjbGFzc2VzLiAKLSAgICAqLwogCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgY291bGQgbm90IGJlIHVzZWQgZGlyZWN0bHkgYW5kIHNob3VsZCBiZSBvYnRhaW5lZCBpbiBleHRlbmRlZAorICAgICAqIGNsYXNzZXMuCisgICAgICovCiAgICAgcHJvdGVjdGVkIEdyYXBoaWNzQ29uZmlndXJhdGlvbigpIHsKICAgICB9CiAKLQotICAgLyoqCi0gICAgKiBDcmVhdGVzIEJ1ZmZlcmVkSW1hZ2UgaW1hZ2Ugb2JqZWN0IHdpdGggYSBkYXRhIGxheW91dCBhbmQgY29sb3IgbW9kZWwgCi0gICAgKiBjb21wYXRpYmxlIHdpdGggdGhpcyBHcmFwaGljc0NvbmZpZ3VyYXRpb24gd2l0aCBzcGVjaWZpZWQgd2lkdGggCi0gICAgKiBhbmQgaGVpZ2h0IHBhcmFtZXRlcnMuCi0gICAgKiAKLSAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgQnVmZmVyZWRJbWFnZS4KLSAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiBCdWZmZXJlZEltYWdlLgotICAgICogCi0gICAgKiBAcmV0dXJuIHRoZSBCdWZmZXJlZEltYWdlIG9iamVjdCB3aXRoIHNwZWNpZmllZCB3aWR0aCBhbmQgaGVpZ2h0IAotICAgICogcGFyYW1ldGVycy4KLSAgICAqLworICAgIC8qKgorICAgICAqIENyZWF0ZXMgQnVmZmVyZWRJbWFnZSBpbWFnZSBvYmplY3Qgd2l0aCBhIGRhdGEgbGF5b3V0IGFuZCBjb2xvciBtb2RlbAorICAgICAqIGNvbXBhdGlibGUgd2l0aCB0aGlzIEdyYXBoaWNzQ29uZmlndXJhdGlvbiB3aXRoIHNwZWNpZmllZCB3aWR0aCBhbmQKKyAgICAgKiBoZWlnaHQgcGFyYW1ldGVycy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiBCdWZmZXJlZEltYWdlLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgQnVmZmVyZWRJbWFnZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBCdWZmZXJlZEltYWdlIG9iamVjdCB3aXRoIHNwZWNpZmllZCB3aWR0aCBhbmQgaGVpZ2h0CisgICAgICogICAgICAgICBwYXJhbWV0ZXJzLgorICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBCdWZmZXJlZEltYWdlIGNyZWF0ZUNvbXBhdGlibGVJbWFnZShpbnQgd2lkdGgsIGludCBoZWlnaHQpOwogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyBhIEJ1ZmZlcmVkSW1hZ2UgdGhhdCBoYXMgdGhlIHNwZWNpZmllZCB3aWR0aCwgaGVpZ2h0LAotICAgICAqIHRyYW5zcGFyZW5jeSBhbmQgaGFzIGEgZGF0YSBsYXlvdXQgYW5kIGNvbG9yIG1vZGVsIGNvbXBhdGlibGUgd2l0aCB0aGlzIAotICAgICAqIEdyYXBoaWNzQ29uZmlndXJhdGlvbi4gCisgICAgICogdHJhbnNwYXJlbmN5IGFuZCBoYXMgYSBkYXRhIGxheW91dCBhbmQgY29sb3IgbW9kZWwgY29tcGF0aWJsZSB3aXRoIHRoaXMKKyAgICAgKiBHcmFwaGljc0NvbmZpZ3VyYXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiBpbWFnZS4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgIG9mIGltYWdlLgotICAgICAqIEBwYXJhbSB0cmFuc3BhcmVuY3kgdGhlIHRyYW5zcGFyZW5jeSBtb2RlLgotICAgICAqIAorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIGltYWdlLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgaW1hZ2UuCisgICAgICogQHBhcmFtIHRyYW5zcGFyZW5jeQorICAgICAqICAgICAgICAgICAgdGhlIHRyYW5zcGFyZW5jeSBtb2RlLgogICAgICAqIEByZXR1cm4gdGhlIEJ1ZmZlcmVkSW1hZ2Ugb2JqZWN0LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBCdWZmZXJlZEltYWdlIGNyZWF0ZUNvbXBhdGlibGVJbWFnZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCB0cmFuc3BhcmVuY3kpOwogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIFZvbGF0aWxlSW1hZ2UgdGhhdCBoYXMgdGhlIHNwZWNpZmllZCB3aWR0aCBhbmQgaGVpZ2h0IAotICAgICAqIGFuZCBoYXMgYSBkYXRhIGxheW91dCBhbmQgY29sb3IgbW9kZWwgY29tcGF0aWJsZSB3aXRoIHRoaXMgCi0gICAgICogR3JhcGhpY3NDb25maWd1cmF0aW9uLiAKKyAgICAgKiBDcmVhdGVzIGEgVm9sYXRpbGVJbWFnZSB0aGF0IGhhcyB0aGUgc3BlY2lmaWVkIHdpZHRoIGFuZCBoZWlnaHQgYW5kIGhhcyBhCisgICAgICogZGF0YSBsYXlvdXQgYW5kIGNvbG9yIG1vZGVsIGNvbXBhdGlibGUgd2l0aCB0aGlzIEdyYXBoaWNzQ29uZmlndXJhdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIGltYWdlLgotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiBpbWFnZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiBpbWFnZS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIGltYWdlLgogICAgICAqIEByZXR1cm4gdGhlIFZvbGF0aWxlSW1hZ2Ugb2JqZWN0LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBWb2xhdGlsZUltYWdlIGNyZWF0ZUNvbXBhdGlibGVWb2xhdGlsZUltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCk7CiAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIGEgVm9sYXRpbGVJbWFnZSB0aGF0IHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQgd2lkdGgsIGhlaWdodCwKLSAgICAgKiB0cmFuc3BhcmVuY3kgYW5kIGhhcyBhIGRhdGEgbGF5b3V0IGFuZCBjb2xvciBtb2RlbCBjb21wYXRpYmxlIHdpdGggdGhpcyAKLSAgICAgKiBHcmFwaGljc0NvbmZpZ3VyYXRpb24uIAorICAgICAqIHRyYW5zcGFyZW5jeSBhbmQgaGFzIGEgZGF0YSBsYXlvdXQgYW5kIGNvbG9yIG1vZGVsIGNvbXBhdGlibGUgd2l0aCB0aGlzCisgICAgICogR3JhcGhpY3NDb25maWd1cmF0aW9uLgogICAgICAqIAotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgaW1hZ2UuCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIGltYWdlLgotICAgICAqIEBwYXJhbSB0cmFuc3BhcmVuY3kgdGhlIHRyYW5zcGFyZW5jeSBtb2RlLgotICAgICAqIAorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIGltYWdlLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgaW1hZ2UuCisgICAgICogQHBhcmFtIHRyYW5zcGFyZW5jeQorICAgICAqICAgICAgICAgICAgdGhlIHRyYW5zcGFyZW5jeSBtb2RlLgogICAgICAqIEByZXR1cm4gdGhlIFZvbGF0aWxlSW1hZ2Ugb2JqZWN0LgogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBWb2xhdGlsZUltYWdlIGNyZWF0ZUNvbXBhdGlibGVWb2xhdGlsZUltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHRyYW5zcGFyZW5jeSk7CisgICAgcHVibGljIGFic3RyYWN0IFZvbGF0aWxlSW1hZ2UgY3JlYXRlQ29tcGF0aWJsZVZvbGF0aWxlSW1hZ2UoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgaW50IHRyYW5zcGFyZW5jeSk7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBib3VuZHMgb2YgYXJlYSBjb3ZlcmVkIGJ5IHRoZSBHcmFwaGljc0NvbmZpZ3VyYXRpb24gaW4gdGhlCkBAIC0xMTEsMjAgKzExOCwxOSBAQAogICAgIHB1YmxpYyBhYnN0cmFjdCBDb2xvck1vZGVsIGdldENvbG9yTW9kZWwoKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIENvbG9yTW9kZWwgb2YgdGhlIEdyYXBoaWNzQ29uZmlndXJhdGlvbiB3aGljaCAKLSAgICAgKiBzdXBwb3J0cyBzcGVjaWZpZWQgVHJhbnNwYXJlbmN5LgorICAgICAqIEdldHMgdGhlIENvbG9yTW9kZWwgb2YgdGhlIEdyYXBoaWNzQ29uZmlndXJhdGlvbiB3aGljaCBzdXBwb3J0cyBzcGVjaWZpZWQKKyAgICAgKiBUcmFuc3BhcmVuY3kuCiAgICAgICogCi0gICAgICogQHBhcmFtIHRyYW5zcGFyZW5jeSB0aGUgVHJhbnNwYXJlbmN5IG1vZGU6IE9QQVFVRSwgQklUTUFTSywgb3IKLSAgICAgKiBUUkFOU0xVQ0VOVC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBDb2xvck1vZGVsIG9mIHRoZSBHcmFwaGljc0NvbmZpZ3VyYXRpb24gd2hpY2ggCi0gICAgICogc3VwcG9ydHMgc3BlY2lmaWVkIFRyYW5zcGFyZW5jeS4KKyAgICAgKiBAcGFyYW0gdHJhbnNwYXJlbmN5CisgICAgICogICAgICAgICAgICB0aGUgVHJhbnNwYXJlbmN5IG1vZGU6IE9QQVFVRSwgQklUTUFTSywgb3IgVFJBTlNMVUNFTlQuCisgICAgICogQHJldHVybiB0aGUgQ29sb3JNb2RlbCBvZiB0aGUgR3JhcGhpY3NDb25maWd1cmF0aW9uIHdoaWNoIHN1cHBvcnRzCisgICAgICogICAgICAgICBzcGVjaWZpZWQgVHJhbnNwYXJlbmN5LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBDb2xvck1vZGVsIGdldENvbG9yTW9kZWwoaW50IHRyYW5zcGFyZW5jeSk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IEFmZmluZVRyYW5zZm9ybSBvZiB0aGUgR3JhcGhpY3NDb25maWd1cmF0aW9uLgotICAgICAqIFRoaXMgbWV0aG9kIHRyYW5zbGF0ZXMgdXNlciBjb29yZGluYXRlcyB0byBkZXZpY2UgY29vcmRpbmF0ZXMuCisgICAgICogR2V0cyB0aGUgZGVmYXVsdCBBZmZpbmVUcmFuc2Zvcm0gb2YgdGhlIEdyYXBoaWNzQ29uZmlndXJhdGlvbi4gVGhpcworICAgICAqIG1ldGhvZCB0cmFuc2xhdGVzIHVzZXIgY29vcmRpbmF0ZXMgdG8gZGV2aWNlIGNvb3JkaW5hdGVzLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgQWZmaW5lVHJhbnNmb3JtIG9mIHRoZSBHcmFwaGljc0NvbmZpZ3VyYXRpb24uCiAgICAgICovCkBAIC0xNDQsMjMgKzE1MCwyNCBAQAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBBZmZpbmVUcmFuc2Zvcm0gZ2V0Tm9ybWFsaXppbmdUcmFuc2Zvcm0oKTsKIAotCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBWb2xhdGlsZUltYWdlIHdpdGggc3BlY2lmaWVkIHdpZHRoLCBoZWlnaHQsIEltYWdlQ2FwYWJpbGl0aWVzOwotICAgICAqIGEgZGF0YSBsYXlvdXQgYW5kIGNvbG9yIG1vZGVsIGNvbXBhdGlibGUgd2l0aCB0aGlzIEdyYXBoaWNzQ29uZmlndXJhdGlvbi4gCi0gICAgICogIAotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgaW1hZ2UuCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIGltYWdlLgotICAgICAqIEBwYXJhbSBjYXBzIHRoZSBJbWFnZUNhcGFiaWxpdGllcyBvYmplY3QuCisgICAgICogQ3JlYXRlcyBWb2xhdGlsZUltYWdlIHdpdGggc3BlY2lmaWVkIHdpZHRoLCBoZWlnaHQsIEltYWdlQ2FwYWJpbGl0aWVzOyBhCisgICAgICogZGF0YSBsYXlvdXQgYW5kIGNvbG9yIG1vZGVsIGNvbXBhdGlibGUgd2l0aCB0aGlzIEdyYXBoaWNzQ29uZmlndXJhdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBWb2xhdGlsZUltYWdlIHdoaWNoIGRhdGEgbGF5b3V0IGFuZCBjb2xvciBtb2RlbCBjb21wYXRpYmxlIAotICAgICAqIHdpdGggdGhpcyBHcmFwaGljc0NvbmZpZ3VyYXRpb24uIAotICAgICAqIAotICAgICAqIEB0aHJvd3MgQVdURXhjZXB0aW9uIGlmIEltYWdlQ2FwYWJpbGl0aWVzIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlCi0gICAgICogR3JhcGhpY3NDb25maWd1cmF0aW9uLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIGltYWdlLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgaW1hZ2UuCisgICAgICogQHBhcmFtIGNhcHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZUNhcGFiaWxpdGllcyBvYmplY3QuCisgICAgICogQHJldHVybiB0aGUgVm9sYXRpbGVJbWFnZSB3aGljaCBkYXRhIGxheW91dCBhbmQgY29sb3IgbW9kZWwgY29tcGF0aWJsZQorICAgICAqICAgICAgICAgd2l0aCB0aGlzIEdyYXBoaWNzQ29uZmlndXJhdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFXVEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIEltYWdlQ2FwYWJpbGl0aWVzIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlCisgICAgICogICAgICAgICAgICAgR3JhcGhpY3NDb25maWd1cmF0aW9uLgogICAgICAqLwotICAgIHB1YmxpYyBWb2xhdGlsZUltYWdlIGNyZWF0ZUNvbXBhdGlibGVWb2xhdGlsZUltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgIEltYWdlQ2FwYWJpbGl0aWVzIGNhcHMpIHRocm93cyBBV1RFeGNlcHRpb24geworICAgIHB1YmxpYyBWb2xhdGlsZUltYWdlIGNyZWF0ZUNvbXBhdGlibGVWb2xhdGlsZUltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCwgSW1hZ2VDYXBhYmlsaXRpZXMgY2FwcykKKyAgICAgICAgICAgIHRocm93cyBBV1RFeGNlcHRpb24gewogICAgICAgICBWb2xhdGlsZUltYWdlIHJlcyA9IGNyZWF0ZUNvbXBhdGlibGVWb2xhdGlsZUltYWdlKHdpZHRoLCBoZWlnaHQpOwogICAgICAgICBpZiAoIXJlcy5nZXRDYXBhYmlsaXRpZXMoKS5lcXVhbHMoY2FwcykpIHsKICAgICAgICAgICAgIC8vIGF3dC4xNEE9Q2FuIG5vdCBjcmVhdGUgVm9sYXRpbGVJbWFnZSB3aXRoIHNwZWNpZmllZCBjYXBhYmlsaXRpZXMKQEAgLTE3MCwyMSArMTc3LDIzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIFZvbGF0aWxlSW1hZ2Ugd2l0aCBzcGVjaWZpZWQgd2lkdGgsIGhlaWdodCwgdHJhbnNwYXJlbmN5IAotICAgICAqIGFuZCBJbWFnZUNhcGFiaWxpdGllczsgYSBkYXRhIGxheW91dCBhbmQgY29sb3IgbW9kZWwgY29tcGF0aWJsZSB3aXRoIAotICAgICAqIHRoaXMgR3JhcGhpY3NDb25maWd1cmF0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgaW1hZ2UuCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIGltYWdlLgotICAgICAqIEBwYXJhbSBjYXBzIHRoZSBJbWFnZUNhcGFiaWxpdGllcyBvYmplY3QuCi0gICAgICogQHBhcmFtIHRyYW5zcGFyZW5jeSB0aGUgVHJhbnNwYXJlbmN5IG1vZGU6IE9QQVFVRSwgQklUTUFTSywgb3IKLSAgICAgKiBUUkFOU0xVQ0VOVC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBWb2xhdGlsZUltYWdlIHdoaWNoIGRhdGEgbGF5b3V0IGFuZCBjb2xvciBtb2RlbCBjb21wYXRpYmxlIAotICAgICAqIHdpdGggdGhpcyBHcmFwaGljc0NvbmZpZ3VyYXRpb24uIAotICAgICAqIAotICAgICAqIEB0aHJvd3MgQVdURXhjZXB0aW9uIGlmIEltYWdlQ2FwYWJpbGl0aWVzIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlCisgICAgICogQ3JlYXRlcyBhIFZvbGF0aWxlSW1hZ2Ugd2l0aCBzcGVjaWZpZWQgd2lkdGgsIGhlaWdodCwgdHJhbnNwYXJlbmN5IGFuZAorICAgICAqIEltYWdlQ2FwYWJpbGl0aWVzOyBhIGRhdGEgbGF5b3V0IGFuZCBjb2xvciBtb2RlbCBjb21wYXRpYmxlIHdpdGggdGhpcwogICAgICAqIEdyYXBoaWNzQ29uZmlndXJhdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiBpbWFnZS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIGltYWdlLgorICAgICAqIEBwYXJhbSBjYXBzCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VDYXBhYmlsaXRpZXMgb2JqZWN0LgorICAgICAqIEBwYXJhbSB0cmFuc3BhcmVuY3kKKyAgICAgKiAgICAgICAgICAgIHRoZSBUcmFuc3BhcmVuY3kgbW9kZTogT1BBUVVFLCBCSVRNQVNLLCBvciBUUkFOU0xVQ0VOVC4KKyAgICAgKiBAcmV0dXJuIHRoZSBWb2xhdGlsZUltYWdlIHdoaWNoIGRhdGEgbGF5b3V0IGFuZCBjb2xvciBtb2RlbCBjb21wYXRpYmxlCisgICAgICogICAgICAgICB3aXRoIHRoaXMgR3JhcGhpY3NDb25maWd1cmF0aW9uLgorICAgICAqIEB0aHJvd3MgQVdURXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgSW1hZ2VDYXBhYmlsaXRpZXMgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUKKyAgICAgKiAgICAgICAgICAgICBHcmFwaGljc0NvbmZpZ3VyYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIFZvbGF0aWxlSW1hZ2UgY3JlYXRlQ29tcGF0aWJsZVZvbGF0aWxlSW1hZ2UoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgSW1hZ2VDYXBhYmlsaXRpZXMgY2FwcywgaW50IHRyYW5zcGFyZW5jeSkgdGhyb3dzIEFXVEV4Y2VwdGlvbiB7CkBAIC0xOTksNyArMjA4LDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBidWZmZXJpbmcgY2FwYWJpbGl0aWVzIG9mIHRoZSBHcmFwaGljc0NvbmZpZ3VyYXRpb24uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgQnVmZmVyQ2FwYWJpbGl0aWVzIG9iamVjdC4gCisgICAgICogQHJldHVybiB0aGUgQnVmZmVyQ2FwYWJpbGl0aWVzIG9iamVjdC4KICAgICAgKi8KICAgICBwdWJsaWMgQnVmZmVyQ2FwYWJpbGl0aWVzIGdldEJ1ZmZlckNhcGFiaWxpdGllcygpIHsKICAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJDYXBhYmlsaXRpZXMobmV3IEltYWdlQ2FwYWJpbGl0aWVzKGZhbHNlKSwgbmV3IEltYWdlQ2FwYWJpbGl0aWVzKGZhbHNlKSwKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9HcmFwaGljc0RldmljZS5qYXZhIGIvYXd0L2phdmEvYXd0L0dyYXBoaWNzRGV2aWNlLmphdmEKaW5kZXggOGNmNzAwYS4uOWVkYTRlMCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L0dyYXBoaWNzRGV2aWNlLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L0dyYXBoaWNzRGV2aWNlLmphdmEKQEAgLTE4LDUwICsxOCw2MSBAQAogICogQGF1dGhvciBBbGV4ZXkgQS4gUGV0cmVua28KICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogVGhlIEdyYXBoaWNzRGV2aWNlIGNsYXNzIGRlc2NyaWJlcyB0aGUgZ3JhcGhpY3MgZGV2aWNlcyAoc3VjaCBhcyBzY3JlZW5zIAotICogb3IgcHJpbnRlcnMpIHdoaWNoIGFyZSBhdmFpbGFibGUgaW4gYSBwYXJ0aWN1bGFyIGdyYXBoaWNzIGVudmlyb25tZW50LiAKLSAqIE1hbnkgR3JhcGhpY3NEZXZpY2UgaW5zdGFuY2VzIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUKLSAqIEdyYXBoaWNzRW52aXJvbm1lbnQuIEVhY2ggR3JhcGhpY3NEZXZpY2UgaGFzIG9uZSBvciBtb3JlIEdyYXBoaWNzQ29uZmlndXJhdGlvbgotICogb2JqZWN0cyB3aGljaCBzcGVjaWZ5IHRoZSBkaWZmZXJlbnQgY29uZmlndXJhdGlvbnMgYW5kIG1vZGVzIG9mIEdyYXBoaWNzRGV2aWNlLgorICogVGhlIEdyYXBoaWNzRGV2aWNlIGNsYXNzIGRlc2NyaWJlcyB0aGUgZ3JhcGhpY3MgZGV2aWNlcyAoc3VjaCBhcyBzY3JlZW5zIG9yCisgKiBwcmludGVycykgd2hpY2ggYXJlIGF2YWlsYWJsZSBpbiBhIHBhcnRpY3VsYXIgZ3JhcGhpY3MgZW52aXJvbm1lbnQuIE1hbnkKKyAqIEdyYXBoaWNzRGV2aWNlIGluc3RhbmNlcyBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGEgc2luZ2xlIEdyYXBoaWNzRW52aXJvbm1lbnQuCisgKiBFYWNoIEdyYXBoaWNzRGV2aWNlIGhhcyBvbmUgb3IgbW9yZSBHcmFwaGljc0NvbmZpZ3VyYXRpb24gb2JqZWN0cyB3aGljaAorICogc3BlY2lmeSB0aGUgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb25zIGFuZCBtb2RlcyBvZiBHcmFwaGljc0RldmljZS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHcmFwaGljc0RldmljZSB7Ci0gICAgCi0gICAgLyoqIFRoZSBkaXNwbGF5IG1vZGUuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGlzcGxheSBtb2RlLgorICAgICAqLwogICAgIHByaXZhdGUgRGlzcGxheU1vZGUgZGlzcGxheU1vZGU7CiAKLSAgICAvLz8/P0FXVAotLy8gICAgcHJpdmF0ZSBXaW5kb3cgZnVsbFNjcmVlbldpbmRvdyA9IG51bGw7CisgICAgLy8gPz8/QVdUCisgICAgLy8gcHJpdmF0ZSBXaW5kb3cgZnVsbFNjcmVlbldpbmRvdyA9IG51bGw7CiAKLSAgIC8qKiBUaGUgQ29uc3RhbnQgVFlQRV9JTUFHRV9CVUZGRVIgaW5kaWNhdGVzIGEgaW1hZ2UgYnVmZmVyIGRldmljZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9JTUFHRV9CVUZGRVIgaW5kaWNhdGVzIGEgaW1hZ2UgYnVmZmVyIGRldmljZS4KKyAgICAgKi8KIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfSU1BR0VfQlVGRkVSID0gMjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgVFlQRV9QUklOVEVSIGluZGljYXRlcyBhIHByaW50ZXIgZGV2aWNlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX1BSSU5URVIgaW5kaWNhdGVzIGEgcHJpbnRlciBkZXZpY2UuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9QUklOVEVSID0gMTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgVFlQRV9SQVNURVJfU0NSRUVOIGluZGljYXRlcyBhIHJhc3RlciBzY3JlZW4gZGV2aWNlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX1JBU1RFUl9TQ1JFRU4gaW5kaWNhdGVzIGEgcmFzdGVyIHNjcmVlbiBkZXZpY2UuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9SQVNURVJfU0NSRUVOID0gMDsKIAotICAgLyoqCi0gICAgKiBDb25zdHJ1Y3RvciBpcyBub3QgdG8gYmUgdXNlZCBkaXJlY3RseSBhcyB0aGlzIGNsYXNzIGlzIGFic3RyYWN0LiAKLSAgICAqLworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGlzIG5vdCB0byBiZSB1c2VkIGRpcmVjdGx5IGFzIHRoaXMgY2xhc3MgaXMgYWJzdHJhY3QuCisgICAgICovCiAgICAgcHJvdGVjdGVkIEdyYXBoaWNzRGV2aWNlKCkgewotICAgICAgICBkaXNwbGF5TW9kZSA9IG5ldyBEaXNwbGF5TW9kZSgwLCAwLCBEaXNwbGF5TW9kZS5CSVRfREVQVEhfTVVMVEksIERpc3BsYXlNb2RlLlJFRlJFU0hfUkFURV9VTktOT1dOKTsKKyAgICAgICAgZGlzcGxheU1vZGUgPSBuZXcgRGlzcGxheU1vZGUoMCwgMCwgRGlzcGxheU1vZGUuQklUX0RFUFRIX01VTFRJLAorICAgICAgICAgICAgICAgIERpc3BsYXlNb2RlLlJFRlJFU0hfUkFURV9VTktOT1dOKTsKICAgICB9CiAKLQotICAgLyoqCi0gICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIEdyYXBoaWNzQ29uZmlndXJhdGlvbiBvYmplY3RzIGFzc29jaWF0ZWQKLSAgICAqIHdpdGggdGhlIEdyYXBoaWNzRGV2aWNlLiAgCi0gICAgKiAKLSAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgR3JhcGhpY3NDb25maWd1cmF0aW9uIG9iamVjdHMgYXNzb2NpYXRlZAotICAgICogd2l0aCB0aGUgR3JhcGhpY3NEZXZpY2UuCi0gICAgKi8KKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIEdyYXBoaWNzQ29uZmlndXJhdGlvbiBvYmplY3RzIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICAgKiBHcmFwaGljc0RldmljZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIEdyYXBoaWNzQ29uZmlndXJhdGlvbiBvYmplY3RzIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICAgKiAgICAgICAgIEdyYXBoaWNzRGV2aWNlLgorICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBHcmFwaGljc0NvbmZpZ3VyYXRpb25bXSBnZXRDb25maWd1cmF0aW9ucygpOwogCiAgICAgLyoqCkBAIC03Miw0MSArODMsMzkgQEAKICAgICBwdWJsaWMgYWJzdHJhY3QgR3JhcGhpY3NDb25maWd1cmF0aW9uIGdldERlZmF1bHRDb25maWd1cmF0aW9uKCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBTdHJpbmcgaWRlbnRpZmllciB3aGljaCBhc3NvY2lhdGVkIHdpdGggdGhlIEdyYXBoaWNzRGV2aWNlIGluIAorICAgICAqIEdldHMgdGhlIFN0cmluZyBpZGVudGlmaWVyIHdoaWNoIGFzc29jaWF0ZWQgd2l0aCB0aGUgR3JhcGhpY3NEZXZpY2UgaW4KICAgICAgKiB0aGUgR3JhcGhpY3NFbnZpcm9ubWVudC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBTdHJpbmcgaWRlbnRpZmllciBvZiB0aGUgR3JhcGhpY3NEZXZpY2UgaW4gCi0gICAgICogdGhlIEdyYXBoaWNzRW52aXJvbm1lbnQuCisgICAgICogQHJldHVybiB0aGUgU3RyaW5nIGlkZW50aWZpZXIgb2YgdGhlIEdyYXBoaWNzRGV2aWNlIGluIHRoZQorICAgICAqICAgICAgICAgR3JhcGhpY3NFbnZpcm9ubWVudC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldElEc3RyaW5nKCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0eXBlIG9mIHRoaXMgR3JhcGhpY3NEZXZpY2U6IAotICAgICAqIFRZUEVfSU1BR0VfQlVGRkVSLCBUWVBFX1BSSU5URVIgb3IgVFlQRV9SQVNURVJfU0NSRUVOLgorICAgICAqIEdldHMgdGhlIHR5cGUgb2YgdGhpcyBHcmFwaGljc0RldmljZTogVFlQRV9JTUFHRV9CVUZGRVIsIFRZUEVfUFJJTlRFUiBvcgorICAgICAqIFRZUEVfUkFTVEVSX1NDUkVFTi4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMgR3JhcGhpY3NEZXZpY2U6IFRZUEVfSU1BR0VfQlVGRkVSLCAKLSAgICAgKiBUWVBFX1BSSU5URVIgb3IgVFlQRV9SQVNURVJfU0NSRUVOLgorICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBHcmFwaGljc0RldmljZTogVFlQRV9JTUFHRV9CVUZGRVIsIFRZUEVfUFJJTlRFUgorICAgICAqICAgICAgICAgb3IgVFlQRV9SQVNURVJfU0NSRUVOLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0VHlwZSgpOwogCi0KLQotICAgLyoqCi0JKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGluIGFjY2VsZXJhdGVkIAotCSogbWVtb3J5IG9uIHRoaXMgZGV2aWNlLiAKLSAgICAqIAotICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBhY2NlbGVyYXRlZCBtZW1vcnkuCi0gICAgKi8KKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGluIGFjY2VsZXJhdGVkIG1lbW9yeSBvbiB0aGlzCisgICAgICogZGV2aWNlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgYWNjZWxlcmF0ZWQgbWVtb3J5LgorICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0QXZhaWxhYmxlQWNjZWxlcmF0ZWRNZW1vcnkoKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIC8qID8/P0FXVAotICAgIHB1YmxpYyBHcmFwaGljc0NvbmZpZ3VyYXRpb24gZ2V0QmVzdENvbmZpZ3VyYXRpb24oR3JhcGhpY3NDb25maWdUZW1wbGF0ZSBnY3QpIHsKLSAgICAgICAgcmV0dXJuIGdjdC5nZXRCZXN0Q29uZmlndXJhdGlvbihnZXRDb25maWd1cmF0aW9ucygpKTsKLSAgICB9Ci0gICAgKi8KLSAgICAKKyAgICAvKgorICAgICAqID8/P0FXVCBwdWJsaWMgR3JhcGhpY3NDb25maWd1cmF0aW9uCisgICAgICogZ2V0QmVzdENvbmZpZ3VyYXRpb24oR3JhcGhpY3NDb25maWdUZW1wbGF0ZSBnY3QpIHsgcmV0dXJuCisgICAgICogZ2N0LmdldEJlc3RDb25maWd1cmF0aW9uKGdldENvbmZpZ3VyYXRpb25zKCkpOyB9CisgICAgICovCisKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBjdXJyZW50IGRpc3BsYXkgbW9kZSBvZiB0aGUgR3JhcGhpY3NEZXZpY2UuCiAgICAgICogCkBAIC0xMjIsNDMgKzEzMSw0MyBAQAogICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgZGlzcGxheSBtb2RlcyBhdmFpbGFibGUgaW4gdGhpcyBHcmFwaGljc0RldmljZS4KICAgICAgKi8KICAgICBwdWJsaWMgRGlzcGxheU1vZGVbXSBnZXREaXNwbGF5TW9kZXMoKSB7Ci0gICAgICAgIERpc3BsYXlNb2RlIFtdZG1zID0ge2Rpc3BsYXlNb2RlfTsKLSAgICAgICAgcmV0dXJuICBkbXM7CisgICAgICAgIERpc3BsYXlNb2RlW10gZG1zID0geworICAgICAgICAgICAgZGlzcGxheU1vZGUKKyAgICAgICAgfTsKKyAgICAgICAgcmV0dXJuIGRtczsKICAgICB9CiAKLSAgICAvKiA/Pz9BV1QKLSAgICBwdWJsaWMgV2luZG93IGdldEZ1bGxTY3JlZW5XaW5kb3coKSB7Ci0gICAgICAgIHJldHVybiBmdWxsU2NyZWVuV2luZG93OwotICAgIH0KLSAgICAqLwotICAgIAorICAgIC8qCisgICAgICogPz8/QVdUIHB1YmxpYyBXaW5kb3cgZ2V0RnVsbFNjcmVlbldpbmRvdygpIHsgcmV0dXJuIGZ1bGxTY3JlZW5XaW5kb3c7IH0KKyAgICAgKi8KKwogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIEdyYXBoaWNzRGV2aWNlIHN1cHBvcnRzIGxvdy1sZXZlbCAKLSAgICAgKiBkaXNwbGF5IGNoYW5nZXMuCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgR3JhcGhpY3NEZXZpY2Ugc3VwcG9ydHMgbG93LWxldmVsIGRpc3BsYXkgY2hhbmdlcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgR3JhcGhpY3NEZXZpY2Ugc3VwcG9ydHMgbG93LWxldmVsIAotICAgICAqIGRpc3BsYXkgY2hhbmdlczsgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBHcmFwaGljc0RldmljZSBzdXBwb3J0cyBsb3ctbGV2ZWwgZGlzcGxheSBjaGFuZ2VzOworICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzRGlzcGxheUNoYW5nZVN1cHBvcnRlZCgpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIEdyYXBoaWNzRGV2aWNlIHN1cHBvcnRzIGZ1bGwgc2NyZWVuCi0gICAgICogbW9kZS4KKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBHcmFwaGljc0RldmljZSBzdXBwb3J0cyBmdWxsIHNjcmVlbiBtb2RlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBHcmFwaGljc0RldmljZSBzdXBwb3J0cyBmdWxsIHNjcmVlbgotICAgICAqIG1vZGU7IG90aGVyd2lzZSBmYWxzZS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgR3JhcGhpY3NEZXZpY2Ugc3VwcG9ydHMgZnVsbCBzY3JlZW4gbW9kZSwgZmFsc2UKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0Z1bGxTY3JlZW5TdXBwb3J0ZWQoKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgLy9hbiBhcnJheSBvZiBkaXNwbGF5IG1vZGVzIGF2YWlsYWJsZSBpbiB0aGlzIEdyYXBoaWNzRGV2aWNlLgotICAgIAorCisgICAgLy8gYW4gYXJyYXkgb2YgZGlzcGxheSBtb2RlcyBhdmFpbGFibGUgaW4gdGhpcyBHcmFwaGljc0RldmljZS4KKwogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGRpc3BsYXkgbW9kZSBvZiB0aGlzIEdyYXBoaWNzRGV2aWNlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBkbSB0aGUgbmV3IGRpc3BsYXkgbW9kZSBvZiB0aGlzIEdyYXBoaWNzRGV2aWNlLiAKKyAgICAgKiBAcGFyYW0gZG0KKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgZGlzcGxheSBtb2RlIG9mIHRoaXMgR3JhcGhpY3NEZXZpY2UuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RGlzcGxheU1vZGUoRGlzcGxheU1vZGUgZG0pIHsKICAgICAgICAgaWYgKCFpc0Rpc3BsYXlDaGFuZ2VTdXBwb3J0ZWQoKSkgewpAQCAtMTY2LDcgKzE3NSw3IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMTIyIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICBEaXNwbGF5TW9kZSBbXWRtcyA9IGdldERpc3BsYXlNb2RlcygpOworICAgICAgICBEaXNwbGF5TW9kZVtdIGRtcyA9IGdldERpc3BsYXlNb2RlcygpOwogICAgICAgICBmb3IgKERpc3BsYXlNb2RlIGVsZW1lbnQgOiBkbXMpIHsKICAgICAgICAgICAgIGlmIChlbGVtZW50LmVxdWFscyhkbSkpIHsKICAgICAgICAgICAgICAgICBkaXNwbGF5TW9kZSA9IGRtOwpAQCAtMTc3LDIzICsxODYsMTEgQEAKICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4xMjMiLCBkbSkpOyAvLyROT04tTkxTLTEkCiAgICAgfQogCi0gICAgLyogPz8/QVdUCi0gICAgcHVibGljIHZvaWQgc2V0RnVsbFNjcmVlbldpbmRvdyhXaW5kb3cgdykgewotICAgICAgICBpZiAodyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmdWxsU2NyZWVuV2luZG93ID0gbnVsbDsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZ1bGxTY3JlZW5XaW5kb3cgPSB3OwotCi0gICAgICAgIGlmIChpc0Z1bGxTY3JlZW5TdXBwb3J0ZWQoKSkgewotICAgICAgICAgICAgdy5lbmFibGVJbnB1dE1ldGhvZHMoZmFsc2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdy5zZXRTaXplKGRpc3BsYXlNb2RlLmdldFdpZHRoKCksIGRpc3BsYXlNb2RlLmdldEhlaWdodCgpKTsKLSAgICAgICAgICAgIHcuc2V0TG9jYXRpb24oMCwgMCk7Ci0gICAgICAgIH0KLSAgICAgICAgdy5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICB3LnNldEFsd2F5c09uVG9wKHRydWUpOwotICAgIH0KLSAgICAqLworICAgIC8qCisgICAgICogPz8/QVdUIHB1YmxpYyB2b2lkIHNldEZ1bGxTY3JlZW5XaW5kb3coV2luZG93IHcpIHsgaWYgKHcgPT0gbnVsbCkgeworICAgICAqIGZ1bGxTY3JlZW5XaW5kb3cgPSBudWxsOyByZXR1cm47IH0gZnVsbFNjcmVlbldpbmRvdyA9IHc7IGlmCisgICAgICogKGlzRnVsbFNjcmVlblN1cHBvcnRlZCgpKSB7IHcuZW5hYmxlSW5wdXRNZXRob2RzKGZhbHNlKTsgfSBlbHNlIHsKKyAgICAgKiB3LnNldFNpemUoZGlzcGxheU1vZGUuZ2V0V2lkdGgoKSwgZGlzcGxheU1vZGUuZ2V0SGVpZ2h0KCkpOworICAgICAqIHcuc2V0TG9jYXRpb24oMCwgMCk7IH0gdy5zZXRWaXNpYmxlKHRydWUpOyB3LnNldEFsd2F5c09uVG9wKHRydWUpOyB9CisgICAgICovCiB9CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvR3JhcGhpY3NFbnZpcm9ubWVudC5qYXZhIGIvYXd0L2phdmEvYXd0L0dyYXBoaWNzRW52aXJvbm1lbnQuamF2YQppbmRleCAzYjE0ZjU1Li5kNTI3NDE3IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvR3JhcGhpY3NFbnZpcm9ubWVudC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9HcmFwaGljc0Vudmlyb25tZW50LmphdmEKQEAgLTI4LDE3ICsyOCwyMCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuZ2wuQ29tbW9uR3JhcGhpY3MyREZhY3Rvcnk7CiAKIC8qKgotICogVGhlIEdyYXBoaWNzRW52aXJvbm1lbnQgY2xhc3MgZGVmaW5lcyBhIGNvbGxlY3Rpb24gb2YgR3JhcGhpY3NEZXZpY2UgCi0gKiBvYmplY3RzIGFuZCBGb250IG9iamVjdHMgd2hpY2ggYXJlIGF2YWlsYWJsZSBmb3IgSmF2YSBhcHBsaWNhdGlvbiBvbgotICogY3VycmVudCBwbGF0Zm9ybS4KKyAqIFRoZSBHcmFwaGljc0Vudmlyb25tZW50IGNsYXNzIGRlZmluZXMgYSBjb2xsZWN0aW9uIG9mIEdyYXBoaWNzRGV2aWNlIG9iamVjdHMKKyAqIGFuZCBGb250IG9iamVjdHMgd2hpY2ggYXJlIGF2YWlsYWJsZSBmb3IgSmF2YSBhcHBsaWNhdGlvbiBvbiBjdXJyZW50CisgKiBwbGF0Zm9ybS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHcmFwaGljc0Vudmlyb25tZW50IHsKLSAgICAKKwogICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGNvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5IGFuZCBzaG91bGQgYmUgb2J0YWluZWQgaW4gCi0gICAgICogZXh0ZW5kZWQgY2xhc3Nlcy4gCisgICAgICogQ29uc3RydWN0b3IgY291bGQgbm90IGJlIHVzZWQgZGlyZWN0bHkgYW5kIHNob3VsZCBiZSBvYnRhaW5lZCBpbiBleHRlbmRlZAorICAgICAqIGNsYXNzZXMuCiAgICAgICovCi0gICAgcHJvdGVjdGVkIEdyYXBoaWNzRW52aXJvbm1lbnQoKSB7fQorICAgIHByb3RlY3RlZCBHcmFwaGljc0Vudmlyb25tZW50KCkgeworICAgIH0KIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGxvY2FsIEdyYXBoaWNzRW52aXJvbm1lbnQuCkBAIC00NiwxNyArNDksMTYgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBsb2NhbCBHcmFwaGljc0Vudmlyb25tZW50LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgR3JhcGhpY3NFbnZpcm9ubWVudCBnZXRMb2NhbEdyYXBoaWNzRW52aXJvbm1lbnQoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChDb250ZXh0U3RvcmFnZS5nZXRDb250ZXh0TG9jaygpKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoQ29udGV4dFN0b3JhZ2UuZ2V0Q29udGV4dExvY2soKSkgewogICAgICAgICAgICAgaWYgKENvbnRleHRTdG9yYWdlLmdldEdyYXBoaWNzRW52aXJvbm1lbnQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzSGVhZGxlc3MoKSkgeyAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIENvbnRleHRTdG9yYWdlLnNldEdyYXBoaWNzRW52aXJvbm1lbnQobmV3IEhlYWRsZXNzR3JhcGhpY3NFbnZpcm9ubWVudCgpKTsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChpc0hlYWRsZXNzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQ29udGV4dFN0b3JhZ2Uuc2V0R3JhcGhpY3NFbnZpcm9ubWVudChuZXcgSGVhZGxlc3NHcmFwaGljc0Vudmlyb25tZW50KCkpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbkdyYXBoaWNzMkRGYWN0b3J5IGcyZGYgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDb21tb25HcmFwaGljczJERmFjdG9yeSkgVG9vbGtpdC5nZXREZWZhdWx0VG9vbGtpdCgpLmdldEdyYXBoaWNzRmFjdG9yeSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgQ29udGV4dFN0b3JhZ2Uuc2V0R3JhcGhpY3NFbnZpcm9ubWVudCggCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZzJkZi5jcmVhdGVHcmFwaGljc0Vudmlyb25tZW50KENvbnRleHRTdG9yYWdlLmdldFdpbmRvd0ZhY3RvcnkoKSkKLSAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgQ29tbW9uR3JhcGhpY3MyREZhY3RvcnkgZzJkZiA9IChDb21tb25HcmFwaGljczJERmFjdG9yeSlUb29sa2l0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldERlZmF1bHRUb29sa2l0KCkuZ2V0R3JhcGhpY3NGYWN0b3J5KCk7CisKKyAgICAgICAgICAgICAgICAgICAgQ29udGV4dFN0b3JhZ2Uuc2V0R3JhcGhpY3NFbnZpcm9ubWVudChnMmRmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUdyYXBoaWNzRW52aXJvbm1lbnQoQ29udGV4dFN0b3JhZ2UuZ2V0V2luZG93RmFjdG9yeSgpKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC02NSwyNCArNjcsMjQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGEgZGlzcGxheSwga2V5Ym9hcmQsIGFuZCBtb3VzZSBhcmUgc3VwcG9ydGVkIAotICAgICAqIGluIHRoaXMgZ3JhcGhpY3MgZW52aXJvbm1lbnQuCisgICAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCBhIGRpc3BsYXksIGtleWJvYXJkLCBhbmQgbW91c2UgYXJlIHN1cHBvcnRlZCBpbgorICAgICAqIHRoaXMgZ3JhcGhpY3MgZW52aXJvbm1lbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiBIZWFkbGVzc0V4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBmcm9tIGFyZWFzIG9mIAotICAgICAqIHRoZSBncmFwaGljcyBlbnZpcm9ubWVudCB0aGF0IGFyZSBkZXBlbmRlbnQgb24gYSBkaXNwbGF5LCBrZXlib2FyZCwgCi0gICAgICogb3IgbW91c2U7IGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIEhlYWRsZXNzRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGZyb20gYXJlYXMgb2YgdGhlCisgICAgICogICAgICAgICBncmFwaGljcyBlbnZpcm9ubWVudCB0aGF0IGFyZSBkZXBlbmRlbnQgb24gYSBkaXNwbGF5LCBrZXlib2FyZCwKKyAgICAgKiAgICAgICAgIG9yIG1vdXNlLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNIZWFkbGVzc0luc3RhbmNlKCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IGEgZGlzcGxheSwga2V5Ym9hcmQsIGFuZCBtb3VzZSBhcmUgc3VwcG9ydGVkIAotICAgICAqIGluIHRoaXMgZW52aXJvbm1lbnQuIAorICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCBhIGRpc3BsYXksIGtleWJvYXJkLCBhbmQgbW91c2UgYXJlIHN1cHBvcnRlZCBpbgorICAgICAqIHRoaXMgZW52aXJvbm1lbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiBhIEhlYWRsZXNzRXhjZXB0aW9uIGlzIHRocm93biBmcm9tIGFyZWFzIG9mIAotICAgICAqIHRoZSBUb29sa2l0IGFuZCBHcmFwaGljc0Vudmlyb25tZW50IHRoYXQgYXJlIGRlcGVuZGVudCBvbiAKLSAgICAgKiBhIGRpc3BsYXksIGtleWJvYXJkLCBvciBtb3VzZTsgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgYSBIZWFkbGVzc0V4Y2VwdGlvbiBpcyB0aHJvd24gZnJvbSBhcmVhcyBvZiB0aGUgVG9vbGtpdAorICAgICAqICAgICAgICAgYW5kIEdyYXBoaWNzRW52aXJvbm1lbnQgdGhhdCBhcmUgZGVwZW5kZW50IG9uIGEgZGlzcGxheSwKKyAgICAgKiAgICAgICAgIGtleWJvYXJkLCBvciBtb3VzZSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0hlYWRsZXNzKCkgewogICAgICAgICByZXR1cm4gInRydWUiLmVxdWFscyhTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuYXd0LmhlYWRsZXNzIikpOwpAQCAtOTIsOCArOTQsOCBAQAogICAgICAqIEdldHMgdGhlIG1heGltdW0gYm91bmRzIG9mIHN5c3RlbSBjZW50ZXJlZCB3aW5kb3dzLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0gYm91bmRzIG9mIHN5c3RlbSBjZW50ZXJlZCB3aW5kb3dzLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24gaWYgaXNIZWFkbGVzcygpIG1ldGhvZCByZXR1cm5zIHRydWUuCisgICAgICogQHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGlzSGVhZGxlc3MoKSBtZXRob2QgcmV0dXJucyB0cnVlLgogICAgICAqLwogICAgIHB1YmxpYyBSZWN0YW5nbGUgZ2V0TWF4aW11bVdpbmRvd0JvdW5kcygpIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBnZXREZWZhdWx0U2NyZWVuRGV2aWNlKCkuZ2V0RGVmYXVsdENvbmZpZ3VyYXRpb24oKS5nZXRCb3VuZHMoKTsKQEAgLTEwMyw4ICsxMDUsOCBAQAogICAgICAqIEdldHMgdGhlIFBvaW50IHdoaWNoIHNob3VsZCBkZWZpbmVzIHRoZSBjZW50ZXIgb2Ygc3lzdGVtIHdpbmRvdy4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBQb2ludCB3aGVyZSB0aGUgc3lzdGVtIHdpbmRvdyBzaG91bGQgYmUgY2VudGVyZWQuCi0gICAgICogCi0gICAgICogQHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiBpZiBpc0hlYWRsZXNzKCkgbWV0aG9kIHJldHVybnMgdHJ1ZS4KKyAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgaXNIZWFkbGVzcygpIG1ldGhvZCByZXR1cm5zIHRydWUuCiAgICAgICovCiAgICAgcHVibGljIFBvaW50IGdldENlbnRlclBvaW50KCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKICAgICAgICAgUmVjdGFuZ2xlIG13YiA9IGdldE1heGltdW1XaW5kb3dCb3VuZHMoKTsKQEAgLTExMiw5ICsxMTQsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBwcmltYXJ5IGZvbnQgc2hvdWxkIGJlIHVzZWQuIAotICAgICAqIFByaW1hcnkgZm9udCBpcyBzcGVjaWZpZWQgYnkgaW5pdGlhbCBzeXN0ZW0gbG9jYWxlIG9yIGRlZmF1bHQgZW5jb2RpbmcpLgotICAgICAqIAorICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBwcmltYXJ5IGZvbnQgc2hvdWxkIGJlIHVzZWQuIFByaW1hcnkgZm9udCBpcyBzcGVjaWZpZWQKKyAgICAgKiBieSBpbml0aWFsIHN5c3RlbSBsb2NhbGUgb3IgZGVmYXVsdCBlbmNvZGluZykuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcHJlZmVyTG9jYWxlRm9udHMoKSB7CiAgICAgICAgIC8vIE5vdGU6IEFQSSBzcGVjaWZpY2F0aW9uIHNheXMgZm9sbG93aW5nOgpAQCAtMTIzLDcgKzEyNCw4IEBACiAgICAgICAgIC8vIGl0IG1heSBoYXZlIG5vIGVmZmVjdCBhdCBhbGwuIiBTbywgZG9pbmcgbm90aGluZyBpcyBhbgogICAgICAgICAvLyBhY2NlcHRhYmxlIGJlaGF2aW9yIGZvciB0aGlzIG1ldGhvZC4KIAotICAgICAgICAvLyBGb3Igbm93IEZvbnRNYW5hZ2VyIHVzZXMgMS40IGZvbnQucHJvcGVydGllcyBzY2hlbWUgZm9yIGZvbnQgbWFwcGluZywgc28KKyAgICAgICAgLy8gRm9yIG5vdyBGb250TWFuYWdlciB1c2VzIDEuNCBmb250LnByb3BlcnRpZXMgc2NoZW1lIGZvciBmb250IG1hcHBpbmcsCisgICAgICAgIC8vIHNvCiAgICAgICAgIC8vIHRoaXMgbWV0aG9kIGRvZXNuJ3QgbWFrZSBhbnkgc2Vuc2UuIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZAogICAgICAgICAvLyB3aGljaCB3aWxsIGluZmx1ZW5jZSBmb250IG1hcHBpbmcgaXMgcG9zdHBvbmVkIHVudGlsCiAgICAgICAgIC8vIDEuNSBtYXBwaW5nIHNjaGVtZSBub3QgaW1wbGVtZW50ZWQuCkBAIC0xNDEsNyArMTQzLDggQEAKICAgICAgICAgLy8gaXQgbWF5IGhhdmUgbm8gZWZmZWN0IGF0IGFsbC4iIFNvLCBkb2luZyBub3RoaW5nIGlzIGFuCiAgICAgICAgIC8vIGFjY2VwdGFibGUgYmVoYXZpb3IgZm9yIHRoaXMgbWV0aG9kLgogCi0gICAgICAgIC8vIEZvciBub3cgRm9udE1hbmFnZXIgdXNlcyAxLjQgZm9udC5wcm9wZXJ0aWVzIHNjaGVtZSBmb3IgZm9udCBtYXBwaW5nLCBzbworICAgICAgICAvLyBGb3Igbm93IEZvbnRNYW5hZ2VyIHVzZXMgMS40IGZvbnQucHJvcGVydGllcyBzY2hlbWUgZm9yIGZvbnQgbWFwcGluZywKKyAgICAgICAgLy8gc28KICAgICAgICAgLy8gdGhpcyBtZXRob2QgZG9lc24ndCBtYWtlIGFueSBzZW5zZS4gVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kCiAgICAgICAgIC8vIHdoaWNoIHdpbGwgaW5mbHVlbmNlIGZvbnQgbWFwcGluZyBpcyBwb3N0cG9uZWQgdW50aWwKICAgICAgICAgLy8gMS41IG1hcHBpbmcgc2NoZW1lIG5vdCBpbXBsZW1lbnRlZC4KQEAgLTE1MywxOSArMTU2LDE5IEBACiAgICAgICogQ3JlYXRlcyB0aGUgR3JhcGhpY3MyRCBvYmplY3QgZm9yIHJlbmRlcmluZyB0byB0aGUgc3BlY2lmaWVkCiAgICAgICogQnVmZmVyZWRJbWFnZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYnVmZmVyZWRJbWFnZSB0aGUgQnVmZmVyZWRJbWFnZSBvYmplY3QuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgR3JhcGhpY3MyRCBvYmplY3Qgd2hpY2ggYWxsb3dzIHRvIHJlbmRlciB0byB0aGUgc3BlY2lmaWVkIAotICAgICAqIEJ1ZmZlcmVkSW1hZ2UuCisgICAgICogQHBhcmFtIGJ1ZmZlcmVkSW1hZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBCdWZmZXJlZEltYWdlIG9iamVjdC4KKyAgICAgKiBAcmV0dXJuIHRoZSBHcmFwaGljczJEIG9iamVjdCB3aGljaCBhbGxvd3MgdG8gcmVuZGVyIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgIEJ1ZmZlcmVkSW1hZ2UuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEdyYXBoaWNzMkQgY3JlYXRlR3JhcGhpY3MoQnVmZmVyZWRJbWFnZSBidWZmZXJlZEltYWdlKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGFycmF5IG9mIGFsbCBhdmFpbGFibGUgZm9udHMgaW5zdGFuY2VzIGluIHRoaXMgCisgICAgICogR2V0cyB0aGUgYXJyYXkgb2YgYWxsIGF2YWlsYWJsZSBmb250cyBpbnN0YW5jZXMgaW4gdGhpcwogICAgICAqIEdyYXBoaWNzRW52aXJvbWVudHMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgYWxsIGF2YWlsYWJsZSBmb250cyBpbnN0YW5jZXMgaW4gdGhpcyAKLSAgICAgKiBHcmFwaGljc0Vudmlyb21lbnRzLgorICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGFsbCBhdmFpbGFibGUgZm9udHMgaW5zdGFuY2VzIGluIHRoaXMKKyAgICAgKiAgICAgICAgIEdyYXBoaWNzRW52aXJvbWVudHMuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEZvbnRbXSBnZXRBbGxGb250cygpOwogCkBAIC0xODAsMTEgKzE4MywxMSBAQAogICAgICAqIEdldHMgdGhlIGFycmF5IG9mIGFsbCBhdmFpbGFibGUgZm9udCBmYW1pbHkgbmFtZXMgZm9yIHRoZSBzcGVjaWZpZWQKICAgICAgKiBsb2NhbGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGxvY2FsZSB0aGUgTG9jYWxlIG9iamVjdCB3aGljaCByZXByZXNlbnRzIGdlb2dyYXBoaWNhbAotICAgICAqIHJlZ2lvbi4gVGhlIGRlZmF1bHQgbG9jYWxlIGlzIHVzZWQgaWYgbG9jYWxlIGlzIG51bGwuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgYXZhaWxhYmxlIGZvbnQgZmFtaWx5IG5hbWVzIGZvciB0aGUgc3BlY2lmaWVkIAotICAgICAqIGxvY2FsZS4KKyAgICAgKiBAcGFyYW0gbG9jYWxlCisgICAgICogICAgICAgICAgICB0aGUgTG9jYWxlIG9iamVjdCB3aGljaCByZXByZXNlbnRzIGdlb2dyYXBoaWNhbCByZWdpb24uIFRoZQorICAgICAqICAgICAgICAgICAgZGVmYXVsdCBsb2NhbGUgaXMgdXNlZCBpZiBsb2NhbGUgaXMgbnVsbC4KKyAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBhdmFpbGFibGUgZm9udCBmYW1pbHkgbmFtZXMgZm9yIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgIGxvY2FsZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0QXZhaWxhYmxlRm9udEZhbWlseU5hbWVzKExvY2FsZSBsb2NhbGUpOwogCkBAIC0xOTIsMTggKzE5NSwxOCBAQAogICAgICAqIEdldHMgdGhlIGRlZmF1bHQgc2NyZWVuIGRldmljZSBhcyBHcmFwaGljRGV2aWNlIG9iamVjdC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBHcmFwaGljRGV2aWNlIG9iamVjdCB3aGljaCByZXByZXNlbnRzIGRlZmF1bHQgc2NyZWVuIGRldmljZS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIGlmIGlzSGVhZGxlc3MoKSByZXR1cm5zIHRydWUuCisgICAgICogQHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGlzSGVhZGxlc3MoKSByZXR1cm5zIHRydWUuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEdyYXBoaWNzRGV2aWNlIGdldERlZmF1bHRTY3JlZW5EZXZpY2UoKSB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb247CiAKICAgICAvKioKICAgICAgKiBHZXRzIGFuIGFycmF5IG9mIGFsbCBhdmFpbGFibGUgc2NyZWVuIGRldmljZXMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgR3JhcGhpY3NEZXZpY2Ugb2JnZWN0cyB3aGljaCByZXByZXNlbnRzIAotICAgICAqIGFsbCBhdmFpbGFibGUgc2NyZWVuIGRldmljZXMuCi0gICAgICogCi0gICAgICogQHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiBpZiBpc0hlYWRsZXNzKCkgcmV0dXJucyB0cnVlLgorICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIEdyYXBoaWNzRGV2aWNlIG9iamVjdHMgd2hpY2ggcmVwcmVzZW50cyBhbGwKKyAgICAgKiAgICAgICAgIGF2YWlsYWJsZSBzY3JlZW4gZGV2aWNlcy4KKyAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgaXNIZWFkbGVzcygpIHJldHVybnMgdHJ1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgR3JhcGhpY3NEZXZpY2VbXSBnZXRTY3JlZW5EZXZpY2VzKCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uOwogfQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L0hlYWRsZXNzRXhjZXB0aW9uLmphdmEgYi9hd3QvamF2YS9hd3QvSGVhZGxlc3NFeGNlcHRpb24uamF2YQppbmRleCAyOGU0NjNiLi5lYzExMWYxIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvSGVhZGxlc3NFeGNlcHRpb24uamF2YQorKysgYi9hd3QvamF2YS9hd3QvSGVhZGxlc3NFeGNlcHRpb24uamF2YQpAQCAtMTgsMTYgKzE4LDIxIEBACiAgKiBAYXV0aG9yIEFsZXhleSBBLiBQZXRyZW5rbwogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3Q7CiAKIC8qKgotICogVGhlIEhlYWRsZXNzRXhjZXB0aW9uIGNsYXNzIHByb3ZpZGVzIG5vdGlmaWNhdGlvbnMgYW5kIGVycm9yIG1lc3NhZ2VzIAotICogd2hlbiBjb2RlIHRoYXQgaXMgZGVwZW5kZW50IG9uIGEga2V5Ym9hcmQsIGRpc3BsYXksIG9yIG1vdXNlIGlzIGNhbGxlZCAKLSAqIGluIGFuIGVudmlyb25tZW50IHRoYXQgZG9lcyBub3Qgc3VwcG9ydCBhIGtleWJvYXJkLCBkaXNwbGF5LCBvciBtb3VzZS4KKyAqIFRoZSBIZWFkbGVzc0V4Y2VwdGlvbiBjbGFzcyBwcm92aWRlcyBub3RpZmljYXRpb25zIGFuZCBlcnJvciBtZXNzYWdlcyB3aGVuCisgKiBjb2RlIHRoYXQgaXMgZGVwZW5kZW50IG9uIGEga2V5Ym9hcmQsIGRpc3BsYXksIG9yIG1vdXNlIGlzIGNhbGxlZCBpbiBhbgorICogZW52aXJvbm1lbnQgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IGEga2V5Ym9hcmQsIGRpc3BsYXksIG9yIG1vdXNlLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEhlYWRsZXNzRXhjZXB0aW9uIGV4dGVuZHMgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gewotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgc2VyaWFsVmVyc2lvblVJRC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDE2NzE4MzY0NDk0NDM1ODU2M0w7CiAKICAgICAvKioKQEAgLTQwLDcgKzQ1LDggQEAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgaGVhZGxlc3MgZXhjZXB0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBtZXNzYWdlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBtc2cgdGhlIFN0cmluZyB3aGljaCByZXByZXNlbnRzIGVycm9yIG1lc3NhZ2UuIAorICAgICAqIEBwYXJhbSBtc2cKKyAgICAgKiAgICAgICAgICAgIHRoZSBTdHJpbmcgd2hpY2ggcmVwcmVzZW50cyBlcnJvciBtZXNzYWdlLgogICAgICAqLwogICAgIHB1YmxpYyBIZWFkbGVzc0V4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CiAgICAgICAgIHN1cGVyKG1zZyk7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvSGVhZGxlc3NHcmFwaGljc0Vudmlyb25tZW50LmphdmEgYi9hd3QvamF2YS9hd3QvSGVhZGxlc3NHcmFwaGljc0Vudmlyb25tZW50LmphdmEKaW5kZXggOTdmODhkMS4uMzA2MzkzZiAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L0hlYWRsZXNzR3JhcGhpY3NFbnZpcm9ubWVudC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9IZWFkbGVzc0dyYXBoaWNzRW52aXJvbm1lbnQuamF2YQpAQCAtMTQsNiArMTQsNyBAQAogICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLworCiBwYWNrYWdlIGphdmEuYXd0OwogCiBpbXBvcnQgamF2YS5hd3QuR3JhcGhpY3NEZXZpY2U7CkBAIC0yMywzMCArMjQsMzIgQEAKIAogLyoqCiAgKiBUaGUgSGVhZGxlc3NHcmFwaGljc0Vudmlyb25tZW50IGNsYXNzIGlzIHRoZSBDb21tb25HcmFwaGljc0Vudmlyb25tZW50Ci0gKiBpbXBsZW1lbnRhdGlvbiB0byB1c2UgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIGVudmlyb25tZW50IGxhY2tzIGRpc3BsYXksIAorICogaW1wbGVtZW50YXRpb24gdG8gdXNlIGluIHRoZSBjYXNlIHdoZXJlIHRoZSBlbnZpcm9ubWVudCBsYWNrcyBkaXNwbGF5LAogICoga2V5Ym9hcmQsIGFuZCBtb3VzZSBzdXBwb3J0LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEhlYWRsZXNzR3JhcGhpY3NFbnZpcm9ubWVudCBleHRlbmRzIENvbW1vbkdyYXBoaWNzRW52aXJvbm1lbnQgewotICAgIAorCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCBhIGRpc3BsYXksIGtleWJvYXJkLCBhbmQgbW91c2UgYXJlIHN1cHBvcnRlZCAKLSAgICAgKiBpbiB0aGlzIGdyYXBoaWNzIGVudmlyb25tZW50LgorICAgICAqIFJldHVybnMgd2hldGhlciBvciBub3QgYSBkaXNwbGF5LCBrZXlib2FyZCwgYW5kIG1vdXNlIGFyZSBzdXBwb3J0ZWQgaW4KKyAgICAgKiB0aGlzIGdyYXBoaWNzIGVudmlyb25tZW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgSGVhZGxlc3NFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24gZnJvbSBhcmVhcyBvZiAKLSAgICAgKiB0aGUgZ3JhcGhpY3MgZW52aXJvbm1lbnQgdGhhdCBhcmUgZGVwZW5kZW50IG9uIGEgZGlzcGxheSwga2V5Ym9hcmQsIAotICAgICAqIG9yIG1vdXNlOyBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlLCBpZiBIZWFkbGVzc0V4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBmcm9tIGFyZWFzIG9mIHRoZQorICAgICAqICAgICAgICAgZ3JhcGhpY3MgZW52aXJvbm1lbnQgdGhhdCBhcmUgZGVwZW5kZW50IG9uIGEgZGlzcGxheSwga2V5Ym9hcmQsCisgICAgICogICAgICAgICBvciBtb3VzZSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzSGVhZGxlc3NJbnN0YW5jZSgpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgZGVmYXVsdCBzY3JlZW4gZGV2aWNlIGFzIEdyYXBoaWNEZXZpY2Ugb2JqZWN0LgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIEdyYXBoaWNEZXZpY2Ugb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgZGVmYXVsdCBzY3JlZW4gZGV2aWNlLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24gaWYgaXNIZWFkbGVzcygpIHJldHVybnMgdHJ1ZS4KKyAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgaXNIZWFkbGVzcygpIHJldHVybnMgdHJ1ZS4KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgR3JhcGhpY3NEZXZpY2UgZ2V0RGVmYXVsdFNjcmVlbkRldmljZSgpIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiB7CkBAIC01NiwxMCArNTksMTAgQEAKICAgICAvKioKICAgICAgKiBHZXRzIGFuIGFycmF5IG9mIGFsbCBhdmFpbGFibGUgc2NyZWVuIGRldmljZXMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgR3JhcGhpY3NEZXZpY2Ugb2JqZWN0cyB3aGljaCByZXByZXNlbnRzIAotICAgICAqIGFsbCBhdmFpbGFibGUgc2NyZWVuIGRldmljZXMuCi0gICAgICogCi0gICAgICogQHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiBpZiBpc0hlYWRsZXNzKCkgcmV0dXJucyB0cnVlLgorICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIEdyYXBoaWNzRGV2aWNlIG9iamVjdHMgd2hpY2ggcmVwcmVzZW50cyBhbGwKKyAgICAgKiAgICAgICAgIGF2YWlsYWJsZSBzY3JlZW4gZGV2aWNlcy4KKyAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgaXNIZWFkbGVzcygpIHJldHVybnMgdHJ1ZS4KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgR3JhcGhpY3NEZXZpY2VbXSBnZXRTY3JlZW5EZXZpY2VzKCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9IZWFkbGVzc1Rvb2xraXQuamF2YSBiL2F3dC9qYXZhL2F3dC9IZWFkbGVzc1Rvb2xraXQuamF2YQppbmRleCBhN2RkNTU3Li5jNjRhODVhIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvSGVhZGxlc3NUb29sa2l0LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L0hlYWRsZXNzVG9vbGtpdC5qYXZhCkBAIC0yNiwxMzYgKzI2LDc1IEBACiAvL2ltcG9ydCBqYXZhLmF3dC5kbmQuSW52YWxpZERuRE9wZXJhdGlvbkV4Y2VwdGlvbjsKIC8vaW1wb3J0IGphdmEuYXd0LmRuZC5wZWVyLkRyYWdTb3VyY2VDb250ZXh0UGVlcjsKIGltcG9ydCBqYXZhLmF3dC5pbS5JbnB1dE1ldGhvZEhpZ2hsaWdodDsKLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5Db2xvck1vZGVsOwotLy9pbXBvcnQgamF2YS5hd3QucGVlci4qOworaW1wb3J0IGphdmEuYXd0LmltYWdlLkNvbG9yTW9kZWw7IC8vaW1wb3J0IGphdmEuYXd0LnBlZXIuKjsKIC8vaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VTdXBwb3J0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LkNvbXBvbmVudEludGVybmFsczsKLS8vaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuZGF0YXRyYW5zZmVyLkRUSzsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LkNvbXBvbmVudEludGVybmFsczsgLy9pbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5kYXRhdHJhbnNmZXIuRFRLOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3Qud3RrLkdyYXBoaWNzRmFjdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0Lnd0ay5OYXRpdmVFdmVudFF1ZXVlOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3Qud3RrLldpbmRvd0ZhY3Rvcnk7CiAKIC8qKgotICogVGhlIEhlYWRsZXNzVG9vbGtpdCBjbGFzcyBpcyBhIHN1YmNsYXNzIG9mIFRvb2xraXRJbXBsIHRvIAotICogYmUgdXNlZCBmb3IgZ3JhcGhpY2FsIGVudmlyb25tZW50cyB0aGF0IGxhY2sga2V5Ym9hcmQgYW5kIAotICogbW91c2UgY2FwYWJpbGl0aWVzLgorICogVGhlIEhlYWRsZXNzVG9vbGtpdCBjbGFzcyBpcyBhIHN1YmNsYXNzIG9mIFRvb2xraXRJbXBsIHRvIGJlIHVzZWQgZm9yCisgKiBncmFwaGljYWwgZW52aXJvbm1lbnRzIHRoYXQgbGFjayBrZXlib2FyZCBhbmQgbW91c2UgY2FwYWJpbGl0aWVzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEhlYWRsZXNzVG9vbGtpdCBleHRlbmRzIFRvb2xraXRJbXBsIHsKLSAgICAKLSAgICAvLz8/P0FXVAorCisgICAgLy8gPz8/QVdUCiAgICAgLyoKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQnV0dG9uUGVlciBjcmVhdGVCdXR0b24oQnV0dG9uIGEwKSB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgSGVhZGxlc3NFeGNlcHRpb24oKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIENoZWNrYm94UGVlciBjcmVhdGVDaGVja2JveChDaGVja2JveCBhMCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIENoZWNrYm94TWVudUl0ZW1QZWVyIGNyZWF0ZUNoZWNrYm94TWVudUl0ZW0oQ2hlY2tib3hNZW51SXRlbSBhMCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBDaG9pY2VQZWVyIGNyZWF0ZUNob2ljZShDaG9pY2UgYTApIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBIZWFkbGVzc0V4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBDdXJzb3IgY3JlYXRlQ3VzdG9tQ3Vyc29yKEltYWdlIGltZywgUG9pbnQgaG90U3BvdCwgU3RyaW5nIG5hbWUpCi0gICAgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIERpYWxvZ1BlZXIgY3JlYXRlRGlhbG9nKERpYWxvZyBhMCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIDxUIGV4dGVuZHMgRHJhZ0dlc3R1cmVSZWNvZ25pemVyPiBUIGNyZWF0ZURyYWdHZXN0dXJlUmVjb2duaXplcigKLSAgICAgICAgICAgIENsYXNzPFQ+IHJlY29nbml6ZXJBYnN0cmFjdENsYXNzLCBEcmFnU291cmNlIGRzLCBDb21wb25lbnQgYywgaW50IHNyY0FjdGlvbnMsCi0gICAgICAgICAgICBEcmFnR2VzdHVyZUxpc3RlbmVyIGRnbCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRHJhZ1NvdXJjZUNvbnRleHRQZWVyIGNyZWF0ZURyYWdTb3VyY2VDb250ZXh0UGVlcihEcmFnR2VzdHVyZUV2ZW50IGRnZSkKLSAgICB0aHJvd3MgSW52YWxpZERuRE9wZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBJbnZhbGlkRG5ET3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEZpbGVEaWFsb2dQZWVyIGNyZWF0ZUZpbGVEaWFsb2coRmlsZURpYWxvZyBhMCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEZyYW1lUGVlciBjcmVhdGVGcmFtZShGcmFtZSBhMCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIExhYmVsUGVlciBjcmVhdGVMYWJlbChMYWJlbCBhMCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIExpc3RQZWVyIGNyZWF0ZUxpc3QoTGlzdCBhMCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIE1lbnVQZWVyIGNyZWF0ZU1lbnUoTWVudSBhMCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIE1lbnVCYXJQZWVyIGNyZWF0ZU1lbnVCYXIoTWVudUJhciBhMCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIE1lbnVJdGVtUGVlciBjcmVhdGVNZW51SXRlbShNZW51SXRlbSBhMCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFBvcHVwTWVudVBlZXIgY3JlYXRlUG9wdXBNZW51KFBvcHVwTWVudSBhMCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFNjcm9sbGJhclBlZXIgY3JlYXRlU2Nyb2xsYmFyKFNjcm9sbGJhciBhMCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFNjcm9sbFBhbmVQZWVyIGNyZWF0ZVNjcm9sbFBhbmUoU2Nyb2xsUGFuZSBhMCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFRleHRBcmVhUGVlciBjcmVhdGVUZXh0QXJlYShUZXh0QXJlYSBhMCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFRleHRGaWVsZFBlZXIgY3JlYXRlVGV4dEZpZWxkKFRleHRGaWVsZCBhMCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFdpbmRvd1BlZXIgY3JlYXRlV2luZG93KFdpbmRvdyBhMCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7Ci0gICAgfQotICAgICovCisgICAgICogQE92ZXJyaWRlIHByb3RlY3RlZCBCdXR0b25QZWVyIGNyZWF0ZUJ1dHRvbihCdXR0b24gYTApIHRocm93cworICAgICAqIEhlYWRsZXNzRXhjZXB0aW9uIHsgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7IH0KKyAgICAgKiBAT3ZlcnJpZGUgcHJvdGVjdGVkIENoZWNrYm94UGVlciBjcmVhdGVDaGVja2JveChDaGVja2JveCBhMCkgdGhyb3dzCisgICAgICogSGVhZGxlc3NFeGNlcHRpb24geyB0aHJvdyBuZXcgSGVhZGxlc3NFeGNlcHRpb24oKTsgfQorICAgICAqIEBPdmVycmlkZSBwcm90ZWN0ZWQgQ2hlY2tib3hNZW51SXRlbVBlZXIKKyAgICAgKiBjcmVhdGVDaGVja2JveE1lbnVJdGVtKENoZWNrYm94TWVudUl0ZW0gYTApIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiB7CisgICAgICogdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7IH0KKyAgICAgKiBAT3ZlcnJpZGUgcHJvdGVjdGVkIENob2ljZVBlZXIgY3JlYXRlQ2hvaWNlKENob2ljZSBhMCkgdGhyb3dzCisgICAgICogSGVhZGxlc3NFeGNlcHRpb24geyB0aHJvdyBuZXcgSGVhZGxlc3NFeGNlcHRpb24oKTsgfSBwdWJsaWMgQ3Vyc29yCisgICAgICogY3JlYXRlQ3VzdG9tQ3Vyc29yKEltYWdlIGltZywgUG9pbnQgaG90U3BvdCwgU3RyaW5nIG5hbWUpIHRocm93cworICAgICAqIEhlYWRsZXNzRXhjZXB0aW9uIHsgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7IH0KKyAgICAgKiBAT3ZlcnJpZGUgcHJvdGVjdGVkIERpYWxvZ1BlZXIgY3JlYXRlRGlhbG9nKERpYWxvZyBhMCkgdGhyb3dzCisgICAgICogSGVhZGxlc3NFeGNlcHRpb24geyB0aHJvdyBuZXcgSGVhZGxlc3NFeGNlcHRpb24oKTsgfQorICAgICAqIEBPdmVycmlkZSBwdWJsaWMgPFQgZXh0ZW5kcyBEcmFnR2VzdHVyZVJlY29nbml6ZXI+IFQKKyAgICAgKiBjcmVhdGVEcmFnR2VzdHVyZVJlY29nbml6ZXIoIENsYXNzPFQ+IHJlY29nbml6ZXJBYnN0cmFjdENsYXNzLCBEcmFnU291cmNlCisgICAgICogZHMsIENvbXBvbmVudCBjLCBpbnQgc3JjQWN0aW9ucywgRHJhZ0dlc3R1cmVMaXN0ZW5lciBkZ2wpIHsgcmV0dXJuIG51bGw7CisgICAgICogfQorICAgICAqIEBPdmVycmlkZSBwdWJsaWMgRHJhZ1NvdXJjZUNvbnRleHRQZWVyCisgICAgICogY3JlYXRlRHJhZ1NvdXJjZUNvbnRleHRQZWVyKERyYWdHZXN0dXJlRXZlbnQgZGdlKSB0aHJvd3MKKyAgICAgKiBJbnZhbGlkRG5ET3BlcmF0aW9uRXhjZXB0aW9uIHsgdGhyb3cgbmV3IEludmFsaWREbkRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgKiB9CisgICAgICogQE92ZXJyaWRlIHByb3RlY3RlZCBGaWxlRGlhbG9nUGVlciBjcmVhdGVGaWxlRGlhbG9nKEZpbGVEaWFsb2cgYTApIHRocm93cworICAgICAqIEhlYWRsZXNzRXhjZXB0aW9uIHsgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7IH0KKyAgICAgKiBAT3ZlcnJpZGUgcHJvdGVjdGVkIEZyYW1lUGVlciBjcmVhdGVGcmFtZShGcmFtZSBhMCkgdGhyb3dzCisgICAgICogSGVhZGxlc3NFeGNlcHRpb24geyB0aHJvdyBuZXcgSGVhZGxlc3NFeGNlcHRpb24oKTsgfQorICAgICAqIEBPdmVycmlkZSBwcm90ZWN0ZWQgTGFiZWxQZWVyIGNyZWF0ZUxhYmVsKExhYmVsIGEwKSB0aHJvd3MKKyAgICAgKiBIZWFkbGVzc0V4Y2VwdGlvbiB7IHRocm93IG5ldyBIZWFkbGVzc0V4Y2VwdGlvbigpOyB9CisgICAgICogQE92ZXJyaWRlIHByb3RlY3RlZCBMaXN0UGVlciBjcmVhdGVMaXN0KExpc3QgYTApIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbgorICAgICAqIHsgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7IH0KKyAgICAgKiBAT3ZlcnJpZGUgcHJvdGVjdGVkIE1lbnVQZWVyIGNyZWF0ZU1lbnUoTWVudSBhMCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uCisgICAgICogeyB0aHJvdyBuZXcgSGVhZGxlc3NFeGNlcHRpb24oKTsgfQorICAgICAqIEBPdmVycmlkZSBwcm90ZWN0ZWQgTWVudUJhclBlZXIgY3JlYXRlTWVudUJhcihNZW51QmFyIGEwKSB0aHJvd3MKKyAgICAgKiBIZWFkbGVzc0V4Y2VwdGlvbiB7IHRocm93IG5ldyBIZWFkbGVzc0V4Y2VwdGlvbigpOyB9CisgICAgICogQE92ZXJyaWRlIHByb3RlY3RlZCBNZW51SXRlbVBlZXIgY3JlYXRlTWVudUl0ZW0oTWVudUl0ZW0gYTApIHRocm93cworICAgICAqIEhlYWRsZXNzRXhjZXB0aW9uIHsgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7IH0KKyAgICAgKiBAT3ZlcnJpZGUgcHJvdGVjdGVkIFBvcHVwTWVudVBlZXIgY3JlYXRlUG9wdXBNZW51KFBvcHVwTWVudSBhMCkgdGhyb3dzCisgICAgICogSGVhZGxlc3NFeGNlcHRpb24geyB0aHJvdyBuZXcgSGVhZGxlc3NFeGNlcHRpb24oKTsgfQorICAgICAqIEBPdmVycmlkZSBwcm90ZWN0ZWQgU2Nyb2xsYmFyUGVlciBjcmVhdGVTY3JvbGxiYXIoU2Nyb2xsYmFyIGEwKSB0aHJvd3MKKyAgICAgKiBIZWFkbGVzc0V4Y2VwdGlvbiB7IHRocm93IG5ldyBIZWFkbGVzc0V4Y2VwdGlvbigpOyB9CisgICAgICogQE92ZXJyaWRlIHByb3RlY3RlZCBTY3JvbGxQYW5lUGVlciBjcmVhdGVTY3JvbGxQYW5lKFNjcm9sbFBhbmUgYTApIHRocm93cworICAgICAqIEhlYWRsZXNzRXhjZXB0aW9uIHsgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7IH0KKyAgICAgKiBAT3ZlcnJpZGUgcHJvdGVjdGVkIFRleHRBcmVhUGVlciBjcmVhdGVUZXh0QXJlYShUZXh0QXJlYSBhMCkgdGhyb3dzCisgICAgICogSGVhZGxlc3NFeGNlcHRpb24geyB0aHJvdyBuZXcgSGVhZGxlc3NFeGNlcHRpb24oKTsgfQorICAgICAqIEBPdmVycmlkZSBwcm90ZWN0ZWQgVGV4dEZpZWxkUGVlciBjcmVhdGVUZXh0RmllbGQoVGV4dEZpZWxkIGEwKSB0aHJvd3MKKyAgICAgKiBIZWFkbGVzc0V4Y2VwdGlvbiB7IHRocm93IG5ldyBIZWFkbGVzc0V4Y2VwdGlvbigpOyB9CisgICAgICogQE92ZXJyaWRlIHByb3RlY3RlZCBXaW5kb3dQZWVyIGNyZWF0ZVdpbmRvdyhXaW5kb3cgYTApIHRocm93cworICAgICAqIEhlYWRsZXNzRXhjZXB0aW9uIHsgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7IH0KKyAgICAgKi8KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBEaW1lbnNpb24gZ2V0QmVzdEN1cnNvclNpemUoaW50IHByZWZXaWR0aCwgaW50IHByZWZIZWlnaHQpIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiB7CkBAIC0xODYsMjUgKzEyNSwxOCBAQAogICAgIHB1YmxpYyBpbnQgZ2V0TWVudVNob3J0Y3V0S2V5TWFzaygpIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiB7CiAgICAgICAgIHRocm93IG5ldyBIZWFkbGVzc0V4Y2VwdGlvbigpOwogICAgIH0KLSAgICAKLSAgICAvLz8/P0FXVAorCisgICAgLy8gPz8/QVdUCiAgICAgLyoKLSAgICBAT3ZlcnJpZGUKLSAgICBOYXRpdmVFdmVudFF1ZXVlIGdldE5hdGl2ZUV2ZW50UXVldWUoKSB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgSGVhZGxlc3NFeGNlcHRpb24oKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFByaW50Sm9iIGdldFByaW50Sm9iKEZyYW1lIGZyYW1lLCBTdHJpbmcgam9idGl0bGUsIEpvYkF0dHJpYnV0ZXMgam9iQXR0cmlidXRlcywgCi0gICAgICAgICAgICBQYWdlQXR0cmlidXRlcyBwYWdlQXR0cmlidXRlcykgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsgICAgICAgIAotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUHJpbnRKb2IgZ2V0UHJpbnRKb2IoRnJhbWUgZnJhbWUsIFN0cmluZyBqb2J0aXRsZSwgUHJvcGVydGllcyBwcm9wcykgdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uICB7Ci0gICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgIH0KLSAgICAqLworICAgICAqIEBPdmVycmlkZSBOYXRpdmVFdmVudFF1ZXVlIGdldE5hdGl2ZUV2ZW50UXVldWUoKSB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24KKyAgICAgKiB7IHRocm93IG5ldyBIZWFkbGVzc0V4Y2VwdGlvbigpOyB9CisgICAgICogQE92ZXJyaWRlIHB1YmxpYyBQcmludEpvYiBnZXRQcmludEpvYihGcmFtZSBmcmFtZSwgU3RyaW5nIGpvYnRpdGxlLAorICAgICAqIEpvYkF0dHJpYnV0ZXMgam9iQXR0cmlidXRlcywgUGFnZUF0dHJpYnV0ZXMgcGFnZUF0dHJpYnV0ZXMpIHRocm93cworICAgICAqIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7IHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsgfQorICAgICAqIEBPdmVycmlkZSBwdWJsaWMgUHJpbnRKb2IgZ2V0UHJpbnRKb2IoRnJhbWUgZnJhbWUsIFN0cmluZyBqb2J0aXRsZSwKKyAgICAgKiBQcm9wZXJ0aWVzIHByb3BzKSB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24geyB0aHJvdyBuZXcKKyAgICAgKiBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOyB9CisgICAgICovCiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgSW5zZXRzIGdldFNjcmVlbkluc2V0cyhHcmFwaGljc0NvbmZpZ3VyYXRpb24gZ2MpIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiB7CkBAIC0yMTQsNDQgKzE0NiwzNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0U2NyZWVuUmVzb2x1dGlvbigpIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiB7CiAgICAgICAgIHRocm93IG5ldyBIZWFkbGVzc0V4Y2VwdGlvbigpOwotICAgIH0gICAgCisgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIERpbWVuc2lvbiBnZXRTY3JlZW5TaXplKCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKICAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7CiAgICAgfQotICAgIAotICAgIC8vPz8/QVdUCisKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDbGlwYm9hcmQgZ2V0U3lzdGVtQ2xpcGJvYXJkKCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEhlYWRsZXNzRXhjZXB0aW9uKCk7Ci0gICAgfSAgICAKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ2xpcGJvYXJkIGdldFN5c3RlbVNlbGVjdGlvbigpIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBIZWFkbGVzc0V4Y2VwdGlvbigpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBXaW5kb3dGYWN0b3J5IGdldFdpbmRvd0ZhY3RvcnkoKSB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgSGVhZGxlc3NFeGNlcHRpb24oKTsKLSAgICB9Ci0gICAgKi8KKyAgICAgKiBAT3ZlcnJpZGUgcHVibGljIENsaXBib2FyZCBnZXRTeXN0ZW1DbGlwYm9hcmQoKSB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24KKyAgICAgKiB7IHRocm93IG5ldyBIZWFkbGVzc0V4Y2VwdGlvbigpOyB9CisgICAgICogQE92ZXJyaWRlIHB1YmxpYyBDbGlwYm9hcmQgZ2V0U3lzdGVtU2VsZWN0aW9uKCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uCisgICAgICogeyB0aHJvdyBuZXcgSGVhZGxlc3NFeGNlcHRpb24oKTsgfQorICAgICAqIEBPdmVycmlkZSBXaW5kb3dGYWN0b3J5IGdldFdpbmRvd0ZhY3RvcnkoKSB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24geworICAgICAqIHRocm93IG5ldyBIZWFkbGVzc0V4Y2VwdGlvbigpOyB9CisgICAgICovCiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewogICAgICAgICBsb2NrQVdUKCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBDb21wb25lbnRJbnRlcm5hbHMuc2V0Q29tcG9uZW50SW50ZXJuYWxzKG5ldyBDb21wb25lbnRJbnRlcm5hbHNJbXBsKCkpOwotICAgICAgICAgICAgLy8/Pz9BV1Q6IG5ldyBFdmVudFF1ZXVlKHRoaXMpOyAvLyBjcmVhdGUgdGhlIHN5c3RlbSBFdmVudFF1ZXVlCi0gICAgICAgICAgICAvLz8/P0FXVDogZGlzcGF0Y2hlciA9IG5ldyBEaXNwYXRjaGVyKHRoaXMpOworICAgICAgICAgICAgLy8gPz8/QVdUOiBuZXcgRXZlbnRRdWV1ZSh0aGlzKTsgLy8gY3JlYXRlIHRoZSBzeXN0ZW0gRXZlbnRRdWV1ZQorICAgICAgICAgICAgLy8gPz8/QVdUOiBkaXNwYXRjaGVyID0gbmV3IERpc3BhdGNoZXIodGhpcyk7CiAgICAgICAgICAgICBkZXNrdG9wUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICAgICAgLy8/Pz9BV1Q6IGRlc2t0b3BQcm9wc1N1cHBvcnQgPSBuZXcgUHJvcGVydHlDaGFuZ2VTdXBwb3J0KHRoaXMpOwotLy8gICAgICAgICAgPz8/QVdUOiBhd3RFdmVudHNNYW5hZ2VyID0gbmV3IEFXVEV2ZW50c01hbmFnZXIoKTsKLS8vICAgICAgICAgID8/P0FXVDogZGlzcGF0Y2hUaHJlYWQgPSBuZXcgSGVhZGxlc3NFdmVudERpc3BhdGNoVGhyZWFkKHRoaXMsIGRpc3BhdGNoZXIpOyAgICAgICAgICAgIAotLy8gICAgICAgICAgPz8/QVdUOiBkdGsgPSBEVEsuZ2V0RFRLKCk7Ci0gICAgICAgICAgICBkaXNwYXRjaFRocmVhZC5zdGFydCgpOyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gPz8/QVdUOiBkZXNrdG9wUHJvcHNTdXBwb3J0ID0gbmV3IFByb3BlcnR5Q2hhbmdlU3VwcG9ydCh0aGlzKTsKKyAgICAgICAgICAgIC8vID8/P0FXVDogYXd0RXZlbnRzTWFuYWdlciA9IG5ldyBBV1RFdmVudHNNYW5hZ2VyKCk7CisgICAgICAgICAgICAvLyA/Pz9BV1Q6IGRpc3BhdGNoVGhyZWFkID0gbmV3IEhlYWRsZXNzRXZlbnREaXNwYXRjaFRocmVhZCh0aGlzLAorICAgICAgICAgICAgLy8gZGlzcGF0Y2hlcik7CisgICAgICAgICAgICAvLyA/Pz9BV1Q6IGR0ayA9IERUSy5nZXREVEsoKTsKKyAgICAgICAgICAgIGRpc3BhdGNoVGhyZWFkLnN0YXJ0KCk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICB1bmxvY2tBV1QoKTsKICAgICAgICAgfQpAQCAtMjg0LDggKzIwOSw4IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgTWFwPGphdmEuYXd0LmZvbnQuVGV4dEF0dHJpYnV0ZSwgPz4gbWFwSW5wdXRNZXRob2RIaWdobGlnaHRJbXBsKAotICAgICAgICAgICAgSW5wdXRNZXRob2RIaWdobGlnaHQgaGlnaGxpZ2h0KSB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24geworICAgIE1hcDxqYXZhLmF3dC5mb250LlRleHRBdHRyaWJ1dGUsID8+IG1hcElucHV0TWV0aG9kSGlnaGxpZ2h0SW1wbChJbnB1dE1ldGhvZEhpZ2hsaWdodCBoaWdobGlnaHQpCisgICAgICAgICAgICB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24gewogICAgICAgICB0aHJvdyBuZXcgSGVhZGxlc3NFeGNlcHRpb24oKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9JbGxlZ2FsQ29tcG9uZW50U3RhdGVFeGNlcHRpb24uamF2YSBiL2F3dC9qYXZhL2F3dC9JbGxlZ2FsQ29tcG9uZW50U3RhdGVFeGNlcHRpb24uamF2YQppbmRleCAyMWRjMzVmLi5iZWQxNzI5IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvSWxsZWdhbENvbXBvbmVudFN0YXRlRXhjZXB0aW9uLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L0lsbGVnYWxDb21wb25lbnRTdGF0ZUV4Y2VwdGlvbi5qYXZhCkBAIC0xOCwzNCArMTgsMzggQEAKICAqIEBhdXRob3IgTWljaGFlbCBEYW5pbG92CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dDsKIAogLyoqCi0gKiBUaGUgSWxsZWdhbENvbXBvbmVudFN0YXRlRXhjZXB0aW9uIGNsYXNzIGlzIHVzZWQgdG8gcHJvdmlkZSAKLSAqIG5vdGlmaWNhdGlvbiB0aGF0IEFXVCBjb21wb25lbnQgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIAotICogZm9yIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uLgorICogVGhlIElsbGVnYWxDb21wb25lbnRTdGF0ZUV4Y2VwdGlvbiBjbGFzcyBpcyB1c2VkIHRvIHByb3ZpZGUgbm90aWZpY2F0aW9uIHRoYXQKKyAqIEFXVCBjb21wb25lbnQgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbi4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBJbGxlZ2FsQ29tcG9uZW50U3RhdGVFeGNlcHRpb24gZXh0ZW5kcyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewogCi0gICAgLyoqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xODg5MzM5NTg3MjA4MTQ0MjM4TDsKIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJbGxlZ2FsQ29tcG9uZW50U3RhdGVFeGNlcHRpb24gd2l0aAotICAgICAqIHRoZSBzcGVjaWZpZWQgbWVzc2FnZS4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgSWxsZWdhbENvbXBvbmVudFN0YXRlRXhjZXB0aW9uIHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIG1lc3NhZ2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIHMgdGhlIFN0cmluZyBtZXNzYWdlIHdoaWNoIGRlc2NyaWJlcyB0aGUgZXhjZXB0aW9uLgorICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICB0aGUgU3RyaW5nIG1lc3NhZ2Ugd2hpY2ggZGVzY3JpYmVzIHRoZSBleGNlcHRpb24uCiAgICAgICovCiAgICAgcHVibGljIElsbGVnYWxDb21wb25lbnRTdGF0ZUV4Y2VwdGlvbihTdHJpbmcgcykgewogICAgICAgICBzdXBlcihzKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgSWxsZWdhbENvbXBvbmVudFN0YXRlRXhjZXB0aW9uIHdpdGhvdXQKLSAgICAgKiBkZXRhaWxlZCBtZXNzYWdlLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJbGxlZ2FsQ29tcG9uZW50U3RhdGVFeGNlcHRpb24gd2l0aG91dCBkZXRhaWxlZAorICAgICAqIG1lc3NhZ2UuCiAgICAgICovCiAgICAgcHVibGljIElsbGVnYWxDb21wb25lbnRTdGF0ZUV4Y2VwdGlvbigpIHsKICAgICB9CiAKIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L0ltYWdlLmphdmEgYi9hd3QvamF2YS9hd3QvSW1hZ2UuamF2YQppbmRleCBjMjE3ZTM4Li43YWUzZWQ4IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvSW1hZ2UuamF2YQorKysgYi9hd3QvamF2YS9hd3QvSW1hZ2UuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBJZ29yIFYuIFN0b2x5YXJvdgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3Q7CiAKIGltcG9ydCBqYXZhLmF3dC5pbWFnZS5BcmVhQXZlcmFnaW5nU2NhbGVGaWx0ZXI7CkBAIC0zMCw2NCArMzEsNjcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBUaGUgSW1hZ2UgYWJzdHJhY3QgY2xhc3MgcmVwcmVzZW50cyB0aGUgZ3JhcGhpYyBpbWFnZXMuIAorICogVGhlIEltYWdlIGFic3RyYWN0IGNsYXNzIHJlcHJlc2VudHMgdGhlIGdyYXBoaWMgaW1hZ2VzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEltYWdlIHsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgVW5kZWZpbmVkUHJvcGVydHkgb2JqZWN0IHNob3VsZCBiZSByZXR1cm5lZCBpZgotICAgICAqIHByb3BlcnR5IGlzIG5vdCBkZWZpbmVkIGZvciBhIHBhcnRpY3VsYXIgaW1hZ2UuIAorICAgIC8qKgorICAgICAqIFRoZSBVbmRlZmluZWRQcm9wZXJ0eSBvYmplY3Qgc2hvdWxkIGJlIHJldHVybmVkIGlmIHByb3BlcnR5IGlzIG5vdAorICAgICAqIGRlZmluZWQgZm9yIGEgcGFydGljdWxhciBpbWFnZS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBVbmRlZmluZWRQcm9wZXJ0eSA9IG5ldyBPYmplY3QoKTsgIC8vJE5PTi1MT0NLLTEkCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVW5kZWZpbmVkUHJvcGVydHkgPSBuZXcgT2JqZWN0KCk7IC8vICROT04tTE9DSy0xJAogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBTQ0FMRV9ERUZBVUxUIGluZGljYXRlcyB0aGUgZGVmYXVsdCBpbWFnZQotICAgICAqIHNjYWxpbmcgYWxnb3JpdGhtLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgU0NBTEVfREVGQVVMVCBpbmRpY2F0ZXMgdGhlIGRlZmF1bHQgaW1hZ2Ugc2NhbGluZyBhbGdvcml0aG0uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NBTEVfREVGQVVMVCA9IDE7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFNDQUxFX0ZBU1QgaW5kaWNhdGVzIGFuIGltYWdlIHNjYWxpbmcgYWxnb3JpdGhtIHdoaWNoIAotICAgICAqIHBsYWNlcyBhIGhpZ2hlciBwcmlvcml0eSBvbiBzY2FsaW5nIHNwZWVkIHRoYW4gb24gdGhlIGltYWdlJ3Mgc21vb3RobmVzcy4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFNDQUxFX0ZBU1QgaW5kaWNhdGVzIGFuIGltYWdlIHNjYWxpbmcgYWxnb3JpdGhtIHdoaWNoIHBsYWNlcworICAgICAqIGEgaGlnaGVyIHByaW9yaXR5IG9uIHNjYWxpbmcgc3BlZWQgdGhhbiBvbiB0aGUgaW1hZ2UncyBzbW9vdGhuZXNzLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDQUxFX0ZBU1QgPSAyOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBTQ0FMRV9TTU9PVEggaW5kaWNhdGVzIGFuIGltYWdlIHNjYWxpbmcgYWxnb3JpdGhtIHdoaWNoIAotICAgICAqIHBsYWNlcyBhIGhpZ2hlciBwcmlvcml0eSBvbiBpbWFnZSBzbW9vdGhuZXNzIHRoYW4gb24gc2NhbGluZyBzcGVlZC4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFNDQUxFX1NNT09USCBpbmRpY2F0ZXMgYW4gaW1hZ2Ugc2NhbGluZyBhbGdvcml0aG0gd2hpY2gKKyAgICAgKiBwbGFjZXMgYSBoaWdoZXIgcHJpb3JpdHkgb24gaW1hZ2Ugc21vb3RobmVzcyB0aGFuIG9uIHNjYWxpbmcgc3BlZWQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NBTEVfU01PT1RIID0gNDsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgU0NBTEVfUkVQTElDQVRFIGluZGljYXRlcyB0aGUgaW1hZ2Ugc2NhbGluZyAKLSAgICAgKiBhbGdvcml0aG0gaW4gdGhlIFJlcGxpY2F0ZVNjYWxlRmlsdGVyIGNsYXNzLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgU0NBTEVfUkVQTElDQVRFIGluZGljYXRlcyB0aGUgaW1hZ2Ugc2NhbGluZyBhbGdvcml0aG0gaW4gdGhlCisgICAgICogUmVwbGljYXRlU2NhbGVGaWx0ZXIgY2xhc3MuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NBTEVfUkVQTElDQVRFID0gODsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgU0NBTEVfQVJFQV9BVkVSQUdJTkcgaW5kaWNhdGVzICAKLSAgICAgKiB0aGUgYXJlYSBhdmVyYWdpbmcgaW1hZ2Ugc2NhbGluZyBhbGdvcml0aG0uIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBTQ0FMRV9BUkVBX0FWRVJBR0lORyBpbmRpY2F0ZXMgdGhlIGFyZWEgYXZlcmFnaW5nIGltYWdlCisgICAgICogc2NhbGluZyBhbGdvcml0aG0uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NBTEVfQVJFQV9BVkVSQUdJTkcgPSAxNjsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgYWNjZWxlcmF0aW9uIHByaW9yaXR5IGluZGljYXRlcyBpbWFnZSBhY2NlbGVyYXRpb24uICAgCisgICAgLyoqCisgICAgICogVGhlIGFjY2VsZXJhdGlvbiBwcmlvcml0eSBpbmRpY2F0ZXMgaW1hZ2UgYWNjZWxlcmF0aW9uLgogICAgICAqLwogICAgIHByb3RlY3RlZCBmbG9hdCBhY2NlbGVyYXRpb25Qcmlvcml0eSA9IDAuNWY7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGNhcGFiaWxpdGllcy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgY2FwYWJpbGl0aWVzLgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlQ2FwYWJpbGl0aWVzIGNhcGFiaWxpdGllcyA9IG5ldyBJbWFnZUNhcGFiaWxpdGllcyhmYWxzZSk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBpbWFnZSBwcm9wZXJ0eSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLSAgICAgKiBUaGUgVW5kZWZpbmVkUHJvcGVydHkgb2JqZWN0IHNob3VsZCBiZSByZXR1cm4gaWYgdGhlIHByb3BlcnR5IGlzIAotICAgICAqIG5vdCBzcGVjaWZpZWQgZm9yIHRoaXMgaW1hZ2UuICBUaGUgcmV0dXJuIHZhbHVlIHNob3VsZCBiZSBudWxsIGlmIHRoZQotICAgICAqIHByb3BlcnR5IGlzIGN1cnJlbnRseSB1bmtub3duIHlldCBhbmQgdGhlIHNwZWNpZmllZCBJbWFnZU9ic2VydmVyIGlzCi0gICAgICogdG8gYmUgbm90aWZpZWQgbGF0ZXIuIAorICAgICAqIEdldHMgdGhlIGltYWdlIHByb3BlcnR5IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUaGUgVW5kZWZpbmVkUHJvcGVydHkKKyAgICAgKiBvYmplY3Qgc2hvdWxkIGJlIHJldHVybiBpZiB0aGUgcHJvcGVydHkgaXMgbm90IHNwZWNpZmllZCBmb3IgdGhpcyBpbWFnZS4KKyAgICAgKiBUaGUgcmV0dXJuIHZhbHVlIHNob3VsZCBiZSBudWxsIGlmIHRoZSBwcm9wZXJ0eSBpcyBjdXJyZW50bHkgdW5rbm93biB5ZXQKKyAgICAgKiBhbmQgdGhlIHNwZWNpZmllZCBJbWFnZU9ic2VydmVyIGlzIHRvIGJlIG5vdGlmaWVkIGxhdGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIGltYWdlJ3MgcHJvcGVydHkuCi0gICAgICogQHBhcmFtIG9ic2VydmVyIHRoZSBJbWFnZU9ic2VydmVyLgotICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiBpbWFnZSdzIHByb3BlcnR5LgorICAgICAqIEBwYXJhbSBvYnNlcnZlcgorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlT2JzZXJ2ZXIuCiAgICAgICogQHJldHVybiB0aGUgT2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBuYW1lLCBJbWFnZU9ic2VydmVyIG9ic2VydmVyKTsKQEAgLTEwMCwzOSArMTA0LDQwIEBACiAgICAgcHVibGljIGFic3RyYWN0IEltYWdlUHJvZHVjZXIgZ2V0U291cmNlKCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB3aWR0aCBvZiB0aGlzIGltYWdlLiBUaGUgc3BlY2lmaWVkIEltYWdlT2JzZXJ2ZXIgb2JqZWN0IAotICAgICAqIGlzIG5vdGlmaWVkIHdoZW4gdGhlIHdpZHRoIG9mIHRoaXMgaW1hZ2UgaXMgYXZhaWxhYmxlLgorICAgICAqIEdldHMgdGhlIHdpZHRoIG9mIHRoaXMgaW1hZ2UuIFRoZSBzcGVjaWZpZWQgSW1hZ2VPYnNlcnZlciBvYmplY3QgaXMKKyAgICAgKiBub3RpZmllZCB3aGVuIHRoZSB3aWR0aCBvZiB0aGlzIGltYWdlIGlzIGF2YWlsYWJsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JzZXJ2ZXIgdGhlIEltYWdlT2JzZXJ2ZXIgb2JqZWN0IHdoaWNoIGlzIAotICAgICAqIGlzIG5vdGlmaWVkIHdoZW4gdGhlIHdpZHRoIG9mIHRoaXMgaW1hZ2UgaXMgYXZhaWxhYmxlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHdpZHRoIG9mIGltYWdlLCBvciAtMSBpZiB0aGUgd2lkdGggb2YgdGhpcyBpbWFnZSAKLSAgICAgKiBpcyBub3QgYXZhaWxhYmxlLgorICAgICAqIEBwYXJhbSBvYnNlcnZlcgorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlT2JzZXJ2ZXIgb2JqZWN0IHdoaWNoIGlzIGlzIG5vdGlmaWVkIHdoZW4gdGhlIHdpZHRoCisgICAgICogICAgICAgICAgICBvZiB0aGlzIGltYWdlIGlzIGF2YWlsYWJsZS4KKyAgICAgKiBAcmV0dXJuIHRoZSB3aWR0aCBvZiBpbWFnZSwgb3IgLTEgaWYgdGhlIHdpZHRoIG9mIHRoaXMgaW1hZ2UgaXMgbm90CisgICAgICogICAgICAgICBhdmFpbGFibGUuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRXaWR0aChJbWFnZU9ic2VydmVyIG9ic2VydmVyKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGhlaWdodCBvZiB0aGlzIGltYWdlLiBUaGUgc3BlY2lmaWVkIEltYWdlT2JzZXJ2ZXIgb2JqZWN0IAotICAgICAqIGlzIG5vdGlmaWVkIHdoZW4gdGhlIGhlaWdodCBvZiB0aGlzIGltYWdlIGlzIGF2YWlsYWJsZS4KKyAgICAgKiBHZXRzIHRoZSBoZWlnaHQgb2YgdGhpcyBpbWFnZS4gVGhlIHNwZWNpZmllZCBJbWFnZU9ic2VydmVyIG9iamVjdCBpcworICAgICAqIG5vdGlmaWVkIHdoZW4gdGhlIGhlaWdodCBvZiB0aGlzIGltYWdlIGlzIGF2YWlsYWJsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JzZXJ2ZXIgdGhlIEltYWdlT2JzZXJ2ZXIgb2JqZWN0IHdoaWNoIGlzIAotICAgICAqIGlzIG5vdGlmaWVkIHdoZW4gdGhlIGhlaWdodCBvZiB0aGlzIGltYWdlIGlzIGF2YWlsYWJsZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBoZWlnaHQgb2YgaW1hZ2UsIG9yIC0xIGlmIHRoZSBoZWlnaHQgb2YgdGhpcyBpbWFnZSAKLSAgICAgKiBpcyBub3QgYXZhaWxhYmxlLgorICAgICAqIEBwYXJhbSBvYnNlcnZlcgorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlT2JzZXJ2ZXIgb2JqZWN0IHdoaWNoIGlzIGlzIG5vdGlmaWVkIHdoZW4gdGhlIGhlaWdodAorICAgICAqICAgICAgICAgICAgb2YgdGhpcyBpbWFnZSBpcyBhdmFpbGFibGUuCisgICAgICogQHJldHVybiB0aGUgaGVpZ2h0IG9mIGltYWdlLCBvciAtMSBpZiB0aGUgaGVpZ2h0IG9mIHRoaXMgaW1hZ2UgaXMgbm90CisgICAgICogICAgICAgICBhdmFpbGFibGUuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRIZWlnaHQoSW1hZ2VPYnNlcnZlciBvYnNlcnZlcik7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzY2FsZWQgaW5zdGFuY2Ugb2YgdGhpcyBJbWFnZS4gVGhpcyBtZXRob2QgcmV0dXJucyAKLSAgICAgKiBhbiBJbWFnZSBvYmplY3QgY29uc3RydWN0ZWQgZnJvbSB0aGUgc291cmNlIG9mIHRoaXMgaW1hZ2UgCi0gICAgICogd2l0aCB0aGUgc3BlY2lmaWVkIHdpZHRoLCBoZWlnaHQsIGFuZCBhcHBsaWVkIHNjYWxpbmcKLSAgICAgKiBhbGdob3JpdGhtLgorICAgICAqIEdldHMgdGhlIHNjYWxlZCBpbnN0YW5jZSBvZiB0aGlzIEltYWdlLiBUaGlzIG1ldGhvZCByZXR1cm5zIGFuIEltYWdlCisgICAgICogb2JqZWN0IGNvbnN0cnVjdGVkIGZyb20gdGhlIHNvdXJjZSBvZiB0aGlzIGltYWdlIHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIHdpZHRoLCBoZWlnaHQsIGFuZCBhcHBsaWVkIHNjYWxpbmcgYWxnb3JpdGhtLgogICAgICAqIAotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2Ygc2NhbGVkIEltYWdlLiAKLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2Ygc2NhbGVkIEltYWdlLgotICAgICAqIEBwYXJhbSBoaW50cyB0aGUgY29uc3RhbnQgd2hpY2ggaW5kaWNhdGVzIHNjYWxpbmcgYWxnb3JpdGhtLiAKLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiBzY2FsZWQgSW1hZ2UuCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiBzY2FsZWQgSW1hZ2UuCisgICAgICogQHBhcmFtIGhpbnRzCisgICAgICogICAgICAgICAgICB0aGUgY29uc3RhbnQgd2hpY2ggaW5kaWNhdGVzIHNjYWxpbmcgYWxnb3JpdGhtLgogICAgICAqIEByZXR1cm4gdGhlIHNjYWxlZCBJbWFnZS4KICAgICAgKi8KICAgICBwdWJsaWMgSW1hZ2UgZ2V0U2NhbGVkSW5zdGFuY2UoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgaGludHMpIHsKQEAgLTE0NywxNyArMTUyLDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhIEdyYXBoaWNzIG9iamVjdCBmb3IgcmVuZGVyaW5nIHRoaXMgaW1hZ2UuIAotICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIGZvciBvZmYtc2NyZWVuIGltYWdlcy4KKyAgICAgKiBHZXRzIGEgR3JhcGhpY3Mgb2JqZWN0IGZvciByZW5kZXJpbmcgdGhpcyBpbWFnZS4gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQKKyAgICAgKiBmb3Igb2ZmLXNjcmVlbiBpbWFnZXMuCiAgICAgICogCiAgICAgICogQHJldHVybiBhIEdyYXBoaWNzIG9iamVjdCBmb3IgcmVuZGVyaW5nIHRvIHRoaXMgaW1hZ2UuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEdyYXBoaWNzIGdldEdyYXBoaWNzKCk7CiAKICAgICAvKioKLSAgICAgKiBGbHVzaGVzIHJlc291cmNlcyB3aGljaCBhcmUgdXNlZCBieSB0aGlzIEltYWdlIG9iamVjdC4gCi0gICAgICogVGhpcyBtZXRob2QgcmVzZXRzIHRoZSBpbWFnZSB0byB0aGUgcmVjb25zdHJ1Y3RlcmVkIHN0YXRlCi0gICAgICogZnJvbSB0aGUgaW1hZ2UncyBzb3VyY2UuCisgICAgICogRmx1c2hlcyByZXNvdXJjZXMgd2hpY2ggYXJlIHVzZWQgYnkgdGhpcyBJbWFnZSBvYmplY3QuIFRoaXMgbWV0aG9kIHJlc2V0cworICAgICAqIHRoZSBpbWFnZSB0byB0aGUgcmVjb25zdHJ1Y3RlZCBzdGF0ZSBmcm9tIHRoZSBpbWFnZSdzIHNvdXJjZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBmbHVzaCgpOwogCkBAIC0xNzEsMTAgKzE3NSwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGFjY2VsZXJhdGlvbiBwcmlvcml0eSBmb3IgdGhpcyBpbWFnZS4gIAotICAgICAqICAKLSAgICAgKiBAcGFyYW0gcHJpb3JpdHkgdGhlIG5ldyBhY2NlbGVyYXRpb24gcHJpb3JpdHkgKHZhbHVlIGluIHRoZQotICAgICAqIHJhbmdlIDAtMSkuCisgICAgICogU2V0cyB0aGUgYWNjZWxlcmF0aW9uIHByaW9yaXR5IGZvciB0aGlzIGltYWdlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBwcmlvcml0eQorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBhY2NlbGVyYXRpb24gcHJpb3JpdHkgKHZhbHVlIGluIHRoZSByYW5nZSAwLTEpLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEFjY2VsZXJhdGlvblByaW9yaXR5KGZsb2F0IHByaW9yaXR5KSB7CiAgICAgICAgIGlmIChwcmlvcml0eSA8IDAgfHwgcHJpb3JpdHkgPiAxKSB7CkBAIC0xODUsMTkgKzE4OSwxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYW4gSW1hZ2VDYXBhYmlsaXRpZXMgb2JqZWN0IG9mIHRoaXMgSW1hZ2Ugb2JqZWN0Ci0gICAgICogZm9yIHRoZSBzcGVjaWZpZWQgR3JhcGhpY3NDb25maWd1cmF0aW9uLiAKKyAgICAgKiBHZXRzIGFuIEltYWdlQ2FwYWJpbGl0aWVzIG9iamVjdCBvZiB0aGlzIEltYWdlIG9iamVjdCBmb3IgdGhlIHNwZWNpZmllZAorICAgICAqIEdyYXBoaWNzQ29uZmlndXJhdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZ2MgdGhlIHNwZWNpZmllZCBHcmFwaGljc0NvbmZpZ3VyYXRpb24gb2JqZWN0IAotICAgICAqIChudWxsIHZhbHVlIG1lYW5zIGRlZmF1bHQgR3JhcGhpY3NDb25maWd1cmF0aW9uKS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIEltYWdlQ2FwYWJpbGl0aWVzIG9iamVjdCBvZiB0aGlzIEltYWdlIG9iamVjdAotICAgICAqIGZvciB0aGUgc3BlY2lmaWVkIEdyYXBoaWNzQ29uZmlndXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gZ2MKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgR3JhcGhpY3NDb25maWd1cmF0aW9uIG9iamVjdCAobnVsbCB2YWx1ZSBtZWFucworICAgICAqICAgICAgICAgICAgZGVmYXVsdCBHcmFwaGljc0NvbmZpZ3VyYXRpb24pLgorICAgICAqIEByZXR1cm4gYW4gSW1hZ2VDYXBhYmlsaXRpZXMgb2JqZWN0IG9mIHRoaXMgSW1hZ2Ugb2JqZWN0IGZvciB0aGUKKyAgICAgKiAgICAgICAgIHNwZWNpZmllZCBHcmFwaGljc0NvbmZpZ3VyYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIEltYWdlQ2FwYWJpbGl0aWVzIGdldENhcGFiaWxpdGllcyhHcmFwaGljc0NvbmZpZ3VyYXRpb24gZ2MpIHsKICAgICAgICAgLy8gTm90ZTogY29tbW9uIGltYWdlIGlzIG5vdCBhY2NlbGVyYXRlZC4KICAgICAgICAgcmV0dXJuIGNhcGFiaWxpdGllczsKICAgICB9CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L0ltYWdlQ2FwYWJpbGl0aWVzLmphdmEgYi9hd3QvamF2YS9hd3QvSW1hZ2VDYXBhYmlsaXRpZXMuamF2YQppbmRleCA2ZTllY2ZjLi5jNmQ1OTQ2IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvSW1hZ2VDYXBhYmlsaXRpZXMuamF2YQorKysgYi9hd3QvamF2YS9hd3QvSW1hZ2VDYXBhYmlsaXRpZXMuamF2YQpAQCAtMTgsMjIgKzE4LDI3IEBACiAgKiBAYXV0aG9yIEFsZXhleSBBLiBQZXRyZW5rbwogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3Q7CiAKIC8qKgogICogVGhlIEltYWdlQ2FwYWJpbGl0aWVzIGNsYXNzIGdpdmVzIGluZm9ybWF0aW9uIGFib3V0IGFuIGltYWdlJ3MgY2FwYWJpbGl0aWVzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEltYWdlQ2FwYWJpbGl0aWVzIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKLSAgICAKLSAgICAvKiogVGhlIGFjY2VsZXJhdGVkLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGFjY2VsZXJhdGVkLgorICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBhY2NlbGVyYXRlZDsKIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJbWFnZUNhcGFiaWxpdGllcyB3aXRoIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBhY2NlbGVyYXRpb24gZmxhZyB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciBhY2NlbGVyYXRpb24KLSAgICAgKiBpcyBkZXNpcmVkIG9yIG5vdC4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgSW1hZ2VDYXBhYmlsaXRpZXMgd2l0aCB0aGUgc3BlY2lmaWVkIGFjY2VsZXJhdGlvbiBmbGFnCisgICAgICogd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgYWNjZWxlcmF0aW9uIGlzIGRlc2lyZWQgb3Igbm90LgogICAgICAqIAotICAgICAqIEBwYXJhbSBhY2NlbGVyYXRlZCB0aGUgYWNjZWxlcmF0ZWQgZmxhZy4KKyAgICAgKiBAcGFyYW0gYWNjZWxlcmF0ZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBhY2NlbGVyYXRlZCBmbGFnLgogICAgICAqLwogICAgIHB1YmxpYyBJbWFnZUNhcGFiaWxpdGllcyhib29sZWFuIGFjY2VsZXJhdGVkKSB7CiAgICAgICAgIHRoaXMuYWNjZWxlcmF0ZWQgPSBhY2NlbGVyYXRlZDsKQEAgLTUwLDIzICs1NSwyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybmUgdHJ1ZSBpZiB0aGUgSW1hZ2Ugb2YgdGhpcyBJbWFnZUNhcGFiaWxpdGllcyBpcyBvciBjYW4gYmUKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIEltYWdlIG9mIHRoaXMgSW1hZ2VDYXBhYmlsaXRpZXMgaXMgb3IgY2FuIGJlCiAgICAgICogYWNjZWxlcmF0ZWQuCi0gICAgICogIAorICAgICAqIAogICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIEltYWdlIG9mIHRoaXMgSW1hZ2VDYXBhYmlsaXRpZXMgaXMgb3IgY2FuIGJlCi0gICAgICogYWNjZWxlcmF0ZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiAgICAgICAgIGFjY2VsZXJhdGVkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNBY2NlbGVyYXRlZCgpIHsKICAgICAgICAgcmV0dXJuIGFjY2VsZXJhdGVkOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIEltYWdlQ2FwYWJpbGl0aWVzIGFwcGxpZXMgdG8KLSAgICAgKiB0aGUgVm9sYXRpbGVJbWFnZSB3aGljaCBjYW4gbG9zZSBpdHMgc3VyZmFjZXMuCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgSW1hZ2VDYXBhYmlsaXRpZXMgYXBwbGllcyB0byB0aGUgVm9sYXRpbGVJbWFnZSB3aGljaAorICAgICAqIGNhbiBsb3NlIGl0cyBzdXJmYWNlcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBJbWFnZUNhcGFiaWxpdGllcyBhcHBsaWVzIHRvCi0gICAgICogdGhlIFZvbGF0aWxlSW1hZ2Ugd2hpY2ggY2FuIGxvc2UgaXRzIHN1cmZhY2VzLCAKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgSW1hZ2VDYXBhYmlsaXRpZXMgYXBwbGllcyB0byB0aGUgVm9sYXRpbGVJbWFnZSB3aGljaAorICAgICAqICAgICAgICAgY2FuIGxvc2UgaXRzIHN1cmZhY2VzLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNUcnVlVm9sYXRpbGUoKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L0luc2V0cy5qYXZhIGIvYXd0L2phdmEvYXd0L0luc2V0cy5qYXZhCmluZGV4IDYxZjNmZDguLjA0ZjE5OGMgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9JbnNldHMuamF2YQorKysgYi9hd3QvamF2YS9hd3QvSW5zZXRzLmphdmEKQEAgLTE4LDQ0ICsxOCw0OSBAQAogICogQGF1dGhvciBEbWl0cnkgQS4gRHVybmV2CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dDsKIAogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lm1pc2MuSGFzaENvZGU7CiAKLQogLyoqCi0gKiBUaGUgSW5zZXRzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGJvcmRlcnMgb2YgYSBjb250YWluZXIuIAotICogVGhpcyBjbGFzcyBkZXNjcmliZXMgdGhlIHNwYWNlIHRoYXQgYSBjb250YWluZXIgc2hvdWxkIGxlYXZlIGF0IGVhY2ggZWRnZToKLSAqIHRoZSB0b3AsIHRoZSBib3R0b20sIHRoZSByaWdodCBzaWRlLCBhbmQgdGhlIGxlZnQgc2lkZS4gCi0gKiBUaGUgc3BhY2UgY2FuIGJlIGZpbGxlZCB3aXRoIGEgYm9yZGVyLCBhIGJsYW5rIHNwYWNlLCBvciBhIHRpdGxlLgorICogVGhlIEluc2V0cyBjbGFzcyByZXByZXNlbnRzIHRoZSBib3JkZXJzIG9mIGEgY29udGFpbmVyLiBUaGlzIGNsYXNzIGRlc2NyaWJlcworICogdGhlIHNwYWNlIHRoYXQgYSBjb250YWluZXIgc2hvdWxkIGxlYXZlIGF0IGVhY2ggZWRnZTogdGhlIHRvcCwgdGhlIGJvdHRvbSwKKyAqIHRoZSByaWdodCBzaWRlLCBhbmQgdGhlIGxlZnQgc2lkZS4gVGhlIHNwYWNlIGNhbiBiZSBmaWxsZWQgd2l0aCBhIGJvcmRlciwgYQorICogYmxhbmsgc3BhY2UsIG9yIGEgdGl0bGUuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSW5zZXRzIGltcGxlbWVudHMgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUgewogCi0gICAgLyoqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yMjcyNTcyNjM3Njk1NDY2NzQ5TDsKIAogICAgIC8qKgotICAgICAqIFRoZSB0b3AgaW5zZXQgaW5kaWNhdGVzIHRoZSBzaXplIG9mIHRoZSBzcGFjZSBhZGRlZCB0byB0aGUgCi0gICAgICogdG9wIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogVGhlIHRvcCBpbnNldCBpbmRpY2F0ZXMgdGhlIHNpemUgb2YgdGhlIHNwYWNlIGFkZGVkIHRvIHRoZSB0b3Agb2YgdGhlCisgICAgICogcmVjdGFuZ2xlLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgdG9wOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBsZWZ0IGluc2V0IGluZGljYXRlcyB0aGUgc2l6ZSBvZiB0aGUgc3BhY2UgYWRkZWQgdG8gdGhlIAotICAgICAqIGxlZnQgc2lkZSBvZiB0aGUgcmVjdGFuZ2xlLgorICAgIC8qKgorICAgICAqIFRoZSBsZWZ0IGluc2V0IGluZGljYXRlcyB0aGUgc2l6ZSBvZiB0aGUgc3BhY2UgYWRkZWQgdG8gdGhlIGxlZnQgc2lkZSBvZgorICAgICAqIHRoZSByZWN0YW5nbGUuCiAgICAgICovCiAgICAgcHVibGljIGludCBsZWZ0OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBib3R0b20gaW5zZXQgaW5kaWNhdGVzIHRoZSBzaXplIG9mIHRoZSBzcGFjZSBzdWJ0cmFjdGVkIGZyb20gCi0gICAgICogdGhlIGJvdHRvbSBvZiB0aGUgcmVjdGFuZ2xlLgorICAgIC8qKgorICAgICAqIFRoZSBib3R0b20gaW5zZXQgaW5kaWNhdGVzIHRoZSBzaXplIG9mIHRoZSBzcGFjZSBzdWJ0cmFjdGVkIGZyb20gdGhlCisgICAgICogYm90dG9tIG9mIHRoZSByZWN0YW5nbGUuCiAgICAgICovCiAgICAgcHVibGljIGludCBib3R0b207CiAKLSAgICAvKiogVGhlIHJpZ2h0IGluc2V0IGluZGljYXRlcyB0aGUgc2l6ZSBvZiB0aGUgc3BhY2Ugc3VidHJhY3RlZCBmcm9tIAotICAgICAqIHRoZSByaWdodCBzaWRlIG9mIHRoZSByZWN0YW5nbGUuIAorICAgIC8qKgorICAgICAqIFRoZSByaWdodCBpbnNldCBpbmRpY2F0ZXMgdGhlIHNpemUgb2YgdGhlIHNwYWNlIHN1YnRyYWN0ZWQgZnJvbSB0aGUgcmlnaHQKKyAgICAgKiBzaWRlIG9mIHRoZSByZWN0YW5nbGUuCiAgICAgICovCiAgICAgcHVibGljIGludCByaWdodDsKIApAQCAtNjMsMTAgKzY4LDE0IEBACiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEluc2V0IG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgdG9wLCBsZWZ0LCBib3R0b20sCiAgICAgICogcmlnaHQgcGFyYW1ldGVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdG9wIHRoZSB0b3AgaW5zZXQuCi0gICAgICogQHBhcmFtIGxlZnQgdGhlIGxlZnQgaW5zZXQuCi0gICAgICogQHBhcmFtIGJvdHRvbSB0aGUgYm90dG9tIGluc2V0LgotICAgICAqIEBwYXJhbSByaWdodCB0aGUgcmlnaHQgaW5zZXQuCisgICAgICogQHBhcmFtIHRvcAorICAgICAqICAgICAgICAgICAgdGhlIHRvcCBpbnNldC4KKyAgICAgKiBAcGFyYW0gbGVmdAorICAgICAqICAgICAgICAgICAgdGhlIGxlZnQgaW5zZXQuCisgICAgICogQHBhcmFtIGJvdHRvbQorICAgICAqICAgICAgICAgICAgdGhlIGJvdHRvbSBpbnNldC4KKyAgICAgKiBAcGFyYW0gcmlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSByaWdodCBpbnNldC4KICAgICAgKi8KICAgICBwdWJsaWMgSW5zZXRzKGludCB0b3AsIGludCBsZWZ0LCBpbnQgYm90dG9tLCBpbnQgcmlnaHQpIHsKICAgICAgICAgc2V0VmFsdWVzKHRvcCwgbGVmdCwgYm90dG9tLCByaWdodCk7CkBAIC0xMDAsMTAgKzEwOSwxMCBAQAogICAgIC8qKgogICAgICAqIENoZWNrcyBpZiB0aGlzIEluc2V0cyBvYmplY3QgaXMgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCBvYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIG8gdGhlIE9iamVjdCB0byBiZSBjb21wYXJlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBvYmplY3QgaXMgYW4gSW5zZXRzIG9iamVjdCB3aG9zZSBkYXRhIHZhbHVlcwotICAgICAqIGFyZSBlcXVhbCB0byB0aG9zZSBvZiB0aGlzIG9iamVjdCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEBwYXJhbSBvCisgICAgICogICAgICAgICAgICB0aGUgT2JqZWN0IHRvIGJlIGNvbXBhcmVkLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIG9iamVjdCBpcyBhbiBJbnNldHMgb2JqZWN0IHdob3NlIGRhdGEgdmFsdWVzIGFyZQorICAgICAqICAgICAgICAgZXF1YWwgdG8gdGhvc2Ugb2YgdGhpcyBvYmplY3QsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKQEAgLTExMSw5ICsxMjAsOCBAQAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBJbnNldHMpIHsKLSAgICAgICAgICAgIEluc2V0cyBpID0gKEluc2V0cykgbzsKLSAgICAgICAgICAgIHJldHVybiAoKGkubGVmdCA9PSBsZWZ0KSAmJiAoaS5ib3R0b20gPT0gYm90dG9tKSAmJgotICAgICAgICAgICAgICAgICAgICAoaS5yaWdodCA9PSByaWdodCkgJiYgKGkudG9wID09IHRvcCkpOworICAgICAgICAgICAgSW5zZXRzIGkgPSAoSW5zZXRzKW87CisgICAgICAgICAgICByZXR1cm4gKChpLmxlZnQgPT0gbGVmdCkgJiYgKGkuYm90dG9tID09IGJvdHRvbSkgJiYgKGkucmlnaHQgPT0gcmlnaHQpICYmIChpLnRvcCA9PSB0b3ApKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtMTI1LDIzICsxMzMsMjYgQEAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAvKiBUaGUgZm9ybWF0IGlzIGJhc2VkIG9uIDEuNSByZWxlYXNlIGJlaGF2aW9yIAotICAgICAgICAgKiB3aGljaCBjYW4gYmUgcmV2ZWFsZWQgYnkgdGhlIGZvbGxvd2luZyBjb2RlOgotICAgICAgICAgKiBTeXN0ZW0ub3V0LnByaW50bG4obmV3IEluc2V0cygxLCAyLCAzLCA0KSk7CisgICAgICAgIC8qCisgICAgICAgICAqIFRoZSBmb3JtYXQgaXMgYmFzZWQgb24gMS41IHJlbGVhc2UgYmVoYXZpb3Igd2hpY2ggY2FuIGJlIHJldmVhbGVkIGJ5CisgICAgICAgICAqIHRoZSBmb2xsb3dpbmcgY29kZTogU3lzdGVtLm91dC5wcmludGxuKG5ldyBJbnNldHMoMSwgMiwgMywgNCkpOwogICAgICAgICAgKi8KIAotICAgICAgICByZXR1cm4gKGdldENsYXNzKCkuZ2V0TmFtZSgpICsKLSAgICAgICAgICAgICAgICAiW2xlZnQ9IiArIGxlZnQgKyAiLHRvcD0iICsgdG9wICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICAgICAgIixyaWdodD0iICsgcmlnaHQgKyAiLGJvdHRvbT0iICArIGJvdHRvbSArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisgICAgICAgIHJldHVybiAoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiW2xlZnQ9IiArIGxlZnQgKyAiLHRvcD0iICsgdG9wICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisgICAgICAgICAgICAgICAgIixyaWdodD0iICsgcmlnaHQgKyAiLGJvdHRvbT0iICsgYm90dG9tICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKICAgICB9CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRvcCwgbGVmdCwgYm90dG9tLCBhbmQgcmlnaHQgaW5zZXRzIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0b3AgdGhlIHRvcCBpbnNldC4KLSAgICAgKiBAcGFyYW0gbGVmdCB0aGUgbGVmdCBpbnNldC4KLSAgICAgKiBAcGFyYW0gYm90dG9tIHRoZSBib3R0b20gaW5zZXQuCi0gICAgICogQHBhcmFtIHJpZ2h0IHRoZSByaWdodCBpbnNldC4KKyAgICAgKiBAcGFyYW0gdG9wCisgICAgICogICAgICAgICAgICB0aGUgdG9wIGluc2V0LgorICAgICAqIEBwYXJhbSBsZWZ0CisgICAgICogICAgICAgICAgICB0aGUgbGVmdCBpbnNldC4KKyAgICAgKiBAcGFyYW0gYm90dG9tCisgICAgICogICAgICAgICAgICB0aGUgYm90dG9tIGluc2V0LgorICAgICAqIEBwYXJhbSByaWdodAorICAgICAqICAgICAgICAgICAgdGhlIHJpZ2h0IGluc2V0LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldChpbnQgdG9wLCBpbnQgbGVmdCwgaW50IGJvdHRvbSwgaW50IHJpZ2h0KSB7CiAgICAgICAgIHNldFZhbHVlcyh0b3AsIGxlZnQsIGJvdHRvbSwgcmlnaHQpOwpAQCAtMTUwLDEwICsxNjEsMTQgQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSB2YWx1ZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHRvcCB0aGUgdG9wCi0gICAgICogQHBhcmFtIGxlZnQgdGhlIGxlZnQKLSAgICAgKiBAcGFyYW0gYm90dG9tIHRoZSBib3R0b20KLSAgICAgKiBAcGFyYW0gcmlnaHQgdGhlIHJpZ2h0CisgICAgICogQHBhcmFtIHRvcAorICAgICAqICAgICAgICAgICAgdGhlIHRvcC4KKyAgICAgKiBAcGFyYW0gbGVmdAorICAgICAqICAgICAgICAgICAgdGhlIGxlZnQuCisgICAgICogQHBhcmFtIGJvdHRvbQorICAgICAqICAgICAgICAgICAgdGhlIGJvdHRvbS4KKyAgICAgKiBAcGFyYW0gcmlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSByaWdodC4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgc2V0VmFsdWVzKGludCB0b3AsIGludCBsZWZ0LCBpbnQgYm90dG9tLCBpbnQgcmlnaHQpIHsKICAgICAgICAgdGhpcy50b3AgPSB0b3A7CkBAIC0xNjIsNCArMTc3LDMgQEAKICAgICAgICAgdGhpcy5yaWdodCA9IHJpZ2h0OwogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L0l0ZW1TZWxlY3RhYmxlLmphdmEgYi9hd3QvamF2YS9hd3QvSXRlbVNlbGVjdGFibGUuamF2YQppbmRleCBhNDYzNjRiLi4yMTJjZjcwIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvSXRlbVNlbGVjdGFibGUuamF2YQorKysgYi9hd3QvamF2YS9hd3QvSXRlbVNlbGVjdGFibGUuamF2YQpAQCAtMTgsMzUgKzE4LDQxIEBACiAgKiBAYXV0aG9yIE1pY2hhZWwgRGFuaWxvdgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3Q7CiAKIGltcG9ydCBqYXZhLmF3dC5ldmVudC5JdGVtTGlzdGVuZXI7CiAKIC8qKgogICogVGhlIEl0ZW1TZWxlY3RhYmxlIGludGVyZmFjZSByZXByZXNlbnRzIGEgc2V0IG9mIGl0ZW1zIHdoaWNoIGNhbiBiZSBzZWxlY3RlZC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSXRlbVNlbGVjdGFibGUgewogCiAgICAgLyoqCi0gICAgICogQWRkcyBhbiBJdGVtTGlzdGVuZXIgZm9yIHJlY2VpdmluZyBpdGVtIGV2ZW50cyB3aGVuIHRoZSBzdGF0ZSBvZiBhbiBpdGVtIAotICAgICAqIGlzIGNoYW5nZWQgYnkgdGhlIHVzZXIuIAorICAgICAqIEFkZHMgYW4gSXRlbUxpc3RlbmVyIGZvciByZWNlaXZpbmcgaXRlbSBldmVudHMgd2hlbiB0aGUgc3RhdGUgb2YgYW4gaXRlbQorICAgICAqIGlzIGNoYW5nZWQgYnkgdGhlIHVzZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGwgdGhlIEl0ZW1MaXN0ZW5lci4KKyAgICAgKiBAcGFyYW0gbAorICAgICAqICAgICAgICAgICAgdGhlIEl0ZW1MaXN0ZW5lci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRJdGVtTGlzdGVuZXIoSXRlbUxpc3RlbmVyIGwpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbiBhcnJheSBvZiB0aGUgc2VsZWN0ZWQgb2JqZWN0cyBvciBudWxsIGlmIHRoZXJlIGlzIG5vIHNlbGVjdGVkIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBzZWxlY3RlZCBvYmplY3RzIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gc2VsZWN0ZWQgCisgICAgICogR2V0cyBhbiBhcnJheSBvZiB0aGUgc2VsZWN0ZWQgb2JqZWN0cyBvciBudWxsIGlmIHRoZXJlIGlzIG5vIHNlbGVjdGVkCiAgICAgICogb2JqZWN0LgorICAgICAqIAorICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIHNlbGVjdGVkIG9iamVjdHMgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBzZWxlY3RlZAorICAgICAqICAgICAgICAgb2JqZWN0LgogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3RbXSBnZXRTZWxlY3RlZE9iamVjdHMoKTsKIAogICAgIC8qKgogICAgICAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBJdGVtTGlzdGVuZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGwgdGhlIEl0ZW1MaXN0ZW5lciB3aGljaCB3aWxsIGJlIHJlbW92ZWQuCisgICAgICogQHBhcmFtIGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBJdGVtTGlzdGVuZXIgd2hpY2ggd2lsbCBiZSByZW1vdmVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlbW92ZUl0ZW1MaXN0ZW5lcihJdGVtTGlzdGVuZXIgbCk7CiAKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9NZW51Q29tcG9uZW50LmphdmEgYi9hd3QvamF2YS9hd3QvTWVudUNvbXBvbmVudC5qYXZhCmluZGV4IDllYjRmM2QuLjljMWIxMjAgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9NZW51Q29tcG9uZW50LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L01lbnVDb21wb25lbnQuamF2YQpAQCAtMjEsOCArMjEsNyBAQAogaW1wb3J0IGphdmEuYXd0LmV2ZW50Lk1vdXNlRXZlbnQ7CiBpbXBvcnQgamF2YS5hd3QucGVlci5NZW51Q29tcG9uZW50UGVlcjsKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotLy9pbXBvcnQgamF2YXguYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7IC8vaW1wb3J0IGphdmF4LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZTsKIC8vaW1wb3J0IGphdmF4LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbXBvbmVudDsKIC8vaW1wb3J0IGphdmF4LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRleHQ7CiAvL2ltcG9ydCBqYXZheC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVSb2xlOwpAQCAtMzEsMzcxICszMCwxNzIgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmdsLk11bHRpUmVjdEFyZWE7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5zdGF0ZS5NZW51SXRlbVN0YXRlOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3Quc3RhdGUuTWVudVN0YXRlOworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTm90SW1wbGVtZW50ZWRFeGNlcHRpb247CiAKIC8qKgotICogVGhlIE1lbnVDb21wb25lbnQgYWJzdHJhY3QgY2xhc3MgaXMgdGhlIHN1cGVyY2xhc3MgZm9yIG1lbnUgCi0gKiBjb21wb25lbnRzLiBNZW51IGNvbXBvbmVudHMgcmVjZWl2ZSBhbmQgcHJvY2VzcyBBV1QgZXZlbnRzLgorICogVGhlIE1lbnVDb21wb25lbnQgYWJzdHJhY3QgY2xhc3MgaXMgdGhlIHN1cGVyY2xhc3MgZm9yIG1lbnUgY29tcG9uZW50cy4gTWVudQorICogY29tcG9uZW50cyByZWNlaXZlIGFuZCBwcm9jZXNzIEFXVCBldmVudHMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWVudUNvbXBvbmVudCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELiAqLworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ1MzY5MDIzNTYyMjM4OTQzNzlMOwogCi0gICAgLyoqIFRoZSBuYW1lLiAqLworICAgIC8qKgorICAgICAqIFRoZSBuYW1lLgorICAgICAqLwogICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CiAKLSAgICAvKiogVGhlIGZvbnQuICovCisgICAgLyoqCisgICAgICogVGhlIGZvbnQuCisgICAgICovCiAgICAgcHJpdmF0ZSBGb250IGZvbnQ7CiAKLSAgICAvKiogVGhlIHBhcmVudC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgcGFyZW50LgorICAgICAqLwogICAgIE1lbnVDb250YWluZXIgcGFyZW50OwogCi0gICAgLyoqIFRoZSBkZXByZWNhdGVkIGV2ZW50IGhhbmRsZXIuICovCisgICAgLyoqCisgICAgICogVGhlIGRlcHJlY2F0ZWQgZXZlbnQgaGFuZGxlci4KKyAgICAgKi8KICAgICBib29sZWFuIGRlcHJlY2F0ZWRFdmVudEhhbmRsZXIgPSB0cnVlOwogCi0gICAgLyoqIFRoZSBzZWxlY3RlZCBpdGVtIGluZGV4LiAqLworICAgIC8qKgorICAgICAqIFRoZSBzZWxlY3RlZCBpdGVtIGluZGV4LgorICAgICAqLwogICAgIHByaXZhdGUgaW50IHNlbGVjdGVkSXRlbUluZGV4OwogCi0gICAgLy8/Pz9BV1Q6IHByaXZhdGUgQWNjZXNzaWJsZUNvbnRleHQgYWNjZXNzaWJsZUNvbnRleHQ7CisgICAgLy8gPz8/QVdUOiBwcml2YXRlIEFjY2Vzc2libGVDb250ZXh0IGFjY2Vzc2libGVDb250ZXh0OwogCi0gICAgLyoqIFRoZSB0b29sa2l0LiAqLworICAgIC8qKgorICAgICAqIFRoZSB0b29sa2l0LgorICAgICAqLwogICAgIGZpbmFsIFRvb2xraXQgdG9vbGtpdCA9IFRvb2xraXQuZ2V0RGVmYXVsdFRvb2xraXQoKTsKIAotICAgIC8vPz8/QVdUCisgICAgLy8gPz8/QVdUCiAgICAgLyoKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgY2xhc3MgQWNjZXNzaWJsZUFXVE1lbnVDb21wb25lbnQgZXh0ZW5kcyBBY2Nlc3NpYmxlQ29udGV4dCBpbXBsZW1lbnRzCi0gICAgICAgICAgICBTZXJpYWxpemFibGUsIEFjY2Vzc2libGVDb21wb25lbnQsIEFjY2Vzc2libGVTZWxlY3Rpb24gewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDI2OTUzMzQxNjIyMzc5ODY5OEw7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkRm9jdXNMaXN0ZW5lcihGb2N1c0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhQb2ludCBwdCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEFjY2Vzc2libGUgZ2V0QWNjZXNzaWJsZUF0KFBvaW50IHB0KSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBDb2xvciBnZXRCYWNrZ3JvdW5kKCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgUmVjdGFuZ2xlIGdldEJvdW5kcygpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEN1cnNvciBnZXRDdXJzb3IoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBGb250IGdldEZvbnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gTWVudUNvbXBvbmVudC50aGlzLmdldEZvbnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBGb250TWV0cmljcyBnZXRGb250TWV0cmljcyhGb250IGZvbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENvbG9yIGdldEZvcmVncm91bmQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBQb2ludCBnZXRMb2NhdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFBvaW50IGdldExvY2F0aW9uT25TY3JlZW4oKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBEaW1lbnNpb24gZ2V0U2l6ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIGFsd2F5cyBlbmFibGVkCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZvY3VzVHJhdmVyc2FibGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gYWx3YXlzIGZvY3VzIHRyYXZlcnNhYmxlCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1Nob3dpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsvLyBhbHdheXMgc2hvd2luZwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIGFsd2F5cyB2aXNpYmxlCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVGb2N1c0xpc3RlbmVyKEZvY3VzTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RGb2N1cygpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEJhY2tncm91bmQoQ29sb3IgY29sb3IpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEJvdW5kcyhSZWN0YW5nbGUgcmVjdCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Q3Vyc29yKEN1cnNvciBjdXJzb3IpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRGb250KEZvbnQgZm9udCkgewotICAgICAgICAgICAgTWVudUNvbXBvbmVudC50aGlzLnNldEZvbnQoZm9udCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRGb3JlZ3JvdW5kKENvbG9yIGNvbG9yKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihQb2ludCBwdCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0U2l6ZShEaW1lbnNpb24gcHQpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRBY2Nlc3NpYmxlU2VsZWN0aW9uKGludCBpbmRleCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2xlYXJBY2Nlc3NpYmxlU2VsZWN0aW9uKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEFjY2Vzc2libGUgZ2V0QWNjZXNzaWJsZVNlbGVjdGlvbihpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRBY2Nlc3NpYmxlU2VsZWN0aW9uQ291bnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzQWNjZXNzaWJsZUNoaWxkU2VsZWN0ZWQoaW50IGluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVBY2Nlc3NpYmxlU2VsZWN0aW9uKGludCBpbmRleCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0QWxsQWNjZXNzaWJsZVNlbGVjdGlvbigpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQWNjZXNzaWJsZSBnZXRBY2Nlc3NpYmxlQ2hpbGQoaW50IGluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldEFjY2Vzc2libGVDaGlsZHJlbkNvdW50KCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEFjY2Vzc2libGVDb21wb25lbnQgZ2V0QWNjZXNzaWJsZUNvbXBvbmVudCgpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWNjZXNzaWJsZURlc2NyaXB0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEFjY2Vzc2libGVEZXNjcmlwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0QWNjZXNzaWJsZUluZGV4SW5QYXJlbnQoKSB7Ci0gICAgICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQWNjZXNzaWJsZSBhUGFyZW50ID0gZ2V0QWNjZXNzaWJsZVBhcmVudCgpOwotICAgICAgICAgICAgICAgIGludCBhSW5kZXggPSAtMTsKLSAgICAgICAgICAgICAgICBpZiAoYVBhcmVudCBpbnN0YW5jZW9mIE1lbnVDb21wb25lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgTWVudUNvbXBvbmVudCBwYXJlbnQgPSAoTWVudUNvbXBvbmVudCkgYVBhcmVudDsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gcGFyZW50LmdldEl0ZW1Db3VudCgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lbnVDb21wb25lbnQgY29tcCA9IHBhcmVudC5nZXRJdGVtKGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBBY2Nlc3NpYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYUluZGV4Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXAgPT0gTWVudUNvbXBvbmVudC50aGlzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhSW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdG9vbGtpdC51bmxvY2tBV1QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFjY2Vzc2libGVOYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEFjY2Vzc2libGVOYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEFjY2Vzc2libGUgZ2V0QWNjZXNzaWJsZVBhcmVudCgpIHsKLSAgICAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBBY2Nlc3NpYmxlIGFQYXJlbnQgPSBzdXBlci5nZXRBY2Nlc3NpYmxlUGFyZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGFQYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYVBhcmVudDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgTWVudUNvbnRhaW5lciBwYXJlbnQgPSBnZXRQYXJlbnQoKTsKLSAgICAgICAgICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgQWNjZXNzaWJsZSkgewotICAgICAgICAgICAgICAgICAgICBhUGFyZW50ID0gKEFjY2Vzc2libGUpIHBhcmVudDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFQYXJlbnQ7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEFjY2Vzc2libGVSb2xlIGdldEFjY2Vzc2libGVSb2xlKCkgewotICAgICAgICAgICAgcmV0dXJuIEFjY2Vzc2libGVSb2xlLkFXVF9DT01QT05FTlQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEFjY2Vzc2libGVTZWxlY3Rpb24gZ2V0QWNjZXNzaWJsZVNlbGVjdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBBY2Nlc3NpYmxlU3RhdGVTZXQgZ2V0QWNjZXNzaWJsZVN0YXRlU2V0KCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBBY2Nlc3NpYmxlU3RhdGVTZXQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgTG9jYWxlIGdldExvY2FsZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotICAgICAgICB9Ci0gICAgfQotICAgICovCisgICAgICogcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzIEFjY2Vzc2libGVBV1RNZW51Q29tcG9uZW50IGV4dGVuZHMKKyAgICAgKiBBY2Nlc3NpYmxlQ29udGV4dCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSwgQWNjZXNzaWJsZUNvbXBvbmVudCwKKyAgICAgKiBBY2Nlc3NpYmxlU2VsZWN0aW9uIHsgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0KKyAgICAgKiAtNDI2OTUzMzQxNjIyMzc5ODY5OEw7IHB1YmxpYyB2b2lkIGFkZEZvY3VzTGlzdGVuZXIoRm9jdXNMaXN0ZW5lcgorICAgICAqIGxpc3RlbmVyKSB7IH0gcHVibGljIGJvb2xlYW4gY29udGFpbnMoUG9pbnQgcHQpIHsgcmV0dXJuIGZhbHNlOyB9IHB1YmxpYworICAgICAqIEFjY2Vzc2libGUgZ2V0QWNjZXNzaWJsZUF0KFBvaW50IHB0KSB7IHJldHVybiBudWxsOyB9IHB1YmxpYyBDb2xvcgorICAgICAqIGdldEJhY2tncm91bmQoKSB7IHJldHVybiBudWxsOyB9IHB1YmxpYyBSZWN0YW5nbGUgZ2V0Qm91bmRzKCkgeyByZXR1cm4KKyAgICAgKiBudWxsOyB9IHB1YmxpYyBDdXJzb3IgZ2V0Q3Vyc29yKCkgeyByZXR1cm4gbnVsbDsgfSBwdWJsaWMgRm9udCBnZXRGb250KCkKKyAgICAgKiB7IHJldHVybiBNZW51Q29tcG9uZW50LnRoaXMuZ2V0Rm9udCgpOyB9IHB1YmxpYyBGb250TWV0cmljcworICAgICAqIGdldEZvbnRNZXRyaWNzKEZvbnQgZm9udCkgeyByZXR1cm4gbnVsbDsgfSBwdWJsaWMgQ29sb3IgZ2V0Rm9yZWdyb3VuZCgpIHsKKyAgICAgKiByZXR1cm4gbnVsbDsgfSBwdWJsaWMgUG9pbnQgZ2V0TG9jYXRpb24oKSB7IHJldHVybiBudWxsOyB9IHB1YmxpYyBQb2ludAorICAgICAqIGdldExvY2F0aW9uT25TY3JlZW4oKSB7IHJldHVybiBudWxsOyB9IHB1YmxpYyBEaW1lbnNpb24gZ2V0U2l6ZSgpIHsKKyAgICAgKiByZXR1cm4gbnVsbDsgfSBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7IHJldHVybiB0cnVlOyAvLyBhbHdheXMKKyAgICAgKiBlbmFibGVkIH0gcHVibGljIGJvb2xlYW4gaXNGb2N1c1RyYXZlcnNhYmxlKCkgeyByZXR1cm4gdHJ1ZTsgLy8gYWx3YXlzCisgICAgICogZm9jdXMgdHJhdmVyc2FibGUgfSBwdWJsaWMgYm9vbGVhbiBpc1Nob3dpbmcoKSB7IHJldHVybiB0cnVlOy8vIGFsd2F5cworICAgICAqIHNob3dpbmcgfSBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7IHJldHVybiB0cnVlOyAvLyBhbHdheXMgdmlzaWJsZSB9CisgICAgICogcHVibGljIHZvaWQgcmVtb3ZlRm9jdXNMaXN0ZW5lcihGb2N1c0xpc3RlbmVyIGxpc3RlbmVyKSB7IH0gcHVibGljIHZvaWQKKyAgICAgKiByZXF1ZXN0Rm9jdXMoKSB7IH0gcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZChDb2xvciBjb2xvcikgeyB9IHB1YmxpYyB2b2lkCisgICAgICogc2V0Qm91bmRzKFJlY3RhbmdsZSByZWN0KSB7IH0gcHVibGljIHZvaWQgc2V0Q3Vyc29yKEN1cnNvciBjdXJzb3IpIHsgfQorICAgICAqIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7IH0gcHVibGljIHZvaWQgc2V0Rm9udChGb250CisgICAgICogZm9udCkgeyBNZW51Q29tcG9uZW50LnRoaXMuc2V0Rm9udChmb250KTsgfSBwdWJsaWMgdm9pZAorICAgICAqIHNldEZvcmVncm91bmQoQ29sb3IgY29sb3IpIHsgfSBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihQb2ludCBwdCkgeyB9CisgICAgICogcHVibGljIHZvaWQgc2V0U2l6ZShEaW1lbnNpb24gcHQpIHsgfSBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4KKyAgICAgKiB2aXNpYmxlKSB7IH0gcHVibGljIHZvaWQgYWRkQWNjZXNzaWJsZVNlbGVjdGlvbihpbnQgaW5kZXgpIHsgfSBwdWJsaWMKKyAgICAgKiB2b2lkIGNsZWFyQWNjZXNzaWJsZVNlbGVjdGlvbigpIHsgfSBwdWJsaWMgQWNjZXNzaWJsZQorICAgICAqIGdldEFjY2Vzc2libGVTZWxlY3Rpb24oaW50IGluZGV4KSB7IHJldHVybiBudWxsOyB9IHB1YmxpYyBpbnQKKyAgICAgKiBnZXRBY2Nlc3NpYmxlU2VsZWN0aW9uQ291bnQoKSB7IHJldHVybiAwOyB9IHB1YmxpYyBib29sZWFuCisgICAgICogaXNBY2Nlc3NpYmxlQ2hpbGRTZWxlY3RlZChpbnQgaW5kZXgpIHsgcmV0dXJuIGZhbHNlOyB9IHB1YmxpYyB2b2lkCisgICAgICogcmVtb3ZlQWNjZXNzaWJsZVNlbGVjdGlvbihpbnQgaW5kZXgpIHsgfSBwdWJsaWMgdm9pZAorICAgICAqIHNlbGVjdEFsbEFjY2Vzc2libGVTZWxlY3Rpb24oKSB7IH0KKyAgICAgKiBAT3ZlcnJpZGUgcHVibGljIEFjY2Vzc2libGUgZ2V0QWNjZXNzaWJsZUNoaWxkKGludCBpbmRleCkgeyByZXR1cm4gbnVsbDsKKyAgICAgKiB9CisgICAgICogQE92ZXJyaWRlIHB1YmxpYyBpbnQgZ2V0QWNjZXNzaWJsZUNoaWxkcmVuQ291bnQoKSB7IHJldHVybiAwOyB9CisgICAgICogQE92ZXJyaWRlIHB1YmxpYyBBY2Nlc3NpYmxlQ29tcG9uZW50IGdldEFjY2Vzc2libGVDb21wb25lbnQoKSB7IHJldHVybgorICAgICAqIHRoaXM7IH0KKyAgICAgKiBAT3ZlcnJpZGUgcHVibGljIFN0cmluZyBnZXRBY2Nlc3NpYmxlRGVzY3JpcHRpb24oKSB7IHJldHVybgorICAgICAqIHN1cGVyLmdldEFjY2Vzc2libGVEZXNjcmlwdGlvbigpOyB9CisgICAgICogQE92ZXJyaWRlIHB1YmxpYyBpbnQgZ2V0QWNjZXNzaWJsZUluZGV4SW5QYXJlbnQoKSB7IHRvb2xraXQubG9ja0FXVCgpOworICAgICAqIHRyeSB7IEFjY2Vzc2libGUgYVBhcmVudCA9IGdldEFjY2Vzc2libGVQYXJlbnQoKTsgaW50IGFJbmRleCA9IC0xOyBpZgorICAgICAqIChhUGFyZW50IGluc3RhbmNlb2YgTWVudUNvbXBvbmVudCkgeyBNZW51Q29tcG9uZW50IHBhcmVudCA9CisgICAgICogKE1lbnVDb21wb25lbnQpIGFQYXJlbnQ7IGludCBjb3VudCA9IHBhcmVudC5nZXRJdGVtQ291bnQoKTsgZm9yIChpbnQgaSA9CisgICAgICogMDsgaSA8IGNvdW50OyBpKyspIHsgTWVudUNvbXBvbmVudCBjb21wID0gcGFyZW50LmdldEl0ZW0oaSk7IGlmIChjb21wCisgICAgICogaW5zdGFuY2VvZiBBY2Nlc3NpYmxlKSB7IGFJbmRleCsrOyBpZiAoY29tcCA9PSBNZW51Q29tcG9uZW50LnRoaXMpIHsKKyAgICAgKiByZXR1cm4gYUluZGV4OyB9IH0gfSB9IHJldHVybiAtMTsgfSBmaW5hbGx5IHsgdG9vbGtpdC51bmxvY2tBV1QoKTsgfSB9CisgICAgICogQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgZ2V0QWNjZXNzaWJsZU5hbWUoKSB7IHJldHVybgorICAgICAqIHN1cGVyLmdldEFjY2Vzc2libGVOYW1lKCk7IH0KKyAgICAgKiBAT3ZlcnJpZGUgcHVibGljIEFjY2Vzc2libGUgZ2V0QWNjZXNzaWJsZVBhcmVudCgpIHsgdG9vbGtpdC5sb2NrQVdUKCk7CisgICAgICogdHJ5IHsgQWNjZXNzaWJsZSBhUGFyZW50ID0gc3VwZXIuZ2V0QWNjZXNzaWJsZVBhcmVudCgpOyBpZiAoYVBhcmVudCAhPQorICAgICAqIG51bGwpIHsgcmV0dXJuIGFQYXJlbnQ7IH0gTWVudUNvbnRhaW5lciBwYXJlbnQgPSBnZXRQYXJlbnQoKTsgaWYgKHBhcmVudAorICAgICAqIGluc3RhbmNlb2YgQWNjZXNzaWJsZSkgeyBhUGFyZW50ID0gKEFjY2Vzc2libGUpIHBhcmVudDsgfSByZXR1cm4gYVBhcmVudDsKKyAgICAgKiB9IGZpbmFsbHkgeyB0b29sa2l0LnVubG9ja0FXVCgpOyB9IH0KKyAgICAgKiBAT3ZlcnJpZGUgcHVibGljIEFjY2Vzc2libGVSb2xlIGdldEFjY2Vzc2libGVSb2xlKCkgeyByZXR1cm4KKyAgICAgKiBBY2Nlc3NpYmxlUm9sZS5BV1RfQ09NUE9ORU5UOyB9CisgICAgICogQE92ZXJyaWRlIHB1YmxpYyBBY2Nlc3NpYmxlU2VsZWN0aW9uIGdldEFjY2Vzc2libGVTZWxlY3Rpb24oKSB7IHJldHVybgorICAgICAqIHRoaXM7IH0KKyAgICAgKiBAT3ZlcnJpZGUgcHVibGljIEFjY2Vzc2libGVTdGF0ZVNldCBnZXRBY2Nlc3NpYmxlU3RhdGVTZXQoKSB7IHJldHVybiBuZXcKKyAgICAgKiBBY2Nlc3NpYmxlU3RhdGVTZXQoKTsgfQorICAgICAqIEBPdmVycmlkZSBwdWJsaWMgTG9jYWxlIGdldExvY2FsZSgpIHsgcmV0dXJuIExvY2FsZS5nZXREZWZhdWx0KCk7IH0gfQorICAgICAqLwogCiAgICAgLyoqCi0gICAgICogVGhlIGFjY2Vzc29yIHRvIE1lbnVDb21wb25lbnQgaW50ZXJuYWwgc3RhdGUsCi0gICAgICogdXRpbGl6ZWQgYnkgdGhlIHZpc3VhbCB0aGVtZS4KKyAgICAgKiBUaGUgYWNjZXNzb3IgdG8gTWVudUNvbXBvbmVudCBpbnRlcm5hbCBzdGF0ZSwgdXRpbGl6ZWQgYnkgdGhlIHZpc3VhbAorICAgICAqIHRoZW1lLgogICAgICAqIAotICAgICAqIEB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24gdGhlIGhlYWRsZXNzIGV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICB0aGUgaGVhZGxlc3MgZXhjZXB0aW9uLgogICAgICAqLwotICAgIC8vPz8/QVdUCisgICAgLy8gPz8/QVdUCiAgICAgLyoKLSAgICBjbGFzcyBTdGF0ZSBpbXBsZW1lbnRzIE1lbnVTdGF0ZSB7Ci0gICAgICAgIERpbWVuc2lvbiBzaXplOworICAgICAqIGNsYXNzIFN0YXRlIGltcGxlbWVudHMgTWVudVN0YXRlIHsgRGltZW5zaW9uIHNpemU7IERpbWVuc2lvbiBnZXRTaXplKCkgeworICAgICAqIGlmIChzaXplID09IG51bGwpIHsgY2FsY3VsYXRlKCk7IH0gcmV0dXJuIHNpemU7IH0gcHVibGljIGludCBnZXRXaWR0aCgpIHsKKyAgICAgKiByZXR1cm4gZ2V0U2l6ZSgpLndpZHRoOyB9IHB1YmxpYyBpbnQgZ2V0SGVpZ2h0KCkgeyByZXR1cm4KKyAgICAgKiBnZXRTaXplKCkuaGVpZ2h0OyB9IHB1YmxpYyBGb250IGdldEZvbnQoKSB7IHJldHVybgorICAgICAqIE1lbnVDb21wb25lbnQudGhpcy5nZXRGb250KCk7IH0gcHVibGljIGludCBnZXRJdGVtQ291bnQoKSB7IHJldHVybgorICAgICAqIE1lbnVDb21wb25lbnQudGhpcy5nZXRJdGVtQ291bnQoKTsgfSBwdWJsaWMgaW50IGdldFNlbGVjdGVkSXRlbUluZGV4KCkgeworICAgICAqIHJldHVybiBNZW51Q29tcG9uZW50LnRoaXMuZ2V0U2VsZWN0ZWRJdGVtSW5kZXgoKTsgfSBwdWJsaWMgYm9vbGVhbgorICAgICAqIGlzRm9udFNldCgpIHsgcmV0dXJuIE1lbnVDb21wb25lbnQudGhpcy5pc0ZvbnRTZXQoKTsgfQorICAgICAqIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpIHB1YmxpYyBGb250TWV0cmljcyBnZXRGb250TWV0cmljcyhGb250CisgICAgICogZikgeyByZXR1cm4gTWVudUNvbXBvbmVudC50aGlzLnRvb2xraXQuZ2V0Rm9udE1ldHJpY3MoZik7IH0gcHVibGljIFBvaW50CisgICAgICogZ2V0TG9jYXRpb24oKSB7IHJldHVybiBNZW51Q29tcG9uZW50LnRoaXMuZ2V0TG9jYXRpb24oKTsgfSBwdWJsaWMKKyAgICAgKiBNZW51SXRlbVN0YXRlIGdldEl0ZW0oaW50IGluZGV4KSB7IE1lbnVJdGVtIGl0ZW0gPQorICAgICAqIE1lbnVDb21wb25lbnQudGhpcy5nZXRJdGVtKGluZGV4KTsgcmV0dXJuIGl0ZW0uaXRlbVN0YXRlOyB9IHB1YmxpYyB2b2lkCisgICAgICogc2V0U2l6ZShpbnQgdywgaW50IGgpIHsgdGhpcy5zaXplID0gbmV3IERpbWVuc2lvbih3LCBoKTsgfSB2b2lkCisgICAgICogY2FsY3VsYXRlKCkgeyBzaXplID0gbmV3IERpbWVuc2lvbigpOworICAgICAqIHNpemUuc2V0U2l6ZSh0b29sa2l0LnRoZW1lLmNhbGN1bGF0ZU1lbnVTaXplKHRoaXMpKTsgfSB2b2lkIHJlc2V0KCkgeyBmb3IKKyAgICAgKiAoaW50IGkgPSAwOyBpIDwgZ2V0SXRlbUNvdW50KCk7IGkrKykgeyAoKE1lbnVJdGVtLlN0YXRlKQorICAgICAqIGdldEl0ZW0oaSkpLnJlc2V0KCk7IH0gfSB9CisgICAgICovCiAKLSAgICAgICAgRGltZW5zaW9uIGdldFNpemUoKSB7Ci0gICAgICAgICAgICBpZiAoc2l6ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2FsY3VsYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0V2lkdGgoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0U2l6ZSgpLndpZHRoOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRIZWlnaHQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0U2l6ZSgpLmhlaWdodDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBGb250IGdldEZvbnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gTWVudUNvbXBvbmVudC50aGlzLmdldEZvbnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0SXRlbUNvdW50KCkgewotICAgICAgICAgICAgcmV0dXJuIE1lbnVDb21wb25lbnQudGhpcy5nZXRJdGVtQ291bnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWRJdGVtSW5kZXgoKSB7Ci0gICAgICAgICAgICByZXR1cm4gTWVudUNvbXBvbmVudC50aGlzLmdldFNlbGVjdGVkSXRlbUluZGV4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZvbnRTZXQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gTWVudUNvbXBvbmVudC50aGlzLmlzRm9udFNldCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICAgICAgcHVibGljIEZvbnRNZXRyaWNzIGdldEZvbnRNZXRyaWNzKEZvbnQgZikgewotICAgICAgICAgICAgcmV0dXJuIE1lbnVDb21wb25lbnQudGhpcy50b29sa2l0LmdldEZvbnRNZXRyaWNzKGYpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFBvaW50IGdldExvY2F0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuIE1lbnVDb21wb25lbnQudGhpcy5nZXRMb2NhdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE1lbnVJdGVtU3RhdGUgZ2V0SXRlbShpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIE1lbnVJdGVtIGl0ZW0gPSBNZW51Q29tcG9uZW50LnRoaXMuZ2V0SXRlbShpbmRleCk7Ci0gICAgICAgICAgICByZXR1cm4gaXRlbS5pdGVtU3RhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTaXplKGludCB3LCBpbnQgaCkgewotICAgICAgICAgICAgdGhpcy5zaXplID0gbmV3IERpbWVuc2lvbih3LCBoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgY2FsY3VsYXRlKCkgewotICAgICAgICAgICAgc2l6ZSA9IG5ldyBEaW1lbnNpb24oKTsKLSAgICAgICAgICAgIHNpemUuc2V0U2l6ZSh0b29sa2l0LnRoZW1lLmNhbGN1bGF0ZU1lbnVTaXplKHRoaXMpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgcmVzZXQoKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdldEl0ZW1Db3VudCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAoKE1lbnVJdGVtLlN0YXRlKSBnZXRJdGVtKGkpKS5yZXNldCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgKi8KLSAgICAKICAgICAvKioKLSAgICAgKiBQb3AtdXAgYm94IGZvciBtZW51LiBJdCB0cmFuc2ZlcnMgdGhlIHBhaW50IGV2ZW50cywgCi0gICAgICoga2V5Ym9hcmQgYW5kIG1vdXNlIGV2ZW50cyB0byB0aGUgbWVudSBjb21wb25lbnQgaXRzZWxmCisgICAgICogUG9wLXVwIGJveCBmb3IgbWVudS4gSXQgdHJhbnNmZXJzIHRoZSBwYWludCBldmVudHMsIGtleWJvYXJkIGFuZCBtb3VzZQorICAgICAqIGV2ZW50cyB0byB0aGUgbWVudSBjb21wb25lbnQgaXRzZWxmLgogICAgICAqLwotICAgIC8vPz8/QVdUCisgICAgLy8gPz8/QVdUCiAgICAgLyoKLSAgICBjbGFzcyBNZW51UG9wdXBCb3ggZXh0ZW5kcyBQb3B1cEJveCB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgUG9pbnQgbGFzdE1vdXNlUG9zID0gbmV3IFBvaW50KCk7CisgICAgICogY2xhc3MgTWVudVBvcHVwQm94IGV4dGVuZHMgUG9wdXBCb3ggeyBwcml2YXRlIGZpbmFsIFBvaW50IGxhc3RNb3VzZVBvcyA9CisgICAgICogbmV3IFBvaW50KCk7CisgICAgICogQE92ZXJyaWRlIGJvb2xlYW4gaXNNZW51KCkgeyByZXR1cm4gdHJ1ZTsgfQorICAgICAqIEBPdmVycmlkZSB2b2lkIHBhaW50KEdyYXBoaWNzIGdyKSB7IE1lbnVDb21wb25lbnQudGhpcy5wYWludChncik7IH0KKyAgICAgKiBAT3ZlcnJpZGUgdm9pZCBvbktleUV2ZW50KGludCBldmVudElkLCBpbnQgdktleSwgbG9uZyB3aGVuLCBpbnQKKyAgICAgKiBtb2RpZmllcnMpIHsgTWVudUNvbXBvbmVudC50aGlzLm9uS2V5RXZlbnQoZXZlbnRJZCwgdktleSwgd2hlbiwKKyAgICAgKiBtb2RpZmllcnMpOyB9CisgICAgICogQE92ZXJyaWRlIHZvaWQgb25Nb3VzZUV2ZW50KGludCBldmVudElkLCBQb2ludCB3aGVyZSwgaW50IG1vdXNlQnV0dG9uLAorICAgICAqIGxvbmcgd2hlbiwgaW50IG1vZGlmaWVycywgaW50IHdoZWVsUm90YXRpb24pIHsgLy8gcHJldmVudCBjb25mbGljdCBvZgorICAgICAqIG1vdXNlIGFuZCBrZXlib2FyZCAvLyB3aGVuIHN1Yi1tZW51IGRyb3BzIGRvd24gZHVlIHRvIGtleWJvYXJkIG5hdmlnYXRpb24KKyAgICAgKiBpZiAobGFzdE1vdXNlUG9zLmVxdWFscyh3aGVyZSkgJiYgKGV2ZW50SWQgPT0gTW91c2VFdmVudC5NT1VTRV9NT1ZFRCB8fAorICAgICAqIGV2ZW50SWQgPT0gTW91c2VFdmVudC5NT1VTRV9FTlRFUkVEKSkgeyByZXR1cm47IH0KKyAgICAgKiBsYXN0TW91c2VQb3Muc2V0TG9jYXRpb24od2hlcmUpOyBNZW51Q29tcG9uZW50LnRoaXMub25Nb3VzZUV2ZW50KGV2ZW50SWQsCisgICAgICogd2hlcmUsIG1vdXNlQnV0dG9uLCB3aGVuLCBtb2RpZmllcnMpOyB9IH0KKyAgICAgKi8KIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgYm9vbGVhbiBpc01lbnUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICB2b2lkIHBhaW50KEdyYXBoaWNzIGdyKSB7Ci0gICAgICAgICAgICBNZW51Q29tcG9uZW50LnRoaXMucGFpbnQoZ3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHZvaWQgb25LZXlFdmVudChpbnQgZXZlbnRJZCwgaW50IHZLZXksIGxvbmcgd2hlbiwgaW50IG1vZGlmaWVycykgewotICAgICAgICAgICAgTWVudUNvbXBvbmVudC50aGlzLm9uS2V5RXZlbnQoZXZlbnRJZCwgdktleSwgd2hlbiwgbW9kaWZpZXJzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICB2b2lkIG9uTW91c2VFdmVudChpbnQgZXZlbnRJZCwgUG9pbnQgd2hlcmUsIGludCBtb3VzZUJ1dHRvbiwgbG9uZyB3aGVuLCBpbnQgbW9kaWZpZXJzLAotICAgICAgICAgICAgICAgIGludCB3aGVlbFJvdGF0aW9uKSB7Ci0gICAgICAgICAgICAvLyBwcmV2ZW50IGNvbmZsaWN0IG9mIG1vdXNlIGFuZCBrZXlib2FyZAotICAgICAgICAgICAgLy8gd2hlbiBzdWItbWVudSBkcm9wcyBkb3duIGR1ZSB0byBrZXlib2FyZCBuYXZpZ2F0aW9uCi0gICAgICAgICAgICBpZiAobGFzdE1vdXNlUG9zLmVxdWFscyh3aGVyZSkKLSAgICAgICAgICAgICAgICAgICAgJiYgKGV2ZW50SWQgPT0gTW91c2VFdmVudC5NT1VTRV9NT1ZFRCB8fCBldmVudElkID09IE1vdXNlRXZlbnQuTU9VU0VfRU5URVJFRCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsYXN0TW91c2VQb3Muc2V0TG9jYXRpb24od2hlcmUpOwotICAgICAgICAgICAgTWVudUNvbXBvbmVudC50aGlzLm9uTW91c2VFdmVudChldmVudElkLCB3aGVyZSwgbW91c2VCdXR0b24sIHdoZW4sIG1vZGlmaWVycyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKi8KLSAgICAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgTWVudUNvbXBvbmVudCBvYmplY3QuCiAgICAgICogCi0gICAgICogQHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiBpZiB0aGUgZ3JhcGhpY2FsIGludGVyZmFjZQotICAgICAqIGVudmlyb25tZW50IGNhbid0IHN1cHBvcnQgTWVudUNvbXBvbmVudHMKKyAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGdyYXBoaWNhbCBpbnRlcmZhY2UgZW52aXJvbm1lbnQgY2FuJ3Qgc3VwcG9ydAorICAgICAqICAgICAgICAgICAgIE1lbnVDb21wb25lbnRzLgogICAgICAqLwogICAgIHB1YmxpYyBNZW51Q29tcG9uZW50KCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC00MzgsOSArMjM4LDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBQYXJlbnQgbWVudSBDb250YWluZXIgLgorICAgICAqIEdldHMgdGhlIHBhcmVudCBtZW51IGNvbnRhaW5lci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwYXJlbnQKKyAgICAgKiBAcmV0dXJuIHRoZSBwYXJlbnQuCiAgICAgICovCiAgICAgcHVibGljIE1lbnVDb250YWluZXIgZ2V0UGFyZW50KCkgewogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKQEAgLTQ1NCw3ICsyNTQsOCBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIE1lbnVDb21wb25lbnQgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcuCiAgICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5ldyBuYW1lIG9mIHRoZSBNZW51Q29tcG9uZW50IG9iamVjdC4gCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgbmFtZSBvZiB0aGUgTWVudUNvbXBvbmVudCBvYmplY3QuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKQEAgLTQ2OCw3ICsyNjksOCBAQAogICAgIC8qKgogICAgICAqIERpc3BhdGNoZXMgQVdUIGV2ZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBldmVudCB0aGUgQVdURXZlbnQuCisgICAgICogQHBhcmFtIGV2ZW50CisgICAgICogICAgICAgICAgICB0aGUgQVdURXZlbnQuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgZGlzcGF0Y2hFdmVudChBV1RFdmVudCBldmVudCkgewogICAgICAgICB0b29sa2l0LmxvY2tBV1QoKTsKQEAgLTQ4NSw3ICsyODcsOCBAQAogICAgIC8qKgogICAgICAqIFBvc3QgZGVwcmVjYXRlZCBldmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIGV2ZW50CisgICAgICogQHBhcmFtIGV2ZW50CisgICAgICogICAgICAgICAgICB0aGUgZXZlbnQuCiAgICAgICovCiAgICAgdm9pZCBwb3N0RGVwcmVjYXRlZEV2ZW50KEFXVEV2ZW50IGV2ZW50KSB7CiAgICAgICAgIEV2ZW50IGV2dCA9IGV2ZW50LmdldEV2ZW50KCk7CkBAIC00OTUsMTEgKzI5OCwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHBlZXIgb2YgdGhlIE1lbnVDb21wb25lbnQ7IGFuIGFwcGxpY2F0aW9uIG11c3Qgbm90Ci0gICAgICogdXNlIHRoaXMgbWV0aG9kIGRpcmVjdGx5LgorICAgICAqIEdldHMgdGhlIHBlZXIgb2YgdGhlIE1lbnVDb21wb25lbnQ7IGFuIGFwcGxpY2F0aW9uIG11c3Qgbm90IHVzZSB0aGlzCisgICAgICogbWV0aG9kIGRpcmVjdGx5LgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIE1lbnVDb21wb25lbnRQZWVyIG9iamVjdC4KLSAgICAgKgorICAgICAqIEB0aHJvd3MgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQgYnkgYSBzdWJjbGFzcy4KICAgICAgKiBAZGVwcmVjYXRlZCBhbiBhcHBsaWNhdGlvbiBtdXN0IG5vdCB1c2UgdGhpcyBtZXRob2QgZGlyZWN0bHkuCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKQEAgLTUyNywxMSArMzMxLDkgQEAKICAgICAvKioKICAgICAgKiBQb3N0cyB0aGUgRXZlbnQgdG8gdGhlIE1lbnVDb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGUgdGhlIEV2ZW50LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIGV2ZW50IGlzIHBvc3RlZCBzdWNjZXNzZnVsbHk7IAotICAgICAqIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZQorICAgICAqICAgICAgICAgICAgdGhlIEV2ZW50LgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIGV2ZW50IGlzIHBvc3RlZCBzdWNjZXNzZnVsbHksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBkaXNwYXRjaEV2ZW50IG1ldGhvZC4KICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQpAQCAtNTUxLDggKzM1Myw3IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBNZW51Q29tcG9uZW50IHN0YXRlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBNZW51Q29tcG9uZW50Ci0gICAgICogc3RhdGUuCisgICAgICogQHJldHVybiByZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIE1lbnVDb21wb25lbnQgc3RhdGUuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIFN0cmluZyBwYXJhbVN0cmluZygpIHsKICAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7CkBAIC01NjMsMjAgKzM2NCwxMyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIHB1YmxpYyBBY2Nlc3NpYmxlQ29udGV4dCBnZXRBY2Nlc3NpYmxlQ29udGV4dCgpIHsKLSAgICAgICAgdG9vbGtpdC5sb2NrQVdUKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoYWNjZXNzaWJsZUNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFjY2Vzc2libGVDb250ZXh0ID0gY3JlYXRlQWNjZXNzaWJsZUNvbnRleHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBhY2Nlc3NpYmxlQ29udGV4dDsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHRvb2xraXQudW5sb2NrQVdUKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKi8KKyAgICAgKiBwdWJsaWMgQWNjZXNzaWJsZUNvbnRleHQgZ2V0QWNjZXNzaWJsZUNvbnRleHQoKSB7IHRvb2xraXQubG9ja0FXVCgpOyB0cnkKKyAgICAgKiB7IGlmIChhY2Nlc3NpYmxlQ29udGV4dCA9PSBudWxsKSB7IGFjY2Vzc2libGVDb250ZXh0ID0KKyAgICAgKiBjcmVhdGVBY2Nlc3NpYmxlQ29udGV4dCgpOyB9IHJldHVybiBhY2Nlc3NpYmxlQ29udGV4dDsgfSBmaW5hbGx5IHsKKyAgICAgKiB0b29sa2l0LnVubG9ja0FXVCgpOyB9IH0KKyAgICAgKi8KIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGZvbnQgb2YgdGhlIE1lbnVDb21wb25lbnQgb2JqZWN0LgpAQCAtNjA1LDEzICszOTksMTMgQEAKICAgICAgKi8KICAgICBib29sZWFuIGlzRm9udFNldCgpIHsKICAgICAgICAgcmV0dXJuIGZvbnQgIT0gbnVsbAotICAgICAgICAgICAgICAgIHx8ICgocGFyZW50IGluc3RhbmNlb2YgTWVudUNvbXBvbmVudCkgJiYgKChNZW51Q29tcG9uZW50KSBwYXJlbnQpLmlzRm9udFNldCgpKTsKKyAgICAgICAgICAgICAgICB8fCAoKHBhcmVudCBpbnN0YW5jZW9mIE1lbnVDb21wb25lbnQpICYmICgoTWVudUNvbXBvbmVudClwYXJlbnQpLmlzRm9udFNldCgpKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBDaGVja3MgZm9yIGRlZmF1bHQgZm9udC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHN1Y2Nlc3NmdWwKKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHN1Y2Nlc3NmdWwuCiAgICAgICovCiAgICAgYm9vbGVhbiBoYXNEZWZhdWx0Rm9udCgpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNjIwLDcgKzQxNCw4IEBACiAgICAgLyoqCiAgICAgICogUHJvY2Vzc2VzIGFuIEFXVEVldmVudCBvbiB0aGlzIG1lbnUgY29tcG9uZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBldmVudCB0aGUgQVdURXZlbnQuCisgICAgICogQHBhcmFtIGV2ZW50CisgICAgICogICAgICAgICAgICB0aGUgQVdURXZlbnQuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0V2ZW50KEFXVEV2ZW50IGV2ZW50KSB7CiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwpAQCAtNjQ1LDcgKzQ0MCw4IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgRm9udCBmb3IgdGhpcyBNZW51Q29tcG9uZW50IG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZm9udCB0aGUgbmV3IEZvbnQgdG8gYmUgdXNlZCBmb3IgdGhpcyBNZW51Q29tcG9uZW50LgorICAgICAqIEBwYXJhbSBmb250CisgICAgICogICAgICAgICAgICB0aGUgbmV3IEZvbnQgdG8gYmUgdXNlZCBmb3IgdGhpcyBNZW51Q29tcG9uZW50LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZvbnQoRm9udCBmb250KSB7CiAgICAgICAgIHRvb2xraXQubG9ja0FXVCgpOwpAQCAtNjU5LDcgKzQ1NSw4IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgcGFyZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIG5ldyBwYXJlbnQKKyAgICAgKiBAcGFyYW0gcGFyZW50CisgICAgICogICAgICAgICAgICB0aGUgbmV3IHBhcmVudC4KICAgICAgKi8KICAgICB2b2lkIHNldFBhcmVudChNZW51Q29udGFpbmVyIHBhcmVudCkgewogICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKQEAgLTY2OCw3ICs0NjUsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGxvY2F0aW9uLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGxvY2F0aW9uCisgICAgICogQHJldHVybiB0aGUgbG9jYXRpb24uCiAgICAgICovCiAgICAgUG9pbnQgZ2V0TG9jYXRpb24oKSB7CiAgICAgICAgIC8vIHRvIGJlIG92ZXJyaWRkZW4KQEAgLTY3OCw3ICs0NzUsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHdpZHRoLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHdpZHRoCisgICAgICogQHJldHVybiB0aGUgd2lkdGguCiAgICAgICovCiAgICAgaW50IGdldFdpZHRoKCkgewogICAgICAgICAvLyB0byBiZSBvdmVycmlkZGVuCkBAIC02ODgsNyArNDg1LDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBoZWlnaHQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgaGVpZ2h0CisgICAgICogQHJldHVybiB0aGUgaGVpZ2h0LgogICAgICAqLwogICAgIGludCBnZXRIZWlnaHQoKSB7CiAgICAgICAgIC8vIHRvIGJlIG92ZXJyaWRkZW4KQEAgLTY5OCwzMSArNDk1LDE5IEBACiAgICAgLyoqCiAgICAgICogUmVjdXJzaXZlbHkgZmluZCB0aGUgbWVudSBpdGVtIGZvciBhIG1lbnUgc2hvcnRjdXQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGdyIHRoZSBncgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1lbnUgaXRlbTsKLSAgICAgKiBvciBudWxsIGlmIHRoZSBpdGVtIGlzIG5vdCBhdmFpbGFibGUgZm9yIHRoaXMgc2hvcnRjdXQKKyAgICAgKiBAcGFyYW0gZ3IKKyAgICAgKiAgICAgICAgICAgIHRoZSBnci4KKyAgICAgKiBAcmV0dXJuIHRoZSBtZW51IGl0ZW07IG9yIG51bGwgaWYgdGhlIGl0ZW0gaXMgbm90IGF2YWlsYWJsZSBmb3IgdGhpcworICAgICAqICAgICAgICAgc2hvcnRjdXQuCiAgICAgICovCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIE1lbnVJdGVtIGdldFNob3J0Y3V0TWVudUl0ZW1JbXBsKE1lbnVTaG9ydGN1dCBtcykgewotICAgICAgICBpZiAobXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRJdGVtQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBNZW51SXRlbSBtaSA9IGdldEl0ZW0oaSk7Ci0gICAgICAgICAgICBpZiAobWkgaW5zdGFuY2VvZiBNZW51KSB7Ci0gICAgICAgICAgICAgICAgbWkgPSAoKE1lbnUpIG1pKS5nZXRTaG9ydGN1dE1lbnVJdGVtSW1wbChtcyk7Ci0gICAgICAgICAgICAgICAgaWYgKG1pICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobXMuZXF1YWxzKG1pLmdldFNob3J0Y3V0KCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAqLworICAgICAqIE1lbnVJdGVtIGdldFNob3J0Y3V0TWVudUl0ZW1JbXBsKE1lbnVTaG9ydGN1dCBtcykgeyBpZiAobXMgPT0gbnVsbCkgeworICAgICAqIHJldHVybiBudWxsOyB9IGZvciAoaW50IGkgPSAwOyBpIDwgZ2V0SXRlbUNvdW50KCk7IGkrKykgeyBNZW51SXRlbSBtaSA9CisgICAgICogZ2V0SXRlbShpKTsgaWYgKG1pIGluc3RhbmNlb2YgTWVudSkgeyBtaSA9ICgoTWVudSkKKyAgICAgKiBtaSkuZ2V0U2hvcnRjdXRNZW51SXRlbUltcGwobXMpOyBpZiAobWkgIT0gbnVsbCkgeyByZXR1cm4gbWk7IH0gfSBlbHNlIGlmCisgICAgICogKG1zLmVxdWFscyhtaS5nZXRTaG9ydGN1dCgpKSkgeyByZXR1cm4gbWk7IH0gfSByZXR1cm4gbnVsbDsgfQorICAgICAqLwogCiAgICAgdm9pZCBwYWludChHcmFwaGljcyBncikgewogICAgICAgICBnci5zZXRDb2xvcihDb2xvci5MSUdIVF9HUkFZKTsKQEAgLTczMywxMSArNTE4LDE2IEBACiAgICAgLyoqCiAgICAgICogTW91c2UgZXZlbnRzIGhhbmRsZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGV2ZW50SWQgLSBvbmUgb2YgdGhlIE1vdXNlRXZlbnQuTU9VU0VfKiBjb25zdGFudHMKLSAgICAgKiBAcGFyYW0gd2hlcmUgLSBtb3VzZSBsb2NhdGlvbgotICAgICAqIEBwYXJhbSBtb3VzZUJ1dHRvbiAtIG1vdXNlIGJ1dHRvbiB0aGF0IHdhcyBwcmVzc2VkIG9yIHJlbGVhc2VkCi0gICAgICogQHBhcmFtIHdoZW4gLSBldmVudCB0aW1lCi0gICAgICogQHBhcmFtIG1vZGlmaWVycyAtIGlucHV0IGV2ZW50IG1vZGlmaWVycworICAgICAqIEBwYXJhbSBldmVudElkCisgICAgICogICAgICAgICAgICBvbmUgb2YgdGhlIE1vdXNlRXZlbnQuTU9VU0VfKiBjb25zdGFudHMuCisgICAgICogQHBhcmFtIHdoZXJlCisgICAgICogICAgICAgICAgICBtb3VzZSBsb2NhdGlvbi4KKyAgICAgKiBAcGFyYW0gbW91c2VCdXR0b24KKyAgICAgKiAgICAgICAgICAgIG1vdXNlIGJ1dHRvbiB0aGF0IHdhcyBwcmVzc2VkIG9yIHJlbGVhc2VkLgorICAgICAqIEBwYXJhbSB3aGVuCisgICAgICogICAgICAgICAgICBldmVudCB0aW1lLgorICAgICAqIEBwYXJhbSBtb2RpZmllcnMKKyAgICAgKiAgICAgICAgICAgIGlucHV0IGV2ZW50IG1vZGlmaWVycy4KICAgICAgKi8KICAgICB2b2lkIG9uTW91c2VFdmVudChpbnQgZXZlbnRJZCwgUG9pbnQgd2hlcmUsIGludCBtb3VzZUJ1dHRvbiwgbG9uZyB3aGVuLCBpbnQgbW9kaWZpZXJzKSB7CiAgICAgICAgIC8vIHRvIGJlIG92ZXJyaWRkZW4KQEAgLTc0NiwxNTkgKzUzNiwxMDkgQEAKICAgICAvKioKICAgICAgKiBLZXlib2FyZCBldmVudCBoYW5kbGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBldmVudElkIC0gb25lIG9mIHRoZSBLZXlFdmVudC5LRVlfKiBjb25zdGFudHMKLSAgICAgKiBAcGFyYW0gdktleSAtIHRoZSBrZXkgY29kZQotICAgICAqIEBwYXJhbSB3aGVuIC0gZXZlbnQgdGltZQotICAgICAqIEBwYXJhbSBtb2RpZmllcnMgLSBpbnB1dCBldmVudCBtb2RpZmllcnMKKyAgICAgKiBAcGFyYW0gZXZlbnRJZAorICAgICAqICAgICAgICAgICAgb25lIG9mIHRoZSBLZXlFdmVudC5LRVlfKiBjb25zdGFudHMuCisgICAgICogQHBhcmFtIHZLZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgY29kZS4KKyAgICAgKiBAcGFyYW0gd2hlbgorICAgICAqICAgICAgICAgICAgZXZlbnQgdGltZS4KKyAgICAgKiBAcGFyYW0gbW9kaWZpZXJzCisgICAgICogICAgICAgICAgICBpbnB1dCBldmVudCBtb2RpZmllcnMuCiAgICAgICovCiAgICAgdm9pZCBvbktleUV2ZW50KGludCBldmVudElkLCBpbnQgdktleSwgbG9uZyB3aGVuLCBpbnQgbW9kaWZpZXJzKSB7CiAgICAgICAgIC8vIHRvIGJlIG92ZXJyaWRkZW4KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQb3N0IHRoZSBBY3Rpb25FdmVudCBvciBJdGVtRXZlbnQsCi0gICAgICogZGVwZW5kaW5nIG9uIHR5cGUgb2YgdGhlIG1lbnUgaXRlbS4KKyAgICAgKiBQb3N0IHRoZSBBY3Rpb25FdmVudCBvciBJdGVtRXZlbnQsIGRlcGVuZGluZyBvbiB0eXBlIG9mIHRoZSBtZW51IGl0ZW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleAorICAgICAqIEBwYXJhbSBpbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4LgorICAgICAqIEByZXR1cm4gdGhlIGl0ZW0gcmVjdC4KKyAgICAgKi8KKyAgICAvLyA/Pz9BV1QKKyAgICAvKgorICAgICAqIHZvaWQgZmlyZUl0ZW1BY3Rpb24oaW50IGl0ZW0sIGxvbmcgd2hlbiwgaW50IG1vZGlmaWVycykgeyBNZW51SXRlbSBtaSA9CisgICAgICogZ2V0SXRlbShpdGVtKTsgbWkuaXRlbVNlbGVjdGVkKHdoZW4sIG1vZGlmaWVycyk7IH0gTWVudUl0ZW0gZ2V0SXRlbShpbnQKKyAgICAgKiBpbmRleCkgeyAvLyB0byBiZSBvdmVycmlkZGVuIHJldHVybiBudWxsOyB9IGludCBnZXRJdGVtQ291bnQoKSB7IHJldHVybgorICAgICAqIDA7IH0KKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIHN1Yi1tZW51IG9mIGN1cnJlbnRseSBzZWxlY2V0ZCBpdGVtLCBvciBudWxsIGlmIHN1Y2ggYQorICAgICAqICAgICAgICAgc3ViLW1lbnUgaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICAvLyA/Pz9BV1QKKyAgICAvKgorICAgICAqIE1lbnUgZ2V0U2VsZWN0ZWRTdWJtZW51KCkgeyBpZiAoc2VsZWN0ZWRJdGVtSW5kZXggPCAwKSB7IHJldHVybiBudWxsOyB9CisgICAgICogTWVudUl0ZW0gaXRlbSA9IGdldEl0ZW0oc2VsZWN0ZWRJdGVtSW5kZXgpOyByZXR1cm4gKGl0ZW0gaW5zdGFuY2VvZiBNZW51KQorICAgICAqID8gKE1lbnUpIGl0ZW0gOiBudWxsOyB9CisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIHNlbGVjdEl0ZW0oaW5kZXgsIHRydWUpLgorICAgICAqLworICAgIC8vID8/P0FXVAorICAgIC8qCisgICAgICogdm9pZCBzZWxlY3RJdGVtKGludCBpbmRleCkgeyBzZWxlY3RJdGVtKGluZGV4LCB0cnVlKTsgfQorICAgICAqLworCisgICAgLyoqCisgICAgICogQ2hhbmdlIHRoZSBzZWxlY3Rpb24gaW4gdGhlIG1lbnUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgaXRlbSByZWN0CisgICAgICogQHBhcmFtIGluZGV4CisgICAgICogICAgICAgICAgICBuZXcgc2VsZWNldGQgaXRlbSdzIGluZGV4LgorICAgICAqIEBwYXJhbSBzaG93U3ViTWVudQorICAgICAqICAgICAgICAgICAgaWYgbmV3IHNlbGVjdGVkIGl0ZW0gaGFzIGEgc3ViLW1lbnUsIHNob3VsZCB0aGF0IHN1Yi1tZW51IGJlCisgICAgICogICAgICAgICAgICBkaXNwbGF5ZWQuCiAgICAgICovCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIHZvaWQgZmlyZUl0ZW1BY3Rpb24oaW50IGl0ZW0sIGxvbmcgd2hlbiwgaW50IG1vZGlmaWVycykgewotICAgICAgICBNZW51SXRlbSBtaSA9IGdldEl0ZW0oaXRlbSk7Ci0gICAgICAgIG1pLml0ZW1TZWxlY3RlZCh3aGVuLCBtb2RpZmllcnMpOwotICAgIH0KLQotICAgIE1lbnVJdGVtIGdldEl0ZW0oaW50IGluZGV4KSB7Ci0gICAgICAgIC8vIHRvIGJlIG92ZXJyaWRkZW4KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgaW50IGdldEl0ZW1Db3VudCgpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgICovCi0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBzdWItbWVudSBvZiBjdXJyZW50bHkgc2VsZWNldGQgaXRlbSwgCi0gICAgICogb3IgbnVsbCBpZiBzdWNoIGEgc3ViLW1lbnUgaXMgbm90IGF2YWlsYWJsZSAKKyAgICAgKiB2b2lkIHNlbGVjdEl0ZW0oaW50IGluZGV4LCBib29sZWFuIHNob3dTdWJNZW51KSB7IGlmIChzZWxlY3RlZEl0ZW1JbmRleAorICAgICAqID09IGluZGV4KSB7IHJldHVybjsgfSBpZiAoc2VsZWN0ZWRJdGVtSW5kZXggPj0gMCAmJgorICAgICAqIGdldEl0ZW0oc2VsZWN0ZWRJdGVtSW5kZXgpIGluc3RhbmNlb2YgTWVudSkgeyAoKE1lbnUpCisgICAgICogZ2V0SXRlbShzZWxlY3RlZEl0ZW1JbmRleCkpLmhpZGUoKTsgfSBNdWx0aVJlY3RBcmVhIGNsaXAgPQorICAgICAqIGdldFVwZGF0ZUNsaXAoaW5kZXgsIHNlbGVjdGVkSXRlbUluZGV4KTsgc2VsZWN0ZWRJdGVtSW5kZXggPSBpbmRleDsKKyAgICAgKiBHcmFwaGljcyBnciA9IGdldEdyYXBoaWNzKGNsaXApOyBpZiAoZ3IgIT0gbnVsbCkgeyBwYWludChncik7IH0gaWYKKyAgICAgKiAoc2hvd1N1Yk1lbnUpIHsgc2hvd1N1Yk1lbnUoc2VsZWN0ZWRJdGVtSW5kZXgpOyB9IH0KICAgICAgKi8KLSAgICAvLz8/P0FXVAotICAgIC8qCi0gICAgTWVudSBnZXRTZWxlY3RlZFN1Ym1lbnUoKSB7Ci0gICAgICAgIGlmIChzZWxlY3RlZEl0ZW1JbmRleCA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIE1lbnVJdGVtIGl0ZW0gPSBnZXRJdGVtKHNlbGVjdGVkSXRlbUluZGV4KTsKLSAgICAgICAgcmV0dXJuIChpdGVtIGluc3RhbmNlb2YgTWVudSkgPyAoTWVudSkgaXRlbSA6IG51bGw7Ci0gICAgfQotICAgICovCi0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIHNlbGVjdEl0ZW0oaW5kZXgsIHRydWUpCi0gICAgICovCi0gICAgLy8/Pz9BV1QKLSAgICAvKgotICAgIHZvaWQgc2VsZWN0SXRlbShpbnQgaW5kZXgpIHsKLSAgICAgICAgc2VsZWN0SXRlbShpbmRleCwgdHJ1ZSk7Ci0gICAgfQotICAgICovCi0KLSAgICAvKioKLSAgICAgKiBDaGFuZ2UgdGhlIHNlbGVjdGlvbiBpbiB0aGUgbWVudSAKLSAgICAgKiBAcGFyYW0gaW5kZXggLSBuZXcgc2VsZWNldGQgaXRlbSdzIGluZGV4Ci0gICAgICogQHBhcmFtIHNob3dTdWJNZW51IC0gaWYgbmV3IHNlbGVjdGVkIGl0ZW0gaGFzIGEgc3ViLW1lbnUsCi0gICAgICogc2hvdWxkIHRoYXQgc3ViLW1lbnUgYmUgZGlzcGxheWVkIAotICAgICAqLwotICAgIC8vPz8/QVdUCi0gICAgLyoKLSAgICB2b2lkIHNlbGVjdEl0ZW0oaW50IGluZGV4LCBib29sZWFuIHNob3dTdWJNZW51KSB7Ci0gICAgICAgIGlmIChzZWxlY3RlZEl0ZW1JbmRleCA9PSBpbmRleCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZWxlY3RlZEl0ZW1JbmRleCA+PSAwICYmIGdldEl0ZW0oc2VsZWN0ZWRJdGVtSW5kZXgpIGluc3RhbmNlb2YgTWVudSkgewotICAgICAgICAgICAgKChNZW51KSBnZXRJdGVtKHNlbGVjdGVkSXRlbUluZGV4KSkuaGlkZSgpOwotICAgICAgICB9Ci0gICAgICAgIE11bHRpUmVjdEFyZWEgY2xpcCA9IGdldFVwZGF0ZUNsaXAoaW5kZXgsIHNlbGVjdGVkSXRlbUluZGV4KTsKLSAgICAgICAgc2VsZWN0ZWRJdGVtSW5kZXggPSBpbmRleDsKLSAgICAgICAgR3JhcGhpY3MgZ3IgPSBnZXRHcmFwaGljcyhjbGlwKTsKLSAgICAgICAgaWYgKGdyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBhaW50KGdyKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2hvd1N1Yk1lbnUpIHsKLSAgICAgICAgICAgIHNob3dTdWJNZW51KHNlbGVjdGVkSXRlbUluZGV4KTsKLSAgICAgICAgfQotICAgIH0KLSAgICAqLwogCiAgICAgLyoqCiAgICAgICogQ2hhbmdlIHRoZSBzZWxlY3RlZCBpdGVtIHRvIHRoZSBuZXh0IG9uZSBpbiB0aGUgcmVxdWVzdGVkIGRpcmVjdGlvbgogICAgICAqIG1vdmluZyBjeWNsaWNhbGx5LCBza2lwcGluZyBzZXBhcmF0b3JzCi0gICAgICogQHBhcmFtIGZvcndhcmQgLSB0aGUgZGlyZWN0aW9uIHRvIG1vdmUgdGhlIHNlbGVjdGlvbgotICAgICAqIEBwYXJhbSBzaG93U3ViTWVudSAtIGlmIG5ldyBzZWxlY3RlZCBpdGVtIGhhcyBhIHN1Yi1tZW51LAotICAgICAqIHNob3VsZCB0aGF0IHN1Yi1tZW51IGJlIGRpc3BsYXllZCAKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZm9yd2FyZAorICAgICAqICAgICAgICAgICAgdGhlIGRpcmVjdGlvbiB0byBtb3ZlIHRoZSBzZWxlY3Rpb24uCisgICAgICogQHBhcmFtIHNob3dTdWJNZW51CisgICAgICogICAgICAgICAgICBpZiBuZXcgc2VsZWN0ZWQgaXRlbSBoYXMgYSBzdWItbWVudSwgc2hvdWxkIHRoYXQgc3ViLW1lbnUgYmUKKyAgICAgKiAgICAgICAgICAgIGRpc3BsYXllZC4KICAgICAgKi8KLSAgICAvLz8/P0FXVAorICAgIC8vID8/P0FXVAogICAgIC8qCi0gICAgdm9pZCBzZWxlY3ROZXh0SXRlbShib29sZWFuIGZvcndhcmQsIGJvb2xlYW4gc2hvd1N1Yk1lbnUpIHsKLSAgICAgICAgaW50IHNlbGVjdGVkID0gZ2V0U2VsZWN0ZWRJdGVtSW5kZXgoKTsKLSAgICAgICAgaW50IGNvdW50ID0gZ2V0SXRlbUNvdW50KCk7Ci0gICAgICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNlbGVjdGVkIDwgMCkgewotICAgICAgICAgICAgc2VsZWN0ZWQgPSAoZm9yd2FyZCA/IGNvdW50IC0gMSA6IDApOwotICAgICAgICB9Ci0gICAgICAgIGludCBpID0gc2VsZWN0ZWQ7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGkgPSAoZm9yd2FyZCA/IChpICsgMSkgOiAoaSArIGNvdW50IC0gMSkpICUgY291bnQ7Ci0gICAgICAgICAgICBpICU9IGNvdW50OwotICAgICAgICAgICAgTWVudUl0ZW0gaXRlbSA9IGdldEl0ZW0oaSk7Ci0gICAgICAgICAgICBpZiAoISItIi5lcXVhbHMoaXRlbS5nZXRMYWJlbCgpKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgc2VsZWN0SXRlbShpLCBzaG93U3ViTWVudSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlIChpICE9IHNlbGVjdGVkKTsKLSAgICB9Ci0KLSAgICAKLSAgICB2b2lkIHNob3dTdWJNZW51KGludCBpbmRleCkgewotICAgICAgICBpZiAoKGluZGV4IDwgMCkgfHwgIWlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBNZW51SXRlbSBpdGVtID0gZ2V0SXRlbShpbmRleCk7Ci0gICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgTWVudSkgewotICAgICAgICAgICAgTWVudSBtZW51ID0gKChNZW51KSBnZXRJdGVtKGluZGV4KSk7Ci0gICAgICAgICAgICBpZiAobWVudS5nZXRJdGVtQ291bnQoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUG9pbnQgbG9jYXRpb24gPSBnZXRTdWJtZW51TG9jYXRpb24oaW5kZXgpOwotICAgICAgICAgICAgbWVudS5zaG93KGxvY2F0aW9uLngsIGxvY2F0aW9uLnksIGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAqLworICAgICAqIHZvaWQgc2VsZWN0TmV4dEl0ZW0oYm9vbGVhbiBmb3J3YXJkLCBib29sZWFuIHNob3dTdWJNZW51KSB7IGludCBzZWxlY3RlZAorICAgICAqID0gZ2V0U2VsZWN0ZWRJdGVtSW5kZXgoKTsgaW50IGNvdW50ID0gZ2V0SXRlbUNvdW50KCk7IGlmIChjb3VudCA9PSAwKSB7CisgICAgICogcmV0dXJuOyB9IGlmIChzZWxlY3RlZCA8IDApIHsgc2VsZWN0ZWQgPSAoZm9yd2FyZCA/IGNvdW50IC0gMSA6IDApOyB9IGludAorICAgICAqIGkgPSBzZWxlY3RlZDsgZG8geyBpID0gKGZvcndhcmQgPyAoaSArIDEpIDogKGkgKyBjb3VudCAtIDEpKSAlIGNvdW50OyBpCisgICAgICogJT0gY291bnQ7IE1lbnVJdGVtIGl0ZW0gPSBnZXRJdGVtKGkpOyBpZiAoISItIi5lcXVhbHMoaXRlbS5nZXRMYWJlbCgpKSkgeworICAgICAqIC8vJE5PTi1OTFMtMSQgc2VsZWN0SXRlbShpLCBzaG93U3ViTWVudSk7IHJldHVybjsgfSB9IHdoaWxlIChpICE9CisgICAgICogc2VsZWN0ZWQpOyB9IHZvaWQgc2hvd1N1Yk1lbnUoaW50IGluZGV4KSB7IGlmICgoaW5kZXggPCAwKSB8fAorICAgICAqICFpc0FjdGl2ZSgpKSB7IHJldHVybjsgfSBNZW51SXRlbSBpdGVtID0gZ2V0SXRlbShpbmRleCk7IGlmIChpdGVtCisgICAgICogaW5zdGFuY2VvZiBNZW51KSB7IE1lbnUgbWVudSA9ICgoTWVudSkgZ2V0SXRlbShpbmRleCkpOyBpZgorICAgICAqIChtZW51LmdldEl0ZW1Db3VudCgpID09IDApIHsgcmV0dXJuOyB9IFBvaW50IGxvY2F0aW9uID0KKyAgICAgKiBnZXRTdWJtZW51TG9jYXRpb24oaW5kZXgpOyBtZW51LnNob3cobG9jYXRpb24ueCwgbG9jYXRpb24ueSwgZmFsc2UpOyB9IH0KKyAgICAgKi8KIAogICAgIC8qKgotICAgICAqIEByZXR1cm4gLSB0aGUgbWVudSBiYXIgd2hpY2ggaXMgdGhlIHJvb3Qgb2YgY3JyZW50IG1lbnUncyBoaWVyYXJjaHk7Ci0gICAgICogb3IgbnVsbCBpZiB0aGUgaGllcmFyY2h5IHJvb3QgaXMgbm90IGEgbWVudSBiYXIgCisgICAgICogQHJldHVybiB0aGUgbWVudSBiYXIgd2hpY2ggaXMgdGhlIHJvb3Qgb2YgY3VycmVudCBtZW51J3MgaGllcmFyY2h5OyBvcgorICAgICAqICAgICAgICAgbnVsbCBpZiB0aGUgaGllcmFyY2h5IHJvb3QgaXMgbm90IGEgbWVudSBiYXIuCiAgICAgICovCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIE1lbnVCYXIgZ2V0TWVudUJhcigpIHsKLSAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIE1lbnVCYXIpIHsKLSAgICAgICAgICAgIHJldHVybiAoTWVudUJhcikgcGFyZW50OwotICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBNZW51Q29tcG9uZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gKChNZW51Q29tcG9uZW50KSBwYXJlbnQpLmdldE1lbnVCYXIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBQb3B1cEJveCBnZXRQb3B1cEJveCgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgICovCisgICAgICogTWVudUJhciBnZXRNZW51QmFyKCkgeyBpZiAocGFyZW50IGluc3RhbmNlb2YgTWVudUJhcikgeyByZXR1cm4gKE1lbnVCYXIpCisgICAgICogcGFyZW50OyB9IGlmIChwYXJlbnQgaW5zdGFuY2VvZiBNZW51Q29tcG9uZW50KSB7IHJldHVybiAoKE1lbnVDb21wb25lbnQpCisgICAgICogcGFyZW50KS5nZXRNZW51QmFyKCk7IH0gcmV0dXJuIG51bGw7IH0gUG9wdXBCb3ggZ2V0UG9wdXBCb3goKSB7IHJldHVybgorICAgICAqIG51bGw7IH0KKyAgICAgKi8KIAogICAgIFJlY3RhbmdsZSBnZXRJdGVtUmVjdChpbnQgaW5kZXgpIHsKICAgICAgICAgLy8gdG8gYmUgb3ZlcnJpZGRlbgpAQCAtOTA2LDEzICs2NDYsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgdGhlIGNsaXAgcmVnaW9uIHdoZW4gbWVudSBzZWxlY3Rpb24gaXMgY2hhbmdlZAotICAgICAqIGZyb20gaW5kZXgxIHRvIGluZGV4Mi4KKyAgICAgKiBEZXRlcm1pbmUgdGhlIGNsaXAgcmVnaW9uIHdoZW4gbWVudSBzZWxlY3Rpb24gaXMgY2hhbmdlZCBmcm9tIGluZGV4MSB0bworICAgICAqIGluZGV4Mi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5kZXgxIC0gb2xkIHNlbGVjdGVkIGludGVtCi0gICAgICogQHBhcmFtIGluZGV4MiAtIG5ldyBzZWxlY3RlZCBpdGVtCi0gICAgICogCi0gICAgICogQHJldHVybiAtIHRoZSByZWdpb24gdG8gcmVwYWludAorICAgICAqIEBwYXJhbSBpbmRleDEKKyAgICAgKiAgICAgICAgICAgIG9sZCBzZWxlY3RlZCBpdGVtLgorICAgICAqIEBwYXJhbSBpbmRleDIKKyAgICAgKiAgICAgICAgICAgIG5ldyBzZWxlY3RlZCBpdGVtLgorICAgICAqIEByZXR1cm4gdGhlIHJlZ2lvbiB0byByZXBhaW50LgogICAgICAqLwogICAgIGZpbmFsIE11bHRpUmVjdEFyZWEgZ2V0VXBkYXRlQ2xpcChpbnQgaW5kZXgxLCBpbnQgaW5kZXgyKSB7CiAgICAgICAgIE11bHRpUmVjdEFyZWEgY2xpcCA9IG5ldyBNdWx0aVJlY3RBcmVhKCk7CkBAIC05MjgsOSArNjY5LDkgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBzdWJtZW51IGxvY2F0aW9uLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXgKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWJtZW51IGxvY2F0aW9uCisgICAgICogQHBhcmFtIGluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXguCisgICAgICogQHJldHVybiB0aGUgc3VibWVudSBsb2NhdGlvbi4KICAgICAgKi8KICAgICBQb2ludCBnZXRTdWJtZW51TG9jYXRpb24oaW50IGluZGV4KSB7CiAgICAgICAgIC8vIHRvIGJlIG92ZXJyaWRkZW4KQEAgLTk0MCw3ICs2ODEsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHNlbGVjdGVkIGl0ZW0gaW5kZXguCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2VsZWN0ZWQgaXRlbSBpbmRleAorICAgICAqIEByZXR1cm4gdGhlIHNlbGVjdGVkIGl0ZW0gaW5kZXguCiAgICAgICovCiAgICAgaW50IGdldFNlbGVjdGVkSXRlbUluZGV4KCkgewogICAgICAgICByZXR1cm4gc2VsZWN0ZWRJdGVtSW5kZXg7CkBAIC05NTIsMTQgKzY5MywxNSBAQAogICAgIHZvaWQgaGlkZSgpIHsKICAgICAgICAgc2VsZWN0ZWRJdGVtSW5kZXggPSAtMTsKICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIE1lbnVDb21wb25lbnQpIHsKLSAgICAgICAgICAgICgoTWVudUNvbXBvbmVudCkgcGFyZW50KS5pdGVtSGlkZGVuKHRoaXMpOworICAgICAgICAgICAgKChNZW51Q29tcG9uZW50KXBhcmVudCkuaXRlbUhpZGRlbih0aGlzKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgogICAgICAqIEl0ZW0gaGlkZGVuLgogICAgICAqIAotICAgICAqIEBwYXJhbSBtYyB0aGUgbWMKKyAgICAgKiBAcGFyYW0gbWMKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYy4KICAgICAgKi8KICAgICB2b2lkIGl0ZW1IaWRkZW4oTWVudUNvbXBvbmVudCBtYykgewogICAgICAgICAvLyB0byBiZSBvdmVycmlkZGVuCkBAIC05NjgsNyArNzEwLDcgQEAKICAgICAvKioKICAgICAgKiBDaGVja3MgaWYgaXMgdmlzaWJsZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIHZpc2libGUKKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIHZpc2libGUuCiAgICAgICovCiAgICAgYm9vbGVhbiBpc1Zpc2libGUoKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtOTc3LDcgKzcxOSw3IEBACiAgICAgLyoqCiAgICAgICogQ2hlY2tzIGlmIGlzIGFjdGl2ZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIGFjdGl2ZQorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgaXMgYWN0aXZlLgogICAgICAqLwogICAgIGJvb2xlYW4gaXNBY3RpdmUoKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtOTg3LDE0ICs3MjksMTYgQEAKICAgICAgKiBIaWRlIGFsbCBtZW51IGhpZXJhcmNoeS4KICAgICAgKi8KICAgICB2b2lkIGVuZE1lbnUoKSB7Ci0gICAgICAgIC8vPz8/QVdUOiB0b29sa2l0LmRpc3BhdGNoZXIucG9wdXBEaXNwYXRjaGVyLmRlYWN0aXZhdGVBbGwoKTsKKyAgICAgICAgLy8gPz8/QVdUOiB0b29sa2l0LmRpc3BhdGNoZXIucG9wdXBEaXNwYXRjaGVyLmRlYWN0aXZhdGVBbGwoKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBIYW5kbGUgdGhlIG1vdXNlIGNsaWNrIG9yIEVudGVyIGtleSBldmVudCBvbiBhIG1lbnUncyBpdGVtLgogICAgICAqIAotICAgICAqIEBwYXJhbSB3aGVuIC0gdGhlIGV2ZW50IHRpbWUKLSAgICAgKiBAcGFyYW0gbW9kaWZpZXJzIC0gaW5wdXQgZXZlbnQgbW9kaWZpZXJzCisgICAgICogQHBhcmFtIHdoZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBldmVudCB0aW1lLgorICAgICAqIEBwYXJhbSBtb2RpZmllcnMKKyAgICAgKiAgICAgICAgICAgIGlucHV0IGV2ZW50IG1vZGlmaWVycy4KICAgICAgKi8KICAgICB2b2lkIGl0ZW1TZWxlY3RlZChsb25nIHdoZW4sIGludCBtb2RpZmllcnMpIHsKICAgICAgICAgZW5kTWVudSgpOwpAQCAtMTAwMywxNCArNzQ3LDE0IEBACiAgICAgLyoqCiAgICAgICogQXV0byBuYW1lLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN0cmluZworICAgICAqIEByZXR1cm4gdGhlIHN0cmluZy4KICAgICAgKi8KICAgICBTdHJpbmcgYXV0b05hbWUoKSB7CiAgICAgICAgIFN0cmluZyBuYW1lID0gZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CiAgICAgICAgIGlmIChuYW1lLmluZGV4T2YoIiQiKSAhPSAtMSkgeyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQotICAgICAgICAvLz8/P0FXVDogaW50IG51bWJlciA9IHRvb2xraXQuYXV0b051bWJlci5uZXh0TWVudUNvbXBvbmVudCsrOworICAgICAgICAvLyA/Pz9BV1Q6IGludCBudW1iZXIgPSB0b29sa2l0LmF1dG9OdW1iZXIubmV4dE1lbnVDb21wb25lbnQrKzsKICAgICAgICAgaW50IG51bWJlciA9IDA7CiAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhuYW1lLmxhc3RJbmRleE9mKCIuIikgKyAxKSArIEludGVnZXIudG9TdHJpbmcobnVtYmVyKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICByZXR1cm4gbmFtZTsKQEAgLTEwMTksMTAgKzc2MywxMCBAQAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgdGhlIEdyYXBoaWNzIG9iamVjdCBmb3IgdGhlIHBvcC11cCBib3ggb2YgdGhpcyBtZW51IGNvbXBvbmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2xpcCAtIHRoZSBjbGlwIHRvIHNldCBvbiB0aGlzIEdyYXBoaWNzCi0gICAgICogCi0gICAgICogQHJldHVybiAtIHRoZSBjcmVhdGVkIEdyYXBoaWNzIG9iamVjdCwKLSAgICAgKiBvciBudWxsIGlmIHN1Y2ggb2JqZWN0IGlzIG5vdCBhdmFpbGFibGUuCisgICAgICogQHBhcmFtIGNsaXAKKyAgICAgKiAgICAgICAgICAgIHRoZSBjbGlwIHRvIHNldCBvbiB0aGlzIEdyYXBoaWNzLgorICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgR3JhcGhpY3Mgb2JqZWN0LCBvciBudWxsIGlmIHN1Y2ggb2JqZWN0IGlzIG5vdAorICAgICAqICAgICAgICAgYXZhaWxhYmxlLgogICAgICAqLwogICAgIEdyYXBoaWNzIGdldEdyYXBoaWNzKE11bHRpUmVjdEFyZWEgY2xpcCkgewogICAgICAgICAvLyB0byBiZSBvdmVycmlkZGVuCkBAIC0xMDMwLDEyICs3NzQsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAcmV0dXJuIGFjY2Vzc2libGUgY29udGV4dCBzcGVjaWZpYyBmb3IgcGFydGljdWxhciBtZW51IGNvbXBvbmVudAorICAgICAqIEByZXR1cm4gYWNjZXNzaWJsZSBjb250ZXh0IHNwZWNpZmljIGZvciBwYXJ0aWN1bGFyIG1lbnUgY29tcG9uZW50LgogICAgICAqLwotICAgIC8vPz8/QVdUCisgICAgLy8gPz8/QVdUCiAgICAgLyoKLSAgICBBY2Nlc3NpYmxlQ29udGV4dCBjcmVhdGVBY2Nlc3NpYmxlQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgICovCisgICAgICogQWNjZXNzaWJsZUNvbnRleHQgY3JlYXRlQWNjZXNzaWJsZUNvbnRleHQoKSB7IHJldHVybiBudWxsOyB9CisgICAgICovCiB9CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvTWVudUNvbnRhaW5lci5qYXZhIGIvYXd0L2phdmEvYXd0L01lbnVDb250YWluZXIuamF2YQppbmRleCA3YTQ4ZjEzLi5lNTA5YTFiIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvTWVudUNvbnRhaW5lci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9NZW51Q29udGFpbmVyLmphdmEKQEAgLTE4LDE3ICsxOCwyMSBAQAogICogQGF1dGhvciBQYXZlbCBEb2xnb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0OwogCiAvKioKICAqIFRoZSBNZW51Q29udGFpbmVyIGludGVyZmFjZSByZXByZXNlbnRzIGFsbCBtZW51IGNvbnRhaW5lcnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIE1lbnVDb250YWluZXIgewogCiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIE1lbnVDb21wb25lbnQgZnJvbSB0aGUgTWVudUNvbnRhaW5lci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYyB0aGUgTWVudUNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gYworICAgICAqICAgICAgICAgICAgdGhlIE1lbnVDb21wb25lbnQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVtb3ZlKE1lbnVDb21wb25lbnQgYyk7CiAKQEAgLTQyLDE1ICs0NiwxMiBAQAogICAgIC8qKgogICAgICAqIFBvc3RzIGFuIEV2ZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBlIHRoZSBFdmVudC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGV2ZW50IGlzIHBvc3RlZCBzdWNjZXNzZnVsbHk7IAotICAgICAqIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZQorICAgICAqICAgICAgICAgICAgdGhlIEV2ZW50LgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZXZlbnQgaXMgcG9zdGVkIHN1Y2Nlc3NmdWxseSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IGRpc3BhdGNoRXZlbnQgbWV0aG9kLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGJvb2xlYW4gcG9zdEV2ZW50KEV2ZW50IGUpOwogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9QYWludC5qYXZhIGIvYXd0L2phdmEvYXd0L1BhaW50LmphdmEKaW5kZXggZjg3MzJjOC4uZGZlYTNhNyAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L1BhaW50LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L1BhaW50LmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgQWxleGV5IEEuIFBldHJlbmtvCiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dDsKIAogaW1wb3J0IGphdmEuYXd0Lmdlb20uQWZmaW5lVHJhbnNmb3JtOwpAQCAtMjUsMjggKzI2LDMyIEBACiBpbXBvcnQgamF2YS5hd3QuaW1hZ2UuQ29sb3JNb2RlbDsKIAogLyoqCi0gKiBUaGUgUGFpbnQgaW50ZXJmYWNlIHByb3ZpZGVzIHBvc3NpYmlsaXR5IG9mIGdlbmVyYXRpbmcgCi0gKiBjb2xvciBwYXR0ZXJucyBpbiBkZXZpY2Ugc3BhY2UgZm9yIGZpbGwsIGRyYXcsIG9yIHN0cm9rZSBvcGVyYXRpb25zIAotICogaW4gYSBHcmFwaGljczJELgorICogVGhlIFBhaW50IGludGVyZmFjZSBwcm92aWRlcyBwb3NzaWJpbGl0eSBvZiBnZW5lcmF0aW5nIGNvbG9yIHBhdHRlcm5zIGluCisgKiBkZXZpY2Ugc3BhY2UgZm9yIGZpbGwsIGRyYXcsIG9yIHN0cm9rZSBvcGVyYXRpb25zIGluIGEgR3JhcGhpY3MyRC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgUGFpbnQgZXh0ZW5kcyBUcmFuc3BhcmVuY3kgewotICAgIAorCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgUGFpbnRDb250ZXh0IHdoaWNoIGlzIHVzZWQgdG8gZ2VuZXJhdGUgY29sb3IgCi0gICAgICogcGF0dGVybnMgZm9yIHJlbmRlcmluZyBvcGVyYXRpb25zIG9mIEdyYXBoaWNzMkQuCisgICAgICogQ3JlYXRlcyB0aGUgUGFpbnRDb250ZXh0IHdoaWNoIGlzIHVzZWQgdG8gZ2VuZXJhdGUgY29sb3IgcGF0dGVybnMgZm9yCisgICAgICogcmVuZGVyaW5nIG9wZXJhdGlvbnMgb2YgR3JhcGhpY3MyRC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY20gdGhlIENvbG9yTW9kZWwgb2JqZWN0LCBvciBudWxsLgotICAgICAqIEBwYXJhbSBkZXZpY2VCb3VuZHMgdGhlIFJlY3RhbmdsZSByZXByZXNlbnRzIHRoZSBib3VuZGluZyBib3ggb2YKLSAgICAgKiBkZXZpY2Ugc3BhY2UgZm9yIHRoZSBncmFwaGljcyByZW5kZXJpbmcgb3BlcmF0aW9ucy4KLSAgICAgKiBAcGFyYW0gdXNlckJvdW5kcyB0aGUgUmVjdGFuZ2xlIHJlcHJlc2VudHMgYm91bmRpbmcgYm94IG9mCi0gICAgICogdXNlciBzcGFjZSBmb3IgdGhlIGdyYXBoaWNzIHJlbmRlcmluZyBvcGVyYXRpb25zLgotICAgICAqIEBwYXJhbSB4Zm9ybSB0aGUgQWZmaW5lVHJhbnNmb3JtIGZvciB0cmFuc2xhdGlvbiBmcm9tIHVzZXIgc3BhY2UgCi0gICAgICogdG8gZGV2aWNlIHNwYWNlLgotICAgICAqIEBwYXJhbSBoaW50cyB0aGUgUmVuZGVyaW5nSGludHMgcHJlZmVyZW5jZXMuCi0gICAgICogCisgICAgICogQHBhcmFtIGNtCisgICAgICogICAgICAgICAgICB0aGUgQ29sb3JNb2RlbCBvYmplY3QsIG9yIG51bGwuCisgICAgICogQHBhcmFtIGRldmljZUJvdW5kcworICAgICAqICAgICAgICAgICAgdGhlIFJlY3RhbmdsZSByZXByZXNlbnRzIHRoZSBib3VuZGluZyBib3ggb2YgZGV2aWNlIHNwYWNlIGZvcgorICAgICAqICAgICAgICAgICAgdGhlIGdyYXBoaWNzIHJlbmRlcmluZyBvcGVyYXRpb25zLgorICAgICAqIEBwYXJhbSB1c2VyQm91bmRzCisgICAgICogICAgICAgICAgICB0aGUgUmVjdGFuZ2xlIHJlcHJlc2VudHMgYm91bmRpbmcgYm94IG9mIHVzZXIgc3BhY2UgZm9yIHRoZQorICAgICAqICAgICAgICAgICAgZ3JhcGhpY3MgcmVuZGVyaW5nIG9wZXJhdGlvbnMuCisgICAgICogQHBhcmFtIHhmb3JtCisgICAgICogICAgICAgICAgICB0aGUgQWZmaW5lVHJhbnNmb3JtIGZvciB0cmFuc2xhdGlvbiBmcm9tIHVzZXIgc3BhY2UgdG8gZGV2aWNlCisgICAgICogICAgICAgICAgICBzcGFjZS4KKyAgICAgKiBAcGFyYW0gaGludHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBSZW5kZXJpbmdIaW50cyBwcmVmZXJlbmNlcy4KICAgICAgKiBAcmV0dXJuIHRoZSBQYWludENvbnRleHQgZm9yIGdlbmVyYXRpbmcgY29sb3IgcGF0dGVybnMuCiAgICAgICovCi0gICAgUGFpbnRDb250ZXh0IGNyZWF0ZUNvbnRleHQoQ29sb3JNb2RlbCBjbSwgUmVjdGFuZ2xlIGRldmljZUJvdW5kcywKLSAgICAgICAgICAgIFJlY3RhbmdsZTJEIHVzZXJCb3VuZHMsIEFmZmluZVRyYW5zZm9ybSB4Zm9ybSwKLSAgICAgICAgICAgIFJlbmRlcmluZ0hpbnRzIGhpbnRzKTsKKyAgICBQYWludENvbnRleHQgY3JlYXRlQ29udGV4dChDb2xvck1vZGVsIGNtLCBSZWN0YW5nbGUgZGV2aWNlQm91bmRzLCBSZWN0YW5nbGUyRCB1c2VyQm91bmRzLAorICAgICAgICAgICAgQWZmaW5lVHJhbnNmb3JtIHhmb3JtLCBSZW5kZXJpbmdIaW50cyBoaW50cyk7CiB9CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvUGFpbnRDb250ZXh0LmphdmEgYi9hd3QvamF2YS9hd3QvUGFpbnRDb250ZXh0LmphdmEKaW5kZXggNjQ3ZGU4Yi4uOTY2YjZjYSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L1BhaW50Q29udGV4dC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9QYWludENvbnRleHQuamF2YQpAQCAtMTgsMjAgKzE4LDIyIEBACiAgKiBAYXV0aG9yIEFsZXhleSBBLiBQZXRyZW5rbwogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3Q7CiAKIGltcG9ydCBqYXZhLmF3dC5pbWFnZS5Db2xvck1vZGVsOwogaW1wb3J0IGphdmEuYXd0LmltYWdlLlJhc3RlcjsKIAogLyoqCi0gKiBUaGUgUGFpbnRDb250ZXh0IGludGVyZmFjZSBkZXRlcm1pbmVzIHRoZSBzcGVjaWZpYyBlbnZpcm9ubWVudCBmb3IKLSAqIGdlbmVyYXRpbmcgY29sb3IgcGF0dGVybnMgaW4gZGV2aWNlIHNwYWNlIGZvciBmaWxsLCBkcmF3LCBvciBzdHJva2UgCi0gKiByZW5kZXJpbmcgb3BlcmF0aW9ucyB1c2luZyBHcmFwaGljczJELiBUaGlzIGludGVyZmFjZSBwcm92aWRlcyBjb2xvcnMKLSAqIHRocm91Z2ggdGhlIFJhc3RlciBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpYyBDb2xvck1vZGVsIAotICogZm9yIEdyYXBoaWNzMkQgcmVuZGVyaW5nIG9wZXJhdGlvbnMuCisgKiBUaGUgUGFpbnRDb250ZXh0IGludGVyZmFjZSBkZXRlcm1pbmVzIHRoZSBzcGVjaWZpYyBlbnZpcm9ubWVudCBmb3IgZ2VuZXJhdGluZworICogY29sb3IgcGF0dGVybnMgaW4gZGV2aWNlIHNwYWNlIGZvciBmaWxsLCBkcmF3LCBvciBzdHJva2UgcmVuZGVyaW5nIG9wZXJhdGlvbnMKKyAqIHVzaW5nIEdyYXBoaWNzMkQuIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIGNvbG9ycyB0aHJvdWdoIHRoZSBSYXN0ZXIgb2JqZWN0CisgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmljIENvbG9yTW9kZWwgZm9yIEdyYXBoaWNzMkQgcmVuZGVyaW5nIG9wZXJhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIFBhaW50Q29udGV4dCB7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZWxlYXNlcyB0aGUgcmVzb3VyY2VzIGFsbG9jYXRlZCBmb3IgdGhlIG9wZXJhdGlvbi4KICAgICAgKi8KQEAgLTQ1LDIwICs0NywyMyBAQAogICAgIENvbG9yTW9kZWwgZ2V0Q29sb3JNb2RlbCgpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgUmFzdGVyIHdoaWNoIGRlZmluZXMgdGhlIGNvbG9ycyBvZiB0aGUgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyIAorICAgICAqIEdldHMgdGhlIFJhc3RlciB3aGljaCBkZWZpbmVzIHRoZSBjb2xvcnMgb2YgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhcgogICAgICAqIGFyZWEgZm9yIEdyYXBoaWNzMkQgcmVuZGVyaW5nIG9wZXJhdGlvbnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgZGV2aWNlIHNwYWNlIGFyZWEgZm9yIHdoaWNoIAotICAgICAqIGNvbG9ycyBhcmUgZ2VuZXJhdGVkLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIGRldmljZSBzcGFjZSBhcmVhIGZvciB3aGljaCAKLSAgICAgKiBjb2xvcnMgYXJlIGdlbmVyYXRlZC4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIGRldmljZSBzcGFjZSBhcmVhIGZvciB3aGljaCAKLSAgICAgKiBjb2xvcnMgYXJlIGdlbmVyYXRlZC4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHRoZSBkZXZpY2Ugc3BhY2UgYXJlYSBmb3Igd2hpY2ggCi0gICAgICogY29sb3JzIGFyZSBnZW5lcmF0ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgUmFzdGVyIG9iamVjdCB3aGljaCBjb250YWlucyB0aGUgY29sb3JzIG9mIHRoZSBzcGVjaWZpZWQgCi0gICAgICogcmVjdGFuZ3VsYXIgYXJlYSBmb3IgR3JhcGhpY3MyRCByZW5kZXJpbmcgb3BlcmF0aW9ucy4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgZGV2aWNlIHNwYWNlIGFyZWEgZm9yIHdoaWNoIGNvbG9ycyBhcmUKKyAgICAgKiAgICAgICAgICAgIGdlbmVyYXRlZC4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgZGV2aWNlIHNwYWNlIGFyZWEgZm9yIHdoaWNoIGNvbG9ycyBhcmUKKyAgICAgKiAgICAgICAgICAgIGdlbmVyYXRlZC4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBkZXZpY2Ugc3BhY2UgYXJlYSBmb3Igd2hpY2ggY29sb3JzIGFyZQorICAgICAqICAgICAgICAgICAgZ2VuZXJhdGVkLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBkZXZpY2Ugc3BhY2UgYXJlYSBmb3Igd2hpY2ggY29sb3JzIGFyZQorICAgICAqICAgICAgICAgICAgZ2VuZXJhdGVkLgorICAgICAqIEByZXR1cm4gdGhlIFJhc3RlciBvYmplY3Qgd2hpY2ggY29udGFpbnMgdGhlIGNvbG9ycyBvZiB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICByZWN0YW5ndWxhciBhcmVhIGZvciBHcmFwaGljczJEIHJlbmRlcmluZyBvcGVyYXRpb25zLgogICAgICAqLwogICAgIFJhc3RlciBnZXRSYXN0ZXIoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpOwogfQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L1BvaW50LmphdmEgYi9hd3QvamF2YS9hd3QvUG9pbnQuamF2YQppbmRleCA5OTQxOGVkLi44ZWM0MjQxIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvUG9pbnQuamF2YQorKysgYi9hd3QvamF2YS9hd3QvUG9pbnQuamF2YQpAQCAtMTgsMjggKzE4LDM3IEBACiAgKiBAYXV0aG9yIERlbmlzIE0uIEtpc2hlbmtvCiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dDsKIAogaW1wb3J0IGphdmEuYXd0Lmdlb20uUG9pbnQyRDsKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIAogLyoqCi0gKiBUaGUgUG9pbnQgY2xhc3MgcmVwcmVzZW50cyBhIHBvaW50IGxvY2F0aW9uIHdpdGggY29vcmRpbmF0ZXMgWCwgWSBpbiAKLSAqIGN1cnJlbnQgY29vcmRpbmF0ZSBzeXN0ZW0uCisgKiBUaGUgUG9pbnQgY2xhc3MgcmVwcmVzZW50cyBhIHBvaW50IGxvY2F0aW9uIHdpdGggY29vcmRpbmF0ZXMgWCwgWSBpbiBjdXJyZW50CisgKiBjb29yZGluYXRlIHN5c3RlbS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBQb2ludCBleHRlbmRzIFBvaW50MkQgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewogCi0gICAgLyoqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01Mjc2OTQwNjQwMjU5NzQ5ODUwTDsKIAotICAgIC8qKiBUaGUgWCBjb29yZGluYXRlIG9mIFBvaW50LiAqLworICAgIC8qKgorICAgICAqIFRoZSBYIGNvb3JkaW5hdGUgb2YgUG9pbnQuCisgICAgICovCiAgICAgcHVibGljIGludCB4OwotICAgIAotICAgIC8qKiBUaGUgWSBjb29yZGluYXRlIG9mIFBvaW50LiAqLworCisgICAgLyoqCisgICAgICogVGhlIFkgY29vcmRpbmF0ZSBvZiBQb2ludC4KKyAgICAgKi8KICAgICBwdWJsaWMgaW50IHk7CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgcG9pbnQgd2l0aCAoMCwgTykgY29vcmRpbmF0ZXMsIHRoZSBvcmlnaW4gb2YgCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHBvaW50IHdpdGggKDAsIE8pIGNvb3JkaW5hdGVzLCB0aGUgb3JpZ2luIG9mCiAgICAgICogY29vcmRpbmF0ZSBzeXN0ZW0uCiAgICAgICovCiAgICAgcHVibGljIFBvaW50KCkgewpAQCAtNDksMTggKzU4LDIwIEBACiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHBvaW50IHdpdGggKHgsIHkpIGNvb3JkaW5hdGVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgUG9pbnQuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiBQb2ludC4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiBQb2ludC4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiBQb2ludC4KICAgICAgKi8KICAgICBwdWJsaWMgUG9pbnQoaW50IHgsIGludCB5KSB7CiAgICAgICAgIHNldExvY2F0aW9uKHgsIHkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBwb2ludCwgZ2l2aW5nIGl0IHRoZSBzYW1lIGxvY2Fpb24gYXMKLSAgICAgKiB0aGUgcGFyYW1ldGVyIHAuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHBvaW50LCBnaXZpbmcgaXQgdGhlIHNhbWUgbG9jYXRpb24gYXMgdGhlIHBhcmFtZXRlciBwLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwIHRoZSBQb2ludCBvYmplY3QgZ2l2aW5nIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgbmV3IHBvaW50LgorICAgICAqIEBwYXJhbSBwCisgICAgICogICAgICAgICAgICB0aGUgUG9pbnQgb2JqZWN0IGdpdmluZyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIG5ldyBwb2ludC4KICAgICAgKi8KICAgICBwdWJsaWMgUG9pbnQoUG9pbnQgcCkgewogICAgICAgICBzZXRMb2NhdGlvbihwLngsIHAueSk7CkBAIC02OSwxMiArODAsMTAgQEAKICAgICAvKioKICAgICAgKiBDb21wYXJlcyBjdXJyZW50IFBvaW50IHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIG9iaiB0aGUgT2JqZWN0IHRvIGJlIGNvbXBhcmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIE9iamVjdCBiZWluZyBjb21wYXJlZCBpcyBhIFBvaW50IAotICAgICAqIHdob3NlIGNvb3JkaW5hdGVzIGFyZSBlcXVhbCB0byB0aGUgY29vcmRpbmF0ZXMgb2YgdGhpcyAKLSAgICAgKiBQb2ludCwgb3RoZXJ3aXNlIGZhbHNlLgotICAgICAqIAorICAgICAqIEBwYXJhbSBvYmoKKyAgICAgKiAgICAgICAgICAgIHRoZSBPYmplY3QgdG8gYmUgY29tcGFyZWQuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgT2JqZWN0IGJlaW5nIGNvbXBhcmVkIGlzIGEgUG9pbnQgd2hvc2UgY29vcmRpbmF0ZXMKKyAgICAgKiAgICAgICAgIGFyZSBlcXVhbCB0byB0aGUgY29vcmRpbmF0ZXMgb2YgdGhpcyBQb2ludCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqIEBzZWUgamF2YS5hd3QuZ2VvbS5Qb2ludDJEI2VxdWFscyhPYmplY3QpCiAgICAgICovCiAgICAgQE92ZXJyaWRlCkBAIC0xMDMsNyArMTEyLDYgQEAKICAgICAgKiBHZXRzIFggY29vcmRpbmF0ZSBvZiBQb2ludCBhcyBhIGRvdWJsZS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIFggY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgYXMgYSBkb3VibGUuCi0gICAgICogCiAgICAgICogQHNlZSBqYXZhLmF3dC5nZW9tLlBvaW50MkQjZ2V0WCgpCiAgICAgICovCiAgICAgQE92ZXJyaWRlCkBAIC0xMTUsNyArMTIzLDYgQEAKICAgICAgKiBHZXRzIFkgY29vcmRpbmF0ZSBvZiBQb2ludCBhcyBhIGRvdWJsZS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIFkgY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgYXMgYSBkb3VibGUuCi0gICAgICogCiAgICAgICogQHNlZSBqYXZhLmF3dC5nZW9tLlBvaW50MkQjZ2V0WSgpCiAgICAgICovCiAgICAgQE92ZXJyaWRlCkBAIC0xMzUsNyArMTQyLDggQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBsb2NhdGlvbiBvZiB0aGUgUG9pbnQgdG8gdGhlIHNhbWUgY29vcmRpbmF0ZXMgYXMgcC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcCB0aGUgUG9pbnQgdGhhdCBnaXZlcyB0aGUgbmV3IGxvY2F0aW9uLgorICAgICAqIEBwYXJhbSBwCisgICAgICogICAgICAgICAgICB0aGUgUG9pbnQgdGhhdCBnaXZlcyB0aGUgbmV3IGxvY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFBvaW50IHApIHsKICAgICAgICAgc2V0TG9jYXRpb24ocC54LCBwLnkpOwpAQCAtMTQ0LDggKzE1MiwxMCBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGxvY2F0aW9uIG9mIHRoZSBQb2ludCB0byB0aGUgY29vcmRpbmF0ZXMgWCwgWS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBQb2ludCdzIG5ldyBsb2NhdGlvbi4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBQb2ludCdzIG5ldyBsb2NhdGlvbi4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgUG9pbnQncyBuZXcgbG9jYXRpb24uCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIFBvaW50J3MgbmV3IGxvY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKGludCB4LCBpbnQgeSkgewogICAgICAgICB0aGlzLnggPSB4OwpAQCAtMTU1LDM2ICsxNjUsNDMgQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBsb2NhdGlvbiBvZiBQb2ludCB0byB0aGUgc3BlY2lmaWVkIGRvdWJsZSBjb29yZGluYXRlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCB0aGUgUG9pbnQncyBuZXcgbG9jYXRpb24uCi0gICAgICogQHBhcmFtIHkgdGhlIFkgdGhlIFBvaW50J3MgbmV3IGxvY2F0aW9uLgotICAgICAqICAKKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggdGhlIFBvaW50J3MgbmV3IGxvY2F0aW9uLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSB0aGUgUG9pbnQncyBuZXcgbG9jYXRpb24uCiAgICAgICogQHNlZSBqYXZhLmF3dC5nZW9tLlBvaW50MkQjc2V0TG9jYXRpb24oZG91YmxlLCBkb3VibGUpCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0TG9jYXRpb24oZG91YmxlIHgsIGRvdWJsZSB5KSB7Ci0gICAgICAgIHggPSB4IDwgSW50ZWdlci5NSU5fVkFMVUUgPyBJbnRlZ2VyLk1JTl9WQUxVRSA6IHggPiBJbnRlZ2VyLk1BWF9WQUxVRSA/IEludGVnZXIuTUFYX1ZBTFVFIDogeDsKLSAgICAgICAgeSA9IHkgPCBJbnRlZ2VyLk1JTl9WQUxVRSA/IEludGVnZXIuTUlOX1ZBTFVFIDogeSA+IEludGVnZXIuTUFYX1ZBTFVFID8gSW50ZWdlci5NQVhfVkFMVUUgOiB5OworICAgICAgICB4ID0geCA8IEludGVnZXIuTUlOX1ZBTFVFID8gSW50ZWdlci5NSU5fVkFMVUUgOiB4ID4gSW50ZWdlci5NQVhfVkFMVUUgPyBJbnRlZ2VyLk1BWF9WQUxVRQorICAgICAgICAgICAgICAgIDogeDsKKyAgICAgICAgeSA9IHkgPCBJbnRlZ2VyLk1JTl9WQUxVRSA/IEludGVnZXIuTUlOX1ZBTFVFIDogeSA+IEludGVnZXIuTUFYX1ZBTFVFID8gSW50ZWdlci5NQVhfVkFMVUUKKyAgICAgICAgICAgICAgICA6IHk7CiAgICAgICAgIHNldExvY2F0aW9uKChpbnQpTWF0aC5yb3VuZCh4KSwgKGludClNYXRoLnJvdW5kKHkpKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBNb3ZlcyB0aGUgUG9pbnQgdG8gdGhlIHNwZWNpZmllZCAoeCwgeSkgbG9jYXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgbmV3IGxvY2F0aW9uLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIG5ldyBsb2NhdGlvbi4gCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIG5ldyBsb2NhdGlvbi4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgbmV3IGxvY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIG1vdmUoaW50IHgsIGludCB5KSB7CiAgICAgICAgIHNldExvY2F0aW9uKHgsIHkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRyYW5zbGF0ZXMgY3VycmVudCBQb2ludCBtb3ZpbmcgaXQgZnJvbSB0aGUgcG9zaXRpb24gKHgsIHkpIAotICAgICAqIHRvIHRoZSBuZXcgcG9zaXRpb24gZ2l2ZW4gYnkgKHgrZHgsIHgrZHkpIGNvb3JkaW5hdGVzLgorICAgICAqIFRyYW5zbGF0ZXMgY3VycmVudCBQb2ludCBtb3ZpbmcgaXQgZnJvbSB0aGUgcG9zaXRpb24gKHgsIHkpIHRvIHRoZSBuZXcKKyAgICAgKiBwb3NpdGlvbiBnaXZlbiBieSAoeCtkeCwgeCtkeSkgY29vcmRpbmF0ZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGR4IHRoZSBob3Jpem9udGFsIGRlbHRhIC0gdGhlIFBvaW50IGlzIG1vdmVkIHRvIHRoaXMgZGlzdGFuY2UgYWxvbmcKLSAgICAgKiBYIGF4aXMuCi0gICAgICogQHBhcmFtIGR5IHRoZSB2ZXJ0aWNhbCBkZWx0YSAtIHRoZSBQb2ludCBpcyBtb3ZlZCB0byB0aGlzIGRpc3RhbmNlIGFsb25nCi0gICAgICogWSBheGlzLgorICAgICAqIEBwYXJhbSBkeAorICAgICAqICAgICAgICAgICAgdGhlIGhvcml6b250YWwgZGVsdGEgLSB0aGUgUG9pbnQgaXMgbW92ZWQgdG8gdGhpcyBkaXN0YW5jZQorICAgICAqICAgICAgICAgICAgYWxvbmcgWCBheGlzLgorICAgICAqIEBwYXJhbSBkeQorICAgICAqICAgICAgICAgICAgdGhlIHZlcnRpY2FsIGRlbHRhIC0gdGhlIFBvaW50IGlzIG1vdmVkIHRvIHRoaXMgZGlzdGFuY2UgYWxvbmcKKyAgICAgKiAgICAgICAgICAgIFkgYXhpcy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0cmFuc2xhdGUoaW50IGR4LCBpbnQgZHkpIHsKICAgICAgICAgeCArPSBkeDsKQEAgLTE5Miw0ICsyMDksMyBAQAogICAgIH0KIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvUG9seWdvbi5qYXZhIGIvYXd0L2phdmEvYXd0L1BvbHlnb24uamF2YQppbmRleCA2ZjNmYzk3Li5kZTMxZWI5IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvUG9seWdvbi5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9Qb2x5Z29uLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgRGVuaXMgTS4gS2lzaGVua28KICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0OwogCiBpbXBvcnQgamF2YS5hd3QuUG9pbnQ7CkBAIC0zNCw1NyArMzUsNzggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBUaGUgUG9seWdvbiBjbGFzcyBkZWZpbmVzIGFuIGNsb3NlZCBhcmVhIHNwZWNpZmllZCBieSBuIHZlcnRpY2VzIGFuZCAKLSAqIG4gZWRnZXMuIFRoZSBjb29yZGluYXRlcyBvZiB0aGUgdmVydGljZXMgYXJlIHNwZWNpZmllZCBieSB4LCB5IGFycmF5cy4KLSAqIFRoZSBlZGdlcyBhcmUgdGhlIGxpbmUgc2VnbWVudHMgZnJvbSB0aGUgcG9pbnQgKHhbaV0sIHlbaV0pIHRvIHRoZSBwb2ludCAKLSAqICh4W2krMV0sIHlbaSsxXSksIGZvciAtMSA8IGkgPCAobi0xKSBwbHVzIHRoZSBsaW5lIHNlZ21lbnQgZnJvbSAKLSAqIHRoZSBwb2ludCAoeFtuLTFdLCB5W24tMV0pIHRvIHRoZSBwb2ludCAoeFswXSwgeVswXSkgcG9pbnQuIAotICogVGhlIFBvbHlnb24gaXMgZW1wdHkgaWYgdGhlIG51bWJlciBvZiB2ZXJ0aWNlcyBpcyB6ZXJvLiAgIAorICogVGhlIFBvbHlnb24gY2xhc3MgZGVmaW5lcyBhbiBjbG9zZWQgYXJlYSBzcGVjaWZpZWQgYnkgbiB2ZXJ0aWNlcyBhbmQgbiBlZGdlcy4KKyAqIFRoZSBjb29yZGluYXRlcyBvZiB0aGUgdmVydGljZXMgYXJlIHNwZWNpZmllZCBieSB4LCB5IGFycmF5cy4gVGhlIGVkZ2VzIGFyZQorICogdGhlIGxpbmUgc2VnbWVudHMgZnJvbSB0aGUgcG9pbnQgKHhbaV0sIHlbaV0pIHRvIHRoZSBwb2ludCAoeFtpKzFdLCB5W2krMV0pLAorICogZm9yIC0xIDwgaSA8IChuLTEpIHBsdXMgdGhlIGxpbmUgc2VnbWVudCBmcm9tIHRoZSBwb2ludCAoeFtuLTFdLCB5W24tMV0pIHRvCisgKiB0aGUgcG9pbnQgKHhbMF0sIHlbMF0pIHBvaW50LiBUaGUgUG9seWdvbiBpcyBlbXB0eSBpZiB0aGUgbnVtYmVyIG9mIHZlcnRpY2VzCisgKiBpcyB6ZXJvLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFBvbHlnb24gaW1wbGVtZW50cyBTaGFwZSwgU2VyaWFsaXphYmxlIHsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgc2VyaWFsVmVyc2lvblVJRC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgc2VyaWFsVmVyc2lvblVJRC4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjQ2MDA2MTQzNzkwMDA2OTk2OUw7CiAKLSAgICAvKiogVGhlIHBvaW50cyBidWZmZXIgY2FwYWNpdHkuICovCisgICAgLyoqCisgICAgICogVGhlIHBvaW50cyBidWZmZXIgY2FwYWNpdHkuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9DQVBBQ0lUWSA9IDQ7Ci0gICAgCi0gICAgLyoqIFRoZSBudW1iZXIgb2YgUG9seWdvbiB2ZXJ0aWNlcy4qLworCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBQb2x5Z29uIHZlcnRpY2VzLgorICAgICAqLwogICAgIHB1YmxpYyBpbnQgbnBvaW50czsKLSAgICAKLSAgICAvKiogVGhlIGFycmF5IG9mIFggY29vcmRpbmF0ZXMgb2YgdGhlIHZlcnRpY2VzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGFycmF5IG9mIFggY29vcmRpbmF0ZXMgb2YgdGhlIHZlcnRpY2VzLgorICAgICAqLwogICAgIHB1YmxpYyBpbnRbXSB4cG9pbnRzOwotICAgIAotICAgIC8qKiBUaGUgYXJyYXkgb2YgWSBjb29yZGluYXRlcyBvZiB0aGUgdmVydGljZXMuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgYXJyYXkgb2YgWSBjb29yZGluYXRlcyBvZiB0aGUgdmVydGljZXMuCisgICAgICovCiAgICAgcHVibGljIGludFtdIHlwb2ludHM7Ci0gICAgCi0gICAgLyoqICAKLSAgICAgKiBUaGUgc21hbGxlc3QgUmVjdGFuZ2xlIHRoYXQgY29tcGxldGVseSBjb250YWlucyB0aGlzIFBvbHlnb24uIAorCisgICAgLyoqCisgICAgICogVGhlIHNtYWxsZXN0IFJlY3RhbmdsZSB0aGF0IGNvbXBsZXRlbHkgY29udGFpbnMgdGhpcyBQb2x5Z29uLgogICAgICAqLwogICAgIHByb3RlY3RlZCBSZWN0YW5nbGUgYm91bmRzOwogCiAgICAgLyoKLSAgICAgKiBQb2x5Z29uIHBhdGggaXRlcmF0b3IgIAorICAgICAqIFBvbHlnb24gcGF0aCBpdGVyYXRvcgogICAgICAqLwogICAgIC8qKgogICAgICAqIFRoZSBpbnRlcm5hbCBDbGFzcyBJdGVyYXRvci4KICAgICAgKi8KICAgICBjbGFzcyBJdGVyYXRvciBpbXBsZW1lbnRzIFBhdGhJdGVyYXRvciB7CiAKLSAgICAgICAgLyoqIFRoZSBzb3VyY2UgUG9seWdvbiBvYmplY3QuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgc291cmNlIFBvbHlnb24gb2JqZWN0LgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIFBvbHlnb24gcDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgcGF0aCBpdGVyYXRvciB0cmFuc2Zvcm1hdGlvbi4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHBhdGggaXRlcmF0b3IgdHJhbnNmb3JtYXRpb24uCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgQWZmaW5lVHJhbnNmb3JtIHQ7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIGN1cnJlbnQgc2VnbWVuZXQgaW5kZXguICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjdXJyZW50IHNlZ21lbnQgaW5kZXguCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgaW50IGluZGV4OwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFBvbHlnb24uSXRlcmF0b3IgZm9yIHRoZSBnaXZlbiBwb2x5Z29uIGFuZCB0cmFuc2Zvcm1hdGlvbgorICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFBvbHlnb24uSXRlcmF0b3IgZm9yIHRoZSBnaXZlbiBwb2x5Z29uIGFuZAorICAgICAgICAgKiB0cmFuc2Zvcm1hdGlvbgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGF0IC0gdGhlIEFmZmluZVRyYW5zZm9ybSBvYmplY3QgdG8gYXBwbHkgcmVjdGFuZ2xlIHBhdGgKLSAgICAgICAgICogQHBhcmFtIHAgdGhlIHAKKyAgICAgICAgICogQHBhcmFtIGF0CisgICAgICAgICAqICAgICAgICAgICAgdGhlIEFmZmluZVRyYW5zZm9ybSBvYmplY3QgdG8gYXBwbHkgcmVjdGFuZ2xlIHBhdGguCisgICAgICAgICAqIEBwYXJhbSBwCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHAuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgSXRlcmF0b3IoQWZmaW5lVHJhbnNmb3JtIGF0LCBQb2x5Z29uIHApIHsKICAgICAgICAgICAgIHRoaXMucCA9IHA7CkBAIC0xNDgsMTggKzE3MCwyMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBwb2x5Z29uIHdpdGggdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgdmVydGljZXMsCi0gICAgICogYW5kIHRoZSBnaXZlbiBhcnJheXMgb2YgeCwgeSB2ZXJ0ZXggY29vcmRpbmF0ZXMuIFRoZSBsZW5ndGggb2YgCi0gICAgICogZWFjaCBjb29yZGluYXRlIGFycmF5IG1heSBub3QgYmUgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIAotICAgICAqIHZlcnRpY2VzIGJ1dCBtYXkgYmUgZ3JlYXRlci4gT25seSB0aGUgZmlyc3QgbiBlbGVtZW50cyBhcmUgdXNlZCBmcm9tIAotICAgICAqIGVhY2ggY29vcmRpbmF0ZSBhcnJheS4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgcG9seWdvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHZlcnRpY2VzLCBhbmQgdGhlCisgICAgICogZ2l2ZW4gYXJyYXlzIG9mIHgsIHkgdmVydGV4IGNvb3JkaW5hdGVzLiBUaGUgbGVuZ3RoIG9mIGVhY2ggY29vcmRpbmF0ZQorICAgICAqIGFycmF5IG1heSBub3QgYmUgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHZlcnRpY2VzIGJ1dCBtYXkgYmUKKyAgICAgKiBncmVhdGVyLiBPbmx5IHRoZSBmaXJzdCBuIGVsZW1lbnRzIGFyZSB1c2VkIGZyb20gZWFjaCBjb29yZGluYXRlIGFycmF5LgogICAgICAqIAotICAgICAqIEBwYXJhbSB4cG9pbnRzIHRoZSBhcnJheSBvZiBYIHZlcnRleCBjb29yZGluYXRlcy4gCi0gICAgICogQHBhcmFtIHlwb2ludHMgdGhlIGFycmF5IG9mIFkgdmVydGV4IGNvb3JkaW5hdGVzLgotICAgICAqIEBwYXJhbSBucG9pbnRzIHRoZSBudW1iZXIgdmVydGljZXMgb2YgdGhlIHBvbHlnb24uCi0gICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHRoZSBsZW5ndGggb2YgeHBvaW50cyBvciB5cG9pbnRzCi0gICAgICogaXMgbGVzcyB0aGFuIG4uCi0gICAgICogQHRocm93cyBOZWdhdGl2ZUFycmF5U2l6ZUV4Y2VwdGlvbiBpZiBuIGlzIG5lZ2F0aXZlLgorICAgICAqIEBwYXJhbSB4cG9pbnRzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgWCB2ZXJ0ZXggY29vcmRpbmF0ZXMuCisgICAgICogQHBhcmFtIHlwb2ludHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBZIHZlcnRleCBjb29yZGluYXRlcy4KKyAgICAgKiBAcGFyYW0gbnBvaW50cworICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciB2ZXJ0aWNlcyBvZiB0aGUgcG9seWdvbi4KKyAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgbGVuZ3RoIG9mIHhwb2ludHMgb3IgeXBvaW50cyBpcyBsZXNzIHRoYW4gbi4KKyAgICAgKiBAdGhyb3dzIE5lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgbiBpcyBuZWdhdGl2ZS4KICAgICAgKi8KICAgICBwdWJsaWMgUG9seWdvbihpbnRbXSB4cG9pbnRzLCBpbnRbXSB5cG9pbnRzLCBpbnQgbnBvaW50cykgewogICAgICAgICBpZiAobnBvaW50cyA+IHhwb2ludHMubGVuZ3RoIHx8IG5wb2ludHMgPiB5cG9pbnRzLmxlbmd0aCkgewpAQCAtMTc4LDkgKzIwMyw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVzZXRzIHRoZSBjdXJyZW50IFBvbHlnb24gdG8gYW4gZW1wdHkgUG9seWdvbi4gTW9yZSBwcmVjaXNlbHksIAotICAgICAqIHRoZSBudW1iZXIgb2YgUG9seWdvbiB2ZXJ0aWNlcyBpcyBzZXQgdG8gemVybywgYnV0IHgsIHkgY29vcmRpbmF0ZXMgCi0gICAgICogYXJyYXlzIGFyZSBub3QgYWZmZWN0ZWQuICAKKyAgICAgKiBSZXNldHMgdGhlIGN1cnJlbnQgUG9seWdvbiB0byBhbiBlbXB0eSBQb2x5Z29uLiBNb3JlIHByZWNpc2VseSwgdGhlCisgICAgICogbnVtYmVyIG9mIFBvbHlnb24gdmVydGljZXMgaXMgc2V0IHRvIHplcm8sIGJ1dCB4LCB5IGNvb3JkaW5hdGVzIGFycmF5cworICAgICAqIGFyZSBub3QgYWZmZWN0ZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CiAgICAgICAgIG5wb2ludHMgPSAwOwpAQCAtMTg4LDIxICsyMTMsMjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnZhbGlkYXRlcyB0aGUgZGF0YSB0aGF0IGRlcGVuZHMgb24gdGhlIHZlcnRleCBjb29yZGluYXRlcy4gCi0gICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBkaXJlY3QgbWFuaXB1bGF0aW9ucyAgCi0gICAgICogb2YgdGhlIHgsIHkgdmVydGV4IGNvb3JkaW5hdGVzIGFycmF5cyB0byBhdm9pZCB1bnByZWRpY3RhYmxlIAotICAgICAqIHJlc3VsdHMgb2YgbWV0aG9kcyB3aGljaCByZWx5IG9uIHRoZSBib3VuZGluZyBib3guCisgICAgICogSW52YWxpZGF0ZXMgdGhlIGRhdGEgdGhhdCBkZXBlbmRzIG9uIHRoZSB2ZXJ0ZXggY29vcmRpbmF0ZXMuIFRoaXMgbWV0aG9kCisgICAgICogc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBkaXJlY3QgbWFuaXB1bGF0aW9ucyBvZiB0aGUgeCwgeSB2ZXJ0ZXgKKyAgICAgKiBjb29yZGluYXRlcyBhcnJheXMgdG8gYXZvaWQgdW5wcmVkaWN0YWJsZSByZXN1bHRzIG9mIG1ldGhvZHMgd2hpY2ggcmVseQorICAgICAqIG9uIHRoZSBib3VuZGluZyBib3guCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgaW52YWxpZGF0ZSgpIHsKICAgICAgICAgYm91bmRzID0gbnVsbDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBwb2ludCB0byB0aGUgUG9seWdvbiBhbmQgdXBkYXRlcyB0aGUgYm91bmRpbmcgYm94IAotICAgICAqIGFjY29yZGluZ2x5LgorICAgICAqIEFkZHMgdGhlIHBvaW50IHRvIHRoZSBQb2x5Z29uIGFuZCB1cGRhdGVzIHRoZSBib3VuZGluZyBib3ggYWNjb3JkaW5nbHkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIGFkZGVkIHZlcnRleC4KLSAgICAgKiBAcGFyYW0gcHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgYWRkZWQgdmVydGV4LgorICAgICAqIEBwYXJhbSBweAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgYWRkZWQgdmVydGV4LgorICAgICAqIEBwYXJhbSBweQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgYWRkZWQgdmVydGV4LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZFBvaW50KGludCBweCwgaW50IHB5KSB7CiAgICAgICAgIGlmIChucG9pbnRzID09IHhwb2ludHMubGVuZ3RoKSB7CkBAIC0yMjIsMjAgKzI0OCwxNiBAQAogICAgICAgICBucG9pbnRzKys7CiAKICAgICAgICAgaWYgKGJvdW5kcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBib3VuZHMuc2V0RnJhbWVGcm9tRGlhZ29uYWwoCi0gICAgICAgICAgICAgICAgICAgIE1hdGgubWluKGJvdW5kcy5nZXRNaW5YKCksIHB4KSwKLSAgICAgICAgICAgICAgICAgICAgTWF0aC5taW4oYm91bmRzLmdldE1pblkoKSwgcHkpLAotICAgICAgICAgICAgICAgICAgICBNYXRoLm1heChib3VuZHMuZ2V0TWF4WCgpLCBweCksCi0gICAgICAgICAgICAgICAgICAgIE1hdGgubWF4KGJvdW5kcy5nZXRNYXhZKCksIHB5KSk7CisgICAgICAgICAgICBib3VuZHMuc2V0RnJhbWVGcm9tRGlhZ29uYWwoTWF0aC5taW4oYm91bmRzLmdldE1pblgoKSwgcHgpLCBNYXRoLm1pbihib3VuZHMuZ2V0TWluWSgpLAorICAgICAgICAgICAgICAgICAgICBweSksIE1hdGgubWF4KGJvdW5kcy5nZXRNYXhYKCksIHB4KSwgTWF0aC5tYXgoYm91bmRzLmdldE1heFkoKSwgcHkpKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBvZiB0aGUgUG9seWdvbi4gVGhlIGJvdW5kaW5nIHJlY3RhbmdsZQotICAgICAqIGlzIHRoZSBzbWFsbGVzdCByZWN0YW5nbGUgd2hpY2ggY29udGFpbnMgdGhlIFBvbHlnb24uCisgICAgICogR2V0cyB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIG9mIHRoZSBQb2x5Z29uLiBUaGUgYm91bmRpbmcgcmVjdGFuZ2xlIGlzIHRoZQorICAgICAqIHNtYWxsZXN0IHJlY3RhbmdsZSB3aGljaCBjb250YWlucyB0aGUgUG9seWdvbi4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBib3VuZGluZyByZWN0YW5nbGUgb2YgdGhlIFBvbHlnb24uCi0gICAgICogCiAgICAgICogQHNlZSBqYXZhLmF3dC5TaGFwZSNnZXRCb3VuZHMoKQogICAgICAqLwogICAgIHB1YmxpYyBSZWN0YW5nbGUgZ2V0Qm91bmRzKCkgewpAQCAtMjcwLDExICsyOTIsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBib3VuZGluZyByZWN0YW5nbGUgb2YgdGhlIFBvbHlnb24uIFRoZSBib3VuZGluZyByZWN0YW5nbGUKLSAgICAgKiBpcyB0aGUgc21hbGxlc3QgcmVjdGFuZ2xlIHdoaWNoIGNvbnRhaW5zIHRoZSBQb2x5Z29uLgorICAgICAqIEdldHMgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBvZiB0aGUgUG9seWdvbi4gVGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBpcyB0aGUKKyAgICAgKiBzbWFsbGVzdCByZWN0YW5nbGUgd2hpY2ggY29udGFpbnMgdGhlIFBvbHlnb24uCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIG9mIHRoZSBQb2x5Z29uLgotICAgICAqIAogICAgICAqIEBkZXByZWNhdGVkIFVzZSBnZXRCb3VuZHMoKSBtZXRob2QuCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKQEAgLTI4MywxMiArMzA0LDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgUmVjdGFuZ2xlMkQgd2hpY2ggcmVwcmVzZW50cyBQb2x5Z29uIGJvdW5kcy4KLSAgICAgKiBUaGUgYm91bmRpbmcgcmVjdGFuZ2xlIGlzIHRoZSBzbWFsbGVzdCByZWN0YW5nbGUgd2hpY2ggY29udGFpbnMgCi0gICAgICogdGhlIFBvbHlnb24uCisgICAgICogR2V0cyB0aGUgUmVjdGFuZ2xlMkQgd2hpY2ggcmVwcmVzZW50cyBQb2x5Z29uIGJvdW5kcy4gVGhlIGJvdW5kaW5nCisgICAgICogcmVjdGFuZ2xlIGlzIHRoZSBzbWFsbGVzdCByZWN0YW5nbGUgd2hpY2ggY29udGFpbnMgdGhlIFBvbHlnb24uCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIG9mIHRoZSBQb2x5Z29uLgotICAgICAqIAogICAgICAqIEBzZWUgamF2YS5hd3QuU2hhcGUjZ2V0Qm91bmRzMkQoKQogICAgICAqLwogICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRCb3VuZHMyRCgpIHsKQEAgLTI5NiwxMSArMzE1LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVHJhbnNsYXRlcyBhbGwgdmVydGljZXMgb2YgUG9seWdvbiB0aGUgc3BlY2lmaWVkIGRpc3RhbmNlcwotICAgICAqIGFsb25nIFgsIFkgYXhpcy4KKyAgICAgKiBUcmFuc2xhdGVzIGFsbCB2ZXJ0aWNlcyBvZiBQb2x5Z29uIHRoZSBzcGVjaWZpZWQgZGlzdGFuY2VzIGFsb25nIFgsIFkKKyAgICAgKiBheGlzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBteCB0aGUgZGlzdGFuY2UgdG8gdHJhbnNsYXRlIGhvcml6b250YWxseS4KLSAgICAgKiBAcGFyYW0gbXkgdGhlIGRpc3RhbmNlIHRvIHRyYW5zbGF0ZSB2ZXJ0aWNhbGx5LgorICAgICAqIEBwYXJhbSBteAorICAgICAqICAgICAgICAgICAgdGhlIGRpc3RhbmNlIHRvIHRyYW5zbGF0ZSBob3Jpem9udGFsbHkuCisgICAgICogQHBhcmFtIG15CisgICAgICogICAgICAgICAgICB0aGUgZGlzdGFuY2UgdG8gdHJhbnNsYXRlIHZlcnRpY2FsbHkuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdHJhbnNsYXRlKGludCBteCwgaW50IG15KSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnBvaW50czsgaSsrKSB7CkBAIC0zMTMsNDYgKzMzNCw0NyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgcG9pbnQgZ2l2ZW4gYnkgdGhlIGNvb3JkaW5hdGVzIHgsIHkgbGllcyBpbnNpZGUgCisgICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBwb2ludCBnaXZlbiBieSB0aGUgY29vcmRpbmF0ZXMgeCwgeSBsaWVzIGluc2lkZQogICAgICAqIHRoZSBQb2x5Z29uLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50IHRvIGNoZWNrLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50IHRvIGNoZWNrLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCBwb2ludCBsaWVzIGluc2lkZSB0aGUgUG9seWdvbiwKLSAgICAgKiBvdGhlcndpc2UgZmFsc2UuCi0gICAgICogCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50IHRvIGNoZWNrLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBwb2ludCB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgcG9pbnQgbGllcyBpbnNpZGUgdGhlIFBvbHlnb24sIGZhbHNlCisgICAgICogICAgICAgICBvdGhlcndpc2UuCiAgICAgICogQGRlcHJlY2F0ZWQgVXNlIGNvbnRhaW5zKGludCwgaW50KSBtZXRob2QuCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgYm9vbGVhbiBpbnNpZGUoaW50IHgsIGludCB5KSB7Ci0gICAgICAgIHJldHVybiBjb250YWlucygoZG91YmxlKSB4LCAoZG91YmxlKSB5KTsKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5zKChkb3VibGUpeCwgKGRvdWJsZSl5KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhlIHBvaW50IGdpdmVuIGJ5IHRoZSBjb29yZGluYXRlcyB4LCB5IGxpZXMgaW5zaWRlIAorICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgcG9pbnQgZ2l2ZW4gYnkgdGhlIGNvb3JkaW5hdGVzIHgsIHkgbGllcyBpbnNpZGUKICAgICAgKiB0aGUgUG9seWdvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBwb2ludCB0byBjaGVjay4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBwb2ludCB0byBjaGVjay4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgcG9pbnQgbGllcyBpbnNpZGUgdGhlIFBvbHlnb24sCi0gICAgICogb3RoZXJ3aXNlIGZhbHNlLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBwb2ludCB0byBjaGVjay4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgdG8gY2hlY2suCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIHBvaW50IGxpZXMgaW5zaWRlIHRoZSBQb2x5Z29uLCBmYWxzZQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGludCB4LCBpbnQgeSkgewotICAgICAgICByZXR1cm4gY29udGFpbnMoKGRvdWJsZSkgeCwgKGRvdWJsZSkgeSk7CisgICAgICAgIHJldHVybiBjb250YWlucygoZG91YmxlKXgsIChkb3VibGUpeSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBwb2ludCB3aXRoIHNwZWNpZmllZCBkb3VibGUgY29vcmRpbmF0ZXMgCi0gICAgICogbGllcyBpbnNpZGUgdGhlIFBvbHlnb24uCisgICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBwb2ludCB3aXRoIHNwZWNpZmllZCBkb3VibGUgY29vcmRpbmF0ZXMgbGllcworICAgICAqIGluc2lkZSB0aGUgUG9seWdvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBwb2ludCB0byBjaGVjay4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBwb2ludCB0byBjaGVjay4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBwb2ludCBnaXZlbiBieSB0aGUgZG91YmxlIGNvb3JkaW5hdGVzIAotICAgICAqIGxpZXMgaW5zaWRlIHRoZSBQb2x5Z29uLCBvdGhlcndpc2UgZmFsc2UuCi0gICAgICogCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50IHRvIGNoZWNrLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBwb2ludCB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBwb2ludCBnaXZlbiBieSB0aGUgZG91YmxlIGNvb3JkaW5hdGVzIGxpZXMgaW5zaWRlCisgICAgICogICAgICAgICB0aGUgUG9seWdvbiwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqIEBzZWUgamF2YS5hd3QuU2hhcGUjY29udGFpbnMoZG91YmxlLCBkb3VibGUpCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoZG91YmxlIHgsIGRvdWJsZSB5KSB7CkBAIC0zNjAsMTkgKzM4MiwyMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgcmVjdGFuZ2xlIGRldGVybWluZWQgYnkgdGhlIHBhcmFtZXRlcnMgIAotICAgICAqIFt4LCB5LCB3aWR0aCwgaGVpZ2h0XSBsaWVzIGluc2lkZSB0aGUgUG9seWdvbi4KKyAgICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhlIHJlY3RhbmdsZSBkZXRlcm1pbmVkIGJ5IHRoZSBwYXJhbWV0ZXJzIFt4LCB5LAorICAgICAqIHdpZHRoLCBoZWlnaHRdIGxpZXMgaW5zaWRlIHRoZSBQb2x5Z29uLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZXMncyBsZWZ0IHVwcGVyIAotICAgICAqIGNvcm5lciBhcyBhIGRvdWJsZS4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGVzJ3MgbGVmdCB1cHBlciAKLSAgICAgKiBjb3JuZXIgYXMgYSBkb3VibGUuCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiByZWN0YW5nbGUgYXMgYSBkb3VibGUuCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSBoZWlnaHQgb2YgcmVjdGFuZ2xlIGFzIGEgZG91YmxlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCByZWN0YW5nbGUgbGllcyBpbnNpZGUgdGhlIFBvbHlnb24sCi0gICAgICogb3RoZXJ3aXNlIGZhbHNlLgotICAgICAqIAorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGVzJ3MgbGVmdCB1cHBlciBjb3JuZXIgYXMgYQorICAgICAqICAgICAgICAgICAgZG91YmxlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGVzJ3MgbGVmdCB1cHBlciBjb3JuZXIgYXMgYQorICAgICAqICAgICAgICAgICAgZG91YmxlLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHJlY3RhbmdsZSBhcyBhIGRvdWJsZS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHJlY3RhbmdsZSBhcyBhIGRvdWJsZS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ2xlIGxpZXMgaW5zaWRlIHRoZSBQb2x5Z29uLCBmYWxzZQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqIEBzZWUgamF2YS5hd3QuU2hhcGUjY29udGFpbnMoZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlKQogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHdpZHRoLCBkb3VibGUgaGVpZ2h0KSB7CkBAIC0zODEsMjAgKzQwNSwyMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgcmVjdGFuZ2xlIGRldGVybWluZWQgYnkgdGhlIHBhcmFtZXRlcnMgIAotICAgICAqIFt4LCB5LCB3aWR0aCwgaGVpZ2h0XSBpbnRlcnNlY3RzIHRoZSBpbnRlcmlvciBvZgotICAgICAqIHRoZSBQb2x5Z29uLgorICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgcmVjdGFuZ2xlIGRldGVybWluZWQgYnkgdGhlIHBhcmFtZXRlcnMgW3gsIHksCisgICAgICogd2lkdGgsIGhlaWdodF0gaW50ZXJzZWN0cyB0aGUgaW50ZXJpb3Igb2YgdGhlIFBvbHlnb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlcydzIGxlZnQgdXBwZXIgCi0gICAgICogY29ybmVyIGFzIGEgZG91YmxlLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZXMncyBsZWZ0IHVwcGVyIAotICAgICAqIGNvcm5lciBhcyBhIGRvdWJsZS4KLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHJlY3RhbmdsZSBhcyBhIGRvdWJsZS4KLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIGhlaWdodCBvZiByZWN0YW5nbGUgYXMgYSBkb3VibGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIHJlY3RhbmdsZSBpbnRlcnNlY3RzIHRoZSBpbnRlcmlvciBvZgotICAgICAqIHRoZSBQb2x5Z29uLCBvdGhlcndpc2UgZmFsc2UuCi0gICAgICogCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZXMncyBsZWZ0IHVwcGVyIGNvcm5lciBhcyBhCisgICAgICogICAgICAgICAgICBkb3VibGUuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZXMncyBsZWZ0IHVwcGVyIGNvcm5lciBhcyBhCisgICAgICogICAgICAgICAgICBkb3VibGUuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgcmVjdGFuZ2xlIGFzIGEgZG91YmxlLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgcmVjdGFuZ2xlIGFzIGEgZG91YmxlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCByZWN0YW5nbGUgaW50ZXJzZWN0cyB0aGUgaW50ZXJpb3Igb2YgdGhlCisgICAgICogICAgICAgICBQb2x5Z29uLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICogQHNlZSBqYXZhLmF3dC5TaGFwZSNpbnRlcnNlY3RzKGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSkKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpbnRlcnNlY3RzKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHdpZHRoLCBkb3VibGUgaGVpZ2h0KSB7CkBAIC00MDUsMTEgKzQzMCwxMCBAQAogICAgIC8qKgogICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIHJlY3RhbmdsZSBsaWVzIGluc2lkZSB0aGUgUG9seWdvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVjdCB0aGUgUmVjdGFuZ2xlMkQgb2JqZWN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCByZWN0YW5nbGUgbGllcyBpbnNpZGUgdGhlIFBvbHlnb24sCi0gICAgICogb3RoZXJ3aXNlIGZhbHNlLgotICAgICAqIAorICAgICAqIEBwYXJhbSByZWN0CisgICAgICogICAgICAgICAgICB0aGUgUmVjdGFuZ2xlMkQgb2JqZWN0LgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCByZWN0YW5nbGUgbGllcyBpbnNpZGUgdGhlIFBvbHlnb24sIGZhbHNlCisgICAgICogICAgICAgICBvdGhlcndpc2UuCiAgICAgICogQHNlZSBqYXZhLmF3dC5TaGFwZSNjb250YWlucyhqYXZhLmF3dC5nZW9tLlJlY3RhbmdsZTJEKQogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFJlY3RhbmdsZTJEIHJlY3QpIHsKQEAgLTQxOSwxMCArNDQzLDEwIEBACiAgICAgLyoqCiAgICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBzcGVjaWZpZWQgUG9pbnQgbGllcyBpbnNpZGUgdGhlIFBvbHlnb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIHBvaW50IHRoZSBQb2ludCBvYmplY3QuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIFBvaW50IGxpZXMgaW5zaWRlIHRoZSBQb2x5Z29uLAotICAgICAqIG90aGVyd2lzZSBmYWxzZS4KKyAgICAgKiBAcGFyYW0gcG9pbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBQb2ludCBvYmplY3QuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIFBvaW50IGxpZXMgaW5zaWRlIHRoZSBQb2x5Z29uLCBmYWxzZQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFBvaW50IHBvaW50KSB7CiAgICAgICAgIHJldHVybiBjb250YWlucyhwb2ludC5nZXRYKCksIHBvaW50LmdldFkoKSk7CkBAIC00MzEsMTEgKzQ1NSwxMCBAQAogICAgIC8qKgogICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIFBvaW50MkQgbGllcyBpbnNpZGUgdGhlIFBvbHlnb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIHBvaW50IHRoZSBQb2ludDJEIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgUG9pbnQyRCBsaWVzIGluc2lkZSB0aGUgUG9seWdvbiwKLSAgICAgKiBvdGhlcndpc2UgZmFsc2UuCi0gICAgICogCisgICAgICogQHBhcmFtIHBvaW50CisgICAgICogICAgICAgICAgICB0aGUgUG9pbnQyRCBvYmplY3QuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIFBvaW50MkQgbGllcyBpbnNpZGUgdGhlIFBvbHlnb24sIGZhbHNlCisgICAgICogICAgICAgICBvdGhlcndpc2UuCiAgICAgICogQHNlZSBqYXZhLmF3dC5TaGFwZSNjb250YWlucyhqYXZhLmF3dC5nZW9tLlBvaW50MkQpCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoUG9pbnQyRCBwb2ludCkgewpAQCAtNDQzLDE0ICs0NjYsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhlIGludGVyaW9yIG9mIHJlY3RhbmdsZSBzcGVjaWZpZWQgYnkgCi0gICAgICogdGhlIFJlY3RhbmdsZTJEIG9iamVjdCBpbnRlcnNlY3RzIHRoZSBpbnRlcmlvciBvZiB0aGUgUG9seWdvbi4KKyAgICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhlIGludGVyaW9yIG9mIHJlY3RhbmdsZSBzcGVjaWZpZWQgYnkgdGhlCisgICAgICogUmVjdGFuZ2xlMkQgb2JqZWN0IGludGVyc2VjdHMgdGhlIGludGVyaW9yIG9mIHRoZSBQb2x5Z29uLgogICAgICAqIAotICAgICAqIEBwYXJhbSByZWN0IHRoZSBSZWN0YW5nbGUyRCBvYmplY3QuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgUmVjdGFuZ2xlMkQgaW50ZXJzZWN0cyB0aGUgaW50ZXJpb3Igb2YKLSAgICAgKiB0aGUgUG9seWdvbiwgb3RoZXJ3aXNlIGZhbHNlLgotICAgICAqIAorICAgICAqIEBwYXJhbSByZWN0CisgICAgICogICAgICAgICAgICB0aGUgUmVjdGFuZ2xlMkQgb2JqZWN0LgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIFJlY3RhbmdsZTJEIGludGVyc2VjdHMgdGhlIGludGVyaW9yIG9mIHRoZSBQb2x5Z29uLAorICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqIEBzZWUgamF2YS5hd3QuU2hhcGUjaW50ZXJzZWN0cyhqYXZhLmF3dC5nZW9tLlJlY3RhbmdsZTJEKQogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGludGVyc2VjdHMoUmVjdGFuZ2xlMkQgcmVjdCkgewpAQCAtNDU4LDEzICs0ODAsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBQYXRoSXRlcmF0b3Igb2JqZWN0IHdoaWNoIGdpdmVzIHRoZSBjb29yZGluYXRlcyBvZiAKLSAgICAgKiB0aGUgcG9seWdvbiwgdHJhbnNmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgQWZmaW5lVHJhbnNmb3JtLgorICAgICAqIEdldHMgdGhlIFBhdGhJdGVyYXRvciBvYmplY3Qgd2hpY2ggZ2l2ZXMgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBwb2x5Z29uLAorICAgICAqIHRyYW5zZm9ybWVkIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIEFmZmluZVRyYW5zZm9ybS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdCB0aGUgc3BlY2lmaWVkIEFmZmluZVRyYW5zZm9ybSBvYmplY3QsIG9yIG51bGwuCi0gICAgICogCisgICAgICogQHBhcmFtIHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgQWZmaW5lVHJhbnNmb3JtIG9iamVjdCBvciBudWxsLgogICAgICAqIEByZXR1cm4gUGF0aEl0ZXJhdG9yIG9iamVjdCBmb3IgdGhlIFBvbHlnb24uCi0gICAgICogCiAgICAgICogQHNlZSBqYXZhLmF3dC5TaGFwZSNnZXRQYXRoSXRlcmF0b3IoamF2YS5hd3QuZ2VvbS5BZmZpbmVUcmFuc2Zvcm0pCiAgICAgICovCiAgICAgcHVibGljIFBhdGhJdGVyYXRvciBnZXRQYXRoSXRlcmF0b3IoQWZmaW5lVHJhbnNmb3JtIHQpIHsKQEAgLTQ3MiwyMyArNDkzLDIzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgUGF0aEl0ZXJhdG9yIG9iamVjdCB3aGljaCBnaXZlcyB0aGUgY29vcmRpbmF0ZXMgb2YgCi0gICAgICogdGhlIHBvbHlnb24sIHRyYW5zZm9ybWVkIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIEFmZmluZVRyYW5zZm9ybS4KLSAgICAgKiBUaGUgZmxhdG5lc3MgcGFyYW1ldGVyIGlzIGlnbm9yZWQuCisgICAgICogR2V0cyB0aGUgUGF0aEl0ZXJhdG9yIG9iamVjdCB3aGljaCBnaXZlcyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHBvbHlnb24sCisgICAgICogdHJhbnNmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgQWZmaW5lVHJhbnNmb3JtLiBUaGUgZmxhdG5lc3MKKyAgICAgKiBwYXJhbWV0ZXIgaXMgaWdub3JlZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdCB0aGUgc3BlY2lmaWVkIEFmZmluZVRyYW5zZm9ybSBvYmplY3QsIG9yIG51bGwuCi0gICAgICogQHBhcmFtIGZsYXRuZXNzIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0aGUgY29udHJvbCBwb2ludHMgZm9yIAotICAgICAqIGEgZ2l2ZW4gY3VydmUgd2hpY2ggdmFyaWVzIGZyb20gY29saW5lYXIgYmVmb3JlIGEgc3ViZGl2aWRlZCBjdXJ2ZSAKLSAgICAgKiBpcyByZXBsYWNlZCBieSBhIHN0cmFpZ2h0IGxpbmUgY29ubmVjdGluZyB0aGUgZW5kcG9pbnRzLiAKLSAgICAgKiBUaGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkIGZvciB0aGUgUG9seWdvbiBjbGFzcy4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gdAorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBBZmZpbmVUcmFuc2Zvcm0gb2JqZWN0IG9yIG51bGwuCisgICAgICogQHBhcmFtIGZsYXRuZXNzCisgICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGhlIGNvbnRyb2wgcG9pbnRzIGZvciBhIGdpdmVuIGN1cnZlCisgICAgICogICAgICAgICAgICB3aGljaCB2YXJpZXMgZnJvbSBjb2xpbmVhciBiZWZvcmUgYSBzdWJkaXZpZGVkIGN1cnZlIGlzCisgICAgICogICAgICAgICAgICByZXBsYWNlZCBieSBhIHN0cmFpZ2h0IGxpbmUgY29ubmVjdGluZyB0aGUgZW5kcG9pbnRzLiBUaGlzCisgICAgICogICAgICAgICAgICBwYXJhbWV0ZXIgaXMgaWdub3JlZCBmb3IgdGhlIFBvbHlnb24gY2xhc3MuCiAgICAgICogQHJldHVybiBQYXRoSXRlcmF0b3Igb2JqZWN0IGZvciB0aGUgUG9seWdvbi4KLSAgICAgKiAgCi0gICAgICogQHNlZSBqYXZhLmF3dC5TaGFwZSNnZXRQYXRoSXRlcmF0b3IoamF2YS5hd3QuZ2VvbS5BZmZpbmVUcmFuc2Zvcm0sIGRvdWJsZSkKKyAgICAgKiBAc2VlIGphdmEuYXd0LlNoYXBlI2dldFBhdGhJdGVyYXRvcihqYXZhLmF3dC5nZW9tLkFmZmluZVRyYW5zZm9ybSwKKyAgICAgKiAgICAgIGRvdWJsZSkKICAgICAgKi8KICAgICBwdWJsaWMgUGF0aEl0ZXJhdG9yIGdldFBhdGhJdGVyYXRvcihBZmZpbmVUcmFuc2Zvcm0gdCwgZG91YmxlIGZsYXRuZXNzKSB7CiAgICAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IodCwgdGhpcyk7CiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9SZWN0YW5nbGUuamF2YSBiL2F3dC9qYXZhL2F3dC9SZWN0YW5nbGUuamF2YQppbmRleCA4NmM0ZGZjLi5kOGViYjNhIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvUmVjdGFuZ2xlLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L1JlY3RhbmdsZS5qYXZhCkBAIC0xOCwzNiArMTgsNDggQEAKICAqIEBhdXRob3IgRGVuaXMgTS4gS2lzaGVua28KICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0OwogCiBpbXBvcnQgamF2YS5hd3QuZ2VvbS5SZWN0YW5nbGUyRDsKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIAogLyoqCi0gKiBUaGUgUmVjdGFuZ2xlIGNsYXNzIGRlZmluZXMgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgaW4gdGVybXMgb2YgaXRzCi0gKiB1cHBlciBsZWZ0IGNvcm5lciBjb29yZGluYXRlcyBbeCx5XSwgaXRzIHdpZHRoLCBhbmQgaXRzIGhlaWdodC4gIAotICogQSBSZWN0YW5nbGUgc3BlY2lmaWVkIGJ5IFt4LCB5LCB3aWR0aCwgaGVpZ2h0XSBwYXJhbWV0ZXJzIGhhcyBhbiAKLSAqIG91dGxpbmUgcGF0aCB3aXRoIGNvcm5lcnMgYXQgW3gsIHldLCBbeCArIHdpZHRoLHldLCBbeCArIHdpZHRoLHkgKyBoZWlnaHRdLCAKLSAqIGFuZCBbeCwgeSArIGhlaWdodF0uIAotICogPGJyPjxicj4KLSAqIFRoZSByZWN0YW5nbGUgaXMgZW1wdHkgaWYgdGhlIHdpZHRoIG9yIGhlaWdodCBpcyBuZWdhdGl2ZSBvciB6ZXJvLiAKLSAqIEluIHRoaXMgY2FzZSB0aGUgaXNFbXB0eSBtZXRob2QgcmV0dXJucyB0cnVlLgorICogVGhlIFJlY3RhbmdsZSBjbGFzcyBkZWZpbmVzIHRoZSByZWN0YW5ndWxhciBhcmVhIGluIHRlcm1zIG9mIGl0cyB1cHBlciBsZWZ0CisgKiBjb3JuZXIgY29vcmRpbmF0ZXMgW3gseV0sIGl0cyB3aWR0aCwgYW5kIGl0cyBoZWlnaHQuIEEgUmVjdGFuZ2xlIHNwZWNpZmllZCBieQorICogW3gsIHksIHdpZHRoLCBoZWlnaHRdIHBhcmFtZXRlcnMgaGFzIGFuIG91dGxpbmUgcGF0aCB3aXRoIGNvcm5lcnMgYXQgW3gsIHldLAorICogW3ggKyB3aWR0aCx5XSwgW3ggKyB3aWR0aCx5ICsgaGVpZ2h0XSwgYW5kIFt4LCB5ICsgaGVpZ2h0XS4gPGJyPgorICogPGJyPgorICogVGhlIHJlY3RhbmdsZSBpcyBlbXB0eSBpZiB0aGUgd2lkdGggb3IgaGVpZ2h0IGlzIG5lZ2F0aXZlIG9yIHplcm8uIEluIHRoaXMKKyAqIGNhc2UgdGhlIGlzRW1wdHkgbWV0aG9kIHJldHVybnMgdHJ1ZS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBSZWN0YW5nbGUgZXh0ZW5kcyBSZWN0YW5nbGUyRCBpbXBsZW1lbnRzIFNoYXBlLCBTZXJpYWxpemFibGUgewogCi0gICAgLyoqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00MzQ1ODU3MDcwMjU1Njc0NzY0TDsKIAotICAgIC8qKiBUaGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyBsZWZ0IHVwcGVyIGNvcm5lci4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyBsZWZ0IHVwcGVyIGNvcm5lci4KKyAgICAgKi8KICAgICBwdWJsaWMgaW50IHg7Ci0gICAgCi0gICAgLyoqIFRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIGxlZnQgdXBwZXIgY29ybmVyLiAqLworCisgICAgLyoqCisgICAgICogVGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgbGVmdCB1cHBlciBjb3JuZXIuCisgICAgICovCiAgICAgcHVibGljIGludCB5OwotICAgIAotICAgIC8qKiBUaGUgd2lkdGggb2YgcmVjdGFuZ2xlLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHdpZHRoIG9mIHJlY3RhbmdsZS4KKyAgICAgKi8KICAgICBwdWJsaWMgaW50IHdpZHRoOwotICAgIAotICAgIC8qKiBUaGUgaGVpZ2h0IG9mIHJlY3RhbmdsZS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBoZWlnaHQgb2YgcmVjdGFuZ2xlLgorICAgICAqLwogICAgIHB1YmxpYyBpbnQgaGVpZ2h0OwogCiAgICAgLyoqCkBAIC02MCw3MyArNzIsODIgQEAKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyByZWN0YW5nbGUgd2hvc2UgdXBwZXIgbGVmdCBjb3JuZXIgY29vcmRpbmF0ZXMgYXJlCi0gICAgICogZ2l2ZW4gYnkgdGhlIFBvaW50IG9iamVjdCAocC5YIGFuZCBwLlkpLCBhbmQgdGhlIHdpZHRoIGFuZCAKLSAgICAgKiB0aGUgaGVpZ2h0IGFyZSB6ZXJvLiAKKyAgICAgKiBnaXZlbiBieSB0aGUgUG9pbnQgb2JqZWN0IChwLlggYW5kIHAuWSksIGFuZCB0aGUgd2lkdGggYW5kIHRoZSBoZWlnaHQgYXJlCisgICAgICogemVyby4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcCB0aGUgUG9pbnQgc3BlY2lmaWVzIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBjb29yZGluYXRlcyBvZiAKLSAgICAgKiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSBwCisgICAgICogICAgICAgICAgICB0aGUgUG9pbnQgc3BlY2lmaWVzIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBjb29yZGluYXRlcyBvZiB0aGUKKyAgICAgKiAgICAgICAgICAgIHJlY3RhbmdsZS4KICAgICAgKi8KICAgICBwdWJsaWMgUmVjdGFuZ2xlKFBvaW50IHApIHsKICAgICAgICAgc2V0Qm91bmRzKHAueCwgcC55LCAwLCAwKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHJlY3RhbmdsZSB3aG9zZSB1cHBlciBsZWZ0IGNvcm5lciBjb29yZGluYXRlcyBhcmUKLSAgICAgKiBnaXZlbiBieSB0aGUgUG9pbnQgb2JqZWN0IChwLlggYW5kIHAuWSksIGFuZCB0aGUgd2lkdGggYW5kIHRoZSBoZWlnaHQKLSAgICAgKiBhcmUgZ2l2ZW4gYnkgRGltZW5zaW9uIG9iamVjdCAoZC53aWR0aCBhbmQgZC5oZWlnaHQpLiAKKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgcmVjdGFuZ2xlIHdob3NlIHVwcGVyIGxlZnQgY29ybmVyIGNvb3JkaW5hdGVzIGFyZQorICAgICAqIGdpdmVuIGJ5IHRoZSBQb2ludCBvYmplY3QgKHAuWCBhbmQgcC5ZKSwgYW5kIHRoZSB3aWR0aCBhbmQgdGhlIGhlaWdodCBhcmUKKyAgICAgKiBnaXZlbiBieSBEaW1lbnNpb24gb2JqZWN0IChkLndpZHRoIGFuZCBkLmhlaWdodCkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHAgdGhlIFBvaW50IHNwZWNpZmllcyB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgY29vcmRpbmF0ZXMgb2YgCi0gICAgICogdGhlIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gZCB0aGUgRGltZW50aW9uIHNwZWNpZmllcyB0aGUgd2lkdGggYW5kIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4gCisgICAgICogQHBhcmFtIHAKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb2ludCBzcGVjaWZpZXMgdGhlIHVwcGVyIGxlZnQgY29ybmVyIGNvb3JkaW5hdGVzIG9mIHRoZQorICAgICAqICAgICAgICAgICAgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSBkCisgICAgICogICAgICAgICAgICB0aGUgZGltZW5zaW9uIHNwZWNpZmllcyB0aGUgd2lkdGggYW5kIHRoZSBoZWlnaHQgb2YgdGhlCisgICAgICogICAgICAgICAgICByZWN0YW5nbGUuCiAgICAgICovCiAgICAgcHVibGljIFJlY3RhbmdsZShQb2ludCBwLCBEaW1lbnNpb24gZCkgewogICAgICAgICBzZXRCb3VuZHMocC54LCBwLnksIGQud2lkdGgsIGQuaGVpZ2h0KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgcmVjdGFuZ2xlIGRldGVybWluZWQgYnkgdGhlIHVwcGVyIGxlZnQgY29ybmVyIAorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyByZWN0YW5nbGUgZGV0ZXJtaW5lZCBieSB0aGUgdXBwZXIgbGVmdCBjb3JuZXIKICAgICAgKiBjb29yZGluYXRlcyAoeCwgeSksIHdpZHRoIGFuZCBoZWlnaHQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggdXBwZXIgbGVmdCBjb3JuZXIgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIHVwcGVyIGxlZnQgY29ybmVyIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgcmVjdGFuZ2xlLiAKKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggdXBwZXIgbGVmdCBjb3JuZXIgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSB1cHBlciBsZWZ0IGNvcm5lciBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgcmVjdGFuZ2xlLgogICAgICAqLwogICAgIHB1YmxpYyBSZWN0YW5nbGUoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKICAgICAgICAgc2V0Qm91bmRzKHgsIHksIHdpZHRoLCBoZWlnaHQpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyByZWN0YW5nbGUgd2l0aCBbMCwgMF0gYXMgaXRzIHVwcGVyIGxlZnQgCi0gICAgICogY29ybmVyIGNvb3JkaW5hdGVzIGFuZCB0aGUgc3BlY2lmaWVkIHdpZHRoIGFuZCBoZWlnaHQuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHJlY3RhbmdsZSB3aXRoIFswLCAwXSBhcyBpdHMgdXBwZXIgbGVmdCBjb3JuZXIKKyAgICAgKiBjb29yZGluYXRlcyBhbmQgdGhlIHNwZWNpZmllZCB3aWR0aCBhbmQgaGVpZ2h0LgogICAgICAqIAotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiByZWN0YW5nbGUuIAorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHJlY3RhbmdsZS4KICAgICAgKi8KICAgICBwdWJsaWMgUmVjdGFuZ2xlKGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICAgICAgICBzZXRCb3VuZHMoMCwgMCwgd2lkdGgsIGhlaWdodCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHJlY3RhbmdsZSB3aXRoIHRoZSBzYW1lIGNvb3JkaW5hdGVzIAotICAgICAqIGFzIHRoZSBnaXZlbiBzb3VyY2UgcmVjdGFuZ2xlLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyByZWN0YW5nbGUgd2l0aCB0aGUgc2FtZSBjb29yZGluYXRlcyBhcyB0aGUgZ2l2ZW4KKyAgICAgKiBzb3VyY2UgcmVjdGFuZ2xlLgogICAgICAqIAotICAgICAqIEBwYXJhbSByIHRoZSBSZWN0YW5nbGUgb2JqZWN0IHdoaWNoIHBhcmFtZXRlcnMgd2lsbCBiZSB1c2VkIGZvciAKLSAgICAgKiBpbnN0YW50aWF0aW5nIGEgbmV3IFJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gcgorICAgICAqICAgICAgICAgICAgdGhlIFJlY3RhbmdsZSBvYmplY3Qgd2hpY2ggcGFyYW1ldGVycyB3aWxsIGJlIHVzZWQgZm9yCisgICAgICogICAgICAgICAgICBpbnN0YW50aWF0aW5nIGEgbmV3IFJlY3RhbmdsZS4KICAgICAgKi8KICAgICBwdWJsaWMgUmVjdGFuZ2xlKFJlY3RhbmdsZSByKSB7CiAgICAgICAgIHNldEJvdW5kcyhyLngsIHIueSwgci53aWR0aCwgci5oZWlnaHQpOwogICAgIH0KLS8qCi0gICAgcHVibGljIFJlY3RhbmdsZShEaW1lbnNpb24gZCkgewotICAgICAgICBzZXRCb3VuZHMoMCwgMCwgZC53aWR0aCwgZC5oZWlnaHQpOwotICAgIH0KLSovCisKKyAgICAvKgorICAgICAqIHB1YmxpYyBSZWN0YW5nbGUoRGltZW5zaW9uIGQpIHsgc2V0Qm91bmRzKDAsIDAsIGQud2lkdGgsIGQuaGVpZ2h0KTsgfQorICAgICAqLwogICAgIC8qKgogICAgICAqIEdldHMgdGhlIFggY29vcmRpbmF0ZSBvZiBib3VuZCBhcyBhIGRvdWJsZS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBYIGNvb3JkaW5hdGUgb2YgYm91bmQgYXMgYSBkb3VibGUuCi0gICAgICogICAKICAgICAgKiBAc2VlIGphdmEuYXd0Lmdlb20uUmVjdGFuZ3VsYXJTaGFwZSNnZXRYKCkKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKQEAgLTEzOCw3ICsxNTksNiBAQAogICAgICAqIEdldHMgdGhlIFkgY29vcmRpbmF0ZSBvZiBib3VuZCBhcyBhIGRvdWJsZS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBZIGNvb3JkaW5hdGUgb2YgYm91bmQgYXMgYSBkb3VibGUuCi0gICAgICogCiAgICAgICogQHNlZSBqYXZhLmF3dC5nZW9tLlJlY3Rhbmd1bGFyU2hhcGUjZ2V0WSgpCiAgICAgICovCiAgICAgQE92ZXJyaWRlCkBAIC0xNDksOCArMTY5LDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSBhcyBhIGRvdWJsZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSBhcyBhIGRvdWJsZS4gCi0gICAgICogCisgICAgICogQHJldHVybiB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgYXMgYSBkb3VibGUuCiAgICAgICogQHNlZSBqYXZhLmF3dC5nZW9tLlJlY3Rhbmd1bGFyU2hhcGUjZ2V0SGVpZ2h0KCkKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKQEAgLTE2Miw3ICsxODEsNiBAQAogICAgICAqIEdldHMgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUgYXMgYSBkb3VibGUuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZSBhcyBhIGRvdWJsZS4KLSAgICAgKiAgCiAgICAgICogQHNlZSBqYXZhLmF3dC5nZW9tLlJlY3Rhbmd1bGFyU2hhcGUjZ2V0V2lkdGgoKQogICAgICAqLwogICAgIEBPdmVycmlkZQpAQCAtMTcxLDExICsxODksMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRoZSByZWN0YW5nbGUgaXMgZW1wdHkuIFRoZSByZWN0YW5nbGUgaXMgZW1wdHkgaWYgCi0gICAgICogaXRzIHdpZHRoIG9yIGhlaWdodCBpcyBuZWdhdGl2ZSBvciB6ZXJvLgorICAgICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIHJlY3RhbmdsZSBpcyBlbXB0eS4gVGhlIHJlY3RhbmdsZSBpcyBlbXB0eQorICAgICAqIGlmIGl0cyB3aWR0aCBvciBoZWlnaHQgaXMgbmVnYXRpdmUgb3IgemVyby4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSByZWN0YW5nbGUgaXMgZW1wdHksIG90aGVyd2lzZSBmYWxzZS4KLSAgICAgKiAKICAgICAgKiBAc2VlIGphdmEuYXd0Lmdlb20uUmVjdGFuZ3VsYXJTaGFwZSNpc0VtcHR5KCkKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKQEAgLTE4NCw5ICsyMDEsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNpemUgb2YgYSBSZWN0YW5nbGUgYXMgRGltZW50aW9uIG9iamVjdC4KKyAgICAgKiBHZXRzIHRoZSBzaXplIG9mIGEgUmVjdGFuZ2xlIGFzIERpbWVuc2lvbiBvYmplY3QuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIERpbWVudGlvbiBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyBzaXplIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHJldHVybiBhIERpbWVuc2lvbiBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyBzaXplIG9mIHRoZSByZWN0YW5nbGUuCiAgICAgICovCiAgICAgcHVibGljIERpbWVuc2lvbiBnZXRTaXplKCkgewogICAgICAgICByZXR1cm4gbmV3IERpbWVuc2lvbih3aWR0aCwgaGVpZ2h0KTsKQEAgLTE5NSw4ICsyMTIsMTAgQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBzaXplIG9mIHRoZSBSZWN0YW5nbGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSBuZXcgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4gCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgbmV3IGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKICAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoOwpAQCAtMjA2LDcgKzIyNSw4IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgc2l6ZSBvZiBhIFJlY3RhbmdsZSBzcGVjaWZpZWQgYXMgRGltZW5zaW9uIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZCBhIERpbWVuc2lvbiBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyBuZXcgc2l6ZSBvZiBhIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gZAorICAgICAqICAgICAgICAgICAgYSBEaW1lbnNpb24gb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgbmV3IHNpemUgb2YgYSByZWN0YW5nbGUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0U2l6ZShEaW1lbnNpb24gZCkgewogICAgICAgICBzZXRTaXplKGQud2lkdGgsIGQuaGVpZ2h0KTsKQEAgLTIxNSwxOSArMjM1LDIxIEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgbG9jYXRpb24gb2YgYSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lciBhcyBhIFBvaW50IG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBQb2ludCBvYmplY3Qgd2l0aCBjb29yZGluYXRlcyBlcXVhbCB0byB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgCi0gICAgICogb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBQb2ludCBvYmplY3Qgd2l0aCBjb29yZGluYXRlcyBlcXVhbCB0byB0aGUgdXBwZXIgbGVmdCBjb3JuZXIKKyAgICAgKiAgICAgICAgIG9mIHRoZSByZWN0YW5nbGUuCiAgICAgICovCiAgICAgcHVibGljIFBvaW50IGdldExvY2F0aW9uKCkgewogICAgICAgICByZXR1cm4gbmV3IFBvaW50KHgsIHkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGxvY2F0aW9uIG9mIHRoZSByZWN0YW5nbGUgaW4gdGVybXMgb2YgaXRzIHVwcGVyIGxlZnQgCi0gICAgICogY29ybmVyIGNvb3JkaW5hdGVzIFggYW5kIFkuCisgICAgICogU2V0cyB0aGUgbG9jYXRpb24gb2YgdGhlIHJlY3RhbmdsZSBpbiB0ZXJtcyBvZiBpdHMgdXBwZXIgbGVmdCBjb3JuZXIKKyAgICAgKiBjb29yZGluYXRlcyBYIGFuZCBZLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lci4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TG9jYXRpb24oaW50IHgsIGludCB5KSB7CiAgICAgICAgIHRoaXMueCA9IHg7CkBAIC0yMzUsMjMgKzI1NywyNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGxvY2F0aW9uIG9mIGEgcmVjdGFuZ2xlIHVzaW5nIGEgUG9pbnQgb2JqZWN0IHRvIGdpdmUgdGhlIAorICAgICAqIFNldHMgdGhlIGxvY2F0aW9uIG9mIGEgcmVjdGFuZ2xlIHVzaW5nIGEgUG9pbnQgb2JqZWN0IHRvIGdpdmUgdGhlCiAgICAgICogY29vcmRpbmF0ZXMgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwIHRoZSBQb2ludCBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyB0aGUgbmV3IHVwcGVyIGxlZnQgY29ybmVyIAotICAgICAqIGNvb3JkaW5hdGVzIG9mIHJlY3RhbmdsZS4gIAorICAgICAqIEBwYXJhbSBwCisgICAgICogICAgICAgICAgICB0aGUgUG9pbnQgb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgdGhlIG5ldyB1cHBlciBsZWZ0IGNvcm5lcgorICAgICAqICAgICAgICAgICAgY29vcmRpbmF0ZXMgb2YgcmVjdGFuZ2xlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFBvaW50IHApIHsKICAgICAgICAgc2V0TG9jYXRpb24ocC54LCBwLnkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIE1vdmVzIGEgcmVjdGFuZ2xlIHRvIHRoZSBuZXcgbG9jYXRpb24gYnkgbW92aW5nIGl0cyB1cHBlciBsZWZ0IGNvcm5lcgotICAgICAqIHRvIHRoZSBwb2ludCB3aXRoIGNvb3JkaW5hdGVzIFggYW5kIFkuCisgICAgICogTW92ZXMgYSByZWN0YW5nbGUgdG8gdGhlIG5ldyBsb2NhdGlvbiBieSBtb3ZpbmcgaXRzIHVwcGVyIGxlZnQgY29ybmVyIHRvCisgICAgICogdGhlIHBvaW50IHdpdGggY29vcmRpbmF0ZXMgWCBhbmQgWS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgbmV3IFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIuCi0gICAgICogQHBhcmFtIHkgdGhlIG5ldyBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyLgotICAgICAqIAorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgbmV3IFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lci4KICAgICAgKiBAZGVwcmVjYXRlZCBVc2Ugc2V0TG9jYXRpb24oaW50LCBpbnQpIG1ldGhvZC4KICAgICAgKi8KICAgICBARGVwcmVjYXRlZApAQCAtMjYwLDE2ICsyODQsMTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSByZWN0YW5nbGUgdG8gYmUgdGhlIG5lYXJlc3QgcmVjdGFuZ2xlIHdpdGggaW50ZWdlciBjb29yZGluYXRlcyAKKyAgICAgKiBTZXRzIHRoZSByZWN0YW5nbGUgdG8gYmUgdGhlIG5lYXJlc3QgcmVjdGFuZ2xlIHdpdGggaW50ZWdlciBjb29yZGluYXRlcwogICAgICAqIGJvdW5kaW5nIHRoZSByZWN0YW5nbGUgZGVmaW5lZCBieSB0aGUgZG91YmxlLXZhbHVlZCBwYXJhbWV0ZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBkb3VibGUtdmFsdWVkCi0gICAgICogcmVjdGFuZ2xlIHRvIGJlIGJvdW5kZWQuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIGRvdWJsZS12YWx1ZWQKLSAgICAgKiByZWN0YW5nbGUgdG8gYmUgYm91bmRlZC4KLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUgdG8gYmUgYm91bmRlZC4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSB0byBiZSBib3VuZGVkLiAgICAgIAotICAgICAqIAorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgZG91YmxlLXZhbHVlZAorICAgICAqICAgICAgICAgICAgcmVjdGFuZ2xlIHRvIGJlIGJvdW5kZWQuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBkb3VibGUtdmFsdWVkCisgICAgICogICAgICAgICAgICByZWN0YW5nbGUgdG8gYmUgYm91bmRlZC4KKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlIHRvIGJlIGJvdW5kZWQuCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlIHRvIGJlIGJvdW5kZWQuCiAgICAgICogQHNlZSBqYXZhLmF3dC5nZW9tLlJlY3RhbmdsZTJEI3NldFJlY3QoZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlKQogICAgICAqLwogICAgIEBPdmVycmlkZQpAQCAtMjg0LDkgKzMxMSwxMCBAQAogICAgIC8qKgogICAgICAqIFNldHMgYSBuZXcgc2l6ZSBmb3IgdGhlIHJlY3RhbmdsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHJlY3RhbmdsZSdzIG5ldyB3aWR0aC4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSByZWN0YW5nbGUncyBuZXcgaGVpZ2h0LgotICAgICAqIAorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHJlY3RhbmdsZSdzIG5ldyB3aWR0aC4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgcmVjdGFuZ2xlJ3MgbmV3IGhlaWdodC4KICAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHNldFNpemUoaW50LCBpbnQpIG1ldGhvZC4KICAgICAgKi8KICAgICBARGVwcmVjYXRlZApAQCAtMjk1LDE0ICszMjMsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXNldHMgdGhlIGJvdW5kcyBvZiBhIHJlY3RhbmdsZSB0byB0aGUgc3BlY2lmaWVkIHgsIHksIHdpZHRoIGFuZCBoZWlnaHQgCisgICAgICogUmVzZXRzIHRoZSBib3VuZHMgb2YgYSByZWN0YW5nbGUgdG8gdGhlIHNwZWNpZmllZCB4LCB5LCB3aWR0aCBhbmQgaGVpZ2h0CiAgICAgICogcGFyYW1ldGVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgbmV3IFggY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIuCi0gICAgICogQHBhcmFtIHkgdGhlIG5ldyBZIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyLgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgbmV3IHdpZHRoIG9mIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBuZXcgaGVpZ2h0IG9mIHJlY3RhbmdsZS4gCi0gICAgICogCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgWCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lci4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBZIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB3aWR0aCBvZiByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBoZWlnaHQgb2YgcmVjdGFuZ2xlLgogICAgICAqIEBkZXByZWNhdGVkIHVzZSBzZXRCb3VuZHMoaW50LCBpbnQsIGludCwgaW50KSBtZXRob2QKICAgICAgKi8KICAgICBARGVwcmVjYXRlZApAQCAtMzEyLDEwICszNDMsOSBAQAogCiAgICAgLyoqCiAgICAgICogR2V0cyBib3VuZHMgb2YgdGhlIHJlY3RhbmdsZSBhcyBhIG5ldyBSZWN0YW5nbGUgb2JqZWN0LgotICAgICAqICAKLSAgICAgKiBAcmV0dXJuIHRoZSBSZWN0YW5nbGUgb2JqZWN0IHdpdGggdGhlIHNhbWUgYm91bmRzIGFzIAotICAgICAqIHRoZSBvcmlnaW5hbCByZWN0YW5nbGUuIAogICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIFJlY3RhbmdsZSBvYmplY3Qgd2l0aCB0aGUgc2FtZSBib3VuZHMgYXMgdGhlIG9yaWdpbmFsCisgICAgICogICAgICAgICByZWN0YW5nbGUuCiAgICAgICogQHNlZSBqYXZhLmF3dC5nZW9tLlJlY3Rhbmd1bGFyU2hhcGUjZ2V0Qm91bmRzKCkKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKQEAgLTMyNSwxMCArMzU1LDkgQEAKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGJvdW5kcyBvZiB0aGUgb3JpZ2luYWwgcmVjdGFuZ2xlIGFzIGEgUmVjdGFuZ2xlMkQgb2JqZWN0LgotICAgICAqICAKLSAgICAgKiBAcmV0dXJuIHRoZSBSZWN0YW5nbGUyRCBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyB0aGUgYm91bmRzIG9mIAotICAgICAqIHRoZSBvcmlnaW5hbCByZWN0YW5nbGUuIAogICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIFJlY3RhbmdsZTJEIG9iamVjdCB3aGljaCByZXByZXNlbnRzIHRoZSBib3VuZHMgb2YgdGhlCisgICAgICogICAgICAgICBvcmlnaW5hbCByZWN0YW5nbGUuCiAgICAgICogQHNlZSBqYXZhLmF3dC5nZW9tLlJlY3RhbmdsZTJEI2dldEJvdW5kczJEKCkKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKQEAgLTMzNywxMyArMzY2LDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgYm91bmRzIG9mIGEgcmVjdGFuZ2xlIHRvIHRoZSBzcGVjaWZpZWQgeCwgeSwgd2lkdGgsIGFuZCBoZWlnaHQgCisgICAgICogU2V0cyB0aGUgYm91bmRzIG9mIGEgcmVjdGFuZ2xlIHRvIHRoZSBzcGVjaWZpZWQgeCwgeSwgd2lkdGgsIGFuZCBoZWlnaHQKICAgICAgKiBwYXJhbWV0ZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyLgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiByZWN0YW5nbGUuIAorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lci4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgcmVjdGFuZ2xlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEJvdW5kcyhpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICAgICAgICB0aGlzLnggPSB4OwpAQCAtMzUzLDI1ICszODYsMjYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBib3VuZHMgb2YgdGhlIHJlY3RhbmdsZSB0byBtYXRjaCB0aGUgYm91bmRzIG9mIHRoZQotICAgICAqIFJlY3RhbmdsZSBvYmplY3Qgc2VudCBhcyBhIHBhcmFtZXRlci4KKyAgICAgKiBTZXRzIHRoZSBib3VuZHMgb2YgdGhlIHJlY3RhbmdsZSB0byBtYXRjaCB0aGUgYm91bmRzIG9mIHRoZSBSZWN0YW5nbGUKKyAgICAgKiBvYmplY3Qgc2VudCBhcyBhIHBhcmFtZXRlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gciB0aGUgUmVjdGFuZ2xlIG9iamVjdCB3aGljaCBzcGVjaWZpZXMgdGhlIG5ldyBib3VuZHMuIAorICAgICAqIEBwYXJhbSByCisgICAgICogICAgICAgICAgICB0aGUgUmVjdGFuZ2xlIG9iamVjdCB3aGljaCBzcGVjaWZpZXMgdGhlIG5ldyBib3VuZHMuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Qm91bmRzKFJlY3RhbmdsZSByKSB7CiAgICAgICAgIHNldEJvdW5kcyhyLngsIHIueSwgci53aWR0aCwgci5oZWlnaHQpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEVubGFyZ2VzIHRoZSByZWN0YW5nbGUgYnkgbW92aW5nIGVhY2ggY29ybmVyIG91dHdhcmQgZnJvbSB0aGUgCi0gICAgICogY2VudGVyIGJ5IGEgZGlzdGFuY2Ugb2YgZHggaG9yaXpvbmFsbHkgYW5kIGEgZGlzdGFuY2Ugb2YgZHkgCi0gICAgICogdmVydGljYWxseS4gU3BlY2lmaWNhbGx5LCBjaGFuZ2VzIGEgcmVjdGFuZ2xlIHdpdGggCi0gICAgICogW3gsIHksIHdpZHRoLCBoZWlnaHRdIHBhcmFtZXRlcnMgdG8gCi0gICAgICogYSByZWN0YW5nbGUgd2l0aCBbeC1keCwgeS1keSwgd2lkdGgrMipkeCwgaGVpZ2h0KzIqZHldCi0gICAgICogcGFyYW1ldGVycy4gCi0gICAgICogICAKLSAgICAgKiBAcGFyYW0gZHggdGhlIGhvcml6b250YWwgZGlzdGFuY2UgdG8gbW92ZSBlYWNoIGNvcm5lciBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSBkeSB0aGUgdmVydGljYWwgZGlzdGFuY2UgdG8gbW92ZSBlYWNoIGNvcm5lciBjb29yZGluYXRlLgorICAgICAqIEVubGFyZ2VzIHRoZSByZWN0YW5nbGUgYnkgbW92aW5nIGVhY2ggY29ybmVyIG91dHdhcmQgZnJvbSB0aGUgY2VudGVyIGJ5IGEKKyAgICAgKiBkaXN0YW5jZSBvZiBkeCBob3Jpem9uYWxseSBhbmQgYSBkaXN0YW5jZSBvZiBkeSB2ZXJ0aWNhbGx5LiBTcGVjaWZpY2FsbHksCisgICAgICogY2hhbmdlcyBhIHJlY3RhbmdsZSB3aXRoIFt4LCB5LCB3aWR0aCwgaGVpZ2h0XSBwYXJhbWV0ZXJzIHRvIGEgcmVjdGFuZ2xlCisgICAgICogd2l0aCBbeC1keCwgeS1keSwgd2lkdGgrMipkeCwgaGVpZ2h0KzIqZHldIHBhcmFtZXRlcnMuCisgICAgICogCisgICAgICogQHBhcmFtIGR4CisgICAgICogICAgICAgICAgICB0aGUgaG9yaXpvbnRhbCBkaXN0YW5jZSB0byBtb3ZlIGVhY2ggY29ybmVyIGNvb3JkaW5hdGUuCisgICAgICogQHBhcmFtIGR5CisgICAgICogICAgICAgICAgICB0aGUgdmVydGljYWwgZGlzdGFuY2UgdG8gbW92ZSBlYWNoIGNvcm5lciBjb29yZGluYXRlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGdyb3coaW50IGR4LCBpbnQgZHkpIHsKICAgICAgICAgeCAtPSBkeDsKQEAgLTM4MSwxMSArNDE1LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogTW92ZXMgYSByZWN0YW5nbGUgYSBkaXN0YW5jZSBvZiBteCBhbG9uZyB0aGUgeCBjb29yZGluYXRlIGF4aXMgCi0gICAgICogYW5kIGEgZGlzdGFuY2Ugb2YgbXkgYWxvbmcgeSBjb29yZGluYXRlIGF4aXMuCisgICAgICogTW92ZXMgYSByZWN0YW5nbGUgYSBkaXN0YW5jZSBvZiBteCBhbG9uZyB0aGUgeCBjb29yZGluYXRlIGF4aXMgYW5kIGEKKyAgICAgKiBkaXN0YW5jZSBvZiBteSBhbG9uZyB5IGNvb3JkaW5hdGUgYXhpcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbXggdGhlIGhvcml6b250YWwgdHJhbnNsYXRpb24gaW5jcmVtZW50LgotICAgICAqIEBwYXJhbSBteSB0aGUgdmVydGljYWwgdHJhbnNsYXRpb24gaW5jcmVtZW50LgorICAgICAqIEBwYXJhbSBteAorICAgICAqICAgICAgICAgICAgdGhlIGhvcml6b250YWwgdHJhbnNsYXRpb24gaW5jcmVtZW50LgorICAgICAqIEBwYXJhbSBteQorICAgICAqICAgICAgICAgICAgdGhlIHZlcnRpY2FsIHRyYW5zbGF0aW9uIGluY3JlbWVudC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0cmFuc2xhdGUoaW50IG14LCBpbnQgbXkpIHsKICAgICAgICAgeCArPSBteDsKQEAgLTM5NSw4ICs0MzEsMTIgQEAKICAgICAvKioKICAgICAgKiBFbmxhcmdlcyB0aGUgcmVjdGFuZ2xlIHRvIGNvdmVyIHRoZSBzcGVjaWZpZWQgcG9pbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIG5ldyBwb2ludCB0byBiZSBjb3ZlcmVkIGJ5IHRoZSByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIHB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIG5ldyBwb2ludCB0byBiZSBjb3ZlcmVkIGJ5IHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBuZXcgcG9pbnQgdG8gYmUgY292ZXJlZCBieSB0aGUKKyAgICAgKiAgICAgICAgICAgIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gcHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIG5ldyBwb2ludCB0byBiZSBjb3ZlcmVkIGJ5IHRoZQorICAgICAqICAgICAgICAgICAgcmVjdGFuZ2xlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZChpbnQgcHgsIGludCBweSkgewogICAgICAgICBpbnQgeDEgPSBNYXRoLm1pbih4LCBweCk7CkBAIC00MDcsMTEgKzQ0NywxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEVubGFyZ2VzIHRoZSByZWN0YW5nbGUgdG8gY292ZXIgdGhlIHNwZWNpZmllZCBwb2ludCB3aXRoIHRoZQotICAgICAqIG5ldyBwb2ludCBnaXZlbiBhcyBhIFBvaW50IG9iamVjdC4KKyAgICAgKiBFbmxhcmdlcyB0aGUgcmVjdGFuZ2xlIHRvIGNvdmVyIHRoZSBzcGVjaWZpZWQgcG9pbnQgd2l0aCB0aGUgbmV3IHBvaW50CisgICAgICogZ2l2ZW4gYXMgYSBQb2ludCBvYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIHAgdGhlIFBvaW50IG9iamVjdCB0aGF0IHNwZWNpZmllcyB0aGUgbmV3IHBvaW50IHRvIAotICAgICAqIGJlIGNvdmVyZWQgYnkgdGhlIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gcAorICAgICAqICAgICAgICAgICAgdGhlIFBvaW50IG9iamVjdCB0aGF0IHNwZWNpZmllcyB0aGUgbmV3IHBvaW50IHRvIGJlIGNvdmVyZWQgYnkKKyAgICAgKiAgICAgICAgICAgIHRoZSByZWN0YW5nbGUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkKFBvaW50IHApIHsKICAgICAgICAgYWRkKHAueCwgcC55KTsKQEAgLTQyMSw3ICs0NjIsOCBAQAogICAgICAqIEFkZHMgYSBuZXcgcmVjdGFuZ2xlIHRvIHRoZSBvcmlnaW5hbCByZWN0YW5nbGUsIHRoZSByZXN1bHQgaXMgYW4gdW5pb24gb2YKICAgICAgKiB0aGUgc3BlY2lmaWVkIHNwZWNpZmllZCByZWN0YW5nbGUgYW5kIG9yaWdpbmFsIHJlY3RhbmdsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gciB0aGUgUmVjdGFuZ2xlIHdoaWNoIGlzIGFkZGVkIHRvIHRoZSBvcmlnaW5hbCByZWN0YW5nbGUuIAorICAgICAqIEBwYXJhbSByCisgICAgICogICAgICAgICAgICB0aGUgUmVjdGFuZ2xlIHdoaWNoIGlzIGFkZGVkIHRvIHRoZSBvcmlnaW5hbCByZWN0YW5nbGUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkKFJlY3RhbmdsZSByKSB7CiAgICAgICAgIGludCB4MSA9IE1hdGgubWluKHgsIHIueCk7CkBAIC00MzIsMTQgKzQ3NCwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIHBvaW50IHdpdGggc3BlY2lmaWVkIGNvb3JkaW5hdGVzIFtweCwgcHldIAorICAgICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIHBvaW50IHdpdGggc3BlY2lmaWVkIGNvb3JkaW5hdGVzIFtweCwgcHldCiAgICAgICogaXMgd2l0aGluIHRoZSBib3VuZHMgb2YgdGhlIHJlY3RhbmdsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHggdGhlIFggY29vcmRpbmF0ZSBvZiBwb2ludC4KLSAgICAgKiBAcGFyYW0gcHkgdGhlIFkgY29vcmRpbmF0ZSBvZiBwb2ludC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBwb2ludCB3aXRoIHNwZWNpZmllZCBjb29yZGluYXRlcyBbcHgsIHB5XSBpcyAKLSAgICAgKiB3aXRoaW4gdGhlIGJvdW5kcyBvZiB0aGUgcmVjdGFuZ2xlLCBvdGhlcndpc2UgZmFsc2UuCisgICAgICogQHBhcmFtIHB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHBvaW50LgorICAgICAqIEBwYXJhbSBweQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiBwb2ludC4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBwb2ludCB3aXRoIHNwZWNpZmllZCBjb29yZGluYXRlcyBbcHgsIHB5XSBpcyB3aXRoaW4KKyAgICAgKiAgICAgICAgIHRoZSBib3VuZHMgb2YgdGhlIHJlY3RhbmdsZSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGludCBweCwgaW50IHB5KSB7CiAgICAgICAgIGlmIChpc0VtcHR5KCkpIHsKQEAgLTQ1NCwyOSArNDk3LDMyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgcG9pbnQgZ2l2ZW4gYXMgYSBQb2ludCBvYmplY3QgCi0gICAgICogaXMgd2l0aGluIHRoZSBib3VuZHMgb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRoZSBwb2ludCBnaXZlbiBhcyBhIFBvaW50IG9iamVjdCBpcyB3aXRoaW4gdGhlCisgICAgICogYm91bmRzIG9mIHRoZSByZWN0YW5nbGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHAgdGhlIFBvaW50IG9iamVjdAotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHBvaW50IHAgaXMgd2l0aGluIHRoZSBib3VuZHMgb2YgdGhlIAotICAgICAqIHJlY3RhbmdsZSwgb3RoZXJ3aXNlIGZhbHNlLgorICAgICAqIEBwYXJhbSBwCisgICAgICogICAgICAgICAgICB0aGUgUG9pbnQgb2JqZWN0CisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgcG9pbnQgcCBpcyB3aXRoaW4gdGhlIGJvdW5kcyBvZiB0aGUgcmVjdGFuZ2xlLAorICAgICAqICAgICAgICAgb3RoZXJ3aXNlIGZhbHNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFBvaW50IHApIHsKICAgICAgICAgcmV0dXJuIGNvbnRhaW5zKHAueCwgcC55KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRoZSByZWN0YW5nbGUgc3BlY2lmaWVkIGJ5IFtyeCwgcnksIHJ3LCByaF0gCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgcmVjdGFuZ2xlIHNwZWNpZmllZCBieSBbcngsIHJ5LCBydywgcmhdCiAgICAgICogcGFyYW1ldGVycyBpcyBsb2NhdGVkIGluc2lkZSB0aGUgb3JpZ2luYWwgcmVjdGFuZ2xlLgogICAgICAqIAotICAgICAqIEBwYXJhbSByeCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgdG8gY29tcGFyZS4KLSAgICAgKiBAcGFyYW0gcnkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIHRvIGNvbXBhcmUuCi0gICAgICogQHBhcmFtIHJ3IHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlIHRvIGNvbXBhcmUuCi0gICAgICogQHBhcmFtIHJoIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSB0byBjb21wYXJlLgotICAgICAqIAorICAgICAqIEBwYXJhbSByeAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIHRvIGNvbXBhcmUuCisgICAgICogQHBhcmFtIHJ5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgdG8gY29tcGFyZS4KKyAgICAgKiBAcGFyYW0gcncKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlIHRvIGNvbXBhcmUuCisgICAgICogQHBhcmFtIHJoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgdG8gY29tcGFyZS4KICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGEgcmVjdGFuZ2xlIHdpdGggW3J4LCByeSwgcncsIHJoXSBwYXJhbWV0ZXJzIGlzIGVudGlyZWx5Ci0gICAgICogY29udGFpbmVkIGluIHRoZSBvcmlnaW5hbCByZWN0YW5nbGUsIG90aGVyd2lzZSBmYWxzZS4KKyAgICAgKiAgICAgICAgIGNvbnRhaW5lZCBpbiB0aGUgb3JpZ2luYWwgcmVjdGFuZ2xlLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IHJ4LCBpbnQgcnksIGludCBydywgaW50IHJoKSB7CiAgICAgICAgIHJldHVybiBjb250YWlucyhyeCwgcnkpICYmIGNvbnRhaW5zKHJ4ICsgcncgLSAxLCByeSArIHJoIC0gMSk7CkBAIC00ODYsMjUgKzUzMiwyNSBAQAogICAgICAqIENvbXBhcmVzIHdoZXRoZXIgb3Igbm90IHRoZSByZWN0YW5nbGUgc3BlY2lmaWVkIGJ5IHRoZSBSZWN0YW5nbGUgb2JqZWN0CiAgICAgICogaXMgbG9jYXRlZCBpbnNpZGUgdGhlIG9yaWdpbmFsIHJlY3RhbmdsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gciB0aGUgUmVjdGFuZ2xlIG9iamVjdC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gcgorICAgICAqICAgICAgICAgICAgdGhlIFJlY3RhbmdsZSBvYmplY3QuCiAgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgcmVjdGFuZ2xlIHNwZWNpZmllZCBieSBSZWN0YW5nbGUgb2JqZWN0IGlzIGVudGlyZWx5Ci0gICAgICogY29udGFpbmVkIGluIHRoZSBvcmlnaW5hbCByZWN0YW5nbGUsIG90aGVyd2lzZSBmYWxzZS4KKyAgICAgKiAgICAgICAgIGNvbnRhaW5lZCBpbiB0aGUgb3JpZ2luYWwgcmVjdGFuZ2xlLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoUmVjdGFuZ2xlIHIpIHsKICAgICAgICAgcmV0dXJuIGNvbnRhaW5zKHIueCwgci55LCByLndpZHRoLCByLmhlaWdodCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcGFyZXMgd2hldGhlciBvciBub3QgYSBwb2ludCB3aXRoIHNwZWNpZmllZCBjb29yZGluYXRlcyBbcHgsIHB5XSBiZWxvbmdzIAotICAgICAqIHRvIGEgcmVjdGFuZ2xlLgorICAgICAqIENvbXBhcmVzIHdoZXRoZXIgb3Igbm90IGEgcG9pbnQgd2l0aCBzcGVjaWZpZWQgY29vcmRpbmF0ZXMgW3B4LCBweV0KKyAgICAgKiBiZWxvbmdzIHRvIGEgcmVjdGFuZ2xlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBweCB0aGUgWCBjb29yZGluYXRlIG9mIGEgcG9pbnQuCi0gICAgICogQHBhcmFtIHB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgYSBwb2ludC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGEgcG9pbnQgd2l0aCBzcGVjaWZpZWQgY29vcmRpbmF0ZXMgW3B4LCBweV0gYmVsb25ncyAKLSAgICAgKiB0byBhIHJlY3RhbmdsZSwgb3RoZXJ3aXNlIGZhbHNlLgotICAgICAqIAorICAgICAqIEBwYXJhbSBweAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiBhIHBvaW50LgorICAgICAqIEBwYXJhbSBweQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiBhIHBvaW50LgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgYSBwb2ludCB3aXRoIHNwZWNpZmllZCBjb29yZGluYXRlcyBbcHgsIHB5XSBiZWxvbmdzIHRvIGEKKyAgICAgKiAgICAgICAgIHJlY3RhbmdsZSwgb3RoZXJ3aXNlIGZhbHNlLgogICAgICAqIEBkZXByZWNhdGVkIHVzZSBjb250YWlucyhpbnQsIGludCkgbWV0aG9kLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCkBAIC01MTMsMjAgKzU1OSwxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgb3JpZ2luYWwgcmVjdGFuZ2xlIHdpdGggdGhlIAotICAgICAqIHNwZWNpZmllZCBSZWN0YW5nbGUyRC4KKyAgICAgKiBSZXR1cm5zIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIG9yaWdpbmFsIHJlY3RhbmdsZSB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBSZWN0YW5nbGUyRC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gciB0aGUgUmVjdGFuZ2xlMkQgb2JqZWN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIFJlY3RhbmdsZTJEIG9iamVjdCB0aGF0IGlzIHRoZSByZXN1bHQgb2YgaW50ZXJzZWN0aW5nIAotICAgICAqIHRoZSBvcmlnaW5hbCByZWN0YW5nbGUgd2l0aCB0aGUgc3BlY2lmaWVkIFJlY3RhbmdsZTJELgotICAgICAqIAorICAgICAqIEBwYXJhbSByCisgICAgICogICAgICAgICAgICB0aGUgUmVjdGFuZ2xlMkQgb2JqZWN0LgorICAgICAqIEByZXR1cm4gdGhlIFJlY3RhbmdsZTJEIG9iamVjdCB0aGF0IGlzIHRoZSByZXN1bHQgb2YgaW50ZXJzZWN0aW5nIHRoZQorICAgICAqICAgICAgICAgb3JpZ2luYWwgcmVjdGFuZ2xlIHdpdGggdGhlIHNwZWNpZmllZCBSZWN0YW5nbGUyRC4KICAgICAgKiBAc2VlIGphdmEuYXd0Lmdlb20uUmVjdGFuZ2xlMkQjY3JlYXRlSW50ZXJzZWN0aW9uKGphdmEuYXd0Lmdlb20uUmVjdGFuZ2xlMkQpCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFJlY3RhbmdsZTJEIGNyZWF0ZUludGVyc2VjdGlvbihSZWN0YW5nbGUyRCByKSB7CiAgICAgICAgIGlmIChyIGluc3RhbmNlb2YgUmVjdGFuZ2xlKSB7Ci0gICAgICAgICAgICByZXR1cm4gaW50ZXJzZWN0aW9uKChSZWN0YW5nbGUpIHIpOworICAgICAgICAgICAgcmV0dXJuIGludGVyc2VjdGlvbigoUmVjdGFuZ2xlKXIpOwogICAgICAgICB9CiAgICAgICAgIFJlY3RhbmdsZTJEIGRzdCA9IG5ldyBSZWN0YW5nbGUyRC5Eb3VibGUoKTsKICAgICAgICAgUmVjdGFuZ2xlMkQuaW50ZXJzZWN0KHRoaXMsIHIsIGRzdCk7CkBAIC01MzQsMTQgKzU3OSwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgb3JpZ2luYWwgcmVjdGFuZ2xlIHdpdGggdGhlIAotICAgICAqIHNwZWNpZmllZCByZWN0YW5nbGUuIEFuIGVtcHR5IHJlY3RhbmdsZSBpcyByZXR1cm5lZCBpZiB0aGVyZSBpcyBubwotICAgICAqIGludGVyc2VjdGlvbi4KKyAgICAgKiBSZXR1cm5zIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIG9yaWdpbmFsIHJlY3RhbmdsZSB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiByZWN0YW5nbGUuIEFuIGVtcHR5IHJlY3RhbmdsZSBpcyByZXR1cm5lZCBpZiB0aGVyZSBpcyBubyBpbnRlcnNlY3Rpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIHIgdGhlIFJlY3RhbmdsZSBvYmplY3QuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgUmVjdGFuZ2xlIG9iamVjdCBpcyByZXN1bHQgb2YgdGhlIG9yaWdpbmFsIHJlY3RhbmdsZSB3aXRoIHRoZSAKLSAgICAgKiBzcGVjaWZpZWQgcmVjdGFuZ2xlLiAKKyAgICAgKiBAcGFyYW0gcgorICAgICAqICAgICAgICAgICAgdGhlIFJlY3RhbmdsZSBvYmplY3QuCisgICAgICogQHJldHVybiB0aGUgUmVjdGFuZ2xlIG9iamVjdCBpcyByZXN1bHQgb2YgdGhlIG9yaWdpbmFsIHJlY3RhbmdsZSB3aXRoIHRoZQorICAgICAqICAgICAgICAgc3BlY2lmaWVkIHJlY3RhbmdsZS4KICAgICAgKi8KICAgICBwdWJsaWMgUmVjdGFuZ2xlIGludGVyc2VjdGlvbihSZWN0YW5nbGUgcikgewogICAgICAgICBpbnQgeDEgPSBNYXRoLm1heCh4LCByLngpOwpAQCAtNTUyLDM5ICs1OTYsMzggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRoZSBvcmlnaW5hbCByZWN0YW5nbGUgaW50ZXJzZWN0cyAKLSAgICAgKiB0aGUgc3BlY2lmaWVkIHJlY3RhbmdsZS4KKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRoZSBvcmlnaW5hbCByZWN0YW5nbGUgaW50ZXJzZWN0cyB0aGUgc3BlY2lmaWVkCisgICAgICogcmVjdGFuZ2xlLgogICAgICAqIAotICAgICAqIEBwYXJhbSByIHRoZSBSZWN0YW5nbGUgb2JqZWN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHR3byByZWN0YW5nbGVzIG92ZXJsYXA7IG90aGVyd2lzZSBmYWxzZS4KKyAgICAgKiBAcGFyYW0gcgorICAgICAqICAgICAgICAgICAgdGhlIFJlY3RhbmdsZSBvYmplY3QuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgdHdvIHJlY3RhbmdsZXMgb3ZlcmxhcCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGludGVyc2VjdHMoUmVjdGFuZ2xlIHIpIHsKICAgICAgICAgcmV0dXJuICFpbnRlcnNlY3Rpb24ocikuaXNFbXB0eSgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIERldGVybWluZXMgd2hlcmUgdGhlIHNwZWNpZmllZCBQb2ludCBpcyBsb2NhdGVkIHdpdGggcmVzcGVjdCB0byAKLSAgICAgKiB0aGUgcmVjdGFuZ2xlLiBUaGlzIG1ldGhvZCBjb21wdXRlcyB3aGV0aGVyIHRoZSBwb2ludCBpcyB0byB0aGUgCi0gICAgICogcmlnaHQgb3IgdG8gdGhlIGxlZnQgb2YgdGhlIHJlY3RhbmdsZSBhbmQgd2hldGhlciBpdCBpcyBhYm92ZSAKLSAgICAgKiBvciBiZWxvdyB0aGUgcmVjdGFuZ2xlLCBhbmQgcGFja3MgdGhlIHJlc3VsdCBpbnRvIGFuIGludCBieSAKLSAgICAgKiB1c2luZyBhIGJpbmFyeSBPUiBvcGVyYXRpb24gd2l0aCB0aGUgZm9sbG93aW5nIG1hc2tzOgorICAgICAqIERldGVybWluZXMgd2hlcmUgdGhlIHNwZWNpZmllZCBQb2ludCBpcyBsb2NhdGVkIHdpdGggcmVzcGVjdCB0byB0aGUKKyAgICAgKiByZWN0YW5nbGUuIFRoaXMgbWV0aG9kIGNvbXB1dGVzIHdoZXRoZXIgdGhlIHBvaW50IGlzIHRvIHRoZSByaWdodCBvciB0bworICAgICAqIHRoZSBsZWZ0IG9mIHRoZSByZWN0YW5nbGUgYW5kIHdoZXRoZXIgaXQgaXMgYWJvdmUgb3IgYmVsb3cgdGhlIHJlY3RhbmdsZSwKKyAgICAgKiBhbmQgcGFja3MgdGhlIHJlc3VsdCBpbnRvIGFuIGludGVnZXIgYnkgdXNpbmcgYSBiaW5hcnkgT1Igb3BlcmF0aW9uIHdpdGgKKyAgICAgKiB0aGUgZm9sbG93aW5nIG1hc2tzOgogICAgICAqIDx1bD4KICAgICAgKjxsaT5SZWN0YW5nbGUyRC5PVVRfTEVGVDwvbGk+CiAgICAgICo8bGk+UmVjdGFuZ2xlMkQuT1VUX1RPUDwvbGk+CiAgICAgICo8bGk+UmVjdGFuZ2xlMkQuT1VUX1JJR0hUPC9saT4KICAgICAgKjxsaT5SZWN0YW5nbGUyRC5PVVRfQk9UVE9NPC9saT4KICAgICAgKjwvdWw+Ci0gICAgICoKLSAgICAgKiBJZiB0aGUgcmVjdGFuZ2xlIGlzIGVtcHR5LCBhbGwgbWFza3MgYXJlIHNldCwgYW5kIGlmIHRoZSAKLSAgICAgKiBwb2ludCBpcyBpbnNpZGUgdGhlIHJlY3RhbmdsZSwgbm9uZSBhcmUgc2V0LgorICAgICAqIElmIHRoZSByZWN0YW5nbGUgaXMgZW1wdHksIGFsbCBtYXNrcyBhcmUgc2V0LCBhbmQgaWYgdGhlIHBvaW50IGlzIGluc2lkZQorICAgICAqIHRoZSByZWN0YW5nbGUsIG5vbmUgYXJlIHNldC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgc3BlY2lmaWVkIHBvaW50LgotICAgICAqIEBwYXJhbSBweSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBzcGVjaWZpZWQgcG9pbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhlIFBvaW50IHJlbGF0aXZlIHRvIHRoZSByZWN0YW5nbGUgCi0gICAgICogYXMgdGhlIHJlc3VsdCBvZiBsb2dpY2FsIE9SIG9wZXJhdGlvbiB3aXRoIGFsbCBvdXQgbWFza3MuCi0gICAgICogCisgICAgICogQHBhcmFtIHB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBzcGVjaWZpZWQgcG9pbnQuCisgICAgICogQHBhcmFtIHB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBzcGVjaWZpZWQgcG9pbnQuCisgICAgICogQHJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhlIFBvaW50IHJlbGF0aXZlIHRvIHRoZSByZWN0YW5nbGUgYXMgdGhlIHJlc3VsdAorICAgICAqICAgICAgICAgb2YgbG9naWNhbCBPUiBvcGVyYXRpb24gd2l0aCBhbGwgb3V0IG1hc2tzLgogICAgICAqIEBzZWUgamF2YS5hd3QuZ2VvbS5SZWN0YW5nbGUyRCNvdXRjb2RlKGRvdWJsZSwgZG91YmxlKQogICAgICAqLwogICAgIEBPdmVycmlkZQpAQCAtNTkzLDIzICs2MzYsMTkgQEAKIAogICAgICAgICBpZiAod2lkdGggPD0gMCkgewogICAgICAgICAgICAgY29kZSB8PSBPVVRfTEVGVCB8IE9VVF9SSUdIVDsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBpZiAocHggPCB4KSB7Ci0gICAgICAgICAgICAgICAgY29kZSB8PSBPVVRfTEVGVDsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIGlmIChweCA+IHggKyB3aWR0aCkgewotICAgICAgICAgICAgICAgICAgICBjb2RlIHw9IE9VVF9SSUdIVDsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocHggPCB4KSB7CisgICAgICAgICAgICBjb2RlIHw9IE9VVF9MRUZUOworICAgICAgICB9IGVsc2UgaWYgKHB4ID4geCArIHdpZHRoKSB7CisgICAgICAgICAgICBjb2RlIHw9IE9VVF9SSUdIVDsKKyAgICAgICAgfQogCiAgICAgICAgIGlmIChoZWlnaHQgPD0gMCkgewogICAgICAgICAgICAgY29kZSB8PSBPVVRfVE9QIHwgT1VUX0JPVFRPTTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBpZiAocHkgPCB5KSB7Ci0gICAgICAgICAgICAgICAgY29kZSB8PSBPVVRfVE9QOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgaWYgKHB5ID4geSArIGhlaWdodCkgewotICAgICAgICAgICAgICAgICAgICBjb2RlIHw9IE9VVF9CT1RUT007Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHB5IDwgeSkgeworICAgICAgICAgICAgY29kZSB8PSBPVVRfVE9QOworICAgICAgICB9IGVsc2UgaWYgKHB5ID4geSArIGhlaWdodCkgeworICAgICAgICAgICAgY29kZSB8PSBPVVRfQk9UVE9NOworICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIGNvZGU7CiAgICAgfQpAQCAtNjE3LDEwICs2NTYsOSBAQAogICAgIC8qKgogICAgICAqIEVubGFyZ2VzIHRoZSByZWN0YW5nbGUgdG8gY292ZXIgdGhlIHNwZWNpZmllZCBSZWN0YW5nbGUyRC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gciB0aGUgUmVjdGFuZ2xlMkQgb2JqZWN0LgotICAgICAqIAorICAgICAqIEBwYXJhbSByCisgICAgICogICAgICAgICAgICB0aGUgUmVjdGFuZ2xlMkQgb2JqZWN0LgogICAgICAqIEByZXR1cm4gdGhlIHVuaW9uIG9mIHRoZSBvcmlnaW5hbCBhbmQgdGhlIHNwZWNpZmllZCBSZWN0YW5nbGUyRC4KLSAgICAgKiAKICAgICAgKiBAc2VlIGphdmEuYXd0Lmdlb20uUmVjdGFuZ2xlMkQjY3JlYXRlVW5pb24oamF2YS5hd3QuZ2VvbS5SZWN0YW5nbGUyRCkKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKQEAgLTYzNiw4ICs2NzQsOCBAQAogICAgIC8qKgogICAgICAqIEVubGFyZ2VzIHRoZSByZWN0YW5nbGUgdG8gY292ZXIgdGhlIHNwZWNpZmllZCByZWN0YW5nbGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHIgdGhlIFJlY3RhbmdsZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gcgorICAgICAqICAgICAgICAgICAgdGhlIFJlY3RhbmdsZS4KICAgICAgKiBAcmV0dXJuIHRoZSB1bmlvbiBvZiB0aGUgb3JpZ2luYWwgYW5kIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ2xlLgogICAgICAqLwogICAgIHB1YmxpYyBSZWN0YW5nbGUgdW5pb24oUmVjdGFuZ2xlIHIpIHsKQEAgLTY0OSwxMSArNjg3LDEwIEBACiAgICAgLyoqCiAgICAgICogQ29tcGFyZXMgdGhlIG9yaWdpbmFsIFJlY3RhbmdsZSB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBvYmogdGhlIHNwZWNpZmllZCBPYmplY3QgZm9yIGNvbXBhcmlzb24uCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIE9iamVjdCBpcyBhIHJlY3RhbmdsZSB3aXRoIHRoZSAKLSAgICAgKiBzYW1lIGRpbWVuc2lvbnMgYXMgdGhlIG9yaWdpbmFsIHJlY3RhbmdsZSwgb3RoZXJ3aXNlIGZhbHNlLgotICAgICAqIAorICAgICAqIEBwYXJhbSBvYmoKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgT2JqZWN0IGZvciBjb21wYXJpc29uLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCBPYmplY3QgaXMgYSByZWN0YW5nbGUgd2l0aCB0aGUgc2FtZQorICAgICAqICAgICAgICAgZGltZW5zaW9ucyBhcyB0aGUgb3JpZ2luYWwgcmVjdGFuZ2xlLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICogQHNlZSBqYXZhLmF3dC5nZW9tLlJlY3RhbmdsZTJEI2VxdWFscyhPYmplY3QpCiAgICAgICovCiAgICAgQE92ZXJyaWRlCkBAIC02NjksMTggKzcwNiwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlY3RhbmdsZTsgdGhlIHN0cmluZyBjb250YWlucyAKLSAgICAgKiBbeCwgeSwgd2lkdGgsIGhlaWdodF0gcGFyYW1ldGVycyBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlY3RhbmdsZTsgdGhlIHN0cmluZyBjb250YWlucyBbeCwKKyAgICAgKiB5LCB3aWR0aCwgaGVpZ2h0XSBwYXJhbWV0ZXJzIG9mIHRoZSByZWN0YW5nbGUuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZWN0YW5nbGUuCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgLy8gVGhlIG91dHB1dCBmb3JtYXQgYmFzZWQgb24gMS41IHJlbGVhc2UgYmVoYXZpb3VyLiBJdCBjb3VsZCBiZSBvYnRhaW5lZCBpbiB0aGUgZm9sbG93aW5nIHdheQorICAgICAgICAvLyBUaGUgb3V0cHV0IGZvcm1hdCBiYXNlZCBvbiAxLjUgcmVsZWFzZSBiZWhhdmlvdXIuIEl0IGNvdWxkIGJlCisgICAgICAgIC8vIG9idGFpbmVkIGluIHRoZSBmb2xsb3dpbmcgd2F5CiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbihuZXcgUmVjdGFuZ2xlKCkudG9TdHJpbmcoKSkKICAgICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIlt4PSIgKyB4ICsgIix5PSIgKyB5ICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICAiLHdpZHRoPSIgKyB3aWR0aCArICIsaGVpZ2h0PSIgKyBoZWlnaHQgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisgICAgICAgICAgICAgICAgIix3aWR0aD0iICsgd2lkdGggKyAiLGhlaWdodD0iICsgaGVpZ2h0ICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAogICAgIH0KIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvUmVuZGVyaW5nSGludHMuamF2YSBiL2F3dC9qYXZhL2F3dC9SZW5kZXJpbmdIaW50cy5qYXZhCmluZGV4IDQ5NTc4ODQuLmFjZjZmYTEgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9SZW5kZXJpbmdIaW50cy5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9SZW5kZXJpbmdIaW50cy5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIEFsZXhleSBBLiBQZXRyZW5rbwogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3Q7CiAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKQEAgLTI3LDIyNCArMjgsMjE5IEBACiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAogLyoqCi0gKiBUaGUgUmVuZGVyaW5nSGludHMgY2xhc3MgcmVwcmVzZW50cyBwcmVmZXJlbmNlcyBmb3IgdGhlIHJlbmRlcmluZyBhbGdvcml0aG1zLiAKLSAqIFRoZSBwcmVmZXJlbmNlcyBhcmUgYXJiaXRyYXJ5IGFuZCBjYW4gYmUgc3BlY2lmaWVkIGJ5IE1hcCBvYmplY3RzIG9yIGJ5IAotICoga2V5LXZhbHVlIHBhaXJzLiAKKyAqIFRoZSBSZW5kZXJpbmdIaW50cyBjbGFzcyByZXByZXNlbnRzIHByZWZlcmVuY2VzIGZvciB0aGUgcmVuZGVyaW5nIGFsZ29yaXRobXMuCisgKiBUaGUgcHJlZmVyZW5jZXMgYXJlIGFyYml0cmFyeSBhbmQgY2FuIGJlIHNwZWNpZmllZCBieSBNYXAgb2JqZWN0cyBvciBieQorICoga2V5LXZhbHVlIHBhaXJzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFJlbmRlcmluZ0hpbnRzIGltcGxlbWVudHMgTWFwPE9iamVjdCwgT2JqZWN0PiwgQ2xvbmVhYmxlIHsKLSAgICAKKwogICAgIC8qKgotICAgICAqIFRoZSBDb25zdGFudCBLRVlfQUxQSEFfSU5URVJQT0xBVElPTiAtIGFscGhhIGludGVycG9sYXRpb24gcmVuZGVyaW5nIAotICAgICAqIGhpbnQga2V5LiAKKyAgICAgKiBUaGUgQ29uc3RhbnQgS0VZX0FMUEhBX0lOVEVSUE9MQVRJT04gLSBhbHBoYSBpbnRlcnBvbGF0aW9uIHJlbmRlcmluZyBoaW50CisgICAgICoga2V5LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgS2V5IEtFWV9BTFBIQV9JTlRFUlBPTEFUSU9OID0gbmV3IEtleUltcGwoMSk7Ci0gICAgCi0gICAgLyoqIAorCisgICAgLyoqCiAgICAgICogVGhlIENvbnN0YW50IFZBTFVFX0FMUEhBX0lOVEVSUE9MQVRJT05fREVGQVVMVCAtIGFscGhhIGludGVycG9sYXRpb24KICAgICAgKiByZW5kZXJpbmcgaGludCB2YWx1ZS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBWQUxVRV9BTFBIQV9JTlRFUlBPTEFUSU9OX0RFRkFVTFQgPSBuZXcgS2V5VmFsdWUoS0VZX0FMUEhBX0lOVEVSUE9MQVRJT04pOwotICAgIAotICAgIC8qKiAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBWQUxVRV9BTFBIQV9JTlRFUlBPTEFUSU9OX0RFRkFVTFQgPSBuZXcgS2V5VmFsdWUoCisgICAgICAgICAgICBLRVlfQUxQSEFfSU5URVJQT0xBVElPTik7CisKKyAgICAvKioKICAgICAgKiBUaGUgQ29uc3RhbnQgVkFMVUVfQUxQSEFfSU5URVJQT0xBVElPTl9TUEVFRCAtIGFscGhhIGludGVycG9sYXRpb24KICAgICAgKiByZW5kZXJpbmcgaGludCB2YWx1ZS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBWQUxVRV9BTFBIQV9JTlRFUlBPTEFUSU9OX1NQRUVEID0gbmV3IEtleVZhbHVlKEtFWV9BTFBIQV9JTlRFUlBPTEFUSU9OKTsKLSAgICAKLSAgICAvKiogCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVkFMVUVfQUxQSEFfSU5URVJQT0xBVElPTl9TUEVFRCA9IG5ldyBLZXlWYWx1ZSgKKyAgICAgICAgICAgIEtFWV9BTFBIQV9JTlRFUlBPTEFUSU9OKTsKKworICAgIC8qKgogICAgICAqIFRoZSBDb25zdGFudCBWQUxVRV9BTFBIQV9JTlRFUlBPTEFUSU9OX1FVQUxJVFkgLSBhbHBoYSBpbnRlcnBvbGF0aW9uCiAgICAgICogcmVuZGVyaW5nIGhpbnQgdmFsdWUuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVkFMVUVfQUxQSEFfSU5URVJQT0xBVElPTl9RVUFMSVRZID0gbmV3IEtleVZhbHVlKEtFWV9BTFBIQV9JTlRFUlBPTEFUSU9OKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBWQUxVRV9BTFBIQV9JTlRFUlBPTEFUSU9OX1FVQUxJVFkgPSBuZXcgS2V5VmFsdWUoCisgICAgICAgICAgICBLRVlfQUxQSEFfSU5URVJQT0xBVElPTik7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IEtFWV9BTlRJQUxJQVNJTkcgLSBhbnRpYWxpYXNpbmcgcmVuZGVyaW5nIAotICAgICAqIGhpbnQga2V5LiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgS0VZX0FOVElBTElBU0lORyAtIGFudGlhbGlhc2luZyByZW5kZXJpbmcgaGludCBrZXkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBLZXkgS0VZX0FOVElBTElBU0lORyA9IG5ldyBLZXlJbXBsKDIpOwotICAgIAorCiAgICAgLyoqCi0gICAgICogVGhlIENvbnN0YW50IFZBTFVFX0FOVElBTElBU19ERUZBVUxUIC0gYW50aWFsaWFzaW5nCi0gICAgICogcmVuZGVyaW5nIGhpbnQgdmFsdWUuIAorICAgICAqIFRoZSBDb25zdGFudCBWQUxVRV9BTlRJQUxJQVNfREVGQVVMVCAtIGFudGlhbGlhc2luZyByZW5kZXJpbmcgaGludCB2YWx1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBWQUxVRV9BTlRJQUxJQVNfREVGQVVMVCA9IG5ldyBLZXlWYWx1ZShLRVlfQU5USUFMSUFTSU5HKTsKLSAgICAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFZBTFVFX0FOVElBTElBU19PTiAtIGFudGlhbGlhc2luZwotICAgICAqIHJlbmRlcmluZyBoaW50IHZhbHVlLgorCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFZBTFVFX0FOVElBTElBU19PTiAtIGFudGlhbGlhc2luZyByZW5kZXJpbmcgaGludCB2YWx1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBWQUxVRV9BTlRJQUxJQVNfT04gPSBuZXcgS2V5VmFsdWUoS0VZX0FOVElBTElBU0lORyk7Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBUaGUgQ29uc3RhbnQgVkFMVUVfQU5USUFMSUFTX09GRiAtIGFudGlhbGlhc2luZwotICAgICAqIHJlbmRlcmluZyBoaW50IHZhbHVlLgorICAgICAqIFRoZSBDb25zdGFudCBWQUxVRV9BTlRJQUxJQVNfT0ZGIC0gYW50aWFsaWFzaW5nIHJlbmRlcmluZyBoaW50IHZhbHVlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFZBTFVFX0FOVElBTElBU19PRkYgPSBuZXcgS2V5VmFsdWUoS0VZX0FOVElBTElBU0lORyk7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IEtFWV9DT0xPUl9SRU5ERVJJTkcgIC0gY29sb3IgcmVuZGVyaW5nIAotICAgICAqIGhpbnQga2V5LgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBLRVlfQ09MT1JfUkVOREVSSU5HIC0gY29sb3IgcmVuZGVyaW5nIGhpbnQga2V5LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgS2V5IEtFWV9DT0xPUl9SRU5ERVJJTkcgPSBuZXcgS2V5SW1wbCgzKTsKLSAgICAKKwogICAgIC8qKgotICAgICAqIFRoZSBDb25zdGFudCBWQUxVRV9DT0xPUl9SRU5ERVJfREVGQVVMVCAtIGNvbG9yCi0gICAgICogcmVuZGVyaW5nIGhpbnQgdmFsdWUuIAorICAgICAqIFRoZSBDb25zdGFudCBWQUxVRV9DT0xPUl9SRU5ERVJfREVGQVVMVCAtIGNvbG9yIHJlbmRlcmluZyBoaW50IHZhbHVlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFZBTFVFX0NPTE9SX1JFTkRFUl9ERUZBVUxUID0gbmV3IEtleVZhbHVlKEtFWV9DT0xPUl9SRU5ERVJJTkcpOwotICAgIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVkFMVUVfQ09MT1JfUkVOREVSX1NQRUVEICAtIGNvbG9yCi0gICAgICogcmVuZGVyaW5nIGhpbnQgdmFsdWUuIAorCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFZBTFVFX0NPTE9SX1JFTkRFUl9TUEVFRCAtIGNvbG9yIHJlbmRlcmluZyBoaW50IHZhbHVlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFZBTFVFX0NPTE9SX1JFTkRFUl9TUEVFRCA9IG5ldyBLZXlWYWx1ZShLRVlfQ09MT1JfUkVOREVSSU5HKTsKLSAgICAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFZBTFVFX0NPTE9SX1JFTkRFUl9RVUFMSVRZIC0gY29sb3IKLSAgICAgKiByZW5kZXJpbmcgaGludCB2YWx1ZS4KKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBWQUxVRV9DT0xPUl9SRU5ERVJfUVVBTElUWSAtIGNvbG9yIHJlbmRlcmluZyBoaW50IHZhbHVlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFZBTFVFX0NPTE9SX1JFTkRFUl9RVUFMSVRZID0gbmV3IEtleVZhbHVlKEtFWV9DT0xPUl9SRU5ERVJJTkcpOwogCiAgICAgLyoqCi0gICAgICogIFRoZSBDb25zdGFudCBLRVlfRElUSEVSSU5HICAtIGRpdGhlcmluZwotICAgICAqIHJlbmRlcmluZyBoaW50IGtleS4KKyAgICAgKiBUaGUgQ29uc3RhbnQgS0VZX0RJVEhFUklORyAtIGRpdGhlcmluZyByZW5kZXJpbmcgaGludCBrZXkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBLZXkgS0VZX0RJVEhFUklORyA9IG5ldyBLZXlJbXBsKDQpOwotICAgIAorCiAgICAgLyoqCi0gICAgICogVGhlIENvbnN0YW50IFZBTFVFX0RJVEhFUl9ERUZBVUxUIC0gZGl0aGVyaW5nCi0gICAgICogcmVuZGVyaW5nIGhpbnQgdmFsdWUuCisgICAgICogVGhlIENvbnN0YW50IFZBTFVFX0RJVEhFUl9ERUZBVUxUIC0gZGl0aGVyaW5nIHJlbmRlcmluZyBoaW50IHZhbHVlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFZBTFVFX0RJVEhFUl9ERUZBVUxUID0gbmV3IEtleVZhbHVlKEtFWV9ESVRIRVJJTkcpOwotICAgIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVkFMVUVfRElUSEVSX0RJU0FCTEUgLSBkaXRoZXJpbmcKLSAgICAgKiByZW5kZXJpbmcgaGludCB2YWx1ZS4KKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBWQUxVRV9ESVRIRVJfRElTQUJMRSAtIGRpdGhlcmluZyByZW5kZXJpbmcgaGludCB2YWx1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBWQUxVRV9ESVRIRVJfRElTQUJMRSA9IG5ldyBLZXlWYWx1ZShLRVlfRElUSEVSSU5HKTsKLSAgICAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFZBTFVFX0RJVEhFUl9ESVNBQkxFIC0gZGl0aGVyaW5nCi0gICAgICogcmVuZGVyaW5nIGhpbnQgdmFsdWUuCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVkFMVUVfRElUSEVSX0RJU0FCTEUgLSBkaXRoZXJpbmcgcmVuZGVyaW5nIGhpbnQgdmFsdWUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVkFMVUVfRElUSEVSX0VOQUJMRSA9IG5ldyBLZXlWYWx1ZShLRVlfRElUSEVSSU5HKTsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgS0VZX0ZSQUNUSU9OQUxNRVRSSUNTIC0gZnJhY3Rpb25hbCBtZXRyaWNzCi0gICAgICogcmVuZGVyaW5nIGhpbnQga2V5LgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBLRVlfRlJBQ1RJT05BTE1FVFJJQ1MgLSBmcmFjdGlvbmFsIG1ldHJpY3MgcmVuZGVyaW5nIGhpbnQKKyAgICAgKiBrZXkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBLZXkgS0VZX0ZSQUNUSU9OQUxNRVRSSUNTID0gbmV3IEtleUltcGwoNSk7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBUaGUgQ29uc3RhbnQgVkFMVUVfRlJBQ1RJT05BTE1FVFJJQ1NfREVGQVVMVCAtIGZyYWN0aW9uYWwgbWV0cmljcwogICAgICAqIHJlbmRlcmluZyBoaW50IHZhbHVlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFZBTFVFX0ZSQUNUSU9OQUxNRVRSSUNTX0RFRkFVTFQgPSBuZXcgS2V5VmFsdWUoS0VZX0ZSQUNUSU9OQUxNRVRSSUNTKTsKLSAgICAKKwogICAgIC8qKgotICAgICAqIFRoZSBDb25zdGFudCBWQUxVRV9GUkFDVElPTkFMTUVUUklDU19PTiAtIGZyYWN0aW9uYWwgbWV0cmljcwotICAgICAqIHJlbmRlcmluZyBoaW50IHZhbHVlLgorICAgICAqIFRoZSBDb25zdGFudCBWQUxVRV9GUkFDVElPTkFMTUVUUklDU19PTiAtIGZyYWN0aW9uYWwgbWV0cmljcyByZW5kZXJpbmcKKyAgICAgKiBoaW50IHZhbHVlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFZBTFVFX0ZSQUNUSU9OQUxNRVRSSUNTX09OID0gbmV3IEtleVZhbHVlKEtFWV9GUkFDVElPTkFMTUVUUklDUyk7Ci0gICAgCisKICAgICAvKioKLSAgICAgKiAgVGhlIENvbnN0YW50IFZBTFVFX0ZSQUNUSU9OQUxNRVRSSUNTX09GRiAtIGZyYWN0aW9uYWwgbWV0cmljcwotICAgICAqIHJlbmRlcmluZyBoaW50IHZhbHVlLgorICAgICAqIFRoZSBDb25zdGFudCBWQUxVRV9GUkFDVElPTkFMTUVUUklDU19PRkYgLSBmcmFjdGlvbmFsIG1ldHJpY3MgcmVuZGVyaW5nCisgICAgICogaGludCB2YWx1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBWQUxVRV9GUkFDVElPTkFMTUVUUklDU19PRkYgPSBuZXcgS2V5VmFsdWUoS0VZX0ZSQUNUSU9OQUxNRVRSSUNTKTsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgS0VZX0lOVEVSUE9MQVRJT04gLSBpbnRlcnBvbGF0aW9uCi0gICAgICogcmVuZGVyaW5nIGhpbnQga2V5LgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBLRVlfSU5URVJQT0xBVElPTiAtIGludGVycG9sYXRpb24gcmVuZGVyaW5nIGhpbnQga2V5LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgS2V5IEtFWV9JTlRFUlBPTEFUSU9OID0gbmV3IEtleUltcGwoNik7Ci0gICAgCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBWQUxVRV9JTlRFUlBPTEFUSU9OX0JJQ1VCSUMgLSBpbnRlcnBvbGF0aW9uCi0gICAgICogcmVuZGVyaW5nIGhpbnQgdmFsdWUuIAorCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFZBTFVFX0lOVEVSUE9MQVRJT05fQklDVUJJQyAtIGludGVycG9sYXRpb24gcmVuZGVyaW5nIGhpbnQKKyAgICAgKiB2YWx1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBWQUxVRV9JTlRFUlBPTEFUSU9OX0JJQ1VCSUMgPSBuZXcgS2V5VmFsdWUoS0VZX0lOVEVSUE9MQVRJT04pOwotICAgIAorCiAgICAgLyoqCi0gICAgICogVGhlIENvbnN0YW50IFZBTFVFX0lOVEVSUE9MQVRJT05fQklMSU5FQVIgLSBpbnRlcnBvbGF0aW9uCi0gICAgICogcmVuZGVyaW5nIGhpbnQgdmFsdWUuCisgICAgICogVGhlIENvbnN0YW50IFZBTFVFX0lOVEVSUE9MQVRJT05fQklMSU5FQVIgLSBpbnRlcnBvbGF0aW9uIHJlbmRlcmluZyBoaW50CisgICAgICogdmFsdWUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVkFMVUVfSU5URVJQT0xBVElPTl9CSUxJTkVBUiA9IG5ldyBLZXlWYWx1ZShLRVlfSU5URVJQT0xBVElPTik7Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBWQUxVRV9JTlRFUlBPTEFUSU9OX05FQVJFU1RfTkVJR0hCT1IgLSBpbnRlcnBvbGF0aW9uCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVkFMVUVfSU5URVJQT0xBVElPTl9ORUFSRVNUX05FSUdIQk9SIC0gaW50ZXJwb2xhdGlvbgogICAgICAqIHJlbmRlcmluZyBoaW50IHZhbHVlLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFZBTFVFX0lOVEVSUE9MQVRJT05fTkVBUkVTVF9ORUlHSEJPUiA9IG5ldyBLZXlWYWx1ZShLRVlfSU5URVJQT0xBVElPTik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVkFMVUVfSU5URVJQT0xBVElPTl9ORUFSRVNUX05FSUdIQk9SID0gbmV3IEtleVZhbHVlKAorICAgICAgICAgICAgS0VZX0lOVEVSUE9MQVRJT04pOwogCiAgICAgLyoqCiAgICAgICogVGhlIENvbnN0YW50IEtFWV9SRU5ERVJJTkcgLSByZW5kZXJpbmcgaGludCBrZXkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBLZXkgS0VZX1JFTkRFUklORyA9IG5ldyBLZXlJbXBsKDcpOwotICAgIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVkFMVUVfUkVOREVSX0RFRkFVTFQgLSByZW5kZXJpbmcgaGludCB2YWx1ZS4gCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVkFMVUVfUkVOREVSX0RFRkFVTFQgLSByZW5kZXJpbmcgaGludCB2YWx1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBWQUxVRV9SRU5ERVJfREVGQVVMVCA9IG5ldyBLZXlWYWx1ZShLRVlfUkVOREVSSU5HKTsKLSAgICAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFZBTFVFX1JFTkRFUl9TUEVFRCAtIHJlbmRlcmluZyBoaW50IHZhbHVlLiAKKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBWQUxVRV9SRU5ERVJfU1BFRUQgLSByZW5kZXJpbmcgaGludCB2YWx1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBWQUxVRV9SRU5ERVJfU1BFRUQgPSBuZXcgS2V5VmFsdWUoS0VZX1JFTkRFUklORyk7Ci0gICAgCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBWQUxVRV9SRU5ERVJfUVVBTElUWSAtIHJlbmRlcmluZyBoaW50IHZhbHVlLiAKKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBWQUxVRV9SRU5ERVJfUVVBTElUWSAtIHJlbmRlcmluZyBoaW50IHZhbHVlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFZBTFVFX1JFTkRFUl9RVUFMSVRZID0gbmV3IEtleVZhbHVlKEtFWV9SRU5ERVJJTkcpOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBLRVlfU1RST0tFX0NPTlRST0wgLSBzdHJva2UgY29udHJvbCBoaW50IGtleS4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEtFWV9TVFJPS0VfQ09OVFJPTCAtIHN0cm9rZSBjb250cm9sIGhpbnQga2V5LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgS2V5IEtFWV9TVFJPS0VfQ09OVFJPTCA9IG5ldyBLZXlJbXBsKDgpOwotICAgIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVkFMVUVfU1RST0tFX0RFRkFVTFQgLSBzdHJva2UgaGludCB2YWx1ZS4gCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVkFMVUVfU1RST0tFX0RFRkFVTFQgLSBzdHJva2UgaGludCB2YWx1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBWQUxVRV9TVFJPS0VfREVGQVVMVCA9IG5ldyBLZXlWYWx1ZShLRVlfU1RST0tFX0NPTlRST0wpOwotICAgIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVkFMVUVfU1RST0tFX05PUk1BTElaRSAtIHN0cm9rZSBoaW50IHZhbHVlLiAKKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBWQUxVRV9TVFJPS0VfTk9STUFMSVpFIC0gc3Ryb2tlIGhpbnQgdmFsdWUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVkFMVUVfU1RST0tFX05PUk1BTElaRSA9IG5ldyBLZXlWYWx1ZShLRVlfU1RST0tFX0NPTlRST0wpOwotICAgIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVkFMVUVfU1RST0tFX1BVUkUgLSBzdHJva2UgaGludCB2YWx1ZS4gCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVkFMVUVfU1RST0tFX1BVUkUgLSBzdHJva2UgaGludCB2YWx1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBWQUxVRV9TVFJPS0VfUFVSRSA9IG5ldyBLZXlWYWx1ZShLRVlfU1RST0tFX0NPTlRST0wpOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBLRVlfVEVYVF9BTlRJQUxJQVNJTkcgLSB0ZXh0IGFudGlhbGlhc2luZyBoaW50IGtleS4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEtFWV9URVhUX0FOVElBTElBU0lORyAtIHRleHQgYW50aWFsaWFzaW5nIGhpbnQga2V5LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgS2V5IEtFWV9URVhUX0FOVElBTElBU0lORyA9IG5ldyBLZXlJbXBsKDkpOwotICAgIAorCiAgICAgLyoqCi0gICAgICogIFRoZSBDb25zdGFudCBWQUxVRV9URVhUX0FOVElBTElBU19ERUZBVUxUIC0gdGV4dCBhbnRpYWxpYXNpbmcgaGludCBrZXkuIAorICAgICAqIFRoZSBDb25zdGFudCBWQUxVRV9URVhUX0FOVElBTElBU19ERUZBVUxUIC0gdGV4dCBhbnRpYWxpYXNpbmcgaGludCBrZXkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVkFMVUVfVEVYVF9BTlRJQUxJQVNfREVGQVVMVCA9IG5ldyBLZXlWYWx1ZShLRVlfVEVYVF9BTlRJQUxJQVNJTkcpOwotICAgIAorCiAgICAgLyoqCiAgICAgICogVGhlIENvbnN0YW50IFZBTFVFX1RFWFRfQU5USUFMSUFTX09OIC0gdGV4dCBhbnRpYWxpYXNpbmcgaGludCBrZXkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVkFMVUVfVEVYVF9BTlRJQUxJQVNfT04gPSBuZXcgS2V5VmFsdWUoS0VZX1RFWFRfQU5USUFMSUFTSU5HKTsKLSAgICAKKwogICAgIC8qKgotICAgICAqIFRoZSBDb25zdGFudCBWQUxVRV9URVhUX0FOVElBTElBU19PRkYgLSB0ZXh0IGFudGlhbGlhc2luZyBoaW50IGtleS4gCisgICAgICogVGhlIENvbnN0YW50IFZBTFVFX1RFWFRfQU5USUFMSUFTX09GRiAtIHRleHQgYW50aWFsaWFzaW5nIGhpbnQga2V5LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFZBTFVFX1RFWFRfQU5USUFMSUFTX09GRiA9IG5ldyBLZXlWYWx1ZShLRVlfVEVYVF9BTlRJQUxJQVNJTkcpOwogCiAgICAgLyoqIFRoZSBtYXAuICovCiAgICAgcHJpdmF0ZSBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PiBtYXAgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsKLSAgICAKKwogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyByZW5kZXJpbmcgaGludHMgb2JqZWN0IGZyb20gc3BlY2lmaWVkIE1hcCBvYmplY3Qgd2l0aCBkZWZpbmVkCi0gICAgICoga2V5L3ZhbHVlIHBhaXJzIG9yIG51bGwgZm9yIGVtcHR5IFJlbmRlcmluZ0hpbnRzLiAKKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgcmVuZGVyaW5nIGhpbnRzIG9iamVjdCBmcm9tIHNwZWNpZmllZCBNYXAgb2JqZWN0IHdpdGgKKyAgICAgKiBkZWZpbmVkIGtleS92YWx1ZSBwYWlycyBvciBudWxsIGZvciBlbXB0eSBSZW5kZXJpbmdIaW50cy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFwIHRoZSBNYXAgb2JqZWN0IHdpdGggZGVmaW5lZCBrZXkvdmFsdWUgcGFpcnMgb3IgbnVsbCBmb3IKLSAgICAgKiBlbXB0eSBSZW5kZXJpbmdIaW50cy4gCisgICAgICogQHBhcmFtIG1hcAorICAgICAqICAgICAgICAgICAgdGhlIE1hcCBvYmplY3Qgd2l0aCBkZWZpbmVkIGtleS92YWx1ZSBwYWlycyBvciBudWxsIGZvciBlbXB0eQorICAgICAqICAgICAgICAgICAgUmVuZGVyaW5nSGludHMuCiAgICAgICovCiAgICAgcHVibGljIFJlbmRlcmluZ0hpbnRzKE1hcDxLZXksID8+IG1hcCkgewogICAgICAgICBzdXBlcigpOwpAQCAtMjU0LDEwICsyNTAsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgcmVuZGVyaW5nIGhpbnRzIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5L3ZhbHVlIHBhaXIuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHJlbmRlcmluZyBoaW50cyBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS92YWx1ZQorICAgICAqIHBhaXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGtleSB0aGUga2V5IG9mIGhpbnQgcHJvcGVydHkuCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiBoaW50IHByb3BlcnR5LgorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgb2YgaGludCBwcm9wZXJ0eS4KKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSBvZiBoaW50IHByb3BlcnR5LgogICAgICAqLwogICAgIHB1YmxpYyBSZW5kZXJpbmdIaW50cyhLZXkga2V5LCBPYmplY3QgdmFsdWUpIHsKICAgICAgICAgc3VwZXIoKTsKQEAgLTI2OCwyMSArMjY3LDIyIEBACiAgICAgICogQWRkcyB0aGUgcHJvcGVydGllcyByZXByZXNlbnRlZCBieSBrZXkvdmFsdWUgcGFpcnMgZnJvbSB0aGUgc3BlY2lmaWVkCiAgICAgICogUmVuZGVyaW5nSGludHMgb2JqZWN0IHRvIGN1cnJlbnQgb2JqZWN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBoaW50cyB0aGUgUmVuZGVyaW5nSGludHMgdG8gYmUgYWRkZWQuCisgICAgICogQHBhcmFtIGhpbnRzCisgICAgICogICAgICAgICAgICB0aGUgUmVuZGVyaW5nSGludHMgdG8gYmUgYWRkZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkKFJlbmRlcmluZ0hpbnRzIGhpbnRzKSB7CiAgICAgICAgIG1hcC5wdXRBbGwoaGludHMubWFwKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQdXRzIHRoZSBzcGVjaWZpZWQgdmFsdWUgdG8gdGhlIHNwZWNpZmllZCBrZXkuIE5laXRoZXIgdGhlIGtleSBub3IgCi0gICAgICogdGhlIHZhbHVlIGNhbiBiZSBudWxsLgorICAgICAqIFB1dHMgdGhlIHNwZWNpZmllZCB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIGtleS4gTmVpdGhlciB0aGUga2V5IG5vciB0aGUKKyAgICAgKiB2YWx1ZSBjYW4gYmUgbnVsbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5IHRoZSByZW5kZXJpbmcgaGludCBrZXkuCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSByZW5kZXJpbmcgaGludCB2YWx1ZS4gCi0gICAgICogCisgICAgICogQHBhcmFtIGtleQorICAgICAqICAgICAgICAgICAgdGhlIHJlbmRlcmluZyBoaW50IGtleS4KKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSByZW5kZXJpbmcgaGludCB2YWx1ZS4KICAgICAgKiBAcmV0dXJuIHRoZSBwcmV2aW91cyByZW5kZXJpbmcgaGludCB2YWx1ZSBhc3NpZ25lZCB0byB0aGUga2V5IG9yIG51bGwuCi0gICAgICogCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7CiAgICAgICAgIGlmICghKChLZXkpa2V5KS5pc0NvbXBhdGlibGVWYWx1ZSh2YWx1ZSkpIHsKQEAgLTI5MywxMyArMjkzLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGtleSBhbmQgY29ycmVzcG9uZGluZyB2YWx1ZSBmcm9tIAotICAgICAqIHRoZSBSZW5kZXJpbmdIaW50cyBvYmplY3QuCisgICAgICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGtleSBhbmQgY29ycmVzcG9uZGluZyB2YWx1ZSBmcm9tIHRoZSBSZW5kZXJpbmdIaW50cworICAgICAqIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5IHRoZSBzcGVjaWZpZWQgaGludCBrZXkgdG8gYmUgcmVtb3ZlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3Qgb2YgcHJldmlvdXMgcmVuZGVyaW5nIGhpbnQgdmFsdWUgd2hpY2ggaXMgCi0gICAgICogYXNzaWduZWQgdG8gdGhlIHNwZWNpZmllZCBrZXksIG9yIG51bGwuCisgICAgICogQHBhcmFtIGtleQorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBoaW50IGtleSB0byBiZSByZW1vdmVkLgorICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCBvZiBwcmV2aW91cyByZW5kZXJpbmcgaGludCB2YWx1ZSB3aGljaCBpcyBhc3NpZ25lZCB0bworICAgICAqICAgICAgICAgdGhlIHNwZWNpZmllZCBrZXksIG9yIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdCByZW1vdmUoT2JqZWN0IGtleSkgewogICAgICAgICByZXR1cm4gbWFwLnJlbW92ZShrZXkpOwpAQCAtMzA4LDggKzMwOCw4IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgdmFsdWUgYXNzaWduZWQgdG8gdGhlIHNwZWNpZmllZCBrZXkuCiAgICAgICogCi0gICAgICogQHBhcmFtIGtleSB0aGUgcmVuZGVyaW5nIGhpbnQga2V5LgotICAgICAqIAorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSByZW5kZXJpbmcgaGludCBrZXkuCiAgICAgICogQHJldHVybiB0aGUgb2JqZWN0IGFzc2lnbmVkIHRvIHRoZSBzcGVjaWZpZWQga2V5LgogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBrZXkpIHsKQEAgLTMxOSw3ICszMTksNyBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBzZXQgb2YgcmVuZGVyaW5nIGhpbnRzIGtleXMgZm9yIGN1cnJlbnQgUmVuZGVyaW5nSGludHMgb2JqZWN0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNldCBvZiByZW5kZXJpbmcgaGludHMga2V5cy4gCisgICAgICogQHJldHVybiB0aGUgc2V0IG9mIHJlbmRlcmluZyBoaW50cyBrZXlzLgogICAgICAqLwogICAgIHB1YmxpYyBTZXQ8T2JqZWN0PiBrZXlTZXQoKSB7CiAgICAgICAgIHJldHVybiBtYXAua2V5U2V0KCk7CkBAIC0zMzYsMjMgKzMzNiwyMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFB1dHMgYWxsIG9mIHRoZSBwcmVmZXJlbmNlcyBmcm9tIHRoZSBzcGVjaWZpZWQgTWFwIGludG8gCi0gICAgICogdGhlIGN1cnJlbnQgUmVuZGVyaW5nSGludHMgb2JqZWN0LiBUaGVzZSBtYXBwaW5ncyByZXBsYWNlIAotICAgICAqIGFsbCBleGlzdGluZyBwcmVmZXJlbmNlcy4KKyAgICAgKiBQdXRzIGFsbCBvZiB0aGUgcHJlZmVyZW5jZXMgZnJvbSB0aGUgc3BlY2lmaWVkIE1hcCBpbnRvIHRoZSBjdXJyZW50CisgICAgICogUmVuZGVyaW5nSGludHMgb2JqZWN0LiBUaGVzZSBtYXBwaW5ncyByZXBsYWNlIGFsbCBleGlzdGluZyBwcmVmZXJlbmNlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbSB0aGUgc3BlY2lmaWVkIE1hcCBvZiBwcmVmZXJlbmNlcy4KKyAgICAgKiBAcGFyYW0gbQorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBNYXAgb2YgcHJlZmVyZW5jZXMuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcHV0QWxsKE1hcDw/LCA/PiBtKSB7CiAgICAgICAgIGlmIChtIGluc3RhbmNlb2YgUmVuZGVyaW5nSGludHMpIHsKLSAgICAgICAgICAgIG1hcC5wdXRBbGwoKChSZW5kZXJpbmdIaW50cykgbSkubWFwKTsKKyAgICAgICAgICAgIG1hcC5wdXRBbGwoKChSZW5kZXJpbmdIaW50cyltKS5tYXApOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgU2V0PD8+IGVudHJpZXMgPSBtLmVudHJ5U2V0KCk7CiAKLSAgICAgICAgICAgIGlmIChlbnRyaWVzICE9IG51bGwpeworICAgICAgICAgICAgaWYgKGVudHJpZXMgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIEl0ZXJhdG9yPD8+IGl0ID0gZW50cmllcy5pdGVyYXRvcigpOwogICAgICAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTWFwLkVudHJ5PD8sID8+IGVudHJ5ID0gKE1hcC5FbnRyeTw/LCA/PikgaXQubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBLZXkga2V5ID0gKEtleSkgZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeTw/LCA/PiBlbnRyeSA9IChNYXAuRW50cnk8PywgPz4paXQubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBLZXkga2V5ID0gKEtleSllbnRyeS5nZXRLZXkoKTsKICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbCA9IGVudHJ5LmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICAgICAgIHB1dChrZXksIHZhbCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMzYxLDcgKzM2MSw4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIENvbGxlY3Rpb24gb2YgdmFsdWVzIGNvbnRhaW5lZCBpbiBjdXJyZW50IFJlbmRlcmluZ0hpbnRzIG9iamVjdC4KKyAgICAgKiBSZXR1cm5zIGEgQ29sbGVjdGlvbiBvZiB2YWx1ZXMgY29udGFpbmVkIGluIGN1cnJlbnQgUmVuZGVyaW5nSGludHMKKyAgICAgKiBvYmplY3QuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgQ29sbGVjdGlvbiBvZiBSZW5kZXJpbmdIaW50cydzIHZhbHVlcy4KICAgICAgKi8KQEAgLTM3MywxMCArMzc0LDEwIEBACiAgICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IGN1cnJlbnQgUmVuZGVyaW5nSGludHMgb2JqZWN0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZQogICAgICAqIHRoZSB2YWx1ZSB3aGljaCBpcyBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIE9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHNwZWNpZmllZCBPYmplY3QuCi0gICAgICogCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIE9iamVjdC4KICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGFzc2lnbmVkIHRvIGF0IGxlYXN0IG9uZQotICAgICAqIFJlbmRlcmluZ0hpbnQncyBrZXksIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiAgICAgICAgIFJlbmRlcmluZ0hpbnQncyBrZXksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgewogICAgICAgICByZXR1cm4gbWFwLmNvbnRhaW5zVmFsdWUodmFsdWUpOwpAQCAtMzg2LDExICszODcsMTAgQEAKICAgICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgY3VycmVudCBSZW5kZXJpbmdIaW50cyBvYmplY3QgY29udGFpbnMgdGhlIGtleQogICAgICAqIHdoaWNoIGlzIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgT2JqZWN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkgdGhlIHNwZWNpZmllZCBPYmplY3QuCi0gICAgICogCisgICAgICogQHBhcmFtIGtleQorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBPYmplY3QuCiAgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgUmVuZGVyaW5nSGludHMgb2JqZWN0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgT2JqZWN0Ci0gICAgICogYXMgYSBrZXksIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKiAKKyAgICAgKiAgICAgICAgIGFzIGEga2V5LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSkgewogICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKQEAgLTQwMSw4ICs0MDEsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgUmVuZGVyaW5nSGludHMgb2JqZWN0IGNvbnRhaW5zIGFueSAKLSAgICAgKiBrZXkvdmFsdWUgcGFpcnMuCisgICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBSZW5kZXJpbmdIaW50cyBvYmplY3QgY29udGFpbnMgYW55IGtleS92YWx1ZQorICAgICAqIHBhaXJzLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIFJlbmRlcmluZ0hpbnRzIG9iamVjdCBpcyBlbXB0eSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwpAQCAtNDI5LDExICs0MjksMTAgQEAKICAgICAvKioKICAgICAgKiBDb21wYXJlcyB0aGUgUmVuZGVyaW5nSGludHMgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIG8gdGhlIHNwZWNpZmllZCBPYmplY3QgdG8gYmUgY29tcGFpcmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIE9iamVjdCBpcyBhIE1hcCB3aG9zZSBrZXkvdmFsdWUgcGFpcnMgCi0gICAgICogbWF0Y2ggdGhpcyBSZW5kZXJpbmdIaW50cycga2V5L3ZhbHVlIHBhaXJzLCAKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIG8KKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgT2JqZWN0IHRvIGJlIGNvbXBhcmVkLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIE9iamVjdCBpcyBhIE1hcCB3aG9zZSBrZXkvdmFsdWUgcGFpcnMgbWF0Y2ggdGhpcworICAgICAqICAgICAgICAgUmVuZGVyaW5nSGludHMnIGtleS92YWx1ZSBwYWlycywgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewpAQCAtNDUyLDcgKzQ1MSw3IEBACiAgICAgICAgICAgICBLZXkga2V5ID0gKEtleSlpdC5uZXh0KCk7CiAgICAgICAgICAgICBPYmplY3QgdjEgPSBnZXQoa2V5KTsKICAgICAgICAgICAgIE9iamVjdCB2MiA9IG0uZ2V0KGtleSk7Ci0gICAgICAgICAgICBpZiAoISh2MT09bnVsbD92Mj09bnVsbDp2MS5lcXVhbHModjIpKSkgeworICAgICAgICAgICAgaWYgKCEodjEgPT0gbnVsbCA/IHYyID09IG51bGwgOiB2MS5lcXVhbHModjIpKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNDg1LDI4ICs0ODQsMzAgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFJlbmRlcmluZ0hpbnRzIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBTdHJpbmcgb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgUmVuZGVyaW5nSGludHMgb2JqZWN0LiAKKyAgICAgKiBAcmV0dXJuIHRoZSBTdHJpbmcgb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgUmVuZGVyaW5nSGludHMgb2JqZWN0LgogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiUmVuZGVyaW5nSGludHNbIittYXAudG9TdHJpbmcoKSsiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICAgICAgICByZXR1cm4gIlJlbmRlcmluZ0hpbnRzWyIgKyBtYXAudG9TdHJpbmcoKSArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhlIFJlbmRlcmluZ0hpbnRzLktleSBjbGFzcyBpcyBhYnN0cmFjdCBhbmQgZGVmaW5lcyBhIGJhc2UgdHlwZSBmb3IgCi0gICAgICogYWxsIFJlbmRlcmluZ0hpbnRzIGtleXMuCisgICAgICogVGhlIFJlbmRlcmluZ0hpbnRzLktleSBjbGFzcyBpcyBhYnN0cmFjdCBhbmQgZGVmaW5lcyBhIGJhc2UgdHlwZSBmb3IgYWxsCisgICAgICogUmVuZGVyaW5nSGludHMga2V5cy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEtleSB7Ci0gICAgICAgIAorCiAgICAgICAgIC8qKiBUaGUga2V5LiAqLwogICAgICAgICBwcml2YXRlIGZpbmFsIGludCBrZXk7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBrZXkgd2l0aCB1bmlxdWUgaW50IGlkZW50aWZpZXIuIAotICAgICAgICAgKiBObyB0d28gb2JqZWN0cyBvZiB0aGUgc2FtZSBzdWJjbGFzcyB3aXRoIHRoZSBzYW1lIGludGVnZXIga2V5Ci0gICAgICAgICAqIGNhbiBiZSBpbnN0YW50aWF0ZWQuIAorICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcga2V5IHdpdGggdW5pcXVlIGludGVnZXIgaWRlbnRpZmllci4gTm8gdHdvIG9iamVjdHMKKyAgICAgICAgICogb2YgdGhlIHNhbWUgc3ViY2xhc3Mgd2l0aCB0aGUgc2FtZSBpbnRlZ2VyIGtleSBjYW4gYmUgaW5zdGFudGlhdGVkLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGtleSB0aGUgdW5pcXVlIGtleS4KKyAgICAgICAgICogQHBhcmFtIGtleQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB1bmlxdWUga2V5LgogICAgICAgICAgKi8KICAgICAgICAgcHJvdGVjdGVkIEtleShpbnQga2V5KSB7CiAgICAgICAgICAgICB0aGlzLmtleSA9IGtleTsKQEAgLTUxNSwxMCArNTE2LDEwIEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBDb21wYXJlcyB0aGUgS2V5IG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIG8gdGhlIHNwZWNpZmllZCBPYmplY3QgdG8gYmUgY29tcGFpcmVkLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgS2V5IGlzIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgb2JqZWN0LCAKLSAgICAgICAgICogZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICAgKiBAcGFyYW0gbworICAgICAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgT2JqZWN0IHRvIGJlIGNvbXBhcmVkLgorICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBLZXkgaXMgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCBvYmplY3QsIGZhbHNlCisgICAgICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAgICAgKi8KICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewpAQCAtNTM2LDExICs1MzcsMTEgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIGludCB1bmlxdWUga2V5IHdpdGggd2hpY2ggdGhpcyBLZXkgb2JqZWN0IGhhcyBiZWVuIAorICAgICAgICAgKiBSZXR1cm5zIGludGVnZXIgdW5pcXVlIGtleSB3aXRoIHdoaWNoIHRoaXMgS2V5IG9iamVjdCBoYXMgYmVlbgogICAgICAgICAgKiBpbnN0YW50aWF0ZWQuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBpbnQgdW5pcXVlIGtleSB3aXRoIHdoaWNoIHRoaXMgS2V5IG9iamVjdCBoYXMgYmVlbiAKLSAgICAgICAgICogaW5zdGFudGlhdGVkLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBpbnRlZ2VyIHVuaXF1ZSBrZXkgd2l0aCB3aGljaCB0aGlzIEtleSBvYmplY3QgaGFzIGJlZW4KKyAgICAgICAgICogICAgICAgICBpbnN0YW50aWF0ZWQuCiAgICAgICAgICAqLwogICAgICAgICBwcm90ZWN0ZWQgZmluYWwgaW50IGludEtleSgpIHsKICAgICAgICAgICAgIHJldHVybiBrZXk7CkBAIC01NDksMTAgKzU1MCwxMCBAQAogICAgICAgICAvKioKICAgICAgICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHNwZWNpZmllZCB2YWx1ZSBpcyBjb21wYXRpYmxlIHdpdGggdGhlIEtleS4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSB2YWwgdGhlIE9iamVjdC4KLSAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSB2YWwKKyAgICAgICAgICogICAgICAgICAgICB0aGUgT2JqZWN0LgogICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBLZXksCi0gICAgICAgICAqIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0NvbXBhdGlibGVWYWx1ZShPYmplY3QgdmFsKTsKICAgICB9CkBAIC01NjMsOSArNTY0LDEwIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgS2V5SW1wbCBleHRlbmRzIEtleSB7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBrZXkgaW1wbC4KKyAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGtleSBpbXBsZW1lbnRhdGlvbi4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBrZXkgdGhlIGtleQorICAgICAgICAgKiBAcGFyYW0ga2V5CisgICAgICAgICAqICAgICAgICAgICAgdGhlIGtleS4KICAgICAgICAgICovCiAgICAgICAgIHByb3RlY3RlZCBLZXlJbXBsKGludCBrZXkpIHsKICAgICAgICAgICAgIHN1cGVyKGtleSk7CkBAIC01ODUsMTQgKzU4NywxNyBAQAogICAgICAqIFByaXZhdGUgY2xhc3MgS2V5VmFsdWUgaXMgdXNlZCBhcyB2YWx1ZSBmb3IgS2V5IGNsYXNzIGluc3RhbmNlLgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEtleVZhbHVlIHsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUga2V5LiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUga2V5LgorICAgICAgICAgKi8KICAgICAgICAgcHJpdmF0ZSBmaW5hbCBLZXkga2V5OwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcga2V5IHZhbHVlLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGtleSB0aGUga2V5CisgICAgICAgICAqIEBwYXJhbSBrZXkKKyAgICAgICAgICogICAgICAgICAgICB0aGUga2V5LgogICAgICAgICAgKi8KICAgICAgICAgcHJvdGVjdGVkIEtleVZhbHVlKEtleSBrZXkpIHsKICAgICAgICAgICAgIHRoaXMua2V5ID0ga2V5OwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L1NoYXBlLmphdmEgYi9hd3QvamF2YS9hd3QvU2hhcGUuamF2YQppbmRleCAzZGJhZDI1Li41OWJjNjIzIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvU2hhcGUuamF2YQorKysgYi9hd3QvamF2YS9hd3QvU2hhcGUuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBBbGV4ZXkgQS4gUGV0cmVua28KICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0OwogCiBpbXBvcnQgamF2YS5hd3QuZ2VvbS5BZmZpbmVUcmFuc2Zvcm07CkBAIC0yNiwxMzcgKzI3LDEzNiBAQAogaW1wb3J0IGphdmEuYXd0Lmdlb20uUmVjdGFuZ2xlMkQ7CiAKIC8qKgotICogVGhlIFNoYXBlIGludGVyZmFjZSBkZWZpbmVzIGEgZ2VvbWV0cmljIHNoYXBlIGRlZmluZWQgYnkgYSBib3VuZGFyeSAKLSAqIChvdXRsaW5lKSBwYXRoLiBUaGUgcGF0aCBvdXRsaW5lIGNhbiBiZSBhY2Nlc3NlZCB0aHJvdWdoIGEgCi0gKiBQYXRoSXRlcmF0b3Igb2JqZWN0LiBUaGUgU2hhcGUgCi0gKiBpbnRlcmZhY2UgcHJvdmlkZXMgbWV0aG9kcyBmb3Igb2J0YWluaW5nIHRoZSBib3VuZGluZyBib3ggKHdoaWNoIGlzIAotICogdGhlIHNtYWxsZXN0IHJlY3RhbmdsZSBjb250YWluaW5nIHRoZSBzaGFwZSBhbmQgZm9yIG9idGFpbmluZyBhIFBhdGhJdGVyYXRvciAKLSAqIG9iamVjdCBmb3IgY3VycmVudCBTaGFwZSwgYXMgd2VsbCBhcyB1dGlsaXR5IG1ldGhvZHMgd2hpY2ggCi0gKiBkZXRlcm1pbmUgaWYgdGhlIFNoYXBlIGNvbnRhaW5zIG9yIGludGVyc2VjdHMgYSBSZWN0YW5nbGUgb3IgY29udGFpbnMgYSBQb2ludC4KKyAqIFRoZSBTaGFwZSBpbnRlcmZhY2UgZGVmaW5lcyBhIGdlb21ldHJpYyBzaGFwZSBkZWZpbmVkIGJ5IGEgYm91bmRhcnkgKG91dGxpbmUpCisgKiBwYXRoLiBUaGUgcGF0aCBvdXRsaW5lIGNhbiBiZSBhY2Nlc3NlZCB0aHJvdWdoIGEgUGF0aEl0ZXJhdG9yIG9iamVjdC4gVGhlCisgKiBTaGFwZSBpbnRlcmZhY2UgcHJvdmlkZXMgbWV0aG9kcyBmb3Igb2J0YWluaW5nIHRoZSBib3VuZGluZyBib3ggKHdoaWNoIGlzIHRoZQorICogc21hbGxlc3QgcmVjdGFuZ2xlIGNvbnRhaW5pbmcgdGhlIHNoYXBlIGFuZCBmb3Igb2J0YWluaW5nIGEgUGF0aEl0ZXJhdG9yCisgKiBvYmplY3QgZm9yIGN1cnJlbnQgU2hhcGUsIGFzIHdlbGwgYXMgdXRpbGl0eSBtZXRob2RzIHdoaWNoIGRldGVybWluZSBpZiB0aGUKKyAqIFNoYXBlIGNvbnRhaW5zIG9yIGludGVyc2VjdHMgYSBSZWN0YW5nbGUgb3IgY29udGFpbnMgYSBQb2ludC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgU2hhcGUgewotICAgIAorCiAgICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBwb2ludCB3aXRoIHNwZWNpZmllZCBjb29yZGluYXRlcyBsaWVzIGluc2lkZSAKKyAgICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhlIHBvaW50IHdpdGggc3BlY2lmaWVkIGNvb3JkaW5hdGVzIGxpZXMgaW5zaWRlCiAgICAgICogdGhlIFNoYXBlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgY29vcmRpbmF0ZXMgbGllIGluc2lkZSB0aGUgU2hhcGUsCi0gICAgICogb3RoZXJ3aXNlIGZhbHNlLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCBjb29yZGluYXRlcyBsaWUgaW5zaWRlIHRoZSBTaGFwZSwgZmFsc2UKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhkb3VibGUgeCwgZG91YmxlIHkpOwogCiAgICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSByZWN0YW5nbGUgd2l0aCBzcGVjaWZpZWQgCi0gICAgICogW3gsIHksIHdpZHRoLCBoZWlnaHRdIHBhcmFtZXRlcnMgbGllcyBpbnNpZGUgdGhlIFNoYXBlLgorICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgcmVjdGFuZ2xlIHdpdGggc3BlY2lmaWVkIFt4LCB5LCB3aWR0aCwgaGVpZ2h0XQorICAgICAqIHBhcmFtZXRlcnMgbGllcyBpbnNpZGUgdGhlIFNoYXBlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGRvdWJsZSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IAotICAgICAqIGNvcm5lci4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBkb3VibGUgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCAKLSAgICAgKiBjb3JuZXIuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHJlY3RhbmdsZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ2xlIGxpZXMgaW5zaWRlIHRoZSBTaGFwZSwKLSAgICAgKiBvdGhlcndpc2UgZmFsc2UuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGRvdWJsZSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lci4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgZG91YmxlIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHJlY3RhbmdsZS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ2xlIGxpZXMgaW5zaWRlIHRoZSBTaGFwZSwgZmFsc2UKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB3LCBkb3VibGUgaCk7CiAKICAgICAvKioKICAgICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBQb2ludDJEIGxpZXMgaW5zaWRlIHRoZSBTaGFwZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcG9pbnQgdGhlIFBvaW50MkQgb2JqZWN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCBQb2ludDJEIGxpZXMgaW5zaWRlIHRoZSBTaGFwZSwKLSAgICAgKiBvdGhlcndpc2UgZmFsc2UuCisgICAgICogQHBhcmFtIHBvaW50CisgICAgICogICAgICAgICAgICB0aGUgUG9pbnQyRCBvYmplY3QuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIFBvaW50MkQgbGllcyBpbnNpZGUgdGhlIFNoYXBlLCBmYWxzZQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFBvaW50MkQgcG9pbnQpOwogCiAgICAgLyoqCiAgICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBzcGVjaWZpZWQgcmVjdGFuZ2xlIGxpZXMgaW5zaWRlIHRoZSBTaGFwZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gciB0aGUgUmVjdGFuZ2xlMkQgb2JqZWN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCByZWN0YW5nbGUgbGllcyBpbnNpZGUgdGhlIFNoYXBlLAotICAgICAqIG90aGVyd2lzZSBmYWxzZS4KKyAgICAgKiBAcGFyYW0gcgorICAgICAqICAgICAgICAgICAgdGhlIFJlY3RhbmdsZTJEIG9iamVjdC4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ2xlIGxpZXMgaW5zaWRlIHRoZSBTaGFwZSwgZmFsc2UKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhSZWN0YW5nbGUyRCByKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBvZiB0aGUgU2hhcGUuIFRoZSBib3VuZGluZyByZWN0YW5nbGUKLSAgICAgKiBpcyB0aGUgc21hbGxlc3QgcmVjdGFuZ2xlIHdoaWNoIGNvbnRhaW5zIHRoZSBTaGFwZS4KKyAgICAgKiBHZXRzIHRoZSBib3VuZGluZyByZWN0YW5nbGUgb2YgdGhlIFNoYXBlLiBUaGUgYm91bmRpbmcgcmVjdGFuZ2xlIGlzIHRoZQorICAgICAqIHNtYWxsZXN0IHJlY3RhbmdsZSB3aGljaCBjb250YWlucyB0aGUgU2hhcGUuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIG9mIHRoZSBTaGFwZS4KICAgICAgKi8KICAgICBwdWJsaWMgUmVjdGFuZ2xlIGdldEJvdW5kcygpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgUmVjdGFuZ2xlMkQgd2hpY2ggcmVwcmVzZW50cyBTaGFwZSBib3VuZHMuCi0gICAgICogVGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBpcyB0aGUgc21hbGxlc3QgcmVjdGFuZ2xlIHdoaWNoIGNvbnRhaW5zIAotICAgICAqIHRoZSBTaGFwZS4KKyAgICAgKiBHZXRzIHRoZSBSZWN0YW5nbGUyRCB3aGljaCByZXByZXNlbnRzIFNoYXBlIGJvdW5kcy4gVGhlIGJvdW5kaW5nCisgICAgICogcmVjdGFuZ2xlIGlzIHRoZSBzbWFsbGVzdCByZWN0YW5nbGUgd2hpY2ggY29udGFpbnMgdGhlIFNoYXBlLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBvZiB0aGUgU2hhcGUuCiAgICAgICovCiAgICAgcHVibGljIFJlY3RhbmdsZTJEIGdldEJvdW5kczJEKCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBQYXRoSXRlcmF0b3Igb2JqZWN0IG9mIHRoZSBTaGFwZSB3aGljaCBwcm92aWRlcyAKLSAgICAgKiBhY2Nlc3MgdG8gdGhlIHNoYXBlJ3MgYm91bmRhcnkgbW9kaWZpZWQgCi0gICAgICogYnkgdGhlIHNwZWNpZmllZCBBZmZpbmVUcmFuc2Zvcm0uCisgICAgICogR2V0cyB0aGUgUGF0aEl0ZXJhdG9yIG9iamVjdCBvZiB0aGUgU2hhcGUgd2hpY2ggcHJvdmlkZXMgYWNjZXNzIHRvIHRoZQorICAgICAqIHNoYXBlJ3MgYm91bmRhcnkgbW9kaWZpZWQgYnkgdGhlIHNwZWNpZmllZCBBZmZpbmVUcmFuc2Zvcm0uCiAgICAgICogCi0gICAgICogQHBhcmFtIGF0IHRoZSBzcGVjaWZpZWQgQWZmaW5lVHJhbnNmb3JtIG9iamVjdCwgb3IgbnVsbC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gYXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgQWZmaW5lVHJhbnNmb3JtIG9iamVjdCBvciBudWxsLgogICAgICAqIEByZXR1cm4gUGF0aEl0ZXJhdG9yIG9iamVjdCBmb3IgdGhlIFNoYXBlLgogICAgICAqLwogICAgIHB1YmxpYyBQYXRoSXRlcmF0b3IgZ2V0UGF0aEl0ZXJhdG9yKEFmZmluZVRyYW5zZm9ybSBhdCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBQYXRoSXRlcmF0b3Igb2JqZWN0IG9mIHRoZSBTaGFwZSB3aGljaCBwcm92aWRlcyAKLSAgICAgKiBhY2Nlc3MgdG8gdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBzaGFwZXMgYm91bmRhcnkgbW9kaWZpZWQgCi0gICAgICogYnkgdGhlIHNwZWNpZmllZCBBZmZpbmVUcmFuc2Zvcm0uIFRoZSBmbGF0bmVzcyBwYXJhbWV0ZXIKLSAgICAgKiBkZWZpbmVzIHRoZSBhbW91bnQgb2Ygc3ViZGl2aXNpb24gb2YgdGhlIGN1cnZlZCBzZWdtZW50cyBhbmQKLSAgICAgKiBzcGVjaWZpZXMgdGhlIG1heGltdW0gZGlzdGFuY2Ugd2hpY2ggZXZlcnkgcG9pbnQgb24gdGhlIAotICAgICAqIHVuZmxhdHRlbmVkIHRyYW5zZm9ybWVkIGN1cnZlIGNhbiBkZXZpYXRlIGZyb20gdGhlIHJldHVybmVkIAotICAgICAqIGZsYXR0ZW5lZCBwYXRoIHNlZ21lbnRzLiAgCisgICAgICogR2V0cyB0aGUgUGF0aEl0ZXJhdG9yIG9iamVjdCBvZiB0aGUgU2hhcGUgd2hpY2ggcHJvdmlkZXMgYWNjZXNzIHRvIHRoZQorICAgICAqIGNvb3JkaW5hdGVzIG9mIHRoZSBzaGFwZXMgYm91bmRhcnkgbW9kaWZpZWQgYnkgdGhlIHNwZWNpZmllZAorICAgICAqIEFmZmluZVRyYW5zZm9ybS4gVGhlIGZsYXRuZXNzIHBhcmFtZXRlciBkZWZpbmVzIHRoZSBhbW91bnQgb2Ygc3ViZGl2aXNpb24KKyAgICAgKiBvZiB0aGUgY3VydmVkIHNlZ21lbnRzIGFuZCBzcGVjaWZpZXMgdGhlIG1heGltdW0gZGlzdGFuY2Ugd2hpY2ggZXZlcnkKKyAgICAgKiBwb2ludCBvbiB0aGUgdW5mbGF0dGVuZWQgdHJhbnNmb3JtZWQgY3VydmUgY2FuIGRldmlhdGUgZnJvbSB0aGUgcmV0dXJuZWQKKyAgICAgKiBmbGF0dGVuZWQgcGF0aCBzZWdtZW50cy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYXQgdGhlIHNwZWNpZmllZCBBZmZpbmVUcmFuc2Zvcm0gb2JqZWN0LCBvciBudWxsLgotICAgICAqIEBwYXJhbSBmbGF0bmVzcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGhlIGNvbnRyb2wgcG9pbnRzIGZvciAKLSAgICAgKiBhIGdpdmVuIGN1cnZlIHdoaWNoIHZhcmllcyBmcm9tIGNvbGluZWFyIGJlZm9yZSBhIHN1YmRpdmlkZWQgCi0gICAgICogY3VydmUgaXMgcmVwbGFjZWQgYnkgYSBzdHJhaWdodCBsaW5lIGNvbm5lY3RpbmcgdGhlIGVuZHBvaW50cy4gCi0gICAgICogCisgICAgICogQHBhcmFtIGF0CisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIEFmZmluZVRyYW5zZm9ybSBvYmplY3Qgb3IgbnVsbC4KKyAgICAgKiBAcGFyYW0gZmxhdG5lc3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0aGUgY29udHJvbCBwb2ludHMgZm9yIGEgZ2l2ZW4gY3VydmUKKyAgICAgKiAgICAgICAgICAgIHdoaWNoIHZhcmllcyBmcm9tIGNvbGluZWFyIGJlZm9yZSBhIHN1YmRpdmlkZWQgY3VydmUgaXMKKyAgICAgKiAgICAgICAgICAgIHJlcGxhY2VkIGJ5IGEgc3RyYWlnaHQgbGluZSBjb25uZWN0aW5nIHRoZSBlbmRwb2ludHMuCiAgICAgICogQHJldHVybiBQYXRoSXRlcmF0b3Igb2JqZWN0IGZvciB0aGUgU2hhcGUuCiAgICAgICovCiAgICAgcHVibGljIFBhdGhJdGVyYXRvciBnZXRQYXRoSXRlcmF0b3IoQWZmaW5lVHJhbnNmb3JtIGF0LCBkb3VibGUgZmxhdG5lc3MpOwogCiAgICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBpbnRlcmlvciBvZiByZWN0YW5ndWxhciBzcGVjaWZpZWQgYnkgCi0gICAgICogW3gsIHksIHdpZHRoLCBoZWlnaHRdIHBhcmFtZXRlcnMgaW50ZXJzZWN0cyB0aGUgaW50ZXJpb3Igb2YKLSAgICAgKiB0aGUgU2hhcGUuCisgICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBpbnRlcmlvciBvZiByZWN0YW5ndWxhciBzcGVjaWZpZWQgYnkgW3gsIHksCisgICAgICogd2lkdGgsIGhlaWdodF0gcGFyYW1ldGVycyBpbnRlcnNlY3RzIHRoZSBpbnRlcmlvciBvZiB0aGUgU2hhcGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggZG91YmxlIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQKLSAgICAgKiBjb3JuZXIuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgZG91YmxlIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgCi0gICAgICogY29ybmVyLgotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiByZWN0YW5nbGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgcmVjdGFuZ2xlIHNwZWNpZmllZCBieSAKLSAgICAgKiBbeCwgeSwgd2lkdGgsIGhlaWdodF0gcGFyYW1ldGVycyBpbnRlcnNlY3RzIHRoZSBpbnRlcmlvciBvZgotICAgICAqIHRoZSBTaGFwZSwgb3RoZXJ3aXNlIGZhbHNlLgotICAgICAqIAorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBkb3VibGUgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGRvdWJsZSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lci4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiByZWN0YW5nbGUuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgcmVjdGFuZ2xlIHNwZWNpZmllZCBieSBbeCwgeSwgd2lkdGgsIGhlaWdodF0KKyAgICAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW50ZXJzZWN0cyB0aGUgaW50ZXJpb3Igb2YgdGhlIFNoYXBlLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaW50ZXJzZWN0cyhkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB3LCBkb3VibGUgaCk7CiAKICAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhlIGludGVyaW9yIG9mIHJlY3RhbmdsIHNwZWNpZmllZCBieSAKLSAgICAgKiBSZWN0YW5nbGUyRCBvYmplY3QgaW50ZXJzZWN0cyB0aGUgaW50ZXJpb3Igb2YgdGhlIFNoYXBlLgorICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgaW50ZXJpb3Igb2YgcmVjdGFuZ2xlIHNwZWNpZmllZCBieSBSZWN0YW5nbGUyRAorICAgICAqIG9iamVjdCBpbnRlcnNlY3RzIHRoZSBpbnRlcmlvciBvZiB0aGUgU2hhcGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHIgdGhlIFJlY3RhbmdsZTJEIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBSZWN0YW5nbGUyRCBpbnRlcnNlY3RzIHRoZSBpbnRlcmlvciBvZgotICAgICAqIHRoZSBTaGFwZSwgb3RoZXJ3aXNlIGZhbHNlLgorICAgICAqIEBwYXJhbSByCisgICAgICogICAgICAgICAgICB0aGUgUmVjdGFuZ2xlMkQgb2JqZWN0LgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIFJlY3RhbmdsZTJEIGludGVyc2VjdHMgdGhlIGludGVyaW9yIG9mIHRoZSBTaGFwZSwKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZSBmYWxzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpbnRlcnNlY3RzKFJlY3RhbmdsZTJEIHIpOwogfQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L1N0cm9rZS5qYXZhIGIvYXd0L2phdmEvYXd0L1N0cm9rZS5qYXZhCmluZGV4IGU2ZDY4M2QuLjZkMTdhMjMgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9TdHJva2UuamF2YQorKysgYi9hd3QvamF2YS9hd3QvU3Ryb2tlLmphdmEKQEAgLTE4LDI5ICsxOCwzMiBAQAogICogQGF1dGhvciBBbGV4ZXkgQS4gUGV0cmVua28KICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0OwogCiAvKioKLSAqIFRoZSBTdHJva2UgaW50ZXJmYWNlIGdpdmVzIGEgcGVuIHN0eWxlIHRvIGJlIHVzZWQgYnkgdGhlIAotICogR3JhcGhpY3MyRCBpbnRlcmZhY2UuIEl0IHByb3ZpZGVzIGEgbWVhbnMgZm9yIGdldHRpbmcgYSBzdHJva2VkIHZlcnNpb24gCi0gKiBvZiBhIHNoYXBlLCB3aGljaCBpcyB0aGUgdmVyc2lvbiB0aGF0IGlzIHN1aXRhYmxlIGZvciBkcmF3aW5nIHZpYSAKLSAqIHRoZSBHcmFwaGljczJEIGludGVyZmFjZS4gU3Ryb2tpbmcgYSBzaGFwZSBnaXZlcyB0aGUgc2hhcGUncyBvdXRsaW5lCi0gKiBhIHdpZHRoIG9yIGRyYXdpbmcgc3R5bGUuIAorICogVGhlIFN0cm9rZSBpbnRlcmZhY2UgZ2l2ZXMgYSBwZW4gc3R5bGUgdG8gYmUgdXNlZCBieSB0aGUgR3JhcGhpY3MyRAorICogaW50ZXJmYWNlLiBJdCBwcm92aWRlcyBhIG1lYW5zIGZvciBnZXR0aW5nIGEgc3Ryb2tlZCB2ZXJzaW9uIG9mIGEgc2hhcGUsCisgKiB3aGljaCBpcyB0aGUgdmVyc2lvbiB0aGF0IGlzIHN1aXRhYmxlIGZvciBkcmF3aW5nIHZpYSB0aGUgR3JhcGhpY3MyRAorICogaW50ZXJmYWNlLiBTdHJva2luZyBhIHNoYXBlIGdpdmVzIHRoZSBzaGFwZSdzIG91dGxpbmUgYSB3aWR0aCBvciBkcmF3aW5nCisgKiBzdHlsZS4KICAqIDxwPgotICogVGhlIERyYXcgbWV0aG9kcyBmcm9tIEdyYXBoaWNzMkQgaW50ZXJmYWNlIHNob3VsZCB1c2UgdGhlIFN0cm9rZSBvYmplY3QgZm9yIAotICogcmVuZGVyaW5nIHRoZSBzaGFwZSdzIG91dGxpbmUuIFRoZSBzdHJva2Ugc2hvdWxkIGJlIHNldCBieSAKLSAqIHNldFN0cm9rZShqYXZhLmF3dC5TdHJva2UpIG1ldGhvZCBvZiB0aGUgR3JhcGhpY3MyRCBpbnRlcmZhY2UuIAorICogVGhlIERyYXcgbWV0aG9kcyBmcm9tIEdyYXBoaWNzMkQgaW50ZXJmYWNlIHNob3VsZCB1c2UgdGhlIFN0cm9rZSBvYmplY3QgZm9yCisgKiByZW5kZXJpbmcgdGhlIHNoYXBlJ3Mgb3V0bGluZS4gVGhlIHN0cm9rZSBzaG91bGQgYmUgc2V0IGJ5CisgKiBzZXRTdHJva2UoamF2YS5hd3QuU3Ryb2tlKSBtZXRob2Qgb2YgdGhlIEdyYXBoaWNzMkQgaW50ZXJmYWNlLgorICogCiAgKiBAc2VlIGphdmEuYXd0LkdyYXBoaWNzMkQjc2V0U3Ryb2tlKGphdmEuYXd0LlN0cm9rZSkKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIFN0cm9rZSB7Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBzdHJva2VkIHNoYXBlLCB3aGljaCBpcyB0aGUgdmVyc2lvbiB0aGF0IGlzIHN1aXRhYmxlIGZvciBkcmF3aW5nIHZpYSAKLSAgICAgKiB0aGUgR3JhcGhpY3MyRCBpbnRlcmZhY2UuIFN0cm9raW5nIGEgc2hhcGUgZ2l2ZXMgdGhlIHNoYXBlJ3Mgb3V0bGluZQotICAgICAqIGEgd2lkdGggb3IgZHJhd2luZyBzdHlsZS4KKyAgICAgKiBDcmVhdGVzIHRoZSBzdHJva2VkIHNoYXBlLCB3aGljaCBpcyB0aGUgdmVyc2lvbiB0aGF0IGlzIHN1aXRhYmxlIGZvcgorICAgICAqIGRyYXdpbmcgdmlhIHRoZSBHcmFwaGljczJEIGludGVyZmFjZS4gU3Ryb2tpbmcgYSBzaGFwZSBnaXZlcyB0aGUgc2hhcGUncworICAgICAqIG91dGxpbmUgYSB3aWR0aCBvciBkcmF3aW5nIHN0eWxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwIHRoZSBvcmlnaW5hbCBzaGFwZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gcAorICAgICAqICAgICAgICAgICAgdGhlIG9yaWdpbmFsIHNoYXBlLgogICAgICAqIEByZXR1cm4gdGhlIHN0cm9rZWQgc2hhcGUuCiAgICAgICovCiAgICAgcHVibGljIFNoYXBlIGNyZWF0ZVN0cm9rZWRTaGFwZShTaGFwZSBwKTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9Ub29sa2l0LmphdmEgYi9hd3QvamF2YS9hd3QvVG9vbGtpdC5qYXZhCmluZGV4IDBjMDY2YjIuLmUzOGQ1MjQgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9Ub29sa2l0LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L1Rvb2xraXQuamF2YQpAQCAtNTYsMzQgKzU2LDUwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC53dGsuU2h1dGRvd25XYXRjaGRvZzsKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0Lnd0ay5TeW5jaHJvbml6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC53dGsuV1RLOworaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTm90SW1wbGVtZW50ZWRFeGNlcHRpb247CiAKIC8qKgotICogVGhlIFRvb2xraXQgY2xhc3MgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyAKLSAqIEFic3RyYWN0IFdpbmRvdyBUb29sa2l0IGltcGxlbWVudGF0aW9uLiBUb29sa2l0J3Mgc3ViY2xhc3NlcyAKLSAqIGFyZSB1c2VkIHRvIGJpbmQgdGhlIHZhcmlvdXMgY29tcG9uZW50cyB0byBwYXJ0aWN1bGFyIG5hdGl2ZSAKLSAqIHRvb2xraXQgaW1wbGVtZW50YXRpb25zLgorICogVGhlIFRvb2xraXQgY2xhc3MgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBBYnN0cmFjdAorICogV2luZG93IFRvb2xraXQgaW1wbGVtZW50YXRpb24uIFRvb2xraXQncyBzdWJjbGFzc2VzIGFyZSB1c2VkIHRvIGJpbmQgdGhlCisgKiB2YXJpb3VzIGNvbXBvbmVudHMgdG8gcGFydGljdWxhciBuYXRpdmUgdG9vbGtpdCBpbXBsZW1lbnRhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVG9vbGtpdCB7Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBSRUNPVVJDRV9QQVRILiAqLworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFJFQ09VUkNFX1BBVEguCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQ09VUkNFX1BBVEggPSAib3JnLmFwYWNoZS5oYXJtb255LmF3dC5yZXNvdXJjZXMuQVdUUHJvcGVydGllcyI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IHByb3BlcnRpZXMuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgcHJvcGVydGllcy4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBwcm9wZXJ0aWVzID0gbG9hZFJlc291cmNlcyhSRUNPVVJDRV9QQVRIKTsKLSAgICAKLSAgICAvKiogVGhlIGRpc3BhdGNoZXIuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGlzcGF0Y2hlci4KKyAgICAgKi8KICAgICBEaXNwYXRjaGVyIGRpc3BhdGNoZXI7CiAKLSAgICAvKiogVGhlIHN5c3RlbSBldmVudCBxdWV1ZSBjb3JlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBzeXN0ZW0gZXZlbnQgcXVldWUgY29yZS4KKyAgICAgKi8KICAgICBwcml2YXRlIEV2ZW50UXVldWVDb3JlIHN5c3RlbUV2ZW50UXVldWVDb3JlOwogCi0gICAgLyoqIFRoZSBkaXNwYXRjaCB0aHJlYWQuICovCisgICAgLyoqCisgICAgICogVGhlIGRpc3BhdGNoIHRocmVhZC4KKyAgICAgKi8KICAgICBFdmVudERpc3BhdGNoVGhyZWFkIGRpc3BhdGNoVGhyZWFkOwogCi0gICAgLyoqIFRoZSBuYXRpdmUgdGhyZWFkLiAqLworICAgIC8qKgorICAgICAqIFRoZSBuYXRpdmUgdGhyZWFkLgorICAgICAqLwogICAgIE5hdGl2ZUV2ZW50VGhyZWFkIG5hdGl2ZVRocmVhZDsKIAotICAgIC8qKiBUaGUgYXd0IGV2ZW50cyBtYW5hZ2VyLiAqLworICAgIC8qKgorICAgICAqIFRoZSBBV1QgZXZlbnRzIG1hbmFnZXIuCisgICAgICovCiAgICAgcHJvdGVjdGVkIEFXVEV2ZW50c01hbmFnZXIgYXd0RXZlbnRzTWFuYWdlcjsKIAogICAgIC8qKgpAQCAtOTIsNDcgKzEwOCw2OCBAQAogICAgIHByaXZhdGUgY2xhc3MgQVdUVHJlZUxvY2sgewogICAgIH0KIAotICAgIC8qKiBUaGUgYXd0IHRyZWUgbG9jay4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQVdUIHRyZWUgbG9jay4KKyAgICAgKi8KICAgICBmaW5hbCBPYmplY3QgYXd0VHJlZUxvY2sgPSBuZXcgQVdUVHJlZUxvY2soKTsKIAotICAgIC8qKiBUaGUgc3luY2hyb25pemVyLiAqLworICAgIC8qKgorICAgICAqIFRoZSBzeW5jaHJvbml6ZXIuCisgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyID0gQ29udGV4dFN0b3JhZ2UuZ2V0U3luY2hyb25pemVyKCk7CiAKLSAgICAvKiogVGhlIHNodXRkb3duIHdhdGNoZG9nLiAqLworICAgIC8qKgorICAgICAqIFRoZSBzaHV0ZG93biB3YXRjaGRvZy4KKyAgICAgKi8KICAgICBmaW5hbCBTaHV0ZG93bldhdGNoZG9nIHNodXRkb3duV2F0Y2hkb2cgPSBuZXcgU2h1dGRvd25XYXRjaGRvZygpOwogCi0gICAgLyoqIFRoZSBhdXRvIG51bWJlci4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgYXV0byBudW1iZXIuCisgICAgICovCiAgICAgZmluYWwgQXV0b051bWJlciBhdXRvTnVtYmVyID0gbmV3IEF1dG9OdW1iZXIoKTsKIAotICAgIC8qKiBUaGUgZXZlbnQgdHlwZSBsb29rdXAuICovCisgICAgLyoqCisgICAgICogVGhlIGV2ZW50IHR5cGUgbG9va3VwLgorICAgICAqLwogICAgIGZpbmFsIEFXVEV2ZW50LkV2ZW50VHlwZUxvb2t1cCBldmVudFR5cGVMb29rdXAgPSBuZXcgQVdURXZlbnQuRXZlbnRUeXBlTG9va3VwKCk7CiAKLSAgICAvKiogVGhlIGIgZHluYW1pYyBsYXlvdXQgc2V0LiAqLyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgYiBkeW5hbWljIGxheW91dCBzZXQuCisgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIGJEeW5hbWljTGF5b3V0U2V0ID0gdHJ1ZTsKIAotICAgIC8qKiBUaGUgc2V0IG9mIGRlc2t0b3AgcHJvcGVydGllcyB0aGF0IHVzZXIgc2V0IGRpcmVjdGx5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgZGVza3RvcCBwcm9wZXJ0aWVzIHRoYXQgdXNlciBzZXQgZGlyZWN0bHkuCisgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBIYXNoU2V0PFN0cmluZz4gdXNlclByb3BTZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CiAKLSAgICAvKiogVGhlIGRlc2t0b3AgcHJvcGVydGllcy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgZGVza3RvcCBwcm9wZXJ0aWVzLgorICAgICAqLwogICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IGRlc2t0b3BQcm9wZXJ0aWVzOwogCi0gICAgLyoqIFRoZSBkZXNrdG9wIHByb3BzIHN1cHBvcnQuICovCisgICAgLyoqCisgICAgICogVGhlIGRlc2t0b3AgcHJvcHMgc3VwcG9ydC4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VTdXBwb3J0IGRlc2t0b3BQcm9wc1N1cHBvcnQ7CiAKICAgICAvKioKLSAgICAgKiBGb3IgdGhpcyBjb21wb25lbnQgdGhlIG5hdGl2ZSB3aW5kb3cgaXMgYmVpbmcgY3JlYXRlZAotICAgICAqIEl0IGlzIHVzZWQgaW4gdGhlIGNhbGxiYWNrLWRyaXZlbiB3aW5kb3cgY3JlYXRpb24KLSAgICAgKiAoZS5nLiBvbiBXaW5kb3dzIGluIHRoZSBoYW5kbGVyIG9mIFdNX0NSRUFURSBldmVudCkKLSAgICAgKiB0byBlc3RhYmxpc2ggdGhlIGNvbm5lY3Rpb24gYmV0d2VlbiB0aGlzIGNvbXBvbmVudAotICAgICAqIGFuZCBpdHMgbmF0aXZlIHdpbmRvdy4KKyAgICAgKiBGb3IgdGhpcyBjb21wb25lbnQgdGhlIG5hdGl2ZSB3aW5kb3cgaXMgYmVpbmcgY3JlYXRlZCBJdCBpcyB1c2VkIGluIHRoZQorICAgICAqIGNhbGxiYWNrLWRyaXZlbiB3aW5kb3cgY3JlYXRpb24gKGUuZy4gb24gV2luZG93cyBpbiB0aGUgaGFuZGxlciBvZgorICAgICAqIFdNX0NSRUFURSBldmVudCkgdG8gZXN0YWJsaXNoIHRoZSBjb25uZWN0aW9uIGJldHdlZW4gdGhpcyBjb21wb25lbnQgYW5kCisgICAgICogaXRzIG5hdGl2ZSB3aW5kb3cuCiAgICAgICovCiAgICAgcHJpdmF0ZSBPYmplY3QgcmVjZW50TmF0aXZlV2luZG93Q29tcG9uZW50OwogCi0gICAgLyoqIFRoZSB3dGsuICovCisgICAgLyoqCisgICAgICogVGhlIHd0ay4KKyAgICAgKi8KICAgICBwcml2YXRlIFdUSyB3dGs7CiAKICAgICAvKioKICAgICAgKiBUaGUgQ2xhc3MgQ29tcG9uZW50SW50ZXJuYWxzSW1wbC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgZmluYWwgY2xhc3MgQ29tcG9uZW50SW50ZXJuYWxzSW1wbCBleHRlbmRzIENvbXBvbmVudEludGVybmFscyB7CiAKQEAgLTE0MywxMyArMTgwLDE1IEBACiAgICAgICAgIHB1YmxpYyB2b2lkIHNodXRkb3duKCkgewogICAgICAgICAgICAgZGlzcGF0Y2hUaHJlYWQuc2h1dGRvd24oKTsKICAgICAgICAgfQotICAgICAgIAorCiAgICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBkZXNrdG9wIHByb3BlcnR5IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgYW5kIGZpcmVzIGEgcHJvcGVydHkgCi0gICAgICAgICAqIGNoYW5nZSBldmVudC4gIAorICAgICAgICAgKiBTZXRzIHRoZSBkZXNrdG9wIHByb3BlcnR5IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgYW5kIGZpcmVzIGEgcHJvcGVydHkKKyAgICAgICAgICogY2hhbmdlIGV2ZW50LgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgcHJvcGVydHkuCi0gICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHByb3BlcnR5LgorICAgICAgICAgKiBAcGFyYW0gbmFtZQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHByb3BlcnR5LgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHByb3BlcnR5LgogICAgICAgICAgKi8KICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldERlc2t0b3BQcm9wZXJ0eShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7CkBAIC0xNTcsMTIgKzE5NiwxMiBAQAogICAgICAgICB9CiAgICAgfQogCi0KICAgICAvKioKLSAgICAgKiBBIGxvdCBvZiBtZXRob2RzIG11c3QgdGhyb3cgSGVhZGxlc3NFeGNlcHRpb24KLSAgICAgKiBpZiA8Y29kZT5HcmFwaGljc0Vudmlyb25tZW50LmlzSGVhZGxlc3MoKTwvY29kZT4gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPi4KKyAgICAgKiBBIGxvdCBvZiBtZXRob2RzIG11c3QgdGhyb3cgSGVhZGxlc3NFeGNlcHRpb24gaWYKKyAgICAgKiA8Y29kZT5HcmFwaGljc0Vudmlyb25tZW50LmlzSGVhZGxlc3MoKTwvY29kZT4gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPi4KICAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHRoZSBoZWFkbGVzcyBleGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgdGhlIGhlYWRsZXNzIGV4Y2VwdGlvbi4KICAgICAgKi8KICAgICBzdGF0aWMgdm9pZCBjaGVja0hlYWRsZXNzKCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKEdyYXBoaWNzRW52aXJvbm1lbnQuZ2V0TG9jYWxHcmFwaGljc0Vudmlyb25tZW50KCkuaXNIZWFkbGVzc0luc3RhbmNlKCkpCkBAIC0xNzAsNTEgKzIwOSw0OSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIExvY2sgYXd0LgorICAgICAqIExvY2sgQVdULgogICAgICAqLwogICAgIGZpbmFsIHZvaWQgbG9ja0FXVCgpIHsKICAgICAgICAgc3luY2hyb25pemVyLmxvY2soKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTdGF0aWMgbG9jayBhd3QuCisgICAgICogU3RhdGljIGxvY2sgQVdULgogICAgICAqLwogICAgIHN0YXRpYyBmaW5hbCB2b2lkIHN0YXRpY0xvY2tBV1QoKSB7CiAgICAgICAgIENvbnRleHRTdG9yYWdlLmdldFN5bmNocm9uaXplcigpLmxvY2soKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBVbmxvY2sgYXd0LgorICAgICAqIFVubG9jayBBV1QuCiAgICAgICovCiAgICAgZmluYWwgdm9pZCB1bmxvY2tBV1QoKSB7CiAgICAgICAgIHN5bmNocm9uaXplci51bmxvY2soKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTdGF0aWMgdW5sb2NrIGF3dC4KKyAgICAgKiBTdGF0aWMgdW5sb2NrIEFXVC4KICAgICAgKi8KICAgICBzdGF0aWMgZmluYWwgdm9pZCBzdGF0aWNVbmxvY2tBV1QoKSB7CiAgICAgICAgIENvbnRleHRTdG9yYWdlLmdldFN5bmNocm9uaXplcigpLnVubG9jaygpOwotICAgIH0gICAgCisgICAgfQogCiAgICAgLyoqCi0gICAgICogSW52b2tlQW5kV2FpdCB1bmRlciBBV1QgbG9jay4gVy9vIHRoaXMgbWV0aG9kIHN5c3RlbSBjYW4gaGFuZyB1cC4KLSAgICAgKiBBZGRlZCB0byBzdXBwb3J0IG1vZGFsaXR5IChEaWFsb2cuc2hvdygpICYgUG9wdXBNZW51LnNob3coKSkgZnJvbQotICAgICAqIG5vdCBldmVudCBkaXNwYXRjaCB0aHJlYWQuIFVzZSBpbiBvdGhlciBjYXNlcyBpcyBub3QgcmVjb21tZW5kZWQuCi0gICAgICoKLSAgICAgKiBTdGlsbCBjYW4gYmUgY2FsbGVkIG9ubHkgZm9yIHdob2xlIEFQSSBtZXRob2RzIHRoYXQKLSAgICAgKiBjYW5ub3QgYmUgY2FsbGVkIGZyb20gb3RoZXIgY2xhc3NlcyBBUEkgbWV0aG9kcy4KLSAgICAgKiBFeGFtcGxlczoKLSAgICAgKiAgICAgIHNob3coKSBmb3IgbW9kYWwgZGlhbG9ncyAgICAtIGNvcnJlY3QsIG9ubHkgdXNlciBjYW4gY2FsbCBpdCwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0bHkgb3IgdGhyb3VnaCBzZXRWaXNpYmxlKHRydWUpCi0gICAgICogICAgICBzZXRCb3VuZHMoKSBmb3IgY29tcG9uZW50cyAgLSBpbmNvcnJlY3QsIHNldEJvdW5kcygpCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSBjYWxsZWQgZnJvbSBsYXlvdXRDb250YWluZXIoKQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbGF5b3V0IG1hbmFnZXJzCisgICAgICogSW52b2tlQW5kV2FpdCB1bmRlciBBV1QgbG9jay4gVy9vIHRoaXMgbWV0aG9kIHN5c3RlbSBjYW4gaGFuZyB1cC4gQWRkZWQKKyAgICAgKiB0byBzdXBwb3J0IG1vZGFsaXR5IChEaWFsb2cuc2hvdygpICYgUG9wdXBNZW51LnNob3coKSkgZnJvbSBub3QgZXZlbnQKKyAgICAgKiBkaXNwYXRjaCB0aHJlYWQuIFVzZSBpbiBvdGhlciBjYXNlcyBpcyBub3QgcmVjb21tZW5kZWQuIFN0aWxsIGNhbiBiZQorICAgICAqIGNhbGxlZCBvbmx5IGZvciB3aG9sZSBBUEkgbWV0aG9kcyB0aGF0IGNhbm5vdCBiZSBjYWxsZWQgZnJvbSBvdGhlcgorICAgICAqIGNsYXNzZXMgQVBJIG1ldGhvZHMuIEV4YW1wbGVzOiBzaG93KCkgZm9yIG1vZGFsIGRpYWxvZ3MgLSBjb3JyZWN0LCBvbmx5CisgICAgICogdXNlciBjYW4gY2FsbCBpdCwgZGlyZWN0bHkgb3IgdGhyb3VnaCBzZXRWaXNpYmxlKHRydWUpIHNldEJvdW5kcygpIGZvcgorICAgICAqIGNvbXBvbmVudHMgLSBpbmNvcnJlY3QsIHNldEJvdW5kcygpIGNhbiBiZSBjYWxsZWQgZnJvbSBsYXlvdXRDb250YWluZXIoKQorICAgICAqIGZvciBsYXlvdXQgbWFuYWdlcnMKICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcnVubmFibGUgdGhlIHJ1bm5hYmxlCi0gICAgICogCi0gICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB0aGUgaW50ZXJydXB0ZWQgZXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHRoZSBpbnZvY2F0aW9uIHRhcmdldCBleGNlcHRpb24KKyAgICAgKiBAcGFyYW0gcnVubmFibGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBydW5uYWJsZS4KKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgdGhlIGludGVycnVwdGVkIGV4Y2VwdGlvbi4KKyAgICAgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICB0aGUgaW52b2NhdGlvbiB0YXJnZXQgZXhjZXB0aW9uLgogICAgICAqLwogICAgIGZpbmFsIHZvaWQgdW5zYWZlSW52b2tlQW5kV2FpdChSdW5uYWJsZSBydW5uYWJsZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLAogICAgICAgICAgICAgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7CkBAIC0yMjksNyArMjY2LDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBzeW5jaHJvbml6ZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgc3luY2hyb25pemVyCisgICAgICogQHJldHVybiB0aGUgc3luY2hyb25pemVyLgogICAgICAqLwogICAgIGZpbmFsIFN5bmNocm9uaXplciBnZXRTeW5jaHJvbml6ZXIoKSB7CiAgICAgICAgIHJldHVybiBzeW5jaHJvbml6ZXI7CkBAIC0yMzgsMTkgKzI3NSwyMCBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHdUSy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB3VEsKKyAgICAgKiBAcmV0dXJuIHRoZSB3VEsuCiAgICAgICovCiAgICAgZmluYWwgV1RLIGdldFdUSygpIHsKICAgICAgICAgcmV0dXJuIHd0azsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGFuZCBkZWZhdWx0IHZhbHVlLiAKLSAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBkZWZWYWx1ZSBpZiB0aGUgcHJvcGVydHkgaXMgbm90IGZvdW5kLiAKKyAgICAgKiBHZXRzIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGFuZCBkZWZhdWx0IHZhbHVlLiBUaGlzIG1ldGhvZAorICAgICAqIHJldHVybnMgdGhlIGRlZlZhbHVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBub3QgZm91bmQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHByb3BOYW1lIHRoZSBuYW1lIG9mIHByb3BlcnR5LgotICAgICAqIEBwYXJhbSBkZWZWYWwgdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICogCisgICAgICogQHBhcmFtIHByb3BOYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiBwcm9wZXJ0eS4KKyAgICAgKiBAcGFyYW0gZGVmVmFsCisgICAgICogICAgICAgICAgICB0aGUgZGVmYXVsdCB2YWx1ZS4KICAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBkZWZWYWwpIHsKQEAgLTI3MywxMSArMzExLDExIEBACiAgICAgICAgICAgICBzdGF0aWNVbmxvY2tBV1QoKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGRlZmF1bHQgVG9vbGtpdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IFRvb2xraXQKKyAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IFRvb2xraXQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBUb29sa2l0IGdldERlZmF1bHRUb29sa2l0KCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKENvbnRleHRTdG9yYWdlLmdldENvbnRleHRMb2NrKCkpIHsKQEAgLTI5MCwzNCArMzI4LDM0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzdGF0aWNMb2NrQVdUKCk7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGRlZlRvb2xraXQgPSBHcmFwaGljc0Vudmlyb25tZW50LmlzSGVhZGxlc3MoKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgSGVhZGxlc3NUb29sa2l0KCkgOiBuZXcgVG9vbGtpdEltcGwoKTsKKyAgICAgICAgICAgICAgICBkZWZUb29sa2l0ID0gR3JhcGhpY3NFbnZpcm9ubWVudC5pc0hlYWRsZXNzKCkgPyBuZXcgSGVhZGxlc3NUb29sa2l0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IFRvb2xraXRJbXBsKCk7CiAgICAgICAgICAgICAgICAgQ29udGV4dFN0b3JhZ2Uuc2V0RGVmYXVsdFRvb2xraXQoZGVmVG9vbGtpdCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZlRvb2xraXQ7CiAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgIHN0YXRpY1VubG9ja0FXVCgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9UT0RPOiByZWFkIHN5c3RlbSBwcm9wZXJ0eSBuYW1lZCBhd3QudG9vbGtpdAotICAgICAgICAgICAgLy9hbmQgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0gICAgICAgICAgICAvL2J5IGRlZmF1bHQgdXNlIFRvb2xraXRJbXBsCisgICAgICAgICAgICAvLyBUT0RPOiByZWFkIHN5c3RlbSBwcm9wZXJ0eSBuYW1lZCBhd3QudG9vbGtpdAorICAgICAgICAgICAgLy8gYW5kIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAorICAgICAgICAgICAgLy8gYnkgZGVmYXVsdCB1c2UgVG9vbGtpdEltcGwKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGRlZmF1bHQgRm9udC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkZXJhdWx0IEZvbnQgZm9yIFRvb2xraXQuCisgICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBGb250IGZvciBUb29sa2l0LgogICAgICAqLwogICAgIEZvbnQgZ2V0RGVmYXVsdEZvbnQoKSB7CiAgICAgICAgIHJldHVybiB3dGsuZ2V0U3lzdGVtUHJvcGVydGllcygpLmdldERlZmF1bHRGb250KCk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogTG9hZCByZXNvdXJjZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHBhdGggdGhlIHBhdGgKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSBidW5kbGUKKyAgICAgKiBAcGFyYW0gcGF0aAorICAgICAqICAgICAgICAgICAgdGhlIHBhdGguCisgICAgICogQHJldHVybiB0aGUgcmVzb3VyY2UgYnVuZGxlLgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGxvYWRSZXNvdXJjZXMoU3RyaW5nIHBhdGgpIHsKICAgICAgICAgdHJ5IHsKQEAgLTMzMCw3ICszNjgsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHdUSyBjbGFzcyBuYW1lLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHdUSyBjbGFzcyBuYW1lCisgICAgICogQHJldHVybiB0aGUgd1RLIGNsYXNzIG5hbWUuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFdUS0NsYXNzTmFtZSgpIHsKICAgICAgICAgcmV0dXJuICJjb20uYW5kcm9pZC5pbnRlcm5hbC5hd3QuQW5kcm9pZFdUSyI7CkBAIC0zMzksOSArMzc3LDkgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBjb21wb25lbnQgYnkgaWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGlkIHRoZSBpZAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvbXBvbmVudCBieSBpZAorICAgICAqIEBwYXJhbSBpZAorICAgICAqICAgICAgICAgICAgdGhlIGlkLgorICAgICAqIEByZXR1cm4gdGhlIGNvbXBvbmVudCBieSBpZC4KICAgICAgKi8KICAgICBDb21wb25lbnQgZ2V0Q29tcG9uZW50QnlJZChsb25nIGlkKSB7CiAgICAgICAgIGlmIChpZCA9PSAwKSB7CkBAIC0zNjIsMTIgKzQwMCwxMiBAQAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyB0b29sa2l0LgogICAgICAqLwotICAgIHB1YmxpYyBUb29sa2l0KCkgeyAgICAgICAgCisgICAgcHVibGljIFRvb2xraXQoKSB7CiAgICAgICAgIGluaXQoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbml0cyBBV1QuCisgICAgICogSW5pdGlhdGVzIEFXVC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewogICAgICAgICBsb2NrQVdUKCk7CkBAIC0zOTcsNDMgKzQzNSw1MiBAQAogICAgICAgICAgICAgdW5sb2NrQVdUKCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBTeW5jaHJvbml6ZXMgdGhpcyB0b29sa2l0J3MgZ3JhcGhpY3MuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc3luYygpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29uc3RydWN0aW9uIHN0YXR1cyBvZiBhIHNwZWNpZmllZCBpbWFnZSB0aGF0IGlzIGJlaW5nIGNyZWF0ZWQuCisgICAgICogUmV0dXJucyB0aGUgY29uc3RydWN0aW9uIHN0YXR1cyBvZiBhIHNwZWNpZmllZCBpbWFnZSB0aGF0IGlzIGJlaW5nCisgICAgICogY3JlYXRlZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYTAgdGhlIGltYWdlIHRvIGJlIGNoZWNrZWQuCi0gICAgICogQHBhcmFtIGExIHRoZSB3aWR0aCBvZiBzY2FsZWQgaW1hZ2UgZm9yIHdoaWNoIHRoZSBzdGF0dXMgaXMgYmVpbmcgY2hlY2tlZCwgb3IgLTEuCi0gICAgICogQHBhcmFtIGEyIHRoZSBoZWlnaHQgb2Ygc2NhbGVkIGltYWdlIGZvciB3aGljaCB0aGUgc3RhdHVzIGlzIGJlaW5nIGNoZWNrZWQsIG9yIC0xLgotICAgICAqIEBwYXJhbSBhMyB0aGUgSW1hZ2VPYnNlcnZlciBvYmplY3QgdG8gYmUgbm90aWZpZWQgd2hpbGUgCi0gICAgICogdGhlIGltYWdlIGlzIGJlaW5nIHByZXBhcmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIEltYWdlT2JzZXJ2ZXIgZmxhZ3Mgd2hpY2ggZ2l2ZSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gYTAKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSB0byBiZSBjaGVja2VkLgorICAgICAqIEBwYXJhbSBhMQorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHNjYWxlZCBpbWFnZSBmb3Igd2hpY2ggdGhlIHN0YXR1cyBpcyBiZWluZworICAgICAqICAgICAgICAgICAgY2hlY2tlZCBvciAtMS4KKyAgICAgKiBAcGFyYW0gYTIKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2Ygc2NhbGVkIGltYWdlIGZvciB3aGljaCB0aGUgc3RhdHVzIGlzIGJlaW5nCisgICAgICogICAgICAgICAgICBjaGVja2VkIG9yIC0xLgorICAgICAqIEBwYXJhbSBhMworICAgICAqICAgICAgICAgICAgdGhlIEltYWdlT2JzZXJ2ZXIgb2JqZWN0IHRvIGJlIG5vdGlmaWVkIHdoaWxlIHRoZSBpbWFnZSBpcworICAgICAqICAgICAgICAgICAgYmVpbmcgcHJlcGFyZWQuCisgICAgICogQHJldHVybiB0aGUgSW1hZ2VPYnNlcnZlciBmbGFncyB3aGljaCBnaXZlIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBpbWFnZQorICAgICAqICAgICAgICAgZGF0YS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGNoZWNrSW1hZ2UoSW1hZ2UgYTAsIGludCBhMSwgaW50IGEyLCBJbWFnZU9ic2VydmVyIGEzKTsKLSAgIAorCiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyB0aGUgaW1hZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIEltYWdlUHJvZHVjZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGEwIHRoZSBJbWFnZVByb2R1Y2VyIHRvIGJlIHVzZWQgZm9yIGltYWdlIGNyZWF0aW9uLgotICAgICAqIAorICAgICAqIEBwYXJhbSBhMAorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlUHJvZHVjZXIgdG8gYmUgdXNlZCBmb3IgaW1hZ2UgY3JlYXRpb24uCiAgICAgICogQHJldHVybiB0aGUgaW1hZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIEltYWdlUHJvZHVjZXIuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEltYWdlIGNyZWF0ZUltYWdlKEltYWdlUHJvZHVjZXIgYTApOwogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgaW1hZ2UgZnJvbSB0aGUgc3BlY2lmaWVkIGJ5dGUgYXJyYXksIG9mZnNldCBhbmQgbGVuZ3RoLgotICAgICAqIFRoZSBieXRlIGFycmF5IHNob3VsZCBjb250YWluIGRhdGEgd2l0aCBpbWFnZSBmb3JtYXQgc3VwcG9ydGVkIGJ5IAotICAgICAqIFRvb2xraXQgc3VjaCBhcyBKUEVHLCBHSUYsIG9yIFBORy4gIAorICAgICAqIENyZWF0ZXMgdGhlIGltYWdlIGZyb20gdGhlIHNwZWNpZmllZCBieXRlIGFycmF5LCBvZmZzZXQgYW5kIGxlbmd0aC4gVGhlCisgICAgICogYnl0ZSBhcnJheSBzaG91bGQgY29udGFpbiBkYXRhIHdpdGggaW1hZ2UgZm9ybWF0IHN1cHBvcnRlZCBieSBUb29sa2l0CisgICAgICogc3VjaCBhcyBKUEVHLCBHSUYsIG9yIFBORy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYTAgdGhlIGJ5dGUgYXJyYXkgd2l0aCB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gYTEgdGhlIG9mZnNldCBvZiB0aGUgYmVnZ2luaW5nIHRoZSBpbWFnZSBkYXRhIGluIHRoZSBieXRlIGFycmF5LgotICAgICAqIEBwYXJhbSBhMiB0aGUgbGVuZ3RoIG9mIHRoZSBpbWFnZSBkYXRhIGluIHRoZSBieXRlIGFycmF5LgotICAgICAqIAorICAgICAqIEBwYXJhbSBhMAorICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgYXJyYXkgd2l0aCB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gYTEKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGJlZ2lubmluZyB0aGUgaW1hZ2UgZGF0YSBpbiB0aGUgYnl0ZSBhcnJheS4KKyAgICAgKiBAcGFyYW0gYTIKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGltYWdlIGRhdGEgaW4gdGhlIGJ5dGUgYXJyYXkuCiAgICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBJbWFnZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgSW1hZ2UgY3JlYXRlSW1hZ2UoYnl0ZVtdIGEwLCBpbnQgYTEsIGludCBhMik7CkBAIC00NDEsOCArNDg4LDggQEAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIHRoZSBpbWFnZSB1c2luZyBpbWFnZSBkYXRhIGZyb20gdGhlIHNwZWNpZmllZCBVUkwuCiAgICAgICogCi0gICAgICogQHBhcmFtIGEwIHRoZSBVUkwgZm9yIGV4dHJhY3RpbmcgaW1hZ2UgZGF0YS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gYTAKKyAgICAgKiAgICAgICAgICAgIHRoZSBVUkwgZm9yIGV4dHJhY3RpbmcgaW1hZ2UgZGF0YS4KICAgICAgKiBAcmV0dXJuIHRoZSBJbWFnZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgSW1hZ2UgY3JlYXRlSW1hZ2UoVVJMIGEwKTsKQEAgLTQ1MCw4ICs0OTcsOCBAQAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgdGhlIGltYWdlIHVzaW5nIGltYWdlIGRhdGEgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGEwIHRoZSBmaWxlIG5hbWUgd2hpY2ggY29udGFpbnMgaW1hZ2UgZGF0YSBvZiBzdXBwb3J0ZWQgZm9ybWF0LgotICAgICAqIAorICAgICAqIEBwYXJhbSBhMAorICAgICAqICAgICAgICAgICAgdGhlIGZpbGUgbmFtZSB3aGljaCBjb250YWlucyBpbWFnZSBkYXRhIG9mIHN1cHBvcnRlZCBmb3JtYXQuCiAgICAgICogQHJldHVybiB0aGUgSW1hZ2UuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEltYWdlIGNyZWF0ZUltYWdlKFN0cmluZyBhMCk7CkBAIC00NjAsMjIgKzUwNywyMCBAQAogICAgICAqIEdldHMgdGhlIGNvbG9yIG1vZGVsLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIENvbG9yTW9kZWwgb2YgVG9vbGtpdCdzIHNjcmVlbi4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIGlmIHRoZSAKLSAgICAgKiBHcmFwaGljc0Vudmlyb25tZW50LmlzSGVhZGxlc3MoKSBtZXRob2QgcmV0dXJucyB0cnVlLgorICAgICAqIEB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgR3JhcGhpY3NFbnZpcm9ubWVudC5pc0hlYWRsZXNzKCkgbWV0aG9kIHJldHVybnMgdHJ1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgQ29sb3JNb2RlbCBnZXRDb2xvck1vZGVsKCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uOwotICAgIAorCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgc2NyZWVuIGRldmljZSBtZXRyaWNzIGZvciB0aGUgc3BlY2lmaWVkIGZvbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGZvbnQgdGhlIEZvbnQuCi0gICAgICogCisgICAgICogQHBhcmFtIGZvbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBGb250LgogICAgICAqIEByZXR1cm4gdGhlIEZvbnRNZXRyaWNzIGZvciB0aGUgc3BlY2lmaWVkIEZvbnQuCi0gICAgICogCiAgICAgICogQGRlcHJlY2F0ZWQgVXNlIGdldExpbmVNZXRyaWNzIG1ldGhvZCBmcm9tIEZvbnQgY2xhc3MuCiAgICAgICovCi0gICAgICAgIAorCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgYWJzdHJhY3QgRm9udE1ldHJpY3MgZ2V0Rm9udE1ldHJpY3MoRm9udCBmb250KTsKIApAQCAtNDgzLDEzICs1MjgsMTggQEAKICAgICAgKiBQcmVwYXJlcyB0aGUgc3BlY2lmaWVkIGltYWdlIGZvciByZW5kZXJpbmcgb24gdGhlIHNjcmVlbiB3aXRoIHRoZQogICAgICAqIHNwZWNpZmllZCBzaXplLgogICAgICAqIAotICAgICAqIEBwYXJhbSBhMCB0aGUgSW1hZ2UgdG8gYmUgcHJlcGFyZWQuCi0gICAgICogQHBhcmFtIGExIHRoZSB3aWR0aCBvZiB0aGUgc2NyZWVuIHJlcHJlc2VudGF0aW9uIG9yIC0xIGZvciB0aGUgY3VycmVudCBzY3JlZW4uCi0gICAgICogQHBhcmFtIGEyIHRoZSBoZWlnaHQgb2YgdGhlIHNjcmVlbiByZXByZXNlbnRhdGlvbiBvciAtMSBmb3IgdGhlIGN1cnJlbnQgc2NyZWVuLgotICAgICAqIEBwYXJhbSBhMyB0aGUgSW1hZ2VPYnNlcnZlciBvYmplY3QgdG8gYmUgbm90aWZpZWQgYXMgc29vbiBhcyAKLSAgICAgKiB0aGUgaW1hZ2UgaXMgcHJlcGFyZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiBpbWFnZSBpcyBmdWxseSBwcmVwYXJlZDsgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEBwYXJhbSBhMAorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlIHRvIGJlIHByZXBhcmVkLgorICAgICAqIEBwYXJhbSBhMQorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBzY3JlZW4gcmVwcmVzZW50YXRpb24gb3IgLTEgZm9yIHRoZSBjdXJyZW50CisgICAgICogICAgICAgICAgICBzY3JlZW4uCisgICAgICogQHBhcmFtIGEyCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBzY3JlZW4gcmVwcmVzZW50YXRpb24gb3IgLTEgZm9yIHRoZSBjdXJyZW50CisgICAgICogICAgICAgICAgICBzY3JlZW4uCisgICAgICogQHBhcmFtIGEzCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VPYnNlcnZlciBvYmplY3QgdG8gYmUgbm90aWZpZWQgYXMgc29vbiBhcyB0aGUgaW1hZ2UKKyAgICAgKiAgICAgICAgICAgIGlzIHByZXBhcmVkLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgaW1hZ2UgaXMgZnVsbHkgcHJlcGFyZWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBwcmVwYXJlSW1hZ2UoSW1hZ2UgYTAsIGludCBhMSwgaW50IGEyLCBJbWFnZU9ic2VydmVyIGEzKTsKIApAQCAtNTAyLDIxICs1NTIsMTkgQEAKICAgICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBmb250IG5hbWVzIHdoaWNoIGFyZSBhdmFpbGFibGUgaW4gdGhpcyBUb29sa2l0LgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGZvbnQgbmFtZXMgd2hpY2ggYXJlIGF2YWlsYWJsZSBpbiB0aGlzIFRvb2xraXQuCi0gICAgICogCiAgICAgICogQGRlcHJlY2F0ZWQgdXNlIEdyYXBoaWNzRW52aXJvbm1lbnQuZ2V0QXZhaWxhYmxlRm9udEZhbWlseU5hbWVzKCkgbWV0aG9kLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGFic3RyYWN0IFN0cmluZ1tdIGdldEZvbnRMaXN0KCk7Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0aGUgRm9udCBpbXBsZW1lbnRhdGlvbiB1c2luZyB0aGUgc3BlY2lmaWVkIHBlZXIgCi0gICAgICogaW50ZXJmYWNlLgorICAgICAqIEdldHMgdGhlIHRoZSBGb250IGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBzcGVjaWZpZWQgcGVlciBpbnRlcmZhY2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGEwIHRoZSBGb250IG5hbWUgdG8gYmUgaW1wbGVtZW50ZWQuCi0gICAgICogQHBhcmFtIGExIHRoZSB0aGUgZm9udCBzdHlsZTogUExBSU4sIEJPTEQsIElUQUxJQy4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gYTAKKyAgICAgKiAgICAgICAgICAgIHRoZSBGb250IG5hbWUgdG8gYmUgaW1wbGVtZW50ZWQuCisgICAgICogQHBhcmFtIGExCisgICAgICogICAgICAgICAgICB0aGUgdGhlIGZvbnQgc3R5bGU6IFBMQUlOLCBCT0xELCBJVEFMSUMuCiAgICAgICogQHJldHVybiB0aGUgRm9udFBlZXIgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBGb250LgotICAgICAqIAogICAgICAqIEBkZXByZWNhdGVkIHVzZSBqYXZhLmF3dC5HcmFwaGljc0Vudmlyb25tZW50LmdldEFsbEZvbnRzIG1ldGhvZC4KICAgICAgKi8KIApAQCAtNTI0LDI3ICs1NzIsMjcgQEAKICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgRm9udFBlZXIgZ2V0Rm9udFBlZXIoU3RyaW5nIGEwLCBpbnQgYTEpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgaW1hZ2UgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUgd2hpY2ggY29udGFpbnMgaW1hZ2UgZGF0YSBpbgotICAgICAqIGEgc3VwcG9ydGVkIGltYWdlIGZvcm1hdCAoc3VjaCBhcyBKUEVHLCBHSUYsIG9yIFBORyk7IHRoaXMgbWV0aG9kIAotICAgICAqIHNob3VsZCByZXR1cm4gdGhlIHNhbWUgSW1hZ2UgZm9yIG11bHRpcGxlIGNhbGxzIG9mIHRoaXMgbWV0aG9kIHdpdGggCi0gICAgICogdGhlIHNhbWUgaW1hZ2UgZmlsZSBuYW1lLgorICAgICAqIEdldHMgdGhlIGltYWdlIGZyb20gdGhlIHNwZWNpZmllZCBmaWxlIHdoaWNoIGNvbnRhaW5zIGltYWdlIGRhdGEgaW4gYQorICAgICAqIHN1cHBvcnRlZCBpbWFnZSBmb3JtYXQgKHN1Y2ggYXMgSlBFRywgR0lGLCBvciBQTkcpOyB0aGlzIG1ldGhvZCBzaG91bGQKKyAgICAgKiByZXR1cm4gdGhlIHNhbWUgSW1hZ2UgZm9yIG11bHRpcGxlIGNhbGxzIG9mIHRoaXMgbWV0aG9kIHdpdGggdGhlIHNhbWUKKyAgICAgKiBpbWFnZSBmaWxlIG5hbWUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGEwIHRoZSBmaWxlIG5hbWUgd2hpY2ggY29udGFpbnMgaW1hZ2UgZGF0YSBpbgotICAgICAqIGEgc3VwcG9ydGVkIGltYWdlIGZvcm1hdCAoc3VjaCBhcyBKUEVHLCBHSUYsIG9yIFBORykuCi0gICAgICogCisgICAgICogQHBhcmFtIGEwCisgICAgICogICAgICAgICAgICB0aGUgZmlsZSBuYW1lIHdoaWNoIGNvbnRhaW5zIGltYWdlIGRhdGEgaW4gYSBzdXBwb3J0ZWQgaW1hZ2UKKyAgICAgKiAgICAgICAgICAgIGZvcm1hdCAoc3VjaCBhcyBKUEVHLCBHSUYsIG9yIFBORykuCiAgICAgICogQHJldHVybiB0aGUgSW1hZ2UuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEltYWdlIGdldEltYWdlKFN0cmluZyBhMCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBpbWFnZSBmcm9tIHRoZSBzcGVjaWZpZWQgVVJMIHdoaWNoIGNvbnRhaW5zIGltYWdlIGRhdGEgaW4KLSAgICAgKiBhIHN1cHBvcnRlZCBpbWFnZSBmb3JtYXQgKHN1Y2ggYXMgSlBFRywgR0lGLCBvciBQTkcpOyB0aGlzIG1ldGhvZCAKLSAgICAgKiBzaG91bGQgcmV0dXJuIHRoZSBzYW1lIEltYWdlIGZvciBtdWx0aXBsZSBjYWxscyBvZiB0aGlzIG1ldGhvZCB3aXRoIAotICAgICAqIHRoZSBzYW1lIGltYWdlIFVSTC4KKyAgICAgKiBHZXRzIHRoZSBpbWFnZSBmcm9tIHRoZSBzcGVjaWZpZWQgVVJMIHdoaWNoIGNvbnRhaW5zIGltYWdlIGRhdGEgaW4gYQorICAgICAqIHN1cHBvcnRlZCBpbWFnZSBmb3JtYXQgKHN1Y2ggYXMgSlBFRywgR0lGLCBvciBQTkcpOyB0aGlzIG1ldGhvZCBzaG91bGQKKyAgICAgKiByZXR1cm4gdGhlIHNhbWUgSW1hZ2UgZm9yIG11bHRpcGxlIGNhbGxzIG9mIHRoaXMgbWV0aG9kIHdpdGggdGhlIHNhbWUKKyAgICAgKiBpbWFnZSBVUkwuCiAgICAgICogCi0gICAgICogQHBhcmFtIGEwIHRoZSBVUkwgd2hpY2ggY29udGFpbnMgaW1hZ2UgZGF0YSBpbgotICAgICAqIGEgc3VwcG9ydGVkIGltYWdlIGZvcm1hdCAoc3VjaCBhcyBKUEVHLCBHSUYsIG9yIFBORykuCi0gICAgICogCisgICAgICogQHBhcmFtIGEwCisgICAgICogICAgICAgICAgICB0aGUgVVJMIHdoaWNoIGNvbnRhaW5zIGltYWdlIGRhdGEgaW4gYSBzdXBwb3J0ZWQgaW1hZ2UgZm9ybWF0CisgICAgICogICAgICAgICAgICAoc3VjaCBhcyBKUEVHLCBHSUYsIG9yIFBORykuCiAgICAgICogQHJldHVybiB0aGUgSW1hZ2UuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEltYWdlIGdldEltYWdlKFVSTCBhMCk7CkBAIC01NTMsMjAgKzYwMSwxNyBAQAogICAgICAqIEdldHMgdGhlIHNjcmVlbiByZXNvbHV0aW9uLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIHNjcmVlbiByZXNvbHV0aW9uLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24gaWYgdGhlIEdyYXBoaWNzRW52aXJvbm1lbnQuaXNIZWFkbGVzcygpCi0gICAgICogbWV0aG9kIHJldHVybnMgdHJ1ZS4KKyAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIEdyYXBoaWNzRW52aXJvbm1lbnQuaXNIZWFkbGVzcygpIG1ldGhvZCByZXR1cm5zIHRydWUuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRTY3JlZW5SZXNvbHV0aW9uKCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgc2NyZWVuIHNpemUuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIERpbWVuc2lvbiBvYmplY3QgY29udGFpbmluZyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZgotICAgICAqIHRoZSBzY3JlZW4uCi0gICAgICogCi0gICAgICogQHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiBpZiB0aGUgR3JhcGhpY3NFbnZpcm9ubWVudC5pc0hlYWRsZXNzKCkKLSAgICAgKiBtZXRob2QgcmV0dXJucyB0cnVlLgorICAgICAqIEByZXR1cm4gYSBEaW1lbnNpb24gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHNjcmVlbi4KKyAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIEdyYXBoaWNzRW52aXJvbm1lbnQuaXNIZWFkbGVzcygpIG1ldGhvZCByZXR1cm5zIHRydWUuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IERpbWVuc2lvbiBnZXRTY3JlZW5TaXplKCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uOwogCkBAIC01NzgsMTUgKzYyMywxNCBAQAogICAgIHByb3RlY3RlZCBhYnN0cmFjdCBFdmVudFF1ZXVlIGdldFN5c3RlbUV2ZW50UXVldWVJbXBsKCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbWFwIG9mIHRleHQgYXR0cmlidXRlcyBmb3IgdGhlIGFic3RyYWN0IGxldmVsIGRlc2NyaXB0aW9uIAotICAgICAqIG9mIHRoZSBzcGVjaWZpZWQgaW5wdXQgbWV0aG9kIGhpZ2hsaWdodCwgb3IgbnVsbCBpZiBubyBtYXBwaW5nIGlzIGZvdW5kLiAKLSAgICAgKiAgCi0gICAgICogQHBhcmFtIGhpZ2hsaWdodCB0aGUgSW5wdXRNZXRob2RIaWdobGlnaHQuCisgICAgICogUmV0dXJucyBhIG1hcCBvZiB0ZXh0IGF0dHJpYnV0ZXMgZm9yIHRoZSBhYnN0cmFjdCBsZXZlbCBkZXNjcmlwdGlvbiBvZgorICAgICAqIHRoZSBzcGVjaWZpZWQgaW5wdXQgbWV0aG9kIGhpZ2hsaWdodCwgb3IgbnVsbCBpZiBubyBtYXBwaW5nIGlzIGZvdW5kLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIE1hcDxqYXZhLmF3dC5mb250LiB0ZXh0IGF0dHJpYnV0ZSw/PgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24gaWYgdGhlIEdyYXBoaWNzRW52aXJvbm1lbnQuaXNIZWFkbGVzcygpCi0gICAgICogbWV0aG9kIHJldHVybnMgdHJ1ZS4KKyAgICAgKiBAcGFyYW0gaGlnaGxpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgSW5wdXRNZXRob2RIaWdobGlnaHQuCisgICAgICogQHJldHVybiB0aGUgTWFwPGphdmEuYXd0LmZvbnQuIHRleHQgYXR0cmlidXRlLD8+LgorICAgICAqIEB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgR3JhcGhpY3NFbnZpcm9ubWVudC5pc0hlYWRsZXNzKCkgbWV0aG9kIHJldHVybnMgdHJ1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgTWFwPGphdmEuYXd0LmZvbnQuVGV4dEF0dHJpYnV0ZSwgPz4gbWFwSW5wdXRNZXRob2RIaWdobGlnaHQoCiAgICAgICAgICAgICBJbnB1dE1ldGhvZEhpZ2hsaWdodCBoaWdobGlnaHQpIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbjsKQEAgLTU5NCwxNCArNjM4LDE0IEBACiAgICAgLyoqCiAgICAgICogTWFwIGlucHV0IG1ldGhvZCBoaWdobGlnaHQgaW1wbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaGlnaGxpZ2h0IHRoZSBoaWdobGlnaHQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtYXA8amF2YS5hd3QuZm9udC4gdGV4dCBhdHRyaWJ1dGUsPz4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHRoZSBoZWFkbGVzcyBleGNlcHRpb24KKyAgICAgKiBAcGFyYW0gaGlnaGxpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGlnaGxpZ2h0LgorICAgICAqIEByZXR1cm4gdGhlIG1hcDxqYXZhLmF3dC5mb250LiB0ZXh0IGF0dHJpYnV0ZSw/Pi4KKyAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgdGhlIGhlYWRsZXNzIGV4Y2VwdGlvbi4KICAgICAgKi8KLSAgICBNYXA8amF2YS5hd3QuZm9udC5UZXh0QXR0cmlidXRlLCA/PiBtYXBJbnB1dE1ldGhvZEhpZ2hsaWdodEltcGwoCi0gICAgICAgICAgICBJbnB1dE1ldGhvZEhpZ2hsaWdodCBoaWdobGlnaHQpIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiB7CisgICAgTWFwPGphdmEuYXd0LmZvbnQuVGV4dEF0dHJpYnV0ZSwgPz4gbWFwSW5wdXRNZXRob2RIaWdobGlnaHRJbXBsKElucHV0TWV0aG9kSGlnaGxpZ2h0IGhpZ2hsaWdodCkKKyAgICAgICAgICAgIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiB7CiAgICAgICAgIEhhc2hNYXA8amF2YS5hd3QuZm9udC5UZXh0QXR0cmlidXRlLCA/PiBtYXAgPSBuZXcgSGFzaE1hcDxqYXZhLmF3dC5mb250LlRleHRBdHRyaWJ1dGUsIE9iamVjdD4oKTsKICAgICAgICAgd3RrLmdldFN5c3RlbVByb3BlcnRpZXMoKS5tYXBJbnB1dE1ldGhvZEhpZ2hsaWdodChoaWdobGlnaHQsIG1hcCk7CiAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy48amF2YS5hd3QuZm9udC5UZXh0QXR0cmlidXRlLCBPYmplY3Q+IHVubW9kaWZpYWJsZU1hcChtYXApOwpAQCAtNjExLDkgKzY1NSwxMSBAQAogICAgICAqIEFkZHMgdGhlIHNwZWNpZmllZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIGZvciB0aGUgc3BlY2lmaWVkCiAgICAgICogcHJvcGVydHkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHByb3BOYW1lIHRoZSBwcm9wZXJ0eSBuYW1lIGZvciB3aGljaCB0aGUgc3BlY2lmaWVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIKLSAgICAgKiB3aWxsIGJlIGFkZGVkLiAKLSAgICAgKiBAcGFyYW0gbCB0aGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBvYmplY3QuCisgICAgICogQHBhcmFtIHByb3BOYW1lCisgICAgICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZSBmb3Igd2hpY2ggdGhlIHNwZWNpZmllZAorICAgICAqICAgICAgICAgICAgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB3aWxsIGJlIGFkZGVkLgorICAgICAqIEBwYXJhbSBsCisgICAgICogICAgICAgICAgICB0aGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBvYmplY3QuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgcHJvcE5hbWUsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbCkgewogICAgICAgICBsb2NrQVdUKCk7CkBAIC02MjQsMzEgKzY3MCwzMiBAQAogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgdW5sb2NrQVdUKCk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGwgIT0gbnVsbCkgeyAvLyB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBudWxsIGxpc3RlbmVyIHdpbGwgbm90IGJlIGFkZGVkCisgICAgICAgIGlmIChsICE9IG51bGwpIHsgLy8gdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgbnVsbCBsaXN0ZW5lciB3aWxsIG5vdCBiZQorICAgICAgICAgICAgLy8gYWRkZWQKICAgICAgICAgICAgIGRlc2t0b3BQcm9wc1N1cHBvcnQuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wTmFtZSwgbCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgd2l0aAotICAgICAqIHRoaXMgVG9vbGtpdC4KKyAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgd2l0aCB0aGlzCisgICAgICogVG9vbGtpdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgd2l0aAotICAgICAqIHRoaXMgVG9vbGtpdC4gCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVycyByZWdpc3RlcmVkIHdpdGggdGhpcworICAgICAqICAgICAgICAgVG9vbGtpdC4KICAgICAgKi8KICAgICBwdWJsaWMgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcltdIGdldFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKCkgewogICAgICAgICByZXR1cm4gZGVza3RvcFByb3BzU3VwcG9ydC5nZXRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycygpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCB3aXRoCi0gICAgICogdGhpcyBUb29sa2l0IGZvciBub3RpZmljYXRpb24gcmVnYXJkaW5nIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuCisgICAgICogUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVycyByZWdpc3RlcmVkIHdpdGggdGhpcworICAgICAqIFRvb2xraXQgZm9yIG5vdGlmaWNhdGlvbiByZWdhcmRpbmcgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcE5hbWUgdGhlIHByb3BlcnR5IG5hbWUgZm9yIHdoaWNoIHRoZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi0gICAgICogd2FzIHJlZ2lzdGVyZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMgcmVnaXN0ZXJlZCBmb3IgdGhlIHNwZWNpZmllZCAKLSAgICAgKiBwcm9wZXJ0eSBuYW1lLgorICAgICAqIEBwYXJhbSBwcm9wTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUgZm9yIHdoaWNoIHRoZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHdhcworICAgICAqICAgICAgICAgICAgcmVnaXN0ZXJlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyByZWdpc3RlcmVkIGZvciB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICBwcm9wZXJ0eSBuYW1lLgogICAgICAqLwogICAgIHB1YmxpYyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyW10gZ2V0UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIHByb3BOYW1lKSB7CiAgICAgICAgIHJldHVybiBkZXNrdG9wUHJvcHNTdXBwb3J0LmdldFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKHByb3BOYW1lKTsKQEAgLTY1OCwyOCArNzA1LDMzIEBACiAgICAgICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciByZWdpc3RlcmVkIGZvciB0aGUKICAgICAgKiBzcGVjaWZpZWQgcHJvcGVydHkgbmFtZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcE5hbWUgdGhlIHByb3BlcnR5IG5hbWUuCi0gICAgICogQHBhcmFtIGwgdGhlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcmVnaXN0ZXJlZCBmb3IgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBuYW1lLgorICAgICAqIEBwYXJhbSBwcm9wTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUuCisgICAgICogQHBhcmFtIGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHJlZ2lzdGVyZWQgZm9yIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgICAgIHByb3BlcnR5IG5hbWUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgcHJvcE5hbWUsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbCkgewogICAgICAgICBkZXNrdG9wUHJvcHNTdXBwb3J0LnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcE5hbWUsIGwpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIENyZWF0ZXMgYSBjdXN0b20gY3Vyc29yIHdpdGggdGhlIHNwZWNpZmllZCBJbWFnZSwgaG90IHNwb3QsIGFuZCBjdXJzb3IKICAgICAgKiBkZXNjcmlwdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1nIHRoZSBpbWFnZSBvZiBhY3RpdmF0ZWQgY3Vyc29yLgotICAgICAqIEBwYXJhbSBob3RTcG90IHRoZSBQb2ludCBnaXZpbmcgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBjdXJzb3IncyBob3Qgc3BvdC4gCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIGN1cnNvciBkZXNjcmlwdGlvbi4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW1nCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2Ugb2YgYWN0aXZhdGVkIGN1cnNvci4KKyAgICAgKiBAcGFyYW0gaG90U3BvdAorICAgICAqICAgICAgICAgICAgdGhlIFBvaW50IGdpdmluZyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGN1cnNvcidzIGhvdCBzcG90LgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgY3Vyc29yIGRlc2NyaXB0aW9uLgogICAgICAqIEByZXR1cm4gdGhlIGN1cnNvciB3aXRoIHRoZSBzcGVjaWZpZWQgSW1hZ2UsIGhvdCBzcG90LCBhbmQgY3Vyc29yCi0gICAgICogZGVzY3JpcHRpb24uCi0gICAgICogCi0gICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHRoZSBob3Qgc3BvdCB2YWx1ZXMgYXJlIG91dHNpZGUgIAotICAgICAqIHRoZSBib3VuZHMgb2YgdGhlIGN1cnNvci4KLSAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIGlmIGlzSGVhZGxlc3MoKSBtZXRob2Qgb2YgR3JhcGhpY3NFbnZpcm9ubWVudAotICAgICAqIGNsYXNzIHJldHVybnMgdHJ1ZS4KKyAgICAgKiAgICAgICAgIGRlc2NyaXB0aW9uLgorICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBob3Qgc3BvdCB2YWx1ZXMgYXJlIG91dHNpZGUgdGhlIGJvdW5kcyBvZiB0aGUgY3Vyc29yLgorICAgICAqIEB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBpc0hlYWRsZXNzKCkgbWV0aG9kIG9mIEdyYXBoaWNzRW52aXJvbm1lbnQgY2xhc3MgcmV0dXJucworICAgICAqICAgICAgICAgICAgIHRydWUuCiAgICAgICovCiAgICAgcHVibGljIEN1cnNvciBjcmVhdGVDdXN0b21DdXJzb3IoSW1hZ2UgaW1nLCBQb2ludCBob3RTcG90LCBTdHJpbmcgbmFtZSkKICAgICAgICAgICAgIHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLCBIZWFkbGVzc0V4Y2VwdGlvbiB7CkBAIC02OTgsMjAgKzc1MCwxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN1cHBvcnRlZCBjdXJzb3IgZGltZW5zaW9uIHdoaWNoIGlzIGNsb3Nlc3QgdG8gdGhlIAotICAgICAqIHNwZWNpZmllZCB3aWR0aCBhbmQgaGVpZ2h0LiBJZiB0aGUgVG9vbGtpdCBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlIAotICAgICAqIGN1cnNvciBzaXplLCB0aGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSBzdXBwb3J0ZWQgY3Vyc29yIHNpemUuCi0gICAgICogSWYgY3VzdG9tIGN1cnNvciBpcyBub3Qgc3VwcG9ydGVkLCBhIGRpbWVuc2lvbiBvZiAwLCAwIHNob3VsZCBiZQotICAgICAqIHJldHVybmVkLgorICAgICAqIFJldHVybnMgdGhlIHN1cHBvcnRlZCBjdXJzb3IgZGltZW5zaW9uIHdoaWNoIGlzIGNsb3Nlc3QgdG8gdGhlIHNwZWNpZmllZAorICAgICAqIHdpZHRoIGFuZCBoZWlnaHQuIElmIHRoZSBUb29sa2l0IG9ubHkgc3VwcG9ydHMgYSBzaW5nbGUgY3Vyc29yIHNpemUsIHRoaXMKKyAgICAgKiBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgc3VwcG9ydGVkIGN1cnNvciBzaXplLiBJZiBjdXN0b20gY3Vyc29yIGlzIG5vdAorICAgICAqIHN1cHBvcnRlZCwgYSBkaW1lbnNpb24gb2YgMCwgMCBzaG91bGQgYmUgcmV0dXJuZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHByZWZXaWR0aCB0aGUgcHJlZmZlcmVkIGN1cnNvciB3aWR0aC4KLSAgICAgKiBAcGFyYW0gcHJlZkhlaWdodCB0aGUgcHJlZmZlcmVkIGN1cnNvciBoZWlnaHQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc3VwcG9ydGVkIGN1cnNvciBkaW1lbnNpb24gd2hpY2ggaXMgY2xvc2VzdCB0byB0aGUgCi0gICAgICogc3BlY2lmaWVkIHdpZHRoIGFuZCBoZWlnaHQuCi0gICAgICogCi0gICAgICogQHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiBpZiBHcmFwaGljc0Vudmlyb25tZW50LmlzSGVhZGxlc3MoKSAKLSAgICAgKiByZXR1cm5zIHRydWUuCisgICAgICogQHBhcmFtIHByZWZXaWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCBjdXJzb3Igd2lkdGguCisgICAgICogQHBhcmFtIHByZWZIZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgY3Vyc29yIGhlaWdodC4KKyAgICAgKiBAcmV0dXJuIHRoZSBzdXBwb3J0ZWQgY3Vyc29yIGRpbWVuc2lvbiB3aGljaCBpcyBjbG9zZXN0IHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgIHdpZHRoIGFuZCBoZWlnaHQuCisgICAgICogQHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIEdyYXBoaWNzRW52aXJvbm1lbnQuaXNIZWFkbGVzcygpIHJldHVybnMgdHJ1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgRGltZW5zaW9uIGdldEJlc3RDdXJzb3JTaXplKGludCBwcmVmV2lkdGgsIGludCBwcmVmSGVpZ2h0KSB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24gewogICAgICAgICBsb2NrQVdUKCk7CkBAIC03MjMsMTAgKzc3NCwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGRlc2t0b3AgcHJvcGVydHkuIAorICAgICAqIEdldHMgdGhlIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGRlc2t0b3AgcHJvcGVydHkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHByb3BOYW1lIHRoZSBwcm9wZXJ0eSBuYW1lLgotICAgICAqIAorICAgICAqIEBwYXJhbSBwcm9wTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUuCiAgICAgICogQHJldHVybiB0aGUgT2JqZWN0IHRoYXQgaXMgdGhlIHByb3BlcnR5J3MgdmFsdWUuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIE9iamVjdCBnZXREZXNrdG9wUHJvcGVydHkoU3RyaW5nIHByb3BOYW1lKSB7CkBAIC03NTQsMTcgKzgwNSwxOSBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGxvY2tpbmcga2V5IHN0YXRlIGZvciB0aGUgc3BlY2lmaWVkIGtleS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYTAgdGhlIGtleSBjb2RlOiBWS19DQVBTX0xPQ0ssIFZLX05VTV9MT0NLLCBWS19TQ1JPTExfTE9DSywgCi0gICAgICogb3IgVktfS0FOQV9MT0NLLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGtleSBjb2RlIGlzIGluIHRoZSBsb2NrZWQgc3RhdGUsCi0gICAgICogZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHN0YXRlIG9mIHRoaXMga2V5IAotICAgICAqIGNhbid0IGJlIHJldHJpZXZlZCwgb3IgaWYgdGhlIGtleWJvYXJkIGRvZXNuJ3QgaGF2ZSB0aGlzIGtleS4KLSAgICAgKiBAdGhyb3dzIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC4KKyAgICAgKiBAcGFyYW0gYTAKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkgY29kZTogVktfQ0FQU19MT0NLLCBWS19OVU1fTE9DSywgVktfU0NST0xMX0xPQ0ssIG9yCisgICAgICogICAgICAgICAgICBWS19LQU5BX0xPQ0suCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQga2V5IGNvZGUgaXMgaW4gdGhlIGxvY2tlZCBzdGF0ZSwgZmFsc2UKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHN0YXRlIG9mIHRoaXMga2V5IGNhbid0IGJlIHJldHJpZXZlZCwgb3IgaWYgdGhlCisgICAgICogICAgICAgICAgICAga2V5Ym9hcmQgZG9lc24ndCBoYXZlIHRoaXMga2V5LgorICAgICAqIEB0aHJvd3MgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuCiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0TG9ja2luZ0tleVN0YXRlKGludCBhMCkgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk5vdEltcGxlbWVudGVkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRMb2NraW5nS2V5U3RhdGUoaW50IGEwKSB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24sCisgICAgICAgICAgICBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk5vdEltcGxlbWVudGVkRXhjZXB0aW9uIHsKICAgICAgICAgbG9ja0FXVCgpOwogICAgICAgICB0cnkgewogICAgICAgICB9IGZpbmFsbHkgewpAQCAtNzgxLDkgKzgzNCw4IEBACiAgICAgICogY3VzdG9tIGN1cnNvci4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIGN1cnNvciBjb2xvcnMuCi0gICAgICogCi0gICAgICogQHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiBpZiB0aGUgR3JhcGhpY3NFbnZpcm9ubWVudC5pc0hlYWRsZXNzKCkKLSAgICAgKiBtZXRob2QgcmV0dXJucyB0cnVlLgorICAgICAqIEB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgR3JhcGhpY3NFbnZpcm9ubWVudC5pc0hlYWRsZXNzKCkgbWV0aG9kIHJldHVybnMgdHJ1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldE1heGltdW1DdXJzb3JDb2xvcnMoKSB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24gewogICAgICAgICBsb2NrQVdUKCk7CkBAIC03OTYsMTEgKzg0OCwxMCBAQAogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgbWVudSBzaG9ydGN1dCBrZXkgbWFzay4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG1lbnUgc2hvcnRjdXQga2V5IG1hc2suCiAgICAgICogCi0gICAgICogQHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiBpZiB0aGUgR3JhcGhpY3NFbnZpcm9ubWVudC5pc0hlYWRsZXNzKCkKLSAgICAgKiBtZXRob2QgcmV0dXJucyB0cnVlLgorICAgICAqIEByZXR1cm4gdGhlIG1lbnUgc2hvcnRjdXQga2V5IG1hc2suCisgICAgICogQHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBHcmFwaGljc0Vudmlyb25tZW50LmlzSGVhZGxlc3MoKSBtZXRob2QgcmV0dXJucyB0cnVlLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TWVudVNob3J0Y3V0S2V5TWFzaygpIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiB7CiAgICAgICAgIGxvY2tBV1QoKTsKQEAgLTgxNCwxMiArODY1LDExIEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgc2NyZWVuIGluc2V0cy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZ2MgdGhlIEdyYXBoaWNzQ29uZmlndXJhdGlvbi4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZ2MKKyAgICAgKiAgICAgICAgICAgIHRoZSBHcmFwaGljc0NvbmZpZ3VyYXRpb24uCiAgICAgICogQHJldHVybiB0aGUgaW5zZXRzIG9mIHRoaXMgdG9vbGtpdC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIGlmIHRoZSBHcmFwaGljc0Vudmlyb25tZW50LmlzSGVhZGxlc3MoKQotICAgICAqIG1ldGhvZCByZXR1cm5zIHRydWUuCisgICAgICogQHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBHcmFwaGljc0Vudmlyb25tZW50LmlzSGVhZGxlc3MoKSBtZXRob2QgcmV0dXJucyB0cnVlLgogICAgICAqLwogICAgIHB1YmxpYyBJbnNldHMgZ2V0U2NyZWVuSW5zZXRzKEdyYXBoaWNzQ29uZmlndXJhdGlvbiBnYykgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGdjID09IG51bGwpIHsKQEAgLTgyNywxNyArODc3LDE3IEBACiAgICAgICAgIH0KICAgICAgICAgbG9ja0FXVCgpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnNldHMoMCwgMCwgMCwgMCk7IC8vVE9ETzogZ2V0IHJlYWwgc2NyZWVuIGluc2V0cworICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnNldHMoMCwgMCwgMCwgMCk7IC8vIFRPRE86IGdldCByZWFsIHNjcmVlbiBpbnNldHMKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHVubG9ja0FXVCgpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgc3lzdGVtIEV2ZW50UXVldWUgaW5zdGFuY2UuIAotICAgICAqIElmIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIGNoZWNrQXd0RXZlbnRRdWV1ZUFjY2VzcyBpcyB1c2VkLAotICAgICAqIHRoZW4gdGhpcyByZXN1bHRzIG9mIGEgY2FsbCB0byB0aGUgc2VjdXJpdHkgbWFuYWdlcidzIGNoZWNrUGVybWlzc2lvbgotICAgICAqIG1ldGhvZCB3aXRoIGFuIEFXVFBlcm1pc3Npb24oImFjY2Vzc0V2ZW50UXVldWUiKSBwZXJtaXNzaW9uLgorICAgICAqIEdldHMgdGhlIHN5c3RlbSBFdmVudFF1ZXVlIGluc3RhbmNlLiBJZiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZgorICAgICAqIGNoZWNrQXd0RXZlbnRRdWV1ZUFjY2VzcyBpcyB1c2VkLCB0aGVuIHRoaXMgcmVzdWx0cyBvZiBhIGNhbGwgdG8gdGhlCisgICAgICogc2VjdXJpdHkgbWFuYWdlcidzIGNoZWNrUGVybWlzc2lvbiBtZXRob2Qgd2l0aCBhbgorICAgICAqIEFXVFBlcm1pc3Npb24oImFjY2Vzc0V2ZW50UXVldWUiKSBwZXJtaXNzaW9uLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIHN5c3RlbSBFdmVudFF1ZXVlIGluc3RhbmNlLgogICAgICAqLwpAQCAtODQ5LDE5ICs4OTksMjAgQEAKICAgICAgICAgcmV0dXJuIGdldFN5c3RlbUV2ZW50UXVldWVJbXBsKCk7CiAgICAgfQogCi0gICAgLyoqIAorICAgIC8qKgogICAgICAqIEdldHMgdGhlIHN5c3RlbSBldmVudCBxdWV1ZSBjb3JlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN5c3RlbSBldmVudCBxdWV1ZSBjb3JlCisgICAgICogQHJldHVybiB0aGUgc3lzdGVtIGV2ZW50IHF1ZXVlIGNvcmUuCiAgICAgICovCiAgICAgRXZlbnRRdWV1ZUNvcmUgZ2V0U3lzdGVtRXZlbnRRdWV1ZUNvcmUoKSB7CiAgICAgICAgIHJldHVybiBzeXN0ZW1FdmVudFF1ZXVlQ29yZTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBzeXN0ZW0gZXZlbnQgcXVldWUgY29yZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29yZSB0aGUgbmV3IHN5c3RlbSBldmVudCBxdWV1ZSBjb3JlCisgICAgICogQHBhcmFtIGNvcmUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgc3lzdGVtIGV2ZW50IHF1ZXVlIGNvcmUuCiAgICAgICovCiAgICAgdm9pZCBzZXRTeXN0ZW1FdmVudFF1ZXVlQ29yZShFdmVudFF1ZXVlQ29yZSBjb3JlKSB7CiAgICAgICAgIHN5c3RlbUV2ZW50UXVldWVDb3JlID0gY29yZTsKQEAgLTg4MiwxMSArOTMzLDEwIEBACiAgICAgLyoqCiAgICAgICogQ2hlY2tzIGlmIGR5bmFtaWMgbGF5b3V0IG9mIENvbnRhaW5lcnMgaXMgYWN0aXZlIG9yIG5vdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIGR5bmFtaWMgbGF5b3V0IG9mIENvbnRhaW5lcnMgaXMgYWN0aXZlLAotICAgICAqIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIGlmIHRoZSBHcmFwaGljc0Vudmlyb25tZW50LmlzSGVhZGxlc3MoKQotICAgICAqIG1ldGhvZCByZXR1cm5zIHRydWUuCisgICAgICogQHJldHVybiB0cnVlLCBpZiBpcyBkeW5hbWljIGxheW91dCBvZiBDb250YWluZXJzIGlzIGFjdGl2ZSwgZmFsc2UKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIEdyYXBoaWNzRW52aXJvbm1lbnQuaXNIZWFkbGVzcygpIG1ldGhvZCByZXR1cm5zIHRydWUuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNEeW5hbWljTGF5b3V0QWN0aXZlKCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKICAgICAgICAgbG9ja0FXVCgpOwpAQCAtODk4LDE3ICs5NDgsMTUgQEAKICAgICAgICAgfQogICAgIH0KIAotCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0aGUgbGF5b3V0IG9mIENvbnRhaW5lcnMgaXMgY2hlY2tlZCBkeW5hbWljYWxseSBkdXJpbmcgcmVzaXppbmcsCi0gICAgICogb3Igc3RhdGljYWxseSBhZnRlciByZXNpemluZyBpcyBjb21wbGV0ZWQuIAorICAgICAqIFJldHVybnMgaWYgdGhlIGxheW91dCBvZiBDb250YWluZXJzIGlzIGNoZWNrZWQgZHluYW1pY2FsbHkgZHVyaW5nCisgICAgICogcmVzaXppbmcsIG9yIHN0YXRpY2FsbHkgYWZ0ZXIgcmVzaXppbmcgaXMgY29tcGxldGVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgaWYgdGhlIGxheW91dCBvZiBDb250YWluZXJzIGlzIGNoZWNrZWQgZHluYW1pY2FsbHkgZHVyaW5nIAotICAgICAqIHJlc2l6aW5nOyBmYWxzZSwgaWYgdGhlIGxheW91dCBvZiBDb250YWluZXJzIGlzIGNoZWNrZWQgc3RhdGljYWxseSBhZnRlciAKLSAgICAgKiByZXNpemluZyBpcyBjb21wbGV0ZWQuIAotICAgICAqIAotICAgICAqIEB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24gaWYgdGhlIEdyYXBoaWNzRW52aXJvbm1lbnQuaXNIZWFkbGVzcygpCi0gICAgICogbWV0aG9kIHJldHVybnMgdHJ1ZS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlmIHRoZSBsYXlvdXQgb2YgQ29udGFpbmVycyBpcyBjaGVja2VkIGR5bmFtaWNhbGx5CisgICAgICogICAgICAgICBkdXJpbmcgcmVzaXppbmc7IGZhbHNlLCBpZiB0aGUgbGF5b3V0IG9mIENvbnRhaW5lcnMgaXMgY2hlY2tlZAorICAgICAqICAgICAgICAgc3RhdGljYWxseSBhZnRlciByZXNpemluZyBpcyBjb21wbGV0ZWQuCisgICAgICogQHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBHcmFwaGljc0Vudmlyb25tZW50LmlzSGVhZGxlc3MoKSBtZXRob2QgcmV0dXJucyB0cnVlLgogICAgICAqLwogICAgIHByb3RlY3RlZCBib29sZWFuIGlzRHluYW1pY0xheW91dFNldCgpIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiB7CiAgICAgICAgIGxvY2tBV1QoKTsKQEAgLTkyMiwxMiArOTcwLDExIEBACiAgICAgLyoqCiAgICAgICogQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgZnJhbWUgc3RhdGUgaXMgc3VwcG9ydGVkIGJ5IFRvb2xraXQgb3Igbm90LgogICAgICAqIAotICAgICAqIEBwYXJhbSBzdGF0ZSB0aGUgZnJhbWUgc3RhdGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiBmcmFtZSBzdGF0ZSBpcyBzdXBwb3J0ZWQ7IGZhbHNlIG90aHJ3aXNlLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24gaWYgdGhlIEdyYXBoaWNzRW52aXJvbm1lbnQuaXNIZWFkbGVzcygpCi0gICAgICogbWV0aG9kIHJldHVybnMgdHJ1ZS4KKyAgICAgKiBAcGFyYW0gc3RhdGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBmcmFtZSBzdGF0ZS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGZyYW1lIHN0YXRlIGlzIHN1cHBvcnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgR3JhcGhpY3NFbnZpcm9ubWVudC5pc0hlYWRsZXNzKCkgbWV0aG9kIHJldHVybnMgdHJ1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZyYW1lU3RhdGVTdXBwb3J0ZWQoaW50IHN0YXRlKSB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24gewogICAgICAgICBsb2NrQVdUKCk7CkBAIC05NDEsOCArOTg4LDggQEAKICAgICAvKioKICAgICAgKiBMb2FkcyB0aGUgdmFsdWUgb2YgdGhlIGRlc2t0b3AgcHJvcGVydHkgd2l0aCB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IG5hbWUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHByb3BOYW1lIHRoZSBwcm9wZXJ0eSBuYW1lLgotICAgICAqIAorICAgICAqIEBwYXJhbSBwcm9wTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUuCiAgICAgICogQHJldHVybiB0aGUgZGVza3RvcCBwcm9wZXJ0eSB2YWx1ZXMuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIE9iamVjdCBsYXppbHlMb2FkRGVza3RvcFByb3BlcnR5KFN0cmluZyBwcm9wTmFtZSkgewpAQCAtOTUyLDExICs5OTksMTEgQEAKICAgICAvKioKICAgICAgKiBMb2FkcyB0aGUgY3VycmVudCBzeXN0ZW0gY29sb3IgdmFsdWVzIHRvIHRoZSBzcGVjaWZpZWQgYXJyYXkuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNvbG9ycyB0aGUgYXJyYXkgd2hlcmUgdGhlIGN1cnJlbnQgc3lzdGVtIGNvbG9yIHZhbHVlcyAKLSAgICAgKiBhcmUgd3JpdHRlbiBieSB0aGlzIG1ldGhvZC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIGlmIHRoZSBHcmFwaGljc0Vudmlyb25tZW50LmlzSGVhZGxlc3MoKQotICAgICAqIG1ldGhvZCByZXR1cm5zIHRydWUuCisgICAgICogQHBhcmFtIGNvbG9ycworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IHdoZXJlIHRoZSBjdXJyZW50IHN5c3RlbSBjb2xvciB2YWx1ZXMgYXJlIHdyaXR0ZW4gYnkKKyAgICAgKiAgICAgICAgICAgIHRoaXMgbWV0aG9kLgorICAgICAqIEB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgR3JhcGhpY3NFbnZpcm9ubWVudC5pc0hlYWRsZXNzKCkgbWV0aG9kIHJldHVybnMgdHJ1ZS4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBsb2FkU3lzdGVtQ29sb3JzKGludFtdIGNvbG9ycykgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKICAgICAgICAgbG9ja0FXVCgpOwpAQCAtOTY5LDggKzEwMTYsMTAgQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZGVza3RvcCBwcm9wZXJ0eSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcE5hbWUgdGhlIHByb3BlcnR5J3MgbmFtZS4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHByb3BlcnR5J3MgdmFsdWUuCisgICAgICogQHBhcmFtIHByb3BOYW1lCisgICAgICogICAgICAgICAgICB0aGUgcHJvcGVydHkncyBuYW1lLgorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5J3MgdmFsdWUuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0RGVza3RvcFByb3BlcnR5KFN0cmluZyBwcm9wTmFtZSwgT2JqZWN0IHZhbHVlKSB7CiAgICAgICAgIE9iamVjdCBvbGRWYWw7CkBAIC05ODYsMTUgKzEwMzUsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBsYXlvdXQgc3RhdGUsIHdoZXRoZXIgdGhlIENvbnRhaW5lciBsYXlvdXQgaXMgY2hlY2tlZCAKLSAgICAgKiBkeW5hbWljYWxseSBkdXJpbmcgcmVzaXppbmcsIG9yIHN0YXRpY2FsbHkgYWZ0ZXIgcmVzaXppbmcgaXMgY29tcGxldGVkLiAKKyAgICAgKiBTZXRzIHRoZSBsYXlvdXQgc3RhdGUsIHdoZXRoZXIgdGhlIENvbnRhaW5lciBsYXlvdXQgaXMgY2hlY2tlZAorICAgICAqIGR5bmFtaWNhbGx5IGR1cmluZyByZXNpemluZywgb3Igc3RhdGljYWxseSBhZnRlciByZXNpemluZyBpcyBjb21wbGV0ZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGR5bmFtaWMgdGhlIG5ldyBkeW5hbWljIGxheW91dCBzdGF0ZSAtIGlmIHRydWUgdGhlIGxheW91dCBvZiAKLSAgICAgKiBDb250YWluZXJzIGlzIGNoZWNrZWQgZHluYW1pY2FsbHkgZHVyaW5nIHJlc2l6aW5nLCBpZiBmYWxzZSAtCi0gICAgICogc3RhdGljYWxseSBhZnRlciByZXNpemluZyBpcyBjb21wbGV0ZWQuCi0gICAgICogCi0gICAgICogQHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiBpZiB0aGUgR3JhcGhpY3NFbnZpcm9ubWVudC5pc0hlYWRsZXNzKCkKLSAgICAgKiBtZXRob2QgcmV0dXJucyB0cnVlLgorICAgICAqIEBwYXJhbSBkeW5hbWljCisgICAgICogICAgICAgICAgICB0aGUgbmV3IGR5bmFtaWMgbGF5b3V0IHN0YXRlIC0gaWYgdHJ1ZSB0aGUgbGF5b3V0IG9mCisgICAgICogICAgICAgICAgICBDb250YWluZXJzIGlzIGNoZWNrZWQgZHluYW1pY2FsbHkgZHVyaW5nIHJlc2l6aW5nLCBpZiBmYWxzZSAtCisgICAgICogICAgICAgICAgICBzdGF0aWNhbGx5IGFmdGVyIHJlc2l6aW5nIGlzIGNvbXBsZXRlZC4KKyAgICAgKiBAdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIEdyYXBoaWNzRW52aXJvbm1lbnQuaXNIZWFkbGVzcygpIG1ldGhvZCByZXR1cm5zIHRydWUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RHluYW1pY0xheW91dChib29sZWFuIGR5bmFtaWMpIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiB7CiAgICAgICAgIGxvY2tBV1QoKTsKQEAgLTEwMDgsMTYgKzEwNTcsMjAgQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBsb2NraW5nIGtleSBzdGF0ZSBmb3IgdGhlIHNwZWNpZmllZCBrZXkgY29kZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYTAgdGhlIGtleSBjb2RlOiBWS19DQVBTX0xPQ0ssIFZLX05VTV9MT0NLLCBWS19TQ1JPTExfTE9DSywgCi0gICAgICogb3IgVktfS0FOQV9MT0NLLgotICAgICAqIEBwYXJhbSBhMSB0aGUgc3RhdGUgLSB0cnVlIHRvIHNldCB0aGUgc3BlY2lmaWVkIGtleSBjb2RlIHRvIHRoZSBsb2NrZWQgc3RhdGUsCi0gICAgICogZmFsc2UgLSB0byB1bmxvY2sgaXQuCi0gICAgICogCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgc3RhdGUgb2YgdGhpcyBrZXkgCi0gICAgICogY2FuJ3QgYmUgc2V0LCBvciBpZiB0aGUga2V5Ym9hcmQgZG9lc24ndCBoYXZlIHRoaXMga2V5LgotICAgICAqIEB0aHJvd3MgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24gaWYgdGhpcyBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLgorICAgICAqIEBwYXJhbSBhMAorICAgICAqICAgICAgICAgICAgdGhlIGtleSBjb2RlOiBWS19DQVBTX0xPQ0ssIFZLX05VTV9MT0NLLCBWS19TQ1JPTExfTE9DSywgb3IKKyAgICAgKiAgICAgICAgICAgIFZLX0tBTkFfTE9DSy4KKyAgICAgKiBAcGFyYW0gYTEKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGF0ZSAtIHRydWUgdG8gc2V0IHRoZSBzcGVjaWZpZWQga2V5IGNvZGUgdG8gdGhlIGxvY2tlZAorICAgICAqICAgICAgICAgICAgc3RhdGUsIGZhbHNlIC0gdG8gdW5sb2NrIGl0LgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3RhdGUgb2YgdGhpcyBrZXkgY2FuJ3QgYmUgc2V0LCBvciBpZiB0aGUga2V5Ym9hcmQKKyAgICAgKiAgICAgICAgICAgICBkb2Vzbid0IGhhdmUgdGhpcyBrZXkuCisgICAgICogQHRocm93cyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NraW5nS2V5U3RhdGUoaW50IGEwLCBib29sZWFuIGExKSB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24sIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTm90SW1wbGVtZW50ZWRFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHNldExvY2tpbmdLZXlTdGF0ZShpbnQgYTAsIGJvb2xlYW4gYTEpIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiwKKyAgICAgICAgICAgIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTm90SW1wbGVtZW50ZWRFeGNlcHRpb24gewogICAgICAgICBsb2NrQVdUKCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgIH0gZmluYWxseSB7CkBAIC0xMDI5LDcgKzEwODIsNiBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBPbiBxdWV1ZSBlbXB0eS4KICAgICAgKi8KQEAgLTEwNDAsMTQgKzEwOTIsMTQgQEAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIHRoZSB3dGsuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNsc05hbWUgdGhlIGNscyBuYW1lCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgd1RLCisgICAgICogQHBhcmFtIGNsc05hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBjbHMgbmFtZS4KKyAgICAgKiBAcmV0dXJuIHRoZSB3VEsuCiAgICAgICovCiAgICAgcHJpdmF0ZSBXVEsgY3JlYXRlV1RLKFN0cmluZyBjbHNOYW1lKSB7CiAgICAgICAgIFdUSyBuZXdXVEsgPSBudWxsOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgbmV3V1RLID0gKFdUSykgQ2xhc3MuZm9yTmFtZShjbHNOYW1lKS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgbmV3V1RLID0gKFdUSylDbGFzcy5mb3JOYW1lKGNsc05hbWUpLm5ld0luc3RhbmNlKCk7CiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKICAgICAgICAgfQpAQCAtMTA1Niw3ICsxMTA4LDkgQEAKIAogICAgIC8qKgogICAgICAqIENvbm5lY3QgdGhlIGNvbXBvbmVudCB0byBpdHMgbmF0aXZlIHdpbmRvdwotICAgICAqIEBwYXJhbSB3aW5JZCAtIGlkIG9mIG5hdGl2ZSB3aW5kb3cganVzdCBjcmVhdGVkCisgICAgICogCisgICAgICogQHBhcmFtIHdpbklkCisgICAgICogICAgICAgICAgICB0aGUgaWQgb2YgbmF0aXZlIHdpbmRvdyBqdXN0IGNyZWF0ZWQuCiAgICAgICovCiAgICAgYm9vbGVhbiBvbldpbmRvd0NyZWF0ZWQobG9uZyB3aW5JZCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xMDY1LDQ1ICsxMTE5LDUwIEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgbmF0aXZlIGV2ZW50IHF1ZXVlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hdGl2ZSBldmVudCBxdWV1ZQorICAgICAqIEByZXR1cm4gdGhlIG5hdGl2ZSBldmVudCBxdWV1ZS4KICAgICAgKi8KICAgICBOYXRpdmVFdmVudFF1ZXVlIGdldE5hdGl2ZUV2ZW50UXVldWUoKSB7CiAgICAgICAgIHJldHVybiB3dGsuZ2V0TmF0aXZlRXZlbnRRdWV1ZSgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzaGFyZWQgaW5zdGFuY2Ugb2YgaW1wbGVtZW50YXRpb24gb2Ygb3JnLmFwYWNoZS5oYXJtb255LmF3dC53dGsuTmF0aXZlQ3Vyc29yCi0gICAgICogZm9yIGN1cnJlbnQgcGxhdGZvcm0gZm9yCisgICAgICogUmV0dXJucyBhIHNoYXJlZCBpbnN0YW5jZSBvZiBpbXBsZW1lbnRhdGlvbiBvZgorICAgICAqIG9yZy5hcGFjaGUuaGFybW9ueS5hd3Qud3RrLk5hdGl2ZUN1cnNvciBmb3IgY3VycmVudCBwbGF0Zm9ybSBmb3IuCiAgICAgICogCi0gICAgICogQHBhcmFtIHR5cGUgLSBKYXZhIEN1cnNvciB0eXBlCi0gICAgICogCi0gICAgICogQHJldHVybiBuZXcgaW5zdGFuY2Ugb2YgaW1wbGVtZW50YXRpb24gb2YgTmF0aXZlQ3Vyc29yCisgICAgICogQHBhcmFtIHR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBKYXZhIEN1cnNvciB0eXBlLgorICAgICAqIEByZXR1cm4gbmV3IGluc3RhbmNlIG9mIGltcGxlbWVudGF0aW9uIG9mIE5hdGl2ZUN1cnNvci4KICAgICAgKi8KICAgICBOYXRpdmVDdXJzb3IgY3JlYXRlTmF0aXZlQ3Vyc29yKGludCB0eXBlKSB7CiAgICAgICAgIHJldHVybiB3dGsuZ2V0Q3Vyc29yRmFjdG9yeSgpLmdldEN1cnNvcih0eXBlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc2hhcmVkIGluc3RhbmNlIG9mIGltcGxlbWVudGF0aW9uIG9mIG9yZy5hcGFjaGUuaGFybW9ueS5hd3Qud3RrLk5hdGl2ZUN1cnNvcgotICAgICAqIGZvciBjdXJyZW50IHBsYXRmb3JtIGZvciBjdXN0b20gY3Vyc29yCisgICAgICogUmV0dXJucyBhIHNoYXJlZCBpbnN0YW5jZSBvZiBpbXBsZW1lbnRhdGlvbiBvZgorICAgICAqIG9yZy5hcGFjaGUuaGFybW9ueS5hd3Qud3RrLk5hdGl2ZUN1cnNvciBmb3IgY3VycmVudCBwbGF0Zm9ybSBmb3IgY3VzdG9tCisgICAgICogY3Vyc29yCiAgICAgICogCi0gICAgICogQHBhcmFtIGltZyB0aGUgaW1nCi0gICAgICogQHBhcmFtIGhvdFNwb3QgdGhlIGhvdCBzcG90Ci0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIG5ldyBpbnN0YW5jZSBvZiBpbXBsZW1lbnRhdGlvbiBvZiBOYXRpdmVDdXJzb3IKKyAgICAgKiBAcGFyYW0gaW1nCisgICAgICogICAgICAgICAgICB0aGUgaW1nLgorICAgICAqIEBwYXJhbSBob3RTcG90CisgICAgICogICAgICAgICAgICB0aGUgaG90IHNwb3QuCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lLgorICAgICAqIEByZXR1cm4gbmV3IGluc3RhbmNlIG9mIGltcGxlbWVudGF0aW9uIG9mIE5hdGl2ZUN1cnNvci4KICAgICAgKi8KICAgICBOYXRpdmVDdXJzb3IgY3JlYXRlQ3VzdG9tTmF0aXZlQ3Vyc29yKEltYWdlIGltZywgUG9pbnQgaG90U3BvdCwgU3RyaW5nIG5hbWUpIHsKICAgICAgICAgcmV0dXJuIHd0ay5nZXRDdXJzb3JGYWN0b3J5KCkuY3JlYXRlQ3VzdG9tQ3Vyc29yKGltZywgaG90U3BvdC54LCBob3RTcG90LnkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFkZHMgYW4gQVdURXZlbnRMaXN0ZW5lciB0byB0aGUgVG9vbGtpdCB0byBsaXN0ZW4gZm9yIGV2ZW50cwotICAgICAqIG9mIHR5cGVzIGNvcnJlc3BvbmRpbmcgdG8gYml0cyBpbiB0aGUgc3BlY2lmaWVkIGV2ZW50IG1hc2suIAotICAgICAqIEV2ZW50IG1hc2tzIGFyZSBkZWZpbmVkIGluIEFXVEV2ZW50IGNsYXNzLgorICAgICAqIEFkZHMgYW4gQVdURXZlbnRMaXN0ZW5lciB0byB0aGUgVG9vbGtpdCB0byBsaXN0ZW4gZm9yIGV2ZW50cyBvZiB0eXBlcworICAgICAqIGNvcnJlc3BvbmRpbmcgdG8gYml0cyBpbiB0aGUgc3BlY2lmaWVkIGV2ZW50IG1hc2suIEV2ZW50IG1hc2tzIGFyZQorICAgICAqIGRlZmluZWQgaW4gQVdURXZlbnQgY2xhc3MuCiAgICAgICogCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBBV1RFdmVudExpc3RlbmVyLgotICAgICAqIEBwYXJhbSBldmVudE1hc2sgaGUgYml0bWFzayBvZiBldmVudCB0eXBlcy4KKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBBV1RFdmVudExpc3RlbmVyLgorICAgICAqIEBwYXJhbSBldmVudE1hc2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBiaXRtYXNrIG9mIGV2ZW50IHR5cGVzLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZEFXVEV2ZW50TGlzdGVuZXIoQVdURXZlbnRMaXN0ZW5lciBsaXN0ZW5lciwgbG9uZyBldmVudE1hc2spIHsKICAgICAgICAgbG9ja0FXVCgpOwpAQCAtMTExOSw5ICsxMTc4LDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGF3dCBldmVudCBsaXN0ZW5lci4KKyAgICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgQVdUIGV2ZW50IGxpc3RlbmVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgQVdURXZlbnRMaXN0ZW5lciB0byBiZSByZW1vdmVkLgorICAgICAqIEBwYXJhbSBsaXN0ZW5lcgorICAgICAqICAgICAgICAgICAgdGhlIEFXVEV2ZW50TGlzdGVuZXIgdG8gYmUgcmVtb3ZlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZW1vdmVBV1RFdmVudExpc3RlbmVyKEFXVEV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKICAgICAgICAgbG9ja0FXVCgpOwpAQCAtMTEzOSw3ICsxMTk5LDggQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBhcnJheSBvZiBhbGwgQVdUIGV2ZW50IGxpc3RlbmVycyByZWdpc3RlcmVkIHdpdGggdGhpcyBUb29sa2l0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGFsbCBBV1QgZXZlbnQgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIFRvb2xraXQuCisgICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgYWxsIEFXVCBldmVudCBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCB3aXRoIHRoaXMKKyAgICAgKiAgICAgICAgIFRvb2xraXQuCiAgICAgICovCiAgICAgcHVibGljIEFXVEV2ZW50TGlzdGVuZXJbXSBnZXRBV1RFdmVudExpc3RlbmVycygpIHsKICAgICAgICAgbG9ja0FXVCgpOwpAQCAtMTE1NSwxMyArMTIxNiwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFycmF5IG9mIHRoZSBBV1QgZXZlbnQgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIFRvb2xraXQgCisgICAgICogUmV0dXJucyB0aGUgYXJyYXkgb2YgdGhlIEFXVCBldmVudCBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgVG9vbGtpdAogICAgICAqIGZvciB0aGUgZXZlbnQgdHlwZXMgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGV2ZW50IG1hc2suCiAgICAgICogCi0gICAgICogQHBhcmFtIGV2ZW50TWFzayB0aGUgYml0IG1hc2sgb2YgZXZlbnQgdHlwZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiB0aGUgQVdUIGV2ZW50IGxpc3RlbmVycyByZWdpc3RlcmVkIGluIHRoaXMgVG9vbGtpdCAKLSAgICAgKiBmb3IgdGhlIGV2ZW50IHR5cGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBldmVudCBtYXNrLgorICAgICAqIEBwYXJhbSBldmVudE1hc2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBiaXQgbWFzayBvZiBldmVudCB0eXBlLgorICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIHRoZSBBV1QgZXZlbnQgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgaW4gdGhpcyBUb29sa2l0CisgICAgICogICAgICAgICBmb3IgdGhlIGV2ZW50IHR5cGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBldmVudCBtYXNrLgogICAgICAqLwogICAgIHB1YmxpYyBBV1RFdmVudExpc3RlbmVyW10gZ2V0QVdURXZlbnRMaXN0ZW5lcnMobG9uZyBldmVudE1hc2spIHsKICAgICAgICAgbG9ja0FXVCgpOwpAQCAtMTE3NywzMCArMTIzOCwzNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIERpc3BhdGNoIGF3dCBldmVudC4KKyAgICAgKiBEaXNwYXRjaCBBV1QgZXZlbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGV2ZW50IHRoZSBldmVudAorICAgICAqIEBwYXJhbSBldmVudAorICAgICAqICAgICAgICAgICAgdGhlIGV2ZW50LgogICAgICAqLwogICAgIHZvaWQgZGlzcGF0Y2hBV1RFdmVudChBV1RFdmVudCBldmVudCkgewogICAgICAgICBhd3RFdmVudHNNYW5hZ2VyLmRpc3BhdGNoQVdURXZlbnQoZXZlbnQpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFRoZSBDbGFzcyBBV1RFdmVudHNNYW5hZ2VyLgogICAgICAqLwogICAgIGZpbmFsIGNsYXNzIEFXVEV2ZW50c01hbmFnZXIgewogCi0gICAgICAgIC8qKiBUaGUgcGVybWlzc2lvbi4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBwZXJtaXNzaW9uLgorICAgICAgICAgKi8KICAgICAgICAgQVdUUGVybWlzc2lvbiBwZXJtaXNzaW9uID0gbmV3IEFXVFBlcm1pc3Npb24oImxpc3RlblRvQWxsQVdURXZlbnRzIik7IC8vJE5PTi1OTFMtMSQKIAotICAgICAgICAvKiogVGhlIGxpc3RlbmVycy4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBsaXN0ZW5lcnMuCisgICAgICAgICAqLwogICAgICAgICBwcml2YXRlIGZpbmFsIEFXVExpc3RlbmVyTGlzdDxBV1RFdmVudExpc3RlbmVyUHJveHk+IGxpc3RlbmVycyA9IG5ldyBBV1RMaXN0ZW5lckxpc3Q8QVdURXZlbnRMaXN0ZW5lclByb3h5PigpOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBBZGRzIHRoZSBhd3QgZXZlbnQgbGlzdGVuZXIuCisgICAgICAgICAqIEFkZHMgdGhlIEFXVCBldmVudCBsaXN0ZW5lci4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIKLSAgICAgICAgICogQHBhcmFtIGV2ZW50TWFzayB0aGUgZXZlbnQgbWFzaworICAgICAgICAgKiBAcGFyYW0gbGlzdGVuZXIKKyAgICAgICAgICogICAgICAgICAgICB0aGUgbGlzdGVuZXIuCisgICAgICAgICAqIEBwYXJhbSBldmVudE1hc2sKKyAgICAgICAgICogICAgICAgICAgICB0aGUgZXZlbnQgbWFzay4KICAgICAgICAgICovCiAgICAgICAgIHZvaWQgYWRkQVdURXZlbnRMaXN0ZW5lcihBV1RFdmVudExpc3RlbmVyIGxpc3RlbmVyLCBsb25nIGV2ZW50TWFzaykgewogICAgICAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKQEAgLTEyMDksOSArMTI3NywxMCBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlbW92ZXMgdGhlIGF3dCBldmVudCBsaXN0ZW5lci4KKyAgICAgICAgICogUmVtb3ZlcyB0aGUgQVdUIGV2ZW50IGxpc3RlbmVyLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lcgorICAgICAgICAgKiBAcGFyYW0gbGlzdGVuZXIKKyAgICAgICAgICogICAgICAgICAgICB0aGUgbGlzdGVuZXIuCiAgICAgICAgICAqLwogICAgICAgICB2b2lkIHJlbW92ZUFXVEV2ZW50TGlzdGVuZXIoQVdURXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgewogICAgICAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKQEAgLTEyMjUsOSArMTI5NCw5IEBACiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgYVdUIGV2ZW50IGxpc3RlbmVycy4KKyAgICAgICAgICogR2V0cyB0aGUgQVdUIGV2ZW50IGxpc3RlbmVycy4KICAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIGFXVCBldmVudCBsaXN0ZW5lcnMKKyAgICAgICAgICogQHJldHVybiB0aGUgQVdUIGV2ZW50IGxpc3RlbmVycy4KICAgICAgICAgICovCiAgICAgICAgIEFXVEV2ZW50TGlzdGVuZXJbXSBnZXRBV1RFdmVudExpc3RlbmVycygpIHsKICAgICAgICAgICAgIEhhc2hTZXQ8RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXJzU2V0ID0gbmV3IEhhc2hTZXQ8RXZlbnRMaXN0ZW5lcj4oKTsKQEAgLTEyMzgsMTEgKzEzMDcsMTEgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBhV1QgZXZlbnQgbGlzdGVuZXJzLgorICAgICAgICAgKiBHZXRzIHRoZSBBV1QgZXZlbnQgbGlzdGVuZXJzLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGV2ZW50TWFzayB0aGUgZXZlbnQgbWFzawotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgYVdUIGV2ZW50IGxpc3RlbmVycworICAgICAgICAgKiBAcGFyYW0gZXZlbnRNYXNrCisgICAgICAgICAqICAgICAgICAgICAgdGhlIGV2ZW50IG1hc2suCisgICAgICAgICAqIEByZXR1cm4gdGhlIEFXVCBldmVudCBsaXN0ZW5lcnMuCiAgICAgICAgICAqLwogICAgICAgICBBV1RFdmVudExpc3RlbmVyW10gZ2V0QVdURXZlbnRMaXN0ZW5lcnMobG9uZyBldmVudE1hc2spIHsKICAgICAgICAgICAgIEhhc2hTZXQ8RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXJzU2V0ID0gbmV3IEhhc2hTZXQ8RXZlbnRMaXN0ZW5lcj4oKTsKQEAgLTEyNTUsOSArMTMyNCwxMCBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIERpc3BhdGNoIGF3dCBldmVudC4KKyAgICAgICAgICogRGlzcGF0Y2ggQVdUIGV2ZW50LgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGV2ZW50IHRoZSBldmVudAorICAgICAgICAgKiBAcGFyYW0gZXZlbnQKKyAgICAgICAgICogICAgICAgICAgICB0aGUgZXZlbnQuCiAgICAgICAgICAqLwogICAgICAgICB2b2lkIGRpc3BhdGNoQVdURXZlbnQoQVdURXZlbnQgZXZlbnQpIHsKICAgICAgICAgICAgIEFXVEV2ZW50LkV2ZW50RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZXZlbnRUeXBlTG9va3VwLmdldEV2ZW50RGVzY3JpcHRvcihldmVudCk7CkBAIC0xMjcxLDY4ICsxMzQxLDEwNCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogVGhlIENsYXNzIEF1dG9OdW1iZXIuCiAgICAgICovCiAgICAgc3RhdGljIGZpbmFsIGNsYXNzIEF1dG9OdW1iZXIgewogCi0gICAgICAgIC8qKiBUaGUgbmV4dCBjb21wb25lbnQuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbmV4dCBjb21wb25lbnQuCisgICAgICAgICAqLwogICAgICAgICBpbnQgbmV4dENvbXBvbmVudCA9IDA7CiAKLSAgICAgICAgLyoqIFRoZSBuZXh0IGNhbnZhcy4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBuZXh0IGNhbnZhcy4KKyAgICAgICAgICovCiAgICAgICAgIGludCBuZXh0Q2FudmFzID0gMDsKIAotICAgICAgICAvKiogVGhlIG5leHQgcGFuZWwuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbmV4dCBwYW5lbC4KKyAgICAgICAgICovCiAgICAgICAgIGludCBuZXh0UGFuZWwgPSAwOwogCi0gICAgICAgIC8qKiBUaGUgbmV4dCB3aW5kb3cuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbmV4dCB3aW5kb3cuCisgICAgICAgICAqLwogICAgICAgICBpbnQgbmV4dFdpbmRvdyA9IDA7CiAKLSAgICAgICAgLyoqIFRoZSBuZXh0IGZyYW1lLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG5leHQgZnJhbWUuCisgICAgICAgICAqLwogICAgICAgICBpbnQgbmV4dEZyYW1lID0gMDsKIAotICAgICAgICAvKiogVGhlIG5leHQgZGlhbG9nLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG5leHQgZGlhbG9nLgorICAgICAgICAgKi8KICAgICAgICAgaW50IG5leHREaWFsb2cgPSAwOwogCi0gICAgICAgIC8qKiBUaGUgbmV4dCBidXR0b24uICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbmV4dCBidXR0b24uCisgICAgICAgICAqLwogICAgICAgICBpbnQgbmV4dEJ1dHRvbiA9IDA7CiAKLSAgICAgICAgLyoqIFRoZSBuZXh0IG1lbnUgY29tcG9uZW50LiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG5leHQgbWVudSBjb21wb25lbnQuCisgICAgICAgICAqLwogICAgICAgICBpbnQgbmV4dE1lbnVDb21wb25lbnQgPSAwOwogCi0gICAgICAgIC8qKiBUaGUgbmV4dCBsYWJlbC4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBuZXh0IGxhYmVsLgorICAgICAgICAgKi8KICAgICAgICAgaW50IG5leHRMYWJlbCA9IDA7CiAKLSAgICAgICAgLyoqIFRoZSBuZXh0IGNoZWNrIGJveC4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBuZXh0IGNoZWNrIGJveC4KKyAgICAgICAgICovCiAgICAgICAgIGludCBuZXh0Q2hlY2tCb3ggPSAwOwogCi0gICAgICAgIC8qKiBUaGUgbmV4dCBzY3JvbGxiYXIuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbmV4dCBzY3JvbGxiYXIuCisgICAgICAgICAqLwogICAgICAgICBpbnQgbmV4dFNjcm9sbGJhciA9IDA7CiAKLSAgICAgICAgLyoqIFRoZSBuZXh0IHNjcm9sbCBwYW5lLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG5leHQgc2Nyb2xsIHBhbmUuCisgICAgICAgICAqLwogICAgICAgICBpbnQgbmV4dFNjcm9sbFBhbmUgPSAwOwogCi0gICAgICAgIC8qKiBUaGUgbmV4dCBsaXN0LiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG5leHQgbGlzdC4KKyAgICAgICAgICovCiAgICAgICAgIGludCBuZXh0TGlzdCA9IDA7CiAKLSAgICAgICAgLyoqIFRoZSBuZXh0IGNob2ljZS4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBuZXh0IGNob2ljZS4KKyAgICAgICAgICovCiAgICAgICAgIGludCBuZXh0Q2hvaWNlID0gMDsKIAotICAgICAgICAvKiogVGhlIG5leHQgZmlsZSBkaWFsb2cuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbmV4dCBmaWxlIGRpYWxvZy4KKyAgICAgICAgICovCiAgICAgICAgIGludCBuZXh0RmlsZURpYWxvZyA9IDA7CiAKLSAgICAgICAgLyoqIFRoZSBuZXh0IHRleHQgYXJlYS4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBuZXh0IHRleHQgYXJlYS4KKyAgICAgICAgICovCiAgICAgICAgIGludCBuZXh0VGV4dEFyZWEgPSAwOwogCi0gICAgICAgIC8qKiBUaGUgbmV4dCB0ZXh0IGZpZWxkLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG5leHQgdGV4dCBmaWVsZC4KKyAgICAgICAgICovCiAgICAgICAgIGludCBuZXh0VGV4dEZpZWxkID0gMDsKICAgICB9Ci0gICAgCisKICAgICBwcml2YXRlIGNsYXNzIExvY2sgewogICAgIH0KIAotICAgICAgICAvKiogVGhlIGxvY2suICovCisgICAgLyoqCisgICAgICogVGhlIGxvY2suCisgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbG9jayA9IG5ldyBMb2NrKCk7Ci0gICAgICAgIAorCiB9CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvVHJhbnNwYXJlbmN5LmphdmEgYi9hd3QvamF2YS9hd3QvVHJhbnNwYXJlbmN5LmphdmEKaW5kZXggOTc5MzExNC4uNDRhMWU3ZiAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L1RyYW5zcGFyZW5jeS5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9UcmFuc3BhcmVuY3kuamF2YQpAQCAtMTgsMzQgKzE4LDQwIEBACiAgKiBAYXV0aG9yIFBhdmVsIERvbGdvdgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3Q7CiAKIC8qKgogICogVGhlIFRyYW5zcGFyZW5jeSBpbnRlcmZhY2UgZGVmaW5lcyB0cmFuc3BhcmVuY3kncyBnZW5lcmFsIG1vZGVzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBUcmFuc3BhcmVuY3kgewogCi0gICAgLyoqIFRoZSBDb25zdGFudCBPUEFRVUUgcmVwcmVzZW50cyBjb21wbGV0ZWx5IG9wYXF1ZSBkYXRhLAotICAgICAqIGFsbCBwaXhlbHMgaGF2ZSBhbiBhbHBoYSB2YWx1ZSBvZiAxLjAuIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBPUEFRVUUgcmVwcmVzZW50cyBjb21wbGV0ZWx5IG9wYXF1ZSBkYXRhLCBhbGwgcGl4ZWxzIGhhdmUgYW4KKyAgICAgKiBhbHBoYSB2YWx1ZSBvZiAxLjAuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BBUVVFID0gMTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgQklUTUFTSyByZXByZXNlbnRzIGRhdGEgd2hpY2ggY2FuIGJlIGVpdGhlciAKLSAgICAgKiBjb21wbGV0ZWx5IG9wYXF1ZSwgd2l0aCBhbiBhbHBoYSB2YWx1ZSBvZiAxLjAsIG9yIGNvbXBsZXRlbHkgCi0gICAgICogdHJhbnNwYXJlbnQsIHdpdGggYW4gYWxwaGEgdmFsdWUgb2YgMC4wLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBCSVRNQVNLIHJlcHJlc2VudHMgZGF0YSB3aGljaCBjYW4gYmUgZWl0aGVyIGNvbXBsZXRlbHkKKyAgICAgKiBvcGFxdWUsIHdpdGggYW4gYWxwaGEgdmFsdWUgb2YgMS4wLCBvciBjb21wbGV0ZWx5IHRyYW5zcGFyZW50LCB3aXRoIGFuCisgICAgICogYWxwaGEgdmFsdWUgb2YgMC4wLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJVE1BU0sgPSAyOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBUUkFOU0xVQ0VOVCByZXByZXNlbnRzIGRhdGEgd2hpY2ggYWxwaGEgdmFsdWUKLSAgICAgKiBjYW4gdmFyeSBiZXR3ZWVuIGFuZCBpbmNsdWRpbmcgMC4wIGFuZCAxLjAuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRSQU5TTFVDRU5UIHJlcHJlc2VudHMgZGF0YSB3aGljaCBhbHBoYSB2YWx1ZSBjYW4gdmFyeQorICAgICAqIGJldHdlZW4gYW5kIGluY2x1ZGluZyAwLjAgYW5kIDEuMC4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUkFOU0xVQ0VOVCA9IDM7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSB0cmFuc3BhcmVuY3kgbW9kZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0cmFuc3BhcmVuY3kgbW9kZTogT1BBUVVFLCBCSVRNQVNLIG9yIFRSQU5TTFVDRU5ULiAgCisgICAgICogQHJldHVybiB0aGUgdHJhbnNwYXJlbmN5IG1vZGU6IE9QQVFVRSwgQklUTUFTSyBvciBUUkFOU0xVQ0VOVC4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFRyYW5zcGFyZW5jeSgpOwogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9jb2xvci9DTU1FeGNlcHRpb24uamF2YSBiL2F3dC9qYXZhL2F3dC9jb2xvci9DTU1FeGNlcHRpb24uamF2YQppbmRleCAxNmZlNzZlLi4xOGI5YTdlIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvY29sb3IvQ01NRXhjZXB0aW9uLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2NvbG9yL0NNTUV4Y2VwdGlvbi5qYXZhCkBAIC0yMSwxOCArMjEsMjIgQEAKIHBhY2thZ2UgamF2YS5hd3QuY29sb3I7CiAKIC8qKgotICogVGhlIENNTUV4Y2VwdGlvbiBpcyB0aHJvd24gYXMgc29vbiBhcyBhIG5hdGl2ZSBDTU0gZXJyb3IKLSAqIG9jY3VyZXMuCisgKiBUaGUgQ01NRXhjZXB0aW9uIGlzIHRocm93biBhcyBzb29uIGFzIGEgbmF0aXZlIENNTSBlcnJvciBvY2N1cnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQ01NRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24gewogICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgc2VyaWFsVmVyc2lvblVJRC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgc2VyaWFsVmVyc2lvblVJRC4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1Nzc1NTU4MDQ0MTQyOTk0OTY1TDsKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBDTU0gZXhjZXB0aW9uIHdpdGggZGV0YWlsIG1lc3NhZ2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIHMgdGhlIFN0cmluZyAtIGRldGFpbCBtZXNzYWdlLgorICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2Ugb2YgdGhlIGV4Y2VwdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgQ01NRXhjZXB0aW9uIChTdHJpbmcgcykgewogICAgICAgICBzdXBlciAocyk7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvY29sb3IvQ29sb3JTcGFjZS5qYXZhIGIvYXd0L2phdmEvYXd0L2NvbG9yL0NvbG9yU3BhY2UuamF2YQppbmRleCBmOTYxNTE0Li40NGM0OTFiIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvY29sb3IvQ29sb3JTcGFjZS5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9jb2xvci9Db2xvclNwYWNlLmphdmEKQEAgLTI2LDEzMSArMjYsMjA5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogVGhlIENvbG9yU3BhY2UgY2xhc3MgZGVmaW5lcyBhIGNvbG9yIHNwYWNlIHR5cGUgZm9yIGEgQ29sb3IgYW5kIHByb3ZpZGVzIG1ldGhvZHMKLSAqIGZvciBhcnJheXMgb2YgY29sb3IgY29tcG9uZW50IG9wZXJhdGlvbnMuCisgKiBUaGUgQ29sb3JTcGFjZSBjbGFzcyBkZWZpbmVzIGEgY29sb3Igc3BhY2UgdHlwZSBmb3IgYSBDb2xvciBhbmQgcHJvdmlkZXMKKyAqIG1ldGhvZHMgZm9yIGFycmF5cyBvZiBjb2xvciBjb21wb25lbnQgb3BlcmF0aW9ucy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb2xvclNwYWNlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKIAogICAgIC8qKiBUaGUgQ29uc3RhbnQgc2VyaWFsVmVyc2lvblVJRC4gKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDA5NDUyNzA0MzA4Njg5NzI0TDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgVFlQRV9YWVogaW5kaWNhdGVzIFhZWiBjb2xvciBzcGFjZSB0eXBlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX1hZWiBpbmRpY2F0ZXMgWFlaIGNvbG9yIHNwYWNlIHR5cGUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9YWVogPSAwOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBUWVBFX0xhYiBpbmRpY2F0ZXMgTGFiIGNvbG9yIHNwYWNlIHR5cGUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfTGFiIGluZGljYXRlcyBMYWIgY29sb3Igc3BhY2UgdHlwZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0xhYiA9IDE7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFRZUEVfTHV2IGluZGljYXRlcyBMdXYgY29sb3Igc3BhY2UgdHlwZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9MdXYgaW5kaWNhdGVzIEx1diBjb2xvciBzcGFjZSB0eXBlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfTHV2ID0gMjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgVFlQRV9ZQ2JDciBpbmRpY2F0ZXMgWUNiQ3IgY29sb3Igc3BhY2UgdHlwZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9ZQ2JDciBpbmRpY2F0ZXMgWUNiQ3IgY29sb3Igc3BhY2UgdHlwZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1lDYkNyID0gMzsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgVFlQRV9ZeHkgaW5kaWNhdGVzIFl4eSBjb2xvciBzcGFjZSB0eXBlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX1l4eSBpbmRpY2F0ZXMgWXh5IGNvbG9yIHNwYWNlIHR5cGUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9ZeHkgPSA0OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBUWVBFX1JHQiBpbmRpY2F0ZXMgUkdCIGNvbG9yIHNwYWNlIHR5cGUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfUkdCIGluZGljYXRlcyBSR0IgY29sb3Igc3BhY2UgdHlwZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1JHQiA9IDU7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFRZUEVfR1JBWSBpbmRpY2F0ZXMgR3JheSBjb2xvciBzcGFjZSB0eXBlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX0dSQVkgaW5kaWNhdGVzIEdyYXkgY29sb3Igc3BhY2UgdHlwZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0dSQVkgPSA2OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBUWVBFX0hTViBpbmRpY2F0ZXMgSFNWIGNvbG9yIHNwYWNlIHR5cGUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfSFNWIGluZGljYXRlcyBIU1YgY29sb3Igc3BhY2UgdHlwZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0hTViA9IDc7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFRZUEVfSExTIGluZGljYXRlcyBITFMgY29sb3Igc3BhY2UgdHlwZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9ITFMgaW5kaWNhdGVzIEhMUyBjb2xvciBzcGFjZSB0eXBlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfSExTID0gODsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgVFlQRV9DTVlLIGluZGljYXRlcyBDTVlLIGNvbG9yIHNwYWNlIHR5cGUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfQ01ZSyBpbmRpY2F0ZXMgQ01ZSyBjb2xvciBzcGFjZSB0eXBlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfQ01ZSyA9IDk7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFRZUEVfQ01ZIGluZGljYXRlcyBDTVkgY29sb3Igc3BhY2UgdHlwZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9DTVkgaW5kaWNhdGVzIENNWSBjb2xvciBzcGFjZSB0eXBlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfQ01ZID0gMTE7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFRZUEVfMkNMUiBpbmRpY2F0ZXMgY29sb3Igc3BhY2VzIHdpdGggMiBjb21wb25lbnRzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFXzJDTFIgaW5kaWNhdGVzIGNvbG9yIHNwYWNlcyB3aXRoIDIgY29tcG9uZW50cy4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFXzJDTFIgPSAxMjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgVFlQRV8zQ0xSIGluZGljYXRlcyBjb2xvciBzcGFjZXMgd2l0aCAzIGNvbXBvbmVudHMuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfM0NMUiBpbmRpY2F0ZXMgY29sb3Igc3BhY2VzIHdpdGggMyBjb21wb25lbnRzLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfM0NMUiA9IDEzOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBUWVBFXzRDTFIgaW5kaWNhdGVzIGNvbG9yIHNwYWNlcyB3aXRoIDQgY29tcG9uZW50cy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV80Q0xSIGluZGljYXRlcyBjb2xvciBzcGFjZXMgd2l0aCA0IGNvbXBvbmVudHMuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV80Q0xSID0gMTQ7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFRZUEVfNUNMUiBpbmRpY2F0ZXMgY29sb3Igc3BhY2VzIHdpdGggNSBjb21wb25lbnRzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFXzVDTFIgaW5kaWNhdGVzIGNvbG9yIHNwYWNlcyB3aXRoIDUgY29tcG9uZW50cy4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFXzVDTFIgPSAxNTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgVFlQRV82Q0xSIGluZGljYXRlcyBjb2xvciBzcGFjZXMgd2l0aCA2IGNvbXBvbmVudHMuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfNkNMUiBpbmRpY2F0ZXMgY29sb3Igc3BhY2VzIHdpdGggNiBjb21wb25lbnRzLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfNkNMUiA9IDE2OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBUWVBFXzdDTFIgaW5kaWNhdGVzIGNvbG9yIHNwYWNlcyB3aXRoIDcgY29tcG9uZW50cy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV83Q0xSIGluZGljYXRlcyBjb2xvciBzcGFjZXMgd2l0aCA3IGNvbXBvbmVudHMuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV83Q0xSID0gMTc7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFRZUEVfOENMUiBpbmRpY2F0ZXMgY29sb3Igc3BhY2VzIHdpdGggOCBjb21wb25lbnRzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFXzhDTFIgaW5kaWNhdGVzIGNvbG9yIHNwYWNlcyB3aXRoIDggY29tcG9uZW50cy4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFXzhDTFIgPSAxODsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgVFlQRV85Q0xSIGluZGljYXRlcyBjb2xvciBzcGFjZXMgd2l0aCA5IGNvbXBvbmVudHMuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfOUNMUiBpbmRpY2F0ZXMgY29sb3Igc3BhY2VzIHdpdGggOSBjb21wb25lbnRzLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfOUNMUiA9IDE5OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBUWVBFX0FDTFIgaW5kaWNhdGVzIGNvbG9yIHNwYWNlcyB3aXRoIDEwIGNvbXBvbmVudHMuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfQUNMUiBpbmRpY2F0ZXMgY29sb3Igc3BhY2VzIHdpdGggMTAgY29tcG9uZW50cy4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0FDTFIgPSAyMDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgVFlQRV9CQ0xSIGluZGljYXRlcyBjb2xvciBzcGFjZXMgd2l0aCAxMSBjb21wb25lbnRzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX0JDTFIgaW5kaWNhdGVzIGNvbG9yIHNwYWNlcyB3aXRoIDExIGNvbXBvbmVudHMuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9CQ0xSID0gMjE7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFRZUEVfQ0NMUiBpbmRpY2F0ZXMgY29sb3Igc3BhY2VzIHdpdGggMTIgY29tcG9uZW50cy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9DQ0xSIGluZGljYXRlcyBjb2xvciBzcGFjZXMgd2l0aCAxMiBjb21wb25lbnRzLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfQ0NMUiA9IDIyOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBUWVBFX0RDTFIgaW5kaWNhdGVzIGNvbG9yIHNwYWNlcyB3aXRoIDEzIGNvbXBvbmVudHMuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfRENMUiBpbmRpY2F0ZXMgY29sb3Igc3BhY2VzIHdpdGggMTMgY29tcG9uZW50cy4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0RDTFIgPSAyMzsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgVFlQRV9FQ0xSIGluZGljYXRlcyBjb2xvciBzcGFjZXMgd2l0aCAxNCBjb21wb25lbnRzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX0VDTFIgaW5kaWNhdGVzIGNvbG9yIHNwYWNlcyB3aXRoIDE0IGNvbXBvbmVudHMuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9FQ0xSID0gMjQ7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFRZUEVfRkNMUiBpbmRpY2F0ZXMgY29sb3Igc3BhY2VzIHdpdGggMTUgY29tcG9uZW50cy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9GQ0xSIGluZGljYXRlcyBjb2xvciBzcGFjZXMgd2l0aCAxNSBjb21wb25lbnRzLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfRkNMUiA9IDI1OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBDU19zUkdCIGluZGljYXRlcyBzdGFuZGFyZCBSR0IgY29sb3Igc3BhY2UuKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgQ1Nfc1JHQiBpbmRpY2F0ZXMgc3RhbmRhcmQgUkdCIGNvbG9yIHNwYWNlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENTX3NSR0IgPSAxMDAwOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBDU19MSU5FQVJfUkdCIGluZGljYXRlcyBsaW5lYXIgUkdCIGNvbG9yIHNwYWNlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBDU19MSU5FQVJfUkdCIGluZGljYXRlcyBsaW5lYXIgUkdCIGNvbG9yIHNwYWNlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENTX0xJTkVBUl9SR0IgPSAxMDA0OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBDU19DSUVYWVogaW5kaWNhdGVzIENJRVhZWiBjb252ZXJzaW9uIGNvbG9yIHNwYWNlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBDU19DSUVYWVogaW5kaWNhdGVzIENJRVhZWiBjb252ZXJzaW9uIGNvbG9yIHNwYWNlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENTX0NJRVhZWiA9IDEwMDE7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IENTX1BZQ0MgaW5kaWNhdGVzIFBob3RvIFlDQyBjb252ZXJzaW9uIGNvbG9yIHNwYWNlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBDU19QWUNDIGluZGljYXRlcyBQaG90byBZQ0MgY29udmVyc2lvbiBjb2xvciBzcGFjZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDU19QWUNDID0gMTAwMjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgQ1NfR1JBWSBpbmRpY2F0ZXMgbGluZWFyIGdyYXkgc2NhbGUgY29sb3Igc3BhY2UuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IENTX0dSQVkgaW5kaWNhdGVzIGxpbmVhciBncmF5IHNjYWxlIGNvbG9yIHNwYWNlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENTX0dSQVkgPSAxMDAzOwogCi0gICAgLyoqIFRoZSBjc18gZ3JheS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY3NfIGdyYXkuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgQ29sb3JTcGFjZSBjc19HcmF5ID0gbnVsbDsKICAgICAKLSAgICAvKiogVGhlIGNzXyBweWNjLiAqLworICAgIC8qKgorICAgICAqIFRoZSBjc18gcHljYy4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBDb2xvclNwYWNlIGNzX1BZQ0MgPSBudWxsOwogICAgIAotICAgIC8qKiBUaGUgY3NfIGNpZXh5ei4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY3NfIGNpZXh5ei4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBDb2xvclNwYWNlIGNzX0NJRVhZWiA9IG51bGw7CiAgICAgCi0gICAgLyoqIFRoZSBjc18gbHJnYi4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY3NfIGxyZ2IuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgQ29sb3JTcGFjZSBjc19MUkdCID0gbnVsbDsKICAgICAKLSAgICAvKiogVGhlIGNzX3MgcmdiLiAqLworICAgIC8qKgorICAgICAqIFRoZSBjc19zIHJnYi4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBDb2xvclNwYWNlIGNzX3NSR0IgPSBudWxsOwogCi0gICAgLyoqIFRoZSB0eXBlLiAqLworICAgIC8qKgorICAgICAqIFRoZSB0eXBlLgorICAgICAqLwogICAgIHByaXZhdGUgaW50IHR5cGU7CiAgICAgCi0gICAgLyoqIFRoZSBudW0gY29tcG9uZW50cy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgbnVtIGNvbXBvbmVudHMuCisgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgbnVtQ29tcG9uZW50czsKIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIENvbG9yU3BhY2Ugd2l0aCB0aGUgc3BlY2lmaWVkCi0gICAgICogQ29sb3JTcGFjZSB0eXBlIGFuZCBudW1iZXIgb2YgY29tcG9uZW50cy4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBDb2xvclNwYWNlIHdpdGggdGhlIHNwZWNpZmllZCBDb2xvclNwYWNlIHR5cGUgYW5kIG51bWJlcgorICAgICAqIG9mIGNvbXBvbmVudHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgY29sb3Igc3BhY2UuCi0gICAgICogQHBhcmFtIG51bWNvbXBvbmVudHMgdGhlIG51bWJlciBvZiBjb21wb25lbnRzLgorICAgICAqIEBwYXJhbSB0eXBlCisgICAgICogICAgICAgICAgICB0aGUgdHlwZSBvZiBjb2xvciBzcGFjZS4KKyAgICAgKiBAcGFyYW0gbnVtY29tcG9uZW50cworICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb21wb25lbnRzLgogICAgICAqLwogICAgIHByb3RlY3RlZCBDb2xvclNwYWNlKGludCB0eXBlLCBpbnQgbnVtY29tcG9uZW50cykgewogICAgICAgICB0aGlzLm51bUNvbXBvbmVudHMgPSBudW1jb21wb25lbnRzOwpAQCAtMTYwLDggKzIzOCw4IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgY29tcG9uZW50IGZvciB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudCBpbmRleC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWR4IHRoZSBpbmRleCBvZiB0aGUgY29tcG9uZW50LgotICAgICAqIAorICAgICAqIEBwYXJhbSBpZHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29tcG9uZW50LgogICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudC4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoaW50IGlkeCkgewpAQCAtMTc0LDU2ICsyNTIsNTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQZXJmb3JtIHRyYW5zZm9ybWF0aW9uIGEgY29sb3IgZnJvbSB0aGlzIENvbG9yU3BhY2UgCi0gICAgICogaW50byB0aGUgUkdCIGNvbG9yIHNwYWNlLgorICAgICAqIFBlcmZvcm1zIHRoZSB0cmFuc2Zvcm1hdGlvbiBvZiBhIGNvbG9yIGZyb20gdGhpcyBDb2xvclNwYWNlIGludG8gdGhlIFJHQgorICAgICAqIGNvbG9yIHNwYWNlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xvcnZhbHVlIHRoZSBjb2xvciB2YWx1ZSBpbiB0aGlzIENvbG9yU3BhY2UuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZmxvYXQgYXJyYXkgd2l0aCBjb2xvciBjb21wb25lbnRzIGluIHRoZSAKLSAgICAgKiBSR0IgY29sb3Igc3BhY2UuCisgICAgICogQHBhcmFtIGNvbG9ydmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2xvciB2YWx1ZSBpbiB0aGlzIENvbG9yU3BhY2UuCisgICAgICogQHJldHVybiB0aGUgZmxvYXQgYXJyYXkgd2l0aCBjb2xvciBjb21wb25lbnRzIGluIHRoZSBSR0IgY29sb3Igc3BhY2UuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGZsb2F0W10gdG9SR0IoZmxvYXRbXSBjb2xvcnZhbHVlKTsKIAogICAgIC8qKgotICAgICAqIFBlcmZvcm0gdHJhbnNmb3JtYXRpb24gYSBjb2xvciBmcm9tIHRoaXMgQ29sb3JTcGFjZSAKLSAgICAgKiBpbnRvIHRoZSBDU19DSUVYWVogY29sb3Igc3BhY2UuCisgICAgICogUGVyZm9ybXMgdGhlIHRyYW5zZm9ybWF0aW9uIG9mIGEgY29sb3IgZnJvbSB0aGlzIENvbG9yU3BhY2UgaW50byB0aGUKKyAgICAgKiBDU19DSUVYWVogY29sb3Igc3BhY2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNvbG9ydmFsdWUgdGhlIGNvbG9yIHZhbHVlIGluIHRoaXMgQ29sb3JTcGFjZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBmbG9hdCBhcnJheSB3aXRoIGNvbG9yIGNvbXBvbmVudHMgaW4gdGhlIAotICAgICAqIENTX0NJRVhZWiBjb2xvciBzcGFjZS4gCisgICAgICogQHBhcmFtIGNvbG9ydmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2xvciB2YWx1ZSBpbiB0aGlzIENvbG9yU3BhY2UuCisgICAgICogQHJldHVybiB0aGUgZmxvYXQgYXJyYXkgd2l0aCBjb2xvciBjb21wb25lbnRzIGluIHRoZSBDU19DSUVYWVogY29sb3IKKyAgICAgKiAgICAgICAgIHNwYWNlLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBmbG9hdFtdIHRvQ0lFWFlaKGZsb2F0W10gY29sb3J2YWx1ZSk7CiAKICAgICAvKioKLSAgICAgKiBQZXJmb3JtcyBjb2xvciB0cmFuc2Zvcm1hdGlvbiBmcm9tIHRoZSBSR0IgY29sb3Igc3BhY2UgCi0gICAgICogaW50byB0aGlzIENvbG9yU3BhY2UuCisgICAgICogUGVyZm9ybXMgdGhlIHRyYW5zZm9ybWF0aW9uIG9mIGEgY29sb3IgZnJvbSB0aGUgUkdCIGNvbG9yIHNwYWNlIGludG8gdGhpcworICAgICAqIENvbG9yU3BhY2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIHJnYnZhbHVlIGEgZmxvYXQgYXJyYXkgaW4gdGhlIFJHQiBjb2xvciBzcGFjZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBmbG9hdFtdIGFuIGFycmF5IG9mIHRyYW5zZm9ybWVkIGNvbG9yCi0gICAgICogY29tcG9uZW50cy4gCisgICAgICogQHBhcmFtIHJnYnZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgZmxvYXQgYXJyYXkgcmVwcmVzZW50aW5nIGEgY29sb3IgaW4gdGhlIFJHQiBjb2xvciBzcGFjZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBmbG9hdCBhcnJheSB3aXRoIHRoZSB0cmFuc2Zvcm1lZCBjb2xvciBjb21wb25lbnRzLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBmbG9hdFtdIGZyb21SR0IoZmxvYXRbXSByZ2J2YWx1ZSk7CiAKICAgICAvKioKLSAgICAgKiBQZXJmb3JtcyBjb2xvciB0cmFuc2Zvcm1hdGlvbiBmcm9tIHRoZSBDU19DSUVYWVogY29sb3Igc3BhY2UgCisgICAgICogUGVyZm9ybXMgdGhlIHRyYW5zZm9ybWF0aW9uIG9mIGEgY29sb3IgZnJvbSB0aGUgQ1NfQ0lFWFlaIGNvbG9yIHNwYWNlCiAgICAgICogaW50byB0aGlzIENvbG9yU3BhY2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNvbG9ydmFsdWUgYSBmbG9hdCBhcnJheSBpbiB0aGUgQ1NfQ0lFWFlaIGNvbG9yIHNwYWNlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZsb2F0W10gYW4gYXJyYXkgb2YgdHJhbnNmb3JtZWQgY29sb3IKLSAgICAgKiBjb21wb25lbnRzLiAKKyAgICAgKiBAcGFyYW0gY29sb3J2YWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIGZsb2F0IGFycmF5IHJlcHJlc2VudGluZyBhIGNvbG9yIGluIHRoZSBDU19DSUVYWVogY29sb3IKKyAgICAgKiAgICAgICAgICAgIHNwYWNlLgorICAgICAqIEByZXR1cm4gdGhlIGZsb2F0IGFycmF5IHdpdGggdGhlIHRyYW5zZm9ybWVkIGNvbG9yIGNvbXBvbmVudHMuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGZsb2F0W10gZnJvbUNJRVhZWihmbG9hdFtdIGNvbG9ydmFsdWUpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWluaW11bSBub3JtYWxpemVkIGNvbG9yIGNvbXBvbmVudCB2YWx1ZSBmb3IgCi0gICAgICogdGhlIHNwZWNpZmllZCBjb21wb25lbnQuCisgICAgICogR2V0cyB0aGUgbWluaW11bSBub3JtYWxpemVkIGNvbG9yIGNvbXBvbmVudCB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZAorICAgICAqIGNvbXBvbmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29tcG9uZW50IHRoZSBjb21wb25lbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWluaWltdW0gbm9ybWFsaXplZCB2YWx1ZSBvZiB0aGUgY29tcG9uZW50LgorICAgICAqIEBwYXJhbSBjb21wb25lbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb21wb25lbnQgdG8gZGV0ZXJtaW5lIHRoZSBtaW5pbXVtIHZhbHVlLgorICAgICAqIEByZXR1cm4gdGhlIG1pbmltdW0gbm9ybWFsaXplZCB2YWx1ZSBvZiB0aGUgY29tcG9uZW50LgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdCBnZXRNaW5WYWx1ZShpbnQgY29tcG9uZW50KSB7CiAgICAgICAgIGlmIChjb21wb25lbnQgPCAwIHx8IGNvbXBvbmVudCA+IG51bUNvbXBvbmVudHMgLSAxKSB7CkBAIC0yMzQsMTEgKzMxMCwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1heGltdW0gbm9ybWFsaXplZCBjb2xvciBjb21wb25lbnQgdmFsdWUgZm9yIAotICAgICAqIHRoZSBzcGVjaWZpZWQgY29tcG9uZW50LgorICAgICAqIEdldHMgdGhlIG1heGltdW0gbm9ybWFsaXplZCBjb2xvciBjb21wb25lbnQgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBjb21wb25lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNvbXBvbmVudCB0aGUgY29tcG9uZW50LgotICAgICAqIAorICAgICAqIEBwYXJhbSBjb21wb25lbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb21wb25lbnQgdG8gZGV0ZXJtaW5lIHRoZSBtYXhpbXVtIHZhbHVlLgogICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0gbm9ybWFsaXplZCB2YWx1ZSBvZiB0aGUgY29tcG9uZW50LgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdCBnZXRNYXhWYWx1ZShpbnQgY29tcG9uZW50KSB7CkBAIC0yNTIsOCArMzI4LDcgQEAKICAgICAvKioKICAgICAgKiBDaGVja3MgaWYgdGhpcyBDb2xvclNwYWNlIGhhcyBDU19zUkdCIHR5cGUgb3Igbm90LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBDb2xvclNwYWNlIGhhcyBDU19zUkdCIHR5cGUsIAotICAgICAqIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgQ29sb3JTcGFjZSBoYXMgQ1Nfc1JHQiB0eXBlLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNDU19zUkdCKCkgewogICAgICAgICAvLyBJZiBvdXIgY29sb3Igc3BhY2UgaXMgc1JHQiwgdGhlbiBjc19zUkdCCkBAIC0yODEsMTIgKzM1NiwxMSBAQAogCiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzaW5nbGUgaW5zdGFuY2Ugb2YgQ29sb3JTcGFjZSB3aXRoIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBDb2xvclNwYWNlOiBDU19zUkdCLCBDU19MSU5FQVJfUkdCLCBDU19DSUVYWVosIENTX0dSQVksIAotICAgICAqIG9yIENTX1BZQ0MuCisgICAgICogR2V0cyB0aGUgc2luZ2xlIGluc3RhbmNlIG9mIENvbG9yU3BhY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIENvbG9yU3BhY2U6CisgICAgICogQ1Nfc1JHQiwgQ1NfTElORUFSX1JHQiwgQ1NfQ0lFWFlaLCBDU19HUkFZLCBvciBDU19QWUNDLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xvcnNwYWNlIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBzcGVjaWZpZWQgQ29sb3JzcGFjZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29sb3JzcGFjZQorICAgICAqICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgb2YgdGhlIHNwZWNpZmllZCBDb2xvcnNwYWNlLgogICAgICAqIEByZXR1cm4gdGhlIHNpbmdsZSBpbnN0YW5jZSBvZiB0aGUgZGVzaXJlZCBDb2xvclNwYWNlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQ29sb3JTcGFjZSBnZXRJbnN0YW5jZShpbnQgY29sb3JzcGFjZSkgewpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2NvbG9yL0lDQ19Db2xvclNwYWNlLmphdmEgYi9hd3QvamF2YS9hd3QvY29sb3IvSUNDX0NvbG9yU3BhY2UuamF2YQppbmRleCA1ZWNlMmVmLi41YjRkN2U5IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvY29sb3IvSUNDX0NvbG9yU3BhY2UuamF2YQorKysgYi9hd3QvamF2YS9hd3QvY29sb3IvSUNDX0NvbG9yU3BhY2UuamF2YQpAQCAtMjgsMTkgKzI4LDI0IEBACiBpbXBvcnQgamF2YS5pby4qOwogCiAvKioKLSAqIElDQ19Db2xvclNwYWNlIGNsYXNzIGltcGxlbWVudHMgQ29sb3JTcGFjZSBhYnN0cmFjdCBjbGFzcyBhbmQgCi0gKiByZXByZXNlbnRzIGRldmljZSBpbmRlcGVuZGVudCBhbmQgZGV2aWNlIGRlcGVuZGVudCBjb2xvciBzcGFjZXMuCi0gKiBUaGlzIGNvbG9yIHNwYWNlIGlzIGJhc2VkIG9uIHRoZSBJbnRlcm5hdGlvbmFsIENvbG9yIENvbnNvcnRpdW0gCi0gKiBTcGVjaWZpY2F0aW9uIChJQ0MpIEZpbGUgRm9ybWF0IGZvciBDb2xvciBQcm9maWxlczogCi0gKiA8YSBocmVmPSJodHRwOi8vd3d3LmNvbG9yLm9yZyI+aHR0cDovL3d3dy5jb2xvci5vcmc8L2E+CisgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIGFic3RyYWN0IGNsYXNzIENvbG9yU3BhY2UgYW5kIHJlcHJlc2VudHMgZGV2aWNlCisgKiBpbmRlcGVuZGVudCBhbmQgZGV2aWNlIGRlcGVuZGVudCBjb2xvciBzcGFjZXMuIFRoaXMgY29sb3Igc3BhY2UgaXMgYmFzZWQgb24KKyAqIHRoZSBJbnRlcm5hdGlvbmFsIENvbG9yIENvbnNvcnRpdW0gU3BlY2lmaWNhdGlvbiAoSUNDKSBGaWxlIEZvcm1hdCBmb3IgQ29sb3IKKyAqIFByb2ZpbGVzOiA8YSBocmVmPSJodHRwOi8vd3d3LmNvbG9yLm9yZyI+aHR0cDovL3d3dy5jb2xvci5vcmc8L2E+CisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSUNDX0NvbG9yU3BhY2UgZXh0ZW5kcyBDb2xvclNwYWNlIHsKICAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzQ1NTg4OTExNDA3MDQzMTQ4M0w7CiAKICAgICAvLyBOZWVkIHRvIGtlZXAgY29tcGF0aWJpbGl0eSB3aXRoIHNlcmlhbGl6ZWQgZm9ybQotICAgIC8qKiBUaGUgQ29uc3RhbnQgc2VyaWFsUGVyc2lzdGVudEZpZWxkcy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgc2VyaWFsUGVyc2lzdGVudEZpZWxkcy4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RTdHJlYW1GaWVsZFtdCiAgICAgICBzZXJpYWxQZXJzaXN0ZW50RmllbGRzID0gewogICAgICAgICBuZXcgT2JqZWN0U3RyZWFtRmllbGQoInRoaXNQcm9maWxlIiwgSUNDX1Byb2ZpbGUuY2xhc3MpLCAvLyROT04tTkxTLTEkCkBAIC01Myw2MyArNTgsOTQgQEAKIAogCiAgICAvKioKLSAgICAqIEFjY29yZGluZyB0byBJQ0Mgc3BlY2lmaWNhdGlvbiAoZnJvbSBodHRwOi8vd3d3LmNvbG9yLm9yZykKLSAgICAqICJGb3IgdGhlIENJRVhZWiBlbmNvZGluZywgZWFjaCBjb21wb25lbnQgKFgsIFksIGFuZCBaKQotICAgICogaXMgZW5jb2RlZCBhcyBhIHUxRml4ZWQxNU51bWJlciIuCi0gICAgKiBUaGlzIG1lYW5zIHRoYXQgbWF4IHZhbHVlIGZvciB0aGlzIGVuY29kaW5nIGlzIDEgKyAoMzI3NjcvMzI3NjgpCi0gICAgKi8KKyAgICAgKiBBY2NvcmRpbmcgdG8gSUNDIHNwZWNpZmljYXRpb24gKGZyb20gaHR0cDovL3d3dy5jb2xvci5vcmcpICJGb3IgdGhlCisgICAgICogQ0lFWFlaIGVuY29kaW5nLCBlYWNoIGNvbXBvbmVudCAoWCwgWSwgYW5kIFopIGlzIGVuY29kZWQgYXMgYQorICAgICAqIHUxRml4ZWQxNU51bWJlciIuIFRoaXMgbWVhbnMgdGhhdCBtYXggdmFsdWUgZm9yIHRoaXMgZW5jb2RpbmcgaXMgMSArCisgICAgICogKDMyNzY3LzMyNzY4KQorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IE1BWF9YWVogPSAxZiArICgzMjc2N2YvMzI3NjhmKTsKICAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IE1BWF9TSE9SVC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgTUFYX1NIT1JULgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IE1BWF9TSE9SVCA9IDY1NTM1ZjsKICAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IElOVl9NQVhfU0hPUlQuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IElOVl9NQVhfU0hPUlQuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgSU5WX01BWF9TSE9SVCA9IDFmL01BWF9TSE9SVDsKICAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IFNIT1JUMlhZWl9GQUNUT1IuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFNIT1JUMlhZWl9GQUNUT1IuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgU0hPUlQyWFlaX0ZBQ1RPUiA9IE1BWF9YWVovTUFYX1NIT1JUOwogICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgWFlaMlNIT1JUX0ZBQ1RPUi4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgWFlaMlNIT1JUX0ZBQ1RPUi4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBYWVoyU0hPUlRfRkFDVE9SID0gTUFYX1NIT1JUL01BWF9YWVo7CiAKLSAgICAvKiogVGhlIHByb2ZpbGUuICovCisgICAgLyoqCisgICAgICogVGhlIHByb2ZpbGUuCisgICAgICovCiAgICAgcHJpdmF0ZSBJQ0NfUHJvZmlsZSBwcm9maWxlID0gbnVsbDsKICAgICAKLSAgICAvKiogVGhlIG1pbiB2YWx1ZXMuICovCisgICAgLyoqCisgICAgICogVGhlIG1pbiB2YWx1ZXMuCisgICAgICovCiAgICAgcHJpdmF0ZSBmbG9hdCBtaW5WYWx1ZXNbXSA9IG51bGw7CiAgICAgCi0gICAgLyoqIFRoZSBtYXggdmFsdWVzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBtYXggdmFsdWVzLgorICAgICAqLwogICAgIHByaXZhdGUgZmxvYXQgbWF4VmFsdWVzW10gPSBudWxsOwogCiAgICAgLy8gY2FjaGUgdHJhbnNmb3JtcyBoZXJlIC0gcGVyZm9ybWFuY2UgZ2FpbgotICAgIC8qKiBUaGUgdG8gcmdiIHRyYW5zZm9ybS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgdG8gcmdiIHRyYW5zZm9ybS4KKyAgICAgKi8KICAgICBwcml2YXRlIElDQ19UcmFuc2Zvcm0gdG9SR0JUcmFuc2Zvcm0gPSBudWxsOwogICAgIAotICAgIC8qKiBUaGUgZnJvbSByZ2IgdHJhbnNmb3JtLiAqLworICAgIC8qKgorICAgICAqIFRoZSBmcm9tIHJnYiB0cmFuc2Zvcm0uCisgICAgICovCiAgICAgcHJpdmF0ZSBJQ0NfVHJhbnNmb3JtIGZyb21SR0JUcmFuc2Zvcm0gPSBudWxsOwogICAgIAotICAgIC8qKiBUaGUgdG8geHl6IHRyYW5zZm9ybS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgdG8geHl6IHRyYW5zZm9ybS4KKyAgICAgKi8KICAgICBwcml2YXRlIElDQ19UcmFuc2Zvcm0gdG9YWVpUcmFuc2Zvcm0gPSBudWxsOwogICAgIAotICAgIC8qKiBUaGUgZnJvbSB4eXogdHJhbnNmb3JtLiAqLworICAgIC8qKgorICAgICAqIFRoZSBmcm9tIHh5eiB0cmFuc2Zvcm0uCisgICAgICovCiAgICAgcHJpdmF0ZSBJQ0NfVHJhbnNmb3JtIGZyb21YWVpUcmFuc2Zvcm0gPSBudWxsOwogCi0gICAgLyoqIFRoZSBjb252ZXJ0ZXIuICovCisgICAgLyoqCisgICAgICogVGhlIGNvbnZlcnRlci4KKyAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIENvbG9yQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBDb2xvckNvbnZlcnRlcigpOwogICAgIAotICAgIC8qKiBUaGUgc2NhbGVyLiAqLworICAgIC8qKgorICAgICAqIFRoZSBzY2FsZXIuCisgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBDb2xvclNjYWxlciBzY2FsZXIgPSBuZXcgQ29sb3JTY2FsZXIoKTsKICAgICAKLSAgICAvKiogVGhlIHNjYWxpbmcgZGF0YSBsb2FkZWQuICovCisgICAgLyoqCisgICAgICogVGhlIHNjYWxpbmcgZGF0YSBsb2FkZWQuCisgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIHNjYWxpbmdEYXRhTG9hZGVkID0gZmFsc2U7CiAKLSAgICAvKiogVGhlIHJlc29sdmVkIGRlc2VyaWFsaXplZCBpbnN0LiAqLworICAgIC8qKgorICAgICAqIFRoZSByZXNvbHZlZCBkZXNlcmlhbGl6ZWQgaW5zdC4KKyAgICAgKi8KICAgICBwcml2YXRlIElDQ19Db2xvclNwYWNlIHJlc29sdmVkRGVzZXJpYWxpemVkSW5zdDsKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJQ0MgY29sb3Igc3BhY2UgZnJvbSBhbiBJQ0NfUHJvZmlsZSBvYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIHBmIHRoZSBJQ0NfUHJvZmlsZSBvYmplY3QuCisgICAgICogQHBhcmFtIHBmCisgICAgICogICAgICAgICAgICB0aGUgSUNDX1Byb2ZpbGUgb2JqZWN0LgogICAgICAqLwogICAgIHB1YmxpYyBJQ0NfQ29sb3JTcGFjZShJQ0NfUHJvZmlsZSBwZikgewogICAgICAgICBzdXBlcihwZi5nZXRDb2xvclNwYWNlVHlwZSgpLCBwZi5nZXROdW1Db21wb25lbnRzKCkpOwpAQCAtMTMyLDcgKzE2OCw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgSUNDX1Byb2ZpbGUgZm9yIHRoaXMgSUNDX0NvbG9yU3BhY2UuCisgICAgICogR2V0cyB0aGUgSUNDX1Byb2ZpbGUgZm9yIHRoaXMgSUNDX0NvbG9yU3BhY2UuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgSUNDX1Byb2ZpbGUgZm9yIHRoaXMgSUNDX0NvbG9yU3BhY2UuCiAgICAgICovCkBAIC0xNDQsNiArMTgwLDE0IEBACiAgICAgICAgIHJldHVybiBwcm9maWxlOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFBlcmZvcm1zIHRoZSB0cmFuc2Zvcm1hdGlvbiBvZiBhIGNvbG9yIGZyb20gdGhpcyBDb2xvclNwYWNlIGludG8gdGhlIFJHQgorICAgICAqIGNvbG9yIHNwYWNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb2xvcnZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgY29sb3IgdmFsdWUgaW4gdGhpcyBDb2xvclNwYWNlLgorICAgICAqIEByZXR1cm4gdGhlIGZsb2F0IGFycmF5IHdpdGggY29sb3IgY29tcG9uZW50cyBpbiB0aGUgUkdCIGNvbG9yIHNwYWNlLgorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmbG9hdFtdIHRvUkdCKGZsb2F0W10gY29sb3J2YWx1ZSkgewogICAgICAgICBpZiAodG9SR0JUcmFuc2Zvcm0gPT0gbnVsbCkgewpAQCAtMTc0LDYgKzIxOCwxNSBAQAogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFBlcmZvcm1zIHRoZSB0cmFuc2Zvcm1hdGlvbiBvZiBhIGNvbG9yIGZyb20gdGhpcyBDb2xvclNwYWNlIGludG8gdGhlCisgICAgICogQ1NfQ0lFWFlaIGNvbG9yIHNwYWNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb2xvcnZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgY29sb3IgdmFsdWUgaW4gdGhpcyBDb2xvclNwYWNlLgorICAgICAqIEByZXR1cm4gdGhlIGZsb2F0IGFycmF5IHdpdGggY29sb3IgY29tcG9uZW50cyBpbiB0aGUgQ1NfQ0lFWFlaIGNvbG9yCisgICAgICogICAgICAgICBzcGFjZS4KKyAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZmxvYXRbXSB0b0NJRVhZWihmbG9hdFtdIGNvbG9ydmFsdWUpIHsKICAgICAgICAgaWYgKHRvWFlaVHJhbnNmb3JtID09IG51bGwpIHsKQEAgLTIxMiw2ICsyNjUsMTQgQEAKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyB0aGUgdHJhbnNmb3JtYXRpb24gb2YgYSBjb2xvciBmcm9tIHRoZSBSR0IgY29sb3Igc3BhY2UgaW50byB0aGlzCisgICAgICogQ29sb3JTcGFjZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmdidmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdCBhcnJheSByZXByZXNlbnRpbmcgYSBjb2xvciBpbiB0aGUgUkdCIGNvbG9yIHNwYWNlLgorICAgICAqIEByZXR1cm4gdGhlIGZsb2F0IGFycmF5IHdpdGggdGhlIHRyYW5zZm9ybWVkIGNvbG9yIGNvbXBvbmVudHMuCisgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZsb2F0W10gZnJvbVJHQihmbG9hdFtdIHJnYnZhbHVlKSB7CiAgICAgICAgIGlmIChmcm9tUkdCVHJhbnNmb3JtID09IG51bGwpIHsKQEAgLTI0MSw2ICszMDIsMTUgQEAKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyB0aGUgdHJhbnNmb3JtYXRpb24gb2YgYSBjb2xvciBmcm9tIHRoZSBDU19DSUVYWVogY29sb3Igc3BhY2UKKyAgICAgKiBpbnRvIHRoaXMgQ29sb3JTcGFjZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0geHl6dmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdCBhcnJheSByZXByZXNlbnRpbmcgYSBjb2xvciBpbiB0aGUgQ1NfQ0lFWFlaIGNvbG9yCisgICAgICogICAgICAgICAgICBzcGFjZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBmbG9hdCBhcnJheSB3aXRoIHRoZSB0cmFuc2Zvcm1lZCBjb2xvciBjb21wb25lbnRzLgorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmbG9hdFtdIGZyb21DSUVYWVooZmxvYXRbXSB4eXp2YWx1ZSkgewogICAgICAgICBpZiAoZnJvbVhZWlRyYW5zZm9ybSA9PSBudWxsKSB7CkBAIC0yNzksNiArMzQ5LDE0IEBACiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbWluaW11bSBub3JtYWxpemVkIGNvbG9yIGNvbXBvbmVudCB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZAorICAgICAqIGNvbXBvbmVudC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29tcG9uZW50CisgICAgICogICAgICAgICAgICB0aGUgY29tcG9uZW50IHRvIGRldGVybWluZSB0aGUgbWluaW11bSB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBtaW5pbXVtIG5vcm1hbGl6ZWQgdmFsdWUgb2YgdGhlIGNvbXBvbmVudC4KKyAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZmxvYXQgZ2V0TWluVmFsdWUoaW50IGNvbXBvbmVudCkgewogICAgICAgICBpZiAoKGNvbXBvbmVudCA8IDApIHx8IChjb21wb25lbnQgPiB0aGlzLmdldE51bUNvbXBvbmVudHMoKSAtIDEpKSB7CkBAIC0yODksNiArMzY3LDE0IEBACiAgICAgICAgIHJldHVybiBtaW5WYWx1ZXNbY29tcG9uZW50XTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBtYXhpbXVtIG5vcm1hbGl6ZWQgY29sb3IgY29tcG9uZW50IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkCisgICAgICogY29tcG9uZW50LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb21wb25lbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb21wb25lbnQgdG8gZGV0ZXJtaW5lIHRoZSBtYXhpbXVtIHZhbHVlLgorICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0gbm9ybWFsaXplZCB2YWx1ZSBvZiB0aGUgY29tcG9uZW50LgorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmbG9hdCBnZXRNYXhWYWx1ZShpbnQgY29tcG9uZW50KSB7CiAgICAgICAgIGlmICgoY29tcG9uZW50IDwgMCkgfHwgKGNvbXBvbmVudCA+IHRoaXMuZ2V0TnVtQ29tcG9uZW50cygpIC0gMSkpIHsKQEAgLTMzNCw5ICs0MjAsMTAgQEAKICAgICAvKioKICAgICAgKiBXcml0ZSBvYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIG91dCB0aGUgb3V0Ci0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIG91dAorICAgICAqICAgICAgICAgICAgdGhlIG91dAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbS5QdXRGaWVsZCBmaWVsZHMgPSBvdXQucHV0RmllbGRzKCk7CkBAIC0zNTQsMTAgKzQ0MSwxMiBAQAogICAgIC8qKgogICAgICAqIFJlYWQgb2JqZWN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbiB0aGUgaW4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gdGhlIGNsYXNzIG5vdCBmb3VuZCBleGNlcHRpb24KKyAgICAgKiBAcGFyYW0gaW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgdGhlIGNsYXNzIG5vdCBmb3VuZCBleGNlcHRpb24KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKICAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0uR2V0RmllbGQgZmllbGRzID0gaW4ucmVhZEZpZWxkcygpOwpAQCAtMzY5LDggKzQ1OCw4IEBACiAgICAgICogUmVhZCByZXNvbHZlLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIG9iamVjdAotICAgICAqIAotICAgICAqIEB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHRoZSBvYmplY3Qgc3RyZWFtIGV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgdGhlIG9iamVjdCBzdHJlYW0gZXhjZXB0aW9uCiAgICAgICovCiAgICAgT2JqZWN0IHJlYWRSZXNvbHZlKCkgdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiByZXNvbHZlZERlc2VyaWFsaXplZEluc3Q7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvY29sb3IvSUNDX1Byb2ZpbGUuamF2YSBiL2F3dC9qYXZhL2F3dC9jb2xvci9JQ0NfUHJvZmlsZS5qYXZhCmluZGV4IGFkNzA0ZTAuLjhmZmVlNmMgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9jb2xvci9JQ0NfUHJvZmlsZS5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9jb2xvci9JQ0NfUHJvZmlsZS5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIE9sZWcgVi4gS2hhc2NoYW5za3kKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmNvbG9yOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtNDAsNDI3ICs0MSw2ODEgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBUaGUgSUNDX1Byb2ZpbGUgY2xhc3MgcmVwcmVzZW50cyBhIGNvbG9yIHByb2ZpbGUgZGF0YSBmb3IgY29sb3Igc3BhY2VzIAotICogYmFzZWQgb24gdGhlIEludGVybmF0aW9uYWwgQ29sb3IgQ29uc29ydGl1bSBTcGVjaWZpY2F0aW9uIElDQy4xOjIwMDEtMTIsIAotICogRmlsZSBGb3JtYXQgZm9yIENvbG9yIFByb2ZpbGVzLgorICogVGhlIElDQ19Qcm9maWxlIGNsYXNzIHJlcHJlc2VudHMgYSBjb2xvciBwcm9maWxlIGRhdGEgZm9yIGNvbG9yIHNwYWNlcyBiYXNlZAorICogb24gdGhlIEludGVybmF0aW9uYWwgQ29sb3IgQ29uc29ydGl1bSBTcGVjaWZpY2F0aW9uIElDQy4xOjIwMDEtMTIsIEZpbGUKKyAqIEZvcm1hdCBmb3IgQ29sb3IgUHJvZmlsZXMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSUNDX1Byb2ZpbGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewogCi0gICAgLyoqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zOTM4NTE1ODYxOTkwOTM2NzY2TDsKIAogICAgIC8vIE5PVEU6IENvbnN0YW50IGZpZWxkIHZhbHVlcyBhcmUgbm90ZWQgaW4gMS41IHNwZWNpZmljYXRpb24uCiAKICAgICAvKioKLSAgICAgKiBUaGUgQ29uc3RhbnQgQ0xBU1NfSU5QVVQgaW5kaWNhdGVzIHRoYXQgcHJvZmlsZSBjbGFzcyBpcyBpbnB1dC4gCisgICAgICogVGhlIENvbnN0YW50IENMQVNTX0lOUFVUIGluZGljYXRlcyB0aGF0IHByb2ZpbGUgY2xhc3MgaXMgaW5wdXQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfSU5QVVQgPSAwOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBDTEFTU19ESVNQTEFZIGluZGljYXRlcyB0aGF0IHByb2ZpbGUgY2xhc3MgaXMgZGlzcGxheS4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IENMQVNTX0RJU1BMQVkgaW5kaWNhdGVzIHRoYXQgcHJvZmlsZSBjbGFzcyBpcyBkaXNwbGF5LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMQVNTX0RJU1BMQVkgPSAxOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBDTEFTU19PVVRQVVQgaW5kaWNhdGVzIHRoYXQgcHJvZmlsZSBjbGFzcyBpcyBvdXRwdXQuIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBDTEFTU19PVVRQVVQgaW5kaWNhdGVzIHRoYXQgcHJvZmlsZSBjbGFzcyBpcyBvdXRwdXQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfT1VUUFVUID0gMjsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgQ0xBU1NfREVWSUNFTElOSyBpbmRpY2F0ZXMgdGhhdCBwcm9maWxlIGNsYXNzIAotICAgICAqIGlzIGRldmljZSBsaW5rLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgQ0xBU1NfREVWSUNFTElOSyBpbmRpY2F0ZXMgdGhhdCBwcm9maWxlIGNsYXNzIGlzIGRldmljZQorICAgICAqIGxpbmsuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfREVWSUNFTElOSyA9IDM7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IENMQVNTX0NPTE9SU1BBQ0VDT05WRVJTSU9OIGluZGljYXRlcyB0aGF0IHByb2ZpbGUgY2xhc3MgCi0gICAgICogaXMgY29sb3Igc3BhY2UgY29udmVyc2lvbi4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgQ0xBU1NfQ09MT1JTUEFDRUNPTlZFUlNJT04gaW5kaWNhdGVzIHRoYXQgcHJvZmlsZSBjbGFzcyBpcworICAgICAqIGNvbG9yIHNwYWNlIGNvbnZlcnNpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfQ09MT1JTUEFDRUNPTlZFUlNJT04gPSA0OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBDTEFTU19BQlNUUkFDVCBpbmRpY2F0ZXMgdGhhdCBwcm9maWxlIGNsYXNzIGlzIGFic3RyYWN0LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBDTEFTU19BQlNUUkFDVCBpbmRpY2F0ZXMgdGhhdCBwcm9maWxlIGNsYXNzIGlzIGFic3RyYWN0LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMQVNTX0FCU1RSQUNUID0gNTsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgQ0xBU1NfTkFNRURDT0xPUiBpbmRpY2F0ZXMgdGhhdCBwcm9maWxlIGNsYXNzIAotICAgICAqIGlzIG5hbWVkIGNvbG9yLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgQ0xBU1NfTkFNRURDT0xPUiBpbmRpY2F0ZXMgdGhhdCBwcm9maWxlIGNsYXNzIGlzIG5hbWVkCisgICAgICogY29sb3IuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfTkFNRURDT0xPUiA9IDY7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnWFlaRGF0YSAtIElDQyBQcm9maWxlIENvbG9yIFNwYWNlIFR5cGUgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ1hZWkRhdGEgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ1hZWkRhdGEgPSAxNDgyMjUwNzg0OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ0xhYkRhdGEgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdMYWJEYXRhIC0gSUNDIFByb2ZpbGUgQ29sb3IgU3BhY2UgVHlwZSBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdMYWJEYXRhID0gMTI4MTQ1MDUyODsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdMdXZEYXRhIC0gSUNDIFByb2ZpbGUgQ29sb3IgU3BhY2UgVHlwZSBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnTHV2RGF0YSAtIElDQyBQcm9maWxlIENvbG9yIFNwYWNlIFR5cGUgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnTHV2RGF0YSA9IDEyODI3NjYzNjg7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnWUNiQ3JEYXRhIC0gSUNDIFByb2ZpbGUgQ29sb3IgU3BhY2UgVHlwZSBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnWUNiQ3JEYXRhIC0gSUNDIFByb2ZpbGUgQ29sb3IgU3BhY2UgVHlwZSBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdZQ2JDckRhdGEgPSAxNDk3NTg4MzM4OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ1l4eURhdGEgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdZeHlEYXRhIC0gSUNDIFByb2ZpbGUgQ29sb3IgU3BhY2UgVHlwZSBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdZeHlEYXRhID0gMTUwMTA2NzU1MjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdSZ2JEYXRhIC0gSUNDIFByb2ZpbGUgQ29sb3IgU3BhY2UgVHlwZSBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnUmdiRGF0YSAtIElDQyBQcm9maWxlIENvbG9yIFNwYWNlIFR5cGUgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnUmdiRGF0YSA9IDEzODA0MDE2OTY7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnR3JheURhdGEgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdHcmF5RGF0YSAtIElDQyBQcm9maWxlIENvbG9yIFNwYWNlIFR5cGUgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnR3JheURhdGEgPSAxMTk2NTczMDE3OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ0hzdkRhdGEgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdIc3ZEYXRhIC0gSUNDIFByb2ZpbGUgQ29sb3IgU3BhY2UgVHlwZSBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdIc3ZEYXRhID0gMTIxMzQyMTA4ODsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdIbHNEYXRhIC0gSUNDIFByb2ZpbGUgQ29sb3IgU3BhY2UgVHlwZSBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnSGxzRGF0YSAtIElDQyBQcm9maWxlIENvbG9yIFNwYWNlIFR5cGUgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnSGxzRGF0YSA9IDEyMTI5NjE1Njg7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnQ215a0RhdGEgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdDbXlrRGF0YSAtIElDQyBQcm9maWxlIENvbG9yIFNwYWNlIFR5cGUgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnQ215a0RhdGEgPSAxMTI5MTQyNjAzOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ0NteURhdGEgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdDbXlEYXRhIC0gSUNDIFByb2ZpbGUgQ29sb3IgU3BhY2UgVHlwZSBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdDbXlEYXRhID0gMTEyOTE0MjU2MDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZTJDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZTJDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ1NwYWNlMkNMUiA9IDg0MzI3MTI1MDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZTNDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZTNDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ1NwYWNlM0NMUiA9IDg2MDA0ODQ2NjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZTRDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZTRDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ1NwYWNlNENMUiA9IDg3NjgyNTY4MjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZTVDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZTVDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ1NwYWNlNUNMUiA9IDg5MzYwMjg5ODsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZTZDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZTZDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ1NwYWNlNkNMUiA9IDkxMDM4MDExNDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZTdDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZTdDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ1NwYWNlN0NMUiA9IDkyNzE1NzMzMDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZThDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZThDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ1NwYWNlOENMUiA9IDk0MzkzNDU0NjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZTlDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZTlDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ1NwYWNlOUNMUiA9IDk2MDcxMTc2MjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZUFDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZUFDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ1NwYWNlQUNMUiA9IDEwOTQ5Mjk0OTA7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnU3BhY2VCQ0xSIC0gSUNDIFByb2ZpbGUgQ29sb3IgU3BhY2UgVHlwZSBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnU3BhY2VCQ0xSIC0gSUNDIFByb2ZpbGUgQ29sb3IgU3BhY2UgVHlwZSBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdTcGFjZUJDTFIgPSAxMTExNzA2NzA2OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ1NwYWNlQ0NMUiAtIElDQyBQcm9maWxlIENvbG9yIFNwYWNlIFR5cGUgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ1NwYWNlQ0NMUiAtIElDQyBQcm9maWxlIENvbG9yIFNwYWNlIFR5cGUgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnU3BhY2VDQ0xSID0gMTEyODQ4MzkyMjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZURDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdTcGFjZURDTFIgLSBJQ0MgUHJvZmlsZSBDb2xvciBTcGFjZSBUeXBlIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ1NwYWNlRENMUiA9IDExNDUyNjExMzg7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnU3BhY2VFQ0xSIC0gSUNDIFByb2ZpbGUgQ29sb3IgU3BhY2UgVHlwZSBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnU3BhY2VFQ0xSIC0gSUNDIFByb2ZpbGUgQ29sb3IgU3BhY2UgVHlwZSBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdTcGFjZUVDTFIgPSAxMTYyMDM4MzU0OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ1NwYWNlRkNMUiAtIElDQyBQcm9maWxlIENvbG9yIFNwYWNlIFR5cGUgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ1NwYWNlRkNMUiAtIElDQyBQcm9maWxlIENvbG9yIFNwYWNlIFR5cGUgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnU3BhY2VGQ0xSID0gMTE3ODgxNTU3MDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdJbnB1dENsYXNzIC0gSUNDIFByb2ZpbGUgQ2xhc3MgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ0lucHV0Q2xhc3MgLSBJQ0MgUHJvZmlsZSBDbGFzcyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdJbnB1dENsYXNzID0gMTkzNTg5NjE3ODsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdEaXNwbGF5Q2xhc3MgLSBJQ0MgUHJvZmlsZSBDbGFzcyBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnRGlzcGxheUNsYXNzIC0gSUNDIFByb2ZpbGUgQ2xhc3MgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnRGlzcGxheUNsYXNzID0gMTgzNTk1NTMxNDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdPdXRwdXRDbGFzcyAtIElDQyBQcm9maWxlIENsYXNzIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdPdXRwdXRDbGFzcyAtIElDQyBQcm9maWxlIENsYXNzIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ091dHB1dENsYXNzID0gMTg4NjU0OTEwNjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdMaW5rQ2xhc3MgLSBJQ0MgUHJvZmlsZSBDbGFzcyBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnTGlua0NsYXNzIC0gSUNDIFByb2ZpbGUgQ2xhc3MgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnTGlua0NsYXNzID0gMTgxODg0ODg3NTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdBYnN0cmFjdENsYXNzIC0gSUNDIFByb2ZpbGUgQ2xhc3MgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ0Fic3RyYWN0Q2xhc3MgLSBJQ0MgUHJvZmlsZSBDbGFzcyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdBYnN0cmFjdENsYXNzID0gMTYzMzg0MjAzNjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdDb2xvcmFudE9yZGVyVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdDb2xvcmFudE9yZGVyVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ0NvbG9yYW50T3JkZXJUYWcgPSAxNjY4MDUxNTY3OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ0NvbG9yYW50VGFibGVUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ0NvbG9yYW50VGFibGVUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnQ29sb3JhbnRUYWJsZVRhZyA9IDE2NjgwNTE1NzI7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnQ29sb3JTcGFjZUNsYXNzIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdDb2xvclNwYWNlQ2xhc3MgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnQ29sb3JTcGFjZUNsYXNzID0gMTkzNjc0NDgwMzsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdOYW1lZENvbG9yQ2xhc3MgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ05hbWVkQ29sb3JDbGFzcyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdOYW1lZENvbG9yQ2xhc3MgPSAxODUyNjYyNjM2OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1BlcmNlcHR1YWwgLSBJQ0MgUHJvZmlsZSBSZW5kZXJpbmcgSW50ZW50LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1BlcmNlcHR1YWwgLSBJQ0MgUHJvZmlsZSBSZW5kZXJpbmcgSW50ZW50LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljUGVyY2VwdHVhbCA9IDA7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljUmVsYXRpdmVDb2xvcmltZXRyaWMgLSBJQ0MgUHJvZmlsZSBSZW5kZXJpbmcgSW50ZW50LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1JlbGF0aXZlQ29sb3JpbWV0cmljIC0gSUNDIFByb2ZpbGUgUmVuZGVyaW5nIEludGVudC4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1JlbGF0aXZlQ29sb3JpbWV0cmljID0gMTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTYXR1cmF0aW9uIC0gSUNDIFByb2ZpbGUgUmVuZGVyaW5nIEludGVudC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTYXR1cmF0aW9uIC0gSUNDIFByb2ZpbGUgUmVuZGVyaW5nIEludGVudC4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NhdHVyYXRpb24gPSAyOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY0Fic29sdXRlQ29sb3JpbWV0cmljIC0gSUNDIFByb2ZpbGUgUmVuZGVyaW5nIEludGVudC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNBYnNvbHV0ZUNvbG9yaW1ldHJpYyAtIElDQyBQcm9maWxlIFJlbmRlcmluZyBJbnRlbnQuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNBYnNvbHV0ZUNvbG9yaW1ldHJpYyA9IDM7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnSGVhZCAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnSGVhZCAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdIZWFkID0gMTc1MTQ3NDUzMjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdBVG9CMFRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnQVRvQjBUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnQVRvQjBUYWcgPSAxMDkzODEyNzg0OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ0FUb0IxVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdBVG9CMVRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdBVG9CMVRhZyA9IDEwOTM4MTI3ODU7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnQVRvQjJUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ0FUb0IyVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ0FUb0IyVGFnID0gMTA5MzgxMjc4NjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdCbHVlQ29sb3JhbnRUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ0JsdWVDb2xvcmFudFRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdCbHVlQ29sb3JhbnRUYWcgPSAxNjQ5OTU3MjEwOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ0JsdWVNYXRyaXhDb2x1bW5UYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ0JsdWVNYXRyaXhDb2x1bW5UYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnQmx1ZU1hdHJpeENvbHVtblRhZyA9IDE2NDk5NTcyMTA7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnQmx1ZVRSQ1RhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnQmx1ZVRSQ1RhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdCbHVlVFJDVGFnID0gMTY0OTY5MzI1MTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdCVG9BMFRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnQlRvQTBUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnQlRvQTBUYWcgPSAxMTEwNTg5NzQ0OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ0JUb0ExVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdCVG9BMVRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdCVG9BMVRhZyA9IDExMTA1ODk3NDU7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnQlRvQTJUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ0JUb0EyVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ0JUb0EyVGFnID0gMTExMDU4OTc0NjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdDYWxpYnJhdGlvbkRhdGVUaW1lVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdDYWxpYnJhdGlvbkRhdGVUaW1lVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ0NhbGlicmF0aW9uRGF0ZVRpbWVUYWcgPSAxNjY3MzI5MTQwOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ0NoYXJUYXJnZXRUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ0NoYXJUYXJnZXRUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnQ2hhclRhcmdldFRhZyA9IDE5NTI1NDMzMzU7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnQ29weXJpZ2h0VGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdDb3B5cmlnaHRUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnQ29weXJpZ2h0VGFnID0gMTY2ODMxMzcxNjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdDcmRJbmZvVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdDcmRJbmZvVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ0NyZEluZm9UYWcgPSAxNjY4NDQxMTkzOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ0RldmljZU1mZ0Rlc2NUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ0RldmljZU1mZ0Rlc2NUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnRGV2aWNlTWZnRGVzY1RhZyA9IDE2ODQ4OTMyODQ7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnRGV2aWNlTW9kZWxEZXNjVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdEZXZpY2VNb2RlbERlc2NUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnRGV2aWNlTW9kZWxEZXNjVGFnID0gMTY4NDg5MDcyNDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdEZXZpY2VTZXR0aW5nc1RhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnRGV2aWNlU2V0dGluZ3NUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnRGV2aWNlU2V0dGluZ3NUYWcgPSAxNjg0MzcxMDU5OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ0dhbXV0VGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdHYW11dFRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdHYW11dFRhZyA9IDE3MzQ0MzgyNjA7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnR3JheVRSQ1RhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnR3JheVRSQ1RhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdHcmF5VFJDVGFnID0gMTgwMDY4ODE5NTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdHcmVlbkNvbG9yYW50VGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdHcmVlbkNvbG9yYW50VGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ0dyZWVuQ29sb3JhbnRUYWcgPSAxNzMzODQzMjkwOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ0dyZWVuTWF0cml4Q29sdW1uVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdHcmVlbk1hdHJpeENvbHVtblRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdHcmVlbk1hdHJpeENvbHVtblRhZyA9IDE3MzM4NDMyOTA7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnR3JlZW5UUkNUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ0dyZWVuVFJDVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ0dyZWVuVFJDVGFnID0gMTczMzU3OTMzMTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdMdW1pbmFuY2VUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ0x1bWluYW5jZVRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdMdW1pbmFuY2VUYWcgPSAxODE5NjM1MDQ5OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ01lYXN1cmVtZW50VGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdNZWFzdXJlbWVudFRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdNZWFzdXJlbWVudFRhZyA9IDE4MzUzNjA2Mjc7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnTWVkaWFCbGFja1BvaW50VGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdNZWRpYUJsYWNrUG9pbnRUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnTWVkaWFCbGFja1BvaW50VGFnID0gMTY1MTIwODMwODsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdNZWRpYVdoaXRlUG9pbnRUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ01lZGlhV2hpdGVQb2ludFRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdNZWRpYVdoaXRlUG9pbnRUYWcgPSAyMDA0MTE5NjY4OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ05hbWVkQ29sb3IyVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdOYW1lZENvbG9yMlRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdOYW1lZENvbG9yMlRhZyA9IDE4NTIwMDk1MjI7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnT3V0cHV0UmVzcG9uc2VUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ091dHB1dFJlc3BvbnNlVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ091dHB1dFJlc3BvbnNlVGFnID0gMTkxOTI1MTMxMjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdQcmV2aWV3MFRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnUHJldmlldzBUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnUHJldmlldzBUYWcgPSAxODg2NTQ1MjAwOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ1ByZXZpZXcxVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdQcmV2aWV3MVRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdQcmV2aWV3MVRhZyA9IDE4ODY1NDUyMDE7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnUHJldmlldzJUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ1ByZXZpZXcyVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ1ByZXZpZXcyVGFnID0gMTg4NjU0NTIwMjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdQcm9maWxlRGVzY3JpcHRpb25UYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ1Byb2ZpbGVEZXNjcmlwdGlvblRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdQcm9maWxlRGVzY3JpcHRpb25UYWcgPSAxNjg0MzcwMjc1OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ1Byb2ZpbGVTZXF1ZW5jZURlc2NUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ1Byb2ZpbGVTZXF1ZW5jZURlc2NUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnUHJvZmlsZVNlcXVlbmNlRGVzY1RhZyA9IDE4ODY2MTA4MDE7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnUHMyQ1JEMFRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnUHMyQ1JEMFRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdQczJDUkQwVGFnID0gMTg4NjYxMDQ4MDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdQczJDUkQxVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdQczJDUkQxVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ1BzMkNSRDFUYWcgPSAxODg2NjEwNDgxOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ1BzMkNSRDJUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ1BzMkNSRDJUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnUHMyQ1JEMlRhZyA9IDE4ODY2MTA0ODI7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnUHMyQ1JEM1RhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnUHMyQ1JEM1RhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdQczJDUkQzVGFnID0gMTg4NjYxMDQ4MzsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdQczJDU0FUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ1BzMkNTQVRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdQczJDU0FUYWcgPSAxODg2NTk3NzQ3OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ1BzMlJlbmRlcmluZ0ludGVudFRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnUHMyUmVuZGVyaW5nSW50ZW50VGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ1BzMlJlbmRlcmluZ0ludGVudFRhZyA9IDE4ODY1OTc3Mzc7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnUmVkQ29sb3JhbnRUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ1JlZENvbG9yYW50VGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ1JlZENvbG9yYW50VGFnID0gMTkxODM5MjY2NjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdSZWRNYXRyaXhDb2x1bW5UYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ1JlZE1hdHJpeENvbHVtblRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdSZWRNYXRyaXhDb2x1bW5UYWcgPSAxOTE4MzkyNjY2OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ1JlZFRSQ1RhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnUmVkVFJDVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ1JlZFRSQ1RhZyA9IDE5MTgxMjg3MDc7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnU2NyZWVuaW5nRGVzY1RhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnU2NyZWVuaW5nRGVzY1RhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdTY3JlZW5pbmdEZXNjVGFnID0gMTkzNTg5NzE4ODsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdTY3JlZW5pbmdUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ1NjcmVlbmluZ1RhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdTY3JlZW5pbmdUYWcgPSAxOTM1ODk3MTk4OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ1RlY2hub2xvZ3lUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ1RlY2hub2xvZ3lUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljU2lnVGVjaG5vbG9neVRhZyA9IDE5NTI4MDE2NDA7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnVWNyQmdUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ1VjckJnVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1NpZ1VjckJnVGFnID0gMTY1MDg3NzQ3MjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdWaWV3aW5nQ29uZERlc2NUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ1ZpZXdpbmdDb25kRGVzY1RhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdWaWV3aW5nQ29uZERlc2NUYWcgPSAxOTg3NDA1MTU2OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1NpZ1ZpZXdpbmdDb25kaXRpb25zVGFnIC0gSUNDIFByb2ZpbGUgVGFnIFNpZ25hdHVyZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNTaWdWaWV3aW5nQ29uZGl0aW9uc1RhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdWaWV3aW5nQ29uZGl0aW9uc1RhZyA9IDE5ODY2MTg3NDM7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljU2lnQ2hyb21hdGljQWRhcHRhdGlvblRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljU2lnQ2hyb21hdGljQWRhcHRhdGlvblRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdDaHJvbWF0aWNBZGFwdGF0aW9uVGFnID0gMTY2Nzc4NTA2MDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNTaWdDaHJvbWF0aWNpdHlUYWcgLSBJQ0MgUHJvZmlsZSBUYWcgU2lnbmF0dXJlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1NpZ0Nocm9tYXRpY2l0eVRhZyAtIElDQyBQcm9maWxlIFRhZyBTaWduYXR1cmUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNTaWdDaHJvbWF0aWNpdHlUYWcgPSAxNjY3Nzg5NDIxOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY0hkclNpemUgLSBJQ0MgUHJvZmlsZSBIZWFkZXIgTG9jYXRpb24uICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljSGRyU2l6ZSAtIElDQyBQcm9maWxlIEhlYWRlciBMb2NhdGlvbi4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY0hkclNpemUgPSAwOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY0hkckNtbUlkIC0gSUNDIFByb2ZpbGUgSGVhZGVyIExvY2F0aW9uLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY0hkckNtbUlkIC0gSUNDIFByb2ZpbGUgSGVhZGVyIExvY2F0aW9uLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljSGRyQ21tSWQgPSA0OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY0hkclZlcnNpb24gLSBJQ0MgUHJvZmlsZSBIZWFkZXIgTG9jYXRpb24uICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljSGRyVmVyc2lvbiAtIElDQyBQcm9maWxlIEhlYWRlciBMb2NhdGlvbi4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY0hkclZlcnNpb24gPSA4OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY0hkckRldmljZUNsYXNzIC0gSUNDIFByb2ZpbGUgSGVhZGVyIExvY2F0aW9uLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY0hkckRldmljZUNsYXNzIC0gSUNDIFByb2ZpbGUgSGVhZGVyIExvY2F0aW9uLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljSGRyRGV2aWNlQ2xhc3MgPSAxMjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNIZHJDb2xvclNwYWNlIC0gSUNDIFByb2ZpbGUgSGVhZGVyIExvY2F0aW9uLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY0hkckNvbG9yU3BhY2UgLSBJQ0MgUHJvZmlsZSBIZWFkZXIgTG9jYXRpb24uCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNIZHJDb2xvclNwYWNlID0gMTY7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljSGRyUGNzIC0gSUNDIFByb2ZpbGUgSGVhZGVyIExvY2F0aW9uLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY0hkclBjcyAtIElDQyBQcm9maWxlIEhlYWRlciBMb2NhdGlvbi4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY0hkclBjcyA9IDIwOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY0hkckRhdGUgLSBJQ0MgUHJvZmlsZSBIZWFkZXIgTG9jYXRpb24uICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljSGRyRGF0ZSAtIElDQyBQcm9maWxlIEhlYWRlciBMb2NhdGlvbi4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY0hkckRhdGUgPSAyNDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNIZHJNYWdpYyAtIElDQyBQcm9maWxlIEhlYWRlciBMb2NhdGlvbi4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNIZHJNYWdpYyAtIElDQyBQcm9maWxlIEhlYWRlciBMb2NhdGlvbi4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY0hkck1hZ2ljID0gMzY7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljSGRyUGxhdGZvcm0gLSBJQ0MgUHJvZmlsZSBIZWFkZXIgTG9jYXRpb24uICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljSGRyUGxhdGZvcm0gLSBJQ0MgUHJvZmlsZSBIZWFkZXIgTG9jYXRpb24uCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNIZHJQbGF0Zm9ybSA9IDQwOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY0hkclByb2ZpbGVJRCAtIElDQyBQcm9maWxlIEhlYWRlciBMb2NhdGlvbi4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNIZHJQcm9maWxlSUQgLSBJQ0MgUHJvZmlsZSBIZWFkZXIgTG9jYXRpb24uCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNIZHJQcm9maWxlSUQgPSA4NDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNIZHJGbGFncyAtIElDQyBQcm9maWxlIEhlYWRlciBMb2NhdGlvbi4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNIZHJGbGFncyAtIElDQyBQcm9maWxlIEhlYWRlciBMb2NhdGlvbi4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY0hkckZsYWdzID0gNDQ7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljSGRyTWFudWZhY3R1cmVyIC0gSUNDIFByb2ZpbGUgSGVhZGVyIExvY2F0aW9uLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY0hkck1hbnVmYWN0dXJlciAtIElDQyBQcm9maWxlIEhlYWRlciBMb2NhdGlvbi4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY0hkck1hbnVmYWN0dXJlciA9IDQ4OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY0hkck1vZGVsIC0gSUNDIFByb2ZpbGUgSGVhZGVyIExvY2F0aW9uLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY0hkck1vZGVsIC0gSUNDIFByb2ZpbGUgSGVhZGVyIExvY2F0aW9uLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljSGRyTW9kZWwgPSA1MjsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNIZHJBdHRyaWJ1dGVzIC0gSUNDIFByb2ZpbGUgSGVhZGVyIExvY2F0aW9uLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY0hkckF0dHJpYnV0ZXMgLSBJQ0MgUHJvZmlsZSBIZWFkZXIgTG9jYXRpb24uCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNIZHJBdHRyaWJ1dGVzID0gNTY7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljSGRyUmVuZGVyaW5nSW50ZW50IC0gSUNDIFByb2ZpbGUgSGVhZGVyIExvY2F0aW9uLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY0hkclJlbmRlcmluZ0ludGVudCAtIElDQyBQcm9maWxlIEhlYWRlciBMb2NhdGlvbi4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY0hkclJlbmRlcmluZ0ludGVudCA9IDY0OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY0hkcklsbHVtaW5hbnQgLSBJQ0MgUHJvZmlsZSBIZWFkZXIgTG9jYXRpb24uICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGljSGRySWxsdW1pbmFudCAtIElDQyBQcm9maWxlIEhlYWRlciBMb2NhdGlvbi4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY0hkcklsbHVtaW5hbnQgPSA2ODsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNIZHJDcmVhdG9yIC0gSUNDIFByb2ZpbGUgSGVhZGVyIExvY2F0aW9uLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY0hkckNyZWF0b3IgLSBJQ0MgUHJvZmlsZSBIZWFkZXIgTG9jYXRpb24uCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNIZHJDcmVhdG9yID0gODA7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljSUNDQWJzb2x1dGVDb2xvcmltZXRyaWMgLSBJQ0MgUHJvZmlsZSBSZW5kZXJpbmcgSW50ZW50LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY0lDQ0Fic29sdXRlQ29sb3JpbWV0cmljIC0gSUNDIFByb2ZpbGUgUmVuZGVyaW5nIEludGVudC4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY0lDQ0Fic29sdXRlQ29sb3JpbWV0cmljID0gMzsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNNZWRpYVJlbGF0aXZlQ29sb3JpbWV0cmljIC0gSUNDIFByb2ZpbGUgUmVuZGVyaW5nIEludGVudC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNNZWRpYVJlbGF0aXZlQ29sb3JpbWV0cmljIC0gSUNDIFByb2ZpbGUgUmVuZGVyaW5nIEludGVudC4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY01lZGlhUmVsYXRpdmVDb2xvcmltZXRyaWMgPSAxOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY1RhZ1R5cGUgLSBJQ0MgUHJvZmlsZSBDb25zdGFudC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgaWNUYWdUeXBlIC0gSUNDIFByb2ZpbGUgQ29uc3RhbnQuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNUYWdUeXBlID0gMDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgaWNUYWdSZXNlcnZlZCAtIElDQyBQcm9maWxlIENvbnN0YW50LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1RhZ1Jlc2VydmVkIC0gSUNDIFByb2ZpbGUgQ29uc3RhbnQuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaWNUYWdSZXNlcnZlZCA9IDQ7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljQ3VydmVDb3VudCAtIElDQyBQcm9maWxlIENvbnN0YW50LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY0N1cnZlQ291bnQgLSBJQ0MgUHJvZmlsZSBDb25zdGFudC4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY0N1cnZlQ291bnQgPSA4OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBpY0N1cnZlRGF0YSAtIElDQyBQcm9maWxlIENvbnN0YW50LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY0N1cnZlRGF0YSAtIElDQyBQcm9maWxlIENvbnN0YW50LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGljQ3VydmVEYXRhID0gMTI7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IGljWFlaTnVtYmVyWCAtIElDQyBQcm9maWxlIENvbnN0YW50LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBpY1hZWk51bWJlclggLSBJQ0MgUHJvZmlsZSBDb25zdGFudC4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpY1hZWk51bWJlclggPSA4OwogCi0gICAgLyoqIFNpemUgb2YgYSBwcm9maWxlIGhlYWRlci4gKi8KKyAgICAvKioKKyAgICAgKiBTaXplIG9mIGEgcHJvZmlsZSBoZWFkZXIuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGhlYWRlclNpemUgPSAxMjg7CiAKLSAgICAvKiogaGVhZGVyIG1hZ2ljIG51bWJlci4gKi8KKyAgICAvKioKKyAgICAgKiBoZWFkZXIgbWFnaWMgbnVtYmVyLgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBoZWFkZXJNYWdpY051bWJlciA9IDB4NjE2MzczNzA7CiAKICAgICAvLyBDYWNoZSBvZiBwcmVkZWZpbmVkIHByb2ZpbGVzCi0gICAgLyoqIFRoZSBzIHJnYiBwcm9maWxlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBzIHJnYiBwcm9maWxlLgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIElDQ19Qcm9maWxlIHNSR0JQcm9maWxlOwotICAgIAotICAgIC8qKiBUaGUgeHl6IHByb2ZpbGUuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgeHl6IHByb2ZpbGUuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgSUNDX1Byb2ZpbGUgeHl6UHJvZmlsZTsKLSAgICAKLSAgICAvKiogVGhlIGdyYXkgcHJvZmlsZS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBncmF5IHByb2ZpbGUuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgSUNDX1Byb2ZpbGUgZ3JheVByb2ZpbGU7Ci0gICAgCi0gICAgLyoqIFRoZSBweWNjIHByb2ZpbGUuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgcHljYyBwcm9maWxlLgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIElDQ19Qcm9maWxlIHB5Y2NQcm9maWxlOwotICAgIAotICAgIC8qKiBUaGUgbGluZWFyIHJnYiBwcm9maWxlLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGxpbmVhciByZ2IgcHJvZmlsZS4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBJQ0NfUHJvZmlsZSBsaW5lYXJSR0JQcm9maWxlOwogCi0gICAgLyoqIEhhbmRsZSB0byB0aGUgY3VycmVudCBwcm9maWxlLiAqLworICAgIC8qKgorICAgICAqIEhhbmRsZSB0byB0aGUgY3VycmVudCBwcm9maWxlLgorICAgICAqLwogICAgIHByaXZhdGUgdHJhbnNpZW50IGxvbmcgcHJvZmlsZUhhbmRsZSA9IDA7CiAKLSAgICAvKiogSWYgaGFuZGxlIGlzIHVzZWQgYnkgYW5vdGhlciBjbGFzcyB0aGlzIG9iamVjdCBpcyBub3QgcmVzcG9uc2libGUgZm9yIGNsb3NpbmcgcHJvZmlsZS4gKi8KKyAgICAvKioKKyAgICAgKiBJZiBoYW5kbGUgaXMgdXNlZCBieSBhbm90aGVyIGNsYXNzIHRoaXMgb2JqZWN0IGlzIG5vdCByZXNwb25zaWJsZSBmb3IKKyAgICAgKiBjbG9zaW5nIHByb2ZpbGUuCisgICAgICovCiAgICAgcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBoYW5kbGVTdG9sZW4gPSBmYWxzZTsKIAotICAgIC8qKiBDYWNoZWQgaGVhZGVyIGRhdGEuICovCisgICAgLyoqCisgICAgICogQ2FjaGVkIGhlYWRlciBkYXRhLgorICAgICAqLwogICAgIHByaXZhdGUgdHJhbnNpZW50IGJ5dGVbXSBoZWFkZXJEYXRhID0gbnVsbDsKIAotICAgIC8qKiBTZXJpYWxpemF0aW9uIHN1cHBvcnQuICovCisgICAgLyoqCisgICAgICogU2VyaWFsaXphdGlvbiBzdXBwb3J0LgorICAgICAqLwogICAgIHByaXZhdGUgdHJhbnNpZW50IElDQ19Qcm9maWxlIG9wZW5lZFByb2ZpbGVPYmplY3Q7CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgaUMgY18gcHJvZmlsZS4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgSUNDIHByb2ZpbGUgd2l0aCB0aGUgZ2l2ZW4gZGF0YS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgZGF0YQorICAgICAqIEBwYXJhbSBkYXRhCisgICAgICogICAgICAgICAgICB0aGUgZGF0YS4KICAgICAgKi8KICAgICBwcml2YXRlIElDQ19Qcm9maWxlKGJ5dGVbXSBkYXRhKSB7CiAgICAgICAgIHByb2ZpbGVIYW5kbGUgPSBOYXRpdmVDTU0uY21tT3BlblByb2ZpbGUoZGF0YSk7CkBAIC00NzYsNyArNzMxLDggQEAKICAgICAvKioKICAgICAgKiBVc2VkIHRvIGluc3RhbnRpYXRlIHN1YmNsYXNzZXMgKElDQ19Qcm9maWxlR3JleSBhbmQgSUNDX1Byb2ZpbGVSR0IpLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9maWxlSGFuZGxlIC0gc2hvdWxkIGJlIHZhbGlkIGhhbmRsZSB0byBvcGVuZWQgY29sb3IgcHJvZmlsZQorICAgICAqIEBwYXJhbSBwcm9maWxlSGFuZGxlCisgICAgICogICAgICAgICAgICAtIHNob3VsZCBiZSB2YWxpZCBoYW5kbGUgdG8gb3BlbmVkIGNvbG9yIHByb2ZpbGUKICAgICAgKi8KICAgICBJQ0NfUHJvZmlsZShsb25nIHByb2ZpbGVIYW5kbGUpIHsKICAgICAgICAgdGhpcy5wcm9maWxlSGFuZGxlID0gcHJvZmlsZUhhbmRsZTsKQEAgLTQ4NywxMCArNzQzLDExIEBACiAgICAgLyoqCiAgICAgICogV3JpdGVzIHRoZSBJQ0NfUHJvZmlsZSB0byBhIGZpbGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGZpbGVOYW1lIHRoZSBmaWxlIG5hbWUuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBzaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQgZHVyaW5nCi0gICAgICogd3JpdGluZyBvciBvcGVuaW5nIHRoZSBmaWxlLgorICAgICAqIEBwYXJhbSBmaWxlTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGZpbGUgbmFtZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQgZHVyaW5nIHdyaXRpbmcgb3Igb3BlbmluZworICAgICAqICAgICAgICAgICAgIHRoZSBmaWxlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHdyaXRlKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvU3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZU5hbWUpOwpAQCAtNTAxLDkgKzc1OCwxMCBAQAogICAgIC8qKgogICAgICAqIFNlcmlhbGl6YWJsZSBpbXBsZW1lbnRhdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcyB0aGUgcwotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICB0aGUgcworICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzLmRlZmF1bHRXcml0ZU9iamVjdCgpOwpAQCAtNTE0LDEwICs3NzIsMTIgQEAKICAgICAvKioKICAgICAgKiBTZXJpYWxpemFibGUgaW1wbGVtZW50YXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIHMgdGhlIHMKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gdGhlIGNsYXNzIG5vdCBmb3VuZCBleGNlcHRpb24KKyAgICAgKiBAcGFyYW0gcworICAgICAqICAgICAgICAgICAgdGhlIHMKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIHRoZSBjbGFzcyBub3QgZm91bmQgZXhjZXB0aW9uCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gcykgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKICAgICAgICAgcy5kZWZhdWx0UmVhZE9iamVjdCgpOwpAQCAtNTQ3LDkgKzgwNyw5IEBACiAgICAgICogUmVzb2x2ZXMgaW5zdGFuY2VzIGJlaW5nIGRlc2VyaWFsaXplZCBpbnRvIGluc3RhbmNlcyByZWdpc3RlcmVkIHdpdGggQ01NLgogICAgICAqIAogICAgICAqIEByZXR1cm4gSUNDX1Byb2ZpbGUgb2JqZWN0IGZvciBwcm9maWxlIHJlZ2lzdGVyZWQgd2l0aCBDTU0uCi0gICAgICogCi0gICAgICogQHRocm93cyBPYmplY3RTdHJlYW1FeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlcmlhbGl6ZWQgCi0gICAgICogZmlsZXMgb3IgZHVyaW5nIHRoZSBwcm9jZXNzIG9mIHJlYWRpbmcgdGhlbS4KKyAgICAgKiBAdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZXJpYWxpemVkIGZpbGVzIG9yIGR1cmluZyB0aGUKKyAgICAgKiAgICAgICAgICAgICBwcm9jZXNzIG9mIHJlYWRpbmcgdGhlbS4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgT2JqZWN0IHJlYWRSZXNvbHZlKCkgdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBvcGVuZWRQcm9maWxlT2JqZWN0OwpAQCAtNTU4LDIwICs4MTgsMjMgQEAKICAgICAvKioKICAgICAgKiBXcml0ZXMgdGhlIElDQ19Qcm9maWxlIHRvIGFuIE91dHB1dFN0cmVhbS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcyB0aGUgT3V0cHV0U3RyZWFtLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gc2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkIGR1cmluZwotICAgICAqIHdyaXRpbmcgb3Igb3BlbmluZyBPdXRwdXRTdHJlYW0uCisgICAgICogQHBhcmFtIHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBPdXRwdXRTdHJlYW0uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIHNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZCBkdXJpbmcgd3JpdGluZyBvcgorICAgICAqICAgICAgICAgICAgIG9wZW5pbmcgT3V0cHV0U3RyZWFtLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzLndyaXRlKGdldERhdGEoKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyBhIHRhZ2dlZCBkYXRhIGVsZW1lbnQgaW4gdGhlIHByb2ZpbGUgZnJvbSBhIGJ5dGUgYXJyYXkuIAorICAgICAqIFNldHMgYSB0YWdnZWQgZGF0YSBlbGVtZW50IGluIHRoZSBwcm9maWxlIGZyb20gYSBieXRlIGFycmF5LgogICAgICAqIAotICAgICAqIEBwYXJhbSB0YWdTaWduYXR1cmUgdGhlIElDQyB0YWcgc2lnbmF0dXJlIGZvciB0aGUgZGF0YSBlbGVtZW50IHRvIGJlIHNldC4gCi0gICAgICogQHBhcmFtIHRhZ0RhdGEgdGhlIGRhdGEgdG8gYmUgc2V0IGZvciB0aGUgc3BlY2lmaWVkIHRhZyBzaWduYXR1cmUuCisgICAgICogQHBhcmFtIHRhZ1NpZ25hdHVyZQorICAgICAqICAgICAgICAgICAgdGhlIElDQyB0YWcgc2lnbmF0dXJlIGZvciB0aGUgZGF0YSBlbGVtZW50IHRvIGJlIHNldC4KKyAgICAgKiBAcGFyYW0gdGFnRGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgdG8gYmUgc2V0IGZvciB0aGUgc3BlY2lmaWVkIHRhZyBzaWduYXR1cmUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RGF0YShpbnQgdGFnU2lnbmF0dXJlLCBieXRlW10gdGFnRGF0YSkgewogICAgICAgICBOYXRpdmVDTU0uY21tU2V0UHJvZmlsZUVsZW1lbnQocHJvZmlsZUhhbmRsZSwgdGFnU2lnbmF0dXJlLCB0YWdEYXRhKTsKQEAgLTU4MiwyMSArODQ1LDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhIHRhZ2dlZCBkYXRhIGVsZW1lbnQgZnJvbSB0aGUgcHJvZmlsZSBhcyBhIGJ5dGUgYXJyYXkuIAotICAgICAqIEVsZW1lbnRzIGFyZSBpZGVudGlmaWVkIGJ5IHRhZyBzaWduYXR1cmVzIGFzIGRlZmluZWQgaW4gCi0gICAgICogdGhlIElDQyBzcGVjaWZpY2F0aW9uLiAKKyAgICAgKiBHZXRzIGEgdGFnZ2VkIGRhdGEgZWxlbWVudCBmcm9tIHRoZSBwcm9maWxlIGFzIGEgYnl0ZSBhcnJheS4gRWxlbWVudHMgYXJlCisgICAgICogaWRlbnRpZmllZCBieSB0YWcgc2lnbmF0dXJlcyBhcyBkZWZpbmVkIGluIHRoZSBJQ0Mgc3BlY2lmaWNhdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGFnU2lnbmF0dXJlIHRoZSBJQ0MgdGFnIHNpZ25hdHVyZSBmb3IgdGhlIGRhdGEgZWxlbWVudCB0byBnZXQuCi0gICAgICogCisgICAgICogQHBhcmFtIHRhZ1NpZ25hdHVyZQorICAgICAqICAgICAgICAgICAgdGhlIElDQyB0YWcgc2lnbmF0dXJlIGZvciB0aGUgZGF0YSBlbGVtZW50IHRvIGdldC4KICAgICAgKiBAcmV0dXJuIGEgYnl0ZSBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSB0YWdnZWQgZGF0YSBlbGVtZW50LgogICAgICAqLwogICAgIHB1YmxpYyBieXRlW10gZ2V0RGF0YShpbnQgdGFnU2lnbmF0dXJlKSB7CiAgICAgICAgIGludCB0YWdTaXplID0gMDsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRhZ1NpemUgPSBOYXRpdmVDTU0uY21tR2V0UHJvZmlsZUVsZW1lbnRTaXplKAotICAgICAgICAgICAgICAgICAgICBwcm9maWxlSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICB0YWdTaWduYXR1cmUKLSAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgdGFnU2l6ZSA9IE5hdGl2ZUNNTS5jbW1HZXRQcm9maWxlRWxlbWVudFNpemUocHJvZmlsZUhhbmRsZSwgdGFnU2lnbmF0dXJlKTsKICAgICAgICAgfSBjYXRjaCAoQ01NRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIC8vIFdlJ2xsIGdldCB0aGlzIGV4Y2VwdGlvbiBpZiB0aGVyZSdzIG5vIGVsZW1lbnQgd2l0aAogICAgICAgICAgICAgLy8gdGhlIHNwZWNpZmllZCB0YWcgc2lnbmF0dXJlCkBAIC02MjUsNyArODg0LDcgQEAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHsKLSAgICAgICAgaWYgKHByb2ZpbGVIYW5kbGUhPTAgJiYgIWhhbmRsZVN0b2xlbikgeworICAgICAgICBpZiAocHJvZmlsZUhhbmRsZSAhPSAwICYmICFoYW5kbGVTdG9sZW4pIHsKICAgICAgICAgICAgIE5hdGl2ZUNNTS5jbW1DbG9zZVByb2ZpbGUocHJvZmlsZUhhbmRsZSk7CiAgICAgICAgIH0KIApAQCAtNjYzLDE2ICs5MjIsMTYgQEAKICAgICAgICAgLy8gTm90IGFuIElDQyBwcm9maWxlIGNsYXNzCiAgICAgICAgIC8vIGF3dC4xNUY9UHJvZmlsZSBjbGFzcyBkb2VzIG5vdCBjb21wbHkgd2l0aCBJQ0Mgc3BlY2lmaWNhdGlvbgogICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjE1RiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKKwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbG9yIHNwYWNlIHR5cGUgb2YgdGhlIFByb2ZpbGUgQ29ubmVjdGlvbiBTcGFjZSAoUENTKS4KKyAgICAgKiBHZXRzIHRoZSBjb2xvciBzcGFjZSB0eXBlIG9mIHRoZSBQcm9maWxlIENvbm5lY3Rpb24gU3BhY2UgKFBDUykuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgUENTIHR5cGUuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRQQ1NUeXBlKCkgewotICAgICAgICAgcmV0dXJuIGNzRnJvbVNpZ25hdHVyZShnZXRJbnRGcm9tSGVhZGVyKGljSGRyUGNzKSk7CisgICAgICAgIHJldHVybiBjc0Zyb21TaWduYXR1cmUoZ2V0SW50RnJvbUhlYWRlcihpY0hkclBjcykpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzQwLDcgKzk5OSw3IEBACiAgICAgICogQHJldHVybiB0aGUgbWlub3IgdmVyc2lvbiBvZiB0aGlzIElDQyBwcm9maWxlLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TWlub3JWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gZ2V0Qnl0ZUZyb21IZWFkZXIoaWNIZHJWZXJzaW9uKzEpOworICAgICAgICByZXR1cm4gZ2V0Qnl0ZUZyb21IZWFkZXIoaWNIZHJWZXJzaW9uICsgMSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03NjIsMTMgKzEwMjEsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUcmllcyB0byBvcGVuIGZpbGUgYXQgdGhlIHNwZWNpZmllZCBwYXRoLiBQYXRoIGVudHJpZXMgY2FuIGJlIAotICAgICAqIGRpdmlkZWQgYnkgYSBzZXBhcmF0b3IgY2hhcmFjdGVyLgorICAgICAqIFRyaWVzIHRvIG9wZW4gdGhlIGZpbGUgYXQgdGhlIHNwZWNpZmllZCBwYXRoLiBQYXRoIGVudHJpZXMgY2FuIGJlIGRpdmlkZWQKKyAgICAgKiBieSBhIHNlcGFyYXRvciBjaGFyYWN0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHBhdGggdGhlIHBhdGgKLSAgICAgKiBAcGFyYW0gZmlsZU5hbWUgdGhlIGZpbGUgbmFtZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZpbGUgaW5wdXQgc3RyZWFtCisgICAgICogQHBhcmFtIHBhdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXRoIHRvIHRoZSBmaWxlLgorICAgICAqIEBwYXJhbSBmaWxlTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGZpbGUgbmFtZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnB1dCBzdHJlYW0gdG8gcmVhZCB0aGUgZmlsZS4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBGaWxlSW5wdXRTdHJlYW0gdHJ5UGF0aChTdHJpbmcgcGF0aCwgU3RyaW5nIGZpbGVOYW1lKSB7CiAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaVN0cmVhbSA9IG51bGw7CkBAIC03ODYsNyArMTA0Niw4IEBACiAgICAgICAgICAgICAgICAgaWYgKGZpU3RyZWFtICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpU3RyZWFtOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7fQorICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBmaVN0cmVhbTsKQEAgLTc5NSwxOCArMTA1NiwxOCBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHNpbmdsZSBpbnN0YW5jZSBvZiBJQ0NfUHJvZmlsZSBmcm9tIGRhdGEgaW4gdGhlIHNwZWNpZmllZCBmaWxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBmaWxlTmFtZSB0aGUgc3BlY2lmaWVkIG5hbWUgb2YgZmlsZSB3aXRoIElDQyBwcm9maWxlIGRhdGEuCi0gICAgICogCisgICAgICogQHBhcmFtIGZpbGVOYW1lCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIG5hbWUgb2YgZmlsZSB3aXRoIElDQyBwcm9maWxlIGRhdGEuCiAgICAgICogQHJldHVybiBzaW5nbGUgaW5zdGFuY2Ugb2YgSUNDX1Byb2ZpbGUuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBzaWduYWxzIHRoYXQgYW4gSS9PIGVycm9yIG9jY3VyZWQgd2hpbGUgcmVhZGluZyB0aGUgZmlsZQotICAgICAqIG9yIHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3QuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIHNpZ25hbHMgdGhhdCBhbiBJL08gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcmVhZGluZyB0aGUgZmlsZSBvcgorICAgICAqICAgICAgICAgICAgIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgSUNDX1Byb2ZpbGUgZ2V0SW5zdGFuY2UoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBmaW5hbCBTdHJpbmcgZk5hbWUgPSBmaWxlTmFtZTsgLy8gdG8gdXNlIGluIHRoZSBwcml2aWxlZ2VkIGJsb2NrCiAKLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpU3RyZWFtID0gKEZpbGVJbnB1dFN0cmVhbSkgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb248RmlsZUlucHV0U3RyZWFtPigpIHsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpU3RyZWFtID0gKEZpbGVJbnB1dFN0cmVhbSlBY2Nlc3NDb250cm9sbGVyCisgICAgICAgICAgICAgICAgLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbjxGaWxlSW5wdXRTdHJlYW0+KCkgewogICAgICAgICAgICAgICAgICAgICBwdWJsaWMgRmlsZUlucHV0U3RyZWFtIHJ1bigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaVN0cmVhbSA9IG51bGw7CiAKQEAgLTgxNiw3ICsxMDc3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlTdHJlYW0gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlTdHJlYW07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHt9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBqYXZhLmljY3Byb2ZpbGUucGF0aCBlbnRyaWVzCiAgICAgICAgICAgICAgICAgICAgICAgICBmaVN0cmVhbSA9IHRyeVBhdGgoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmljY3Byb2ZpbGUucGF0aCIpLCBmTmFtZSk7IC8vJE5PTi1OTFMtMSQKQEAgLTgzMyw5ICsxMDk1LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGRpcmVjdG9yeSB3aXRoIGphdmEgc2FtcGxlIHByb2ZpbGVzCiAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaG9tZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIik7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChob21lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaVN0cmVhbSA9IHRyeVBhdGgoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob21lICsgRmlsZS5zZXBhcmF0b3JDaGFyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaWIiICsgRmlsZS5zZXBhcmF0b3JDaGFyICsgImNtbSIsIGZOYW1lIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpU3RyZWFtID0gdHJ5UGF0aChob21lICsgRmlsZS5zZXBhcmF0b3JDaGFyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJsaWIiICsgRmlsZS5zZXBhcmF0b3JDaGFyICsgImNtbSIsIGZOYW1lIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTg1NCwxNyArMTExNSwxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNpbmdsZSBpbnN0YW5jZSBvZiBJQ0NfUHJvZmlsZSB3aXRoIGRhdGEgaW4KLSAgICAgKiB0aGUgc3BlY2lmaWVkIElucHV0U3RyZWFtLgorICAgICAqIEdldHMgdGhlIHNpbmdsZSBpbnN0YW5jZSBvZiBJQ0NfUHJvZmlsZSB3aXRoIGRhdGEgaW4gdGhlIHNwZWNpZmllZAorICAgICAqIElucHV0U3RyZWFtLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzIHRoZSBJbnB1dFN0cmVhbSB3aXRoIElDQyBwcm9maWxlIGRhdGEuCi0gICAgICogCisgICAgICogQHBhcmFtIHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbnB1dFN0cmVhbSB3aXRoIElDQyBwcm9maWxlIGRhdGEuCiAgICAgICogQHJldHVybiBzaW5nbGUgaW5zdGFuY2Ugb2YgSUNDX1Byb2ZpbGUuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZCBkdXJpbmcgcmVhZGluZyAKLSAgICAgKiBmcm9tIElucHV0U3RyZWFtLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBmaWxlIGRvZXMgbm90IGNvbnRhaW4gdmFsaWQgCi0gICAgICogSUNDIFByb2ZpbGUgZGF0YS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQgZHVyaW5nIHJlYWRpbmcgZnJvbQorICAgICAqICAgICAgICAgICAgIElucHV0U3RyZWFtLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGZpbGUgZG9lcyBub3QgY29udGFpbiB2YWxpZCBJQ0MgUHJvZmlsZSBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgSUNDX1Byb2ZpbGUgZ2V0SW5zdGFuY2UoSW5wdXRTdHJlYW0gcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgYnl0ZVtdIGhlYWRlciA9IG5ldyBieXRlW2hlYWRlclNpemVdOwpAQCAtODc3LDEwICsxMTM4LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIENoZWNrIHRoZSBwcm9maWxlIGRhdGEgZm9yIGNvbnNpc3RlbmN5Ci0gICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICBJQ0NfUHJvZmlsZUhlbHBlci5nZXRCaWdFbmRpYW5Gcm9tQnl0ZUFycmF5KGhlYWRlciwgaWNIZHJNYWdpYykgIT0KLSAgICAgICAgICAgICAgICBoZWFkZXJNYWdpY051bWJlcgotICAgICAgICApIHsKKyAgICAgICAgaWYgKElDQ19Qcm9maWxlSGVscGVyLmdldEJpZ0VuZGlhbkZyb21CeXRlQXJyYXkoaGVhZGVyLCBpY0hkck1hZ2ljKSAhPSBoZWFkZXJNYWdpY051bWJlcikgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihpbnZhbGlkRGF0YU1lc3NhZ2UpOwogICAgICAgICB9CiAKQEAgLTg5MiwxMCArMTE1MCw3IEBACiAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoaGVhZGVyLCAwLCBwcm9maWxlRGF0YSwgMCwgaGVhZGVyU2l6ZSk7CiAKICAgICAgICAgLy8gUmVhZCB0aGUgcHJvZmlsZSBpdHNlbGYKLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgIHMucmVhZChwcm9maWxlRGF0YSwgaGVhZGVyU2l6ZSwgcHJvZmlsZVNpemUgLSBoZWFkZXJTaXplKSAhPQotICAgICAgICAgICAgICAgIHByb2ZpbGVTaXplIC0gaGVhZGVyU2l6ZQotICAgICAgICApIHsKKyAgICAgICAgaWYgKHMucmVhZChwcm9maWxlRGF0YSwgaGVhZGVyU2l6ZSwgcHJvZmlsZVNpemUgLSBoZWFkZXJTaXplKSAhPSBwcm9maWxlU2l6ZSAtIGhlYWRlclNpemUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oaW52YWxpZERhdGFNZXNzYWdlKTsKICAgICAgICAgfQogCkBAIC05MDMsMTYgKzExNTgsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzaW5nbGUgaW5zdGFuY2Ugb2YgSUNDX1Byb2ZpbGUgZnJvbSB0aGUgc3BlY2lmaWVkIGRhdGEgaW4gCi0gICAgICogYSBieXRlIGFycmF5LgorICAgICAqIEdldHMgdGhlIHNpbmdsZSBpbnN0YW5jZSBvZiBJQ0NfUHJvZmlsZSBmcm9tIHRoZSBzcGVjaWZpZWQgZGF0YSBpbiBhIGJ5dGUKKyAgICAgKiBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgYnl0ZSBhcnJheSBvZiBJQ0MgcHJvZmlsZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHNpbmdsZSBpbnN0YW5jZSBvZiBJQ0NfUHJvZmlsZSBmcm9tIHRoZSBzcGVjaWZpZWQgZGF0YSBpbiAKLSAgICAgKiBhIGJ5dGUgYXJyYXkuCi0gICAgICogCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGZpbGUgZG9lcyBub3QgY29udGFpbiB2YWxpZCAKLSAgICAgKiBJQ0MgUHJvZmlsZSBkYXRhLgorICAgICAqIEBwYXJhbSBkYXRhCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSBhcnJheSBvZiBJQ0MgcHJvZmlsZS4KKyAgICAgKiBAcmV0dXJuIHNpbmdsZSBpbnN0YW5jZSBvZiBJQ0NfUHJvZmlsZSBmcm9tIHRoZSBzcGVjaWZpZWQgZGF0YSBpbiBhIGJ5dGUKKyAgICAgKiAgICAgICAgIGFycmF5LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGZpbGUgZG9lcyBub3QgY29udGFpbiB2YWxpZCBJQ0MgUHJvZmlsZSBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgSUNDX1Byb2ZpbGUgZ2V0SW5zdGFuY2UoYnl0ZVtdIGRhdGEpIHsKICAgICAgICAgSUNDX1Byb2ZpbGUgcmVzID0gbnVsbDsKQEAgLTkyNCwyOSArMTE3OCwyOCBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4xNjIiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCi0gICAgICBpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJ3aW5kb3dzIikgPj0gMCkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICggcmVzLmdldENvbG9yU3BhY2VUeXBlICgpID09IENvbG9yU3BhY2UuVFlQRV9SR0IgJiYKLSAgICAgICAgICAgICAgICAgcmVzLmdldERhdGFTaXplKGljU2lnTWVkaWFXaGl0ZVBvaW50VGFnKSA+IDAgJiYKLSAgICAgICAgICAgICAgICAgcmVzLmdldERhdGFTaXplKGljU2lnUmVkQ29sb3JhbnRUYWcpID4gMCAmJgotICAgICAgICAgICAgICAgICByZXMuZ2V0RGF0YVNpemUoaWNTaWdHcmVlbkNvbG9yYW50VGFnKSA+IDAgJiYKLSAgICAgICAgICAgICAgICAgcmVzLmdldERhdGFTaXplKGljU2lnQmx1ZUNvbG9yYW50VGFnKSA+IDAgJiYKLSAgICAgICAgICAgICAgICAgcmVzLmdldERhdGFTaXplKGljU2lnUmVkVFJDVGFnKSA+IDAgJiYKLSAgICAgICAgICAgICAgICAgcmVzLmdldERhdGFTaXplKGljU2lnR3JlZW5UUkNUYWcpID4gMCAmJgotICAgICAgICAgICAgICAgICByZXMuZ2V0RGF0YVNpemUoaWNTaWdCbHVlVFJDVGFnKSA+IDAKLSAgICAgICAgICAgICAgICApIHsKLSAgICAgICAgICAgICAgICByZXMgPSBuZXcgSUNDX1Byb2ZpbGVSR0IocmVzLmdldFByb2ZpbGVIYW5kbGUoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCByZXMuZ2V0Q29sb3JTcGFjZVR5cGUgKCkgPT0gQ29sb3JTcGFjZS5UWVBFX0dSQVkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5nZXREYXRhU2l6ZShpY1NpZ01lZGlhV2hpdGVQb2ludFRhZykgPiAwICYmCi0gICAgICAgICAgICAgICAgICAgICAgICByZXMuZ2V0RGF0YVNpemUoaWNTaWdHcmF5VFJDVGFnKSA+IDAKLSAgICAgICAgICAgICAgICApIHsKLSAgICAgICAgICAgICAgICByZXMgPSBuZXcgSUNDX1Byb2ZpbGVHcmF5IChyZXMuZ2V0UHJvZmlsZUhhbmRsZSgpKTsKKyAgICAgICAgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigid2luZG93cyIpID49IDApIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChyZXMuZ2V0Q29sb3JTcGFjZVR5cGUoKSA9PSBDb2xvclNwYWNlLlRZUEVfUkdCCisgICAgICAgICAgICAgICAgICAgICAgICAmJiByZXMuZ2V0RGF0YVNpemUoaWNTaWdNZWRpYVdoaXRlUG9pbnRUYWcpID4gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVzLmdldERhdGFTaXplKGljU2lnUmVkQ29sb3JhbnRUYWcpID4gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVzLmdldERhdGFTaXplKGljU2lnR3JlZW5Db2xvcmFudFRhZykgPiAwCisgICAgICAgICAgICAgICAgICAgICAgICAmJiByZXMuZ2V0RGF0YVNpemUoaWNTaWdCbHVlQ29sb3JhbnRUYWcpID4gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVzLmdldERhdGFTaXplKGljU2lnUmVkVFJDVGFnKSA+IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHJlcy5nZXREYXRhU2l6ZShpY1NpZ0dyZWVuVFJDVGFnKSA+IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHJlcy5nZXREYXRhU2l6ZShpY1NpZ0JsdWVUUkNUYWcpID4gMCkgeworICAgICAgICAgICAgICAgICAgICByZXMgPSBuZXcgSUNDX1Byb2ZpbGVSR0IocmVzLmdldFByb2ZpbGVIYW5kbGUoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXMuZ2V0Q29sb3JTcGFjZVR5cGUoKSA9PSBDb2xvclNwYWNlLlRZUEVfR1JBWQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVzLmdldERhdGFTaXplKGljU2lnTWVkaWFXaGl0ZVBvaW50VGFnKSA+IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHJlcy5nZXREYXRhU2l6ZShpY1NpZ0dyYXlUUkNUYWcpID4gMCkgeworICAgICAgICAgICAgICAgICAgICByZXMgPSBuZXcgSUNDX1Byb2ZpbGVHcmF5KHJlcy5nZXRQcm9maWxlSGFuZGxlKCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBjYXRjaCAoQ01NRXhjZXB0aW9uIGUpIHsgLyogcmV0dXJuIHJlcyBpbiB0aGlzIGNhc2UgKi8KICAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0gICAgICAgIH0gY2F0Y2ggKENNTUV4Y2VwdGlvbiBlKSB7IC8qIHJldHVybiByZXMgaW4gdGhpcyBjYXNlICovIH0KLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKICAgICAvKioKQEAgLTk1NCw4MCArMTIwNyw3NyBAQAogICAgICAqIGRlZmluZWQgYnkgdGhlIENvbG9yU3BhY2UgY2xhc3M6IENTX3NSR0IsIENTX0xJTkVBUl9SR0IsIENTX0NJRVhZWiwKICAgICAgKiBDU19QWUNDLCBDU19HUkFZLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjc3BhY2UgdGhlIHR5cGUgb2YgY29sb3Igc3BhY2UgZGVmaW5lZCBpbiB0aGUgQ29sb3JTcGFjZSBjbGFzcy4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gY3NwYWNlCisgICAgICogICAgICAgICAgICB0aGUgdHlwZSBvZiBjb2xvciBzcGFjZSBkZWZpbmVkIGluIHRoZSBDb2xvclNwYWNlIGNsYXNzLgogICAgICAqIEByZXR1cm4gc2luZ2xlIGluc3RhbmNlIG9mIElDQ19Qcm9maWxlLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIG5vdCBvbmUgb2YgdGhlIGRlZmluZWQgY29sb3IgCi0gICAgICogc3BhY2UgdHlwZXMuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpcyBub3Qgb25lIG9mIHRoZSBkZWZpbmVkIGNvbG9yIHNwYWNlIHR5cGVzLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgSUNDX1Byb2ZpbGUgZ2V0SW5zdGFuY2UoaW50IGNzcGFjZSkgewotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKGNzcGFjZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3dpdGNoIChjc3BhY2UpIHsKIAotICAgICAgY2FzZSBDb2xvclNwYWNlLkNTX3NSR0I6Ci0gICAgICAgIGlmIChzUkdCUHJvZmlsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzUkdCUHJvZmlsZSA9IGdldEluc3RhbmNlKCJzUkdCLnBmIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICBjYXNlIENvbG9yU3BhY2UuQ1Nfc1JHQjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNSR0JQcm9maWxlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNSR0JQcm9maWxlID0gZ2V0SW5zdGFuY2UoInNSR0IucGYiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzUkdCUHJvZmlsZTsKKworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3JTcGFjZS5DU19DSUVYWVo6CisgICAgICAgICAgICAgICAgICAgIGlmICh4eXpQcm9maWxlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHh5elByb2ZpbGUgPSBnZXRJbnN0YW5jZSgiQ0lFWFlaLnBmIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4geHl6UHJvZmlsZTsKKworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3JTcGFjZS5DU19HUkFZOgorICAgICAgICAgICAgICAgICAgICBpZiAoZ3JheVByb2ZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ3JheVByb2ZpbGUgPSBnZXRJbnN0YW5jZSgiR1JBWS5wZiIpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdyYXlQcm9maWxlOworCisgICAgICAgICAgICAgICAgY2FzZSBDb2xvclNwYWNlLkNTX1BZQ0M6CisgICAgICAgICAgICAgICAgICAgIGlmIChweWNjUHJvZmlsZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBweWNjUHJvZmlsZSA9IGdldEluc3RhbmNlKCJQWUNDLnBmIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHljY1Byb2ZpbGU7CisKKyAgICAgICAgICAgICAgICBjYXNlIENvbG9yU3BhY2UuQ1NfTElORUFSX1JHQjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVhclJHQlByb2ZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGluZWFyUkdCUHJvZmlsZSA9IGdldEluc3RhbmNlKCJMSU5FQVJfUkdCLnBmIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGluZWFyUkdCUHJvZmlsZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBhd3QuMTYzPUNhbid0IG9wZW4gY29sb3IgcHJvZmlsZQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoIkNhbid0IG9wZW4gY29sb3IgcHJvZmlsZSIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzUkdCUHJvZmlsZTsKIAotICAgICAgY2FzZSBDb2xvclNwYWNlLkNTX0NJRVhZWjoKLSAgICAgICAgaWYgKHh5elByb2ZpbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgeHl6UHJvZmlsZSA9IGdldEluc3RhbmNlKCJDSUVYWVoucGYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB4eXpQcm9maWxlOwotCi0gICAgICBjYXNlIENvbG9yU3BhY2UuQ1NfR1JBWToKLSAgICAgICAgaWYgKGdyYXlQcm9maWxlID09IG51bGwpIHsKLSAgICAgICAgICAgIGdyYXlQcm9maWxlID0gZ2V0SW5zdGFuY2UoIkdSQVkucGYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBncmF5UHJvZmlsZTsKLQotICAgICAgY2FzZSBDb2xvclNwYWNlLkNTX1BZQ0M6Ci0gICAgICAgIGlmIChweWNjUHJvZmlsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBweWNjUHJvZmlsZSA9IGdldEluc3RhbmNlKCJQWUNDLnBmIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHljY1Byb2ZpbGU7Ci0KLSAgICAgIGNhc2UgQ29sb3JTcGFjZS5DU19MSU5FQVJfUkdCOgotICAgICAgICBpZiAobGluZWFyUkdCUHJvZmlsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsaW5lYXJSR0JQcm9maWxlID0gZ2V0SW5zdGFuY2UoIkxJTkVBUl9SR0IucGYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsaW5lYXJSR0JQcm9maWxlOwotICAgICAgfQotCi0gICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAvLyBhd3QuMTYzPUNhbid0IG9wZW4gY29sb3IgcHJvZmlsZSAKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoIkNhbid0IG9wZW4gY29sb3IgcHJvZmlsZSIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAvLyBhd3QuMTY0PU5vdCBhIHByZWRlZmluZWQgY29sb3Igc3BhY2UKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoIk5vdCBhIHByZWRlZmluZWQgY29sb3Igc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKICAgICB9CiAKLSAgICAvLyBhd3QuMTY0PU5vdCBhIHByZWRlZmluZWQgY29sb3Igc3BhY2UKLSAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiTm90IGEgcHJlZGVmaW5lZCBjb2xvciBzcGFjZSIpKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0KICAgICAvKioKICAgICAgKiBSZWFkcyBhbiBpbnRlZ2VyIGZyb20gdGhlIHByb2ZpbGUgaGVhZGVyIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIGlkeCAtIG9mZnNldCBpbiBieXRlcyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGhlYWRlcgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGludCBmcm9tIGhlYWRlcgorICAgICAqIEBwYXJhbSBpZHgKKyAgICAgKiAgICAgICAgICAgIC0gb2Zmc2V0IGluIGJ5dGVzIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgaGVhZGVyCisgICAgICogQHJldHVybiB0aGUgaW50ZWdlciB2YWx1ZSBmcm9tIGhlYWRlcgogICAgICAqLwogICAgIHByaXZhdGUgaW50IGdldEludEZyb21IZWFkZXIoaW50IGlkeCkgewogICAgICAgICBpZiAoaGVhZGVyRGF0YSA9PSBudWxsKSB7CiAgICAgICAgICAgICBoZWFkZXJEYXRhID0gZ2V0RGF0YShpY1NpZ0hlYWQpOwogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuICAoKGhlYWRlckRhdGFbaWR4XSAgICYgMHhGRikgPDwgMjQpfAotICAgICAgICAgICAgICAgICAgKChoZWFkZXJEYXRhW2lkeCsxXSAmIDB4RkYpIDw8IDE2KXwKLSAgICAgICAgICAgICAgICAgICgoaGVhZGVyRGF0YVtpZHgrMl0gJiAweEZGKSA8PCA4KSB8Ci0gICAgICAgICAgICAgICAgICAoKGhlYWRlckRhdGFbaWR4KzNdICYgMHhGRikpOworICAgICAgICByZXR1cm4gKChoZWFkZXJEYXRhW2lkeF0gJiAweEZGKSA8PCAyNCkgfCAoKGhlYWRlckRhdGFbaWR4ICsgMV0gJiAweEZGKSA8PCAxNikKKyAgICAgICAgICAgICAgICB8ICgoaGVhZGVyRGF0YVtpZHggKyAyXSAmIDB4RkYpIDw8IDgpIHwgKChoZWFkZXJEYXRhW2lkeCArIDNdICYgMHhGRikpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFJlYWRzIGJ5dGUgZnJvbSB0aGUgcHJvZmlsZSBoZWFkZXIgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWR4IC0gb2Zmc2V0IGluIGJ5dGVzIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgaGVhZGVyCi0gICAgICogCisgICAgICogQHBhcmFtIGlkeAorICAgICAqICAgICAgICAgICAgLSBvZmZzZXQgaW4gYnl0ZXMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBoZWFkZXIKICAgICAgKiBAcmV0dXJuIHRoZSBieXRlIGZyb20gaGVhZGVyCiAgICAgICovCiAgICAgcHJpdmF0ZSBieXRlIGdldEJ5dGVGcm9tSGVhZGVyKGludCBpZHgpIHsKQEAgLTEwMzksMTEgKzEyODksMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBJQ0MgY29sb3Igc3BhY2Ugc2lnbmF0dXJlIHRvIHRoZSBqYXZhIHByZWRlZmluZWQKLSAgICAgKiBjb2xvciBzcGFjZSB0eXBlLgorICAgICAqIENvbnZlcnRzIElDQyBjb2xvciBzcGFjZSBzaWduYXR1cmUgdG8gdGhlIGphdmEgcHJlZGVmaW5lZCBjb2xvciBzcGFjZQorICAgICAqIHR5cGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNpZ25hdHVyZSB0aGUgc2lnbmF0dXJlCi0gICAgICogCisgICAgICogQHBhcmFtIHNpZ25hdHVyZQorICAgICAqICAgICAgICAgICAgdGhlIHNpZ25hdHVyZQogICAgICAqIEByZXR1cm4gdGhlIGludAogICAgICAqLwogICAgIHByaXZhdGUgaW50IGNzRnJvbVNpZ25hdHVyZShpbnQgc2lnbmF0dXJlKSB7CkBAIC0xMTAyLDcgKzEzNTIsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gYXd0LjE2NT1Db2xvciBzcGFjZSBkb2Vzbid0IGNvbXBseSB3aXRoIElDQyBzcGVjaWZpY2F0aW9uCi0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjE2NSIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjE2NSIpKTsgLy8kTk9OLU5MUy0xJAogICAgIH0KIAogICAgIC8qKgpAQCAtMTExOCwyMiArMTM2OCwxOSBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGRhdGEgc2l6ZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGFnU2lnbmF0dXJlIHRoZSB0YWcgc2lnbmF0dXJlCi0gICAgICogCisgICAgICogQHBhcmFtIHRhZ1NpZ25hdHVyZQorICAgICAqICAgICAgICAgICAgdGhlIHRhZyBzaWduYXR1cmUKICAgICAgKiBAcmV0dXJuIHRoZSBkYXRhIHNpemUKICAgICAgKi8KICAgICBwcml2YXRlIGludCBnZXREYXRhU2l6ZShpbnQgdGFnU2lnbmF0dXJlKSB7Ci0gICAgICAgIHJldHVybiBOYXRpdmVDTU0uY21tR2V0UHJvZmlsZUVsZW1lbnRTaXplKAotICAgICAgICAgICAgICAgIHByb2ZpbGVIYW5kbGUsCi0gICAgICAgICAgICAgICAgdGFnU2lnbmF0dXJlCi0gICAgICAgICAgICApOworICAgICAgICByZXR1cm4gTmF0aXZlQ01NLmNtbUdldFByb2ZpbGVFbGVtZW50U2l6ZShwcm9maWxlSGFuZGxlLCB0YWdTaWduYXR1cmUpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFJlYWRzIFhZWiB2YWx1ZSBmcm9tIHRoZSB0YWcgZGF0YS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGFnU2lnbmF0dXJlIHRoZSB0YWcgc2lnbmF0dXJlCi0gICAgICogCisgICAgICogQHBhcmFtIHRhZ1NpZ25hdHVyZQorICAgICAqICAgICAgICAgICAgdGhlIHRhZyBzaWduYXR1cmUKICAgICAgKiBAcmV0dXJuIHRoZSBYWVogdmFsdWUKICAgICAgKi8KICAgICBmbG9hdFtdIGdldFhZWlZhbHVlKGludCB0YWdTaWduYXR1cmUpIHsKQEAgLTExNTMsMjAgKzE0MDAsMjAgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBtZWRpYSB3aGl0ZSBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZWRpYSB3aGl0ZSBwb2ludAorICAgICAqIEByZXR1cm4gdGhlIG1lZGlhIHdoaXRlIHBvaW50LgogICAgICAqLwogICAgIGZsb2F0W10gZ2V0TWVkaWFXaGl0ZVBvaW50KCkgewogICAgICAgICByZXR1cm4gZ2V0WFlaVmFsdWUoaWNTaWdNZWRpYVdoaXRlUG9pbnRUYWcpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIElmIFRSQyBpcyBub3QgYSB0YWJsZSByZXR1cm5zIGdhbW1hIHZpYSByZXR1cm4gdmFsdWUKLSAgICAgKiBhbmQgc2V0cyBkYXRhVFJDIHRvIG51bGwuIElmIFRSQyBpcyBhIHRhYmxlIHJldHVybnMgMAotICAgICAqIGFuZCBmaWxscyBkYXRhVFJDIHdpdGggdmFsdWVzLgorICAgICAqIElmIFRSQyBpcyBub3QgYSB0YWJsZSByZXR1cm5zIGdhbW1hIHZpYSByZXR1cm4gdmFsdWUgYW5kIHNldHMgZGF0YVRSQyB0bworICAgICAqIG51bGwuIElmIFRSQyBpcyBhIHRhYmxlIHJldHVybnMgMCBhbmQgZmlsbHMgZGF0YVRSQyB3aXRoIHZhbHVlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGFnU2lnbmF0dXJlIHRoZSB0YWcgc2lnbmF0dXJlCi0gICAgICogQHBhcmFtIGRhdGFUUkMgdGhlIGRhdGEgdHJjCi0gICAgICogCisgICAgICogQHBhcmFtIHRhZ1NpZ25hdHVyZQorICAgICAqICAgICAgICAgICAgdGhlIHRhZyBzaWduYXR1cmUKKyAgICAgKiBAcGFyYW0gZGF0YVRSQworICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgdHJjCiAgICAgICogQHJldHVybiAtIGdhbW1hIG9yIHplcm8gaWYgVFJDIGlzIGEgdGFibGUKICAgICAgKi8KICAgICBwcml2YXRlIGZsb2F0IGdldEdhbW1hT3JUUkMoaW50IHRhZ1NpZ25hdHVyZSwgc2hvcnRbXSBkYXRhVFJDKSB7CkBAIC0xMTk1LDggKzE0NDIsOCBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGdhbW1hLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0YWdTaWduYXR1cmUgdGhlIHRhZyBzaWduYXR1cmUKLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gdGFnU2lnbmF0dXJlCisgICAgICogICAgICAgICAgICB0aGUgdGFnIHNpZ25hdHVyZQogICAgICAqIEByZXR1cm4gdGhlIGdhbW1hCiAgICAgICovCiAgICAgZmxvYXQgZ2V0R2FtbWEoaW50IHRhZ1NpZ25hdHVyZSkgewpAQCAtMTIxMSwxMCArMTQ1OCwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRSQy4KKyAgICAgKiBHZXRzIHRoZSBUUkMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHRhZ1NpZ25hdHVyZSB0aGUgdGFnIHNpZ25hdHVyZQotICAgICAqIAorICAgICAqIEBwYXJhbSB0YWdTaWduYXR1cmUKKyAgICAgKiAgICAgICAgICAgIHRoZSB0YWcgc2lnbmF0dXJlCiAgICAgICogQHJldHVybiB0aGUgdFJDCiAgICAgICovCiAgICAgc2hvcnRbXSBnZXRUUkMoaW50IHRhZ1NpZ25hdHVyZSkgewpAQCAtMTIyOCw0ICsxNDc1LDMgQEAKICAgICAgICAgcmV0dXJuIGRhdGFUUkM7CiAgICAgfQogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvY29sb3IvSUNDX1Byb2ZpbGVHcmF5LmphdmEgYi9hd3QvamF2YS9hd3QvY29sb3IvSUNDX1Byb2ZpbGVHcmF5LmphdmEKaW5kZXggZjAwOWIxOC4uZjc0ODEwMSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2NvbG9yL0lDQ19Qcm9maWxlR3JheS5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9jb2xvci9JQ0NfUHJvZmlsZUdyYXkuamF2YQpAQCAtMjIsMjEgKzIyLDI2IEBACiAKIC8qKgogICogVGhlIElDQ19Qcm9maWxlR3JheSBjbGFzcyByZXByZXNlbnQgcHJvZmlsZXMgd2l0aCBUWVBFX0dSQVkgY29sb3Igc3BhY2UgdHlwZSwKLSAqIGFuZCBpbmNsdWRlcyB0aGUgZ3JheVRSQ1RhZyBhbmQgbWVkaWFXaGl0ZVBvaW50VGFnIHRhZ3MuIAorICogYW5kIGluY2x1ZGVzIHRoZSBncmF5VFJDVGFnIGFuZCBtZWRpYVdoaXRlUG9pbnRUYWcgdGFncy4gVGhlIGdyYXkgY29tcG9uZW50CisgKiBjYW4gYmUgdHJhbnNmb3JtZWQgZnJvbSBhIEdSQVkgZGV2aWNlIHByb2ZpbGUgY29sb3Igc3BhY2UgdG8gdGhlIENJRVhZWgorICogUHJvZmlsZSB0aHJvdWdoIHRoZSB0b25lIHJlcHJvZHVjdGlvbiBjdXJ2ZSAoVFJDKToKKyAqIDxwPgorICogUENTWSA9IGdyYXlUUkNbZGV2aWNlR3JheV0KICAqIAotICogVGhlIGdyYXkgY29tcG9uZW50IGNhbiBiZSB0cmFuc2Zvcm1lZCBmcm9tIGEgR1JBWSBkZXZpY2UgcHJvZmlsZSBjb2xvciBzcGFjZSAKLSAqIHRvIHRoZSBDSUVYWVogUHJvZmlsZSB0aHJvdWdoIHRoZSB0b25lIHJlcHJvZHVjdGlvbiBjdXJ2ZSAoVFJDKTogCi0gKiA8cD5QQ1NZID0gZ3JheVRSQ1tkZXZpY2VHcmF5XQorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBJQ0NfUHJvZmlsZUdyYXkgZXh0ZW5kcyBJQ0NfUHJvZmlsZSB7CiAgICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xMTI0NzIxMjkwNzMyMDAyNjQ5TDsKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBpQyBjXyBwcm9maWxlIGdyYXkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHByb2ZpbGVIYW5kbGUgdGhlIHByb2ZpbGUgaGFuZGxlCisgICAgICogQHBhcmFtIHByb2ZpbGVIYW5kbGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcm9maWxlIGhhbmRsZQogICAgICAqLwogICAgIElDQ19Qcm9maWxlR3JheShsb25nIHByb2ZpbGVIYW5kbGUpIHsKICAgICAgICAgc3VwZXIocHJvZmlsZUhhbmRsZSk7CkBAIC00NSwxMiArNTAsMTcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBUUkMgYXMgYW4gYXJyYXkgb2Ygc2hvcnRzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzaG9ydCBhcnJheSBvZiB0aGUgVFJDLgorICAgICAqIEByZXR1cm4gdGhlIHNob3J0IGFycmF5IG9mIHRoZSBUUkMuCiAgICAgICovCiAgICAgcHVibGljIHNob3J0W10gZ2V0VFJDKCkgewogICAgICAgICByZXR1cm4gc3VwZXIuZ2V0VFJDKGljU2lnR3JheVRSQ1RhZyk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbWVkaWEgd2hpdGUgcG9pbnQuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbWVkaWEgd2hpdGUgcG9pbnQKKyAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZmxvYXRbXSBnZXRNZWRpYVdoaXRlUG9pbnQoKSB7CiAgICAgICAgIHJldHVybiBzdXBlci5nZXRNZWRpYVdoaXRlUG9pbnQoKTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9jb2xvci9JQ0NfUHJvZmlsZVJHQi5qYXZhIGIvYXd0L2phdmEvYXd0L2NvbG9yL0lDQ19Qcm9maWxlUkdCLmphdmEKaW5kZXggYmViMWEwYy4uOWM2MDEwZiAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2NvbG9yL0lDQ19Qcm9maWxlUkdCLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2NvbG9yL0lDQ19Qcm9maWxlUkdCLmphdmEKQEAgLTIzLDM4ICsyMyw1OCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFRoZSBJQ0NfUHJvZmlsZVJHQiBjbGFzcyByZXByZXNlbnRzIHByb2ZpbGVzIHdpdGggUkdCIGNvbG9yIHNwYWNlIHR5cGUgYW5kIAotICogY29udGFpbnMgdGhlIHJlZENvbG9yYW50VGFnLCBncmVlbkNvbG9yYW50VGFnLCBibHVlQ29sb3JhbnRUYWcsIHJlZFRSQ1RhZywgCisgKiBUaGUgSUNDX1Byb2ZpbGVSR0IgY2xhc3MgcmVwcmVzZW50cyBwcm9maWxlcyB3aXRoIFJHQiBjb2xvciBzcGFjZSB0eXBlIGFuZAorICogY29udGFpbnMgdGhlIHJlZENvbG9yYW50VGFnLCBncmVlbkNvbG9yYW50VGFnLCBibHVlQ29sb3JhbnRUYWcsIHJlZFRSQ1RhZywKICAqIGdyZWVuVFJDVGFnLCBibHVlVFJDVGFnLCBhbmQgbWVkaWFXaGl0ZVBvaW50VGFnIHRhZ3MuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSUNDX1Byb2ZpbGVSR0IgZXh0ZW5kcyBJQ0NfUHJvZmlsZSB7CiAgICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDg1MDUwNjczODUxNTI1NzkzMzRMOwogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGlDIGNfIHByb2ZpbGUgcmdiLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBSR0IgSUNDX1Byb2ZpbGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHByb2ZpbGVIYW5kbGUgdGhlIHByb2ZpbGUgaGFuZGxlCisgICAgICogQHBhcmFtIHByb2ZpbGVIYW5kbGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcm9maWxlIGhhbmRsZQogICAgICAqLwogICAgIElDQ19Qcm9maWxlUkdCKGxvbmcgcHJvZmlsZUhhbmRsZSkgewogICAgICAgICBzdXBlcihwcm9maWxlSGFuZGxlKTsKICAgICB9CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFJFRENPTVBPTkVOVCBpbmRpY2F0ZXMgdGhlIHJlZCBjb21wb25lbnQuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFJFRENPTVBPTkVOVCBpbmRpY2F0ZXMgdGhlIHJlZCBjb21wb25lbnQuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVEQ09NUE9ORU5UID0gMDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgR1JFRU5DT01QT05FTlQgaW5kaWNhdGVzIHRoZSBncmVlbiBjb21wb25lbnQuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEdSRUVOQ09NUE9ORU5UIGluZGljYXRlcyB0aGUgZ3JlZW4gY29tcG9uZW50LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdSRUVOQ09NUE9ORU5UID0gMTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgQkxVRUNPTVBPTkVOVCBpbmRpY2F0ZXMgdGhlIGJsdWUgY29tcG9uZW50LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBCTFVFQ09NUE9ORU5UIGluZGljYXRlcyB0aGUgYmx1ZSBjb21wb25lbnQuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkxVRUNPTVBPTkVOVCA9IDI7CiAKICAgICAvLyBhd3QuMTVFPVVua25vd24gY29tcG9uZW50LiBNdXN0IGJlIFJFRENPTVBPTkVOVCwgR1JFRU5DT01QT05FTlQgb3IgQkxVRUNPTVBPTkVOVC4KLSAgICAvKiogVGhlIENvbnN0YW50IFVOS05PV05fQ09NUE9ORU5UX01TRy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVU5LTk9XTl9DT01QT05FTlRfTVNHLgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTktOT1dOX0NPTVBPTkVOVF9NU0cgPSBNZXNzYWdlcwogICAgICAgICAgICAgLmdldFN0cmluZygiYXd0LjE1RSIpOyAvLyROT04tTkxTLTEkCiAKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBUUkMuCisgICAgICogCisgICAgICogQHBhcmFtIGNvbXBvbmVudAorICAgICAqICAgICAgICAgICAgdGhlIHRhZyBzaWduYXR1cmUuCisgICAgICogQHJldHVybiB0aGUgVFJDIHZhbHVlLgorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzaG9ydFtdIGdldFRSQyhpbnQgY29tcG9uZW50KSB7CiAgICAgICAgIHN3aXRjaCAoY29tcG9uZW50KSB7CkBAIC03MCw2ICs5MCwxMyBAQAogICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFVOS05PV05fQ09NUE9ORU5UX01TRyk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZ2FtbWEuCisgICAgICogCisgICAgICogQHBhcmFtIGNvbXBvbmVudAorICAgICAqICAgICAgICAgICAgdGhlIHRhZyBzaWduYXR1cmUuCisgICAgICogQHJldHVybiB0aGUgZ2FtbWEgdmFsdWUuCisgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZsb2F0IGdldEdhbW1hKGludCBjb21wb25lbnQpIHsKICAgICAgICAgc3dpdGNoIChjb21wb25lbnQpIHsKQEAgLTg2LDExICsxMTMsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGEgZmxvYXQgbWF0cml4IHdoaWNoIGNvbnRhaW5zIHRoZSBYLCBZLCBhbmQgWiBjb21wb25lbnRzIG9mIAotICAgICAqIHRoZSBwcm9maWxlJ3MgcmVkQ29sb3JhbnRUYWcsIGdyZWVuQ29sb3JhbnRUYWcsIGFuZCBibHVlQ29sb3JhbnRUYWcuCisgICAgICogR2V0cyBhIGZsb2F0IG1hdHJpeCB3aGljaCBjb250YWlucyB0aGUgWCwgWSwgYW5kIFogY29tcG9uZW50cyBvZiB0aGUKKyAgICAgKiBwcm9maWxlJ3MgcmVkQ29sb3JhbnRUYWcsIGdyZWVuQ29sb3JhbnRUYWcsIGFuZCBibHVlQ29sb3JhbnRUYWcuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIGZsb2F0IG1hdHJpeCB3aGljaCBjb250YWlucyB0aGUgWCwgWSwgYW5kIFogY29tcG9uZW50cyBvZiAKLSAgICAgKiB0aGUgcHJvZmlsZSdzIHJlZENvbG9yYW50VGFnLCBncmVlbkNvbG9yYW50VGFnLCBhbmQgYmx1ZUNvbG9yYW50VGFnLgorICAgICAqIEByZXR1cm4gdGhlIGZsb2F0IG1hdHJpeCB3aGljaCBjb250YWlucyB0aGUgWCwgWSwgYW5kIFogY29tcG9uZW50cyBvZiB0aGUKKyAgICAgKiAgICAgICAgIHByb2ZpbGUncyByZWRDb2xvcmFudFRhZywgZ3JlZW5Db2xvcmFudFRhZywgYW5kIGJsdWVDb2xvcmFudFRhZy4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXRbXVtdIGdldE1hdHJpeCgpIHsKICAgICAgICAgZmxvYXQgW11bXSBtID0gbmV3IGZsb2F0WzNdWzNdOyAvLyBUaGUgbWF0cml4CkBAIC0xMTQsNiArMTQxLDExIEBACiAgICAgICAgIHJldHVybiBtOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEdldHMgdGhlIG1lZGlhIHdoaXRlIHBvaW50LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG1lZGlhIHdoaXRlIHBvaW50LgorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmbG9hdFtdIGdldE1lZGlhV2hpdGVQb2ludCgpIHsKICAgICAgICAgcmV0dXJuIHN1cGVyLmdldE1lZGlhV2hpdGVQb2ludCgpOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2NvbG9yL1Byb2ZpbGVEYXRhRXhjZXB0aW9uLmphdmEgYi9hd3QvamF2YS9hd3QvY29sb3IvUHJvZmlsZURhdGFFeGNlcHRpb24uamF2YQppbmRleCBjYTE2OWZlLi4zMzVmMzE0IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvY29sb3IvUHJvZmlsZURhdGFFeGNlcHRpb24uamF2YQorKysgYi9hd3QvamF2YS9hd3QvY29sb3IvUHJvZmlsZURhdGFFeGNlcHRpb24uamF2YQpAQCAtMjEsMTggKzIxLDIzIEBACiBwYWNrYWdlIGphdmEuYXd0LmNvbG9yOwogCiAvKioKLSAqIFRoZSBQcm9maWxlRGF0YUV4Y2VwdGlvbiBjbGFzcyByZXByZXNlbnRzIGFuIGVycm9yIHdoaWNoIG9jY3VycyAKLSAqIHdoaWxlIGFjY2Vzc2luZyBvciBwcm9jZXNzaW5nIGFuIElDQ19Qcm9maWxlIG9iamVjdC4KKyAqIFRoZSBQcm9maWxlRGF0YUV4Y2VwdGlvbiBjbGFzcyByZXByZXNlbnRzIGFuIGVycm9yIHdoaWNoIG9jY3VycyB3aGlsZQorICogYWNjZXNzaW5nIG9yIHByb2Nlc3NpbmcgYW4gSUNDX1Byb2ZpbGUgb2JqZWN0LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFByb2ZpbGVEYXRhRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CiAgICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDcyODYxNDA4ODgyNDAzMjI0OThMOwogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHByb2ZpbGUgZGF0YSBleGNlcHRpb24gd2l0aCBkZXRhaWxlZCBtZXNzYWdlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzIHRoZSBkZXRhaWxlZCBtZXNzYWdlLgorICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICB0aGUgZGV0YWlsZWQgbWVzc2FnZSBvZiB0aGUgZXhjZXB0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBQcm9maWxlRGF0YUV4Y2VwdGlvbihTdHJpbmcgcykgewogICAgICAgICBzdXBlcihzKTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9jb2xvci9wYWNrYWdlLmh0bWwgYi9hd3QvamF2YS9hd3QvY29sb3IvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwOWQ5NjMKLS0tIC9kZXYvbnVsbAorKysgYi9hd3QvamF2YS9hd3QvY29sb3IvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsOCBAQAorPGh0bWw+CisgIDxib2R5PgorICAgIDxwPgorICAgICAgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIGNsYXNzZXMgcmVwcmVzZW50aW5nIGNvbG9yIHNwYWNlcyBhbmQgcHJvZmlsZXMgYmFzZWQgb24gdGhlIEludGVybmF0aW9uYWwgQ29sb3IgQ29uc29ydGl1bSAoSUNDKSBQcm9maWxlIEZvcm1hdCBTcGVjaWZpY2F0aW9uLiAKKyAgICA8L3A+CisgICAgQHNpbmNlIEFuZHJvaWQgMS4wCisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9BV1RFdmVudExpc3RlbmVyLmphdmEgYi9hd3QvamF2YS9hd3QvZXZlbnQvQVdURXZlbnRMaXN0ZW5lci5qYXZhCmluZGV4IGY2MjFjOWIuLjc2MjkzYjMgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9ldmVudC9BV1RFdmVudExpc3RlbmVyLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L0FXVEV2ZW50TGlzdGVuZXIuamF2YQpAQCAtMjMsNiArMjMsMTIgQEAKIGltcG9ydCBqYXZhLmF3dC5BV1RFdmVudDsKIGltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGludGVyZmFjZSBBV1RFdmVudExpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7CiAKICAgICBwdWJsaWMgdm9pZCBldmVudERpc3BhdGNoZWQoQVdURXZlbnQgZXZlbnQpOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2V2ZW50L0FXVEV2ZW50TGlzdGVuZXJQcm94eS5qYXZhIGIvYXd0L2phdmEvYXd0L2V2ZW50L0FXVEV2ZW50TGlzdGVuZXJQcm94eS5qYXZhCmluZGV4IDVlZTVlNTkuLjNlZGM0MWYgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9ldmVudC9BV1RFdmVudExpc3RlbmVyUHJveHkuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZXZlbnQvQVdURXZlbnRMaXN0ZW5lclByb3h5LmphdmEKQEAgLTI2LDYgKzI2LDEyIEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGNsYXNzIEFXVEV2ZW50TGlzdGVuZXJQcm94eSBleHRlbmRzIEV2ZW50TGlzdGVuZXJQcm94eSBpbXBsZW1lbnRzIEFXVEV2ZW50TGlzdGVuZXIgewogCiAgICAgcHJpdmF0ZSBBV1RFdmVudExpc3RlbmVyIGxpc3RlbmVyOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2V2ZW50L0FjdGlvbkV2ZW50LmphdmEgYi9hd3QvamF2YS9hd3QvZXZlbnQvQWN0aW9uRXZlbnQuamF2YQppbmRleCBjMzJmYzRiLi5lODgyZTBkIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZXZlbnQvQWN0aW9uRXZlbnQuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZXZlbnQvQWN0aW9uRXZlbnQuamF2YQpAQCAtMjIsNiArMjIsMTIgQEAKIAogaW1wb3J0IGphdmEuYXd0LkFXVEV2ZW50OwogCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHN1cHBvcnRlZCBpbiBBbmRyb2lkIDEuMC4gSXQgaXMgbWVyZWx5IHByb3ZpZGVkIHRvIG1haW50YWluCisgKiBpbnRlcmZhY2UgY29tcGF0aWJpbGl0eSB3aXRoIGRlc2t0b3AgSmF2YSBpbXBsZW1lbnRhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgY2xhc3MgQWN0aW9uRXZlbnQgZXh0ZW5kcyBBV1RFdmVudCB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzY3MTA3ODc5NjI3MzgzMjE0OUw7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZXZlbnQvQWN0aW9uTGlzdGVuZXIuamF2YSBiL2F3dC9qYXZhL2F3dC9ldmVudC9BY3Rpb25MaXN0ZW5lci5qYXZhCmluZGV4IDQ3M2QyYjYuLmE2ZWVlN2EgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9ldmVudC9BY3Rpb25MaXN0ZW5lci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9ldmVudC9BY3Rpb25MaXN0ZW5lci5qYXZhCkBAIC0yMiw2ICsyMiwxMiBAQAogCiBpbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7CiAKKy8qKgorICogVGhpcyBjbGFzcyBpcyBub3Qgc3VwcG9ydGVkIGluIEFuZHJvaWQgMS4wLiBJdCBpcyBtZXJlbHkgcHJvdmlkZWQgdG8gbWFpbnRhaW4KKyAqIGludGVyZmFjZSBjb21wYXRpYmlsaXR5IHdpdGggZGVza3RvcCBKYXZhIGltcGxlbWVudGF0aW9ucy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KIHB1YmxpYyBpbnRlcmZhY2UgQWN0aW9uTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKIAogICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9BZGp1c3RtZW50RXZlbnQuamF2YSBiL2F3dC9qYXZhL2F3dC9ldmVudC9BZGp1c3RtZW50RXZlbnQuamF2YQppbmRleCBhMmIxMWE4Li5iZTJkNmM0IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZXZlbnQvQWRqdXN0bWVudEV2ZW50LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L0FkanVzdG1lbnRFdmVudC5qYXZhCkBAIC0yMyw2ICsyMywxMiBAQAogaW1wb3J0IGphdmEuYXd0LkFXVEV2ZW50OwogaW1wb3J0IGphdmEuYXd0LkFkanVzdGFibGU7CiAKKy8qKgorICogVGhpcyBjbGFzcyBpcyBub3Qgc3VwcG9ydGVkIGluIEFuZHJvaWQgMS4wLiBJdCBpcyBtZXJlbHkgcHJvdmlkZWQgdG8gbWFpbnRhaW4KKyAqIGludGVyZmFjZSBjb21wYXRpYmlsaXR5IHdpdGggZGVza3RvcCBKYXZhIGltcGxlbWVudGF0aW9ucy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KIHB1YmxpYyBjbGFzcyBBZGp1c3RtZW50RXZlbnQgZXh0ZW5kcyBBV1RFdmVudCB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1NzAwMjkwNjQ1MjA1Mjc5OTIxTDsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9BZGp1c3RtZW50TGlzdGVuZXIuamF2YSBiL2F3dC9qYXZhL2F3dC9ldmVudC9BZGp1c3RtZW50TGlzdGVuZXIuamF2YQppbmRleCBlZjdjMzc4Li41ZjZhNzI0IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZXZlbnQvQWRqdXN0bWVudExpc3RlbmVyLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L0FkanVzdG1lbnRMaXN0ZW5lci5qYXZhCkBAIC0yMiw2ICsyMiwxMiBAQAogCiBpbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7CiAKKy8qKgorICogVGhpcyBjbGFzcyBpcyBub3Qgc3VwcG9ydGVkIGluIEFuZHJvaWQgMS4wLiBJdCBpcyBtZXJlbHkgcHJvdmlkZWQgdG8gbWFpbnRhaW4KKyAqIGludGVyZmFjZSBjb21wYXRpYmlsaXR5IHdpdGggZGVza3RvcCBKYXZhIGltcGxlbWVudGF0aW9ucy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KIHB1YmxpYyBpbnRlcmZhY2UgQWRqdXN0bWVudExpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7CiAKICAgICBwdWJsaWMgdm9pZCBhZGp1c3RtZW50VmFsdWVDaGFuZ2VkKEFkanVzdG1lbnRFdmVudCBlKTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9Db21wb25lbnRBZGFwdGVyLmphdmEgYi9hd3QvamF2YS9hd3QvZXZlbnQvQ29tcG9uZW50QWRhcHRlci5qYXZhCmluZGV4IDRmMGJkOTAuLmM0MjIzNWYgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9ldmVudC9Db21wb25lbnRBZGFwdGVyLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L0NvbXBvbmVudEFkYXB0ZXIuamF2YQpAQCAtMjAsNiArMjAsMTIgQEAKICAqLwogcGFja2FnZSBqYXZhLmF3dC5ldmVudDsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIENvbXBvbmVudEFkYXB0ZXIgaW1wbGVtZW50cyBDb21wb25lbnRMaXN0ZW5lciB7CiAKICAgICBwdWJsaWMgQ29tcG9uZW50QWRhcHRlcigpIHsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9Db21wb25lbnRFdmVudC5qYXZhIGIvYXd0L2phdmEvYXd0L2V2ZW50L0NvbXBvbmVudEV2ZW50LmphdmEKaW5kZXggZDBiY2E1NC4uNzYwZDNhYiAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2V2ZW50L0NvbXBvbmVudEV2ZW50LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L0NvbXBvbmVudEV2ZW50LmphdmEKQEAgLTIzLDYgKzIzLDEyIEBACiBpbXBvcnQgamF2YS5hd3QuQVdURXZlbnQ7CiBpbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwogCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHN1cHBvcnRlZCBpbiBBbmRyb2lkIDEuMC4gSXQgaXMgbWVyZWx5IHByb3ZpZGVkIHRvIG1haW50YWluCisgKiBpbnRlcmZhY2UgY29tcGF0aWJpbGl0eSB3aXRoIGRlc2t0b3AgSmF2YSBpbXBsZW1lbnRhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgY2xhc3MgQ29tcG9uZW50RXZlbnQgZXh0ZW5kcyBBV1RFdmVudCB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4MTAxNDA2ODIzOTAyOTkyOTY1TDsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9Db21wb25lbnRMaXN0ZW5lci5qYXZhIGIvYXd0L2phdmEvYXd0L2V2ZW50L0NvbXBvbmVudExpc3RlbmVyLmphdmEKaW5kZXggMTQ3ZTllMC4uYTVhZGJhMiAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2V2ZW50L0NvbXBvbmVudExpc3RlbmVyLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L0NvbXBvbmVudExpc3RlbmVyLmphdmEKQEAgLTIyLDYgKzIyLDEyIEBACiAKIGltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGludGVyZmFjZSBDb21wb25lbnRMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewogCiAgICAgcHVibGljIHZvaWQgY29tcG9uZW50SGlkZGVuKENvbXBvbmVudEV2ZW50IGUpOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2V2ZW50L0NvbnRhaW5lckFkYXB0ZXIuamF2YSBiL2F3dC9qYXZhL2F3dC9ldmVudC9Db250YWluZXJBZGFwdGVyLmphdmEKaW5kZXggMTJkYzNkZS4uNDQ5ODNjNyAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2V2ZW50L0NvbnRhaW5lckFkYXB0ZXIuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZXZlbnQvQ29udGFpbmVyQWRhcHRlci5qYXZhCkBAIC0yMCw2ICsyMCwxMiBAQAogICovCiBwYWNrYWdlIGphdmEuYXd0LmV2ZW50OwogCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHN1cHBvcnRlZCBpbiBBbmRyb2lkIDEuMC4gSXQgaXMgbWVyZWx5IHByb3ZpZGVkIHRvIG1haW50YWluCisgKiBpbnRlcmZhY2UgY29tcGF0aWJpbGl0eSB3aXRoIGRlc2t0b3AgSmF2YSBpbXBsZW1lbnRhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udGFpbmVyQWRhcHRlciBpbXBsZW1lbnRzIENvbnRhaW5lckxpc3RlbmVyIHsKIAogICAgIHB1YmxpYyBDb250YWluZXJBZGFwdGVyKCkgewpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2V2ZW50L0NvbnRhaW5lckV2ZW50LmphdmEgYi9hd3QvamF2YS9hd3QvZXZlbnQvQ29udGFpbmVyRXZlbnQuamF2YQppbmRleCAxYTEwNTVjLi4zNzJjOWU0IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZXZlbnQvQ29udGFpbmVyRXZlbnQuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZXZlbnQvQ29udGFpbmVyRXZlbnQuamF2YQpAQCAtMjMsNiArMjMsMTIgQEAKIGltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7CiAvLz8/P0FXVDogaW1wb3J0IGphdmEuYXd0LkNvbnRhaW5lcjsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGNsYXNzIENvbnRhaW5lckV2ZW50IGV4dGVuZHMgQ29tcG9uZW50RXZlbnQgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQxMTQ5NDIyNTA1Mzk3NzIwNDFMOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2V2ZW50L0NvbnRhaW5lckxpc3RlbmVyLmphdmEgYi9hd3QvamF2YS9hd3QvZXZlbnQvQ29udGFpbmVyTGlzdGVuZXIuamF2YQppbmRleCBiZjQ3NjY0Li41MTc4NTllIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZXZlbnQvQ29udGFpbmVyTGlzdGVuZXIuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZXZlbnQvQ29udGFpbmVyTGlzdGVuZXIuamF2YQpAQCAtMjIsNiArMjIsMTIgQEAKIAogaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwogCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHN1cHBvcnRlZCBpbiBBbmRyb2lkIDEuMC4gSXQgaXMgbWVyZWx5IHByb3ZpZGVkIHRvIG1haW50YWluCisgKiBpbnRlcmZhY2UgY29tcGF0aWJpbGl0eSB3aXRoIGRlc2t0b3AgSmF2YSBpbXBsZW1lbnRhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgaW50ZXJmYWNlIENvbnRhaW5lckxpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7CiAKICAgICBwdWJsaWMgdm9pZCBjb21wb25lbnRBZGRlZChDb250YWluZXJFdmVudCBlKTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9Gb2N1c0FkYXB0ZXIuamF2YSBiL2F3dC9qYXZhL2F3dC9ldmVudC9Gb2N1c0FkYXB0ZXIuamF2YQppbmRleCAzNDg5ZTExLi4zYTNlMzdmIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZXZlbnQvRm9jdXNBZGFwdGVyLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L0ZvY3VzQWRhcHRlci5qYXZhCkBAIC0yMCw2ICsyMCwxMiBAQAogICovCiBwYWNrYWdlIGphdmEuYXd0LmV2ZW50OwogCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHN1cHBvcnRlZCBpbiBBbmRyb2lkIDEuMC4gSXQgaXMgbWVyZWx5IHByb3ZpZGVkIHRvIG1haW50YWluCisgKiBpbnRlcmZhY2UgY29tcGF0aWJpbGl0eSB3aXRoIGRlc2t0b3AgSmF2YSBpbXBsZW1lbnRhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRm9jdXNBZGFwdGVyIGltcGxlbWVudHMgRm9jdXNMaXN0ZW5lciB7CiAKICAgICBwdWJsaWMgRm9jdXNBZGFwdGVyKCkgewpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2V2ZW50L0ZvY3VzRXZlbnQuamF2YSBiL2F3dC9qYXZhL2F3dC9ldmVudC9Gb2N1c0V2ZW50LmphdmEKaW5kZXggMWRiNTI2My4uNGExODY4OSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2V2ZW50L0ZvY3VzRXZlbnQuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZXZlbnQvRm9jdXNFdmVudC5qYXZhCkBAIC0yMiw2ICsyMiwxMiBAQAogCiBpbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwogCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHN1cHBvcnRlZCBpbiBBbmRyb2lkIDEuMC4gSXQgaXMgbWVyZWx5IHByb3ZpZGVkIHRvIG1haW50YWluCisgKiBpbnRlcmZhY2UgY29tcGF0aWJpbGl0eSB3aXRoIGRlc2t0b3AgSmF2YSBpbXBsZW1lbnRhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgY2xhc3MgRm9jdXNFdmVudCBleHRlbmRzIENvbXBvbmVudEV2ZW50IHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDUyMzc1Mzc4NjQ1NzQxNjM5Nkw7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZXZlbnQvRm9jdXNMaXN0ZW5lci5qYXZhIGIvYXd0L2phdmEvYXd0L2V2ZW50L0ZvY3VzTGlzdGVuZXIuamF2YQppbmRleCBlZTk4ZDkwLi42YmJiZDAwIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZXZlbnQvRm9jdXNMaXN0ZW5lci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9ldmVudC9Gb2N1c0xpc3RlbmVyLmphdmEKQEAgLTIyLDYgKzIyLDEyIEBACiAKIGltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGludGVyZmFjZSBGb2N1c0xpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7CiAKICAgICBwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2V2ZW50L0hpZXJhcmNoeUJvdW5kc0FkYXB0ZXIuamF2YSBiL2F3dC9qYXZhL2F3dC9ldmVudC9IaWVyYXJjaHlCb3VuZHNBZGFwdGVyLmphdmEKaW5kZXggMjRlM2Q5ZC4uYmJmZThmZiAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2V2ZW50L0hpZXJhcmNoeUJvdW5kc0FkYXB0ZXIuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZXZlbnQvSGllcmFyY2h5Qm91bmRzQWRhcHRlci5qYXZhCkBAIC0yMCw2ICsyMCwxMiBAQAogICovCiBwYWNrYWdlIGphdmEuYXd0LmV2ZW50OwogCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHN1cHBvcnRlZCBpbiBBbmRyb2lkIDEuMC4gSXQgaXMgbWVyZWx5IHByb3ZpZGVkIHRvIG1haW50YWluCisgKiBpbnRlcmZhY2UgY29tcGF0aWJpbGl0eSB3aXRoIGRlc2t0b3AgSmF2YSBpbXBsZW1lbnRhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSGllcmFyY2h5Qm91bmRzQWRhcHRlciBpbXBsZW1lbnRzIEhpZXJhcmNoeUJvdW5kc0xpc3RlbmVyIHsKIAogICAgIHB1YmxpYyBIaWVyYXJjaHlCb3VuZHNBZGFwdGVyKCkgewpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2V2ZW50L0hpZXJhcmNoeUJvdW5kc0xpc3RlbmVyLmphdmEgYi9hd3QvamF2YS9hd3QvZXZlbnQvSGllcmFyY2h5Qm91bmRzTGlzdGVuZXIuamF2YQppbmRleCA0Mjg4ZjUyLi4zZThmMmU3IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZXZlbnQvSGllcmFyY2h5Qm91bmRzTGlzdGVuZXIuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZXZlbnQvSGllcmFyY2h5Qm91bmRzTGlzdGVuZXIuamF2YQpAQCAtMjIsNiArMjIsMTIgQEAKIAogaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwogCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHN1cHBvcnRlZCBpbiBBbmRyb2lkIDEuMC4gSXQgaXMgbWVyZWx5IHByb3ZpZGVkIHRvIG1haW50YWluCisgKiBpbnRlcmZhY2UgY29tcGF0aWJpbGl0eSB3aXRoIGRlc2t0b3AgSmF2YSBpbXBsZW1lbnRhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgaW50ZXJmYWNlIEhpZXJhcmNoeUJvdW5kc0xpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7CiAKICAgICBwdWJsaWMgdm9pZCBhbmNlc3Rvck1vdmVkKEhpZXJhcmNoeUV2ZW50IGUpOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2V2ZW50L0hpZXJhcmNoeUV2ZW50LmphdmEgYi9hd3QvamF2YS9hd3QvZXZlbnQvSGllcmFyY2h5RXZlbnQuamF2YQppbmRleCAxODgxNjY3Li5jMWQyMmY0IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZXZlbnQvSGllcmFyY2h5RXZlbnQuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZXZlbnQvSGllcmFyY2h5RXZlbnQuamF2YQpAQCAtMjQsNiArMjQsMTIgQEAKIGltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7CiAvLz8/P0FXVDogaW1wb3J0IGphdmEuYXd0LkNvbnRhaW5lcjsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGNsYXNzIEhpZXJhcmNoeUV2ZW50IGV4dGVuZHMgQVdURXZlbnQgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTUzMzc1NzY5NzAwMzgwNDM5OTBMOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2V2ZW50L0hpZXJhcmNoeUxpc3RlbmVyLmphdmEgYi9hd3QvamF2YS9hd3QvZXZlbnQvSGllcmFyY2h5TGlzdGVuZXIuamF2YQppbmRleCBlMDFiYTExLi5mZjNkOWJjIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZXZlbnQvSGllcmFyY2h5TGlzdGVuZXIuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZXZlbnQvSGllcmFyY2h5TGlzdGVuZXIuamF2YQpAQCAtMjIsNiArMjIsMTIgQEAKIAogaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwogCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHN1cHBvcnRlZCBpbiBBbmRyb2lkIDEuMC4gSXQgaXMgbWVyZWx5IHByb3ZpZGVkIHRvIG1haW50YWluCisgKiBpbnRlcmZhY2UgY29tcGF0aWJpbGl0eSB3aXRoIGRlc2t0b3AgSmF2YSBpbXBsZW1lbnRhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgaW50ZXJmYWNlIEhpZXJhcmNoeUxpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7CiAKICAgICBwdWJsaWMgdm9pZCBoaWVyYXJjaHlDaGFuZ2VkKEhpZXJhcmNoeUV2ZW50IGUpOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2V2ZW50L0lucHV0RXZlbnQuamF2YSBiL2F3dC9qYXZhL2F3dC9ldmVudC9JbnB1dEV2ZW50LmphdmEKaW5kZXggYzk4MzgyZC4uMzQzYjdhMyAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2V2ZW50L0lucHV0RXZlbnQuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZXZlbnQvSW5wdXRFdmVudC5qYXZhCkBAIC0yMiw2ICsyMiwxMiBAQAogCiBpbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwogCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHN1cHBvcnRlZCBpbiBBbmRyb2lkIDEuMC4gSXQgaXMgbWVyZWx5IHByb3ZpZGVkIHRvIG1haW50YWluCisgKiBpbnRlcmZhY2UgY29tcGF0aWJpbGl0eSB3aXRoIGRlc2t0b3AgSmF2YSBpbXBsZW1lbnRhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW5wdXRFdmVudCBleHRlbmRzIENvbXBvbmVudEV2ZW50IHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yNDgyNTI1OTgxNjk4MzA5Nzg2TDsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9JbnB1dE1ldGhvZEV2ZW50LmphdmEgYi9hd3QvamF2YS9hd3QvZXZlbnQvSW5wdXRNZXRob2RFdmVudC5qYXZhCmluZGV4IGE1Y2FjNGUuLmJlMDAxYTUgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9ldmVudC9JbnB1dE1ldGhvZEV2ZW50LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L0lucHV0TWV0aG9kRXZlbnQuamF2YQpAQCAtMjcsNiArMjcsMTIgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHN1cHBvcnRlZCBpbiBBbmRyb2lkIDEuMC4gSXQgaXMgbWVyZWx5IHByb3ZpZGVkIHRvIG1haW50YWluCisgKiBpbnRlcmZhY2UgY29tcGF0aWJpbGl0eSB3aXRoIGRlc2t0b3AgSmF2YSBpbXBsZW1lbnRhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgY2xhc3MgSW5wdXRNZXRob2RFdmVudCBleHRlbmRzIEFXVEV2ZW50IHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQ3MjcxOTA4NzQ3Nzg5MjI2NjFMOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2V2ZW50L0lucHV0TWV0aG9kTGlzdGVuZXIuamF2YSBiL2F3dC9qYXZhL2F3dC9ldmVudC9JbnB1dE1ldGhvZExpc3RlbmVyLmphdmEKaW5kZXggMGFiNjkxOC4uODVlYWE3ZSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2V2ZW50L0lucHV0TWV0aG9kTGlzdGVuZXIuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZXZlbnQvSW5wdXRNZXRob2RMaXN0ZW5lci5qYXZhCkBAIC0yMiw2ICsyMiwxMiBAQAogCiBpbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7CiAKKy8qKgorICogVGhpcyBjbGFzcyBpcyBub3Qgc3VwcG9ydGVkIGluIEFuZHJvaWQgMS4wLiBJdCBpcyBtZXJlbHkgcHJvdmlkZWQgdG8gbWFpbnRhaW4KKyAqIGludGVyZmFjZSBjb21wYXRpYmlsaXR5IHdpdGggZGVza3RvcCBKYXZhIGltcGxlbWVudGF0aW9ucy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSW5wdXRNZXRob2RMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewogCiAgICAgcHVibGljIHZvaWQgY2FyZXRQb3NpdGlvbkNoYW5nZWQoSW5wdXRNZXRob2RFdmVudCBlKTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9JbnZvY2F0aW9uRXZlbnQuamF2YSBiL2F3dC9qYXZhL2F3dC9ldmVudC9JbnZvY2F0aW9uRXZlbnQuamF2YQppbmRleCA1OTM0NmVkLi41OGUzYjcyIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZXZlbnQvSW52b2NhdGlvbkV2ZW50LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L0ludm9jYXRpb25FdmVudC5qYXZhCkBAIC0yNSw2ICsyNSwxMiBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKKy8qKgorICogVGhpcyBjbGFzcyBpcyBub3Qgc3VwcG9ydGVkIGluIEFuZHJvaWQgMS4wLiBJdCBpcyBtZXJlbHkgcHJvdmlkZWQgdG8gbWFpbnRhaW4KKyAqIGludGVyZmFjZSBjb21wYXRpYmlsaXR5IHdpdGggZGVza3RvcCBKYXZhIGltcGxlbWVudGF0aW9ucy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KIHB1YmxpYyBjbGFzcyBJbnZvY2F0aW9uRXZlbnQgZXh0ZW5kcyBBV1RFdmVudCBpbXBsZW1lbnRzIEFjdGl2ZUV2ZW50IHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQzNjA1NjM0NDkwOTQ1OTQ1MEw7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZXZlbnQvSXRlbUV2ZW50LmphdmEgYi9hd3QvamF2YS9hd3QvZXZlbnQvSXRlbUV2ZW50LmphdmEKaW5kZXggODQyZGExNC4uMDk5MDhmMiAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2V2ZW50L0l0ZW1FdmVudC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9ldmVudC9JdGVtRXZlbnQuamF2YQpAQCAtMjMsNiArMjMsMTIgQEAKIGltcG9ydCBqYXZhLmF3dC5BV1RFdmVudDsKIGltcG9ydCBqYXZhLmF3dC5JdGVtU2VsZWN0YWJsZTsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGNsYXNzIEl0ZW1FdmVudCBleHRlbmRzIEFXVEV2ZW50IHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02MDg3MDgxMzI0NDcyMDY5MzNMOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2V2ZW50L0l0ZW1MaXN0ZW5lci5qYXZhIGIvYXd0L2phdmEvYXd0L2V2ZW50L0l0ZW1MaXN0ZW5lci5qYXZhCmluZGV4IDMzNjMzYmUuLjhkZWM2NzMgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9ldmVudC9JdGVtTGlzdGVuZXIuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZXZlbnQvSXRlbUxpc3RlbmVyLmphdmEKQEAgLTIyLDYgKzIyLDEyIEBACiAKIGltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGludGVyZmFjZSBJdGVtTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKIAogICAgIHB1YmxpYyB2b2lkIGl0ZW1TdGF0ZUNoYW5nZWQoSXRlbUV2ZW50IGUpOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2V2ZW50L0tleUFkYXB0ZXIuamF2YSBiL2F3dC9qYXZhL2F3dC9ldmVudC9LZXlBZGFwdGVyLmphdmEKaW5kZXggNDIzYjVjOS4uYTk2Y2NhOCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2V2ZW50L0tleUFkYXB0ZXIuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZXZlbnQvS2V5QWRhcHRlci5qYXZhCkBAIC0yMCw2ICsyMCwxMiBAQAogICovCiBwYWNrYWdlIGphdmEuYXd0LmV2ZW50OwogCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHN1cHBvcnRlZCBpbiBBbmRyb2lkIDEuMC4gSXQgaXMgbWVyZWx5IHByb3ZpZGVkIHRvIG1haW50YWluCisgKiBpbnRlcmZhY2UgY29tcGF0aWJpbGl0eSB3aXRoIGRlc2t0b3AgSmF2YSBpbXBsZW1lbnRhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgS2V5QWRhcHRlciBpbXBsZW1lbnRzIEtleUxpc3RlbmVyIHsKIAogICAgIHB1YmxpYyBLZXlBZGFwdGVyKCkgewpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2V2ZW50L0tleUV2ZW50LmphdmEgYi9hd3QvamF2YS9hd3QvZXZlbnQvS2V5RXZlbnQuamF2YQppbmRleCAwNTZjNjRjLi44NjI3ZjcwIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZXZlbnQvS2V5RXZlbnQuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZXZlbnQvS2V5RXZlbnQuamF2YQpAQCAtMjcsNiArMjcsMTIgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHN1cHBvcnRlZCBpbiBBbmRyb2lkIDEuMC4gSXQgaXMgbWVyZWx5IHByb3ZpZGVkIHRvIG1haW50YWluCisgKiBpbnRlcmZhY2UgY29tcGF0aWJpbGl0eSB3aXRoIGRlc2t0b3AgSmF2YSBpbXBsZW1lbnRhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgY2xhc3MgS2V5RXZlbnQgZXh0ZW5kcyBJbnB1dEV2ZW50IHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yMzUyMTMwOTUzMDI4MTI2OTU0TDsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9LZXlMaXN0ZW5lci5qYXZhIGIvYXd0L2phdmEvYXd0L2V2ZW50L0tleUxpc3RlbmVyLmphdmEKaW5kZXggZjIwZmM5MC4uZWMxNDRkZiAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2V2ZW50L0tleUxpc3RlbmVyLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L0tleUxpc3RlbmVyLmphdmEKQEAgLTIyLDYgKzIyLDEyIEBACiAKIGltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGludGVyZmFjZSBLZXlMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewogCiAgICAgcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9Nb3VzZUFkYXB0ZXIuamF2YSBiL2F3dC9qYXZhL2F3dC9ldmVudC9Nb3VzZUFkYXB0ZXIuamF2YQppbmRleCA0OTczOTU2Li5kYzE5MTczIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZXZlbnQvTW91c2VBZGFwdGVyLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L01vdXNlQWRhcHRlci5qYXZhCkBAIC0yMCw2ICsyMCwxMiBAQAogICovCiBwYWNrYWdlIGphdmEuYXd0LmV2ZW50OwogCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHN1cHBvcnRlZCBpbiBBbmRyb2lkIDEuMC4gSXQgaXMgbWVyZWx5IHByb3ZpZGVkIHRvIG1haW50YWluCisgKiBpbnRlcmZhY2UgY29tcGF0aWJpbGl0eSB3aXRoIGRlc2t0b3AgSmF2YSBpbXBsZW1lbnRhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTW91c2VBZGFwdGVyIGltcGxlbWVudHMgTW91c2VMaXN0ZW5lciB7CiAKICAgICBwdWJsaWMgTW91c2VBZGFwdGVyKCkgewpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2V2ZW50L01vdXNlRXZlbnQuamF2YSBiL2F3dC9qYXZhL2F3dC9ldmVudC9Nb3VzZUV2ZW50LmphdmEKaW5kZXggMGI3NzZmOS4uMmIxZmE4YiAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2V2ZW50L01vdXNlRXZlbnQuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZXZlbnQvTW91c2VFdmVudC5qYXZhCkBAIC0yNiw2ICsyNiwxMiBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKKy8qKgorICogVGhpcyBjbGFzcyBpcyBub3Qgc3VwcG9ydGVkIGluIEFuZHJvaWQgMS4wLiBJdCBpcyBtZXJlbHkgcHJvdmlkZWQgdG8gbWFpbnRhaW4KKyAqIGludGVyZmFjZSBjb21wYXRpYmlsaXR5IHdpdGggZGVza3RvcCBKYXZhIGltcGxlbWVudGF0aW9ucy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KIHB1YmxpYyBjbGFzcyBNb3VzZUV2ZW50IGV4dGVuZHMgSW5wdXRFdmVudCB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtOTkxMjE0MTUzNDk0ODQyODQ4TDsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9Nb3VzZUxpc3RlbmVyLmphdmEgYi9hd3QvamF2YS9hd3QvZXZlbnQvTW91c2VMaXN0ZW5lci5qYXZhCmluZGV4IDVkMzJiMGYuLjk1ODc5YjkgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9ldmVudC9Nb3VzZUxpc3RlbmVyLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L01vdXNlTGlzdGVuZXIuamF2YQpAQCAtMjIsNiArMjIsMTIgQEAKIAogaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwogCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHN1cHBvcnRlZCBpbiBBbmRyb2lkIDEuMC4gSXQgaXMgbWVyZWx5IHByb3ZpZGVkIHRvIG1haW50YWluCisgKiBpbnRlcmZhY2UgY29tcGF0aWJpbGl0eSB3aXRoIGRlc2t0b3AgSmF2YSBpbXBsZW1lbnRhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgaW50ZXJmYWNlIE1vdXNlTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKIAogICAgIHB1YmxpYyB2b2lkIG1vdXNlQ2xpY2tlZChNb3VzZUV2ZW50IGUpOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2V2ZW50L01vdXNlTW90aW9uQWRhcHRlci5qYXZhIGIvYXd0L2phdmEvYXd0L2V2ZW50L01vdXNlTW90aW9uQWRhcHRlci5qYXZhCmluZGV4IGE0YmViY2MuLjFlY2QwZDUgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9ldmVudC9Nb3VzZU1vdGlvbkFkYXB0ZXIuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZXZlbnQvTW91c2VNb3Rpb25BZGFwdGVyLmphdmEKQEAgLTIwLDYgKzIwLDEyIEBACiAgKi8KIHBhY2thZ2UgamF2YS5hd3QuZXZlbnQ7CiAKKy8qKgorICogVGhpcyBjbGFzcyBpcyBub3Qgc3VwcG9ydGVkIGluIEFuZHJvaWQgMS4wLiBJdCBpcyBtZXJlbHkgcHJvdmlkZWQgdG8gbWFpbnRhaW4KKyAqIGludGVyZmFjZSBjb21wYXRpYmlsaXR5IHdpdGggZGVza3RvcCBKYXZhIGltcGxlbWVudGF0aW9ucy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNb3VzZU1vdGlvbkFkYXB0ZXIgaW1wbGVtZW50cyBNb3VzZU1vdGlvbkxpc3RlbmVyIHsKIAogICAgIHB1YmxpYyBNb3VzZU1vdGlvbkFkYXB0ZXIoKSB7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZXZlbnQvTW91c2VNb3Rpb25MaXN0ZW5lci5qYXZhIGIvYXd0L2phdmEvYXd0L2V2ZW50L01vdXNlTW90aW9uTGlzdGVuZXIuamF2YQppbmRleCBhNWMxMWRhLi5lMTMxM2MzIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZXZlbnQvTW91c2VNb3Rpb25MaXN0ZW5lci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9ldmVudC9Nb3VzZU1vdGlvbkxpc3RlbmVyLmphdmEKQEAgLTIyLDYgKzIyLDEyIEBACiAKIGltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGludGVyZmFjZSBNb3VzZU1vdGlvbkxpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7CiAKICAgICBwdWJsaWMgdm9pZCBtb3VzZURyYWdnZWQoTW91c2VFdmVudCBlKTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9Nb3VzZVdoZWVsRXZlbnQuamF2YSBiL2F3dC9qYXZhL2F3dC9ldmVudC9Nb3VzZVdoZWVsRXZlbnQuamF2YQppbmRleCBkM2FjOWQ4Li5hM2VkNDI0IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZXZlbnQvTW91c2VXaGVlbEV2ZW50LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L01vdXNlV2hlZWxFdmVudC5qYXZhCkBAIC0yMiw2ICsyMiwxMiBAQAogCiBpbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwogCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHN1cHBvcnRlZCBpbiBBbmRyb2lkIDEuMC4gSXQgaXMgbWVyZWx5IHByb3ZpZGVkIHRvIG1haW50YWluCisgKiBpbnRlcmZhY2UgY29tcGF0aWJpbGl0eSB3aXRoIGRlc2t0b3AgSmF2YSBpbXBsZW1lbnRhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgY2xhc3MgTW91c2VXaGVlbEV2ZW50IGV4dGVuZHMgTW91c2VFdmVudCB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtOTE4NzQxMzU4MTk5MzU2MzkyOUw7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZXZlbnQvTW91c2VXaGVlbExpc3RlbmVyLmphdmEgYi9hd3QvamF2YS9hd3QvZXZlbnQvTW91c2VXaGVlbExpc3RlbmVyLmphdmEKaW5kZXggOGNhMWM4Yi4uMmQ2YTk4MiAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2V2ZW50L01vdXNlV2hlZWxMaXN0ZW5lci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9ldmVudC9Nb3VzZVdoZWVsTGlzdGVuZXIuamF2YQpAQCAtMjIsNiArMjIsMTIgQEAKIAogaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwogCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHN1cHBvcnRlZCBpbiBBbmRyb2lkIDEuMC4gSXQgaXMgbWVyZWx5IHByb3ZpZGVkIHRvIG1haW50YWluCisgKiBpbnRlcmZhY2UgY29tcGF0aWJpbGl0eSB3aXRoIGRlc2t0b3AgSmF2YSBpbXBsZW1lbnRhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgaW50ZXJmYWNlIE1vdXNlV2hlZWxMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewogCiAgICAgcHVibGljIHZvaWQgbW91c2VXaGVlbE1vdmVkKE1vdXNlV2hlZWxFdmVudCBlKTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9QYWludEV2ZW50LmphdmEgYi9hd3QvamF2YS9hd3QvZXZlbnQvUGFpbnRFdmVudC5qYXZhCmluZGV4IGQwNTczZTEuLjIyYWMwOTAgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9ldmVudC9QYWludEV2ZW50LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L1BhaW50RXZlbnQuamF2YQpAQCAtMjMsNiArMjMsMTIgQEAKIGltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7CiBpbXBvcnQgamF2YS5hd3QuUmVjdGFuZ2xlOwogCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHN1cHBvcnRlZCBpbiBBbmRyb2lkIDEuMC4gSXQgaXMgbWVyZWx5IHByb3ZpZGVkIHRvIG1haW50YWluCisgKiBpbnRlcmZhY2UgY29tcGF0aWJpbGl0eSB3aXRoIGRlc2t0b3AgSmF2YSBpbXBsZW1lbnRhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgY2xhc3MgUGFpbnRFdmVudCBleHRlbmRzIENvbXBvbmVudEV2ZW50IHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDEyNjc0OTIwMjY0MzMzMzc1OTNMOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2V2ZW50L1RleHRFdmVudC5qYXZhIGIvYXd0L2phdmEvYXd0L2V2ZW50L1RleHRFdmVudC5qYXZhCmluZGV4IGUyYmZkOTYuLjJhNjkwYWQgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9ldmVudC9UZXh0RXZlbnQuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZXZlbnQvVGV4dEV2ZW50LmphdmEKQEAgLTIyLDYgKzIyLDEyIEBACiAKIGltcG9ydCBqYXZhLmF3dC5BV1RFdmVudDsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGNsYXNzIFRleHRFdmVudCBleHRlbmRzIEFXVEV2ZW50IHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDYyNjk5MDIyOTEyNTA5NDExNzlMOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2V2ZW50L1RleHRMaXN0ZW5lci5qYXZhIGIvYXd0L2phdmEvYXd0L2V2ZW50L1RleHRMaXN0ZW5lci5qYXZhCmluZGV4IDZjNWE2NzEuLjA1NzU3YzQgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9ldmVudC9UZXh0TGlzdGVuZXIuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZXZlbnQvVGV4dExpc3RlbmVyLmphdmEKQEAgLTIyLDYgKzIyLDEyIEBACiAKIGltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGludGVyZmFjZSBUZXh0TGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKIAogICAgIHB1YmxpYyB2b2lkIHRleHRWYWx1ZUNoYW5nZWQoVGV4dEV2ZW50IGUpOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2V2ZW50L1dpbmRvd0FkYXB0ZXIuamF2YSBiL2F3dC9qYXZhL2F3dC9ldmVudC9XaW5kb3dBZGFwdGVyLmphdmEKaW5kZXggOWQ0YjM3Ny4uOTcwYWE4ZCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2V2ZW50L1dpbmRvd0FkYXB0ZXIuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZXZlbnQvV2luZG93QWRhcHRlci5qYXZhCkBAIC0yMCw2ICsyMCwxMiBAQAogICovCiBwYWNrYWdlIGphdmEuYXd0LmV2ZW50OwogCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHN1cHBvcnRlZCBpbiBBbmRyb2lkIDEuMC4gSXQgaXMgbWVyZWx5IHByb3ZpZGVkIHRvIG1haW50YWluCisgKiBpbnRlcmZhY2UgY29tcGF0aWJpbGl0eSB3aXRoIGRlc2t0b3AgSmF2YSBpbXBsZW1lbnRhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgV2luZG93QWRhcHRlciBpbXBsZW1lbnRzIFdpbmRvd0xpc3RlbmVyLCBXaW5kb3dTdGF0ZUxpc3RlbmVyLCBXaW5kb3dGb2N1c0xpc3RlbmVyIHsKIAogICAgIHB1YmxpYyBXaW5kb3dBZGFwdGVyKCkgewpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2V2ZW50L1dpbmRvd0V2ZW50LmphdmEgYi9hd3QvamF2YS9hd3QvZXZlbnQvV2luZG93RXZlbnQuamF2YQppbmRleCA2NWEzMGU0Li40NzRkMmFjIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZXZlbnQvV2luZG93RXZlbnQuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZXZlbnQvV2luZG93RXZlbnQuamF2YQpAQCAtMjUsNiArMjUsMTIgQEAKIC8vaW1wb3J0IGphdmEuYXd0LldpbmRvdzsKIC8vaW1wb3J0IGphdmEuYXd0LkZyYW1lOwogCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHN1cHBvcnRlZCBpbiBBbmRyb2lkIDEuMC4gSXQgaXMgbWVyZWx5IHByb3ZpZGVkIHRvIG1haW50YWluCisgKiBpbnRlcmZhY2UgY29tcGF0aWJpbGl0eSB3aXRoIGRlc2t0b3AgSmF2YSBpbXBsZW1lbnRhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgY2xhc3MgV2luZG93RXZlbnQgZXh0ZW5kcyBDb21wb25lbnRFdmVudCB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTU2Nzk1OTEzMzE0NzkxMjEyN0w7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZXZlbnQvV2luZG93Rm9jdXNMaXN0ZW5lci5qYXZhIGIvYXd0L2phdmEvYXd0L2V2ZW50L1dpbmRvd0ZvY3VzTGlzdGVuZXIuamF2YQppbmRleCBlMDIwMGYyLi41Mjg0NTlmIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZXZlbnQvV2luZG93Rm9jdXNMaXN0ZW5lci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9ldmVudC9XaW5kb3dGb2N1c0xpc3RlbmVyLmphdmEKQEAgLTIyLDYgKzIyLDEyIEBACiAKIGltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGludGVyZmFjZSBXaW5kb3dGb2N1c0xpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7CiAKICAgICBwdWJsaWMgdm9pZCB3aW5kb3dHYWluZWRGb2N1cyhXaW5kb3dFdmVudCBlKTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9ldmVudC9XaW5kb3dMaXN0ZW5lci5qYXZhIGIvYXd0L2phdmEvYXd0L2V2ZW50L1dpbmRvd0xpc3RlbmVyLmphdmEKaW5kZXggMjBhMmIwOC4uMzFiZDU0NyAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2V2ZW50L1dpbmRvd0xpc3RlbmVyLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2V2ZW50L1dpbmRvd0xpc3RlbmVyLmphdmEKQEAgLTIyLDYgKzIyLDEyIEBACiAKIGltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGludGVyZmFjZSBXaW5kb3dMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewogCiAgICAgcHVibGljIHZvaWQgd2luZG93QWN0aXZhdGVkKFdpbmRvd0V2ZW50IGUpOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2V2ZW50L1dpbmRvd1N0YXRlTGlzdGVuZXIuamF2YSBiL2F3dC9qYXZhL2F3dC9ldmVudC9XaW5kb3dTdGF0ZUxpc3RlbmVyLmphdmEKaW5kZXggMTJkYmMyMC4uYmExNGQ5ZSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2V2ZW50L1dpbmRvd1N0YXRlTGlzdGVuZXIuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZXZlbnQvV2luZG93U3RhdGVMaXN0ZW5lci5qYXZhCkBAIC0yMiw2ICsyMiwxMiBAQAogCiBpbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7CiAKKy8qKgorICogVGhpcyBjbGFzcyBpcyBub3Qgc3VwcG9ydGVkIGluIEFuZHJvaWQgMS4wLiBJdCBpcyBtZXJlbHkgcHJvdmlkZWQgdG8gbWFpbnRhaW4KKyAqIGludGVyZmFjZSBjb21wYXRpYmlsaXR5IHdpdGggZGVza3RvcCBKYXZhIGltcGxlbWVudGF0aW9ucy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KIHB1YmxpYyBpbnRlcmZhY2UgV2luZG93U3RhdGVMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewogCiAgICAgcHVibGljIHZvaWQgd2luZG93U3RhdGVDaGFuZ2VkKFdpbmRvd0V2ZW50IGUpOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ZvbnQvRm9udFJlbmRlckNvbnRleHQuamF2YSBiL2F3dC9qYXZhL2F3dC9mb250L0ZvbnRSZW5kZXJDb250ZXh0LmphdmEKaW5kZXggNzY2MzAwZC4uZDdkZTAwZiAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ZvbnQvRm9udFJlbmRlckNvbnRleHQuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZm9udC9Gb250UmVuZGVyQ29udGV4dC5qYXZhCkBAIC0yMywyMyArMjMsMzAgQEAKIGltcG9ydCBqYXZhLmF3dC5nZW9tLkFmZmluZVRyYW5zZm9ybTsKIAogLyoqCi0gKiBUaGUgRm9udFJlbmRlckNvbnRleHQgY2xhc3MgY29udGFpbnMgdGhlIGluZm9ybWF0aW9uIAotICogYWJvdXQgdGV4dCBtZWFzdXJlbWVudC4gQW50aS1hbGlhc2luZyBhbmQgZnJhY3Rpb25hbC1tZXRyaWNzCi0gKiBtb2RlcyBhcmUgZGVmaW5lZCBieSBhbiBhcHBsaWNhdGlvbiBhbmQgYWZmZWN0IHRoZSBzaXplIG9mCi0gKiBhIGNoYXJhY3Rlci4KKyAqIFRoZSBGb250UmVuZGVyQ29udGV4dCBjbGFzcyBjb250YWlucyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGV4dCBtZWFzdXJlbWVudC4KKyAqIEFudGktYWxpYXNpbmcgYW5kIGZyYWN0aW9uYWwtbWV0cmljcyBtb2RlcyBhcmUgZGVmaW5lZCBieSBhbiBhcHBsaWNhdGlvbiBhbmQKKyAqIGFmZmVjdCB0aGUgc2l6ZSBvZiBhIGNoYXJhY3Rlci4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBGb250UmVuZGVyQ29udGV4dCB7CiAKICAgICAvLyBBZmZpbmUgdHJhbnNmb3JtIG9mIHRoaXMgbW9kZQotICAgIC8qKiBUaGUgdHJhbnNmb3JtLiAqLworICAgIC8qKgorICAgICAqIFRoZSB0cmFuc2Zvcm0uCisgICAgICovCiAgICAgcHJpdmF0ZSBBZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtOwogCiAgICAgLy8gSXMgdGhlIGFudGktYWxpYXNlZCBtb2RlIHVzZWQKLSAgICAvKiogVGhlIGFudGkgYWxpYXNlZC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgYW50aSBhbGlhc2VkLgorICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBmQW50aUFsaWFzZWQ7CiAKICAgICAvLyBJcyB0aGUgZnJhY3Rpb25hbCBtZXRyaWNzIHVzZWQKLSAgICAvKiogVGhlIGZyYWN0aW9uYWwgbWV0cmljcy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgZnJhY3Rpb25hbCBtZXRyaWNzLgorICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBmRnJhY3Rpb25hbE1ldHJpY3M7CiAKIApAQCAtNDcsOSArNTQsMTIgQEAKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgRm9udFJlbmRlckNvbnRleHQgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZAogICAgICAqIEFmZmluZVRyYW5zZm9ybSwgYW50aS1hbGlhc2luZyBhbmQgZnJhY3Rpb25hbCBtZXRyaWNzIGZsYWdzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0cmFucyB0aGUgQWZmaW5lVHJhbnNmb3JtLgotICAgICAqIEBwYXJhbSBhbnRpQWxpYXNlZCB0aGUgYW50aS1hbGlhc2luZyBmbGFnLgotICAgICAqIEBwYXJhbSB1c2VzRnJhY3Rpb25hbE1ldHJpY3MgdGhlIGZyYWN0aW9uYWwgbWV0cmljcyBmbGFnLgorICAgICAqIEBwYXJhbSB0cmFucworICAgICAqICAgICAgICAgICAgdGhlIEFmZmluZVRyYW5zZm9ybS4KKyAgICAgKiBAcGFyYW0gYW50aUFsaWFzZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbnRpLWFsaWFzaW5nIGZsYWcuCisgICAgICogQHBhcmFtIHVzZXNGcmFjdGlvbmFsTWV0cmljcworICAgICAqICAgICAgICAgICAgdGhlIGZyYWN0aW9uYWwgbWV0cmljcyBmbGFnLgogICAgICAqLwogICAgIHB1YmxpYyBGb250UmVuZGVyQ29udGV4dChBZmZpbmVUcmFuc2Zvcm0gdHJhbnMsIGJvb2xlYW4gYW50aUFsaWFzZWQsIAogICAgICAgICAgICAgYm9vbGVhbiB1c2VzRnJhY3Rpb25hbE1ldHJpY3MpIHsKQEAgLTY3LDEyICs3NywxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoZSBzcGVjaWZpZWQgT2JqZWN0IHdpdGggY3VycmVudCBGb250UmVuZGVyQ29udGV4dCBvYmplY3QuIAorICAgICAqIENvbXBhcmVzIHRoZSBzcGVjaWZpZWQgT2JqZWN0IHdpdGggY3VycmVudCBGb250UmVuZGVyQ29udGV4dCBvYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIG9iaiB0aGUgT2JqZWN0IHRvIGJlIGNvbXBhcmVkLgotICAgICAqIAorICAgICAqIEBwYXJhbSBvYmoKKyAgICAgKiAgICAgICAgICAgIHRoZSBPYmplY3QgdG8gYmUgY29tcGFyZWQuCiAgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIE9iamVjdCBpcyBlcXVhbCB0byBjdXJyZW50Ci0gICAgICogRm9udFJlbmRlckNvbnRleHQgb2JqZWN0LgorICAgICAqICAgICAgICAgRm9udFJlbmRlckNvbnRleHQgb2JqZWN0LgogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CkBAIC05MiwxMSArMTAyLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdHJhbnNmb3JtIHdoaWNoIGlzIHVzZWQgZm9yIHNjYWxpbmcgdHlwb2dyYXBoaWNhbCBwb2ludHMgCi0gICAgICogdG8gcGl4ZWxzIGluIHRoaXMgRm9udFJlbmRlckNvbnRleHQuCisgICAgICogR2V0cyB0aGUgdHJhbnNmb3JtIHdoaWNoIGlzIHVzZWQgZm9yIHNjYWxpbmcgdHlwb2dyYXBoaWNhbCBwb2ludHMgdG8KKyAgICAgKiBwaXhlbHMgaW4gdGhpcyBGb250UmVuZGVyQ29udGV4dC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBBZmZpbmVUcmFuc2Zvcm0gd2hpY2ggaXMgdXNlZCBmb3Igc2NhbGluZyB0eXBvZ3JhcGhpY2FsIAotICAgICAqIHBvaW50cyB0byBwaXhlbHMgaW4gdGhpcyBGb250UmVuZGVyQ29udGV4dC4KKyAgICAgKiBAcmV0dXJuIHRoZSBBZmZpbmVUcmFuc2Zvcm0gd2hpY2ggaXMgdXNlZCBmb3Igc2NhbGluZyB0eXBvZ3JhcGhpY2FsCisgICAgICogICAgICAgICBwb2ludHMgdG8gcGl4ZWxzIGluIHRoaXMgRm9udFJlbmRlckNvbnRleHQuCiAgICAgICovCiAgICAgcHVibGljIEFmZmluZVRyYW5zZm9ybSBnZXRUcmFuc2Zvcm0oKSB7CiAgICAgICAgIGlmICh0cmFuc2Zvcm0gIT0gbnVsbCl7CkBAIC0xMDYsMTMgKzExNiwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoZSBzcGVjaWZpZWQgRm9udFJlbmRlckNvbnRleHQgb2JqZWN0IHdpdGggY3VycmVudCAKKyAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIEZvbnRSZW5kZXJDb250ZXh0IG9iamVjdCB3aXRoIGN1cnJlbnQKICAgICAgKiBGb250UmVuZGVyQ29udGV4dC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZnJjIHRoZSBGb250UmVuZGVyQ29udGV4dCBvYmplY3QgdG8gYmUgY29tcGFyZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIEZvbnRSZW5kZXJDb250ZXh0IG9iamVjdCBpcwotICAgICAqIGVxdWFsIHRvIGN1cnJlbnQgRm9udFJlbmRlckNvbnRleHQuCisgICAgICogQHBhcmFtIGZyYworICAgICAqICAgICAgICAgICAgdGhlIEZvbnRSZW5kZXJDb250ZXh0IG9iamVjdCB0byBiZSBjb21wYXJlZC4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgRm9udFJlbmRlckNvbnRleHQgb2JqZWN0IGlzIGVxdWFsIHRvCisgICAgICogICAgICAgICBjdXJyZW50IEZvbnRSZW5kZXJDb250ZXh0LgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhGb250UmVuZGVyQ29udGV4dCBmcmMpIHsKICAgICAgICAgaWYgKHRoaXMgPT0gZnJjKXsKQEAgLTEzMiwxMSArMTQyLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB0ZXh0IGZyYWN0aW9uYWwgbWV0cmljcyBhcmUgdXNlZCBpbiAKLSAgICAgKiB0aGlzIEZvbnRSZW5kZXJDb250ZXh0LgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGV4dCBmcmFjdGlvbmFsIG1ldHJpY3MgYXJlIHVzZWQgaW4gdGhpcworICAgICAqIEZvbnRSZW5kZXJDb250ZXh0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHRleHQgZnJhY3Rpb25hbCBtZXRyaWNzIGFyZSB1c2VkIGluIAotICAgICAqIHRoaXMgRm9udFJlbmRlckNvbnRleHQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSB0ZXh0IGZyYWN0aW9uYWwgbWV0cmljcyBhcmUgdXNlZCBpbiB0aGlzCisgICAgICogICAgICAgICBGb250UmVuZGVyQ29udGV4dCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHVzZXNGcmFjdGlvbmFsTWV0cmljcygpIHsKICAgICAgICAgcmV0dXJuIHRoaXMuZkZyYWN0aW9uYWxNZXRyaWNzOwpAQCAtMTQ2LDcgKzE1Niw3IEBACiAgICAgICogUmV0dXJucyB0cnVlIGlmIGFudGktYWxpYXNpbmcgaXMgdXNlZCBpbiB0aGlzIEZvbnRSZW5kZXJDb250ZXh0LgogICAgICAqIAogICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgaXMgYW50aS1hbGlhc2luZyBpcyB1c2VkIGluIHRoaXMgRm9udFJlbmRlckNvbnRleHQsCi0gICAgICogZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzQW50aUFsaWFzZWQoKSB7CiAgICAgICAgIHJldHVybiB0aGlzLmZBbnRpQWxpYXNlZDsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9mb250L0dseXBoSnVzdGlmaWNhdGlvbkluZm8uamF2YSBiL2F3dC9qYXZhL2F3dC9mb250L0dseXBoSnVzdGlmaWNhdGlvbkluZm8uamF2YQppbmRleCA0YzNlMDJlLi5iMDNkZTBhIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZm9udC9HbHlwaEp1c3RpZmljYXRpb25JbmZvLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ZvbnQvR2x5cGhKdXN0aWZpY2F0aW9uSW5mby5qYXZhCkBAIC0xOCwxMjQgKzE4LDEzNCBAQAogICogQGF1dGhvciBJbHlhIFMuIE9rb21pbgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuZm9udDsKIAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFRoZSBHbHlwaEp1c3RpZmljYXRpb25JbmZvIGNsYXNzIHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IAotICogdGhlIGdseXBoJ3MganVzdGlmaWNhdGlvbiBwcm9wZXJ0aWVzLiBUaGVyZSBhcmUgZm91ciBqdXN0aWZpY2F0aW9uIAotICogcHJvcGVydGllczogd2VpZ2h0LCBwcmlvcml0eSwgYWJzb3JiLCBhbmQgbGltaXQuCisgKiBUaGUgR2x5cGhKdXN0aWZpY2F0aW9uSW5mbyBjbGFzcyBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZ2x5cGgncworICoganVzdGlmaWNhdGlvbiBwcm9wZXJ0aWVzLiBUaGVyZSBhcmUgZm91ciBqdXN0aWZpY2F0aW9uIHByb3BlcnRpZXM6IHdlaWdodCwKKyAqIHByaW9yaXR5LCBhYnNvcmIsIGFuZCBsaW1pdC4KICAqIDxwPgotICogVGhlcmUgYXJlIHR3byBzZXRzIG9mIG1ldHJpY3M6IGdyb3dpbmcgYW5kIHNocmlua2luZy4gCi0gKiBHcm93aW5nIG1ldHJpY3MgYXJlIHVzZWQgd2hlbiB0aGUgZ2x5cGhzIGFyZSB0byBiZSBzcHJlYWQgYXBhcnQgCi0gKiB0byBmaXQgYSBsYXJnZXIgd2lkdGguIFNocmlua2luZyBtZXRyaWNzIGFyZSB1c2VkIHdoZW4gdGhlIGdseXBocyAKLSAqIGFyZSB0byBiZSBtb3ZlZCB0b2dldGhlciB0byBmaXQgYSBzbWFsbGVyIHdpZHRoLgorICogVGhlcmUgYXJlIHR3byBzZXRzIG9mIG1ldHJpY3M6IGdyb3dpbmcgYW5kIHNocmlua2luZy4gR3Jvd2luZyBtZXRyaWNzIGFyZQorICogdXNlZCB3aGVuIHRoZSBnbHlwaHMgYXJlIHRvIGJlIHNwcmVhZCBhcGFydCB0byBmaXQgYSBsYXJnZXIgd2lkdGguIFNocmlua2luZworICogbWV0cmljcyBhcmUgdXNlZCB3aGVuIHRoZSBnbHlwaHMgYXJlIHRvIGJlIG1vdmVkIHRvZ2V0aGVyIHRvIGZpdCBhIHNtYWxsZXIKKyAqIHdpZHRoLgorICogPC9wPgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEdseXBoSnVzdGlmaWNhdGlvbkluZm8gewogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBQUklPUklUWV9LQVNISURBIGluZGljYXRlcyB0aGUgaGlnaGVzdCAKLSAgICAgKiBqdXN0aWZpY2F0aW9uIHByaW9yaXR5LgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBQUklPUklUWV9LQVNISURBIGluZGljYXRlcyB0aGUgaGlnaGVzdCBqdXN0aWZpY2F0aW9uCisgICAgICogcHJpb3JpdHkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJT1JJVFlfS0FTSElEQSA9IDA7CiAKICAgICAvKioKLSAgICAgKiBUaGUgQ29uc3RhbnQgUFJJT1JJVFlfV0hJVEVTUEFDRSBpbmRpY2F0ZXMgdGhlIHNlY29uZCBoaWdoZXN0IAotICAgICAqIGp1c3RpZmljYXRpb24gcHJpb3JpdHkuIAorICAgICAqIFRoZSBDb25zdGFudCBQUklPUklUWV9XSElURVNQQUNFIGluZGljYXRlcyB0aGUgc2Vjb25kIGhpZ2hlc3QKKyAgICAgKiBqdXN0aWZpY2F0aW9uIHByaW9yaXR5LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSU9SSVRZX1dISVRFU1BBQ0UgPSAxOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBQUklPUklUWV9JTlRFUkNIQVIgaW5kaWNhdGVzIHRoZSBzZWNvbmQgbG93ZXN0IAotICAgICAqIGp1c3RpZmljYXRpb24gcHJpb3JpdHkuIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBQUklPUklUWV9JTlRFUkNIQVIgaW5kaWNhdGVzIHRoZSBzZWNvbmQgbG93ZXN0IGp1c3RpZmljYXRpb24KKyAgICAgKiBwcmlvcml0eS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWV9JTlRFUkNIQVIgPSAyOwogCiAgICAgLyoqCi0gICAgICogVGhlIENvbnN0YW50IFBSSU9SSVRZX05PTkUgaW5kaWNhdGVzIHRoZSBsb3dlc3QganVzdGlmaWNhdGlvbiAKLSAgICAgKiBwcmlvcml0eS4KKyAgICAgKiBUaGUgQ29uc3RhbnQgUFJJT1JJVFlfTk9ORSBpbmRpY2F0ZXMgdGhlIGxvd2VzdCBqdXN0aWZpY2F0aW9uIHByaW9yaXR5LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSU9SSVRZX05PTkUgPSAzOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBncm93IGFic29yYiBmbGFnIGluZGljYXRlcyBpZiB0aGlzIGdseXBoIGFic29yYnMgYWxsIGV4dHJhIAotICAgICAqIHNwYWNlIGF0IHRoaXMgYW5kIGxvd2VyIHByaW9yaXR5IGxldmVscyB3aGVuIGl0IGdyb3dzLgorICAgIC8qKgorICAgICAqIFRoZSBncm93IGFic29yYiBmbGFnIGluZGljYXRlcyBpZiB0aGlzIGdseXBoIGFic29yYnMgYWxsIGV4dHJhIHNwYWNlIGF0CisgICAgICogdGhpcyBhbmQgbG93ZXIgcHJpb3JpdHkgbGV2ZWxzIHdoZW4gaXQgZ3Jvd3MuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gZ3Jvd0Fic29yYjsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgZ3JvdyBsZWZ0IGxpbWl0IHZhbHVlIHJlcHJlc2VudHMgdGhlIG1heGltdW0gdmFsdWUgYnkgd2hpY2ggCi0gICAgICogdGhlIGxlZnQgc2lkZSBvZiB0aGlzIGdseXBoIGdyb3dzLiAKKyAgICAvKioKKyAgICAgKiBUaGUgZ3JvdyBsZWZ0IGxpbWl0IHZhbHVlIHJlcHJlc2VudHMgdGhlIG1heGltdW0gdmFsdWUgYnkgd2hpY2ggdGhlIGxlZnQKKyAgICAgKiBzaWRlIG9mIHRoaXMgZ2x5cGggZ3Jvd3MuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGZsb2F0IGdyb3dMZWZ0TGltaXQ7CiAKLSAgICAvKiogCi0gICAgICogVGhlIGdyb3cgcmlnaHQgbGltaXQgdmFsdWUgcmVwZXNlbnRzIHRoZSBtYXhpbXVtIHZhbHVlIGJ5IHdoaWNoIAotICAgICAqIHRoZSByaWdodCBzaWRlIG9mIHRoaXMgZ2x5cGggZ3Jvd3MuCisgICAgLyoqCisgICAgICogVGhlIGdyb3cgcmlnaHQgbGltaXQgdmFsdWUgcmVwZXNlbnRzIHRoZSBtYXhpbXVtIHZhbHVlIGJ5IHdoaWNoIHRoZSByaWdodAorICAgICAqIHNpZGUgb2YgdGhpcyBnbHlwaCBncm93cy4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgZmxvYXQgZ3Jvd1JpZ2h0TGltaXQ7CiAKLSAgICAvKiogCi0gICAgICogVGhlIGdyb3cgcHJpb3JpdHkgdmFsdWUgcmVwcmVzZW50cyB0aGUgcHJpb3JpdHkgbGV2ZWwgb2YgdGhpcyAKLSAgICAgKiBnbHlwaCBhcyBpdCBpcyBncm93aW5nLiAKKyAgICAvKioKKyAgICAgKiBUaGUgZ3JvdyBwcmlvcml0eSB2YWx1ZSByZXByZXNlbnRzIHRoZSBwcmlvcml0eSBsZXZlbCBvZiB0aGlzIGdseXBoIGFzIGl0CisgICAgICogaXMgZ3Jvd2luZy4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGdyb3dQcmlvcml0eTsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgc2hyaW5rIGFic29yYiBmbGVnIGluZGljYXRlcyB0aGlzIGdseXBoIGFic29yYnMgYWxsIHJlbWFpbmluZyAKLSAgICAgKiBzaHJpbmthZ2UgYXQgdGhpcyBhbmQgbG93ZXIgcHJpb3JpdHkgbGV2ZWxzIGFzIGl0IHNocmlua3MuIAorICAgIC8qKgorICAgICAqIFRoZSBzaHJpbmsgYWJzb3JiIGZsZWcgaW5kaWNhdGVzIHRoaXMgZ2x5cGggYWJzb3JicyBhbGwgcmVtYWluaW5nCisgICAgICogc2hyaW5rYWdlIGF0IHRoaXMgYW5kIGxvd2VyIHByaW9yaXR5IGxldmVscyBhcyBpdCBzaHJpbmtzLgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHNocmlua0Fic29yYjsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgc2hyaW5rIGxlZnQgbGltaXQgdmFsdWUgcmVwcmVzZW50cyB0aGUgbWF4aW11bSB2YWx1ZSBieSB3aGljaCAKLSAgICAgKiB0aGUgbGVmdCBzaWRlIG9mIHRoaXMgZ2x5cGggc2hyaW5rcy4gCisgICAgLyoqCisgICAgICogVGhlIHNocmluayBsZWZ0IGxpbWl0IHZhbHVlIHJlcHJlc2VudHMgdGhlIG1heGltdW0gdmFsdWUgYnkgd2hpY2ggdGhlCisgICAgICogbGVmdCBzaWRlIG9mIHRoaXMgZ2x5cGggc2hyaW5rcy4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgZmxvYXQgc2hyaW5rTGVmdExpbWl0OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBzaHJpbmsgcmlnaHQgbGltaXQgdmFsdWUgcmVwcmVzZW50cyB0aGUgbWF4aW11bSB2YWx1ZSBieSB3aGljaCAKLSAgICAgKiB0aGUgcmlnaHQgc2lkZSBvZiB0aGlzIGdseXBoIHNocmlua3MuIAorICAgIC8qKgorICAgICAqIFRoZSBzaHJpbmsgcmlnaHQgbGltaXQgdmFsdWUgcmVwcmVzZW50cyB0aGUgbWF4aW11bSB2YWx1ZSBieSB3aGljaCB0aGUKKyAgICAgKiByaWdodCBzaWRlIG9mIHRoaXMgZ2x5cGggc2hyaW5rcy4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgZmxvYXQgc2hyaW5rUmlnaHRMaW1pdDsKIAogICAgIC8qKgotICAgICAqIFRoZSBzaHJpbmsgcHJpb3JpdHkgcmVwcmVzZW50cyB0aGUgZ2x5dGgncyBwcmlvcml0eSBsZXZlbCAKLSAgICAgKiBhcyBpdCBpcyBzaHJpbmtpbmcuCisgICAgICogVGhlIHNocmluayBwcmlvcml0eSByZXByZXNlbnRzIHRoZSBnbHl0aCdzIHByaW9yaXR5IGxldmVsIGFzIGl0IGlzCisgICAgICogc2hyaW5raW5nLgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBpbnQgc2hyaW5rUHJpb3JpdHk7CiAKLSAgICAvKiogCi0gICAgICogVGhlIHdlaWdodCBvZiB0aGUgZ2x5cGguIAorICAgIC8qKgorICAgICAqIFRoZSB3ZWlnaHQgb2YgdGhlIGdseXBoLgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBmbG9hdCB3ZWlnaHQ7CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgR2x5cGhKdXN0aWZpY2F0aW9uSW5mbyBvYmplY3Qgd2hpY2ggY29udGFpbnMKLSAgICAgKiBnbHlwaCdzIGp1c3RpZmljYXRpb24gcHJvcGVydGllcy4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgR2x5cGhKdXN0aWZpY2F0aW9uSW5mbyBvYmplY3Qgd2hpY2ggY29udGFpbnMgZ2x5cGgncworICAgICAqIGp1c3RpZmljYXRpb24gcHJvcGVydGllcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gd2VpZ2h0IHRoZSB3ZWlnaHQgb2YgZ2x5cGguCi0gICAgICogQHBhcmFtIGdyb3dBYnNvcmIgaW5kaWNhdGVzIGlmIHRoaXMgZ2x5cGggY29udGFpcyBhbGwgc3BhY2UgCi0gICAgICogYXQgdGhpcyBwcmlvcml0eSBhbmQgbG93ZXIgcHJpb3JpdHkgbGV2ZWxzIHdoZW4gaXQgZ3Jvd3MuCi0gICAgICogQHBhcmFtIGdyb3dQcmlvcml0eSBpbmRpY2F0ZXMgdGhlIHByaW9yaXR5IGxldmVsIG9mIHRoaXMgZ2x5cGggCi0gICAgICogd2hlbiBpdCBncm93cy4KLSAgICAgKiBAcGFyYW0gZ3Jvd0xlZnRMaW1pdCBpbmRpY2F0ZXMgdGhlIG1heGltdW0gdmFsdWUgb2Ygd2hpY2ggdGhlIAotICAgICAqIGxlZnQgc2lkZSBvZiB0aGlzIGdseXBoIGNhbiBncm93LgotICAgICAqIEBwYXJhbSBncm93UmlnaHRMaW1pdCB0aGUgbWF4aW11bSB2YWx1ZSBvZiB3aGljaCB0aGUgcmlnaHQgc2lkZSBvZiAKLSAgICAgKiB0aGlzIGdseXBoIGNhbiBncm93LgotICAgICAqIEBwYXJhbSBzaHJpbmtBYnNvcmIgaW5kaWNhdGVzIGlmIHRoaXMgZ2x5cGggY29udGFpbnMgYWxsIHJlbWFpbmluZwotICAgICAqIHNocmlua2FnZSBhdCB0aGlzIGFuZCBsb3dlciBwcmlvcml0eSBsZXZlbHMgd2hlbiBpdCBzaHJpbmtzLgotICAgICAqIEBwYXJhbSBzaHJpbmtQcmlvcml0eSBpbmRpY2F0ZXMgdGhlIGdseXBoJ3MgcHJpb3JpdHkgbGV2ZWwgd2hlbiAKLSAgICAgKiBpdCBzaHJpbmtzLgotICAgICAqIEBwYXJhbSBzaHJpbmtMZWZ0TGltaXQgaW5kaWNhdGVzIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHdoaWNoIAotICAgICAqIHRoZSBsZWZ0IHNpZGUgb2YgdGhpcyBnbHlwaCBjYW4gc2hyaW5rLiAKLSAgICAgKiBAcGFyYW0gc2hyaW5rUmlnaHRMaW1pdCBpbmRpY2F0ZXMgdGhlIG1heGltdW0gYW1vdW50IGJ5IHdoaWNoIAotICAgICAqIHRoZSByaWdodCBzaWRlIG9mIHRoaXMgZ2x5cGggY2FuIHNocmluay4KKyAgICAgKiBAcGFyYW0gd2VpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgd2VpZ2h0IG9mIGdseXBoLgorICAgICAqIEBwYXJhbSBncm93QWJzb3JiCisgICAgICogICAgICAgICAgICBpbmRpY2F0ZXMgaWYgdGhpcyBnbHlwaCBjb250YWlzIGFsbCBzcGFjZSBhdCB0aGlzIHByaW9yaXR5IGFuZAorICAgICAqICAgICAgICAgICAgbG93ZXIgcHJpb3JpdHkgbGV2ZWxzIHdoZW4gaXQgZ3Jvd3MuCisgICAgICogQHBhcmFtIGdyb3dQcmlvcml0eQorICAgICAqICAgICAgICAgICAgaW5kaWNhdGVzIHRoZSBwcmlvcml0eSBsZXZlbCBvZiB0aGlzIGdseXBoIHdoZW4gaXQgZ3Jvd3MuCisgICAgICogQHBhcmFtIGdyb3dMZWZ0TGltaXQKKyAgICAgKiAgICAgICAgICAgIGluZGljYXRlcyB0aGUgbWF4aW11bSB2YWx1ZSBvZiB3aGljaCB0aGUgbGVmdCBzaWRlIG9mIHRoaXMKKyAgICAgKiAgICAgICAgICAgIGdseXBoIGNhbiBncm93LgorICAgICAqIEBwYXJhbSBncm93UmlnaHRMaW1pdAorICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gdmFsdWUgb2Ygd2hpY2ggdGhlIHJpZ2h0IHNpZGUgb2YgdGhpcyBnbHlwaCBjYW4KKyAgICAgKiAgICAgICAgICAgIGdyb3cuCisgICAgICogQHBhcmFtIHNocmlua0Fic29yYgorICAgICAqICAgICAgICAgICAgaW5kaWNhdGVzIGlmIHRoaXMgZ2x5cGggY29udGFpbnMgYWxsIHJlbWFpbmluZyBzaHJpbmthZ2UgYXQKKyAgICAgKiAgICAgICAgICAgIHRoaXMgYW5kIGxvd2VyIHByaW9yaXR5IGxldmVscyB3aGVuIGl0IHNocmlua3MuCisgICAgICogQHBhcmFtIHNocmlua1ByaW9yaXR5CisgICAgICogICAgICAgICAgICBpbmRpY2F0ZXMgdGhlIGdseXBoJ3MgcHJpb3JpdHkgbGV2ZWwgd2hlbiBpdCBzaHJpbmtzLgorICAgICAqIEBwYXJhbSBzaHJpbmtMZWZ0TGltaXQKKyAgICAgKiAgICAgICAgICAgIGluZGljYXRlcyB0aGUgbWF4aW11bSB2YWx1ZSBvZiB3aGljaCB0aGUgbGVmdCBzaWRlIG9mIHRoaXMKKyAgICAgKiAgICAgICAgICAgIGdseXBoIGNhbiBzaHJpbmsuCisgICAgICogQHBhcmFtIHNocmlua1JpZ2h0TGltaXQKKyAgICAgKiAgICAgICAgICAgIGluZGljYXRlcyB0aGUgbWF4aW11bSBhbW91bnQgYnkgd2hpY2ggdGhlIHJpZ2h0IHNpZGUgb2YgdGhpcworICAgICAqICAgICAgICAgICAgZ2x5cGggY2FuIHNocmluay4KICAgICAgKi8KICAgICBwdWJsaWMgR2x5cGhKdXN0aWZpY2F0aW9uSW5mbyhmbG9hdCB3ZWlnaHQsIGJvb2xlYW4gZ3Jvd0Fic29yYiwgaW50IGdyb3dQcmlvcml0eSwKLSAgICAgICAgICAgIGZsb2F0IGdyb3dMZWZ0TGltaXQsIGZsb2F0IGdyb3dSaWdodExpbWl0LCBib29sZWFuIHNocmlua0Fic29yYiwKLSAgICAgICAgICAgIGludCBzaHJpbmtQcmlvcml0eSwgZmxvYXQgc2hyaW5rTGVmdExpbWl0LCBmbG9hdCBzaHJpbmtSaWdodExpbWl0KSB7CisgICAgICAgICAgICBmbG9hdCBncm93TGVmdExpbWl0LCBmbG9hdCBncm93UmlnaHRMaW1pdCwgYm9vbGVhbiBzaHJpbmtBYnNvcmIsIGludCBzaHJpbmtQcmlvcml0eSwKKyAgICAgICAgICAgIGZsb2F0IHNocmlua0xlZnRMaW1pdCwgZmxvYXQgc2hyaW5rUmlnaHRMaW1pdCkgewogCiAgICAgICAgIGlmICh3ZWlnaHQgPCAwKSB7CiAgICAgICAgICAgICAvLyBhd3QuMTlDPXdlaWdodCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyCkBAIC0xNTYsMTMgKzE2NiwxNSBAQAogICAgICAgICB0aGlzLmdyb3dSaWdodExpbWl0ID0gZ3Jvd1JpZ2h0TGltaXQ7CiAKICAgICAgICAgaWYgKChzaHJpbmtQcmlvcml0eSA8IDApIHx8IChzaHJpbmtQcmlvcml0eSA+IFBSSU9SSVRZX05PTkUpKSB7Ci0gICAgICAgICAgICAvLyBhd3QuMTlGPWluY29ycmVjdCB2YWx1ZSBmb3Igc2hyaW5rUHJpb3JpdHksIG1vcmUgdGhhbiBQUklPUklUWV9OT05FIG9yIGxlc3MgdGhhbiBQUklPUklUWV9LQVNISURBIHZhbHVlCisgICAgICAgICAgICAvLyBhd3QuMTlGPWluY29ycmVjdCB2YWx1ZSBmb3Igc2hyaW5rUHJpb3JpdHksIG1vcmUgdGhhbgorICAgICAgICAgICAgLy8gUFJJT1JJVFlfTk9ORSBvciBsZXNzIHRoYW4gUFJJT1JJVFlfS0FTSElEQSB2YWx1ZQogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4xOUYiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogICAgICAgICB0aGlzLnNocmlua1ByaW9yaXR5ID0gc2hyaW5rUHJpb3JpdHk7CiAKICAgICAgICAgaWYgKChncm93UHJpb3JpdHkgPCAwKSB8fCAoZ3Jvd1ByaW9yaXR5ID4gUFJJT1JJVFlfTk9ORSkpIHsKLSAgICAgICAgICAgIC8vIGF3dC4yMDA9aW5jb3JyZWN0IHZhbHVlIGZvciBncm93UHJpb3JpdHksIG1vcmUgdGhhbiBQUklPUklUWV9OT05FIG9yIGxlc3MgdGhhbiBQUklPUklUWV9LQVNISURBIHZhbHVlCisgICAgICAgICAgICAvLyBhd3QuMjAwPWluY29ycmVjdCB2YWx1ZSBmb3IgZ3Jvd1ByaW9yaXR5LCBtb3JlIHRoYW4gUFJJT1JJVFlfTk9ORQorICAgICAgICAgICAgLy8gb3IgbGVzcyB0aGFuIFBSSU9SSVRZX0tBU0hJREEgdmFsdWUKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjAwIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KICAgICAgICAgdGhpcy5ncm93UHJpb3JpdHkgPSBncm93UHJpb3JpdHk7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZm9udC9HbHlwaE1ldHJpY3MuamF2YSBiL2F3dC9qYXZhL2F3dC9mb250L0dseXBoTWV0cmljcy5qYXZhCmluZGV4IGQ5NmVmMTguLjI4NzE3MjIgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9mb250L0dseXBoTWV0cmljcy5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9mb250L0dseXBoTWV0cmljcy5qYXZhCkBAIC0xOCw4MiArMTgsOTggQEAKICAqIEBhdXRob3IgSWx5YSBTLiBPa29taW4KICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmZvbnQ7CiAKIGltcG9ydCBqYXZhLmF3dC5nZW9tLlJlY3RhbmdsZTJEOwogCiAvKioKLSAqIFRoZSBHbHlwaE1ldHJpY3MgY2xhc3MgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNpemUgYW5kIHNoYXBlIAotICogb2YgYSBzaW5nbGUgZ2x5cGguIAotICogRWFjaCBnbHlwaCBoYXMgaW5mb3JtYXRpb24gdG8gc3BlY2lmeSB3aGV0aGVyIGl0cyBiYXNlbGluZSBpcyBob3Jpem9udGFsIAotICogb3IgdmVydGljYWwgYXMgd2VsbCBhcyBpbmZvcm1hdGlvbiBvbiBob3cgaXQgaW50ZXJhY3RzIHdpdGggCi0gKiBvdGhlciBjaGFyYWN0ZXJzIGluIGEgdGV4dCwgZ2l2ZW4gYXMgb25lIG9mIHRoZQotICogZm9sbG93aW5nIHR5cGVzOiBTVEFOREFSRCwgTElHQVRVUkUsIENPTUJJTklORywgb3IgQ09NUE9ORU5ULgorICogVGhlIEdseXBoTWV0cmljcyBjbGFzcyBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2l6ZSBhbmQgc2hhcGUgb2YgYQorICogc2luZ2xlIGdseXBoLiBFYWNoIGdseXBoIGhhcyBpbmZvcm1hdGlvbiB0byBzcGVjaWZ5IHdoZXRoZXIgaXRzIGJhc2VsaW5lIGlzCisgKiBob3Jpem9udGFsIG9yIHZlcnRpY2FsIGFzIHdlbGwgYXMgaW5mb3JtYXRpb24gb24gaG93IGl0IGludGVyYWN0cyB3aXRoIG90aGVyCisgKiBjaGFyYWN0ZXJzIGluIGEgdGV4dCwgZ2l2ZW4gYXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdHlwZXM6IFNUQU5EQVJELAorICogTElHQVRVUkUsIENPTUJJTklORywgb3IgQ09NUE9ORU5ULgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEdseXBoTWV0cmljcyB7CiAKICAgICAvLyBhZHZhbmNlIHdpZHRoIG9mIHRoZSBnbHlwaCBjaGFyYWN0ZXIgY2VsbAotICAgIC8qKiBUaGUgYWR2YW5jZSB4LiAqLworICAgIC8qKgorICAgICAqIFRoZSBhZHZhbmNlIHguCisgICAgICovCiAgICAgcHJpdmF0ZSBmbG9hdCBhZHZhbmNlWDsKLSAgICAKKwogICAgIC8vIGFkdmFuY2UgaGVpZ2h0IG9mIHRoZSBnbHlwaCBjaGFyYWN0ZXIgY2VsbAotICAgIC8qKiBUaGUgYWR2YW5jZSB5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBhZHZhbmNlIHkuCisgICAgICovCiAgICAgcHJpdmF0ZSBmbG9hdCBhZHZhbmNlWTsKIAogICAgIC8vIGZsYWcgaWYgdGhlIGdseXBoIGhvcml6b250YWwKLSAgICAvKiogVGhlIGhvcml6b250YWwuICovCisgICAgLyoqCisgICAgICogVGhlIGhvcml6b250YWwuCisgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIGhvcml6b250YWw7CiAKLSAgICAvLyBnbHlwaCB0eXBlIGNvZGUgCi0gICAgLyoqIFRoZSBnbHlwaCB0eXBlLiAqLworICAgIC8vIGdseXBoIHR5cGUgY29kZQorICAgIC8qKgorICAgICAqIFRoZSBnbHlwaCB0eXBlLgorICAgICAqLwogICAgIHByaXZhdGUgYnl0ZSBnbHlwaFR5cGU7Ci0gICAgCisKICAgICAvLyBib3VuZGluZyBib3ggZm9yIG91dGxpbmUgb2YgdGhlIGdseXBoCi0gICAgLyoqIFRoZSBib3VuZHMuICovCisgICAgLyoqCisgICAgICogVGhlIGJvdW5kcy4KKyAgICAgKi8KICAgICBwcml2YXRlIFJlY3RhbmdsZTJELkZsb2F0IGJvdW5kczsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgU1RBTkRBUkQgaW5kaWNhdGVzIGEgZ2x5cGggdGhhdCByZXByZXNlbnRzIGEgc2luZ2xlIAotICAgICAqIGNoYXJhY3Rlci4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFNUQU5EQVJEIGluZGljYXRlcyBhIGdseXBoIHRoYXQgcmVwcmVzZW50cyBhIHNpbmdsZQorICAgICAqIGNoYXJhY3Rlci4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU1RBTkRBUkQgPSAwOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBMSUdBVFVSRSBpbmRpY2F0ZXMgYSBnbHlwaCB0aGF0IHJlcHJlc2VudHMgbXVsdGlwbGUgCi0gICAgICogY2hhcmFjdGVycyBhcyBhIGxpZ2F0dXJlLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgTElHQVRVUkUgaW5kaWNhdGVzIGEgZ2x5cGggdGhhdCByZXByZXNlbnRzIG11bHRpcGxlCisgICAgICogY2hhcmFjdGVycyBhcyBhIGxpZ2F0dXJlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBMSUdBVFVSRSA9IDE7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IENPTUJJTklORyBpbmRpY2F0ZXMgYSBnbHlwaCB3aGljaCBoYXMgbm8gY2FyZXQgcG9zaXRpb24gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IENPTUJJTklORyBpbmRpY2F0ZXMgYSBnbHlwaCB3aGljaCBoYXMgbm8gY2FyZXQgcG9zaXRpb24KICAgICAgKiBiZXR3ZWVuIGdseXBocyAoZm9yIGV4YW1wbGUgdW1sYXV0KS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgQ09NQklOSU5HID0gMjsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgQ09NUE9ORU5UIGluZGljYXRlcyBhIGdseXBoIHdpdGggbm8gY29ycmVzcG9uZGluZyBjaGFyYWN0ZXIgCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IENPTVBPTkVOVCBpbmRpY2F0ZXMgYSBnbHlwaCB3aXRoIG5vIGNvcnJlc3BvbmRpbmcgY2hhcmFjdGVyCiAgICAgICogaW4gdGhlIGJhY2tpbmcgc3RvcmUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIENPTVBPTkVOVCA9IDM7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFdISVRFU1BBQ0UgaW5kaWNhdGVzIGEgZ2x5cGggd2l0aG91dCB2aXN1YWwgCi0gICAgICogcmVwcmVzZW50YXRpb24uIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBXSElURVNQQUNFIGluZGljYXRlcyBhIGdseXBoIHdpdGhvdXQgdmlzdWFsIHJlcHJlc2VudGF0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBXSElURVNQQUNFID0gNDsKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBHbHlwaE1ldHJpY3Mgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBob3Jpem9udGFsIHNwZWNpZmllcyBpZiBtZXRyaWNzIGFyZSBmb3IgYSBob3Jpem9udGFsIGJhc2VsaW5lIAotICAgICAqICh0cnVlIHZhbHVlKSwgb3IgYSB2ZXJ0aWNhbCBiYXNlbGluZSAoZmFsc2UgdmFsdWUpLgotICAgICAqIEBwYXJhbSBhZHZhbmNlWCB0aGUgWCBjb21wb25lbnQgb2YgdGhlIGdseXBoJ3MgYWR2YW5jZS4KLSAgICAgKiBAcGFyYW0gYWR2YW5jZVkgdGhlIFkgY29tcG9uZW50IG9mIHRoZSBnbHlwaCdzIGFkdmFuY2UuCi0gICAgICogQHBhcmFtIGJvdW5kcyB0aGUgZ2x5cGgncyBib3VuZHMuCi0gICAgICogQHBhcmFtIGdseXBoVHlwZSB0aGUgZ2x5cGgncyB0eXBlLgorICAgICAqIEBwYXJhbSBob3Jpem9udGFsCisgICAgICogICAgICAgICAgICBzcGVjaWZpZXMgaWYgbWV0cmljcyBhcmUgZm9yIGEgaG9yaXpvbnRhbCBiYXNlbGluZSAodHJ1ZQorICAgICAqICAgICAgICAgICAgdmFsdWUpLCBvciBhIHZlcnRpY2FsIGJhc2VsaW5lIChmYWxzZSB2YWx1ZSkuCisgICAgICogQHBhcmFtIGFkdmFuY2VYCisgICAgICogICAgICAgICAgICB0aGUgWCBjb21wb25lbnQgb2YgdGhlIGdseXBoJ3MgYWR2YW5jZS4KKyAgICAgKiBAcGFyYW0gYWR2YW5jZVkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvbXBvbmVudCBvZiB0aGUgZ2x5cGgncyBhZHZhbmNlLgorICAgICAqIEBwYXJhbSBib3VuZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBnbHlwaCdzIGJvdW5kcy4KKyAgICAgKiBAcGFyYW0gZ2x5cGhUeXBlCisgICAgICogICAgICAgICAgICB0aGUgZ2x5cGgncyB0eXBlLgogICAgICAqLwotICAgIHB1YmxpYyBHbHlwaE1ldHJpY3MoYm9vbGVhbiBob3Jpem9udGFsLCBmbG9hdCBhZHZhbmNlWCwgZmxvYXQgYWR2YW5jZVksIAotICAgICAgICAgICAgUmVjdGFuZ2xlMkQgYm91bmRzLCBieXRlIGdseXBoVHlwZSkgeworICAgIHB1YmxpYyBHbHlwaE1ldHJpY3MoYm9vbGVhbiBob3Jpem9udGFsLCBmbG9hdCBhZHZhbmNlWCwgZmxvYXQgYWR2YW5jZVksIFJlY3RhbmdsZTJEIGJvdW5kcywKKyAgICAgICAgICAgIGJ5dGUgZ2x5cGhUeXBlKSB7CiAgICAgICAgIHRoaXMuaG9yaXpvbnRhbCA9IGhvcml6b250YWw7CiAgICAgICAgIHRoaXMuYWR2YW5jZVggPSBhZHZhbmNlWDsKICAgICAgICAgdGhpcy5hZHZhbmNlWSA9IGFkdmFuY2VZOwpAQCAtMTA3LDkgKzEyMywxMiBAQAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBob3Jpem9udGFsIEdseXBoTWV0cmljcyB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYWR2YW5jZVggdGhlIFggY29tcG9uZW50IG9mIHRoZSBnbHlwaCdzIGFkdmFuY2UuCi0gICAgICogQHBhcmFtIGJvdW5kcyB0aGUgZ2x5cGgncyBib3VuZHMuCi0gICAgICogQHBhcmFtIGdseXBoVHlwZSB0aGUgZ2x5cGgncyB0eXBlLgorICAgICAqIEBwYXJhbSBhZHZhbmNlWAorICAgICAqICAgICAgICAgICAgdGhlIFggY29tcG9uZW50IG9mIHRoZSBnbHlwaCdzIGFkdmFuY2UuCisgICAgICogQHBhcmFtIGJvdW5kcworICAgICAqICAgICAgICAgICAgdGhlIGdseXBoJ3MgYm91bmRzLgorICAgICAqIEBwYXJhbSBnbHlwaFR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBnbHlwaCdzIHR5cGUuCiAgICAgICovCiAgICAgcHVibGljIEdseXBoTWV0cmljcyhmbG9hdCBhZHZhbmNlWCwgUmVjdGFuZ2xlMkQgYm91bmRzLCBieXRlIGdseXBoVHlwZSkgewogICAgICAgICB0aGlzLmFkdmFuY2VYID0gYWR2YW5jZVg7CkBAIC0xMjksNyArMTQ4LDcgQEAKICAgICAgKiBAcmV0dXJuIGdseXBoJ3MgYm91bmRzLgogICAgICAqLwogICAgIHB1YmxpYyBSZWN0YW5nbGUyRCBnZXRCb3VuZHMyRCgpIHsKLSAgICAgICAgcmV0dXJuIChSZWN0YW5nbGUyRC5GbG9hdCkgdGhpcy5ib3VuZHMuY2xvbmUoKTsKKyAgICAgICAgcmV0dXJuIChSZWN0YW5nbGUyRC5GbG9hdCl0aGlzLmJvdW5kcy5jbG9uZSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTg3LDExICsyMDYsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSByaWdodCAoZm9yIGhvcml6b250YWwpIG9yIAotICAgICAqIGJvdHRvbSAoZm9yIHZlcnRpY2FsKSBvZiB0aGUgZ2x5cGggYm91bmRzIHRvIHRoZSBhZHZhbmNlLgorICAgICAqIEdldHMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIHJpZ2h0IChmb3IgaG9yaXpvbnRhbCkgb3IgYm90dG9tIChmb3IKKyAgICAgKiB2ZXJ0aWNhbCkgb2YgdGhlIGdseXBoIGJvdW5kcyB0byB0aGUgYWR2YW5jZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSByaWdodCAoZm9yIGhvcml6b250YWwpIG9yIAotICAgICAqIGJvdHRvbSAoZm9yIHZlcnRpY2FsKSBvZiB0aGUgZ2x5cGggYm91bmRzIHRvIHRoZSBhZHZhbmNlLgorICAgICAqIEByZXR1cm4gdGhlIGRpc3RhbmNlIGZyb20gdGhlIHJpZ2h0IChmb3IgaG9yaXpvbnRhbCkgb3IgYm90dG9tIChmb3IKKyAgICAgKiAgICAgICAgIHZlcnRpY2FsKSBvZiB0aGUgZ2x5cGggYm91bmRzIHRvIHRoZSBhZHZhbmNlLgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdCBnZXRSU0IoKSB7CiAgICAgICAgIGlmICh0aGlzLmhvcml6b250YWwpIHsKQEAgLTIwMSwxMSArMjIwLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGlzdGFuY2UgZnJvbSAwLCAwIHRvIHRoZSBsZWZ0IChmb3IgaG9yaXpvbnRhbCkgCi0gICAgICogb3IgdG9wIChmb3IgdmVydGljYWwpIG9mIHRoZSBnbHlwaCBib3VuZHMuCisgICAgICogR2V0cyB0aGUgZGlzdGFuY2UgZnJvbSAwLCAwIHRvIHRoZSBsZWZ0IChmb3IgaG9yaXpvbnRhbCkgb3IgdG9wIChmb3IKKyAgICAgKiB2ZXJ0aWNhbCkgb2YgdGhlIGdseXBoIGJvdW5kcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkaXN0YW5jZSBmcm9tIDAsIDAgdG8gdGhlIGxlZnQgKGZvciBob3Jpem9udGFsKSAKLSAgICAgKiBvciB0b3AgKGZvciB2ZXJ0aWNhbCkgb2YgdGhlIGdseXBoIGJvdW5kcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBkaXN0YW5jZSBmcm9tIDAsIDAgdG8gdGhlIGxlZnQgKGZvciBob3Jpem9udGFsKSBvciB0b3AgKGZvcgorICAgICAqICAgICAgICAgdmVydGljYWwpIG9mIHRoZSBnbHlwaCBib3VuZHMuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldExTQigpIHsKICAgICAgICAgaWYgKHRoaXMuaG9yaXpvbnRhbCkgewpAQCAtMjQ1LDQgKzI2NCwzIEBACiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9mb250L0dseXBoVmVjdG9yLmphdmEgYi9hd3QvamF2YS9hd3QvZm9udC9HbHlwaFZlY3Rvci5qYXZhCmluZGV4IGIzYzk0MDYuLmE3MmI3NzQgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9mb250L0dseXBoVmVjdG9yLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ZvbnQvR2x5cGhWZWN0b3IuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBJbHlhIFMuIE9rb21pbgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuZm9udDsKIAogaW1wb3J0IGphdmEuYXd0LkZvbnQ7CkBAIC0zMiw0NSArMzMsNDcgQEAKIGltcG9ydCBqYXZhLmF3dC5nZW9tLlJlY3RhbmdsZTJEOwogCiAvKioKLSAqIFRoZSBHbHlwaFZlY3RvciBjbGFzcyBjb250YWlucyBhIGNvbGxlY3Rpb24gb2YgZ2x5cGhzIHdpdGggZ2VvbWV0cmljIAotICogaW5mb3JtYXRpb24gYW5kIGVhY2ggZ2x5cGgncyBsb2NhdGlvbi4gRWFjaCBHbHlwaFZlY3RvciBjYW4gYmUgYXNzb2NpYXRlZCAKLSAqIHdpdGggb25seSBvbmUgRm9udC4gR2x5cGhWZWN0b3IgY29udGFpbnMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGZvciAKLSAqIGVhY2ggZ2x5cGg6CisgKiBUaGUgR2x5cGhWZWN0b3IgY2xhc3MgY29udGFpbnMgYSBjb2xsZWN0aW9uIG9mIGdseXBocyB3aXRoIGdlb21ldHJpYworICogaW5mb3JtYXRpb24gYW5kIGVhY2ggZ2x5cGgncyBsb2NhdGlvbi4gRWFjaCBHbHlwaFZlY3RvciBjYW4gYmUgYXNzb2NpYXRlZAorICogd2l0aCBvbmx5IG9uZSBGb250LiBHbHlwaFZlY3RvciBjb250YWlucyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgZm9yIGVhY2gKKyAqIGdseXBoOgogICogPHVsPgogICogPGxpPnRoZSBnbHlwaCBwb3NpdGlvbjs8L2xpPgogICogPGxpPnRoZSB0cmFuc2Zvcm0gb2YgdGhlIGdseXBoOzwvbGk+CiAgKiA8bGk+dGhlIG1ldHJpY3Mgb2YgdGhlIGdseXBoIGluIHRoZSBjb250ZXh0IG9mIHRoZSBHbHlwaFZlY3Rvci48L2xpPgogICogPC91bD4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHbHlwaFZlY3RvciBpbXBsZW1lbnRzIENsb25lYWJsZSB7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IEZMQUdfSEFTX1RSQU5TRk9STVMgaW5kaWNhdGVzIHRoYXQgdGhpcyBHbHlwaFZlY3RvciAKLSAgICAgKiBoYXMgcGVyLWdseXBoIHRyYW5zZm9ybXMuCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEZMQUdfSEFTX1RSQU5TRk9STVMgaW5kaWNhdGVzIHRoYXQgdGhpcyBHbHlwaFZlY3RvciBoYXMKKyAgICAgKiBwZXItZ2x5cGggdHJhbnNmb3Jtcy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0hBU19UUkFOU0ZPUk1TID0gMTsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgRkxBR19IQVNfUE9TSVRJT05fQURKVVNUTUVOVFMgaW5kaWNhdGVzIHRoYXQgCi0gICAgICogdGhlIEdseXBoVmVjdG9yIGhhcyBwZXItZ2x5cGggcG9zaXRpb24gYWRqdXN0bWVudHMuIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBGTEFHX0hBU19QT1NJVElPTl9BREpVU1RNRU5UUyBpbmRpY2F0ZXMgdGhhdCB0aGUgR2x5cGhWZWN0b3IKKyAgICAgKiBoYXMgcGVyLWdseXBoIHBvc2l0aW9uIGFkanVzdG1lbnRzLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfSEFTX1BPU0lUSU9OX0FESlVTVE1FTlRTID0gMjsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgRkxBR19SVU5fUlRMIGluZGljYXRlcyB0aGF0IHRoaXMgR2x5cGhWZWN0b3IgaGFzIGEgCi0gICAgICogcmlnaHQgdG8gbGVmdCBydW4gZGlyZWN0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBGTEFHX1JVTl9SVEwgaW5kaWNhdGVzIHRoYXQgdGhpcyBHbHlwaFZlY3RvciBoYXMgYSByaWdodCB0bworICAgICAqIGxlZnQgcnVuIGRpcmVjdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1JVTl9SVEwgPSA0OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBGTEFHX0NPTVBMRVhfR0xZUEhTIGluZGljYXRlcyB0aGF0IHRoaXMgR2x5cGhWZWN0b3IgCi0gICAgICogaGFzIGEgY29tcGxleCBnbHlwaCB0byBjaGFyIG1hcHBpbmcuCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEZMQUdfQ09NUExFWF9HTFlQSFMgaW5kaWNhdGVzIHRoYXQgdGhpcyBHbHlwaFZlY3RvciBoYXMgYQorICAgICAqIGNvbXBsZXggZ2x5cGggdG8gY2hhciBtYXBwaW5nLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfQ09NUExFWF9HTFlQSFMgPSA4OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBGTEFHX01BU0sgaW5kaWNhdGVzIGEgbWFzayBmb3Igc3VwcG9ydGVkIGZsYWdzIAotICAgICAqIGZyb20gZ2V0TGF5b3V0RmxhZ3MuCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEZMQUdfTUFTSyBpbmRpY2F0ZXMgYSBtYXNrIGZvciBzdXBwb3J0ZWQgZmxhZ3MgZnJvbQorICAgICAqIGdldExheW91dEZsYWdzLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfTUFTSyA9IDE1OyAvLyAofCkgbWFzayBvZiBvdGhlciBmbGFncwogCkBAIC04MSwxNyArODQsMTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwaXhlbCBib3VuZHMgb2YgdGhlIEdseXBoVmVjdG9yIHdoZW4gcmVuZGVyZWQKLSAgICAgKiBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBGb250UmVuZGVyQ29udGV4dC4KKyAgICAgKiBHZXRzIHRoZSBwaXhlbCBib3VuZHMgb2YgdGhlIEdseXBoVmVjdG9yIHdoZW4gcmVuZGVyZWQgYXQgdGhlIHNwZWNpZmllZAorICAgICAqIGxvY2F0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBGb250UmVuZGVyQ29udGV4dC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZnJjIHRoZSBGb250UmVuZGVyQ29udGV4dC4KLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBHbHlwaFZlY3RvcidzIGxvY2F0aW9uLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIEdseXBoVmVjdG9yJ3MgbG9jYXRpb24uCi0gICAgICogCisgICAgICogQHBhcmFtIGZyYworICAgICAqICAgICAgICAgICAgdGhlIEZvbnRSZW5kZXJDb250ZXh0LgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBHbHlwaFZlY3RvcidzIGxvY2F0aW9uLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBHbHlwaFZlY3RvcidzIGxvY2F0aW9uLgogICAgICAqIEByZXR1cm4gdGhlIHBpeGVsIGJvdW5kcwogICAgICAqLwogICAgIHB1YmxpYyBSZWN0YW5nbGUgZ2V0UGl4ZWxCb3VuZHMoRm9udFJlbmRlckNvbnRleHQgZnJjLCBmbG9hdCB4LCBmbG9hdCB5KSB7Ci0gICAgICAgIC8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gLSBpbnRlZ2VyIFJlY3RhbmdsZSwgdGhhdCBlbmNsb3NlcyB2aXN1YWwgCisgICAgICAgIC8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gLSBpbnRlZ2VyIFJlY3RhbmdsZSwgdGhhdCBlbmNsb3NlcyB2aXN1YWwKICAgICAgICAgLy8gYm91bmRzIHJlY3RhbmdsZQogICAgICAgICBSZWN0YW5nbGUyRCB2aXN1YWxSZWN0ID0gZ2V0VmlzdWFsQm91bmRzKCk7CiAKQEAgLTEwNCwxOSArMTA5LDIxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgcGl4ZWwgYm91bmRzIG9mIHRoZSBnbHlwaCB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXggaW4KLSAgICAgKiB0aGlzIEdseXBoVmVjdG9yIHdoaWNoIGlzIHJlbmRlcmVkIHdpdGggdGhlIHNwZWNpZmllZAotICAgICAqIEZvbnRSZW5kZXJDb250ZXh0IGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uCisgICAgICogR2V0cyB0aGUgcGl4ZWwgYm91bmRzIG9mIHRoZSBnbHlwaCB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXggaW4gdGhpcworICAgICAqIEdseXBoVmVjdG9yIHdoaWNoIGlzIHJlbmRlcmVkIHdpdGggdGhlIHNwZWNpZmllZCBGb250UmVuZGVyQ29udGV4dCBhdCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgbG9jYXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIGluZGV4IHRoZSBnbHlwaCBpbmRleCBpbiB0aGlzIEdseXBoVmVjdG9yLgotICAgICAqIEBwYXJhbSBmcmMgdGhlIEZvbnRSZW5kZXJDb250ZXh0LgotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIEdseXBoVmVjdG9yJ3MgbG9jYXRpb24uCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgR2x5cGhWZWN0b3IncyBsb2NhdGlvbi4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBnbHlwaCBpbmRleCBpbiB0aGlzIEdseXBoVmVjdG9yLgorICAgICAqIEBwYXJhbSBmcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBGb250UmVuZGVyQ29udGV4dC4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgR2x5cGhWZWN0b3IncyBsb2NhdGlvbi4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgR2x5cGhWZWN0b3IncyBsb2NhdGlvbi4KICAgICAgKiBAcmV0dXJuIGEgUmVjdGFuZ2xlIGJvdW5kcy4KICAgICAgKi8KLSAgICBwdWJsaWMgUmVjdGFuZ2xlIGdldEdseXBoUGl4ZWxCb3VuZHMoaW50IGluZGV4LCBGb250UmVuZGVyQ29udGV4dCBmcmMsIAotICAgICAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSkgeworICAgIHB1YmxpYyBSZWN0YW5nbGUgZ2V0R2x5cGhQaXhlbEJvdW5kcyhpbnQgaW5kZXgsIEZvbnRSZW5kZXJDb250ZXh0IGZyYywgZmxvYXQgeCwgZmxvYXQgeSkgewogICAgICAgICBSZWN0YW5nbGUyRCB2aXN1YWxSZWN0ID0gZ2V0R2x5cGhWaXN1YWxCb3VuZHMoaW5kZXgpLmdldEJvdW5kczJEKCk7CiAKICAgICAgICAgaW50IG1pblggPSAoaW50KU1hdGguZmxvb3IodmlzdWFsUmVjdC5nZXRNaW5YKCkgKyB4KTsKQEAgLTEyOCwxNCArMTM1LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmlzdWFsIGJvdW5kcyBvZiB0aGUgR2x5cGhWZWN0b3IuIAorICAgICAqIEdldHMgdGhlIHZpc3VhbCBib3VuZHMgb2YgdGhlIEdseXBoVmVjdG9yLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIHZpc3VhbCBib3VuZHMgb2YgdGhlIEdseXBoVmVjdG9yLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBSZWN0YW5nbGUyRCBnZXRWaXN1YWxCb3VuZHMoKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGxvZ2ljYWwgYm91bmRzIG9mIHRoZSBHbHlwaFZlY3Rvci4gCisgICAgICogR2V0cyB0aGUgbG9naWNhbCBib3VuZHMgb2YgdGhlIEdseXBoVmVjdG9yLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGxvZ2ljYWwgYm91bmRzIG9mIHRoZSBHbHlwaFZlY3Rvci4KICAgICAgKi8KQEAgLTE0NCwzNiArMTUxLDM4IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgcG9zaXRpb24gb2YgdGhlIHNwZWNpZmllZCBnbHlwaCBpbiB0aGlzIEdseXBoVmVjdG9yLgogICAgICAqIAotICAgICAqIEBwYXJhbSBnbHlwaEluZGV4IHRoZSBnbHlwaCBpbmRleCBpbiB0aGlzIEdseXBoVmVjdG9yLgotICAgICAqIEBwYXJhbSBuZXdQb3MgdGhlIG5ldyBwb3NpdGlvbiBvZiB0aGUgZ2x5cGggYXQgdGhlIHNwZWNpZmllZCBnbHlwaEluZGV4LgorICAgICAqIEBwYXJhbSBnbHlwaEluZGV4CisgICAgICogICAgICAgICAgICB0aGUgZ2x5cGggaW5kZXggaW4gdGhpcyBHbHlwaFZlY3Rvci4KKyAgICAgKiBAcGFyYW0gbmV3UG9zCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHBvc2l0aW9uIG9mIHRoZSBnbHlwaCBhdCB0aGUgc3BlY2lmaWVkIGdseXBoSW5kZXguCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0R2x5cGhQb3NpdGlvbihpbnQgZ2x5cGhJbmRleCwgUG9pbnQyRCBuZXdQb3MpOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgcG9zaXRpb24gb2YgdGhlIHNwZWNpZmllZCBnbHlwaCBpbiB0aGlzIEdseXBoVmVjdG9yLgogICAgICAqIAotICAgICAqIEBwYXJhbSBnbHlwaEluZGV4IHRoZSBnbHlwaCBpbmRleCBpbiB0aGlzIEdseXBoVmVjdG9yLgotICAgICAqIAorICAgICAqIEBwYXJhbSBnbHlwaEluZGV4CisgICAgICogICAgICAgICAgICB0aGUgZ2x5cGggaW5kZXggaW4gdGhpcyBHbHlwaFZlY3Rvci4KICAgICAgKiBAcmV0dXJuIHRoZSBwb3NpdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGdseXBoIGluIHRoaXMgR2x5cGhWZWN0b3IuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFBvaW50MkQgZ2V0R2x5cGhQb3NpdGlvbihpbnQgZ2x5cGhJbmRleCk7CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBhZmZpbmUgdHJhbnNmb3JtIHRvIGEgZ2x5cGggd2l0aCB0aGUgc3BlY2lmaWVkIGluZGV4Ci0gICAgICogaW4gdGhpcyBHbHlwaFZlY3Rvci4KKyAgICAgKiBTZXRzIHRoZSBhZmZpbmUgdHJhbnNmb3JtIHRvIGEgZ2x5cGggd2l0aCB0aGUgc3BlY2lmaWVkIGluZGV4IGluIHRoaXMKKyAgICAgKiBHbHlwaFZlY3Rvci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZ2x5cGhJbmRleCB0aGUgZ2x5dGggaW5kZXggaW4gdGhpcyBHbHlwaFZlY3Rvci4KLSAgICAgKiBAcGFyYW0gdHJhbnMgdGhlIEFmZmluZVRyYW5zZm9ybSB0byBiZSBhc3NpZ25lZCB0byB0aGUKLSAgICAgKiBzcGVjaWZpZWQgZ2x5cGguCisgICAgICogQHBhcmFtIGdseXBoSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBnbHl0aCBpbmRleCBpbiB0aGlzIEdseXBoVmVjdG9yLgorICAgICAqIEBwYXJhbSB0cmFucworICAgICAqICAgICAgICAgICAgdGhlIEFmZmluZVRyYW5zZm9ybSB0byBiZSBhc3NpZ25lZCB0byB0aGUgc3BlY2lmaWVkIGdseXBoLgogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEdseXBoVHJhbnNmb3JtKGludCBnbHlwaEluZGV4LCAKLSAgICAgICAgICAgIEFmZmluZVRyYW5zZm9ybSB0cmFucyk7CisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0R2x5cGhUcmFuc2Zvcm0oaW50IGdseXBoSW5kZXgsIEFmZmluZVRyYW5zZm9ybSB0cmFucyk7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSB0cmFuc2Zvcm0gb2YgdGhlIHNwZWNpZmllZCBnbHlwaCBpbiB0aGlzIEdseXBoVmVjdG9yLgogICAgICAqIAotICAgICAqIEBwYXJhbSBnbHlwaEluZGV4IHRoZSBnbHlwaCBpbmRleCBpbiB0aGlzIEdseXBoVmVjdG9yLgotICAgICAqIAorICAgICAqIEBwYXJhbSBnbHlwaEluZGV4CisgICAgICogICAgICAgICAgICB0aGUgZ2x5cGggaW5kZXggaW4gdGhpcyBHbHlwaFZlY3Rvci4KICAgICAgKiBAcmV0dXJuIHRoZSBuZXcgdHJhbnNmb3JtIG9mIHRoZSBnbHlwaC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgQWZmaW5lVHJhbnNmb3JtIGdldEdseXBoVHJhbnNmb3JtKGludCBnbHlwaEluZGV4KTsKQEAgLTE4MSwzNCArMTkwLDMyIEBACiAgICAgLyoqCiAgICAgICogQ29tcGFyZXMgdGhpcyBHbHlwaFZlY3RvciB3aXRoIHRoZSBzcGVjaWZpZWQgR2x5cGhWZWN0b3Igb2JqZWN0cy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZ2x5cGhWZWN0b3IgdGhlIEdseXBoVmVjdG9yIG9iamVjdCB0byBiZSBjb21wYXJlZC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZ2x5cGhWZWN0b3IKKyAgICAgKiAgICAgICAgICAgIHRoZSBHbHlwaFZlY3RvciBvYmplY3QgdG8gYmUgY29tcGFyZWQuCiAgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGlzIEdseXBoVmVjdG9yIGlzIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgR2x5cGhWZWN0b3IKLSAgICAgKiBvYmplY3QsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiAgICAgICAgIG9iamVjdCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGVxdWFscyhHbHlwaFZlY3RvciBnbHlwaFZlY3Rvcik7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZXRyaWNzIG9mIHRoZSBnbHlwaCB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXgKLSAgICAgKiBpbiB0aGlzIEdseXBoVmVjdG9yLgorICAgICAqIEdldHMgdGhlIG1ldHJpY3Mgb2YgdGhlIGdseXBoIHdpdGggdGhlIHNwZWNpZmllZCBpbmRleCBpbiB0aGlzCisgICAgICogR2x5cGhWZWN0b3IuCiAgICAgICogCi0gICAgICogQHBhcmFtIGdseXBoSW5kZXggaW5kZXggaW4gdGhpcyBHbHlwaFZlY3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRyaWNzIG9mIHRoZSBnbHlwaCB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXgKLSAgICAgKiBpbiB0aGlzIEdseXBoVmVjdG9yLgorICAgICAqIEBwYXJhbSBnbHlwaEluZGV4CisgICAgICogICAgICAgICAgICBpbmRleCBpbiB0aGlzIEdseXBoVmVjdG9yLgorICAgICAqIEByZXR1cm4gdGhlIG1ldHJpY3Mgb2YgdGhlIGdseXBoIHdpdGggdGhlIHNwZWNpZmllZCBpbmRleCBpbiB0aGlzCisgICAgICogICAgICAgICBHbHlwaFZlY3Rvci4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgR2x5cGhNZXRyaWNzIGdldEdseXBoTWV0cmljcyhpbnQgZ2x5cGhJbmRleCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBqdXN0aWZpY2F0aW9uIGluZm9ybWF0aW9uIG9mIHRoZSBnbHlwaCAKLSAgICAgKiB3aG9zZSBpbmRleCBpcyBzcGVjaWZpZWQuCisgICAgICogR2V0cyB0aGUganVzdGlmaWNhdGlvbiBpbmZvcm1hdGlvbiBvZiB0aGUgZ2x5cGggd2hvc2UgaW5kZXggaXMgc3BlY2lmaWVkLgogICAgICAqIAotICAgICAqIEBwYXJhbSBnbHlwaEluZGV4IHRoZSBnbHlwaCBpbmRleC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBHbHlwaEp1c3RpZmljYXRpb25JbmZvIGZvciB0aGUgc3BlY2lmaWVkIGdseXBoLiAKKyAgICAgKiBAcGFyYW0gZ2x5cGhJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGdseXBoIGluZGV4LgorICAgICAqIEByZXR1cm4gdGhlIEdseXBoSnVzdGlmaWNhdGlvbkluZm8gZm9yIHRoZSBzcGVjaWZpZWQgZ2x5cGguCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IEdseXBoSnVzdGlmaWNhdGlvbkluZm8gZ2V0R2x5cGhKdXN0aWZpY2F0aW9uSW5mbygKLSAgICAgICAgICAgIGludCBnbHlwaEluZGV4KTsKKyAgICBwdWJsaWMgYWJzdHJhY3QgR2x5cGhKdXN0aWZpY2F0aW9uSW5mbyBnZXRHbHlwaEp1c3RpZmljYXRpb25JbmZvKGludCBnbHlwaEluZGV4KTsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIEZvbnRSZW5kZXJDb250ZXh0IG9mIHRoaXMgR2x5cGhWZWN0b3IuCkBAIC0yMTgsMTggKzIyNSwyMCBAQAogICAgIHB1YmxpYyBhYnN0cmFjdCBGb250UmVuZGVyQ29udGV4dCBnZXRGb250UmVuZGVyQ29udGV4dCgpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyBhIFNoYXBlIG9iamVjdCB3aGljaCBkZWZpbmVzIHRoZSB2aXN1YWwgcmVwcmVzZW50YXRpb24gCi0gICAgICogb2YgdGhlIHNwZWNpZmllZCBnbHlwaCBpbiB0aGlzIEdseXBoVmVjdG9yLCB0cmFuc2xhdGVkIGEgCi0gICAgICogZGlzdGFuY2Ugb2YgeCBpbiB0aGUgWCBkaXJlY3Rpb24gYW5kIHkgaW4gdGhlIFkgZGlyZWN0aW9uLiAKKyAgICAgKiBHZXRzIGEgU2hhcGUgb2JqZWN0IHdoaWNoIGRlZmluZXMgdGhlIHZpc3VhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUKKyAgICAgKiBzcGVjaWZpZWQgZ2x5cGggaW4gdGhpcyBHbHlwaFZlY3RvciwgdHJhbnNsYXRlZCBhIGRpc3RhbmNlIG9mIHggaW4gdGhlIFgKKyAgICAgKiBkaXJlY3Rpb24gYW5kIHkgaW4gdGhlIFkgZGlyZWN0aW9uLgogICAgICAqIAotICAgICAqIEBwYXJhbSBnbHlwaEluZGV4IHRoZSBnbHl0aCBpbmRleCBpbiB0aGlzIEdseXBoVmVjdG9yLgotICAgICAqIEBwYXJhbSB4IHRoZSBkaXN0YW5jZSBpbiB0aGUgWCBkaXJlY3Rpb24gdG8gdHJhbnNsYXRlIHRoZSAKLSAgICAgKiBzaGFwZSBvYmplY3QgYmVmb3JlIHJldHVybmluZyBpdC4KLSAgICAgKiBAcGFyYW0geSB0aGUgZGlzdGFuY2UgaW4gdGhlIFkgZGlyZWN0aW9uIHRvIHRyYW5zbGF0ZSB0aGUgCi0gICAgICogc2hhcGUgb2JqZWN0IGJlZm9yZSByZXR1cm5pbmcgaXQuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIFNoYXBlIG9iamVjdCB3aGljaCByZXByZXNlbnRzIHRoZSB2aXN1YWwgcmVwcmVzZW50YXRpb24gCi0gICAgICogb2YgdGhlIHNwZWNpZmllZCBnbHlwaCBpbiB0aGlzIEdseXBoVmVjdG9yIC0gZ2x5cGggb3V0bGluZS4gCisgICAgICogQHBhcmFtIGdseXBoSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBnbHl0aCBpbmRleCBpbiB0aGlzIEdseXBoVmVjdG9yLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgZGlzdGFuY2UgaW4gdGhlIFggZGlyZWN0aW9uIHRvIHRyYW5zbGF0ZSB0aGUgc2hhcGUgb2JqZWN0CisgICAgICogICAgICAgICAgICBiZWZvcmUgcmV0dXJuaW5nIGl0LgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgZGlzdGFuY2UgaW4gdGhlIFkgZGlyZWN0aW9uIHRvIHRyYW5zbGF0ZSB0aGUgc2hhcGUgb2JqZWN0CisgICAgICogICAgICAgICAgICBiZWZvcmUgcmV0dXJuaW5nIGl0LgorICAgICAqIEByZXR1cm4gYSBTaGFwZSBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyB0aGUgdmlzdWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZQorICAgICAqICAgICAgICAgc3BlY2lmaWVkIGdseXBoIGluIHRoaXMgR2x5cGhWZWN0b3IgLSBnbHlwaCBvdXRsaW5lLgogICAgICAqLwogICAgIHB1YmxpYyBTaGFwZSBnZXRHbHlwaE91dGxpbmUoaW50IGdseXBoSW5kZXgsIGZsb2F0IHgsIGZsb2F0IHkpIHsKICAgICAgICAgU2hhcGUgaW5pdGlhbFNoYXBlID0gZ2V0R2x5cGhPdXRsaW5lKGdseXBoSW5kZXgpOwpAQCAtMjQwLDQzICsyNDksNDIgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSB2aXN1YWwgYm91bmRzIG9mIHRoZSBzcGVjaWZpZWQgZ2x5cGggaW4gdGhlIEdseXBoVmVjdG9yLgogICAgICAqIAotICAgICAqIEBwYXJhbSBnbHlwaEluZGV4IHRoZSBnbHlwaCBpbmRleCBpbiB0aGlzIEdseXBoVmVjdG9yLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGdseXBoIHZpc3VhbCBib3VuZHMgb2YgdGhlIGdseXBoIHdpdGggdGhlIHNwZWNpZmllZAotICAgICAqIGluZGV4IGluIHRoZSBHbHlwaFZlY3Rvci4KKyAgICAgKiBAcGFyYW0gZ2x5cGhJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGdseXBoIGluZGV4IGluIHRoaXMgR2x5cGhWZWN0b3IuCisgICAgICogQHJldHVybiB0aGUgZ2x5cGggdmlzdWFsIGJvdW5kcyBvZiB0aGUgZ2x5cGggd2l0aCB0aGUgc3BlY2lmaWVkIGluZGV4IGluCisgICAgICogICAgICAgICB0aGUgR2x5cGhWZWN0b3IuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFNoYXBlIGdldEdseXBoVmlzdWFsQm91bmRzKGludCBnbHlwaEluZGV4KTsKIAogICAgIC8qKgotICAgICAqIEdldHMgYSBTaGFwZSBvYmplY3Qgd2hpY2ggZGVmaW5lcyB0aGUgdmlzdWFsIHJlcHJlc2VudGF0aW9uIAotICAgICAqIG9mIHRoZSBzcGVjaWZpZWQgZ2x5cGggaW4gdGhpcyBHbHlwaFZlY3Rvci4gCi0gICAgICogIAotICAgICAqIEBwYXJhbSBnbHlwaEluZGV4IHRoZSBnbHl0aCBpbmRleCBpbiB0aGlzIEdseXBoVmVjdG9yLgorICAgICAqIEdldHMgYSBTaGFwZSBvYmplY3Qgd2hpY2ggZGVmaW5lcyB0aGUgdmlzdWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZQorICAgICAqIHNwZWNpZmllZCBnbHlwaCBpbiB0aGlzIEdseXBoVmVjdG9yLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBTaGFwZSBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyB0aGUgdmlzdWFsIHJlcHJlc2VudGF0aW9uIAotICAgICAqIG9mIHRoZSBzcGVjaWZpZWQgZ2x5cGggaW4gdGhpcyBHbHlwaFZlY3RvciAtIGdseXBoIG91dGxpbmUuIAorICAgICAqIEBwYXJhbSBnbHlwaEluZGV4CisgICAgICogICAgICAgICAgICB0aGUgZ2x5dGggaW5kZXggaW4gdGhpcyBHbHlwaFZlY3Rvci4KKyAgICAgKiBAcmV0dXJuIGEgU2hhcGUgb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgdGhlIHZpc3VhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUKKyAgICAgKiAgICAgICAgIHNwZWNpZmllZCBnbHlwaCBpbiB0aGlzIEdseXBoVmVjdG9yIC0gZ2x5cGggb3V0bGluZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU2hhcGUgZ2V0R2x5cGhPdXRsaW5lKGludCBnbHlwaEluZGV4KTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGxvZ2ljYWwgYm91bmRzIG9mIHRoZSBzcGVjaWZpZWQgZ2x5cGggaW4gCi0gICAgICogdGhlIEdseXBoVmVjdG9yLiAKKyAgICAgKiBHZXRzIHRoZSBsb2dpY2FsIGJvdW5kcyBvZiB0aGUgc3BlY2lmaWVkIGdseXBoIGluIHRoZSBHbHlwaFZlY3Rvci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZ2x5cGhJbmRleCB0aGUgaW5kZXggaW4gdGhpcyBHbHlwaFZlY3RvciBvZiB0aGUgZ2x5cGggZnJvbSB3aGljaCAKLSAgICAgKiB0byByZXRyaWV2ZSBpdHMgbG9naWNhbCBib3VuZHMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBsb2dpY2FsIGJvdW5kcyBvZiB0aGUgc3BlY2lmaWVkIGdseXBoIGluIAotICAgICAqIHRoZSBHbHlwaFZlY3Rvci4KKyAgICAgKiBAcGFyYW0gZ2x5cGhJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IGluIHRoaXMgR2x5cGhWZWN0b3Igb2YgdGhlIGdseXBoIGZyb20gd2hpY2ggdG8KKyAgICAgKiAgICAgICAgICAgIHJldHJpZXZlIGl0cyBsb2dpY2FsIGJvdW5kcworICAgICAqIEByZXR1cm4gdGhlIGxvZ2ljYWwgYm91bmRzIG9mIHRoZSBzcGVjaWZpZWQgZ2x5cGggaW4gdGhlIEdseXBoVmVjdG9yLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTaGFwZSBnZXRHbHlwaExvZ2ljYWxCb3VuZHMoaW50IGdseXBoSW5kZXgpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmlzdWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgR2x5cGhWZWN0b3IgcmVuZGVyZWQgaW4KLSAgICAgKiB4LCB5IGxvY2F0aW9uIGFzIGEgU2hhcGUgb2JqZWN0LgorICAgICAqIEdldHMgdGhlIHZpc3VhbCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIEdseXBoVmVjdG9yIHJlbmRlcmVkIGluIHgsIHkKKyAgICAgKiBsb2NhdGlvbiBhcyBhIFNoYXBlIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBHbHlwaFZlY3Rvci4KLSAgICAgKiBAcGFyYW0geSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBHbHlwaFZlY3Rvci4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgR2x5cGhWZWN0b3IuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIEdseXBoVmVjdG9yLgogICAgICAqIEByZXR1cm4gdGhlIHZpc3VhbCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIEdseXBoVmVjdG9yIGFzIGEgU2hhcGUgb2JqZWN0LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTaGFwZSBnZXRPdXRsaW5lKGZsb2F0IHgsIGZsb2F0IHkpOwpAQCAtMjk4LDc3ICszMDYsNzkgQEAKICAgICAvKioKICAgICAgKiBHZXRzIGFuIGFycmF5IG9mIHRoZSBnbHlwaCBjb2RlcyBvZiB0aGUgc3BlY2lmaWVkIGdseXBocy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYmVnaW5HbHlwaEluZGV4IHRoZSBpbmRleCBpbnRvIHRoaXMgR2x5cGhWZWN0b3IgYXQgd2hpY2ggCi0gICAgICogdG8gc3RhcnQgcmV0cmlldmluZyBnbHlwaCBjb2Rlcy4KLSAgICAgKiBAcGFyYW0gbnVtRW50cmllcyB0aGUgbnVtYmVyIG9mIGdseXBoIGNvZGVzLgotICAgICAqIEBwYXJhbSBjb2RlUmV0dXJuIHRoZSBhcnJheSBpbnRvIHdoaWNoIHRoZSByZXN1bHRpbmcgCi0gICAgICogZ2x5cGhjb2RlcyB3aWxsIGJlIHdyaXR0ZW4uCi0gICAgICogCisgICAgICogQHBhcmFtIGJlZ2luR2x5cGhJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IGludG8gdGhpcyBHbHlwaFZlY3RvciBhdCB3aGljaCB0byBzdGFydCByZXRyaWV2aW5nCisgICAgICogICAgICAgICAgICBnbHlwaCBjb2Rlcy4KKyAgICAgKiBAcGFyYW0gbnVtRW50cmllcworICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBnbHlwaCBjb2Rlcy4KKyAgICAgKiBAcGFyYW0gY29kZVJldHVybgorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IGludG8gd2hpY2ggdGhlIHJlc3VsdGluZyBnbHlwaGNvZGVzIHdpbGwgYmUgd3JpdHRlbi4KICAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiB0aGUgZ2x5cGggY29kZXMuCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGludFtdIGdldEdseXBoQ29kZXMoaW50IGJlZ2luR2x5cGhJbmRleCwgaW50IG51bUVudHJpZXMsIAotICAgICAgICAgICAgaW50W10gY29kZVJldHVybik7CisgICAgcHVibGljIGFic3RyYWN0IGludFtdIGdldEdseXBoQ29kZXMoaW50IGJlZ2luR2x5cGhJbmRleCwgaW50IG51bUVudHJpZXMsIGludFtdIGNvZGVSZXR1cm4pOwogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbiBhcnJheSBvZiB0aGUgY2hhcmFjdGVyIGluZGljZXMgb2YgCi0gICAgICogdGhlIHNwZWNpZmllZCBnbHlwaHMuCisgICAgICogR2V0cyBhbiBhcnJheSBvZiB0aGUgY2hhcmFjdGVyIGluZGljZXMgb2YgdGhlIHNwZWNpZmllZCBnbHlwaHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGJlZ2luR2x5cGhJbmRleCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGdseXBoIHRvIHJldHVybiBpbmZvcm1hdGlvbiBmb3IuCi0gICAgICogQHBhcmFtIG51bUVudHJpZXMgdGhlIG51bWJlciBvZiBnbHlwaCBpbmRpY2VzIHRvIHJldHVybi4KLSAgICAgKiBAcGFyYW0gY29kZVJldHVybiB0aGUgYXJyYXkgaW50byB3aGljaCB0aGUgcmVzdWx0aW5nIGNoYXJhY3RlciAKLSAgICAgKiBpbmRpY2VzIHdpbGwgYmUgd3JpdHRlbi4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gYmVnaW5HbHlwaEluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGdseXBoIHRvIHJldHVybiBpbmZvcm1hdGlvbiBmb3IuCisgICAgICogQHBhcmFtIG51bUVudHJpZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZ2x5cGggaW5kaWNlcyB0byByZXR1cm4uCisgICAgICogQHBhcmFtIGNvZGVSZXR1cm4KKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBpbnRvIHdoaWNoIHRoZSByZXN1bHRpbmcgY2hhcmFjdGVyIGluZGljZXMgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgd3JpdHRlbi4KICAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNoYXJhY3RlciBpbmRpY2VzIGZvciB0aGUgc3BlY2lmaWVzIGdseXBocy4KICAgICAgKi8KLSAgICBwdWJsaWMgaW50W10gZ2V0R2x5cGhDaGFySW5kaWNlcyhpbnQgYmVnaW5HbHlwaEluZGV4LCBpbnQgbnVtRW50cmllcywgCi0gICAgICAgICAgICBpbnRbXSBjb2RlUmV0dXJuKSB7CisgICAgcHVibGljIGludFtdIGdldEdseXBoQ2hhckluZGljZXMoaW50IGJlZ2luR2x5cGhJbmRleCwgaW50IG51bUVudHJpZXMsIGludFtdIGNvZGVSZXR1cm4pIHsKICAgICAgICAgaWYgKGNvZGVSZXR1cm4gPT0gbnVsbCkgewogICAgICAgICAgICAgY29kZVJldHVybiA9IG5ldyBpbnRbbnVtRW50cmllc107CiAgICAgICAgIH0KIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUVudHJpZXM7IGkrKyl7Ci0gICAgICAgICAgICBjb2RlUmV0dXJuW2ldID0gZ2V0R2x5cGhDaGFySW5kZXgoaStiZWdpbkdseXBoSW5kZXgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUVudHJpZXM7IGkrKykgeworICAgICAgICAgICAgY29kZVJldHVybltpXSA9IGdldEdseXBoQ2hhckluZGV4KGkgKyBiZWdpbkdseXBoSW5kZXgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBjb2RlUmV0dXJuOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYW4gYXJyYXkgb2YgdGhlIHBvc2l0aW9ucyBvZiB0aGUgc3BlY2lmaWVkIGdseXBocyBpbiAKLSAgICAgKiB0aGlzIEdseXBoVmVjdG9yLgorICAgICAqIEdldHMgYW4gYXJyYXkgb2YgdGhlIHBvc2l0aW9ucyBvZiB0aGUgc3BlY2lmaWVkIGdseXBocyBpbiB0aGlzCisgICAgICogR2x5cGhWZWN0b3IuCiAgICAgICogCi0gICAgICogQHBhcmFtIGJlZ2luR2x5cGhJbmRleCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGdseXBoIHRvIHJldHVybiBpbmZvcm1hdGlvbiBmb3IuCi0gICAgICogQHBhcmFtIG51bUVudHJpZXMgdGhlIG51bWJlciBvZiBnbHlwaHMgdG8gcmV0dXJuIGluZm9ybWF0aW9uIGZvci4KLSAgICAgKiBAcGFyYW0gcG9zaXRpb25SZXR1cm4gdGhlIGFycmF5IHdoZXJlIHRoZSByZXN1bHQgd2lsbCBiZSBzdG9yZWQuIAotICAgICAqIAorICAgICAqIEBwYXJhbSBiZWdpbkdseXBoSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZ2x5cGggdG8gcmV0dXJuIGluZm9ybWF0aW9uIGZvci4KKyAgICAgKiBAcGFyYW0gbnVtRW50cmllcworICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBnbHlwaHMgdG8gcmV0dXJuIGluZm9ybWF0aW9uIGZvci4KKyAgICAgKiBAcGFyYW0gcG9zaXRpb25SZXR1cm4KKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSB3aGVyZSB0aGUgcmVzdWx0IHdpbGwgYmUgc3RvcmVkLgogICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgZ2x5cGggcG9zaXRpb25zLgogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBmbG9hdFtdIGdldEdseXBoUG9zaXRpb25zKGludCBiZWdpbkdseXBoSW5kZXgsIAotICAgICAgICAgICAgaW50IG51bUVudHJpZXMsIGZsb2F0W10gcG9zaXRpb25SZXR1cm4pOworICAgIHB1YmxpYyBhYnN0cmFjdCBmbG9hdFtdIGdldEdseXBoUG9zaXRpb25zKGludCBiZWdpbkdseXBoSW5kZXgsIGludCBudW1FbnRyaWVzLAorICAgICAgICAgICAgZmxvYXRbXSBwb3NpdGlvblJldHVybik7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBnbHlwaCBjb2RlIG9mIHRoZSBzcGVjaWZpZWQgZ2x5cGguCiAgICAgICogCi0gICAgICogQHBhcmFtIGdseXBoSW5kZXggdGhlIGluZGV4IGluIHRoaXMgR2x5cGhWZWN0b3Igd2hpY2ggY29ycmVzcG9uZHMgCi0gICAgICogdG8gdGhlIGdseXBoIGZyb20gd2hpY2ggdG8gcmV0cmlldmUgdGhlIGdseXBoY29kZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZ2x5cGhJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IGluIHRoaXMgR2x5cGhWZWN0b3Igd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIGdseXBoCisgICAgICogICAgICAgICAgICBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIHRoZSBnbHlwaGNvZGUuCiAgICAgICogQHJldHVybiB0aGUgZ2x5cGhjb2RlIG9mIHRoZSBzcGVjaWZpZWQgZ2x5cGguCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRHbHlwaENvZGUoaW50IGdseXBoSW5kZXgpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgZmlyc3QgbG9naWNhbCBjaGFyYWN0ZXIncyBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIGdseXBoLiAKLSAgICAgKiAgCi0gICAgICogQHBhcmFtIGdseXBoSW5kZXggdGhlIGdseXBoIGluZGV4LgorICAgICAqIEdldHMgdGhlIGZpcnN0IGxvZ2ljYWwgY2hhcmFjdGVyJ3MgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBnbHlwaC4KICAgICAgKiAKKyAgICAgKiBAcGFyYW0gZ2x5cGhJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGdseXBoIGluZGV4LgogICAgICAqIEByZXR1cm4gdGhlIHRoZSBmaXJzdCBsb2dpY2FsIGNoYXJhY3RlcidzIGluZGV4LgogICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0R2x5cGhDaGFySW5kZXgoaW50IGdseXBoSW5kZXgpeworICAgIHB1YmxpYyBpbnQgZ2V0R2x5cGhDaGFySW5kZXgoaW50IGdseXBoSW5kZXgpIHsKICAgICAgICAgLy8gZGVmYXVsdCBpbXBsZW1ldGF0aW9uIG9uZS10by1vbmUKICAgICAgICAgcmV0dXJuIGdseXBoSW5kZXg7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyBkZWZhdWx0IGxheW91dCB0byB0aGlzIEdseXBoVmVjdG9yLiAKKyAgICAgKiBTZXRzIGRlZmF1bHQgbGF5b3V0IHRvIHRoaXMgR2x5cGhWZWN0b3IuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcGVyZm9ybURlZmF1bHRMYXlvdXQoKTsKIApAQCAtMzgwLDE1ICszOTAsMTQgQEAKICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldE51bUdseXBocygpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyBmbGFncyB3aGljaCBkZXNjcmliZSB0aGUgZ2xvYmFsIHN0YXRlIG9mIHRoZSBHbHlwaFZlY3Rvci4gCi0gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyAwLgorICAgICAqIEdldHMgZmxhZ3Mgd2hpY2ggZGVzY3JpYmUgdGhlIGdsb2JhbCBzdGF0ZSBvZiB0aGUgR2x5cGhWZWN0b3IuIFRoZQorICAgICAqIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyAwLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGxheW91dCBmbGFncwogICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TGF5b3V0RmxhZ3MoKXsKKyAgICBwdWJsaWMgaW50IGdldExheW91dEZsYWdzKCkgewogICAgICAgICAvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIC0gcmV0dXJuZWQgdmFsdWUgaXMgMAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ZvbnQvR3JhcGhpY0F0dHJpYnV0ZS5qYXZhIGIvYXd0L2phdmEvYXd0L2ZvbnQvR3JhcGhpY0F0dHJpYnV0ZS5qYXZhCmluZGV4IDJmNDE5NTEuLjg0ODBlMGYgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9mb250L0dyYXBoaWNBdHRyaWJ1dGUuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZm9udC9HcmFwaGljQXR0cmlidXRlLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgSWx5YSBTLiBPa29taW4KICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmZvbnQ7CiAKIGltcG9ydCBqYXZhLmF3dC5HcmFwaGljczJEOwpAQCAtMjYsNDkgKzI3LDU0IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogVGhlIEdyYXBoaWNBdHRyaWJ1dGUgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgYW4gb3Bwb3J0dW5pdHkgdG8KLSAqIGluc2VydCBncmFwaGljYWwgZWxlbWVudHMgaW4gcHJpbnRlZCB0ZXh0LiAgIAorICogVGhlIEdyYXBoaWNBdHRyaWJ1dGUgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgYW4gb3Bwb3J0dW5pdHkgdG8gaW5zZXJ0CisgKiBncmFwaGljYWwgZWxlbWVudHMgaW4gcHJpbnRlZCB0ZXh0LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEdyYXBoaWNBdHRyaWJ1dGUgewogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUT1BfQUxJR05NRU5UIGluZGljYXRlcyB1c2luZyB0aGUgdG9wIGxpbmUgdG8gCi0gICAgICogY2FsY3VsYXRlIHBsYWNlbWVudCBvZiBncmFwaGljcy4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVE9QX0FMSUdOTUVOVCBpbmRpY2F0ZXMgdXNpbmcgdGhlIHRvcCBsaW5lIHRvIGNhbGN1bGF0ZQorICAgICAqIHBsYWNlbWVudCBvZiBncmFwaGljcy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT1BfQUxJR05NRU5UID0gLTE7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IEJPVFRPTV9BTElHTk1FTlQgaW5kaWNhdGVzIHVzaW5nIHRoZSBib3R0b20gbGluZSB0byAKLSAgICAgKiBjYWxjdWxhdGUgcGxhY2VtZW50IG9mIGdyYXBoaWNzLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgQk9UVE9NX0FMSUdOTUVOVCBpbmRpY2F0ZXMgdXNpbmcgdGhlIGJvdHRvbSBsaW5lIHRvCisgICAgICogY2FsY3VsYXRlIHBsYWNlbWVudCBvZiBncmFwaGljcy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCT1RUT01fQUxJR05NRU5UID0gLTI7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFJPTUFOX0JBU0VMSU5FIGluZGljYXRlcyB0aGUgcGxhY2VtZW50IG9mIHRoZSByb21hbiAKLSAgICAgKiBiYXNlbGluZSB3aXRoIHJlc3BlY3QgdG8gdGhlIGdyYXBoaWNzIG9yaWdpbi4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgUk9NQU5fQkFTRUxJTkUgaW5kaWNhdGVzIHRoZSBwbGFjZW1lbnQgb2YgdGhlIHJvbWFuIGJhc2VsaW5lCisgICAgICogd2l0aCByZXNwZWN0IHRvIHRoZSBncmFwaGljcyBvcmlnaW4uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUk9NQU5fQkFTRUxJTkUgPSAwOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBDRU5URVJfQkFTRUxJTkUgaW5kaWNhdGVzIHRoZSBwbGFjZW1lbnQgb2YgdGhlIGNlbnRlciAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgQ0VOVEVSX0JBU0VMSU5FIGluZGljYXRlcyB0aGUgcGxhY2VtZW50IG9mIHRoZSBjZW50ZXIKICAgICAgKiBiYXNlbGluZSB3aXRoIHJlc3BlY3QgdG8gdGhlIGdyYXBoaWNzIG9yaWdpbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDRU5URVJfQkFTRUxJTkUgPSAxOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBIQU5HSU5HX0JBU0VMSU5FIGluZGljYXRlcyB0aGUgcGxhY2VtZW50IG9mIHRoZSBoYW5naW5nIAotICAgICAqIGJhc2VsaW5lIHdpdGggcmVzcGVjdCB0byB0aGUgZ3JhcGhpY3Mgb3JpZ2luLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgSEFOR0lOR19CQVNFTElORSBpbmRpY2F0ZXMgdGhlIHBsYWNlbWVudCBvZiB0aGUgaGFuZ2luZworICAgICAqIGJhc2VsaW5lIHdpdGggcmVzcGVjdCB0byB0aGUgZ3JhcGhpY3Mgb3JpZ2luLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhBTkdJTkdfQkFTRUxJTkUgPSAyOwogCiAgICAgLy8gdGhlIGFsaWdubWVudCBvZiB0aGlzIEdyYXBoaWNBdHRyaWJ1dGUKLSAgICAvKiogVGhlIGFsaWdubWVudC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgYWxpZ25tZW50LgorICAgICAqLwogICAgIHByaXZhdGUgaW50IGFsaWdubWVudDsKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBncmFwaGljIGF0dHJpYnV0ZSB3aXRoIHRoZSBzcGVjaWZpZWQgYWxpZ25tZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBhbGlnbiB0aGUgc3BlY2lmaWVkIGFsaWdubWVudC4KKyAgICAgKiBAcGFyYW0gYWxpZ24KKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgYWxpZ25tZW50LgogICAgICAqLwogICAgIHByb3RlY3RlZCBHcmFwaGljQXR0cmlidXRlKGludCBhbGlnbikgewogICAgICAgICBpZiAoKGFsaWduIDwgQk9UVE9NX0FMSUdOTUVOVCkgfHwgKGFsaWduID4gSEFOR0lOR19CQVNFTElORSkpIHsKQEAgLTgxLDE2ICs4NywxOSBAQAogICAgIC8qKgogICAgICAqIERyYXdzIHRoZSBHcmFwaGljQXR0cmlidXRlIGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIGdyYXBoaWNzIHRoZSBHcmFwaGljcy4KLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIEdyYXBoaWNBdHRyaWJ1dGUgbG9jYXRpb24uCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiBHcmFwaGljQXR0cmlidXRlIGxvY2F0aW9uLgorICAgICAqIEBwYXJhbSBncmFwaGljcworICAgICAqICAgICAgICAgICAgdGhlIEdyYXBoaWNzLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIEdyYXBoaWNBdHRyaWJ1dGUgbG9jYXRpb24uCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgR3JhcGhpY0F0dHJpYnV0ZSBsb2NhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBkcmF3KEdyYXBoaWNzMkQgZ3JhcGhpY3MsIGZsb2F0IHgsIGZsb2F0IHkpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgR3JhcGhpY0F0dHJpYnV0ZSdzIGFkdmFuY2UuIEl0J3MgdGhlIGRpc3RhbmNlIGZyb20gdGhlIHBvaW50IAotICAgICAqIGF0IHdoaWNoIHRoZSBncmFwaGljIGlzIHJlbmRlcmVkIGFuZCB0aGUgcG9pbnQgd2hlcmUgdGhlIG5leHQgY2hhcmFjdGVyIAotICAgICAqIG9yIGdyYXBoaWMgaXMgcmVuZGVyZWQuCisgICAgICogR2V0cyB0aGUgR3JhcGhpY0F0dHJpYnV0ZSdzIGFkdmFuY2UuIEl0J3MgdGhlIGRpc3RhbmNlIGZyb20gdGhlIHBvaW50IGF0CisgICAgICogd2hpY2ggdGhlIGdyYXBoaWMgaXMgcmVuZGVyZWQgYW5kIHRoZSBwb2ludCB3aGVyZSB0aGUgbmV4dCBjaGFyYWN0ZXIgb3IKKyAgICAgKiBncmFwaGljIGlzIHJlbmRlcmVkLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIEdyYXBoaWNBdHRyaWJ1dGUncyBhZHZhbmNlLgogICAgICAqLwpAQCAtMTM5LDU4ICsxNDgsMzIgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBHbHlwaEp1c3RpZmljYXRpb25JbmZvIG9mIHRoaXMgR3JhcGhpY0F0dHJpYnV0ZS4KICAgICAgKi8KICAgICBwdWJsaWMgR2x5cGhKdXN0aWZpY2F0aW9uSW5mbyBnZXRKdXN0aWZpY2F0aW9uSW5mbygpIHsKLSAgICAgICAgCi0gICAgICAgIC8qIERlZmF1bHQgaW1wbGVtZW50YXRpb24uCi0gICAgICAgICAqIFNpbmNlIGRvY3VtZW50YXRpb24gZG9lc24ndCBkZXNjcmliZSBkZWZhdWx0IHZhbHVlcywKLSAgICAgICAgICogdGhleSB3ZXJlIGNhbGN1bGF0ZWQgYmFzZWQgb24gMS41IHJlbGVhc2UgCi0gICAgICAgICAqIGJlaGF2aW9yIGFuZCBjYW4gYmUgb2J0YWluZWQgdXNpbmcgbmV4dCB0ZXN0IHNhbXBsZToKLSAgICAgICAgICogCi0gICAgICAgICAqICAgIC8vIENyZWF0ZSBHcmFwaGljQXR0cmlidXRlIGNsYXNzIGltcGxlbWVudGF0aW9uCi0gICAgICAgICAqICAgIHB1YmxpYyBjbGFzcyBNeUdyYXBoaWNBdHRyaWJ1dGUgZXh0ZW5kcyBHcmFwaGljQXR0cmlidXRlIHsKLSAgICAgICAgICogICAgICAgIHByb3RlY3RlZCBNeUdyYXBoaWNBdHRyaWJ1dGUoaW50IGFsaWduKSB7Ci0gICAgICAgICAqICAgICAgICAgICAgc3VwZXIoYWxpZ24pOwotICAgICAgICAgKiAgICAgICAgfQotICAgICAgICAgKgotICAgICAgICAgKiAgICAgICAgcHVibGljIGZsb2F0IGdldERlc2NlbnQoKSB7Ci0gICAgICAgICAqICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICogICAgICAgIH0KLSAgICAgICAgICoKLSAgICAgICAgICogICAgICAgIHB1YmxpYyBmbG9hdCBnZXRBZHZhbmNlKCkgewotICAgICAgICAgKiAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAqICAgICAgICB9Ci0gICAgICAgICAqCi0gICAgICAgICAqICAgICAgICBwdWJsaWMgdm9pZCBkcmF3KEdyYXBoaWNzMkQgZzIsIGZsb2F0IHgsIGZsb2F0IHkpIHsKLSAgICAgICAgICogICAgICAgIH0KLSAgICAgICAgICoKLSAgICAgICAgICogICAgICAgIHB1YmxpYyBmbG9hdCBnZXRBc2NlbnQoKSB7Ci0gICAgICAgICAqICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAqICAgICAgICB9Ci0gICAgICAgICAqICAgIH0KLSAgICAgICAgICoKLSAgICAgICAgICogICAgTXlHcmFwaGljQXR0cmlidXRlIG15R0EgPSBnYXQubmV3IE15R3JhcGhpY0F0dHJpYnV0ZSgwKTsKLSAgICAgICAgICogICAgLy8gcHJpbnQganVzdGlmaWNhdGlvbiBwYXJhbWV0ZXJzCi0gICAgICAgICAqICAgIFN5c3RlbS5vdXQucHJpbnRsbihteUdBLmdldEp1c3RpZmljYXRpb25JbmZvKCkuZ3Jvd0Fic29yYik7Ci0gICAgICAgICAqICAgIFN5c3RlbS5vdXQucHJpbnRsbihteUdBLmdldEp1c3RpZmljYXRpb25JbmZvKCkuc2hyaW5rQWJzb3JiKTsKLSAgICAgICAgICogICAgU3lzdGVtLm91dC5wcmludGxuKG15R0EuZ2V0SnVzdGlmaWNhdGlvbkluZm8oKS5ncm93TGVmdExpbWl0KTsKLSAgICAgICAgICogICAgU3lzdGVtLm91dC5wcmludGxuKG15R0EuZ2V0SnVzdGlmaWNhdGlvbkluZm8oKS5ncm93UHJpb3JpdHkpOwotICAgICAgICAgKiAgICBTeXN0ZW0ub3V0LnByaW50bG4obXlHQS5nZXRKdXN0aWZpY2F0aW9uSW5mbygpLmdyb3dSaWdodExpbWl0KTsKLSAgICAgICAgICogICAgU3lzdGVtLm91dC5wcmludGxuKG15R0EuZ2V0SnVzdGlmaWNhdGlvbkluZm8oKS5zaHJpbmtMZWZ0TGltaXQpOwotICAgICAgICAgKiAgICBTeXN0ZW0ub3V0LnByaW50bG4obXlHQS5nZXRKdXN0aWZpY2F0aW9uSW5mbygpLnNocmlua1ByaW9yaXR5KTsKLSAgICAgICAgICogICAgU3lzdGVtLm91dC5wcmludGxuKG15R0EuZ2V0SnVzdGlmaWNhdGlvbkluZm8oKS5zaHJpbmtSaWdodExpbWl0KTsKLSAgICAgICAgICogICAgU3lzdGVtLm91dC5wcmludGxuKG15R0EuZ2V0SnVzdGlmaWNhdGlvbkluZm8oKS53ZWlnaHQpOworCisgICAgICAgIC8qCisgICAgICAgICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24uIFNpbmNlIGRvY3VtZW50YXRpb24gZG9lc24ndCBkZXNjcmliZSBkZWZhdWx0CisgICAgICAgICAqIHZhbHVlcywgdGhleSB3ZXJlIGNhbGN1bGF0ZWQgYmFzZWQgb24gMS41IHJlbGVhc2UgYmVoYXZpb3IgYW5kIGNhbiBiZQorICAgICAgICAgKiBvYnRhaW5lZCB1c2luZyBuZXh0IHRlc3Qgc2FtcGxlOiAvLyBDcmVhdGUgR3JhcGhpY0F0dHJpYnV0ZSBjbGFzcworICAgICAgICAgKiBpbXBsZW1lbnRhdGlvbiBwdWJsaWMgY2xhc3MgTXlHcmFwaGljQXR0cmlidXRlIGV4dGVuZHMKKyAgICAgICAgICogR3JhcGhpY0F0dHJpYnV0ZSB7IHByb3RlY3RlZCBNeUdyYXBoaWNBdHRyaWJ1dGUoaW50IGFsaWduKSB7CisgICAgICAgICAqIHN1cGVyKGFsaWduKTsgfSBwdWJsaWMgZmxvYXQgZ2V0RGVzY2VudCgpIHsgcmV0dXJuIDA7IH0gcHVibGljIGZsb2F0CisgICAgICAgICAqIGdldEFkdmFuY2UoKSB7IHJldHVybiAxOyB9IHB1YmxpYyB2b2lkIGRyYXcoR3JhcGhpY3MyRCBnMiwgZmxvYXQgeCwKKyAgICAgICAgICogZmxvYXQgeSkgeyB9IHB1YmxpYyBmbG9hdCBnZXRBc2NlbnQoKSB7IHJldHVybiAwOyB9IH0KKyAgICAgICAgICogTXlHcmFwaGljQXR0cmlidXRlIG15R0EgPSBnYXQubmV3IE15R3JhcGhpY0F0dHJpYnV0ZSgwKTsgLy8gcHJpbnQKKyAgICAgICAgICoganVzdGlmaWNhdGlvbiBwYXJhbWV0ZXJzCisgICAgICAgICAqIFN5c3RlbS5vdXQucHJpbnRsbihteUdBLmdldEp1c3RpZmljYXRpb25JbmZvKCkuZ3Jvd0Fic29yYik7CisgICAgICAgICAqIFN5c3RlbS5vdXQucHJpbnRsbihteUdBLmdldEp1c3RpZmljYXRpb25JbmZvKCkuc2hyaW5rQWJzb3JiKTsKKyAgICAgICAgICogU3lzdGVtLm91dC5wcmludGxuKG15R0EuZ2V0SnVzdGlmaWNhdGlvbkluZm8oKS5ncm93TGVmdExpbWl0KTsKKyAgICAgICAgICogU3lzdGVtLm91dC5wcmludGxuKG15R0EuZ2V0SnVzdGlmaWNhdGlvbkluZm8oKS5ncm93UHJpb3JpdHkpOworICAgICAgICAgKiBTeXN0ZW0ub3V0LnByaW50bG4obXlHQS5nZXRKdXN0aWZpY2F0aW9uSW5mbygpLmdyb3dSaWdodExpbWl0KTsKKyAgICAgICAgICogU3lzdGVtLm91dC5wcmludGxuKG15R0EuZ2V0SnVzdGlmaWNhdGlvbkluZm8oKS5zaHJpbmtMZWZ0TGltaXQpOworICAgICAgICAgKiBTeXN0ZW0ub3V0LnByaW50bG4obXlHQS5nZXRKdXN0aWZpY2F0aW9uSW5mbygpLnNocmlua1ByaW9yaXR5KTsKKyAgICAgICAgICogU3lzdGVtLm91dC5wcmludGxuKG15R0EuZ2V0SnVzdGlmaWNhdGlvbkluZm8oKS5zaHJpbmtSaWdodExpbWl0KTsKKyAgICAgICAgICogU3lzdGVtLm91dC5wcmludGxuKG15R0EuZ2V0SnVzdGlmaWNhdGlvbkluZm8oKS53ZWlnaHQpOwogICAgICAgICAgKi8KICAgICAgICAgZmxvYXQgYWR2YW5jZSA9IGdldEFkdmFuY2UoKTsKLSAgICAgICAgcmV0dXJuIG5ldyBHbHlwaEp1c3RpZmljYXRpb25JbmZvKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2x5cGhKdXN0aWZpY2F0aW9uSW5mby5QUklPUklUWV9JTlRFUkNIQVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlIC8gMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UgLyAzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbHlwaEp1c3RpZmljYXRpb25JbmZvLlBSSU9SSVRZX1dISVRFU1BBQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgIHJldHVybiBuZXcgR2x5cGhKdXN0aWZpY2F0aW9uSW5mbyhhZHZhbmNlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICBHbHlwaEp1c3RpZmljYXRpb25JbmZvLlBSSU9SSVRZX0lOVEVSQ0hBUiwgYWR2YW5jZSAvIDMsIGFkdmFuY2UgLyAzLCBmYWxzZSwKKyAgICAgICAgICAgICAgICBHbHlwaEp1c3RpZmljYXRpb25JbmZvLlBSSU9SSVRZX1dISVRFU1BBQ0UsIDAsIDApOwogICAgIH0KIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZm9udC9JbWFnZUdyYXBoaWNBdHRyaWJ1dGUuamF2YSBiL2F3dC9qYXZhL2F3dC9mb250L0ltYWdlR3JhcGhpY0F0dHJpYnV0ZS5qYXZhCmluZGV4IDQxZjkwYjguLmQ2ZDQ3NTggMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9mb250L0ltYWdlR3JhcGhpY0F0dHJpYnV0ZS5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9mb250L0ltYWdlR3JhcGhpY0F0dHJpYnV0ZS5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIElseWEgUy4gT2tvbWluCiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5mb250OwogCiBpbXBvcnQgamF2YS5hd3QuR3JhcGhpY3MyRDsKQEAgLTI3LDQ0ICsyOCw1NyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5taXNjLkhhc2hDb2RlOwogCiAvKioKLSAqIFRoZSBJbWFnZUdyYXBoaWNBdHRyaWJ1dGUgY2xhc3MgcHJvdmlkZXMgYW4gb3Bwb3J0dW5pdHkgdG8gaW5zZXJ0IAotICogaW1hZ2VzIHRvIGEgdGV4dC4KKyAqIFRoZSBJbWFnZUdyYXBoaWNBdHRyaWJ1dGUgY2xhc3MgcHJvdmlkZXMgYW4gb3Bwb3J0dW5pdHkgdG8gaW5zZXJ0IGltYWdlcyB0byBhCisgKiB0ZXh0LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEltYWdlR3JhcGhpY0F0dHJpYnV0ZSBleHRlbmRzIEdyYXBoaWNBdHRyaWJ1dGUgewogCiAgICAgLy8gSW1hZ2Ugb2JqZWN0IHJlbmRlcmVkIGJ5IHRoaXMgSW1hZ2VHcmFwaGljQXR0cmlidXRlCi0gICAgLyoqIFRoZSBpbWFnZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgaW1hZ2UuCisgICAgICovCiAgICAgcHJpdmF0ZSBJbWFnZSBmSW1hZ2U7CiAKICAgICAvLyBYIGNvb3JkaW5hdGUgb2YgdGhlIG9yaWdpbiBwb2ludAotICAgIC8qKiBUaGUgb3JpZ2luIHguICovCisgICAgLyoqCisgICAgICogVGhlIG9yaWdpbiB4LgorICAgICAqLwogICAgIHByaXZhdGUgZmxvYXQgZk9yaWdpblg7CiAKICAgICAvLyBZIGNvb3JkaW5hdGUgb2YgdGhlIG9yaWdpbiBwb2ludAotICAgIC8qKiBUaGUgb3JpZ2luIHkuICovCisgICAgLyoqCisgICAgICogVGhlIG9yaWdpbiB5LgorICAgICAqLwogICAgIHByaXZhdGUgZmxvYXQgZk9yaWdpblk7CiAKICAgICAvLyB0aGUgd2lkdGggb2YgdGhlIGltYWdlIG9iamVjdAotICAgIC8qKiBUaGUgaW1nIHdpZHRoLiAqLworICAgIC8qKgorICAgICAqIFRoZSBpbWcgd2lkdGguCisgICAgICovCiAgICAgcHJpdmF0ZSBmbG9hdCBmSW1nV2lkdGg7CiAKICAgICAvLyB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZSBvYmplY3QKLSAgICAvKiogVGhlIGltZyBoZWlnaHQuICovCisgICAgLyoqCisgICAgICogVGhlIGltZyBoZWlnaHQuCisgICAgICovCiAgICAgcHJpdmF0ZSBmbG9hdCBmSW1nSGVpZ2h0OwogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEltYWdlR3JhcGhpY0F0dHJpYnV0ZSB3aXRoIHRoZSBzcGVjaWZpZWQgaW1hZ2UsCiAgICAgICogYWxpZ25tZW50IGFuZCBvcmlnaW5zLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZSB0aGUgSW1hZ2UgdG8gYmUgcmVuZGVyZWQgYnkgSW1hZ2VHcmFwaGljQXR0cmlidXRlLgotICAgICAqIEBwYXJhbSBhbGlnbm1lbnQgdGhlIGFsaWdubWVudCBvZiB0aGUgSW1hZ2VHcmFwaGljQXR0cmlidXRlLgotICAgICAqIEBwYXJhbSBvcmlnaW5YIHRoZSBvcmlnaW4gWCBjb29yZGluYXRlIGluIHRoZSBpbWFnZSBvZgotICAgICAqIEltYWdlR3JhcGhpY0F0dHJpYnV0ZS4gIAotICAgICAqIEBwYXJhbSBvcmlnaW5ZIHRoZSBvcmlnaW4gWSBjb29yZGluYXRlIGluIHRoZSBpbWFnZSBvZgotICAgICAqIEltYWdlR3JhcGhpY0F0dHJpYnV0ZS4gIAorICAgICAqIEBwYXJhbSBpbWFnZQorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlIHRvIGJlIHJlbmRlcmVkIGJ5IEltYWdlR3JhcGhpY0F0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gYWxpZ25tZW50CisgICAgICogICAgICAgICAgICB0aGUgYWxpZ25tZW50IG9mIHRoZSBJbWFnZUdyYXBoaWNBdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIG9yaWdpblgKKyAgICAgKiAgICAgICAgICAgIHRoZSBvcmlnaW4gWCBjb29yZGluYXRlIGluIHRoZSBpbWFnZSBvZiBJbWFnZUdyYXBoaWNBdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIG9yaWdpblkKKyAgICAgKiAgICAgICAgICAgIHRoZSBvcmlnaW4gWSBjb29yZGluYXRlIGluIHRoZSBpbWFnZSBvZiBJbWFnZUdyYXBoaWNBdHRyaWJ1dGUuCiAgICAgICovCi0gICAgcHVibGljIEltYWdlR3JhcGhpY0F0dHJpYnV0ZShJbWFnZSBpbWFnZSwgaW50IGFsaWdubWVudCwgZmxvYXQgb3JpZ2luWCwgCi0gICAgICAgICAgICBmbG9hdCBvcmlnaW5ZKSB7CisgICAgcHVibGljIEltYWdlR3JhcGhpY0F0dHJpYnV0ZShJbWFnZSBpbWFnZSwgaW50IGFsaWdubWVudCwgZmxvYXQgb3JpZ2luWCwgZmxvYXQgb3JpZ2luWSkgewogICAgICAgICBzdXBlcihhbGlnbm1lbnQpOwogCiAgICAgICAgIHRoaXMuZkltYWdlID0gaW1hZ2U7CkBAIC04MCw4ICs5NCwxMCBAQAogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJbWFnZUdyYXBoaWNBdHRyaWJ1dGUgd2l0aCB0aGUgc3BlY2lmaWVkIGltYWdlIGFuZAogICAgICAqIGFsaWdubWVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1hZ2UgdGhlIEltYWdlIHRvIGJlIHJlbmRlcmVkIGJ5IEltYWdlR3JhcGhpY0F0dHJpYnV0ZS4KLSAgICAgKiBAcGFyYW0gYWxpZ25tZW50IHRoZSBhbGlnbm1lbnQgb2YgdGhlIEltYWdlR3JhcGhpY0F0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gaW1hZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZSB0byBiZSByZW5kZXJlZCBieSBJbWFnZUdyYXBoaWNBdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIGFsaWdubWVudAorICAgICAqICAgICAgICAgICAgdGhlIGFsaWdubWVudCBvZiB0aGUgSW1hZ2VHcmFwaGljQXR0cmlidXRlLgogICAgICAqLwogICAgIHB1YmxpYyBJbWFnZUdyYXBoaWNBdHRyaWJ1dGUoSW1hZ2UgaW1hZ2UsIGludCBhbGlnbm1lbnQpIHsKICAgICAgICAgdGhpcyhpbWFnZSwgYWxpZ25tZW50LCAwLCAwKTsKQEAgLTEwNSwxMCArMTIxLDEwIEBACiAgICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBJbWFnZUdyYXBoaWNBdHRyaWJ1dGUgb2JqZWN0IHdpdGggdGhpcwogICAgICAqIEltYWdlR3JhcGhpY0F0dHJpYnV0ZSBvYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIGlnYSB0aGUgSW1hZ2VHcmFwaGljQXR0cmlidXRlIG9iamVjdCB0byBiZSBjb21wYXJlZC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaWdhCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VHcmFwaGljQXR0cmlidXRlIG9iamVjdCB0byBiZSBjb21wYXJlZC4KICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgSW1hZ2VHcmFwaGljQXR0cmlidXRlIG9iamVjdCBpcyBlcXVhbCB0bwotICAgICAqIHRoaXMgSW1hZ2VHcmFwaGljQXR0cmlidXRlIG9iamVjdCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqICAgICAgICAgdGhpcyBJbWFnZUdyYXBoaWNBdHRyaWJ1dGUgb2JqZWN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKEltYWdlR3JhcGhpY0F0dHJpYnV0ZSBpZ2EpIHsKICAgICAgICAgaWYgKGlnYSA9PSBudWxsKSB7CkBAIC0xMTksMjYgKzEzNSwyMyBAQAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gKGZPcmlnaW5YID09IGlnYS5mT3JpZ2luWCAmJgotICAgICAgICAgICAgICAgIGZPcmlnaW5ZID09IGlnYS5mT3JpZ2luWSAmJgotICAgICAgICAgICAgICAgIGdldEFsaWdubWVudCgpID09IGlnYS5nZXRBbGlnbm1lbnQoKSAmJgotICAgICAgICAgICAgICAgIGZJbWFnZS5lcXVhbHMoaWdhLmZJbWFnZSkpOworICAgICAgICByZXR1cm4gKGZPcmlnaW5YID09IGlnYS5mT3JpZ2luWCAmJiBmT3JpZ2luWSA9PSBpZ2EuZk9yaWdpblkKKyAgICAgICAgICAgICAgICAmJiBnZXRBbGlnbm1lbnQoKSA9PSBpZ2EuZ2V0QWxpZ25tZW50KCkgJiYgZkltYWdlLmVxdWFscyhpZ2EuZkltYWdlKSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBPYmplY3Qgd2l0aCB0aGlzIEltYWdlR3JhcGhpY0F0dHJpYnV0ZSBvYmplY3QuCi0gICAgICogIAotICAgICAqIEBwYXJhbSBvYmogdGhlIE9iamVjdCB0byBiZSBjb21wYXJlZC4KICAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2JqCisgICAgICogICAgICAgICAgICB0aGUgT2JqZWN0IHRvIGJlIGNvbXBhcmVkLgogICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCBPYmplY3QgaXMgZXF1YWwgdG8gdGhpcwotICAgICAqIEltYWdlR3JhcGhpY0F0dHJpYnV0ZSBvYmplY3QsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiAgICAgICAgIEltYWdlR3JhcGhpY0F0dHJpYnV0ZSBvYmplY3QsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGVxdWFscygoSW1hZ2VHcmFwaGljQXR0cmlidXRlKSBvYmopOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZXF1YWxzKChJbWFnZUdyYXBoaWNBdHRyaWJ1dGUpb2JqKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCkBAIC0xNDksOSArMTYyLDYgQEAKICAgICAgICAgZzIuZHJhd0ltYWdlKGZJbWFnZSwgKGludCkoeCAtIGZPcmlnaW5YKSwgKGludCkoeSAtIGZPcmlnaW5ZKSwgbnVsbCk7CiAgICAgfQogCi0gICAgLyoqIAotICAgICAqIEBzZWUgamF2YS5hd3QuZm9udC5HcmFwaGljQXR0cmlidXRlI2dldEFkdmFuY2UoKQotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmbG9hdCBnZXRBZHZhbmNlKCkgewogICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgZkltZ1dpZHRoIC0gZk9yaWdpblgpOwpAQCAtMTY3LDEzICsxNzcsOSBAQAogICAgICAgICByZXR1cm4gbmV3IFJlY3RhbmdsZTJELkZsb2F0KC1mT3JpZ2luWCwgLWZPcmlnaW5ZLCBmSW1nV2lkdGgsIGZJbWdIZWlnaHQpOwogICAgIH0KIAotICAgIC8qKiAKLSAgICAgKiBAc2VlIGphdmEuYXd0LmZvbnQuR3JhcGhpY0F0dHJpYnV0ZSNnZXREZXNjZW50KCkKLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZmxvYXQgZ2V0RGVzY2VudCgpIHsKICAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIGZJbWdIZWlnaHQgLSBmT3JpZ2luWSk7CiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9mb250L0xpbmVCcmVha01lYXN1cmVyLmphdmEgYi9hd3QvamF2YS9hd3QvZm9udC9MaW5lQnJlYWtNZWFzdXJlci5qYXZhCmluZGV4IGVmY2U2MTUuLjQ4MDAwOTMgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9mb250L0xpbmVCcmVha01lYXN1cmVyLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ZvbnQvTGluZUJyZWFrTWVhc3VyZXIuamF2YQpAQCAtMjEsNjQgKzIxLDY5IEBACiAKIHBhY2thZ2UgamF2YS5hd3QuZm9udDsKIAotaW1wb3J0IGphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3I7Ci0vLz8/P0FXVDogaW1wb3J0IGphdmEudGV4dC5CcmVha0l0ZXJhdG9yOworaW1wb3J0IGphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3I7IC8vPz8/QVdUOiBpbXBvcnQgamF2YS50ZXh0LkJyZWFrSXRlcmF0b3I7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBUaGUgY2xhc3MgTGluZUJyZWFrTWVhc3VyZXIgcHJvdmlkZXMgbWV0aG9kcyB0byBtZWFzdXJlIHRoZSBncmFwaGljYWwgCi0gKiByZXByZXNlbnRhdGlvbiBvZiBhIHRleHQgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHdoZXJlIHRvIGFkZCBsaW5lIAotICogYnJlYWtzIHNvIHRoZSByZXN1bHRpbmcgbGluZSBvZiB0ZXh0IGZpdHMgaXRzIHdyYXBwaW5nIHdpZHRoLiAKLSAqIFRoZSB3cmFwcGluZyB3aWR0aCBkZWZpbmVzIHRoZSB2aXN1YWwgd2lkdGggb2YgdGhlIHBhcmFncmFwaC4KKyAqIFRoZSBjbGFzcyBMaW5lQnJlYWtNZWFzdXJlciBwcm92aWRlcyBtZXRob2RzIHRvIG1lYXN1cmUgdGhlIGdyYXBoaWNhbAorICogcmVwcmVzZW50YXRpb24gb2YgYSB0ZXh0IGluIG9yZGVyIHRvIGRldGVybWluZSB3aGVyZSB0byBhZGQgbGluZSBicmVha3Mgc28KKyAqIHRoZSByZXN1bHRpbmcgbGluZSBvZiB0ZXh0IGZpdHMgaXRzIHdyYXBwaW5nIHdpZHRoLiBUaGUgd3JhcHBpbmcgd2lkdGgKKyAqIGRlZmluZXMgdGhlIHZpc3VhbCB3aWR0aCBvZiB0aGUgcGFyYWdyYXBoLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIExpbmVCcmVha01lYXN1cmVyIHsKLSAgICAKLSAgICAvKiogVGhlIHRtLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHRtLgorICAgICAqLwogICAgIHByaXZhdGUgVGV4dE1lYXN1cmVyIHRtID0gbnVsbDsKLSAgICAvLz8/P0FXVCBwcml2YXRlIEJyZWFrSXRlcmF0b3IgYmkgPSBudWxsOwotICAgIC8qKiBUaGUgcG9zaXRpb24uICovCisKKyAgICAvLyA/Pz9BV1QgcHJpdmF0ZSBCcmVha0l0ZXJhdG9yIGJpID0gbnVsbDsKKyAgICAvKioKKyAgICAgKiBUaGUgcG9zaXRpb24uCisgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgcG9zaXRpb24gPSAwOwotICAgIAotICAgIC8qKiBUaGUgbWF4cG9zLiAqLworCisgICAgLyoqCisgICAgICogVGhlIG1heHBvcy4KKyAgICAgKi8KICAgICBpbnQgbWF4cG9zID0gMDsKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBMaW5lQnJlYWtNZWFzdXJlciBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgdGV4dC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGV4dCB0aGUgQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yIG9iamVjdCB3aGljaCBjb250YWlucwotICAgICAqIHRleHQgd2l0aCBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLgotICAgICAqIEBwYXJhbSBmcmMgdGhlIEZvbnRSZW5kZXJDb250ZXh0IHJlcHJlc2VudGVkIGluZm9ybWF0aW9uCi0gICAgICogYWJvdXQgZ3JhcGhpYyBkZXZpY2UuCisgICAgICogQHBhcmFtIHRleHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3Igb2JqZWN0IHdoaWNoIGNvbnRhaW5zIHRleHQKKyAgICAgKiAgICAgICAgICAgIHdpdGggYXQgbGVhc3Qgb25lIGNoYXJhY3Rlci4KKyAgICAgKiBAcGFyYW0gZnJjCisgICAgICogICAgICAgICAgICB0aGUgRm9udFJlbmRlckNvbnRleHQgcmVwcmVzZW50ZWQgaW5mb3JtYXRpb24gYWJvdXQgZ3JhcGhpYworICAgICAqICAgICAgICAgICAgZGV2aWNlLgogICAgICAqLwogICAgIHB1YmxpYyBMaW5lQnJlYWtNZWFzdXJlcihBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IgdGV4dCwgRm9udFJlbmRlckNvbnRleHQgZnJjKSB7Ci0gICAgICAgIC8vPz8/QVdUOiB0aGlzKHRleHQsIEJyZWFrSXRlcmF0b3IuZ2V0TGluZUluc3RhbmNlKCksIGZyYyk7CisgICAgICAgIC8vID8/P0FXVDogdGhpcyh0ZXh0LCBCcmVha0l0ZXJhdG9yLmdldExpbmVJbnN0YW5jZSgpLCBmcmMpOwogICAgIH0KIAotICAgIC8qID8/P0FXVAotICAgIHB1YmxpYyBMaW5lQnJlYWtNZWFzdXJlcigKLSAgICAgICAgICAgIEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciB0ZXh0LAotICAgICAgICAgICAgQnJlYWtJdGVyYXRvciBiaSwKLSAgICAgICAgICAgIEZvbnRSZW5kZXJDb250ZXh0IGZyYwotICAgICkgewotICAgICAgICB0bSA9IG5ldyBUZXh0TWVhc3VyZXIodGV4dCwgZnJjKTsKLSAgICAgICAgdGhpcy5iaSA9IGJpOwotICAgICAgICB0aGlzLmJpLnNldFRleHQodGV4dCk7Ci0gICAgICAgIHBvc2l0aW9uID0gdGV4dC5nZXRCZWdpbkluZGV4KCk7Ci0gICAgICAgIG1heHBvcyA9IHRtLmFjaS5nZXRFbmRJbmRleCgpOwotICAgIH0KLSAgICAqLworICAgIC8qCisgICAgICogPz8/QVdUIHB1YmxpYyBMaW5lQnJlYWtNZWFzdXJlciggQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yIHRleHQsCisgICAgICogQnJlYWtJdGVyYXRvciBiaSwgRm9udFJlbmRlckNvbnRleHQgZnJjICkgeyB0bSA9IG5ldyBUZXh0TWVhc3VyZXIodGV4dCwKKyAgICAgKiBmcmMpOyB0aGlzLmJpID0gYmk7IHRoaXMuYmkuc2V0VGV4dCh0ZXh0KTsgcG9zaXRpb24gPQorICAgICAqIHRleHQuZ2V0QmVnaW5JbmRleCgpOyBtYXhwb3MgPSB0bS5hY2kuZ2V0RW5kSW5kZXgoKTsgfQorICAgICAqLwogCiAgICAgLyoqCi0gICAgICogRGVsZXRlcyBhIGNoYXJhY3RlciBmcm9tIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gb2YgdGhlIHRleHQsIAotICAgICAqIHVwZGF0ZXMgdGhpcyBMaW5lQnJlYWtNZWFzdXJlciBvYmplY3QuCisgICAgICogRGVsZXRlcyBhIGNoYXJhY3RlciBmcm9tIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gb2YgdGhlIHRleHQsIHVwZGF0ZXMgdGhpcworICAgICAqIExpbmVCcmVha01lYXN1cmVyIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmV3VGV4dCB0aGUgbmV3IHRleHQuCi0gICAgICogQHBhcmFtIHBvcyB0aGUgcG9zaW9uIG9mIHRoZSBjaGFyYWN0ZXIgd2hpY2ggaXMgZGVsZXRlZC4KKyAgICAgKiBAcGFyYW0gbmV3VGV4dAorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB0ZXh0LgorICAgICAqIEBwYXJhbSBwb3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb3NpdGlvbiBvZiB0aGUgY2hhcmFjdGVyIHdoaWNoIGlzIGRlbGV0ZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZGVsZXRlQ2hhcihBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IgbmV3VGV4dCwgaW50IHBvcykgewogICAgICAgICB0bS5kZWxldGVDaGFyKG5ld1RleHQsIHBvcyk7Ci0gICAgICAgIC8vPz8/QVdUOiBiaS5zZXRUZXh0KG5ld1RleHQpOworICAgICAgICAvLyA/Pz9BV1Q6IGJpLnNldFRleHQobmV3VGV4dCk7CiAKICAgICAgICAgcG9zaXRpb24gPSBuZXdUZXh0LmdldEJlZ2luSW5kZXgoKTsKIApAQCAtODgsMjIgKzkzLDI0IEBACiAgICAgLyoqCiAgICAgICogR2V0cyBjdXJyZW50IHBvc2l0aW9uIG9mIHRoaXMgTGluZUJyZWFrTWVhc3VyZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiBjdXJyZW50IHBvc2l0aW9uIG9mIHRoaXMgTGluZUJyZWFrTWVhc3VyZXIKKyAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoaXMgTGluZUJyZWFrTWVhc3VyZXIKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFBvc2l0aW9uKCkgewogICAgICAgICByZXR1cm4gcG9zaXRpb247CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zZXJ0ZXMgYSBjaGFyYWN0ZXIgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBpbiB0aGUgdGV4dCwgCi0gICAgICogdXBkYXRlcyB0aGlzIExpbmVCcmVha01lYXN1cmVyIG9iamVjdC4KKyAgICAgKiBJbnNlcnRzIGEgY2hhcmFjdGVyIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhlIHRleHQsIHVwZGF0ZXMgdGhpcworICAgICAqIExpbmVCcmVha01lYXN1cmVyIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmV3VGV4dCB0aGUgbmV3IHRleHQuCi0gICAgICogQHBhcmFtIHBvcyB0aGUgcG9zaW9uIG9mIHRoZSBjaGFyYWN0ZXIgd2hpY2ggaXMgaW5zZXJ0ZWQuCisgICAgICogQHBhcmFtIG5ld1RleHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdGV4dC4KKyAgICAgKiBAcGFyYW0gcG9zCisgICAgICogICAgICAgICAgICB0aGUgcG9zaXRpb24gb2YgdGhlIGNoYXJhY3RlciB3aGljaCBpcyBpbnNlcnRlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBpbnNlcnRDaGFyKEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciBuZXdUZXh0LCBpbnQgcG9zKSB7CiAgICAgICAgIHRtLmluc2VydENoYXIobmV3VGV4dCwgcG9zKTsKLS8vICAgICAgPz8/QVdUOiBiaS5zZXRUZXh0KG5ld1RleHQpOworICAgICAgICAvLyA/Pz9BV1Q6IGJpLnNldFRleHQobmV3VGV4dCk7CiAKICAgICAgICAgcG9zaXRpb24gPSBuZXdUZXh0LmdldEJlZ2luSW5kZXgoKTsKIApAQCAtMTExLDIxICsxMTgsMjMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGxpbmUgb2YgdGV4dCwgdXBkYXRlcyBjdXJyZW50IHBvc2l0aW9uIGluIHRoaXMgCisgICAgICogUmV0dXJucyB0aGUgbmV4dCBsaW5lIG9mIHRleHQsIHVwZGF0ZXMgY3VycmVudCBwb3NpdGlvbiBpbiB0aGlzCiAgICAgICogTGluZUJyZWFrTWVhc3VyZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHdyYXBwaW5nV2lkdGggdGhlIG1heGltdW0gdmlzaWJsZSBsaW5lIHdpZHRoLgotICAgICAqIEBwYXJhbSBvZmZzZXRMaW1pdCB0aGUgbGltaXQgcG9pbnQgd2l0aGluZyB0aGUgdGV4dCBpbmRpY2F0aW5nCi0gICAgICogdGhhdCBubyBmdXJ0aGVyIHRleHQgc2hvdWxkIGJlIGluY2x1ZGVkIG9uIHRoZSBsaW5lOyB0aGUgcGFyYWdyYXBoIGJyZWFrLgotICAgICAqIEBwYXJhbSByZXF1aXJlTmV4dFdvcmQgaWYgdHJ1ZSwgbnVsbCBpcyByZXR1cm5lZCAodGhlIGVudGlyZSB3b3JkIGF0IHRoZSBjdXJyZW50IAotICAgICAqIHBvc2l0aW9uIGRvZXMgbm90IGZpdCB3aXRoaW4gdGhlIHdyYXBwaW5nIHdpZHRoKTsgIAotICAgICAqIGlmIGZhbHNlLCBhIHZhbGlkIGxheW91dCBpcyByZXR1cm5lZCB0aGF0IGluY2x1ZGVzIGF0IGxlYXN0IHRoZSAKLSAgICAgKiBjaGFyYWN0ZXIgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV4dCBUZXh0TGF5b3V0IHdoaWNoIGJlZ2lucyBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgCi0gICAgICogcmVwcmVzZW50cyB0aGUgbmV4dCBsaW5lIG9mIHRleHQgd2l0aCB3aWR0aCB3cmFwcGluZ1dpZHRoLCBudWxsIGlzIAotICAgICAqIHJldHVybmVkIGlmIHRoZSBlbnRpcmUgd29yZCBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiBkb2VzIG5vdCBmaXQgd2l0aGluIAotICAgICAqIHRoZSB3cmFwcGluZyB3aWR0aC4KKyAgICAgKiBAcGFyYW0gd3JhcHBpbmdXaWR0aAorICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gdmlzaWJsZSBsaW5lIHdpZHRoLgorICAgICAqIEBwYXJhbSBvZmZzZXRMaW1pdAorICAgICAqICAgICAgICAgICAgdGhlIGxpbWl0IHBvaW50IHdpdGhpbiB0aGUgdGV4dCBpbmRpY2F0aW5nIHRoYXQgbm8gZnVydGhlcgorICAgICAqICAgICAgICAgICAgdGV4dCBzaG91bGQgYmUgaW5jbHVkZWQgb24gdGhlIGxpbmU7IHRoZSBwYXJhZ3JhcGggYnJlYWsuCisgICAgICogQHBhcmFtIHJlcXVpcmVOZXh0V29yZAorICAgICAqICAgICAgICAgICAgaWYgdHJ1ZSwgbnVsbCBpcyByZXR1cm5lZCAodGhlIGVudGlyZSB3b3JkIGF0IHRoZSBjdXJyZW50CisgICAgICogICAgICAgICAgICBwb3NpdGlvbiBkb2VzIG5vdCBmaXQgd2l0aGluIHRoZSB3cmFwcGluZyB3aWR0aCk7IGlmIGZhbHNlLCBhCisgICAgICogICAgICAgICAgICB2YWxpZCBsYXlvdXQgaXMgcmV0dXJuZWQgdGhhdCBpbmNsdWRlcyBhdCBsZWFzdCB0aGUgY2hhcmFjdGVyCisgICAgICogICAgICAgICAgICBhdCB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IFRleHRMYXlvdXQgd2hpY2ggYmVnaW5zIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uIGFuZAorICAgICAqICAgICAgICAgcmVwcmVzZW50cyB0aGUgbmV4dCBsaW5lIG9mIHRleHQgd2l0aCB3aWR0aCB3cmFwcGluZ1dpZHRoLCBudWxsCisgICAgICogICAgICAgICBpcyByZXR1cm5lZCBpZiB0aGUgZW50aXJlIHdvcmQgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gZG9lcyBub3QKKyAgICAgKiAgICAgICAgIGZpdCB3aXRoaW4gdGhlIHdyYXBwaW5nIHdpZHRoLgogICAgICAqLwogICAgIHB1YmxpYyBUZXh0TGF5b3V0IG5leHRMYXlvdXQoZmxvYXQgd3JhcHBpbmdXaWR0aCwgaW50IG9mZnNldExpbWl0LCBib29sZWFuIHJlcXVpcmVOZXh0V29yZCkgewogICAgICAgICBpZiAocG9zaXRpb24gPT0gbWF4cG9zKSB7CkBAIC0xNDUsOCArMTU0LDggQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGxpbmUgb2YgdGV4dC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gd3JhcHBpbmdXaWR0aCB0aGUgbWF4aW11bSB2aXNpYmxlIGxpbmUgd2lkdGguCi0gICAgICogCisgICAgICogQHBhcmFtIHdyYXBwaW5nV2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIHZpc2libGUgbGluZSB3aWR0aC4KICAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGxpbmUgb2YgdGV4dC4KICAgICAgKi8KICAgICBwdWJsaWMgVGV4dExheW91dCBuZXh0TGF5b3V0KGZsb2F0IHdyYXBwaW5nV2lkdGgpIHsKQEAgLTE1Niw4ICsxNjUsOCBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGVuZCBwb3NpdGlvbiBvZiB0aGUgbmV4dCBsaW5lIG9mIHRleHQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHdyYXBwaW5nV2lkdGggdGhlIG1heGltdW0gdmlzaWJsZSBsaW5lIHdpZHRoLgotICAgICAqIAorICAgICAqIEBwYXJhbSB3cmFwcGluZ1dpZHRoCisgICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSB2aXNpYmxlIGxpbmUgd2lkdGguCiAgICAgICogQHJldHVybiB0aGUgZW5kIHBvc2l0aW9uIG9mIHRoZSBuZXh0IGxpbmUgb2YgdGV4dC4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IG5leHRPZmZzZXQoZmxvYXQgd3JhcHBpbmdXaWR0aCkgewpAQCAtMTY3LDIyICsxNzYsMjIgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBlbmQgcG9zaXRpb24gb2YgdGhlIG5leHQgbGluZSBvZiB0ZXh0LgogICAgICAqIAotICAgICAqIEBwYXJhbSB3cmFwcGluZ1dpZHRoIHRoZSBtYXhpbXVtIHZpc2libGUgbGluZSB3aWR0aC4KLSAgICAgKiBAcGFyYW0gb2Zmc2V0TGltaXQgdGhlIGxpbWl0IHBvaW50IHdpdGhpbmcgdGhlIHRleHQgaW5kaWNhdGluZwotICAgICAqIHRoYXQgbm8gZnVydGhlciB0ZXh0IHNob3VsZCBiZSBpbmNsdWRlZCBvbiB0aGUgbGluZTsgdGhlIHBhcmFncmFwaCBicmVhay4KLSAgICAgKiBAcGFyYW0gcmVxdWlyZU5leHRXb3JkIGlmIHRydWUsIHRoZSBjdXJyZW50IHBvc2l0aW9uIGlzIHJldHVybmVkIAotICAgICAqIGlmIHRoZSBlbnRpcmUgbmV4dCB3b3JkIGRvZXMgbm90IGZpdCB3aXRoaW4gd3JhcHBpbmdXaWR0aDsgCi0gICAgICogaWYgZmFsc2UsIHRoZSBvZmZzZXQgcmV0dXJuZWQgaXMgYXQgbGVhc3Qgb25lIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudAotICAgICAqIHBvc2l0aW9uLgotICAgICAqIAorICAgICAqIEBwYXJhbSB3cmFwcGluZ1dpZHRoCisgICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSB2aXNpYmxlIGxpbmUgd2lkdGguCisgICAgICogQHBhcmFtIG9mZnNldExpbWl0CisgICAgICogICAgICAgICAgICB0aGUgbGltaXQgcG9pbnQgd2l0aGluZyB0aGUgdGV4dCBpbmRpY2F0aW5nIHRoYXQgbm8gZnVydGhlcgorICAgICAqICAgICAgICAgICAgdGV4dCBzaG91bGQgYmUgaW5jbHVkZWQgb24gdGhlIGxpbmU7IHRoZSBwYXJhZ3JhcGggYnJlYWsuCisgICAgICogQHBhcmFtIHJlcXVpcmVOZXh0V29yZAorICAgICAqICAgICAgICAgICAgaWYgdHJ1ZSwgdGhlIGN1cnJlbnQgcG9zaXRpb24gaXMgcmV0dXJuZWQgaWYgdGhlIGVudGlyZSBuZXh0CisgICAgICogICAgICAgICAgICB3b3JkIGRvZXMgbm90IGZpdCB3aXRoaW4gd3JhcHBpbmdXaWR0aDsgaWYgZmFsc2UsIHRoZSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHJldHVybmVkIGlzIGF0IGxlYXN0IG9uZSBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgcG9zaXRpb24uCiAgICAgICogQHJldHVybiB0aGUgZW5kIHBvc2l0aW9uIG9mIHRoZSBuZXh0IGxpbmUgb2YgdGV4dC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgb2Zmc2V0TGltaXQgaXMgbGVzcyB0aGFuIAotICAgICAqIHRoZSBjdXJyZW50IHBvc2l0aW9uLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIG9mZnNldExpbWl0IGlzIGxlc3MgdGhhbiB0aGUgY3VycmVudCBwb3NpdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IG5leHRPZmZzZXQoZmxvYXQgd3JhcHBpbmdXaWR0aCwgaW50IG9mZnNldExpbWl0LCBib29sZWFuIHJlcXVpcmVOZXh0V29yZCkgewogICAgICAgICBpZiAob2Zmc2V0TGltaXQgPD0gcG9zaXRpb24pIHsKLSAgICAgICAgICAgIC8vIGF3dC4yMDM9T2Zmc2V0IGxpbWl0IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gY3VycmVudCBwb3NpdGlvbi4gCisgICAgICAgICAgICAvLyBhd3QuMjAzPU9mZnNldCBsaW1pdCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIGN1cnJlbnQgcG9zaXRpb24uCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIwMyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKQEAgLTE5MywyMiArMjAyLDIwIEBACiAgICAgICAgIGludCBicmVha1BvcyA9IHRtLmdldExpbmVCcmVha0luZGV4KHBvc2l0aW9uLCB3cmFwcGluZ1dpZHRoKTsKICAgICAgICAgaW50IGNvcnJlY3RlZFBvcyA9IGJyZWFrUG9zOwogCi0gICAgICAgIC8vIFRoaXMgY2hlY2sgaXMgcmVxdWlyZWQgYmVjYXVzZSBiaS5wcmVjZWRpbmcobWF4cG9zKSB0aHJvd3MgYW4gZXhjZXB0aW9uCi0gICAgICAgIC8qID8/P0FXVAotICAgICAgICBpZiAoYnJlYWtQb3MgPT0gbWF4cG9zKSB7Ci0gICAgICAgICAgICBjb3JyZWN0ZWRQb3MgPSBtYXhwb3M7Ci0gICAgICAgIH0gZWxzZSBpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShiaS5nZXRUZXh0KCkuc2V0SW5kZXgoYnJlYWtQb3MpKSkgewotICAgICAgICAgICAgY29ycmVjdGVkUG9zID0gYmkuZm9sbG93aW5nKGJyZWFrUG9zKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvcnJlY3RlZFBvcyA9IGJpLnByZWNlZGluZyhicmVha1Bvcyk7Ci0gICAgICAgIH0KLSAgICAgICAgKi8KLSAgICAgICAgCisgICAgICAgIC8vIFRoaXMgY2hlY2sgaXMgcmVxdWlyZWQgYmVjYXVzZSBiaS5wcmVjZWRpbmcobWF4cG9zKSB0aHJvd3MgYW4KKyAgICAgICAgLy8gZXhjZXB0aW9uCisgICAgICAgIC8qCisgICAgICAgICAqID8/P0FXVCBpZiAoYnJlYWtQb3MgPT0gbWF4cG9zKSB7IGNvcnJlY3RlZFBvcyA9IG1heHBvczsgfSBlbHNlIGlmCisgICAgICAgICAqIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGJpLmdldFRleHQoKS5zZXRJbmRleChicmVha1BvcykpKSB7CisgICAgICAgICAqIGNvcnJlY3RlZFBvcyA9IGJpLmZvbGxvd2luZyhicmVha1Bvcyk7IH0gZWxzZSB7IGNvcnJlY3RlZFBvcyA9CisgICAgICAgICAqIGJpLnByZWNlZGluZyhicmVha1Bvcyk7IH0KKyAgICAgICAgICovCisKICAgICAgICAgaWYgKHBvc2l0aW9uID49IGNvcnJlY3RlZFBvcykgewogICAgICAgICAgICAgaWYgKHJlcXVpcmVOZXh0V29yZCkgewogICAgICAgICAgICAgICAgIGNvcnJlY3RlZFBvcyA9IHBvc2l0aW9uOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjb3JyZWN0ZWRQb3MgPSBNYXRoLm1heChwb3NpdGlvbisxLCBicmVha1Bvcyk7CisgICAgICAgICAgICAgICAgY29ycmVjdGVkUG9zID0gTWF0aC5tYXgocG9zaXRpb24gKyAxLCBicmVha1Bvcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMjE4LDcgKzIyNSw4IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgbmV3IHBvc2l0aW9uIG9mIHRoaXMgTGluZUJyZWFrTWVhc3VyZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHBvcyB0aGUgbmV3IHBvc2l0aW9uIG9mIHRoaXMgTGluZUJyZWFrTWVhc3VyZXIuCisgICAgICogQHBhcmFtIHBvcworICAgICAqICAgICAgICAgICAgdGhlIG5ldyBwb3NpdGlvbiBvZiB0aGlzIExpbmVCcmVha01lYXN1cmVyLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFBvc2l0aW9uKGludCBwb3MpIHsKICAgICAgICAgaWYgKHRtLmFjaS5nZXRCZWdpbkluZGV4KCkgPiBwb3MgfHwgbWF4cG9zIDwgcG9zKSB7CkBAIC0yMjgsNCArMjM2LDMgQEAKICAgICAgICAgcG9zaXRpb24gPSBwb3M7CiAgICAgfQogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZm9udC9MaW5lTWV0cmljcy5qYXZhIGIvYXd0L2phdmEvYXd0L2ZvbnQvTGluZU1ldHJpY3MuamF2YQppbmRleCAyODU3MTg3Li40YjAzZTVkIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZm9udC9MaW5lTWV0cmljcy5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9mb250L0xpbmVNZXRyaWNzLmphdmEKQEAgLTE4LDIyICsxOCwyNCBAQAogICogQGF1dGhvciBJbHlhIFMuIE9rb21pbgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuZm9udDsKIAogLyoqCi0gKiBUaGUgTGluZU1ldHJpY3MgY2xhc3MgcHJvdmlkZXMgaW5mb3JtYXRpb24gc3VjaCBhcyBjb25jZXJuaW5nIGhvdyB0aGUgdGV4dCAKLSAqIGlzIHBvc2l0aW9uZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBiYXNlIGxpbmUsIHN1Y2ggYXMgYXNjZW50LCBkZXNjZW50LCAKLSAqIGFuZCBsZWFkaW5nLgorICogVGhlIExpbmVNZXRyaWNzIGNsYXNzIHByb3ZpZGVzIGluZm9ybWF0aW9uIHN1Y2ggYXMgY29uY2VybmluZyBob3cgdGhlIHRleHQgaXMKKyAqIHBvc2l0aW9uZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBiYXNlIGxpbmUsIHN1Y2ggYXMgYXNjZW50LCBkZXNjZW50LCBhbmQKKyAqIGxlYWRpbmcuCiAgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTGluZU1ldHJpY3MgewogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgYmFzZWxpbmUgb2Zmc2V0cyBvZiB0aGUgdGV4dCBhY2NvcmRpbmcgdG8gdGhlIAotICAgICAqIHRoZSBiYXNlbGluZSBvZiB0aGlzIHRleHQuCisgICAgICogR2V0cyB0aGUgYmFzZWxpbmUgb2Zmc2V0cyBvZiB0aGUgdGV4dCBhY2NvcmRpbmcgdG8gdGhlIHRoZSBiYXNlbGluZSBvZgorICAgICAqIHRoaXMgdGV4dC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBiYXNlbGluZSBvZmZzZXRzIG9mIHRoZSB0ZXh0IGFjY29yZGluZyB0byB0aGUgCi0gICAgICogdGhlIGJhc2VsaW5lIG9mIHRoaXMgdGV4dC4KKyAgICAgKiBAcmV0dXJuIHRoZSBiYXNlbGluZSBvZmZzZXRzIG9mIHRoZSB0ZXh0IGFjY29yZGluZyB0byB0aGUgdGhlIGJhc2VsaW5lIG9mCisgICAgICogICAgICAgICB0aGlzIHRleHQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGZsb2F0W10gZ2V0QmFzZWxpbmVPZmZzZXRzKCk7CiAKQEAgLTQ1LDExICs0NywxMSBAQAogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TnVtQ2hhcnMoKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGJhc2VsaW5lIGluZGV4LCByZXR1cm5zIG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICAgICAqIGluZGV4OiBST01BTl9CQVNFTElORSwgQ0VOVEVSX0JBU0VMSU5FLCBIQU5HSU5HX0JBU0VMSU5FLgorICAgICAqIEdldHMgdGhlIGJhc2VsaW5lIGluZGV4LCByZXR1cm5zIG9uZSBvZiB0aGUgZm9sbG93aW5nIGluZGV4OgorICAgICAqIFJPTUFOX0JBU0VMSU5FLCBDRU5URVJfQkFTRUxJTkUsIEhBTkdJTkdfQkFTRUxJTkUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgYmFzZWxpbmUgaW5kZXg6IFJPTUFOX0JBU0VMSU5FLCBDRU5URVJfQkFTRUxJTkUKLSAgICAgKiBvciBIQU5HSU5HX0JBU0VMSU5FLgorICAgICAqIEByZXR1cm4gdGhlIGJhc2VsaW5lIGluZGV4OiBST01BTl9CQVNFTElORSwgQ0VOVEVSX0JBU0VMSU5FIG9yCisgICAgICogICAgICAgICBIQU5HSU5HX0JBU0VMSU5FLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0QmFzZWxpbmVJbmRleCgpOwogCkBAIC04OSwxMSArOTEsMTEgQEAKICAgICBwdWJsaWMgYWJzdHJhY3QgZmxvYXQgZ2V0TGVhZGluZygpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgaGVpZ2h0IG9mIHRoZSB0ZXh0IGFzIGEgc3VtIG9mIHRoZSBhc2NlbnQsIHRoZSBkZXNjZW50IAotICAgICAqIGFuZCB0aGUgbGVhZGluZy4KKyAgICAgKiBHZXRzIHRoZSBoZWlnaHQgb2YgdGhlIHRleHQgYXMgYSBzdW0gb2YgdGhlIGFzY2VudCwgdGhlIGRlc2NlbnQgYW5kIHRoZQorICAgICAqIGxlYWRpbmcuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgaGVpZ2h0IG9mIHRoZSB0ZXh0IGFzIGEgc3VtIG9mIHRoZSBhc2NlbnQsIHRoZSBkZXNjZW50IAotICAgICAqIGFuZCB0aGUgbGVhZGluZy4KKyAgICAgKiBAcmV0dXJuIHRoZSBoZWlnaHQgb2YgdGhlIHRleHQgYXMgYSBzdW0gb2YgdGhlIGFzY2VudCwgdGhlIGRlc2NlbnQgYW5kCisgICAgICogICAgICAgICB0aGUgbGVhZGluZy4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgZmxvYXQgZ2V0SGVpZ2h0KCk7CiAKQEAgLTExMiw0ICsxMTQsMyBAQAogICAgIHB1YmxpYyBhYnN0cmFjdCBmbG9hdCBnZXRBc2NlbnQoKTsKIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZm9udC9NdWx0aXBsZU1hc3Rlci5qYXZhIGIvYXd0L2phdmEvYXd0L2ZvbnQvTXVsdGlwbGVNYXN0ZXIuamF2YQppbmRleCA3NzNiZmNmLi5kMjY0ZjI0IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZm9udC9NdWx0aXBsZU1hc3Rlci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9mb250L011bHRpcGxlTWFzdGVyLmphdmEKQEAgLTE4LDM4ICsxOCw0NCBAQAogICogQGF1dGhvciBJbHlhIFMuIE9rb21pbgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuZm9udDsKIAogaW1wb3J0IGphdmEuYXd0LkZvbnQ7CiAKIC8qKgotICogVGhlIE11bHRpcGxlTWFzdGVyIGludGVyZmFjZSBwcm92aWRlcyBtZXRob2RzIHRvIG1hbmlwdWxhdGUgTXVsdGlwbGVNYXN0ZXIgCisgKiBUaGUgTXVsdGlwbGVNYXN0ZXIgaW50ZXJmYWNlIHByb3ZpZGVzIG1ldGhvZHMgdG8gbWFuaXB1bGF0ZSBNdWx0aXBsZU1hc3RlcgogICogdHlwZSBmb250cyBhbmQgcmV0cmlldmUgZ3JhcGhpY2FsIGFuZCBkZXNpZ24gZGF0YSBmcm9tIHRoZW0uCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIE11bHRpcGxlTWFzdGVyIHsKIAogICAgIC8qKgotICAgICAqIERlcml2ZXMgYSBuZXcgbXVsdGlwbGUgbWFzdGVyIGZvbnQgYmFzZWQgb24gdGhlIHNwZWNpZmllZCAKLSAgICAgKiBwYXJhbWV0ZXJzLgorICAgICAqIERlcml2ZXMgYSBuZXcgbXVsdGlwbGUgbWFzdGVyIGZvbnQgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBnbHlwaFdpZHRocyBmbG9hdCBhcnJheSB3aGljaCByZXByZXNlbnRzIHdpZHRoIG9mIGVhY2ggZ2x5cGgKLSAgICAgKiBpbiBmb250IHNwYWNlLgotICAgICAqIEBwYXJhbSBhdmdTdGVtV2lkdGggdGhlIGF2ZXJhZ2Ugc3RlbSB3aWR0aCBpbiBmb250IHNwYWNlLgotICAgICAqIEBwYXJhbSB0eXBpY2FsQ2FwSGVpZ2h0IHRoZSB0eXBpY2FsIHVwcGVyIGNhc2UgY2hhciBoZWlnaHQuCi0gICAgICogQHBhcmFtIHR5cGljYWxYSGVpZ2h0IHRoZSB0eXBpY2FsIGxvd2VyIGNhc2UgY2hhciBoZWlnaHQuCi0gICAgICogQHBhcmFtIGl0YWxpY0FuZ2xlIHRoZSBzbG9wZSBhbmdsZSBmb3IgaXRhbGljcy4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZ2x5cGhXaWR0aHMKKyAgICAgKiAgICAgICAgICAgIGZsb2F0IGFycmF5IHdoaWNoIHJlcHJlc2VudHMgd2lkdGggb2YgZWFjaCBnbHlwaCBpbiBmb250CisgICAgICogICAgICAgICAgICBzcGFjZS4KKyAgICAgKiBAcGFyYW0gYXZnU3RlbVdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgYXZlcmFnZSBzdGVtIHdpZHRoIGluIGZvbnQgc3BhY2UuCisgICAgICogQHBhcmFtIHR5cGljYWxDYXBIZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSB0eXBpY2FsIHVwcGVyIGNhc2UgY2hhciBoZWlnaHQuCisgICAgICogQHBhcmFtIHR5cGljYWxYSGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgdHlwaWNhbCBsb3dlciBjYXNlIGNoYXIgaGVpZ2h0LgorICAgICAqIEBwYXJhbSBpdGFsaWNBbmdsZQorICAgICAqICAgICAgICAgICAgdGhlIHNsb3BlIGFuZ2xlIGZvciBpdGFsaWNzLgogICAgICAqIEByZXR1cm4gYSBNdWx0aXBsZU1hc3RlciBmb250LgogICAgICAqLwotICAgIHB1YmxpYyBGb250IGRlcml2ZU1NRm9udChmbG9hdFtdIGdseXBoV2lkdGhzLCBmbG9hdCBhdmdTdGVtV2lkdGgsCi0gICAgICAgICAgICBmbG9hdCB0eXBpY2FsQ2FwSGVpZ2h0LCBmbG9hdCB0eXBpY2FsWEhlaWdodCwgZmxvYXQgaXRhbGljQW5nbGUpOworICAgIHB1YmxpYyBGb250IGRlcml2ZU1NRm9udChmbG9hdFtdIGdseXBoV2lkdGhzLCBmbG9hdCBhdmdTdGVtV2lkdGgsIGZsb2F0IHR5cGljYWxDYXBIZWlnaHQsCisgICAgICAgICAgICBmbG9hdCB0eXBpY2FsWEhlaWdodCwgZmxvYXQgaXRhbGljQW5nbGUpOwogCiAgICAgLyoqCi0gICAgICogRGVyaXZlcyBhIG5ldyBtdWx0aXBsZSBtYXN0ZXIgZm9udCBiYXNlZCBvbiB0aGUgZGVzaWduIGF4aXMgdmFsdWVzIAotICAgICAqIGNvbnRhaW5lZCBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LiAKKyAgICAgKiBEZXJpdmVzIGEgbmV3IG11bHRpcGxlIG1hc3RlciBmb250IGJhc2VkIG9uIHRoZSBkZXNpZ24gYXhpcyB2YWx1ZXMKKyAgICAgKiBjb250YWluZWQgaW4gdGhlIHNwZWNpZmllZCBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYXhlcyBhbiBmbG9hdCBhcnJheSB3aGljaCBjb250YWlucyBheGlzIHZhbHVlcy4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gYXhlcworICAgICAqICAgICAgICAgICAgYW4gZmxvYXQgYXJyYXkgd2hpY2ggY29udGFpbnMgYXhpcyB2YWx1ZXMuCiAgICAgICogQHJldHVybiBhIE11bHRpcGxlTWFzdGVyIGZvbnQuCiAgICAgICovCiAgICAgcHVibGljIEZvbnQgZGVyaXZlTU1Gb250KGZsb2F0W10gYXhlcyk7CkBAIC02MiwyNSArNjgsMjQgQEAKICAgICBwdWJsaWMgZmxvYXRbXSBnZXREZXNpZ25BeGlzRGVmYXVsdHMoKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGFycmF5IG9mIGRlc2lnbiBheGlzIG5hbWVzLiAKKyAgICAgKiBHZXRzIHRoZSBhcnJheSBvZiBkZXNpZ24gYXhpcyBuYW1lcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBkZXNpZ24gYXhpcyBuYW1lcy4gCisgICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgZGVzaWduIGF4aXMgbmFtZXMuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ1tdIGdldERlc2lnbkF4aXNOYW1lcygpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgYXJyYXkgb2YgZGVzaWduIGF4aXMgcmFuZ2VzLiAKKyAgICAgKiBHZXRzIHRoZSBhcnJheSBvZiBkZXNpZ24gYXhpcyByYW5nZXMuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgZGVzaWduIGF4aXMgcmFuZ2VzLgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdFtdIGdldERlc2lnbkF4aXNSYW5nZXMoKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBtdWx0aXBsZSBtYXN0ZXIgZGVzaWduIGNvbnRyb2xzLiAKKyAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgbXVsdGlwbGUgbWFzdGVyIGRlc2lnbiBjb250cm9scy4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgbXVsdGlwbGUgbWFzdGVyIGRlc2lnbiBjb250cm9scy4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldE51bURlc2lnbkF4ZXMoKTsKIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZm9udC9PcGVuVHlwZS5qYXZhIGIvYXd0L2phdmEvYXd0L2ZvbnQvT3BlblR5cGUuamF2YQppbmRleCA1M2NiNmMwLi5kYjY2OTExIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZm9udC9PcGVuVHlwZS5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9mb250L09wZW5UeXBlLmphdmEKQEAgLTE4LDMxOCArMTgsMzIzIEBACiAgKiBAYXV0aG9yIElseWEgUy4gT2tvbWluCiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5mb250OwogCiAvKioKLSAqIFRoZSBPcGVuVHlwZSBpbnRlcmZhY2UgcHJvdmlkZXMgY29uc3RhbnRzIGFuZCBtZXRob2RzIGZvciBnZXR0aW5nIAotICogaW5zdGFuY2UgZGF0YSBmb3IgZm9udHMgb2YgdHlwZSBPcGVuVHlwZSBhbmQgVHJ1ZVR5cGUuIEZvciBtb3JlIGluZm9ybWF0aW9uLAotICogc2VlIHRoZSA8YSBocmVmPSJodHRwOi8vcGFydG5lcnMuYWRvYmUuY29tL3B1YmxpYy9kZXZlbG9wZXIvb3BlbnR5cGUvaW5kZXhfc3BlYy5odG1sIj5PcGVuVHlwZSBzcGVjaWZpY2F0aW9uPC9hPi4KKyAqIFRoZSBPcGVuVHlwZSBpbnRlcmZhY2UgcHJvdmlkZXMgY29uc3RhbnRzIGFuZCBtZXRob2RzIGZvciBnZXR0aW5nIGluc3RhbmNlCisgKiBkYXRhIGZvciBmb250cyBvZiB0eXBlIE9wZW5UeXBlIGFuZCBUcnVlVHlwZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUKKyAqIDxhCisgKiBocmVmPSJodHRwOi8vcGFydG5lcnMuYWRvYmUuY29tL3B1YmxpYy9kZXZlbG9wZXIvb3BlbnR5cGUvaW5kZXhfc3BlYy5odG1sIj4KKyAqIE9wZW5UeXBlIHNwZWNpZmljYXRpb248L2E+LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBPcGVuVHlwZSB7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFRBR19BQ05UIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyAKLSAgICAgKiBpbiB0aGUgT3BlbiBUeXBlIFNwZWNpZmljYXRpb24uCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRBR19BQ05UIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyBpbiB0aGUgT3BlbiBUeXBlCisgICAgICogU3BlY2lmaWNhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfQUNOVCA9IDE2MzM5MDYyOTI7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFRBR19BVkFSIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyAKLSAgICAgKiBpbiB0aGUgT3BlbiBUeXBlIFNwZWNpZmljYXRpb24uIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfQVZBUiBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0FWQVIgPSAxNjM1MTQ4MTQ2OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfQkFTRSBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfQkFTRSBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0JBU0UgPSAxMTExNTc3NDEzOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfQkRBVCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfQkRBVCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0JEQVQgPSAxNjUwNzQ1NzE2OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfQkxPQyBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfQkxPQyBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0JMT0MgPSAxNjUxMjczNTcxOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfQlNMTiBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfQlNMTiBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0JTTE4gPSAxNjUxNzMxNTY2OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfQ0ZGIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyAKLSAgICAgKiBpbiB0aGUgT3BlbiBUeXBlIFNwZWNpZmljYXRpb24uCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRBR19DRkYgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIGluIHRoZSBPcGVuIFR5cGUKKyAgICAgKiBTcGVjaWZpY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19DRkYgPSAxMTI4Njc4OTQ0OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfQ01BUCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfQ01BUCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0NNQVAgPSAxNjY4MTEyNzUyOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfQ1ZBUiBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfQ1ZBUiBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0NWQVIgPSAxNjY4NzAyNTc4OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfQ1ZUIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyAKLSAgICAgKiBpbiB0aGUgT3BlbiBUeXBlIFNwZWNpZmljYXRpb24uCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRBR19DVlQgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIGluIHRoZSBPcGVuIFR5cGUKKyAgICAgKiBTcGVjaWZpY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19DVlQgPSAxNjY4NzA3MzYwOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfRFNJRyBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfRFNJRyBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0RTSUcgPSAxMTQ2MzA4OTM1OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfRUJEVCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfRUJEVCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0VCRFQgPSAxMTYxOTcwNzcyOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfRUJMQyBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfRUJMQyBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0VCTEMgPSAxMTYxOTcyODAzOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfRUJTQyAgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIAotICAgICAqIGluIHRoZSBPcGVuIFR5cGUgU3BlY2lmaWNhdGlvbi4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0VCU0MgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIGluIHRoZSBPcGVuIFR5cGUKKyAgICAgKiBTcGVjaWZpY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19FQlNDID0gMTE2MTk3NDU5NTsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX0ZEU0MgaW5kaWNhdGVzIGNvcnJlc3BvbmRpbmcgdGFibGUgdGFnIAotICAgICAqIGluIHRoZSBPcGVuIFR5cGUgU3BlY2lmaWNhdGlvbi4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRBR19GRFNDIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyBpbiB0aGUgT3BlbiBUeXBlCisgICAgICogU3BlY2lmaWNhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfRkRTQyA9IDE3MTc4NTkxNzE7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFRBR19GRUFUIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyAKLSAgICAgKiBpbiB0aGUgT3BlbiBUeXBlIFNwZWNpZmljYXRpb24uCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRBR19GRUFUIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyBpbiB0aGUgT3BlbiBUeXBlCisgICAgICogU3BlY2lmaWNhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfRkVBVCA9IDE3MTc5MjAxMTY7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFRBR19GTVRYIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyAKLSAgICAgKiBpbiB0aGUgT3BlbiBUeXBlIFNwZWNpZmljYXRpb24uCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRBR19GTVRYIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyBpbiB0aGUgT3BlbiBUeXBlCisgICAgICogU3BlY2lmaWNhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfRk1UWCA9IDE3MTg0NDkyNzI7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFRBR19GUEdNIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyAKLSAgICAgKiBpbiB0aGUgT3BlbiBUeXBlIFNwZWNpZmljYXRpb24uCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRBR19GUEdNIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyBpbiB0aGUgT3BlbiBUeXBlCisgICAgICogU3BlY2lmaWNhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfRlBHTSA9IDE3MTg2NDI1NDE7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFRBR19GVkFSIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyAKLSAgICAgKiBpbiB0aGUgT3BlbiBUeXBlIFNwZWNpZmljYXRpb24uCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRBR19GVkFSIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyBpbiB0aGUgT3BlbiBUeXBlCisgICAgICogU3BlY2lmaWNhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfRlZBUiA9IDE3MTkwMzQyMjY7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFRBR19HQVNQIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyAKLSAgICAgKiBpbiB0aGUgT3BlbiBUeXBlIFNwZWNpZmljYXRpb24uCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRBR19HQVNQIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyBpbiB0aGUgT3BlbiBUeXBlCisgICAgICogU3BlY2lmaWNhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfR0FTUCA9IDE3MzQ0Mzk3OTI7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFRBR19HREVGIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyAKLSAgICAgKiBpbiB0aGUgT3BlbiBUeXBlIFNwZWNpZmljYXRpb24uCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRBR19HREVGIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyBpbiB0aGUgT3BlbiBUeXBlCisgICAgICogU3BlY2lmaWNhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfR0RFRiA9IDExOTU2NTY1MTg7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFRBR19HTFlGIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyAKLSAgICAgKiBpbiB0aGUgT3BlbiBUeXBlIFNwZWNpZmljYXRpb24uCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRBR19HTFlGIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyBpbiB0aGUgT3BlbiBUeXBlCisgICAgICogU3BlY2lmaWNhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfR0xZRiA9IDE3MzUxNjIyMTQ7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFRBR19HUE9TIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyAKLSAgICAgKiBpbiB0aGUgT3BlbiBUeXBlIFNwZWNpZmljYXRpb24uCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRBR19HUE9TIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyBpbiB0aGUgT3BlbiBUeXBlCisgICAgICogU3BlY2lmaWNhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfR1BPUyA9IDExOTY0NDU1MjM7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFRBR19HU1VCIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyAKLSAgICAgKiBpbiB0aGUgT3BlbiBUeXBlIFNwZWNpZmljYXRpb24uCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRBR19HU1VCIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyBpbiB0aGUgT3BlbiBUeXBlCisgICAgICogU3BlY2lmaWNhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfR1NVQiA9IDExOTY2NDM2NTA7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFRBR19HVkFSIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyAKLSAgICAgKiBpbiB0aGUgT3BlbiBUeXBlIFNwZWNpZmljYXRpb24uIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfR1ZBUiBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0dWQVIgPSAxNzM1ODExNDQyOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfSERNWCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfSERNWCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0hETVggPSAxNzUxNDEyMDg4OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfSEVBRCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfSEVBRCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0hFQUQgPSAxNzUxNDc0NTMyOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfSEhFQSBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfSEhFQSBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0hIRUEgPSAxNzUxNjcyMTYxOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfSE1UWCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfSE1UWCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0hNVFggPSAxNzUyMDAzNzA0OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfSlNURiBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfSlNURiBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0pTVEYgPSAxMjQ2OTc1MDQ2OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfSlVTVCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfSlVTVCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0pVU1QgPSAxNzg2MDgyMTY0OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfS0VSTiBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfS0VSTiBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0tFUk4gPSAxODAxODEwNTQyOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfTENBUiBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfTENBUiBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0xDQVIgPSAxODE4NDUyMzM4OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfTE9DQSBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfTE9DQSBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0xPQ0EgPSAxODE5MjM5MjY1OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfTFRTSCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfTFRTSCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX0xUU0ggPSAxMjgwNTk0NzYwOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfTUFYUCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfTUFYUCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX01BWFAgPSAxODM1MTA0MzY4OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfTU1GWCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfTU1GWCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX01NRlggPSAxMjk2OTA5OTEyOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfTU1TRCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfTU1TRCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX01NU0QgPSAxMjk2OTEzMjIwOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfTU9SVCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfTU9SVCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX01PUlQgPSAxODM2MDIwMzQwOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfTkFNRSBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfTkFNRSBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX05BTUUgPSAxODUxODc4NzU3OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfT1BCRCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgCi0gICAgICogaW4gdGhlIE9wZW4gVHlwZSBTcGVjaWZpY2F0aW9uLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfT1BCRCBpbmRpY2F0ZXMgY29ycmVzcG9uZGluZyB0YWJsZSB0YWcgaW4gdGhlIE9wZW4gVHlwZQorICAgICAqIFNwZWNpZmljYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX09QQkQgPSAxODM2MDIwMzQwOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUQUdfT1MyIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyAKLSAgICAgKiBpbiB0aGUgT3BlbiBUeXBlIFNwZWNpZmljYXRpb24uIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUQUdfT1MyIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyBpbiB0aGUgT3BlbiBUeXBlCisgICAgICogU3BlY2lmaWNhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfT1MyID0gMTMzMDg1MTYzNDsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVEFHX1BDTFQgIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyAKLSAgICAgKiBpbiB0aGUgT3BlbiBUeXBlIFNwZWNpZmljYXRpb24uCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRBR19QQ0xUIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyBpbiB0aGUgT3BlbiBUeXBlCisgICAgICogU3BlY2lmaWNhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfUENMVCA9IDEzNDY1ODc3MzI7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFRBR19QT1NUIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyAKLSAgICAgKiBpbiB0aGUgT3BlbiBUeXBlIFNwZWNpZmljYXRpb24uCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRBR19QT1NUIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyBpbiB0aGUgT3BlbiBUeXBlCisgICAgICogU3BlY2lmaWNhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfUE9TVCA9IDE4ODYzNTIyNDQ7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFRBR19QUkVQIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyAKLSAgICAgKiBpbiB0aGUgT3BlbiBUeXBlIFNwZWNpZmljYXRpb24uCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRBR19QUkVQIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyBpbiB0aGUgT3BlbiBUeXBlCisgICAgICogU3BlY2lmaWNhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfUFJFUCA9IDE4ODY1NDUyNjQ7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFRBR19QUk9QIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyAKLSAgICAgKiBpbiB0aGUgT3BlbiBUeXBlIFNwZWNpZmljYXRpb24uCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRBR19QUk9QIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyBpbiB0aGUgT3BlbiBUeXBlCisgICAgICogU3BlY2lmaWNhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfUFJPUCA9IDE4ODY1NDc4MjQ7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFRBR19UUkFLIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyAKLSAgICAgKiBpbiB0aGUgT3BlbiBUeXBlIFNwZWNpZmljYXRpb24uCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRBR19UUkFLIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyBpbiB0aGUgT3BlbiBUeXBlCisgICAgICogU3BlY2lmaWNhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfVFJBSyA9IDE5NTM2NTMwOTk7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFRBR19UWVAxIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyAKLSAgICAgKiBpbiB0aGUgT3BlbiBUeXBlIFNwZWNpZmljYXRpb24uCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRBR19UWVAxIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyBpbiB0aGUgT3BlbiBUeXBlCisgICAgICogU3BlY2lmaWNhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfVFlQMSA9IDE5NTQxMTU2MzM7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFRBR19WRE1YIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyAKLSAgICAgKiBpbiB0aGUgT3BlbiBUeXBlIFNwZWNpZmljYXRpb24uCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRBR19WRE1YIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyBpbiB0aGUgT3BlbiBUeXBlCisgICAgICogU3BlY2lmaWNhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfVkRNWCA9IDE0NDczMTY4MjQ7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFRBR19WSEVBIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyAKLSAgICAgKiBpbiB0aGUgT3BlbiBUeXBlIFNwZWNpZmljYXRpb24uCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRBR19WSEVBIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyBpbiB0aGUgT3BlbiBUeXBlCisgICAgICogU3BlY2lmaWNhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfVkhFQSA9IDE5ODY1NTMxODU7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFRBR19WTVRYIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyAKLSAgICAgKiBpbiB0aGUgT3BlbiBUeXBlIFNwZWNpZmljYXRpb24uCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRBR19WTVRYIGluZGljYXRlcyBjb3JyZXNwb25kaW5nIHRhYmxlIHRhZyBpbiB0aGUgT3BlbiBUeXBlCisgICAgICogU3BlY2lmaWNhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUdfVk1UWCA9IDE5ODY4ODQ3Mjg7CiAKQEAgLTM0MSw3MCArMzQ2LDczIEBACiAgICAgcHVibGljIGludCBnZXRWZXJzaW9uKCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0YWJsZSBmb3IgYSBzcGVjaWZpZWQgdGFnLiAKLSAgICAgKiBTZm50IHRhYmxlcyBpbmNsdWRlIGNtYXAsIG5hbWUgYW5kIGhlYWQgaXRlbXMuIAotICAgICAqICAKLSAgICAgKiBAcGFyYW0gc2ZudFRhZyB0aGUgc2ZudCB0YWcuCisgICAgICogR2V0cyB0aGUgdGFibGUgZm9yIGEgc3BlY2lmaWVkIHRhZy4gU2ZudCB0YWJsZXMgaW5jbHVkZSBjbWFwLCBuYW1lIGFuZAorICAgICAqIGhlYWQgaXRlbXMuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIGJ5dGUgYXJyYXkgY29udGFpbnMgdGhlIGZvbnQgZGF0YSBjb3JyZXNwb25kaW5nIAotICAgICAqIHRvIHRoZSBzcGVjaWZpZWQgdGFnLgorICAgICAqIEBwYXJhbSBzZm50VGFnCisgICAgICogICAgICAgICAgICB0aGUgc2ZudCB0YWcuCisgICAgICogQHJldHVybiBhIGJ5dGUgYXJyYXkgY29udGFpbnMgdGhlIGZvbnQgZGF0YSBjb3JyZXNwb25kaW5nIHRvIHRoZQorICAgICAqICAgICAgICAgc3BlY2lmaWVkIHRhZy4KICAgICAgKi8KICAgICBwdWJsaWMgYnl0ZVtdIGdldEZvbnRUYWJsZShpbnQgc2ZudFRhZyk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0YWJsZSBmb3IgYSBzcGVjaWZpZWQgdGFnLiAKLSAgICAgKiBTZm50IHRhYmxlcyBpbmNsdWRlIGNtYXAsIG5hbWUgYW5kIGhlYWQgaXRlbXMuIAotICAgICAqICAKLSAgICAgKiBAcGFyYW0gc2ZudFRhZyB0aGUgc2ZudCB0YWcuCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IG9mIHRoZSByZXR1cm5lZCB0YWJsZS4KLSAgICAgKiBAcGFyYW0gY291bnQgdGhlIG51bWJlciBvZiByZXR1cm5lZCB0YWJsZS4KKyAgICAgKiBHZXRzIHRoZSB0YWJsZSBmb3IgYSBzcGVjaWZpZWQgdGFnLiBTZm50IHRhYmxlcyBpbmNsdWRlIGNtYXAsIG5hbWUgYW5kCisgICAgICogaGVhZCBpdGVtcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0YWJsZSBjb3JyZXNwb25kaW5nIHRvIHNmbnRUYWcgYW5kIGNvbnRhaW5pbmcgCi0gICAgICogdGhlIGJ5dGVzIHN0YXJ0aW5nIGF0IG9mZnNldCBieXRlIGFuZCBpbmNsdWRpbmcgY291bnQgYnl0ZXMuCisgICAgICogQHBhcmFtIHNmbnRUYWcKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZm50IHRhZy4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSByZXR1cm5lZCB0YWJsZS4KKyAgICAgKiBAcGFyYW0gY291bnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgcmV0dXJuZWQgdGFibGUuCisgICAgICogQHJldHVybiB0aGUgdGFibGUgY29ycmVzcG9uZGluZyB0byBzZm50VGFnIGFuZCBjb250YWluaW5nIHRoZSBieXRlcworICAgICAqICAgICAgICAgc3RhcnRpbmcgYXQgb2Zmc2V0IGJ5dGUgYW5kIGluY2x1ZGluZyBjb3VudCBieXRlcy4KICAgICAgKi8KICAgICBwdWJsaWMgYnl0ZVtdIGdldEZvbnRUYWJsZShpbnQgc2ZudFRhZywgaW50IG9mZnNldCwgaW50IGNvdW50KTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRhYmxlIGZvciBhIHNwZWNpZmllZCB0YWcuIAotICAgICAqIFNmbnQgdGFibGVzIGluY2x1ZGUgY21hcCwgbmFtZSBhbmQgaGVhZCBpdGVtcy4KKyAgICAgKiBHZXRzIHRoZSB0YWJsZSBmb3IgYSBzcGVjaWZpZWQgdGFnLiBTZm50IHRhYmxlcyBpbmNsdWRlIGNtYXAsIG5hbWUgYW5kCisgICAgICogaGVhZCBpdGVtcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RyU2ZudFRhZyB0aGUgc3RyIHNmbnQgdGFnIGFzIGEgU3RyaW5nLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBieXRlIGFycmF5IGNvbnRhaW5zIHRoZSBmb250IGRhdGEgY29ycmVzcG9uZGluZyAKLSAgICAgKiB0byB0aGUgc3BlY2lmaWVkIHRhZy4KKyAgICAgKiBAcGFyYW0gc3RyU2ZudFRhZworICAgICAqICAgICAgICAgICAgdGhlIHN0ciBzZm50IHRhZyBhcyBhIFN0cmluZy4KKyAgICAgKiBAcmV0dXJuIGEgYnl0ZSBhcnJheSBjb250YWlucyB0aGUgZm9udCBkYXRhIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgICAgICogICAgICAgICBzcGVjaWZpZWQgdGFnLgogICAgICAqLwogICAgIHB1YmxpYyBieXRlW10gZ2V0Rm9udFRhYmxlKFN0cmluZyBzdHJTZm50VGFnKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRhYmxlIGZvciBhIHNwZWNpZmllZCB0YWcuIAotICAgICAqIFNmbnQgdGFibGVzIGluY2x1ZGUgY21hcCwgbmFtZSBhbmQgaGVhZCBpdGVtcy4gCi0gICAgICogIAotICAgICAqIEBwYXJhbSBzdHJTZm50VGFnIHRoZSBzZm50IHRhZyBhcyBhIFN0cmluZy4KLSAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgb2YgdGhlIHJldHVybmVkIHRhYmxlLgotICAgICAqIEBwYXJhbSBjb3VudCB0aGUgbnVtYmVyIG9mIHJldHVybmVkIHRhYmxlLgorICAgICAqIEdldHMgdGhlIHRhYmxlIGZvciBhIHNwZWNpZmllZCB0YWcuIFNmbnQgdGFibGVzIGluY2x1ZGUgY21hcCwgbmFtZSBhbmQKKyAgICAgKiBoZWFkIGl0ZW1zLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHRhYmxlIGNvcnJlc3BvbmRpbmcgdG8gc2ZudFRhZyBhbmQgY29udGFpbmluZyAKLSAgICAgKiB0aGUgYnl0ZXMgc3RhcnRpbmcgYXQgb2Zmc2V0IGJ5dGUgYW5kIGluY2x1ZGluZyBjb3VudCBieXRlcy4KKyAgICAgKiBAcGFyYW0gc3RyU2ZudFRhZworICAgICAqICAgICAgICAgICAgdGhlIHNmbnQgdGFnIGFzIGEgU3RyaW5nLgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIHJldHVybmVkIHRhYmxlLgorICAgICAqIEBwYXJhbSBjb3VudAorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiByZXR1cm5lZCB0YWJsZS4KKyAgICAgKiBAcmV0dXJuIHRoZSB0YWJsZSBjb3JyZXNwb25kaW5nIHRvIHNmbnRUYWcgYW5kIGNvbnRhaW5pbmcgdGhlIGJ5dGVzCisgICAgICogICAgICAgICBzdGFydGluZyBhdCBvZmZzZXQgYnl0ZSBhbmQgaW5jbHVkaW5nIGNvdW50IGJ5dGVzLgogICAgICAqLwogICAgIHB1YmxpYyBieXRlW10gZ2V0Rm9udFRhYmxlKFN0cmluZyBzdHJTZm50VGFnLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGFibGUgc2l6ZSBmb3IgYSBzcGVjaWZpZWQgdGFnLiAKKyAgICAgKiBHZXRzIHRoZSB0YWJsZSBzaXplIGZvciBhIHNwZWNpZmllZCB0YWcuCiAgICAgICogCi0gICAgICogQHBhcmFtIHN0clNmbnRUYWcgdGhlIHNmbnQgdGFnIGFzIGEgU3RyaW5nLgotICAgICAqIAorICAgICAqIEBwYXJhbSBzdHJTZm50VGFnCisgICAgICogICAgICAgICAgICB0aGUgc2ZudCB0YWcgYXMgYSBTdHJpbmcuCiAgICAgICogQHJldHVybiB0aGUgdGFibGUgc2l6ZSBmb3IgYSBzcGVjaWZpZWQgdGFnLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0Rm9udFRhYmxlU2l6ZShTdHJpbmcgc3RyU2ZudFRhZyk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0YWJsZSBzaXplIGZvciBhIHNwZWNpZmllZCB0YWcuIAorICAgICAqIEdldHMgdGhlIHRhYmxlIHNpemUgZm9yIGEgc3BlY2lmaWVkIHRhZy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2ZudFRhZyB0aGUgc2ZudCB0YWcuCi0gICAgICogCisgICAgICogQHBhcmFtIHNmbnRUYWcKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZm50IHRhZy4KICAgICAgKiBAcmV0dXJuIHRoZSB0YWJsZSBzaXplIGZvciBhIHNwZWNpZmllZCB0YWcuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRGb250VGFibGVTaXplKGludCBzZm50VGFnKTsKIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZm9udC9TaGFwZUdyYXBoaWNBdHRyaWJ1dGUuamF2YSBiL2F3dC9qYXZhL2F3dC9mb250L1NoYXBlR3JhcGhpY0F0dHJpYnV0ZS5qYXZhCmluZGV4IDQ1MTk5ZmQuLjE4MmJmZmQgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9mb250L1NoYXBlR3JhcGhpY0F0dHJpYnV0ZS5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9mb250L1NoYXBlR3JhcGhpY0F0dHJpYnV0ZS5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIElseWEgUy4gT2tvbWluCiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5mb250OwogCiBpbXBvcnQgamF2YS5hd3QuQmFzaWNTdHJva2U7CkBAIC0yOSw2MSArMzAsNzUgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5taXNjLkhhc2hDb2RlOwogCi0KIC8qKgotICogVGhlIFNoYXBlR3JhcGhpY0F0dHJpYnV0ZSBjbGFzcyBwcm92aWRlcyBhbiBvcHBvcnR1bml0eSB0byBpbnNlcnQgCi0gKiBzaGFwZXMgdG8gYSB0ZXh0LgorICogVGhlIFNoYXBlR3JhcGhpY0F0dHJpYnV0ZSBjbGFzcyBwcm92aWRlcyBhbiBvcHBvcnR1bml0eSB0byBpbnNlcnQgc2hhcGVzIHRvIGEKKyAqIHRleHQuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgU2hhcGVHcmFwaGljQXR0cmlidXRlIGV4dGVuZHMgR3JhcGhpY0F0dHJpYnV0ZSB7CiAKICAgICAvLyBzaGFwZSB0byByZW5kZXIKLSAgICAvKiogVGhlIHNoYXBlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBzaGFwZS4KKyAgICAgKi8KICAgICBwcml2YXRlIFNoYXBlIGZTaGFwZTsKLSAgICAKKwogICAgIC8vIGZsYWcsIGlmIHRoZSBzaGFwZSBzaG91bGQgYmUgc3Ryb2tlZCAodHJ1ZSkgb3IgZmlsbGVkIChmYWxzZSkKLSAgICAvKiogVGhlIHN0cm9rZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgc3Ryb2tlLgorICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBmU3Ryb2tlOwogCiAgICAgLy8gYm91bmRzIG9mIHRoZSBzaGFwZQotICAgIC8qKiBUaGUgYm91bmRzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBib3VuZHMuCisgICAgICovCiAgICAgcHJpdmF0ZSBSZWN0YW5nbGUyRCBmQm91bmRzOwotICAgIAorCiAgICAgLy8gWCBjb29yZGluYXRlIG9mIHRoZSBvcmlnaW4gcG9pbnQKLSAgICAvKiogVGhlIG9yaWdpbiB4LiAqLworICAgIC8qKgorICAgICAqIFRoZSBvcmlnaW4geC4KKyAgICAgKi8KICAgICBwcml2YXRlIGZsb2F0IGZPcmlnaW5YOwotICAgIAorCiAgICAgLy8gWSBjb29yZGluYXRlIG9mIHRoZSBvcmlnaW4gcG9pbnQKLSAgICAvKiogVGhlIG9yaWdpbiB5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBvcmlnaW4geS4KKyAgICAgKi8KICAgICBwcml2YXRlIGZsb2F0IGZPcmlnaW5ZOwogCiAgICAgLy8gd2lkdGggb2YgdGhlIHNoYXBlCi0gICAgLyoqIFRoZSBzaGFwZSB3aWR0aC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgc2hhcGUgd2lkdGguCisgICAgICovCiAgICAgcHJpdmF0ZSBmbG9hdCBmU2hhcGVXaWR0aDsKLSAgICAKKwogICAgIC8vIGhlaWdodCBvZiB0aGUgc2hhcGUKLSAgICAvKiogVGhlIHNoYXBlIGhlaWdodC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgc2hhcGUgaGVpZ2h0LgorICAgICAqLwogICAgIHByaXZhdGUgZmxvYXQgZlNoYXBlSGVpZ2h0OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBTVFJPS0UgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIFNoYXBlIGlzIHN0cm9rZWQgCi0gICAgICogb3Igbm90LiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgU1RST0tFIGluZGljYXRlcyB3aGV0aGVyIHRoZSBTaGFwZSBpcyBzdHJva2VkIG9yIG5vdC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gU1RST0tFID0gdHJ1ZTsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgRklMTCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgU2hhcGUgaXMgZmlsbGVkIAotICAgICAqIG9yIG5vdC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgRklMTCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgU2hhcGUgaXMgZmlsbGVkIG9yIG5vdC4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gRklMTCA9IGZhbHNlOwogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IFNoYXBlR3JhcGhpY0F0dHJpYnV0ZSBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgCi0gICAgICogU2hhcGUuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IFNoYXBlR3JhcGhpY0F0dHJpYnV0ZSBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgU2hhcGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNoYXBlIHRoZSBzaGFwZSB0byBiZSByZW5kZXJlZCBieSB0aGlzIAotICAgICAqIFNoYXBlR3JhcGhpY0F0dHJpYnV0ZS4KLSAgICAgKiBAcGFyYW0gYWxpZ25tZW50IHRoZSBhbGlnbm1lbnQgb2YgdGhpcyBTaGFwZUdyYXBoaWNBdHRyaWJ1dGUuCi0gICAgICogQHBhcmFtIHN0cm9rZSB0cnVlIGlmIHRoZSBTaGFwZSBpcyBzdHJva2VkLAotICAgICAqICBmYWxzZSBpZiB0aGUgU2hhcGUgaXMgZmlsbGVkLgorICAgICAqIEBwYXJhbSBzaGFwZQorICAgICAqICAgICAgICAgICAgdGhlIHNoYXBlIHRvIGJlIHJlbmRlcmVkIGJ5IHRoaXMgU2hhcGVHcmFwaGljQXR0cmlidXRlLgorICAgICAqIEBwYXJhbSBhbGlnbm1lbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbGlnbm1lbnQgb2YgdGhpcyBTaGFwZUdyYXBoaWNBdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIHN0cm9rZQorICAgICAqICAgICAgICAgICAgdHJ1ZSBpZiB0aGUgU2hhcGUgaXMgc3Ryb2tlZCwgZmFsc2UgaWYgdGhlIFNoYXBlIGlzIGZpbGxlZC4KICAgICAgKi8KICAgICBwdWJsaWMgU2hhcGVHcmFwaGljQXR0cmlidXRlKFNoYXBlIHNoYXBlLCBpbnQgYWxpZ25tZW50LCBib29sZWFuIHN0cm9rZSkgewogICAgICAgICBzdXBlcihhbGlnbm1lbnQpOwpAQCAtOTEsNyArMTA2LDcgQEAKICAgICAgICAgdGhpcy5mU2hhcGUgPSBzaGFwZTsKICAgICAgICAgdGhpcy5mU3Ryb2tlID0gc3Ryb2tlOwogCi0gICAgICAgIHRoaXMuZkJvdW5kcyAgPSBmU2hhcGUuZ2V0Qm91bmRzMkQoKTsKKyAgICAgICAgdGhpcy5mQm91bmRzID0gZlNoYXBlLmdldEJvdW5kczJEKCk7CiAKICAgICAgICAgdGhpcy5mT3JpZ2luWCA9IChmbG9hdClmQm91bmRzLmdldE1pblgoKTsKICAgICAgICAgdGhpcy5mT3JpZ2luWSA9IChmbG9hdClmQm91bmRzLmdldE1pblkoKTsKQEAgLTExOCwxMCArMTMzLDEwIEBACiAgICAgICogQ29tcGFyZXMgdGhpcyBTaGFwZUdyYXBoaWNBdHRyaWJ1dGUgb2JqZWN0IHRvIHRoZSBzcGVjaWZpZWQKICAgICAgKiBTaGFwZUdyYXBoaWNBdHRyaWJ1dGUgb2JqZWN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBzZ2EgdGhlIFNoYXBlR3JhcGhpY0F0dHJpYnV0ZSBvYmplY3QgdG8gYmUgY29tcGFyZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGlzIFNoYXBlR3JhcGhpY0F0dHJpYnV0ZSBvYmplY3QgaXMgZXF1YWwKLSAgICAgKiB0byB0aGUgc3BlY2lmaWVkIFNoYXBlR3JhcGhpY0F0dHJpYnV0ZSBvYmplY3QsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcGFyYW0gc2dhCisgICAgICogICAgICAgICAgICB0aGUgU2hhcGVHcmFwaGljQXR0cmlidXRlIG9iamVjdCB0byBiZSBjb21wYXJlZC4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgU2hhcGVHcmFwaGljQXR0cmlidXRlIG9iamVjdCBpcyBlcXVhbCB0byB0aGUKKyAgICAgKiAgICAgICAgIHNwZWNpZmllZCBTaGFwZUdyYXBoaWNBdHRyaWJ1dGUgb2JqZWN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKFNoYXBlR3JhcGhpY0F0dHJpYnV0ZSBzZ2EpIHsKICAgICAgICAgaWYgKHNnYSA9PSBudWxsKSB7CkBAIC0xMzIsMjcgKzE0NywyNCBAQAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gKCBmU3Ryb2tlID09IHNnYS5mU3Ryb2tlICYmCi0gICAgICAgICAgICAgICAgZ2V0QWxpZ25tZW50KCkgPT0gc2dhLmdldEFsaWdubWVudCgpICYmCi0gICAgICAgICAgICAgICAgZlNoYXBlLmVxdWFscyhzZ2EuZlNoYXBlKSk7CisgICAgICAgIHJldHVybiAoZlN0cm9rZSA9PSBzZ2EuZlN0cm9rZSAmJiBnZXRBbGlnbm1lbnQoKSA9PSBzZ2EuZ2V0QWxpZ25tZW50KCkgJiYgZlNoYXBlCisgICAgICAgICAgICAgICAgLmVxdWFscyhzZ2EuZlNoYXBlKSk7CiAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGlzIFNoYXBlR3JhcGhpY0F0dHJpYnV0ZSBvYmplY3QgdG8gdGhlIHNwZWNpZmllZAotICAgICAqIE9iamVjdC4KKyAgICAgKiBDb21wYXJlcyB0aGlzIFNoYXBlR3JhcGhpY0F0dHJpYnV0ZSBvYmplY3QgdG8gdGhlIHNwZWNpZmllZCBPYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIG9iaiB0aGUgT2JqZWN0IHRvIGJlIGNvbXBhcmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBTaGFwZUdyYXBoaWNBdHRyaWJ1dGUgb2JqZWN0IGlzIGVxdWFsCi0gICAgICogdG8gdGhlIHNwZWNpZmllZCBPYmplY3QsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcGFyYW0gb2JqCisgICAgICogICAgICAgICAgICB0aGUgT2JqZWN0IHRvIGJlIGNvbXBhcmVkLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBTaGFwZUdyYXBoaWNBdHRyaWJ1dGUgb2JqZWN0IGlzIGVxdWFsIHRvIHRoZQorICAgICAqICAgICAgICAgc3BlY2lmaWVkIE9iamVjdCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZXF1YWxzKChTaGFwZUdyYXBoaWNBdHRyaWJ1dGUpIG9iaik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBlcXVhbHMoKFNoYXBlR3JhcGhpY0F0dHJpYnV0ZSlvYmopOworICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQpAQCAtMTYwLDcgKzE3Miw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZHJhdyhHcmFwaGljczJEIGcyLCBmbG9hdCB4LCBmbG9hdCB5KSB7CiAgICAgICAgIEFmZmluZVRyYW5zZm9ybSBhdCA9IEFmZmluZVRyYW5zZm9ybS5nZXRUcmFuc2xhdGVJbnN0YW5jZSh4LCB5KTsKLSAgICAgICAgaWYgKGZTdHJva2UgPT0gU1RST0tFKXsKKyAgICAgICAgaWYgKGZTdHJva2UgPT0gU1RST0tFKSB7CiAgICAgICAgICAgICBTdHJva2Ugb2xkU3Ryb2tlID0gZzIuZ2V0U3Ryb2tlKCk7CiAgICAgICAgICAgICBnMi5zZXRTdHJva2UobmV3IEJhc2ljU3Ryb2tlKCkpOwogICAgICAgICAgICAgZzIuZHJhdyhhdC5jcmVhdGVUcmFuc2Zvcm1lZFNoYXBlKGZTaGFwZSkpOwpAQCAtMTkyLDQgKzIwNCwzIEBACiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9mb250L1RleHRIaXRJbmZvLmphdmEgYi9hd3QvamF2YS9hd3QvZm9udC9UZXh0SGl0SW5mby5qYXZhCmluZGV4IDE3YmJmNzEuLjY0NjBlYmEgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9mb250L1RleHRIaXRJbmZvLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ZvbnQvVGV4dEhpdEluZm8uamF2YQpAQCAtMjMsMjkgKzIzLDM2IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubWlzYy5IYXNoQ29kZTsKIAotCiAvKioKLSAqIFRoZSBUZXh0SGl0SW5mbyBjbGFzcyBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCBhIGNhcmV0IHBvc2l0aW9uIAotICogaW4gYSB0ZXh0IG1vZGVsIGZvciBpbnNlcnRpb24gb3IgZGVsZXRpb24gb2YgYSBjaGFyYWN0ZXIgaW4gYSB0ZXh0LgotICogVGhlIFRleHRIaXRJbmZvIGRlZmluZXMgdHdvIGJpYXNlcyBvZiB0aGUgY2hhcmFjdGVyOiBsZWFkaW5nIG9yIHRyYWlsaW5nLgotICogTGVhZGluZyBwb3NpdGlvbiBtZWFucyB0aGUgbGVmdCBlZGdlIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIAotICogKFRleHRIaXRJbmZvLmxlYWRpbmcoMikgbWV0aG9kIGZvciAidGV4dCIgcmV0dXJucyB0aGUgbGVmdCBzaWRlIG9mICJ4IikuCi0gKiBUcmFpbGluZyBwb3NpdGlvbiBtZWFucyB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotICogKFRleHRIaXRJbmZvLnRyYWlsaW5nKDIpIG1ldGhvZCBmb3IgInRleHQiIHJldHVybnMgdGhlIHJpZ2h0IHNpZGUgb2YgIngiKS4KKyAqIFRoZSBUZXh0SGl0SW5mbyBjbGFzcyBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCBhIGNhcmV0IHBvc2l0aW9uIGluIGEgdGV4dAorICogbW9kZWwgZm9yIGluc2VydGlvbiBvciBkZWxldGlvbiBvZiBhIGNoYXJhY3RlciBpbiBhIHRleHQuIFRoZSBUZXh0SGl0SW5mbworICogZGVmaW5lcyB0d28gYmlhc2VzIG9mIHRoZSBjaGFyYWN0ZXI6IGxlYWRpbmcgb3IgdHJhaWxpbmcuIExlYWRpbmcgcG9zaXRpb24KKyAqIG1lYW5zIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgKFRleHRIaXRJbmZvLmxlYWRpbmcoMikgbWV0aG9kCisgKiBmb3IgInRleHQiIHJldHVybnMgdGhlIGxlZnQgc2lkZSBvZiAieCIpLiBUcmFpbGluZyBwb3NpdGlvbiBtZWFucyB0aGUgcmlnaHQKKyAqIGVkZ2Ugb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgKFRleHRIaXRJbmZvLnRyYWlsaW5nKDIpIG1ldGhvZCBmb3IgInRleHQiCisgKiByZXR1cm5zIHRoZSByaWdodCBzaWRlIG9mICJ4IikuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgVGV4dEhpdEluZm8gewotICAgIAotICAgIC8qKiBUaGUgY2hhciBpZHguICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgY2hhciBpZHguCisgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgY2hhcklkeDsgLy8gUmVwcmVzZW50cyBjaGFyYWN0ZXIgaW5kZXggaW4gdGhlIGxpbmUKLSAgICAKLSAgICAvKiogVGhlIGlzIHRyYWlsaW5nLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGlzIHRyYWlsaW5nLgorICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBpc1RyYWlsaW5nOwogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHRleHQgaGl0IGluZm8uCiAgICAgICogCi0gICAgICogQHBhcmFtIGlkeCB0aGUgaWR4Ci0gICAgICogQHBhcmFtIGlzVHJhaWxpbmcgdGhlIGlzIHRyYWlsaW5nCisgICAgICogQHBhcmFtIGlkeAorICAgICAqICAgICAgICAgICAgdGhlIGlkeC4KKyAgICAgKiBAcGFyYW0gaXNUcmFpbGluZworICAgICAqICAgICAgICAgICAgdGhlIGlzIHRyYWlsaW5nLgogICAgICAqLwogICAgIHByaXZhdGUgVGV4dEhpdEluZm8oaW50IGlkeCwgYm9vbGVhbiBpc1RyYWlsaW5nKSB7CiAgICAgICAgIGNoYXJJZHggPSBpZHg7CkBAIC01Myw5MCArNjAsODIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUbyBzdHJpbmcuCisgICAgICogUmV0dXJucyB0aGUgdGV4dHVhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBUZXh0SGl0SW5mbyBpbnN0YW5jZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcKKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24uCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoCi0gICAgICAgICAgICAgICAgIlRleHRIaXRJbmZvWyIgKyBjaGFySWR4ICsgIiwgIiArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICAgIChpc1RyYWlsaW5nPyJUcmFpbGluZyI6IkxlYWRpbmciKSArICJdIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorICAgICAgICByZXR1cm4gbmV3IFN0cmluZygiVGV4dEhpdEluZm9bIiArIGNoYXJJZHggKyAiLCAiICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisgICAgICAgICAgICAgICAgKGlzVHJhaWxpbmcgPyAiVHJhaWxpbmciIDogIkxlYWRpbmciKSArICJdIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAogICAgICAgICApOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIENvbXBhcmVzIHRoaXMgVGV4dEhpdEluZm8gb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIG9iaiB0aGUgT2JqZWN0IHRvIGJlIGNvbXBhcmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgYSBUZXh0SGl0SW5mbyBvYmplY3QgCi0gICAgICogd2l0aCB0aGUgc2FtZSBkYXRhIHZhbHVlcyBhcyB0aGlzIFRleHRIaXRJbmZvLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIG9iagorICAgICAqICAgICAgICAgICAgdGhlIE9iamVjdCB0byBiZSBjb21wYXJlZC4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGEgVGV4dEhpdEluZm8gb2JqZWN0IHdpdGggdGhlCisgICAgICogICAgICAgICBzYW1lIGRhdGEgdmFsdWVzIGFzIHRoaXMgVGV4dEhpdEluZm8sIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewogICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgVGV4dEhpdEluZm8pIHsKLSAgICAgICAgICAgIHJldHVybiBlcXVhbHMoKFRleHRIaXRJbmZvKSBvYmopOworICAgICAgICAgICAgcmV0dXJuIGVxdWFscygoVGV4dEhpdEluZm8pb2JqKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhpcyBUZXh0SGl0SW5mbyBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIFRleHRIaXRJbmZvCi0gICAgICogb2JqZWN0LgorICAgICAqIENvbXBhcmVzIHRoaXMgVGV4dEhpdEluZm8gb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBUZXh0SGl0SW5mbyBvYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIHRoaSB0aGUgVGV4dEhpdEluZm8gb2JqZWN0IHRvIGJlIGNvbXBhcmVkLgotICAgICAqIAorICAgICAqIEBwYXJhbSB0aGkKKyAgICAgKiAgICAgICAgICAgIHRoZSBUZXh0SGl0SW5mbyBvYmplY3QgdG8gYmUgY29tcGFyZWQuCiAgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGlzIFRleHRIaXRJbmZvIG9iamVjdCBoYXMgdGhlIHNhbWUgZGF0YSB2YWx1ZXMgYXMgdGhlCi0gICAgICogc3BlY2lmaWVkIFRleHRIaXRJbmZvIG9iamVjdCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqICAgICAgICAgc3BlY2lmaWVkIFRleHRIaXRJbmZvIG9iamVjdCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhUZXh0SGl0SW5mbyB0aGkpIHsKLSAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgdGhpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICB0aGkuY2hhcklkeCA9PSBjaGFySWR4ICYmCi0gICAgICAgICAgICAgICAgdGhpLmlzVHJhaWxpbmcgPT0gaXNUcmFpbGluZzsKKyAgICAgICAgcmV0dXJuIHRoaSAhPSBudWxsICYmIHRoaS5jaGFySWR4ID09IGNoYXJJZHggJiYgdGhpLmlzVHJhaWxpbmcgPT0gaXNUcmFpbGluZzsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGEgVGV4dEhpdEluZm8gb2JqZWN0IHdpdGggaXRzIGNoYXJhY3RlciBpbmRleCAKLSAgICAgKiBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldCBmcm9tIHRoZSBjaGFyYWN0ZXIgaW5kZXggb2YgCi0gICAgICogdGhpcyBUZXh0SGl0SW5mby4KKyAgICAgKiBHZXRzIGEgVGV4dEhpdEluZm8gb2JqZWN0IHdpdGggaXRzIGNoYXJhY3RlciBpbmRleCBhdCB0aGUgc3BlY2lmaWVkCisgICAgICogb2Zmc2V0IGZyb20gdGhlIGNoYXJhY3RlciBpbmRleCBvZiB0aGlzIFRleHRIaXRJbmZvLgogICAgICAqIAotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBUZXh0SGl0SW5mby4gCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldC4KKyAgICAgKiBAcmV0dXJuIHRoZSBUZXh0SGl0SW5mby4KICAgICAgKi8KICAgICBwdWJsaWMgVGV4dEhpdEluZm8gZ2V0T2Zmc2V0SGl0KGludCBvZmZzZXQpIHsKICAgICAgICAgcmV0dXJuIG5ldyBUZXh0SGl0SW5mbyhjaGFySWR4ICsgb2Zmc2V0LCBpc1RyYWlsaW5nKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGEgVGV4dEhpdEluZm8gYXNzb2NpYXRlZCB3aXRoIHRoZSBvdGhlciBzaWRlIG9mIAotICAgICAqIHRoZSBpbnNlcnRpb24gcG9pbnQuIAotICAgICAqICAKKyAgICAgKiBHZXRzIGEgVGV4dEhpdEluZm8gYXNzb2NpYXRlZCB3aXRoIHRoZSBvdGhlciBzaWRlIG9mIHRoZSBpbnNlcnRpb24gcG9pbnQuCisgICAgICogCiAgICAgICogQHJldHVybiB0aGUgb3RoZXIgaGl0LgogICAgICAqLwogICAgIHB1YmxpYyBUZXh0SGl0SW5mbyBnZXRPdGhlckhpdCgpIHsKLSAgICAgICAgcmV0dXJuIGlzVHJhaWxpbmcgPwotICAgICAgICAgICAgICAgIG5ldyBUZXh0SGl0SW5mbyhjaGFySWR4KzEsIGZhbHNlKSA6Ci0gICAgICAgICAgICAgICAgbmV3IFRleHRIaXRJbmZvKGNoYXJJZHgtMSwgdHJ1ZSk7CisgICAgICAgIHJldHVybiBpc1RyYWlsaW5nID8gbmV3IFRleHRIaXRJbmZvKGNoYXJJZHggKyAxLCBmYWxzZSkKKyAgICAgICAgICAgICAgICA6IG5ldyBUZXh0SGl0SW5mbyhjaGFySWR4IC0gMSwgdHJ1ZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIGNoYXJhY3RlciBpcyBoaXQsCi0gICAgICogZmFsc2UgaWYgdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGNoYXJhY3RlciBpcyBoaXQuCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIGNoYXJhY3RlciBpcyBoaXQsIGZhbHNlIGlmIHRoZQorICAgICAqIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGNoYXJhY3RlciBpcyBoaXQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIGNoYXJhY3RlciBpcyBoaXQsCi0gICAgICogZmFsc2UgaWYgdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGNoYXJhY3RlciBpcyBoaXQuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIGNoYXJhY3RlciBpcyBoaXQsIGZhbHNlIGlmIHRoZQorICAgICAqICAgICAgICAgdHJhaWxpbmcgZWRnZSBvZiB0aGUgY2hhcmFjdGVyIGlzIGhpdC4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0xlYWRpbmdFZGdlKCkgewogICAgICAgICByZXR1cm4gIWlzVHJhaWxpbmc7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSGFzaCBjb2RlLgorICAgICAqIFJldHVybnMgdGhlIGhhc2ggY29kZSB2YWx1ZSBvZiB0aGlzIFRleHRIaXRJbmZvIGluc3RhbmNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGludAorICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZSB2YWx1ZS4KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewpAQCAtMTQ2LDExICsxNDUsMTEgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBpbnNlcnRpb24gaW5kZXguCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW5zZXJ0aW9uIGluZGV4OiBjaGFyYWN0ZXIgaW5kZXggaWYgdGhlIGxlYWRpbmcgZWRnZQotICAgICAqIGlzIGhpdCwgb3IgY2hhcmFjdGVyIGluZGV4ICsgMSBpZiB0aGUgdHJhaWxpbmcgZWRnZSBpcyBoaXQuICAgCisgICAgICogQHJldHVybiB0aGUgaW5zZXJ0aW9uIGluZGV4OiBjaGFyYWN0ZXIgaW5kZXggaWYgdGhlIGxlYWRpbmcgZWRnZSBpcyBoaXQsCisgICAgICogICAgICAgICBvciBjaGFyYWN0ZXIgaW5kZXggKyAxIGlmIHRoZSB0cmFpbGluZyBlZGdlIGlzIGhpdC4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldEluc2VydGlvbkluZGV4KCkgewotICAgICAgICByZXR1cm4gaXNUcmFpbGluZyA/IGNoYXJJZHgrMSA6IGNoYXJJZHg7CisgICAgICAgIHJldHVybiBpc1RyYWlsaW5nID8gY2hhcklkeCArIDEgOiBjaGFySWR4OwogICAgIH0KIAogICAgIC8qKgpAQCAtMTYzLDUyICsxNjIsNTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgVGV4dEhpdEluZm8gYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFpbGluZyBlZGdlIG9mIAotICAgICAqIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIHNwZWNpZmllZCBjaGFyIGluZGV4LgorICAgICAqIFJldHVybnMgYSBUZXh0SGl0SW5mbyBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGNoYXJhY3RlcgorICAgICAqIGF0IHRoZSBzcGVjaWZpZWQgY2hhciBpbmRleC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2hhckluZGV4IHRoZSBjaGFyIGluZGV4LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIFRleHRIaXRJbmZvIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhaWxpbmcgZWRnZSBvZiAKLSAgICAgKiB0aGUgY2hhcmFjdGVyIGF0IHRoZSBzcGVjaWZpZWQgY2hhciBpbmRleC4KKyAgICAgKiBAcGFyYW0gY2hhckluZGV4CisgICAgICogICAgICAgICAgICB0aGUgY2hhciBpbmRleC4KKyAgICAgKiBAcmV0dXJuIHRoZSBUZXh0SGl0SW5mbyBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlCisgICAgICogICAgICAgICBjaGFyYWN0ZXIgYXQgdGhlIHNwZWNpZmllZCBjaGFyIGluZGV4LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgVGV4dEhpdEluZm8gdHJhaWxpbmcoaW50IGNoYXJJbmRleCkgewogICAgICAgICByZXR1cm4gbmV3IFRleHRIaXRJbmZvKGNoYXJJbmRleCwgdHJ1ZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIFRleHRIaXRJbmZvIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGxlYWRpbmcgZWRnZSAKLSAgICAgKiBvZiB0aGUgY2hhcmFjdGVyIGF0IHRoZSBzcGVjaWZpZWQgY2hhciBpbmRleC4KKyAgICAgKiBSZXR1cm5zIGEgVGV4dEhpdEluZm8gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZQorICAgICAqIGNoYXJhY3RlciBhdCB0aGUgc3BlY2lmaWVkIGNoYXIgaW5kZXguCiAgICAgICogCi0gICAgICogQHBhcmFtIGNoYXJJbmRleCB0aGUgY2hhciBpbmRleC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBUZXh0SGl0SW5mbyBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBsZWFkaW5nIGVkZ2UgCi0gICAgICogb2YgdGhlIGNoYXJhY3RlciBhdCB0aGUgc3BlY2lmaWVkIGNoYXIgaW5kZXguCisgICAgICogQHBhcmFtIGNoYXJJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGNoYXIgaW5kZXguCisgICAgICogQHJldHVybiB0aGUgVGV4dEhpdEluZm8gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZQorICAgICAqICAgICAgICAgY2hhcmFjdGVyIGF0IHRoZSBzcGVjaWZpZWQgY2hhciBpbmRleC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFRleHRIaXRJbmZvIGxlYWRpbmcoaW50IGNoYXJJbmRleCkgewogICAgICAgICByZXR1cm4gbmV3IFRleHRIaXRJbmZvKGNoYXJJbmRleCwgZmFsc2UpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSAodHJhaWxpbmcpIFRleHRIaXRJbmZvIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGNoYXJhY3RlciAKKyAgICAgKiBSZXR1cm5zIGEgKHRyYWlsaW5nKSBUZXh0SGl0SW5mbyBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBjaGFyYWN0ZXIKICAgICAgKiBiZWZvcmUgdGhlIHNwZWNpZmllZCBvZmZzZXQuCiAgICAgICogCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIFRleHRIaXRJbmZvIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGNoYXJhY3RlciAKLSAgICAgKiBiZWZvcmUgdGhlIHNwZWNpZmllZCBvZmZzZXQuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldC4KKyAgICAgKiBAcmV0dXJuIHRoZSBUZXh0SGl0SW5mbyBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBjaGFyYWN0ZXIgYmVmb3JlIHRoZQorICAgICAqICAgICAgICAgc3BlY2lmaWVkIG9mZnNldC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFRleHRIaXRJbmZvIGJlZm9yZU9mZnNldChpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIHJldHVybiBuZXcgVGV4dEhpdEluZm8ob2Zmc2V0LTEsIHRydWUpOworICAgICAgICByZXR1cm4gbmV3IFRleHRIaXRJbmZvKG9mZnNldCAtIDEsIHRydWUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSAobGVhZGluZykgVGV4dEhpdEluZm8gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgY2hhcmFjdGVyIAorICAgICAqIFJldHVybnMgYSAobGVhZGluZykgVGV4dEhpdEluZm8gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgY2hhcmFjdGVyCiAgICAgICogYWZ0ZXIgdGhlIHNwZWNpZmllZCBvZmZzZXQuCiAgICAgICogCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIFRleHRIaXRJbmZvIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGNoYXJhY3RlciAKLSAgICAgKiBhZnRlciB0aGUgc3BlY2lmaWVkIG9mZnNldC4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0LgorICAgICAqIEByZXR1cm4gdGhlIFRleHRIaXRJbmZvIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGNoYXJhY3RlciBhZnRlciB0aGUKKyAgICAgKiAgICAgICAgIHNwZWNpZmllZCBvZmZzZXQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBUZXh0SGl0SW5mbyBhZnRlck9mZnNldChpbnQgb2Zmc2V0KSB7CiAgICAgICAgIHJldHVybiBuZXcgVGV4dEhpdEluZm8ob2Zmc2V0LCBmYWxzZSk7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZm9udC9UZXh0TGF5b3V0LmphdmEgYi9hd3QvamF2YS9hd3QvZm9udC9UZXh0TGF5b3V0LmphdmEKaW5kZXggZTgwYWZkMC4uY2M2ZjBiYSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ZvbnQvVGV4dExheW91dC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9mb250L1RleHRMYXlvdXQuamF2YQpAQCAtMzksMTggKzM5LDE5IEBACiAKIC8qKgogICogVGhlIFRleHRMYXlvdXQgY2xhc3MgZGVmaW5lcyB0aGUgZ3JhcGhpY2FsIHJlcHJlc2VudGF0aW9uIG9mIGNoYXJhY3RlciBkYXRhLgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBtZXRob2QgZm9yIG9idGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCBjdXJzb3IgCi0gKiBwb3NpdGlvbmluZyBhbmQgbW92ZW1lbnQsIHNwbGl0IGN1cnNvcnMgZm9yIHRleHQgd2l0aCBkaWZmZXJlbnQgZGlyZWN0aW9ucywgCi0gKiBsb2dpY2FsIGFuZCB2aXN1YWwgaGlnaGxpZ2h0aW5nLCBtdWx0aXBsZSBiYXNlbGluZXMsIGhpdHMsIGp1c3RpZmljYXRpb24sIAotICogYXNjZW50LCBkZXNjZW50LCBhbmQgYWR2YW5jZSwgYW5kIHJlbmRlcmluZy4gQSBUZXh0TGF5b3V0IG9iamVjdCBjYW4gYmUgCi0gKiByZW5kZXJlZCB1c2luZyBHcmFwaGljcyBjb250ZXh0LiAKKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgbWV0aG9kIGZvciBvYnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgY3Vyc29yIHBvc2l0aW9uaW5nCisgKiBhbmQgbW92ZW1lbnQsIHNwbGl0IGN1cnNvcnMgZm9yIHRleHQgd2l0aCBkaWZmZXJlbnQgZGlyZWN0aW9ucywgbG9naWNhbCBhbmQKKyAqIHZpc3VhbCBoaWdobGlnaHRpbmcsIG11bHRpcGxlIGJhc2VsaW5lcywgaGl0cywganVzdGlmaWNhdGlvbiwgYXNjZW50LAorICogZGVzY2VudCwgYW5kIGFkdmFuY2UsIGFuZCByZW5kZXJpbmcuIEEgVGV4dExheW91dCBvYmplY3QgY2FuIGJlIHJlbmRlcmVkCisgKiB1c2luZyBHcmFwaGljcyBjb250ZXh0LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIFRleHRMYXlvdXQgaW1wbGVtZW50cyBDbG9uZWFibGUgewogCiAgICAgLyoqCi0gICAgICogVGhlIENhcmV0UG9saWN5IGNsYXNzIHByb3ZpZGVzIGEgcG9saWN5IGZvciBvYnRhaW5pbmcgdGhlIAotICAgICAqIGNhcmV0IGxvY2F0aW9uLiBUaGUgc2luZ2xlIGdldFN0cm9uZ0NhcmV0IG1ldGhvZCBzcGVjaWZpZXMgCi0gICAgICogdGhlIHBvbGljeS4KKyAgICAgKiBUaGUgQ2FyZXRQb2xpY3kgY2xhc3MgcHJvdmlkZXMgYSBwb2xpY3kgZm9yIG9idGFpbmluZyB0aGUgY2FyZXQgbG9jYXRpb24uCisgICAgICogVGhlIHNpbmdsZSBnZXRTdHJvbmdDYXJldCBtZXRob2Qgc3BlY2lmaWVzIHRoZSBwb2xpY3kuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDYXJldFBvbGljeSB7CiAKQEAgLTYyLDE0ICs2MywxNSBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgd2hpY2hldmVyIG9mIHRoZSB0d28gc3BlY2lmaWVkIFRleHRIaXRJbmZvIG9iamVjdHMgCi0gICAgICAgICAqIGhhcyB0aGUgc3Ryb25nZXIgY2FyZXQgKGhpZ2hlciBjaGFyYWN0ZXIgbGV2ZWwpIGluIHRoZSAKLSAgICAgICAgICogc3BlY2lmaWVkIFRleHRMYXlvdXQuCisgICAgICAgICAqIFJldHVybnMgd2hpY2hldmVyIG9mIHRoZSB0d28gc3BlY2lmaWVkIFRleHRIaXRJbmZvIG9iamVjdHMgaGFzIHRoZQorICAgICAgICAgKiBzdHJvbmdlciBjYXJldCAoaGlnaGVyIGNoYXJhY3RlciBsZXZlbCkgaW4gdGhlIHNwZWNpZmllZCBUZXh0TGF5b3V0LgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGhpdDEgdGhlIGZpcnN0IFRleHRIaXRJbmZvIG9mIHRoZSBzcGVjaWZpZWQgVGV4dExheW91dC4KLSAgICAgICAgICogQHBhcmFtIGhpdDIgdGhlIHNlY29uZCBUZXh0SGl0SW5mbyBvZiB0aGUgc3BlY2lmaWVkIFRleHRMYXlvdXQuCi0gICAgICAgICAqIEBwYXJhbSBsYXlvdXQgdGhlIFRleHRMYXlvdXQuCi0gICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0gaGl0MQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBUZXh0SGl0SW5mbyBvZiB0aGUgc3BlY2lmaWVkIFRleHRMYXlvdXQuCisgICAgICAgICAqIEBwYXJhbSBoaXQyCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHNlY29uZCBUZXh0SGl0SW5mbyBvZiB0aGUgc3BlY2lmaWVkIFRleHRMYXlvdXQuCisgICAgICAgICAqIEBwYXJhbSBsYXlvdXQKKyAgICAgICAgICogICAgICAgICAgICB0aGUgVGV4dExheW91dC4KICAgICAgICAgICogQHJldHVybiB0aGUgVGV4dEhpdEluZm8gd2l0aCB0aGUgc3Ryb25nZXIgY2FyZXQuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgVGV4dEhpdEluZm8gZ2V0U3Ryb25nQ2FyZXQoVGV4dEhpdEluZm8gaGl0MSwgVGV4dEhpdEluZm8gaGl0MiwgVGV4dExheW91dCBsYXlvdXQpIHsKQEAgLTg3LDUwICs4OSw2NCBAQAogCiAgICAgfQogCi0gICAgLyoqIAorICAgIC8qKgogICAgICAqIFRoZSBDb25zdGFudCBERUZBVUxUX0NBUkVUX1BPTElDWSBpbmRpY2F0ZXMgdGhlIGRlZmF1bHQgY2FyZXQgcG9saWN5LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVGV4dExheW91dC5DYXJldFBvbGljeSBERUZBVUxUX0NBUkVUX1BPTElDWSA9IG5ldyBDYXJldFBvbGljeSgpOwogCi0gICAgLyoqIFRoZSBicmVha2VyLiAqLworICAgIC8qKgorICAgICAqIFRoZSBicmVha2VyLgorICAgICAqLwogICAgIHByaXZhdGUgVGV4dFJ1bkJyZWFrZXIgYnJlYWtlcjsKLSAgICAKLSAgICAvKiogVGhlIG1ldHJpY3MgdmFsaWQuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgbWV0cmljcyB2YWxpZC4KKyAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gbWV0cmljc1ZhbGlkID0gZmFsc2U7Ci0gICAgCi0gICAgLyoqIFRoZSB0bWMuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgdG1jLgorICAgICAqLwogICAgIHByaXZhdGUgVGV4dE1ldHJpY3NDYWxjdWxhdG9yIHRtYzsKLSAgICAKLSAgICAvKiogVGhlIG1ldHJpY3MuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgbWV0cmljcy4KKyAgICAgKi8KICAgICBwcml2YXRlIEJhc2ljTWV0cmljcyBtZXRyaWNzOwotICAgIAotICAgIC8qKiBUaGUgY2FyZXQgbWFuYWdlci4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBjYXJldCBtYW5hZ2VyLgorICAgICAqLwogICAgIHByaXZhdGUgQ2FyZXRNYW5hZ2VyIGNhcmV0TWFuYWdlcjsKLSAgICAKLSAgICAvKiogVGhlIGp1c3RpZmljYXRpb24gd2lkdGguICovCisKKyAgICAvKioKKyAgICAgKiBUaGUganVzdGlmaWNhdGlvbiB3aWR0aC4KKyAgICAgKi8KICAgICBmbG9hdCBqdXN0aWZpY2F0aW9uV2lkdGggPSAtMTsKIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBUZXh0TGF5b3V0IG9iamVjdCBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nCi0gICAgICogYW5kIEZvbnQuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IFRleHRMYXlvdXQgb2JqZWN0IGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIEZvbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHN0cmluZyB0aGUgc3RyaW5nIHRvIGJlIGRpc3BsYXllZC4KLSAgICAgKiBAcGFyYW0gZm9udCB0aGUgZm9udCBvZiB0aGUgdGV4dC4KLSAgICAgKiBAcGFyYW0gZnJjIHRoZSBGb250UmVuZGVyQ29udGV4dCBvYmplY3QgZm9yIG9idGFpbmluZwotICAgICAqIGluZm9ybWF0aW9uIGFib3V0IGEgZ3JhcGhpY3MgZGV2aWNlLgorICAgICAqIEBwYXJhbSBzdHJpbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gYmUgZGlzcGxheWVkLgorICAgICAqIEBwYXJhbSBmb250CisgICAgICogICAgICAgICAgICB0aGUgZm9udCBvZiB0aGUgdGV4dC4KKyAgICAgKiBAcGFyYW0gZnJjCisgICAgICogICAgICAgICAgICB0aGUgRm9udFJlbmRlckNvbnRleHQgb2JqZWN0IGZvciBvYnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgYQorICAgICAqICAgICAgICAgICAgZ3JhcGhpY3MgZGV2aWNlLgogICAgICAqLwogICAgIHB1YmxpYyBUZXh0TGF5b3V0KFN0cmluZyBzdHJpbmcsIEZvbnQgZm9udCwgRm9udFJlbmRlckNvbnRleHQgZnJjKSB7Ci0gICAgICAgIGlmIChzdHJpbmcgPT0gbnVsbCl7CisgICAgICAgIGlmIChzdHJpbmcgPT0gbnVsbCkgewogICAgICAgICAgICAgLy8gYXd0LjAxPSd7MH0nIHBhcmFtZXRlciBpcyBudWxsCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjAxIiwgInN0cmluZyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChmb250ID09IG51bGwpeworCisgICAgICAgIGlmIChmb250ID09IG51bGwpIHsKICAgICAgICAgICAgIC8vIGF3dC4wMT0nezB9JyBwYXJhbWV0ZXIgaXMgbnVsbAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4wMSIsICJmb250IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKICAgICAgICAgfQogCi0gICAgICAgIGlmIChzdHJpbmcubGVuZ3RoKCkgPT0gMCl7CisgICAgICAgIGlmIChzdHJpbmcubGVuZ3RoKCkgPT0gMCkgewogICAgICAgICAgICAgLy8gYXd0LjAyPSd7MH0nIHBhcmFtZXRlciBoYXMgemVybyBsZW5ndGgKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMDIiLCAic3RyaW5nIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKICAgICAgICAgfQpAQCAtMTQyLDM1ICsxNTgsMzUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgVGV4dExheW91dCBmcm9tIHRoZSBzcGVjaWZpZWQgdGV4dCBhbmQgCi0gICAgICogYSBtYXAgb2YgYXR0cmlidXRlcy4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgVGV4dExheW91dCBmcm9tIHRoZSBzcGVjaWZpZWQgdGV4dCBhbmQgYSBtYXAgb2YKKyAgICAgKiBhdHRyaWJ1dGVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzdHJpbmcgdGhlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWQuCi0gICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgdGhlIGF0dHJpYnV0ZXMgdG8gYmUgdXNlZCBmb3Igb2J0YWluaW5nIHRoZSB0ZXh0IAotICAgICAqIHN0eWxlLgotICAgICAqIEBwYXJhbSBmcmMgdGhlIEZvbnRSZW5kZXJDb250ZXh0IG9iamVjdCBmb3Igb2J0YWluaW5nCi0gICAgICogaW5mb3JtYXRpb24gYWJvdXQgYSBncmFwaGljcyBkZXZpY2UuCisgICAgICogQHBhcmFtIHN0cmluZworICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWQuCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhdHRyaWJ1dGVzIHRvIGJlIHVzZWQgZm9yIG9idGFpbmluZyB0aGUgdGV4dCBzdHlsZS4KKyAgICAgKiBAcGFyYW0gZnJjCisgICAgICogICAgICAgICAgICB0aGUgRm9udFJlbmRlckNvbnRleHQgb2JqZWN0IGZvciBvYnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgYQorICAgICAqICAgICAgICAgICAgZ3JhcGhpY3MgZGV2aWNlLgogICAgICAqLwotICAgIHB1YmxpYyBUZXh0TGF5b3V0KAotICAgICAgICAgICAgU3RyaW5nIHN0cmluZywKKyAgICBwdWJsaWMgVGV4dExheW91dChTdHJpbmcgc3RyaW5nLAogICAgICAgICAgICAgTWFwPD8gZXh0ZW5kcyBqYXZhLnRleHQuQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yLkF0dHJpYnV0ZSwgPz4gYXR0cmlidXRlcywKLSAgICAgICAgICAgIEZvbnRSZW5kZXJDb250ZXh0IGZyYyApIHsKLSAgICAgICAgaWYgKHN0cmluZyA9PSBudWxsKXsKKyAgICAgICAgICAgIEZvbnRSZW5kZXJDb250ZXh0IGZyYykgeworICAgICAgICBpZiAoc3RyaW5nID09IG51bGwpIHsKICAgICAgICAgICAgIC8vIGF3dC4wMT0nezB9JyBwYXJhbWV0ZXIgaXMgbnVsbAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4wMSIsICJzdHJpbmciKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoYXR0cmlidXRlcyA9PSBudWxsKXsKKworICAgICAgICBpZiAoYXR0cmlidXRlcyA9PSBudWxsKSB7CiAgICAgICAgICAgICAvLyBhd3QuMDE9J3swfScgcGFyYW1ldGVyIGlzIG51bGwKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMDEiLCAiYXR0cmlidXRlcyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChzdHJpbmcubGVuZ3RoKCkgPT0gMCl7CisKKyAgICAgICAgaWYgKHN0cmluZy5sZW5ndGgoKSA9PSAwKSB7CiAgICAgICAgICAgICAvLyBhd3QuMDI9J3swfScgcGFyYW1ldGVyIGhhcyB6ZXJvIGxlbmd0aAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4wMiIsICJzdHJpbmciKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAKKwogICAgICAgICBBdHRyaWJ1dGVkU3RyaW5nIGFzID0gbmV3IEF0dHJpYnV0ZWRTdHJpbmcoc3RyaW5nKTsKICAgICAgICAgYXMuYWRkQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCAwLCBzdHJpbmcubGVuZ3RoKCkpOwogICAgICAgICB0aGlzLmJyZWFrZXIgPSBuZXcgVGV4dFJ1bkJyZWFrZXIoYXMuZ2V0SXRlcmF0b3IoKSwgZnJjKTsKQEAgLTE4MCwxNyArMTk2LDE5IEBACiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IFRleHRMYXlvdXQgZnJvbSB0aGUgQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0ZXh0IHRoZSBBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IuCi0gICAgICogQHBhcmFtIGZyYyB0aGUgRm9udFJlbmRlckNvbnRleHQgb2JqZWN0IGZvciBvYnRhaW5pbmcKLSAgICAgKiBpbmZvcm1hdGlvbiBhYm91dCBhIGdyYXBoaWNzIGRldmljZS4KKyAgICAgKiBAcGFyYW0gdGV4dAorICAgICAqICAgICAgICAgICAgdGhlIEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvci4KKyAgICAgKiBAcGFyYW0gZnJjCisgICAgICogICAgICAgICAgICB0aGUgRm9udFJlbmRlckNvbnRleHQgb2JqZWN0IGZvciBvYnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgYQorICAgICAqICAgICAgICAgICAgZ3JhcGhpY3MgZGV2aWNlLgogICAgICAqLwogICAgIHB1YmxpYyBUZXh0TGF5b3V0KEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciB0ZXh0LCBGb250UmVuZGVyQ29udGV4dCBmcmMpIHsKLSAgICAgICAgaWYgKHRleHQgPT0gbnVsbCl7CisgICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHsKICAgICAgICAgICAgIC8vIGF3dC4wMz0nezB9JyBpdGVyYXRvciBwYXJhbWV0ZXIgaXMgbnVsbAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4wMyIsICJ0ZXh0IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHRleHQuZ2V0QmVnaW5JbmRleCgpID09IHRleHQuZ2V0RW5kSW5kZXgoKSl7CisKKyAgICAgICAgaWYgKHRleHQuZ2V0QmVnaW5JbmRleCgpID09IHRleHQuZ2V0RW5kSW5kZXgoKSkgewogICAgICAgICAgICAgLy8gYXd0LjA0PSd7MH0nIGl0ZXJhdG9yIHBhcmFtZXRlciBoYXMgemVybyBsZW5ndGgKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMDQiLCAidGV4dCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAgICAgICAgIH0KQEAgLTIwMiw3ICsyMjAsOCBAQAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyB0ZXh0IGxheW91dC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYnJlYWtlciB0aGUgYnJlYWtlcgorICAgICAqIEBwYXJhbSBicmVha2VyCisgICAgICogICAgICAgICAgICB0aGUgYnJlYWtlci4KICAgICAgKi8KICAgICBUZXh0TGF5b3V0KFRleHRSdW5CcmVha2VyIGJyZWFrZXIpIHsKICAgICAgICAgdGhpcy5icmVha2VyID0gYnJlYWtlcjsKQEAgLTIyNiw3ICsyNDUsNyBAQAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBPYmplY3QgY2xvbmUoKSB7Ci0gICAgICAgIFRleHRMYXlvdXQgcmVzID0gbmV3IFRleHRMYXlvdXQoKFRleHRSdW5CcmVha2VyKSBicmVha2VyLmNsb25lKCkpOworICAgICAgICBUZXh0TGF5b3V0IHJlcyA9IG5ldyBUZXh0TGF5b3V0KChUZXh0UnVuQnJlYWtlcilicmVha2VyLmNsb25lKCkpOwogCiAgICAgICAgIGlmIChqdXN0aWZpY2F0aW9uV2lkdGggPj0gMCkgewogICAgICAgICAgICAgcmVzLmhhbmRsZUp1c3RpZnkoanVzdGlmaWNhdGlvbldpZHRoKTsKQEAgLTIzOCwxMCArMjU3LDEwIEBACiAgICAgLyoqCiAgICAgICogQ29tcGFyZXMgdGhpcyBUZXh0TGF5b3V0IG9iamVjdCB0byB0aGUgc3BlY2lmaWVkIFRleHRMYXlvdXQgb2JqZWN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBsYXlvdXQgdGhlIFRleHRMYXlvdXQgb2JqZWN0IHRvIGJlIGNvbXBhcmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBUZXh0TGF5b3V0IG9iamVjdCBpcyBlcXVhbCB0byAKLSAgICAgKiB0aGUgc3BlY2lmaWVkIFRleHRMYXlvdXQgb2JqZWN0LCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIGxheW91dAorICAgICAqICAgICAgICAgICAgdGhlIFRleHRMYXlvdXQgb2JqZWN0IHRvIGJlIGNvbXBhcmVkLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBUZXh0TGF5b3V0IG9iamVjdCBpcyBlcXVhbCB0byB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICBUZXh0TGF5b3V0IG9iamVjdCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhUZXh0TGF5b3V0IGxheW91dCkgewogICAgICAgICBpZiAobGF5b3V0ID09IG51bGwpIHsKQEAgLTI1MywxNCArMjcyLDE0IEBACiAgICAgLyoqCiAgICAgICogQ29tcGFyZXMgdGhpcyBUZXh0TGF5b3V0IG9iamVjdCB0byB0aGUgc3BlY2lmaWVkIE9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqIHRoZSBPYmplY3QgdG8gYmUgY29tcGFyZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGlzIFRleHRMYXlvdXQgb2JqZWN0IGlzIGVxdWFsIHRvIAotICAgICAqIHRoZSBzcGVjaWZpZWQgT2JqZWN0LCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIG9iagorICAgICAqICAgICAgICAgICAgdGhlIE9iamVjdCB0byBiZSBjb21wYXJlZC4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgVGV4dExheW91dCBvYmplY3QgaXMgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCBPYmplY3QsCisgICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFRleHRMYXlvdXQgPyBlcXVhbHMoKFRleHRMYXlvdXQpIG9iaikgOiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFRleHRMYXlvdXQgPyBlcXVhbHMoKFRleHRMYXlvdXQpb2JqKSA6IGZhbHNlOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjc0LDE2ICsyOTMsMTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBEcmF3cyB0aGlzIFRleHRMYXlvdXQgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbiB3aXRoIHRoZSAKLSAgICAgKiBzcGVjaWZpZWQgR3JhcGhpY3MyRCBjb250ZXh0LiAKKyAgICAgKiBEcmF3cyB0aGlzIFRleHRMYXlvdXQgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBHcmFwaGljczJEIGNvbnRleHQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGcyZCB0aGUgR3JhcGhpY3MyRCBvYmplY3Qgd2hpY2ggcmVuZGVycyB0aGlzIFRleHRMYXlvdXQuCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgVGV4dExheW91dCBvcmlnaW4uIAotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIFRleHRMYXlvdXQgb3JpZ2luLgorICAgICAqIEBwYXJhbSBnMmQKKyAgICAgKiAgICAgICAgICAgIHRoZSBHcmFwaGljczJEIG9iamVjdCB3aGljaCByZW5kZXJzIHRoaXMgVGV4dExheW91dC4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgVGV4dExheW91dCBvcmlnaW4uCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIFRleHRMYXlvdXQgb3JpZ2luLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRyYXcoR3JhcGhpY3MyRCBnMmQsIGZsb2F0IHgsIGZsb2F0IHkpIHsKICAgICAgICAgdXBkYXRlTWV0cmljcygpOwotICAgICAgICBicmVha2VyLmRyYXdTZWdtZW50cyhnMmQsIHggLHkpOworICAgICAgICBicmVha2VyLmRyYXdTZWdtZW50cyhnMmQsIHgsIHkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzI1LDE1ICszNDcsMTUgQEAKICAgICAgKi8KICAgICBwdWJsaWMgYnl0ZSBnZXRCYXNlbGluZSgpIHsKICAgICAgICAgdXBkYXRlTWV0cmljcygpOwotICAgICAgICByZXR1cm4gKGJ5dGUpIG1ldHJpY3MuZ2V0QmFzZUxpbmVJbmRleCgpOworICAgICAgICByZXR1cm4gKGJ5dGUpbWV0cmljcy5nZXRCYXNlTGluZUluZGV4KCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgZmxvYXQgYXJyYXkgb2Ygb2Zmc2V0cyBmb3IgdGhlIGJhc2VsaW5lcyB3aGljaCAKLSAgICAgKiBhcmUgdXNlZCBpbiB0aGlzIFRleHRMYXlvdXQuCisgICAgICogR2V0cyB0aGUgZmxvYXQgYXJyYXkgb2Ygb2Zmc2V0cyBmb3IgdGhlIGJhc2VsaW5lcyB3aGljaCBhcmUgdXNlZCBpbiB0aGlzCisgICAgICogVGV4dExheW91dC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBmbG9hdCBhcnJheSBvZiBvZmZzZXRzIGZvciB0aGUgYmFzZWxpbmVzIHdoaWNoIAotICAgICAqIGFyZSB1c2VkIGluIHRoaXMgVGV4dExheW91dC4KKyAgICAgKiBAcmV0dXJuIHRoZSBmbG9hdCBhcnJheSBvZiBvZmZzZXRzIGZvciB0aGUgYmFzZWxpbmVzIHdoaWNoIGFyZSB1c2VkIGluCisgICAgICogICAgICAgICB0aGlzIFRleHRMYXlvdXQuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0W10gZ2V0QmFzZWxpbmVPZmZzZXRzKCkgewogICAgICAgICB1cGRhdGVNZXRyaWNzKCk7CkBAIC0zNDEsMTQgKzM2MywxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGJsYWNrIGJveCBib3VuZHMgb2YgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHNwZWNpZmllZCBhcmVhLiAKLSAgICAgKiBUaGUgYmxhY2sgYm94IGJvdW5kcyBpcyBhbiBTaGFwZSB3aGljaCBjb250YWlucyBhbGwgCi0gICAgICogYm91bmRpbmcgYm94ZXMgb2YgYWxsIHRoZSBnbHlwaHMgb2YgdGhlIGNoYXJhY3RlcnMgCi0gICAgICogYmV0d2VlbiBmaXJzdEVuZHBvaW50IGFuZCBzZWNvbmRFbmRwb2ludCBwYXJhbWV0ZXJzIHZhbHVlcy4gICAgIAotICAgICAqICAKLSAgICAgKiBAcGFyYW0gZmlyc3RFbmRwb2ludCB0aGUgZmlyc3QgcG9pbnQgb2YgdGhlIGFyZWEuCi0gICAgICogQHBhcmFtIHNlY29uZEVuZHBvaW50IHRoZSBzZWNvbmQgcG9pbnQgb2YgdGhlIGFyZWEuCisgICAgICogR2V0cyB0aGUgYmxhY2sgYm94IGJvdW5kcyBvZiB0aGUgY2hhcmFjdGVycyBpbiB0aGUgc3BlY2lmaWVkIGFyZWEuIFRoZQorICAgICAqIGJsYWNrIGJveCBib3VuZHMgaXMgYW4gU2hhcGUgd2hpY2ggY29udGFpbnMgYWxsIGJvdW5kaW5nIGJveGVzIG9mIGFsbCB0aGUKKyAgICAgKiBnbHlwaHMgb2YgdGhlIGNoYXJhY3RlcnMgYmV0d2VlbiBmaXJzdEVuZHBvaW50IGFuZCBzZWNvbmRFbmRwb2ludAorICAgICAqIHBhcmFtZXRlcnMgdmFsdWVzLgogICAgICAqIAorICAgICAqIEBwYXJhbSBmaXJzdEVuZHBvaW50CisgICAgICogICAgICAgICAgICB0aGUgZmlyc3QgcG9pbnQgb2YgdGhlIGFyZWEuCisgICAgICogQHBhcmFtIHNlY29uZEVuZHBvaW50CisgICAgICogICAgICAgICAgICB0aGUgc2Vjb25kIHBvaW50IG9mIHRoZSBhcmVhLgogICAgICAqIEByZXR1cm4gdGhlIFNoYXBlIHdoaWNoIGNvbnRhaW5zIGJsYWNrIGJveCBib3VuZHMuCiAgICAgICovCiAgICAgcHVibGljIFNoYXBlIGdldEJsYWNrQm94Qm91bmRzKGludCBmaXJzdEVuZHBvaW50LCBpbnQgc2Vjb25kRW5kcG9pbnQpIHsKQEAgLTM3Miw4ICszOTUsOCBAQAogICAgIC8qKgogICAgICAqIEdldHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNhcmV0IG9mIHRoZSBzcGVjaWZpZWQgVGV4dEhpdEluZm8uCiAgICAgICogCi0gICAgICogQHBhcmFtIGhpdEluZm8gdGhlIFRleHRIaXRJbmZvLgotICAgICAqIAorICAgICAqIEBwYXJhbSBoaXRJbmZvCisgICAgICogICAgICAgICAgICB0aGUgVGV4dEhpdEluZm8uCiAgICAgICogQHJldHVybiB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNhcmV0IG9mIHRoZSBzcGVjaWZpZWQgVGV4dEhpdEluZm8uCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0W10gZ2V0Q2FyZXRJbmZvKFRleHRIaXRJbmZvIGhpdEluZm8pIHsKQEAgLTM4MiwxMiArNDA1LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2FyZXQgb2YgdGhlIHNwZWNpZmllZCBUZXh0SGl0SW5mbwotICAgICAqIG9mIGEgY2hhcmFjdGVyIGluIHRoaXMgVGV4dExheW91dC4KKyAgICAgKiBHZXRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjYXJldCBvZiB0aGUgc3BlY2lmaWVkIFRleHRIaXRJbmZvIG9mIGEKKyAgICAgKiBjaGFyYWN0ZXIgaW4gdGhpcyBUZXh0TGF5b3V0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBoaXRJbmZvIHRoZSBUZXh0SGl0SW5mbyBvZiBhIGNoYXJhY3RlciBpbiB0aGlzIFRleHRMYXlvdXQuCi0gICAgICogQHBhcmFtIGJvdW5kcyB0aGUgYm91bmRzIHRvIHdoaWNoIHRoZSBjYXJldCBpbmZvIGlzIGNvbnN0cnVjdGVkLgotICAgICAqIAorICAgICAqIEBwYXJhbSBoaXRJbmZvCisgICAgICogICAgICAgICAgICB0aGUgVGV4dEhpdEluZm8gb2YgYSBjaGFyYWN0ZXIgaW4gdGhpcyBUZXh0TGF5b3V0LgorICAgICAqIEBwYXJhbSBib3VuZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBib3VuZHMgdG8gd2hpY2ggdGhlIGNhcmV0IGluZm8gaXMgY29uc3RydWN0ZWQuCiAgICAgICogQHJldHVybiB0aGUgY2FyZXQgb2YgdGhlIHNwZWNpZmllZCBUZXh0SGl0SW5mby4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXRbXSBnZXRDYXJldEluZm8oVGV4dEhpdEluZm8gaGl0SW5mbywgUmVjdGFuZ2xlMkQgYm91bmRzKSB7CkBAIC0zOTYsMTIgKzQyMCwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYSBTaGFwZSB3aGljaCByZXByZXNlbnRzIHRoZSBjYXJldCBvZiB0aGUgc3BlY2lmaWVkIFRleHRIaXRJbmZvCi0gICAgICogaW4gdGhlIGJvdW5kcyBvZiB0aGlzIFRleHRMYXlvdXQuCisgICAgICogR2V0cyBhIFNoYXBlIHdoaWNoIHJlcHJlc2VudHMgdGhlIGNhcmV0IG9mIHRoZSBzcGVjaWZpZWQgVGV4dEhpdEluZm8gaW4KKyAgICAgKiB0aGUgYm91bmRzIG9mIHRoaXMgVGV4dExheW91dC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaGl0SW5mbyB0aGUgVGV4dEhpdEluZm8uCi0gICAgICogQHBhcmFtIGJvdW5kcyB0aGUgYm91bmRzIHRvIHdoaWNoIHRoZSBjYXJldCBpbmZvIGlzIGNvbnN0cnVjdGVkLgotICAgICAqIAorICAgICAqIEBwYXJhbSBoaXRJbmZvCisgICAgICogICAgICAgICAgICB0aGUgVGV4dEhpdEluZm8uCisgICAgICogQHBhcmFtIGJvdW5kcworICAgICAqICAgICAgICAgICAgdGhlIGJvdW5kcyB0byB3aGljaCB0aGUgY2FyZXQgaW5mbyBpcyBjb25zdHJ1Y3RlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBTaGFwZSB3aGljaCByZXByZXNlbnRzIHRoZSBjYXJldC4KICAgICAgKi8KICAgICBwdWJsaWMgU2hhcGUgZ2V0Q2FyZXRTaGFwZShUZXh0SGl0SW5mbyBoaXRJbmZvLCBSZWN0YW5nbGUyRCBib3VuZHMpIHsKQEAgLTQxMCwxMSArNDM1LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhIFNoYXBlIHdoaWNoIHJlcHJlc2VudHMgdGhlIGNhcmV0IG9mIHRoZSBzcGVjaWZpZWQgVGV4dEhpdEluZm8KLSAgICAgKiBpbiB0aGUgYm91bmRzIG9mIHRoaXMgVGV4dExheW91dC4KKyAgICAgKiBHZXRzIGEgU2hhcGUgd2hpY2ggcmVwcmVzZW50cyB0aGUgY2FyZXQgb2YgdGhlIHNwZWNpZmllZCBUZXh0SGl0SW5mbyBpbgorICAgICAqIHRoZSBib3VuZHMgb2YgdGhpcyBUZXh0TGF5b3V0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBoaXRJbmZvIHRoZSBUZXh0SGl0SW5mby4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaGl0SW5mbworICAgICAqICAgICAgICAgICAgdGhlIFRleHRIaXRJbmZvLgogICAgICAqIEByZXR1cm4gdGhlIFNoYXBlIHdoaWNoIHJlcHJlc2VudHMgdGhlIGNhcmV0LgogICAgICAqLwogICAgIHB1YmxpYyBTaGFwZSBnZXRDYXJldFNoYXBlKFRleHRIaXRJbmZvIGhpdEluZm8pIHsKQEAgLTQyMyw0NSArNDQ4LDQ3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0d28gU2hhcGVzIGZvciB0aGUgc3Ryb25nIGFuZCB3ZWFrIGNhcmV0cyB3aXRoCi0gICAgICogZGVmYXVsdCBjYXJldCBwb2xpY3kgYW5kIG51bGwgYm91bmRzOiB0aGUgZmlyc3QgZWxlbWVudCAKLSAgICAgKiBpcyB0aGUgc3Ryb25nIGNhcmV0LCB0aGUgc2Vjb25kIGlzIHRoZSB3ZWFrIGNhcmV0IG9yIG51bGwuIAorICAgICAqIEdldHMgdHdvIFNoYXBlcyBmb3IgdGhlIHN0cm9uZyBhbmQgd2VhayBjYXJldHMgd2l0aCBkZWZhdWx0IGNhcmV0IHBvbGljeQorICAgICAqIGFuZCBudWxsIGJvdW5kczogdGhlIGZpcnN0IGVsZW1lbnQgaXMgdGhlIHN0cm9uZyBjYXJldCwgdGhlIHNlY29uZCBpcyB0aGUKKyAgICAgKiB3ZWFrIGNhcmV0IG9yIG51bGwuCiAgICAgICogCi0gICAgICogQHBhcmFtIG9mZnNldCBhbiBvZmZzZXQgaW4gdGhlIFRleHRMYXlvdXQuCi0gICAgICogCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiB0d28gU2hhcGVzIGNvcnJlc3BvbmRlZCB0byB0aGUgc3Ryb25nCi0gICAgICogYW5kIHdlYWsgY2FyZXRzLgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIGFuIG9mZnNldCBpbiB0aGUgVGV4dExheW91dC4KKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHR3byBTaGFwZXMgY29ycmVzcG9uZGVkIHRvIHRoZSBzdHJvbmcgYW5kIHdlYWsKKyAgICAgKiAgICAgICAgIGNhcmV0cy4KICAgICAgKi8KICAgICBwdWJsaWMgU2hhcGVbXSBnZXRDYXJldFNoYXBlcyhpbnQgb2Zmc2V0KSB7CiAgICAgICAgIHJldHVybiBnZXRDYXJldFNoYXBlcyhvZmZzZXQsIG51bGwsIFRleHRMYXlvdXQuREVGQVVMVF9DQVJFVF9QT0xJQ1kpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdHdvIFNoYXBlcyBmb3IgdGhlIHN0cm9uZyBhbmQgd2VhayBjYXJldHMgd2l0aAotICAgICAqIHRoZSBkZWZhdWx0IGNhcmV0IHBvbGljeTogdGhlIGZpcnN0IGVsZW1lbnQgaXMgdGhlIHN0cm9uZyAKLSAgICAgKiBjYXJldCwgdGhlIHNlY29uZCBpcyB0aGUgd2VhayBjYXJldCBvciBudWxsLgorICAgICAqIEdldHMgdHdvIFNoYXBlcyBmb3IgdGhlIHN0cm9uZyBhbmQgd2VhayBjYXJldHMgd2l0aCB0aGUgZGVmYXVsdCBjYXJldAorICAgICAqIHBvbGljeTogdGhlIGZpcnN0IGVsZW1lbnQgaXMgdGhlIHN0cm9uZyBjYXJldCwgdGhlIHNlY29uZCBpcyB0aGUgd2VhaworICAgICAqIGNhcmV0IG9yIG51bGwuCiAgICAgICogCi0gICAgICogQHBhcmFtIG9mZnNldCBhbiBvZmZzZXQgaW4gdGhlIFRleHRMYXlvdXQuCi0gICAgICogQHBhcmFtIGJvdW5kcyB0aGUgYm91bmRzIHRvIHdoaWNoIHRvIGV4dGVuZCB0aGUgY2FyZXRzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdHdvIFNoYXBlcyBjb3JyZXNwb25kZWQgdG8gdGhlIHN0cm9uZwotICAgICAqIGFuZCB3ZWFrIGNhcmV0cy4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICBhbiBvZmZzZXQgaW4gdGhlIFRleHRMYXlvdXQuCisgICAgICogQHBhcmFtIGJvdW5kcworICAgICAqICAgICAgICAgICAgdGhlIGJvdW5kcyB0byB3aGljaCB0byBleHRlbmQgdGhlIGNhcmV0cy4KKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHR3byBTaGFwZXMgY29ycmVzcG9uZGVkIHRvIHRoZSBzdHJvbmcgYW5kIHdlYWsKKyAgICAgKiAgICAgICAgIGNhcmV0cy4KICAgICAgKi8KICAgICBwdWJsaWMgU2hhcGVbXSBnZXRDYXJldFNoYXBlcyhpbnQgb2Zmc2V0LCBSZWN0YW5nbGUyRCBib3VuZHMpIHsKICAgICAgICAgcmV0dXJuIGdldENhcmV0U2hhcGVzKG9mZnNldCwgYm91bmRzLCBUZXh0TGF5b3V0LkRFRkFVTFRfQ0FSRVRfUE9MSUNZKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHR3byBTaGFwZXMgZm9yIHRoZSBzdHJvbmcgYW5kIHdlYWsgY2FyZXRzOiB0aGUgZmlyc3QKLSAgICAgKiBlbGVtZW50IGlzIHRoZSBzdHJvbmcgY2FyZXQsIHRoZSBzZWNvbmQgaXMgdGhlIHdlYWsgY2FyZXQgCi0gICAgICogb3IgbnVsbC4KKyAgICAgKiBHZXRzIHR3byBTaGFwZXMgZm9yIHRoZSBzdHJvbmcgYW5kIHdlYWsgY2FyZXRzOiB0aGUgZmlyc3QgZWxlbWVudCBpcyB0aGUKKyAgICAgKiBzdHJvbmcgY2FyZXQsIHRoZSBzZWNvbmQgaXMgdGhlIHdlYWsgY2FyZXQgb3IgbnVsbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2Zmc2V0IGFuIG9mZnNldCBpbiB0aGUgVGV4dExheW91dC4KLSAgICAgKiBAcGFyYW0gYm91bmRzIHRoZSBib3VuZHMgdG8gd2hpY2ggdG8gZXh0ZW5kIHRoZSBjYXJldHMuCi0gICAgICogQHBhcmFtIHBvbGljeSB0aGUgc3BlY2lmaWVkIENhcmV0UG9saWN5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdHdvIFNoYXBlcyBjb3JyZXNwb25kZWQgdG8gdGhlIHN0cm9uZwotICAgICAqIGFuZCB3ZWFrIGNhcmV0cy4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICBhbiBvZmZzZXQgaW4gdGhlIFRleHRMYXlvdXQuCisgICAgICogQHBhcmFtIGJvdW5kcworICAgICAqICAgICAgICAgICAgdGhlIGJvdW5kcyB0byB3aGljaCB0byBleHRlbmQgdGhlIGNhcmV0cy4KKyAgICAgKiBAcGFyYW0gcG9saWN5CisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIENhcmV0UG9saWN5LgorICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdHdvIFNoYXBlcyBjb3JyZXNwb25kZWQgdG8gdGhlIHN0cm9uZyBhbmQgd2VhaworICAgICAqICAgICAgICAgY2FyZXRzLgogICAgICAqLwogICAgIHB1YmxpYyBTaGFwZVtdIGdldENhcmV0U2hhcGVzKGludCBvZmZzZXQsIFJlY3RhbmdsZTJEIGJvdW5kcywgVGV4dExheW91dC5DYXJldFBvbGljeSBwb2xpY3kpIHsKICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID4gYnJlYWtlci5nZXRDaGFyQ291bnQoKSkgewpAQCAtNDgzLDE1ICs1MTAsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsZXZlbCBvZiB0aGUgY2hhcmFjdGVyIHdpdGggdGhlIHNwZWNpZmllZCBpbmRleC4gCi0gICAgICogIAotICAgICAqIEBwYXJhbSBpbmRleCB0aGUgc3BlY2lmaWVkIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIuCisgICAgICogR2V0cyB0aGUgbGV2ZWwgb2YgdGhlIGNoYXJhY3RlciB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXguCiAgICAgICogCisgICAgICogQHBhcmFtIGluZGV4CisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIuCiAgICAgICogQHJldHVybiB0aGUgbGV2ZWwgb2YgdGhlIGNoYXJhY3Rlci4KICAgICAgKi8KICAgICBwdWJsaWMgYnl0ZSBnZXRDaGFyYWN0ZXJMZXZlbChpbnQgaW5kZXgpIHsKICAgICAgICAgaWYgKGluZGV4ID09IC0xIHx8IGluZGV4ID09IGdldENoYXJhY3RlckNvdW50KCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoYnl0ZSkgYnJlYWtlci5nZXRCYXNlTGV2ZWwoKTsKKyAgICAgICAgICAgIHJldHVybiAoYnl0ZSlicmVha2VyLmdldEJhc2VMZXZlbCgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBicmVha2VyLmdldExldmVsKGluZGV4KTsKICAgICB9CkBAIC01MDcsMTYgKzUzNCwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIFRleHRMYXlvdXQgd2ljaCBpcyBqdXN0aWZpZWQgd2l0aCB0aGUgc3BlY2lmaWVkCi0gICAgICogd2lkdGggcmVsYXRlZCB0byB0aGlzIFRleHRMYXlvdXQuCisgICAgICogR2V0cyB0aGUgVGV4dExheW91dCB3aWNoIGlzIGp1c3RpZmllZCB3aXRoIHRoZSBzcGVjaWZpZWQgd2lkdGggcmVsYXRlZCB0bworICAgICAqIHRoaXMgVGV4dExheW91dC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0ganVzdGlmaWNhdGlvbldpZHRoIHRoZSB3aWR0aCB3aGljaCBpcyB1c2VkIAotICAgICAqIGZvciBqdXN0aWZpY2F0aW9uLgotICAgICAqIAorICAgICAqIEBwYXJhbSBqdXN0aWZpY2F0aW9uV2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCB3aGljaCBpcyB1c2VkIGZvciBqdXN0aWZpY2F0aW9uLgogICAgICAqIEByZXR1cm4gYSBUZXh0TGF5b3V0IGp1c3RpZmllZCB0byB0aGUgc3BlY2lmaWVkIHdpZHRoLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgRXJyb3IgdGhlIGVycm9yIG9jY3VyZXMgaWYgdGhpcyBUZXh0TGF5b3V0IGhhcyBiZWVuCi0gICAgICogYWxyZWFkeSBqdXN0aWZpZWQuCisgICAgICogQHRocm93cyBFcnJvcgorICAgICAqICAgICAgICAgICAgIHRoZSBlcnJvciBvY2N1cmVzIGlmIHRoaXMgVGV4dExheW91dCBoYXMgYmVlbiBhbHJlYWR5CisgICAgICogICAgICAgICAgICAganVzdGlmaWVkLgogICAgICAqLwogICAgIHB1YmxpYyBUZXh0TGF5b3V0IGdldEp1c3RpZmllZExheW91dChmbG9hdCBqdXN0aWZpY2F0aW9uV2lkdGgpIHRocm93cyBFcnJvciB7CiAgICAgICAgIGZsb2F0IGp1c3RpZmljYXRpb24gPSBicmVha2VyLmdldEp1c3RpZmljYXRpb24oKTsKQEAgLTUyOCw3ICs1NTQsNyBAQAogICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAotICAgICAgICBUZXh0TGF5b3V0IGp1c3RpZmllZExheW91dCA9IG5ldyBUZXh0TGF5b3V0KChUZXh0UnVuQnJlYWtlcikgYnJlYWtlci5jbG9uZSgpKTsKKyAgICAgICAgVGV4dExheW91dCBqdXN0aWZpZWRMYXlvdXQgPSBuZXcgVGV4dExheW91dCgoVGV4dFJ1bkJyZWFrZXIpYnJlYWtlci5jbG9uZSgpKTsKICAgICAgICAganVzdGlmaWVkTGF5b3V0LmhhbmRsZUp1c3RpZnkoanVzdGlmaWNhdGlvbldpZHRoKTsKICAgICAgICAgcmV0dXJuIGp1c3RpZmllZExheW91dDsKICAgICB9CkBAIC01NDQsMTUgKzU3MCwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYSBTaGFwZSByZXByZXNlbnRpbmcgdGhlIGxvZ2ljYWwgc2VsZWN0aW9uIGJldHdlZWVuIAotICAgICAqIHRoZSBzcGVjaWZpZWQgZW5kcG9pbnRzIGFuZCBleHRlbmRlZCB0byB0aGUgbmF0dXJhbCAKLSAgICAgKiBib3VuZHMgb2YgdGhpcyBUZXh0TGF5b3V0LgorICAgICAqIEdldHMgYSBTaGFwZSByZXByZXNlbnRpbmcgdGhlIGxvZ2ljYWwgc2VsZWN0aW9uIGJldHdlZWVuIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBlbmRwb2ludHMgYW5kIGV4dGVuZGVkIHRvIHRoZSBuYXR1cmFsIGJvdW5kcyBvZiB0aGlzIFRleHRMYXlvdXQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGZpcnN0RW5kcG9pbnQgdGhlIGZpcnN0IHNlbGVjdGVkIGVuZHBvaW50IHdpdGhpbiB0aGUgYXJlYSBvZiBjaGFyYWN0ZXJzCi0gICAgICogQHBhcmFtIHNlY29uZEVuZHBvaW50IHRoZSBzZWNvbmQgc2VsZWN0ZWQgZW5kcG9pbnQgd2l0aGluIHRoZSBhcmVhIG9mIGNoYXJhY3RlcnMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgU2hhcGUgcmVwcmVzZW50ZWQgdGhlIGxvZ2ljYWwgc2VsZWN0aW9uIGJldHdlZWVuIAotICAgICAqIHRoZSBzcGVjaWZpZWQgZW5kcG9pbnRzLgorICAgICAqIEBwYXJhbSBmaXJzdEVuZHBvaW50CisgICAgICogICAgICAgICAgICB0aGUgZmlyc3Qgc2VsZWN0ZWQgZW5kcG9pbnQgd2l0aGluIHRoZSBhcmVhIG9mIGNoYXJhY3RlcnMKKyAgICAgKiBAcGFyYW0gc2Vjb25kRW5kcG9pbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgc2VsZWN0ZWQgZW5kcG9pbnQgd2l0aGluIHRoZSBhcmVhIG9mIGNoYXJhY3RlcnMKKyAgICAgKiBAcmV0dXJuIGEgU2hhcGUgcmVwcmVzZW50ZWQgdGhlIGxvZ2ljYWwgc2VsZWN0aW9uIGJldHdlZWVuIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgIGVuZHBvaW50cy4KICAgICAgKi8KICAgICBwdWJsaWMgU2hhcGUgZ2V0TG9naWNhbEhpZ2hsaWdodFNoYXBlKGludCBmaXJzdEVuZHBvaW50LCBpbnQgc2Vjb25kRW5kcG9pbnQpIHsKICAgICAgICAgdXBkYXRlTWV0cmljcygpOwpAQCAtNTYwLDIyICs1ODYsMTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGEgU2hhcGUgcmVwcmVzZW50aW5nIHRoZSBsb2dpY2FsIHNlbGVjdGlvbiBiZXR3ZWVlbiAKLSAgICAgKiB0aGUgc3BlY2lmaWVkIGVuZHBvaW50cyBhbmQgZXh0ZW5kZWQgdG8gdGhlIHNwZWNpZmllZCAKLSAgICAgKiBib3VuZHMgb2YgdGhpcyBUZXh0TGF5b3V0LgorICAgICAqIEdldHMgYSBTaGFwZSByZXByZXNlbnRpbmcgdGhlIGxvZ2ljYWwgc2VsZWN0aW9uIGJldHdlZWVuIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBlbmRwb2ludHMgYW5kIGV4dGVuZGVkIHRvIHRoZSBzcGVjaWZpZWQgYm91bmRzIG9mIHRoaXMgVGV4dExheW91dC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmlyc3RFbmRwb2ludCB0aGUgZmlyc3Qgc2VsZWN0ZWQgZW5kcG9pbnQgd2l0aGluIHRoZSBhcmVhIG9mIGNoYXJhY3RlcnMKLSAgICAgKiBAcGFyYW0gc2Vjb25kRW5kcG9pbnQgdGhlIHNlY29uZCBzZWxlY3RlZCBlbmRwb2ludCB3aXRoaW4gdGhlIGFyZWEgb2YgY2hhcmFjdGVycwotICAgICAqIEBwYXJhbSBib3VuZHMgdGhlIHNwZWNpZmllZCBib3VuZHMgb2YgdGhpcyBUZXh0TGF5b3V0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBTaGFwZSByZXByZXNlbnRlZCB0aGUgbG9naWNhbCBzZWxlY3Rpb24gYmV0d2VlZW4gCi0gICAgICogdGhlIHNwZWNpZmllZCBlbmRwb2ludHMuCisgICAgICogQHBhcmFtIGZpcnN0RW5kcG9pbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBzZWxlY3RlZCBlbmRwb2ludCB3aXRoaW4gdGhlIGFyZWEgb2YgY2hhcmFjdGVycworICAgICAqIEBwYXJhbSBzZWNvbmRFbmRwb2ludAorICAgICAqICAgICAgICAgICAgdGhlIHNlY29uZCBzZWxlY3RlZCBlbmRwb2ludCB3aXRoaW4gdGhlIGFyZWEgb2YgY2hhcmFjdGVycworICAgICAqIEBwYXJhbSBib3VuZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgYm91bmRzIG9mIHRoaXMgVGV4dExheW91dC4KKyAgICAgKiBAcmV0dXJuIGEgU2hhcGUgcmVwcmVzZW50ZWQgdGhlIGxvZ2ljYWwgc2VsZWN0aW9uIGJldHdlZWVuIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgIGVuZHBvaW50cy4KICAgICAgKi8KLSAgICBwdWJsaWMgU2hhcGUgZ2V0TG9naWNhbEhpZ2hsaWdodFNoYXBlKAotICAgICAgICAgICAgaW50IGZpcnN0RW5kcG9pbnQsCi0gICAgICAgICAgICBpbnQgc2Vjb25kRW5kcG9pbnQsCi0gICAgICAgICAgICBSZWN0YW5nbGUyRCBib3VuZHMKLSAgICApIHsKKyAgICBwdWJsaWMgU2hhcGUgZ2V0TG9naWNhbEhpZ2hsaWdodFNoYXBlKGludCBmaXJzdEVuZHBvaW50LCBpbnQgc2Vjb25kRW5kcG9pbnQsIFJlY3RhbmdsZTJEIGJvdW5kcykgewogICAgICAgICB1cGRhdGVNZXRyaWNzKCk7CiAKICAgICAgICAgaWYgKGZpcnN0RW5kcG9pbnQgPiBzZWNvbmRFbmRwb2ludCkgewpAQCAtNTgzLDYyICs2MDYsNTEgQEAKICAgICAgICAgICAgICAgICAvLyBhd3QuMTk3PUVuZHBvaW50cyBhcmUgb3V0IG9mIHJhbmdlCiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4xOTciKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjYXJldE1hbmFnZXIuZ2V0TG9naWNhbEhpZ2hsaWdodFNoYXBlKAotICAgICAgICAgICAgICAgICAgICBzZWNvbmRFbmRwb2ludCwKLSAgICAgICAgICAgICAgICAgICAgZmlyc3RFbmRwb2ludCwKLSAgICAgICAgICAgICAgICAgICAgYm91bmRzLAotICAgICAgICAgICAgICAgICAgICB0aGlzCi0gICAgICAgICAgICApOworICAgICAgICAgICAgcmV0dXJuIGNhcmV0TWFuYWdlci5nZXRMb2dpY2FsSGlnaGxpZ2h0U2hhcGUoc2Vjb25kRW5kcG9pbnQsIGZpcnN0RW5kcG9pbnQsIGJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgdGhpcyk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGZpcnN0RW5kcG9pbnQgPCAwIHx8IHNlY29uZEVuZHBvaW50ID4gYnJlYWtlci5nZXRDaGFyQ291bnQoKSkgewogICAgICAgICAgICAgLy8gYXd0LjE5Nz1FbmRwb2ludHMgYXJlIG91dCBvZiByYW5nZQogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4xOTciKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQotICAgICAgICByZXR1cm4gY2FyZXRNYW5hZ2VyLmdldExvZ2ljYWxIaWdobGlnaHRTaGFwZSgKLSAgICAgICAgICAgICAgICBmaXJzdEVuZHBvaW50LAotICAgICAgICAgICAgICAgIHNlY29uZEVuZHBvaW50LAotICAgICAgICAgICAgICAgIGJvdW5kcywKLSAgICAgICAgICAgICAgICB0aGlzCi0gICAgICAgICk7CisgICAgICAgIHJldHVybiBjYXJldE1hbmFnZXIuZ2V0TG9naWNhbEhpZ2hsaWdodFNoYXBlKGZpcnN0RW5kcG9pbnQsIHNlY29uZEVuZHBvaW50LCBib3VuZHMsIHRoaXMpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGxvZ2ljYWwgcmFuZ2VzIG9mIHRleHQgd2hpY2ggY29ycmVzcG9uZHMgdG8gYSB2aXN1YWwgCi0gICAgICogc2VsZWN0aW9uLgorICAgICAqIEdldHMgdGhlIGxvZ2ljYWwgcmFuZ2VzIG9mIHRleHQgd2hpY2ggY29ycmVzcG9uZHMgdG8gYSB2aXN1YWwgc2VsZWN0aW9uLgogICAgICAqIAotICAgICAqIEBwYXJhbSBoaXQxIHRoZSBmaXJzdCBlbmRwb2ludCBvZiB0aGUgdmlzdWFsIHJhbmdlLgotICAgICAqIEBwYXJhbSBoaXQyIHRoZSBzZWNvbmQgZW5kcG9pbnQgb2YgdGhlIHZpc3VhbCByYW5nZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBsb2dpY2FsIHJhbmdlcyBvZiB0ZXh0IHdoaWNoIGNvcnJlc3BvbmRzIHRvIGEgdmlzdWFsIAotICAgICAqIHNlbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0gaGl0MQorICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IGVuZHBvaW50IG9mIHRoZSB2aXN1YWwgcmFuZ2UuCisgICAgICogQHBhcmFtIGhpdDIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgZW5kcG9pbnQgb2YgdGhlIHZpc3VhbCByYW5nZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBsb2dpY2FsIHJhbmdlcyBvZiB0ZXh0IHdoaWNoIGNvcnJlc3BvbmRzIHRvIGEgdmlzdWFsCisgICAgICogICAgICAgICBzZWxlY3Rpb24uCiAgICAgICovCiAgICAgcHVibGljIGludFtdIGdldExvZ2ljYWxSYW5nZXNGb3JWaXN1YWxTZWxlY3Rpb24oVGV4dEhpdEluZm8gaGl0MSwgVGV4dEhpdEluZm8gaGl0MikgewogICAgICAgICByZXR1cm4gY2FyZXRNYW5hZ2VyLmdldExvZ2ljYWxSYW5nZXNGb3JWaXN1YWxTZWxlY3Rpb24oaGl0MSwgaGl0Mik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgVGV4dEhpdEluZm8gZm9yIHRoZSBuZXh0IGNhcmV0IHRvIHRoZSBsZWZ0IChvcgotICAgICAqIHVwIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUpIG9mIHRoZSBzcGVjaWZpZWQgb2Zmc2V0LiAKKyAgICAgKiBHZXRzIHRoZSBUZXh0SGl0SW5mbyBmb3IgdGhlIG5leHQgY2FyZXQgdG8gdGhlIGxlZnQgKG9yIHVwIGF0IHRoZSBlbmQgb2YKKyAgICAgKiB0aGUgbGluZSkgb2YgdGhlIHNwZWNpZmllZCBvZmZzZXQuCiAgICAgICogCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IGluIHRoaXMgVGV4dExheW91dC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBUZXh0SGl0SW5mbyBmb3IgdGhlIG5leHQgY2FyZXQgdG8gdGhlIGxlZnQgKG9yCi0gICAgICogdXAgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSkgb2YgdGhlIHNwZWNpZmllZCBoaXQsIG9yIG51bGwgCi0gICAgICogaWYgdGhlcmUgaXMgbm8gaGl0LgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gdGhpcyBUZXh0TGF5b3V0LgorICAgICAqIEByZXR1cm4gdGhlIFRleHRIaXRJbmZvIGZvciB0aGUgbmV4dCBjYXJldCB0byB0aGUgbGVmdCAob3IgdXAgYXQgdGhlIGVuZAorICAgICAqICAgICAgICAgb2YgdGhlIGxpbmUpIG9mIHRoZSBzcGVjaWZpZWQgaGl0LCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIGhpdC4KICAgICAgKi8KICAgICBwdWJsaWMgVGV4dEhpdEluZm8gZ2V0TmV4dExlZnRIaXQoaW50IG9mZnNldCkgewogICAgICAgICByZXR1cm4gZ2V0TmV4dExlZnRIaXQob2Zmc2V0LCBERUZBVUxUX0NBUkVUX1BPTElDWSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgVGV4dEhpdEluZm8gZm9yIHRoZSBuZXh0IGNhcmV0IHRvIHRoZSBsZWZ0IChvcgotICAgICAqIHVwIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUpIG9mIHRoZSBzcGVjaWZpZWQgaGl0LiAKKyAgICAgKiBHZXRzIHRoZSBUZXh0SGl0SW5mbyBmb3IgdGhlIG5leHQgY2FyZXQgdG8gdGhlIGxlZnQgKG9yIHVwIGF0IHRoZSBlbmQgb2YKKyAgICAgKiB0aGUgbGluZSkgb2YgdGhlIHNwZWNpZmllZCBoaXQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGhpdEluZm8gdGhlIGluaXRpYWwgaGl0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIFRleHRIaXRJbmZvIGZvciB0aGUgbmV4dCBjYXJldCB0byB0aGUgbGVmdCAob3IKLSAgICAgKiB1cCBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lKSBvZiB0aGUgc3BlY2lmaWVkIGhpdCwgb3IgbnVsbCAKLSAgICAgKiBpZiB0aGVyZSBpcyBubyBoaXQuCisgICAgICogQHBhcmFtIGhpdEluZm8KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsIGhpdC4KKyAgICAgKiBAcmV0dXJuIHRoZSBUZXh0SGl0SW5mbyBmb3IgdGhlIG5leHQgY2FyZXQgdG8gdGhlIGxlZnQgKG9yIHVwIGF0IHRoZSBlbmQKKyAgICAgKiAgICAgICAgIG9mIHRoZSBsaW5lKSBvZiB0aGUgc3BlY2lmaWVkIGhpdCwgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBoaXQuCiAgICAgICovCiAgICAgcHVibGljIFRleHRIaXRJbmZvIGdldE5leHRMZWZ0SGl0KFRleHRIaXRJbmZvIGhpdEluZm8pIHsKICAgICAgICAgYnJlYWtlci5jcmVhdGVBbGxTZWdtZW50cygpOwpAQCAtNjQ2LDE1ICs2NTgsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBUZXh0SGl0SW5mbyBmb3IgdGhlIG5leHQgY2FyZXQgdG8gdGhlIGxlZnQgKG9yCi0gICAgICogdXAgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSkgb2YgdGhlIHNwZWNpZmllZCBvZmZzZXQsIGdpdmVuIHRoZSAKLSAgICAgKiBzcGVjaWZpZWQgY2FyZXQgcG9saWN5LiAKKyAgICAgKiBHZXRzIHRoZSBUZXh0SGl0SW5mbyBmb3IgdGhlIG5leHQgY2FyZXQgdG8gdGhlIGxlZnQgKG9yIHVwIGF0IHRoZSBlbmQgb2YKKyAgICAgKiB0aGUgbGluZSkgb2YgdGhlIHNwZWNpZmllZCBvZmZzZXQsIGdpdmVuIHRoZSBzcGVjaWZpZWQgY2FyZXQgcG9saWN5LgogICAgICAqIAotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCBpbiB0aGlzIFRleHRMYXlvdXQuCi0gICAgICogQHBhcmFtIHBvbGljeSB0aGUgcG9saWN5IHRvIGJlIHVzZWQgZm9yIG9idGFpbmluZyB0aGUgc3Ryb25nIGNhcmV0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIFRleHRIaXRJbmZvIGZvciB0aGUgbmV4dCBjYXJldCB0byB0aGUgbGVmdCBvZiB0aGUgCi0gICAgICogc3BlY2lmaWVkIG9mZnNldCwgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBoaXQuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGlzIFRleHRMYXlvdXQuCisgICAgICogQHBhcmFtIHBvbGljeQorICAgICAqICAgICAgICAgICAgdGhlIHBvbGljeSB0byBiZSB1c2VkIGZvciBvYnRhaW5pbmcgdGhlIHN0cm9uZyBjYXJldC4KKyAgICAgKiBAcmV0dXJuIHRoZSBUZXh0SGl0SW5mbyBmb3IgdGhlIG5leHQgY2FyZXQgdG8gdGhlIGxlZnQgb2YgdGhlIHNwZWNpZmllZAorICAgICAqICAgICAgICAgb2Zmc2V0LCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIGhpdC4KICAgICAgKi8KICAgICBwdWJsaWMgVGV4dEhpdEluZm8gZ2V0TmV4dExlZnRIaXQoaW50IG9mZnNldCwgVGV4dExheW91dC5DYXJldFBvbGljeSBwb2xpY3kpIHsKICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID4gYnJlYWtlci5nZXRDaGFyQ291bnQoKSkgewpAQCAtNjczLDE0ICs2ODUsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBUZXh0SGl0SW5mbyBmb3IgdGhlIG5leHQgY2FyZXQgdG8gdGhlIHJpZ2h0IChvcgotICAgICAqIGRvd24gYXQgdGhlIGVuZCBvZiB0aGUgbGluZSkgb2YgdGhlIHNwZWNpZmllZCBoaXQuIAorICAgICAqIEdldHMgdGhlIFRleHRIaXRJbmZvIGZvciB0aGUgbmV4dCBjYXJldCB0byB0aGUgcmlnaHQgKG9yIGRvd24gYXQgdGhlIGVuZAorICAgICAqIG9mIHRoZSBsaW5lKSBvZiB0aGUgc3BlY2lmaWVkIGhpdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaGl0SW5mbyB0aGUgaW5pdGlhbCBoaXQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgVGV4dEhpdEluZm8gZm9yIHRoZSBuZXh0IGNhcmV0IHRvIHRoZSByaWdodCAob3IKLSAgICAgKiBkb3duIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUpIG9mIHRoZSBzcGVjaWZpZWQgaGl0LCBvciBudWxsIAotICAgICAqIGlmIHRoZXJlIGlzIG5vIGhpdC4KKyAgICAgKiBAcGFyYW0gaGl0SW5mbworICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWwgaGl0LgorICAgICAqIEByZXR1cm4gdGhlIFRleHRIaXRJbmZvIGZvciB0aGUgbmV4dCBjYXJldCB0byB0aGUgcmlnaHQgKG9yIGRvd24gYXQgdGhlCisgICAgICogICAgICAgICBlbmQgb2YgdGhlIGxpbmUpIG9mIHRoZSBzcGVjaWZpZWQgaGl0LCBvciBudWxsIGlmIHRoZXJlIGlzIG5vCisgICAgICogICAgICAgICBoaXQuCiAgICAgICovCiAgICAgcHVibGljIFRleHRIaXRJbmZvIGdldE5leHRSaWdodEhpdChUZXh0SGl0SW5mbyBoaXRJbmZvKSB7CiAgICAgICAgIGJyZWFrZXIuY3JlYXRlQWxsU2VnbWVudHMoKTsKQEAgLTY4OCwyOCArNzAwLDI4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgVGV4dEhpdEluZm8gZm9yIHRoZSBuZXh0IGNhcmV0IHRvIHRoZSByaWdodCAob3IKLSAgICAgKiBkb3duIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUpIG9mIHRoZSBzcGVjaWZpZWQgb2Zmc2V0LiAKKyAgICAgKiBHZXRzIHRoZSBUZXh0SGl0SW5mbyBmb3IgdGhlIG5leHQgY2FyZXQgdG8gdGhlIHJpZ2h0IChvciBkb3duIGF0IHRoZSBlbmQKKyAgICAgKiBvZiB0aGUgbGluZSkgb2YgdGhlIHNwZWNpZmllZCBvZmZzZXQuCiAgICAgICogCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IGluIHRoaXMgVGV4dExheW91dC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBUZXh0SGl0SW5mbyBmb3IgdGhlIG5leHQgY2FyZXQgdG8gdGhlIHJpZ2h0IG9mIHRoZSAKLSAgICAgKiBzcGVjaWZpZWQgb2Zmc2V0LCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIGhpdC4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoaXMgVGV4dExheW91dC4KKyAgICAgKiBAcmV0dXJuIHRoZSBUZXh0SGl0SW5mbyBmb3IgdGhlIG5leHQgY2FyZXQgdG8gdGhlIHJpZ2h0IG9mIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgIG9mZnNldCwgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBoaXQuCiAgICAgICovCiAgICAgcHVibGljIFRleHRIaXRJbmZvIGdldE5leHRSaWdodEhpdChpbnQgb2Zmc2V0KSB7CiAgICAgICAgIHJldHVybiBnZXROZXh0UmlnaHRIaXQob2Zmc2V0LCBERUZBVUxUX0NBUkVUX1BPTElDWSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgVGV4dEhpdEluZm8gZm9yIHRoZSBuZXh0IGNhcmV0IHRvIHRoZSByaWdodCAob3IKLSAgICAgKiBkb3duIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUpIG9mIHRoZSBzcGVjaWZpZWQgb2Zmc2V0LCBnaXZlbiB0aGUgCi0gICAgICogc3BlY2lmaWVkIGNhcmV0IHBvbGljeS4gCisgICAgICogR2V0cyB0aGUgVGV4dEhpdEluZm8gZm9yIHRoZSBuZXh0IGNhcmV0IHRvIHRoZSByaWdodCAob3IgZG93biBhdCB0aGUgZW5kCisgICAgICogb2YgdGhlIGxpbmUpIG9mIHRoZSBzcGVjaWZpZWQgb2Zmc2V0LCBnaXZlbiB0aGUgc3BlY2lmaWVkIGNhcmV0IHBvbGljeS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgaW4gdGhpcyBUZXh0TGF5b3V0LgotICAgICAqIEBwYXJhbSBwb2xpY3kgdGhlIHBvbGljeSB0byBiZSB1c2VkIGZvciBvYnRhaW5pbmcgdGhlIHN0cm9uZyBjYXJldC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBUZXh0SGl0SW5mbyBmb3IgdGhlIG5leHQgY2FyZXQgdG8gdGhlIHJpZ2h0IG9mIHRoZSAKLSAgICAgKiBzcGVjaWZpZWQgb2Zmc2V0LCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIGhpdC4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoaXMgVGV4dExheW91dC4KKyAgICAgKiBAcGFyYW0gcG9saWN5CisgICAgICogICAgICAgICAgICB0aGUgcG9saWN5IHRvIGJlIHVzZWQgZm9yIG9idGFpbmluZyB0aGUgc3Ryb25nIGNhcmV0LgorICAgICAqIEByZXR1cm4gdGhlIFRleHRIaXRJbmZvIGZvciB0aGUgbmV4dCBjYXJldCB0byB0aGUgcmlnaHQgb2YgdGhlIHNwZWNpZmllZAorICAgICAqICAgICAgICAgb2Zmc2V0LCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIGhpdC4KICAgICAgKi8KICAgICBwdWJsaWMgVGV4dEhpdEluZm8gZ2V0TmV4dFJpZ2h0SGl0KGludCBvZmZzZXQsIFRleHRMYXlvdXQuQ2FyZXRQb2xpY3kgcG9saWN5KSB7CiAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+IGJyZWFrZXIuZ2V0Q2hhckNvdW50KCkpIHsKQEAgLTczMCwxMCArNzQyLDkgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBvdXRsaW5lIG9mIHRoaXMgVGV4dExheW91dCBhcyBhIFNoYXBlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4Zm9ybSB0aGUgQWZmaW5lVHJhbnNmb3JtIHRvIGJlIHVzZWQgdG8gdHJhbnNmb3JtIAotICAgICAqIHRoZSBvdXRsaW5lIGJlZm9yZSByZXR1cm5pbmcgaXQsIG9yIG51bGwgaWYgbm8gdHJhbnNmb3JtYXRpb24KLSAgICAgKiBpcyBkZXNpcmVkLgotICAgICAqIAorICAgICAqIEBwYXJhbSB4Zm9ybQorICAgICAqICAgICAgICAgICAgdGhlIEFmZmluZVRyYW5zZm9ybSB0byBiZSB1c2VkIHRvIHRyYW5zZm9ybSB0aGUgb3V0bGluZSBiZWZvcmUKKyAgICAgKiAgICAgICAgICAgIHJldHVybmluZyBpdCwgb3IgbnVsbCBpZiBubyB0cmFuc2Zvcm1hdGlvbiBpcyBkZXNpcmVkLgogICAgICAqIEByZXR1cm4gdGhlIG91dGxpbmUgb2YgdGhpcyBUZXh0TGF5b3V0IGFzIGEgU2hhcGUuCiAgICAgICovCiAgICAgcHVibGljIFNoYXBlIGdldE91dGxpbmUoQWZmaW5lVHJhbnNmb3JtIHhmb3JtKSB7CkBAIC03NDksOCArNzYwLDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2aXNpYmxlIGFkdmFuY2Ugb2YgdGhpcyBUZXh0TGF5b3V0IHdoaWNoIGlzIGRlZmluZWQgYXMKLSAgICAgKiBkaWZmZW5jZSBiZXR3ZWVuIGxlYWRpbmcgKGFkdmFuY2UpIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLgorICAgICAqIEdldHMgdGhlIHZpc2libGUgYWR2YW5jZSBvZiB0aGlzIFRleHRMYXlvdXQgd2hpY2ggaXMgZGVmaW5lZCBhcyBkaWZmZW5jZQorICAgICAqIGJldHdlZW4gbGVhZGluZyAoYWR2YW5jZSkgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgdmlzaWJsZSBhZHZhbmNlIG9mIHRoaXMgVGV4dExheW91dC4KICAgICAgKi8KQEAgLTc2NCwxNSArNzc1LDEzIEBACiAKICAgICAgICAgaWYgKGxhc3ROb25XaGl0ZXNwYWNlIDwgMCkgewogICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0gZWxzZSBpZiAobGFzdE5vbldoaXRlc3BhY2UgPT0gZ2V0Q2hhcmFjdGVyQ291bnQoKS0xKSB7CisgICAgICAgIH0gZWxzZSBpZiAobGFzdE5vbldoaXRlc3BhY2UgPT0gZ2V0Q2hhcmFjdGVyQ291bnQoKSAtIDEpIHsKICAgICAgICAgICAgIHJldHVybiBnZXRBZHZhbmNlKCk7CiAgICAgICAgIH0gZWxzZSBpZiAoanVzdGlmaWNhdGlvbldpZHRoID49IDApIHsgLy8gTGF5b3V0IGlzIGp1c3RpZmllZAogICAgICAgICAgICAgcmV0dXJuIGp1c3RpZmljYXRpb25XaWR0aDsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJyZWFrZXIucHVzaFNlZ21lbnRzKAotICAgICAgICAgICAgICAgICAgICBicmVha2VyLmdldEFDSSgpLmdldEJlZ2luSW5kZXgoKSwKLSAgICAgICAgICAgICAgICAgICAgbGFzdE5vbldoaXRlc3BhY2UgKyBicmVha2VyLmdldEFDSSgpLmdldEJlZ2luSW5kZXgoKSArIDEKLSAgICAgICAgICAgICk7CisgICAgICAgICAgICBicmVha2VyLnB1c2hTZWdtZW50cyhicmVha2VyLmdldEFDSSgpLmdldEJlZ2luSW5kZXgoKSwgbGFzdE5vbldoaXRlc3BhY2UKKyAgICAgICAgICAgICAgICAgICAgKyBicmVha2VyLmdldEFDSSgpLmdldEJlZ2luSW5kZXgoKSArIDEpOwogCiAgICAgICAgICAgICBicmVha2VyLmNyZWF0ZUFsbFNlZ21lbnRzKCk7CiAKQEAgLTc4NCwxNCArNzkzLDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhIFNoYXBlIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBoaWdobGlnaHRlZCAoc2VsZWN0ZWQpIGFyZWEKLSAgICAgKiBiYXNlZCBvbiB0d28gaGl0IGxvY2F0aW9ucyB3aXRoaW4gdGhlIHRleHQgYW5kIGV4dGVuZHMgdG8gdGhlIGJvdW5kcy4KKyAgICAgKiBHZXRzIGEgU2hhcGUgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIGhpZ2hsaWdodGVkIChzZWxlY3RlZCkgYXJlYSBiYXNlZAorICAgICAqIG9uIHR3byBoaXQgbG9jYXRpb25zIHdpdGhpbiB0aGUgdGV4dCBhbmQgZXh0ZW5kcyB0byB0aGUgYm91bmRzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBoaXQxIHRoZSBmaXJzdCB0ZXh0IGhpdCBsb2NhdGlvbi4KLSAgICAgKiBAcGFyYW0gaGl0MiB0aGUgc2Vjb25kIHRleHQgaGl0IGxvY2F0aW9uLgotICAgICAqIEBwYXJhbSBib3VuZHMgdGhlIHJlY3RhbmdsZSB0aGF0IHRoZSBoaWdobGlnaHRlZCBhcmVhIHNob3VsZCBiZSAKLSAgICAgKiBleHRlbmRlZCBvciByZXN0cmljdGVkIHRvLgotICAgICAqIAorICAgICAqIEBwYXJhbSBoaXQxCisgICAgICogICAgICAgICAgICB0aGUgZmlyc3QgdGV4dCBoaXQgbG9jYXRpb24uCisgICAgICogQHBhcmFtIGhpdDIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgdGV4dCBoaXQgbG9jYXRpb24uCisgICAgICogQHBhcmFtIGJvdW5kcworICAgICAqICAgICAgICAgICAgdGhlIHJlY3RhbmdsZSB0aGF0IHRoZSBoaWdobGlnaHRlZCBhcmVhIHNob3VsZCBiZSBleHRlbmRlZCBvcgorICAgICAqICAgICAgICAgICAgcmVzdHJpY3RlZCB0by4KICAgICAgKiBAcmV0dXJuIGEgU2hhcGUgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIGhpZ2hsaWdodGVkIChzZWxlY3RlZCkgYXJlYS4KICAgICAgKi8KICAgICBwdWJsaWMgU2hhcGUgZ2V0VmlzdWFsSGlnaGxpZ2h0U2hhcGUoVGV4dEhpdEluZm8gaGl0MSwgVGV4dEhpdEluZm8gaGl0MiwgUmVjdGFuZ2xlMkQgYm91bmRzKSB7CkBAIC03OTksMTIgKzgxMCwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYSBTaGFwZSB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgaGlnaGxpZ2h0ZWQgKHNlbGVjdGVkKSBhcmVhCi0gICAgICogYmFzZWQgb24gdHdvIGhpdCBsb2NhdGlvbnMgd2l0aGluIHRoZSB0ZXh0LgorICAgICAqIEdldHMgYSBTaGFwZSB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgaGlnaGxpZ2h0ZWQgKHNlbGVjdGVkKSBhcmVhIGJhc2VkCisgICAgICogb24gdHdvIGhpdCBsb2NhdGlvbnMgd2l0aGluIHRoZSB0ZXh0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBoaXQxIHRoZSBmaXJzdCB0ZXh0IGhpdCBsb2NhdGlvbi4KLSAgICAgKiBAcGFyYW0gaGl0MiB0aGUgc2Vjb25kIHRleHQgaGl0IGxvY2F0aW9uLgotICAgICAqIAorICAgICAqIEBwYXJhbSBoaXQxCisgICAgICogICAgICAgICAgICB0aGUgZmlyc3QgdGV4dCBoaXQgbG9jYXRpb24uCisgICAgICogQHBhcmFtIGhpdDIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgdGV4dCBoaXQgbG9jYXRpb24uCiAgICAgICogQHJldHVybiBhIFNoYXBlIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBoaWdobGlnaHRlZCAoc2VsZWN0ZWQpIGFyZWEuCiAgICAgICovCiAgICAgcHVibGljIFNoYXBlIGdldFZpc3VhbEhpZ2hsaWdodFNoYXBlKFRleHRIaXRJbmZvIGhpdDEsIFRleHRIaXRJbmZvIGhpdDIpIHsKQEAgLTgxMywyMyArODI1LDIzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgVGV4dEhpdEluZm8gZm9yIGEgaGl0IG9uIHRoZSBvcHBvc2l0ZSBzaWRlIG9mIHRoZSAKLSAgICAgKiBzcGVjaWZpZWQgaGl0J3MgY2FyZXQuCisgICAgICogR2V0cyB0aGUgVGV4dEhpdEluZm8gZm9yIGEgaGl0IG9uIHRoZSBvcHBvc2l0ZSBzaWRlIG9mIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBoaXQncyBjYXJldC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaGl0SW5mbyB0aGUgc3BlY2lmaWVkIFRleHRIaXRJbmZvLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIFRleHRIaXRJbmZvIGZvciBhIGhpdCBvbiB0aGUgb3Bwb3NpdGUgc2lkZSBvZiB0aGUgCi0gICAgICogc3BlY2lmaWVkIGhpdCdzIGNhcmV0LgorICAgICAqIEBwYXJhbSBoaXRJbmZvCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIFRleHRIaXRJbmZvLgorICAgICAqIEByZXR1cm4gdGhlIFRleHRIaXRJbmZvIGZvciBhIGhpdCBvbiB0aGUgb3Bwb3NpdGUgc2lkZSBvZiB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICBoaXQncyBjYXJldC4KICAgICAgKi8KICAgICBwdWJsaWMgVGV4dEhpdEluZm8gZ2V0VmlzdWFsT3RoZXJIaXQoVGV4dEhpdEluZm8gaGl0SW5mbykgewogICAgICAgICByZXR1cm4gY2FyZXRNYW5hZ2VyLmdldFZpc3VhbE90aGVySGl0KGhpdEluZm8pOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEp1c3RpZmllcyB0aGUgdGV4dDsgdGhpcyBtZXRob2Qgc2hvdWxkIGJlIG92ZXJyaWRkZW4KLSAgICAgKiBieSBzdWJjbGFzc2VzLgorICAgICAqIEp1c3RpZmllcyB0aGUgdGV4dDsgdGhpcyBtZXRob2Qgc2hvdWxkIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3Nlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0ganVzdGlmaWNhdGlvbldpZHRoIHRoZSB3aWR0aCBmb3IganVzdGlmaWNhdGlvbi4KKyAgICAgKiBAcGFyYW0ganVzdGlmaWNhdGlvbldpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggZm9yIGp1c3RpZmljYXRpb24uCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlSnVzdGlmeShmbG9hdCBqdXN0aWZpY2F0aW9uV2lkdGgpIHsKICAgICAgICAgZmxvYXQganVzdGlmaWNhdGlvbiA9IGJyZWFrZXIuZ2V0SnVzdGlmaWNhdGlvbigpOwpAQCAtODUxLDU0ICs4NjMsNTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgVGV4dEhpdEluZm8gb2JqZWN0IHRoYXQgZ2l2ZXMgaW5mb3JtYXRpb24gb24gd2hpY2ggCi0gICAgICogZGl2aXNpb24gcG9pbnQgKGJldHdlZW4gdHdvIGNoYXJhY3RlcnMpIGlzIGNvcnJlc3BvbmRzIHRvIGEgCi0gICAgICogaGl0IChzdWNoIGFzIGEgbW91c2UgY2xpY2spIGF0IHRoZSBzcGVjaWZpZWQgY29vcmRpbmF0ZXMuCisgICAgICogUmV0dXJucyBhIFRleHRIaXRJbmZvIG9iamVjdCB0aGF0IGdpdmVzIGluZm9ybWF0aW9uIG9uIHdoaWNoIGRpdmlzaW9uCisgICAgICogcG9pbnQgKGJldHdlZW4gdHdvIGNoYXJhY3RlcnMpIGlzIGNvcnJlc3BvbmRzIHRvIGEgaGl0IChzdWNoIGFzIGEgbW91c2UKKyAgICAgKiBjbGljaykgYXQgdGhlIHNwZWNpZmllZCBjb29yZGluYXRlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIGluIHRoaXMgVGV4dExheW91dC4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIGluIHRoaXMgVGV4dExheW91dC4KLSAgICAgKiAKLSAgICAgKiBUZXh0SGl0SW5mbyBvYmplY3QgY29vcmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMKLSAgICAgKiB3aXRoaW4gdGhlIHRleHQuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgaW4gdGhpcyBUZXh0TGF5b3V0LgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIGluIHRoaXMgVGV4dExheW91dC4gVGV4dEhpdEluZm8gb2JqZWN0CisgICAgICogICAgICAgICAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBjb29yZGluYXRlcyB3aXRoaW4gdGhlIHRleHQuCisgICAgICogQHJldHVybiB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNoYXJhY3RlciBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBUZXh0SGl0SW5mbyBoaXRUZXN0Q2hhcihmbG9hdCB4LCBmbG9hdCB5KSB7CiAgICAgICAgIHJldHVybiBoaXRUZXN0Q2hhcih4LCB5LCBnZXRCb3VuZHMoKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIFRleHRIaXRJbmZvIG9iamVjdCB0aGF0IGdpdmVzIGluZm9ybWF0aW9uIG9uIHdoaWNoIAotICAgICAqIGRpdmlzaW9uIHBvaW50IChiZXR3ZWVuIHR3byBjaGFyYWN0ZXJzKSBpcyBjb3JyZXNwb25kcyB0byBhIAotICAgICAqIGhpdCAoc3VjaCBhcyBhIG1vdXNlIGNsaWNrKSBhdCB0aGUgc3BlY2lmaWVkIGNvb3JkaW5hdGVzIHdpdGhpbiAKLSAgICAgKiB0aGUgc3BlY2lmaWVkIHRleHQgcmVjdGFuZ2xlLgorICAgICAqIFJldHVybnMgYSBUZXh0SGl0SW5mbyBvYmplY3QgdGhhdCBnaXZlcyBpbmZvcm1hdGlvbiBvbiB3aGljaCBkaXZpc2lvbgorICAgICAqIHBvaW50IChiZXR3ZWVuIHR3byBjaGFyYWN0ZXJzKSBpcyBjb3JyZXNwb25kcyB0byBhIGhpdCAoc3VjaCBhcyBhIG1vdXNlCisgICAgICogY2xpY2spIGF0IHRoZSBzcGVjaWZpZWQgY29vcmRpbmF0ZXMgd2l0aGluIHRoZSBzcGVjaWZpZWQgdGV4dCByZWN0YW5nbGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBpbiB0aGlzIFRleHRMYXlvdXQuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBpbiB0aGlzIFRleHRMYXlvdXQuCi0gICAgICogQHBhcmFtIGJvdW5kcyB0aGUgYm91bmRzIG9mIHRoZSB0ZXh0IGFyZWEuCi0gICAgICogCi0gICAgICogVGV4dEhpdEluZm8gb2JqZWN0IGNvb3Jlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGNvb3JkaW5hdGVzCi0gICAgICogd2l0aGluIHRoZSB0ZXh0LgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIGluIHRoaXMgVGV4dExheW91dC4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBpbiB0aGlzIFRleHRMYXlvdXQuCisgICAgICogQHBhcmFtIGJvdW5kcworICAgICAqICAgICAgICAgICAgdGhlIGJvdW5kcyBvZiB0aGUgdGV4dCBhcmVhLiBUZXh0SGl0SW5mbyBvYmplY3QgY29ycmVzcG9uZGluZworICAgICAqICAgICAgICAgICAgdG8gdGhlIGdpdmVuIGNvb3JkaW5hdGVzIHdpdGhpbiB0aGUgdGV4dC4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2hhcmFjdGVyIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uCiAgICAgICovCiAgICAgcHVibGljIFRleHRIaXRJbmZvIGhpdFRlc3RDaGFyKGZsb2F0IHgsIGZsb2F0IHksIFJlY3RhbmdsZTJEIGJvdW5kcykgewogICAgICAgICBpZiAoeCA+IGJvdW5kcy5nZXRNYXhYKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBicmVha2VyLmlzTFRSKCkgPwotICAgICAgICAgICAgICAgICAgICBUZXh0SGl0SW5mby50cmFpbGluZyhicmVha2VyLmdldENoYXJDb3VudCgpIC0gMSkgOiBUZXh0SGl0SW5mby5sZWFkaW5nKDApOworICAgICAgICAgICAgcmV0dXJuIGJyZWFrZXIuaXNMVFIoKSA/IFRleHRIaXRJbmZvLnRyYWlsaW5nKGJyZWFrZXIuZ2V0Q2hhckNvdW50KCkgLSAxKSA6IFRleHRIaXRJbmZvCisgICAgICAgICAgICAgICAgICAgIC5sZWFkaW5nKDApOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHggPCBib3VuZHMuZ2V0TWluWCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gYnJlYWtlci5pc0xUUigpID8KLSAgICAgICAgICAgICAgICAgICAgVGV4dEhpdEluZm8ubGVhZGluZygwKSA6IFRleHRIaXRJbmZvLnRyYWlsaW5nKGJyZWFrZXIuZ2V0Q2hhckNvdW50KCkgLSAxKTsKKyAgICAgICAgICAgIHJldHVybiBicmVha2VyLmlzTFRSKCkgPyBUZXh0SGl0SW5mby5sZWFkaW5nKDApIDogVGV4dEhpdEluZm8udHJhaWxpbmcoYnJlYWtlcgorICAgICAgICAgICAgICAgICAgICAuZ2V0Q2hhckNvdW50KCkgLSAxKTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBicmVha2VyLmhpdFRlc3QoeCwgeSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgVGV4dExheW91dCBoYXMgYSAibGVmdCB0byByaWdodCIgCi0gICAgICogZGlyZWN0aW9uLgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIFRleHRMYXlvdXQgaGFzIGEgImxlZnQgdG8gcmlnaHQiIGRpcmVjdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBUZXh0TGF5b3V0IGhhcyBhICJsZWZ0IHRvIHJpZ2h0IiAKLSAgICAgKiBkaXJlY3Rpb24sIGZhbHNlIGlmIHRoaXMgVGV4dExheW91dCBoYXMgYSAicmlnaHQgdG8gbGVmdCIgCi0gICAgICogZGlyZWN0aW9uLiAKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBUZXh0TGF5b3V0IGhhcyBhICJsZWZ0IHRvIHJpZ2h0IiBkaXJlY3Rpb24sIGZhbHNlIGlmCisgICAgICogICAgICAgICB0aGlzIFRleHRMYXlvdXQgaGFzIGEgInJpZ2h0IHRvIGxlZnQiIGRpcmVjdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0xlZnRUb1JpZ2h0KCkgewogICAgICAgICByZXR1cm4gYnJlYWtlci5pc0xUUigpOwpAQCAtOTEzLDQgKzkyNSwzIEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9mb250L1RleHRNZWFzdXJlci5qYXZhIGIvYXd0L2phdmEvYXd0L2ZvbnQvVGV4dE1lYXN1cmVyLmphdmEKaW5kZXggMDE3ZjNkOS4uOTc0MWY1OSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ZvbnQvVGV4dE1lYXN1cmVyLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ZvbnQvVGV4dE1lYXN1cmVyLmphdmEKQEAgLTIxLDcgKzIxLDYgQEAKIAogcGFja2FnZSBqYXZhLmF3dC5mb250OwogCi0KIGltcG9ydCBqYXZhLnRleHQuQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5nbC5mb250LlRleHRNZXRyaWNzQ2FsY3VsYXRvcjsKQEAgLTI5LDI2ICsyOCwzOCBAQAogCiAvKioKICAqIFRoZSBUZXh0TWVhc3VyZXIgY2xhc3MgcHJvdmlkZXMgdXRpbGl0aWVzIGZvciBsaW5lIGJyZWFrIG9wZXJhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgVGV4dE1lYXN1cmVyIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKLSAgICAKLSAgICAvKiogVGhlIGFjaS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBhY2kuCisgICAgICovCiAgICAgQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yIGFjaTsKLSAgICAKLSAgICAvKiogVGhlIGZyYy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBmcmMuCisgICAgICovCiAgICAgRm9udFJlbmRlckNvbnRleHQgZnJjOwotICAgIAotICAgIC8qKiBUaGUgYnJlYWtlci4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBicmVha2VyLgorICAgICAqLwogICAgIFRleHRSdW5CcmVha2VyIGJyZWFrZXIgPSBudWxsOwotICAgIAotICAgIC8qKiBUaGUgdG1jLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHRtYy4KKyAgICAgKi8KICAgICBUZXh0TWV0cmljc0NhbGN1bGF0b3IgdG1jID0gbnVsbDsKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyB0ZXh0IG1lYXN1cmVyIGZyb20gdGhlIHNwZWNpZmllZCB0ZXh0LgogICAgICAqIAotICAgICAqIEBwYXJhbSB0ZXh0IHRoZSBzb3VyY2UgdGV4dC4KLSAgICAgKiBAcGFyYW0gZnJjIHRoZSBGb250UmVuZGVyQ29udGV4dC4KKyAgICAgKiBAcGFyYW0gdGV4dAorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSB0ZXh0LgorICAgICAqIEBwYXJhbSBmcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBGb250UmVuZGVyQ29udGV4dC4KICAgICAgKi8KICAgICBwdWJsaWMgVGV4dE1lYXN1cmVyKEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciB0ZXh0LCBGb250UmVuZGVyQ29udGV4dCBmcmMpIHsKICAgICAgICAgdGhpcy5hY2kgPSB0ZXh0OwpAQCAtNTgsMTcgKzY5LDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVwbGFjZXMgdGhlIGN1cnJlbnQgdGV4dCB3aXRoIHRoZSBuZXcgdGV4dCwgaW5zZXJ0aW5nIGEgYnJlYWsKLSAgICAgKiBjaGFyYWN0ZXIgYXQgdGhlIHNwZWNpZmllZCBpbnNlcnQgcG9zaXRpb24uICAKKyAgICAgKiBSZXBsYWNlcyB0aGUgY3VycmVudCB0ZXh0IHdpdGggdGhlIG5ldyB0ZXh0LCBpbnNlcnRpbmcgYSBicmVhayBjaGFyYWN0ZXIKKyAgICAgKiBhdCB0aGUgc3BlY2lmaWVkIGluc2VydCBwb3NpdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmV3UGFyYWdyYXBoIHRoZSBuZXcgcGFyYWdyYXBoIHRleHQuIAotICAgICAqIEBwYXJhbSBpbnNlcnRQb3MgdGhlIHBvc2l0aW9uIGluIHRoZSB0ZXh0IHdoZXJlIHRoZSBjaGFyYWN0ZXIgaXMgaW5zZXJ0ZWQuIAorICAgICAqIEBwYXJhbSBuZXdQYXJhZ3JhcGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgcGFyYWdyYXBoIHRleHQuCisgICAgICogQHBhcmFtIGluc2VydFBvcworICAgICAqICAgICAgICAgICAgdGhlIHBvc2l0aW9uIGluIHRoZSB0ZXh0IHdoZXJlIHRoZSBjaGFyYWN0ZXIgaXMgaW5zZXJ0ZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgaW5zZXJ0Q2hhcihBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IgbmV3UGFyYWdyYXBoLCBpbnQgaW5zZXJ0UG9zKSB7CiAgICAgICAgIEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciBvbGRBY2kgPSBhY2k7CiAgICAgICAgIGFjaSA9IG5ld1BhcmFncmFwaDsKLSAgICAgICAgaWYgKChvbGRBY2kuZ2V0RW5kSW5kZXgoKSAtIG9sZEFjaS5nZXRCZWdpbkluZGV4KCkpIC0KLSAgICAgICAgICAgKGFjaS5nZXRFbmRJbmRleCgpIC0gYWNpLmdldEJlZ2luSW5kZXgoKSkgIT0gLTEpIHsKKyAgICAgICAgaWYgKChvbGRBY2kuZ2V0RW5kSW5kZXgoKSAtIG9sZEFjaS5nZXRCZWdpbkluZGV4KCkpCisgICAgICAgICAgICAgICAgLSAoYWNpLmdldEVuZEluZGV4KCkgLSBhY2kuZ2V0QmVnaW5JbmRleCgpKSAhPSAtMSkgewogICAgICAgICAgICAgYnJlYWtlciA9IG5ldyBUZXh0UnVuQnJlYWtlcihhY2ksIHRoaXMuZnJjKTsKICAgICAgICAgICAgIHRtYyA9IG5ldyBUZXh0TWV0cmljc0NhbGN1bGF0b3IoYnJlYWtlcik7CiAgICAgICAgIH0gZWxzZSB7CkBAIC03NywxNyArOTAsMTkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXBsYWNlcyB0aGUgY3VycmVudCB0ZXh0IHdpdGggdGhlIG5ldyB0ZXh0IGFuZCBkZWxldGVzIGEKLSAgICAgKiBjaGFyYWN0ZXIgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbi4gIAorICAgICAqIFJlcGxhY2VzIHRoZSBjdXJyZW50IHRleHQgd2l0aCB0aGUgbmV3IHRleHQgYW5kIGRlbGV0ZXMgYSBjaGFyYWN0ZXIgYXQKKyAgICAgKiB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLgogICAgICAqIAotICAgICAqIEBwYXJhbSBuZXdQYXJhZ3JhcGggdGhlIHBhcmFncmFwaCB0ZXh0IGFmdGVyIGRlbGV0aW9uLiAKLSAgICAgKiBAcGFyYW0gZGVsZXRlUG9zIHRoZSBwb3NpdGlvbiBpbiB0aGUgdGV4dCB3aGVyZSB0aGUgY2hhcmFjdGVyIGlzIHJlbW92ZWQuIAorICAgICAqIEBwYXJhbSBuZXdQYXJhZ3JhcGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhZ3JhcGggdGV4dCBhZnRlciBkZWxldGlvbi4KKyAgICAgKiBAcGFyYW0gZGVsZXRlUG9zCisgICAgICogICAgICAgICAgICB0aGUgcG9zaXRpb24gaW4gdGhlIHRleHQgd2hlcmUgdGhlIGNoYXJhY3RlciBpcyByZW1vdmVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRlbGV0ZUNoYXIoQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yIG5ld1BhcmFncmFwaCwgaW50IGRlbGV0ZVBvcykgewogICAgICAgICBBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3Igb2xkQWNpID0gYWNpOwogICAgICAgICBhY2kgPSBuZXdQYXJhZ3JhcGg7Ci0gICAgICAgIGlmICgob2xkQWNpLmdldEVuZEluZGV4KCkgLSBvbGRBY2kuZ2V0QmVnaW5JbmRleCgpKSAtCi0gICAgICAgICAgIChhY2kuZ2V0RW5kSW5kZXgoKSAtIGFjaS5nZXRCZWdpbkluZGV4KCkpICE9IDEpIHsKKyAgICAgICAgaWYgKChvbGRBY2kuZ2V0RW5kSW5kZXgoKSAtIG9sZEFjaS5nZXRCZWdpbkluZGV4KCkpCisgICAgICAgICAgICAgICAgLSAoYWNpLmdldEVuZEluZGV4KCkgLSBhY2kuZ2V0QmVnaW5JbmRleCgpKSAhPSAxKSB7CiAgICAgICAgICAgICBicmVha2VyID0gbmV3IFRleHRSdW5CcmVha2VyKGFjaSwgdGhpcy5mcmMpOwogICAgICAgICAgICAgdG1jID0gbmV3IFRleHRNZXRyaWNzQ2FsY3VsYXRvcihicmVha2VyKTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTEwMiwzOSArMTE3LDM5IEBACiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIE9iamVjdCBjbG9uZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXh0TWVhc3VyZXIoKEF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvcikgYWNpLmNsb25lKCksIGZyYyk7CisgICAgICAgIHJldHVybiBuZXcgVGV4dE1lYXN1cmVyKChBdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IpYWNpLmNsb25lKCksIGZyYyk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIFRleHRMYXlvdXQgb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgcmFuZ2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIHN0YXJ0IHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyLgotICAgICAqIEBwYXJhbSBsaW1pdCB0aGUgaW5kZXggYWZ0ZXIgdGhlIGxhc3QgY2hhcmFjdGVyLiAKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgVGV4dExheW91dCBmb3IgdGhlIGNoYXJhY3RlcnMgYmVnaW5uaW5nIGF0ICJzdGFydCIgdXAgCi0gICAgICogdG8gImVuZCIuCisgICAgICogQHBhcmFtIHN0YXJ0CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3Rlci4KKyAgICAgKiBAcGFyYW0gbGltaXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBhZnRlciB0aGUgbGFzdCBjaGFyYWN0ZXIuCisgICAgICogQHJldHVybiBhIFRleHRMYXlvdXQgZm9yIHRoZSBjaGFyYWN0ZXJzIGJlZ2lubmluZyBhdCAic3RhcnQiIHVwIHRvICJlbmQiLgogICAgICAqLwogICAgIHB1YmxpYyBUZXh0TGF5b3V0IGdldExheW91dChpbnQgc3RhcnQsIGludCBsaW1pdCkgewogICAgICAgICBicmVha2VyLnB1c2hTZWdtZW50cyhzdGFydCAtIGFjaS5nZXRCZWdpbkluZGV4KCksIGxpbWl0IC0gYWNpLmdldEJlZ2luSW5kZXgoKSk7CiAKICAgICAgICAgYnJlYWtlci5jcmVhdGVBbGxTZWdtZW50cygpOwotICAgICAgICBUZXh0TGF5b3V0IGxheW91dCA9IG5ldyBUZXh0TGF5b3V0KChUZXh0UnVuQnJlYWtlcikgYnJlYWtlci5jbG9uZSgpKTsKKyAgICAgICAgVGV4dExheW91dCBsYXlvdXQgPSBuZXcgVGV4dExheW91dCgoVGV4dFJ1bkJyZWFrZXIpYnJlYWtlci5jbG9uZSgpKTsKIAogICAgICAgICBicmVha2VyLnBvcFNlZ21lbnRzKCk7CiAgICAgICAgIHJldHVybiBsYXlvdXQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZ3JhcGhpY2FsIHdpZHRoIG9mIGEgbGluZSBiZWdpbm5pbmcgYXQgInN0YXJ0IiAKLSAgICAgKiBwYXJhbWV0ZXIgYW5kIGluY2x1ZGluZyBjaGFyYWN0ZXJzIHVwIHRvICJlbmQiIHBhcmFtZXRlci4gCi0gICAgICogInN0YXJ0IiBhbmQgImVuZCIgYXJlIGFic29sdXRlIGluZGljZXMsIG5vdCByZWxhdGl2ZSB0byB0aGUgCi0gICAgICogInN0YXJ0IiBvZiB0aGUgcGFyYWdyYXBoLgorICAgICAqIFJldHVybnMgdGhlIGdyYXBoaWNhbCB3aWR0aCBvZiBhIGxpbmUgYmVnaW5uaW5nIGF0ICJzdGFydCIgcGFyYW1ldGVyIGFuZAorICAgICAqIGluY2x1ZGluZyBjaGFyYWN0ZXJzIHVwIHRvICJlbmQiIHBhcmFtZXRlci4gInN0YXJ0IiBhbmQgImVuZCIgYXJlCisgICAgICogYWJzb2x1dGUgaW5kaWNlcywgbm90IHJlbGF0aXZlIHRvIHRoZSAic3RhcnQiIG9mIHRoZSBwYXJhZ3JhcGguCiAgICAgICogCi0gICAgICogQHBhcmFtIHN0YXJ0IHRoZSBjaGFyYWN0ZXIgaW5kZXggYXQgd2hpY2ggdG8gc3RhcnQgbWVhc3VyaW5nLgotICAgICAqIEBwYXJhbSBlbmQgdGhlIGNoYXJhY3RlciBpbmRleCBhdCB3aGljaCB0byBzdG9wIG1lYXN1cmluZy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBncmFwaGljYWwgd2lkdGggb2YgYSBsaW5lIGJlZ2lubmluZyBhdCAic3RhcnQiICAKLSAgICAgKiBhbmQgaW5jbHVkaW5nIGNoYXJhY3RlcnMgdXAgdG8gImVuZCIuCisgICAgICogQHBhcmFtIHN0YXJ0CisgICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIGluZGV4IGF0IHdoaWNoIHRvIHN0YXJ0IG1lYXN1cmluZy4KKyAgICAgKiBAcGFyYW0gZW5kCisgICAgICogICAgICAgICAgICB0aGUgY2hhcmFjdGVyIGluZGV4IGF0IHdoaWNoIHRvIHN0b3AgbWVhc3VyaW5nLgorICAgICAqIEByZXR1cm4gdGhlIGdyYXBoaWNhbCB3aWR0aCBvZiBhIGxpbmUgYmVnaW5uaW5nIGF0ICJzdGFydCIgYW5kIGluY2x1ZGluZworICAgICAqICAgICAgICAgY2hhcmFjdGVycyB1cCB0byAiZW5kIi4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0QWR2YW5jZUJldHdlZW4oaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICAgICAgIGJyZWFrZXIucHVzaFNlZ21lbnRzKHN0YXJ0IC0gYWNpLmdldEJlZ2luSW5kZXgoKSwgZW5kIC0gYWNpLmdldEJlZ2luSW5kZXgoKSk7CkBAIC0xNDcsMjEgKzE2MiwyMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgd2hpY2ggaXMgbm90IGZpdCBvbiAKLSAgICAgKiBhIGxpbmUgYmVnaW5uaW5nIGF0IHN0YXJ0IGFuZCBwb3NzaWJsZSBtZWFzdXJpbmcgdXAgdG8gbWF4QWR2YW5jZSAKLSAgICAgKiBpbiBncmFwaGljYWwgd2lkdGguCi0gICAgICogCi0gICAgICogQHBhcmFtIHN0YXJ0IGhlIGNoYXJhY3RlciBpbmRleCBhdCB3aGljaCB0byBzdGFydCBtZWFzdXJpbmcuIAotICAgICAqIEBwYXJhbSBtYXhBZHZhbmNlIHRoZSBncmFwaGljYWwgd2lkdGggaW4gd2hpY2ggdGhlIGxpbmUgbXVzdCBmaXQuIAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGluZGV4IGFmdGVyIHRoZSBsYXN0IGNoYXJhY3RlciB0aGF0IGlzIGZpdCBvbiBhIGxpbmUgCi0gICAgICogYmVnaW5uaW5nIGF0IHN0YXJ0LCB3aGljaCBpcyBub3QgbG9uZ2VyIHRoYW4gbWF4QWR2YW5jZSBpbiBncmFwaGljYWwKKyAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIHdoaWNoIGlzIG5vdCBmaXQgb24gYSBsaW5lCisgICAgICogYmVnaW5uaW5nIGF0IHN0YXJ0IGFuZCBwb3NzaWJsZSBtZWFzdXJpbmcgdXAgdG8gbWF4QWR2YW5jZSBpbiBncmFwaGljYWwKICAgICAgKiB3aWR0aC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3RhcnQKKyAgICAgKiAgICAgICAgICAgIGhlIGNoYXJhY3RlciBpbmRleCBhdCB3aGljaCB0byBzdGFydCBtZWFzdXJpbmcuCisgICAgICogQHBhcmFtIG1heEFkdmFuY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBncmFwaGljYWwgd2lkdGggaW4gd2hpY2ggdGhlIGxpbmUgbXVzdCBmaXQuCisgICAgICogQHJldHVybiB0aGUgaW5kZXggYWZ0ZXIgdGhlIGxhc3QgY2hhcmFjdGVyIHRoYXQgaXMgZml0IG9uIGEgbGluZQorICAgICAqICAgICAgICAgYmVnaW5uaW5nIGF0IHN0YXJ0LCB3aGljaCBpcyBub3QgbG9uZ2VyIHRoYW4gbWF4QWR2YW5jZSBpbgorICAgICAqICAgICAgICAgZ3JhcGhpY2FsIHdpZHRoLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TGluZUJyZWFrSW5kZXgoaW50IHN0YXJ0LCBmbG9hdCBtYXhBZHZhbmNlKSB7CiAgICAgICAgIGJyZWFrZXIuY3JlYXRlQWxsU2VnbWVudHMoKTsKLSAgICAgICAgcmV0dXJuIGJyZWFrZXIuZ2V0TGluZUJyZWFrSW5kZXgoCi0gICAgICAgICAgICAgICAgc3RhcnQgLSBhY2kuZ2V0QmVnaW5JbmRleCgpLCBtYXhBZHZhbmNlKSArIGFjaS5nZXRCZWdpbkluZGV4KCk7CisgICAgICAgIHJldHVybiBicmVha2VyLmdldExpbmVCcmVha0luZGV4KHN0YXJ0IC0gYWNpLmdldEJlZ2luSW5kZXgoKSwgbWF4QWR2YW5jZSkKKyAgICAgICAgICAgICAgICArIGFjaS5nZXRCZWdpbkluZGV4KCk7CiAgICAgfQogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZm9udC9UcmFuc2Zvcm1BdHRyaWJ1dGUuamF2YSBiL2F3dC9qYXZhL2F3dC9mb250L1RyYW5zZm9ybUF0dHJpYnV0ZS5qYXZhCmluZGV4IDdjOWIwYmQuLmZmMmNhYTIgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9mb250L1RyYW5zZm9ybUF0dHJpYnV0ZS5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9mb250L1RyYW5zZm9ybUF0dHJpYnV0ZS5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIElseWEgUy4gT2tvbWluCiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5mb250OwogCiBpbXBvcnQgamF2YS5hd3QuZ2VvbS5BZmZpbmVUcmFuc2Zvcm07CkBAIC0yOCwyOCArMjksMzQgQEAKIC8qKgogICogVGhlIFRyYW5zZm9ybUF0dHJpYnV0ZSBjbGFzcyBpcyBhIHdyYXBwZXIgZm9yIHRoZSBBZmZpbmVUcmFuc2Zvcm0gY2xhc3MgaW4KICAqIG9yZGVyIHRvIHVzZSBpdCBhcyBhdHRyaWJ1dGUuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgVHJhbnNmb3JtQXR0cmlidXRlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLSAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgc2VyaWFsVmVyc2lvblVJRC4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMzU2MjQ3MzU3ODI3NzA5NTMwTDsKIAogICAgIC8vIGFmZmluZSB0cmFuc2Zvcm0gb2YgdGhpcyBUcmFuc2Zvcm1BdHRyaWJ1dGUgaW5zdGFuY2UKLSAgICAvKiogVGhlIHRyYW5zZm9ybS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgdHJhbnNmb3JtLgorICAgICAqLwogICAgIHByaXZhdGUgQWZmaW5lVHJhbnNmb3JtIGZUcmFuc2Zvcm07CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgVHJhbnNmb3JtQXR0cmlidXRlIGZyb20gdGhlIHNwZWNpZmllZAotICAgICAqIEFmZmluZVRyYW5zZm9ybS4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgVHJhbnNmb3JtQXR0cmlidXRlIGZyb20gdGhlIHNwZWNpZmllZCBBZmZpbmVUcmFuc2Zvcm0uCiAgICAgICogCi0gICAgICogQHBhcmFtIHRyYW5zZm9ybSB0aGUgQWZmaW5lVHJhbnNmb3JtIHRvIGJlIHdyYXBwZWQuCisgICAgICogQHBhcmFtIHRyYW5zZm9ybQorICAgICAqICAgICAgICAgICAgdGhlIEFmZmluZVRyYW5zZm9ybSB0byBiZSB3cmFwcGVkLgogICAgICAqLwogICAgIHB1YmxpYyBUcmFuc2Zvcm1BdHRyaWJ1dGUoQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybSkgewogICAgICAgICBpZiAodHJhbnNmb3JtID09IG51bGwpIHsKICAgICAgICAgICAgIC8vIGF3dC45ND10cmFuc2Zvcm0gY2FuIG5vdCBiZSBudWxsCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0Ljk0IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KLSAgICAgICAgaWYgKCF0cmFuc2Zvcm0uaXNJZGVudGl0eSgpKXsKKyAgICAgICAgaWYgKCF0cmFuc2Zvcm0uaXNJZGVudGl0eSgpKSB7CiAgICAgICAgICAgICB0aGlzLmZUcmFuc2Zvcm0gPSBuZXcgQWZmaW5lVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgICAgIH0KICAgICB9CkBAIC02MCw3ICs2Nyw3IEBACiAgICAgICogQHJldHVybiB0aGUgaW5pdGlhbCBBZmZpbmVUcmFuc2Zvcm0gd2hpY2ggaXMgd3JhcHBlZC4KICAgICAgKi8KICAgICBwdWJsaWMgQWZmaW5lVHJhbnNmb3JtIGdldFRyYW5zZm9ybSgpIHsKLSAgICAgICAgaWYgKGZUcmFuc2Zvcm0gIT0gbnVsbCl7CisgICAgICAgIGlmIChmVHJhbnNmb3JtICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBuZXcgQWZmaW5lVHJhbnNmb3JtKGZUcmFuc2Zvcm0pOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBuZXcgQWZmaW5lVHJhbnNmb3JtKCk7CkBAIC02OSwxMiArNzYsMTEgQEAKICAgICAvKioKICAgICAgKiBDaGVja3MgaWYgdGhpcyB0cmFuc2Zvcm0gaXMgYW4gaWRlbnRpdHkgdHJhbnNmb3JtLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyB0cmFuc2Zvcm0gaXMgYW4gaWRlbnRpdHkgdHJhbnNmb3JtLAotICAgICAqIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgdHJhbnNmb3JtIGlzIGFuIGlkZW50aXR5IHRyYW5zZm9ybSwgZmFsc2UKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0lkZW50aXR5KCkgewogICAgICAgICByZXR1cm4gKGZUcmFuc2Zvcm0gPT0gbnVsbCk7CiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9mb250L3BhY2thZ2UuaHRtbCBiL2F3dC9qYXZhL2F3dC9mb250L3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODhkY2MwCi0tLSAvZGV2L251bGwKKysrIGIvYXd0L2phdmEvYXd0L2ZvbnQvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsOCBAQAorPGh0bWw+CisgIDxib2R5PgorICAgIDxwPgorICAgICAgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIGNsYXNzZXMgdG8gc3VwcG9ydCB0aGUgcmVwcmVzZW50YXRpb24gb2YgZGlmZmVyZW50IHR5cGVzIG9mIGZvbnRzIGZvciBleGFtcGxlIFRydWVUeXBlIGZvbnRzLgorICAgIDwvcD4KKyAgICBAc2luY2UgQW5kcm9pZCAxLjAKKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2dlb20vQWZmaW5lVHJhbnNmb3JtLmphdmEgYi9hd3QvamF2YS9hd3QvZ2VvbS9BZmZpbmVUcmFuc2Zvcm0uamF2YQppbmRleCA1ZmQzOTM0Li44YTY5MzhjIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZ2VvbS9BZmZpbmVUcmFuc2Zvcm0uamF2YQorKysgYi9hd3QvamF2YS9hd3QvZ2VvbS9BZmZpbmVUcmFuc2Zvcm0uamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBEZW5pcyBNLiBLaXNoZW5rbwogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuZ2VvbTsKIAogaW1wb3J0IGphdmEuYXd0LlNoYXBlOwpAQCAtMjgsNzYgKzI5LDExOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5taXNjLkhhc2hDb2RlOwogCiAvKioKLSAqIFRoZSBDbGFzcyBBZmZpbmVUcmFuc2Zvcm0gcmVwcmVzZW50cyBhIGxpbmVhciB0cmFuc2Zvcm1hdGlvbiAKLSAqIChyb3RhdGlvbiwgc2NhbGluZywgb3Igc2hlYXIpIGZvbGxvd2VkIGJ5IGEgdHJhbnNsYXRpb24gdGhhdCAKLSAqIGFjdHMgb24gYSBjb29yZGluYXRlIHNwYWNlLiBJdCBwcmVzZXJ2ZXMgY29saW5lYXJpdHkgb2YgcG9pbnRzIAotICogYW5kIHJhdGlvcyBvZiBkaXN0YW5jZXMgYmV0d2VlbiBjb2xsaW5lYXIgcG9pbnRzOiBzbyBpZiBBLCBCLCAKLSAqIGFuZCBDIGFyZSBvbiBhIGxpbmUsIHRoZW4gYWZ0ZXIgdGhlIHNwYWNlIGhhcyBiZWVuIHRyYW5zZm9ybWVkIAotICogdmlhIHRoZSBhZmZpbmUgdHJhbnNmb3JtLCB0aGUgaW1hZ2VzIG9mIHRoZSB0aHJlZSBwb2ludHMgd2lsbCAKLSAqIHN0aWxsIGJlIG9uIGEgbGluZSwgYW5kIHRoZSByYXRpbyBvZiB0aGUgZGlzdGFuY2UgZnJvbSBBIHRvIEIKLSAqIHdpdGggdGhlIGRpc3RhbmNlIGZyb20gQiB0byBDIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIGNvcnJlc3BvbmRpbmcKLSAqIHJhdGlvIGluIHRoZSBpbWFnZSBzcGFjZS4KKyAqIFRoZSBDbGFzcyBBZmZpbmVUcmFuc2Zvcm0gcmVwcmVzZW50cyBhIGxpbmVhciB0cmFuc2Zvcm1hdGlvbiAocm90YXRpb24sCisgKiBzY2FsaW5nLCBvciBzaGVhcikgZm9sbG93ZWQgYnkgYSB0cmFuc2xhdGlvbiB0aGF0IGFjdHMgb24gYSBjb29yZGluYXRlIHNwYWNlLgorICogSXQgcHJlc2VydmVzIGNvbGxpbmVhcml0eSBvZiBwb2ludHMgYW5kIHJhdGlvcyBvZiBkaXN0YW5jZXMgYmV0d2VlbiBjb2xsaW5lYXIKKyAqIHBvaW50czogc28gaWYgQSwgQiwgYW5kIEMgYXJlIG9uIGEgbGluZSwgdGhlbiBhZnRlciB0aGUgc3BhY2UgaGFzIGJlZW4KKyAqIHRyYW5zZm9ybWVkIHZpYSB0aGUgYWZmaW5lIHRyYW5zZm9ybSwgdGhlIGltYWdlcyBvZiB0aGUgdGhyZWUgcG9pbnRzIHdpbGwKKyAqIHN0aWxsIGJlIG9uIGEgbGluZSwgYW5kIHRoZSByYXRpbyBvZiB0aGUgZGlzdGFuY2UgZnJvbSBBIHRvIEIgd2l0aCB0aGUKKyAqIGRpc3RhbmNlIGZyb20gQiB0byBDIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIGNvcnJlc3BvbmRpbmcgcmF0aW8gaW4gdGhlIGltYWdlCisgKiBzcGFjZS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBBZmZpbmVUcmFuc2Zvcm0gaW1wbGVtZW50cyBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZSB7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTMzMDk3MzIxMDUyMzg2MDgzNEw7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFRZUEVfSURFTlRJVFkuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfSURFTlRJVFkuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9JREVOVElUWSA9IDA7Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBUWVBFX1RSQU5TTEFUSU9OLiAqLworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfVFJBTlNMQVRJT04uCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9UUkFOU0xBVElPTiA9IDE7Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBUWVBFX1VOSUZPUk1fU0NBTEUuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9VTklGT1JNX1NDQUxFLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfVU5JRk9STV9TQ0FMRSA9IDI7Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBUWVBFX0dFTkVSQUxfU0NBTEUuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9HRU5FUkFMX1NDQUxFLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfR0VORVJBTF9TQ0FMRSA9IDQ7Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBUWVBFX1FVQURSQU5UX1JPVEFUSU9OLiAqLworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfUVVBRFJBTlRfUk9UQVRJT04uCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9RVUFEUkFOVF9ST1RBVElPTiA9IDg7Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBUWVBFX0dFTkVSQUxfUk9UQVRJT04uICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9HRU5FUkFMX1JPVEFUSU9OLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfR0VORVJBTF9ST1RBVElPTiA9IDE2OwotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgVFlQRV9HRU5FUkFMX1RSQU5TRk9STS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX0dFTkVSQUxfVFJBTlNGT1JNLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfR0VORVJBTF9UUkFOU0ZPUk0gPSAzMjsKLSAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IFRZUEVfRkxJUC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX0ZMSVAuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9GTElQID0gNjQ7Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBUWVBFX01BU0tfU0NBTEUuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9NQVNLX1NDQUxFLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfTUFTS19TQ0FMRSA9IFRZUEVfVU5JRk9STV9TQ0FMRSB8IFRZUEVfR0VORVJBTF9TQ0FMRTsKLSAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IFRZUEVfTUFTS19ST1RBVElPTi4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX01BU0tfUk9UQVRJT04uCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9NQVNLX1JPVEFUSU9OID0gVFlQRV9RVUFEUkFOVF9ST1RBVElPTiB8IFRZUEVfR0VORVJBTF9ST1RBVElPTjsKIAotICAgIC8qKiBUaGUgPGNvZGU+VFlQRV9VTktOT1dOPC9jb2RlPiBpcyBhbiBpbml0aWFsIHR5cGUgdmFsdWUuICovCisgICAgLyoqCisgICAgICogVGhlIDxjb2RlPlRZUEVfVU5LTk9XTjwvY29kZT4gaXMgYW4gaW5pdGlhbCB0eXBlIHZhbHVlLgorICAgICAqLwogICAgIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9VTktOT1dOID0gLTE7Ci0gICAgCi0gICAgLyoqIFRoZSBtaW4gdmFsdWUgZXF1aXZhbGVudCB0byB6ZXJvLiBJZiBhYnNvbHV0ZSB2YWx1ZSBsZXNzIHRoZW4gWkVSTyBpdCBjb25zaWRlcmVkIGFzIHplcm8uICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgbWluIHZhbHVlIGVxdWl2YWxlbnQgdG8gemVyby4gSWYgYWJzb2x1dGUgdmFsdWUgbGVzcyB0aGVuIFpFUk8gaXQKKyAgICAgKiBjb25zaWRlcmVkIGFzIHplcm8uCisgICAgICovCiAgICAgc3RhdGljIGZpbmFsIGRvdWJsZSBaRVJPID0gMUUtMTA7Ci0gICAKLSAgICAvKiogVGhlIHZhbHVlcyBvZiB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgdmFsdWVzIG9mIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4KKyAgICAgKi8KICAgICBkb3VibGUgbTAwOwotICAgIAotICAgIC8qKiBUaGUgbTEwLiAqLworCisgICAgLyoqCisgICAgICogVGhlIG0xMC4KKyAgICAgKi8KICAgICBkb3VibGUgbTEwOwotICAgIAotICAgIC8qKiBUaGUgbTAxLiAqLworCisgICAgLyoqCisgICAgICogVGhlIG0wMS4KKyAgICAgKi8KICAgICBkb3VibGUgbTAxOwotICAgIAotICAgIC8qKiBUaGUgbTExLiAqLworCisgICAgLyoqCisgICAgICogVGhlIG0xMS4KKyAgICAgKi8KICAgICBkb3VibGUgbTExOwotICAgIAotICAgIC8qKiBUaGUgbTAyLiAqLworCisgICAgLyoqCisgICAgICogVGhlIG0wMi4KKyAgICAgKi8KICAgICBkb3VibGUgbTAyOwotICAgIAotICAgIC8qKiBUaGUgbTEyLiAqLworCisgICAgLyoqCisgICAgICogVGhlIG0xMi4KKyAgICAgKi8KICAgICBkb3VibGUgbTEyOwogCi0gICAgLyoqIFRoZSB0cmFuc2Zvcm1hdGlvbiA8Y29kZT50eXBlPC9jb2RlPi4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgdHJhbnNmb3JtYXRpb24gPGNvZGU+dHlwZTwvY29kZT4uCisgICAgICovCiAgICAgdHJhbnNpZW50IGludCB0eXBlOwogCiAgICAgLyoqCkBAIC0xMTEsMTAgKzE1NCwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBhZmZpbmUgdHJhbnNmb3JtIHRoYXQgaGFzIHRoZSBzYW1lIGRhdGEgYXMKLSAgICAgKiB0aGUgZ2l2ZW4gQWZmaW5lVHJhbnNmb3JtLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBhZmZpbmUgdHJhbnNmb3JtIHRoYXQgaGFzIHRoZSBzYW1lIGRhdGEgYXMgdGhlIGdpdmVuCisgICAgICogQWZmaW5lVHJhbnNmb3JtLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0IHRoZSB0cmFuc2Zvcm0gdG8gY29weS4KKyAgICAgKiBAcGFyYW0gdAorICAgICAqICAgICAgICAgICAgdGhlIHRyYW5zZm9ybSB0byBjb3B5LgogICAgICAqLwogICAgIHB1YmxpYyBBZmZpbmVUcmFuc2Zvcm0oQWZmaW5lVHJhbnNmb3JtIHQpIHsKICAgICAgICAgdGhpcy50eXBlID0gdC50eXBlOwpAQCAtMTI4LDE1ICsxNzIsMjEgQEAKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBhZmZpbmUgdHJhbnNmb3JtIGJ5IHNwZWNpZnlpbmcgdGhlIHZhbHVlcyBvZiB0aGUgMngzCi0gICAgICogdHJhbnNmb3JtYXRpb24gbWF0cml4IGFzIGZsb2F0cy4gVGhlIHR5cGUgaXMgc2V0IHRvIHRoZSBkZWZhdWx0Ci0gICAgICogdHlwZTogPGNvZGU+VFlQRV9VTktOT1dOPC9jb2RlPgorICAgICAqIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBhcyBmbG9hdHMuIFRoZSB0eXBlIGlzIHNldCB0byB0aGUgZGVmYXVsdCB0eXBlOgorICAgICAqIDxjb2RlPlRZUEVfVU5LTk9XTjwvY29kZT4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbTAwIHRoZSBtMDAgZW50cnkgaW4gdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4KLSAgICAgKiBAcGFyYW0gbTEwIHRoZSBtMTAgZW50cnkgaW4gdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4KLSAgICAgKiBAcGFyYW0gbTAxIHRoZSBtMDEgZW50cnkgaW4gdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4KLSAgICAgKiBAcGFyYW0gbTExIHRoZSBtMTEgZW50cnkgaW4gdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4KLSAgICAgKiBAcGFyYW0gbTAyIHRoZSBtMDIgZW50cnkgaW4gdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4KLSAgICAgKiBAcGFyYW0gbTEyIHRoZSBtMTIgZW50cnkgaW4gdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4KKyAgICAgKiBAcGFyYW0gbTAwCisgICAgICogICAgICAgICAgICB0aGUgbTAwIGVudHJ5IGluIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguCisgICAgICogQHBhcmFtIG0xMAorICAgICAqICAgICAgICAgICAgdGhlIG0xMCBlbnRyeSBpbiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LgorICAgICAqIEBwYXJhbSBtMDEKKyAgICAgKiAgICAgICAgICAgIHRoZSBtMDEgZW50cnkgaW4gdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4KKyAgICAgKiBAcGFyYW0gbTExCisgICAgICogICAgICAgICAgICB0aGUgbTExIGVudHJ5IGluIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguCisgICAgICogQHBhcmFtIG0wMgorICAgICAqICAgICAgICAgICAgdGhlIG0wMiBlbnRyeSBpbiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LgorICAgICAqIEBwYXJhbSBtMTIKKyAgICAgKiAgICAgICAgICAgIHRoZSBtMTIgZW50cnkgaW4gdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4KICAgICAgKi8KICAgICBwdWJsaWMgQWZmaW5lVHJhbnNmb3JtKGZsb2F0IG0wMCwgZmxvYXQgbTEwLCBmbG9hdCBtMDEsIGZsb2F0IG0xMSwgZmxvYXQgbTAyLCBmbG9hdCBtMTIpIHsKICAgICAgICAgdGhpcy50eXBlID0gVFlQRV9VTktOT1dOOwpAQCAtMTUwLDE1ICsyMDAsMjEgQEAKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBhZmZpbmUgdHJhbnNmb3JtIGJ5IHNwZWNpZnlpbmcgdGhlIHZhbHVlcyBvZiB0aGUgMngzCi0gICAgICogdHJhbnNmb3JtYXRpb24gbWF0cml4IGFzIGRvdWJsZXMuIFRoZSB0eXBlIGlzIHNldCB0byB0aGUgZGVmYXVsdAotICAgICAqIHR5cGU6IDxjb2RlPlRZUEVfVU5LTk9XTjwvY29kZT4KKyAgICAgKiB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggYXMgZG91Ymxlcy4gVGhlIHR5cGUgaXMgc2V0IHRvIHRoZSBkZWZhdWx0IHR5cGU6CisgICAgICogPGNvZGU+VFlQRV9VTktOT1dOPC9jb2RlPgogICAgICAqIAotICAgICAqIEBwYXJhbSBtMDAgdGhlIG0wMCBlbnRyeSBpbiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LgotICAgICAqIEBwYXJhbSBtMTAgdGhlIG0xMCBlbnRyeSBpbiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LgotICAgICAqIEBwYXJhbSBtMDEgdGhlIG0wMSBlbnRyeSBpbiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LgotICAgICAqIEBwYXJhbSBtMTEgdGhlIG0xMSBlbnRyeSBpbiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LgotICAgICAqIEBwYXJhbSBtMDIgdGhlIG0wMiBlbnRyeSBpbiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LgotICAgICAqIEBwYXJhbSBtMTIgdGhlIG0xMiBlbnRyeSBpbiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LgorICAgICAqIEBwYXJhbSBtMDAKKyAgICAgKiAgICAgICAgICAgIHRoZSBtMDAgZW50cnkgaW4gdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4KKyAgICAgKiBAcGFyYW0gbTEwCisgICAgICogICAgICAgICAgICB0aGUgbTEwIGVudHJ5IGluIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguCisgICAgICogQHBhcmFtIG0wMQorICAgICAqICAgICAgICAgICAgdGhlIG0wMSBlbnRyeSBpbiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LgorICAgICAqIEBwYXJhbSBtMTEKKyAgICAgKiAgICAgICAgICAgIHRoZSBtMTEgZW50cnkgaW4gdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4KKyAgICAgKiBAcGFyYW0gbTAyCisgICAgICogICAgICAgICAgICB0aGUgbTAyIGVudHJ5IGluIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguCisgICAgICogQHBhcmFtIG0xMgorICAgICAqICAgICAgICAgICAgdGhlIG0xMiBlbnRyeSBpbiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LgogICAgICAqLwogICAgIHB1YmxpYyBBZmZpbmVUcmFuc2Zvcm0oZG91YmxlIG0wMCwgZG91YmxlIG0xMCwgZG91YmxlIG0wMSwgZG91YmxlIG0xMSwgZG91YmxlIG0wMiwgZG91YmxlIG0xMikgewogICAgICAgICB0aGlzLnR5cGUgPSBUWVBFX1VOS05PV047CkBAIC0xNzEsMjAgKzIyNywyMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBhZmZpbmUgdHJhbnNmb3JtIGJ5IHJlYWRpbmcgdGhlIHZhbHVlcyBvZiB0aGUgCi0gICAgICogdHJhbnNmb3JtYXRpb24gbWF0cml4IGZyb20gYW4gYXJyYXkgb2YgZmxvYXRzLiBUaGUgbWFwcGluZyBmcm9tIHRoZQotICAgICAqIGFycmF5IHRvIHRoZSBtYXRyaXggc3RhcnRzIHdpdGggPGNvZGU+bWF0cml4WzBdPC9jb2RlPiBnaXZpbmcgdGhlIAotICAgICAqIHRvcC1sZWZ0IGVudHJ5IG9mIHRoZSBtYXRyaXggYW5kIAotICAgICAqIHByb2NlZWRzIHdpdGggdGhlIHVzdWFsIGxlZnQtdG8tcmlnaHQgYW5kIHRvcC1kb3duIG9yZGVyaW5nLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBhZmZpbmUgdHJhbnNmb3JtIGJ5IHJlYWRpbmcgdGhlIHZhbHVlcyBvZiB0aGUKKyAgICAgKiB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggZnJvbSBhbiBhcnJheSBvZiBmbG9hdHMuIFRoZSBtYXBwaW5nIGZyb20gdGhlIGFycmF5CisgICAgICogdG8gdGhlIG1hdHJpeCBzdGFydHMgd2l0aCA8Y29kZT5tYXRyaXhbMF08L2NvZGU+IGdpdmluZyB0aGUgdG9wLWxlZnQKKyAgICAgKiBlbnRyeSBvZiB0aGUgbWF0cml4IGFuZCBwcm9jZWVkcyB3aXRoIHRoZSB1c3VhbCBsZWZ0LXRvLXJpZ2h0IGFuZAorICAgICAqIHRvcC1kb3duIG9yZGVyaW5nLgogICAgICAqIDxwPgotICAgICAqIElmIHRoZSBhcnJheSBoYXMgb25seSBmb3VyIGVudHJpZXMsIHRoZW4gdGhlIHR3byBlbnRyaWVzIG9mIHRoZSAKLSAgICAgKiBsYXN0IHJvdyBvZiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4IGRlZmF1bHQgdG8gemVyby4KKyAgICAgKiBJZiB0aGUgYXJyYXkgaGFzIG9ubHkgZm91ciBlbnRyaWVzLCB0aGVuIHRoZSB0d28gZW50cmllcyBvZiB0aGUgbGFzdCByb3cKKyAgICAgKiBvZiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4IGRlZmF1bHQgdG8gemVyby4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWF0cml4IHRoZSBhcnJheSBvZiBmb3VyIG9yIHNpeCBmbG9hdHMgZ2l2aW5nIHRoZSB2YWx1ZXMgCi0gICAgICogb2YgdGhlIG1hdHJpeC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkKLSAgICAgKiBpcyAwLCAxLCAyLCAzLCBvciA1LgorICAgICAqIEBwYXJhbSBtYXRyaXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBmb3VyIG9yIHNpeCBmbG9hdHMgZ2l2aW5nIHRoZSB2YWx1ZXMgb2YgdGhlCisgICAgICogICAgICAgICAgICBtYXRyaXguCisgICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkgaXMgMCwgMSwgMiwgMywgb3IgNS4KICAgICAgKi8KICAgICBwdWJsaWMgQWZmaW5lVHJhbnNmb3JtKGZsb2F0W10gbWF0cml4KSB7CiAgICAgICAgIHRoaXMudHlwZSA9IFRZUEVfVU5LTk9XTjsKQEAgLTE5OSwyMCArMjU1LDIwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGFmZmluZSB0cmFuc2Zvcm0gYnkgcmVhZGluZyB0aGUgdmFsdWVzIG9mIHRoZSAKKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgYWZmaW5lIHRyYW5zZm9ybSBieSByZWFkaW5nIHRoZSB2YWx1ZXMgb2YgdGhlCiAgICAgICogdHJhbnNmb3JtYXRpb24gbWF0cml4IGZyb20gYW4gYXJyYXkgb2YgZG91Ymxlcy4gVGhlIG1hcHBpbmcgZnJvbSB0aGUKLSAgICAgKiBhcnJheSB0byB0aGUgbWF0cml4IHN0YXJ0cyB3aXRoIDxjb2RlPm1hdHJpeFswXTwvY29kZT4gZ2l2aW5nIHRoZSAKLSAgICAgKiB0b3AtbGVmdCBlbnRyeSBvZiB0aGUgbWF0cml4IGFuZCAKLSAgICAgKiBwcm9jZWVkcyB3aXRoIHRoZSB1c3VhbCBsZWZ0LXRvLXJpZ2h0IGFuZCB0b3AtZG93biBvcmRlcmluZy4KKyAgICAgKiBhcnJheSB0byB0aGUgbWF0cml4IHN0YXJ0cyB3aXRoIDxjb2RlPm1hdHJpeFswXTwvY29kZT4gZ2l2aW5nIHRoZQorICAgICAqIHRvcC1sZWZ0IGVudHJ5IG9mIHRoZSBtYXRyaXggYW5kIHByb2NlZWRzIHdpdGggdGhlIHVzdWFsIGxlZnQtdG8tcmlnaHQKKyAgICAgKiBhbmQgdG9wLWRvd24gb3JkZXJpbmcuCiAgICAgICogPHA+Ci0gICAgICogSWYgdGhlIGFycmF5IGhhcyBvbmx5IGZvdXIgZW50cmllcywgdGhlbiB0aGUgdHdvIGVudHJpZXMgb2YgdGhlIAotICAgICAqIGxhc3Qgcm93IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggZGVmYXVsdCB0byB6ZXJvLgorICAgICAqIElmIHRoZSBhcnJheSBoYXMgb25seSBmb3VyIGVudHJpZXMsIHRoZW4gdGhlIHR3byBlbnRyaWVzIG9mIHRoZSBsYXN0IHJvdworICAgICAqIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggZGVmYXVsdCB0byB6ZXJvLgogICAgICAqIAotICAgICAqIEBwYXJhbSBtYXRyaXggdGhlIGFycmF5IG9mIGZvdXIgb3Igc2l4IGRvdWJsZXMgZ2l2aW5nIHRoZSB2YWx1ZXMgCi0gICAgICogb2YgdGhlIG1hdHJpeC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkKLSAgICAgKiBpcyAwLCAxLCAyLCAzLCBvciA1LgorICAgICAqIEBwYXJhbSBtYXRyaXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBmb3VyIG9yIHNpeCBkb3VibGVzIGdpdmluZyB0aGUgdmFsdWVzIG9mIHRoZQorICAgICAqICAgICAgICAgICAgbWF0cml4LgorICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNpemUgb2YgdGhlIGFycmF5IGlzIDAsIDEsIDIsIDMsIG9yIDUuCiAgICAgICovCiAgICAgcHVibGljIEFmZmluZVRyYW5zZm9ybShkb3VibGVbXSBtYXRyaXgpIHsKICAgICAgICAgdGhpcy50eXBlID0gVFlQRV9VTktOT1dOOwpAQCAtMjI2LDI3ICsyODIsMjYgQEAKICAgICAgICAgfQogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0eXBlIG9mIHRoZSBhZmZpbmUgdHJhbnNmb3JtYXRpb24uCiAgICAgICogPHA+Ci0gICAgICogVGhlIHR5cGUgaXMgY29tcHV0ZWQgYXMgZm9sbG93czogTGFiZWwgdGhlIGVudHJpZXMgb2YgdGhlIAotICAgICAqIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBhcyB0aHJlZSByb3dzIChtMDAsIG0wMSksIChtMTAsIG0xMSksIGFuZAotICAgICAqIChtMDIsIG0xMikuIFRoZW4gaWYgdGhlIG9yaWdpbmFsIGJhc2lzIHZlY3RvcnMgYXJlICgxLCAwKSBhbmQgKDAsIDEpLCAKLSAgICAgKiB0aGUgbmV3IGJhc2lzIHZlY3RvcnMgYWZ0ZXIgdHJhbnNmb3JtYXRpb24gYXJlIGdpdmVuIGJ5IChtMDAsIG0wMSkgCi0gICAgICogYW5kIChtMTAsIG0xMSksIGFuZCB0aGUgdHJhbnNsYXRpb24gdmVjdG9yIGlzIChtMDIsIG0xMikuCisgICAgICogVGhlIHR5cGUgaXMgY29tcHV0ZWQgYXMgZm9sbG93czogTGFiZWwgdGhlIGVudHJpZXMgb2YgdGhlIHRyYW5zZm9ybWF0aW9uCisgICAgICogbWF0cml4IGFzIHRocmVlIHJvd3MgKG0wMCwgbTAxKSwgKG0xMCwgbTExKSwgYW5kIChtMDIsIG0xMikuIFRoZW4gaWYgdGhlCisgICAgICogb3JpZ2luYWwgYmFzaXMgdmVjdG9ycyBhcmUgKDEsIDApIGFuZCAoMCwgMSksIHRoZSBuZXcgYmFzaXMgdmVjdG9ycyBhZnRlcgorICAgICAqIHRyYW5zZm9ybWF0aW9uIGFyZSBnaXZlbiBieSAobTAwLCBtMDEpIGFuZCAobTEwLCBtMTEpLCBhbmQgdGhlCisgICAgICogdHJhbnNsYXRpb24gdmVjdG9yIGlzIChtMDIsIG0xMikuCiAgICAgICogPHA+Ci0gICAgICogVGhlIHR5cGVzIGFyZSBjbGFzc2lmaWVkIGFzIGZvbGxvd3M6IDxici8+IAotICAgICAqICAgVFlQRV9JREVOVElUWSAtIG5vIGNoYW5nZTxici8+Ci0gICAgICogICBUWVBFX1RSQU5TTEFUSU9OIC0gVGhlIHRyYW5zbGF0aW9uIHZlY3RvciBpc24ndCB6ZXJvPGJyLz4KLSAgICAgKiAgIFRZUEVfVU5JRk9STV9TQ0FMRSAtIFRoZSBuZXcgYmFzaXMgdmVjdG9ycyBoYXZlIGVxdWFsIGxlbmd0aDxici8+Ci0gICAgICogICBUWVBFX0dFTkVSQUxfU0NBTEUgLSBUaGUgbmV3IGJhc2lzIHZlY3RvcnMgZG9udCcgaGF2ZSBlcXVhbCBsZW5ndGg8YnIvPgotICAgICAqICAgVFlQRV9GTElQIC0gVGhlIG5ldyBiYXNpcyB2ZWN0b3Igb3JpZW50YXRpb24gZGlmZmVycyBmcm9tIHRoZSBvcmlnaW5hbCBvbmU8YnIvPgotICAgICAqICAgVFlQRV9RVUFEUkFOVF9ST1RBVElPTiAtIFRoZSBuZXcgYmFzaXMgaXMgYSByb3RhdGlvbiBvZiB0aGUgb3JpZ2luYWwgYnkgOTAsIDE4MCwgMjcwLCBvciAzNjAgZGVncmVlczxici8+ICAgCi0gICAgICogICBUWVBFX0dFTkVSQUxfUk9UQVRJT04gLSBUaGUgbmV3IGJhc2lzIGlzIGEgcm90YXRpb24gb2YgdGhlIG9yaWdpbmFsIGJ5IGFuIGFyYml0cmFyeSBhbmdsZTxici8+Ci0gICAgICogICBUWVBFX0dFTkVSQUxfVFJBTlNGT1JNIC0gVGhlIHRyYW5zZm9ybWF0aW9uIGNhbid0IGJlIGludmVydGVkLjxici8+Ci0gICAgICogICA8cD4KLSAgICAgKiBOb3RlIHRoYXQgbXVsdGlwbGUgdHlwZXMgYXJlIHBvc3NpYmxlLCB0aHVzIHRoZSB0eXBlcyBjYW4gYmUgY29tYmluZWQgCisgICAgICogVGhlIHR5cGVzIGFyZSBjbGFzc2lmaWVkIGFzIGZvbGxvd3M6IDxici8+IFRZUEVfSURFTlRJVFkgLSBubyBjaGFuZ2U8YnIvPgorICAgICAqIFRZUEVfVFJBTlNMQVRJT04gLSBUaGUgdHJhbnNsYXRpb24gdmVjdG9yIGlzbid0IHplcm88YnIvPgorICAgICAqIFRZUEVfVU5JRk9STV9TQ0FMRSAtIFRoZSBuZXcgYmFzaXMgdmVjdG9ycyBoYXZlIGVxdWFsIGxlbmd0aDxici8+CisgICAgICogVFlQRV9HRU5FUkFMX1NDQUxFIC0gVGhlIG5ldyBiYXNpcyB2ZWN0b3JzIGRvbnQnIGhhdmUgZXF1YWwgbGVuZ3RoPGJyLz4KKyAgICAgKiBUWVBFX0ZMSVAgLSBUaGUgbmV3IGJhc2lzIHZlY3RvciBvcmllbnRhdGlvbiBkaWZmZXJzIGZyb20gdGhlIG9yaWdpbmFsCisgICAgICogb25lPGJyLz4gVFlQRV9RVUFEUkFOVF9ST1RBVElPTiAtIFRoZSBuZXcgYmFzaXMgaXMgYSByb3RhdGlvbiBvZiB0aGUKKyAgICAgKiBvcmlnaW5hbCBieSA5MCwgMTgwLCAyNzAsIG9yIDM2MCBkZWdyZWVzPGJyLz4gVFlQRV9HRU5FUkFMX1JPVEFUSU9OIC0gVGhlCisgICAgICogbmV3IGJhc2lzIGlzIGEgcm90YXRpb24gb2YgdGhlIG9yaWdpbmFsIGJ5IGFuIGFyYml0cmFyeSBhbmdsZTxici8+CisgICAgICogVFlQRV9HRU5FUkFMX1RSQU5TRk9STSAtIFRoZSB0cmFuc2Zvcm1hdGlvbiBjYW4ndCBiZSBpbnZlcnRlZC48YnIvPgorICAgICAqIDxwPgorICAgICAqIE5vdGUgdGhhdCBtdWx0aXBsZSB0eXBlcyBhcmUgcG9zc2libGUsIHRodXMgdGhlIHR5cGVzIGNhbiBiZSBjb21iaW5lZAogICAgICAqIHVzaW5nIGJpdHdpc2UgY29tYmluYXRpb25zLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIEFmZmluZSBUcmFuc2Zvcm0uCkBAIC0yNjUsMTEgKzMyMCwxMCBAQAogCiAgICAgICAgIGlmIChtMDIgIT0gMC4wIHx8IG0xMiAhPSAwLjApIHsKICAgICAgICAgICAgIHR5cGUgfD0gVFlQRV9UUkFOU0xBVElPTjsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBpZiAobTAwID09IDEuMCAmJiBtMTEgPT0gMS4wICYmIG0wMSA9PSAwLjAgJiYgbTEwID09IDAuMCkgewotICAgICAgICAgICAgICAgIHR5cGUgPSBUWVBFX0lERU5USVRZOwotICAgICAgICAgICAgICAgIHJldHVybiB0eXBlOwotICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG0wMCA9PSAxLjAgJiYgbTExID09IDEuMCAmJiBtMDEgPT0gMC4wICYmIG0xMCA9PSAwLjApIHsKKyAgICAgICAgICAgIHR5cGUgPSBUWVBFX0lERU5USVRZOworICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgIH0KIAogICAgICAgICBpZiAobTAwICogbTExIC0gbTAxICogbTEwIDwgMC4wKSB7CiAgICAgICAgICAgICB0eXBlIHw9IFRZUEVfRkxJUDsKQEAgLTI3OSwyNiArMzMzLDIyIEBACiAgICAgICAgIGRvdWJsZSBkeSA9IG0wMSAqIG0wMSArIG0xMSAqIG0xMTsKICAgICAgICAgaWYgKGR4ICE9IGR5KSB7CiAgICAgICAgICAgICB0eXBlIHw9IFRZUEVfR0VORVJBTF9TQ0FMRTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBpZiAoZHggIT0gMS4wKSB7Ci0gICAgICAgICAgICAgICAgdHlwZSB8PSBUWVBFX1VOSUZPUk1fU0NBTEU7Ci0gICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZHggIT0gMS4wKSB7CisgICAgICAgICAgICB0eXBlIHw9IFRZUEVfVU5JRk9STV9TQ0FMRTsKKyAgICAgICAgfQogCi0gICAgICAgIGlmICgobTAwID09IDAuMCAmJiBtMTEgPT0gMC4wKSB8fAotICAgICAgICAgICAgKG0xMCA9PSAwLjAgJiYgbTAxID09IDAuMCAmJiAobTAwIDwgMC4wIHx8IG0xMSA8IDAuMCkpKQotICAgICAgICB7CisgICAgICAgIGlmICgobTAwID09IDAuMCAmJiBtMTEgPT0gMC4wKSB8fCAobTEwID09IDAuMCAmJiBtMDEgPT0gMC4wICYmIChtMDAgPCAwLjAgfHwgbTExIDwgMC4wKSkpIHsKICAgICAgICAgICAgIHR5cGUgfD0gVFlQRV9RVUFEUkFOVF9ST1RBVElPTjsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBpZiAobTAxICE9IDAuMCB8fCBtMTAgIT0gMC4wKSB7Ci0gICAgICAgICAgICAgICAgdHlwZSB8PSBUWVBFX0dFTkVSQUxfUk9UQVRJT047Ci0gICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobTAxICE9IDAuMCB8fCBtMTAgIT0gMC4wKSB7CisgICAgICAgICAgICB0eXBlIHw9IFRZUEVfR0VORVJBTF9ST1RBVElPTjsKKyAgICAgICAgfQogCiAgICAgICAgIHJldHVybiB0eXBlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNjYWxlIHggZW50cnkgb2YgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeAotICAgICAqICh0aGUgdXBwZXIgbGVmdCBtYXRyaXggZW50cnkpLgorICAgICAqIEdldHMgdGhlIHNjYWxlIHggZW50cnkgb2YgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCAodGhlIHVwcGVyIGxlZnQKKyAgICAgKiBtYXRyaXggZW50cnkpLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIHNjYWxlIHggdmFsdWUuCiAgICAgICovCkBAIC0zMDcsOCArMzU3LDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzY2FsZSB5IGVudHJ5IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXgKLSAgICAgKiAodGhlIGxvd2VyIHJpZ2h0IGVudHJ5IG9mIHRoZSBsaW5lYXIgdHJhbnNmb3JtYXRpb24pLgorICAgICAqIEdldHMgdGhlIHNjYWxlIHkgZW50cnkgb2YgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCAodGhlIGxvd2VyIHJpZ2h0CisgICAgICogZW50cnkgb2YgdGhlIGxpbmVhciB0cmFuc2Zvcm1hdGlvbikuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgc2NhbGUgeSB2YWx1ZS4KICAgICAgKi8KQEAgLTMxNyw4ICszNjcsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNoZWFyIHggZW50cnkgb2YgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeAotICAgICAqICh0aGUgdXBwZXIgcmlnaHQgZW50cnkgb2YgdGhlIGxpbmVhciB0cmFuc2Zvcm1hdGlvbikuCisgICAgICogR2V0cyB0aGUgc2hlYXIgeCBlbnRyeSBvZiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4ICh0aGUgdXBwZXIgcmlnaHQKKyAgICAgKiBlbnRyeSBvZiB0aGUgbGluZWFyIHRyYW5zZm9ybWF0aW9uKS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBzaGVhciB4IHZhbHVlLgogICAgICAqLwpAQCAtMzI3LDggKzM3Nyw4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgc2hlYXIgeSBlbnRyeSBvZiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4Ci0gICAgICogKHRoZSBsb3dlciBsZWZ0IGVudHJ5IG9mIHRoZSBsaW5lYXIgdHJhbnNmb3JtYXRpb24pLgorICAgICAqIEdldHMgdGhlIHNoZWFyIHkgZW50cnkgb2YgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCAodGhlIGxvd2VyIGxlZnQgZW50cnkKKyAgICAgKiBvZiB0aGUgbGluZWFyIHRyYW5zZm9ybWF0aW9uKS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBzaGVhciB5IHZhbHVlLgogICAgICAqLwpAQCAtMzY0LDE1ICs0MTQsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIHZhbHVlcyBvZiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4IGludG8gdGhlIGdpdmVuIAotICAgICAqIGFycmF5IG9mIGRvdWJsZXMuIElmIHRoZSBhcnJheSBoYXMgbGVuZ3RoIDQsIG9ubHkgdGhlIGxpbmVhcgotICAgICAqIHRyYW5zZm9ybWF0aW9uIHBhcnQgd2lsbCBiZSB3cml0dGVuIGludG8gaXQuIElmIGl0IGhhcyBsZW5ndGggCi0gICAgICogZ3JlYXRlciB0aGFuIDQsIHRoZSB0cmFuc2xhdGlvbiB2ZWN0b3Igd2lsbCBiZSBpbmNsdWRlZCBhcyB3ZWxsLgorICAgICAqIFdyaXRlcyB0aGUgdmFsdWVzIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggaW50byB0aGUgZ2l2ZW4gYXJyYXkgb2YKKyAgICAgKiBkb3VibGVzLiBJZiB0aGUgYXJyYXkgaGFzIGxlbmd0aCA0LCBvbmx5IHRoZSBsaW5lYXIgdHJhbnNmb3JtYXRpb24gcGFydAorICAgICAqIHdpbGwgYmUgd3JpdHRlbiBpbnRvIGl0LiBJZiBpdCBoYXMgbGVuZ3RoIGdyZWF0ZXIgdGhhbiA0LCB0aGUgdHJhbnNsYXRpb24KKyAgICAgKiB2ZWN0b3Igd2lsbCBiZSBpbmNsdWRlZCBhcyB3ZWxsLgogICAgICAqIAotICAgICAqIEBwYXJhbSBtYXRyaXggdGhlIGFycmF5IHRvIGZpbGwgd2l0aCB0aGUgdmFsdWVzIG9mIHRoZSBtYXRyaXguCi0gICAgICogCi0gICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgdGhlIHNpemUgb2YgdGhlIGFycmF5Ci0gICAgICogaXMgMCwgMSwgMiwgMywgb3IgNS4KKyAgICAgKiBAcGFyYW0gbWF0cml4CisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgdG8gZmlsbCB3aXRoIHRoZSB2YWx1ZXMgb2YgdGhlIG1hdHJpeC4KKyAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzaXplIG9mIHRoZSBhcnJheSBpcyAwLCAxLCAyLCAzLCBvciA1LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGdldE1hdHJpeChkb3VibGVbXSBtYXRyaXgpIHsKICAgICAgICAgbWF0cml4WzBdID0gbTAwOwpAQCAtMzk3LDEyICs0NDcsMTggQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSB0cmFuc2Zvcm0gaW4gdGVybXMgb2YgYSBsaXN0IG9mIGRvdWJsZSB2YWx1ZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIG0wMCB0aGUgbTAwIGNvb3JkaW5hdGUgb2YgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4KLSAgICAgKiBAcGFyYW0gbTEwIHRoZSBtMTAgY29vcmRpbmF0ZSBvZiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LgotICAgICAqIEBwYXJhbSBtMDEgdGhlIG0wMSBjb29yZGluYXRlIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguCi0gICAgICogQHBhcmFtIG0xMSB0aGUgbTExIGNvb3JkaW5hdGUgb2YgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4KLSAgICAgKiBAcGFyYW0gbTAyIHRoZSBtMDIgY29vcmRpbmF0ZSBvZiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LgotICAgICAqIEBwYXJhbSBtMTIgdGhlIG0xMiBjb29yZGluYXRlIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguCisgICAgICogQHBhcmFtIG0wMAorICAgICAqICAgICAgICAgICAgdGhlIG0wMCBjb29yZGluYXRlIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguCisgICAgICogQHBhcmFtIG0xMAorICAgICAqICAgICAgICAgICAgdGhlIG0xMCBjb29yZGluYXRlIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguCisgICAgICogQHBhcmFtIG0wMQorICAgICAqICAgICAgICAgICAgdGhlIG0wMSBjb29yZGluYXRlIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguCisgICAgICogQHBhcmFtIG0xMQorICAgICAqICAgICAgICAgICAgdGhlIG0xMSBjb29yZGluYXRlIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguCisgICAgICogQHBhcmFtIG0wMgorICAgICAqICAgICAgICAgICAgdGhlIG0wMiBjb29yZGluYXRlIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguCisgICAgICogQHBhcmFtIG0xMgorICAgICAqICAgICAgICAgICAgdGhlIG0xMiBjb29yZGluYXRlIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VHJhbnNmb3JtKGRvdWJsZSBtMDAsIGRvdWJsZSBtMTAsIGRvdWJsZSBtMDEsIGRvdWJsZSBtMTEsIGRvdWJsZSBtMDIsIGRvdWJsZSBtMTIpIHsKICAgICAgICAgdGhpcy50eXBlID0gVFlQRV9VTktOT1dOOwpAQCAtNDE1LDEwICs0NzEsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0cmFuc2Zvcm0ncyBkYXRhIHRvIG1hdGNoIHRoZSBkYXRhIG9mIHRoZSB0cmFuc2Zvcm0gCi0gICAgICogc2VudCBhcyBhIHBhcmFtZXRlci4KKyAgICAgKiBTZXRzIHRoZSB0cmFuc2Zvcm0ncyBkYXRhIHRvIG1hdGNoIHRoZSBkYXRhIG9mIHRoZSB0cmFuc2Zvcm0gc2VudCBhcyBhCisgICAgICogcGFyYW1ldGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0IHRoZSB0cmFuc2Zvcm0gdGhhdCBnaXZlcyB0aGUgbmV3IHZhbHVlcy4KKyAgICAgKiBAcGFyYW0gdAorICAgICAqICAgICAgICAgICAgdGhlIHRyYW5zZm9ybSB0aGF0IGdpdmVzIHRoZSBuZXcgdmFsdWVzLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFRyYW5zZm9ybShBZmZpbmVUcmFuc2Zvcm0gdCkgewogICAgICAgICB0eXBlID0gdC50eXBlOwpAQCAtNDM1LDE1ICs0OTIsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0cmFuc2Zvcm1hdGlvbiB0byBhIHRyYW5zbGF0aW9uIGFsb25lLgotICAgICAqIFNldHMgdGhlIGxpbmVhciBwYXJ0IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiB0byBpZGVudGl0eSAKLSAgICAgKiBhbmQgdGhlIHRyYW5zbGF0aW9uIHZlY3RvciB0byB0aGUgdmFsdWVzIHNlbnQgYXMgcGFyYW1ldGVycy4KLSAgICAgKiBTZXRzIHRoZSB0eXBlIHRvIDxjb2RlPlRZUEVfSURFTlRJVFk8L2NvZGU+Ci0gICAgICogaWYgdGhlIHJlc3VsdGluZyBBZmZpbmVUcmFuc2Zvcm1hdGlvbiBpcyB0aGUgaWRlbnRpdHkgCi0gICAgICogdHJhbnNmb3JtYXRpb24sIG90aGVyd2lzZSBzZXRzIGl0IHRvIDxjb2RlPlRZUEVfVFJBTlNMQVRJT048L2NvZGU+LgorICAgICAqIFNldHMgdGhlIHRyYW5zZm9ybWF0aW9uIHRvIGEgdHJhbnNsYXRpb24gYWxvbmUuIFNldHMgdGhlIGxpbmVhciBwYXJ0IG9mCisgICAgICogdGhlIHRyYW5zZm9ybWF0aW9uIHRvIGlkZW50aXR5IGFuZCB0aGUgdHJhbnNsYXRpb24gdmVjdG9yIHRvIHRoZSB2YWx1ZXMKKyAgICAgKiBzZW50IGFzIHBhcmFtZXRlcnMuIFNldHMgdGhlIHR5cGUgdG8gPGNvZGU+VFlQRV9JREVOVElUWTwvY29kZT4gaWYgdGhlCisgICAgICogcmVzdWx0aW5nIEFmZmluZVRyYW5zZm9ybWF0aW9uIGlzIHRoZSBpZGVudGl0eSB0cmFuc2Zvcm1hdGlvbiwgb3RoZXJ3aXNlCisgICAgICogc2V0cyBpdCB0byA8Y29kZT5UWVBFX1RSQU5TTEFUSU9OPC9jb2RlPi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbXggdGhlIGRpc3RhbmNlIHRvIHRyYW5zbGF0ZSBpbiB0aGUgeCBkaXJlY3Rpb24uCi0gICAgICogQHBhcmFtIG15IHRoZSBkaXN0YW5jZSB0byB0cmFuc2xhdGUgaW4gdGhlIHkgZGlyZWN0aW9uLgorICAgICAqIEBwYXJhbSBteAorICAgICAqICAgICAgICAgICAgdGhlIGRpc3RhbmNlIHRvIHRyYW5zbGF0ZSBpbiB0aGUgeCBkaXJlY3Rpb24uCisgICAgICogQHBhcmFtIG15CisgICAgICogICAgICAgICAgICB0aGUgZGlzdGFuY2UgdG8gdHJhbnNsYXRlIGluIHRoZSB5IGRpcmVjdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRUb1RyYW5zbGF0aW9uKGRvdWJsZSBteCwgZG91YmxlIG15KSB7CiAgICAgICAgIG0wMCA9IG0xMSA9IDEuMDsKQEAgLTQ1OCwxNCArNTE2LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgdHJhbnNmb3JtYXRpb24gdG8gYmVpbmcgYSBzY2FsZSBhbG9uZSwgZWxpbWluYXRpbmcgCi0gICAgICogcm90YXRpb24sIHNoZWFyLCBhbmQgdHJhbnNsYXRpb24gZWxlbWVudHMuCi0gICAgICogU2V0cyB0aGUgdHlwZSB0byA8Y29kZT5UWVBFX0lERU5USVRZPC9jb2RlPgotICAgICAqIGlmIHRoZSByZXN1bHRpbmcgQWZmaW5lVHJhbnNmb3JtYXRpb24gaXMgdGhlIGlkZW50aXR5IAotICAgICAqIHRyYW5zZm9ybWF0aW9uLCBvdGhlcndpc2Ugc2V0cyBpdCB0byA8Y29kZT5UWVBFX1VOS05PV048L2NvZGU+LgorICAgICAqIFNldHMgdGhlIHRyYW5zZm9ybWF0aW9uIHRvIGJlaW5nIGEgc2NhbGUgYWxvbmUsIGVsaW1pbmF0aW5nIHJvdGF0aW9uLAorICAgICAqIHNoZWFyLCBhbmQgdHJhbnNsYXRpb24gZWxlbWVudHMuIFNldHMgdGhlIHR5cGUgdG8KKyAgICAgKiA8Y29kZT5UWVBFX0lERU5USVRZPC9jb2RlPiBpZiB0aGUgcmVzdWx0aW5nIEFmZmluZVRyYW5zZm9ybWF0aW9uIGlzIHRoZQorICAgICAqIGlkZW50aXR5IHRyYW5zZm9ybWF0aW9uLCBvdGhlcndpc2Ugc2V0cyBpdCB0byA8Y29kZT5UWVBFX1VOS05PV048L2NvZGU+LgogICAgICAqIAotICAgICAqIEBwYXJhbSBzY3ggdGhlIHNjYWxpbmcgZmFjdG9yIGluIHRoZSB4IGRpcmVjdGlvbi4KLSAgICAgKiBAcGFyYW0gc2N5IHRoZSBzY2FsaW5nIGZhY3RvciBpbiB0aGUgeSBkaXJlY3Rpb24uCisgICAgICogQHBhcmFtIHNjeAorICAgICAqICAgICAgICAgICAgdGhlIHNjYWxpbmcgZmFjdG9yIGluIHRoZSB4IGRpcmVjdGlvbi4KKyAgICAgKiBAcGFyYW0gc2N5CisgICAgICogICAgICAgICAgICB0aGUgc2NhbGluZyBmYWN0b3IgaW4gdGhlIHkgZGlyZWN0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFRvU2NhbGUoZG91YmxlIHNjeCwgZG91YmxlIHNjeSkgewogICAgICAgICBtMDAgPSBzY3g7CkBAIC00NzksMTQgKzUzOCwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHRyYW5zZm9ybWF0aW9uIHRvIGJlaW5nIGEgc2hlYXIgYWxvbmUsIGVsaW1pbmF0aW5nIAotICAgICAqIHJvdGF0aW9uLCBzY2FsaW5nLCBhbmQgdHJhbnNsYXRpb24gZWxlbWVudHMuCi0gICAgICogU2V0cyB0aGUgdHlwZSB0byA8Y29kZT5UWVBFX0lERU5USVRZPC9jb2RlPgotICAgICAqIGlmIHRoZSByZXN1bHRpbmcgQWZmaW5lVHJhbnNmb3JtYXRpb24gaXMgdGhlIGlkZW50aXR5IAotICAgICAqIHRyYW5zZm9ybWF0aW9uLCBvdGhlcndpc2Ugc2V0cyBpdCB0byA8Y29kZT5UWVBFX1VOS05PV048L2NvZGU+LgorICAgICAqIFNldHMgdGhlIHRyYW5zZm9ybWF0aW9uIHRvIGJlaW5nIGEgc2hlYXIgYWxvbmUsIGVsaW1pbmF0aW5nIHJvdGF0aW9uLAorICAgICAqIHNjYWxpbmcsIGFuZCB0cmFuc2xhdGlvbiBlbGVtZW50cy4gU2V0cyB0aGUgdHlwZSB0bworICAgICAqIDxjb2RlPlRZUEVfSURFTlRJVFk8L2NvZGU+IGlmIHRoZSByZXN1bHRpbmcgQWZmaW5lVHJhbnNmb3JtYXRpb24gaXMgdGhlCisgICAgICogaWRlbnRpdHkgdHJhbnNmb3JtYXRpb24sIG90aGVyd2lzZSBzZXRzIGl0IHRvIDxjb2RlPlRZUEVfVU5LTk9XTjwvY29kZT4uCiAgICAgICogCi0gICAgICogQHBhcmFtIHNoeCB0aGUgc2hlYXJpbmcgZmFjdG9yIGluIHRoZSB4IGRpcmVjdGlvbi4KLSAgICAgKiBAcGFyYW0gc2h5IHRoZSBzaGVhcmluZyBmYWN0b3IgaW4gdGhlIHkgZGlyZWN0aW9uLgorICAgICAqIEBwYXJhbSBzaHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBzaGVhcmluZyBmYWN0b3IgaW4gdGhlIHggZGlyZWN0aW9uLgorICAgICAqIEBwYXJhbSBzaHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBzaGVhcmluZyBmYWN0b3IgaW4gdGhlIHkgZGlyZWN0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFRvU2hlYXIoZG91YmxlIHNoeCwgZG91YmxlIHNoeSkgewogICAgICAgICBtMDAgPSBtMTEgPSAxLjA7CkBAIC01MDEsMTMgKzU2MSwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHRyYW5zZm9ybWF0aW9uIHRvIGJlaW5nIGEgcm90YXRpb24gYWxvbmUsIGVsaW1pbmF0aW5nIAotICAgICAqIHNoZWFyaW5nLCBzY2FsaW5nLCBhbmQgdHJhbnNsYXRpb24gZWxlbWVudHMuCi0gICAgICogU2V0cyB0aGUgdHlwZSB0byA8Y29kZT5UWVBFX0lERU5USVRZPC9jb2RlPgotICAgICAqIGlmIHRoZSByZXN1bHRpbmcgQWZmaW5lVHJhbnNmb3JtYXRpb24gaXMgdGhlIGlkZW50aXR5IAotICAgICAqIHRyYW5zZm9ybWF0aW9uLCBvdGhlcndpc2Ugc2V0cyBpdCB0byA8Y29kZT5UWVBFX1VOS05PV048L2NvZGU+LgorICAgICAqIFNldHMgdGhlIHRyYW5zZm9ybWF0aW9uIHRvIGJlaW5nIGEgcm90YXRpb24gYWxvbmUsIGVsaW1pbmF0aW5nIHNoZWFyaW5nLAorICAgICAqIHNjYWxpbmcsIGFuZCB0cmFuc2xhdGlvbiBlbGVtZW50cy4gU2V0cyB0aGUgdHlwZSB0bworICAgICAqIDxjb2RlPlRZUEVfSURFTlRJVFk8L2NvZGU+IGlmIHRoZSByZXN1bHRpbmcgQWZmaW5lVHJhbnNmb3JtYXRpb24gaXMgdGhlCisgICAgICogaWRlbnRpdHkgdHJhbnNmb3JtYXRpb24sIG90aGVyd2lzZSBzZXRzIGl0IHRvIDxjb2RlPlRZUEVfVU5LTk9XTjwvY29kZT4uCiAgICAgICogCi0gICAgICogQHBhcmFtIGFuZ2xlIHRoZSBhbmdsZSBvZiByb3RhdGlvbiBpbiByYWRpYW5zLgorICAgICAqIEBwYXJhbSBhbmdsZQorICAgICAqICAgICAgICAgICAgdGhlIGFuZ2xlIG9mIHJvdGF0aW9uIGluIHJhZGlhbnMuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VG9Sb3RhdGlvbihkb3VibGUgYW5nbGUpIHsKICAgICAgICAgZG91YmxlIHNpbiA9IE1hdGguc2luKGFuZ2xlKTsKQEAgLTUxNSwxMSArNTc1LDEwIEBACiAgICAgICAgIGlmIChNYXRoLmFicyhjb3MpIDwgWkVSTykgewogICAgICAgICAgICAgY29zID0gMC4wOwogICAgICAgICAgICAgc2luID0gc2luID4gMC4wID8gMS4wIDogLTEuMDsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBpZiAoTWF0aC5hYnMoc2luKSA8IFpFUk8pIHsKLSAgICAgICAgICAgICAgICBzaW4gPSAwLjA7Ci0gICAgICAgICAgICAgICAgY29zID0gY29zID4gMC4wID8gMS4wIDogLTEuMDsKLSAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChNYXRoLmFicyhzaW4pIDwgWkVSTykgeworICAgICAgICAgICAgc2luID0gMC4wOworICAgICAgICAgICAgY29zID0gY29zID4gMC4wID8gMS4wIDogLTEuMDsKKyAgICAgICAgfQogICAgICAgICBtMDAgPSBtMTEgPSBjb3M7CiAgICAgICAgIG0wMSA9IC1zaW47CiAgICAgICAgIG0xMCA9IHNpbjsKQEAgLTUyOCwxMyArNTg3LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgdHJhbnNmb3JtYXRpb24gdG8gYmVpbmcgYSByb3RhdGlvbiBmb2xsb3dlZCBieSBhIAotICAgICAqIHRyYW5zbGF0aW9uLiAKKyAgICAgKiBTZXRzIHRoZSB0cmFuc2Zvcm1hdGlvbiB0byBiZWluZyBhIHJvdGF0aW9uIGZvbGxvd2VkIGJ5IGEgdHJhbnNsYXRpb24uCiAgICAgICogU2V0cyB0aGUgdHlwZSB0byA8Y29kZT5UWVBFX1VOS05PV048L2NvZGU+LgogICAgICAqIAotICAgICAqIEBwYXJhbSBhbmdsZSB0aGUgYW5nbGUgb2Ygcm90YXRpb24gaW4gcmFkaWFucy4KLSAgICAgKiBAcGFyYW0gcHggdGhlIGRpc3RhbmNlIHRvIHRyYW5zbGF0ZSBpbiB0aGUgeCBkaXJlY3Rpb24uCi0gICAgICogQHBhcmFtIHB5IHRoZSBkaXN0YW5jZSB0byB0cmFuc2xhdGUgaW4gdGhlIHkgZGlyZWN0aW9uLgorICAgICAqIEBwYXJhbSBhbmdsZQorICAgICAqICAgICAgICAgICAgdGhlIGFuZ2xlIG9mIHJvdGF0aW9uIGluIHJhZGlhbnMuCisgICAgICogQHBhcmFtIHB4CisgICAgICogICAgICAgICAgICB0aGUgZGlzdGFuY2UgdG8gdHJhbnNsYXRlIGluIHRoZSB4IGRpcmVjdGlvbi4KKyAgICAgKiBAcGFyYW0gcHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBkaXN0YW5jZSB0byB0cmFuc2xhdGUgaW4gdGhlIHkgZGlyZWN0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFRvUm90YXRpb24oZG91YmxlIGFuZ2xlLCBkb3VibGUgcHgsIGRvdWJsZSBweSkgewogICAgICAgICBzZXRUb1JvdGF0aW9uKGFuZ2xlKTsKQEAgLTU0NCwxNSArNjA1LDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBBZmZpbmVUcmFuc2Zvcm1hdGlvbiB0aGF0IGlzIGEgdHJhbnNsYXRpb24gYWxvbmUKLSAgICAgKiB3aXRoIHRoZSB0cmFuc2xhdGlvbiB2ZWN0b3IgZ2l2ZW4gYnkgdGhlIHZhbHVlcyBzZW50IGFzIHBhcmFtZXRlcnMuCi0gICAgICogVGhlIG5ldyB0cmFuc2Zvcm1hdGlvbidzIHR5cGUgaXMgPGNvZGU+VFlQRV9JREVOVElUWTwvY29kZT4KLSAgICAgKiBpZiB0aGUgQWZmaW5lVHJhbnNmb3JtYXRpb24gaXMgdGhlIGlkZW50aXR5IAotICAgICAqIHRyYW5zZm9ybWF0aW9uLCBvdGhlcndpc2UgaXQncyA8Y29kZT5UWVBFX1RSQU5TTEFUSU9OPC9jb2RlPi4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IEFmZmluZVRyYW5zZm9ybWF0aW9uIHRoYXQgaXMgYSB0cmFuc2xhdGlvbiBhbG9uZSB3aXRoIHRoZQorICAgICAqIHRyYW5zbGF0aW9uIHZlY3RvciBnaXZlbiBieSB0aGUgdmFsdWVzIHNlbnQgYXMgcGFyYW1ldGVycy4gVGhlIG5ldworICAgICAqIHRyYW5zZm9ybWF0aW9uJ3MgdHlwZSBpcyA8Y29kZT5UWVBFX0lERU5USVRZPC9jb2RlPiBpZiB0aGUKKyAgICAgKiBBZmZpbmVUcmFuc2Zvcm1hdGlvbiBpcyB0aGUgaWRlbnRpdHkgdHJhbnNmb3JtYXRpb24sIG90aGVyd2lzZSBpdCdzCisgICAgICogPGNvZGU+VFlQRV9UUkFOU0xBVElPTjwvY29kZT4uCiAgICAgICogCi0gICAgICogQHBhcmFtIG14IHRoZSBkaXN0YW5jZSB0byB0cmFuc2xhdGUgaW4gdGhlIHggZGlyZWN0aW9uLgotICAgICAqIEBwYXJhbSBteSB0aGUgZGlzdGFuY2UgdG8gdHJhbnNsYXRlIGluIHRoZSB5IGRpcmVjdGlvbi4KLQorICAgICAqIEBwYXJhbSBteAorICAgICAqICAgICAgICAgICAgdGhlIGRpc3RhbmNlIHRvIHRyYW5zbGF0ZSBpbiB0aGUgeCBkaXJlY3Rpb24uCisgICAgICogQHBhcmFtIG15CisgICAgICogICAgICAgICAgICB0aGUgZGlzdGFuY2UgdG8gdHJhbnNsYXRlIGluIHRoZSB5IGRpcmVjdGlvbi4KICAgICAgKiBAcmV0dXJuIHRoZSBuZXcgQWZmaW5lVHJhbnNmb3JtYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBBZmZpbmVUcmFuc2Zvcm0gZ2V0VHJhbnNsYXRlSW5zdGFuY2UoZG91YmxlIG14LCBkb3VibGUgbXkpIHsKQEAgLTU2MiwxNCArNjI0LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBBZmZpbmVUcmFuc2Zvcm1hdGlvbiB0aGF0IGlzIGEgc2NhbGUgYWxvbmUuCi0gICAgICogVGhlIG5ldyB0cmFuc2Zvcm1hdGlvbidzIHR5cGUgaXMgPGNvZGU+VFlQRV9JREVOVElUWTwvY29kZT4KLSAgICAgKiBpZiB0aGUgQWZmaW5lVHJhbnNmb3JtYXRpb24gaXMgdGhlIGlkZW50aXR5IAotICAgICAqIHRyYW5zZm9ybWF0aW9uLCBvdGhlcndpc2UgaXQncyA8Y29kZT5UWVBFX1VOS05PV048L2NvZGU+LgorICAgICAqIENyZWF0ZXMgYSBuZXcgQWZmaW5lVHJhbnNmb3JtYXRpb24gdGhhdCBpcyBhIHNjYWxlIGFsb25lLiBUaGUgbmV3CisgICAgICogdHJhbnNmb3JtYXRpb24ncyB0eXBlIGlzIDxjb2RlPlRZUEVfSURFTlRJVFk8L2NvZGU+IGlmIHRoZQorICAgICAqIEFmZmluZVRyYW5zZm9ybWF0aW9uIGlzIHRoZSBpZGVudGl0eSB0cmFuc2Zvcm1hdGlvbiwgb3RoZXJ3aXNlIGl0J3MKKyAgICAgKiA8Y29kZT5UWVBFX1VOS05PV048L2NvZGU+LgogICAgICAqIAotICAgICAqIEBwYXJhbSBzY3ggdGhlIHNjYWxpbmcgZmFjdG9yIGluIHRoZSB4IGRpcmVjdGlvbi4KLSAgICAgKiBAcGFyYW0gc2NZIHRoZSBzY2FsaW5nIGZhY3RvciBpbiB0aGUgeSBkaXJlY3Rpb24uCi0gICAgICogCisgICAgICogQHBhcmFtIHNjeAorICAgICAqICAgICAgICAgICAgdGhlIHNjYWxpbmcgZmFjdG9yIGluIHRoZSB4IGRpcmVjdGlvbi4KKyAgICAgKiBAcGFyYW0gc2NZCisgICAgICogICAgICAgICAgICB0aGUgc2NhbGluZyBmYWN0b3IgaW4gdGhlIHkgZGlyZWN0aW9uLgogICAgICAqIEByZXR1cm4gdGhlIG5ldyBBZmZpbmVUcmFuc2Zvcm1hdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEFmZmluZVRyYW5zZm9ybSBnZXRTY2FsZUluc3RhbmNlKGRvdWJsZSBzY3gsIGRvdWJsZSBzY1kpIHsKQEAgLTU3OSwxNCArNjQyLDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBBZmZpbmVUcmFuc2Zvcm1hdGlvbiB0aGF0IGlzIGEgc2hlYXIgYWxvbmUuCi0gICAgICogVGhlIG5ldyB0cmFuc2Zvcm1hdGlvbidzIHR5cGUgaXMgPGNvZGU+VFlQRV9JREVOVElUWTwvY29kZT4KLSAgICAgKiBpZiB0aGUgQWZmaW5lVHJhbnNmb3JtYXRpb24gaXMgdGhlIGlkZW50aXR5IAotICAgICAqIHRyYW5zZm9ybWF0aW9uLCBvdGhlcndpc2UgaXQncyA8Y29kZT5UWVBFX1VOS05PV048L2NvZGU+LgorICAgICAqIENyZWF0ZXMgYSBuZXcgQWZmaW5lVHJhbnNmb3JtYXRpb24gdGhhdCBpcyBhIHNoZWFyIGFsb25lLiBUaGUgbmV3CisgICAgICogdHJhbnNmb3JtYXRpb24ncyB0eXBlIGlzIDxjb2RlPlRZUEVfSURFTlRJVFk8L2NvZGU+IGlmIHRoZQorICAgICAqIEFmZmluZVRyYW5zZm9ybWF0aW9uIGlzIHRoZSBpZGVudGl0eSB0cmFuc2Zvcm1hdGlvbiwgb3RoZXJ3aXNlIGl0J3MKKyAgICAgKiA8Y29kZT5UWVBFX1VOS05PV048L2NvZGU+LgogICAgICAqIAotICAgICAqIEBwYXJhbSBzaHggdGhlIHNoZWFyaW5nIGZhY3RvciBpbiB0aGUgeCBkaXJlY3Rpb24uCi0gICAgICogQHBhcmFtIHNoeSB0aGUgc2hlYXJpbmcgZmFjdG9yIGluIHRoZSB5IGRpcmVjdGlvbi4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2h4CisgICAgICogICAgICAgICAgICB0aGUgc2hlYXJpbmcgZmFjdG9yIGluIHRoZSB4IGRpcmVjdGlvbi4KKyAgICAgKiBAcGFyYW0gc2h5CisgICAgICogICAgICAgICAgICB0aGUgc2hlYXJpbmcgZmFjdG9yIGluIHRoZSB5IGRpcmVjdGlvbi4KICAgICAgKiBAcmV0dXJuIHRoZSBuZXcgQWZmaW5lVHJhbnNmb3JtYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBBZmZpbmVUcmFuc2Zvcm0gZ2V0U2hlYXJJbnN0YW5jZShkb3VibGUgc2h4LCBkb3VibGUgc2h5KSB7CkBAIC01OTYsMTMgKzY2MCwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgQWZmaW5lVHJhbnNmb3JtYXRpb24gdGhhdCBpcyBhIHJvdGF0aW9uIGFsb25lLgotICAgICAqIFRoZSBuZXcgdHJhbnNmb3JtYXRpb24ncyB0eXBlIGlzIDxjb2RlPlRZUEVfSURFTlRJVFk8L2NvZGU+Ci0gICAgICogaWYgdGhlIEFmZmluZVRyYW5zZm9ybWF0aW9uIGlzIHRoZSBpZGVudGl0eSAKLSAgICAgKiB0cmFuc2Zvcm1hdGlvbiwgb3RoZXJ3aXNlIGl0J3MgPGNvZGU+VFlQRV9VTktOT1dOPC9jb2RlPi4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IEFmZmluZVRyYW5zZm9ybWF0aW9uIHRoYXQgaXMgYSByb3RhdGlvbiBhbG9uZS4gVGhlIG5ldworICAgICAqIHRyYW5zZm9ybWF0aW9uJ3MgdHlwZSBpcyA8Y29kZT5UWVBFX0lERU5USVRZPC9jb2RlPiBpZiB0aGUKKyAgICAgKiBBZmZpbmVUcmFuc2Zvcm1hdGlvbiBpcyB0aGUgaWRlbnRpdHkgdHJhbnNmb3JtYXRpb24sIG90aGVyd2lzZSBpdCdzCisgICAgICogPGNvZGU+VFlQRV9VTktOT1dOPC9jb2RlPi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYW5nbGUgdGhlIGFuZ2xlIG9mIHJvdGF0aW9uIGluIHJhZGlhbnMuCi0gICAgICogCisgICAgICogQHBhcmFtIGFuZ2xlCisgICAgICogICAgICAgICAgICB0aGUgYW5nbGUgb2Ygcm90YXRpb24gaW4gcmFkaWFucy4KICAgICAgKiBAcmV0dXJuIHRoZSBuZXcgQWZmaW5lVHJhbnNmb3JtYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBBZmZpbmVUcmFuc2Zvcm0gZ2V0Um90YXRlSW5zdGFuY2UoZG91YmxlIGFuZ2xlKSB7CkBAIC02MTIsMTQgKzY3NiwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgQWZmaW5lVHJhbnNmb3JtYXRpb24gdGhhdCBpcyBhIHJvdGF0aW9uIGZvbGxvd2VkIGJ5IGEgCi0gICAgICogdHJhbnNsYXRpb24uIAotICAgICAqIFNldHMgdGhlIHR5cGUgdG8gPGNvZGU+VFlQRV9VTktOT1dOPC9jb2RlPi4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IEFmZmluZVRyYW5zZm9ybWF0aW9uIHRoYXQgaXMgYSByb3RhdGlvbiBmb2xsb3dlZCBieSBhCisgICAgICogdHJhbnNsYXRpb24uIFNldHMgdGhlIHR5cGUgdG8gPGNvZGU+VFlQRV9VTktOT1dOPC9jb2RlPi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYW5nbGUgdGhlIGFuZ2xlIG9mIHJvdGF0aW9uIGluIHJhZGlhbnMuCi0gICAgICogQHBhcmFtIHggdGhlIGRpc3RhbmNlIHRvIHRyYW5zbGF0ZSBpbiB0aGUgeCBkaXJlY3Rpb24uCi0gICAgICogQHBhcmFtIHkgdGhlIGRpc3RhbmNlIHRvIHRyYW5zbGF0ZSBpbiB0aGUgeSBkaXJlY3Rpb24uCi0gICAgICogCisgICAgICogQHBhcmFtIGFuZ2xlCisgICAgICogICAgICAgICAgICB0aGUgYW5nbGUgb2Ygcm90YXRpb24gaW4gcmFkaWFucy4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIGRpc3RhbmNlIHRvIHRyYW5zbGF0ZSBpbiB0aGUgeCBkaXJlY3Rpb24uCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBkaXN0YW5jZSB0byB0cmFuc2xhdGUgaW4gdGhlIHkgZGlyZWN0aW9uLgogICAgICAqIEByZXR1cm4gdGhlIG5ldyBBZmZpbmVUcmFuc2Zvcm1hdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEFmZmluZVRyYW5zZm9ybSBnZXRSb3RhdGVJbnN0YW5jZShkb3VibGUgYW5nbGUsIGRvdWJsZSB4LCBkb3VibGUgeSkgewpAQCAtNjMxLDggKzY5NiwxMCBAQAogICAgIC8qKgogICAgICAqIEFwcGxpZXMgYSB0cmFuc2xhdGlvbiB0byB0aGlzIEFmZmluZVRyYW5zZm9ybWF0aW9uLgogICAgICAqIAotICAgICAqIEBwYXJhbSBteCB0aGUgZGlzdGFuY2UgdG8gdHJhbnNsYXRlIGluIHRoZSB4IGRpcmVjdGlvbi4KLSAgICAgKiBAcGFyYW0gbXkgdGhlIGRpc3RhbmNlIHRvIHRyYW5zbGF0ZSBpbiB0aGUgeSBkaXJlY3Rpb24uCisgICAgICogQHBhcmFtIG14CisgICAgICogICAgICAgICAgICB0aGUgZGlzdGFuY2UgdG8gdHJhbnNsYXRlIGluIHRoZSB4IGRpcmVjdGlvbi4KKyAgICAgKiBAcGFyYW0gbXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBkaXN0YW5jZSB0byB0cmFuc2xhdGUgaW4gdGhlIHkgZGlyZWN0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRyYW5zbGF0ZShkb3VibGUgbXgsIGRvdWJsZSBteSkgewogICAgICAgICBjb25jYXRlbmF0ZShBZmZpbmVUcmFuc2Zvcm0uZ2V0VHJhbnNsYXRlSW5zdGFuY2UobXgsIG15KSk7CkBAIC02NDEsOCArNzA4LDEwIEBACiAgICAgLyoqCiAgICAgICogQXBwbGllcyBhIHNjYWxpbmcgdHJhbnNmb3JtYXRpb24gdG8gdGhpcyBBZmZpbmVUcmFuc2Zvcm1hdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2N4IHRoZSBzY2FsaW5nIGZhY3RvciBpbiB0aGUgeCBkaXJlY3Rpb24uCi0gICAgICogQHBhcmFtIHNjeSB0aGUgc2NhbGluZyBmYWN0b3IgaW4gdGhlIHkgZGlyZWN0aW9uLgorICAgICAqIEBwYXJhbSBzY3gKKyAgICAgKiAgICAgICAgICAgIHRoZSBzY2FsaW5nIGZhY3RvciBpbiB0aGUgeCBkaXJlY3Rpb24uCisgICAgICogQHBhcmFtIHNjeQorICAgICAqICAgICAgICAgICAgdGhlIHNjYWxpbmcgZmFjdG9yIGluIHRoZSB5IGRpcmVjdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzY2FsZShkb3VibGUgc2N4LCBkb3VibGUgc2N5KSB7CiAgICAgICAgIGNvbmNhdGVuYXRlKEFmZmluZVRyYW5zZm9ybS5nZXRTY2FsZUluc3RhbmNlKHNjeCwgc2N5KSk7CkBAIC02NTEsOCArNzIwLDEwIEBACiAgICAgLyoqCiAgICAgICogQXBwbGllcyBhIHNoZWFyaW5nIHRyYW5zZm9ybWF0aW9uIHRvIHRoaXMgQWZmaW5lVHJhbnNmb3JtYXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIHNoeCB0aGUgc2hlYXJpbmcgZmFjdG9yIGluIHRoZSB4IGRpcmVjdGlvbi4KLSAgICAgKiBAcGFyYW0gc2h5IHRoZSBzaGVhcmluZyBmYWN0b3IgaW4gdGhlIHkgZGlyZWN0aW9uLgorICAgICAqIEBwYXJhbSBzaHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBzaGVhcmluZyBmYWN0b3IgaW4gdGhlIHggZGlyZWN0aW9uLgorICAgICAqIEBwYXJhbSBzaHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBzaGVhcmluZyBmYWN0b3IgaW4gdGhlIHkgZGlyZWN0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNoZWFyKGRvdWJsZSBzaHgsIGRvdWJsZSBzaHkpIHsKICAgICAgICAgY29uY2F0ZW5hdGUoQWZmaW5lVHJhbnNmb3JtLmdldFNoZWFySW5zdGFuY2Uoc2h4LCBzaHkpKTsKQEAgLTY2MSwxOSArNzMyLDIzIEBACiAgICAgLyoqCiAgICAgICogQXBwbGllcyBhIHJvdGF0aW9uIHRyYW5zZm9ybWF0aW9uIHRvIHRoaXMgQWZmaW5lVHJhbnNmb3JtYXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIGFuZ2xlIHRoZSBhbmdsZSBvZiByb3RhdGlvbiBpbiByYWRpYW5zLgorICAgICAqIEBwYXJhbSBhbmdsZQorICAgICAqICAgICAgICAgICAgdGhlIGFuZ2xlIG9mIHJvdGF0aW9uIGluIHJhZGlhbnMuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcm90YXRlKGRvdWJsZSBhbmdsZSkgewogICAgICAgICBjb25jYXRlbmF0ZShBZmZpbmVUcmFuc2Zvcm0uZ2V0Um90YXRlSW5zdGFuY2UoYW5nbGUpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBcHBsaWVzIGEgcm90YXRpb24gYW5kIHRyYW5zbGF0aW9uIHRyYW5zZm9ybWF0aW9uIHRvIHRoaXMgCisgICAgICogQXBwbGllcyBhIHJvdGF0aW9uIGFuZCB0cmFuc2xhdGlvbiB0cmFuc2Zvcm1hdGlvbiB0byB0aGlzCiAgICAgICogQWZmaW5lVHJhbnNmb3JtYXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIGFuZ2xlIHRoZSBhbmdsZSBvZiByb3RhdGlvbiBpbiByYWRpYW5zLgotICAgICAqIEBwYXJhbSBweCB0aGUgZGlzdGFuY2UgdG8gdHJhbnNsYXRlIGluIHRoZSB4IGRpcmVjdGlvbi4KLSAgICAgKiBAcGFyYW0gcHkgdGhlIGRpc3RhbmNlIHRvIHRyYW5zbGF0ZSBpbiB0aGUgeSBkaXJlY3Rpb24uCisgICAgICogQHBhcmFtIGFuZ2xlCisgICAgICogICAgICAgICAgICB0aGUgYW5nbGUgb2Ygcm90YXRpb24gaW4gcmFkaWFucy4KKyAgICAgKiBAcGFyYW0gcHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBkaXN0YW5jZSB0byB0cmFuc2xhdGUgaW4gdGhlIHggZGlyZWN0aW9uLgorICAgICAqIEBwYXJhbSBweQorICAgICAqICAgICAgICAgICAgdGhlIGRpc3RhbmNlIHRvIHRyYW5zbGF0ZSBpbiB0aGUgeSBkaXJlY3Rpb24uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcm90YXRlKGRvdWJsZSBhbmdsZSwgZG91YmxlIHB4LCBkb3VibGUgcHkpIHsKICAgICAgICAgY29uY2F0ZW5hdGUoQWZmaW5lVHJhbnNmb3JtLmdldFJvdGF0ZUluc3RhbmNlKGFuZ2xlLCBweCwgcHkpKTsKQEAgLTY4MiwzNiArNzU3LDQwIEBACiAgICAgLyoqCiAgICAgICogTXVsdGlwbGllcyB0aGUgbWF0cml4IHJlcHJlc2VudGF0aW9ucyBvZiB0d28gQWZmaW5lVHJhbnNmb3JtIG9iamVjdHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHQxIC0gdGhlIEFmZmluZVRyYW5zZm9ybSBvYmplY3QgaXMgYSBtdWx0aXBsaWNhbmQKLSAgICAgKiBAcGFyYW0gdDIgLSB0aGUgQWZmaW5lVHJhbnNmb3JtIG9iamVjdCBpcyBhIG11bHRpcGxpZXIKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIEFmZmluZVRyYW5zZm9ybSBvYmplY3QgdGhhdCBpcyB0aGUgcmVzdWx0IG9mIHQxIG11bHRpcGxpZWQgYnkgdGhlIG1hdHJpeCB0Mi4KKyAgICAgKiBAcGFyYW0gdDEKKyAgICAgKiAgICAgICAgICAgIC0gdGhlIEFmZmluZVRyYW5zZm9ybSBvYmplY3QgaXMgYSBtdWx0aXBsaWNhbmQKKyAgICAgKiBAcGFyYW0gdDIKKyAgICAgKiAgICAgICAgICAgIC0gdGhlIEFmZmluZVRyYW5zZm9ybSBvYmplY3QgaXMgYSBtdWx0aXBsaWVyCisgICAgICogQHJldHVybiBhbiBBZmZpbmVUcmFuc2Zvcm0gb2JqZWN0IHRoYXQgaXMgdGhlIHJlc3VsdCBvZiB0MSBtdWx0aXBsaWVkIGJ5CisgICAgICogICAgICAgICB0aGUgbWF0cml4IHQyLgogICAgICAqLwogICAgIEFmZmluZVRyYW5zZm9ybSBtdWx0aXBseShBZmZpbmVUcmFuc2Zvcm0gdDEsIEFmZmluZVRyYW5zZm9ybSB0MikgewotICAgICAgICByZXR1cm4gbmV3IEFmZmluZVRyYW5zZm9ybSgKLSAgICAgICAgICAgICAgICB0MS5tMDAgKiB0Mi5tMDAgKyB0MS5tMTAgKiB0Mi5tMDEsICAgICAgICAgIC8vIG0wMAotICAgICAgICAgICAgICAgIHQxLm0wMCAqIHQyLm0xMCArIHQxLm0xMCAqIHQyLm0xMSwgICAgICAgICAgLy8gbTAxCi0gICAgICAgICAgICAgICAgdDEubTAxICogdDIubTAwICsgdDEubTExICogdDIubTAxLCAgICAgICAgICAvLyBtMTAKLSAgICAgICAgICAgICAgICB0MS5tMDEgKiB0Mi5tMTAgKyB0MS5tMTEgKiB0Mi5tMTEsICAgICAgICAgIC8vIG0xMQorICAgICAgICByZXR1cm4gbmV3IEFmZmluZVRyYW5zZm9ybSh0MS5tMDAgKiB0Mi5tMDAgKyB0MS5tMTAgKiB0Mi5tMDEsIC8vIG0wMAorICAgICAgICAgICAgICAgIHQxLm0wMCAqIHQyLm0xMCArIHQxLm0xMCAqIHQyLm0xMSwgLy8gbTAxCisgICAgICAgICAgICAgICAgdDEubTAxICogdDIubTAwICsgdDEubTExICogdDIubTAxLCAvLyBtMTAKKyAgICAgICAgICAgICAgICB0MS5tMDEgKiB0Mi5tMTAgKyB0MS5tMTEgKiB0Mi5tMTEsIC8vIG0xMQogICAgICAgICAgICAgICAgIHQxLm0wMiAqIHQyLm0wMCArIHQxLm0xMiAqIHQyLm0wMSArIHQyLm0wMiwgLy8gbTAyCiAgICAgICAgICAgICAgICAgdDEubTAyICogdDIubTEwICsgdDEubTEyICogdDIubTExICsgdDIubTEyKTsvLyBtMTIKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBcHBsaWVzIHRoZSBnaXZlbiBBZmZpbmVUcmFuc2Zvcm0gdG8gdGhpcyBBZmZpbmVUcmFuc2Zvcm0KLSAgICAgKiB2aWEgbWF0cml4IG11bHRpcGxpY2F0aW9uLgorICAgICAqIEFwcGxpZXMgdGhlIGdpdmVuIEFmZmluZVRyYW5zZm9ybSB0byB0aGlzIEFmZmluZVRyYW5zZm9ybSB2aWEgbWF0cml4CisgICAgICogbXVsdGlwbGljYXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIHQgdGhlIEFmZmluZVRyYW5zZm9ybSB0byBhcHBseSB0byB0aGlzIEFmZmluZVRyYW5zZm9ybS4KKyAgICAgKiBAcGFyYW0gdAorICAgICAqICAgICAgICAgICAgdGhlIEFmZmluZVRyYW5zZm9ybSB0byBhcHBseSB0byB0aGlzIEFmZmluZVRyYW5zZm9ybS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjb25jYXRlbmF0ZShBZmZpbmVUcmFuc2Zvcm0gdCkgewogICAgICAgICBzZXRUcmFuc2Zvcm0obXVsdGlwbHkodCwgdGhpcykpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoYW5nZXMgdGhlIGN1cnJlbnQgQWZmaW5lVHJhbnNmb3JtIHRoZSBvbmUgb2J0YWluZWQgYnkgCi0gICAgICogdGFraW5nIHRoZSB0cmFuc2Zvcm0gdCBhbmQgYXBwbHlpbmcgdGhpcyBBZmZpbmVUcmFuc2Zvcm0gdG8gaXQuCisgICAgICogQ2hhbmdlcyB0aGUgY3VycmVudCBBZmZpbmVUcmFuc2Zvcm0gdGhlIG9uZSBvYnRhaW5lZCBieSB0YWtpbmcgdGhlCisgICAgICogdHJhbnNmb3JtIHQgYW5kIGFwcGx5aW5nIHRoaXMgQWZmaW5lVHJhbnNmb3JtIHRvIGl0LgogICAgICAqIAotICAgICAqIEBwYXJhbSB0IHRoZSBBZmZpbmVUcmFuc2Zvcm0gdGhhdCB0aGlzIEFmZmluZVRyYW5zZm9ybSBpcyBtdWx0aXBsaWVkIGJ5LgorICAgICAqIEBwYXJhbSB0CisgICAgICogICAgICAgICAgICB0aGUgQWZmaW5lVHJhbnNmb3JtIHRoYXQgdGhpcyBBZmZpbmVUcmFuc2Zvcm0gaXMgbXVsdGlwbGllZAorICAgICAqICAgICAgICAgICAgYnkuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcHJlQ29uY2F0ZW5hdGUoQWZmaW5lVHJhbnNmb3JtIHQpIHsKICAgICAgICAgc2V0VHJhbnNmb3JtKG11bHRpcGx5KHRoaXMsIHQpKTsKQEAgLTcyMSw5ICs4MDAsOSBAQAogICAgICAqIENyZWF0ZXMgYW4gQWZmaW5lVHJhbnNmb3JtIHRoYXQgaXMgdGhlIGludmVyc2Ugb2YgdGhpcyB0cmFuc2Zvcm0uCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgYWZmaW5lIHRyYW5zZm9ybSB0aGF0IGlzIHRoZSBpbnZlcnNlIG9mIHRoaXMgQWZmaW5lVHJhbnNmb3JtLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgTm9uaW52ZXJ0aWJsZVRyYW5zZm9ybUV4Y2VwdGlvbiBpZiB0aGlzIEFmZmluZVRyYW5zZm9ybSBjYW5ub3QgYmUgCi0gICAgICogaW52ZXJ0ZWQgKHRoZSBkZXRlcm1pbmFudCBvZiB0aGUgbGluZWFyIHRyYW5zZm9ybWF0aW9uIHBhcnQgaXMgemVybykuCisgICAgICogQHRocm93cyBOb25pbnZlcnRpYmxlVHJhbnNmb3JtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBBZmZpbmVUcmFuc2Zvcm0gY2Fubm90IGJlIGludmVydGVkICh0aGUgZGV0ZXJtaW5hbnQKKyAgICAgKiAgICAgICAgICAgICBvZiB0aGUgbGluZWFyIHRyYW5zZm9ybWF0aW9uIHBhcnQgaXMgemVybykuCiAgICAgICovCiAgICAgcHVibGljIEFmZmluZVRyYW5zZm9ybSBjcmVhdGVJbnZlcnNlKCkgdGhyb3dzIE5vbmludmVydGlibGVUcmFuc2Zvcm1FeGNlcHRpb24gewogICAgICAgICBkb3VibGUgZGV0ID0gZ2V0RGV0ZXJtaW5hbnQoKTsKQEAgLTczMSwyNSArODEwLDI2IEBACiAgICAgICAgICAgICAvLyBhd3QuMjA0PURldGVybWluYW50IGlzIHplcm8KICAgICAgICAgICAgIHRocm93IG5ldyBOb25pbnZlcnRpYmxlVHJhbnNmb3JtRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIwNCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgQWZmaW5lVHJhbnNmb3JtKAotICAgICAgICAgICAgICAgICBtMTEgLyBkZXQsIC8vIG0wMAorICAgICAgICByZXR1cm4gbmV3IEFmZmluZVRyYW5zZm9ybShtMTEgLyBkZXQsIC8vIG0wMAogICAgICAgICAgICAgICAgIC1tMTAgLyBkZXQsIC8vIG0xMAogICAgICAgICAgICAgICAgIC1tMDEgLyBkZXQsIC8vIG0wMQotICAgICAgICAgICAgICAgICBtMDAgLyBkZXQsIC8vIG0xMQorICAgICAgICAgICAgICAgIG0wMCAvIGRldCwgLy8gbTExCiAgICAgICAgICAgICAgICAgKG0wMSAqIG0xMiAtIG0xMSAqIG0wMikgLyBkZXQsIC8vIG0wMgotICAgICAgICAgICAgICAgIChtMTAgKiBtMDIgLSBtMDAgKiBtMTIpIC8gZGV0ICAvLyBtMTIKKyAgICAgICAgICAgICAgICAobTEwICogbTAyIC0gbTAwICogbTEyKSAvIGRldCAvLyBtMTIKICAgICAgICAgKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBBcHBseSB0aGUgY3VycmVudCBBZmZpbmVUcmFuc2Zvcm0gdG8gdGhlIHBvaW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBzcmMgdGhlIG9yaWdpbmFsIHBvaW50LgotICAgICAqIEBwYXJhbSBkc3QgUG9pbnQyRCBvYmplY3QgdG8gYmUgZmlsbGVkIHdpdGggdGhlIGRlc3RpbmF0aW9uCi0gICAgICogY29vcmRpbmF0ZXMgKHdoZXJlIHRoZSBvcmlnaW5hbCBwb2ludCBpcyBzZW50IGJ5IHRoaXMgQWZmaW5lVHJhbnNmb3JtKS4gTWF5IGJlIG51bGwuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcG9pbnQgaW4gdGhlIEFmZmluZVRyYW5zZm9ybSdzIGltYWdlIHNwYWNlIHdoZXJlIHRoZQotICAgICAqIG9yaWdpbmFsIHBvaW50IGlzIHNlbnQuCisgICAgICogQHBhcmFtIHNyYworICAgICAqICAgICAgICAgICAgdGhlIG9yaWdpbmFsIHBvaW50LgorICAgICAqIEBwYXJhbSBkc3QKKyAgICAgKiAgICAgICAgICAgIFBvaW50MkQgb2JqZWN0IHRvIGJlIGZpbGxlZCB3aXRoIHRoZSBkZXN0aW5hdGlvbiBjb29yZGluYXRlcworICAgICAqICAgICAgICAgICAgKHdoZXJlIHRoZSBvcmlnaW5hbCBwb2ludCBpcyBzZW50IGJ5IHRoaXMgQWZmaW5lVHJhbnNmb3JtKS4KKyAgICAgKiAgICAgICAgICAgIE1heSBiZSBudWxsLgorICAgICAqIEByZXR1cm4gdGhlIHBvaW50IGluIHRoZSBBZmZpbmVUcmFuc2Zvcm0ncyBpbWFnZSBzcGFjZSB3aGVyZSB0aGUgb3JpZ2luYWwKKyAgICAgKiAgICAgICAgIHBvaW50IGlzIHNlbnQuCiAgICAgICovCiAgICAgcHVibGljIFBvaW50MkQgdHJhbnNmb3JtKFBvaW50MkQgc3JjLCBQb2ludDJEIGRzdCkgewogICAgICAgICBpZiAoZHN0ID09IG51bGwpIHsKQEAgLTc3MCwyNSArODUwLDI5IEBACiAgICAgLyoqCiAgICAgICogQXBwbGllcyB0aGlzIEFmZmluZVRyYW5zZm9ybSB0byBhbiBhcnJheSBvZiBwb2ludHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNyYyB0aGUgYXJyYXkgb2YgcG9pbnRzIHRvIGJlIHRyYW5zZm9ybWVkLgotICAgICAqIEBwYXJhbSBzcmNPZmYgdGhlIG9mZnNldCBpbiB0aGUgc291cmNlIHBvaW50IGFycmF5IG9mIHRoZSBmaXJzdCBwb2ludAotICAgICAqIHRvIGJlIHRyYW5zZm9ybWVkLgotICAgICAqIEBwYXJhbSBkc3QgdGhlIHBvaW50IGFycmF5IHdoZXJlIHRoZSBpbWFnZXMgb2YgdGhlIHBvaW50cyAoYWZ0ZXIgCi0gICAgICogYXBwbHlpbmcgdGhlIEFmZmluZVRyYW5zZm9ybWF0aW9uKSBzaG91bGQgYmUgcGxhY2VkLgotICAgICAqIEBwYXJhbSBkc3RPZmYgdGhlIG9mZnNldCBpbiB0aGUgZGVzdGluYXRpb24gYXJyYXkgd2hlcmUgdGhlIG5ldyAKLSAgICAgKiB2YWx1ZXMgc2hvdWxkIGJlIHdyaXR0ZW4uCi0gICAgICogQHBhcmFtIGxlbmd0aCB0aGUgbnVtYmVyIG9mIHBvaW50cyB0byB0cmFuc2Zvcm0uCi0gICAgICogCi0gICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgCi0gICAgICogPGNvZGU+c3JjT2ZmICsgbGVuZ3RoID4gc3JjLmxlbmd0aDwvY29kZT4gb3IKLSAgICAgKiA8Y29kZT5kc3RPZmYgKyBsZW5ndGggPiBkc3QubGVuZ3RoPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gc3JjCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgcG9pbnRzIHRvIGJlIHRyYW5zZm9ybWVkLgorICAgICAqIEBwYXJhbSBzcmNPZmYKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gdGhlIHNvdXJjZSBwb2ludCBhcnJheSBvZiB0aGUgZmlyc3QgcG9pbnQgdG8gYmUKKyAgICAgKiAgICAgICAgICAgIHRyYW5zZm9ybWVkLgorICAgICAqIEBwYXJhbSBkc3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb2ludCBhcnJheSB3aGVyZSB0aGUgaW1hZ2VzIG9mIHRoZSBwb2ludHMgKGFmdGVyIGFwcGx5aW5nCisgICAgICogICAgICAgICAgICB0aGUgQWZmaW5lVHJhbnNmb3JtYXRpb24pIHNob3VsZCBiZSBwbGFjZWQuCisgICAgICogQHBhcmFtIGRzdE9mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgZGVzdGluYXRpb24gYXJyYXkgd2hlcmUgdGhlIG5ldyB2YWx1ZXMKKyAgICAgKiAgICAgICAgICAgIHNob3VsZCBiZSB3cml0dGVuLgorICAgICAqIEBwYXJhbSBsZW5ndGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgcG9pbnRzIHRvIHRyYW5zZm9ybS4KKyAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIDxjb2RlPnNyY09mZiArIGxlbmd0aCA+IHNyYy5sZW5ndGg8L2NvZGU+IG9yCisgICAgICogICAgICAgICAgICAgPGNvZGU+ZHN0T2ZmICsgbGVuZ3RoID4gZHN0Lmxlbmd0aDwvY29kZT4uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdHJhbnNmb3JtKFBvaW50MkRbXSBzcmMsIGludCBzcmNPZmYsIFBvaW50MkRbXSBkc3QsIGludCBkc3RPZmYsIGludCBsZW5ndGgpIHsKICAgICAgICAgd2hpbGUgKC0tbGVuZ3RoID49IDApIHsKLSAgICAgICAgICAgIFBvaW50MkQgc3JjUG9pbnQgPSBzcmNbc3JjT2ZmKytdOyAKKyAgICAgICAgICAgIFBvaW50MkQgc3JjUG9pbnQgPSBzcmNbc3JjT2ZmKytdOwogICAgICAgICAgICAgZG91YmxlIHggPSBzcmNQb2ludC5nZXRYKCk7CiAgICAgICAgICAgICBkb3VibGUgeSA9IHNyY1BvaW50LmdldFkoKTsKLSAgICAgICAgICAgIFBvaW50MkQgZHN0UG9pbnQgPSBkc3RbZHN0T2ZmXTsgCisgICAgICAgICAgICBQb2ludDJEIGRzdFBvaW50ID0gZHN0W2RzdE9mZl07CiAgICAgICAgICAgICBpZiAoZHN0UG9pbnQgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGlmIChzcmNQb2ludCBpbnN0YW5jZW9mIFBvaW50MkQuRG91YmxlKSB7CiAgICAgICAgICAgICAgICAgICAgIGRzdFBvaW50ID0gbmV3IFBvaW50MkQuRG91YmxlKCk7CkBAIC04MDAsMjcgKzg4NCwzMSBAQAogICAgICAgICAgICAgZHN0W2RzdE9mZisrXSA9IGRzdFBvaW50OwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCi0gICAgICogQXBwbGllcyB0aGlzIEFmZmluZVRyYW5zZm9ybSB0byBhIHNldCBvZiBwb2ludHMgZ2l2ZW4gCi0gICAgICogYXMgYW4gYXJyYXkgb2YgZG91YmxlIHZhbHVlcyB3aGVyZSBldmVyeSB0d28gdmFsdWVzIGluIHRoZSBhcnJheSAKLSAgICAgKiBnaXZlIHRoZSBjb29yZGluYXRlcyBvZiBhIHBvaW50OyB0aGUgZXZlbi1pbmRleGVkIHZhbHVlcyBnaXZpbmcgdGhlCi0gICAgICogeCBjb29yZGluYXRlcyBhbmQgdGhlIG9kZC1pbmRleGVkIHZhbHVlcyBnaXZpbmcgdGhlIHkgY29vcmRpbmF0ZXMuCisgICAgICogQXBwbGllcyB0aGlzIEFmZmluZVRyYW5zZm9ybSB0byBhIHNldCBvZiBwb2ludHMgZ2l2ZW4gYXMgYW4gYXJyYXkgb2YKKyAgICAgKiBkb3VibGUgdmFsdWVzIHdoZXJlIGV2ZXJ5IHR3byB2YWx1ZXMgaW4gdGhlIGFycmF5IGdpdmUgdGhlIGNvb3JkaW5hdGVzIG9mCisgICAgICogYSBwb2ludDsgdGhlIGV2ZW4taW5kZXhlZCB2YWx1ZXMgZ2l2aW5nIHRoZSB4IGNvb3JkaW5hdGVzIGFuZCB0aGUKKyAgICAgKiBvZGQtaW5kZXhlZCB2YWx1ZXMgZ2l2aW5nIHRoZSB5IGNvb3JkaW5hdGVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzcmMgdGhlIGFycmF5IG9mIHBvaW50cyB0byBiZSB0cmFuc2Zvcm1lZC4KLSAgICAgKiBAcGFyYW0gc3JjT2ZmIHRoZSBvZmZzZXQgaW4gdGhlIHNvdXJjZSBwb2ludCBhcnJheSBvZiB0aGUgZmlyc3QgcG9pbnQKLSAgICAgKiB0byBiZSB0cmFuc2Zvcm1lZC4KLSAgICAgKiBAcGFyYW0gZHN0IHRoZSBwb2ludCBhcnJheSB3aGVyZSB0aGUgaW1hZ2VzIG9mIHRoZSBwb2ludHMgKGFmdGVyIAotICAgICAqIGFwcGx5aW5nIHRoZSBBZmZpbmVUcmFuc2Zvcm1hdGlvbikgc2hvdWxkIGJlIHBsYWNlZC4KLSAgICAgKiBAcGFyYW0gZHN0T2ZmIHRoZSBvZmZzZXQgaW4gdGhlIGRlc3RpbmF0aW9uIGFycmF5IHdoZXJlIHRoZSBuZXcgCi0gICAgICogdmFsdWVzIHNob3VsZCBiZSB3cml0dGVuLgotICAgICAqIEBwYXJhbSBsZW5ndGggdGhlIG51bWJlciBvZiBwb2ludHMgdG8gdHJhbnNmb3JtLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIAotICAgICAqIDxjb2RlPnNyY09mZiArIGxlbmd0aCoyID4gc3JjLmxlbmd0aDwvY29kZT4gb3IKLSAgICAgKiA8Y29kZT5kc3RPZmYgKyBsZW5ndGgqMiA+IGRzdC5sZW5ndGg8L2NvZGU+LgorICAgICAqIEBwYXJhbSBzcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBwb2ludHMgdG8gYmUgdHJhbnNmb3JtZWQuCisgICAgICogQHBhcmFtIHNyY09mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgc291cmNlIHBvaW50IGFycmF5IG9mIHRoZSBmaXJzdCBwb2ludCB0byBiZQorICAgICAqICAgICAgICAgICAgdHJhbnNmb3JtZWQuCisgICAgICogQHBhcmFtIGRzdAorICAgICAqICAgICAgICAgICAgdGhlIHBvaW50IGFycmF5IHdoZXJlIHRoZSBpbWFnZXMgb2YgdGhlIHBvaW50cyAoYWZ0ZXIgYXBwbHlpbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBBZmZpbmVUcmFuc2Zvcm1hdGlvbikgc2hvdWxkIGJlIHBsYWNlZC4KKyAgICAgKiBAcGFyYW0gZHN0T2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSBkZXN0aW5hdGlvbiBhcnJheSB3aGVyZSB0aGUgbmV3IHZhbHVlcworICAgICAqICAgICAgICAgICAgc2hvdWxkIGJlIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIGxlbmd0aAorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBwb2ludHMgdG8gdHJhbnNmb3JtLgorICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgPGNvZGU+c3JjT2ZmICsgbGVuZ3RoKjIgPiBzcmMubGVuZ3RoPC9jb2RlPiBvcgorICAgICAqICAgICAgICAgICAgIDxjb2RlPmRzdE9mZiArIGxlbmd0aCoyID4gZHN0Lmxlbmd0aDwvY29kZT4uCiAgICAgICovCi0gICAgIHB1YmxpYyB2b2lkIHRyYW5zZm9ybShkb3VibGVbXSBzcmMsIGludCBzcmNPZmYsIGRvdWJsZVtdIGRzdCwgaW50IGRzdE9mZiwgaW50IGxlbmd0aCkgeworICAgIHB1YmxpYyB2b2lkIHRyYW5zZm9ybShkb3VibGVbXSBzcmMsIGludCBzcmNPZmYsIGRvdWJsZVtdIGRzdCwgaW50IGRzdE9mZiwgaW50IGxlbmd0aCkgewogICAgICAgICBpbnQgc3RlcCA9IDI7CiAgICAgICAgIGlmIChzcmMgPT0gZHN0ICYmIHNyY09mZiA8IGRzdE9mZiAmJiBkc3RPZmYgPCBzcmNPZmYgKyBsZW5ndGggKiAyKSB7CiAgICAgICAgICAgICBzcmNPZmYgPSBzcmNPZmYgKyBsZW5ndGggKiAyIC0gMjsKQEAgLTgzOCwyMyArOTI2LDI3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQXBwbGllcyB0aGlzIEFmZmluZVRyYW5zZm9ybSB0byBhIHNldCBvZiBwb2ludHMgZ2l2ZW4gCi0gICAgICogYXMgYW4gYXJyYXkgb2YgZmxvYXQgdmFsdWVzIHdoZXJlIGV2ZXJ5IHR3byB2YWx1ZXMgaW4gdGhlIGFycmF5IAotICAgICAqIGdpdmUgdGhlIGNvb3JkaW5hdGVzIG9mIGEgcG9pbnQ7IHRoZSBldmVuLWluZGV4ZWQgdmFsdWVzIGdpdmluZyB0aGUKLSAgICAgKiB4IGNvb3JkaW5hdGVzIGFuZCB0aGUgb2RkLWluZGV4ZWQgdmFsdWVzIGdpdmluZyB0aGUgeSBjb29yZGluYXRlcy4KKyAgICAgKiBBcHBsaWVzIHRoaXMgQWZmaW5lVHJhbnNmb3JtIHRvIGEgc2V0IG9mIHBvaW50cyBnaXZlbiBhcyBhbiBhcnJheSBvZgorICAgICAqIGZsb2F0IHZhbHVlcyB3aGVyZSBldmVyeSB0d28gdmFsdWVzIGluIHRoZSBhcnJheSBnaXZlIHRoZSBjb29yZGluYXRlcyBvZgorICAgICAqIGEgcG9pbnQ7IHRoZSBldmVuLWluZGV4ZWQgdmFsdWVzIGdpdmluZyB0aGUgeCBjb29yZGluYXRlcyBhbmQgdGhlCisgICAgICogb2RkLWluZGV4ZWQgdmFsdWVzIGdpdmluZyB0aGUgeSBjb29yZGluYXRlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3JjIHRoZSBhcnJheSBvZiBwb2ludHMgdG8gYmUgdHJhbnNmb3JtZWQuCi0gICAgICogQHBhcmFtIHNyY09mZiB0aGUgb2Zmc2V0IGluIHRoZSBzb3VyY2UgcG9pbnQgYXJyYXkgb2YgdGhlIGZpcnN0IHBvaW50Ci0gICAgICogdG8gYmUgdHJhbnNmb3JtZWQuCi0gICAgICogQHBhcmFtIGRzdCB0aGUgcG9pbnQgYXJyYXkgd2hlcmUgdGhlIGltYWdlcyBvZiB0aGUgcG9pbnRzIChhZnRlciAKLSAgICAgKiBhcHBseWluZyB0aGUgQWZmaW5lVHJhbnNmb3JtYXRpb24pIHNob3VsZCBiZSBwbGFjZWQuCi0gICAgICogQHBhcmFtIGRzdE9mZiB0aGUgb2Zmc2V0IGluIHRoZSBkZXN0aW5hdGlvbiBhcnJheSB3aGVyZSB0aGUgbmV3IAotICAgICAqIHZhbHVlcyBzaG91bGQgYmUgd3JpdHRlbi4KLSAgICAgKiBAcGFyYW0gbGVuZ3RoIHRoZSBudW1iZXIgb2YgcG9pbnRzIHRvIHRyYW5zZm9ybS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiAKLSAgICAgKiA8Y29kZT5zcmNPZmYgKyBsZW5ndGgqMiA+IHNyYy5sZW5ndGg8L2NvZGU+IG9yCi0gICAgICogPGNvZGU+ZHN0T2ZmICsgbGVuZ3RoKjIgPiBkc3QubGVuZ3RoPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gc3JjCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgcG9pbnRzIHRvIGJlIHRyYW5zZm9ybWVkLgorICAgICAqIEBwYXJhbSBzcmNPZmYKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gdGhlIHNvdXJjZSBwb2ludCBhcnJheSBvZiB0aGUgZmlyc3QgcG9pbnQgdG8gYmUKKyAgICAgKiAgICAgICAgICAgIHRyYW5zZm9ybWVkLgorICAgICAqIEBwYXJhbSBkc3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb2ludCBhcnJheSB3aGVyZSB0aGUgaW1hZ2VzIG9mIHRoZSBwb2ludHMgKGFmdGVyIGFwcGx5aW5nCisgICAgICogICAgICAgICAgICB0aGUgQWZmaW5lVHJhbnNmb3JtYXRpb24pIHNob3VsZCBiZSBwbGFjZWQuCisgICAgICogQHBhcmFtIGRzdE9mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgZGVzdGluYXRpb24gYXJyYXkgd2hlcmUgdGhlIG5ldyB2YWx1ZXMKKyAgICAgKiAgICAgICAgICAgIHNob3VsZCBiZSB3cml0dGVuLgorICAgICAqIEBwYXJhbSBsZW5ndGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgcG9pbnRzIHRvIHRyYW5zZm9ybS4KKyAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIDxjb2RlPnNyY09mZiArIGxlbmd0aCoyID4gc3JjLmxlbmd0aDwvY29kZT4gb3IKKyAgICAgKiAgICAgICAgICAgICA8Y29kZT5kc3RPZmYgKyBsZW5ndGgqMiA+IGRzdC5sZW5ndGg8L2NvZGU+LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRyYW5zZm9ybShmbG9hdFtdIHNyYywgaW50IHNyY09mZiwgZmxvYXRbXSBkc3QsIGludCBkc3RPZmYsIGludCBsZW5ndGgpIHsKICAgICAgICAgaW50IHN0ZXAgPSAyOwpAQCAtODcyLDI2ICs5NjQsMzAgQEAKICAgICAgICAgICAgIGRzdE9mZiArPSBzdGVwOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCi0gICAgICogQXBwbGllcyB0aGlzIEFmZmluZVRyYW5zZm9ybSB0byBhIHNldCBvZiBwb2ludHMgZ2l2ZW4gCi0gICAgICogYXMgYW4gYXJyYXkgb2YgZmxvYXQgdmFsdWVzIHdoZXJlIGV2ZXJ5IHR3byB2YWx1ZXMgaW4gdGhlIGFycmF5IAotICAgICAqIGdpdmUgdGhlIGNvb3JkaW5hdGVzIG9mIGEgcG9pbnQ7IHRoZSBldmVuLWluZGV4ZWQgdmFsdWVzIGdpdmluZyB0aGUKLSAgICAgKiB4IGNvb3JkaW5hdGVzIGFuZCB0aGUgb2RkLWluZGV4ZWQgdmFsdWVzIGdpdmluZyB0aGUgeSBjb29yZGluYXRlcy4KLSAgICAgKiBUaGUgZGVzdGluYXRpb24gY29vcmRpbmF0ZXMgYXJlIGdpdmVuIGFzIHZhbHVlcyBvZiB0eXBlIDxjb2RlPmRvdWJsZTwvY29kZT4uCisgICAgICogQXBwbGllcyB0aGlzIEFmZmluZVRyYW5zZm9ybSB0byBhIHNldCBvZiBwb2ludHMgZ2l2ZW4gYXMgYW4gYXJyYXkgb2YKKyAgICAgKiBmbG9hdCB2YWx1ZXMgd2hlcmUgZXZlcnkgdHdvIHZhbHVlcyBpbiB0aGUgYXJyYXkgZ2l2ZSB0aGUgY29vcmRpbmF0ZXMgb2YKKyAgICAgKiBhIHBvaW50OyB0aGUgZXZlbi1pbmRleGVkIHZhbHVlcyBnaXZpbmcgdGhlIHggY29vcmRpbmF0ZXMgYW5kIHRoZQorICAgICAqIG9kZC1pbmRleGVkIHZhbHVlcyBnaXZpbmcgdGhlIHkgY29vcmRpbmF0ZXMuIFRoZSBkZXN0aW5hdGlvbiBjb29yZGluYXRlcworICAgICAqIGFyZSBnaXZlbiBhcyB2YWx1ZXMgb2YgdHlwZSA8Y29kZT5kb3VibGU8L2NvZGU+LgogICAgICAqIAotICAgICAqIEBwYXJhbSBzcmMgdGhlIGFycmF5IG9mIHBvaW50cyB0byBiZSB0cmFuc2Zvcm1lZC4KLSAgICAgKiBAcGFyYW0gc3JjT2ZmIHRoZSBvZmZzZXQgaW4gdGhlIHNvdXJjZSBwb2ludCBhcnJheSBvZiB0aGUgZmlyc3QgcG9pbnQKLSAgICAgKiB0byBiZSB0cmFuc2Zvcm1lZC4KLSAgICAgKiBAcGFyYW0gZHN0IHRoZSBwb2ludCBhcnJheSB3aGVyZSB0aGUgaW1hZ2VzIG9mIHRoZSBwb2ludHMgKGFmdGVyIAotICAgICAqIGFwcGx5aW5nIHRoZSBBZmZpbmVUcmFuc2Zvcm1hdGlvbikgc2hvdWxkIGJlIHBsYWNlZC4KLSAgICAgKiBAcGFyYW0gZHN0T2ZmIHRoZSBvZmZzZXQgaW4gdGhlIGRlc3RpbmF0aW9uIGFycmF5IHdoZXJlIHRoZSBuZXcgCi0gICAgICogdmFsdWVzIHNob3VsZCBiZSB3cml0dGVuLgotICAgICAqIEBwYXJhbSBsZW5ndGggdGhlIG51bWJlciBvZiBwb2ludHMgdG8gdHJhbnNmb3JtLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIAotICAgICAqIDxjb2RlPnNyY09mZiArIGxlbmd0aCoyID4gc3JjLmxlbmd0aDwvY29kZT4gb3IKLSAgICAgKiA8Y29kZT5kc3RPZmYgKyBsZW5ndGgqMiA+IGRzdC5sZW5ndGg8L2NvZGU+LgorICAgICAqIEBwYXJhbSBzcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBwb2ludHMgdG8gYmUgdHJhbnNmb3JtZWQuCisgICAgICogQHBhcmFtIHNyY09mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgc291cmNlIHBvaW50IGFycmF5IG9mIHRoZSBmaXJzdCBwb2ludCB0byBiZQorICAgICAqICAgICAgICAgICAgdHJhbnNmb3JtZWQuCisgICAgICogQHBhcmFtIGRzdAorICAgICAqICAgICAgICAgICAgdGhlIHBvaW50IGFycmF5IHdoZXJlIHRoZSBpbWFnZXMgb2YgdGhlIHBvaW50cyAoYWZ0ZXIgYXBwbHlpbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBBZmZpbmVUcmFuc2Zvcm1hdGlvbikgc2hvdWxkIGJlIHBsYWNlZC4KKyAgICAgKiBAcGFyYW0gZHN0T2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSBkZXN0aW5hdGlvbiBhcnJheSB3aGVyZSB0aGUgbmV3IHZhbHVlcworICAgICAqICAgICAgICAgICAgc2hvdWxkIGJlIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIGxlbmd0aAorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBwb2ludHMgdG8gdHJhbnNmb3JtLgorICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgPGNvZGU+c3JjT2ZmICsgbGVuZ3RoKjIgPiBzcmMubGVuZ3RoPC9jb2RlPiBvcgorICAgICAqICAgICAgICAgICAgIDxjb2RlPmRzdE9mZiArIGxlbmd0aCoyID4gZHN0Lmxlbmd0aDwvY29kZT4uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdHJhbnNmb3JtKGZsb2F0W10gc3JjLCBpbnQgc3JjT2ZmLCBkb3VibGVbXSBkc3QsIGludCBkc3RPZmYsIGludCBsZW5ndGgpIHsKICAgICAgICAgd2hpbGUgKC0tbGVuZ3RoID49IDApIHsKQEAgLTkwMywyNCArOTk5LDI4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQXBwbGllcyB0aGlzIEFmZmluZVRyYW5zZm9ybSB0byBhIHNldCBvZiBwb2ludHMgZ2l2ZW4gCi0gICAgICogYXMgYW4gYXJyYXkgb2YgZG91YmxlIHZhbHVlcyB3aGVyZSBldmVyeSB0d28gdmFsdWVzIGluIHRoZSBhcnJheSAKLSAgICAgKiBnaXZlIHRoZSBjb29yZGluYXRlcyBvZiBhIHBvaW50OyB0aGUgZXZlbi1pbmRleGVkIHZhbHVlcyBnaXZpbmcgdGhlCi0gICAgICogeCBjb29yZGluYXRlcyBhbmQgdGhlIG9kZC1pbmRleGVkIHZhbHVlcyBnaXZpbmcgdGhlIHkgY29vcmRpbmF0ZXMuCi0gICAgICogVGhlIGRlc3RpbmF0aW9uIGNvb3JkaW5hdGVzIGFyZSBnaXZlbiBhcyB2YWx1ZXMgb2YgdHlwZSA8Y29kZT5mbG9hdDwvY29kZT4uCisgICAgICogQXBwbGllcyB0aGlzIEFmZmluZVRyYW5zZm9ybSB0byBhIHNldCBvZiBwb2ludHMgZ2l2ZW4gYXMgYW4gYXJyYXkgb2YKKyAgICAgKiBkb3VibGUgdmFsdWVzIHdoZXJlIGV2ZXJ5IHR3byB2YWx1ZXMgaW4gdGhlIGFycmF5IGdpdmUgdGhlIGNvb3JkaW5hdGVzIG9mCisgICAgICogYSBwb2ludDsgdGhlIGV2ZW4taW5kZXhlZCB2YWx1ZXMgZ2l2aW5nIHRoZSB4IGNvb3JkaW5hdGVzIGFuZCB0aGUKKyAgICAgKiBvZGQtaW5kZXhlZCB2YWx1ZXMgZ2l2aW5nIHRoZSB5IGNvb3JkaW5hdGVzLiBUaGUgZGVzdGluYXRpb24gY29vcmRpbmF0ZXMKKyAgICAgKiBhcmUgZ2l2ZW4gYXMgdmFsdWVzIG9mIHR5cGUgPGNvZGU+ZmxvYXQ8L2NvZGU+LgogICAgICAqIAotICAgICAqIEBwYXJhbSBzcmMgdGhlIGFycmF5IG9mIHBvaW50cyB0byBiZSB0cmFuc2Zvcm1lZC4KLSAgICAgKiBAcGFyYW0gc3JjT2ZmIHRoZSBvZmZzZXQgaW4gdGhlIHNvdXJjZSBwb2ludCBhcnJheSBvZiB0aGUgZmlyc3QgcG9pbnQKLSAgICAgKiB0byBiZSB0cmFuc2Zvcm1lZC4KLSAgICAgKiBAcGFyYW0gZHN0IHRoZSBwb2ludCBhcnJheSB3aGVyZSB0aGUgaW1hZ2VzIG9mIHRoZSBwb2ludHMgKGFmdGVyIAotICAgICAqIGFwcGx5aW5nIHRoZSBBZmZpbmVUcmFuc2Zvcm1hdGlvbikgc2hvdWxkIGJlIHBsYWNlZC4KLSAgICAgKiBAcGFyYW0gZHN0T2ZmIHRoZSBvZmZzZXQgaW4gdGhlIGRlc3RpbmF0aW9uIGFycmF5IHdoZXJlIHRoZSBuZXcgCi0gICAgICogdmFsdWVzIHNob3VsZCBiZSB3cml0dGVuLgotICAgICAqIEBwYXJhbSBsZW5ndGggdGhlIG51bWJlciBvZiBwb2ludHMgdG8gdHJhbnNmb3JtLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIAotICAgICAqIDxjb2RlPnNyY09mZiArIGxlbmd0aCoyID4gc3JjLmxlbmd0aDwvY29kZT4gb3IKLSAgICAgKiA8Y29kZT5kc3RPZmYgKyBsZW5ndGgqMiA+IGRzdC5sZW5ndGg8L2NvZGU+LgorICAgICAqIEBwYXJhbSBzcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBwb2ludHMgdG8gYmUgdHJhbnNmb3JtZWQuCisgICAgICogQHBhcmFtIHNyY09mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgc291cmNlIHBvaW50IGFycmF5IG9mIHRoZSBmaXJzdCBwb2ludCB0byBiZQorICAgICAqICAgICAgICAgICAgdHJhbnNmb3JtZWQuCisgICAgICogQHBhcmFtIGRzdAorICAgICAqICAgICAgICAgICAgdGhlIHBvaW50IGFycmF5IHdoZXJlIHRoZSBpbWFnZXMgb2YgdGhlIHBvaW50cyAoYWZ0ZXIgYXBwbHlpbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBBZmZpbmVUcmFuc2Zvcm1hdGlvbikgc2hvdWxkIGJlIHBsYWNlZC4KKyAgICAgKiBAcGFyYW0gZHN0T2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSBkZXN0aW5hdGlvbiBhcnJheSB3aGVyZSB0aGUgbmV3IHZhbHVlcworICAgICAqICAgICAgICAgICAgc2hvdWxkIGJlIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIGxlbmd0aAorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBwb2ludHMgdG8gdHJhbnNmb3JtLgorICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgPGNvZGU+c3JjT2ZmICsgbGVuZ3RoKjIgPiBzcmMubGVuZ3RoPC9jb2RlPiBvcgorICAgICAqICAgICAgICAgICAgIDxjb2RlPmRzdE9mZiArIGxlbmd0aCoyID4gZHN0Lmxlbmd0aDwvY29kZT4uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdHJhbnNmb3JtKGRvdWJsZVtdIHNyYywgaW50IHNyY09mZiwgZmxvYXRbXSBkc3QsIGludCBkc3RPZmYsIGludCBsZW5ndGgpIHsKICAgICAgICAgd2hpbGUgKC0tbGVuZ3RoID49IDApIHsKQEAgLTkzMiwxNSArMTAzMiwxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRyYW5zZm9ybXMgdGhlIHBvaW50IGFjY29yZGluZyB0byB0aGUgbGluZWFyIHRyYW5zZm9ybWF0aW9uCi0gICAgICogcGFydCBvZiB0aGlzIEFmZmluZVRyYW5zZm9ybWF0aW9uICh3aXRob3V0IGFwcGx5aW5nIHRoZSB0cmFuc2xhdGlvbikuCisgICAgICogVHJhbnNmb3JtcyB0aGUgcG9pbnQgYWNjb3JkaW5nIHRvIHRoZSBsaW5lYXIgdHJhbnNmb3JtYXRpb24gcGFydCBvZiB0aGlzCisgICAgICogQWZmaW5lVHJhbnNmb3JtYXRpb24gKHdpdGhvdXQgYXBwbHlpbmcgdGhlIHRyYW5zbGF0aW9uKS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3JjIHRoZSBvcmlnaW5hbCBwb2ludC4KLSAgICAgKiBAcGFyYW0gZHN0IHRoZSBwb2ludCBvYmplY3Qgd2hlcmUgdGhlIHJlc3VsdCBvZiB0aGUgZGVsdGEgdHJhbnNmb3JtCi0gICAgICogaXMgd3JpdHRlbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGRlbHRhIHRyYW5zZm9ybSAobGluZWFyIHBhcnQgCi0gICAgICogb25seSkgdG8gdGhlIG9yaWdpbmFsIHBvaW50LgorICAgICAqIEBwYXJhbSBzcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBvcmlnaW5hbCBwb2ludC4KKyAgICAgKiBAcGFyYW0gZHN0CisgICAgICogICAgICAgICAgICB0aGUgcG9pbnQgb2JqZWN0IHdoZXJlIHRoZSByZXN1bHQgb2YgdGhlIGRlbHRhIHRyYW5zZm9ybSBpcworICAgICAqICAgICAgICAgICAgd3JpdHRlbi4KKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGRlbHRhIHRyYW5zZm9ybSAobGluZWFyIHBhcnQgb25seSkgdG8KKyAgICAgKiAgICAgICAgIHRoZSBvcmlnaW5hbCBwb2ludC4KICAgICAgKi8KICAgICAvLyBUT0RPOiBpcyB0aGlzIHJpZ2h0PyBpZiBkc3QgaXMgbnVsbCwgd2UgY2hlY2sgd2hhdCBpdCdzIGFuCiAgICAgLy8gaW5zdGFuY2Ugb2Y/IFNob3VsZG4ndCBpdCBiZSBzcmMgaW5zdGFuY2VvZiBQb2ludDJELkRvdWJsZT8KQEAgLTk2MSwyNCArMTA2MiwyOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFwcGxpZXMgdGhlIGxpbmVhciB0cmFuc2Zvcm1hdGlvbiBwYXJ0IG9mIHRoaXMgQWZmaW5lVHJhbnNmb3JtIAotICAgICAqIChpZ25vcmluZyB0aGUgdHJhbnNsYXRpb24gcGFydCkgdG8gYSBzZXQgb2YgcG9pbnRzIGdpdmVuIAotICAgICAqIGFzIGFuIGFycmF5IG9mIGRvdWJsZSB2YWx1ZXMgd2hlcmUgZXZlcnkgdHdvIHZhbHVlcyBpbiB0aGUgYXJyYXkgCi0gICAgICogZ2l2ZSB0aGUgY29vcmRpbmF0ZXMgb2YgYSBwb2ludDsgdGhlIGV2ZW4taW5kZXhlZCB2YWx1ZXMgZ2l2aW5nIHRoZQotICAgICAqIHggY29vcmRpbmF0ZXMgYW5kIHRoZSBvZGQtaW5kZXhlZCB2YWx1ZXMgZ2l2aW5nIHRoZSB5IGNvb3JkaW5hdGVzLgorICAgICAqIEFwcGxpZXMgdGhlIGxpbmVhciB0cmFuc2Zvcm1hdGlvbiBwYXJ0IG9mIHRoaXMgQWZmaW5lVHJhbnNmb3JtIChpZ25vcmluZworICAgICAqIHRoZSB0cmFuc2xhdGlvbiBwYXJ0KSB0byBhIHNldCBvZiBwb2ludHMgZ2l2ZW4gYXMgYW4gYXJyYXkgb2YgZG91YmxlCisgICAgICogdmFsdWVzIHdoZXJlIGV2ZXJ5IHR3byB2YWx1ZXMgaW4gdGhlIGFycmF5IGdpdmUgdGhlIGNvb3JkaW5hdGVzIG9mIGEKKyAgICAgKiBwb2ludDsgdGhlIGV2ZW4taW5kZXhlZCB2YWx1ZXMgZ2l2aW5nIHRoZSB4IGNvb3JkaW5hdGVzIGFuZCB0aGUKKyAgICAgKiBvZGQtaW5kZXhlZCB2YWx1ZXMgZ2l2aW5nIHRoZSB5IGNvb3JkaW5hdGVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzcmMgdGhlIGFycmF5IG9mIHBvaW50cyB0byBiZSB0cmFuc2Zvcm1lZC4KLSAgICAgKiBAcGFyYW0gc3JjT2ZmIHRoZSBvZmZzZXQgaW4gdGhlIHNvdXJjZSBwb2ludCBhcnJheSBvZiB0aGUgZmlyc3QgcG9pbnQKLSAgICAgKiB0byBiZSB0cmFuc2Zvcm1lZC4KLSAgICAgKiBAcGFyYW0gZHN0IHRoZSBwb2ludCBhcnJheSB3aGVyZSB0aGUgaW1hZ2VzIG9mIHRoZSBwb2ludHMgKGFmdGVyIAotICAgICAqIGFwcGx5aW5nIHRoZSBkZWx0YSB0cmFuc2Zvcm1hdGlvbikgc2hvdWxkIGJlIHBsYWNlZC4KLSAgICAgKiBAcGFyYW0gZHN0T2ZmIHRoZSBvZmZzZXQgaW4gdGhlIGRlc3RpbmF0aW9uIGFycmF5IHdoZXJlIHRoZSBuZXcgCi0gICAgICogdmFsdWVzIHNob3VsZCBiZSB3cml0dGVuLgotICAgICAqIEBwYXJhbSBsZW5ndGggdGhlIG51bWJlciBvZiBwb2ludHMgdG8gdHJhbnNmb3JtLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIAotICAgICAqIDxjb2RlPnNyY09mZiArIGxlbmd0aCoyID4gc3JjLmxlbmd0aDwvY29kZT4gb3IKLSAgICAgKiA8Y29kZT5kc3RPZmYgKyBsZW5ndGgqMiA+IGRzdC5sZW5ndGg8L2NvZGU+LgorICAgICAqIEBwYXJhbSBzcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBwb2ludHMgdG8gYmUgdHJhbnNmb3JtZWQuCisgICAgICogQHBhcmFtIHNyY09mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgc291cmNlIHBvaW50IGFycmF5IG9mIHRoZSBmaXJzdCBwb2ludCB0byBiZQorICAgICAqICAgICAgICAgICAgdHJhbnNmb3JtZWQuCisgICAgICogQHBhcmFtIGRzdAorICAgICAqICAgICAgICAgICAgdGhlIHBvaW50IGFycmF5IHdoZXJlIHRoZSBpbWFnZXMgb2YgdGhlIHBvaW50cyAoYWZ0ZXIgYXBwbHlpbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZWx0YSB0cmFuc2Zvcm1hdGlvbikgc2hvdWxkIGJlIHBsYWNlZC4KKyAgICAgKiBAcGFyYW0gZHN0T2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSBkZXN0aW5hdGlvbiBhcnJheSB3aGVyZSB0aGUgbmV3IHZhbHVlcworICAgICAqICAgICAgICAgICAgc2hvdWxkIGJlIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIGxlbmd0aAorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBwb2ludHMgdG8gdHJhbnNmb3JtLgorICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgPGNvZGU+c3JjT2ZmICsgbGVuZ3RoKjIgPiBzcmMubGVuZ3RoPC9jb2RlPiBvcgorICAgICAqICAgICAgICAgICAgIDxjb2RlPmRzdE9mZiArIGxlbmd0aCoyID4gZHN0Lmxlbmd0aDwvY29kZT4uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZGVsdGFUcmFuc2Zvcm0oZG91YmxlW10gc3JjLCBpbnQgc3JjT2ZmLCBkb3VibGVbXSBkc3QsIGludCBkc3RPZmYsIGludCBsZW5ndGgpIHsKICAgICAgICAgd2hpbGUgKC0tbGVuZ3RoID49IDApIHsKQEAgLTk5MCwxOSArMTA5NSwyMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRyYW5zZm9ybXMgdGhlIHBvaW50IGFjY29yZGluZyB0byB0aGUgaW52ZXJzZSBvZiB0aGlzIEFmZmluZVRyYW5zZm9ybWF0aW9uLgorICAgICAqIFRyYW5zZm9ybXMgdGhlIHBvaW50IGFjY29yZGluZyB0byB0aGUgaW52ZXJzZSBvZiB0aGlzCisgICAgICogQWZmaW5lVHJhbnNmb3JtYXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIHNyYyB0aGUgb3JpZ2luYWwgcG9pbnQuCi0gICAgICogQHBhcmFtIGRzdCB0aGUgcG9pbnQgb2JqZWN0IHdoZXJlIHRoZSByZXN1bHQgb2YgdGhlIGludmVyc2UgdHJhbnNmb3JtCi0gICAgICogaXMgd3JpdHRlbiAobWF5IGJlIG51bGwpLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBhcHBseWluZyB0aGUgaW52ZXJzZSB0cmFuc2Zvcm0uCi0gICAgICogSW52ZXJzZSB0cmFuc2Zvcm0uCi0gICAgICogCi0gICAgICogQHRocm93cyBOb25pbnZlcnRpYmxlVHJhbnNmb3JtRXhjZXB0aW9uIGlmIHRoaXMgQWZmaW5lVHJhbnNmb3JtIGNhbm5vdCBiZSAKLSAgICAgKiBpbnZlcnRlZCAodGhlIGRldGVybWluYW50IG9mIHRoZSBsaW5lYXIgdHJhbnNmb3JtYXRpb24gcGFydCBpcyB6ZXJvKS4KKyAgICAgKiBAcGFyYW0gc3JjCisgICAgICogICAgICAgICAgICB0aGUgb3JpZ2luYWwgcG9pbnQuCisgICAgICogQHBhcmFtIGRzdAorICAgICAqICAgICAgICAgICAgdGhlIHBvaW50IG9iamVjdCB3aGVyZSB0aGUgcmVzdWx0IG9mIHRoZSBpbnZlcnNlIHRyYW5zZm9ybSBpcworICAgICAqICAgICAgICAgICAgd3JpdHRlbiAobWF5IGJlIG51bGwpLgorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBhcHBseWluZyB0aGUgaW52ZXJzZSB0cmFuc2Zvcm0uIEludmVyc2UgdHJhbnNmb3JtLgorICAgICAqIEB0aHJvd3MgTm9uaW52ZXJ0aWJsZVRyYW5zZm9ybUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgQWZmaW5lVHJhbnNmb3JtIGNhbm5vdCBiZSBpbnZlcnRlZCAodGhlIGRldGVybWluYW50CisgICAgICogICAgICAgICAgICAgb2YgdGhlIGxpbmVhciB0cmFuc2Zvcm1hdGlvbiBwYXJ0IGlzIHplcm8pLgogICAgICAqLwotICAgIHB1YmxpYyBQb2ludDJEIGludmVyc2VUcmFuc2Zvcm0oUG9pbnQyRCBzcmMsIFBvaW50MkQgZHN0KSB0aHJvd3MgTm9uaW52ZXJ0aWJsZVRyYW5zZm9ybUV4Y2VwdGlvbiB7CisgICAgcHVibGljIFBvaW50MkQgaW52ZXJzZVRyYW5zZm9ybShQb2ludDJEIHNyYywgUG9pbnQyRCBkc3QpCisgICAgICAgICAgICB0aHJvd3MgTm9uaW52ZXJ0aWJsZVRyYW5zZm9ybUV4Y2VwdGlvbiB7CiAgICAgICAgIGRvdWJsZSBkZXQgPSBnZXREZXRlcm1pbmFudCgpOwogICAgICAgICBpZiAoTWF0aC5hYnMoZGV0KSA8IFpFUk8pIHsKICAgICAgICAgICAgIC8vIGF3dC4yMDQ9RGV0ZXJtaW5hbnQgaXMgemVybwpAQCAtMTAyNSwyOSArMTEzMiwzMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFwcGxpZXMgdGhlIGludmVyc2Ugb2YgdGhpcyBBZmZpbmVUcmFuc2Zvcm0gdG8gYSBzZXQgb2YgcG9pbnRzIGdpdmVuIAotICAgICAqIGFzIGFuIGFycmF5IG9mIGRvdWJsZSB2YWx1ZXMgd2hlcmUgZXZlcnkgdHdvIHZhbHVlcyBpbiB0aGUgYXJyYXkgCi0gICAgICogZ2l2ZSB0aGUgY29vcmRpbmF0ZXMgb2YgYSBwb2ludDsgdGhlIGV2ZW4taW5kZXhlZCB2YWx1ZXMgZ2l2aW5nIHRoZQotICAgICAqIHggY29vcmRpbmF0ZXMgYW5kIHRoZSBvZGQtaW5kZXhlZCB2YWx1ZXMgZ2l2aW5nIHRoZSB5IGNvb3JkaW5hdGVzLgorICAgICAqIEFwcGxpZXMgdGhlIGludmVyc2Ugb2YgdGhpcyBBZmZpbmVUcmFuc2Zvcm0gdG8gYSBzZXQgb2YgcG9pbnRzIGdpdmVuIGFzCisgICAgICogYW4gYXJyYXkgb2YgZG91YmxlIHZhbHVlcyB3aGVyZSBldmVyeSB0d28gdmFsdWVzIGluIHRoZSBhcnJheSBnaXZlIHRoZQorICAgICAqIGNvb3JkaW5hdGVzIG9mIGEgcG9pbnQ7IHRoZSBldmVuLWluZGV4ZWQgdmFsdWVzIGdpdmluZyB0aGUgeCBjb29yZGluYXRlcworICAgICAqIGFuZCB0aGUgb2RkLWluZGV4ZWQgdmFsdWVzIGdpdmluZyB0aGUgeSBjb29yZGluYXRlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3JjIHRoZSBhcnJheSBvZiBwb2ludHMgdG8gYmUgdHJhbnNmb3JtZWQuCi0gICAgICogQHBhcmFtIHNyY09mZiB0aGUgb2Zmc2V0IGluIHRoZSBzb3VyY2UgcG9pbnQgYXJyYXkgb2YgdGhlIGZpcnN0IHBvaW50Ci0gICAgICogdG8gYmUgdHJhbnNmb3JtZWQuCi0gICAgICogQHBhcmFtIGRzdCB0aGUgcG9pbnQgYXJyYXkgd2hlcmUgdGhlIGltYWdlcyBvZiB0aGUgcG9pbnRzIChhZnRlciAKLSAgICAgKiBhcHBseWluZyB0aGUgaW52ZXJzZSBvZiB0aGUgQWZmaW5lVHJhbnNmb3JtYXRpb24pIHNob3VsZCBiZSBwbGFjZWQuCi0gICAgICogQHBhcmFtIGRzdE9mZiB0aGUgb2Zmc2V0IGluIHRoZSBkZXN0aW5hdGlvbiBhcnJheSB3aGVyZSB0aGUgbmV3IAotICAgICAqIHZhbHVlcyBzaG91bGQgYmUgd3JpdHRlbi4KLSAgICAgKiBAcGFyYW0gbGVuZ3RoIHRoZSBudW1iZXIgb2YgcG9pbnRzIHRvIHRyYW5zZm9ybS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiAKLSAgICAgKiA8Y29kZT5zcmNPZmYgKyBsZW5ndGgqMiA+IHNyYy5sZW5ndGg8L2NvZGU+IG9yCi0gICAgICogPGNvZGU+ZHN0T2ZmICsgbGVuZ3RoKjIgPiBkc3QubGVuZ3RoPC9jb2RlPi4KLSAgICAgKiBAdGhyb3dzIE5vbmludmVydGlibGVUcmFuc2Zvcm1FeGNlcHRpb24gaWYgdGhpcyBBZmZpbmVUcmFuc2Zvcm0gY2Fubm90IGJlIAotICAgICAqIGludmVydGVkICh0aGUgZGV0ZXJtaW5hbnQgb2YgdGhlIGxpbmVhciB0cmFuc2Zvcm1hdGlvbiBwYXJ0IGlzIHplcm8pLgorICAgICAqIEBwYXJhbSBzcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBwb2ludHMgdG8gYmUgdHJhbnNmb3JtZWQuCisgICAgICogQHBhcmFtIHNyY09mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgc291cmNlIHBvaW50IGFycmF5IG9mIHRoZSBmaXJzdCBwb2ludCB0byBiZQorICAgICAqICAgICAgICAgICAgdHJhbnNmb3JtZWQuCisgICAgICogQHBhcmFtIGRzdAorICAgICAqICAgICAgICAgICAgdGhlIHBvaW50IGFycmF5IHdoZXJlIHRoZSBpbWFnZXMgb2YgdGhlIHBvaW50cyAoYWZ0ZXIgYXBwbHlpbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnZlcnNlIG9mIHRoZSBBZmZpbmVUcmFuc2Zvcm1hdGlvbikgc2hvdWxkIGJlIHBsYWNlZC4KKyAgICAgKiBAcGFyYW0gZHN0T2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSBkZXN0aW5hdGlvbiBhcnJheSB3aGVyZSB0aGUgbmV3IHZhbHVlcworICAgICAqICAgICAgICAgICAgc2hvdWxkIGJlIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIGxlbmd0aAorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBwb2ludHMgdG8gdHJhbnNmb3JtLgorICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgPGNvZGU+c3JjT2ZmICsgbGVuZ3RoKjIgPiBzcmMubGVuZ3RoPC9jb2RlPiBvcgorICAgICAqICAgICAgICAgICAgIDxjb2RlPmRzdE9mZiArIGxlbmd0aCoyID4gZHN0Lmxlbmd0aDwvY29kZT4uCisgICAgICogQHRocm93cyBOb25pbnZlcnRpYmxlVHJhbnNmb3JtRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBBZmZpbmVUcmFuc2Zvcm0gY2Fubm90IGJlIGludmVydGVkICh0aGUgZGV0ZXJtaW5hbnQKKyAgICAgKiAgICAgICAgICAgICBvZiB0aGUgbGluZWFyIHRyYW5zZm9ybWF0aW9uIHBhcnQgaXMgemVybykuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgaW52ZXJzZVRyYW5zZm9ybShkb3VibGVbXSBzcmMsIGludCBzcmNPZmYsIGRvdWJsZVtdIGRzdCwgaW50IGRzdE9mZiwgaW50IGxlbmd0aCkKLSAgICAgICAgdGhyb3dzIE5vbmludmVydGlibGVUcmFuc2Zvcm1FeGNlcHRpb24KLSAgICB7CisgICAgICAgICAgICB0aHJvd3MgTm9uaW52ZXJ0aWJsZVRyYW5zZm9ybUV4Y2VwdGlvbiB7CiAgICAgICAgIGRvdWJsZSBkZXQgPSBnZXREZXRlcm1pbmFudCgpOwogICAgICAgICBpZiAoTWF0aC5hYnMoZGV0KSA8IFpFUk8pIHsKICAgICAgICAgICAgIC8vIGF3dC4yMDQ9RGV0ZXJtaW5hbnQgaXMgemVybwpAQCAtMTA2MywxMyArMTE3NCwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgc2hhcGUgd2hvc2UgZGF0YSBpcyBnaXZlbiBieSBhcHBseWluZyB0aGlzIAotICAgICAqIEFmZmluZVRyYW5zZm9ybSB0byB0aGUgc3BlY2lmaWVkIHNoYXBlLgorICAgICAqIENyZWF0ZXMgYSBuZXcgc2hhcGUgd2hvc2UgZGF0YSBpcyBnaXZlbiBieSBhcHBseWluZyB0aGlzIEFmZmluZVRyYW5zZm9ybQorICAgICAqIHRvIHRoZSBzcGVjaWZpZWQgc2hhcGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNyYyB0aGUgb3JpZ2luYWwgc2hhcGUgd2hvc2UgZGF0YSBpcyB0byBiZSB0cmFuc2Zvcm1lZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgc2hhcGUgZm91bmQgYnkgYXBwbHlpbmcgdGhpcyBBZmZpbmVUcmFuc2Zvcm0gdG8gCi0gICAgICogdGhlIG9yaWdpbmFsIHNoYXBlLgorICAgICAqIEBwYXJhbSBzcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBvcmlnaW5hbCBzaGFwZSB3aG9zZSBkYXRhIGlzIHRvIGJlIHRyYW5zZm9ybWVkLgorICAgICAqIEByZXR1cm4gdGhlIG5ldyBzaGFwZSBmb3VuZCBieSBhcHBseWluZyB0aGlzIEFmZmluZVRyYW5zZm9ybSB0byB0aGUKKyAgICAgKiAgICAgICAgIG9yaWdpbmFsIHNoYXBlLgogICAgICAqLwogICAgIHB1YmxpYyBTaGFwZSBjcmVhdGVUcmFuc2Zvcm1lZFNoYXBlKFNoYXBlIHNyYykgewogICAgICAgICBpZiAoc3JjID09IG51bGwpIHsKQEAgLTEwODYsOSArMTE5Nyw3IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4KLSAgICAgICAgICAgIGdldENsYXNzKCkuZ2V0TmFtZSgpICsKLSAgICAgICAgICAgICJbWyIgKyBtMDAgKyAiLCAiICsgbTAxICsgIiwgIiArIG0wMiArICJdLCBbIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCisgICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArICJbWyIgKyBtMDAgKyAiLCAiICsgbTAxICsgIiwgIiArIG0wMiArICJdLCBbIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCiAgICAgICAgICAgICAgICAgKyBtMTAgKyAiLCAiICsgbTExICsgIiwgIiArIG0xMiArICJdXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCiAgICAgfQogCkBAIC0xMTIwLDM5ICsxMjI5LDM5IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEFmZmluZVRyYW5zZm9ybSkgewogICAgICAgICAgICAgQWZmaW5lVHJhbnNmb3JtIHQgPSAoQWZmaW5lVHJhbnNmb3JtKW9iajsKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgIG0wMCA9PSB0Lm0wMCAmJiBtMDEgPT0gdC5tMDEgJiYKLSAgICAgICAgICAgICAgICBtMDIgPT0gdC5tMDIgJiYgbTEwID09IHQubTEwICYmCi0gICAgICAgICAgICAgICAgbTExID09IHQubTExICYmIG0xMiA9PSB0Lm0xMjsKKyAgICAgICAgICAgIHJldHVybiBtMDAgPT0gdC5tMDAgJiYgbTAxID09IHQubTAxICYmIG0wMiA9PSB0Lm0wMiAmJiBtMTAgPT0gdC5tMTAgJiYgbTExID09IHQubTExCisgICAgICAgICAgICAgICAgICAgICYmIG0xMiA9PSB0Lm0xMjsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgCiAgICAgLyoqCiAgICAgICogV3JpdGVzIHRoZSBBZmZpbmVUcmFzc2Zvcm0gb2JqZWN0IHRvIHRoZSBvdXRwdXQgc3RlYW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIHN0cmVhbSAtIHRoZSBvdXRwdXQgc3RyZWFtCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAtIGlmIHRoZXJlIGFyZSBJL08gZXJyb3JzIHdoaWxlIHdyaXRpbmcgdG8gdGhlIG91dHB1dCBzdHJlbQorICAgICAqIEBwYXJhbSBzdHJlYW0KKyAgICAgKiAgICAgICAgICAgIC0gdGhlIG91dHB1dCBzdHJlYW0uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIC0gaWYgdGhlcmUgYXJlIEkvTyBlcnJvcnMgd2hpbGUgd3JpdGluZyB0byB0aGUgb3V0cHV0IHN0cmVhbS4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzdHJlYW0uZGVmYXVsdFdyaXRlT2JqZWN0KCk7CiAgICAgfQogCi0gICAgCiAgICAgLyoqCiAgICAgICogUmVhZCB0aGUgQWZmaW5lVHJhbnNmb3JtIG9iamVjdCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIHN0cmVhbSAtIHRoZSBpbnB1dCBzdGVhbQotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gLSBpZiB0aGVyZSBhcmUgSS9PIGVycm9ycyB3aGlsZSByZWFkaW5nIGZyb20gdGhlIGlucHV0IHN0cmVtCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIC0gaWYgY2xhc3MgY291bGQgbm90IGJlIGZvdW5kCisgICAgICogQHBhcmFtIHN0cmVhbQorICAgICAqICAgICAgICAgICAgLSB0aGUgaW5wdXQgc3RyZWFtLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAtIGlmIHRoZXJlIGFyZSBJL08gZXJyb3JzIHdoaWxlIHJlYWRpbmcgZnJvbSB0aGUgaW5wdXQKKyAgICAgKiAgICAgICAgICAgICBzdHJlYW0uCisgICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgLSBpZiBjbGFzcyBjb3VsZCBub3QgYmUgZm91bmQuCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwKKyAgICAgICAgICAgIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewogICAgICAgICBzdHJlYW0uZGVmYXVsdFJlYWRPYmplY3QoKTsKICAgICAgICAgdHlwZSA9IFRZUEVfVU5LTk9XTjsKICAgICB9CiAKIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2dlb20vQXJjMkQuamF2YSBiL2F3dC9qYXZhL2F3dC9nZW9tL0FyYzJELmphdmEKaW5kZXggYmMxZTk1Yy4uNTZmNWNkMyAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2dlb20vQXJjMkQuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZ2VvbS9BcmMyRC5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIERlbmlzIE0uIEtpc2hlbmtvCiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5nZW9tOwogCiBpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CkBAIC0yNSw1OSArMjYsNzcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBUaGUgQ2xhc3MgQXJjMkQgcmVwcmVzZW50cyBhIHNlZ21lbnQgb2YgYSBjdXJ2ZSBpbnNjcmliZWQgCi0gKiBpbiBhIHJlY3RhbmdsZS4gVGhlIGN1cnZlIGlzIGRlZmluZWQgYnkgYSBzdGFydCBhbmdsZSBhbmQgYW4gCi0gKiBleHRlbnQgYW5nbGUgKHRoZSBlbmQgYW5nbGUgbWludXMgdGhlIHN0YXJ0IGFuZ2xlKSBhcyAKLSAqIGEgcGllIHdlZGdlIHdob3NlIHBvaW50IGlzIGluIHRoZSBjZW50ZXIgb2YgdGhlIHJlY3RhbmdsZS4KLSAqIFRoZSBBcmMyRCBhcyBhIHNoYXBlIG1heSBiZSBlaXRoZXIgT1BFTiAoaW5jbHVkaW5nIG5vdGhpbmcgCi0gKiBidXQgdGhlIGN1cnZlZCBhcmMgc2VnbWVudCBpdHNlbGYpLCBDSE9SRCAodGhlIGN1cnZlZCBhcmMKLSAqIHNlZ21lbnQgY2xvc2VkIGJ5IGEgY29ubmVjdGluZyBzZWdtZW50IGZyb20gdGhlIGVuZCB0byB0aGUgCi0gKiBiZWdpbm5pbmcgb2YgdGhlIGFyYywgb3IgUElFICh0aGUgc2VnbWVudHMgZnJvbSB0aGUgZW5kIAotICogb2YgdGhlIGFyYyB0byB0aGUgY2VudGVyIG9mIHRoZSByZWN0YW5nbGUgYW5kIGZyb20gdGhlCi0gKiBjZW50ZXIgb2YgdGhlIHJlY3RhbmdsZSBiYWNrIHRvIHRoZSBhcmMncyBzdGFydCBwb2ludCBhcmUgCi0gKiBpbmNsdWRlZCkuCisgKiBUaGUgQ2xhc3MgQXJjMkQgcmVwcmVzZW50cyBhIHNlZ21lbnQgb2YgYSBjdXJ2ZSBpbnNjcmliZWQgaW4gYSByZWN0YW5nbGUuIFRoZQorICogY3VydmUgaXMgZGVmaW5lZCBieSBhIHN0YXJ0IGFuZ2xlIGFuZCBhbiBleHRlbnQgYW5nbGUgKHRoZSBlbmQgYW5nbGUgbWludXMKKyAqIHRoZSBzdGFydCBhbmdsZSkgYXMgYSBwaWUgd2VkZ2Ugd2hvc2UgcG9pbnQgaXMgaW4gdGhlIGNlbnRlciBvZiB0aGUKKyAqIHJlY3RhbmdsZS4gVGhlIEFyYzJEIGFzIGEgc2hhcGUgbWF5IGJlIGVpdGhlciBPUEVOIChpbmNsdWRpbmcgbm90aGluZyBidXQgdGhlCisgKiBjdXJ2ZWQgYXJjIHNlZ21lbnQgaXRzZWxmKSwgQ0hPUkQgKHRoZSBjdXJ2ZWQgYXJjIHNlZ21lbnQgY2xvc2VkIGJ5IGEKKyAqIGNvbm5lY3Rpbmcgc2VnbWVudCBmcm9tIHRoZSBlbmQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJjLCBvciBQSUUgKHRoZQorICogc2VnbWVudHMgZnJvbSB0aGUgZW5kIG9mIHRoZSBhcmMgdG8gdGhlIGNlbnRlciBvZiB0aGUgcmVjdGFuZ2xlIGFuZCBmcm9tIHRoZQorICogY2VudGVyIG9mIHRoZSByZWN0YW5nbGUgYmFjayB0byB0aGUgYXJjJ3Mgc3RhcnQgcG9pbnQgYXJlIGluY2x1ZGVkKS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBcmMyRCBleHRlbmRzIFJlY3Rhbmd1bGFyU2hhcGUgewogCi0gICAgLyoqIFRoZSBhcmMgdHlwZSBPUEVOIGluZGljYXRlcyB0aGF0IHRoZSBzaGFwZSBpbmNsdWRlcyBvbmx5IHRoZSAKLSAgICAgKiBjdXJ2ZWQgYXJjIHNlZ21lbnQuICovCisgICAgLyoqCisgICAgICogVGhlIGFyYyB0eXBlIE9QRU4gaW5kaWNhdGVzIHRoYXQgdGhlIHNoYXBlIGluY2x1ZGVzIG9ubHkgdGhlIGN1cnZlZCBhcmMKKyAgICAgKiBzZWdtZW50LgorICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE9QRU4gPSAwOwotICAgIAotICAgIC8qKiBUaGUgYXJjIHR5cGUgQ0hPUkQgaW5kaWNhdGVzIHRoYXQgYXMgYSBzaGFwZSB0aGUgY29ubmVjdGluZwotICAgICAqIHNlZ21lbnQgZnJvbSB0aGUgZW5kIHBvaW50IG9mIHRoZSBjdXJ2ZWQgYXJjIHRvIHRoZSBiZWdpbm5pbmcKLSAgICAgKiBwb2ludCBpcyBpbmNsdWRlZC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBhcmMgdHlwZSBDSE9SRCBpbmRpY2F0ZXMgdGhhdCBhcyBhIHNoYXBlIHRoZSBjb25uZWN0aW5nIHNlZ21lbnQgZnJvbQorICAgICAqIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGN1cnZlZCBhcmMgdG8gdGhlIGJlZ2lubmluZyBwb2ludCBpcyBpbmNsdWRlZC4KKyAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBDSE9SRCA9IDE7Ci0gICAgCi0gICAgLyoqIFRoZSBhcmMgdHlwZSBQSUUgaW5kaWNhdGVzIHRoYXQgYXMgYSBzaGFwZSB0aGUgdHdvIHNlZ21lbnRzIAotICAgICAqIGZyb20gdGhlIGFyYydzIGVuZHBvaW50IHRvIHRoZSBjZW50ZXIgb2YgdGhlIHJlY3RhbmdsZSBhbmQgZnJvbSAKLSAgICAgKiB0aGUgY2VudGVyIG9mIHRoZSByZWN0YW5nbGUgdG8gdGhlIGFyYydzIGVuZHBvaW50IGFyZSBpbmNsdWRlZC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBhcmMgdHlwZSBQSUUgaW5kaWNhdGVzIHRoYXQgYXMgYSBzaGFwZSB0aGUgdHdvIHNlZ21lbnRzIGZyb20gdGhlCisgICAgICogYXJjJ3MgZW5kcG9pbnQgdG8gdGhlIGNlbnRlciBvZiB0aGUgcmVjdGFuZ2xlIGFuZCBmcm9tIHRoZSBjZW50ZXIgb2YgdGhlCisgICAgICogcmVjdGFuZ2xlIHRvIHRoZSBhcmMncyBlbmRwb2ludCBhcmUgaW5jbHVkZWQuCisgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgUElFID0gMjsKIAogICAgIC8qKgotICAgICAqIFRoZSBDbGFzcyBGbG9hdCBpcyBhIHN1YmNsYXNzIG9mIEFyYzJEIGluIHdoaWNoIGFsbCBvZiB0aGUgCi0gICAgICogZGF0YSB2YWx1ZXMgYXJlIGdpdmVuIGFzIGZsb2F0cy4KKyAgICAgKiBUaGUgQ2xhc3MgRmxvYXQgaXMgYSBzdWJjbGFzcyBvZiBBcmMyRCBpbiB3aGljaCBhbGwgb2YgdGhlIGRhdGEgdmFsdWVzCisgICAgICogYXJlIGdpdmVuIGFzIGZsb2F0cy4KKyAgICAgKiAKICAgICAgKiBAc2VlIEFyYzJELkRvdWJsZQorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmxvYXQgZXh0ZW5kcyBBcmMyRCB7CiAKLSAgICAgICAgLyoqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGUgdGhhdAotICAgICAgICAgKiBjb250YWlucyB0aGUgYXJjLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZSB0aGF0CisgICAgICAgICAqIGNvbnRhaW5zIHRoZSBhcmMuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmxvYXQgeDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlIHRoYXQKLSAgICAgICAgICogY29udGFpbnMgdGhlIGFyYy4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZSB0aGF0CisgICAgICAgICAqIGNvbnRhaW5zIHRoZSBhcmMuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmxvYXQgeTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZSB0aGF0IGNvbnRhaW5zIHRoZSBhcmMuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlIHRoYXQgY29udGFpbnMgdGhlIGFyYy4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmbG9hdCB3aWR0aDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgdGhhdCBjb250YWlucyB0aGUgYXJjLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgdGhhdCBjb250YWlucyB0aGUgYXJjLgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGZsb2F0IGhlaWdodDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgc3RhcnQgYW5nbGUgb2YgdGhlIGFyYyBpbiBkZWdyZWVzLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgc3RhcnQgYW5nbGUgb2YgdGhlIGFyYyBpbiBkZWdyZWVzLgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGZsb2F0IHN0YXJ0OwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB3aWR0aCBhbmdsZSBvZiB0aGUgYXJjIGluIGRlZ3JlZXMuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB3aWR0aCBhbmdsZSBvZiB0aGUgYXJjIGluIGRlZ3JlZXMuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmxvYXQgZXh0ZW50OwogCiAgICAgICAgIC8qKgpAQCAtOTAsOCArMTA5LDkgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBBcmMyRCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgd2l0aCBmbG9hdCB2YWx1ZXMuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgbmV3IEFyYzJELCBlaXRoZXIge0BsaW5rIEFyYzJEI09QRU59LCAKLSAgICAgICAgICoge0BsaW5rIEFyYzJEI0NIT1JEfSwgb3Ige0BsaW5rIEFyYzJEI1BJRX0uCisgICAgICAgICAqIEBwYXJhbSB0eXBlCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIG5ldyBBcmMyRCwgZWl0aGVyIHtAbGluayBBcmMyRCNPUEVOfSwKKyAgICAgICAgICogICAgICAgICAgICB7QGxpbmsgQXJjMkQjQ0hPUkR9LCBvciB7QGxpbmsgQXJjMkQjUElFfS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBGbG9hdChpbnQgdHlwZSkgewogICAgICAgICAgICAgc3VwZXIodHlwZSk7CkBAIC0xMDAsMjAgKzEyMCwyNiBAQAogICAgICAgICAvKioKICAgICAgICAgICogSW5zdGFudGlhdGVzIGEgQXJjMkQgd2l0aCB0aGUgc3BlY2lmaWVkIGZsb2F0LXZhbHVlZCBkYXRhLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHggdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZSB0aGF0Ci0gICAgICAgICAqIGNvbnRhaW5zIHRoZSBhcmMuCi0gICAgICAgICAqIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGUgdGhhdAotICAgICAgICAgKiBjb250YWlucyB0aGUgYXJjLgotICAgICAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUgdGhhdAotICAgICAgICAgKiBjb250YWlucyB0aGUgYXJjLgotICAgICAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSB0aGF0Ci0gICAgICAgICAqIGNvbnRhaW5zIHRoZSBhcmMuCi0gICAgICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgYW5nbGUgb2YgdGhlIGFyYyBpbiBkZWdyZWVzLgotICAgICAgICAgKiBAcGFyYW0gZXh0ZW50IHRoZSB3aWR0aCBhbmdsZSBvZiB0aGUgYXJjIGluIGRlZ3JlZXMuCi0gICAgICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoZSBuZXcgQXJjMkQsIGVpdGhlciB7QGxpbmsgQXJjMkQjT1BFTn0sIAotICAgICAgICAgKiB7QGxpbmsgQXJjMkQjQ0hPUkR9LCBvciB7QGxpbmsgQXJjMkQjUElFfS4KKyAgICAgICAgICogQHBhcmFtIHgKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICAgICAqICAgICAgICAgICAgdGhhdCBjb250YWlucyB0aGUgYXJjLgorICAgICAgICAgKiBAcGFyYW0geQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgICAgICogICAgICAgICAgICB0aGF0IGNvbnRhaW5zIHRoZSBhcmMuCisgICAgICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlIHRoYXQgY29udGFpbnMgdGhlIGFyYy4KKyAgICAgICAgICogQHBhcmFtIGhlaWdodAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSB0aGF0IGNvbnRhaW5zIHRoZSBhcmMuCisgICAgICAgICAqIEBwYXJhbSBzdGFydAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBhbmdsZSBvZiB0aGUgYXJjIGluIGRlZ3JlZXMuCisgICAgICAgICAqIEBwYXJhbSBleHRlbnQKKyAgICAgICAgICogICAgICAgICAgICB0aGUgd2lkdGggYW5nbGUgb2YgdGhlIGFyYyBpbiBkZWdyZWVzLgorICAgICAgICAgKiBAcGFyYW0gdHlwZQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBuZXcgQXJjMkQsIGVpdGhlciB7QGxpbmsgQXJjMkQjT1BFTn0sCisgICAgICAgICAqICAgICAgICAgICAge0BsaW5rIEFyYzJEI0NIT1JEfSwgb3Ige0BsaW5rIEFyYzJEI1BJRX0uCiAgICAgICAgICAqLwotICAgICAgICBwdWJsaWMgRmxvYXQoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgd2lkdGgsIGZsb2F0IGhlaWdodCwgZmxvYXQgc3RhcnQsIGZsb2F0IGV4dGVudCwgaW50IHR5cGUpIHsKKyAgICAgICAgcHVibGljIEZsb2F0KGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHdpZHRoLCBmbG9hdCBoZWlnaHQsIGZsb2F0IHN0YXJ0LCBmbG9hdCBleHRlbnQsCisgICAgICAgICAgICAgICAgaW50IHR5cGUpIHsKICAgICAgICAgICAgIHN1cGVyKHR5cGUpOwogICAgICAgICAgICAgdGhpcy54ID0geDsKICAgICAgICAgICAgIHRoaXMueSA9IHk7CkBAIC0xMjQsMTQgKzE1MCwxOCBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBBbmdsZTJEIHdpdGggdGhlIHNwZWNpZmllZCBmbG9hdC12YWx1ZWQgZGF0YQotICAgICAgICAgKiBhbmQgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBnaXZlbiBieSB0aGUgcGFyYW1ldGVyIGJvdW5kcy4KKyAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEFuZ2xlMkQgd2l0aCB0aGUgc3BlY2lmaWVkIGZsb2F0LXZhbHVlZCBkYXRhIGFuZAorICAgICAgICAgKiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIGdpdmVuIGJ5IHRoZSBwYXJhbWV0ZXIgYm91bmRzLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGJvdW5kcyB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIG9mIHRoZSBBbmdsZTJELgotICAgICAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IGFuZ2xlIG9mIHRoZSBhcmMgaW4gZGVncmVlcy4KLSAgICAgICAgICogQHBhcmFtIGV4dGVudCB0aGUgd2lkdGggYW5nbGUgb2YgdGhlIGFyYyBpbiBkZWdyZWVzLgotICAgICAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgbmV3IEFyYzJELCBlaXRoZXIge0BsaW5rIEFyYzJEI09QRU59LCAKLSAgICAgICAgICoge0BsaW5rIEFyYzJEI0NIT1JEfSwgb3Ige0BsaW5rIEFyYzJEI1BJRX0uCisgICAgICAgICAqIEBwYXJhbSBib3VuZHMKKyAgICAgICAgICogICAgICAgICAgICB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIG9mIHRoZSBBbmdsZTJELgorICAgICAgICAgKiBAcGFyYW0gc3RhcnQKKyAgICAgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgYW5nbGUgb2YgdGhlIGFyYyBpbiBkZWdyZWVzLgorICAgICAgICAgKiBAcGFyYW0gZXh0ZW50CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIGFuZ2xlIG9mIHRoZSBhcmMgaW4gZGVncmVlcy4KKyAgICAgICAgICogQHBhcmFtIHR5cGUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgbmV3IEFyYzJELCBlaXRoZXIge0BsaW5rIEFyYzJEI09QRU59LAorICAgICAgICAgKiAgICAgICAgICAgIHtAbGluayBBcmMyRCNDSE9SRH0sIG9yIHtAbGluayBBcmMyRCNQSUV9LgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIEZsb2F0KFJlY3RhbmdsZTJEIGJvdW5kcywgZmxvYXQgc3RhcnQsIGZsb2F0IGV4dGVudCwgaW50IHR5cGUpIHsKICAgICAgICAgICAgIHN1cGVyKHR5cGUpOwpAQCAtMTQ4LDggKzE3OCw4IEBACiAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgfQogCi0gICAgICAgQE92ZXJyaWRlCi0gICAgICAgcHVibGljIGRvdWJsZSBnZXRZKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGRvdWJsZSBnZXRZKCkgewogICAgICAgICAgICAgcmV0dXJuIHk7CiAgICAgICAgIH0KIApAQCAtMTc5LDkgKzIwOSw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0QXJjKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHdpZHRoLCBkb3VibGUgaGVpZ2h0LAotICAgICAgICAgICAgICAgIGRvdWJsZSBzdGFydCwgZG91YmxlIGV4dGVudCwgaW50IHR5cGUpCi0gICAgICAgIHsKKyAgICAgICAgcHVibGljIHZvaWQgc2V0QXJjKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHdpZHRoLCBkb3VibGUgaGVpZ2h0LCBkb3VibGUgc3RhcnQsCisgICAgICAgICAgICAgICAgZG91YmxlIGV4dGVudCwgaW50IHR5cGUpIHsKICAgICAgICAgICAgIHRoaXMuc2V0QXJjVHlwZSh0eXBlKTsKICAgICAgICAgICAgIHRoaXMueCA9IChmbG9hdCl4OwogICAgICAgICAgICAgdGhpcy55ID0gKGZsb2F0KXk7CkBAIC0yMDksMzAgKzIzOCw0NCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoZSBDbGFzcyBEb3VibGUgaXMgYSBzdWJjbGFzcyBvZiBBcmMyRCBpbiB3aGljaCBhbGwgb2YgdGhlIAotICAgICAqIGRhdGEgdmFsdWVzIGFyZSBnaXZlbiBhcyBkb3VibGVzLgorICAgICAqIFRoZSBDbGFzcyBEb3VibGUgaXMgYSBzdWJjbGFzcyBvZiBBcmMyRCBpbiB3aGljaCBhbGwgb2YgdGhlIGRhdGEgdmFsdWVzCisgICAgICogYXJlIGdpdmVuIGFzIGRvdWJsZXMuCisgICAgICogCiAgICAgICogQHNlZSBBcmMyRC5GbG9hdAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRG91YmxlIGV4dGVuZHMgQXJjMkQgewogCi0gICAgICAgIC8qKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlIHRoYXQKLSAgICAgICAgICogY29udGFpbnMgdGhlIGFyYy4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGUgdGhhdAorICAgICAgICAgKiBjb250YWlucyB0aGUgYXJjLgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGRvdWJsZSB4OwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGUgdGhhdAotICAgICAgICAgKiBjb250YWlucyB0aGUgYXJjLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlIHRoYXQKKyAgICAgICAgICogY29udGFpbnMgdGhlIGFyYy4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBkb3VibGUgeTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZSB0aGF0IGNvbnRhaW5zIHRoZSBhcmMuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlIHRoYXQgY29udGFpbnMgdGhlIGFyYy4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBkb3VibGUgd2lkdGg7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlIHRoYXQgY29udGFpbnMgdGhlIGFyYy4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlIHRoYXQgY29udGFpbnMgdGhlIGFyYy4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBkb3VibGUgaGVpZ2h0OwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBzdGFydCBhbmdsZSBvZiB0aGUgYXJjIGluIGRlZ3JlZXMuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzdGFydCBhbmdsZSBvZiB0aGUgYXJjIGluIGRlZ3JlZXMuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZG91YmxlIHN0YXJ0OwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB3aWR0aCBhbmdsZSBvZiB0aGUgYXJjIGluIGRlZ3JlZXMuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB3aWR0aCBhbmdsZSBvZiB0aGUgYXJjIGluIGRlZ3JlZXMuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZG91YmxlIGV4dGVudDsKIAogICAgICAgICAvKioKQEAgLTI0NSw4ICsyODgsOSBAQAogICAgICAgICAvKioKICAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEFyYzJEIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB3aXRoIGRvdWJsZSB2YWx1ZXMuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgbmV3IEFyYzJELCBlaXRoZXIge0BsaW5rIEFyYzJEI09QRU59LCAKLSAgICAgICAgICoge0BsaW5rIEFyYzJEI0NIT1JEfSwgb3Ige0BsaW5rIEFyYzJEI1BJRX0uCisgICAgICAgICAqIEBwYXJhbSB0eXBlCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIG5ldyBBcmMyRCwgZWl0aGVyIHtAbGluayBBcmMyRCNPUEVOfSwKKyAgICAgICAgICogICAgICAgICAgICB7QGxpbmsgQXJjMkQjQ0hPUkR9LCBvciB7QGxpbmsgQXJjMkQjUElFfS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBEb3VibGUoaW50IHR5cGUpIHsKICAgICAgICAgICAgIHN1cGVyKHR5cGUpOwpAQCAtMjU1LDIyICsyOTksMjYgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEluc3RhbnRpYXRlcyBhIEFyYzJEIHdpdGggdGhlIHNwZWNpZmllZCBkb3VibGUtdmFsdWVkIGRhdGEuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0geCB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlIHRoYXQKLSAgICAgICAgICogY29udGFpbnMgdGhlIGFyYy4KLSAgICAgICAgICogQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZSB0aGF0Ci0gICAgICAgICAqIGNvbnRhaW5zIHRoZSBhcmMuCi0gICAgICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZSB0aGF0Ci0gICAgICAgICAqIGNvbnRhaW5zIHRoZSBhcmMuCi0gICAgICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlIHRoYXQKLSAgICAgICAgICogY29udGFpbnMgdGhlIGFyYy4KLSAgICAgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBhbmdsZSBvZiB0aGUgYXJjIGluIGRlZ3JlZXMuCi0gICAgICAgICAqIEBwYXJhbSBleHRlbnQgdGhlIHdpZHRoIGFuZ2xlIG9mIHRoZSBhcmMgaW4gZGVncmVlcy4KLSAgICAgICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgdGhlIG5ldyBBcmMyRCwgZWl0aGVyIHtAbGluayBBcmMyRCNPUEVOfSwgCi0gICAgICAgICAqIHtAbGluayBBcmMyRCNDSE9SRH0sIG9yIHtAbGluayBBcmMyRCNQSUV9LgorICAgICAgICAgKiBAcGFyYW0geAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgICAgICogICAgICAgICAgICB0aGF0IGNvbnRhaW5zIHRoZSBhcmMuCisgICAgICAgICAqIEBwYXJhbSB5CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZQorICAgICAgICAgKiAgICAgICAgICAgIHRoYXQgY29udGFpbnMgdGhlIGFyYy4KKyAgICAgICAgICogQHBhcmFtIHdpZHRoCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUgdGhhdCBjb250YWlucyB0aGUgYXJjLgorICAgICAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlIHRoYXQgY29udGFpbnMgdGhlIGFyYy4KKyAgICAgICAgICogQHBhcmFtIHN0YXJ0CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IGFuZ2xlIG9mIHRoZSBhcmMgaW4gZGVncmVlcy4KKyAgICAgICAgICogQHBhcmFtIGV4dGVudAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBhbmdsZSBvZiB0aGUgYXJjIGluIGRlZ3JlZXMuCisgICAgICAgICAqIEBwYXJhbSB0eXBlCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIG5ldyBBcmMyRCwgZWl0aGVyIHtAbGluayBBcmMyRCNPUEVOfSwKKyAgICAgICAgICogICAgICAgICAgICB7QGxpbmsgQXJjMkQjQ0hPUkR9LCBvciB7QGxpbmsgQXJjMkQjUElFfS4KICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBEb3VibGUoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgd2lkdGgsIGRvdWJsZSBoZWlnaHQsCi0gICAgICAgICAgICAgICAgZG91YmxlIHN0YXJ0LCBkb3VibGUgZXh0ZW50LCBpbnQgdHlwZSkKLSAgICAgICAgeworICAgICAgICBwdWJsaWMgRG91YmxlKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHdpZHRoLCBkb3VibGUgaGVpZ2h0LCBkb3VibGUgc3RhcnQsIGRvdWJsZSBleHRlbnQsCisgICAgICAgICAgICAgICAgaW50IHR5cGUpIHsKICAgICAgICAgICAgIHN1cGVyKHR5cGUpOwogICAgICAgICAgICAgdGhpcy54ID0geDsKICAgICAgICAgICAgIHRoaXMueSA9IHk7CkBAIC0yODEsMTQgKzMyOSwxOCBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBBbmdsZTJEIHdpdGggdGhlIHNwZWNpZmllZCBmbG9hdC12YWx1ZWQgZGF0YQotICAgICAgICAgKiBhbmQgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBnaXZlbiBieSB0aGUgcGFyYW1ldGVyIGJvdW5kcy4KKyAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEFuZ2xlMkQgd2l0aCB0aGUgc3BlY2lmaWVkIGZsb2F0LXZhbHVlZCBkYXRhIGFuZAorICAgICAgICAgKiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIGdpdmVuIGJ5IHRoZSBwYXJhbWV0ZXIgYm91bmRzLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGJvdW5kcyB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIG9mIHRoZSBBbmdsZTJELgotICAgICAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IGFuZ2xlIG9mIHRoZSBhcmMgaW4gZGVncmVlcy4KLSAgICAgICAgICogQHBhcmFtIGV4dGVudCB0aGUgd2lkdGggYW5nbGUgb2YgdGhlIGFyYyBpbiBkZWdyZWVzLgotICAgICAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgbmV3IEFyYzJELCBlaXRoZXIge0BsaW5rIEFyYzJEI09QRU59LCAKLSAgICAgICAgICoge0BsaW5rIEFyYzJEI0NIT1JEfSwgb3Ige0BsaW5rIEFyYzJEI1BJRX0uCisgICAgICAgICAqIEBwYXJhbSBib3VuZHMKKyAgICAgICAgICogICAgICAgICAgICB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIG9mIHRoZSBBbmdsZTJELgorICAgICAgICAgKiBAcGFyYW0gc3RhcnQKKyAgICAgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgYW5nbGUgb2YgdGhlIGFyYyBpbiBkZWdyZWVzLgorICAgICAgICAgKiBAcGFyYW0gZXh0ZW50CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIGFuZ2xlIG9mIHRoZSBhcmMgaW4gZGVncmVlcy4KKyAgICAgICAgICogQHBhcmFtIHR5cGUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgbmV3IEFyYzJELCBlaXRoZXIge0BsaW5rIEFyYzJEI09QRU59LAorICAgICAgICAgKiAgICAgICAgICAgIHtAbGluayBBcmMyRCNDSE9SRH0sIG9yIHtAbGluayBBcmMyRCNQSUV9LgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIERvdWJsZShSZWN0YW5nbGUyRCBib3VuZHMsIGRvdWJsZSBzdGFydCwgZG91YmxlIGV4dGVudCwgaW50IHR5cGUpIHsKICAgICAgICAgICAgIHN1cGVyKHR5cGUpOwpAQCAtMzM2LDkgKzM4OCw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0QXJjKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHdpZHRoLCBkb3VibGUgaGVpZ2h0LAotICAgICAgICAgICAgICAgIGRvdWJsZSBzdGFydCwgZG91YmxlIGV4dGVudCwgaW50IHR5cGUpCi0gICAgICAgIHsKKyAgICAgICAgcHVibGljIHZvaWQgc2V0QXJjKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHdpZHRoLCBkb3VibGUgaGVpZ2h0LCBkb3VibGUgc3RhcnQsCisgICAgICAgICAgICAgICAgZG91YmxlIGV4dGVudCwgaW50IHR5cGUpIHsKICAgICAgICAgICAgIHRoaXMuc2V0QXJjVHlwZSh0eXBlKTsKICAgICAgICAgICAgIHRoaXMueCA9IHg7CiAgICAgICAgICAgICB0aGlzLnkgPSB5OwpAQCAtMzY2LDczICs0MTcsMTE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhlIENsYXNzIEl0ZXJhdG9yIGlzIHRoZSBzdWJjbGFzcyBvZiBQYXRoSXRlcmF0b3IgdGhhdCBpcyB1c2VkIHRvIAorICAgICAqIFRoZSBDbGFzcyBJdGVyYXRvciBpcyB0aGUgc3ViY2xhc3Mgb2YgUGF0aEl0ZXJhdG9yIHRoYXQgaXMgdXNlZCB0bwogICAgICAqIHRyYXZlcnNlIHRoZSBib3VuZGFyeSBvZiBhIHNoYXBlIG9mIHR5cGUgQXJjMkQuCiAgICAgICovCiAgICAgY2xhc3MgSXRlcmF0b3IgaW1wbGVtZW50cyBQYXRoSXRlcmF0b3IgewogCi0gICAgICAgIC8qKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGFyYydzIGJvdW5kaW5nIHJlY3RhbmdsZS4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGNlbnRlciBvZiB0aGUgYXJjJ3MgYm91bmRpbmcgcmVjdGFuZ2xlLgorICAgICAgICAgKi8KICAgICAgICAgZG91YmxlIHg7CiAKLSAgICAgICAgLyoqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGNlbnRlciBvZiB0aGUgYXJjJ3MgYm91bmRpbmcgcmVjdGFuZ2xlLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgY2VudGVyIG9mIHRoZSBhcmMncyBib3VuZGluZyByZWN0YW5nbGUuCisgICAgICAgICAqLwogICAgICAgICBkb3VibGUgeTsKIAotICAgICAgICAvKiogSGFsZiBvZiB0aGUgd2lkdGggb2YgdGhlIGFyYydzIGJvdW5kaW5nIHJlY3RhbmdsZSAodGhlIHJhZGl1cyBpbiB0aGUgY2FzZSBvZiBhIGNpcmN1bGFyIGFyYykuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYWxmIG9mIHRoZSB3aWR0aCBvZiB0aGUgYXJjJ3MgYm91bmRpbmcgcmVjdGFuZ2xlICh0aGUgcmFkaXVzIGluIHRoZQorICAgICAgICAgKiBjYXNlIG9mIGEgY2lyY3VsYXIgYXJjKS4KKyAgICAgICAgICovCiAgICAgICAgIGRvdWJsZSB3aWR0aDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBIYWxmIG9mIHRoZSBoZWlnaHQgb2YgdGhlIGFyYydzIGJvdW5kaW5nIHJlY3RhbmdsZSAodGhlIHJhZGl1cyBpbiB0aGUgY2FzZSBvZiBhIGNpcmN1bGFyIGFyYykuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbGYgb2YgdGhlIGhlaWdodCBvZiB0aGUgYXJjJ3MgYm91bmRpbmcgcmVjdGFuZ2xlICh0aGUgcmFkaXVzIGluIHRoZQorICAgICAgICAgKiBjYXNlIG9mIGEgY2lyY3VsYXIgYXJjKS4KKyAgICAgICAgICovCiAgICAgICAgIGRvdWJsZSBoZWlnaHQ7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHN0YXJ0IGFuZ2xlIG9mIHRoZSBhcmMgaW4gZGVncmVlcy4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHN0YXJ0IGFuZ2xlIG9mIHRoZSBhcmMgaW4gZGVncmVlcy4KKyAgICAgICAgICovCiAgICAgICAgIGRvdWJsZSBhbmdsZTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgYW5nbGUgZXh0ZW50IGluIGRlZ3JlZXMuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBhbmdsZSBleHRlbnQgaW4gZGVncmVlcy4KKyAgICAgICAgICovCiAgICAgICAgIGRvdWJsZSBleHRlbnQ7Ci0gICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBjbG9zdXJlIHR5cGUgb2YgdGhlIGFyYy4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNsb3N1cmUgdHlwZSBvZiB0aGUgYXJjLgorICAgICAgICAgKi8KICAgICAgICAgaW50IHR5cGU7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHBhdGggaXRlcmF0b3IgdHJhbnNmb3JtYXRpb24uICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBwYXRoIGl0ZXJhdG9yIHRyYW5zZm9ybWF0aW9uLgorICAgICAgICAgKi8KICAgICAgICAgQWZmaW5lVHJhbnNmb3JtIHQ7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIGN1cnJlbnQgc2VnbWVudCBpbmRleC4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGN1cnJlbnQgc2VnbWVudCBpbmRleC4KKyAgICAgICAgICovCiAgICAgICAgIGludCBpbmRleDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgbnVtYmVyIG9mIGFyYyBzZWdtZW50cyB0aGUgc291cmNlIGFyYyBzdWJkaXZpZGVkIHRvIGJlIGFwcHJveGltYXRlZCBieSBCZXppZXIgY3VydmVzLiBEZXBlbmRzIG9uIGV4dGVudCB2YWx1ZS4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG51bWJlciBvZiBhcmMgc2VnbWVudHMgdGhlIHNvdXJjZSBhcmMgc3ViZGl2aWRlZCB0byBiZQorICAgICAgICAgKiBhcHByb3hpbWF0ZWQgYnkgQmV6aWVyIGN1cnZlcy4gRGVwZW5kcyBvbiBleHRlbnQgdmFsdWUuCisgICAgICAgICAqLwogICAgICAgICBpbnQgYXJjQ291bnQ7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIG51bWJlciBvZiBsaW5lIHNlZ21lbnRzLiBEZXBlbmRzIG9uIGNsb3N1cmUgdHlwZS4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG51bWJlciBvZiBsaW5lIHNlZ21lbnRzLiBEZXBlbmRzIG9uIGNsb3N1cmUgdHlwZS4KKyAgICAgICAgICovCiAgICAgICAgIGludCBsaW5lQ291bnQ7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHN0ZXAgdG8gY2FsY3VsYXRlIG5leHQgYXJjIHN1YmRpdmlzaW9uIHBvaW50LiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgc3RlcCB0byBjYWxjdWxhdGUgbmV4dCBhcmMgc3ViZGl2aXNpb24gcG9pbnQuCisgICAgICAgICAqLwogICAgICAgICBkb3VibGUgc3RlcDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgdGVtcG9yYXJ5IHZhbHVlIG9mIGNvc2ludXMgb2YgdGhlIGN1cnJlbnQgYW5nbGUuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0ZW1wb3JhcnkgdmFsdWUgb2YgY29zaW51cyBvZiB0aGUgY3VycmVudCBhbmdsZS4KKyAgICAgICAgICovCiAgICAgICAgIGRvdWJsZSBjb3M7CiAKLSAgICAgICAgLyoqIFRoZSB0ZW1wb3JhcnkgdmFsdWUgb2Ygc2ludXMgb2YgdGhlIGN1cnJlbnQgYW5nbGUuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdGVtcG9yYXJ5IHZhbHVlIG9mIHNpbnVzIG9mIHRoZSBjdXJyZW50IGFuZ2xlLgorICAgICAgICAgKi8KICAgICAgICAgZG91YmxlIHNpbjsKLSAgICAgICAgCisKICAgICAgICAgLyoqIFRoZSBjb2VmZmljaWVudCB0byBjYWxjdWxhdGUgY29udHJvbCBwb2ludHMgb2YgQmV6aWVyIGN1cnZlcy4gKi8KICAgICAgICAgZG91YmxlIGs7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHRlbXBvcmFyeSB2YWx1ZSBvZiB4IGNvb3JkaW5hdGUgb2YgdGhlIEJlemllciBjdXJ2ZSBjb250cm9sIHZlY3Rvci4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHRlbXBvcmFyeSB2YWx1ZSBvZiB4IGNvb3JkaW5hdGUgb2YgdGhlIEJlemllciBjdXJ2ZSBjb250cm9sCisgICAgICAgICAqIHZlY3Rvci4KKyAgICAgICAgICovCiAgICAgICAgIGRvdWJsZSBreDsKIAotICAgICAgICAvKiogVGhlIHRlbXBvcmFyeSB2YWx1ZSBvZiB5IGNvb3JkaW5hdGUgb2YgdGhlIEJlemllciBjdXJ2ZSBjb250cm9sIHZlY3Rvci4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0ZW1wb3JhcnkgdmFsdWUgb2YgeSBjb29yZGluYXRlIG9mIHRoZSBCZXppZXIgY3VydmUgY29udHJvbAorICAgICAgICAgKiB2ZWN0b3IuCisgICAgICAgICAqLwogICAgICAgICBkb3VibGUga3k7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcGF0aCBwb2ludCAoTU9WRV9UTykuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IHBhdGggcG9pbnQgKE1PVkVfVE8pLgorICAgICAgICAgKi8KICAgICAgICAgZG91YmxlIG14OwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IHBhdGggcG9pbnQgKE1PVkVfVE8pLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwYXRoIHBvaW50IChNT1ZFX1RPKS4KKyAgICAgICAgICovCiAgICAgICAgIGRvdWJsZSBteTsKIAogICAgICAgICAvKioKICAgICAgICAgICogQ29uc3RydWN0cyBhIG5ldyBBcmMyRC5JdGVyYXRvciBmb3IgZ2l2ZW4gbGluZSBhbmQgdHJhbnNmb3JtYXRpb24KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBhIC0gdGhlIHNvdXJjZSBBcmMyRCBvYmplY3QKLSAgICAgICAgICogQHBhcmFtIHQgdGhlIEFmZmluZVRyYW5zZm9ybWF0aW9uLgorICAgICAgICAgKiBAcGFyYW0gYQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgQXJjMkQgb2JqZWN0LgorICAgICAgICAgKiBAcGFyYW0gdAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBBZmZpbmVUcmFuc2Zvcm1hdGlvbi4KICAgICAgICAgICovCiAgICAgICAgIEl0ZXJhdG9yKEFyYzJEIGEsIEFmZmluZVRyYW5zZm9ybSB0KSB7CiAgICAgICAgICAgICBpZiAod2lkdGggPCAwIHx8IGhlaWdodCA8IDApIHsKQEAgLTQ2Miw4ICs1NTYsNyBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBhcmNDb3VudCA9IChpbnQpTWF0aC5yaW50KE1hdGguYWJzKGV4dGVudCkgLyA5MC4wKTsKICAgICAgICAgICAgICAgICBzdGVwID0gTWF0aC50b1JhZGlhbnMoZXh0ZW50IC8gYXJjQ291bnQpOwotICAgICAgICAgICAgICAgIGsgPSA0LjAgLyAzLjAgKiAoMS4wIC0gTWF0aC5jb3Moc3RlcCAvIDIuMCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAvIE1hdGguc2luKHN0ZXAgLyAyLjApOworICAgICAgICAgICAgICAgIGsgPSA0LjAgLyAzLjAgKiAoMS4wIC0gTWF0aC5jb3Moc3RlcCAvIDIuMCkpIC8gTWF0aC5zaW4oc3RlcCAvIDIuMCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGxpbmVDb3VudCA9IDA7CkBAIC01NzgsMTMgKzY3MSwxNiBAQAogCiAgICAgfQogCi0gICAgLyoqIFRoZSBjbG9zdXJlIHR5cGUgb2YgdGhlIGFyYy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY2xvc3VyZSB0eXBlIG9mIHRoZSBhcmMuCisgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgdHlwZTsKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBhcmMyRC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHlwZSB0aGUgY2xvc3VyZSB0eXBlLgorICAgICAqIEBwYXJhbSB0eXBlCisgICAgICogICAgICAgICAgICB0aGUgY2xvc3VyZSB0eXBlLgogICAgICAqLwogICAgIHByb3RlY3RlZCBBcmMyRChpbnQgdHlwZSkgewogICAgICAgICBzZXRBcmNUeXBlKHR5cGUpOwpAQCAtNTk1LDExICs2OTEsMTYgQEAKICAgICAgKiBvYmplY3Qgd2l0aCB2YWx1ZXMgZWl0aGVyIG9mIHR5cGUgZmxvYXQgb3Igb2YgdHlwZSBkb3VibGUgZGVwZW5kaW5nIG9uCiAgICAgICogd2hldGhlciB0aGlzIEFyYzJEIGluc3RhbmNlIGlzIG9mIHR5cGUgRmxvYXQgb3IgRG91YmxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUuCi0gICAgICogCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBib3VuZGluZworICAgICAqICAgICAgICAgICAgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgYm91bmRpbmcKKyAgICAgKiAgICAgICAgICAgIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZS4KICAgICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIFJlY3RhbmdsZTJEIG9iamVjdC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgUmVjdGFuZ2xlMkQgbWFrZUJvdW5kcyhkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB3aWR0aCwgZG91YmxlIGhlaWdodCk7CkBAIC02MjEsMzkgKzcyMiw0NiBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHN0YXJ0IGFuZ2xlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzdGFydCB0aGUgbmV3IHN0YXJ0IGFuZ2xlLgorICAgICAqIEBwYXJhbSBzdGFydAorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBzdGFydCBhbmdsZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRBbmdsZVN0YXJ0KGRvdWJsZSBzdGFydCk7CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSB3aWR0aCBhbmdsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXh0ZW50IHRoZSBuZXcgd2lkdGggYW5nbGUuCisgICAgICogQHBhcmFtIGV4dGVudAorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB3aWR0aCBhbmdsZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRBbmdsZUV4dGVudChkb3VibGUgZXh0ZW50KTsKIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGRhdGEgdmFsdWVzIHRoYXQgZGVmaW5lIHRoZSBhcmMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZSB0aGF0Ci0gICAgICogY29udGFpbnMgdGhlIGFyYy4KLSAgICAgKiBAcGFyYW0geSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlIHRoYXQKLSAgICAgKiBjb250YWlucyB0aGUgYXJjLgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZSB0aGF0Ci0gICAgICogY29udGFpbnMgdGhlIGFyYy4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSB0aGF0Ci0gICAgICogY29udGFpbnMgdGhlIGFyYy4KLSAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IGFuZ2xlIG9mIHRoZSBhcmMgaW4gZGVncmVlcy4KLSAgICAgKiBAcGFyYW0gZXh0ZW50IHRoZSB3aWR0aCBhbmdsZSBvZiB0aGUgYXJjIGluIGRlZ3JlZXMuCi0gICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgdGhlIG5ldyBBcmMyRCwgZWl0aGVyIHtAbGluayBBcmMyRCNPUEVOfSwgCi0gICAgICoge0BsaW5rIEFyYzJEI0NIT1JEfSwgb3Ige0BsaW5rIEFyYzJEI1BJRX0uCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiAgICAgICAgICAgIHRoYXQgY29udGFpbnMgdGhlIGFyYy4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqICAgICAgICAgICAgdGhhdCBjb250YWlucyB0aGUgYXJjLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUgdGhhdCBjb250YWlucyB0aGUgYXJjLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSB0aGF0IGNvbnRhaW5zIHRoZSBhcmMuCisgICAgICogQHBhcmFtIHN0YXJ0CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgYW5nbGUgb2YgdGhlIGFyYyBpbiBkZWdyZWVzLgorICAgICAqIEBwYXJhbSBleHRlbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBhbmdsZSBvZiB0aGUgYXJjIGluIGRlZ3JlZXMuCisgICAgICogQHBhcmFtIHR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBuZXcgQXJjMkQsIGVpdGhlciB7QGxpbmsgQXJjMkQjT1BFTn0sCisgICAgICogICAgICAgICAgICB7QGxpbmsgQXJjMkQjQ0hPUkR9LCBvciB7QGxpbmsgQXJjMkQjUElFfS4KICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRBcmMoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgd2lkdGgsCi0gICAgICAgICAgICBkb3VibGUgaGVpZ2h0LCBkb3VibGUgc3RhcnQsIGRvdWJsZSBleHRlbnQsIGludCB0eXBlKTsKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRBcmMoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgd2lkdGgsIGRvdWJsZSBoZWlnaHQsIGRvdWJsZSBzdGFydCwKKyAgICAgICAgICAgIGRvdWJsZSBleHRlbnQsIGludCB0eXBlKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGFyYyB0eXBlLCBlaXRoZXIge0BsaW5rIEFyYzJEI09QRU59LCAKLSAgICAgKiB7QGxpbmsgQXJjMkQjQ0hPUkR9LCBvciB7QGxpbmsgQXJjMkQjUElFfS4KKyAgICAgKiBHZXRzIHRoZSBhcmMgdHlwZSwgZWl0aGVyIHtAbGluayBBcmMyRCNPUEVOfSwge0BsaW5rIEFyYzJEI0NIT1JEfSwgb3IKKyAgICAgKiB7QGxpbmsgQXJjMkQjUElFfS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBhcmMgdHlwZS4KICAgICAgKi8KQEAgLTY2MiwxMCArNzcwLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgYXJjIHR5cGUsIGVpdGhlciB7QGxpbmsgQXJjMkQjT1BFTn0sIAotICAgICAqIHtAbGluayBBcmMyRCNDSE9SRH0sIG9yIHtAbGluayBBcmMyRCNQSUV9LgorICAgICAqIFNldHMgdGhlIGFyYyB0eXBlLCBlaXRoZXIge0BsaW5rIEFyYzJEI09QRU59LCB7QGxpbmsgQXJjMkQjQ0hPUkR9LCBvcgorICAgICAqIHtAbGluayBBcmMyRCNQSUV9LgogICAgICAqIAotICAgICAqIEBwYXJhbSB0eXBlIHRoZSBuZXcgYXJjIHR5cGUuCisgICAgICogQHBhcmFtIHR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgYXJjIHR5cGUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0QXJjVHlwZShpbnQgdHlwZSkgewogICAgICAgICBpZiAodHlwZSAhPSBPUEVOICYmIHR5cGUgIT0gQ0hPUkQgJiYgdHlwZSAhPSBQSUUpIHsKQEAgLTY4Miw5ICs3OTEsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyBQb2ludDJEIGdldFN0YXJ0UG9pbnQoKSB7CiAgICAgICAgIGRvdWJsZSBhID0gTWF0aC50b1JhZGlhbnMoZ2V0QW5nbGVTdGFydCgpKTsKLSAgICAgICAgcmV0dXJuIG5ldyBQb2ludDJELkRvdWJsZSgKLSAgICAgICAgICAgICAgICBnZXRYKCkgKyAoMS4wICsgTWF0aC5jb3MoYSkpICogZ2V0V2lkdGgoKSAvIDIuMCwKLSAgICAgICAgICAgICAgICBnZXRZKCkgKyAoMS4wIC0gTWF0aC5zaW4oYSkpICogZ2V0SGVpZ2h0KCkgLyAyLjApOworICAgICAgICByZXR1cm4gbmV3IFBvaW50MkQuRG91YmxlKGdldFgoKSArICgxLjAgKyBNYXRoLmNvcyhhKSkgKiBnZXRXaWR0aCgpIC8gMi4wLCBnZXRZKCkKKyAgICAgICAgICAgICAgICArICgxLjAgLSBNYXRoLnNpbihhKSkgKiBnZXRIZWlnaHQoKSAvIDIuMCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC02OTQsOSArODAyLDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgUG9pbnQyRCBnZXRFbmRQb2ludCgpIHsKICAgICAgICAgZG91YmxlIGEgPSBNYXRoLnRvUmFkaWFucyhnZXRBbmdsZVN0YXJ0KCkgKyBnZXRBbmdsZUV4dGVudCgpKTsKLSAgICAgICAgcmV0dXJuIG5ldyBQb2ludDJELkRvdWJsZSgKLSAgICAgICAgICAgICAgICBnZXRYKCkgKyAoMS4wICsgTWF0aC5jb3MoYSkpICogZ2V0V2lkdGgoKSAvIDIuMCwKLSAgICAgICAgICAgICAgICBnZXRZKCkgKyAoMS4wIC0gTWF0aC5zaW4oYSkpICogZ2V0SGVpZ2h0KCkgLyAyLjApOworICAgICAgICByZXR1cm4gbmV3IFBvaW50MkQuRG91YmxlKGdldFgoKSArICgxLjAgKyBNYXRoLmNvcyhhKSkgKiBnZXRXaWR0aCgpIC8gMi4wLCBnZXRZKCkKKyAgICAgICAgICAgICAgICArICgxLjAgLSBNYXRoLnNpbihhKSkgKiBnZXRIZWlnaHQoKSAvIDIuMCk7CiAgICAgfQogCiAgICAgcHVibGljIFJlY3RhbmdsZTJEIGdldEJvdW5kczJEKCkgewpAQCAtNzEyLDggKzgxOSw4IEBACiAgICAgICAgIFBvaW50MkQgcDIgPSBnZXRFbmRQb2ludCgpOwogCiAgICAgICAgIGRvdWJsZSBieDEgPSBjb250YWluc0FuZ2xlKDE4MC4wKSA/IHJ4MSA6IE1hdGgubWluKHAxLmdldFgoKSwgcDIuZ2V0WCgpKTsKLSAgICAgICAgZG91YmxlIGJ5MSA9IGNvbnRhaW5zQW5nbGUoOTAuMCkgID8gcnkxIDogTWF0aC5taW4ocDEuZ2V0WSgpLCBwMi5nZXRZKCkpOwotICAgICAgICBkb3VibGUgYngyID0gY29udGFpbnNBbmdsZSgwLjApICAgPyByeDIgOiBNYXRoLm1heChwMS5nZXRYKCksIHAyLmdldFgoKSk7CisgICAgICAgIGRvdWJsZSBieTEgPSBjb250YWluc0FuZ2xlKDkwLjApID8gcnkxIDogTWF0aC5taW4ocDEuZ2V0WSgpLCBwMi5nZXRZKCkpOworICAgICAgICBkb3VibGUgYngyID0gY29udGFpbnNBbmdsZSgwLjApID8gcngyIDogTWF0aC5tYXgocDEuZ2V0WCgpLCBwMi5nZXRYKCkpOwogICAgICAgICBkb3VibGUgYnkyID0gY29udGFpbnNBbmdsZSgyNzAuMCkgPyByeTIgOiBNYXRoLm1heChwMS5nZXRZKCksIHAyLmdldFkoKSk7CiAKICAgICAgICAgaWYgKHR5cGUgPT0gUElFKSB7CkBAIC03MzUsMTIgKzg0MiwxNyBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGRhdGEgdGhhdCBkZWZpbmVzIHRoZSBhcmMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHBvaW50IHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSBzaXplIHRoZSBzaXplIG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBhbmdsZSBvZiB0aGUgYXJjIGluIGRlZ3JlZXMuCi0gICAgICogQHBhcmFtIGV4dGVudCB0aGUgYW5nbGUgd2l0ZHRoIG9mIHRoZSBhcmMgaW4gZGVncmVlcy4KLSAgICAgKiBAcGFyYW0gdHlwZSB0aGUgY2xvc3VyZSB0eXBlLCBlaXRoZXIge0BsaW5rIEFyYzJEI09QRU59LCAKLSAgICAgKiB7QGxpbmsgQXJjMkQjQ0hPUkR9LCBvciB7QGxpbmsgQXJjMkQjUElFfS4KKyAgICAgKiBAcGFyYW0gcG9pbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgc2l6ZSBvZiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSBzdGFydAorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IGFuZ2xlIG9mIHRoZSBhcmMgaW4gZGVncmVlcy4KKyAgICAgKiBAcGFyYW0gZXh0ZW50CisgICAgICogICAgICAgICAgICB0aGUgYW5nbGUgd2lkdGggb2YgdGhlIGFyYyBpbiBkZWdyZWVzLgorICAgICAqIEBwYXJhbSB0eXBlCisgICAgICogICAgICAgICAgICB0aGUgY2xvc3VyZSB0eXBlLCBlaXRoZXIge0BsaW5rIEFyYzJEI09QRU59LAorICAgICAqICAgICAgICAgICAge0BsaW5rIEFyYzJEI0NIT1JEfSwgb3Ige0BsaW5rIEFyYzJEI1BJRX0uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0QXJjKFBvaW50MkQgcG9pbnQsIERpbWVuc2lvbjJEIHNpemUsIGRvdWJsZSBzdGFydCwgZG91YmxlIGV4dGVudCwgaW50IHR5cGUpIHsKICAgICAgICAgc2V0QXJjKHBvaW50LmdldFgoKSwgcG9pbnQuZ2V0WSgpLCBzaXplLmdldFdpZHRoKCksIHNpemUuZ2V0SGVpZ2h0KCksIHN0YXJ0LCBleHRlbnQsIHR5cGUpOwpAQCAtNzQ5LDExICs4NjEsMTUgQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBkYXRhIHRoYXQgZGVmaW5lcyB0aGUgYXJjLgogICAgICAqIAotICAgICAqIEBwYXJhbSByZWN0IHRoZSBhcmMncyBib3VuZGluZyByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBhbmdsZSBvZiB0aGUgYXJjIGluIGRlZ3JlZXMuCi0gICAgICogQHBhcmFtIGV4dGVudCB0aGUgYW5nbGUgd2l0ZHRoIG9mIHRoZSBhcmMgaW4gZGVncmVlcy4KLSAgICAgKiBAcGFyYW0gdHlwZSB0aGUgY2xvc3VyZSB0eXBlLCBlaXRoZXIge0BsaW5rIEFyYzJEI09QRU59LCAKLSAgICAgKiB7QGxpbmsgQXJjMkQjQ0hPUkR9LCBvciB7QGxpbmsgQXJjMkQjUElFfS4KKyAgICAgKiBAcGFyYW0gcmVjdAorICAgICAqICAgICAgICAgICAgdGhlIGFyYydzIGJvdW5kaW5nIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gc3RhcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBhbmdsZSBvZiB0aGUgYXJjIGluIGRlZ3JlZXMuCisgICAgICogQHBhcmFtIGV4dGVudAorICAgICAqICAgICAgICAgICAgdGhlIGFuZ2xlIHdpZHRoIG9mIHRoZSBhcmMgaW4gZGVncmVlcy4KKyAgICAgKiBAcGFyYW0gdHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGNsb3N1cmUgdHlwZSwgZWl0aGVyIHtAbGluayBBcmMyRCNPUEVOfSwKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBBcmMyRCNDSE9SRH0sIG9yIHtAbGluayBBcmMyRCNQSUV9LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEFyYyhSZWN0YW5nbGUyRCByZWN0LCBkb3VibGUgc3RhcnQsIGRvdWJsZSBleHRlbnQsIGludCB0eXBlKSB7CiAgICAgICAgIHNldEFyYyhyZWN0LmdldFgoKSwgcmVjdC5nZXRZKCksIHJlY3QuZ2V0V2lkdGgoKSwgcmVjdC5nZXRIZWlnaHQoKSwgc3RhcnQsIGV4dGVudCwgdHlwZSk7CkBAIC03NjIsNDcgKzg3OCw2MCBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGRhdGEgdGhhdCBkZWZpbmVzIHRoZSBhcmMgYnkgY29weWluZyBpdCBmcm9tIGFub3RoZXIgQXJjMkQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGFyYyB0aGUgYXJjIHdob3NlIGRhdGEgaXMgY29waWVkIGludG8gdGhpcyBhcmMuCisgICAgICogQHBhcmFtIGFyYworICAgICAqICAgICAgICAgICAgdGhlIGFyYyB3aG9zZSBkYXRhIGlzIGNvcGllZCBpbnRvIHRoaXMgYXJjLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEFyYyhBcmMyRCBhcmMpIHsKLSAgICAgICAgc2V0QXJjKGFyYy5nZXRYKCksIGFyYy5nZXRZKCksIGFyYy5nZXRXaWR0aCgpLCBhcmMuZ2V0SGVpZ2h0KCksIGFyYwotICAgICAgICAgICAgICAgIC5nZXRBbmdsZVN0YXJ0KCksIGFyYy5nZXRBbmdsZUV4dGVudCgpLCBhcmMuZ2V0QXJjVHlwZSgpKTsKKyAgICAgICAgc2V0QXJjKGFyYy5nZXRYKCksIGFyYy5nZXRZKCksIGFyYy5nZXRXaWR0aCgpLCBhcmMuZ2V0SGVpZ2h0KCksIGFyYy5nZXRBbmdsZVN0YXJ0KCksIGFyYworICAgICAgICAgICAgICAgIC5nZXRBbmdsZUV4dGVudCgpLCBhcmMuZ2V0QXJjVHlwZSgpKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBkYXRhIGZvciBhIGNpcmN1bGFyIGFyYyBieSBnaXZpbmcgaXRzIGNlbnRlciBhbmQgcmFkaXVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGNlbnRlciBvZiB0aGUgY2lyY2xlLgotICAgICAqIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGNlbnRlciBvZiB0aGUgY2lyY2xlLgotICAgICAqIEBwYXJhbSByYWRpdXMgdGhlIHJhZGl1cyBvZiB0aGUgY2lyY2xlLgotICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgYW5nbGUgb2YgdGhlIGFyYyBpbiBkZWdyZWVzLgotICAgICAqIEBwYXJhbSBleHRlbnQgdGhlIGFuZ2xlIHdpdGR0aCBvZiB0aGUgYXJjIGluIGRlZ3JlZXMuCi0gICAgICogQHBhcmFtIHR5cGUgdGhlIGNsb3N1cmUgdHlwZSwgZWl0aGVyIHtAbGluayBBcmMyRCNPUEVOfSwgCi0gICAgICoge0BsaW5rIEFyYzJEI0NIT1JEfSwgb3Ige0BsaW5rIEFyYzJEI1BJRX0uCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGNlbnRlciBvZiB0aGUgY2lyY2xlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGNpcmNsZS4KKyAgICAgKiBAcGFyYW0gcmFkaXVzCisgICAgICogICAgICAgICAgICB0aGUgcmFkaXVzIG9mIHRoZSBjaXJjbGUuCisgICAgICogQHBhcmFtIHN0YXJ0CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgYW5nbGUgb2YgdGhlIGFyYyBpbiBkZWdyZWVzLgorICAgICAqIEBwYXJhbSBleHRlbnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbmdsZSB3aWR0aCBvZiB0aGUgYXJjIGluIGRlZ3JlZXMuCisgICAgICogQHBhcmFtIHR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBjbG9zdXJlIHR5cGUsIGVpdGhlciB7QGxpbmsgQXJjMkQjT1BFTn0sCisgICAgICogICAgICAgICAgICB7QGxpbmsgQXJjMkQjQ0hPUkR9LCBvciB7QGxpbmsgQXJjMkQjUElFfS4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBcmNCeUNlbnRlcihkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSByYWRpdXMsIGRvdWJsZSBzdGFydCwgZG91YmxlIGV4dGVudCwgaW50IHR5cGUpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRBcmNCeUNlbnRlcihkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSByYWRpdXMsIGRvdWJsZSBzdGFydCwgZG91YmxlIGV4dGVudCwKKyAgICAgICAgICAgIGludCB0eXBlKSB7CiAgICAgICAgIHNldEFyYyh4IC0gcmFkaXVzLCB5IC0gcmFkaXVzLCByYWRpdXMgKiAyLjAsIHJhZGl1cyAqIDIuMCwgc3RhcnQsIGV4dGVudCwgdHlwZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgYXJjIGRhdGEgZm9yIGEgY2lyY3VsYXIgYXJjIGJhc2VkIG9uIHR3byB0YW5nZW50IGxpbmVzCi0gICAgICogYW5kIHRoZSByYWRpdXMuIFRoZSB0d28gdGFuZ2VudCBsaW5lcyBhcmUgdGhlIGxpbmVzIGZyb20gcDEgCi0gICAgICogdG8gcDIgYW5kIGZyb20gcDIgdG8gcDMsIHdoaWNoIGRldGVybWluZSBhIHVuaXF1ZSBjaXJjbGUgCi0gICAgICogd2l0aCB0aGUgZ2l2ZW4gcmFkaXVzLiBUaGUgc3RhcnQgYW5kIGVuZCBwb2ludHMgb2YgdGhlIGFyYyAKLSAgICAgKiBhcmUgdGhlIHBvaW50cyB3aGVyZSB0aGUgY2lyY2xlIHRvdWNoZXMgdGhlIHR3byBsaW5lcywgYW5kIAotICAgICAqIHRoZSBhcmMgaXRzZWxmIGlzIHRoZSBzaG9ydGVyIG9mIHRoZSB0d28gY2lyY2xlIHNlZ21lbnRzIAotICAgICAqIGRldGVybWluZWQgYnkgdGhlIHR3byBwb2ludHMgKGluIG90aGVyIHdvcmRzLCBpdCBpcyB0aGUgCi0gICAgICogcGllY2Ugb2YgdGhlIGNpcmNsZSB0aGF0IGlzIGNsb3NlciB0byB0aGUgbGluZXMnIGludGVyc2VjdGlvbiAKLSAgICAgKiBwb2ludCBwMiBhbmQgZm9ybXMgYSBjb25jYXZlIHNoYXBlIHdpdGggdGhlIHNlZ21lbnRzIGZyb20gcDEgdG8gcDIgCi0gICAgICogYW5kIGZyb20gcDIgdG8gcDMpLgorICAgICAqIFNldHMgdGhlIGFyYyBkYXRhIGZvciBhIGNpcmN1bGFyIGFyYyBiYXNlZCBvbiB0d28gdGFuZ2VudCBsaW5lcyBhbmQgdGhlCisgICAgICogcmFkaXVzLiBUaGUgdHdvIHRhbmdlbnQgbGluZXMgYXJlIHRoZSBsaW5lcyBmcm9tIHAxIHRvIHAyIGFuZCBmcm9tIHAyIHRvCisgICAgICogcDMsIHdoaWNoIGRldGVybWluZSBhIHVuaXF1ZSBjaXJjbGUgd2l0aCB0aGUgZ2l2ZW4gcmFkaXVzLiBUaGUgc3RhcnQgYW5kCisgICAgICogZW5kIHBvaW50cyBvZiB0aGUgYXJjIGFyZSB0aGUgcG9pbnRzIHdoZXJlIHRoZSBjaXJjbGUgdG91Y2hlcyB0aGUgdHdvCisgICAgICogbGluZXMsIGFuZCB0aGUgYXJjIGl0c2VsZiBpcyB0aGUgc2hvcnRlciBvZiB0aGUgdHdvIGNpcmNsZSBzZWdtZW50cworICAgICAqIGRldGVybWluZWQgYnkgdGhlIHR3byBwb2ludHMgKGluIG90aGVyIHdvcmRzLCBpdCBpcyB0aGUgcGllY2Ugb2YgdGhlCisgICAgICogY2lyY2xlIHRoYXQgaXMgY2xvc2VyIHRvIHRoZSBsaW5lcycgaW50ZXJzZWN0aW9uIHBvaW50IHAyIGFuZCBmb3JtcyBhCisgICAgICogY29uY2F2ZSBzaGFwZSB3aXRoIHRoZSBzZWdtZW50cyBmcm9tIHAxIHRvIHAyIGFuZCBmcm9tIHAyIHRvIHAzKS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcDEgYSBwb2ludCB3aGljaCBkZXRlcm1pbmVzIG9uZSBvZiB0aGUgdHdvIHRhbmdldCBsaW5lcyAod2l0aCBwMikuCi0gICAgICogQHBhcmFtIHAyIHRoZSBwb2ludCBvZiBpbnRlcnNlY3Rpb24gb2YgdGhlIHR3byB0YW5nZW50IGxpbmVzLgotICAgICAqIEBwYXJhbSBwMyBhIHBvaW50IHdoaWNoIGRldGVybWluZXMgb25lIG9mIHRoZSB0d28gdGFuZ2V0IGxpbmVzICh3aXRoIHAyKS4KLSAgICAgKiBAcGFyYW0gcmFkaXVzIHRoZSByYWRpdXMgb2YgdGhlIGNpcmN1bGFyIGFyYy4KKyAgICAgKiBAcGFyYW0gcDEKKyAgICAgKiAgICAgICAgICAgIGEgcG9pbnQgd2hpY2ggZGV0ZXJtaW5lcyBvbmUgb2YgdGhlIHR3byB0YW5nZW50IGxpbmVzICh3aXRoCisgICAgICogICAgICAgICAgICBwMikuCisgICAgICogQHBhcmFtIHAyCisgICAgICogICAgICAgICAgICB0aGUgcG9pbnQgb2YgaW50ZXJzZWN0aW9uIG9mIHRoZSB0d28gdGFuZ2VudCBsaW5lcy4KKyAgICAgKiBAcGFyYW0gcDMKKyAgICAgKiAgICAgICAgICAgIGEgcG9pbnQgd2hpY2ggZGV0ZXJtaW5lcyBvbmUgb2YgdGhlIHR3byB0YW5nZW50IGxpbmVzICh3aXRoCisgICAgICogICAgICAgICAgICBwMikuCisgICAgICogQHBhcmFtIHJhZGl1cworICAgICAqICAgICAgICAgICAgdGhlIHJhZGl1cyBvZiB0aGUgY2lyY3VsYXIgYXJjLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEFyY0J5VGFuZ2VudChQb2ludDJEIHAxLCBQb2ludDJEIHAyLCBQb2ludDJEIHAzLCBkb3VibGUgcmFkaXVzKSB7Ci0gICAgICAgIC8vIFVzZWQgc2ltcGxlIGdlb21ldHJpYyBjYWxjdWxhdGlvbnMgb2YgYXJjIGNlbnRlciwgcmFkaXVzIGFuZCBhbmdsZXMgYnkgdGFuZ2VudHMKKyAgICAgICAgLy8gVXNlZCBzaW1wbGUgZ2VvbWV0cmljIGNhbGN1bGF0aW9ucyBvZiBhcmMgY2VudGVyLCByYWRpdXMgYW5kIGFuZ2xlcworICAgICAgICAvLyBieSB0YW5nZW50cwogICAgICAgICBkb3VibGUgYTEgPSAtTWF0aC5hdGFuMihwMS5nZXRZKCkgLSBwMi5nZXRZKCksIHAxLmdldFgoKSAtIHAyLmdldFgoKSk7CiAgICAgICAgIGRvdWJsZSBhMiA9IC1NYXRoLmF0YW4yKHAzLmdldFkoKSAtIHAyLmdldFkoKSwgcDMuZ2V0WCgpIC0gcDIuZ2V0WCgpKTsKICAgICAgICAgZG91YmxlIGFtID0gKGExICsgYTIpIC8gMi4wOwpAQCAtODIxLDEwICs5NTAsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIGEgbmV3IHN0YXJ0IGFuZ2xlIHRvIGJlIHRoZSBhbmdsZSBnaXZlbiBieSB0aGUgdGhlIHZlY3RvciAKLSAgICAgKiBmcm9tIHRoZSBjdXJyZW50IGNlbnRlciBwb2ludCB0byB0aGUgc3BlY2lmaWVkIHBvaW50LgorICAgICAqIFNldHMgYSBuZXcgc3RhcnQgYW5nbGUgdG8gYmUgdGhlIGFuZ2xlIGdpdmVuIGJ5IHRoZSB0aGUgdmVjdG9yIGZyb20gdGhlCisgICAgICogY3VycmVudCBjZW50ZXIgcG9pbnQgdG8gdGhlIHNwZWNpZmllZCBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcG9pbnQgdGhlIHBvaW50IHRoYXQgZGV0ZXJtaW5lcyB0aGUgbmV3IHN0YXJ0IGFuZ2xlLgorICAgICAqIEBwYXJhbSBwb2ludAorICAgICAqICAgICAgICAgICAgdGhlIHBvaW50IHRoYXQgZGV0ZXJtaW5lcyB0aGUgbmV3IHN0YXJ0IGFuZ2xlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEFuZ2xlU3RhcnQoUG9pbnQyRCBwb2ludCkgewogICAgICAgICBkb3VibGUgYW5nbGUgPSBNYXRoLmF0YW4yKHBvaW50LmdldFkoKSAtIGdldENlbnRlclkoKSwgcG9pbnQuZ2V0WCgpIC0gZ2V0Q2VudGVyWCgpKTsKQEAgLTgzMiwyMCArOTYyLDIzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgYW5nbGVzIGluIHRlcm1zIG9mIHZlY3RvcnMgZnJvbSB0aGUgY3VycmVudCBhcmMgY2VudGVyIAotICAgICAqIHRvIHRoZSBwb2ludHMgKHgxLCB5MSkgYW5kICh4MiwgeTIpLiBUaGUgc3RhcnQgYW5nbGUgaXMgZ2l2ZW4gCi0gICAgICogYnkgdGhlIHZlY3RvciBmcm9tIHRoZSBjdXJyZW50IGNlbnRlciB0byB0aGUgcG9pbnQgKHgxLCB5MSkgYW5kCi0gICAgICogdGhlIGVuZCBhbmdsZSBpcyBnaXZlbiBieSB0aGUgdmVjdG9yIGZyb20gdGhlIGNlbnRlciB0byB0aGUgcG9pbnQKLSAgICAgKiAoeDIsIHkyKS4KKyAgICAgKiBTZXRzIHRoZSBhbmdsZXMgaW4gdGVybXMgb2YgdmVjdG9ycyBmcm9tIHRoZSBjdXJyZW50IGFyYyBjZW50ZXIgdG8gdGhlCisgICAgICogcG9pbnRzICh4MSwgeTEpIGFuZCAoeDIsIHkyKS4gVGhlIHN0YXJ0IGFuZ2xlIGlzIGdpdmVuIGJ5IHRoZSB2ZWN0b3IgZnJvbQorICAgICAqIHRoZSBjdXJyZW50IGNlbnRlciB0byB0aGUgcG9pbnQgKHgxLCB5MSkgYW5kIHRoZSBlbmQgYW5nbGUgaXMgZ2l2ZW4gYnkKKyAgICAgKiB0aGUgdmVjdG9yIGZyb20gdGhlIGNlbnRlciB0byB0aGUgcG9pbnQgKHgyLCB5MikuCiAgICAgICogCi0gICAgICogQHBhcmFtIHgxIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50IHdob3NlIHZlY3RvciBmcm9tIHRoZSBjZW50ZXIKLSAgICAgKiBwb2ludCBkZXRlcm1pbmVzIHRoZSBuZXcgc3RhcnQgYW5nbGUgb2YgdGhlIGFyYy4KLSAgICAgKiBAcGFyYW0geTEgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgd2hvc2UgdmVjdG9yIGZyb20gdGhlIGNlbnRlcgotICAgICAqIHBvaW50IGRldGVybWluZXMgdGhlIG5ldyBzdGFydCBhbmdsZSBvZiB0aGUgYXJjLgotICAgICAqIEBwYXJhbSB4MiB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBwb2ludCB3aG9zZSB2ZWN0b3IgZnJvbSB0aGUgY2VudGVyCi0gICAgICogcG9pbnQgZGV0ZXJtaW5lcyB0aGUgbmV3IGVuZCBhbmdsZSBvZiB0aGUgYXJjLgotICAgICAqIEBwYXJhbSB5MiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBwb2ludCB3aG9zZSB2ZWN0b3IgZnJvbSB0aGUgY2VudGVyCi0gICAgICogcG9pbnQgZGV0ZXJtaW5lcyB0aGUgbmV3IGVuZCBhbmdsZSBvZiB0aGUgYXJjLgorICAgICAqIEBwYXJhbSB4MQorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgd2hvc2UgdmVjdG9yIGZyb20gdGhlIGNlbnRlcgorICAgICAqICAgICAgICAgICAgcG9pbnQgZGV0ZXJtaW5lcyB0aGUgbmV3IHN0YXJ0IGFuZ2xlIG9mIHRoZSBhcmMuCisgICAgICogQHBhcmFtIHkxCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBwb2ludCB3aG9zZSB2ZWN0b3IgZnJvbSB0aGUgY2VudGVyCisgICAgICogICAgICAgICAgICBwb2ludCBkZXRlcm1pbmVzIHRoZSBuZXcgc3RhcnQgYW5nbGUgb2YgdGhlIGFyYy4KKyAgICAgKiBAcGFyYW0geDIKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50IHdob3NlIHZlY3RvciBmcm9tIHRoZSBjZW50ZXIKKyAgICAgKiAgICAgICAgICAgIHBvaW50IGRldGVybWluZXMgdGhlIG5ldyBlbmQgYW5nbGUgb2YgdGhlIGFyYy4KKyAgICAgKiBAcGFyYW0geTIKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50IHdob3NlIHZlY3RvciBmcm9tIHRoZSBjZW50ZXIKKyAgICAgKiAgICAgICAgICAgIHBvaW50IGRldGVybWluZXMgdGhlIG5ldyBlbmQgYW5nbGUgb2YgdGhlIGFyYy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRBbmdsZXMoZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSB4MiwgZG91YmxlIHkyKSB7CiAgICAgICAgIGRvdWJsZSBjeCA9IGdldENlbnRlclgoKTsKQEAgLTg2MSwyOSArOTk0LDMwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgYW5nbGVzIGluIHRlcm1zIG9mIHZlY3RvcnMgZnJvbSB0aGUgY3VycmVudCBhcmMgY2VudGVyIAotICAgICAqIHRvIHRoZSBwb2ludHMgcDEgYW5kIHAyLiBUaGUgc3RhcnQgYW5nbGUgaXMgZ2l2ZW4gCi0gICAgICogYnkgdGhlIHZlY3RvciBmcm9tIHRoZSBjdXJyZW50IGNlbnRlciB0byB0aGUgcG9pbnQgcDEgYW5kCi0gICAgICogdGhlIGVuZCBhbmdsZSBpcyBnaXZlbiBieSB0aGUgdmVjdG9yIGZyb20gdGhlIGNlbnRlciB0byB0aGUgcG9pbnQKLSAgICAgKiBwMi4KKyAgICAgKiBTZXRzIHRoZSBhbmdsZXMgaW4gdGVybXMgb2YgdmVjdG9ycyBmcm9tIHRoZSBjdXJyZW50IGFyYyBjZW50ZXIgdG8gdGhlCisgICAgICogcG9pbnRzIHAxIGFuZCBwMi4gVGhlIHN0YXJ0IGFuZ2xlIGlzIGdpdmVuIGJ5IHRoZSB2ZWN0b3IgZnJvbSB0aGUgY3VycmVudAorICAgICAqIGNlbnRlciB0byB0aGUgcG9pbnQgcDEgYW5kIHRoZSBlbmQgYW5nbGUgaXMgZ2l2ZW4gYnkgdGhlIHZlY3RvciBmcm9tIHRoZQorICAgICAqIGNlbnRlciB0byB0aGUgcG9pbnQgcDIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHAxIHRoZSBwb2ludCB3aG9zZSB2ZWN0b3IgZnJvbSB0aGUgY2VudGVyCi0gICAgICogcG9pbnQgZGV0ZXJtaW5lcyB0aGUgbmV3IHN0YXJ0IGFuZ2xlIG9mIHRoZSBhcmMuCi0gICAgICogQHBhcmFtIHAyIHRoZSBwb2ludCB3aG9zZSB2ZWN0b3IgZnJvbSB0aGUgY2VudGVyCi0gICAgICogcG9pbnQgZGV0ZXJtaW5lcyB0aGUgbmV3IGVuZCBhbmdsZSBvZiB0aGUgYXJjLgorICAgICAqIEBwYXJhbSBwMQorICAgICAqICAgICAgICAgICAgdGhlIHBvaW50IHdob3NlIHZlY3RvciBmcm9tIHRoZSBjZW50ZXIgcG9pbnQgZGV0ZXJtaW5lcyB0aGUKKyAgICAgKiAgICAgICAgICAgIG5ldyBzdGFydCBhbmdsZSBvZiB0aGUgYXJjLgorICAgICAqIEBwYXJhbSBwMgorICAgICAqICAgICAgICAgICAgdGhlIHBvaW50IHdob3NlIHZlY3RvciBmcm9tIHRoZSBjZW50ZXIgcG9pbnQgZGV0ZXJtaW5lcyB0aGUKKyAgICAgKiAgICAgICAgICAgIG5ldyBlbmQgYW5nbGUgb2YgdGhlIGFyYy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRBbmdsZXMoUG9pbnQyRCBwMSwgUG9pbnQyRCBwMikgewogICAgICAgICBzZXRBbmdsZXMocDEuZ2V0WCgpLCBwMS5nZXRZKCksIHAyLmdldFgoKSwgcDIuZ2V0WSgpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBOb3JtYWxpemVzIHRoZSBhbmdsZSBieSByZW1vdmluZyBleHRyYSB3aW5kaW5nIChwYXN0IDM2MCBkZWdyZWVzKQotICAgICAqIGFuZCBwbGFjaW5nIGl0IGluIHRoZSBwb3NpdGl2ZSBkZWdyZWUgcmFuZ2UuCisgICAgICogTm9ybWFsaXplcyB0aGUgYW5nbGUgYnkgcmVtb3ZpbmcgZXh0cmEgd2luZGluZyAocGFzdCAzNjAgZGVncmVlcykgYW5kCisgICAgICogcGxhY2luZyBpdCBpbiB0aGUgcG9zaXRpdmUgZGVncmVlIHJhbmdlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBhbmdsZSAtIHRoZSBzb3VyY2UgYW5nbGUgaW4gZGVncmVlcwotICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gYW5nbGUgYmV0d2VlbiAwIGFuZCAzNjAgZGVncmVlcyB3aGljaCBjb3JyZXNwb25kcwotICAgICAqIHRvIHRoZSBzYW1lIGRpcmVjdGlvbiB2ZWN0b3IgYXMgdGhlIHNvdXJjZSBhbmdsZS4KKyAgICAgKiBAcGFyYW0gYW5nbGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgYW5nbGUgaW4gZGVncmVlcy4KKyAgICAgKiBAcmV0dXJuIGFuIGFuZ2xlIGJldHdlZW4gMCBhbmQgMzYwIGRlZ3JlZXMgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIHNhbWUKKyAgICAgKiAgICAgICAgIGRpcmVjdGlvbiB2ZWN0b3IgYXMgdGhlIHNvdXJjZSBhbmdsZS4KICAgICAgKi8KICAgICBkb3VibGUgZ2V0Tm9ybUFuZ2xlKGRvdWJsZSBhbmdsZSkgewogICAgICAgICBkb3VibGUgbiA9IE1hdGguZmxvb3IoYW5nbGUgLyAzNjAuMCk7CkBAIC04OTMsMTAgKzEwMjcsMTAgQEAKICAgICAvKioKICAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdpdmVuIGFuZ2xlIGlzIGNvbnRhaW5lZCBpbiB0aGUgc3BhbiBvZiB0aGUgYXJjLgogICAgICAqIAotICAgICAqIEBwYXJhbSBhbmdsZSB0aGUgYW5nbGUgdG8gdGVzdCBpbiBkZWdyZWVzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIGdpdmVuIGFuZ2xlIGlzIGJldHdlZW4gdGhlIHN0YXJ0IGFuZ2xlIGFuZCAKLSAgICAgKiB0aGUgZW5kIGFuZ2xlIG9mIHRoZSBhcmMuCisgICAgICogQHBhcmFtIGFuZ2xlCisgICAgICogICAgICAgICAgICB0aGUgYW5nbGUgdG8gdGVzdCBpbiBkZWdyZWVzLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIGdpdmVuIGFuZ2xlIGlzIGJldHdlZW4gdGhlIHN0YXJ0IGFuZ2xlIGFuZCB0aGUgZW5kCisgICAgICogICAgICAgICBhbmdsZSBvZiB0aGUgYXJjLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQW5nbGUoZG91YmxlIGFuZ2xlKSB7CiAgICAgICAgIGRvdWJsZSBleHRlbnQgPSBnZXRBbmdsZUV4dGVudCgpOwpAQCAtOTEyLDggKzEwNDYsNyBAQAogICAgICAgICBpZiAoYTIgPCAwLjApIHsKICAgICAgICAgICAgIHJldHVybiBhbmdsZSA+PSBhMiArIDM2MC4wIHx8IGFuZ2xlIDw9IGExOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBleHRlbnQgPiAwLjAgPyBhMSA8PSBhbmdsZSAmJiBhbmdsZSA8PSBhMiA6IGEyIDw9IGFuZ2xlCi0gICAgICAgICAgICAgICAgJiYgYW5nbGUgPD0gYTE7CisgICAgICAgIHJldHVybiBleHRlbnQgPiAwLjAgPyBhMSA8PSBhbmdsZSAmJiBhbmdsZSA8PSBhMiA6IGEyIDw9IGFuZ2xlICYmIGFuZ2xlIDw9IGExOwogICAgIH0KIAogICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGRvdWJsZSBweCwgZG91YmxlIHB5KSB7CkBAIC05MzEsOCArMTA2NCw3IEBACiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCi0gICAgICAgIGJvb2xlYW4gY29udGFpbnNBbmdsZSA9IGNvbnRhaW5zQW5nbGUoTWF0aC50b0RlZ3JlZXMoLU1hdGgKLSAgICAgICAgICAgICAgICAuYXRhbjIobnksIG54KSkpOworICAgICAgICBib29sZWFuIGNvbnRhaW5zQW5nbGUgPSBjb250YWluc0FuZ2xlKE1hdGgudG9EZWdyZWVzKC1NYXRoLmF0YW4yKG55LCBueCkpKTsKICAgICAgICAgaWYgKHR5cGUgPT0gUElFKSB7CiAgICAgICAgICAgICByZXR1cm4gY29udGFpbnNBbmdsZTsKICAgICAgICAgfQpAQCAtOTQzLDE0ICsxMDc1LDEzIEBACiAgICAgICAgIExpbmUyRCBsID0gbmV3IExpbmUyRC5Eb3VibGUoZ2V0U3RhcnRQb2ludCgpLCBnZXRFbmRQb2ludCgpKTsKICAgICAgICAgaW50IGNjdzEgPSBsLnJlbGF0aXZlQ0NXKHB4LCBweSk7CiAgICAgICAgIGludCBjY3cyID0gbC5yZWxhdGl2ZUNDVyhnZXRDZW50ZXJYKCksIGdldENlbnRlclkoKSk7Ci0gICAgICAgIHJldHVybiBjY3cxID09IDAgfHwgY2N3MiA9PSAwCi0gICAgICAgICAgICAgICAgfHwgKChjY3cxICsgY2N3MikgPT0gMCBeIGFic0V4dGVudCA+IDE4MC4wKTsKKyAgICAgICAgcmV0dXJuIGNjdzEgPT0gMCB8fCBjY3cyID09IDAgfHwgKChjY3cxICsgY2N3MikgPT0gMCBeIGFic0V4dGVudCA+IDE4MC4wKTsKICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhkb3VibGUgcngsIGRvdWJsZSByeSwgZG91YmxlIHJ3LCBkb3VibGUgcmgpIHsKIAotICAgICAgICBpZiAoIShjb250YWlucyhyeCwgcnkpICYmIGNvbnRhaW5zKHJ4ICsgcncsIHJ5KQotICAgICAgICAgICAgICAgICYmIGNvbnRhaW5zKHJ4ICsgcncsIHJ5ICsgcmgpICYmIGNvbnRhaW5zKHJ4LCByeSArIHJoKSkpIHsKKyAgICAgICAgaWYgKCEoY29udGFpbnMocngsIHJ5KSAmJiBjb250YWlucyhyeCArIHJ3LCByeSkgJiYgY29udGFpbnMocnggKyBydywgcnkgKyByaCkgJiYgY29udGFpbnMoCisgICAgICAgICAgICAgICAgcngsIHJ5ICsgcmgpKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKQEAgLTEwMDMsOSArMTEzNCw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAodHlwZSA9PSBQSUUpIHsKLSAgICAgICAgICAgIGlmIChyLmludGVyc2VjdHNMaW5lKHAxLmdldFgoKSwgcDEuZ2V0WSgpLCBjeCwgY3kpIHx8Ci0gICAgICAgICAgICAgICAgci5pbnRlcnNlY3RzTGluZShwMi5nZXRYKCksIHAyLmdldFkoKSwgY3gsIGN5KSkKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChyLmludGVyc2VjdHNMaW5lKHAxLmdldFgoKSwgcDEuZ2V0WSgpLCBjeCwgY3kpCisgICAgICAgICAgICAgICAgICAgIHx8IHIuaW50ZXJzZWN0c0xpbmUocDIuZ2V0WCgpLCBwMi5nZXRZKCksIGN4LCBjeSkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKQEAgLTEwMjUsNCArMTE1NSwzIEBACiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9nZW9tL0FyZWEuamF2YSBiL2F3dC9qYXZhL2F3dC9nZW9tL0FyZWEuamF2YQppbmRleCBiYzI3ZDRlLi5lNjYxOWUzIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZ2VvbS9BcmVhLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2dlb20vQXJlYS5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIERlbmlzIE0uIEtpc2hlbmtvCiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5nZW9tOwogCiBpbXBvcnQgamF2YS5hd3QuUmVjdGFuZ2xlOwpAQCAtMjcsMTMgKzI4LDE4IEBACiBpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmludGVybmFsLm5scy5NZXNzYWdlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk5vdEltcGxlbWVudGVkRXhjZXB0aW9uOwogCiAvKioKICAqIFRoZSBDbGFzcyBBcmVhIHByb3ZpZGVzIGEgbWluaW1hbCBpbXBsZW1lbnRhdGlvbiBmb3IgYSBnZW5lcmljIHNoYXBlLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEFyZWEgaW1wbGVtZW50cyBTaGFwZSwgQ2xvbmVhYmxlIHsKIAotICAgIC8qKiBUaGUgc291cmNlIFNoYXBlIG9iamVjdC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgc291cmNlIFNoYXBlIG9iamVjdC4KKyAgICAgKi8KICAgICBTaGFwZSBzOwogCiAgICAgLyoqCkBAIC04MCw3ICs4Niw4IEBACiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGFyZWEgd2l0aCBkYXRhIGdpdmVuIGJ5IHRoZSBzcGVjaWZpZWQgc2hhcGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHMgdGhlIHNoYXBlIHRoYXQgZ2l2ZXMgdGhlIGRhdGEgZm9yIHRoaXMgQXJlYQorICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICB0aGUgc2hhcGUgdGhhdCBnaXZlcyB0aGUgZGF0YSBmb3IgdGhpcyBBcmVhLgogICAgICAqLwogICAgIHB1YmxpYyBBcmVhKFNoYXBlIHMpIHsKICAgICAgICAgaWYgKHMgPT0gbnVsbCkgewpAQCAtMTE0LDExICsxMjEsMTEgQEAKICAgICAvKioKICAgICAgKiBUZXN0cyB3aGV0aGVyIHRoZSBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcyBBcmVhLgogICAgICAqIAotICAgICAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB0byBjb21wYXJlCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiBzdWNjZXNzZnVsCi0gICAgICogCi0gICAgICogQHRocm93cyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQKKyAgICAgKiBAcGFyYW0gb2JqCisgICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvbXBhcmUuCisgICAgICogQHJldHVybiB0cnVlLCBpZiBzdWNjZXNzZnVsLgorICAgICAqIEB0aHJvd3MgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKEFyZWEgb2JqKSB0aHJvd3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Ob3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiB7CiAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJApAQCAtMTQwLDcgKzE0Nyw3IEBACiAgICAgfQogCiAgICAgcHVibGljIFJlY3RhbmdsZTJEIGdldEJvdW5kczJEKCkgewotICAgICAgICByZXR1cm4gcyA9PSBudWxsID8gbmV3IFJlY3RhbmdsZTJELkRvdWJsZSgpOiBzLmdldEJvdW5kczJEKCk7CisgICAgICAgIHJldHVybiBzID09IG51bGwgPyBuZXcgUmVjdGFuZ2xlMkQuRG91YmxlKCkgOiBzLmdldEJvdW5kczJEKCk7CiAgICAgfQogCiAgICAgcHVibGljIFBhdGhJdGVyYXRvciBnZXRQYXRoSXRlcmF0b3IoQWZmaW5lVHJhbnNmb3JtIHQpIHsKQEAgLTE1NCwzMiArMTYxLDM0IEBACiAgICAgLyoqCiAgICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIGFyZWEgdG8gdGhpcyBhcmVhLgogICAgICAqIAotICAgICAqIEBwYXJhbSBhcmVhIHRoZSBhcmVhIHRvIGFkZCB0byB0aGlzIGFyZWEKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZAorICAgICAqIEBwYXJhbSBhcmVhCisgICAgICogICAgICAgICAgICB0aGUgYXJlYSB0byBhZGQgdG8gdGhpcyBhcmVhLgorICAgICAqIEB0aHJvd3MgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkKEFyZWEgYXJlYSkgdGhyb3dzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTm90SW1wbGVtZW50ZWRFeGNlcHRpb24gewogICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQZXJmb3JtcyBhbiBleGNsdXNpdmUgb3Igb3BlcmF0aW9uIGJldHdlZW4gdGhpcyBzaGFwZSBhbmQgdGhlCi0gICAgICogc3BlY2lmaWVkIHNoYXBlLgorICAgICAqIFBlcmZvcm1zIGFuIGV4Y2x1c2l2ZSBvciBvcGVyYXRpb24gYmV0d2VlbiB0aGlzIHNoYXBlIGFuZCB0aGUgc3BlY2lmaWVkCisgICAgICogc2hhcGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGFyZWEgdGhlIGFyZWEgdG8gWE9SIGFnYWluc3QgdGhpcyBhcmVhCi0gICAgICogCi0gICAgICogQHRocm93cyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQKKyAgICAgKiBAcGFyYW0gYXJlYQorICAgICAqICAgICAgICAgICAgdGhlIGFyZWEgdG8gWE9SIGFnYWluc3QgdGhpcyBhcmVhLgorICAgICAqIEB0aHJvd3MgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZXhjbHVzaXZlT3IoQXJlYSBhcmVhKSB0aHJvd3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Ob3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiB7CiAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEV4dHJhY3RzIGEgUmVjdGFuZ2xlMkQgZnJvbSB0aGUgc291cmNlIHNoYXBlIGlmIHRoZSB1bmRlcmx5aW5nIHNoYXBlCi0gICAgICogZGF0YSBkZXNjcmliZXMgYSByZWN0YW5nbGUuCisgICAgICogRXh0cmFjdHMgYSBSZWN0YW5nbGUyRCBmcm9tIHRoZSBzb3VyY2Ugc2hhcGUgaWYgdGhlIHVuZGVybHlpbmcgc2hhcGUgZGF0YQorICAgICAqIGRlc2NyaWJlcyBhIHJlY3RhbmdsZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgUmVjdGFuZ2xlMkQgb2JqZWN0IGlmIHRoZSBzb3VyY2Ugc2hhcGUgaXMgcmVjdGFuZ2xlLCAKLSAgICAgKiBvciBudWxsIGlmIHNoYXBlIGlzIGVtcHR5IG9yIG5vdCByZWN0YW5nbGUuCisgICAgICogQHJldHVybiBhIFJlY3RhbmdsZTJEIG9iamVjdCBpZiB0aGUgc291cmNlIHNoYXBlIGlzIHJlY3RhbmdsZSwgb3IgbnVsbCBpZgorICAgICAqICAgICAgICAgc2hhcGUgaXMgZW1wdHkgb3Igbm90IHJlY3RhbmdsZS4KICAgICAgKi8KICAgICBSZWN0YW5nbGUyRCBleHRyYWN0UmVjdGFuZ2xlKCkgewogICAgICAgICBpZiAocyA9PSBudWxsKSB7CkBAIC0xODksNyArMTk4LDcgQEAKICAgICAgICAgaW50IGNvdW50ID0gMDsKICAgICAgICAgUGF0aEl0ZXJhdG9yIHAgPSBzLmdldFBhdGhJdGVyYXRvcihudWxsKTsKICAgICAgICAgZmxvYXRbXSBjb29yZHMgPSBuZXcgZmxvYXRbNl07Ci0gICAgICAgIHdoaWxlKCFwLmlzRG9uZSgpKSB7CisgICAgICAgIHdoaWxlICghcC5pc0RvbmUoKSkgewogICAgICAgICAgICAgaW50IHR5cGUgPSBwLmN1cnJlbnRTZWdtZW50KGNvb3Jkcyk7CiAgICAgICAgICAgICBpZiAoY291bnQgPiAxMiB8fCB0eXBlID09IFBhdGhJdGVyYXRvci5TRUdfUVVBRFRPIHx8IHR5cGUgPT0gUGF0aEl0ZXJhdG9yLlNFR19DVUJJQ1RPKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CkBAIC0xOTgsMjEgKzIwNywyMiBAQAogICAgICAgICAgICAgcG9pbnRzW2NvdW50KytdID0gY29vcmRzWzFdOwogICAgICAgICAgICAgcC5uZXh0KCk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHBvaW50c1swXSA9PSBwb2ludHNbNl0gJiYgcG9pbnRzWzZdID09IHBvaW50c1s4XSAmJiBwb2ludHNbMl0gPT0gcG9pbnRzWzRdICYmCi0gICAgICAgICAgICBwb2ludHNbMV0gPT0gcG9pbnRzWzNdICYmIHBvaW50c1szXSA9PSBwb2ludHNbOV0gJiYgcG9pbnRzWzVdID09IHBvaW50c1s3XSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWN0YW5nbGUyRC5GbG9hdChwb2ludHNbMF0sIHBvaW50c1sxXSwgcG9pbnRzWzJdIC0gcG9pbnRzWzBdLCBwb2ludHNbN10gLSBwb2ludHNbMV0pOworICAgICAgICBpZiAocG9pbnRzWzBdID09IHBvaW50c1s2XSAmJiBwb2ludHNbNl0gPT0gcG9pbnRzWzhdICYmIHBvaW50c1syXSA9PSBwb2ludHNbNF0KKyAgICAgICAgICAgICAgICAmJiBwb2ludHNbMV0gPT0gcG9pbnRzWzNdICYmIHBvaW50c1szXSA9PSBwb2ludHNbOV0gJiYgcG9pbnRzWzVdID09IHBvaW50c1s3XSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWN0YW5nbGUyRC5GbG9hdChwb2ludHNbMF0sIHBvaW50c1sxXSwgcG9pbnRzWzJdIC0gcG9pbnRzWzBdLCBwb2ludHNbN10KKyAgICAgICAgICAgICAgICAgICAgLSBwb2ludHNbMV0pOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KLSAgICAKKwogICAgIC8qKgotICAgICAqIFJlZHVjZXMgdGhlIHNpemUgb2YgdGhpcyBBcmVhIGJ5IGludGVyc2VjdGluZyBpdCB3aXRoIHRoZSAKLSAgICAgKiBzcGVjaWZpZWQgQXJlYSBpZiB0aGV5IGFyZSBib3RoIHJlY3RhbmdsZXMuCisgICAgICogUmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGlzIEFyZWEgYnkgaW50ZXJzZWN0aW5nIGl0IHdpdGggdGhlIHNwZWNpZmllZCBBcmVhCisgICAgICogaWYgdGhleSBhcmUgYm90aCByZWN0YW5nbGVzLgogICAgICAqIAotICAgICAqIEBzZWUgamF2YS5hd3QuZ2VvbS5SZWN0YW5nbGUyRCNpbnRlcnNlY3QoUmVjdGFuZ2xlMkQsIFJlY3RhbmdsZTJELCBSZWN0YW5nbGUyRCkKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYXJlYSB0aGUgYXJlYQorICAgICAqIEBzZWUgamF2YS5hd3QuZ2VvbS5SZWN0YW5nbGUyRCNpbnRlcnNlY3QoUmVjdGFuZ2xlMkQsIFJlY3RhbmdsZTJELAorICAgICAqICAgICAgUmVjdGFuZ2xlMkQpCisgICAgICogQHBhcmFtIGFyZWEKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcmVhLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGludGVyc2VjdChBcmVhIGFyZWEpIHsKICAgICAgICAgUmVjdGFuZ2xlMkQgc3JjMSA9IGV4dHJhY3RSZWN0YW5nbGUoKTsKQEAgLTIyNSw5ICsyMzUsMTAgQEAKICAgICAvKioKICAgICAgKiBTdWJ0cmFjdCB0aGUgc3BlY2lmaWVkIGFyZWEgZnJvbSB0aGlzIGFyZWEuCiAgICAgICogCi0gICAgICogQHBhcmFtIGFyZWEgdGhlIGFyZWEgdG8gc3VidHJhY3QKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZAorICAgICAqIEBwYXJhbSBhcmVhCisgICAgICogICAgICAgICAgICB0aGUgYXJlYSB0byBzdWJ0cmFjdC4KKyAgICAgKiBAdGhyb3dzIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHN1YnRyYWN0KEFyZWEgYXJlYSkgdGhyb3dzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTm90SW1wbGVtZW50ZWRFeGNlcHRpb24gewogICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKQEAgLTIzNiw5ICsyNDcsOSBAQAogICAgIC8qKgogICAgICAqIENoZWNrcyBpZiB0aGlzIEFyZWEgaXMgZW1wdHkuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGlzIEFyZWEgaXMgZW1wdHkKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZAorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBBcmVhIGlzIGVtcHR5LgorICAgICAqIEB0aHJvd3MgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHRocm93cyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk5vdEltcGxlbWVudGVkRXhjZXB0aW9uIHsKICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCkBAIC0yNDcsOSArMjU4LDkgQEAKICAgICAvKioKICAgICAgKiBDaGVja3MgaWYgdGhpcyBBcmVhIGlzIHBvbHlnb25hbC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgQXJlYSBpcyBwb2x5Z29uYWwKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZAorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBBcmVhIGlzIHBvbHlnb25hbC4KKyAgICAgKiBAdGhyb3dzIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzUG9seWdvbmFsKCkgdGhyb3dzIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTm90SW1wbGVtZW50ZWRFeGNlcHRpb24gewogICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKQEAgLTI1OCw5ICsyNjksOSBAQAogICAgIC8qKgogICAgICAqIENoZWNrcyBpZiB0aGlzIEFyZWEgaXMgcmVjdGFuZ3VsYXIuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGlzIEFyZWEgaXMgcmVjdGFuZ3VsYXIKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZAorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBBcmVhIGlzIHJlY3Rhbmd1bGFyLgorICAgICAqIEB0aHJvd3MgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNSZWN0YW5ndWxhcigpIHRocm93cyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk5vdEltcGxlbWVudGVkRXhjZXB0aW9uIHsKICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCkBAIC0yNjksOSArMjgwLDkgQEAKICAgICAvKioKICAgICAgKiBDaGVja3MgaWYgdGhpcyBBcmVhIGlzIHNpbmd1bGFyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBBcmVhIGlzIHNpbmd1bGFyCi0gICAgICogCi0gICAgICogQHRocm93cyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQKKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgQXJlYSBpcyBzaW5ndWxhci4KKyAgICAgKiBAdGhyb3dzIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhpcyBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzU2luZ3VsYXIoKSB0aHJvd3Mgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Ob3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiB7CiAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJApAQCAtMjgwLDMwICsyOTEsMzIgQEAKICAgICAvKioKICAgICAgKiBSZXNldHMgdGhlIGRhdGEgb2YgdGhpcyBBcmVhLgogICAgICAqIAotICAgICAqIEB0aHJvd3MgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24gaWYgdGhpcyBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkCisgICAgICogQHRocm93cyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk5vdEltcGxlbWVudGVkRXhjZXB0aW9uIHsKICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVHJhbnNmb3JtcyB0aGUgZGF0YSBvZiB0aGlzIEFyZWEgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgCisgICAgICogVHJhbnNmb3JtcyB0aGUgZGF0YSBvZiB0aGlzIEFyZWEgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKICAgICAgKiBBZmZpbmVUcmFuc2Zvcm0uCiAgICAgICogCi0gICAgICogQHBhcmFtIHQgdGhlIHRyYW5zZm9ybSB0byB1c2UgdG8gdHJhbnNmb3JtIHRoZSBkYXRhCisgICAgICogQHBhcmFtIHQKKyAgICAgKiAgICAgICAgICAgIHRoZSB0cmFuc2Zvcm0gdG8gdXNlIHRvIHRyYW5zZm9ybSB0aGUgZGF0YS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0cmFuc2Zvcm0oQWZmaW5lVHJhbnNmb3JtIHQpIHsKICAgICAgICAgcyA9IHQuY3JlYXRlVHJhbnNmb3JtZWRTaGFwZShzKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IEFyZWEgdGhhdCBpcyB0aGUgcmVzdWx0IG9mIHRyYW5zZm9ybWluZyB0aGUgZGF0YSAKLSAgICAgKiBvZiB0aGlzIEFyZWEgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgQWZmaW5lVHJhbnNmb3JtLgorICAgICAqIENyZWF0ZXMgYSBuZXcgQXJlYSB0aGF0IGlzIHRoZSByZXN1bHQgb2YgdHJhbnNmb3JtaW5nIHRoZSBkYXRhIG9mIHRoaXMKKyAgICAgKiBBcmVhIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIEFmZmluZVRyYW5zZm9ybS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdCB0aGUgdHJhbnNmb3JtIHRvIHVzZSB0byB0cmFuc2Zvcm0gdGhlIGRhdGEKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgQXJlYSB0aGF0IGlzIHRoZSByZXN1bHQgb2YgdHJhbnNmb3JtaW5nIHRoZSBkYXRhIAotICAgICAqIG9mIHRoaXMgQXJlYSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBBZmZpbmVUcmFuc2Zvcm0uCisgICAgICogQHBhcmFtIHQKKyAgICAgKiAgICAgICAgICAgIHRoZSB0cmFuc2Zvcm0gdG8gdXNlIHRvIHRyYW5zZm9ybSB0aGUgZGF0YS4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXcgQXJlYSB0aGF0IGlzIHRoZSByZXN1bHQgb2YgdHJhbnNmb3JtaW5nIHRoZSBkYXRhIG9mIHRoaXMKKyAgICAgKiAgICAgICAgIEFyZWEgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgQWZmaW5lVHJhbnNmb3JtLgogICAgICAqLwogICAgIHB1YmxpYyBBcmVhIGNyZWF0ZVRyYW5zZm9ybWVkQXJlYShBZmZpbmVUcmFuc2Zvcm0gdCkgewogICAgICAgICByZXR1cm4gcyA9PSBudWxsID8gbmV3IEFyZWEoKSA6IG5ldyBBcmVhKHQuY3JlYXRlVHJhbnNmb3JtZWRTaGFwZShzKSk7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZ2VvbS9DdWJpY0N1cnZlMkQuamF2YSBiL2F3dC9qYXZhL2F3dC9nZW9tL0N1YmljQ3VydmUyRC5qYXZhCmluZGV4IDNlNDQwYzguLjFkZGVkZjMgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9nZW9tL0N1YmljQ3VydmUyRC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9nZW9tL0N1YmljQ3VydmUyRC5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIERlbmlzIE0uIEtpc2hlbmtvCiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5nZW9tOwogCiBpbXBvcnQgamF2YS5hd3QuUmVjdGFuZ2xlOwpAQCAtMjgsNDkgKzI5LDY5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogVGhlIENsYXNzIEN1YmljQ3VydmUyRCBpcyBhIFNoYXBlIHRoYXQgcmVwcmVzZW50cyBhIHNlZ21lbnQgb2YgYSAKLSAqIHF1YWRyYXRpYyAoQmV6aWVyKSBjdXJ2ZS4gVGhlIGN1cnZlZCBzZWdtZW50IGlzIGRldGVybWluZWQgYnkgZm91ciBwb2ludHM6Ci0gKiBhIHN0YXJ0IHBvaW50LCBhbiBlbmQgcG9pbnQsIGFuZCB0d28gY29udHJvbCBwb2ludHMuIAotICogVGhlIGNvbnRyb2wgcG9pbnRzIGdpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRhbmdlbnQgYW5kIG5leHQgCi0gKiBkZXJpdmF0aXZlIGF0IHRoZSBlbmRwb2ludHMgYWNjb3JkaW5nIHRvIHRoZSBzdGFuZGFyZCB0aGVvcnkgb2YgCi0gKiBCZXppZXIgY3VydmVzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBCZXppZXIgY3VydmVzLCAKLSAqIHNlZSA8YSBocmVmPSJodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0IlQzMlQTl6aWVyX2N1cnZlIj50aGlzIGFydGljbGU8L2E+LgorICogVGhlIENsYXNzIEN1YmljQ3VydmUyRCBpcyBhIFNoYXBlIHRoYXQgcmVwcmVzZW50cyBhIHNlZ21lbnQgb2YgYSBxdWFkcmF0aWMKKyAqIChCZXppZXIpIGN1cnZlLiBUaGUgY3VydmVkIHNlZ21lbnQgaXMgZGV0ZXJtaW5lZCBieSBmb3VyIHBvaW50czogYSBzdGFydAorICogcG9pbnQsIGFuIGVuZCBwb2ludCwgYW5kIHR3byBjb250cm9sIHBvaW50cy4gVGhlIGNvbnRyb2wgcG9pbnRzIGdpdmUKKyAqIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0YW5nZW50IGFuZCBuZXh0IGRlcml2YXRpdmUgYXQgdGhlIGVuZHBvaW50cyBhY2NvcmRpbmcKKyAqIHRvIHRoZSBzdGFuZGFyZCB0aGVvcnkgb2YgQmV6aWVyIGN1cnZlcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gQmV6aWVyCisgKiBjdXJ2ZXMsIHNlZSA8YSBocmVmPSJodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0IlQzMlQTl6aWVyX2N1cnZlIj50aGlzCisgKiBhcnRpY2xlPC9hPi4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDdWJpY0N1cnZlMkQgaW1wbGVtZW50cyBTaGFwZSwgQ2xvbmVhYmxlIHsKIAogICAgIC8qKgotICAgICAqIFRoZSBDbGFzcyBGbG9hdCBpcyB0aGUgc3ViY2xhc3Mgb2YgQ3ViaWNDdXJ2ZTJEIHRoYXQgaGFzIGFsbCAKLSAgICAgKiBvZiBpdHMgZGF0YSB2YWx1ZXMgc3RvcmVkIHdpdGggZmxvYXQtbGV2ZWwgcHJlY2lzaW9uLgorICAgICAqIFRoZSBDbGFzcyBGbG9hdCBpcyB0aGUgc3ViY2xhc3Mgb2YgQ3ViaWNDdXJ2ZTJEIHRoYXQgaGFzIGFsbCBvZiBpdHMgZGF0YQorICAgICAqIHZhbHVlcyBzdG9yZWQgd2l0aCBmbG9hdC1sZXZlbCBwcmVjaXNpb24uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGbG9hdCBleHRlbmRzIEN1YmljQ3VydmUyRCB7CiAKLSAgICAgICAgLyoqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50LiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmxvYXQgeDE7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50LgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGZsb2F0IHkxOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmxvYXQgY3RybHgxOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmxvYXQgY3RybHkxOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50LiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmbG9hdCBjdHJseDI7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50LgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGZsb2F0IGN0cmx5MjsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmbG9hdCB4MjsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmbG9hdCB5MjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGZsb2F0LXZhbHVlZCBDdWJpY0N1cnZlMkQgd2l0aCBhbGwgY29vcmRpbmF0ZSB2YWx1ZXMKLSAgICAgICAgICogc2V0IHRvIHplcm8uCisgICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBmbG9hdC12YWx1ZWQgQ3ViaWNDdXJ2ZTJEIHdpdGggYWxsIGNvb3JkaW5hdGUKKyAgICAgICAgICogdmFsdWVzIHNldCB0byB6ZXJvLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIEZsb2F0KCkgewogICAgICAgICB9CkBAIC03OSwxNiArMTAwLDI1IEBACiAgICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBmbG9hdC12YWx1ZWQgQ3ViaWNDdXJ2ZTJEIHdpdGggdGhlIHNwZWNpZmllZAogICAgICAgICAgKiBjb29yZGluYXRlIHZhbHVlcy4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSB4MSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludAotICAgICAgICAgKiBAcGFyYW0geTEgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQKLSAgICAgICAgICogQHBhcmFtIGN0cmx4MSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50Ci0gICAgICAgICAqIEBwYXJhbSBjdHJseTEgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludAotICAgICAgICAgKiBAcGFyYW0gY3RybHgyIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50Ci0gICAgICAgICAqIEBwYXJhbSBjdHJseTIgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQKLSAgICAgICAgICogQHBhcmFtIHgyIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludAotICAgICAgICAgKiBAcGFyYW0geTIgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50CisgICAgICAgICAqIEBwYXJhbSB4MQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50LgorICAgICAgICAgKiBAcGFyYW0geTEKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludC4KKyAgICAgICAgICogQHBhcmFtIGN0cmx4MQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuCisgICAgICAgICAqIEBwYXJhbSBjdHJseTEKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50LgorICAgICAgICAgKiBAcGFyYW0gY3RybHgyCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuCisgICAgICAgICAqIEBwYXJhbSBjdHJseTIKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC4KKyAgICAgICAgICogQHBhcmFtIHgyCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LgorICAgICAgICAgKiBAcGFyYW0geTIKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuCiAgICAgICAgICAqLwotICAgICAgICBwdWJsaWMgRmxvYXQoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCBjdHJseDEsIGZsb2F0IGN0cmx5MSwgZmxvYXQgY3RybHgyLCBmbG9hdCBjdHJseTIsIGZsb2F0IHgyLCBmbG9hdCB5MikgeworICAgICAgICBwdWJsaWMgRmxvYXQoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCBjdHJseDEsIGZsb2F0IGN0cmx5MSwgZmxvYXQgY3RybHgyLCBmbG9hdCBjdHJseTIsCisgICAgICAgICAgICAgICAgZmxvYXQgeDIsIGZsb2F0IHkyKSB7CiAgICAgICAgICAgICBzZXRDdXJ2ZSh4MSwgeTEsIGN0cmx4MSwgY3RybHkxLCBjdHJseDIsIGN0cmx5MiwgeDIsIHkyKTsKICAgICAgICAgfQogCkBAIC0xNTMsOSArMTgzLDggQEAKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRDdXJ2ZShkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIGN0cmx4MSwgZG91YmxlIGN0cmx5MSwKLSAgICAgICAgICAgICAgICBkb3VibGUgY3RybHgyLCBkb3VibGUgY3RybHkyLCBkb3VibGUgeDIsIGRvdWJsZSB5MikKLSAgICAgICAgeworICAgICAgICBwdWJsaWMgdm9pZCBzZXRDdXJ2ZShkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIGN0cmx4MSwgZG91YmxlIGN0cmx5MSwgZG91YmxlIGN0cmx4MiwKKyAgICAgICAgICAgICAgICBkb3VibGUgY3RybHkyLCBkb3VibGUgeDIsIGRvdWJsZSB5MikgewogICAgICAgICAgICAgdGhpcy54MSA9IChmbG9hdCl4MTsKICAgICAgICAgICAgIHRoaXMueTEgPSAoZmxvYXQpeTE7CiAgICAgICAgICAgICB0aGlzLmN0cmx4MSA9IChmbG9hdCljdHJseDE7CkBAIC0xNjksMTggKzE5OCwyNSBAQAogICAgICAgICAvKioKICAgICAgICAgICogU2V0cyB0aGUgZGF0YSB2YWx1ZXMgb2YgdGhlIGN1cnZlLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHgxIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50Ci0gICAgICAgICAqIEBwYXJhbSB5MSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludAotICAgICAgICAgKiBAcGFyYW0gY3RybHgxIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQKLSAgICAgICAgICogQHBhcmFtIGN0cmx5MSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50Ci0gICAgICAgICAqIEBwYXJhbSBjdHJseDIgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQKLSAgICAgICAgICogQHBhcmFtIGN0cmx5MiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludAotICAgICAgICAgKiBAcGFyYW0geDIgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50Ci0gICAgICAgICAqIEBwYXJhbSB5MiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQKKyAgICAgICAgICogQHBhcmFtIHgxCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQuCisgICAgICAgICAqIEBwYXJhbSB5MQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50LgorICAgICAgICAgKiBAcGFyYW0gY3RybHgxCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludC4KKyAgICAgICAgICogQHBhcmFtIGN0cmx5MQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuCisgICAgICAgICAqIEBwYXJhbSBjdHJseDIKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC4KKyAgICAgICAgICogQHBhcmFtIGN0cmx5MgorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50LgorICAgICAgICAgKiBAcGFyYW0geDIKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuCisgICAgICAgICAqIEBwYXJhbSB5MgorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC4KICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEN1cnZlKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgY3RybHgxLCBmbG9hdCBjdHJseTEsCi0gICAgICAgICAgICAgICAgZmxvYXQgY3RybHgyLCBmbG9hdCBjdHJseTIsIGZsb2F0IHgyLCBmbG9hdCB5MikKLSAgICAgICAgeworICAgICAgICBwdWJsaWMgdm9pZCBzZXRDdXJ2ZShmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IGN0cmx4MSwgZmxvYXQgY3RybHkxLCBmbG9hdCBjdHJseDIsCisgICAgICAgICAgICAgICAgZmxvYXQgY3RybHkyLCBmbG9hdCB4MiwgZmxvYXQgeTIpIHsKICAgICAgICAgICAgIHRoaXMueDEgPSB4MTsKICAgICAgICAgICAgIHRoaXMueTEgPSB5MTsKICAgICAgICAgICAgIHRoaXMuY3RybHgxID0gY3RybHgxOwpAQCAtMjAxLDM4ICsyMzcsNTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUaGUgQ2xhc3MgRG91YmxlIGlzIHRoZSBzdWJjbGFzcyBvZiBDdWJpY0N1cnZlMkQgdGhhdCBoYXMgYWxsIAotICAgICAqIG9mIGl0cyBkYXRhIHZhbHVlcyBzdG9yZWQgd2l0aCBkb3VibGUtbGV2ZWwgcHJlY2lzaW9uLgorICAgICAqIFRoZSBDbGFzcyBEb3VibGUgaXMgdGhlIHN1YmNsYXNzIG9mIEN1YmljQ3VydmUyRCB0aGF0IGhhcyBhbGwgb2YgaXRzIGRhdGEKKyAgICAgKiB2YWx1ZXMgc3RvcmVkIHdpdGggZG91YmxlLWxldmVsIHByZWNpc2lvbi4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERvdWJsZSBleHRlbmRzIEN1YmljQ3VydmUyRCB7CiAKLSAgICAgICAgLyoqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50LiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZG91YmxlIHgxOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50LiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludC4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBkb3VibGUgeTE7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludC4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludC4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBkb3VibGUgY3RybHgxOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZG91YmxlIGN0cmx5MTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZG91YmxlIGN0cmx4MjsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZG91YmxlIGN0cmx5MjsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBkb3VibGUgeDI7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZG91YmxlIHkyOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZG91YmxlLXZhbHVlZCBDdWJpY0N1cnZlMkQgd2l0aCBhbGwgY29vcmRpbmF0ZSB2YWx1ZXMKLSAgICAgICAgICogc2V0IHRvIHplcm8uCisgICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkb3VibGUtdmFsdWVkIEN1YmljQ3VydmUyRCB3aXRoIGFsbCBjb29yZGluYXRlCisgICAgICAgICAqIHZhbHVlcyBzZXQgdG8gemVyby4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBEb3VibGUoKSB7CiAgICAgICAgIH0KQEAgLTI0MSwxNyArMjk1LDI1IEBACiAgICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkb3VibGUtdmFsdWVkIEN1YmljQ3VydmUyRCB3aXRoIHRoZSBzcGVjaWZpZWQKICAgICAgICAgICogY29vcmRpbmF0ZSB2YWx1ZXMuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0geDEgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQKLSAgICAgICAgICogQHBhcmFtIHkxIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50Ci0gICAgICAgICAqIEBwYXJhbSBjdHJseDEgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludAotICAgICAgICAgKiBAcGFyYW0gY3RybHkxIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQKLSAgICAgICAgICogQHBhcmFtIGN0cmx4MiB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludAotICAgICAgICAgKiBAcGFyYW0gY3RybHkyIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50Ci0gICAgICAgICAqIEBwYXJhbSB4MiB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQKLSAgICAgICAgICogQHBhcmFtIHkyIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludAorICAgICAgICAgKiBAcGFyYW0geDEKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludC4KKyAgICAgICAgICogQHBhcmFtIHkxCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQuCisgICAgICAgICAqIEBwYXJhbSBjdHJseDEKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50LgorICAgICAgICAgKiBAcGFyYW0gY3RybHkxCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludC4KKyAgICAgICAgICogQHBhcmFtIGN0cmx4MgorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50LgorICAgICAgICAgKiBAcGFyYW0gY3RybHkyCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuCisgICAgICAgICAqIEBwYXJhbSB4MgorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC4KKyAgICAgICAgICogQHBhcmFtIHkyCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LgogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIERvdWJsZShkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIGN0cmx4MSwgZG91YmxlIGN0cmx5MSwKLSAgICAgICAgICAgICAgICBkb3VibGUgY3RybHgyLCBkb3VibGUgY3RybHkyLCBkb3VibGUgeDIsIGRvdWJsZSB5MikgeworICAgICAgICBwdWJsaWMgRG91YmxlKGRvdWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUgY3RybHgxLCBkb3VibGUgY3RybHkxLCBkb3VibGUgY3RybHgyLAorICAgICAgICAgICAgICAgIGRvdWJsZSBjdHJseTIsIGRvdWJsZSB4MiwgZG91YmxlIHkyKSB7CiAgICAgICAgICAgICBzZXRDdXJ2ZSh4MSwgeTEsIGN0cmx4MSwgY3RybHkxLCBjdHJseDIsIGN0cmx5MiwgeDIsIHkyKTsKICAgICAgICAgfQogCkBAIC0zMTYsOSArMzc4LDggQEAKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRDdXJ2ZShkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIGN0cmx4MSwgZG91YmxlIGN0cmx5MSwKLSAgICAgICAgICAgICAgICBkb3VibGUgY3RybHgyLCBkb3VibGUgY3RybHkyLCBkb3VibGUgeDIsIGRvdWJsZSB5MikKLSAgICAgICAgeworICAgICAgICBwdWJsaWMgdm9pZCBzZXRDdXJ2ZShkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIGN0cmx4MSwgZG91YmxlIGN0cmx5MSwgZG91YmxlIGN0cmx4MiwKKyAgICAgICAgICAgICAgICBkb3VibGUgY3RybHkyLCBkb3VibGUgeDIsIGRvdWJsZSB5MikgewogICAgICAgICAgICAgdGhpcy54MSA9IHgxOwogICAgICAgICAgICAgdGhpcy55MSA9IHkxOwogICAgICAgICAgICAgdGhpcy5jdHJseDEgPSBjdHJseDE7CkBAIC0zMzksMjcgKzQwMCwzNiBAQAogICAgIH0KIAogICAgIC8qCi0gICAgICogQ3ViaWNDdXJ2ZTJEIHBhdGggaXRlcmF0b3IgCisgICAgICogQ3ViaWNDdXJ2ZTJEIHBhdGggaXRlcmF0b3IKICAgICAgKi8KICAgICAvKioKICAgICAgKiBUaGUgSXRlcmF0b3IgY2xhc3MgZm9yIHRoZSBTaGFwZSBDdWJpY0N1cnZlMkQuCiAgICAgICovCiAgICAgY2xhc3MgSXRlcmF0b3IgaW1wbGVtZW50cyBQYXRoSXRlcmF0b3IgewogCi0gICAgICAgIC8qKiBUaGUgc291cmNlIEN1YmljQ3VydmUyRCBvYmplY3QuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgc291cmNlIEN1YmljQ3VydmUyRCBvYmplY3QuCisgICAgICAgICAqLwogICAgICAgICBDdWJpY0N1cnZlMkQgYzsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgcGF0aCBpdGVyYXRvciB0cmFuc2Zvcm1hdGlvbi4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHBhdGggaXRlcmF0b3IgdHJhbnNmb3JtYXRpb24uCisgICAgICAgICAqLwogICAgICAgICBBZmZpbmVUcmFuc2Zvcm0gdDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgY3VycmVudCBzZWdtZW5ldCBpbmRleC4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGN1cnJlbnQgc2VnbWVudCBpbmRleC4KKyAgICAgICAgICovCiAgICAgICAgIGludCBpbmRleDsKIAogICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0cyBhIG5ldyBDdWJpY0N1cnZlMkQuSXRlcmF0b3IgZm9yIGdpdmVuIGxpbmUgYW5kIHRyYW5zZm9ybWF0aW9uCisgICAgICAgICAqIENvbnN0cnVjdHMgYSBuZXcgQ3ViaWNDdXJ2ZTJELkl0ZXJhdG9yIGZvciBnaXZlbiBsaW5lIGFuZAorICAgICAgICAgKiB0cmFuc2Zvcm1hdGlvbgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGMgLSB0aGUgc291cmNlIEN1YmljQ3VydmUyRCBvYmplY3QKLSAgICAgICAgICogQHBhcmFtIHQgdGhlIHQKKyAgICAgICAgICogQHBhcmFtIGMKKyAgICAgICAgICogICAgICAgICAgICB0aGUgc291cmNlIEN1YmljQ3VydmUyRCBvYmplY3QuCisgICAgICAgICAqIEBwYXJhbSB0CisgICAgICAgICAqICAgICAgICAgICAgdGhlIGFmZmluZSB0cmFuc2Zvcm1hdGlvbiBvYmplY3QuCiAgICAgICAgICAqLwogICAgICAgICBJdGVyYXRvcihDdWJpY0N1cnZlMkQgYywgQWZmaW5lVHJhbnNmb3JtIHQpIHsKICAgICAgICAgICAgIHRoaXMuYyA9IGM7CkBAIC00NDMsNDIgKzUxMyw0MiBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludAorICAgICAqIEByZXR1cm4gdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGRvdWJsZSBnZXRYMSgpOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50CisgICAgICogQHJldHVybiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgZG91YmxlIGdldFkxKCk7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBzdGFydGluZyBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzdGFydGluZyBwb2ludAorICAgICAqIEByZXR1cm4gdGhlIHN0YXJ0aW5nIHBvaW50LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBQb2ludDJEIGdldFAxKCk7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50CisgICAgICogQHJldHVybiB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBkb3VibGUgZ2V0Q3RybFgxKCk7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50CisgICAgICogQHJldHVybiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBkb3VibGUgZ2V0Q3RybFkxKCk7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludAorICAgICAqIEByZXR1cm4gdGhlIHNlY29uZCBjb250cm9sIHBvaW50LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBQb2ludDJEIGdldEN0cmxQMSgpOwogCkBAIC00OTksNDIgKzU2OSw1MCBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHNlY29uZCBjb250cm9sIHBvaW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNlY29uZCBjb250cm9sIHBvaW50CisgICAgICogQHJldHVybiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFBvaW50MkQgZ2V0Q3RybFAyKCk7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludAorICAgICAqIEByZXR1cm4gdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBkb3VibGUgZ2V0WDIoKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50CisgICAgICogQHJldHVybiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGRvdWJsZSBnZXRZMigpOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgZW5kIHBvaW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGVuZCBwb2ludAorICAgICAqIEByZXR1cm4gdGhlIGVuZCBwb2ludC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgUG9pbnQyRCBnZXRQMigpOwogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgZGF0YSBvZiB0aGUgY3VydmUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHgxIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50Ci0gICAgICogQHBhcmFtIHkxIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50Ci0gICAgICogQHBhcmFtIGN0cmx4MSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIGN0cmx5MSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIGN0cmx4MiB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSBjdHJseTIgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0geDIgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50Ci0gICAgICogQHBhcmFtIHkyIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludAorICAgICAqIEBwYXJhbSB4MQorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQuCisgICAgICogQHBhcmFtIHkxCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludC4KKyAgICAgKiBAcGFyYW0gY3RybHgxCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSBjdHJseTEKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuCisgICAgICogQHBhcmFtIGN0cmx4MgorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuCisgICAgICogQHBhcmFtIGN0cmx5MgorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuCisgICAgICogQHBhcmFtIHgyCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuCisgICAgICogQHBhcmFtIHkyCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Q3VydmUoZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSBjdHJseDEsIGRvdWJsZSBjdHJseTEsCiAgICAgICAgICAgICBkb3VibGUgY3RybHgyLCBkb3VibGUgY3RybHkyLCBkb3VibGUgeDIsIGRvdWJsZSB5Mik7CkBAIC01NDIsMjI0ICs2MjAsMjM4IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgZGF0YSBvZiB0aGUgY3VydmUgYXMgcG9pbnQgb2JqZWN0cy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcDEgdGhlIHN0YXJ0aW5nIHBvaW50Ci0gICAgICogQHBhcmFtIGNwMSB0aGUgZmlyc3QgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSBjcDIgdGhlIHNlY29uZCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHAyIHRoZSBlbmQgcG9pbnQKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGFueSBvZiB0aGUgcG9pbnRzIGlzIG51bGwuCisgICAgICogQHBhcmFtIHAxCisgICAgICogICAgICAgICAgICB0aGUgc3RhcnRpbmcgcG9pbnQuCisgICAgICogQHBhcmFtIGNwMQorICAgICAqICAgICAgICAgICAgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuCisgICAgICogQHBhcmFtIGNwMgorICAgICAqICAgICAgICAgICAgdGhlIHNlY29uZCBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSBwMgorICAgICAqICAgICAgICAgICAgdGhlIGVuZCBwb2ludC4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW55IG9mIHRoZSBwb2ludHMgaXMgbnVsbC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDdXJ2ZShQb2ludDJEIHAxLCBQb2ludDJEIGNwMSwgUG9pbnQyRCBjcDIsIFBvaW50MkQgcDIpIHsKLSAgICAgICAgc2V0Q3VydmUoCi0gICAgICAgICAgICAgICAgcDEuZ2V0WCgpLCBwMS5nZXRZKCksCi0gICAgICAgICAgICAgICAgY3AxLmdldFgoKSwgY3AxLmdldFkoKSwKLSAgICAgICAgICAgICAgICBjcDIuZ2V0WCgpLCBjcDIuZ2V0WSgpLAotICAgICAgICAgICAgICAgIHAyLmdldFgoKSwgcDIuZ2V0WSgpKTsKKyAgICAgICAgc2V0Q3VydmUocDEuZ2V0WCgpLCBwMS5nZXRZKCksIGNwMS5nZXRYKCksIGNwMS5nZXRZKCksIGNwMi5nZXRYKCksIGNwMi5nZXRZKCksIHAyLmdldFgoKSwKKyAgICAgICAgICAgICAgICBwMi5nZXRZKCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRhdGEgb2YgdGhlIGN1cnZlIGJ5IHJlYWRpbmcgdGhlIGRhdGEgZnJvbSBhbiBhcnJheQotICAgICAqIG9mIHZhbHVlcy4gVGhlIHZhbHVlcyBhcmUgcmVhZCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgYXJndW1lbnRzCi0gICAgICogb2YgdGhlIG1ldGhvZCB7QGxpbmsgQ3ViaWNDdXJ2ZTJEI3NldEN1cnZlKGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlKX0uCisgICAgICogU2V0cyB0aGUgZGF0YSBvZiB0aGUgY3VydmUgYnkgcmVhZGluZyB0aGUgZGF0YSBmcm9tIGFuIGFycmF5IG9mIHZhbHVlcy4KKyAgICAgKiBUaGUgdmFsdWVzIGFyZSByZWFkIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBhcmd1bWVudHMgb2YgdGhlIG1ldGhvZAorICAgICAqIHtAbGluayBDdWJpY0N1cnZlMkQjc2V0Q3VydmUoZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUpfQorICAgICAqIC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29vcmRzIHRoZSBhcnJheSBvZiB2YWx1ZXMgY29udGFpbmluZyB0aGUgbmV3IGNvb3JkaW5hdGVzCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IG9mIHRoZSBkYXRhIHRvIHJlYWQgd2l0aGluIHRoZSBhcnJheQotICAgICAqIAotICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIGNvb3Jkcy5sZW5ndGggPCBvZmZzZXQgKyA4LgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGNvb3JkaW5hdGUgYXJyYXkgaXMgbnVsbC4KKyAgICAgKiBAcGFyYW0gY29vcmRzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgdmFsdWVzIGNvbnRhaW5pbmcgdGhlIG5ldyBjb29yZGluYXRlcy4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBkYXRhIHRvIHJlYWQgd2l0aGluIHRoZSBhcnJheS4KKyAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBjb29yZHMubGVuZ3RofSA8IG9mZnNldCArIDguCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjb29yZGluYXRlIGFycmF5IGlzIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q3VydmUoZG91YmxlW10gY29vcmRzLCBpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIHNldEN1cnZlKAotICAgICAgICAgICAgICAgIGNvb3Jkc1tvZmZzZXQgKyAwXSwgY29vcmRzW29mZnNldCArIDFdLAotICAgICAgICAgICAgICAgIGNvb3Jkc1tvZmZzZXQgKyAyXSwgY29vcmRzW29mZnNldCArIDNdLAotICAgICAgICAgICAgICAgIGNvb3Jkc1tvZmZzZXQgKyA0XSwgY29vcmRzW29mZnNldCArIDVdLAotICAgICAgICAgICAgICAgIGNvb3Jkc1tvZmZzZXQgKyA2XSwgY29vcmRzW29mZnNldCArIDddKTsKKyAgICAgICAgc2V0Q3VydmUoY29vcmRzW29mZnNldCArIDBdLCBjb29yZHNbb2Zmc2V0ICsgMV0sIGNvb3Jkc1tvZmZzZXQgKyAyXSwgY29vcmRzW29mZnNldCArIDNdLAorICAgICAgICAgICAgICAgIGNvb3Jkc1tvZmZzZXQgKyA0XSwgY29vcmRzW29mZnNldCArIDVdLCBjb29yZHNbb2Zmc2V0ICsgNl0sIGNvb3Jkc1tvZmZzZXQgKyA3XSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGF0YSBvZiB0aGUgY3VydmUgYnkgcmVhZGluZyB0aGUgZGF0YSBmcm9tIGFuIGFycmF5Ci0gICAgICogb2YgcG9pbnRzLiBUaGUgdmFsdWVzIGFyZSByZWFkIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBhcmd1bWVudHMKLSAgICAgKiBvZiB0aGUgbWV0aG9kIHtAbGluayBDdWJpY0N1cnZlMkQjc2V0Q3VydmUoUG9pbnQyRCwgUG9pbnQyRCwgUG9pbnQyRCwgUG9pbnQyRCl9CisgICAgICogU2V0cyB0aGUgZGF0YSBvZiB0aGUgY3VydmUgYnkgcmVhZGluZyB0aGUgZGF0YSBmcm9tIGFuIGFycmF5IG9mIHBvaW50cy4KKyAgICAgKiBUaGUgdmFsdWVzIGFyZSByZWFkIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBhcmd1bWVudHMgb2YgdGhlIG1ldGhvZAorICAgICAqIHtAbGluayBDdWJpY0N1cnZlMkQjc2V0Q3VydmUoUG9pbnQyRCwgUG9pbnQyRCwgUG9pbnQyRCwgUG9pbnQyRCl9CiAgICAgICogCi0gICAgICogQHBhcmFtIHBvaW50cyB0aGUgYXJyYXkgb2YgcG9pbnRzIGNvbnRhaW5pbmcgdGhlIG5ldyBjb29yZGluYXRlcwotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCBvZiB0aGUgZGF0YSB0byByZWFkIHdpdGhpbiB0aGUgYXJyYXkKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiBwb2ludHMubGVuZ3RoIDwgb2Zmc2V0ICsgLgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIHBvaW50IGFycmF5IGlzIG51bGwuCisgICAgICogQHBhcmFtIHBvaW50cworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIHBvaW50cyBjb250YWluaW5nIHRoZSBuZXcgY29vcmRpbmF0ZXMuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgZGF0YSB0byByZWFkIHdpdGhpbiB0aGUgYXJyYXkuCisgICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgcG9pbnRzLmxlbmd0aH0gPCBvZmZzZXQgKyAuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwb2ludCBhcnJheSBpcyBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEN1cnZlKFBvaW50MkRbXSBwb2ludHMsIGludCBvZmZzZXQpIHsKLSAgICAgICAgc2V0Q3VydmUoCi0gICAgICAgICAgICAgICAgcG9pbnRzW29mZnNldCArIDBdLmdldFgoKSwgcG9pbnRzW29mZnNldCArIDBdLmdldFkoKSwKLSAgICAgICAgICAgICAgICBwb2ludHNbb2Zmc2V0ICsgMV0uZ2V0WCgpLCBwb2ludHNbb2Zmc2V0ICsgMV0uZ2V0WSgpLAotICAgICAgICAgICAgICAgIHBvaW50c1tvZmZzZXQgKyAyXS5nZXRYKCksIHBvaW50c1tvZmZzZXQgKyAyXS5nZXRZKCksCisgICAgICAgIHNldEN1cnZlKHBvaW50c1tvZmZzZXQgKyAwXS5nZXRYKCksIHBvaW50c1tvZmZzZXQgKyAwXS5nZXRZKCksIHBvaW50c1tvZmZzZXQgKyAxXS5nZXRYKCksCisgICAgICAgICAgICAgICAgcG9pbnRzW29mZnNldCArIDFdLmdldFkoKSwgcG9pbnRzW29mZnNldCArIDJdLmdldFgoKSwgcG9pbnRzW29mZnNldCArIDJdLmdldFkoKSwKICAgICAgICAgICAgICAgICBwb2ludHNbb2Zmc2V0ICsgM10uZ2V0WCgpLCBwb2ludHNbb2Zmc2V0ICsgM10uZ2V0WSgpKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBkYXRhIG9mIHRoZSBjdXJ2ZSBieSBjb3B5aW5nIGl0IGZyb20gYW5vdGhlciBDdWJpY0N1cnZlMkQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGN1cnZlIHRoZSBjdXJ2ZSB0byBjb3B5IHRoZSBkYXRhIHBvaW50cyBmcm9tCi0gICAgICogCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgY3VydmUgaXMgbnVsbC4KKyAgICAgKiBAcGFyYW0gY3VydmUKKyAgICAgKiAgICAgICAgICAgIHRoZSBjdXJ2ZSB0byBjb3B5IHRoZSBkYXRhIHBvaW50cyBmcm9tLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgY3VydmUgaXMgbnVsbC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDdXJ2ZShDdWJpY0N1cnZlMkQgY3VydmUpIHsKLSAgICAgICAgc2V0Q3VydmUoCi0gICAgICAgICAgICAgICAgY3VydmUuZ2V0WDEoKSwgY3VydmUuZ2V0WTEoKSwKLSAgICAgICAgICAgICAgICBjdXJ2ZS5nZXRDdHJsWDEoKSwgY3VydmUuZ2V0Q3RybFkxKCksCi0gICAgICAgICAgICAgICAgY3VydmUuZ2V0Q3RybFgyKCksIGN1cnZlLmdldEN0cmxZMigpLAotICAgICAgICAgICAgICAgIGN1cnZlLmdldFgyKCksIGN1cnZlLmdldFkyKCkpOworICAgICAgICBzZXRDdXJ2ZShjdXJ2ZS5nZXRYMSgpLCBjdXJ2ZS5nZXRZMSgpLCBjdXJ2ZS5nZXRDdHJsWDEoKSwgY3VydmUuZ2V0Q3RybFkxKCksIGN1cnZlCisgICAgICAgICAgICAgICAgLmdldEN0cmxYMigpLCBjdXJ2ZS5nZXRDdHJsWTIoKSwgY3VydmUuZ2V0WDIoKSwgY3VydmUuZ2V0WTIoKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgc3F1YXJlIG9mIHRoZSBmbGF0bmVzcyBvZiB0aGlzIGN1cnZlLCB3aGVyZSB0aGUgZmxhdG5lc3MgaXMgdGhlIAotICAgICAqIG1heGltdW0gZGlzdGFuY2UgZnJvbSB0aGUgY3VydmVzIGNvbnRyb2wgcG9pbnRzIHRvIHRoZSAKLSAgICAgKiBsaW5lIHNlZ21lbnQgY29ubmVjdGluZyB0aGUgdHdvIHBvaW50cy4KKyAgICAgKiBHZXRzIHRoZSBzcXVhcmUgb2YgdGhlIGZsYXRuZXNzIG9mIHRoaXMgY3VydmUsIHdoZXJlIHRoZSBmbGF0bmVzcyBpcyB0aGUKKyAgICAgKiBtYXhpbXVtIGRpc3RhbmNlIGZyb20gdGhlIGN1cnZlcyBjb250cm9sIHBvaW50cyB0byB0aGUgbGluZSBzZWdtZW50CisgICAgICogY29ubmVjdGluZyB0aGUgdHdvIHBvaW50cy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzcXVhcmUgb2YgdGhlIGZsYXRuZXNzCisgICAgICogQHJldHVybiB0aGUgc3F1YXJlIG9mIHRoZSBmbGF0bmVzcy4KICAgICAgKi8KICAgICBwdWJsaWMgZG91YmxlIGdldEZsYXRuZXNzU3EoKSB7Ci0gICAgICAgIHJldHVybiBnZXRGbGF0bmVzc1NxKAotICAgICAgICAgICAgICAgIGdldFgxKCksIGdldFkxKCksCi0gICAgICAgICAgICAgICAgZ2V0Q3RybFgxKCksIGdldEN0cmxZMSgpLAotICAgICAgICAgICAgICAgIGdldEN0cmxYMigpLCBnZXRDdHJsWTIoKSwKKyAgICAgICAgcmV0dXJuIGdldEZsYXRuZXNzU3EoZ2V0WDEoKSwgZ2V0WTEoKSwgZ2V0Q3RybFgxKCksIGdldEN0cmxZMSgpLCBnZXRDdHJsWDIoKSwgZ2V0Q3RybFkyKCksCiAgICAgICAgICAgICAgICAgZ2V0WDIoKSwgZ2V0WTIoKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgc3F1YXJlIG9mIHRoZSBmbGF0bmVzcyBvZiB0aGUgY3ViaWMgY3VydmUgc2VnbWVudCAKLSAgICAgKiBkZWZpbmVkIGJ5IHRoZSBzcGVjaWZpZWQgdmFsdWVzLgorICAgICAqIEdldHMgdGhlIHNxdWFyZSBvZiB0aGUgZmxhdG5lc3Mgb2YgdGhlIGN1YmljIGN1cnZlIHNlZ21lbnQgZGVmaW5lZCBieSB0aGUKKyAgICAgKiBzcGVjaWZpZWQgdmFsdWVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4MSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludAotICAgICAqIEBwYXJhbSB5MSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludAotICAgICAqIEBwYXJhbSBjdHJseDEgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSBjdHJseTEgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSBjdHJseDIgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0gY3RybHkyIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHgyIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludAotICAgICAqIEBwYXJhbSB5MiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzcXVhcmUgb2YgdGhlIGZsYXRuZXNzCisgICAgICogQHBhcmFtIHgxCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludC4KKyAgICAgKiBAcGFyYW0geTEKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50LgorICAgICAqIEBwYXJhbSBjdHJseDEKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuCisgICAgICogQHBhcmFtIGN0cmx5MQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0gY3RybHgyCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0gY3RybHkyCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0geDIKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC4KKyAgICAgKiBAcGFyYW0geTIKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC4KKyAgICAgKiBAcmV0dXJuIHRoZSBzcXVhcmUgb2YgdGhlIGZsYXRuZXNzLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIGdldEZsYXRuZXNzU3EoZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSBjdHJseDEsIGRvdWJsZSBjdHJseTEsCi0gICAgICAgICAgICBkb3VibGUgY3RybHgyLCBkb3VibGUgY3RybHkyLCBkb3VibGUgeDIsIGRvdWJsZSB5MikKLSAgICB7Ci0gICAgICAgIHJldHVybiBNYXRoLm1heCgKLSAgICAgICAgICAgICAgICBMaW5lMkQucHRTZWdEaXN0U3EoeDEsIHkxLCB4MiwgeTIsIGN0cmx4MSwgY3RybHkxKSwKLSAgICAgICAgICAgICAgICBMaW5lMkQucHRTZWdEaXN0U3EoeDEsIHkxLCB4MiwgeTIsIGN0cmx4MiwgY3RybHkyKSk7CisgICAgICAgICAgICBkb3VibGUgY3RybHgyLCBkb3VibGUgY3RybHkyLCBkb3VibGUgeDIsIGRvdWJsZSB5MikgeworICAgICAgICByZXR1cm4gTWF0aC5tYXgoTGluZTJELnB0U2VnRGlzdFNxKHgxLCB5MSwgeDIsIHkyLCBjdHJseDEsIGN0cmx5MSksIExpbmUyRC5wdFNlZ0Rpc3RTcSh4MSwKKyAgICAgICAgICAgICAgICB5MSwgeDIsIHkyLCBjdHJseDIsIGN0cmx5MikpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNxdWFyZSBvZiB0aGUgZmxhdG5lc3Mgb2YgdGhlIGN1YmljIGN1cnZlIHNlZ21lbnQgCi0gICAgICogZGVmaW5lZCBieSB0aGUgc3BlY2lmaWVkIHZhbHVlcy4gVGhlIHZhbHVlcyBhcmUgcmVhZCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgYXJndW1lbnRzCi0gICAgICogb2YgdGhlIG1ldGhvZCB7QGxpbmsgQ3ViaWNDdXJ2ZTJEI2dldEZsYXRuZXNzU3EoZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUpfS4KKyAgICAgKiBHZXRzIHRoZSBzcXVhcmUgb2YgdGhlIGZsYXRuZXNzIG9mIHRoZSBjdWJpYyBjdXJ2ZSBzZWdtZW50IGRlZmluZWQgYnkgdGhlCisgICAgICogc3BlY2lmaWVkIHZhbHVlcy4gVGhlIHZhbHVlcyBhcmUgcmVhZCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgYXJndW1lbnRzCisgICAgICogb2YgdGhlIG1ldGhvZAorICAgICAqIHtAbGluayBDdWJpY0N1cnZlMkQjZ2V0RmxhdG5lc3NTcShkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSl9CisgICAgICogLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjb29yZHMgdGhlIGFycmF5IG9mIHBvaW50cyBjb250YWluaW5nIHRoZSBuZXcgY29vcmRpbmF0ZXMKLSAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgb2YgdGhlIGRhdGEgdG8gcmVhZCB3aXRoaW4gdGhlIGFycmF5Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc3F1YXJlIG9mIHRoZSBmbGF0bmVzcwotICAgICAqIAotICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHBvaW50cy5sZW5ndGggPCBvZmZzZXQgKyAuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgcG9pbnQgYXJyYXkgaXMgbnVsbC4KKyAgICAgKiBAcGFyYW0gY29vcmRzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgcG9pbnRzIGNvbnRhaW5pbmcgdGhlIG5ldyBjb29yZGluYXRlcy4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBkYXRhIHRvIHJlYWQgd2l0aGluIHRoZSBhcnJheS4KKyAgICAgKiBAcmV0dXJuIHRoZSBzcXVhcmUgb2YgdGhlIGZsYXRuZXNzLgorICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgcG9pbnRzLmxlbmd0aCA8IG9mZnNldCArIC4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHBvaW50IGFycmF5IGlzIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBkb3VibGUgZ2V0RmxhdG5lc3NTcShkb3VibGUgY29vcmRzW10sIGludCBvZmZzZXQpIHsKLSAgICAgICAgcmV0dXJuIGdldEZsYXRuZXNzU3EoCi0gICAgICAgICAgICAgICAgY29vcmRzW29mZnNldCArIDBdLCBjb29yZHNbb2Zmc2V0ICsgMV0sCi0gICAgICAgICAgICAgICAgY29vcmRzW29mZnNldCArIDJdLCBjb29yZHNbb2Zmc2V0ICsgM10sCi0gICAgICAgICAgICAgICAgY29vcmRzW29mZnNldCArIDRdLCBjb29yZHNbb2Zmc2V0ICsgNV0sCi0gICAgICAgICAgICAgICAgY29vcmRzW29mZnNldCArIDZdLCBjb29yZHNbb2Zmc2V0ICsgN10pOworICAgICAgICByZXR1cm4gZ2V0RmxhdG5lc3NTcShjb29yZHNbb2Zmc2V0ICsgMF0sIGNvb3Jkc1tvZmZzZXQgKyAxXSwgY29vcmRzW29mZnNldCArIDJdLAorICAgICAgICAgICAgICAgIGNvb3Jkc1tvZmZzZXQgKyAzXSwgY29vcmRzW29mZnNldCArIDRdLCBjb29yZHNbb2Zmc2V0ICsgNV0sIGNvb3Jkc1tvZmZzZXQgKyA2XSwKKyAgICAgICAgICAgICAgICBjb29yZHNbb2Zmc2V0ICsgN10pOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGZsYXRuZXNzIG9mIHRoaXMgY3VydmUsIHdoZXJlIHRoZSBmbGF0bmVzcyBpcyB0aGUgCi0gICAgICogbWF4aW11bSBkaXN0YW5jZSBmcm9tIHRoZSBjdXJ2ZXMgY29udHJvbCBwb2ludHMgdG8gdGhlIAotICAgICAqIGxpbmUgc2VnbWVudCBjb25uZWN0aW5nIHRoZSB0d28gcG9pbnRzLgorICAgICAqIEdldHMgdGhlIGZsYXRuZXNzIG9mIHRoaXMgY3VydmUsIHdoZXJlIHRoZSBmbGF0bmVzcyBpcyB0aGUgbWF4aW11bQorICAgICAqIGRpc3RhbmNlIGZyb20gdGhlIGN1cnZlcyBjb250cm9sIHBvaW50cyB0byB0aGUgbGluZSBzZWdtZW50IGNvbm5lY3RpbmcKKyAgICAgKiB0aGUgdHdvIHBvaW50cy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBmbGF0bmVzcyBvZiB0aGlzIGN1cnZlCisgICAgICogQHJldHVybiB0aGUgZmxhdG5lc3Mgb2YgdGhpcyBjdXJ2ZS4KICAgICAgKi8KICAgICBwdWJsaWMgZG91YmxlIGdldEZsYXRuZXNzKCkgewotICAgICAgICByZXR1cm4gZ2V0RmxhdG5lc3MoCi0gICAgICAgICAgICAgICAgZ2V0WDEoKSwgZ2V0WTEoKSwKLSAgICAgICAgICAgICAgICBnZXRDdHJsWDEoKSwgZ2V0Q3RybFkxKCksCi0gICAgICAgICAgICAgICAgZ2V0Q3RybFgyKCksIGdldEN0cmxZMigpLAorICAgICAgICByZXR1cm4gZ2V0RmxhdG5lc3MoZ2V0WDEoKSwgZ2V0WTEoKSwgZ2V0Q3RybFgxKCksIGdldEN0cmxZMSgpLCBnZXRDdHJsWDIoKSwgZ2V0Q3RybFkyKCksCiAgICAgICAgICAgICAgICAgZ2V0WDIoKSwgZ2V0WTIoKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgZmxhdG5lc3Mgb2YgdGhlIGN1YmljIGN1cnZlIHNlZ21lbnQgCi0gICAgICogZGVmaW5lZCBieSB0aGUgc3BlY2lmaWVkIHZhbHVlcy4KKyAgICAgKiBHZXRzIHRoZSBmbGF0bmVzcyBvZiB0aGUgY3ViaWMgY3VydmUgc2VnbWVudCBkZWZpbmVkIGJ5IHRoZSBzcGVjaWZpZWQKKyAgICAgKiB2YWx1ZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHgxIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50Ci0gICAgICogQHBhcmFtIHkxIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50Ci0gICAgICogQHBhcmFtIGN0cmx4MSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIGN0cmx5MSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIGN0cmx4MiB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSBjdHJseTIgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0geDIgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50Ci0gICAgICogQHBhcmFtIHkyIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZsYXRuZXNzCisgICAgICogQHBhcmFtIHgxCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludC4KKyAgICAgKiBAcGFyYW0geTEKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50LgorICAgICAqIEBwYXJhbSBjdHJseDEKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuCisgICAgICogQHBhcmFtIGN0cmx5MQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0gY3RybHgyCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0gY3RybHkyCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0geDIKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC4KKyAgICAgKiBAcGFyYW0geTIKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC4KKyAgICAgKiBAcmV0dXJuIHRoZSBmbGF0bmVzcy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBnZXRGbGF0bmVzcyhkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIGN0cmx4MSwgZG91YmxlIGN0cmx5MSwKLSAgICAgICAgICAgIGRvdWJsZSBjdHJseDIsIGRvdWJsZSBjdHJseTIsIGRvdWJsZSB4MiwgZG91YmxlIHkyKQotICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBjdHJseDIsIGRvdWJsZSBjdHJseTIsIGRvdWJsZSB4MiwgZG91YmxlIHkyKSB7CiAgICAgICAgIHJldHVybiBNYXRoLnNxcnQoZ2V0RmxhdG5lc3NTcSh4MSwgeTEsIGN0cmx4MSwgY3RybHkxLCBjdHJseDIsIGN0cmx5MiwgeDIsIHkyKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgZmxhdG5lc3Mgb2YgdGhlIGN1YmljIGN1cnZlIHNlZ21lbnQgCi0gICAgICogZGVmaW5lZCBieSB0aGUgc3BlY2lmaWVkIHZhbHVlcy4gVGhlIHZhbHVlcyBhcmUgcmVhZCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgYXJndW1lbnRzCi0gICAgICogb2YgdGhlIG1ldGhvZCB7QGxpbmsgQ3ViaWNDdXJ2ZTJEI2dldEZsYXRuZXNzKGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlKX0uCisgICAgICogR2V0cyB0aGUgZmxhdG5lc3Mgb2YgdGhlIGN1YmljIGN1cnZlIHNlZ21lbnQgZGVmaW5lZCBieSB0aGUgc3BlY2lmaWVkCisgICAgICogdmFsdWVzLiBUaGUgdmFsdWVzIGFyZSByZWFkIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBhcmd1bWVudHMgb2YgdGhlCisgICAgICogbWV0aG9kCisgICAgICoge0BsaW5rIEN1YmljQ3VydmUyRCNnZXRGbGF0bmVzcyhkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSl9CisgICAgICogLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjb29yZHMgdGhlIGFycmF5IG9mIHBvaW50cyBjb250YWluaW5nIHRoZSBuZXcgY29vcmRpbmF0ZXMKLSAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgb2YgdGhlIGRhdGEgdG8gcmVhZCB3aXRoaW4gdGhlIGFycmF5Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZmxhdG5lc3MKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiBwb2ludHMubGVuZ3RoIDwgb2Zmc2V0ICsgLgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIHBvaW50IGFycmF5IGlzIG51bGwuCisgICAgICogQHBhcmFtIGNvb3JkcworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIHBvaW50cyBjb250YWluaW5nIHRoZSBuZXcgY29vcmRpbmF0ZXMuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgZGF0YSB0byByZWFkIHdpdGhpbiB0aGUgYXJyYXkuCisgICAgICogQHJldHVybiB0aGUgZmxhdG5lc3MuCisgICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBwb2ludHMubGVuZ3RoIDwgb2Zmc2V0ICsgLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcG9pbnQgYXJyYXkgaXMgbnVsbC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBnZXRGbGF0bmVzcyhkb3VibGUgY29vcmRzW10sIGludCBvZmZzZXQpIHsKLSAgICAgICAgcmV0dXJuIGdldEZsYXRuZXNzKAotICAgICAgICAgICAgICAgIGNvb3Jkc1tvZmZzZXQgKyAwXSwgY29vcmRzW29mZnNldCArIDFdLAotICAgICAgICAgICAgICAgIGNvb3Jkc1tvZmZzZXQgKyAyXSwgY29vcmRzW29mZnNldCArIDNdLAotICAgICAgICAgICAgICAgIGNvb3Jkc1tvZmZzZXQgKyA0XSwgY29vcmRzW29mZnNldCArIDVdLAotICAgICAgICAgICAgICAgIGNvb3Jkc1tvZmZzZXQgKyA2XSwgY29vcmRzW29mZnNldCArIDddKTsKKyAgICAgICAgcmV0dXJuIGdldEZsYXRuZXNzKGNvb3Jkc1tvZmZzZXQgKyAwXSwgY29vcmRzW29mZnNldCArIDFdLCBjb29yZHNbb2Zmc2V0ICsgMl0sCisgICAgICAgICAgICAgICAgY29vcmRzW29mZnNldCArIDNdLCBjb29yZHNbb2Zmc2V0ICsgNF0sIGNvb3Jkc1tvZmZzZXQgKyA1XSwgY29vcmRzW29mZnNldCArIDZdLAorICAgICAgICAgICAgICAgIGNvb3Jkc1tvZmZzZXQgKyA3XSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgZGF0YSBmb3IgdHdvIGN1YmljIGN1cnZlcyBieSBkaXZpZGluZyB0aGlzCi0gICAgICogY3VydmUgaW4gdHdvLiBUaGUgZGl2aXNpb24gcG9pbnQgaXMgdGhlIHBvaW50IG9uIHRoZSBjdXJ2ZSAKLSAgICAgKiB0aGF0IGlzIGNsb3Nlc3QgdG8gdGhlIGF2ZXJhZ2Ugb2YgY3VydmUncyB0d28gY29udHJvbCBwb2ludHMuIAotICAgICAqIFRoZSB0d28gbmV3IGNvbnRyb2wgcG9pbnRzIChuZWFyZXN0IHRoZSBuZXcgZW5kcG9pbnQpIGFyZSBjb21wdXRlZAotICAgICAqIGJ5IGF2ZXJhZ2luZyB0aGUgb3JpZ2luYWwgY29udHJvbCBwb2ludHMgd2l0aCB0aGUgbmV3IGVuZHBvaW50LgotICAgICAqIFRoZSBkYXRhIG9mIHRoaXMgY3VydmUgaXMgbGVmdCB1bmNoYW5nZWQuCisgICAgICogQ3JlYXRlcyB0aGUgZGF0YSBmb3IgdHdvIGN1YmljIGN1cnZlcyBieSBkaXZpZGluZyB0aGlzIGN1cnZlIGluIHR3by4gVGhlCisgICAgICogZGl2aXNpb24gcG9pbnQgaXMgdGhlIHBvaW50IG9uIHRoZSBjdXJ2ZSB0aGF0IGlzIGNsb3Nlc3QgdG8gdGhlIGF2ZXJhZ2UKKyAgICAgKiBvZiBjdXJ2ZSdzIHR3byBjb250cm9sIHBvaW50cy4gVGhlIHR3byBuZXcgY29udHJvbCBwb2ludHMgKG5lYXJlc3QgdGhlCisgICAgICogbmV3IGVuZHBvaW50KSBhcmUgY29tcHV0ZWQgYnkgYXZlcmFnaW5nIHRoZSBvcmlnaW5hbCBjb250cm9sIHBvaW50cyB3aXRoCisgICAgICogdGhlIG5ldyBlbmRwb2ludC4gVGhlIGRhdGEgb2YgdGhpcyBjdXJ2ZSBpcyBsZWZ0IHVuY2hhbmdlZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGVmdCB0aGUgQ3ViaWNDdXJ2ZTJEIHdoZXJlIHRoZSBsZWZ0IChzdGFydCkgc2VnbWVudCdzIAotICAgICAqIGRhdGEgaXMgd3JpdHRlbgotICAgICAqIEBwYXJhbSByaWdodCB0aGUgQ3ViaWNDdXJ2ZTJEIHdoZXJlIHRoZSByaWdodCAoZW5kKSBzZWdtZW50J3MgCi0gICAgICogZGF0YSBpcyB3cml0dGVuCi0gICAgICogCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBlaXRoZXIgY3VydmUgaXMgbnVsbC4KKyAgICAgKiBAcGFyYW0gbGVmdAorICAgICAqICAgICAgICAgICAgdGhlIEN1YmljQ3VydmUyRCB3aGVyZSB0aGUgbGVmdCAoc3RhcnQpIHNlZ21lbnQncyBkYXRhIGlzCisgICAgICogICAgICAgICAgICB3cml0dGVuLgorICAgICAqIEBwYXJhbSByaWdodAorICAgICAqICAgICAgICAgICAgdGhlIEN1YmljQ3VydmUyRCB3aGVyZSB0aGUgcmlnaHQgKGVuZCkgc2VnbWVudCdzIGRhdGEgaXMKKyAgICAgKiAgICAgICAgICAgIHdyaXR0ZW4uCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGVpdGhlciBjdXJ2ZSBpcyBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHN1YmRpdmlkZShDdWJpY0N1cnZlMkQgbGVmdCwgQ3ViaWNDdXJ2ZTJEIHJpZ2h0KSB7CiAgICAgICAgIHN1YmRpdmlkZSh0aGlzLCBsZWZ0LCByaWdodCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgZGF0YSBmb3IgdHdvIGN1YmljIGN1cnZlcyBieSBkaXZpZGluZyB0aGUgc3BlY2lmaWVkCi0gICAgICogY3VydmUgaW4gdHdvLiBUaGUgZGl2aXNpb24gcG9pbnQgaXMgdGhlIHBvaW50IG9uIHRoZSBjdXJ2ZSAKLSAgICAgKiB0aGF0IGlzIGNsb3Nlc3QgdG8gdGhlIGF2ZXJhZ2Ugb2YgY3VydmUncyB0d28gY29udHJvbCBwb2ludHMuIAotICAgICAqIFRoZSB0d28gbmV3IGNvbnRyb2wgcG9pbnRzIChuZWFyZXN0IHRoZSBuZXcgZW5kcG9pbnQpIGFyZSBjb21wdXRlZAotICAgICAqIGJ5IGF2ZXJhZ2luZyB0aGUgb3JpZ2luYWwgY29udHJvbCBwb2ludHMgd2l0aCB0aGUgbmV3IGVuZHBvaW50LgotICAgICAqIFRoZSBkYXRhIG9mIHRoZSBzb3VyY2UgY3VydmUgaXMgbGVmdCB1bmNoYW5nZWQuCisgICAgICogQ3JlYXRlcyB0aGUgZGF0YSBmb3IgdHdvIGN1YmljIGN1cnZlcyBieSBkaXZpZGluZyB0aGUgc3BlY2lmaWVkIGN1cnZlIGluCisgICAgICogdHdvLiBUaGUgZGl2aXNpb24gcG9pbnQgaXMgdGhlIHBvaW50IG9uIHRoZSBjdXJ2ZSB0aGF0IGlzIGNsb3Nlc3QgdG8gdGhlCisgICAgICogYXZlcmFnZSBvZiBjdXJ2ZSdzIHR3byBjb250cm9sIHBvaW50cy4gVGhlIHR3byBuZXcgY29udHJvbCBwb2ludHMKKyAgICAgKiAobmVhcmVzdCB0aGUgbmV3IGVuZHBvaW50KSBhcmUgY29tcHV0ZWQgYnkgYXZlcmFnaW5nIHRoZSBvcmlnaW5hbCBjb250cm9sCisgICAgICogcG9pbnRzIHdpdGggdGhlIG5ldyBlbmRwb2ludC4gVGhlIGRhdGEgb2YgdGhlIHNvdXJjZSBjdXJ2ZSBpcyBsZWZ0CisgICAgICogdW5jaGFuZ2VkLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzcmMgdGhlIG9yaWdpbmFsIGN1cnZlIHRvIGJlIGRpdmlkZWQgaW4gdHdvCi0gICAgICogQHBhcmFtIGxlZnQgdGhlIEN1YmljQ3VydmUyRCB3aGVyZSB0aGUgbGVmdCAoc3RhcnQpIHNlZ21lbnQncyAKLSAgICAgKiBkYXRhIGlzIHdyaXR0ZW4KLSAgICAgKiBAcGFyYW0gcmlnaHQgdGhlIEN1YmljQ3VydmUyRCB3aGVyZSB0aGUgcmlnaHQgKGVuZCkgc2VnbWVudCdzIAotICAgICAqIGRhdGEgaXMgd3JpdHRlbgotICAgICAqIAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgZWl0aGVyIGN1cnZlIGlzIG51bGwuCisgICAgICogQHBhcmFtIHNyYworICAgICAqICAgICAgICAgICAgdGhlIG9yaWdpbmFsIGN1cnZlIHRvIGJlIGRpdmlkZWQgaW4gdHdvLgorICAgICAqIEBwYXJhbSBsZWZ0CisgICAgICogICAgICAgICAgICB0aGUgQ3ViaWNDdXJ2ZTJEIHdoZXJlIHRoZSBsZWZ0IChzdGFydCkgc2VnbWVudCdzIGRhdGEgaXMKKyAgICAgKiAgICAgICAgICAgIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIHJpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgQ3ViaWNDdXJ2ZTJEIHdoZXJlIHRoZSByaWdodCAoZW5kKSBzZWdtZW50J3MgZGF0YSBpcworICAgICAqICAgICAgICAgICAgd3JpdHRlbi4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgZWl0aGVyIGN1cnZlIGlzIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHN1YmRpdmlkZShDdWJpY0N1cnZlMkQgc3JjLCBDdWJpY0N1cnZlMkQgbGVmdCwgQ3ViaWNDdXJ2ZTJEIHJpZ2h0KSB7CiAgICAgICAgIGRvdWJsZSB4MSA9IHNyYy5nZXRYMSgpOwpAQCAtNzkxLDI3ICs4ODMsMzYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBkYXRhIGZvciB0d28gY3ViaWMgY3VydmVzIGJ5IGRpdmlkaW5nIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBjdXJ2ZSBpbiB0d28uIFRoZSBkaXZpc2lvbiBwb2ludCBpcyB0aGUgcG9pbnQgb24gdGhlIGN1cnZlIAotICAgICAqIHRoYXQgaXMgY2xvc2VzdCB0byB0aGUgYXZlcmFnZSBvZiBjdXJ2ZSdzIHR3byBjb250cm9sIHBvaW50cy4gCi0gICAgICogVGhlIHR3byBuZXcgY29udHJvbCBwb2ludHMgKG5lYXJlc3QgdGhlIG5ldyBlbmRwb2ludCkgYXJlIGNvbXB1dGVkCi0gICAgICogYnkgYXZlcmFnaW5nIHRoZSBvcmlnaW5hbCBjb250cm9sIHBvaW50cyB3aXRoIHRoZSBuZXcgZW5kcG9pbnQuCi0gICAgICogVGhlIGRhdGEgb2YgdGhlIHNvdXJjZSBjdXJ2ZSBpcyBsZWZ0IHVuY2hhbmdlZC4gVGhlIGRhdGEgZm9yIHRoZSAKLSAgICAgKiB0aHJlZSBjdXJ2ZXMgaXMgcmVhZC93cml0dGVuIGluIHRoZSB1c3VhbCBvcmRlcjogeyB4MSwgeTEsIAotICAgICAqIGN0cmx4MSwgY3RybHkxLCBjdHJseDIsIGNydHJ5MiwgeDIsIHkzIH0KKyAgICAgKiBDcmVhdGVzIHRoZSBkYXRhIGZvciB0d28gY3ViaWMgY3VydmVzIGJ5IGRpdmlkaW5nIHRoZSBzcGVjaWZpZWQgY3VydmUgaW4KKyAgICAgKiB0d28uIFRoZSBkaXZpc2lvbiBwb2ludCBpcyB0aGUgcG9pbnQgb24gdGhlIGN1cnZlIHRoYXQgaXMgY2xvc2VzdCB0byB0aGUKKyAgICAgKiBhdmVyYWdlIG9mIGN1cnZlJ3MgdHdvIGNvbnRyb2wgcG9pbnRzLiBUaGUgdHdvIG5ldyBjb250cm9sIHBvaW50cworICAgICAqIChuZWFyZXN0IHRoZSBuZXcgZW5kcG9pbnQpIGFyZSBjb21wdXRlZCBieSBhdmVyYWdpbmcgdGhlIG9yaWdpbmFsIGNvbnRyb2wKKyAgICAgKiBwb2ludHMgd2l0aCB0aGUgbmV3IGVuZHBvaW50LiBUaGUgZGF0YSBvZiB0aGUgc291cmNlIGN1cnZlIGlzIGxlZnQKKyAgICAgKiB1bmNoYW5nZWQuIFRoZSBkYXRhIGZvciB0aGUgdGhyZWUgY3VydmVzIGlzIHJlYWQvd3JpdHRlbiBpbiB0aGUgdXN1YWwKKyAgICAgKiBvcmRlcjogeyB4MSwgeTEsIGN0cmx4MSwgY3RybHkxLCBjdHJseDIsIGNydHJ5MiwgeDIsIHkzIH0KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3JjIHRoZSBhcnJheSB0aGF0IGdpdmVzIHRoZSBkYXRhIHZhbHVlcyBmb3IgdGhlIHNvdXJjZSBjdXJ2ZQotICAgICAqIEBwYXJhbSBzcmNPZmYgdGhlIG9mZnNldCBpbiB0aGUgc3JjIGFycmF5IHRvIHJlYWQgdGhlIHZhbHVlcyBmcm9tCi0gICAgICogQHBhcmFtIGxlZnQgdGhlIGFycmF5IHdoZXJlIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgc3RhcnQgY3VydmUgc2hvdWxkIGJlIHdyaXR0ZW4KLSAgICAgKiBAcGFyYW0gbGVmdE9mZiB0aGUgb2Zmc2V0IGluIHRoZSBsZWZ0IGFycmF5IHRvIHN0YXJ0IHdyaXRpbmcgdGhlIHZhbHVlcwotICAgICAqIEBwYXJhbSByaWdodCB0aGUgYXJyYXkgd2hlcmUgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBlbmQgY3VydmUgc2hvdWxkIGJlIHdyaXR0ZW4KLSAgICAgKiBAcGFyYW0gcmlnaHRPZmYgdGhlIG9mZnNldCBpbiB0aGUgcmlnaHQgYXJyYXkgdG8gc3RhcnQgd3JpdGluZyB0aGUgdmFsdWVzCi0gICAgICogCi0gICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgc3JjLmxlbmd0aCA8IHNyY29mZiArIDgKLSAgICAgKiBvciBpZiBsZWZ0Lmxlbmd0aCA8IGxlZnRPZmYgKyA4IG9yIGlmIHJpZ2h0Lmxlbmd0aCA8IHJpZ2h0T2ZmICsgOC4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIG9uZSBvZiB0aGUgYXJyYXlzIGlzIG51bGwuCisgICAgICogQHBhcmFtIHNyYworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IHRoYXQgZ2l2ZXMgdGhlIGRhdGEgdmFsdWVzIGZvciB0aGUgc291cmNlIGN1cnZlLgorICAgICAqIEBwYXJhbSBzcmNPZmYKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gdGhlIHNyYyBhcnJheSB0byByZWFkIHRoZSB2YWx1ZXMgZnJvbS4KKyAgICAgKiBAcGFyYW0gbGVmdAorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IHdoZXJlIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgc3RhcnQgY3VydmUgc2hvdWxkIGJlCisgICAgICogICAgICAgICAgICB3cml0dGVuLgorICAgICAqIEBwYXJhbSBsZWZ0T2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSBsZWZ0IGFycmF5IHRvIHN0YXJ0IHdyaXRpbmcgdGhlIHZhbHVlcy4KKyAgICAgKiBAcGFyYW0gcmlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSB3aGVyZSB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGVuZCBjdXJ2ZSBzaG91bGQgYmUKKyAgICAgKiAgICAgICAgICAgIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIHJpZ2h0T2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSByaWdodCBhcnJheSB0byBzdGFydCB3cml0aW5nIHRoZSB2YWx1ZXMuCisgICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBzcmMubGVuZ3RoIDwgc3Jjb2ZmICsgOCBvciBpZiBsZWZ0Lmxlbmd0aCA8IGxlZnRPZmYgKyA4IG9yCisgICAgICogICAgICAgICAgICAgaWYgcmlnaHQubGVuZ3RoIDwgcmlnaHRPZmYgKyA4LgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBvbmUgb2YgdGhlIGFycmF5cyBpcyBudWxsLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzdWJkaXZpZGUoZG91YmxlIHNyY1tdLCBpbnQgc3JjT2ZmLCBkb3VibGUgbGVmdFtdLCBpbnQgbGVmdE9mZiwgZG91YmxlIHJpZ2h0W10sIGludCByaWdodE9mZikgeworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzdWJkaXZpZGUoZG91YmxlIHNyY1tdLCBpbnQgc3JjT2ZmLCBkb3VibGUgbGVmdFtdLCBpbnQgbGVmdE9mZiwKKyAgICAgICAgICAgIGRvdWJsZSByaWdodFtdLCBpbnQgcmlnaHRPZmYpIHsKICAgICAgICAgZG91YmxlIHgxID0gc3JjW3NyY09mZiArIDBdOwogICAgICAgICBkb3VibGUgeTEgPSBzcmNbc3JjT2ZmICsgMV07CiAgICAgICAgIGRvdWJsZSBjeDEgPSBzcmNbc3JjT2ZmICsgMl07CkBAIC04NTUsNDIgKzk1Niw0MyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEZpbmRzIHRoZSByb290cyBvZiB0aGUgY3ViaWMgcG9seW5vbWlhbC4gVGhpcyBpcyAKLSAgICAgKiBhY2NvbXBsaXNoZWQgYnkgZmluZGluZyB0aGUgKHJlYWwpIHZhbHVlcyBvZiB4IHRoYXQgc29sdmUKLSAgICAgKiB0aGUgZm9sbG93aW5nIGVxdWF0aW9uOiBlcW5bM10qeCp4KnggKyBlcW5bMl0qeCp4ICsgZXFuWzFdKnggKyBlcW5bMF0gPSAwLgotICAgICAqIFRoZSBzb2x1dGlvbnMgYXJlIHdyaXR0ZW4gYmFjayBpbnRvIHRoZSBhcnJheSBlcW4gc3RhcnRpbmcKLSAgICAgKiBmcm9tIHRoZSBpbmRleCAwIGluIHRoZSBhcnJheS4gVGhlIHJldHVybiB2YWx1ZSB0ZWxscyBob3cgCi0gICAgICogbWFueSBhcnJheSBlbGVtZW50cyBoYXZlIGJlZW4gY2hhbmdlZCBieSB0aGlzIG1ldGhvZCBjYWxsLgorICAgICAqIEZpbmRzIHRoZSByb290cyBvZiB0aGUgY3ViaWMgcG9seW5vbWlhbC4gVGhpcyBpcyBhY2NvbXBsaXNoZWQgYnkgZmluZGluZworICAgICAqIHRoZSAocmVhbCkgdmFsdWVzIG9mIHggdGhhdCBzb2x2ZSB0aGUgZm9sbG93aW5nIGVxdWF0aW9uOiBlcW5bM10qeCp4KnggKworICAgICAqIGVxblsyXSp4KnggKyBlcW5bMV0qeCArIGVxblswXSA9IDAuIFRoZSBzb2x1dGlvbnMgYXJlIHdyaXR0ZW4gYmFjayBpbnRvCisgICAgICogdGhlIGFycmF5IGVxbiBzdGFydGluZyBmcm9tIHRoZSBpbmRleCAwIGluIHRoZSBhcnJheS4gVGhlIHJldHVybiB2YWx1ZQorICAgICAqIHRlbGxzIGhvdyBtYW55IGFycmF5IGVsZW1lbnRzIGhhdmUgYmVlbiBjaGFuZ2VkIGJ5IHRoaXMgbWV0aG9kIGNhbGwuCiAgICAgICogCi0gICAgICogQHBhcmFtIGVxbiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBjb2VmZmljaWVudHMgb2YgdGhlIAotICAgICAqIGN1YmljIHBvbHlub21pYWwgdG8gc29sdmUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHJvb3RzIG9mIHRoZSBjdWJpYyBwb2x5bm9taWFsCi0gICAgICogCi0gICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgZXFuLmxlbmd0aCA8IDQuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgYXJyYXkgaXMgbnVsbC4KKyAgICAgKiBAcGFyYW0gZXFuCisgICAgICogICAgICAgICAgICBhbiBhcnJheSBjb250YWluaW5nIHRoZSBjb2VmZmljaWVudHMgb2YgdGhlIGN1YmljIHBvbHlub21pYWwKKyAgICAgKiAgICAgICAgICAgIHRvIHNvbHZlLgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiByb290cyBvZiB0aGUgY3ViaWMgcG9seW5vbWlhbC4KKyAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGVxbi5sZW5ndGggPCA0LgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgYXJyYXkgaXMgbnVsbC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGludCBzb2x2ZUN1YmljKGRvdWJsZSBlcW5bXSkgewogICAgICAgICByZXR1cm4gc29sdmVDdWJpYyhlcW4sIGVxbik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRmluZHMgdGhlIHJvb3RzIG9mIHRoZSBjdWJpYyBwb2x5bm9taWFsLiBUaGlzIGlzIAotICAgICAqIGFjY29tcGxpc2hlZCBieSBmaW5kaW5nIHRoZSAocmVhbCkgdmFsdWVzIG9mIHggdGhhdCBzb2x2ZQotICAgICAqIHRoZSBmb2xsb3dpbmcgZXF1YXRpb246IGVxblszXSp4KngqeCArIGVxblsyXSp4KnggKyBlcW5bMV0qeCArIGVxblswXSA9IDAuCi0gICAgICogVGhlIHNvbHV0aW9ucyBhcmUgd3JpdHRlbiBpbnRvIHRoZSBhcnJheSByZXMgc3RhcnRpbmcKLSAgICAgKiBmcm9tIHRoZSBpbmRleCAwIGluIHRoZSBhcnJheS4gVGhlIHJldHVybiB2YWx1ZSB0ZWxscyBob3cgCi0gICAgICogbWFueSBhcnJheSBlbGVtZW50cyBoYXZlIGJlZW4gY2hhbmdlZCBieSB0aGlzIG1ldGhvZCBjYWxsLgorICAgICAqIEZpbmRzIHRoZSByb290cyBvZiB0aGUgY3ViaWMgcG9seW5vbWlhbC4gVGhpcyBpcyBhY2NvbXBsaXNoZWQgYnkgZmluZGluZworICAgICAqIHRoZSAocmVhbCkgdmFsdWVzIG9mIHggdGhhdCBzb2x2ZSB0aGUgZm9sbG93aW5nIGVxdWF0aW9uOiBlcW5bM10qeCp4KnggKworICAgICAqIGVxblsyXSp4KnggKyBlcW5bMV0qeCArIGVxblswXSA9IDAuIFRoZSBzb2x1dGlvbnMgYXJlIHdyaXR0ZW4gaW50byB0aGUKKyAgICAgKiBhcnJheSByZXMgc3RhcnRpbmcgZnJvbSB0aGUgaW5kZXggMCBpbiB0aGUgYXJyYXkuIFRoZSByZXR1cm4gdmFsdWUgdGVsbHMKKyAgICAgKiBob3cgbWFueSBhcnJheSBlbGVtZW50cyBoYXZlIGJlZW4gY2hhbmdlZCBieSB0aGlzIG1ldGhvZCBjYWxsLgogICAgICAqIAotICAgICAqIEBwYXJhbSBlcW4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgY29lZmZpY2llbnRzIG9mIHRoZSAKLSAgICAgKiBjdWJpYyBwb2x5bm9taWFsIHRvIHNvbHZlLgotICAgICAqIEBwYXJhbSByZXMgdGhlIGFycmF5IHRoYXQgdGhpcyBtZXRob2Qgd3JpdGVzIHRoZSByZXN1bHRzIGludG8KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2Ygcm9vdHMgb2YgdGhlIGN1YmljIHBvbHlub21pYWwKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiBlcW4ubGVuZ3RoIDwgNCBvciAKLSAgICAgKiBpZiByZXMubGVuZ3RoIGlzIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIHJvb3RzLgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgZWl0aGVyIGFycmF5IGlzIG51bGwuCisgICAgICogQHBhcmFtIGVxbgorICAgICAqICAgICAgICAgICAgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgY29lZmZpY2llbnRzIG9mIHRoZSBjdWJpYyBwb2x5bm9taWFsCisgICAgICogICAgICAgICAgICB0byBzb2x2ZS4KKyAgICAgKiBAcGFyYW0gcmVzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgdGhhdCB0aGlzIG1ldGhvZCB3cml0ZXMgdGhlIHJlc3VsdHMgaW50by4KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2Ygcm9vdHMgb2YgdGhlIGN1YmljIHBvbHlub21pYWwuCisgICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBlcW4ubGVuZ3RoIDwgNCBvciBpZiByZXMubGVuZ3RoIGlzIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mCisgICAgICogICAgICAgICAgICAgcm9vdHMuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGVpdGhlciBhcnJheSBpcyBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgaW50IHNvbHZlQ3ViaWMoZG91YmxlIGVxbltdLCBkb3VibGUgcmVzW10pIHsKICAgICAgICAgcmV0dXJuIENyb3NzaW5nLnNvbHZlQ3ViaWMoZXFuLCByZXMpOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2dlb20vRGltZW5zaW9uMkQuamF2YSBiL2F3dC9qYXZhL2F3dC9nZW9tL0RpbWVuc2lvbjJELmphdmEKaW5kZXggZWVmNjNlNi4uZWEwODFjNSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2dlb20vRGltZW5zaW9uMkQuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZ2VvbS9EaW1lbnNpb24yRC5qYXZhCkBAIC0xOCwxMiArMTgsMTUgQEAKICAqIEBhdXRob3IgRGVuaXMgTS4gS2lzaGVua28KICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0Lmdlb207CiAKIC8qKgotICogVGhlIENsYXNzIERpbWVuc2lvbjJEIHJlcHJlc2VudHMgYSBzaXplICh3aWR0aCBhbmQgaGVpZ2h0KSBvZiBhIAotICogZ2VvbWV0cmljIG9iamVjdC4gSXQgc3RvcmVzIGRvdWJsZS12YWx1ZWQgZGF0YSBpbiBvcmRlciB0byBiZSBjb21wYXRpYmxlCi0gKiB3aXRoIGhpZ2gtcHJlY2lzaW9uIGdlb21ldHJpYyBvcGVyYXRpb25zLgorICogVGhlIENsYXNzIERpbWVuc2lvbjJEIHJlcHJlc2VudHMgYSBzaXplICh3aWR0aCBhbmQgaGVpZ2h0KSBvZiBhIGdlb21ldHJpYworICogb2JqZWN0LiBJdCBzdG9yZXMgZG91YmxlLXZhbHVlZCBkYXRhIGluIG9yZGVyIHRvIGJlIGNvbXBhdGlibGUgd2l0aAorICogaGlnaC1wcmVjaXNpb24gZ2VvbWV0cmljIG9wZXJhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGltZW5zaW9uMkQgaW1wbGVtZW50cyBDbG9uZWFibGUgewogCkBAIC0zNiwzMSArMzksMzQgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSB3aWR0aC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB3aWR0aAorICAgICAqIEByZXR1cm4gdGhlIHdpZHRoLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBkb3VibGUgZ2V0V2lkdGgoKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGhlaWdodC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBoZWlnaHQKKyAgICAgKiBAcmV0dXJuIHRoZSBoZWlnaHQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGRvdWJsZSBnZXRIZWlnaHQoKTsKIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHdpZHRoIGFuZCBoZWlnaHQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aAotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodAorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U2l6ZShkb3VibGUgd2lkdGgsIGRvdWJsZSBoZWlnaHQpOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgd2lkdGggYW5kIGhlaWdodCBiYXNlZCBvbiB0aGUgZGF0YSBvZiBhbm90aGVyIAotICAgICAqIERpbWVuc2lvbjJEIG9iamVjdC4KKyAgICAgKiBTZXRzIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGJhc2VkIG9uIHRoZSBkYXRhIG9mIGFub3RoZXIgRGltZW5zaW9uMkQKKyAgICAgKiBvYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIGQgdGhlIERpbWVuc2lvbjJEIG9iamVjdCBwcm92aWRpbmcgdGhlIGRhdGEgdG8gY29weSAKLSAgICAgKiBpbnRvIHRoaXMgRGltZW5zaW9uMkQgb2JqZWN0CisgICAgICogQHBhcmFtIGQKKyAgICAgKiAgICAgICAgICAgIHRoZSBEaW1lbnNpb24yRCBvYmplY3QgcHJvdmlkaW5nIHRoZSBkYXRhIHRvIGNvcHkgaW50byB0aGlzCisgICAgICogICAgICAgICAgICBEaW1lbnNpb24yRCBvYmplY3QuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0U2l6ZShEaW1lbnNpb24yRCBkKSB7CiAgICAgICAgIHNldFNpemUoZC5nZXRXaWR0aCgpLCBkLmdldEhlaWdodCgpKTsKQEAgLTc1LDQgKzgxLDMgQEAKICAgICAgICAgfQogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2dlb20vRWxsaXBzZTJELmphdmEgYi9hd3QvamF2YS9hd3QvZ2VvbS9FbGxpcHNlMkQuamF2YQppbmRleCAzMzQ2NGFmLi44OWZkMGQwIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZ2VvbS9FbGxpcHNlMkQuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZ2VvbS9FbGxpcHNlMkQuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBEZW5pcyBNLiBLaXNoZW5rbwogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuZ2VvbTsKIAogaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwpAQCAtMjUsMjkgKzI2LDQxIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogVGhlIENsYXNzIEVsbGlwc2UyRCBkZXNjcmliZXMgYW4gZWxsaXBzZSBkZWZpbmVkIGJ5IGEgcmVjdGFuZ3VsYXIKLSAqIGFyZWEgaW4gd2hpY2ggaXQgaXMgaW5zY3JpYmVkLgorICogVGhlIENsYXNzIEVsbGlwc2UyRCBkZXNjcmliZXMgYW4gZWxsaXBzZSBkZWZpbmVkIGJ5IGEgcmVjdGFuZ3VsYXIgYXJlYSBpbgorICogd2hpY2ggaXQgaXMgaW5zY3JpYmVkLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEVsbGlwc2UyRCBleHRlbmRzIFJlY3Rhbmd1bGFyU2hhcGUgewogCiAgICAgLyoqCi0gICAgICogVGhlIENsYXNzIEZsb2F0IGlzIHRoZSBzdWJjbGFzcyBvZiBFbGxpcHNlMkQgdGhhdCBoYXMgYWxsIAotICAgICAqIG9mIGl0cyBkYXRhIHZhbHVlcyBzdG9yZWQgd2l0aCBmbG9hdC1sZXZlbCBwcmVjaXNpb24uCisgICAgICogVGhlIENsYXNzIEZsb2F0IGlzIHRoZSBzdWJjbGFzcyBvZiBFbGxpcHNlMkQgdGhhdCBoYXMgYWxsIG9mIGl0cyBkYXRhCisgICAgICogdmFsdWVzIHN0b3JlZCB3aXRoIGZsb2F0LWxldmVsIHByZWNpc2lvbi4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZsb2F0IGV4dGVuZHMgRWxsaXBzZTJEIHsKIAotICAgICAgICAvKiogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIGVsbGlwc2UncwotICAgICAgICAgKiBib3VuZGluZyByZWN0YW5nbGUuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgZWxsaXBzZSdzIGJvdW5kaW5nCisgICAgICAgICAqIHJlY3RhbmdsZS4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmbG9hdCB4OwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBlbGxpcHNlJ3MKLSAgICAgICAgICogYm91bmRpbmcgcmVjdGFuZ2xlLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgZWxsaXBzZSdzIGJvdW5kaW5nCisgICAgICAgICAqIHJlY3RhbmdsZS4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmbG9hdCB5OwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB3aWR0aCBvZiB0aGUgZWxsaXBzZSdzIGJvdW5kaW5nIHJlY3RhbmdsZS4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHdpZHRoIG9mIHRoZSBlbGxpcHNlJ3MgYm91bmRpbmcgcmVjdGFuZ2xlLgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGZsb2F0IHdpZHRoOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBoZWlnaHQgb2YgdGhlIGVsbGlwc2UncyBib3VuZGluZyByZWN0YW5nbGUuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIGVsbGlwc2UncyBib3VuZGluZyByZWN0YW5nbGUuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmxvYXQgaGVpZ2h0OwogCiAgICAgICAgIC8qKgpAQCAtNTksMTIgKzcyLDE2IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZmxvYXQtdmFsdWVkIEVsbGlwc2UyRCB3aXRoIHRoZSBzcGVjaWZpZWQgZGF0YS4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBlbGxpcHNlJ3MKLSAgICAgICAgICogYm91bmRpbmcgcmVjdGFuZ2xlCi0gICAgICAgICAqIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBlbGxpcHNlJ3MKLSAgICAgICAgICogYm91bmRpbmcgcmVjdGFuZ2xlCi0gICAgICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIGVsbGlwc2UncyBib3VuZGluZyByZWN0YW5nbGUKLSAgICAgICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBlbGxpcHNlJ3MgYm91bmRpbmcgcmVjdGFuZ2xlCisgICAgICAgICAqIEBwYXJhbSB4CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIGVsbGlwc2UncworICAgICAgICAgKiAgICAgICAgICAgIGJvdW5kaW5nIHJlY3RhbmdsZS4KKyAgICAgICAgICogQHBhcmFtIHkKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgZWxsaXBzZSdzCisgICAgICAgICAqICAgICAgICAgICAgYm91bmRpbmcgcmVjdGFuZ2xlLgorICAgICAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGVsbGlwc2UncyBib3VuZGluZyByZWN0YW5nbGUuCisgICAgICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBlbGxpcHNlJ3MgYm91bmRpbmcgcmVjdGFuZ2xlLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIEZsb2F0KGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHdpZHRoLCBmbG9hdCBoZWlnaHQpIHsKICAgICAgICAgICAgIHNldEZyYW1lKHgsIHksIHdpZHRoLCBoZWlnaHQpOwpAQCAtOTgsMTIgKzExNSwxNiBAQAogICAgICAgICAvKioKICAgICAgICAgICogU2V0cyB0aGUgZGF0YSBvZiB0aGUgZWxsaXBzZSdzIGJvdW5kaW5nIHJlY3RhbmdsZS4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBlbGxpcHNlJ3MKLSAgICAgICAgICogYm91bmRpbmcgcmVjdGFuZ2xlCi0gICAgICAgICAqIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBlbGxpcHNlJ3MKLSAgICAgICAgICogYm91bmRpbmcgcmVjdGFuZ2xlCi0gICAgICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIGVsbGlwc2UncyBib3VuZGluZyByZWN0YW5nbGUKLSAgICAgICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBlbGxpcHNlJ3MgYm91bmRpbmcgcmVjdGFuZ2xlCisgICAgICAgICAqIEBwYXJhbSB4CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIGVsbGlwc2UncworICAgICAgICAgKiAgICAgICAgICAgIGJvdW5kaW5nIHJlY3RhbmdsZS4KKyAgICAgICAgICogQHBhcmFtIHkKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgZWxsaXBzZSdzCisgICAgICAgICAqICAgICAgICAgICAgYm91bmRpbmcgcmVjdGFuZ2xlLgorICAgICAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGVsbGlwc2UncyBib3VuZGluZyByZWN0YW5nbGUuCisgICAgICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBlbGxpcHNlJ3MgYm91bmRpbmcgcmVjdGFuZ2xlLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHZvaWQgc2V0RnJhbWUoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgd2lkdGgsIGZsb2F0IGhlaWdodCkgewogICAgICAgICAgICAgdGhpcy54ID0geDsKQEAgLTEyNiwyMyArMTQ3LDMzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhlIENsYXNzIERvdWJsZSBpcyB0aGUgc3ViY2xhc3Mgb2YgRWxsaXBzZTJEIHRoYXQgaGFzIGFsbCAKLSAgICAgKiBvZiBpdHMgZGF0YSB2YWx1ZXMgc3RvcmVkIHdpdGggZG91YmxlLWxldmVsIHByZWNpc2lvbi4KKyAgICAgKiBUaGUgQ2xhc3MgRG91YmxlIGlzIHRoZSBzdWJjbGFzcyBvZiBFbGxpcHNlMkQgdGhhdCBoYXMgYWxsIG9mIGl0cyBkYXRhCisgICAgICogdmFsdWVzIHN0b3JlZCB3aXRoIGRvdWJsZS1sZXZlbCBwcmVjaXNpb24uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEb3VibGUgZXh0ZW5kcyBFbGxpcHNlMkQgewogCi0gICAgICAgIC8qKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgZWxsaXBzZSdzCi0gICAgICAgICAqIGJvdW5kaW5nIHJlY3RhbmdsZS4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBlbGxpcHNlJ3MgYm91bmRpbmcKKyAgICAgICAgICogcmVjdGFuZ2xlLgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGRvdWJsZSB4OwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBlbGxpcHNlJ3MKLSAgICAgICAgICogYm91bmRpbmcgcmVjdGFuZ2xlLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgZWxsaXBzZSdzIGJvdW5kaW5nCisgICAgICAgICAqIHJlY3RhbmdsZS4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBkb3VibGUgeTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgd2lkdGggb2YgdGhlIGVsbGlwc2UncyBib3VuZGluZyByZWN0YW5nbGUuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgZWxsaXBzZSdzIGJvdW5kaW5nIHJlY3RhbmdsZS4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBkb3VibGUgd2lkdGg7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIGhlaWdodCBvZiB0aGUgZWxsaXBzZSdzIGJvdW5kaW5nIHJlY3RhbmdsZS4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGhlaWdodCBvZiB0aGUgZWxsaXBzZSdzIGJvdW5kaW5nIHJlY3RhbmdsZS4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBkb3VibGUgaGVpZ2h0OwogCiAgICAgICAgIC8qKgpAQCAtMTUyLDE1ICsxODMsMTggQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZG91YmxlLXZhbHVlZCBFbGxpcHNlMkQgd2l0aCB0aGUgc3BlY2lmaWVkCi0gICAgICAgICAqIGRhdGEuCisgICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkb3VibGUtdmFsdWVkIEVsbGlwc2UyRCB3aXRoIHRoZSBzcGVjaWZpZWQgZGF0YS4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBlbGxpcHNlJ3MKLSAgICAgICAgICogYm91bmRpbmcgcmVjdGFuZ2xlCi0gICAgICAgICAqIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBlbGxpcHNlJ3MKLSAgICAgICAgICogYm91bmRpbmcgcmVjdGFuZ2xlCi0gICAgICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIGVsbGlwc2UncyBib3VuZGluZyByZWN0YW5nbGUKLSAgICAgICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBlbGxpcHNlJ3MgYm91bmRpbmcgcmVjdGFuZ2xlCisgICAgICAgICAqIEBwYXJhbSB4CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIGVsbGlwc2UncworICAgICAgICAgKiAgICAgICAgICAgIGJvdW5kaW5nIHJlY3RhbmdsZS4KKyAgICAgICAgICogQHBhcmFtIHkKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgZWxsaXBzZSdzCisgICAgICAgICAqICAgICAgICAgICAgYm91bmRpbmcgcmVjdGFuZ2xlLgorICAgICAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGVsbGlwc2UncyBib3VuZGluZyByZWN0YW5nbGUuCisgICAgICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBlbGxpcHNlJ3MgYm91bmRpbmcgcmVjdGFuZ2xlLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIERvdWJsZShkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB3aWR0aCwgZG91YmxlIGhlaWdodCkgewogICAgICAgICAgICAgc2V0RnJhbWUoeCwgeSwgd2lkdGgsIGhlaWdodCk7CkBAIC0yMDUsNyArMjM5LDcgQEAKICAgICB9CiAKICAgICAvKgotICAgICAqIEVsbGlwc2UyRCBwYXRoIGl0ZXJhdG9yIAorICAgICAqIEVsbGlwc2UyRCBwYXRoIGl0ZXJhdG9yCiAgICAgICovCiAgICAgLyoqCiAgICAgICogVGhlIHN1YmNsYXNzIG9mIFBhdGhJdGVyYXRvciB0byB0cmF2ZXJzZSBhbiBFbGxpcHNlMkQuCkBAIC0yMTMsNDYgKzI0Nyw3MiBAQAogICAgIGNsYXNzIEl0ZXJhdG9yIGltcGxlbWVudHMgUGF0aEl0ZXJhdG9yIHsKIAogICAgICAgICAvKgotICAgICAgICAgKiBFbGxpcHNlIGlzIHN1YmRpdmlkZWQgaW50byBmb3VyIHF1YXJ0ZXJzIGJ5IHggYW5kIHkgYXhpcy4gRWFjaCBwYXJ0IGFwcHJveGltYXRlZCBieQotICAgICAgICAgKiBjdWJpYyBCZXppZXIgY3VydmUuIEFyYyBpbiBmaXJzdCBxdWFydGVyIGlzIHN0YXJ0ZWQgaW4gKGEsIDApIGFuZCBmaW5pc2hlZCBpbiAoMCwgYikgcG9pbnRzLgotICAgICAgICAgKiBDb250cm9sIHBvaW50cyBmb3IgY3ViaWMgY3VydmUgd2lpbCBiZSAoYSwgMCksIChhLCBtKSwgKG4sIGIpIGFuZCAoMCwgYikgd2hlcmUgbiBhbmQgbSBhcmUKLSAgICAgICAgICogY2FsY3VsYXRlZCBiYXNlZCBvbiByZXF1aXJlbWVudCBCZXppZXIgY3VydmUgaW4gcG9pbnQgMC41IHNob3VsZCBsYXkgb24gdGhlIGFyYy4KKyAgICAgICAgICogRWxsaXBzZSBpcyBzdWJkaXZpZGVkIGludG8gZm91ciBxdWFydGVycyBieSB4IGFuZCB5IGF4aXMuIEVhY2ggcGFydAorICAgICAgICAgKiBhcHByb3hpbWF0ZWQgYnkgY3ViaWMgQmV6aWVyIGN1cnZlLiBBcmMgaW4gZmlyc3QgcXVhcnRlciBpcyBzdGFydGVkCisgICAgICAgICAqIGluIChhLCAwKSBhbmQgZmluaXNoZWQgaW4gKDAsIGIpIHBvaW50cy4gQ29udHJvbCBwb2ludHMgZm9yIGN1YmljCisgICAgICAgICAqIGN1cnZlIHdpaWwgYmUgKGEsIDApLCAoYSwgbSksIChuLCBiKSBhbmQgKDAsIGIpIHdoZXJlIG4gYW5kIG0gYXJlCisgICAgICAgICAqIGNhbGN1bGF0ZWQgYmFzZWQgb24gcmVxdWlyZW1lbnQgQmV6aWVyIGN1cnZlIGluIHBvaW50IDAuNSBzaG91bGQgbGF5CisgICAgICAgICAqIG9uIHRoZSBhcmMuCiAgICAgICAgICAqLwogCi0gICAgICAgIC8qKiBUaGUgY29lZmZpY2llbnQgdG8gY2FsY3VsYXRlIGNvbnRyb2wgcG9pbnRzIG9mIEJlemllciBjdXJ2ZXMuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY29lZmZpY2llbnQgdG8gY2FsY3VsYXRlIGNvbnRyb2wgcG9pbnRzIG9mIEJlemllciBjdXJ2ZXMuCisgICAgICAgICAqLwogICAgICAgICBmaW5hbCBkb3VibGUgdSA9IDIuMCAvIDMuMCAqIChNYXRoLnNxcnQoMi4wKSAtIDEuMCk7CiAKLSAgICAgICAgLyoqIFRoZSBwb2ludHMgY29vcmRpbmF0ZXMgY2FsY3VsYXRpb24gdGFibGUuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcG9pbnRzIGNvb3JkaW5hdGVzIGNhbGN1bGF0aW9uIHRhYmxlLgorICAgICAgICAgKi8KICAgICAgICAgZmluYWwgZG91YmxlIHBvaW50c1tdW10gPSB7Ci0gICAgICAgICAgICAgICAgeyAxLjAsIDAuNSArIHUsIDAuNSArIHUsIDEuMCwgMC41LCAxLjAgfSwKLSAgICAgICAgICAgICAgICB7IDAuNSAtIHUsIDEuMCwgMC4wLCAwLjUgKyB1LCAwLjAsIDAuNSB9LAotICAgICAgICAgICAgICAgIHsgMC4wLCAwLjUgLSB1LCAwLjUgLSB1LCAwLjAsIDAuNSwgMC4wIH0sCi0gICAgICAgICAgICAgICAgeyAwLjUgKyB1LCAwLjAsIDEuMCwgMC41IC0gdSwgMS4wLCAwLjUgfQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDEuMCwgMC41ICsgdSwgMC41ICsgdSwgMS4wLCAwLjUsIDEuMAorICAgICAgICAgICAgICAgIH0sIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDAuNSAtIHUsIDEuMCwgMC4wLCAwLjUgKyB1LCAwLjAsIDAuNQorICAgICAgICAgICAgICAgIH0sIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDAuMCwgMC41IC0gdSwgMC41IC0gdSwgMC4wLCAwLjUsIDAuMAorICAgICAgICAgICAgICAgIH0sIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDAuNSArIHUsIDAuMCwgMS4wLCAwLjUgLSB1LCAxLjAsIDAuNQorICAgICAgICAgICAgICAgIH0KICAgICAgICAgfTsKIAotICAgICAgICAvKiogVGhlIHggY29vcmRpbmF0ZSBvZiBsZWZ0LXVwcGVyIGNvcm5lciBvZiB0aGUgZWxsaXBzZSBib3VuZHMuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeCBjb29yZGluYXRlIG9mIGxlZnQtdXBwZXIgY29ybmVyIG9mIHRoZSBlbGxpcHNlIGJvdW5kcy4KKyAgICAgICAgICovCiAgICAgICAgIGRvdWJsZSB4OwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB5IGNvb3JkaW5hdGUgb2YgbGVmdC11cHBlciBjb3JuZXIgb2YgdGhlIGVsbGlwc2UgYm91bmRzLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeSBjb29yZGluYXRlIG9mIGxlZnQtdXBwZXIgY29ybmVyIG9mIHRoZSBlbGxpcHNlIGJvdW5kcy4KKyAgICAgICAgICovCiAgICAgICAgIGRvdWJsZSB5OwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB3aWR0aCBvZiB0aGUgZWxsaXBzZSBib3VuZHMuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgZWxsaXBzZSBib3VuZHMuCisgICAgICAgICAqLwogICAgICAgICBkb3VibGUgd2lkdGg7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIGhlaWdodCBvZiB0aGUgZWxsaXBzZSBib3VuZHMuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIGVsbGlwc2UgYm91bmRzLgorICAgICAgICAgKi8KICAgICAgICAgZG91YmxlIGhlaWdodDsKIAotICAgICAgICAvKiogVGhlIHBhdGggaXRlcmF0b3IgdHJhbnNmb3JtYXRpb24uICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcGF0aCBpdGVyYXRvciB0cmFuc2Zvcm1hdGlvbi4KKyAgICAgICAgICovCiAgICAgICAgIEFmZmluZVRyYW5zZm9ybSB0OwogCi0gICAgICAgIC8qKiBUaGUgY3VycmVudCBzZWdtZW5ldCBpbmRleC4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjdXJyZW50IHNlZ21lbnQgaW5kZXguCisgICAgICAgICAqLwogICAgICAgICBpbnQgaW5kZXg7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdHMgYSBuZXcgRWxsaXBzZTJELkl0ZXJhdG9yIGZvciBnaXZlbiBlbGxpcHNlIGFuZCB0cmFuc2Zvcm1hdGlvbgorICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEVsbGlwc2UyRC5JdGVyYXRvciBmb3IgZ2l2ZW4gZWxsaXBzZSBhbmQKKyAgICAgICAgICogdHJhbnNmb3JtYXRpb24KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBlIC0gdGhlIHNvdXJjZSBFbGxpcHNlMkQgb2JqZWN0Ci0gICAgICAgICAqIEBwYXJhbSB0IHRoZSB0CisgICAgICAgICAqIEBwYXJhbSBlCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBFbGxpcHNlMkQgb2JqZWN0LgorICAgICAgICAgKiBAcGFyYW0gdAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBhZmZpbmUgdHJhbnNmb3JtYXRpb24gb2JqZWN0LgogICAgICAgICAgKi8KICAgICAgICAgSXRlcmF0b3IoRWxsaXBzZTJEIGUsIEFmZmluZVRyYW5zZm9ybSB0KSB7CiAgICAgICAgICAgICB0aGlzLnggPSBlLmdldFgoKTsKQEAgLTM4OSwxNSArNDQ5LDEwIEBACiAgICAgICAgIGRvdWJsZSByeDIgPSByeCArIHJ3OwogICAgICAgICBkb3VibGUgcnkyID0gcnkgKyByaDsKIAotICAgICAgICByZXR1cm4KLSAgICAgICAgICAgIGNvbnRhaW5zKHJ4MSwgcnkxKSAmJgotICAgICAgICAgICAgY29udGFpbnMocngyLCByeTEpICYmCi0gICAgICAgICAgICBjb250YWlucyhyeDIsIHJ5MikgJiYKLSAgICAgICAgICAgIGNvbnRhaW5zKHJ4MSwgcnkyKTsKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5zKHJ4MSwgcnkxKSAmJiBjb250YWlucyhyeDIsIHJ5MSkgJiYgY29udGFpbnMocngyLCByeTIpICYmIGNvbnRhaW5zKHJ4MSwgcnkyKTsKICAgICB9CiAKICAgICBwdWJsaWMgUGF0aEl0ZXJhdG9yIGdldFBhdGhJdGVyYXRvcihBZmZpbmVUcmFuc2Zvcm0gYXQpIHsKICAgICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzLCBhdCk7CiAgICAgfQogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZ2VvbS9GbGF0dGVuaW5nUGF0aEl0ZXJhdG9yLmphdmEgYi9hd3QvamF2YS9hd3QvZ2VvbS9GbGF0dGVuaW5nUGF0aEl0ZXJhdG9yLmphdmEKaW5kZXggY2E1YzdjMi4uODIwOGYzOSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2dlb20vRmxhdHRlbmluZ1BhdGhJdGVyYXRvci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9nZW9tL0ZsYXR0ZW5pbmdQYXRoSXRlcmF0b3IuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBEZW5pcyBNLiBLaXNoZW5rbwogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuZ2VvbTsKIAogaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwpAQCAtMjUsMTA0ICsyNiwxMzkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBUaGUgQ2xhc3MgRmxhdHRlbmluZ1BhdGhJdGVyYXRvciB0YWtlcyBhIFBhdGhJdGVyYXRvciBmb3IgdHJhdmVyc2luZyAKLSAqIGEgY3VydmVkIHNoYXBlIGFuZCBmbGF0dGVucyBpdCBieSBlc3RpbWF0aW5nIHRoZSBjdXJ2ZSBhcyBhIHNlcmllcyAKLSAqIG9mIGxpbmUgc2VnbWVudHMuIFRoZSBmbGF0dGVuaW5nIGZhY3RvciBpbmRpY2F0ZXMgaG93IGZhciB0aGUgCi0gKiBlc3RpbWF0aW5nIGxpbmUgc2VnbWVudHMgYXJlIGFsbG93ZWQgdG8gYmUgZnJvbSB0aGUgYWN0dWFsIGN1cnZlOgotICogdGhlIEZsYXR0ZW5pbmdQYXRoSXRlcmF0b3Igd2lsbCBrZWVwIGRpdmlkaW5nIGVhY2ggY3VydmVkIHNlZ21lbnQgCi0gKiBpbnRvIHNtYWxsZXIgYW5kIHNtYWxsZXIgZmxhdCBzZWdtZW50cyB1bnRpbCBlaXRoZXIgdGhlIHNlZ21lbnRzIAotICogYXJlIHdpdGhpbmcgdGhlIGZsYXR0ZW5pbmcgZmFjdG9yIG9mIHRoZSBjdXJ2ZSBvciB1bnRpbCB0aGUgYnVmZmVyCi0gKiBsaW1pdCBpcyByZWFjaGVkLgorICogVGhlIENsYXNzIEZsYXR0ZW5pbmdQYXRoSXRlcmF0b3IgdGFrZXMgYSBQYXRoSXRlcmF0b3IgZm9yIHRyYXZlcnNpbmcgYSBjdXJ2ZWQKKyAqIHNoYXBlIGFuZCBmbGF0dGVucyBpdCBieSBlc3RpbWF0aW5nIHRoZSBjdXJ2ZSBhcyBhIHNlcmllcyBvZiBsaW5lIHNlZ21lbnRzLgorICogVGhlIGZsYXR0ZW5pbmcgZmFjdG9yIGluZGljYXRlcyBob3cgZmFyIHRoZSBlc3RpbWF0aW5nIGxpbmUgc2VnbWVudHMgYXJlCisgKiBhbGxvd2VkIHRvIGJlIGZyb20gdGhlIGFjdHVhbCBjdXJ2ZTogdGhlIEZsYXR0ZW5pbmdQYXRoSXRlcmF0b3Igd2lsbCBrZWVwCisgKiBkaXZpZGluZyBlYWNoIGN1cnZlZCBzZWdtZW50IGludG8gc21hbGxlciBhbmQgc21hbGxlciBmbGF0IHNlZ21lbnRzIHVudGlsCisgKiBlaXRoZXIgdGhlIHNlZ21lbnRzIGFyZSB3aXRoaW4gdGhlIGZsYXR0ZW5pbmcgZmFjdG9yIG9mIHRoZSBjdXJ2ZSBvciB1bnRpbAorICogdGhlIGJ1ZmZlciBsaW1pdCBpcyByZWFjaGVkLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEZsYXR0ZW5pbmdQYXRoSXRlcmF0b3IgaW1wbGVtZW50cyBQYXRoSXRlcmF0b3IgewogCi0gICAgLyoqIFRoZSBkZWZhdWx0IHBvaW50cyBidWZmZXIgc2l6ZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBwb2ludHMgYnVmZmVyIHNpemUuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gMTY7Ci0gICAgCi0gICAgLyoqIFRoZSBkZWZhdWx0IGN1cnZlIHN1YmRpdmlzaW9uIGxpbWl0LiAqLworCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgY3VydmUgc3ViZGl2aXNpb24gbGltaXQuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9MSU1JVCA9IDE2OwogCi0gICAgLyoqIFRoZSBwb2ludHMgYnVmZmVyIGNhcGFjaXR5LiAqLworICAgIC8qKgorICAgICAqIFRoZSBwb2ludHMgYnVmZmVyIGNhcGFjaXR5LgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfQ0FQQUNJVFkgPSAxNjsKLSAgICAKLSAgICAvKiogVGhlIHR5cGUgb2YgY3VycmVudCBzZWdtZW50IHRvIGJlIGZsYXQuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiBjdXJyZW50IHNlZ21lbnQgdG8gYmUgZmxhdC4KKyAgICAgKi8KICAgICBpbnQgYnVmVHlwZTsKLSAgICAKLSAgICAvKiogVGhlIGN1cnZlIHN1YmRpdmlzaW9uIGxpbWl0LiAqLworCisgICAgLyoqCisgICAgICogVGhlIGN1cnZlIHN1YmRpdmlzaW9uIGxpbWl0LgorICAgICAqLwogICAgIGludCBidWZMaW1pdDsKLSAgICAKLSAgICAvKiogVGhlIGN1cnJlbnQgcG9pbnRzIGJ1ZmZlciBzaXplLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGN1cnJlbnQgcG9pbnRzIGJ1ZmZlciBzaXplLgorICAgICAqLwogICAgIGludCBidWZTaXplOwotICAgIAotICAgIC8qKiBUaGUgaW5uZXIgY3Vyc29yIHBvc2l0aW9uIGluIHBvaW50cyBidWZmZXIuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgaW5uZXIgY3Vyc29yIHBvc2l0aW9uIGluIHBvaW50cyBidWZmZXIuCisgICAgICovCiAgICAgaW50IGJ1ZkluZGV4OwotICAgIAotICAgIC8qKiBUaGUgY3VycmVudCBzdWJkaXZpc2lvbiBjb3VudC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBjdXJyZW50IHN1YmRpdmlzaW9uIGNvdW50LgorICAgICAqLwogICAgIGludCBidWZTdWJkaXY7CiAKLSAgICAvKiogVGhlIHBvaW50cyBidWZmZXIuICovCisgICAgLyoqCisgICAgICogVGhlIHBvaW50cyBidWZmZXIuCisgICAgICovCiAgICAgZG91YmxlIGJ1ZltdOwotICAgIAotICAgIC8qKiBUaGUgaW5kaWNhdG9yIG9mIGVtcHR5IHBvaW50cyBidWZmZXIuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgaW5kaWNhdG9yIG9mIGVtcHR5IHBvaW50cyBidWZmZXIuCisgICAgICovCiAgICAgYm9vbGVhbiBidWZFbXB0eSA9IHRydWU7Ci0gICAgCi0gICAgLyoqIFRoZSBzb3VyY2UgUGF0aEl0ZXJhdG9yLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHNvdXJjZSBQYXRoSXRlcmF0b3IuCisgICAgICovCiAgICAgUGF0aEl0ZXJhdG9yIHA7Ci0gICAgCi0gICAgLyoqIFRoZSBmbGF0bmVzcyBvZiBuZXcgcGF0aC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBmbGF0bmVzcyBvZiBuZXcgcGF0aC4KKyAgICAgKi8KICAgICBkb3VibGUgZmxhdG5lc3M7Ci0gICAgCi0gICAgLyoqIFRoZSBzcXVhcmUgb2YgZmxhdG5lc3MuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3F1YXJlIG9mIGZsYXRuZXNzLgorICAgICAqLwogICAgIGRvdWJsZSBmbGF0bmVzczI7Ci0gICAgCi0gICAgLyoqIFRoZSB4IGNvb3JkaW5hdGUgb2YgcHJldmlvdXMgcGF0aCBzZWdtZW50LiAqLworCisgICAgLyoqCisgICAgICogVGhlIHggY29vcmRpbmF0ZSBvZiBwcmV2aW91cyBwYXRoIHNlZ21lbnQuCisgICAgICovCiAgICAgZG91YmxlIHB4OwogCi0gICAgLyoqIFRoZSB5IGNvb3JkaW5hdGUgb2YgcHJldmlvdXMgcGF0aCBzZWdtZW50LiAqLworICAgIC8qKgorICAgICAqIFRoZSB5IGNvb3JkaW5hdGUgb2YgcHJldmlvdXMgcGF0aCBzZWdtZW50LgorICAgICAqLwogICAgIGRvdWJsZSBweTsKLSAgICAKLSAgICAvKiogVGhlIHRhbXBvcmFyeSBidWZmZXIgZm9yIGdldHRpbmcgcG9pbnRzIGZyb20gUGF0aEl0ZXJhdG9yLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHRlbXBvcmFyeSBidWZmZXIgZm9yIGdldHRpbmcgcG9pbnRzIGZyb20gUGF0aEl0ZXJhdG9yLgorICAgICAqLwogICAgIGRvdWJsZSBjb29yZHNbXSA9IG5ldyBkb3VibGVbNl07CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZmxhdHRlbmluZyBwYXRoIGl0ZXJhdG9yIGdpdmVuIHRoZSBwYXRoIAotICAgICAqIGl0ZXJhdG9yIGZvciBhIChwb3NzaWJseSkgY3VydmVkIHBhdGggYW5kIGEgZmxhdHRlbmluZyBmYWN0b3IKLSAgICAgKiB3aGljaCBpbmRpY2F0ZXMgaG93IGNsb3NlIHRvZ2V0aGVyIHRoZSBwb2ludHMgb24gdGhlIGN1cnZlIAotICAgICAqIHNob3VsZCBiZSBjaG9zZW4uIFRoZSBidWZmZXIgbGltaXQgZGVmYXVsdHMgdG8gMTYgd2hpY2ggbWVhbnMgCi0gICAgICogdGhhdCBlYWNoIGN1cnZlIHdpbGwgYmUgZGl2aWRlZCBpbnRvIG5vIG1vcmUgdGhhbiAxNiBzZWdtZW50cyAKLSAgICAgKiByZWdhcmRsZXNzIG9mIHRoZSBmbGF0dGVuaW5nIGZhY3Rvci4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZmxhdHRlbmluZyBwYXRoIGl0ZXJhdG9yIGdpdmVuIHRoZSBwYXRoIGl0ZXJhdG9yIGZvciBhCisgICAgICogKHBvc3NpYmx5KSBjdXJ2ZWQgcGF0aCBhbmQgYSBmbGF0dGVuaW5nIGZhY3RvciB3aGljaCBpbmRpY2F0ZXMgaG93IGNsb3NlCisgICAgICogdG9nZXRoZXIgdGhlIHBvaW50cyBvbiB0aGUgY3VydmUgc2hvdWxkIGJlIGNob3Nlbi4gVGhlIGJ1ZmZlciBsaW1pdAorICAgICAqIGRlZmF1bHRzIHRvIDE2IHdoaWNoIG1lYW5zIHRoYXQgZWFjaCBjdXJ2ZSB3aWxsIGJlIGRpdmlkZWQgaW50byBubyBtb3JlCisgICAgICogdGhhbiAxNiBzZWdtZW50cyByZWdhcmRsZXNzIG9mIHRoZSBmbGF0dGVuaW5nIGZhY3Rvci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCBpdGVyYXRvciBvZiB0aGUgb3JpZ2luYWwgY3VydmUKLSAgICAgKiBAcGFyYW0gZmxhdG5lc3MgdGhlIGZsYXR0ZW5pbmcgZmFjdG9yIHRoYXQgaW5kaWNhdGVzIGhvdyBmYXIgdGhlIAotICAgICAqIGZsYXQgcGF0aCBpcyBhbGxvd2VkIHRvIGJlIGZyb20gdGhlIGFjdHVhbCBjdXJ2ZSBpbiBvcmRlciB0byAKLSAgICAgKiBkZWNpZGUgd2hlbiB0byBzdG9wIGRpdmlkaW5nIHRoZSBwYXRoIGludG8gc21hbGxlciBhbmQgc21hbGxlcgotICAgICAqIHNlZ21lbnRzLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBmbGF0bmVzcyBpcyBsZXNzIHRoYW4gemVyby4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBwYXRoIGlzIG51bGwuCisgICAgICogQHBhcmFtIHBhdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXRoIGl0ZXJhdG9yIG9mIHRoZSBvcmlnaW5hbCBjdXJ2ZS4KKyAgICAgKiBAcGFyYW0gZmxhdG5lc3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbGF0dGVuaW5nIGZhY3RvciB0aGF0IGluZGljYXRlcyBob3cgZmFyIHRoZSBmbGF0IHBhdGggaXMKKyAgICAgKiAgICAgICAgICAgIGFsbG93ZWQgdG8gYmUgZnJvbSB0aGUgYWN0dWFsIGN1cnZlIGluIG9yZGVyIHRvIGRlY2lkZSB3aGVuIHRvCisgICAgICogICAgICAgICAgICBzdG9wIGRpdmlkaW5nIHRoZSBwYXRoIGludG8gc21hbGxlciBhbmQgc21hbGxlciBzZWdtZW50cy4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBmbGF0bmVzcyBpcyBsZXNzIHRoYW4gemVyby4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHBhdGggaXMgbnVsbC4KICAgICAgKi8KICAgICBwdWJsaWMgRmxhdHRlbmluZ1BhdGhJdGVyYXRvcihQYXRoSXRlcmF0b3IgcGF0aCwgZG91YmxlIGZsYXRuZXNzKSB7CiAgICAgICAgIHRoaXMocGF0aCwgZmxhdG5lc3MsIEJVRkZFUl9MSU1JVCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGZsYXR0ZW5pbmcgcGF0aCBpdGVyYXRvciBnaXZlbiB0aGUgcGF0aCAKLSAgICAgKiBpdGVyYXRvciBmb3IgYSAocG9zc2libHkpIGN1cnZlZCBwYXRoIGFuZCBhIGZsYXR0ZW5pbmcgZmFjdG9yCi0gICAgICogYW5kIGEgYnVmZmVyIGxpbWl0LiBUaGUgRmxhdHRlbmluZ1BhdGhJdGVyYXRvciB3aWxsIGtlZXAgCi0gICAgICogZGl2aWRpbmcgZWFjaCBjdXJ2ZWQgc2VnbWVudCBpbnRvIHNtYWxsZXIgYW5kIHNtYWxsZXIgZmxhdCBzZWdtZW50cyAKLSAgICAgKiB1bnRpbCBlaXRoZXIgdGhlIHNlZ21lbnRzIGFyZSB3aXRoaW5nIHRoZSBmbGF0dGVuaW5nIGZhY3RvciBvZiB0aGUgCi0gICAgICogY3VydmUgb3IgdW50aWwgdGhlIGJ1ZmZlciBsaW1pdCBpcyByZWFjaGVkLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBmbGF0dGVuaW5nIHBhdGggaXRlcmF0b3IgZ2l2ZW4gdGhlIHBhdGggaXRlcmF0b3IgZm9yIGEKKyAgICAgKiAocG9zc2libHkpIGN1cnZlZCBwYXRoIGFuZCBhIGZsYXR0ZW5pbmcgZmFjdG9yIGFuZCBhIGJ1ZmZlciBsaW1pdC4gVGhlCisgICAgICogRmxhdHRlbmluZ1BhdGhJdGVyYXRvciB3aWxsIGtlZXAgZGl2aWRpbmcgZWFjaCBjdXJ2ZWQgc2VnbWVudCBpbnRvCisgICAgICogc21hbGxlciBhbmQgc21hbGxlciBmbGF0IHNlZ21lbnRzIHVudGlsIGVpdGhlciB0aGUgc2VnbWVudHMgYXJlIHdpdGhpbgorICAgICAqIHRoZSBmbGF0dGVuaW5nIGZhY3RvciBvZiB0aGUgY3VydmUgb3IgdW50aWwgdGhlIGJ1ZmZlciBsaW1pdCBpcyByZWFjaGVkLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIGl0ZXJhdG9yIG9mIHRoZSBvcmlnaW5hbCBjdXJ2ZQotICAgICAqIEBwYXJhbSBmbGF0bmVzcyB0aGUgZmxhdHRlbmluZyBmYWN0b3IgdGhhdCBpbmRpY2F0ZXMgaG93IGZhciB0aGUgCi0gICAgICogZmxhdCBwYXRoIGlzIGFsbG93ZWQgdG8gYmUgZnJvbSB0aGUgYWN0dWFsIGN1cnZlIGluIG9yZGVyIHRvIAotICAgICAqIGRlY2lkZSB3aGVuIHRvIHN0b3AgZGl2aWRpbmcgdGhlIHBhdGggaW50byBzbWFsbGVyIGFuZCBzbWFsbGVyCi0gICAgICogc2VnbWVudHMuCi0gICAgICogQHBhcmFtIGxpbWl0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBmbGF0IHNlZ21lbnRzIHRvIGRpdmlkZSBlYWNoIAotICAgICAqIGN1cnZlIGludG8KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZmxhdG5lc3Mgb3IgbGltaXQgaXMgbGVzcyB0aGFuIHplcm8uCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgcGF0aCBpcyBudWxsLgorICAgICAqIEBwYXJhbSBwYXRoCisgICAgICogICAgICAgICAgICB0aGUgcGF0aCBpdGVyYXRvciBvZiB0aGUgb3JpZ2luYWwgY3VydmUuCisgICAgICogQHBhcmFtIGZsYXRuZXNzCisgICAgICogICAgICAgICAgICB0aGUgZmxhdHRlbmluZyBmYWN0b3IgdGhhdCBpbmRpY2F0ZXMgaG93IGZhciB0aGUgZmxhdCBwYXRoIGlzCisgICAgICogICAgICAgICAgICBhbGxvd2VkIHRvIGJlIGZyb20gdGhlIGFjdHVhbCBjdXJ2ZSBpbiBvcmRlciB0byBkZWNpZGUgd2hlbiB0bworICAgICAqICAgICAgICAgICAgc3RvcCBkaXZpZGluZyB0aGUgcGF0aCBpbnRvIHNtYWxsZXIgYW5kIHNtYWxsZXIgc2VnbWVudHMuCisgICAgICogQHBhcmFtIGxpbWl0CisgICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgZmxhdCBzZWdtZW50cyB0byBkaXZpZGUgZWFjaCBjdXJ2ZSBpbnRvLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGZsYXRuZXNzIG9yIGxpbWl0IGlzIGxlc3MgdGhhbiB6ZXJvLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcGF0aCBpcyBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyBGbGF0dGVuaW5nUGF0aEl0ZXJhdG9yKFBhdGhJdGVyYXRvciBwYXRoLCBkb3VibGUgZmxhdG5lc3MsIGludCBsaW1pdCkgewogICAgICAgICBpZiAoZmxhdG5lc3MgPCAwLjApIHsKQEAgLTE0OSw3ICsxODUsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGZsYXR0ZW5pbmcgZmFjdG9yLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZsYXR0ZW5pbmcgZmFjdG9yCisgICAgICogQHJldHVybiB0aGUgZmxhdHRlbmluZyBmYWN0b3IuCiAgICAgICovCiAgICAgcHVibGljIGRvdWJsZSBnZXRGbGF0bmVzcygpIHsKICAgICAgICAgcmV0dXJuIGZsYXRuZXNzOwpAQCAtMTU4LDcgKzE5NCw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc3ViZGl2aXNpb25zIHBlciBjdXJ2ZWQgc2VnbWVudC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzdWJkaXZpc2lvbnMgcGVyIGN1cnZlZCBzZWdtZW50CisgICAgICogQHJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc3ViZGl2aXNpb25zIHBlciBjdXJ2ZWQgc2VnbWVudC4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFJlY3Vyc2lvbkxpbWl0KCkgewogICAgICAgICByZXR1cm4gYnVmTGltaXQ7CkBAIC0xNzMsMTIgKzIwOSwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENhbGN1bGF0ZXMgZmxhdCBwYXRoIHBvaW50cyBmb3IgY3VycmVudCBzZWdtZW50IG9mIHRoZSBzb3VyY2Ugc2hhcGUuCi0gICAgICogCi0gICAgICogTGluZSBzZWdtZW50IGlzIGZsYXQgYnkgaXRzZWxmLiBGbGF0bmVzcyBvZiBxdWFkIGFuZCBjdWJpYyBjdXJ2ZXMgZXZhbHVhdGVkIGJ5IGdldEZsYXRuZXNzU3EoKSBtZXRob2QuCi0gICAgICogQ3VydmVzIHN1YmRpdmlkZWQgdW50aWwgY3VycmVudCBmbGF0bmVzcyBpcyBiaWdnZXIgdGhhbiB1c2VyIGRlZmluZWQgYW5kIHN1YmRpdmlzaW9uIGxpbWl0IGlzbid0IGV4aGF1c3RlZC4KLSAgICAgKiBTaW5nbGUgc291cmNlIHNlZ21lbnQgdHJhbnNsYXRlZCB0byBzZXJpZXMgb2YgYnVmZmVyIHBvaW50cy4gVGhlIGxlc3MgZmxhdG5lc3MgdGhlIGJpZ2dlciBzZXJyaWVzLgotICAgICAqIEV2ZXJ5IGN1cnJlbnRTZWdtZW50KCkgY2FsbCBleHRyYWN0IG9uZSBwb2ludCBmcm9tIHRoZSBidWZmZXIuIFdoZW4gc2VyaWVzIGNvbXBsZXRlZCBldmFsdWF0ZSgpIHRha2VzIG5leHQgc291cmNlIHNoYXBlIHNlZ21lbnQuCisgICAgICogQ2FsY3VsYXRlcyBmbGF0IHBhdGggcG9pbnRzIGZvciBjdXJyZW50IHNlZ21lbnQgb2YgdGhlIHNvdXJjZSBzaGFwZS4gTGluZQorICAgICAqIHNlZ21lbnQgaXMgZmxhdCBieSBpdHNlbGYuIEZsYXRuZXNzIG9mIHF1YWQgYW5kIGN1YmljIGN1cnZlcyBldmFsdWF0ZWQgYnkKKyAgICAgKiBnZXRGbGF0bmVzc1NxKCkgbWV0aG9kLiBDdXJ2ZXMgc3ViZGl2aWRlZCB1bnRpbCBjdXJyZW50IGZsYXRuZXNzIGlzCisgICAgICogYmlnZ2VyIHRoYW4gdXNlciBkZWZpbmVkIGFuZCBzdWJkaXZpc2lvbiBsaW1pdCBpc24ndCBleGhhdXN0ZWQuIFNpbmdsZQorICAgICAqIHNvdXJjZSBzZWdtZW50IHRyYW5zbGF0ZWQgdG8gc2VyaWVzIG9mIGJ1ZmZlciBwb2ludHMuIFRoZSBsZXNzIGZsYXRuZXNzCisgICAgICogdGhlIGJpZ2dlciBzZXJpZXMuIEV2ZXJ5IGN1cnJlbnRTZWdtZW50KCkgY2FsbCBleHRyYWN0IG9uZSBwb2ludCBmcm9tIHRoZQorICAgICAqIGJ1ZmZlci4gV2hlbiBzZXJpZXMgY29tcGxldGVkIGV2YWx1YXRlKCkgdGFrZXMgbmV4dCBzb3VyY2Ugc2hhcGUgc2VnbWVudC4KICAgICAgKi8KICAgICB2b2lkIGV2YWx1YXRlKCkgewogICAgICAgICBpZiAoYnVmRW1wdHkpIHsKQEAgLTE4Niw5OSArMjIzLDk1IEBACiAgICAgICAgIH0KIAogICAgICAgICBzd2l0Y2ggKGJ1ZlR5cGUpIHsKLSAgICAgICAgY2FzZSBTRUdfTU9WRVRPOgotICAgICAgICBjYXNlIFNFR19MSU5FVE86Ci0gICAgICAgICAgICBweCA9IGNvb3Jkc1swXTsKLSAgICAgICAgICAgIHB5ID0gY29vcmRzWzFdOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU0VHX1FVQURUTzoKLSAgICAgICAgICAgIGlmIChidWZFbXB0eSkgewotICAgICAgICAgICAgICAgIGJ1ZkluZGV4IC09IDY7Ci0gICAgICAgICAgICAgICAgYnVmW2J1ZkluZGV4ICsgMF0gPSBweDsKLSAgICAgICAgICAgICAgICBidWZbYnVmSW5kZXggKyAxXSA9IHB5OwotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY29vcmRzLCAwLCBidWYsIGJ1ZkluZGV4ICsgMiwgNCk7Ci0gICAgICAgICAgICAgICAgYnVmU3ViZGl2ID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgd2hpbGUgKGJ1ZlN1YmRpdiA8IGJ1ZkxpbWl0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKFF1YWRDdXJ2ZTJELmdldEZsYXRuZXNzU3EoYnVmLCBidWZJbmRleCkgPCBmbGF0bmVzczIpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNFR19NT1ZFVE86CisgICAgICAgICAgICBjYXNlIFNFR19MSU5FVE86CisgICAgICAgICAgICAgICAgcHggPSBjb29yZHNbMF07CisgICAgICAgICAgICAgICAgcHkgPSBjb29yZHNbMV07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNFR19RVUFEVE86CisgICAgICAgICAgICAgICAgaWYgKGJ1ZkVtcHR5KSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZkluZGV4IC09IDY7CisgICAgICAgICAgICAgICAgICAgIGJ1ZltidWZJbmRleCArIDBdID0gcHg7CisgICAgICAgICAgICAgICAgICAgIGJ1ZltidWZJbmRleCArIDFdID0gcHk7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY29vcmRzLCAwLCBidWYsIGJ1ZkluZGV4ICsgMiwgNCk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZlN1YmRpdiA9IDA7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgLy8gUmVhbGxvYyBidWZmZXIKLSAgICAgICAgICAgICAgICBpZiAoYnVmSW5kZXggPD0gNCkgewotICAgICAgICAgICAgICAgICAgICBkb3VibGUgdG1wW10gPSBuZXcgZG91YmxlW2J1ZlNpemUgKyBCVUZGRVJfQ0FQQUNJVFldOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgYnVmSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wLCBidWZJbmRleCArIEJVRkZFUl9DQVBBQ0lUWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZTaXplIC0gYnVmSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBidWYgPSB0bXA7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZlNpemUgKz0gQlVGRkVSX0NBUEFDSVRZOwotICAgICAgICAgICAgICAgICAgICBidWZJbmRleCArPSBCVUZGRVJfQ0FQQUNJVFk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGJ1ZlN1YmRpdiA8IGJ1ZkxpbWl0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChRdWFkQ3VydmUyRC5nZXRGbGF0bmVzc1NxKGJ1ZiwgYnVmSW5kZXgpIDwgZmxhdG5lc3MyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIFJlYWxsb2MgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgIGlmIChidWZJbmRleCA8PSA0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdG1wW10gPSBuZXcgZG91YmxlW2J1ZlNpemUgKyBCVUZGRVJfQ0FQQUNJVFldOworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWYsIGJ1ZkluZGV4LCB0bXAsIGJ1ZkluZGV4ICsgQlVGRkVSX0NBUEFDSVRZLCBidWZTaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gYnVmSW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnVmID0gdG1wOworICAgICAgICAgICAgICAgICAgICAgICAgYnVmU2l6ZSArPSBCVUZGRVJfQ0FQQUNJVFk7CisgICAgICAgICAgICAgICAgICAgICAgICBidWZJbmRleCArPSBCVUZGRVJfQ0FQQUNJVFk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBRdWFkQ3VydmUyRC5zdWJkaXZpZGUoYnVmLCBidWZJbmRleCwgYnVmLCBidWZJbmRleCAtIDQsIGJ1ZiwgYnVmSW5kZXgpOworCisgICAgICAgICAgICAgICAgICAgIGJ1ZkluZGV4IC09IDQ7CisgICAgICAgICAgICAgICAgICAgIGJ1ZlN1YmRpdisrOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIFF1YWRDdXJ2ZTJELnN1YmRpdmlkZShidWYsIGJ1ZkluZGV4LCBidWYsIGJ1ZkluZGV4IC0gNCwgYnVmLCBidWZJbmRleCk7CisgICAgICAgICAgICAgICAgYnVmSW5kZXggKz0gNDsKKyAgICAgICAgICAgICAgICBweCA9IGJ1ZltidWZJbmRleF07CisgICAgICAgICAgICAgICAgcHkgPSBidWZbYnVmSW5kZXggKyAxXTsKIAotICAgICAgICAgICAgICAgIGJ1ZkluZGV4IC09IDQ7Ci0gICAgICAgICAgICAgICAgYnVmU3ViZGl2Kys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJ1ZkluZGV4ICs9IDQ7Ci0gICAgICAgICAgICBweCA9IGJ1ZltidWZJbmRleF07Ci0gICAgICAgICAgICBweSA9IGJ1ZltidWZJbmRleCArIDFdOwotCi0gICAgICAgICAgICBidWZFbXB0eSA9IChidWZJbmRleCA9PSBidWZTaXplIC0gMik7Ci0gICAgICAgICAgICBpZiAoYnVmRW1wdHkpIHsKLSAgICAgICAgICAgICAgICBidWZJbmRleCA9IGJ1ZlNpemU7Ci0gICAgICAgICAgICAgICAgYnVmVHlwZSA9IFNFR19MSU5FVE87Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1ZlN1YmRpdi0tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU0VHX0NVQklDVE86Ci0gICAgICAgICAgICBpZiAoYnVmRW1wdHkpIHsKLSAgICAgICAgICAgICAgICBidWZJbmRleCAtPSA4OwotICAgICAgICAgICAgICAgIGJ1ZltidWZJbmRleCArIDBdID0gcHg7Ci0gICAgICAgICAgICAgICAgYnVmW2J1ZkluZGV4ICsgMV0gPSBweTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNvb3JkcywgMCwgYnVmLCBidWZJbmRleCArIDIsIDYpOwotICAgICAgICAgICAgICAgIGJ1ZlN1YmRpdiA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHdoaWxlIChidWZTdWJkaXYgPCBidWZMaW1pdCkgewotICAgICAgICAgICAgICAgIGlmIChDdWJpY0N1cnZlMkQuZ2V0RmxhdG5lc3NTcShidWYsIGJ1ZkluZGV4KSA8IGZsYXRuZXNzMikgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBidWZFbXB0eSA9IChidWZJbmRleCA9PSBidWZTaXplIC0gMik7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZkVtcHR5KSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZkluZGV4ID0gYnVmU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgYnVmVHlwZSA9IFNFR19MSU5FVE87CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmU3ViZGl2LS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTRUdfQ1VCSUNUTzoKKyAgICAgICAgICAgICAgICBpZiAoYnVmRW1wdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmSW5kZXggLT0gODsKKyAgICAgICAgICAgICAgICAgICAgYnVmW2J1ZkluZGV4ICsgMF0gPSBweDsKKyAgICAgICAgICAgICAgICAgICAgYnVmW2J1ZkluZGV4ICsgMV0gPSBweTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShjb29yZHMsIDAsIGJ1ZiwgYnVmSW5kZXggKyAyLCA2KTsKKyAgICAgICAgICAgICAgICAgICAgYnVmU3ViZGl2ID0gMDsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAvLyBSZWFsbG9jIGJ1ZmZlcgotICAgICAgICAgICAgICAgIGlmIChidWZJbmRleCA8PSA2KSB7Ci0gICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0bXBbXSA9IG5ldyBkb3VibGVbYnVmU2l6ZSArIEJVRkZFUl9DQVBBQ0lUWV07Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCBidWZJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAsIGJ1ZkluZGV4ICsgQlVGRkVSX0NBUEFDSVRZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZlNpemUgLSBidWZJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZiA9IHRtcDsKLSAgICAgICAgICAgICAgICAgICAgYnVmU2l6ZSArPSBCVUZGRVJfQ0FQQUNJVFk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZkluZGV4ICs9IEJVRkZFUl9DQVBBQ0lUWTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoYnVmU3ViZGl2IDwgYnVmTGltaXQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEN1YmljQ3VydmUyRC5nZXRGbGF0bmVzc1NxKGJ1ZiwgYnVmSW5kZXgpIDwgZmxhdG5lc3MyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIFJlYWxsb2MgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgIGlmIChidWZJbmRleCA8PSA2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdG1wW10gPSBuZXcgZG91YmxlW2J1ZlNpemUgKyBCVUZGRVJfQ0FQQUNJVFldOworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWYsIGJ1ZkluZGV4LCB0bXAsIGJ1ZkluZGV4ICsgQlVGRkVSX0NBUEFDSVRZLCBidWZTaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gYnVmSW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnVmID0gdG1wOworICAgICAgICAgICAgICAgICAgICAgICAgYnVmU2l6ZSArPSBCVUZGRVJfQ0FQQUNJVFk7CisgICAgICAgICAgICAgICAgICAgICAgICBidWZJbmRleCArPSBCVUZGRVJfQ0FQQUNJVFk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBDdWJpY0N1cnZlMkQuc3ViZGl2aWRlKGJ1ZiwgYnVmSW5kZXgsIGJ1ZiwgYnVmSW5kZXggLSA2LCBidWYsIGJ1ZkluZGV4KTsKKworICAgICAgICAgICAgICAgICAgICBidWZJbmRleCAtPSA2OworICAgICAgICAgICAgICAgICAgICBidWZTdWJkaXYrKzsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBDdWJpY0N1cnZlMkQuc3ViZGl2aWRlKGJ1ZiwgYnVmSW5kZXgsIGJ1ZiwgYnVmSW5kZXggLSA2LCBidWYsIGJ1ZkluZGV4KTsKKyAgICAgICAgICAgICAgICBidWZJbmRleCArPSA2OworICAgICAgICAgICAgICAgIHB4ID0gYnVmW2J1ZkluZGV4XTsKKyAgICAgICAgICAgICAgICBweSA9IGJ1ZltidWZJbmRleCArIDFdOwogCi0gICAgICAgICAgICAgICAgYnVmSW5kZXggLT0gNjsKLSAgICAgICAgICAgICAgICBidWZTdWJkaXYrKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnVmSW5kZXggKz0gNjsKLSAgICAgICAgICAgIHB4ID0gYnVmW2J1ZkluZGV4XTsKLSAgICAgICAgICAgIHB5ID0gYnVmW2J1ZkluZGV4ICsgMV07Ci0KLSAgICAgICAgICAgIGJ1ZkVtcHR5ID0gKGJ1ZkluZGV4ID09IGJ1ZlNpemUgLSAyKTsKLSAgICAgICAgICAgIGlmIChidWZFbXB0eSkgewotICAgICAgICAgICAgICAgIGJ1ZkluZGV4ID0gYnVmU2l6ZTsKLSAgICAgICAgICAgICAgICBidWZUeXBlID0gU0VHX0xJTkVUTzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVmU3ViZGl2LS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBidWZFbXB0eSA9IChidWZJbmRleCA9PSBidWZTaXplIC0gMik7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZkVtcHR5KSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZkluZGV4ID0gYnVmU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgYnVmVHlwZSA9IFNFR19MSU5FVE87CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmU3ViZGl2LS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICB9CkBAIC0zMjMsNCArMzU2LDMgQEAKICAgICAgICAgcmV0dXJuIHR5cGU7CiAgICAgfQogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZ2VvbS9HZW5lcmFsUGF0aC5qYXZhIGIvYXd0L2phdmEvYXd0L2dlb20vR2VuZXJhbFBhdGguamF2YQppbmRleCAzNmIwMWM0Li4wNjY5YmM3IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZ2VvbS9HZW5lcmFsUGF0aC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9nZW9tL0dlbmVyYWxQYXRoLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgRGVuaXMgTS4gS2lzaGVua28KICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0Lmdlb207CiAKIGltcG9ydCBqYXZhLmF3dC5SZWN0YW5nbGU7CkBAIC0yOCw4MSArMjksMTE2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogVGhlIENsYXNzIEdlbmVyYWxQYXRoIHJlcHJlc2VudHMgYSBzaGFwZSB3aG9zZSBvdXRsaW5lIGlzIGdpdmVuIAotICogYnkgZGlmZmVyZW50IHR5cGVzIG9mIGN1cnZlZCBhbmQgc3RyYWlnaHQgc2VnbWVudHMuCisgKiBUaGUgY2xhc3MgR2VuZXJhbFBhdGggcmVwcmVzZW50cyBhIHNoYXBlIHdob3NlIG91dGxpbmUgaXMgZ2l2ZW4gYnkgZGlmZmVyZW50CisgKiB0eXBlcyBvZiBjdXJ2ZWQgYW5kIHN0cmFpZ2h0IHNlZ21lbnRzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEdlbmVyYWxQYXRoIGltcGxlbWVudHMgU2hhcGUsIENsb25lYWJsZSB7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFdJTkRfRVZFTl9PREQgc2VlIHtAbGluayBQYXRoSXRlcmF0b3IjV0lORF9FVkVOX09ERH0uICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFdJTkRfRVZFTl9PREQgc2VlIHtAbGluayBQYXRoSXRlcmF0b3IjV0lORF9FVkVOX09ERH0uCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lORF9FVkVOX09ERCA9IFBhdGhJdGVyYXRvci5XSU5EX0VWRU5fT0REOwotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgV0lORF9OT05fWkVSTyBzZWUge0BsaW5rIFBhdGhJdGVyYXRvciNXSU5EX05PTl9aRVJPfS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBXSU5EX05PTl9aRVJPIHNlZSB7QGxpbmsgUGF0aEl0ZXJhdG9yI1dJTkRfTk9OX1pFUk99LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJTkRfTk9OX1pFUk8gPSBQYXRoSXRlcmF0b3IuV0lORF9OT05fWkVSTzsKIAotICAgIC8qKiBUaGUgYnVmZmVycyBzaXplLiAqLworICAgIC8qKgorICAgICAqIFRoZSBidWZmZXJzIHNpemUuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gMTA7Ci0gICAgCi0gICAgLyoqIFRoZSBidWZmZXJzIGNhcGFjaXR5LiAqLworCisgICAgLyoqCisgICAgICogVGhlIGJ1ZmZlcnMgY2FwYWNpdHkuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9DQVBBQ0lUWSA9IDEwOwogCi0gICAgLyoqIFRoZSBwb2ludCdzIHR5cGVzIGJ1ZmZlci4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgcG9pbnQncyB0eXBlcyBidWZmZXIuCisgICAgICovCiAgICAgYnl0ZVtdIHR5cGVzOwotICAgIAotICAgIC8qKiBUaGUgcG9pbnRzIGJ1ZmZlci4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBwb2ludHMgYnVmZmVyLgorICAgICAqLwogICAgIGZsb2F0W10gcG9pbnRzOwotICAgIAotICAgIC8qKiBUaGUgcG9pbnQncyB0eXBlIGJ1ZmZlciBzaXplLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHBvaW50J3MgdHlwZSBidWZmZXIgc2l6ZS4KKyAgICAgKi8KICAgICBpbnQgdHlwZVNpemU7Ci0gICAgCi0gICAgLyoqIFRoZSBwb2ludHMgYnVmZmVyIHNpemUuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgcG9pbnRzIGJ1ZmZlciBzaXplLgorICAgICAqLwogICAgIGludCBwb2ludFNpemU7Ci0gICAgCi0gICAgLyoqIFRoZSBwYXRoIHJ1bGUuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgcGF0aCBydWxlLgorICAgICAqLwogICAgIGludCBydWxlOwogCi0gICAgLyoqIFRoZSBzcGFjZSBhbW91bnQgaW4gcG9pbnRzIGJ1ZmZlciBmb3IgZGlmZmVyZW50IHNlZ21lbmV0J3MgdHlwZXMuICovCisgICAgLyoqCisgICAgICogVGhlIHNwYWNlIGFtb3VudCBpbiBwb2ludHMgYnVmZmVyIGZvciBkaWZmZXJlbnQgc2VnbWVuZXQncyB0eXBlcy4KKyAgICAgKi8KICAgICBzdGF0aWMgaW50IHBvaW50U2hpZnRbXSA9IHsKLSAgICAgICAgICAgIDIsICAvLyBNT1ZFVE8KLSAgICAgICAgICAgIDIsICAvLyBMSU5FVE8KLSAgICAgICAgICAgIDQsICAvLyBRVUFEVE8KLSAgICAgICAgICAgIDYsICAvLyBDVUJJQ1RPCi0gICAgICAgICAgICAwfTsgLy8gQ0xPU0UKKyAgICAgICAgICAgIDIsIC8vIE1PVkVUTworICAgICAgICAgICAgMiwgLy8gTElORVRPCisgICAgICAgICAgICA0LCAvLyBRVUFEVE8KKyAgICAgICAgICAgIDYsIC8vIENVQklDVE8KKyAgICAgICAgICAgIDAKKyAgICB9OyAvLyBDTE9TRQogCiAgICAgLyoKLSAgICAgKiBHZW5lcmFsUGF0aCBwYXRoIGl0ZXJhdG9yIAorICAgICAqIEdlbmVyYWxQYXRoIHBhdGggaXRlcmF0b3IKICAgICAgKi8KICAgICAvKioKLSAgICAgKiBUaGUgQ2xhc3MgSXRlcmF0b3IgaXMgdGhlIHN1YmNsYXNzIG9mIEl0ZXJhdG9yIGZvciB0cmF2ZXJzaW5nIHRoZSAKLSAgICAgKiBvdXRsaW5lIG9mIGEgR2VuZXJhbFBhdGguCisgICAgICogVGhlIENsYXNzIEl0ZXJhdG9yIGlzIHRoZSBzdWJjbGFzcyBvZiBJdGVyYXRvciBmb3IgdHJhdmVyc2luZyB0aGUgb3V0bGluZQorICAgICAqIG9mIGEgR2VuZXJhbFBhdGguCiAgICAgICovCiAgICAgY2xhc3MgSXRlcmF0b3IgaW1wbGVtZW50cyBQYXRoSXRlcmF0b3IgewogCi0gICAgICAgIC8qKiBUaGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24gaW4gdHlwZXMgYnVmZmVyLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uIGluIHR5cGVzIGJ1ZmZlci4KKyAgICAgICAgICovCiAgICAgICAgIGludCB0eXBlSW5kZXg7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uIGluIHBvaW50cyBidWZmZXIuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiBpbiBwb2ludHMgYnVmZmVyLgorICAgICAgICAgKi8KICAgICAgICAgaW50IHBvaW50SW5kZXg7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHNvdXJjZSBHZW5lcmFsUGF0aCBvYmplY3QuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzb3VyY2UgR2VuZXJhbFBhdGggb2JqZWN0LgorICAgICAgICAgKi8KICAgICAgICAgR2VuZXJhbFBhdGggcDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgcGF0aCBpdGVyYXRvciB0cmFuc2Zvcm1hdGlvbi4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHBhdGggaXRlcmF0b3IgdHJhbnNmb3JtYXRpb24uCisgICAgICAgICAqLwogICAgICAgICBBZmZpbmVUcmFuc2Zvcm0gdDsKIAogICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0cyBhIG5ldyBHZW5lcmFsUGF0aC5JdGVyYXRvciBmb3IgZ2l2ZW4gZ2VuZXJhbCBwYXRoCisgICAgICAgICAqIENvbnN0cnVjdHMgYSBuZXcgR2VuZXJhbFBhdGguSXRlcmF0b3IgZm9yIGdpdmVuIGdlbmVyYWwgcGF0aC4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBwYXRoIC0gdGhlIHNvdXJjZSBHZW5lcmFsUGF0aCBvYmplY3QKKyAgICAgICAgICogQHBhcmFtIHBhdGgKKyAgICAgICAgICogICAgICAgICAgICB0aGUgc291cmNlIEdlbmVyYWxQYXRoIG9iamVjdC4KICAgICAgICAgICovCiAgICAgICAgIEl0ZXJhdG9yKEdlbmVyYWxQYXRoIHBhdGgpIHsKICAgICAgICAgICAgIHRoaXMocGF0aCwgbnVsbCk7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0cyBhIG5ldyBHZW5lcmFsUGF0aC5JdGVyYXRvciBmb3IgZ2l2ZW4gZ2VuZXJhbCBwYXRoIGFuZCB0cmFuc2Zvcm1hdGlvbgorICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEdlbmVyYWxQYXRoLkl0ZXJhdG9yIGZvciBnaXZlbiBnZW5lcmFsIHBhdGggYW5kCisgICAgICAgICAqIHRyYW5zZm9ybWF0aW9uLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHBhdGggLSB0aGUgc291cmNlIEdlbmVyYWxQYXRoIG9iamVjdAotICAgICAgICAgKiBAcGFyYW0gYXQgLSB0aGUgQWZmaW5lVHJhbnNmb3JtIG9iamVjdCB0byBhcHBseSByZWN0YW5nbGUgcGF0aAorICAgICAgICAgKiBAcGFyYW0gcGF0aAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgR2VuZXJhbFBhdGggb2JqZWN0LgorICAgICAgICAgKiBAcGFyYW0gYXQKKyAgICAgICAgICogICAgICAgICAgICB0aGUgQWZmaW5lVHJhbnNmb3JtIG9iamVjdCB0byBhcHBseSByZWN0YW5nbGUgcGF0aC4KICAgICAgICAgICovCiAgICAgICAgIEl0ZXJhdG9yKEdlbmVyYWxQYXRoIHBhdGgsIEFmZmluZVRyYW5zZm9ybSBhdCkgewogICAgICAgICAgICAgdGhpcy5wID0gcGF0aDsKQEAgLTE1NiwzMyArMTkyLDM1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGdlbmVyYWwgcGF0aCB3aXRoIHRoZSB3aW5kaW5nIHJ1bGUgc2V0IAotICAgICAqIHRvIHtAbGluayBQYXRoSXRlcmF0b3IjV0lORF9OT05fWkVST30gYW5kIHRoZSBpbml0aWFsIGNhcGFjaXR5Ci0gICAgICogKG51bWJlciBvZiBzZWdtZW50cykgc2V0IHRvIHRoZSBkZWZhdWx0IHZhbHVlIDEwLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBnZW5lcmFsIHBhdGggd2l0aCB0aGUgd2luZGluZyBydWxlIHNldCB0bworICAgICAqIHtAbGluayBQYXRoSXRlcmF0b3IjV0lORF9OT05fWkVST30gYW5kIHRoZSBpbml0aWFsIGNhcGFjaXR5IChudW1iZXIgb2YKKyAgICAgKiBzZWdtZW50cykgc2V0IHRvIHRoZSBkZWZhdWx0IHZhbHVlIDEwLgogICAgICAqLwogICAgIHB1YmxpYyBHZW5lcmFsUGF0aCgpIHsKICAgICAgICAgdGhpcyhXSU5EX05PTl9aRVJPLCBCVUZGRVJfU0laRSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGdlbmVyYWwgcGF0aCB3aXRoIHRoZSBnaXZlbiB3aW5kaW5nIHJ1bGUKLSAgICAgKiAgYW5kIHRoZSBpbml0aWFsIGNhcGFjaXR5IChudW1iZXIgb2Ygc2VnbWVudHMpIHNldCB0byB0aGUgCi0gICAgICogIGRlZmF1bHQgdmFsdWUgMTAuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGdlbmVyYWwgcGF0aCB3aXRoIHRoZSBnaXZlbiB3aW5kaW5nIHJ1bGUgYW5kIHRoZQorICAgICAqIGluaXRpYWwgY2FwYWNpdHkgKG51bWJlciBvZiBzZWdtZW50cykgc2V0IHRvIHRoZSBkZWZhdWx0IHZhbHVlIDEwLgogICAgICAqIAotICAgICAqIEBwYXJhbSBydWxlIHRoZSB3aW5kaW5nIHJ1bGUsIGVpdGhlciB7QGxpbmsgUGF0aEl0ZXJhdG9yI1dJTkRfRVZFTl9PRER9Ci0gICAgICogb3Ige0BsaW5rIFBhdGhJdGVyYXRvciNXSU5EX05PTl9aRVJPfQorICAgICAqIEBwYXJhbSBydWxlCisgICAgICogICAgICAgICAgICB0aGUgd2luZGluZyBydWxlLCBlaXRoZXIge0BsaW5rIFBhdGhJdGVyYXRvciNXSU5EX0VWRU5fT0REfSBvcgorICAgICAqICAgICAgICAgICAge0BsaW5rIFBhdGhJdGVyYXRvciNXSU5EX05PTl9aRVJPfS4KICAgICAgKi8KICAgICBwdWJsaWMgR2VuZXJhbFBhdGgoaW50IHJ1bGUpIHsKICAgICAgICAgdGhpcyhydWxlLCBCVUZGRVJfU0laRSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGdlbmVyYWwgcGF0aCB3aXRoIHRoZSBnaXZlbiB3aW5kaW5nIHJ1bGUKLSAgICAgKiBhbmQgaW5pdGlhbCBjYXBhY2l0eSAobnVtYmVyIG9mIHNlZ21lbnRzKS4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZ2VuZXJhbCBwYXRoIHdpdGggdGhlIGdpdmVuIHdpbmRpbmcgcnVsZSBhbmQgaW5pdGlhbAorICAgICAqIGNhcGFjaXR5IChudW1iZXIgb2Ygc2VnbWVudHMpLgogICAgICAqIAotICAgICAqIEBwYXJhbSBydWxlIHRoZSB3aW5kaW5nIHJ1bGUsIGVpdGhlciB7QGxpbmsgUGF0aEl0ZXJhdG9yI1dJTkRfRVZFTl9PRER9Ci0gICAgICogb3Ige0BsaW5rIFBhdGhJdGVyYXRvciNXSU5EX05PTl9aRVJPfQotICAgICAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgdGhlIG51bWJlciBvZiBzZWdtZW50cyB0aGUgcGF0aCBpcyBzZXQgdG8gaG9sZAorICAgICAqIEBwYXJhbSBydWxlCisgICAgICogICAgICAgICAgICB0aGUgd2luZGluZyBydWxlLCBlaXRoZXIge0BsaW5rIFBhdGhJdGVyYXRvciNXSU5EX0VWRU5fT0REfSBvcgorICAgICAqICAgICAgICAgICAge0BsaW5rIFBhdGhJdGVyYXRvciNXSU5EX05PTl9aRVJPfS4KKyAgICAgKiBAcGFyYW0gaW5pdGlhbENhcGFjaXR5CisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHNlZ21lbnRzIHRoZSBwYXRoIGlzIHNldCB0byBob2xkLgogICAgICAqLwogICAgIHB1YmxpYyBHZW5lcmFsUGF0aChpbnQgcnVsZSwgaW50IGluaXRpYWxDYXBhY2l0eSkgewogICAgICAgICBzZXRXaW5kaW5nUnVsZShydWxlKTsKQEAgLTE5Myw3ICsyMzEsOCBAQAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgYSBuZXcgR2VuZXJhbFBhdGggZnJvbSB0aGUgb3V0bGluZSBvZiB0aGUgZ2l2ZW4gc2hhcGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNoYXBlIHRoZSBzaGFwZQorICAgICAqIEBwYXJhbSBzaGFwZQorICAgICAqICAgICAgICAgICAgdGhlIHNoYXBlLgogICAgICAqLwogICAgIHB1YmxpYyBHZW5lcmFsUGF0aChTaGFwZSBzaGFwZSkgewogICAgICAgICB0aGlzKFdJTkRfTk9OX1pFUk8sIEJVRkZFUl9TSVpFKTsKQEAgLTIwMywxNCArMjQyLDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgd2luZGluZyBydWxlLCB3aGljaCBkZXRlcm1pbmVzIGhvdyB0byBkZWNpZGUgd2hldGhlciAKLSAgICAgKiBhIHBvaW50IHRoYXQgaXNuJ3Qgb24gdGhlIHBhdGggaXRzZWxmIGlzIGluc2lkZSBvciBvdXRzaWRlIG9mIAotICAgICAqIHRoZSBzaGFwZS4KKyAgICAgKiBTZXRzIHRoZSB3aW5kaW5nIHJ1bGUsIHdoaWNoIGRldGVybWluZXMgaG93IHRvIGRlY2lkZSB3aGV0aGVyIGEgcG9pbnQKKyAgICAgKiB0aGF0IGlzbid0IG9uIHRoZSBwYXRoIGl0c2VsZiBpcyBpbnNpZGUgb3Igb3V0c2lkZSBvZiB0aGUgc2hhcGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHJ1bGUgdGhlIG5ldyB3aW5kaW5nIHJ1bGUKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgd2luZGluZyBydWxlIGlzIG5laXRoZXIKLSAgICAgKiB7QGxpbmsgUGF0aEl0ZXJhdG9yI1dJTkRfRVZFTl9PRER9IG5vciB7QGxpbmsgUGF0aEl0ZXJhdG9yI1dJTkRfTk9OX1pFUk99LgorICAgICAqIEBwYXJhbSBydWxlCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHdpbmRpbmcgcnVsZS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB3aW5kaW5nIHJ1bGUgaXMgbmVpdGhlcgorICAgICAqICAgICAgICAgICAgIHtAbGluayBQYXRoSXRlcmF0b3IjV0lORF9FVkVOX09ERH0gbm9yCisgICAgICogICAgICAgICAgICAge0BsaW5rIFBhdGhJdGVyYXRvciNXSU5EX05PTl9aRVJPfS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRXaW5kaW5nUnVsZShpbnQgcnVsZSkgewogICAgICAgICBpZiAocnVsZSAhPSBXSU5EX0VWRU5fT0REICYmIHJ1bGUgIT0gV0lORF9OT05fWkVSTykgewpAQCAtMjIzLDggKzI2Myw4IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgd2luZGluZyBydWxlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHdpbmRpbmcgcnVsZSwgZWl0aGVyIHtAbGluayBQYXRoSXRlcmF0b3IjV0lORF9FVkVOX09ERH0KLSAgICAgKiBvciB7QGxpbmsgUGF0aEl0ZXJhdG9yI1dJTkRfTk9OX1pFUk99CisgICAgICogQHJldHVybiB0aGUgd2luZGluZyBydWxlLCBlaXRoZXIge0BsaW5rIFBhdGhJdGVyYXRvciNXSU5EX0VWRU5fT0REfSBvcgorICAgICAqICAgICAgICAge0BsaW5rIFBhdGhJdGVyYXRvciNXSU5EX05PTl9aRVJPfS4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFdpbmRpbmdSdWxlKCkgewogICAgICAgICByZXR1cm4gcnVsZTsKQEAgLTIzMiwxNSArMjcyLDE2IEBACiAKICAgICAvKioKICAgICAgKiBDaGVja3MgdGhlIHBvaW50IGRhdGEgYnVmZmVyIHNpemVzIHRvIHNlZSB3aGV0aGVyIHBvaW50Q291bnQgYWRkaXRpb25hbAotICAgICAqIHBvaW50LWRhdGEgZWxlbWVudHMgY2FuIGZpdC4gKE5vdGUgdGhhdCB0aGUgbnVtYmVyIG9mIHBvaW50IGRhdGEgCi0gICAgICogZWxlbWVudHMgdG8gYWRkIGlzIG1vcmUgdGhhbiBvbmUgcGVyIHBvaW50IC0tIGl0IGRlcGVuZHMgb24gdGhlIHR5cGUgCi0gICAgICogb2YgcG9pbnQgYmVpbmcgYWRkZWQuKSBSZWFsbG9jYXRlcyB0aGUgYnVmZmVycyB0byBlbmxhcmdlIHRoZSBzaXplIGlmIG5lY2Vzc2FyeS4KKyAgICAgKiBwb2ludC1kYXRhIGVsZW1lbnRzIGNhbiBmaXQuIChOb3RlIHRoYXQgdGhlIG51bWJlciBvZiBwb2ludCBkYXRhIGVsZW1lbnRzCisgICAgICogdG8gYWRkIGlzIG1vcmUgdGhhbiBvbmUgcGVyIHBvaW50IC0tIGl0IGRlcGVuZHMgb24gdGhlIHR5cGUgb2YgcG9pbnQKKyAgICAgKiBiZWluZyBhZGRlZC4pIFJlYWxsb2NhdGVzIHRoZSBidWZmZXJzIHRvIGVubGFyZ2UgdGhlIHNpemUgaWYgbmVjZXNzYXJ5LgogICAgICAqIAotICAgICAqIEBwYXJhbSBwb2ludENvdW50IC0gdGhlIG51bWJlciBvZiBwb2ludCBkYXRhIGVsZW1lbnRzIHRvIGJlIGFkZGVkCi0gICAgICogQHBhcmFtIGNoZWNrTW92ZSB3aGV0aGVyIHRvIGNoZWNrIGZvciBleGlzdGluZyBwb2ludHMKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxQYXRoU3RhdGVFeGNlcHRpb24gY2hlY2tNb3ZlIGlzIHRydWUgYW5kIHRoZSAKLSAgICAgKiBwYXRoIGlzIGN1cnJlbnRseSBlbXB0eS4KKyAgICAgKiBAcGFyYW0gcG9pbnRDb3VudAorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBwb2ludCBkYXRhIGVsZW1lbnRzIHRvIGJlIGFkZGVkLgorICAgICAqIEBwYXJhbSBjaGVja01vdmUKKyAgICAgKiAgICAgICAgICAgIHdoZXRoZXIgdG8gY2hlY2sgZm9yIGV4aXN0aW5nIHBvaW50cy4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxQYXRoU3RhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBjaGVja01vdmUgaXMgdHJ1ZSBhbmQgdGhlIHBhdGggaXMgY3VycmVudGx5IGVtcHR5LgogICAgICAqLwogICAgIHZvaWQgY2hlY2tCdWYoaW50IHBvaW50Q291bnQsIGJvb2xlYW4gY2hlY2tNb3ZlKSB7CiAgICAgICAgIGlmIChjaGVja01vdmUgJiYgdHlwZVNpemUgPT0gMCkgewpAQCAtMjYwLDExICszMDEsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBcHBlbmRzIGEgbmV3IHBvaW50IHRvIHRoZSBlbmQgb2YgdGhpcyBnZW5lcmFsIHBhdGgsIGRpc2Nvbm5lY3RlZAotICAgICAqIGZyb20gdGhlIGV4aXN0aW5nIHBhdGguCisgICAgICogQXBwZW5kcyBhIG5ldyBwb2ludCB0byB0aGUgZW5kIG9mIHRoaXMgZ2VuZXJhbCBwYXRoLCBkaXNjb25uZWN0ZWQgZnJvbQorICAgICAqIHRoZSBleGlzdGluZyBwYXRoLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIG5leHQgcG9pbnQgdG8gYXBwZW5kCi0gICAgICogQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgbmV4dCBwb2ludCB0byBhcHBlbmQKKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgbmV4dCBwb2ludCB0byBhcHBlbmQuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIG5leHQgcG9pbnQgdG8gYXBwZW5kLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIG1vdmVUbyhmbG9hdCB4LCBmbG9hdCB5KSB7CiAgICAgICAgIGlmICh0eXBlU2l6ZSA+IDAgJiYgdHlwZXNbdHlwZVNpemUgLSAxXSA9PSBQYXRoSXRlcmF0b3IuU0VHX01PVkVUTykgewpAQCAtMjc5LDEyICszMjIsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBcHBlbmRzIGEgbmV3IHNlZ21lbnQgdG8gdGhlIGVuZCBvZiB0aGlzIGdlbmVyYWwgcGF0aCBieSBtYWtpbmcgCi0gICAgICogYSBzdHJhaWdodCBsaW5lIHNlZ21lbnQgZnJvbSB0aGUgY3VycmVudCBlbmRwb2ludCB0byB0aGUgCi0gICAgICogZ2l2ZW4gbmV3IHBvaW50LgorICAgICAqIEFwcGVuZHMgYSBuZXcgc2VnbWVudCB0byB0aGUgZW5kIG9mIHRoaXMgZ2VuZXJhbCBwYXRoIGJ5IG1ha2luZyBhCisgICAgICogc3RyYWlnaHQgbGluZSBzZWdtZW50IGZyb20gdGhlIGN1cnJlbnQgZW5kcG9pbnQgdG8gdGhlIGdpdmVuIG5ldyBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBuZXh0IHBvaW50IHRvIGFwcGVuZAotICAgICAqIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIG5leHQgcG9pbnQgdG8gYXBwZW5kCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIG5leHQgcG9pbnQgdG8gYXBwZW5kLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBuZXh0IHBvaW50IHRvIGFwcGVuZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBsaW5lVG8oZmxvYXQgeCwgZmxvYXQgeSkgewogICAgICAgICBjaGVja0J1ZigyLCB0cnVlKTsKQEAgLTI5NCwxNCArMzM4LDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQXBwZW5kcyBhIG5ldyBzZWdtZW50IHRvIHRoZSBlbmQgb2YgdGhpcyBnZW5lcmFsIHBhdGggYnkgbWFraW5nIAotICAgICAqIGEgcXVhZHJhdGljIGN1cnZlIGZyb20gdGhlIGN1cnJlbnQgZW5kcG9pbnQgdG8gdGhlIHBvaW50ICh4MiwgeTIpCi0gICAgICogdXNpbmcgdGhlIHBvaW50ICh4MSwgeTEpIGFzIHRoZSBxdWFkcmF0aWMgY3VydmUncyBjb250cm9sIHBvaW50LgorICAgICAqIEFwcGVuZHMgYSBuZXcgc2VnbWVudCB0byB0aGUgZW5kIG9mIHRoaXMgZ2VuZXJhbCBwYXRoIGJ5IG1ha2luZyBhCisgICAgICogcXVhZHJhdGljIGN1cnZlIGZyb20gdGhlIGN1cnJlbnQgZW5kcG9pbnQgdG8gdGhlIHBvaW50ICh4MiwgeTIpIHVzaW5nIHRoZQorICAgICAqIHBvaW50ICh4MSwgeTEpIGFzIHRoZSBxdWFkcmF0aWMgY3VydmUncyBjb250cm9sIHBvaW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSB4MSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBxdWFkcmF0aWMgY3VydmUncyBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHkxIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHF1YWRyYXRpYyBjdXJ2ZSdzIGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0geDIgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcXVhZHJhdGljIGN1cnZlJ3MgZW5kIHBvaW50Ci0gICAgICogQHBhcmFtIHkyIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHF1YWRyYXRpYyBjdXJ2ZSdzIGVuZCBwb2ludAorICAgICAqIEBwYXJhbSB4MQorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcXVhZHJhdGljIGN1cnZlJ3MgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0geTEKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHF1YWRyYXRpYyBjdXJ2ZSdzIGNvbnRyb2wgcG9pbnQuCisgICAgICogQHBhcmFtIHgyCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBxdWFkcmF0aWMgY3VydmUncyBlbmQgcG9pbnQuCisgICAgICogQHBhcmFtIHkyCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBxdWFkcmF0aWMgY3VydmUncyBlbmQgcG9pbnQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcXVhZFRvKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgeDIsIGZsb2F0IHkyKSB7CiAgICAgICAgIGNoZWNrQnVmKDQsIHRydWUpOwpAQCAtMzEzLDE4ICszNjEsMjcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBcHBlbmRzIGEgbmV3IHNlZ21lbnQgdG8gdGhlIGVuZCBvZiB0aGlzIGdlbmVyYWwgcGF0aCBieSBtYWtpbmcgCi0gICAgICogYSBjdWJpYyBjdXJ2ZSBmcm9tIHRoZSBjdXJyZW50IGVuZHBvaW50IHRvIHRoZSBwb2ludCAoeDMsIHkzKQotICAgICAqIHVzaW5nICh4MSwgeTEpIGFuZCAoeDIsIHkyKSBhcyBjb250cm9sIHBvaW50cy4KKyAgICAgKiBBcHBlbmRzIGEgbmV3IHNlZ21lbnQgdG8gdGhlIGVuZCBvZiB0aGlzIGdlbmVyYWwgcGF0aCBieSBtYWtpbmcgYSBjdWJpYworICAgICAqIGN1cnZlIGZyb20gdGhlIGN1cnJlbnQgZW5kcG9pbnQgdG8gdGhlIHBvaW50ICh4MywgeTMpIHVzaW5nICh4MSwgeTEpIGFuZAorICAgICAqICh4MiwgeTIpIGFzIGNvbnRyb2wgcG9pbnRzLgogICAgICAqIAogICAgICAqIEBzZWUgamF2YS5hd3QuZ2VvbS5DdWJpY0N1cnZlMkQKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0geDEgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgbmV3IGN1YmljIHNlZ21lbnQncyBmaXJzdCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHkxIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIG5ldyBjdWJpYyBzZWdtZW50J3MgZmlyc3QgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSB4MiB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBuZXcgY3ViaWMgc2VnbWVudCdzIHNlY29uZCBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHkyIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIG5ldyBjdWJpYyBzZWdtZW50J3Mgc2Vjb25kIGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0geDMgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgbmV3IGN1YmljIHNlZ21lbnQncyBlbmQgcG9pbnQKLSAgICAgKiBAcGFyYW0geTMgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgbmV3IGN1YmljIHNlZ21lbnQncyBlbmQgcG9pbnQKKyAgICAgKiBAcGFyYW0geDEKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIG5ldyBjdWJpYyBzZWdtZW50J3MgZmlyc3QgY29udHJvbAorICAgICAqICAgICAgICAgICAgcG9pbnQuCisgICAgICogQHBhcmFtIHkxCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBuZXcgY3ViaWMgc2VnbWVudCdzIGZpcnN0IGNvbnRyb2wKKyAgICAgKiAgICAgICAgICAgIHBvaW50LgorICAgICAqIEBwYXJhbSB4MgorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgbmV3IGN1YmljIHNlZ21lbnQncyBzZWNvbmQgY29udHJvbAorICAgICAqICAgICAgICAgICAgcG9pbnQuCisgICAgICogQHBhcmFtIHkyCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBuZXcgY3ViaWMgc2VnbWVudCdzIHNlY29uZCBjb250cm9sCisgICAgICogICAgICAgICAgICBwb2ludC4KKyAgICAgKiBAcGFyYW0geDMKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIG5ldyBjdWJpYyBzZWdtZW50J3MgZW5kIHBvaW50LgorICAgICAqIEBwYXJhbSB5MworICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgbmV3IGN1YmljIHNlZ21lbnQncyBlbmQgcG9pbnQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY3VydmVUbyhmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgeDMsIGZsb2F0IHkzKSB7CiAgICAgICAgIGNoZWNrQnVmKDYsIHRydWUpOwpAQCAtMzM4LDggKzM5NSw4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQXBwZW5kcyB0aGUgdHlwZSBpbmZvcm1hdGlvbiB0byBkZWNsYXJlIHRoYXQgdGhlIGN1cnJlbnQKLSAgICAgKiBlbmRwb2ludCBjbG9zZXMgdGhlIGN1cnZlLgorICAgICAqIEFwcGVuZHMgdGhlIHR5cGUgaW5mb3JtYXRpb24gdG8gZGVjbGFyZSB0aGF0IHRoZSBjdXJyZW50IGVuZHBvaW50IGNsb3NlcworICAgICAqIHRoZSBjdXJ2ZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbG9zZVBhdGgoKSB7CiAgICAgICAgIGlmICh0eXBlU2l6ZSA9PSAwIHx8IHR5cGVzW3R5cGVTaXplIC0gMV0gIT0gUGF0aEl0ZXJhdG9yLlNFR19DTE9TRSkgewpAQCAtMzQ5LDE1ICs0MDYsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBcHBlbmRzIHRoZSBvdXRsaW5lIG9mIHRoZSBzcGVjaWZpZWQgc2hhcGUgb250byB0aGUgZW5kIAotICAgICAqIG9mIHRoaXMgR2VuZXJhbFBhdGguCisgICAgICogQXBwZW5kcyB0aGUgb3V0bGluZSBvZiB0aGUgc3BlY2lmaWVkIHNoYXBlIG9udG8gdGhlIGVuZCBvZiB0aGlzCisgICAgICogR2VuZXJhbFBhdGguCiAgICAgICogCi0gICAgICogQHBhcmFtIHNoYXBlIHRoZSBzaGFwZSB3aG9zZSBvdXRsaW5lIGlzIHRvIGJlIGFwcGVuZGVkCi0gICAgICogQHBhcmFtIGNvbm5lY3QgdHJ1ZSB0byBjb25uZWN0IHRoaXMgcGF0aCdzIGN1cnJlbnQgCi0gICAgICogZW5kcG9pbnQgdG8gdGhlIGZpcnN0IHBvaW50IG9mIHRoZSBzaGFwZSdzIG91dGxpbmUgb3IgCi0gICAgICogZmFsc2UgdG8gYXBwZW5kIHRoZSBzaGFwZSdzIG91dGxpbmUgd2l0aG91dCBjb25uZWN0aW5nIGl0Ci0gICAgICogCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgc2hhcGUgcGFyYW1ldGVyIGlzIG51bGwKKyAgICAgKiBAcGFyYW0gc2hhcGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzaGFwZSB3aG9zZSBvdXRsaW5lIGlzIHRvIGJlIGFwcGVuZGVkLgorICAgICAqIEBwYXJhbSBjb25uZWN0CisgICAgICogICAgICAgICAgICB0cnVlIHRvIGNvbm5lY3QgdGhpcyBwYXRoJ3MgY3VycmVudCBlbmRwb2ludCB0byB0aGUgZmlyc3QKKyAgICAgKiAgICAgICAgICAgIHBvaW50IG9mIHRoZSBzaGFwZSdzIG91dGxpbmUgb3IgZmFsc2UgdG8gYXBwZW5kIHRoZSBzaGFwZSdzCisgICAgICogICAgICAgICAgICBvdXRsaW5lIHdpdGhvdXQgY29ubmVjdGluZyBpdC4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNoYXBlIHBhcmFtZXRlciBpcyBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFwcGVuZChTaGFwZSBzaGFwZSwgYm9vbGVhbiBjb25uZWN0KSB7CiAgICAgICAgIFBhdGhJdGVyYXRvciBwID0gc2hhcGUuZ2V0UGF0aEl0ZXJhdG9yKG51bGwpOwpAQCAtMzY1LDQyICs0MjQsNDMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBcHBlbmRzIHRoZSBwYXRoIGRlZmluZWQgYnkgdGhlIHNwZWNpZmllZCBQYXRoSXRlcmF0b3Igb250byB0aGUgZW5kIAotICAgICAqIG9mIHRoaXMgR2VuZXJhbFBhdGguCisgICAgICogQXBwZW5kcyB0aGUgcGF0aCBkZWZpbmVkIGJ5IHRoZSBzcGVjaWZpZWQgUGF0aEl0ZXJhdG9yIG9udG8gdGhlIGVuZCBvZgorICAgICAqIHRoaXMgR2VuZXJhbFBhdGguCiAgICAgICogCi0gICAgICogQHBhcmFtIHBhdGggdGhlIFBhdGhJdGVyYXRvciB0aGF0IGRlZmluZXMgdGhlIG5ldyBwYXRoIHRvIGFwcGVuZAotICAgICAqIEBwYXJhbSBjb25uZWN0IHRydWUgdG8gY29ubmVjdCB0aGlzIHBhdGgncyBjdXJyZW50IAotICAgICAqIGVuZHBvaW50IHRvIHRoZSBmaXJzdCBwb2ludCBvZiB0aGUgc2hhcGUncyBvdXRsaW5lIG9yIAotICAgICAqIGZhbHNlIHRvIGFwcGVuZCB0aGUgc2hhcGUncyBvdXRsaW5lIHdpdGhvdXQgY29ubmVjdGluZyBpdAorICAgICAqIEBwYXJhbSBwYXRoCisgICAgICogICAgICAgICAgICB0aGUgUGF0aEl0ZXJhdG9yIHRoYXQgZGVmaW5lcyB0aGUgbmV3IHBhdGggdG8gYXBwZW5kLgorICAgICAqIEBwYXJhbSBjb25uZWN0CisgICAgICogICAgICAgICAgICB0cnVlIHRvIGNvbm5lY3QgdGhpcyBwYXRoJ3MgY3VycmVudCBlbmRwb2ludCB0byB0aGUgZmlyc3QKKyAgICAgKiAgICAgICAgICAgIHBvaW50IG9mIHRoZSBzaGFwZSdzIG91dGxpbmUgb3IgZmFsc2UgdG8gYXBwZW5kIHRoZSBzaGFwZSdzCisgICAgICogICAgICAgICAgICBvdXRsaW5lIHdpdGhvdXQgY29ubmVjdGluZyBpdC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhcHBlbmQoUGF0aEl0ZXJhdG9yIHBhdGgsIGJvb2xlYW4gY29ubmVjdCkgewogICAgICAgICB3aGlsZSAoIXBhdGguaXNEb25lKCkpIHsKICAgICAgICAgICAgIGZsb2F0IGNvb3Jkc1tdID0gbmV3IGZsb2F0WzZdOwogICAgICAgICAgICAgc3dpdGNoIChwYXRoLmN1cnJlbnRTZWdtZW50KGNvb3JkcykpIHsKLSAgICAgICAgICAgIGNhc2UgUGF0aEl0ZXJhdG9yLlNFR19NT1ZFVE86Ci0gICAgICAgICAgICAgICAgaWYgKCFjb25uZWN0IHx8IHR5cGVTaXplID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbW92ZVRvKGNvb3Jkc1swXSwgY29vcmRzWzFdKTsKKyAgICAgICAgICAgICAgICBjYXNlIFBhdGhJdGVyYXRvci5TRUdfTU9WRVRPOgorICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbm5lY3QgfHwgdHlwZVNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbW92ZVRvKGNvb3Jkc1swXSwgY29vcmRzWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlc1t0eXBlU2l6ZSAtIDFdICE9IFBhdGhJdGVyYXRvci5TRUdfQ0xPU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBwb2ludHNbcG9pbnRTaXplIC0gMl0gPT0gY29vcmRzWzBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcG9pbnRzW3BvaW50U2l6ZSAtIDFdID09IGNvb3Jkc1sxXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gTk8gQlJFQUs7CisgICAgICAgICAgICAgICAgY2FzZSBQYXRoSXRlcmF0b3IuU0VHX0xJTkVUTzoKKyAgICAgICAgICAgICAgICAgICAgbGluZVRvKGNvb3Jkc1swXSwgY29vcmRzWzFdKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh0eXBlc1t0eXBlU2l6ZSAtIDFdICE9IFBhdGhJdGVyYXRvci5TRUdfQ0xPU0UgJiYKLSAgICAgICAgICAgICAgICAgICAgcG9pbnRzW3BvaW50U2l6ZSAtIDJdID09IGNvb3Jkc1swXSAmJgotICAgICAgICAgICAgICAgICAgICBwb2ludHNbcG9pbnRTaXplIC0gMV0gPT0gY29vcmRzWzFdKQotICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFBhdGhJdGVyYXRvci5TRUdfUVVBRFRPOgorICAgICAgICAgICAgICAgICAgICBxdWFkVG8oY29vcmRzWzBdLCBjb29yZHNbMV0sIGNvb3Jkc1syXSwgY29vcmRzWzNdKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gTk8gQlJFQUs7Ci0gICAgICAgICAgICBjYXNlIFBhdGhJdGVyYXRvci5TRUdfTElORVRPOgotICAgICAgICAgICAgICAgIGxpbmVUbyhjb29yZHNbMF0sIGNvb3Jkc1sxXSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFBhdGhJdGVyYXRvci5TRUdfUVVBRFRPOgotICAgICAgICAgICAgICAgIHF1YWRUbyhjb29yZHNbMF0sIGNvb3Jkc1sxXSwgY29vcmRzWzJdLCBjb29yZHNbM10pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQYXRoSXRlcmF0b3IuU0VHX0NVQklDVE86Ci0gICAgICAgICAgICAgICAgY3VydmVUbyhjb29yZHNbMF0sIGNvb3Jkc1sxXSwgY29vcmRzWzJdLCBjb29yZHNbM10sIGNvb3Jkc1s0XSwgY29vcmRzWzVdKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUGF0aEl0ZXJhdG9yLlNFR19DTE9TRToKLSAgICAgICAgICAgICAgICBjbG9zZVBhdGgoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFBhdGhJdGVyYXRvci5TRUdfQ1VCSUNUTzoKKyAgICAgICAgICAgICAgICAgICAgY3VydmVUbyhjb29yZHNbMF0sIGNvb3Jkc1sxXSwgY29vcmRzWzJdLCBjb29yZHNbM10sIGNvb3Jkc1s0XSwgY29vcmRzWzVdKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQYXRoSXRlcmF0b3IuU0VHX0NMT1NFOgorICAgICAgICAgICAgICAgICAgICBjbG9zZVBhdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwYXRoLm5leHQoKTsKICAgICAgICAgICAgIGNvbm5lY3QgPSBmYWxzZTsKQEAgLTQxMCw3ICs0NzAsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGN1cnJlbnQgZW5kIHBvaW50IG9mIHRoZSBwYXRoLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgZW5kIHBvaW50IG9mIHRoZSBwYXRoCisgICAgICogQHJldHVybiB0aGUgY3VycmVudCBlbmQgcG9pbnQgb2YgdGhlIHBhdGguCiAgICAgICovCiAgICAgcHVibGljIFBvaW50MkQgZ2V0Q3VycmVudFBvaW50KCkgewogICAgICAgICBpZiAodHlwZVNpemUgPT0gMCkgewpAQCAtNDMxLDkgKzQ5MSw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVzZXRzIHRoZSBHZW5lcmFsUGF0aCB0byBiZWluZyBhbiBlbXB0eSBwYXRoLiBUaGUgdW5kZXJseWluZwotICAgICAqIHBvaW50IGFuZCBzZWdtZW50IGRhdGEgaXMgbm90IGRlbGV0ZWQgYnV0IHJhdGhlciB0aGUgZW5kIGluZGljZXMKLSAgICAgKiBvZiB0aGUgZGF0YSBhcnJheXMgYXJlIHNldCB0byB6ZXJvLgorICAgICAqIFJlc2V0cyB0aGUgR2VuZXJhbFBhdGggdG8gYmVpbmcgYW4gZW1wdHkgcGF0aC4gVGhlIHVuZGVybHlpbmcgcG9pbnQgYW5kCisgICAgICogc2VnbWVudCBkYXRhIGlzIG5vdCBkZWxldGVkIGJ1dCByYXRoZXIgdGhlIGVuZCBpbmRpY2VzIG9mIHRoZSBkYXRhIGFycmF5cworICAgICAqIGFyZSBzZXQgdG8gemVyby4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKICAgICAgICAgdHlwZVNpemUgPSAwOwpAQCAtNDQxLDIzICs1MDEsMjQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUcmFuc2Zvcm0gYWxsIG9mIHRoZSBjb29yZGluYXRlcyBvZiB0aGlzIHBhdGggYWNjb3JkaW5nIHRvIHRoZQotICAgICAqIHNwZWNpZmllZCBBZmZpbmVUcmFuc2Zvcm0uCisgICAgICogVHJhbnNmb3JtIGFsbCBvZiB0aGUgY29vcmRpbmF0ZXMgb2YgdGhpcyBwYXRoIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICAgICogQWZmaW5lVHJhbnNmb3JtLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0IHRoZSBBZmZpbmVUcmFuc2Zvcm0KKyAgICAgKiBAcGFyYW0gdAorICAgICAqICAgICAgICAgICAgdGhlIEFmZmluZVRyYW5zZm9ybS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0cmFuc2Zvcm0oQWZmaW5lVHJhbnNmb3JtIHQpIHsKICAgICAgICAgdC50cmFuc2Zvcm0ocG9pbnRzLCAwLCBwb2ludHMsIDAsIHBvaW50U2l6ZSAvIDIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgR2VuZXJhbFBhdGggd2hvc2UgZGF0YSBpcyBnaXZlbiBieSB0aGlzIHBhdGgncyAKLSAgICAgKiBkYXRhIHRyYW5zZm9ybWVkIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIEFmZmluZVRyYW5zZm9ybS4KKyAgICAgKiBDcmVhdGVzIGEgbmV3IEdlbmVyYWxQYXRoIHdob3NlIGRhdGEgaXMgZ2l2ZW4gYnkgdGhpcyBwYXRoJ3MgZGF0YQorICAgICAqIHRyYW5zZm9ybWVkIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIEFmZmluZVRyYW5zZm9ybS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdCB0aGUgQWZmaW5lVHJhbnNmb3JtCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV3IEdlbmVyYWxQYXRoIHdob3NlIGRhdGEgaXMgZ2l2ZW4gYnkgdGhpcyBwYXRoJ3MgCi0gICAgICogZGF0YSB0cmFuc2Zvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBBZmZpbmVUcmFuc2Zvcm0KKyAgICAgKiBAcGFyYW0gdAorICAgICAqICAgICAgICAgICAgdGhlIEFmZmluZVRyYW5zZm9ybS4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXcgR2VuZXJhbFBhdGggd2hvc2UgZGF0YSBpcyBnaXZlbiBieSB0aGlzIHBhdGgncyBkYXRhCisgICAgICogICAgICAgICB0cmFuc2Zvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBBZmZpbmVUcmFuc2Zvcm0uCiAgICAgICovCiAgICAgcHVibGljIFNoYXBlIGNyZWF0ZVRyYW5zZm9ybWVkU2hhcGUoQWZmaW5lVHJhbnNmb3JtIHQpIHsKICAgICAgICAgR2VuZXJhbFBhdGggcCA9IChHZW5lcmFsUGF0aCljbG9uZSgpOwpAQCAtNDgwLDE2ICs1NDEsMTQgQEAKICAgICAgICAgICAgICAgICBmbG9hdCB4ID0gcG9pbnRzW2ktLV07CiAgICAgICAgICAgICAgICAgaWYgKHggPCByeDEpIHsKICAgICAgICAgICAgICAgICAgICAgcngxID0geDsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgaWYgKHggPiByeDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJ4MiA9IHg7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHggPiByeDIpIHsKKyAgICAgICAgICAgICAgICAgICAgcngyID0geDsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKHkgPCByeTEpIHsKICAgICAgICAgICAgICAgICAgICAgcnkxID0geTsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgaWYgKHkgPiByeTIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJ5MiA9IHk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHkgPiByeTIpIHsKKyAgICAgICAgICAgICAgICAgICAgcnkyID0geTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG5ldyBSZWN0YW5nbGUyRC5GbG9hdChyeDEsIHJ5MSwgcngyIC0gcngxLCByeTIgLSByeTEpOwpAQCAtNTAwLDE0ICs1NTksMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGVja3MgdGhlIGNyb3NzIGNvdW50IChudW1iZXIgb2YgdGltZXMgYSByYXkgZnJvbSB0aGUgcG9pbnQgCi0gICAgICogY3Jvc3NlcyB0aGUgc2hhcGUncyBib3VuZGFyeSkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIG51bWJlciAKLSAgICAgKiBvZiBjcm9zc2luZ3MgY29ycmVzcG9uZHMgdG8gYSBwb2ludCBpbnNpZGUgdGhlIHNoYXBlIG9yIG5vdAotICAgICAqIChhY2NvcmRpbmcgdG8gdGhlIHNoYXBlJ3MgcGF0aCBydWxlKS4KKyAgICAgKiBDaGVja3MgdGhlIGNyb3NzIGNvdW50IChudW1iZXIgb2YgdGltZXMgYSByYXkgZnJvbSB0aGUgcG9pbnQgY3Jvc3NlcyB0aGUKKyAgICAgKiBzaGFwZSdzIGJvdW5kYXJ5KSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgbnVtYmVyIG9mIGNyb3NzaW5ncworICAgICAqIGNvcnJlc3BvbmRzIHRvIGEgcG9pbnQgaW5zaWRlIHRoZSBzaGFwZSBvciBub3QgKGFjY29yZGluZyB0byB0aGUgc2hhcGUncworICAgICAqIHBhdGggcnVsZSkuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNyb3NzIC0gdGhlIHBvaW50J3MgY3Jvc3MgY291bnQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBvaW50IGlzIGluc2lkZSB0aGUgcGF0aCwgb3IgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogQHBhcmFtIGNyb3NzCisgICAgICogICAgICAgICAgICB0aGUgcG9pbnQncyBjcm9zcyBjb3VudC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBvaW50IGlzIGluc2lkZSB0aGUgcGF0aCwgb3IgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIGJvb2xlYW4gaXNJbnNpZGUoaW50IGNyb3NzKSB7CiAgICAgICAgIGlmIChydWxlID09IFdJTkRfTk9OX1pFUk8pIHsKQEAgLTU1Myw3ICs2MTIsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBHZW5lcmFsUGF0aCBwID0gKEdlbmVyYWxQYXRoKSBzdXBlci5jbG9uZSgpOworICAgICAgICAgICAgR2VuZXJhbFBhdGggcCA9IChHZW5lcmFsUGF0aClzdXBlci5jbG9uZSgpOwogICAgICAgICAgICAgcC50eXBlcyA9IHR5cGVzLmNsb25lKCk7CiAgICAgICAgICAgICBwLnBvaW50cyA9IHBvaW50cy5jbG9uZSgpOwogICAgICAgICAgICAgcmV0dXJuIHA7CkBAIC01NjMsNCArNjIyLDMgQEAKICAgICB9CiAKIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2dlb20vSWxsZWdhbFBhdGhTdGF0ZUV4Y2VwdGlvbi5qYXZhIGIvYXd0L2phdmEvYXd0L2dlb20vSWxsZWdhbFBhdGhTdGF0ZUV4Y2VwdGlvbi5qYXZhCmluZGV4IDdmNDU5ZTcuLjc1MGJhMjkgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9nZW9tL0lsbGVnYWxQYXRoU3RhdGVFeGNlcHRpb24uamF2YQorKysgYi9hd3QvamF2YS9hd3QvZ2VvbS9JbGxlZ2FsUGF0aFN0YXRlRXhjZXB0aW9uLmphdmEKQEAgLTE4LDE2ICsxOCwyMSBAQAogICogQGF1dGhvciBEZW5pcyBNLiBLaXNoZW5rbwogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuZ2VvbTsKIAogLyoqCi0gKiBUaGUgQ2xhc3MgSWxsZWdhbFBhdGhTdGF0ZUV4Y2VwdGlvbiBpbmRpY2F0ZXMgZXJyb3JzIHdoZXJlIHRoZSAKLSAqIGN1cnJlbnQgc3RhdGUgb2YgYSBwYXRoIG9iamVjdCBpcyBpbWNvbXBhdGlibGUgd2l0aCB0aGUgZGVzaXJlZCAKLSAqIGFjdGlvbiwgc3VjaCBhcyBwZXJmb3JtaW5nIG5vbi10cml2aWFsIGFjdGlvbnMgb24gYW4gZW1wdHkgcGF0aC4KKyAqIFRoZSBDbGFzcyBJbGxlZ2FsUGF0aFN0YXRlRXhjZXB0aW9uIGluZGljYXRlcyBlcnJvcnMgd2hlcmUgdGhlIGN1cnJlbnQgc3RhdGUKKyAqIG9mIGEgcGF0aCBvYmplY3QgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIGRlc2lyZWQgYWN0aW9uLCBzdWNoIGFzIHBlcmZvcm1pbmcKKyAqIG5vbi10cml2aWFsIGFjdGlvbnMgb24gYW4gZW1wdHkgcGF0aC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBJbGxlZ2FsUGF0aFN0YXRlRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTUxNTgwODQyMDUyMjA0ODEwOTRMOwogCiAgICAgLyoqCkBAIC0zNywxNCArNDIsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgaWxsZWdhbCBwYXRoIHN0YXRlIGV4Y2VwdGlvbiB3aXRoIHRoZSAKLSAgICAgKiBzcGVjaWZpZWQgZGV0YWlsIG1lc3NhZ2UuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGlsbGVnYWwgcGF0aCBzdGF0ZSBleGNlcHRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGRldGFpbAorICAgICAqIG1lc3NhZ2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIHMgdGhlIGRldGFpbHMgb2YgdGhlIGVycm9yCisgICAgICogQHBhcmFtIHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWxzIG9mIHRoZSBlcnJvci4KICAgICAgKi8KICAgICBwdWJsaWMgSWxsZWdhbFBhdGhTdGF0ZUV4Y2VwdGlvbihTdHJpbmcgcykgewogICAgICAgICBzdXBlcihzKTsKICAgICB9CiAKIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2dlb20vTGluZTJELmphdmEgYi9hd3QvamF2YS9hd3QvZ2VvbS9MaW5lMkQuamF2YQppbmRleCBhNTNjNDcwLi5mY2Q1MWI2IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZ2VvbS9MaW5lMkQuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZ2VvbS9MaW5lMkQuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBEZW5pcyBNLiBLaXNoZW5rbwogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuZ2VvbTsKIAogaW1wb3J0IGphdmEuYXd0LlJlY3RhbmdsZTsKQEAgLTI3LDU1ICsyOCw3MSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFRoZSBDbGFzcyBMaW5lMkQgcmVwcmVzZW50cyBhIGxpbmUgd2hvc2UgZGF0YSBpcyBnaXZlbiBpbiAKLSAqIGhpZ2gtcHJlY2lzaW9uIHZhbHVlcyBhcHByb3ByaWF0ZSBmb3IgZ3JhcGhpY2FsIG9wZXJhdGlvbnMuCisgKiBUaGUgQ2xhc3MgTGluZTJEIHJlcHJlc2VudHMgYSBsaW5lIHdob3NlIGRhdGEgaXMgZ2l2ZW4gaW4gaGlnaC1wcmVjaXNpb24KKyAqIHZhbHVlcyBhcHByb3ByaWF0ZSBmb3IgZ3JhcGhpY2FsIG9wZXJhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTGluZTJEIGltcGxlbWVudHMgU2hhcGUsIENsb25lYWJsZSB7CiAKICAgICAvKioKLSAgICAgKiBUaGUgQ2xhc3MgRmxvYXQgaXMgdGhlIHN1YmNsYXNzIG9mIExpbmUyRCB0aGF0IGhhcyBhbGwgCi0gICAgICogb2YgaXRzIGRhdGEgdmFsdWVzIHN0b3JlZCB3aXRoIGZsb2F0LWxldmVsIHByZWNpc2lvbi4KKyAgICAgKiBUaGUgQ2xhc3MgRmxvYXQgaXMgdGhlIHN1YmNsYXNzIG9mIExpbmUyRCB0aGF0IGhhcyBhbGwgb2YgaXRzIGRhdGEgdmFsdWVzCisgICAgICogc3RvcmVkIHdpdGggZmxvYXQtbGV2ZWwgcHJlY2lzaW9uLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmxvYXQgZXh0ZW5kcyBMaW5lMkQgewogCi0gICAgICAgIC8qKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludC4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50LgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGZsb2F0IHgxOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50LiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludC4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmbG9hdCB5MTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmbG9hdCB4MjsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmbG9hdCB5MjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGZsb2F0LXZhbHVlZCBMaW5lMkQgd2l0aAotICAgICAgICAgKiBpdHMgZGF0YSB2YWx1ZXMgc2V0IHRvIHplcm8uCisgICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBmbG9hdC12YWx1ZWQgTGluZTJEIHdpdGggaXRzIGRhdGEgdmFsdWVzIHNldCB0bworICAgICAgICAgKiB6ZXJvLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIEZsb2F0KCkgewogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBmbG9hdC12YWx1ZWQgTGluZTJEIHdpdGgKLSAgICAgICAgICogdGhlIHNwZWNpZmllZCBlbmRwb2ludHMuCisgICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBmbG9hdC12YWx1ZWQgTGluZTJEIHdpdGggdGhlIHNwZWNpZmllZCBlbmRwb2ludHMuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0geDEgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQKLSAgICAgICAgICogQHBhcmFtIHkxIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50Ci0gICAgICAgICAqIEBwYXJhbSB4MiB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQKLSAgICAgICAgICogQHBhcmFtIHkyIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludAorICAgICAgICAgKiBAcGFyYW0geDEKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludC4KKyAgICAgICAgICogQHBhcmFtIHkxCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQuCisgICAgICAgICAqIEBwYXJhbSB4MgorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC4KKyAgICAgICAgICogQHBhcmFtIHkyCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIEZsb2F0KGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgeDIsIGZsb2F0IHkyKSB7CiAgICAgICAgICAgICBzZXRMaW5lKHgxLCB5MSwgeDIsIHkyKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZmxvYXQtdmFsdWVkIExpbmUyRCB3aXRoCi0gICAgICAgICAqIHRoZSBzcGVjaWZpZWQgZW5kcG9pbnRzLgorICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZmxvYXQtdmFsdWVkIExpbmUyRCB3aXRoIHRoZSBzcGVjaWZpZWQgZW5kcG9pbnRzLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHAxIHRoZSBzdGFydGluZyBwb2ludAotICAgICAgICAgKiBAcGFyYW0gcDIgdGhlIGVuZCBwb2ludAorICAgICAgICAgKiBAcGFyYW0gcDEKKyAgICAgICAgICogICAgICAgICAgICB0aGUgc3RhcnRpbmcgcG9pbnQuCisgICAgICAgICAqIEBwYXJhbSBwMgorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBlbmQgcG9pbnQuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgRmxvYXQoUG9pbnQyRCBwMSwgUG9pbnQyRCBwMikgewogICAgICAgICAgICAgc2V0TGluZShwMSwgcDIpOwpAQCAtMTIyLDEwICsxMzksMTQgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFNldHMgdGhlIGRhdGEgdmFsdWVzIHRoYXQgZGVmaW5lIHRoZSBsaW5lLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHgxIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50Ci0gICAgICAgICAqIEBwYXJhbSB5MSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludAotICAgICAgICAgKiBAcGFyYW0geDIgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50Ci0gICAgICAgICAqIEBwYXJhbSB5MiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQKKyAgICAgICAgICogQHBhcmFtIHgxCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQuCisgICAgICAgICAqIEBwYXJhbSB5MQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50LgorICAgICAgICAgKiBAcGFyYW0geDIKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuCisgICAgICAgICAqIEBwYXJhbSB5MgorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldExpbmUoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB4MiwgZmxvYXQgeTIpIHsKICAgICAgICAgICAgIHRoaXMueDEgPSB4MTsKQEAgLTE1NSw0OSArMTc2LDYzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhlIENsYXNzIERvdWJsZSBpcyB0aGUgc3ViY2xhc3Mgb2YgTGluZTJEIHRoYXQgaGFzIGFsbCAKLSAgICAgKiBvZiBpdHMgZGF0YSB2YWx1ZXMgc3RvcmVkIHdpdGggZG91YmxlLWxldmVsIHByZWNpc2lvbi4KKyAgICAgKiBUaGUgQ2xhc3MgRG91YmxlIGlzIHRoZSBzdWJjbGFzcyBvZiBMaW5lMkQgdGhhdCBoYXMgYWxsIG9mIGl0cyBkYXRhCisgICAgICogdmFsdWVzIHN0b3JlZCB3aXRoIGRvdWJsZS1sZXZlbCBwcmVjaXNpb24uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEb3VibGUgZXh0ZW5kcyBMaW5lMkQgewogCi0gICAgICAgIC8qKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludC4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50LgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGRvdWJsZSB4MTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludC4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZG91YmxlIHkxOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGRvdWJsZSB4MjsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBkb3VibGUgeTI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkb3VibGUtdmFsdWVkICBMaW5lMkQgd2l0aAotICAgICAgICAgKiBpdHMgZGF0YSB2YWx1ZXMgc2V0IHRvIHplcm8uCisgICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkb3VibGUtdmFsdWVkIExpbmUyRCB3aXRoIGl0cyBkYXRhIHZhbHVlcyBzZXQgdG8KKyAgICAgICAgICogemVyby4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBEb3VibGUoKSB7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRvdWJsZS12YWx1ZWQgTGluZTJEIHdpdGgKLSAgICAgICAgICogdGhlIHNwZWNpZmllZCBlbmRwb2ludHMuCisgICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkb3VibGUtdmFsdWVkIExpbmUyRCB3aXRoIHRoZSBzcGVjaWZpZWQgZW5kcG9pbnRzLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHgxIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50Ci0gICAgICAgICAqIEBwYXJhbSB5MSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludAotICAgICAgICAgKiBAcGFyYW0geDIgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50Ci0gICAgICAgICAqIEBwYXJhbSB5MiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQKKyAgICAgICAgICogQHBhcmFtIHgxCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQuCisgICAgICAgICAqIEBwYXJhbSB5MQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50LgorICAgICAgICAgKiBAcGFyYW0geDIKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuCisgICAgICAgICAqIEBwYXJhbSB5MgorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBEb3VibGUoZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSB4MiwgZG91YmxlIHkyKSB7CiAgICAgICAgICAgICBzZXRMaW5lKHgxLCB5MSwgeDIsIHkyKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZG91YmxlLXZhbHVlZCBMaW5lMkQgd2l0aAotICAgICAgICAgKiB0aGUgc3BlY2lmaWVkIGVuZHBvaW50cy4KKyAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRvdWJsZS12YWx1ZWQgTGluZTJEIHdpdGggdGhlIHNwZWNpZmllZCBlbmRwb2ludHMuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gcDEgdGhlIHN0YXJ0aW5nIHBvaW50Ci0gICAgICAgICAqIEBwYXJhbSBwMiB0aGUgZW5kIHBvaW50CisgICAgICAgICAqIEBwYXJhbSBwMQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBwb2ludC4KKyAgICAgICAgICogQHBhcmFtIHAyCisgICAgICAgICAqICAgICAgICAgICAgdGhlIGVuZCBwb2ludC4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBEb3VibGUoUG9pbnQyRCBwMSwgUG9pbnQyRCBwMikgewogICAgICAgICAgICAgc2V0TGluZShwMSwgcDIpOwpAQCAtMjYyLDM2ICsyOTcsNTAgQEAKICAgICB9CiAKICAgICAvKgotICAgICAqIExpbmUyRCBwYXRoIGl0ZXJhdG9yIAorICAgICAqIExpbmUyRCBwYXRoIGl0ZXJhdG9yCiAgICAgICovCiAgICAgLyoqCiAgICAgICogVGhlIHN1YmNsYXNzIG9mIFBhdGhJdGVyYXRvciB0byB0cmF2ZXJzZSBhIExpbmUyRC4KICAgICAgKi8KICAgICBjbGFzcyBJdGVyYXRvciBpbXBsZW1lbnRzIFBhdGhJdGVyYXRvciB7CiAKLSAgICAgICAgLyoqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0IGxpbmUgcG9pbnQuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydCBsaW5lIHBvaW50LgorICAgICAgICAgKi8KICAgICAgICAgZG91YmxlIHgxOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0IGxpbmUgcG9pbnQuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0IGxpbmUgcG9pbnQuCisgICAgICAgICAqLwogICAgICAgICBkb3VibGUgeTE7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIGxpbmUgcG9pbnQuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBsaW5lIHBvaW50LgorICAgICAgICAgKi8KICAgICAgICAgZG91YmxlIHgyOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBsaW5lIHBvaW50LiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgbGluZSBwb2ludC4KKyAgICAgICAgICovCiAgICAgICAgIGRvdWJsZSB5MjsKIAotICAgICAgICAvKiogVGhlIHBhdGggaXRlcmF0b3IgdHJhbnNmb3JtYXRpb24uICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcGF0aCBpdGVyYXRvciB0cmFuc2Zvcm1hdGlvbi4KKyAgICAgICAgICovCiAgICAgICAgIEFmZmluZVRyYW5zZm9ybSB0OwogCi0gICAgICAgIC8qKiBUaGUgY3VycmVudCBzZWdtZW5ldCBpbmRleC4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjdXJyZW50IHNlZ21lbnQgaW5kZXguCisgICAgICAgICAqLwogICAgICAgICBpbnQgaW5kZXg7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdHMgYSBuZXcgTGluZTJELkl0ZXJhdG9yIGZvciBnaXZlbiBsaW5lIGFuZCB0cmFuc2Zvcm1hdGlvbgorICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IExpbmUyRC5JdGVyYXRvciBmb3IgZ2l2ZW4gbGluZSBhbmQgdHJhbnNmb3JtYXRpb24uCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gbCAtIHRoZSBzb3VyY2UgTGluZTJEIG9iamVjdAotICAgICAgICAgKiBAcGFyYW0gYXQgLSB0aGUgQWZmaW5lVHJhbnNmb3JtIG9iamVjdCB0byBhcHBseSByZWN0YW5nbGUgcGF0aAorICAgICAgICAgKiBAcGFyYW0gbAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgTGluZTJEIG9iamVjdC4KKyAgICAgICAgICogQHBhcmFtIGF0CisgICAgICAgICAqICAgICAgICAgICAgdGhlIEFmZmluZVRyYW5zZm9ybSBvYmplY3QgdG8gYXBwbHkgcmVjdGFuZ2xlIHBhdGguCiAgICAgICAgICAqLwogICAgICAgICBJdGVyYXRvcihMaW5lMkQgbCwgQWZmaW5lVHJhbnNmb3JtIGF0KSB7CiAgICAgICAgICAgICB0aGlzLngxID0gbC5nZXRYMSgpOwpAQCAtMzY2LDYwICs0MTUsNjYgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQKKyAgICAgKiBAcmV0dXJuIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBkb3VibGUgZ2V0WDEoKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludAorICAgICAqIEByZXR1cm4gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGRvdWJsZSBnZXRZMSgpOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgeDIKKyAgICAgKiBAcmV0dXJuIHRoZSB4Mi4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgZG91YmxlIGdldFgyKCk7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludAorICAgICAqIEByZXR1cm4gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBkb3VibGUgZ2V0WTIoKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHAgdGhlIHN0YXJ0aW5nIHBvaW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHAgdGhlIHN0YXJ0aW5nIHBvaW50CisgICAgICogQHJldHVybiB0aGUgcCB0aGUgc3RhcnRpbmcgcG9pbnQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFBvaW50MkQgZ2V0UDEoKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHAgZW5kIHBvaW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHAgZW5kIHBvaW50CisgICAgICogQHJldHVybiB0aGUgcCBlbmQgcG9pbnQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFBvaW50MkQgZ2V0UDIoKTsKIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGxpbmUncyBlbmRwb2ludHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHgxIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50Ci0gICAgICogQHBhcmFtIHkxIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50Ci0gICAgICogQHBhcmFtIHgyIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludAotICAgICAqIEBwYXJhbSB5MiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQKKyAgICAgKiBAcGFyYW0geDEKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50LgorICAgICAqIEBwYXJhbSB5MQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQuCisgICAgICogQHBhcmFtIHgyCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuCisgICAgICogQHBhcmFtIHkyCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TGluZShkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIHgyLCBkb3VibGUgeTIpOwogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgbGluZSdzIGVuZHBvaW50cy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcDEgdGhlIHN0YXJ0aW5nIHBvaW50Ci0gICAgICogQHBhcmFtIHAyIHRoZSBlbmQgcG9pbnQKKyAgICAgKiBAcGFyYW0gcDEKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBwb2ludC4KKyAgICAgKiBAcGFyYW0gcDIKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbmQgcG9pbnQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TGluZShQb2ludDJEIHAxLCBQb2ludDJEIHAyKSB7CiAgICAgICAgIHNldExpbmUocDEuZ2V0WCgpLCBwMS5nZXRZKCksIHAyLmdldFgoKSwgcDIuZ2V0WSgpKTsKQEAgLTQyOCwzOSArNDgzLDQ0IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgbGluZSdzIGVuZHBvaW50cyBieSBjb3B5aW5nIHRoZSBkYXRhIGZyb20gYW5vdGhlciBMaW5lMkQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGxpbmUgdGhlIExpbmUyRCB0byBjb3B5IHRoZSBlbmRwb2ludCBkYXRhIGZyb20KKyAgICAgKiBAcGFyYW0gbGluZQorICAgICAqICAgICAgICAgICAgdGhlIExpbmUyRCB0byBjb3B5IHRoZSBlbmRwb2ludCBkYXRhIGZyb20uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TGluZShMaW5lMkQgbGluZSkgewogICAgICAgICBzZXRMaW5lKGxpbmUuZ2V0WDEoKSwgbGluZS5nZXRZMSgpLCBsaW5lLmdldFgyKCksIGxpbmUuZ2V0WTIoKSk7CiAgICAgfQogCiAgICAgcHVibGljIFJlY3RhbmdsZSBnZXRCb3VuZHMoKSB7Ci0gICAgcmV0dXJuIGdldEJvdW5kczJEKCkuZ2V0Qm91bmRzKCk7CisgICAgICAgIHJldHVybiBnZXRCb3VuZHMyRCgpLmdldEJvdW5kcygpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRlbGxzIHdoZXJlIHRoZSBwb2ludCBpcyB3aXRoIHJlc3BlY3QgdG8gdGhlIGxpbmUgc2VnbWVudCwgCi0gICAgICogZ2l2ZW4gdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBsaW5lIHNlZ21lbnQuIElmIHRoZSByYXkgCi0gICAgICogZm91bmQgYnkgZXh0ZW5kaW5nIHRoZSBsaW5lIHNlZ21lbnQgZnJvbSBpdHMgc3RhcnRpbmcgcG9pbnQgCi0gICAgICogaXMgcm90YXRlZCwgdGhpcyBtZXRob2QgdGVsbHMgd2hldGhlciB0aGUgcmF5Ci0gICAgICogc2hvdWxkIHJvdGF0ZSBpbiBhIGNsb2Nrd2lzZSBkaXJlY3Rpb24gb3IgYSBjb3VudGVyLWNsb2Nrd2lzZQotICAgICAqIGRpcmVjdGlvbiB0byBoaXQgdGhlIHBvaW50IGZpcnN0LiBUaGUgcmV0dXJuIHZhbHVlIGlzIDAgaWYgdGhlIAotICAgICAqIHBvaW50IGlzIG9uIHRoZSBsaW5lIHNlZ21lbnQsIGl0J3MgMSBpZiB0aGUgcG9pbnQgaXMgb24gdGhlIHJheSAKLSAgICAgKiBvciBpZiB0aGUgcmF5IHNob3VsZCByb3RhdGUgaW4gYSBjb3VudGVyLWNsb2Nrd2lzZSBkaXJlY3Rpb24gdG8gZ2V0IHRvIHRoZQotICAgICAqIHBvaW50LCBhbmQgaXQncyAtMSBpZiB0aGUgcmF5IHNob3VsZCByb3RhdGUgaW4gYSBjbG9ja3dpc2UgCi0gICAgICogZGlyZWN0aW9uIHRvIGdldCB0byB0aGUgcG9pbnQgb3IgaWYgdGhlIHBvaW50IGlzIG9uIHRoZSBsaW5lIAotICAgICAqIGRldGVybWluZWQgYnkgdGhlIGxpbmUgc2VnbWVudCBidXQgbm90IG9uIHRoZSByYXkgZnJvbSB0aGUgCi0gICAgICogc2VnbWVudCdzIHN0YXJ0aW5nIHBvaW50IGFuZCB0aHJvdWdoIGl0cyBlbmQgcG9pbnQuCisgICAgICogVGVsbHMgd2hlcmUgdGhlIHBvaW50IGlzIHdpdGggcmVzcGVjdCB0byB0aGUgbGluZSBzZWdtZW50LCBnaXZlbiB0aGUKKyAgICAgKiBvcmllbnRhdGlvbiBvZiB0aGUgbGluZSBzZWdtZW50LiBJZiB0aGUgcmF5IGZvdW5kIGJ5IGV4dGVuZGluZyB0aGUgbGluZQorICAgICAqIHNlZ21lbnQgZnJvbSBpdHMgc3RhcnRpbmcgcG9pbnQgaXMgcm90YXRlZCwgdGhpcyBtZXRob2QgdGVsbHMgd2hldGhlciB0aGUKKyAgICAgKiByYXkgc2hvdWxkIHJvdGF0ZSBpbiBhIGNsb2Nrd2lzZSBkaXJlY3Rpb24gb3IgYSBjb3VudGVyLWNsb2Nrd2lzZQorICAgICAqIGRpcmVjdGlvbiB0byBoaXQgdGhlIHBvaW50IGZpcnN0LiBUaGUgcmV0dXJuIHZhbHVlIGlzIDAgaWYgdGhlIHBvaW50IGlzCisgICAgICogb24gdGhlIGxpbmUgc2VnbWVudCwgaXQncyAxIGlmIHRoZSBwb2ludCBpcyBvbiB0aGUgcmF5IG9yIGlmIHRoZSByYXkKKyAgICAgKiBzaG91bGQgcm90YXRlIGluIGEgY291bnRlci1jbG9ja3dpc2UgZGlyZWN0aW9uIHRvIGdldCB0byB0aGUgcG9pbnQsIGFuZAorICAgICAqIGl0J3MgLTEgaWYgdGhlIHJheSBzaG91bGQgcm90YXRlIGluIGEgY2xvY2t3aXNlIGRpcmVjdGlvbiB0byBnZXQgdG8gdGhlCisgICAgICogcG9pbnQgb3IgaWYgdGhlIHBvaW50IGlzIG9uIHRoZSBsaW5lIGRldGVybWluZWQgYnkgdGhlIGxpbmUgc2VnbWVudCBidXQKKyAgICAgKiBub3Qgb24gdGhlIHJheSBmcm9tIHRoZSBzZWdtZW50J3Mgc3RhcnRpbmcgcG9pbnQgYW5kIHRocm91Z2ggaXRzIGVuZAorICAgICAqIHBvaW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSB4MSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgbGluZSBzZWdtZW50Ci0gICAgICogQHBhcmFtIHkxIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQKLSAgICAgKiBAcGFyYW0geDIgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQKLSAgICAgKiBAcGFyYW0geTIgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQKLSAgICAgKiBAcGFyYW0gcHggdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdGVzdCBwb2ludAotICAgICAqIEBwYXJhbSBweSB0aGUgcCBjb29yZGluYXRlIG9mIHRoZSB0ZXN0IHBvaW50Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgdGhhdCBkZXNjcmliZXMgd2hlcmUgdGhlIHBvaW50IGlzIHdpdGggcmVzcGVjdCB0byB0aGUgbGluZSBzZWdtZW50LCAKLSAgICAgKiBnaXZlbiB0aGUgb3JpZW50YXRpb24gb2YgdGhlIGxpbmUgc2VnbWVudAorICAgICAqIEBwYXJhbSB4MQorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGxpbmUgc2VnbWVudC4KKyAgICAgKiBAcGFyYW0geTEKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQuCisgICAgICogQHBhcmFtIHgyCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGxpbmUgc2VnbWVudC4KKyAgICAgKiBAcGFyYW0geTIKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvZiB0aGUgbGluZSBzZWdtZW50LgorICAgICAqIEBwYXJhbSBweAorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdGVzdCBwb2ludC4KKyAgICAgKiBAcGFyYW0gcHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBwIGNvb3JkaW5hdGUgb2YgdGhlIHRlc3QgcG9pbnQuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgdGhhdCBkZXNjcmliZXMgd2hlcmUgdGhlIHBvaW50IGlzIHdpdGggcmVzcGVjdCB0byB0aGUKKyAgICAgKiAgICAgICAgIGxpbmUgc2VnbWVudCwgZ2l2ZW4gdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBsaW5lIHNlZ21lbnQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgcmVsYXRpdmVDQ1coZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSB4MiwgZG91YmxlIHkyLCBkb3VibGUgcHgsIGRvdWJsZSBweSkgewogICAgICAgICAvKgpAQCAtNDg3LDQ3ICs1NDcsNDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUZWxscyB3aGVyZSB0aGUgcG9pbnQgaXMgd2l0aCByZXNwZWN0IHRvIHRoaXMgbGluZSBzZWdtZW50LCAKLSAgICAgKiBnaXZlbiB0aGUgb3JpZW50YXRpb24gb2YgdGhpcyBsaW5lIHNlZ21lbnQuIElmIHRoZSByYXkgCi0gICAgICogZm91bmQgYnkgZXh0ZW5kaW5nIHRoZSBsaW5lIHNlZ21lbnQgZnJvbSBpdHMgc3RhcnRpbmcgcG9pbnQgCi0gICAgICogaXMgcm90YXRlZCwgdGhpcyBtZXRob2QgdGVsbHMgd2hldGhlciB0aGUgcmF5Ci0gICAgICogc2hvdWxkIHJvdGF0ZSBpbiBhIGNsb2Nrd2lzZSBkaXJlY3Rpb24gb3IgYSBjb3VudGVyLWNsb2Nrd2lzZQotICAgICAqIGRpcmVjdGlvbiB0byBoaXQgdGhlIHBvaW50IGZpcnN0LiBUaGUgcmV0dXJuIHZhbHVlIGlzIDAgaWYgdGhlIAotICAgICAqIHBvaW50IGlzIG9uIHRoZSBsaW5lIHNlZ21lbnQsIGl0J3MgMSBpZiB0aGUgcG9pbnQgaXMgb24gdGhlIHJheSAKLSAgICAgKiBvciBpZiB0aGUgcmF5IHNob3VsZCByb3RhdGUgaW4gYSBjb3VudGVyLWNsb2Nrd2lzZSBkaXJlY3Rpb24gdG8gZ2V0IHRvIHRoZQotICAgICAqIHBvaW50LCBhbmQgaXQncyAtMSBpZiB0aGUgcmF5IHNob3VsZCByb3RhdGUgaW4gYSBjbG9ja3dpc2UgCi0gICAgICogZGlyZWN0aW9uIHRvIGdldCB0byB0aGUgcG9pbnQgb3IgaWYgdGhlIHBvaW50IGlzIG9uIHRoZSBsaW5lIAotICAgICAqIGRldGVybWluZWQgYnkgdGhlIGxpbmUgc2VnbWVudCBidXQgbm90IG9uIHRoZSByYXkgZnJvbSB0aGUgCi0gICAgICogc2VnbWVudCdzIHN0YXJ0aW5nIHBvaW50IGFuZCB0aHJvdWdoIGl0cyBlbmQgcG9pbnQuCisgICAgICogVGVsbHMgd2hlcmUgdGhlIHBvaW50IGlzIHdpdGggcmVzcGVjdCB0byB0aGlzIGxpbmUgc2VnbWVudCwgZ2l2ZW4gdGhlCisgICAgICogb3JpZW50YXRpb24gb2YgdGhpcyBsaW5lIHNlZ21lbnQuIElmIHRoZSByYXkgZm91bmQgYnkgZXh0ZW5kaW5nIHRoZSBsaW5lCisgICAgICogc2VnbWVudCBmcm9tIGl0cyBzdGFydGluZyBwb2ludCBpcyByb3RhdGVkLCB0aGlzIG1ldGhvZCB0ZWxscyB3aGV0aGVyIHRoZQorICAgICAqIHJheSBzaG91bGQgcm90YXRlIGluIGEgY2xvY2t3aXNlIGRpcmVjdGlvbiBvciBhIGNvdW50ZXItY2xvY2t3aXNlCisgICAgICogZGlyZWN0aW9uIHRvIGhpdCB0aGUgcG9pbnQgZmlyc3QuIFRoZSByZXR1cm4gdmFsdWUgaXMgMCBpZiB0aGUgcG9pbnQgaXMKKyAgICAgKiBvbiB0aGUgbGluZSBzZWdtZW50LCBpdCdzIDEgaWYgdGhlIHBvaW50IGlzIG9uIHRoZSByYXkgb3IgaWYgdGhlIHJheQorICAgICAqIHNob3VsZCByb3RhdGUgaW4gYSBjb3VudGVyLWNsb2Nrd2lzZSBkaXJlY3Rpb24gdG8gZ2V0IHRvIHRoZSBwb2ludCwgYW5kCisgICAgICogaXQncyAtMSBpZiB0aGUgcmF5IHNob3VsZCByb3RhdGUgaW4gYSBjbG9ja3dpc2UgZGlyZWN0aW9uIHRvIGdldCB0byB0aGUKKyAgICAgKiBwb2ludCBvciBpZiB0aGUgcG9pbnQgaXMgb24gdGhlIGxpbmUgZGV0ZXJtaW5lZCBieSB0aGUgbGluZSBzZWdtZW50IGJ1dAorICAgICAqIG5vdCBvbiB0aGUgcmF5IGZyb20gdGhlIHNlZ21lbnQncyBzdGFydGluZyBwb2ludCBhbmQgdGhyb3VnaCBpdHMgZW5kCisgICAgICogcG9pbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHB4IHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHRlc3QgcG9pbnQKLSAgICAgKiBAcGFyYW0gcHkgdGhlIHAgY29vcmRpbmF0ZSBvZiB0aGUgdGVzdCBwb2ludAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHRoYXQgZGVzY3JpYmVzIHdoZXJlIHRoZSBwb2ludCBpcyB3aXRoIHJlc3BlY3QgdG8gCi0gICAgICogdGhpcyBsaW5lIHNlZ21lbnQsIGdpdmVuIHRoZSBvcmllbnRhdGlvbiBvZiB0aGlzIGxpbmUgc2VnbWVudAorICAgICAqIEBwYXJhbSBweAorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdGVzdCBwb2ludC4KKyAgICAgKiBAcGFyYW0gcHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBwIGNvb3JkaW5hdGUgb2YgdGhlIHRlc3QgcG9pbnQuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgdGhhdCBkZXNjcmliZXMgd2hlcmUgdGhlIHBvaW50IGlzIHdpdGggcmVzcGVjdCB0byB0aGlzCisgICAgICogICAgICAgICBsaW5lIHNlZ21lbnQsIGdpdmVuIHRoZSBvcmllbnRhdGlvbiBvZiB0aGlzIGxpbmUgc2VnbWVudC4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IHJlbGF0aXZlQ0NXKGRvdWJsZSBweCwgZG91YmxlIHB5KSB7CiAgICAgICAgIHJldHVybiByZWxhdGl2ZUNDVyhnZXRYMSgpLCBnZXRZMSgpLCBnZXRYMigpLCBnZXRZMigpLCBweCwgcHkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRlbGxzIHdoZXJlIHRoZSBwb2ludCBpcyB3aXRoIHJlc3BlY3QgdG8gdGhpcyBsaW5lIHNlZ21lbnQsIAotICAgICAqIGdpdmVuIHRoZSBvcmllbnRhdGlvbiBvZiB0aGlzIGxpbmUgc2VnbWVudC4gSWYgdGhlIHJheSAKLSAgICAgKiBmb3VuZCBieSBleHRlbmRpbmcgdGhlIGxpbmUgc2VnbWVudCBmcm9tIGl0cyBzdGFydGluZyBwb2ludCAKLSAgICAgKiBpcyByb3RhdGVkLCB0aGlzIG1ldGhvZCB0ZWxscyB3aGV0aGVyIHRoZSByYXkKLSAgICAgKiBzaG91bGQgcm90YXRlIGluIGEgY2xvY2t3aXNlIGRpcmVjdGlvbiBvciBhIGNvdW50ZXItY2xvY2t3aXNlCi0gICAgICogZGlyZWN0aW9uIHRvIGhpdCB0aGUgcG9pbnQgZmlyc3QuIFRoZSByZXR1cm4gdmFsdWUgaXMgMCBpZiB0aGUgCi0gICAgICogcG9pbnQgaXMgb24gdGhlIGxpbmUgc2VnbWVudCwgaXQncyAxIGlmIHRoZSBwb2ludCBpcyBvbiB0aGUgcmF5IAotICAgICAqIG9yIGlmIHRoZSByYXkgc2hvdWxkIHJvdGF0ZSBpbiBhIGNvdW50ZXItY2xvY2t3aXNlIGRpcmVjdGlvbiB0byBnZXQgdG8gdGhlCi0gICAgICogcG9pbnQsIGFuZCBpdCdzIC0xIGlmIHRoZSByYXkgc2hvdWxkIHJvdGF0ZSBpbiBhIGNsb2Nrd2lzZSAKLSAgICAgKiBkaXJlY3Rpb24gdG8gZ2V0IHRvIHRoZSBwb2ludCBvciBpZiB0aGUgcG9pbnQgaXMgb24gdGhlIGxpbmUgCi0gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgbGluZSBzZWdtZW50IGJ1dCBub3Qgb24gdGhlIHJheSBmcm9tIHRoZSAKLSAgICAgKiBzZWdtZW50J3Mgc3RhcnRpbmcgcG9pbnQgYW5kIHRocm91Z2ggaXRzIGVuZCBwb2ludC4KKyAgICAgKiBUZWxscyB3aGVyZSB0aGUgcG9pbnQgaXMgd2l0aCByZXNwZWN0IHRvIHRoaXMgbGluZSBzZWdtZW50LCBnaXZlbiB0aGUKKyAgICAgKiBvcmllbnRhdGlvbiBvZiB0aGlzIGxpbmUgc2VnbWVudC4gSWYgdGhlIHJheSBmb3VuZCBieSBleHRlbmRpbmcgdGhlIGxpbmUKKyAgICAgKiBzZWdtZW50IGZyb20gaXRzIHN0YXJ0aW5nIHBvaW50IGlzIHJvdGF0ZWQsIHRoaXMgbWV0aG9kIHRlbGxzIHdoZXRoZXIgdGhlCisgICAgICogcmF5IHNob3VsZCByb3RhdGUgaW4gYSBjbG9ja3dpc2UgZGlyZWN0aW9uIG9yIGEgY291bnRlci1jbG9ja3dpc2UKKyAgICAgKiBkaXJlY3Rpb24gdG8gaGl0IHRoZSBwb2ludCBmaXJzdC4gVGhlIHJldHVybiB2YWx1ZSBpcyAwIGlmIHRoZSBwb2ludCBpcworICAgICAqIG9uIHRoZSBsaW5lIHNlZ21lbnQsIGl0J3MgMSBpZiB0aGUgcG9pbnQgaXMgb24gdGhlIHJheSBvciBpZiB0aGUgcmF5CisgICAgICogc2hvdWxkIHJvdGF0ZSBpbiBhIGNvdW50ZXItY2xvY2t3aXNlIGRpcmVjdGlvbiB0byBnZXQgdG8gdGhlIHBvaW50LCBhbmQKKyAgICAgKiBpdCdzIC0xIGlmIHRoZSByYXkgc2hvdWxkIHJvdGF0ZSBpbiBhIGNsb2Nrd2lzZSBkaXJlY3Rpb24gdG8gZ2V0IHRvIHRoZQorICAgICAqIHBvaW50IG9yIGlmIHRoZSBwb2ludCBpcyBvbiB0aGUgbGluZSBkZXRlcm1pbmVkIGJ5IHRoZSBsaW5lIHNlZ21lbnQgYnV0CisgICAgICogbm90IG9uIHRoZSByYXkgZnJvbSB0aGUgc2VnbWVudCdzIHN0YXJ0aW5nIHBvaW50IGFuZCB0aHJvdWdoIGl0cyBlbmQKKyAgICAgKiBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcCB0aGUgdGVzdCBwb2ludAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHRoYXQgZGVzY3JpYmVzIHdoZXJlIHRoZSBwb2ludCBpcyB3aXRoIHJlc3BlY3QgdG8gCi0gICAgICogdGhpcyBsaW5lIHNlZ21lbnQsIGdpdmVuIHRoZSBvcmllbnRhdGlvbiBvZiB0aGlzIGxpbmUgc2VnbWVudAorICAgICAqIEBwYXJhbSBwCisgICAgICogICAgICAgICAgICB0aGUgdGVzdCBwb2ludC4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSB0aGF0IGRlc2NyaWJlcyB3aGVyZSB0aGUgcG9pbnQgaXMgd2l0aCByZXNwZWN0IHRvIHRoaXMKKyAgICAgKiAgICAgICAgIGxpbmUgc2VnbWVudCwgZ2l2ZW4gdGhlIG9yaWVudGF0aW9uIG9mIHRoaXMgbGluZSBzZWdtZW50LgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgcmVsYXRpdmVDQ1coUG9pbnQyRCBwKSB7CiAgICAgICAgIHJldHVybiByZWxhdGl2ZUNDVyhnZXRYMSgpLCBnZXRZMSgpLCBnZXRYMigpLCBnZXRZMigpLCBwLmdldFgoKSwgcC5nZXRZKCkpOwpAQCAtNTM2LDI4ICs1OTUsMzEgQEAKICAgICAvKioKICAgICAgKiBUZWxscyB3aGV0aGVyIHRoZSB0d28gbGluZSBzZWdtZW50cyBjcm9zcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geDEgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGZpcnN0IHNlZ21lbnQKLSAgICAgKiBAcGFyYW0geTEgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGZpcnN0IHNlZ21lbnQKLSAgICAgKiBAcGFyYW0geDIgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBmaXJzdCBzZWdtZW50Ci0gICAgICogQHBhcmFtIHkyIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvZiB0aGUgZmlyc3Qgc2VnbWVudAotICAgICAqIEBwYXJhbSB4MyB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgc2Vjb25kIHNlZ21lbnQKLSAgICAgKiBAcGFyYW0geTMgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIHNlY29uZCBzZWdtZW50Ci0gICAgICogQHBhcmFtIHg0IHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvZiB0aGUgc2Vjb25kIHNlZ21lbnQKLSAgICAgKiBAcGFyYW0geTQgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBzZWNvbmQgc2VnbWVudAotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHR3byBsaW5lIHNlZ21lbnRzIGNyb3NzCisgICAgICogQHBhcmFtIHgxCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgZmlyc3Qgc2VnbWVudC4KKyAgICAgKiBAcGFyYW0geTEKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBmaXJzdCBzZWdtZW50LgorICAgICAqIEBwYXJhbSB4MgorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBmaXJzdCBzZWdtZW50LgorICAgICAqIEBwYXJhbSB5MgorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBmaXJzdCBzZWdtZW50LgorICAgICAqIEBwYXJhbSB4MworICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIHNlY29uZCBzZWdtZW50LgorICAgICAqIEBwYXJhbSB5MworICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIHNlY29uZCBzZWdtZW50LgorICAgICAqIEBwYXJhbSB4NAorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBzZWNvbmQgc2VnbWVudC4KKyAgICAgKiBAcGFyYW0geTQKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvZiB0aGUgc2Vjb25kIHNlZ21lbnQuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgdHdvIGxpbmUgc2VnbWVudHMgY3Jvc3MuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGxpbmVzSW50ZXJzZWN0KGRvdWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUgeDIsCi0gICAgICAgICAgICBkb3VibGUgeTIsIGRvdWJsZSB4MywgZG91YmxlIHkzLCBkb3VibGUgeDQsIGRvdWJsZSB5NCkKLSAgICB7CisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGxpbmVzSW50ZXJzZWN0KGRvdWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUgeDIsIGRvdWJsZSB5MiwgZG91YmxlIHgzLAorICAgICAgICAgICAgZG91YmxlIHkzLCBkb3VibGUgeDQsIGRvdWJsZSB5NCkgewogICAgICAgICAvKgogICAgICAgICAgKiBBID0gKHgyLXgxLCB5Mi15MSkgQiA9ICh4My14MSwgeTMteTEpIEMgPSAoeDQteDEsIHk0LXkxKSBEID0gKHg0LXgzLAotICAgICAgICAgKiB5NC15MykgPSBDLUIgRSA9ICh4MS14MywgeTEteTMpID0gLUIgRiA9ICh4Mi14MywgeTIteTMpID0gQS1CCi0gICAgICAgICAqCi0gICAgICAgICAqIFJlc3VsdCBpcyAoKEF4QikgKiAoQXhDKSA8PTApIGFuZCAoKER4RSkgKiAoRHhGKSA8PSAwKQotICAgICAgICAgKgotICAgICAgICAgKiBEeEUgPSAoQy1CKXgoLUIpID0gQnhCLUN4QiA9IEJ4QyBEeEYgPSAoQy1CKXgoQS1CKSA9IEN4QS1DeEItQnhBK0J4QiA9Ci0gICAgICAgICAqIEF4QitCeEMtQXhDCisgICAgICAgICAqIHk0LXkzKSA9IEMtQiBFID0gKHgxLXgzLCB5MS15MykgPSAtQiBGID0gKHgyLXgzLCB5Mi15MykgPSBBLUIgUmVzdWx0CisgICAgICAgICAqIGlzICgoQXhCKSAoQXhDKSA8PTApIGFuZCAoKER4RSkgKER4RikgPD0gMCkgRHhFID0gKEMtQil4KC1CKSA9CisgICAgICAgICAqIEJ4Qi1DeEIgPSBCeEMgRHhGID0gKEMtQil4KEEtQikgPSBDeEEtQ3hCLUJ4QStCeEIgPSBBeEIrQnhDLUF4QwogICAgICAgICAgKi8KIAogICAgICAgICB4MiAtPSB4MTsgLy8gQQpAQCAtNTczLDE2ICs2MzUsMTQgQEAKICAgICAgICAgLy8gT25saW5lCiAgICAgICAgIGlmIChBdkIgPT0gMC4wICYmIEF2QyA9PSAwLjApIHsKICAgICAgICAgICAgIGlmICh4MiAhPSAwLjApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgKHg0ICogeDMgPD0gMC4wKSB8fAotICAgICAgICAgICAgICAgICAgICAoKHgzICogeDIgPj0gMC4wKSAmJgotICAgICAgICAgICAgICAgICAgICAgKHgyID4gMC4wID8geDMgPD0geDIgfHwgeDQgPD0geDIgOiB4MyA+PSB4MiB8fCB4NCA+PSB4MikpOworICAgICAgICAgICAgICAgIHJldHVybiAoeDQgKiB4MyA8PSAwLjApCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKHgzICogeDIgPj0gMC4wKSAmJiAoeDIgPiAwLjAgPyB4MyA8PSB4MiB8fCB4NCA8PSB4MiA6IHgzID49IHgyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHg0ID49IHgyKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoeTIgIT0gMC4wKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgICh5NCAqIHkzIDw9IDAuMCkgfHwKLSAgICAgICAgICAgICAgICAgICAgKCh5MyAqIHkyID49IDAuMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICh5MiA+IDAuMCA/IHkzIDw9IHkyIHx8IHk0IDw9IHkyIDogeTMgPj0geTIgfHwgeTQgPj0geTIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHk0ICogeTMgPD0gMC4wKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKCh5MyAqIHkyID49IDAuMCkgJiYgKHkyID4gMC4wID8geTMgPD0geTIgfHwgeTQgPD0geTIgOiB5MyA+PSB5MgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB5NCA+PSB5MikpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CkBAIC01OTUsMTIgKzY1NSwxNSBAQAogICAgIC8qKgogICAgICAqIFRlbGxzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBsaW5lIHNlZ21lbnRzIGNyb3NzZXMgdGhpcyBsaW5lIHNlZ21lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHgxIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSB0ZXN0IHNlZ21lbnQKLSAgICAgKiBAcGFyYW0geTEgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIHRlc3Qgc2VnbWVudAotICAgICAqIEBwYXJhbSB4MiB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIHRlc3Qgc2VnbWVudAotICAgICAqIEBwYXJhbSB5MiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIHRlc3Qgc2VnbWVudAotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCBsaW5lIHNlZ21lbnRzIGNyb3NzZXMgdGhpcyBsaW5lIHNlZ21lbnQKKyAgICAgKiBAcGFyYW0geDEKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSB0ZXN0IHNlZ21lbnQuCisgICAgICogQHBhcmFtIHkxCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgdGVzdCBzZWdtZW50LgorICAgICAqIEBwYXJhbSB4MgorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSB0ZXN0IHNlZ21lbnQuCisgICAgICogQHBhcmFtIHkyCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIHRlc3Qgc2VnbWVudC4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgbGluZSBzZWdtZW50cyBjcm9zc2VzIHRoaXMgbGluZSBzZWdtZW50LgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGludGVyc2VjdHNMaW5lKGRvdWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUgeDIsIGRvdWJsZSB5MikgewogICAgICAgICByZXR1cm4gbGluZXNJbnRlcnNlY3QoeDEsIHkxLCB4MiwgeTIsIGdldFgxKCksIGdldFkxKCksIGdldFgyKCksIGdldFkyKCkpOwpAQCAtNjA5LDMxICs2NzIsMzcgQEAKICAgICAvKioKICAgICAgKiBUZWxscyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbGluZSBzZWdtZW50cyBjcm9zc2VzIHRoaXMgbGluZSBzZWdtZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBsIHRoZSB0ZXN0IHNlZ21lbnQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgbGluZSBzZWdtZW50cyBjcm9zc2VzIHRoaXMgbGluZSBzZWdtZW50Ci0gICAgICogCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBsIGlzIG51bGwKKyAgICAgKiBAcGFyYW0gbAorICAgICAqICAgICAgICAgICAgdGhlIHRlc3Qgc2VnbWVudC4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgbGluZSBzZWdtZW50cyBjcm9zc2VzIHRoaXMgbGluZSBzZWdtZW50LgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBsIGlzIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaW50ZXJzZWN0c0xpbmUoTGluZTJEIGwpIHsKLSAgICAgICAgcmV0dXJuIGxpbmVzSW50ZXJzZWN0KGwuZ2V0WDEoKSwgbC5nZXRZMSgpLCBsLmdldFgyKCksIGwuZ2V0WTIoKSwgZ2V0WDEoKSwgZ2V0WTEoKSwgZ2V0WDIoKSwgZ2V0WTIoKSk7CisgICAgICAgIHJldHVybiBsaW5lc0ludGVyc2VjdChsLmdldFgxKCksIGwuZ2V0WTEoKSwgbC5nZXRYMigpLCBsLmdldFkyKCksIGdldFgxKCksIGdldFkxKCksCisgICAgICAgICAgICAgICAgZ2V0WDIoKSwgZ2V0WTIoKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2l2ZXMgdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoZSAKLSAgICAgKiBsaW5lIHNlZ21lbnQuCisgICAgICogR2l2ZXMgdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoZSBsaW5lIHNlZ21lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHgxIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQKLSAgICAgKiBAcGFyYW0geTEgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGxpbmUgc2VnbWVudAotICAgICAqIEBwYXJhbSB4MiB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGxpbmUgc2VnbWVudAotICAgICAqIEBwYXJhbSB5MiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGxpbmUgc2VnbWVudAotICAgICAqIEBwYXJhbSBweCB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB0ZXN0IHBvaW50Ci0gICAgICogQHBhcmFtIHB5IHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHRlc3QgcG9pbnQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0aGUgc3F1YXJlIG9mIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludCBhbmQgdGhlIAotICAgICAqIGxpbmUgc2VnbWVudAorICAgICAqIEBwYXJhbSB4MQorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGxpbmUgc2VnbWVudC4KKyAgICAgKiBAcGFyYW0geTEKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQuCisgICAgICogQHBhcmFtIHgyCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGxpbmUgc2VnbWVudC4KKyAgICAgKiBAcGFyYW0geTIKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvZiB0aGUgbGluZSBzZWdtZW50LgorICAgICAqIEBwYXJhbSBweAorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdGVzdCBwb2ludC4KKyAgICAgKiBAcGFyYW0gcHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHRlc3QgcG9pbnQuCisgICAgICogQHJldHVybiB0aGUgdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoZSBsaW5lCisgICAgICogICAgICAgICBzZWdtZW50LgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIHB0U2VnRGlzdFNxKGRvdWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUgeDIsIGRvdWJsZSB5MiwgZG91YmxlIHB4LCBkb3VibGUgcHkpIHsKKyAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBwdFNlZ0Rpc3RTcShkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIHgyLCBkb3VibGUgeTIsIGRvdWJsZSBweCwKKyAgICAgICAgICAgIGRvdWJsZSBweSkgewogICAgICAgICAvKgogICAgICAgICAgKiBBID0gKHgyIC0geDEsIHkyIC0geTEpIFAgPSAocHggLSB4MSwgcHkgLSB5MSkKICAgICAgICAgICovCkBAIC02NjEsOTIgKzczMCw5NSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdpdmVzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludCBhbmQgdGhlIAotICAgICAqIGxpbmUgc2VnbWVudC4KKyAgICAgKiBHaXZlcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoZSBsaW5lIHNlZ21lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHgxIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQKLSAgICAgKiBAcGFyYW0geTEgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGxpbmUgc2VnbWVudAotICAgICAqIEBwYXJhbSB4MiB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGxpbmUgc2VnbWVudAotICAgICAqIEBwYXJhbSB5MiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGxpbmUgc2VnbWVudAotICAgICAqIEBwYXJhbSBweCB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB0ZXN0IHBvaW50Ci0gICAgICogQHBhcmFtIHB5IHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHRlc3QgcG9pbnQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoZSAKLSAgICAgKiBsaW5lIHNlZ21lbnQKKyAgICAgKiBAcGFyYW0geDEKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQuCisgICAgICogQHBhcmFtIHkxCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgbGluZSBzZWdtZW50LgorICAgICAqIEBwYXJhbSB4MgorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQuCisgICAgICogQHBhcmFtIHkyCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGxpbmUgc2VnbWVudC4KKyAgICAgKiBAcGFyYW0gcHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHRlc3QgcG9pbnQuCisgICAgICogQHBhcmFtIHB5CisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSB0ZXN0IHBvaW50LgorICAgICAqIEByZXR1cm4gdGhlIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludCBhbmQgdGhlIGxpbmUgc2VnbWVudC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBwdFNlZ0Rpc3QoZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSB4MiwgZG91YmxlIHkyLCBkb3VibGUgcHgsIGRvdWJsZSBweSkgewogICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHB0U2VnRGlzdFNxKHgxLCB5MSwgeDIsIHkyLCBweCwgcHkpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHaXZlcyB0aGUgc3F1YXJlIG9mIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludCBhbmQgdGhpcyAKLSAgICAgKiBsaW5lIHNlZ21lbnQuCisgICAgICogR2l2ZXMgdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoaXMgbGluZSBzZWdtZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBweCB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB0ZXN0IHBvaW50Ci0gICAgICogQHBhcmFtIHB5IHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHRlc3QgcG9pbnQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0aGUgc3F1YXJlIG9mIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludCBhbmQgdGhpcyAKLSAgICAgKiBsaW5lIHNlZ21lbnQKKyAgICAgKiBAcGFyYW0gcHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHRlc3QgcG9pbnQuCisgICAgICogQHBhcmFtIHB5CisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSB0ZXN0IHBvaW50LgorICAgICAqIEByZXR1cm4gdGhlIHRoZSBzcXVhcmUgb2YgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50IGFuZCB0aGlzIGxpbmUKKyAgICAgKiAgICAgICAgIHNlZ21lbnQuCiAgICAgICovCiAgICAgcHVibGljIGRvdWJsZSBwdFNlZ0Rpc3RTcShkb3VibGUgcHgsIGRvdWJsZSBweSkgewogICAgICAgICByZXR1cm4gcHRTZWdEaXN0U3EoZ2V0WDEoKSwgZ2V0WTEoKSwgZ2V0WDIoKSwgZ2V0WTIoKSwgcHgsIHB5KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHaXZlcyB0aGUgc3F1YXJlIG9mIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludCBhbmQgdGhpcyAKLSAgICAgKiBsaW5lIHNlZ21lbnQuCisgICAgICogR2l2ZXMgdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoaXMgbGluZSBzZWdtZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBwIHRoZSB0ZXN0IHBvaW50Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc3F1YXJlIG9mIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludCBhbmQgdGhpcyAKLSAgICAgKiBsaW5lIHNlZ21lbnQKKyAgICAgKiBAcGFyYW0gcAorICAgICAqICAgICAgICAgICAgdGhlIHRlc3QgcG9pbnQuCisgICAgICogQHJldHVybiB0aGUgc3F1YXJlIG9mIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludCBhbmQgdGhpcyBsaW5lCisgICAgICogICAgICAgICBzZWdtZW50LgogICAgICAqLwogICAgIHB1YmxpYyBkb3VibGUgcHRTZWdEaXN0U3EoUG9pbnQyRCBwKSB7CiAgICAgICAgIHJldHVybiBwdFNlZ0Rpc3RTcShnZXRYMSgpLCBnZXRZMSgpLCBnZXRYMigpLCBnZXRZMigpLCBwLmdldFgoKSwgcC5nZXRZKCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdpdmVzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludCBhbmQgdGhpcyAKLSAgICAgKiBsaW5lIHNlZ21lbnQuCisgICAgICogR2l2ZXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50IGFuZCB0aGlzIGxpbmUgc2VnbWVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHggdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdGVzdCBwb2ludAotICAgICAqIEBwYXJhbSBweSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSB0ZXN0IHBvaW50Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoaXMgCi0gICAgICogbGluZSBzZWdtZW50CisgICAgICogQHBhcmFtIHB4CisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB0ZXN0IHBvaW50LgorICAgICAqIEBwYXJhbSBweQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdGVzdCBwb2ludC4KKyAgICAgKiBAcmV0dXJuIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludCBhbmQgdGhpcyBsaW5lIHNlZ21lbnQuCiAgICAgICovCiAgICAgcHVibGljIGRvdWJsZSBwdFNlZ0Rpc3QoZG91YmxlIHB4LCBkb3VibGUgcHkpIHsKICAgICAgICAgcmV0dXJuIHB0U2VnRGlzdChnZXRYMSgpLCBnZXRZMSgpLCBnZXRYMigpLCBnZXRZMigpLCBweCwgcHkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdpdmVzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludCBhbmQgdGhpcyAKLSAgICAgKiBsaW5lIHNlZ21lbnQuCisgICAgICogR2l2ZXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50IGFuZCB0aGlzIGxpbmUgc2VnbWVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcCB0aGUgdGVzdCBwb2ludAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50IGFuZCB0aGlzIAotICAgICAqIGxpbmUgc2VnbWVudAorICAgICAqIEBwYXJhbSBwCisgICAgICogICAgICAgICAgICB0aGUgdGVzdCBwb2ludC4KKyAgICAgKiBAcmV0dXJuIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludCBhbmQgdGhpcyBsaW5lIHNlZ21lbnQuCiAgICAgICovCiAgICAgcHVibGljIGRvdWJsZSBwdFNlZ0Rpc3QoUG9pbnQyRCBwKSB7CiAgICAgICAgIHJldHVybiBwdFNlZ0Rpc3QoZ2V0WDEoKSwgZ2V0WTEoKSwgZ2V0WDIoKSwgZ2V0WTIoKSwgcC5nZXRYKCksIHAuZ2V0WSgpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHaXZlcyB0aGUgc3F1YXJlIG9mIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludCBhbmQgdGhlIAotICAgICAqIGxpbmUuCisgICAgICogR2l2ZXMgdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoZSBsaW5lLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4MSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgbGluZSBzZWdtZW50Ci0gICAgICogQHBhcmFtIHkxIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQKLSAgICAgKiBAcGFyYW0geDIgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQKLSAgICAgKiBAcGFyYW0geTIgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQKLSAgICAgKiBAcGFyYW0gcHggdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdGVzdCBwb2ludAotICAgICAqIEBwYXJhbSBweSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSB0ZXN0IHBvaW50Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc3F1YXJlIG9mIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludCBhbmQgdGhlIAotICAgICAqIGxpbmUKKyAgICAgKiBAcGFyYW0geDEKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQuCisgICAgICogQHBhcmFtIHkxCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgbGluZSBzZWdtZW50LgorICAgICAqIEBwYXJhbSB4MgorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQuCisgICAgICogQHBhcmFtIHkyCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGxpbmUgc2VnbWVudC4KKyAgICAgKiBAcGFyYW0gcHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHRlc3QgcG9pbnQuCisgICAgICogQHBhcmFtIHB5CisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSB0ZXN0IHBvaW50LgorICAgICAqIEByZXR1cm4gdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoZSBsaW5lLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIHB0TGluZURpc3RTcShkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIHgyLCBkb3VibGUgeTIsIGRvdWJsZSBweCwgZG91YmxlIHB5KSB7CisgICAgcHVibGljIHN0YXRpYyBkb3VibGUgcHRMaW5lRGlzdFNxKGRvdWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUgeDIsIGRvdWJsZSB5MiwgZG91YmxlIHB4LAorICAgICAgICAgICAgZG91YmxlIHB5KSB7CiAgICAgICAgIHgyIC09IHgxOwogICAgICAgICB5MiAtPSB5MTsKICAgICAgICAgcHggLT0geDE7CkBAIC03NTYsNzIgKzgyOCw3NyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdpdmVzIHRoZSBzcXVhcmUgb2YgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50IGFuZCB0aGUgCi0gICAgICogbGluZS4KKyAgICAgKiBHaXZlcyB0aGUgc3F1YXJlIG9mIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludCBhbmQgdGhlIGxpbmUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHgxIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQKLSAgICAgKiBAcGFyYW0geTEgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGxpbmUgc2VnbWVudAotICAgICAqIEBwYXJhbSB4MiB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGxpbmUgc2VnbWVudAotICAgICAqIEBwYXJhbSB5MiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGxpbmUgc2VnbWVudAotICAgICAqIEBwYXJhbSBweCB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB0ZXN0IHBvaW50Ci0gICAgICogQHBhcmFtIHB5IHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHRlc3QgcG9pbnQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzcXVhcmUgb2YgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50IGFuZCB0aGUgCi0gICAgICogbGluZQorICAgICAqIEBwYXJhbSB4MQorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGxpbmUgc2VnbWVudC4KKyAgICAgKiBAcGFyYW0geTEKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQuCisgICAgICogQHBhcmFtIHgyCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGxpbmUgc2VnbWVudC4KKyAgICAgKiBAcGFyYW0geTIKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvZiB0aGUgbGluZSBzZWdtZW50LgorICAgICAqIEBwYXJhbSBweAorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdGVzdCBwb2ludC4KKyAgICAgKiBAcGFyYW0gcHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHRlc3QgcG9pbnQuCisgICAgICogQHJldHVybiB0aGUgc3F1YXJlIG9mIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludCBhbmQgdGhlIGxpbmUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBkb3VibGUgcHRMaW5lRGlzdChkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIHgyLCBkb3VibGUgeTIsIGRvdWJsZSBweCwgZG91YmxlIHB5KSB7CiAgICAgICAgIHJldHVybiBNYXRoLnNxcnQocHRMaW5lRGlzdFNxKHgxLCB5MSwgeDIsIHkyLCBweCwgcHkpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHaXZlcyB0aGUgc3F1YXJlIG9mIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludCBhbmQgdGhlIAotICAgICAqIGxpbmUgZGV0ZXJtaW5lZCBieSB0aGlzIExpbmUyRC4KKyAgICAgKiBHaXZlcyB0aGUgc3F1YXJlIG9mIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludCBhbmQgdGhlIGxpbmUKKyAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoaXMgTGluZTJELgogICAgICAqIAotICAgICAqIEBwYXJhbSBweCB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB0ZXN0IHBvaW50Ci0gICAgICogQHBhcmFtIHB5IHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHRlc3QgcG9pbnQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzcXVhcmUgb2YgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50IGFuZCB0aGUgCi0gICAgICogbGluZSBkZXRlcm1pbmVkIGJ5IHRoaXMgTGluZTJECisgICAgICogQHBhcmFtIHB4CisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB0ZXN0IHBvaW50LgorICAgICAqIEBwYXJhbSBweQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdGVzdCBwb2ludC4KKyAgICAgKiBAcmV0dXJuIHRoZSBzcXVhcmUgb2YgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50IGFuZCB0aGUgbGluZQorICAgICAqICAgICAgICAgZGV0ZXJtaW5lZCBieSB0aGlzIExpbmUyRC4KICAgICAgKi8KICAgICBwdWJsaWMgZG91YmxlIHB0TGluZURpc3RTcShkb3VibGUgcHgsIGRvdWJsZSBweSkgewogICAgICAgICByZXR1cm4gcHRMaW5lRGlzdFNxKGdldFgxKCksIGdldFkxKCksIGdldFgyKCksIGdldFkyKCksIHB4LCBweSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2l2ZXMgdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoZSAKLSAgICAgKiBsaW5lIGRldGVybWluZWQgYnkgdGhpcyBMaW5lMkQuCisgICAgICogR2l2ZXMgdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoZSBsaW5lCisgICAgICogZGV0ZXJtaW5lZCBieSB0aGlzIExpbmUyRC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcCB0aGUgdGVzdCBwb2ludAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoZSAKLSAgICAgKiBsaW5lIGRldGVybWluZWQgYnkgdGhpcyBMaW5lMkQKKyAgICAgKiBAcGFyYW0gcAorICAgICAqICAgICAgICAgICAgdGhlIHRlc3QgcG9pbnQuCisgICAgICogQHJldHVybiB0aGUgc3F1YXJlIG9mIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludCBhbmQgdGhlIGxpbmUKKyAgICAgKiAgICAgICAgIGRldGVybWluZWQgYnkgdGhpcyBMaW5lMkQuCiAgICAgICovCiAgICAgcHVibGljIGRvdWJsZSBwdExpbmVEaXN0U3EoUG9pbnQyRCBwKSB7CiAgICAgICAgIHJldHVybiBwdExpbmVEaXN0U3EoZ2V0WDEoKSwgZ2V0WTEoKSwgZ2V0WDIoKSwgZ2V0WTIoKSwgcC5nZXRYKCksIHAuZ2V0WSgpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHaXZlcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoZSAKLSAgICAgKiBsaW5lIGRldGVybWluZWQgYnkgdGhpcyBMaW5lMkQuCisgICAgICogR2l2ZXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50IGFuZCB0aGUgbGluZSBkZXRlcm1pbmVkIGJ5IHRoaXMKKyAgICAgKiBMaW5lMkQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHB4IHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHRlc3QgcG9pbnQKLSAgICAgKiBAcGFyYW0gcHkgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdGVzdCBwb2ludAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50IGFuZCB0aGUgCi0gICAgICogbGluZSBkZXRlcm1pbmVkIGJ5IHRoaXMgTGluZTJECisgICAgICogQHBhcmFtIHB4CisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB0ZXN0IHBvaW50LgorICAgICAqIEBwYXJhbSBweQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdGVzdCBwb2ludC4KKyAgICAgKiBAcmV0dXJuIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludCBhbmQgdGhlIGxpbmUgZGV0ZXJtaW5lZCBieSB0aGlzCisgICAgICogICAgICAgICBMaW5lMkQuCiAgICAgICovCiAgICAgcHVibGljIGRvdWJsZSBwdExpbmVEaXN0KGRvdWJsZSBweCwgZG91YmxlIHB5KSB7CiAgICAgICAgIHJldHVybiBwdExpbmVEaXN0KGdldFgxKCksIGdldFkxKCksIGdldFgyKCksIGdldFkyKCksIHB4LCBweSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2l2ZXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvaW50IGFuZCB0aGUgCi0gICAgICogbGluZSBkZXRlcm1pbmVkIGJ5IHRoaXMgTGluZTJELgorICAgICAqIEdpdmVzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludCBhbmQgdGhlIGxpbmUgZGV0ZXJtaW5lZCBieSB0aGlzCisgICAgICogTGluZTJELgogICAgICAqIAotICAgICAqIEBwYXJhbSBwIHRoZSB0ZXN0IHBvaW50Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoZSAKLSAgICAgKiBsaW5lIGRldGVybWluZWQgYnkgdGhpcyBMaW5lMkQKKyAgICAgKiBAcGFyYW0gcAorICAgICAqICAgICAgICAgICAgdGhlIHRlc3QgcG9pbnQuCisgICAgICogQHJldHVybiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgYW5kIHRoZSBsaW5lIGRldGVybWluZWQgYnkgdGhpcworICAgICAqICAgICAgICAgTGluZTJELgogICAgICAqLwogICAgIHB1YmxpYyBkb3VibGUgcHRMaW5lRGlzdChQb2ludDJEIHApIHsKICAgICAgICAgcmV0dXJuIHB0TGluZURpc3QoZ2V0WDEoKSwgZ2V0WTEoKSwgZ2V0WDIoKSwgZ2V0WTIoKSwgcC5nZXRYKCksIHAuZ2V0WSgpKTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9nZW9tL05vbmludmVydGlibGVUcmFuc2Zvcm1FeGNlcHRpb24uamF2YSBiL2F3dC9qYXZhL2F3dC9nZW9tL05vbmludmVydGlibGVUcmFuc2Zvcm1FeGNlcHRpb24uamF2YQppbmRleCAyYjdiNTQyLi5hNGU2ZjBmIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZ2VvbS9Ob25pbnZlcnRpYmxlVHJhbnNmb3JtRXhjZXB0aW9uLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2dlb20vTm9uaW52ZXJ0aWJsZVRyYW5zZm9ybUV4Y2VwdGlvbi5qYXZhCkBAIC0xOCwyNiArMTgsMzEgQEAKICAqIEBhdXRob3IgRGVuaXMgTS4gS2lzaGVua28KICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0Lmdlb207CiAKIC8qKgotICogVGhlIENsYXNzIE5vbmludmVydGlibGVUcmFuc2Zvcm1FeGNlcHRpb24gaXMgdGhlIGV4Y2VwdGlvbiB0aGF0IGlzIHRocm93biAKLSAqIHdoZW4gYW4gYWN0aW9uIHJlcXVpcmVzIGludmVydGluZyBhbiB7QGxpbmsgQWZmaW5lVHJhbnNmb3JtfSB0aGF0IGlzIAotICogbm90IGludmVydGlibGUgKGhhcyBkZXRlcm1pbmFudCAwKS4KKyAqIFRoZSBDbGFzcyBOb25pbnZlcnRpYmxlVHJhbnNmb3JtRXhjZXB0aW9uIGlzIHRoZSBleGNlcHRpb24gdGhhdCBpcyB0aHJvd24KKyAqIHdoZW4gYW4gYWN0aW9uIHJlcXVpcmVzIGludmVydGluZyBhbiB7QGxpbmsgQWZmaW5lVHJhbnNmb3JtfSB0aGF0IGlzIG5vdAorICogaW52ZXJ0aWJsZSAoaGFzIGRldGVybWluYW50IDApLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIE5vbmludmVydGlibGVUcmFuc2Zvcm1FeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgc2VyaWFsVmVyc2lvblVJRC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgc2VyaWFsVmVyc2lvblVJRC4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2MTM3MjI1MjQwNTAzOTkwNDY2TDsKIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBub25pbnZlcnRpYmxlIHRyYW5zZm9ybSBleGNlcHRpb24uCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IG5vbi1pbnZlcnRpYmxlIHRyYW5zZm9ybSBleGNlcHRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIHMgdGhlIGVycm9yIG1lc3NhZ2UKKyAgICAgKiBAcGFyYW0gcworICAgICAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UuCiAgICAgICovCiAgICAgcHVibGljIE5vbmludmVydGlibGVUcmFuc2Zvcm1FeGNlcHRpb24oU3RyaW5nIHMpIHsKICAgICAgICAgc3VwZXIocyk7CiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9nZW9tL1BhdGhJdGVyYXRvci5qYXZhIGIvYXd0L2phdmEvYXd0L2dlb20vUGF0aEl0ZXJhdG9yLmphdmEKaW5kZXggNWE5ODA4My4uMmQxYzBmZiAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2dlb20vUGF0aEl0ZXJhdG9yLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2dlb20vUGF0aEl0ZXJhdG9yLmphdmEKQEAgLTE4LDcyICsxOCw4NyBAQAogICogQGF1dGhvciBEZW5pcyBNLiBLaXNoZW5rbwogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuZ2VvbTsKIAogLyoqCi0gKiBUaGUgSW50ZXJmYWNlIFBhdGhJdGVyYXRvciByZXByZXNlbnRzIGFuIGl0ZXJhdG9yIG9iamVjdCB0aGF0IGNhbiAKLSAqIGJlIHVzZWQgdG8gdHJhdmVyc2UgdGhlIG91dGxpbmUgb2YgYSB7QGxpbmsgamF2YS5hd3QuU2hhcGV9LiAKLSAqIEl0IHJldHVybnMgcG9pbnRzIGFsb25nIHRoZSBib3VuZGFyeSBvZiB0aGUgU2hhcGUgCi0gKiB3aGljaCBtYXkgYmUgYWN0dWFsIHZlcnRpY2VzIChpbiB0aGUgY2FzZSBvZiBhIHNoYXBlIG1hZGUgb2YgbGluZSAKLSAqIHNlZ21lbnRzKSBvciBtYXkgYmUgcG9pbnRzIG9uIGEgY3VydmVkIHNlZ21lbnQgd2l0aCB0aGUgZGlzdGFuY2UgCi0gKiBiZXR3ZWVuIHRoZSBwb2ludHMgZGV0ZXJtaW5lZCBieSBhIGNob3NlbiBmbGF0dGVuaW5nIGZhY3Rvci4gCisgKiBUaGUgSW50ZXJmYWNlIFBhdGhJdGVyYXRvciByZXByZXNlbnRzIGFuIGl0ZXJhdG9yIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvCisgKiB0cmF2ZXJzZSB0aGUgb3V0bGluZSBvZiBhIHtAbGluayBqYXZhLmF3dC5TaGFwZX0uIEl0IHJldHVybnMgcG9pbnRzIGFsb25nIHRoZQorICogYm91bmRhcnkgb2YgdGhlIFNoYXBlIHdoaWNoIG1heSBiZSBhY3R1YWwgdmVydGljZXMgKGluIHRoZSBjYXNlIG9mIGEgc2hhcGUKKyAqIG1hZGUgb2YgbGluZSBzZWdtZW50cykgb3IgbWF5IGJlIHBvaW50cyBvbiBhIGN1cnZlZCBzZWdtZW50IHdpdGggdGhlIGRpc3RhbmNlCisgKiBiZXR3ZWVuIHRoZSBwb2ludHMgZGV0ZXJtaW5lZCBieSBhIGNob3NlbiBmbGF0dGVuaW5nIGZhY3Rvci4KICAqIDxwPgotICogSWYgdGhlIHNoYXBlIGlzIGNsb3NlZCwgdGhlIG91dGxpbmUgaXMgdHJhdmVyc2VkIGluIHRoZSBjb3VudGVyLWNsb2Nrd2lzZSAKLSAqIGRpcmVjdGlvbi4gVGhhdCBtZWFucyB0aGF0IG1vdmluZyBmb3J3YXJkIGFsb25nIHRoZSBib3VuZGFyeSBpcyB0byB0cmF2ZWwgCi0gKiBpbiBzdWNoIGEgd2F5IHRoYXQgdGhlIGludGVyaW9yIG9mIHRoZSBzaGFwZSBpcyB0byB0aGUgbGVmdCBvZiB0aGUgCi0gKiBvdXRsaW5lIHBhdGggYW5kIHRoZSBleHRlcmlvciBvZiB0aGUgc2hhcGUgaXMgdG8gdGhlIHJpZ2h0IG9mIHRoZSBvdXRsaW5lCi0gKiBwYXRoLiBUaGUgaW50ZXJpb3IgYW5kIGV4dGVyaW9yIG9mIHRoZSBzaGFwZSBhcmUgZGV0ZXJtaW5lZCBieSBhIAotICogd2luZGluZyBydWxlLiAKKyAqIElmIHRoZSBzaGFwZSBpcyBjbG9zZWQsIHRoZSBvdXRsaW5lIGlzIHRyYXZlcnNlZCBpbiB0aGUgY291bnRlci1jbG9ja3dpc2UKKyAqIGRpcmVjdGlvbi4gVGhhdCBtZWFucyB0aGF0IG1vdmluZyBmb3J3YXJkIGFsb25nIHRoZSBib3VuZGFyeSBpcyB0byB0cmF2ZWwgaW4KKyAqIHN1Y2ggYSB3YXkgdGhhdCB0aGUgaW50ZXJpb3Igb2YgdGhlIHNoYXBlIGlzIHRvIHRoZSBsZWZ0IG9mIHRoZSBvdXRsaW5lIHBhdGgKKyAqIGFuZCB0aGUgZXh0ZXJpb3Igb2YgdGhlIHNoYXBlIGlzIHRvIHRoZSByaWdodCBvZiB0aGUgb3V0bGluZSBwYXRoLiBUaGUKKyAqIGludGVyaW9yIGFuZCBleHRlcmlvciBvZiB0aGUgc2hhcGUgYXJlIGRldGVybWluZWQgYnkgYSB3aW5kaW5nIHJ1bGUuCisgKiA8L3A+CisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIFBhdGhJdGVyYXRvciB7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFdJTkRfRVZFTl9PREQgaW5kaWNhdGVzIHRoZSB3aW5kaW5nIHJ1bGUgdGhhdCBzYXlzIAotICAgICAqIHRoYXQgYSBwb2ludCBpcyBvdXRzaWRlIHRoZSBzaGFwZSBpZiBhbnkgaW5maW5pdGUgcmF5IGZyb20gdGhlIHBvaW50IAotICAgICAqIGNyb3NzZXMgdGhlIG91dGxpbmUgb2YgdGhlIHNoYXBlIGFuIGV2ZW4gbnVtYmVyIG9mIHRpbWVzLCBvdGhlcndpc2UKLSAgICAgKiBpdCBpcyBpbnNpZGUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFdJTkRfRVZFTl9PREQgaW5kaWNhdGVzIHRoZSB3aW5kaW5nIHJ1bGUgdGhhdCBzYXlzIHRoYXQgYQorICAgICAqIHBvaW50IGlzIG91dHNpZGUgdGhlIHNoYXBlIGlmIGFueSBpbmZpbml0ZSByYXkgZnJvbSB0aGUgcG9pbnQgY3Jvc3NlcyB0aGUKKyAgICAgKiBvdXRsaW5lIG9mIHRoZSBzaGFwZSBhbiBldmVuIG51bWJlciBvZiB0aW1lcywgb3RoZXJ3aXNlIGl0IGlzIGluc2lkZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSU5EX0VWRU5fT0REID0gMDsKLSAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IFdJTkRfTk9OX1pFUk8gaW5kaWNhdGVzIHRoZSB3aW5kaW5nIHJ1bGUgdGhhdCBzYXlzIHRoYXQKLSAgICAgKiBhIHBvaW50IGlzIGluc2lkZSB0aGUgc2hhcGUgaWYgZXZlcnkgaW5maW5pdGUgcmF5IHN0YXJ0aW5nIGZyb20gdGhhdAotICAgICAqIHBvaW50IGNyb3NzZXMgdGhlIG91dGxpbmUgb2YgdGhlIHNoYXBlIGEgbm9uLXplcm8gbnVtYmVyIG9mIHRpbWVzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFdJTkRfTk9OX1pFUk8gaW5kaWNhdGVzIHRoZSB3aW5kaW5nIHJ1bGUgdGhhdCBzYXlzIHRoYXQgYQorICAgICAqIHBvaW50IGlzIGluc2lkZSB0aGUgc2hhcGUgaWYgZXZlcnkgaW5maW5pdGUgcmF5IHN0YXJ0aW5nIGZyb20gdGhhdCBwb2ludAorICAgICAqIGNyb3NzZXMgdGhlIG91dGxpbmUgb2YgdGhlIHNoYXBlIGEgbm9uLXplcm8gbnVtYmVyIG9mIHRpbWVzLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJTkRfTk9OX1pFUk8gPSAxOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBTRUdfTU9WRVRPIGluZGljYXRlcyB0aGF0IHRvIGZvbGxvdyB0aGUgc2hhcGUncyBvdXRsaW5lCi0gICAgICogZnJvbSB0aGUgcHJldmlvdXMgcG9pbnQgdG8gdGhlIGN1cnJlbnQgcG9pbnQsIHRoZSBjdXJzb3IgKHRyYXZlcnNhbCAKLSAgICAgKiBwb2ludCkgc2hvdWxkIGJlIHBsYWNlZCBkaXJlY3RseSBvbiB0aGUgY3VycmVudCBwb2ludC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUdfTU9WRVRPICA9IDA7Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBTRUdfTElORVRPIGluZGljYXRlcyB0aGF0IHRvIGZvbGxvdyB0aGUgc2hhcGUncyBvdXRsaW5lCi0gICAgICogZnJvbSB0aGUgcHJldmlvdXMgcG9pbnQgdG8gdGhlIGN1cnJlbnQgcG9pbnQsIHRoZSBjdXJzb3IgKHRyYXZlcnNhbCAKLSAgICAgKiBwb2ludCkgc2hvdWxkIGZvbGxvdyBhIHN0cmFpZ2h0IGxpbmUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VHX0xJTkVUTyAgPSAxOwotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgU0VHX1FVQURUTyBpbmRpY2F0ZXMgdGhhdCB0byBmb2xsb3cgdGhlIHNoYXBlJ3Mgb3V0bGluZQotICAgICAqIGZyb20gdGhlIHByZXZpb3VzIHBvaW50IHRvIHRoZSBjdXJyZW50IHBvaW50LCB0aGUgY3Vyc29yICh0cmF2ZXJzYWwgCi0gICAgICogcG9pbnQpIHNob3VsZCBmb2xsb3cgYSBxdWFkcmF0aWMgY3VydmUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VHX1FVQURUTyAgPSAyOwotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgU0VHX0NVQklDVE8gaW5kaWNhdGVzIHRoYXQgdG8gZm9sbG93IHRoZSBzaGFwZSdzIG91dGxpbmUKLSAgICAgKiBmcm9tIHRoZSBwcmV2aW91cyBwb2ludCB0byB0aGUgY3VycmVudCBwb2ludCwgdGhlIGN1cnNvciAodHJhdmVyc2FsIAotICAgICAqIHBvaW50KSBzaG91bGQgZm9sbG93IGEgY3ViaWMgY3VydmUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFNFR19NT1ZFVE8gaW5kaWNhdGVzIHRoYXQgdG8gZm9sbG93IHRoZSBzaGFwZSdzIG91dGxpbmUgZnJvbQorICAgICAqIHRoZSBwcmV2aW91cyBwb2ludCB0byB0aGUgY3VycmVudCBwb2ludCwgdGhlIGN1cnNvciAodHJhdmVyc2FsIHBvaW50KQorICAgICAqIHNob3VsZCBiZSBwbGFjZWQgZGlyZWN0bHkgb24gdGhlIGN1cnJlbnQgcG9pbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VHX01PVkVUTyA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgU0VHX0xJTkVUTyBpbmRpY2F0ZXMgdGhhdCB0byBmb2xsb3cgdGhlIHNoYXBlJ3Mgb3V0bGluZSBmcm9tCisgICAgICogdGhlIHByZXZpb3VzIHBvaW50IHRvIHRoZSBjdXJyZW50IHBvaW50LCB0aGUgY3Vyc29yICh0cmF2ZXJzYWwgcG9pbnQpCisgICAgICogc2hvdWxkIGZvbGxvdyBhIHN0cmFpZ2h0IGxpbmUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VHX0xJTkVUTyA9IDE7CisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgU0VHX1FVQURUTyBpbmRpY2F0ZXMgdGhhdCB0byBmb2xsb3cgdGhlIHNoYXBlJ3Mgb3V0bGluZSBmcm9tCisgICAgICogdGhlIHByZXZpb3VzIHBvaW50IHRvIHRoZSBjdXJyZW50IHBvaW50LCB0aGUgY3Vyc29yICh0cmF2ZXJzYWwgcG9pbnQpCisgICAgICogc2hvdWxkIGZvbGxvdyBhIHF1YWRyYXRpYyBjdXJ2ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUdfUVVBRFRPID0gMjsKKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBTRUdfQ1VCSUNUTyBpbmRpY2F0ZXMgdGhhdCB0byBmb2xsb3cgdGhlIHNoYXBlJ3Mgb3V0bGluZQorICAgICAqIGZyb20gdGhlIHByZXZpb3VzIHBvaW50IHRvIHRoZSBjdXJyZW50IHBvaW50LCB0aGUgY3Vyc29yICh0cmF2ZXJzYWwKKyAgICAgKiBwb2ludCkgc2hvdWxkIGZvbGxvdyBhIGN1YmljIGN1cnZlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFR19DVUJJQ1RPID0gMzsKLSAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IFNFR19DTE9TRSBpbmRpY2F0ZXMgdGhhdCB0aGUgcHJldmlvdXMgcG9pbnQgd2FzIHRoZSBlbmQKLSAgICAgKiBvZiB0aGUgc2hhcGUncyBvdXRsaW5lLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFR19DTE9TRSAgID0gNDsKKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBTRUdfQ0xPU0UgaW5kaWNhdGVzIHRoYXQgdGhlIHByZXZpb3VzIHBvaW50IHdhcyB0aGUgZW5kIG9mCisgICAgICogdGhlIHNoYXBlJ3Mgb3V0bGluZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUdfQ0xPU0UgPSA0OwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgd2luZGluZyBydWxlLCBlaXRoZXIge0BsaW5rIFBhdGhJdGVyYXRvciNXSU5EX0VWRU5fT0REfSBvcgogICAgICAqIHtAbGluayBQYXRoSXRlcmF0b3IjV0lORF9OT05fWkVST30uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgd2luZGluZyBydWxlCisgICAgICogQHJldHVybiB0aGUgd2luZGluZyBydWxlLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0V2luZGluZ1J1bGUoKTsKIAogICAgIC8qKgogICAgICAqIENoZWNrcyBpZiB0aGlzIFBhdGhJdGVyYXRvciBoYXMgYmVlbiBjb21wbGV0ZWx5IHRyYXZlcnNlZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgUGF0aEl0ZXJhdG9yIGhhcyBiZWVuIGNvbXBsZXRlbHkgdHJhdmVyc2VkCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGlzIFBhdGhJdGVyYXRvciBoYXMgYmVlbiBjb21wbGV0ZWx5IHRyYXZlcnNlZC4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0RvbmUoKTsKIApAQCAtOTMsNDAgKzEwOCwzOSBAQAogICAgIHB1YmxpYyB2b2lkIG5leHQoKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBuZXh0IHZlcnRleCBwb2ludCBhbG9uZyB0aGUgc2hhcGUncyBvdXRsaW5lIAotICAgICAqIGFuZCBhIGZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hhdCBraW5kIG9mIHNlZ21lbnQgdG8gdXNlIGluIG9yZGVyIHRvIAotICAgICAqIGNvbm5lY3QgdGhlIHByZXZpb3VzIHZlcnRleCBwb2ludCB0byB0aGUgY3VycmVudCB2ZXJ0ZXggcG9pbnQgdG8gZm9ybSAKLSAgICAgKiB0aGUgY3VycmVudCBzZWdtZW50LgorICAgICAqIEdldHMgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBuZXh0IHZlcnRleCBwb2ludCBhbG9uZyB0aGUgc2hhcGUncyBvdXRsaW5lCisgICAgICogYW5kIGEgZmxhZyB0aGF0IGluZGljYXRlcyB3aGF0IGtpbmQgb2Ygc2VnbWVudCB0byB1c2UgaW4gb3JkZXIgdG8gY29ubmVjdAorICAgICAqIHRoZSBwcmV2aW91cyB2ZXJ0ZXggcG9pbnQgdG8gdGhlIGN1cnJlbnQgdmVydGV4IHBvaW50IHRvIGZvcm0gdGhlIGN1cnJlbnQKKyAgICAgKiBzZWdtZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBjb29yZHMgdGhlIGFycmF5IHRoYXQgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGN1cnJlbnQgCi0gICAgICogc2VnbWVudCBhcmUgd3JpdHRlbiBpbnRvLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZsYWcgdGhhdCBpbmRpY2F0ZXMgaG93IHRvIGZvbGxvdyB0aGUgc2hhcGUncyBvdXRsaW5lCi0gICAgICogZnJvbSB0aGUgcHJldmlvdXMgcG9pbnQgdG8gdGhlIGN1cnJlbnQgb25lLCBjaG9zZW4gZnJvbSAKLSAgICAgKiB0aGUgZm9sbG93aW5nIGNvbnN0YW50czoKLSAgICAgKiB7QGxpbmsgUGF0aEl0ZXJhdG9yI1NFR19NT1ZFVE99LCB7QGxpbmsgUGF0aEl0ZXJhdG9yI1NFR19MSU5FVE99LCAKLSAgICAgKiB7QGxpbmsgUGF0aEl0ZXJhdG9yI1NFR19RVUFEVE99LCB7QGxpbmsgUGF0aEl0ZXJhdG9yI1NFR19DVUJJQ1RPfSwgCi0gICAgICogb3Ige0BsaW5rIFBhdGhJdGVyYXRvciNTRUdfQ0xPU0V9CisgICAgICogQHBhcmFtIGNvb3JkcworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IHRoYXQgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGN1cnJlbnQKKyAgICAgKiAgICAgICAgICAgIHNlZ21lbnQgYXJlIHdyaXR0ZW4gaW50by4KKyAgICAgKiBAcmV0dXJuIHRoZSBmbGFnIHRoYXQgaW5kaWNhdGVzIGhvdyB0byBmb2xsb3cgdGhlIHNoYXBlJ3Mgb3V0bGluZSBmcm9tCisgICAgICogICAgICAgICB0aGUgcHJldmlvdXMgcG9pbnQgdG8gdGhlIGN1cnJlbnQgb25lLCBjaG9zZW4gZnJvbSB0aGUgZm9sbG93aW5nCisgICAgICogICAgICAgICBjb25zdGFudHM6IHtAbGluayBQYXRoSXRlcmF0b3IjU0VHX01PVkVUT30sCisgICAgICogICAgICAgICB7QGxpbmsgUGF0aEl0ZXJhdG9yI1NFR19MSU5FVE99LCB7QGxpbmsgUGF0aEl0ZXJhdG9yI1NFR19RVUFEVE99LAorICAgICAqICAgICAgICAge0BsaW5rIFBhdGhJdGVyYXRvciNTRUdfQ1VCSUNUT30sIG9yCisgICAgICogICAgICAgICB7QGxpbmsgUGF0aEl0ZXJhdG9yI1NFR19DTE9TRX0uCiAgICAgICovCiAgICAgcHVibGljIGludCBjdXJyZW50U2VnbWVudChmbG9hdFtdIGNvb3Jkcyk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgbmV4dCB2ZXJ0ZXggcG9pbnQgYWxvbmcgdGhlIHNoYXBlJ3Mgb3V0bGluZSAKLSAgICAgKiBhbmQgYSBmbGFnIHRoYXQgaW5kaWNhdGVzIHdoYXQga2luZCBvZiBzZWdtZW50IHRvIHVzZSBpbiBvcmRlciB0byAKLSAgICAgKiBjb25uZWN0IHRoZSBwcmV2aW91cyB2ZXJ0ZXggcG9pbnQgdG8gdGhlIGN1cnJlbnQgdmVydGV4IHBvaW50IHRvIGZvcm0gCi0gICAgICogdGhlIGN1cnJlbnQgc2VnbWVudC4KKyAgICAgKiBHZXRzIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgbmV4dCB2ZXJ0ZXggcG9pbnQgYWxvbmcgdGhlIHNoYXBlJ3Mgb3V0bGluZQorICAgICAqIGFuZCBhIGZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hhdCBraW5kIG9mIHNlZ21lbnQgdG8gdXNlIGluIG9yZGVyIHRvIGNvbm5lY3QKKyAgICAgKiB0aGUgcHJldmlvdXMgdmVydGV4IHBvaW50IHRvIHRoZSBjdXJyZW50IHZlcnRleCBwb2ludCB0byBmb3JtIHRoZSBjdXJyZW50CisgICAgICogc2VnbWVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29vcmRzIHRoZSBhcnJheSB0aGF0IHRoZSBjb29yZGluYXRlcyBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBjdXJyZW50IAotICAgICAqIHNlZ21lbnQgYXJlIHdyaXR0ZW4gaW50by4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBmbGFnIHRoYXQgaW5kaWNhdGVzIGhvdyB0byBmb2xsb3cgdGhlIHNoYXBlJ3Mgb3V0bGluZQotICAgICAqIGZyb20gdGhlIHByZXZpb3VzIHBvaW50IHRvIHRoZSBjdXJyZW50IG9uZSwgY2hvc2VuIGZyb20gCi0gICAgICogdGhlIGZvbGxvd2luZyBjb25zdGFudHM6Ci0gICAgICoge0BsaW5rIFBhdGhJdGVyYXRvciNTRUdfTU9WRVRPfSwge0BsaW5rIFBhdGhJdGVyYXRvciNTRUdfTElORVRPfSwgCi0gICAgICoge0BsaW5rIFBhdGhJdGVyYXRvciNTRUdfUVVBRFRPfSwge0BsaW5rIFBhdGhJdGVyYXRvciNTRUdfQ1VCSUNUT30sIAotICAgICAqIG9yIHtAbGluayBQYXRoSXRlcmF0b3IjU0VHX0NMT1NFfQorICAgICAqIEBwYXJhbSBjb29yZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSB0aGF0IHRoZSBjb29yZGluYXRlcyBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBjdXJyZW50CisgICAgICogICAgICAgICAgICBzZWdtZW50IGFyZSB3cml0dGVuIGludG8uCisgICAgICogQHJldHVybiB0aGUgZmxhZyB0aGF0IGluZGljYXRlcyBob3cgdG8gZm9sbG93IHRoZSBzaGFwZSdzIG91dGxpbmUgZnJvbQorICAgICAqICAgICAgICAgdGhlIHByZXZpb3VzIHBvaW50IHRvIHRoZSBjdXJyZW50IG9uZSwgY2hvc2VuIGZyb20gdGhlIGZvbGxvd2luZworICAgICAqICAgICAgICAgY29uc3RhbnRzOiB7QGxpbmsgUGF0aEl0ZXJhdG9yI1NFR19NT1ZFVE99LAorICAgICAqICAgICAgICAge0BsaW5rIFBhdGhJdGVyYXRvciNTRUdfTElORVRPfSwge0BsaW5rIFBhdGhJdGVyYXRvciNTRUdfUVVBRFRPfSwKKyAgICAgKiAgICAgICAgIHtAbGluayBQYXRoSXRlcmF0b3IjU0VHX0NVQklDVE99LCBvcgorICAgICAqICAgICAgICAge0BsaW5rIFBhdGhJdGVyYXRvciNTRUdfQ0xPU0V9LgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgY3VycmVudFNlZ21lbnQoZG91YmxlW10gY29vcmRzKTsKIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZ2VvbS9Qb2ludDJELmphdmEgYi9hd3QvamF2YS9hd3QvZ2VvbS9Qb2ludDJELmphdmEKaW5kZXggNzcxOWU2Ny4uZjcwMjZjOCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2dlb20vUG9pbnQyRC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9nZW9tL1BvaW50MkQuamF2YQpAQCAtMTgsNDAgKzE4LDUxIEBACiAgKiBAYXV0aG9yIERlbmlzIE0uIEtpc2hlbmtvCiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5nZW9tOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lm1pc2MuSGFzaENvZGU7CiAKIC8qKgotICogVGhlIENsYXNzIFBvaW50MkQgcmVwcmVzZW50cyBhIHBvaW50IHdob3NlIGRhdGEgaXMgZ2l2ZW4gaW4gCi0gKiBoaWdoLXByZWNpc2lvbiB2YWx1ZXMgYXBwcm9wcmlhdGUgZm9yIGdyYXBoaWNhbCBvcGVyYXRpb25zLgorICogVGhlIENsYXNzIFBvaW50MkQgcmVwcmVzZW50cyBhIHBvaW50IHdob3NlIGRhdGEgaXMgZ2l2ZW4gaW4gaGlnaC1wcmVjaXNpb24KKyAqIHZhbHVlcyBhcHByb3ByaWF0ZSBmb3IgZ3JhcGhpY2FsIG9wZXJhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUG9pbnQyRCBpbXBsZW1lbnRzIENsb25lYWJsZSB7CiAKICAgICAvKioKLSAgICAgKiBUaGUgQ2xhc3MgRmxvYXQgaXMgdGhlIHN1YmNsYXNzIG9mIFBvaW50MkQgdGhhdCBoYXMgYWxsIAotICAgICAqIG9mIGl0cyBkYXRhIHZhbHVlcyBzdG9yZWQgd2l0aCBmbG9hdC1sZXZlbCBwcmVjaXNpb24uCisgICAgICogVGhlIENsYXNzIEZsb2F0IGlzIHRoZSBzdWJjbGFzcyBvZiBQb2ludDJEIHRoYXQgaGFzIGFsbCBvZiBpdHMgZGF0YQorICAgICAqIHZhbHVlcyBzdG9yZWQgd2l0aCBmbG9hdC1sZXZlbCBwcmVjaXNpb24uCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGbG9hdCBleHRlbmRzIFBvaW50MkQgewogCi0gICAgICAgIC8qKiBUaGUgeCBjb29yZGluYXRlLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHggY29vcmRpbmF0ZS4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmbG9hdCB4OwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB5IGNvb3JkaW5hdGUuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB5IGNvb3JkaW5hdGUuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmxvYXQgeTsKIAogICAgICAgICAvKioKLSAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGZsb2F0LXZhbHVlZCBQb2ludDJEIHdpdGggaXRzIGRhdGEgCi0gICAgICAgICAqIHNldCB0byB6ZXJvLgorICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZmxvYXQtdmFsdWVkIFBvaW50MkQgd2l0aCBpdHMgZGF0YSBzZXQgdG8gemVyby4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBGbG9hdCgpIHsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZmxvYXQtdmFsdWVkIFBvaW50MkQgd2l0aCB0aGUgc3BlY2lmaWVkIGNvb3JkaW5hdGVzLgorICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZmxvYXQtdmFsdWVkIFBvaW50MkQgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICAgICAqIGNvb3JkaW5hdGVzLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHggdGhlIHggY29vcmRpbmF0ZQotICAgICAgICAgKiBAcGFyYW0geSB0aGUgeSBjb29yZGluYXRlCisgICAgICAgICAqIEBwYXJhbSB4CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZS4KKyAgICAgICAgICogQHBhcmFtIHkKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIEZsb2F0KGZsb2F0IHgsIGZsb2F0IHkpIHsKICAgICAgICAgICAgIHRoaXMueCA9IHg7CkBAIC03MSw4ICs4MiwxMCBAQAogICAgICAgICAvKioKICAgICAgICAgICogU2V0cyB0aGUgcG9pbnQncyBjb29yZGluYXRlcy4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUKLSAgICAgICAgICogQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZQorICAgICAgICAgKiBAcGFyYW0geAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUuCisgICAgICAgICAqIEBwYXJhbSB5CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKGZsb2F0IHgsIGZsb2F0IHkpIHsKICAgICAgICAgICAgIHRoaXMueCA9IHg7CkBAIC05MiwyOSArMTA1LDM3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhlIENsYXNzIERvdWJsZSBpcyB0aGUgc3ViY2xhc3Mgb2YgUG9pbnQyRCB0aGF0IGhhcyBhbGwgCi0gICAgICogb2YgaXRzIGRhdGEgdmFsdWVzIHN0b3JlZCB3aXRoIGRvdWJsZS1sZXZlbCBwcmVjaXNpb24uCisgICAgICogVGhlIENsYXNzIERvdWJsZSBpcyB0aGUgc3ViY2xhc3Mgb2YgUG9pbnQyRCB0aGF0IGhhcyBhbGwgb2YgaXRzIGRhdGEKKyAgICAgKiB2YWx1ZXMgc3RvcmVkIHdpdGggZG91YmxlLWxldmVsIHByZWNpc2lvbi4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERvdWJsZSBleHRlbmRzIFBvaW50MkQgewogCi0gICAgICAgIC8qKiBUaGUgeCBjb29yZGluYXRlLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHggY29vcmRpbmF0ZS4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBkb3VibGUgeDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeSBjb29yZGluYXRlLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeSBjb29yZGluYXRlLgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGRvdWJsZSB5OwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZG91YmxlLXZhbHVlZCBQb2ludDJEIHdpdGggaXRzIGRhdGEgCi0gICAgICAgICAqIHNldCB0byB6ZXJvLgorICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZG91YmxlLXZhbHVlZCBQb2ludDJEIHdpdGggaXRzIGRhdGEgc2V0IHRvIHplcm8uCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgRG91YmxlKCkgewogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkb3VibGUtdmFsdWVkIFBvaW50MkQgd2l0aCB0aGUgc3BlY2lmaWVkIGNvb3JkaW5hdGVzLgorICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZG91YmxlLXZhbHVlZCBQb2ludDJEIHdpdGggdGhlIHNwZWNpZmllZAorICAgICAgICAgKiBjb29yZGluYXRlcy4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUKLSAgICAgICAgICogQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZQorICAgICAgICAgKiBAcGFyYW0geAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUuCisgICAgICAgICAqIEBwYXJhbSB5CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBEb3VibGUoZG91YmxlIHgsIGRvdWJsZSB5KSB7CiAgICAgICAgICAgICB0aGlzLnggPSB4OwpAQCAtMTUyLDI5ICsxNzMsMzIgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSB4IGNvb3JkaW5hdGUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgeCBjb29yZGluYXRlCisgICAgICogQHJldHVybiB0aGUgeCBjb29yZGluYXRlLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBkb3VibGUgZ2V0WCgpOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgeSBjb29yZGluYXRlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHkgY29vcmRpbmF0ZQorICAgICAqIEByZXR1cm4gdGhlIHkgY29vcmRpbmF0ZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgZG91YmxlIGdldFkoKTsKIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHBvaW50J3MgY29vcmRpbmF0ZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIHggY29vcmRpbmF0ZQotICAgICAqIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUKKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRMb2NhdGlvbihkb3VibGUgeCwgZG91YmxlIHkpOwogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgcG9pbnQncyBjb29yZGluYXRlcyBieSBjb3B5aW5nIHRoZW0gZnJvbSBhbm90aGVyIHBvaW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBwIHRoZSBwb2ludCB0byBjb3B5IHRoZSBkYXRhIGZyb20KKyAgICAgKiBAcGFyYW0gcAorICAgICAqICAgICAgICAgICAgdGhlIHBvaW50IHRvIGNvcHkgdGhlIGRhdGEgZnJvbS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihQb2ludDJEIHApIHsKICAgICAgICAgc2V0TG9jYXRpb24ocC5nZXRYKCksIHAuZ2V0WSgpKTsKQEAgLTE4MywxMiArMjA3LDE1IEBACiAgICAgLyoqCiAgICAgICogRmluZHMgdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIHNwZWNpZmllZCBwb2ludHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHgxIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IHBvaW50Ci0gICAgICogQHBhcmFtIHkxIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IHBvaW50Ci0gICAgICogQHBhcmFtIHgyIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBwb2ludAotICAgICAqIEBwYXJhbSB5MiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgcG9pbnQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzcXVhcmUgb2YgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHR3byBzcGVjaWZpZWQgcG9pbnRzCisgICAgICogQHBhcmFtIHgxCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwb2ludC4KKyAgICAgKiBAcGFyYW0geTEKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IHBvaW50LgorICAgICAqIEBwYXJhbSB4MgorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIHBvaW50LgorICAgICAqIEBwYXJhbSB5MgorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIHBvaW50LgorICAgICAqIEByZXR1cm4gdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIHNwZWNpZmllZCBwb2ludHMuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBkb3VibGUgZGlzdGFuY2VTcShkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIHgyLCBkb3VibGUgeTIpIHsKICAgICAgICAgeDIgLT0geDE7CkBAIC0xOTcsMjMgKzIyNCwyOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEZpbmRzIHRoZSBzcXVhcmUgb2YgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhpcyBwb2ludCBhbmQgdGhlIHNwZWNpZmllZCBwb2ludC4KKyAgICAgKiBGaW5kcyB0aGUgc3F1YXJlIG9mIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoaXMgcG9pbnQgYW5kIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHggdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQKLSAgICAgKiBAcGFyYW0gcHkgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzcXVhcmUgb2YgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhpcyBwb2ludCBhbmQgdGhlIHNwZWNpZmllZCBwb2ludAorICAgICAqIEBwYXJhbSBweAorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQuCisgICAgICogQHBhcmFtIHB5CisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBwb2ludC4KKyAgICAgKiBAcmV0dXJuIHRoZSBzcXVhcmUgb2YgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhpcyBwb2ludCBhbmQgdGhlIHNwZWNpZmllZAorICAgICAqICAgICAgICAgcG9pbnQuCiAgICAgICovCiAgICAgcHVibGljIGRvdWJsZSBkaXN0YW5jZVNxKGRvdWJsZSBweCwgZG91YmxlIHB5KSB7CiAgICAgICAgIHJldHVybiBQb2ludDJELmRpc3RhbmNlU3EoZ2V0WCgpLCBnZXRZKCksIHB4LCBweSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRmluZHMgdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGlzIHBvaW50IGFuZCB0aGUgc3BlY2lmaWVkIHBvaW50LgorICAgICAqIEZpbmRzIHRoZSBzcXVhcmUgb2YgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhpcyBwb2ludCBhbmQgdGhlIHNwZWNpZmllZAorICAgICAqIHBvaW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBwIHRoZSBvdGhlciBwb2ludAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGlzIHBvaW50IGFuZCB0aGUgc3BlY2lmaWVkIHBvaW50CisgICAgICogQHBhcmFtIHAKKyAgICAgKiAgICAgICAgICAgIHRoZSBvdGhlciBwb2ludC4KKyAgICAgKiBAcmV0dXJuIHRoZSBzcXVhcmUgb2YgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhpcyBwb2ludCBhbmQgdGhlIHNwZWNpZmllZAorICAgICAqICAgICAgICAgcG9pbnQuCiAgICAgICovCiAgICAgcHVibGljIGRvdWJsZSBkaXN0YW5jZVNxKFBvaW50MkQgcCkgewogICAgICAgICByZXR1cm4gUG9pbnQyRC5kaXN0YW5jZVNxKGdldFgoKSwgZ2V0WSgpLCBwLmdldFgoKSwgcC5nZXRZKCkpOwpAQCAtMjIyLDEyICsyNTQsMTUgQEAKICAgICAvKioKICAgICAgKiBGaW5kcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIHNwZWNpZmllZCBwb2ludHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHgxIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IHBvaW50Ci0gICAgICogQHBhcmFtIHkxIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IHBvaW50Ci0gICAgICogQHBhcmFtIHgyIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBwb2ludAotICAgICAqIEBwYXJhbSB5MiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgcG9pbnQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSB0d28gc3BlY2lmaWVkIHBvaW50cworICAgICAqIEBwYXJhbSB4MQorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcG9pbnQuCisgICAgICogQHBhcmFtIHkxCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwb2ludC4KKyAgICAgKiBAcGFyYW0geDIKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBwb2ludC4KKyAgICAgKiBAcGFyYW0geTIKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBwb2ludC4KKyAgICAgKiBAcmV0dXJuIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSB0d28gc3BlY2lmaWVkIHBvaW50cy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBkaXN0YW5jZShkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIHgyLCBkb3VibGUgeTIpIHsKICAgICAgICAgcmV0dXJuIE1hdGguc3FydChkaXN0YW5jZVNxKHgxLCB5MSwgeDIsIHkyKSk7CkBAIC0yMzYsMTAgKzI3MSwxMSBAQAogICAgIC8qKgogICAgICAqIEZpbmRzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoaXMgcG9pbnQgYW5kIHRoZSBzcGVjaWZpZWQgcG9pbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHB4IHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50Ci0gICAgICogQHBhcmFtIHB5IHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGlzIHBvaW50IGFuZCB0aGUgc3BlY2lmaWVkIHBvaW50CisgICAgICogQHBhcmFtIHB4CisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBwb2ludC4KKyAgICAgKiBAcGFyYW0gcHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LgorICAgICAqIEByZXR1cm4gdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhpcyBwb2ludCBhbmQgdGhlIHNwZWNpZmllZCBwb2ludC4KICAgICAgKi8KICAgICBwdWJsaWMgZG91YmxlIGRpc3RhbmNlKGRvdWJsZSBweCwgZG91YmxlIHB5KSB7CiAgICAgICAgIHJldHVybiBNYXRoLnNxcnQoZGlzdGFuY2VTcShweCwgcHkpKTsKQEAgLTI0OCw5ICsyODQsOSBAQAogICAgIC8qKgogICAgICAqIEZpbmRzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoaXMgcG9pbnQgYW5kIHRoZSBzcGVjaWZpZWQgcG9pbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHAgdGhlIG90aGVyIHBvaW50Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGlzIHBvaW50IGFuZCB0aGUgc3BlY2lmaWVkIHBvaW50CisgICAgICogQHBhcmFtIHAKKyAgICAgKiAgICAgICAgICAgIHRoZSBvdGhlciBwb2ludC4KKyAgICAgKiBAcmV0dXJuIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoaXMgcG9pbnQgYW5kIHRoZSBzcGVjaWZpZWQgcG9pbnQuCiAgICAgICovCiAgICAgcHVibGljIGRvdWJsZSBkaXN0YW5jZShQb2ludDJEIHApIHsKICAgICAgICAgcmV0dXJuIE1hdGguc3FydChkaXN0YW5jZVNxKHApKTsKQEAgLTI3OSwxMCArMzE1LDkgQEAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBQb2ludDJEKSB7Ci0gICAgICAgICAgICBQb2ludDJEIHAgPSAoUG9pbnQyRCkgb2JqOworICAgICAgICAgICAgUG9pbnQyRCBwID0gKFBvaW50MkQpb2JqOwogICAgICAgICAgICAgcmV0dXJuIGdldFgoKSA9PSBwLmdldFgoKSAmJiBnZXRZKCkgPT0gcC5nZXRZKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2dlb20vUXVhZEN1cnZlMkQuamF2YSBiL2F3dC9qYXZhL2F3dC9nZW9tL1F1YWRDdXJ2ZTJELmphdmEKaW5kZXggNjRlYTZkNi4uN2E4NmE0OCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2dlb20vUXVhZEN1cnZlMkQuamF2YQorKysgYi9hd3QvamF2YS9hd3QvZ2VvbS9RdWFkQ3VydmUyRC5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIERlbmlzIE0uIEtpc2hlbmtvCiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5nZW9tOwogCiBpbXBvcnQgamF2YS5hd3QuUmVjdGFuZ2xlOwpAQCAtMjgsNDIgKzI5LDU4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogVGhlIENsYXNzIFF1YWRDdXJ2ZTJEIGlzIGEgU2hhcGUgdGhhdCByZXByZXNlbnRzIGEgc2VnbWVudCBvZiBhIAotICogcXVhZHJhdGljIChCZXppZXIpIGN1cnZlLiBUaGUgY3VydmVkIHNlZ21lbnQgaXMgZGV0ZXJtaW5lZCBieSB0aHJlZSBwb2ludHM6Ci0gKiBhIHN0YXJ0IHBvaW50LCBhbiBlbmQgcG9pbnQsIGFuZCBhIGNvbnRyb2wgcG9pbnQuICBUaGUgbGluZSBmcm9tIHRoZSBjb250cm9sIAotICogcG9pbnQgdG8gdGhlIHN0YXJ0aW5nIHBvaW50IGdpdmVzIHRoZSB0YW5nZW50IHRvIHRoZSBjdXJ2ZSBhdCB0aGUKLSAqIHN0YXJ0aW5nIHBvaW50LCBhbmQgdGhlIGxpbmUgZnJvbSB0aGUgY29udHJvbCBwb2ludCB0byB0aGUgZW5kIHBvaW50IAotICogZ2l2ZXMgdGhlIHRhbmdlbnQgdG8gdGhlIGN1cnZlIGF0IHRoZSBlbmQgcG9pbnQuCisgKiBUaGUgQ2xhc3MgUXVhZEN1cnZlMkQgaXMgYSBTaGFwZSB0aGF0IHJlcHJlc2VudHMgYSBzZWdtZW50IG9mIGEgcXVhZHJhdGljCisgKiAoQmV6aWVyKSBjdXJ2ZS4gVGhlIGN1cnZlZCBzZWdtZW50IGlzIGRldGVybWluZWQgYnkgdGhyZWUgcG9pbnRzOiBhIHN0YXJ0CisgKiBwb2ludCwgYW4gZW5kIHBvaW50LCBhbmQgYSBjb250cm9sIHBvaW50LiBUaGUgbGluZSBmcm9tIHRoZSBjb250cm9sIHBvaW50IHRvCisgKiB0aGUgc3RhcnRpbmcgcG9pbnQgZ2l2ZXMgdGhlIHRhbmdlbnQgdG8gdGhlIGN1cnZlIGF0IHRoZSBzdGFydGluZyBwb2ludCwgYW5kCisgKiB0aGUgbGluZSBmcm9tIHRoZSBjb250cm9sIHBvaW50IHRvIHRoZSBlbmQgcG9pbnQgZ2l2ZXMgdGhlIHRhbmdlbnQgdG8gdGhlCisgKiBjdXJ2ZSBhdCB0aGUgZW5kIHBvaW50LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFF1YWRDdXJ2ZTJEIGltcGxlbWVudHMgU2hhcGUsIENsb25lYWJsZSB7CiAKICAgICAvKioKLSAgICAgKiBUaGUgQ2xhc3MgRmxvYXQgaXMgdGhlIHN1YmNsYXNzIG9mIFF1YWRDdXJ2ZTJEIHRoYXQgaGFzIGFsbCAKLSAgICAgKiBvZiBpdHMgZGF0YSB2YWx1ZXMgc3RvcmVkIHdpdGggZmxvYXQtbGV2ZWwgcHJlY2lzaW9uLgorICAgICAqIFRoZSBDbGFzcyBGbG9hdCBpcyB0aGUgc3ViY2xhc3Mgb2YgUXVhZEN1cnZlMkQgdGhhdCBoYXMgYWxsIG9mIGl0cyBkYXRhCisgICAgICogdmFsdWVzIHN0b3JlZCB3aXRoIGZsb2F0LWxldmVsIHByZWNpc2lvbi4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZsb2F0IGV4dGVuZHMgUXVhZEN1cnZlMkQgewogCi0gICAgICAgIC8qKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgY3VydmVkIHNlZ21lbnQuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgY3VydmVkIHNlZ21lbnQuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmxvYXQgeDE7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50LiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgY3VydmVkIHNlZ21lbnQuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmxvYXQgeTE7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgY29udHJvbCBwb2ludC4gICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGNvbnRyb2wgcG9pbnQuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmxvYXQgY3RybHg7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgY29udHJvbCBwb2ludC4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgY29udHJvbCBwb2ludC4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmbG9hdCBjdHJseTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50LiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50LgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGZsb2F0IHgyOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvZiB0aGUgY3VydmVkIHNlZ21lbnQuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvZiB0aGUgY3VydmVkIHNlZ21lbnQuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmxvYXQgeTI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBmbG9hdC12YWx1ZWQgUXVhZEN1cnZlMkQgd2l0aCBhbGwgY29vcmRpbmF0ZSB2YWx1ZXMKLSAgICAgICAgICogc2V0IHRvIHplcm8uCisgICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBmbG9hdC12YWx1ZWQgUXVhZEN1cnZlMkQgd2l0aCBhbGwgY29vcmRpbmF0ZQorICAgICAgICAgKiB2YWx1ZXMgc2V0IHRvIHplcm8uCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgRmxvYXQoKSB7CiAgICAgICAgIH0KQEAgLTcyLDEyICs4OSwyMCBAQAogICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZmxvYXQtdmFsdWVkIFF1YWRDdXJ2ZTJEIHdpdGggdGhlIHNwZWNpZmllZAogICAgICAgICAgKiBjb29yZGluYXRlIHZhbHVlcy4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSB4MSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgY3VydmVkIHNlZ21lbnQKLSAgICAgICAgICogQHBhcmFtIHkxIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudAotICAgICAgICAgKiBAcGFyYW0gY3RybHggdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgY29udHJvbCBwb2ludAotICAgICAgICAgKiBAcGFyYW0gY3RybHkgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgY29udHJvbCBwb2ludAotICAgICAgICAgKiBAcGFyYW0geDIgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudAotICAgICAgICAgKiBAcGFyYW0geTIgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudAorICAgICAgICAgKiBAcGFyYW0geDEKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgY3VydmVkCisgICAgICAgICAqICAgICAgICAgICAgc2VnbWVudC4KKyAgICAgICAgICogQHBhcmFtIHkxCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGN1cnZlZAorICAgICAgICAgKiAgICAgICAgICAgIHNlZ21lbnQuCisgICAgICAgICAqIEBwYXJhbSBjdHJseAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGNvbnRyb2wgcG9pbnQuCisgICAgICAgICAqIEBwYXJhbSBjdHJseQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGNvbnRyb2wgcG9pbnQuCisgICAgICAgICAqIEBwYXJhbSB4MgorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvZiB0aGUgY3VydmVkIHNlZ21lbnQuCisgICAgICAgICAqIEBwYXJhbSB5MgorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvZiB0aGUgY3VydmVkIHNlZ21lbnQuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgRmxvYXQoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCBjdHJseCwgZmxvYXQgY3RybHksIGZsb2F0IHgyLCBmbG9hdCB5MikgewogICAgICAgICAgICAgc2V0Q3VydmUoeDEsIHkxLCBjdHJseCwgY3RybHksIHgyLCB5Mik7CkBAIC0xNDEsMTIgKzE2NiwyMCBAQAogICAgICAgICAvKioKICAgICAgICAgICogU2V0cyB0aGUgZGF0YSB2YWx1ZXMgb2YgdGhlIGN1cnZlLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHgxIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudAotICAgICAgICAgKiBAcGFyYW0geTEgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50Ci0gICAgICAgICAqIEBwYXJhbSBjdHJseCB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBjb250cm9sIHBvaW50Ci0gICAgICAgICAqIEBwYXJhbSBjdHJseSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBjb250cm9sIHBvaW50Ci0gICAgICAgICAqIEBwYXJhbSB4MiB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50Ci0gICAgICAgICAqIEBwYXJhbSB5MiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50CisgICAgICAgICAqIEBwYXJhbSB4MQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBjdXJ2ZWQKKyAgICAgICAgICogICAgICAgICAgICBzZWdtZW50LgorICAgICAgICAgKiBAcGFyYW0geTEKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgY3VydmVkCisgICAgICAgICAqICAgICAgICAgICAgc2VnbWVudC4KKyAgICAgICAgICogQHBhcmFtIGN0cmx4CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgY29udHJvbCBwb2ludC4KKyAgICAgICAgICogQHBhcmFtIGN0cmx5CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgY29udHJvbCBwb2ludC4KKyAgICAgICAgICogQHBhcmFtIHgyCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudC4KKyAgICAgICAgICogQHBhcmFtIHkyCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudC4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldEN1cnZlKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgY3RybHgsIGZsb2F0IGN0cmx5LCBmbG9hdCB4MiwgZmxvYXQgeTIpIHsKICAgICAgICAgICAgIHRoaXMueDEgPSB4MTsKQEAgLTE2NywzMiArMjAwLDQ2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhlIENsYXNzIERvdWJsZSBpcyB0aGUgc3ViY2xhc3Mgb2YgUXVhZEN1cnZlMkQgdGhhdCBoYXMgYWxsIAotICAgICAqIG9mIGl0cyBkYXRhIHZhbHVlcyBzdG9yZWQgd2l0aCBkb3VibGUtbGV2ZWwgcHJlY2lzaW9uLgorICAgICAqIFRoZSBDbGFzcyBEb3VibGUgaXMgdGhlIHN1YmNsYXNzIG9mIFF1YWRDdXJ2ZTJEIHRoYXQgaGFzIGFsbCBvZiBpdHMgZGF0YQorICAgICAqIHZhbHVlcyBzdG9yZWQgd2l0aCBkb3VibGUtbGV2ZWwgcHJlY2lzaW9uLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRG91YmxlIGV4dGVuZHMgUXVhZEN1cnZlMkQgewogCi0gICAgICAgIC8qKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgY3VydmVkIHNlZ21lbnQuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgY3VydmVkIHNlZ21lbnQuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZG91YmxlIHgxOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudC4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50LgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGRvdWJsZSB5MTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBjb250cm9sIHBvaW50LiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBjb250cm9sIHBvaW50LgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGRvdWJsZSBjdHJseDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBjb250cm9sIHBvaW50LiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBjb250cm9sIHBvaW50LgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGRvdWJsZSBjdHJseTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50LiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50LgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGRvdWJsZSB4MjsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50LiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50LgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGRvdWJsZSB5MjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRvdWJsZS12YWx1ZWQgUXVhZEN1cnZlMkQgd2l0aCBhbGwgY29vcmRpbmF0ZSB2YWx1ZXMKLSAgICAgICAgICogc2V0IHRvIHplcm8uCisgICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkb3VibGUtdmFsdWVkIFF1YWRDdXJ2ZTJEIHdpdGggYWxsIGNvb3JkaW5hdGUKKyAgICAgICAgICogdmFsdWVzIHNldCB0byB6ZXJvLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIERvdWJsZSgpIHsKICAgICAgICAgfQpAQCAtMjAxLDEyICsyNDgsMjAgQEAKICAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRvdWJsZS12YWx1ZWQgUXVhZEN1cnZlMkQgd2l0aCB0aGUgc3BlY2lmaWVkCiAgICAgICAgICAqIGNvb3JkaW5hdGUgdmFsdWVzLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHgxIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudAotICAgICAgICAgKiBAcGFyYW0geTEgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50Ci0gICAgICAgICAqIEBwYXJhbSBjdHJseCB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBjb250cm9sIHBvaW50Ci0gICAgICAgICAqIEBwYXJhbSBjdHJseSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBjb250cm9sIHBvaW50Ci0gICAgICAgICAqIEBwYXJhbSB4MiB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50Ci0gICAgICAgICAqIEBwYXJhbSB5MiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50CisgICAgICAgICAqIEBwYXJhbSB4MQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBjdXJ2ZWQKKyAgICAgICAgICogICAgICAgICAgICBzZWdtZW50LgorICAgICAgICAgKiBAcGFyYW0geTEKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgY3VydmVkCisgICAgICAgICAqICAgICAgICAgICAgc2VnbWVudC4KKyAgICAgICAgICogQHBhcmFtIGN0cmx4CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgY29udHJvbCBwb2ludC4KKyAgICAgICAgICogQHBhcmFtIGN0cmx5CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgY29udHJvbCBwb2ludC4KKyAgICAgICAgICogQHBhcmFtIHgyCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudC4KKyAgICAgICAgICogQHBhcmFtIHkyCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudC4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBEb3VibGUoZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSBjdHJseCwgZG91YmxlIGN0cmx5LCBkb3VibGUgeDIsIGRvdWJsZSB5MikgewogICAgICAgICAgICAgc2V0Q3VydmUoeDEsIHkxLCBjdHJseCwgY3RybHksIHgyLCB5Mik7CkBAIC0yNzcsMjggKzMzMiwzNyBAQAogICAgIH0KIAogICAgIC8qCi0gICAgICogUXVhZEN1cnZlMkQgcGF0aCBpdGVyYXRvciAKKyAgICAgKiBRdWFkQ3VydmUyRCBwYXRoIGl0ZXJhdG9yCiAgICAgICovCiAgICAgLyoqCiAgICAgICogVGhlIFBhdGhJdGVyYXRvciBmb3IgYSBRdWFkMkQgY3VydmUuCiAgICAgICovCiAgICAgY2xhc3MgSXRlcmF0b3IgaW1wbGVtZW50cyBQYXRoSXRlcmF0b3IgewogCi0gICAgICAgIC8qKiBUaGUgc291cmNlIFF1YWRDdXJ2ZTJEIG9iamVjdC4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzb3VyY2UgUXVhZEN1cnZlMkQgb2JqZWN0LgorICAgICAgICAgKi8KICAgICAgICAgUXVhZEN1cnZlMkQgYzsKIAotICAgICAgICAvKiogVGhlIHBhdGggaXRlcmF0b3IgdHJhbnNmb3JtYXRpb24uICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcGF0aCBpdGVyYXRvciB0cmFuc2Zvcm1hdGlvbi4KKyAgICAgICAgICovCiAgICAgICAgIEFmZmluZVRyYW5zZm9ybSB0OwogCi0gICAgICAgIC8qKiBUaGUgY3VycmVudCBzZWdtZW50IGluZGV4LiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGN1cnJlbnQgc2VnbWVudCBpbmRleC4KKyAgICAgICAgICovCiAgICAgICAgIGludCBpbmRleDsKIAogICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0cyBhIG5ldyBRdWFkQ3VydmUyRC5JdGVyYXRvciBmb3IgZ2l2ZW4gY3VydmUgYW5kIHRyYW5zZm9ybWF0aW9uCisgICAgICAgICAqIENvbnN0cnVjdHMgYSBuZXcgUXVhZEN1cnZlMkQuSXRlcmF0b3IgZm9yIGdpdmVuIGN1cnZlIGFuZAorICAgICAgICAgKiB0cmFuc2Zvcm1hdGlvbgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHEgLSB0aGUgc291cmNlIFF1YWRDdXJ2ZTJEIG9iamVjdAotICAgICAgICAgKiBAcGFyYW0gdCB0aGUgQWZmaW5lVHJhbnNmb3JtIHRoYXQgYWN0cyBvbiB0aGUgY29vcmRpbmF0ZXMgYmVmb3JlIAotICAgICAgICAgKiByZXR1cm5pbmcgdGhlbSAob3IgbnVsbCkKKyAgICAgICAgICogQHBhcmFtIHEKKyAgICAgICAgICogICAgICAgICAgICB0aGUgc291cmNlIFF1YWRDdXJ2ZTJEIG9iamVjdC4KKyAgICAgICAgICogQHBhcmFtIHQKKyAgICAgICAgICogICAgICAgICAgICB0aGUgQWZmaW5lVHJhbnNmb3JtIHRoYXQgYWN0cyBvbiB0aGUgY29vcmRpbmF0ZXMgYmVmb3JlCisgICAgICAgICAqICAgICAgICAgICAgcmV0dXJuaW5nIHRoZW0gKG9yIG51bGwpLgogICAgICAgICAgKi8KICAgICAgICAgSXRlcmF0b3IoUXVhZEN1cnZlMkQgcSwgQWZmaW5lVHJhbnNmb3JtIHQpIHsKICAgICAgICAgICAgIHRoaXMuYyA9IHE7CkBAIC0zODAsMjg0ICs0NDQsMzA3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50CisgICAgICogQHJldHVybiB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgZG91YmxlIGdldFgxKCk7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQKKyAgICAgKiBAcmV0dXJuIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBkb3VibGUgZ2V0WTEoKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHN0YXJ0aW5nIHBvaW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN0YXJ0aW5nIHBvaW50CisgICAgICogQHJldHVybiB0aGUgc3RhcnRpbmcgcG9pbnQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFBvaW50MkQgZ2V0UDEoKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgY29udHJvbCBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGNvbnRyb2wgcG9pbnQKKyAgICAgKiBAcmV0dXJuIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGNvbnRyb2wgcG9pbnQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGRvdWJsZSBnZXRDdHJsWCgpOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBjb250cm9sIHBvaW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4geSBjb29yZGluYXRlIG9mIHRoZSBjb250cm9sIHBvaW50CisgICAgICogQHJldHVybiB5IGNvb3JkaW5hdGUgb2YgdGhlIGNvbnRyb2wgcG9pbnQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGRvdWJsZSBnZXRDdHJsWSgpOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgY29udHJvbCBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjb250cm9sIHBvaW50CisgICAgICogQHJldHVybiB0aGUgY29udHJvbCBwb2ludC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgUG9pbnQyRCBnZXRDdHJsUHQoKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50CisgICAgICogQHJldHVybiB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGRvdWJsZSBnZXRYMigpOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQKKyAgICAgKiBAcmV0dXJuIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgZG91YmxlIGdldFkyKCk7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBlbmQgcG9pbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgZW5kIHBvaW50CisgICAgICogQHJldHVybiB0aGUgZW5kIHBvaW50LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBQb2ludDJEIGdldFAyKCk7CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBkYXRhIG9mIHRoZSBjdXJ2ZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geDEgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50Ci0gICAgICogQHBhcmFtIHkxIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudAotICAgICAqIEBwYXJhbSBjdHJseCB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIGN0cmx5IHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0geDIgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudAotICAgICAqIEBwYXJhbSB5MiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50CisgICAgICogQHBhcmFtIHgxCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgY3VydmVkIHNlZ21lbnQuCisgICAgICogQHBhcmFtIHkxCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgY3VydmVkIHNlZ21lbnQuCisgICAgICogQHBhcmFtIGN0cmx4CisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSBjdHJseQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0geDIKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvZiB0aGUgY3VydmVkIHNlZ21lbnQuCisgICAgICogQHBhcmFtIHkyCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50LgogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEN1cnZlKGRvdWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUgY3RybHgsIGRvdWJsZSBjdHJseSwgZG91YmxlIHgyLCBkb3VibGUgeTIpOworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEN1cnZlKGRvdWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUgY3RybHgsIGRvdWJsZSBjdHJseSwgZG91YmxlIHgyLAorICAgICAgICAgICAgZG91YmxlIHkyKTsKIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGRhdGEgb2YgdGhlIGN1cnZlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwMSB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50Ci0gICAgICogQHBhcmFtIGNwIHRoZSBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIHAyIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50Ci0gICAgICogCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBhbnkgb2YgdGhlIHRocmVlIHBvaW50cyBpcyBudWxsLgorICAgICAqIEBwYXJhbSBwMQorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudC4KKyAgICAgKiBAcGFyYW0gY3AKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSBwMgorICAgICAqICAgICAgICAgICAgdGhlIGVuZCBwb2ludCBvZiB0aGUgY3VydmVkIHNlZ21lbnQuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFueSBvZiB0aGUgdGhyZWUgcG9pbnRzIGlzIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q3VydmUoUG9pbnQyRCBwMSwgUG9pbnQyRCBjcCwgUG9pbnQyRCBwMikgewogICAgICAgICBzZXRDdXJ2ZShwMS5nZXRYKCksIHAxLmdldFkoKSwgY3AuZ2V0WCgpLCBjcC5nZXRZKCksIHAyLmdldFgoKSwgcDIuZ2V0WSgpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkYXRhIG9mIHRoZSBjdXJ2ZSBieSByZWFkaW5nIHRoZSBkYXRhIGZyb20gYW4gYXJyYXkKLSAgICAgKiBvZiB2YWx1ZXMuIFRoZSB2YWx1ZXMgYXJlIHJlYWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIGFyZ3VtZW50cwotICAgICAqIG9mIHRoZSBtZXRob2Qge0BsaW5rIFF1YWRDdXJ2ZTJEI3NldEN1cnZlKGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUpfS4KKyAgICAgKiBTZXRzIHRoZSBkYXRhIG9mIHRoZSBjdXJ2ZSBieSByZWFkaW5nIHRoZSBkYXRhIGZyb20gYW4gYXJyYXkgb2YgdmFsdWVzLgorICAgICAqIFRoZSB2YWx1ZXMgYXJlIHJlYWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIGFyZ3VtZW50cyBvZiB0aGUgbWV0aG9kCisgICAgICoge0BsaW5rIFF1YWRDdXJ2ZTJEI3NldEN1cnZlKGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUpfQorICAgICAqIC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29vcmRzIHRoZSBhcnJheSBvZiB2YWx1ZXMgY29udGFpbmluZyB0aGUgbmV3IGNvb3JkaW5hdGVzCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IG9mIHRoZSBkYXRhIHRvIHJlYWQgd2l0aGluIHRoZSBhcnJheQotICAgICAqIAotICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIGNvb3Jkcy5sZW5ndGggPCBvZmZzZXQgKyA2LgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGNvb3JkaW5hdGUgYXJyYXkgaXMgbnVsbC4KKyAgICAgKiBAcGFyYW0gY29vcmRzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgdmFsdWVzIGNvbnRhaW5pbmcgdGhlIG5ldyBjb29yZGluYXRlcy4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBkYXRhIHRvIHJlYWQgd2l0aGluIHRoZSBhcnJheS4KKyAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBjb29yZHMubGVuZ3RofSA8IG9mZnNldCArIDYuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjb29yZGluYXRlIGFycmF5IGlzIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q3VydmUoZG91YmxlW10gY29vcmRzLCBpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIHNldEN1cnZlKAotICAgICAgICAgICAgICAgIGNvb3Jkc1tvZmZzZXQgKyAwXSwgY29vcmRzW29mZnNldCArIDFdLAotICAgICAgICAgICAgICAgIGNvb3Jkc1tvZmZzZXQgKyAyXSwgY29vcmRzW29mZnNldCArIDNdLAorICAgICAgICBzZXRDdXJ2ZShjb29yZHNbb2Zmc2V0ICsgMF0sIGNvb3Jkc1tvZmZzZXQgKyAxXSwgY29vcmRzW29mZnNldCArIDJdLCBjb29yZHNbb2Zmc2V0ICsgM10sCiAgICAgICAgICAgICAgICAgY29vcmRzW29mZnNldCArIDRdLCBjb29yZHNbb2Zmc2V0ICsgNV0pOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRhdGEgb2YgdGhlIGN1cnZlIGJ5IHJlYWRpbmcgdGhlIGRhdGEgZnJvbSBhbiBhcnJheQotICAgICAqIG9mIHBvaW50cy4gVGhlIHZhbHVlcyBhcmUgcmVhZCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgYXJndW1lbnRzCi0gICAgICogb2YgdGhlIG1ldGhvZCB7QGxpbmsgUXVhZEN1cnZlMkQjc2V0Q3VydmUoUG9pbnQyRCwgUG9pbnQyRCwgUG9pbnQyRCl9CisgICAgICogU2V0cyB0aGUgZGF0YSBvZiB0aGUgY3VydmUgYnkgcmVhZGluZyB0aGUgZGF0YSBmcm9tIGFuIGFycmF5IG9mIHBvaW50cy4KKyAgICAgKiBUaGUgdmFsdWVzIGFyZSByZWFkIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBhcmd1bWVudHMgb2YgdGhlIG1ldGhvZAorICAgICAqIHtAbGluayBRdWFkQ3VydmUyRCNzZXRDdXJ2ZShQb2ludDJELCBQb2ludDJELCBQb2ludDJEKX0uCiAgICAgICogCi0gICAgICogQHBhcmFtIHBvaW50cyB0aGUgYXJyYXkgb2YgcG9pbnRzIGNvbnRhaW5pbmcgdGhlIG5ldyBjb29yZGluYXRlcwotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCBvZiB0aGUgZGF0YSB0byByZWFkIHdpdGhpbiB0aGUgYXJyYXkKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiBwb2ludHMubGVuZ3RoIDwgb2Zmc2V0ICsgMy4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBwb2ludCBhcnJheSBpcyBudWxsLgorICAgICAqIEBwYXJhbSBwb2ludHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBwb2ludHMgY29udGFpbmluZyB0aGUgbmV3IGNvb3JkaW5hdGVzLgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGRhdGEgdG8gcmVhZCB3aXRoaW4gdGhlIGFycmF5LgorICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgcG9pbnRzLmxlbmd0aCA8IG9mZnNldCArIDMuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwb2ludCBhcnJheSBpcyBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEN1cnZlKFBvaW50MkRbXSBwb2ludHMsIGludCBvZmZzZXQpIHsKLSAgICAgICAgc2V0Q3VydmUoCi0gICAgICAgICAgICAgICAgcG9pbnRzW29mZnNldCArIDBdLmdldFgoKSwgcG9pbnRzW29mZnNldCArIDBdLmdldFkoKSwKLSAgICAgICAgICAgICAgICBwb2ludHNbb2Zmc2V0ICsgMV0uZ2V0WCgpLCBwb2ludHNbb2Zmc2V0ICsgMV0uZ2V0WSgpLAotICAgICAgICAgICAgICAgIHBvaW50c1tvZmZzZXQgKyAyXS5nZXRYKCksIHBvaW50c1tvZmZzZXQgKyAyXS5nZXRZKCkpOworICAgICAgICBzZXRDdXJ2ZShwb2ludHNbb2Zmc2V0ICsgMF0uZ2V0WCgpLCBwb2ludHNbb2Zmc2V0ICsgMF0uZ2V0WSgpLCBwb2ludHNbb2Zmc2V0ICsgMV0uZ2V0WCgpLAorICAgICAgICAgICAgICAgIHBvaW50c1tvZmZzZXQgKyAxXS5nZXRZKCksIHBvaW50c1tvZmZzZXQgKyAyXS5nZXRYKCksIHBvaW50c1tvZmZzZXQgKyAyXS5nZXRZKCkpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGRhdGEgb2YgdGhlIGN1cnZlIGJ5IGNvcHlpbmcgaXQgZnJvbSBhbm90aGVyIFF1YWRDdXJ2ZTJELgogICAgICAqIAotICAgICAqIEBwYXJhbSBjdXJ2ZSB0aGUgY3VydmUgdG8gY29weSB0aGUgZGF0YSBwb2ludHMgZnJvbQotICAgICAqIAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGN1cnZlIGlzIG51bGwuCisgICAgICogQHBhcmFtIGN1cnZlCisgICAgICogICAgICAgICAgICB0aGUgY3VydmUgdG8gY29weSB0aGUgZGF0YSBwb2ludHMgZnJvbS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGN1cnZlIGlzIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q3VydmUoUXVhZEN1cnZlMkQgY3VydmUpIHsKLSAgICAgICAgc2V0Q3VydmUoCi0gICAgICAgICAgICAgICAgY3VydmUuZ2V0WDEoKSwgY3VydmUuZ2V0WTEoKSwKLSAgICAgICAgICAgICAgICBjdXJ2ZS5nZXRDdHJsWCgpLCBjdXJ2ZS5nZXRDdHJsWSgpLAotICAgICAgICAgICAgICAgIGN1cnZlLmdldFgyKCksIGN1cnZlLmdldFkyKCkpOworICAgICAgICBzZXRDdXJ2ZShjdXJ2ZS5nZXRYMSgpLCBjdXJ2ZS5nZXRZMSgpLCBjdXJ2ZS5nZXRDdHJsWCgpLCBjdXJ2ZS5nZXRDdHJsWSgpLCBjdXJ2ZS5nZXRYMigpLAorICAgICAgICAgICAgICAgIGN1cnZlLmdldFkyKCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgY29udHJvbCBwb2ludCB0byB0aGUKLSAgICAgKiBzdHJhaWdodCBsaW5lIHNlZ21lbnQgY29ubmVjdGluZyB0aGUgc3RhcnQgcG9pbnQgYW5kIHRoZSBlbmQgcG9pbnQKLSAgICAgKiBmb3IgdGhpcyBjdXJ2ZS4KKyAgICAgKiBHZXRzIHRoZSBzcXVhcmUgb2YgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGNvbnRyb2wgcG9pbnQgdG8gdGhlIHN0cmFpZ2h0CisgICAgICogbGluZSBzZWdtZW50IGNvbm5lY3RpbmcgdGhlIHN0YXJ0IHBvaW50IGFuZCB0aGUgZW5kIHBvaW50IGZvciB0aGlzIGN1cnZlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgY29udHJvbCBwb2ludCB0byB0aGUKLSAgICAgKiBzdHJhaWdodCBsaW5lIHNlZ21lbnQgY29ubmVjdGluZyB0aGUgc3RhcnQgcG9pbnQgYW5kIHRoZSBlbmQgcG9pbnQuCisgICAgICogQHJldHVybiB0aGUgc3F1YXJlIG9mIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBjb250cm9sIHBvaW50IHRvIHRoZSBzdHJhaWdodAorICAgICAqICAgICAgICAgbGluZSBzZWdtZW50IGNvbm5lY3RpbmcgdGhlIHN0YXJ0IHBvaW50IGFuZCB0aGUgZW5kIHBvaW50LgogICAgICAqLwogICAgIHB1YmxpYyBkb3VibGUgZ2V0RmxhdG5lc3NTcSgpIHsKLSAgICAgICAgcmV0dXJuIExpbmUyRC5wdFNlZ0Rpc3RTcSgKLSAgICAgICAgICAgICAgICBnZXRYMSgpLCBnZXRZMSgpLAotICAgICAgICAgICAgICAgIGdldFgyKCksIGdldFkyKCksCi0gICAgICAgICAgICAgICAgZ2V0Q3RybFgoKSwgZ2V0Q3RybFkoKSk7CisgICAgICAgIHJldHVybiBMaW5lMkQucHRTZWdEaXN0U3EoZ2V0WDEoKSwgZ2V0WTEoKSwgZ2V0WDIoKSwgZ2V0WTIoKSwgZ2V0Q3RybFgoKSwgZ2V0Q3RybFkoKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgc3F1YXJlIG9mIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBjb250cm9sIHBvaW50IHRvIHRoZQotICAgICAqIHN0cmFpZ2h0IGxpbmUgc2VnbWVudCBjb25uZWN0aW5nIHRoZSBzdGFydCBwb2ludCBhbmQgdGhlIGVuZCBwb2ludC4KKyAgICAgKiBHZXRzIHRoZSBzcXVhcmUgb2YgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGNvbnRyb2wgcG9pbnQgdG8gdGhlIHN0cmFpZ2h0CisgICAgICogbGluZSBzZWdtZW50IGNvbm5lY3RpbmcgdGhlIHN0YXJ0IHBvaW50IGFuZCB0aGUgZW5kIHBvaW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSB4MSB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgY3VydmVkIHNlZ21lbnQKLSAgICAgKiBAcGFyYW0geTEgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50Ci0gICAgICogQHBhcmFtIGN0cmx4IHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0gY3RybHkgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgY29udHJvbCBwb2ludAotICAgICAqIEBwYXJhbSB4MiB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50Ci0gICAgICogQHBhcmFtIHkyIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvZiB0aGUgY3VydmVkIHNlZ21lbnQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzcXVhcmUgb2YgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGNvbnRyb2wgcG9pbnQgdG8gdGhlCi0gICAgICogc3RyYWlnaHQgbGluZSBzZWdtZW50IGNvbm5lY3RpbmcgdGhlIHN0YXJ0IHBvaW50IGFuZCB0aGUgZW5kIHBvaW50LgorICAgICAqIEBwYXJhbSB4MQorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50LgorICAgICAqIEBwYXJhbSB5MQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50LgorICAgICAqIEBwYXJhbSBjdHJseAorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0gY3RybHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGNvbnRyb2wgcG9pbnQuCisgICAgICogQHBhcmFtIHgyCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50LgorICAgICAqIEBwYXJhbSB5MgorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudC4KKyAgICAgKiBAcmV0dXJuIHRoZSBzcXVhcmUgb2YgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGNvbnRyb2wgcG9pbnQgdG8gdGhlIHN0cmFpZ2h0CisgICAgICogICAgICAgICBsaW5lIHNlZ21lbnQgY29ubmVjdGluZyB0aGUgc3RhcnQgcG9pbnQgYW5kIHRoZSBlbmQgcG9pbnQuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBkb3VibGUgZ2V0RmxhdG5lc3NTcShkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIGN0cmx4LCBkb3VibGUgY3RybHksIGRvdWJsZSB4MiwgZG91YmxlIHkyKSB7CisgICAgcHVibGljIHN0YXRpYyBkb3VibGUgZ2V0RmxhdG5lc3NTcShkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIGN0cmx4LCBkb3VibGUgY3RybHksIGRvdWJsZSB4MiwKKyAgICAgICAgICAgIGRvdWJsZSB5MikgewogICAgICAgICByZXR1cm4gTGluZTJELnB0U2VnRGlzdFNxKHgxLCB5MSwgeDIsIHkyLCBjdHJseCwgY3RybHkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgY29udHJvbCBwb2ludCB0byB0aGUKLSAgICAgKiBzdHJhaWdodCBsaW5lIHNlZ21lbnQgY29ubmVjdGluZyB0aGUgc3RhcnQgcG9pbnQgYW5kIHRoZSBlbmQgcG9pbnQKLSAgICAgKiBieSByZWFkaW5nIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgcG9pbnRzIGZyb20gYW4gYXJyYXkgb2YgdmFsdWVzLgotICAgICAqIFRoZSB2YWx1ZXMgYXJlIHJlYWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIGFyZ3VtZW50cwotICAgICAqIG9mIHRoZSBtZXRob2Qge0BsaW5rIFF1YWRDdXJ2ZTJEI2dldEZsYXRuZXNzU3EoZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSl9LgorICAgICAqIEdldHMgdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgY29udHJvbCBwb2ludCB0byB0aGUgc3RyYWlnaHQKKyAgICAgKiBsaW5lIHNlZ21lbnQgY29ubmVjdGluZyB0aGUgc3RhcnQgcG9pbnQgYW5kIHRoZSBlbmQgcG9pbnQgYnkgcmVhZGluZyB0aGUKKyAgICAgKiBjb29yZGluYXRlcyBvZiB0aGUgcG9pbnRzIGZyb20gYW4gYXJyYXkgb2YgdmFsdWVzLiBUaGUgdmFsdWVzIGFyZSByZWFkIGluCisgICAgICogdGhlIHNhbWUgb3JkZXIgYXMgdGhlIGFyZ3VtZW50cyBvZiB0aGUgbWV0aG9kCisgICAgICoge0BsaW5rIFF1YWRDdXJ2ZTJEI2dldEZsYXRuZXNzU3EoZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSl9CisgICAgICogLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjb29yZHMgdGhlIGFycmF5IG9mIHBvaW50cyBjb250YWluaW5nIHRoZSBjb29yZGluYXRlcyB0byB1c2UgZm9yIAotICAgICAqIHRoZSBjYWxjdWxhdGlvbgotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCBvZiB0aGUgZGF0YSB0byByZWFkIHdpdGhpbiB0aGUgYXJyYXkKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzcXVhcmUgb2YgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGNvbnRyb2wgcG9pbnQgdG8gdGhlCi0gICAgICogc3RyYWlnaHQgbGluZSBzZWdtZW50IGNvbm5lY3RpbmcgdGhlIHN0YXJ0IHBvaW50IGFuZCB0aGUgZW5kIHBvaW50LgotICAgICAqIAotICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIGNvb3Jkcy5sZW5ndGggPCBvZmZzZXQgKyA2LgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGNvb3JkaW5hdGUgYXJyYXkgaXMgbnVsbC4KKyAgICAgKiBAcGFyYW0gY29vcmRzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgcG9pbnRzIGNvbnRhaW5pbmcgdGhlIGNvb3JkaW5hdGVzIHRvIHVzZSBmb3IgdGhlCisgICAgICogICAgICAgICAgICBjYWxjdWxhdGlvbgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGRhdGEgdG8gcmVhZCB3aXRoaW4gdGhlIGFycmF5CisgICAgICogQHJldHVybiB0aGUgc3F1YXJlIG9mIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBjb250cm9sIHBvaW50IHRvIHRoZSBzdHJhaWdodAorICAgICAqICAgICAgICAgbGluZSBzZWdtZW50IGNvbm5lY3RpbmcgdGhlIHN0YXJ0IHBvaW50IGFuZCB0aGUgZW5kIHBvaW50LgorICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGNvb3Jkcy5sZW5ndGh9IDwgb2Zmc2V0ICsgNi4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNvb3JkaW5hdGUgYXJyYXkgaXMgbnVsbC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBnZXRGbGF0bmVzc1NxKGRvdWJsZSBjb29yZHNbXSwgaW50IG9mZnNldCkgewotICAgICAgICByZXR1cm4gTGluZTJELnB0U2VnRGlzdFNxKAotICAgICAgICAgICAgICAgIGNvb3Jkc1tvZmZzZXQgKyAwXSwgY29vcmRzW29mZnNldCArIDFdLAotICAgICAgICAgICAgICAgIGNvb3Jkc1tvZmZzZXQgKyA0XSwgY29vcmRzW29mZnNldCArIDVdLAotICAgICAgICAgICAgICAgIGNvb3Jkc1tvZmZzZXQgKyAyXSwgY29vcmRzW29mZnNldCArIDNdKTsKKyAgICAgICAgcmV0dXJuIExpbmUyRC5wdFNlZ0Rpc3RTcShjb29yZHNbb2Zmc2V0ICsgMF0sIGNvb3Jkc1tvZmZzZXQgKyAxXSwgY29vcmRzW29mZnNldCArIDRdLAorICAgICAgICAgICAgICAgIGNvb3Jkc1tvZmZzZXQgKyA1XSwgY29vcmRzW29mZnNldCArIDJdLCBjb29yZHNbb2Zmc2V0ICsgM10pOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGNvbnRyb2wgcG9pbnQgdG8gdGhlCi0gICAgICogc3RyYWlnaHQgbGluZSBzZWdtZW50IGNvbm5lY3RpbmcgdGhlIHN0YXJ0IHBvaW50IGFuZCB0aGUgZW5kIHBvaW50Ci0gICAgICogb2YgdGhpcyBRdWFkQ3VydmUyRC4KKyAgICAgKiBHZXRzIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBjb250cm9sIHBvaW50IHRvIHRoZSBzdHJhaWdodCBsaW5lIHNlZ21lbnQKKyAgICAgKiBjb25uZWN0aW5nIHRoZSBzdGFydCBwb2ludCBhbmQgdGhlIGVuZCBwb2ludCBvZiB0aGlzIFF1YWRDdXJ2ZTJELgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBjb250cm9sIHBvaW50IHRvIHRoZQotICAgICAqIHN0cmFpZ2h0IGxpbmUgc2VnbWVudCBjb25uZWN0aW5nIHRoZSBzdGFydCBwb2ludCBhbmQgdGhlIGVuZCBwb2ludAotICAgICAqIG9mIHRoaXMgUXVhZEN1cnZlMkQKKyAgICAgKiBAcmV0dXJuIHRoZSB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgY29udHJvbCBwb2ludCB0byB0aGUgc3RyYWlnaHQgbGluZQorICAgICAqICAgICAgICAgc2VnbWVudCBjb25uZWN0aW5nIHRoZSBzdGFydCBwb2ludCBhbmQgdGhlIGVuZCBwb2ludCBvZiB0aGlzCisgICAgICogICAgICAgICBRdWFkQ3VydmUyRC4KICAgICAgKi8KICAgICBwdWJsaWMgZG91YmxlIGdldEZsYXRuZXNzKCkgewogICAgICAgICByZXR1cm4gTGluZTJELnB0U2VnRGlzdChnZXRYMSgpLCBnZXRZMSgpLCBnZXRYMigpLCBnZXRZMigpLCBnZXRDdHJsWCgpLCBnZXRDdHJsWSgpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBjb250cm9sIHBvaW50IHRvIHRoZQotICAgICAqIHN0cmFpZ2h0IGxpbmUgc2VnbWVudCBjb25uZWN0aW5nIHRoZSBzdGFydCBwb2ludCBhbmQgdGhlIGVuZCBwb2ludC4KKyAgICAgKiBHZXRzIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBjb250cm9sIHBvaW50IHRvIHRoZSBzdHJhaWdodCBsaW5lIHNlZ21lbnQKKyAgICAgKiBjb25uZWN0aW5nIHRoZSBzdGFydCBwb2ludCBhbmQgdGhlIGVuZCBwb2ludC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geDEgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50Ci0gICAgICogQHBhcmFtIHkxIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudAotICAgICAqIEBwYXJhbSBjdHJseCB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBjb250cm9sIHBvaW50Ci0gICAgICogQHBhcmFtIGN0cmx5IHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGNvbnRyb2wgcG9pbnQKLSAgICAgKiBAcGFyYW0geDIgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50IG9mIHRoZSBjdXJ2ZWQgc2VnbWVudAotICAgICAqIEBwYXJhbSB5MiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGNvbnRyb2wgcG9pbnQgdG8gdGhlCi0gICAgICogc3RyYWlnaHQgbGluZSBzZWdtZW50IGNvbm5lY3RpbmcgdGhlIHN0YXJ0IHBvaW50IGFuZCB0aGUgZW5kIHBvaW50CisgICAgICogQHBhcmFtIHgxCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgY3VydmVkIHNlZ21lbnQuCisgICAgICogQHBhcmFtIHkxCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgY3VydmVkIHNlZ21lbnQuCisgICAgICogQHBhcmFtIGN0cmx4CisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBjb250cm9sIHBvaW50LgorICAgICAqIEBwYXJhbSBjdHJseQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgY29udHJvbCBwb2ludC4KKyAgICAgKiBAcGFyYW0geDIKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvZiB0aGUgY3VydmVkIHNlZ21lbnQuCisgICAgICogQHBhcmFtIHkyCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGN1cnZlZCBzZWdtZW50LgorICAgICAqIEByZXR1cm4gdGhlIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBjb250cm9sIHBvaW50IHRvIHRoZSBzdHJhaWdodCBsaW5lCisgICAgICogICAgICAgICBzZWdtZW50IGNvbm5lY3RpbmcgdGhlIHN0YXJ0IHBvaW50IGFuZCB0aGUgZW5kIHBvaW50LgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIGdldEZsYXRuZXNzKGRvdWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUgY3RybHgsCi0gICAgICAgICAgICBkb3VibGUgY3RybHksIGRvdWJsZSB4MiwgZG91YmxlIHkyKQotICAgIHsKKyAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBnZXRGbGF0bmVzcyhkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIGN0cmx4LCBkb3VibGUgY3RybHksIGRvdWJsZSB4MiwKKyAgICAgICAgICAgIGRvdWJsZSB5MikgewogICAgICAgICByZXR1cm4gTGluZTJELnB0U2VnRGlzdCh4MSwgeTEsIHgyLCB5MiwgY3RybHgsIGN0cmx5KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgY29udHJvbCBwb2ludCB0byB0aGUKLSAgICAgKiBzdHJhaWdodCBsaW5lIHNlZ21lbnQgY29ubmVjdGluZyB0aGUgc3RhcnQgcG9pbnQgYW5kIHRoZSBlbmQgcG9pbnQuCi0gICAgICogVGhlIHZhbHVlcyBhcmUgcmVhZCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgYXJndW1lbnRzCi0gICAgICogb2YgdGhlIG1ldGhvZCB7QGxpbmsgUXVhZEN1cnZlMkQjZ2V0RmxhdG5lc3MoZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSl9LgorICAgICAqIEdldHMgdGhlIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBjb250cm9sIHBvaW50IHRvIHRoZSBzdHJhaWdodCBsaW5lIHNlZ21lbnQKKyAgICAgKiBjb25uZWN0aW5nIHRoZSBzdGFydCBwb2ludCBhbmQgdGhlIGVuZCBwb2ludC4gVGhlIHZhbHVlcyBhcmUgcmVhZCBpbiB0aGUKKyAgICAgKiBzYW1lIG9yZGVyIGFzIHRoZSBhcmd1bWVudHMgb2YgdGhlIG1ldGhvZAorICAgICAqIHtAbGluayBRdWFkQ3VydmUyRCNnZXRGbGF0bmVzcyhkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlKX0KKyAgICAgKiAuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNvb3JkcyB0aGUgYXJyYXkgb2YgcG9pbnRzIGNvbnRhaW5pbmcgdGhlIGNvb3JkaW5hdGVzIHRvIHVzZSBmb3IgCi0gICAgICogdGhlIGNhbGN1bGF0aW9uCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IG9mIHRoZSBkYXRhIHRvIHJlYWQgd2l0aGluIHRoZSBhcnJheQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBjb250cm9sIHBvaW50IHRvIHRoZQotICAgICAqIHN0cmFpZ2h0IGxpbmUgc2VnbWVudCBjb25uZWN0aW5nIHRoZSBzdGFydCBwb2ludCBhbmQgdGhlIGVuZCBwb2ludAotICAgICAqIAotICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIGNvb3Jkcy5sZW5ndGggPCBvZmZzZXQgKyA2LgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGNvb3JkaW5hdGUgYXJyYXkgaXMgbnVsbC4KKyAgICAgKiBAcGFyYW0gY29vcmRzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgcG9pbnRzIGNvbnRhaW5pbmcgdGhlIGNvb3JkaW5hdGVzIHRvIHVzZSBmb3IgdGhlCisgICAgICogICAgICAgICAgICBjYWxjdWxhdGlvbi4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBkYXRhIHRvIHJlYWQgd2l0aGluIHRoZSBhcnJheS4KKyAgICAgKiBAcmV0dXJuIHRoZSB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgY29udHJvbCBwb2ludCB0byB0aGUgc3RyYWlnaHQgbGluZQorICAgICAqICAgICAgICAgc2VnbWVudCBjb25uZWN0aW5nIHRoZSBzdGFydCBwb2ludCBhbmQgdGhlIGVuZCBwb2ludC4KKyAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtjb2RlIGNvb3Jkcy5sZW5ndGh9IDwgb2Zmc2V0ICsgNi4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGNvb3JkaW5hdGUgYXJyYXkgaXMgbnVsbC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBnZXRGbGF0bmVzcyhkb3VibGUgY29vcmRzW10sIGludCBvZmZzZXQpIHsKLSAgICAgICAgcmV0dXJuIExpbmUyRC5wdFNlZ0Rpc3QoCi0gICAgICAgICAgICAgICAgY29vcmRzW29mZnNldCArIDBdLCBjb29yZHNbb2Zmc2V0ICsgMV0sCi0gICAgICAgICAgICAgICAgY29vcmRzW29mZnNldCArIDRdLCBjb29yZHNbb2Zmc2V0ICsgNV0sCi0gICAgICAgICAgICAgICAgY29vcmRzW29mZnNldCArIDJdLCBjb29yZHNbb2Zmc2V0ICsgM10pOworICAgICAgICByZXR1cm4gTGluZTJELnB0U2VnRGlzdChjb29yZHNbb2Zmc2V0ICsgMF0sIGNvb3Jkc1tvZmZzZXQgKyAxXSwgY29vcmRzW29mZnNldCArIDRdLAorICAgICAgICAgICAgICAgIGNvb3Jkc1tvZmZzZXQgKyA1XSwgY29vcmRzW29mZnNldCArIDJdLCBjb29yZHNbb2Zmc2V0ICsgM10pOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGRhdGEgZm9yIHR3byBxdWFkcmF0aWMgY3VydmVzIGJ5IGRpdmlkaW5nIHRoaXMKLSAgICAgKiBjdXJ2ZSBpbiB0d28uIFRoZSBkaXZpc2lvbiBwb2ludCBpcyB0aGUgcG9pbnQgb24gdGhlIGN1cnZlIAotICAgICAqIHRoYXQgaXMgY2xvc2VzdCB0byB0aGlzIGN1cnZlJ3MgY29udHJvbCBwb2ludC4gVGhlIGRhdGEgb2YgCi0gICAgICogdGhpcyBjdXJ2ZSBpcyBsZWZ0IHVuY2hhbmdlZC4KKyAgICAgKiBDcmVhdGVzIHRoZSBkYXRhIGZvciB0d28gcXVhZHJhdGljIGN1cnZlcyBieSBkaXZpZGluZyB0aGlzIGN1cnZlIGluIHR3by4KKyAgICAgKiBUaGUgZGl2aXNpb24gcG9pbnQgaXMgdGhlIHBvaW50IG9uIHRoZSBjdXJ2ZSB0aGF0IGlzIGNsb3Nlc3QgdG8gdGhpcworICAgICAqIGN1cnZlJ3MgY29udHJvbCBwb2ludC4gVGhlIGRhdGEgb2YgdGhpcyBjdXJ2ZSBpcyBsZWZ0IHVuY2hhbmdlZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGVmdCB0aGUgUXVhZEN1cnZlMkQgd2hlcmUgdGhlIGxlZnQgKHN0YXJ0KSBzZWdtZW50J3MgCi0gICAgICogZGF0YSBpcyB3cml0dGVuCi0gICAgICogQHBhcmFtIHJpZ2h0IHRoZSBRdWFkQ3VydmUyRCB3aGVyZSB0aGUgcmlnaHQgKGVuZCkgc2VnbWVudCdzIAotICAgICAqIGRhdGEgaXMgd3JpdHRlbgotICAgICAqIAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgZWl0aGVyIGN1cnZlIGlzIG51bGwuCisgICAgICogQHBhcmFtIGxlZnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBRdWFkQ3VydmUyRCB3aGVyZSB0aGUgbGVmdCAoc3RhcnQpIHNlZ21lbnQncyBkYXRhIGlzCisgICAgICogICAgICAgICAgICB3cml0dGVuLgorICAgICAqIEBwYXJhbSByaWdodAorICAgICAqICAgICAgICAgICAgdGhlIFF1YWRDdXJ2ZTJEIHdoZXJlIHRoZSByaWdodCAoZW5kKSBzZWdtZW50J3MgZGF0YSBpcworICAgICAqICAgICAgICAgICAgd3JpdHRlbi4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgZWl0aGVyIGN1cnZlIGlzIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc3ViZGl2aWRlKFF1YWRDdXJ2ZTJEIGxlZnQsIFF1YWRDdXJ2ZTJEIHJpZ2h0KSB7CiAgICAgICAgIHN1YmRpdmlkZSh0aGlzLCBsZWZ0LCByaWdodCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgZGF0YSBmb3IgdHdvIHF1YWRyYXRpYyBjdXJ2ZXMgYnkgZGl2aWRpbmcgYSBzb3VyY2UKLSAgICAgKiBjdXJ2ZSBpbiB0d28uIFRoZSBkaXZpc2lvbiBwb2ludCBpcyB0aGUgcG9pbnQgb24gdGhlIGN1cnZlIAotICAgICAqIHRoYXQgaXMgY2xvc2VzdCB0byB0aGUgc291cmNlIGN1cnZlJ3MgY29udHJvbCBwb2ludC4gVGhlIGRhdGEgb2YgCi0gICAgICogdGhlIHNvdXJjZSBjdXJ2ZSBpcyBsZWZ0IHVuY2hhbmdlZC4KKyAgICAgKiBDcmVhdGVzIHRoZSBkYXRhIGZvciB0d28gcXVhZHJhdGljIGN1cnZlcyBieSBkaXZpZGluZyBhIHNvdXJjZSBjdXJ2ZSBpbgorICAgICAqIHR3by4gVGhlIGRpdmlzaW9uIHBvaW50IGlzIHRoZSBwb2ludCBvbiB0aGUgY3VydmUgdGhhdCBpcyBjbG9zZXN0IHRvIHRoZQorICAgICAqIHNvdXJjZSBjdXJ2ZSdzIGNvbnRyb2wgcG9pbnQuIFRoZSBkYXRhIG9mIHRoZSBzb3VyY2UgY3VydmUgaXMgbGVmdAorICAgICAqIHVuY2hhbmdlZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3JjIHRoZSBjdXJ2ZSB0aGF0IHByb3ZpZGVzIHRoZSBpbml0aWFsIGRhdGEKLSAgICAgKiBAcGFyYW0gbGVmdCB0aGUgUXVhZEN1cnZlMkQgd2hlcmUgdGhlIGxlZnQgKHN0YXJ0KSBzZWdtZW50J3MgCi0gICAgICogZGF0YSBpcyB3cml0dGVuCi0gICAgICogQHBhcmFtIHJpZ2h0IHRoZSBRdWFkQ3VydmUyRCB3aGVyZSB0aGUgcmlnaHQgKGVuZCkgc2VnbWVudCdzIAotICAgICAqIGRhdGEgaXMgd3JpdHRlbgotICAgICAqIAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgb25lIG9mIHRoZSBjdXJ2ZXMgaXMgbnVsbC4KKyAgICAgKiBAcGFyYW0gc3JjCisgICAgICogICAgICAgICAgICB0aGUgY3VydmUgdGhhdCBwcm92aWRlcyB0aGUgaW5pdGlhbCBkYXRhLgorICAgICAqIEBwYXJhbSBsZWZ0CisgICAgICogICAgICAgICAgICB0aGUgUXVhZEN1cnZlMkQgd2hlcmUgdGhlIGxlZnQgKHN0YXJ0KSBzZWdtZW50J3MgZGF0YSBpcworICAgICAqICAgICAgICAgICAgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gcmlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBRdWFkQ3VydmUyRCB3aGVyZSB0aGUgcmlnaHQgKGVuZCkgc2VnbWVudCdzIGRhdGEgaXMKKyAgICAgKiAgICAgICAgICAgIHdyaXR0ZW4uCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIG9uZSBvZiB0aGUgY3VydmVzIGlzIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHN1YmRpdmlkZShRdWFkQ3VydmUyRCBzcmMsIFF1YWRDdXJ2ZTJEIGxlZnQsIFF1YWRDdXJ2ZTJEIHJpZ2h0KSB7CiAgICAgICAgIGRvdWJsZSB4MSA9IHNyYy5nZXRYMSgpOwpAQCAtNjgxLDI2ICs3NjgsMzMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBkYXRhIGZvciB0d28gcXVhZHJhdGljIGN1cnZlcyBieSBkaXZpZGluZyBhIHNvdXJjZQotICAgICAqIGN1cnZlIGluIHR3by4gVGhlIGRpdmlzaW9uIHBvaW50IGlzIHRoZSBwb2ludCBvbiB0aGUgY3VydmUgCi0gICAgICogdGhhdCBpcyBjbG9zZXN0IHRvIHRoZSBzb3VyY2UgY3VydmUncyBjb250cm9sIHBvaW50LiBUaGUgZGF0YQotICAgICAqIGZvciB0aGUgdGhyZWUgY3VydmVzIGlzIHJlYWQgYW5kIHdyaXR0ZW4gZnJvbSBhcnJheXMgb2YgdmFsdWVzIGluIAotICAgICAqIHRoZSB1c3VhbCBvcmRlcjogeDEsIHkxLCBjeCwgY3ksIHgyLCB5Mi4KLSAgICAgKiAgCi0gICAgICogQHBhcmFtIHNyYyB0aGUgYXJyYXkgdGhhdCBnaXZlcyB0aGUgZGF0YSB2YWx1ZXMgZm9yIHRoZSBzb3VyY2UgY3VydmUKLSAgICAgKiBAcGFyYW0gc3Jjb2ZmIHRoZSBvZmZzZXQgaW4gdGhlIHNyYyBhcnJheSB0byByZWFkIHRoZSB2YWx1ZXMgZnJvbQotICAgICAqIEBwYXJhbSBsZWZ0IHRoZSBhcnJheSB3aGVyZSB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHN0YXJ0IGN1cnZlIHNob3VsZCBiZSB3cml0dGVuCi0gICAgICogQHBhcmFtIGxlZnRPZmYgdGhlIG9mZnNldCBpbiB0aGUgbGVmdCBhcnJheSB0byBzdGFydCB3cml0aW5nIHRoZSB2YWx1ZXMKLSAgICAgKiBAcGFyYW0gcmlnaHQgdGhlIGFycmF5IHdoZXJlIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgZW5kIGN1cnZlIHNob3VsZCBiZSB3cml0dGVuCi0gICAgICogQHBhcmFtIHJpZ2h0T2ZmIHRoZSBvZmZzZXQgaW4gdGhlIHJpZ2h0IGFycmF5IHRvIHN0YXJ0IHdyaXRpbmcgdGhlIHZhbHVlcworICAgICAqIENyZWF0ZXMgdGhlIGRhdGEgZm9yIHR3byBxdWFkcmF0aWMgY3VydmVzIGJ5IGRpdmlkaW5nIGEgc291cmNlIGN1cnZlIGluCisgICAgICogdHdvLiBUaGUgZGl2aXNpb24gcG9pbnQgaXMgdGhlIHBvaW50IG9uIHRoZSBjdXJ2ZSB0aGF0IGlzIGNsb3Nlc3QgdG8gdGhlCisgICAgICogc291cmNlIGN1cnZlJ3MgY29udHJvbCBwb2ludC4gVGhlIGRhdGEgZm9yIHRoZSB0aHJlZSBjdXJ2ZXMgaXMgcmVhZCBhbmQKKyAgICAgKiB3cml0dGVuIGZyb20gYXJyYXlzIG9mIHZhbHVlcyBpbiB0aGUgdXN1YWwgb3JkZXI6IHgxLCB5MSwgY3gsIGN5LCB4MiwgeTIuCiAgICAgICogCi0gICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgc3JjLmxlbmd0aCA8IHNyY29mZiArIDYKLSAgICAgKiBvciBpZiBsZWZ0Lmxlbmd0aCA8IGxlZnRPZmYgKyA2IG9yIGlmIHJpZ2h0Lmxlbmd0aCA8IHJpZ2h0T2ZmICsgNi4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIG9uZSBvZiB0aGUgYXJyYXlzIGlzIG51bGwuCisgICAgICogQHBhcmFtIHNyYworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IHRoYXQgZ2l2ZXMgdGhlIGRhdGEgdmFsdWVzIGZvciB0aGUgc291cmNlIGN1cnZlLgorICAgICAqIEBwYXJhbSBzcmNvZmYKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gdGhlIHNyYyBhcnJheSB0byByZWFkIHRoZSB2YWx1ZXMgZnJvbS4KKyAgICAgKiBAcGFyYW0gbGVmdAorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IHdoZXJlIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgc3RhcnQgY3VydmUgc2hvdWxkIGJlCisgICAgICogICAgICAgICAgICB3cml0dGVuLgorICAgICAqIEBwYXJhbSBsZWZ0T2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSBsZWZ0IGFycmF5IHRvIHN0YXJ0IHdyaXRpbmcgdGhlIHZhbHVlcy4KKyAgICAgKiBAcGFyYW0gcmlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSB3aGVyZSB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGVuZCBjdXJ2ZSBzaG91bGQgYmUKKyAgICAgKiAgICAgICAgICAgIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIHJpZ2h0T2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSByaWdodCBhcnJheSB0byBzdGFydCB3cml0aW5nIHRoZSB2YWx1ZXMuCisgICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgc3JjLmxlbmd0aH0gPCBzcmNvZmYgKyA2IG9yIGlmIHtAY29kZSBsZWZ0Lmxlbmd0aH0KKyAgICAgKiAgICAgICAgICAgICA8IGxlZnRPZmYgKyA2IG9yIGlmIHtAY29kZSByaWdodC5sZW5ndGh9IDwgcmlnaHRPZmYgKyA2LgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBvbmUgb2YgdGhlIGFycmF5cyBpcyBudWxsLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzdWJkaXZpZGUoZG91YmxlIHNyY1tdLCBpbnQgc3Jjb2ZmLCBkb3VibGUgbGVmdFtdLAotICAgICAgICAgICAgaW50IGxlZnRPZmYsIGRvdWJsZSByaWdodFtdLCBpbnQgcmlnaHRPZmYpCi0gICAgeworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzdWJkaXZpZGUoZG91YmxlIHNyY1tdLCBpbnQgc3Jjb2ZmLCBkb3VibGUgbGVmdFtdLCBpbnQgbGVmdE9mZiwKKyAgICAgICAgICAgIGRvdWJsZSByaWdodFtdLCBpbnQgcmlnaHRPZmYpIHsKICAgICAgICAgZG91YmxlIHgxID0gc3JjW3NyY29mZiArIDBdOwogICAgICAgICBkb3VibGUgeTEgPSBzcmNbc3Jjb2ZmICsgMV07CiAgICAgICAgIGRvdWJsZSBjeCA9IHNyY1tzcmNvZmYgKyAyXTsKQEAgLTczMiw0MiArODI2LDQzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRmluZHMgdGhlIHJvb3RzIG9mIHRoZSBxdWFkcmF0aWMgcG9seW5vbWlhbC4gVGhpcyBpcyAKLSAgICAgKiBhY2NvbXBsaXNoZWQgYnkgZmluZGluZyB0aGUgKHJlYWwpIHZhbHVlcyBvZiB4IHRoYXQgc29sdmUKLSAgICAgKiB0aGUgZm9sbG93aW5nIGVxdWF0aW9uOiBlcW5bMl0qeCp4ICsgZXFuWzFdKnggKyBlcW5bMF0gPSAwLgotICAgICAqIFRoZSBzb2x1dGlvbnMgYXJlIHdyaXR0ZW4gYmFjayBpbnRvIHRoZSBhcnJheSBlcW4gc3RhcnRpbmcKLSAgICAgKiBmcm9tIHRoZSBpbmRleCAwIGluIHRoZSBhcnJheS4gVGhlIHJldHVybiB2YWx1ZSB0ZWxscyBob3cgCi0gICAgICogbWFueSBhcnJheSBlbGVtZW50cyBoYXZlIGJlZW4gY2hhbmdlZCBieSB0aGlzIG1ldGhvZCBjYWxsLgorICAgICAqIEZpbmRzIHRoZSByb290cyBvZiB0aGUgcXVhZHJhdGljIHBvbHlub21pYWwuIFRoaXMgaXMgYWNjb21wbGlzaGVkIGJ5CisgICAgICogZmluZGluZyB0aGUgKHJlYWwpIHZhbHVlcyBvZiB4IHRoYXQgc29sdmUgdGhlIGZvbGxvd2luZyBlcXVhdGlvbjoKKyAgICAgKiBlcW5bMl0qeCp4ICsgZXFuWzFdKnggKyBlcW5bMF0gPSAwLiBUaGUgc29sdXRpb25zIGFyZSB3cml0dGVuIGJhY2sgaW50bworICAgICAqIHRoZSBhcnJheSBlcW4gc3RhcnRpbmcgZnJvbSB0aGUgaW5kZXggMCBpbiB0aGUgYXJyYXkuIFRoZSByZXR1cm4gdmFsdWUKKyAgICAgKiB0ZWxscyBob3cgbWFueSBhcnJheSBlbGVtZW50cyBoYXZlIGJlZW4gY2hhbmdlZCBieSB0aGlzIG1ldGhvZCBjYWxsLgogICAgICAqIAotICAgICAqIEBwYXJhbSBlcW4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgY29lZmZpY2llbnRzIG9mIHRoZSAKLSAgICAgKiBxdWFkcmF0aWMgcG9seW5vbWlhbCB0byBzb2x2ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2Ygcm9vdHMgb2YgdGhlIHF1YWRyYXRpYyBwb2x5bm9taWFsCi0gICAgICogCi0gICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgZXFuLmxlbmd0aCA8IDMuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgYXJyYXkgaXMgbnVsbC4KKyAgICAgKiBAcGFyYW0gZXFuCisgICAgICogICAgICAgICAgICBhbiBhcnJheSBjb250YWluaW5nIHRoZSBjb2VmZmljaWVudHMgb2YgdGhlIHF1YWRyYXRpYworICAgICAqICAgICAgICAgICAgcG9seW5vbWlhbCB0byBzb2x2ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2Ygcm9vdHMgb2YgdGhlIHF1YWRyYXRpYyBwb2x5bm9taWFsLgorICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIGVxbi5sZW5ndGh9IDwgMy4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGFycmF5IGlzIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgc29sdmVRdWFkcmF0aWMoZG91YmxlIGVxbltdKSB7CiAgICAgICAgIHJldHVybiBzb2x2ZVF1YWRyYXRpYyhlcW4sIGVxbik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRmluZHMgdGhlIHJvb3RzIG9mIHRoZSBxdWFkcmF0aWMgcG9seW5vbWlhbC4gVGhpcyBpcyAKLSAgICAgKiBhY2NvbXBsaXNoZWQgYnkgZmluZGluZyB0aGUgKHJlYWwpIHZhbHVlcyBvZiB4IHRoYXQgc29sdmUKLSAgICAgKiB0aGUgZm9sbG93aW5nIGVxdWF0aW9uOiBlcW5bMl0qeCp4ICsgZXFuWzFdKnggKyBlcW5bMF0gPSAwLgotICAgICAqIFRoZSBzb2x1dGlvbnMgYXJlIHdyaXR0ZW4gaW50byB0aGUgYXJyYXkgcmVzIHN0YXJ0aW5nCi0gICAgICogZnJvbSB0aGUgaW5kZXggMCBpbiB0aGUgYXJyYXkuIFRoZSByZXR1cm4gdmFsdWUgdGVsbHMgaG93IAotICAgICAqIG1hbnkgYXJyYXkgZWxlbWVudHMgaGF2ZSBiZWVuIHdyaXR0ZW4gYnkgdGhpcyBtZXRob2QgY2FsbC4KKyAgICAgKiBGaW5kcyB0aGUgcm9vdHMgb2YgdGhlIHF1YWRyYXRpYyBwb2x5bm9taWFsLiBUaGlzIGlzIGFjY29tcGxpc2hlZCBieQorICAgICAqIGZpbmRpbmcgdGhlIChyZWFsKSB2YWx1ZXMgb2YgeCB0aGF0IHNvbHZlIHRoZSBmb2xsb3dpbmcgZXF1YXRpb246CisgICAgICogZXFuWzJdKngqeCArIGVxblsxXSp4ICsgZXFuWzBdID0gMC4gVGhlIHNvbHV0aW9ucyBhcmUgd3JpdHRlbiBpbnRvIHRoZQorICAgICAqIGFycmF5IHJlcyBzdGFydGluZyBmcm9tIHRoZSBpbmRleCAwIGluIHRoZSBhcnJheS4gVGhlIHJldHVybiB2YWx1ZSB0ZWxscworICAgICAqIGhvdyBtYW55IGFycmF5IGVsZW1lbnRzIGhhdmUgYmVlbiB3cml0dGVuIGJ5IHRoaXMgbWV0aG9kIGNhbGwuCiAgICAgICogCi0gICAgICogQHBhcmFtIGVxbiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBjb2VmZmljaWVudHMgb2YgdGhlIAotICAgICAqIHF1YWRyYXRpYyBwb2x5bm9taWFsIHRvIHNvbHZlLgotICAgICAqIEBwYXJhbSByZXMgdGhlIGFycmF5IHRoYXQgdGhpcyBtZXRob2Qgd3JpdGVzIHRoZSByZXN1bHRzIGludG8KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2Ygcm9vdHMgb2YgdGhlIHF1YWRyYXRpYyBwb2x5bm9taWFsCi0gICAgICogCi0gICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgZXFuLmxlbmd0aCA8IDMgb3IgCi0gICAgICogaWYgcmVzLmxlbmd0aCBpcyBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiByb290cy4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGVpdGhlciBhcnJheSBpcyBudWxsLgorICAgICAqIEBwYXJhbSBlcW4KKyAgICAgKiAgICAgICAgICAgIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGNvZWZmaWNpZW50cyBvZiB0aGUgcXVhZHJhdGljCisgICAgICogICAgICAgICAgICBwb2x5bm9taWFsIHRvIHNvbHZlLgorICAgICAqIEBwYXJhbSByZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSB0aGF0IHRoaXMgbWV0aG9kIHdyaXRlcyB0aGUgcmVzdWx0cyBpbnRvLgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiByb290cyBvZiB0aGUgcXVhZHJhdGljIHBvbHlub21pYWwuCisgICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgZXFuLmxlbmd0aH0gPCAzIG9yIGlmIHtAY29kZSByZXMubGVuZ3RofSBpcyBsZXNzCisgICAgICogICAgICAgICAgICAgdGhhbiB0aGUgbnVtYmVyIG9mIHJvb3RzLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBlaXRoZXIgYXJyYXkgaXMgbnVsbC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGludCBzb2x2ZVF1YWRyYXRpYyhkb3VibGUgZXFuW10sIGRvdWJsZSByZXNbXSkgewogICAgICAgICByZXR1cm4gQ3Jvc3Npbmcuc29sdmVRdWFkKGVxbiwgcmVzKTsKQEAgLTgyMSw0ICs5MTYsMyBAQAogICAgIH0KIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZ2VvbS9SZWN0YW5nbGUyRC5qYXZhIGIvYXd0L2phdmEvYXd0L2dlb20vUmVjdGFuZ2xlMkQuamF2YQppbmRleCBkMzNkZDkxLi44MTY2MTM0IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZ2VvbS9SZWN0YW5nbGUyRC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9nZW9tL1JlY3RhbmdsZTJELmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgRGVuaXMgTS4gS2lzaGVua28KICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0Lmdlb207CiAKIGltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKQEAgLTI2LDQ0ICsyNyw2NCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5taXNjLkhhc2hDb2RlOwogCiAvKioKLSAqIFRoZSBDbGFzcyBSZWN0YW5nbGUyRCByZXByZXNlbnRzIGEgcmVjdGFuZ2xlIHdob3NlIGNvb3JkaW5hdGVzIGFyZSBnaXZlbiAKLSAqIHdpdGggdGhlIGNvcnJlY3QgcHJlY2lzaW9uIHRvIGJlIHVzZWQgd2l0aCB0aGUgR3JhcGhpY3MyRCBjbGFzc2VzLgorICogVGhlIENsYXNzIFJlY3RhbmdsZTJEIHJlcHJlc2VudHMgYSByZWN0YW5nbGUgd2hvc2UgY29vcmRpbmF0ZXMgYXJlIGdpdmVuIHdpdGgKKyAqIHRoZSBjb3JyZWN0IHByZWNpc2lvbiB0byBiZSB1c2VkIHdpdGggdGhlIEdyYXBoaWNzMkQgY2xhc3Nlcy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZWN0YW5nbGUyRCBleHRlbmRzIFJlY3Rhbmd1bGFyU2hhcGUgewogCi0gICAgLyoqIFRoZSBDb25zdGFudCBPVVRfTEVGVCBpcyBhIG1hc2sgdGhhdCBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgYSAKLSAgICAgKiBnaXZlbiBwb2ludCBpcyBvdXRzaWRlIHRoZSByZWN0YW5nbGUgYW5kIHRvIGl0cyBsZWZ0LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9VVF9MRUZUICAgPSAxOwotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgT1VUX1RPUCBpcyBhIG1hc2sgdGhhdCBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgYSAKLSAgICAgKiBnaXZlbiBwb2ludCBpcyBvdXRzaWRlIHRoZSByZWN0YW5nbGUgYW5kIGFib3ZlIGl0LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9VVF9UT1AgICAgPSAyOwotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgT1VUX1JJR0hUIGlzIGEgbWFzayB0aGF0IGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhIAotICAgICAqIGdpdmVuIHBvaW50IGlzIG91dHNpZGUgdGhlIHJlY3RhbmdsZSBhbmQgdG8gaXRzIHJpZ2h0LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9VVF9SSUdIVCAgPSA0OwotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgT1VUX0JPVFRPTSBpcyBhIG1hc2sgdGhhdCBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgYSAKLSAgICAgKiBnaXZlbiBwb2ludCBpcyBvdXRzaWRlIHRoZSByZWN0YW5nbGUgYW5kIGFib3ZlIGl0LiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBPVVRfTEVGVCBpcyBhIG1hc2sgdGhhdCBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgYSBnaXZlbgorICAgICAqIHBvaW50IGlzIG91dHNpZGUgdGhlIHJlY3RhbmdsZSBhbmQgdG8gaXRzIGxlZnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1VUX0xFRlQgPSAxOworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IE9VVF9UT1AgaXMgYSBtYXNrIHRoYXQgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGEgZ2l2ZW4KKyAgICAgKiBwb2ludCBpcyBvdXRzaWRlIHRoZSByZWN0YW5nbGUgYW5kIGFib3ZlIGl0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9VVF9UT1AgPSAyOworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IE9VVF9SSUdIVCBpcyBhIG1hc2sgdGhhdCBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgYSBnaXZlbgorICAgICAqIHBvaW50IGlzIG91dHNpZGUgdGhlIHJlY3RhbmdsZSBhbmQgdG8gaXRzIHJpZ2h0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9VVF9SSUdIVCA9IDQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgT1VUX0JPVFRPTSBpcyBhIG1hc2sgdGhhdCBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgYSBnaXZlbgorICAgICAqIHBvaW50IGlzIG91dHNpZGUgdGhlIHJlY3RhbmdsZSBhbmQgYWJvdmUgaXQuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1VUX0JPVFRPTSA9IDg7CiAKICAgICAvKioKLSAgICAgKiBUaGUgQ2xhc3MgRmxvYXQgaXMgdGhlIHN1YmNsYXNzIG9mIFJlY3RhbmdsZTJEIHRoYXQgcmVwcmVzZW50cyBhIAorICAgICAqIFRoZSBDbGFzcyBGbG9hdCBpcyB0aGUgc3ViY2xhc3Mgb2YgUmVjdGFuZ2xlMkQgdGhhdCByZXByZXNlbnRzIGEKICAgICAgKiByZWN0YW5nbGUgd2hvc2UgZGF0YSB2YWx1ZXMgYXJlIGdpdmVuIGFzIGZsb2F0cyAod2l0aCBmbG9hdC1sZXZlbAogICAgICAqIHByZWNpc2lvbikuCisgICAgICogCisgICAgICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGbG9hdCBleHRlbmRzIFJlY3RhbmdsZTJEIHsKIAotICAgICAgICAvKiogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lci4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmbG9hdCB4OwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lci4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmbG9hdCB5OwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmbG9hdCB3aWR0aDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmbG9hdCBoZWlnaHQ7CiAKICAgICAgICAgLyoqCkBAIC03NSwxMCArOTYsMTQgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyByZWN0YW5nbGUgd2l0aCB0aGUgc3BlY2lmaWVkIGZsb2F0LXByZWNpc2lvbiBkYXRhLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHggdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIKLSAgICAgICAgICogQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIKLSAgICAgICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlCi0gICAgICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICAgICAqIEBwYXJhbSB4CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIuCisgICAgICAgICAqIEBwYXJhbSB5CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIuCisgICAgICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIEZsb2F0KGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHdpZHRoLCBmbG9hdCBoZWlnaHQpIHsKICAgICAgICAgICAgIHNldFJlY3QoeCwgeSwgd2lkdGgsIGhlaWdodCk7CkBAIC0xMTIsMTAgKzEzNywxNCBAQAogICAgICAgICAvKioKICAgICAgICAgICogU2V0cyB0aGUgcmVjdGFuZ2xlJ3MgZGF0YSB0byB0aGUgZ2l2ZW4gdmFsdWVzLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHggdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIKLSAgICAgICAgICogQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIKLSAgICAgICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlCi0gICAgICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICAgICAqIEBwYXJhbSB4CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIuCisgICAgICAgICAqIEBwYXJhbSB5CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIuCisgICAgICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHZvaWQgc2V0UmVjdChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB3aWR0aCwgZmxvYXQgaGVpZ2h0KSB7CiAgICAgICAgICAgICB0aGlzLnggPSB4OwpAQCAtMTQ2LDIzICsxNzUsMTkgQEAKIAogICAgICAgICAgICAgaWYgKHdpZHRoIDw9IDAuMGYpIHsKICAgICAgICAgICAgICAgICBjb2RlIHw9IE9VVF9MRUZUIHwgT1VUX1JJR0hUOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgaWYgKHB4IDwgeCkgewotICAgICAgICAgICAgICAgICAgICBjb2RlIHw9IE9VVF9MRUZUOwotICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICBpZiAocHggPiB4ICsgd2lkdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgfD0gT1VUX1JJR0hUOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHB4IDwgeCkgeworICAgICAgICAgICAgICAgIGNvZGUgfD0gT1VUX0xFRlQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHB4ID4geCArIHdpZHRoKSB7CisgICAgICAgICAgICAgICAgY29kZSB8PSBPVVRfUklHSFQ7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChoZWlnaHQgPD0gMC4wZikgewogICAgICAgICAgICAgICAgIGNvZGUgfD0gT1VUX1RPUCB8IE9VVF9CT1RUT007Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBpZiAocHkgPCB5KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGUgfD0gT1VUX1RPUDsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgaWYgKHB5ID4geSArIGhlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSB8PSBPVVRfQk9UVE9NOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHB5IDwgeSkgeworICAgICAgICAgICAgICAgIGNvZGUgfD0gT1VUX1RPUDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocHkgPiB5ICsgaGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgY29kZSB8PSBPVVRfQk9UVE9NOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXR1cm4gY29kZTsKICAgICAgICAgfQpAQCAtMTk4LDI5ICsyMjMsNDEgQEAKIAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIC8vIFRoZSBvdXRwdXQgZm9ybWF0IGJhc2VkIG9uIDEuNSByZWxlYXNlIGJlaGF2aW91ci4gSXQgY291bGQgYmUgb2J0YWluZWQgaW4gdGhlIGZvbGxvd2luZyB3YXkKKyAgICAgICAgICAgIC8vIFRoZSBvdXRwdXQgZm9ybWF0IGJhc2VkIG9uIDEuNSByZWxlYXNlIGJlaGF2aW91ci4gSXQgY291bGQgYmUKKyAgICAgICAgICAgIC8vIG9idGFpbmVkIGluIHRoZSBmb2xsb3dpbmcgd2F5CiAgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4obmV3IFJlY3RhbmdsZTJELkZsb2F0KCkudG9TdHJpbmcoKSkKLSAgICAgICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArICJbeD0iICsgeCArICIseT0iICsgeSArICIsd2lkdGg9IiArIHdpZHRoICsgIixoZWlnaHQ9IiArIGhlaWdodCArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCisgICAgICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiW3g9IiArIHggKyAiLHk9IiArIHkgKyAiLHdpZHRoPSIgKyB3aWR0aCArICIsaGVpZ2h0PSIgKyBoZWlnaHQgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhlIENsYXNzIERvdWJsZSBpcyB0aGUgc3ViY2xhc3Mgb2YgUmVjdGFuZ2xlMkQgdGhhdCByZXByZXNlbnRzIGEgCi0gICAgICogcmVjdGFuZ2xlIHdob3NlIGRhdGEgdmFsdWVzIGFyZSBnaXZlbiBhcyBkb3VibGVzICh3aXRoIGRvdWJsZS1wcmVjaXNpb24tbGV2ZWwKLSAgICAgKiBwcmVjaXNpb24pLgorICAgICAqIFRoZSBDbGFzcyBEb3VibGUgaXMgdGhlIHN1YmNsYXNzIG9mIFJlY3RhbmdsZTJEIHRoYXQgcmVwcmVzZW50cyBhCisgICAgICogcmVjdGFuZ2xlIHdob3NlIGRhdGEgdmFsdWVzIGFyZSBnaXZlbiBhcyBkb3VibGVzICh3aXRoCisgICAgICogZG91YmxlLXByZWNpc2lvbi1sZXZlbCBwcmVjaXNpb24pLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRG91YmxlIGV4dGVuZHMgUmVjdGFuZ2xlMkQgewogCi0gICAgICAgIC8qKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lci4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyLgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGRvdWJsZSB4OwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lci4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBkb3VibGUgeTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZG91YmxlIHdpZHRoOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGRvdWJsZSBoZWlnaHQ7CiAKICAgICAgICAgLyoqCkBAIC0yMzIsMTAgKzI2OSwxNCBAQAogICAgICAgICAvKioKICAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHJlY3RhbmdsZSB3aXRoIHRoZSBnaXZlbiBkb3VibGUgdmFsdWVzLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHggdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIKLSAgICAgICAgICogQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIKLSAgICAgICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlCi0gICAgICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICAgICAqIEBwYXJhbSB4CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIuCisgICAgICAgICAqIEBwYXJhbSB5CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIuCisgICAgICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIERvdWJsZShkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB3aWR0aCwgZG91YmxlIGhlaWdodCkgewogICAgICAgICAgICAgc2V0UmVjdCh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKQEAgLTI4OCwyMyArMzI5LDE5IEBACiAKICAgICAgICAgICAgIGlmICh3aWR0aCA8PSAwLjApIHsKICAgICAgICAgICAgICAgICBjb2RlIHw9IE9VVF9MRUZUIHwgT1VUX1JJR0hUOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgaWYgKHB4IDwgeCkgewotICAgICAgICAgICAgICAgICAgICBjb2RlIHw9IE9VVF9MRUZUOwotICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICBpZiAocHggPiB4ICsgd2lkdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgfD0gT1VUX1JJR0hUOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHB4IDwgeCkgeworICAgICAgICAgICAgICAgIGNvZGUgfD0gT1VUX0xFRlQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHB4ID4geCArIHdpZHRoKSB7CisgICAgICAgICAgICAgICAgY29kZSB8PSBPVVRfUklHSFQ7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChoZWlnaHQgPD0gMC4wKSB7CiAgICAgICAgICAgICAgICAgY29kZSB8PSBPVVRfVE9QIHwgT1VUX0JPVFRPTTsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIGlmIChweSA8IHkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29kZSB8PSBPVVRfVE9QOwotICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICBpZiAocHkgPiB5ICsgaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlIHw9IE9VVF9CT1RUT007Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAocHkgPCB5KSB7CisgICAgICAgICAgICAgICAgY29kZSB8PSBPVVRfVE9QOworICAgICAgICAgICAgfSBlbHNlIGlmIChweSA+IHkgKyBoZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBjb2RlIHw9IE9VVF9CT1RUT007CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybiBjb2RlOwogICAgICAgICB9CkBAIC0zMzAsNDUgKzM2Nyw2MCBAQAogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgLy8gVGhlIG91dHB1dCBmb3JtYXQgYmFzZWQgb24gMS41IHJlbGVhc2UgYmVoYXZpb3VyLiBJdCBjb3VsZCBiZSBvYnRhaW5lZCBpbiB0aGUgZm9sbG93aW5nIHdheQorICAgICAgICAgICAgLy8gVGhlIG91dHB1dCBmb3JtYXQgYmFzZWQgb24gMS41IHJlbGVhc2UgYmVoYXZpb3VyLiBJdCBjb3VsZCBiZQorICAgICAgICAgICAgLy8gb2J0YWluZWQgaW4gdGhlIGZvbGxvd2luZyB3YXkKICAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbihuZXcgUmVjdGFuZ2xlMkQuRG91YmxlKCkudG9TdHJpbmcoKSkKLSAgICAgICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArICJbeD0iICsgeCArICIseT0iICsgeSArICIsd2lkdGg9IiArIHdpZHRoICsgIixoZWlnaHQ9IiArIGhlaWdodCArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCisgICAgICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiW3g9IiArIHggKyAiLHk9IiArIHkgKyAiLHdpZHRoPSIgKyB3aWR0aCArICIsaGVpZ2h0PSIgKyBoZWlnaHQgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhlIENsYXNzIEl0ZXJhdG9yIHByb3ZpZGVzIAotICAgICAqIGFjY2VzcyB0byB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIFJlY3RhbmdsZTJEJ3MgYm91bmRhcnkgbW9kaWZpZWQgCi0gICAgICogYnkgYW4gQWZmaW5lVHJhbnNmb3JtLiAKKyAgICAgKiBUaGUgQ2xhc3MgSXRlcmF0b3IgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBjb29yZGluYXRlcyBvZiB0aGUKKyAgICAgKiBSZWN0YW5nbGUyRCdzIGJvdW5kYXJ5IG1vZGlmaWVkIGJ5IGFuIEFmZmluZVRyYW5zZm9ybS4KICAgICAgKi8KICAgICBjbGFzcyBJdGVyYXRvciBpbXBsZW1lbnRzIFBhdGhJdGVyYXRvciB7CiAKLSAgICAgICAgLyoqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyLiAqLwotICAgICAgICBkb3VibGUgeDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lci4gKi8KLSAgICAgICAgZG91YmxlIHk7Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlLiAqLwotICAgICAgICBkb3VibGUgd2lkdGg7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLiAqLwotICAgICAgICBkb3VibGUgaGVpZ2h0OwotICAgICAgICAgICAgICAgIAotICAgICAgICAvKiogVGhlIEFmZmluZVRyYW5zZm9ybSB0aGF0IGlzIHVzZWQgdG8gbW9kaWZ5IHRoZSBjb29yZGluYXRlcyAKLSAgICAgICAgICogdGhhdCBhcmUgcmV0dXJuZWQgYnkgdGhlIHBhdGggaXRlcmF0b3IuICovCi0gICAgICAgIEFmZmluZVRyYW5zZm9ybSB0OwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBjdXJyZW50IHNlZ21lbnQgaW5kZXguICovCi0gICAgICAgIGludCBpbmRleDsKLSAgICAgICAgCiAgICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFJlY3RhbmdsZTJELkl0ZXJhdG9yIGZvciBnaXZlbiByZWN0YW5nbGUgYW5kIHRyYW5zZm9ybWF0aW9uLgorICAgICAgICAgKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lci4KKyAgICAgICAgICovCisgICAgICAgIGRvdWJsZSB4OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lci4KKyAgICAgICAgICovCisgICAgICAgIGRvdWJsZSB5OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgICAgICovCisgICAgICAgIGRvdWJsZSB3aWR0aDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAgICAgKi8KKyAgICAgICAgZG91YmxlIGhlaWdodDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIEFmZmluZVRyYW5zZm9ybSB0aGF0IGlzIHVzZWQgdG8gbW9kaWZ5IHRoZSBjb29yZGluYXRlcyB0aGF0IGFyZQorICAgICAgICAgKiByZXR1cm5lZCBieSB0aGUgcGF0aCBpdGVyYXRvci4KKyAgICAgICAgICovCisgICAgICAgIEFmZmluZVRyYW5zZm9ybSB0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY3VycmVudCBzZWdtZW50IGluZGV4LgorICAgICAgICAgKi8KKyAgICAgICAgaW50IGluZGV4OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFJlY3RhbmdsZTJELkl0ZXJhdG9yIGZvciBnaXZlbiByZWN0YW5nbGUgYW5kCisgICAgICAgICAqIHRyYW5zZm9ybWF0aW9uLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHIgLSB0aGUgc291cmNlIFJlY3RhbmdsZTJEIG9iamVjdAotICAgICAgICAgKiBAcGFyYW0gYXQgLSB0aGUgQWZmaW5lVHJhbnNmb3JtIG9iamVjdCB0byBhcHBseSB0byB0aGUgY29vcmRpbmF0ZXMgCi0gICAgICAgICAqIGJlZm9yZSByZXR1cm5pbmcgdGhlbQorICAgICAgICAgKiBAcGFyYW0gcgorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgUmVjdGFuZ2xlMkQgb2JqZWN0LgorICAgICAgICAgKiBAcGFyYW0gYXQKKyAgICAgICAgICogICAgICAgICAgICB0aGUgQWZmaW5lVHJhbnNmb3JtIG9iamVjdCB0byBhcHBseSB0byB0aGUgY29vcmRpbmF0ZXMKKyAgICAgICAgICogICAgICAgICAgICBiZWZvcmUgcmV0dXJuaW5nIHRoZW0uCiAgICAgICAgICAqLwogICAgICAgICBJdGVyYXRvcihSZWN0YW5nbGUyRCByLCBBZmZpbmVUcmFuc2Zvcm0gYXQpIHsKICAgICAgICAgICAgIHRoaXMueCA9IHIuZ2V0WCgpOwpAQCAtNDA3LDIzICs0NTksMjMgQEAKICAgICAgICAgICAgICAgICBjb29yZHNbMV0gPSB5OwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICB0eXBlID0gU0VHX0xJTkVUTzsKLSAgICAgICAgICAgICAgICBzd2l0Y2goaW5kZXgpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIGNvb3Jkc1swXSA9IHggKyB3aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgY29vcmRzWzFdID0geTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICBjb29yZHNbMF0gPSB4ICsgd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIGNvb3Jkc1sxXSA9IHkgKyBoZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgICAgY29vcmRzWzBdID0geDsKLSAgICAgICAgICAgICAgICAgICAgY29vcmRzWzFdID0geSArIGhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgICAgICBjb29yZHNbMF0gPSB4OwotICAgICAgICAgICAgICAgICAgICBjb29yZHNbMV0gPSB5OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvb3Jkc1swXSA9IHggKyB3aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvb3Jkc1sxXSA9IHk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRzWzBdID0geCArIHdpZHRoOworICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRzWzFdID0geSArIGhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBjb29yZHNbMF0gPSB4OworICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRzWzFdID0geSArIGhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjb29yZHNbMF0gPSB4OworICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRzWzFdID0geTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICh0ICE9IG51bGwpIHsKQEAgLTQ0NiwyMyArNDk4LDIzIEBACiAgICAgICAgICAgICAgICAgdHlwZSA9IFNFR19NT1ZFVE87CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHR5cGUgPSBTRUdfTElORVRPOwotICAgICAgICAgICAgICAgIHN3aXRjaChpbmRleCkgewotICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgY29vcmRzWzBdID0gKGZsb2F0KSh4ICsgd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBjb29yZHNbMV0gPSAoZmxvYXQpeTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICBjb29yZHNbMF0gPSAoZmxvYXQpKHggKyB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvb3Jkc1sxXSA9IChmbG9hdCkoeSArIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgICAgY29vcmRzWzBdID0gKGZsb2F0KXg7Ci0gICAgICAgICAgICAgICAgICAgIGNvb3Jkc1sxXSA9IChmbG9hdCkoeSArIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgY29vcmRzWzBdID0gKGZsb2F0KXg7Ci0gICAgICAgICAgICAgICAgICAgIGNvb3Jkc1sxXSA9IChmbG9hdCl5OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvb3Jkc1swXSA9IChmbG9hdCkoeCArIHdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvb3Jkc1sxXSA9IChmbG9hdCl5OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvb3Jkc1swXSA9IChmbG9hdCkoeCArIHdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvb3Jkc1sxXSA9IChmbG9hdCkoeSArIGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRzWzBdID0gKGZsb2F0KXg7CisgICAgICAgICAgICAgICAgICAgICAgICBjb29yZHNbMV0gPSAoZmxvYXQpKHkgKyBoZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvb3Jkc1swXSA9IChmbG9hdCl4OworICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRzWzFdID0gKGZsb2F0KXk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAodCAhPSBudWxsKSB7CkBAIC00NzQsNyArNTI2LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgcmVjdGFuZ2xlMiBkLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBSZWN0YW5nbGUyRC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgUmVjdGFuZ2xlMkQoKSB7CiAgICAgfQpAQCAtNDgyLDU4ICs1MzQsNjQgQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSByZWN0YW5nbGUncyBsb2NhdGlvbiBhbmQgZGltZW5zaW9uLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyCi0gICAgICogQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIKLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUKLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lci4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UmVjdChkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB3aWR0aCwgZG91YmxlIGhlaWdodCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsb2NhdGlvbiBvZiB0aGUgcG9pbnQgd2l0aCByZXNwZWN0IHRvIHRoZSByZWN0YW5nbGUgYW5kIAotICAgICAqIHBhY2tzIHRoZSBpbmZvcm1hdGlvbiBpbnRvIGEgc2luZ2xlIGludCB1c2luZyB0aGUgYml0bWFza3MgCi0gICAgICoge0BsaW5rIFJlY3RhbmdsZTJEI09VVF9MRUZUfSwge0BsaW5rIFJlY3RhbmdsZTJEI09VVF9SSUdIVH0sIAotICAgICAqIHtAbGluayBSZWN0YW5nbGUyRCNPVVRfVE9QfSwgYW5kIHtAbGluayBSZWN0YW5nbGUyRCNPVVRfQk9UVE9NfS4KLSAgICAgKiBJZiB0aGUgcmVjdGFuZ2xlIGhhcyB6ZXJvIG9yIG5lZ2F0aXZlIHdpZHRoLCB0aGVuIGV2ZXJ5IHBvaW50Ci0gICAgICogaXMgcmVnYXJkZWQgYXMgYmVpbmcgYm90aCB0byB0aGUgbGVmdCBhbmQgdG8gdGhlIHJpZ2h0IG9mIHRoZQotICAgICAqIHJlY3RhbmdsZS4gU2ltaWxhcmx5LCBpZiB0aGUgaGVpZ2h0IGlzIHplcm8gb3IgbmVnYXRpdmUgdGhlbiAKLSAgICAgKiBhbGwgcG9pbnRzIGFyZSBjb25zaWRlcmVkIHRvIGJlIGJvdGggYm90aCBhYm92ZSBhbmQgYmVsb3cgaXQuCisgICAgICogR2V0cyB0aGUgbG9jYXRpb24gb2YgdGhlIHBvaW50IHdpdGggcmVzcGVjdCB0byB0aGUgcmVjdGFuZ2xlIGFuZCBwYWNrcworICAgICAqIHRoZSBpbmZvcm1hdGlvbiBpbnRvIGEgc2luZ2xlIGludGVnZXIgdXNpbmcgdGhlIGJpdG1hc2tzCisgICAgICoge0BsaW5rIFJlY3RhbmdsZTJEI09VVF9MRUZUfSwge0BsaW5rIFJlY3RhbmdsZTJEI09VVF9SSUdIVH0sCisgICAgICoge0BsaW5rIFJlY3RhbmdsZTJEI09VVF9UT1B9LCBhbmQge0BsaW5rIFJlY3RhbmdsZTJEI09VVF9CT1RUT019LiBJZiB0aGUKKyAgICAgKiByZWN0YW5nbGUgaGFzIHplcm8gb3IgbmVnYXRpdmUgd2lkdGgsIHRoZW4gZXZlcnkgcG9pbnQgaXMgcmVnYXJkZWQgYXMKKyAgICAgKiBiZWluZyBib3RoIHRvIHRoZSBsZWZ0IGFuZCB0byB0aGUgcmlnaHQgb2YgdGhlIHJlY3RhbmdsZS4gU2ltaWxhcmx5LCBpZgorICAgICAqIHRoZSBoZWlnaHQgaXMgemVybyBvciBuZWdhdGl2ZSB0aGVuIGFsbCBwb2ludHMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgYm90aAorICAgICAqIGJvdGggYWJvdmUgYW5kIGJlbG93IGl0LgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50IHRvIGNoZWNrCi0gICAgICogQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgdG8gY2hlY2sKLSAgICAgKiAKKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgdG8gY2hlY2suCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50IHRvIGNoZWNrLgogICAgICAqIEByZXR1cm4gdGhlIHBvaW50J3MgbG9jYXRpb24gd2l0aCByZXNwZWN0IHRvIHRoZSByZWN0YW5nbGUuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCBvdXRjb2RlKGRvdWJsZSB4LCBkb3VibGUgeSk7CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIG5ldyByZWN0YW5nbGUgdGhhdCBpcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoaXMgcmVjdGFuZ2xlCi0gICAgICogd2l0aCB0aGUgZ2l2ZW4gcmVjdGFuZ2xlLiBUaGUgcmVzdWx0aW5nIHJlY3RhbmdsZSBtYXkgYmUgZW1wdHkuIAotICAgICAqIFRoZSBkYXRhIG9mIHRoaXMgcmVjdGFuZ2xlIGlzIGxlZnQgdW5jaGFuZ2VkLgorICAgICAqIENyZWF0ZXMgYW4gbmV3IHJlY3RhbmdsZSB0aGF0IGlzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhpcyByZWN0YW5nbGUgd2l0aAorICAgICAqIHRoZSBnaXZlbiByZWN0YW5nbGUuIFRoZSByZXN1bHRpbmcgcmVjdGFuZ2xlIG1heSBiZSBlbXB0eS4gVGhlIGRhdGEgb2YKKyAgICAgKiB0aGlzIHJlY3RhbmdsZSBpcyBsZWZ0IHVuY2hhbmdlZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gciB0aGUgcmVjdGFuZ2xlIHRvIGludGVyc2VjdCB3aXRoIHRoaXMgcmVjdGFuZ2xlLgotICAgICAqIAorICAgICAqIEBwYXJhbSByCisgICAgICogICAgICAgICAgICB0aGUgcmVjdGFuZ2xlIHRvIGludGVyc2VjdCB3aXRoIHRoaXMgcmVjdGFuZ2xlLgogICAgICAqIEByZXR1cm4gdGhlIG5ldyByZWN0YW5nbGUgZ2l2ZW4gYnkgaW50ZXJzZWN0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBSZWN0YW5nbGUyRCBjcmVhdGVJbnRlcnNlY3Rpb24oUmVjdGFuZ2xlMkQgcik7CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIG5ldyByZWN0YW5nbGUgdGhhdCBpcyB0aGUgdW5pb24gb2YgdGhpcyByZWN0YW5nbGUKLSAgICAgKiB3aXRoIHRoZSBnaXZlbiByZWN0YW5nbGUuIFRoZSBuZXcgcmVjdGFuZ2xlIGlzIHRoZSBzbWFsbGVzdCAKLSAgICAgKiByZWN0YW5nbGUgd2hpY2ggY29udGFpbnMgYm90aCB0aGlzIHJlY3RhbmdsZSBhbmQgdGhlIHJlY3RhbmdsZQotICAgICAqIHNwZWNpZmllZCBhcyBhIHBhcmFtZXRlci4gVGhlIGRhdGEgb2YgdGhpcyByZWN0YW5nbGUgaXMgbGVmdCB1bmNoYW5nZWQuCisgICAgICogQ3JlYXRlcyBhbiBuZXcgcmVjdGFuZ2xlIHRoYXQgaXMgdGhlIHVuaW9uIG9mIHRoaXMgcmVjdGFuZ2xlIHdpdGggdGhlCisgICAgICogZ2l2ZW4gcmVjdGFuZ2xlLiBUaGUgbmV3IHJlY3RhbmdsZSBpcyB0aGUgc21hbGxlc3QgcmVjdGFuZ2xlIHdoaWNoCisgICAgICogY29udGFpbnMgYm90aCB0aGlzIHJlY3RhbmdsZSBhbmQgdGhlIHJlY3RhbmdsZSBzcGVjaWZpZWQgYXMgYSBwYXJhbWV0ZXIuCisgICAgICogVGhlIGRhdGEgb2YgdGhpcyByZWN0YW5nbGUgaXMgbGVmdCB1bmNoYW5nZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHIgdGhlIHJlY3RhbmdsZSB0byBjb21iaW5lIHdpdGggdGhpcyByZWN0YW5nbGUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgcmVjdGFuZ2xlIGdpdmVuIGJ5IHVuaW9uCisgICAgICogQHBhcmFtIHIKKyAgICAgKiAgICAgICAgICAgIHRoZSByZWN0YW5nbGUgdG8gY29tYmluZSB3aXRoIHRoaXMgcmVjdGFuZ2xlLgorICAgICAqIEByZXR1cm4gdGhlIG5ldyByZWN0YW5nbGUgZ2l2ZW4gYnkgdW5pb24uCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFJlY3RhbmdsZTJEIGNyZWF0ZVVuaW9uKFJlY3RhbmdsZTJEIHIpOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGF0YSBvZiB0aGlzIHJlY3RhbmdsZSB0byBtYXRjaCB0aGUgZGF0YSBvZiB0aGUgZ2l2ZW4gCi0gICAgICogcmVjdGFuZ2xlLgorICAgICAqIFNldHMgdGhlIGRhdGEgb2YgdGhpcyByZWN0YW5nbGUgdG8gbWF0Y2ggdGhlIGRhdGEgb2YgdGhlIGdpdmVuIHJlY3RhbmdsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gciB0aGUgcmVjdGFuZ2xlIHdob3NlIGRhdGEgaXMgdG8gYmUgY29waWVkIGludG8gdGhpcyByZWN0YW5nbGUncyBmaWVsZHMuCisgICAgICogQHBhcmFtIHIKKyAgICAgKiAgICAgICAgICAgIHRoZSByZWN0YW5nbGUgd2hvc2UgZGF0YSBpcyB0byBiZSBjb3BpZWQgaW50byB0aGlzIHJlY3RhbmdsZSdzCisgICAgICogICAgICAgICAgICBmaWVsZHMuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UmVjdChSZWN0YW5nbGUyRCByKSB7CiAgICAgICAgIHNldFJlY3Qoci5nZXRYKCksIHIuZ2V0WSgpLCByLmdldFdpZHRoKCksIHIuZ2V0SGVpZ2h0KCkpOwpAQCAtNTQ5LDYxICs2MDcsNjMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW55IHBhcnQgb2YgdGhlIGxpbmUgc2VnbWVudCAgYmV0d2VlbiAoYW5kIGluY2x1ZGluZykgCi0gICAgICogdGhlIHR3byBnaXZlbiBwb2ludHMgdG91Y2hlcyBhbnkgCi0gICAgICogcGFydCBvZiB0aGUgcmVjdGFuZ2xlLCBpbmNsdWRpbmcgaXRzIGJvdW5kYXJ5LgorICAgICAqIERldGVybWluZXMgd2hldGhlciBhbnkgcGFydCBvZiB0aGUgbGluZSBzZWdtZW50IGJldHdlZW4gKGFuZCBpbmNsdWRpbmcpCisgICAgICogdGhlIHR3byBnaXZlbiBwb2ludHMgdG91Y2hlcyBhbnkgcGFydCBvZiB0aGUgcmVjdGFuZ2xlLCBpbmNsdWRpbmcgaXRzCisgICAgICogYm91bmRhcnkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHgxIHRoZSB4IGNvb3JkaW5hdGUgb2Ygb25lIG9mIHRoZSBwb2ludHMgdGhhdCBkZXRlcm1pbmVzIHRoZSAKLSAgICAgKiBsaW5lIHNlZ21lbnQgdG8gdGVzdAotICAgICAqIEBwYXJhbSB5MSB0aGUgeSBjb29yZGluYXRlIG9mIG9uZSBvZiB0aGUgcG9pbnRzIHRoYXQgZGV0ZXJtaW5lcyB0aGUgCi0gICAgICogbGluZSBzZWdtZW50IHRvIHRlc3QKLSAgICAgKiBAcGFyYW0geDIgdGhlIHggY29vcmRpbmF0ZSBvZiBvbmUgb2YgdGhlIHBvaW50cyB0aGF0IGRldGVybWluZXMgdGhlIAotICAgICAqIGxpbmUgc2VnbWVudCB0byB0ZXN0Ci0gICAgICogQHBhcmFtIHkyIHRoZSB5IGNvb3JkaW5hdGUgb2Ygb25lIG9mIHRoZSBwb2ludHMgdGhhdCBkZXRlcm1pbmVzIHRoZSAKLSAgICAgKiBsaW5lIHNlZ21lbnQgdG8gdGVzdAotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgYXQgbGVhc3Qgb25lIHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQgYmV0d2VlbiB0aGUgCi0gICAgICogdHdvIHBvaW50cyBtYXRjaGVzIGFueSBwb2ludCBvZiB0aGUgaW50ZXJpb3Igb2YgdGhlIHJlY3RhbmdsZSBvciB0aGUKLSAgICAgKiByZWN0YW5nbGUncyBib3VuZGFyeS4KKyAgICAgKiBAcGFyYW0geDEKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2Ygb25lIG9mIHRoZSBwb2ludHMgdGhhdCBkZXRlcm1pbmVzIHRoZSBsaW5lCisgICAgICogICAgICAgICAgICBzZWdtZW50IHRvIHRlc3QuCisgICAgICogQHBhcmFtIHkxCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIG9uZSBvZiB0aGUgcG9pbnRzIHRoYXQgZGV0ZXJtaW5lcyB0aGUgbGluZQorICAgICAqICAgICAgICAgICAgc2VnbWVudCB0byB0ZXN0LgorICAgICAqIEBwYXJhbSB4MgorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiBvbmUgb2YgdGhlIHBvaW50cyB0aGF0IGRldGVybWluZXMgdGhlIGxpbmUKKyAgICAgKiAgICAgICAgICAgIHNlZ21lbnQgdG8gdGVzdC4KKyAgICAgKiBAcGFyYW0geTIKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2Ygb25lIG9mIHRoZSBwb2ludHMgdGhhdCBkZXRlcm1pbmVzIHRoZSBsaW5lCisgICAgICogICAgICAgICAgICBzZWdtZW50IHRvIHRlc3QuCisgICAgICogQHJldHVybiB0cnVlLCBpZiBhdCBsZWFzdCBvbmUgcG9pbnQgb2YgdGhlIGxpbmUgc2VnbWVudCBiZXR3ZWVuIHRoZSB0d28KKyAgICAgKiAgICAgICAgIHBvaW50cyBtYXRjaGVzIGFueSBwb2ludCBvZiB0aGUgaW50ZXJpb3Igb2YgdGhlIHJlY3RhbmdsZSBvciB0aGUKKyAgICAgKiAgICAgICAgIHJlY3RhbmdsZSdzIGJvdW5kYXJ5LgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGludGVyc2VjdHNMaW5lKGRvdWJsZSB4MSwgZG91YmxlIHkxLCBkb3VibGUgeDIsIGRvdWJsZSB5MikgewogICAgICAgICBkb3VibGUgcngxID0gZ2V0WCgpOwogICAgICAgICBkb3VibGUgcnkxID0gZ2V0WSgpOwogICAgICAgICBkb3VibGUgcngyID0gcngxICsgZ2V0V2lkdGgoKTsKICAgICAgICAgZG91YmxlIHJ5MiA9IHJ5MSArIGdldEhlaWdodCgpOwotICAgICAgICByZXR1cm4KLSAgICAgICAgICAgIChyeDEgPD0geDEgJiYgeDEgPD0gcngyICYmIHJ5MSA8PSB5MSAmJiB5MSA8PSByeTIpIHx8Ci0gICAgICAgICAgICAocngxIDw9IHgyICYmIHgyIDw9IHJ4MiAmJiByeTEgPD0geTIgJiYgeTIgPD0gcnkyKSB8fAotICAgICAgICAgICAgTGluZTJELmxpbmVzSW50ZXJzZWN0KHJ4MSwgcnkxLCByeDIsIHJ5MiwgeDEsIHkxLCB4MiwgeTIpIHx8Ci0gICAgICAgICAgICBMaW5lMkQubGluZXNJbnRlcnNlY3QocngyLCByeTEsIHJ4MSwgcnkyLCB4MSwgeTEsIHgyLCB5Mik7CisgICAgICAgIHJldHVybiAocngxIDw9IHgxICYmIHgxIDw9IHJ4MiAmJiByeTEgPD0geTEgJiYgeTEgPD0gcnkyKQorICAgICAgICAgICAgICAgIHx8IChyeDEgPD0geDIgJiYgeDIgPD0gcngyICYmIHJ5MSA8PSB5MiAmJiB5MiA8PSByeTIpCisgICAgICAgICAgICAgICAgfHwgTGluZTJELmxpbmVzSW50ZXJzZWN0KHJ4MSwgcnkxLCByeDIsIHJ5MiwgeDEsIHkxLCB4MiwgeTIpCisgICAgICAgICAgICAgICAgfHwgTGluZTJELmxpbmVzSW50ZXJzZWN0KHJ4MiwgcnkxLCByeDEsIHJ5MiwgeDEsIHkxLCB4MiwgeTIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIERldGVybWluZXMgd2hldGhlciBhbnkgcGFydCBvZiB0aGUgc3BlY2lmaWVkIGxpbmUgc2VnbWVudCB0b3VjaGVzIGFueSAKKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW55IHBhcnQgb2YgdGhlIHNwZWNpZmllZCBsaW5lIHNlZ21lbnQgdG91Y2hlcyBhbnkKICAgICAgKiBwYXJ0IG9mIHRoZSByZWN0YW5nbGUsIGluY2x1ZGluZyBpdHMgYm91bmRhcnkuCiAgICAgICogCi0gICAgICogQHBhcmFtIGwgdGhlIGxpbmUgc2VnbWVudCB0byB0ZXN0Ci0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiBhdCBsZWFzdCBvbmUgcG9pbnQgb2YgdGhlIGdpdmVuIGxpbmUgc2VnbWVudCAKLSAgICAgKiBtYXRjaGVzIGFueSBwb2ludCBvZiB0aGUgaW50ZXJpb3Igb2YgdGhlIHJlY3RhbmdsZSBvciB0aGUKLSAgICAgKiByZWN0YW5nbGUncyBib3VuZGFyeS4KKyAgICAgKiBAcGFyYW0gbAorICAgICAqICAgICAgICAgICAgdGhlIGxpbmUgc2VnbWVudCB0byB0ZXN0LgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgYXQgbGVhc3Qgb25lIHBvaW50IG9mIHRoZSBnaXZlbiBsaW5lIHNlZ21lbnQgbWF0Y2hlcyBhbnkKKyAgICAgKiAgICAgICAgIHBvaW50IG9mIHRoZSBpbnRlcmlvciBvZiB0aGUgcmVjdGFuZ2xlIG9yIHRoZSByZWN0YW5nbGUncworICAgICAqICAgICAgICAgYm91bmRhcnkuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaW50ZXJzZWN0c0xpbmUoTGluZTJEIGwpIHsKICAgICAgICAgcmV0dXJuIGludGVyc2VjdHNMaW5lKGwuZ2V0WDEoKSwgbC5nZXRZMSgpLCBsLmdldFgyKCksIGwuZ2V0WTIoKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgbG9jYXRpb24gb2YgdGhlIHBvaW50IHdpdGggcmVzcGVjdCB0byB0aGUgcmVjdGFuZ2xlIGFuZCAKLSAgICAgKiBwYWNrcyB0aGUgaW5mb3JtYXRpb24gaW50byBhIHNpbmdsZSBpbnQgdXNpbmcgdGhlIGJpdG1hc2tzIAotICAgICAqIHtAbGluayBSZWN0YW5nbGUyRCNPVVRfTEVGVH0sIHtAbGluayBSZWN0YW5nbGUyRCNPVVRfUklHSFR9LCAKLSAgICAgKiB7QGxpbmsgUmVjdGFuZ2xlMkQjT1VUX1RPUH0sIGFuZCB7QGxpbmsgUmVjdGFuZ2xlMkQjT1VUX0JPVFRPTX0uCi0gICAgICogSWYgdGhlIHJlY3RhbmdsZSBoYXMgemVybyBvciBuZWdhdGl2ZSB3aWR0aCwgdGhlbiBldmVyeSBwb2ludAotICAgICAqIGlzIHJlZ2FyZGVkIGFzIGJlaW5nIGJvdGggdG8gdGhlIGxlZnQgYW5kIHRvIHRoZSByaWdodCBvZiB0aGUKLSAgICAgKiByZWN0YW5nbGUuIFNpbWlsYXJseSwgaWYgdGhlIGhlaWdodCBpcyB6ZXJvIG9yIG5lZ2F0aXZlIHRoZW4gCi0gICAgICogYWxsIHBvaW50cyBhcmUgY29uc2lkZXJlZCB0byBiZSBib3RoIGJvdGggYWJvdmUgYW5kIGJlbG93IGl0LgorICAgICAqIEdldHMgdGhlIGxvY2F0aW9uIG9mIHRoZSBwb2ludCB3aXRoIHJlc3BlY3QgdG8gdGhlIHJlY3RhbmdsZSBhbmQgcGFja3MKKyAgICAgKiB0aGUgaW5mb3JtYXRpb24gaW50byBhIHNpbmdsZSBpbnRlZ2VyIHVzaW5nIHRoZSBiaXRtYXNrcworICAgICAqIHtAbGluayBSZWN0YW5nbGUyRCNPVVRfTEVGVH0sIHtAbGluayBSZWN0YW5nbGUyRCNPVVRfUklHSFR9LAorICAgICAqIHtAbGluayBSZWN0YW5nbGUyRCNPVVRfVE9QfSwgYW5kIHtAbGluayBSZWN0YW5nbGUyRCNPVVRfQk9UVE9NfS4gSWYgdGhlCisgICAgICogcmVjdGFuZ2xlIGhhcyB6ZXJvIG9yIG5lZ2F0aXZlIHdpZHRoLCB0aGVuIGV2ZXJ5IHBvaW50IGlzIHJlZ2FyZGVkIGFzCisgICAgICogYmVpbmcgYm90aCB0byB0aGUgbGVmdCBhbmQgdG8gdGhlIHJpZ2h0IG9mIHRoZSByZWN0YW5nbGUuIFNpbWlsYXJseSwgaWYKKyAgICAgKiB0aGUgaGVpZ2h0IGlzIHplcm8gb3IgbmVnYXRpdmUgdGhlbiBhbGwgcG9pbnRzIGFyZSBjb25zaWRlcmVkIHRvIGJlIGJvdGgKKyAgICAgKiBib3RoIGFib3ZlIGFuZCBiZWxvdyBpdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcCB0aGUgcG9pbnQgdG8gY2hlY2sKLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gcAorICAgICAqICAgICAgICAgICAgdGhlIHBvaW50IHRvIGNoZWNrLgogICAgICAqIEByZXR1cm4gdGhlIHBvaW50J3MgbG9jYXRpb24gd2l0aCByZXNwZWN0IHRvIHRoZSByZWN0YW5nbGUuCiAgICAgICovCiAgICAgcHVibGljIGludCBvdXRjb2RlKFBvaW50MkQgcCkgewpAQCAtNjIwLDkgKzY4MCw3IEBACiAgICAgICAgIGRvdWJsZSB4MiA9IHgxICsgZ2V0V2lkdGgoKTsKICAgICAgICAgZG91YmxlIHkyID0geTEgKyBnZXRIZWlnaHQoKTsKIAotICAgICAgICByZXR1cm4KLSAgICAgICAgICAgIHgxIDw9IHggJiYgeCA8IHgyICYmCi0gICAgICAgICAgICB5MSA8PSB5ICYmIHkgPCB5MjsKKyAgICAgICAgcmV0dXJuIHgxIDw9IHggJiYgeCA8IHgyICYmIHkxIDw9IHkgJiYgeSA8IHkyOwogICAgIH0KIAogICAgIHB1YmxpYyBib29sZWFuIGludGVyc2VjdHMoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgd2lkdGgsIGRvdWJsZSBoZWlnaHQpIHsKQEAgLTYzNSw5ICs2OTMsNyBAQAogICAgICAgICBkb3VibGUgeDIgPSB4MSArIGdldFdpZHRoKCk7CiAgICAgICAgIGRvdWJsZSB5MiA9IHkxICsgZ2V0SGVpZ2h0KCk7CiAKLSAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICB4ICsgd2lkdGggPiB4MSAmJiB4IDwgeDIgJiYKLSAgICAgICAgICAgIHkgKyBoZWlnaHQgPiB5MSAmJiB5IDwgeTI7CisgICAgICAgIHJldHVybiB4ICsgd2lkdGggPiB4MSAmJiB4IDwgeDIgJiYgeSArIGhlaWdodCA+IHkxICYmIHkgPCB5MjsKICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB3aWR0aCwgZG91YmxlIGhlaWdodCkgewpAQCAtNjUwLDE5ICs3MDYsMjEgQEAKICAgICAgICAgZG91YmxlIHgyID0geDEgKyBnZXRXaWR0aCgpOwogICAgICAgICBkb3VibGUgeTIgPSB5MSArIGdldEhlaWdodCgpOwogCi0gICAgICAgIHJldHVybgotICAgICAgICAgICAgeDEgPD0geCAmJiB4ICsgd2lkdGggPD0geDIgJiYKLSAgICAgICAgICAgIHkxIDw9IHkgJiYgeSArIGhlaWdodCA8PSB5MjsKKyAgICAgICAgcmV0dXJuIHgxIDw9IHggJiYgeCArIHdpZHRoIDw9IHgyICYmIHkxIDw9IHkgJiYgeSArIGhlaWdodCA8PSB5MjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGFuZ2VzIHRoZSBkYXRhIHZhbHVlcyBvZiB0aGUgZGVzdGluYXRpb24gcmVjdGFuZ2xlIHRvIG1hdGNoIAotICAgICAqIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIHR3byBzb3VyY2UgcmVjdGFuZ2xlcywgbGVhdmluZyB0aGUgCi0gICAgICogdHdvIHNvdXJjZSByZWN0YW5nbGVzIHVuY2hhbmdlZC4gVGhlIHJlc3VsdGluZyByZWN0YW5nbGUgbWF5IGJlIGVtcHR5LiAKKyAgICAgKiBDaGFuZ2VzIHRoZSBkYXRhIHZhbHVlcyBvZiB0aGUgZGVzdGluYXRpb24gcmVjdGFuZ2xlIHRvIG1hdGNoIHRoZQorICAgICAqIGludGVyc2VjdGlvbiBvZiB0aGUgdHdvIHNvdXJjZSByZWN0YW5nbGVzLCBsZWF2aW5nIHRoZSB0d28gc291cmNlCisgICAgICogcmVjdGFuZ2xlcyB1bmNoYW5nZWQuIFRoZSByZXN1bHRpbmcgcmVjdGFuZ2xlIG1heSBiZSBlbXB0eS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3JjMSBvbmUgb2YgdGhlIHR3byBzb3VyY2UgcmVjdGFuZ2xlcyBnaXZpbmcgdGhlIGRhdGEgdG8gaW50ZXJzZWN0Ci0gICAgICogQHBhcmFtIHNyYzIgb25lIG9mIHRoZSB0d28gc291cmNlIHJlY3RhbmdsZXMgZ2l2aW5nIHRoZSBkYXRhIHRvIGludGVyc2VjdAotICAgICAqIEBwYXJhbSBkc3QgdGhlIGRlc3RpbmF0aW9uIG9iamVjdCB3aGVyZSB0aGUgZGF0YSBvZiB0aGUgaW50ZXJzZWN0aW9uIGlzIHdyaXR0ZW4KKyAgICAgKiBAcGFyYW0gc3JjMQorICAgICAqICAgICAgICAgICAgb25lIG9mIHRoZSB0d28gc291cmNlIHJlY3RhbmdsZXMgZ2l2aW5nIHRoZSBkYXRhIHRvIGludGVyc2VjdC4KKyAgICAgKiBAcGFyYW0gc3JjMgorICAgICAqICAgICAgICAgICAgb25lIG9mIHRoZSB0d28gc291cmNlIHJlY3RhbmdsZXMgZ2l2aW5nIHRoZSBkYXRhIHRvIGludGVyc2VjdC4KKyAgICAgKiBAcGFyYW0gZHN0CisgICAgICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gb2JqZWN0IHdoZXJlIHRoZSBkYXRhIG9mIHRoZSBpbnRlcnNlY3Rpb24gaXMKKyAgICAgKiAgICAgICAgICAgIHdyaXR0ZW4uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGludGVyc2VjdChSZWN0YW5nbGUyRCBzcmMxLCBSZWN0YW5nbGUyRCBzcmMyLCBSZWN0YW5nbGUyRCBkc3QpIHsKICAgICAgICAgZG91YmxlIHgxID0gTWF0aC5tYXgoc3JjMS5nZXRNaW5YKCksIHNyYzIuZ2V0TWluWCgpKTsKQEAgLTY3MywxNCArNzMxLDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hhbmdlcyB0aGUgZGF0YSB2YWx1ZXMgb2YgdGhlIGRlc3RpbmF0aW9uIHJlY3RhbmdsZSB0byBtYXRjaCAKLSAgICAgKiB0aGUgdW5pb24gb2YgdGhlIHR3byBzb3VyY2UgcmVjdGFuZ2xlcywgbGVhdmluZyB0aGUgCi0gICAgICogdHdvIHNvdXJjZSByZWN0YW5nbGVzIHVuY2hhbmdlZC4gVGhlIHVuaW9uIGlzIHRoZSBzbWFsbGVzdCByZWN0YW5nbGUKLSAgICAgKiB0aGEgY29tcGxldGVseSBjb3ZlcnMgdGhlIHR3byBzb3VyY2UgcmVjdGFuZ2xlcy4gCisgICAgICogQ2hhbmdlcyB0aGUgZGF0YSB2YWx1ZXMgb2YgdGhlIGRlc3RpbmF0aW9uIHJlY3RhbmdsZSB0byBtYXRjaCB0aGUgdW5pb24KKyAgICAgKiBvZiB0aGUgdHdvIHNvdXJjZSByZWN0YW5nbGVzLCBsZWF2aW5nIHRoZSB0d28gc291cmNlIHJlY3RhbmdsZXMKKyAgICAgKiB1bmNoYW5nZWQuIFRoZSB1bmlvbiBpcyB0aGUgc21hbGxlc3QgcmVjdGFuZ2xlIHRoYXQgY29tcGxldGVseSBjb3ZlcnMgdGhlCisgICAgICogdHdvIHNvdXJjZSByZWN0YW5nbGVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzcmMxIG9uZSBvZiB0aGUgdHdvIHNvdXJjZSByZWN0YW5nbGVzIGdpdmluZyB0aGUgZGF0YQotICAgICAqIEBwYXJhbSBzcmMyIG9uZSBvZiB0aGUgdHdvIHNvdXJjZSByZWN0YW5nbGVzIGdpdmluZyB0aGUgZGF0YQotICAgICAqIEBwYXJhbSBkc3QgdGhlIGRlc3RpbmF0aW9uIG9iamVjdCB3aGVyZSB0aGUgZGF0YSBvZiB0aGUgdW5pb24gaXMgd3JpdHRlbgorICAgICAqIEBwYXJhbSBzcmMxCisgICAgICogICAgICAgICAgICBvbmUgb2YgdGhlIHR3byBzb3VyY2UgcmVjdGFuZ2xlcyBnaXZpbmcgdGhlIGRhdGEuCisgICAgICogQHBhcmFtIHNyYzIKKyAgICAgKiAgICAgICAgICAgIG9uZSBvZiB0aGUgdHdvIHNvdXJjZSByZWN0YW5nbGVzIGdpdmluZyB0aGUgZGF0YS4KKyAgICAgKiBAcGFyYW0gZHN0CisgICAgICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gb2JqZWN0IHdoZXJlIHRoZSBkYXRhIG9mIHRoZSB1bmlvbiBpcyB3cml0dGVuLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1bmlvbihSZWN0YW5nbGUyRCBzcmMxLCBSZWN0YW5nbGUyRCBzcmMyLCBSZWN0YW5nbGUyRCBkc3QpIHsKICAgICAgICAgZG91YmxlIHgxID0gTWF0aC5taW4oc3JjMS5nZXRNaW5YKCksIHNyYzIuZ2V0TWluWCgpKTsKQEAgLTY5Myw4ICs3NTQsMTIgQEAKICAgICAvKioKICAgICAgKiBFbmxhcmdlcyB0aGUgcmVjdGFuZ2xlIHNvIHRoYXQgaXQgaW5jbHVkZXMgdGhlIGdpdmVuIHBvaW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIG5ldyBwb2ludCB0byBiZSBjb3ZlcmVkIGJ5IHRoZSByZWN0YW5nbGUKLSAgICAgKiBAcGFyYW0geSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBuZXcgcG9pbnQgdG8gYmUgY292ZXJlZCBieSB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIG5ldyBwb2ludCB0byBiZSBjb3ZlcmVkIGJ5IHRoZQorICAgICAqICAgICAgICAgICAgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBuZXcgcG9pbnQgdG8gYmUgY292ZXJlZCBieSB0aGUKKyAgICAgKiAgICAgICAgICAgIHJlY3RhbmdsZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGQoZG91YmxlIHgsIGRvdWJsZSB5KSB7CiAgICAgICAgIGRvdWJsZSB4MSA9IE1hdGgubWluKGdldE1pblgoKSwgeCk7CkBAIC03MDcsNyArNzcyLDggQEAKICAgICAvKioKICAgICAgKiBFbmxhcmdlcyB0aGUgcmVjdGFuZ2xlIHNvIHRoYXQgaXQgaW5jbHVkZXMgdGhlIGdpdmVuIHBvaW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBwIHRoZSBuZXcgcG9pbnQgdG8gYmUgY292ZXJlZCBieSB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIHAKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgcG9pbnQgdG8gYmUgY292ZXJlZCBieSB0aGUgcmVjdGFuZ2xlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZChQb2ludDJEIHApIHsKICAgICAgICAgYWRkKHAuZ2V0WCgpLCBwLmdldFkoKSk7CkBAIC03MTYsNyArNzgyLDggQEAKICAgICAvKioKICAgICAgKiBFbmxhcmdlcyB0aGUgcmVjdGFuZ2xlIHNvIHRoYXQgaXQgY292ZXJzIHRoZSBnaXZlbiByZWN0YW5nbGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHIgdGhlIG5ldyByZWN0YW5nbGUgdG8gYmUgY292ZXJlZCBieSB0aGlzIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSByCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHJlY3RhbmdsZSB0byBiZSBjb3ZlcmVkIGJ5IHRoaXMgcmVjdGFuZ2xlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZChSZWN0YW5nbGUyRCByKSB7CiAgICAgICAgIHVuaW9uKHRoaXMsIHIsIHRoaXMpOwpAQCAtNzQ4LDE0ICs4MTUsMTAgQEAKICAgICAgICAgfQogICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgUmVjdGFuZ2xlMkQpIHsKICAgICAgICAgICAgIFJlY3RhbmdsZTJEIHIgPSAoUmVjdGFuZ2xlMkQpb2JqOwotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgZ2V0WCgpID09IHIuZ2V0WCgpICYmCi0gICAgICAgICAgICAgICAgZ2V0WSgpID09IHIuZ2V0WSgpICYmCi0gICAgICAgICAgICAgICAgZ2V0V2lkdGgoKSA9PSByLmdldFdpZHRoKCkgJiYKLSAgICAgICAgICAgICAgICBnZXRIZWlnaHQoKSA9PSByLmdldEhlaWdodCgpOworICAgICAgICAgICAgcmV0dXJuIGdldFgoKSA9PSByLmdldFgoKSAmJiBnZXRZKCkgPT0gci5nZXRZKCkgJiYgZ2V0V2lkdGgoKSA9PSByLmdldFdpZHRoKCkKKyAgICAgICAgICAgICAgICAgICAgJiYgZ2V0SGVpZ2h0KCkgPT0gci5nZXRIZWlnaHQoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9nZW9tL1JlY3Rhbmd1bGFyU2hhcGUuamF2YSBiL2F3dC9qYXZhL2F3dC9nZW9tL1JlY3Rhbmd1bGFyU2hhcGUuamF2YQppbmRleCAwYTc3ZGZkLi4wYjBkMDVjIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZ2VvbS9SZWN0YW5ndWxhclNoYXBlLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2dlb20vUmVjdGFuZ3VsYXJTaGFwZS5qYXZhCkBAIC0xOCwxNyArMTgsMTkgQEAKICAqIEBhdXRob3IgRGVuaXMgTS4gS2lzaGVua28KICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0Lmdlb207CiAKIGltcG9ydCBqYXZhLmF3dC5SZWN0YW5nbGU7CiBpbXBvcnQgamF2YS5hd3QuU2hhcGU7CiAKIC8qKgotICogVGhlIENsYXNzIFJlY3Rhbmd1bGFyU2hhcGUgcmVwcmVzZW50cyBhIFNoYXBlIHdob3NlIGRhdGEgaXMgCi0gKiAoYXQgbGVhc3QgcGFydGlhbGx5KSBkZXNjcmliZWQgYnkgYSByZWN0YW5ndWxhciBmcmFtZS4gVGhpcyBpbmNsdWRlcyAKLSAqIHNoYXBlcyB3aGljaCBhcmUgb2J2aW91c2x5IHJlY3Rhbmd1bGFyIChzdWNoIGFzIFJlY3RhbmdsZTJEKSBhcyB3ZWxsIGFzCi0gKiBzaGFwZXMgbGlrZSBBcmMyRCB3aGljaCBhcmUgbGFyZ2VseSBkZXRlcm1pbmVkIGJ5IHRoZSByZWN0YW5nbGUgdGhleSAKLSAqIGZpdCBpbnNpZGUuCisgKiBUaGUgQ2xhc3MgUmVjdGFuZ3VsYXJTaGFwZSByZXByZXNlbnRzIGEgU2hhcGUgd2hvc2UgZGF0YSBpcyAoYXQgbGVhc3QKKyAqIHBhcnRpYWxseSkgZGVzY3JpYmVkIGJ5IGEgcmVjdGFuZ3VsYXIgZnJhbWUuIFRoaXMgaW5jbHVkZXMgc2hhcGVzIHdoaWNoIGFyZQorICogb2J2aW91c2x5IHJlY3Rhbmd1bGFyIChzdWNoIGFzIFJlY3RhbmdsZTJEKSBhcyB3ZWxsIGFzIHNoYXBlcyBsaWtlIEFyYzJECisgKiB3aGljaCBhcmUgbGFyZ2VseSBkZXRlcm1pbmVkIGJ5IHRoZSByZWN0YW5nbGUgdGhleSBmaXQgaW5zaWRlLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFJlY3Rhbmd1bGFyU2hhcGUgaW1wbGVtZW50cyBTaGFwZSwgQ2xvbmVhYmxlIHsKIApAQCAtNjcsMjUgKzY5LDMwIEBACiAgICAgcHVibGljIGFic3RyYWN0IGRvdWJsZSBnZXRIZWlnaHQoKTsKIAogICAgIC8qKgotICAgICAqIENoZWNrcyBpZiB0aGlzIGlzIGFuIGVtcHR5IHJlY3RhbmdsZTogb25lIHdpdGggemVybyBhcyBpdHMgd2lkdGggb3IgaGVpZ2h0LgorICAgICAqIENoZWNrcyBpZiB0aGlzIGlzIGFuIGVtcHR5IHJlY3RhbmdsZTogb25lIHdpdGggemVybyBhcyBpdHMgd2lkdGggb3IKKyAgICAgKiBoZWlnaHQuCiAgICAgICogCiAgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgd2lkdGggb3IgaGVpZ2h0IGlzIGVtcHR5LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRW1wdHkoKTsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRhdGEgZm9yIHRoZSBib3VuZGluZyByZWN0YW5nbGUgaW4gdGVybXMgb2YgZG91YmxlIHZhbHVlcy4gCisgICAgICogU2V0cyB0aGUgZGF0YSBmb3IgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBpbiB0ZXJtcyBvZiBkb3VibGUgdmFsdWVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RnJhbWUoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgdywgZG91YmxlIGgpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWluaW11bSB4IHZhbHVlIG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUgKHRoZSB4IAotICAgICAqIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGUpLgorICAgICAqIEdldHMgdGhlIG1pbmltdW0geCB2YWx1ZSBvZiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlICh0aGUgeCBjb29yZGluYXRlIG9mCisgICAgICogdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGUpLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIG1pbmltdW0geCB2YWx1ZSBvZiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlLgogICAgICAqLwpAQCAtOTQsOCArMTAxLDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtaW5pbXVtIHkgdmFsdWUgb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSAodGhlIHkgCi0gICAgICogY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZSkuCisgICAgICogR2V0cyB0aGUgbWluaW11bSB5IHZhbHVlIG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUgKHRoZSB5IGNvb3JkaW5hdGUgb2YKKyAgICAgKiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZSkuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgbWluaW11bSB5IHZhbHVlIG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUuCiAgICAgICovCkBAIC0xMDQsOSArMTExLDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtYXhpbXVtIHggdmFsdWUgb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSAodGhlIHgKLSAgICAgKiBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlIHBsdXMgdGhlIAotICAgICAqIHJlY3RhbmdsZSdzIHdpZHRoKS4KKyAgICAgKiBHZXRzIHRoZSBtYXhpbXVtIHggdmFsdWUgb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSAodGhlIHggY29vcmRpbmF0ZSBvZgorICAgICAqIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlIHBsdXMgdGhlIHJlY3RhbmdsZSdzIHdpZHRoKS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIHggdmFsdWUgb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZS4KICAgICAgKi8KQEAgLTExNSw5ICsxMjEsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1heGltdW0geSB2YWx1ZSBvZiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlICh0aGUgeQotICAgICAqIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGUgcGx1cyB0aGUgCi0gICAgICogcmVjdGFuZ2xlJ3MgaGVpZ2h0KS4KKyAgICAgKiBHZXRzIHRoZSBtYXhpbXVtIHkgdmFsdWUgb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSAodGhlIHkgY29vcmRpbmF0ZSBvZgorICAgICAqIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlIHBsdXMgdGhlIHJlY3RhbmdsZSdzIGhlaWdodCkuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgbWF4aW11bSB5IHZhbHVlIG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUuCiAgICAgICovCkBAIC0xNDQsOCArMTQ5LDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQbGFjZXMgdGhlIHJlY3RhbmdsZSdzIHNpemUgYW5kIGxvY2F0aW9uIGRhdGEgaW4gYSBuZXcgUmVjdGFuZ2xlMkQKLSAgICAgKiBvYmplY3QgYW5kIHJldHVybnMgaXQuCisgICAgICogUGxhY2VzIHRoZSByZWN0YW5nbGUncyBzaXplIGFuZCBsb2NhdGlvbiBkYXRhIGluIGEgbmV3IFJlY3RhbmdsZTJEIG9iamVjdAorICAgICAqIGFuZCByZXR1cm5zIGl0LgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBhcyBhIG5ldyBSZWN0YW5nbGUyRCBvYmplY3QuCiAgICAgICovCkBAIC0xNTQsMjEgKzE1OSwyNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBpbiB0ZXJtcyBvZiBhIFBvaW50MkQgd2hpY2ggZ2l2ZXMgaXRzCi0gICAgICogdXBwZXIgbGVmdCBjb3JuZXIgYW5kIGEgRGltZW5zaW9uMkQgb2JqZWN0IGdpdmluZyBpdHMgd2lkdGggYW5kIGhlaWdodC4KKyAgICAgKiBTZXRzIHRoZSBib3VuZGluZyByZWN0YW5nbGUgaW4gdGVybXMgb2YgYSBQb2ludDJEIHdoaWNoIGdpdmVzIGl0cyB1cHBlcgorICAgICAqIGxlZnQgY29ybmVyIGFuZCBhIERpbWVuc2lvbjJEIG9iamVjdCBnaXZpbmcgaXRzIHdpZHRoIGFuZCBoZWlnaHQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGxvYyB0aGUgbmV3IHVwcGVyIGxlZnQgY29ybmVyIGNvb3JkaW5hdGUuCi0gICAgICogQHBhcmFtIHNpemUgdGhlIG5ldyBzaXplIGRpbWVuc2lvbnMuCisgICAgICogQHBhcmFtIGxvYworICAgICAqICAgICAgICAgICAgdGhlIG5ldyB1cHBlciBsZWZ0IGNvcm5lciBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHNpemUgZGltZW5zaW9ucy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRGcmFtZShQb2ludDJEIGxvYywgRGltZW5zaW9uMkQgc2l6ZSkgewogICAgICAgICBzZXRGcmFtZShsb2MuZ2V0WCgpLCBsb2MuZ2V0WSgpLCBzaXplLmdldFdpZHRoKCksIHNpemUuZ2V0SGVpZ2h0KCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSB0byBtYXRjaCB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIAotICAgICAqIHNwZWNpZmllZCBSZWN0YW5nbGUyRC4KKyAgICAgKiBTZXRzIHRoZSBib3VuZGluZyByZWN0YW5nbGUgdG8gbWF0Y2ggdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBSZWN0YW5nbGUyRC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gciB0aGUgcmVjdGFuZ2xlIHRoYXQgZ2l2ZXMgdGhlIG5ldyBmcmFtZSBkYXRhLgorICAgICAqIEBwYXJhbSByCisgICAgICogICAgICAgICAgICB0aGUgcmVjdGFuZ2xlIHRoYXQgZ2l2ZXMgdGhlIG5ldyBmcmFtZSBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZyYW1lKFJlY3RhbmdsZTJEIHIpIHsKICAgICAgICAgc2V0RnJhbWUoci5nZXRYKCksIHIuZ2V0WSgpLCByLmdldFdpZHRoKCksIHIuZ2V0SGVpZ2h0KCkpOwpAQCAtMTc2LDEyICsxODQsMTcgQEAKIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGZyYW1pbmcgcmVjdGFuZ2xlIGdpdmVuIHR3byBvcHBvc2l0ZSBjb3JuZXJzLiBBbnkgdHdvIGNvcm5lcnMKLSAgICAgKiBtYXkgYmUgdXNlZCBpbiBhbnkgb3JkZXIgYXMgbG9uZyBhcyB0aGV5IGFyZSBkaWFnb25hbGx5IG9wcG9zaXRlIG9uZSBhbm90aGVyLgorICAgICAqIG1heSBiZSB1c2VkIGluIGFueSBvcmRlciBhcyBsb25nIGFzIHRoZXkgYXJlIGRpYWdvbmFsbHkgb3Bwb3NpdGUgb25lCisgICAgICogYW5vdGhlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geDEgdGhlIHggY29vcmRpbmF0ZSBvZiBvbmUgb2YgdGhlIGNvcm5lciBwb2ludHMuCi0gICAgICogQHBhcmFtIHkxIHRoZSB5IGNvb3JkaW5hdGUgb2Ygb25lIG9mIHRoZSBjb3JuZXIgcG9pbnRzLgotICAgICAqIEBwYXJhbSB4MiB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBvdGhlciBjb3JuZXIgcG9pbnQuCi0gICAgICogQHBhcmFtIHkyIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIG90aGVyIGNvcm5lciBwb2ludC4KKyAgICAgKiBAcGFyYW0geDEKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2Ygb25lIG9mIHRoZSBjb3JuZXIgcG9pbnRzLgorICAgICAqIEBwYXJhbSB5MQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiBvbmUgb2YgdGhlIGNvcm5lciBwb2ludHMuCisgICAgICogQHBhcmFtIHgyCisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBvdGhlciBjb3JuZXIgcG9pbnQuCisgICAgICogQHBhcmFtIHkyCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBvdGhlciBjb3JuZXIgcG9pbnQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RnJhbWVGcm9tRGlhZ29uYWwoZG91YmxlIHgxLCBkb3VibGUgeTEsIGRvdWJsZSB4MiwgZG91YmxlIHkyKSB7CiAgICAgICAgIGRvdWJsZSByeCwgcnksIHJ3LCByaDsKQEAgLTIwNCwxMCArMjE3LDEzIEBACiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBmcmFtaW5nIHJlY3RhbmdsZSBnaXZlbiB0d28gb3Bwb3NpdGUgY29ybmVycy4gQW55IHR3byBjb3JuZXJzCi0gICAgICogbWF5IGJlIHVzZWQgaW4gYW55IG9yZGVyIGFzIGxvbmcgYXMgdGhleSBhcmUgZGlhZ29uYWxseSBvcHBvc2l0ZSBvbmUgYW5vdGhlci4KKyAgICAgKiBtYXkgYmUgdXNlZCBpbiBhbnkgb3JkZXIgYXMgbG9uZyBhcyB0aGV5IGFyZSBkaWFnb25hbGx5IG9wcG9zaXRlIG9uZQorICAgICAqIGFub3RoZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHAxIG9uZSBvZiB0aGUgY29ybmVyIHBvaW50cy4KLSAgICAgKiBAcGFyYW0gcDIgdGhlIG90aGVyIGNvcm5lciBwb2ludC4KKyAgICAgKiBAcGFyYW0gcDEKKyAgICAgKiAgICAgICAgICAgIG9uZSBvZiB0aGUgY29ybmVyIHBvaW50cy4KKyAgICAgKiBAcGFyYW0gcDIKKyAgICAgKiAgICAgICAgICAgIHRoZSBvdGhlciBjb3JuZXIgcG9pbnQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RnJhbWVGcm9tRGlhZ29uYWwoUG9pbnQyRCBwMSwgUG9pbnQyRCBwMikgewogICAgICAgICBzZXRGcmFtZUZyb21EaWFnb25hbChwMS5nZXRYKCksIHAxLmdldFkoKSwgcDIuZ2V0WCgpLCBwMi5nZXRZKCkpOwpAQCAtMjE3LDEwICsyMzMsMTQgQEAKICAgICAgKiBTZXRzIHRoZSBmcmFtaW5nIHJlY3RhbmdsZSBnaXZlbiB0aGUgY2VudGVyIHBvaW50IGFuZCBvbmUgY29ybmVyLiBBbnkKICAgICAgKiBjb3JuZXIgbWF5IGJlIHVzZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNlbnRlclggdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgY2VudGVyIHBvaW50LgotICAgICAqIEBwYXJhbSBjZW50ZXJZIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGNlbnRlciBwb2ludC4KLSAgICAgKiBAcGFyYW0gY29ybmVyWCB0aGUgeCBjb29yZGluYXRlIG9mIG9uZSBvZiB0aGUgY29ybmVyIHBvaW50cy4KLSAgICAgKiBAcGFyYW0gY29ybmVyWSB0aGUgeSBjb29yZGluYXRlIG9mIG9uZSBvZiB0aGUgY29ybmVyIHBvaW50cy4KKyAgICAgKiBAcGFyYW0gY2VudGVyWAorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgY2VudGVyIHBvaW50LgorICAgICAqIEBwYXJhbSBjZW50ZXJZCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBjZW50ZXIgcG9pbnQuCisgICAgICogQHBhcmFtIGNvcm5lclgKKyAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2Ygb25lIG9mIHRoZSBjb3JuZXIgcG9pbnRzLgorICAgICAqIEBwYXJhbSBjb3JuZXJZCisgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIG9uZSBvZiB0aGUgY29ybmVyIHBvaW50cy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRGcmFtZUZyb21DZW50ZXIoZG91YmxlIGNlbnRlclgsIGRvdWJsZSBjZW50ZXJZLCBkb3VibGUgY29ybmVyWCwgZG91YmxlIGNvcm5lclkpIHsKICAgICAgICAgZG91YmxlIHdpZHRoID0gTWF0aC5hYnMoY29ybmVyWCAtIGNlbnRlclgpOwpAQCAtMjMyLDggKzI1MiwxMCBAQAogICAgICAqIFNldHMgdGhlIGZyYW1pbmcgcmVjdGFuZ2xlIGdpdmVuIHRoZSBjZW50ZXIgcG9pbnQgYW5kIG9uZSBjb3JuZXIuIEFueQogICAgICAqIGNvcm5lciBtYXkgYmUgdXNlZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2VudGVyIHRoZSBjZW50ZXIgcG9pbnQuCi0gICAgICogQHBhcmFtIGNvcm5lciBhIGNvcm5lciBwb2ludC4KKyAgICAgKiBAcGFyYW0gY2VudGVyCisgICAgICogICAgICAgICAgICB0aGUgY2VudGVyIHBvaW50LgorICAgICAqIEBwYXJhbSBjb3JuZXIKKyAgICAgKiAgICAgICAgICAgIGEgY29ybmVyIHBvaW50LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZyYW1lRnJvbUNlbnRlcihQb2ludDJEIGNlbnRlciwgUG9pbnQyRCBjb3JuZXIpIHsKICAgICAgICAgc2V0RnJhbWVGcm9tQ2VudGVyKGNlbnRlci5nZXRYKCksIGNlbnRlci5nZXRZKCksIGNvcm5lci5nZXRYKCksIGNvcm5lci5nZXRZKCkpOwpAQCAtMjczLDQgKzI5NSwzIEBACiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9nZW9tL1JvdW5kUmVjdGFuZ2xlMkQuamF2YSBiL2F3dC9qYXZhL2F3dC9nZW9tL1JvdW5kUmVjdGFuZ2xlMkQuamF2YQppbmRleCA2ODBhMTQ2Li44ZmJkZGQ2IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvZ2VvbS9Sb3VuZFJlY3RhbmdsZTJELmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2dlb20vUm91bmRSZWN0YW5nbGUyRC5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIERlbmlzIE0uIEtpc2hlbmtvCiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5nZW9tOwogCiBpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CkBAIC0yNSw1MyArMjYsNzQgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBUaGUgQ2xhc3MgUm91bmRSZWN0YW5nbGUyRCBkZXNjcmliZXMgYSByZWN0YW5nbGUgd2l0aCByb3VuZGVkIAotICogY29ybmVycyB3aXRoIGhpZ2gtcHJlY2lzaW9uIGRhdGEgdGhhdCBpcyBhcHByb3ByaWF0ZSBmb3IgZ2VvbWV0cmljCi0gKiBvcGVyYXRpb25zLgorICogVGhlIENsYXNzIFJvdW5kUmVjdGFuZ2xlMkQgZGVzY3JpYmVzIGEgcmVjdGFuZ2xlIHdpdGggcm91bmRlZCBjb3JuZXJzIHdpdGgKKyAqIGhpZ2gtcHJlY2lzaW9uIGRhdGEgdGhhdCBpcyBhcHByb3ByaWF0ZSBmb3IgZ2VvbWV0cmljIG9wZXJhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUm91bmRSZWN0YW5nbGUyRCBleHRlbmRzIFJlY3Rhbmd1bGFyU2hhcGUgewogCiAgICAgLyoqCi0gICAgICogVGhlIENsYXNzIEZsb2F0IGlzIHRoZSBzdWJjbGFzcyBvZiBSb3VuZFJlY3RhbmdsZTJEIHRoYXQgaGFzIGFsbCAKLSAgICAgKiBvZiBpdHMgZGF0YSB2YWx1ZXMgc3RvcmVkIHdpdGggZmxvYXQtbGV2ZWwgcHJlY2lzaW9uLgorICAgICAqIFRoZSBDbGFzcyBGbG9hdCBpcyB0aGUgc3ViY2xhc3Mgb2YgUm91bmRSZWN0YW5nbGUyRCB0aGF0IGhhcyBhbGwgb2YgaXRzCisgICAgICogZGF0YSB2YWx1ZXMgc3RvcmVkIHdpdGggZmxvYXQtbGV2ZWwgcHJlY2lzaW9uLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmxvYXQgZXh0ZW5kcyBSb3VuZFJlY3RhbmdsZTJEIHsKIAotICAgICAgICAvKiogVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lci4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmbG9hdCB4OwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lci4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmbG9hdCB5OwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmbG9hdCB3aWR0aDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmbG9hdCBoZWlnaHQ7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIGFyY3dpZHRoIG9mIHRoZSByb3VuZGVkIGNvcm5lcnMuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBhcmMgd2lkdGggb2YgdGhlIHJvdW5kZWQgY29ybmVycy4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmbG9hdCBhcmN3aWR0aDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgYXJjaGVpZ2h0IG9mIHRoZSByb3VuZGVkIGNvcm5lcnMuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBhcmMgaGVpZ2h0IG9mIHRoZSByb3VuZGVkIGNvcm5lcnMuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmxvYXQgYXJjaGVpZ2h0OwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZmxvYXQtdmFsdWVkIFJvdW5kUmVjdGFuZ2xlMkQgd2l0aCAKLSAgICAgICAgICogaXRzIGRhdGEtdmFsdWVzIHNldCB0byB6ZXJvLgorICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZmxvYXQtdmFsdWVkIFJvdW5kUmVjdGFuZ2xlMkQgd2l0aCBpdHMgZGF0YS12YWx1ZXMKKyAgICAgICAgICogc2V0IHRvIHplcm8uCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgRmxvYXQoKSB7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGZsb2F0LXZhbHVlZCBSb3VuZFJlY3RhbmdsZTJEIHdpdGggCi0gICAgICAgICAqIHRoZSBzcGVjaWZpZWQgZGF0YSB2YWx1ZXMKKyAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGZsb2F0LXZhbHVlZCBSb3VuZFJlY3RhbmdsZTJEIHdpdGggdGhlIHNwZWNpZmllZAorICAgICAgICAgKiBkYXRhIHZhbHVlcy4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSB4IHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyCi0gICAgICAgICAqIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyCi0gICAgICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZQotICAgICAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZQotICAgICAgICAgKiBAcGFyYW0gYXJjd2lkdGggdGhlIGFyY3dpZHRoIG9mIHRoZSByb3VuZGVkIGNvcm5lcnMKLSAgICAgICAgICogQHBhcmFtIGFyY2hlaWdodCB0aGUgYXJjaGVpZ2h0IG9mIHRoZSByb3VuZGVkIGNvcm5lcnMKKyAgICAgICAgICogQHBhcmFtIHgKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lci4KKyAgICAgICAgICogQHBhcmFtIHkKKyAgICAgICAgICogICAgICAgICAgICB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lci4KKyAgICAgICAgICogQHBhcmFtIHdpZHRoCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuCisgICAgICAgICAqIEBwYXJhbSBhcmN3aWR0aAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBhcmMgd2lkdGggb2YgdGhlIHJvdW5kZWQgY29ybmVycy4KKyAgICAgICAgICogQHBhcmFtIGFyY2hlaWdodAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBhcmMgaGVpZ2h0IG9mIHRoZSByb3VuZGVkIGNvcm5lcnMuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgRmxvYXQoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgd2lkdGgsIGZsb2F0IGhlaWdodCwgZmxvYXQgYXJjd2lkdGgsIGZsb2F0IGFyY2hlaWdodCkgewogICAgICAgICAgICAgc2V0Um91bmRSZWN0KHgsIHksIHdpZHRoLCBoZWlnaHQsIGFyY3dpZHRoLCBhcmNoZWlnaHQpOwpAQCAtMTEzLDE2ICsxMzUsMjMgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBkYXRhIG9mIHRoZSByb3VuZCByZWN0LgorICAgICAgICAgKiBTZXRzIHRoZSBkYXRhIG9mIHRoZSByb3VuZCByZWN0YW5nbGUuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0geCB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lcgotICAgICAgICAgKiBAcGFyYW0geSB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lcgotICAgICAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUKLSAgICAgICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUKLSAgICAgICAgICogQHBhcmFtIGFyY3dpZHRoIHRoZSBhcmN3aWR0aCBvZiB0aGUgcm91bmRlZCBjb3JuZXJzCi0gICAgICAgICAqIEBwYXJhbSBhcmNoZWlnaHQgdGhlIGFyY2hlaWdodCBvZiB0aGUgcm91bmRlZCBjb3JuZXJzCisgICAgICAgICAqIEBwYXJhbSB4CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIuCisgICAgICAgICAqIEBwYXJhbSB5CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIuCisgICAgICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAgICAgKiBAcGFyYW0gYXJjd2lkdGgKKyAgICAgICAgICogICAgICAgICAgICB0aGUgYXJjIHdpZHRoIG9mIHRoZSByb3VuZGVkIGNvcm5lcnMuCisgICAgICAgICAqIEBwYXJhbSBhcmNoZWlnaHQKKyAgICAgICAgICogICAgICAgICAgICB0aGUgYXJjIGhlaWdodCBvZiB0aGUgcm91bmRlZCBjb3JuZXJzLgogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Um91bmRSZWN0KGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHdpZHRoLCBmbG9hdCBoZWlnaHQsIGZsb2F0IGFyY3dpZHRoLCBmbG9hdCBhcmNoZWlnaHQpIHsKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Um91bmRSZWN0KGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHdpZHRoLCBmbG9hdCBoZWlnaHQsIGZsb2F0IGFyY3dpZHRoLAorICAgICAgICAgICAgICAgIGZsb2F0IGFyY2hlaWdodCkgewogICAgICAgICAgICAgdGhpcy54ID0geDsKICAgICAgICAgICAgIHRoaXMueSA9IHk7CiAgICAgICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7CkBAIC0xMzIsNyArMTYxLDggQEAKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRSb3VuZFJlY3QoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgd2lkdGgsIGRvdWJsZSBoZWlnaHQsIGRvdWJsZSBhcmN3aWR0aCwgZG91YmxlIGFyY2hlaWdodCkgeworICAgICAgICBwdWJsaWMgdm9pZCBzZXRSb3VuZFJlY3QoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgd2lkdGgsIGRvdWJsZSBoZWlnaHQsIGRvdWJsZSBhcmN3aWR0aCwKKyAgICAgICAgICAgICAgICBkb3VibGUgYXJjaGVpZ2h0KSB7CiAgICAgICAgICAgICB0aGlzLnggPSAoZmxvYXQpeDsKICAgICAgICAgICAgIHRoaXMueSA9IChmbG9hdCl5OwogICAgICAgICAgICAgdGhpcy53aWR0aCA9IChmbG9hdCl3aWR0aDsKQEAgLTE1Nyw0OCArMTg3LDY5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhlIENsYXNzIERvdWJsZSBpcyB0aGUgc3ViY2xhc3Mgb2YgUm91bmRSZWN0YW5nbGUyRCB0aGF0IGhhcyBhbGwgCi0gICAgICogb2YgaXRzIGRhdGEgdmFsdWVzIHN0b3JlZCB3aXRoIGRvdWJsZS1sZXZlbCBwcmVjaXNpb24uCisgICAgICogVGhlIENsYXNzIERvdWJsZSBpcyB0aGUgc3ViY2xhc3Mgb2YgUm91bmRSZWN0YW5nbGUyRCB0aGF0IGhhcyBhbGwgb2YgaXRzCisgICAgICogZGF0YSB2YWx1ZXMgc3RvcmVkIHdpdGggZG91YmxlLWxldmVsIHByZWNpc2lvbi4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERvdWJsZSBleHRlbmRzIFJvdW5kUmVjdGFuZ2xlMkQgewogCi0gICAgICAgIC8qKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lci4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyLgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGRvdWJsZSB4OwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lci4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBkb3VibGUgeTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZG91YmxlIHdpZHRoOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGRvdWJsZSBoZWlnaHQ7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIGFyY3dpZHRoIG9mIHRoZSByb3VuZGVkIGNvcm5lcnMuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBhcmMgd2lkdGggb2YgdGhlIHJvdW5kZWQgY29ybmVycy4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBkb3VibGUgYXJjd2lkdGg7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIGFyY2hlaWdodCBvZiB0aGUgcm91bmRlZCBjb3JuZXJzLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgYXJjIGhlaWdodCBvZiB0aGUgcm91bmRlZCBjb3JuZXJzLgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGRvdWJsZSBhcmNoZWlnaHQ7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkb3VibGUtdmFsdWVkIFJvdW5kUmVjdGFuZ2xlMkQgd2l0aCAKLSAgICAgICAgICogaXRzIGRhdGEtdmFsdWVzIHNldCB0byB6ZXJvLgorICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZG91YmxlLXZhbHVlZCBSb3VuZFJlY3RhbmdsZTJEIHdpdGggaXRzCisgICAgICAgICAqIGRhdGEtdmFsdWVzIHNldCB0byB6ZXJvLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIERvdWJsZSgpIHsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZG91YmxlLXZhbHVlZCBSb3VuZFJlY3RhbmdsZTJEIHdpdGggCi0gICAgICAgICAqIHRoZSBzcGVjaWZpZWQgZGF0YSB2YWx1ZXMuCisgICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkb3VibGUtdmFsdWVkIFJvdW5kUmVjdGFuZ2xlMkQgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICAgICAqIGRhdGEgdmFsdWVzLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHggdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIKLSAgICAgICAgICogQHBhcmFtIHkgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIKLSAgICAgICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlCi0gICAgICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlCi0gICAgICAgICAqIEBwYXJhbSBhcmN3aWR0aCB0aGUgYXJjd2lkdGggb2YgdGhlIHJvdW5kZWQgY29ybmVycwotICAgICAgICAgKiBAcGFyYW0gYXJjaGVpZ2h0IHRoZSBhcmNoZWlnaHQgb2YgdGhlIHJvdW5kZWQgY29ybmVycworICAgICAgICAgKiBAcGFyYW0geAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyLgorICAgICAgICAgKiBAcGFyYW0geQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyLgorICAgICAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgICAgICogQHBhcmFtIGhlaWdodAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgICAgICogQHBhcmFtIGFyY3dpZHRoCisgICAgICAgICAqICAgICAgICAgICAgdGhlIGFyYyB3aWR0aCBvZiB0aGUgcm91bmRlZCBjb3JuZXJzLgorICAgICAgICAgKiBAcGFyYW0gYXJjaGVpZ2h0CisgICAgICAgICAqICAgICAgICAgICAgdGhlIGFyYyBoZWlnaHQgb2YgdGhlIHJvdW5kZWQgY29ybmVycy4KICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBEb3VibGUoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgd2lkdGgsIGRvdWJsZSBoZWlnaHQsIGRvdWJsZSBhcmN3aWR0aCwgZG91YmxlIGFyY2hlaWdodCkgeworICAgICAgICBwdWJsaWMgRG91YmxlKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHdpZHRoLCBkb3VibGUgaGVpZ2h0LCBkb3VibGUgYXJjd2lkdGgsCisgICAgICAgICAgICAgICAgZG91YmxlIGFyY2hlaWdodCkgewogICAgICAgICAgICAgc2V0Um91bmRSZWN0KHgsIHksIHdpZHRoLCBoZWlnaHQsIGFyY3dpZHRoLCBhcmNoZWlnaHQpOwogICAgICAgICB9CiAKQEAgLTIzOCw3ICsyODksOCBAQAogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFJvdW5kUmVjdChkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB3aWR0aCwgZG91YmxlIGhlaWdodCwgZG91YmxlIGFyY3dpZHRoLCBkb3VibGUgYXJjaGVpZ2h0KSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHNldFJvdW5kUmVjdChkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB3aWR0aCwgZG91YmxlIGhlaWdodCwgZG91YmxlIGFyY3dpZHRoLAorICAgICAgICAgICAgICAgIGRvdWJsZSBhcmNoZWlnaHQpIHsKICAgICAgICAgICAgIHRoaXMueCA9IHg7CiAgICAgICAgICAgICB0aGlzLnkgPSB5OwogICAgICAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoOwpAQCAtMjYzLDcgKzMxNSw3IEBACiAgICAgfQogCiAgICAgLyoKLSAgICAgKiBSb3VuZFJlY3RhbmdsZTJEIHBhdGggaXRlcmF0b3IgCisgICAgICogUm91bmRSZWN0YW5nbGUyRCBwYXRoIGl0ZXJhdG9yCiAgICAgICovCiAgICAgLyoqCiAgICAgICogVGhlIHN1YmNsYXNzIG9mIFBhdGhJdGVyYXRvciB0byB0cmF2ZXJzZSBhIFJvdW5kUmVjdGFuZ2xlMkQuCkBAIC0yNzQsNzAgKzMyNiwxMDEgQEAKICAgICAgICAgICogUGF0aCBmb3Igcm91bmQgY29ybmVycyBnZW5lcmF0ZWQgdGhlIHNhbWUgd2F5IGFzIEVsbGlwc2UyRAogICAgICAgICAgKi8KIAotICAgICAgICAvKiogVGhlIGNvZWZmaWNpZW50IHRvIGNhbGN1bGF0ZSBjb250cm9sIHBvaW50cyBvZiBCZXppZXIgY3VydmVzLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNvZWZmaWNpZW50IHRvIGNhbGN1bGF0ZSBjb250cm9sIHBvaW50cyBvZiBCZXppZXIgY3VydmVzLgorICAgICAgICAgKi8KICAgICAgICAgZG91YmxlIHUgPSAwLjUgLSAyLjAgLyAzLjAgKiAoTWF0aC5zcXJ0KDIuMCkgLSAxLjApOwogCi0gICAgICAgIC8qKiBUaGUgcG9pbnRzIGNvb3JkaW5hdGVzIGNhbGN1bGF0aW9uIHRhYmxlLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHBvaW50cyBjb29yZGluYXRlcyBjYWxjdWxhdGlvbiB0YWJsZS4KKyAgICAgICAgICovCiAgICAgICAgIGRvdWJsZSBwb2ludHNbXVtdID0gewotICAgICAgICAgICAgICAgIHsgMC4wLCAgMC41LCAwLjAsICAwLjAgfSwgLy8gTU9WRVRPCi0gICAgICAgICAgICAgICAgeyAxLjAsIC0wLjUsIDAuMCwgIDAuMCB9LCAvLyBMSU5FVE8KLSAgICAgICAgICAgICAgICB7IDEuMCwgICAtdSwgMC4wLCAgMC4wLCAgIC8vIENVQklDVE8KLSAgICAgICAgICAgICAgICAgIDEuMCwgIDAuMCwgMC4wLCAgICB1LAotICAgICAgICAgICAgICAgICAgMS4wLCAgMC4wLCAwLjAsICAwLjUgfSwKLSAgICAgICAgICAgICAgICB7IDEuMCwgIDAuMCwgMS4wLCAtMC41IH0sIC8vIExJTkVUTwotICAgICAgICAgICAgICAgIHsgMS4wLCAgMC4wLCAxLjAsICAgLXUsICAgLy8gQ1VCSUNUTwotICAgICAgICAgICAgICAgICAgMS4wLCAgIC11LCAxLjAsICAwLjAsCi0gICAgICAgICAgICAgICAgICAxLjAsIC0wLjUsIDEuMCwgIDAuMCB9LAotICAgICAgICAgICAgICAgIHsgMC4wLCAgMC41LCAxLjAsICAwLjAgfSwgLy8gTElORVRPCi0gICAgICAgICAgICAgICAgeyAwLjAsICAgIHUsIDEuMCwgIDAuMCwgICAvLyBDVUJJQ1RPCi0gICAgICAgICAgICAgICAgICAwLjAsICAwLjAsIDEuMCwgICAtdSwKLSAgICAgICAgICAgICAgICAgIDAuMCwgIDAuMCwgMS4wLCAtMC41IH0sCi0gICAgICAgICAgICAgICAgeyAwLjAsICAwLjAsIDAuMCwgIDAuNSB9LCAvLyBMSU5FVE8KLSAgICAgICAgICAgICAgICB7IDAuMCwgIDAuMCwgMC4wLCAgICB1LCAgIC8vIENVQklDVE8KLSAgICAgICAgICAgICAgICAgIDAuMCwgICAgdSwgMC4wLCAgMC4wLAotICAgICAgICAgICAgICAgICAgMC4wLCAgMC41LCAwLjAsICAwLjAgfSB9OworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDAuMCwgMC41LCAwLjAsIDAuMAorICAgICAgICAgICAgICAgIH0sIC8vIE1PVkVUTworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDEuMCwgLTAuNSwgMC4wLCAwLjAKKyAgICAgICAgICAgICAgICB9LCAvLyBMSU5FVE8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAxLjAsIC11LCAwLjAsIDAuMCwgLy8gQ1VCSUNUTworICAgICAgICAgICAgICAgICAgICAgICAgMS4wLCAwLjAsIDAuMCwgdSwgMS4wLCAwLjAsIDAuMCwgMC41CisgICAgICAgICAgICAgICAgfSwgeworICAgICAgICAgICAgICAgICAgICAgICAgMS4wLCAwLjAsIDEuMCwgLTAuNQorICAgICAgICAgICAgICAgIH0sIC8vIExJTkVUTworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDEuMCwgMC4wLCAxLjAsIC11LCAvLyBDVUJJQ1RPCisgICAgICAgICAgICAgICAgICAgICAgICAxLjAsIC11LCAxLjAsIDAuMCwgMS4wLCAtMC41LCAxLjAsIDAuMAorICAgICAgICAgICAgICAgIH0sIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDAuMCwgMC41LCAxLjAsIDAuMAorICAgICAgICAgICAgICAgIH0sIC8vIExJTkVUTworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDAuMCwgdSwgMS4wLCAwLjAsIC8vIENVQklDVE8KKyAgICAgICAgICAgICAgICAgICAgICAgIDAuMCwgMC4wLCAxLjAsIC11LCAwLjAsIDAuMCwgMS4wLCAtMC41CisgICAgICAgICAgICAgICAgfSwgeworICAgICAgICAgICAgICAgICAgICAgICAgMC4wLCAwLjAsIDAuMCwgMC41CisgICAgICAgICAgICAgICAgfSwgLy8gTElORVRPCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgMC4wLCAwLjAsIDAuMCwgdSwgLy8gQ1VCSUNUTworICAgICAgICAgICAgICAgICAgICAgICAgMC4wLCB1LCAwLjAsIDAuMCwgMC4wLCAwLjUsIDAuMCwgMC4wCisgICAgICAgICAgICAgICAgfQorICAgICAgICB9OwogCi0gICAgICAgIC8qKiBUaGUgc2VnbWVudCB0eXBlcyBjb3JyZXNwb25kIHRvIHBvaW50cyBhcnJheS4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzZWdtZW50IHR5cGVzIGNvcnJlc3BvbmQgdG8gcG9pbnRzIGFycmF5LgorICAgICAgICAgKi8KICAgICAgICAgaW50IHR5cGVzW10gPSB7Ci0gICAgICAgICAgICAgICAgU0VHX01PVkVUTywKLSAgICAgICAgICAgICAgICBTRUdfTElORVRPLAotICAgICAgICAgICAgICAgIFNFR19DVUJJQ1RPLAotICAgICAgICAgICAgICAgIFNFR19MSU5FVE8sCi0gICAgICAgICAgICAgICAgU0VHX0NVQklDVE8sCi0gICAgICAgICAgICAgICAgU0VHX0xJTkVUTywKLSAgICAgICAgICAgICAgICBTRUdfQ1VCSUNUTywKLSAgICAgICAgICAgICAgICBTRUdfTElORVRPLAotICAgICAgICAgICAgICAgIFNFR19DVUJJQ1RPfTsKKyAgICAgICAgICAgICAgICBTRUdfTU9WRVRPLCBTRUdfTElORVRPLCBTRUdfQ1VCSUNUTywgU0VHX0xJTkVUTywgU0VHX0NVQklDVE8sIFNFR19MSU5FVE8sCisgICAgICAgICAgICAgICAgU0VHX0NVQklDVE8sIFNFR19MSU5FVE8sIFNFR19DVUJJQ1RPCisgICAgICAgIH07CiAKLSAgICAgICAgLyoqIFRoZSB4IGNvb3JkaW5hdGUgb2YgbGVmdC11cHBlciBjb3JuZXIgb2YgdGhlIHJvdW5kIHJlY3RhbmdsZSBib3VuZHMuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgeCBjb29yZGluYXRlIG9mIGxlZnQtdXBwZXIgY29ybmVyIG9mIHRoZSByb3VuZCByZWN0YW5nbGUgYm91bmRzLgorICAgICAgICAgKi8KICAgICAgICAgZG91YmxlIHg7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHkgY29vcmRpbmF0ZSBvZiBsZWZ0LXVwcGVyIGNvcm5lciBvZiB0aGUgcm91bmQgcmVjdGFuZ2xlIGJvdW5kcy4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHkgY29vcmRpbmF0ZSBvZiBsZWZ0LXVwcGVyIGNvcm5lciBvZiB0aGUgcm91bmQgcmVjdGFuZ2xlIGJvdW5kcy4KKyAgICAgICAgICovCiAgICAgICAgIGRvdWJsZSB5OwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB3aWR0aCBvZiB0aGUgcm91bmQgcmVjdGFuZ2xlIGJvdW5kcy4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHdpZHRoIG9mIHRoZSByb3VuZCByZWN0YW5nbGUgYm91bmRzLgorICAgICAgICAgKi8KICAgICAgICAgZG91YmxlIHdpZHRoOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBoZWlnaHQgb2YgdGhlIHJvdW5kIHJlY3RhbmdsZSBib3VuZHMuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIHJvdW5kIHJlY3RhbmdsZSBib3VuZHMuCisgICAgICAgICAqLwogICAgICAgICBkb3VibGUgaGVpZ2h0OwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSB3aWR0aCBvZiBhcmMgY29ybmVycyBvZiB0aGUgcm91bmQgcmVjdGFuZ2xlLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgd2lkdGggb2YgYXJjIGNvcm5lcnMgb2YgdGhlIHJvdW5kIHJlY3RhbmdsZS4KKyAgICAgICAgICovCiAgICAgICAgIGRvdWJsZSBhdzsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgaGVpZ2h0IG9mIGFyYyBjb3JuZXJzIG9mIHRoZSByb3VuZCByZWN0YW5nbGUuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBoZWlnaHQgb2YgYXJjIGNvcm5lcnMgb2YgdGhlIHJvdW5kIHJlY3RhbmdsZS4KKyAgICAgICAgICovCiAgICAgICAgIGRvdWJsZSBhaDsKIAotICAgICAgICAvKiogVGhlIHBhdGggaXRlcmF0b3IgdHJhbnNmb3JtYXRpb24uICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcGF0aCBpdGVyYXRvciB0cmFuc2Zvcm1hdGlvbi4KKyAgICAgICAgICovCiAgICAgICAgIEFmZmluZVRyYW5zZm9ybSB0OwogCi0gICAgICAgIC8qKiBUaGUgY3VycmVudCBzZWdtZW5ldCBpbmRleC4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjdXJyZW50IHNlZ21lbnQgaW5kZXguCisgICAgICAgICAqLwogICAgICAgICBpbnQgaW5kZXg7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdHMgYSBuZXcgUm91bmRSZWN0YW5nbGUyRC5JdGVyYXRvciBmb3IgZ2l2ZW4gcm91bmQgcmVjdGFuZ2xlIGFuZCB0cmFuc2Zvcm1hdGlvbi4KKyAgICAgICAgICogQ29uc3RydWN0cyBhIG5ldyBSb3VuZFJlY3RhbmdsZTJELkl0ZXJhdG9yIGZvciBnaXZlbiByb3VuZCByZWN0YW5nbGUKKyAgICAgICAgICogYW5kIHRyYW5zZm9ybWF0aW9uLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHJyIC0gdGhlIHNvdXJjZSBSb3VuZFJlY3RhbmdsZTJEIG9iamVjdAotICAgICAgICAgKiBAcGFyYW0gYXQgLSB0aGUgQWZmaW5lVHJhbnNmb3JtIG9iamVjdCB0byBhcHBseSByZWN0YW5nbGUgcGF0aAorICAgICAgICAgKiBAcGFyYW0gcnIKKyAgICAgICAgICogICAgICAgICAgICAtIHRoZSBzb3VyY2UgUm91bmRSZWN0YW5nbGUyRCBvYmplY3QKKyAgICAgICAgICogQHBhcmFtIGF0CisgICAgICAgICAqICAgICAgICAgICAgLSB0aGUgQWZmaW5lVHJhbnNmb3JtIG9iamVjdCB0byBhcHBseSByZWN0YW5nbGUgcGF0aAogICAgICAgICAgKi8KICAgICAgICAgSXRlcmF0b3IoUm91bmRSZWN0YW5nbGUyRCByciwgQWZmaW5lVHJhbnNmb3JtIGF0KSB7CiAgICAgICAgICAgICB0aGlzLnggPSByci5nZXRYKCk7CkBAIC00MTUsNDEgKzQ5OCw0OCBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGFyYyB3aWR0aC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhcmMgd2lkdGgKKyAgICAgKiBAcmV0dXJuIHRoZSBhcmMgd2lkdGguCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGRvdWJsZSBnZXRBcmNXaWR0aCgpOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgYXJjIGhlaWdodC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhcmMgaGVpZ2h0CisgICAgICogQHJldHVybiB0aGUgYXJjIGhlaWdodC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgZG91YmxlIGdldEFyY0hlaWdodCgpOwogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgZGF0YSBvZiB0aGUgUm91bmRSZWN0YW5nbGUyRC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lcgotICAgICAqIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSdzIHVwcGVyIGxlZnQgY29ybmVyCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUKLSAgICAgKiBAcGFyYW0gYXJjV2lkdGggdGhlIGFyY3dpZHRoIG9mIHRoZSByb3VuZGVkIGNvcm5lcnMKLSAgICAgKiBAcGFyYW0gYXJjSGVpZ2h0IHRoZSBhcmNoZWlnaHQgb2YgdGhlIHJvdW5kZWQgY29ybmVycworICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUncyB1cHBlciBsZWZ0IGNvcm5lci4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlJ3MgdXBwZXIgbGVmdCBjb3JuZXIuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIGFyY1dpZHRoCisgICAgICogICAgICAgICAgICB0aGUgYXJjIHdpZHRoIG9mIHRoZSByb3VuZGVkIGNvcm5lcnMuCisgICAgICogQHBhcmFtIGFyY0hlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGFyYyBoZWlnaHQgb2YgdGhlIHJvdW5kZWQgY29ybmVycy4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRSb3VuZFJlY3QoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgd2lkdGgsIGRvdWJsZSBoZWlnaHQsCiAgICAgICAgICAgICBkb3VibGUgYXJjV2lkdGgsIGRvdWJsZSBhcmNIZWlnaHQpOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGF0YSBvZiB0aGUgUm91bmRSZWN0YW5nbGUyRCBieSBjb3B5aW5nIHRoZSB2YWx1ZXMKLSAgICAgKiBmcm9tIGFuIGV4aXN0aW5nIFJvdW5kUmVjdGFuZ2xlMkQuCisgICAgICogU2V0cyB0aGUgZGF0YSBvZiB0aGUgUm91bmRSZWN0YW5nbGUyRCBieSBjb3B5aW5nIHRoZSB2YWx1ZXMgZnJvbSBhbgorICAgICAqIGV4aXN0aW5nIFJvdW5kUmVjdGFuZ2xlMkQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHJyIHRoZSByb3VuZCByZWN0YW5nbGUgdG8gY29weSB0aGUgZGF0YSBmcm9tCi0gICAgICogCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiByciBpcyBudWxsCisgICAgICogQHBhcmFtIHJyCisgICAgICogICAgICAgICAgICB0aGUgcm91bmQgcmVjdGFuZ2xlIHRvIGNvcHkgdGhlIGRhdGEgZnJvbS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgcnIgaXMgbnVsbC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRSb3VuZFJlY3QoUm91bmRSZWN0YW5nbGUyRCBycikgewotICAgICAgICBzZXRSb3VuZFJlY3QocnIuZ2V0WCgpLCByci5nZXRZKCksIHJyLmdldFdpZHRoKCksIHJyLmdldEhlaWdodCgpLCBycgotICAgICAgICAgICAgICAgIC5nZXRBcmNXaWR0aCgpLCByci5nZXRBcmNIZWlnaHQoKSk7CisgICAgICAgIHNldFJvdW5kUmVjdChyci5nZXRYKCksIHJyLmdldFkoKSwgcnIuZ2V0V2lkdGgoKSwgcnIuZ2V0SGVpZ2h0KCksIHJyLmdldEFyY1dpZHRoKCksIHJyCisgICAgICAgICAgICAgICAgLmdldEFyY0hlaWdodCgpKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTQ3OCwyMSArNTY4LDE5IEBACiAKICAgICAgICAgaWYgKHB4IDwgcngxICsgYXcpIHsKICAgICAgICAgICAgIGN4ID0gcngxICsgYXc7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgaWYgKHB4ID4gcngyIC0gYXcpIHsKLSAgICAgICAgICAgICAgICBjeCA9IHJ4MiAtIGF3OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChweCA+IHJ4MiAtIGF3KSB7CisgICAgICAgICAgICBjeCA9IHJ4MiAtIGF3OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KIAogICAgICAgICBpZiAocHkgPCByeTEgKyBhaCkgewogICAgICAgICAgICAgY3kgPSByeTEgKyBhaDsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBpZiAocHkgPiByeTIgLSBhaCkgewotICAgICAgICAgICAgICAgIGN5ID0gcnkyIC0gYWg7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHB5ID4gcnkyIC0gYWgpIHsKKyAgICAgICAgICAgIGN5ID0gcnkyIC0gYWg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQogCiAgICAgICAgIHB4ID0gKHB4IC0gY3gpIC8gYXc7CiAgICAgICAgIHB5ID0gKHB5IC0gY3kpIC8gYWg7CkBAIC01MzcsMTEgKzYyNSw3IEBACiAgICAgICAgIGRvdWJsZSByeDIgPSByeCArIHJ3OwogICAgICAgICBkb3VibGUgcnkyID0gcnkgKyByaDsKIAotICAgICAgICByZXR1cm4KLSAgICAgICAgICAgIGNvbnRhaW5zKHJ4MSwgcnkxKSAmJgotICAgICAgICAgICAgY29udGFpbnMocngyLCByeTEpICYmCi0gICAgICAgICAgICBjb250YWlucyhyeDIsIHJ5MikgJiYKLSAgICAgICAgICAgIGNvbnRhaW5zKHJ4MSwgcnkyKTsKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5zKHJ4MSwgcnkxKSAmJiBjb250YWlucyhyeDIsIHJ5MSkgJiYgY29udGFpbnMocngyLCByeTIpICYmIGNvbnRhaW5zKHJ4MSwgcnkyKTsKICAgICB9CiAKICAgICBwdWJsaWMgUGF0aEl0ZXJhdG9yIGdldFBhdGhJdGVyYXRvcihBZmZpbmVUcmFuc2Zvcm0gYXQpIHsKQEAgLTU0OSw0ICs2MzMsMyBAQAogICAgIH0KIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvZ2VvbS9wYWNrYWdlLmh0bWwgYi9hd3QvamF2YS9hd3QvZ2VvbS9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNhMjM2ZQotLS0gL2Rldi9udWxsCisrKyBiL2F3dC9qYXZhL2F3dC9nZW9tL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDggQEAKKzxodG1sPgorICA8Ym9keT4KKyAgICA8cD4KKyAgICAgIFRoaXMgcGFja2FnZSBjb250YWlucyBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzIHJlbGF0ZWQgdG8gSmF2YTJEIHNoYXBlcyBhbmQgZ2VvbWV0cnkuCisgICAgPC9wPgorICAgIEBzaW5jZSBBbmRyb2lkIDEuMAorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW0vSW5wdXRDb250ZXh0LmphdmEgYi9hd3QvamF2YS9hd3QvaW0vSW5wdXRDb250ZXh0LmphdmEKaW5kZXggMzQ2ODQ3NC4uY2NlNTE0OCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltL0lucHV0Q29udGV4dC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbS9JbnB1dENvbnRleHQuamF2YQpAQCAtMjYsNiArMjYsMTIgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW0uSW5wdXRNZXRob2RDb250ZXh0OwogCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHN1cHBvcnRlZCBpbiBBbmRyb2lkIDEuMC4gSXQgaXMgbWVyZWx5IHByb3ZpZGVkIHRvIG1haW50YWluCisgKiBpbnRlcmZhY2UgY29tcGF0aWJpbGl0eSB3aXRoIGRlc2t0b3AgSmF2YSBpbXBsZW1lbnRhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAorICovCiBwdWJsaWMgY2xhc3MgSW5wdXRDb250ZXh0IHsKICAgICBwcm90ZWN0ZWQgSW5wdXRDb250ZXh0KCkgewogICAgIH0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbS9JbnB1dE1ldGhvZEhpZ2hsaWdodC5qYXZhIGIvYXd0L2phdmEvYXd0L2ltL0lucHV0TWV0aG9kSGlnaGxpZ2h0LmphdmEKaW5kZXggNTNiYjIwYi4uODY1ZDQ3YyAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltL0lucHV0TWV0aG9kSGlnaGxpZ2h0LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltL0lucHV0TWV0aG9kSGlnaGxpZ2h0LmphdmEKQEAgLTI1LDYgKzI1LDEyIEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGNsYXNzIElucHV0TWV0aG9kSGlnaGxpZ2h0IHsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJBV19URVhUID0gMDsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbS9JbnB1dE1ldGhvZFJlcXVlc3RzLmphdmEgYi9hd3QvamF2YS9hd3QvaW0vSW5wdXRNZXRob2RSZXF1ZXN0cy5qYXZhCmluZGV4IGJkZDI1ZTYuLmIxMmQzOTcgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbS9JbnB1dE1ldGhvZFJlcXVlc3RzLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltL0lucHV0TWV0aG9kUmVxdWVzdHMuamF2YQpAQCAtMjQsNiArMjQsMTIgQEAKIGltcG9ydCBqYXZhLmF3dC5mb250LlRleHRIaXRJbmZvOwogaW1wb3J0IGphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3I7CiAKKy8qKgorICogVGhpcyBjbGFzcyBpcyBub3Qgc3VwcG9ydGVkIGluIEFuZHJvaWQgMS4wLiBJdCBpcyBtZXJlbHkgcHJvdmlkZWQgdG8gbWFpbnRhaW4KKyAqIGludGVyZmFjZSBjb21wYXRpYmlsaXR5IHdpdGggZGVza3RvcCBKYXZhIGltcGxlbWVudGF0aW9ucy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCisgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSW5wdXRNZXRob2RSZXF1ZXN0cyB7CiAKICAgICBwdWJsaWMgQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yIGNhbmNlbExhdGVzdENvbW1pdHRlZFRleHQoQXR0cmlidXRlZENoYXJhY3Rlckl0ZXJhdG9yLkF0dHJpYnV0ZVtdIGF0dHJpYnV0ZXMpOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltL0lucHV0U3Vic2V0LmphdmEgYi9hd3QvamF2YS9hd3QvaW0vSW5wdXRTdWJzZXQuamF2YQppbmRleCAwMmExMDQ5Li43MDg4ODFlIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW0vSW5wdXRTdWJzZXQuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW0vSW5wdXRTdWJzZXQuamF2YQpAQCAtMjAsNiArMjAsMTIgQEAKICAqLwogcGFja2FnZSBqYXZhLmF3dC5pbTsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGZpbmFsIGNsYXNzIElucHV0U3Vic2V0IGV4dGVuZHMgQ2hhcmFjdGVyLlN1YnNldCB7CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIElucHV0U3Vic2V0IExBVElOID0gbmV3IElucHV0U3Vic2V0KCJMQVRJTiIpOyAvLyROT04tTkxTLTEkCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW0vc3BpL0lucHV0TWV0aG9kLmphdmEgYi9hd3QvamF2YS9hd3QvaW0vc3BpL0lucHV0TWV0aG9kLmphdmEKaW5kZXggMmM5OGM0Ni4uNjdhODgzNCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltL3NwaS9JbnB1dE1ldGhvZC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbS9zcGkvSW5wdXRNZXRob2QuamF2YQpAQCAtMjQsNiArMjQsMTIgQEAKIGltcG9ydCBqYXZhLmF3dC5SZWN0YW5nbGU7CiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGludGVyZmFjZSBJbnB1dE1ldGhvZCB7CiAKICAgICBwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltL3NwaS9JbnB1dE1ldGhvZENvbnRleHQuamF2YSBiL2F3dC9qYXZhL2F3dC9pbS9zcGkvSW5wdXRNZXRob2RDb250ZXh0LmphdmEKaW5kZXggY2EzM2U4Ny4uYmZjNzczYyAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltL3NwaS9JbnB1dE1ldGhvZENvbnRleHQuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW0vc3BpL0lucHV0TWV0aG9kQ29udGV4dC5qYXZhCkBAIC0yNiw2ICsyNiwxMiBAQAogaW1wb3J0IGphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3I7CiAvLz8/P0FXVDogaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGludGVyZmFjZSBJbnB1dE1ldGhvZENvbnRleHQgZXh0ZW5kcyBJbnB1dE1ldGhvZFJlcXVlc3RzIHsKIAogLy8gICAgPz8/QVdUOiBwdWJsaWMgSkZyYW1lIGNyZWF0ZUlucHV0TWV0aG9kSkZyYW1lKFN0cmluZyB0aXRsZSwgYm9vbGVhbiBhdHRhY2hUb0lucHV0Q29udGV4dCk7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW0vc3BpL0lucHV0TWV0aG9kRGVzY3JpcHRvci5qYXZhIGIvYXd0L2phdmEvYXd0L2ltL3NwaS9JbnB1dE1ldGhvZERlc2NyaXB0b3IuamF2YQppbmRleCAzMDY4Y2FjLi5jODAwYmMxIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW0vc3BpL0lucHV0TWV0aG9kRGVzY3JpcHRvci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbS9zcGkvSW5wdXRNZXRob2REZXNjcmlwdG9yLmphdmEKQEAgLTI0LDYgKzI0LDEyIEBACiBpbXBvcnQgamF2YS5hd3QuSW1hZ2U7CiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIAorLyoqCisgKiBUaGlzIGNsYXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQW5kcm9pZCAxLjAuIEl0IGlzIG1lcmVseSBwcm92aWRlZCB0byBtYWludGFpbgorICogaW50ZXJmYWNlIGNvbXBhdGliaWxpdHkgd2l0aCBkZXNrdG9wIEphdmEgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKKyAqLwogcHVibGljIGludGVyZmFjZSBJbnB1dE1ldGhvZERlc2NyaXB0b3IgewogCiAgICAgcHVibGljIExvY2FsZVtdIGdldEF2YWlsYWJsZUxvY2FsZXMoKSB0aHJvd3MgQVdURXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL0FmZmluZVRyYW5zZm9ybU9wLmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvQWZmaW5lVHJhbnNmb3JtT3AuamF2YQppbmRleCA1NDY4MzdhLi5kYjI1ZTFhIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvQWZmaW5lVHJhbnNmb3JtT3AuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvQWZmaW5lVHJhbnNmb3JtT3AuamF2YQpAQCAtMzIsNTAgKzMyLDYwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogVGhlIEFmZmluZVRyYW5zZm9ybSBjbGFzcyB0cmFuc2xhdGVzIGNvb3JkaW5hdGVzIGZyb20gMkQgY29vcmRpbmF0ZXMgCi0gKiBpbiB0aGUgc291cmNlIGltYWdlIG9yIFJhc3RlciB0byAyRCBjb29yZGluYXRlcyBpbiB0aGUgZGVzdGluYXRpb24gCi0gKiBpbWFnZSBvciBSYXN0ZXIgdXNpbmcgQWZmaW5lIHRyYW5zZm9ybWF0aW9uLiBUaGUgbnVtYmVyIG9mIGJhbmRzIGluIAotICogdGhlIHNvdXJjZSBSYXN0ZXIgc2hvdWxkIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgYmFuZHMgaW4gdGhlIGRlc3RpbmF0aW9uCi0gKiBSYXN0ZXIuCisgKiBUaGUgQWZmaW5lVHJhbnNmb3JtIGNsYXNzIHRyYW5zbGF0ZXMgY29vcmRpbmF0ZXMgZnJvbSAyRCBjb29yZGluYXRlcyBpbiB0aGUKKyAqIHNvdXJjZSBpbWFnZSBvciBSYXN0ZXIgdG8gMkQgY29vcmRpbmF0ZXMgaW4gdGhlIGRlc3RpbmF0aW9uIGltYWdlIG9yIFJhc3RlcgorICogdXNpbmcgYWZmaW5lIHRyYW5zZm9ybWF0aW9uLiBUaGUgbnVtYmVyIG9mIGJhbmRzIGluIHRoZSBzb3VyY2UgUmFzdGVyIHNob3VsZAorICogZXF1YWwgdG8gdGhlIG51bWJlciBvZiBiYW5kcyBpbiB0aGUgZGVzdGluYXRpb24gUmFzdGVyLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEFmZmluZVRyYW5zZm9ybU9wIGltcGxlbWVudHMgQnVmZmVyZWRJbWFnZU9wLCBSYXN0ZXJPcCB7Ci0gICAgCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUWVBFX05FQVJFU1RfTkVJR0hCT1IgaW5kaWNhdGVzIG5lYXJlc3QtbmVpZ2hib3IgCi0gICAgICogaW50ZXJwb2xhdGlvbiB0eXBlLiAKKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX05FQVJFU1RfTkVJR0hCT1IgaW5kaWNhdGVzIG5lYXJlc3QtbmVpZ2hib3IKKyAgICAgKiBpbnRlcnBvbGF0aW9uIHR5cGUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9ORUFSRVNUX05FSUdIQk9SID0gMTsKLSAgICAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFRZUEVfQklMSU5FQVIgaW5kaWNhdGVzIGJpbGluZWFyIGludGVycG9sYXRpb24gdHlwZS4gCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9CSUxJTkVBUiBpbmRpY2F0ZXMgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiB0eXBlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfQklMSU5FQVIgPSAyOwotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgVFlQRV9CSUNVQklDIGluZGljYXRlcyBiaWN1YmljIGludGVycG9sYXRpb24gdHlwZS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX0JJQ1VCSUMgaW5kaWNhdGVzIGJpLWN1YmljIGludGVycG9sYXRpb24gdHlwZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0JJQ1VCSUMgPSAzOwogCi0gICAgLyoqIFRoZSBpIHR5cGUuICovCisgICAgLyoqCisgICAgICogVGhlIGkgdHlwZS4KKyAgICAgKi8KICAgICBwcml2YXRlIGludCBpVHlwZTsgLy8gaW50ZXJwb2xhdGlvbiB0eXBlCi0gICAgCi0gICAgLyoqIFRoZSBhdC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBhdC4KKyAgICAgKi8KICAgICBwcml2YXRlIEFmZmluZVRyYW5zZm9ybSBhdDsKLSAgICAKLSAgICAvKiogVGhlIGhpbnRzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGhpbnRzLgorICAgICAqLwogICAgIHByaXZhdGUgUmVuZGVyaW5nSGludHMgaGludHM7CiAKICAgICBzdGF0aWMgewogICAgICAgICAvLyBUT0RPIC0gdW5jb21tZW50Ci0gICAgICAgIC8vU3lzdGVtLmxvYWRMaWJyYXJ5KCJpbWFnZW9wcyIpOworICAgICAgICAvLyBTeXN0ZW0ubG9hZExpYnJhcnkoImltYWdlb3BzIik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEFmZmluZVRyYW5zZm9ybU9wIHdpdGggdGhlIHNwZWNpZmllZAotICAgICAqIEFmZmluZVRyYW5zZm9ybSBhbmQgUmVuZGVyaW5nSGludHMgb2JqZWN0IHdoaWNoIGRlZmluZXMgCi0gICAgICogdGhlIGludGVycG9sYXRpb24gdHlwZS4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQWZmaW5lVHJhbnNmb3JtT3Agd2l0aCB0aGUgc3BlY2lmaWVkIEFmZmluZVRyYW5zZm9ybQorICAgICAqIGFuZCBSZW5kZXJpbmdIaW50cyBvYmplY3Qgd2hpY2ggZGVmaW5lcyB0aGUgaW50ZXJwb2xhdGlvbiB0eXBlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4Zm9ybSB0aGUgQWZmaW5lVHJhbnNmb3JtLgotICAgICAqIEBwYXJhbSBoaW50cyB0aGUgUmVuZGVyaW5nSGludHMgb2JqZWN0IHdoaWNoIGRlZmluZXMgCi0gICAgICogdGhlIGludGVycG9sYXRpb24gdHlwZS4KKyAgICAgKiBAcGFyYW0geGZvcm0KKyAgICAgKiAgICAgICAgICAgIHRoZSBBZmZpbmVUcmFuc2Zvcm0uCisgICAgICogQHBhcmFtIGhpbnRzCisgICAgICogICAgICAgICAgICB0aGUgUmVuZGVyaW5nSGludHMgb2JqZWN0IHdoaWNoIGRlZmluZXMgdGhlIGludGVycG9sYXRpb24KKyAgICAgKiAgICAgICAgICAgIHR5cGUuCiAgICAgICovCiAgICAgcHVibGljIEFmZmluZVRyYW5zZm9ybU9wKEFmZmluZVRyYW5zZm9ybSB4Zm9ybSwgUmVuZGVyaW5nSGludHMgaGludHMpIHsKICAgICAgICAgdGhpcyh4Zm9ybSwgVFlQRV9ORUFSRVNUX05FSUdIQk9SKTsKQEAgLTk1LDIwICsxMDUsMjIgQEAKICAgICAgICAgICAgICAgICAvLyBEZXRlcm1pbmUgZnJvbSByZW5kZXJpbmcgcXVhbGl0eQogICAgICAgICAgICAgICAgIGlmIChoaW50ID09IFJlbmRlcmluZ0hpbnRzLlZBTFVFX1JFTkRFUl9RVUFMSVRZKSB7CiAgICAgICAgICAgICAgICAgICAgIHRoaXMuaVR5cGUgPSBUWVBFX0JJTElORUFSOwotICAgICAgICAgICAgICAgIC8vIEZvciBzcGVlZCB1c2UgbmVhcmVzdCBuZWlnaGJvcgorICAgICAgICAgICAgICAgICAgICAvLyBGb3Igc3BlZWQgdXNlIG5lYXJlc3QgbmVpZ2hib3IKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQWZmaW5lVHJhbnNmb3JtT3Agd2l0aCB0aGUgc3BlY2lmaWVkCi0gICAgICogQWZmaW5lVHJhbnNmb3JtIGFuZCBhIHNwZWNpZmllZCBpbnRlcnBvbGF0aW9uIHR5cGUgZnJvbSB0aGUgCi0gICAgICogbGlzdCBvZiBwcmVkZWZpbmVkIGludGVycG9sYXRpb24gdHlwZXMuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEFmZmluZVRyYW5zZm9ybU9wIHdpdGggdGhlIHNwZWNpZmllZCBBZmZpbmVUcmFuc2Zvcm0KKyAgICAgKiBhbmQgYSBzcGVjaWZpZWQgaW50ZXJwb2xhdGlvbiB0eXBlIGZyb20gdGhlIGxpc3Qgb2YgcHJlZGVmaW5lZAorICAgICAqIGludGVycG9sYXRpb24gdHlwZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHhmb3JtIHRoZSBBZmZpbmVUcmFuc2Zvcm0uCi0gICAgICogQHBhcmFtIGludGVycCB0aGUgb25lIG9mIHByZWRlZmluZWQgaW50ZXJwb2xhdGlvbiB0eXBlczoKLSAgICAgKiBUWVBFX05FQVJFU1RfTkVJR0hCT1IsIFRZUEVfQklMSU5FQVIsIG9yIFRZUEVfQklDVUJJQy4KKyAgICAgKiBAcGFyYW0geGZvcm0KKyAgICAgKiAgICAgICAgICAgIHRoZSBBZmZpbmVUcmFuc2Zvcm0uCisgICAgICogQHBhcmFtIGludGVycAorICAgICAqICAgICAgICAgICAgdGhlIG9uZSBvZiBwcmVkZWZpbmVkIGludGVycG9sYXRpb24gdHlwZXM6CisgICAgICogICAgICAgICAgICBUWVBFX05FQVJFU1RfTkVJR0hCT1IsIFRZUEVfQklMSU5FQVIsIG9yIFRZUEVfQklDVUJJQy4KICAgICAgKi8KICAgICBwdWJsaWMgQWZmaW5lVHJhbnNmb3JtT3AoQWZmaW5lVHJhbnNmb3JtIHhmb3JtLCBpbnQgaW50ZXJwKSB7CiAgICAgICAgIGlmIChNYXRoLmFicyh4Zm9ybS5nZXREZXRlcm1pbmFudCgpKSA8PSBEb3VibGUuTUlOX1ZBTFVFKSB7CkBAIC0xMTYsNyArMTI4LDcgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBJbWFnaW5nT3BFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjRGIiwgeGZvcm0pKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgdGhpcy5hdCA9IChBZmZpbmVUcmFuc2Zvcm0pIHhmb3JtLmNsb25lKCk7CisgICAgICAgIHRoaXMuYXQgPSAoQWZmaW5lVHJhbnNmb3JtKXhmb3JtLmNsb25lKCk7CiAKICAgICAgICAgaWYgKGludGVycCAhPSBUWVBFX05FQVJFU1RfTkVJR0hCT1IgJiYgaW50ZXJwICE9IFRZUEVfQklMSU5FQVIgJiYgaW50ZXJwICE9IFRZUEVfQklDVUJJQykgewogICAgICAgICAgICAgLy8gYXd0LjI1MD1Vbmtub3duIGludGVycG9sYXRpb24gdHlwZTogezB9CkBAIC0xMjksNyArMTQxLDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBpbnRlcnBvbGF0aW9uIHR5cGUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW50ZXJwb2xhdGlvbiB0eXBlCisgICAgICogQHJldHVybiB0aGUgaW50ZXJwb2xhdGlvbiB0eXBlLgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0SW50ZXJwb2xhdGlvblR5cGUoKSB7CiAgICAgICAgIHJldHVybiBpVHlwZTsKQEAgLTE2NSw3ICsxNzcsNyBAQAogICAgICAqIEByZXR1cm4gdGhlIEFmZmluZVRyYW5zZm9ybS4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgQWZmaW5lVHJhbnNmb3JtIGdldFRyYW5zZm9ybSgpIHsKLSAgICAgICAgcmV0dXJuIChBZmZpbmVUcmFuc2Zvcm0pIGF0LmNsb25lKCk7CisgICAgICAgIHJldHVybiAoQWZmaW5lVHJhbnNmb3JtKWF0LmNsb25lKCk7CiAgICAgfQogCiAgICAgcHVibGljIGZpbmFsIFBvaW50MkQgZ2V0UG9pbnQyRChQb2ludDJEIHNyY1B0LCBQb2ludDJEIGRzdFB0KSB7CkBAIC0xNzcsMjEgKzE4OSwxOSBAQAogICAgIH0KIAogICAgIHB1YmxpYyBmaW5hbCBSZWN0YW5nbGUyRCBnZXRCb3VuZHMyRChSYXN0ZXIgc3JjKSB7Ci0gICAgICAgIC8vIFdlIHBvc2l0aW9uIHNvdXJjZSByYXN0ZXIgdG8gKDAsMCkgZXZlbiBpZiBpdCBpcyB0cmFuc2xhdGVkIGNoaWxkIHJhc3Rlci4KKyAgICAgICAgLy8gV2UgcG9zaXRpb24gc291cmNlIHJhc3RlciB0byAoMCwwKSBldmVuIGlmIGl0IGlzIHRyYW5zbGF0ZWQgY2hpbGQKKyAgICAgICAgLy8gcmFzdGVyLgogICAgICAgICAvLyBUaGlzIG1lYW5zIHRoYXQgd2UgbmVlZCBvbmx5IHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHNyYwogICAgICAgICBpbnQgd2lkdGggPSBzcmMuZ2V0V2lkdGgoKTsKICAgICAgICAgaW50IGhlaWdodCA9IHNyYy5nZXRIZWlnaHQoKTsKIAogICAgICAgICBmbG9hdFtdIGNvcm5lcnMgPSB7Ci0gICAgICAgICAgICAwLCAwLAotICAgICAgICAgICAgd2lkdGgsIDAsCi0gICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgMCwgaGVpZ2h0CisgICAgICAgICAgICAgICAgMCwgMCwgd2lkdGgsIDAsIHdpZHRoLCBoZWlnaHQsIDAsIGhlaWdodAogICAgICAgICB9OwogCiAgICAgICAgIGF0LnRyYW5zZm9ybShjb3JuZXJzLCAwLCBjb3JuZXJzLCAwLCA0KTsKIAotICAgICAgICBSZWN0YW5nbGUyRC5GbG9hdCBib3VuZHMgPSBuZXcgUmVjdGFuZ2xlMkQuRmxvYXQoY29ybmVyc1swXSwgY29ybmVyc1sxXSwgMCAsIDApOworICAgICAgICBSZWN0YW5nbGUyRC5GbG9hdCBib3VuZHMgPSBuZXcgUmVjdGFuZ2xlMkQuRmxvYXQoY29ybmVyc1swXSwgY29ybmVyc1sxXSwgMCwgMCk7CiAgICAgICAgIGJvdW5kcy5hZGQoY29ybmVyc1syXSwgY29ybmVyc1szXSk7CiAgICAgICAgIGJvdW5kcy5hZGQoY29ybmVyc1s0XSwgY29ybmVyc1s1XSk7CiAgICAgICAgIGJvdW5kcy5hZGQoY29ybmVyc1s2XSwgY29ybmVyc1s3XSk7CkBAIC0yMDgsMTcgKzIxOCwxNCBAQAogICAgICAgICBkb3VibGUgZHN0SGVpZ2h0ID0gbmV3Qm91bmRzLmdldFkoKSArIG5ld0JvdW5kcy5nZXRIZWlnaHQoKTsKIAogICAgICAgICBpZiAoZHN0V2lkdGggPD0gMCB8fCBkc3RIZWlnaHQgPD0gMCkgewotICAgICAgICAgICAgLy8gYXd0LjI1MT1UcmFuc2Zvcm1lZCB3aWR0aCAoezB9KSBhbmQgaGVpZ2h0ICh7MX0pIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gMAotICAgICAgICAgICAgdGhyb3cgbmV3IFJhc3RlckZvcm1hdEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjUxIiwgZHN0V2lkdGgsIGRzdEhlaWdodCkpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAvLyBhd3QuMjUxPVRyYW5zZm9ybWVkIHdpZHRoICh7MH0pIGFuZCBoZWlnaHQgKHsxfSkgc2hvdWxkIGJlCisgICAgICAgICAgICAvLyBncmVhdGVyIHRoYW4gMAorICAgICAgICAgICAgdGhyb3cgbmV3IFJhc3RlckZvcm1hdEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNTEiLCBkc3RXaWR0aCwgZHN0SGVpZ2h0KSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCiAgICAgICAgIGlmIChkZXN0Q00gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJlZEltYWdlKGRlc3RDTSwKLSAgICAgICAgICAgICAgICAgICAgZGVzdENNLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3RlcigoaW50KWRzdFdpZHRoLCAoaW50KWRzdEhlaWdodCksCi0gICAgICAgICAgICAgICAgICAgIGRlc3RDTS5pc0FscGhhUHJlbXVsdGlwbGllZCgpLAotICAgICAgICAgICAgICAgICAgICBudWxsCi0gICAgICAgICAgICApOworICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJlZEltYWdlKGRlc3RDTSwgZGVzdENNLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3RlcigoaW50KWRzdFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAoaW50KWRzdEhlaWdodCksIGRlc3RDTS5pc0FscGhhUHJlbXVsdGlwbGllZCgpLCBudWxsKTsKICAgICAgICAgfQogCiAgICAgICAgIENvbG9yTW9kZWwgY20gPSBzcmMuZ2V0Q29sb3JNb2RlbCgpOwpAQCAtMjI5LDIzICsyMzYsMTggQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIE9LLCB3ZSBjYW4gZ2V0IHNvdXJjZSBjb2xvciBtb2RlbAotICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlcmVkSW1hZ2UoY20sCi0gICAgICAgICAgICAgICAgc3JjLmdldFJhc3RlcigpLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3RlcigoaW50KWRzdFdpZHRoLCAoaW50KWRzdEhlaWdodCksCi0gICAgICAgICAgICAgICAgY20uaXNBbHBoYVByZW11bHRpcGxpZWQoKSwKLSAgICAgICAgICAgICAgICBudWxsCi0gICAgICAgICk7CisgICAgICAgIHJldHVybiBuZXcgQnVmZmVyZWRJbWFnZShjbSwgc3JjLmdldFJhc3RlcigpLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3RlcigoaW50KWRzdFdpZHRoLAorICAgICAgICAgICAgICAgIChpbnQpZHN0SGVpZ2h0KSwgY20uaXNBbHBoYVByZW11bHRpcGxpZWQoKSwgbnVsbCk7CiAgICAgfQogCi0gICAgcHVibGljIFdyaXRhYmxlUmFzdGVyIGNyZWF0ZUNvbXBhdGlibGVEZXN0UmFzdGVyIChSYXN0ZXIgc3JjKSB7CisgICAgcHVibGljIFdyaXRhYmxlUmFzdGVyIGNyZWF0ZUNvbXBhdGlibGVEZXN0UmFzdGVyKFJhc3RlciBzcmMpIHsKICAgICAgICAgLy8gSGVyZSBhcHByb2FjaCBpcyBvdGhlciB0aGVuIGluIGNyZWF0ZUNvbXBhdGlibGVEZXN0SW1hZ2UgLQogICAgICAgICAvLyBkZXN0aW5hdGlvbiBzaG91bGQgaW5jbHVkZSBvbmx5CiAgICAgICAgIC8vIHRyYW5zZm9ybWVkIGltYWdlLCBidXQgbm90ICgwLDApIGluIHNvdXJjZSBjb29yZGluYXRlIHN5c3RlbQogCiAgICAgICAgIFJlY3RhbmdsZTJEIG5ld0JvdW5kcyA9IGdldEJvdW5kczJEKHNyYyk7Ci0gICAgICAgIHJldHVybiBzcmMuY3JlYXRlQ29tcGF0aWJsZVdyaXRhYmxlUmFzdGVyKAotICAgICAgICAgICAgICAgIChpbnQpIG5ld0JvdW5kcy5nZXRYKCksIChpbnQpIG5ld0JvdW5kcy5nZXRZKCksCi0gICAgICAgICAgICAgICAgKGludCkgbmV3Qm91bmRzLmdldFdpZHRoKCksIChpbnQpbmV3Qm91bmRzLmdldEhlaWdodCgpCi0gICAgICAgICk7CisgICAgICAgIHJldHVybiBzcmMuY3JlYXRlQ29tcGF0aWJsZVdyaXRhYmxlUmFzdGVyKChpbnQpbmV3Qm91bmRzLmdldFgoKSwgKGludCluZXdCb3VuZHMuZ2V0WSgpLAorICAgICAgICAgICAgICAgIChpbnQpbmV3Qm91bmRzLmdldFdpZHRoKCksIChpbnQpbmV3Qm91bmRzLmdldEhlaWdodCgpKTsKICAgICB9CiAKICAgICBwdWJsaWMgZmluYWwgQnVmZmVyZWRJbWFnZSBmaWx0ZXIoQnVmZmVyZWRJbWFnZSBzcmMsIEJ1ZmZlcmVkSW1hZ2UgZHN0KSB7CkBAIC0yNTcsMTAgKzI1OSw4IEBACiAgICAgICAgIENvbG9yTW9kZWwgc3JjQ00gPSBzcmMuZ2V0Q29sb3JNb2RlbCgpOwogICAgICAgICBCdWZmZXJlZEltYWdlIGZpbmFsRHN0ID0gbnVsbDsKIAotICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgc3JjQ00gaW5zdGFuY2VvZiBJbmRleENvbG9yTW9kZWwgJiYKLSAgICAgICAgICAgICAgICAoaVR5cGUgIT0gVFlQRV9ORUFSRVNUX05FSUdIQk9SIHx8IHNyY0NNLmdldFBpeGVsU2l6ZSgpICUgOCAhPSAwKQotICAgICAgICApIHsKKyAgICAgICAgaWYgKHNyY0NNIGluc3RhbmNlb2YgSW5kZXhDb2xvck1vZGVsCisgICAgICAgICAgICAgICAgJiYgKGlUeXBlICE9IFRZUEVfTkVBUkVTVF9ORUlHSEJPUiB8fCBzcmNDTS5nZXRQaXhlbFNpemUoKSAlIDggIT0gMCkpIHsKICAgICAgICAgICAgIHNyYyA9ICgoSW5kZXhDb2xvck1vZGVsKXNyY0NNKS5jb252ZXJ0VG9JbnREaXNjcmV0ZShzcmMuZ2V0UmFzdGVyKCksIHRydWUpOwogICAgICAgICAgICAgc3JjQ00gPSBzcmMuZ2V0Q29sb3JNb2RlbCgpOwogICAgICAgICB9CkBAIC0yNjksMTUgKzI2OSwxMCBAQAogICAgICAgICAgICAgZHN0ID0gY3JlYXRlQ29tcGF0aWJsZURlc3RJbWFnZShzcmMsIHNyY0NNKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmICghc3JjQ00uZXF1YWxzKGRzdC5nZXRDb2xvck1vZGVsKCkpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVHJlYXQgQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9SR0IgYW5kIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfQVJHQiBhcyBzYW1lCi0gICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgICEoCi0gICAgICAgICAgICAgICAgICAgICAoc3JjLmdldFR5cGUoKSA9PSBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX1JHQiB8fAotICAgICAgICAgICAgICAgICAgICAgIHNyYy5nZXRUeXBlKCkgPT0gQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9BUkdCKSAmJgotICAgICAgICAgICAgICAgICAgICAgKGRzdC5nZXRUeXBlKCkgPT0gQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9SR0IgfHwKLSAgICAgICAgICAgICAgICAgICAgICBkc3QuZ2V0VHlwZSgpID09IEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfQVJHQikKLSAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIC8vIFRyZWF0IEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfUkdCIGFuZAorICAgICAgICAgICAgICAgIC8vIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfQVJHQiBhcyBzYW1lCisgICAgICAgICAgICAgICAgaWYgKCEoKHNyYy5nZXRUeXBlKCkgPT0gQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9SR0IgfHwgc3JjLmdldFR5cGUoKSA9PSBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0IpICYmIChkc3QKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRUeXBlKCkgPT0gQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9SR0IgfHwgZHN0LmdldFR5cGUoKSA9PSBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0IpKSkgewogICAgICAgICAgICAgICAgICAgICBmaW5hbERzdCA9IGRzdDsKICAgICAgICAgICAgICAgICAgICAgZHN0ID0gY3JlYXRlQ29tcGF0aWJsZURlc3RJbWFnZShzcmMsIHNyY0NNKTsKICAgICAgICAgICAgICAgICB9CkBAIC0yODcsMTAgKzI4MiwxMSBAQAogICAgICAgICAvLyBTa2lwIGFscGhhIGNoYW5uZWwgZm9yIFRZUEVfSU5UX1JHQiBpbWFnZXMKICAgICAgICAgaWYgKHNsb3dGaWx0ZXIoc3JjLmdldFJhc3RlcigpLCBkc3QuZ2V0UmFzdGVyKCkpICE9IDApIHsKICAgICAgICAgICAgIC8vIGF3dC4yMUY9VW5hYmxlIHRvIHRyYW5zZm9ybSBzb3VyY2UKLSAgICAgICAgICAgIHRocm93IG5ldyBJbWFnaW5nT3BFeGNlcHRpb24gKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxRiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAvLyBUT0RPIC0gdW5jb21tZW50Ci0gICAgICAgIC8vaWYgKGlwcEZpbHRlcihzcmMuZ2V0UmFzdGVyKCksIGRzdC5nZXRSYXN0ZXIoKSwgc3JjLmdldFR5cGUoKSkgIT0gMCkKLSAgICAgICAgICAgIC8vdGhyb3cgbmV3IEltYWdpbmdPcEV4Y2VwdGlvbiAoIlVuYWJsZSB0byB0cmFuc2Zvcm0gc291cmNlIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW1hZ2luZ09wRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxRiIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgLy8gVE9ETyAtIHVuY29tbWVudAorICAgICAgICAgICAgLy8gaWYgKGlwcEZpbHRlcihzcmMuZ2V0UmFzdGVyKCksIGRzdC5nZXRSYXN0ZXIoKSwgc3JjLmdldFR5cGUoKSkgIT0KKyAgICAgICAgICAgIC8vIDApCisgICAgICAgICAgICAvLyB0aHJvdyBuZXcgSW1hZ2luZ09wRXhjZXB0aW9uICgiVW5hYmxlIHRvIHRyYW5zZm9ybSBzb3VyY2UiKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChmaW5hbERzdCAhPSBudWxsKSB7CkBAIC0zMjAsOSArMzE2LDkgQEAKICAgICAgICAgaWYgKHNsb3dGaWx0ZXIoc3JjLCBkc3QpICE9IDApIHsKICAgICAgICAgICAgIC8vIGF3dC4yMUY9VW5hYmxlIHRvIHRyYW5zZm9ybSBzb3VyY2UKICAgICAgICAgICAgIHRocm93IG5ldyBJbWFnaW5nT3BFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjFGIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIC8vIFRPRE8gLSB1bmNvbW1lbnQKLSAgICAgICAgLy9pZiAoaXBwRmlsdGVyKHNyYywgZHN0LCBCdWZmZXJlZEltYWdlLlRZUEVfQ1VTVE9NKSAhPSAwKQotICAgICAgICAvLyAgICB0aHJvdyBuZXcgSW1hZ2luZ09wRXhjZXB0aW9uKCJVbmFibGUgdG8gdHJhbnNmb3JtIHNvdXJjZSIpOworICAgICAgICAgICAgLy8gVE9ETyAtIHVuY29tbWVudAorICAgICAgICAgICAgLy8gaWYgKGlwcEZpbHRlcihzcmMsIGRzdCwgQnVmZmVyZWRJbWFnZS5UWVBFX0NVU1RPTSkgIT0gMCkKKyAgICAgICAgICAgIC8vIHRocm93IG5ldyBJbWFnaW5nT3BFeGNlcHRpb24oIlVuYWJsZSB0byB0cmFuc2Zvcm0gc291cmNlIik7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gZHN0OwpAQCAtMzMyLDExICszMjgsMTMgQEAKICAgICAvKioKICAgICAgKiBJcHAgZmlsdGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzcmMgdGhlIHNyYwotICAgICAqIEBwYXJhbSBkc3QgdGhlIGRzdAotICAgICAqIEBwYXJhbSBpbWFnZVR5cGUgdGhlIGltYWdlIHR5cGUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnQKKyAgICAgKiBAcGFyYW0gc3JjCisgICAgICogICAgICAgICAgICB0aGUgc3JjLgorICAgICAqIEBwYXJhbSBkc3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBkc3QuCisgICAgICogQHBhcmFtIGltYWdlVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIHR5cGUuCisgICAgICogQHJldHVybiB0aGUgaW50LgogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogICAgIHByaXZhdGUgaW50IGlwcEZpbHRlcihSYXN0ZXIgc3JjLCBXcml0YWJsZVJhc3RlciBkc3QsIGludCBpbWFnZVR5cGUpIHsKQEAgLTM0OSw4ICszNDcsOCBAQAogICAgICAgICAgICAgY2FzZSBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX1JHQjoKICAgICAgICAgICAgIGNhc2UgQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9CR1I6IHsKICAgICAgICAgICAgICAgICBjaGFubmVscyA9IDQ7Ci0gICAgICAgICAgICAgICAgc3JjU3RyaWRlID0gc3JjLmdldFdpZHRoKCkqNDsKLSAgICAgICAgICAgICAgICBkc3RTdHJpZGUgPSBkc3QuZ2V0V2lkdGgoKSo0OworICAgICAgICAgICAgICAgIHNyY1N0cmlkZSA9IHNyYy5nZXRXaWR0aCgpICogNDsKKyAgICAgICAgICAgICAgICBkc3RTdHJpZGUgPSBkc3QuZ2V0V2lkdGgoKSAqIDQ7CiAgICAgICAgICAgICAgICAgc2tpcENoYW5uZWwgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMzYwLDggKzM1OCw4IEBACiAgICAgICAgICAgICBjYXNlIEJ1ZmZlcmVkSW1hZ2UuVFlQRV80QllURV9BQkdSOgogICAgICAgICAgICAgY2FzZSBCdWZmZXJlZEltYWdlLlRZUEVfNEJZVEVfQUJHUl9QUkU6IHsKICAgICAgICAgICAgICAgICBjaGFubmVscyA9IDQ7Ci0gICAgICAgICAgICAgICAgc3JjU3RyaWRlID0gc3JjLmdldFdpZHRoKCkqNDsKLSAgICAgICAgICAgICAgICBkc3RTdHJpZGUgPSBkc3QuZ2V0V2lkdGgoKSo0OworICAgICAgICAgICAgICAgIHNyY1N0cmlkZSA9IHNyYy5nZXRXaWR0aCgpICogNDsKKyAgICAgICAgICAgICAgICBkc3RTdHJpZGUgPSBkc3QuZ2V0V2lkdGgoKSAqIDQ7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTM3NSwxMiArMzczLDEzIEBACiAKICAgICAgICAgICAgIGNhc2UgQnVmZmVyZWRJbWFnZS5UWVBFXzNCWVRFX0JHUjogewogICAgICAgICAgICAgICAgIGNoYW5uZWxzID0gMzsKLSAgICAgICAgICAgICAgICBzcmNTdHJpZGUgPSBzcmMuZ2V0V2lkdGgoKSozOwotICAgICAgICAgICAgICAgIGRzdFN0cmlkZSA9IGRzdC5nZXRXaWR0aCgpKjM7CisgICAgICAgICAgICAgICAgc3JjU3RyaWRlID0gc3JjLmdldFdpZHRoKCkgKiAzOworICAgICAgICAgICAgICAgIGRzdFN0cmlkZSA9IGRzdC5nZXRXaWR0aCgpICogMzsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgY2FzZSBCdWZmZXJlZEltYWdlLlRZUEVfVVNIT1JUX0dSQVk6IC8vIFRPRE8gLSBjb3VsZCBiZSBkb25lIGluIG5hdGl2ZSBjb2RlPworICAgICAgICAgICAgY2FzZSBCdWZmZXJlZEltYWdlLlRZUEVfVVNIT1JUX0dSQVk6IC8vIFRPRE8gLSBjb3VsZCBiZSBkb25lIGluCisgICAgICAgICAgICAgICAgLy8gbmF0aXZlIGNvZGU/CiAgICAgICAgICAgICBjYXNlIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9VU0hPUlRfNTY1X1JHQjoKICAgICAgICAgICAgIGNhc2UgQnVmZmVyZWRJbWFnZS5UWVBFX1VTSE9SVF81NTVfUkdCOgogICAgICAgICAgICAgY2FzZSBCdWZmZXJlZEltYWdlLlRZUEVfQllURV9CSU5BUlk6IHsKQEAgLTM5MSwzNCArMzkwLDI5IEBACiAgICAgICAgICAgICAgICAgU2FtcGxlTW9kZWwgc3JjU00gPSBzcmMuZ2V0U2FtcGxlTW9kZWwoKTsKICAgICAgICAgICAgICAgICBTYW1wbGVNb2RlbCBkc3RTTSA9IGRzdC5nZXRTYW1wbGVNb2RlbCgpOwogCi0gICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgICAgICAgc3JjU00gaW5zdGFuY2VvZiBQaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdFNNIGluc3RhbmNlb2YgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsCi0gICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgaWYgKHNyY1NNIGluc3RhbmNlb2YgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBkc3RTTSBpbnN0YW5jZW9mIFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbCkgewogICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBQaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwKLSAgICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1NNLmdldERhdGFUeXBlKCkgIT0gRGF0YUJ1ZmZlci5UWVBFX0JZVEUgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RTTS5nZXREYXRhVHlwZSgpICE9IERhdGFCdWZmZXIuVFlQRV9CWVRFCi0gICAgICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3JjU00uZ2V0RGF0YVR5cGUoKSAhPSBEYXRhQnVmZmVyLlRZUEVfQllURQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRzdFNNLmdldERhdGFUeXBlKCkgIT0gRGF0YUJ1ZmZlci5UWVBFX0JZVEUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzbG93RmlsdGVyKHNyYywgZHN0KTsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzID0gc3JjU00uZ2V0TnVtQmFuZHMoKTsgLy8gSGF2ZSBJUFAgZnVuY3Rpb25zIGZvciAxLCAzIGFuZCA0IGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzID0gc3JjU00uZ2V0TnVtQmFuZHMoKTsgLy8gSGF2ZSBJUFAgZnVuY3Rpb25zIGZvciAxLAorICAgICAgICAgICAgICAgICAgICAvLyAzIGFuZCA0IGNoYW5uZWxzCiAgICAgICAgICAgICAgICAgICAgIGlmIChjaGFubmVscyAhPSAxICYmIGNoYW5uZWxzICE9IDMgJiYgY2hhbm5lbHMgIT0gNCkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNsb3dGaWx0ZXIoc3JjLCBkc3QpOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgaW50IGRhdGFUeXBlU2l6ZSA9IERhdGFCdWZmZXIuZ2V0RGF0YVR5cGVTaXplKHNyY1NNLmdldERhdGFUeXBlKCkpIC8gODsKIAotICAgICAgICAgICAgICAgICAgICBzcmNTdHJpZGUgPSAoKENvbXBvbmVudFNhbXBsZU1vZGVsKSBzcmNTTSkuZ2V0U2NhbmxpbmVTdHJpZGUoKSAqIGRhdGFUeXBlU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgZHN0U3RyaWRlID0gKChDb21wb25lbnRTYW1wbGVNb2RlbCkgZHN0U00pLmdldFNjYW5saW5lU3RyaWRlKCkgKiBkYXRhVHlwZVNpemU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY1NNIGluc3RhbmNlb2YgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgZHN0U00gaW5zdGFuY2VvZiBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsCi0gICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgICAgIHNyY1N0cmlkZSA9ICgoQ29tcG9uZW50U2FtcGxlTW9kZWwpc3JjU00pLmdldFNjYW5saW5lU3RyaWRlKCkgKiBkYXRhVHlwZVNpemU7CisgICAgICAgICAgICAgICAgICAgIGRzdFN0cmlkZSA9ICgoQ29tcG9uZW50U2FtcGxlTW9kZWwpZHN0U00pLmdldFNjYW5saW5lU3RyaWRlKCkgKiBkYXRhVHlwZVNpemU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzcmNTTSBpbnN0YW5jZW9mIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGRzdFNNIGluc3RhbmNlb2YgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCkgewogICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsCi0gICAgICAgICAgICAgICAgICAgIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgc3Bwc20xID0gKFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwpIHNyY1NNOwotICAgICAgICAgICAgICAgICAgICBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIHNwcHNtMiA9IChTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKSBkc3RTTTsKKyAgICAgICAgICAgICAgICAgICAgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCBzcHBzbTEgPSAoU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbClzcmNTTTsKKyAgICAgICAgICAgICAgICAgICAgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCBzcHBzbTIgPSAoU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbClkc3RTTTsKIAogICAgICAgICAgICAgICAgICAgICAvLyBObyBJUFAgZnVuY3Rpb24gZm9yIHRoaXMgdHlwZQogICAgICAgICAgICAgICAgICAgICBpZiAoc3Bwc20xLmdldERhdGFUeXBlKCkgPT0gRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVCkgewpAQCAtNDMyLDE1ICs0MjYsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGNvbXBhdGliaWxpdHkgb2Ygc2FtcGxlIG1vZGVscwotICAgICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bwc20xLmdldERhdGFUeXBlKCkgIT0gc3Bwc20yLmdldERhdGFUeXBlKCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhQXJyYXlzLmVxdWFscyhzcHBzbTEuZ2V0Qml0T2Zmc2V0cygpLCBzcHBzbTIuZ2V0Qml0T2Zmc2V0cygpKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFBcnJheXMuZXF1YWxzKHNwcHNtMS5nZXRCaXRNYXNrcygpLCBzcHBzbTIuZ2V0Qml0TWFza3MoKSkKLSAgICAgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzcHBzbTEuZ2V0RGF0YVR5cGUoKSAhPSBzcHBzbTIuZ2V0RGF0YVR5cGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFBcnJheXMuZXF1YWxzKHNwcHNtMS5nZXRCaXRPZmZzZXRzKCksIHNwcHNtMi5nZXRCaXRPZmZzZXRzKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIUFycmF5cy5lcXVhbHMoc3Bwc20xLmdldEJpdE1hc2tzKCksIHNwcHNtMi5nZXRCaXRNYXNrcygpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNsb3dGaWx0ZXIoc3JjLCBkc3QpOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3Bwc20xLmdldFNhbXBsZVNpemUoaSkgIT0gOCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzbG93RmlsdGVyKHNyYywgZHN0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTQ2MCwxMiArNDUyLDkgQEAKIAogICAgICAgICAgICAgICAgIC8vIEZpbGwgb2Zmc2V0cyBpZiB0aGVyZSdzIGEgY2hpbGQgcmFzdGVyCiAgICAgICAgICAgICAgICAgaWYgKHNyYy5nZXRQYXJlbnQoKSAhPSBudWxsIHx8IGRzdC5nZXRQYXJlbnQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVYKCkgIT0gMCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVkoKSAhPSAwIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWCgpICE9IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVZKCkgIT0gMAotICAgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNyYy5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVgoKSAhPSAwIHx8IHNyYy5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVkoKSAhPSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZHN0LmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWCgpICE9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBkc3QuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVZKCkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0cyA9IG5ldyBpbnRbNF07CiAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRzWzBdID0gLXNyYy5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVgoKSArIHNyYy5nZXRNaW5YKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRzWzFdID0gLXNyYy5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVkoKSArIHNyYy5nZXRNaW5ZKCk7CkBAIC00OTIsMjAgKzQ4MSwxOSBAQAogICAgICAgICAgICAgcmV0dXJuIC0xOyAvLyBVbmtub3duIGRhdGEgYnVmZmVyIHR5cGUKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBpcHBBZmZpbmVUcmFuc2Zvcm0oCi0gICAgICAgICAgICBtMDAsIG0wMSwgbTAyLCBtMTAsIG0xMSwgbTEyLAotICAgICAgICAgICAgc3JjRGF0YSwgc3JjLmdldFdpZHRoKCksIHNyYy5nZXRIZWlnaHQoKSwgc3JjU3RyaWRlLAotICAgICAgICAgICAgZHN0RGF0YSwgZHN0LmdldFdpZHRoKCksIGRzdC5nZXRIZWlnaHQoKSwgZHN0U3RyaWRlLAotICAgICAgICAgICAgaVR5cGUsIGNoYW5uZWxzLCBza2lwQ2hhbm5lbCwgb2Zmc2V0cyk7CisgICAgICAgIHJldHVybiBpcHBBZmZpbmVUcmFuc2Zvcm0obTAwLCBtMDEsIG0wMiwgbTEwLCBtMTEsIG0xMiwgc3JjRGF0YSwgc3JjLmdldFdpZHRoKCksIHNyYworICAgICAgICAgICAgICAgIC5nZXRIZWlnaHQoKSwgc3JjU3RyaWRlLCBkc3REYXRhLCBkc3QuZ2V0V2lkdGgoKSwgZHN0LmdldEhlaWdodCgpLCBkc3RTdHJpZGUsCisgICAgICAgICAgICAgICAgaVR5cGUsIGNoYW5uZWxzLCBza2lwQ2hhbm5lbCwgb2Zmc2V0cyk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogU2xvdyBmaWx0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNyYyB0aGUgc3JjCi0gICAgICogQHBhcmFtIGRzdCB0aGUgZHN0Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW50CisgICAgICogQHBhcmFtIHNyYworICAgICAqICAgICAgICAgICAgdGhlIHNyYy4KKyAgICAgKiBAcGFyYW0gZHN0CisgICAgICogICAgICAgICAgICB0aGUgZHN0LgorICAgICAqIEByZXR1cm4gdGhlIGludC4KICAgICAgKi8KICAgICBwcml2YXRlIGludCBzbG93RmlsdGVyKFJhc3RlciBzcmMsIFdyaXRhYmxlUmFzdGVyIGRzdCkgewogICAgICAgICAvLyBUT0RPOiBtYWtlIGNvcnJlY3QgaW50ZXJwb2xhdGlvbgpAQCAtNTE4LDcgKzUwNiw3IEBACiAKICAgICAgICAgQWZmaW5lVHJhbnNmb3JtIGludiA9IG51bGw7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgaW52ID0gYXQuY3JlYXRlSW52ZXJzZSgpOworICAgICAgICAgICAgaW52ID0gYXQuY3JlYXRlSW52ZXJzZSgpOwogICAgICAgICB9IGNhdGNoIChOb25pbnZlcnRpYmxlVHJhbnNmb3JtRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQpAQCAtNTUyLDcgKzU0MCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGludCBweCA9IHN4ID4+IDg7CiAgICAgICAgICAgICAgICAgICAgIGludCBweSA9IHN5ID4+IDg7CiAgICAgICAgICAgICAgICAgICAgIGlmIChweCA+PSBtaW5TcmNYICYmIHB5ID49IG1pblNyY1kgJiYgcHggPCBtYXhTcmNYICYmIHB5IDwgbWF4U3JjWSkgewotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbCA9IHNyYy5nZXREYXRhRWxlbWVudHMocHggLCBweSAsIG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbCA9IHNyYy5nZXREYXRhRWxlbWVudHMocHgsIHB5LCBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC5zZXREYXRhRWxlbWVudHMoeCwgeSwgdmFsKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBzeCArPSBoeDsKQEAgLTU4NSwzMyArNTczLDQ2IEBACiAgICAgLyoqCiAgICAgICogSXBwIGFmZmluZSB0cmFuc2Zvcm0uCiAgICAgICogCi0gICAgICogQHBhcmFtIG0wMCB0aGUgbTAwCi0gICAgICogQHBhcmFtIG0wMSB0aGUgbTAxCi0gICAgICogQHBhcmFtIG0wMiB0aGUgbTAyCi0gICAgICogQHBhcmFtIG0xMCB0aGUgbTEwCi0gICAgICogQHBhcmFtIG0xMSB0aGUgbTExCi0gICAgICogQHBhcmFtIG0xMiB0aGUgbTEyCi0gICAgICogQHBhcmFtIHNyYyB0aGUgc3JjCi0gICAgICogQHBhcmFtIHNyY1dpZHRoIHRoZSBzcmMgd2lkdGgKLSAgICAgKiBAcGFyYW0gc3JjSGVpZ2h0IHRoZSBzcmMgaGVpZ2h0Ci0gICAgICogQHBhcmFtIHNyY1N0cmlkZSB0aGUgc3JjIHN0cmlkZQotICAgICAqIEBwYXJhbSBkc3QgdGhlIGRzdAotICAgICAqIEBwYXJhbSBkc3RXaWR0aCB0aGUgZHN0IHdpZHRoCi0gICAgICogQHBhcmFtIGRzdEhlaWdodCB0aGUgZHN0IGhlaWdodAotICAgICAqIEBwYXJhbSBkc3RTdHJpZGUgdGhlIGRzdCBzdHJpZGUKLSAgICAgKiBAcGFyYW0gaVR5cGUgdGhlIGkgdHlwZQotICAgICAqIEBwYXJhbSBjaGFubmVscyB0aGUgY2hhbm5lbHMKLSAgICAgKiBAcGFyYW0gc2tpcENoYW5uZWwgdGhlIHNraXAgY2hhbm5lbAotICAgICAqIEBwYXJhbSBvZmZzZXRzIHRoZSBvZmZzZXRzCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW50CisgICAgICogQHBhcmFtIG0wMAorICAgICAqICAgICAgICAgICAgdGhlIG0wMC4KKyAgICAgKiBAcGFyYW0gbTAxCisgICAgICogICAgICAgICAgICB0aGUgbTAxLgorICAgICAqIEBwYXJhbSBtMDIKKyAgICAgKiAgICAgICAgICAgIHRoZSBtMDIuCisgICAgICogQHBhcmFtIG0xMAorICAgICAqICAgICAgICAgICAgdGhlIG0xMC4KKyAgICAgKiBAcGFyYW0gbTExCisgICAgICogICAgICAgICAgICB0aGUgbTExLgorICAgICAqIEBwYXJhbSBtMTIKKyAgICAgKiAgICAgICAgICAgIHRoZSBtMTIuCisgICAgICogQHBhcmFtIHNyYworICAgICAqICAgICAgICAgICAgdGhlIHNyYy4KKyAgICAgKiBAcGFyYW0gc3JjV2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcmMgd2lkdGguCisgICAgICogQHBhcmFtIHNyY0hlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIHNyYyBoZWlnaHQuCisgICAgICogQHBhcmFtIHNyY1N0cmlkZQorICAgICAqICAgICAgICAgICAgdGhlIHNyYyBzdHJpZGUuCisgICAgICogQHBhcmFtIGRzdAorICAgICAqICAgICAgICAgICAgdGhlIGRzdC4KKyAgICAgKiBAcGFyYW0gZHN0V2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBkc3Qgd2lkdGguCisgICAgICogQHBhcmFtIGRzdEhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGRzdCBoZWlnaHQuCisgICAgICogQHBhcmFtIGRzdFN0cmlkZQorICAgICAqICAgICAgICAgICAgdGhlIGRzdCBzdHJpZGUuCisgICAgICogQHBhcmFtIGlUeXBlCisgICAgICogICAgICAgICAgICB0aGUgaSB0eXBlLgorICAgICAqIEBwYXJhbSBjaGFubmVscworICAgICAqICAgICAgICAgICAgdGhlIGNoYW5uZWxzLgorICAgICAqIEBwYXJhbSBza2lwQ2hhbm5lbAorICAgICAqICAgICAgICAgICAgdGhlIHNraXAgY2hhbm5lbC4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0cworICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldHMuCisgICAgICogQHJldHVybiB0aGUgaW50LgogICAgICAqLwotICAgIHByaXZhdGUgbmF0aXZlIGludCBpcHBBZmZpbmVUcmFuc2Zvcm0oCi0gICAgICAgICAgICBkb3VibGUgbTAwLCBkb3VibGUgbTAxLAotICAgICAgICAgICAgZG91YmxlIG0wMiwgZG91YmxlIG0xMCwKLSAgICAgICAgICAgIGRvdWJsZSBtMTEsIGRvdWJsZSBtMTIsCi0gICAgICAgICAgICBPYmplY3Qgc3JjLCBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsIGludCBzcmNTdHJpZGUsCi0gICAgICAgICAgICBPYmplY3QgZHN0LCBpbnQgZHN0V2lkdGgsIGludCBkc3RIZWlnaHQsIGludCBkc3RTdHJpZGUsCi0gICAgICAgICAgICBpbnQgaVR5cGUsIGludCBjaGFubmVscywgYm9vbGVhbiBza2lwQ2hhbm5lbCwKLSAgICAgICAgICAgIGludCBvZmZzZXRzW10pOworICAgIHByaXZhdGUgbmF0aXZlIGludCBpcHBBZmZpbmVUcmFuc2Zvcm0oZG91YmxlIG0wMCwgZG91YmxlIG0wMSwgZG91YmxlIG0wMiwgZG91YmxlIG0xMCwKKyAgICAgICAgICAgIGRvdWJsZSBtMTEsIGRvdWJsZSBtMTIsIE9iamVjdCBzcmMsIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwgaW50IHNyY1N0cmlkZSwKKyAgICAgICAgICAgIE9iamVjdCBkc3QsIGludCBkc3RXaWR0aCwgaW50IGRzdEhlaWdodCwgaW50IGRzdFN0cmlkZSwgaW50IGlUeXBlLCBpbnQgY2hhbm5lbHMsCisgICAgICAgICAgICBib29sZWFuIHNraXBDaGFubmVsLCBpbnQgb2Zmc2V0c1tdKTsKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvQXJlYUF2ZXJhZ2luZ1NjYWxlRmlsdGVyLmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvQXJlYUF2ZXJhZ2luZ1NjYWxlRmlsdGVyLmphdmEKaW5kZXggZjQ5MzNkYi4uN2ZiMTM4ZSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL0FyZWFBdmVyYWdpbmdTY2FsZUZpbHRlci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9BcmVhQXZlcmFnaW5nU2NhbGVGaWx0ZXIuamF2YQpAQCAtMTgsNzIgKzE4LDEwMSBAQAogICogQGF1dGhvciBJZ29yIFYuIFN0b2x5YXJvdgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuaW1hZ2U7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogCi0KIC8qKgotICogVGhlIEFyZWFBdmVyYWdpbmdTY2FsZUZpbHRlciBjbGFzcyBzY2FsZXMgdGhlIHNvdXJjZSBpbWFnZSB1c2luZwotICogYXJlYSBhdmVyYWdpbmcgYWxnb3JpdGhtLiBUaGlzIGFsZ29yaXRobSBwcm92aWRlcyBhIHNvdXJjZSBpbWFnZQotICogd2l0aCBhIG5ldyBpbWFnZSBjb250YWluaW5nIHRoZSByZXNhbXBsZWQgaW1hZ2UuIAorICogVGhlIEFyZWFBdmVyYWdpbmdTY2FsZUZpbHRlciBjbGFzcyBzY2FsZXMgdGhlIHNvdXJjZSBpbWFnZSB1c2luZyBhcmVhCisgKiBhdmVyYWdpbmcgYWxnb3JpdGhtLiBUaGlzIGFsZ29yaXRobSBwcm92aWRlcyBhIHNvdXJjZSBpbWFnZSB3aXRoIGEgbmV3IGltYWdlCisgKiBjb250YWluaW5nIHRoZSByZXNhbXBsZWQgaW1hZ2UuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQXJlYUF2ZXJhZ2luZ1NjYWxlRmlsdGVyIGV4dGVuZHMgUmVwbGljYXRlU2NhbGVGaWx0ZXIgewogCi0gICAgLyoqIFRoZSBDb25zdGFudCByZ2JDTS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgcmdiQ00uCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29sb3JNb2RlbCByZ2JDTSA9IENvbG9yTW9kZWwuZ2V0UkdCZGVmYXVsdCgpOwotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgYXZlcmFnaW5nRmxhZ3MuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGF2ZXJhZ2luZ0ZsYWdzID0gKEltYWdlQ29uc3VtZXIuVE9QRE9XTkxFRlRSSUdIVCB8Ci0gICAgICAgICAgICBJbWFnZUNvbnN1bWVyLkNPTVBMRVRFU0NBTkxJTkVTKTsKIAotICAgIC8qKiBUaGUgcmVzZXQuICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHJlc2V0ID0gdHJ1ZTsgICAvLyBGbGFnIGZvciB1c2VkIHN1cGVyY2xhc3MgZmlsdGVyCi0gICAgCi0gICAgLyoqIFRoZSBpbml0ZWQuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IGF2ZXJhZ2luZ0ZsYWdzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBhdmVyYWdpbmdGbGFncyA9IChJbWFnZUNvbnN1bWVyLlRPUERPV05MRUZUUklHSFQgfCBJbWFnZUNvbnN1bWVyLkNPTVBMRVRFU0NBTkxJTkVTKTsKKworICAgIC8qKgorICAgICAqIFRoZSByZXNldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcmVzZXQgPSB0cnVlOyAvLyBGbGFnIGZvciB1c2VkIHN1cGVyY2xhc3MgZmlsdGVyCisKKyAgICAvKioKKyAgICAgKiBUaGUgaW5pdGVkLgorICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBpbml0ZWQgPSBmYWxzZTsgLy8gQWxsIGRhdGEgaW5pdGVkCiAKLSAgICAvKiogVGhlIHN1bV9yLiAqLworICAgIC8qKgorICAgICAqIFRoZSBzdW1fci4KKyAgICAgKi8KICAgICBwcml2YXRlIGludCBzdW1fcltdOyAvLyBBcnJheSBmb3IgYXZlcmFnZSBSZWQgc2FtcGxlcwotICAgIAotICAgIC8qKiBUaGUgc3VtX2cuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3VtX2cuCisgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgc3VtX2dbXTsgLy8gQXJyYXkgZm9yIGF2ZXJhZ2UgR3JlZW4gc2FtcGxlcwotICAgIAotICAgIC8qKiBUaGUgc3VtX2IuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3VtX2IuCisgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgc3VtX2JbXTsgLy8gQXJyYXkgZm9yIGF2ZXJhZ2UgQmx1ZSBzYW1wbGVzCi0gICAgCi0gICAgLyoqIFRoZSBzdW1fYS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBzdW1fYS4KKyAgICAgKi8KICAgICBwcml2YXRlIGludCBzdW1fYVtdOyAvLyBBcnJheSBmb3IgYXZlcmFnZSBBbHBoYSBzYW1wbGVzCiAKLSAgICAvKiogVGhlIGJ1ZmYuICovCi0gICAgcHJpdmF0ZSBpbnQgYnVmZltdOyAgLy8gU3RyaWRlIGJ1ZmZlcgotICAgIAotICAgIC8qKiBUaGUgYXZnIGZhY3Rvci4gKi8KLSAgICBwcml2YXRlIGludCBhdmdGYWN0b3I7ICAvLyBHbG9iYWwgYXZlcmFnaW5nIGZhY3RvcgotCi0gICAgLyoqIFRoZSBjYWNoZWQgZHkuICovCi0gICAgcHJpdmF0ZSBpbnQgY2FjaGVkRFk7ICAgICAgLy8gQ2FjaGVkIG51bWJlciBvZiB0aGUgZGVzdGluYXRpb24gc2NhbmxpbmUgCi0gICAgCi0gICAgLyoqIFRoZSBjYWNoZWQgZHYgcmVzdC4gKi8KLSAgICBwcml2YXRlIGludCBjYWNoZWREVlJlc3Q7ICAvLyBDYWNoZWQgdmFsdWUgb2YgcmVzdCBzcmMgc2NhbmxpbmVzIGZvciBzdW0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGl4ZWwgc2FtcGxlcyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCZWNhdXNlIGRhdGEgaWYgdHJhbnNmZXJpbmcgYnkgd2hvbGUgc2NhbmxpbmVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXJlIGNhY2hpbmcgb25seSBZIGNvb3JkaW5hdGUgdmFsdWVzCi0gICAgCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEFyZWFBdmVyYWdpbmdTY2FsZUZpbHRlciBvYmplY3Qgd2hpY2ggc2NhbGVzCi0gICAgICogYSBzb3VyY2UgaW1hZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHdpZHRoIGFuZCBoZWlnaHQuCisgICAgICogVGhlIGJ1ZmYuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgYnVmZltdOyAvLyBTdHJpZGUgYnVmZmVyCisKKyAgICAvKioKKyAgICAgKiBUaGUgYXZnIGZhY3Rvci4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBhdmdGYWN0b3I7IC8vIEdsb2JhbCBhdmVyYWdpbmcgZmFjdG9yCisKKyAgICAvKioKKyAgICAgKiBUaGUgY2FjaGVkIGR5LgorICAgICAqLworICAgIHByaXZhdGUgaW50IGNhY2hlZERZOyAvLyBDYWNoZWQgbnVtYmVyIG9mIHRoZSBkZXN0aW5hdGlvbiBzY2FubGluZQorCisgICAgLyoqCisgICAgICogVGhlIGNhY2hlZCBkdiByZXN0LgorICAgICAqLworICAgIHByaXZhdGUgaW50IGNhY2hlZERWUmVzdDsgLy8gQ2FjaGVkIHZhbHVlIG9mIHJlc3Qgc3JjIHNjYW5saW5lcyBmb3Igc3VtCisKKyAgICAvLyBwaXhlbCBzYW1wbGVzCisgICAgLy8gQmVjYXVzZSBkYXRhIGlmIHRyYW5zZmVycmluZyBieSB3aG9sZSBzY2FubGluZXMKKyAgICAvLyB3ZSBhcmUgY2FjaGluZyBvbmx5IFkgY29vcmRpbmF0ZSB2YWx1ZXMKKworICAgIC8qKgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBBcmVhQXZlcmFnaW5nU2NhbGVGaWx0ZXIgb2JqZWN0IHdoaWNoIHNjYWxlcyBhIHNvdXJjZQorICAgICAqIGltYWdlIHdpdGggdGhlIHNwZWNpZmllZCB3aWR0aCBhbmQgaGVpZ2h0LgogICAgICAqIAotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgc2NhbGVkIHdpZHRoIG9mIHRoZSBpbWFnZS4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBzY2FsZWQgaGVpZ2h0IG9mIHRoZSBpbWFnZS4KKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBzY2FsZWQgd2lkdGggb2YgdGhlIGltYWdlLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzY2FsZWQgaGVpZ2h0IG9mIHRoZSBpbWFnZS4KICAgICAgKi8KICAgICBwdWJsaWMgQXJlYUF2ZXJhZ2luZ1NjYWxlRmlsdGVyKGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICAgICAgICBzdXBlcih3aWR0aCwgaGVpZ2h0KTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIENvbG9yTW9kZWwgbW9kZWwsIGludFtdIHBpeGVscywgaW50IG9mZiwgaW50IHNjYW5zaXplKSB7Ci0gICAgICAgIGlmKHJlc2V0KSB7CisgICAgcHVibGljIHZvaWQgc2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBDb2xvck1vZGVsIG1vZGVsLCBpbnRbXSBwaXhlbHMsIGludCBvZmYsCisgICAgICAgICAgICBpbnQgc2NhbnNpemUpIHsKKyAgICAgICAgaWYgKHJlc2V0KSB7CiAgICAgICAgICAgICBzdXBlci5zZXRQaXhlbHMoeCwgeSwgdywgaCwgbW9kZWwsIHBpeGVscywgb2ZmLCBzY2Fuc2l6ZSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzZXRGaWx0ZXJlZFBpeGVscyh4LCB5LCB3LCBoLCBtb2RlbCwgcGl4ZWxzLCBvZmYsIHNjYW5zaXplKTsKQEAgLTkxLDggKzEyMCw5IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBDb2xvck1vZGVsIG1vZGVsLCBieXRlW10gcGl4ZWxzLCBpbnQgb2ZmLCBpbnQgc2NhbnNpemUpIHsKLSAgICAgICAgaWYocmVzZXQpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIENvbG9yTW9kZWwgbW9kZWwsIGJ5dGVbXSBwaXhlbHMsIGludCBvZmYsCisgICAgICAgICAgICBpbnQgc2NhbnNpemUpIHsKKyAgICAgICAgaWYgKHJlc2V0KSB7CiAgICAgICAgICAgICBzdXBlci5zZXRQaXhlbHMoeCwgeSwgdywgaCwgbW9kZWwsIHBpeGVscywgb2ZmLCBzY2Fuc2l6ZSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzZXRGaWx0ZXJlZFBpeGVscyh4LCB5LCB3LCBoLCBtb2RlbCwgcGl4ZWxzLCBvZmYsIHNjYW5zaXplKTsKQEAgLTEwNiwzNyArMTM2LDQ0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaW1wbGVtZW50cyB0aGUgQXJlYSBBdmVyYWdpbmcgU2NhbGUgZmlsdGVyLgotICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiBhbGdvcml0aG0gaXMgcHJlc2VudGVkIGluIEphdmEgQVBJIFNwZWNpZmljYXRpb24uCisgICAgICogVGhpcyBtZXRob2QgaW1wbGVtZW50cyB0aGUgQXJlYSBBdmVyYWdpbmcgU2NhbGUgZmlsdGVyLiBUaGUgZGVzY3JpcHRpb24KKyAgICAgKiBvZiBhbGdvcml0aG0gaXMgcHJlc2VudGVkIGluIEphdmEgQVBJIFNwZWNpZmljYXRpb24uIEFycmF5cyBzdW1fciwgc3VtX2csCisgICAgICogc3VtX2IsIHN1bV9hIGhhdmUgbGVuZ3RoIGVxdWFscyB3aWR0aCBvZiBkZXN0aW5hdGlvbiBpbWFnZS4gSW4gZWFjaAorICAgICAqIGFycmF5J3MgZWxlbWVudCBpcyBhY2N1bXVsYXRpbmcgcGl4ZWwncyBjb21wb25lbnQgdmFsdWVzLCBwcm9wb3J0aW9uYWwgdG8KKyAgICAgKiB0aGUgYXJlYSB3aGljaCBzb3VyY2UgcGl4ZWxzIHdpbGwgb2NjdXB5IGluIGRlc3RpbmF0aW9uIGltYWdlLiBUaGVuIHRoYXQKKyAgICAgKiB2YWx1ZXMgd2lsbCBkaXZpZGUgYnkgR2xvYmFsIGF2ZXJhZ2luZyBmYWN0b3IgKGFyZWEgb2YgdGhlIGRlc3RpbmF0aW9uCisgICAgICogaW1hZ2UpIGZvciByZWNlaXZpbmcgYXZlcmFnZSB2YWx1ZXMgb2YgZGVzdGluYXRpb24gcGl4ZWxzLgogICAgICAqIAotICAgICAqIEFycmF5cyBzdW1fciwgc3VtX2csIHN1bV9iLCBzdW1fYSBoYXZlIGxlbmd0aCBlcXVhbHMgd2lkdGggb2YgZGVzdGluYXRpb24KLSAgICAgKiBpbWFnZS4gSW4gZWFjaCBhcnJheSdzIGVsZW1lbnQgaXMgYWNjdW11bGF0aW5nIHBpeGVsJ3MgY29tcG9uZW50IHZhbHVlcywKLSAgICAgKiBwcm9wb3J0aW9uYWwgdG8gdGhlIGFyZWEgd2hpY2ggc291cmNlIHBpeGVscyB3aWxsIG9jY3VweSBpbiBkZXN0aW5hdGlvbgotICAgICAqIGltYWdlLiBUaGVuIHRoYXQgdmFsdWVzIHdpbGwgZGl2aWRlIGJ5IEdsb2JhbCBhdmVyYWdpbmcKLSAgICAgKiBmYWN0b3IgKGFyZWEgb2YgdGhlIGRlc3RpbmF0aW9uIGltYWdlKSBmb3IgcmVjZWl2aW5nCi0gICAgICogYXZlcmFnZSB2YWx1ZXMgb2YgZGVzdGluYXRpb24gcGl4ZWxzLgotICAgICAqIAotICAgICAqIEBwYXJhbSB4IC0gU3JjIHBpeGVscyBYIGNvb3JkaW5hdGUKLSAgICAgKiBAcGFyYW0geSAtIFNyYyBwaXhlbHMgWSBjb29yZGluYXRlCi0gICAgICogQHBhcmFtIHcgLSB3aWR0aCBvZiB0aGUgYXJlYSBvZiBTcmMgcGl4ZWxzCi0gICAgICogQHBhcmFtIGggLSBoZWlnaHQgb2YgdGhlIGFyZWEgb2YgU3JjIHBpeGVscwotICAgICAqIEBwYXJhbSBtb2RlbCAtIENvbG9yIE1vZGVsIG9mIFNyYyBwaXhlbHMKLSAgICAgKiBAcGFyYW0gcGl4ZWxzIC0gYXJyYXkgb2YgU3JjIHBpeGVscwotICAgICAqIEBwYXJhbSBvZmYgLSBvZmZzZXQgaW50byB0aGUgU3JjIHBpeGVscyBhcnJheQotICAgICAqIEBwYXJhbSBzY2Fuc2l6ZSAtIGxlbmd0aCBvZiBzY2FubGluZSBpbiB0aGUgcGl4ZWxzIGFycmF5CisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgcGl4ZWxzIFggY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBwaXhlbHMgWSBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGFyZWEgb2YgdGhlIHNvdXJjZSBwaXhlbHMuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIGFyZWEgb2YgdGhlIHNvdXJjZSBwaXhlbHMuCisgICAgICogQHBhcmFtIG1vZGVsCisgICAgICogICAgICAgICAgICB0aGUgY29sb3IgbW9kZWwgb2YgdGhlIHNvdXJjZSBwaXhlbHMuCisgICAgICogQHBhcmFtIHBpeGVscworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIHNvdXJjZSBwaXhlbHMuCisgICAgICogQHBhcmFtIG9mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbnRvIHRoZSBzb3VyY2UgcGl4ZWxzIGFycmF5LgorICAgICAqIEBwYXJhbSBzY2Fuc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiBzY2FubGluZSBpbiB0aGUgcGl4ZWxzIGFycmF5LgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRGaWx0ZXJlZFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgQ29sb3JNb2RlbCBtb2RlbCwgT2JqZWN0IHBpeGVscywgaW50IG9mZiwgaW50IHNjYW5zaXplKXsKLSAgICAgICAgaWYoIWluaXRlZCl7CisgICAgcHJpdmF0ZSB2b2lkIHNldEZpbHRlcmVkUGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBDb2xvck1vZGVsIG1vZGVsLCBPYmplY3QgcGl4ZWxzLAorICAgICAgICAgICAgaW50IG9mZiwgaW50IHNjYW5zaXplKSB7CisgICAgICAgIGlmICghaW5pdGVkKSB7CiAgICAgICAgICAgICBpbml0aWFsaXplKCk7CiAgICAgICAgIH0KIAogICAgICAgICBpbnQgc3JjWCwgc3JjWSwgZHgsIGR5OwogICAgICAgICBpbnQgc3ZSZXN0LCBkdlJlc3QsIHNoUmVzdCwgZGhSZXN0LCB2RGlmLCBoRGlmOwogCi0gICAgICAgIGlmKHkgPT0gMCl7CisgICAgICAgIGlmICh5ID09IDApIHsKICAgICAgICAgICAgIGR5ID0gMDsKICAgICAgICAgICAgIGR2UmVzdCA9IHNyY0hlaWdodDsKLSAgICAgICAgfWVsc2V7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBkeSA9IGNhY2hlZERZOwogICAgICAgICAgICAgZHZSZXN0ID0gY2FjaGVkRFZSZXN0OwogICAgICAgICB9CkBAIC0xNjYsOSArMjAzLDkgQEAKIAogICAgICAgICAgICAgICAgIGludCByZ2IsIHBpeDsKICAgICAgICAgICAgICAgICBpZiAocGl4ZWxzIGluc3RhbmNlb2YgaW50W10pIHsKLSAgICAgICAgICAgICAgICAgICAgcGl4ID0gKChpbnRbXSkgcGl4ZWxzKVtzcmNPZmYgKyBzcmNYXTsKKyAgICAgICAgICAgICAgICAgICAgcGl4ID0gKChpbnRbXSlwaXhlbHMpW3NyY09mZiArIHNyY1hdOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBpeCA9ICgoYnl0ZVtdKSBwaXhlbHMpW3NyY09mZiArIHNyY1hdICYgMHhmZjsKKyAgICAgICAgICAgICAgICAgICAgcGl4ID0gKChieXRlW10pcGl4ZWxzKVtzcmNPZmYgKyBzcmNYXSAmIDB4ZmY7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgcmdiID0gbW9kZWwuZ2V0UkdCKHBpeCk7CkBAIC0yMDgsNyArMjQ1LDcgQEAKIAogICAgICAgICAgICAgaWYgKGR2UmVzdCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgLy8gYXZlcmFnaW5nIGRlc3RpbmF0aW9uIHBpeGVsJ3MgdmFsdWVzCi0gICAgICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGRlc3RXaWR0aDsgaSsrKXsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc3RXaWR0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIGludCBhID0gKHN1bV9hW2ldIC8gYXZnRmFjdG9yKSAmIDB4ZmY7CiAgICAgICAgICAgICAgICAgICAgIGludCByID0gKHN1bV9yW2ldIC8gYXZnRmFjdG9yKSAmIDB4ZmY7CiAgICAgICAgICAgICAgICAgICAgIGludCBnID0gKHN1bV9nW2ldIC8gYXZnRmFjdG9yKSAmIDB4ZmY7CkBAIC0yMTYsOCArMjUzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaW50IGZyZ2IgPSAoYSA8PCAyNCkgfCAociA8PCAxNikgfCAoZyA8PCA4KSB8IGI7CiAgICAgICAgICAgICAgICAgICAgIGJ1ZmZbaV0gPSBmcmdiOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb25zdW1lci5zZXRQaXhlbHMoMCwgZHksIGRlc3RXaWR0aCwgMSwgcmdiQ00sIGJ1ZmYsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0V2lkdGgpOworICAgICAgICAgICAgICAgIGNvbnN1bWVyLnNldFBpeGVscygwLCBkeSwgZGVzdFdpZHRoLCAxLCByZ2JDTSwgYnVmZiwgMCwgZGVzdFdpZHRoKTsKICAgICAgICAgICAgICAgICBkeSsrOwogICAgICAgICAgICAgICAgIGR2UmVzdCA9IHNyY0hlaWdodDsKICAgICAgICAgICAgICAgICBBcnJheXMuZmlsbChzdW1fYSwgMCk7CkBAIC0yMzYsMTggKzI3MiwxNyBAQAogICAgIC8qKgogICAgICAqIEluaXRpYWxpemF0aW9uIG9mIHRoZSBhdXhpbGlhcnkgZGF0YS4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpeworICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewogCi0gICAgICAgIHN1bV9hID0gbmV3IGludFtkZXN0V2lkdGhdOyAKLSAgICAgICAgc3VtX3IgPSBuZXcgaW50W2Rlc3RXaWR0aF07IAotICAgICAgICBzdW1fZyA9IG5ldyBpbnRbZGVzdFdpZHRoXTsgCi0gICAgICAgIHN1bV9iID0gbmV3IGludFtkZXN0V2lkdGhdOyAKKyAgICAgICAgc3VtX2EgPSBuZXcgaW50W2Rlc3RXaWR0aF07CisgICAgICAgIHN1bV9yID0gbmV3IGludFtkZXN0V2lkdGhdOworICAgICAgICBzdW1fZyA9IG5ldyBpbnRbZGVzdFdpZHRoXTsKKyAgICAgICAgc3VtX2IgPSBuZXcgaW50W2Rlc3RXaWR0aF07CiAKLSAgICAgICAgYnVmZiA9IG5ldyBpbnRbZGVzdFdpZHRoXTsgIAorICAgICAgICBidWZmID0gbmV3IGludFtkZXN0V2lkdGhdOwogICAgICAgICBvdXRwaXhidWYgPSBidWZmOwotICAgICAgICBhdmdGYWN0b3IgPSBzcmNXaWR0aCAqIHNyY0hlaWdodDsgCisgICAgICAgIGF2Z0ZhY3RvciA9IHNyY1dpZHRoICogc3JjSGVpZ2h0OwogCiAgICAgICAgIGluaXRlZCA9IHRydWU7CiAgICAgfQogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvQXd0SW1hZ2VCYWNrZG9vckFjY2Vzc29ySW1wbC5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL0F3dEltYWdlQmFja2Rvb3JBY2Nlc3NvckltcGwuamF2YQppbmRleCBjZTg1ZGRkLi42ZGZmZWU4IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvQXd0SW1hZ2VCYWNrZG9vckFjY2Vzc29ySW1wbC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9Bd3RJbWFnZUJhY2tkb29yQWNjZXNzb3JJbXBsLmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKICAqIENyZWF0ZWQgb24gMjMuMTEuMjAwNQogICoKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmltYWdlOwogCiBpbXBvcnQgamF2YS5hd3QuSW1hZ2U7CkBAIC00MCw0MSArNDEsNDMgQEAKIC8qKgogICogVGhpcyBjbGFzcyBub3QgcGFydCBvZiBwdWJsaWMgQVBJLiBJdCB1c2VmdWwgZm9yIHJlY2VpdmluZyBwYWNrYWdlIHByaXZhdGUKICAqIGRhdGEgZnJvbSBvdGhlciBwYWNrYWdlcy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIGNsYXNzIEF3dEltYWdlQmFja2Rvb3JBY2Nlc3NvckltcGwgZXh0ZW5kcyBBd3RJbWFnZUJhY2tkb29yQWNjZXNzb3IgewogCi0gICAgc3RhdGljIHZvaWQgaW5pdCgpeworICAgIHN0YXRpYyB2b2lkIGluaXQoKSB7CiAgICAgICAgIGluc3QgPSBuZXcgQXd0SW1hZ2VCYWNrZG9vckFjY2Vzc29ySW1wbCgpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdXJmYWNlIGdldEltYWdlU3VyZmFjZShJbWFnZSBpbWFnZSkgewotICAgICAgICBpZiAoaW1hZ2UgaW5zdGFuY2VvZiBCdWZmZXJlZEltYWdlKXsKKyAgICAgICAgaWYgKGltYWdlIGluc3RhbmNlb2YgQnVmZmVyZWRJbWFnZSkgewogICAgICAgICAgICAgcmV0dXJuICgoQnVmZmVyZWRJbWFnZSlpbWFnZSkuZ2V0SW1hZ2VTdXJmYWNlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoaW1hZ2UgaW5zdGFuY2VvZiBHTFZvbGF0aWxlSW1hZ2UpeworICAgICAgICB9IGVsc2UgaWYgKGltYWdlIGluc3RhbmNlb2YgR0xWb2xhdGlsZUltYWdlKSB7CiAgICAgICAgICAgICByZXR1cm4gKChHTFZvbGF0aWxlSW1hZ2UpaW1hZ2UpLmdldEltYWdlU3VyZmFjZSgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzR3JheVBhbGxldGUoSW5kZXhDb2xvck1vZGVsIGljbSl7CisgICAgcHVibGljIGJvb2xlYW4gaXNHcmF5UGFsbGV0ZShJbmRleENvbG9yTW9kZWwgaWNtKSB7CiAgICAgICAgIHJldHVybiBpY20uaXNHcmF5UGFsbGV0ZSgpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPYmplY3QgZ2V0RGF0YShEYXRhQnVmZmVyIGRiKSB7Ci0gICAgICAgIGlmIChkYiBpbnN0YW5jZW9mIERhdGFCdWZmZXJCeXRlKXsKKyAgICAgICAgaWYgKGRiIGluc3RhbmNlb2YgRGF0YUJ1ZmZlckJ5dGUpIHsKICAgICAgICAgICAgIHJldHVybiAoKERhdGFCdWZmZXJCeXRlKWRiKS5nZXREYXRhKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGIgaW5zdGFuY2VvZiBEYXRhQnVmZmVyVVNob3J0KXsKKyAgICAgICAgfSBlbHNlIGlmIChkYiBpbnN0YW5jZW9mIERhdGFCdWZmZXJVU2hvcnQpIHsKICAgICAgICAgICAgIHJldHVybiAoKERhdGFCdWZmZXJVU2hvcnQpZGIpLmdldERhdGEoKTsKLSAgICAgICAgfSBlbHNlIGlmIChkYiBpbnN0YW5jZW9mIERhdGFCdWZmZXJTaG9ydCl7CisgICAgICAgIH0gZWxzZSBpZiAoZGIgaW5zdGFuY2VvZiBEYXRhQnVmZmVyU2hvcnQpIHsKICAgICAgICAgICAgIHJldHVybiAoKERhdGFCdWZmZXJTaG9ydClkYikuZ2V0RGF0YSgpOwotICAgICAgICB9IGVsc2UgaWYgKGRiIGluc3RhbmNlb2YgRGF0YUJ1ZmZlckludCl7CisgICAgICAgIH0gZWxzZSBpZiAoZGIgaW5zdGFuY2VvZiBEYXRhQnVmZmVySW50KSB7CiAgICAgICAgICAgICByZXR1cm4gKChEYXRhQnVmZmVySW50KWRiKS5nZXREYXRhKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGIgaW5zdGFuY2VvZiBEYXRhQnVmZmVyRmxvYXQpeworICAgICAgICB9IGVsc2UgaWYgKGRiIGluc3RhbmNlb2YgRGF0YUJ1ZmZlckZsb2F0KSB7CiAgICAgICAgICAgICByZXR1cm4gKChEYXRhQnVmZmVyRmxvYXQpZGIpLmdldERhdGEoKTsKLSAgICAgICAgfSBlbHNlIGlmIChkYiBpbnN0YW5jZW9mIERhdGFCdWZmZXJEb3VibGUpeworICAgICAgICB9IGVsc2UgaWYgKGRiIGluc3RhbmNlb2YgRGF0YUJ1ZmZlckRvdWJsZSkgewogICAgICAgICAgICAgcmV0dXJuICgoRGF0YUJ1ZmZlckRvdWJsZSlkYikuZ2V0RGF0YSgpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gYXd0LjIzNT1Xcm9uZyBEYXRhIEJ1ZmZlciB0eXBlIDogezB9CkBAIC04NSw3ICs4OCw3IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50W10gZ2V0RGF0YUludChEYXRhQnVmZmVyIGRiKSB7Ci0gICAgICAgIGlmIChkYiBpbnN0YW5jZW9mIERhdGFCdWZmZXJJbnQpeworICAgICAgICBpZiAoZGIgaW5zdGFuY2VvZiBEYXRhQnVmZmVySW50KSB7CiAgICAgICAgICAgICByZXR1cm4gKChEYXRhQnVmZmVySW50KWRiKS5nZXREYXRhKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGw7CkBAIC05Myw3ICs5Niw3IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYnl0ZVtdIGdldERhdGFCeXRlKERhdGFCdWZmZXIgZGIpIHsKLSAgICAgICAgaWYgKGRiIGluc3RhbmNlb2YgRGF0YUJ1ZmZlckJ5dGUpeworICAgICAgICBpZiAoZGIgaW5zdGFuY2VvZiBEYXRhQnVmZmVyQnl0ZSkgewogICAgICAgICAgICAgcmV0dXJuICgoRGF0YUJ1ZmZlckJ5dGUpZGIpLmdldERhdGEoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbDsKQEAgLTEwMSw3ICsxMDQsNyBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHNob3J0W10gZ2V0RGF0YVNob3J0KERhdGFCdWZmZXIgZGIpIHsKLSAgICAgICAgaWYgKGRiIGluc3RhbmNlb2YgRGF0YUJ1ZmZlclNob3J0KXsKKyAgICAgICAgaWYgKGRiIGluc3RhbmNlb2YgRGF0YUJ1ZmZlclNob3J0KSB7CiAgICAgICAgICAgICByZXR1cm4gKChEYXRhQnVmZmVyU2hvcnQpZGIpLmdldERhdGEoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbDsKQEAgLTEwOSw3ICsxMTIsNyBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHNob3J0W10gZ2V0RGF0YVVTaG9ydChEYXRhQnVmZmVyIGRiKSB7Ci0gICAgICAgIGlmIChkYiBpbnN0YW5jZW9mIERhdGFCdWZmZXJVU2hvcnQpeworICAgICAgICBpZiAoZGIgaW5zdGFuY2VvZiBEYXRhQnVmZmVyVVNob3J0KSB7CiAgICAgICAgICAgICByZXR1cm4gKChEYXRhQnVmZmVyVVNob3J0KWRiKS5nZXREYXRhKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGw7CkBAIC0xMTcsNyArMTIwLDcgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBkb3VibGVbXSBnZXREYXRhRG91YmxlKERhdGFCdWZmZXIgZGIpIHsKLSAgICAgICAgaWYgKGRiIGluc3RhbmNlb2YgRGF0YUJ1ZmZlckRvdWJsZSl7CisgICAgICAgIGlmIChkYiBpbnN0YW5jZW9mIERhdGFCdWZmZXJEb3VibGUpIHsKICAgICAgICAgICAgIHJldHVybiAoKERhdGFCdWZmZXJEb3VibGUpZGIpLmdldERhdGEoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbDsKQEAgLTEyNSw3ICsxMjgsNyBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZsb2F0W10gZ2V0RGF0YUZsb2F0KERhdGFCdWZmZXIgZGIpIHsKLSAgICAgICAgaWYgKGRiIGluc3RhbmNlb2YgRGF0YUJ1ZmZlckZsb2F0KXsKKyAgICAgICAgaWYgKGRiIGluc3RhbmNlb2YgRGF0YUJ1ZmZlckZsb2F0KSB7CiAgICAgICAgICAgICByZXR1cm4gKChEYXRhQnVmZmVyRmxvYXQpZGIpLmdldERhdGEoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbDsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9CYW5kQ29tYmluZU9wLmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvQmFuZENvbWJpbmVPcC5qYXZhCmluZGV4IGNkNzdhMjEuLmRhMmNjODkgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbWFnZS9CYW5kQ29tYmluZU9wLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL0JhbmRDb21iaW5lT3AuamF2YQpAQCAtMzIsODIgKzMyLDEyNCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFRoZSBCYW5kQ29tYmluZU9wIGNsYXNzIHRyYW5zbGF0ZXMgY29vcmRpbmF0ZXMgZnJvbSAKLSAqIGNvb3JkaW5hdGVzIGluIHRoZSBzb3VyY2UgUmFzdGVyIHRvIGNvb3JkaW5hdGVzIGluIAotICogdGhlIGRlc3RpbmF0aW9uIFJhc3RlciBieSBhbiBhcmJpdHJhcnkgbGluZWFyIGNvbWJpbmF0aW9uIAotICogb2YgdGhlIGJhbmRzIGluIGEgc291cmNlIFJhc3RlciwgdXNpbmcgYSBzcGVjaWZpZWQgbWF0cml4LgotICogVGhlIG51bWJlciBvZiBiYW5kcyBpbiB0aGUgbWF0cml4IHNob3VsZCBlcXVhbCB0byAKLSAqIHRoZSBudW1iZXIgb2YgYmFuZHMgaW4gdGhlIHNvdXJjZSBSYXN0ZXIgcGx1cyAxLgorICogVGhlIEJhbmRDb21iaW5lT3AgY2xhc3MgdHJhbnNsYXRlcyBjb29yZGluYXRlcyBmcm9tIGNvb3JkaW5hdGVzIGluIHRoZSBzb3VyY2UKKyAqIFJhc3RlciB0byBjb29yZGluYXRlcyBpbiB0aGUgZGVzdGluYXRpb24gUmFzdGVyIGJ5IGFuIGFyYml0cmFyeSBsaW5lYXIKKyAqIGNvbWJpbmF0aW9uIG9mIHRoZSBiYW5kcyBpbiBhIHNvdXJjZSBSYXN0ZXIsIHVzaW5nIGEgc3BlY2lmaWVkIG1hdHJpeC4gVGhlCisgKiBudW1iZXIgb2YgYmFuZHMgaW4gdGhlIG1hdHJpeCBzaG91bGQgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBiYW5kcyBpbiB0aGUKKyAqIHNvdXJjZSBSYXN0ZXIgcGx1cyAxLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEJhbmRDb21iaW5lT3AgaW1wbGVtZW50cyBSYXN0ZXJPcCB7Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBvZmZzZXRzM2MuICovCi0gICAgc3RhdGljIGZpbmFsIGludCBvZmZzZXRzM2NbXSA9IHsxNiwgOCwgMH07Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBvZmZzZXRzNGFjLiAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgb2Zmc2V0czRhY1tdID0gezE2LCA4LCAwLCAyNH07Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBtYXNrczNjLiAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgbWFza3MzY1tdID0gezB4RkYwMDAwLCAweEZGMDAsIDB4RkZ9OwotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgbWFza3M0YWMuICovCi0gICAgc3RhdGljIGZpbmFsIGludCBtYXNrczRhY1tdID0gezB4RkYwMDAwLCAweEZGMDAsIDB4RkYsIDB4RkYwMDAwMDB9OwotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgcGlPZmZzZXRzLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBwaU9mZnNldHNbXSA9IHswLCAxLCAyfTsKLSAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IHBpSW52T2Zmc2V0cy4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgcGlJbnZPZmZzZXRzW10gPSB7MiwgMSwgMH07CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFRZUEVfQllURTNDLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBvZmZzZXRzM2MuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBvZmZzZXRzM2NbXSA9IHsKKyAgICAgICAgICAgIDE2LCA4LCAwCisgICAgfTsKKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBvZmZzZXRzNGFjLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgb2Zmc2V0czRhY1tdID0geworICAgICAgICAgICAgMTYsIDgsIDAsIDI0CisgICAgfTsKKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBtYXNrczNjLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgbWFza3MzY1tdID0geworICAgICAgICAgICAgMHhGRjAwMDAsIDB4RkYwMCwgMHhGRgorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgbWFza3M0YWMuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBtYXNrczRhY1tdID0geworICAgICAgICAgICAgMHhGRjAwMDAsIDB4RkYwMCwgMHhGRiwgMHhGRjAwMDAwMAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgcGlPZmZzZXRzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBwaU9mZnNldHNbXSA9IHsKKyAgICAgICAgICAgIDAsIDEsIDIKKyAgICB9OworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IHBpSW52T2Zmc2V0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgcGlJbnZPZmZzZXRzW10gPSB7CisgICAgICAgICAgICAyLCAxLCAwCisgICAgfTsKKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX0JZVEUzQy4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9CWVRFM0MgPSAwOwotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgVFlQRV9CWVRFNEFDLiAqLworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfQllURTRBQy4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9CWVRFNEFDID0gMTsKLSAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IFRZUEVfVVNIT1JUM0MuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9VU0hPUlQzQy4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9VU0hPUlQzQyA9IDI7Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBUWVBFX1NIT1JUM0MuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9TSE9SVDNDLgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUWVBFX1NIT1JUM0MgPSAzOwogCi0gICAgLyoqIFRoZSBteCB3aWR0aC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgbXggd2lkdGguCisgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgbXhXaWR0aDsKLSAgICAKLSAgICAvKiogVGhlIG14IGhlaWdodC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBteCBoZWlnaHQuCisgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgbXhIZWlnaHQ7Ci0gICAgCi0gICAgLyoqIFRoZSBtYXRyaXguICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgbWF0cml4LgorICAgICAqLwogICAgIHByaXZhdGUgZmxvYXQgbWF0cml4W11bXTsKLSAgICAKLSAgICAvKiogVGhlIHIgaGludHMuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgciBoaW50cy4KKyAgICAgKi8KICAgICBwcml2YXRlIFJlbmRlcmluZ0hpbnRzIHJIaW50czsKIAogICAgIHN0YXRpYyB7CiAgICAgICAgIC8vIFhYWCAtIHRvZG8KLSAgICAgICAgLy9TeXN0ZW0ubG9hZExpYnJhcnkoImltYWdlb3BzIik7CisgICAgICAgIC8vIFN5c3RlbS5sb2FkTGlicmFyeSgiaW1hZ2VvcHMiKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQmFuZENvbWJpbmVPcCBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkCi0gICAgICogbWF0cml4LgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBCYW5kQ29tYmluZU9wIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgbWF0cml4LgogICAgICAqIAotICAgICAqIEBwYXJhbSBtYXRyaXggdGhlIHNwZWNpZmllZCBtYXRyaXggZm9yIGJhbmQgY29tYmluaW5nLgotICAgICAqIEBwYXJhbSBoaW50cyB0aGUgUmVuZGVyaW5nSGludHMuCisgICAgICogQHBhcmFtIG1hdHJpeAorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBtYXRyaXggZm9yIGJhbmQgY29tYmluaW5nLgorICAgICAqIEBwYXJhbSBoaW50cworICAgICAqICAgICAgICAgICAgdGhlIFJlbmRlcmluZ0hpbnRzLgogICAgICAqLwogICAgIHB1YmxpYyBCYW5kQ29tYmluZU9wKGZsb2F0IG1hdHJpeFtdW10sIFJlbmRlcmluZ0hpbnRzIGhpbnRzKSB7CiAgICAgICAgIHRoaXMubXhIZWlnaHQgPSBtYXRyaXgubGVuZ3RoOwogICAgICAgICB0aGlzLm14V2lkdGggPSBtYXRyaXhbMF0ubGVuZ3RoOwogICAgICAgICB0aGlzLm1hdHJpeCA9IG5ldyBmbG9hdFtteEhlaWdodF1bbXhXaWR0aF07CiAKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPG14SGVpZ2h0OyBpKyspeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG14SGVpZ2h0OyBpKyspIHsKICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobWF0cml4W2ldLCAwLCB0aGlzLm1hdHJpeFtpXSwgMCwgbXhXaWR0aCk7CiAgICAgICAgIH0KIAogICAgICAgICB0aGlzLnJIaW50cyA9IGhpbnRzOwogICAgIH0KIAotICAgIHB1YmxpYyBmaW5hbCBSZW5kZXJpbmdIaW50cyBnZXRSZW5kZXJpbmdIaW50cygpeworICAgIHB1YmxpYyBmaW5hbCBSZW5kZXJpbmdIaW50cyBnZXRSZW5kZXJpbmdIaW50cygpIHsKICAgICAgICAgcmV0dXJuIHRoaXMuckhpbnRzOwogICAgIH0KIApAQCAtMTE5LDE0ICsxNjEsMTQgQEAKICAgICBwdWJsaWMgZmluYWwgZmxvYXRbXVtdIGdldE1hdHJpeCgpIHsKICAgICAgICAgZmxvYXQgcmVzW11bXSA9IG5ldyBmbG9hdFtteEhlaWdodF1bbXhXaWR0aF07CiAKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPG14SGVpZ2h0OyBpKyspIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBteEhlaWdodDsgaSsrKSB7CiAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1hdHJpeFtpXSwgMCwgcmVzW2ldLCAwLCBteFdpZHRoKTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCi0gICAgcHVibGljIGZpbmFsIFBvaW50MkQgZ2V0UG9pbnQyRCAoUG9pbnQyRCBzcmNQb2ludCwgUG9pbnQyRCBkc3RQb2ludCkgeworICAgIHB1YmxpYyBmaW5hbCBQb2ludDJEIGdldFBvaW50MkQoUG9pbnQyRCBzcmNQb2ludCwgUG9pbnQyRCBkc3RQb2ludCkgewogICAgICAgICBpZiAoZHN0UG9pbnQgPT0gbnVsbCkgewogICAgICAgICAgICAgZHN0UG9pbnQgPSBuZXcgUG9pbnQyRC5GbG9hdCgpOwogICAgICAgICB9CkBAIC0xMzUsMTcgKzE3NywxOSBAQAogICAgICAgICByZXR1cm4gZHN0UG9pbnQ7CiAgICAgfQogCi0gICAgcHVibGljIGZpbmFsIFJlY3RhbmdsZTJEIGdldEJvdW5kczJEKFJhc3RlciBzcmMpeworICAgIHB1YmxpYyBmaW5hbCBSZWN0YW5nbGUyRCBnZXRCb3VuZHMyRChSYXN0ZXIgc3JjKSB7CiAgICAgICAgIHJldHVybiBzcmMuZ2V0Qm91bmRzKCk7CiAgICAgfQogCi0gICAgcHVibGljIFdyaXRhYmxlUmFzdGVyIGNyZWF0ZUNvbXBhdGlibGVEZXN0UmFzdGVyIChSYXN0ZXIgc3JjKSB7CisgICAgcHVibGljIFdyaXRhYmxlUmFzdGVyIGNyZWF0ZUNvbXBhdGlibGVEZXN0UmFzdGVyKFJhc3RlciBzcmMpIHsKICAgICAgICAgaW50IG51bUJhbmRzID0gc3JjLmdldE51bUJhbmRzKCk7Ci0gICAgICAgIGlmIChteFdpZHRoICE9IG51bUJhbmRzICYmIG14V2lkdGggIT0gKG51bUJhbmRzKzEpIHx8IG51bUJhbmRzICE9IG14SGVpZ2h0KSB7CisgICAgICAgIGlmIChteFdpZHRoICE9IG51bUJhbmRzICYmIG14V2lkdGggIT0gKG51bUJhbmRzICsgMSkgfHwgbnVtQmFuZHMgIT0gbXhIZWlnaHQpIHsKICAgICAgICAgICAgIC8vIGF3dC4yNTQ9TnVtYmVyIG9mIGJhbmRzIGluIHRoZSBzb3VyY2UgcmFzdGVyICh7MH0pIGlzCi0gICAgICAgICAgICAvLyAgICAgICAgICBpbmNvbXBhdGlibGUgd2l0aCB0aGUgbWF0cml4IFt7MX14ezJ9XQorICAgICAgICAgICAgLy8gaW5jb21wYXRpYmxlIHdpdGggdGhlIG1hdHJpeCBbezF9eHsyfV0KICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjU0IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117bnVtQmFuZHMsIG14V2lkdGgsIG14SGVpZ2h0fSkpOworICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUJhbmRzLCBteFdpZHRoLCBteEhlaWdodAorICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gc3JjLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3RlcihzcmMuZ2V0V2lkdGgoKSwgc3JjLmdldEhlaWdodCgpKTsKQEAgLTE1NCwyNyArMTk4LDMxIEBACiAgICAgcHVibGljIFdyaXRhYmxlUmFzdGVyIGZpbHRlcihSYXN0ZXIgc3JjLCBXcml0YWJsZVJhc3RlciBkc3QpIHsKICAgICAgICAgaW50IG51bUJhbmRzID0gc3JjLmdldE51bUJhbmRzKCk7CiAKLSAgICAgICAgaWYgKG14V2lkdGggIT0gbnVtQmFuZHMgJiYgbXhXaWR0aCAhPSAobnVtQmFuZHMrMSkpIHsKKyAgICAgICAgaWYgKG14V2lkdGggIT0gbnVtQmFuZHMgJiYgbXhXaWR0aCAhPSAobnVtQmFuZHMgKyAxKSkgewogICAgICAgICAgICAgLy8gYXd0LjI1ND1OdW1iZXIgb2YgYmFuZHMgaW4gdGhlIHNvdXJjZSByYXN0ZXIgKHswfSkgaXMKLSAgICAgICAgICAgIC8vICAgICAgICAgIGluY29tcGF0aWJsZSB3aXRoIHRoZSBtYXRyaXggW3sxfXh7Mn1dCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNTQiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXtudW1CYW5kcywgbXhXaWR0aCwgbXhIZWlnaHR9KSk7CisgICAgICAgICAgICAvLyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgbWF0cml4IFt7MX14ezJ9XQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNTQiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtQmFuZHMsIG14V2lkdGgsIG14SGVpZ2h0CisgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChkc3QgPT0gbnVsbCkgewogICAgICAgICAgICAgZHN0ID0gY3JlYXRlQ29tcGF0aWJsZURlc3RSYXN0ZXIoc3JjKTsKICAgICAgICAgfSBlbHNlIGlmIChkc3QuZ2V0TnVtQmFuZHMoKSAhPSBteEhlaWdodCkgewotICAgICAgICAgICAgLy8gYXd0LjI1NT1OdW1iZXIgb2YgYmFuZHMgaW4gdGhlIGRlc3RpbmF0aW9uIHJhc3RlciAoezB9KSBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgbWF0cml4IFt7MX14ezJ9XQorICAgICAgICAgICAgLy8gYXd0LjI1NT1OdW1iZXIgb2YgYmFuZHMgaW4gdGhlIGRlc3RpbmF0aW9uIHJhc3RlciAoezB9KSBpcworICAgICAgICAgICAgLy8gaW5jb21wYXRpYmxlIHdpdGggdGhlIG1hdHJpeCBbezF9eHsyfV0KICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjU1IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117ZHN0LmdldE51bUJhbmRzKCksIG14V2lkdGgsIG14SGVpZ2h0fSkpOworICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC5nZXROdW1CYW5kcygpLCBteFdpZHRoLCBteEhlaWdodAorICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBYWFggLSB0b2RvCi0gICAgICAgIC8vaWYgKGlwcEZpbHRlcihzcmMsIGRzdCkgIT0gMCkKKyAgICAgICAgLy8gaWYgKGlwcEZpbHRlcihzcmMsIGRzdCkgIT0gMCkKICAgICAgICAgaWYgKHZlcnlTbG93RmlsdGVyKHNyYywgZHN0KSAhPSAwKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjFGPVVuYWJsZSB0byB0cmFuc2Zvcm0gc291cmNlCi0gICAgICAgICAgICB0aHJvdyBuZXcgSW1hZ2luZ09wRXhjZXB0aW9uIChNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMUYiKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIHRocm93IG5ldyBJbWFnaW5nT3BFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjFGIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gZHN0OwpAQCAtMTg0LDIzICsyMzIsMjkgQEAKICAgICAgKiBUaGUgQ2xhc3MgU2FtcGxlTW9kZWxJbmZvLgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFNhbXBsZU1vZGVsSW5mbyB7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIGNoYW5uZWxzLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY2hhbm5lbHMuCisgICAgICAgICAqLwogICAgICAgICBpbnQgY2hhbm5lbHM7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIGNoYW5uZWxzIG9yZGVyLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY2hhbm5lbHMgb3JkZXIuCisgICAgICAgICAqLwogICAgICAgICBpbnQgY2hhbm5lbHNPcmRlcltdOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBzdHJpZGUuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzdHJpZGUuCisgICAgICAgICAqLwogICAgICAgICBpbnQgc3RyaWRlOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIENoZWNrIHNhbXBsZSBtb2RlbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc20gdGhlIHNtCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2FtcGxlIG1vZGVsIGluZm8KKyAgICAgKiBAcGFyYW0gc20KKyAgICAgKiAgICAgICAgICAgIHRoZSBzbS4KKyAgICAgKiBAcmV0dXJuIHRoZSBzYW1wbGUgbW9kZWwgaW5mby4KICAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIFNhbXBsZU1vZGVsSW5mbyBjaGVja1NhbXBsZU1vZGVsKFNhbXBsZU1vZGVsIHNtKSB7CiAgICAgICAgIFNhbXBsZU1vZGVsSW5mbyByZXQgPSBuZXcgU2FtcGxlTW9kZWxJbmZvKCk7CkBAIC0yMTIsMTIgKzI2NiwxMiBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXQuY2hhbm5lbHMgPSBzbS5nZXROdW1CYW5kcygpOwotICAgICAgICAgICAgcmV0LnN0cmlkZSA9ICgoQ29tcG9uZW50U2FtcGxlTW9kZWwpIHNtKS5nZXRTY2FubGluZVN0cmlkZSgpOwotICAgICAgICAgICAgcmV0LmNoYW5uZWxzT3JkZXIgPSAoKENvbXBvbmVudFNhbXBsZU1vZGVsKSBzbSkuZ2V0QmFuZE9mZnNldHMoKTsKKyAgICAgICAgICAgIHJldC5zdHJpZGUgPSAoKENvbXBvbmVudFNhbXBsZU1vZGVsKXNtKS5nZXRTY2FubGluZVN0cmlkZSgpOworICAgICAgICAgICAgcmV0LmNoYW5uZWxzT3JkZXIgPSAoKENvbXBvbmVudFNhbXBsZU1vZGVsKXNtKS5nZXRCYW5kT2Zmc2V0cygpOwogCiAgICAgICAgIH0gZWxzZSBpZiAoc20gaW5zdGFuY2VvZiBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKSB7CiAgICAgICAgICAgICAvLyBDaGVjayBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsCi0gICAgICAgICAgICBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIHNwcHNtMSA9IChTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKSBzbTsKKyAgICAgICAgICAgIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgc3Bwc20xID0gKFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwpc207CiAKICAgICAgICAgICAgIHJldC5jaGFubmVscyA9IHNwcHNtMS5nZXROdW1CYW5kcygpOwogICAgICAgICAgICAgaWYgKHNwcHNtMS5nZXREYXRhVHlwZSgpICE9IERhdGFCdWZmZXIuVFlQRV9JTlQpIHsKQEAgLTIyNSw3ICsyNzksNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBDaGVjayBzYW1wbGUgbW9kZWxzCi0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8cmV0LmNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmV0LmNoYW5uZWxzOyBpKyspIHsKICAgICAgICAgICAgICAgICBpZiAoc3Bwc20xLmdldFNhbXBsZVNpemUoaSkgIT0gOCkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICB9CkBAIC0yMzMsNyArMjg3LDcgQEAKIAogICAgICAgICAgICAgcmV0LmNoYW5uZWxzT3JkZXIgPSBuZXcgaW50W3JldC5jaGFubmVsc107CiAgICAgICAgICAgICBpbnQgYml0T2Zmc2V0c1tdID0gc3Bwc20xLmdldEJpdE9mZnNldHMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxyZXQuY2hhbm5lbHM7IGkrKykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXQuY2hhbm5lbHM7IGkrKykgewogICAgICAgICAgICAgICAgIGlmIChiaXRPZmZzZXRzW2ldICUgOCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgIH0KQEAgLTI1MywxMCArMzA3LDExIEBACiAgICAgLyoqCiAgICAgICogU2xvdyBmaWx0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNyYyB0aGUgc3JjCi0gICAgICogQHBhcmFtIGRzdCB0aGUgZHN0Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW50CisgICAgICogQHBhcmFtIHNyYworICAgICAqICAgICAgICAgICAgdGhlIHNyYy4KKyAgICAgKiBAcGFyYW0gZHN0CisgICAgICogICAgICAgICAgICB0aGUgZHN0LgorICAgICAqIEByZXR1cm4gdGhlIGludC4KICAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIGludCBzbG93RmlsdGVyKFJhc3RlciBzcmMsIFdyaXRhYmxlUmFzdGVyIGRzdCkgewogICAgICAgICBpbnQgcmVzID0gMDsKQEAgLTI3Miw4ICszMjcsOCBAQAogCiAgICAgICAgIC8vIEZpbGwgb2Zmc2V0cyBpZiB0aGVyZSdzIGEgY2hpbGQgcmFzdGVyCiAgICAgICAgIGlmIChzcmMuZ2V0UGFyZW50KCkgIT0gbnVsbCB8fCBkc3QuZ2V0UGFyZW50KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHNyYy5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVgoKSAhPSAwIHx8IHNyYy5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVkoKSAhPSAwIHx8Ci0gICAgICAgICAgICAgICAgICAgIGRzdC5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVgoKSAhPSAwIHx8IGRzdC5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVkoKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoc3JjLmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWCgpICE9IDAgfHwgc3JjLmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWSgpICE9IDAKKyAgICAgICAgICAgICAgICAgICAgfHwgZHN0LmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWCgpICE9IDAgfHwgZHN0LmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWSgpICE9IDApIHsKICAgICAgICAgICAgICAgICBvZmZzZXRzID0gbmV3IGludFs0XTsKICAgICAgICAgICAgICAgICBvZmZzZXRzWzBdID0gLXNyYy5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVgoKSArIHNyYy5nZXRNaW5YKCk7CiAgICAgICAgICAgICAgICAgb2Zmc2V0c1sxXSA9IC1zcmMuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVZKCkgKyBzcmMuZ2V0TWluWSgpOwpAQCAtMjgyLDIzICszMzcsMjIgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGludCBybXhXaWR0aCA9IChzcmNJbmZvLmNoYW5uZWxzKzEpOyAvLyB3aWR0aCBvZiB0aGUgcmVvcmRlcmVkIG1hdHJpeAotICAgICAgICBmbG9hdCByZW9yZGVyZWRNYXRyaXhbXSA9IG5ldyBmbG9hdFtybXhXaWR0aCpkc3RJbmZvLmNoYW5uZWxzXTsKLSAgICAgICAgZm9yIChpbnQgaj0wOyBqPGRzdEluZm8uY2hhbm5lbHM7IGorKykgeworICAgICAgICBpbnQgcm14V2lkdGggPSAoc3JjSW5mby5jaGFubmVscyArIDEpOyAvLyB3aWR0aCBvZiB0aGUgcmVvcmRlcmVkIG1hdHJpeAorICAgICAgICBmbG9hdCByZW9yZGVyZWRNYXRyaXhbXSA9IG5ldyBmbG9hdFtybXhXaWR0aCAqIGRzdEluZm8uY2hhbm5lbHNdOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGRzdEluZm8uY2hhbm5lbHM7IGorKykgewogICAgICAgICAgICAgaWYgKGogPj0gZHN0SW5mby5jaGFubmVsc09yZGVyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8c3JjSW5mby5jaGFubmVsczsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNyY0luZm8uY2hhbm5lbHM7IGkrKykgewogICAgICAgICAgICAgICAgIGlmIChpID49IHNyY0luZm8uY2hhbm5lbHNPcmRlci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgcmVvcmRlcmVkTWF0cml4W2RzdEluZm8uY2hhbm5lbHNPcmRlcltqXSpybXhXaWR0aCArIHNyY0luZm8uY2hhbm5lbHNPcmRlcltpXV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4W2pdW2ldOworICAgICAgICAgICAgICAgIHJlb3JkZXJlZE1hdHJpeFtkc3RJbmZvLmNoYW5uZWxzT3JkZXJbal0gKiBybXhXaWR0aCArIHNyY0luZm8uY2hhbm5lbHNPcmRlcltpXV0gPSBtYXRyaXhbal1baV07CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobXhXaWR0aCA9PSBybXhXaWR0aCkgewotICAgICAgICAgICAgICAgIHJlb3JkZXJlZE1hdHJpeFsoZHN0SW5mby5jaGFubmVsc09yZGVyW2pdKzEpKnJteFdpZHRoIC0gMV0gPSBtYXRyaXhbal1bbXhXaWR0aC0xXTsKKyAgICAgICAgICAgICAgICByZW9yZGVyZWRNYXRyaXhbKGRzdEluZm8uY2hhbm5lbHNPcmRlcltqXSArIDEpICogcm14V2lkdGggLSAxXSA9IG1hdHJpeFtqXVtteFdpZHRoIC0gMV07CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMzExLDExICszNjUsOSBAQAogICAgICAgICAgICAgcmV0dXJuIC0xOyAvLyBVbmtub3duIGRhdGEgYnVmZmVyIHR5cGUKICAgICAgICAgfQogCi0gICAgICAgIHNpbXBsZUNvbWJpbmVCYW5kcygKLSAgICAgICAgICAgICAgICBzcmNEYXRhLCBzcmMuZ2V0V2lkdGgoKSwgc3JjLmdldEhlaWdodCgpLCBzcmNJbmZvLnN0cmlkZSwgc3JjSW5mby5jaGFubmVscywKLSAgICAgICAgICAgICAgICBkc3REYXRhLCBkc3RJbmZvLnN0cmlkZSwgZHN0SW5mby5jaGFubmVscywKLSAgICAgICAgICAgICAgICByZW9yZGVyZWRNYXRyaXgsIG9mZnNldHMKLSAgICAgICAgKTsKKyAgICAgICAgc2ltcGxlQ29tYmluZUJhbmRzKHNyY0RhdGEsIHNyYy5nZXRXaWR0aCgpLCBzcmMuZ2V0SGVpZ2h0KCksIHNyY0luZm8uc3RyaWRlLAorICAgICAgICAgICAgICAgIHNyY0luZm8uY2hhbm5lbHMsIGRzdERhdGEsIGRzdEluZm8uc3RyaWRlLCBkc3RJbmZvLmNoYW5uZWxzLCByZW9yZGVyZWRNYXRyaXgsCisgICAgICAgICAgICAgICAgb2Zmc2V0cyk7CiAKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CkBAIC0zMjMsMTAgKzM3NSwxMSBAQAogICAgIC8qKgogICAgICAqIFZlcnkgc2xvdyBmaWx0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNyYyB0aGUgc3JjCi0gICAgICogQHBhcmFtIGRzdCB0aGUgZHN0Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW50CisgICAgICogQHBhcmFtIHNyYworICAgICAqICAgICAgICAgICAgdGhlIHNyYy4KKyAgICAgKiBAcGFyYW0gZHN0CisgICAgICogICAgICAgICAgICB0aGUgZHN0LgorICAgICAqIEByZXR1cm4gdGhlIGludC4KICAgICAgKi8KICAgICBwcml2YXRlIGludCB2ZXJ5U2xvd0ZpbHRlcihSYXN0ZXIgc3JjLCBXcml0YWJsZVJhc3RlciBkc3QpIHsKICAgICAgICAgaW50IG51bUJhbmRzID0gc3JjLmdldE51bUJhbmRzKCk7CkBAIC0zMzcsMzMgKzM5MCwzNSBAQAogICAgICAgICBpbnQgZHN0TWluWCA9IGRzdC5nZXRNaW5YKCk7CiAgICAgICAgIGludCBkc3RZID0gZHN0LmdldE1pblkoKTsKIAotICAgICAgICBpbnQgZFggPSBzcmMuZ2V0V2lkdGgoKTsvLzwgZHN0LmdldFdpZHRoKCkgPyBzcmMuZ2V0V2lkdGgoKSA6IGRzdC5nZXRXaWR0aCgpOwotICAgICAgICBpbnQgZFkgPSBzcmMuZ2V0SGVpZ2h0KCk7Ly88IGRzdC5nZXRIZWlnaHQoKSA/IHNyYy5nZXRIZWlnaHQoKSA6IGRzdC5nZXRIZWlnaHQoKTsKKyAgICAgICAgaW50IGRYID0gc3JjLmdldFdpZHRoKCk7Ly8gPCBkc3QuZ2V0V2lkdGgoKSA/IHNyYy5nZXRXaWR0aCgpIDoKKyAgICAgICAgLy8gZHN0LmdldFdpZHRoKCk7CisgICAgICAgIGludCBkWSA9IHNyYy5nZXRIZWlnaHQoKTsvLyA8IGRzdC5nZXRIZWlnaHQoKSA/IHNyYy5nZXRIZWlnaHQoKSA6CisgICAgICAgIC8vIGRzdC5nZXRIZWlnaHQoKTsKIAogICAgICAgICBmbG9hdCBzYW1wbGU7Ci0gICAgICAgIGludCBzcmNQaXhlbHNbXSA9IG5ldyBpbnRbbnVtQmFuZHMqZFgqZFldOwotICAgICAgICBpbnQgZHN0UGl4ZWxzW10gPSBuZXcgaW50W214SGVpZ2h0KmRYKmRZXTsKKyAgICAgICAgaW50IHNyY1BpeGVsc1tdID0gbmV3IGludFtudW1CYW5kcyAqIGRYICogZFldOworICAgICAgICBpbnQgZHN0UGl4ZWxzW10gPSBuZXcgaW50W214SGVpZ2h0ICogZFggKiBkWV07CiAKICAgICAgICAgc3JjUGl4ZWxzID0gc3JjLmdldFBpeGVscyhzcmNNaW5YLCBzcmNZLCBkWCwgZFksIHNyY1BpeGVscyk7CiAKICAgICAgICAgaWYgKG51bUJhbmRzID09IG14V2lkdGgpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MCwgaj0wOyBpPHNyY1BpeGVscy5sZW5ndGg7IGkrPW51bUJhbmRzKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaiA9IDA7IGkgPCBzcmNQaXhlbHMubGVuZ3RoOyBpICs9IG51bUJhbmRzKSB7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgZHN0QiA9IDA7IGRzdEIgPCBteEhlaWdodDsgZHN0QisrKSB7CiAgICAgICAgICAgICAgICAgICAgIHNhbXBsZSA9IDBmOwogICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBzcmNCID0gMDsgc3JjQiA8IG51bUJhbmRzOyBzcmNCKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZSArPSBtYXRyaXhbZHN0Ql1bc3JjQl0gKiBzcmNQaXhlbHNbaStzcmNCXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZSArPSBtYXRyaXhbZHN0Ql1bc3JjQl0gKiBzcmNQaXhlbHNbaSArIHNyY0JdOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRzdFBpeGVsc1tqKytdID0gKGludCkgc2FtcGxlOworICAgICAgICAgICAgICAgICAgICBkc3RQaXhlbHNbaisrXSA9IChpbnQpc2FtcGxlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MCwgaj0wOyBpPHNyY1BpeGVscy5sZW5ndGg7IGkrPW51bUJhbmRzKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaiA9IDA7IGkgPCBzcmNQaXhlbHMubGVuZ3RoOyBpICs9IG51bUJhbmRzKSB7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgZHN0QiA9IDA7IGRzdEIgPCBteEhlaWdodDsgZHN0QisrKSB7CiAgICAgICAgICAgICAgICAgICAgIHNhbXBsZSA9IDBmOwogICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBzcmNCID0gMDsgc3JjQiA8IG51bUJhbmRzOyBzcmNCKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZSArPSBtYXRyaXhbZHN0Ql1bc3JjQl0gKiBzcmNQaXhlbHNbaStzcmNCXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZSArPSBtYXRyaXhbZHN0Ql1bc3JjQl0gKiBzcmNQaXhlbHNbaSArIHNyY0JdOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRzdFBpeGVsc1tqKytdID0gKGludCkgKHNhbXBsZSArIG1hdHJpeFtkc3RCXVtudW1CYW5kc10pOworICAgICAgICAgICAgICAgICAgICBkc3RQaXhlbHNbaisrXSA9IChpbnQpKHNhbXBsZSArIG1hdHJpeFtkc3RCXVtudW1CYW5kc10pOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMzczLDE0ICs0MjgsMTUgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgLy9UT0RPIHJlbW92ZSB3aGVuIG1ldGhvZCBpcyB1c2VkCisgICAgLy8gVE9ETyByZW1vdmUgd2hlbiBtZXRob2QgaXMgdXNlZAogICAgIC8qKgogICAgICAqIElwcCBmaWx0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNyYyB0aGUgc3JjCi0gICAgICogQHBhcmFtIGRzdCB0aGUgZHN0Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW50CisgICAgICogQHBhcmFtIHNyYworICAgICAqICAgICAgICAgICAgdGhlIHNyYy4KKyAgICAgKiBAcGFyYW0gZHN0CisgICAgICogICAgICAgICAgICB0aGUgZHN0LgorICAgICAqIEByZXR1cm4gdGhlIGludC4KICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKICAgICBwcml2YXRlIGludCBpcHBGaWx0ZXIoUmFzdGVyIHNyYywgV3JpdGFibGVSYXN0ZXIgZHN0KSB7CkBAIC0zOTMsNTYgKzQ0OSwzOSBAQAogICAgICAgICBpbnQgc3JjQmFuZHMgPSBzcmMuZ2V0TnVtQmFuZHMoKTsKICAgICAgICAgaW50IGRzdEJhbmRzID0gZHN0LmdldE51bUJhbmRzKCk7CiAKLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgIGRzdEJhbmRzICE9IDMgfHwKLSAgICAgICAgICAgICAgICAoc3JjQmFuZHMgIT0gMyAmJgotICAgICAgICAgICAgICAgICEoc3JjQmFuZHMgPT0gNCAmJgotICAgICAgICAgICAgICAgICAgbWF0cml4WzBdWzNdID09IDAgJiYKLSAgICAgICAgICAgICAgICAgIG1hdHJpeFsxXVszXSA9PSAwICYmCi0gICAgICAgICAgICAgICAgICBtYXRyaXhbMl1bM10gPT0gMCkKLSAgICAgICAgICAgICAgICApCi0gICAgICAgICkgeworICAgICAgICBpZiAoZHN0QmFuZHMgIT0gMworICAgICAgICAgICAgICAgIHx8IChzcmNCYW5kcyAhPSAzICYmICEoc3JjQmFuZHMgPT0gNCAmJiBtYXRyaXhbMF1bM10gPT0gMCAmJiBtYXRyaXhbMV1bM10gPT0gMCAmJiBtYXRyaXhbMl1bM10gPT0gMCkpKSB7CiAgICAgICAgICAgICByZXR1cm4gc2xvd0ZpbHRlcihzcmMsIGRzdCk7CiAgICAgICAgIH0KIAogICAgICAgICBTYW1wbGVNb2RlbCBzcmNTTSA9IHNyYy5nZXRTYW1wbGVNb2RlbCgpOwogICAgICAgICBTYW1wbGVNb2RlbCBkc3RTTSA9IGRzdC5nZXRTYW1wbGVNb2RlbCgpOwogCi0gICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICBzcmNTTSBpbnN0YW5jZW9mIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgJiYKLSAgICAgICAgICAgICAgICBkc3RTTSBpbnN0YW5jZW9mIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwKLSAgICAgICAgKSB7CisgICAgICAgIGlmIChzcmNTTSBpbnN0YW5jZW9mIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwKKyAgICAgICAgICAgICAgICAmJiBkc3RTTSBpbnN0YW5jZW9mIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwpIHsKICAgICAgICAgICAgIC8vIENoZWNrIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwKLSAgICAgICAgICAgIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgc3Bwc20xID0gKFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwpIHNyY1NNOwotICAgICAgICAgICAgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCBzcHBzbTIgPSAoU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCkgZHN0U007CisgICAgICAgICAgICBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIHNwcHNtMSA9IChTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKXNyY1NNOworICAgICAgICAgICAgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCBzcHBzbTIgPSAoU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbClkc3RTTTsKIAotICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgICBzcHBzbTEuZ2V0RGF0YVR5cGUoKSAhPSBEYXRhQnVmZmVyLlRZUEVfSU5UIHx8Ci0gICAgICAgICAgICAgICAgICAgIHNwcHNtMi5nZXREYXRhVHlwZSgpICE9IERhdGFCdWZmZXIuVFlQRV9JTlQKLSAgICAgICAgICAgICkgeworICAgICAgICAgICAgaWYgKHNwcHNtMS5nZXREYXRhVHlwZSgpICE9IERhdGFCdWZmZXIuVFlQRV9JTlQKKyAgICAgICAgICAgICAgICAgICAgfHwgc3Bwc20yLmdldERhdGFUeXBlKCkgIT0gRGF0YUJ1ZmZlci5UWVBFX0lOVCkgewogICAgICAgICAgICAgICAgIHJldHVybiBzbG93RmlsdGVyKHNyYywgZHN0KTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gQ2hlY2sgc2FtcGxlIG1vZGVscwotICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgICAhQXJyYXlzLmVxdWFscyhzcHBzbTIuZ2V0Qml0T2Zmc2V0cygpLCBvZmZzZXRzM2MpIHx8Ci0gICAgICAgICAgICAgICAgICAgICFBcnJheXMuZXF1YWxzKHNwcHNtMi5nZXRCaXRNYXNrcygpLCBtYXNrczNjKQotICAgICAgICAgICAgKSB7CisgICAgICAgICAgICBpZiAoIUFycmF5cy5lcXVhbHMoc3Bwc20yLmdldEJpdE9mZnNldHMoKSwgb2Zmc2V0czNjKQorICAgICAgICAgICAgICAgICAgICB8fCAhQXJyYXlzLmVxdWFscyhzcHBzbTIuZ2V0Qml0TWFza3MoKSwgbWFza3MzYykpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gc2xvd0ZpbHRlcihzcmMsIGRzdCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChzcmNCYW5kcyA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgICAgICAgIUFycmF5cy5lcXVhbHMoc3Bwc20xLmdldEJpdE9mZnNldHMoKSwgb2Zmc2V0czNjKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgIUFycmF5cy5lcXVhbHMoc3Bwc20xLmdldEJpdE1hc2tzKCksIG1hc2tzM2MpCi0gICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKHNwcHNtMS5nZXRCaXRPZmZzZXRzKCksIG9mZnNldHMzYykKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFBcnJheXMuZXF1YWxzKHNwcHNtMS5nZXRCaXRNYXNrcygpLCBtYXNrczNjKSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2xvd0ZpbHRlcihzcmMsIGRzdCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmIChzcmNCYW5kcyA9PSA0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgICAgICAgIUFycmF5cy5lcXVhbHMoc3Bwc20xLmdldEJpdE9mZnNldHMoKSwgb2Zmc2V0czRhYykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICFBcnJheXMuZXF1YWxzKHNwcHNtMS5nZXRCaXRNYXNrcygpLCBtYXNrczRhYykKLSAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICBpZiAoIUFycmF5cy5lcXVhbHMoc3Bwc20xLmdldEJpdE9mZnNldHMoKSwgb2Zmc2V0czRhYykKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFBcnJheXMuZXF1YWxzKHNwcHNtMS5nZXRCaXRNYXNrcygpLCBtYXNrczRhYykpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNsb3dGaWx0ZXIoc3JjLCBkc3QpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTQ1MiwxMCArNDkxLDggQEAKIAogICAgICAgICAgICAgc3JjU3RyaWRlID0gc3Bwc20xLmdldFNjYW5saW5lU3RyaWRlKCkgKiA0OwogICAgICAgICAgICAgZHN0U3RyaWRlID0gc3Bwc20yLmdldFNjYW5saW5lU3RyaWRlKCkgKiA0OwotICAgICAgICB9IGVsc2UgaWYgKAotICAgICAgICAgICAgc3JjU00gaW5zdGFuY2VvZiBQaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwgJiYKLSAgICAgICAgICAgIGRzdFNNIGluc3RhbmNlb2YgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsCi0gICAgICAgICkgeworICAgICAgICB9IGVsc2UgaWYgKHNyY1NNIGluc3RhbmNlb2YgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsCisgICAgICAgICAgICAgICAgJiYgZHN0U00gaW5zdGFuY2VvZiBQaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwpIHsKICAgICAgICAgICAgIGlmIChzcmNCYW5kcyAhPSAzKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHNsb3dGaWx0ZXIoc3JjLCBkc3QpOwogICAgICAgICAgICAgfQpAQCAtNDc3LDE1ICs1MTQsMTIgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gQ2hlY2sgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsCi0gICAgICAgICAgICBQaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwgcGlzbTEgPSAoUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsKSBzcmNTTTsKLSAgICAgICAgICAgIFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbCBwaXNtMiA9IChQaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwpIGRzdFNNOworICAgICAgICAgICAgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsIHBpc20xID0gKFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbClzcmNTTTsKKyAgICAgICAgICAgIFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbCBwaXNtMiA9IChQaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwpZHN0U007CiAKLSAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICAgc3JjRGF0YVR5cGUgIT0gcGlzbTIuZ2V0RGF0YVR5cGUoKSB8fAotICAgICAgICAgICAgICAgICAgICBwaXNtMS5nZXRQaXhlbFN0cmlkZSgpICE9IDMgfHwKLSAgICAgICAgICAgICAgICAgICAgcGlzbTIuZ2V0UGl4ZWxTdHJpZGUoKSAhPSAzIHx8Ci0gICAgICAgICAgICAgICAgICAgICFBcnJheXMuZXF1YWxzKHBpc20xLmdldEJhbmRPZmZzZXRzKCksIHBpc20yLmdldEJhbmRPZmZzZXRzKCkpCi0gICAgICAgICAgICApIHsKKyAgICAgICAgICAgIGlmIChzcmNEYXRhVHlwZSAhPSBwaXNtMi5nZXREYXRhVHlwZSgpIHx8IHBpc20xLmdldFBpeGVsU3RyaWRlKCkgIT0gMworICAgICAgICAgICAgICAgICAgICB8fCBwaXNtMi5nZXRQaXhlbFN0cmlkZSgpICE9IDMKKyAgICAgICAgICAgICAgICAgICAgfHwgIUFycmF5cy5lcXVhbHMocGlzbTEuZ2V0QmFuZE9mZnNldHMoKSwgcGlzbTIuZ2V0QmFuZE9mZnNldHMoKSkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gc2xvd0ZpbHRlcihzcmMsIGRzdCk7CiAgICAgICAgICAgICB9CiAKQEAgLTUwNyw4ICs1NDEsOCBAQAogCiAgICAgICAgIC8vIEZpbGwgb2Zmc2V0cyBpZiB0aGVyZSdzIGEgY2hpbGQgcmFzdGVyCiAgICAgICAgIGlmIChzcmMuZ2V0UGFyZW50KCkgIT0gbnVsbCB8fCBkc3QuZ2V0UGFyZW50KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHNyYy5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVgoKSAhPSAwIHx8IHNyYy5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVkoKSAhPSAwIHx8Ci0gICAgICAgICAgICAgICBkc3QuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVYKCkgIT0gMCB8fCBkc3QuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVZKCkgIT0gMCkgeworICAgICAgICAgICAgaWYgKHNyYy5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVgoKSAhPSAwIHx8IHNyYy5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVkoKSAhPSAwCisgICAgICAgICAgICAgICAgICAgIHx8IGRzdC5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVgoKSAhPSAwIHx8IGRzdC5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVkoKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgb2Zmc2V0cyA9IG5ldyBpbnRbNF07CiAgICAgICAgICAgICAgICAgb2Zmc2V0c1swXSA9IC1zcmMuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVYKCkgKyBzcmMuZ2V0TWluWCgpOwogICAgICAgICAgICAgICAgIG9mZnNldHNbMV0gPSAtc3JjLmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWSgpICsgc3JjLmdldE1pblkoKTsKQEAgLTUzMiw3OSArNTY2LDkzIEBACiAgICAgICAgICAgICAvLyBJUFAgdHJlYXRzIGJpZyBlbmRpYW4gaW50ZWdlcnMgbGlrZSBCR1IsIHNvIHdlIGhhdmUgdG8KICAgICAgICAgICAgIC8vIHN3YXAgY29sdW1ucyAxIGFuZCAzIGFuZCByb3dzIDEgYW5kIDMKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXhIZWlnaHQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlwcE1hdHJpeFtpKjRdID0gbWF0cml4WzItaV1bMl07Ci0gICAgICAgICAgICAgICAgaXBwTWF0cml4W2kqNCsxXSA9IG1hdHJpeFsyLWldWzFdOwotICAgICAgICAgICAgICAgIGlwcE1hdHJpeFtpKjQrMl0gPSBtYXRyaXhbMi1pXVswXTsKKyAgICAgICAgICAgICAgICBpcHBNYXRyaXhbaSAqIDRdID0gbWF0cml4WzIgLSBpXVsyXTsKKyAgICAgICAgICAgICAgICBpcHBNYXRyaXhbaSAqIDQgKyAxXSA9IG1hdHJpeFsyIC0gaV1bMV07CisgICAgICAgICAgICAgICAgaXBwTWF0cml4W2kgKiA0ICsgMl0gPSBtYXRyaXhbMiAtIGldWzBdOwogCiAgICAgICAgICAgICAgICAgaWYgKG14V2lkdGggPT0gNCkgewotICAgICAgICAgICAgICAgICAgICBpcHBNYXRyaXhbaSo0KzNdID0gbWF0cml4WzItaV1bM107CisgICAgICAgICAgICAgICAgICAgIGlwcE1hdHJpeFtpICogNCArIDNdID0gbWF0cml4WzIgLSBpXVszXTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG14V2lkdGggPT0gNSkgewotICAgICAgICAgICAgICAgICAgICBpcHBNYXRyaXhbaSo0KzNdID0gbWF0cml4WzItaV1bNF07CisgICAgICAgICAgICAgICAgICAgIGlwcE1hdHJpeFtpICogNCArIDNdID0gbWF0cml4WzIgLSBpXVs0XTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG14SGVpZ2h0OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpcHBNYXRyaXhbaSo0XSA9IG1hdHJpeFtpXVswXTsKLSAgICAgICAgICAgICAgICBpcHBNYXRyaXhbaSo0KzFdID0gbWF0cml4W2ldWzFdOwotICAgICAgICAgICAgICAgIGlwcE1hdHJpeFtpKjQrMl0gPSBtYXRyaXhbaV1bMl07CisgICAgICAgICAgICAgICAgaXBwTWF0cml4W2kgKiA0XSA9IG1hdHJpeFtpXVswXTsKKyAgICAgICAgICAgICAgICBpcHBNYXRyaXhbaSAqIDQgKyAxXSA9IG1hdHJpeFtpXVsxXTsKKyAgICAgICAgICAgICAgICBpcHBNYXRyaXhbaSAqIDQgKyAyXSA9IG1hdHJpeFtpXVsyXTsKIAogICAgICAgICAgICAgICAgIGlmIChteFdpZHRoID09IDQpIHsKLSAgICAgICAgICAgICAgICAgICAgaXBwTWF0cml4W2kqNCszXSA9IG1hdHJpeFtpXVszXTsKKyAgICAgICAgICAgICAgICAgICAgaXBwTWF0cml4W2kgKiA0ICsgM10gPSBtYXRyaXhbaV1bM107CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChteFdpZHRoID09IDUpIHsKLSAgICAgICAgICAgICAgICAgICAgaXBwTWF0cml4W2kqNCszXSA9IG1hdHJpeFtpXVs0XTsKKyAgICAgICAgICAgICAgICAgICAgaXBwTWF0cml4W2kgKiA0ICsgM10gPSBtYXRyaXhbaV1bNF07CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIGlwcENvbG9yVHdpc3QoCi0gICAgICAgICAgICAgICAgc3JjRGF0YSwgc3JjLmdldFdpZHRoKCksIHNyYy5nZXRIZWlnaHQoKSwgc3JjU3RyaWRlLAotICAgICAgICAgICAgICAgIGRzdERhdGEsIGRzdC5nZXRXaWR0aCgpLCBkc3QuZ2V0SGVpZ2h0KCksIGRzdFN0cmlkZSwKLSAgICAgICAgICAgICAgICBpcHBNYXRyaXgsIHR5cGUsIG9mZnNldHMsIGluUGxhY2UpOworICAgICAgICByZXR1cm4gaXBwQ29sb3JUd2lzdChzcmNEYXRhLCBzcmMuZ2V0V2lkdGgoKSwgc3JjLmdldEhlaWdodCgpLCBzcmNTdHJpZGUsIGRzdERhdGEsIGRzdAorICAgICAgICAgICAgICAgIC5nZXRXaWR0aCgpLCBkc3QuZ2V0SGVpZ2h0KCksIGRzdFN0cmlkZSwgaXBwTWF0cml4LCB0eXBlLCBvZmZzZXRzLCBpblBsYWNlKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBJcHAgY29sb3IgdHdpc3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNyY0RhdGEgdGhlIHNyYyBkYXRhCi0gICAgICogQHBhcmFtIHNyY1dpZHRoIHRoZSBzcmMgd2lkdGgKLSAgICAgKiBAcGFyYW0gc3JjSGVpZ2h0IHRoZSBzcmMgaGVpZ2h0Ci0gICAgICogQHBhcmFtIHNyY1N0cmlkZSB0aGUgc3JjIHN0cmlkZQotICAgICAqIEBwYXJhbSBkc3REYXRhIHRoZSBkc3QgZGF0YQotICAgICAqIEBwYXJhbSBkc3RXaWR0aCB0aGUgZHN0IHdpZHRoCi0gICAgICogQHBhcmFtIGRzdEhlaWdodCB0aGUgZHN0IGhlaWdodAotICAgICAqIEBwYXJhbSBkc3RTdHJpZGUgdGhlIGRzdCBzdHJpZGUKLSAgICAgKiBAcGFyYW0gaXBwTWF0cml4IHRoZSBpcHAgbWF0cml4Ci0gICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUKLSAgICAgKiBAcGFyYW0gb2Zmc2V0cyB0aGUgb2Zmc2V0cwotICAgICAqIEBwYXJhbSBpblBsYWNlIHRoZSBpbiBwbGFjZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGludAorICAgICAqIEBwYXJhbSBzcmNEYXRhCisgICAgICogICAgICAgICAgICB0aGUgc3JjIGRhdGEuCisgICAgICogQHBhcmFtIHNyY1dpZHRoCisgICAgICogICAgICAgICAgICB0aGUgc3JjIHdpZHRoLgorICAgICAqIEBwYXJhbSBzcmNIZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcmMgaGVpZ2h0LgorICAgICAqIEBwYXJhbSBzcmNTdHJpZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcmMgc3RyaWRlLgorICAgICAqIEBwYXJhbSBkc3REYXRhCisgICAgICogICAgICAgICAgICB0aGUgZHN0IGRhdGEuCisgICAgICogQHBhcmFtIGRzdFdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgZHN0IHdpZHRoLgorICAgICAqIEBwYXJhbSBkc3RIZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBkc3QgaGVpZ2h0LgorICAgICAqIEBwYXJhbSBkc3RTdHJpZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkc3Qgc3RyaWRlLgorICAgICAqIEBwYXJhbSBpcHBNYXRyaXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpcHAgbWF0cml4LgorICAgICAqIEBwYXJhbSB0eXBlCisgICAgICogICAgICAgICAgICB0aGUgdHlwZS4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0cworICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldHMuCisgICAgICogQHBhcmFtIGluUGxhY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbiBwbGFjZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnQuCiAgICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgaW50IGlwcENvbG9yVHdpc3QoCi0gICAgICAgICAgICBPYmplY3Qgc3JjRGF0YSwgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LCBpbnQgc3JjU3RyaWRlLAotICAgICAgICAgICAgT2JqZWN0IGRzdERhdGEsIGludCBkc3RXaWR0aCwgaW50IGRzdEhlaWdodCwgaW50IGRzdFN0cmlkZSwKLSAgICAgICAgICAgIGZsb2F0IGlwcE1hdHJpeFtdLCBpbnQgdHlwZSwgaW50IG9mZnNldHNbXSwgYm9vbGVhbiBpblBsYWNlCi0gICAgKTsKKyAgICBwcml2YXRlIGZpbmFsIG5hdGl2ZSBpbnQgaXBwQ29sb3JUd2lzdChPYmplY3Qgc3JjRGF0YSwgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LAorICAgICAgICAgICAgaW50IHNyY1N0cmlkZSwgT2JqZWN0IGRzdERhdGEsIGludCBkc3RXaWR0aCwgaW50IGRzdEhlaWdodCwgaW50IGRzdFN0cmlkZSwKKyAgICAgICAgICAgIGZsb2F0IGlwcE1hdHJpeFtdLCBpbnQgdHlwZSwgaW50IG9mZnNldHNbXSwgYm9vbGVhbiBpblBsYWNlKTsKIAogICAgIC8qKgogICAgICAqIFNpbXBsZSBjb21iaW5lIGJhbmRzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzcmNEYXRhIHRoZSBzcmMgZGF0YQotICAgICAqIEBwYXJhbSBzcmNXaWR0aCB0aGUgc3JjIHdpZHRoCi0gICAgICogQHBhcmFtIHNyY0hlaWdodCB0aGUgc3JjIGhlaWdodAotICAgICAqIEBwYXJhbSBzcmNTdHJpZGUgdGhlIHNyYyBzdHJpZGUKLSAgICAgKiBAcGFyYW0gc3JjQ2hhbm5lbHMgdGhlIHNyYyBjaGFubmVscwotICAgICAqIEBwYXJhbSBkc3REYXRhIHRoZSBkc3QgZGF0YQotICAgICAqIEBwYXJhbSBkc3RTdHJpZGUgdGhlIGRzdCBzdHJpZGUKLSAgICAgKiBAcGFyYW0gZHN0Q2hhbm5lbHMgdGhlIGRzdCBjaGFubmVscwotICAgICAqIEBwYXJhbSBtIHRoZSBtCi0gICAgICogQHBhcmFtIG9mZnNldHMgdGhlIG9mZnNldHMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnQKKyAgICAgKiBAcGFyYW0gc3JjRGF0YQorICAgICAqICAgICAgICAgICAgdGhlIHNyYyBkYXRhLgorICAgICAqIEBwYXJhbSBzcmNXaWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHNyYyB3aWR0aC4KKyAgICAgKiBAcGFyYW0gc3JjSGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgc3JjIGhlaWdodC4KKyAgICAgKiBAcGFyYW0gc3JjU3RyaWRlCisgICAgICogICAgICAgICAgICB0aGUgc3JjIHN0cmlkZS4KKyAgICAgKiBAcGFyYW0gc3JjQ2hhbm5lbHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcmMgY2hhbm5lbHMuCisgICAgICogQHBhcmFtIGRzdERhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBkc3QgZGF0YS4KKyAgICAgKiBAcGFyYW0gZHN0U3RyaWRlCisgICAgICogICAgICAgICAgICB0aGUgZHN0IHN0cmlkZS4KKyAgICAgKiBAcGFyYW0gZHN0Q2hhbm5lbHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBkc3QgY2hhbm5lbHMuCisgICAgICogQHBhcmFtIG0KKyAgICAgKiAgICAgICAgICAgIHRoZSBtLgorICAgICAqIEBwYXJhbSBvZmZzZXRzCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0cy4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnQuCiAgICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgaW50IHNpbXBsZUNvbWJpbmVCYW5kcygKLSAgICAgICAgICAgIE9iamVjdCBzcmNEYXRhLCBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsIGludCBzcmNTdHJpZGUsIGludCBzcmNDaGFubmVscywKLSAgICAgICAgICAgIE9iamVjdCBkc3REYXRhLCBpbnQgZHN0U3RyaWRlLCBpbnQgZHN0Q2hhbm5lbHMsCi0gICAgICAgICAgICBmbG9hdCBtW10sIGludCBvZmZzZXRzW10KLSAgICApOworICAgIHByaXZhdGUgZmluYWwgbmF0aXZlIGludCBzaW1wbGVDb21iaW5lQmFuZHMoT2JqZWN0IHNyY0RhdGEsIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKKyAgICAgICAgICAgIGludCBzcmNTdHJpZGUsIGludCBzcmNDaGFubmVscywgT2JqZWN0IGRzdERhdGEsIGludCBkc3RTdHJpZGUsIGludCBkc3RDaGFubmVscywKKyAgICAgICAgICAgIGZsb2F0IG1bXSwgaW50IG9mZnNldHNbXSk7CiB9CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvQmFuZGVkU2FtcGxlTW9kZWwuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9CYW5kZWRTYW1wbGVNb2RlbC5qYXZhCmluZGV4IDM5MmU0NGMuLjBhYTMwZDcgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbWFnZS9CYW5kZWRTYW1wbGVNb2RlbC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9CYW5kZWRTYW1wbGVNb2RlbC5qYXZhCkBAIC0xOCwyNCArMTgsMjYgQEAKICAqIEBhdXRob3IgSWdvciBWLiBTdG9seWFyb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmltYWdlOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogVGhlIEJhbmRlZFNhbXBsZU1vZGVsIGNsYXNzIHByb3ZpZGVzIHNhbXBsZXMgb2YgcGl4ZWxzIGluIGFuIGltYWdlIAotICogd2hpY2ggaXMgc3RvcmVkIGluIGEgYmFuZCBpbnRlcmxlYXZlZCBtZXRob2QuIEVhY2ggcGl4ZWwncyBzYW1wbGUgCi0gKiB0YWtlcyBvbmUgZGF0YSBlbGVtZW50IG9mIHRoZSBEYXRhQnVmZmVyLiBUaGUgcGl4ZWwgc3RyaWRlIGZvciBhIAotICogQmFuZGVkU2FtcGxlTW9kZWwgaXMgb25lLiAKKyAqIFRoZSBCYW5kZWRTYW1wbGVNb2RlbCBjbGFzcyBwcm92aWRlcyBzYW1wbGVzIG9mIHBpeGVscyBpbiBhbiBpbWFnZSB3aGljaCBpcworICogc3RvcmVkIGluIGEgYmFuZCBpbnRlcmxlYXZlZCBtZXRob2QuIEVhY2ggcGl4ZWwncyBzYW1wbGUgdGFrZXMgb25lIGRhdGEKKyAqIGVsZW1lbnQgb2YgdGhlIERhdGFCdWZmZXIuIFRoZSBwaXhlbCBzdHJpZGUgZm9yIGEgQmFuZGVkU2FtcGxlTW9kZWwgaXMgb25lLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEJhbmRlZFNhbXBsZU1vZGVsIGV4dGVuZHMgQ29tcG9uZW50U2FtcGxlTW9kZWwgewogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyB0aGUgaW5kaWNlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbnVtQmFuZHMgdGhlIG51bSBiYW5kcwotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGludFtdCisgICAgICogQHBhcmFtIG51bUJhbmRzCisgICAgICogICAgICAgICAgICB0aGUgbnVtIGJhbmRzLgorICAgICAqIEByZXR1cm4gdGhlIGludFtdLgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGludFtdIGNyZWF0ZUluZGljZXMoaW50IG51bUJhbmRzKSB7CiAgICAgICAgIGludCBpbmRpY2VzW10gPSBuZXcgaW50W251bUJhbmRzXTsKQEAgLTQ4LDkgKzUwLDkgQEAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIHRoZSBvZmZzZXRzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBudW1CYW5kcyB0aGUgbnVtIGJhbmRzCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW50W10KKyAgICAgKiBAcGFyYW0gbnVtQmFuZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW0gYmFuZHMuCisgICAgICogQHJldHVybiB0aGUgaW50W10uCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgaW50W10gY3JlYXRlT2Zmc2V0cyhpbnQgbnVtQmFuZHMpIHsKICAgICAgICAgaW50IG9mZnNldHNbXSA9IG5ldyBpbnRbbnVtQmFuZHNdOwpAQCAtNjEsNDEgKzYzLDQ4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEJhbmRlZFNhbXBsZU1vZGVsIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgCi0gICAgICogZGF0YSB0eXBlIG9mIHNhbXBsZXMsIHRoZSB3aWR0aCwgaGVpZ2h0IGFuZCBiYW5kcyBudW1iZXIKLSAgICAgKiBvZiBpbWFnZSBkYXRhLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBCYW5kZWRTYW1wbGVNb2RlbCBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIGRhdGEgdHlwZQorICAgICAqIG9mIHNhbXBsZXMsIHRoZSB3aWR0aCwgaGVpZ2h0IGFuZCBiYW5kcyBudW1iZXIgb2YgaW1hZ2UgZGF0YS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YVR5cGUgdGhlIGRhdGEgdHlwZSBvZiBzYW1wbGVzLgotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiBpbWFnZSBkYXRhLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gbnVtQmFuZHMgdGhlIG51bWJlciBvZiBiYW5kcy4KKyAgICAgKiBAcGFyYW0gZGF0YVR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIHR5cGUgb2Ygc2FtcGxlcy4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gbnVtQmFuZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYmFuZHMuCiAgICAgICovCiAgICAgcHVibGljIEJhbmRlZFNhbXBsZU1vZGVsKGludCBkYXRhVHlwZSwgaW50IHcsIGludCBoLCBpbnQgbnVtQmFuZHMpIHsKLSAgICAgICAgdGhpcyhkYXRhVHlwZSwgdywgaCwgdywgQmFuZGVkU2FtcGxlTW9kZWwuY3JlYXRlSW5kaWNlcyhudW1CYW5kcyksCi0gICAgICAgICAgICAgICAgQmFuZGVkU2FtcGxlTW9kZWwuY3JlYXRlT2Zmc2V0cyhudW1CYW5kcykpOworICAgICAgICB0aGlzKGRhdGFUeXBlLCB3LCBoLCB3LCBCYW5kZWRTYW1wbGVNb2RlbC5jcmVhdGVJbmRpY2VzKG51bUJhbmRzKSwgQmFuZGVkU2FtcGxlTW9kZWwKKyAgICAgICAgICAgICAgICAuY3JlYXRlT2Zmc2V0cyhudW1CYW5kcykpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBCYW5kZWRTYW1wbGVNb2RlbCBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIAotICAgICAqIGRhdGEgdHlwZSBvZiBzYW1wbGVzLCB0aGUgd2lkdGgsIGhlaWdodCBhbmQgYmFuZHMgbnVtYmVyCi0gICAgICogb2YgaW1hZ2UgZGF0YS4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQmFuZGVkU2FtcGxlTW9kZWwgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBkYXRhIHR5cGUKKyAgICAgKiBvZiBzYW1wbGVzLCB0aGUgd2lkdGgsIGhlaWdodCBhbmQgYmFuZHMgbnVtYmVyIG9mIGltYWdlIGRhdGEuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFUeXBlIHRoZSBkYXRhIHR5cGUgb2Ygc2FtcGxlcy4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIGltYWdlIGRhdGEuCi0gICAgICogQHBhcmFtIHNjYW5saW5lU3RyaWRlIHRoZSBzY2FubGluZSBzdHJpZGUgb2YgdGhlIG9mIHRoZSBpbWFnZSBkYXRhLgotICAgICAqIEBwYXJhbSBiYW5rSW5kaWNlcyB0aGUgYXJyYXkgb2YgdGhlIGJhbmsgaW5kZWNpZXMuCi0gICAgICogQHBhcmFtIGJhbmRPZmZzZXRzIHRoZSBhcnJheSBvZiB0aGUgYmFuZCBvZmZzZXRzLgorICAgICAqIEBwYXJhbSBkYXRhVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgdHlwZSBvZiBzYW1wbGVzLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBzY2FubGluZVN0cmlkZQorICAgICAqICAgICAgICAgICAgdGhlIHNjYW5saW5lIHN0cmlkZSBvZiB0aGUgb2YgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIGJhbmtJbmRpY2VzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgdGhlIGJhbmsgaW5kaWNlcy4KKyAgICAgKiBAcGFyYW0gYmFuZE9mZnNldHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiB0aGUgYmFuZCBvZmZzZXRzLgogICAgICAqLwotICAgIHB1YmxpYyBCYW5kZWRTYW1wbGVNb2RlbChpbnQgZGF0YVR5cGUsIGludCB3LCBpbnQgaCwgaW50IHNjYW5saW5lU3RyaWRlLAotICAgICAgICAgICAgaW50IGJhbmtJbmRpY2VzW10sIGludCBiYW5kT2Zmc2V0c1tdKSB7CisgICAgcHVibGljIEJhbmRlZFNhbXBsZU1vZGVsKGludCBkYXRhVHlwZSwgaW50IHcsIGludCBoLCBpbnQgc2NhbmxpbmVTdHJpZGUsIGludCBiYW5rSW5kaWNlc1tdLAorICAgICAgICAgICAgaW50IGJhbmRPZmZzZXRzW10pIHsKICAgICAgICAgc3VwZXIoZGF0YVR5cGUsIHcsIGgsIDEsIHNjYW5saW5lU3RyaWRlLCBiYW5rSW5kaWNlcywgYmFuZE9mZnNldHMpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTYW1wbGVNb2RlbCBjcmVhdGVDb21wYXRpYmxlU2FtcGxlTW9kZWwoaW50IHcsIGludCBoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQmFuZGVkU2FtcGxlTW9kZWwoZGF0YVR5cGUsIHcsIGgsIHcsIGJhbmtJbmRpY2VzLAotICAgICAgICAgICAgICAgIGJhbmRPZmZzZXRzKTsKKyAgICAgICAgcmV0dXJuIG5ldyBCYW5kZWRTYW1wbGVNb2RlbChkYXRhVHlwZSwgdywgaCwgdywgYmFua0luZGljZXMsIGJhbmRPZmZzZXRzKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTEwNCwyMiArMTEzLDIyIEBACiAgICAgICAgIGludCBzaXplID0gc2NhbmxpbmVTdHJpZGUgKiBoZWlnaHQ7CiAKICAgICAgICAgc3dpdGNoIChkYXRhVHlwZSkgewotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgotICAgICAgICAgICAgZGF0YSA9IG5ldyBEYXRhQnVmZmVyQnl0ZShzaXplLCBudW1CYW5rcyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfU0hPUlQ6Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKLSAgICAgICAgICAgIGRhdGEgPSBuZXcgRGF0YUJ1ZmZlclNob3J0KHNpemUsIG51bUJhbmtzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6Ci0gICAgICAgICAgICBkYXRhID0gbmV3IERhdGFCdWZmZXJJbnQoc2l6ZSwgbnVtQmFua3MpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0ZMT0FUOgotICAgICAgICAgICAgZGF0YSA9IG5ldyBEYXRhQnVmZmVyRmxvYXQoc2l6ZSwgbnVtQmFua3MpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0RPVUJMRToKLSAgICAgICAgICAgIGRhdGEgPSBuZXcgRGF0YUJ1ZmZlckRvdWJsZShzaXplLCBudW1CYW5rcyk7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6CisgICAgICAgICAgICAgICAgZGF0YSA9IG5ldyBEYXRhQnVmZmVyQnl0ZShzaXplLCBudW1CYW5rcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9TSE9SVDoKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKKyAgICAgICAgICAgICAgICBkYXRhID0gbmV3IERhdGFCdWZmZXJTaG9ydChzaXplLCBudW1CYW5rcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6CisgICAgICAgICAgICAgICAgZGF0YSA9IG5ldyBEYXRhQnVmZmVySW50KHNpemUsIG51bUJhbmtzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0ZMT0FUOgorICAgICAgICAgICAgICAgIGRhdGEgPSBuZXcgRGF0YUJ1ZmZlckZsb2F0KHNpemUsIG51bUJhbmtzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0RPVUJMRToKKyAgICAgICAgICAgICAgICBkYXRhID0gbmV3IERhdGFCdWZmZXJEb3VibGUoc2l6ZSwgbnVtQmFua3MpOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIGRhdGE7CkBAIC0xMjksNyArMTM4LDggQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU2FtcGxlTW9kZWwgY3JlYXRlU3Vic2V0U2FtcGxlTW9kZWwoaW50W10gYmFuZHMpIHsKICAgICAgICAgaWYgKGJhbmRzLmxlbmd0aCA+IG51bUJhbmRzKSB7Ci0gICAgICAgICAgICAvLyBhd3QuNjQ9VGhlIG51bWJlciBvZiB0aGUgYmFuZHMgaW4gdGhlIHN1YnNldCBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBiYW5kcyBpbiB0aGUgc2FtcGxlIG1vZGVsCisgICAgICAgICAgICAvLyBhd3QuNjQ9VGhlIG51bWJlciBvZiB0aGUgYmFuZHMgaW4gdGhlIHN1YnNldCBpcyBncmVhdGVyIHRoYW4gdGhlCisgICAgICAgICAgICAvLyBudW1iZXIgb2YgYmFuZHMgaW4gdGhlIHNhbXBsZSBtb2RlbAogICAgICAgICAgICAgdGhyb3cgbmV3IFJhc3RlckZvcm1hdEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC42NCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKQEAgLTE0MSw5NCArMTUxLDkzIEBACiAgICAgICAgICAgICBvZmZzZXRzW2ldID0gYmFuZE9mZnNldHNbYmFuZHNbaV1dOwogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIG5ldyBCYW5kZWRTYW1wbGVNb2RlbChkYXRhVHlwZSwgd2lkdGgsIGhlaWdodCwgc2NhbmxpbmVTdHJpZGUsCi0gICAgICAgICAgICAgICAgaW5kaWNlcywgb2Zmc2V0cyk7CisgICAgICAgIHJldHVybiBuZXcgQmFuZGVkU2FtcGxlTW9kZWwoZGF0YVR5cGUsIHdpZHRoLCBoZWlnaHQsIHNjYW5saW5lU3RyaWRlLCBpbmRpY2VzLCBvZmZzZXRzKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgT2JqZWN0IGdldERhdGFFbGVtZW50cyhpbnQgeCwgaW50IHksIE9iamVjdCBvYmosIERhdGFCdWZmZXIgZGF0YSkgewogICAgICAgICBzd2l0Y2ggKGRhdGFUeXBlKSB7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6IHsKLSAgICAgICAgICAgIGJ5dGUgYmRhdGFbXTsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6IHsKKyAgICAgICAgICAgICAgICBieXRlIGJkYXRhW107CiAKLSAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJkYXRhID0gbmV3IGJ5dGVbbnVtQmFuZHNdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBiZGF0YSA9IChieXRlW10pIG9iajsKKyAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYmRhdGEgPSBuZXcgYnl0ZVtudW1CYW5kc107CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYmRhdGEgPSAoYnl0ZVtdKW9iajsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYmRhdGFbaV0gPSAoYnl0ZSlnZXRTYW1wbGUoeCwgeSwgaSwgZGF0YSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgb2JqID0gYmRhdGE7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9TSE9SVDoKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDogeworICAgICAgICAgICAgICAgIHNob3J0IHNkYXRhW107CiAKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykgewotICAgICAgICAgICAgICAgIGJkYXRhW2ldID0gKGJ5dGUpIGdldFNhbXBsZSh4LCB5LCBpLCBkYXRhKTsKKyAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2RhdGEgPSBuZXcgc2hvcnRbbnVtQmFuZHNdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNkYXRhID0gKHNob3J0W10pb2JqOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBzZGF0YVtpXSA9IChzaG9ydClnZXRTYW1wbGUoeCwgeSwgaSwgZGF0YSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgb2JqID0gc2RhdGE7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6IHsKKyAgICAgICAgICAgICAgICBpbnQgaWRhdGFbXTsKIAotICAgICAgICAgICAgb2JqID0gYmRhdGE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9TSE9SVDoKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOiB7Ci0gICAgICAgICAgICBzaG9ydCBzZGF0YVtdOworICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZGF0YSA9IG5ldyBpbnRbbnVtQmFuZHNdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlkYXRhID0gKGludFtdKW9iajsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNkYXRhID0gbmV3IHNob3J0W251bUJhbmRzXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2RhdGEgPSAoc2hvcnRbXSkgb2JqOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZGF0YVtpXSA9IGdldFNhbXBsZSh4LCB5LCBpLCBkYXRhKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBvYmogPSBpZGF0YTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0ZMT0FUOiB7CisgICAgICAgICAgICAgICAgZmxvYXQgZmRhdGFbXTsKIAotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc2RhdGFbaV0gPSAoc2hvcnQpIGdldFNhbXBsZSh4LCB5LCBpLCBkYXRhKTsKKyAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZmRhdGEgPSBuZXcgZmxvYXRbbnVtQmFuZHNdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZkYXRhID0gKGZsb2F0W10pb2JqOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmZGF0YVtpXSA9IGdldFNhbXBsZUZsb2F0KHgsIHksIGksIGRhdGEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG9iaiA9IGZkYXRhOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfRE9VQkxFOiB7CisgICAgICAgICAgICAgICAgZG91YmxlIGRkYXRhW107CiAKLSAgICAgICAgICAgIG9iaiA9IHNkYXRhOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOiB7Ci0gICAgICAgICAgICBpbnQgaWRhdGFbXTsKKyAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZGRhdGEgPSBuZXcgZG91YmxlW251bUJhbmRzXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkZGF0YSA9IChkb3VibGVbXSlvYmo7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZGF0YSA9IG5ldyBpbnRbbnVtQmFuZHNdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZGF0YSA9IChpbnRbXSkgb2JqOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBkZGF0YVtpXSA9IGdldFNhbXBsZURvdWJsZSh4LCB5LCBpLCBkYXRhKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBvYmogPSBkZGF0YTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWRhdGFbaV0gPSBnZXRTYW1wbGUoeCwgeSwgaSwgZGF0YSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG9iaiA9IGlkYXRhOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfRkxPQVQ6IHsKLSAgICAgICAgICAgIGZsb2F0IGZkYXRhW107Ci0KLSAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZkYXRhID0gbmV3IGZsb2F0W251bUJhbmRzXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmRhdGEgPSAoZmxvYXRbXSkgb2JqOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBmZGF0YVtpXSA9IGdldFNhbXBsZUZsb2F0KHgsIHksIGksIGRhdGEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBvYmogPSBmZGF0YTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0RPVUJMRTogewotICAgICAgICAgICAgZG91YmxlIGRkYXRhW107Ci0KLSAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRkYXRhID0gbmV3IGRvdWJsZVtudW1CYW5kc107Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRkYXRhID0gKGRvdWJsZVtdKSBvYmo7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykgewotICAgICAgICAgICAgICAgIGRkYXRhW2ldID0gZ2V0U2FtcGxlRG91YmxlKHgsIHksIGksIGRhdGEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBvYmogPSBkZGF0YTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gb2JqOwpAQCAtMjU3LDggKzI2Niw3IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjYzIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gZGF0YS5nZXRFbGVtKGJhbmtJbmRpY2VzW2JdLCB5ICogc2NhbmxpbmVTdHJpZGUgKyB4ICsKLSAgICAgICAgICAgICAgIGJhbmRPZmZzZXRzW2JdKTsKKyAgICAgICAgcmV0dXJuIGRhdGEuZ2V0RWxlbShiYW5rSW5kaWNlc1tiXSwgeSAqIHNjYW5saW5lU3RyaWRlICsgeCArIGJhbmRPZmZzZXRzW2JdKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTI2OCw4ICsyNzYsNyBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC42MyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIGRhdGEuZ2V0RWxlbURvdWJsZShiYW5rSW5kaWNlc1tiXSwgeSAqIHNjYW5saW5lU3RyaWRlICsgeCArCi0gICAgICAgICAgICAgICBiYW5kT2Zmc2V0c1tiXSk7CisgICAgICAgIHJldHVybiBkYXRhLmdldEVsZW1Eb3VibGUoYmFua0luZGljZXNbYl0sIHkgKiBzY2FubGluZVN0cmlkZSArIHggKyBiYW5kT2Zmc2V0c1tiXSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0yNzksMTMgKzI4NiwxMSBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC42MyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIGRhdGEuZ2V0RWxlbUZsb2F0KGJhbmtJbmRpY2VzW2JdLCB5ICogc2NhbmxpbmVTdHJpZGUgKyB4ICsKLSAgICAgICAgICAgICAgIGJhbmRPZmZzZXRzW2JdKTsKKyAgICAgICAgcmV0dXJuIGRhdGEuZ2V0RWxlbUZsb2F0KGJhbmtJbmRpY2VzW2JdLCB5ICogc2NhbmxpbmVTdHJpZGUgKyB4ICsgYmFuZE9mZnNldHNbYl0pOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnRbXSBnZXRTYW1wbGVzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgYiwgaW50IGlBcnJheVtdLAotICAgICAgICAgICAgRGF0YUJ1ZmZlciBkYXRhKSB7CisgICAgcHVibGljIGludFtdIGdldFNhbXBsZXMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBiLCBpbnQgaUFycmF5W10sIERhdGFCdWZmZXIgZGF0YSkgewogICAgICAgICBpbnQgc2FtcGxlc1tdOwogICAgICAgICBpbnQgaWR4ID0gMDsKIApAQCAtMzE3LDQxICszMjIsNDEgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXREYXRhRWxlbWVudHMoaW50IHgsIGludCB5LCBPYmplY3Qgb2JqLCBEYXRhQnVmZmVyIGRhdGEpIHsKICAgICAgICAgc3dpdGNoIChkYXRhVHlwZSkgewotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgotICAgICAgICAgICAgYnl0ZSBiZGF0YVtdID0gKGJ5dGVbXSkgb2JqOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc2V0U2FtcGxlKHgsIHksIGksIGJkYXRhW2ldICYgMHhmZiwgZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6CisgICAgICAgICAgICAgICAgYnl0ZSBiZGF0YVtdID0gKGJ5dGVbXSlvYmo7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHNldFNhbXBsZSh4LCB5LCBpLCBiZGF0YVtpXSAmIDB4ZmYsIGRhdGEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9TSE9SVDoKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgotICAgICAgICAgICAgc2hvcnQgc2RhdGFbXSA9IChzaG9ydFtdKSBvYmo7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBzZXRTYW1wbGUoeCwgeSwgaSwgc2RhdGFbaV0gJiAweGZmZmYsIGRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9TSE9SVDoKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKKyAgICAgICAgICAgICAgICBzaG9ydCBzZGF0YVtdID0gKHNob3J0W10pb2JqOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBzZXRTYW1wbGUoeCwgeSwgaSwgc2RhdGFbaV0gJiAweGZmZmYsIGRhdGEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6Ci0gICAgICAgICAgICBpbnQgaWRhdGFbXSA9IChpbnRbXSkgb2JqOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc2V0U2FtcGxlKHgsIHksIGksIGlkYXRhW2ldLCBkYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgorICAgICAgICAgICAgICAgIGludCBpZGF0YVtdID0gKGludFtdKW9iajsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0U2FtcGxlKHgsIHksIGksIGlkYXRhW2ldLCBkYXRhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfRkxPQVQ6Ci0gICAgICAgICAgICBmbG9hdCBmZGF0YVtdID0gKGZsb2F0W10pIG9iajsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykgewotICAgICAgICAgICAgICAgIHNldFNhbXBsZSh4LCB5LCBpLCBmZGF0YVtpXSwgZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0ZMT0FUOgorICAgICAgICAgICAgICAgIGZsb2F0IGZkYXRhW10gPSAoZmxvYXRbXSlvYmo7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHNldFNhbXBsZSh4LCB5LCBpLCBmZGF0YVtpXSwgZGF0YSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0RPVUJMRToKLSAgICAgICAgICAgIGRvdWJsZSBkZGF0YVtdID0gKGRvdWJsZVtdKSBvYmo7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBzZXRTYW1wbGUoeCwgeSwgaSwgZGRhdGFbaV0sIGRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9ET1VCTEU6CisgICAgICAgICAgICAgICAgZG91YmxlIGRkYXRhW10gPSAoZG91YmxlW10pb2JqOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBzZXRTYW1wbGUoeCwgeSwgaSwgZGRhdGFbaV0sIGRhdGEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzYzLDggKzM2OCw3IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgaUFycmF5W10sCi0gICAgICAgICAgICBEYXRhQnVmZmVyIGRhdGEpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBpQXJyYXlbXSwgRGF0YUJ1ZmZlciBkYXRhKSB7CiAgICAgICAgIGludCBpZHggPSAwOwogCiAgICAgICAgIGZvciAoaW50IGkgPSB5OyBpIDwgeSArIGg7IGkrKykgewpAQCAtMzgzLDggKzM4Nyw3IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjYzIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICBkYXRhLnNldEVsZW1Eb3VibGUoYmFua0luZGljZXNbYl0sIHkgKiBzY2FubGluZVN0cmlkZSArIHggKwotICAgICAgICAgICAgICAgYmFuZE9mZnNldHNbYl0sIHMpOworICAgICAgICBkYXRhLnNldEVsZW1Eb3VibGUoYmFua0luZGljZXNbYl0sIHkgKiBzY2FubGluZVN0cmlkZSArIHggKyBiYW5kT2Zmc2V0c1tiXSwgcyk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0zOTQsOCArMzk3LDcgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNjMiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCi0gICAgICAgIGRhdGEuc2V0RWxlbUZsb2F0KGJhbmtJbmRpY2VzW2JdLCB5ICogc2NhbmxpbmVTdHJpZGUgKyB4ICsKLSAgICAgICAgICAgICAgIGJhbmRPZmZzZXRzW2JdLCBzKTsKKyAgICAgICAgZGF0YS5zZXRFbGVtRmxvYXQoYmFua0luZGljZXNbYl0sIHkgKiBzY2FubGluZVN0cmlkZSArIHggKyBiYW5kT2Zmc2V0c1tiXSwgcyk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC00MDUsMTMgKzQwNywxMSBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC42MyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgZGF0YS5zZXRFbGVtKGJhbmtJbmRpY2VzW2JdLCB5ICogc2NhbmxpbmVTdHJpZGUgKyB4ICsKLSAgICAgICAgICAgICAgICAgICAgICAgYmFuZE9mZnNldHNbYl0sIHMpOworICAgICAgICBkYXRhLnNldEVsZW0oYmFua0luZGljZXNbYl0sIHkgKiBzY2FubGluZVN0cmlkZSArIHggKyBiYW5kT2Zmc2V0c1tiXSwgcyk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U2FtcGxlcyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGIsIGludCBpQXJyYXlbXSwKLSAgICAgICAgICAgIERhdGFCdWZmZXIgZGF0YSkgeworICAgIHB1YmxpYyB2b2lkIHNldFNhbXBsZXMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBiLCBpbnQgaUFycmF5W10sIERhdGFCdWZmZXIgZGF0YSkgewogICAgICAgICBpbnQgaWR4ID0gMDsKIAogICAgICAgICBmb3IgKGludCBpID0geTsgaSA8IHkgKyBoOyBpKyspIHsKQEAgLTQyMyw0ICs0MjMsMyBAQAogICAgIH0KIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvQnVmZmVyU3RyYXRlZ3kuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9CdWZmZXJTdHJhdGVneS5qYXZhCmluZGV4IGUwNTA4ZjAuLjNjODc3OWQgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbWFnZS9CdWZmZXJTdHJhdGVneS5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9CdWZmZXJTdHJhdGVneS5qYXZhCkBAIC0xOCwzNSArMTgsMzcgQEAKICAqIEBhdXRob3IgSWdvciBWLiBTdG9seWFyb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmltYWdlOwogCiBpbXBvcnQgamF2YS5hd3QuQnVmZmVyQ2FwYWJpbGl0aWVzOwogaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzOwogCiAvKioKLSAqIFRoZSBCdWZmZXJTdHJhdGVneSBhYnN0cmFjdCBjbGFzcyBwcm92aWRlcyBhbiBvcHBvcnR1bml0eSAKLSAqIHRvIG9yZ2FuaXplIHRoZSBidWZmZXJzIGZvciBhIENhbnZhcyBvciBXaW5kb3cuIFRoZSBCdWZmZXJTdHJhdGVneQotICogaW1wbGVtZW50YXRpb24gZGVwZW5kcyBvbiBoYXJkd2FyZSBhbmQgc29mdHdhcmUgbGltaXRhdGlvbnMuCi0gKiBUaGVzZSBsaW1pdGF0aW9ucyBhcmUgZGV0ZWN0aWJsZSB0aHJvdWdoIHRoZSBjYXBhYmlsaXRpZXMgCi0gKiBvYmplY3Qgd2hpY2ggY2FuIGJlIG9idGFpbmVkIGJ5IHRoZSBHcmFwaGljc0NvbmZpZ3VyYXRpb24gb2YgdGhlIENhbnZhcyAKLSAqIG9yIFdpbmRvdy4KKyAqIFRoZSBCdWZmZXJTdHJhdGVneSBhYnN0cmFjdCBjbGFzcyBwcm92aWRlcyBhbiBvcHBvcnR1bml0eSB0byBvcmdhbml6ZSB0aGUKKyAqIGJ1ZmZlcnMgZm9yIGEgQ2FudmFzIG9yIFdpbmRvdy4gVGhlIEJ1ZmZlclN0cmF0ZWd5IGltcGxlbWVudGF0aW9uIGRlcGVuZHMgb24KKyAqIGhhcmR3YXJlIGFuZCBzb2Z0d2FyZSBsaW1pdGF0aW9ucy4gVGhlc2UgbGltaXRhdGlvbnMgYXJlIGRldGVjdGFibGUgdGhyb3VnaAorICogdGhlIGNhcGFiaWxpdGllcyBvYmplY3Qgd2hpY2ggY2FuIGJlIG9idGFpbmVkIGJ5IHRoZSBHcmFwaGljc0NvbmZpZ3VyYXRpb24gb2YKKyAqIHRoZSBDYW52YXMgb3IgV2luZG93LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEJ1ZmZlclN0cmF0ZWd5IHsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZHJhd2luZyBidWZmZXIgd2FzIGxvc3Qgc2luY2UgdGhlIGxhc3QgY2FsbCAKLSAgICAgKiBvZiBnZXREcmF3R3JhcGhpY3MuIAorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZHJhd2luZyBidWZmZXIgd2FzIGxvc3Qgc2luY2UgdGhlIGxhc3QgY2FsbCBvZgorICAgICAqIGdldERyYXdHcmFwaGljcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRyYXdpbmcgYnVmZmVyIHdhcyBsb3N0IHNpbmNlIHRoZSBsYXN0IGNhbGwgCi0gICAgICogb2YgZ2V0RHJhd0dyYXBoaWNzLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBkcmF3aW5nIGJ1ZmZlciB3YXMgbG9zdCBzaW5jZSB0aGUgbGFzdCBjYWxsIG9mCisgICAgICogICAgICAgICBnZXREcmF3R3JhcGhpY3MsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBjb250ZW50c0xvc3QoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZHJhd2luZyBidWZmZXIgaXMgcmVzdG9yZWQgZnJvbSBhIGxvc3Qgc3RhdGUuIAorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZHJhd2luZyBidWZmZXIgaXMgcmVzdG9yZWQgZnJvbSBhIGxvc3Qgc3RhdGUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBkcmF3aW5nIGJ1ZmZlciBpcyByZXN0b3JlZCBmcm9tIGEgbG9zdCBzdGF0ZSwKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBkcmF3aW5nIGJ1ZmZlciBpcyByZXN0b3JlZCBmcm9tIGEgbG9zdCBzdGF0ZSwgZmFsc2UKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBjb250ZW50c1Jlc3RvcmVkKCk7CiAKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9CdWZmZXJlZEltYWdlLmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvQnVmZmVyZWRJbWFnZS5qYXZhCmluZGV4IGQzMDVkNjYuLmM5ZDU4ZDkgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbWFnZS9CdWZmZXJlZEltYWdlLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL0J1ZmZlcmVkSW1hZ2UuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBJZ29yIFYuIFN0b2x5YXJvdgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuaW1hZ2U7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hd3QuQW5kcm9pZEdyYXBoaWNzMkQ7CkBAIC0zOSwxODQgKzQwLDIxNSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuZ2wuaW1hZ2UuQnVmZmVyZWRJbWFnZVNvdXJjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAotCiAvKioKLSAqIFRoZSBCdWZmZXJlZEltYWdlIGNsYXNzIGRlc2NyaWJlcyBhbiBJbWFnZSB3aGljaCBjb250YWlucyBhIGJ1ZmZlciAKLSAqIG9mIGltYWdlIGRhdGEgYW5kIGluY2x1ZGVzIGEgQ29sb3JNb2RlbCBhbmQgYSBSYXN0ZXIgZm9yIHRoaXMgZGF0YS4KLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgbWV0aG9kcyBmb3Igb2J0YWluaW5nIGFuZCBzZXR0aW5nIHRoZSBSYXN0ZXIKLSAqIGFuZCBmb3IgbWFuaXB1bGF0aW5nIHRoZSBDb2xvck1vZGVsIHBhcmFtZXRlcnMuCisgKiBUaGUgQnVmZmVyZWRJbWFnZSBjbGFzcyBkZXNjcmliZXMgYW4gSW1hZ2Ugd2hpY2ggY29udGFpbnMgYSBidWZmZXIgb2YgaW1hZ2UKKyAqIGRhdGEgYW5kIGluY2x1ZGVzIGEgQ29sb3JNb2RlbCBhbmQgYSBSYXN0ZXIgZm9yIHRoaXMgZGF0YS4gVGhpcyBjbGFzcworICogcHJvdmlkZXMgbWV0aG9kcyBmb3Igb2J0YWluaW5nIGFuZCBzZXR0aW5nIHRoZSBSYXN0ZXIgYW5kIGZvciBtYW5pcHVsYXRpbmcKKyAqIHRoZSBDb2xvck1vZGVsIHBhcmFtZXRlcnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCi1wdWJsaWMgY2xhc3MgQnVmZmVyZWRJbWFnZSBleHRlbmRzIAotSW1hZ2UgaW1wbGVtZW50cyBXcml0YWJsZVJlbmRlcmVkSW1hZ2UsIFRyYW5zcGFyZW5jeXsKK3B1YmxpYyBjbGFzcyBCdWZmZXJlZEltYWdlIGV4dGVuZHMgSW1hZ2UgaW1wbGVtZW50cyBXcml0YWJsZVJlbmRlcmVkSW1hZ2UsIFRyYW5zcGFyZW5jeSB7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFRZUEVfQ1VTVE9NIGluZGljYXRlcyB0aGF0IEltYWdlIHR5cGUgCi0gICAgICogaXMgdW5rbm93bi4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfQ1VTVE9NIGluZGljYXRlcyB0aGF0IEltYWdlIHR5cGUgaXMgdW5rbm93bi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0NVU1RPTSA9IDA7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFRZUEVfSU5UX1JHQiBpbmRpY2F0ZXMgYW4gaW1hZ2Ugd2l0aCAKLSAgICAgKiA4IGJpdCBSR0IgY29sb3IgY29tcG9uZW50cywgaXQgaGFzIGEgRGlyZWN0Q29sb3JNb2RlbCAKLSAgICAgKiB3aXRob3V0IGFscGhhLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9JTlRfUkdCIGluZGljYXRlcyBhbiBpbWFnZSB3aXRoIDggYml0IFJHQiBjb2xvcgorICAgICAqIGNvbXBvbmVudHMsIGl0IGhhcyBhIERpcmVjdENvbG9yTW9kZWwgd2l0aG91dCBhbHBoYS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0lOVF9SR0IgPSAxOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUWVBFX0lOVF9BUkdCIGluZGljYXRlcyBhbiBpbWFnZSB3aXRoIAotICAgICAqIDggYml0IFJHQkEgY29sb3IgY29tcG9uZW50cywgaXQgaGFzIGEgRGlyZWN0Q29sb3JNb2RlbCAKLSAgICAgKiB3aXRoIGFscGhhLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9JTlRfQVJHQiBpbmRpY2F0ZXMgYW4gaW1hZ2Ugd2l0aCA4IGJpdCBSR0JBIGNvbG9yCisgICAgICogY29tcG9uZW50cywgaXQgaGFzIGEgRGlyZWN0Q29sb3JNb2RlbCB3aXRoIGFscGhhLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfSU5UX0FSR0IgPSAyOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUWVBFX0lOVF9BUkdCX1BSRSBpbmRpY2F0ZXMgYW4gaW1hZ2Ugd2l0aCAKLSAgICAgKiA4IGJpdCBSR0JBIGNvbG9yIGNvbXBvbmVudHMsIGl0IGhhcyBhIERpcmVjdENvbG9yTW9kZWwgCi0gICAgICogd2l0aCBhbHBoYSwgYW5kIGltYWdlIGRhdGEgaXMgcHJlbXVsdGlwbGllZCBieSBhbHBoYS4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfSU5UX0FSR0JfUFJFIGluZGljYXRlcyBhbiBpbWFnZSB3aXRoIDggYml0IFJHQkEgY29sb3IKKyAgICAgKiBjb21wb25lbnRzLCBpdCBoYXMgYSBEaXJlY3RDb2xvck1vZGVsIHdpdGggYWxwaGEsIGFuZCBpbWFnZSBkYXRhIGlzCisgICAgICogcHJlLW11bHRpcGxpZWQgYnkgYWxwaGEuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9JTlRfQVJHQl9QUkUgPSAzOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUWVBFX0lOVF9CR1IgaW5kaWNhdGVzIGFuIGltYWdlIHdpdGggCi0gICAgICogOCBiaXQgUkdCIGNvbG9yIGNvbXBvbmVudHMsIEJHUiBjb2xvciBtb2RlbCAKLSAgICAgKiAod2l0aCB0aGUgY29sb3JzIEJsdWUsIEdyZWVuLCBhbmQgUmVkKS4gVGhlcmUgaXMgbm8gCi0gICAgICogYWxwaGEuIFRoZSBpbWFnZSBoYXMgYSBEaXJlY3RDb2xvck1vZGVsLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9JTlRfQkdSIGluZGljYXRlcyBhbiBpbWFnZSB3aXRoIDggYml0IFJHQiBjb2xvcgorICAgICAqIGNvbXBvbmVudHMsIEJHUiBjb2xvciBtb2RlbCAod2l0aCB0aGUgY29sb3JzIEJsdWUsIEdyZWVuLCBhbmQgUmVkKS4gVGhlcmUKKyAgICAgKiBpcyBubyBhbHBoYS4gVGhlIGltYWdlIGhhcyBhIERpcmVjdENvbG9yTW9kZWwuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9JTlRfQkdSID0gNDsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV8zQllURV9CR1IgaW5kaWNhdGVzIGFuIGltYWdlIHdpdGggCi0gICAgICogOCBiaXQgUkdCIGNvbG9yIGNvbXBvbmVudHMsIEJHUiBjb2xvciBtb2RlbCAKLSAgICAgKiAod2l0aCB0aGUgY29sb3JzIEJsdWUsIEdyZWVuLCBhbmQgUmVkIHN0b3JlZCBpbiAzIGJ5dGVzKS4gCi0gICAgICogVGhlcmUgaXMgbm8gYWxwaGEuIFRoZSBpbWFnZSBoYXMgYSBDb21wb25lbnRDb2xvck1vZGVsLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV8zQllURV9CR1IgaW5kaWNhdGVzIGFuIGltYWdlIHdpdGggOCBiaXQgUkdCIGNvbG9yCisgICAgICogY29tcG9uZW50cywgQkdSIGNvbG9yIG1vZGVsICh3aXRoIHRoZSBjb2xvcnMgQmx1ZSwgR3JlZW4sIGFuZCBSZWQgc3RvcmVkCisgICAgICogaW4gMyBieXRlcykuIFRoZXJlIGlzIG5vIGFscGhhLiBUaGUgaW1hZ2UgaGFzIGEgQ29tcG9uZW50Q29sb3JNb2RlbC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFXzNCWVRFX0JHUiA9IDU7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFRZUEVfNEJZVEVfQUJHUiBpbmRpY2F0ZXMgYW4gaW1hZ2Ugd2l0aCAKLSAgICAgKiA4IGJpdCBSR0JBIGNvbG9yIGNvbXBvbmVudHMgc3RvcmVkIGluIDMgYnl0ZXMgYW5kIDEgYnl0ZSBvZiBhbHBoYS4KLSAgICAgKiBJdCBoYXMgYSBDb21wb25lbnRDb2xvck1vZGVsIHdpdGggYWxwaGEuICAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV80QllURV9BQkdSIGluZGljYXRlcyBhbiBpbWFnZSB3aXRoIDggYml0IFJHQkEgY29sb3IKKyAgICAgKiBjb21wb25lbnRzIHN0b3JlZCBpbiAzIGJ5dGVzIGFuZCAxIGJ5dGUgb2YgYWxwaGEuIEl0IGhhcyBhCisgICAgICogQ29tcG9uZW50Q29sb3JNb2RlbCB3aXRoIGFscGhhLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfNEJZVEVfQUJHUiA9IDY7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFRZUEVfNEJZVEVfQUJHUl9QUkUgaW5kaWNhdGVzIGFuIGltYWdlIHdpdGggCi0gICAgICogOCBiaXQgUkdCQSBjb2xvciBjb21wb25lbnRzIHN0b3JlZCBpbiAzIGJ5dGVzIGFuZCAxIGJ5dGUgCi0gICAgICogZm9yIGFscGhhLiBUaGUgaW1hZ2UgaGFzIGEgQ29tcG9uZW50Q29sb3JNb2RlbCB3aXRoIGFscGhhLiAKLSAgICAgKiBUaGUgY29sb3IgZGF0YSBpcyBwcmVtdWx0aXBsaWVkIHdpdGggYWxwaGEuCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfNEJZVEVfQUJHUl9QUkUgaW5kaWNhdGVzIGFuIGltYWdlIHdpdGggOCBiaXQgUkdCQSBjb2xvcgorICAgICAqIGNvbXBvbmVudHMgc3RvcmVkIGluIDMgYnl0ZXMgYW5kIDEgYnl0ZSBmb3IgYWxwaGEuIFRoZSBpbWFnZSBoYXMgYQorICAgICAqIENvbXBvbmVudENvbG9yTW9kZWwgd2l0aCBhbHBoYS4gVGhlIGNvbG9yIGRhdGEgaXMgcHJlLW11bHRpcGxpZWQgd2l0aAorICAgICAqIGFscGhhLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfNEJZVEVfQUJHUl9QUkUgPSA3OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBUWVBFX1VTSE9SVF81NjVfUkdCIGluZGljYXRlcyBhbiBpbWFnZSB3aXRoIAotICAgICAqIDU2NSBSR0IgY29sb3IgY29tcG9uZW50cyAoNS1iaXRzIHJlZCwgNi1iaXRzIGdyZWVuLCA1LWJpdHMgYmx1ZSkgCi0gICAgICogd2l0aCBubyBhbHBoYS4gVGhpcyBpbWFnZSBoYXMgYSBEaXJlY3RDb2xvck1vZGVsLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9VU0hPUlRfNTY1X1JHQiBpbmRpY2F0ZXMgYW4gaW1hZ2Ugd2l0aCA1NjUgUkdCIGNvbG9yCisgICAgICogY29tcG9uZW50cyAoNS1iaXRzIHJlZCwgNi1iaXRzIGdyZWVuLCA1LWJpdHMgYmx1ZSkgd2l0aCBubyBhbHBoYS4gVGhpcworICAgICAqIGltYWdlIGhhcyBhIERpcmVjdENvbG9yTW9kZWwuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9VU0hPUlRfNTY1X1JHQiA9IDg7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFRZUEVfVVNIT1JUXzU1NV9SR0IgaW5kaWNhdGVzIGFuIGltYWdlIHdpdGggCi0gICAgICogNTU1IFJHQiBjb2xvciBjb21wb25lbnRzICg1LWJpdHMgcmVkLCA1LWJpdHMgZ3JlZW4sIDUtYml0cyBibHVlKSAKLSAgICAgKiB3aXRoIG5vIGFscGhhLiBUaGlzIGltYWdlIGhhcyBhIERpcmVjdENvbG9yTW9kZWwuIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX1VTSE9SVF81NTVfUkdCIGluZGljYXRlcyBhbiBpbWFnZSB3aXRoIDU1NSBSR0IgY29sb3IKKyAgICAgKiBjb21wb25lbnRzICg1LWJpdHMgcmVkLCA1LWJpdHMgZ3JlZW4sIDUtYml0cyBibHVlKSB3aXRoIG5vIGFscGhhLiBUaGlzCisgICAgICogaW1hZ2UgaGFzIGEgRGlyZWN0Q29sb3JNb2RlbC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1VTSE9SVF81NTVfUkdCID0gOTsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9CWVRFX0dSQVkgaW5kaWNhdGVzIGEgdW5zaWduZWQgYnl0ZSAKLSAgICAgKiBpbWFnZS4gVGhpcyBpbWFnZSBoYXMgYSBDb21wb25lbnRDb2xvck1vZGVsIHdpdGggCi0gICAgICogYSBDU19HUkFZIENvbG9yU3BhY2UuIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX0JZVEVfR1JBWSBpbmRpY2F0ZXMgYSB1bnNpZ25lZCBieXRlIGltYWdlLiBUaGlzIGltYWdlCisgICAgICogaGFzIGEgQ29tcG9uZW50Q29sb3JNb2RlbCB3aXRoIGEgQ1NfR1JBWSBDb2xvclNwYWNlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfQllURV9HUkFZID0gMTA7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFRZUEVfVVNIT1JUX0dSQVkgaW5kaWNhdGVzIGFuIHVuc2lnbmVkIHNob3J0IAotICAgICAqIGltYWdlLiBUaGlzIGltYWdlIGhhcyBhIENvbXBvbmVudENvbG9yTW9kZWwgd2l0aCBhIENTX0dSQVkgCi0gICAgICogQ29sb3JTcGFjZS4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfVVNIT1JUX0dSQVkgaW5kaWNhdGVzIGFuIHVuc2lnbmVkIHNob3J0IGltYWdlLiBUaGlzCisgICAgICogaW1hZ2UgaGFzIGEgQ29tcG9uZW50Q29sb3JNb2RlbCB3aXRoIGEgQ1NfR1JBWSBDb2xvclNwYWNlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfVVNIT1JUX0dSQVkgPSAxMTsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9CWVRFX0JJTkFSWSBpbmRpY2F0ZXMgYW4gb3BhcXVlIGJ5dGUtcGFja2VkCi0gICAgICogMSwgMiBvciA0IGJpdCBpbWFnZS4gVGhlIGltYWdlIGhhcyBhbiBJbmRleENvbG9yTW9kZWwgd2l0aG91dCAKLSAgICAgKiBhbHBoYS4gIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX0JZVEVfQklOQVJZIGluZGljYXRlcyBhbiBvcGFxdWUgYnl0ZS1wYWNrZWQgMSwgMiBvciA0CisgICAgICogYml0IGltYWdlLiBUaGUgaW1hZ2UgaGFzIGFuIEluZGV4Q29sb3JNb2RlbCB3aXRob3V0IGFscGhhLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfQllURV9CSU5BUlkgPSAxMjsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9CWVRFX0lOREVYRUQgaW5kaWNhdGVzIGFuIGluZGV4ZWQgYnl0ZSBpbWFnZS4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfQllURV9JTkRFWEVEIGluZGljYXRlcyBhbiBpbmRleGVkIGJ5dGUgaW1hZ2UuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9CWVRFX0lOREVYRUQgPSAxMzsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgQUxQSEFfTUFTSy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgQUxQSEFfTUFTSy4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUxQSEFfTUFTSyA9IDB4ZmYwMDAwMDA7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFJFRF9NQVNLLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBSRURfTUFTSy4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVEX01BU0sgPSAweDAwZmYwMDAwOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBHUkVFTl9NQVNLLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBHUkVFTl9NQVNLLgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHUkVFTl9NQVNLID0gMHgwMDAwZmYwMDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgQkxVRV9NQVNLLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBCTFVFX01BU0suCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJMVUVfTUFTSyA9IDB4MDAwMDAwZmY7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFJFRF9CR1JfTUFTSy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgUkVEX0JHUl9NQVNLLgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRURfQkdSX01BU0sgPSAweDAwMDAwMGZmOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBHUkVFTl9CR1JfTUFTSy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgR1JFRU5fQkdSX01BU0suCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdSRUVOX0JHUl9NQVNLID0gMHgwMDAwZmYwMDsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgQkxVRV9CR1JfTUFTSy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgQkxVRV9CR1JfTUFTSy4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkxVRV9CR1JfTUFTSyA9IDB4MDBmZjAwMDA7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFJFRF81NjVfTUFTSy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgUkVEXzU2NV9NQVNLLgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRURfNTY1X01BU0sgPSAweGY4MDA7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IEdSRUVOXzU2NV9NQVNLLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBHUkVFTl81NjVfTUFTSy4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR1JFRU5fNTY1X01BU0sgPSAweDA3ZTA7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IEJMVUVfNTY1X01BU0suICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEJMVUVfNTY1X01BU0suCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJMVUVfNTY1X01BU0sgPSAweDAwMWY7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFJFRF81NTVfTUFTSy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgUkVEXzU1NV9NQVNLLgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRURfNTU1X01BU0sgPSAweDdjMDA7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IEdSRUVOXzU1NV9NQVNLLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBHUkVFTl81NTVfTUFTSy4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR1JFRU5fNTU1X01BU0sgPSAweDAzZTA7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IEJMVUVfNTU1X01BU0suICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEJMVUVfNTU1X01BU0suCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJMVUVfNTU1X01BU0sgPSAweDAwMWY7CiAKLSAgICAvKiogVGhlIGNtLiAqLworICAgIC8qKgorICAgICAqIFRoZSBjbS4KKyAgICAgKi8KICAgICBwcml2YXRlIENvbG9yTW9kZWwgY207CiAKLSAgICAvKiogVGhlIHJhc3Rlci4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgcmFzdGVyLgorICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgV3JpdGFibGVSYXN0ZXIgcmFzdGVyOwogCi0gICAgLyoqIFRoZSBpbWFnZSB0eXBlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBpbWFnZSB0eXBlLgorICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgaW50IGltYWdlVHlwZTsKIAotICAgIC8qKiBUaGUgcHJvcGVydGllcy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgcHJvcGVydGllcy4KKyAgICAgKi8KICAgICBwcml2YXRlIEhhc2h0YWJsZTw/LCA/PiBwcm9wZXJ0aWVzOwogCi0gICAgLy8gU3VyZmFjZSBvZiB0aGUgQnVmZmVyZWQgSW1hZ2UgLSB1c2VkIGZvciBibGl0dGluZyBvbmUgQnVmZmVyZWQgSW1hZ2UgCisgICAgLy8gU3VyZmFjZSBvZiB0aGUgQnVmZmVyZWQgSW1hZ2UgLSB1c2VkIGZvciBibGl0dGluZyBvbmUgQnVmZmVyZWQgSW1hZ2UKICAgICAvLyBvbiB0aGUgb3RoZXIgb25lIG9yIG9uIHRoZSBDb21wb25lbnQKLSAgICAvKiogVGhlIGltYWdlIHN1cmYuICovCisgICAgLyoqCisgICAgICogVGhlIGltYWdlIHN1cmYuCisgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBJbWFnZVN1cmZhY2UgaW1hZ2VTdXJmOwogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEJ1ZmZlcmVkSW1hZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIENvbG9yTW9kZWwsCi0gICAgICogYW5kIFdyaXRhYmxlUmFzdGVyIG9iamVjdHMuIFRoZSBSYXN0ZXIgZGF0YSBjYW4gYmUKLSAgICAgKiBiZSBkaXZpZGVkIG9yIG11bHRpcGxpZWQgYnkgYWxwaGEuIEl0IGRlcGVuZHMgb24gdGhlIAotICAgICAqIGFscGhhUHJlbXVsdGlwbGllZCBzdGF0ZSBpbiB0aGUgQ29sb3JNb2RlbC4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQnVmZmVyZWRJbWFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgQ29sb3JNb2RlbCwgYW5kCisgICAgICogV3JpdGFibGVSYXN0ZXIgb2JqZWN0cy4gVGhlIFJhc3RlciBkYXRhIGNhbiBiZSBiZSBkaXZpZGVkIG9yIG11bHRpcGxpZWQKKyAgICAgKiBieSBhbHBoYS4gSXQgZGVwZW5kcyBvbiB0aGUgYWxwaGFQcmVtdWx0aXBsaWVkIHN0YXRlIGluIHRoZSBDb2xvck1vZGVsLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjbSB0aGUgQ29sb3JNb2RlbCBvZiB0aGUgbmV3IGltYWdlLgotICAgICAqIEBwYXJhbSByYXN0ZXIgdGhlIFdyaXRhYmxlUmFzdGVyIG9mIHRoZSBuZXcgaW1hZ2UuCi0gICAgICogQHBhcmFtIGlzUmFzdGVyUHJlbXVsdGlwbGllZCBpZiB0cnVlIHRoZSBkYXRhIG9mIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBSYXN0ZXIgaXMgcHJlbXVsdGlwbGllZCBieSBhbHBoYS4KLSAgICAgKiBAcGFyYW0gcHJvcGVydGllcyB0aGUgcHJvcGVydGllcyBvZiBuZXcgSW1hZ2UuCisgICAgICogQHBhcmFtIGNtCisgICAgICogICAgICAgICAgICB0aGUgQ29sb3JNb2RlbCBvZiB0aGUgbmV3IGltYWdlLgorICAgICAqIEBwYXJhbSByYXN0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBXcml0YWJsZVJhc3RlciBvZiB0aGUgbmV3IGltYWdlLgorICAgICAqIEBwYXJhbSBpc1Jhc3RlclByZW11bHRpcGxpZWQKKyAgICAgKiAgICAgICAgICAgIGlmIHRydWUgdGhlIGRhdGEgb2YgdGhlIHNwZWNpZmllZCBSYXN0ZXIgaXMgcHJlLW11bHRpcGxpZWQgYnkKKyAgICAgKiAgICAgICAgICAgIGFscGhhLgorICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzCisgICAgICogICAgICAgICAgICB0aGUgcHJvcGVydGllcyBvZiBuZXcgSW1hZ2UuCiAgICAgICovCi0gICAgcHVibGljIEJ1ZmZlcmVkSW1hZ2UoQ29sb3JNb2RlbCBjbSwgV3JpdGFibGVSYXN0ZXIgcmFzdGVyLAotICAgICAgICAgICAgYm9vbGVhbiBpc1Jhc3RlclByZW11bHRpcGxpZWQsIEhhc2h0YWJsZTw/LCA/PiBwcm9wZXJ0aWVzKSB7CisgICAgcHVibGljIEJ1ZmZlcmVkSW1hZ2UoQ29sb3JNb2RlbCBjbSwgV3JpdGFibGVSYXN0ZXIgcmFzdGVyLCBib29sZWFuIGlzUmFzdGVyUHJlbXVsdGlwbGllZCwKKyAgICAgICAgICAgIEhhc2h0YWJsZTw/LCA/PiBwcm9wZXJ0aWVzKSB7CiAgICAgICAgIGlmICghY20uaXNDb21wYXRpYmxlUmFzdGVyKHJhc3RlcikpIHsKICAgICAgICAgICAgIC8vIGF3dC40RD1UaGUgcmFzdGVyIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoaXMgQ29sb3JNb2RlbAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC40RCIpKTsgLy8kTk9OLU5MUy0xJApAQCAtMjI3LDcgKzI1OSw3IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIyOCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgdGhpcy5jbSAgPSBjbTsKKyAgICAgICAgdGhpcy5jbSA9IGNtOwogICAgICAgICB0aGlzLnJhc3RlciA9IHJhc3RlcjsKICAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKIApAQCAtMjQwLDQ3ICsyNzIsNTIgQEAKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBCdWZmZXJlZEltYWdlIHdpdGggdGhlIHNwZWNpZmllZCB3aWR0aCwgaGVpZ2h0Ci0gICAgICogcHJlZGVmaW5lZCBpbWFnZSB0eXBlIChUWVBFX0JZVEVfQklOQVJZIG9yIFRZUEVfQllURV9JTkRFWEVEKSAKLSAgICAgKiBhbmQgdGhlIHNwZWNpZmllZCBJbmRleENvbG9yTW9kZWwuCisgICAgICogcHJlZGVmaW5lZCBpbWFnZSB0eXBlIChUWVBFX0JZVEVfQklOQVJZIG9yIFRZUEVfQllURV9JTkRFWEVEKSBhbmQgdGhlCisgICAgICogc3BlY2lmaWVkIEluZGV4Q29sb3JNb2RlbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIG5ldyBpbWFnZS4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgbmV3IGltYWdlLgotICAgICAqIEBwYXJhbSBpbWFnZVR5cGUgdGhlIHByZWRlZmluZWQgaW1hZ2UgdHlwZS4gCi0gICAgICogQHBhcmFtIGNtIHRoZSBzcGVjaWZpZWQgSW5kZXhDb2xvck1vZGVsLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIG5ldyBpbWFnZS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIG5ldyBpbWFnZS4KKyAgICAgKiBAcGFyYW0gaW1hZ2VUeXBlCisgICAgICogICAgICAgICAgICB0aGUgcHJlZGVmaW5lZCBpbWFnZSB0eXBlLgorICAgICAqIEBwYXJhbSBjbQorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBJbmRleENvbG9yTW9kZWwuCiAgICAgICovCi0gICAgcHVibGljIEJ1ZmZlcmVkSW1hZ2UoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgaW1hZ2VUeXBlLAotICAgICAgICAgICAgSW5kZXhDb2xvck1vZGVsIGNtKSB7CisgICAgcHVibGljIEJ1ZmZlcmVkSW1hZ2UoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgaW1hZ2VUeXBlLCBJbmRleENvbG9yTW9kZWwgY20pIHsKICAgICAgICAgc3dpdGNoIChpbWFnZVR5cGUpIHsKLSAgICAgICAgY2FzZSBUWVBFX0JZVEVfQklOQVJZOgotICAgICAgICAgICAgaWYgKGNtLmhhc0FscGhhKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBhd3QuMjI3PVRoaXMgaW1hZ2UgdHlwZSBjYW4ndCBoYXZlIGFscGhhCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMjciKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBwaXhlbF9iaXRzID0gMDsKLSAgICAgICAgICAgIGludCBtYXBTaXplID0gY20uZ2V0TWFwU2l6ZSgpOwotICAgICAgICAgICAgaWYgKG1hcFNpemUgPD0gMikgewotICAgICAgICAgICAgICAgIHBpeGVsX2JpdHMgPSAxOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtYXBTaXplIDw9IDQpIHsKLSAgICAgICAgICAgICAgICBwaXhlbF9iaXRzID0gMjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobWFwU2l6ZSA8PSAxNikgewotICAgICAgICAgICAgICAgIHBpeGVsX2JpdHMgPSA0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBhd3QuMjIxPVRoZSBpbWFnZVR5cGUgaXMgVFlQRV9CWVRFX0JJTkFSWSBhbmQgdGhlIGNvbG9yIG1hcCBoYXMgbW9yZSB0aGFuIDE2IGVudHJpZXMKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIyMSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBUWVBFX0JZVEVfQklOQVJZOgorICAgICAgICAgICAgICAgIGlmIChjbS5oYXNBbHBoYSgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGF3dC4yMjc9VGhpcyBpbWFnZSB0eXBlIGNhbid0IGhhdmUgYWxwaGEKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMjciKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IHBpeGVsX2JpdHMgPSAwOworICAgICAgICAgICAgICAgIGludCBtYXBTaXplID0gY20uZ2V0TWFwU2l6ZSgpOworICAgICAgICAgICAgICAgIGlmIChtYXBTaXplIDw9IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgcGl4ZWxfYml0cyA9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXBTaXplIDw9IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgcGl4ZWxfYml0cyA9IDI7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXBTaXplIDw9IDE2KSB7CisgICAgICAgICAgICAgICAgICAgIHBpeGVsX2JpdHMgPSA0OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGF3dC4yMjE9VGhlIGltYWdlVHlwZSBpcyBUWVBFX0JZVEVfQklOQVJZIGFuZCB0aGUgY29sb3IKKyAgICAgICAgICAgICAgICAgICAgLy8gbWFwIGhhcyBtb3JlIHRoYW4gMTYgZW50cmllcworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIyMSIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcmFzdGVyID0gUmFzdGVyLmNyZWF0ZVBhY2tlZFJhc3RlcihEYXRhQnVmZmVyLlRZUEVfQllURSwgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIGhlaWdodCwgMSwgcGl4ZWxfYml0cywgbnVsbCk7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICByYXN0ZXIgPSBSYXN0ZXIuY3JlYXRlUGFja2VkUmFzdGVyKERhdGFCdWZmZXIuVFlQRV9CWVRFLCB3aWR0aCwgaGVpZ2h0LCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxfYml0cywgbnVsbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBUWVBFX0JZVEVfSU5ERVhFRDoKLSAgICAgICAgICAgIHJhc3RlciA9IFJhc3Rlci5jcmVhdGVJbnRlcmxlYXZlZFJhc3RlcihEYXRhQnVmZmVyLlRZUEVfQllURSwKLSAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgMSwgbnVsbCk7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9CWVRFX0lOREVYRUQ6CisgICAgICAgICAgICAgICAgcmFzdGVyID0gUmFzdGVyLmNyZWF0ZUludGVybGVhdmVkUmFzdGVyKERhdGFCdWZmZXIuVFlQRV9CWVRFLCB3aWR0aCwgaGVpZ2h0LCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIGF3dC4yMjI9VGhlIGltYWdlVHlwZSBpcyBub3QgVFlQRV9CWVRFX0JJTkFSWSBvciBUWVBFX0JZVEVfSU5ERVhFRAotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMjIiKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8gYXd0LjIyMj1UaGUgaW1hZ2VUeXBlIGlzIG5vdCBUWVBFX0JZVEVfQklOQVJZIG9yCisgICAgICAgICAgICAgICAgLy8gVFlQRV9CWVRFX0lOREVYRUQKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIyMiIpKTsgLy8kTk9OLU5MUy0xJAogCiAgICAgICAgIH0KIApAQCAtMjk2LDE4NyArMzMzLDE1OSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBCdWZmZXJlZEltYWdlIHdpdGggdGhlIHNwZWNpZmllZCB3aWR0aCwgaGVpZ2h0Ci0gICAgICogYW5kIHByZWRlZmluZWQgaW1hZ2UgdHlwZS4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQnVmZmVyZWRJbWFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgd2lkdGgsIGhlaWdodCBhbmQKKyAgICAgKiBwcmVkZWZpbmVkIGltYWdlIHR5cGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiBuZXcgaW1hZ2UuCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIG5ldyBpbWFnZS4KLSAgICAgKiBAcGFyYW0gaW1hZ2VUeXBlIHRoZSBwcmVkZWZpbmVkIGltYWdlIHR5cGUuIAorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIG5ldyBpbWFnZS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIG5ldyBpbWFnZS4KKyAgICAgKiBAcGFyYW0gaW1hZ2VUeXBlCisgICAgICogICAgICAgICAgICB0aGUgcHJlZGVmaW5lZCBpbWFnZSB0eXBlLgogICAgICAqLwogICAgIHB1YmxpYyBCdWZmZXJlZEltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGltYWdlVHlwZSkgewogCiAgICAgICAgIHN3aXRjaCAoaW1hZ2VUeXBlKSB7Ci0gICAgICAgIGNhc2UgVFlQRV9JTlRfUkdCOgotICAgICAgICAgICAgY20gPSBuZXcgRGlyZWN0Q29sb3JNb2RlbCgyNCwgUkVEX01BU0ssIEdSRUVOX01BU0ssIEJMVUVfTUFTSyk7Ci0gICAgICAgICAgICByYXN0ZXIgPSBjbS5jcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIod2lkdGgsIGhlaWdodCk7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9JTlRfUkdCOgorICAgICAgICAgICAgICAgIGNtID0gbmV3IERpcmVjdENvbG9yTW9kZWwoMjQsIFJFRF9NQVNLLCBHUkVFTl9NQVNLLCBCTFVFX01BU0spOworICAgICAgICAgICAgICAgIHJhc3RlciA9IGNtLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3Rlcih3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIFRZUEVfSU5UX0FSR0I6Ci0gICAgICAgICAgICBjbSA9IENvbG9yTW9kZWwuZ2V0UkdCZGVmYXVsdCgpOwotICAgICAgICAgICAgcmFzdGVyID0gY20uY3JlYXRlQ29tcGF0aWJsZVdyaXRhYmxlUmFzdGVyKHdpZHRoLCBoZWlnaHQpOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFRZUEVfSU5UX0FSR0I6CisgICAgICAgICAgICAgICAgY20gPSBDb2xvck1vZGVsLmdldFJHQmRlZmF1bHQoKTsKKyAgICAgICAgICAgICAgICByYXN0ZXIgPSBjbS5jcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIod2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBUWVBFX0lOVF9BUkdCX1BSRToKLSAgICAgICAgICAgIGNtID0gbmV3IERpcmVjdENvbG9yTW9kZWwoCi0gICAgICAgICAgICAgICAgICAgIENvbG9yU3BhY2UuZ2V0SW5zdGFuY2UoQ29sb3JTcGFjZS5DU19zUkdCKSwKLSAgICAgICAgICAgICAgICAgICAgMzIsCi0gICAgICAgICAgICAgICAgICAgIFJFRF9NQVNLLAotICAgICAgICAgICAgICAgICAgICBHUkVFTl9NQVNLLAotICAgICAgICAgICAgICAgICAgICBCTFVFX01BU0ssCi0gICAgICAgICAgICAgICAgICAgIEFMUEhBX01BU0ssCi0gICAgICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIERhdGFCdWZmZXIuVFlQRV9JTlQpOworICAgICAgICAgICAgY2FzZSBUWVBFX0lOVF9BUkdCX1BSRToKKyAgICAgICAgICAgICAgICBjbSA9IG5ldyBEaXJlY3RDb2xvck1vZGVsKENvbG9yU3BhY2UuZ2V0SW5zdGFuY2UoQ29sb3JTcGFjZS5DU19zUkdCKSwgMzIsIFJFRF9NQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgR1JFRU5fTUFTSywgQkxVRV9NQVNLLCBBTFBIQV9NQVNLLCB0cnVlLCBEYXRhQnVmZmVyLlRZUEVfSU5UKTsKIAotICAgICAgICAgICAgcmFzdGVyID0gY20uY3JlYXRlQ29tcGF0aWJsZVdyaXRhYmxlUmFzdGVyKHdpZHRoLCBoZWlnaHQpOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgcmFzdGVyID0gY20uY3JlYXRlQ29tcGF0aWJsZVdyaXRhYmxlUmFzdGVyKHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgVFlQRV9JTlRfQkdSOgotICAgICAgICAgICAgY20gPSBuZXcgRGlyZWN0Q29sb3JNb2RlbCgyNCwKLSAgICAgICAgICAgICAgICAgICAgUkVEX0JHUl9NQVNLLAotICAgICAgICAgICAgICAgICAgICBHUkVFTl9CR1JfTUFTSywKLSAgICAgICAgICAgICAgICAgICAgQkxVRV9CR1JfTUFTSyk7CisgICAgICAgICAgICBjYXNlIFRZUEVfSU5UX0JHUjoKKyAgICAgICAgICAgICAgICBjbSA9IG5ldyBEaXJlY3RDb2xvck1vZGVsKDI0LCBSRURfQkdSX01BU0ssIEdSRUVOX0JHUl9NQVNLLCBCTFVFX0JHUl9NQVNLKTsKIAotICAgICAgICAgICAgcmFzdGVyID0gY20uY3JlYXRlQ29tcGF0aWJsZVdyaXRhYmxlUmFzdGVyKHdpZHRoLCBoZWlnaHQpOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgcmFzdGVyID0gY20uY3JlYXRlQ29tcGF0aWJsZVdyaXRhYmxlUmFzdGVyKHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgVFlQRV8zQllURV9CR1I6IHsKLSAgICAgICAgICAgIGludCBiaXRzW10gPSB7IDgsIDgsIDggfTsKLSAgICAgICAgICAgIGludCBiYW5kT2Zmc2V0c1tdID0geyAyLCAxLCAwIH07Ci0gICAgICAgICAgICBjbSA9IG5ldyBDb21wb25lbnRDb2xvck1vZGVsKAotICAgICAgICAgICAgICAgICAgICBDb2xvclNwYWNlLmdldEluc3RhbmNlKENvbG9yU3BhY2UuQ1Nfc1JHQiksCi0gICAgICAgICAgICAgICAgICAgIGJpdHMsIAotICAgICAgICAgICAgICAgICAgICBmYWxzZSwgCi0gICAgICAgICAgICAgICAgICAgIGZhbHNlLCAKLSAgICAgICAgICAgICAgICAgICAgVHJhbnNwYXJlbmN5Lk9QQVFVRSwgCi0gICAgICAgICAgICAgICAgICAgIERhdGFCdWZmZXIuVFlQRV9CWVRFKTsKKyAgICAgICAgICAgIGNhc2UgVFlQRV8zQllURV9CR1I6IHsKKyAgICAgICAgICAgICAgICBpbnQgYml0c1tdID0geworICAgICAgICAgICAgICAgICAgICAgICAgOCwgOCwgOAorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgaW50IGJhbmRPZmZzZXRzW10gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAyLCAxLCAwCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBjbSA9IG5ldyBDb21wb25lbnRDb2xvck1vZGVsKENvbG9yU3BhY2UuZ2V0SW5zdGFuY2UoQ29sb3JTcGFjZS5DU19zUkdCKSwgYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgVHJhbnNwYXJlbmN5Lk9QQVFVRSwgRGF0YUJ1ZmZlci5UWVBFX0JZVEUpOwogCi0gICAgICAgICAgICByYXN0ZXIgPSBSYXN0ZXIuY3JlYXRlSW50ZXJsZWF2ZWRSYXN0ZXIoRGF0YUJ1ZmZlci5UWVBFX0JZVEUsCi0gICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHdpZHRoICogMywgMywgYmFuZE9mZnNldHMsIG51bGwpOworICAgICAgICAgICAgICAgIHJhc3RlciA9IFJhc3Rlci5jcmVhdGVJbnRlcmxlYXZlZFJhc3RlcihEYXRhQnVmZmVyLlRZUEVfQllURSwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoICogMywgMywgYmFuZE9mZnNldHMsIG51bGwpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBUWVBFXzRCWVRFX0FCR1I6IHsKLSAgICAgICAgICAgIGludCBiaXRzW10gPSB7IDgsIDgsIDgsIDggfTsKLSAgICAgICAgICAgIGludCBiYW5kT2Zmc2V0c1tdID0geyAzLCAyLCAxLCAwIH07Ci0gICAgICAgICAgICBjbSA9IG5ldyBDb21wb25lbnRDb2xvck1vZGVsKAotICAgICAgICAgICAgICAgICAgICBDb2xvclNwYWNlLmdldEluc3RhbmNlKENvbG9yU3BhY2UuQ1Nfc1JHQiksCi0gICAgICAgICAgICAgICAgICAgIGJpdHMsIAotICAgICAgICAgICAgICAgICAgICB0cnVlLCAKLSAgICAgICAgICAgICAgICAgICAgZmFsc2UsIAotICAgICAgICAgICAgICAgICAgICBUcmFuc3BhcmVuY3kuVFJBTlNMVUNFTlQsIAotICAgICAgICAgICAgICAgICAgICBEYXRhQnVmZmVyLlRZUEVfQllURSk7CisgICAgICAgICAgICBjYXNlIFRZUEVfNEJZVEVfQUJHUjogeworICAgICAgICAgICAgICAgIGludCBiaXRzW10gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICA4LCA4LCA4LCA4CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBpbnQgYmFuZE9mZnNldHNbXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDMsIDIsIDEsIDAKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGNtID0gbmV3IENvbXBvbmVudENvbG9yTW9kZWwoQ29sb3JTcGFjZS5nZXRJbnN0YW5jZShDb2xvclNwYWNlLkNTX3NSR0IpLCBiaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZmFsc2UsIFRyYW5zcGFyZW5jeS5UUkFOU0xVQ0VOVCwgRGF0YUJ1ZmZlci5UWVBFX0JZVEUpOwogCi0gICAgICAgICAgICByYXN0ZXIgPSBSYXN0ZXIuY3JlYXRlSW50ZXJsZWF2ZWRSYXN0ZXIoRGF0YUJ1ZmZlci5UWVBFX0JZVEUsCi0gICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHdpZHRoICogNCwgNCwgYmFuZE9mZnNldHMsIG51bGwpOworICAgICAgICAgICAgICAgIHJhc3RlciA9IFJhc3Rlci5jcmVhdGVJbnRlcmxlYXZlZFJhc3RlcihEYXRhQnVmZmVyLlRZUEVfQllURSwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoICogNCwgNCwgYmFuZE9mZnNldHMsIG51bGwpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBUWVBFXzRCWVRFX0FCR1JfUFJFOiB7Ci0gICAgICAgICAgICBpbnQgYml0c1tdID0geyA4LCA4LCA4LCA4IH07Ci0gICAgICAgICAgICBpbnQgYmFuZE9mZnNldHNbXSA9IHsgMywgMiwgMSwgMCB9OwotICAgICAgICAgICAgY20gPSBuZXcgQ29tcG9uZW50Q29sb3JNb2RlbCgKLSAgICAgICAgICAgICAgICAgICAgQ29sb3JTcGFjZS5nZXRJbnN0YW5jZShDb2xvclNwYWNlLkNTX3NSR0IpLAotICAgICAgICAgICAgICAgICAgICBiaXRzLCAKLSAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgCi0gICAgICAgICAgICAgICAgICAgIHRydWUsIAotICAgICAgICAgICAgICAgICAgICBUcmFuc3BhcmVuY3kuVFJBTlNMVUNFTlQsIERhdGFCdWZmZXIuVFlQRV9CWVRFKTsKKyAgICAgICAgICAgIGNhc2UgVFlQRV80QllURV9BQkdSX1BSRTogeworICAgICAgICAgICAgICAgIGludCBiaXRzW10gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICA4LCA4LCA4LCA4CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBpbnQgYmFuZE9mZnNldHNbXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDMsIDIsIDEsIDAKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGNtID0gbmV3IENvbXBvbmVudENvbG9yTW9kZWwoQ29sb3JTcGFjZS5nZXRJbnN0YW5jZShDb2xvclNwYWNlLkNTX3NSR0IpLCBiaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgdHJ1ZSwgVHJhbnNwYXJlbmN5LlRSQU5TTFVDRU5ULCBEYXRhQnVmZmVyLlRZUEVfQllURSk7CiAKLSAgICAgICAgICAgIHJhc3RlciA9IFJhc3Rlci5jcmVhdGVJbnRlcmxlYXZlZFJhc3RlcihEYXRhQnVmZmVyLlRZUEVfQllURSwKLSAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgd2lkdGggKiA0LCA0LCBiYW5kT2Zmc2V0cywgbnVsbCk7CisgICAgICAgICAgICAgICAgcmFzdGVyID0gUmFzdGVyLmNyZWF0ZUludGVybGVhdmVkUmFzdGVyKERhdGFCdWZmZXIuVFlQRV9CWVRFLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggKiA0LCA0LCBiYW5kT2Zmc2V0cywgbnVsbCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIFRZUEVfVVNIT1JUXzU2NV9SR0I6Ci0gICAgICAgICAgICBjbSA9IG5ldyBEaXJlY3RDb2xvck1vZGVsKAotICAgICAgICAgICAgICAgICAgICBDb2xvclNwYWNlLmdldEluc3RhbmNlKENvbG9yU3BhY2UuQ1Nfc1JHQiksCi0gICAgICAgICAgICAgICAgICAgIDE2LAotICAgICAgICAgICAgICAgICAgICBSRURfNTY1X01BU0ssCi0gICAgICAgICAgICAgICAgICAgIEdSRUVOXzU2NV9NQVNLLAotICAgICAgICAgICAgICAgICAgICBCTFVFXzU2NV9NQVNLLAotICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVCk7CisgICAgICAgICAgICBjYXNlIFRZUEVfVVNIT1JUXzU2NV9SR0I6CisgICAgICAgICAgICAgICAgY20gPSBuZXcgRGlyZWN0Q29sb3JNb2RlbChDb2xvclNwYWNlLmdldEluc3RhbmNlKENvbG9yU3BhY2UuQ1Nfc1JHQiksIDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgUkVEXzU2NV9NQVNLLCBHUkVFTl81NjVfTUFTSywgQkxVRV81NjVfTUFTSywgMCwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUKTsKIAotICAgICAgICAgICAgcmFzdGVyID0gY20uY3JlYXRlQ29tcGF0aWJsZVdyaXRhYmxlUmFzdGVyKHdpZHRoLCBoZWlnaHQpOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgcmFzdGVyID0gY20uY3JlYXRlQ29tcGF0aWJsZVdyaXRhYmxlUmFzdGVyKHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgVFlQRV9VU0hPUlRfNTU1X1JHQjoKLSAgICAgICAgICAgIGNtID0gbmV3IERpcmVjdENvbG9yTW9kZWwoCi0gICAgICAgICAgICAgICAgICAgIENvbG9yU3BhY2UuZ2V0SW5zdGFuY2UoQ29sb3JTcGFjZS5DU19zUkdCKSwKLSAgICAgICAgICAgICAgICAgICAgMTUsCi0gICAgICAgICAgICAgICAgICAgIFJFRF81NTVfTUFTSywKLSAgICAgICAgICAgICAgICAgICAgR1JFRU5fNTU1X01BU0ssCi0gICAgICAgICAgICAgICAgICAgIEJMVUVfNTU1X01BU0ssCi0gICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUKTsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9VU0hPUlRfNTU1X1JHQjoKKyAgICAgICAgICAgICAgICBjbSA9IG5ldyBEaXJlY3RDb2xvck1vZGVsKENvbG9yU3BhY2UuZ2V0SW5zdGFuY2UoQ29sb3JTcGFjZS5DU19zUkdCKSwgMTUsCisgICAgICAgICAgICAgICAgICAgICAgICBSRURfNTU1X01BU0ssIEdSRUVOXzU1NV9NQVNLLCBCTFVFXzU1NV9NQVNLLCAwLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQpOwogCi0gICAgICAgICAgICByYXN0ZXIgPSBjbS5jcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIod2lkdGgsIGhlaWdodCk7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICByYXN0ZXIgPSBjbS5jcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIod2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBUWVBFX0JZVEVfR1JBWTogewotICAgICAgICAgICAgaW50IGJpdHNbXSA9IHsgOCB9OwotICAgICAgICAgICAgY20gPSBuZXcgQ29tcG9uZW50Q29sb3JNb2RlbCgKLSAgICAgICAgICAgICAgICAgICAgQ29sb3JTcGFjZS5nZXRJbnN0YW5jZShDb2xvclNwYWNlLkNTX0dSQVkpLAotICAgICAgICAgICAgICAgICAgICBiaXRzLCAKLSAgICAgICAgICAgICAgICAgICAgZmFsc2UsIAotICAgICAgICAgICAgICAgICAgICBmYWxzZSwgCi0gICAgICAgICAgICAgICAgICAgIFRyYW5zcGFyZW5jeS5PUEFRVUUsIAotICAgICAgICAgICAgICAgICAgICBEYXRhQnVmZmVyLlRZUEVfQllURSk7CisgICAgICAgICAgICBjYXNlIFRZUEVfQllURV9HUkFZOiB7CisgICAgICAgICAgICAgICAgaW50IGJpdHNbXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgOAorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgY20gPSBuZXcgQ29tcG9uZW50Q29sb3JNb2RlbChDb2xvclNwYWNlLmdldEluc3RhbmNlKENvbG9yU3BhY2UuQ1NfR1JBWSksIGJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIFRyYW5zcGFyZW5jeS5PUEFRVUUsIERhdGFCdWZmZXIuVFlQRV9CWVRFKTsKIAotICAgICAgICAgICAgcmFzdGVyID0gY20uY3JlYXRlQ29tcGF0aWJsZVdyaXRhYmxlUmFzdGVyKHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgICAgIHJhc3RlciA9IGNtLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3Rlcih3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgVFlQRV9VU0hPUlRfR1JBWTogewotICAgICAgICAgICAgaW50IGJpdHNbXSA9IHsgMTYgfTsKLSAgICAgICAgICAgIGNtID0gbmV3IENvbXBvbmVudENvbG9yTW9kZWwoCi0gICAgICAgICAgICAgICAgICAgIENvbG9yU3BhY2UuZ2V0SW5zdGFuY2UoQ29sb3JTcGFjZS5DU19HUkFZKSwKLSAgICAgICAgICAgICAgICAgICAgYml0cywgCi0gICAgICAgICAgICAgICAgICAgIGZhbHNlLCAKLSAgICAgICAgICAgICAgICAgICAgZmFsc2UsIAotICAgICAgICAgICAgICAgICAgICBUcmFuc3BhcmVuY3kuT1BBUVVFLCAKLSAgICAgICAgICAgICAgICAgICAgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVCk7Ci0gICAgICAgICAgICByYXN0ZXIgPSBjbS5jcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIod2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICBjYXNlIFRZUEVfVVNIT1JUX0dSQVk6IHsKKyAgICAgICAgICAgICAgICBpbnQgYml0c1tdID0geworICAgICAgICAgICAgICAgICAgICAxNgorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgY20gPSBuZXcgQ29tcG9uZW50Q29sb3JNb2RlbChDb2xvclNwYWNlLmdldEluc3RhbmNlKENvbG9yU3BhY2UuQ1NfR1JBWSksIGJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIFRyYW5zcGFyZW5jeS5PUEFRVUUsIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQpOworICAgICAgICAgICAgICAgIHJhc3RlciA9IGNtLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3Rlcih3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgVFlQRV9CWVRFX0JJTkFSWTogewotICAgICAgICAgICAgaW50IGNvbG9yTWFwW10gPSB7IDAsIDB4ZmZmZmZmIH07Ci0gICAgICAgICAgICBjbSA9IG5ldyBJbmRleENvbG9yTW9kZWwoMSwgMiwgY29sb3JNYXAsIDAsIGZhbHNlLCAtMSwKLSAgICAgICAgICAgICAgICAgICAgRGF0YUJ1ZmZlci5UWVBFX0JZVEUpOworICAgICAgICAgICAgY2FzZSBUWVBFX0JZVEVfQklOQVJZOiB7CisgICAgICAgICAgICAgICAgaW50IGNvbG9yTWFwW10gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAwLCAweGZmZmZmZgorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgY20gPSBuZXcgSW5kZXhDb2xvck1vZGVsKDEsIDIsIGNvbG9yTWFwLCAwLCBmYWxzZSwgLTEsIERhdGFCdWZmZXIuVFlQRV9CWVRFKTsKIAotICAgICAgICAgICAgcmFzdGVyID0gUmFzdGVyLmNyZWF0ZVBhY2tlZFJhc3RlcihEYXRhQnVmZmVyLlRZUEVfQllURSwgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIGhlaWdodCwgMSwgMSwgbnVsbCk7CisgICAgICAgICAgICAgICAgcmFzdGVyID0gUmFzdGVyLmNyZWF0ZVBhY2tlZFJhc3RlcihEYXRhQnVmZmVyLlRZUEVfQllURSwgd2lkdGgsIGhlaWdodCwgMSwgMSwgbnVsbCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIFRZUEVfQllURV9JTkRFWEVEOiB7Ci0gICAgICAgICAgICBpbnQgY29sb3JNYXBbXSA9IG5ldyBpbnRbMjU2XTsKLSAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgIGZvciAoaW50IHIgPSAwOyByIDwgMjU2OyByICs9IDUxKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgZyA9IDA7IGcgPCAyNTY7IGcgKz0gNTEpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCAyNTY7IGIgKz0gNTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yTWFwW2ldID0gKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCBiOwotICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgY2FzZSBUWVBFX0JZVEVfSU5ERVhFRDogeworICAgICAgICAgICAgICAgIGludCBjb2xvck1hcFtdID0gbmV3IGludFsyNTZdOworICAgICAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCByID0gMDsgciA8IDI1NjsgciArPSA1MSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBnID0gMDsgZyA8IDI1NjsgZyArPSA1MSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCAyNTY7IGIgKz0gNTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvck1hcFtpXSA9IChyIDw8IDE2KSB8IChnIDw8IDgpIHwgYjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGludCBncmF5ID0gMHgxMjsKLSAgICAgICAgICAgIGZvciAoOyBpIDwgMjU2OyBpKyssIGdyYXkgKz0gNikgewotICAgICAgICAgICAgICAgIGNvbG9yTWFwW2ldID0gKGdyYXkgPDwgMTYpIHwgKGdyYXkgPDwgOCkgfCBncmF5OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY20gPSBuZXcgSW5kZXhDb2xvck1vZGVsKDgsIDI1NiwgY29sb3JNYXAsIDAsIGZhbHNlLCAtMSwKLSAgICAgICAgICAgICAgICAgICAgRGF0YUJ1ZmZlci5UWVBFX0JZVEUpOwotICAgICAgICAgICAgcmFzdGVyID0gUmFzdGVyLmNyZWF0ZUludGVybGVhdmVkUmFzdGVyKERhdGFCdWZmZXIuVFlQRV9CWVRFLAotICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCAxLCBudWxsKTsKKyAgICAgICAgICAgICAgICBpbnQgZ3JheSA9IDB4MTI7CisgICAgICAgICAgICAgICAgZm9yICg7IGkgPCAyNTY7IGkrKywgZ3JheSArPSA2KSB7CisgICAgICAgICAgICAgICAgICAgIGNvbG9yTWFwW2ldID0gKGdyYXkgPDwgMTYpIHwgKGdyYXkgPDwgOCkgfCBncmF5OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjbSA9IG5ldyBJbmRleENvbG9yTW9kZWwoOCwgMjU2LCBjb2xvck1hcCwgMCwgZmFsc2UsIC0xLCBEYXRhQnVmZmVyLlRZUEVfQllURSk7CisgICAgICAgICAgICAgICAgcmFzdGVyID0gUmFzdGVyLmNyZWF0ZUludGVybGVhdmVkUmFzdGVyKERhdGFCdWZmZXIuVFlQRV9CWVRFLCB3aWR0aCwgaGVpZ2h0LCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7CiAKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gYXd0LjIyND1Vbmtub3duIGltYWdlIHR5cGUKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjI0IikpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIGF3dC4yMjQ9VW5rbm93biBpbWFnZSB0eXBlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMjQiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogICAgICAgICB0aGlzLmltYWdlVHlwZSA9IGltYWdlVHlwZTsKICAgICAgICAgaW1hZ2VTdXJmID0gY3JlYXRlSW1hZ2VTdXJmYWNlKGltYWdlVHlwZSk7CkBAIC00ODgsNyArNDk3LDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGlmKG5hbWUgPT0gbnVsbCkgeworICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjI1PVByb3BlcnR5IG5hbWUgaXMgbnVsbAogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIyNSIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CkBAIC01MDQsOSArNTEzLDggQEAKIAogICAgIHB1YmxpYyBXcml0YWJsZVJhc3RlciBjb3B5RGF0YShXcml0YWJsZVJhc3RlciBvdXRSYXN0ZXIpIHsKICAgICAgICAgaWYgKG91dFJhc3RlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBvdXRSYXN0ZXIgPSBSYXN0ZXIuY3JlYXRlV3JpdGFibGVSYXN0ZXIocmFzdGVyLmdldFNhbXBsZU1vZGVsKCksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBQb2ludChyYXN0ZXIuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVYKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFzdGVyLmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWSgpKSk7CisgICAgICAgICAgICBvdXRSYXN0ZXIgPSBSYXN0ZXIuY3JlYXRlV3JpdGFibGVSYXN0ZXIocmFzdGVyLmdldFNhbXBsZU1vZGVsKCksIG5ldyBQb2ludChyYXN0ZXIKKyAgICAgICAgICAgICAgICAgICAgLmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWCgpLCByYXN0ZXIuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVZKCkpKTsKICAgICAgICAgfQogCiAgICAgICAgIGludCB3ID0gb3V0UmFzdGVyLmdldFdpZHRoKCk7CkBAIC01MzAsOCArNTM4LDcgQEAKIAogICAgICAgICBTYW1wbGVNb2RlbCBzbSA9IHJhc3Rlci5nZXRTYW1wbGVNb2RlbCgpOwogICAgICAgICBTYW1wbGVNb2RlbCBuc20gPSBzbS5jcmVhdGVDb21wYXRpYmxlU2FtcGxlTW9kZWwodywgaCk7Ci0gICAgICAgIFdyaXRhYmxlUmFzdGVyIG91dHIgPSBSYXN0ZXIuY3JlYXRlV3JpdGFibGVSYXN0ZXIobnNtLCAKLSAgICAgICAgICAgICAgICByZWN0LmdldExvY2F0aW9uKCkpOworICAgICAgICBXcml0YWJsZVJhc3RlciBvdXRyID0gUmFzdGVyLmNyZWF0ZVdyaXRhYmxlUmFzdGVyKG5zbSwgcmVjdC5nZXRMb2NhdGlvbigpKTsKICAgICAgICAgT2JqZWN0IGRhdGEgPSBudWxsOwogCiAgICAgICAgIGRhdGEgPSByYXN0ZXIuZ2V0RGF0YUVsZW1lbnRzKG1pblgsIG1pblksIHcsIGgsIGRhdGEpOwpAQCAtNTUwLDcgKzU1Nyw3IEBACiAgICAgICAgIFZlY3RvcjxTdHJpbmc+IHYgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKICAgICAgICAgZm9yIChFbnVtZXJhdGlvbjw/PiBlID0gcHJvcGVydGllcy5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHYuYWRkKChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKSk7CisgICAgICAgICAgICAgICAgdi5hZGQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpOwogICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTU3Myw3ICs1ODAsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIHJldHVybiAiQnVmZmVyZWRJbWFnZUAiICsgSW50ZWdlci50b0hleFN0cmluZyhoYXNoQ29kZSgpKSArIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICI6IHR5cGUgPSAiICsgaW1hZ2VUeXBlICsgIiAiICsgY20gKyAiICIgKyByYXN0ZXI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisgICAgICAgICAgICAgICAgIjogdHlwZSA9ICIgKyBpbWFnZVR5cGUgKyAiICIgKyBjbSArICIgIiArIHJhc3RlcjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKICAgICB9CiAKICAgICBwdWJsaWMgV3JpdGFibGVSYXN0ZXIgZ2V0V3JpdGFibGVUaWxlKGludCB0aWxlWCwgaW50IHRpbGVZKSB7CkBAIC01OTAsMTMgKzU5NywxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYSBXcml0YWJsZVJhc3RlciBvYmplY3Qgd2hpY2ggY29udGFpbnMgdGhlIGFscGhhIGNoYW5uZWwgb2YgCi0gICAgICogQnVmZmVyZWRJbWFnZSBvYmplY3Qgd2l0aCBDb2xvck1vZGVsIG9iamVjdHMgdGhhdCBzdXBwb3J0cyAKLSAgICAgKiBhIHNlcGFyYXRlIGFscGhhIGNoYW5uZWwgc3VjaCBhcyBDb21wb25lbnRDb2xvck1vZGVsIAotICAgICAqIG9yIERpcmVjdENvbG9yTW9kZWwuCisgICAgICogR2V0cyBhIFdyaXRhYmxlUmFzdGVyIG9iamVjdCB3aGljaCBjb250YWlucyB0aGUgYWxwaGEgY2hhbm5lbCBvZgorICAgICAqIEJ1ZmZlcmVkSW1hZ2Ugb2JqZWN0IHdpdGggQ29sb3JNb2RlbCBvYmplY3RzIHRoYXQgc3VwcG9ydHMgYSBzZXBhcmF0ZQorICAgICAqIGFscGhhIGNoYW5uZWwgc3VjaCBhcyBDb21wb25lbnRDb2xvck1vZGVsIG9yIERpcmVjdENvbG9yTW9kZWwuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgV3JpdGFibGVSYXN0ZXIgb2JqZWN0IHdoaWNoIGNvbnRhaW5zIHRoZSBhbHBoYSAKLSAgICAgKiBjaGFubmVsIG9mIHRoaXMgQnVmZmVyZWRJbWFnZS4gCisgICAgICogQHJldHVybiB0aGUgV3JpdGFibGVSYXN0ZXIgb2JqZWN0IHdoaWNoIGNvbnRhaW5zIHRoZSBhbHBoYSBjaGFubmVsIG9mCisgICAgICogICAgICAgICB0aGlzIEJ1ZmZlcmVkSW1hZ2UuCiAgICAgICovCiAgICAgcHVibGljIFdyaXRhYmxlUmFzdGVyIGdldEFscGhhUmFzdGVyKCkgewogICAgICAgICByZXR1cm4gY20uZ2V0QWxwaGFSYXN0ZXIocmFzdGVyKTsKQEAgLTY0MywxMCArNjQ5LDggQEAKICAgICAgICAgaW50IG1pblggPSByYXN0ZXIuZ2V0TWluWCgpOwogICAgICAgICBpbnQgbWluWSA9IHJhc3Rlci5nZXRNaW5ZKCk7CiAKLSAgICAgICAgV3JpdGFibGVSYXN0ZXIgb3V0ciA9IFJhc3Rlci5jcmVhdGVXcml0YWJsZVJhc3RlcigKLSAgICAgICAgICAgICAgICByYXN0ZXIuZ2V0U2FtcGxlTW9kZWwoKSwKLSAgICAgICAgICAgICAgICBuZXcgUG9pbnQocmFzdGVyLmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWCgpLAotICAgICAgICAgICAgICAgIHJhc3Rlci5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVkoKSkpOworICAgICAgICBXcml0YWJsZVJhc3RlciBvdXRyID0gUmFzdGVyLmNyZWF0ZVdyaXRhYmxlUmFzdGVyKHJhc3Rlci5nZXRTYW1wbGVNb2RlbCgpLCBuZXcgUG9pbnQocmFzdGVyCisgICAgICAgICAgICAgICAgLmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWCgpLCByYXN0ZXIuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVZKCkpKTsKIAogICAgICAgICBPYmplY3QgZGF0YSA9IG51bGw7CiAKQEAgLTY3OCwxMSArNjgyLDE0IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgcmVjdGFuZ3VsYXIgYXJlYSBvZiB0aGlzIEJ1ZmZlcmVkSW1hZ2UgYXMgYSBzdWJpbWFnZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgeCBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSB5IHRoZSB5IGNvb3JkaW5hdGUuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSBzdWJpbWFnZS4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHRoZSBzdWJpbWFnZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIHggY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIHkgY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBzdWJpbWFnZS4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgc3ViaW1hZ2UuCiAgICAgICogQHJldHVybiB0aGUgQnVmZmVyZWRJbWFnZS4KICAgICAgKi8KICAgICBwdWJsaWMgQnVmZmVyZWRJbWFnZSBnZXRTdWJpbWFnZShpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkgewpAQCAtNjk3LDE4ICs3MDQsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBHcmFwaGljczJEIG9iamVjdCB3aGljaCBhbGxvd3MgdG8gZHJhdyBpbnRvIAotICAgICAqIHRoaXMgQnVmZmVyZWRJbWFnZS4KKyAgICAgKiBDcmVhdGVzIHRoZSBHcmFwaGljczJEIG9iamVjdCB3aGljaCBhbGxvd3MgdG8gZHJhdyBpbnRvIHRoaXMKKyAgICAgKiBCdWZmZXJlZEltYWdlLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGdyYXBoaWNzMkQgb2JqZWN0LgogICAgICAqLwogICAgIHB1YmxpYyBHcmFwaGljczJEIGNyZWF0ZUdyYXBoaWNzKCkgewotICAgICAgICBHcmFwaGljc0Vudmlyb25tZW50IGdlID0gCi0gICAgICAgICAgICBHcmFwaGljc0Vudmlyb25tZW50LmdldExvY2FsR3JhcGhpY3NFbnZpcm9ubWVudCgpOwotICAgICAgICAvL3JldHVybiBnZS5jcmVhdGVHcmFwaGljcyh0aGlzKTsKLSAgICAgICAgLy8/Pz9BV1QgaGFjaywgRklYTUUKLSAgICAgICAgLy9yZXR1cm4gQW5kcm9pZEdyYXBoaWNzMkQuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgLy90aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkISIpOworICAgICAgICBHcmFwaGljc0Vudmlyb25tZW50IGdlID0gR3JhcGhpY3NFbnZpcm9ubWVudC5nZXRMb2NhbEdyYXBoaWNzRW52aXJvbm1lbnQoKTsKKyAgICAgICAgLy8gcmV0dXJuIGdlLmNyZWF0ZUdyYXBoaWNzKHRoaXMpOworICAgICAgICAvLyA/Pz9BV1QgaGFjaywgRklYTUUKKyAgICAgICAgLy8gcmV0dXJuIEFuZHJvaWRHcmFwaGljczJELmdldEluc3RhbmNlKCk7CisgICAgICAgIC8vIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQhIik7CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIApAQCAtNzE4LDM4ICs3MjQsNDQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb2VyY2VzIHRoZSBkYXRhIHRvIGFjaGlldmUgdGhlIHN0YXRlIHdoaWNoIGlzIHNwZWNpZmllZCBieSAKLSAgICAgKiB0aGUgaXNBbHBoYVByZW11bHRpcGxpZWQgdmFyaWFibGUuIAorICAgICAqIENvZXJjZXMgdGhlIGRhdGEgdG8gYWNoaWV2ZSB0aGUgc3RhdGUgd2hpY2ggaXMgc3BlY2lmaWVkIGJ5IHRoZQorICAgICAqIGlzQWxwaGFQcmVtdWx0aXBsaWVkIHZhcmlhYmxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpc0FscGhhUHJlbXVsdGlwbGllZCB0aGUgaXMgYWxwaGEgcHJlbXVsdGlwbGllZCBzdGF0ZS4KKyAgICAgKiBAcGFyYW0gaXNBbHBoYVByZW11bHRpcGxpZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpcyBhbHBoYSBwcmUtbXVsdGlwbGllZCBzdGF0ZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjb2VyY2VEYXRhKGJvb2xlYW4gaXNBbHBoYVByZW11bHRpcGxpZWQpIHsKLSAgICAgICAgaWYgKGNtLmhhc0FscGhhKCkgJiYgCi0gICAgICAgICAgICAgICAgY20uaXNBbHBoYVByZW11bHRpcGxpZWQoKSAhPSBpc0FscGhhUHJlbXVsdGlwbGllZCkgeworICAgICAgICBpZiAoY20uaGFzQWxwaGEoKSAmJiBjbS5pc0FscGhhUHJlbXVsdGlwbGllZCgpICE9IGlzQWxwaGFQcmVtdWx0aXBsaWVkKSB7CiAgICAgICAgICAgICBjbSA9IGNtLmNvZXJjZURhdGEocmFzdGVyLCBpc0FscGhhUHJlbXVsdGlwbGllZCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIGFycmF5IG9mIGNvbG9ycyBpbiB0aGUgVFlQRV9JTlRfQVJHQiBjb2xvciBtb2RlbCBhbmQgCi0gICAgICogZGVmYXVsdCBzUkdCIGNvbG9yc3BhY2Ugb2YgdGhlIHNwZWNpZmllZCBhcmVhIG9mIHRoaXMKLSAgICAgKiBCdWZmZXJlZEltYWdlLiBUaGUgcmVzdWx0IGFycmF5IGlzIGNvbXBvc2VkIGJ5IHRoZSBmb2xsb3dpbmcKLSAgICAgKiBhbGdpcml0aG06Ci0gICAgICogPHA+IAotICAgICAqIHBpeGVsICAgPSByZ2JBcnJheVtvZmZzZXQgKyAoeS1zdGFydFkpKnNjYW5zaXplICsgKHgtc3RhcnRYKV0KKyAgICAgKiBHZXRzIGFuIGFycmF5IG9mIGNvbG9ycyBpbiB0aGUgVFlQRV9JTlRfQVJHQiBjb2xvciBtb2RlbCBhbmQgZGVmYXVsdCBzUkdCCisgICAgICogY29sb3Igc3BhY2Ugb2YgdGhlIHNwZWNpZmllZCBhcmVhIG9mIHRoaXMgQnVmZmVyZWRJbWFnZS4gVGhlIHJlc3VsdCBhcnJheQorICAgICAqIGlzIGNvbXBvc2VkIGJ5IHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtOgorICAgICAqIDxwPgorICAgICAqIHBpeGVsID0gcmdiQXJyYXlbb2Zmc2V0ICsgKHktc3RhcnRZKSpzY2Fuc2l6ZSArICh4LXN0YXJ0WCldCisgICAgICogPC9wPgogICAgICAqIAotICAgICAqIEBwYXJhbSBzdGFydFggdGhlIHN0YXJ0IFggYXJlYSBjb29yZGluYXRlLiAKLSAgICAgKiBAcGFyYW0gc3RhcnRZIHRoZSBzdGFydCBZIGFyZWEgY29vcmRpbmF0ZS4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIGFyZWEuIAotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIGFyZWEuCi0gICAgICogQHBhcmFtIHJnYkFycmF5IHRoZSByZXN1bHQgYXJyYXkgd2lsbCBiZSBzdG9yZWQgdG8gdGhpcyBhcnJheS4KLSAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgb2YgdGhlIHJnYkFycmF5IGFycmF5LiAKLSAgICAgKiBAcGFyYW0gc2NhbnNpemUgdGhlIHNjYW5saW5lIHN0cmlkZSBmb3IgdGhlIHJnYkFycmF5LgotICAgICAqIAorICAgICAqIEBwYXJhbSBzdGFydFgKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBYIGFyZWEgY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0gc3RhcnRZCisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgWSBhcmVhIGNvb3JkaW5hdGUuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgYXJlYS4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgYXJlYS4KKyAgICAgKiBAcGFyYW0gcmdiQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSByZXN1bHQgYXJyYXkgd2lsbCBiZSBzdG9yZWQgdG8gdGhpcyBhcnJheS4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSByZ2JBcnJheSBhcnJheS4KKyAgICAgKiBAcGFyYW0gc2NhbnNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzY2FubGluZSBzdHJpZGUgZm9yIHRoZSByZ2JBcnJheS4KICAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNvbG9ycyBmb3IgdGhlIHNwZWNpZmllZCBhcmVhLgogICAgICAqLwotICAgIHB1YmxpYyBpbnRbXSBnZXRSR0IoaW50IHN0YXJ0WCwgaW50IHN0YXJ0WSwgaW50IHcsIGludCBoLCBpbnRbXSByZ2JBcnJheSwKLSAgICAgICAgICAgIGludCBvZmZzZXQsIGludCBzY2Fuc2l6ZSkgeworICAgIHB1YmxpYyBpbnRbXSBnZXRSR0IoaW50IHN0YXJ0WCwgaW50IHN0YXJ0WSwgaW50IHcsIGludCBoLCBpbnRbXSByZ2JBcnJheSwgaW50IG9mZnNldCwKKyAgICAgICAgICAgIGludCBzY2Fuc2l6ZSkgewogICAgICAgICBpZiAocmdiQXJyYXkgPT0gbnVsbCkgewogICAgICAgICAgICAgcmdiQXJyYXkgPSBuZXcgaW50W29mZnNldCArIGggKiBzY2Fuc2l6ZV07CiAgICAgICAgIH0KQEAgLTc2NSwzOCArNzc3LDQ3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyBSR0IgdmFsdWVzIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSB0byB0aGUgc3BlY2lmaWVkCi0gICAgICogQnVmZmVyZWRJbWFnZSBhcmVhLiBUaGUgcGl4ZWxzIGFyZSBpbiB0aGUgZGVmYXVsdCBSR0IgY29sb3IgbW9kZWwgCi0gICAgICogKFRZUEVfSU5UX0FSR0IpIGFuZCBkZWZhdWx0IHNSR0IgY29sb3Igc3BhY2UuCisgICAgICogU2V0cyBSR0IgdmFsdWVzIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSB0byB0aGUgc3BlY2lmaWVkIEJ1ZmZlcmVkSW1hZ2UKKyAgICAgKiBhcmVhLiBUaGUgcGl4ZWxzIGFyZSBpbiB0aGUgZGVmYXVsdCBSR0IgY29sb3IgbW9kZWwgKFRZUEVfSU5UX0FSR0IpIGFuZAorICAgICAqIGRlZmF1bHQgc1JHQiBjb2xvciBzcGFjZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RhcnRYIHRoZSBzdGFydCBYIGNvb3JkaW5hdGUuCi0gICAgICogQHBhcmFtIHN0YXJ0WSB0aGUgc3RhcnQgWSBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgQnVmZmVyZWRJbWFnZSBhcmVhLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIEJ1ZmZlcmVkSW1hZ2UgYXJlYS4KLSAgICAgKiBAcGFyYW0gcmdiQXJyYXkgdGhlIGFycmF5IG9mIFJHQiB2YWx1ZXMuCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IG9mIHRoZSByZ2JBcnJheSBhcnJheS4gCi0gICAgICogQHBhcmFtIHNjYW5zaXplIHRoZSBzY2FubGluZSBzdHJpZGUgZm9yIHRoZSByZ2JBcnJheS4KKyAgICAgKiBAcGFyYW0gc3RhcnRYCisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgWCBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSBzdGFydFkKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBZIGNvb3JkaW5hdGUuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgQnVmZmVyZWRJbWFnZSBhcmVhLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBCdWZmZXJlZEltYWdlIGFyZWEuCisgICAgICogQHBhcmFtIHJnYkFycmF5CisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgUkdCIHZhbHVlcy4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSByZ2JBcnJheSBhcnJheS4KKyAgICAgKiBAcGFyYW0gc2NhbnNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzY2FubGluZSBzdHJpZGUgZm9yIHRoZSByZ2JBcnJheS4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSR0IoaW50IHN0YXJ0WCwgaW50IHN0YXJ0WSwgaW50IHcsIGludCBoLCBpbnRbXSByZ2JBcnJheSwKLSAgICAgICAgICAgIGludCBvZmZzZXQsIGludCBzY2Fuc2l6ZSkgeworICAgIHB1YmxpYyB2b2lkIHNldFJHQihpbnQgc3RhcnRYLCBpbnQgc3RhcnRZLCBpbnQgdywgaW50IGgsIGludFtdIHJnYkFycmF5LCBpbnQgb2Zmc2V0LAorICAgICAgICAgICAgaW50IHNjYW5zaXplKSB7CiAgICAgICAgIGludCBvZmYgPSBvZmZzZXQ7CiAgICAgICAgIGZvciAoaW50IHkgPSBzdGFydFk7IHkgPCBzdGFydFkgKyBoOyB5KyssIG9mZiArPSBzY2Fuc2l6ZSkgewogICAgICAgICAgICAgaW50IGkgPSBvZmY7CiAgICAgICAgICAgICBmb3IgKGludCB4ID0gc3RhcnRYOyB4IDwgc3RhcnRYICsgdzsgeCsrLCBpKyspIHsKLSAgICAgICAgICAgICAgICByYXN0ZXIuc2V0RGF0YUVsZW1lbnRzKHgsIHksIAotICAgICAgICAgICAgICAgICAgICAgICAgY20uZ2V0RGF0YUVsZW1lbnRzKHJnYkFycmF5W2ldLCBudWxsKSk7CisgICAgICAgICAgICAgICAgcmFzdGVyLnNldERhdGFFbGVtZW50cyh4LCB5LCBjbS5nZXREYXRhRWxlbWVudHMocmdiQXJyYXlbaV0sIG51bGwpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgYSB0aGUgc3BlY2lmaWVkIFJHQiB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIHBpeGVsIG9mCi0gICAgICogdGhpcyBCdWZmZXJlZEltYWdlLiBUaGUgcGl4ZWwgc2hvdWxkIGJlIGluIHRoZSBkZWZhdWx0IAotICAgICAqIFJHQiBjb2xvciBtb2RlbCAoVFlQRV9JTlRfQVJHQikgYW5kIGRlZmF1bHQgc1JHQiBjb2xvciBzcGFjZS4gCi0gICAgICogIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLgotICAgICAqIEBwYXJhbSByZ2IgdGhlIFJHQiB2YWx1ZSB0byBiZSBzZXQuCisgICAgICogU2V0cyBhIHRoZSBzcGVjaWZpZWQgUkdCIHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgcGl4ZWwgb2YgdGhpcworICAgICAqIEJ1ZmZlcmVkSW1hZ2UuIFRoZSBwaXhlbCBzaG91bGQgYmUgaW4gdGhlIGRlZmF1bHQgUkdCIGNvbG9yIG1vZGVsCisgICAgICogKFRZUEVfSU5UX0FSR0IpIGFuZCBkZWZhdWx0IHNSR0IgY29sb3Igc3BhY2UuCisgICAgICogCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4KKyAgICAgKiBAcGFyYW0gcmdiCisgICAgICogICAgICAgICAgICB0aGUgUkdCIHZhbHVlIHRvIGJlIHNldC4KICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0UkdCKGludCB4LCBpbnQgeSwgaW50IHJnYikgewogICAgICAgICByYXN0ZXIuc2V0RGF0YUVsZW1lbnRzKHgsIHksIGNtLmdldERhdGFFbGVtZW50cyhyZ2IsIG51bGwpKTsKQEAgLTgxNCwyNSArODM1LDI2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhIGNvbG9yIGluIHRoZSBUWVBFX0lOVF9BUkdCIGNvbG9yIG1vZGVsIGFuZCBkZWZhdWx0IAotICAgICAqIHNSR0IgY29sb3JzcGFjZSBvZiB0aGUgc3BlY2lmaWVkIHBpeGVsLiAKKyAgICAgKiBHZXRzIGEgY29sb3IgaW4gdGhlIFRZUEVfSU5UX0FSR0IgY29sb3IgbW9kZWwgYW5kIGRlZmF1bHQgc1JHQiBjb2xvcgorICAgICAqIHNwYWNlIG9mIHRoZSBzcGVjaWZpZWQgcGl4ZWwuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29sb3Igb2YgdGhlIHNwZWNpZmllZCBwaXhlbCBpbiB0aGUgVFlQRV9JTlRfQVJHQiAKLSAgICAgKiBjb2xvciBtb2RlbCBhbmQgZGVmYXVsdCBzUkdCIGNvbG9yc3BhY2UuIAorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCisgICAgICogQHJldHVybiB0aGUgY29sb3Igb2YgdGhlIHNwZWNpZmllZCBwaXhlbCBpbiB0aGUgVFlQRV9JTlRfQVJHQiBjb2xvciBtb2RlbAorICAgICAqICAgICAgICAgYW5kIGRlZmF1bHQgc1JHQiBjb2xvciBzcGFjZS4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFJHQihpbnQgeCwgaW50IHkpIHsKICAgICAgICAgcmV0dXJuIGNtLmdldFJHQihyYXN0ZXIuZ2V0RGF0YUVsZW1lbnRzKHgsIHksIG51bGwpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5lcyB0cnVlIGlmIGFscGhhIGlzIHByZW11bHRpcGxpZWQsIAotICAgICAqIGZhbHNlIGlmIGFscGhhIGlzIG5vdCBwcmVtdWx0aXBsaWVkIG9yIHRoZXJlIGlzIG5vIGFscGhhLgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhbHBoYSBpcyBwcmUtbXVsdGlwbGllZCwgZmFsc2UgaWYgYWxwaGEgaXMgbm90CisgICAgICogcHJlLW11bHRpcGxpZWQgb3IgdGhlcmUgaXMgbm8gYWxwaGEuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIGFscGhhIGlzIHByZW11bHRpcGxpZWQsIAotICAgICAqIGZhbHNlIGlmIGFscGhhIGlzIG5vdCBwcmVtdWx0aXBsaWVkIG9yIHRoZXJlIGlzIG5vIGFscGhhLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbHBoYSBpcyBwcmUtbXVsdGlwbGllZCwgZmFsc2UgaWYgYWxwaGEgaXMgbm90CisgICAgICogICAgICAgICBwcmUtbXVsdGlwbGllZCBvciB0aGVyZSBpcyBubyBhbHBoYS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0FscGhhUHJlbXVsdGlwbGllZCgpIHsKICAgICAgICAgcmV0dXJuIGNtLmlzQWxwaGFQcmVtdWx0aXBsaWVkKCk7CkBAIC05MDcsOSArOTI5LDkgQEAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIHRoZSBpbWFnZSBzdXJmYWNlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW1hZ2Ugc3VyZmFjZQorICAgICAqIEBwYXJhbSB0eXBlCisgICAgICogICAgICAgICAgICB0aGUgdHlwZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbWFnZSBzdXJmYWNlLgogICAgICAqLwogICAgIHByaXZhdGUgSW1hZ2VTdXJmYWNlIGNyZWF0ZUltYWdlU3VyZmFjZShpbnQgdHlwZSkgewogICAgICAgICByZXR1cm4gbmV3IEltYWdlU3VyZmFjZShnZXRDb2xvck1vZGVsKCksIGdldFJhc3RlcigpLCB0eXBlKTsKQEAgLTkxOCw3ICs5NDAsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGltYWdlIHN1cmZhY2UuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW1hZ2Ugc3VyZmFjZQorICAgICAqIEByZXR1cm4gdGhlIGltYWdlIHN1cmZhY2UuCiAgICAgICovCiAgICAgSW1hZ2VTdXJmYWNlIGdldEltYWdlU3VyZmFjZSgpIHsKICAgICAgICAgcmV0dXJuIGltYWdlU3VyZjsKQEAgLTkyOCw0ICs5NTAsMyBAQAogICAgICAgICByZXR1cm4gY20uZ2V0VHJhbnNwYXJlbmN5KCk7CiAgICAgfQogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvQnVmZmVyZWRJbWFnZUZpbHRlci5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL0J1ZmZlcmVkSW1hZ2VGaWx0ZXIuamF2YQppbmRleCA0NGIzYzJlLi44YjZmY2YwIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvQnVmZmVyZWRJbWFnZUZpbHRlci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9CdWZmZXJlZEltYWdlRmlsdGVyLmphdmEKQEAgLTI3LDQ5ICsyNyw3MiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFRoZSBCdWZmZXJlZEltYWdlRmlsdGVyIGNsYXNzIHByb3ZpZGVzIGZpbHRlcmluZyBvcGVyYXRpb25zIHRvIAotICogdGhlIEJ1ZmZlcmVkSW1hZ2Ugb2JqZWN0cyB1c2luZyBvcGVyYXRvcnMgd2hpY2ggaW1wbGVtZW50Ci0gKiBCdWZmZXJlZEltYWdlT3AgaW50ZXJmYWNlLgorICogVGhlIEJ1ZmZlcmVkSW1hZ2VGaWx0ZXIgY2xhc3MgcHJvdmlkZXMgZmlsdGVyaW5nIG9wZXJhdGlvbnMgdG8gdGhlCisgKiBCdWZmZXJlZEltYWdlIG9iamVjdHMgdXNpbmcgb3BlcmF0b3JzIHdoaWNoIGltcGxlbWVudCBCdWZmZXJlZEltYWdlT3AKKyAqIGludGVyZmFjZS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBCdWZmZXJlZEltYWdlRmlsdGVyIGV4dGVuZHMgSW1hZ2VGaWx0ZXIgaW1wbGVtZW50cyBDbG9uZWFibGUgewotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgYWNjZXNzb3IuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgYWNjZXNzb3IuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXd0SW1hZ2VCYWNrZG9vckFjY2Vzc29yIGFjY2Vzc29yID0gQXd0SW1hZ2VCYWNrZG9vckFjY2Vzc29yLmdldEluc3RhbmNlKCk7CiAKLSAgICAvKiogVGhlIG9wLiAqLworICAgIC8qKgorICAgICAqIFRoZSBvcC4KKyAgICAgKi8KICAgICBwcml2YXRlIEJ1ZmZlcmVkSW1hZ2VPcCBvcDsKIAotICAgIC8qKiBUaGUgcmFzdGVyLiAqLworICAgIC8qKgorICAgICAqIFRoZSByYXN0ZXIuCisgICAgICovCiAgICAgcHJpdmF0ZSBXcml0YWJsZVJhc3RlciByYXN0ZXI7CiAKLSAgICAvKiogVGhlIGkgZGF0YS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgaSBkYXRhLgorICAgICAqLwogICAgIHByaXZhdGUgaW50IGlEYXRhW107Ci0gICAgCi0gICAgLyoqIFRoZSBiIGRhdGEuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgYiBkYXRhLgorICAgICAqLwogICAgIHByaXZhdGUgYnl0ZSBiRGF0YVtdOwogCi0gICAgLyoqIFRoZSB3aWR0aC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgd2lkdGguCisgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgd2lkdGg7Ci0gICAgCi0gICAgLyoqIFRoZSBoZWlnaHQuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgaGVpZ2h0LgorICAgICAqLwogICAgIHByaXZhdGUgaW50IGhlaWdodDsKIAotICAgIC8qKiBUaGUgY20uICovCisgICAgLyoqCisgICAgICogVGhlIGNtLgorICAgICAqLwogICAgIHByaXZhdGUgQ29sb3JNb2RlbCBjbTsKIAotICAgIC8qKiBUaGUgZm9yY2VkIHJnYi4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgZm9yY2VkIHJnYi4KKyAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gZm9yY2VkUkdCID0gZmFsc2U7Ci0gICAgCi0gICAgLyoqIFRoZSB0cmFuc2ZlciB0eXBlLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHRyYW5zZmVyIHR5cGUuCisgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgdHJhbnNmZXJUeXBlID0gRGF0YUJ1ZmZlci5UWVBFX1VOREVGSU5FRDsKIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBCdWZmZXJlZEltYWdlRmlsdGVyIHdpdGggdGhlIHNwZWNpZmllZAotICAgICAqIEJ1ZmZlcmVkSW1hZ2VPcCBvcGVyYXRvci4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQnVmZmVyZWRJbWFnZUZpbHRlciB3aXRoIHRoZSBzcGVjaWZpZWQgQnVmZmVyZWRJbWFnZU9wCisgICAgICogb3BlcmF0b3IuCiAgICAgICogCi0gICAgICogQHBhcmFtIG9wIHRoZSBzcGVjaWZpZWQgQnVmZmVyZWRJbWFnZU9wIG9wZXJhdG9yLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgQnVmZmVyZWRJbWFnZU9wIGlzIG51bGwuCisgICAgICogQHBhcmFtIG9wCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIEJ1ZmZlcmVkSW1hZ2VPcCBvcGVyYXRvci4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgQnVmZmVyZWRJbWFnZU9wIGlzIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIEJ1ZmZlcmVkSW1hZ2VGaWx0ZXIoQnVmZmVyZWRJbWFnZU9wIG9wKSB7CiAgICAgICAgIGlmIChvcCA9PSBudWxsKSB7CkBAIC03OSwxMSArMTAyLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgQnVmZmVyZWRJbWFnZU9wIG9wZXJhdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIAorICAgICAqIEdldHMgdGhlIEJ1ZmZlcmVkSW1hZ2VPcCBvcGVyYXRvciBhc3NvY2lhdGVkIHdpdGggdGhpcwogICAgICAqIEJ1ZmZlcmVkSW1hZ2VGaWx0ZXIgb2JqZWN0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIEJ1ZmZlcmVkSW1hZ2VPcCBhc3NvY2lhdGVkIHdpdGggdGhpcyAKLSAgICAgKiBCdWZmZXJlZEltYWdlRmlsdGVyIG9iamVjdC4KKyAgICAgKiBAcmV0dXJuIHRoZSBCdWZmZXJlZEltYWdlT3AgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQnVmZmVyZWRJbWFnZUZpbHRlcgorICAgICAqICAgICAgICAgb2JqZWN0LgogICAgICAqLwogICAgIHB1YmxpYyBCdWZmZXJlZEltYWdlT3AgZ2V0QnVmZmVyZWRJbWFnZU9wKCkgewogICAgICAgICByZXR1cm4gb3A7CkBAIC0xMTAsMjIgKzEzMywxNCBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFBpeGVscygKLSAgICAgICAgICAgIGludCB4LCBpbnQgeSwgaW50Ci0gICAgICAgICAgICB3LCBpbnQgaCwKLSAgICAgICAgICAgIENvbG9yTW9kZWwgbW9kZWwsIGJ5dGVbXSBwaXhlbHMsCi0gICAgICAgICAgICBpbnQgb2ZmLCBpbnQgc2NhbnNpemUKLSAgICApIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIENvbG9yTW9kZWwgbW9kZWwsIGJ5dGVbXSBwaXhlbHMsIGludCBvZmYsCisgICAgICAgICAgICBpbnQgc2NhbnNpemUpIHsKICAgICAgICAgc2V0UGl4ZWxzKHgsIHksIHcsIGgsIG1vZGVsLCBwaXhlbHMsIG9mZiwgc2NhbnNpemUsIHRydWUpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFBpeGVscygKLSAgICAgICAgICAgIGludCB4LCBpbnQgeSwKLSAgICAgICAgICAgIGludCB3LCBpbnQgaCwKLSAgICAgICAgICAgIENvbG9yTW9kZWwgbW9kZWwsIGludFtdIHBpeGVscywKLSAgICAgICAgICAgIGludCBvZmYsIGludCBzY2Fuc2l6ZQotICAgICkgeworICAgIHB1YmxpYyB2b2lkIHNldFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgQ29sb3JNb2RlbCBtb2RlbCwgaW50W10gcGl4ZWxzLCBpbnQgb2ZmLAorICAgICAgICAgICAgaW50IHNjYW5zaXplKSB7CiAgICAgICAgIHNldFBpeGVscyh4LCB5LCB3LCBoLCBtb2RlbCwgcGl4ZWxzLCBvZmYsIHNjYW5zaXplLCBmYWxzZSk7CiAgICAgfQogCkBAIC0xNjMsMjIgKzE3OCwyNyBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHBpeGVscy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgeAotICAgICAqIEBwYXJhbSB5IHRoZSB5Ci0gICAgICogQHBhcmFtIHcgdGhlIHcKLSAgICAgKiBAcGFyYW0gaCB0aGUgaAotICAgICAqIEBwYXJhbSBtb2RlbCB0aGUgbW9kZWwKLSAgICAgKiBAcGFyYW0gcGl4ZWxzIHRoZSBwaXhlbHMKLSAgICAgKiBAcGFyYW0gb2ZmIHRoZSBvZmYKLSAgICAgKiBAcGFyYW0gc2NhbnNpemUgdGhlIHNjYW5zaXplCi0gICAgICogQHBhcmFtIGlzQnl0ZURhdGEgdGhlIGlzIGJ5dGUgZGF0YQorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgeC4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIHkuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3LgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaC4KKyAgICAgKiBAcGFyYW0gbW9kZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBtb2RlbC4KKyAgICAgKiBAcGFyYW0gcGl4ZWxzCisgICAgICogICAgICAgICAgICB0aGUgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBvZmYKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmYuCisgICAgICogQHBhcmFtIHNjYW5zaXplCisgICAgICogICAgICAgICAgICB0aGUgc2NhbnNpemUuCisgICAgICogQHBhcmFtIGlzQnl0ZURhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBpcyBieXRlIGRhdGEuCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldFBpeGVscygKLSAgICAgICAgICAgIGludCB4LCBpbnQgeSwKLSAgICAgICAgICAgIGludCB3LCBpbnQgaCwKLSAgICAgICAgICAgIENvbG9yTW9kZWwgbW9kZWwsIE9iamVjdCBwaXhlbHMsCi0gICAgICAgICAgICBpbnQgb2ZmLCBpbnQgc2NhbnNpemUsIGJvb2xlYW4gaXNCeXRlRGF0YQotICAgICkgeworICAgIHByaXZhdGUgdm9pZCBzZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIENvbG9yTW9kZWwgbW9kZWwsIE9iamVjdCBwaXhlbHMsIGludCBvZmYsCisgICAgICAgICAgICBpbnQgc2NhbnNpemUsIGJvb2xlYW4gaXNCeXRlRGF0YSkgewogICAgICAgICAvLyBDaGVjayBib3VuZHMKICAgICAgICAgLy8gTmVlZCB0byBjb3B5IG9ubHkgdGhlIHBpeGVscyB0aGF0IHdpbGwgZml0IGludG8gdGhlIGRlc3RpbmF0aW9uIGFyZWEKICAgICAgICAgaWYgKHggPCAwKSB7CkBAIC0yMTYsMjMgKzIzNiwyNCBAQAogCiAgICAgICAgIGJvb2xlYW4gY2FuQXJyYXljb3B5OwogICAgICAgICAvLyBQcm9jZXNzIHBpeGVscwotICAgICAgICBzd2l0Y2godHJhbnNmZXJUeXBlKSB7CisgICAgICAgIHN3aXRjaCAodHJhbnNmZXJUeXBlKSB7CiAgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VTkRFRklORUQ6IHsKICAgICAgICAgICAgICAgICBpZiAoaXNCeXRlRGF0YSkgewogICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlclR5cGUgPSBEYXRhQnVmZmVyLlRZUEVfQllURTsKICAgICAgICAgICAgICAgICAgICAgY3JlYXRlUmFzdGVyKHRyYW5zZmVyVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vYkRhdGEgPSBuZXcgYnl0ZVt3aWR0aCpoZWlnaHRdOworICAgICAgICAgICAgICAgICAgICAvLyBiRGF0YSA9IG5ldyBieXRlW3dpZHRoKmhlaWdodF07CiAgICAgICAgICAgICAgICAgICAgIGNhbkFycmF5Y29weSA9ICFmb3JjZWRSR0I7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0cmFuc2ZlclR5cGUgPSBEYXRhQnVmZmVyLlRZUEVfSU5UOwogICAgICAgICAgICAgICAgIGNyZWF0ZVJhc3Rlcih0cmFuc2ZlclR5cGUpOwotICAgICAgICAgICAgICAgIC8vaURhdGEgPSBuZXcgaW50W3dpZHRoKmhlaWdodF07CisgICAgICAgICAgICAgICAgLy8gaURhdGEgPSBuZXcgaW50W3dpZHRoKmhlaWdodF07CiAgICAgICAgICAgICAgICAgY2FuQXJyYXljb3B5ID0gIWZvcmNlZFJHQiB8fCBtb2RlbC5lcXVhbHMoQ29sb3JNb2RlbC5nZXRSR0JkZWZhdWx0KCkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfSAvLyBBbmQgcHJvY2VlZCB0byBjb3B5IHRoZSBwaXhlbHMKICAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDogewotICAgICAgICAgICAgICAgIGlmIChpc0J5dGVEYXRhKSB7IC8vIFRoZXJlIGFyZSBpbnQgZGF0YSBhbHJlYWR5IGJ1dCB0aGUgbmV3IGRhdGEgYXJlIGJ5dGVzCisgICAgICAgICAgICAgICAgaWYgKGlzQnl0ZURhdGEpIHsgLy8gVGhlcmUgYXJlIGludCBkYXRhIGFscmVhZHkgYnV0IHRoZSBuZXcgZGF0YQorICAgICAgICAgICAgICAgICAgICAvLyBhcmUgYnl0ZXMKICAgICAgICAgICAgICAgICAgICAgZm9yY2VSR0IoKTsKICAgICAgICAgICAgICAgICAgICAgY2FuQXJyYXljb3B5ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjUwLDcgKzI3MSw4IEBACiAgICAgICAgICAgICAgICAgLy8gUkdCIGNvbnZlcnNpb24KICAgICAgICAgICAgICAgICBjYW5BcnJheWNvcHkgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZGVmYXVsdDogeworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDogewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMDYiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjYwLDcgKzI4Miw3IEBACiAgICAgICAgIGludCBkc3RPZmZzZXQgPSB4ICsgeSAqIHdpZHRoOwogCiAgICAgICAgIGlmIChjYW5BcnJheWNvcHkpIHsKLSAgICAgICAgICAgIE9iamVjdCBkc3RBcnJheSA9IGlzQnl0ZURhdGEgPyAoT2JqZWN0KSBiRGF0YSA6IChPYmplY3QpIGlEYXRhOworICAgICAgICAgICAgT2JqZWN0IGRzdEFycmF5ID0gaXNCeXRlRGF0YSA/IChPYmplY3QpYkRhdGEgOiAoT2JqZWN0KWlEYXRhOwogICAgICAgICAgICAgZm9yICg7IG9mZiA8IG1heE9mZnNldDsgb2ZmICs9IHNjYW5zaXplLCBkc3RPZmZzZXQgKz0gd2lkdGgpIHsKICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHBpeGVscywgb2ZmLCBkc3RBcnJheSwgZHN0T2Zmc2V0LCB3KTsKICAgICAgICAgICAgIH0KQEAgLTI3MSwxMSArMjkzLDggQEAKICAgICAgICAgICAgICAgICBpbnQgZHN0UG9zID0gZHN0T2Zmc2V0OwogICAgICAgICAgICAgICAgIGludCBtYXhEc3RQb3MgPSBkc3RPZmZzZXQgKyB3OwogICAgICAgICAgICAgICAgIGZvciAoOyBkc3RQb3MgPCBtYXhEc3RQb3M7IGRzdFBvcysrLCBzcmNQb3MrKykgewotICAgICAgICAgICAgICAgICAgICBpRGF0YVtkc3RQb3NdID0gbW9kZWwuZ2V0UkdCKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQnl0ZURhdGEgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYnl0ZVtdKXBpeGVscylbc3JjUG9zXSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpbnRbXSlwaXhlbHMpW3NyY1Bvc10KLSAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgaURhdGFbZHN0UG9zXSA9IG1vZGVsLmdldFJHQihpc0J5dGVEYXRhID8gKChieXRlW10pcGl4ZWxzKVtzcmNQb3NdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoKGludFtdKXBpeGVscylbc3JjUG9zXSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yODcsMjIgKzMwNiwyNCBAQAogICAgIHByaXZhdGUgdm9pZCBmb3JjZVJHQigpIHsKICAgICAgICAgaWYgKCFmb3JjZWRSR0IpIHsKICAgICAgICAgICAgIGZvcmNlZFJHQiA9IHRydWU7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IHdpZHRoKmhlaWdodDsKKyAgICAgICAgICAgIGludCBzaXplID0gd2lkdGggKiBoZWlnaHQ7CiAgICAgICAgICAgICBpbnQgcmdiRGF0YVtdID0gbmV3IGludFtzaXplXTsKIAogICAgICAgICAgICAgaWYgKGJEYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8c2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgcmdiRGF0YVtpXSA9IGNtLmdldFJHQihiRGF0YVtpXSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmIChpRGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIHJnYkRhdGFbaV0gPSBjbS5nZXRSR0IoaURhdGFbaV0pOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgY20gPSBDb2xvck1vZGVsLmdldFJHQmRlZmF1bHQoKTsKICAgICAgICAgICAgIERhdGFCdWZmZXJJbnQgZGIgPSBuZXcgRGF0YUJ1ZmZlckludChyZ2JEYXRhLCBzaXplKTsKLSAgICAgICAgICAgIGludCBtYXNrc1tdID0gbmV3IGludFtdIHsweDAwZmYwMDAwLCAweDAwMDBmZjAwLCAweDAwMDAwMGZmLCAweGZmMDAwMDAwfTsKKyAgICAgICAgICAgIGludCBtYXNrc1tdID0gbmV3IGludFtdIHsKKyAgICAgICAgICAgICAgICAgICAgMHgwMGZmMDAwMCwgMHgwMDAwZmYwMCwgMHgwMDAwMDBmZiwgMHhmZjAwMDAwMAorICAgICAgICAgICAgfTsKICAgICAgICAgICAgIHJhc3RlciA9IFJhc3Rlci5jcmVhdGVQYWNrZWRSYXN0ZXIoZGIsIHdpZHRoLCBoZWlnaHQsIHdpZHRoLCBtYXNrcywgbnVsbCk7CiAgICAgICAgICAgICBpRGF0YSA9IGFjY2Vzc29yLmdldERhdGFJbnQoZGIpOwogICAgICAgICAgICAgYkRhdGEgPSBudWxsOwpAQCAtMzI3LDExICszNDgsMTIgQEAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIHRoZSByYXN0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFUeXBlIHRoZSBkYXRhIHR5cGUKKyAgICAgKiBAcGFyYW0gZGF0YVR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIHR5cGUuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVJhc3RlcihpbnQgZGF0YVR5cGUpIHsKICAgICAgICAgYm9vbGVhbiBjcmVhdGVkVmFsaWRCdWZmZXIgPSBmYWxzZTsKLSAgICAgICAgdHJ5eworICAgICAgICB0cnkgewogICAgICAgICAgICAgcmFzdGVyID0gY20uY3JlYXRlQ29tcGF0aWJsZVdyaXRhYmxlUmFzdGVyKHdpZHRoLCBoZWlnaHQpOwogICAgICAgICAgICAgaW50IHJhc3RlclR5cGUgPSByYXN0ZXIuZ2V0RGF0YUJ1ZmZlcigpLmdldERhdGFUeXBlKCk7CiAgICAgICAgICAgICBpZiAocmFzdGVyVHlwZSA9PSBkYXRhVHlwZSkgewpAQCAtMzU0LDEzICszNzYsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWRWYWxpZEJ1ZmZlciA9IGZhbHNlOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmKGNtID09IENvbG9yTW9kZWwuZ2V0UkdCZGVmYXVsdCgpKXsKKyAgICAgICAgICAgICAgICBpZiAoY20gPT0gQ29sb3JNb2RlbC5nZXRSR0JkZWZhdWx0KCkpIHsKICAgICAgICAgICAgICAgICAgICAgZm9yY2VkUkdCID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGNyZWF0ZWRWYWxpZEJ1ZmZlciA9IGZhbHNlOwogICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBjcmVhdGVkVmFsaWRCdWZmZXIgPSBmYWxzZTsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvQnVmZmVyZWRJbWFnZU9wLmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvQnVmZmVyZWRJbWFnZU9wLmphdmEKaW5kZXggODViOWY0ZS4uODgzYTM5ZCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL0J1ZmZlcmVkSW1hZ2VPcC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9CdWZmZXJlZEltYWdlT3AuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBBbGV4ZXkgQS4gUGV0cmVua28KICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmltYWdlOwogCiBpbXBvcnQgamF2YS5hd3QuUmVuZGVyaW5nSGludHM7CkBAIC0yNywzMiArMjgsMzYgQEAKIC8qKgogICogVGhlIEJ1ZmZlcmVkSW1hZ2VPcCBpbnRlcmZhY2UgcHJvdmlkZXMgbWV0aG9kcyBmb3IgcGVyZm9ybWluZyB0cmFuc2Zvcm1hdGlvbnMKICAqIGZyb20gc291cmNlIGRhdGEgdG8gZGVzdGluYXRpb24gZGF0YSBmb3IgQnVmZmVyZWRJbWFnZSBvYmplY3RzLiBBbiBvYmplY3QKLSAqIGltcGxlbWVudGluZyB0aGlzIGludGVyZmFjZSBjYW4gYmUgcGFzc2VkIGludG8gYSBCdWZmZXJlZEltYWdlRmlsdGVyIAotICogdG8gb3BlcmF0ZSBvbiBhIEJ1ZmZlcmVkSW1hZ2UuCisgKiBpbXBsZW1lbnRpbmcgdGhpcyBpbnRlcmZhY2UgY2FuIGJlIHBhc3NlZCBpbnRvIGEgQnVmZmVyZWRJbWFnZUZpbHRlciB0bworICogb3BlcmF0ZSBvbiBhIEJ1ZmZlcmVkSW1hZ2UuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIEJ1ZmZlcmVkSW1hZ2VPcCB7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBDcmVhdGVzIGEgZGVzdGluYXRpb24gaW1hZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIEJ1ZmZlcmVkSW1hZ2UgYW5kCi0gICAgICogQ29sb3JNb2RlbDsgdGhpcyBkZXN0aW5hdGlvbiBpbWFnZSBpcyBlbXB0eSBhbmQgaGFzIHRoZSBjb3JyZWN0IHNpemUgCi0gICAgICogYW5kIG51bWJlciBvZiBiYW5kcy4gICAKKyAgICAgKiBDb2xvck1vZGVsOyB0aGlzIGRlc3RpbmF0aW9uIGltYWdlIGlzIGVtcHR5IGFuZCBoYXMgdGhlIGNvcnJlY3Qgc2l6ZSBhbmQKKyAgICAgKiBudW1iZXIgb2YgYmFuZHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNyYyB0aGUgc291cmNlIEJ1ZmZlcmVkSW1hZ2UuCi0gICAgICogQHBhcmFtIGRlc3RDTSB0aGUgZGVzdGluYXRpb24gQ29sb3JNb2RlbC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3JjCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIEJ1ZmZlcmVkSW1hZ2UuCisgICAgICogQHBhcmFtIGRlc3RDTQorICAgICAqICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIENvbG9yTW9kZWwuCiAgICAgICogQHJldHVybiB0aGUgQnVmZmVyZWRJbWFnZS4KICAgICAgKi8KICAgICBwdWJsaWMgQnVmZmVyZWRJbWFnZSBjcmVhdGVDb21wYXRpYmxlRGVzdEltYWdlKEJ1ZmZlcmVkSW1hZ2Ugc3JjLCBDb2xvck1vZGVsIGRlc3RDTSk7CiAKICAgICAvKioKLSAgICAgKiBQZXJmb3JtcyBhIGZpbHRlciBvcGVyYXRpb24gb24gdGhlIHNvdXJjZSBCdWZmZXJlZEltYWdlIGFuZCBzdG9yZXMgCi0gICAgICogdGhlIHJlc3VsdGluZyBCdWZmZXJlZEltYWdlIHRvIHRoZSBkZXN0aW5hdGlvbiBCdWZmZXJlZEltYWdlLiBJZiAKLSAgICAgKiB0aGUgZGVzdGluYXRpb24gQnVmZmVyZWRJbWFnZSBpcyBudWxsLCBhIEJ1ZmZlcmVkSW1hZ2Ugd2l0aCBhbiAKLSAgICAgKiBhcHByb3ByaWF0ZSBDb2xvck1vZGVsIGlzIGNyZWF0ZWQuCisgICAgICogUGVyZm9ybXMgYSBmaWx0ZXIgb3BlcmF0aW9uIG9uIHRoZSBzb3VyY2UgQnVmZmVyZWRJbWFnZSBhbmQgc3RvcmVzIHRoZQorICAgICAqIHJlc3VsdGluZyBCdWZmZXJlZEltYWdlIHRvIHRoZSBkZXN0aW5hdGlvbiBCdWZmZXJlZEltYWdlLiBJZiB0aGUKKyAgICAgKiBkZXN0aW5hdGlvbiBCdWZmZXJlZEltYWdlIGlzIG51bGwsIGEgQnVmZmVyZWRJbWFnZSB3aXRoIGFuIGFwcHJvcHJpYXRlCisgICAgICogQ29sb3JNb2RlbCBpcyBjcmVhdGVkLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzcmMgdGhlIHNvdXJjZSBCdWZmZXJlZEltYWdlLgotICAgICAqIEBwYXJhbSBkZXN0IHRoZSBkZXN0aW5hdGlvbiBCdWZmZXJlZEltYWdlLCB3aGVyZSB0aGUgcmVzdWx0IGlzIHN0b3JlZC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3JjCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIEJ1ZmZlcmVkSW1hZ2UuCisgICAgICogQHBhcmFtIGRlc3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiBCdWZmZXJlZEltYWdlLCB3aGVyZSB0aGUgcmVzdWx0IGlzIHN0b3JlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBmaWx0ZXJlZCBCdWZmZXJlZEltYWdlLgogICAgICAqLwogICAgIHB1YmxpYyBCdWZmZXJlZEltYWdlIGZpbHRlcihCdWZmZXJlZEltYWdlIHNyYywgQnVmZmVyZWRJbWFnZSBkZXN0KTsKQEAgLTYwLDE5ICs2NSwyMCBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGJvdW5kcyBvZiBmaWx0ZXJlZCBpbWFnZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3JjIHRoZSBzb3VyY2UgQnVmZmVyZWRJbWFnZSB0byBiZSBmaWx0ZXJlZC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3JjCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIEJ1ZmZlcmVkSW1hZ2UgdG8gYmUgZmlsdGVyZWQuCiAgICAgICogQHJldHVybiB0aGUgcmVjdGFuZ2xlIGJvdW5kcyBvZiBmaWx0ZXJlZCBpbWFnZS4KICAgICAgKi8KICAgICBwdWJsaWMgUmVjdGFuZ2xlMkQgZ2V0Qm91bmRzMkQoQnVmZmVyZWRJbWFnZSBzcmMpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgcG9pbnQgb2YgdGhlIGRlc3RpbmF0aW9uIGltYWdlIHdoaWNoIGNvcnJlc3BvbmRzCi0gICAgICogdG8gdGhlIHNwZWNpZmllZCBwb2ludCBpbiB0aGUgc291cmNlIGltYWdlLiAKKyAgICAgKiBHZXRzIHRoZSBwb2ludCBvZiB0aGUgZGVzdGluYXRpb24gaW1hZ2Ugd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlCisgICAgICogc3BlY2lmaWVkIHBvaW50IGluIHRoZSBzb3VyY2UgaW1hZ2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNyY1B0IHRoZSBwb2ludCBvZiB0aGUgc291cmNlIGltYWdlLgotICAgICAqIEBwYXJhbSBkc3RQdCB0aGUgcG9pbnQgd2hlcmUgdGhlIHJlc3VsdCB3aWxsIGJlIHN0b3JlZC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3JjUHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb2ludCBvZiB0aGUgc291cmNlIGltYWdlLgorICAgICAqIEBwYXJhbSBkc3RQdAorICAgICAqICAgICAgICAgICAgdGhlIHBvaW50IHdoZXJlIHRoZSByZXN1bHQgd2lsbCBiZSBzdG9yZWQuCiAgICAgICogQHJldHVybiB0aGUgZGVzdGluYXRpb24gcG9pbnQuCiAgICAgICovCiAgICAgcHVibGljIFBvaW50MkQgZ2V0UG9pbnQyRChQb2ludDJEIHNyY1B0LCBQb2ludDJEIGRzdFB0KTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9CeXRlTG9va3VwVGFibGUuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9CeXRlTG9va3VwVGFibGUuamF2YQppbmRleCAwNDNiNTMzLi4yN2NlZTMwIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvQnl0ZUxvb2t1cFRhYmxlLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL0J5dGVMb29rdXBUYWJsZS5qYXZhCkBAIC0yNCwyNSArMjQsMjkgQEAKIHBhY2thZ2UgamF2YS5hd3QuaW1hZ2U7CiAKIC8qKgotICogVGhlIEJ5dGVMb29rdXBUYWJsZSBjbGFzcyBwcm92aWRlcyBmdW5jdGlvbmFsaXR5IGZvciBsb29rdXAgb3BlcmF0aW9ucywgCi0gKiBhbmQgaXMgZGVmaW5lZCBieSBhbiBpbnB1dCBieXRlIGFycmF5IGZvciBiYW5kcyBvciBjb21wb25lbnRzIG9mIAotICogaW1hZ2UgYW5kIGFuIG9mZnNldCB2YWx1ZS4KLSAqIFRoZSBvZmZzZXQgdmFsdWUgd2lsbCBiZSBzdWJ0cmFjdGVkIGZyb20gdGhlIGlucHV0IHZhbHVlcyBiZWZvcmUgCi0gKiBpbmRleGluZyB0aGUgaW5wdXQgYXJyYXlzLiBUaGUgb3V0cHV0IG9mIGEgbG9va3VwIG9wZXJhdGlvbiBpcyAKKyAqIFRoZSBCeXRlTG9va3VwVGFibGUgY2xhc3MgcHJvdmlkZXMgZnVuY3Rpb25hbGl0eSBmb3IgbG9va3VwIG9wZXJhdGlvbnMsIGFuZAorICogaXMgZGVmaW5lZCBieSBhbiBpbnB1dCBieXRlIGFycmF5IGZvciBiYW5kcyBvciBjb21wb25lbnRzIG9mIGltYWdlIGFuZCBhbgorICogb2Zmc2V0IHZhbHVlLiBUaGUgb2Zmc2V0IHZhbHVlIHdpbGwgYmUgc3VidHJhY3RlZCBmcm9tIHRoZSBpbnB1dCB2YWx1ZXMKKyAqIGJlZm9yZSBpbmRleGluZyB0aGUgaW5wdXQgYXJyYXlzLiBUaGUgb3V0cHV0IG9mIGEgbG9va3VwIG9wZXJhdGlvbiBpcwogICogcmVwcmVzZW50ZWQgYXMgYW4gYXJyYXkgb2YgdW5zaWduZWQgYnl0ZXMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQnl0ZUxvb2t1cFRhYmxlIGV4dGVuZHMgTG9va3VwVGFibGUgewotICAgIAotICAgIC8qKiBUaGUgZGF0YS4gKi8KLSAgICBwcml2YXRlIGJ5dGUgZGF0YVtdW107Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQnl0ZUxvb2t1cFRhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBvZmZzZXQgdmFsdWUKLSAgICAgKiBhbmQgdGhlIHNwZWNpZmllZCBieXRlIGFycmF5IHdoaWNoIHJlcHJlc2VudHMgdGhlIGxvb2t1cCB0YWJsZSBmb3IKLSAgICAgKiBhbGwgYmFuZHMuCisgICAgICogVGhlIGRhdGEuCisgICAgICovCisgICAgcHJpdmF0ZSBieXRlIGRhdGFbXVtdOworCisgICAgLyoqCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEJ5dGVMb29rdXBUYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgb2Zmc2V0IHZhbHVlIGFuZAorICAgICAqIHRoZSBzcGVjaWZpZWQgYnl0ZSBhcnJheSB3aGljaCByZXByZXNlbnRzIHRoZSBsb29rdXAgdGFibGUgZm9yIGFsbCBiYW5kcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdmFsdWUuCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGRhdGEgYXJyYXkgb2YgYnl0ZXMuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgYXJyYXkgb2YgYnl0ZXMuCiAgICAgICovCiAgICAgcHVibGljIEJ5dGVMb29rdXBUYWJsZShpbnQgb2Zmc2V0LCBieXRlW10gZGF0YSkgewogICAgICAgICBzdXBlcihvZmZzZXQsIDEpOwpAQCAtNTQsMTIgKzU4LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEJ5dGVMb29rdXBUYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgb2Zmc2V0IHZhbHVlCi0gICAgICogYW5kIHRoZSBzcGVjaWZpZWQgYnl0ZSBhcnJheSBvZiBhcnJheXMgd2hpY2ggcmVwcmVzZW50cyB0aGUgbG9va3VwIHRhYmxlCi0gICAgICogZm9yIGVhY2ggYmFuZC4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQnl0ZUxvb2t1cFRhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBvZmZzZXQgdmFsdWUgYW5kCisgICAgICogdGhlIHNwZWNpZmllZCBieXRlIGFycmF5IG9mIGFycmF5cyB3aGljaCByZXByZXNlbnRzIHRoZSBsb29rdXAgdGFibGUgZm9yCisgICAgICogZWFjaCBiYW5kLgogICAgICAqIAotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgZGF0YSBhcnJheSBvZiBieXRlcyBhcnJheSBmb3IgZWFjaCBiYW5kLgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgdmFsdWUuCisgICAgICogQHBhcmFtIGRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIGFycmF5IG9mIGJ5dGVzIGFycmF5IGZvciBlYWNoIGJhbmQuCiAgICAgICovCiAgICAgcHVibGljIEJ5dGVMb29rdXBUYWJsZShpbnQgb2Zmc2V0LCBieXRlW11bXSBkYXRhKSB7CiAgICAgICAgIHN1cGVyKG9mZnNldCwgZGF0YS5sZW5ndGgpOwpAQCAtNzEsOSArNzcsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGxvb2t1cCB0YWJsZSBvZiB0aGlzIEJ5dGVMb29rdXBUYWJsZSBvYmplY3QuIElmIAotICAgICAqIHRoaXMgQnl0ZUxvb2t1cFRhYmxlIG9iamVjdCBoYXMgb25lIGJ5dGUgYXJyYXkgZm9yIGFsbCBiYW5kcywgCi0gICAgICogdGhlIHJldHVybmVkIGFycmF5IGxlbmd0aCBpcyBvbmUuCisgICAgICogR2V0cyB0aGUgbG9va3VwIHRhYmxlIG9mIHRoaXMgQnl0ZUxvb2t1cFRhYmxlIG9iamVjdC4gSWYgdGhpcworICAgICAqIEJ5dGVMb29rdXBUYWJsZSBvYmplY3QgaGFzIG9uZSBieXRlIGFycmF5IGZvciBhbGwgYmFuZHMsIHRoZSByZXR1cm5lZAorICAgICAqIGFycmF5IGxlbmd0aCBpcyBvbmUuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgbG9va3VwIHRhYmxlIG9mIHRoaXMgQnl0ZUxvb2t1cFRhYmxlIG9iamVjdC4KICAgICAgKi8KQEAgLTkxLDExICs5NywxMSBAQAogICAgICAgICBpbnQgb2Zmc2V0ID0gZ2V0T2Zmc2V0KCk7CiAgICAgICAgIGlmIChnZXROdW1Db21wb25lbnRzKCkgPT0gMSkgewogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcmMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBkc3RbaV0gPSBkYXRhWzBdW3NyY1tpXS1vZmZzZXRdOworICAgICAgICAgICAgICAgIGRzdFtpXSA9IGRhdGFbMF1bc3JjW2ldIC0gb2Zmc2V0XTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ2V0TnVtQ29tcG9uZW50cygpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBkc3RbaV0gPSBkYXRhW2ldW3NyY1tpXS1vZmZzZXRdOworICAgICAgICAgICAgICAgIGRzdFtpXSA9IGRhdGFbaV1bc3JjW2ldIC0gb2Zmc2V0XTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xMDMsMTQgKzEwOSwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBieXRlIGFycmF5IHdoaWNoIGNvbnRhaW5zIHNhbXBsZXMgb2YgdGhlIHNwZWNpZmllZAotICAgICAqIHBpeGVsIHdoaWNoIGlzIHRyYW5zbGF0ZWQgd2l0aCB0aGUgbG9va3VwIHRhYmxlIG9mIHRoaXMgCi0gICAgICogQnl0ZUxvb2t1cFRhYmxlIG9iamVjdC4gVGhlIHJlc3VsdGVkIGFycmF5IGlzIHN0b3JlZCB0bwotICAgICAqIHRoZSBkc3QgYXJyYXkuCisgICAgICogUmV0dXJucyBhIGJ5dGUgYXJyYXkgd2hpY2ggY29udGFpbnMgc2FtcGxlcyBvZiB0aGUgc3BlY2lmaWVkIHBpeGVsIHdoaWNoCisgICAgICogaXMgdHJhbnNsYXRlZCB3aXRoIHRoZSBsb29rdXAgdGFibGUgb2YgdGhpcyBCeXRlTG9va3VwVGFibGUgb2JqZWN0LiBUaGUKKyAgICAgKiByZXN1bHRlZCBhcnJheSBpcyBzdG9yZWQgdG8gdGhlIGRzdCBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3JjIHRoZSBzb3VyY2UgYXJyYXkuCi0gICAgICogQHBhcmFtIGRzdCB0aGUgZGVzdGluYXRpb24gYXJyYXkgd2hlcmUgdGhlIHJlc3VsdCBjYW4gYmUgc3RvcmVkLgotICAgICAqIAorICAgICAqIEBwYXJhbSBzcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgYXJyYXkuCisgICAgICogQHBhcmFtIGRzdAorICAgICAqICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIGFycmF5IHdoZXJlIHRoZSByZXN1bHQgY2FuIGJlIHN0b3JlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBieXRlIGFycmF5IG9mIHRyYW5zbGF0ZWQgc2FtcGxlcyBvZiBhIHBpeGVsLgogICAgICAqLwogICAgIHB1YmxpYyBieXRlW10gbG9va3VwUGl4ZWwoYnl0ZVtdIHNyYywgYnl0ZVtdIGRzdCkgewpAQCAtMTIxLDExICsxMjcsMTEgQEAKICAgICAgICAgaW50IG9mZnNldCA9IGdldE9mZnNldCgpOwogICAgICAgICBpZiAoZ2V0TnVtQ29tcG9uZW50cygpID09IDEpIHsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3JjLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZHN0W2ldID0gZGF0YVswXVtzcmNbaV0tb2Zmc2V0XTsKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSBkYXRhWzBdW3NyY1tpXSAtIG9mZnNldF07CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdldE51bUNvbXBvbmVudHMoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZHN0W2ldID0gZGF0YVtpXVtzcmNbaV0tb2Zmc2V0XTsKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSBkYXRhW2ldW3NyY1tpXSAtIG9mZnNldF07CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL0NvbG9yQ29udmVydE9wLmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvQ29sb3JDb252ZXJ0T3AuamF2YQppbmRleCA2ZDUwM2Q3Li4xYTE3MDBiIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvQ29sb3JDb252ZXJ0T3AuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvQ29sb3JDb252ZXJ0T3AuamF2YQpAQCAtMTcsOSArMTcsOSBAQAogLyoqIAogICogQGF1dGhvciBPbGVnIFYuIEtoYXNjaGFuc2t5CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCi0gKi8gIAotcGFja2FnZSBqYXZhLmF3dC5pbWFnZTsKKyAqLwogCitwYWNrYWdlIGphdmEuYXd0LmltYWdlOwogCiBpbXBvcnQgamF2YS5hd3QuR3JhcGhpY3MyRDsKIGltcG9ydCBqYXZhLmF3dC5Qb2ludDsKQEAgLTM3LDc2ICszNyw5NCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFRoZSBDb2xvckNvbnZlcnRPcCBjbGFzcyBjb252ZXJ0cyB0aGUgcGl4ZWxzIG9mIHRoZSBkYXRhIGluIHRoZQotICogc291cmNlIGltYWdlIHdpdGggdGhlIHNwZWNpZmllZCBDb2xvclNwYWNlIG9iamVjdHMgb3IgYW4gYXJyYXkgCi0gKiBvZiBJQ0NfUHJvZmlsZSBvYmplY3RzLiBUaGUgcmVzdWx0IHBpeGVscyBhcmUgc2NhbGVkIHRvIHRoZSBwcmVjaXNpb24KLSAqIG9mIHRoZSBkZXN0aW5hdGlvbiBpbWFnZS4KKyAqIFRoZSBDb2xvckNvbnZlcnRPcCBjbGFzcyBjb252ZXJ0cyB0aGUgcGl4ZWxzIG9mIHRoZSBkYXRhIGluIHRoZSBzb3VyY2UgaW1hZ2UKKyAqIHdpdGggdGhlIHNwZWNpZmllZCBDb2xvclNwYWNlIG9iamVjdHMgb3IgYW4gYXJyYXkgb2YgSUNDX1Byb2ZpbGUgb2JqZWN0cy4gVGhlCisgKiByZXN1bHQgcGl4ZWxzIGFyZSBzY2FsZWQgdG8gdGhlIHByZWNpc2lvbiBvZiB0aGUgZGVzdGluYXRpb24gaW1hZ2UuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQ29sb3JDb252ZXJ0T3AgaW1wbGVtZW50cyBCdWZmZXJlZEltYWdlT3AsIFJhc3Rlck9wIHsKICAgICAvLyBVbnVzZWQgYnV0IHJlcXVpcmVkIGJ5IGludGVyZmFjZXMKLSAgICAvKiogVGhlIHJlbmRlcmluZyBoaW50cy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgcmVuZGVyaW5nIGhpbnRzLgorICAgICAqLwogICAgIFJlbmRlcmluZ0hpbnRzIHJlbmRlcmluZ0hpbnRzOwotICAgICAgICAKLSAgICAvLyBTZXF1ZW5jZSBjb25zaXN0aW5nIG9mIENvbG9yU3BhY2UgYW5kIElDQ19Qcm9maWxlIGVsZW1lbnRzCi0gICAgLyoqIFRoZSBjb252ZXJzaW9uIHNlcXVlbmNlLiAqLwotICAgIE9iamVjdCBjb252ZXJzaW9uU2VxdWVuY2VbXSA9IG5ldyBJQ0NfUHJvZmlsZVswXTsgLy8gVG8gZWxpbWluYXRlIGNoZWNrcyBmb3IgbnVsbAotICAgIAotICAgIC8vIE5vdCBudWxsIGlmIENvbG9yQ29udmVydE9wIGlzIGNvbnN0cnVjdGVkIGZyb20gdGhlIGFycmF5IG9mIElDQyBwcm9maWxlcwotICAgIC8qKiBUaGUgbWlkIHByb2ZpbGVzLiAqLwotICAgIHByaXZhdGUgSUNDX1Byb2ZpbGUgbWlkUHJvZmlsZXNbXTsgICAKIAotICAgIC8qKiBUaGUgY2MuICovCisgICAgLy8gU2VxdWVuY2UgY29uc2lzdGluZyBvZiBDb2xvclNwYWNlIGFuZCBJQ0NfUHJvZmlsZSBlbGVtZW50cworICAgIC8qKgorICAgICAqIFRoZSBjb252ZXJzaW9uIHNlcXVlbmNlLgorICAgICAqLworICAgIE9iamVjdCBjb252ZXJzaW9uU2VxdWVuY2VbXSA9IG5ldyBJQ0NfUHJvZmlsZVswXTsgLy8gVG8gZWxpbWluYXRlIGNoZWNrcyBmb3IKKworICAgIC8vIG51bGwKKworICAgIC8vIE5vdCBudWxsIGlmIENvbG9yQ29udmVydE9wIGlzIGNvbnN0cnVjdGVkIGZyb20gdGhlIGFycmF5IG9mIElDQyBwcm9maWxlcworICAgIC8qKgorICAgICAqIFRoZSBtaWQgcHJvZmlsZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBJQ0NfUHJvZmlsZSBtaWRQcm9maWxlc1tdOworCisgICAgLyoqCisgICAgICogVGhlIGNjLgorICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgQ29sb3JDb252ZXJ0ZXIgY2MgPSBuZXcgQ29sb3JDb252ZXJ0ZXIoKTsKLSAgICAKLSAgICAvKiogVGhlIHQgY3JlYXRvci4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSB0IGNyZWF0b3IuCisgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBJQ0NfVHJhbnNmb21DcmVhdG9yIHRDcmVhdG9yID0gbmV3IElDQ19UcmFuc2ZvbUNyZWF0b3IoKTsKLSAgICAKLSAgICAvKiogVGhlIGlzIGljYy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBpcyBpY2MuCisgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIGlzSUNDID0gdHJ1ZTsKLSAgICAKLSAgICAKKwogICAgIC8vIENhY2hlZCBJQ0NfVHJhbnNmb3JtCiAgICAgLyoqCiAgICAgICogVGhlIENsYXNzIElDQ19UcmFuc2ZvbUNyZWF0b3IuCiAgICAgICovCiAgICAgcHJpdmF0ZSBjbGFzcyBJQ0NfVHJhbnNmb21DcmVhdG9yIHsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgdHJhbnNmb3JtLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdHJhbnNmb3JtLgorICAgICAgICAgKi8KICAgICAgICAgcHJpdmF0ZSBJQ0NfVHJhbnNmb3JtIHRyYW5zZm9ybTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgbWF4IGNvbXBvbmVudHMuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBtYXggY29tcG9uZW50cy4KKyAgICAgICAgICovCiAgICAgICAgIHByaXZhdGUgaW50IG1heENvbXBvbmVudHM7Ci0gICAgICAgIAorCiAgICAgICAgIC8qKgogICAgICAgICAgKiBGb3IgdGhlIGZ1bGwgSUNDIGNhc2UuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gc3JjIHRoZSBzcmMKLSAgICAgICAgICogQHBhcmFtIGRzdCB0aGUgZHN0Ci0gICAgICAgICAqIEBwYXJhbSBjb252U2VxIHRoZSBjb252IHNlcQotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgdHJhbnNmb3JtCisgICAgICAgICAqIEBwYXJhbSBzcmMKKyAgICAgICAgICogICAgICAgICAgICB0aGUgc3JjLgorICAgICAgICAgKiBAcGFyYW0gZHN0CisgICAgICAgICAqICAgICAgICAgICAgdGhlIGRzdC4KKyAgICAgICAgICogQHBhcmFtIGNvbnZTZXEKKyAgICAgICAgICogICAgICAgICAgICB0aGUgY29udiBzZXEuCisgICAgICAgICAqIEByZXR1cm4gdGhlIHRyYW5zZm9ybS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBJQ0NfVHJhbnNmb3JtIGdldFRyYW5zZm9ybShJQ0NfUHJvZmlsZSBzcmMsIElDQ19Qcm9maWxlIGRzdCwgSUNDX1Byb2ZpbGUgY29udlNlcVtdKSB7Ci0gICAgICAgICAgICBpZiAodHJhbnNmb3JtICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgIHNyYyA9PSB0cmFuc2Zvcm0uZ2V0U3JjKCkgJiYgCi0gICAgICAgICAgICAgICBkc3QgPT0gdHJhbnNmb3JtLmdldERzdCgpKSB7CisgICAgICAgICAgICBpZiAodHJhbnNmb3JtICE9IG51bGwgJiYgc3JjID09IHRyYW5zZm9ybS5nZXRTcmMoKSAmJiBkc3QgPT0gdHJhbnNmb3JtLmdldERzdCgpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gY29udlNlcS5sZW5ndGg7CiAgICAgICAgICAgICBpbnQgc3JjRmxnID0gMCwgZHN0RmxnID0gMDsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBpZiAobGVuZ3RoID09IDAgfHwgc3JjICE9IGNvbnZTZXFbMF0pIHsKICAgICAgICAgICAgICAgICBpZiAoc3JjICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgc3JjRmxnID0gMTsgLy8gbmVlZCBzcmMgcHJvZmlsZQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsZW5ndGggPT0gMCB8fCBkc3QgIT0gY29udlNlcVtsZW5ndGgtMV0pIHsKKyAgICAgICAgICAgIGlmIChsZW5ndGggPT0gMCB8fCBkc3QgIT0gY29udlNlcVtsZW5ndGggLSAxXSkgewogICAgICAgICAgICAgICAgIGlmIChkc3QgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBkc3RGbGcgPSAxOyAvLyBuZWVkIGRzdCBwcm9maWxlCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIElDQ19Qcm9maWxlIHByb2ZpbGVzW107CiAgICAgICAgICAgICBpbnQgblByb2ZpbGVzID0gbGVuZ3RoICsgc3JjRmxnICsgZHN0RmxnOwogICAgICAgICAgICAgaWYgKG5Qcm9maWxlcyA9PSBsZW5ndGgpIHsKQEAgLTExNywzMCArMTM1LDMxIEBACiAgICAgICAgICAgICAgICAgaWYgKHNyY0ZsZyAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzW3BvcysrXSA9IHNyYzsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBwcm9maWxlc1twb3MrK10gPSBjb252U2VxW2ldOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoZHN0RmxnICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZXNbcG9zKytdID0gZHN0OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtID0gbmV3IElDQ19UcmFuc2Zvcm0ocHJvZmlsZXMpOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIC8qKgotICAgICAgICAgKiBVc2VkIG9ubHkgd2hlbiB0aGVyZSBhcmUgbm9uLUlDQyBjb2xvciBzcGFjZXMuCi0gICAgICAgICAqIFJldHVybnMgc2VxdWVuY2Ugb2Ygbm9uLUlDQyBjb2xvciBzcGFjZXMgYW5kIElDQyB0cmFuc2Zvcm1zCi0gICAgICAgICAqIG1hZGUgZnJvbSBzcmMsIGRzdCBhbmQgY29udmVyc2lvblNlcXVlbmNlLgorICAgICAgICAgKiBVc2VkIG9ubHkgd2hlbiB0aGVyZSBhcmUgbm9uLUlDQyBjb2xvciBzcGFjZXMuIFJldHVybnMgc2VxdWVuY2Ugb2YKKyAgICAgICAgICogbm9uLUlDQyBjb2xvciBzcGFjZXMgYW5kIElDQyB0cmFuc2Zvcm1zIG1hZGUgZnJvbSBzcmMsIGRzdCBhbmQKKyAgICAgICAgICogY29udmVyc2lvblNlcXVlbmNlLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHNyYyB0aGUgc3JjCi0gICAgICAgICAqIEBwYXJhbSBkc3QgdGhlIGRzdAotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgc2VxdWVuY2UKKyAgICAgICAgICogQHBhcmFtIHNyYworICAgICAgICAgKiAgICAgICAgICAgIHRoZSBzcmMuCisgICAgICAgICAqIEBwYXJhbSBkc3QKKyAgICAgICAgICogICAgICAgICAgICB0aGUgZHN0LgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBzZXF1ZW5jZS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRTZXF1ZW5jZShPYmplY3Qgc3JjLCBPYmplY3QgZHN0KSB7CiAgICAgICAgICAgICBBcnJheUxpc3Q8T2JqZWN0PiBwcm9maWxlcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigxMCk7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8T2JqZWN0PiBzZXF1ZW5jZSA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigxMCk7ICAgICAgICAgCisgICAgICAgICAgICBBcnJheUxpc3Q8T2JqZWN0PiBzZXF1ZW5jZSA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigxMCk7CiAKICAgICAgICAgICAgIC8vIFdlIG5lZWQgdGhpcyBwcm9maWxlIGFueXdheQogICAgICAgICAgICAgSUNDX1Byb2ZpbGUgeHl6UHJvZmlsZSA9IElDQ19Qcm9maWxlLmdldEluc3RhbmNlKENvbG9yU3BhY2UuQ1NfQ0lFWFlaKTsKQEAgLTE0OSw0MSArMTY4LDQyIEBACiAgICAgICAgICAgICBpbnQgY29udmVyc2lvbkxlbmd0aCA9IGNvbnZlcnNpb25TZXF1ZW5jZS5sZW5ndGg7CiAgICAgICAgICAgICBpZiAoY29udmVyc2lvbkxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICBjb252ZXJzaW9uRmlyc3QgPSBjb252ZXJzaW9uU2VxdWVuY2VbMF07Ci0gICAgICAgICAgICAgICAgY29udmVyc2lvbkxhc3QgPSBjb252ZXJzaW9uU2VxdWVuY2VbY29udmVyc2lvbkxlbmd0aC0xXTsKKyAgICAgICAgICAgICAgICBjb252ZXJzaW9uTGFzdCA9IGNvbnZlcnNpb25TZXF1ZW5jZVtjb252ZXJzaW9uTGVuZ3RoIC0gMV07CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGJvb2xlYW4gaWNjU2VxdWVuY2VTdGFydGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgaWYgKHNyYyAhPSBjb252ZXJzaW9uRmlyc3QgJiYgc3JjICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBpZiAoc3JjIGluc3RhbmNlb2YgSUNDX1Byb2ZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZXMuYWRkKHNyYyk7CiAgICAgICAgICAgICAgICAgICAgIGljY1NlcXVlbmNlU3RhcnRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZXMuYWRkKHh5elByb2ZpbGUpOwotICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZS5hZGQoc3JjKTsgLy8gQWRkIG5vbi1JQ0MgY29sb3Igc3BhY2UgdG8gdGhlIHNlcXVlbmNlCi0gICAgICAgICAgICAgICAgfSAKKyAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UuYWRkKHNyYyk7IC8vIEFkZCBub24tSUNDIGNvbG9yIHNwYWNlIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBzZXF1ZW5jZQorICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcHJvZmlsZXMuYWRkKHh5elByb2ZpbGUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8Y29udmVyc2lvbkxlbmd0aDsgaSsrKSB7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udmVyc2lvbkxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgaWYgKGNvbnZlcnNpb25TZXF1ZW5jZVtpXSBpbnN0YW5jZW9mIElDQ19Qcm9maWxlKSB7CiAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzLmFkZChjb252ZXJzaW9uU2VxdWVuY2VbaV0pOwogICAgICAgICAgICAgICAgICAgICBpY2NTZXF1ZW5jZVN0YXJ0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaWNjU2VxdWVuY2VTdGFydGVkKSB7CiAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzLmFkZCh4eXpQcm9maWxlKTsKLSAgICAgICAgICAgICAgICAgICAgCisKICAgICAgICAgICAgICAgICAgICAgLy8gRWxpbWluYXRlIHNhbWUgcHJvZmlsZXMgaWYgdGhlcmUgYXJlIGFueQogICAgICAgICAgICAgICAgICAgICAvLyAoZS5nLiB4eXpQcm9maWxlIG1heSBvY2N1ciBzZXZlcmFsIHRpbWVzKQogICAgICAgICAgICAgICAgICAgICBPYmplY3QgcHJldiA9IHByb2ZpbGVzLmdldCgwKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaz0xOyBrPHByb2ZpbGVzLnNpemUoKTsgaysrKSB7ICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAxOyBrIDwgcHJvZmlsZXMuc2l6ZSgpOyBrKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2ID09IHByb2ZpbGVzLmdldChrKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGstLTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlcy5yZW1vdmUoayk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2ID0gcHJvZmlsZXMuZ2V0KGspOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAorCiAgICAgICAgICAgICAgICAgICAgIC8vIElmIG9ubHkgb25lIHByb2ZpbGUgbGVmdCB3ZSBza2lwIHRoZSB0cmFuc2Zvcm0gLQogICAgICAgICAgICAgICAgICAgICAvLyBpdCBjYW4gYmUgb25seSBDSUVYWVoKICAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGVzLnNpemUoKSA+IDEpIHsKQEAgLTE5MiwxMDkgKzIxMiwxMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCBub24tSUNDIGNvbG9yIHNwYWNlIHRvIHRoZSBzZXF1ZW5jZQogICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UuYWRkKGNvbnZlcnNpb25TZXF1ZW5jZVtpXSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCisKICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZXMuY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZXMuYWRkKHh5elByb2ZpbGUpOwotICAgICAgICAgICAgICAgICAgICBpY2NTZXF1ZW5jZVN0YXJ0ZWQgPSBmYWxzZTsgLy8gU2VxdWVuY2Ugb2YgSUNDIHByb2ZpbGVzIGlzIHByb2Nlc3NlZAorICAgICAgICAgICAgICAgICAgICBpY2NTZXF1ZW5jZVN0YXJ0ZWQgPSBmYWxzZTsgLy8gU2VxdWVuY2Ugb2YgSUNDIHByb2ZpbGVzIGlzCisgICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NlZAogICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIEFkZCBub24tSUNDIGNvbG9yIHNwYWNlIHRvIHRoZSBzZXF1ZW5jZQotICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZS5hZGQoY29udmVyc2lvblNlcXVlbmNlW2ldKTsgCi0gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZS5hZGQoY29udmVyc2lvblNlcXVlbmNlW2ldKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChkc3QgIT0gY29udmVyc2lvbkxhc3QgJiYgZHN0ICE9IG51bGwpIHsgLy8gQWRkIGxhc3QgcHJvZmlsZSBpZiBuZWVkZWQKKworICAgICAgICAgICAgaWYgKGRzdCAhPSBjb252ZXJzaW9uTGFzdCAmJiBkc3QgIT0gbnVsbCkgeyAvLyBBZGQgbGFzdCBwcm9maWxlIGlmCisgICAgICAgICAgICAgICAgLy8gbmVlZGVkCiAgICAgICAgICAgICAgICAgaWYgKGRzdCBpbnN0YW5jZW9mIElDQ19Qcm9maWxlKSB7CiAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzLmFkZChkc3QpOwogICAgICAgICAgICAgICAgICAgICBpY2NTZXF1ZW5jZVN0YXJ0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaWNjU2VxdWVuY2VTdGFydGVkKSB7CiAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzLmFkZCh4eXpQcm9maWxlKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZS5hZGQoZHN0KTsgLy8gQWRkIGxhc3Qgbm9uLUlDQyBjb2xvciBzcGFjZSB0byB0aGUgc2VxdWVuY2UKKyAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UuYWRkKGRzdCk7IC8vIEFkZCBsYXN0IG5vbi1JQ0MgY29sb3Igc3BhY2UgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIHNlcXVlbmNlCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGlmIChpY2NTZXF1ZW5jZVN0YXJ0ZWQpIHsgLy8gTWFrZSBsYXN0IHRyYW5zZm9ybSBpZiBuZWVkZWQKICAgICAgICAgICAgICAgICBzZXF1ZW5jZS5hZGQobmV3IElDQ19UcmFuc2Zvcm0ocHJvZmlsZXMudG9BcnJheShuZXcgSUNDX1Byb2ZpbGVbMF0pKSk7CiAgICAgICAgICAgICAgICAgaWYgKGRzdCAhPSBudWxsICYmICEoZHN0IGluc3RhbmNlb2YgSUNDX1Byb2ZpbGUpKSB7CiAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlLmFkZChkc3QpOyAvLyBBZGQgbGFzdCBub24tSUNDIGNvbG9yIHNwYWNlIHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlcXVlbmNlCisgICAgICAgICAgICAgICAgICAgIC8vIHNlcXVlbmNlCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgbWF4IG51bWJlciBvZiBjb21wb25lbnRzCiAgICAgICAgICAgICAvLyBUaGlzIG51bWJlciB3aWxsIGJlIHVzZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uCiAgICAgICAgICAgICBtYXhDb21wb25lbnRzID0gMDsKLSAgICAgICAgICAgIE9iamVjdCBvOyAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKGludCBpPTAsIHNpemUgPSBzZXF1ZW5jZS5zaXplKCk7IGk8c2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBPYmplY3QgbzsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBzaXplID0gc2VxdWVuY2Uuc2l6ZSgpOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgbyA9IHNlcXVlbmNlLmdldChpKTsKICAgICAgICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIElDQ19UcmFuc2Zvcm0pIHsKLSAgICAgICAgICAgICAgICAgICAgSUNDX1RyYW5zZm9ybSB0ID0gKElDQ19UcmFuc2Zvcm0pIG87IAotICAgICAgICAgICAgICAgICAgICBtYXhDb21wb25lbnRzID0gCi0gICAgICAgICAgICAgICAgICAgICAgICAobWF4Q29tcG9uZW50cyA+IHQuZ2V0TnVtSW5wdXRDaGFubmVscygpICsgMSkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heENvbXBvbmVudHMgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmdldE51bUlucHV0Q2hhbm5lbHMoKSArIDE7Ci0gICAgICAgICAgICAgICAgICAgIG1heENvbXBvbmVudHMgPSAKLSAgICAgICAgICAgICAgICAgICAgICAgIChtYXhDb21wb25lbnRzID4gdC5nZXROdW1PdXRwdXRDaGFubmVscygpICsgMSkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heENvbXBvbmVudHMgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmdldE51bU91dHB1dENoYW5uZWxzKCkgKyAxOworICAgICAgICAgICAgICAgICAgICBJQ0NfVHJhbnNmb3JtIHQgPSAoSUNDX1RyYW5zZm9ybSlvOworICAgICAgICAgICAgICAgICAgICBtYXhDb21wb25lbnRzID0gKG1heENvbXBvbmVudHMgPiB0LmdldE51bUlucHV0Q2hhbm5lbHMoKSArIDEpID8gbWF4Q29tcG9uZW50cworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdC5nZXROdW1JbnB1dENoYW5uZWxzKCkgKyAxOworICAgICAgICAgICAgICAgICAgICBtYXhDb21wb25lbnRzID0gKG1heENvbXBvbmVudHMgPiB0LmdldE51bU91dHB1dENoYW5uZWxzKCkgKyAxKSA/IG1heENvbXBvbmVudHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHQuZ2V0TnVtT3V0cHV0Q2hhbm5lbHMoKSArIDE7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQ29sb3JTcGFjZSBjcyA9IChDb2xvclNwYWNlKSBvOwotICAgICAgICAgICAgICAgICAgICBtYXhDb21wb25lbnRzID0gCi0gICAgICAgICAgICAgICAgICAgICAgICAobWF4Q29tcG9uZW50cyA+IGNzLmdldE51bUNvbXBvbmVudHMoKSArIDEpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhDb21wb25lbnRzIDogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3MuZ2V0TnVtQ29tcG9uZW50cygpICsgMTsKLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIENvbG9yU3BhY2UgY3MgPSAoQ29sb3JTcGFjZSlvOworICAgICAgICAgICAgICAgICAgICBtYXhDb21wb25lbnRzID0gKG1heENvbXBvbmVudHMgPiBjcy5nZXROdW1Db21wb25lbnRzKCkgKyAxKSA/IG1heENvbXBvbmVudHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNzLmdldE51bUNvbXBvbmVudHMoKSArIDE7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIHJldHVybiBzZXF1ZW5jZS50b0FycmF5KCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQ29sb3JDb252ZXJ0T3Agb2JqZWN0IHVzaW5nIHR3byBzcGVjaWZpZWQKLSAgICAgKiBDb2xvclNwYWNlIG9iamVjdHMuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IENvbG9yQ29udmVydE9wIG9iamVjdCB1c2luZyB0d28gc3BlY2lmaWVkIENvbG9yU3BhY2UKKyAgICAgKiBvYmplY3RzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzcmNDUyB0aGUgc291cmNlIENvbG9yU3BhY2UuCi0gICAgICogQHBhcmFtIGRzdENTIHRoZSBkZXN0aW5hdGlvbiBDb2xvclNwYWNlLgotICAgICAqIEBwYXJhbSBoaW50cyB0aGUgUmVuZGVyaW5nSGludHMgb2JqZWN0IHVzZWQgZm9yIAotICAgICAqIHRoZSBjb2xvciBjb252ZXJzaW9uLCBvciBudWxsLgorICAgICAqIEBwYXJhbSBzcmNDUworICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBDb2xvclNwYWNlLgorICAgICAqIEBwYXJhbSBkc3RDUworICAgICAqICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIENvbG9yU3BhY2UuCisgICAgICogQHBhcmFtIGhpbnRzCisgICAgICogICAgICAgICAgICB0aGUgUmVuZGVyaW5nSGludHMgb2JqZWN0IHVzZWQgZm9yIHRoZSBjb2xvciBjb252ZXJzaW9uLCBvcgorICAgICAqICAgICAgICAgICAgbnVsbC4KICAgICAgKi8KICAgICBwdWJsaWMgQ29sb3JDb252ZXJ0T3AoQ29sb3JTcGFjZSBzcmNDUywgQ29sb3JTcGFjZSBkc3RDUywgUmVuZGVyaW5nSGludHMgaGludHMpIHsKICAgICAgICAgaWYgKHNyY0NTID09IG51bGwgfHwgZHN0Q1MgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI1QiIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHJlbmRlcmluZ0hpbnRzID0gaGludHM7Ci0gICAgICAgIAorCiAgICAgICAgIGJvb2xlYW4gc3JjSUNDID0gc3JjQ1MgaW5zdGFuY2VvZiBJQ0NfQ29sb3JTcGFjZTsKICAgICAgICAgYm9vbGVhbiBkc3RJQ0MgPSBkc3RDUyBpbnN0YW5jZW9mIElDQ19Db2xvclNwYWNlOwotICAgICAgICAKKwogICAgICAgICBpZiAoc3JjSUNDICYmIGRzdElDQykgewogICAgICAgICAgICAgY29udmVyc2lvblNlcXVlbmNlID0gbmV3IElDQ19Qcm9maWxlWzJdOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgY29udmVyc2lvblNlcXVlbmNlID0gbmV3IE9iamVjdFsyXTsKICAgICAgICAgICAgIGlzSUNDID0gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgaWYgKHNyY0lDQykgewotICAgICAgICAgICAgY29udmVyc2lvblNlcXVlbmNlWzBdID0gKChJQ0NfQ29sb3JTcGFjZSkgc3JjQ1MpLmdldFByb2ZpbGUoKTsKKyAgICAgICAgICAgIGNvbnZlcnNpb25TZXF1ZW5jZVswXSA9ICgoSUNDX0NvbG9yU3BhY2Upc3JjQ1MpLmdldFByb2ZpbGUoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGNvbnZlcnNpb25TZXF1ZW5jZVswXSA9IHNyY0NTOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIGlmIChkc3RJQ0MpIHsKLSAgICAgICAgICAgIGNvbnZlcnNpb25TZXF1ZW5jZVsxXSA9ICgoSUNDX0NvbG9yU3BhY2UpIGRzdENTKS5nZXRQcm9maWxlKCk7CisgICAgICAgICAgICBjb252ZXJzaW9uU2VxdWVuY2VbMV0gPSAoKElDQ19Db2xvclNwYWNlKWRzdENTKS5nZXRQcm9maWxlKCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjb252ZXJzaW9uU2VxdWVuY2VbMV0gPSBkc3RDUzsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBDb2xvckNvbnZlcnRPcCBvYmplY3QgZnJvbSB0aGUgc3BlY2lmaWVkIAotICAgICAqIElDQ19Qcm9maWxlIG9iamVjdHMuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IENvbG9yQ29udmVydE9wIG9iamVjdCBmcm9tIHRoZSBzcGVjaWZpZWQgSUNDX1Byb2ZpbGUKKyAgICAgKiBvYmplY3RzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9maWxlcyB0aGUgYXJyYXkgb2YgSUNDX1Byb2ZpbGUgb2JqZWN0cy4KLSAgICAgKiBAcGFyYW0gaGludHMgdGhlIFJlbmRlcmluZ0hpbnRzIG9iamVjdCB1c2VkIGZvciAKLSAgICAgKiB0aGUgY29sb3IgY29udmVyc2lvbiwgb3IgbnVsbC4KKyAgICAgKiBAcGFyYW0gcHJvZmlsZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBJQ0NfUHJvZmlsZSBvYmplY3RzLgorICAgICAqIEBwYXJhbSBoaW50cworICAgICAqICAgICAgICAgICAgdGhlIFJlbmRlcmluZ0hpbnRzIG9iamVjdCB1c2VkIGZvciB0aGUgY29sb3IgY29udmVyc2lvbiwgb3IKKyAgICAgKiAgICAgICAgICAgIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIENvbG9yQ29udmVydE9wKElDQ19Qcm9maWxlIHByb2ZpbGVzW10sIFJlbmRlcmluZ0hpbnRzIGhpbnRzKSB7CiAgICAgICAgIGlmIChwcm9maWxlcyA9PSBudWxsKSB7CkBAIC0zMDIsMzcgKzMyNCwzOSBAQAogICAgICAgICB9CiAKICAgICAgICAgcmVuZGVyaW5nSGludHMgPSBoaW50czsKLSAgICAgICAgCisKICAgICAgICAgLy8gVGhpcyBhcnJheSBpcyBub3QgdXNlZCBpbiB0aGUgcHJvZ3JhbSBsb2dpYywgc28gZG9uJ3QgbmVlZCB0byBjb3B5IGl0CiAgICAgICAgIC8vIFN0b3JlIGl0IG9ubHkgdG8gcmV0dXJuIGJhY2sKLSAgICAgICAgbWlkUHJvZmlsZXMgPSBwcm9maWxlczsgIAotICAgICAgICAKKyAgICAgICAgbWlkUHJvZmlsZXMgPSBwcm9maWxlczsKKwogICAgICAgICBjb252ZXJzaW9uU2VxdWVuY2UgPSBuZXcgSUNDX1Byb2ZpbGVbbWlkUHJvZmlsZXMubGVuZ3RoXTsKLSAgICAgICAgCisKICAgICAgICAgLy8gQWRkIHByb2ZpbGVzIHRvIHRoZSBjb252ZXJzaW9uIHNlcXVlbmNlCi0gICAgICAgIGZvciAoaW50IGk9MCwgbGVuZ3RoPW1pZFByb2ZpbGVzLmxlbmd0aDsgaTxsZW5ndGg7IGkrKykgeworICAgICAgICBmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gbWlkUHJvZmlsZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgIGNvbnZlcnNpb25TZXF1ZW5jZVtpXSA9IG1pZFByb2ZpbGVzW2ldOwotICAgICAgICB9ICAgICAgIAorICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IENvbG9yQ29udmVydE9wIG9iamVjdCB1c2luZyB0aGUgc3BlY2lmaWVkCi0gICAgICogQ29sb3JTcGFjZSBvYmplY3QuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IENvbG9yQ29udmVydE9wIG9iamVjdCB1c2luZyB0aGUgc3BlY2lmaWVkIENvbG9yU3BhY2UKKyAgICAgKiBvYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNzIHRoZSBkZXN0aW5hdGlvbiBDb2xvclNwYWNlIG9yIGFuIGludGVybWVkaWF0ZSBDb2xvclNwYWNlLgotICAgICAqIEBwYXJhbSBoaW50cyB0aGUgUmVuZGVyaW5nSGludHMgb2JqZWN0IHVzZWQgZm9yIAotICAgICAqIHRoZSBjb2xvciBjb252ZXJzaW9uLCBvciBudWxsLgorICAgICAqIEBwYXJhbSBjcworICAgICAqICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIENvbG9yU3BhY2Ugb3IgYW4gaW50ZXJtZWRpYXRlIENvbG9yU3BhY2UuCisgICAgICogQHBhcmFtIGhpbnRzCisgICAgICogICAgICAgICAgICB0aGUgUmVuZGVyaW5nSGludHMgb2JqZWN0IHVzZWQgZm9yIHRoZSBjb2xvciBjb252ZXJzaW9uLCBvcgorICAgICAqICAgICAgICAgICAgbnVsbC4KICAgICAgKi8KICAgICBwdWJsaWMgQ29sb3JDb252ZXJ0T3AoQ29sb3JTcGFjZSBjcywgUmVuZGVyaW5nSGludHMgaGludHMpIHsKICAgICAgICAgaWYgKGNzID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNUIiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICByZW5kZXJpbmdIaW50cyA9IGhpbnRzOwotICAgICAgICAgICAgICAgICAgICAgICAgCisKICAgICAgICAgaWYgKGNzIGluc3RhbmNlb2YgSUNDX0NvbG9yU3BhY2UpIHsKICAgICAgICAgICAgIGNvbnZlcnNpb25TZXF1ZW5jZSA9IG5ldyBJQ0NfUHJvZmlsZVsxXTsKLSAgICAgICAgICAgIGNvbnZlcnNpb25TZXF1ZW5jZVswXSA9ICgoSUNDX0NvbG9yU3BhY2UpIGNzKS5nZXRQcm9maWxlKCk7CisgICAgICAgICAgICBjb252ZXJzaW9uU2VxdWVuY2VbMF0gPSAoKElDQ19Db2xvclNwYWNlKWNzKS5nZXRQcm9maWxlKCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjb252ZXJzaW9uU2VxdWVuY2UgPSBuZXcgT2JqZWN0WzFdOwogICAgICAgICAgICAgY29udmVyc2lvblNlcXVlbmNlWzBdID0gY3M7CkBAIC0zNDEsMTEgKzM2NSwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBDb2xvckNvbnZlcnRPcCBvYmplY3Qgd2hpY2ggY29udmVydHMgZnJvbSAKLSAgICAgKiBhIHNvdXJjZSBjb2xvciBzcGFjZSB0byBhIGRlc3RpbmF0aW9uIGNvbG9yIHNwYWNlLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBDb2xvckNvbnZlcnRPcCBvYmplY3Qgd2hpY2ggY29udmVydHMgZnJvbSBhIHNvdXJjZQorICAgICAqIGNvbG9yIHNwYWNlIHRvIGEgZGVzdGluYXRpb24gY29sb3Igc3BhY2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGhpbnRzIHRoZSBSZW5kZXJpbmdIaW50cyBvYmplY3QgdXNlZCBmb3IgCi0gICAgICogdGhlIGNvbG9yIGNvbnZlcnNpb24sIG9yIG51bGwuCisgICAgICogQHBhcmFtIGhpbnRzCisgICAgICogICAgICAgICAgICB0aGUgUmVuZGVyaW5nSGludHMgb2JqZWN0IHVzZWQgZm9yIHRoZSBjb2xvciBjb252ZXJzaW9uLCBvcgorICAgICAqICAgICAgICAgICAgbnVsbC4KICAgICAgKi8KICAgICBwdWJsaWMgQ29sb3JDb252ZXJ0T3AoUmVuZGVyaW5nSGludHMgaGludHMpIHsKICAgICAgICAgcmVuZGVyaW5nSGludHMgPSBoaW50czsKQEAgLTM2MCwyNiArMzg1LDI2IEBACiAgICAgICAgIGludCBuU3JjQ29sb3JDb21wcywgbkRzdENvbG9yQ29tcHM7CiAgICAgICAgIE9iamVjdCBmaXJzdCA9IGNvbnZlcnNpb25TZXF1ZW5jZVswXTsKICAgICAgICAgT2JqZWN0IGxhc3QgPSBjb252ZXJzaW9uU2VxdWVuY2VbY29udmVyc2lvblNlcXVlbmNlLmxlbmd0aCAtIDFdOwotICAgICAgICAKKwogICAgICAgICAvLyBHZXQgdGhlIG51bWJlciBvZiBpbnB1dC9vdXRwdXQgY29sb3IgY29tcG9uZW50cwogICAgICAgICBpZiAoaXNJQ0MpIHsKLSAgICAgICAgICAgIHNyY1BmID0gKElDQ19Qcm9maWxlKSBmaXJzdDsKLSAgICAgICAgICAgIGRzdFBmID0gKElDQ19Qcm9maWxlKSBsYXN0OworICAgICAgICAgICAgc3JjUGYgPSAoSUNDX1Byb2ZpbGUpZmlyc3Q7CisgICAgICAgICAgICBkc3RQZiA9IChJQ0NfUHJvZmlsZSlsYXN0OwogICAgICAgICAgICAgblNyY0NvbG9yQ29tcHMgPSBzcmNQZi5nZXROdW1Db21wb25lbnRzKCk7CiAgICAgICAgICAgICBuRHN0Q29sb3JDb21wcyA9IGRzdFBmLmdldE51bUNvbXBvbmVudHMoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChmaXJzdCBpbnN0YW5jZW9mIElDQ19Qcm9maWxlKSB7Ci0gICAgICAgICAgICAgICAgc3JjUGYgPSAoSUNDX1Byb2ZpbGUpIGZpcnN0OworICAgICAgICAgICAgICAgIHNyY1BmID0gKElDQ19Qcm9maWxlKWZpcnN0OwogICAgICAgICAgICAgICAgIG5TcmNDb2xvckNvbXBzID0gc3JjUGYuZ2V0TnVtQ29tcG9uZW50cygpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBuU3JjQ29sb3JDb21wcyA9ICgoQ29sb3JTcGFjZSkgZmlyc3QpLmdldE51bUNvbXBvbmVudHMoKTsKKyAgICAgICAgICAgICAgICBuU3JjQ29sb3JDb21wcyA9ICgoQ29sb3JTcGFjZSlmaXJzdCkuZ2V0TnVtQ29tcG9uZW50cygpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGlmIChsYXN0IGluc3RhbmNlb2YgSUNDX1Byb2ZpbGUpIHsKLSAgICAgICAgICAgICAgICBkc3RQZiA9IChJQ0NfUHJvZmlsZSkgbGFzdDsKKyAgICAgICAgICAgICAgICBkc3RQZiA9IChJQ0NfUHJvZmlsZSlsYXN0OwogICAgICAgICAgICAgICAgIG5Ec3RDb2xvckNvbXBzID0gZHN0UGYuZ2V0TnVtQ29tcG9uZW50cygpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBuRHN0Q29sb3JDb21wcyA9ICgoQ29sb3JTcGFjZSkgbGFzdCkuZ2V0TnVtQ29tcG9uZW50cygpOworICAgICAgICAgICAgICAgIG5Ec3RDb2xvckNvbXBzID0gKChDb2xvclNwYWNlKWxhc3QpLmdldE51bUNvbXBvbmVudHMoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0zODcsNTEgKzQxMiw0NSBAQAogICAgICAgICAvLyB0cmFuc2Zvcm1zIGFuZCB3aXRoIGVhY2ggb3RoZXIKICAgICAgICAgaWYgKHNyYy5nZXROdW1CYW5kcygpICE9IG5TcmNDb2xvckNvbXBzKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjVFPUluY29ycmVjdCBudW1iZXIgb2Ygc291cmNlIHJhc3RlciBiYW5kcy4gU2hvdWxkIGJlIGVxdWFsCi0gICAgICAgICAgICAvLyAgICAgICAgICB0byB0aGUgbnVtYmVyIG9mIGNvbG9yIGNvbXBvbmVudHMgb2Ygc291cmNlIGNvbG9yc3BhY2UuCisgICAgICAgICAgICAvLyB0byB0aGUgbnVtYmVyIG9mIGNvbG9yIGNvbXBvbmVudHMgb2Ygc291cmNlIGNvbG9yc3BhY2UuCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI1RSIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIGlmIChkc3QgIT0gbnVsbCkgeyAvLyBDaGVjayBkZXN0aW5hdGlvbiByYXN0ZXIKLSAgICAgICAgICAgIGlmIChkc3QuZ2V0TnVtQmFuZHMoKSAhPQotICAgICAgICAgICAgICAgIG5Ec3RDb2xvckNvbXBzKSB7CisgICAgICAgICAgICBpZiAoZHN0LmdldE51bUJhbmRzKCkgIT0gbkRzdENvbG9yQ29tcHMpIHsKICAgICAgICAgICAgICAgICAvLyBhd3QuMjVGPUluY29ycmVjdCBudW1iZXIgb2YgZGVzdGluYXRpb24gcmFzdGVyIGJhbmRzLiBTaG91bGQKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgICBiZSBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGNvbG9yIGNvbXBvbmVudHMgb2YgZGVzdGluYXRpb24KLSAgICAgICAgICAgICAgICAvLyAgICAgICAgICBjb2xvcnNwYWNlLgorICAgICAgICAgICAgICAgIC8vIGJlIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgY29sb3IgY29tcG9uZW50cyBvZiBkZXN0aW5hdGlvbgorICAgICAgICAgICAgICAgIC8vIGNvbG9yc3BhY2UuCiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNUYiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHNyYy5nZXRXaWR0aCgpICE9IGRzdC5nZXRXaWR0aCgpIHx8Ci0gICAgICAgICAgICAgICBzcmMuZ2V0SGVpZ2h0KCkgIT0gZHN0LmdldEhlaWdodCgpKSB7CisKKyAgICAgICAgICAgIGlmIChzcmMuZ2V0V2lkdGgoKSAhPSBkc3QuZ2V0V2lkdGgoKSB8fCBzcmMuZ2V0SGVpZ2h0KCkgIT0gZHN0LmdldEhlaWdodCgpKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNjAiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZHN0ID0gY3JlYXRlQ29tcGF0aWJsZURlc3RSYXN0ZXIoc3JjKTsKKyAgICAgICAgICAgIGRzdCA9IGNyZWF0ZUNvbXBhdGlibGVEZXN0UmFzdGVyKHNyYyk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgaWYgKGlzSUNDKSB7CiAgICAgICAgICAgICAvLyBDcmVhdGUgdHJhbnNmb3JtCi0gICAgICAgICAgICBJQ0NfVHJhbnNmb3JtIHQgPSB0Q3JlYXRvci5nZXRUcmFuc2Zvcm0oc3JjUGYsIGRzdFBmLCAKLSAgICAgICAgICAgICAgICAgICAgKElDQ19Qcm9maWxlW10pY29udmVyc2lvblNlcXVlbmNlKTsgCi0gICAgICAgICAgICBjYy50cmFuc2xhdGVDb2xvcih0LCBzcmMsIGRzdCk7ICAgICAgICAgCisgICAgICAgICAgICBJQ0NfVHJhbnNmb3JtIHQgPSB0Q3JlYXRvcgorICAgICAgICAgICAgICAgICAgICAuZ2V0VHJhbnNmb3JtKHNyY1BmLCBkc3RQZiwgKElDQ19Qcm9maWxlW10pY29udmVyc2lvblNlcXVlbmNlKTsKKyAgICAgICAgICAgIGNjLnRyYW5zbGF0ZUNvbG9yKHQsIHNyYywgZHN0KTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIE9iamVjdFtdIHNlcXVlbmNlID0gdENyZWF0b3IuZ2V0U2VxdWVuY2UobnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgLy8gR2V0IGRhdGEgZnJvbSB0aGUgc291cmNlIHJhc3RlcgogICAgICAgICAgICAgQ29sb3JTY2FsZXIgc2NhbGVyID0gbmV3IENvbG9yU2NhbGVyKCk7CiAgICAgICAgICAgICBzY2FsZXIubG9hZFNjYWxpbmdEYXRhKHNyYywgbnVsbCk7CiAgICAgICAgICAgICBmbG9hdCB0bXBEYXRhW11bXSA9IHNjYWxlci5zY2FsZU5vcm1hbGl6ZShzcmMpOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIC8vIEdldCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGNvbG9yIHNwYWNlcwotICAgICAgICAgICAgQ29sb3JTcGFjZSBzcmNDUyA9IChzcmNQZiA9PSBudWxsKSA/IAotICAgICAgICAgICAgICAgICAgICAoQ29sb3JTcGFjZSkgZmlyc3Q6Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBJQ0NfQ29sb3JTcGFjZShzcmNQZik7Ci0gICAgICAgICAgICBDb2xvclNwYWNlIGRzdENTID0gKGRzdFBmID09IG51bGwpID8gCi0gICAgICAgICAgICAgICAgICAgIChDb2xvclNwYWNlKSBsYXN0OgotICAgICAgICAgICAgICAgICAgICBuZXcgSUNDX0NvbG9yU3BhY2UoZHN0UGYpOwotICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIENvbG9yU3BhY2Ugc3JjQ1MgPSAoc3JjUGYgPT0gbnVsbCkgPyAoQ29sb3JTcGFjZSlmaXJzdCA6IG5ldyBJQ0NfQ29sb3JTcGFjZShzcmNQZik7CisgICAgICAgICAgICBDb2xvclNwYWNlIGRzdENTID0gKGRzdFBmID09IG51bGwpID8gKENvbG9yU3BhY2UpbGFzdCA6IG5ldyBJQ0NfQ29sb3JTcGFjZShkc3RQZik7CisKICAgICAgICAgICAgIGFwcGx5U2VxdWVuY2Uoc2VxdWVuY2UsIHRtcERhdGEsIHNyY0NTLCBkc3RDUyk7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgc2NhbGVyLmxvYWRTY2FsaW5nRGF0YShkc3QsIG51bGwpOwogICAgICAgICAgICAgc2NhbGVyLnVuc2NhbGVOb3JtYWxpemVkKGRzdCwgdG1wRGF0YSk7CiAgICAgICAgIH0KQEAgLTQ0MiwzNiArNDYxLDI3IEBACiAgICAgcHVibGljIEJ1ZmZlcmVkSW1hZ2UgY3JlYXRlQ29tcGF0aWJsZURlc3RJbWFnZShCdWZmZXJlZEltYWdlIHNyYywgQ29sb3JNb2RlbCBkZXN0Q00pIHsKICAgICAgICAgLy8gSWYgZGVzdGluYXRpb24gY29sb3IgbW9kZWwgaXMgcGFzc2VkIG9ubHkgb25lIGxpbmUgbmVlZGVkCiAgICAgICAgIGlmIChkZXN0Q00gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJlZEltYWdlKGRlc3RDTSwKLSAgICAgICAgICAgICAgICAgICAgZGVzdENNLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3RlcihzcmMuZ2V0V2lkdGgoKSwgc3JjLmdldEhlaWdodCgpKSwKLSAgICAgICAgICAgICAgICAgICAgZGVzdENNLmlzQWxwaGFQcmVtdWx0aXBsaWVkKCksIAotICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQnVmZmVyZWRJbWFnZShkZXN0Q00sIGRlc3RDTS5jcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIoc3JjLmdldFdpZHRoKCksCisgICAgICAgICAgICAgICAgICAgIHNyYy5nZXRIZWlnaHQoKSksIGRlc3RDTS5pc0FscGhhUHJlbXVsdGlwbGllZCgpLCBudWxsKTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBpbnQgblNwYWNlcyA9IGNvbnZlcnNpb25TZXF1ZW5jZS5sZW5ndGg7Ci0gICAgICAgIAorCiAgICAgICAgIGlmIChuU3BhY2VzIDwgMSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNjEiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICAvLyBHZXQgZGVzdGluYXRpb24gY29sb3Igc3BhY2UKLSAgICAgICAgT2JqZWN0IGRlc3RpbmF0aW9uID0gY29udmVyc2lvblNlcXVlbmNlW25TcGFjZXMtMV07Ci0gICAgICAgIENvbG9yU3BhY2UgZHN0Q1MgPSAKLSAgICAgICAgICAgIChkZXN0aW5hdGlvbiBpbnN0YW5jZW9mIENvbG9yU3BhY2UpID8gCi0gICAgICAgICAgICAgICAgICAgIChDb2xvclNwYWNlKSBkZXN0aW5hdGlvbiA6IAotICAgICAgICAgICAgICAgICAgICBuZXcgSUNDX0NvbG9yU3BhY2UoKElDQ19Qcm9maWxlKSBkZXN0aW5hdGlvbik7Ci0gICAgICAgIAotICAgICAgICBDb2xvck1vZGVsIHNyY0NNID0gc3JjLmdldENvbG9yTW9kZWwoKTsgICAgIAotICAgICAgICBDb2xvck1vZGVsIGRzdENNID0gbmV3IENvbXBvbmVudENvbG9yTW9kZWwoZHN0Q1MsIAotICAgICAgICAgICAgICAgIHNyY0NNLmhhc0FscGhhKCksIAotICAgICAgICAgICAgICAgIHNyY0NNLmlzQWxwaGFQcmVtdWx0aXBsaWVkKCksCi0gICAgICAgICAgICAgICAgc3JjQ00uZ2V0VHJhbnNwYXJlbmN5KCksCi0gICAgICAgICAgICAgICAgc3JjQ00uZ2V0VHJhbnNmZXJUeXBlKCkpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJlZEltYWdlKGRzdENNLAotICAgICAgICAgICAgICAgIGRlc3RDTS5jcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIoc3JjLmdldFdpZHRoKCksIHNyYy5nZXRIZWlnaHQoKSksCi0gICAgICAgICAgICAgICAgZGVzdENNLmlzQWxwaGFQcmVtdWx0aXBsaWVkKCksIAotICAgICAgICAgICAgICAgIG51bGwpOworICAgICAgICBPYmplY3QgZGVzdGluYXRpb24gPSBjb252ZXJzaW9uU2VxdWVuY2VbblNwYWNlcyAtIDFdOworICAgICAgICBDb2xvclNwYWNlIGRzdENTID0gKGRlc3RpbmF0aW9uIGluc3RhbmNlb2YgQ29sb3JTcGFjZSkgPyAoQ29sb3JTcGFjZSlkZXN0aW5hdGlvbgorICAgICAgICAgICAgICAgIDogbmV3IElDQ19Db2xvclNwYWNlKChJQ0NfUHJvZmlsZSlkZXN0aW5hdGlvbik7CisKKyAgICAgICAgQ29sb3JNb2RlbCBzcmNDTSA9IHNyYy5nZXRDb2xvck1vZGVsKCk7CisgICAgICAgIENvbG9yTW9kZWwgZHN0Q00gPSBuZXcgQ29tcG9uZW50Q29sb3JNb2RlbChkc3RDUywgc3JjQ00uaGFzQWxwaGEoKSwgc3JjQ00KKyAgICAgICAgICAgICAgICAuaXNBbHBoYVByZW11bHRpcGxpZWQoKSwgc3JjQ00uZ2V0VHJhbnNwYXJlbmN5KCksIHNyY0NNLmdldFRyYW5zZmVyVHlwZSgpKTsKKworICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlcmVkSW1hZ2UoZHN0Q00sIGRlc3RDTS5jcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIoc3JjLmdldFdpZHRoKCksIHNyYworICAgICAgICAgICAgICAgIC5nZXRIZWlnaHQoKSksIGRlc3RDTS5pc0FscGhhUHJlbXVsdGlwbGllZCgpLCBudWxsKTsKICAgICB9CiAKICAgICBwdWJsaWMgZmluYWwgQnVmZmVyZWRJbWFnZSBmaWx0ZXIoQnVmZmVyZWRJbWFnZSBzcmMsIEJ1ZmZlcmVkSW1hZ2UgZHN0KSB7CkBAIC00ODEsMzIgKzQ5MSwzMSBAQAogCiAgICAgICAgIENvbG9yTW9kZWwgc3JjQ00gPSBzcmMuZ2V0Q29sb3JNb2RlbCgpOwogICAgICAgICAvLyBGaXJzdCBoYW5kbGUgaW5kZXggY29sb3IgbW9kZWwKLSAgICAgICAgaWYgKHNyY0NNIGluc3RhbmNlb2YgSW5kZXhDb2xvck1vZGVsKSB7ICAgICAgICAgICAgCi0gICAgICAgICAgICBzcmMgPSAoKEluZGV4Q29sb3JNb2RlbCkgc3JjQ00pLmNvbnZlcnRUb0ludERpc2NyZXRlKHNyYy5nZXRSYXN0ZXIoKSwgZmFsc2UpOworICAgICAgICBpZiAoc3JjQ00gaW5zdGFuY2VvZiBJbmRleENvbG9yTW9kZWwpIHsKKyAgICAgICAgICAgIHNyYyA9ICgoSW5kZXhDb2xvck1vZGVsKXNyY0NNKS5jb252ZXJ0VG9JbnREaXNjcmV0ZShzcmMuZ2V0UmFzdGVyKCksIGZhbHNlKTsKICAgICAgICAgfQotICAgICAgICBDb2xvclNwYWNlIHNyY0NTID0gc3JjQ00uZ2V0Q29sb3JTcGFjZSgpOyAgICAgICAgCi0gICAgICAgICAgICAgICAgCisgICAgICAgIENvbG9yU3BhY2Ugc3JjQ1MgPSBzcmNDTS5nZXRDb2xvclNwYWNlKCk7CisKICAgICAgICAgQnVmZmVyZWRJbWFnZSByZXM7CiAgICAgICAgIGJvb2xlYW4gaXNEc3RJbmRleCA9IGZhbHNlOwogICAgICAgICBpZiAoZHN0ICE9IG51bGwpIHsKLSAgICAgICAgICAKLSAgICAgICAgICBpZiAoc3JjLmdldFdpZHRoKCkgIT0gZHN0LmdldFdpZHRoKCkgfHwKLSAgICAgICAgICAgICBzcmMuZ2V0SGVpZ2h0KCkgIT0gZHN0LmdldEhlaWdodCgpKSB7Ci0gICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjYzIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3JjLmdldFdpZHRoKCkgIT0gZHN0LmdldFdpZHRoKCkgfHwgc3JjLmdldEhlaWdodCgpICE9IGRzdC5nZXRIZWlnaHQoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjYzIikpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChkc3QuZ2V0Q29sb3JNb2RlbCgpIGluc3RhbmNlb2YgSW5kZXhDb2xvck1vZGVsKSB7CiAgICAgICAgICAgICAgICAgaXNEc3RJbmRleCA9IHRydWU7CiAgICAgICAgICAgICAgICAgcmVzID0gY3JlYXRlQ29tcGF0aWJsZURlc3RJbWFnZShzcmMsIG51bGwpOwotICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHJlcyA9IGRzdDsKLSAgICAgICAgICAgIH0gICAgICAgICAgIAorICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmVzID0gY3JlYXRlQ29tcGF0aWJsZURlc3RJbWFnZShzcmMsIG51bGwpOwogICAgICAgICB9CiAgICAgICAgIENvbG9yTW9kZWwgZHN0Q00gPSByZXMuZ2V0Q29sb3JNb2RlbCgpOwogICAgICAgICBDb2xvclNwYWNlIGRzdENTID0gZHN0Q00uZ2V0Q29sb3JTcGFjZSgpOwotICAgICAgICAKKwogICAgICAgICBJQ0NfUHJvZmlsZSBzcmNQZiA9IG51bGwsIGRzdFBmID0gbnVsbDsKICAgICAgICAgaWYgKHNyY0NTIGluc3RhbmNlb2YgSUNDX0NvbG9yU3BhY2UpIHsKICAgICAgICAgICAgIHNyY1BmID0gKChJQ0NfQ29sb3JTcGFjZSlzcmNDUykuZ2V0UHJvZmlsZSgpOwpAQCAtNTE0LDMxICs1MjMsMjcgQEAKICAgICAgICAgaWYgKGRzdENTIGluc3RhbmNlb2YgSUNDX0NvbG9yU3BhY2UpIHsKICAgICAgICAgICAgIGRzdFBmID0gKChJQ0NfQ29sb3JTcGFjZSlkc3RDUykuZ2V0UHJvZmlsZSgpOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIGJvb2xlYW4gaXNGdWxsSUNDID0gaXNJQ0MgJiYgc3JjUGYgIT0gbnVsbCAmJiBkc3RQZiAhPSBudWxsOwotICAgICAgICAKKwogICAgICAgICBpZiAoaXNGdWxsSUNDKSB7Ci0gICAgICAgICAgICBJQ0NfVHJhbnNmb3JtIHQgPQotICAgICAgICAgICAgICAgICAgICB0Q3JlYXRvci5nZXRUcmFuc2Zvcm0oc3JjUGYsIGRzdFBmLCAoSUNDX1Byb2ZpbGVbXSkgY29udmVyc2lvblNlcXVlbmNlKTsKKyAgICAgICAgICAgIElDQ19UcmFuc2Zvcm0gdCA9IHRDcmVhdG9yCisgICAgICAgICAgICAgICAgICAgIC5nZXRUcmFuc2Zvcm0oc3JjUGYsIGRzdFBmLCAoSUNDX1Byb2ZpbGVbXSljb252ZXJzaW9uU2VxdWVuY2UpOwogICAgICAgICAgICAgY2MudHJhbnNsYXRlQ29sb3IodCwgc3JjLCByZXMpOwogICAgICAgICB9IGVsc2UgeyAvLyBQZXJmb3JtIG5vbi1JQ0MgdHJhbnNmb3JtCi0gICAgICAgICAgICBPYmplY3Qgc2VxdWVuY2VbXSA9IHRDcmVhdG9yLmdldFNlcXVlbmNlKAotICAgICAgICAgICAgICAgICAgICBzcmNQZiA9PSBudWxsID8gKE9iamVjdCkgc3JjQ1MgOiBzcmNQZiwKLSAgICAgICAgICAgICAgICAgICAgZHN0UGYgPT0gbnVsbCA/IChPYmplY3QpIGRzdENTIDogZHN0UGYpOyAgICAgICAgICAgIAotICAgICAgICAgICAgCisgICAgICAgICAgICBPYmplY3Qgc2VxdWVuY2VbXSA9IHRDcmVhdG9yLmdldFNlcXVlbmNlKHNyY1BmID09IG51bGwgPyAoT2JqZWN0KXNyY0NTIDogc3JjUGYsCisgICAgICAgICAgICAgICAgICAgIGRzdFBmID09IG51bGwgPyAoT2JqZWN0KWRzdENTIDogZHN0UGYpOworCiAgICAgICAgICAgICBpbnQgc3JjVyA9IHNyYy5nZXRXaWR0aCgpOwogICAgICAgICAgICAgaW50IHNyY0ggPSBzcmMuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgICAgICBpbnQgbnVtUGl4ZWxzID0gc3JjVypzcmNIOworICAgICAgICAgICAgaW50IG51bVBpeGVscyA9IHNyY1cgKiBzcmNIOwogCi0gICAgICAgICAgICAvLyBMb2FkIGFsbCBwaXhlbCBkYXRhIGludG8gYXJyYXkgdG1wRGF0YSAKLSAgICAgICAgICAgIGZsb2F0IHRtcERhdGFbXVtdID0gCi0gICAgICAgICAgICAgICAgbmV3IGZsb2F0W251bVBpeGVsc11bdENyZWF0b3IubWF4Q29tcG9uZW50c107Ci0gICAgICAgICAgICBmb3IgKGludCByb3c9MCwgZGF0YVBvcz0wOyByb3c8c3JjVzsgcm93KyspIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBjb2w9MDsgY29sPHNyY0g7IGNvbCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcERhdGFbZGF0YVBvc10gPSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY0NNLmdldE5vcm1hbGl6ZWRDb21wb25lbnRzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMuZ2V0UmFzdGVyKCkuZ2V0RGF0YUVsZW1lbnRzKHJvdywgY29sLCBudWxsKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcERhdGFbZGF0YVBvc10sIDApOworICAgICAgICAgICAgLy8gTG9hZCBhbGwgcGl4ZWwgZGF0YSBpbnRvIGFycmF5IHRtcERhdGEKKyAgICAgICAgICAgIGZsb2F0IHRtcERhdGFbXVtdID0gbmV3IGZsb2F0W251bVBpeGVsc11bdENyZWF0b3IubWF4Q29tcG9uZW50c107CisgICAgICAgICAgICBmb3IgKGludCByb3cgPSAwLCBkYXRhUG9zID0gMDsgcm93IDwgc3JjVzsgcm93KyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBzcmNIOyBjb2wrKykgeworICAgICAgICAgICAgICAgICAgICB0bXBEYXRhW2RhdGFQb3NdID0gc3JjQ00uZ2V0Tm9ybWFsaXplZENvbXBvbmVudHMoc3JjLmdldFJhc3RlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldERhdGFFbGVtZW50cyhyb3csIGNvbCwgbnVsbCksIHRtcERhdGFbZGF0YVBvc10sIDApOwogICAgICAgICAgICAgICAgICAgICBkYXRhUG9zKys7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNTQ4LDExICs1NTMsMTEgQEAKICAgICAgICAgICAgIGludCBhbHBoYUlkeCA9IHNyY0NNLm51bUNvbXBvbmVudHMgLSAxOwogICAgICAgICAgICAgaWYgKHNyY0NNLmhhc0FscGhhKCkgJiYgZHN0Q00uaGFzQWxwaGEoKSkgewogICAgICAgICAgICAgICAgIGFscGhhID0gbmV3IGZsb2F0W251bVBpeGVsc107Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG51bVBpeGVsczsgaSsrKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1QaXhlbHM7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBhbHBoYVtpXSA9IHRtcERhdGFbaV1bYWxwaGFJZHhdOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICAvLyBUcmFuc2xhdGUgY29sb3JzCiAgICAgICAgICAgICBhcHBseVNlcXVlbmNlKHNlcXVlbmNlLCB0bXBEYXRhLCBzcmNDUywgZHN0Q1MpOwogCkBAIC01NjAsMjQgKzU2NSwyNCBAQAogICAgICAgICAgICAgaWYgKGRzdENNLmhhc0FscGhhKCkpIHsKICAgICAgICAgICAgICAgICBhbHBoYUlkeCA9IGRzdENNLm51bUNvbXBvbmVudHMgLSAxOwogICAgICAgICAgICAgICAgIGlmIChhbHBoYSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxudW1QaXhlbHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVBpeGVsczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0bXBEYXRhW2ldW2FscGhhSWR4XSA9IGFscGhhW2ldOwotICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG51bVBpeGVsczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUGl4ZWxzOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHRtcERhdGFbaV1bYWxwaGFJZHhdID0gMWY7Ci0gICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gU3RvcmUgZGF0YSBiYWNrIHRvIHRoZSBpbWFnZSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yIChpbnQgcm93PTAsIGRhdGFQb3M9MDsgcm93PHNyY1c7IHJvdysrKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sPTA7IGNvbDxzcmNIOyBjb2wrKykgewotICAgICAgICAgICAgICAgICAgICByZXMuZ2V0UmFzdGVyKCkuc2V0RGF0YUVsZW1lbnRzKHJvdywgY29sLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RDTS5nZXREYXRhRWxlbWVudHModG1wRGF0YVtkYXRhUG9zKytdLCAwICwgbnVsbCkpOworCisgICAgICAgICAgICAvLyBTdG9yZSBkYXRhIGJhY2sgdG8gdGhlIGltYWdlCisgICAgICAgICAgICBmb3IgKGludCByb3cgPSAwLCBkYXRhUG9zID0gMDsgcm93IDwgc3JjVzsgcm93KyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBzcmNIOyBjb2wrKykgeworICAgICAgICAgICAgICAgICAgICByZXMuZ2V0UmFzdGVyKCkuc2V0RGF0YUVsZW1lbnRzKHJvdywgY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdENNLmdldERhdGFFbGVtZW50cyh0bXBEYXRhW2RhdGFQb3MrK10sIDAsIG51bGwpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgICAgICAgICAKKyAgICAgICAgfQogCiAgICAgICAgIGlmIChpc0RzdEluZGV4KSB7IC8vIENvbnZlcnQgaW1hZ2UgaW50byBpbmRleGVkIGNvbG9yCiAgICAgICAgICAgICBHcmFwaGljczJEIGcyZCA9IGRzdC5jcmVhdGVHcmFwaGljcygpOwpAQCAtNTg1LDU5ICs1OTAsNTkgQEAKICAgICAgICAgICAgIGcyZC5kaXNwb3NlKCk7CiAgICAgICAgICAgICByZXR1cm4gZHN0OwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQXBwbHkgc2VxdWVuY2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNlcXVlbmNlIHRoZSBzZXF1ZW5jZQotICAgICAqIEBwYXJhbSB0bXBEYXRhIHRoZSB0bXAgZGF0YQotICAgICAqIEBwYXJhbSBzcmNDUyB0aGUgc3JjIGNzCi0gICAgICogQHBhcmFtIGRzdENTIHRoZSBkc3QgY3MKKyAgICAgKiBAcGFyYW0gc2VxdWVuY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZXF1ZW5jZS4KKyAgICAgKiBAcGFyYW0gdG1wRGF0YQorICAgICAqICAgICAgICAgICAgdGhlIHRtcCBkYXRhLgorICAgICAqIEBwYXJhbSBzcmNDUworICAgICAqICAgICAgICAgICAgdGhlIHNyYyBjcy4KKyAgICAgKiBAcGFyYW0gZHN0Q1MKKyAgICAgKiAgICAgICAgICAgIHRoZSBkc3QgY3MuCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGx5U2VxdWVuY2UoCi0gICAgICAgICAgICBPYmplY3Qgc2VxdWVuY2VbXSwgCi0gICAgICAgICAgICBmbG9hdCB0bXBEYXRhW11bXSwKLSAgICAgICAgICAgIENvbG9yU3BhY2Ugc3JjQ1MsIAotICAgICAgICAgICAgQ29sb3JTcGFjZSBkc3RDUwotICAgICAgICAgICAgKSB7CisgICAgcHJpdmF0ZSB2b2lkIGFwcGx5U2VxdWVuY2UoT2JqZWN0IHNlcXVlbmNlW10sIGZsb2F0IHRtcERhdGFbXVtdLCBDb2xvclNwYWNlIHNyY0NTLAorICAgICAgICAgICAgQ29sb3JTcGFjZSBkc3RDUykgewogICAgICAgICBDb2xvclNwYWNlIHh5ekNTID0gQ29sb3JTcGFjZS5nZXRJbnN0YW5jZShDb2xvclNwYWNlLkNTX0NJRVhZWik7Ci0gICAgICAgIAorCiAgICAgICAgIGludCBudW1QaXhlbHMgPSB0bXBEYXRhLmxlbmd0aDsKLSAgICAgICAgCisKICAgICAgICAgLy8gRmlyc3QgdHJhbnNmb3JtLi4uCiAgICAgICAgIGlmIChzZXF1ZW5jZVswXSBpbnN0YW5jZW9mIElDQ19UcmFuc2Zvcm0pIHsgLy8gSUNDCiAgICAgICAgICAgICBJQ0NfVHJhbnNmb3JtIHQgPSAoSUNDX1RyYW5zZm9ybSlzZXF1ZW5jZVswXTsKICAgICAgICAgICAgIGNjLnRyYW5zbGF0ZUNvbG9yKHQsIHRtcERhdGEsIHNyY0NTLCB4eXpDUywgbnVtUGl4ZWxzKTsKICAgICAgICAgfSBlbHNlIHsgLy8gbm9uIElDQwotICAgICAgICAgICAgZm9yIChpbnQgaz0wOyBrPG51bVBpeGVsczsgaysrKSB7Ci0gICAgICAgICAgICAgICAgdG1wRGF0YVtrXSA9IHNyY0NTLnRvQ0lFWFlaKHRtcERhdGFba10pOyAKKyAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgbnVtUGl4ZWxzOyBrKyspIHsKKyAgICAgICAgICAgICAgICB0bXBEYXRhW2tdID0gc3JjQ1MudG9DSUVYWVoodG1wRGF0YVtrXSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYy5sb2FkU2NhbGluZ0RhdGEoeHl6Q1MpOyAvLyBwcmVwYXJlIGZvciBzY2FsaW5nIFhZWgogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIGZvciAoT2JqZWN0IGVsZW1lbnQgOiBzZXF1ZW5jZSkgewogICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ0NfVHJhbnNmb3JtKSB7CiAgICAgICAgICAgICAgICAgSUNDX1RyYW5zZm9ybSB0ID0gKElDQ19UcmFuc2Zvcm0pZWxlbWVudDsKICAgICAgICAgICAgICAgICBjYy50cmFuc2xhdGVDb2xvcih0LCB0bXBEYXRhLCBudWxsLCBudWxsLCBudW1QaXhlbHMpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBDb2xvclNwYWNlIGNzID0gKENvbG9yU3BhY2UpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaz0wOyBrPG51bVBpeGVsczsgaysrKSB7CisgICAgICAgICAgICAgICAgQ29sb3JTcGFjZSBjcyA9IChDb2xvclNwYWNlKWVsZW1lbnQ7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBudW1QaXhlbHM7IGsrKykgewogICAgICAgICAgICAgICAgICAgICB0bXBEYXRhW2tdID0gY3MuZnJvbUNJRVhZWih0bXBEYXRhW2tdKTsKLSAgICAgICAgICAgICAgICAgICAgdG1wRGF0YVtrXSA9IGNzLnRvQ0lFWFlaKHRtcERhdGFba10pOyAKKyAgICAgICAgICAgICAgICAgICAgdG1wRGF0YVtrXSA9IGNzLnRvQ0lFWFlaKHRtcERhdGFba10pOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICAvLyBMYXN0IHRyYW5zZm9ybS4uLgotICAgICAgICBpZiAoc2VxdWVuY2Vbc2VxdWVuY2UubGVuZ3RoLTFdIGluc3RhbmNlb2YgSUNDX1RyYW5zZm9ybSkgeyAvLyBJQ0MKLSAgICAgICAgICAgIElDQ19UcmFuc2Zvcm0gdCA9IChJQ0NfVHJhbnNmb3JtKXNlcXVlbmNlW3NlcXVlbmNlLmxlbmd0aC0xXTsKKyAgICAgICAgaWYgKHNlcXVlbmNlW3NlcXVlbmNlLmxlbmd0aCAtIDFdIGluc3RhbmNlb2YgSUNDX1RyYW5zZm9ybSkgeyAvLyBJQ0MKKyAgICAgICAgICAgIElDQ19UcmFuc2Zvcm0gdCA9IChJQ0NfVHJhbnNmb3JtKXNlcXVlbmNlW3NlcXVlbmNlLmxlbmd0aCAtIDFdOwogICAgICAgICAgICAgY2MudHJhbnNsYXRlQ29sb3IodCwgdG1wRGF0YSwgeHl6Q1MsIGRzdENTLCBudW1QaXhlbHMpOwogICAgICAgICB9IGVsc2UgeyAvLyBub24gSUNDCi0gICAgICAgICAgICBmb3IgKGludCBrPTA7IGs8bnVtUGl4ZWxzOyBrKyspIHsKLSAgICAgICAgICAgICAgICB0bXBEYXRhW2tdID0gZHN0Q1MuZnJvbUNJRVhZWih0bXBEYXRhW2tdKTsgCisgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IG51bVBpeGVsczsgaysrKSB7CisgICAgICAgICAgICAgICAgdG1wRGF0YVtrXSA9IGRzdENTLmZyb21DSUVYWVoodG1wRGF0YVtrXSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC02NDcsMzggKzY1MiwzMiBAQAogICAgICAgICAgICAgZHN0UHQuc2V0TG9jYXRpb24oc3JjUHQpOwogICAgICAgICAgICAgcmV0dXJuIGRzdFB0OwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgUG9pbnQyRC5GbG9hdCgoZmxvYXQpIHNyY1B0LmdldFgoKSwgKGZsb2F0KSBzcmNQdC5nZXRZKCkpOworICAgICAgICByZXR1cm4gbmV3IFBvaW50MkQuRmxvYXQoKGZsb2F0KXNyY1B0LmdldFgoKSwgKGZsb2F0KXNyY1B0LmdldFkoKSk7CiAgICAgfQogCiAgICAgcHVibGljIFdyaXRhYmxlUmFzdGVyIGNyZWF0ZUNvbXBhdGlibGVEZXN0UmFzdGVyKFJhc3RlciBzcmMpIHsKICAgICAgICAgaW50IG5Db21wcyA9IDA7CiAgICAgICAgIGludCBuU3BhY2VzID0gY29udmVyc2lvblNlcXVlbmNlLmxlbmd0aDsKLSAgICAgICAgCisKICAgICAgICAgaWYgKG5TcGFjZXMgPCAyKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI2MSIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBPYmplY3QgbGFzdENTID0gY29udmVyc2lvblNlcXVlbmNlW25TcGFjZXMtMV07CisKKyAgICAgICAgT2JqZWN0IGxhc3RDUyA9IGNvbnZlcnNpb25TZXF1ZW5jZVtuU3BhY2VzIC0gMV07CiAgICAgICAgIGlmIChsYXN0Q1MgaW5zdGFuY2VvZiBDb2xvclNwYWNlKSB7Ci0gICAgICAgICAgICBuQ29tcHMgPSAoKENvbG9yU3BhY2UpIGxhc3RDUykuZ2V0TnVtQ29tcG9uZW50cygpOworICAgICAgICAgICAgbkNvbXBzID0gKChDb2xvclNwYWNlKWxhc3RDUykuZ2V0TnVtQ29tcG9uZW50cygpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbkNvbXBzID0gKChJQ0NfUHJvZmlsZSkgbGFzdENTKS5nZXROdW1Db21wb25lbnRzKCk7IAorICAgICAgICAgICAgbkNvbXBzID0gKChJQ0NfUHJvZmlsZSlsYXN0Q1MpLmdldE51bUNvbXBvbmVudHMoKTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICAvLyBDYWxjdWxhdGUgY29ycmVjdCBkYXRhIHR5cGUKICAgICAgICAgaW50IGRzdERhdGFUeXBlID0gc3JjLmdldERhdGFCdWZmZXIoKS5nZXREYXRhVHlwZSgpOwotICAgICAgICBpZiAoZHN0RGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX0JZVEUgJiYKLSAgICAgICAgICAgZHN0RGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX1NIT1JUKSB7Ci0gICAgICAgICAgICAgICAgZHN0RGF0YVR5cGUgPSBEYXRhQnVmZmVyLlRZUEVfU0hPUlQ7CisgICAgICAgIGlmIChkc3REYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfQllURSAmJiBkc3REYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfU0hPUlQpIHsKKyAgICAgICAgICAgIGRzdERhdGFUeXBlID0gRGF0YUJ1ZmZlci5UWVBFX1NIT1JUOwogICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gUmFzdGVyLmNyZWF0ZUludGVybGVhdmVkUmFzdGVyKAotICAgICAgICAgICAgICAgIGRzdERhdGFUeXBlLCAKLSAgICAgICAgICAgICAgICBzcmMuZ2V0V2lkdGgoKSwKLSAgICAgICAgICAgICAgICBzcmMuZ2V0SGVpZ2h0KCksCi0gICAgICAgICAgICAgICAgbkNvbXBzLAotICAgICAgICAgICAgICAgIG5ldyBQb2ludChzcmMuZ2V0TWluWCgpLCBzcmMuZ2V0TWluWSgpKQotICAgICAgICAgICAgKTsKKworICAgICAgICByZXR1cm4gUmFzdGVyLmNyZWF0ZUludGVybGVhdmVkUmFzdGVyKGRzdERhdGFUeXBlLCBzcmMuZ2V0V2lkdGgoKSwgc3JjLmdldEhlaWdodCgpLCBuQ29tcHMsCisgICAgICAgICAgICAgICAgbmV3IFBvaW50KHNyYy5nZXRNaW5YKCksIHNyYy5nZXRNaW5ZKCkpKTsKICAgICB9CiAKICAgICBwdWJsaWMgZmluYWwgUmVjdGFuZ2xlMkQgZ2V0Qm91bmRzMkQoUmFzdGVyIHNyYykgewpAQCAtNjkwLDEzICs2ODksMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIGFycmF5IG9mIElDQ19Qcm9maWxlcyBvYmplY3RzIHdoaWNoIGNvbnN0cnVjdHMKLSAgICAgKiB0aGlzIENvbG9yQ29udmVydE9wIG9iamVjdCBvciByZXR1cm5zIG51bGwgaWYgdGhpcyBDb2xvckNvbnZlcnRPcCAKLSAgICAgKiBpcyBub3QgY29uc3RydWN0ZWQgZnJvbSBhcnJheSBvZiBJQ0NfUHJvZmlsZXMuCisgICAgICogR2V0cyBhbiBhcnJheSBvZiBJQ0NfUHJvZmlsZXMgb2JqZWN0cyB3aGljaCBjb25zdHJ1Y3RzIHRoaXMKKyAgICAgKiBDb2xvckNvbnZlcnRPcCBvYmplY3Qgb3IgcmV0dXJucyBudWxsIGlmIHRoaXMgQ29sb3JDb252ZXJ0T3AgaXMgbm90CisgICAgICogY29uc3RydWN0ZWQgZnJvbSBhcnJheSBvZiBJQ0NfUHJvZmlsZXMuCiAgICAgICogCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiBJQ0NfUHJvZmlsZXMgb2JqZWN0cyB3aGljaCBjb25zdHJ1Y3RzCi0gICAgICogdGhpcyBDb2xvckNvbnZlcnRPcCBvYmplY3Qgb3IgcmV0dXJucyBudWxsIGlmIHRoaXMgQ29sb3JDb252ZXJ0T3AgCi0gICAgICogaXMgbm90IGNvbnN0cnVjdGVkIGZyb20gYXJyYXkgb2YgSUNDX1Byb2ZpbGVzLgorICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgSUNDX1Byb2ZpbGVzIG9iamVjdHMgd2hpY2ggY29uc3RydWN0cyB0aGlzCisgICAgICogICAgICAgICBDb2xvckNvbnZlcnRPcCBvYmplY3Qgb3IgcmV0dXJucyBudWxsIGlmIHRoaXMgQ29sb3JDb252ZXJ0T3AgaXMKKyAgICAgKiAgICAgICAgIG5vdCBjb25zdHJ1Y3RlZCBmcm9tIGFycmF5IG9mIElDQ19Qcm9maWxlcy4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgSUNDX1Byb2ZpbGVbXSBnZXRJQ0NfUHJvZmlsZXMoKSB7CiAgICAgICAgIGlmIChtaWRQcm9maWxlcyAhPSBudWxsKSB7CkBAIC03MDcsNSArNzA2LDUgQEAKIAogICAgIHB1YmxpYyBmaW5hbCBSZW5kZXJpbmdIaW50cyBnZXRSZW5kZXJpbmdIaW50cygpIHsKICAgICAgICAgcmV0dXJuIHJlbmRlcmluZ0hpbnRzOwotICAgIH0gICAgCisgICAgfQogfQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL0NvbG9yTW9kZWwuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9Db2xvck1vZGVsLmphdmEKaW5kZXggOTQ1YzA4Ny4uMWIwODRlMSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL0NvbG9yTW9kZWwuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvQ29sb3JNb2RlbC5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIElnb3IgVi4gU3RvbHlhcm92CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5pbWFnZTsKIAogaW1wb3J0IGphdmEuYXd0LlRyYW5zcGFyZW5jeTsKQEAgLTI3LDYyICsyOCw5NSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFRoZSBDbGFzcyBDb2xvck1vZGVsLgorICogVGhlIGNsYXNzIENvbG9yTW9kZWwuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29sb3JNb2RlbCBpbXBsZW1lbnRzIFRyYW5zcGFyZW5jeSB7CiAKLSAgICAvKiogVGhlIHBpeGVsX2JpdHMuICovCi0gICAgcHJvdGVjdGVkIGludCBwaXhlbF9iaXRzOyAgLy8gUGl4ZWwgbGVuZ3RoIGluIGJpdHMKKyAgICAvKioKKyAgICAgKiBUaGUgcGl4ZWxfYml0cy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IHBpeGVsX2JpdHM7IC8vIFBpeGVsIGxlbmd0aCBpbiBiaXRzCiAKLSAgICAvKiogVGhlIHRyYW5zZmVyIHR5cGUuICovCisgICAgLyoqCisgICAgICogVGhlIHRyYW5zZmVyIHR5cGUuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGludCB0cmFuc2ZlclR5cGU7CiAKLSAgICAvKiogVGhlIGNzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBjcy4KKyAgICAgKi8KICAgICBDb2xvclNwYWNlIGNzOwogCi0gICAgLyoqIFRoZSBoYXMgYWxwaGEuICovCisgICAgLyoqCisgICAgICogVGhlIGhhcyBhbHBoYS4KKyAgICAgKi8KICAgICBib29sZWFuIGhhc0FscGhhOwogCi0gICAgLyoqIFRoZSBpcyBhbHBoYSBwcmVtdWx0aXBsaWVkLiAqLworICAgIC8qKgorICAgICAqIFRoZSBpcyBhbHBoYSBwcmVtdWx0aXBsaWVkLgorICAgICAqLwogICAgIGJvb2xlYW4gaXNBbHBoYVByZW11bHRpcGxpZWQ7CiAKLSAgICAvKiogVGhlIHRyYW5zcGFyZW5jeS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgdHJhbnNwYXJlbmN5LgorICAgICAqLwogICAgIGludCB0cmFuc3BhcmVuY3k7CiAKLSAgICAvKiogVGhlIG51bSBjb2xvciBjb21wb25lbnRzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBudW0gY29sb3IgY29tcG9uZW50cy4KKyAgICAgKi8KICAgICBpbnQgbnVtQ29sb3JDb21wb25lbnRzOwogCi0gICAgLyoqIFRoZSBudW0gY29tcG9uZW50cy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgbnVtIGNvbXBvbmVudHMuCisgICAgICovCiAgICAgaW50IG51bUNvbXBvbmVudHM7CiAKLSAgICAvKiogVGhlIGJpdHMuICovCi0gICAgaW50W10gYml0czsgICAgICAgICAgICAgLy8gQXJyYXkgb2YgY29tcG9uZW50cyBtYXNrcyAKKyAgICAvKioKKyAgICAgKiBUaGUgYml0cy4KKyAgICAgKi8KKyAgICBpbnRbXSBiaXRzOyAvLyBBcnJheSBvZiBjb21wb25lbnRzIG1hc2tzCiAKLSAgICAvKiogVGhlIG1heCB2YWx1ZXMuICovCisgICAgLyoqCisgICAgICogVGhlIG1heCB2YWx1ZXMuCisgICAgICovCiAgICAgaW50W10gbWF4VmFsdWVzID0gbnVsbDsgLy8gTWF4IHZhbHVlcyB0aGF0IG1heSBiZSByZXByZXNlbnQgYnkgY29sb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wb25lbnRzCiAKLSAgICAvKiogVGhlIG1heCBiaXQgbGVuZ3RoLiAqLwotICAgIGludCBtYXhCaXRMZW5ndGg7ICAgICAgIC8vIE1heCBsZW5ndGggY29sb3IgY29tcG9uZW50cyBpbiBiaXRzCisgICAgLy8gY29tcG9uZW50cwogCi0gICAgLyoqIFRoZSBSRyBiZGVmYXVsdC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgbWF4IGJpdCBsZW5ndGguCisgICAgICovCisgICAgaW50IG1heEJpdExlbmd0aDsgLy8gTWF4IGxlbmd0aCBjb2xvciBjb21wb25lbnRzIGluIGJpdHMKKworICAgIC8qKgorICAgICAqIFRoZSBSRyBiZGVmYXVsdC4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBDb2xvck1vZGVsIFJHQmRlZmF1bHQ7CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgY29sb3IgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGl4ZWxfYml0cyB0aGUgcGl4ZWwgbGVuZ3RoIGluIGJpdHMKLSAgICAgKiBAcGFyYW0gYml0cyB0aGUgYXJyYXkgb2YgY29tcG9uZW50IG1hc2tzCi0gICAgICogQHBhcmFtIGNzcGFjZSB0aGUgY29sb3JzcGFjZQotICAgICAqIEBwYXJhbSBoYXNBbHBoYSB3aGV0aGVyIHRoZSBjb2xvciBtb2RlbCBoYXMgYWxwaGEKLSAgICAgKiBAcGFyYW0gaXNBbHBoYVByZW11bHRpcGxpZWQgd2hldGhlciB0aGUgYWxwaGEgaXMgcHJlbXVsdGlwbGllZAotICAgICAqIEBwYXJhbSB0cmFuc3BhcmVuY3kgdGhlIHRyYW5zcGFyZW5jeSBzdHJhdGVneSwgQHNlZSBqYXZhLmF3dC5UcmFuc3BhcmVuY3kKLSAgICAgKiBAcGFyYW0gdHJhbnNmZXJUeXBlIHRoZSB0cmFuc2ZlciB0eXBlIChwcmltaXRpdmUgamF2YSB0eXBlIAotICAgICAqIHRvIHVzZSBmb3IgdGhlIGNvbXBvbmVudHMpCisgICAgICogQHBhcmFtIHBpeGVsX2JpdHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBwaXhlbCBsZW5ndGggaW4gYml0cy4KKyAgICAgKiBAcGFyYW0gYml0cworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGNvbXBvbmVudCBtYXNrcy4KKyAgICAgKiBAcGFyYW0gY3NwYWNlCisgICAgICogICAgICAgICAgICB0aGUgY29sb3Igc3BhY2UuCisgICAgICogQHBhcmFtIGhhc0FscGhhCisgICAgICogICAgICAgICAgICB3aGV0aGVyIHRoZSBjb2xvciBtb2RlbCBoYXMgYWxwaGEuCisgICAgICogQHBhcmFtIGlzQWxwaGFQcmVtdWx0aXBsaWVkCisgICAgICogICAgICAgICAgICB3aGV0aGVyIHRoZSBhbHBoYSBpcyBwcmUtbXVsdGlwbGllZC4KKyAgICAgKiBAcGFyYW0gdHJhbnNwYXJlbmN5CisgICAgICogICAgICAgICAgICB0aGUgdHJhbnNwYXJlbmN5IHN0cmF0ZWd5LCBAc2VlIGphdmEuYXd0LlRyYW5zcGFyZW5jeS4KKyAgICAgKiBAcGFyYW0gdHJhbnNmZXJUeXBlCisgICAgICogICAgICAgICAgICB0aGUgdHJhbnNmZXIgdHlwZSAocHJpbWl0aXZlIGphdmEgdHlwZSB0byB1c2UgZm9yIHRoZQorICAgICAqICAgICAgICAgICAgY29tcG9uZW50cykuCiAgICAgICovCi0gICAgcHJvdGVjdGVkIENvbG9yTW9kZWwoaW50IHBpeGVsX2JpdHMsIGludFtdIGJpdHMsIENvbG9yU3BhY2UgY3NwYWNlLAotICAgICAgICAgICAgYm9vbGVhbiBoYXNBbHBoYSwgYm9vbGVhbiBpc0FscGhhUHJlbXVsdGlwbGllZCwgaW50IHRyYW5zcGFyZW5jeSwKLSAgICAgICAgICAgIGludCB0cmFuc2ZlclR5cGUpIHsKKyAgICBwcm90ZWN0ZWQgQ29sb3JNb2RlbChpbnQgcGl4ZWxfYml0cywgaW50W10gYml0cywgQ29sb3JTcGFjZSBjc3BhY2UsIGJvb2xlYW4gaGFzQWxwaGEsCisgICAgICAgICAgICBib29sZWFuIGlzQWxwaGFQcmVtdWx0aXBsaWVkLCBpbnQgdHJhbnNwYXJlbmN5LCBpbnQgdHJhbnNmZXJUeXBlKSB7CiAKICAgICAgICAgaWYgKHBpeGVsX2JpdHMgPCAxKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjZCPVRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgcGl4ZWwgdmFsdWVzIGlzIGxlc3MgdGhhbiAxCkBAIC0xMTMsOCArMTQ3LDcgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjZGIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICBpZiAodHJhbnNwYXJlbmN5IDwgVHJhbnNwYXJlbmN5Lk9QQVFVRSB8fAotICAgICAgICAgICAgICAgdHJhbnNwYXJlbmN5ID4gVHJhbnNwYXJlbmN5LlRSQU5TTFVDRU5UKSB7CisgICAgICAgIGlmICh0cmFuc3BhcmVuY3kgPCBUcmFuc3BhcmVuY3kuT1BBUVVFIHx8IHRyYW5zcGFyZW5jeSA+IFRyYW5zcGFyZW5jeS5UUkFOU0xVQ0VOVCkgewogICAgICAgICAgICAgLy8gYXd0LjI3MD1UaGUgdHJhbnNwYXJlbmN5IGlzIG5vdCBhIHZhbGlkIHZhbHVlCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI3MCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CkBAIC0xNDgsMTEgKzE4MSwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBjb2xvciBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgcGl4ZWwgYml0IGRlcHRoLgotICAgICAqIFRoZSB0cmFuc2ZlclR5cGUgaXMgY2hvc2VuIGJhc2VkIG9uIHRoZSBwaXhlbCBiaXRzLCBhbmQgdGhlIG90aGVyCi0gICAgICogZGF0YSBmaWVsZHMgYXJlIGdpdmVuIGRlZmF1bHQgdmFsdWVzLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBjb2xvciBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgcGl4ZWwgYml0IGRlcHRoLiBUaGUKKyAgICAgKiB0cmFuc2ZlclR5cGUgaXMgY2hvc2VuIGJhc2VkIG9uIHRoZSBwaXhlbCBiaXRzLCBhbmQgdGhlIG90aGVyIGRhdGEgZmllbGRzCisgICAgICogYXJlIGdpdmVuIGRlZmF1bHQgdmFsdWVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBiaXRzIHRoZSBhcnJheSBvZiBjb21wb25lbnQgbWFza3MKKyAgICAgKiBAcGFyYW0gYml0cworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGNvbXBvbmVudCBtYXNrcy4KICAgICAgKi8KICAgICBwdWJsaWMgQ29sb3JNb2RlbChpbnQgYml0cykgewogCkBAIC0xNzgsMTQgKzIxMiwxNyBAQAogICAgICAqIEdldHMgdGhlIGRhdGEgZWxlbWVudHMgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudCBhcnJheSwgdHJhbnNmb3JtaW5nCiAgICAgICogdGhlbSBhY2NvcmRpbmcgdG8gcnVsZXMgb2YgdGhlIGNvbG9yIG1vZGVsLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjb21wb25lbnRzIHRoZSBjb21wb25lbnRzCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IGluIHRoZSBub3JtQ29tcG9uZW50cyBhcnJheQotICAgICAqIEBwYXJhbSBvYmogdGhlIGFycmF5IHRoYXQgdGhlIHJlc3VsdCBpcyB3cml0dGVuIHRvOiBhbiBhcnJheSBvZiB2YWx1ZXMKLSAgICAgKiB3aG9zZSBsZW5ndGggbXVzdCBiZSB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgdXNlZCBieSB0aGUgY29sb3IgbW9kZWwgYW5kIAotICAgICAqIHdob3NlIHR5cGUgZGVwZW5kcyBvbiB0aGUgdHJhbnNmZXIgdHlwZSAoYmFzZWQgb24gdGhlIHBpeGVsIGJpdCBkZXB0aCksCi0gICAgICogb3IgbnVsbCB0byBoYXZlIHRoZSBhcHByb3ByaWF0ZSBhcnJheSBjcmVhdGVkCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgZGF0YSBlbGVtZW50cworICAgICAqIEBwYXJhbSBjb21wb25lbnRzCisgICAgICogICAgICAgICAgICB0aGUgY29tcG9uZW50cy4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSBub3JtQ29tcG9uZW50cyBhcnJheS4KKyAgICAgKiBAcGFyYW0gb2JqCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgdGhhdCB0aGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG86IGFuIGFycmF5IG9mIHZhbHVlcworICAgICAqICAgICAgICAgICAgd2hvc2UgbGVuZ3RoIG11c3QgYmUgdGhlIG51bWJlciBvZiBjb21wb25lbnRzIHVzZWQgYnkgdGhlCisgICAgICogICAgICAgICAgICBjb2xvciBtb2RlbCBhbmQgd2hvc2UgdHlwZSBkZXBlbmRzIG9uIHRoZSB0cmFuc2ZlciB0eXBlIChiYXNlZAorICAgICAqICAgICAgICAgICAgb24gdGhlIHBpeGVsIGJpdCBkZXB0aCksIG9yIG51bGwgdG8gaGF2ZSB0aGUgYXBwcm9wcmlhdGUgYXJyYXkKKyAgICAgKiAgICAgICAgICAgIGNyZWF0ZWQuCisgICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgZGF0YSBlbGVtZW50cy4KICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGdldERhdGFFbGVtZW50cyhpbnRbXSBjb21wb25lbnRzLCBpbnQgb2Zmc2V0LCBPYmplY3Qgb2JqKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhpcyBtZXRob2QgaXMgbm90ICIgKyAvLyROT04tTkxTLTEkCkBAIC0xOTUsMzMgKzIzMiwzNiBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGRhdGEgZWxlbWVudHMgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IG9mIG5vcm1hbGl6ZWQgY29tcG9uZW50cy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbm9ybUNvbXBvbmVudHMgdGhlIGFycmF5IG5vcm1hbGl6ZWQgY29tcG9uZW50cwotICAgICAqIEBwYXJhbSBub3JtT2Zmc2V0IHRoZSBvZmZzZXQgaW4gdGhlIG5vcm1Db21wb25lbnRzIGFycmF5Ci0gICAgICogQHBhcmFtIG9iaiB0aGUgYXJyYXkgdGhhdCB0aGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG86IGFuIGFycmF5IG9mIHZhbHVlcwotICAgICAqIHdob3NlIGxlbmd0aCBtdXN0IGJlIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cyB1c2VkIGJ5IHRoZSBjb2xvciBtb2RlbCBhbmQgCi0gICAgICogd2hvc2UgdHlwZSBkZXBlbmRzIG9uIHRoZSB0cmFuc2ZlciB0eXBlIChiYXNlZCBvbiB0aGUgcGl4ZWwgYml0IGRlcHRoKSwKLSAgICAgKiBvciBudWxsIHRvIGhhdmUgdGhlIGFwcHJvcHJpYXRlIGFycmF5IGNyZWF0ZWQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBkYXRhIGVsZW1lbnRzCisgICAgICogQHBhcmFtIG5vcm1Db21wb25lbnRzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgbm9ybWFsaXplZCBjb21wb25lbnRzLgorICAgICAqIEBwYXJhbSBub3JtT2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSBub3JtQ29tcG9uZW50cyBhcnJheS4KKyAgICAgKiBAcGFyYW0gb2JqCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgdGhhdCB0aGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG86IGFuIGFycmF5IG9mIHZhbHVlcworICAgICAqICAgICAgICAgICAgd2hvc2UgbGVuZ3RoIG11c3QgYmUgdGhlIG51bWJlciBvZiBjb21wb25lbnRzIHVzZWQgYnkgdGhlCisgICAgICogICAgICAgICAgICBjb2xvciBtb2RlbCBhbmQgd2hvc2UgdHlwZSBkZXBlbmRzIG9uIHRoZSB0cmFuc2ZlciB0eXBlIChiYXNlZAorICAgICAqICAgICAgICAgICAgb24gdGhlIHBpeGVsIGJpdCBkZXB0aCksIG9yIG51bGwgdG8gaGF2ZSB0aGUgYXBwcm9wcmlhdGUgYXJyYXkKKyAgICAgKiAgICAgICAgICAgIGNyZWF0ZWQuCisgICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgZGF0YSBlbGVtZW50cy4KICAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldERhdGFFbGVtZW50cyhmbG9hdFtdIG5vcm1Db21wb25lbnRzLCBpbnQgbm9ybU9mZnNldCwKLSAgICAgICAgICAgIE9iamVjdCBvYmopIHsKLSAgICAgICAgaW50IHVubm9ybUNvbXBvbmVudHNbXSA9IGdldFVubm9ybWFsaXplZENvbXBvbmVudHMobm9ybUNvbXBvbmVudHMsCi0gICAgICAgICAgICAgICAgbm9ybU9mZnNldCwgbnVsbCwgMCk7CisgICAgcHVibGljIE9iamVjdCBnZXREYXRhRWxlbWVudHMoZmxvYXRbXSBub3JtQ29tcG9uZW50cywgaW50IG5vcm1PZmZzZXQsIE9iamVjdCBvYmopIHsKKyAgICAgICAgaW50IHVubm9ybUNvbXBvbmVudHNbXSA9IGdldFVubm9ybWFsaXplZENvbXBvbmVudHMobm9ybUNvbXBvbmVudHMsIG5vcm1PZmZzZXQsIG51bGwsIDApOwogICAgICAgICByZXR1cm4gZ2V0RGF0YUVsZW1lbnRzKHVubm9ybUNvbXBvbmVudHMsIDAsIG9iaik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGF0YSBlbGVtZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwaXhlbCBkZXRlcm1pbmVkIGJ5IHRoZSAKLSAgICAgKiBSR0IgZGF0YS4KKyAgICAgKiBHZXRzIHRoZSBkYXRhIGVsZW1lbnRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBpeGVsIGRldGVybWluZWQgYnkgdGhlIFJHQgorICAgICAqIGRhdGEuCiAgICAgICogCi0gICAgICogQHBhcmFtIHJnYiB0aGUgcmdiIGludCB0aGF0IGRlZmluZXMgdGhlIHBpeGVsCi0gICAgICogQHBhcmFtIHBpeGVsIHRoZSBhcnJheSB0aGF0IHRoZSByZXN1bHQgaXMgd3JpdHRlbiB0bzogYW4gYXJyYXkgb2YgdmFsdWVzCi0gICAgICogd2hvc2UgbGVuZ3RoIG11c3QgYmUgdGhlIG51bWJlciBvZiBjb21wb25lbnRzIHVzZWQgYnkgdGhlIGNvbG9yIG1vZGVsIGFuZCAKLSAgICAgKiB3aG9zZSB0eXBlIGRlcGVuZHMgb24gdGhlIHRyYW5zZmVyIHR5cGUgKGJhc2VkIG9uIHRoZSBwaXhlbCBiaXQgZGVwdGgpLAotICAgICAqIG9yIG51bGwgdG8gaGF2ZSB0aGUgYXBwcm9wcmlhdGUgYXJyYXkgY3JlYXRlZAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGRhdGEgZWxlbWVudHMKKyAgICAgKiBAcGFyYW0gcmdiCisgICAgICogICAgICAgICAgICB0aGUgUkdCIGludGVnZXIgdmFsdWUgdGhhdCBkZWZpbmVzIHRoZSBwaXhlbC4KKyAgICAgKiBAcGFyYW0gcGl4ZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSB0aGF0IHRoZSByZXN1bHQgaXMgd3JpdHRlbiB0bzogYW4gYXJyYXkgb2YgdmFsdWVzCisgICAgICogICAgICAgICAgICB3aG9zZSBsZW5ndGggbXVzdCBiZSB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgdXNlZCBieSB0aGUKKyAgICAgKiAgICAgICAgICAgIGNvbG9yIG1vZGVsIGFuZCB3aG9zZSB0eXBlIGRlcGVuZHMgb24gdGhlIHRyYW5zZmVyIHR5cGUgKGJhc2VkCisgICAgICogICAgICAgICAgICBvbiB0aGUgcGl4ZWwgYml0IGRlcHRoKSwgb3IgbnVsbCB0byBoYXZlIHRoZSBhcHByb3ByaWF0ZSBhcnJheQorICAgICAqICAgICAgICAgICAgY3JlYXRlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBkYXRhIGVsZW1lbnRzLgogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgZ2V0RGF0YUVsZW1lbnRzKGludCByZ2IsIE9iamVjdCBwaXhlbCkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoaXMgbWV0aG9kIGlzIG5vdCAiICsgLy8kTk9OLU5MUy0xJApAQCAtMjI5LDM4ICsyNjksMzggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjaGlsZCByYXN0ZXIgY29ycmVzcG9uZGluZyB0byB0aGUgYWxwaGEgY2hhbm5lbCBvZiB0aGUgCi0gICAgICogc3BlY2lmaWVkIHdyaXRhYmxlIHJhc3Rlciwgb3IgbnVsbCBpZiBhbHBoYSBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqIEdldHMgdGhlIGNoaWxkIHJhc3RlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBhbHBoYSBjaGFubmVsIG9mIHRoZSBzcGVjaWZpZWQKKyAgICAgKiB3cml0YWJsZSByYXN0ZXIsIG9yIG51bGwgaWYgYWxwaGEgaXMgbm90IHN1cHBvcnRlZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmFzdGVyIHRoZSByYXN0ZXIKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhbHBoYSByYXN0ZXIKKyAgICAgKiBAcGFyYW0gcmFzdGVyCisgICAgICogICAgICAgICAgICB0aGUgcmFzdGVyLgorICAgICAqIEByZXR1cm4gdGhlIGFscGhhIHJhc3Rlci4KICAgICAgKi8KICAgICBwdWJsaWMgV3JpdGFibGVSYXN0ZXIgZ2V0QWxwaGFSYXN0ZXIoV3JpdGFibGVSYXN0ZXIgcmFzdGVyKSB7CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgY29sb3IgbW9kZWwgYnkgY29lcmNpbmcgdGhlIGRhdGEgaW4gdGhlIHdyaXRhYmxlIHJhc3RlciAKLSAgICAgKiBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIGFscGhhIHN0cmF0ZWd5IG9mIHRoaXMgY29sb3IgbW9kZWwuCisgICAgICogQ3JlYXRlcyBhIG5ldyBjb2xvciBtb2RlbCBieSBjb2VyY2luZyB0aGUgZGF0YSBpbiB0aGUgd3JpdGFibGUgcmFzdGVyIGluCisgICAgICogYWNjb3JkYW5jZSB3aXRoIHRoZSBhbHBoYSBzdHJhdGVneSBvZiB0aGlzIGNvbG9yIG1vZGVsLgogICAgICAqIAotICAgICAqIEBwYXJhbSByYXN0ZXIgdGhlIHJhc3RlcgotICAgICAqIEBwYXJhbSBpc0FscGhhUHJlbXVsdGlwbGllZCB3aGV0aGVyIHRoZSBhbHBoYSBpcyBwcmVtdWx0aXBsaWVkIGluIHRoaXMgCi0gICAgICogY29sb3IgbW9kZWwKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgY29sb3IgbW9kZWwKKyAgICAgKiBAcGFyYW0gcmFzdGVyCisgICAgICogICAgICAgICAgICB0aGUgcmFzdGVyLgorICAgICAqIEBwYXJhbSBpc0FscGhhUHJlbXVsdGlwbGllZAorICAgICAqICAgICAgICAgICAgd2hldGhlciB0aGUgYWxwaGEgaXMgcHJlLW11bHRpcGxpZWQgaW4gdGhpcyBjb2xvciBtb2RlbAorICAgICAqIEByZXR1cm4gdGhlIG5ldyBjb2xvciBtb2RlbC4KICAgICAgKi8KLSAgICBwdWJsaWMgQ29sb3JNb2RlbCBjb2VyY2VEYXRhKFdyaXRhYmxlUmFzdGVyIHJhc3RlciwKLSAgICAgICAgICAgIGJvb2xlYW4gaXNBbHBoYVByZW11bHRpcGxpZWQpIHsKKyAgICBwdWJsaWMgQ29sb3JNb2RlbCBjb2VyY2VEYXRhKFdyaXRhYmxlUmFzdGVyIHJhc3RlciwgYm9vbGVhbiBpc0FscGhhUHJlbXVsdGlwbGllZCkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoaXMgbWV0aG9kIGlzIG5vdCAiICsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAgICJzdXBwb3J0ZWQgYnkgdGhpcyBDb2xvck1vZGVsIik7IC8vJE5PTi1OTFMtMSQKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAvLyBUaGUgb3V0cHV0IGZvcm1hdCBiYXNlZCBvbiAxLjUgcmVsZWFzZSBiZWhhdmlvdXIuIAorICAgICAgICAvLyBUaGUgb3V0cHV0IGZvcm1hdCBiYXNlZCBvbiAxLjUgcmVsZWFzZSBiZWhhdmlvci4KICAgICAgICAgLy8gSXQgY291bGQgYmUgcmV2ZWxlZCBzdWNoIHdheToKLSAgICAgICAgLy8gQ29sb3JNb2RlbCBjbSA9IG5ldyBDb21wb25lbnRDb2xvck1vZGVsKENvbG9yU3BhY2UuZ2V0SW5zdGFuY2UoQ29sb3JTcGFjZS5DU19zUkdCLAorICAgICAgICAvLyBDb2xvck1vZGVsIGNtID0gbmV3CisgICAgICAgIC8vIENvbXBvbmVudENvbG9yTW9kZWwoQ29sb3JTcGFjZS5nZXRJbnN0YW5jZShDb2xvclNwYWNlLkNTX3NSR0IsCiAgICAgICAgIC8vIGZhbHNlLCBmYWxzZSwgVHJhbnNwYXJlbmN5Lk9QQVFVRSwgRGF0YUJ1ZmZlci5UWVBFX0JZVEUpOwogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oY20udG9TdHJpbmcoKSk7CiAgICAgICAgIHJldHVybiAiQ29sb3JNb2RlbDogQ29sb3IgU3BhY2UgPSAiICsgY3MudG9TdHJpbmcoKSArICI7IGhhcyBhbHBoYSA9ICIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCkBAIC0yNzQsMTUgKzMxNCwxNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGNvbXBvbmVudHMgb2YgdGhlIHBpeGVsIGRldGVybWluZWQgYnkgdGhlIGRhdGEgYXJyYXkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHBpeGVsIHRoZSBkYXRhIGFycmF5IHRoYXQgZGVmaW5lcyB0aGUgcGl4ZWwgKHdob3NlIAotICAgICAqIHByaW1pdGl2ZSB0eXBlIGNvcnJlc3BvbmRzIHRvIHRoZSBwaXhlbCBsZW5ndGggaW4gYml0cywgCisgICAgICogQHBhcmFtIHBpeGVsCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSBhcnJheSB0aGF0IGRlZmluZXMgdGhlIHBpeGVsICh3aG9zZSBwcmltaXRpdmUgdHlwZQorICAgICAqICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhlIHBpeGVsIGxlbmd0aCBpbiBiaXRzLgogICAgICAqIEBzZWUgQ29sb3JNb2RlbCNnZXRUcmFuc2ZlclR5cGUoKQotICAgICAqIEBwYXJhbSBjb21wb25lbnRzIHRoZSB0aGUgYXJyYXkgd2hlcmUgdGhlIHJlc3VsdGluZyBjb21wb25lbnRzCi0gICAgICogYXJlIHdyaXR0ZW4gKG9yIG51bGwgdG8gcHJvbXB0IHRoZSBtZXRob2QgdG8gY3JlYXRlIHRoZSByZXR1cm4gYXJyYXkpCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IHRoYXQgdGVsbHMgd2hlcmUgdGhlIHJlc3VsdHMgc2hvdWxkIGJlIHdyaXR0ZW4KLSAgICAgKiBpbiB0aGUgcmV0dXJuIGFycmF5Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgY29tcG9uZW50cworICAgICAqIEBwYXJhbSBjb21wb25lbnRzCisgICAgICogICAgICAgICAgICB0aGUgdGhlIGFycmF5IHdoZXJlIHRoZSByZXN1bHRpbmcgY29tcG9uZW50cyBhcmUgd3JpdHRlbiAob3IKKyAgICAgKiAgICAgICAgICAgIG51bGwgdG8gcHJvbXB0IHRoZSBtZXRob2QgdG8gY3JlYXRlIHRoZSByZXR1cm4gYXJyYXkpLgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgdGhhdCB0ZWxscyB3aGVyZSB0aGUgcmVzdWx0cyBzaG91bGQgYmUgd3JpdHRlbiBpbgorICAgICAqICAgICAgICAgICAgdGhlIHJldHVybiBhcnJheS4KKyAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBjb21wb25lbnRzLgogICAgICAqLwogICAgIHB1YmxpYyBpbnRbXSBnZXRDb21wb25lbnRzKE9iamVjdCBwaXhlbCwgaW50W10gY29tcG9uZW50cywgaW50IG9mZnNldCkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoaXMgbWV0aG9kIGlzIG5vdCAiICsgLy8kTk9OLU5MUy0xJApAQCAtMjkyLDE4ICszMzQsMjAgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBub3JtYWxpemVkIGNvbXBvbmVudHMgb2YgdGhlIHBpeGVsIGRldGVybWluZWQgYnkgdGhlIGRhdGEgYXJyYXkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHBpeGVsIHRoZSBkYXRhIGFycmF5IHRoYXQgZGVmaW5lcyB0aGUgcGl4ZWwgKHdob3NlIAotICAgICAqIHByaW1pdGl2ZSB0eXBlIGNvcnJlc3BvbmRzIHRvIHRoZSBwaXhlbCBsZW5ndGggaW4gYml0cywgCisgICAgICogQHBhcmFtIHBpeGVsCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSBhcnJheSB0aGF0IGRlZmluZXMgdGhlIHBpeGVsICh3aG9zZSBwcmltaXRpdmUgdHlwZQorICAgICAqICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhlIHBpeGVsIGxlbmd0aCBpbiBiaXRzLgogICAgICAqIEBzZWUgQ29sb3JNb2RlbCNnZXRUcmFuc2ZlclR5cGUoKQotICAgICAqIEBwYXJhbSBub3JtQ29tcG9uZW50cyB0aGUgYXJyYXkgd2hlcmUgdGhlIHJlc3VsdGluZyBub3JtYWxpc2VkIGNvbXBvbmVudHMKLSAgICAgKiBhcmUgd3JpdHRlbiAob3IgbnVsbCB0byBwcm9tcHQgdGhlIG1ldGhvZCB0byBjcmVhdGUgdGhlIHJldHVybiBhcnJheSkKLSAgICAgKiBAcGFyYW0gbm9ybU9mZnNldCB0aGUgb2Zmc2V0IHRoYXQgdGVsbHMgd2hlcmUgdGhlIHJlc3VsdHMgc2hvdWxkIGJlIHdyaXR0ZW4KLSAgICAgKiBpbiB0aGUgcmV0dXJuIGFycmF5Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYXJyYXkgb2Ygbm9ybWFsaXplZCBjb21wb25lbnRzCisgICAgICogQHBhcmFtIG5vcm1Db21wb25lbnRzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgd2hlcmUgdGhlIHJlc3VsdGluZyBub3JtYWxpemVkIGNvbXBvbmVudHMgYXJlCisgICAgICogICAgICAgICAgICB3cml0dGVuIChvciBudWxsIHRvIHByb21wdCB0aGUgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgcmV0dXJuCisgICAgICogICAgICAgICAgICBhcnJheSkuCisgICAgICogQHBhcmFtIG5vcm1PZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgdGhhdCB0ZWxscyB3aGVyZSB0aGUgcmVzdWx0cyBzaG91bGQgYmUgd3JpdHRlbiBpbgorICAgICAqICAgICAgICAgICAgdGhlIHJldHVybiBhcnJheS4KKyAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBub3JtYWxpemVkIGNvbXBvbmVudHMuCiAgICAgICovCi0gICAgcHVibGljIGZsb2F0W10gZ2V0Tm9ybWFsaXplZENvbXBvbmVudHMoT2JqZWN0IHBpeGVsLAotICAgICAgICAgICAgZmxvYXRbXSBub3JtQ29tcG9uZW50cywgaW50IG5vcm1PZmZzZXQpIHsKKyAgICBwdWJsaWMgZmxvYXRbXSBnZXROb3JtYWxpemVkQ29tcG9uZW50cyhPYmplY3QgcGl4ZWwsIGZsb2F0W10gbm9ybUNvbXBvbmVudHMsIGludCBub3JtT2Zmc2V0KSB7CiAKICAgICAgICAgaWYgKHBpeGVsID09IG51bGwpIHsKICAgICAgICAgICAgIC8vIGF3dC4yOTQ9cGl4ZWwgaXMgbnVsbApAQCAtMzExLDggKzM1NSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpbnQgdW5ub3JtQ29tcG9uZW50c1tdID0gZ2V0Q29tcG9uZW50cyhwaXhlbCwgbnVsbCwgMCk7Ci0gICAgICAgIHJldHVybiBnZXROb3JtYWxpemVkQ29tcG9uZW50cyh1bm5vcm1Db21wb25lbnRzLCAwLCBub3JtQ29tcG9uZW50cywKLSAgICAgICAgICAgICAgICBub3JtT2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuIGdldE5vcm1hbGl6ZWRDb21wb25lbnRzKHVubm9ybUNvbXBvbmVudHMsIDAsIG5vcm1Db21wb25lbnRzLCBub3JtT2Zmc2V0KTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTMyMCw1NCArMzYzLDUyIEBACiAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIENvbG9yTW9kZWwpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgQ29sb3JNb2RlbCBjbSA9IChDb2xvck1vZGVsKSBvYmo7CisgICAgICAgIENvbG9yTW9kZWwgY20gPSAoQ29sb3JNb2RlbClvYmo7CiAKLSAgICAgICAgcmV0dXJuIChwaXhlbF9iaXRzID09IGNtLmdldFBpeGVsU2l6ZSgpICYmCi0gICAgICAgICAgICAgICB0cmFuc2ZlclR5cGUgPT0gY20uZ2V0VHJhbnNmZXJUeXBlKCkgJiYKLSAgICAgICAgICAgICAgIGNzLmdldFR5cGUoKSA9PSBjbS5nZXRDb2xvclNwYWNlKCkuZ2V0VHlwZSgpICYmCi0gICAgICAgICAgICAgICBoYXNBbHBoYSA9PSBjbS5oYXNBbHBoYSgpICYmCi0gICAgICAgICAgICAgICBpc0FscGhhUHJlbXVsdGlwbGllZCA9PSBjbS5pc0FscGhhUHJlbXVsdGlwbGllZCgpICYmCi0gICAgICAgICAgICAgICB0cmFuc3BhcmVuY3kgPT0gY20uZ2V0VHJhbnNwYXJlbmN5KCkgJiYKLSAgICAgICAgICAgICAgIG51bUNvbG9yQ29tcG9uZW50cyA9PSBjbS5nZXROdW1Db2xvckNvbXBvbmVudHMoKSAmJgotICAgICAgICAgICAgICAgbnVtQ29tcG9uZW50cyA9PSBjbS5nZXROdW1Db21wb25lbnRzKCkgJiYKLSAgICAgICAgICAgICAgIEFycmF5cy5lcXVhbHMoYml0cywgY20uZ2V0Q29tcG9uZW50U2l6ZSgpKSk7CisgICAgICAgIHJldHVybiAocGl4ZWxfYml0cyA9PSBjbS5nZXRQaXhlbFNpemUoKSAmJiB0cmFuc2ZlclR5cGUgPT0gY20uZ2V0VHJhbnNmZXJUeXBlKCkKKyAgICAgICAgICAgICAgICAmJiBjcy5nZXRUeXBlKCkgPT0gY20uZ2V0Q29sb3JTcGFjZSgpLmdldFR5cGUoKSAmJiBoYXNBbHBoYSA9PSBjbS5oYXNBbHBoYSgpCisgICAgICAgICAgICAgICAgJiYgaXNBbHBoYVByZW11bHRpcGxpZWQgPT0gY20uaXNBbHBoYVByZW11bHRpcGxpZWQoKQorICAgICAgICAgICAgICAgICYmIHRyYW5zcGFyZW5jeSA9PSBjbS5nZXRUcmFuc3BhcmVuY3koKQorICAgICAgICAgICAgICAgICYmIG51bUNvbG9yQ29tcG9uZW50cyA9PSBjbS5nZXROdW1Db2xvckNvbXBvbmVudHMoKQorICAgICAgICAgICAgICAgICYmIG51bUNvbXBvbmVudHMgPT0gY20uZ2V0TnVtQ29tcG9uZW50cygpICYmIEFycmF5cy5lcXVhbHMoYml0cywgY20KKyAgICAgICAgICAgICAgICAuZ2V0Q29tcG9uZW50U2l6ZSgpKSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgcmVkIGNvbXBvbmVudCBvZiB0aGUgcGl4ZWwgZGV0ZXJtaW5lZCBieSB0aGUgZGF0YSBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5EYXRhIHRoZSBkYXRhIGFycmF5IHRoYXQgZGVmaW5lcyB0aGUgcGl4ZWwgKHdob3NlIAotICAgICAqIHByaW1pdGl2ZSB0eXBlIGNvcnJlc3BvbmRzIHRvIHRoZSBwaXhlbCBsZW5ndGggaW4gYml0cywgCisgICAgICogQHBhcmFtIGluRGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgYXJyYXkgdGhhdCBkZWZpbmVzIHRoZSBwaXhlbCAod2hvc2UgcHJpbWl0aXZlIHR5cGUKKyAgICAgKiAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSBwaXhlbCBsZW5ndGggaW4gYml0cy4KICAgICAgKiBAc2VlIENvbG9yTW9kZWwjZ2V0VHJhbnNmZXJUeXBlKCkKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZWQKKyAgICAgKiBAcmV0dXJuIHRoZSByZWQuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRSZWQoT2JqZWN0IGluRGF0YSkgewogICAgICAgICByZXR1cm4gZ2V0UmVkKGNvbnN0cnVjdFBpeGVsKGluRGF0YSkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIFJHQiBpbnQgY29ycmVzcG9uZGluZyB0byB0aGUgcGl4ZWwgZGVmaW5lZCBieSB0aGUgZGF0YSBhcnJheS4KKyAgICAgKiBHZXRzIHRoZSBSR0IgaW50ZWdlciB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBwaXhlbCBkZWZpbmVkIGJ5IHRoZSBkYXRhCisgICAgICogYXJyYXkuCiAgICAgICogCi0gICAgICogQHBhcmFtIGluRGF0YSB0aGUgZGF0YSBhcnJheSB0aGF0IGRlZmluZXMgdGhlIHBpeGVsICh3aG9zZSAKLSAgICAgKiBwcmltaXRpdmUgdHlwZSBjb3JyZXNwb25kcyB0byB0aGUgcGl4ZWwgbGVuZ3RoIGluIGJpdHMsIAorICAgICAqIEBwYXJhbSBpbkRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIGFycmF5IHRoYXQgZGVmaW5lcyB0aGUgcGl4ZWwgKHdob3NlIHByaW1pdGl2ZSB0eXBlCisgICAgICogICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGUgcGl4ZWwgbGVuZ3RoIGluIGJpdHMuCiAgICAgICogQHNlZSBDb2xvck1vZGVsI2dldFRyYW5zZmVyVHlwZSgpCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW50IHRoYXQgZ2l2ZXMgdGhlIHBpeGVsJ3MgY29sb3JzIGluIFJHQiBmb3JtYXQKKyAgICAgKiBAcmV0dXJuIHRoZSBpbnRlZ2VyIHZhbHVlIHRoYXQgZ2l2ZXMgdGhlIHBpeGVsJ3MgY29sb3JzIGluIFJHQiBmb3JtYXQuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRSR0IoT2JqZWN0IGluRGF0YSkgewotICAgICAgICByZXR1cm4gKGdldEFscGhhKGluRGF0YSkgPDwgMjQgfCBnZXRSZWQoaW5EYXRhKSA8PCAxNiB8Ci0gICAgICAgICAgICAgICBnZXRHcmVlbihpbkRhdGEpIDw8IDggfCBnZXRCbHVlKGluRGF0YSkpOworICAgICAgICByZXR1cm4gKGdldEFscGhhKGluRGF0YSkgPDwgMjQgfCBnZXRSZWQoaW5EYXRhKSA8PCAxNiB8IGdldEdyZWVuKGluRGF0YSkgPDwgOCB8IGdldEJsdWUoaW5EYXRhKSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgZ3JlZW4gY29tcG9uZW50IG9mIHRoZSBwaXhlbCBkZWZpbmVkIGJ5IHRoZSBkYXRhIGFycmF5LgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbkRhdGEgdGhlIGRhdGEgYXJyYXkgdGhhdCBkZWZpbmVzIHRoZSBwaXhlbCAod2hvc2UgCi0gICAgICogcHJpbWl0aXZlIHR5cGUgY29ycmVzcG9uZHMgdG8gdGhlIHBpeGVsIGxlbmd0aCBpbiBiaXRzLCAKKyAgICAgKiBAcGFyYW0gaW5EYXRhCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSBhcnJheSB0aGF0IGRlZmluZXMgdGhlIHBpeGVsICh3aG9zZSBwcmltaXRpdmUgdHlwZQorICAgICAqICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhlIHBpeGVsIGxlbmd0aCBpbiBiaXRzLgogICAgICAqIEBzZWUgQ29sb3JNb2RlbCNnZXRUcmFuc2ZlclR5cGUoKQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGdyZWVuCisgICAgICogQHJldHVybiB0aGUgZ3JlZW4uCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRHcmVlbihPYmplY3QgaW5EYXRhKSB7CiAgICAgICAgIHJldHVybiBnZXRHcmVlbihjb25zdHJ1Y3RQaXhlbChpbkRhdGEpKTsKQEAgLTM3NiwxMSArNDE3LDExIEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgYmx1ZSBjb21wb25lbnQgb2YgdGhlIHBpeGVsIGRlZmluZWQgYnkgdGhlIGRhdGEgYXJyYXkuCiAgICAgICogCi0gICAgICogQHBhcmFtIGluRGF0YSB0aGUgZGF0YSBhcnJheSB0aGF0IGRlZmluZXMgdGhlIHBpeGVsICh3aG9zZSAKLSAgICAgKiBwcmltaXRpdmUgdHlwZSBjb3JyZXNwb25kcyB0byB0aGUgcGl4ZWwgbGVuZ3RoIGluIGJpdHMsIAorICAgICAqIEBwYXJhbSBpbkRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIGFycmF5IHRoYXQgZGVmaW5lcyB0aGUgcGl4ZWwgKHdob3NlIHByaW1pdGl2ZSB0eXBlCisgICAgICogICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGUgcGl4ZWwgbGVuZ3RoIGluIGJpdHMuCiAgICAgICogQHNlZSBDb2xvck1vZGVsI2dldFRyYW5zZmVyVHlwZSgpCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYmx1ZQorICAgICAqIEByZXR1cm4gdGhlIGJsdWUuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRCbHVlKE9iamVjdCBpbkRhdGEpIHsKICAgICAgICAgcmV0dXJuIGdldEJsdWUoY29uc3RydWN0UGl4ZWwoaW5EYXRhKSk7CkBAIC0zODksMTEgKzQzMCwxMSBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGFscGhhIGNvbXBvbmVudCBvZiB0aGUgcGl4ZWwgZGVmaW5lZCBieSB0aGUgZGF0YSBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5EYXRhIHRoZSBkYXRhIGFycmF5IHRoYXQgZGVmaW5lcyB0aGUgcGl4ZWwgKHdob3NlIAotICAgICAqIHByaW1pdGl2ZSB0eXBlIGNvcnJlc3BvbmRzIHRvIHRoZSBwaXhlbCBsZW5ndGggaW4gYml0cywgCisgICAgICogQHBhcmFtIGluRGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgYXJyYXkgdGhhdCBkZWZpbmVzIHRoZSBwaXhlbCAod2hvc2UgcHJpbWl0aXZlIHR5cGUKKyAgICAgKiAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSBwaXhlbCBsZW5ndGggaW4gYml0cy4KICAgICAgKiBAc2VlIENvbG9yTW9kZWwjZ2V0VHJhbnNmZXJUeXBlKCkKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhbHBoYQorICAgICAqIEByZXR1cm4gdGhlIGFscGhhLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0QWxwaGEoT2JqZWN0IGluRGF0YSkgewogICAgICAgICByZXR1cm4gZ2V0QWxwaGEoY29uc3RydWN0UGl4ZWwoaW5EYXRhKSk7CkBAIC00MDIsMTAgKzQ0MywxMSBAQAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgYSBjb21wYXRpYmxlIHdyaXRhYmxlIHJhc3Rlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIGRlc2lyZWQgd3JpdGFibGUgcmFzdGVyCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgZGVzaXJlZCB3cml0YWJsZSByYXN0ZXIKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB3cml0YWJsZSByYXN0ZXIKKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBkZXNpcmVkIHdyaXRhYmxlIHJhc3Rlci4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgZGVzaXJlZCB3cml0YWJsZSByYXN0ZXIuCisgICAgICogQHJldHVybiB0aGUgd3JpdGFibGUgcmFzdGVyLgogICAgICAqLwogICAgIHB1YmxpYyBXcml0YWJsZVJhc3RlciBjcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIoaW50IHcsIGludCBoKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhpcyBtZXRob2QgaXMgbm90ICIgKyAvLyROT04tTkxTLTEkCkBAIC00MTUsOSArNDU3LDkgQEAKICAgICAvKioKICAgICAgKiBDaGVja3MgaWYgdGhlIHNhbXBsZSBtb2RlbCBpcyBjb21wYXRpYmxlIHdpdGggdGhpcyBjb2xvciBtb2RlbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc20gdGhlIHNhbXBsZSBtb2RlbAotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNhbXBsZSBtb2RlbCBpcyBjb21wYXRpYmxlIHdpdGggdGhpcyBjb2xvciBtb2RlbAorICAgICAqIEBwYXJhbSBzbQorICAgICAqICAgICAgICAgICAgdGhlIHNhbXBsZSBtb2RlbC4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzYW1wbGUgbW9kZWwgaXMgY29tcGF0aWJsZSB3aXRoIHRoaXMgY29sb3IgbW9kZWwuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNDb21wYXRpYmxlU2FtcGxlTW9kZWwoU2FtcGxlTW9kZWwgc20pIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCBpcyBub3QgIiArIC8vJE5PTi1OTFMtMSQKQEAgLTQyNywxMCArNDY5LDExIEBACiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyB0aGUgY29tcGF0aWJsZSBzYW1wbGUgbW9kZWwuCiAgICAgICogCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSBkZXNpcmVkIHNhbXBsZSBtb2RlbAotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIGRlc2lyZWQgc2FtcGxlIG1vZGVsCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2FtcGxlIG1vZGVsCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgZGVzaXJlZCBzYW1wbGUgbW9kZWwuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIGRlc2lyZWQgc2FtcGxlIG1vZGVsLgorICAgICAqIEByZXR1cm4gdGhlIHNhbXBsZSBtb2RlbC4KICAgICAgKi8KICAgICBwdWJsaWMgU2FtcGxlTW9kZWwgY3JlYXRlQ29tcGF0aWJsZVNhbXBsZU1vZGVsKGludCB3LCBpbnQgaCkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoaXMgbWV0aG9kIGlzIG5vdCAiICsgLy8kTk9OLU5MUy0xJApAQCAtNDQwLDkgKzQ4Myw5IEBACiAgICAgLyoqCiAgICAgICogQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgcmFzdGVyIGlzIGNvbXBhdGlibGUgd2l0aCB0aGlzIGNvbG9yIG1vZGVsLgogICAgICAqIAotICAgICAqIEBwYXJhbSByYXN0ZXIgdGhlIHJhc3RlciB0byBpbnNwZWN0Ci0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgcmFzdGVyIGlzIGNvbXBhdGlibGUgd2l0aCB0aGlzIGNvbG9yIG1vZGVsCisgICAgICogQHBhcmFtIHJhc3RlcgorICAgICAqICAgICAgICAgICAgdGhlIHJhc3RlciB0byBpbnNwZWN0LgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHJhc3RlciBpcyBjb21wYXRpYmxlIHdpdGggdGhpcyBjb2xvciBtb2RlbC4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBhdGlibGVSYXN0ZXIoUmFzdGVyIHJhc3RlcikgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoaXMgbWV0aG9kIGlzIG5vdCAiICsgLy8kTk9OLU5MUy0xJApAQCAtNDUyLDI4ICs0OTUsMzIgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBjb2xvciBzcGFjZSBvZiB0aGlzIGNvbG9yIG1vZGVsLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvbG9yIHNwYWNlCisgICAgICogQHJldHVybiB0aGUgY29sb3Igc3BhY2UuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIENvbG9yU3BhY2UgZ2V0Q29sb3JTcGFjZSgpIHsKICAgICAgICAgcmV0dXJuIGNzOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIG5vcm1hbGl6ZWQgY29tcG9uZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgCisgICAgICogR2V0cyB0aGUgbm9ybWFsaXplZCBjb21wb25lbnRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZAogICAgICAqIHVubm9ybWFsaXplZCBjb21wb25lbnRzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjb21wb25lbnRzIHRoZSBhcnJheSBvZiB1bm5vcm1hbGl6ZWQgY29tcG9uZW50cwotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCB3aGVyZSB0aGUgY29tcG9uZW50cyBzaG91bGQgYmUgcmVhZCAKLSAgICAgKiBmcm9tIHRoZSBhcnJheSBvZiB1bm5vcm1hbGl6ZWQgY29tcG9uZW50cwotICAgICAqIEBwYXJhbSBub3JtQ29tcG9uZW50cyB0aGUgYXJyYXkgd2hlcmUgdGhlIHJlc3VsdGluZyBub3JtYWxpc2VkIGNvbXBvbmVudHMKLSAgICAgKiBhcmUgd3JpdHRlbiAob3IgbnVsbCB0byBwcm9tcHQgdGhlIG1ldGhvZCB0byBjcmVhdGUgdGhlIHJldHVybiBhcnJheSkKLSAgICAgKiBAcGFyYW0gbm9ybU9mZnNldCB0aGUgb2Zmc2V0IHRoYXQgdGVsbHMgd2hlcmUgdGhlIHJlc3VsdHMgc2hvdWxkIGJlIHdyaXR0ZW4KLSAgICAgKiBpbiB0aGUgcmV0dXJuIGFycmF5Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbm9ybWFsaXplZCBjb21wb25lbnRzCisgICAgICogQHBhcmFtIGNvbXBvbmVudHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiB1bm5vcm1hbGl6ZWQgY29tcG9uZW50cy4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IHdoZXJlIHRoZSBjb21wb25lbnRzIHNob3VsZCBiZSByZWFkIGZyb20gdGhlIGFycmF5CisgICAgICogICAgICAgICAgICBvZiB1bm5vcm1hbGl6ZWQgY29tcG9uZW50cy4KKyAgICAgKiBAcGFyYW0gbm9ybUNvbXBvbmVudHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSB3aGVyZSB0aGUgcmVzdWx0aW5nIG5vcm1hbGl6ZWQgY29tcG9uZW50cyBhcmUKKyAgICAgKiAgICAgICAgICAgIHdyaXR0ZW4gKG9yIG51bGwgdG8gcHJvbXB0IHRoZSBtZXRob2QgdG8gY3JlYXRlIHRoZSByZXR1cm4KKyAgICAgKiAgICAgICAgICAgIGFycmF5KS4KKyAgICAgKiBAcGFyYW0gbm9ybU9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCB0aGF0IHRlbGxzIHdoZXJlIHRoZSByZXN1bHRzIHNob3VsZCBiZSB3cml0dGVuIGluCisgICAgICogICAgICAgICAgICB0aGUgcmV0dXJuIGFycmF5LgorICAgICAqIEByZXR1cm4gdGhlIG5vcm1hbGl6ZWQgY29tcG9uZW50cy4KICAgICAgKi8KLSAgICBwdWJsaWMgZmxvYXRbXSBnZXROb3JtYWxpemVkQ29tcG9uZW50cyhpbnRbXSBjb21wb25lbnRzLCBpbnQgb2Zmc2V0LAotICAgICAgICAgICAgZmxvYXQgbm9ybUNvbXBvbmVudHNbXSwgaW50IG5vcm1PZmZzZXQpIHsKKyAgICBwdWJsaWMgZmxvYXRbXSBnZXROb3JtYWxpemVkQ29tcG9uZW50cyhpbnRbXSBjb21wb25lbnRzLCBpbnQgb2Zmc2V0LCBmbG9hdCBub3JtQ29tcG9uZW50c1tdLAorICAgICAgICAgICAgaW50IG5vcm1PZmZzZXQpIHsKICAgICAgICAgaWYgKGJpdHMgPT0gbnVsbCkgewogICAgICAgICAgICAgLy8gYXd0LjI2Qz1iaXRzIGlzIG51bGwKICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNkMiKSk7IC8vJE5PTi1OTFMtMSQKQEAgLTQ4NCwxNCArNTMxLDEyIEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaGFzQWxwaGEgJiYgaXNBbHBoYVByZW11bHRpcGxpZWQpIHsKLSAgICAgICAgICAgIGZsb2F0IG5vcm1BbHBoYSA9Ci0gICAgICAgICAgICAgICAgKGZsb2F0KSBjb21wb25lbnRzW29mZnNldCArIG51bUNvbG9yQ29tcG9uZW50c10gLwotICAgICAgICAgICAgICAgICAgICBtYXhWYWx1ZXNbbnVtQ29sb3JDb21wb25lbnRzXTsKKyAgICAgICAgICAgIGZsb2F0IG5vcm1BbHBoYSA9IChmbG9hdCljb21wb25lbnRzW29mZnNldCArIG51bUNvbG9yQ29tcG9uZW50c10KKyAgICAgICAgICAgICAgICAgICAgLyBtYXhWYWx1ZXNbbnVtQ29sb3JDb21wb25lbnRzXTsKICAgICAgICAgICAgIGlmIChub3JtQWxwaGEgIT0gMC4wZikgewogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29sb3JDb21wb25lbnRzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbm9ybUNvbXBvbmVudHNbbm9ybU9mZnNldCArIGldID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHNbb2Zmc2V0ICsgaV0gLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChub3JtQWxwaGEgKiBtYXhWYWx1ZXNbaV0pOworICAgICAgICAgICAgICAgICAgICBub3JtQ29tcG9uZW50c1tub3JtT2Zmc2V0ICsgaV0gPSBjb21wb25lbnRzW29mZnNldCArIGldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAobm9ybUFscGhhICogbWF4VmFsdWVzW2ldKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbm9ybUNvbXBvbmVudHNbbm9ybU9mZnNldCArIG51bUNvbG9yQ29tcG9uZW50c10gPSBub3JtQWxwaGE7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNTAxLDkgKzU0Niw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbXBvbmVudHM7IGkrKykgewotICAgICAgICAgICAgICAgIG5vcm1Db21wb25lbnRzW25vcm1PZmZzZXQgKyBpXSA9Ci0gICAgICAgICAgICAgICAgICAgIChmbG9hdCkgY29tcG9uZW50c1tvZmZzZXQgKyBpXSAvCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXhWYWx1ZXNbaV07CisgICAgICAgICAgICAgICAgbm9ybUNvbXBvbmVudHNbbm9ybU9mZnNldCArIGldID0gKGZsb2F0KWNvbXBvbmVudHNbb2Zmc2V0ICsgaV0gLyBtYXhWYWx1ZXNbaV07CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtNTEzLDExICs1NTYsMTIgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBkYXRhIGVsZW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGUgdW5ub3JtYWxpemVkIGNvbXBvbmVudHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNvbXBvbmVudHMgdGhlIGNvbXBvbmVudHMKLSAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdG8gc3RhcnQgcmVhZGluZyB0aGUgY29tcG9uZW50cyBmcm9tIHRoZSAKLSAgICAgKiBhcnJheSBvZiBjb21wb25lbnRzCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGF0YSBlbGVtZW50CisgICAgICogQHBhcmFtIGNvbXBvbmVudHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb21wb25lbnRzLgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgdG8gc3RhcnQgcmVhZGluZyB0aGUgY29tcG9uZW50cyBmcm9tIHRoZSBhcnJheSBvZgorICAgICAqICAgICAgICAgICAgY29tcG9uZW50cy4KKyAgICAgKiBAcmV0dXJuIHRoZSBkYXRhIGVsZW1lbnQuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXREYXRhRWxlbWVudChpbnRbXSBjb21wb25lbnRzLCBpbnQgb2Zmc2V0KSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhpcyBtZXRob2QgaXMgbm90ICIgKyAvLyROT04tTkxTLTEkCkBAIC01MjUsMjEgKzU2OSwyNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHVubm9ybWFsaXplZCBjb21wb25lbnRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCAKKyAgICAgKiBHZXRzIHRoZSB1bm5vcm1hbGl6ZWQgY29tcG9uZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQKICAgICAgKiBub3JtYWxpemVkIGNvbXBvbmVudHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIG5vcm1Db21wb25lbnRzIHRoZSBhcnJheSBvZiBub3JtYWxpemVkIGNvbXBvbmVudHMKLSAgICAgKiBAcGFyYW0gbm9ybU9mZnNldCB0aGUgb2Zmc2V0IHdoZXJlIHRoZSBjb21wb25lbnRzIHNob3VsZCBiZSByZWFkIAotICAgICAqIGZyb20gdGhlIGFycmF5IG9mIG5vcm1hbGl6ZWQgY29tcG9uZW50cwotICAgICAqIEBwYXJhbSBjb21wb25lbnRzIHRoZSBhcnJheSB3aGVyZSB0aGUgcmVzdWx0aW5nIHVubm9ybWFsaXNlZCBjb21wb25lbnRzCi0gICAgICogYXJlIHdyaXR0ZW4gKG9yIG51bGwgdG8gcHJvbXB0IHRoZSBtZXRob2QgdG8gY3JlYXRlIHRoZSByZXR1cm4gYXJyYXkpCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IHRoYXQgdGVsbHMgd2hlcmUgdGhlIHJlc3VsdHMgc2hvdWxkIGJlIHdyaXR0ZW4KLSAgICAgKiBpbiB0aGUgcmV0dXJuIGFycmF5Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdW5ub3JtYWxpemVkIGNvbXBvbmVudHMKKyAgICAgKiBAcGFyYW0gbm9ybUNvbXBvbmVudHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBub3JtYWxpemVkIGNvbXBvbmVudHMuCisgICAgICogQHBhcmFtIG5vcm1PZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgd2hlcmUgdGhlIGNvbXBvbmVudHMgc2hvdWxkIGJlIHJlYWQgZnJvbSB0aGUgYXJyYXkKKyAgICAgKiAgICAgICAgICAgIG9mIG5vcm1hbGl6ZWQgY29tcG9uZW50cy4KKyAgICAgKiBAcGFyYW0gY29tcG9uZW50cworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IHdoZXJlIHRoZSByZXN1bHRpbmcgdW5ub3JtYWxpemVkIGNvbXBvbmVudHMgYXJlCisgICAgICogICAgICAgICAgICB3cml0dGVuIChvciBudWxsIHRvIHByb21wdCB0aGUgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgcmV0dXJuCisgICAgICogICAgICAgICAgICBhcnJheSkuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCB0aGF0IHRlbGxzIHdoZXJlIHRoZSByZXN1bHRzIHNob3VsZCBiZSB3cml0dGVuIGluCisgICAgICogICAgICAgICAgICB0aGUgcmV0dXJuIGFycmF5LgorICAgICAqIEByZXR1cm4gdGhlIHVubm9ybWFsaXplZCBjb21wb25lbnRzLgogICAgICAqLwotICAgIHB1YmxpYyBpbnRbXSBnZXRVbm5vcm1hbGl6ZWRDb21wb25lbnRzKGZsb2F0IG5vcm1Db21wb25lbnRzW10sCi0gICAgICAgICAgICBpbnQgbm9ybU9mZnNldCwgaW50IGNvbXBvbmVudHNbXSwgaW50IG9mZnNldCkgeworICAgIHB1YmxpYyBpbnRbXSBnZXRVbm5vcm1hbGl6ZWRDb21wb25lbnRzKGZsb2F0IG5vcm1Db21wb25lbnRzW10sIGludCBub3JtT2Zmc2V0LAorICAgICAgICAgICAgaW50IGNvbXBvbmVudHNbXSwgaW50IG9mZnNldCkgewogCiAgICAgICAgIGlmIChiaXRzID09IG51bGwpIHsKICAgICAgICAgICAgIC8vIGF3dC4yNkM9Yml0cyBpcyBudWxsCkBAIC01NDcsNyArNTk1LDggQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChub3JtQ29tcG9uZW50cy5sZW5ndGggLSBub3JtT2Zmc2V0IDwgbnVtQ29tcG9uZW50cykgewotICAgICAgICAgICAgLy8gYXd0LjI3Mz1UaGUgbGVuZ3RoIG9mIG5vcm1Db21wb25lbnRzIG1pbnVzIG5vcm1PZmZzZXQgaXMgbGVzcyB0aGFuIG51bUNvbXBvbmVudHMKKyAgICAgICAgICAgIC8vIGF3dC4yNzM9VGhlIGxlbmd0aCBvZiBub3JtQ29tcG9uZW50cyBtaW51cyBub3JtT2Zmc2V0IGlzIGxlc3MKKyAgICAgICAgICAgIC8vIHRoYW4gbnVtQ29tcG9uZW50cwogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNzMiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCkBAIC01NTUsNyArNjA0LDggQEAKICAgICAgICAgICAgIGNvbXBvbmVudHMgPSBuZXcgaW50W251bUNvbXBvbmVudHMgKyBvZmZzZXRdOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKGNvbXBvbmVudHMubGVuZ3RoIC0gb2Zmc2V0IDwgbnVtQ29tcG9uZW50cykgewotICAgICAgICAgICAgICAgIC8vIGF3dC4yNzI9VGhlIGxlbmd0aCBvZiBjb21wb25lbnRzIG1pbnVzIG9mZnNldCBpcyBsZXNzIHRoYW4gbnVtQ29tcG9uZW50cworICAgICAgICAgICAgICAgIC8vIGF3dC4yNzI9VGhlIGxlbmd0aCBvZiBjb21wb25lbnRzIG1pbnVzIG9mZnNldCBpcyBsZXNzIHRoYW4KKyAgICAgICAgICAgICAgICAvLyBudW1Db21wb25lbnRzCiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNzIiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTYzLDE3ICs2MTMsMTUgQEAKICAgICAgICAgaWYgKGhhc0FscGhhICYmIGlzQWxwaGFQcmVtdWx0aXBsaWVkKSB7CiAgICAgICAgICAgICBmbG9hdCBhbHBoYSA9IG5vcm1Db21wb25lbnRzW25vcm1PZmZzZXQgKyBudW1Db2xvckNvbXBvbmVudHNdOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2xvckNvbXBvbmVudHM7IGkrKykgewotICAgICAgICAgICAgICAgIGNvbXBvbmVudHNbb2Zmc2V0ICsgaV0gPSAoaW50KSAobm9ybUNvbXBvbmVudHNbbm9ybU9mZnNldCArIGldCi0gICAgICAgICAgICAgICAgICAgICAgICAqIG1heFZhbHVlc1tpXSAqIGFscGhhICsgMC41Zik7CisgICAgICAgICAgICAgICAgY29tcG9uZW50c1tvZmZzZXQgKyBpXSA9IChpbnQpKG5vcm1Db21wb25lbnRzW25vcm1PZmZzZXQgKyBpXSAqIG1heFZhbHVlc1tpXQorICAgICAgICAgICAgICAgICAgICAgICAgKiBhbHBoYSArIDAuNWYpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgY29tcG9uZW50c1tvZmZzZXQgKyBudW1Db2xvckNvbXBvbmVudHNdID0KLSAgICAgICAgICAgICAgICAoaW50KSAobm9ybUNvbXBvbmVudHNbbm9ybU9mZnNldCArIG51bUNvbG9yQ29tcG9uZW50c10gKgotICAgICAgICAgICAgICAgICAgICAgICAgbWF4VmFsdWVzW251bUNvbG9yQ29tcG9uZW50c10gKyAwLjVmKTsKKyAgICAgICAgICAgIGNvbXBvbmVudHNbb2Zmc2V0ICsgbnVtQ29sb3JDb21wb25lbnRzXSA9IChpbnQpKG5vcm1Db21wb25lbnRzW25vcm1PZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgKyBudW1Db2xvckNvbXBvbmVudHNdCisgICAgICAgICAgICAgICAgICAgICogbWF4VmFsdWVzW251bUNvbG9yQ29tcG9uZW50c10gKyAwLjVmKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29tcG9uZW50czsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgY29tcG9uZW50c1tvZmZzZXQgKyBpXSA9Ci0gICAgICAgICAgICAgICAgICAgIChpbnQpIChub3JtQ29tcG9uZW50c1tub3JtT2Zmc2V0ICsgaV0gKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFZhbHVlc1tpXSArIDAuNWYpOworICAgICAgICAgICAgICAgIGNvbXBvbmVudHNbb2Zmc2V0ICsgaV0gPSAoaW50KShub3JtQ29tcG9uZW50c1tub3JtT2Zmc2V0ICsgaV0gKiBtYXhWYWx1ZXNbaV0gKyAwLjVmKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC01ODMsMzAgKzYzMSwzMiBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGRhdGEgZWxlbWVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSBub3JtYWxpemVkIGNvbXBvbmVudHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIG5vcm1Db21wb25lbnRzIHRoZSBub3JtYWxpemVkIGNvbXBvbmVudHMKLSAgICAgKiBAcGFyYW0gbm9ybU9mZnNldCB0aGUgb2Zmc2V0IHdoZXJlIHRoZSBub3JtYWxpemVkIGNvbXBvbmVudHMgc2hvdWxkCi0gICAgICogYmUgcmVhZCBmcm9tIHRoZSBub3JtYWxpemVkIGNvbXBvbmVudCBhcnJheQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRhdGEgZWxlbWVudAorICAgICAqIEBwYXJhbSBub3JtQ29tcG9uZW50cworICAgICAqICAgICAgICAgICAgdGhlIG5vcm1hbGl6ZWQgY29tcG9uZW50cy4KKyAgICAgKiBAcGFyYW0gbm9ybU9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCB3aGVyZSB0aGUgbm9ybWFsaXplZCBjb21wb25lbnRzIHNob3VsZCBiZSByZWFkIGZyb20KKyAgICAgKiAgICAgICAgICAgIHRoZSBub3JtYWxpemVkIGNvbXBvbmVudCBhcnJheS4KKyAgICAgKiBAcmV0dXJuIHRoZSBkYXRhIGVsZW1lbnQuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXREYXRhRWxlbWVudChmbG9hdCBub3JtQ29tcG9uZW50c1tdLCBpbnQgbm9ybU9mZnNldCkgewotICAgICAgICBpbnQgdW5ub3JtQ29tcG9uZW50c1tdID0gZ2V0VW5ub3JtYWxpemVkQ29tcG9uZW50cyhub3JtQ29tcG9uZW50cywKLSAgICAgICAgICAgICAgICBub3JtT2Zmc2V0LCBudWxsLCAwKTsKKyAgICAgICAgaW50IHVubm9ybUNvbXBvbmVudHNbXSA9IGdldFVubm9ybWFsaXplZENvbXBvbmVudHMobm9ybUNvbXBvbmVudHMsIG5vcm1PZmZzZXQsIG51bGwsIDApOwogICAgICAgICByZXR1cm4gZ2V0RGF0YUVsZW1lbnQodW5ub3JtQ29tcG9uZW50cywgMCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGFrZXMgYSBwaXhlbCB3aG9zZSBkYXRhIGlzIGRlZmluZWQgYnkgYW4gaW50LCBhbmQgd3JpdGVzIHRoZSAKLSAgICAgKiBjb3JyZXNwb25kaW5nIGNvbXBvbmVudHMgaW50byB0aGUgY29tcG9uZW50cyBhcnJheSwgc3RhcnRpbmcgCi0gICAgICogZnJvbSB0aGUgaW5kZXggb2Zmc2V0LgorICAgICAqIFRha2VzIGEgcGl4ZWwgd2hvc2UgZGF0YSBpcyBkZWZpbmVkIGJ5IGFuIGludGVnZXIsIGFuZCB3cml0ZXMgdGhlCisgICAgICogY29ycmVzcG9uZGluZyBjb21wb25lbnRzIGludG8gdGhlIGNvbXBvbmVudHMgYXJyYXksIHN0YXJ0aW5nIGZyb20gdGhlCisgICAgICogaW5kZXggb2Zmc2V0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBwaXhlbCB0aGUgcGl4ZWwgZGF0YQotICAgICAqIEBwYXJhbSBjb21wb25lbnRzIHRoZSBkYXRhIGFycmF5IHRvIHdyaXRlIHRoZSBjb21wb25lbnRzIHRvIChvcgotICAgICAqIG51bGwgdG8gaGF2ZSB0aGUgbWV0aG9kIGNyZWF0ZSB0aGUgcmV0dXJuIGFycmF5KQotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCB0aGF0IGRldGVybWluZXMgd2hlcmUgdGhlIHJlc3VsdHMgYXJlIAotICAgICAqIHdyaXR0ZW4gaW4gdGhlIGNvbXBvbmVudHMgYXJyYXkKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBjb21wb25lbnRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBpeGVsCisgICAgICogQHBhcmFtIHBpeGVsCisgICAgICogICAgICAgICAgICB0aGUgcGl4ZWwgZGF0YS4KKyAgICAgKiBAcGFyYW0gY29tcG9uZW50cworICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgYXJyYXkgdG8gd3JpdGUgdGhlIGNvbXBvbmVudHMgdG8gKG9yIG51bGwgdG8gaGF2ZSB0aGUKKyAgICAgKiAgICAgICAgICAgIG1ldGhvZCBjcmVhdGUgdGhlIHJldHVybiBhcnJheSkuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCB0aGF0IGRldGVybWluZXMgd2hlcmUgdGhlIHJlc3VsdHMgYXJlIHdyaXR0ZW4gaW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBjb21wb25lbnRzIGFycmF5LgorICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGNvbXBvbmVudHMgY29ycmVzcG9uZGluZyB0byB0aGUgcGl4ZWwuCiAgICAgICovCiAgICAgcHVibGljIGludFtdIGdldENvbXBvbmVudHMoaW50IHBpeGVsLCBpbnQgY29tcG9uZW50c1tdLCBpbnQgb2Zmc2V0KSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhpcyBtZXRob2QgaXMgbm90ICIgKyAvLyROT04tTkxTLTEkCkBAIC02MTYsNDUgKzY2Niw0NSBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHJlZCBjb21wb25lbnQgb2YgdGhlIHBpeGVsIGRldGVybWluZWQgYnkgdGhlIHBpeGVsIGRhdGEuCiAgICAgICogCi0gICAgICogQHBhcmFtIHBpeGVsIHRoZSBwaXhlbCBkYXRhCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVkIGNvbXBvbmVudCBvZiB0aGUgcGl4ZWwKKyAgICAgKiBAcGFyYW0gcGl4ZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBwaXhlbC4KKyAgICAgKiBAcmV0dXJuIHRoZSByZWQgY29tcG9uZW50IG9mIHRoZSBnaXZlbiBwaXhlbC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldFJlZChpbnQgcGl4ZWwpOwogCiAgICAgLyoqCi0gICAgICogVGFrZXMgdGhlIHBpeGVsIGRhdGEgYW5kIHJldHVybnMgdGhlIGludCBjb3JyZXNwb25kaW5nIAotICAgICAqIHRvIHRoZSBwaXhlbCdzIGNvbG9yIGluIFJHQiBmb3JtYXQuCisgICAgICogVGFrZXMgdGhlIHBpeGVsIGRhdGEgYW5kIHJldHVybnMgdGhlIGludGVnZXIgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUKKyAgICAgKiBwaXhlbCdzIGNvbG9yIGluIFJHQiBmb3JtYXQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHBpeGVsIHRoZSBwaXhlbCBkYXRhCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBSR0IgaW50CisgICAgICogQHBhcmFtIHBpeGVsCisgICAgICogICAgICAgICAgICB0aGUgcGl4ZWwgZGF0YS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIFJHQiBpbnRlZ2VyIHZhbHVlLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0UkdCKGludCBwaXhlbCkgewotICAgICAgICByZXR1cm4gKGdldEFscGhhKHBpeGVsKSA8PCAyNCB8IGdldFJlZChwaXhlbCkgPDwgMTYKLSAgICAgICAgICAgICAgICB8IGdldEdyZWVuKHBpeGVsKSA8PCA4IHwgZ2V0Qmx1ZShwaXhlbCkpOworICAgICAgICByZXR1cm4gKGdldEFscGhhKHBpeGVsKSA8PCAyNCB8IGdldFJlZChwaXhlbCkgPDwgMTYgfCBnZXRHcmVlbihwaXhlbCkgPDwgOCB8IGdldEJsdWUocGl4ZWwpKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBncmVlbiBjb21wb25lbnQgb2YgdGhlIHBpeGVsIGRldGVybWluZWQgYnkgdGhlIHBpeGVsIGRhdGEuCiAgICAgICogCi0gICAgICogQHBhcmFtIHBpeGVsIHRoZSBwaXhlbCBkYXRhCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZ3JlZW4gY29tcG9uZW50IG9mIHRoZSBwaXhlbAorICAgICAqIEBwYXJhbSBwaXhlbAorICAgICAqICAgICAgICAgICAgdGhlIHBpeGVsLgorICAgICAqIEByZXR1cm4gdGhlIGdyZWVuIGNvbXBvbmVudCBvZiB0aGUgZ2l2ZW4gcGl4ZWwuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRHcmVlbihpbnQgcGl4ZWwpOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgc2l6ZSBvZiB0aGUgZGVzaXJlZCBjb21wb25lbnQgb2YgdGhpcyBjb2xvciBtb2RlbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29tcG9uZW50SWR4IHRoZSBpbmRleCB0aGF0IGRldGVybWluZXMgd2hpY2ggY29tcG9uZW50IHNpemUgdG8gZ2V0Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29tcG9uZW50IHNpemUgY29ycmVzcG9uZGluZyB0byB0aGUgaW5kZXgKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoaXMgY29sb3IgbW9kZWwgZG9lc24ndCBzdXBwb3J0Ci0gICAgICogYW4gYXJyYXkgb2Ygc2VwYXJhdGUgY29tcG9uZW50cy4KLSAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB0aGUgaW5kZXggaXMgbmVnYXRpdmUgb3IKLSAgICAgKiBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBjb21wb25lbnRzCisgICAgICogQHBhcmFtIGNvbXBvbmVudElkeAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBjb21wb25lbnQgc2l6ZSB0byBnZXQuCisgICAgICogQHJldHVybiB0aGUgY29tcG9uZW50IHNpemUgY29ycmVzcG9uZGluZyB0byB0aGUgaW5kZXguCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgY29sb3IgbW9kZWwgZG9lc24ndCBzdXBwb3J0IGFuIGFycmF5IG9mIHNlcGFyYXRlCisgICAgICogICAgICAgICAgICAgY29tcG9uZW50cy4KKyAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBpbmRleCBpcyBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlCisgICAgICogICAgICAgICAgICAgbnVtYmVyIG9mIGNvbXBvbmVudHMuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRDb21wb25lbnRTaXplKGludCBjb21wb25lbnRJZHgpIHsKICAgICAgICAgaWYgKGJpdHMgPT0gbnVsbCkgewpAQCAtNjYzLDcgKzcxMyw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoY29tcG9uZW50SWR4IDwgMCB8fCBjb21wb25lbnRJZHggPj0gYml0cy5sZW5ndGgpIHsKLSAgICAgICAgICAgIC8vIGF3dC4yNzQ9Y29tcG9uZW50SWR4IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgb3IgbGVzcyB0aGFuIHplcm8KKyAgICAgICAgICAgIC8vIGF3dC4yNzQ9Y29tcG9uZW50SWR4IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgb3IKKyAgICAgICAgICAgIC8vIGxlc3MgdGhhbiB6ZXJvCiAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI3NCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKQEAgLTY3MywyNSArNzI0LDI1IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgYmx1ZSBjb21wb25lbnQgb2YgdGhlIHBpeGVsIGRldGVybWluZWQgYnkgdGhlIHBpeGVsIGRhdGEuCiAgICAgICogCi0gICAgICogQHBhcmFtIHBpeGVsIHRoZSBwaXhlbAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGJsdWUgY29tcG9uZW50IG9mIHRoZSBwaXhlbAorICAgICAqIEBwYXJhbSBwaXhlbAorICAgICAqICAgICAgICAgICAgdGhlIHBpeGVsLgorICAgICAqIEByZXR1cm4gdGhlIGJsdWUgY29tcG9uZW50IG9mIHRoZSBnaXZlbiBwaXhlbC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldEJsdWUoaW50IHBpeGVsKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGFscGhhIGNvbXBvbmVudCBvZiB0aGUgcGl4ZWwgZGV0ZXJtaW5lZCBieSB0aGUgcGl4ZWwgZGF0YS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGl4ZWwgdGhlIHBpeGVsCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYWxwaGEgY29tcG9uZW50IG9mIHRoZSBwaXhlbAorICAgICAqIEBwYXJhbSBwaXhlbAorICAgICAqICAgICAgICAgICAgdGhlIHBpeGVsLgorICAgICAqIEByZXR1cm4gdGhlIGFscGhhIGNvbXBvbmVudCBvZiB0aGUgZ2l2ZW4gcGl4ZWwuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRBbHBoYShpbnQgcGl4ZWwpOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgYXJyYXkgb2Ygc2l6ZXMgb2YgdGhlIGRpZmZlcmVudCBjb21wb25lbnRzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIHNpemVzIG9mIHRoZSBkaWZmZXJlbnQgY29tcG9uZW50cworICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIHNpemVzIG9mIHRoZSBkaWZmZXJlbnQgY29tcG9uZW50cy4KICAgICAgKi8KICAgICBwdWJsaWMgaW50W10gZ2V0Q29tcG9uZW50U2l6ZSgpIHsKICAgICAgICAgaWYgKGJpdHMgIT0gbnVsbCkgewpAQCAtNzAxLDkgKzc1Miw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIHRoZSBhbHBoYSBjb21wb25lbnQgaXMgcHJlbXVsdGlwbGllZC4KKyAgICAgKiBDaGVja3MgaWYgdGhlIGFscGhhIGNvbXBvbmVudCBpcyBwcmUtbXVsdGlwbGllZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBhbHBoYSBjb21wb25lbnQgaXMgcHJlbXVsdGlwbGllZAorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIGFscGhhIGNvbXBvbmVudCBpcyBwcmUtbXVsdGlwbGllZC4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0FscGhhUHJlbXVsdGlwbGllZCgpIHsKICAgICAgICAgcmV0dXJuIGlzQWxwaGFQcmVtdWx0aXBsaWVkOwpAQCAtNzEyLDcgKzc2Myw3IEBACiAgICAgLyoqCiAgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhpcyBjb2xvciBtb2RlbCBzdXBwb3J0cyBhbHBoYS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgY29sb3IgbW9kZWwgaGFzIGFscGhhCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGlzIGNvbG9yIG1vZGVsIGhhcyBhbHBoYS4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNBbHBoYSgpIHsKICAgICAgICAgcmV0dXJuIGhhc0FscGhhOwpAQCAtNzc2LDEyICs4MjcsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0cmFuc2ZlciB0eXBlLCB3aGljaCBpcyB0aGUgdHlwZSBvZiBKYXZhIHByaW1pdGl2ZQotICAgICAqIHZhbHVlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGJpdCBsZW5ndGggcGVyIHBpeGVsOiBlaXRoZXIgCi0gICAgICoge0BsaW5rIERhdGFCdWZmZXIjVFlQRV9CWVRFfSwge0BsaW5rIERhdGFCdWZmZXIjVFlQRV9VU0hPUlR9LCAKKyAgICAgKiBHZXRzIHRoZSB0cmFuc2ZlciB0eXBlLCB3aGljaCBpcyB0aGUgdHlwZSBvZiBKYXZhIHByaW1pdGl2ZSB2YWx1ZSB0aGF0CisgICAgICogY29ycmVzcG9uZHMgdG8gdGhlIGJpdCBsZW5ndGggcGVyIHBpeGVsOiBlaXRoZXIKKyAgICAgKiB7QGxpbmsgRGF0YUJ1ZmZlciNUWVBFX0JZVEV9LCB7QGxpbmsgRGF0YUJ1ZmZlciNUWVBFX1VTSE9SVH0sCiAgICAgICoge0BsaW5rIERhdGFCdWZmZXIjVFlQRV9JTlR9LCBvciB7QGxpbmsgRGF0YUJ1ZmZlciNUWVBFX1VOREVGSU5FRH0uCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgdHJhbnNmZXIgdHlwZQorICAgICAqIEByZXR1cm4gdGhlIHRyYW5zZmVyIHR5cGUuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGludCBnZXRUcmFuc2ZlclR5cGUoKSB7CiAgICAgICAgIHJldHVybiB0cmFuc2ZlclR5cGU7CkBAIC03OTAsNyArODQxLDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBwaXhlbCBzaXplIGluIGJpdHMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcGl4ZWwgc2l6ZQorICAgICAqIEByZXR1cm4gdGhlIHBpeGVsIHNpemUuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRQaXhlbFNpemUoKSB7CiAgICAgICAgIHJldHVybiBwaXhlbF9iaXRzOwpAQCAtNzk5LDcgKzg1MCw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgb2YgdGhpcyBjb2xvciBtb2RlbC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cworICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjb21wb25lbnRzLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TnVtQ29tcG9uZW50cygpIHsKICAgICAgICAgcmV0dXJuIG51bUNvbXBvbmVudHM7CkBAIC04MDgsNyArODU5LDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgY29sb3IgY29tcG9uZW50cyBvZiB0aGlzIGNvbG9yIG1vZGVsLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBjb2xvciBjb21wb25lbnRzCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIGNvbG9yIGNvbXBvbmVudHMuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXROdW1Db2xvckNvbXBvbmVudHMoKSB7CiAgICAgICAgIHJldHVybiBudW1Db2xvckNvbXBvbmVudHM7CkBAIC04MTcsMTIgKzg2OCwxMSBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGRlZmF1bHQgUkdCIGNvbG9yIG1vZGVsLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgUkdCIGNvbG9yIG1vZGVsCisgICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBSR0IgY29sb3IgbW9kZWwuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBDb2xvck1vZGVsIGdldFJHQmRlZmF1bHQoKSB7CiAgICAgICAgIGlmIChSR0JkZWZhdWx0ID09IG51bGwpIHsKLSAgICAgICAgICAgIFJHQmRlZmF1bHQgPSBuZXcgRGlyZWN0Q29sb3JNb2RlbCgzMiwgMHgwMGZmMDAwMCwgMHgwMDAwZmYwMCwKLSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBmZiwgMHhmZjAwMDAwMCk7CisgICAgICAgICAgICBSR0JkZWZhdWx0ID0gbmV3IERpcmVjdENvbG9yTW9kZWwoMzIsIDB4MDBmZjAwMDAsIDB4MDAwMGZmMDAsIDB4MDAwMDAwZmYsIDB4ZmYwMDAwMDApOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBSR0JkZWZhdWx0OwogICAgIH0KQEAgLTgzMCw2NiArODgwLDY5IEBACiAgICAgLyoKICAgICAgKiBDb25zdHJ1Y3QgSU5UIHBpeGVsIHJlcHJlc2VudGF0aW9uIGZyb20gT2JqZWN0CiAgICAgICogQHBhcmFtIG9iagotICAgICAqCiAgICAgICogQHJldHVybgogICAgICAqLwogICAgIC8qKgogICAgICAqIENvbnN0cnVjdCBwaXhlbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmoKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnQKKyAgICAgKiBAcGFyYW0gb2JqCisgICAgICogICAgICAgICAgICB0aGUgb2JqLgorICAgICAqIEByZXR1cm4gdGhlIGludC4KICAgICAgKi8KICAgICBwcml2YXRlIGludCBjb25zdHJ1Y3RQaXhlbChPYmplY3Qgb2JqKSB7CiAgICAgICAgIGludCBwaXhlbCA9IDA7CiAKICAgICAgICAgc3dpdGNoIChnZXRUcmFuc2ZlclR5cGUoKSkgewogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6Ci0gICAgICAgICAgICBieXRlW10gYlBpeGVsID0gKGJ5dGVbXSkgb2JqOwotICAgICAgICAgICAgaWYoYlBpeGVsLmxlbmd0aCA+IDEpIHsKLSAgICAgICAgICAgICAgICAvLyBhd3QuMjc1PVRoaXMgcGl4ZWwgcmVwcmVzZW50YXRpb24gaXMgbm90IHN1dXBvcnRlZCBieSB0aXMgQ29sb3IgTW9kZWwKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjc1IikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwaXhlbCA9IGJQaXhlbFswXSAmIDB4ZmY7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6CisgICAgICAgICAgICAgICAgYnl0ZVtdIGJQaXhlbCA9IChieXRlW10pb2JqOworICAgICAgICAgICAgICAgIGlmIChiUGl4ZWwubGVuZ3RoID4gMSkgeworICAgICAgICAgICAgICAgICAgICAvLyBhd3QuMjc1PVRoaXMgcGl4ZWwgcmVwcmVzZW50YXRpb24gaXMgbm90IHN1dXBvcnRlZCBieSB0aXMKKyAgICAgICAgICAgICAgICAgICAgLy8gQ29sb3IgTW9kZWwKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI3NSIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwaXhlbCA9IGJQaXhlbFswXSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgotICAgICAgICAgICAgc2hvcnRbXSBzUGl4ZWwgPSAoc2hvcnRbXSkgb2JqOwotICAgICAgICAgICAgaWYoc1BpeGVsLmxlbmd0aCA+IDEpIHsKLSAgICAgICAgICAgICAgICAvLyBhd3QuMjc1PVRoaXMgcGl4ZWwgcmVwcmVzZW50YXRpb24gaXMgbm90IHN1dXBvcnRlZCBieSB0aXMgQ29sb3IgTW9kZWwKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjc1IikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwaXhlbCA9IHNQaXhlbFswXSAmIDB4ZmZmZjsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgorICAgICAgICAgICAgICAgIHNob3J0W10gc1BpeGVsID0gKHNob3J0W10pb2JqOworICAgICAgICAgICAgICAgIGlmIChzUGl4ZWwubGVuZ3RoID4gMSkgeworICAgICAgICAgICAgICAgICAgICAvLyBhd3QuMjc1PVRoaXMgcGl4ZWwgcmVwcmVzZW50YXRpb24gaXMgbm90IHN1dXBvcnRlZCBieSB0aXMKKyAgICAgICAgICAgICAgICAgICAgLy8gQ29sb3IgTW9kZWwKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI3NSIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwaXhlbCA9IHNQaXhlbFswXSAmIDB4ZmZmZjsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6Ci0gICAgICAgICAgICBpbnRbXSBpUGl4ZWwgPSAoaW50W10pIG9iajsKLSAgICAgICAgICAgIGlmKGlQaXhlbC5sZW5ndGggPiAxKSB7Ci0gICAgICAgICAgICAgICAgLy8gYXd0LjI3NT1UaGlzIHBpeGVsIHJlcHJlc2VudGF0aW9uIGlzIG5vdCBzdXVwb3J0ZWQgYnkgdGlzIENvbG9yIE1vZGVsCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI3NSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGl4ZWwgPSBpUGl4ZWxbMF07Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKKyAgICAgICAgICAgICAgICBpbnRbXSBpUGl4ZWwgPSAoaW50W10pb2JqOworICAgICAgICAgICAgICAgIGlmIChpUGl4ZWwubGVuZ3RoID4gMSkgeworICAgICAgICAgICAgICAgICAgICAvLyBhd3QuMjc1PVRoaXMgcGl4ZWwgcmVwcmVzZW50YXRpb24gaXMgbm90IHN1dXBvcnRlZCBieSB0aXMKKyAgICAgICAgICAgICAgICAgICAgLy8gQ29sb3IgTW9kZWwKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI3NSIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwaXhlbCA9IGlQaXhlbFswXTsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gYXd0LjIyRD1UaGlzIHRyYW5zZmVyVHlwZSAoIHswfSApIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBjb2xvciBtb2RlbAotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIyRCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICB0cmFuc2ZlclR5cGUpKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8gYXd0LjIyRD1UaGlzIHRyYW5zZmVyVHlwZSAoIHswfSApIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcworICAgICAgICAgICAgICAgIC8vIGNvbG9yIG1vZGVsCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIyRCIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyVHlwZSkpOwogCiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHBpeGVsOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRyYW5zZmVyIHR5cGUsIHdoaWNoIGlzIHRoZSB0eXBlIG9mIEphdmEgcHJpbWl0aXZlCi0gICAgICogdmFsdWUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgYml0IGxlbmd0aCBwZXIgcGl4ZWw6IGVpdGhlciAKLSAgICAgKiB7QGxpbmsgRGF0YUJ1ZmZlciNUWVBFX0JZVEV9LCB7QGxpbmsgRGF0YUJ1ZmZlciNUWVBFX1VTSE9SVH0sIAorICAgICAqIEdldHMgdGhlIHRyYW5zZmVyIHR5cGUsIHdoaWNoIGlzIHRoZSB0eXBlIG9mIEphdmEgcHJpbWl0aXZlIHZhbHVlIHRoYXQKKyAgICAgKiBjb3JyZXNwb25kcyB0byB0aGUgYml0IGxlbmd0aCBwZXIgcGl4ZWw6IGVpdGhlcgorICAgICAqIHtAbGluayBEYXRhQnVmZmVyI1RZUEVfQllURX0sIHtAbGluayBEYXRhQnVmZmVyI1RZUEVfVVNIT1JUfSwKICAgICAgKiB7QGxpbmsgRGF0YUJ1ZmZlciNUWVBFX0lOVH0sIG9yIHtAbGluayBEYXRhQnVmZmVyI1RZUEVfVU5ERUZJTkVEfS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYml0cyB0aGUgYXJyYXkgb2YgY29tcG9uZW50IG1hc2tzCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdHJhbnNmZXIgdHlwZQorICAgICAqIEBwYXJhbSBiaXRzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgY29tcG9uZW50IG1hc2tzLgorICAgICAqIEByZXR1cm4gdGhlIHRyYW5zZmVyIHR5cGUuCiAgICAgICovCiAgICAgc3RhdGljIGludCBnZXRUcmFuc2ZlclR5cGUoaW50IGJpdHMpIHsKICAgICAgICAgaWYgKGJpdHMgPD0gOCkgewpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL0NvbXBvbmVudENvbG9yTW9kZWwuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9Db21wb25lbnRDb2xvck1vZGVsLmphdmEKaW5kZXggYTE1MmY1NS4uNDMyOGZkMyAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL0NvbXBvbmVudENvbG9yTW9kZWwuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvQ29tcG9uZW50Q29sb3JNb2RlbC5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIElnb3IgVi4gU3RvbHlhcm92CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5pbWFnZTsKIAogaW1wb3J0IGphdmEuYXd0LmNvbG9yLkNvbG9yU3BhY2U7CkBAIC0yNiwxNTQgKzI3LDIwMiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFRoZSBDbGFzcyBDb21wb25lbnRDb2xvck1vZGVsIHJlcHJlc2VudHMgYSBjb2xvciBtb2RlbCB0aGF0IGlzIGRlZmluZWQgCi0gKiBpbiB0ZXJtcyBvZiBpdHMgY29tcG9uZW50cy4KKyAqIFRoZSBDbGFzcyBDb21wb25lbnRDb2xvck1vZGVsIHJlcHJlc2VudHMgYSBjb2xvciBtb2RlbCB0aGF0IGlzIGRlZmluZWQgaW4KKyAqIHRlcm1zIG9mIGl0cyBjb21wb25lbnRzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIENvbXBvbmVudENvbG9yTW9kZWwgZXh0ZW5kcyBDb2xvck1vZGVsIHsKIAotICAgIC8qKiBUaGUgc2lnbmVkLiAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzaWduZWQ7ICAgLy8gUGl4ZWwgc2FtcGxlcyBhcmUgc2lnbmVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtcGxlcyB3aXRoIFRyYW5zZmVyVHlwZSBEYXRhQnVmZmVyLlRZUEVfQllURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQsIERhdGFCdWZmZXIuVFlQRV9JTlQgLSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuc2lnbmVkLiBTYW1wbGVzIHdpdGggb3RoZXJzIFRyYW5zZmVyVHlwZSAtIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2lnbmVkLgorICAgIC8qKgorICAgICAqIFRoZSBzaWduZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHNpZ25lZDsgLy8gUGl4ZWwgc2FtcGxlcyBhcmUgc2lnbmVkLgogCi0gICAgLyoqIFRoZSBpbnRlZ3JhbC4gKi8KKyAgICAvLyBTYW1wbGVzIHdpdGggVHJhbnNmZXJUeXBlIERhdGFCdWZmZXIuVFlQRV9CWVRFLAorICAgIC8vIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQsIERhdGFCdWZmZXIuVFlQRV9JTlQgLQorICAgIC8vIHVuc2lnbmVkLiBTYW1wbGVzIHdpdGggb3RoZXJzIFRyYW5zZmVyVHlwZSAtCisgICAgLy8gc2lnbmVkLgorCisgICAgLyoqCisgICAgICogVGhlIGludGVncmFsLgorICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBpbnRlZ3JhbDsgLy8gUGl4ZWwgc2FtcGxlcyBhcmUgaW50ZWdyYWwuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1wbGVzIHdpdGggVHJhbnNmZXJUeXBlIERhdGFCdWZmZXIuVFlQRV9CWVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVCwgRGF0YUJ1ZmZlci5TaG9ydCBhbmQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhQnVmZmVyLlRZUEVfSU5UIC0gaW50ZWdyYWwuCiAKLSAgICAvKiogVGhlIHNjYWxlIGZhY3RvcnMuICovCi0gICAgcHJpdmF0ZSBmbG9hdCBzY2FsZUZhY3RvcnNbXTsgLy8gQXJyYXkgb2YgZmFjdG9ycyBmb3IgcmVkdWN0aW9uIGNvbXBvbmVudHMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWVzIGludG8gdGhlIGZvcm0gc2NhbGVkIGZyb20gMCB0byAyNTUKKyAgICAvLyBTYW1wbGVzIHdpdGggVHJhbnNmZXJUeXBlIERhdGFCdWZmZXIuVFlQRV9CWVRFLAorICAgIC8vIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQsIERhdGFCdWZmZXIuU2hvcnQgYW5kCisgICAgLy8gRGF0YUJ1ZmZlci5UWVBFX0lOVCAtIGludGVncmFsLgogCi0gICAgLyoqIFRoZSBkb25vdCBzdXBwb3J0IHVubm9ybWFsaXplZC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgc2NhbGUgZmFjdG9ycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IHNjYWxlRmFjdG9yc1tdOyAvLyBBcnJheSBvZiBmYWN0b3JzIGZvciByZWR1Y3Rpb24gY29tcG9uZW50cworCisgICAgLy8gdmFsdWVzIGludG8gdGhlIGZvcm0gc2NhbGVkIGZyb20gMCB0byAyNTUKKworICAgIC8qKgorICAgICAqIFRoZSBkb25vdCBzdXBwb3J0IHVubm9ybWFsaXplZC4KKyAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gZG9ub3RTdXBwb3J0VW5ub3JtYWxpemVkOyAvLyBUaGlzIENvbG9yIE1vZGVsIGRvbid0IHN1cHBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bm5vcm1vbGl6ZWQgZm9ybSAKIAotICAgIC8qKiBUaGUgbmVlZCBhbHBoYSBkaXZpZGUuICovCisgICAgLy8gdW5ub3Jtb2xpemVkIGZvcm0KKworICAgIC8qKgorICAgICAqIFRoZSBuZWVkIGFscGhhIGRpdmlkZS4KKyAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gbmVlZEFscGhhRGl2aWRlOyAvLyBoYXNBbHBoYSAmJiBpc0FscGhhUHJlbXVsdGlwbGllZAogCi0gICAgLyoqIFRoZSBjYWxjIHZhbHVlLiAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBjYWxjVmFsdWU7ICAgICAgIC8vIFZhbHVlIHdhcyBjdWxjdWxhdGVkCisgICAgLyoqCisgICAgICogVGhlIGNhbGMgdmFsdWUuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNhbGNWYWx1ZTsgLy8gVmFsdWUgd2FzIGN1bGN1bGF0ZWQKIAotICAgIC8qKiBUaGUgbmVlZCBzY2FsZS4gKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbmVlZFNjYWxlOyAgICAgICAvLyBOb3JtYWxpemVkIHZhbHVlIG5lZWQgdG8gc2NhbGUKKyAgICAvKioKKyAgICAgKiBUaGUgbmVlZCBzY2FsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbmVlZFNjYWxlOyAvLyBOb3JtYWxpemVkIHZhbHVlIG5lZWQgdG8gc2NhbGUKIAotICAgIC8qKiBUaGUgbWluIHZhbHMuICovCi0gICAgcHJpdmF0ZSBmbG9hdCBtaW5WYWxzW107ICAgICAgICAgLy8gQXJyYXkgb2YgTWluIG5vcm1hbGl6ZWQgdmFsdWVzCisgICAgLyoqCisgICAgICogVGhlIG1pbiB2YWxzLgorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgbWluVmFsc1tdOyAvLyBBcnJheSBvZiBNaW4gbm9ybWFsaXplZCB2YWx1ZXMKIAotICAgIC8qKiBUaGUgcmFuZ2VzLiAqLwotICAgIHByaXZhdGUgZmxvYXQgcmFuZ2VzW107ICAgICAgICAgIC8vIEFycmF5IG9mIHJhbmdlIG5vcm1hbGl6ZWQgdmFsdWVzICAKKyAgICAvKioKKyAgICAgKiBUaGUgcmFuZ2VzLgorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgcmFuZ2VzW107IC8vIEFycmF5IG9mIHJhbmdlIG5vcm1hbGl6ZWQgdmFsdWVzCiAKLSAgICAvKiogVGhlIGFscGhhIGx1dC4gKi8KLSAgICBwcml2YXRlIGJ5dGUgYWxwaGFMVVRbXTsgICAgICAgICAvLyBMb29rdXAgdGFibGUgZm9yIHNjYWxlIGFscGhhIHZhbHVlCisgICAgLyoqCisgICAgICogVGhlIGFscGhhIGx1dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJ5dGUgYWxwaGFMVVRbXTsgLy8gTG9va3VwIHRhYmxlIGZvciBzY2FsZSBhbHBoYSB2YWx1ZQogCi0gICAgLyoqIFRoZSBjb2xvciBsdSB0cy4gKi8KLSAgICBwcml2YXRlIGJ5dGUgY29sb3JMVVRzW11bXTsgICAgICAvLyBMb29rdXAgdGFibGVzIGZvciBzY2FsZSBjb2xvciB2YWx1ZXMKKyAgICAvKioKKyAgICAgKiBUaGUgY29sb3IgbHUgdHMuCisgICAgICovCisgICAgcHJpdmF0ZSBieXRlIGNvbG9yTFVUc1tdW107IC8vIExvb2t1cCB0YWJsZXMgZm9yIHNjYWxlIGNvbG9yIHZhbHVlcwogCi0gICAgLyoqIFRoZSBmcm9tXyBsaW5lYSByXyByZyBiXyBsdXQuICovCi0gICAgcHJpdmF0ZSBieXRlIGZyb21fTElORUFSX1JHQl9MVVRbXTsgIC8vIExvb2t1cCB0YWJsZSBmb3IgY29udmVyc2lvbiBmcm9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExpbmVhciBSR0IgQ29sb3IgU3BhY2UgaW50byBzUkdCCisgICAgLyoqCisgICAgICogVGhlIGZyb21fIGxpbmVhIHJfIHJnIGJfIGx1dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJ5dGUgZnJvbV9MSU5FQVJfUkdCX0xVVFtdOyAvLyBMb29rdXAgdGFibGUgZm9yIGNvbnZlcnNpb24gZnJvbQogCi0gICAgLyoqIFRoZSB0b18gbGluZWEgcl84IHJnIGJfIGx1dC4gKi8KLSAgICBwcml2YXRlIGJ5dGUgdG9fTElORUFSXzhSR0JfTFVUW107ICAgLy8gTG9va3VwIHRhYmxlIGZvciBjb252ZXJzaW9uIGZyb20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc1JHQiBDb2xvciBTcGFjZSBpbnRvIExpbmVhciBSR0IgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDggYml0IAorICAgIC8vIExpbmVhciBSR0IgQ29sb3IgU3BhY2UgaW50byBzUkdCCiAKLSAgICAvKiogVGhlIHRvXyBsaW5lYSByXzE2IHJnIGJfIGx1dC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgdG9fIGxpbmVhIHJfOCByZyBiXyBsdXQuCisgICAgICovCisgICAgcHJpdmF0ZSBieXRlIHRvX0xJTkVBUl84UkdCX0xVVFtdOyAvLyBMb29rdXAgdGFibGUgZm9yIGNvbnZlcnNpb24gZnJvbQorCisgICAgLy8gc1JHQiBDb2xvciBTcGFjZSBpbnRvIExpbmVhciBSR0IKKyAgICAvLyA4IGJpdAorCisgICAgLyoqCisgICAgICogVGhlIHRvXyBsaW5lYSByXzE2IHJnIGJfIGx1dC4KKyAgICAgKi8KICAgICBwcml2YXRlIHNob3J0IHRvX0xJTkVBUl8xNlJHQl9MVVRbXTsgLy8gTG9va3VwIHRhYmxlIGZvciBjb252ZXJzaW9uIGZyb20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc1JHQiBDb2xvciBTcGFjZSBpbnRvIExpbmVhciBSR0IgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDE2IGJpdCAKIAotICAgIC8qKiBUaGUgTElORUEgcl8gcmcgYl8gbGVuZ3RoLiAqLwotICAgIHByaXZhdGUgaW50IExJTkVBUl9SR0JfTGVuZ3RoOyAgICAgICAvLyBMaW5lYXIgUkdCIGJpdCBsZW5ndGgKKyAgICAvLyBzUkdCIENvbG9yIFNwYWNlIGludG8gTGluZWFyIFJHQgorICAgIC8vIDE2IGJpdAogCi0gICAgLyoqIFRoZSBmYWN0b3IuICovCi0gICAgcHJpdmF0ZSBmbG9hdCBmRmFjdG9yOyAgICAgICAgICAgICAgIC8vIFNjYWxlIGZhY3RvcgorICAgIC8qKgorICAgICAqIFRoZSBMSU5FQSByXyByZyBiXyBsZW5ndGguCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgTElORUFSX1JHQl9MZW5ndGg7IC8vIExpbmVhciBSR0IgYml0IGxlbmd0aAogCi0gICAgLyoqIFRoZSBpc19zIHJnYi4gKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNfc1JHQjsgICAgICAgICAgICAgLy8gQ29sb3JNb2RlbCBoYXMgc1JHQiBDb2xvclNwYWNlICAKKyAgICAvKioKKyAgICAgKiBUaGUgZmFjdG9yLgorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgZkZhY3RvcjsgLy8gU2NhbGUgZmFjdG9yCiAKLSAgICAvKiogVGhlIGlzXyBsaW5lYSByXyByZ2IuICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzX0xJTkVBUl9SR0I7ICAgICAgIC8vIENvbG9yIE1vZGVsIGhhcyBMaW5lYXIgUkdCIENvbG9yIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTcGFjZSAKKyAgICAvKioKKyAgICAgKiBUaGUgaXNfcyByZ2IuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzX3NSR0I7IC8vIENvbG9yTW9kZWwgaGFzIHNSR0IgQ29sb3JTcGFjZQorCisgICAgLyoqCisgICAgICogVGhlIGlzXyBsaW5lYSByXyByZ2IuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzX0xJTkVBUl9SR0I7IC8vIENvbG9yIE1vZGVsIGhhcyBMaW5lYXIgUkdCIENvbG9yCisKKyAgICAvLyBTcGFjZQogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGNvbXBvbmVudCBjb2xvciBtb2RlbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sb3JTcGFjZSB0aGUgY29sb3Igc3BhY2UKLSAgICAgKiBAcGFyYW0gYml0cyB0aGUgYXJyYXkgb2YgY29tcG9uZW50IG1hc2tzCi0gICAgICogQHBhcmFtIGhhc0FscGhhIHdoZXRoZXIgdGhlIGNvbG9yIG1vZGVsIGhhcyBhbHBoYQotICAgICAqIEBwYXJhbSBpc0FscGhhUHJlbXVsdGlwbGllZCB3aGV0aGVyIHRoZSBhbHBoYSBpcyBwcmVtdWx0aXBsaWVkCi0gICAgICogQHBhcmFtIHRyYW5zcGFyZW5jeSB0aGUgdHJhbnNwYXJlbmN5IHN0cmF0ZWd5LCBAc2VlIGphdmEuYXd0LlRyYW5zcGFyZW5jeQotICAgICAqIEBwYXJhbSB0cmFuc2ZlclR5cGUgdGhlIHRyYW5zZmVyIHR5cGUgKHByaW1pdGl2ZSBqYXZhIHR5cGUgCi0gICAgICogdG8gdXNlIGZvciB0aGUgY29tcG9uZW50cykKKyAgICAgKiBAcGFyYW0gY29sb3JTcGFjZQorICAgICAqICAgICAgICAgICAgdGhlIGNvbG9yIHNwYWNlLgorICAgICAqIEBwYXJhbSBiaXRzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgY29tcG9uZW50IG1hc2tzLgorICAgICAqIEBwYXJhbSBoYXNBbHBoYQorICAgICAqICAgICAgICAgICAgd2hldGhlciB0aGUgY29sb3IgbW9kZWwgaGFzIGFscGhhLgorICAgICAqIEBwYXJhbSBpc0FscGhhUHJlbXVsdGlwbGllZAorICAgICAqICAgICAgICAgICAgd2hldGhlciB0aGUgYWxwaGEgaXMgcHJlLW11bHRpcGxpZWQuCisgICAgICogQHBhcmFtIHRyYW5zcGFyZW5jeQorICAgICAqICAgICAgICAgICAgdGhlIHRyYW5zcGFyZW5jeSBzdHJhdGVneSwgQHNlZSBqYXZhLmF3dC5UcmFuc3BhcmVuY3kuCisgICAgICogQHBhcmFtIHRyYW5zZmVyVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIHRyYW5zZmVyIHR5cGUgKHByaW1pdGl2ZSBqYXZhIHR5cGUgdG8gdXNlIGZvciB0aGUKKyAgICAgKiAgICAgICAgICAgIGNvbXBvbmVudHMpLgogICAgICAqLwotICAgICBwdWJsaWMgQ29tcG9uZW50Q29sb3JNb2RlbChDb2xvclNwYWNlIGNvbG9yU3BhY2UsIGludCBiaXRzW10sCi0gICAgICAgICAgICBib29sZWFuIGhhc0FscGhhLCBib29sZWFuIGlzQWxwaGFQcmVtdWx0aXBsaWVkLCBpbnQgdHJhbnNwYXJlbmN5LAotICAgICAgICAgICAgaW50IHRyYW5zZmVyVHlwZSkgewotICAgICAgICBzdXBlcihjcmVhdGVQaXhlbEJpdHMoY29sb3JTcGFjZSwgaGFzQWxwaGEsIHRyYW5zZmVyVHlwZSksCi0gICAgICAgICAgICAgICAgdmFsaWRhdGVCaXRzKGJpdHMsIGNvbG9yU3BhY2UsIGhhc0FscGhhLCB0cmFuc2ZlclR5cGUpLAotICAgICAgICAgICAgICAgIGNvbG9yU3BhY2UsIGhhc0FscGhhLCBpc0FscGhhUHJlbXVsdGlwbGllZCwgdHJhbnNwYXJlbmN5LAorICAgIHB1YmxpYyBDb21wb25lbnRDb2xvck1vZGVsKENvbG9yU3BhY2UgY29sb3JTcGFjZSwgaW50IGJpdHNbXSwgYm9vbGVhbiBoYXNBbHBoYSwKKyAgICAgICAgICAgIGJvb2xlYW4gaXNBbHBoYVByZW11bHRpcGxpZWQsIGludCB0cmFuc3BhcmVuY3ksIGludCB0cmFuc2ZlclR5cGUpIHsKKyAgICAgICAgc3VwZXIoY3JlYXRlUGl4ZWxCaXRzKGNvbG9yU3BhY2UsIGhhc0FscGhhLCB0cmFuc2ZlclR5cGUpLCB2YWxpZGF0ZUJpdHMoYml0cywgY29sb3JTcGFjZSwKKyAgICAgICAgICAgICAgICBoYXNBbHBoYSwgdHJhbnNmZXJUeXBlKSwgY29sb3JTcGFjZSwgaGFzQWxwaGEsIGlzQWxwaGFQcmVtdWx0aXBsaWVkLCB0cmFuc3BhcmVuY3ksCiAgICAgICAgICAgICAgICAgdHJhbnNmZXJUeXBlKTsKIAogICAgICAgICBuZWVkU2NhbGUgPSBmYWxzZTsKICAgICAgICAgc3dpdGNoICh0cmFuc2ZlclR5cGUpIHsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6Ci0gICAgICAgICAgICBzaWduZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGludGVncmFsID0gdHJ1ZTsKLSAgICAgICAgICAgIGRvbm90U3VwcG9ydFVubm9ybWFsaXplZCA9IGZhbHNlOwotICAgICAgICAgICAgc2NhbGVGYWN0b3JzID0gbmV3IGZsb2F0W251bUNvbXBvbmVudHNdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2xvckNvbXBvbmVudHM7IGkrKykgewotICAgICAgICAgICAgICAgIHNjYWxlRmFjdG9yc1tpXSA9IDEuMGYgLyBtYXhWYWx1ZXNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKGNzLmdldE1pblZhbHVlKGkpICE9IDAuMGYgfHwgY3MuZ2V0TWF4VmFsdWUoaSkgIT0gMS4wZikgewotICAgICAgICAgICAgICAgICAgICBkb25vdFN1cHBvcnRVbm5vcm1hbGl6ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChoYXNBbHBoYSkgewotICAgICAgICAgICAgICAgIG1heFZhbHVlc1tudW1Db2xvckNvbXBvbmVudHNdID0KLSAgICAgICAgICAgICAgICAgICAgKDEgPDwgYml0c1tudW1Db2xvckNvbXBvbmVudHNdKSAtIDE7Ci0gICAgICAgICAgICAgICAgc2NhbGVGYWN0b3JzW251bUNvbG9yQ29tcG9uZW50c10gPQotICAgICAgICAgICAgICAgICAgICAxLjBmIC8gbWF4VmFsdWVzW251bUNvbG9yQ29tcG9uZW50c107Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfU0hPUlQ6Ci0gICAgICAgICAgICBzaWduZWQgPSB0cnVlOwotICAgICAgICAgICAgaW50ZWdyYWwgPSB0cnVlOwotICAgICAgICAgICAgZG9ub3RTdXBwb3J0VW5ub3JtYWxpemVkID0gdHJ1ZTsKLSAgICAgICAgICAgIHNjYWxlRmFjdG9ycyA9IG5ldyBmbG9hdFtudW1Db21wb25lbnRzXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29tcG9uZW50czsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbWF4VmFsdWVzW2ldID0gU2hvcnQuTUFYX1ZBTFVFOwotICAgICAgICAgICAgICAgIHNjYWxlRmFjdG9yc1tpXSA9IDEuMGYgLyBtYXhWYWx1ZXNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKGNzLmdldE1pblZhbHVlKGkpICE9IDAuMGYgfHwgY3MuZ2V0TWF4VmFsdWUoaSkgIT0gMS4wZikgewotICAgICAgICAgICAgICAgICAgICBuZWVkU2NhbGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChuZWVkU2NhbGUpIHsKLSAgICAgICAgICAgICAgICBtaW5WYWxzID0gbmV3IGZsb2F0W251bUNvbG9yQ29tcG9uZW50c107Ci0gICAgICAgICAgICAgICAgcmFuZ2VzID0gbmV3IGZsb2F0W251bUNvbG9yQ29tcG9uZW50c107CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgorICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgorICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgorICAgICAgICAgICAgICAgIHNpZ25lZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGludGVncmFsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBkb25vdFN1cHBvcnRVbm5vcm1hbGl6ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBzY2FsZUZhY3RvcnMgPSBuZXcgZmxvYXRbbnVtQ29tcG9uZW50c107CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2xvckNvbXBvbmVudHM7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBtaW5WYWxzW2ldID0gY3MuZ2V0TWluVmFsdWUoaSk7Ci0gICAgICAgICAgICAgICAgICAgIHJhbmdlc1tpXSA9IGNzLmdldE1heFZhbHVlKGkpIC0gbWluVmFsc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgc2NhbGVGYWN0b3JzW2ldID0gMS4wZiAvIG1heFZhbHVlc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNzLmdldE1pblZhbHVlKGkpICE9IDAuMGYgfHwgY3MuZ2V0TWF4VmFsdWUoaSkgIT0gMS4wZikgeworICAgICAgICAgICAgICAgICAgICAgICAgZG9ub3RTdXBwb3J0VW5ub3JtYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9GTE9BVDoKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfRE9VQkxFOgotICAgICAgICAgICAgc2lnbmVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGludGVncmFsID0gZmFsc2U7Ci0gICAgICAgICAgICBkb25vdFN1cHBvcnRVbm5vcm1hbGl6ZWQgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvLyBhd3QuMjE1PXRyYW5zZmVyVHlwZSBpcyBub3Qgb25lIG9mIERhdGFCdWZmZXIuVFlQRV9CWVRFLAotICAgICAgICAgICAgLy8gICAgICAgICAgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVCwgRGF0YUJ1ZmZlci5UWVBFX0lOVCwKLSAgICAgICAgICAgIC8vICAgICAgICAgIERhdGFCdWZmZXIuVFlQRV9TSE9SVCwgRGF0YUJ1ZmZlci5UWVBFX0ZMT0FULCBvcgotICAgICAgICAgICAgLy8gICAgICAgICAgRGF0YUJ1ZmZlci5UWVBFX0RPVUJMRQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMTUiKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICBpZiAoaGFzQWxwaGEpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4VmFsdWVzW251bUNvbG9yQ29tcG9uZW50c10gPSAoMSA8PCBiaXRzW251bUNvbG9yQ29tcG9uZW50c10pIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgc2NhbGVGYWN0b3JzW251bUNvbG9yQ29tcG9uZW50c10gPSAxLjBmIC8gbWF4VmFsdWVzW251bUNvbG9yQ29tcG9uZW50c107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfU0hPUlQ6CisgICAgICAgICAgICAgICAgc2lnbmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpbnRlZ3JhbCA9IHRydWU7CisgICAgICAgICAgICAgICAgZG9ub3RTdXBwb3J0VW5ub3JtYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzY2FsZUZhY3RvcnMgPSBuZXcgZmxvYXRbbnVtQ29tcG9uZW50c107CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db21wb25lbnRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4VmFsdWVzW2ldID0gU2hvcnQuTUFYX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICBzY2FsZUZhY3RvcnNbaV0gPSAxLjBmIC8gbWF4VmFsdWVzW2ldOworICAgICAgICAgICAgICAgICAgICBpZiAoY3MuZ2V0TWluVmFsdWUoaSkgIT0gMC4wZiB8fCBjcy5nZXRNYXhWYWx1ZShpKSAhPSAxLjBmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZWVkU2NhbGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChuZWVkU2NhbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbWluVmFscyA9IG5ldyBmbG9hdFtudW1Db2xvckNvbXBvbmVudHNdOworICAgICAgICAgICAgICAgICAgICByYW5nZXMgPSBuZXcgZmxvYXRbbnVtQ29sb3JDb21wb25lbnRzXTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2xvckNvbXBvbmVudHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgbWluVmFsc1tpXSA9IGNzLmdldE1pblZhbHVlKGkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VzW2ldID0gY3MuZ2V0TWF4VmFsdWUoaSkgLSBtaW5WYWxzW2ldOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfRkxPQVQ6CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9ET1VCTEU6CisgICAgICAgICAgICAgICAgc2lnbmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpbnRlZ3JhbCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGRvbm90U3VwcG9ydFVubm9ybWFsaXplZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIGF3dC4yMTU9dHJhbnNmZXJUeXBlIGlzIG5vdCBvbmUgb2YgRGF0YUJ1ZmZlci5UWVBFX0JZVEUsCisgICAgICAgICAgICAgICAgLy8gRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVCwgRGF0YUJ1ZmZlci5UWVBFX0lOVCwKKyAgICAgICAgICAgICAgICAvLyBEYXRhQnVmZmVyLlRZUEVfU0hPUlQsIERhdGFCdWZmZXIuVFlQRV9GTE9BVCwgb3IKKyAgICAgICAgICAgICAgICAvLyBEYXRhQnVmZmVyLlRZUEVfRE9VQkxFCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMTUiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCiAgICAgICAgIG5lZWRBbHBoYURpdmlkZSA9IGhhc0FscGhhICYmIGlzQWxwaGFQcmVtdWx0aXBsaWVkOwpAQCAtMTgzLDM2ICsyMzIsNDAgQEAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgY29tcG9uZW50IGNvbG9yIG1vZGVsLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xvclNwYWNlIHRoZSBjb2xvciBzcGFjZQotICAgICAqIEBwYXJhbSBoYXNBbHBoYSB3aGV0aGVyIHRoZSBjb2xvciBtb2RlbCBoYXMgYWxwaGEKLSAgICAgKiBAcGFyYW0gaXNBbHBoYVByZW11bHRpcGxpZWQgd2hldGhlciB0aGUgYWxwaGEgaXMgcHJlbXVsdGlwbGllZAotICAgICAqIEBwYXJhbSB0cmFuc3BhcmVuY3kgdGhlIHRyYW5zcGFyZW5jeSBzdHJhdGVneSwgQHNlZSBqYXZhLmF3dC5UcmFuc3BhcmVuY3kKLSAgICAgKiBAcGFyYW0gdHJhbnNmZXJUeXBlIHRoZSB0cmFuc2ZlciB0eXBlIChwcmltaXRpdmUgamF2YSB0eXBlIAotICAgICAqIHRvIHVzZSBmb3IgdGhlIGNvbXBvbmVudHMpCisgICAgICogQHBhcmFtIGNvbG9yU3BhY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2xvciBzcGFjZS4KKyAgICAgKiBAcGFyYW0gaGFzQWxwaGEKKyAgICAgKiAgICAgICAgICAgIHdoZXRoZXIgdGhlIGNvbG9yIG1vZGVsIGhhcyBhbHBoYS4KKyAgICAgKiBAcGFyYW0gaXNBbHBoYVByZW11bHRpcGxpZWQKKyAgICAgKiAgICAgICAgICAgIHdoZXRoZXIgdGhlIGFscGhhIGlzIHByZS1tdWx0aXBsaWVkLgorICAgICAqIEBwYXJhbSB0cmFuc3BhcmVuY3kKKyAgICAgKiAgICAgICAgICAgIHRoZSB0cmFuc3BhcmVuY3kgc3RyYXRlZ3ksIEBzZWUgamF2YS5hd3QuVHJhbnNwYXJlbmN5LgorICAgICAqIEBwYXJhbSB0cmFuc2ZlclR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSB0cmFuc2ZlciB0eXBlIChwcmltaXRpdmUgamF2YSB0eXBlIHRvIHVzZSBmb3IgdGhlCisgICAgICogICAgICAgICAgICBjb21wb25lbnRzKS4KICAgICAgKi8KICAgICBwdWJsaWMgQ29tcG9uZW50Q29sb3JNb2RlbChDb2xvclNwYWNlIGNvbG9yU3BhY2UsIGJvb2xlYW4gaGFzQWxwaGEsCiAgICAgICAgICAgICBib29sZWFuIGlzQWxwaGFQcmVtdWx0aXBsaWVkLCBpbnQgdHJhbnNwYXJlbmN5LCBpbnQgdHJhbnNmZXJUeXBlKSB7Ci0gICAgICAgIAotICAgICAgICB0aGlzKGNvbG9yU3BhY2UsIAotICAgICAgICAgICAgICAgIGNyZWF0ZVBpeGVsQml0c0FycmF5KGNvbG9yU3BhY2UsIGhhc0FscGhhLCB0cmFuc2ZlclR5cGUpLCAKLSAgICAgICAgICAgICAgICBoYXNBbHBoYSwgCi0gICAgICAgICAgICAgICAgaXNBbHBoYVByZW11bHRpcGxpZWQsIAotICAgICAgICAgICAgICAgIHRyYW5zcGFyZW5jeSwKLSAgICAgICAgICAgICAgICB0cmFuc2ZlclR5cGUpOworCisgICAgICAgIHRoaXMoY29sb3JTcGFjZSwgY3JlYXRlUGl4ZWxCaXRzQXJyYXkoY29sb3JTcGFjZSwgaGFzQWxwaGEsIHRyYW5zZmVyVHlwZSksIGhhc0FscGhhLAorICAgICAgICAgICAgICAgIGlzQWxwaGFQcmVtdWx0aXBsaWVkLCB0cmFuc3BhcmVuY3ksIHRyYW5zZmVyVHlwZSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogVmFsaWRhdGUgYml0cy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYml0cyB0aGUgYml0cwotICAgICAqIEBwYXJhbSBjb2xvclNwYWNlIHRoZSBjb2xvciBzcGFjZQotICAgICAqIEBwYXJhbSBoYXNBbHBoYSB0aGUgaGFzIGFscGhhCi0gICAgICogQHBhcmFtIHRyYW5zZmVyVHlwZSB0aGUgdHJhbnNmZXIgdHlwZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGludFtdCisgICAgICogQHBhcmFtIGJpdHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBiaXRzLgorICAgICAqIEBwYXJhbSBjb2xvclNwYWNlCisgICAgICogICAgICAgICAgICB0aGUgY29sb3Igc3BhY2UuCisgICAgICogQHBhcmFtIGhhc0FscGhhCisgICAgICogICAgICAgICAgICB0aGUgaGFzIGFscGhhLgorICAgICAqIEBwYXJhbSB0cmFuc2ZlclR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSB0cmFuc2ZlciB0eXBlLgorICAgICAqIEByZXR1cm4gdGhlIGludFtdLgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGludFtdIHZhbGlkYXRlQml0cyhpbnQgYml0c1tdLCBDb2xvclNwYWNlIGNvbG9yU3BhY2UsCi0gICAgICAgICAgICBib29sZWFuIGhhc0FscGhhLCBpbnQgdHJhbnNmZXJUeXBlKSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50W10gdmFsaWRhdGVCaXRzKGludCBiaXRzW10sIENvbG9yU3BhY2UgY29sb3JTcGFjZSwgYm9vbGVhbiBoYXNBbHBoYSwKKyAgICAgICAgICAgIGludCB0cmFuc2ZlclR5cGUpIHsKICAgICAgICAgaWYgKGJpdHMgIT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIGJpdHM7CiAgICAgICAgIH0KQEAgLTIzNSwxNCArMjg4LDE1IEBACiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyB0aGUgcGl4ZWwgYml0cy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sb3JTcGFjZSB0aGUgY29sb3Igc3BhY2UKLSAgICAgKiBAcGFyYW0gaGFzQWxwaGEgdGhlIGhhcyBhbHBoYQotICAgICAqIEBwYXJhbSB0cmFuc2ZlclR5cGUgdGhlIHRyYW5zZmVyIHR5cGUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnQKKyAgICAgKiBAcGFyYW0gY29sb3JTcGFjZQorICAgICAqICAgICAgICAgICAgdGhlIGNvbG9yIHNwYWNlLgorICAgICAqIEBwYXJhbSBoYXNBbHBoYQorICAgICAqICAgICAgICAgICAgdGhlIGhhcyBhbHBoYS4KKyAgICAgKiBAcGFyYW0gdHJhbnNmZXJUeXBlCisgICAgICogICAgICAgICAgICB0aGUgdHJhbnNmZXIgdHlwZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnQuCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNyZWF0ZVBpeGVsQml0cyhDb2xvclNwYWNlIGNvbG9yU3BhY2UsIGJvb2xlYW4gaGFzQWxwaGEsCi0gICAgICAgICAgICBpbnQgdHJhbnNmZXJUeXBlKSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNyZWF0ZVBpeGVsQml0cyhDb2xvclNwYWNlIGNvbG9yU3BhY2UsIGJvb2xlYW4gaGFzQWxwaGEsIGludCB0cmFuc2ZlclR5cGUpIHsKICAgICAgICAgaW50IG51bUNvbXBvbmVudHMgPSBjb2xvclNwYWNlLmdldE51bUNvbXBvbmVudHMoKTsKICAgICAgICAgaWYgKGhhc0FscGhhKSB7CiAgICAgICAgICAgICBudW1Db21wb25lbnRzKys7CkBAIC0yNTQsMjIgKzMwOCwyNCBAQAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgdGhlIHBpeGVsIGJpdHMgYXJyYXkuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNvbG9yU3BhY2UgdGhlIGNvbG9yIHNwYWNlCi0gICAgICogQHBhcmFtIGhhc0FscGhhIHRoZSBoYXMgYWxwaGEKLSAgICAgKiBAcGFyYW0gdHJhbnNmZXJUeXBlIHRoZSB0cmFuc2ZlciB0eXBlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW50W10KKyAgICAgKiBAcGFyYW0gY29sb3JTcGFjZQorICAgICAqICAgICAgICAgICAgdGhlIGNvbG9yIHNwYWNlLgorICAgICAqIEBwYXJhbSBoYXNBbHBoYQorICAgICAqICAgICAgICAgICAgdGhlIGhhcyBhbHBoYS4KKyAgICAgKiBAcGFyYW0gdHJhbnNmZXJUeXBlCisgICAgICogICAgICAgICAgICB0aGUgdHJhbnNmZXIgdHlwZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnRbXS4KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBpbnRbXSBjcmVhdGVQaXhlbEJpdHNBcnJheShDb2xvclNwYWNlIGNvbG9yU3BhY2UsIAotICAgICAgICAgICAgYm9vbGVhbiBoYXNBbHBoYSwgaW50IHRyYW5zZmVyVHlwZSkgewotICAgICAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBpbnRbXSBjcmVhdGVQaXhlbEJpdHNBcnJheShDb2xvclNwYWNlIGNvbG9yU3BhY2UsIGJvb2xlYW4gaGFzQWxwaGEsCisgICAgICAgICAgICBpbnQgdHJhbnNmZXJUeXBlKSB7CisKICAgICAgICAgaW50IG51bUNvbXBvbmVudHMgPSBjb2xvclNwYWNlLmdldE51bUNvbXBvbmVudHMoKTsKICAgICAgICAgaWYgKGhhc0FscGhhKSB7CiAgICAgICAgICAgICBudW1Db21wb25lbnRzKys7CiAgICAgICAgIH0KIAogICAgICAgICBpbnQgYml0c1tdID0gbmV3IGludFtudW1Db21wb25lbnRzXTsKLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG51bUNvbXBvbmVudHM7IGkrKyl7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29tcG9uZW50czsgaSsrKSB7CiAgICAgICAgICAgICBiaXRzW2ldID0gRGF0YUJ1ZmZlci5nZXREYXRhVHlwZVNpemUodHJhbnNmZXJUeXBlKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gYml0czsKQEAgLTI3OCwyMTcgKzMzNCwyMDAgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgT2JqZWN0IGdldERhdGFFbGVtZW50cyhpbnQgY29tcG9uZW50c1tdLCBpbnQgb2Zmc2V0LCBPYmplY3Qgb2JqKSB7CiAgICAgICAgIGlmIChkb25vdFN1cHBvcnRVbm5vcm1hbGl6ZWQpIHsKLSAgICAgICAgICAgIC8vIGF3dC4yMTM9VGhpcyBDb21wb25lbnRDb2xvck1vZGVsIGRvZXMgbm90IHN1cHBvcnQgdGhlIHVubm9ybWFsaXplZCBmb3JtCisgICAgICAgICAgICAvLyBhd3QuMjEzPVRoaXMgQ29tcG9uZW50Q29sb3JNb2RlbCBkb2VzIG5vdCBzdXBwb3J0IHRoZQorICAgICAgICAgICAgLy8gdW5ub3JtYWxpemVkIGZvcm0KICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjEzIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAogICAgICAgICBpZiAob2Zmc2V0ICsgbnVtQ29tcG9uZW50cyA+IGNvbXBvbmVudHMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAvLyBhd3QuMjE2PVRoZSBjb21wb25lbnRzIGFycmF5IGlzIG5vdCBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbGwgdGhlIGNvbG9yIGFuZCBhbHBoYSBjb21wb25lbnRzCisgICAgICAgICAgICAvLyBhd3QuMjE2PVRoZSBjb21wb25lbnRzIGFycmF5IGlzIG5vdCBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbGwgdGhlCisgICAgICAgICAgICAvLyBjb2xvciBhbmQgYWxwaGEgY29tcG9uZW50cwogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMTYiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCiAgICAgICAgIHN3aXRjaCAodHJhbnNmZXJUeXBlKSB7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6Ci0gICAgICAgICAgICBieXRlIGJhW107Ci0gICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBiYSA9IG5ldyBieXRlW251bUNvbXBvbmVudHNdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBiYSA9IChieXRlW10pIG9iajsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBpZHggPSBvZmZzZXQ7IGkgPCBudW1Db21wb25lbnRzOyBpKyssIGlkeCsrKSB7Ci0gICAgICAgICAgICAgICAgYmFbaV0gPSAoYnl0ZSkgY29tcG9uZW50c1tpZHhdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGJhOwotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6Ci0gICAgICAgICAgICBzaG9ydCBzYVtdOwotICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2EgPSBuZXcgc2hvcnRbbnVtQ29tcG9uZW50c107Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNhID0gKHNob3J0W10pIG9iajsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBpZHggPSBvZmZzZXQ7IGkgPCBudW1Db21wb25lbnRzOyBpKyssIGlkeCsrKSB7Ci0gICAgICAgICAgICAgICAgc2FbaV0gPSAoc2hvcnQpIGNvbXBvbmVudHNbaWR4XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzYTsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgotICAgICAgICAgICAgaW50IGlhW107Ci0gICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpYSA9IG5ldyBpbnRbbnVtQ29tcG9uZW50c107Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlhID0gKGludFtdKSBvYmo7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gb2Zmc2V0OyBpIDwgbnVtQ29tcG9uZW50czsgaSsrLCBpZHgrKykgewotICAgICAgICAgICAgICAgIGlhW2ldID0gY29tcG9uZW50c1tpZHhdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGlhOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gYXd0LjIxNz1UaGUgdHJhbnNmZXIgdHlwZSBvZiB0aGlzIENvbXBvbmVudENvbG9yTW9kZWwgaXMgbm90IG9uZQotICAgICAgICAgICAgLy8gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB0cmFuc2ZlciB0eXBlczogRGF0YUJ1ZmZlci5UWVBFX0JZVEUsCi0gICAgICAgICAgICAvLyAgICAgICAgICBEYXRhQnVmZmVyLlRZUEVfVVNIT1JULCBvciBEYXRhQnVmZmVyLlRZUEVfSU5UCi0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMKLSAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygiYXd0LjIxNyIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKKyAgICAgICAgICAgICAgICBieXRlIGJhW107CisgICAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGJhID0gbmV3IGJ5dGVbbnVtQ29tcG9uZW50c107CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYmEgPSAoYnl0ZVtdKW9iajsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IG9mZnNldDsgaSA8IG51bUNvbXBvbmVudHM7IGkrKywgaWR4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgYmFbaV0gPSAoYnl0ZSljb21wb25lbnRzW2lkeF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBiYTsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKKyAgICAgICAgICAgICAgICBzaG9ydCBzYVtdOworICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzYSA9IG5ldyBzaG9ydFtudW1Db21wb25lbnRzXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzYSA9IChzaG9ydFtdKW9iajsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IG9mZnNldDsgaSA8IG51bUNvbXBvbmVudHM7IGkrKywgaWR4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgc2FbaV0gPSAoc2hvcnQpY29tcG9uZW50c1tpZHhdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gc2E7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6CisgICAgICAgICAgICAgICAgaW50IGlhW107CisgICAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlhID0gbmV3IGludFtudW1Db21wb25lbnRzXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpYSA9IChpbnRbXSlvYmo7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBpZHggPSBvZmZzZXQ7IGkgPCBudW1Db21wb25lbnRzOyBpKyssIGlkeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlhW2ldID0gY29tcG9uZW50c1tpZHhdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gaWE7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIGF3dC4yMTc9VGhlIHRyYW5zZmVyIHR5cGUgb2YgdGhpcyBDb21wb25lbnRDb2xvck1vZGVsIGlzIG5vdAorICAgICAgICAgICAgICAgIC8vIG9uZQorICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBmb2xsb3dpbmcgdHJhbnNmZXIgdHlwZXM6IERhdGFCdWZmZXIuVFlQRV9CWVRFLAorICAgICAgICAgICAgICAgIC8vIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQsIG9yIERhdGFCdWZmZXIuVFlQRV9JTlQKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjE3IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGdldERhdGFFbGVtZW50cyhmbG9hdCBub3JtQ29tcG9uZW50c1tdLCBpbnQgbm9ybU9mZnNldCwKLSAgICAgICAgICAgIE9iamVjdCBvYmopIHsKKyAgICBwdWJsaWMgT2JqZWN0IGdldERhdGFFbGVtZW50cyhmbG9hdCBub3JtQ29tcG9uZW50c1tdLCBpbnQgbm9ybU9mZnNldCwgT2JqZWN0IG9iaikgewogICAgICAgICBpZiAobmVlZFNjYWxlKSB7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gMDsgaSA8IG51bUNvbG9yQ29tcG9uZW50czsgaSsrLCBpZHgrKykgewotICAgICAgICAgICAgICAgIG5vcm1Db21wb25lbnRzW2lkeF0gPQotICAgICAgICAgICAgICAgICAgICAobm9ybUNvbXBvbmVudHNbaWR4XSAtIG1pblZhbHNbaV0pIC8gcmFuZ2VzW2ldOworICAgICAgICAgICAgICAgIG5vcm1Db21wb25lbnRzW2lkeF0gPSAobm9ybUNvbXBvbmVudHNbaWR4XSAtIG1pblZhbHNbaV0pIC8gcmFuZ2VzW2ldOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgc3dpdGNoICh0cmFuc2ZlclR5cGUpIHsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKLSAgICAgICAgICAgIGJ5dGUgYmFbXTsKLSAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJhID0gbmV3IGJ5dGVbbnVtQ29tcG9uZW50c107Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJhID0gKGJ5dGVbXSkgb2JqOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobmVlZEFscGhhRGl2aWRlKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgYWxwaGEgPSBub3JtQ29tcG9uZW50c1tub3JtT2Zmc2V0ICsgbnVtQ29sb3JDb21wb25lbnRzXTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gbm9ybU9mZnNldDsgaSA8IG51bUNvbG9yQ29tcG9uZW50czsKLSAgICAgICAgICAgICAgICAgICAgaSsrLCBpZHgrKykgewotICAgICAgICAgICAgICAgICAgICBiYVtpXSA9IChieXRlKSAobm9ybUNvbXBvbmVudHNbaWR4XSAqIGFscGhhICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhWYWx1ZXNbaV0gKyAwLjVmKTsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6CisgICAgICAgICAgICAgICAgYnl0ZSBiYVtdOworICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBiYSA9IG5ldyBieXRlW251bUNvbXBvbmVudHNdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJhID0gKGJ5dGVbXSlvYmo7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJhW251bUNvbG9yQ29tcG9uZW50c10gPQotICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgKG5vcm1Db21wb25lbnRzW25vcm1PZmZzZXQgKyBudW1Db2xvckNvbXBvbmVudHNdICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhWYWx1ZXNbbnVtQ29sb3JDb21wb25lbnRzXSArIDAuNWYpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gbm9ybU9mZnNldDsgaSA8IG51bUNvbXBvbmVudHM7Ci0gICAgICAgICAgICAgICAgICAgIGkrKywgaWR4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgYmFbaWR4XSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgKG5vcm1Db21wb25lbnRzW2lkeF0gKiBtYXhWYWx1ZXNbaV0gKyAwLjVmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYmE7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgotICAgICAgICAgICAgc2hvcnQgdXNhW107Ci0gICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB1c2EgPSBuZXcgc2hvcnRbbnVtQ29tcG9uZW50c107Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHVzYSA9IChzaG9ydFtdKSBvYmo7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChuZWVkQWxwaGFEaXZpZGUpIHsKLSAgICAgICAgICAgICAgICBmbG9hdCBhbHBoYSA9IG5vcm1Db21wb25lbnRzW25vcm1PZmZzZXQgKyBudW1Db2xvckNvbXBvbmVudHNdOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBpZHggPSAwOyBpIDwgbnVtQ29sb3JDb21wb25lbnRzOyBpKyssIGlkeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVzYVtpXSA9IChzaG9ydCkgKG5vcm1Db21wb25lbnRzW2lkeF0gKiBhbHBoYSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4VmFsdWVzW2ldICsgMC41Zik7CisgICAgICAgICAgICAgICAgaWYgKG5lZWRBbHBoYURpdmlkZSkgeworICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbHBoYSA9IG5vcm1Db21wb25lbnRzW25vcm1PZmZzZXQgKyBudW1Db2xvckNvbXBvbmVudHNdOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gbm9ybU9mZnNldDsgaSA8IG51bUNvbG9yQ29tcG9uZW50czsgaSsrLCBpZHgrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgYmFbaV0gPSAoYnl0ZSkobm9ybUNvbXBvbmVudHNbaWR4XSAqIGFscGhhICogbWF4VmFsdWVzW2ldICsgMC41Zik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYmFbbnVtQ29sb3JDb21wb25lbnRzXSA9IChieXRlKShub3JtQ29tcG9uZW50c1tub3JtT2Zmc2V0ICsgbnVtQ29sb3JDb21wb25lbnRzXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbWF4VmFsdWVzW251bUNvbG9yQ29tcG9uZW50c10gKyAwLjVmKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gbm9ybU9mZnNldDsgaSA8IG51bUNvbXBvbmVudHM7IGkrKywgaWR4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhW2lkeF0gPSAoYnl0ZSkobm9ybUNvbXBvbmVudHNbaWR4XSAqIG1heFZhbHVlc1tpXSArIDAuNWYpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHVzYVtudW1Db2xvckNvbXBvbmVudHNdID0gKHNob3J0KSAoYWxwaGEgKgotICAgICAgICAgICAgICAgICAgICAgICAgbWF4VmFsdWVzW251bUNvbG9yQ29tcG9uZW50c10gKyAwLjVmKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IG5vcm1PZmZzZXQ7IGkgPCBudW1Db21wb25lbnRzOwotICAgICAgICAgICAgICAgICAgICBpKyssIGlkeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVzYVtpXSA9IChzaG9ydCkgKG5vcm1Db21wb25lbnRzW2lkeF0gKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFZhbHVlc1tpXSArIDAuNWYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB1c2E7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJhOwogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKLSAgICAgICAgICAgIGludCBpYVtdOwotICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWEgPSBuZXcgaW50W251bUNvbXBvbmVudHNdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpYSA9IChpbnRbXSkgb2JqOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobmVlZEFscGhhRGl2aWRlKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgYWxwaGEgPSBub3JtQ29tcG9uZW50c1tub3JtT2Zmc2V0ICsgbnVtQ29sb3JDb21wb25lbnRzXTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gMDsgaSA8IG51bUNvbG9yQ29tcG9uZW50czsgaSsrLCBpZHgrKykgewotICAgICAgICAgICAgICAgICAgICBpYVtpXSA9IChpbnQpIChub3JtQ29tcG9uZW50c1tpZHhdICogYWxwaGEgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFZhbHVlc1tpXSArIDAuNWYpOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgorICAgICAgICAgICAgICAgIHNob3J0IHVzYVtdOworICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB1c2EgPSBuZXcgc2hvcnRbbnVtQ29tcG9uZW50c107CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdXNhID0gKHNob3J0W10pb2JqOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpYVtudW1Db2xvckNvbXBvbmVudHNdID0gKGludCkgKGFscGhhICoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heFZhbHVlc1tudW1Db2xvckNvbXBvbmVudHNdICsgMC41Zik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBpZHggPSBub3JtT2Zmc2V0OyBpIDwgbnVtQ29tcG9uZW50czsKLSAgICAgICAgICAgICAgICAgICAgaSsrLCBpZHgrKykgewotICAgICAgICAgICAgICAgICAgICBpYVtpXSA9IChpbnQpIChub3JtQ29tcG9uZW50c1tpZHhdICogbWF4VmFsdWVzW2ldICsgMC41Zik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGlhOwogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1NIT1JUOgotICAgICAgICAgICAgc2hvcnQgc2FbXTsKLSAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNhID0gbmV3IHNob3J0W251bUNvbXBvbmVudHNdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzYSA9IChzaG9ydFtdKSBvYmo7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChuZWVkQWxwaGFEaXZpZGUpIHsKLSAgICAgICAgICAgICAgICBmbG9hdCBhbHBoYSA9IG5vcm1Db21wb25lbnRzW25vcm1PZmZzZXQgKyBudW1Db2xvckNvbXBvbmVudHNdOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBpZHggPSAwOyBpIDwgbnVtQ29sb3JDb21wb25lbnRzOyBpKyssIGlkeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNhW2ldID0gKHNob3J0KSAobm9ybUNvbXBvbmVudHNbaWR4XSAqIGFscGhhICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhWYWx1ZXNbaV0gKyAwLjVmKTsKKyAgICAgICAgICAgICAgICBpZiAobmVlZEFscGhhRGl2aWRlKSB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFscGhhID0gbm9ybUNvbXBvbmVudHNbbm9ybU9mZnNldCArIG51bUNvbG9yQ29tcG9uZW50c107CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBpZHggPSAwOyBpIDwgbnVtQ29sb3JDb21wb25lbnRzOyBpKyssIGlkeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1c2FbaV0gPSAoc2hvcnQpKG5vcm1Db21wb25lbnRzW2lkeF0gKiBhbHBoYSAqIG1heFZhbHVlc1tpXSArIDAuNWYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHVzYVtudW1Db2xvckNvbXBvbmVudHNdID0gKHNob3J0KShhbHBoYSAqIG1heFZhbHVlc1tudW1Db2xvckNvbXBvbmVudHNdICsgMC41Zik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IG5vcm1PZmZzZXQ7IGkgPCBudW1Db21wb25lbnRzOyBpKyssIGlkeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1c2FbaV0gPSAoc2hvcnQpKG5vcm1Db21wb25lbnRzW2lkeF0gKiBtYXhWYWx1ZXNbaV0gKyAwLjVmKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzYVtudW1Db2xvckNvbXBvbmVudHNdID0gKHNob3J0KSAoYWxwaGEgKgotICAgICAgICAgICAgICAgICAgICAgICAgbWF4VmFsdWVzW251bUNvbG9yQ29tcG9uZW50c10gKyAwLjVmKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IG5vcm1PZmZzZXQ7IGkgPCBudW1Db21wb25lbnRzOwotICAgICAgICAgICAgICAgICAgICBpKyssIGlkeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNhW2ldID0gKHNob3J0KSAobm9ybUNvbXBvbmVudHNbaWR4XSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4VmFsdWVzW2ldICsgMC41Zik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHNhOworICAgICAgICAgICAgICAgIHJldHVybiB1c2E7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfRkxPQVQ6Ci0gICAgICAgICAgICBmbG9hdCBmYVtdOwotICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmEgPSBuZXcgZmxvYXRbbnVtQ29tcG9uZW50c107Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZhID0gKGZsb2F0W10pIG9iajsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG5lZWRBbHBoYURpdmlkZSkgewotICAgICAgICAgICAgICAgIGZsb2F0IGFscGhhID0gbm9ybUNvbXBvbmVudHNbbm9ybU9mZnNldCArIG51bUNvbG9yQ29tcG9uZW50c107Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IDA7IGkgPCBudW1Db2xvckNvbXBvbmVudHM7IGkrKywgaWR4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgZmFbaV0gPSBub3JtQ29tcG9uZW50c1tpZHhdICogYWxwaGE7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6CisgICAgICAgICAgICAgICAgaW50IGlhW107CisgICAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlhID0gbmV3IGludFtudW1Db21wb25lbnRzXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpYSA9IChpbnRbXSlvYmo7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZhW251bUNvbG9yQ29tcG9uZW50c10gPSBhbHBoYTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IG5vcm1PZmZzZXQ7IGkgPCBudW1Db21wb25lbnRzOwotICAgICAgICAgICAgICAgICAgICBpKyssIGlkeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhW2ldID0gbm9ybUNvbXBvbmVudHNbaWR4XTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmE7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfRE9VQkxFOgotICAgICAgICAgICAgZG91YmxlIGRhW107Ci0gICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkYSA9IG5ldyBkb3VibGVbbnVtQ29tcG9uZW50c107Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRhID0gKGRvdWJsZVtdKSBvYmo7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChuZWVkQWxwaGFEaXZpZGUpIHsKLSAgICAgICAgICAgICAgICBkb3VibGUgYWxwaGEgPSBub3JtQ29tcG9uZW50c1tub3JtT2Zmc2V0ICsgbnVtQ29sb3JDb21wb25lbnRzXTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gMDsgaSA8IG51bUNvbG9yQ29tcG9uZW50czsgaSsrLCBpZHgrKykgewotICAgICAgICAgICAgICAgICAgICBkYVtpXSA9IG5vcm1Db21wb25lbnRzW2lkeF0gKiBhbHBoYTsKKyAgICAgICAgICAgICAgICBpZiAobmVlZEFscGhhRGl2aWRlKSB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFscGhhID0gbm9ybUNvbXBvbmVudHNbbm9ybU9mZnNldCArIG51bUNvbG9yQ29tcG9uZW50c107CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBpZHggPSAwOyBpIDwgbnVtQ29sb3JDb21wb25lbnRzOyBpKyssIGlkeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpYVtpXSA9IChpbnQpKG5vcm1Db21wb25lbnRzW2lkeF0gKiBhbHBoYSAqIG1heFZhbHVlc1tpXSArIDAuNWYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlhW251bUNvbG9yQ29tcG9uZW50c10gPSAoaW50KShhbHBoYSAqIG1heFZhbHVlc1tudW1Db2xvckNvbXBvbmVudHNdICsgMC41Zik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IG5vcm1PZmZzZXQ7IGkgPCBudW1Db21wb25lbnRzOyBpKyssIGlkeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpYVtpXSA9IChpbnQpKG5vcm1Db21wb25lbnRzW2lkeF0gKiBtYXhWYWx1ZXNbaV0gKyAwLjVmKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkYVtudW1Db2xvckNvbXBvbmVudHNdID0gYWxwaGE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBpZHggPSBub3JtT2Zmc2V0OyBpIDwgbnVtQ29tcG9uZW50czsKLSAgICAgICAgICAgICAgICAgICAgaSsrLCBpZHgrKykgewotICAgICAgICAgICAgICAgICAgICBkYVtpXSA9IG5vcm1Db21wb25lbnRzW2lkeF07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGRhOworICAgICAgICAgICAgICAgIHJldHVybiBpYTsKIAotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gYXd0LjIxMz1UaGlzIENvbXBvbmVudENvbG9yTW9kZWwgZG9lcyBub3Qgc3VwcG9ydCB0aGUgdW5ub3JtYWxpemVkIGZvcm0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjEzIikpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9TSE9SVDoKKyAgICAgICAgICAgICAgICBzaG9ydCBzYVtdOworICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzYSA9IG5ldyBzaG9ydFtudW1Db21wb25lbnRzXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzYSA9IChzaG9ydFtdKW9iajsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobmVlZEFscGhhRGl2aWRlKSB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFscGhhID0gbm9ybUNvbXBvbmVudHNbbm9ybU9mZnNldCArIG51bUNvbG9yQ29tcG9uZW50c107CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBpZHggPSAwOyBpIDwgbnVtQ29sb3JDb21wb25lbnRzOyBpKyssIGlkeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYVtpXSA9IChzaG9ydCkobm9ybUNvbXBvbmVudHNbaWR4XSAqIGFscGhhICogbWF4VmFsdWVzW2ldICsgMC41Zik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2FbbnVtQ29sb3JDb21wb25lbnRzXSA9IChzaG9ydCkoYWxwaGEgKiBtYXhWYWx1ZXNbbnVtQ29sb3JDb21wb25lbnRzXSArIDAuNWYpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBpZHggPSBub3JtT2Zmc2V0OyBpIDwgbnVtQ29tcG9uZW50czsgaSsrLCBpZHgrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgc2FbaV0gPSAoc2hvcnQpKG5vcm1Db21wb25lbnRzW2lkeF0gKiBtYXhWYWx1ZXNbaV0gKyAwLjVmKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gc2E7CisKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0ZMT0FUOgorICAgICAgICAgICAgICAgIGZsb2F0IGZhW107CisgICAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZhID0gbmV3IGZsb2F0W251bUNvbXBvbmVudHNdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZhID0gKGZsb2F0W10pb2JqOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChuZWVkQWxwaGFEaXZpZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgYWxwaGEgPSBub3JtQ29tcG9uZW50c1tub3JtT2Zmc2V0ICsgbnVtQ29sb3JDb21wb25lbnRzXTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IDA7IGkgPCBudW1Db2xvckNvbXBvbmVudHM7IGkrKywgaWR4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhW2ldID0gbm9ybUNvbXBvbmVudHNbaWR4XSAqIGFscGhhOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZhW251bUNvbG9yQ29tcG9uZW50c10gPSBhbHBoYTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gbm9ybU9mZnNldDsgaSA8IG51bUNvbXBvbmVudHM7IGkrKywgaWR4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhW2ldID0gbm9ybUNvbXBvbmVudHNbaWR4XTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmE7CisKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0RPVUJMRToKKyAgICAgICAgICAgICAgICBkb3VibGUgZGFbXTsKKyAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZGEgPSBuZXcgZG91YmxlW251bUNvbXBvbmVudHNdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRhID0gKGRvdWJsZVtdKW9iajsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobmVlZEFscGhhRGl2aWRlKSB7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhbHBoYSA9IG5vcm1Db21wb25lbnRzW25vcm1PZmZzZXQgKyBudW1Db2xvckNvbXBvbmVudHNdOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gMDsgaSA8IG51bUNvbG9yQ29tcG9uZW50czsgaSsrLCBpZHgrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgZGFbaV0gPSBub3JtQ29tcG9uZW50c1tpZHhdICogYWxwaGE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGFbbnVtQ29sb3JDb21wb25lbnRzXSA9IGFscGhhOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBpZHggPSBub3JtT2Zmc2V0OyBpIDwgbnVtQ29tcG9uZW50czsgaSsrLCBpZHgrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgZGFbaV0gPSBub3JtQ29tcG9uZW50c1tpZHhdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBkYTsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyBhd3QuMjEzPVRoaXMgQ29tcG9uZW50Q29sb3JNb2RlbCBkb2VzIG5vdCBzdXBwb3J0IHRoZQorICAgICAgICAgICAgICAgIC8vIHVubm9ybWFsaXplZCBmb3JtCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMTMiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogICAgIH0KIApAQCAtNTQ0LDcgKzU4Myw3IEBACiAgICAgICAgICAgICAgICAgbm9ybUNvbXBbbnVtQ29sb3JDb21wb25lbnRzXSA9IG5vcm1BbHBoYTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZihoYXNBbHBoYSAmJiBpc0FscGhhUHJlbXVsdGlwbGllZCl7CisgICAgICAgIGlmIChoYXNBbHBoYSAmJiBpc0FscGhhUHJlbXVsdGlwbGllZCkgewogICAgICAgICAgICAgbm9ybUNvbXBbMF0gKj0gbm9ybUNvbXBbbnVtQ29sb3JDb21wb25lbnRzXTsKICAgICAgICAgICAgIG5vcm1Db21wWzFdICo9IG5vcm1Db21wW251bUNvbG9yQ29tcG9uZW50c107CiAgICAgICAgICAgICBub3JtQ29tcFsyXSAqPSBub3JtQ29tcFtudW1Db2xvckNvbXBvbmVudHNdOwpAQCAtNTU1LDcgKzU5NCw3IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgV3JpdGFibGVSYXN0ZXIgZ2V0QWxwaGFSYXN0ZXIoV3JpdGFibGVSYXN0ZXIgcmFzdGVyKSB7Ci0gICAgICAgIGlmKCFoYXNBbHBoYSkgeworICAgICAgICBpZiAoIWhhc0FscGhhKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogCkBAIC01NjQsMTMgKzYwMywxMiBAQAogICAgICAgICBpbnQgYmFuZExpc3RbXSA9IG5ldyBpbnRbMV07CiAgICAgICAgIGJhbmRMaXN0WzBdID0gcmFzdGVyLmdldE51bUJhbmRzKCkgLSAxOwogCi0gICAgICAgIHJldHVybiByYXN0ZXIuY3JlYXRlV3JpdGFibGVDaGlsZCh4LCB5LCByYXN0ZXIuZ2V0V2lkdGgoKSwKLSAgICAgICAgICAgICAgICByYXN0ZXIuZ2V0SGVpZ2h0KCksIHgsIHksIGJhbmRMaXN0KTsKKyAgICAgICAgcmV0dXJuIHJhc3Rlci5jcmVhdGVXcml0YWJsZUNoaWxkKHgsIHksIHJhc3Rlci5nZXRXaWR0aCgpLCByYXN0ZXIuZ2V0SGVpZ2h0KCksIHgsIHksCisgICAgICAgICAgICAgICAgYmFuZExpc3QpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDb2xvck1vZGVsIGNvZXJjZURhdGEoV3JpdGFibGVSYXN0ZXIgcmFzdGVyLAotICAgICAgICAgICAgYm9vbGVhbiBpc0FscGhhUHJlbXVsdGlwbGllZCkgeworICAgIHB1YmxpYyBDb2xvck1vZGVsIGNvZXJjZURhdGEoV3JpdGFibGVSYXN0ZXIgcmFzdGVyLCBib29sZWFuIGlzQWxwaGFQcmVtdWx0aXBsaWVkKSB7CiAgICAgICAgIGlmICghaGFzQWxwaGEgfHwgdGhpcy5pc0FscGhhUHJlbXVsdGlwbGllZCA9PSBpc0FscGhhUHJlbXVsdGlwbGllZCkgewogICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KQEAgLTU4MiwzMzMgKzYyMCwzMTEgQEAKIAogICAgICAgICBpZiAoaXNBbHBoYVByZW11bHRpcGxpZWQpIHsKICAgICAgICAgICAgIHN3aXRjaCAodHJhbnNmZXJUeXBlKSB7Ci0gICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgotICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgotICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgotICAgICAgICAgICAgICAgIGZsb2F0IGFscGhhRmFjdG9yID0gbWF4VmFsdWVzW251bUNvbG9yQ29tcG9uZW50c107Ci0gICAgICAgICAgICAgICAgaW50IGlDb21wb25lbnRzW10gPSBudWxsOwotICAgICAgICAgICAgICAgIGludCBpVHJhbnNwYXJlbnRDb21wb25lbnRzW10gPSBuZXcgaW50W251bUNvbXBvbmVudHNdOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaDsgaSsrLCBtaW5ZKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDAsIHggPSBtaW5YOyBqIDwgdzsgaisrLCB4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlDb21wb25lbnRzID0gcmFzdGVyLmdldFBpeGVsKHgsIG1pblksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDb21wb25lbnRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpQ29tcG9uZW50c1tudW1Db2xvckNvbXBvbmVudHNdID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXN0ZXIuc2V0UGl4ZWwoeCwgbWluWSwgaVRyYW5zcGFyZW50Q29tcG9uZW50cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFscGhhID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUNvbXBvbmVudHNbbnVtQ29sb3JDb21wb25lbnRzXSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUZhY3RvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IG51bUNvbG9yQ29tcG9uZW50czsgbisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDb21wb25lbnRzW25dID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIChhbHBoYSAqIGlDb21wb25lbnRzW25dICsgMC41Zik7CisgICAgICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKKyAgICAgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6CisgICAgICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgorICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbHBoYUZhY3RvciA9IG1heFZhbHVlc1tudW1Db2xvckNvbXBvbmVudHNdOworICAgICAgICAgICAgICAgICAgICBpbnQgaUNvbXBvbmVudHNbXSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGludCBpVHJhbnNwYXJlbnRDb21wb25lbnRzW10gPSBuZXcgaW50W251bUNvbXBvbmVudHNdOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGg7IGkrKywgbWluWSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMCwgeCA9IG1pblg7IGogPCB3OyBqKyssIHgrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDb21wb25lbnRzID0gcmFzdGVyLmdldFBpeGVsKHgsIG1pblksIGlDb21wb25lbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaUNvbXBvbmVudHNbbnVtQ29sb3JDb21wb25lbnRzXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhc3Rlci5zZXRQaXhlbCh4LCBtaW5ZLCBpVHJhbnNwYXJlbnRDb21wb25lbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbHBoYSA9IGlDb21wb25lbnRzW251bUNvbG9yQ29tcG9uZW50c10gLyBhbHBoYUZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBudW1Db2xvckNvbXBvbmVudHM7IG4rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUNvbXBvbmVudHNbbl0gPSAoaW50KShhbHBoYSAqIGlDb21wb25lbnRzW25dICsgMC41Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFzdGVyLnNldFBpeGVsKHgsIG1pblksIGlDb21wb25lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFzdGVyLnNldFBpeGVsKHgsIG1pblksIGlDb21wb25lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9TSE9SVDoKLSAgICAgICAgICAgICAgICBmbG9hdCBzQWxwaGFGYWN0b3IgPSBtYXhWYWx1ZXNbbnVtQ29sb3JDb21wb25lbnRzXTsKLSAgICAgICAgICAgICAgICBzaG9ydCBzQ29tcG9uZW50c1tdID0gbnVsbDsKLSAgICAgICAgICAgICAgICBzaG9ydCBzVHJhbnNwYXJlbnRDb21wb25lbnRzW10gPSBuZXcgc2hvcnRbbnVtQ29tcG9uZW50c107Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoOyBpKyssIG1pblkrKykgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMCwgeCA9IG1pblg7IGogPCB3OyBqKyssIHgrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgc0NvbXBvbmVudHMgPSAoc2hvcnRbXSkgcmFzdGVyLmdldERhdGFFbGVtZW50cyh4LCBtaW5ZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQ29tcG9uZW50cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc0NvbXBvbmVudHNbbnVtQ29sb3JDb21wb25lbnRzXSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFzdGVyLnNldERhdGFFbGVtZW50cyh4LCBtaW5ZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1RyYW5zcGFyZW50Q29tcG9uZW50cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFscGhhID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0NvbXBvbmVudHNbbnVtQ29sb3JDb21wb25lbnRzXSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNBbHBoYUZhY3RvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IG51bUNvbG9yQ29tcG9uZW50czsgbisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDb21wb25lbnRzW25dID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChieXRlKSAoYWxwaGEgKiBzQ29tcG9uZW50c1tuXSArIDAuNWYpOworICAgICAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1NIT1JUOgorICAgICAgICAgICAgICAgICAgICBmbG9hdCBzQWxwaGFGYWN0b3IgPSBtYXhWYWx1ZXNbbnVtQ29sb3JDb21wb25lbnRzXTsKKyAgICAgICAgICAgICAgICAgICAgc2hvcnQgc0NvbXBvbmVudHNbXSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHNob3J0IHNUcmFuc3BhcmVudENvbXBvbmVudHNbXSA9IG5ldyBzaG9ydFtudW1Db21wb25lbnRzXTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoOyBpKyssIG1pblkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDAsIHggPSBtaW5YOyBqIDwgdzsgaisrLCB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQ29tcG9uZW50cyA9IChzaG9ydFtdKXJhc3Rlci5nZXREYXRhRWxlbWVudHMoeCwgbWluWSwgc0NvbXBvbmVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzQ29tcG9uZW50c1tudW1Db2xvckNvbXBvbmVudHNdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFzdGVyLnNldERhdGFFbGVtZW50cyh4LCBtaW5ZLCBzVHJhbnNwYXJlbnRDb21wb25lbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbHBoYSA9IHNDb21wb25lbnRzW251bUNvbG9yQ29tcG9uZW50c10gLyBzQWxwaGFGYWN0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtQ29sb3JDb21wb25lbnRzOyBuKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDb21wb25lbnRzW25dID0gKGJ5dGUpKGFscGhhICogc0NvbXBvbmVudHNbbl0gKyAwLjVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXN0ZXIuc2V0RGF0YUVsZW1lbnRzKHgsIG1pblksIHNDb21wb25lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFzdGVyLnNldERhdGFFbGVtZW50cyh4LCBtaW5ZLCBzQ29tcG9uZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfRkxPQVQ6Ci0gICAgICAgICAgICAgICAgZmxvYXQgZkNvbXBvbmVudHNbXSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgZmxvYXQgZlRyYW5zcGFyZW50Q29tcG9uZW50c1tdID0gbmV3IGZsb2F0W251bUNvbXBvbmVudHNdOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaDsgaSsrLCBtaW5ZKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDAsIHggPSBtaW5YOyBqIDwgdzsgaisrLCB4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZDb21wb25lbnRzID0gcmFzdGVyLmdldFBpeGVsKHgsIG1pblksIGZDb21wb25lbnRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmQ29tcG9uZW50c1tudW1Db2xvckNvbXBvbmVudHNdID09IDAuMGYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXN0ZXIuc2V0RGF0YUVsZW1lbnRzKHgsIG1pblksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmVHJhbnNwYXJlbnRDb21wb25lbnRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYWxwaGEgPSBmQ29tcG9uZW50c1tudW1Db2xvckNvbXBvbmVudHNdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtQ29sb3JDb21wb25lbnRzOyBuKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkNvbXBvbmVudHNbbl0gPSBmQ29tcG9uZW50c1tuXSAqIGFscGhhOworICAgICAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0ZMT0FUOgorICAgICAgICAgICAgICAgICAgICBmbG9hdCBmQ29tcG9uZW50c1tdID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgZlRyYW5zcGFyZW50Q29tcG9uZW50c1tdID0gbmV3IGZsb2F0W251bUNvbXBvbmVudHNdOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGg7IGkrKywgbWluWSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMCwgeCA9IG1pblg7IGogPCB3OyBqKyssIHgrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZDb21wb25lbnRzID0gcmFzdGVyLmdldFBpeGVsKHgsIG1pblksIGZDb21wb25lbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZkNvbXBvbmVudHNbbnVtQ29sb3JDb21wb25lbnRzXSA9PSAwLjBmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhc3Rlci5zZXREYXRhRWxlbWVudHMoeCwgbWluWSwgZlRyYW5zcGFyZW50Q29tcG9uZW50cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYWxwaGEgPSBmQ29tcG9uZW50c1tudW1Db2xvckNvbXBvbmVudHNdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IG51bUNvbG9yQ29tcG9uZW50czsgbisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQ29tcG9uZW50c1tuXSA9IGZDb21wb25lbnRzW25dICogYWxwaGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFzdGVyLnNldFBpeGVsKHgsIG1pblksIGZDb21wb25lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFzdGVyLnNldFBpeGVsKHgsIG1pblksIGZDb21wb25lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICAgICAgZG91YmxlIGRDb21wb25lbnRzW10gPSBudWxsOwotICAgICAgICAgICAgICAgIGRvdWJsZSBkVHJhbnNwYXJlbnRDb21wb25lbnRzW10gPSBuZXcgZG91YmxlW251bUNvbXBvbmVudHNdOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaDsgaSsrLCBtaW5ZKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDAsIHggPSBtaW5YOyBqIDwgdzsgaisrLCB4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRDb21wb25lbnRzID0gcmFzdGVyLmdldFBpeGVsKHgsIG1pblksIGRDb21wb25lbnRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkQ29tcG9uZW50c1tudW1Db2xvckNvbXBvbmVudHNdID09IDAuMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhc3Rlci5zZXRQaXhlbCh4LCBtaW5ZLCBkVHJhbnNwYXJlbnRDb21wb25lbnRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFscGhhID0gZENvbXBvbmVudHNbbnVtQ29sb3JDb21wb25lbnRzXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IG51bUNvbG9yQ29tcG9uZW50czsgbisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRDb21wb25lbnRzW25dID0gZENvbXBvbmVudHNbbl0gKiBhbHBoYTsKKyAgICAgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9ET1VCTEU6CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkQ29tcG9uZW50c1tdID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRUcmFuc3BhcmVudENvbXBvbmVudHNbXSA9IG5ldyBkb3VibGVbbnVtQ29tcG9uZW50c107CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaDsgaSsrLCBtaW5ZKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwLCB4ID0gbWluWDsgaiA8IHc7IGorKywgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZENvbXBvbmVudHMgPSByYXN0ZXIuZ2V0UGl4ZWwoeCwgbWluWSwgZENvbXBvbmVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkQ29tcG9uZW50c1tudW1Db2xvckNvbXBvbmVudHNdID09IDAuMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXN0ZXIuc2V0UGl4ZWwoeCwgbWluWSwgZFRyYW5zcGFyZW50Q29tcG9uZW50cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFscGhhID0gZENvbXBvbmVudHNbbnVtQ29sb3JDb21wb25lbnRzXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBudW1Db2xvckNvbXBvbmVudHM7IG4rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZENvbXBvbmVudHNbbl0gPSBkQ29tcG9uZW50c1tuXSAqIGFscGhhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhc3Rlci5zZXRQaXhlbCh4LCBtaW5ZLCBkQ29tcG9uZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhc3Rlci5zZXRQaXhlbCh4LCBtaW5ZLCBkQ29tcG9uZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAvLyBhd3QuMjE5PVRoaXMgdHJhbnNmZXJUeXBlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBjb2xvciBtb2RlbAotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMTkiKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAvLyBhd3QuMjE5PVRoaXMgdHJhbnNmZXJUeXBlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBjb2xvcgorICAgICAgICAgICAgICAgICAgICAvLyBtb2RlbAorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjE5IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzd2l0Y2ggKHRyYW5zZmVyVHlwZSkgewotICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKLSAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKLSAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKLSAgICAgICAgICAgICAgICBmbG9hdCBhbHBoYUZhY3RvciA9IG1heFZhbHVlc1tudW1Db2xvckNvbXBvbmVudHNdOwotICAgICAgICAgICAgICAgIGludCBpQ29tcG9uZW50c1tdID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpbnQgaVRyYW5zcGFyZW50Q29tcG9uZW50c1tdID0gbmV3IGludFtudW1Db21wb25lbnRzXTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGg7IGkrKywgbWluWSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwLCB4ID0gbWluWDsgaiA8IHc7IGorKywgeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpQ29tcG9uZW50cyA9IHJhc3Rlci5nZXRQaXhlbCh4LCBtaW5ZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ29tcG9uZW50cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaUNvbXBvbmVudHNbbnVtQ29sb3JDb21wb25lbnRzXSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFzdGVyLnNldFBpeGVsKHgsIG1pblksIGlUcmFuc3BhcmVudENvbXBvbmVudHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbHBoYSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDb21wb25lbnRzW251bUNvbG9yQ29tcG9uZW50c10gLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFGYWN0b3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBudW1Db2xvckNvbXBvbmVudHM7IG4rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ29tcG9uZW50c1tuXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAoaUNvbXBvbmVudHNbbl0gLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSArIDAuNWYpOworICAgICAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6CisgICAgICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgorICAgICAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgYWxwaGFGYWN0b3IgPSBtYXhWYWx1ZXNbbnVtQ29sb3JDb21wb25lbnRzXTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGlDb21wb25lbnRzW10gPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpbnQgaVRyYW5zcGFyZW50Q29tcG9uZW50c1tdID0gbmV3IGludFtudW1Db21wb25lbnRzXTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoOyBpKyssIG1pblkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDAsIHggPSBtaW5YOyBqIDwgdzsgaisrLCB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ29tcG9uZW50cyA9IHJhc3Rlci5nZXRQaXhlbCh4LCBtaW5ZLCBpQ29tcG9uZW50cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlDb21wb25lbnRzW251bUNvbG9yQ29tcG9uZW50c10gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXN0ZXIuc2V0UGl4ZWwoeCwgbWluWSwgaVRyYW5zcGFyZW50Q29tcG9uZW50cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYWxwaGEgPSBpQ29tcG9uZW50c1tudW1Db2xvckNvbXBvbmVudHNdIC8gYWxwaGFGYWN0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtQ29sb3JDb21wb25lbnRzOyBuKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDb21wb25lbnRzW25dID0gKGludCkoaUNvbXBvbmVudHNbbl0gLyBhbHBoYSArIDAuNWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhc3Rlci5zZXRQaXhlbCh4LCBtaW5ZLCBpQ29tcG9uZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhc3Rlci5zZXRQaXhlbCh4LCBtaW5ZLCBpQ29tcG9uZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfU0hPUlQ6Ci0gICAgICAgICAgICAgICAgZmxvYXQgc0FscGhhRmFjdG9yID0gbWF4VmFsdWVzW251bUNvbG9yQ29tcG9uZW50c107Ci0gICAgICAgICAgICAgICAgc2hvcnQgc0NvbXBvbmVudHNbXSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgc2hvcnQgc1RyYW5zcGFyZW50Q29tcG9uZW50c1tdID0gbmV3IHNob3J0W251bUNvbXBvbmVudHNdOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaDsgaSsrLCBtaW5ZKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDAsIHggPSBtaW5YOyBqIDwgdzsgaisrLCB4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNDb21wb25lbnRzID0gKHNob3J0W10pIHJhc3Rlci5nZXREYXRhRWxlbWVudHMoeCwgbWluWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0NvbXBvbmVudHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNDb21wb25lbnRzW251bUNvbG9yQ29tcG9uZW50c10gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhc3Rlci5zZXREYXRhRWxlbWVudHMoeCwgbWluWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNUcmFuc3BhcmVudENvbXBvbmVudHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbHBoYSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDb21wb25lbnRzW251bUNvbG9yQ29tcG9uZW50c10gLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0FscGhhRmFjdG9yOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtQ29sb3JDb21wb25lbnRzOyBuKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0NvbXBvbmVudHNbbl0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ5dGUpIChzQ29tcG9uZW50c1tuXSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhICsgMC41Zik7CisgICAgICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfU0hPUlQ6CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNBbHBoYUZhY3RvciA9IG1heFZhbHVlc1tudW1Db2xvckNvbXBvbmVudHNdOworICAgICAgICAgICAgICAgICAgICBzaG9ydCBzQ29tcG9uZW50c1tdID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgc2hvcnQgc1RyYW5zcGFyZW50Q29tcG9uZW50c1tdID0gbmV3IHNob3J0W251bUNvbXBvbmVudHNdOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGg7IGkrKywgbWluWSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMCwgeCA9IG1pblg7IGogPCB3OyBqKyssIHgrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDb21wb25lbnRzID0gKHNob3J0W10pcmFzdGVyLmdldERhdGFFbGVtZW50cyh4LCBtaW5ZLCBzQ29tcG9uZW50cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNDb21wb25lbnRzW251bUNvbG9yQ29tcG9uZW50c10gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXN0ZXIuc2V0RGF0YUVsZW1lbnRzKHgsIG1pblksIHNUcmFuc3BhcmVudENvbXBvbmVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFscGhhID0gc0NvbXBvbmVudHNbbnVtQ29sb3JDb21wb25lbnRzXSAvIHNBbHBoYUZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBudW1Db2xvckNvbXBvbmVudHM7IG4rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0NvbXBvbmVudHNbbl0gPSAoYnl0ZSkoc0NvbXBvbmVudHNbbl0gLyBhbHBoYSArIDAuNWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhc3Rlci5zZXREYXRhRWxlbWVudHMoeCwgbWluWSwgc0NvbXBvbmVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXN0ZXIuc2V0RGF0YUVsZW1lbnRzKHgsIG1pblksIHNDb21wb25lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9GTE9BVDoKLSAgICAgICAgICAgICAgICBmbG9hdCBmQ29tcG9uZW50c1tdID0gbnVsbDsKLSAgICAgICAgICAgICAgICBmbG9hdCBmVHJhbnNwYXJlbnRDb21wb25lbnRzW10gPSBuZXcgZmxvYXRbbnVtQ29tcG9uZW50c107Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoOyBpKyssIG1pblkrKykgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMCwgeCA9IG1pblg7IGogPCB3OyBqKyssIHgrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgZkNvbXBvbmVudHMgPSByYXN0ZXIuZ2V0UGl4ZWwoeCwgbWluWSwgZkNvbXBvbmVudHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZDb21wb25lbnRzW251bUNvbG9yQ29tcG9uZW50c10gPT0gMC4wZikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhc3Rlci5zZXREYXRhRWxlbWVudHMoeCwgbWluWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZUcmFuc3BhcmVudENvbXBvbmVudHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbHBoYSA9IGZDb21wb25lbnRzW251bUNvbG9yQ29tcG9uZW50c107Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBudW1Db2xvckNvbXBvbmVudHM7IG4rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQ29tcG9uZW50c1tuXSA9IGZDb21wb25lbnRzW25dIC8gYWxwaGE7CisgICAgICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfRkxPQVQ6CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZDb21wb25lbnRzW10gPSBudWxsOworICAgICAgICAgICAgICAgICAgICBmbG9hdCBmVHJhbnNwYXJlbnRDb21wb25lbnRzW10gPSBuZXcgZmxvYXRbbnVtQ29tcG9uZW50c107CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaDsgaSsrLCBtaW5ZKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwLCB4ID0gbWluWDsgaiA8IHc7IGorKywgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkNvbXBvbmVudHMgPSByYXN0ZXIuZ2V0UGl4ZWwoeCwgbWluWSwgZkNvbXBvbmVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmQ29tcG9uZW50c1tudW1Db2xvckNvbXBvbmVudHNdID09IDAuMGYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFzdGVyLnNldERhdGFFbGVtZW50cyh4LCBtaW5ZLCBmVHJhbnNwYXJlbnRDb21wb25lbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbHBoYSA9IGZDb21wb25lbnRzW251bUNvbG9yQ29tcG9uZW50c107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtQ29sb3JDb21wb25lbnRzOyBuKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZDb21wb25lbnRzW25dID0gZkNvbXBvbmVudHNbbl0gLyBhbHBoYTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXN0ZXIuc2V0UGl4ZWwoeCwgbWluWSwgZkNvbXBvbmVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXN0ZXIuc2V0UGl4ZWwoeCwgbWluWSwgZkNvbXBvbmVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0RPVUJMRToKLSAgICAgICAgICAgICAgICBkb3VibGUgZENvbXBvbmVudHNbXSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgZG91YmxlIGRUcmFuc3BhcmVudENvbXBvbmVudHNbXSA9IG5ldyBkb3VibGVbbnVtQ29tcG9uZW50c107Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoOyBpKyssIG1pblkrKykgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMCwgeCA9IG1pblg7IGogPCB3OyBqKyssIHgrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgZENvbXBvbmVudHMgPSByYXN0ZXIuZ2V0UGl4ZWwoeCwgbWluWSwgZENvbXBvbmVudHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRDb21wb25lbnRzW251bUNvbG9yQ29tcG9uZW50c10gPT0gMC4wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFzdGVyLnNldFBpeGVsKHgsIG1pblksIGRUcmFuc3BhcmVudENvbXBvbmVudHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYWxwaGEgPSBkQ29tcG9uZW50c1tudW1Db2xvckNvbXBvbmVudHNdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtQ29sb3JDb21wb25lbnRzOyBuKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZENvbXBvbmVudHNbbl0gPSBkQ29tcG9uZW50c1tuXSAvIGFscGhhOworICAgICAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0RPVUJMRToKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRDb21wb25lbnRzW10gPSBudWxsOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgZFRyYW5zcGFyZW50Q29tcG9uZW50c1tdID0gbmV3IGRvdWJsZVtudW1Db21wb25lbnRzXTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoOyBpKyssIG1pblkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDAsIHggPSBtaW5YOyBqIDwgdzsgaisrLCB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkQ29tcG9uZW50cyA9IHJhc3Rlci5nZXRQaXhlbCh4LCBtaW5ZLCBkQ29tcG9uZW50cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRDb21wb25lbnRzW251bUNvbG9yQ29tcG9uZW50c10gPT0gMC4wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhc3Rlci5zZXRQaXhlbCh4LCBtaW5ZLCBkVHJhbnNwYXJlbnRDb21wb25lbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYWxwaGEgPSBkQ29tcG9uZW50c1tudW1Db2xvckNvbXBvbmVudHNdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IG51bUNvbG9yQ29tcG9uZW50czsgbisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkQ29tcG9uZW50c1tuXSA9IGRDb21wb25lbnRzW25dIC8gYWxwaGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFzdGVyLnNldFBpeGVsKHgsIG1pblksIGRDb21wb25lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFzdGVyLnNldFBpeGVsKHgsIG1pblksIGRDb21wb25lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAvLyBhd3QuMjE5PVRoaXMgdHJhbnNmZXJUeXBlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBjb2xvciBtb2RlbAotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMTkiKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAvLyBhd3QuMjE5PVRoaXMgdHJhbnNmZXJUeXBlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBjb2xvcgorICAgICAgICAgICAgICAgICAgICAvLyBtb2RlbAorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjE5IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIXNpZ25lZCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRDb2xvck1vZGVsKGNzLCBiaXRzLCBoYXNBbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgaXNBbHBoYVByZW11bHRpcGxpZWQsIHRyYW5zcGFyZW5jeSwgdHJhbnNmZXJUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50Q29sb3JNb2RlbChjcywgYml0cywgaGFzQWxwaGEsIGlzQWxwaGFQcmVtdWx0aXBsaWVkLCB0cmFuc3BhcmVuY3ksCisgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyVHlwZSk7CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudENvbG9yTW9kZWwoY3MsIG51bGwsIGhhc0FscGhhLAotICAgICAgICAgICAgICAgIGlzQWxwaGFQcmVtdWx0aXBsaWVkLCB0cmFuc3BhcmVuY3ksIHRyYW5zZmVyVHlwZSk7CisgICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50Q29sb3JNb2RlbChjcywgbnVsbCwgaGFzQWxwaGEsIGlzQWxwaGFQcmVtdWx0aXBsaWVkLCB0cmFuc3BhcmVuY3ksCisgICAgICAgICAgICAgICAgdHJhbnNmZXJUeXBlKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50W10gZ2V0Q29tcG9uZW50cyhPYmplY3QgcGl4ZWwsIGludFtdIGNvbXBvbmVudHMsIGludCBvZmZzZXQpIHsKICAgICAgICAgaWYgKGRvbm90U3VwcG9ydFVubm9ybWFsaXplZCkgewotICAgICAgICAgICAgLy8gYXd0LjIxMz1UaGlzIENvbXBvbmVudENvbG9yTW9kZWwgZG9lcyBub3Qgc3VwcG9ydCB0aGUgdW5ub3JtYWxpemVkIGZvcm0KKyAgICAgICAgICAgIC8vIGF3dC4yMTM9VGhpcyBDb21wb25lbnRDb2xvck1vZGVsIGRvZXMgbm90IHN1cHBvcnQgdGhlCisgICAgICAgICAgICAvLyB1bm5vcm1hbGl6ZWQgZm9ybQogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMTMiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCiAgICAgICAgIGlmIChjb21wb25lbnRzID09IG51bGwpIHsKICAgICAgICAgICAgIGNvbXBvbmVudHMgPSBuZXcgaW50W29mZnNldCArIG51bUNvbXBvbmVudHNdOwogICAgICAgICB9IGVsc2UgaWYgKG9mZnNldCArIG51bUNvbXBvbmVudHMgPiBjb21wb25lbnRzLmxlbmd0aCkgewotICAgICAgICAgICAgLy8gYXd0LjIxOD1UaGUgY29tcG9uZW50cyBhcnJheSBpcyBub3QgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYWxsIHRoZSBjb2xvciBhbmQgYWxwaGEgY29tcG9uZW50cworICAgICAgICAgICAgLy8gYXd0LjIxOD1UaGUgY29tcG9uZW50cyBhcnJheSBpcyBub3QgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYWxsIHRoZQorICAgICAgICAgICAgLy8gY29sb3IgYW5kIGFscGhhIGNvbXBvbmVudHMKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjE4IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAogICAgICAgICBzd2l0Y2ggKHRyYW5zZmVyVHlwZSkgewotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgotICAgICAgICAgICAgYnl0ZSBiYVtdID0gKGJ5dGVbXSkgcGl4ZWw7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgorICAgICAgICAgICAgICAgIGJ5dGUgYmFbXSA9IChieXRlW10pcGl4ZWw7CiAKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBpZHggPSBvZmZzZXQ7IGkgPCBudW1Db21wb25lbnRzOyBpKyssIGlkeCsrKSB7Ci0gICAgICAgICAgICAgICAgY29tcG9uZW50c1tpZHhdID0gYmFbaV0gJiAweGZmOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IG9mZnNldDsgaSA8IG51bUNvbXBvbmVudHM7IGkrKywgaWR4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50c1tpZHhdID0gYmFbaV0gJiAweGZmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50czsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6Ci0gICAgICAgICAgICBzaG9ydCBzYVtdID0gKHNob3J0W10pIHBpeGVsOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IG9mZnNldDsgaSA8IG51bUNvbXBvbmVudHM7IGkrKywgaWR4KyspIHsKLSAgICAgICAgICAgICAgICBjb21wb25lbnRzW2lkeF0gPSBzYVtpXSAmIDB4ZmZmZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRzOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgorICAgICAgICAgICAgICAgIHNob3J0IHNhW10gPSAoc2hvcnRbXSlwaXhlbDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gb2Zmc2V0OyBpIDwgbnVtQ29tcG9uZW50czsgaSsrLCBpZHgrKykgeworICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzW2lkeF0gPSBzYVtpXSAmIDB4ZmZmZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgotICAgICAgICAgICAgaW50IGlhW10gPSAoaW50W10pIHBpeGVsOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IG9mZnNldDsgaSA8IG51bUNvbXBvbmVudHM7IGkrKywgaWR4KyspIHsKLSAgICAgICAgICAgICAgICBjb21wb25lbnRzW2lkeF0gPSBpYVtpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRzOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgorICAgICAgICAgICAgICAgIGludCBpYVtdID0gKGludFtdKXBpeGVsOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBpZHggPSBvZmZzZXQ7IGkgPCBudW1Db21wb25lbnRzOyBpKyssIGlkeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHNbaWR4XSA9IGlhW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50czsKIAotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gYXd0LjIxNz1UaGUgdHJhbnNmZXIgdHlwZSBvZiB0aGlzIENvbXBvbmVudENvbG9yTW9kZWwgaXMgbm90IG9uZQotICAgICAgICAgICAgLy8gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB0cmFuc2ZlciB0eXBlczogRGF0YUJ1ZmZlci5UWVBFX0JZVEUsCi0gICAgICAgICAgICAvLyAgICAgICAgICBEYXRhQnVmZmVyLlRZUEVfVVNIT1JULCBvciBEYXRhQnVmZmVyLlRZUEVfSU5UCi0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMKLSAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygiYXd0LjIxNyIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyBhd3QuMjE3PVRoZSB0cmFuc2ZlciB0eXBlIG9mIHRoaXMgQ29tcG9uZW50Q29sb3JNb2RlbCBpcyBub3QKKyAgICAgICAgICAgICAgICAvLyBvbmUKKyAgICAgICAgICAgICAgICAvLyBvZiB0aGUgZm9sbG93aW5nIHRyYW5zZmVyIHR5cGVzOiBEYXRhQnVmZmVyLlRZUEVfQllURSwKKyAgICAgICAgICAgICAgICAvLyBEYXRhQnVmZmVyLlRZUEVfVVNIT1JULCBvciBEYXRhQnVmZmVyLlRZUEVfSU5UCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxNyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmxvYXRbXSBnZXROb3JtYWxpemVkQ29tcG9uZW50cyhPYmplY3QgcGl4ZWwsCi0gICAgICAgICAgICBmbG9hdCBub3JtQ29tcG9uZW50c1tdLCBpbnQgbm9ybU9mZnNldCkgeworICAgIHB1YmxpYyBmbG9hdFtdIGdldE5vcm1hbGl6ZWRDb21wb25lbnRzKE9iamVjdCBwaXhlbCwgZmxvYXQgbm9ybUNvbXBvbmVudHNbXSwgaW50IG5vcm1PZmZzZXQpIHsKIAogICAgICAgICBpZiAobm9ybUNvbXBvbmVudHMgPT0gbnVsbCkgewogICAgICAgICAgICAgbm9ybUNvbXBvbmVudHMgPSBuZXcgZmxvYXRbbnVtQ29tcG9uZW50cyArIG5vcm1PZmZzZXRdOwogICAgICAgICB9CiAKICAgICAgICAgc3dpdGNoICh0cmFuc2ZlclR5cGUpIHsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKLSAgICAgICAgICAgIGJ5dGUgYmFbXSA9IChieXRlW10pIHBpeGVsOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IG5vcm1PZmZzZXQ7IGkgPCBudW1Db21wb25lbnRzOyBpKyssIGlkeCsrKSB7Ci0gICAgICAgICAgICAgICAgbm9ybUNvbXBvbmVudHNbaWR4XSA9IChiYVtpXSAmIDB4ZmYpICogc2NhbGVGYWN0b3JzW2ldOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgorICAgICAgICAgICAgICAgIGJ5dGUgYmFbXSA9IChieXRlW10pcGl4ZWw7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IG5vcm1PZmZzZXQ7IGkgPCBudW1Db21wb25lbnRzOyBpKyssIGlkeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIG5vcm1Db21wb25lbnRzW2lkeF0gPSAoYmFbaV0gJiAweGZmKSAqIHNjYWxlRmFjdG9yc1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgotICAgICAgICAgICAgc2hvcnQgdXNhW10gPSAoc2hvcnRbXSkgcGl4ZWw7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gbm9ybU9mZnNldDsgaSA8IG51bUNvbXBvbmVudHM7IGkrKywgaWR4KyspIHsKLSAgICAgICAgICAgICAgICBub3JtQ29tcG9uZW50c1tpZHhdID0gKHVzYVtpXSAmIDB4ZmZmZikKLSAgICAgICAgICAgICAgICAgICAgICAgICogc2NhbGVGYWN0b3JzW2ldOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6CisgICAgICAgICAgICAgICAgc2hvcnQgdXNhW10gPSAoc2hvcnRbXSlwaXhlbDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gbm9ybU9mZnNldDsgaSA8IG51bUNvbXBvbmVudHM7IGkrKywgaWR4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgbm9ybUNvbXBvbmVudHNbaWR4XSA9ICh1c2FbaV0gJiAweGZmZmYpICogc2NhbGVGYWN0b3JzW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6Ci0gICAgICAgICAgICBpbnQgaWFbXSA9IChpbnRbXSkgcGl4ZWw7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gbm9ybU9mZnNldDsgaSA8IG51bUNvbXBvbmVudHM7IGkrKywgaWR4KyspIHsKLSAgICAgICAgICAgICAgICBub3JtQ29tcG9uZW50c1tpZHhdID0gaWFbaV0gKiBzY2FsZUZhY3RvcnNbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKKyAgICAgICAgICAgICAgICBpbnQgaWFbXSA9IChpbnRbXSlwaXhlbDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gbm9ybU9mZnNldDsgaSA8IG51bUNvbXBvbmVudHM7IGkrKywgaWR4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgbm9ybUNvbXBvbmVudHNbaWR4XSA9IGlhW2ldICogc2NhbGVGYWN0b3JzW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9TSE9SVDoKLSAgICAgICAgICAgIHNob3J0IHNhW10gPSAoc2hvcnRbXSkgcGl4ZWw7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gbm9ybU9mZnNldDsgaSA8IG51bUNvbXBvbmVudHM7IGkrKywgaWR4KyspIHsKLSAgICAgICAgICAgICAgICBub3JtQ29tcG9uZW50c1tpZHhdID0gc2FbaV0gKiBzY2FsZUZhY3RvcnNbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1NIT1JUOgorICAgICAgICAgICAgICAgIHNob3J0IHNhW10gPSAoc2hvcnRbXSlwaXhlbDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gbm9ybU9mZnNldDsgaSA8IG51bUNvbXBvbmVudHM7IGkrKywgaWR4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgbm9ybUNvbXBvbmVudHNbaWR4XSA9IHNhW2ldICogc2NhbGVGYWN0b3JzW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9GTE9BVDoKLSAgICAgICAgICAgIGZsb2F0IGZhW10gPSAoZmxvYXRbXSkgcGl4ZWw7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gbm9ybU9mZnNldDsgaSA8IG51bUNvbXBvbmVudHM7IGkrKywgaWR4KyspIHsKLSAgICAgICAgICAgICAgICBub3JtQ29tcG9uZW50c1tpZHhdID0gZmFbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0ZMT0FUOgorICAgICAgICAgICAgICAgIGZsb2F0IGZhW10gPSAoZmxvYXRbXSlwaXhlbDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gbm9ybU9mZnNldDsgaSA8IG51bUNvbXBvbmVudHM7IGkrKywgaWR4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgbm9ybUNvbXBvbmVudHNbaWR4XSA9IGZhW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICBkb3VibGUgZGFbXSA9IChkb3VibGVbXSkgcGl4ZWw7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gbm9ybU9mZnNldDsgaSA8IG51bUNvbXBvbmVudHM7IGkrKywgaWR4KyspIHsKLSAgICAgICAgICAgICAgICBub3JtQ29tcG9uZW50c1tpZHhdID0gKGZsb2F0KSBkYVtpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgICAgIGRvdWJsZSBkYVtdID0gKGRvdWJsZVtdKXBpeGVsOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBpZHggPSBub3JtT2Zmc2V0OyBpIDwgbnVtQ29tcG9uZW50czsgaSsrLCBpZHgrKykgeworICAgICAgICAgICAgICAgICAgICBub3JtQ29tcG9uZW50c1tpZHhdID0gKGZsb2F0KWRhW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gYXd0LjIxQT1UaGlzIENvbXBvbmVudENvbG9yTW9kZWwgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIHRyYW5zZmVyVHlwZQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMUEiKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8gYXd0LjIxQT1UaGlzIENvbXBvbmVudENvbG9yTW9kZWwgZG9lcyBub3Qgc3VwcG9ydCB0aGlzCisgICAgICAgICAgICAgICAgLy8gdHJhbnNmZXJUeXBlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMUEiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCiAgICAgICAgIGlmIChuZWVkQWxwaGFEaXZpZGUpIHsKICAgICAgICAgICAgIGZsb2F0IGFscGhhID0gbm9ybUNvbXBvbmVudHNbbm9ybU9mZnNldCArIG51bUNvbG9yQ29tcG9uZW50c107Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gbm9ybU9mZnNldDsgaSA8IG51bUNvbG9yQ29tcG9uZW50czsKLSAgICAgICAgICAgICAgICBpKyssIGlkeCsrKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gbm9ybU9mZnNldDsgaSA8IG51bUNvbG9yQ29tcG9uZW50czsgaSsrLCBpZHgrKykgewogICAgICAgICAgICAgICAgIG5vcm1Db21wb25lbnRzW2lkeF0gLz0gYWxwaGE7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobmVlZFNjYWxlKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMCwgaWR4ID0gbm9ybU9mZnNldDsgaSA8IG51bUNvbG9yQ29tcG9uZW50czsKLSAgICAgICAgICAgICAgICBpKyssIGlkeCsrKSB7Ci0gICAgICAgICAgICAgICAgbm9ybUNvbXBvbmVudHNbaWR4XSA9IG1pblZhbHNbaV0gKwotICAgICAgICAgICAgICAgICAgICByYW5nZXNbaV0gKiBub3JtQ29tcG9uZW50c1tpZHhdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGlkeCA9IG5vcm1PZmZzZXQ7IGkgPCBudW1Db2xvckNvbXBvbmVudHM7IGkrKywgaWR4KyspIHsKKyAgICAgICAgICAgICAgICBub3JtQ29tcG9uZW50c1tpZHhdID0gbWluVmFsc1tpXSArIHJhbmdlc1tpXSAqIG5vcm1Db21wb25lbnRzW2lkeF07CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG5vcm1Db21wb25lbnRzOwpAQCAtOTM0LDggKzk1MCw3IEBACiAgICAgICAgICAgICBpbnQgZ3JheSA9IGdldFJlZChpbkRhdGEpOwogICAgICAgICAgICAgcmV0dXJuIChhbHBoYSA8PCAyNCB8IGdyYXkgPDwgMTYgfCBncmF5IDw8IDggfCBncmF5KTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gKGFscGhhIDw8IDI0IHwgZ2V0UmVkKGluRGF0YSkgPDwgMTYgfCBnZXRHcmVlbihpbkRhdGEpIDw8IDggfAotICAgICAgICAgICAgICAgIGdldEJsdWUoaW5EYXRhKSk7CisgICAgICAgIHJldHVybiAoYWxwaGEgPDwgMjQgfCBnZXRSZWQoaW5EYXRhKSA8PCAxNiB8IGdldEdyZWVuKGluRGF0YSkgPDwgOCB8IGdldEJsdWUoaW5EYXRhKSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC05NTYsNTAgKzk3MSw1MCBAQAogICAgICAgICBpbnQgYWxwaGEgPSAwOwogCiAgICAgICAgIHN3aXRjaCAodHJhbnNmZXJUeXBlKSB7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6IHsKLSAgICAgICAgICAgIGJ5dGUgYmFbXSA9IChieXRlW10pIGluRGF0YTsKLSAgICAgICAgICAgIGFscGhhID0gYmFbbnVtQ29sb3JDb21wb25lbnRzXSAmIDB4ZmY7Ci0gICAgICAgICAgICBpZiAoYml0c1tudW1Db2xvckNvbXBvbmVudHNdICE9IDgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYWxwaGFMVVRbYWxwaGFdICYgMHhmZjsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6IHsKKyAgICAgICAgICAgICAgICBieXRlIGJhW10gPSAoYnl0ZVtdKWluRGF0YTsKKyAgICAgICAgICAgICAgICBhbHBoYSA9IGJhW251bUNvbG9yQ29tcG9uZW50c10gJiAweGZmOworICAgICAgICAgICAgICAgIGlmIChiaXRzW251bUNvbG9yQ29tcG9uZW50c10gIT0gOCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWxwaGFMVVRbYWxwaGFdICYgMHhmZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGFscGhhOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGFscGhhOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDogewotICAgICAgICAgICAgc2hvcnQgdXNhW10gPSAoc2hvcnRbXSkgaW5EYXRhOwotICAgICAgICAgICAgYWxwaGEgPSB1c2FbbnVtQ29sb3JDb21wb25lbnRzXSAmIDB4ZmZmZjsKLSAgICAgICAgICAgIGlmIChiaXRzW251bUNvbG9yQ29tcG9uZW50c10gIT0gOCkgewotICAgICAgICAgICAgICAgIHJldHVybiBhbHBoYUxVVFthbHBoYV0gJiAweGZmOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOiB7CisgICAgICAgICAgICAgICAgc2hvcnQgdXNhW10gPSAoc2hvcnRbXSlpbkRhdGE7CisgICAgICAgICAgICAgICAgYWxwaGEgPSB1c2FbbnVtQ29sb3JDb21wb25lbnRzXSAmIDB4ZmZmZjsKKyAgICAgICAgICAgICAgICBpZiAoYml0c1tudW1Db2xvckNvbXBvbmVudHNdICE9IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFscGhhTFVUW2FscGhhXSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBhbHBoYTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBhbHBoYTsKLSAgICAgICAgfQotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6IHsKLSAgICAgICAgICAgIGludCBpYVtdID0gKGludFtdKSBpbkRhdGE7Ci0gICAgICAgICAgICBhbHBoYSA9IGlhW251bUNvbG9yQ29tcG9uZW50c107Ci0gICAgICAgICAgICBpZiAoYml0c1tudW1Db2xvckNvbXBvbmVudHNdICE9IDgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYWxwaGFMVVRbYWxwaGFdICYgMHhmZjsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDogeworICAgICAgICAgICAgICAgIGludCBpYVtdID0gKGludFtdKWluRGF0YTsKKyAgICAgICAgICAgICAgICBhbHBoYSA9IGlhW251bUNvbG9yQ29tcG9uZW50c107CisgICAgICAgICAgICAgICAgaWYgKGJpdHNbbnVtQ29sb3JDb21wb25lbnRzXSAhPSA4KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhbHBoYUxVVFthbHBoYV0gJiAweGZmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gYWxwaGE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYWxwaGE7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfU0hPUlQ6IHsKLSAgICAgICAgICAgIHNob3J0IHNhW10gPSAoc2hvcnRbXSkgaW5EYXRhOwotICAgICAgICAgICAgYWxwaGEgPSBzYVtudW1Db2xvckNvbXBvbmVudHNdOwotICAgICAgICAgICAgaWYgKGJpdHNbbnVtQ29sb3JDb21wb25lbnRzXSAhPSA4KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFscGhhTFVUW2FscGhhXSAmIDB4ZmY7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9TSE9SVDogeworICAgICAgICAgICAgICAgIHNob3J0IHNhW10gPSAoc2hvcnRbXSlpbkRhdGE7CisgICAgICAgICAgICAgICAgYWxwaGEgPSBzYVtudW1Db2xvckNvbXBvbmVudHNdOworICAgICAgICAgICAgICAgIGlmIChiaXRzW251bUNvbG9yQ29tcG9uZW50c10gIT0gOCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWxwaGFMVVRbYWxwaGFdICYgMHhmZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGFscGhhOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGFscGhhOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0ZMT0FUOiB7Ci0gICAgICAgICAgICBmbG9hdCBmYVtdID0gKGZsb2F0W10pIGluRGF0YTsKLSAgICAgICAgICAgIHJldHVybiAoaW50KSAoZmFbbnVtQ29sb3JDb21wb25lbnRzXSAqIDI1NS4wZiArIDAuNWYpOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0RPVUJMRTogewotICAgICAgICAgICAgZG91YmxlIGRhW10gPSAoZG91YmxlW10pIGluRGF0YTsKLSAgICAgICAgICAgIHJldHVybiAoaW50KSAoZGFbbnVtQ29sb3JDb21wb25lbnRzXSAqIDI1NS4wICsgMC41KTsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICAvLyBhd3QuMjE0PVRoaXMgQ29sb3IgTW9kZWwgZG9lc24ndCBzdXBwb3J0IHRoaXMgdHJhbnNmZXJUeXBlCi0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjE0IikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0ZMT0FUOiB7CisgICAgICAgICAgICAgICAgZmxvYXQgZmFbXSA9IChmbG9hdFtdKWluRGF0YTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGludCkoZmFbbnVtQ29sb3JDb21wb25lbnRzXSAqIDI1NS4wZiArIDAuNWYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfRE9VQkxFOiB7CisgICAgICAgICAgICAgICAgZG91YmxlIGRhW10gPSAoZG91YmxlW10paW5EYXRhOworICAgICAgICAgICAgICAgIHJldHVybiAoaW50KShkYVtudW1Db2xvckNvbXBvbmVudHNdICogMjU1LjAgKyAwLjUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgIC8vIGF3dC4yMTQ9VGhpcyBDb2xvciBNb2RlbCBkb2Vzbid0IHN1cHBvcnQgdGhpcyB0cmFuc2ZlclR5cGUKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjE0IikpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEwMzIsMTQgKzEwNDcsMTQgQEAKICAgICAgICAgfQogCiAgICAgICAgIHN3aXRjaCAodHJhbnNmZXJUeXBlKSB7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKLSAgICAgICAgICAgIHJldHVybiBuZXcgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsKHRyYW5zZmVyVHlwZSwgdywgaCwKLSAgICAgICAgICAgICAgICAgICAgbnVtQ29tcG9uZW50cywgdyAqIG51bUNvbXBvbmVudHMsIGJhbmRPZmZzZXRzKTsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwodHJhbnNmZXJUeXBlLCB3LCBoLCBudW1Db21wb25lbnRzLCB3CisgICAgICAgICAgICAgICAgICAgICAgICAqIG51bUNvbXBvbmVudHMsIGJhbmRPZmZzZXRzKTsKIAotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRTYW1wbGVNb2RlbCh0cmFuc2ZlclR5cGUsIHcsIGgsIG51bUNvbXBvbmVudHMsCi0gICAgICAgICAgICAgICAgICAgIHcgKiBudW1Db21wb25lbnRzLCBiYW5kT2Zmc2V0cyk7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50U2FtcGxlTW9kZWwodHJhbnNmZXJUeXBlLCB3LCBoLCBudW1Db21wb25lbnRzLCB3CisgICAgICAgICAgICAgICAgICAgICAgICAqIG51bUNvbXBvbmVudHMsIGJhbmRPZmZzZXRzKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTA2NywxNSArMTA4MiwxNSBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmbG9hdFtdIGdldE5vcm1hbGl6ZWRDb21wb25lbnRzKGludCBjb21wb25lbnRzW10sIGludCBvZmZzZXQsCi0gICAgICAgICAgICBmbG9hdCBub3JtQ29tcG9uZW50c1tdLCBpbnQgbm9ybU9mZnNldCkgeworICAgIHB1YmxpYyBmbG9hdFtdIGdldE5vcm1hbGl6ZWRDb21wb25lbnRzKGludCBjb21wb25lbnRzW10sIGludCBvZmZzZXQsIGZsb2F0IG5vcm1Db21wb25lbnRzW10sCisgICAgICAgICAgICBpbnQgbm9ybU9mZnNldCkgewogICAgICAgICBpZiAoZG9ub3RTdXBwb3J0VW5ub3JtYWxpemVkKSB7Ci0gICAgICAgICAgICAvLyBhd3QuMjEzPVRoaXMgQ29tcG9uZW50Q29sb3JNb2RlbCBkb2VzIG5vdCBzdXBwb3J0IHRoZSB1bm5vcm1hbGl6ZWQgZm9ybQorICAgICAgICAgICAgLy8gYXd0LjIxMz1UaGlzIENvbXBvbmVudENvbG9yTW9kZWwgZG9lcyBub3Qgc3VwcG9ydCB0aGUKKyAgICAgICAgICAgIC8vIHVubm9ybWFsaXplZCBmb3JtCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxMyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldE5vcm1hbGl6ZWRDb21wb25lbnRzKGNvbXBvbmVudHMsIG9mZnNldCwKLSAgICAgICAgICAgICAgICBub3JtQ29tcG9uZW50cywgbm9ybU9mZnNldCk7CisgICAgICAgIHJldHVybiBzdXBlci5nZXROb3JtYWxpemVkQ29tcG9uZW50cyhjb21wb25lbnRzLCBvZmZzZXQsIG5vcm1Db21wb25lbnRzLCBub3JtT2Zmc2V0KTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTEwODUsMjggKzExMDAsMzAgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjEyIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KICAgICAgICAgaWYgKGRvbm90U3VwcG9ydFVubm9ybWFsaXplZCkgewotICAgICAgICAgICAgLy8gYXd0LjIxMz1UaGlzIENvbXBvbmVudENvbG9yTW9kZWwgZG9lcyBub3Qgc3VwcG9ydCB0aGUgdW5ub3JtYWxpemVkIGZvcm0KKyAgICAgICAgICAgIC8vIGF3dC4yMTM9VGhpcyBDb21wb25lbnRDb2xvck1vZGVsIGRvZXMgbm90IHN1cHBvcnQgdGhlCisgICAgICAgICAgICAvLyB1bm5vcm1hbGl6ZWQgZm9ybQogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMTMiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogICAgICAgICByZXR1cm4gY29tcG9uZW50c1tvZmZzZXRdOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnRbXSBnZXRVbm5vcm1hbGl6ZWRDb21wb25lbnRzKGZsb2F0W10gbm9ybUNvbXBvbmVudHMsCi0gICAgICAgICAgICBpbnQgbm9ybU9mZnNldCwgaW50W10gY29tcG9uZW50cywgaW50IG9mZnNldCkgeworICAgIHB1YmxpYyBpbnRbXSBnZXRVbm5vcm1hbGl6ZWRDb21wb25lbnRzKGZsb2F0W10gbm9ybUNvbXBvbmVudHMsIGludCBub3JtT2Zmc2V0LAorICAgICAgICAgICAgaW50W10gY29tcG9uZW50cywgaW50IG9mZnNldCkgewogCiAgICAgICAgIGlmIChkb25vdFN1cHBvcnRVbm5vcm1hbGl6ZWQpIHsKLSAgICAgICAgICAgIC8vIGF3dC4yMTM9VGhpcyBDb21wb25lbnRDb2xvck1vZGVsIGRvZXMgbm90IHN1cHBvcnQgdGhlIHVubm9ybWFsaXplZCBmb3JtCisgICAgICAgICAgICAvLyBhd3QuMjEzPVRoaXMgQ29tcG9uZW50Q29sb3JNb2RlbCBkb2VzIG5vdCBzdXBwb3J0IHRoZQorICAgICAgICAgICAgLy8gdW5ub3JtYWxpemVkIGZvcm0KICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjEzIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAogICAgICAgICBpZiAobm9ybUNvbXBvbmVudHMubGVuZ3RoIC0gbm9ybU9mZnNldCA8IG51bUNvbXBvbmVudHMpIHsKLSAgICAgICAgICAgIC8vIGF3dC4yMUI9VGhlIGxlbmd0aCBvZiBub3JtQ29tcG9uZW50cyBtaW51cyBub3JtT2Zmc2V0IGlzIGxlc3MgdGhhbiBudW1Db21wb25lbnRzCisgICAgICAgICAgICAvLyBhd3QuMjFCPVRoZSBsZW5ndGggb2Ygbm9ybUNvbXBvbmVudHMgbWludXMgbm9ybU9mZnNldCBpcyBsZXNzCisgICAgICAgICAgICAvLyB0aGFuIG51bUNvbXBvbmVudHMKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjFCIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0VW5ub3JtYWxpemVkQ29tcG9uZW50cyhub3JtQ29tcG9uZW50cywgbm9ybU9mZnNldCwKLSAgICAgICAgICAgICAgICBjb21wb25lbnRzLCBvZmZzZXQpOworICAgICAgICByZXR1cm4gc3VwZXIuZ2V0VW5ub3JtYWxpemVkQ29tcG9uZW50cyhub3JtQ29tcG9uZW50cywgbm9ybU9mZnNldCwgY29tcG9uZW50cywgb2Zmc2V0KTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTExMjMsMTkgKzExNDAsMTkgQEAKICAgICAgICAgT2JqZWN0IHBpeGVsID0gZ2V0RGF0YUVsZW1lbnRzKG5vcm1Db21wb25lbnRzLCBub3JtT2Zmc2V0LCBudWxsKTsKIAogICAgICAgICBzd2l0Y2ggKHRyYW5zZmVyVHlwZSkgewotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgotICAgICAgICAgICAgYnl0ZSBiYVtdID0gKGJ5dGVbXSkgcGl4ZWw7Ci0gICAgICAgICAgICByZXR1cm4gYmFbMF0gJiAweGZmOwotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6Ci0gICAgICAgICAgICBzaG9ydCBzYVtdID0gKHNob3J0W10pIHBpeGVsOwotICAgICAgICAgICAgcmV0dXJuIHNhWzBdICYgMHhmZmZmOwotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6Ci0gICAgICAgICAgICBpbnQgaWFbXSA9IChpbnRbXSkgcGl4ZWw7Ci0gICAgICAgICAgICByZXR1cm4gaWFbMF07Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvLyBhd3QuMjExPVBpeGVsIHZhbHVlcyBmb3IgdGhpcyBDb2xvck1vZGVsIGFyZSBub3QgY29udmVuaWVudGx5Ci0gICAgICAgICAgICAvLyAgICAgICAgICByZXByZXNlbnRhYmxlIGFzIGEgc2luZ2xlIGludAotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMTEiKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6CisgICAgICAgICAgICAgICAgYnl0ZSBiYVtdID0gKGJ5dGVbXSlwaXhlbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gYmFbMF0gJiAweGZmOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgorICAgICAgICAgICAgICAgIHNob3J0IHNhW10gPSAoc2hvcnRbXSlwaXhlbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2FbMF0gJiAweGZmZmY7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6CisgICAgICAgICAgICAgICAgaW50IGlhW10gPSAoaW50W10pcGl4ZWw7CisgICAgICAgICAgICAgICAgcmV0dXJuIGlhWzBdOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyBhd3QuMjExPVBpeGVsIHZhbHVlcyBmb3IgdGhpcyBDb2xvck1vZGVsIGFyZSBub3QgY29udmVuaWVudGx5CisgICAgICAgICAgICAgICAgLy8gcmVwcmVzZW50YWJsZSBhcyBhIHNpbmdsZSBpbnQKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxMSIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAgICAgfQogCkBAIC0xMTQ2LDcgKzExNjMsOCBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMTIiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogICAgICAgICBpZiAoZG9ub3RTdXBwb3J0VW5ub3JtYWxpemVkKSB7Ci0gICAgICAgICAgICAvLyBhd3QuMjEzPVRoaXMgQ29tcG9uZW50Q29sb3JNb2RlbCBkb2VzIG5vdCBzdXBwb3J0IHRoZSB1bm5vcm1hbGl6ZWQgZm9ybQorICAgICAgICAgICAgLy8gYXd0LjIxMz1UaGlzIENvbXBvbmVudENvbG9yTW9kZWwgZG9lcyBub3Qgc3VwcG9ydCB0aGUKKyAgICAgICAgICAgIC8vIHVubm9ybWFsaXplZCBmb3JtCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxMyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKQEAgLTExNjEsMzEgKzExNzksMzEgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldFJlZChpbnQgcGl4ZWwpIHsKICAgICAgICAgZmxvYXQgcmdiW10gPSB0b1JHQihwaXhlbCk7Ci0gICAgICAgIHJldHVybiAoaW50KSAocmdiWzBdICogMjU1LjBmICsgMC41Zik7CisgICAgICAgIHJldHVybiAoaW50KShyZ2JbMF0gKiAyNTUuMGYgKyAwLjVmKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldFJHQihpbnQgcGl4ZWwpIHsKLSAgICAgICAgcmV0dXJuIChnZXRBbHBoYShwaXhlbCkgPDwgMjQpIHwgKGdldFJlZChwaXhlbCkgPDwgMTYpIHwKLSAgICAgICAgICAgICAgIChnZXRHcmVlbihwaXhlbCkgPDwgOCkgfCBnZXRCbHVlKHBpeGVsKTsKKyAgICAgICAgcmV0dXJuIChnZXRBbHBoYShwaXhlbCkgPDwgMjQpIHwgKGdldFJlZChwaXhlbCkgPDwgMTYpIHwgKGdldEdyZWVuKHBpeGVsKSA8PCA4KQorICAgICAgICAgICAgICAgIHwgZ2V0Qmx1ZShwaXhlbCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRHcmVlbihpbnQgcGl4ZWwpIHsKICAgICAgICAgZmxvYXQgcmdiW10gPSB0b1JHQihwaXhlbCk7Ci0gICAgICAgIHJldHVybiAoaW50KSAocmdiWzFdICogMjU1LjBmICsgMC41Zik7CisgICAgICAgIHJldHVybiAoaW50KShyZ2JbMV0gKiAyNTUuMGYgKyAwLjVmKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldEJsdWUoaW50IHBpeGVsKSB7CiAgICAgICAgIGZsb2F0IHJnYltdID0gdG9SR0IocGl4ZWwpOwotICAgICAgICByZXR1cm4gKGludCkgKHJnYlsyXSAqIDI1NS4wZiArIDAuNWYpOworICAgICAgICByZXR1cm4gKGludCkocmdiWzJdICogMjU1LjBmICsgMC41Zik7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRBbHBoYShpbnQgcGl4ZWwpIHsKIAotICAgICAgICAvLyBUaGlzIG1ldGhvZCB0aHJvdyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gYWNjb3JkaW5nIHRvIAorICAgICAgICAvLyBUaGlzIG1ldGhvZCB0aHJvdyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gYWNjb3JkaW5nIHRvCiAgICAgICAgIC8vIEphdmEgQVBJIFNwYWNpZmljYXRpb24KICAgICAgICAgaWYgKHNpZ25lZCkgewogICAgICAgICAgICAgLy8gYXd0LjIxMD1UaGUgY29tcG9uZW50IHZhbHVlIGZvciB0aGlzIENvbG9yTW9kZWwgaXMgc2lnbmVkCkBAIC0xMjEwLDI0ICsxMjI4LDE5IEBACiAgICAgICAgIGlmIChoYXNBbHBoYSAmJiBiaXRzW251bUNvbG9yQ29tcG9uZW50c10gIT0gOCAmJiBpbnRlZ3JhbCkgewogICAgICAgICAgICAgYWxwaGFMVVQgPSBuZXcgYnl0ZVttYXhWYWx1ZXNbbnVtQ29sb3JDb21wb25lbnRzXSArIDFdOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gbWF4VmFsdWVzW251bUNvbG9yQ29tcG9uZW50c107IGkrKykgewotICAgICAgICAgICAgICAgIGFscGhhTFVUW2ldID0gKGJ5dGUpIChzY2FsZUZhY3RvcnNbbnVtQ29sb3JDb21wb25lbnRzXSAqIGkgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgIDAuNWYpOworICAgICAgICAgICAgICAgIGFscGhhTFVUW2ldID0gKGJ5dGUpKHNjYWxlRmFjdG9yc1tudW1Db2xvckNvbXBvbmVudHNdICogaSArIDAuNWYpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKGlzX0xJTkVBUl9SR0IpIHsKICAgICAgICAgICAgIGlmIChtYXhCaXRMZW5ndGggPiA4KSB7CiAgICAgICAgICAgICAgICAgTElORUFSX1JHQl9MZW5ndGggPSAxNjsKLSAgICAgICAgICAgICAgICBmcm9tX0xJTkVBUl9SR0JfTFVUID0KLSAgICAgICAgICAgICAgICAgICAgTFVUQ29sb3JDb252ZXJ0ZXIuZ2V0RnJvbTE2bFJHQnRvc1JHQl9MVVQoKTsKLSAgICAgICAgICAgICAgICB0b19MSU5FQVJfMTZSR0JfTFVUID0KLSAgICAgICAgICAgICAgICAgICAgTFVUQ29sb3JDb252ZXJ0ZXIuZ2V0RnJvbXNSR0J0bzE2bFJHQl9MVVQoKTsKKyAgICAgICAgICAgICAgICBmcm9tX0xJTkVBUl9SR0JfTFVUID0gTFVUQ29sb3JDb252ZXJ0ZXIuZ2V0RnJvbTE2bFJHQnRvc1JHQl9MVVQoKTsKKyAgICAgICAgICAgICAgICB0b19MSU5FQVJfMTZSR0JfTFVUID0gTFVUQ29sb3JDb252ZXJ0ZXIuZ2V0RnJvbXNSR0J0bzE2bFJHQl9MVVQoKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgTElORUFSX1JHQl9MZW5ndGggPSA4OwotICAgICAgICAgICAgICAgIGZyb21fTElORUFSX1JHQl9MVVQgPQotICAgICAgICAgICAgICAgICAgICBMVVRDb2xvckNvbnZlcnRlci5nZXRGcm9tOGxSR0J0b3NSR0JfTFVUKCk7Ci0gICAgICAgICAgICAgICAgdG9fTElORUFSXzhSR0JfTFVUID0KLSAgICAgICAgICAgICAgICAgICAgTFVUQ29sb3JDb252ZXJ0ZXIuZ2V0RnJvbXNSR0J0bzhsUkdCX0xVVCgpOworICAgICAgICAgICAgICAgIGZyb21fTElORUFSX1JHQl9MVVQgPSBMVVRDb2xvckNvbnZlcnRlci5nZXRGcm9tOGxSR0J0b3NSR0JfTFVUKCk7CisgICAgICAgICAgICAgICAgdG9fTElORUFSXzhSR0JfTFVUID0gTFVUQ29sb3JDb252ZXJ0ZXIuZ2V0RnJvbXNSR0J0bzhsUkdCX0xVVCgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZkZhY3RvciA9ICgoMSA8PCBMSU5FQVJfUkdCX0xlbmd0aCkgLSAxKTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTEyNDgsOCArMTI2MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvckxVVHNbaV0gPSBuZXcgYnl0ZVttYXhWYWx1ZXNbaV0gKyAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDw9IG1heFZhbHVlc1swXTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JMVVRzW2ldW2pdID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ5dGUpIChzY2FsZUZhY3RvcnNbaV0gKiBqICsgMC41Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JMVVRzW2ldW2pdID0gKGJ5dGUpKHNjYWxlRmFjdG9yc1tpXSAqIGogKyAwLjVmKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTEyNjksMTAgKzEyODEsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPD0gbWF4VmFsdWVzWzBdOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWR4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMSU5FQVJfUkdCX0xlbmd0aCA9PSA4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IChpbnQpIChzY2FsZUZhY3RvcnNbaV0gKiBqICsgMC41Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IChpbnQpKHNjYWxlRmFjdG9yc1tpXSAqIGogKyAwLjVmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHggPSAoaW50KSAoc2NhbGVGYWN0b3JzW2ldICogaiAqIDI1Ny4wZiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IChpbnQpKHNjYWxlRmFjdG9yc1tpXSAqIGogKiAyNTcuMGYgKyAwLjVmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JMVVRzW2ldW2pdID0gZnJvbV9MSU5FQVJfUkdCX0xVVFtpZHhdOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTI4NiwxMyArMTI5NywxMyBAQAogICAgIC8qKgogICAgICAqIFRvIHJnYi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGl4ZWwgLSBpbnQgcmVwcmVzZW50YXRpb24gb2YgcGl4ZWwKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIC0gYXJyYXkgb2Ygbm9ybWFsaXplZCBzUkdCIGNvbXBvbmVudHMKKyAgICAgKiBAcGFyYW0gcGl4ZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwaXhlbC4KKyAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBub3JtYWxpemVkIHNSR0IgY29tcG9uZW50cy4KICAgICAgKi8KICAgICBwcml2YXRlIGZsb2F0W10gdG9SR0IoaW50IHBpeGVsKSB7Ci0gICAgICAgIAotICAgICAgICAvLyBUaGlzIG1ldGhvZCB0aHJvdyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gYWNjb3JkaW5nIHRvIAorCisgICAgICAgIC8vIFRoaXMgbWV0aG9kIHRocm93IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBhY2NvcmRpbmcgdG8KICAgICAgICAgLy8gSmF2YSBBUEkgU3BhY2lmaWNhdGlvbgogICAgICAgICBpZiAoc2lnbmVkKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjEwPVRoZSBjb21wb25lbnQgdmFsdWUgZm9yIHRoaXMgQ29sb3JNb2RlbCBpcyBzaWduZWQKQEAgLTEzMDcsMjMgKzEzMTgsMjMgQEAKICAgICAgICAgT2JqZWN0IG9iaiA9IG51bGw7CiAKICAgICAgICAgc3dpdGNoICh0cmFuc2ZlclR5cGUpIHsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKLSAgICAgICAgICAgIGJ5dGUgYmFbXSA9IG5ldyBieXRlWzFdOwotICAgICAgICAgICAgYmFbMF0gPSAoYnl0ZSkgcGl4ZWw7Ci0gICAgICAgICAgICBvYmogPSBiYTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKKyAgICAgICAgICAgICAgICBieXRlIGJhW10gPSBuZXcgYnl0ZVsxXTsKKyAgICAgICAgICAgICAgICBiYVswXSA9IChieXRlKXBpeGVsOworICAgICAgICAgICAgICAgIG9iaiA9IGJhOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKLSAgICAgICAgICAgIHNob3J0IHNhW10gPSBuZXcgc2hvcnRbMV07Ci0gICAgICAgICAgICBzYVswXSA9IChzaG9ydCkgcGl4ZWw7Ci0gICAgICAgICAgICBvYmogPSBzYTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgorICAgICAgICAgICAgICAgIHNob3J0IHNhW10gPSBuZXcgc2hvcnRbMV07CisgICAgICAgICAgICAgICAgc2FbMF0gPSAoc2hvcnQpcGl4ZWw7CisgICAgICAgICAgICAgICAgb2JqID0gc2E7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgotICAgICAgICAgICAgaW50IGlhW10gPSBuZXcgaW50WzFdOwotICAgICAgICAgICAgaWFbMF0gPSBwaXhlbDsKLSAgICAgICAgICAgIG9iaiA9IGlhOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6CisgICAgICAgICAgICAgICAgaW50IGlhW10gPSBuZXcgaW50WzFdOworICAgICAgICAgICAgICAgIGlhWzBdID0gcGl4ZWw7CisgICAgICAgICAgICAgICAgb2JqID0gaWE7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgfQogCkBAIC0xMzMxLDEyICsxMzQyLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgcmdiIGNvbXBvbmVudC4KKyAgICAgKiBHZXRzIHRoZSBSR0IgY29tcG9uZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBwaXhlbCAtIHBpeGVsCi0gICAgICogQHBhcmFtIGlkeCAtIGluZGV4IG9mIGNvbXBvbmVudAotICAgICAqIAotICAgICAqIEByZXR1cm4gLSBSR0IgdmFsdWUgZnJvbSAwIHRvIDI1NSBwaXhlbCdzIGNvbXBvbmVudAorICAgICAqIEBwYXJhbSBwaXhlbAorICAgICAqICAgICAgICAgICAgdGhlIHBpeGVsLgorICAgICAqIEBwYXJhbSBpZHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiBjb21wb25lbnQuCisgICAgICogQHJldHVybiB0aGUgUkdCIHZhbHVlIGZyb20gMCB0byAyNTUgcGl4ZWwncyBjb21wb25lbnQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgZ2V0UkdCQ29tcG9uZW50KE9iamVjdCBwaXhlbCwgaW50IGlkeCkgewogICAgICAgICBpZiAoaXNfc1JHQikgewpAQCAtMTM1NSwxMTcgKzEzNjcsMTE2IEBACiAKICAgICAgICAgZmxvYXQgbm9ybUNvbXBbXSA9IGdldE5vcm1hbGl6ZWRDb21wb25lbnRzKHBpeGVsLCBudWxsLCAwKTsKICAgICAgICAgZmxvYXQgcmdiQ29tcFtdID0gY3MudG9SR0Iobm9ybUNvbXApOwotICAgICAgICByZXR1cm4gKGludCkgKHJnYkNvbXBbaWR4XSAqIDI1NS4wZiArIDAuNWYpOworICAgICAgICByZXR1cm4gKGludCkocmdiQ29tcFtpZHhdICogMjU1LjBmICsgMC41Zik7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgZGVmIGNvbXBvbmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGl4ZWwgLSBwaXhlbAotICAgICAqIEBwYXJhbSBpZHggLSBpbmRleCBvZiBjb21wb25lbnQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIC0gdGVudGF0aXZlIHZhbHVlIG9mIHRoZSBwaXhlbCBjb21wb25lbnQKKyAgICAgKiBAcGFyYW0gcGl4ZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBwaXhlbC4KKyAgICAgKiBAcGFyYW0gaWR4CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgY29tcG9uZW50LgorICAgICAqIEByZXR1cm4gdGhlIHRlbnRhdGl2ZSB2YWx1ZSBvZiB0aGUgcGl4ZWwgY29tcG9uZW50LgogICAgICAqLwogICAgIHByaXZhdGUgaW50IGdldERlZkNvbXBvbmVudChPYmplY3QgcGl4ZWwsIGludCBpZHgpIHsKICAgICAgICAgaW50IGNvbXAgPSAwOwogICAgICAgICBjYWxjVmFsdWUgPSBmYWxzZTsKIAogICAgICAgICBzd2l0Y2ggKHRyYW5zZmVyVHlwZSkgewotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgotICAgICAgICAgICAgYnl0ZSBiYVtdID0gKGJ5dGVbXSkgcGl4ZWw7Ci0gICAgICAgICAgICBjb21wID0gYmFbaWR4XSAmIDB4ZmY7Ci0gICAgICAgICAgICBpZiAobmVlZEFscGhhRGl2aWRlKSB7Ci0gICAgICAgICAgICAgICAgaW50IGFscGhhID0gYmFbbnVtQ29sb3JDb21wb25lbnRzXSAmIDB4ZmY7Ci0gICAgICAgICAgICAgICAgaWYgKGFscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY29tcCA9IDA7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgorICAgICAgICAgICAgICAgIGJ5dGUgYmFbXSA9IChieXRlW10pcGl4ZWw7CisgICAgICAgICAgICAgICAgY29tcCA9IGJhW2lkeF0gJiAweGZmOworICAgICAgICAgICAgICAgIGlmIChuZWVkQWxwaGFEaXZpZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhID0gYmFbbnVtQ29sb3JDb21wb25lbnRzXSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgICAgIGlmIChhbHBoYSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG5vcm1BbHBoYSA9IHNjYWxlRmFjdG9yc1tudW1Db2xvckNvbXBvbmVudHNdICogYWxwaGE7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wID0gKGludCkoY29tcCAqIGZGYWN0b3IgLyBub3JtQWxwaGEgKyAwLjVmKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYWxjVmFsdWUgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gY29tcDsKKworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgorICAgICAgICAgICAgICAgIHNob3J0IHVzYVtdID0gKHNob3J0W10pcGl4ZWw7CisgICAgICAgICAgICAgICAgY29tcCA9IHVzYVtpZHhdICYgMHhmZmZmOworICAgICAgICAgICAgICAgIGlmIChuZWVkQWxwaGFEaXZpZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhID0gdXNhW251bUNvbG9yQ29tcG9uZW50c10gJiAweGZmZmY7CisgICAgICAgICAgICAgICAgICAgIGlmIChhbHBoYSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG5vcm1BbHBoYSA9IHNjYWxlRmFjdG9yc1tudW1Db2xvckNvbXBvbmVudHNdICogYWxwaGE7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wID0gKGludCkoY29tcCAqIGZGYWN0b3IgLyBub3JtQWxwaGEgKyAwLjVmKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYWxjVmFsdWUgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gY29tcDsKKworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgorICAgICAgICAgICAgICAgIGludCBpYVtdID0gKGludFtdKXBpeGVsOworICAgICAgICAgICAgICAgIGNvbXAgPSBpYVtpZHhdOworICAgICAgICAgICAgICAgIGlmIChuZWVkQWxwaGFEaXZpZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhID0gaWFbbnVtQ29sb3JDb21wb25lbnRzXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFscGhhID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAgPSAwOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbm9ybUFscGhhID0gc2NhbGVGYWN0b3JzW251bUNvbG9yQ29tcG9uZW50c10gKiBhbHBoYTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAgPSAoaW50KShjb21wICogZkZhY3RvciAvIG5vcm1BbHBoYSArIDAuNWYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhbGNWYWx1ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBjb21wOworCisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9TSE9SVDoKKyAgICAgICAgICAgICAgICBzaG9ydCBzYVtdID0gKHNob3J0W10pcGl4ZWw7CisgICAgICAgICAgICAgICAgY29tcCA9IHNhW2lkeF07CisgICAgICAgICAgICAgICAgaWYgKG5lZWRBbHBoYURpdmlkZSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGEgPSBzYVtudW1Db2xvckNvbXBvbmVudHNdOworICAgICAgICAgICAgICAgICAgICBpZiAoYWxwaGEgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29tcCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBub3JtQWxwaGEgPSBzY2FsZUZhY3RvcnNbbnVtQ29sb3JDb21wb25lbnRzXSAqIGFscGhhOworICAgICAgICAgICAgICAgICAgICAgICAgY29tcCA9IChpbnQpKGNvbXAgKiBmRmFjdG9yIC8gbm9ybUFscGhhICsgMC41Zik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2FsY1ZhbHVlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXA7CisKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0ZMT0FUOgorICAgICAgICAgICAgICAgIGZsb2F0IGZhW10gPSAoZmxvYXRbXSlwaXhlbDsKKyAgICAgICAgICAgICAgICBpZiAobmVlZEFscGhhRGl2aWRlKSB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFscGhhID0gZmFbbnVtQ29sb3JDb21wb25lbnRzXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZhW251bUNvbG9yQ29tcG9uZW50c10gPT0gMC4wZikgeworICAgICAgICAgICAgICAgICAgICAgICAgY29tcCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wID0gKGludCkoZmFbaWR4XSAqIGZGYWN0b3IgLyBhbHBoYSArIDAuNWYpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgbm9ybUFscGhhID0gc2NhbGVGYWN0b3JzW251bUNvbG9yQ29tcG9uZW50c10gKiBhbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgY29tcCA9IChpbnQpIChjb21wICogZkZhY3RvciAvIG5vcm1BbHBoYSArIDAuNWYpOworICAgICAgICAgICAgICAgICAgICBjb21wID0gKGludCkoZmFbaWR4XSAqIGZGYWN0b3IgKyAwLjVmKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2FsY1ZhbHVlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjb21wOworICAgICAgICAgICAgICAgIHJldHVybiBjb21wOwogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKLSAgICAgICAgICAgIHNob3J0IHVzYVtdID0gKHNob3J0W10pIHBpeGVsOwotICAgICAgICAgICAgY29tcCA9IHVzYVtpZHhdICYgMHhmZmZmOwotICAgICAgICAgICAgaWYgKG5lZWRBbHBoYURpdmlkZSkgewotICAgICAgICAgICAgICAgIGludCBhbHBoYSA9IHVzYVtudW1Db2xvckNvbXBvbmVudHNdICYgMHhmZmZmOwotICAgICAgICAgICAgICAgIGlmIChhbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXAgPSAwOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgICAgIGRvdWJsZSBkYVtdID0gKGRvdWJsZVtdKXBpeGVsOworICAgICAgICAgICAgICAgIGlmIChuZWVkQWxwaGFEaXZpZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRhW251bUNvbG9yQ29tcG9uZW50c10gPT0gMC4wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAgPSAoaW50KShkYVtpZHhdICogZkZhY3RvciAvIGRhW251bUNvbG9yQ29tcG9uZW50c10gKyAwLjUpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgbm9ybUFscGhhID0gc2NhbGVGYWN0b3JzW251bUNvbG9yQ29tcG9uZW50c10gKiBhbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgY29tcCA9IChpbnQpIChjb21wICogZkZhY3RvciAvIG5vcm1BbHBoYSArIDAuNWYpOworICAgICAgICAgICAgICAgICAgICBjb21wID0gKGludCkoZGFbaWR4XSAqIGZGYWN0b3IgKyAwLjUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYWxjVmFsdWUgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNvbXA7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXA7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgotICAgICAgICAgICAgaW50IGlhW10gPSAoaW50W10pIHBpeGVsOwotICAgICAgICAgICAgY29tcCA9IGlhW2lkeF07Ci0gICAgICAgICAgICBpZiAobmVlZEFscGhhRGl2aWRlKSB7Ci0gICAgICAgICAgICAgICAgaW50IGFscGhhID0gaWFbbnVtQ29sb3JDb21wb25lbnRzXTsKLSAgICAgICAgICAgICAgICBpZiAoYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBjb21wID0gMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmbG9hdCBub3JtQWxwaGEgPSBzY2FsZUZhY3RvcnNbbnVtQ29sb3JDb21wb25lbnRzXSAqIGFscGhhOwotICAgICAgICAgICAgICAgICAgICBjb21wID0gKGludCkgKGNvbXAgKiBmRmFjdG9yIC8gbm9ybUFscGhhICsgMC41Zik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhbGNWYWx1ZSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY29tcDsKLQotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9TSE9SVDoKLSAgICAgICAgICAgIHNob3J0IHNhW10gPSAoc2hvcnRbXSkgcGl4ZWw7Ci0gICAgICAgICAgICBjb21wID0gc2FbaWR4XTsKLSAgICAgICAgICAgIGlmIChuZWVkQWxwaGFEaXZpZGUpIHsKLSAgICAgICAgICAgICAgICBpbnQgYWxwaGEgPSBzYVtudW1Db2xvckNvbXBvbmVudHNdOwotICAgICAgICAgICAgICAgIGlmIChhbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXAgPSAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IG5vcm1BbHBoYSA9IHNjYWxlRmFjdG9yc1tudW1Db2xvckNvbXBvbmVudHNdICogYWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXAgPSAoaW50KSAoY29tcCAqIGZGYWN0b3IgLyBub3JtQWxwaGEgKyAwLjVmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FsY1ZhbHVlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjb21wOwotCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0ZMT0FUOgotICAgICAgICAgICAgZmxvYXQgZmFbXSA9IChmbG9hdFtdKSBwaXhlbDsKLSAgICAgICAgICAgIGlmIChuZWVkQWxwaGFEaXZpZGUpIHsKLSAgICAgICAgICAgICAgICBmbG9hdCBhbHBoYSA9IGZhW251bUNvbG9yQ29tcG9uZW50c107Ci0gICAgICAgICAgICAgICAgaWYgKGZhW251bUNvbG9yQ29tcG9uZW50c10gPT0gMC4wZikgewotICAgICAgICAgICAgICAgICAgICBjb21wID0gMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb21wID0gKGludCkgKGZhW2lkeF0gKiBmRmFjdG9yIC8gYWxwaGEgKyAwLjVmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNvbXAgPSAoaW50KSAoZmFbaWR4XSAqIGZGYWN0b3IgKyAwLjVmKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhbGNWYWx1ZSA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm4gY29tcDsKLQotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICBkb3VibGUgZGFbXSA9IChkb3VibGVbXSkgcGl4ZWw7Ci0gICAgICAgICAgICBpZiAobmVlZEFscGhhRGl2aWRlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRhW251bUNvbG9yQ29tcG9uZW50c10gPT0gMC4wKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXAgPSAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXAgPSAoaW50KSAoZGFbaWR4XSAqIGZGYWN0b3IgLyBkYVtudW1Db2xvckNvbXBvbmVudHNdICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNvbXAgPSAoaW50KSAoZGFbaWR4XSAqIGZGYWN0b3IgKyAwLjUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FsY1ZhbHVlID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiBjb21wOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvLyBhd3QuMjE0PVRoaXMgQ29sb3IgTW9kZWwgZG9lc24ndCBzdXBwb3J0IHRoaXMgdHJhbnNmZXJUeXBlCi0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjE0IikpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIGF3dC4yMTQ9VGhpcyBDb2xvciBNb2RlbCBkb2Vzbid0IHN1cHBvcnQgdGhpcyB0cmFuc2ZlclR5cGUKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjE0IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KICAgICB9CiAKIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL0NvbXBvbmVudFNhbXBsZU1vZGVsLmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvQ29tcG9uZW50U2FtcGxlTW9kZWwuamF2YQppbmRleCAyZmY0ZjFhLi43ZjgxNDA5IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvQ29tcG9uZW50U2FtcGxlTW9kZWwuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvQ29tcG9uZW50U2FtcGxlTW9kZWwuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBJZ29yIFYuIFN0b2x5YXJvdgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuaW1hZ2U7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwpAQCAtMjUsNTUgKzI2LDczIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogVGhlIENvbXBvbmVudFNhbXBsZU1vZGVsIGNsYXNzIHJlcHJlc2VudHMgYSBzZXQgb2YgaW1hZ2UgZGF0YSB3aG9zZSAKLSAqIGVhY2ggZWxlbWVudCAtIHRoZSBzYW1wbGUgb2YgYSBwaXhlbCAtIHRha2VzIG9uZSBkYXRhIGVsZW1lbnQgb2YgCi0gKiB0aGUgRGF0YUJ1ZmZlci4gCisgKiBUaGUgQ29tcG9uZW50U2FtcGxlTW9kZWwgY2xhc3MgcmVwcmVzZW50cyBhIHNldCBvZiBpbWFnZSBkYXRhIHdob3NlIGVhY2gKKyAqIGVsZW1lbnQgLSB0aGUgc2FtcGxlIG9mIGEgcGl4ZWwgLSB0YWtlcyBvbmUgZGF0YSBlbGVtZW50IG9mIHRoZSBEYXRhQnVmZmVyLgogICogPHA+Ci0gKiBUaGUgQmFuayBpbmRpY2VzIGRlbm90ZSB0aGUgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiB0aGUgYmFuayBvZiBkYXRhIAotICogYnVmZmVycyBhbmQgYSBiYW5kIG9mIGltYWdlIGRhdGEuIFRoZSBQaXhlbCBzdHJpZGUgaXMgdGhlIG51bWJlciBvZiBkYXRhIAotICogYXJyYXkgZWxlbWVudHMgYmV0d2VlbiB0d28gc2FtcGxlcyBmb3IgdGhlIHNhbWUgYmFuZCBvbiB0aGUgc2FtZSAKLSAqIHNjYW5saW5lLiBUaGUgcGl4ZWwgc3RyaWRlIGZvciBhIEJhbmRlZFNhbXBsZU1vZGVsIGlzIG9uZS4gVGhlIFNjYW5saW5lIAotICogc3RyaWRlIHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBkYXRhIGFycmF5IGVsZW1lbnRzIGJldHdlZW4gYSAgCi0gKiBzcGVjaWZpZWQgc2FtcGxlIGFuZCB0aGUgY29ycmVzcG9uZGluZyBzYW1wbGUgaW4gdGhlIHNhbWUgY29sdW1uIGluIAotICogdGhlIG5leHQgc2NhbmxpbmUuIFRoZSBhcnJheSBvZiBiYW5kIG9mZnNldHMgZ2l2ZXMgdGhlIHN0YXJ0aW5nIAotICogb2Zmc2V0cyB3aXRoaW4gZWFjaCBkYXRhIGJhbmtzIG9mIHRoZSBpbiB0aGUgRGF0YUJ1ZmZlci4gVGhlIGJhbmsgCi0gKiBpbmRpY2VzIHJlcHJlc2VudHMgdGhlIGluZGljZXMgd2l0aGluIGVhY2ggYmFuayBvZiB0aGUgRGF0YUJ1ZmZlciAKLSAqIGNvcnJlc3BvbmRpbmcgdG8gYSBiYW5kIG9mIGltYWdlIGRhdGEuCisgKiBUaGUgQmFuayBpbmRpY2VzIGRlbm90ZSB0aGUgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiB0aGUgYmFuayBvZiBkYXRhIGJ1ZmZlcnMKKyAqIGFuZCBhIGJhbmQgb2YgaW1hZ2UgZGF0YS4gVGhlIFBpeGVsIHN0cmlkZSBpcyB0aGUgbnVtYmVyIG9mIGRhdGEgYXJyYXkKKyAqIGVsZW1lbnRzIGJldHdlZW4gdHdvIHNhbXBsZXMgZm9yIHRoZSBzYW1lIGJhbmQgb24gdGhlIHNhbWUgc2NhbmxpbmUuIFRoZQorICogcGl4ZWwgc3RyaWRlIGZvciBhIEJhbmRlZFNhbXBsZU1vZGVsIGlzIG9uZS4gVGhlIHNjYW5saW5lIHN0cmlkZSByZXByZXNlbnRzCisgKiB0aGUgbnVtYmVyIG9mIGRhdGEgYXJyYXkgZWxlbWVudHMgYmV0d2VlbiBhIHNwZWNpZmllZCBzYW1wbGUgYW5kIHRoZQorICogY29ycmVzcG9uZGluZyBzYW1wbGUgaW4gdGhlIHNhbWUgY29sdW1uIGluIHRoZSBuZXh0IHNjYW5saW5lLiBUaGUgYXJyYXkgb2YKKyAqIGJhbmQgb2Zmc2V0cyBnaXZlcyB0aGUgc3RhcnRpbmcgb2Zmc2V0cyB3aXRoaW4gZWFjaCBkYXRhIGJhbmtzIG9mIHRoZSBpbiB0aGUKKyAqIERhdGFCdWZmZXIuIFRoZSBiYW5rIGluZGljZXMgcmVwcmVzZW50cyB0aGUgaW5kaWNlcyB3aXRoaW4gZWFjaCBiYW5rIG9mIHRoZQorICogRGF0YUJ1ZmZlciBjb3JyZXNwb25kaW5nIHRvIGEgYmFuZCBvZiBpbWFnZSBkYXRhLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIENvbXBvbmVudFNhbXBsZU1vZGVsIGV4dGVuZHMgU2FtcGxlTW9kZWwgewogCi0gICAgLyoqIFRoZSBiYW5kIG9mZnNldHMgYXJyYXkgb2YgdGhpcyBDb21wb25lbnRTYW1wbGVNb2RlbC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgYmFuZCBvZmZzZXRzIGFycmF5IG9mIHRoaXMgQ29tcG9uZW50U2FtcGxlTW9kZWwuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBiYW5kT2Zmc2V0c1tdOwogCi0gICAgLyoqIFRoZSBiYW5rIGluZGljZXMgYXJyYXkgb2YgdGhpcyBDb21wb25lbnRTYW1wbGVNb2RlbC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgYmFuayBpbmRpY2VzIGFycmF5IG9mIHRoaXMgQ29tcG9uZW50U2FtcGxlTW9kZWwuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBiYW5rSW5kaWNlc1tdOwogCi0gICAgLyoqIFRoZSBudW1iZXIgb2YgYmFuZHMgaW4gdGhpcyBDb21wb25lbnRTYW1wbGVNb2RlbC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIGJhbmRzIGluIHRoaXMgQ29tcG9uZW50U2FtcGxlTW9kZWwuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBudW1CYW5kczsKIAotICAgIC8qKiBUaGUgbnVtYmVyIGJhbmtzIG9mIHRoaXMgQ29tcG9uZW50U2FtcGxlTW9kZWwuICovCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBiYW5rcyBvZiB0aGlzIENvbXBvbmVudFNhbXBsZU1vZGVsLgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgbnVtQmFua3M7CiAKLSAgICAvKiogVGhlIHNjYW5saW5lIHN0cmlkZSBvZiB0aGlzIENvbXBvbmVudFNhbXBsZU1vZGVsLiAqLworICAgIC8qKgorICAgICAqIFRoZSBzY2FubGluZSBzdHJpZGUgb2YgdGhpcyBDb21wb25lbnRTYW1wbGVNb2RlbC4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IHNjYW5saW5lU3RyaWRlOwogCi0gICAgLyoqIFRoZSBwaXhlbCBzdHJpZGUgb2YgdGhpcyBDb21wb25lbnRTYW1wbGVNb2RlbC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgcGl4ZWwgc3RyaWRlIG9mIHRoaXMgQ29tcG9uZW50U2FtcGxlTW9kZWwuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBwaXhlbFN0cmlkZTsKIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBDb21wb25lbnRTYW1wbGVNb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBwcm9wZXJ0aWVzLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBDb21wb25lbnRTYW1wbGVNb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvcGVydGllcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YVR5cGUgdGhlIGRhdGEgdHlwZSBvZiBzYW1wbGVzLgotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZSBkYXRhLgotICAgICAqIEBwYXJhbSBwaXhlbFN0cmlkZSB0aGUgcGl4ZWwgc3RyaWRlIG9mIHRoZSBpbWFnZSBkYXRhLgotICAgICAqIEBwYXJhbSBzY2FubGluZVN0cmlkZSB0aGUgc2NhbmxpbmUgc3RyaWRlIG9mIHRoZSBpbWFnZSBkYXRhLgotICAgICAqIEBwYXJhbSBiYW5rSW5kaWNlcyB0aGUgYXJyYXkgb2YgdGhlIGJhbmsgaW5kaWNlcy4KLSAgICAgKiBAcGFyYW0gYmFuZE9mZnNldHMgdGhlIGFycmF5IG9mIHRoZSBiYW5kIG9mZnNldHMuCisgICAgICogQHBhcmFtIGRhdGFUeXBlCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSB0eXBlIG9mIHNhbXBsZXMuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gcGl4ZWxTdHJpZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwaXhlbCBzdHJpZGUgb2YgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIHNjYW5saW5lU3RyaWRlCisgICAgICogICAgICAgICAgICB0aGUgc2NhbmxpbmUgc3RyaWRlIG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBiYW5rSW5kaWNlcworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIHRoZSBiYW5rIGluZGljZXMuCisgICAgICogQHBhcmFtIGJhbmRPZmZzZXRzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgdGhlIGJhbmQgb2Zmc2V0cy4KICAgICAgKi8KLSAgICBwdWJsaWMgQ29tcG9uZW50U2FtcGxlTW9kZWwoaW50IGRhdGFUeXBlLCBpbnQgdywgaW50IGgsIGludCBwaXhlbFN0cmlkZSwKLSAgICAgICAgICAgIGludCBzY2FubGluZVN0cmlkZSwgaW50IGJhbmtJbmRpY2VzW10sIGludCBiYW5kT2Zmc2V0c1tdKSB7CisgICAgcHVibGljIENvbXBvbmVudFNhbXBsZU1vZGVsKGludCBkYXRhVHlwZSwgaW50IHcsIGludCBoLCBpbnQgcGl4ZWxTdHJpZGUsIGludCBzY2FubGluZVN0cmlkZSwKKyAgICAgICAgICAgIGludCBiYW5rSW5kaWNlc1tdLCBpbnQgYmFuZE9mZnNldHNbXSkgewogCiAgICAgICAgIHN1cGVyKGRhdGFUeXBlLCB3LCBoLCBiYW5kT2Zmc2V0cy5sZW5ndGgpOwogCkBAIC0xMTMsMTggKzEzMiwyMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBDb21wb25lbnRTYW1wbGVNb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBwcm9wZXJ0aWVzLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBDb21wb25lbnRTYW1wbGVNb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvcGVydGllcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YVR5cGUgdGhlIGRhdGEgdHlwZSBvZiB0aGUgc2FtcGxlcy4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIGltYWdlIGRhdGEuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gcGl4ZWxTdHJpZGUgdGhlIHBpeGVsIHN0cmlkZSBvZiB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gc2NhbmxpbmVTdHJpZGUgdGhlIHNjYW5saW5lIHN0cmlkZSBvZiB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gYmFuZE9mZnNldHMgdGhlIGJhbmQgb2Zmc2V0cy4KKyAgICAgKiBAcGFyYW0gZGF0YVR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHNhbXBsZXMuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gcGl4ZWxTdHJpZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwaXhlbCBzdHJpZGUgb2YgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIHNjYW5saW5lU3RyaWRlCisgICAgICogICAgICAgICAgICB0aGUgc2NhbmxpbmUgc3RyaWRlIG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBiYW5kT2Zmc2V0cworICAgICAqICAgICAgICAgICAgdGhlIGJhbmQgb2Zmc2V0cy4KICAgICAgKi8KLSAgICBwdWJsaWMgQ29tcG9uZW50U2FtcGxlTW9kZWwoaW50IGRhdGFUeXBlLCBpbnQgdywgaW50IGgsIGludCBwaXhlbFN0cmlkZSwKLSAgICAgICAgICAgIGludCBzY2FubGluZVN0cmlkZSwgaW50IGJhbmRPZmZzZXRzW10pIHsKKyAgICBwdWJsaWMgQ29tcG9uZW50U2FtcGxlTW9kZWwoaW50IGRhdGFUeXBlLCBpbnQgdywgaW50IGgsIGludCBwaXhlbFN0cmlkZSwgaW50IHNjYW5saW5lU3RyaWRlLAorICAgICAgICAgICAgaW50IGJhbmRPZmZzZXRzW10pIHsKIAogICAgICAgICBzdXBlcihkYXRhVHlwZSwgdywgaCwgYmFuZE9mZnNldHMubGVuZ3RoKTsKICAgICAgICAgaWYgKHBpeGVsU3RyaWRlIDwgMCkgewpAQCAtMTU2LDgxICsxODAsODEgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNjMiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogICAgICAgICBzd2l0Y2ggKGRhdGFUeXBlKSB7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6Ci0gICAgICAgICAgICBieXRlIGJkYXRhW107Ci0gICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBiZGF0YSA9IG5ldyBieXRlW251bUJhbmRzXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYmRhdGEgPSAoYnl0ZVtdKSBvYmo7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgorICAgICAgICAgICAgICAgIGJ5dGUgYmRhdGFbXTsKKyAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYmRhdGEgPSBuZXcgYnl0ZVtudW1CYW5kc107CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYmRhdGEgPSAoYnl0ZVtdKW9iajsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykgewotICAgICAgICAgICAgICAgIGJkYXRhW2ldID0gKGJ5dGUpIGdldFNhbXBsZSh4LCB5LCBpLCBkYXRhKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYmRhdGFbaV0gPSAoYnl0ZSlnZXRTYW1wbGUoeCwgeSwgaSwgZGF0YSk7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBvYmogPSBiZGF0YTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIG9iaiA9IGJkYXRhOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1NIT1JUOgotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6Ci0gICAgICAgICAgICBzaG9ydCBzZGF0YVtdOwotICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2RhdGEgPSBuZXcgc2hvcnRbbnVtQmFuZHNdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzZGF0YSA9IChzaG9ydFtdKSBvYmo7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9TSE9SVDoKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKKyAgICAgICAgICAgICAgICBzaG9ydCBzZGF0YVtdOworICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzZGF0YSA9IG5ldyBzaG9ydFtudW1CYW5kc107CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2RhdGEgPSAoc2hvcnRbXSlvYmo7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBzZGF0YVtpXSA9IChzaG9ydCkgZ2V0U2FtcGxlKHgsIHksIGksIGRhdGEpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBzZGF0YVtpXSA9IChzaG9ydClnZXRTYW1wbGUoeCwgeSwgaSwgZGF0YSk7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBvYmogPSBzZGF0YTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIG9iaiA9IHNkYXRhOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKLSAgICAgICAgICAgIGludCBpZGF0YVtdOwotICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWRhdGEgPSBuZXcgaW50W251bUJhbmRzXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWRhdGEgPSAoaW50W10pIG9iajsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKKyAgICAgICAgICAgICAgICBpbnQgaWRhdGFbXTsKKyAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWRhdGEgPSBuZXcgaW50W251bUJhbmRzXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZGF0YSA9IChpbnRbXSlvYmo7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZGF0YVtpXSA9IGdldFNhbXBsZSh4LCB5LCBpLCBkYXRhKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWRhdGFbaV0gPSBnZXRTYW1wbGUoeCwgeSwgaSwgZGF0YSk7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBvYmogPSBpZGF0YTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIG9iaiA9IGlkYXRhOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0ZMT0FUOgotICAgICAgICAgICAgZmxvYXQgZmRhdGFbXTsKLSAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZkYXRhID0gbmV3IGZsb2F0W251bUJhbmRzXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmRhdGEgPSAoZmxvYXRbXSkgb2JqOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfRkxPQVQ6CisgICAgICAgICAgICAgICAgZmxvYXQgZmRhdGFbXTsKKyAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZmRhdGEgPSBuZXcgZmxvYXRbbnVtQmFuZHNdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZkYXRhID0gKGZsb2F0W10pb2JqOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZmRhdGFbaV0gPSBnZXRTYW1wbGVGbG9hdCh4LCB5LCBpLCBkYXRhKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZmRhdGFbaV0gPSBnZXRTYW1wbGVGbG9hdCh4LCB5LCBpLCBkYXRhKTsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG9iaiA9IGZkYXRhOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgb2JqID0gZmRhdGE7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfRE9VQkxFOgotICAgICAgICAgICAgZG91YmxlIGRkYXRhW107Ci0gICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkZGF0YSA9IG5ldyBkb3VibGVbbnVtQmFuZHNdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkZGF0YSA9IChkb3VibGVbXSkgb2JqOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgICAgIGRvdWJsZSBkZGF0YVtdOworICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBkZGF0YSA9IG5ldyBkb3VibGVbbnVtQmFuZHNdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRkYXRhID0gKGRvdWJsZVtdKW9iajsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykgewotICAgICAgICAgICAgICAgIGRkYXRhW2ldID0gZ2V0U2FtcGxlRG91YmxlKHgsIHksIGksIGRhdGEpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBkZGF0YVtpXSA9IGdldFNhbXBsZURvdWJsZSh4LCB5LCBpLCBkYXRhKTsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG9iaiA9IGRkYXRhOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgb2JqID0gZGRhdGE7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gb2JqOwpAQCAtMjQzLDc2ICsyNjcsNzUgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNjMiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogICAgICAgICBzd2l0Y2ggKGRhdGFUeXBlKSB7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6Ci0gICAgICAgICAgICBieXRlIGJhcnJbXSA9IChieXRlW10pIG9iajsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykgewotICAgICAgICAgICAgICAgIHNldFNhbXBsZSh4LCB5LCBpLCBiYXJyW2ldICYgMHhmZiwgZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6CisgICAgICAgICAgICAgICAgYnl0ZSBiYXJyW10gPSAoYnl0ZVtdKW9iajsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0U2FtcGxlKHgsIHksIGksIGJhcnJbaV0gJiAweGZmLCBkYXRhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfU0hPUlQ6Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKLSAgICAgICAgICAgIHNob3J0IHNhcnJbXSA9IChzaG9ydFtdKSBvYmo7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBzZXRTYW1wbGUoeCwgeSwgaSwgc2FycltpXSAmIDB4ZmZmZiwgZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1NIT1JUOgorICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgorICAgICAgICAgICAgICAgIHNob3J0IHNhcnJbXSA9IChzaG9ydFtdKW9iajsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0U2FtcGxlKHgsIHksIGksIHNhcnJbaV0gJiAweGZmZmYsIGRhdGEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6Ci0gICAgICAgICAgICBpbnQgaWFycltdID0gKGludFtdKSBvYmo7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBzZXRTYW1wbGUoeCwgeSwgaSwgaWFycltpXSwgZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKKyAgICAgICAgICAgICAgICBpbnQgaWFycltdID0gKGludFtdKW9iajsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0U2FtcGxlKHgsIHksIGksIGlhcnJbaV0sIGRhdGEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9GTE9BVDoKLSAgICAgICAgICAgIGZsb2F0IGZhcnJbXSA9IChmbG9hdFtdKSBvYmo7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBzZXRTYW1wbGUoeCwgeSwgaSwgZmFycltpXSwgZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0ZMT0FUOgorICAgICAgICAgICAgICAgIGZsb2F0IGZhcnJbXSA9IChmbG9hdFtdKW9iajsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0U2FtcGxlKHgsIHksIGksIGZhcnJbaV0sIGRhdGEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICBkb3VibGUgZGFycltdID0gKGRvdWJsZVtdKSBvYmo7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBzZXRTYW1wbGUoeCwgeSwgaSwgZGFycltpXSwgZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0RPVUJMRToKKyAgICAgICAgICAgICAgICBkb3VibGUgZGFycltdID0gKGRvdWJsZVtdKW9iajsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0U2FtcGxlKHgsIHksIGksIGRhcnJbaV0sIGRhdGEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgogICAgICAqIENvbXBhcmVzIHRoaXMgQ29tcG9uZW50U2FtcGxlTW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIE9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbyB0aGUgT2JqZWN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIG9iamVjdCBpcyBhIENvbXBvbmVudFNhbXBsZU1vZGVsIHdpdGggCi0gICAgICogaWRlbnRpY2FsIGRhdGEgdmFsdWVzIHRvIHRoaXMgQ29tcG9uZW50U2FtcGxlTW9kZWwsIGZhbHNlIG90aGVyd2lzZS4gCisgICAgICogQHBhcmFtIG8KKyAgICAgKiAgICAgICAgICAgIHRoZSBPYmplY3QuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgb2JqZWN0IGlzIGEgQ29tcG9uZW50U2FtcGxlTW9kZWwgd2l0aCBpZGVudGljYWwgZGF0YQorICAgICAqICAgICAgICAgdmFsdWVzIHRvIHRoaXMgQ29tcG9uZW50U2FtcGxlTW9kZWwsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKICAgICAgICAgaWYgKChvID09IG51bGwpIHx8ICEobyBpbnN0YW5jZW9mIENvbXBvbmVudFNhbXBsZU1vZGVsKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgICAgIENvbXBvbmVudFNhbXBsZU1vZGVsIG1vZGVsID0gKENvbXBvbmVudFNhbXBsZU1vZGVsKSBvOwotICAgICAgICByZXR1cm4gdGhpcy53aWR0aCA9PSBtb2RlbC53aWR0aCAmJiB0aGlzLmhlaWdodCA9PSBtb2RlbC5oZWlnaHQgJiYKLSAgICAgICAgICAgICAgIHRoaXMubnVtQmFuZHMgPT0gbW9kZWwubnVtQmFuZHMgJiYKLSAgICAgICAgICAgICAgIHRoaXMuZGF0YVR5cGUgPT0gbW9kZWwuZGF0YVR5cGUgJiYKLSAgICAgICAgICAgICAgIEFycmF5cy5lcXVhbHModGhpcy5iYW5kT2Zmc2V0cywgbW9kZWwuYmFuZE9mZnNldHMpICYmCi0gICAgICAgICAgICAgICBBcnJheXMuZXF1YWxzKHRoaXMuYmFua0luZGljZXMsIG1vZGVsLmJhbmtJbmRpY2VzKSAmJgotICAgICAgICAgICAgICAgdGhpcy5udW1CYW5kcyA9PSBtb2RlbC5udW1CYW5kcyAmJgotICAgICAgICAgICAgICAgdGhpcy5udW1CYW5rcyA9PSBtb2RlbC5udW1CYW5rcyAmJgotICAgICAgICAgICAgICAgdGhpcy5zY2FubGluZVN0cmlkZSA9PSBtb2RlbC5zY2FubGluZVN0cmlkZSAmJgotICAgICAgICAgICAgICAgdGhpcy5waXhlbFN0cmlkZSA9PSBtb2RlbC5waXhlbFN0cmlkZTsKKyAgICAgICAgQ29tcG9uZW50U2FtcGxlTW9kZWwgbW9kZWwgPSAoQ29tcG9uZW50U2FtcGxlTW9kZWwpbzsKKyAgICAgICAgcmV0dXJuIHRoaXMud2lkdGggPT0gbW9kZWwud2lkdGggJiYgdGhpcy5oZWlnaHQgPT0gbW9kZWwuaGVpZ2h0CisgICAgICAgICAgICAgICAgJiYgdGhpcy5udW1CYW5kcyA9PSBtb2RlbC5udW1CYW5kcyAmJiB0aGlzLmRhdGFUeXBlID09IG1vZGVsLmRhdGFUeXBlCisgICAgICAgICAgICAgICAgJiYgQXJyYXlzLmVxdWFscyh0aGlzLmJhbmRPZmZzZXRzLCBtb2RlbC5iYW5kT2Zmc2V0cykKKyAgICAgICAgICAgICAgICAmJiBBcnJheXMuZXF1YWxzKHRoaXMuYmFua0luZGljZXMsIG1vZGVsLmJhbmtJbmRpY2VzKQorICAgICAgICAgICAgICAgICYmIHRoaXMubnVtQmFuZHMgPT0gbW9kZWwubnVtQmFuZHMgJiYgdGhpcy5udW1CYW5rcyA9PSBtb2RlbC5udW1CYW5rcworICAgICAgICAgICAgICAgICYmIHRoaXMuc2NhbmxpbmVTdHJpZGUgPT0gbW9kZWwuc2NhbmxpbmVTdHJpZGUKKyAgICAgICAgICAgICAgICAmJiB0aGlzLnBpeGVsU3RyaWRlID09IG1vZGVsLnBpeGVsU3RyaWRlOwogICAgIH0KIAotICAgIC8qKiAKKyAgICAvKioKICAgICAgKiBAc2VlIGphdmEuYXd0LmltYWdlLlNhbXBsZU1vZGVsI2NyZWF0ZVN1YnNldFNhbXBsZU1vZGVsKGludFtdKQogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTYW1wbGVNb2RlbCBjcmVhdGVTdWJzZXRTYW1wbGVNb2RlbChpbnQgYmFuZHNbXSkgewogICAgICAgICBpZiAoYmFuZHMubGVuZ3RoID4gdGhpcy5udW1CYW5kcykgewotICAgICAgICAgICAgLy8gYXd0LjY0PVRoZSBudW1iZXIgb2YgdGhlIGJhbmRzIGluIHRoZSBzdWJzZXQgaXMgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgYmFuZHMgaW4gdGhlIHNhbXBsZSBtb2RlbAorICAgICAgICAgICAgLy8gYXd0LjY0PVRoZSBudW1iZXIgb2YgdGhlIGJhbmRzIGluIHRoZSBzdWJzZXQgaXMgZ3JlYXRlciB0aGFuIHRoZQorICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGJhbmRzIGluIHRoZSBzYW1wbGUgbW9kZWwKICAgICAgICAgICAgIHRocm93IG5ldyBSYXN0ZXJGb3JtYXRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNjQiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCkBAIC0zMjQsMTUgKzM0NywxNSBAQAogICAgICAgICAgICAgb2Zmc2V0c1tpXSA9IGJhbmRPZmZzZXRzW2JhbmRzW2ldXTsKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50U2FtcGxlTW9kZWwoZGF0YVR5cGUsIHdpZHRoLCBoZWlnaHQsIHBpeGVsU3RyaWRlLAotICAgICAgICAgICAgICAgIHNjYW5saW5lU3RyaWRlLCBpbmRpY2VzLCBvZmZzZXRzKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRTYW1wbGVNb2RlbChkYXRhVHlwZSwgd2lkdGgsIGhlaWdodCwgcGl4ZWxTdHJpZGUsIHNjYW5saW5lU3RyaWRlLAorICAgICAgICAgICAgICAgIGluZGljZXMsIG9mZnNldHMpOwogCiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFNhbXBsZU1vZGVsIGNyZWF0ZUNvbXBhdGlibGVTYW1wbGVNb2RlbChpbnQgdywgaW50IGgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRTYW1wbGVNb2RlbChkYXRhVHlwZSwgdywgaCwgcGl4ZWxTdHJpZGUsCi0gICAgICAgICAgICAgICAgcGl4ZWxTdHJpZGUgKiB3LCBiYW5rSW5kaWNlcywgYmFuZE9mZnNldHMpOworICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudFNhbXBsZU1vZGVsKGRhdGFUeXBlLCB3LCBoLCBwaXhlbFN0cmlkZSwgcGl4ZWxTdHJpZGUgKiB3LCBiYW5rSW5kaWNlcywKKyAgICAgICAgICAgICAgICBiYW5kT2Zmc2V0cyk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0zNjYsOCArMzg5LDcgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNjMiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBkYXRhLmdldEVsZW0oYmFua0luZGljZXNbYl0sIHkgKiBzY2FubGluZVN0cmlkZSArCi0gICAgICAgICAgICAgICAgeCAqIHBpeGVsU3RyaWRlICsgYmFuZE9mZnNldHNbYl0pOworICAgICAgICByZXR1cm4gZGF0YS5nZXRFbGVtKGJhbmtJbmRpY2VzW2JdLCB5ICogc2NhbmxpbmVTdHJpZGUgKyB4ICogcGl4ZWxTdHJpZGUgKyBiYW5kT2Zmc2V0c1tiXSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0zNzcsOCArMzk5LDggQEAKICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNjMiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBkYXRhLmdldEVsZW1GbG9hdChiYW5rSW5kaWNlc1tiXSwgeSAqIHNjYW5saW5lU3RyaWRlICsKLSAgICAgICAgICAgICAgICB4ICogcGl4ZWxTdHJpZGUgKyBiYW5kT2Zmc2V0c1tiXSk7CisgICAgICAgIHJldHVybiBkYXRhLmdldEVsZW1GbG9hdChiYW5rSW5kaWNlc1tiXSwgeSAqIHNjYW5saW5lU3RyaWRlICsgeCAqIHBpeGVsU3RyaWRlCisgICAgICAgICAgICAgICAgKyBiYW5kT2Zmc2V0c1tiXSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0zODgsMTUgKzQxMCwxNCBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC42MyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIGRhdGEuZ2V0RWxlbURvdWJsZShiYW5rSW5kaWNlc1tiXSwgeSAqIHNjYW5saW5lU3RyaWRlICsKLSAgICAgICAgICAgICAgICB4ICogcGl4ZWxTdHJpZGUgKyBiYW5kT2Zmc2V0c1tiXSk7CisgICAgICAgIHJldHVybiBkYXRhLmdldEVsZW1Eb3VibGUoYmFua0luZGljZXNbYl0sIHkgKiBzY2FubGluZVN0cmlkZSArIHggKiBwaXhlbFN0cmlkZQorICAgICAgICAgICAgICAgICsgYmFuZE9mZnNldHNbYl0pOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnRbXSBnZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBpQXJyYXlbXSwKLSAgICAgICAgICAgIERhdGFCdWZmZXIgZGF0YSkgewotICAgICAgICBpZiAoeCA8IDAgfHwgeSA8IDAgfHwgeCA+IHRoaXMud2lkdGggfHwgeCArIHcgPiB0aGlzLndpZHRoCi0gICAgICAgICAgICAgICAgfHwgeSA+IHRoaXMuaGVpZ2h0IHx8IHkgKyBoID4gdGhpcy5oZWlnaHQpIHsKKyAgICBwdWJsaWMgaW50W10gZ2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgaUFycmF5W10sIERhdGFCdWZmZXIgZGF0YSkgeworICAgICAgICBpZiAoeCA8IDAgfHwgeSA8IDAgfHwgeCA+IHRoaXMud2lkdGggfHwgeCArIHcgPiB0aGlzLndpZHRoIHx8IHkgPiB0aGlzLmhlaWdodAorICAgICAgICAgICAgICAgIHx8IHkgKyBoID4gdGhpcy5oZWlnaHQpIHsKICAgICAgICAgICAgIC8vIGF3dC42Mz1Db29yZGluYXRlcyBhcmUgbm90IGluIGJvdW5kcwogICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC42MyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CkBAIC00MjEsOCArNDQyLDcgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBpQXJyYXlbXSwKLSAgICAgICAgICAgIERhdGFCdWZmZXIgZGF0YSkgeworICAgIHB1YmxpYyB2b2lkIHNldFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGlBcnJheVtdLCBEYXRhQnVmZmVyIGRhdGEpIHsKICAgICAgICAgaWYgKHggPCAwIHx8IHkgPCAwIHx8IHggKyB3ID4gdGhpcy53aWR0aCB8fCB5ICsgaCA+IHRoaXMuaGVpZ2h0KSB7CiAgICAgICAgICAgICAvLyBhd3QuNjM9Q29vcmRpbmF0ZXMgYXJlIG5vdCBpbiBib3VuZHMKICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNjMiKSk7IC8vJE5PTi1OTFMtMSQKQEAgLTQ0NCwxMyArNDY0LDExIEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjYzIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICBkYXRhLnNldEVsZW0oYmFua0luZGljZXNbYl0sIHkgKiBzY2FubGluZVN0cmlkZSArIHggKiBwaXhlbFN0cmlkZQotICAgICAgICAgICAgICAgICsgYmFuZE9mZnNldHNbYl0sIHMpOworICAgICAgICBkYXRhLnNldEVsZW0oYmFua0luZGljZXNbYl0sIHkgKiBzY2FubGluZVN0cmlkZSArIHggKiBwaXhlbFN0cmlkZSArIGJhbmRPZmZzZXRzW2JdLCBzKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50W10gZ2V0U2FtcGxlcyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGIsIGludCBpQXJyYXlbXSwKLSAgICAgICAgICAgIERhdGFCdWZmZXIgZGF0YSkgeworICAgIHB1YmxpYyBpbnRbXSBnZXRTYW1wbGVzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgYiwgaW50IGlBcnJheVtdLCBEYXRhQnVmZmVyIGRhdGEpIHsKICAgICAgICAgaWYgKHggPCAwIHx8IHkgPCAwIHx8IHggKyB3ID4gdGhpcy53aWR0aCB8fCB5ICsgaCA+IHRoaXMuaGVpZ2h0KSB7CiAgICAgICAgICAgICAvLyBhd3QuNjM9Q29vcmRpbmF0ZXMgYXJlIG5vdCBpbiBib3VuZHMKICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNjMiKSk7IC8vJE5PTi1OTFMtMSQKQEAgLTQ2Myw3ICs0ODEsNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc2FtcGxlcyA9IGlBcnJheTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBpZiAoZGF0YSA9PSBudWxsKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjk1PWRhdGEgaXMgbnVsbAogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI5NSIpKTsgLy8kTk9OLU5MUy0xJApAQCAtNDc5LDggKzQ5Nyw3IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U2FtcGxlcyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGIsIGludCBpQXJyYXlbXSwKLSAgICAgICAgICAgIERhdGFCdWZmZXIgZGF0YSkgeworICAgIHB1YmxpYyB2b2lkIHNldFNhbXBsZXMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBiLCBpbnQgaUFycmF5W10sIERhdGFCdWZmZXIgZGF0YSkgewogICAgICAgICBpZiAoeCA8IDAgfHwgeSA8IDAgfHwgeCArIHcgPiB0aGlzLndpZHRoIHx8IHkgKyBoID4gdGhpcy5oZWlnaHQpIHsKICAgICAgICAgICAgIC8vIGF3dC42Mz1Db29yZGluYXRlcyBhcmUgbm90IGluIGJvdW5kcwogICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC42MyIpKTsgLy8kTk9OLU5MUy0xJApAQCAtNTAwLDggKzUxNyw3IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjYzIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICBkYXRhLnNldEVsZW1GbG9hdChiYW5rSW5kaWNlc1tiXSwgeSAqIHNjYW5saW5lU3RyaWRlICsKLSAgICAgICAgICAgICAgICB4ICogcGl4ZWxTdHJpZGUgKyBiYW5kT2Zmc2V0c1tiXSwgcyk7CisgICAgICAgIGRhdGEuc2V0RWxlbUZsb2F0KGJhbmtJbmRpY2VzW2JdLCB5ICogc2NhbmxpbmVTdHJpZGUgKyB4ICogcGl4ZWxTdHJpZGUgKyBiYW5kT2Zmc2V0c1tiXSwgcyk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC01MTEsOCArNTI3LDkgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNjMiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCi0gICAgICAgIGRhdGEuc2V0RWxlbURvdWJsZShiYW5rSW5kaWNlc1tiXSwgeSAqIHNjYW5saW5lU3RyaWRlICsKLSAgICAgICAgICAgICAgICB4ICogcGl4ZWxTdHJpZGUgKyBiYW5kT2Zmc2V0c1tiXSwgcyk7CisgICAgICAgIGRhdGEKKyAgICAgICAgICAgICAgICAuc2V0RWxlbURvdWJsZShiYW5rSW5kaWNlc1tiXSwgeSAqIHNjYW5saW5lU3RyaWRlICsgeCAqIHBpeGVsU3RyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICArIGJhbmRPZmZzZXRzW2JdLCBzKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTUyNSwyOCArNTQyLDI3IEBACiAgICAgICAgICAgICAgICAgbWF4T2Zmc2V0ID0gYmFuZE9mZnNldHNbaV07CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaW50IHNpemUgPSAoaGVpZ2h0IC0gMSkgKiBzY2FubGluZVN0cmlkZSArCi0gICAgICAgICh3aWR0aCAtIDEpICogcGl4ZWxTdHJpZGUgKyBtYXhPZmZzZXQgKyAxOworICAgICAgICBpbnQgc2l6ZSA9IChoZWlnaHQgLSAxKSAqIHNjYW5saW5lU3RyaWRlICsgKHdpZHRoIC0gMSkgKiBwaXhlbFN0cmlkZSArIG1heE9mZnNldCArIDE7CiAKICAgICAgICAgc3dpdGNoIChkYXRhVHlwZSkgewotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgotICAgICAgICAgICAgZGF0YSA9IG5ldyBEYXRhQnVmZmVyQnl0ZShzaXplLCBudW1CYW5rcyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfU0hPUlQ6Ci0gICAgICAgICAgICBkYXRhID0gbmV3IERhdGFCdWZmZXJTaG9ydChzaXplLCBudW1CYW5rcyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgotICAgICAgICAgICAgZGF0YSA9IG5ldyBEYXRhQnVmZmVyVVNob3J0KHNpemUsIG51bUJhbmtzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6Ci0gICAgICAgICAgICBkYXRhID0gbmV3IERhdGFCdWZmZXJJbnQoc2l6ZSwgbnVtQmFua3MpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0ZMT0FUOgotICAgICAgICAgICAgZGF0YSA9IG5ldyBEYXRhQnVmZmVyRmxvYXQoc2l6ZSwgbnVtQmFua3MpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0RPVUJMRToKLSAgICAgICAgICAgIGRhdGEgPSBuZXcgRGF0YUJ1ZmZlckRvdWJsZShzaXplLCBudW1CYW5rcyk7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6CisgICAgICAgICAgICAgICAgZGF0YSA9IG5ldyBEYXRhQnVmZmVyQnl0ZShzaXplLCBudW1CYW5rcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9TSE9SVDoKKyAgICAgICAgICAgICAgICBkYXRhID0gbmV3IERhdGFCdWZmZXJTaG9ydChzaXplLCBudW1CYW5rcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6CisgICAgICAgICAgICAgICAgZGF0YSA9IG5ldyBEYXRhQnVmZmVyVVNob3J0KHNpemUsIG51bUJhbmtzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKKyAgICAgICAgICAgICAgICBkYXRhID0gbmV3IERhdGFCdWZmZXJJbnQoc2l6ZSwgbnVtQmFua3MpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfRkxPQVQ6CisgICAgICAgICAgICAgICAgZGF0YSA9IG5ldyBEYXRhQnVmZmVyRmxvYXQoc2l6ZSwgbnVtQmFua3MpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgICAgIGRhdGEgPSBuZXcgRGF0YUJ1ZmZlckRvdWJsZShzaXplLCBudW1CYW5rcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gZGF0YTsKQEAgLTU1NiwxMCArNTcyLDEyIEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgb2Zmc2V0IG9mIHRoZSBzcGVjaWZpZWQgYmFuZCBvZiB0aGUgc3BlY2lmaWVkIHBpeGVsLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLiAKLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4KLSAgICAgKiBAcGFyYW0gYiB0aGUgYmFuZC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLgorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgYmFuZC4KICAgICAgKiBAcmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIHNwZWNpZmllZCBiYW5kIG9mIHRoZSBzcGVjaWZpZWQgcGl4ZWwuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRPZmZzZXQoaW50IHgsIGludCB5LCBpbnQgYikgewpAQCAtNTY5LDkgKzU4NywxMCBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG9mZnNldCBvZiB0aGUgZmlyc3QgYmFuZCBvZiB0aGUgc3BlY2lmaWVkIHBpeGVsLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgcGl4ZWwuIAotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgcGl4ZWwuCi0gICAgICogCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgcGl4ZWwuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgcGl4ZWwuCiAgICAgICogQHJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBiYW5kIG9mIHRoZSBzcGVjaWZpZWQgcGl4ZWwuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRPZmZzZXQoaW50IHgsIGludCB5KSB7CkBAIC01OTUsOCArNjE0LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIGFycmF5IG9mIGJhbmsgaW5kaWNlcyBjb3JyZXNwb25kaW5nIHRvIHRoaXMgCi0gICAgICogQ29tcG9uZW50U2FtcGxlTW9kZWwuCisgICAgICogR2V0cyBhbiBhcnJheSBvZiBiYW5rIGluZGljZXMgY29ycmVzcG9uZGluZyB0byB0aGlzIENvbXBvbmVudFNhbXBsZU1vZGVsLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGJhbmsgaW5kaWNlcy4KICAgICAgKi8KQEAgLTYwNSw3ICs2MjMsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYW4gYXJyYXkgb2YgdGhlIGJhbmQgb2Zmc2V0cyBjb3JyZXNwb25kaW5nIHRvIHRoaXMgCisgICAgICogR2V0cyBhbiBhcnJheSBvZiB0aGUgYmFuZCBvZmZzZXRzIGNvcnJlc3BvbmRpbmcgdG8gdGhpcwogICAgICAqIENvbXBvbmVudFNhbXBsZU1vZGVsLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGJhbmQgb2Zmc2V0cy4KQEAgLTY3Myw3ICs2OTEsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHBpeGVsIHN0cmlkZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwaXhlbCBzdHJpZGUKKyAgICAgKiBAcmV0dXJuIHRoZSBwaXhlbCBzdHJpZGUuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGludCBnZXRQaXhlbFN0cmlkZSgpIHsKICAgICAgICAgcmV0dXJuIHBpeGVsU3RyaWRlOwpAQCAtNjg1LDYgKzcwMywzIEBACiAgICAgfQogCiB9Ci0KLQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvQ29udm9sdmVPcC5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL0NvbnZvbHZlT3AuamF2YQppbmRleCBiYjU4OGJjLi42ZWI4OTA5IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvQ29udm9sdmVPcC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9Db252b2x2ZU9wLmphdmEKQEAgLTMyLDQ3ICszMiw1NyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFRoZSBDb252b2x2ZU9wIGNsYXNzIGNvbnZvbHZlcyBmcm9tIHRoZSBzb3VyY2UgZGF0YQotICogdG8gdGhlIGRlc3RpbmF0aW9uIHVzaW5nIGEgY29udm9sdXRpb24ga2VybmVsLiAKLSAqIEVhY2ggb3V0cHV0IHBpeGVsIGlzIHJlcHJlc2VudGVkIGFzIHRoZSByZXN1bHQgb2YgbXVsdGlwbHlpbmcgCi0gKiB0aGUga2VybmVsIGFuZCB0aGUgc3Vycm91bmQgb2YgdGhlIGlucHV0IHBpeGVsLgorICogVGhlIENvbnZvbHZlT3AgY2xhc3MgY29udm9sdmVzIGZyb20gdGhlIHNvdXJjZSBkYXRhIHRvIHRoZSBkZXN0aW5hdGlvbiB1c2luZworICogYSBjb252b2x1dGlvbiBrZXJuZWwuIEVhY2ggb3V0cHV0IHBpeGVsIGlzIHJlcHJlc2VudGVkIGFzIHRoZSByZXN1bHQgb2YKKyAqIG11bHRpcGx5aW5nIHRoZSBrZXJuZWwgYW5kIHRoZSBzdXJyb3VuZCBvZiB0aGUgaW5wdXQgcGl4ZWwuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgQ29udm9sdmVPcCBpbXBsZW1lbnRzIEJ1ZmZlcmVkSW1hZ2VPcCwgUmFzdGVyT3AgewogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBFREdFX1pFUk9fRklMTCBpbmRpY2F0ZXMgdGhhdCBwaXhlbHMgYXQgdGhlIGVkZ2Ugb2YgCi0gICAgICogdGhlIGRlc3RpbmF0aW9uIGltYWdlIGFyZSBzZXQgdG8gemVyby4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEVER0VfWkVST19GSUxMIGluZGljYXRlcyB0aGF0IHBpeGVscyBhdCB0aGUgZWRnZSBvZiB0aGUKKyAgICAgKiBkZXN0aW5hdGlvbiBpbWFnZSBhcmUgc2V0IHRvIHplcm8uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRURHRV9aRVJPX0ZJTEwgPSAwOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBFREdFX05PX09QIGluZGljYXRlcyB0aGF0IHBpeGVscyBhdCB0aGUgZWRnZSBvZiAKLSAgICAgKiB0aGUgc291cmNlIGltYWdlIGFyZSBjb252ZXJ0ZWQgdG8gdGhlIGVkZ2UgcGl4ZWxzIGluIHRoZSAKLSAgICAgKiBkZXN0aW5hdGlvbiB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgRURHRV9OT19PUCBpbmRpY2F0ZXMgdGhhdCBwaXhlbHMgYXQgdGhlIGVkZ2Ugb2YgdGhlIHNvdXJjZQorICAgICAqIGltYWdlIGFyZSBjb252ZXJ0ZWQgdG8gdGhlIGVkZ2UgcGl4ZWxzIGluIHRoZSBkZXN0aW5hdGlvbiB3aXRob3V0CisgICAgICogbW9kaWZpY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVER0VfTk9fT1AgPSAxOwogCi0gICAgLyoqIFRoZSBrZXJuZWwuICovCisgICAgLyoqCisgICAgICogVGhlIGtlcm5lbC4KKyAgICAgKi8KICAgICBwcml2YXRlIEtlcm5lbCBrZXJuZWw7Ci0gICAgCi0gICAgLyoqIFRoZSBlZGdlIGNvbmQuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgZWRnZSBjb25kLgorICAgICAqLwogICAgIHByaXZhdGUgaW50IGVkZ2VDb25kOwotICAgIAotICAgIC8qKiBUaGUgcmhzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHJocy4KKyAgICAgKi8KICAgICBwcml2YXRlIFJlbmRlcmluZ0hpbnRzIHJocyA9IG51bGw7CiAKICAgICBzdGF0aWMgewogICAgICAgICAvLyBUT0RPCi0gICAgICAgIC8vU3lzdGVtLmxvYWRMaWJyYXJ5KCJpbWFnZW9wcyIpOworICAgICAgICAvLyBTeXN0ZW0ubG9hZExpYnJhcnkoImltYWdlb3BzIik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IENvbnZvbHZlT3Agb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBLZXJuZWwKLSAgICAgKiBhbmQgc3BlY2lmaWVkIGVkZ2VzIGNvbmRpdGlvbi4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQ29udm9sdmVPcCBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIEtlcm5lbCBhbmQKKyAgICAgKiBzcGVjaWZpZWQgZWRnZXMgY29uZGl0aW9uLgogICAgICAqIAotICAgICAqIEBwYXJhbSBrZXJuZWwgdGhlIHNwZWNpZmllZCBLZXJuZWwuCi0gICAgICogQHBhcmFtIGVkZ2VDb25kaXRpb24gdGhlIHNwZWNpZmllZCBlZGdlIGNvbmRpdGlvbi4KLSAgICAgKiBAcGFyYW0gaGludHMgdGhlIFJlbmRlcmluZ0hpbnRzIG9iamVjdCwgb3IgbnVsbC4KKyAgICAgKiBAcGFyYW0ga2VybmVsCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIEtlcm5lbC4KKyAgICAgKiBAcGFyYW0gZWRnZUNvbmRpdGlvbgorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBlZGdlIGNvbmRpdGlvbi4KKyAgICAgKiBAcGFyYW0gaGludHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBSZW5kZXJpbmdIaW50cyBvYmplY3QsIG9yIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIENvbnZvbHZlT3AoS2VybmVsIGtlcm5lbCwgaW50IGVkZ2VDb25kaXRpb24sIFJlbmRlcmluZ0hpbnRzIGhpbnRzKSB7CiAgICAgICAgIHRoaXMua2VybmVsID0ga2VybmVsOwpAQCAtODEsMTAgKzkxLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IENvbnZvbHZlT3Agb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBLZXJuZWwKLSAgICAgKiBhbmQgRURHRV9aRVJPX0ZJTEwgZWRnZSBjb25kaXRpb24uCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IENvbnZvbHZlT3Agb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBLZXJuZWwgYW5kCisgICAgICogRURHRV9aRVJPX0ZJTEwgZWRnZSBjb25kaXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIGtlcm5lbCB0aGUgc3BlY2lmaWVkIEtlcm5lbC4KKyAgICAgKiBAcGFyYW0ga2VybmVsCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIEtlcm5lbC4KICAgICAgKi8KICAgICBwdWJsaWMgQ29udm9sdmVPcChLZXJuZWwga2VybmVsKSB7CiAgICAgICAgIHRoaXMua2VybmVsID0ga2VybmVsOwpAQCAtOTcsNyArMTA4LDcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBLZXJuZWwgb2JqZWN0IG9mIHRoaXMgQ29udm9sdmVPcC4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgS2VybmVsIGdldEtlcm5lbCgpIHsKLSAgICAgICAgcmV0dXJuIChLZXJuZWwpIGtlcm5lbC5jbG9uZSgpOworICAgICAgICByZXR1cm4gKEtlcm5lbClrZXJuZWwuY2xvbmUoKTsKICAgICB9CiAKICAgICBwdWJsaWMgZmluYWwgUmVuZGVyaW5nSGludHMgZ2V0UmVuZGVyaW5nSGludHMoKSB7CkBAIC0xNDMsMTcgKzE1NCwxMSBAQAogICAgICAgICAgICAgZHN0Q00gPSBDb2xvck1vZGVsLmdldFJHQmRlZmF1bHQoKTsKICAgICAgICAgfQogCi0gICAgICAgIFdyaXRhYmxlUmFzdGVyIHIgPQotICAgICAgICAgICAgICAgIGRzdENNLmlzQ29tcGF0aWJsZVNhbXBsZU1vZGVsKHNyYy5nZXRTYW1wbGVNb2RlbCgpKSA/Ci0gICAgICAgICAgICAgICAgc3JjLmdldFJhc3RlcigpLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3RlcihzcmMuZ2V0V2lkdGgoKSwgc3JjLmdldEhlaWdodCgpKSA6Ci0gICAgICAgICAgICAgICAgZHN0Q00uY3JlYXRlQ29tcGF0aWJsZVdyaXRhYmxlUmFzdGVyKHNyYy5nZXRXaWR0aCgpLCBzcmMuZ2V0SGVpZ2h0KCkpOworICAgICAgICBXcml0YWJsZVJhc3RlciByID0gZHN0Q00uaXNDb21wYXRpYmxlU2FtcGxlTW9kZWwoc3JjLmdldFNhbXBsZU1vZGVsKCkpID8gc3JjLmdldFJhc3RlcigpCisgICAgICAgICAgICAgICAgLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3RlcihzcmMuZ2V0V2lkdGgoKSwgc3JjLmdldEhlaWdodCgpKSA6IGRzdENNCisgICAgICAgICAgICAgICAgLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3RlcihzcmMuZ2V0V2lkdGgoKSwgc3JjLmdldEhlaWdodCgpKTsKIAotICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlcmVkSW1hZ2UoCi0gICAgICAgICAgICAgICAgZHN0Q00sCi0gICAgICAgICAgICAgICAgciwKLSAgICAgICAgICAgICAgICBkc3RDTS5pc0FscGhhUHJlbXVsdGlwbGllZCgpLAotICAgICAgICAgICAgICAgIG51bGwKLSAgICAgICAgKTsKKyAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJlZEltYWdlKGRzdENNLCByLCBkc3RDTS5pc0FscGhhUHJlbXVsdGlwbGllZCgpLCBudWxsKTsKICAgICB9CiAKICAgICBwdWJsaWMgZmluYWwgV3JpdGFibGVSYXN0ZXIgZmlsdGVyKFJhc3RlciBzcmMsIFdyaXRhYmxlUmFzdGVyIGRzdCkgewpAQCAtMTYyLDcgKzE2Nyw3IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjU2IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICBpZiAoc3JjID09IGRzdCl7CisgICAgICAgIGlmIChzcmMgPT0gZHN0KSB7CiAgICAgICAgICAgICAvLyBhd3QuMjU3PVNvdXJjZSByYXN0ZXIgaXMgZXF1YWwgdG8gZGVzdGluYXRpb24KICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjU3IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KQEAgLTE3MCwxNyArMTc1LDE4IEBACiAgICAgICAgIGlmIChkc3QgPT0gbnVsbCkgewogICAgICAgICAgICAgZHN0ID0gY3JlYXRlQ29tcGF0aWJsZURlc3RSYXN0ZXIoc3JjKTsKICAgICAgICAgfSBlbHNlIGlmIChzcmMuZ2V0TnVtQmFuZHMoKSAhPSBkc3QuZ2V0TnVtQmFuZHMoKSkgewotICAgICAgICAgICAgLy8gYXd0LjI1OD1OdW1iZXIgb2Ygc291cmNlIGJhbmRzICh7MH0pIGlzIG5vdCBlcXVhbCB0byBudW1iZXIgb2YgZGVzdGluYXRpb24gYmFuZHMgKHsxfSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjU4Iiwgc3JjLmdldE51bUJhbmRzKCksIGRzdC5nZXROdW1CYW5kcygpKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIC8vIGF3dC4yNTg9TnVtYmVyIG9mIHNvdXJjZSBiYW5kcyAoezB9KSBpcyBub3QgZXF1YWwgdG8gbnVtYmVyIG9mCisgICAgICAgICAgICAvLyBkZXN0aW5hdGlvbiBiYW5kcyAoezF9KQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICJhd3QuMjU4Iiwgc3JjLmdldE51bUJhbmRzKCksIGRzdC5nZXROdW1CYW5kcygpKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCiAgICAgICAgIC8vIFRPRE8KLSAgICAgICAgLy9pZiAoaXBwRmlsdGVyKHNyYywgZHN0LCBCdWZmZXJlZEltYWdlLlRZUEVfQ1VTVE9NKSAhPSAwKQotICAgICAgICAgICAgaWYgKHNsb3dGaWx0ZXIoc3JjLCBkc3QpICE9IDApIHsKLSAgICAgICAgICAgICAgICAvLyBhd3QuMjFGPVVuYWJsZSB0byB0cmFuc2Zvcm0gc291cmNlCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEltYWdpbmdPcEV4Y2VwdGlvbiAoTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjFGIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9CisgICAgICAgIC8vIGlmIChpcHBGaWx0ZXIoc3JjLCBkc3QsIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9DVVNUT00pICE9IDApCisgICAgICAgIGlmIChzbG93RmlsdGVyKHNyYywgZHN0KSAhPSAwKSB7CisgICAgICAgICAgICAvLyBhd3QuMjFGPVVuYWJsZSB0byB0cmFuc2Zvcm0gc291cmNlCisgICAgICAgICAgICB0aHJvdyBuZXcgSW1hZ2luZ09wRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxRiIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIGRzdDsKICAgICB9CkBAIC0xODgsMTAgKzE5NCwxMSBAQAogICAgIC8qKgogICAgICAqIFNsb3cgZmlsdGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzcmMgdGhlIHNyYwotICAgICAqIEBwYXJhbSBkc3QgdGhlIGRzdAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGludAorICAgICAqIEBwYXJhbSBzcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcmMuCisgICAgICogQHBhcmFtIGRzdAorICAgICAqICAgICAgICAgICAgdGhlIGRzdC4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgc2xvd0ZpbHRlcihSYXN0ZXIgc3JjLCBXcml0YWJsZVJhc3RlciBkc3QpIHsKICAgICAgICAgdHJ5IHsKQEAgLTIxOSw3ICsyMjYsNyBAQAogICAgICAgICAgICAgaW50W10gbWFza3MgPSBuZXcgaW50W251bUJhbmRzXTsKICAgICAgICAgICAgIGludFtdIHNhbXBsZVNpemVzID0gc20uZ2V0U2FtcGxlU2l6ZSgpOwogCi0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBudW1CYW5kczsgaSsrKXsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykgewogICAgICAgICAgICAgICAgIG1heFZhbHVlc1tpXSA9ICgxIDw8IHNhbXBsZVNpemVzW2ldKSAtIDE7CiAgICAgICAgICAgICAgICAgbWFza3NbaV0gPSB+KG1heFZhbHVlc1tpXSk7CiAgICAgICAgICAgICB9CkBAIC0yMjgsNjEgKzIzNSw1NiBAQAogICAgICAgICAgICAgZmxvYXRbXSBwaXhlbHMgPSBudWxsOwogICAgICAgICAgICAgcGl4ZWxzID0gc3JjLmdldFBpeGVscyhzcmNNaW5YLCBzcmNNaW5ZLCBzcmNXaWR0aCwgc3JjSGVpZ2h0LCBwaXhlbHMpOwogICAgICAgICAgICAgZmxvYXRbXSBuZXdQaXhlbHMgPSBuZXcgZmxvYXRbcGl4ZWxzLmxlbmd0aF07Ci0gICAgICAgICAgICBpbnQgcm93TGVuZ3RoID0gc3JjV2lkdGgqbnVtQmFuZHM7Ci0gICAgICAgICAgICBpZiAodGhpcy5lZGdlQ29uZCA9PSBDb252b2x2ZU9wLkVER0VfTk9fT1ApeworICAgICAgICAgICAgaW50IHJvd0xlbmd0aCA9IHNyY1dpZHRoICogbnVtQmFuZHM7CisgICAgICAgICAgICBpZiAodGhpcy5lZGdlQ29uZCA9PSBDb252b2x2ZU9wLkVER0VfTk9fT1ApIHsKICAgICAgICAgICAgICAgICAvLyB0b3AKICAgICAgICAgICAgICAgICBpbnQgc3RhcnQgPSAwOwotICAgICAgICAgICAgICAgIGludCBsZW5ndGggPSB5T3JpZ2luKnJvd0xlbmd0aDsKKyAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0geU9yaWdpbiAqIHJvd0xlbmd0aDsKICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHBpeGVscywgc3RhcnQsIG5ld1BpeGVscywgc3RhcnQsIGxlbmd0aCk7CiAgICAgICAgICAgICAgICAgLy8gYm90dG9tCi0gICAgICAgICAgICAgICAgc3RhcnQgPSAoc3JjSGVpZ2h0IC0gKGtIZWlnaHQgLSB5T3JpZ2luIC0gMSkpKnJvd0xlbmd0aDsKLSAgICAgICAgICAgICAgICBsZW5ndGggPSAoa0hlaWdodCAtIHlPcmlnaW4gLSAxKSpyb3dMZW5ndGg7CisgICAgICAgICAgICAgICAgc3RhcnQgPSAoc3JjSGVpZ2h0IC0gKGtIZWlnaHQgLSB5T3JpZ2luIC0gMSkpICogcm93TGVuZ3RoOworICAgICAgICAgICAgICAgIGxlbmd0aCA9IChrSGVpZ2h0IC0geU9yaWdpbiAtIDEpICogcm93TGVuZ3RoOwogICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocGl4ZWxzLCBzdGFydCwgbmV3UGl4ZWxzLCBzdGFydCwgbGVuZ3RoKTsKICAgICAgICAgICAgICAgICAvLyBtaWRkbGUKLSAgICAgICAgICAgICAgICBsZW5ndGggPSB4T3JpZ2luKm51bUJhbmRzOwotICAgICAgICAgICAgICAgIGludCBsZW5ndGgxID0gKGtXaWR0aCAtIHhPcmlnaW4gLSAxKSpudW1CYW5kczsKLSAgICAgICAgICAgICAgICBzdGFydCA9IHlPcmlnaW4qcm93TGVuZ3RoOwotICAgICAgICAgICAgICAgIGludCBzdGFydDEgPSAoeU9yaWdpbisxKSpyb3dMZW5ndGggLSBsZW5ndGgxOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSB5T3JpZ2luOyBpIDwgKHNyY0hlaWdodCAtIChrSGVpZ2h0IC0geU9yaWdpbiAtIDEpKTsgaSArKykgeworICAgICAgICAgICAgICAgIGxlbmd0aCA9IHhPcmlnaW4gKiBudW1CYW5kczsKKyAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoMSA9IChrV2lkdGggLSB4T3JpZ2luIC0gMSkgKiBudW1CYW5kczsKKyAgICAgICAgICAgICAgICBzdGFydCA9IHlPcmlnaW4gKiByb3dMZW5ndGg7CisgICAgICAgICAgICAgICAgaW50IHN0YXJ0MSA9ICh5T3JpZ2luICsgMSkgKiByb3dMZW5ndGggLSBsZW5ndGgxOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSB5T3JpZ2luOyBpIDwgKHNyY0hlaWdodCAtIChrSGVpZ2h0IC0geU9yaWdpbiAtIDEpKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocGl4ZWxzLCBzdGFydCwgbmV3UGl4ZWxzLCBzdGFydCwgbGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShwaXhlbHMsIHN0YXJ0MSwgbmV3UGl4ZWxzLCBzdGFydDEsIGxlbmd0aDEpOwotICAgICAgICAgICAgICAgICAgICBzdGFydCArPXJvd0xlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgc3RhcnQxICs9cm93TGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBzdGFydCArPSByb3dMZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0MSArPSByb3dMZW5ndGg7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIEN5Y2xlIG92ZXIgcGl4ZWxzIHRvIGJlIGNhbGN1bGF0ZWQKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSB5T3JpZ2luOyBpIDwgc3JjQ29udk1heFk7IGkrKyl7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHhPcmlnaW47IGogPCBzcmNDb252TWF4WDsgaisrKXsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSB5T3JpZ2luOyBpIDwgc3JjQ29udk1heFk7IGkrKykgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSB4T3JpZ2luOyBqIDwgc3JjQ29udk1heFg7IGorKykgewogCiAgICAgICAgICAgICAgICAgICAgIC8vIFRha2Uga2VybmVsIGRhdGEgaW4gYmFja3dhcmQgZGlyZWN0aW9uLCBjb252b2x1dGlvbgogICAgICAgICAgICAgICAgICAgICBpbnQga2VybmVsSWR4ID0gZGF0YS5sZW5ndGggLSAxOwogCiAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbEluZGV4ID0gaSAqIHJvd0xlbmd0aCArIGogKiBudW1CYW5kczsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaElkeCA9IDAsIHJhc3RlckhJZHggPSBpIC0geU9yaWdpbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICBoSWR4IDwga0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICBoSWR4KyssIHJhc3RlckhJZHgrKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCB3SWR4ID0gMCwgcmFzdGVyV0lkeCA9IGogLSB4T3JpZ2luOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3SWR4IDwga1dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3SWR4KyssIHJhc3RlcldJZHgrKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBoSWR4ID0gMCwgcmFzdGVySElkeCA9IGkgLSB5T3JpZ2luOyBoSWR4IDwga0hlaWdodDsgaElkeCsrLCByYXN0ZXJISWR4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHdJZHggPSAwLCByYXN0ZXJXSWR4ID0gaiAtIHhPcmlnaW47IHdJZHggPCBrV2lkdGg7IHdJZHgrKywgcmFzdGVyV0lkeCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGN1ckluZGV4ID0gcmFzdGVySElkeCAqIHJvd0xlbmd0aCArIHJhc3RlcldJZHggKiBudW1CYW5kczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpZHg9MDsgaWR4IDwgbnVtQmFuZHM7IGlkeCsrKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGl4ZWxzW3BpeGVsSW5kZXgraWR4XSArPSBkYXRhW2tlcm5lbElkeF0gKiBwaXhlbHNbY3VySW5kZXgraWR4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpZHggPSAwOyBpZHggPCBudW1CYW5kczsgaWR4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGl4ZWxzW3BpeGVsSW5kZXggKyBpZHhdICs9IGRhdGFba2VybmVsSWR4XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcGl4ZWxzW2N1ckluZGV4ICsgaWR4XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VybmVsSWR4LS07CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3Igb3ZlcmZsb3cgbm93Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGlkeD0wOyBpZHggPCBudW1CYW5kczsgaWR4KyspewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgoaW50KW5ld1BpeGVsc1twaXhlbEluZGV4K2lkeF0gJiBtYXNrc1tpZHhdKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1BpeGVsc1twaXhlbEluZGV4K2lkeF0gPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BpeGVsc1twaXhlbEluZGV4K2lkeF0gPSAwOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpZHggPSAwOyBpZHggPCBudW1CYW5kczsgaWR4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKGludCluZXdQaXhlbHNbcGl4ZWxJbmRleCArIGlkeF0gJiBtYXNrc1tpZHhdKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1BpeGVsc1twaXhlbEluZGV4ICsgaWR4XSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGl4ZWxzW3BpeGVsSW5kZXggKyBpZHhdID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQaXhlbHNbcGl4ZWxJbmRleCtpZHhdID0gbWF4VmFsdWVzW2lkeF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BpeGVsc1twaXhlbEluZGV4ICsgaWR4XSA9IG1heFZhbHVlc1tpZHhdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMzAyLDcgKzMwNCw3IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjU5IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICBpZiAoc3JjID09IGRzdCl7CisgICAgICAgIGlmIChzcmMgPT0gZHN0KSB7CiAgICAgICAgICAgICAvLyBhd3QuMjVBPVNvdXJjZSBlcXVhbHMgdG8gZGVzdGluYXRpb24KICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjVBIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KQEAgLTMxOSwxMyArMzIxLDEwIEBACiAgICAgICAgICAgICBkc3QgPSBjcmVhdGVDb21wYXRpYmxlRGVzdEltYWdlKHNyYywgc3JjQ00pOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKCFzcmNDTS5lcXVhbHMoZHN0LmdldENvbG9yTW9kZWwoKSkpIHsKLSAgICAgICAgICAgICAgICAvLyBUcmVhdCBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX1JHQiBhbmQgQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9BUkdCIGFzIHNhbWUKLSAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAgICAgICAhKChzcmMuZ2V0VHlwZSgpID09IEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfUkdCIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMuZ2V0VHlwZSgpID09IEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfQVJHQikgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGRzdC5nZXRUeXBlKCkgPT0gQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9SR0IgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC5nZXRUeXBlKCkgPT0gQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9BUkdCKSkKLSAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAvLyBUcmVhdCBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX1JHQiBhbmQKKyAgICAgICAgICAgICAgICAvLyBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0IgYXMgc2FtZQorICAgICAgICAgICAgICAgIGlmICghKChzcmMuZ2V0VHlwZSgpID09IEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfUkdCIHx8IHNyYy5nZXRUeXBlKCkgPT0gQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9BUkdCKSAmJiAoZHN0CisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VHlwZSgpID09IEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfUkdCIHx8IGRzdC5nZXRUeXBlKCkgPT0gQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9BUkdCKSkpIHsKICAgICAgICAgICAgICAgICAgICAgZmluYWxEc3QgPSBkc3Q7CiAgICAgICAgICAgICAgICAgICAgIGRzdCA9IGNyZWF0ZUNvbXBhdGlibGVEZXN0SW1hZ2Uoc3JjLCBzcmNDTSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMzM0LDExICszMzMsMTEgQEAKIAogICAgICAgICAvLyBTa2lwIGFscGhhIGNoYW5uZWwgZm9yIFRZUEVfSU5UX1JHQiBpbWFnZXMKICAgICAgICAgLy8gVE9ETwotICAgICAgICAvL2lmIChpcHBGaWx0ZXIoc3JjLmdldFJhc3RlcigpLCBkc3QuZ2V0UmFzdGVyKCksIHNyYy5nZXRUeXBlKCkpICE9IDApCi0gICAgICAgICAgICBpZiAoc2xvd0ZpbHRlcihzcmMuZ2V0UmFzdGVyKCksIGRzdC5nZXRSYXN0ZXIoKSkgIT0gMCkgewotICAgICAgICAgICAgICAgIC8vIGF3dC4yMUY9VW5hYmxlIHRvIHRyYW5zZm9ybSBzb3VyY2UKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW1hZ2luZ09wRXhjZXB0aW9uIChNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMUYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KKyAgICAgICAgLy8gaWYgKGlwcEZpbHRlcihzcmMuZ2V0UmFzdGVyKCksIGRzdC5nZXRSYXN0ZXIoKSwgc3JjLmdldFR5cGUoKSkgIT0gMCkKKyAgICAgICAgaWYgKHNsb3dGaWx0ZXIoc3JjLmdldFJhc3RlcigpLCBkc3QuZ2V0UmFzdGVyKCkpICE9IDApIHsKKyAgICAgICAgICAgIC8vIGF3dC4yMUY9VW5hYmxlIHRvIHRyYW5zZm9ybSBzb3VyY2UKKyAgICAgICAgICAgIHRocm93IG5ldyBJbWFnaW5nT3BFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjFGIikpOyAvLyROT04tTkxTLTEkCisgICAgICAgIH0KIAogICAgICAgICBpZiAoZmluYWxEc3QgIT0gbnVsbCkgewogICAgICAgICAgICAgR3JhcGhpY3MyRCBnID0gZmluYWxEc3QuY3JlYXRlR3JhcGhpY3MoKTsKQEAgLTM1NSwxMSArMzU0LDEzIEBACiAgICAgLyoqCiAgICAgICogSXBwIGZpbHRlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3JjIHRoZSBzcmMKLSAgICAgKiBAcGFyYW0gZHN0IHRoZSBkc3QKLSAgICAgKiBAcGFyYW0gaW1hZ2VUeXBlIHRoZSBpbWFnZSB0eXBlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW50CisgICAgICogQHBhcmFtIHNyYworICAgICAqICAgICAgICAgICAgdGhlIHNyYy4KKyAgICAgKiBAcGFyYW0gZHN0CisgICAgICogICAgICAgICAgICB0aGUgZHN0LgorICAgICAqIEBwYXJhbSBpbWFnZVR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSB0eXBlLgorICAgICAqIEByZXR1cm4gdGhlIGludC4KICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKICAgICBwcml2YXRlIGludCBpcHBGaWx0ZXIoUmFzdGVyIHNyYywgV3JpdGFibGVSYXN0ZXIgZHN0LCBpbnQgaW1hZ2VUeXBlKSB7CkBAIC0zNzIsOCArMzczLDggQEAKICAgICAgICAgICAgIGNhc2UgQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9SR0I6CiAgICAgICAgICAgICBjYXNlIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfQkdSOiB7CiAgICAgICAgICAgICAgICAgY2hhbm5lbHMgPSA0OwotICAgICAgICAgICAgICAgIHNyY1N0cmlkZSA9IHNyYy5nZXRXaWR0aCgpKjQ7Ci0gICAgICAgICAgICAgICAgZHN0U3RyaWRlID0gZHN0LmdldFdpZHRoKCkqNDsKKyAgICAgICAgICAgICAgICBzcmNTdHJpZGUgPSBzcmMuZ2V0V2lkdGgoKSAqIDQ7CisgICAgICAgICAgICAgICAgZHN0U3RyaWRlID0gZHN0LmdldFdpZHRoKCkgKiA0OwogICAgICAgICAgICAgICAgIHNraXBDaGFubmVsID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTM4Myw4ICszODQsOCBAQAogICAgICAgICAgICAgY2FzZSBCdWZmZXJlZEltYWdlLlRZUEVfNEJZVEVfQUJHUjoKICAgICAgICAgICAgIGNhc2UgQnVmZmVyZWRJbWFnZS5UWVBFXzRCWVRFX0FCR1JfUFJFOiB7CiAgICAgICAgICAgICAgICAgY2hhbm5lbHMgPSA0OwotICAgICAgICAgICAgICAgIHNyY1N0cmlkZSA9IHNyYy5nZXRXaWR0aCgpKjQ7Ci0gICAgICAgICAgICAgICAgZHN0U3RyaWRlID0gZHN0LmdldFdpZHRoKCkqNDsKKyAgICAgICAgICAgICAgICBzcmNTdHJpZGUgPSBzcmMuZ2V0V2lkdGgoKSAqIDQ7CisgICAgICAgICAgICAgICAgZHN0U3RyaWRlID0gZHN0LmdldFdpZHRoKCkgKiA0OwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC0zOTcsMTIgKzM5OCwxMyBAQAogCiAgICAgICAgICAgICBjYXNlIEJ1ZmZlcmVkSW1hZ2UuVFlQRV8zQllURV9CR1I6IHsKICAgICAgICAgICAgICAgICBjaGFubmVscyA9IDM7Ci0gICAgICAgICAgICAgICAgc3JjU3RyaWRlID0gc3JjLmdldFdpZHRoKCkqMzsKLSAgICAgICAgICAgICAgICBkc3RTdHJpZGUgPSBkc3QuZ2V0V2lkdGgoKSozOworICAgICAgICAgICAgICAgIHNyY1N0cmlkZSA9IHNyYy5nZXRXaWR0aCgpICogMzsKKyAgICAgICAgICAgICAgICBkc3RTdHJpZGUgPSBkc3QuZ2V0V2lkdGgoKSAqIDM7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGNhc2UgQnVmZmVyZWRJbWFnZS5UWVBFX1VTSE9SVF9HUkFZOiAvLyBUT0RPIC0gY291bGQgYmUgZG9uZSBpbiBuYXRpdmUgY29kZT8KKyAgICAgICAgICAgIGNhc2UgQnVmZmVyZWRJbWFnZS5UWVBFX1VTSE9SVF9HUkFZOiAvLyBUT0RPIC0gY291bGQgYmUgZG9uZSBpbgorICAgICAgICAgICAgICAgIC8vIG5hdGl2ZSBjb2RlPwogICAgICAgICAgICAgY2FzZSBCdWZmZXJlZEltYWdlLlRZUEVfVVNIT1JUXzU2NV9SR0I6CiAgICAgICAgICAgICBjYXNlIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9VU0hPUlRfNTU1X1JHQjoKICAgICAgICAgICAgIGNhc2UgQnVmZmVyZWRJbWFnZS5UWVBFX0JZVEVfQklOQVJZOiB7CkBAIC00MTMsNTkgKzQxNSw1MSBAQAogICAgICAgICAgICAgICAgIFNhbXBsZU1vZGVsIHNyY1NNID0gc3JjLmdldFNhbXBsZU1vZGVsKCk7CiAgICAgICAgICAgICAgICAgU2FtcGxlTW9kZWwgZHN0U00gPSBkc3QuZ2V0U2FtcGxlTW9kZWwoKTsKIAotICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY1NNIGluc3RhbmNlb2YgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3RTTSBpbnN0YW5jZW9mIFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbAotICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIGlmIChzcmNTTSBpbnN0YW5jZW9mIFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZHN0U00gaW5zdGFuY2VvZiBQaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsCi0gICAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNTTS5nZXREYXRhVHlwZSgpICE9IERhdGFCdWZmZXIuVFlQRV9CWVRFIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0U00uZ2V0RGF0YVR5cGUoKSAhPSBEYXRhQnVmZmVyLlRZUEVfQllURQotICAgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNyY1NNLmdldERhdGFUeXBlKCkgIT0gRGF0YUJ1ZmZlci5UWVBFX0JZVEUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBkc3RTTS5nZXREYXRhVHlwZSgpICE9IERhdGFCdWZmZXIuVFlQRV9CWVRFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2xvd0ZpbHRlcihzcmMsIGRzdCk7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBjaGFubmVscyA9IHNyY1NNLmdldE51bUJhbmRzKCk7IC8vIEhhdmUgSVBQIGZ1bmN0aW9ucyBmb3IgMSwgMyBhbmQgNCBjaGFubmVscworICAgICAgICAgICAgICAgICAgICBjaGFubmVscyA9IHNyY1NNLmdldE51bUJhbmRzKCk7IC8vIEhhdmUgSVBQIGZ1bmN0aW9ucyBmb3IgMSwKKyAgICAgICAgICAgICAgICAgICAgLy8gMyBhbmQgNCBjaGFubmVscwogICAgICAgICAgICAgICAgICAgICBpZiAoIShjaGFubmVscyA9PSAxIHx8IGNoYW5uZWxzID09IDMgfHwgY2hhbm5lbHMgPT0gNCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzbG93RmlsdGVyKHNyYywgZHN0KTsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIHNyY1N0cmlkZSA9ICgoQ29tcG9uZW50U2FtcGxlTW9kZWwpIHNyY1NNKS5nZXRTY2FubGluZVN0cmlkZSgpOwotICAgICAgICAgICAgICAgICAgICBkc3RTdHJpZGUgPSAoKENvbXBvbmVudFNhbXBsZU1vZGVsKSBkc3RTTSkuZ2V0U2NhbmxpbmVTdHJpZGUoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKAotICAgICAgICAgICAgICAgICAgICAgICAgc3JjU00gaW5zdGFuY2VvZiBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3RTTSBpbnN0YW5jZW9mIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwKLSAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAgICAgc3JjU3RyaWRlID0gKChDb21wb25lbnRTYW1wbGVNb2RlbClzcmNTTSkuZ2V0U2NhbmxpbmVTdHJpZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgZHN0U3RyaWRlID0gKChDb21wb25lbnRTYW1wbGVNb2RlbClkc3RTTSkuZ2V0U2NhbmxpbmVTdHJpZGUoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNyY1NNIGluc3RhbmNlb2YgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZHN0U00gaW5zdGFuY2VvZiBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwKLSAgICAgICAgICAgICAgICAgICAgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCBzcHBzbTEgPSAoU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCkgc3JjU007Ci0gICAgICAgICAgICAgICAgICAgIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgc3Bwc20yID0gKFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwpIGRzdFNNOworICAgICAgICAgICAgICAgICAgICBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIHNwcHNtMSA9IChTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKXNyY1NNOworICAgICAgICAgICAgICAgICAgICBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIHNwcHNtMiA9IChTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKWRzdFNNOwogCiAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzID0gc3Bwc20xLmdldE51bUJhbmRzKCk7CiAKLSAgICAgICAgICAgICAgICAgICAgIC8vIFRZUEVfSU5UX1JHQiwgVFlQRV9JTlRfQVJHQi4uLgotICAgICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bwc20xLmdldERhdGFUeXBlKCkgIT0gRGF0YUJ1ZmZlci5UWVBFX0lOVCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcHNtMi5nZXREYXRhVHlwZSgpICE9IERhdGFCdWZmZXIuVFlQRV9JTlQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKGNoYW5uZWxzID09IDMgfHwgY2hhbm5lbHMgPT0gNCkKLSAgICAgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRZUEVfSU5UX1JHQiwgVFlQRV9JTlRfQVJHQi4uLgorICAgICAgICAgICAgICAgICAgICBpZiAoc3Bwc20xLmdldERhdGFUeXBlKCkgIT0gRGF0YUJ1ZmZlci5UWVBFX0lOVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHNwcHNtMi5nZXREYXRhVHlwZSgpICE9IERhdGFCdWZmZXIuVFlQRV9JTlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhKGNoYW5uZWxzID09IDMgfHwgY2hhbm5lbHMgPT0gNCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzbG93RmlsdGVyKHNyYywgZHN0KTsKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGNvbXBhdGliaWxpdHkgb2Ygc2FtcGxlIG1vZGVscwotICAgICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIUFycmF5cy5lcXVhbHMoc3Bwc20xLmdldEJpdE9mZnNldHMoKSwgc3Bwc20yLmdldEJpdE9mZnNldHMoKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhQXJyYXlzLmVxdWFscyhzcHBzbTEuZ2V0Qml0TWFza3MoKSwgc3Bwc20yLmdldEJpdE1hc2tzKCkpCi0gICAgICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIUFycmF5cy5lcXVhbHMoc3Bwc20xLmdldEJpdE9mZnNldHMoKSwgc3Bwc20yLmdldEJpdE9mZnNldHMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhQXJyYXlzLmVxdWFscyhzcHBzbTEuZ2V0Qml0TWFza3MoKSwgc3Bwc20yLmdldEJpdE1hc2tzKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2xvd0ZpbHRlcihzcmMsIGRzdCk7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8Y2hhbm5lbHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcHBzbTEuZ2V0U2FtcGxlU2l6ZShpKSAhPSA4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNsb3dGaWx0ZXIoc3JjLCBkc3QpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWxzID09IDMpIHsgLy8gQ2Fubm90IHNraXAgY2hhbm5lbCwgZG9uJ3Qga25vdyB3aGljaCBpcyBhbHBoYS4uLgorICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbHMgPT0gMykgeyAvLyBDYW5ub3Qgc2tpcCBjaGFubmVsLCBkb24ndCBrbm93CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBpcyBhbHBoYS4uLgogICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMgPSA0OwogICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTQ3NywxMiArNDcxLDkgQEAKIAogICAgICAgICAgICAgICAgIC8vIEZpbGwgb2Zmc2V0cyBpZiB0aGVyZSdzIGEgY2hpbGQgcmFzdGVyCiAgICAgICAgICAgICAgICAgaWYgKHNyYy5nZXRQYXJlbnQoKSAhPSBudWxsIHx8IGRzdC5nZXRQYXJlbnQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVYKCkgIT0gMCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVkoKSAhPSAwIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWCgpICE9IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVZKCkgIT0gMAotICAgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNyYy5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVgoKSAhPSAwIHx8IHNyYy5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVkoKSAhPSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZHN0LmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWCgpICE9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBkc3QuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVZKCkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0cyA9IG5ldyBpbnRbNF07CiAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRzWzBdID0gLXNyYy5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVgoKSArIHNyYy5nZXRNaW5YKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRzWzFdID0gLXNyYy5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVkoKSArIHNyYy5nZXRNaW5ZKCk7CkBAIC01MDIsNDQgKzQ5Myw1MyBAQAogICAgICAgICAgICAgcmV0dXJuIC0xOyAvLyBVbmtub3duIGRhdGEgYnVmZmVyIHR5cGUKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBpcHBGaWx0ZXIzMmYoCi0gICAgICAgICAgICBrZXJuZWwuZGF0YSwga2VybmVsLmdldFdpZHRoKCksIGtlcm5lbC5nZXRIZWlnaHQoKSwKLSAgICAgICAgICAgIGtlcm5lbC5nZXRYT3JpZ2luKCksIGtlcm5lbC5nZXRZT3JpZ2luKCksIGVkZ2VDb25kLAotICAgICAgICAgICAgc3JjRGF0YSwgc3JjLmdldFdpZHRoKCksIHNyYy5nZXRIZWlnaHQoKSwgc3JjU3RyaWRlLAotICAgICAgICAgICAgZHN0RGF0YSwgZHN0LmdldFdpZHRoKCksIGRzdC5nZXRIZWlnaHQoKSwgZHN0U3RyaWRlLAotICAgICAgICAgICAgY2hhbm5lbHMsIHNraXBDaGFubmVsLCBvZmZzZXRzCi0gICAgICAgICk7CisgICAgICAgIHJldHVybiBpcHBGaWx0ZXIzMmYoa2VybmVsLmRhdGEsIGtlcm5lbC5nZXRXaWR0aCgpLCBrZXJuZWwuZ2V0SGVpZ2h0KCksCisgICAgICAgICAgICAgICAga2VybmVsLmdldFhPcmlnaW4oKSwga2VybmVsLmdldFlPcmlnaW4oKSwgZWRnZUNvbmQsIHNyY0RhdGEsIHNyYy5nZXRXaWR0aCgpLCBzcmMKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRIZWlnaHQoKSwgc3JjU3RyaWRlLCBkc3REYXRhLCBkc3QuZ2V0V2lkdGgoKSwgZHN0LmdldEhlaWdodCgpLAorICAgICAgICAgICAgICAgIGRzdFN0cmlkZSwgY2hhbm5lbHMsIHNraXBDaGFubmVsLCBvZmZzZXRzKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBJcHAgZmlsdGVyMzJmLgogICAgICAqIAotICAgICAqIEBwYXJhbSBrZXJuZWwgdGhlIGtlcm5lbAotICAgICAqIEBwYXJhbSBrV2lkdGggdGhlIGsgd2lkdGgKLSAgICAgKiBAcGFyYW0ga0hlaWdodCB0aGUgayBoZWlnaHQKLSAgICAgKiBAcGFyYW0gYW5jaG9yWCB0aGUgYW5jaG9yIHgKLSAgICAgKiBAcGFyYW0gYW5jaG9yWSB0aGUgYW5jaG9yIHkKLSAgICAgKiBAcGFyYW0gYm9yZGVyVHlwZSB0aGUgYm9yZGVyIHR5cGUKLSAgICAgKiBAcGFyYW0gc3JjIHRoZSBzcmMKLSAgICAgKiBAcGFyYW0gc3JjV2lkdGggdGhlIHNyYyB3aWR0aAotICAgICAqIEBwYXJhbSBzcmNIZWlnaHQgdGhlIHNyYyBoZWlnaHQKLSAgICAgKiBAcGFyYW0gc3JjU3RyaWRlIHRoZSBzcmMgc3RyaWRlCi0gICAgICogQHBhcmFtIGRzdCB0aGUgZHN0Ci0gICAgICogQHBhcmFtIGRzdFdpZHRoIHRoZSBkc3Qgd2lkdGgKLSAgICAgKiBAcGFyYW0gZHN0SGVpZ2h0IHRoZSBkc3QgaGVpZ2h0Ci0gICAgICogQHBhcmFtIGRzdFN0cmlkZSB0aGUgZHN0IHN0cmlkZQotICAgICAqIEBwYXJhbSBjaGFubmVscyB0aGUgY2hhbm5lbHMKLSAgICAgKiBAcGFyYW0gc2tpcENoYW5uZWwgdGhlIHNraXAgY2hhbm5lbAotICAgICAqIEBwYXJhbSBvZmZzZXRzIHRoZSBvZmZzZXRzCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW50CisgICAgICogQHBhcmFtIGtlcm5lbAorICAgICAqICAgICAgICAgICAgdGhlIGtlcm5lbC4KKyAgICAgKiBAcGFyYW0ga1dpZHRoCisgICAgICogICAgICAgICAgICB0aGUgayB3aWR0aC4KKyAgICAgKiBAcGFyYW0ga0hlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIGsgaGVpZ2h0LgorICAgICAqIEBwYXJhbSBhbmNob3JYCisgICAgICogICAgICAgICAgICB0aGUgYW5jaG9yIHguCisgICAgICogQHBhcmFtIGFuY2hvclkKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbmNob3IgeS4KKyAgICAgKiBAcGFyYW0gYm9yZGVyVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGJvcmRlciB0eXBlLgorICAgICAqIEBwYXJhbSBzcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcmMuCisgICAgICogQHBhcmFtIHNyY1dpZHRoCisgICAgICogICAgICAgICAgICB0aGUgc3JjIHdpZHRoLgorICAgICAqIEBwYXJhbSBzcmNIZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcmMgaGVpZ2h0LgorICAgICAqIEBwYXJhbSBzcmNTdHJpZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcmMgc3RyaWRlLgorICAgICAqIEBwYXJhbSBkc3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBkc3QuCisgICAgICogQHBhcmFtIGRzdFdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgZHN0IHdpZHRoLgorICAgICAqIEBwYXJhbSBkc3RIZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBkc3QgaGVpZ2h0LgorICAgICAqIEBwYXJhbSBkc3RTdHJpZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkc3Qgc3RyaWRlLgorICAgICAqIEBwYXJhbSBjaGFubmVscworICAgICAqICAgICAgICAgICAgdGhlIGNoYW5uZWxzLgorICAgICAqIEBwYXJhbSBza2lwQ2hhbm5lbAorICAgICAqICAgICAgICAgICAgdGhlIHNraXAgY2hhbm5lbC4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0cworICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldHMuCisgICAgICogQHJldHVybiB0aGUgaW50LgogICAgICAqLwotICAgIHByaXZhdGUgbmF0aXZlIGludCBpcHBGaWx0ZXIzMmYoCi0gICAgICAgICAgICAgICAgZmxvYXQga2VybmVsW10sIGludCBrV2lkdGgsIGludCBrSGVpZ2h0LAotICAgICAgICAgICAgICAgIGludCBhbmNob3JYLCBpbnQgYW5jaG9yWSwgaW50IGJvcmRlclR5cGUsCi0gICAgICAgICAgICAgICAgT2JqZWN0IHNyYywgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LCBpbnQgc3JjU3RyaWRlLAotICAgICAgICAgICAgICAgIE9iamVjdCBkc3QsIGludCBkc3RXaWR0aCwgaW50IGRzdEhlaWdodCwgaW50IGRzdFN0cmlkZSwKLSAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMsIGJvb2xlYW4gc2tpcENoYW5uZWwsIGludCBvZmZzZXRzW10KLSAgICAgICAgICAgICk7CisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IGlwcEZpbHRlcjMyZihmbG9hdCBrZXJuZWxbXSwgaW50IGtXaWR0aCwgaW50IGtIZWlnaHQsIGludCBhbmNob3JYLAorICAgICAgICAgICAgaW50IGFuY2hvclksIGludCBib3JkZXJUeXBlLCBPYmplY3Qgc3JjLCBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsIGludCBzcmNTdHJpZGUsCisgICAgICAgICAgICBPYmplY3QgZHN0LCBpbnQgZHN0V2lkdGgsIGludCBkc3RIZWlnaHQsIGludCBkc3RTdHJpZGUsIGludCBjaGFubmVscywKKyAgICAgICAgICAgIGJvb2xlYW4gc2tpcENoYW5uZWwsIGludCBvZmZzZXRzW10pOwogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvQ3JvcEltYWdlRmlsdGVyLmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvQ3JvcEltYWdlRmlsdGVyLmphdmEKaW5kZXggZTkwYzQ0YS4uMmY0Y2E3OCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL0Nyb3BJbWFnZUZpbHRlci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9Dcm9wSW1hZ2VGaWx0ZXIuamF2YQpAQCAtMTgsMjggKzE4LDM2IEBACiAgKiBAYXV0aG9yIElnb3IgVi4gU3RvbHlhcm92CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5pbWFnZTsKIAogaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CiAKIC8qKgotICogVGhlIENyb3BJbWFnZUZpbHRlciBjbGFzcyBjcm9wcyBhIHJlY3Rhbmd1bGFyIHJlZ2lvbiBvZiBhbiBzb3VyY2UKLSAqIEltYWdlIGFuZCBwcm92aWRlcyBhIHNvdXJjZSBmb3IgYSBuZXcgaW1hZ2UgY29udGFpbmluZyB0aGUgZXh0cmFjdGVkIAotICogcmVnaW9uLgorICogVGhlIENyb3BJbWFnZUZpbHRlciBjbGFzcyBjcm9wcyBhIHJlY3Rhbmd1bGFyIHJlZ2lvbiBvZiBhbiBzb3VyY2UgSW1hZ2UgYW5kCisgKiBwcm92aWRlcyBhIHNvdXJjZSBmb3IgYSBuZXcgaW1hZ2UgY29udGFpbmluZyB0aGUgZXh0cmFjdGVkIHJlZ2lvbi4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBDcm9wSW1hZ2VGaWx0ZXIgZXh0ZW5kcyBJbWFnZUZpbHRlciB7CiAKLSAgICAvKiogVGhlIEhFSUdIVC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgSEVJR0hULgorICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgaW50IFgsIFksIFdJRFRILCBIRUlHSFQ7CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgQ3JvcEltYWdlRmlsdGVyIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQKLSAgICAgKiByZWN0YW5ndWxhciBhcmVhLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBDcm9wSW1hZ2VGaWx0ZXIgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhcgorICAgICAqIGFyZWEuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiByZWN0YW5ndWxhciBhcmVhLiAKLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHJlY3Rhbmd1bGFyIGFyZWEuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHJlY3Rhbmd1bGFyIGFyZWEuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiByZWN0YW5ndWxhciBhcmVhLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHJlY3Rhbmd1bGFyIGFyZWEuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgcmVjdGFuZ3VsYXIgYXJlYS4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHJlY3Rhbmd1bGFyIGFyZWEuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgcmVjdGFuZ3VsYXIgYXJlYS4KICAgICAgKi8KICAgICBwdWJsaWMgQ3JvcEltYWdlRmlsdGVyKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKSB7CiAgICAgICAgIFggPSB4OwpAQCAtNTIsMjAgKzYwLDIwIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydGllcyhIYXNodGFibGU8PywgPz4gcHJvcHMpIHsKICAgICAgICAgSGFzaHRhYmxlPE9iamVjdCwgT2JqZWN0PiBmcHJvcHM7Ci0gICAgICAgIGlmKHByb3BzID09IG51bGwpIHsKKyAgICAgICAgaWYgKHByb3BzID09IG51bGwpIHsKICAgICAgICAgICAgIGZwcm9wcyA9IG5ldyBIYXNodGFibGU8T2JqZWN0LCBPYmplY3Q+KCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmcHJvcHMgPSAoSGFzaHRhYmxlPE9iamVjdCwgT2JqZWN0PikgcHJvcHMuY2xvbmUoKTsKKyAgICAgICAgICAgIGZwcm9wcyA9IChIYXNodGFibGU8T2JqZWN0LCBPYmplY3Q+KXByb3BzLmNsb25lKCk7CiAgICAgICAgIH0KICAgICAgICAgU3RyaW5nIHByb3BOYW1lID0gIkNyb3AgRmlsdGVycyI7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgU3RyaW5nIHByb3AgPSAieD0iICsgWCArICI7IHk9IiArIFkgKyAiOyB3aWR0aD0iICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgICAgV0lEVEggKyAiOyBoZWlnaHQ9IiArIEhFSUdIVDsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgIFdJRFRIICsgIjsgaGVpZ2h0PSIgKyBIRUlHSFQ7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgT2JqZWN0IG8gPSBmcHJvcHMuZ2V0KHByb3BOYW1lKTsKLSAgICAgICAgaWYobyAhPSBudWxsKXsKLSAgICAgICAgICAgIGlmKG8gaW5zdGFuY2VvZiBTdHJpbmcpeworICAgICAgICBpZiAobyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFN0cmluZykgewogICAgICAgICAgICAgICAgIHByb3AgPSAoU3RyaW5nKW8gKyAiOyAiICsgcHJvcDsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgcHJvcCA9ICBvLnRvU3RyaW5nKCkgKyAiOyAiICsgcHJvcDsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcm9wID0gby50b1N0cmluZygpICsgIjsgIiArIHByb3A7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBmcHJvcHMucHV0KHByb3BOYW1lLCBwcm9wKTsKQEAgLTczLDE1ICs4MSwxNCBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgQ29sb3JNb2RlbCBtb2RlbCwgaW50W10gcGl4ZWxzLCBpbnQgb2ZmLCBpbnQgc2NhbnNpemUpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIENvbG9yTW9kZWwgbW9kZWwsIGludFtdIHBpeGVscywgaW50IG9mZiwKKyAgICAgICAgICAgIGludCBzY2Fuc2l6ZSkgewogCi0gICAgICAgIGlmKHggKyB3IDwgWCB8fCBYICsgV0lEVEggPCB4IHx8Ci0gICAgICAgICAgICAgICAgeSArIGggPCBZIHx8IFkgKyBIRUlHSFQgPCB5KSB7CisgICAgICAgIGlmICh4ICsgdyA8IFggfHwgWCArIFdJRFRIIDwgeCB8fCB5ICsgaCA8IFkgfHwgWSArIEhFSUdIVCA8IHkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIGludCBkZXN0WCwgZGVzdFksIGRlc3RXaWR0aCwgZGVzdEhlaWdodCwgZW5kWCwgZW5kWSwKLSAgICAgICAgc3JjRW5kWCwgc3JjRW5kWTsKKyAgICAgICAgaW50IGRlc3RYLCBkZXN0WSwgZGVzdFdpZHRoLCBkZXN0SGVpZ2h0LCBlbmRYLCBlbmRZLCBzcmNFbmRYLCBzcmNFbmRZOwogCiAgICAgICAgIGludCBuZXdPZmZzZXQgPSBvZmY7CiAKQEAgLTkxLDM3ICs5OCwzNiBAQAogICAgICAgICBzcmNFbmRYID0geCArIHc7CiAgICAgICAgIHNyY0VuZFkgPSB5ICsgaDsKIAotICAgICAgICBpZih4IDw9IFgpeworICAgICAgICBpZiAoeCA8PSBYKSB7CiAgICAgICAgICAgICBkZXN0WCA9IDA7CiAgICAgICAgICAgICBuZXdPZmZzZXQgKz0gWDsKLSAgICAgICAgICAgIGlmKGVuZFggPj0gc3JjRW5kWCl7CisgICAgICAgICAgICBpZiAoZW5kWCA+PSBzcmNFbmRYKSB7CiAgICAgICAgICAgICAgICAgZGVzdFdpZHRoID0gc3JjRW5kWCAtIFg7Ci0gICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgZGVzdFdpZHRoID0gV0lEVEg7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH1lbHNleworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZGVzdFggPSB4IC0gWDsKLSAgICAgICAgICAgIGlmKGVuZFggPj0gc3JjRW5kWCl7CisgICAgICAgICAgICBpZiAoZW5kWCA+PSBzcmNFbmRYKSB7CiAgICAgICAgICAgICAgICAgZGVzdFdpZHRoID0gdzsKLSAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBkZXN0V2lkdGggPSBlbmRYIC0geDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0KLSAgICAgICAgaWYoeSA8PSBZKXsKKyAgICAgICAgaWYgKHkgPD0gWSkgewogICAgICAgICAgICAgbmV3T2Zmc2V0ICs9IHNjYW5zaXplICogKFkgLSB5KTsKICAgICAgICAgICAgIGRlc3RZID0gMDsKLSAgICAgICAgICAgIGlmKGVuZFkgPj0gc3JjRW5kWSl7CisgICAgICAgICAgICBpZiAoZW5kWSA+PSBzcmNFbmRZKSB7CiAgICAgICAgICAgICAgICAgZGVzdEhlaWdodCA9IHNyY0VuZFkgLSBZOwotICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGRlc3RIZWlnaHQgPSBIRUlHSFQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH1lbHNleworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZGVzdFkgPSB5IC0gWTsKLSAgICAgICAgICAgIGlmKGVuZFkgPj0gc3JjRW5kWSl7CisgICAgICAgICAgICBpZiAoZW5kWSA+PSBzcmNFbmRZKSB7CiAgICAgICAgICAgICAgICAgZGVzdEhlaWdodCA9IGg7Ci0gICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgZGVzdEhlaWdodCA9IGVuZFkgLSB5OwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xMjksMTUgKzEzNSwxNCBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgQ29sb3JNb2RlbCBtb2RlbCwgYnl0ZVtdIHBpeGVscywgaW50IG9mZiwgaW50IHNjYW5zaXplKSB7CisgICAgcHVibGljIHZvaWQgc2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBDb2xvck1vZGVsIG1vZGVsLCBieXRlW10gcGl4ZWxzLCBpbnQgb2ZmLAorICAgICAgICAgICAgaW50IHNjYW5zaXplKSB7CiAKLSAgICAgICAgaWYoeCArIHcgPCBYIHx8IFggKyBXSURUSCA8IHggfHwKLSAgICAgICAgICAgICAgICB5ICsgaCA8IFkgfHwgWSArIEhFSUdIVCA8IHkpIHsKKyAgICAgICAgaWYgKHggKyB3IDwgWCB8fCBYICsgV0lEVEggPCB4IHx8IHkgKyBoIDwgWSB8fCBZICsgSEVJR0hUIDwgeSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgaW50IGRlc3RYLCBkZXN0WSwgZGVzdFdpZHRoLCBkZXN0SGVpZ2h0LCBlbmRYLCBlbmRZLAotICAgICAgICBzcmNFbmRYLCBzcmNFbmRZOworICAgICAgICBpbnQgZGVzdFgsIGRlc3RZLCBkZXN0V2lkdGgsIGRlc3RIZWlnaHQsIGVuZFgsIGVuZFksIHNyY0VuZFgsIHNyY0VuZFk7CiAKICAgICAgICAgaW50IG5ld09mZnNldCA9IG9mZjsKIApAQCAtMTQ3LDM3ICsxNTIsMzYgQEAKICAgICAgICAgc3JjRW5kWCA9IHggKyB3OwogICAgICAgICBzcmNFbmRZID0geSArIGg7CiAKLSAgICAgICAgaWYoeCA8PSBYKXsKKyAgICAgICAgaWYgKHggPD0gWCkgewogICAgICAgICAgICAgZGVzdFggPSAwOwogICAgICAgICAgICAgbmV3T2Zmc2V0ICs9IFg7Ci0gICAgICAgICAgICBpZihlbmRYID49IHNyY0VuZFgpeworICAgICAgICAgICAgaWYgKGVuZFggPj0gc3JjRW5kWCkgewogICAgICAgICAgICAgICAgIGRlc3RXaWR0aCA9IHNyY0VuZFggLSBYOwotICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGRlc3RXaWR0aCA9IFdJRFRIOwogICAgICAgICAgICAgfQotICAgICAgICB9ZWxzZXsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGRlc3RYID0geCAtIFg7Ci0gICAgICAgICAgICBpZihlbmRYID49IHNyY0VuZFgpeworICAgICAgICAgICAgaWYgKGVuZFggPj0gc3JjRW5kWCkgewogICAgICAgICAgICAgICAgIGRlc3RXaWR0aCA9IHc7Ci0gICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgZGVzdFdpZHRoID0gZW5kWCAtIHg7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotCi0gICAgICAgIGlmKHkgPD0gWSl7CisgICAgICAgIGlmICh5IDw9IFkpIHsKICAgICAgICAgICAgIG5ld09mZnNldCArPSBzY2Fuc2l6ZSAqIChZIC0geSk7CiAgICAgICAgICAgICBkZXN0WSA9IDA7Ci0gICAgICAgICAgICBpZihlbmRZID49IHNyY0VuZFkpeworICAgICAgICAgICAgaWYgKGVuZFkgPj0gc3JjRW5kWSkgewogICAgICAgICAgICAgICAgIGRlc3RIZWlnaHQgPSBzcmNFbmRZIC0gWTsKLSAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBkZXN0SGVpZ2h0ID0gSEVJR0hUOwogICAgICAgICAgICAgfQotICAgICAgICB9ZWxzZXsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGRlc3RZID0geSAtIFk7Ci0gICAgICAgICAgICBpZihlbmRZID49IHNyY0VuZFkpeworICAgICAgICAgICAgaWYgKGVuZFkgPj0gc3JjRW5kWSkgewogICAgICAgICAgICAgICAgIGRlc3RIZWlnaHQgPSBoOwotICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGRlc3RIZWlnaHQgPSBlbmRZIC0geTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTkwLDQgKzE5NCwzIEBACiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9EYXRhQnVmZmVyLmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvRGF0YUJ1ZmZlci5qYXZhCmluZGV4IDY4NTZhZWUuLjkyZjkwMGYgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbWFnZS9EYXRhQnVmZmVyLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL0RhdGFCdWZmZXIuamF2YQpAQCAtMTgsNjUgKzE4LDk3IEBACiAgKiBAYXV0aG9yIElnb3IgVi4gU3RvbHlhcm92CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5pbWFnZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuZ2wuaW1hZ2UuRGF0YUJ1ZmZlckxpc3RlbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFRoZSBDbGFzcyBEYXRhQnVmZmVyIGlzIGEgd3JhcHBlciBjbGFzcyBmb3IgYSBkYXRhIGFycmF5Ci0gKiB0byBiZSB1c2VkIGZvciB0aGUgc2l0dWF0aW9uIHdoZXJlIGEgc3VpdGUgb2YgZnVuY3Rpb25hbGl0eQotICogYWN0cyBvbiBhIHNldCBvZiBkYXRhIGluIGEgY29uc2lzdGVudCB3YXkgZXZlbiB0aG91Z2ggdGhlIAotICogcHJpbWl0aXZlIHR5cGUgb2YgdGhlIGRhdGEgbWF5IHZhcnkgZnJvbSBvbmUgdXNlIHRvIHRoZSBuZXh0LiAKKyAqIFRoZSBDbGFzcyBEYXRhQnVmZmVyIGlzIGEgd3JhcHBlciBjbGFzcyBmb3IgYSBkYXRhIGFycmF5IHRvIGJlIHVzZWQgZm9yIHRoZQorICogc2l0dWF0aW9uIHdoZXJlIGEgc3VpdGUgb2YgZnVuY3Rpb25hbGl0eSBhY3RzIG9uIGEgc2V0IG9mIGRhdGEgaW4gYQorICogY29uc2lzdGVudCB3YXkgZXZlbiB0aG91Z2ggdGhlIHByaW1pdGl2ZSB0eXBlIG9mIHRoZSBkYXRhIG1heSB2YXJ5IGZyb20gb25lCisgKiB1c2UgdG8gdGhlIG5leHQuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGF0YUJ1ZmZlciB7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFRZUEVfQllURS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgVFlQRV9CWVRFLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfQllURSA9IDA7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFRZUEVfVVNIT1JULiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX1VTSE9SVC4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1VTSE9SVCA9IDE7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFRZUEVfU0hPUlQuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfU0hPUlQuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9TSE9SVCA9IDI7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFRZUEVfSU5ULiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX0lOVC4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0lOVCA9IDM7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFRZUEVfRkxPQVQuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFRZUEVfRkxPQVQuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9GTE9BVCA9IDQ7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFRZUEVfRE9VQkxFLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX0RPVUJMRS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0RPVUJMRSA9IDU7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFRZUEVfVU5ERUZJTkVELiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUWVBFX1VOREVGSU5FRC4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1VOREVGSU5FRCA9IDMyOwogCi0gICAgLyoqIFRoZSBkYXRhIHR5cGUgaW5kaWNhdGVzIHRoZSBwcmltaXRpdmUgdHlwZSBvZiB0aGUgCi0gICAgICogZGF0YSBpbiB0aGlzIERhdGFCdWZmZXIuICovCisgICAgLyoqCisgICAgICogVGhlIGRhdGEgdHlwZSBpbmRpY2F0ZXMgdGhlIHByaW1pdGl2ZSB0eXBlIG9mIHRoZSBkYXRhIGluIHRoaXMKKyAgICAgKiBEYXRhQnVmZmVyLgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgZGF0YVR5cGU7CiAKLSAgICAvKiogVGhlIG51bWJlciBvZiBkYXRhIGFycmF5cyBpbiB0aGlzIERhdGFCdWZmZXIuICovCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBkYXRhIGFycmF5cyBpbiB0aGlzIERhdGFCdWZmZXIuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBiYW5rczsKIAotICAgIC8qKiBUaGUgc3RhcnRpbmcgaW5kZXggZm9yIHJlYWRpbmcgdGhlIAotICAgICAqIGRhdGEgZnJvbSB0aGUgZmlyc3QgKG9yIG9ubHkpIGludGVybmFsIGRhdGEgYXJyYXkuICovCisgICAgLyoqCisgICAgICogVGhlIHN0YXJ0aW5nIGluZGV4IGZvciByZWFkaW5nIHRoZSBkYXRhIGZyb20gdGhlIGZpcnN0IChvciBvbmx5KSBpbnRlcm5hbAorICAgICAqIGRhdGEgYXJyYXkuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBvZmZzZXQ7CiAKLSAgICAvKiogVGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSBvZiB0aGUgZGF0YSBhcnJheXMuICovCisgICAgLyoqCisgICAgICogVGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSBvZiB0aGUgZGF0YSBhcnJheXMuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBzaXplOwogCi0gICAgLyoqIFRoZSBzdGFydGluZyBpbmRpY2VzIGZvciByZWFkaW5nIHRoZSAKLSAgICAgKiBkYXRhIGZyb20gdGhlIGludGVybmFsIGRhdGEgYXJyYXlzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBzdGFydGluZyBpbmRpY2VzIGZvciByZWFkaW5nIHRoZSBkYXRhIGZyb20gdGhlIGludGVybmFsIGRhdGEgYXJyYXlzLgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgb2Zmc2V0c1tdOwotICAgIAotICAgIC8qKiBUaGUgZGF0YSBjaGFuZ2VkLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGRhdGEgY2hhbmdlZC4KKyAgICAgKi8KICAgICBib29sZWFuIGRhdGFDaGFuZ2VkID0gdHJ1ZTsKLSAgICAKLSAgICAvKiogVGhlIGRhdGEgdGFrZW4uICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGF0YSB0YWtlbi4KKyAgICAgKi8KICAgICBib29sZWFuIGRhdGFUYWtlbiA9IGZhbHNlOwotICAgIAotICAgIC8qKiBUaGUgbGlzdGVuZXIuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlzdGVuZXIuCisgICAgICovCiAgICAgRGF0YUJ1ZmZlckxpc3RlbmVyIGxpc3RlbmVyOwogCiAgICAgc3RhdGljIHsKQEAgLTg2LDExICsxMTgsMTUgQEAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZGF0YSBidWZmZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFUeXBlIHRoZSBkYXRhIHR5cGUKLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIG9mIHRoZSBkYXRhIGFycmF5cwotICAgICAqIEBwYXJhbSBudW1CYW5rcyB0aGUgbnVtYmVyIG9mIGRhdGEgYXJyYXlzIHRvIGNyZWF0ZQotICAgICAqIEBwYXJhbSBvZmZzZXRzIHRoZSBzdGFydGluZyBpbmRpY2VzIGZvciByZWFkaW5nIHRoZSAKLSAgICAgKiBkYXRhIGZyb20gdGhlIGludGVybmFsIGRhdGEgYXJyYXlzCisgICAgICogQHBhcmFtIGRhdGFUeXBlCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSB0eXBlLgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIG9mIHRoZSBkYXRhIGFycmF5cy4KKyAgICAgKiBAcGFyYW0gbnVtQmFua3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZGF0YSBhcnJheXMgdG8gY3JlYXRlLgorICAgICAqIEBwYXJhbSBvZmZzZXRzCisgICAgICogICAgICAgICAgICB0aGUgc3RhcnRpbmcgaW5kaWNlcyBmb3IgcmVhZGluZyB0aGUgZGF0YSBmcm9tIHRoZSBpbnRlcm5hbAorICAgICAqICAgICAgICAgICAgZGF0YSBhcnJheXMuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIERhdGFCdWZmZXIoaW50IGRhdGFUeXBlLCBpbnQgc2l6ZSwgaW50IG51bUJhbmtzLCBpbnRbXSBvZmZzZXRzKSB7CiAgICAgICAgIHRoaXMuZGF0YVR5cGUgPSBkYXRhVHlwZTsKQEAgLTEwMSwxMyArMTM3LDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyIHdpdGggYWxsIG9mIHRoZSAKLSAgICAgKiBkYXRhIGFycmF5cyBzdGFydGluZyBhdCB0aGUgc2FtZSBpbmRleC4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZGF0YSBidWZmZXIgd2l0aCBhbGwgb2YgdGhlIGRhdGEgYXJyYXlzIHN0YXJ0aW5nIGF0CisgICAgICogdGhlIHNhbWUgaW5kZXguCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFUeXBlIHRoZSBkYXRhIHR5cGUKLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIG9mIHRoZSBkYXRhIGFycmF5cwotICAgICAqIEBwYXJhbSBudW1CYW5rcyB0aGUgbnVtYmVyIG9mIGRhdGEgYXJyYXlzIHRvIGNyZWF0ZQotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCB0byB1c2UgZm9yIGFsbCBvZiB0aGUgZGF0YSBhcnJheXMKKyAgICAgKiBAcGFyYW0gZGF0YVR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIHR5cGUuCisgICAgICogQHBhcmFtIHNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgb2YgdGhlIGRhdGEgYXJyYXlzLgorICAgICAqIEBwYXJhbSBudW1CYW5rcworICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBkYXRhIGFycmF5cyB0byBjcmVhdGUuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCB0byB1c2UgZm9yIGFsbCBvZiB0aGUgZGF0YSBhcnJheXMuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIERhdGFCdWZmZXIoaW50IGRhdGFUeXBlLCBpbnQgc2l6ZSwgaW50IG51bUJhbmtzLCBpbnQgb2Zmc2V0KSB7CiAgICAgICAgIHRoaXMuZGF0YVR5cGUgPSBkYXRhVHlwZTsKQEAgLTEyMiwxMiArMTYyLDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyIHdpdGggYWxsIG9mIHRoZSAKLSAgICAgKiBkYXRhIGFycmF5cyByZWFkIGZyb20gdGhlIGJlZ2lubmluZyAoYXQgb2Zmc2V0IHplcm8pLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkYXRhIGJ1ZmZlciB3aXRoIGFsbCBvZiB0aGUgZGF0YSBhcnJheXMgcmVhZCBmcm9tIHRoZQorICAgICAqIGJlZ2lubmluZyAoYXQgb2Zmc2V0IHplcm8pLgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhVHlwZSB0aGUgZGF0YSB0eXBlCi0gICAgICogQHBhcmFtIHNpemUgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSBvZiB0aGUgZGF0YSBhcnJheXMKLSAgICAgKiBAcGFyYW0gbnVtQmFua3MgdGhlIG51bWJlciBvZiBkYXRhIGFycmF5cyB0byBjcmVhdGUKKyAgICAgKiBAcGFyYW0gZGF0YVR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIHR5cGUuCisgICAgICogQHBhcmFtIHNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgb2YgdGhlIGRhdGEgYXJyYXlzLgorICAgICAqIEBwYXJhbSBudW1CYW5rcworICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBkYXRhIGFycmF5cyB0byBjcmVhdGUuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIERhdGFCdWZmZXIoaW50IGRhdGFUeXBlLCBpbnQgc2l6ZSwgaW50IG51bUJhbmtzKSB7CiAgICAgICAgIHRoaXMuZGF0YVR5cGUgPSBkYXRhVHlwZTsKQEAgLTEzOCwxMSArMTgxLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyIHdpdGggb25lIGludGVybmFsIGRhdGEgYXJyYXkKLSAgICAgKiByZWFkIGZyb20gdGhlIGJlZ2lubmluZyAoYXQgb2Zmc2V0IHplcm8pLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkYXRhIGJ1ZmZlciB3aXRoIG9uZSBpbnRlcm5hbCBkYXRhIGFycmF5IHJlYWQgZnJvbSB0aGUKKyAgICAgKiBiZWdpbm5pbmcgKGF0IG9mZnNldCB6ZXJvKS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YVR5cGUgdGhlIGRhdGEgdHlwZQotICAgICAqIEBwYXJhbSBzaXplIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgb2YgdGhlIGRhdGEgYXJyYXlzCisgICAgICogQHBhcmFtIGRhdGFUeXBlCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSB0eXBlLgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIG9mIHRoZSBkYXRhIGFycmF5cy4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgRGF0YUJ1ZmZlcihpbnQgZGF0YVR5cGUsIGludCBzaXplKSB7CiAgICAgICAgIHRoaXMuZGF0YVR5cGUgPSBkYXRhVHlwZTsKQEAgLTE1MywxNjUgKzE5OCwxNjEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkYXRhIHZhbHVlIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkgYXQgdGhlIAotICAgICAqIHNwZWNpZmllZCBpbmRleC4KKyAgICAgKiBTZXRzIHRoZSBkYXRhIHZhbHVlIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYmFuayB0aGUgaW50ZXJuYWwgYXJyYXkgdG8gdGhlIGRhdGEgdG8KLSAgICAgKiBAcGFyYW0gaSB0aGUgaW5kZXggd2l0aGluIHRoZSBhcnJheSB3aGVyZSB0aGUgZGF0YQotICAgICAqIHNob3VsZCBiZSB3cml0dGVuCi0gICAgICogQHBhcmFtIHZhbCB0aGUgdmFsdWUgdG8gd3JpdGUgaW50byB0aGUgYXJyYXkKKyAgICAgKiBAcGFyYW0gYmFuaworICAgICAqICAgICAgICAgICAgdGhlIGludGVybmFsIGFycmF5IHRvIHRoZSBkYXRhIHRvLgorICAgICAqIEBwYXJhbSBpCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggd2l0aGluIHRoZSBhcnJheSB3aGVyZSB0aGUgZGF0YSBzaG91bGQgYmUgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gdmFsCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gd3JpdGUgaW50byB0aGUgYXJyYXkuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RWxlbShpbnQgYmFuaywgaW50IGksIGludCB2YWwpOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgZmxvYXQgZGF0YSB2YWx1ZSBpbiB0aGUgc3BlY2lmaWVkIGFycmF5IGF0IHRoZSAKLSAgICAgKiBzcGVjaWZpZWQgaW5kZXguCisgICAgICogU2V0cyB0aGUgZmxvYXQgZGF0YSB2YWx1ZSBpbiB0aGUgc3BlY2lmaWVkIGFycmF5IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCiAgICAgICogCi0gICAgICogQHBhcmFtIGJhbmsgdGhlIGludGVybmFsIGFycmF5IHRvIHRoZSBkYXRhIHRvCi0gICAgICogQHBhcmFtIGkgdGhlIGluZGV4IHdpdGhpbiB0aGUgYXJyYXkgd2hlcmUgdGhlIGRhdGEKLSAgICAgKiBzaG91bGQgYmUgd3JpdHRlbgotICAgICAqIEBwYXJhbSB2YWwgdGhlIHZhbHVlIHRvIHdyaXRlIGludG8gdGhlIGFycmF5CisgICAgICogQHBhcmFtIGJhbmsKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlcm5hbCBhcnJheSB0byB0aGUgZGF0YSB0by4KKyAgICAgKiBAcGFyYW0gaQorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IHdpdGhpbiB0aGUgYXJyYXkgd2hlcmUgdGhlIGRhdGEgc2hvdWxkIGJlIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIHZhbAorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIHdyaXRlIGludG8gdGhlIGFycmF5LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEVsZW1GbG9hdChpbnQgYmFuaywgaW50IGksIGZsb2F0IHZhbCkgewotICAgICAgICBzZXRFbGVtKGJhbmssIGksIChpbnQpIHZhbCk7CisgICAgICAgIHNldEVsZW0oYmFuaywgaSwgKGludCl2YWwpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRvdWJsZSBkYXRhIHZhbHVlIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkgYXQgdGhlIAotICAgICAqIHNwZWNpZmllZCBpbmRleC4KKyAgICAgKiBTZXRzIHRoZSBkb3VibGUgZGF0YSB2YWx1ZSBpbiB0aGUgc3BlY2lmaWVkIGFycmF5IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCiAgICAgICogCi0gICAgICogQHBhcmFtIGJhbmsgdGhlIGludGVybmFsIGFycmF5IHRvIHRoZSBkYXRhIHRvCi0gICAgICogQHBhcmFtIGkgdGhlIGluZGV4IHdpdGhpbiB0aGUgYXJyYXkgd2hlcmUgdGhlIGRhdGEKLSAgICAgKiBzaG91bGQgYmUgd3JpdHRlbgotICAgICAqIEBwYXJhbSB2YWwgdGhlIHZhbHVlIHRvIHdyaXRlIGludG8gdGhlIGFycmF5CisgICAgICogQHBhcmFtIGJhbmsKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlcm5hbCBhcnJheSB0byB0aGUgZGF0YSB0by4KKyAgICAgKiBAcGFyYW0gaQorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IHdpdGhpbiB0aGUgYXJyYXkgd2hlcmUgdGhlIGRhdGEgc2hvdWxkIGJlIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIHZhbAorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIHdyaXRlIGludG8gdGhlIGFycmF5LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEVsZW1Eb3VibGUoaW50IGJhbmssIGludCBpLCBkb3VibGUgdmFsKSB7Ci0gICAgICAgIHNldEVsZW0oYmFuaywgaSwgKGludCkgdmFsKTsKKyAgICAgICAgc2V0RWxlbShiYW5rLCBpLCAoaW50KXZhbCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGF0YSB2YWx1ZSBpbiB0aGUgZmlyc3QgYXJyYXkgYXQgdGhlIAotICAgICAqIHNwZWNpZmllZCBpbmRleC4KKyAgICAgKiBTZXRzIHRoZSBkYXRhIHZhbHVlIGluIHRoZSBmaXJzdCBhcnJheSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAqIAotICAgICAqIEBwYXJhbSBpIHRoZSBpbmRleCB3aXRoaW4gdGhlIGFycmF5IHdoZXJlIHRoZSBkYXRhCi0gICAgICogc2hvdWxkIGJlIHdyaXR0ZW4KLSAgICAgKiBAcGFyYW0gdmFsIHRoZSB2YWx1ZSB0byB3cml0ZSBpbnRvIHRoZSBhcnJheQorICAgICAqIEBwYXJhbSBpCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggd2l0aGluIHRoZSBhcnJheSB3aGVyZSB0aGUgZGF0YSBzaG91bGQgYmUgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gdmFsCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gd3JpdGUgaW50byB0aGUgYXJyYXkuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RWxlbShpbnQgaSwgaW50IHZhbCkgewogICAgICAgICBzZXRFbGVtKDAsIGksIHZhbCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGF0YSB2YWx1ZSBmcm9tIHRoZSBzcGVjaWZpZWQgZGF0YSBhcnJheSBhdCB0aGUgCi0gICAgICogc3BlY2lmaWVkIGluZGV4LgorICAgICAqIEdldHMgdGhlIGRhdGEgdmFsdWUgZnJvbSB0aGUgc3BlY2lmaWVkIGRhdGEgYXJyYXkgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYmFuayB0aGUgZGF0YSBhcnJheSB0byByZWFkIGZyb20KLSAgICAgKiBAcGFyYW0gaSB0aGUgaW5kZXggd2l0aGluIHRoZSBhcnJheSB3aGVyZSB0aGUgZGF0YQotICAgICAqIHNob3VsZCBiZSByZWFkCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGF0YSBlbGVtZW50CisgICAgICogQHBhcmFtIGJhbmsKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIGFycmF5IHRvIHJlYWQgZnJvbS4KKyAgICAgKiBAcGFyYW0gaQorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IHdpdGhpbiB0aGUgYXJyYXkgd2hlcmUgdGhlIGRhdGEgc2hvdWxkIGJlIHJlYWQuCisgICAgICogQHJldHVybiB0aGUgZGF0YSBlbGVtZW50LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0RWxlbShpbnQgYmFuaywgaW50IGkpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgZmxvYXQtdHlwZSBkYXRhIHZhbHVlIGZyb20gdGhlIHNwZWNpZmllZCAKLSAgICAgKiBkYXRhIGFycmF5IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCisgICAgICogR2V0cyB0aGUgZmxvYXQtdHlwZSBkYXRhIHZhbHVlIGZyb20gdGhlIHNwZWNpZmllZCBkYXRhIGFycmF5IGF0IHRoZQorICAgICAqIHNwZWNpZmllZCBpbmRleC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYmFuayB0aGUgZGF0YSBhcnJheSB0byByZWFkIGZyb20KLSAgICAgKiBAcGFyYW0gaSB0aGUgaW5kZXggd2l0aGluIHRoZSBhcnJheSB3aGVyZSB0aGUgZGF0YQotICAgICAqIHNob3VsZCBiZSByZWFkCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGF0YSBlbGVtZW50CisgICAgICogQHBhcmFtIGJhbmsKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIGFycmF5IHRvIHJlYWQgZnJvbS4KKyAgICAgKiBAcGFyYW0gaQorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IHdpdGhpbiB0aGUgYXJyYXkgd2hlcmUgdGhlIGRhdGEgc2hvdWxkIGJlIHJlYWQuCisgICAgICogQHJldHVybiB0aGUgZGF0YSBlbGVtZW50LgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdCBnZXRFbGVtRmxvYXQoaW50IGJhbmssIGludCBpKSB7CiAgICAgICAgIHJldHVybiBnZXRFbGVtKGJhbmssIGkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGRvdWJsZS10eXBlIGRhdGEgdmFsdWUgZnJvbSB0aGUgc3BlY2lmaWVkIAotICAgICAqIGRhdGEgYXJyYXkgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KKyAgICAgKiBHZXRzIHRoZSBkb3VibGUtdHlwZSBkYXRhIHZhbHVlIGZyb20gdGhlIHNwZWNpZmllZCBkYXRhIGFycmF5IGF0IHRoZQorICAgICAqIHNwZWNpZmllZCBpbmRleC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYmFuayB0aGUgZGF0YSBhcnJheSB0byByZWFkIGZyb20KLSAgICAgKiBAcGFyYW0gaSB0aGUgaW5kZXggd2l0aGluIHRoZSBhcnJheSB3aGVyZSB0aGUgZGF0YQotICAgICAqIHNob3VsZCBiZSByZWFkCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGF0YSBlbGVtZW50CisgICAgICogQHBhcmFtIGJhbmsKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIGFycmF5IHRvIHJlYWQgZnJvbS4KKyAgICAgKiBAcGFyYW0gaQorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IHdpdGhpbiB0aGUgYXJyYXkgd2hlcmUgdGhlIGRhdGEgc2hvdWxkIGJlIHJlYWQuCisgICAgICogQHJldHVybiB0aGUgZGF0YSBlbGVtZW50LgogICAgICAqLwogICAgIHB1YmxpYyBkb3VibGUgZ2V0RWxlbURvdWJsZShpbnQgYmFuaywgaW50IGkpIHsKICAgICAgICAgcmV0dXJuIGdldEVsZW0oYmFuaywgaSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgZmxvYXQgZGF0YSB2YWx1ZSBpbiB0aGUgZmlyc3QgYXJyYXkgYXQgdGhlIAotICAgICAqIHNwZWNpZmllZCBpbmRleC4KKyAgICAgKiBTZXRzIHRoZSBmbG9hdCBkYXRhIHZhbHVlIGluIHRoZSBmaXJzdCBhcnJheSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAqIAotICAgICAqIEBwYXJhbSBpIHRoZSBpbmRleCB3aXRoaW4gdGhlIGFycmF5IHdoZXJlIHRoZSBkYXRhCi0gICAgICogc2hvdWxkIGJlIHdyaXR0ZW4KLSAgICAgKiBAcGFyYW0gdmFsIHRoZSB2YWx1ZSB0byB3cml0ZSBpbnRvIHRoZSBhcnJheQorICAgICAqIEBwYXJhbSBpCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggd2l0aGluIHRoZSBhcnJheSB3aGVyZSB0aGUgZGF0YSBzaG91bGQgYmUgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gdmFsCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gd3JpdGUgaW50byB0aGUgYXJyYXkuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RWxlbUZsb2F0KGludCBpLCBmbG9hdCB2YWwpIHsKICAgICAgICAgc2V0RWxlbUZsb2F0KDAsIGksIHZhbCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgZG91YmxlIGRhdGEgdmFsdWUgaW4gdGhlIGZpcnN0IGFycmF5IGF0IHRoZSAKLSAgICAgKiBzcGVjaWZpZWQgaW5kZXguCisgICAgICogU2V0cyB0aGUgZG91YmxlIGRhdGEgdmFsdWUgaW4gdGhlIGZpcnN0IGFycmF5IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCiAgICAgICogCi0gICAgICogQHBhcmFtIGkgdGhlIGluZGV4IHdpdGhpbiB0aGUgYXJyYXkgd2hlcmUgdGhlIGRhdGEKLSAgICAgKiBzaG91bGQgYmUgd3JpdHRlbgotICAgICAqIEBwYXJhbSB2YWwgdGhlIHZhbHVlIHRvIHdyaXRlIGludG8gdGhlIGFycmF5CisgICAgICogQHBhcmFtIGkKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCB3aXRoaW4gdGhlIGFycmF5IHdoZXJlIHRoZSBkYXRhIHNob3VsZCBiZSB3cml0dGVuLgorICAgICAqIEBwYXJhbSB2YWwKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byB3cml0ZSBpbnRvIHRoZSBhcnJheS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRFbGVtRG91YmxlKGludCBpLCBkb3VibGUgdmFsKSB7CiAgICAgICAgIHNldEVsZW1Eb3VibGUoMCwgaSwgdmFsKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkYXRhIHZhbHVlIGZyb20gdGhlIGZpcnN0IAotICAgICAqIGRhdGEgYXJyYXkgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBhbmQgcmV0dXJucyBpdAotICAgICAqIGFzIGFuIGludC4KKyAgICAgKiBHZXRzIHRoZSBkYXRhIHZhbHVlIGZyb20gdGhlIGZpcnN0IGRhdGEgYXJyYXkgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBhbmQKKyAgICAgKiByZXR1cm5zIGl0IGFzIGFuIGludGVnZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGkgdGhlIGluZGV4IHdpdGhpbiB0aGUgYXJyYXkgd2hlcmUgdGhlIGRhdGEKLSAgICAgKiBzaG91bGQgYmUgcmVhZAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRhdGEgZWxlbWVudAorICAgICAqIEBwYXJhbSBpCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggd2l0aGluIHRoZSBhcnJheSB3aGVyZSB0aGUgZGF0YSBzaG91bGQgYmUgcmVhZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBkYXRhIGVsZW1lbnQuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRFbGVtKGludCBpKSB7CiAgICAgICAgIHJldHVybiBnZXRFbGVtKDAsIGkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGRhdGEgdmFsdWUgZnJvbSB0aGUgZmlyc3QgCi0gICAgICogZGF0YSBhcnJheSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGFuZCByZXR1cm5zIGl0Ci0gICAgICogYXMgYSBmbG9hdC4KKyAgICAgKiBHZXRzIHRoZSBkYXRhIHZhbHVlIGZyb20gdGhlIGZpcnN0IGRhdGEgYXJyYXkgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBhbmQKKyAgICAgKiByZXR1cm5zIGl0IGFzIGEgZmxvYXQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGkgdGhlIGluZGV4IHdpdGhpbiB0aGUgYXJyYXkgd2hlcmUgdGhlIGRhdGEKLSAgICAgKiBzaG91bGQgYmUgcmVhZAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRhdGEgZWxlbWVudAorICAgICAqIEBwYXJhbSBpCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggd2l0aGluIHRoZSBhcnJheSB3aGVyZSB0aGUgZGF0YSBzaG91bGQgYmUgcmVhZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBkYXRhIGVsZW1lbnQuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldEVsZW1GbG9hdChpbnQgaSkgewogICAgICAgICByZXR1cm4gZ2V0RWxlbSgwLCBpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkYXRhIHZhbHVlIGZyb20gdGhlIGZpcnN0IAotICAgICAqIGRhdGEgYXJyYXkgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBhbmQgcmV0dXJucyBpdAotICAgICAqIGFzIGEgZG91YmxlLgorICAgICAqIEdldHMgdGhlIGRhdGEgdmFsdWUgZnJvbSB0aGUgZmlyc3QgZGF0YSBhcnJheSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGFuZAorICAgICAqIHJldHVybnMgaXQgYXMgYSBkb3VibGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGkgdGhlIGluZGV4IHdpdGhpbiB0aGUgYXJyYXkgd2hlcmUgdGhlIGRhdGEKLSAgICAgKiBzaG91bGQgYmUgcmVhZAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRhdGEgZWxlbWVudAorICAgICAqIEBwYXJhbSBpCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggd2l0aGluIHRoZSBhcnJheSB3aGVyZSB0aGUgZGF0YSBzaG91bGQgYmUgcmVhZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBkYXRhIGVsZW1lbnQuCiAgICAgICovCiAgICAgcHVibGljIGRvdWJsZSBnZXRFbGVtRG91YmxlKGludCBpKSB7CiAgICAgICAgIHJldHVybiBnZXRFbGVtKGkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGFycmF5IGdpdmluZyB0aGUgb2Zmc2V0cyBjb3JyZXNwb25kaW5nIAotICAgICAqIHRvIHRoZSBpbnRlcm5hbCBkYXRhIGFycmF5cy4KKyAgICAgKiBHZXRzIHRoZSBhcnJheSBnaXZpbmcgdGhlIG9mZnNldHMgY29ycmVzcG9uZGluZyB0byB0aGUgaW50ZXJuYWwgZGF0YQorICAgICAqIGFycmF5cy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBvZmZzZXRzCisgICAgICogQHJldHVybiB0aGUgYXJyYXkgb2Ygb2Zmc2V0cy4KICAgICAgKi8KICAgICBwdWJsaWMgaW50W10gZ2V0T2Zmc2V0cygpIHsKICAgICAgICAgcmV0dXJuIG9mZnNldHM7CkBAIC0zMjAsMTggKzM2MSwxNiBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHNpemUgaW4gYml0cyBvZiB0aGUgcHJpbWl0aXZlIGRhdGEgdHlwZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzaXplIGluIGJpdHMgb2YgdGhlIHByaW1pdGl2ZSBkYXRhIHR5cGUKLQorICAgICAqIEByZXR1cm4gdGhlIHNpemUgaW4gYml0cyBvZiB0aGUgcHJpbWl0aXZlIGRhdGEgdHlwZS4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFNpemUoKSB7CiAgICAgICAgIHJldHVybiBzaXplOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIG9mZnNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaXJzdCBpbnRlcm5hbCAKLSAgICAgKiBkYXRhIGFycmF5LgorICAgICAqIEdldHMgdGhlIG9mZnNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaXJzdCBpbnRlcm5hbCBkYXRhIGFycmF5LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG9mZnNldAorICAgICAqIEByZXR1cm4gdGhlIG9mZnNldC4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKICAgICAgICAgcmV0dXJuIG9mZnNldDsKQEAgLTM0MCw3ICszNzksNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBkYXRhIGFycmF5cyBpbiB0aGlzIERhdGFCdWZmZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGRhdGEgYXJyYXlzCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGRhdGEgYXJyYXlzLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TnVtQmFua3MoKSB7CiAgICAgICAgIHJldHVybiBiYW5rczsKQEAgLTM0OSw3ICszODgsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHByaW1pdGl2ZSB0eXBlIG9mIHRoaXMgYnVmZmVyJ3MgZGF0YS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkYXRhIHR5cGUKKyAgICAgKiBAcmV0dXJuIHRoZSBkYXRhIHR5cGUuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXREYXRhVHlwZSgpIHsKICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVR5cGU7CkBAIC0zNTgsODUgKzM5Nyw4NSBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHNpemUgaW4gYml0cyBvZiB0aGUgcHJpbWl0aXZlIGRhdGEgdHlwZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHlwZSB0aGUgcHJpbWl0aXZlIHR5cGUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzaXplIGluIGJpdHMgb2YgdGhlIHByaW1pdGl2ZSBkYXRhIHR5cGUKKyAgICAgKiBAcGFyYW0gdHlwZQorICAgICAqICAgICAgICAgICAgdGhlIHByaW1pdGl2ZSB0eXBlLgorICAgICAqIEByZXR1cm4gdGhlIHNpemUgaW4gYml0cyBvZiB0aGUgcHJpbWl0aXZlIGRhdGEgdHlwZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGludCBnZXREYXRhVHlwZVNpemUoaW50IHR5cGUpIHsKICAgICAgICAgc3dpdGNoICh0eXBlKSB7CiAKLSAgICAgICAgY2FzZSBUWVBFX0JZVEU6Ci0gICAgICAgICAgICByZXR1cm4gODsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9CWVRFOgorICAgICAgICAgICAgICAgIHJldHVybiA4OwogCi0gICAgICAgIGNhc2UgVFlQRV9VU0hPUlQ6Ci0gICAgICAgIGNhc2UgVFlQRV9TSE9SVDoKLSAgICAgICAgICAgIHJldHVybiAxNjsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9VU0hPUlQ6CisgICAgICAgICAgICBjYXNlIFRZUEVfU0hPUlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIDE2OwogCi0gICAgICAgIGNhc2UgVFlQRV9JTlQ6Ci0gICAgICAgIGNhc2UgVFlQRV9GTE9BVDoKLSAgICAgICAgICAgIHJldHVybiAzMjsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9JTlQ6CisgICAgICAgICAgICBjYXNlIFRZUEVfRkxPQVQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIDMyOwogCi0gICAgICAgIGNhc2UgVFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICByZXR1cm4gNjQ7CisgICAgICAgICAgICBjYXNlIFRZUEVfRE9VQkxFOgorICAgICAgICAgICAgICAgIHJldHVybiA2NDsKIAotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gYXd0LjIyQz1Vbmtub3duIGRhdGEgdHlwZSB7MH0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjJDIiwgdHlwZSkpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIGF3dC4yMkM9VW5rbm93biBkYXRhIHR5cGUgezB9CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMkMiLCB0eXBlKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIE5vdGlmaWVzIHRoZSBsaXN0ZW5lciB0aGF0IHRoZSBkYXRhIGhhcyBjaGFuZ2VkLgogICAgICAqLwotICAgIHZvaWQgbm90aWZ5Q2hhbmdlZCgpewotICAgICAgICBpZihsaXN0ZW5lciAhPSBudWxsICYmICFkYXRhQ2hhbmdlZCl7CisgICAgdm9pZCBub3RpZnlDaGFuZ2VkKCkgeworICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCAmJiAhZGF0YUNoYW5nZWQpIHsKICAgICAgICAgICAgIGRhdGFDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgICAgIGxpc3RlbmVyLmRhdGFDaGFuZ2VkKCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBOb3RpZmllcyB0aGUgbGlzdGVuZXIgdGhhdCB0aGUgZGF0YSBoYXMgYmVlbiByZWxlYXNlZC4KICAgICAgKi8KLSAgICB2b2lkIG5vdGlmeVRha2VuKCl7Ci0gICAgICAgIGlmKGxpc3RlbmVyICE9IG51bGwgJiYgIWRhdGFUYWtlbil7CisgICAgdm9pZCBub3RpZnlUYWtlbigpIHsKKyAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwgJiYgIWRhdGFUYWtlbikgewogICAgICAgICAgICAgZGF0YVRha2VuID0gdHJ1ZTsKICAgICAgICAgICAgIGxpc3RlbmVyLmRhdGFUYWtlbigpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmVsZWFzZSB0aGUgZGF0YS4KICAgICAgKi8KLSAgICB2b2lkIHJlbGVhc2VEYXRhKCl7Ci0gICAgICAgIGlmKGxpc3RlbmVyICE9IG51bGwgJiYgZGF0YVRha2VuKXsKKyAgICB2b2lkIHJlbGVhc2VEYXRhKCkgeworICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCAmJiBkYXRhVGFrZW4pIHsKICAgICAgICAgICAgIGRhdGFUYWtlbiA9IGZhbHNlOwogICAgICAgICAgICAgbGlzdGVuZXIuZGF0YVJlbGVhc2VkKCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBBZGRzIHRoZSBkYXRhIGJ1ZmZlciBsaXN0ZW5lci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyCisgICAgICogQHBhcmFtIGxpc3RlbmVyCisgICAgICogICAgICAgICAgICB0aGUgbGlzdGVuZXIuCiAgICAgICovCi0gICAgdm9pZCBhZGREYXRhQnVmZmVyTGlzdGVuZXIoRGF0YUJ1ZmZlckxpc3RlbmVyIGxpc3RlbmVyKXsKKyAgICB2b2lkIGFkZERhdGFCdWZmZXJMaXN0ZW5lcihEYXRhQnVmZmVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKICAgICAgICAgdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJlbW92ZXMgdGhlIGRhdGEgYnVmZmVyIGxpc3RlbmVyLgogICAgICAqLwotICAgIHZvaWQgcmVtb3ZlRGF0YUJ1ZmZlckxpc3RlbmVyKCl7CisgICAgdm9pZCByZW1vdmVEYXRhQnVmZmVyTGlzdGVuZXIoKSB7CiAgICAgICAgIGxpc3RlbmVyID0gbnVsbDsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBWYWxpZGF0ZS4KICAgICAgKi8KLSAgICB2b2lkIHZhbGlkYXRlKCl7CisgICAgdm9pZCB2YWxpZGF0ZSgpIHsKICAgICAgICAgZGF0YUNoYW5nZWQgPSBmYWxzZTsKICAgICB9Ci0gICAgCi19CiAKK30KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9EYXRhQnVmZmVyQnl0ZS5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL0RhdGFCdWZmZXJCeXRlLmphdmEKaW5kZXggNGQyOWM5Yy4uMzQwN2RlOCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL0RhdGFCdWZmZXJCeXRlLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL0RhdGFCdWZmZXJCeXRlLmphdmEKQEAgLTE4LDI1ICsxOCwzMiBAQAogICogQGF1dGhvciBJZ29yIFYuIFN0b2x5YXJvdgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuaW1hZ2U7CiAKIC8qKgotICogVGhlIENsYXNzIERhdGFCdWZmZXJCeXRlIGlzIHRoZSBzdWJjbGFzcyBvZiBEYXRhQnVmZmVyCi0gKiBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIHVuZGVybHlpbmcgZGF0YSBpcyBvZiB0eXBlIGJ5dGUuCisgKiBUaGUgQ2xhc3MgRGF0YUJ1ZmZlckJ5dGUgaXMgdGhlIHN1YmNsYXNzIG9mIERhdGFCdWZmZXIgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZQorICogdW5kZXJseWluZyBkYXRhIGlzIG9mIHR5cGUgYnl0ZS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBEYXRhQnVmZmVyQnl0ZSBleHRlbmRzIERhdGFCdWZmZXIgewogCi0gICAgLyoqIFRoZSBkYXRhLiAqLworICAgIC8qKgorICAgICAqIFRoZSBkYXRhLgorICAgICAqLwogICAgIGJ5dGUgZGF0YVtdW107CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZGF0YSBidWZmZXIgb2YgdHlwZSB1bnNpZ25lZCBzaG9ydC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YUFycmF5cyB0aGUgZGF0YSBhcnJheXMgdG8gY29weSB0aGUgZGF0YSBmcm9tCi0gICAgICogQHBhcmFtIHNpemUgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UgCi0gICAgICogZnJvbSB0aGUgZGF0YSBhcnJheXMKLSAgICAgKiBAcGFyYW0gb2Zmc2V0cyB0aGUgc3RhcnRpbmcgaW5kaWNlcyBmb3IgcmVhZGluZyB0aGUgCi0gICAgICogZGF0YSBmcm9tIHRoZSBpbnRlcm5hbCBkYXRhIGFycmF5cworICAgICAqIEBwYXJhbSBkYXRhQXJyYXlzCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSBhcnJheXMgdG8gY29weSB0aGUgZGF0YSBmcm9tLgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSBmcm9tIHRoZSBkYXRhIGFycmF5cy4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0cworICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIGluZGljZXMgZm9yIHJlYWRpbmcgdGhlIGRhdGEgZnJvbSB0aGUgaW50ZXJuYWwKKyAgICAgKiAgICAgICAgICAgIGRhdGEgYXJyYXlzLgogICAgICAqLwogICAgIHB1YmxpYyBEYXRhQnVmZmVyQnl0ZShieXRlIGRhdGFBcnJheXNbXVtdLCBpbnQgc2l6ZSwgaW50IG9mZnNldHNbXSkgewogICAgICAgICBzdXBlcihUWVBFX0JZVEUsIHNpemUsIGRhdGFBcnJheXMubGVuZ3RoLCBvZmZzZXRzKTsKQEAgLTQ2LDkgKzUzLDEwIEBACiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyIG9mIHR5cGUgdW5zaWduZWQgc2hvcnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFBcnJheXMgdGhlIGRhdGEgYXJyYXlzIHRvIGNvcHkgdGhlIGRhdGEgZnJvbQotICAgICAqIEBwYXJhbSBzaXplIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlIAotICAgICAqIGZyb20gdGhlIGRhdGEgYXJyYXlzCisgICAgICogQHBhcmFtIGRhdGFBcnJheXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIGFycmF5cyB0byBjb3B5IHRoZSBkYXRhIGZyb20uCisgICAgICogQHBhcmFtIHNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlIGZyb20gdGhlIGRhdGEgYXJyYXlzLgogICAgICAqLwogICAgIHB1YmxpYyBEYXRhQnVmZmVyQnl0ZShieXRlIGRhdGFBcnJheXNbXVtdLCBpbnQgc2l6ZSkgewogICAgICAgICBzdXBlcihUWVBFX0JZVEUsIHNpemUsIGRhdGFBcnJheXMubGVuZ3RoKTsKQEAgLTU2LDEyICs2NCwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkYXRhIGJ1ZmZlciBvZiB0eXBlIHVuc2lnbmVkIHNob3J0Ci0gICAgICogd2l0aCBhIHNpbmdsZSB1bmRlcmx5aW5nIGFycmF5IG9mIGRhdGEuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyIG9mIHR5cGUgdW5zaWduZWQgc2hvcnQgd2l0aCBhIHNpbmdsZQorICAgICAqIHVuZGVybHlpbmcgYXJyYXkgb2YgZGF0YS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YUFycmF5IHRoZSBkYXRhIGFycmF5IHRvIGNvcHkgdGhlIGRhdGEgZnJvbQotICAgICAqIEBwYXJhbSBzaXplIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlIAotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIHN0YXJ0aW5nIGluZGV4IHRvIHVzZSB3aGVuIHJlYWRpbmcgdGhlIGRhdGEKKyAgICAgKiBAcGFyYW0gZGF0YUFycmF5CisgICAgICogICAgICAgICAgICB0aGUgZGF0YSBhcnJheSB0byBjb3B5IHRoZSBkYXRhIGZyb20uCisgICAgICogQHBhcmFtIHNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlLgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBpbmRleCB0byB1c2Ugd2hlbiByZWFkaW5nIHRoZSBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyBEYXRhQnVmZmVyQnl0ZShieXRlIGRhdGFBcnJheVtdLCBpbnQgc2l6ZSwgaW50IG9mZnNldCkgewogICAgICAgICBzdXBlcihUWVBFX0JZVEUsIHNpemUsIDEsIG9mZnNldCk7CkBAIC03MCwxMiArODEsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZGF0YSBidWZmZXIgb2YgdHlwZSB1bnNpZ25lZCBzaG9ydAotICAgICAqIHdpdGggYSBzaW5nbGUgdW5kZXJseWluZyBhcnJheSBvZiBkYXRhIHN0YXJ0aW5nIGF0Ci0gICAgICogaW5kZXggMC4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZGF0YSBidWZmZXIgb2YgdHlwZSB1bnNpZ25lZCBzaG9ydCB3aXRoIGEgc2luZ2xlCisgICAgICogdW5kZXJseWluZyBhcnJheSBvZiBkYXRhIHN0YXJ0aW5nIGF0IGluZGV4IDAuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFBcnJheSB0aGUgZGF0YSBhcnJheSB0byBjb3B5IHRoZSBkYXRhIGZyb20KLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSAKKyAgICAgKiBAcGFyYW0gZGF0YUFycmF5CisgICAgICogICAgICAgICAgICB0aGUgZGF0YSBhcnJheSB0byBjb3B5IHRoZSBkYXRhIGZyb20uCisgICAgICogQHBhcmFtIHNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlLgogICAgICAqLwogICAgIHB1YmxpYyBEYXRhQnVmZmVyQnl0ZShieXRlIGRhdGFBcnJheVtdLCBpbnQgc2l6ZSkgewogICAgICAgICBzdXBlcihUWVBFX0JZVEUsIHNpemUpOwpAQCAtODQsMTIgKzk2LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGVtcHR5IGRhdGEgYnVmZmVyIG9mIHR5cGUgdW5zaWduZWQgc2hvcnQKLSAgICAgKiB3aXRoIG9mZnNldHMgZXF1YWwgdG8gemVyby4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZW1wdHkgZGF0YSBidWZmZXIgb2YgdHlwZSB1bnNpZ25lZCBzaG9ydCB3aXRoIG9mZnNldHMKKyAgICAgKiBlcXVhbCB0byB6ZXJvLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzaXplIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlIAotICAgICAqIGZyb20gdGhlIGRhdGEgYXJyYXlzCi0gICAgICogQHBhcmFtIG51bUJhbmtzIHRoZSBudW1iZXIgb2YgZGF0YSBhcnJheXMgdG8gY3JlYXRlCisgICAgICogQHBhcmFtIHNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlIGZyb20gdGhlIGRhdGEgYXJyYXlzLgorICAgICAqIEBwYXJhbSBudW1CYW5rcworICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBkYXRhIGFycmF5cyB0byBjcmVhdGUuCiAgICAgICovCiAgICAgcHVibGljIERhdGFCdWZmZXJCeXRlKGludCBzaXplLCBpbnQgbnVtQmFua3MpIHsKICAgICAgICAgc3VwZXIoVFlQRV9CWVRFLCBzaXplLCBudW1CYW5rcyk7CkBAIC0xMDEsMTEgKzExNCwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBlbXB0eSBkYXRhIGJ1ZmZlciBvZiB0eXBlIHVuc2lnbmVkIHNob3J0Ci0gICAgICogd2l0aCBhIHNpbmdsZSB1bmRlcmx5aW5nIGFycmF5IG9mIGRhdGEgc3RhcnRpbmcgYXQKLSAgICAgKiBpbmRleCAwLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBlbXB0eSBkYXRhIGJ1ZmZlciBvZiB0eXBlIHVuc2lnbmVkIHNob3J0IHdpdGggYSBzaW5nbGUKKyAgICAgKiB1bmRlcmx5aW5nIGFycmF5IG9mIGRhdGEgc3RhcnRpbmcgYXQgaW5kZXggMC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSAKKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UuCiAgICAgICovCiAgICAgcHVibGljIERhdGFCdWZmZXJCeXRlKGludCBzaXplKSB7CiAgICAgICAgIHN1cGVyKFRZUEVfQllURSwgc2l6ZSk7CkBAIC0xMTUsMTMgKzEyOCwxMyBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0RWxlbShpbnQgYmFuaywgaW50IGksIGludCB2YWwpIHsKLSAgICAgICAgZGF0YVtiYW5rXVtvZmZzZXRzW2JhbmtdICsgaV0gPSAoYnl0ZSkgdmFsOworICAgICAgICBkYXRhW2JhbmtdW29mZnNldHNbYmFua10gKyBpXSA9IChieXRlKXZhbDsKICAgICAgICAgbm90aWZ5Q2hhbmdlZCgpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldEVsZW0oaW50IGksIGludCB2YWwpIHsKLSAgICAgICAgZGF0YVswXVtvZmZzZXQgKyBpXSA9IChieXRlKSB2YWw7CisgICAgICAgIGRhdGFbMF1bb2Zmc2V0ICsgaV0gPSAoYnl0ZSl2YWw7CiAgICAgICAgIG5vdGlmeUNoYW5nZWQoKTsKICAgICB9CiAKQEAgLTEzMyw5ICsxNDYsOSBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGRhdGEgb2YgdGhlIHNwZWNpZmllZCBpbnRlcm5hbCBkYXRhIGFycmF5LgogICAgICAqIAotICAgICAqIEBwYXJhbSBiYW5rIHRoZSBpbmRleCBvZiB0aGUgZGVzaXJlZCBkYXRhIGFycmF5Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGF0YQorICAgICAqIEBwYXJhbSBiYW5rCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGRlc2lyZWQgZGF0YSBhcnJheS4KKyAgICAgKiBAcmV0dXJuIHRoZSBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyBieXRlW10gZ2V0RGF0YShpbnQgYmFuaykgewogICAgICAgICBub3RpZnlUYWtlbigpOwpAQCAtMTUwLDcgKzE2Myw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgYmFuayBkYXRhLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGJhbmsgZGF0YQorICAgICAqIEByZXR1cm4gdGhlIGJhbmsgZGF0YS4KICAgICAgKi8KICAgICBwdWJsaWMgYnl0ZVtdW10gZ2V0QmFua0RhdGEoKSB7CiAgICAgICAgIG5vdGlmeVRha2VuKCk7CkBAIC0xNjAsNyArMTczLDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBkYXRhIG9mIHRoZSBmaXJzdCBkYXRhIGFycmF5LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRhdGEKKyAgICAgKiBAcmV0dXJuIHRoZSBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyBieXRlW10gZ2V0RGF0YSgpIHsKICAgICAgICAgbm90aWZ5VGFrZW4oKTsKQEAgLTE2OCw0ICsxODEsMyBAQAogICAgIH0KIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvRGF0YUJ1ZmZlckRvdWJsZS5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL0RhdGFCdWZmZXJEb3VibGUuamF2YQppbmRleCBmYTNkMzI0Li41ZDBhNTE2IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvRGF0YUJ1ZmZlckRvdWJsZS5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9EYXRhQnVmZmVyRG91YmxlLmphdmEKQEAgLTE4LDI2ICsxOCwzMyBAQAogICogQGF1dGhvciBJZ29yIFYuIFN0b2x5YXJvdgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuaW1hZ2U7CiAKIC8qKgotICogVGhlIENsYXNzIERhdGFCdWZmZXJEb3VibGUgaXMgdGhlIHN1YmNsYXNzIG9mIERhdGFCdWZmZXIKLSAqIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgdW5kZXJseWluZyBkYXRhIGlzIG9mIHR5cGUgZG91YmxlLgorICogVGhlIENsYXNzIERhdGFCdWZmZXJEb3VibGUgaXMgdGhlIHN1YmNsYXNzIG9mIERhdGFCdWZmZXIgZm9yIHRoZSBjYXNlIHdoZXJlCisgKiB0aGUgdW5kZXJseWluZyBkYXRhIGlzIG9mIHR5cGUgZG91YmxlLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIERhdGFCdWZmZXJEb3VibGUgZXh0ZW5kcyBEYXRhQnVmZmVyIHsKIAotICAgIC8qKiBUaGUgZGF0YS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgZGF0YS4KKyAgICAgKi8KICAgICBkb3VibGUgZGF0YVtdW107CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZGF0YSBidWZmZXIgb2YgdHlwZSBkb3VibGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFBcnJheXMgdGhlIGRhdGEgYXJyYXlzIHRvIGNvcHkgdGhlIGRhdGEgZnJvbQotICAgICAqIEBwYXJhbSBzaXplIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlIAotICAgICAqIGZyb20gdGhlIGRhdGEgYXJyYXlzCi0gICAgICogQHBhcmFtIG9mZnNldHMgdGhlIHN0YXJ0aW5nIGluZGljZXMgZm9yIHJlYWRpbmcgdGhlIAotICAgICAqIGRhdGEgZnJvbSB0aGUgaW50ZXJuYWwgZGF0YSBhcnJheXMKLSAgICAqLworICAgICAqIEBwYXJhbSBkYXRhQXJyYXlzCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSBhcnJheXMgdG8gY29weSB0aGUgZGF0YSBmcm9tLgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSBmcm9tIHRoZSBkYXRhIGFycmF5cy4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0cworICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIGluZGljZXMgZm9yIHJlYWRpbmcgdGhlIGRhdGEgZnJvbSB0aGUgaW50ZXJuYWwKKyAgICAgKiAgICAgICAgICAgIGRhdGEgYXJyYXlzLgorICAgICAqLwogICAgIHB1YmxpYyBEYXRhQnVmZmVyRG91YmxlKGRvdWJsZSBkYXRhQXJyYXlzW11bXSwgaW50IHNpemUsIGludCBvZmZzZXRzW10pIHsKICAgICAgICAgc3VwZXIoVFlQRV9ET1VCTEUsIHNpemUsIGRhdGFBcnJheXMubGVuZ3RoLCBvZmZzZXRzKTsKICAgICAgICAgZGF0YSA9IGRhdGFBcnJheXMuY2xvbmUoKTsKQEAgLTQ2LDkgKzUzLDEwIEBACiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyIG9mIHR5cGUgZG91YmxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhQXJyYXlzIHRoZSBkYXRhIGFycmF5cyB0byBjb3B5IHRoZSBkYXRhIGZyb20KLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSAKLSAgICAgKiBmcm9tIHRoZSBkYXRhIGFycmF5cworICAgICAqIEBwYXJhbSBkYXRhQXJyYXlzCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSBhcnJheXMgdG8gY29weSB0aGUgZGF0YSBmcm9tLgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSBmcm9tIHRoZSBkYXRhIGFycmF5cy4KICAgICAgKi8KICAgICBwdWJsaWMgRGF0YUJ1ZmZlckRvdWJsZShkb3VibGUgZGF0YUFycmF5c1tdW10sIGludCBzaXplKSB7CiAgICAgICAgIHN1cGVyKFRZUEVfRE9VQkxFLCBzaXplLCBkYXRhQXJyYXlzLmxlbmd0aCk7CkBAIC01NiwxMiArNjQsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZGF0YSBidWZmZXIgb2YgdHlwZSBkb3VibGUKLSAgICAgKiB3aXRoIGEgc2luZ2xlIHVuZGVybHlpbmcgYXJyYXkgb2YgZGF0YS4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZGF0YSBidWZmZXIgb2YgdHlwZSBkb3VibGUgd2l0aCBhIHNpbmdsZSB1bmRlcmx5aW5nCisgICAgICogYXJyYXkgb2YgZGF0YS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YUFycmF5IHRoZSBkYXRhIGFycmF5IHRvIGNvcHkgdGhlIGRhdGEgZnJvbQotICAgICAqIEBwYXJhbSBzaXplIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlIAotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIHN0YXJ0aW5nIGluZGV4IHRvIHVzZSB3aGVuIHJlYWRpbmcgdGhlIGRhdGEKKyAgICAgKiBAcGFyYW0gZGF0YUFycmF5CisgICAgICogICAgICAgICAgICB0aGUgZGF0YSBhcnJheSB0byBjb3B5IHRoZSBkYXRhIGZyb20uCisgICAgICogQHBhcmFtIHNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlLgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBpbmRleCB0byB1c2Ugd2hlbiByZWFkaW5nIHRoZSBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyBEYXRhQnVmZmVyRG91YmxlKGRvdWJsZSBkYXRhQXJyYXlbXSwgaW50IHNpemUsIGludCBvZmZzZXQpIHsKICAgICAgICAgc3VwZXIoVFlQRV9ET1VCTEUsIHNpemUsIDEsIG9mZnNldCk7CkBAIC03MCwxMiArODEsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZGF0YSBidWZmZXIgb2YgdHlwZSBkb3VibGUKLSAgICAgKiB3aXRoIGEgc2luZ2xlIHVuZGVybHlpbmcgYXJyYXkgb2YgZGF0YSBzdGFydGluZyBhdAotICAgICAqIGluZGV4IDAuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyIG9mIHR5cGUgZG91YmxlIHdpdGggYSBzaW5nbGUgdW5kZXJseWluZworICAgICAqIGFycmF5IG9mIGRhdGEgc3RhcnRpbmcgYXQgaW5kZXggMC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YUFycmF5IHRoZSBkYXRhIGFycmF5IHRvIGNvcHkgdGhlIGRhdGEgZnJvbQotICAgICAqIEBwYXJhbSBzaXplIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlIAorICAgICAqIEBwYXJhbSBkYXRhQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIGFycmF5IHRvIGNvcHkgdGhlIGRhdGEgZnJvbS4KKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UuCiAgICAgICovCiAgICAgcHVibGljIERhdGFCdWZmZXJEb3VibGUoZG91YmxlIGRhdGFBcnJheVtdLCBpbnQgc2l6ZSkgewogICAgICAgICBzdXBlcihUWVBFX0RPVUJMRSwgc2l6ZSk7CkBAIC04NCwxMiArOTYsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZW1wdHkgZGF0YSBidWZmZXIgb2YgdHlwZSBkb3VibGUKLSAgICAgKiB3aXRoIG9mZnNldHMgZXF1YWwgdG8gemVyby4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZW1wdHkgZGF0YSBidWZmZXIgb2YgdHlwZSBkb3VibGUgd2l0aCBvZmZzZXRzIGVxdWFsIHRvCisgICAgICogemVyby4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSAKLSAgICAgKiBmcm9tIHRoZSBkYXRhIGFycmF5cwotICAgICAqIEBwYXJhbSBudW1CYW5rcyB0aGUgbnVtYmVyIG9mIGRhdGEgYXJyYXlzIHRvIGNyZWF0ZQorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSBmcm9tIHRoZSBkYXRhIGFycmF5cy4KKyAgICAgKiBAcGFyYW0gbnVtQmFua3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZGF0YSBhcnJheXMgdG8gY3JlYXRlLgogICAgICAqLwogICAgIHB1YmxpYyBEYXRhQnVmZmVyRG91YmxlKGludCBzaXplLCBpbnQgbnVtQmFua3MpIHsKICAgICAgICAgc3VwZXIoVFlQRV9ET1VCTEUsIHNpemUsIG51bUJhbmtzKTsKQEAgLTEwMSwxMSArMTE0LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGVtcHR5IGRhdGEgYnVmZmVyIG9mIHR5cGUgZG91YmxlCi0gICAgICogd2l0aCBhIHNpbmdsZSB1bmRlcmx5aW5nIGFycmF5IG9mIGRhdGEgc3RhcnRpbmcgYXQKLSAgICAgKiBpbmRleCAwLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBlbXB0eSBkYXRhIGJ1ZmZlciBvZiB0eXBlIGRvdWJsZSB3aXRoIGEgc2luZ2xlCisgICAgICogdW5kZXJseWluZyBhcnJheSBvZiBkYXRhIHN0YXJ0aW5nIGF0IGluZGV4IDAuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNpemUgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UgCisgICAgICogQHBhcmFtIHNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlLgogICAgICAqLwogICAgIHB1YmxpYyBEYXRhQnVmZmVyRG91YmxlKGludCBzaXplKSB7CiAgICAgICAgIHN1cGVyKFRZUEVfRE9VQkxFLCBzaXplKTsKQEAgLTEzOSwxMiArMTUyLDEyIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldEVsZW0oaW50IGJhbmssIGludCBpKSB7Ci0gICAgICAgIHJldHVybiAoaW50KSAoZGF0YVtiYW5rXVtvZmZzZXRzW2JhbmtdICsgaV0pOworICAgICAgICByZXR1cm4gKGludCkoZGF0YVtiYW5rXVtvZmZzZXRzW2JhbmtdICsgaV0pOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmbG9hdCBnZXRFbGVtRmxvYXQoaW50IGJhbmssIGludCBpKSB7Ci0gICAgICAgIHJldHVybiAoZmxvYXQpIChkYXRhW2JhbmtdW29mZnNldHNbYmFua10gKyBpXSk7CisgICAgICAgIHJldHVybiAoZmxvYXQpKGRhdGFbYmFua11bb2Zmc2V0c1tiYW5rXSArIGldKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTE2Nyw5ICsxODAsOSBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGRhdGEgb2YgdGhlIHNwZWNpZmllZCBpbnRlcm5hbCBkYXRhIGFycmF5LgogICAgICAqIAotICAgICAqIEBwYXJhbSBiYW5rIHRoZSBpbmRleCBvZiB0aGUgZGVzaXJlZCBkYXRhIGFycmF5Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGF0YQorICAgICAqIEBwYXJhbSBiYW5rCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGRlc2lyZWQgZGF0YSBhcnJheS4KKyAgICAgKiBAcmV0dXJuIHRoZSBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyBkb3VibGVbXSBnZXREYXRhKGludCBiYW5rKSB7CiAgICAgICAgIG5vdGlmeVRha2VuKCk7CkBAIC0xNzgsMTIgKzE5MSwxMiBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRFbGVtKGludCBpKSB7Ci0gICAgICAgIHJldHVybiAoaW50KSAoZGF0YVswXVtvZmZzZXQgKyBpXSk7CisgICAgICAgIHJldHVybiAoaW50KShkYXRhWzBdW29mZnNldCArIGldKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZmxvYXQgZ2V0RWxlbUZsb2F0KGludCBpKSB7Ci0gICAgICAgIHJldHVybiAoZmxvYXQpIChkYXRhWzBdW29mZnNldCArIGldKTsKKyAgICAgICAgcmV0dXJuIChmbG9hdCkoZGF0YVswXVtvZmZzZXQgKyBpXSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xOTQsNyArMjA3LDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBiYW5rIGRhdGEuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgYmFuayBkYXRhCisgICAgICogQHJldHVybiB0aGUgYmFuayBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyBkb3VibGVbXVtdIGdldEJhbmtEYXRhKCkgewogICAgICAgICBub3RpZnlUYWtlbigpOwpAQCAtMjA0LDExICsyMTcsMTAgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBkYXRhIG9mIHRoZSBmaXJzdCBkYXRhIGFycmF5LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRhdGEKKyAgICAgKiBAcmV0dXJuIHRoZSBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyBkb3VibGVbXSBnZXREYXRhKCkgewogICAgICAgICBub3RpZnlUYWtlbigpOwogICAgICAgICByZXR1cm4gZGF0YVswXTsKICAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9EYXRhQnVmZmVyRmxvYXQuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9EYXRhQnVmZmVyRmxvYXQuamF2YQppbmRleCBlMzQyNDVjLi45YTRhNmJmIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvRGF0YUJ1ZmZlckZsb2F0LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL0RhdGFCdWZmZXJGbG9hdC5qYXZhCkBAIC0xOCwyNSArMTgsMzIgQEAKICAqIEBhdXRob3IgSWdvciBWLiBTdG9seWFyb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmltYWdlOwogCiAvKioKLSAqIFRoZSBDbGFzcyBEYXRhQnVmZmVyRmxvYXQgaXMgdGhlIHN1YmNsYXNzIG9mIERhdGFCdWZmZXIKLSAqIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgdW5kZXJseWluZyBkYXRhIGlzIGZsb2F0LgorICogVGhlIENsYXNzIERhdGFCdWZmZXJGbG9hdCBpcyB0aGUgc3ViY2xhc3Mgb2YgRGF0YUJ1ZmZlciBmb3IgdGhlIGNhc2Ugd2hlcmUKKyAqIHRoZSB1bmRlcmx5aW5nIGRhdGEgaXMgZmxvYXQuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgRGF0YUJ1ZmZlckZsb2F0IGV4dGVuZHMgRGF0YUJ1ZmZlciB7CiAKLSAgICAvKiogVGhlIGRhdGEuICovCisgICAgLyoqCisgICAgICogVGhlIGRhdGEuCisgICAgICovCiAgICAgZmxvYXQgZGF0YVtdW107CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZGF0YSBidWZmZXIgb2YgdHlwZSBmbG9hdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YUFycmF5cyB0aGUgZGF0YSBhcnJheXMgdG8gY29weSB0aGUgZGF0YSBmcm9tCi0gICAgICogQHBhcmFtIHNpemUgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UgCi0gICAgICogZnJvbSB0aGUgZGF0YSBhcnJheXMKLSAgICAgKiBAcGFyYW0gb2Zmc2V0cyB0aGUgc3RhcnRpbmcgaW5kaWNlcyBmb3IgcmVhZGluZyB0aGUgCi0gICAgICogZGF0YSBmcm9tIHRoZSBpbnRlcm5hbCBkYXRhIGFycmF5cworICAgICAqIEBwYXJhbSBkYXRhQXJyYXlzCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSBhcnJheXMgdG8gY29weSB0aGUgZGF0YSBmcm9tLgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSBmcm9tIHRoZSBkYXRhIGFycmF5cy4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0cworICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIGluZGljZXMgZm9yIHJlYWRpbmcgdGhlIGRhdGEgZnJvbSB0aGUgaW50ZXJuYWwKKyAgICAgKiAgICAgICAgICAgIGRhdGEgYXJyYXlzLgogICAgICAqLwogICAgIHB1YmxpYyBEYXRhQnVmZmVyRmxvYXQoZmxvYXQgZGF0YUFycmF5c1tdW10sIGludCBzaXplLCBpbnQgb2Zmc2V0c1tdKSB7CiAgICAgICAgIHN1cGVyKFRZUEVfRkxPQVQsIHNpemUsIGRhdGFBcnJheXMubGVuZ3RoLCBvZmZzZXRzKTsKQEAgLTQ2LDkgKzUzLDEwIEBACiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyIG9mIHR5cGUgZmxvYXQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFBcnJheXMgdGhlIGRhdGEgYXJyYXlzIHRvIGNvcHkgdGhlIGRhdGEgZnJvbQotICAgICAqIEBwYXJhbSBzaXplIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlIAotICAgICAqIGZyb20gdGhlIGRhdGEgYXJyYXlzCisgICAgICogQHBhcmFtIGRhdGFBcnJheXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIGFycmF5cyB0byBjb3B5IHRoZSBkYXRhIGZyb20uCisgICAgICogQHBhcmFtIHNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlIGZyb20gdGhlIGRhdGEgYXJyYXlzLgogICAgICAqLwogICAgIHB1YmxpYyBEYXRhQnVmZmVyRmxvYXQoZmxvYXQgZGF0YUFycmF5c1tdW10sIGludCBzaXplKSB7CiAgICAgICAgIHN1cGVyKFRZUEVfRkxPQVQsIHNpemUsIGRhdGFBcnJheXMubGVuZ3RoKTsKQEAgLTU2LDEyICs2NCwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkYXRhIGJ1ZmZlciBvZiB0eXBlIGZsb2F0Ci0gICAgICogd2l0aCBhIHNpbmdsZSB1bmRlcmx5aW5nIGFycmF5IG9mIGRhdGEuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyIG9mIHR5cGUgZmxvYXQgd2l0aCBhIHNpbmdsZSB1bmRlcmx5aW5nCisgICAgICogYXJyYXkgb2YgZGF0YS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YUFycmF5IHRoZSBkYXRhIGFycmF5IHRvIGNvcHkgdGhlIGRhdGEgZnJvbQotICAgICAqIEBwYXJhbSBzaXplIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlIAotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIHN0YXJ0aW5nIGluZGV4IHRvIHVzZSB3aGVuIHJlYWRpbmcgdGhlIGRhdGEKKyAgICAgKiBAcGFyYW0gZGF0YUFycmF5CisgICAgICogICAgICAgICAgICB0aGUgZGF0YSBhcnJheSB0byBjb3B5IHRoZSBkYXRhIGZyb20uCisgICAgICogQHBhcmFtIHNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlLgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBpbmRleCB0byB1c2Ugd2hlbiByZWFkaW5nIHRoZSBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyBEYXRhQnVmZmVyRmxvYXQoZmxvYXQgZGF0YUFycmF5W10sIGludCBzaXplLCBpbnQgb2Zmc2V0KSB7CiAgICAgICAgIHN1cGVyKFRZUEVfRkxPQVQsIHNpemUsIDEsIG9mZnNldCk7CkBAIC03MCwxMiArODEsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZGF0YSBidWZmZXIgb2YgdHlwZSBmbG9hdAotICAgICAqIHdpdGggYSBzaW5nbGUgdW5kZXJseWluZyBhcnJheSBvZiBkYXRhIHN0YXJ0aW5nIGF0Ci0gICAgICogaW5kZXggMC4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZGF0YSBidWZmZXIgb2YgdHlwZSBmbG9hdCB3aXRoIGEgc2luZ2xlIHVuZGVybHlpbmcKKyAgICAgKiBhcnJheSBvZiBkYXRhIHN0YXJ0aW5nIGF0IGluZGV4IDAuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFBcnJheSB0aGUgZGF0YSBhcnJheSB0byBjb3B5IHRoZSBkYXRhIGZyb20KLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSAKKyAgICAgKiBAcGFyYW0gZGF0YUFycmF5CisgICAgICogICAgICAgICAgICB0aGUgZGF0YSBhcnJheSB0byBjb3B5IHRoZSBkYXRhIGZyb20uCisgICAgICogQHBhcmFtIHNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlLgogICAgICAqLwogICAgIHB1YmxpYyBEYXRhQnVmZmVyRmxvYXQoZmxvYXQgZGF0YUFycmF5W10sIGludCBzaXplKSB7CiAgICAgICAgIHN1cGVyKFRZUEVfRkxPQVQsIHNpemUpOwpAQCAtODQsMTIgKzk2LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGVtcHR5IGRhdGEgYnVmZmVyIG9mIHR5cGUgZmxvYXQKLSAgICAgKiB3aXRoIG9mZnNldHMgZXF1YWwgdG8gemVyby4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZW1wdHkgZGF0YSBidWZmZXIgb2YgdHlwZSBmbG9hdCB3aXRoIG9mZnNldHMgZXF1YWwgdG8KKyAgICAgKiB6ZXJvLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzaXplIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlIAotICAgICAqIGZyb20gdGhlIGRhdGEgYXJyYXlzCi0gICAgICogQHBhcmFtIG51bUJhbmtzIHRoZSBudW1iZXIgb2YgZGF0YSBhcnJheXMgdG8gY3JlYXRlCisgICAgICogQHBhcmFtIHNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlIGZyb20gdGhlIGRhdGEgYXJyYXlzLgorICAgICAqIEBwYXJhbSBudW1CYW5rcworICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBkYXRhIGFycmF5cyB0byBjcmVhdGUuCiAgICAgICovCiAgICAgcHVibGljIERhdGFCdWZmZXJGbG9hdChpbnQgc2l6ZSwgaW50IG51bUJhbmtzKSB7CiAgICAgICAgIHN1cGVyKFRZUEVfRkxPQVQsIHNpemUsIG51bUJhbmtzKTsKQEAgLTEwMSwxMSArMTE0LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGVtcHR5IGRhdGEgYnVmZmVyIG9mIHR5cGUgZmxvYXQKLSAgICAgKiB3aXRoIGEgc2luZ2xlIHVuZGVybHlpbmcgYXJyYXkgb2YgZGF0YSBzdGFydGluZyBhdAotICAgICAqIGluZGV4IDAuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGVtcHR5IGRhdGEgYnVmZmVyIG9mIHR5cGUgZmxvYXQgd2l0aCBhIHNpbmdsZQorICAgICAqIHVuZGVybHlpbmcgYXJyYXkgb2YgZGF0YSBzdGFydGluZyBhdCBpbmRleCAwLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzaXplIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlIAorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZS4KICAgICAgKi8KICAgICBwdWJsaWMgRGF0YUJ1ZmZlckZsb2F0KGludCBzaXplKSB7CiAgICAgICAgIHN1cGVyKFRZUEVfRkxPQVQsIHNpemUpOwpAQCAtMTI3LDcgKzE0MCw3IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRFbGVtRG91YmxlKGludCBiYW5rLCBpbnQgaSwgZG91YmxlIHZhbCkgewotICAgICAgICBkYXRhW2JhbmtdW29mZnNldHNbYmFua10gKyBpXSA9IChmbG9hdCkgdmFsOworICAgICAgICBkYXRhW2JhbmtdW29mZnNldHNbYmFua10gKyBpXSA9IChmbG9hdCl2YWw7CiAgICAgICAgIG5vdGlmeUNoYW5nZWQoKTsKICAgICB9CiAKQEAgLTEzOSw3ICsxNTIsNyBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRFbGVtKGludCBiYW5rLCBpbnQgaSkgewotICAgICAgICByZXR1cm4gKGludCkgKGRhdGFbYmFua11bb2Zmc2V0c1tiYW5rXSArIGldKTsKKyAgICAgICAgcmV0dXJuIChpbnQpKGRhdGFbYmFua11bb2Zmc2V0c1tiYW5rXSArIGldKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTE2MCwxNiArMTczLDE2IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRFbGVtRG91YmxlKGludCBpLCBkb3VibGUgdmFsKSB7Ci0gICAgICAgIGRhdGFbMF1bb2Zmc2V0ICsgaV0gPSAoZmxvYXQpIHZhbDsKKyAgICAgICAgZGF0YVswXVtvZmZzZXQgKyBpXSA9IChmbG9hdCl2YWw7CiAgICAgICAgIG5vdGlmeUNoYW5nZWQoKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBkYXRhIG9mIHRoZSBzcGVjaWZpZWQgaW50ZXJuYWwgZGF0YSBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYmFuayB0aGUgaW5kZXggb2YgdGhlIGRlc2lyZWQgYXJyYXkKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkYXRhCisgICAgICogQHBhcmFtIGJhbmsKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgZGVzaXJlZCBhcnJheS4KKyAgICAgKiBAcmV0dXJuIHRoZSBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdFtdIGdldERhdGEoaW50IGJhbmspIHsKICAgICAgICAgbm90aWZ5VGFrZW4oKTsKQEAgLTE3OCw3ICsxOTEsNyBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRFbGVtKGludCBpKSB7Ci0gICAgICAgIHJldHVybiAoaW50KSAoZGF0YVswXVtvZmZzZXQgKyBpXSk7CisgICAgICAgIHJldHVybiAoaW50KShkYXRhWzBdW29mZnNldCArIGldKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTE5NCw3ICsyMDcsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGJhbmsgZGF0YS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBiYW5rIGRhdGEKKyAgICAgKiBAcmV0dXJuIHRoZSBiYW5rIGRhdGEuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0W11bXSBnZXRCYW5rRGF0YSgpIHsKICAgICAgICAgbm90aWZ5VGFrZW4oKTsKQEAgLTIwNCwxMSArMjE3LDEwIEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgZGF0YSBvZiB0aGUgZmlyc3QgZGF0YSBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkYXRhCisgICAgICogQHJldHVybiB0aGUgZGF0YS4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXRbXSBnZXREYXRhKCkgewogICAgICAgICBub3RpZnlUYWtlbigpOwogICAgICAgICByZXR1cm4gZGF0YVswXTsKICAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9EYXRhQnVmZmVySW50LmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvRGF0YUJ1ZmZlckludC5qYXZhCmluZGV4IDQzZGMxODguLjM4MGExMjcgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbWFnZS9EYXRhQnVmZmVySW50LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL0RhdGFCdWZmZXJJbnQuamF2YQpAQCAtMTgsMjUgKzE4LDMyIEBACiAgKiBAYXV0aG9yIElnb3IgVi4gU3RvbHlhcm92CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5pbWFnZTsKIAogLyoqCi0gKiBUaGUgQ2xhc3MgRGF0YUJ1ZmZlckludCBpcyB0aGUgc3ViY2xhc3Mgb2YgRGF0YUJ1ZmZlcgotICogZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSB1bmRlcmx5aW5nIGRhdGEgaXMgb2YgdHlwZSBpbnQuCisgKiBUaGUgQ2xhc3MgRGF0YUJ1ZmZlckludCBpcyB0aGUgc3ViY2xhc3Mgb2YgRGF0YUJ1ZmZlciBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlCisgKiB1bmRlcmx5aW5nIGRhdGEgaXMgb2YgdHlwZSBpbnRlZ2VyLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIERhdGFCdWZmZXJJbnQgZXh0ZW5kcyBEYXRhQnVmZmVyIHsKIAotICAgIC8qKiBUaGUgZGF0YS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgZGF0YS4KKyAgICAgKi8KICAgICBpbnQgZGF0YVtdW107CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZGF0YSBidWZmZXIgb2YgdHlwZSBpbnQuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyIG9mIHR5cGUgaW50ZWdlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YUFycmF5cyB0aGUgZGF0YSBhcnJheXMgdG8gY29weSB0aGUgZGF0YSBmcm9tCi0gICAgICogQHBhcmFtIHNpemUgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UgCi0gICAgICogZnJvbSB0aGUgZGF0YSBhcnJheXMKLSAgICAgKiBAcGFyYW0gb2Zmc2V0cyB0aGUgc3RhcnRpbmcgaW5kaWNlcyBmb3IgcmVhZGluZyB0aGUgCi0gICAgICogZGF0YSBmcm9tIHRoZSBpbnRlcm5hbCBkYXRhIGFycmF5cworICAgICAqIEBwYXJhbSBkYXRhQXJyYXlzCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSBhcnJheXMgdG8gY29weSB0aGUgZGF0YSBmcm9tLgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSBmcm9tIHRoZSBkYXRhIGFycmF5cy4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0cworICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIGluZGljZXMgZm9yIHJlYWRpbmcgdGhlIGRhdGEgZnJvbSB0aGUgaW50ZXJuYWwKKyAgICAgKiAgICAgICAgICAgIGRhdGEgYXJyYXlzLgogICAgICAqLwogICAgIHB1YmxpYyBEYXRhQnVmZmVySW50KGludCBkYXRhQXJyYXlzW11bXSwgaW50IHNpemUsIGludCBvZmZzZXRzW10pIHsKICAgICAgICAgc3VwZXIoVFlQRV9JTlQsIHNpemUsIGRhdGFBcnJheXMubGVuZ3RoLCBvZmZzZXRzKTsKQEAgLTQ0LDExICs1MSwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkYXRhIGJ1ZmZlciBvZiB0eXBlIGludC4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZGF0YSBidWZmZXIgb2YgdHlwZSBpbnRlZ2VyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhQXJyYXlzIHRoZSBkYXRhIGFycmF5cyB0byBjb3B5IHRoZSBkYXRhIGZyb20KLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSAKLSAgICAgKiBmcm9tIHRoZSBkYXRhIGFycmF5cworICAgICAqIEBwYXJhbSBkYXRhQXJyYXlzCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSBhcnJheXMgdG8gY29weSB0aGUgZGF0YSBmcm9tLgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSBmcm9tIHRoZSBkYXRhIGFycmF5cy4KICAgICAgKi8KICAgICBwdWJsaWMgRGF0YUJ1ZmZlckludChpbnQgZGF0YUFycmF5c1tdW10sIGludCBzaXplKSB7CiAgICAgICAgIHN1cGVyKFRZUEVfSU5ULCBzaXplLCBkYXRhQXJyYXlzLmxlbmd0aCk7CkBAIC01NiwxMiArNjQsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZGF0YSBidWZmZXIgb2YgdHlwZSBpbnQKLSAgICAgKiB3aXRoIGEgc2luZ2xlIHVuZGVybHlpbmcgYXJyYXkgb2YgZGF0YS4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZGF0YSBidWZmZXIgb2YgdHlwZSBpbnRlZ2VyIHdpdGggYSBzaW5nbGUgdW5kZXJseWluZworICAgICAqIGFycmF5IG9mIGRhdGEuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFBcnJheSB0aGUgZGF0YSBhcnJheSB0byBjb3B5IHRoZSBkYXRhIGZyb20KLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSAKLSAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBzdGFydGluZyBpbmRleCB0byB1c2Ugd2hlbiByZWFkaW5nIHRoZSBkYXRhCisgICAgICogQHBhcmFtIGRhdGFBcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgYXJyYXkgdG8gY29weSB0aGUgZGF0YSBmcm9tLgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZS4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnRpbmcgaW5kZXggdG8gdXNlIHdoZW4gcmVhZGluZyB0aGUgZGF0YS4KICAgICAgKi8KICAgICBwdWJsaWMgRGF0YUJ1ZmZlckludChpbnQgZGF0YUFycmF5W10sIGludCBzaXplLCBpbnQgb2Zmc2V0KSB7CiAgICAgICAgIHN1cGVyKFRZUEVfSU5ULCBzaXplLCAxLCBvZmZzZXQpOwpAQCAtNzAsMTIgKzgxLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyIG9mIHR5cGUgaW50Ci0gICAgICogd2l0aCBhIHNpbmdsZSB1bmRlcmx5aW5nIGFycmF5IG9mIGRhdGEgc3RhcnRpbmcgYXQKLSAgICAgKiBpbmRleCAwLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkYXRhIGJ1ZmZlciBvZiB0eXBlIGludGVnZXIgd2l0aCBhIHNpbmdsZSB1bmRlcmx5aW5nCisgICAgICogYXJyYXkgb2YgZGF0YSBzdGFydGluZyBhdCBpbmRleCAwLgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhQXJyYXkgdGhlIGRhdGEgYXJyYXkgdG8gY29weSB0aGUgZGF0YSBmcm9tCi0gICAgICogQHBhcmFtIHNpemUgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UgCisgICAgICogQHBhcmFtIGRhdGFBcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgYXJyYXkgdG8gY29weSB0aGUgZGF0YSBmcm9tLgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZS4KICAgICAgKi8KICAgICBwdWJsaWMgRGF0YUJ1ZmZlckludChpbnQgZGF0YUFycmF5W10sIGludCBzaXplKSB7CiAgICAgICAgIHN1cGVyKFRZUEVfSU5ULCBzaXplKTsKQEAgLTg0LDEyICs5NiwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBlbXB0eSBkYXRhIGJ1ZmZlciBvZiB0eXBlIGludAotICAgICAqIHdpdGggb2Zmc2V0cyBlcXVhbCB0byB6ZXJvLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBlbXB0eSBkYXRhIGJ1ZmZlciBvZiB0eXBlIGludGVnZXIgd2l0aCBvZmZzZXRzIGVxdWFsCisgICAgICogdG8gemVyby4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSAKLSAgICAgKiBmcm9tIHRoZSBkYXRhIGFycmF5cwotICAgICAqIEBwYXJhbSBudW1CYW5rcyB0aGUgbnVtYmVyIG9mIGRhdGEgYXJyYXlzIHRvIGNyZWF0ZQorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSBmcm9tIHRoZSBkYXRhIGFycmF5cy4KKyAgICAgKiBAcGFyYW0gbnVtQmFua3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZGF0YSBhcnJheXMgdG8gY3JlYXRlLgogICAgICAqLwogICAgIHB1YmxpYyBEYXRhQnVmZmVySW50KGludCBzaXplLCBpbnQgbnVtQmFua3MpIHsKICAgICAgICAgc3VwZXIoVFlQRV9JTlQsIHNpemUsIG51bUJhbmtzKTsKQEAgLTEwMSwxMSArMTE0LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGVtcHR5IGRhdGEgYnVmZmVyIG9mIHR5cGUgaW50Ci0gICAgICogd2l0aCBhIHNpbmdsZSB1bmRlcmx5aW5nIGFycmF5IG9mIGRhdGEgc3RhcnRpbmcgYXQKLSAgICAgKiBpbmRleCAwLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBlbXB0eSBkYXRhIGJ1ZmZlciBvZiB0eXBlIGludGVnZXIgd2l0aCBhIHNpbmdsZQorICAgICAqIHVuZGVybHlpbmcgYXJyYXkgb2YgZGF0YSBzdGFydGluZyBhdCBpbmRleCAwLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzaXplIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlIAorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZS4KICAgICAgKi8KICAgICBwdWJsaWMgRGF0YUJ1ZmZlckludChpbnQgc2l6ZSkgewogICAgICAgICBzdXBlcihUWVBFX0lOVCwgc2l6ZSk7CkBAIC0xMzMsOSArMTQ2LDkgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBkYXRhIG9mIHRoZSBzcGVjaWZpZWQgaW50ZXJuYWwgZGF0YSBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYmFuayB0aGUgaW5kZXggb2YgdGhlIGRlc2lyZWQgZGF0YSBhcnJheQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRhdGEKKyAgICAgKiBAcGFyYW0gYmFuaworICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBkZXNpcmVkIGRhdGEgYXJyYXkuCisgICAgICogQHJldHVybiB0aGUgZGF0YS4KICAgICAgKi8KICAgICBwdWJsaWMgaW50W10gZ2V0RGF0YShpbnQgYmFuaykgewogICAgICAgICBub3RpZnlUYWtlbigpOwpAQCAtMTUwLDcgKzE2Myw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgYmFuayBkYXRhLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGJhbmsgZGF0YQorICAgICAqIEByZXR1cm4gdGhlIGJhbmsgZGF0YS4KICAgICAgKi8KICAgICBwdWJsaWMgaW50W11bXSBnZXRCYW5rRGF0YSgpIHsKICAgICAgICAgbm90aWZ5VGFrZW4oKTsKQEAgLTE2MCwxMSArMTczLDEwIEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgZGF0YSBvZiB0aGUgZmlyc3QgZGF0YSBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkYXRhCisgICAgICogQHJldHVybiB0aGUgZGF0YS4KICAgICAgKi8KICAgICBwdWJsaWMgaW50W10gZ2V0RGF0YSgpIHsKICAgICAgICAgbm90aWZ5VGFrZW4oKTsKICAgICAgICAgcmV0dXJuIGRhdGFbMF07CiAgICAgfQogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvRGF0YUJ1ZmZlclNob3J0LmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvRGF0YUJ1ZmZlclNob3J0LmphdmEKaW5kZXggODE5YmE0YS4uMWIxMWIyOSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL0RhdGFCdWZmZXJTaG9ydC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9EYXRhQnVmZmVyU2hvcnQuamF2YQpAQCAtMTgsMjUgKzE4LDMyIEBACiAgKiBAYXV0aG9yIElnb3IgVi4gU3RvbHlhcm92CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5pbWFnZTsKIAogLyoqCi0gKiBUaGUgQ2xhc3MgRGF0YUJ1ZmZlclNob3J0IGlzIHRoZSBzdWJjbGFzcyBvZiBEYXRhQnVmZmVyCi0gKiBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIHVuZGVybHlpbmcgZGF0YSBpcyBzaG9ydC4KKyAqIFRoZSBDbGFzcyBEYXRhQnVmZmVyU2hvcnQgaXMgdGhlIHN1YmNsYXNzIG9mIERhdGFCdWZmZXIgZm9yIHRoZSBjYXNlIHdoZXJlCisgKiB0aGUgdW5kZXJseWluZyBkYXRhIGlzIHNob3J0LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIERhdGFCdWZmZXJTaG9ydCBleHRlbmRzIERhdGFCdWZmZXIgewogCi0gICAgLyoqIFRoZSBkYXRhLiAqLworICAgIC8qKgorICAgICAqIFRoZSBkYXRhLgorICAgICAqLwogICAgIHNob3J0IGRhdGFbXVtdOwogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyIG9mIHR5cGUgc2hvcnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFBcnJheXMgdGhlIGRhdGEgYXJyYXlzIHRvIGNvcHkgdGhlIGRhdGEgZnJvbQotICAgICAqIEBwYXJhbSBzaXplIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlIAotICAgICAqIGZyb20gdGhlIGRhdGEgYXJyYXlzCi0gICAgICogQHBhcmFtIG9mZnNldHMgdGhlIHN0YXJ0aW5nIGluZGljZXMgZm9yIHJlYWRpbmcgdGhlIAotICAgICAqIGRhdGEgZnJvbSB0aGUgaW50ZXJuYWwgZGF0YSBhcnJheXMKKyAgICAgKiBAcGFyYW0gZGF0YUFycmF5cworICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgYXJyYXlzIHRvIGNvcHkgdGhlIGRhdGEgZnJvbS4KKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UgZnJvbSB0aGUgZGF0YSBhcnJheXMuCisgICAgICogQHBhcmFtIG9mZnNldHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBpbmRpY2VzIGZvciByZWFkaW5nIHRoZSBkYXRhIGZyb20gdGhlIGludGVybmFsCisgICAgICogICAgICAgICAgICBkYXRhIGFycmF5cy4KICAgICAgKi8KICAgICBwdWJsaWMgRGF0YUJ1ZmZlclNob3J0KHNob3J0IGRhdGFBcnJheXNbXVtdLCBpbnQgc2l6ZSwgaW50IG9mZnNldHNbXSkgewogICAgICAgICBzdXBlcihUWVBFX1NIT1JULCBzaXplLCBkYXRhQXJyYXlzLmxlbmd0aCwgb2Zmc2V0cyk7CkBAIC00Niw5ICs1MywxMCBAQAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkYXRhIGJ1ZmZlciBvZiB0eXBlIHNob3J0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhQXJyYXlzIHRoZSBkYXRhIGFycmF5cyB0byBjb3B5IHRoZSBkYXRhIGZyb20KLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSAKLSAgICAgKiBmcm9tIHRoZSBkYXRhIGFycmF5cworICAgICAqIEBwYXJhbSBkYXRhQXJyYXlzCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSBhcnJheXMgdG8gY29weSB0aGUgZGF0YSBmcm9tLgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSBmcm9tIHRoZSBkYXRhIGFycmF5cy4KICAgICAgKi8KICAgICBwdWJsaWMgRGF0YUJ1ZmZlclNob3J0KHNob3J0IGRhdGFBcnJheXNbXVtdLCBpbnQgc2l6ZSkgewogICAgICAgICBzdXBlcihUWVBFX1NIT1JULCBzaXplLCBkYXRhQXJyYXlzLmxlbmd0aCk7CkBAIC01NiwxMyArNjQsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZGF0YSBidWZmZXIgb2YgdHlwZSBzaG9ydAotICAgICAqIHdpdGggYSBzaW5nbGUgdW5kZXJseWluZyBhcnJheSBvZiBkYXRhLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkYXRhIGJ1ZmZlciBvZiB0eXBlIHNob3J0IHdpdGggYSBzaW5nbGUgdW5kZXJseWluZworICAgICAqIGFycmF5IG9mIGRhdGEuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFBcnJheSB0aGUgZGF0YSBhcnJheSB0byBjb3B5IHRoZSBkYXRhIGZyb20KLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSAKLSAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBzdGFydGluZyBpbmRleCB0byB1c2Ugd2hlbiByZWFkaW5nIHRoZSBkYXRhCi0KKyAgICAgKiBAcGFyYW0gZGF0YUFycmF5CisgICAgICogICAgICAgICAgICB0aGUgZGF0YSBhcnJheSB0byBjb3B5IHRoZSBkYXRhIGZyb20uCisgICAgICogQHBhcmFtIHNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlLgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBpbmRleCB0byB1c2Ugd2hlbiByZWFkaW5nIHRoZSBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyBEYXRhQnVmZmVyU2hvcnQoc2hvcnQgZGF0YUFycmF5W10sIGludCBzaXplLCBpbnQgb2Zmc2V0KSB7CiAgICAgICAgIHN1cGVyKFRZUEVfU0hPUlQsIHNpemUsIDEsIG9mZnNldCk7CkBAIC03MSwxMyArODEsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZGF0YSBidWZmZXIgb2YgdHlwZSBzaG9ydAotICAgICAqIHdpdGggYSBzaW5nbGUgdW5kZXJseWluZyBhcnJheSBvZiBkYXRhIHN0YXJ0aW5nIGF0Ci0gICAgICogaW5kZXggMC4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZGF0YSBidWZmZXIgb2YgdHlwZSBzaG9ydCB3aXRoIGEgc2luZ2xlIHVuZGVybHlpbmcKKyAgICAgKiBhcnJheSBvZiBkYXRhIHN0YXJ0aW5nIGF0IGluZGV4IDAuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFBcnJheSB0aGUgZGF0YSBhcnJheSB0byBjb3B5IHRoZSBkYXRhIGZyb20KLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSAKLQorICAgICAqIEBwYXJhbSBkYXRhQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIGFycmF5IHRvIGNvcHkgdGhlIGRhdGEgZnJvbS4KKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UuCiAgICAgICovCiAgICAgcHVibGljIERhdGFCdWZmZXJTaG9ydChzaG9ydCBkYXRhQXJyYXlbXSwgaW50IHNpemUpIHsKICAgICAgICAgc3VwZXIoVFlQRV9TSE9SVCwgc2l6ZSk7CkBAIC04NiwxMiArOTYsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZGF0YSBidWZmZXIgb2YgdHlwZSBzaG9ydAotICAgICAqIHdpdGggb2Zmc2V0cyBlcXVhbCB0byB6ZXJvLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkYXRhIGJ1ZmZlciBvZiB0eXBlIHNob3J0IHdpdGggb2Zmc2V0cyBlcXVhbCB0byB6ZXJvLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzaXplIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlIAotICAgICAqIGZyb20gdGhlIGRhdGEgYXJyYXlzCi0gICAgICogQHBhcmFtIG51bUJhbmtzIHRoZSBudW1iZXIgb2YgZGF0YSBhcnJheXMgdG8gY3JlYXRlCisgICAgICogQHBhcmFtIHNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlIGZyb20gdGhlIGRhdGEgYXJyYXlzLgorICAgICAqIEBwYXJhbSBudW1CYW5rcworICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBkYXRhIGFycmF5cyB0byBjcmVhdGUuCiAgICAgICovCiAgICAgcHVibGljIERhdGFCdWZmZXJTaG9ydChpbnQgc2l6ZSwgaW50IG51bUJhbmtzKSB7CiAgICAgICAgIHN1cGVyKFRZUEVfU0hPUlQsIHNpemUsIG51bUJhbmtzKTsKQEAgLTEwMywxMSArMTEzLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGVtcHR5IGRhdGEgYnVmZmVyIG9mIHR5cGUgc2hvcnQKLSAgICAgKiB3aXRoIGEgc2luZ2xlIHVuZGVybHlpbmcgYXJyYXkgb2YgZGF0YSBzdGFydGluZyBhdAotICAgICAqIGluZGV4IDAuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGVtcHR5IGRhdGEgYnVmZmVyIG9mIHR5cGUgc2hvcnQgd2l0aCBhIHNpbmdsZQorICAgICAqIHVuZGVybHlpbmcgYXJyYXkgb2YgZGF0YSBzdGFydGluZyBhdCBpbmRleCAwLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzaXplIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlIAorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZS4KICAgICAgKi8KICAgICBwdWJsaWMgRGF0YUJ1ZmZlclNob3J0KGludCBzaXplKSB7CiAgICAgICAgIHN1cGVyKFRZUEVfU0hPUlQsIHNpemUpOwpAQCAtMTE3LDEzICsxMjcsMTMgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldEVsZW0oaW50IGJhbmssIGludCBpLCBpbnQgdmFsKSB7Ci0gICAgICAgIGRhdGFbYmFua11bb2Zmc2V0c1tiYW5rXSArIGldID0gKHNob3J0KSB2YWw7CisgICAgICAgIGRhdGFbYmFua11bb2Zmc2V0c1tiYW5rXSArIGldID0gKHNob3J0KXZhbDsKICAgICAgICAgbm90aWZ5Q2hhbmdlZCgpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldEVsZW0oaW50IGksIGludCB2YWwpIHsKLSAgICAgICAgZGF0YVswXVtvZmZzZXQgKyBpXSA9IChzaG9ydCkgdmFsOworICAgICAgICBkYXRhWzBdW29mZnNldCArIGldID0gKHNob3J0KXZhbDsKICAgICAgICAgbm90aWZ5Q2hhbmdlZCgpOwogICAgIH0KIApAQCAtMTM1LDkgKzE0NSw5IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgZGF0YSBvZiB0aGUgc3BlY2lmaWVkIGludGVybmFsIGRhdGEgYXJyYXkuCiAgICAgICogCi0gICAgICogQHBhcmFtIGJhbmsgdGhlIGluZGV4IG9mIHRoZSBkZXNpcmVkIGRhdGEgYXJyYXkKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkYXRhCisgICAgICogQHBhcmFtIGJhbmsKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgZGVzaXJlZCBkYXRhIGFycmF5LgorICAgICAqIEByZXR1cm4gdGhlIGRhdGEuCiAgICAgICovCiAgICAgcHVibGljIHNob3J0W10gZ2V0RGF0YShpbnQgYmFuaykgewogICAgICAgICBub3RpZnlUYWtlbigpOwpAQCAtMTUyLDcgKzE2Miw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgYmFuayBkYXRhLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGJhbmsgZGF0YQorICAgICAqIEByZXR1cm4gdGhlIGJhbmsgZGF0YS4KICAgICAgKi8KICAgICBwdWJsaWMgc2hvcnRbXVtdIGdldEJhbmtEYXRhKCkgewogICAgICAgICBub3RpZnlUYWtlbigpOwpAQCAtMTYyLDExICsxNzIsMTAgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBkYXRhIG9mIHRoZSBmaXJzdCBkYXRhIGFycmF5LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRhdGEKKyAgICAgKiBAcmV0dXJuIHRoZSBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyBzaG9ydFtdIGdldERhdGEoKSB7CiAgICAgICAgIG5vdGlmeVRha2VuKCk7CiAgICAgICAgIHJldHVybiBkYXRhWzBdOwogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL0RhdGFCdWZmZXJVU2hvcnQuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9EYXRhQnVmZmVyVVNob3J0LmphdmEKaW5kZXggNzk4MjY3OC4uNThkOWQ4MyAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL0RhdGFCdWZmZXJVU2hvcnQuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvRGF0YUJ1ZmZlclVTaG9ydC5qYXZhCkBAIC0xOCwzNCArMTgsNDIgQEAKICAqIEBhdXRob3IgSWdvciBWLiBTdG9seWFyb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmltYWdlOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogVGhlIENsYXNzIERhdGFCdWZmZXJVU2hvcnQgaXMgdGhlIHN1YmNsYXNzIG9mIERhdGFCdWZmZXIKLSAqIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgdW5kZXJseWluZyBkYXRhIGlzIHVuc2lnbmVkIHNob3J0LgorICogVGhlIENsYXNzIERhdGFCdWZmZXJVU2hvcnQgaXMgdGhlIHN1YmNsYXNzIG9mIERhdGFCdWZmZXIgZm9yIHRoZSBjYXNlIHdoZXJlCisgKiB0aGUgdW5kZXJseWluZyBkYXRhIGlzIHVuc2lnbmVkIHNob3J0LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIERhdGFCdWZmZXJVU2hvcnQgZXh0ZW5kcyBEYXRhQnVmZmVyIHsKIAotICAgIC8qKiBUaGUgZGF0YS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgZGF0YS4KKyAgICAgKi8KICAgICBzaG9ydCBkYXRhW11bXTsKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkYXRhIGJ1ZmZlciBvZiB0eXBlIHVuc2lnbmVkIHNob3J0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhQXJyYXlzIHRoZSBkYXRhIGFycmF5cyB0byBjb3B5IHRoZSBkYXRhIGZyb20KLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSAKLSAgICAgKiBmcm9tIHRoZSBkYXRhIGFycmF5cwotICAgICAqIEBwYXJhbSBvZmZzZXRzIHRoZSBzdGFydGluZyBpbmRpY2VzIGZvciByZWFkaW5nIHRoZSAKLSAgICAgKiBkYXRhIGZyb20gdGhlIGludGVybmFsIGRhdGEgYXJyYXlzCisgICAgICogQHBhcmFtIGRhdGFBcnJheXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIGFycmF5cyB0byBjb3B5IHRoZSBkYXRhIGZyb20uCisgICAgICogQHBhcmFtIHNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlIGZyb20gdGhlIGRhdGEgYXJyYXlzLgorICAgICAqIEBwYXJhbSBvZmZzZXRzCisgICAgICogICAgICAgICAgICB0aGUgc3RhcnRpbmcgaW5kaWNlcyBmb3IgcmVhZGluZyB0aGUgZGF0YSBmcm9tIHRoZSBpbnRlcm5hbAorICAgICAqICAgICAgICAgICAgZGF0YSBhcnJheXMuCiAgICAgICovCiAgICAgcHVibGljIERhdGFCdWZmZXJVU2hvcnQoc2hvcnQgZGF0YUFycmF5c1tdW10sIGludCBzaXplLCBpbnQgb2Zmc2V0c1tdKSB7CiAgICAgICAgIHN1cGVyKFRZUEVfVVNIT1JULCBzaXplLCBkYXRhQXJyYXlzLmxlbmd0aCwgb2Zmc2V0cyk7Ci0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBkYXRhQXJyYXlzLmxlbmd0aDsgaSsrKXsKLSAgICAgICAgICAgIGlmKGRhdGFBcnJheXNbaV0ubGVuZ3RoIDwgb2Zmc2V0c1tpXSArIHNpemUpewotICAgICAgICAgICAgICAgIC8vIGF3dC4yOGQ9TGVuZ3RoIG9mIGRhdGFBcnJheVt7MH1dIGlzIGxlc3MgdGhhbiBzaXplICsgb2Zmc2V0W3sxfV0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI4RCIsIGksIGkpKTsgIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhQXJyYXlzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZGF0YUFycmF5c1tpXS5sZW5ndGggPCBvZmZzZXRzW2ldICsgc2l6ZSkgeworICAgICAgICAgICAgICAgIC8vIGF3dC4yOGQ9TGVuZ3RoIG9mIGRhdGFBcnJheVt7MH1dIGlzIGxlc3MgdGhhbiBzaXplICsKKyAgICAgICAgICAgICAgICAvLyBvZmZzZXRbezF9XQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjhEIiwgaSwgaSkpOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZGF0YSA9IGRhdGFBcnJheXMuY2xvbmUoKTsKQEAgLTU0LDkgKzYyLDEwIEBACiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyIG9mIHR5cGUgdW5zaWduZWQgc2hvcnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFBcnJheXMgdGhlIGRhdGEgYXJyYXlzIHRvIGNvcHkgdGhlIGRhdGEgZnJvbQotICAgICAqIEBwYXJhbSBzaXplIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlIAotICAgICAqIGZyb20gdGhlIGRhdGEgYXJyYXlzCisgICAgICogQHBhcmFtIGRhdGFBcnJheXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIGFycmF5cyB0byBjb3B5IHRoZSBkYXRhIGZyb20uCisgICAgICogQHBhcmFtIHNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlIGZyb20gdGhlIGRhdGEgYXJyYXlzLgogICAgICAqLwogICAgIHB1YmxpYyBEYXRhQnVmZmVyVVNob3J0KHNob3J0IGRhdGFBcnJheXNbXVtdLCBpbnQgc2l6ZSkgewogICAgICAgICBzdXBlcihUWVBFX1VTSE9SVCwgc2l6ZSwgZGF0YUFycmF5cy5sZW5ndGgpOwpAQCAtNjQsMTYgKzczLDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRhdGEgYnVmZmVyIG9mIHR5cGUgdW5zaWduZWQgc2hvcnQKLSAgICAgKiB3aXRoIGEgc2luZ2xlIHVuZGVybHlpbmcgYXJyYXkgb2YgZGF0YS4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZGF0YSBidWZmZXIgb2YgdHlwZSB1bnNpZ25lZCBzaG9ydCB3aXRoIGEgc2luZ2xlCisgICAgICogdW5kZXJseWluZyBhcnJheSBvZiBkYXRhLgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhQXJyYXkgdGhlIGRhdGEgYXJyYXkgdG8gY29weSB0aGUgZGF0YSBmcm9tCi0gICAgICogQHBhcmFtIHNpemUgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UgCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgc3RhcnRpbmcgaW5kZXggdG8gdXNlIHdoZW4gcmVhZGluZyB0aGUgZGF0YQorICAgICAqIEBwYXJhbSBkYXRhQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIGFycmF5IHRvIGNvcHkgdGhlIGRhdGEgZnJvbS4KKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIGluZGV4IHRvIHVzZSB3aGVuIHJlYWRpbmcgdGhlIGRhdGEuCiAgICAgICovCiAgICAgcHVibGljIERhdGFCdWZmZXJVU2hvcnQoc2hvcnQgZGF0YUFycmF5W10sIGludCBzaXplLCBpbnQgb2Zmc2V0KSB7CiAgICAgICAgIHN1cGVyKFRZUEVfVVNIT1JULCBzaXplLCAxLCBvZmZzZXQpOwotICAgICAgICBpZihkYXRhQXJyYXkubGVuZ3RoIDwgc2l6ZSArIG9mZnNldCl7CisgICAgICAgIGlmIChkYXRhQXJyYXkubGVuZ3RoIDwgc2l6ZSArIG9mZnNldCkgewogICAgICAgICAgICAgLy8gYXd0LjI4RT1MZW5ndGggb2YgZGF0YUFycmF5IGlzIGxlc3MgdGhhbiBzaXplICsgb2Zmc2V0CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI4RSIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CkBAIC04MiwxMiArOTQsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZGF0YSBidWZmZXIgb2YgdHlwZSB1bnNpZ25lZCBzaG9ydAotICAgICAqIHdpdGggYSBzaW5nbGUgdW5kZXJseWluZyBhcnJheSBvZiBkYXRhIHN0YXJ0aW5nIGF0Ci0gICAgICogaW5kZXggMC4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZGF0YSBidWZmZXIgb2YgdHlwZSB1bnNpZ25lZCBzaG9ydCB3aXRoIGEgc2luZ2xlCisgICAgICogdW5kZXJseWluZyBhcnJheSBvZiBkYXRhIHN0YXJ0aW5nIGF0IGluZGV4IDAuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFBcnJheSB0aGUgZGF0YSBhcnJheSB0byBjb3B5IHRoZSBkYXRhIGZyb20KLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSAKKyAgICAgKiBAcGFyYW0gZGF0YUFycmF5CisgICAgICogICAgICAgICAgICB0aGUgZGF0YSBhcnJheSB0byBjb3B5IHRoZSBkYXRhIGZyb20uCisgICAgICogQHBhcmFtIHNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlLgogICAgICAqLwogICAgIHB1YmxpYyBEYXRhQnVmZmVyVVNob3J0KHNob3J0IGRhdGFBcnJheVtdLCBpbnQgc2l6ZSkgewogICAgICAgICBzdXBlcihUWVBFX1VTSE9SVCwgc2l6ZSk7CkBAIC05NiwyOCArMTA5LDI5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGVtcHR5IGRhdGEgYnVmZmVyIG9mIHR5cGUgdW5zaWduZWQgc2hvcnQKLSAgICAgKiB3aXRoIG9mZnNldHMgZXF1YWwgdG8gemVyby4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZW1wdHkgZGF0YSBidWZmZXIgb2YgdHlwZSB1bnNpZ25lZCBzaG9ydCB3aXRoIG9mZnNldHMKKyAgICAgKiBlcXVhbCB0byB6ZXJvLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzaXplIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlIAotICAgICAqIGZyb20gdGhlIGRhdGEgYXJyYXlzCi0gICAgICogQHBhcmFtIG51bUJhbmtzIHRoZSBudW1iZXIgb2YgZGF0YSBhcnJheXMgdG8gY3JlYXRlCisgICAgICogQHBhcmFtIHNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgdG8gdXNlIGZyb20gdGhlIGRhdGEgYXJyYXlzLgorICAgICAqIEBwYXJhbSBudW1CYW5rcworICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBkYXRhIGFycmF5cyB0byBjcmVhdGUuCiAgICAgICovCiAgICAgcHVibGljIERhdGFCdWZmZXJVU2hvcnQoaW50IHNpemUsIGludCBudW1CYW5rcykgewogICAgICAgICBzdXBlcihUWVBFX1VTSE9SVCwgc2l6ZSwgbnVtQmFua3MpOwogICAgICAgICBkYXRhID0gbmV3IHNob3J0W251bUJhbmtzXVtdOwotICAgICAgICBpbnQgaT0gMDsKLSAgICAgICAgd2hpbGUoIGkgPCBudW1CYW5rcykgeworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIHdoaWxlIChpIDwgbnVtQmFua3MpIHsKICAgICAgICAgICAgIGRhdGFbaSsrXSA9IG5ldyBzaG9ydFtzaXplXTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBlbXB0eSBkYXRhIGJ1ZmZlciBvZiB0eXBlIHVuc2lnbmVkIHNob3J0Ci0gICAgICogd2l0aCBhIHNpbmdsZSB1bmRlcmx5aW5nIGFycmF5IG9mIGRhdGEgc3RhcnRpbmcgYXQKLSAgICAgKiBpbmRleCAwLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBlbXB0eSBkYXRhIGJ1ZmZlciBvZiB0eXBlIHVuc2lnbmVkIHNob3J0IHdpdGggYSBzaW5nbGUKKyAgICAgKiB1bmRlcmx5aW5nIGFycmF5IG9mIGRhdGEgc3RhcnRpbmcgYXQgaW5kZXggMC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgbGVuZ3RoIChudW1iZXIgb2YgZWxlbWVudHMpIHRvIHVzZSAKKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCAobnVtYmVyIG9mIGVsZW1lbnRzKSB0byB1c2UuCiAgICAgICovCiAgICAgcHVibGljIERhdGFCdWZmZXJVU2hvcnQoaW50IHNpemUpIHsKICAgICAgICAgc3VwZXIoVFlQRV9VU0hPUlQsIHNpemUpOwpAQCAtMTQ1LDkgKzE1OSw5IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgZGF0YSBvZiB0aGUgc3BlY2lmaWVkIGludGVybmFsIGRhdGEgYXJyYXkuCiAgICAgICogCi0gICAgICogQHBhcmFtIGJhbmsgdGhlIGluZGV4IG9mIHRoZSBkZXNpcmVkIGRhdGEgYXJyYXkKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkYXRhCisgICAgICogQHBhcmFtIGJhbmsKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgZGVzaXJlZCBkYXRhIGFycmF5LgorICAgICAqIEByZXR1cm4gdGhlIGRhdGEuCiAgICAgICovCiAgICAgcHVibGljIHNob3J0W10gZ2V0RGF0YShpbnQgYmFuaykgewogICAgICAgICBub3RpZnlUYWtlbigpOwpAQCAtMTYyLDcgKzE3Niw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgYmFuayBkYXRhLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGJhbmsgZGF0YQorICAgICAqIEByZXR1cm4gdGhlIGJhbmsgZGF0YS4KICAgICAgKi8KICAgICBwdWJsaWMgc2hvcnRbXVtdIGdldEJhbmtEYXRhKCkgewogICAgICAgICBub3RpZnlUYWtlbigpOwpAQCAtMTcyLDExICsxODYsMTAgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBkYXRhIG9mIHRoZSBmaXJzdCBkYXRhIGFycmF5LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRhdGEKKyAgICAgKiBAcmV0dXJuIHRoZSBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyBzaG9ydFtdIGdldERhdGEoKSB7CiAgICAgICAgIG5vdGlmeVRha2VuKCk7CiAgICAgICAgIHJldHVybiBkYXRhWzBdOwogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL0RpcmVjdENvbG9yTW9kZWwuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9EaXJlY3RDb2xvck1vZGVsLmphdmEKaW5kZXggN2EyODdjMC4uNzAwZWI3YSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL0RpcmVjdENvbG9yTW9kZWwuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvRGlyZWN0Q29sb3JNb2RlbC5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIElnb3IgVi4gU3RvbHlhcm92CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5pbWFnZTsKIAogaW1wb3J0IGphdmEuYXd0LmNvbG9yLkNvbG9yU3BhY2U7CkBAIC0yOCwxMDQgKzI5LDE0MSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFRoZSBDbGFzcyBEaXJlY3RDb2xvck1vZGVsIHJlcHJlc2VudHMgYSBzdGFuZGFyZCAocGFja2VkKSBSR0IKLSAqIGNvbG9yIG1vZGVsIHdpdGggYWRkaXRpb25hbCBzdXBwb3J0IGZvciBjb252ZXJ0aW5nIGJldHdlZW4gc1JHQgotICogY29sb3Igc3BhY2UgYW5kIDggb3IgMTYgYml0IGxpbmVhciBSR0IgY29sb3Igc3BhY2UgdXNpbmcgbG9va3VwIHRhYmxlcy4KKyAqIFRoZSBDbGFzcyBEaXJlY3RDb2xvck1vZGVsIHJlcHJlc2VudHMgYSBzdGFuZGFyZCAocGFja2VkKSBSR0IgY29sb3IgbW9kZWwKKyAqIHdpdGggYWRkaXRpb25hbCBzdXBwb3J0IGZvciBjb252ZXJ0aW5nIGJldHdlZW4gc1JHQiBjb2xvciBzcGFjZSBhbmQgOCBvciAxNgorICogYml0IGxpbmVhciBSR0IgY29sb3Igc3BhY2UgdXNpbmcgbG9va3VwIHRhYmxlcy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBEaXJlY3RDb2xvck1vZGVsIGV4dGVuZHMgUGFja2VkQ29sb3JNb2RlbCB7CiAKLSAgICAvKiogVGhlIGZyb21fIGxpbmVhIHJfIHJnIGJfIGx1dC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgZnJvbV8gbGluZWEgcl8gcmcgYl8gbHV0LgorICAgICAqLwogICAgIHByaXZhdGUgYnl0ZSBmcm9tX0xJTkVBUl9SR0JfTFVUW107IC8vIExvb2t1cCB0YWJsZSBmb3IgY29udmVyc2lvbiBmcm9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGluZWFyIFJHQiBDb2xvciBTcGFjZSBpbnRvIHNSR0IKIAotICAgIC8qKiBUaGUgdG9fIGxpbmVhIHJfOCByZyBiXyBsdXQuICovCi0gICAgcHJpdmF0ZSBieXRlIHRvX0xJTkVBUl84UkdCX0xVVFtdOyAgLy8gTG9va3VwIHRhYmxlIGZvciBjb252ZXJzaW9uIGZyb20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzUkdCIENvbG9yIFNwYWNlIGludG8gTGluZWFyIFJHQiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA4IGJpdAorICAgIC8vIExpbmVhciBSR0IgQ29sb3IgU3BhY2UgaW50byBzUkdCCiAKLSAgICAvKiogVGhlIHRvXyBsaW5lYSByXzE2IHJnIGJfIGx1dC4gKi8KLSAgICBwcml2YXRlIHNob3J0IHRvX0xJTkVBUl8xNlJHQl9MVVRbXTsgIC8vIExvb2t1cCB0YWJsZSBmb3IgY29udmVyc2lvbiBmcm9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzUkdCIENvbG9yIFNwYWNlIGludG8gTGluZWFyIFJHQiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDE2IGJpdCAKKyAgICAvKioKKyAgICAgKiBUaGUgdG9fIGxpbmVhIHJfOCByZyBiXyBsdXQuCisgICAgICovCisgICAgcHJpdmF0ZSBieXRlIHRvX0xJTkVBUl84UkdCX0xVVFtdOyAvLyBMb29rdXAgdGFibGUgZm9yIGNvbnZlcnNpb24gZnJvbQogCi0gICAgLyoqIFRoZSBhbHBoYSBsdXQuICovCi0gICAgcHJpdmF0ZSBieXRlIGFscGhhTFVUW107ICAgICAgICAgICAgLy8gTG9va3VwIHRhYmxlIGZvciBzY2FsZSBhbHBoYSB2YWx1ZSAgCisgICAgLy8gc1JHQiBDb2xvciBTcGFjZSBpbnRvIExpbmVhciBSR0IKKyAgICAvLyA4IGJpdAogCi0gICAgLyoqIFRoZSBjb2xvciBsdSB0cy4gKi8KLSAgICBwcml2YXRlIGJ5dGUgY29sb3JMVVRzW11bXTsgICAgICAgICAvLyBMb29rdXAgdGFibGVzIGZvciBzY2FsZSBjb2xvciB2YWx1ZXMgCisgICAgLyoqCisgICAgICogVGhlIHRvXyBsaW5lYSByXzE2IHJnIGJfIGx1dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHNob3J0IHRvX0xJTkVBUl8xNlJHQl9MVVRbXTsgLy8gTG9va3VwIHRhYmxlIGZvciBjb252ZXJzaW9uIGZyb20KIAotICAgIC8qKiBUaGUgaXNfcyByZ2IuICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzX3NSR0I7ICAgICAgICAgICAgLy8gQ29sb3JNb2RlbCBoYXMgc1JHQiBDb2xvclNwYWNlCisgICAgLy8gc1JHQiBDb2xvciBTcGFjZSBpbnRvIExpbmVhciBSR0IKKyAgICAvLyAxNiBiaXQKIAotICAgIC8qKiBUaGUgaXNfIGxpbmVhIHJfIHJnYi4gKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNfTElORUFSX1JHQjsgICAgICAvLyBDb2xvciBNb2RlbCBoYXMgTGluZWFyIFJHQiBDb2xvciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTcGFjZQorICAgIC8qKgorICAgICAqIFRoZSBhbHBoYSBsdXQuCisgICAgICovCisgICAgcHJpdmF0ZSBieXRlIGFscGhhTFVUW107IC8vIExvb2t1cCB0YWJsZSBmb3Igc2NhbGUgYWxwaGEgdmFsdWUKIAotICAgIC8qKiBUaGUgTElORUEgcl8gcmcgYl8gbGVuZ3RoLiAqLwotICAgIHByaXZhdGUgaW50IExJTkVBUl9SR0JfTGVuZ3RoOyAgICAgIC8vIExpbmVhciBSR0IgYml0IGxlbmd0aAorICAgIC8qKgorICAgICAqIFRoZSBjb2xvciBsdSB0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJ5dGUgY29sb3JMVVRzW11bXTsgLy8gTG9va3VwIHRhYmxlcyBmb3Igc2NhbGUgY29sb3IgdmFsdWVzCiAKLSAgICAvKiogVGhlIGZhY3Rvci4gKi8KLSAgICBwcml2YXRlIGZsb2F0IGZGYWN0b3I7ICAgICAgICAgICAgICAvLyBTY2FsZSBmYWN0b3IKKyAgICAvKioKKyAgICAgKiBUaGUgaXNfcyByZ2IuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzX3NSR0I7IC8vIENvbG9yTW9kZWwgaGFzIHNSR0IgQ29sb3JTcGFjZQorCisgICAgLyoqCisgICAgICogVGhlIGlzXyBsaW5lYSByXyByZ2IuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzX0xJTkVBUl9SR0I7IC8vIENvbG9yIE1vZGVsIGhhcyBMaW5lYXIgUkdCIENvbG9yCisKKyAgICAvLyBTcGFjZQorCisgICAgLyoqCisgICAgICogVGhlIExJTkVBIHJfIHJnIGJfIGxlbmd0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBMSU5FQVJfUkdCX0xlbmd0aDsgLy8gTGluZWFyIFJHQiBiaXQgbGVuZ3RoCisKKyAgICAvKioKKyAgICAgKiBUaGUgZmFjdG9yLgorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgZkZhY3RvcjsgLy8gU2NhbGUgZmFjdG9yCiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZGlyZWN0IGNvbG9yIG1vZGVsLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzcGFjZSB0aGUgY29sb3Igc3BhY2UKLSAgICAgKiBAcGFyYW0gYml0cyB0aGUgYXJyYXkgb2YgY29tcG9uZW50IG1hc2tzCi0gICAgICogQHBhcmFtIHJtYXNrIHRoZSBiaXRtYXNrIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlZCBiYW5kCi0gICAgICogQHBhcmFtIGdtYXNrIHRoZSBiaXRtYXNrIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdyZWVuIGJhbmQKLSAgICAgKiBAcGFyYW0gYm1hc2sgdGhlIGJpdG1hc2sgY29ycmVzcG9uZGluZyB0byB0aGUgYmx1ZSBiYW5kCi0gICAgICogQHBhcmFtIGFtYXNrIHRoZSBiaXRtYXNrIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFscGhhIGJhbmQKLSAgICAgKiBAcGFyYW0gaXNBbHBoYVByZW11bHRpcGxpZWQgd2hldGhlciB0aGUgYWxwaGEgaXMgcHJlbXVsdGlwbGllZCBpbiB0aGlzIGNvbG9yIG1vZGVsCi0gICAgICogQHBhcmFtIHRyYW5zZmVyVHlwZSB0aGUgdHJhbnNmZXIgdHlwZSAocHJpbWl0aXZlIGphdmEgdHlwZSAKLSAgICAgKiB0byB1c2UgZm9yIHRoZSBjb21wb25lbnRzKQotICAgICAqIAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgY29tYmluZWQgCi0gICAgICogYml0bWFza3MgZm9yIHRoZSBjb2xvciBiYW5kcyBpcyBsZXNzIHRoYW4gb25lIG9yIGdyZWF0ZXIgdGhhbiAzMgorICAgICAqIEBwYXJhbSBzcGFjZQorICAgICAqICAgICAgICAgICAgdGhlIGNvbG9yIHNwYWNlLgorICAgICAqIEBwYXJhbSBiaXRzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgY29tcG9uZW50IG1hc2tzLgorICAgICAqIEBwYXJhbSBybWFzaworICAgICAqICAgICAgICAgICAgdGhlIGJpdG1hc2sgY29ycmVzcG9uZGluZyB0byB0aGUgcmVkIGJhbmQuCisgICAgICogQHBhcmFtIGdtYXNrCisgICAgICogICAgICAgICAgICB0aGUgYml0bWFzayBjb3JyZXNwb25kaW5nIHRvIHRoZSBncmVlbiBiYW5kLgorICAgICAqIEBwYXJhbSBibWFzaworICAgICAqICAgICAgICAgICAgdGhlIGJpdG1hc2sgY29ycmVzcG9uZGluZyB0byB0aGUgYmx1ZSBiYW5kLgorICAgICAqIEBwYXJhbSBhbWFzaworICAgICAqICAgICAgICAgICAgdGhlIGJpdG1hc2sgY29ycmVzcG9uZGluZyB0byB0aGUgYWxwaGEgYmFuZC4KKyAgICAgKiBAcGFyYW0gaXNBbHBoYVByZW11bHRpcGxpZWQKKyAgICAgKiAgICAgICAgICAgIHdoZXRoZXIgdGhlIGFscGhhIGlzIHByZS1tdWx0aXBsaWVkIGluIHRoaXMgY29sb3IgbW9kZWwuCisgICAgICogQHBhcmFtIHRyYW5zZmVyVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIHRyYW5zZmVyIHR5cGUgKHByaW1pdGl2ZSBqYXZhIHR5cGUgdG8gdXNlIGZvciB0aGUKKyAgICAgKiAgICAgICAgICAgIGNvbXBvbmVudHMpLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBjb21iaW5lZCBiaXRtYXNrcyBmb3IgdGhlIGNvbG9yCisgICAgICogICAgICAgICAgICAgYmFuZHMgaXMgbGVzcyB0aGFuIG9uZSBvciBncmVhdGVyIHRoYW4gMzIuCiAgICAgICovCi0gICAgcHVibGljIERpcmVjdENvbG9yTW9kZWwoQ29sb3JTcGFjZSBzcGFjZSwgaW50IGJpdHMsIGludCBybWFzaywgaW50IGdtYXNrLAotICAgICAgICAgICAgaW50IGJtYXNrLCBpbnQgYW1hc2ssIGJvb2xlYW4gaXNBbHBoYVByZW11bHRpcGxpZWQsCi0gICAgICAgICAgICBpbnQgdHJhbnNmZXJUeXBlKSB7CisgICAgcHVibGljIERpcmVjdENvbG9yTW9kZWwoQ29sb3JTcGFjZSBzcGFjZSwgaW50IGJpdHMsIGludCBybWFzaywgaW50IGdtYXNrLCBpbnQgYm1hc2ssIGludCBhbWFzaywKKyAgICAgICAgICAgIGJvb2xlYW4gaXNBbHBoYVByZW11bHRpcGxpZWQsIGludCB0cmFuc2ZlclR5cGUpIHsKIAogICAgICAgICBzdXBlcihzcGFjZSwgYml0cywgcm1hc2ssIGdtYXNrLCBibWFzaywgYW1hc2ssIGlzQWxwaGFQcmVtdWx0aXBsaWVkLAotICAgICAgICAgICAgICAgIChhbWFzayA9PSAwID8gVHJhbnNwYXJlbmN5Lk9QQVFVRSA6IFRyYW5zcGFyZW5jeS5UUkFOU0xVQ0VOVCksCi0gICAgICAgICAgICAgICAgdHJhbnNmZXJUeXBlKTsKKyAgICAgICAgICAgICAgICAoYW1hc2sgPT0gMCA/IFRyYW5zcGFyZW5jeS5PUEFRVUUgOiBUcmFuc3BhcmVuY3kuVFJBTlNMVUNFTlQpLCB0cmFuc2ZlclR5cGUpOwogCiAgICAgICAgIGluaXRMVVRzKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRpcmVjdCBjb2xvciBtb2RlbCwgZGV0ZXJtaW5pbmcgdGhlIHRyYW5zZmVyIAotICAgICAqIHR5cGUgZnJvbSB0aGUgYml0cyBhcnJheSwgdGhlIHRyYW5zcGFyZW5jeSBmcm9tIHRoZSBhbHBoYSBtYXNrLCAKLSAgICAgKiBhbmQgdGhlIGRlZmF1bHQgY29sb3Igc3BhY2Uge0BsaW5rIENvbG9yU3BhY2UjQ1Nfc1JHQn0uCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGRpcmVjdCBjb2xvciBtb2RlbCwgZGV0ZXJtaW5pbmcgdGhlIHRyYW5zZmVyIHR5cGUgZnJvbQorICAgICAqIHRoZSBiaXRzIGFycmF5LCB0aGUgdHJhbnNwYXJlbmN5IGZyb20gdGhlIGFscGhhIG1hc2ssIGFuZCB0aGUgZGVmYXVsdAorICAgICAqIGNvbG9yIHNwYWNlIHtAbGluayBDb2xvclNwYWNlI0NTX3NSR0J9LgogICAgICAqIAotICAgICAqIEBwYXJhbSBiaXRzIHRoZSBhcnJheSBvZiBjb21wb25lbnQgbWFza3MKLSAgICAgKiBAcGFyYW0gcm1hc2sgdGhlIGJpdG1hc2sgY29ycmVzcG9uZGluZyB0byB0aGUgcmVkIGJhbmQKLSAgICAgKiBAcGFyYW0gZ21hc2sgdGhlIGJpdG1hc2sgY29ycmVzcG9uZGluZyB0byB0aGUgZ3JlZW4gYmFuZAotICAgICAqIEBwYXJhbSBibWFzayB0aGUgYml0bWFzayBjb3JyZXNwb25kaW5nIHRvIHRoZSBibHVlIGJhbmQKLSAgICAgKiBAcGFyYW0gYW1hc2sgdGhlIGJpdG1hc2sgY29ycmVzcG9uZGluZyB0byB0aGUgYWxwaGEgYmFuZAorICAgICAqIEBwYXJhbSBiaXRzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgY29tcG9uZW50IG1hc2tzLgorICAgICAqIEBwYXJhbSBybWFzaworICAgICAqICAgICAgICAgICAgdGhlIGJpdG1hc2sgY29ycmVzcG9uZGluZyB0byB0aGUgcmVkIGJhbmQuCisgICAgICogQHBhcmFtIGdtYXNrCisgICAgICogICAgICAgICAgICB0aGUgYml0bWFzayBjb3JyZXNwb25kaW5nIHRvIHRoZSBncmVlbiBiYW5kLgorICAgICAqIEBwYXJhbSBibWFzaworICAgICAqICAgICAgICAgICAgdGhlIGJpdG1hc2sgY29ycmVzcG9uZGluZyB0byB0aGUgYmx1ZSBiYW5kLgorICAgICAqIEBwYXJhbSBhbWFzaworICAgICAqICAgICAgICAgICAgdGhlIGJpdG1hc2sgY29ycmVzcG9uZGluZyB0byB0aGUgYWxwaGEgYmFuZC4KICAgICAgKi8KLSAgICBwdWJsaWMgRGlyZWN0Q29sb3JNb2RlbChpbnQgYml0cywgaW50IHJtYXNrLCBpbnQgZ21hc2ssIGludCBibWFzaywKLSAgICAgICAgICAgIGludCBhbWFzaykgeworICAgIHB1YmxpYyBEaXJlY3RDb2xvck1vZGVsKGludCBiaXRzLCBpbnQgcm1hc2ssIGludCBnbWFzaywgaW50IGJtYXNrLCBpbnQgYW1hc2spIHsKIAotICAgICAgICBzdXBlcihDb2xvclNwYWNlLmdldEluc3RhbmNlKENvbG9yU3BhY2UuQ1Nfc1JHQiksIGJpdHMsIHJtYXNrLCBnbWFzaywKLSAgICAgICAgICAgICAgICBibWFzaywgYW1hc2ssIGZhbHNlLAotICAgICAgICAgICAgICAgIChhbWFzayA9PSAwID8gVHJhbnNwYXJlbmN5Lk9QQVFVRSA6IFRyYW5zcGFyZW5jeS5UUkFOU0xVQ0VOVCksCi0gICAgICAgICAgICAgICAgQ29sb3JNb2RlbC5nZXRUcmFuc2ZlclR5cGUoYml0cykpOworICAgICAgICBzdXBlcihDb2xvclNwYWNlLmdldEluc3RhbmNlKENvbG9yU3BhY2UuQ1Nfc1JHQiksIGJpdHMsIHJtYXNrLCBnbWFzaywgYm1hc2ssIGFtYXNrLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAoYW1hc2sgPT0gMCA/IFRyYW5zcGFyZW5jeS5PUEFRVUUgOiBUcmFuc3BhcmVuY3kuVFJBTlNMVUNFTlQpLCBDb2xvck1vZGVsCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VHJhbnNmZXJUeXBlKGJpdHMpKTsKIAogICAgICAgICBpbml0TFVUcygpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkaXJlY3QgY29sb3IgbW9kZWwgd2l0aCBubyBhbHBoYSBjaGFubmVsLCAKLSAgICAgKiBkZXRlcm1pbmluZyB0aGUgdHJhbnNmZXIgdHlwZSBmcm9tIHRoZSBiaXRzIGFycmF5LCAKLSAgICAgKiB0aGUgZGVmYXVsdCBjb2xvciBzcGFjZSB7QGxpbmsgQ29sb3JTcGFjZSNDU19zUkdCfSwgCi0gICAgICogYW5kIHdpdGggdGhlIHRyYW5zcGFyZW5jeSBzZXQgdG8ge0BsaW5rIFRyYW5zcGFyZW5jeSNPUEFRVUV9LgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBkaXJlY3QgY29sb3IgbW9kZWwgd2l0aCBubyBhbHBoYSBjaGFubmVsLCBkZXRlcm1pbmluZworICAgICAqIHRoZSB0cmFuc2ZlciB0eXBlIGZyb20gdGhlIGJpdHMgYXJyYXksIHRoZSBkZWZhdWx0IGNvbG9yIHNwYWNlCisgICAgICoge0BsaW5rIENvbG9yU3BhY2UjQ1Nfc1JHQn0sIGFuZCB3aXRoIHRoZSB0cmFuc3BhcmVuY3kgc2V0IHRvCisgICAgICoge0BsaW5rIFRyYW5zcGFyZW5jeSNPUEFRVUV9LgogICAgICAqIAotICAgICAqIEBwYXJhbSBiaXRzIHRoZSBhcnJheSBvZiBjb21wb25lbnQgbWFza3MKLSAgICAgKiBAcGFyYW0gcm1hc2sgdGhlIGJpdG1hc2sgY29ycmVzcG9uZGluZyB0byB0aGUgcmVkIGJhbmQKLSAgICAgKiBAcGFyYW0gZ21hc2sgdGhlIGJpdG1hc2sgY29ycmVzcG9uZGluZyB0byB0aGUgZ3JlZW4gYmFuZAotICAgICAqIEBwYXJhbSBibWFzayB0aGUgYml0bWFzayBjb3JyZXNwb25kaW5nIHRvIHRoZSBibHVlIGJhbmQKKyAgICAgKiBAcGFyYW0gYml0cworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGNvbXBvbmVudCBtYXNrcy4KKyAgICAgKiBAcGFyYW0gcm1hc2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBiaXRtYXNrIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlZCBiYW5kLgorICAgICAqIEBwYXJhbSBnbWFzaworICAgICAqICAgICAgICAgICAgdGhlIGJpdG1hc2sgY29ycmVzcG9uZGluZyB0byB0aGUgZ3JlZW4gYmFuZC4KKyAgICAgKiBAcGFyYW0gYm1hc2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBiaXRtYXNrIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGJsdWUgYmFuZC4KICAgICAgKi8KICAgICBwdWJsaWMgRGlyZWN0Q29sb3JNb2RlbChpbnQgYml0cywgaW50IHJtYXNrLCBpbnQgZ21hc2ssIGludCBibWFzaykgewogICAgICAgICB0aGlzKGJpdHMsIHJtYXNrLCBnbWFzaywgYm1hc2ssIDApOwpAQCAtMTM5LDQyICsxNzcsNDIgQEAKICAgICAgICAgfQogCiAgICAgICAgIHN3aXRjaCAodHJhbnNmZXJUeXBlKSB7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6Ci0gICAgICAgICAgICBieXRlIGJhW107Ci0gICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBiYSA9IG5ldyBieXRlWzFdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBiYSA9IChieXRlW10pIG9iajsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJhWzBdID0gKGJ5dGUpIHBpeGVsOwotICAgICAgICAgICAgb2JqID0gYmE7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6CisgICAgICAgICAgICAgICAgYnl0ZSBiYVtdOworICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBiYSA9IG5ldyBieXRlWzFdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJhID0gKGJ5dGVbXSlvYmo7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJhWzBdID0gKGJ5dGUpcGl4ZWw7CisgICAgICAgICAgICAgICAgb2JqID0gYmE7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgotICAgICAgICAgICAgc2hvcnQgc2FbXTsKLSAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNhID0gbmV3IHNob3J0WzFdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzYSA9IChzaG9ydFtdKSBvYmo7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzYVswXSA9IChzaG9ydCkgcGl4ZWw7Ci0gICAgICAgICAgICBvYmogPSBzYTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgorICAgICAgICAgICAgICAgIHNob3J0IHNhW107CisgICAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHNhID0gbmV3IHNob3J0WzFdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNhID0gKHNob3J0W10pb2JqOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzYVswXSA9IChzaG9ydClwaXhlbDsKKyAgICAgICAgICAgICAgICBvYmogPSBzYTsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6Ci0gICAgICAgICAgICBpbnQgaWFbXTsKLSAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlhID0gbmV3IGludFsxXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWEgPSAoaW50W10pIG9iajsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlhWzBdID0gcGl4ZWw7Ci0gICAgICAgICAgICBvYmogPSBpYTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgorICAgICAgICAgICAgICAgIGludCBpYVtdOworICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpYSA9IG5ldyBpbnRbMV07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWEgPSAoaW50W10pb2JqOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpYVswXSA9IHBpeGVsOworICAgICAgICAgICAgICAgIG9iaiA9IGlhOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvLyBhd3QuMjE0PVRoaXMgQ29sb3IgTW9kZWwgZG9lc24ndCBzdXBwb3J0IHRoaXMgdHJhbnNmZXJUeXBlCi0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjE0IikpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIGF3dC4yMTQ9VGhpcyBDb2xvciBNb2RlbCBkb2Vzbid0IHN1cHBvcnQgdGhpcyB0cmFuc2ZlclR5cGUKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjE0IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gb2JqOwpAQCAtMTg3LDcgKzIyNSw3IEBACiAgICAgICAgICAgICBpZiAocGl4ZWwgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGlhID0gbmV3IGludFsxXTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWEgPSAoaW50W10pIHBpeGVsOworICAgICAgICAgICAgICAgIGlhID0gKGludFtdKXBpeGVsOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWFbMF0gPSByZ2I7CiAgICAgICAgICAgICByZXR1cm4gaWE7CkBAIC0yNDYsNjcgKzI4NCw2NiBAQAogICAgICAgICBpbnQgcHhsID0gMDsKICAgICAgICAgaWYgKGhhc0FscGhhKSB7CiAgICAgICAgICAgICBmbG9hdCBub3JtQWxwaGEgPSBub3JtQ29tcFtudW1Db2xvckNvbXBvbmVudHNdOwotICAgICAgICAgICAgYWxwaGEgPSAoaW50KSAobm9ybUFscGhhICogbWF4VmFsdWVzW251bUNvbG9yQ29tcG9uZW50c10gKyAwLjVmKTsKKyAgICAgICAgICAgIGFscGhhID0gKGludCkobm9ybUFscGhhICogbWF4VmFsdWVzW251bUNvbG9yQ29tcG9uZW50c10gKyAwLjVmKTsKICAgICAgICAgICAgIGlmIChpc0FscGhhUHJlbXVsdGlwbGllZCkgewotICAgICAgICAgICAgICAgIHJlZCA9IChpbnQpIChub3JtQ29tcFswXSAqIG5vcm1BbHBoYSAqIG1heFZhbHVlc1swXSArIDAuNWYpOwotICAgICAgICAgICAgICAgIGdyZWVuID0gKGludCkgKG5vcm1Db21wWzFdICogbm9ybUFscGhhICogbWF4VmFsdWVzWzFdICsgMC41Zik7Ci0gICAgICAgICAgICAgICAgYmx1ZSA9IChpbnQpIChub3JtQ29tcFsyXSAqIG5vcm1BbHBoYSAqIG1heFZhbHVlc1syXSArIDAuNWYpOworICAgICAgICAgICAgICAgIHJlZCA9IChpbnQpKG5vcm1Db21wWzBdICogbm9ybUFscGhhICogbWF4VmFsdWVzWzBdICsgMC41Zik7CisgICAgICAgICAgICAgICAgZ3JlZW4gPSAoaW50KShub3JtQ29tcFsxXSAqIG5vcm1BbHBoYSAqIG1heFZhbHVlc1sxXSArIDAuNWYpOworICAgICAgICAgICAgICAgIGJsdWUgPSAoaW50KShub3JtQ29tcFsyXSAqIG5vcm1BbHBoYSAqIG1heFZhbHVlc1syXSArIDAuNWYpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZWQgPSAoaW50KSAobm9ybUNvbXBbMF0gKiBtYXhWYWx1ZXNbMF0gKyAwLjVmKTsKLSAgICAgICAgICAgICAgICBncmVlbiA9IChpbnQpIChub3JtQ29tcFsxXSAqIG1heFZhbHVlc1sxXSArIDAuNWYpOwotICAgICAgICAgICAgICAgIGJsdWUgPSAoaW50KSAobm9ybUNvbXBbMl0gKiBtYXhWYWx1ZXNbMl0gKyAwLjVmKTsKKyAgICAgICAgICAgICAgICByZWQgPSAoaW50KShub3JtQ29tcFswXSAqIG1heFZhbHVlc1swXSArIDAuNWYpOworICAgICAgICAgICAgICAgIGdyZWVuID0gKGludCkobm9ybUNvbXBbMV0gKiBtYXhWYWx1ZXNbMV0gKyAwLjVmKTsKKyAgICAgICAgICAgICAgICBibHVlID0gKGludCkobm9ybUNvbXBbMl0gKiBtYXhWYWx1ZXNbMl0gKyAwLjVmKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHB4bCA9IChhbHBoYSA8PCBvZmZzZXRzWzNdKSAmIGNvbXBvbmVudE1hc2tzWzNdOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVkID0gKGludCkgKG5vcm1Db21wWzBdICogbWF4VmFsdWVzWzBdICsgMC41Zik7Ci0gICAgICAgICAgICBncmVlbiA9IChpbnQpIChub3JtQ29tcFsxXSAqIG1heFZhbHVlc1sxXSArIDAuNWYpOwotICAgICAgICAgICAgYmx1ZSA9IChpbnQpIChub3JtQ29tcFsyXSAqIG1heFZhbHVlc1syXSArIDAuNWYpOworICAgICAgICAgICAgcmVkID0gKGludCkobm9ybUNvbXBbMF0gKiBtYXhWYWx1ZXNbMF0gKyAwLjVmKTsKKyAgICAgICAgICAgIGdyZWVuID0gKGludCkobm9ybUNvbXBbMV0gKiBtYXhWYWx1ZXNbMV0gKyAwLjVmKTsKKyAgICAgICAgICAgIGJsdWUgPSAoaW50KShub3JtQ29tcFsyXSAqIG1heFZhbHVlc1syXSArIDAuNWYpOwogICAgICAgICB9CiAKLSAgICAgICAgcHhsIHw9ICgocmVkIDw8IG9mZnNldHNbMF0pICYgY29tcG9uZW50TWFza3NbMF0pIHwKLSAgICAgICAgICAgICAgICgoZ3JlZW4gPDwgb2Zmc2V0c1sxXSkgJiBjb21wb25lbnRNYXNrc1sxXSkgfAotICAgICAgICAgICAgICAgKChibHVlIDw8IG9mZnNldHNbMl0pICYgY29tcG9uZW50TWFza3NbMl0pOworICAgICAgICBweGwgfD0gKChyZWQgPDwgb2Zmc2V0c1swXSkgJiBjb21wb25lbnRNYXNrc1swXSkKKyAgICAgICAgICAgICAgICB8ICgoZ3JlZW4gPDwgb2Zmc2V0c1sxXSkgJiBjb21wb25lbnRNYXNrc1sxXSkKKyAgICAgICAgICAgICAgICB8ICgoYmx1ZSA8PCBvZmZzZXRzWzJdKSAmIGNvbXBvbmVudE1hc2tzWzJdKTsKIAogICAgICAgICBzd2l0Y2ggKHRyYW5zZmVyVHlwZSkgewotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgotICAgICAgICAgICAgYnl0ZSBiYVtdOwotICAgICAgICAgICAgaWYgKHBpeGVsID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBiYSA9IG5ldyBieXRlWzFdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBiYSA9IChieXRlW10pIHBpeGVsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYmFbMF0gPSAoYnl0ZSkgcHhsOwotICAgICAgICAgICAgcmV0dXJuIGJhOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKKyAgICAgICAgICAgICAgICBieXRlIGJhW107CisgICAgICAgICAgICAgICAgaWYgKHBpeGVsID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYmEgPSBuZXcgYnl0ZVsxXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBiYSA9IChieXRlW10pcGl4ZWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJhWzBdID0gKGJ5dGUpcHhsOworICAgICAgICAgICAgICAgIHJldHVybiBiYTsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6Ci0gICAgICAgICAgICBzaG9ydCBzYVtdOwotICAgICAgICAgICAgaWYgKHBpeGVsID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzYSA9IG5ldyBzaG9ydFsxXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2EgPSAoc2hvcnRbXSkgcGl4ZWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzYVswXSA9IChzaG9ydCkgcHhsOwotICAgICAgICAgICAgcmV0dXJuIHNhOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgorICAgICAgICAgICAgICAgIHNob3J0IHNhW107CisgICAgICAgICAgICAgICAgaWYgKHBpeGVsID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2EgPSBuZXcgc2hvcnRbMV07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2EgPSAoc2hvcnRbXSlwaXhlbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2FbMF0gPSAoc2hvcnQpcHhsOworICAgICAgICAgICAgICAgIHJldHVybiBzYTsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6Ci0gICAgICAgICAgICBpbnQgaWFbXTsKLSAgICAgICAgICAgIGlmIChwaXhlbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWEgPSBuZXcgaW50WzFdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpYSA9IChpbnRbXSkgcGl4ZWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpYVswXSA9IHB4bDsKLSAgICAgICAgICAgIHJldHVybiBpYTsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKKyAgICAgICAgICAgICAgICBpbnQgaWFbXTsKKyAgICAgICAgICAgICAgICBpZiAocGl4ZWwgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpYSA9IG5ldyBpbnRbMV07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWEgPSAoaW50W10pcGl4ZWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlhWzBdID0gcHhsOworICAgICAgICAgICAgICAgIHJldHVybiBpYTsKIAotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gYXd0LjIxND1UaGlzIENvbG9yIE1vZGVsIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIHRyYW5zZmVyVHlwZQotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxNCIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyBhd3QuMjE0PVRoaXMgQ29sb3IgTW9kZWwgZG9lc24ndCBzdXBwb3J0IHRoaXMgdHJhbnNmZXJUeXBlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxNCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIENvbG9yTW9kZWwgY29lcmNlRGF0YShXcml0YWJsZVJhc3RlciByYXN0ZXIsCi0gICAgICAgICAgICBib29sZWFuIGlzQWxwaGFQcmVtdWx0aXBsaWVkKSB7CisgICAgcHVibGljIGZpbmFsIENvbG9yTW9kZWwgY29lcmNlRGF0YShXcml0YWJsZVJhc3RlciByYXN0ZXIsIGJvb2xlYW4gaXNBbHBoYVByZW11bHRpcGxpZWQpIHsKIAogICAgICAgICBpZiAoIWhhc0FscGhhIHx8IHRoaXMuaXNBbHBoYVByZW11bHRpcGxpZWQgPT0gaXNBbHBoYVByZW11bHRpcGxpZWQpIHsKICAgICAgICAgICAgIHJldHVybiB0aGlzOwpAQCAtMzI0LDg2ICszNjEsODIgQEAKIAogICAgICAgICBpZiAoaXNBbHBoYVByZW11bHRpcGxpZWQpIHsKICAgICAgICAgICAgIHN3aXRjaCAodHJhbnNmZXJUeXBlKSB7Ci0gICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgotICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgotICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaDsgaSsrLCBtaW5ZKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDAsIHggPSBtaW5YOyBqIDwgdzsgaisrLCB4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMgPSByYXN0ZXIuZ2V0UGl4ZWwoeCwgbWluWSwgY29tcG9uZW50cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50c1tudW1Db2xvckNvbXBvbmVudHNdID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXN0ZXIuc2V0UGl4ZWwoeCwgbWluWSwgdHJhbnNwYXJlbnRDb21wb25lbnRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYWxwaGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzW251bUNvbG9yQ29tcG9uZW50c10gLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFGYWN0b3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBudW1Db2xvckNvbXBvbmVudHM7IG4rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzW25dID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIChhbHBoYSAqIGNvbXBvbmVudHNbbl0gKyAwLjVmKTsKKyAgICAgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgorICAgICAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKKyAgICAgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaDsgaSsrLCBtaW5ZKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwLCB4ID0gbWluWDsgaiA8IHc7IGorKywgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cyA9IHJhc3Rlci5nZXRQaXhlbCh4LCBtaW5ZLCBjb21wb25lbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50c1tudW1Db2xvckNvbXBvbmVudHNdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFzdGVyLnNldFBpeGVsKHgsIG1pblksIHRyYW5zcGFyZW50Q29tcG9uZW50cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYWxwaGEgPSBjb21wb25lbnRzW251bUNvbG9yQ29tcG9uZW50c10gLyBhbHBoYUZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBudW1Db2xvckNvbXBvbmVudHM7IG4rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50c1tuXSA9IChpbnQpKGFscGhhICogY29tcG9uZW50c1tuXSArIDAuNWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhc3Rlci5zZXRQaXhlbCh4LCBtaW5ZLCBjb21wb25lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFzdGVyLnNldFBpeGVsKHgsIG1pblksIGNvbXBvbmVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgLy8gYXd0LjIxND1UaGlzIENvbG9yIE1vZGVsIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIHRyYW5zZmVyVHlwZQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMTQiKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAvLyBhd3QuMjE0PVRoaXMgQ29sb3IgTW9kZWwgZG9lc24ndCBzdXBwb3J0IHRoaXMKKyAgICAgICAgICAgICAgICAgICAgLy8gdHJhbnNmZXJUeXBlCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMTQiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHN3aXRjaCAodHJhbnNmZXJUeXBlKSB7Ci0gICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgotICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgotICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaDsgaSsrLCBtaW5ZKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDAsIHggPSBtaW5YOyBqIDwgdzsgaisrLCB4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMgPSByYXN0ZXIuZ2V0UGl4ZWwoeCwgbWluWSwgY29tcG9uZW50cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50c1tudW1Db2xvckNvbXBvbmVudHNdICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbHBoYSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhRmFjdG9yIC8gY29tcG9uZW50c1tudW1Db2xvckNvbXBvbmVudHNdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtQ29sb3JDb21wb25lbnRzOyBuKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50c1tuXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAoYWxwaGEgKiBjb21wb25lbnRzW25dICsgMC41Zik7CisgICAgICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKKyAgICAgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6CisgICAgICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgorICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGg7IGkrKywgbWluWSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMCwgeCA9IG1pblg7IGogPCB3OyBqKyssIHgrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMgPSByYXN0ZXIuZ2V0UGl4ZWwoeCwgbWluWSwgY29tcG9uZW50cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudHNbbnVtQ29sb3JDb21wb25lbnRzXSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFscGhhID0gYWxwaGFGYWN0b3IgLyBjb21wb25lbnRzW251bUNvbG9yQ29tcG9uZW50c107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtQ29sb3JDb21wb25lbnRzOyBuKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHNbbl0gPSAoaW50KShhbHBoYSAqIGNvbXBvbmVudHNbbl0gKyAwLjVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXN0ZXIuc2V0UGl4ZWwoeCwgbWluWSwgY29tcG9uZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhc3Rlci5zZXRQaXhlbCh4LCBtaW5ZLCBjb21wb25lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIC8vIGF3dC4yMTQ9VGhpcyBDb2xvciBNb2RlbCBkb2Vzbid0IHN1cHBvcnQgdGhpcyB0cmFuc2ZlclR5cGUKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjE0IikpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgLy8gYXd0LjIxND1UaGlzIENvbG9yIE1vZGVsIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzCisgICAgICAgICAgICAgICAgICAgIC8vIHRyYW5zZmVyVHlwZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjE0IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICB9CiAKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBuZXcgRGlyZWN0Q29sb3JNb2RlbChjcywgcGl4ZWxfYml0cywgY29tcG9uZW50TWFza3NbMF0sCi0gICAgICAgICAgICAgICAgY29tcG9uZW50TWFza3NbMV0sIGNvbXBvbmVudE1hc2tzWzJdLCBjb21wb25lbnRNYXNrc1szXSwKLSAgICAgICAgICAgICAgICBpc0FscGhhUHJlbXVsdGlwbGllZCwgdHJhbnNmZXJUeXBlKTsKKyAgICAgICAgcmV0dXJuIG5ldyBEaXJlY3RDb2xvck1vZGVsKGNzLCBwaXhlbF9iaXRzLCBjb21wb25lbnRNYXNrc1swXSwgY29tcG9uZW50TWFza3NbMV0sCisgICAgICAgICAgICAgICAgY29tcG9uZW50TWFza3NbMl0sIGNvbXBvbmVudE1hc2tzWzNdLCBpc0FscGhhUHJlbXVsdGlwbGllZCwgdHJhbnNmZXJUeXBlKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAvLyBUaGUgb3V0cHV0IGZvcm1hdCBiYXNlZCBvbiAxLjUgcmVsZWFzZSBiZWhhdmlvdXIuIAorICAgICAgICAvLyBUaGUgb3V0cHV0IGZvcm1hdCBiYXNlZCBvbiAxLjUgcmVsZWFzZSBiZWhhdmlvdXIuCiAgICAgICAgIC8vIEl0IGNvdWxkIGJlIHJldmVsZWQgc3VjaCB3YXk6Ci0gICAgICAgIC8vIEJ1ZmZlcmVkSW1hZ2UgYmkgPSBuZXcgQnVmZmVyZWRJbWFnZSgxLCAxLCBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0IpOworICAgICAgICAvLyBCdWZmZXJlZEltYWdlIGJpID0gbmV3IEJ1ZmZlcmVkSW1hZ2UoMSwgMSwKKyAgICAgICAgLy8gQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9BUkdCKTsKICAgICAgICAgLy8gQ29sb3JNb2RlbCBjbSA9IGJpLmdldENvbG9yTW9kZWwoKTsKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKGNtLnRvU3RyaW5nKCkpOwogICAgICAgICBTdHJpbmcgc3RyID0gIkRpcmVjdENvbG9yTW9kZWw6IiArICIgcm1hc2sgPSAiICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICAgICBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNvbXBvbmVudE1hc2tzWzBdKSArICIgZ21hc2sgPSAiICsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgSW50ZWdlci50b0hleFN0cmluZyhjb21wb25lbnRNYXNrc1sxXSkgKyAiIGJtYXNrID0gIiArIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgIEludGVnZXIudG9IZXhTdHJpbmcoY29tcG9uZW50TWFza3NbMl0pICsgIiBhbWFzayA9ICIgKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAoIWhhc0FscGhhID8gIjAiIDogSW50ZWdlci50b0hleFN0cmluZyhjb21wb25lbnRNYXNrc1szXSkpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgSW50ZWdlci50b0hleFN0cmluZyhjb21wb25lbnRNYXNrc1swXSkgKyAiIGdtYXNrID0gIiArIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNvbXBvbmVudE1hc2tzWzFdKSArICIgYm1hc2sgPSAiICsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgIEludGVnZXIudG9IZXhTdHJpbmcoY29tcG9uZW50TWFza3NbMl0pICsgIiBhbWFzayA9ICIgKyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgKCFoYXNBbHBoYSA/ICIwIiA6IEludGVnZXIudG9IZXhTdHJpbmcoY29tcG9uZW50TWFza3NbM10pKTsgLy8kTk9OLU5MUy0xJAogCiAgICAgICAgIHJldHVybiBzdHI7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIGludFtdIGdldENvbXBvbmVudHMoT2JqZWN0IHBpeGVsLCBpbnQgY29tcG9uZW50c1tdLAotICAgICAgICAgICAgaW50IG9mZnNldCkgeworICAgIHB1YmxpYyBmaW5hbCBpbnRbXSBnZXRDb21wb25lbnRzKE9iamVjdCBwaXhlbCwgaW50IGNvbXBvbmVudHNbXSwgaW50IG9mZnNldCkgewogCiAgICAgICAgIGlmIChjb21wb25lbnRzID09IG51bGwpIHsKICAgICAgICAgICAgIGNvbXBvbmVudHMgPSBuZXcgaW50W251bUNvbXBvbmVudHMgKyBvZmZzZXRdOwpAQCAtNDEyLDI1ICs0NDUsMjYgQEAKICAgICAgICAgaW50IGludFBpeGVsID0gMDsKIAogICAgICAgICBzd2l0Y2ggKHRyYW5zZmVyVHlwZSkgewotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgotICAgICAgICAgICAgYnl0ZSBiYVtdID0gKGJ5dGVbXSkgcGl4ZWw7Ci0gICAgICAgICAgICBpbnRQaXhlbCA9IGJhWzBdICYgMHhmZjsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKKyAgICAgICAgICAgICAgICBieXRlIGJhW10gPSAoYnl0ZVtdKXBpeGVsOworICAgICAgICAgICAgICAgIGludFBpeGVsID0gYmFbMF0gJiAweGZmOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKLSAgICAgICAgICAgIHNob3J0IHNhW10gPSAoc2hvcnRbXSkgcGl4ZWw7Ci0gICAgICAgICAgICBpbnRQaXhlbCA9IHNhWzBdICYgMHhmZmZmOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6CisgICAgICAgICAgICAgICAgc2hvcnQgc2FbXSA9IChzaG9ydFtdKXBpeGVsOworICAgICAgICAgICAgICAgIGludFBpeGVsID0gc2FbMF0gJiAweGZmZmY7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgotICAgICAgICAgICAgaW50IGlhW10gPSAoaW50W10pIHBpeGVsOwotICAgICAgICAgICAgaW50UGl4ZWwgPSBpYVswXTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgorICAgICAgICAgICAgICAgIGludCBpYVtdID0gKGludFtdKXBpeGVsOworICAgICAgICAgICAgICAgIGludFBpeGVsID0gaWFbMF07CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIGF3dC4yMkQ9VGhpcyB0cmFuc2ZlclR5cGUgKCB7MH0gKSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgY29sb3IgbW9kZWwKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMkQiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgdHJhbnNmZXJUeXBlKSk7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIGF3dC4yMkQ9VGhpcyB0cmFuc2ZlclR5cGUgKCB7MH0gKSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMKKyAgICAgICAgICAgICAgICAvLyBjb2xvciBtb2RlbAorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMkQiLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlclR5cGUpKTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnRzKGludFBpeGVsLCBjb21wb25lbnRzLCBvZmZzZXQpOwpAQCAtNDQwLDI0ICs0NzQsMjQgQEAKICAgICBwdWJsaWMgaW50IGdldFJlZChPYmplY3QgaW5EYXRhKSB7CiAgICAgICAgIGludCBwaXhlbCA9IDA7CiAgICAgICAgIHN3aXRjaCAodHJhbnNmZXJUeXBlKSB7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6Ci0gICAgICAgICAgICBieXRlIGJhW10gPSAoYnl0ZVtdKSBpbkRhdGE7Ci0gICAgICAgICAgICBwaXhlbCA9IGJhWzBdICYgMHhmZjsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKKyAgICAgICAgICAgICAgICBieXRlIGJhW10gPSAoYnl0ZVtdKWluRGF0YTsKKyAgICAgICAgICAgICAgICBwaXhlbCA9IGJhWzBdICYgMHhmZjsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6Ci0gICAgICAgICAgICBzaG9ydCBzYVtdID0gKHNob3J0W10pIGluRGF0YTsKLSAgICAgICAgICAgIHBpeGVsID0gc2FbMF0gJiAweGZmZmY7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKKyAgICAgICAgICAgICAgICBzaG9ydCBzYVtdID0gKHNob3J0W10paW5EYXRhOworICAgICAgICAgICAgICAgIHBpeGVsID0gc2FbMF0gJiAweGZmZmY7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgotICAgICAgICAgICAgaW50IGlhW10gPSAoaW50W10pIGluRGF0YTsKLSAgICAgICAgICAgIHBpeGVsID0gaWFbMF07Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKKyAgICAgICAgICAgICAgICBpbnQgaWFbXSA9IChpbnRbXSlpbkRhdGE7CisgICAgICAgICAgICAgICAgcGl4ZWwgPSBpYVswXTsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gYXd0LjIxND1UaGlzIENvbG9yIE1vZGVsIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIHRyYW5zZmVyVHlwZQotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxNCIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyBhd3QuMjE0PVRoaXMgQ29sb3IgTW9kZWwgZG9lc24ndCBzdXBwb3J0IHRoaXMgdHJhbnNmZXJUeXBlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxNCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBnZXRSZWQocGl4ZWwpOwogICAgIH0KQEAgLTQ2NiwyNCArNTAwLDI0IEBACiAgICAgcHVibGljIGludCBnZXRSR0IoT2JqZWN0IGluRGF0YSkgewogICAgICAgICBpbnQgcGl4ZWwgPSAwOwogICAgICAgICBzd2l0Y2ggKHRyYW5zZmVyVHlwZSkgewotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgotICAgICAgICAgICAgYnl0ZSBiYVtdID0gKGJ5dGVbXSkgaW5EYXRhOwotICAgICAgICAgICAgcGl4ZWwgPSBiYVswXSAmIDB4ZmY7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6CisgICAgICAgICAgICAgICAgYnl0ZSBiYVtdID0gKGJ5dGVbXSlpbkRhdGE7CisgICAgICAgICAgICAgICAgcGl4ZWwgPSBiYVswXSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgotICAgICAgICAgICAgc2hvcnQgc2FbXSA9IChzaG9ydFtdKSBpbkRhdGE7Ci0gICAgICAgICAgICBwaXhlbCA9IHNhWzBdICYgMHhmZmZmOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6CisgICAgICAgICAgICAgICAgc2hvcnQgc2FbXSA9IChzaG9ydFtdKWluRGF0YTsKKyAgICAgICAgICAgICAgICBwaXhlbCA9IHNhWzBdICYgMHhmZmZmOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKLSAgICAgICAgICAgIGludCBpYVtdID0gKGludFtdKSBpbkRhdGE7Ci0gICAgICAgICAgICBwaXhlbCA9IGlhWzBdOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6CisgICAgICAgICAgICAgICAgaW50IGlhW10gPSAoaW50W10paW5EYXRhOworICAgICAgICAgICAgICAgIHBpeGVsID0gaWFbMF07CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIGF3dC4yMTQ9VGhpcyBDb2xvciBNb2RlbCBkb2Vzbid0IHN1cHBvcnQgdGhpcyB0cmFuc2ZlclR5cGUKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMTQiKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8gYXd0LjIxND1UaGlzIENvbG9yIE1vZGVsIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIHRyYW5zZmVyVHlwZQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMTQiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZ2V0UkdCKHBpeGVsKTsKICAgICB9CkBAIC00OTIsMjQgKzUyNiwyNCBAQAogICAgIHB1YmxpYyBpbnQgZ2V0R3JlZW4oT2JqZWN0IGluRGF0YSkgewogICAgICAgICBpbnQgcGl4ZWwgPSAwOwogICAgICAgICBzd2l0Y2ggKHRyYW5zZmVyVHlwZSkgewotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgotICAgICAgICAgICAgYnl0ZSBiYVtdID0gKGJ5dGVbXSkgaW5EYXRhOwotICAgICAgICAgICAgcGl4ZWwgPSBiYVswXSAmIDB4ZmY7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6CisgICAgICAgICAgICAgICAgYnl0ZSBiYVtdID0gKGJ5dGVbXSlpbkRhdGE7CisgICAgICAgICAgICAgICAgcGl4ZWwgPSBiYVswXSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgotICAgICAgICAgICAgc2hvcnQgc2FbXSA9IChzaG9ydFtdKSBpbkRhdGE7Ci0gICAgICAgICAgICBwaXhlbCA9IHNhWzBdICYgMHhmZmZmOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6CisgICAgICAgICAgICAgICAgc2hvcnQgc2FbXSA9IChzaG9ydFtdKWluRGF0YTsKKyAgICAgICAgICAgICAgICBwaXhlbCA9IHNhWzBdICYgMHhmZmZmOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKLSAgICAgICAgICAgIGludCBpYVtdID0gKGludFtdKSBpbkRhdGE7Ci0gICAgICAgICAgICBwaXhlbCA9IGlhWzBdOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6CisgICAgICAgICAgICAgICAgaW50IGlhW10gPSAoaW50W10paW5EYXRhOworICAgICAgICAgICAgICAgIHBpeGVsID0gaWFbMF07CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIGF3dC4yMTQ9VGhpcyBDb2xvciBNb2RlbCBkb2Vzbid0IHN1cHBvcnQgdGhpcyB0cmFuc2ZlclR5cGUKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMTQiKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8gYXd0LjIxND1UaGlzIENvbG9yIE1vZGVsIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIHRyYW5zZmVyVHlwZQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMTQiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZ2V0R3JlZW4ocGl4ZWwpOwogICAgIH0KQEAgLTUxOCwyNCArNTUyLDI0IEBACiAgICAgcHVibGljIGludCBnZXRCbHVlKE9iamVjdCBpbkRhdGEpIHsKICAgICAgICAgaW50IHBpeGVsID0gMDsKICAgICAgICAgc3dpdGNoICh0cmFuc2ZlclR5cGUpIHsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKLSAgICAgICAgICAgIGJ5dGUgYmFbXSA9IChieXRlW10pIGluRGF0YTsKLSAgICAgICAgICAgIHBpeGVsID0gYmFbMF0gJiAweGZmOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgorICAgICAgICAgICAgICAgIGJ5dGUgYmFbXSA9IChieXRlW10paW5EYXRhOworICAgICAgICAgICAgICAgIHBpeGVsID0gYmFbMF0gJiAweGZmOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKLSAgICAgICAgICAgIHNob3J0IHNhW10gPSAoc2hvcnRbXSkgaW5EYXRhOwotICAgICAgICAgICAgcGl4ZWwgPSBzYVswXSAmIDB4ZmZmZjsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgorICAgICAgICAgICAgICAgIHNob3J0IHNhW10gPSAoc2hvcnRbXSlpbkRhdGE7CisgICAgICAgICAgICAgICAgcGl4ZWwgPSBzYVswXSAmIDB4ZmZmZjsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6Ci0gICAgICAgICAgICBpbnQgaWFbXSA9IChpbnRbXSkgaW5EYXRhOwotICAgICAgICAgICAgcGl4ZWwgPSBpYVswXTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgorICAgICAgICAgICAgICAgIGludCBpYVtdID0gKGludFtdKWluRGF0YTsKKyAgICAgICAgICAgICAgICBwaXhlbCA9IGlhWzBdOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvLyBhd3QuMjE0PVRoaXMgQ29sb3IgTW9kZWwgZG9lc24ndCBzdXBwb3J0IHRoaXMgdHJhbnNmZXJUeXBlCi0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjE0IikpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIGF3dC4yMTQ9VGhpcyBDb2xvciBNb2RlbCBkb2Vzbid0IHN1cHBvcnQgdGhpcyB0cmFuc2ZlclR5cGUKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjE0IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGdldEJsdWUocGl4ZWwpOwogICAgIH0KQEAgLTU0NCwyNCArNTc4LDI0IEBACiAgICAgcHVibGljIGludCBnZXRBbHBoYShPYmplY3QgaW5EYXRhKSB7CiAgICAgICAgIGludCBwaXhlbCA9IDA7CiAgICAgICAgIHN3aXRjaCAodHJhbnNmZXJUeXBlKSB7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6Ci0gICAgICAgICAgICBieXRlIGJhW10gPSAoYnl0ZVtdKSBpbkRhdGE7Ci0gICAgICAgICAgICBwaXhlbCA9IGJhWzBdICYgMHhmZjsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKKyAgICAgICAgICAgICAgICBieXRlIGJhW10gPSAoYnl0ZVtdKWluRGF0YTsKKyAgICAgICAgICAgICAgICBwaXhlbCA9IGJhWzBdICYgMHhmZjsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6Ci0gICAgICAgICAgICBzaG9ydCBzYVtdID0gKHNob3J0W10pIGluRGF0YTsKLSAgICAgICAgICAgIHBpeGVsID0gc2FbMF0gJiAweGZmZmY7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKKyAgICAgICAgICAgICAgICBzaG9ydCBzYVtdID0gKHNob3J0W10paW5EYXRhOworICAgICAgICAgICAgICAgIHBpeGVsID0gc2FbMF0gJiAweGZmZmY7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgotICAgICAgICAgICAgaW50IGlhW10gPSAoaW50W10pIGluRGF0YTsKLSAgICAgICAgICAgIHBpeGVsID0gaWFbMF07Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKKyAgICAgICAgICAgICAgICBpbnQgaWFbXSA9IChpbnRbXSlpbkRhdGE7CisgICAgICAgICAgICAgICAgcGl4ZWwgPSBpYVswXTsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gYXd0LjIxND1UaGlzIENvbG9yIE1vZGVsIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIHRyYW5zZmVyVHlwZQotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxNCIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyBhd3QuMjE0PVRoaXMgQ29sb3IgTW9kZWwgZG9lc24ndCBzdXBwb3J0IHRoaXMgdHJhbnNmZXJUeXBlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxNCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBnZXRBbHBoYShwaXhlbCk7CiAgICAgfQpAQCAtNTc2LDE0ICs2MTAsMTEgQEAKICAgICAgICAgaW50IGJhbmRNYXNrc1tdID0gY29tcG9uZW50TWFza3MuY2xvbmUoKTsKIAogICAgICAgICBpZiAocGl4ZWxfYml0cyA+IDE2KSB7Ci0gICAgICAgICAgICByZXR1cm4gUmFzdGVyLmNyZWF0ZVBhY2tlZFJhc3RlcihEYXRhQnVmZmVyLlRZUEVfSU5ULCB3LCBoLAotICAgICAgICAgICAgICAgICAgICBiYW5kTWFza3MsIG51bGwpOworICAgICAgICAgICAgcmV0dXJuIFJhc3Rlci5jcmVhdGVQYWNrZWRSYXN0ZXIoRGF0YUJ1ZmZlci5UWVBFX0lOVCwgdywgaCwgYmFuZE1hc2tzLCBudWxsKTsKICAgICAgICAgfSBlbHNlIGlmIChwaXhlbF9iaXRzID4gOCkgewotICAgICAgICAgICAgcmV0dXJuIFJhc3Rlci5jcmVhdGVQYWNrZWRSYXN0ZXIoRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVCwgdywgaCwKLSAgICAgICAgICAgICAgICAgICAgYmFuZE1hc2tzLCBudWxsKTsKKyAgICAgICAgICAgIHJldHVybiBSYXN0ZXIuY3JlYXRlUGFja2VkUmFzdGVyKERhdGFCdWZmZXIuVFlQRV9VU0hPUlQsIHcsIGgsIGJhbmRNYXNrcywgbnVsbCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gUmFzdGVyLmNyZWF0ZVBhY2tlZFJhc3RlcihEYXRhQnVmZmVyLlRZUEVfQllURSwgdywgaCwKLSAgICAgICAgICAgICAgICAgICAgYmFuZE1hc2tzLCBudWxsKTsKKyAgICAgICAgICAgIHJldHVybiBSYXN0ZXIuY3JlYXRlUGFja2VkUmFzdGVyKERhdGFCdWZmZXIuVFlQRV9CWVRFLCB3LCBoLCBiYW5kTWFza3MsIG51bGwpOwogICAgICAgICB9CiAgICAgfQogCkBAIC01OTQsNyArNjI1LDcgQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCi0gICAgICAgIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgc3Bwc20gPSAoU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCkgc207CisgICAgICAgIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgc3Bwc20gPSAoU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbClzbTsKIAogICAgICAgICBpZiAoc3Bwc20uZ2V0TnVtQmFuZHMoKSAhPSBudW1Db21wb25lbnRzKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC02NDAsOCArNjcxLDggQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0UkdCKGludCBwaXhlbCkgewotICAgICAgICByZXR1cm4gKGdldEFscGhhKHBpeGVsKSA8PCAyNCkgfCAoZ2V0UmVkKHBpeGVsKSA8PCAxNikgfAotICAgICAgICAgICAgICAgKGdldEdyZWVuKHBpeGVsKSA8PCA4KSB8IGdldEJsdWUocGl4ZWwpOworICAgICAgICByZXR1cm4gKGdldEFscGhhKHBpeGVsKSA8PCAyNCkgfCAoZ2V0UmVkKHBpeGVsKSA8PCAxNikgfCAoZ2V0R3JlZW4ocGl4ZWwpIDw8IDgpCisgICAgICAgICAgICAgICAgfCBnZXRCbHVlKHBpeGVsKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTY4MSw3ICs3MTIsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHJlZCBtYXNrLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlZCBtYXNrCisgICAgICogQHJldHVybiB0aGUgcmVkIG1hc2suCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGludCBnZXRSZWRNYXNrKCkgewogICAgICAgICByZXR1cm4gY29tcG9uZW50TWFza3NbMF07CkBAIC02OTAsNyArNzIxLDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBncmVlbiBtYXNrLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGdyZWVuIG1hc2sKKyAgICAgKiBAcmV0dXJuIHRoZSBncmVlbiBtYXNrLgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0R3JlZW5NYXNrKCkgewogICAgICAgICByZXR1cm4gY29tcG9uZW50TWFza3NbMV07CkBAIC02OTksNyArNzMwLDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBibHVlIG1hc2suCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgYmx1ZSBtYXNrCisgICAgICogQHJldHVybiB0aGUgYmx1ZSBtYXNrLgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Qmx1ZU1hc2soKSB7CiAgICAgICAgIHJldHVybiBjb21wb25lbnRNYXNrc1syXTsKQEAgLTcwOCw3ICs3MzksNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGFscGhhIG1hc2suCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgYWxwaGEgbWFzaworICAgICAqIEByZXR1cm4gdGhlIGFscGhhIG1hc2suCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGludCBnZXRBbHBoYU1hc2soKSB7CiAgICAgICAgIGlmIChoYXNBbHBoYSkgewpAQCAtNzI3LDE2ICs3NTgsMTIgQEAKICAgICAgICAgaWYgKGlzX0xJTkVBUl9SR0IpIHsKICAgICAgICAgICAgIGlmIChtYXhCaXRMZW5ndGggPiA4KSB7CiAgICAgICAgICAgICAgICAgTElORUFSX1JHQl9MZW5ndGggPSAxNjsKLSAgICAgICAgICAgICAgICBmcm9tX0xJTkVBUl9SR0JfTFVUID0KLSAgICAgICAgICAgICAgICAgICAgTFVUQ29sb3JDb252ZXJ0ZXIuZ2V0RnJvbTE2bFJHQnRvc1JHQl9MVVQoKTsKLSAgICAgICAgICAgICAgICB0b19MSU5FQVJfMTZSR0JfTFVUID0KLSAgICAgICAgICAgICAgICAgICAgTFVUQ29sb3JDb252ZXJ0ZXIuZ2V0RnJvbXNSR0J0bzE2bFJHQl9MVVQoKTsKKyAgICAgICAgICAgICAgICBmcm9tX0xJTkVBUl9SR0JfTFVUID0gTFVUQ29sb3JDb252ZXJ0ZXIuZ2V0RnJvbTE2bFJHQnRvc1JHQl9MVVQoKTsKKyAgICAgICAgICAgICAgICB0b19MSU5FQVJfMTZSR0JfTFVUID0gTFVUQ29sb3JDb252ZXJ0ZXIuZ2V0RnJvbXNSR0J0bzE2bFJHQl9MVVQoKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgTElORUFSX1JHQl9MZW5ndGggPSA4OwotICAgICAgICAgICAgICAgIGZyb21fTElORUFSX1JHQl9MVVQgPQotICAgICAgICAgICAgICAgICAgICBMVVRDb2xvckNvbnZlcnRlci5nZXRGcm9tOGxSR0J0b3NSR0JfTFVUKCk7Ci0gICAgICAgICAgICAgICAgdG9fTElORUFSXzhSR0JfTFVUID0KLSAgICAgICAgICAgICAgICAgICAgTFVUQ29sb3JDb252ZXJ0ZXIuZ2V0RnJvbXNSR0J0bzhsUkdCX0xVVCgpOworICAgICAgICAgICAgICAgIGZyb21fTElORUFSX1JHQl9MVVQgPSBMVVRDb2xvckNvbnZlcnRlci5nZXRGcm9tOGxSR0J0b3NSR0JfTFVUKCk7CisgICAgICAgICAgICAgICAgdG9fTElORUFSXzhSR0JfTFVUID0gTFVUQ29sb3JDb252ZXJ0ZXIuZ2V0RnJvbXNSR0J0bzhsUkdCX0xVVCgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZkZhY3RvciA9ICgoMSA8PCBMSU5FQVJfUkdCX0xlbmd0aCkgLSAxKTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTc0Niw3ICs3NzMsNyBAQAogICAgICAgICBpZiAoaGFzQWxwaGEgJiYgYml0c1szXSAhPSA4KSB7CiAgICAgICAgICAgICBhbHBoYUxVVCA9IG5ldyBieXRlW21heFZhbHVlc1szXSArIDFdOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gbWF4VmFsdWVzWzNdOyBpKyspIHsKLSAgICAgICAgICAgICAgICBhbHBoYUxVVFtpXSA9IChieXRlKSAoc2NhbGVzWzNdICogaSArIDAuNWYpOworICAgICAgICAgICAgICAgIGFscGhhTFVUW2ldID0gKGJ5dGUpKHNjYWxlc1szXSAqIGkgKyAwLjVmKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICB9CkBAIC03NjUsNyArNzkyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yTFVUc1tpXSA9IG5ldyBieXRlW21heFZhbHVlc1tpXSArIDFdOwogICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPD0gbWF4VmFsdWVzW2ldOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvckxVVHNbaV1bal0gPSAoYnl0ZSkgKHNjYWxlc1tpXSAqIGogKyAwLjVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvckxVVHNbaV1bal0gPSAoYnl0ZSkoc2NhbGVzW2ldICogaiArIDAuNWYpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtNzg0LDkgKzgxMSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8PSBtYXhWYWx1ZXNbMF07IGorKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExJTkVBUl9SR0JfTGVuZ3RoID09IDgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gKGludCkgKHNjYWxlc1tpXSAqIGogKyAwLjVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gKGludCkoc2NhbGVzW2ldICogaiArIDAuNWYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IChpbnQpIChzY2FsZXNbaV0gKiBqICogMjU3LjBmICsgMC41Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IChpbnQpKHNjYWxlc1tpXSAqIGogKiAyNTcuMGYgKyAwLjVmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JMVVRzW2ldW2pdID0gZnJvbV9MSU5FQVJfUkdCX0xVVFtpZHhdOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNzk4LDIwICs4MjUsMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm4gUkdCIGNvbXBvbmVudCB2YWx1ZSBpZiBDb2xvciBNb2RlbCBoYXMKLSAgICAgKiBzUkdCIENvbG9yU3BhY2UuCisgICAgICogVGhpcyBtZXRob2QgcmV0dXJuIFJHQiBjb21wb25lbnQgdmFsdWUgaWYgQ29sb3IgTW9kZWwgaGFzIHNSR0IKKyAgICAgKiBDb2xvclNwYWNlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwaXhlbCAtIElOVCByZXByZXNlbnRhdGlvbiBvZiBwaXhlbAotICAgICAqIEBwYXJhbSBpZHggLSBpbmRleCBvZiBwaXhlbCBjb21wb25lbnQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIC0gdmFsdWUgb2YgdGhlIHBpeGVsIGNvbXBvbmVudCBzY2FsZWQgZnJvIDAgdG8gMjU1CisgICAgICogQHBhcmFtIHBpeGVsCisgICAgICogICAgICAgICAgICB0aGUgaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGl4ZWwuCisgICAgICogQHBhcmFtIGlkeAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBwaXhlbCBjb21wb25lbnQuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHBpeGVsIGNvbXBvbmVudCBzY2FsZWQgZnJvbSAwIHRvIDI1NS4KICAgICAgKi8KICAgICBwcml2YXRlIGludCBnZXRDb21wb25lbnRGcm9tX3NSR0IoaW50IHBpeGVsLCBpbnQgaWR4KSB7CiAgICAgICAgIGludCBjb21wID0gKHBpeGVsICYgY29tcG9uZW50TWFza3NbaWR4XSkgPj4gb2Zmc2V0c1tpZHhdOwogICAgICAgICBpZiAoaXNBbHBoYVByZW11bHRpcGxpZWQpIHsKICAgICAgICAgICAgIGludCBhbHBoYSA9IChwaXhlbCAmIGNvbXBvbmVudE1hc2tzWzNdKSA+Pj4gb2Zmc2V0c1szXTsKLSAgICAgICAgICAgIGNvbXAgPSBhbHBoYSA9PSAwID8gMCA6IChpbnQpIChzY2FsZXNbaWR4XSAqIGNvbXAgKiAyNTUuMGYgLwotICAgICAgICAgICAgICAgICAgICAoc2NhbGVzWzNdICogYWxwaGEpICsgMC41Zik7CisgICAgICAgICAgICBjb21wID0gYWxwaGEgPT0gMCA/IDAgOiAoaW50KShzY2FsZXNbaWR4XSAqIGNvbXAgKiAyNTUuMGYgLyAoc2NhbGVzWzNdICogYWxwaGEpICsgMC41Zik7CiAgICAgICAgIH0gZWxzZSBpZiAoYml0c1tpZHhdICE9IDgpIHsKICAgICAgICAgICAgIGNvbXAgPSBjb2xvckxVVHNbaWR4XVtjb21wXSAmIDB4ZmY7CiAgICAgICAgIH0KQEAgLTgxOSwyMSArODQ2LDIxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgcmV0dXJuIFJHQiBjb21wb25lbnQgdmFsdWUgaWYgQ29sb3IgTW9kZWwgaGFzCi0gICAgICogTGluZWFyIFJHQiBDb2xvclNwYWNlLgorICAgICAqIFRoaXMgbWV0aG9kIHJldHVybiBSR0IgY29tcG9uZW50IHZhbHVlIGlmIENvbG9yIE1vZGVsIGhhcyBMaW5lYXIgUkdCCisgICAgICogQ29sb3JTcGFjZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGl4ZWwgLSBJTlQgcmVwcmVzZW50YXRpb24gb2YgcGl4ZWwKLSAgICAgKiBAcGFyYW0gaWR4IC0gaW5kZXggb2YgcGl4ZWwgY29tcG9uZW50Ci0gICAgICogCi0gICAgICogQHJldHVybiAtIHZhbHVlIG9mIHRoZSBwaXhlbCBjb21wb25lbnQgc2NhbGVkIGZybyAwIHRvIDI1NQorICAgICAqIEBwYXJhbSBwaXhlbAorICAgICAqICAgICAgICAgICAgdGhlIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgdGhlIHBpeGVsLgorICAgICAqIEBwYXJhbSBpZHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgcGl4ZWwgY29tcG9uZW50LgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBwaXhlbCBjb21wb25lbnQgc2NhbGVkIGZyb20gMCB0byAyNTUuCiAgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgZ2V0Q29tcG9uZW50RnJvbV9MSU5FQVJfUkdCKGludCBwaXhlbCwgaW50IGlkeCkgewogICAgICAgICBpbnQgY29tcCA9IChwaXhlbCAmIGNvbXBvbmVudE1hc2tzW2lkeF0pID4+IG9mZnNldHNbaWR4XTsKICAgICAgICAgaWYgKGlzQWxwaGFQcmVtdWx0aXBsaWVkKSB7CiAgICAgICAgICAgICBmbG9hdCBmYWN0b3IgPSAoKDEgPDwgTElORUFSX1JHQl9MZW5ndGgpIC0gMSk7CiAgICAgICAgICAgICBpbnQgYWxwaGEgPSAocGl4ZWwgJiBjb21wb25lbnRNYXNrc1szXSkgPj4gb2Zmc2V0c1szXTsKLSAgICAgICAgICAgIGNvbXAgPSBhbHBoYSA9PSAwID8gMCA6IChpbnQpIChzY2FsZXNbaWR4XSAqIGNvbXAgKiBmYWN0b3IgLwotICAgICAgICAgICAgICAgICAgICAoc2NhbGVzWzNdICogYWxwaGEpICsgMC41Zik7CisgICAgICAgICAgICBjb21wID0gYWxwaGEgPT0gMCA/IDAgOiAoaW50KShzY2FsZXNbaWR4XSAqIGNvbXAgKiBmYWN0b3IgLyAoc2NhbGVzWzNdICogYWxwaGEpICsgMC41Zik7CiAgICAgICAgIH0gZWxzZSBpZiAoYml0c1tpZHhdICE9IExJTkVBUl9SR0JfTGVuZ3RoKSB7CiAgICAgICAgICAgICBjb21wID0gY29sb3JMVVRzW2lkeF1bY29tcF0gJiAweGZmOwogICAgICAgICB9IGVsc2UgewpAQCAtODQzLDIwICs4NzAsMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm4gUkdCIGNvbXBvbmVudCB2YWx1ZSBpZiBDb2xvciBNb2RlbCBoYXMKLSAgICAgKiBhcmJpdHJhcnkgUkdCIENvbG9yU2FwY2UuCisgICAgICogVGhpcyBtZXRob2QgcmV0dXJuIFJHQiBjb21wb25lbnQgdmFsdWUgaWYgQ29sb3IgTW9kZWwgaGFzIGFyYml0cmFyeSBSR0IKKyAgICAgKiBDb2xvclNhcGNlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwaXhlbCAtIElOVCByZXByZXNlbnRhdGlvbiBvZiBwaXhlbAotICAgICAqIEBwYXJhbSBpZHggLSBpbmRleCBvZiBwaXhlbCBjb21wb25lbnQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIC0gdmFsdWUgb2YgdGhlIHBpeGVsIGNvbXBvbmVudCBzY2FsZWQgZnJvIDAgdG8gMjU1CisgICAgICogQHBhcmFtIHBpeGVsCisgICAgICogICAgICAgICAgICB0aGUgaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGl4ZWwuCisgICAgICogQHBhcmFtIGlkeAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBwaXhlbCBjb21wb25lbnQuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHBpeGVsIGNvbXBvbmVudCBzY2FsZWQgZnJvbSAwIHRvIDI1NS4KICAgICAgKi8KICAgICBwcml2YXRlIGludCBnZXRDb21wb25lbnRGcm9tX1JHQihpbnQgcGl4ZWwsIGludCBpZHgpIHsKICAgICAgICAgaW50IGNvbXBvbmVudHNbXSA9IGdldENvbXBvbmVudHMocGl4ZWwsIG51bGwsIDApOwogICAgICAgICBmbG9hdFtdIG5vcm1Db21wb25lbnRzID0gZ2V0Tm9ybWFsaXplZENvbXBvbmVudHMoY29tcG9uZW50cywgMCwgbnVsbCwgMCk7CiAgICAgICAgIGZsb2F0W10gc1JHQmNvbXBvbmVudHMgPSBjcy50b1JHQihub3JtQ29tcG9uZW50cyk7Ci0gICAgICAgIHJldHVybiAoaW50KSAoc1JHQmNvbXBvbmVudHNbaWR4XSAqIDI1NS4wZiArIDAuNWYpOworICAgICAgICByZXR1cm4gKGludCkoc1JHQmNvbXBvbmVudHNbaWR4XSAqIDI1NS4wZiArIDAuNWYpOwogICAgIH0KIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvRmlsdGVyZWRJbWFnZVNvdXJjZS5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL0ZpbHRlcmVkSW1hZ2VTb3VyY2UuamF2YQppbmRleCA2YTQxZmE3Li5lZDg1NThkIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvRmlsdGVyZWRJbWFnZVNvdXJjZS5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9GaWx0ZXJlZEltYWdlU291cmNlLmphdmEKQEAgLTE4LDMyICsxOCw0MiBAQAogICogQGF1dGhvciBJZ29yIFYuIFN0b2x5YXJvdgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuaW1hZ2U7CiAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwogCi0KIC8qKgotICogVGhlIEZpbHRlcmVkSW1hZ2VTb3VyY2UgY2xhc3MgaXMgdXNlZCBmb3IgcHJvZHVjaW5nIGltYWdlIGRhdGEgZm9yIGEgbmV3IAotICogZmlsdGVyZWQgdmVyc2lvbiBvZiB0aGUgb3JpZ2luYWwgaW1hZ2UgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWx0ZXIgb2JqZWN0LiAKKyAqIFRoZSBGaWx0ZXJlZEltYWdlU291cmNlIGNsYXNzIGlzIHVzZWQgZm9yIHByb2R1Y2luZyBpbWFnZSBkYXRhIGZvciBhIG5ldworICogZmlsdGVyZWQgdmVyc2lvbiBvZiB0aGUgb3JpZ2luYWwgaW1hZ2UgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWx0ZXIgb2JqZWN0LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEZpbHRlcmVkSW1hZ2VTb3VyY2UgaW1wbGVtZW50cyBJbWFnZVByb2R1Y2VyIHsKIAotICAgIC8qKiBUaGUgc291cmNlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBzb3VyY2UuCisgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBJbWFnZVByb2R1Y2VyIHNvdXJjZTsKLSAgICAKLSAgICAvKiogVGhlIGZpbHRlci4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBmaWx0ZXIuCisgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBJbWFnZUZpbHRlciBmaWx0ZXI7CiAKLSAgICAvKiogVGhlIGNvbnMgdGFibGUuICovCisgICAgLyoqCisgICAgICogVGhlIGNvbnMgdGFibGUuCisgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBIYXNodGFibGU8SW1hZ2VDb25zdW1lciwgSW1hZ2VDb25zdW1lcj4gY29uc1RhYmxlID0gbmV3IEhhc2h0YWJsZTxJbWFnZUNvbnN1bWVyLCBJbWFnZUNvbnN1bWVyPigpOwogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEZpbHRlcmVkSW1hZ2VTb3VyY2Ugb2JqZWN0IHdpdGggCi0gICAgICogdGhlIHNwZWNpZmllZCBJbWFnZVByb2R1Y2VyIGFuZCB0aGUgSW1hZ2VGaWx0ZXIgb2JqZWN0cy4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgRmlsdGVyZWRJbWFnZVNvdXJjZSBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogSW1hZ2VQcm9kdWNlciBhbmQgdGhlIEltYWdlRmlsdGVyIG9iamVjdHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIG9yaWcgdGhlIHNwZWNpZmllZCBJbWFnZVByb2R1Y2VyLgotICAgICAqIEBwYXJhbSBpbWdmIHRoZSBzcGVjaWZpZWQgSW1hZ2VGaWx0ZXIuCisgICAgICogQHBhcmFtIG9yaWcKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgSW1hZ2VQcm9kdWNlci4KKyAgICAgKiBAcGFyYW0gaW1nZgorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBJbWFnZUZpbHRlci4KICAgICAgKi8KICAgICBwdWJsaWMgRmlsdGVyZWRJbWFnZVNvdXJjZShJbWFnZVByb2R1Y2VyIG9yaWcsIEltYWdlRmlsdGVyIGltZ2YpIHsKICAgICAgICAgc291cmNlID0gb3JpZzsKQEAgLTUxLDcgKzYxLDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNDb25zdW1lcihJbWFnZUNvbnN1bWVyIGljKSB7Ci0gICAgICAgIGlmKGljICE9IG51bGwpIHsKKyAgICAgICAgaWYgKGljICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBjb25zVGFibGUuY29udGFpbnNLZXkoaWMpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTY0LDE0ICs3NCwxNCBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RUb3BEb3duTGVmdFJpZ2h0UmVzZW5kKEltYWdlQ29uc3VtZXIgaWMpIHsKLSAgICAgICAgaWYoaWMgIT0gbnVsbCAmJiBpc0NvbnN1bWVyKGljKSl7Ci0gICAgICAgICAgICBJbWFnZUZpbHRlciBmaWMgPSAoSW1hZ2VGaWx0ZXIpIGNvbnNUYWJsZS5nZXQoaWMpOworICAgICAgICBpZiAoaWMgIT0gbnVsbCAmJiBpc0NvbnN1bWVyKGljKSkgeworICAgICAgICAgICAgSW1hZ2VGaWx0ZXIgZmljID0gKEltYWdlRmlsdGVyKWNvbnNUYWJsZS5nZXQoaWMpOwogICAgICAgICAgICAgZmljLnJlc2VuZFRvcERvd25MZWZ0UmlnaHQoc291cmNlKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVDb25zdW1lcihJbWFnZUNvbnN1bWVyIGljKSB7Ci0gICAgICAgIGlmKGljICE9IG51bGwgJiYgaXNDb25zdW1lcihpYykpeworICAgICAgICBpZiAoaWMgIT0gbnVsbCAmJiBpc0NvbnN1bWVyKGljKSkgewogICAgICAgICAgICAgSW1hZ2VDb25zdW1lciBmaWMgPSBjb25zVGFibGUuZ2V0KGljKTsKICAgICAgICAgICAgIHNvdXJjZS5yZW1vdmVDb25zdW1lcihmaWMpOwogICAgICAgICAgICAgY29uc1RhYmxlLnJlbW92ZShpYyk7CkBAIC03OSw3ICs4OSw3IEBACiAgICAgfQogCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZENvbnN1bWVyKEltYWdlQ29uc3VtZXIgaWMpIHsKLSAgICAgICAgaWYoaWMgIT0gbnVsbCAmJiAhaXNDb25zdW1lcihpYykpeworICAgICAgICBpZiAoaWMgIT0gbnVsbCAmJiAhaXNDb25zdW1lcihpYykpIHsKICAgICAgICAgICAgIEltYWdlQ29uc3VtZXIgZmljID0gZmlsdGVyLmdldEZpbHRlckluc3RhbmNlKGljKTsKICAgICAgICAgICAgIHNvdXJjZS5hZGRDb25zdW1lcihmaWMpOwogICAgICAgICAgICAgY29uc1RhYmxlLnB1dChpYywgZmljKTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9JbWFnZUNvbnN1bWVyLmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvSW1hZ2VDb25zdW1lci5qYXZhCmluZGV4IDJlYmEyOTAuLmNhZjg3ZDEgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbWFnZS9JbWFnZUNvbnN1bWVyLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL0ltYWdlQ29uc3VtZXIuamF2YQpAQCAtMTgsMTQ4ICsxOCwxNjggQEAKICAqIEBhdXRob3IgSWdvciBWLiBTdG9seWFyb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmltYWdlOwogCiBpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKIAogLyoqCi0gKiBUaGUgSW1hZ2VDb25zdW1lciBpbnRlcmZhY2UgcHJvdmlkZXMgdGhlIGRhdGEgYWJvdXQgdGhlIGltYWdlCi0gKiBhbmQgYWJvdXQgaG93IGl0cyBkYXRhIGlzIGRlbGl2ZXJlZC4gIEEgSW1hZ2VQcm9kdWNlciBwcm92aWRlcyAKLSAqIGFsbCBvZiB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGltYWdlIHVzaW5nIAotICogdGhlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGlzIGludGVyZmFjZS4KKyAqIFRoZSBJbWFnZUNvbnN1bWVyIGludGVyZmFjZSBwcm92aWRlcyB0aGUgZGF0YSBhYm91dCB0aGUgaW1hZ2UgYW5kIGFib3V0IGhvdworICogaXRzIGRhdGEgaXMgZGVsaXZlcmVkLiBBIEltYWdlUHJvZHVjZXIgcHJvdmlkZXMgYWxsIG9mIHRoZSBpbmZvcm1hdGlvbiBhYm91dAorICogdGhlIGltYWdlIHVzaW5nIHRoZSBtZXRob2RzIGRlZmluZWQgaW4gdGhpcyBpbnRlcmZhY2UuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIEltYWdlQ29uc3VtZXIgewogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBSQU5ET01QSVhFTE9SREVSIGluZGljYXRlcyB0aGF0IHRoZSBwaXhlbHMgYXJlIAotICAgICAqIGRlbGl2ZXJlZCBpbiBhIHJhbmRvbSBvcmRlci4KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgUkFORE9NUElYRUxPUkRFUiBpbmRpY2F0ZXMgdGhhdCB0aGUgcGl4ZWxzIGFyZSBkZWxpdmVyZWQgaW4KKyAgICAgKiBhIHJhbmRvbSBvcmRlci4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSQU5ET01QSVhFTE9SREVSID0gMTsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgVE9QRE9XTkxFRlRSSUdIVCBpbmRpY2F0ZXMgdGhhdCB0aGUgcGl4ZWxzIGFyZSAKLSAgICAgKiBkZWxpdmVyZWQgaW4gdG9wLWRvd24sIGxlZnQtdG8tcmlnaHQgb3JkZXIuIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBUT1BET1dOTEVGVFJJR0hUIGluZGljYXRlcyB0aGF0IHRoZSBwaXhlbHMgYXJlIGRlbGl2ZXJlZCBpbgorICAgICAqIHRvcC1kb3duLCBsZWZ0LXRvLXJpZ2h0IG9yZGVyLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPUERPV05MRUZUUklHSFQgPSAyOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBDT01QTEVURVNDQU5MSU5FUyBpbmRpY2F0ZXMgdGhhdCB0aGUgcGl4ZWxzIGFyZQotICAgICAqIGRlbGl2ZXJlZCBpbiBjb21wbGV0ZSBzY2FubGluZS4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IENPTVBMRVRFU0NBTkxJTkVTIGluZGljYXRlcyB0aGF0IHRoZSBwaXhlbHMgYXJlIGRlbGl2ZXJlZCBpbgorICAgICAqIGNvbXBsZXRlIHNjYW5saW5lLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBMRVRFU0NBTkxJTkVTID0gNDsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgU0lOR0xFUEFTUyBpbmRpY2F0ZXMgdGhhdCBwaXhlbHMgYXJlIGRlbGl2ZXJlZCAKLSAgICAgKiBpbiBhIHNpbmdsZSBwYXNzLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgU0lOR0xFUEFTUyBpbmRpY2F0ZXMgdGhhdCBwaXhlbHMgYXJlIGRlbGl2ZXJlZCBpbiBhIHNpbmdsZQorICAgICAqIHBhc3MuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lOR0xFUEFTUyA9IDg7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFNJTkdMRUZSQU1FIGluZGljYXRlcyB0aGF0IGltYWdlIGNvbnNpc3RzIG9mCi0gICAgICogc2luZ2xlIGZyYW1lLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBTSU5HTEVGUkFNRSBpbmRpY2F0ZXMgdGhhdCBpbWFnZSBjb25zaXN0cyBvZiBzaW5nbGUgZnJhbWUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lOR0xFRlJBTUUgPSAxNjsKIAotICAgIC8qKiAKKyAgICAvKioKICAgICAgKiBUaGUgQ29uc3RhbnQgSU1BR0VFUlJPUiBpbmRpY2F0ZXMgYW4gaW1hZ2UgZXJyb3IgZHVyaW5nIGltYWdlIHByb2R1Y2luZy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTUFHRUVSUk9SID0gMTsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgU0lOR0xFRlJBTUVET05FIGluZGljYXRlcyB0aGF0IG9ubHkgb25lIG9mIHRoZSAKLSAgICAgKiBpbWFnZSdzIGZyYW1lcyBpcyBjb21wbGV0ZWQuIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBTSU5HTEVGUkFNRURPTkUgaW5kaWNhdGVzIHRoYXQgb25seSBvbmUgb2YgdGhlIGltYWdlJ3MKKyAgICAgKiBmcmFtZXMgaXMgY29tcGxldGVkLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJTkdMRUZSQU1FRE9ORSA9IDI7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IFNUQVRJQ0lNQUdFRE9ORSBpbmRpY2F0ZXMgdGhhdCB0aGUgaW1hZ2UgaXMgY29tcGxldGVkLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgU1RBVElDSU1BR0VET05FIGluZGljYXRlcyB0aGF0IHRoZSBpbWFnZSBpcyBjb21wbGV0ZWQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVElDSU1BR0VET05FID0gMzsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgSU1BR0VBQk9SVEVEIGluZGljYXRlcyB0aGF0IHRoZSBpbWFnZSBwcm9kdWNpbmcgCi0gICAgICogcHJvY2VzcyBpcyBhYm9ydGVkLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgSU1BR0VBQk9SVEVEIGluZGljYXRlcyB0aGF0IHRoZSBpbWFnZSBwcm9kdWNpbmcgcHJvY2VzcyBpcworICAgICAqIGFib3J0ZWQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU1BR0VBQk9SVEVEID0gNDsKIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBpbWFnZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBJbWFnZUNvbnN1bWVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wcyB0aGUgcHJvcGVydGllcyBmb3IgdGhlIGltYWdlIGFzc29jaWF0ZWQgd2l0aCAKLSAgICAgKiB0aGlzIEltYWdlQ29uc3VtZXIuCisgICAgICogQHBhcmFtIHByb3BzCisgICAgICogICAgICAgICAgICB0aGUgcHJvcGVydGllcyBmb3IgdGhlIGltYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgICAgICogICAgICAgICAgICBJbWFnZUNvbnN1bWVyLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXMoSGFzaHRhYmxlPD8sID8+IHByb3BzKTsKIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIENvbG9yTW9kZWwgb2JqZWN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBtb2RlbCB0aGUgbmV3IENvbG9yTW9kZWwuCisgICAgICogQHBhcmFtIG1vZGVsCisgICAgICogICAgICAgICAgICB0aGUgbmV3IENvbG9yTW9kZWwuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q29sb3JNb2RlbChDb2xvck1vZGVsIG1vZGVsKTsKIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHBpeGVscyBmb3IgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhciBhcmVhIG9mIHRoZSBpbWFnZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHJlY3Rhbmd1bGFyIGFyZWEuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiByZWN0YW5ndWxhciBhcmVhLgotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiByZWN0YW5ndWxhciBhcmVhLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgcmVjdGFuZ3VsYXIgYXJlYS4KLSAgICAgKiBAcGFyYW0gbW9kZWwgdGhlIHNwZWNpZmllZCBDb2xvck1vZGVsIHRvIGJlIHVzZWQgZm9yIHBpeGVscwotICAgICAqIGNvbnZlcnRpbmcuICAKLSAgICAgKiBAcGFyYW0gcGl4ZWxzIHRoZSBhcnJheSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIG9mZiB0aGUgb2Zmc2V0IG9mIHBpeGVscyBhcnJheS4KLSAgICAgKiBAcGFyYW0gc2NhbnNpemUgdGhlIGRpc3RhbmNlIGZyb20gdGhlIG9uZSByb3cgb2YgcGl4ZWxzCi0gICAgICogdG8gdGhlIG5leHQgcm93IGluIHRoZSBzcGVjaWZpZWQgYXJyYXkuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgcmVjdGFuZ3VsYXIgYXJlYS4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiByZWN0YW5ndWxhciBhcmVhLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgcmVjdGFuZ3VsYXIgYXJlYS4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiByZWN0YW5ndWxhciBhcmVhLgorICAgICAqIEBwYXJhbSBtb2RlbAorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBDb2xvck1vZGVsIHRvIGJlIHVzZWQgZm9yIHBpeGVscyBjb252ZXJ0aW5nLgorICAgICAqIEBwYXJhbSBwaXhlbHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIG9mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiBwaXhlbHMgYXJyYXkuCisgICAgICogQHBhcmFtIHNjYW5zaXplCisgICAgICogICAgICAgICAgICB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgb25lIHJvdyBvZiBwaXhlbHMgdG8gdGhlIG5leHQgcm93IGluIHRoZQorICAgICAqICAgICAgICAgICAgc3BlY2lmaWVkIGFycmF5LgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgQ29sb3JNb2RlbCBtb2RlbCwKLSAgICAgICAgICAgIGludFtdIHBpeGVscywgaW50IG9mZiwgaW50IHNjYW5zaXplKTsKKyAgICBwdWJsaWMgdm9pZCBzZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIENvbG9yTW9kZWwgbW9kZWwsIGludFtdIHBpeGVscywgaW50IG9mZiwKKyAgICAgICAgICAgIGludCBzY2Fuc2l6ZSk7CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBwaXhlbHMgZm9yIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIgYXJlYSBvZiB0aGUgaW1hZ2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiByZWN0YW5ndWxhciBhcmVhLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgcmVjdGFuZ3VsYXIgYXJlYS4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgcmVjdGFuZ3VsYXIgYXJlYS4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHJlY3Rhbmd1bGFyIGFyZWEuCi0gICAgICogQHBhcmFtIG1vZGVsIHRoZSBzcGVjaWZpZWQgQ29sb3JNb2RlbCB0byBiZSB1c2VkIGZvciBwaXhlbHMKLSAgICAgKiBjb252ZXJ0aW5nLiAgCi0gICAgICogQHBhcmFtIHBpeGVscyB0aGUgYXJyYXkgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSBvZmYgdGhlIG9mZnNldCBvZiBwaXhlbHMgYXJyYXkuCi0gICAgICogQHBhcmFtIHNjYW5zaXplIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBvbmUgcm93IG9mIHBpeGVscwotICAgICAqIHRvIHRoZSBuZXh0IHJvdyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHJlY3Rhbmd1bGFyIGFyZWEuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgcmVjdGFuZ3VsYXIgYXJlYS4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHJlY3Rhbmd1bGFyIGFyZWEuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgcmVjdGFuZ3VsYXIgYXJlYS4KKyAgICAgKiBAcGFyYW0gbW9kZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgQ29sb3JNb2RlbCB0byBiZSB1c2VkIGZvciBwaXhlbHMgY29udmVydGluZy4KKyAgICAgKiBAcGFyYW0gcGl4ZWxzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBvZmYKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgcGl4ZWxzIGFycmF5LgorICAgICAqIEBwYXJhbSBzY2Fuc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIGRpc3RhbmNlIGZyb20gdGhlIG9uZSByb3cgb2YgcGl4ZWxzIHRvIHRoZSBuZXh0IHJvdyBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgIHNwZWNpZmllZCBhcnJheS4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIENvbG9yTW9kZWwgbW9kZWwsCi0gICAgICAgICAgICBieXRlW10gcGl4ZWxzLCBpbnQgb2ZmLCBpbnQgc2NhbnNpemUpOworICAgIHB1YmxpYyB2b2lkIHNldFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgQ29sb3JNb2RlbCBtb2RlbCwgYnl0ZVtdIHBpeGVscywgaW50IG9mZiwKKyAgICAgICAgICAgIGludCBzY2Fuc2l6ZSk7CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBkaW1lbnNpb25zIG9mIGEgc291cmNlIGltYWdlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIGltYWdlLgotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGltYWdlLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERpbWVuc2lvbnMoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGhpbnQgZmxhZ3Mgb2YgcGl4ZWxzIG9yZGVyLCB3aGljaCBpcyB1c2VkIGJ5IAotICAgICAqIHRoZSBJbWFnZUNvbnN1bWVyIGZvciBvYnRhaW5pbmcgcGl4ZWxzIGZyb20gdGhlIEltYWdlUHJvZHVjZXIKLSAgICAgKiBmb3Igd2hpY2ggdGhpcyBJbWFnZUNvbnN1bWVyIGlzIGFkZGVkLgorICAgICAqIFNldHMgdGhlIGhpbnQgZmxhZ3Mgb2YgcGl4ZWxzIG9yZGVyLCB3aGljaCBpcyB1c2VkIGJ5IHRoZSBJbWFnZUNvbnN1bWVyCisgICAgICogZm9yIG9idGFpbmluZyBwaXhlbHMgZnJvbSB0aGUgSW1hZ2VQcm9kdWNlciBmb3Igd2hpY2ggdGhpcyBJbWFnZUNvbnN1bWVyCisgICAgICogaXMgYWRkZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGhpbnRmbGFncyB0aGUgbWFzayBvZiBoaW50IGZsYWdzLiAKKyAgICAgKiBAcGFyYW0gaGludGZsYWdzCisgICAgICogICAgICAgICAgICB0aGUgbWFzayBvZiBoaW50IGZsYWdzLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEhpbnRzKGludCBoaW50ZmxhZ3MpOwogCiAgICAgLyoqCiAgICAgICogVEhpcyBtZXRob2QgaXMgY2FsbGVkIGluIHRoZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlczoKICAgICAgKiA8dWw+Ci0gICAgICogPGxpPlRoZSBJbWFnZVByb2R1Y2VyIChmb3Igd2hpY2ggdGhpcyBJbWFnZUNvbnN1bWVyIGlzIGFkZGVkKSAKLSAgICAgKiBoYXMgYmVlbiBkZWxpdmVyZWQgYWxsIHBpeGVscyBvZiB0aGUgc291cmNlIGltYWdlLiA8L2xpPgotICAgICAqIDxsaT5BIG9uZSBmcmFtZSBvZiBhbiBhbmltYXRpb24gaGFzIGJlZW4gY29tcGxldGVkLiA8L2xpPiAKLSAgICAgKiA8bGk+IEFuIGVycm9yIHdoaWxlIGxvYWRpbmcgb3IgcHJvZHVjaW5nIG9mIHRoZSBpbWFnZSBoYXMgb2NjdXJlZC4KLSAgICAgKiA8L3VsPiAKKyAgICAgKiA8bGk+VGhlIEltYWdlUHJvZHVjZXIgKGZvciB3aGljaCB0aGlzIEltYWdlQ29uc3VtZXIgaXMgYWRkZWQpIGhhcyBiZWVuCisgICAgICogZGVsaXZlcmVkIGFsbCBwaXhlbHMgb2YgdGhlIHNvdXJjZSBpbWFnZS48L2xpPgorICAgICAqIDxsaT5BIG9uZSBmcmFtZSBvZiBhbiBhbmltYXRpb24gaGFzIGJlZW4gY29tcGxldGVkLjwvbGk+CisgICAgICogPGxpPkFuIGVycm9yIHdoaWxlIGxvYWRpbmcgb3IgcHJvZHVjaW5nIG9mIHRoZSBpbWFnZSBoYXMgb2NjdXJyZWQuCisgICAgICogPC91bD4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RhdHVzIHRoZSBzdGF0dXMgb2YgaW1hZ2UgcHJvZHVjaW5nLgorICAgICAqIEBwYXJhbSBzdGF0dXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGF0dXMgb2YgaW1hZ2UgcHJvZHVjaW5nLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGltYWdlQ29tcGxldGUoaW50IHN0YXR1cyk7CiAKIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL0ltYWdlRmlsdGVyLmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvSW1hZ2VGaWx0ZXIuamF2YQppbmRleCBlMzg2ZDY1Li5kMmM5ZjUwIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvSW1hZ2VGaWx0ZXIuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvSW1hZ2VGaWx0ZXIuamF2YQpAQCAtMTgsMTcgKzE4LDIyIEBACiAgKiBAYXV0aG9yIElnb3IgVi4gU3RvbHlhcm92CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5pbWFnZTsKIAogaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CiAKIC8qKgotICogVGhlIEltYWdlRmlsdGVyIGNsYXNzIHByb3ZpZGVzIGEgZmlsdGVyIGZvciBkZWxpdmVyaW5nIGltYWdlIGRhdGEgCi0gKiBmcm9tIGFuIEltYWdlUHJvZHVjZXIgdG8gYW4gSW1hZ2VDb25zdW1lci4KKyAqIFRoZSBJbWFnZUZpbHRlciBjbGFzcyBwcm92aWRlcyBhIGZpbHRlciBmb3IgZGVsaXZlcmluZyBpbWFnZSBkYXRhIGZyb20gYW4KKyAqIEltYWdlUHJvZHVjZXIgdG8gYW4gSW1hZ2VDb25zdW1lci4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBJbWFnZUZpbHRlciBpbXBsZW1lbnRzIEltYWdlQ29uc3VtZXIsIENsb25lYWJsZSB7CiAKLSAgICAvKiogVGhlIGNvbnN1bWVyLiAqLworICAgIC8qKgorICAgICAqIFRoZSBjb25zdW1lci4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgSW1hZ2VDb25zdW1lciBjb25zdW1lcjsKIAogICAgIC8qKgpAQCAtMzksMTYgKzQ0LDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbiBpbnN0YW5jZSBvZiBhbiBJbWFnZUZpbHRlciBvYmplY3Qgd2hpY2ggcGVyZm9ybXMKLSAgICAgKiB0aGUgZmlsdGVyaW5nIGZvciB0aGUgc3BlY2lmaWVkIEltYWdlQ29uc3VtZXIuCi0gICAgICogIAotICAgICAqIEBwYXJhbSBpYyB0aGUgc3BlY2lmaWVkIEltYWdlQ29uc3VtZXIuCisgICAgICogR2V0cyBhbiBpbnN0YW5jZSBvZiBhbiBJbWFnZUZpbHRlciBvYmplY3Qgd2hpY2ggcGVyZm9ybXMgdGhlIGZpbHRlcmluZworICAgICAqIGZvciB0aGUgc3BlY2lmaWVkIEltYWdlQ29uc3VtZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiBhbiBJbWFnZUZpbHRlciB1c2VkIHRvIHBlcmZvcm0gdGhlIGZpbHRlcmluZyBmb3IgCi0gICAgICogdGhlIHNwZWNpZmllZCBJbWFnZUNvbnN1bWVyLgorICAgICAqIEBwYXJhbSBpYworICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBJbWFnZUNvbnN1bWVyLgorICAgICAqIEByZXR1cm4gYW4gSW1hZ2VGaWx0ZXIgdXNlZCB0byBwZXJmb3JtIHRoZSBmaWx0ZXJpbmcgZm9yIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgIEltYWdlQ29uc3VtZXIuCiAgICAgICovCiAgICAgcHVibGljIEltYWdlRmlsdGVyIGdldEZpbHRlckluc3RhbmNlKEltYWdlQ29uc3VtZXIgaWMpIHsKLSAgICAgICAgSW1hZ2VGaWx0ZXIgZmlsdGVyID0gKEltYWdlRmlsdGVyKSBjbG9uZSgpOworICAgICAgICBJbWFnZUZpbHRlciBmaWx0ZXIgPSAoSW1hZ2VGaWx0ZXIpY2xvbmUoKTsKICAgICAgICAgZmlsdGVyLmNvbnN1bWVyID0gaWM7CiAgICAgICAgIHJldHVybiBmaWx0ZXI7CiAgICAgfQpAQCAtNTksMTQgKzY0LDE0IEBACiAgICAgICAgIGlmIChwcm9wcyA9PSBudWxsKSB7CiAgICAgICAgICAgICBmcHJvcHMgPSBuZXcgSGFzaHRhYmxlPE9iamVjdCwgT2JqZWN0PigpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZnByb3BzID0gKEhhc2h0YWJsZTxPYmplY3QsIE9iamVjdD4pIHByb3BzLmNsb25lKCk7CisgICAgICAgICAgICBmcHJvcHMgPSAoSGFzaHRhYmxlPE9iamVjdCwgT2JqZWN0Pilwcm9wcy5jbG9uZSgpOwogICAgICAgICB9CiAgICAgICAgIFN0cmluZyBwcm9wTmFtZSA9ICJGaWx0ZXJzIjsgLy8kTk9OLU5MUy0xJAogICAgICAgICBTdHJpbmcgcHJvcCA9ICJOdWxsIGZpbHRlciI7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgT2JqZWN0IG8gPSBmcHJvcHMuZ2V0KHByb3BOYW1lKTsKICAgICAgICAgaWYgKG8gIT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICBwcm9wID0gKFN0cmluZykgbyArICI7ICIgKyBwcm9wOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgcHJvcCA9IChTdHJpbmcpbyArICI7ICIgKyBwcm9wOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHByb3AgPSBvLnRvU3RyaW5nKCkgKyAiOyAiICsgcHJvcDsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgfQpAQCAtOTAsMTEgKzk1LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVzcG9uZHMgdG8gYSByZXF1ZXN0IGZvciBhIFRvcC1Eb3duLUxlZnQtUmlnaHQgb3JkZXJlZCAKLSAgICAgKiByZXNlbmQgb2YgdGhlIHBpeGVsIGRhdGEgZnJvbSBhbiBJbWFnZUNvbnN1bWVyLiAKKyAgICAgKiBSZXNwb25kcyB0byBhIHJlcXVlc3QgZm9yIGEgVG9wLURvd24tTGVmdC1SaWdodCBvcmRlcmVkIHJlc2VuZCBvZiB0aGUKKyAgICAgKiBwaXhlbCBkYXRhIGZyb20gYW4gSW1hZ2VDb25zdW1lci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaXAgdGhlIEltYWdlUHJvZHVjZXIgdGhhdCBwcm92aWRlcyB0aGlzIGluc3RhbmNlIG9mIAotICAgICAqIHRoZSBmaWx0ZXIuCisgICAgICogQHBhcmFtIGlwCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VQcm9kdWNlciB0aGF0IHByb3ZpZGVzIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIGZpbHRlci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZXNlbmRUb3BEb3duTGVmdFJpZ2h0KEltYWdlUHJvZHVjZXIgaXApIHsKICAgICAgICAgaXAucmVxdWVzdFRvcERvd25MZWZ0UmlnaHRSZXNlbmQodGhpcyk7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvSW1hZ2VPYnNlcnZlci5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL0ltYWdlT2JzZXJ2ZXIuamF2YQppbmRleCA0MThiZDA3Li4yMWVjNDFiIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvSW1hZ2VPYnNlcnZlci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9JbWFnZU9ic2VydmVyLmphdmEKQEAgLTE4LDgyICsxOCw4NCBAQAogICogQGF1dGhvciBJZ29yIFYuIFN0b2x5YXJvdgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuaW1hZ2U7CiAKIGltcG9ydCBqYXZhLmF3dC5JbWFnZTsKIAogLyoqCi0gKiB0aGUgSW1hZ2VPYnNlcnZlciBpbnRlcmZhY2UgaXMgYW4gYXN5bmNocm9ub3VzIHVwZGF0ZSBpbnRlcmZhY2UgCi0gKiBmb3IgcmVjZWl2aW5nIG5vdGlmaWNhdGlvbnMgYWJvdXQgSW1hZ2UgY29uc3RydWN0aW9uIHN0YXR1cy4KKyAqIHRoZSBJbWFnZU9ic2VydmVyIGludGVyZmFjZSBpcyBhbiBhc3luY2hyb25vdXMgdXBkYXRlIGludGVyZmFjZSBmb3IgcmVjZWl2aW5nCisgKiBub3RpZmljYXRpb25zIGFib3V0IEltYWdlIGNvbnN0cnVjdGlvbiBzdGF0dXMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIEltYWdlT2JzZXJ2ZXIgewogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBXSURUSCBpbmRpY2F0ZXMgdGhhdCB0aGUgd2lkdGggb2YgdGhlIGltYWdlIGlzIAotICAgICAqIGF2YWlsYWJsZS4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFdJRFRIIGluZGljYXRlcyB0aGF0IHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UgaXMgYXZhaWxhYmxlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJRFRIID0gMTsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgSEVJR0hUIGluZGljYXRlcyB0aGF0IHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UgaXMgCi0gICAgICogYXZhaWxhYmxlLgorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBIRUlHSFQgaW5kaWNhdGVzIHRoYXQgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBpcyBhdmFpbGFibGUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEVJR0hUID0gMjsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgUFJPUEVSVElFUyBpbmRpY2F0ZXMgdGhhdCB0aGUgcHJvcGVydGllcyBvZiB0aGUgaW1hZ2UKLSAgICAgKiBhcmUgYXZhaWxhYmxlLiAKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgUFJPUEVSVElFUyBpbmRpY2F0ZXMgdGhhdCB0aGUgcHJvcGVydGllcyBvZiB0aGUgaW1hZ2UgYXJlCisgICAgICogYXZhaWxhYmxlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRJRVMgPSA0OwogCiAgICAgLyoqCi0gICAgICogIFRoZSBDb25zdGFudCBTT01FQklUUyBpbmRpY2F0ZXMgdGhhdCBtb3JlIGJpdHMgbmVlZGVkIGZvciAKLSAgICAgKiAgZHJhd2luZyBhIHNjYWxlZCB2YXJpYXRpb24gb2YgdGhlIGltYWdlIHBpeGVscyBhcmUgYXZhaWxhYmxlLgorICAgICAqIFRoZSBDb25zdGFudCBTT01FQklUUyBpbmRpY2F0ZXMgdGhhdCBtb3JlIGJpdHMgbmVlZGVkIGZvciBkcmF3aW5nIGEKKyAgICAgKiBzY2FsZWQgdmFyaWF0aW9uIG9mIHRoZSBpbWFnZSBwaXhlbHMgYXJlIGF2YWlsYWJsZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT01FQklUUyA9IDg7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IEZSQU1FQklUUyBpbmRpY2F0ZXMgdGhhdCBjb21wbGV0ZSBmcmFtZSBvZiAKLSAgICAgKiBhIGltYWdlIHdoaWNoIHdhcyBwcmV2aW91c2x5IGRyYXduIGlzIG5vdyBhdmFpbGFibGUKLSAgICAgKiBmb3IgZHJhd2luZyBhZ2Fpbi4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEZSQU1FQklUUyBpbmRpY2F0ZXMgdGhhdCBjb21wbGV0ZSBmcmFtZSBvZiBhIGltYWdlIHdoaWNoIHdhcworICAgICAqIHByZXZpb3VzbHkgZHJhd24gaXMgbm93IGF2YWlsYWJsZSBmb3IgZHJhd2luZyBhZ2Fpbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGUkFNRUJJVFMgPSAxNjsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgQUxMQklUUyBpbmRpY2F0ZXMgdGhhdCBhbiBpbWFnZSB3aGljaCAKLSAgICAgKiB3YXMgcHJldmlvdXNseSBkcmF3biBpcyBub3cgY29tcGxldGUgYW5kIGNhbiBiZSBkcmF3biBhZ2Fpbi4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEFMTEJJVFMgaW5kaWNhdGVzIHRoYXQgYW4gaW1hZ2Ugd2hpY2ggd2FzIHByZXZpb3VzbHkgZHJhd24KKyAgICAgKiBpcyBub3cgY29tcGxldGUgYW5kIGNhbiBiZSBkcmF3biBhZ2Fpbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTExCSVRTID0gMzI7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IEVSUk9SIGluZGljYXRlcyB0aGF0IGVycm9yIG9jY3VyZWQuIAorICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBFUlJPUiBpbmRpY2F0ZXMgdGhhdCBlcnJvciBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IDY0OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBBQk9SVCBpbmRpY2F0ZXMgdGhhdCB0aGUgaW1hZ2UgcHJvZHVjaW5nIGlzIAotICAgICAqIGFib3J0ZWQuCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IEFCT1JUIGluZGljYXRlcyB0aGF0IHRoZSBpbWFnZSBwcm9kdWNpbmcgaXMgYWJvcnRlZC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQk9SVCA9IDEyODsKIAogICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGluZm9ybWF0aW9uIGFib3V0IGFuIEltYWdlCi0gICAgICogaW50ZXJmYWNlIGJlY29tZXMgYXZhaWxhYmxlLiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgCi0gICAgICogaWYgZnVydGhlciB1cGRhdGVzIGFyZSBuZWVkZWQsIGZhbHNlIGlmIG5vdC4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBpbmZvcm1hdGlvbiBhYm91dCBhbiBJbWFnZSBpbnRlcmZhY2UgYmVjb21lcworICAgICAqIGF2YWlsYWJsZS4gVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIGZ1cnRoZXIgdXBkYXRlcyBhcmUgbmVlZGVkLCBmYWxzZQorICAgICAqIGlmIG5vdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1nIHRoZSBpbWFnZSB0byBiZSBvYnNlcnZlZC4KLSAgICAgKiBAcGFyYW0gaW5mb2ZsYWdzIHRoZSBiaXR3aXNlIE9SIGNvbWJpbmF0aW9uIG9mIGluZm9ybWF0aW9uIGZsYWdzOgotICAgICAqIEFCT1JULCBBTExCSVRTLCBFUlJPUiwgRlJBTUVCSVRTLCBIRUlHSFQsIFBST1BFUlRJRVMsIFNPTUVCSVRTLCAKLSAgICAgKiBXSURUSC4KLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUuCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aC4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQuCi0gICAgICogCisgICAgICogQHBhcmFtIGltZworICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIHRvIGJlIG9ic2VydmVkLgorICAgICAqIEBwYXJhbSBpbmZvZmxhZ3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBiaXR3aXNlIE9SIGNvbWJpbmF0aW9uIG9mIGluZm9ybWF0aW9uIGZsYWdzOiBBQk9SVCwKKyAgICAgKiAgICAgICAgICAgIEFMTEJJVFMsIEVSUk9SLCBGUkFNRUJJVFMsIEhFSUdIVCwgUFJPUEVSVElFUywgU09NRUJJVFMsCisgICAgICogICAgICAgICAgICBXSURUSC4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aC4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0LgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBmdXJ0aGVyIHVwZGF0ZXMgYXJlIG5lZWRlZCwgZmFsc2UgaWYgbm90LgogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGltYWdlVXBkYXRlKEltYWdlIGltZywgaW50IGluZm9mbGFncywgaW50IHgsIGludCB5LAotICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKyAgICBwdWJsaWMgYm9vbGVhbiBpbWFnZVVwZGF0ZShJbWFnZSBpbWcsIGludCBpbmZvZmxhZ3MsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvSW1hZ2VQcm9kdWNlci5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL0ltYWdlUHJvZHVjZXIuamF2YQppbmRleCA1NTdhZTA4Li45MTM4YmUyIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvSW1hZ2VQcm9kdWNlci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9JbWFnZVByb2R1Y2VyLmphdmEKQEAgLTE4LDU3ICsxOCw2MiBAQAogICogQGF1dGhvciBJZ29yIFYuIFN0b2x5YXJvdgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuaW1hZ2U7CiAKLQogLyoqCi0gKiBUaGUgSW1hZ2VQcm9kdWNlciBwcm92aWRlcyBhbiBpbnRlcmZhY2UgZm9yIG9iamVjdHMgd2hpY2ggcHJvZHVjZQotICogdGhlIGltYWdlIGRhdGEuIEltYWdlUHJvZHVjZXIgaXMgdXNlZCBmb3IgcmVjb25zdHJ1Y3RpbmcgdGhlIAotICogaW1hZ2UuIEVhY2ggaW1hZ2UgY29udGFpbnMgYW4gSW1hZ2VQcm9kdWNlci4gCisgKiBUaGUgSW1hZ2VQcm9kdWNlciBwcm92aWRlcyBhbiBpbnRlcmZhY2UgZm9yIG9iamVjdHMgd2hpY2ggcHJvZHVjZSB0aGUgaW1hZ2UKKyAqIGRhdGEuIEltYWdlUHJvZHVjZXIgaXMgdXNlZCBmb3IgcmVjb25zdHJ1Y3RpbmcgdGhlIGltYWdlLiBFYWNoIGltYWdlIGNvbnRhaW5zCisgKiBhbiBJbWFnZVByb2R1Y2VyLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBJbWFnZVByb2R1Y2VyIHsKIAogICAgIC8qKgotICAgICAqIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIEltYWdlQ29uc3VtZXIgaXMgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgCisgICAgICogQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgSW1hZ2VDb25zdW1lciBpcyByZWdpc3RlcmVkIHdpdGggdGhpcwogICAgICAqIEltYWdlUHJvdmlkZXIgb3Igbm90LgogICAgICAqIAotICAgICAqIEBwYXJhbSBpYyB0aGUgSW1hZ2VDb25zdW1lciB0byBiZSBjaGVja2VkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCBJbWFnZUNvbnN1bWVyIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIAotICAgICAqIEltYWdlUHJvdmlkZXIsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcGFyYW0gaWMKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZUNvbnN1bWVyIHRvIGJlIGNoZWNrZWQuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIEltYWdlQ29uc3VtZXIgaXMgcmVnaXN0ZXJlZCB3aXRoIHRoaXMKKyAgICAgKiAgICAgICAgIEltYWdlUHJvdmlkZXIsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbnN1bWVyKEltYWdlQ29uc3VtZXIgaWMpOwogCiAgICAgLyoqCi0gICAgICogU3RhcnRzIGEgcmVjb25zdHJ1Y3Rpb24gb2YgdGhlIGltYWdlIGRhdGEgd2hpY2ggd2lsbCAKLSAgICAgKiBiZSBkZWxpdmVyZWQgdG8gdGhpcyBjb25zdW1lci4gVGhpcyBtZXRob2QgYWRkZXMgdGhlCi0gICAgICogc3BlY2lmaWVkIEltYWdlQ29uc3VtZXIgYmVmb3JlIHJlY29uc3RydWN0aW5nIHRoZSBpbWFnZS4gIAorICAgICAqIFN0YXJ0cyBhIHJlY29uc3RydWN0aW9uIG9mIHRoZSBpbWFnZSBkYXRhIHdoaWNoIHdpbGwgYmUgZGVsaXZlcmVkIHRvIHRoaXMKKyAgICAgKiBjb25zdW1lci4gVGhpcyBtZXRob2QgYWRkcyB0aGUgc3BlY2lmaWVkIEltYWdlQ29uc3VtZXIgYmVmb3JlCisgICAgICogcmVjb25zdHJ1Y3RpbmcgdGhlIGltYWdlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpYyB0aGUgc3BlY2lmaWVkIEltYWdlQ29uc3VtZXIuCisgICAgICogQHBhcmFtIGljCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIEltYWdlQ29uc3VtZXIuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc3RhcnRQcm9kdWN0aW9uKEltYWdlQ29uc3VtZXIgaWMpOwogCiAgICAgLyoqCi0gICAgICogUmVxdWVzdHMgdGhlIEltYWdlUHJvZHVjZXIgdG8gcmVzZW5kIHRoZSBpbWFnZSBkYXRhIAotICAgICAqIGluIEltYWdlQ29uc3VtZXIuVE9QRE9XTkxFRlRSSUdIVCBvcmRlci4KKyAgICAgKiBSZXF1ZXN0cyB0aGUgSW1hZ2VQcm9kdWNlciB0byByZXNlbmQgdGhlIGltYWdlIGRhdGEgaW4KKyAgICAgKiBJbWFnZUNvbnN1bWVyLlRPUERPV05MRUZUUklHSFQgb3JkZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGljIHRoZSBzcGVjaWZpZWQgSW1hZ2VDb25zdW1lci4KKyAgICAgKiBAcGFyYW0gaWMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgSW1hZ2VDb25zdW1lci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZXF1ZXN0VG9wRG93bkxlZnRSaWdodFJlc2VuZChJbWFnZUNvbnN1bWVyIGljKTsKIAogICAgIC8qKgogICAgICAqIERlcmVnaXN0ZXJzIHRoZSBzcGVjaWZpZWQgSW1hZ2VDb25zdW1lci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWMgdGhlIHNwZWNpZmllZCBJbWFnZUNvbnN1bWVyLgorICAgICAqIEBwYXJhbSBpYworICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBJbWFnZUNvbnN1bWVyLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNvbnN1bWVyKEltYWdlQ29uc3VtZXIgaWMpOwogCiAgICAgLyoqCiAgICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIEltYWdlQ29uc3VtZXIgb2JqZWN0IHRvIHRoaXMgSW1hZ2VQcm9kdWNlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWMgdGhlIHNwZWNpZmllZCBJbWFnZUNvbnN1bWVyLgorICAgICAqIEBwYXJhbSBpYworICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBJbWFnZUNvbnN1bWVyLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZENvbnN1bWVyKEltYWdlQ29uc3VtZXIgaWMpOwogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9JbWFnaW5nT3BFeGNlcHRpb24uamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9JbWFnaW5nT3BFeGNlcHRpb24uamF2YQppbmRleCBlYmNhYmE0Li5lMGMwMTI3IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvSW1hZ2luZ09wRXhjZXB0aW9uLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL0ltYWdpbmdPcEV4Y2VwdGlvbi5qYXZhCkBAIC0yNCwxOSArMjQsMjQgQEAKIHBhY2thZ2UgamF2YS5hd3QuaW1hZ2U7CiAKIC8qKgotICogVGhlIEltYWdpbmdPcEV4Y2VwdGlvbiBjbGFzcyBwcm92aWRlcyBlcnJvciBub3RpZmljYXRpb24gd2hlbiAKLSAqIHRoZSBCdWZmZXJlZEltYWdlT3Agb3IgUmFzdGVyT3AgZmlsdGVyIG1ldGhvZHMgY2FuIG5vdCBwZXJmb3JtCi0gKiB0aGUgZGVzaXJlZCBmaWx0ZXIgb3BlcmF0aW9uLgorICogVGhlIEltYWdpbmdPcEV4Y2VwdGlvbiBjbGFzcyBwcm92aWRlcyBlcnJvciBub3RpZmljYXRpb24gd2hlbiB0aGUKKyAqIEJ1ZmZlcmVkSW1hZ2VPcCBvciBSYXN0ZXJPcCBmaWx0ZXIgbWV0aG9kcyBjYW4gbm90IHBlcmZvcm0gdGhlIGRlc2lyZWQgZmlsdGVyCisgKiBvcGVyYXRpb24uCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSW1hZ2luZ09wRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELiAqLworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODAyNjI4ODQ4MTg0NjI3NjY1OEw7CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgSW1hZ2luZ09wRXhjZXB0aW9uIHdpdGggYSBkZXRhaWwgbWVzc2FnZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcyB0aGUgZGV0YWlsIG1lc3NhZ2UuCisgICAgICogQHBhcmFtIHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZS4KICAgICAgKi8KICAgICBwdWJsaWMgSW1hZ2luZ09wRXhjZXB0aW9uKFN0cmluZyBzKSB7CiAgICAgICAgIHN1cGVyKHMpOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL0luZGV4Q29sb3JNb2RlbC5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL0luZGV4Q29sb3JNb2RlbC5qYXZhCmluZGV4IGE3MDQzZjQuLjBiMDZhY2QgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbWFnZS9JbmRleENvbG9yTW9kZWwuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvSW5kZXhDb2xvck1vZGVsLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgSWdvciBWLiBTdG9seWFyb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmltYWdlOwogCiBpbXBvcnQgamF2YS5hd3QuVHJhbnNwYXJlbmN5OwpAQCAtMjcsNjQgKzI4LDkyIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogVGhlIENsYXNzIEluZGV4Q29sb3JNb2RlbCByZXByZXNlbnRzIGEgY29sb3IgbW9kZWwgaW4gd2hpY2ggdGhlIAotICogY29sb3IgdmFsdWVzIG9mIHRoZSBwaXhlbHMgYXJlIHJlYWQgZnJvbSBhIHBhbGV0dGUuCisgKiBUaGUgQ2xhc3MgSW5kZXhDb2xvck1vZGVsIHJlcHJlc2VudHMgYSBjb2xvciBtb2RlbCBpbiB3aGljaCB0aGUgY29sb3IgdmFsdWVzCisgKiBvZiB0aGUgcGl4ZWxzIGFyZSByZWFkIGZyb20gYSBwYWxldHRlLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEluZGV4Q29sb3JNb2RlbCBleHRlbmRzIENvbG9yTW9kZWwgewogCi0gICAgLyoqIFRoZSBjb2xvciBtYXAuICovCi0gICAgcHJpdmF0ZSBpbnQgY29sb3JNYXBbXTsgICAgICAgIC8vIENvbG9yIE1hcCAgCisgICAgLyoqCisgICAgICogVGhlIGNvbG9yIG1hcC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBjb2xvck1hcFtdOyAvLyBDb2xvciBNYXAKIAotICAgIC8qKiBUaGUgbWFwIHNpemUuICovCi0gICAgcHJpdmF0ZSBpbnQgbWFwU2l6ZTsgICAgICAgICAgIC8vIENvbG9yIE1hcCBzaXplCisgICAgLyoqCisgICAgICogVGhlIG1hcCBzaXplLgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1hcFNpemU7IC8vIENvbG9yIE1hcCBzaXplCiAKLSAgICAvKiogVGhlIHRyYW5zcGFyZW50IGluZGV4LiAqLwotICAgIHByaXZhdGUgaW50IHRyYW5zcGFyZW50SW5kZXg7ICAvLyBJbmRleCBvZiBmdWxseSB0cmFuc3BhcmVudCBwaXhlbAorICAgIC8qKgorICAgICAqIFRoZSB0cmFuc3BhcmVudCBpbmRleC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCB0cmFuc3BhcmVudEluZGV4OyAvLyBJbmRleCBvZiBmdWxseSB0cmFuc3BhcmVudCBwaXhlbAogCi0gICAgLyoqIFRoZSBncmF5IHBhbGV0dGUuICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGdyYXlQYWxldHRlOyAgIC8vIENvbG9yIE1vZGVsIGhhcyBDb2xvciBNYXAgd2l0aCBHcmF5IFBhbGxldGUKKyAgICAvKioKKyAgICAgKiBUaGUgZ3JheSBwYWxldHRlLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBncmF5UGFsZXR0ZTsgLy8gQ29sb3IgTW9kZWwgaGFzIENvbG9yIE1hcCB3aXRoIEdyYXkgUGFsbGV0ZQogCi0gICAgLyoqIFRoZSB2YWxpZCBiaXRzLiAqLwotICAgIHByaXZhdGUgQmlnSW50ZWdlciB2YWxpZEJpdHM7ICAvLyBTcGVjaWZ5IHZhbGlkIENvbG9yIE1hcCB2YWx1ZXMKKyAgICAvKioKKyAgICAgKiBUaGUgdmFsaWQgYml0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIEJpZ0ludGVnZXIgdmFsaWRCaXRzOyAvLyBTcGVjaWZ5IHZhbGlkIENvbG9yIE1hcCB2YWx1ZXMKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgQ0FDSEVTSVpFLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDQUNIRVNJWkUgPSAyMDsgLy8gQ2FjaGUgc2l6ZS4gQ2FjaGUgdXNlZCBmb3IgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbXByb3ZpbmcgcGVyZm9ybWFjZSBvZiBzZWxlY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lYXJlc3QgY29sb3IgaW4gQ29sb3IgTWFwCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IENBQ0hFU0laRS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0FDSEVTSVpFID0gMjA7IC8vIENhY2hlIHNpemUuIENhY2hlIHVzZWQgZm9yCiAKLSAgICAvKiogVGhlIGNhY2hldGFibGUuICovCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgY2FjaGV0YWJsZVtdID0gbmV3IGludFtDQUNIRVNJWkUgKiAyXTsgLy8gQ2FjaGUgdGFibGUgLSB1c2VkIGZvciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9yaW5nIFJHQiB2YWx1ZXMgYW5kIHRoYXQgYXBwcm9wcmlhdGUgaW5kaWNlcyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgQ29sb3IgTWFwIAotICAgICAgICAgICAgICAgICAgICAKKyAgICAvLyBpbXByb3ZpbmcgcGVyZm9ybWFjZSBvZiBzZWxlY3Rpb24KKyAgICAvLyBuZWFyZXN0IGNvbG9yIGluIENvbG9yIE1hcAogCi0gICAgLyoqIFRoZSBuZXh0IGluc2VydCBpZHguICovCi0gICAgcHJpdmF0ZSBpbnQgbmV4dEluc2VydElkeCA9IDA7ICAvLyBOZXh0IGluZGV4IGZvciBpbnNlcnRpb24gaW50byBDYWNoZSB0YWJsZQorICAgIC8qKgorICAgICAqIFRoZSBjYWNoZXRhYmxlLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgaW50IGNhY2hldGFibGVbXSA9IG5ldyBpbnRbQ0FDSEVTSVpFICogMl07IC8vIENhY2hlIHRhYmxlIC0KIAotICAgIC8qKiBUaGUgdG90YWwgaW5zZXJ0ZWQuICovCi0gICAgcHJpdmF0ZSBpbnQgdG90YWxJbnNlcnRlZCA9IDA7ICAvLyBOdW1iZXIgb2YgaW5zZXJ0ZWQgdmFsdWVzIGludG8gQ2FjaGUgdGFibGUKKyAgICAvLyB1c2VkIGZvcgorCisgICAgLy8gc3RvcmluZyBSR0IgdmFsdWVzIGFuZCB0aGF0IGFwcHJvcHJpYXRlIGluZGljZXMKKyAgICAvLyBpbiB0aGUgQ29sb3IgTWFwCisKKyAgICAvKioKKyAgICAgKiBUaGUgbmV4dCBpbnNlcnQgaWR4LgorICAgICAqLworICAgIHByaXZhdGUgaW50IG5leHRJbnNlcnRJZHggPSAwOyAvLyBOZXh0IGluZGV4IGZvciBpbnNlcnRpb24gaW50byBDYWNoZSB0YWJsZQorCisgICAgLyoqCisgICAgICogVGhlIHRvdGFsIGluc2VydGVkLgorICAgICAqLworICAgIHByaXZhdGUgaW50IHRvdGFsSW5zZXJ0ZWQgPSAwOyAvLyBOdW1iZXIgb2YgaW5zZXJ0ZWQgdmFsdWVzIGludG8gQ2FjaGUgdGFibGUKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBpbmRleCBjb2xvciBtb2RlbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYml0cyB0aGUgYXJyYXkgb2YgY29tcG9uZW50IG1hc2tzCi0gICAgICogQHBhcmFtIHNpemUgdGhlIHNpemUgb2YgdGhlIGNvbG9yIG1hcAotICAgICAqIEBwYXJhbSBjbWFwIHRoZSBhcnJheSB0aGF0IGdpdmVzIHRoZSBjb2xvciBtYXBwaW5nCi0gICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBpbmRleCBvZiB0aGUgY29sb3IgbWFwcGluZyBkYXRhIHdpdGhpbiB0aGUgY21hcCBhcnJheQotICAgICAqIEBwYXJhbSB0cmFuc2ZlclR5cGUgdGhlIHRyYW5zZmVyIHR5cGUgKHByaW1pdGl2ZSBqYXZhIHR5cGUgCi0gICAgICogdG8gdXNlIGZvciB0aGUgY29tcG9uZW50cykKLSAgICAgKiBAcGFyYW0gdmFsaWRCaXRzIGEgbGlzdCBvZiB3aGljaCBiaXRzIHJlcHJlc2VudCB2YWxpZCBjb2xvcm1hcCAKLSAgICAgKiB2YWx1ZXMsIG9yIG51bGwgaWYgYWxsIGFyZSB2YWxpZAotICAgICAqIAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzaXplIG9mIHRoZSBjb2xvciBtYXAgaXMKLSAgICAgKiBsZXNzIHRoYW4gb25lCisgICAgICogQHBhcmFtIGJpdHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBjb21wb25lbnQgbWFza3MuCisgICAgICogQHBhcmFtIHNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzaXplIG9mIHRoZSBjb2xvciBtYXAuCisgICAgICogQHBhcmFtIGNtYXAKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSB0aGF0IGdpdmVzIHRoZSBjb2xvciBtYXBwaW5nLgorICAgICAqIEBwYXJhbSBzdGFydAorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IGluZGV4IG9mIHRoZSBjb2xvciBtYXBwaW5nIGRhdGEgd2l0aGluIHRoZSBjbWFwCisgICAgICogICAgICAgICAgICBhcnJheS4KKyAgICAgKiBAcGFyYW0gdHJhbnNmZXJUeXBlCisgICAgICogICAgICAgICAgICB0aGUgdHJhbnNmZXIgdHlwZSAocHJpbWl0aXZlIGphdmEgdHlwZSB0byB1c2UgZm9yIHRoZQorICAgICAqICAgICAgICAgICAgY29tcG9uZW50cykuCisgICAgICogQHBhcmFtIHZhbGlkQml0cworICAgICAqICAgICAgICAgICAgYSBsaXN0IG9mIHdoaWNoIGJpdHMgcmVwcmVzZW50IHZhbGlkIGNvbG9ybWFwIHZhbHVlcywgb3IgbnVsbAorICAgICAqICAgICAgICAgICAgaWYgYWxsIGFyZSB2YWxpZC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzaXplIG9mIHRoZSBjb2xvciBtYXAgaXMgbGVzcyB0aGFuIG9uZS4KICAgICAgKi8KLSAgICBwdWJsaWMgSW5kZXhDb2xvck1vZGVsKGludCBiaXRzLCBpbnQgc2l6ZSwgaW50IGNtYXBbXSwgaW50IHN0YXJ0LAotICAgICAgICAgICAgaW50IHRyYW5zZmVyVHlwZSwgQmlnSW50ZWdlciB2YWxpZEJpdHMpIHsKKyAgICBwdWJsaWMgSW5kZXhDb2xvck1vZGVsKGludCBiaXRzLCBpbnQgc2l6ZSwgaW50IGNtYXBbXSwgaW50IHN0YXJ0LCBpbnQgdHJhbnNmZXJUeXBlLAorICAgICAgICAgICAgQmlnSW50ZWdlciB2YWxpZEJpdHMpIHsKIAotICAgICAgICBzdXBlcihiaXRzLCBJbmRleENvbG9yTW9kZWwuY3JlYXRlQml0cyh0cnVlKSwKLSAgICAgICAgICAgICAgICBDb2xvclNwYWNlLmdldEluc3RhbmNlKENvbG9yU3BhY2UuQ1Nfc1JHQiksIHRydWUsIGZhbHNlLAotICAgICAgICAgICAgICAgIFRyYW5zcGFyZW5jeS5PUEFRVUUsIHZhbGlkYXRlVHJhbnNmZXJUeXBlKHRyYW5zZmVyVHlwZSkpOworICAgICAgICBzdXBlcihiaXRzLCBJbmRleENvbG9yTW9kZWwuY3JlYXRlQml0cyh0cnVlKSwgQ29sb3JTcGFjZS5nZXRJbnN0YW5jZShDb2xvclNwYWNlLkNTX3NSR0IpLAorICAgICAgICAgICAgICAgIHRydWUsIGZhbHNlLCBUcmFuc3BhcmVuY3kuT1BBUVVFLCB2YWxpZGF0ZVRyYW5zZmVyVHlwZSh0cmFuc2ZlclR5cGUpKTsKIAogICAgICAgICBpZiAoc2l6ZSA8IDEpIHsKICAgICAgICAgICAgIC8vIGF3dC4yNjQ9U2l6ZSBvZiB0aGUgY29sb3IgbWFwIGlzIGxlc3MgdGhhbiAxCkBAIC0xMjIsOCArMTUxLDcgQEAKICAgICAgICAgICAgICAgICBpZiAodHJhbnNwYXJlbmN5ID09IFRyYW5zcGFyZW5jeS5PUEFRVUUpIHsKICAgICAgICAgICAgICAgICAgICAgdHJhbnNwYXJlbmN5ID0gVHJhbnNwYXJlbmN5LkJJVE1BU0s7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChhbHBoYSAhPSBhbHBoYU1hc2sgJiYKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNwYXJlbmN5ICE9IFRyYW5zcGFyZW5jeS5UUkFOU0xVQ0VOVCkgeworICAgICAgICAgICAgfSBlbHNlIGlmIChhbHBoYSAhPSBhbHBoYU1hc2sgJiYgdHJhbnNwYXJlbmN5ICE9IFRyYW5zcGFyZW5jeS5UUkFOU0xVQ0VOVCkgewogICAgICAgICAgICAgICAgIHRyYW5zcGFyZW5jeSA9IFRyYW5zcGFyZW5jeS5UUkFOU0xVQ0VOVDsKICAgICAgICAgICAgIH0KIApAQCAtMTM1LDI1ICsxNjMsMzEgQEAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgaW5kZXggY29sb3IgbW9kZWwuCiAgICAgICogCi0gICAgICogQHBhcmFtIGJpdHMgdGhlIGFycmF5IG9mIGNvbXBvbmVudCBtYXNrcwotICAgICAqIEBwYXJhbSBzaXplIHRoZSBzaXplIG9mIHRoZSBjb2xvciBtYXAKLSAgICAgKiBAcGFyYW0gY21hcCB0aGUgYXJyYXkgdGhhdCBnaXZlcyB0aGUgY29sb3IgbWFwcGluZwotICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgaW5kZXggb2YgdGhlIGNvbG9yIG1hcHBpbmcgZGF0YSB3aXRoaW4gdGhlIGNtYXAgYXJyYXkKLSAgICAgKiBAcGFyYW0gaGFzYWxwaGEgd2hldGhlciB0aGlzIGNvbG9yIG1vZGVsIHVzZXMgYWxwaGEKLSAgICAgKiBAcGFyYW0gdHJhbnMgdGhlIHRyYW5zcGFyZW5jeSBzdXBwb3J0ZWQsIEBzZWUgamF2YS5hd3QuVHJhbnNwYXJlbmN5Ci0gICAgICogQHBhcmFtIHRyYW5zZmVyVHlwZSB0aGUgdHJhbnNmZXIgdHlwZSAocHJpbWl0aXZlIGphdmEgdHlwZSAKLSAgICAgKiB0byB1c2UgZm9yIHRoZSBjb21wb25lbnRzKQotICAgICAqIAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzaXplIG9mIHRoZSBjb2xvciBtYXAgaXMKLSAgICAgKiBsZXNzIHRoYW4gb25lCisgICAgICogQHBhcmFtIGJpdHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBjb21wb25lbnQgbWFza3MuCisgICAgICogQHBhcmFtIHNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzaXplIG9mIHRoZSBjb2xvciBtYXAuCisgICAgICogQHBhcmFtIGNtYXAKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSB0aGF0IGdpdmVzIHRoZSBjb2xvciBtYXBwaW5nLgorICAgICAqIEBwYXJhbSBzdGFydAorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IGluZGV4IG9mIHRoZSBjb2xvciBtYXBwaW5nIGRhdGEgd2l0aGluIHRoZSBjbWFwCisgICAgICogICAgICAgICAgICBhcnJheS4KKyAgICAgKiBAcGFyYW0gaGFzYWxwaGEKKyAgICAgKiAgICAgICAgICAgIHdoZXRoZXIgdGhpcyBjb2xvciBtb2RlbCB1c2VzIGFscGhhLgorICAgICAqIEBwYXJhbSB0cmFucworICAgICAqICAgICAgICAgICAgdGhlIHRyYW5zcGFyZW5jeSBzdXBwb3J0ZWQsIEBzZWUgamF2YS5hd3QuVHJhbnNwYXJlbmN5LgorICAgICAqIEBwYXJhbSB0cmFuc2ZlclR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSB0cmFuc2ZlciB0eXBlIChwcmltaXRpdmUgamF2YSB0eXBlIHRvIHVzZSBmb3IgdGhlCisgICAgICogICAgICAgICAgICBjb21wb25lbnRzKS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzaXplIG9mIHRoZSBjb2xvciBtYXAgaXMgbGVzcyB0aGFuIG9uZS4KICAgICAgKi8KLSAgICBwdWJsaWMgSW5kZXhDb2xvck1vZGVsKGludCBiaXRzLCBpbnQgc2l6ZSwgaW50IGNtYXBbXSwgaW50IHN0YXJ0LAotICAgICAgICAgICAgYm9vbGVhbiBoYXNhbHBoYSwgaW50IHRyYW5zLCBpbnQgdHJhbnNmZXJUeXBlKSB7CisgICAgcHVibGljIEluZGV4Q29sb3JNb2RlbChpbnQgYml0cywgaW50IHNpemUsIGludCBjbWFwW10sIGludCBzdGFydCwgYm9vbGVhbiBoYXNhbHBoYSwgaW50IHRyYW5zLAorICAgICAgICAgICAgaW50IHRyYW5zZmVyVHlwZSkgewogCi0gICAgICAgIHN1cGVyKGJpdHMsIEluZGV4Q29sb3JNb2RlbC5jcmVhdGVCaXRzKGhhc2FscGhhIHx8ICh0cmFucyA+PSAwKSksCi0gICAgICAgICAgICAgICAgQ29sb3JTcGFjZS5nZXRJbnN0YW5jZShDb2xvclNwYWNlLkNTX3NSR0IpLAotICAgICAgICAgICAgICAgIChoYXNhbHBoYSB8fCAodHJhbnMgPj0gMCkpLCBmYWxzZSwgVHJhbnNwYXJlbmN5Lk9QQVFVRSwKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZVRyYW5zZmVyVHlwZSh0cmFuc2ZlclR5cGUpKTsKKyAgICAgICAgc3VwZXIoYml0cywgSW5kZXhDb2xvck1vZGVsLmNyZWF0ZUJpdHMoaGFzYWxwaGEgfHwgKHRyYW5zID49IDApKSwgQ29sb3JTcGFjZQorICAgICAgICAgICAgICAgIC5nZXRJbnN0YW5jZShDb2xvclNwYWNlLkNTX3NSR0IpLCAoaGFzYWxwaGEgfHwgKHRyYW5zID49IDApKSwgZmFsc2UsCisgICAgICAgICAgICAgICAgVHJhbnNwYXJlbmN5Lk9QQVFVRSwgdmFsaWRhdGVUcmFuc2ZlclR5cGUodHJhbnNmZXJUeXBlKSk7CiAKICAgICAgICAgaWYgKHNpemUgPCAxKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjY0PVNpemUgb2YgdGhlIGNvbG9yIG1hcCBpcyBsZXNzIHRoYW4gMQpAQCAtMTkyLDggKzIyNiw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc3BhcmVuY3kgPT0gVHJhbnNwYXJlbmN5Lk9QQVFVRSkgewogICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwYXJlbmN5ID0gVHJhbnNwYXJlbmN5LkJJVE1BU0s7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFscGhhICE9IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHRyYW5zcGFyZW5jeSAhPSBUcmFuc3BhcmVuY3kuVFJBTlNMVUNFTlQpIHsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFscGhhICE9IDAgJiYgdHJhbnNwYXJlbmN5ICE9IFRyYW5zcGFyZW5jeS5UUkFOU0xVQ0VOVCkgewogICAgICAgICAgICAgICAgICAgICB0cmFuc3BhcmVuY3kgPSBUcmFuc3BhcmVuY3kuVFJBTlNMVUNFTlQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTIwNSw1NSArMjM4LDcwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGluZGV4IGNvbG9yIG1vZGVsIGJ5IGJ1aWxkaW5nIHRoZSBjb2xvciBtYXAgCi0gICAgICogZnJvbSBhcnJheXMgb2YgcmVkLCBncmVlbiwgYmx1ZSwgYW5kIGFscGhhIHZhbHVlcy4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgaW5kZXggY29sb3IgbW9kZWwgYnkgYnVpbGRpbmcgdGhlIGNvbG9yIG1hcCBmcm9tCisgICAgICogYXJyYXlzIG9mIHJlZCwgZ3JlZW4sIGJsdWUsIGFuZCBhbHBoYSB2YWx1ZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGJpdHMgdGhlIGFycmF5IG9mIGNvbXBvbmVudCBtYXNrcwotICAgICAqIEBwYXJhbSBzaXplIHRoZSBzaXplIG9mIHRoZSBjb2xvciBtYXAKLSAgICAgKiBAcGFyYW0gciB0aGUgYXJyYXkgZ2l2aW5nIHRoZSByZWQgY29tcG9uZW50cyBvZiB0aGUgZW50cmllcyBpbiB0aGUgY29sb3IgbWFwCi0gICAgICogQHBhcmFtIGcgdGhlIGFycmF5IGdpdmluZyB0aGUgZ3JlZW4gY29tcG9uZW50cyBvZiB0aGUgZW50cmllcyBpbiB0aGUgY29sb3IgbWFwCi0gICAgICogQHBhcmFtIGIgdGhlIGFycmF5IGdpdmluZyB0aGUgYmx1ZSBjb21wb25lbnRzIG9mIHRoZSBlbnRyaWVzIGluIHRoZSBjb2xvciBtYXAKLSAgICAgKiBAcGFyYW0gYSB0aGUgYXJyYXkgZ2l2aW5nIHRoZSBhbHBoYSBjb21wb25lbnRzIG9mIHRoZSBlbnRyaWVzIGluIHRoZSBjb2xvciBtYXAKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc2l6ZSBvZiB0aGUgY29sb3IgbWFwIGlzCi0gICAgICogbGVzcyB0aGFuIG9uZQotICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHRoZSBzaXplIG9mIG9uZSBvZiB0aGUgCi0gICAgICogY29tcG9uZW50IGFycmF5cyBpcyBsZXNzIHRoYW4gdGhlIHNpemUgb2YgdGhlIGNvbG9yIG1hcAorICAgICAqIEBwYXJhbSBiaXRzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgY29tcG9uZW50IG1hc2tzLgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgc2l6ZSBvZiB0aGUgY29sb3IgbWFwLgorICAgICAqIEBwYXJhbSByCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgZ2l2aW5nIHRoZSByZWQgY29tcG9uZW50cyBvZiB0aGUgZW50cmllcyBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgIGNvbG9yIG1hcC4KKyAgICAgKiBAcGFyYW0gZworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IGdpdmluZyB0aGUgZ3JlZW4gY29tcG9uZW50cyBvZiB0aGUgZW50cmllcyBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgIGNvbG9yIG1hcC4KKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IGdpdmluZyB0aGUgYmx1ZSBjb21wb25lbnRzIG9mIHRoZSBlbnRyaWVzIGluIHRoZQorICAgICAqICAgICAgICAgICAgY29sb3IgbWFwLgorICAgICAqIEBwYXJhbSBhCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgZ2l2aW5nIHRoZSBhbHBoYSBjb21wb25lbnRzIG9mIHRoZSBlbnRyaWVzIGluIHRoZQorICAgICAqICAgICAgICAgICAgY29sb3IgbWFwLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNpemUgb2YgdGhlIGNvbG9yIG1hcCBpcyBsZXNzIHRoYW4gb25lLgorICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNpemUgb2Ygb25lIG9mIHRoZSBjb21wb25lbnQgYXJyYXlzIGlzIGxlc3MgdGhhbiB0aGUKKyAgICAgKiAgICAgICAgICAgICBzaXplIG9mIHRoZSBjb2xvciBtYXAuCiAgICAgICovCi0gICAgcHVibGljIEluZGV4Q29sb3JNb2RlbChpbnQgYml0cywgaW50IHNpemUsIGJ5dGUgcltdLCBieXRlIGdbXSwgYnl0ZSBiW10sCi0gICAgICAgICAgICBieXRlIGFbXSkgeworICAgIHB1YmxpYyBJbmRleENvbG9yTW9kZWwoaW50IGJpdHMsIGludCBzaXplLCBieXRlIHJbXSwgYnl0ZSBnW10sIGJ5dGUgYltdLCBieXRlIGFbXSkgewogCi0gICAgICAgIHN1cGVyKGJpdHMsIEluZGV4Q29sb3JNb2RlbC5jcmVhdGVCaXRzKHRydWUpLAotICAgICAgICAgICAgICAgIENvbG9yU3BhY2UuZ2V0SW5zdGFuY2UoQ29sb3JTcGFjZS5DU19zUkdCKSwgdHJ1ZSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgVHJhbnNwYXJlbmN5Lk9QQVFVRSwKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZVRyYW5zZmVyVHlwZShDb2xvck1vZGVsLmdldFRyYW5zZmVyVHlwZShiaXRzKSkpOworICAgICAgICBzdXBlcihiaXRzLCBJbmRleENvbG9yTW9kZWwuY3JlYXRlQml0cyh0cnVlKSwgQ29sb3JTcGFjZS5nZXRJbnN0YW5jZShDb2xvclNwYWNlLkNTX3NSR0IpLAorICAgICAgICAgICAgICAgIHRydWUsIGZhbHNlLCBUcmFuc3BhcmVuY3kuT1BBUVVFLCB2YWxpZGF0ZVRyYW5zZmVyVHlwZShDb2xvck1vZGVsCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VHJhbnNmZXJUeXBlKGJpdHMpKSk7CiAKICAgICAgICAgY3JlYXRlQ29sb3JNYXAoc2l6ZSwgciwgZywgYiwgYSwgLTEpOwogICAgICAgICBjaGVja1BhbGV0dGUoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgaW5kZXggY29sb3IgbW9kZWwgYnkgYnVpbGRpbmcgdGhlIGNvbG9yIG1hcCAKLSAgICAgKiBmcm9tIGFycmF5cyBvZiByZWQsIGdyZWVuLCBhbmQgYmx1ZSB2YWx1ZXMuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGluZGV4IGNvbG9yIG1vZGVsIGJ5IGJ1aWxkaW5nIHRoZSBjb2xvciBtYXAgZnJvbQorICAgICAqIGFycmF5cyBvZiByZWQsIGdyZWVuLCBhbmQgYmx1ZSB2YWx1ZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGJpdHMgdGhlIGFycmF5IG9mIGNvbXBvbmVudCBtYXNrcwotICAgICAqIEBwYXJhbSBzaXplIHRoZSBzaXplIG9mIHRoZSBjb2xvciBtYXAKLSAgICAgKiBAcGFyYW0gciB0aGUgYXJyYXkgZ2l2aW5nIHRoZSByZWQgY29tcG9uZW50cyBvZiB0aGUgZW50cmllcyBpbiB0aGUgY29sb3IgbWFwCi0gICAgICogQHBhcmFtIGcgdGhlIGFycmF5IGdpdmluZyB0aGUgZ3JlZW4gY29tcG9uZW50cyBvZiB0aGUgZW50cmllcyBpbiB0aGUgY29sb3IgbWFwCi0gICAgICogQHBhcmFtIGIgdGhlIGFycmF5IGdpdmluZyB0aGUgYmx1ZSBjb21wb25lbnRzIG9mIHRoZSBlbnRyaWVzIGluIHRoZSBjb2xvciBtYXAKLSAgICAgKiBAcGFyYW0gdHJhbnMgdGhlIHRyYW5zcGFyZW5jeSBzdXBwb3J0ZWQsIEBzZWUgamF2YS5hd3QuVHJhbnNwYXJlbmN5Ci0gICAgICogCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNpemUgb2YgdGhlIGNvbG9yIG1hcCBpcwotICAgICAqIGxlc3MgdGhhbiBvbmUKLSAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB0aGUgc2l6ZSBvZiBvbmUgb2YgdGhlIAotICAgICAqIGNvbXBvbmVudCBhcnJheXMgaXMgbGVzcyB0aGFuIHRoZSBzaXplIG9mIHRoZSBjb2xvciBtYXAKKyAgICAgKiBAcGFyYW0gYml0cworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGNvbXBvbmVudCBtYXNrcy4KKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIHNpemUgb2YgdGhlIGNvbG9yIG1hcC4KKyAgICAgKiBAcGFyYW0gcgorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IGdpdmluZyB0aGUgcmVkIGNvbXBvbmVudHMgb2YgdGhlIGVudHJpZXMgaW4gdGhlCisgICAgICogICAgICAgICAgICBjb2xvciBtYXAuCisgICAgICogQHBhcmFtIGcKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBnaXZpbmcgdGhlIGdyZWVuIGNvbXBvbmVudHMgb2YgdGhlIGVudHJpZXMgaW4gdGhlCisgICAgICogICAgICAgICAgICBjb2xvciBtYXAuCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBnaXZpbmcgdGhlIGJsdWUgY29tcG9uZW50cyBvZiB0aGUgZW50cmllcyBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgIGNvbG9yIG1hcC4KKyAgICAgKiBAcGFyYW0gdHJhbnMKKyAgICAgKiAgICAgICAgICAgIHRoZSB0cmFuc3BhcmVuY3kgc3VwcG9ydGVkLCBAc2VlIGphdmEuYXd0LlRyYW5zcGFyZW5jeS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzaXplIG9mIHRoZSBjb2xvciBtYXAgaXMgbGVzcyB0aGFuIG9uZS4KKyAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzaXplIG9mIG9uZSBvZiB0aGUgY29tcG9uZW50IGFycmF5cyBpcyBsZXNzIHRoYW4gdGhlCisgICAgICogICAgICAgICAgICAgc2l6ZSBvZiB0aGUgY29sb3IgbWFwLgogICAgICAqLwotICAgIHB1YmxpYyBJbmRleENvbG9yTW9kZWwoaW50IGJpdHMsIGludCBzaXplLCBieXRlIHJbXSwgYnl0ZSBnW10sIGJ5dGUgYltdLAotICAgICAgICAgICAgaW50IHRyYW5zKSB7CisgICAgcHVibGljIEluZGV4Q29sb3JNb2RlbChpbnQgYml0cywgaW50IHNpemUsIGJ5dGUgcltdLCBieXRlIGdbXSwgYnl0ZSBiW10sIGludCB0cmFucykgewogCi0gICAgICAgIHN1cGVyKGJpdHMsIEluZGV4Q29sb3JNb2RlbC5jcmVhdGVCaXRzKCh0cmFucyA+PSAwKSksCi0gICAgICAgICAgICAgICAgQ29sb3JTcGFjZS5nZXRJbnN0YW5jZShDb2xvclNwYWNlLkNTX3NSR0IpLCAodHJhbnMgPj0gMCksIGZhbHNlLAotICAgICAgICAgICAgICAgIFRyYW5zcGFyZW5jeS5PUEFRVUUsCisgICAgICAgIHN1cGVyKGJpdHMsIEluZGV4Q29sb3JNb2RlbC5jcmVhdGVCaXRzKCh0cmFucyA+PSAwKSksIENvbG9yU3BhY2UKKyAgICAgICAgICAgICAgICAuZ2V0SW5zdGFuY2UoQ29sb3JTcGFjZS5DU19zUkdCKSwgKHRyYW5zID49IDApLCBmYWxzZSwgVHJhbnNwYXJlbmN5Lk9QQVFVRSwKICAgICAgICAgICAgICAgICB2YWxpZGF0ZVRyYW5zZmVyVHlwZShDb2xvck1vZGVsLmdldFRyYW5zZmVyVHlwZShiaXRzKSkpOwogCiAgICAgICAgIGNyZWF0ZUNvbG9yTWFwKHNpemUsIHIsIGcsIGIsIG51bGwsIHRyYW5zKTsKQEAgLTI2MSwyNSArMzA5LDMyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGluZGV4IGNvbG9yIG1vZGVsIGJ5IGJ1aWxkaW5nIHRoZSBjb2xvciBtYXAgCi0gICAgICogZnJvbSBhcnJheXMgb2YgcmVkLCBncmVlbiwgYW5kIGJsdWUgdmFsdWVzLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBpbmRleCBjb2xvciBtb2RlbCBieSBidWlsZGluZyB0aGUgY29sb3IgbWFwIGZyb20KKyAgICAgKiBhcnJheXMgb2YgcmVkLCBncmVlbiwgYW5kIGJsdWUgdmFsdWVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBiaXRzIHRoZSBhcnJheSBvZiBjb21wb25lbnQgbWFza3MKLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgY29sb3IgbWFwCi0gICAgICogQHBhcmFtIHIgdGhlIGFycmF5IGdpdmluZyB0aGUgcmVkIGNvbXBvbmVudHMgb2YgdGhlIGVudHJpZXMgaW4gdGhlIGNvbG9yIG1hcAotICAgICAqIEBwYXJhbSBnIHRoZSBhcnJheSBnaXZpbmcgdGhlIGdyZWVuIGNvbXBvbmVudHMgb2YgdGhlIGVudHJpZXMgaW4gdGhlIGNvbG9yIG1hcAotICAgICAqIEBwYXJhbSBiIHRoZSBhcnJheSBnaXZpbmcgdGhlIGJsdWUgY29tcG9uZW50cyBvZiB0aGUgZW50cmllcyBpbiB0aGUgY29sb3IgbWFwCi0gICAgICogCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNpemUgb2YgdGhlIGNvbG9yIG1hcCBpcwotICAgICAqIGxlc3MgdGhhbiBvbmUKLSAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB0aGUgc2l6ZSBvZiBvbmUgb2YgdGhlIAotICAgICAqIGNvbXBvbmVudCBhcnJheXMgaXMgbGVzcyB0aGFuIHRoZSBzaXplIG9mIHRoZSBjb2xvciBtYXAKKyAgICAgKiBAcGFyYW0gYml0cworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGNvbXBvbmVudCBtYXNrcy4KKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIHNpemUgb2YgdGhlIGNvbG9yIG1hcC4KKyAgICAgKiBAcGFyYW0gcgorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IGdpdmluZyB0aGUgcmVkIGNvbXBvbmVudHMgb2YgdGhlIGVudHJpZXMgaW4gdGhlCisgICAgICogICAgICAgICAgICBjb2xvciBtYXAuCisgICAgICogQHBhcmFtIGcKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBnaXZpbmcgdGhlIGdyZWVuIGNvbXBvbmVudHMgb2YgdGhlIGVudHJpZXMgaW4gdGhlCisgICAgICogICAgICAgICAgICBjb2xvciBtYXAuCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBnaXZpbmcgdGhlIGJsdWUgY29tcG9uZW50cyBvZiB0aGUgZW50cmllcyBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgIGNvbG9yIG1hcC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzaXplIG9mIHRoZSBjb2xvciBtYXAgaXMgbGVzcyB0aGFuIG9uZS4KKyAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzaXplIG9mIG9uZSBvZiB0aGUgY29tcG9uZW50IGFycmF5cyBpcyBsZXNzIHRoYW4gdGhlCisgICAgICogICAgICAgICAgICAgc2l6ZSBvZiB0aGUgY29sb3IgbWFwLgogICAgICAqLwogICAgIHB1YmxpYyBJbmRleENvbG9yTW9kZWwoaW50IGJpdHMsIGludCBzaXplLCBieXRlIHJbXSwgYnl0ZSBnW10sIGJ5dGUgYltdKSB7Ci0gICAgICAgIHN1cGVyKGJpdHMsIEluZGV4Q29sb3JNb2RlbC5jcmVhdGVCaXRzKGZhbHNlKSwKLSAgICAgICAgICAgICAgICBDb2xvclNwYWNlLmdldEluc3RhbmNlKENvbG9yU3BhY2UuQ1Nfc1JHQiksIGZhbHNlLCBmYWxzZSwKLSAgICAgICAgICAgICAgICBUcmFuc3BhcmVuY3kuT1BBUVVFLAotICAgICAgICAgICAgICAgIHZhbGlkYXRlVHJhbnNmZXJUeXBlKENvbG9yTW9kZWwuZ2V0VHJhbnNmZXJUeXBlKGJpdHMpKSk7CisgICAgICAgIHN1cGVyKGJpdHMsIEluZGV4Q29sb3JNb2RlbC5jcmVhdGVCaXRzKGZhbHNlKSwgQ29sb3JTcGFjZS5nZXRJbnN0YW5jZShDb2xvclNwYWNlLkNTX3NSR0IpLAorICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgVHJhbnNwYXJlbmN5Lk9QQVFVRSwgdmFsaWRhdGVUcmFuc2ZlclR5cGUoQ29sb3JNb2RlbAorICAgICAgICAgICAgICAgICAgICAgICAgLmdldFRyYW5zZmVyVHlwZShiaXRzKSkpOwogCiAgICAgICAgIGNyZWF0ZUNvbG9yTWFwKHNpemUsIHIsIGcsIGIsIG51bGwsIC0xKTsKICAgICAgICAgY2hlY2tQYWxldHRlKCk7CkBAIC0yODgsMjMgKzM0MywyNyBAQAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBpbmRleCBjb2xvciBtb2RlbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYml0cyB0aGUgYXJyYXkgb2YgY29tcG9uZW50IG1hc2tzCi0gICAgICogQHBhcmFtIHNpemUgdGhlIHNpemUgb2YgdGhlIGNvbG9yIG1hcAotICAgICAqIEBwYXJhbSBjbWFwIHRoZSBhcnJheSB0aGF0IGdpdmVzIHRoZSBjb2xvciBtYXBwaW5nCi0gICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBpbmRleCBvZiB0aGUgY29sb3IgbWFwcGluZyBkYXRhIHdpdGhpbiB0aGUgY21hcCBhcnJheQotICAgICAqIEBwYXJhbSBoYXNhbHBoYSB3aGV0aGVyIHRoaXMgY29sb3IgbW9kZWwgdXNlcyBhbHBoYQotICAgICAqIEBwYXJhbSB0cmFucyB0aGUgdHJhbnNwYXJlbmN5IHN1cHBvcnRlZCwgQHNlZSBqYXZhLmF3dC5UcmFuc3BhcmVuY3kKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc2l6ZSBvZiB0aGUgY29sb3IgbWFwIGlzCi0gICAgICogbGVzcyB0aGFuIG9uZQorICAgICAqIEBwYXJhbSBiaXRzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgY29tcG9uZW50IG1hc2tzLgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICB0aGUgc2l6ZSBvZiB0aGUgY29sb3IgbWFwLgorICAgICAqIEBwYXJhbSBjbWFwCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgdGhhdCBnaXZlcyB0aGUgY29sb3IgbWFwcGluZy4KKyAgICAgKiBAcGFyYW0gc3RhcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBpbmRleCBvZiB0aGUgY29sb3IgbWFwcGluZyBkYXRhIHdpdGhpbiB0aGUgY21hcAorICAgICAqICAgICAgICAgICAgYXJyYXkuCisgICAgICogQHBhcmFtIGhhc2FscGhhCisgICAgICogICAgICAgICAgICB3aGV0aGVyIHRoaXMgY29sb3IgbW9kZWwgdXNlcyBhbHBoYS4KKyAgICAgKiBAcGFyYW0gdHJhbnMKKyAgICAgKiAgICAgICAgICAgIHRoZSB0cmFuc3BhcmVuY3kgc3VwcG9ydGVkLCBAc2VlIGphdmEuYXd0LlRyYW5zcGFyZW5jeS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzaXplIG9mIHRoZSBjb2xvciBtYXAgaXMgbGVzcyB0aGFuIG9uZS4KICAgICAgKi8KLSAgICBwdWJsaWMgSW5kZXhDb2xvck1vZGVsKGludCBiaXRzLCBpbnQgc2l6ZSwgYnl0ZSBjbWFwW10sIGludCBzdGFydCwKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzYWxwaGEsIGludCB0cmFucykgeworICAgIHB1YmxpYyBJbmRleENvbG9yTW9kZWwoaW50IGJpdHMsIGludCBzaXplLCBieXRlIGNtYXBbXSwgaW50IHN0YXJ0LCBib29sZWFuIGhhc2FscGhhLCBpbnQgdHJhbnMpIHsKIAotICAgICAgICBzdXBlcihiaXRzLCBJbmRleENvbG9yTW9kZWwuY3JlYXRlQml0cyhoYXNhbHBoYSB8fCAodHJhbnMgPj0gMCkpLAotICAgICAgICAgICAgICAgIENvbG9yU3BhY2UuZ2V0SW5zdGFuY2UoQ29sb3JTcGFjZS5DU19zUkdCKSwKLSAgICAgICAgICAgICAgICAoaGFzYWxwaGEgfHwgKHRyYW5zID49IDApKSwgZmFsc2UsIFRyYW5zcGFyZW5jeS5PUEFRVUUsCi0gICAgICAgICAgICAgICAgdmFsaWRhdGVUcmFuc2ZlclR5cGUoQ29sb3JNb2RlbC5nZXRUcmFuc2ZlclR5cGUoYml0cykpKTsKKyAgICAgICAgc3VwZXIoYml0cywgSW5kZXhDb2xvck1vZGVsLmNyZWF0ZUJpdHMoaGFzYWxwaGEgfHwgKHRyYW5zID49IDApKSwgQ29sb3JTcGFjZQorICAgICAgICAgICAgICAgIC5nZXRJbnN0YW5jZShDb2xvclNwYWNlLkNTX3NSR0IpLCAoaGFzYWxwaGEgfHwgKHRyYW5zID49IDApKSwgZmFsc2UsCisgICAgICAgICAgICAgICAgVHJhbnNwYXJlbmN5Lk9QQVFVRSwgdmFsaWRhdGVUcmFuc2ZlclR5cGUoQ29sb3JNb2RlbC5nZXRUcmFuc2ZlclR5cGUoYml0cykpKTsKIAogICAgICAgICBpZiAoc2l6ZSA8IDEpIHsKICAgICAgICAgICAgIC8vIGF3dC4yNjQ9U2l6ZSBvZiB0aGUgY29sb3IgbWFwIGlzIGxlc3MgdGhhbiAxCkBAIC0zMTksMTMgKzM3OCwxMyBAQAogICAgICAgICBpbnQgYWxwaGEgPSAweGZmMDAwMDAwOwogCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwU2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBjb2xvck1hcFtpXSA9IChjbWFwW3N0YXJ0KytdICYgMHhmZikgPDwgMTYgfAotICAgICAgICAgICAgICAgICAgIChjbWFwW3N0YXJ0KytdICYgMHhmZikgPDwgOCB8IChjbWFwW3N0YXJ0KytdICYgMHhmZik7CisgICAgICAgICAgICBjb2xvck1hcFtpXSA9IChjbWFwW3N0YXJ0KytdICYgMHhmZikgPDwgMTYgfCAoY21hcFtzdGFydCsrXSAmIDB4ZmYpIDw8IDgKKyAgICAgICAgICAgICAgICAgICAgfCAoY21hcFtzdGFydCsrXSAmIDB4ZmYpOwogICAgICAgICAgICAgaWYgKHRyYW5zID09IGkpIHsKICAgICAgICAgICAgICAgICBpZiAodHJhbnNwYXJlbmN5ID09IFRyYW5zcGFyZW5jeS5PUEFRVUUpIHsKICAgICAgICAgICAgICAgICAgICAgdHJhbnNwYXJlbmN5ID0gVHJhbnNwYXJlbmN5LkJJVE1BU0s7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKGhhc2FscGhhKSB7CisgICAgICAgICAgICAgICAgaWYgKGhhc2FscGhhKSB7CiAgICAgICAgICAgICAgICAgICAgIHN0YXJ0Kys7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMzQwLDggKzM5OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoYWxwaGEgIT0gMHhmZiAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwYXJlbmN5ICE9IFRyYW5zcGFyZW5jeS5UUkFOU0xVQ0VOVCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYWxwaGEgIT0gMHhmZiAmJiB0cmFuc3BhcmVuY3kgIT0gVHJhbnNwYXJlbmN5LlRSQU5TTFVDRU5UKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BhcmVuY3kgPSBUcmFuc3BhcmVuY3kuVFJBTlNMVUNFTlQ7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC0zNjAsMjUgKzQxOCwyOSBAQAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBpbmRleCBjb2xvciBtb2RlbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYml0cyB0aGUgYXJyYXkgb2YgY29tcG9uZW50IG1hc2tzCi0gICAgICogQHBhcmFtIHNpemUgdGhlIHNpemUgb2YgdGhlIGNvbG9yIG1hcAotICAgICAqIEBwYXJhbSBjbWFwIHRoZSBhcnJheSB0aGF0IGdpdmVzIHRoZSBjb2xvciBtYXBwaW5nCi0gICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBpbmRleCBvZiB0aGUgY29sb3IgbWFwcGluZyBkYXRhIHdpdGhpbiB0aGUgY21hcCBhcnJheQotICAgICAqIEBwYXJhbSBoYXNhbHBoYSB3aGV0aGVyIHRoaXMgY29sb3IgbW9kZWwgdXNlcyBhbHBoYQotICAgICAqIAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzaXplIG9mIHRoZSBjb2xvciBtYXAgaXMKLSAgICAgKiBsZXNzIHRoYW4gb25lCisgICAgICogQHBhcmFtIGJpdHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBjb21wb25lbnQgbWFza3MuCisgICAgICogQHBhcmFtIHNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzaXplIG9mIHRoZSBjb2xvciBtYXAuCisgICAgICogQHBhcmFtIGNtYXAKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSB0aGF0IGdpdmVzIHRoZSBjb2xvciBtYXBwaW5nLgorICAgICAqIEBwYXJhbSBzdGFydAorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IGluZGV4IG9mIHRoZSBjb2xvciBtYXBwaW5nIGRhdGEgd2l0aGluIHRoZSBjbWFwCisgICAgICogICAgICAgICAgICBhcnJheS4KKyAgICAgKiBAcGFyYW0gaGFzYWxwaGEKKyAgICAgKiAgICAgICAgICAgIHdoZXRoZXIgdGhpcyBjb2xvciBtb2RlbCB1c2VzIGFscGhhLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHNpemUgb2YgdGhlIGNvbG9yIG1hcCBpcyBsZXNzIHRoYW4gb25lLgogICAgICAqLwotICAgIHB1YmxpYyBJbmRleENvbG9yTW9kZWwoaW50IGJpdHMsIGludCBzaXplLCBieXRlIGNtYXBbXSwgaW50IHN0YXJ0LAotICAgICAgICAgICAgYm9vbGVhbiBoYXNhbHBoYSkgeworICAgIHB1YmxpYyBJbmRleENvbG9yTW9kZWwoaW50IGJpdHMsIGludCBzaXplLCBieXRlIGNtYXBbXSwgaW50IHN0YXJ0LCBib29sZWFuIGhhc2FscGhhKSB7CiAKICAgICAgICAgdGhpcyhiaXRzLCBzaXplLCBjbWFwLCBzdGFydCwgaGFzYWxwaGEsIC0xKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgT2JqZWN0IGdldERhdGFFbGVtZW50cyhpbnRbXSBjb21wb25lbnRzLCBpbnQgb2Zmc2V0LCBPYmplY3QgcGl4ZWwpIHsKLSAgICAgICAgaW50IHJnYiA9IChjb21wb25lbnRzW29mZnNldF0gPDwgMTYpIHwgKGNvbXBvbmVudHNbb2Zmc2V0ICsgMV0pIDw8IDggfAotICAgICAgICAgICAgICAgY29tcG9uZW50c1tvZmZzZXQgKyAyXTsKKyAgICAgICAgaW50IHJnYiA9IChjb21wb25lbnRzW29mZnNldF0gPDwgMTYpIHwgKGNvbXBvbmVudHNbb2Zmc2V0ICsgMV0pIDw8IDgKKyAgICAgICAgICAgICAgICB8IGNvbXBvbmVudHNbb2Zmc2V0ICsgMl07CiAgICAgICAgIGlmIChoYXNBbHBoYSkgewogICAgICAgICAgICAgcmdiIHw9IGNvbXBvbmVudHNbb2Zmc2V0ICsgM10gPDwgMjQ7CiAgICAgICAgIH0gZWxzZSB7CkBAIC00MTksNyArNDgxLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChhbHBoYSA9PSAwICYmIHRyYW5zcGFyZW50SW5kZXggPiAtMSkgewogICAgICAgICAgICAgcGl4SWR4ID0gdHJhbnNwYXJlbnRJbmRleDsKLSAgICAgICAgfSBlbHNlICB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpbnQgbWluQWxwaGFFcnJvciA9IDI1NTsKICAgICAgICAgICAgIGludCBtaW5FcnJvciA9IDE5NTA3NTsgLy8gMjU1XjIgKyAyNTVeMiArIDI1NV4yCiAgICAgICAgICAgICBpbnQgYWxwaGFFcnJvcjsKQEAgLTQ3MCwxOSArNTMyLDE5IEBACiAgICAgLyoqCiAgICAgICogQ29udmVydHMgYW4gaW1hZ2UgZnJvbSBpbmRleGVkIHRvIFJHQiBmb3JtYXQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHJhc3RlciB0aGUgcmFzdGVyIGNvbnRhaW5pbmcgdGhlIHNvdXJjZSBpbWFnZQotICAgICAqIEBwYXJhbSBmb3JjZUFSR0Igd2hldGhlciB0byB1c2UgdGhlIGRlZmF1bHQgUkdCIGNvbG9yIG1vZGVsCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYnVmZmVyZWQgaW1hZ2UKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcmFzdGVyIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggCi0gICAgICogdGhpcyBjb2xvciBtb2RlbAorICAgICAqIEBwYXJhbSByYXN0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSByYXN0ZXIgY29udGFpbmluZyB0aGUgc291cmNlIGltYWdlLgorICAgICAqIEBwYXJhbSBmb3JjZUFSR0IKKyAgICAgKiAgICAgICAgICAgIHdoZXRoZXIgdG8gdXNlIHRoZSBkZWZhdWx0IFJHQiBjb2xvciBtb2RlbC4KKyAgICAgKiBAcmV0dXJuIHRoZSBidWZmZXJlZCBpbWFnZS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSByYXN0ZXIgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGlzIGNvbG9yIG1vZGVsLgogICAgICAqLwotICAgIHB1YmxpYyBCdWZmZXJlZEltYWdlIGNvbnZlcnRUb0ludERpc2NyZXRlKFJhc3RlciByYXN0ZXIsCi0gICAgICAgICAgICBib29sZWFuIGZvcmNlQVJHQikgeworICAgIHB1YmxpYyBCdWZmZXJlZEltYWdlIGNvbnZlcnRUb0ludERpc2NyZXRlKFJhc3RlciByYXN0ZXIsIGJvb2xlYW4gZm9yY2VBUkdCKSB7CiAKICAgICAgICAgaWYgKCFpc0NvbXBhdGlibGVSYXN0ZXIocmFzdGVyKSkgewotICAgICAgICAgICAgLy8gYXd0LjI2NT1UaGUgcmFzdGVyIGFyZ3VtZW50IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhpcyBJbmRleENvbG9yTW9kZWwKKyAgICAgICAgICAgIC8vIGF3dC4yNjU9VGhlIHJhc3RlciBhcmd1bWVudCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoaXMKKyAgICAgICAgICAgIC8vIEluZGV4Q29sb3JNb2RlbAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNjUiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCkBAIC00OTAsOCArNTUyLDcgQEAKICAgICAgICAgaWYgKGZvcmNlQVJHQiB8fCB0cmFuc3BhcmVuY3kgPT0gVHJhbnNwYXJlbmN5LlRSQU5TTFVDRU5UKSB7CiAgICAgICAgICAgICBtb2RlbCA9IENvbG9yTW9kZWwuZ2V0UkdCZGVmYXVsdCgpOwogICAgICAgICB9IGVsc2UgaWYgKHRyYW5zcGFyZW5jeSA9PSBUcmFuc3BhcmVuY3kuQklUTUFTSykgewotICAgICAgICAgICAgbW9kZWwgPSBuZXcgRGlyZWN0Q29sb3JNb2RlbCgyNSwgMHgwMGZmMDAwMCwgMHgwMDAwZmYwMCwKLSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBmZiwgMHgwMTAwMDAwMCk7CisgICAgICAgICAgICBtb2RlbCA9IG5ldyBEaXJlY3RDb2xvck1vZGVsKDI1LCAweDAwZmYwMDAwLCAweDAwMDBmZjAwLCAweDAwMDAwMGZmLCAweDAxMDAwMDAwKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1vZGVsID0gbmV3IERpcmVjdENvbG9yTW9kZWwoMjQsIDB4MDBmZjAwMDAsIDB4MDAwMGZmMDAsIDB4MDAwMDAwZmYpOwogICAgICAgICB9CkBAIC01MTAsNyArNTcxLDcgQEAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoOyBpKyssIG1pblkrKykgewogICAgICAgICAgICAgb2JqID0gcmFzdGVyLmdldERhdGFFbGVtZW50cyhtaW5YLCBtaW5ZLCB3LCAxLCBvYmopOwogICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIGJ5dGVbXSkgewotICAgICAgICAgICAgICAgIGJ5dGUgYmFbXSA9IChieXRlW10pIG9iajsKKyAgICAgICAgICAgICAgICBieXRlIGJhW10gPSAoYnl0ZVtdKW9iajsKICAgICAgICAgICAgICAgICBpZiAocGl4ZWxzID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzID0gbmV3IGludFtiYS5sZW5ndGhdOwogICAgICAgICAgICAgICAgIH0KQEAgLTUxOCw3ICs1NzksNyBAQAogICAgICAgICAgICAgICAgICAgICBwaXhlbHNbal0gPSBjb2xvck1hcFtiYVtqXSAmIDB4ZmZdOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2Ygc2hvcnRbXSkgewotICAgICAgICAgICAgICAgIHNob3J0IHNhW10gPSAoc2hvcnRbXSkgb2JqOworICAgICAgICAgICAgICAgIHNob3J0IHNhW10gPSAoc2hvcnRbXSlvYmo7CiAgICAgICAgICAgICAgICAgaWYgKHBpeGVscyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIHBpeGVscyA9IG5ldyBpbnRbc2EubGVuZ3RoXTsKICAgICAgICAgICAgICAgICB9CkBAIC01MjcsNyArNTg4LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgaW50W10pIHsKLSAgICAgICAgICAgICAgICBpbnQgaWFbXSA9IChpbnRbXSkgb2JqOworICAgICAgICAgICAgICAgIGludCBpYVtdID0gKGludFtdKW9iajsKICAgICAgICAgICAgICAgICBpZiAocGl4ZWxzID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzID0gbmV3IGludFtpYS5sZW5ndGhdOwogICAgICAgICAgICAgICAgIH0KQEAgLTU0NSw3ICs2MDYsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHZhbGlkIHBpeGVscy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWxpZCBwaXhlbHMKKyAgICAgKiBAcmV0dXJuIHRoZSB2YWxpZCBwaXhlbHMuCiAgICAgICovCiAgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0VmFsaWRQaXhlbHMoKSB7CiAgICAgICAgIHJldHVybiB2YWxpZEJpdHM7CkBAIC01NTMsMTQgKzYxNCwxNSBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgLy8gVGhlIG91dHB1dCBmb3JtYXQgYmFzZWQgb24gMS41IHJlbGVhc2UgYmVoYXZpb3VyLiAKKyAgICAgICAgLy8gVGhlIG91dHB1dCBmb3JtYXQgYmFzZWQgb24gMS41IHJlbGVhc2UgYmVoYXZpb3VyLgogICAgICAgICAvLyBJdCBjb3VsZCBiZSByZXZlbGVkIHN1Y2ggd2F5OgotICAgICAgICAvLyBCdWZmZXJlZEltYWdlIGJpID0gbmV3IEJ1ZmZlcmVkSW1hZ2UoMSwgMSwgQnVmZmVyZWRJbWFnZS5UWVBFX0JZVEVfSU5ERVhFRCk7CisgICAgICAgIC8vIEJ1ZmZlcmVkSW1hZ2UgYmkgPSBuZXcgQnVmZmVyZWRJbWFnZSgxLCAxLAorICAgICAgICAvLyBCdWZmZXJlZEltYWdlLlRZUEVfQllURV9JTkRFWEVEKTsKICAgICAgICAgLy8gQ29sb3JNb2RlbCBjbSA9IGJpLmdldENvbG9yTW9kZWwoKTsKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKGNtLnRvU3RyaW5nKCkpOwogICAgICAgICBTdHJpbmcgc3RyID0gIkluZGV4Q29sb3JNb2RlbDogI3BpeGVsX2JpdHMgPSAiICsgcGl4ZWxfYml0cyArIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICIgbnVtQ29tcG9uZW50cyA9ICIgKyBudW1Db21wb25lbnRzICsgIiBjb2xvciBzcGFjZSA9ICIgKyBjcyArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICAgIiB0cmFuc3BhcmVuY3kgPSAiOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgIiBudW1Db21wb25lbnRzID0gIiArIG51bUNvbXBvbmVudHMgKyAiIGNvbG9yIHNwYWNlID0gIiArIGNzICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisgICAgICAgICAgICAgICAgIiB0cmFuc3BhcmVuY3kgPSAiOyAvLyROT04tTkxTLTEkCiAKICAgICAgICAgaWYgKHRyYW5zcGFyZW5jeSA9PSBUcmFuc3BhcmVuY3kuT1BBUVVFKSB7CiAgICAgICAgICAgICBzdHIgPSBzdHIgKyAiVHJhbnNwYXJlbmN5Lk9QQVFVRSI7IC8vJE5PTi1OTFMtMSQKQEAgLTU3MSw3ICs2MzMsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgc3RyID0gc3RyICsgIiB0cmFuc0luZGV4ID0gIiArIHRyYW5zcGFyZW50SW5kZXggKyAiIGhhcyBhbHBoYSA9ICIgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgICAgIGhhc0FscGhhICsgIiBpc0FscGhhUHJlID0gIiArIGlzQWxwaGFQcmVtdWx0aXBsaWVkOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgaGFzQWxwaGEgKyAiIGlzQWxwaGFQcmUgPSAiICsgaXNBbHBoYVByZW11bHRpcGxpZWQ7IC8vJE5PTi1OTFMtMSQKIAogICAgICAgICByZXR1cm4gc3RyOwogICAgIH0KQEAgLTU4MCwxMyArNjQyLDEzIEBACiAgICAgcHVibGljIGludFtdIGdldENvbXBvbmVudHMoT2JqZWN0IHBpeGVsLCBpbnQgY29tcG9uZW50c1tdLCBpbnQgb2Zmc2V0KSB7CiAgICAgICAgIGludCBwaXhJZHggPSAtMTsKICAgICAgICAgaWYgKHBpeGVsIGluc3RhbmNlb2YgYnl0ZVtdKSB7Ci0gICAgICAgICAgICBieXRlIGJhW10gPSAoYnl0ZVtdKSBwaXhlbDsKKyAgICAgICAgICAgIGJ5dGUgYmFbXSA9IChieXRlW10pcGl4ZWw7CiAgICAgICAgICAgICBwaXhJZHggPSBiYVswXSAmIDB4ZmY7CiAgICAgICAgIH0gZWxzZSBpZiAocGl4ZWwgaW5zdGFuY2VvZiBzaG9ydFtdKSB7Ci0gICAgICAgICAgICBzaG9ydCBzYVtdID0gKHNob3J0W10pIHBpeGVsOworICAgICAgICAgICAgc2hvcnQgc2FbXSA9IChzaG9ydFtdKXBpeGVsOwogICAgICAgICAgICAgcGl4SWR4ID0gc2FbMF0gJiAweGZmZmY7CiAgICAgICAgIH0gZWxzZSBpZiAocGl4ZWwgaW5zdGFuY2VvZiBpbnRbXSkgewotICAgICAgICAgICAgaW50IGlhW10gPSAoaW50W10pIHBpeGVsOworICAgICAgICAgICAgaW50IGlhW10gPSAoaW50W10pcGl4ZWw7CiAgICAgICAgICAgICBwaXhJZHggPSBpYVswXTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIGF3dC4yMTk9VGhpcyB0cmFuc2ZlclR5cGUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGNvbG9yIG1vZGVsCkBAIC02MDAsMTQgKzY2MiwxMSBAQAogICAgIHB1YmxpYyBXcml0YWJsZVJhc3RlciBjcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIoaW50IHcsIGludCBoKSB7CiAgICAgICAgIFdyaXRhYmxlUmFzdGVyIHJhc3RlcjsKICAgICAgICAgaWYgKHBpeGVsX2JpdHMgPT0gMSB8fCBwaXhlbF9iaXRzID09IDIgfHwgcGl4ZWxfYml0cyA9PSA0KSB7Ci0gICAgICAgICAgICByYXN0ZXIgPSBSYXN0ZXIuY3JlYXRlUGFja2VkUmFzdGVyKERhdGFCdWZmZXIuVFlQRV9CWVRFLCB3LCBoLCAxLAotICAgICAgICAgICAgICAgICAgICBwaXhlbF9iaXRzLCBudWxsKTsKKyAgICAgICAgICAgIHJhc3RlciA9IFJhc3Rlci5jcmVhdGVQYWNrZWRSYXN0ZXIoRGF0YUJ1ZmZlci5UWVBFX0JZVEUsIHcsIGgsIDEsIHBpeGVsX2JpdHMsIG51bGwpOwogICAgICAgICB9IGVsc2UgaWYgKHBpeGVsX2JpdHMgPD0gOCkgewotICAgICAgICAgICAgcmFzdGVyID0gUmFzdGVyLmNyZWF0ZUludGVybGVhdmVkUmFzdGVyKERhdGFCdWZmZXIuVFlQRV9CWVRFLCB3LCBoLAotICAgICAgICAgICAgICAgICAgICAxLCBudWxsKTsKKyAgICAgICAgICAgIHJhc3RlciA9IFJhc3Rlci5jcmVhdGVJbnRlcmxlYXZlZFJhc3RlcihEYXRhQnVmZmVyLlRZUEVfQllURSwgdywgaCwgMSwgbnVsbCk7CiAgICAgICAgIH0gZWxzZSBpZiAocGl4ZWxfYml0cyA8PSAxNikgewotICAgICAgICAgICAgcmFzdGVyID0gUmFzdGVyLmNyZWF0ZUludGVybGVhdmVkUmFzdGVyKERhdGFCdWZmZXIuVFlQRV9VU0hPUlQsIHcsCi0gICAgICAgICAgICAgICAgICAgIGgsIDEsIG51bGwpOworICAgICAgICAgICAgcmFzdGVyID0gUmFzdGVyLmNyZWF0ZUludGVybGVhdmVkUmFzdGVyKERhdGFCdWZmZXIuVFlQRV9VU0hPUlQsIHcsIGgsIDEsIG51bGwpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gYXd0LjI2Nj1UaGUgbnVtYmVyIG9mIGJpdHMgaW4gYSBwaXhlbCBpcyBncmVhdGVyIHRoYW4gMTYKICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNjYiKSk7IC8vJE5PTi1OTFMtMSQKQEAgLTYyMiw4ICs2ODEsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCEoc20gaW5zdGFuY2VvZiBNdWx0aVBpeGVsUGFja2VkU2FtcGxlTW9kZWwpCi0gICAgICAgICAgICAgICAgJiYgIShzbSBpbnN0YW5jZW9mIENvbXBvbmVudFNhbXBsZU1vZGVsKSkgeworICAgICAgICBpZiAoIShzbSBpbnN0YW5jZW9mIE11bHRpUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCkgJiYgIShzbSBpbnN0YW5jZW9mIENvbXBvbmVudFNhbXBsZU1vZGVsKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKQEAgLTY0MCw0OCArNjk4LDQ1IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFNhbXBsZU1vZGVsIGNyZWF0ZUNvbXBhdGlibGVTYW1wbGVNb2RlbChpbnQgdywgaW50IGgpIHsKICAgICAgICAgaWYgKHBpeGVsX2JpdHMgPT0gMSB8fCBwaXhlbF9iaXRzID09IDIgfHwgcGl4ZWxfYml0cyA9PSA0KSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE11bHRpUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbChEYXRhQnVmZmVyLlRZUEVfQllURSwgdywgaCwKLSAgICAgICAgICAgICAgICAgICAgcGl4ZWxfYml0cyk7CisgICAgICAgICAgICByZXR1cm4gbmV3IE11bHRpUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbChEYXRhQnVmZmVyLlRZUEVfQllURSwgdywgaCwgcGl4ZWxfYml0cyk7CiAgICAgICAgIH0KICAgICAgICAgaW50IGJhbmRPZmZzZXRzW10gPSBuZXcgaW50WzFdOwogICAgICAgICBiYW5kT2Zmc2V0c1swXSA9IDA7Ci0gICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50U2FtcGxlTW9kZWwodHJhbnNmZXJUeXBlLCB3LCBoLCAxLCB3LAotICAgICAgICAgICAgICAgIGJhbmRPZmZzZXRzKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRTYW1wbGVNb2RlbCh0cmFuc2ZlclR5cGUsIHcsIGgsIDEsIHcsIGJhbmRPZmZzZXRzKTsKIAogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzQ29tcGF0aWJsZVJhc3RlcihSYXN0ZXIgcmFzdGVyKSB7CiAgICAgICAgIGludCBzYW1wbGVTaXplID0gcmFzdGVyLmdldFNhbXBsZU1vZGVsKCkuZ2V0U2FtcGxlU2l6ZSgwKTsKLSAgICAgICAgcmV0dXJuIChyYXN0ZXIuZ2V0VHJhbnNmZXJUeXBlKCkgPT0gdHJhbnNmZXJUeXBlICYmCi0gICAgICAgICAgICAgICByYXN0ZXIuZ2V0TnVtQmFuZHMoKSA9PSAxICYmICgxIDw8IHNhbXBsZVNpemUpID49IG1hcFNpemUpOworICAgICAgICByZXR1cm4gKHJhc3Rlci5nZXRUcmFuc2ZlclR5cGUoKSA9PSB0cmFuc2ZlclR5cGUgJiYgcmFzdGVyLmdldE51bUJhbmRzKCkgPT0gMSAmJiAoMSA8PCBzYW1wbGVTaXplKSA+PSBtYXBTaXplKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldERhdGFFbGVtZW50KGludCBjb21wb25lbnRzW10sIGludCBvZmZzZXQpIHsKICAgICAgICAgaW50IHJnYiA9IChjb21wb25lbnRzW29mZnNldF0gPDwgMTYpIHwgKGNvbXBvbmVudHNbb2Zmc2V0ICsgMV0pIDw8IDgKICAgICAgICAgICAgICAgICB8IGNvbXBvbmVudHNbb2Zmc2V0ICsgMl07Ci0gICAgICAgIAorCiAgICAgICAgIGlmIChoYXNBbHBoYSkgewogICAgICAgICAgICAgcmdiIHw9IGNvbXBvbmVudHNbb2Zmc2V0ICsgM10gPDwgMjQ7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZ2IgfD0gMHhmZjAwMDAwMDsKICAgICAgICAgfQotIAorCiAgICAgICAgIGludCBwaXhlbDsKIAogICAgICAgICBzd2l0Y2ggKHRyYW5zZmVyVHlwZSkgewotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgotICAgICAgICAgICAgYnl0ZSBiYVtdID0gKGJ5dGVbXSkgZ2V0RGF0YUVsZW1lbnRzKHJnYiwgbnVsbCk7Ci0gICAgICAgICAgICBwaXhlbCA9IGJhWzBdICYgMHhmZjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6Ci0gICAgICAgICAgICBzaG9ydCBzYVtdID0gKHNob3J0W10pIGdldERhdGFFbGVtZW50cyhyZ2IsIG51bGwpOwotICAgICAgICAgICAgcGl4ZWwgPSBzYVswXSAmIDB4ZmZmZjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gYXd0LjI2Nz1UaGUgdHJhbnNmZXJUeXBlIGlzIGludmFsaWQKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNjciKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6CisgICAgICAgICAgICAgICAgYnl0ZSBiYVtdID0gKGJ5dGVbXSlnZXREYXRhRWxlbWVudHMocmdiLCBudWxsKTsKKyAgICAgICAgICAgICAgICBwaXhlbCA9IGJhWzBdICYgMHhmZjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKKyAgICAgICAgICAgICAgICBzaG9ydCBzYVtdID0gKHNob3J0W10pZ2V0RGF0YUVsZW1lbnRzKHJnYiwgbnVsbCk7CisgICAgICAgICAgICAgICAgcGl4ZWwgPSBzYVswXSAmIDB4ZmZmZjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8gYXd0LjI2Nz1UaGUgdHJhbnNmZXJUeXBlIGlzIGludmFsaWQKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjY3IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gcGl4ZWw7CkBAIC02OTAsNyArNzQ1LDggQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBjb2xvciBtYXAuCiAgICAgICogCi0gICAgICogQHBhcmFtIHJnYiB0aGUgZGVzdGluYXRpb24gYXJyYXkgd2hlcmUgdGhlIGNvbG9yIG1hcCBpcyB3cml0dGVuCisgICAgICogQHBhcmFtIHJnYgorICAgICAqICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIGFycmF5IHdoZXJlIHRoZSBjb2xvciBtYXAgaXMgd3JpdHRlbi4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBnZXRSR0JzKGludCByZ2JbXSkgewogICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNvbG9yTWFwLCAwLCByZ2IsIDAsIG1hcFNpemUpOwpAQCAtNjk5LDQ0ICs3NTUsNDggQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSByZWQgY29tcG9uZW50IG9mIHRoZSBjb2xvciBtYXAuCiAgICAgICogCi0gICAgICogQHBhcmFtIHIgdGhlIGRlc3RpbmF0aW9uIGFycmF5CisgICAgICogQHBhcmFtIHIKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiBhcnJheS4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBnZXRSZWRzKGJ5dGUgcltdKSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwU2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICByW2ldID0gKGJ5dGUpIChjb2xvck1hcFtpXSA+PiAxNik7CisgICAgICAgICAgICByW2ldID0gKGJ5dGUpKGNvbG9yTWFwW2ldID4+IDE2KTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGdyZWVuIGNvbXBvbmVudCBvZiB0aGUgY29sb3IgbWFwLgogICAgICAqIAotICAgICAqIEBwYXJhbSBnIHRoZSBkZXN0aW5hdGlvbiBhcnJheQorICAgICAqIEBwYXJhbSBnCisgICAgICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gYXJyYXkuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgZ2V0R3JlZW5zKGJ5dGUgZ1tdKSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwU2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBnW2ldID0gKGJ5dGUpIChjb2xvck1hcFtpXSA+PiA4KTsKKyAgICAgICAgICAgIGdbaV0gPSAoYnl0ZSkoY29sb3JNYXBbaV0gPj4gOCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBibHVlIGNvbXBvbmVudCBvZiB0aGUgY29sb3IgbWFwLgogICAgICAqIAotICAgICAqIEBwYXJhbSBiIHRoZSBkZXN0aW5hdGlvbiBhcnJheQorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gYXJyYXkuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgZ2V0Qmx1ZXMoYnl0ZSBiW10pIHsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBTaXplOyBpKyspIHsKLSAgICAgICAgICAgIGJbaV0gPSAoYnl0ZSkgY29sb3JNYXBbaV07CisgICAgICAgICAgICBiW2ldID0gKGJ5dGUpY29sb3JNYXBbaV07CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBhbHBoYSBjb21wb25lbnQgb2YgdGhlIGNvbG9yIG1hcC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYSB0aGUgZGVzdGluYXRpb24gYXJyYXkKKyAgICAgKiBAcGFyYW0gYQorICAgICAqICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIGFycmF5LgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGdldEFscGhhcyhieXRlIGFbXSkgewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcFNpemU7IGkrKykgewotICAgICAgICAgICAgYVtpXSA9IChieXRlKSAoY29sb3JNYXBbaV0gPj4gMjQpOworICAgICAgICAgICAgYVtpXSA9IChieXRlKShjb2xvck1hcFtpXSA+PiAyNCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTc1OSw5ICs4MTksOSBAQAogICAgIC8qKgogICAgICAqIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIHBpeGVsIGlzIHZhbGlkIGZvciB0aGlzIGNvbG9yIG1vZGVsLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwaXhlbCB0aGUgcGl4ZWwKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBwaXhlbCBpcyB2YWxpZAorICAgICAqIEBwYXJhbSBwaXhlbAorICAgICAqICAgICAgICAgICAgdGhlIHBpeGVsLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHBpeGVsIGlzIHZhbGlkLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoaW50IHBpeGVsKSB7CiAgICAgICAgIGlmICh2YWxpZEJpdHMgPT0gbnVsbCkgewpAQCAtODAzLDcgKzg2Myw3IEBACiAgICAgLyoqCiAgICAgICogQ2hlY2tzIGlmIHRoaXMgY29sb3IgbW9kZWwgdmFsaWRhdGVzIHBpeGVscy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGFsbCBwaXhlbHMgYXJlIHZhbGlkLCBvdGhlcndpc2UgZmFsc2UKKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGFsbCBwaXhlbHMgYXJlIHZhbGlkLCBvdGhlcndpc2UgZmFsc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKICAgICAgICAgcmV0dXJuICh2YWxpZEJpdHMgPT0gbnVsbCk7CkBAIC04MTgsNyArODc4LDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBpbmRleCB0aGF0IHJlcHJlc2VudHMgdGhlIHRyYW5zcGFyZW50IHBpeGVsLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGluZGV4IHRoYXQgcmVwcmVzZW50cyB0aGUgdHJhbnNwYXJlbnQgcGl4ZWwKKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCB0aGF0IHJlcHJlc2VudHMgdGhlIHRyYW5zcGFyZW50IHBpeGVsLgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0VHJhbnNwYXJlbnRQaXhlbCgpIHsKICAgICAgICAgcmV0dXJuIHRyYW5zcGFyZW50SW5kZXg7CkBAIC04MzIsNyArODkyLDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBzaXplIG9mIHRoZSBjb2xvciBtYXAuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWFwIHNpemUKKyAgICAgKiBAcmV0dXJuIHRoZSBtYXAgc2l6ZS4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGdldE1hcFNpemUoKSB7CiAgICAgICAgIHJldHVybiBtYXBTaXplOwpAQCAtODQxLDE1ICs5MDEsMjAgQEAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIHRoZSBjb2xvciBtYXAuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNpemUgdGhlIHNpemUKLSAgICAgKiBAcGFyYW0gciB0aGUgcgotICAgICAqIEBwYXJhbSBnIHRoZSBnCi0gICAgICogQHBhcmFtIGIgdGhlIGIKLSAgICAgKiBAcGFyYW0gYSB0aGUgYQotICAgICAqIEBwYXJhbSB0cmFucyB0aGUgdHJhbnMKKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIHNpemUuCisgICAgICogQHBhcmFtIHIKKyAgICAgKiAgICAgICAgICAgIHRoZSByLgorICAgICAqIEBwYXJhbSBnCisgICAgICogICAgICAgICAgICB0aGUgZy4KKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIGIuCisgICAgICogQHBhcmFtIGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBhLgorICAgICAqIEBwYXJhbSB0cmFucworICAgICAqICAgICAgICAgICAgdGhlIHRyYW5zLgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVDb2xvck1hcChpbnQgc2l6ZSwgYnl0ZSByW10sIGJ5dGUgZ1tdLCBieXRlIGJbXSwKLSAgICAgICAgICAgIGJ5dGUgYVtdLCBpbnQgdHJhbnMpIHsKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlQ29sb3JNYXAoaW50IHNpemUsIGJ5dGUgcltdLCBieXRlIGdbXSwgYnl0ZSBiW10sIGJ5dGUgYVtdLCBpbnQgdHJhbnMpIHsKICAgICAgICAgaWYgKHNpemUgPCAxKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjY0PVNpemUgb2YgdGhlIGNvbG9yIG1hcCBpcyBsZXNzIHRoYW4gMQogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNjQiKSk7IC8vJE5PTi1OTFMtMSQKQEAgLTg2Nyw4ICs5MzIsNyBAQAogICAgICAgICBpbnQgYWxwaGEgPSAwOwogCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwU2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBjb2xvck1hcFtpXSA9ICgocltpXSAmIDB4ZmYpIDw8IDE2KSB8ICgoZ1tpXSAmIDB4ZmYpIDw8IDgpIHwKLSAgICAgICAgICAgICAgICAgICAoYltpXSAmIDB4ZmYpOworICAgICAgICAgICAgY29sb3JNYXBbaV0gPSAoKHJbaV0gJiAweGZmKSA8PCAxNikgfCAoKGdbaV0gJiAweGZmKSA8PCA4KSB8IChiW2ldICYgMHhmZik7CiAKICAgICAgICAgICAgIGlmICh0cmFucyA9PSBpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC05MDAsNyArOTY0LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBjaGVja2luZywgaWYgQ29sb3IgTWFwIGhhcyBHcmF5IFBhbGV0dGUuCisgICAgICogVGhpcyBtZXRob2QgY2hlY2tpbmcsIGlmIENvbG9yIE1hcCBoYXMgR3JheSBwYWxldHRlLgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBjaGVja1BhbGV0dGUoKSB7CiAgICAgICAgIGdyYXlQYWxldHRlID0gZmFsc2U7CkBAIC05MTEsOCArOTc1LDcgQEAKIAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcFNpemU7IGkrKykgewogICAgICAgICAgICAgcmdiID0gY29sb3JNYXBbaV07Ci0gICAgICAgICAgICBpZiAoKChyZ2IgPj4gMTYpICYgMHhmZikgIT0gKChyZ2IgPj4gOCkgJiAweGZmKSB8fAotICAgICAgICAgICAgICAgICAgICgocmdiID4+IDgpICYgMHhmZikgIT0gKHJnYiAmIDB4ZmYpKSB7CisgICAgICAgICAgICBpZiAoKChyZ2IgPj4gMTYpICYgMHhmZikgIT0gKChyZ2IgPj4gOCkgJiAweGZmKSB8fCAoKHJnYiA+PiA4KSAmIDB4ZmYpICE9IChyZ2IgJiAweGZmKSkgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtOTIyLDQwICs5ODUsMzkgQEAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3Rpb24gYW4gYXJyYXkgcGl4ZWwgcmVwcmVzZW50YXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIGNvbG9yTWFwSWR4IC0gaW5kZXggaW50byBDb2xvciBNYXAKLSAgICAgKiBAcGFyYW0gcGl4ZWwgLSBwaXhlbAotICAgICAqIAotICAgICAqIEByZXR1cm4gLSBhbiBhcnJheSBwaXhlbCByZXByZXNlbnRhdGlvbgorICAgICAqIEBwYXJhbSBjb2xvck1hcElkeAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IGludG8gQ29sb3IgTWFwLgorICAgICAqIEBwYXJhbSBwaXhlbAorICAgICAqICAgICAgICAgICAgdGhlIHBpeGVsCisgICAgICogQHJldHVybiB0aGUgcGl4ZWwgcmVwcmVzZW50YXRpb24gYXJyYXkuCiAgICAgICovCiAgICAgcHJpdmF0ZSBPYmplY3QgY3JlYXRlRGF0YU9iamVjdChpbnQgY29sb3JNYXBJZHgsIE9iamVjdCBwaXhlbCkgewogICAgICAgICBpZiAocGl4ZWwgPT0gbnVsbCkgewogICAgICAgICAgICAgc3dpdGNoICh0cmFuc2ZlclR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIGJhID0gbmV3IGJ5dGVbMV07Ci0gICAgICAgICAgICAgICAgYmFbMF0gPSAoYnl0ZSkgY29sb3JNYXBJZHg7Ci0gICAgICAgICAgICAgICAgcGl4ZWwgPSBiYTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKLSAgICAgICAgICAgICAgICBzaG9ydFtdIHNhID0gbmV3IHNob3J0WzFdOwotICAgICAgICAgICAgICAgIHNhWzBdID0gKHNob3J0KSBjb2xvck1hcElkeDsKLSAgICAgICAgICAgICAgICBwaXhlbCA9IHNhOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAvLyBhd3QuMjY3PVRoZSB0cmFuc2ZlclR5cGUgaXMgaW52YWxpZAotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNjciKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgorICAgICAgICAgICAgICAgICAgICBieXRlW10gYmEgPSBuZXcgYnl0ZVsxXTsKKyAgICAgICAgICAgICAgICAgICAgYmFbMF0gPSAoYnl0ZSljb2xvck1hcElkeDsKKyAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSBiYTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgorICAgICAgICAgICAgICAgICAgICBzaG9ydFtdIHNhID0gbmV3IHNob3J0WzFdOworICAgICAgICAgICAgICAgICAgICBzYVswXSA9IChzaG9ydCljb2xvck1hcElkeDsKKyAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSBzYTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgLy8gYXd0LjI2Nz1UaGUgdHJhbnNmZXJUeXBlIGlzIGludmFsaWQKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI2NyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHBpeGVsIGluc3RhbmNlb2YgYnl0ZVtdCi0gICAgICAgICAgICAgICAgJiYgdHJhbnNmZXJUeXBlID09IERhdGFCdWZmZXIuVFlQRV9CWVRFKSB7Ci0gICAgICAgICAgICBieXRlIGJhW10gPSAoYnl0ZVtdKSBwaXhlbDsKLSAgICAgICAgICAgIGJhWzBdID0gKGJ5dGUpIGNvbG9yTWFwSWR4OworICAgICAgICB9IGVsc2UgaWYgKHBpeGVsIGluc3RhbmNlb2YgYnl0ZVtdICYmIHRyYW5zZmVyVHlwZSA9PSBEYXRhQnVmZmVyLlRZUEVfQllURSkgeworICAgICAgICAgICAgYnl0ZSBiYVtdID0gKGJ5dGVbXSlwaXhlbDsKKyAgICAgICAgICAgIGJhWzBdID0gKGJ5dGUpY29sb3JNYXBJZHg7CiAgICAgICAgICAgICBwaXhlbCA9IGJhOwotICAgICAgICB9IGVsc2UgaWYgKHBpeGVsIGluc3RhbmNlb2Ygc2hvcnRbXSYmCi0gICAgICAgICAgICAgICAgdHJhbnNmZXJUeXBlID09IERhdGFCdWZmZXIuVFlQRV9VU0hPUlQpIHsKLSAgICAgICAgICAgIHNob3J0W10gc2EgPSAoc2hvcnRbXSkgcGl4ZWw7Ci0gICAgICAgICAgICBzYVswXSA9IChzaG9ydCkgY29sb3JNYXBJZHg7CisgICAgICAgIH0gZWxzZSBpZiAocGl4ZWwgaW5zdGFuY2VvZiBzaG9ydFtdICYmIHRyYW5zZmVyVHlwZSA9PSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUKSB7CisgICAgICAgICAgICBzaG9ydFtdIHNhID0gKHNob3J0W10pcGl4ZWw7CisgICAgICAgICAgICBzYVswXSA9IChzaG9ydCljb2xvck1hcElkeDsKICAgICAgICAgICAgIHBpeGVsID0gc2E7CiAgICAgICAgIH0gZWxzZSBpZiAocGl4ZWwgaW5zdGFuY2VvZiBpbnRbXSkgewotICAgICAgICAgICAgaW50IGlhW10gPSAoaW50W10pIHBpeGVsOworICAgICAgICAgICAgaW50IGlhW10gPSAoaW50W10pcGl4ZWw7CiAgICAgICAgICAgICBpYVswXSA9IGNvbG9yTWFwSWR4OwogICAgICAgICAgICAgcGl4ZWwgPSBpYTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTk2OCw5ICsxMDMwLDkgQEAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIHRoZSBiaXRzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBoYXNBbHBoYSB0aGUgaGFzIGFscGhhCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW50W10KKyAgICAgKiBAcGFyYW0gaGFzQWxwaGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBoYXMgYWxwaGEuCisgICAgICogQHJldHVybiB0aGUgaW50W10uCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgaW50W10gY3JlYXRlQml0cyhib29sZWFuIGhhc0FscGhhKSB7CiAKQEAgLTk5MywyOCArMTA1NSwyNiBAQAogICAgIC8qKgogICAgICAqIFZhbGlkYXRlIHRyYW5zZmVyIHR5cGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHRyYW5zZmVyVHlwZSB0aGUgdHJhbnNmZXIgdHlwZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGludAorICAgICAqIEBwYXJhbSB0cmFuc2ZlclR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSB0cmFuc2ZlciB0eXBlLgorICAgICAqIEByZXR1cm4gdGhlIGludC4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBpbnQgdmFsaWRhdGVUcmFuc2ZlclR5cGUoaW50IHRyYW5zZmVyVHlwZSkgewotICAgICAgICBpZiAodHJhbnNmZXJUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9CWVRFICYmCi0gICAgICAgICAgICAgICB0cmFuc2ZlclR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVCkgewotICAgICAgICAgICAgLy8gYXd0LjI2OT1UaGUgdHJhbnNmZXJUeXBlIGlzIG5vdCBvbmUgb2YgRGF0YUJ1ZmZlci5UWVBFX0JZVEUgb3IgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVAorICAgICAgICBpZiAodHJhbnNmZXJUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9CWVRFICYmIHRyYW5zZmVyVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUKSB7CisgICAgICAgICAgICAvLyBhd3QuMjY5PVRoZSB0cmFuc2ZlclR5cGUgaXMgbm90IG9uZSBvZiBEYXRhQnVmZmVyLlRZUEVfQllURSBvcgorICAgICAgICAgICAgLy8gRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNjkiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogICAgICAgICByZXR1cm4gdHJhbnNmZXJUeXBlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyBpZiBpcyBncmF5IHBhbGxldGUuCisgICAgICogQ2hlY2tzIGlmIGlzIGdyYXkgcGFsZXR0ZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIGdyYXkgcGFsbGV0ZQorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgaXMgZ3JheSBwYWxldHRlLgogICAgICAqLwotICAgIGJvb2xlYW4gaXNHcmF5UGFsbGV0ZSgpeworICAgIGJvb2xlYW4gaXNHcmF5UGFsbGV0ZSgpIHsKICAgICAgICAgcmV0dXJuIGdyYXlQYWxldHRlOwogICAgIH0KIAogfQotCi0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9LZXJuZWwuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9LZXJuZWwuamF2YQppbmRleCBjNmYwMGUyLi5hNTlkMjdhIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvS2VybmVsLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL0tlcm5lbC5qYXZhCkBAIC0yNywzOCArMjcsNTMgQEAKIAogLyoqCiAgKiBUaGUgS2VybmVsIGNsYXNzIHByb3ZpZGVzIGEgbWF0cml4LiBUaGlzIG1hdHJpeCBpcyBzdG9yZWQgYXMgYSBmbG9hdCBhcnJheQotICogd2hpY2ggZGVzY3JpYmVzIGhvdyBhIHNwZWNpZmllZCBwaXhlbCBhZmZlY3RzIHRoZSB2YWx1ZSBjYWxjdWxhdGVkIGZvciAKLSAqIHRoZSBwaXhlbCdzIHBvc2l0aW9uIGluIHRoZSBvdXRwdXQgaW1hZ2Ugb2YgYSBmaWx0ZXJpbmcgb3BlcmF0aW9uLiAKLSAqIFRoZSBYLCBZIG9yaWdpbnMgaW5kaWNhdGUgdGhlIGtlcm5lbCBtYXRyaXggZWxlbWVudCB3aGljaCBjb3JyZXNwb25kcyB0byAKLSAqIHRoZSBwaXhlbCBwb3NpdGlvbiBmb3Igd2hpY2ggYW4gb3V0cHV0IHZhbHVlIGlzIGJlaW5nIGNhbGN1bGF0ZWQuCisgKiB3aGljaCBkZXNjcmliZXMgaG93IGEgc3BlY2lmaWVkIHBpeGVsIGFmZmVjdHMgdGhlIHZhbHVlIGNhbGN1bGF0ZWQgZm9yIHRoZQorICogcGl4ZWwncyBwb3NpdGlvbiBpbiB0aGUgb3V0cHV0IGltYWdlIG9mIGEgZmlsdGVyaW5nIG9wZXJhdGlvbi4gVGhlIFgsIFkKKyAqIG9yaWdpbnMgaW5kaWNhdGUgdGhlIGtlcm5lbCBtYXRyaXggZWxlbWVudCB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgcGl4ZWwKKyAqIHBvc2l0aW9uIGZvciB3aGljaCBhbiBvdXRwdXQgdmFsdWUgaXMgYmVpbmcgY2FsY3VsYXRlZC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBLZXJuZWwgaW1wbGVtZW50cyBDbG9uZWFibGUgewotICAgIAotICAgIC8qKiBUaGUgeCBvcmlnaW4uICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgeCBvcmlnaW4uCisgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgeE9yaWdpbjsKLSAgICAKLSAgICAvKiogVGhlIHkgb3JpZ2luLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHkgb3JpZ2luLgorICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgaW50IHlPcmlnaW47Ci0gICAgCi0gICAgLyoqIFRoZSB3aWR0aC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSB3aWR0aC4KKyAgICAgKi8KICAgICBwcml2YXRlIGludCB3aWR0aDsKLSAgICAKLSAgICAvKiogVGhlIGhlaWdodC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBoZWlnaHQuCisgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgaGVpZ2h0OwotICAgIAotICAgIC8qKiBUaGUgZGF0YS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBkYXRhLgorICAgICAqLwogICAgIGZsb2F0IGRhdGFbXTsKIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBLZXJuZWwgd2l0aCB0aGUgc3BlY2lmaWVkIGZsb2F0IGFycmF5LgotICAgICAqIFRoZSB3aWR0aCpoZWlnaHQgZWxlbWVudHMgb2YgdGhlIGRhdGEgYXJyYXkgYXJlIGNvcGllZC4gCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEtlcm5lbCB3aXRoIHRoZSBzcGVjaWZpZWQgZmxvYXQgYXJyYXkuIFRoZQorICAgICAqIHdpZHRoKmhlaWdodCBlbGVtZW50cyBvZiB0aGUgZGF0YSBhcnJheSBhcmUgY29waWVkLgogICAgICAqIAotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIEtlcm5lbC4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIEtlcm5lbC4KLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgZGF0YSBvZiBLZXJuZWwuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIEtlcm5lbC4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBLZXJuZWwuCisgICAgICogQHBhcmFtIGRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIG9mIEtlcm5lbC4KICAgICAgKi8KICAgICBwdWJsaWMgS2VybmVsKGludCB3aWR0aCwgaW50IGhlaWdodCwgZmxvYXRbXSBkYXRhKSB7Ci0gICAgICAgIGludCBkYXRhTGVuZ3RoID0gd2lkdGgqaGVpZ2h0OworICAgICAgICBpbnQgZGF0YUxlbmd0aCA9IHdpZHRoICogaGVpZ2h0OwogICAgICAgICBpZiAoZGF0YS5sZW5ndGggPCBkYXRhTGVuZ3RoKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjJCPUxlbmd0aCBvZiBkYXRhIHNob3VsZCBub3QgYmUgbGVzcyB0aGFuIHdpZHRoKmhlaWdodAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMkIiKSk7IC8vJE5PTi1OTFMtMSQKQEAgLTcwLDggKzg1LDggQEAKICAgICAgICAgdGhpcy5kYXRhID0gbmV3IGZsb2F0W2RhdGFMZW5ndGhdOwogICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIDAsIHRoaXMuZGF0YSwgMCwgZGF0YUxlbmd0aCk7CiAKLSAgICAgICAgeE9yaWdpbiA9ICh3aWR0aC0xKS8yOwotICAgICAgICB5T3JpZ2luID0gKGhlaWdodC0xKS8yOworICAgICAgICB4T3JpZ2luID0gKHdpZHRoIC0gMSkgLyAyOworICAgICAgICB5T3JpZ2luID0gKGhlaWdodCAtIDEpIC8gMjsKICAgICB9CiAKICAgICAvKioKQEAgLTk1LDggKzExMCw4IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgZmxvYXQgZGF0YSBhcnJheSBvZiB0aGlzIEtlcm5lbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgZmxvYXQgYXJyYXkgd2hlcmUgdGhlIHJlc3VsdGVkIGRhdGEgd2lsbCBiZSBzdG9yZWQuCi0gICAgICogCisgICAgICogQHBhcmFtIGRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdCBhcnJheSB3aGVyZSB0aGUgcmVzdWx0ZWQgZGF0YSB3aWxsIGJlIHN0b3JlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBmbG9hdCBkYXRhIGFycmF5IG9mIHRoaXMgS2VybmVsLgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBmbG9hdFtdIGdldEtlcm5lbERhdGEoZmxvYXRbXSBkYXRhKSB7CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvTG9va3VwT3AuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9Mb29rdXBPcC5qYXZhCmluZGV4IGY5YmQyYzcuLjMzNjJjNWMgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbWFnZS9Mb29rdXBPcC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9Mb29rdXBPcC5qYXZhCkBAIC0zMiw1NiArMzIsNzYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBUaGUgTG9va3VwT3AgY2xhc3MgcGVyZm9tcyBhIGxvb2t1cCBvcGVyYXRpb24gd2hpY2ggdHJhbnNmb3JtcyBhIAotICogc291cmNlIGltYWdlIGJ5IGZpbHRlcmluZyBlYWNoIGJhbmQgdXNpbmcgYSB0YWJsZSBvZiBkYXRhLiAKLSAqIFRoZSB0YWJsZSBtYXkgY29udGFpbiBhIHNpbmdsZSBhcnJheSBvciBpdCBtYXkgY29udGFpbiBhIAotICogZGlmZmVyZW50IGRhdGEgYXJyYXkgZm9yIGVhY2ggYmFuZCBvZiB0aGUgaW1hZ2UuCisgKiBUaGUgTG9va3VwT3AgY2xhc3MgcGVyZm9ybXMgYSBsb29rdXAgb3BlcmF0aW9uIHdoaWNoIHRyYW5zZm9ybXMgYSBzb3VyY2UKKyAqIGltYWdlIGJ5IGZpbHRlcmluZyBlYWNoIGJhbmQgdXNpbmcgYSB0YWJsZSBvZiBkYXRhLiBUaGUgdGFibGUgbWF5IGNvbnRhaW4gYQorICogc2luZ2xlIGFycmF5IG9yIGl0IG1heSBjb250YWluIGEgZGlmZmVyZW50IGRhdGEgYXJyYXkgZm9yIGVhY2ggYmFuZCBvZiB0aGUKKyAqIGltYWdlLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIExvb2t1cE9wIGltcGxlbWVudHMgQnVmZmVyZWRJbWFnZU9wLCBSYXN0ZXJPcCB7Ci0gICAgCi0gICAgLyoqIFRoZSBsdXQuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgbHV0LgorICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgTG9va3VwVGFibGUgbHV0OwotICAgIAotICAgIC8qKiBUaGUgaGludHMuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgaGludHMuCisgICAgICovCiAgICAgcHJpdmF0ZSBSZW5kZXJpbmdIaW50cyBoaW50czsKLSAgICAKKwogICAgIC8vIFRPRE8gcmVtb3ZlIHdoZW4gdGhpcyBmaWVsZCBpcyB1c2VkCi0gICAgLyoqIFRoZSBjYW4gdXNlIGlwcC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY2FuIHVzZSBpcHAuCisgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCiAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGNhblVzZUlwcDsKIAogICAgIC8vIFdlIGRvbid0IGNyZWF0ZSBsZXZlbHMvdmFsdWVzIHdoZW4gaXQgaXMgcG9zc2libGUgdG8gcmV1c2Ugb2xkCi0gICAgLyoqIFRoZSBjYWNoZWQgbGV2ZWxzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBjYWNoZWQgbGV2ZWxzLgorICAgICAqLwogICAgIHByaXZhdGUgaW50IGNhY2hlZExldmVsc1tdOwotICAgIAotICAgIC8qKiBUaGUgY2FjaGVkIHZhbHVlcy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBjYWNoZWQgdmFsdWVzLgorICAgICAqLwogICAgIHByaXZhdGUgaW50IGNhY2hlZFZhbHVlc1tdOworCiAgICAgLy8gTnVtYmVyIG9mIGNoYW5uZWxzIGZvciB3aGljaCBjYWNoZSBpcyB2YWxpZC4KLSAgICAvLyBJZiBuZWdhdGl2ZSBudW1iZXIgb2YgY2hhbm5lbHMgaXMgc2FtZSBhcyBwb3NpdGl2ZSBidXQgc2tpcEFscGhhIHdhcyBzcGVjaWZpZWQKLSAgICAvKiogVGhlIHZhbGlkIGZvciBjaGFubmVscy4gKi8KKyAgICAvLyBJZiBuZWdhdGl2ZSBudW1iZXIgb2YgY2hhbm5lbHMgaXMgc2FtZSBhcyBwb3NpdGl2ZSBidXQgc2tpcEFscGhhIHdhcworICAgIC8vIHNwZWNpZmllZAorICAgIC8qKgorICAgICAqIFRoZSB2YWxpZCBmb3IgY2hhbm5lbHMuCisgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgdmFsaWRGb3JDaGFubmVsczsKIAotICAgIC8qKiBUaGUgbGV2ZWwgaW5pdGlhbGl6ZXIuICovCisgICAgLyoqCisgICAgICogVGhlIGxldmVsIGluaXRpYWxpemVyLgorICAgICAqLwogICAgIHN0YXRpYyBpbnQgbGV2ZWxJbml0aWFsaXplcltdID0gbmV3IGludFsweDEwMDAwXTsKIAogICAgIHN0YXRpYyB7CiAgICAgICAgIC8vIFRPRE8KICAgICAgICAgLy8gU3lzdGVtLmxvYWRMaWJyYXJ5KCJpbWFnZW9wcyIpOwogCi0gICAgICAgIGZvciAoaW50IGk9MTsgaTw9MHgxMDAwMDsgaSsrKSB7Ci0gICAgICAgICAgICBsZXZlbEluaXRpYWxpemVyW2ktMV0gPSBpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSAweDEwMDAwOyBpKyspIHsKKyAgICAgICAgICAgIGxldmVsSW5pdGlhbGl6ZXJbaSAtIDFdID0gaTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBMb29rdXBPcCBvYmplY3QgZnJvbSB0aGUgc3BlY2lmaWVkIAotICAgICAqIExvb2t1cFRhYmxlIG9iamVjdCBhbmQgYSBSZW5kZXJpbmdIaW50cyBvYmplY3QuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IExvb2t1cE9wIG9iamVjdCBmcm9tIHRoZSBzcGVjaWZpZWQgTG9va3VwVGFibGUgb2JqZWN0CisgICAgICogYW5kIGEgUmVuZGVyaW5nSGludHMgb2JqZWN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBsb29rdXAgdGhlIHNwZWNpZmllZCBMb29rdXBUYWJsZSBvYmplY3QuIAotICAgICAqIEBwYXJhbSBoaW50cyB0aGUgUmVuZGVyaW5nSGludHMgb2JqZWN0IG9yIG51bGwuCisgICAgICogQHBhcmFtIGxvb2t1cAorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBMb29rdXBUYWJsZSBvYmplY3QuCisgICAgICogQHBhcmFtIGhpbnRzCisgICAgICogICAgICAgICAgICB0aGUgUmVuZGVyaW5nSGludHMgb2JqZWN0IG9yIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIExvb2t1cE9wKExvb2t1cFRhYmxlIGxvb2t1cCwgUmVuZGVyaW5nSGludHMgaGludHMpIHsKLSAgICAgICAgaWYgKGxvb2t1cCA9PSBudWxsKXsKKyAgICAgICAgaWYgKGxvb2t1cCA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMDEiLCAibG9va3VwIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKICAgICAgICAgfQogICAgICAgICBsdXQgPSBsb29rdXA7CkBAIC0xMzYsMjcgKzE1NiwxNiBAQAogICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlclR5cGUgPSBEYXRhQnVmZmVyLlRZUEVfU0hPUlQ7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgZHN0Q00gPSBuZXcgQ29tcG9uZW50Q29sb3JNb2RlbCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdENNLmNzLAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0Q00uaGFzQWxwaGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdENNLmlzQWxwaGFQcmVtdWx0aXBsaWVkLAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0Q00udHJhbnNwYXJlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJUeXBlCi0gICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBkc3RDTSA9IG5ldyBDb21wb25lbnRDb2xvck1vZGVsKGRzdENNLmNzLCBkc3RDTS5oYXNBbHBoYSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZHN0Q00uaXNBbHBoYVByZW11bHRpcGxpZWQsIGRzdENNLnRyYW5zcGFyZW5jeSwgdHJhbnNmZXJUeXBlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIFdyaXRhYmxlUmFzdGVyIHIgPQotICAgICAgICAgICAgICAgIGRzdENNLmlzQ29tcGF0aWJsZVNhbXBsZU1vZGVsKHNyYy5nZXRTYW1wbGVNb2RlbCgpKSA/Ci0gICAgICAgICAgICAgICAgc3JjLmdldFJhc3RlcigpLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3RlcihzcmMuZ2V0V2lkdGgoKSwgc3JjLmdldEhlaWdodCgpKSA6Ci0gICAgICAgICAgICAgICAgZHN0Q00uY3JlYXRlQ29tcGF0aWJsZVdyaXRhYmxlUmFzdGVyKHNyYy5nZXRXaWR0aCgpLCBzcmMuZ2V0SGVpZ2h0KCkpOworICAgICAgICBXcml0YWJsZVJhc3RlciByID0gZHN0Q00uaXNDb21wYXRpYmxlU2FtcGxlTW9kZWwoc3JjLmdldFNhbXBsZU1vZGVsKCkpID8gc3JjLmdldFJhc3RlcigpCisgICAgICAgICAgICAgICAgLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3RlcihzcmMuZ2V0V2lkdGgoKSwgc3JjLmdldEhlaWdodCgpKSA6IGRzdENNCisgICAgICAgICAgICAgICAgLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3RlcihzcmMuZ2V0V2lkdGgoKSwgc3JjLmdldEhlaWdodCgpKTsKIAotICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlcmVkSW1hZ2UoCi0gICAgICAgICAgICAgICAgZHN0Q00sCi0gICAgICAgICAgICAgICAgciwKLSAgICAgICAgICAgICAgICBkc3RDTS5pc0FscGhhUHJlbXVsdGlwbGllZCgpLAotICAgICAgICAgICAgICAgIG51bGwKLSAgICAgICAgKTsKKyAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJlZEltYWdlKGRzdENNLCByLCBkc3RDTS5pc0FscGhhUHJlbXVsdGlwbGllZCgpLCBudWxsKTsKICAgICB9CiAKICAgICBwdWJsaWMgZmluYWwgV3JpdGFibGVSYXN0ZXIgZmlsdGVyKFJhc3RlciBzcmMsIFdyaXRhYmxlUmFzdGVyIGRzdCkgewpAQCAtMTY2LDI1ICsxNzUsMjcgQEAKICAgICAgICAgICAgIGlmIChzcmMuZ2V0TnVtQmFuZHMoKSAhPSBkc3QuZ2V0TnVtQmFuZHMoKSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjM3IikpOyAvLyROT04tTkxTLTEkICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNyYy5nZXRXaWR0aCgpICE9IGRzdC5nZXRXaWR0aCgpKXsKKyAgICAgICAgICAgIGlmIChzcmMuZ2V0V2lkdGgoKSAhPSBkc3QuZ2V0V2lkdGgoKSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjhGIikpOyAvLyROT04tTkxTLTEkICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNyYy5nZXRIZWlnaHQoKSAhPSBkc3QuZ2V0SGVpZ2h0KCkpeworICAgICAgICAgICAgaWYgKHNyYy5nZXRIZWlnaHQoKSAhPSBkc3QuZ2V0SGVpZ2h0KCkpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI5MCIpKTsgLy8kTk9OLU5MUy0xJCAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGlmIChsdXQuZ2V0TnVtQ29tcG9uZW50cygpICE9IDEgJiYgbHV0LmdldE51bUNvbXBvbmVudHMoKSAhPSBzcmMuZ2V0TnVtQmFuZHMoKSkgewotICAgICAgICAgICAgLy8gYXd0LjIzOD1UaGUgbnVtYmVyIG9mIGFycmF5cyBpbiB0aGUgTG9va3VwVGFibGUgZG9lcyBub3QgbWVldCB0aGUgcmVzdHJpY3Rpb25zCisgICAgICAgICAgICAvLyBhd3QuMjM4PVRoZSBudW1iZXIgb2YgYXJyYXlzIGluIHRoZSBMb29rdXBUYWJsZSBkb2VzIG5vdCBtZWV0IHRoZQorICAgICAgICAgICAgLy8gcmVzdHJpY3Rpb25zCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIzOCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKICAgICAgICAgLy8gVE9ETwotICAgICAgICAvLyBpZiAoIWNhblVzZUlwcCB8fCBpcHBGaWx0ZXIoc3JjLCBkc3QsIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9DVVNUT00sIGZhbHNlKSAhPSAwKQotICAgICAgICAgICAgaWYgKHNsb3dGaWx0ZXIoc3JjLCBkc3QsIGZhbHNlKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gYXd0LjIxRj1VbmFibGUgdG8gdHJhbnNmb3JtIHNvdXJjZQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbWFnaW5nT3BFeGNlcHRpb24gKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxRiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQorICAgICAgICAvLyBpZiAoIWNhblVzZUlwcCB8fCBpcHBGaWx0ZXIoc3JjLCBkc3QsIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9DVVNUT00sCisgICAgICAgIC8vIGZhbHNlKSAhPSAwKQorICAgICAgICBpZiAoc2xvd0ZpbHRlcihzcmMsIGRzdCwgZmFsc2UpICE9IDApIHsKKyAgICAgICAgICAgIC8vIGF3dC4yMUY9VW5hYmxlIHRvIHRyYW5zZm9ybSBzb3VyY2UKKyAgICAgICAgICAgIHRocm93IG5ldyBJbWFnaW5nT3BFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjFGIikpOyAvLyROT04tTkxTLTEkCisgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gZHN0OwogICAgIH0KQEAgLTIwMiwxOCArMjEzLDIwIEBACiAgICAgICAgIGludCBuTFVUQ29tcG9uZW50cyA9IGx1dC5nZXROdW1Db21wb25lbnRzKCk7CiAgICAgICAgIGJvb2xlYW4gc2tpcEFscGhhOwogICAgICAgICBpZiAoc3JjQ00uaGFzQWxwaGEoKSkgewotICAgICAgICAgICAgaWYgKG5MVVRDb21wb25lbnRzID09IDEgfHwgbkxVVENvbXBvbmVudHMgPT0gbkNvbXBvbmVudHMtMSkgeworICAgICAgICAgICAgaWYgKG5MVVRDb21wb25lbnRzID09IDEgfHwgbkxVVENvbXBvbmVudHMgPT0gbkNvbXBvbmVudHMgLSAxKSB7CiAgICAgICAgICAgICAgICAgc2tpcEFscGhhID0gdHJ1ZTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobkxVVENvbXBvbmVudHMgPT0gbkNvbXBvbmVudHMpIHsKICAgICAgICAgICAgICAgICBza2lwQWxwaGEgPSBmYWxzZTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gYXd0LjIyOT1OdW1iZXIgb2YgY29tcG9uZW50cyBpbiB0aGUgTFVUIGRvZXMgbm90IG1hdGNoIHRoZSBudW1iZXIgb2YgYmFuZHMKKyAgICAgICAgICAgICAgICAvLyBhd3QuMjI5PU51bWJlciBvZiBjb21wb25lbnRzIGluIHRoZSBMVVQgZG9lcyBub3QgbWF0Y2ggdGhlCisgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGJhbmRzCiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMjkiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChuTFVUQ29tcG9uZW50cyA9PSAxIHx8IG5MVVRDb21wb25lbnRzID09IG5Db21wb25lbnRzKSB7CiAgICAgICAgICAgICBza2lwQWxwaGEgPSBmYWxzZTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGF3dC4yMjk9TnVtYmVyIG9mIGNvbXBvbmVudHMgaW4gdGhlIExVVCBkb2VzIG5vdCBtYXRjaCB0aGUgbnVtYmVyIG9mIGJhbmRzCisgICAgICAgICAgICAvLyBhd3QuMjI5PU51bWJlciBvZiBjb21wb25lbnRzIGluIHRoZSBMVVQgZG9lcyBub3QgbWF0Y2ggdGhlIG51bWJlcgorICAgICAgICAgICAgLy8gb2YgYmFuZHMKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjI5IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIApAQCAtMjIyLDIxICsyMzUsMTkgQEAKICAgICAgICAgICAgIGZpbmFsRHN0ID0gZHN0OwogICAgICAgICAgICAgZHN0ID0gY3JlYXRlQ29tcGF0aWJsZURlc3RJbWFnZShzcmMsIG51bGwpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHNyYy5nZXRXaWR0aCgpICE9IGRzdC5nZXRXaWR0aCgpKXsKKyAgICAgICAgICAgIGlmIChzcmMuZ2V0V2lkdGgoKSAhPSBkc3QuZ2V0V2lkdGgoKSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjkxIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChzcmMuZ2V0SGVpZ2h0KCkgIT0gZHN0LmdldEhlaWdodCgpKXsKKyAgICAgICAgICAgIGlmIChzcmMuZ2V0SGVpZ2h0KCkgIT0gZHN0LmdldEhlaWdodCgpKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yOTIiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKCFzcmNDTS5lcXVhbHMoZHN0LmdldENvbG9yTW9kZWwoKSkpIHsKICAgICAgICAgICAgICAgICAvLyBUcmVhdCBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX1JHQiBhbmQKICAgICAgICAgICAgICAgICAvLyBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0IgYXMgc2FtZQotICAgICAgICAgICAgICAgIGlmICghKChzcmMuZ2V0VHlwZSgpID09IEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfUkdCIHx8IHNyYwotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFR5cGUoKSA9PSBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0IpICYmIChkc3QKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRUeXBlKCkgPT0gQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9SR0IgfHwgZHN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VHlwZSgpID09IEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfQVJHQikpKSB7CisgICAgICAgICAgICAgICAgaWYgKCEoKHNyYy5nZXRUeXBlKCkgPT0gQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9SR0IgfHwgc3JjLmdldFR5cGUoKSA9PSBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0IpICYmIChkc3QKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRUeXBlKCkgPT0gQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9SR0IgfHwgZHN0LmdldFR5cGUoKSA9PSBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0IpKSkgewogICAgICAgICAgICAgICAgICAgICBmaW5hbERzdCA9IGRzdDsKICAgICAgICAgICAgICAgICAgICAgZHN0ID0gY3JlYXRlQ29tcGF0aWJsZURlc3RJbWFnZShzcmMsIG51bGwpOwogICAgICAgICAgICAgICAgIH0KQEAgLTI0NCwxMSArMjU1LDEyIEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBUT0RPCi0gICAgICAgIC8vaWYgKCFjYW5Vc2VJcHAgfHwgaXBwRmlsdGVyKHNyYy5nZXRSYXN0ZXIoKSwgZHN0LmdldFJhc3RlcigpLCBzcmMuZ2V0VHlwZSgpLCBza2lwQWxwaGEpICE9IDApCi0gICAgICAgICAgICBpZiAoc2xvd0ZpbHRlcihzcmMuZ2V0UmFzdGVyKCksIGRzdC5nZXRSYXN0ZXIoKSwgc2tpcEFscGhhKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gYXd0LjIxRj1VbmFibGUgdG8gdHJhbnNmb3JtIHNvdXJjZQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbWFnaW5nT3BFeGNlcHRpb24gKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxRiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQorICAgICAgICAvLyBpZiAoIWNhblVzZUlwcCB8fCBpcHBGaWx0ZXIoc3JjLmdldFJhc3RlcigpLCBkc3QuZ2V0UmFzdGVyKCksCisgICAgICAgIC8vIHNyYy5nZXRUeXBlKCksIHNraXBBbHBoYSkgIT0gMCkKKyAgICAgICAgaWYgKHNsb3dGaWx0ZXIoc3JjLmdldFJhc3RlcigpLCBkc3QuZ2V0UmFzdGVyKCksIHNraXBBbHBoYSkgIT0gMCkgeworICAgICAgICAgICAgLy8gYXd0LjIxRj1VbmFibGUgdG8gdHJhbnNmb3JtIHNvdXJjZQorICAgICAgICAgICAgdGhyb3cgbmV3IEltYWdpbmdPcEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMUYiKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgfQogCiAgICAgICAgIGlmIChmaW5hbERzdCAhPSBudWxsKSB7CiAgICAgICAgICAgICBHcmFwaGljczJEIGcgPSBmaW5hbERzdC5jcmVhdGVHcmFwaGljcygpOwpAQCAtMjY0LDExICsyNzYsMTMgQEAKICAgICAvKioKICAgICAgKiBTbG93IGZpbHRlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3JjIHRoZSBzcmMKLSAgICAgKiBAcGFyYW0gZHN0IHRoZSBkc3QKLSAgICAgKiBAcGFyYW0gc2tpcEFscGhhIHRoZSBza2lwIGFscGhhCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW50CisgICAgICogQHBhcmFtIHNyYworICAgICAqICAgICAgICAgICAgdGhlIHNyYy4KKyAgICAgKiBAcGFyYW0gZHN0CisgICAgICogICAgICAgICAgICB0aGUgZHN0LgorICAgICAqIEBwYXJhbSBza2lwQWxwaGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBza2lwIGFscGhhLgorICAgICAqIEByZXR1cm4gdGhlIGludC4KICAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIGludCBzbG93RmlsdGVyKFJhc3RlciBzcmMsIFdyaXRhYmxlUmFzdGVyIGRzdCwgYm9vbGVhbiBza2lwQWxwaGEpIHsKICAgICAgICAgaW50IG1pblNyY1ggPSBzcmMuZ2V0TWluWCgpOwpAQCAtMjg2LDM5ICszMDAsMzkgQEAKICAgICAgICAgaW50W10gcGl4ZWxzID0gbnVsbDsKICAgICAgICAgaW50IG9mZnNldCA9IGx1dC5nZXRPZmZzZXQoKTsKIAotICAgICAgICBpZiAobHV0IGluc3RhbmNlb2YgQnl0ZUxvb2t1cFRhYmxlKXsKKyAgICAgICAgaWYgKGx1dCBpbnN0YW5jZW9mIEJ5dGVMb29rdXBUYWJsZSkgewogICAgICAgICAgICAgYnl0ZVtdW10gYnl0ZURhdGEgPSAoKEJ5dGVMb29rdXBUYWJsZSlsdXQpLmdldFRhYmxlKCk7CiAgICAgICAgICAgICBwaXhlbHMgPSBzcmMuZ2V0UGl4ZWxzKG1pblNyY1gsIG1pblNyY1ksIHNyY1dpZHRoLCBzcmNIZWlnaHQsIHBpeGVscyk7CiAKLSAgICAgICAgICAgIGlmIChsdXQuZ2V0TnVtQ29tcG9uZW50cygpICE9IDEpewotICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IHBpeGVscy5sZW5ndGg7IGkrPSBudW1CYW5kcyl7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGIgPSAwOyBiIDwgbnVtQmFuZHMyUHJvY2VzczsgYisrKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1tpK2JdID0gYnl0ZURhdGFbYl1bcGl4ZWxzW2krYl0tb2Zmc2V0XSAmIDB4RkY7CisgICAgICAgICAgICBpZiAobHV0LmdldE51bUNvbXBvbmVudHMoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbHMubGVuZ3RoOyBpICs9IG51bUJhbmRzKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGIgPSAwOyBiIDwgbnVtQmFuZHMyUHJvY2VzczsgYisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNbaSArIGJdID0gYnl0ZURhdGFbYl1bcGl4ZWxzW2kgKyBiXSAtIG9mZnNldF0gJiAweEZGOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBwaXhlbHMubGVuZ3RoOyBpKz0gbnVtQmFuZHMpewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBiID0gMDsgYiA8IG51bUJhbmRzMlByb2Nlc3M7IGIrKyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNbaStiXSA9IGJ5dGVEYXRhWzBdW3BpeGVsc1tpK2JdLW9mZnNldF0gJiAweEZGOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxzLmxlbmd0aDsgaSArPSBudW1CYW5kcykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBiID0gMDsgYiA8IG51bUJhbmRzMlByb2Nlc3M7IGIrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzW2kgKyBiXSA9IGJ5dGVEYXRhWzBdW3BpeGVsc1tpICsgYl0gLSBvZmZzZXRdICYgMHhGRjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgZHN0LnNldFBpeGVscyhtaW5Ec3RYLCBtaW5Ec3RZLCBzcmNXaWR0aCwgc3JjSGVpZ2h0LCBwaXhlbHMpOwotICAgICAgICB9IGVsc2UgaWYgKGx1dCBpbnN0YW5jZW9mIFNob3J0TG9va3VwVGFibGUpewotICAgICAgICAgICAgc2hvcnRbXVtdIHNob3J0RGF0YSAgPSAoKFNob3J0TG9va3VwVGFibGUpbHV0KS5nZXRUYWJsZSgpOworICAgICAgICB9IGVsc2UgaWYgKGx1dCBpbnN0YW5jZW9mIFNob3J0TG9va3VwVGFibGUpIHsKKyAgICAgICAgICAgIHNob3J0W11bXSBzaG9ydERhdGEgPSAoKFNob3J0TG9va3VwVGFibGUpbHV0KS5nZXRUYWJsZSgpOwogICAgICAgICAgICAgcGl4ZWxzID0gc3JjLmdldFBpeGVscyhtaW5TcmNYLCBtaW5TcmNZLCBzcmNXaWR0aCwgc3JjSGVpZ2h0LCBwaXhlbHMpOwogCi0gICAgICAgICAgICBpZiAobHV0LmdldE51bUNvbXBvbmVudHMoKSAhPSAxKXsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBwaXhlbHMubGVuZ3RoOyBpKz0gbnVtQmFuZHMpewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBiID0gMDsgYiA8IG51bUJhbmRzMlByb2Nlc3M7IGIrKyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNbaStiXSA9IHNob3J0RGF0YVtiXVtwaXhlbHNbaStiXS1vZmZzZXRdICYgMHhGRkZGOworICAgICAgICAgICAgaWYgKGx1dC5nZXROdW1Db21wb25lbnRzKCkgIT0gMSkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxzLmxlbmd0aDsgaSArPSBudW1CYW5kcykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBiID0gMDsgYiA8IG51bUJhbmRzMlByb2Nlc3M7IGIrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzW2kgKyBiXSA9IHNob3J0RGF0YVtiXVtwaXhlbHNbaSArIGJdIC0gb2Zmc2V0XSAmIDB4RkZGRjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgcGl4ZWxzLmxlbmd0aDsgaSs9IG51bUJhbmRzKXsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCBudW1CYW5kczJQcm9jZXNzOyBiKyspewotICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzW2krYl0gPSBzaG9ydERhdGFbMF1bcGl4ZWxzW2krYl0tb2Zmc2V0XSAmIDB4RkZGRjsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVscy5sZW5ndGg7IGkgKz0gbnVtQmFuZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCBudW1CYW5kczJQcm9jZXNzOyBiKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1tpICsgYl0gPSBzaG9ydERhdGFbMF1bcGl4ZWxzW2kgKyBiXSAtIG9mZnNldF0gJiAweEZGRkY7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0zMjgsOCArMzQyLDggQEAKICAgICAgICAgICAgIGludCBwaXhlbFtdID0gbmV3IGludFtzcmMuZ2V0TnVtQmFuZHMoKV07CiAgICAgICAgICAgICBpbnQgbWF4WSA9IG1pblNyY1kgKyBzcmNIZWlnaHQ7CiAgICAgICAgICAgICBpbnQgbWF4WCA9IG1pblNyY1ggKyBzcmNXaWR0aDsKLSAgICAgICAgICAgIGZvciAoaW50IHNyY1k9bWluU3JjWSwgZHN0WSA9IG1pbkRzdFk7IHNyY1kgPCBtYXhZOyBzcmNZKyssIGRzdFkrKyl7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgc3JjWD1taW5TcmNYLCBkc3RYID0gbWluRHN0WDsgc3JjWCA8IG1heFg7IHNyY1grKywgZHN0WCsrKXsKKyAgICAgICAgICAgIGZvciAoaW50IHNyY1kgPSBtaW5TcmNZLCBkc3RZID0gbWluRHN0WTsgc3JjWSA8IG1heFk7IHNyY1krKywgZHN0WSsrKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgc3JjWCA9IG1pblNyY1gsIGRzdFggPSBtaW5Ec3RYOyBzcmNYIDwgbWF4WDsgc3JjWCsrLCBkc3RYKyspIHsKICAgICAgICAgICAgICAgICAgICAgc3JjLmdldFBpeGVsKHNyY1gsIHNyY1ksIHBpeGVsKTsKICAgICAgICAgICAgICAgICAgICAgbHV0Lmxvb2t1cFBpeGVsKHBpeGVsLCBwaXhlbCk7CiAgICAgICAgICAgICAgICAgICAgIGRzdC5zZXRQaXhlbChkc3RYLCBkc3RZLCBwaXhlbCk7CkBAIC0zNDMsMTYgKzM1NywxOSBAQAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgdGhlIGJ5dGUgbGV2ZWxzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjaGFubmVscyB0aGUgY2hhbm5lbHMKLSAgICAgKiBAcGFyYW0gc2tpcEFscGhhIHRoZSBza2lwIGFscGhhCi0gICAgICogQHBhcmFtIGxldmVscyB0aGUgbGV2ZWxzCi0gICAgICogQHBhcmFtIHZhbHVlcyB0aGUgdmFsdWVzCi0gICAgICogQHBhcmFtIGNoYW5uZWxzT3JkZXIgdGhlIGNoYW5uZWxzIG9yZGVyCisgICAgICogQHBhcmFtIGNoYW5uZWxzCisgICAgICogICAgICAgICAgICB0aGUgY2hhbm5lbHMuCisgICAgICogQHBhcmFtIHNraXBBbHBoYQorICAgICAqICAgICAgICAgICAgdGhlIHNraXAgYWxwaGEuCisgICAgICogQHBhcmFtIGxldmVscworICAgICAqICAgICAgICAgICAgdGhlIGxldmVscy4KKyAgICAgKiBAcGFyYW0gdmFsdWVzCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWVzLgorICAgICAqIEBwYXJhbSBjaGFubmVsc09yZGVyCisgICAgICogICAgICAgICAgICB0aGUgY2hhbm5lbHMgb3JkZXIuCiAgICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGNyZWF0ZUJ5dGVMZXZlbHMoCi0gICAgICAgICAgICBpbnQgY2hhbm5lbHMsIGJvb2xlYW4gc2tpcEFscGhhLAotICAgICAgICAgICAgaW50IGxldmVsc1tdLCBpbnQgdmFsdWVzW10sIGludCBjaGFubmVsc09yZGVyW10KLSAgICApIHsKKyAgICBwcml2YXRlIGZpbmFsIHZvaWQgY3JlYXRlQnl0ZUxldmVscyhpbnQgY2hhbm5lbHMsIGJvb2xlYW4gc2tpcEFscGhhLCBpbnQgbGV2ZWxzW10sCisgICAgICAgICAgICBpbnQgdmFsdWVzW10sIGludCBjaGFubmVsc09yZGVyW10pIHsKICAgICAgICAgYnl0ZSBkYXRhW11bXSA9ICgoQnl0ZUxvb2t1cFRhYmxlKWx1dCkuZ2V0VGFibGUoKTsKICAgICAgICAgaW50IG5MZXZlbHMgPSBkYXRhWzBdLmxlbmd0aDsKICAgICAgICAgaW50IG9mZnNldCA9IGx1dC5nZXRPZmZzZXQoKTsKQEAgLTM2MCwxOCArMzc3LDE4IEBACiAgICAgICAgIC8vIFVzZSBvbmUgZGF0YSBhcnJheSBmb3IgYWxsIGNoYW5uZWxzIG9yIHVzZSBzZXZlcmFsIGRhdGEgYXJyYXlzCiAgICAgICAgIGludCBkYXRhSW5jcmVtZW50ID0gZGF0YS5sZW5ndGggPiAxID8gMSA6IDA7CiAKLSAgICAgICAgZm9yIChpbnQgY2ggPSAwLCBkYXRhSWR4ID0gMDsgY2g8Y2hhbm5lbHM7IGRhdGFJZHgrPWRhdGFJbmNyZW1lbnQsIGNoKyspIHsKKyAgICAgICAgZm9yIChpbnQgY2ggPSAwLCBkYXRhSWR4ID0gMDsgY2ggPCBjaGFubmVsczsgZGF0YUlkeCArPSBkYXRhSW5jcmVtZW50LCBjaCsrKSB7CiAgICAgICAgICAgICBpbnQgY2hhbm5lbE9mZnNldCA9IGNoYW5uZWxzT3JkZXIgPT0gbnVsbCA/IGNoIDogY2hhbm5lbHNPcmRlcltjaF07CiAgICAgICAgICAgICBpbnQgY2hhbm5lbEJhc2UgPSBuTGV2ZWxzICogY2hhbm5lbE9mZnNldDsKIAogICAgICAgICAgICAgLy8gU2tpcCBsYXN0IGNoYW5uZWwgaWYgbmVlZGVkLCB6ZXJvIHZhbHVlcyBhcmUgT0sgLQogICAgICAgICAgICAgLy8gbm8gY2hhbmdlcyB0byB0aGUgY2hhbm5lbCBpbmZvcm1hdGlvbiB3aWxsIGJlIGRvbmUgaW4gSVBQCi0gICAgICAgICAgICBpZiAoKGNoYW5uZWxPZmZzZXQgPT0gY2hhbm5lbHMtMSAmJiBza2lwQWxwaGEpIHx8IChkYXRhSWR4ID49IGRhdGEubGVuZ3RoKSkgeworICAgICAgICAgICAgaWYgKChjaGFubmVsT2Zmc2V0ID09IGNoYW5uZWxzIC0gMSAmJiBza2lwQWxwaGEpIHx8IChkYXRhSWR4ID49IGRhdGEubGVuZ3RoKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGxldmVsSW5pdGlhbGl6ZXIsIG9mZnNldCwgbGV2ZWxzLCBjaGFubmVsQmFzZSwgbkxldmVscyk7Ci0gICAgICAgICAgICBmb3IgKGludCBmcm9tPTAsIHRvPWNoYW5uZWxCYXNlOyBmcm9tPG5MZXZlbHM7IGZyb20rKywgdG8rKykgeworICAgICAgICAgICAgZm9yIChpbnQgZnJvbSA9IDAsIHRvID0gY2hhbm5lbEJhc2U7IGZyb20gPCBuTGV2ZWxzOyBmcm9tKyssIHRvKyspIHsKICAgICAgICAgICAgICAgICB2YWx1ZXNbdG9dID0gZGF0YVtkYXRhSWR4XVtmcm9tXSAmIDB4RkY7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTM4MCwxNiArMzk3LDE5IEBACiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyB0aGUgc2hvcnQgbGV2ZWxzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjaGFubmVscyB0aGUgY2hhbm5lbHMKLSAgICAgKiBAcGFyYW0gc2tpcEFscGhhIHRoZSBza2lwIGFscGhhCi0gICAgICogQHBhcmFtIGxldmVscyB0aGUgbGV2ZWxzCi0gICAgICogQHBhcmFtIHZhbHVlcyB0aGUgdmFsdWVzCi0gICAgICogQHBhcmFtIGNoYW5uZWxzT3JkZXIgdGhlIGNoYW5uZWxzIG9yZGVyCisgICAgICogQHBhcmFtIGNoYW5uZWxzCisgICAgICogICAgICAgICAgICB0aGUgY2hhbm5lbHMuCisgICAgICogQHBhcmFtIHNraXBBbHBoYQorICAgICAqICAgICAgICAgICAgdGhlIHNraXAgYWxwaGEuCisgICAgICogQHBhcmFtIGxldmVscworICAgICAqICAgICAgICAgICAgdGhlIGxldmVscy4KKyAgICAgKiBAcGFyYW0gdmFsdWVzCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWVzLgorICAgICAqIEBwYXJhbSBjaGFubmVsc09yZGVyCisgICAgICogICAgICAgICAgICB0aGUgY2hhbm5lbHMgb3JkZXIuCiAgICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGNyZWF0ZVNob3J0TGV2ZWxzKAotICAgICAgICAgICAgaW50IGNoYW5uZWxzLCBib29sZWFuIHNraXBBbHBoYSwKLSAgICAgICAgICAgIGludCBsZXZlbHNbXSwgaW50IHZhbHVlc1tdLCBpbnQgY2hhbm5lbHNPcmRlcltdCi0gICAgKSB7CisgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGNyZWF0ZVNob3J0TGV2ZWxzKGludCBjaGFubmVscywgYm9vbGVhbiBza2lwQWxwaGEsIGludCBsZXZlbHNbXSwKKyAgICAgICAgICAgIGludCB2YWx1ZXNbXSwgaW50IGNoYW5uZWxzT3JkZXJbXSkgewogICAgICAgICBzaG9ydCBkYXRhW11bXSA9ICgoU2hvcnRMb29rdXBUYWJsZSlsdXQpLmdldFRhYmxlKCk7CiAgICAgICAgIGludCBuTGV2ZWxzID0gZGF0YVswXS5sZW5ndGg7CiAgICAgICAgIGludCBvZmZzZXQgPSBsdXQuZ2V0T2Zmc2V0KCk7CkBAIC0zOTcsMTggKzQxNywxOCBAQAogICAgICAgICAvLyBVc2Ugb25lIGRhdGEgYXJyYXkgZm9yIGFsbCBjaGFubmVscyBvciB1c2Ugc2V2ZXJhbCBkYXRhIGFycmF5cwogICAgICAgICBpbnQgZGF0YUluY3JlbWVudCA9IGRhdGEubGVuZ3RoID4gMSA/IDEgOiAwOwogCi0gICAgICAgIGZvciAoaW50IGNoID0gMCwgZGF0YUlkeCA9IDA7IGNoPGNoYW5uZWxzOyBkYXRhSWR4Kz1kYXRhSW5jcmVtZW50LCBjaCsrKSB7CisgICAgICAgIGZvciAoaW50IGNoID0gMCwgZGF0YUlkeCA9IDA7IGNoIDwgY2hhbm5lbHM7IGRhdGFJZHggKz0gZGF0YUluY3JlbWVudCwgY2grKykgewogICAgICAgICAgICAgaW50IGNoYW5uZWxPZmZzZXQgPSBjaGFubmVsc09yZGVyID09IG51bGwgPyBjaCA6IGNoYW5uZWxzT3JkZXJbY2hdOwogCiAgICAgICAgICAgICAvLyBTa2lwIGxhc3QgY2hhbm5lbCBpZiBuZWVkZWQsIHplcm8gdmFsdWVzIGFyZSBPSyAtCiAgICAgICAgICAgICAvLyBubyBjaGFuZ2VzIHRvIHRoZSBjaGFubmVsIGluZm9ybWF0aW9uIHdpbGwgYmUgZG9uZSBpbiBJUFAKLSAgICAgICAgICAgIGlmICgoY2hhbm5lbE9mZnNldCA9PSBjaGFubmVscy0xICYmIHNraXBBbHBoYSkgfHwgKGRhdGFJZHggPj0gZGF0YS5sZW5ndGgpKSB7CisgICAgICAgICAgICBpZiAoKGNoYW5uZWxPZmZzZXQgPT0gY2hhbm5lbHMgLSAxICYmIHNraXBBbHBoYSkgfHwgKGRhdGFJZHggPj0gZGF0YS5sZW5ndGgpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludCBjaGFubmVsQmFzZSA9IG5MZXZlbHMgKiBjaGFubmVsT2Zmc2V0OwogICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShsZXZlbEluaXRpYWxpemVyLCBvZmZzZXQsIGxldmVscywgY2hhbm5lbEJhc2UsIG5MZXZlbHMpOwotICAgICAgICAgICAgZm9yIChpbnQgZnJvbT0wLCB0bz1jaGFubmVsQmFzZTsgZnJvbTxuTGV2ZWxzOyBmcm9tKyssIHRvKyspIHsKKyAgICAgICAgICAgIGZvciAoaW50IGZyb20gPSAwLCB0byA9IGNoYW5uZWxCYXNlOyBmcm9tIDwgbkxldmVsczsgZnJvbSsrLCB0bysrKSB7CiAgICAgICAgICAgICAgICAgdmFsdWVzW3RvXSA9IGRhdGFbZGF0YUlkeF1bZnJvbV0gJiAweEZGRkY7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTQxOCwxOCArNDM4LDE4IEBACiAgICAgLyoqCiAgICAgICogSXBwIGZpbHRlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3JjIHRoZSBzcmMKLSAgICAgKiBAcGFyYW0gZHN0IHRoZSBkc3QKLSAgICAgKiBAcGFyYW0gaW1hZ2VUeXBlIHRoZSBpbWFnZSB0eXBlCi0gICAgICogQHBhcmFtIHNraXBBbHBoYSB0aGUgc2tpcCBhbHBoYQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGludAorICAgICAqIEBwYXJhbSBzcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcmMuCisgICAgICogQHBhcmFtIGRzdAorICAgICAqICAgICAgICAgICAgdGhlIGRzdC4KKyAgICAgKiBAcGFyYW0gaW1hZ2VUeXBlCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgdHlwZS4KKyAgICAgKiBAcGFyYW0gc2tpcEFscGhhCisgICAgICogICAgICAgICAgICB0aGUgc2tpcCBhbHBoYS4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnQuCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgaXBwRmlsdGVyKAotICAgICAgICAgICAgUmFzdGVyIHNyYywgV3JpdGFibGVSYXN0ZXIgZHN0LAotICAgICAgICAgICAgaW50IGltYWdlVHlwZSwgYm9vbGVhbiBza2lwQWxwaGEKLSAgICApIHsKKyAgICBwcml2YXRlIGZpbmFsIGludCBpcHBGaWx0ZXIoUmFzdGVyIHNyYywgV3JpdGFibGVSYXN0ZXIgZHN0LCBpbnQgaW1hZ2VUeXBlLCBib29sZWFuIHNraXBBbHBoYSkgewogICAgICAgICBpbnQgcmVzOwogCiAgICAgICAgIGludCBzcmNTdHJpZGUsIGRzdFN0cmlkZTsKQEAgLTQ0Miw5ICs0NjIsMTEgQEAKICAgICAgICAgICAgIGNhc2UgQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9BUkdCX1BSRToKICAgICAgICAgICAgIGNhc2UgQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9SR0I6IHsKICAgICAgICAgICAgICAgICBjaGFubmVscyA9IDQ7Ci0gICAgICAgICAgICAgICAgc3JjU3RyaWRlID0gc3JjLmdldFdpZHRoKCkqNDsKLSAgICAgICAgICAgICAgICBkc3RTdHJpZGUgPSBkc3QuZ2V0V2lkdGgoKSo0OwotICAgICAgICAgICAgICAgIGNoYW5uZWxzT3JkZXIgPSBuZXcgaW50W10gezIsIDEsIDAsIDN9OworICAgICAgICAgICAgICAgIHNyY1N0cmlkZSA9IHNyYy5nZXRXaWR0aCgpICogNDsKKyAgICAgICAgICAgICAgICBkc3RTdHJpZGUgPSBkc3QuZ2V0V2lkdGgoKSAqIDQ7CisgICAgICAgICAgICAgICAgY2hhbm5lbHNPcmRlciA9IG5ldyBpbnRbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAyLCAxLCAwLCAzCisgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtNDUyLDggKzQ3NCw4IEBACiAgICAgICAgICAgICBjYXNlIEJ1ZmZlcmVkSW1hZ2UuVFlQRV80QllURV9BQkdSX1BSRToKICAgICAgICAgICAgIGNhc2UgQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9CR1I6IHsKICAgICAgICAgICAgICAgICBjaGFubmVscyA9IDQ7Ci0gICAgICAgICAgICAgICAgc3JjU3RyaWRlID0gc3JjLmdldFdpZHRoKCkqNDsKLSAgICAgICAgICAgICAgICBkc3RTdHJpZGUgPSBkc3QuZ2V0V2lkdGgoKSo0OworICAgICAgICAgICAgICAgIHNyY1N0cmlkZSA9IHNyYy5nZXRXaWR0aCgpICogNDsKKyAgICAgICAgICAgICAgICBkc3RTdHJpZGUgPSBkc3QuZ2V0V2lkdGgoKSAqIDQ7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTQ2Niw5ICs0ODgsMTEgQEAKIAogICAgICAgICAgICAgY2FzZSBCdWZmZXJlZEltYWdlLlRZUEVfM0JZVEVfQkdSOiB7CiAgICAgICAgICAgICAgICAgY2hhbm5lbHMgPSAzOwotICAgICAgICAgICAgICAgIHNyY1N0cmlkZSA9IHNyYy5nZXRXaWR0aCgpKjM7Ci0gICAgICAgICAgICAgICAgZHN0U3RyaWRlID0gZHN0LmdldFdpZHRoKCkqMzsKLSAgICAgICAgICAgICAgICBjaGFubmVsc09yZGVyID0gbmV3IGludFtdIHsyLCAxLCAwfTsKKyAgICAgICAgICAgICAgICBzcmNTdHJpZGUgPSBzcmMuZ2V0V2lkdGgoKSAqIDM7CisgICAgICAgICAgICAgICAgZHN0U3RyaWRlID0gZHN0LmdldFdpZHRoKCkgKiAzOworICAgICAgICAgICAgICAgIGNoYW5uZWxzT3JkZXIgPSBuZXcgaW50W10geworICAgICAgICAgICAgICAgICAgICAgICAgMiwgMSwgMAorICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTQ4MywxNSArNTA3LDExIEBACiAgICAgICAgICAgICAgICAgU2FtcGxlTW9kZWwgc3JjU00gPSBzcmMuZ2V0U2FtcGxlTW9kZWwoKTsKICAgICAgICAgICAgICAgICBTYW1wbGVNb2RlbCBkc3RTTSA9IGRzdC5nZXRTYW1wbGVNb2RlbCgpOwogCi0gICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgICAgICAgc3JjU00gaW5zdGFuY2VvZiBQaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdFNNIGluc3RhbmNlb2YgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsCi0gICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgaWYgKHNyY1NNIGluc3RhbmNlb2YgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBkc3RTTSBpbnN0YW5jZW9mIFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbCkgewogICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBQaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwKLSAgICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1NNLmdldERhdGFUeXBlKCkgIT0gRGF0YUJ1ZmZlci5UWVBFX0JZVEUgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RTTS5nZXREYXRhVHlwZSgpICE9IERhdGFCdWZmZXIuVFlQRV9CWVRFCi0gICAgICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3JjU00uZ2V0RGF0YVR5cGUoKSAhPSBEYXRhQnVmZmVyLlRZUEVfQllURQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRzdFNNLmdldERhdGFUeXBlKCkgIT0gRGF0YUJ1ZmZlci5UWVBFX0JZVEUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzbG93RmlsdGVyKHNyYywgZHN0LCBza2lwQWxwaGEpOwogICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTUwMSw0MCArNTIxLDMyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2xvd0ZpbHRlcihzcmMsIGRzdCwgc2tpcEFscGhhKTsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIHNyY1N0cmlkZSA9ICgoQ29tcG9uZW50U2FtcGxlTW9kZWwpIHNyY1NNKS5nZXRTY2FubGluZVN0cmlkZSgpOwotICAgICAgICAgICAgICAgICAgICBkc3RTdHJpZGUgPSAoKENvbXBvbmVudFNhbXBsZU1vZGVsKSBkc3RTTSkuZ2V0U2NhbmxpbmVTdHJpZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgc3JjU3RyaWRlID0gKChDb21wb25lbnRTYW1wbGVNb2RlbClzcmNTTSkuZ2V0U2NhbmxpbmVTdHJpZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgZHN0U3RyaWRlID0gKChDb21wb25lbnRTYW1wbGVNb2RlbClkc3RTTSkuZ2V0U2NhbmxpbmVTdHJpZGUoKTsKIAotICAgICAgICAgICAgICAgICAgICBjaGFubmVsc09yZGVyID0gKChDb21wb25lbnRTYW1wbGVNb2RlbCkgc3JjU00pLmdldEJhbmRPZmZzZXRzKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY1NNIGluc3RhbmNlb2YgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgZHN0U00gaW5zdGFuY2VvZiBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsCi0gICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzT3JkZXIgPSAoKENvbXBvbmVudFNhbXBsZU1vZGVsKXNyY1NNKS5nZXRCYW5kT2Zmc2V0cygpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjU00gaW5zdGFuY2VvZiBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBkc3RTTSBpbnN0YW5jZW9mIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbAotICAgICAgICAgICAgICAgICAgICBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIHNwcHNtMSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwpIHNyY1NNOwotICAgICAgICAgICAgICAgICAgICBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIHNwcHNtMiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwpIGRzdFNNOworICAgICAgICAgICAgICAgICAgICBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIHNwcHNtMSA9IChTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKXNyY1NNOworICAgICAgICAgICAgICAgICAgICBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIHNwcHNtMiA9IChTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKWRzdFNNOwogCiAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzID0gc3Bwc20xLmdldE51bUJhbmRzKCk7CiAKLSAgICAgICAgICAgICAgICAgICAgIC8vIFRZUEVfSU5UX1JHQiwgVFlQRV9JTlRfQVJHQi4uLgotICAgICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bwc20xLmdldERhdGFUeXBlKCkgIT0gRGF0YUJ1ZmZlci5UWVBFX0lOVCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcHNtMi5nZXREYXRhVHlwZSgpICE9IERhdGFCdWZmZXIuVFlQRV9JTlQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKGNoYW5uZWxzID09IDMgfHwgY2hhbm5lbHMgPT0gNCkKLSAgICAgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRZUEVfSU5UX1JHQiwgVFlQRV9JTlRfQVJHQi4uLgorICAgICAgICAgICAgICAgICAgICBpZiAoc3Bwc20xLmdldERhdGFUeXBlKCkgIT0gRGF0YUJ1ZmZlci5UWVBFX0lOVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHNwcHNtMi5nZXREYXRhVHlwZSgpICE9IERhdGFCdWZmZXIuVFlQRV9JTlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhKGNoYW5uZWxzID09IDMgfHwgY2hhbm5lbHMgPT0gNCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzbG93RmlsdGVyKHNyYywgZHN0LCBza2lwQWxwaGEpOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgY29tcGF0aWJpbGl0eSBvZiBzYW1wbGUgbW9kZWxzCi0gICAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhQXJyYXlzLmVxdWFscyhzcHBzbTEuZ2V0Qml0T2Zmc2V0cygpLCBzcHBzbTIuZ2V0Qml0T2Zmc2V0cygpKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFBcnJheXMuZXF1YWxzKHNwcHNtMS5nZXRCaXRNYXNrcygpLCBzcHBzbTIuZ2V0Qml0TWFza3MoKSkKLSAgICAgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghQXJyYXlzLmVxdWFscyhzcHBzbTEuZ2V0Qml0T2Zmc2V0cygpLCBzcHBzbTIuZ2V0Qml0T2Zmc2V0cygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFBcnJheXMuZXF1YWxzKHNwcHNtMS5nZXRCaXRNYXNrcygpLCBzcHBzbTIuZ2V0Qml0TWFza3MoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzbG93RmlsdGVyKHNyYywgZHN0LCBza2lwQWxwaGEpOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3Bwc20xLmdldFNhbXBsZVNpemUoaSkgIT0gOCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzbG93RmlsdGVyKHNyYywgZHN0LCBza2lwQWxwaGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNTQyLDExICs1NTQsMTIgQEAKIAogICAgICAgICAgICAgICAgICAgICBjaGFubmVsc09yZGVyID0gbmV3IGludFtjaGFubmVsc107CiAgICAgICAgICAgICAgICAgICAgIGludCBiaXRPZmZzZXRzW10gPSBzcHBzbTEuZ2V0Qml0T2Zmc2V0cygpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8Y2hhbm5lbHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzT3JkZXJbaV0gPSBiaXRPZmZzZXRzW2ldIC8gODsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIGlmIChjaGFubmVscyA9PSAzKSB7IC8vIERvbid0IHNraXAgY2hhbm5lbCBub3csIGNvdWxkIGJlIG9wdGltaXplZAorICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbHMgPT0gMykgeyAvLyBEb24ndCBza2lwIGNoYW5uZWwgbm93LCBjb3VsZCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW1pemVkCiAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscyA9IDQ7CiAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtNTU4LDEyICs1NzEsOSBAQAogCiAgICAgICAgICAgICAgICAgLy8gRmlsbCBvZmZzZXRzIGlmIHRoZXJlJ3MgYSBjaGlsZCByYXN0ZXIKICAgICAgICAgICAgICAgICBpZiAoc3JjLmdldFBhcmVudCgpICE9IG51bGwgfHwgZHN0LmdldFBhcmVudCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVgoKSAhPSAwIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWSgpICE9IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVYKCkgIT0gMCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVkoKSAhPSAwCi0gICAgICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3JjLmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWCgpICE9IDAgfHwgc3JjLmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWSgpICE9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBkc3QuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVYKCkgIT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRzdC5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVkoKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRzID0gbmV3IGludFs0XTsKICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldHNbMF0gPSAtc3JjLmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWCgpICsgc3JjLmdldE1pblgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldHNbMV0gPSAtc3JjLmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWSgpICsgc3JjLmdldE1pblkoKTsKQEAgLTU3NiwyNCArNTg2LDI1IEBACiAKICAgICAgICAgaW50IGxldmVsc1tdID0gbnVsbCwgdmFsdWVzW10gPSBudWxsOwogICAgICAgICBpbnQgY2hhbm5lbE11bHRpcGxpZXIgPSBza2lwQWxwaGEgPyAtMSA6IDE7Ci0gICAgICAgIGlmIChjaGFubmVsTXVsdGlwbGllcipjaGFubmVscyA9PSB2YWxpZEZvckNoYW5uZWxzKSB7IC8vIHVzZSBleGlzdGluZyBsZXZlbHMvdmFsdWVzCisgICAgICAgIGlmIChjaGFubmVsTXVsdGlwbGllciAqIGNoYW5uZWxzID09IHZhbGlkRm9yQ2hhbm5lbHMpIHsgLy8gdXNlIGV4aXN0aW5nCisgICAgICAgICAgICAvLyBsZXZlbHMvdmFsdWVzCiAgICAgICAgICAgICBsZXZlbHMgPSBjYWNoZWRMZXZlbHM7CiAgICAgICAgICAgICB2YWx1ZXMgPSBjYWNoZWRWYWx1ZXM7CiAgICAgICAgIH0gZWxzZSB7IC8vIGNyZWF0ZSBuZXcgbGV2ZWxzL3ZhbHVlcwogICAgICAgICAgICAgaWYgKGx1dCBpbnN0YW5jZW9mIEJ5dGVMb29rdXBUYWJsZSkgewogICAgICAgICAgICAgICAgIGJ5dGUgZGF0YVtdW10gPSAoKEJ5dGVMb29rdXBUYWJsZSlsdXQpLmdldFRhYmxlKCk7Ci0gICAgICAgICAgICAgICAgbGV2ZWxzID0gbmV3IGludFtjaGFubmVscypkYXRhWzBdLmxlbmd0aF07Ci0gICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IGludFtjaGFubmVscypkYXRhWzBdLmxlbmd0aF07CisgICAgICAgICAgICAgICAgbGV2ZWxzID0gbmV3IGludFtjaGFubmVscyAqIGRhdGFbMF0ubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgaW50W2NoYW5uZWxzICogZGF0YVswXS5sZW5ndGhdOwogICAgICAgICAgICAgICAgIGNyZWF0ZUJ5dGVMZXZlbHMoY2hhbm5lbHMsIHNraXBBbHBoYSwgbGV2ZWxzLCB2YWx1ZXMsIGNoYW5uZWxzT3JkZXIpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChsdXQgaW5zdGFuY2VvZiBTaG9ydExvb2t1cFRhYmxlKSB7CiAgICAgICAgICAgICAgICAgc2hvcnQgZGF0YVtdW10gPSAoKFNob3J0TG9va3VwVGFibGUpbHV0KS5nZXRUYWJsZSgpOwotICAgICAgICAgICAgICAgIGxldmVscyA9IG5ldyBpbnRbY2hhbm5lbHMqZGF0YVswXS5sZW5ndGhdOwotICAgICAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBpbnRbY2hhbm5lbHMqZGF0YVswXS5sZW5ndGhdOworICAgICAgICAgICAgICAgIGxldmVscyA9IG5ldyBpbnRbY2hhbm5lbHMgKiBkYXRhWzBdLmxlbmd0aF07CisgICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IGludFtjaGFubmVscyAqIGRhdGFbMF0ubGVuZ3RoXTsKICAgICAgICAgICAgICAgICBjcmVhdGVTaG9ydExldmVscyhjaGFubmVscywgc2tpcEFscGhhLCBsZXZlbHMsIHZhbHVlcywgY2hhbm5lbHNPcmRlcik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIGNhY2hlIGxldmVscy92YWx1ZXMKLSAgICAgICAgICAgIHZhbGlkRm9yQ2hhbm5lbHMgPSBjaGFubmVsTXVsdGlwbGllcipjaGFubmVsczsKKyAgICAgICAgICAgIHZhbGlkRm9yQ2hhbm5lbHMgPSBjaGFubmVsTXVsdGlwbGllciAqIGNoYW5uZWxzOwogICAgICAgICAgICAgY2FjaGVkTGV2ZWxzID0gbGV2ZWxzOwogICAgICAgICAgICAgY2FjaGVkVmFsdWVzID0gdmFsdWVzOwogICAgICAgICB9CkBAIC02MDcsMTMgKzYxOCw4IEBACiAgICAgICAgICAgICByZXR1cm4gLTE7IC8vIFVua25vd24gZGF0YSBidWZmZXIgdHlwZQogICAgICAgICB9CiAKLSAgICAgICAgcmVzID0gaXBwTFVUKAotICAgICAgICAgICAgc3JjRGF0YSwgc3JjLmdldFdpZHRoKCksIHNyYy5nZXRIZWlnaHQoKSwgc3JjU3RyaWRlLAotICAgICAgICAgICAgZHN0RGF0YSwgZHN0LmdldFdpZHRoKCksIGRzdC5nZXRIZWlnaHQoKSwgZHN0U3RyaWRlLAotICAgICAgICAgICAgbGV2ZWxzLCB2YWx1ZXMsCi0gICAgICAgICAgICBjaGFubmVscywgb2Zmc2V0cywKLSAgICAgICAgICAgIGZhbHNlCi0gICAgICAgICk7CisgICAgICAgIHJlcyA9IGlwcExVVChzcmNEYXRhLCBzcmMuZ2V0V2lkdGgoKSwgc3JjLmdldEhlaWdodCgpLCBzcmNTdHJpZGUsIGRzdERhdGEsIGRzdC5nZXRXaWR0aCgpLAorICAgICAgICAgICAgICAgIGRzdC5nZXRIZWlnaHQoKSwgZHN0U3RyaWRlLCBsZXZlbHMsIHZhbHVlcywgY2hhbm5lbHMsIG9mZnNldHMsIGZhbHNlKTsKIAogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KQEAgLTYyMSwyNyArNjI3LDM1IEBACiAgICAgLyoqCiAgICAgICogSXBwIGx1dC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3JjIHRoZSBzcmMKLSAgICAgKiBAcGFyYW0gc3JjV2lkdGggdGhlIHNyYyB3aWR0aAotICAgICAqIEBwYXJhbSBzcmNIZWlnaHQgdGhlIHNyYyBoZWlnaHQKLSAgICAgKiBAcGFyYW0gc3JjU3RyaWRlIHRoZSBzcmMgc3RyaWRlCi0gICAgICogQHBhcmFtIGRzdCB0aGUgZHN0Ci0gICAgICogQHBhcmFtIGRzdFdpZHRoIHRoZSBkc3Qgd2lkdGgKLSAgICAgKiBAcGFyYW0gZHN0SGVpZ2h0IHRoZSBkc3QgaGVpZ2h0Ci0gICAgICogQHBhcmFtIGRzdFN0cmlkZSB0aGUgZHN0IHN0cmlkZQotICAgICAqIEBwYXJhbSBsZXZlbHMgdGhlIGxldmVscwotICAgICAqIEBwYXJhbSB2YWx1ZXMgdGhlIHZhbHVlcwotICAgICAqIEBwYXJhbSBjaGFubmVscyB0aGUgY2hhbm5lbHMKLSAgICAgKiBAcGFyYW0gb2Zmc2V0cyB0aGUgb2Zmc2V0cwotICAgICAqIEBwYXJhbSBsaW5lYXIgdGhlIGxpbmVhcgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGludAorICAgICAqIEBwYXJhbSBzcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcmMuCisgICAgICogQHBhcmFtIHNyY1dpZHRoCisgICAgICogICAgICAgICAgICB0aGUgc3JjIHdpZHRoLgorICAgICAqIEBwYXJhbSBzcmNIZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcmMgaGVpZ2h0LgorICAgICAqIEBwYXJhbSBzcmNTdHJpZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcmMgc3RyaWRlLgorICAgICAqIEBwYXJhbSBkc3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBkc3QuCisgICAgICogQHBhcmFtIGRzdFdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgZHN0IHdpZHRoLgorICAgICAqIEBwYXJhbSBkc3RIZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBkc3QgaGVpZ2h0LgorICAgICAqIEBwYXJhbSBkc3RTdHJpZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkc3Qgc3RyaWRlLgorICAgICAqIEBwYXJhbSBsZXZlbHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZXZlbHMuCisgICAgICogQHBhcmFtIHZhbHVlcworICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlcy4KKyAgICAgKiBAcGFyYW0gY2hhbm5lbHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFubmVscy4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0cworICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldHMuCisgICAgICogQHBhcmFtIGxpbmVhcgorICAgICAqICAgICAgICAgICAgdGhlIGxpbmVhci4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnQuCiAgICAgICovCi0gICAgZmluYWwgc3RhdGljIG5hdGl2ZSBpbnQgaXBwTFVUKAotICAgICAgICAgICAgT2JqZWN0IHNyYywgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LCBpbnQgc3JjU3RyaWRlLAotICAgICAgICAgICAgT2JqZWN0IGRzdCwgaW50IGRzdFdpZHRoLCBpbnQgZHN0SGVpZ2h0LCBpbnQgZHN0U3RyaWRlLAotICAgICAgICAgICAgaW50IGxldmVsc1tdLCBpbnQgdmFsdWVzW10sCi0gICAgICAgICAgICBpbnQgY2hhbm5lbHMsIGludCBvZmZzZXRzW10sCi0gICAgICAgICAgICBib29sZWFuIGxpbmVhcgotICAgICk7CisgICAgZmluYWwgc3RhdGljIG5hdGl2ZSBpbnQgaXBwTFVUKE9iamVjdCBzcmMsIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwgaW50IHNyY1N0cmlkZSwKKyAgICAgICAgICAgIE9iamVjdCBkc3QsIGludCBkc3RXaWR0aCwgaW50IGRzdEhlaWdodCwgaW50IGRzdFN0cmlkZSwgaW50IGxldmVsc1tdLCBpbnQgdmFsdWVzW10sCisgICAgICAgICAgICBpbnQgY2hhbm5lbHMsIGludCBvZmZzZXRzW10sIGJvb2xlYW4gbGluZWFyKTsKIH0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9Mb29rdXBUYWJsZS5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL0xvb2t1cFRhYmxlLmphdmEKaW5kZXggZDE1ZjIzYy4uZTQ2NWE1NCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL0xvb2t1cFRhYmxlLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL0xvb2t1cFRhYmxlLmphdmEKQEAgLTI2LDI2ICsyNiwzMyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFRoaXMgYWJzdHJhY3QgTG9va3VwVGFibGUgY2xhc3MgcmVwcmVzZW50cyBsb29rdXAgdGFibGUgd2hpY2gKLSAqIGlzIGRlZmluZWQgd2l0aCB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgYW5kIG9mZnNldCB2YWx1ZS4KLSAqIEJ5dGVMb29rdXBUYWJsZSBhbmQgU2hvcnRMb29rdXBUYWJsZSBjbGFzc2VzIGFyZSBzdWJjbGFzc2VzIG9mCi0gKiBMb29rdXBUYWJsZSB3aGljaCBjb250YWlucyBieXRlIGFuZCBzaG9ydCBkYXRhIHRhYmxlcyBhcwotICogYW4gaW5wdXQgYXJyYXlzIGZvciBiYW5kcyBvciBjb21wb25lbnRzIG9mIGltYWdlLgorICogVGhpcyBhYnN0cmFjdCBMb29rdXBUYWJsZSBjbGFzcyByZXByZXNlbnRzIGxvb2t1cCB0YWJsZSB3aGljaCBpcyBkZWZpbmVkIHdpdGgKKyAqIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cyBhbmQgb2Zmc2V0IHZhbHVlLiBCeXRlTG9va3VwVGFibGUgYW5kCisgKiBTaG9ydExvb2t1cFRhYmxlIGNsYXNzZXMgYXJlIHN1YmNsYXNzZXMgb2YgTG9va3VwVGFibGUgd2hpY2ggY29udGFpbnMgYnl0ZQorICogYW5kIHNob3J0IGRhdGEgdGFibGVzIGFzIGFuIGlucHV0IGFycmF5cyBmb3IgYmFuZHMgb3IgY29tcG9uZW50cyBvZiBpbWFnZS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMb29rdXBUYWJsZSB7Ci0gICAgCi0gICAgLyoqIFRoZSBvZmZzZXQuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgb2Zmc2V0LgorICAgICAqLwogICAgIHByaXZhdGUgaW50IG9mZnNldDsKLSAgICAKLSAgICAvKiogVGhlIG51bSBjb21wb25lbnRzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIG51bSBjb21wb25lbnRzLgorICAgICAqLwogICAgIHByaXZhdGUgaW50IG51bUNvbXBvbmVudHM7CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgTG9va3VwVGFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG9mZnNldCB2YWx1ZQotICAgICAqIGFuZCBudW1iZXIgb2YgY29tcG9uZW50cy4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgTG9va3VwVGFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG9mZnNldCB2YWx1ZSBhbmQgbnVtYmVyCisgICAgICogb2YgY29tcG9uZW50cy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdmFsdWUuCi0gICAgICogQHBhcmFtIG51bUNvbXBvbmVudHMgdGhlIG51bWJlciBvZiBjb21wb25lbnRzLgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgdmFsdWUuCisgICAgICogQHBhcmFtIG51bUNvbXBvbmVudHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cy4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgTG9va3VwVGFibGUoaW50IG9mZnNldCwgaW50IG51bUNvbXBvbmVudHMpIHsKICAgICAgICAgaWYgKG9mZnNldCA8IDApIHsKQEAgLTgwLDE0ICs4NywxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSBpbnQgYXJyYXkgd2hpY2ggY29udGFpbnMgc2FtcGxlcyBvZiB0aGUgc3BlY2lmaWVkCi0gICAgICogcGl4ZWwgd2hpY2ggaXMgdHJhbnNsYXRlZCB3aXRoIHRoZSBsb29rdXAgdGFibGUgb2YgdGhpcyAKLSAgICAgKiBMb29rdXBUYWJsZS4gVGhlIHJlc3VsdGVkIGFycmF5IGlzIHN0b3JlZCB0byB0aGUgZHN0IGFycmF5LgorICAgICAqIFJldHVybnMgYW4gaW50ZWdlciBhcnJheSB3aGljaCBjb250YWlucyBzYW1wbGVzIG9mIHRoZSBzcGVjaWZpZWQgcGl4ZWwgd2hpY2gKKyAgICAgKiBpcyB0cmFuc2xhdGVkIHdpdGggdGhlIGxvb2t1cCB0YWJsZSBvZiB0aGlzIExvb2t1cFRhYmxlLiBUaGUgcmVzdWx0ZWQKKyAgICAgKiBhcnJheSBpcyBzdG9yZWQgdG8gdGhlIGRzdCBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3JjIHRoZSBzb3VyY2UgYXJyYXkuCi0gICAgICogQHBhcmFtIGRzdCB0aGUgZGVzdGluYXRpb24gYXJyYXkgd2hlcmUgdGhlIHJlc3VsdCBjYW4gYmUgc3RvcmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGludCBhcnJheSBvZiB0cmFuc2xhdGVkIHNhbXBsZXMgb2YgYSBwaXhlbC4KKyAgICAgKiBAcGFyYW0gc3JjCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIGFycmF5LgorICAgICAqIEBwYXJhbSBkc3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiBhcnJheSB3aGVyZSB0aGUgcmVzdWx0IGNhbiBiZSBzdG9yZWQuCisgICAgICogQHJldHVybiB0aGUgaW50ZWdlciBhcnJheSBvZiB0cmFuc2xhdGVkIHNhbXBsZXMgb2YgYSBwaXhlbC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50W10gbG9va3VwUGl4ZWwoaW50W10gc3JjLCBpbnRbXSBkc3QpOwogfQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL01lbW9yeUltYWdlU291cmNlLmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvTWVtb3J5SW1hZ2VTb3VyY2UuamF2YQppbmRleCA5ODNmMTllLi42NDRmZDQwIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvTWVtb3J5SW1hZ2VTb3VyY2UuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvTWVtb3J5SW1hZ2VTb3VyY2UuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBJZ29yIFYuIFN0b2x5YXJvdgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuaW1hZ2U7CiAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwpAQCAtMjYsMTU0ICsyNywyMTEgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBUaGUgTWVtb3J5SW1hZ2VTb3VyY2UgY2xhc3MgaXMgdXNlZCB0byBwcm9kdWNlcyBwaXhlbHMgb2YgYW4gaW1hZ2UgZnJvbQotICogYW4gYXJyYXkuIFRoaXMgY2xhc3MgY2FuIG1hbmFnZSBhIG1lbW9yeSBpbWFnZSB3aGljaCAKLSAqIGNvbnRhaW5zIGFuIGFuaW1hdGlvbiBvciBjdXN0b20gcmVuZGVyaW5nLgorICogVGhlIE1lbW9yeUltYWdlU291cmNlIGNsYXNzIGlzIHVzZWQgdG8gcHJvZHVjZXMgcGl4ZWxzIG9mIGFuIGltYWdlIGZyb20gYW4KKyAqIGFycmF5LiBUaGlzIGNsYXNzIGNhbiBtYW5hZ2UgYSBtZW1vcnkgaW1hZ2Ugd2hpY2ggY29udGFpbnMgYW4gYW5pbWF0aW9uIG9yCisgKiBjdXN0b20gcmVuZGVyaW5nLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIE1lbW9yeUltYWdlU291cmNlIGltcGxlbWVudHMgSW1hZ2VQcm9kdWNlciB7CiAKLSAgICAvKiogVGhlIHdpZHRoLiAqLworICAgIC8qKgorICAgICAqIFRoZSB3aWR0aC4KKyAgICAgKi8KICAgICBpbnQgd2lkdGg7Ci0gICAgCi0gICAgLyoqIFRoZSBoZWlnaHQuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgaGVpZ2h0LgorICAgICAqLwogICAgIGludCBoZWlnaHQ7Ci0gICAgCi0gICAgLyoqIFRoZSBjbS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBjbS4KKyAgICAgKi8KICAgICBDb2xvck1vZGVsIGNtOwotICAgIAotICAgIC8qKiBUaGUgYiBkYXRhLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGIgZGF0YS4KKyAgICAgKi8KICAgICBieXRlIGJEYXRhW107Ci0gICAgCi0gICAgLyoqIFRoZSBpIGRhdGEuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgaSBkYXRhLgorICAgICAqLwogICAgIGludCBpRGF0YVtdOwotICAgIAotICAgIC8qKiBUaGUgb2Zmc2V0LiAqLworCisgICAgLyoqCisgICAgICogVGhlIG9mZnNldC4KKyAgICAgKi8KICAgICBpbnQgb2Zmc2V0OwotICAgIAotICAgIC8qKiBUaGUgc2NhbmxpbmUuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2NhbmxpbmUuCisgICAgICovCiAgICAgaW50IHNjYW5saW5lOwotICAgIAotICAgIC8qKiBUaGUgcHJvcGVydGllcy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBwcm9wZXJ0aWVzLgorICAgICAqLwogICAgIEhhc2h0YWJsZTw/LCA/PiBwcm9wZXJ0aWVzOwotICAgIAotICAgIC8qKiBUaGUgY29uc3VtZXJzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGNvbnN1bWVycy4KKyAgICAgKi8KICAgICBWZWN0b3I8SW1hZ2VDb25zdW1lcj4gY29uc3VtZXJzOwotICAgIAotICAgIC8qKiBUaGUgYW5pbWF0ZWQuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgYW5pbWF0ZWQuCisgICAgICovCiAgICAgYm9vbGVhbiBhbmltYXRlZDsKLSAgICAKLSAgICAvKiogVGhlIGZ1bGxidWZmZXJzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGZ1bGxidWZmZXJzLgorICAgICAqLwogICAgIGJvb2xlYW4gZnVsbGJ1ZmZlcnM7Ci0gICAgCi0gICAgLyoqIFRoZSBkYXRhIHR5cGUuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGF0YSB0eXBlLgorICAgICAqLwogICAgIGludCBkYXRhVHlwZTsKIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgREFUQV9UWVBFX0JZVEUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IERBVEFfVFlQRV9CWVRFLgorICAgICAqLwogICAgIHN0YXRpYyBmaW5hbCBpbnQgREFUQV9UWVBFX0JZVEUgPSAwOwotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgREFUQV9UWVBFX0lOVC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBEQVRBX1RZUEVfSU5ULgorICAgICAqLwogICAgIHN0YXRpYyBmaW5hbCBpbnQgREFUQV9UWVBFX0lOVCA9IDE7CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgTWVtb3J5SW1hZ2VTb3VyY2Ugd2l0aCB0aGUgc3BlY2lmaWVkCi0gICAgICogcGFyYW1ldGVycy4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgTWVtb3J5SW1hZ2VTb3VyY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gY20gdGhlIHNwZWNpZmllZCBDb2xvck1vZGVsLgotICAgICAqIEBwYXJhbSBwaXggdGhlIHBpeGVsIGFycmF5LgotICAgICAqIEBwYXJhbSBvZmYgdGhlIG9mZnNldCBpbiB0aGUgcGl4ZWwgYXJyYXkuCi0gICAgICogQHBhcmFtIHNjYW4gdGhlIGRpc3RhbmNlIGZyb20gb25lIHBpeGVsJ3Mgcm93IHRvIHRoZSBuZXh0IAotICAgICAqIGluIHRoZSBwaXhlbCBhcnJheS4KLSAgICAgKiBAcGFyYW0gcHJvcHMgdGhlIHNldCBvZiBwcm9wZXJ0aWVzIHRvIGJlIHVzZWQgZm9yIGltYWdlCi0gICAgICogcHJvY2Vzc2luZy4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIGNtCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIENvbG9yTW9kZWwuCisgICAgICogQHBhcmFtIHBpeAorICAgICAqICAgICAgICAgICAgdGhlIHBpeGVsIGFycmF5LgorICAgICAqIEBwYXJhbSBvZmYKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gdGhlIHBpeGVsIGFycmF5LgorICAgICAqIEBwYXJhbSBzY2FuCisgICAgICogICAgICAgICAgICB0aGUgZGlzdGFuY2UgZnJvbSBvbmUgcGl4ZWwncyByb3cgdG8gdGhlIG5leHQgaW4gdGhlIHBpeGVsCisgICAgICogICAgICAgICAgICBhcnJheS4KKyAgICAgKiBAcGFyYW0gcHJvcHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZXQgb2YgcHJvcGVydGllcyB0byBiZSB1c2VkIGZvciBpbWFnZSBwcm9jZXNzaW5nLgogICAgICAqLwotICAgIHB1YmxpYyBNZW1vcnlJbWFnZVNvdXJjZShpbnQgdywgaW50IGgsIENvbG9yTW9kZWwgY20sIGludCBwaXhbXSwKLSAgICAgICAgICAgIGludCBvZmYsIGludCBzY2FuLCBIYXNodGFibGU8PywgPz4gcHJvcHMpIHsKLSAgICAgICAgaW5pdCh3LCBoLCBjbSwgcGl4LCBvZmYsIHNjYW4sIHByb3BzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgTWVtb3J5SW1hZ2VTb3VyY2Ugd2l0aCB0aGUgc3BlY2lmaWVkCi0gICAgICogcGFyYW1ldGVycy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSBjbSB0aGUgc3BlY2lmaWVkIENvbG9yTW9kZWwuCi0gICAgICogQHBhcmFtIHBpeCB0aGUgcGl4ZWwgYXJyYXkuCi0gICAgICogQHBhcmFtIG9mZiB0aGUgb2Zmc2V0IGluIHRoZSBwaXhlbCBhcnJheS4KLSAgICAgKiBAcGFyYW0gc2NhbiB0aGUgZGlzdGFuY2UgZnJvbSBvbmUgcGl4ZWwncyByb3cgdG8gdGhlIG5leHQgCi0gICAgICogaW4gdGhlIHBpeGVsIGFycmF5LgotICAgICAqIEBwYXJhbSBwcm9wcyB0aGUgc2V0IG9mIHByb3BlcnRpZXMgdG8gYmUgdXNlZCBmb3IgaW1hZ2UKLSAgICAgKiBwcm9jZXNzaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBNZW1vcnlJbWFnZVNvdXJjZShpbnQgdywgaW50IGgsIENvbG9yTW9kZWwgY20sIGJ5dGUgcGl4W10sCi0gICAgICAgICAgICBpbnQgb2ZmLCBpbnQgc2NhbiwgSGFzaHRhYmxlPD8sID8+IHByb3BzKSB7Ci0gICAgICAgIGluaXQodywgaCwgY20sIHBpeCwgb2ZmLCBzY2FuLCBwcm9wcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IE1lbW9yeUltYWdlU291cmNlIHdpdGggdGhlIHNwZWNpZmllZAotICAgICAqIHBhcmFtZXRlcnMgYW5kIGRlZmF1bHQgUkdCIENvbG9yTW9kZWwuCi0gICAgICogCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gcGl4IHRoZSBwaXhlbCBhcnJheS4KLSAgICAgKiBAcGFyYW0gb2ZmIHRoZSBvZmZzZXQgaW4gdGhlIHBpeGVsIGFycmF5LgotICAgICAqIEBwYXJhbSBzY2FuIHRoZSBkaXN0YW5jZSBmcm9tIG9uZSBwaXhlbCdzIHJvdyB0byB0aGUgbmV4dCAKLSAgICAgKiBpbiB0aGUgcGl4ZWwgYXJyYXkuCi0gICAgICogQHBhcmFtIHByb3BzIHRoZSBzZXQgb2YgcHJvcGVydGllcyB0byBiZSB1c2VkIGZvciBpbWFnZQotICAgICAqIHByb2Nlc3NpbmcuCi0gICAgICovCi0gICAgcHVibGljIE1lbW9yeUltYWdlU291cmNlKGludCB3LCBpbnQgaCwgaW50IHBpeFtdLCBpbnQgb2ZmLCBpbnQgc2NhbiwKKyAgICBwdWJsaWMgTWVtb3J5SW1hZ2VTb3VyY2UoaW50IHcsIGludCBoLCBDb2xvck1vZGVsIGNtLCBpbnQgcGl4W10sIGludCBvZmYsIGludCBzY2FuLAogICAgICAgICAgICAgSGFzaHRhYmxlPD8sID8+IHByb3BzKSB7CisgICAgICAgIGluaXQodywgaCwgY20sIHBpeCwgb2ZmLCBzY2FuLCBwcm9wcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IE1lbW9yeUltYWdlU291cmNlIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgorICAgICAqIAorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gY20KKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgQ29sb3JNb2RlbC4KKyAgICAgKiBAcGFyYW0gcGl4CisgICAgICogICAgICAgICAgICB0aGUgcGl4ZWwgYXJyYXkuCisgICAgICogQHBhcmFtIG9mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgcGl4ZWwgYXJyYXkuCisgICAgICogQHBhcmFtIHNjYW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBkaXN0YW5jZSBmcm9tIG9uZSBwaXhlbCdzIHJvdyB0byB0aGUgbmV4dCBpbiB0aGUgcGl4ZWwKKyAgICAgKiAgICAgICAgICAgIGFycmF5LgorICAgICAqIEBwYXJhbSBwcm9wcworICAgICAqICAgICAgICAgICAgdGhlIHNldCBvZiBwcm9wZXJ0aWVzIHRvIGJlIHVzZWQgZm9yIGltYWdlIHByb2Nlc3NpbmcuCisgICAgICovCisgICAgcHVibGljIE1lbW9yeUltYWdlU291cmNlKGludCB3LCBpbnQgaCwgQ29sb3JNb2RlbCBjbSwgYnl0ZSBwaXhbXSwgaW50IG9mZiwgaW50IHNjYW4sCisgICAgICAgICAgICBIYXNodGFibGU8PywgPz4gcHJvcHMpIHsKKyAgICAgICAgaW5pdCh3LCBoLCBjbSwgcGl4LCBvZmYsIHNjYW4sIHByb3BzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgTWVtb3J5SW1hZ2VTb3VyY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgYW5kCisgICAgICogZGVmYXVsdCBSR0IgQ29sb3JNb2RlbC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIHBpeAorICAgICAqICAgICAgICAgICAgdGhlIHBpeGVsIGFycmF5LgorICAgICAqIEBwYXJhbSBvZmYKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgaW4gdGhlIHBpeGVsIGFycmF5LgorICAgICAqIEBwYXJhbSBzY2FuCisgICAgICogICAgICAgICAgICB0aGUgZGlzdGFuY2UgZnJvbSBvbmUgcGl4ZWwncyByb3cgdG8gdGhlIG5leHQgaW4gdGhlIHBpeGVsCisgICAgICogICAgICAgICAgICBhcnJheS4KKyAgICAgKiBAcGFyYW0gcHJvcHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZXQgb2YgcHJvcGVydGllcyB0byBiZSB1c2VkIGZvciBpbWFnZSBwcm9jZXNzaW5nLgorICAgICAqLworICAgIHB1YmxpYyBNZW1vcnlJbWFnZVNvdXJjZShpbnQgdywgaW50IGgsIGludCBwaXhbXSwgaW50IG9mZiwgaW50IHNjYW4sIEhhc2h0YWJsZTw/LCA/PiBwcm9wcykgewogICAgICAgICBpbml0KHcsIGgsIENvbG9yTW9kZWwuZ2V0UkdCZGVmYXVsdCgpLCBwaXgsIG9mZiwgc2NhbiwgcHJvcHMpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBNZW1vcnlJbWFnZVNvdXJjZSB3aXRoIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBwYXJhbWV0ZXJzLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBNZW1vcnlJbWFnZVNvdXJjZSB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSBjbSB0aGUgc3BlY2lmaWVkIENvbG9yTW9kZWwuCi0gICAgICogQHBhcmFtIHBpeCB0aGUgcGl4ZWwgYXJyYXkuCi0gICAgICogQHBhcmFtIG9mZiB0aGUgb2Zmc2V0IGluIHRoZSBwaXhlbCBhcnJheS4KLSAgICAgKiBAcGFyYW0gc2NhbiB0aGUgZGlzdGFuY2UgZnJvbSBvbmUgcGl4ZWwncyByb3cgdG8gdGhlIG5leHQgCi0gICAgICogaW4gdGhlIHBpeGVsIGFycmF5LgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gY20KKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgQ29sb3JNb2RlbC4KKyAgICAgKiBAcGFyYW0gcGl4CisgICAgICogICAgICAgICAgICB0aGUgcGl4ZWwgYXJyYXkuCisgICAgICogQHBhcmFtIG9mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgcGl4ZWwgYXJyYXkuCisgICAgICogQHBhcmFtIHNjYW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBkaXN0YW5jZSBmcm9tIG9uZSBwaXhlbCdzIHJvdyB0byB0aGUgbmV4dCBpbiB0aGUgcGl4ZWwKKyAgICAgKiAgICAgICAgICAgIGFycmF5LgogICAgICAqLwotICAgIHB1YmxpYyBNZW1vcnlJbWFnZVNvdXJjZShpbnQgdywgaW50IGgsIENvbG9yTW9kZWwgY20sIGludCBwaXhbXSwKLSAgICAgICAgICAgIGludCBvZmYsIGludCBzY2FuKSB7CisgICAgcHVibGljIE1lbW9yeUltYWdlU291cmNlKGludCB3LCBpbnQgaCwgQ29sb3JNb2RlbCBjbSwgaW50IHBpeFtdLCBpbnQgb2ZmLCBpbnQgc2NhbikgewogICAgICAgICBpbml0KHcsIGgsIGNtLCBwaXgsIG9mZiwgc2NhbiwgbnVsbCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IE1lbW9yeUltYWdlU291cmNlIHdpdGggdGhlIHNwZWNpZmllZAotICAgICAqIHBhcmFtZXRlcnMuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IE1lbW9yeUltYWdlU291cmNlIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIGNtIHRoZSBzcGVjaWZpZWQgQ29sb3JNb2RlbC4KLSAgICAgKiBAcGFyYW0gcGl4IHRoZSBwaXhlbCBhcnJheS4KLSAgICAgKiBAcGFyYW0gb2ZmIHRoZSBvZmZzZXQgaW4gdGhlIHBpeGVsIGFycmF5LgotICAgICAqIEBwYXJhbSBzY2FuIHRoZSBkaXN0YW5jZSBmcm9tIG9uZSBwaXhlbCdzIHJvdyB0byB0aGUgbmV4dCAKLSAgICAgKiBpbiB0aGUgcGl4ZWwgYXJyYXkuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBjbQorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBDb2xvck1vZGVsLgorICAgICAqIEBwYXJhbSBwaXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBwaXhlbCBhcnJheS4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSBwaXhlbCBhcnJheS4KKyAgICAgKiBAcGFyYW0gc2NhbgorICAgICAqICAgICAgICAgICAgdGhlIGRpc3RhbmNlIGZyb20gb25lIHBpeGVsJ3Mgcm93IHRvIHRoZSBuZXh0IGluIHRoZSBwaXhlbAorICAgICAqICAgICAgICAgICAgYXJyYXkuCiAgICAgICovCi0gICAgcHVibGljIE1lbW9yeUltYWdlU291cmNlKGludCB3LCBpbnQgaCwgQ29sb3JNb2RlbCBjbSwgYnl0ZSBwaXhbXSwKLSAgICAgICAgICAgIGludCBvZmYsIGludCBzY2FuKSB7CisgICAgcHVibGljIE1lbW9yeUltYWdlU291cmNlKGludCB3LCBpbnQgaCwgQ29sb3JNb2RlbCBjbSwgYnl0ZSBwaXhbXSwgaW50IG9mZiwgaW50IHNjYW4pIHsKICAgICAgICAgaW5pdCh3LCBoLCBjbSwgcGl4LCBvZmYsIHNjYW4sIG51bGwpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBNZW1vcnlJbWFnZVNvdXJjZSB3aXRoIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBwYXJhbWV0ZXJzIGFuZCBkZWZhdWx0IFJHQiBDb2xvck1vZGVsLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBNZW1vcnlJbWFnZVNvdXJjZSB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBhbmQKKyAgICAgKiBkZWZhdWx0IFJHQiBDb2xvck1vZGVsLgogICAgICAqIAotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIHBpeCB0aGUgcGl4ZWxzIGFycmF5LgotICAgICAqIEBwYXJhbSBvZmYgdGhlIG9mZnNldCBpbiB0aGUgcGl4ZWwgYXJyYXkuCi0gICAgICogQHBhcmFtIHNjYW4gdGhlIGRpc3RhbmNlIGZyb20gb25lIHBpeGVsJ3Mgcm93IHRvIHRoZSBuZXh0IAotICAgICAqIGluIHRoZSBwaXhlbCBhcnJheS4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIHBpeAorICAgICAqICAgICAgICAgICAgdGhlIHBpeGVscyBhcnJheS4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSBwaXhlbCBhcnJheS4KKyAgICAgKiBAcGFyYW0gc2NhbgorICAgICAqICAgICAgICAgICAgdGhlIGRpc3RhbmNlIGZyb20gb25lIHBpeGVsJ3Mgcm93IHRvIHRoZSBuZXh0IGluIHRoZSBwaXhlbAorICAgICAqICAgICAgICAgICAgYXJyYXkuCiAgICAgICovCiAgICAgcHVibGljIE1lbW9yeUltYWdlU291cmNlKGludCB3LCBpbnQgaCwgaW50IHBpeFtdLCBpbnQgb2ZmLCBpbnQgc2NhbikgewogICAgICAgICBpbml0KHcsIGgsIENvbG9yTW9kZWwuZ2V0UkdCZGVmYXVsdCgpLCBwaXgsIG9mZiwgc2NhbiwgbnVsbCk7CkBAIC0xODQsMjUgKzI0MiwyNSBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHN0YXJ0UHJvZHVjdGlvbihJbWFnZUNvbnN1bWVyIGljKSB7Ci0gICAgICAgIGlmKCFpc0NvbnN1bWVyKGljKSAmJiBpYyAhPSBudWxsKSB7CisgICAgICAgIGlmICghaXNDb25zdW1lcihpYykgJiYgaWMgIT0gbnVsbCkgewogICAgICAgICAgICAgY29uc3VtZXJzLmFkZEVsZW1lbnQoaWMpOwogICAgICAgICB9Ci0gICAgICAgIHRyeXsKKyAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHNldEhlYWRlcihpYyk7CiAgICAgICAgICAgICBzZXRQaXhlbHMoaWMsIDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICAgICAgaWYoYW5pbWF0ZWQpeworICAgICAgICAgICAgaWYgKGFuaW1hdGVkKSB7CiAgICAgICAgICAgICAgICAgaWMuaW1hZ2VDb21wbGV0ZShJbWFnZUNvbnN1bWVyLlNJTkdMRUZSQU1FRE9ORSk7Ci0gICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWMuaW1hZ2VDb21wbGV0ZShJbWFnZUNvbnN1bWVyLlNUQVRJQ0lNQUdFRE9ORSk7Ci0gICAgICAgICAgICAgICAgaWYoaXNDb25zdW1lcihpYykpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNDb25zdW1lcihpYykpIHsKICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQ29uc3VtZXIoaWMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgIGlmKGlzQ29uc3VtZXIoaWMpKSB7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAoaXNDb25zdW1lcihpYykpIHsKICAgICAgICAgICAgICAgICBpYy5pbWFnZUNvbXBsZXRlKEltYWdlQ29uc3VtZXIuSU1BR0VFUlJPUik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihpc0NvbnN1bWVyKGljKSkgeworICAgICAgICAgICAgaWYgKGlzQ29uc3VtZXIoaWMpKSB7CiAgICAgICAgICAgICAgICAgcmVtb3ZlQ29uc3VtZXIoaWMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yMTYsMjYgKzI3NCwyOSBAQAogICAgIH0KIAogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRDb25zdW1lcihJbWFnZUNvbnN1bWVyIGljKSB7Ci0gICAgICAgIGlmKGljID09IG51bGwgfHwgY29uc3VtZXJzLmNvbnRhaW5zKGljKSkgeworICAgICAgICBpZiAoaWMgPT0gbnVsbCB8fCBjb25zdW1lcnMuY29udGFpbnMoaWMpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgY29uc3VtZXJzLmFkZEVsZW1lbnQoaWMpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlcGxhY2VzIHRoZSBwaXhlbCBkYXRhIHdpdGggYSBuZXcgcGl4ZWwgYXJyYXkgZm9yIGhvbGRpbmcgCi0gICAgICogdGhlIHBpeGVscyBmb3IgdGhpcyBpbWFnZS4gSWYgYW4gYW5pbWF0aW9uIAotICAgICAqIGZsYWcgaXMgc2V0IHRvIHRydWUgdmFsdWUgYnkgdGhlIHNldEFuaW1hdGVkKCkgbWV0aG9kLCAKLSAgICAgKiB0aGUgbmV3IHBpeGVscyB3aWxsIGJlIGltbWVkaWF0ZWx5IGRlbGl2ZXJlZCB0byB0aGUgSW1hZ2VDb25zdW1lcnMuIAorICAgICAqIFJlcGxhY2VzIHRoZSBwaXhlbCBkYXRhIHdpdGggYSBuZXcgcGl4ZWwgYXJyYXkgZm9yIGhvbGRpbmcgdGhlIHBpeGVscyBmb3IKKyAgICAgKiB0aGlzIGltYWdlLiBJZiBhbiBhbmltYXRpb24gZmxhZyBpcyBzZXQgdG8gdHJ1ZSB2YWx1ZSBieSB0aGUKKyAgICAgKiBzZXRBbmltYXRlZCgpIG1ldGhvZCwgdGhlIG5ldyBwaXhlbHMgd2lsbCBiZSBpbW1lZGlhdGVseSBkZWxpdmVyZWQgdG8gdGhlCisgICAgICogSW1hZ2VDb25zdW1lcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIG5ld3BpeCB0aGUgbmV3IHBpeGVsIGFycmF5LgotICAgICAqIEBwYXJhbSBuZXdtb2RlbCB0aGUgbmV3IENvbG9yTW9kZWwuCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IGluIHRoZSBhcnJheS4KLSAgICAgKiBAcGFyYW0gc2NhbnNpemUgdGhlIGRpc3RhbmNlIGZyb20gb25lIHJvdyBvZiBwaXhlbHMgdG8gdGhlIG5leHQgcm93Ci0gICAgICogaW4gdGhlIHBpeGVsIGFycmF5CisgICAgICogQHBhcmFtIG5ld3BpeAorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBwaXhlbCBhcnJheS4KKyAgICAgKiBAcGFyYW0gbmV3bW9kZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgQ29sb3JNb2RlbC4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSBhcnJheS4KKyAgICAgKiBAcGFyYW0gc2NhbnNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkaXN0YW5jZSBmcm9tIG9uZSByb3cgb2YgcGl4ZWxzIHRvIHRoZSBuZXh0IHJvdyBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgIHBpeGVsIGFycmF5LgogICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBuZXdQaXhlbHMoaW50IG5ld3BpeFtdLCBDb2xvck1vZGVsIG5ld21vZGVsLAotICAgICAgICAgICAgaW50IG9mZnNldCwgaW50IHNjYW5zaXplKSB7CisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG5ld1BpeGVscyhpbnQgbmV3cGl4W10sIENvbG9yTW9kZWwgbmV3bW9kZWwsIGludCBvZmZzZXQsIGludCBzY2Fuc2l6ZSkgewogICAgICAgICB0aGlzLmRhdGFUeXBlID0gREFUQV9UWVBFX0lOVDsKICAgICAgICAgdGhpcy5pRGF0YSA9IG5ld3BpeDsKICAgICAgICAgdGhpcy5jbSA9IG5ld21vZGVsOwpAQCAtMjQ1LDE5ICszMDYsMjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXBsYWNlcyB0aGUgcGl4ZWwgZGF0YSB3aXRoIGEgbmV3IHBpeGVsIGFycmF5IGZvciBob2xkaW5nIAotICAgICAqIHRoZSBwaXhlbHMgZm9yIHRoaXMgaW1hZ2UuIElmIGFuIGFuaW1hdGlvbiAKLSAgICAgKiBmbGFnIGlzIHNldCB0byB0cnVlIHZhbHVlIGJ5IHRoZSBzZXRBbmltYXRlZCgpIG1ldGhvZCwgCi0gICAgICogdGhlIG5ldyBwaXhlbHMgd2lsbCBiZSBpbW1lZGlhdGVseSBkZWxpdmVyZWQgdG8gdGhlIEltYWdlQ29uc3VtZXJzLiAKKyAgICAgKiBSZXBsYWNlcyB0aGUgcGl4ZWwgZGF0YSB3aXRoIGEgbmV3IHBpeGVsIGFycmF5IGZvciBob2xkaW5nIHRoZSBwaXhlbHMgZm9yCisgICAgICogdGhpcyBpbWFnZS4gSWYgYW4gYW5pbWF0aW9uIGZsYWcgaXMgc2V0IHRvIHRydWUgdmFsdWUgYnkgdGhlCisgICAgICogc2V0QW5pbWF0ZWQoKSBtZXRob2QsIHRoZSBuZXcgcGl4ZWxzIHdpbGwgYmUgaW1tZWRpYXRlbHkgZGVsaXZlcmVkIHRvIHRoZQorICAgICAqIEltYWdlQ29uc3VtZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBuZXdwaXggdGhlIG5ldyBwaXhlbCBhcnJheS4KLSAgICAgKiBAcGFyYW0gbmV3bW9kZWwgdGhlIG5ldyBDb2xvck1vZGVsLgotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCBpbiB0aGUgYXJyYXkuCi0gICAgICogQHBhcmFtIHNjYW5zaXplIHRoZSBkaXN0YW5jZSBmcm9tIG9uZSByb3cgb2YgcGl4ZWxzIHRvIHRoZSBuZXh0IHJvdwotICAgICAqIGluIHRoZSBwaXhlbCBhcnJheQorICAgICAqIEBwYXJhbSBuZXdwaXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgcGl4ZWwgYXJyYXkuCisgICAgICogQHBhcmFtIG5ld21vZGVsCisgICAgICogICAgICAgICAgICB0aGUgbmV3IENvbG9yTW9kZWwuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgYXJyYXkuCisgICAgICogQHBhcmFtIHNjYW5zaXplCisgICAgICogICAgICAgICAgICB0aGUgZGlzdGFuY2UgZnJvbSBvbmUgcm93IG9mIHBpeGVscyB0byB0aGUgbmV4dCByb3cgaW4gdGhlCisgICAgICogICAgICAgICAgICBwaXhlbCBhcnJheS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbmV3UGl4ZWxzKGJ5dGUgbmV3cGl4W10sIENvbG9yTW9kZWwgbmV3bW9kZWwsCi0gICAgICAgICAgICBpbnQgb2Zmc2V0LCBpbnQgc2NhbnNpemUpIHsKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbmV3UGl4ZWxzKGJ5dGUgbmV3cGl4W10sIENvbG9yTW9kZWwgbmV3bW9kZWwsIGludCBvZmZzZXQsIGludCBzY2Fuc2l6ZSkgewogICAgICAgICB0aGlzLmRhdGFUeXBlID0gREFUQV9UWVBFX0JZVEU7CiAgICAgICAgIHRoaXMuYkRhdGEgPSBuZXdwaXg7CiAgICAgICAgIHRoaXMuY20gPSBuZXdtb2RlbDsKQEAgLTI2NywzMyArMzMxLDMzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgZnVsbCBidWZmZXIgdXBkYXRlcyBmbGFnIHRvIHRydWUuIElmIHRoaXMgaXMgYW4gCi0gICAgICogYW5pbWF0ZWQgaW1hZ2UsIHRoZSBpbWFnZSBjb25zdW1lcnMgaGludHMgYXJlIHVwZGF0ZWQKLSAgICAgKiBhY2NvcmRpbmdseS4KKyAgICAgKiBTZXRzIHRoZSBmdWxsIGJ1ZmZlciB1cGRhdGVzIGZsYWcgdG8gdHJ1ZS4gSWYgdGhpcyBpcyBhbiBhbmltYXRlZCBpbWFnZSwKKyAgICAgKiB0aGUgaW1hZ2UgY29uc3VtZXJzIGhpbnRzIGFyZSB1cGRhdGVkIGFjY29yZGluZ2x5LgogICAgICAqIAotICAgICAqIEBwYXJhbSBmdWxsYnVmZmVycyB0aGUgdHJ1ZSBpZiB0aGUgcGl4ZWwgYnVmZmVyIHNob3VsZCBiZSBzZW50IGFsd2F5cy4KKyAgICAgKiBAcGFyYW0gZnVsbGJ1ZmZlcnMKKyAgICAgKiAgICAgICAgICAgIHRoZSB0cnVlIGlmIHRoZSBwaXhlbCBidWZmZXIgc2hvdWxkIGJlIHNlbnQgYWx3YXlzLgogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRGdWxsQnVmZmVyVXBkYXRlcyhib29sZWFuIGZ1bGxidWZmZXJzKSB7Ci0gICAgICAgIGlmKHRoaXMuZnVsbGJ1ZmZlcnMgPT0gZnVsbGJ1ZmZlcnMpIHsKKyAgICAgICAgaWYgKHRoaXMuZnVsbGJ1ZmZlcnMgPT0gZnVsbGJ1ZmZlcnMpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICB0aGlzLmZ1bGxidWZmZXJzID0gZnVsbGJ1ZmZlcnM7Ci0gICAgICAgIGlmKGFuaW1hdGVkKXsKKyAgICAgICAgaWYgKGFuaW1hdGVkKSB7CiAgICAgICAgICAgICBPYmplY3QgY29uc0FyW10gPSBjb25zdW1lcnMudG9BcnJheSgpOwogICAgICAgICAgICAgZm9yIChPYmplY3QgZWxlbWVudCA6IGNvbnNBcikgewogICAgICAgICAgICAgICAgIEltYWdlQ29uc3VtZXIgY29uID0gKEltYWdlQ29uc3VtZXIpZWxlbWVudDsKLSAgICAgICAgICAgICAgICB0cnl7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGZ1bGxidWZmZXJzKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbi5zZXRIaW50cyhJbWFnZUNvbnN1bWVyLlRPUERPV05MRUZUUklHSFQgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZUNvbnN1bWVyLkNPTVBMRVRFU0NBTkxJTkVTKTsKLSAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxidWZmZXJzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb24uc2V0SGludHMoSW1hZ2VDb25zdW1lci5UT1BET1dOTEVGVFJJR0hUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSW1hZ2VDb25zdW1lci5DT01QTEVURVNDQU5MSU5FUyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb24uc2V0SGludHMoSW1hZ2VDb25zdW1lci5SQU5ET01QSVhFTE9SREVSKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGlzQ29uc3VtZXIoY29uKSkgeworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0NvbnN1bWVyKGNvbikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbi5pbWFnZUNvbXBsZXRlKEltYWdlQ29uc3VtZXIuSU1BR0VFUlJPUik7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYoaXNDb25zdW1lcihjb24pKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0NvbnN1bWVyKGNvbikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUNvbnN1bWVyKGNvbik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC0zMDIsMjcgKzM2NiwyOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGZsYWcgdGhhdCB0ZWxscyB3aGV0aGVyIHRoaXMgbWVtb3J5IGltYWdlIGhhcyBtb3JlIAotICAgICAqIHRoYW4gb25lIGZyYW1lIChmb3IgYW5pbWF0aW9uKTogdHJ1ZSBmb3IgbXVsdGlwbGUgZnJhbWVzLAotICAgICAqIGZhbHNlIGlmIHRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHNpbmdsZSBmcmFtZSBpbWFnZS4KLSAgICAgKiAgCi0gICAgICogQHBhcmFtIGFuaW1hdGVkIHdoZXRoZXIgdGhpcyBpbWFnZSByZXByZXNlbnRzIGFuIGFuaW1hdGlvbi4KKyAgICAgKiBTZXRzIHRoZSBmbGFnIHRoYXQgdGVsbHMgd2hldGhlciB0aGlzIG1lbW9yeSBpbWFnZSBoYXMgbW9yZSB0aGFuIG9uZQorICAgICAqIGZyYW1lIChmb3IgYW5pbWF0aW9uKTogdHJ1ZSBmb3IgbXVsdGlwbGUgZnJhbWVzLCBmYWxzZSBpZiB0aGlzIGNsYXNzCisgICAgICogcmVwcmVzZW50cyBhIHNpbmdsZSBmcmFtZSBpbWFnZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYW5pbWF0ZWQKKyAgICAgKiAgICAgICAgICAgIHdoZXRoZXIgdGhpcyBpbWFnZSByZXByZXNlbnRzIGFuIGFuaW1hdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0QW5pbWF0ZWQoYm9vbGVhbiBhbmltYXRlZCkgewotICAgICAgICBpZih0aGlzLmFuaW1hdGVkID09IGFuaW1hdGVkKSB7CisgICAgICAgIGlmICh0aGlzLmFuaW1hdGVkID09IGFuaW1hdGVkKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgT2JqZWN0IGNvbnNBcltdID0gY29uc3VtZXJzLnRvQXJyYXkoKTsKICAgICAgICAgZm9yIChPYmplY3QgZWxlbWVudCA6IGNvbnNBcikgewogICAgICAgICAgICAgSW1hZ2VDb25zdW1lciBjb24gPSAoSW1hZ2VDb25zdW1lcillbGVtZW50OwotICAgICAgICAgICAgdHJ5eworICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBjb24uaW1hZ2VDb21wbGV0ZShJbWFnZUNvbnN1bWVyLlNUQVRJQ0lNQUdFRE9ORSk7Ci0gICAgICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgICAgIGlmKGlzQ29uc3VtZXIoY29uKSkgeworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNDb25zdW1lcihjb24pKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbi5pbWFnZUNvbXBsZXRlKEltYWdlQ29uc3VtZXIuSU1BR0VFUlJPUik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoaXNDb25zdW1lcihjb24pKXsKKyAgICAgICAgICAgIGlmIChpc0NvbnN1bWVyKGNvbikpIHsKICAgICAgICAgICAgICAgICByZW1vdmVDb25zdW1lcihjb24pOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0zMzAsNjAgKzM5NSw2MyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNlbmRzIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIgYXJlYSBvZiB0aGUgYnVmZmVyIHRvIAotICAgICAqIEltYWdlQ29uc3VtZXJzIGFuZCBub3RpZmllcyB0aGVtIHRoYXQgYW4gYW5pbWF0aW9uIGZyYW1lIAotICAgICAqIGlzIGNvbXBsZXRlZCBvbmx5IGlmIGZyYW1lbm90aWZ5IHBhcmFtZXRlciBpcyB0cnVlLgotICAgICAqIFRoYXQgd29ya3Mgb25seSBpZiB0aGUgYW5pbWF0ZWQgZmxhZyBoYXMgYmVlbiBzZXQgdG8gdHJ1ZSAKLSAgICAgKiBieSB0aGUgc2V0QW5pbWF0ZWQoKSBtZXRob2QuIElmIHRoZSBmdWxsIGJ1ZmZlciB1cGRhdGUgZmxhZyAKLSAgICAgKiBoYXMgYmVlbiBzZXQgdG8gdHJ1ZSBieSB0aGUgc2V0RnVsbEJ1ZmZlclVwZGF0ZXMoKSBtZXRob2QsIAotICAgICAqIHRoZW4gdGhlIGVudGlyZSBidWZmZXIgd2lsbCBhbHdheXMgYmUgc2VudCBpZ25vcmluZyBwYXJhbWV0ZXJzLgorICAgICAqIFNlbmRzIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIgYXJlYSBvZiB0aGUgYnVmZmVyIHRvIEltYWdlQ29uc3VtZXJzIGFuZAorICAgICAqIG5vdGlmaWVzIHRoZW0gdGhhdCBhbiBhbmltYXRpb24gZnJhbWUgaXMgY29tcGxldGVkIG9ubHkgaWYgdGhlIHtAY29kZQorICAgICAqIGZyYW1lbm90aWZ5fSBwYXJhbWV0ZXIgaXMgdHJ1ZS4gVGhhdCB3b3JrcyBvbmx5IGlmIHRoZSBhbmltYXRlZCBmbGFnIGhhcworICAgICAqIGJlZW4gc2V0IHRvIHRydWUgYnkgdGhlIHNldEFuaW1hdGVkKCkgbWV0aG9kLiBJZiB0aGUgZnVsbCBidWZmZXIgdXBkYXRlCisgICAgICogZmxhZyBoYXMgYmVlbiBzZXQgdG8gdHJ1ZSBieSB0aGUgc2V0RnVsbEJ1ZmZlclVwZGF0ZXMoKSBtZXRob2QsIHRoZW4gdGhlCisgICAgICogZW50aXJlIGJ1ZmZlciB3aWxsIGFsd2F5cyBiZSBzZW50IGlnbm9yaW5nIHBhcmFtZXRlcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYS4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHJ0aGUgZWN0YW5ndWxhciBhcmVhLgotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYS4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5ndWxhciBhcmVhLiAKLSAgICAgKiBAcGFyYW0gZnJhbWVub3RpZnkgdHJ1ZSBpZiBhIFNJTkdMRUZSQU1FRE9ORSBub3RpZmljYXRpb24KLSAgICAgKiBzaG91bGQgYmUgc2VudCB0byB0aGUgcmVnaXN0ZXJlZCBjb25zdW1lcnMsIGZhbHNlIG90aGVyd2lzZS4gCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYS4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYS4KKyAgICAgKiBAcGFyYW0gZnJhbWVub3RpZnkKKyAgICAgKiAgICAgICAgICAgIHRydWUgaWYgYSBTSU5HTEVGUkFNRURPTkUgbm90aWZpY2F0aW9uIHNob3VsZCBiZSBzZW50IHRvIHRoZQorICAgICAqICAgICAgICAgICAgcmVnaXN0ZXJlZCBjb25zdW1lcnMsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbmV3UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLAotICAgICAgICAgICAgYm9vbGVhbiBmcmFtZW5vdGlmeSkgewotICAgICAgICBpZihhbmltYXRlZCl7Ci0gICAgICAgICAgICBpZihmdWxsYnVmZmVycyl7CisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG5ld1BpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgYm9vbGVhbiBmcmFtZW5vdGlmeSkgeworICAgICAgICBpZiAoYW5pbWF0ZWQpIHsKKyAgICAgICAgICAgIGlmIChmdWxsYnVmZmVycykgewogICAgICAgICAgICAgICAgIHggPSAwOwogICAgICAgICAgICAgICAgIHkgPSAwOwogICAgICAgICAgICAgICAgIHcgPSB3aWR0aDsKICAgICAgICAgICAgICAgICBoID0gaGVpZ2h0OwotICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgaWYoeCA8IDApeworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoeCA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgdyArPSB4OwogICAgICAgICAgICAgICAgICAgICB4ID0gMDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYodyA+IHdpZHRoKSB7CisgICAgICAgICAgICAgICAgaWYgKHcgPiB3aWR0aCkgewogICAgICAgICAgICAgICAgICAgICB3ID0gd2lkdGggLSB4OwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZih5IDwgMCl7CisgICAgICAgICAgICAgICAgaWYgKHkgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGggKz0geTsKICAgICAgICAgICAgICAgICAgICAgeSA9IDA7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoaCA+IGhlaWdodCkgeworICAgICAgICAgICAgaWYgKGggPiBoZWlnaHQpIHsKICAgICAgICAgICAgICAgICBoID0gaGVpZ2h0IC0geTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIE9iamVjdCBjb25zQXJbXSA9IGNvbnN1bWVycy50b0FycmF5KCk7CiAgICAgICAgICAgICBmb3IgKE9iamVjdCBlbGVtZW50IDogY29uc0FyKSB7CiAgICAgICAgICAgICAgICAgSW1hZ2VDb25zdW1lciBjb24gPSAoSW1hZ2VDb25zdW1lcillbGVtZW50OwotICAgICAgICAgICAgICAgIHRyeXsKLSAgICAgICAgICAgICAgICAgICAgaWYodyA+IDAgJiYgaCA+IDApIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAodyA+IDAgJiYgaCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHNldFBpeGVscyhjb24sIHgsIHksIHcsIGgpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmKGZyYW1lbm90aWZ5KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZW5vdGlmeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgY29uLmltYWdlQ29tcGxldGUoSW1hZ2VDb25zdW1lci5TSU5HTEVGUkFNRURPTkUpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBleCl7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGlzQ29uc3VtZXIoY29uKSkgeworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaXNDb25zdW1lcihjb24pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb24uaW1hZ2VDb21wbGV0ZShJbWFnZUNvbnN1bWVyLklNQUdFRVJST1IpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmKGlzQ29uc3VtZXIoY29uKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaXNDb25zdW1lcihjb24pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVDb25zdW1lcihjb24pOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtMzkyLDI2ICs0NjAsMjkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZW5kcyB0aGUgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyIGFyZWEgb2YgdGhlIGJ1ZmZlciB0byAKLSAgICAgKiB0aGUgSW1hZ2VDb25zdW1lcnMgYW5kIG5vdGlmaWVzIHRoZW0gdGhhdCBhbiBhbmltYXRpb24gZnJhbWUgCi0gICAgICogaXMgY29tcGxldGVkIGlmIHRoZSBhbmltYXRlZCBmbGFnIGhhcyBiZWVuIHNldCB0byB0cnVlIAotICAgICAqIGJ5IHRoZSBzZXRBbmltYXRlZCgpIG1ldGhvZC4gSWYgdGhlIGZ1bGwgYnVmZmVyIHVwZGF0ZSBmbGFnIAotICAgICAqIGhhcyBiZWVuIHNldCB0byB0cnVlIGJ5IHRoZSBzZXRGdWxsQnVmZmVyVXBkYXRlcygpIG1ldGhvZCwgCisgICAgICogU2VuZHMgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhciBhcmVhIG9mIHRoZSBidWZmZXIgdG8gdGhlIEltYWdlQ29uc3VtZXJzCisgICAgICogYW5kIG5vdGlmaWVzIHRoZW0gdGhhdCBhbiBhbmltYXRpb24gZnJhbWUgaXMgY29tcGxldGVkIGlmIHRoZSBhbmltYXRlZAorICAgICAqIGZsYWcgaGFzIGJlZW4gc2V0IHRvIHRydWUgYnkgdGhlIHNldEFuaW1hdGVkKCkgbWV0aG9kLiBJZiB0aGUgZnVsbCBidWZmZXIKKyAgICAgKiB1cGRhdGUgZmxhZyBoYXMgYmVlbiBzZXQgdG8gdHJ1ZSBieSB0aGUgc2V0RnVsbEJ1ZmZlclVwZGF0ZXMoKSBtZXRob2QsCiAgICAgICogdGhlbiB0aGUgZW50aXJlIGJ1ZmZlciB3aWxsIGFsd2F5cyBiZSBzZW50IGlnbm9yaW5nIHBhcmFtZXRlcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYS4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5ndWxhciBhcmVhLgotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYS4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5ndWxhciBhcmVhLiAKKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYS4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYS4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5ndWxhciBhcmVhLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5ndWxhciBhcmVhLgogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBuZXdQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpIHsKICAgICAgICAgbmV3UGl4ZWxzKHgsIHksIHcsIGgsIHRydWUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNlbmRzIGEgbmV3IGJ1ZmZlciBvZiBwaXhlbHMgdG8gdGhlIEltYWdlQ29uc3VtZXJzIAotICAgICAqIGFuZCBub3RpZmllcyB0aGVtIHRoYXQgYW4gYW5pbWF0aW9uIGZyYW1lIGlzIGNvbXBsZXRlZCBpZgotICAgICAqIHRoZSBhbmltYXRlZCBmbGFnIGhhcyBiZWVuIHNldCB0byB0cnVlIGJ5IHRoZSBzZXRBbmltYXRlZCgpIG1ldGhvZC4gCisgICAgICogU2VuZHMgYSBuZXcgYnVmZmVyIG9mIHBpeGVscyB0byB0aGUgSW1hZ2VDb25zdW1lcnMgYW5kIG5vdGlmaWVzIHRoZW0gdGhhdAorICAgICAqIGFuIGFuaW1hdGlvbiBmcmFtZSBpcyBjb21wbGV0ZWQgaWYgdGhlIGFuaW1hdGVkIGZsYWcgaGFzIGJlZW4gc2V0IHRvIHRydWUKKyAgICAgKiBieSB0aGUgc2V0QW5pbWF0ZWQoKSBtZXRob2QuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgbmV3UGl4ZWxzKCkgewogICAgICAgICBuZXdQaXhlbHMoMCwgMCwgd2lkdGgsIGhlaWdodCwgdHJ1ZSk7CkBAIC00MjAsMTYgKzQ5MSwyMyBAQAogICAgIC8qKgogICAgICAqIEluaXRzIHRoZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0Ci0gICAgICogQHBhcmFtIG1vZGVsIHRoZSBtb2RlbAotICAgICAqIEBwYXJhbSBwaXhlbHMgdGhlIHBpeGVscwotICAgICAqIEBwYXJhbSBvZmYgdGhlIG9mZgotICAgICAqIEBwYXJhbSBzY2FuIHRoZSBzY2FuCi0gICAgICogQHBhcmFtIHByb3AgdGhlIHByb3AKKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aC4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0LgorICAgICAqIEBwYXJhbSBtb2RlbAorICAgICAqICAgICAgICAgICAgdGhlIG1vZGVsLgorICAgICAqIEBwYXJhbSBwaXhlbHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBwaXhlbHMuCisgICAgICogQHBhcmFtIG9mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZi4KKyAgICAgKiBAcGFyYW0gc2NhbgorICAgICAqICAgICAgICAgICAgdGhlIHNjYW4uCisgICAgICogQHBhcmFtIHByb3AKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcm9wLgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbml0KGludCB3aWR0aCwgaW50IGhlaWdodCwgQ29sb3JNb2RlbCBtb2RlbCwgYnl0ZSBwaXhlbHNbXSwKLSAgICAgICAgICAgIGludCBvZmYsIGludCBzY2FuLCBIYXNodGFibGU8PywgPz4gcHJvcCl7CisgICAgcHJpdmF0ZSB2b2lkIGluaXQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBDb2xvck1vZGVsIG1vZGVsLCBieXRlIHBpeGVsc1tdLCBpbnQgb2ZmLCBpbnQgc2NhbiwKKyAgICAgICAgICAgIEhhc2h0YWJsZTw/LCA/PiBwcm9wKSB7CiAKICAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoOwogICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDsKQEAgLTQ0NiwxNiArNTI0LDIzIEBACiAgICAgLyoqCiAgICAgICogSW5pdHMgdGhlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGgKLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQKLSAgICAgKiBAcGFyYW0gbW9kZWwgdGhlIG1vZGVsCi0gICAgICogQHBhcmFtIHBpeGVscyB0aGUgcGl4ZWxzCi0gICAgICogQHBhcmFtIG9mZiB0aGUgb2ZmCi0gICAgICogQHBhcmFtIHNjYW4gdGhlIHNjYW4KLSAgICAgKiBAcGFyYW0gcHJvcCB0aGUgcHJvcAorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQuCisgICAgICogQHBhcmFtIG1vZGVsCisgICAgICogICAgICAgICAgICB0aGUgbW9kZWwuCisgICAgICogQHBhcmFtIHBpeGVscworICAgICAqICAgICAgICAgICAgdGhlIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2ZmLgorICAgICAqIEBwYXJhbSBzY2FuCisgICAgICogICAgICAgICAgICB0aGUgc2Nhbi4KKyAgICAgKiBAcGFyYW0gcHJvcAorICAgICAqICAgICAgICAgICAgdGhlIHByb3AuCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGluaXQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBDb2xvck1vZGVsIG1vZGVsLCBpbnQgcGl4ZWxzW10sCi0gICAgICAgICAgICBpbnQgb2ZmLCBpbnQgc2NhbiwgSGFzaHRhYmxlPD8sID8+IHByb3ApeworICAgIHByaXZhdGUgdm9pZCBpbml0KGludCB3aWR0aCwgaW50IGhlaWdodCwgQ29sb3JNb2RlbCBtb2RlbCwgaW50IHBpeGVsc1tdLCBpbnQgb2ZmLCBpbnQgc2NhbiwKKyAgICAgICAgICAgIEhhc2h0YWJsZTw/LCA/PiBwcm9wKSB7CiAKICAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoOwogICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDsKQEAgLTQ3MSw0MiArNTU2LDQ4IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgcGl4ZWxzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjb24gdGhlIGNvbgotICAgICAqIEBwYXJhbSB4IHRoZSB4Ci0gICAgICogQHBhcmFtIHkgdGhlIHkKLSAgICAgKiBAcGFyYW0gdyB0aGUgdwotICAgICAqIEBwYXJhbSBoIHRoZSBoCisgICAgICogQHBhcmFtIGNvbgorICAgICAqICAgICAgICAgICAgdGhlIGNvbi4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIHguCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSB5LgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgdy4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGguCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldFBpeGVscyhJbWFnZUNvbnN1bWVyIGNvbiwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpeworICAgIHByaXZhdGUgdm9pZCBzZXRQaXhlbHMoSW1hZ2VDb25zdW1lciBjb24sIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKSB7CiAgICAgICAgIGludCBwaXhlbE9mZiA9IHNjYW5saW5lICogeSArIG9mZnNldCArIHg7CiAKLSAgICAgICAgc3dpdGNoKGRhdGFUeXBlKXsKLSAgICAgICAgY2FzZSBEQVRBX1RZUEVfQllURToKLSAgICAgICAgICAgIGNvbi5zZXRQaXhlbHMoeCwgeSwgdywgaCwgY20sIGJEYXRhLCBwaXhlbE9mZiwgc2NhbmxpbmUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgREFUQV9UWVBFX0lOVDoKLSAgICAgICAgICAgIGNvbi5zZXRQaXhlbHMoeCwgeSwgdywgaCwgY20sIGlEYXRhLCBwaXhlbE9mZiwgc2NhbmxpbmUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvLyBhd3QuMjJBPVdyb25nIHR5cGUgb2YgcGl4ZWxzIGFycmF5Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIyQSIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICBzd2l0Y2ggKGRhdGFUeXBlKSB7CisgICAgICAgICAgICBjYXNlIERBVEFfVFlQRV9CWVRFOgorICAgICAgICAgICAgICAgIGNvbi5zZXRQaXhlbHMoeCwgeSwgdywgaCwgY20sIGJEYXRhLCBwaXhlbE9mZiwgc2NhbmxpbmUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEQVRBX1RZUEVfSU5UOgorICAgICAgICAgICAgICAgIGNvbi5zZXRQaXhlbHMoeCwgeSwgdywgaCwgY20sIGlEYXRhLCBwaXhlbE9mZiwgc2NhbmxpbmUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyBhd3QuMjJBPVdyb25nIHR5cGUgb2YgcGl4ZWxzIGFycmF5CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMkEiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGhlYWRlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29uIHRoZSBuZXcgaGVhZGVyCisgICAgICogQHBhcmFtIGNvbgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBoZWFkZXIuCiAgICAgICovCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzZXRIZWFkZXIoSW1hZ2VDb25zdW1lciBjb24peworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc2V0SGVhZGVyKEltYWdlQ29uc3VtZXIgY29uKSB7CiAgICAgICAgIGNvbi5zZXREaW1lbnNpb25zKHdpZHRoLCBoZWlnaHQpOwogICAgICAgICBjb24uc2V0UHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKICAgICAgICAgY29uLnNldENvbG9yTW9kZWwoY20pOwotICAgICAgICBjb24uc2V0SGludHMoYW5pbWF0ZWQgPyAoZnVsbGJ1ZmZlcnMgPyAoSW1hZ2VDb25zdW1lci5UT1BET1dOTEVGVFJJR0hUIHwKLSAgICAgICAgICAgICAgICBJbWFnZUNvbnN1bWVyLkNPTVBMRVRFU0NBTkxJTkVTKSA6IEltYWdlQ29uc3VtZXIuUkFORE9NUElYRUxPUkRFUikgOgotICAgICAgICAgICAgICAgIChJbWFnZUNvbnN1bWVyLlRPUERPV05MRUZUUklHSFQgfCBJbWFnZUNvbnN1bWVyLkNPTVBMRVRFU0NBTkxJTkVTIHwKLSAgICAgICAgICAgICAgICAgSW1hZ2VDb25zdW1lci5TSU5HTEVQQVNTIHwgSW1hZ2VDb25zdW1lci5TSU5HTEVGUkFNRSkpOworICAgICAgICBjb24KKyAgICAgICAgICAgICAgICAuc2V0SGludHMoYW5pbWF0ZWQgPyAoZnVsbGJ1ZmZlcnMgPyAoSW1hZ2VDb25zdW1lci5UT1BET1dOTEVGVFJJR0hUIHwgSW1hZ2VDb25zdW1lci5DT01QTEVURVNDQU5MSU5FUykKKyAgICAgICAgICAgICAgICAgICAgICAgIDogSW1hZ2VDb25zdW1lci5SQU5ET01QSVhFTE9SREVSKQorICAgICAgICAgICAgICAgICAgICAgICAgOiAoSW1hZ2VDb25zdW1lci5UT1BET1dOTEVGVFJJR0hUIHwgSW1hZ2VDb25zdW1lci5DT01QTEVURVNDQU5MSU5FUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEltYWdlQ29uc3VtZXIuU0lOR0xFUEFTUyB8IEltYWdlQ29uc3VtZXIuU0lOR0xFRlJBTUUpKTsKICAgICB9CiAKIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL011bHRpUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbC5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL011bHRpUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbC5qYXZhCmluZGV4IGRkNDRiNDkuLjNkYzEzZDggMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbWFnZS9NdWx0aVBpeGVsUGFja2VkU2FtcGxlTW9kZWwuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvTXVsdGlQaXhlbFBhY2tlZFNhbXBsZU1vZGVsLmphdmEKQEAgLTE4LDcyICsxOCw5MyBAQAogICogQGF1dGhvciBJZ29yIFYuIFN0b2x5YXJvdgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuaW1hZ2U7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBUaGUgTXVsdGlQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIGNsYXNzIHJlcHJlc2VudHMgaW1hZ2UgZGF0YSB3aXRoIG9uZQotICogYmFuZC4gVGhpcyBjbGFzcyBwYWNrcyBtdWx0aXBsZSBwaXhlbHMgd2l0aCBvbmUgc2FtcGxlIGluIG9uZSBkYXRhIAotICogZWxlbWVudCBhbmQgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBkYXRhIHR5cGVzOiBEYXRhQnVmZmVyLlRZUEVfQllURSwgCi0gKiBEYXRhQnVmZmVyLlRZUEVfVVNIT1JULCBvciBEYXRhQnVmZmVyLlRZUEVfSU5ULiAKKyAqIFRoZSBNdWx0aVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgY2xhc3MgcmVwcmVzZW50cyBpbWFnZSBkYXRhIHdpdGggb25lIGJhbmQuCisgKiBUaGlzIGNsYXNzIHBhY2tzIG11bHRpcGxlIHBpeGVscyB3aXRoIG9uZSBzYW1wbGUgaW4gb25lIGRhdGEgZWxlbWVudCBhbmQKKyAqIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgZGF0YSB0eXBlczogRGF0YUJ1ZmZlci5UWVBFX0JZVEUsCisgKiBEYXRhQnVmZmVyLlRZUEVfVVNIT1JULCBvciBEYXRhQnVmZmVyLlRZUEVfSU5ULgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIE11bHRpUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCBleHRlbmRzIFNhbXBsZU1vZGVsIHsKIAotICAgIC8qKiBUaGUgcGl4ZWwgYml0IHN0cmlkZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgcGl4ZWwgYml0IHN0cmlkZS4KKyAgICAgKi8KICAgICBwcml2YXRlIGludCBwaXhlbEJpdFN0cmlkZTsKIAotICAgIC8qKiBUaGUgc2NhbmxpbmUgc3RyaWRlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBzY2FubGluZSBzdHJpZGUuCisgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgc2NhbmxpbmVTdHJpZGU7CiAKLSAgICAvKiogVGhlIGRhdGEgYml0IG9mZnNldC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgZGF0YSBiaXQgb2Zmc2V0LgorICAgICAqLwogICAgIHByaXZhdGUgaW50IGRhdGFCaXRPZmZzZXQ7CiAKLSAgICAvKiogVGhlIGJpdCBtYXNrLiAqLworICAgIC8qKgorICAgICAqIFRoZSBiaXQgbWFzay4KKyAgICAgKi8KICAgICBwcml2YXRlIGludCBiaXRNYXNrOwogCi0gICAgLyoqIFRoZSBkYXRhIGVsZW1lbnQgc2l6ZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgZGF0YSBlbGVtZW50IHNpemUuCisgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgZGF0YUVsZW1lbnRTaXplOwogCi0gICAgLyoqIFRoZSBwaXhlbHMgcGVyIGRhdGEgZWxlbWVudC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgcGl4ZWxzIHBlciBkYXRhIGVsZW1lbnQuCisgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgcGl4ZWxzUGVyRGF0YUVsZW1lbnQ7CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgTXVsdGlQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIHdpdGggdGhlIHNwZWNpZmllZAogICAgICAqIHBhcmFtZXRlcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFUeXBlIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHNhbXBsZXMuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBkYXRhLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlIGRhdGEuCi0gICAgICogQHBhcmFtIG51bWJlck9mQml0cyB0aGUgbnVtYmVyIG9mIGJpdHMgcGVyIHBpeGVsLgotICAgICAqIEBwYXJhbSBzY2FubGluZVN0cmlkZSB0aGUgc2NhbmxpbmUgc3RyaWRlIG9mIHRoZSBvZiB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gZGF0YUJpdE9mZnNldCB0aGUgYXJyYXkgb2YgdGhlIGJhbmQgb2Zmc2V0cy4KKyAgICAgKiBAcGFyYW0gZGF0YVR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHNhbXBsZXMuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gbnVtYmVyT2ZCaXRzCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJpdHMgcGVyIHBpeGVsLgorICAgICAqIEBwYXJhbSBzY2FubGluZVN0cmlkZQorICAgICAqICAgICAgICAgICAgdGhlIHNjYW5saW5lIHN0cmlkZSBvZiB0aGUgb2YgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIGRhdGFCaXRPZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiB0aGUgYmFuZCBvZmZzZXRzLgogICAgICAqLwotICAgIHB1YmxpYyBNdWx0aVBpeGVsUGFja2VkU2FtcGxlTW9kZWwoaW50IGRhdGFUeXBlLCBpbnQgdywgaW50IGgsCi0gICAgICAgICAgICBpbnQgbnVtYmVyT2ZCaXRzLCBpbnQgc2NhbmxpbmVTdHJpZGUsIGludCBkYXRhQml0T2Zmc2V0KSB7CisgICAgcHVibGljIE11bHRpUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbChpbnQgZGF0YVR5cGUsIGludCB3LCBpbnQgaCwgaW50IG51bWJlck9mQml0cywKKyAgICAgICAgICAgIGludCBzY2FubGluZVN0cmlkZSwgaW50IGRhdGFCaXRPZmZzZXQpIHsKIAogICAgICAgICBzdXBlcihkYXRhVHlwZSwgdywgaCwgMSk7Ci0gICAgICAgIGlmIChkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfQllURSAmJgotICAgICAgICAgICAgICAgZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVCAmJgotICAgICAgICAgICAgICAgZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX0lOVCkgeworICAgICAgICBpZiAoZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX0JZVEUgJiYgZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVAorICAgICAgICAgICAgICAgICYmIGRhdGFUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9JTlQpIHsKICAgICAgICAgICAgIC8vIGF3dC42MT1VbnN1cHBvcnRlZCBkYXRhIHR5cGU6IHswfQogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC42MSIsIC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGUpKTsKICAgICAgICAgfQogCiAgICAgICAgIHRoaXMuc2NhbmxpbmVTdHJpZGUgPSBzY2FubGluZVN0cmlkZTsKLSAgICAgICAgaWYobnVtYmVyT2ZCaXRzID09IDApIHsKKyAgICAgICAgaWYgKG51bWJlck9mQml0cyA9PSAwKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjBDPU51bWJlciBvZiBCaXRzIGVxdWFscyB0byB6ZXJvCiAgICAgICAgICAgICB0aHJvdyBuZXcgUmFzdGVyRm9ybWF0RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIwQyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAgICAgICAgIHRoaXMucGl4ZWxCaXRTdHJpZGUgPSBudW1iZXJPZkJpdHM7CiAgICAgICAgIHRoaXMuZGF0YUVsZW1lbnRTaXplID0gRGF0YUJ1ZmZlci5nZXREYXRhVHlwZVNpemUoZGF0YVR5cGUpOwotICAgICAgICBpZihkYXRhRWxlbWVudFNpemUgJSBwaXhlbEJpdFN0cmlkZSAhPSAwKSB7Ci0gICAgICAgICAgICAvLyBhd3QuMjBEPVRoZSBudW1iZXIgb2YgYml0cyBwZXIgcGl4ZWwgaXMgbm90IGEgcG93ZXIgb2YgMiBvciBwaXhlbHMgc3BhbiBkYXRhIGVsZW1lbnQgYm91bmRhcmllcworICAgICAgICBpZiAoZGF0YUVsZW1lbnRTaXplICUgcGl4ZWxCaXRTdHJpZGUgIT0gMCkgeworICAgICAgICAgICAgLy8gYXd0LjIwRD1UaGUgbnVtYmVyIG9mIGJpdHMgcGVyIHBpeGVsIGlzIG5vdCBhIHBvd2VyIG9mIDIgb3IKKyAgICAgICAgICAgIC8vIHBpeGVscyBzcGFuIGRhdGEgZWxlbWVudCBib3VuZGFyaWVzCiAgICAgICAgICAgICB0aHJvdyBuZXcgUmFzdGVyRm9ybWF0RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIwRCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgaWYoZGF0YUJpdE9mZnNldCAlIG51bWJlck9mQml0cyAhPSAwKSB7CisgICAgICAgIGlmIChkYXRhQml0T2Zmc2V0ICUgbnVtYmVyT2ZCaXRzICE9IDApIHsKICAgICAgICAgICAgIC8vIGF3dC4yMEU9RGF0YSBCaXQgb2Zmc2V0IGlzIG5vdCBhIG11bHRpcGxlIG9mIHBpeGVsIGJpdCBzdHJpZGUKICAgICAgICAgICAgIHRocm93IG5ldyBSYXN0ZXJGb3JtYXRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjBFIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KQEAgLTk3LDE3ICsxMTgsMjAgQEAKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgTXVsdGlQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIHdpdGggdGhlIHNwZWNpZmllZAogICAgICAqIHBhcmFtZXRlcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFUeXBlIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHNhbXBsZXMuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBkYXRhLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlIGRhdGEuCi0gICAgICogQHBhcmFtIG51bWJlck9mQml0cyB0aGUgbnVtYmVyIG9mIGJpdHMgcGVyIHBpeGVsLgorICAgICAqIEBwYXJhbSBkYXRhVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgdHlwZSBvZiB0aGUgc2FtcGxlcy4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBudW1iZXJPZkJpdHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYml0cyBwZXIgcGl4ZWwuCiAgICAgICovCi0gICAgcHVibGljIE11bHRpUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbChpbnQgZGF0YVR5cGUsIGludCB3LCBpbnQgaCwKLSAgICAgICAgICAgIGludCBudW1iZXJPZkJpdHMpIHsKKyAgICBwdWJsaWMgTXVsdGlQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKGludCBkYXRhVHlwZSwgaW50IHcsIGludCBoLCBpbnQgbnVtYmVyT2ZCaXRzKSB7CiAKLSAgICAgICAgdGhpcyhkYXRhVHlwZSwgdywgaCwgbnVtYmVyT2ZCaXRzLCAobnVtYmVyT2ZCaXRzICogdyArCi0gICAgICAgICAgICAgICBEYXRhQnVmZmVyLmdldERhdGFUeXBlU2l6ZShkYXRhVHlwZSkgLSAxKSAvCi0gICAgICAgICAgICAgICBEYXRhQnVmZmVyLmdldERhdGFUeXBlU2l6ZShkYXRhVHlwZSksIDApOworICAgICAgICB0aGlzKGRhdGFUeXBlLCB3LCBoLCBudW1iZXJPZkJpdHMsCisgICAgICAgICAgICAgICAgKG51bWJlck9mQml0cyAqIHcgKyBEYXRhQnVmZmVyLmdldERhdGFUeXBlU2l6ZShkYXRhVHlwZSkgLSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgLyBEYXRhQnVmZmVyLmdldERhdGFUeXBlU2l6ZShkYXRhVHlwZSksIDApOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTE3LDM2ICsxNDEsMzYgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNjMiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogICAgICAgICBzd2l0Y2ggKGdldFRyYW5zZmVyVHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6Ci0gICAgICAgICAgICBieXRlIGJkYXRhW107Ci0gICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBiZGF0YSA9IG5ldyBieXRlWzFdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBiZGF0YSA9IChieXRlW10pIG9iajsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJkYXRhWzBdID0gKGJ5dGUpIGdldFNhbXBsZSh4LCB5LCAwLCBkYXRhKTsKLSAgICAgICAgICAgIG9iaiA9IGJkYXRhOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKLSAgICAgICAgICAgIHNob3J0IHNkYXRhW107Ci0gICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZGF0YSA9IG5ldyBzaG9ydFsxXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2RhdGEgPSAoc2hvcnRbXSkgb2JqOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2RhdGFbMF0gPSAoc2hvcnQpIGdldFNhbXBsZSh4LCB5LCAwLCBkYXRhKTsKLSAgICAgICAgICAgIG9iaiA9IHNkYXRhOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKLSAgICAgICAgICAgIGludCBpZGF0YVtdOwotICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWRhdGEgPSBuZXcgaW50WzFdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZGF0YSA9IChpbnRbXSkgb2JqOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWRhdGFbMF0gPSBnZXRTYW1wbGUoeCwgeSwgMCwgZGF0YSk7Ci0gICAgICAgICAgICBvYmogPSBpZGF0YTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKKyAgICAgICAgICAgICAgICBieXRlIGJkYXRhW107CisgICAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGJkYXRhID0gbmV3IGJ5dGVbMV07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYmRhdGEgPSAoYnl0ZVtdKW9iajsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYmRhdGFbMF0gPSAoYnl0ZSlnZXRTYW1wbGUoeCwgeSwgMCwgZGF0YSk7CisgICAgICAgICAgICAgICAgb2JqID0gYmRhdGE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6CisgICAgICAgICAgICAgICAgc2hvcnQgc2RhdGFbXTsKKyAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2RhdGEgPSBuZXcgc2hvcnRbMV07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2RhdGEgPSAoc2hvcnRbXSlvYmo7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNkYXRhWzBdID0gKHNob3J0KWdldFNhbXBsZSh4LCB5LCAwLCBkYXRhKTsKKyAgICAgICAgICAgICAgICBvYmogPSBzZGF0YTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKKyAgICAgICAgICAgICAgICBpbnQgaWRhdGFbXTsKKyAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWRhdGEgPSBuZXcgaW50WzFdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlkYXRhID0gKGludFtdKW9iajsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWRhdGFbMF0gPSBnZXRTYW1wbGUoeCwgeSwgMCwgZGF0YSk7CisgICAgICAgICAgICAgICAgb2JqID0gaWRhdGE7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gb2JqOwpAQCAtMTU4LDE0ICsxODIsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGlzIE11bHRpUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCBvYmplY3Qgd2l0aCAKLSAgICAgKiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KKyAgICAgKiBDb21wYXJlcyB0aGlzIE11bHRpUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogb2JqZWN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBvIHRoZSBPYmplY3QgdG8gYmUgY29tcGFyZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgb2JqZWN0IGlzIGEgTXVsdGlQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIAotICAgICAqIHdpdGggdGhlIHNhbWUgZGF0YSBwYXJhbWV0ZXIgdmFsdWVzIGFzIHRoaXMgTXVsdGlQaXhlbFBhY2tlZFNhbXBsZU1vZGVsLAotICAgICAqIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcGFyYW0gbworICAgICAqICAgICAgICAgICAgdGhlIE9iamVjdCB0byBiZSBjb21wYXJlZC4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBvYmplY3QgaXMgYSBNdWx0aVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgd2l0aCB0aGUKKyAgICAgKiAgICAgICAgIHNhbWUgZGF0YSBwYXJhbWV0ZXIgdmFsdWVzIGFzIHRoaXMgTXVsdGlQaXhlbFBhY2tlZFNhbXBsZU1vZGVsLAorICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewpAQCAtMTczLDE3ICsxOTcsMTQgQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCi0gICAgICAgIE11bHRpUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCBtb2RlbCA9IChNdWx0aVBpeGVsUGFja2VkU2FtcGxlTW9kZWwpIG87Ci0gICAgICAgIHJldHVybiB0aGlzLndpZHRoID09IG1vZGVsLndpZHRoICYmCi0gICAgICAgICAgICAgICB0aGlzLmhlaWdodCA9PSBtb2RlbC5oZWlnaHQgJiYKLSAgICAgICAgICAgICAgIHRoaXMubnVtQmFuZHMgPT0gbW9kZWwubnVtQmFuZHMgJiYKLSAgICAgICAgICAgICAgIHRoaXMuZGF0YVR5cGUgPT0gbW9kZWwuZGF0YVR5cGUgJiYKLSAgICAgICAgICAgICAgIHRoaXMucGl4ZWxCaXRTdHJpZGUgPT0gbW9kZWwucGl4ZWxCaXRTdHJpZGUgJiYKLSAgICAgICAgICAgICAgIHRoaXMuYml0TWFzayA9PSBtb2RlbC5iaXRNYXNrICYmCi0gICAgICAgICAgICAgICB0aGlzLnBpeGVsc1BlckRhdGFFbGVtZW50ID09IG1vZGVsLnBpeGVsc1BlckRhdGFFbGVtZW50ICYmCi0gICAgICAgICAgICAgICB0aGlzLmRhdGFFbGVtZW50U2l6ZSA9PSBtb2RlbC5kYXRhRWxlbWVudFNpemUgJiYKLSAgICAgICAgICAgICAgIHRoaXMuZGF0YUJpdE9mZnNldCA9PSBtb2RlbC5kYXRhQml0T2Zmc2V0ICYmCi0gICAgICAgICAgICAgICB0aGlzLnNjYW5saW5lU3RyaWRlID09IG1vZGVsLnNjYW5saW5lU3RyaWRlOworICAgICAgICBNdWx0aVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgbW9kZWwgPSAoTXVsdGlQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKW87CisgICAgICAgIHJldHVybiB0aGlzLndpZHRoID09IG1vZGVsLndpZHRoICYmIHRoaXMuaGVpZ2h0ID09IG1vZGVsLmhlaWdodAorICAgICAgICAgICAgICAgICYmIHRoaXMubnVtQmFuZHMgPT0gbW9kZWwubnVtQmFuZHMgJiYgdGhpcy5kYXRhVHlwZSA9PSBtb2RlbC5kYXRhVHlwZQorICAgICAgICAgICAgICAgICYmIHRoaXMucGl4ZWxCaXRTdHJpZGUgPT0gbW9kZWwucGl4ZWxCaXRTdHJpZGUgJiYgdGhpcy5iaXRNYXNrID09IG1vZGVsLmJpdE1hc2sKKyAgICAgICAgICAgICAgICAmJiB0aGlzLnBpeGVsc1BlckRhdGFFbGVtZW50ID09IG1vZGVsLnBpeGVsc1BlckRhdGFFbGVtZW50CisgICAgICAgICAgICAgICAgJiYgdGhpcy5kYXRhRWxlbWVudFNpemUgPT0gbW9kZWwuZGF0YUVsZW1lbnRTaXplCisgICAgICAgICAgICAgICAgJiYgdGhpcy5kYXRhQml0T2Zmc2V0ID09IG1vZGVsLmRhdGFCaXRPZmZzZXQKKyAgICAgICAgICAgICAgICAmJiB0aGlzLnNjYW5saW5lU3RyaWRlID09IG1vZGVsLnNjYW5saW5lU3RyaWRlOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMjMxLDggKzI1Miw3IEBACiAKICAgICAgICAgaW50IGJpdG51bSA9IGRhdGFCaXRPZmZzZXQgKyB4ICogcGl4ZWxCaXRTdHJpZGU7CiAgICAgICAgIGludCBlbGVtID0gZGF0YS5nZXRFbGVtKHkgKiBzY2FubGluZVN0cmlkZSArIGJpdG51bSAvIGRhdGFFbGVtZW50U2l6ZSk7Ci0gICAgICAgIGludCBzaGlmdCA9IGRhdGFFbGVtZW50U2l6ZSAtIChiaXRudW0gJiAoZGF0YUVsZW1lbnRTaXplIC0gMSkpIC0KLSAgICAgICAgICAgICAgICBwaXhlbEJpdFN0cmlkZTsKKyAgICAgICAgaW50IHNoaWZ0ID0gZGF0YUVsZW1lbnRTaXplIC0gKGJpdG51bSAmIChkYXRhRWxlbWVudFNpemUgLSAxKSkgLSBwaXhlbEJpdFN0cmlkZTsKIAogICAgICAgICByZXR1cm4gKGVsZW0gPj4gc2hpZnQpICYgYml0TWFzazsKICAgICB9CkBAIC0yNTMsMTUgKzI3MywxNSBAQAogICAgICAgICBpbnQgc2l6ZSA9IHNjYW5saW5lU3RyaWRlICogaGVpZ2h0OwogCiAgICAgICAgIHN3aXRjaCAoZGF0YVR5cGUpIHsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKLSAgICAgICAgICAgIGRhdGFCdWZmZXIgPSBuZXcgRGF0YUJ1ZmZlckJ5dGUoc2l6ZSArIChkYXRhQml0T2Zmc2V0ICsgNykgLyA4KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6Ci0gICAgICAgICAgICBkYXRhQnVmZmVyID0gbmV3IERhdGFCdWZmZXJVU2hvcnQoc2l6ZSArIChkYXRhQml0T2Zmc2V0ICsgMTUpIC8gMTYpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKLSAgICAgICAgICAgIGRhdGFCdWZmZXIgPSBuZXcgRGF0YUJ1ZmZlckludChzaXplICsgKGRhdGFCaXRPZmZzZXQgKyAzMSkgLyAzMik7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6CisgICAgICAgICAgICAgICAgZGF0YUJ1ZmZlciA9IG5ldyBEYXRhQnVmZmVyQnl0ZShzaXplICsgKGRhdGFCaXRPZmZzZXQgKyA3KSAvIDgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgorICAgICAgICAgICAgICAgIGRhdGFCdWZmZXIgPSBuZXcgRGF0YUJ1ZmZlclVTaG9ydChzaXplICsgKGRhdGFCaXRPZmZzZXQgKyAxNSkgLyAxNik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6CisgICAgICAgICAgICAgICAgZGF0YUJ1ZmZlciA9IG5ldyBEYXRhQnVmZmVySW50KHNpemUgKyAoZGF0YUJpdE9mZnNldCArIDMxKSAvIDMyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZGF0YUJ1ZmZlcjsKICAgICB9CkBAIC0yNjksMTQgKzI4OSwxNCBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG9mZnNldCBvZiB0aGUgc3BlY2lmaWVkIHBpeGVsIGluIHRoZSBkYXRhIGFycmF5LgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHNwZWNpZmllZCBwaXhlbC4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBzcGVjaWZpZWQgcGl4ZWwuCi0gICAgICogCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHNwZWNpZmllZCBwaXhlbC4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgc3BlY2lmaWVkIHBpeGVsLgogICAgICAqIEByZXR1cm4gdGhlIG9mZnNldCBvZiB0aGUgc3BlY2lmaWVkIHBpeGVsLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0T2Zmc2V0KGludCB4LCBpbnQgeSkgewotICAgICAgICByZXR1cm4geSAqIHNjYW5saW5lU3RyaWRlICsgKHggKiBwaXhlbEJpdFN0cmlkZSArIGRhdGFCaXRPZmZzZXQpIC8KLSAgICAgICAgICAgICAgIGRhdGFFbGVtZW50U2l6ZTsKKyAgICAgICAgcmV0dXJuIHkgKiBzY2FubGluZVN0cmlkZSArICh4ICogcGl4ZWxCaXRTdHJpZGUgKyBkYXRhQml0T2Zmc2V0KSAvIGRhdGFFbGVtZW50U2l6ZTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTI4NSwxMSArMzA1LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgYml0IG9mZnNldCBpbiB0aGUgZGF0YSBlbGVtZW50IHdoaWNoIAotICAgICAqIGlzIHN0b3JlZCBmb3IgdGhlIHNwZWNpZmllZCBwaXhlbCBvZiBhIHNjYW5saW5lLgorICAgICAqIEdldHMgdGhlIGJpdCBvZmZzZXQgaW4gdGhlIGRhdGEgZWxlbWVudCB3aGljaCBpcyBzdG9yZWQgZm9yIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBwaXhlbCBvZiBhIHNjYW5saW5lLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBwaXhlbC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIHBpeGVsLgogICAgICAqIEByZXR1cm4gdGhlIGJpdCBvZmZzZXQgb2YgdGhlIHBpeGVsIGluIHRoZSBkYXRhIGVsZW1lbnQuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRCaXRPZmZzZXQoaW50IHgpIHsKQEAgLTI5OCw3ICszMTgsOSBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludFtdIGdldFNhbXBsZVNpemUoKSB7Ci0gICAgICAgIGludCBzYW1wbGVTaXplc1tdID0geyBwaXhlbEJpdFN0cmlkZSB9OworICAgICAgICBpbnQgc2FtcGxlU2l6ZXNbXSA9IHsKKyAgICAgICAgICAgIHBpeGVsQml0U3RyaWRlCisgICAgICAgIH07CiAgICAgICAgIHJldHVybiBzYW1wbGVTaXplczsKICAgICB9CiAKQEAgLTM5Niw1NCArNDE4LDU4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCBieSBvdGhlciBtZXRob2RzIG9mIHRoaXMgY2xhc3MuIFRoZSBiZWhhdmlvdXIgb2YKLSAgICAgKiB0aGlzIG1ldGhvZCBkZXBlbmRzIG9uIHRoZSBtZXRob2Qgd2hpY2ggaGFzIGJlZW4gaW52b2tlIHRoaXMgb25lLiBUaGUKLSAgICAgKiBhcmd1bWVudCBtZXRob2RJZCBpcyB1c2VkIHRvIGNob29zZSB2YWxpZCBiZWhhdmlvdXIgaW4gYSBwYXJ0aWN1bGFyIGNhc2UuCi0gICAgICogSWYgbWV0aG9kSWQgaXMgZXF1YWwgdG8gMSBpdCBtZWFucyB0aGF0IHRoaXMgbWV0aG9kIGhhcyBiZWVuIGludm9rZWQgYnkKLSAgICAgKiB0aGUgc2V0RGF0YUVsZW1lbnRzKCkgbWV0aG9kLCAyIC0gbWVhbnMgc2V0UGl4ZWwoKSwgYW5kIHNldFNhbXBsZSgpIGluCi0gICAgICogYW55IG90aGVyIGNhc2VzLgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgb3RoZXIgbWV0aG9kcyBvZiB0aGlzIGNsYXNzLiBUaGUgYmVoYXZpb3Igb2YgdGhpcworICAgICAqIG1ldGhvZCBkZXBlbmRzIG9uIHRoZSBtZXRob2Qgd2hpY2ggaGFzIGJlZW4gaW52b2tlIHRoaXMgb25lLiBUaGUgYXJndW1lbnQKKyAgICAgKiBtZXRob2RJZCBpcyB1c2VkIHRvIGNob29zZSB2YWxpZCBiZWhhdmlvciBpbiBhIHBhcnRpY3VsYXIgY2FzZS4gSWYKKyAgICAgKiBtZXRob2RJZCBpcyBlcXVhbCB0byAxIGl0IG1lYW5zIHRoYXQgdGhpcyBtZXRob2QgaGFzIGJlZW4gaW52b2tlZCBieSB0aGUKKyAgICAgKiBzZXREYXRhRWxlbWVudHMoKSBtZXRob2QsIDIgLSBtZWFucyBzZXRQaXhlbCgpLCBhbmQgc2V0U2FtcGxlKCkgaW4gYW55CisgICAgICogb3RoZXIgY2FzZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIHgKLSAgICAgKiBAcGFyYW0geSB0aGUgeQotICAgICAqIEBwYXJhbSBvYmogdGhlIG9iagotICAgICAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhCi0gICAgICogQHBhcmFtIG1ldGhvZElkIHRoZSBtZXRob2QgaWQKLSAgICAgKiBAcGFyYW0gcyB0aGUgcworICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgeC4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIHkuCisgICAgICogQHBhcmFtIG9iagorICAgICAqICAgICAgICAgICAgdGhlIG9iai4KKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGRhdGEuCisgICAgICogQHBhcmFtIG1ldGhvZElkCisgICAgICogICAgICAgICAgICB0aGUgbWV0aG9kIGlkLgorICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICB0aGUgcy4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0U2FtcGxlKGZpbmFsIGludCB4LCBmaW5hbCBpbnQgeSwgZmluYWwgT2JqZWN0IG9iaiwKLSAgICAgICAgICAgIGZpbmFsIERhdGFCdWZmZXIgZGF0YSwgZmluYWwgaW50IG1ldGhvZElkLCBpbnQgcykgeworICAgIHByaXZhdGUgdm9pZCBzZXRTYW1wbGUoZmluYWwgaW50IHgsIGZpbmFsIGludCB5LCBmaW5hbCBPYmplY3Qgb2JqLCBmaW5hbCBEYXRhQnVmZmVyIGRhdGEsCisgICAgICAgICAgICBmaW5hbCBpbnQgbWV0aG9kSWQsIGludCBzKSB7CiAgICAgICAgIGlmICgoeCA8IDApIHx8ICh5IDwgMCkgfHwgKHggPj0gdGhpcy53aWR0aCkgfHwgKHkgPj0gdGhpcy5oZWlnaHQpKSB7CiAgICAgICAgICAgICAvLyBhd3QuNjM9Q29vcmRpbmF0ZXMgYXJlIG5vdCBpbiBib3VuZHMKLSAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTWVzc2FnZXMKLSAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygiYXd0LjYzIikpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjYzIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAogICAgICAgICBmaW5hbCBpbnQgYml0bnVtID0gZGF0YUJpdE9mZnNldCArIHggKiBwaXhlbEJpdFN0cmlkZTsKICAgICAgICAgZmluYWwgaW50IGlkeCA9IHkgKiBzY2FubGluZVN0cmlkZSArIGJpdG51bSAvIGRhdGFFbGVtZW50U2l6ZTsKLSAgICAgICAgZmluYWwgaW50IHNoaWZ0ID0gZGF0YUVsZW1lbnRTaXplIC0gKGJpdG51bSAmIChkYXRhRWxlbWVudFNpemUgLSAxKSkKLSAgICAgICAgICAgICAgICAtIHBpeGVsQml0U3RyaWRlOworICAgICAgICBmaW5hbCBpbnQgc2hpZnQgPSBkYXRhRWxlbWVudFNpemUgLSAoYml0bnVtICYgKGRhdGFFbGVtZW50U2l6ZSAtIDEpKSAtIHBpeGVsQml0U3RyaWRlOwogICAgICAgICBmaW5hbCBpbnQgbWFzayA9IH4oYml0TWFzayA8PCBzaGlmdCk7CiAgICAgICAgIGludCBlbGVtID0gZGF0YS5nZXRFbGVtKGlkeCk7CiAKICAgICAgICAgc3dpdGNoIChtZXRob2RJZCkgewotICAgICAgICBjYXNlIDE6IHsgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnZva2VkIGZyb20gc2V0RGF0YUVsZW1lbnRzKCkKLSAgICAgICAgICAgIHN3aXRjaCAoZ2V0VHJhbnNmZXJUeXBlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6Ci0gICAgICAgICAgICAgICAgcyA9ICgoYnl0ZVtdKSBvYmopWzBdICYgMHhmZjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKLSAgICAgICAgICAgICAgICBzID0gKChzaG9ydFtdKSBvYmopWzBdICYgMHhmZmZmOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgotICAgICAgICAgICAgICAgIHMgPSAoKGludFtdKSBvYmopWzBdOworICAgICAgICAgICAgY2FzZSAxOiB7IC8vIEludm9rZWQgZnJvbSBzZXREYXRhRWxlbWVudHMoKQorICAgICAgICAgICAgICAgIHN3aXRjaCAoZ2V0VHJhbnNmZXJUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAoKGJ5dGVbXSlvYmopWzBdICYgMHhmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gKChzaG9ydFtdKW9iailbMF0gJiAweGZmZmY7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgorICAgICAgICAgICAgICAgICAgICAgICAgcyA9ICgoaW50W10pb2JqKVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjogeyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludm9rZWQgZnJvbSBzZXRQaXhlbCgpCi0gICAgICAgICAgICBzID0gKChpbnRbXSkgb2JqKVswXTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CisgICAgICAgICAgICBjYXNlIDI6IHsgLy8gSW52b2tlZCBmcm9tIHNldFBpeGVsKCkKKyAgICAgICAgICAgICAgICBzID0gKChpbnRbXSlvYmopWzBdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgZWxlbSAmPSBtYXNrOwpAQCAtNDUxLDQgKzQ3NywzIEBACiAgICAgICAgIGRhdGEuc2V0RWxlbShpZHgsIGVsZW0pOwogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL1BhY2tlZENvbG9yTW9kZWwuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9QYWNrZWRDb2xvck1vZGVsLmphdmEKaW5kZXggN2FhZWZiZi4uNGQxYzJlNSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL1BhY2tlZENvbG9yTW9kZWwuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvUGFja2VkQ29sb3JNb2RlbC5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIElnb3IgVi4gU3RvbHlhcm92CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5pbWFnZTsKIAogaW1wb3J0IGphdmEuYXd0LlRyYW5zcGFyZW5jeTsKQEAgLTI3LDQ0ICsyOCw1NyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFRoZSBDbGFzcyBQYWNrZWRDb2xvck1vZGVsIHJlcHJlc2VudHMgYSBjb2xvciBtb2RlbCB3aGVyZSB0aGUgCi0gKiBjb21wb25lbnRzIGFyZSBqdXN0IHRoZSByZWQsIGdyZWVuLCBhbmQgYmx1ZSBiYW5kcywgcGx1cyBhbiBhbHBoYQotICogYmFuZCBpZiBhbHBoYSBpcyBzdXBwb3J0ZWQuCisgKiBUaGUgY2xhc3MgUGFja2VkQ29sb3JNb2RlbCByZXByZXNlbnRzIGEgY29sb3IgbW9kZWwgd2hlcmUgdGhlIGNvbXBvbmVudHMgYXJlCisgKiBqdXN0IHRoZSByZWQsIGdyZWVuLCBhbmQgYmx1ZSBiYW5kcywgcGx1cyBhbiBhbHBoYSBiYW5kIGlmIGFscGhhIGlzCisgKiBzdXBwb3J0ZWQuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGFja2VkQ29sb3JNb2RlbCBleHRlbmRzIENvbG9yTW9kZWwgewogCi0gICAgLyoqIFRoZSBjb21wb25lbnQgbWFza3MuICovCisgICAgLyoqCisgICAgICogVGhlIGNvbXBvbmVudCBtYXNrcy4KKyAgICAgKi8KICAgICBpbnQgY29tcG9uZW50TWFza3NbXTsKIAotICAgIC8qKiBUaGUgb2Zmc2V0cy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgb2Zmc2V0cy4KKyAgICAgKi8KICAgICBpbnQgb2Zmc2V0c1tdOwogCi0gICAgLyoqIFRoZSBzY2FsZXMuICovCisgICAgLyoqCisgICAgICogVGhlIHNjYWxlcy4KKyAgICAgKi8KICAgICBmbG9hdCBzY2FsZXNbXTsKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBwYWNrZWQgY29sb3IgbW9kZWwuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNwYWNlIHRoZSBjb2xvciBzcGFjZQotICAgICAqIEBwYXJhbSBiaXRzIHRoZSBhcnJheSBvZiBjb21wb25lbnQgbWFza3MKLSAgICAgKiBAcGFyYW0gY29sb3JNYXNrQXJyYXkgdGhlIGFycmF5IHRoYXQgZ2l2ZXMgdGhlIGJpdG1hc2sgY29ycmVzcG9uZGluZwotICAgICAqIHRvIGVhY2ggY29sb3IgYmFuZCAocmVkLCBncmVlbiwgYW5kIGJsdWUpCi0gICAgICogQHBhcmFtIGFscGhhTWFzayB0aGUgYml0bWFzayBjb3JyZXNwb25kaW5nIHRvIHRoZSBhbHBoYSBiYW5kCi0gICAgICogQHBhcmFtIGlzQWxwaGFQcmVtdWx0aXBsaWVkIHdoZXRoZXIgdGhlIGFscGhhIGlzIHByZW11bHRpcGxpZWQgaW4gdGhpcyBjb2xvciBtb2RlbAotICAgICAqIEBwYXJhbSB0cmFucyB0aGUgdHJhbnNwYXJlbmN5IHN0cmF0ZWd5LCBAc2VlIGphdmEuYXd0LlRyYW5zcGFyZW5jeQotICAgICAqIEBwYXJhbSB0cmFuc2ZlclR5cGUgdGhlIHRyYW5zZmVyIHR5cGUgKHByaW1pdGl2ZSBqYXZhIHR5cGUgCi0gICAgICogdG8gdXNlIGZvciB0aGUgY29tcG9uZW50cykKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGNvbWJpbmVkIAotICAgICAqIGJpdG1hc2tzIGZvciB0aGUgY29sb3IgYmFuZHMgaXMgbGVzcyB0aGFuIG9uZSBvciBncmVhdGVyIHRoYW4gMzIKKyAgICAgKiBAcGFyYW0gc3BhY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2xvciBzcGFjZS4KKyAgICAgKiBAcGFyYW0gYml0cworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGNvbXBvbmVudCBtYXNrcy4KKyAgICAgKiBAcGFyYW0gY29sb3JNYXNrQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSB0aGF0IGdpdmVzIHRoZSBiaXRtYXNrIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBjb2xvcgorICAgICAqICAgICAgICAgICAgYmFuZCAocmVkLCBncmVlbiwgYW5kIGJsdWUpLgorICAgICAqIEBwYXJhbSBhbHBoYU1hc2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBiaXRtYXNrIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFscGhhIGJhbmQuCisgICAgICogQHBhcmFtIGlzQWxwaGFQcmVtdWx0aXBsaWVkCisgICAgICogICAgICAgICAgICB3aGV0aGVyIHRoZSBhbHBoYSBpcyBwcmUtbXVsdGlwbGllZCBpbiB0aGlzIGNvbG9yIG1vZGVsLgorICAgICAqIEBwYXJhbSB0cmFucworICAgICAqICAgICAgICAgICAgdGhlIHRyYW5zcGFyZW5jeSBzdHJhdGVneSwgQHNlZSBqYXZhLmF3dC5UcmFuc3BhcmVuY3kuCisgICAgICogQHBhcmFtIHRyYW5zZmVyVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIHRyYW5zZmVyIHR5cGUgKHByaW1pdGl2ZSBqYXZhIHR5cGUgdG8gdXNlIGZvciB0aGUKKyAgICAgKiAgICAgICAgICAgIGNvbXBvbmVudHMpLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBjb21iaW5lZCBiaXRtYXNrcyBmb3IgdGhlIGNvbG9yCisgICAgICogICAgICAgICAgICAgYmFuZHMgaXMgbGVzcyB0aGFuIG9uZSBvciBncmVhdGVyIHRoYW4gMzIuCiAgICAgICovCi0gICAgcHVibGljIFBhY2tlZENvbG9yTW9kZWwoQ29sb3JTcGFjZSBzcGFjZSwgaW50IGJpdHMsIGludCBjb2xvck1hc2tBcnJheVtdLAotICAgICAgICAgICAgaW50IGFscGhhTWFzaywgYm9vbGVhbiBpc0FscGhhUHJlbXVsdGlwbGllZCwgaW50IHRyYW5zLAotICAgICAgICAgICAgaW50IHRyYW5zZmVyVHlwZSkgeworICAgIHB1YmxpYyBQYWNrZWRDb2xvck1vZGVsKENvbG9yU3BhY2Ugc3BhY2UsIGludCBiaXRzLCBpbnQgY29sb3JNYXNrQXJyYXlbXSwgaW50IGFscGhhTWFzaywKKyAgICAgICAgICAgIGJvb2xlYW4gaXNBbHBoYVByZW11bHRpcGxpZWQsIGludCB0cmFucywgaW50IHRyYW5zZmVyVHlwZSkgewogCi0gICAgICAgIHN1cGVyKGJpdHMsIGNyZWF0ZUJpdHMoY29sb3JNYXNrQXJyYXksIGFscGhhTWFzayksIHNwYWNlLAotICAgICAgICAgICAgICAgIChhbHBoYU1hc2sgPT0gMCA/IGZhbHNlIDogdHJ1ZSksIGlzQWxwaGFQcmVtdWx0aXBsaWVkLCB0cmFucywKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZVRyYW5zZmVyVHlwZSh0cmFuc2ZlclR5cGUpKTsKKyAgICAgICAgc3VwZXIoYml0cywgY3JlYXRlQml0cyhjb2xvck1hc2tBcnJheSwgYWxwaGFNYXNrKSwgc3BhY2UsIChhbHBoYU1hc2sgPT0gMCA/IGZhbHNlIDogdHJ1ZSksCisgICAgICAgICAgICAgICAgaXNBbHBoYVByZW11bHRpcGxpZWQsIHRyYW5zLCB2YWxpZGF0ZVRyYW5zZmVyVHlwZSh0cmFuc2ZlclR5cGUpKTsKIAogICAgICAgICBpZiAocGl4ZWxfYml0cyA8IDEgfHwgcGl4ZWxfYml0cyA+IDMyKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjM2PVRoZSBiaXRzIGlzIGxlc3MgdGhhbiAxIG9yIGdyZWF0ZXIgdGhhbiAzMgpAQCAtODksMjcgKzEwMywzNCBAQAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBwYWNrZWQgY29sb3IgbW9kZWwuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNwYWNlIHRoZSBjb2xvciBzcGFjZQotICAgICAqIEBwYXJhbSBiaXRzIHRoZSBhcnJheSBvZiBjb21wb25lbnQgbWFza3MKLSAgICAgKiBAcGFyYW0gcm1hc2sgdGhlIGJpdG1hc2sgY29ycmVzcG9uZGluZyB0byB0aGUgcmVkIGJhbmQKLSAgICAgKiBAcGFyYW0gZ21hc2sgdGhlIGJpdG1hc2sgY29ycmVzcG9uZGluZyB0byB0aGUgZ3JlZW4gYmFuZAotICAgICAqIEBwYXJhbSBibWFzayB0aGUgYml0bWFzayBjb3JyZXNwb25kaW5nIHRvIHRoZSBibHVlIGJhbmQKLSAgICAgKiBAcGFyYW0gYW1hc2sgdGhlIGJpdG1hc2sgY29ycmVzcG9uZGluZyB0byB0aGUgYWxwaGEgYmFuZAotICAgICAqIEBwYXJhbSBpc0FscGhhUHJlbXVsdGlwbGllZCB3aGV0aGVyIHRoZSBhbHBoYSBpcyBwcmVtdWx0aXBsaWVkIGluIHRoaXMgY29sb3IgbW9kZWwKLSAgICAgKiBAcGFyYW0gdHJhbnMgdGhlIHRyYW5zcGFyZW5jeSBzdHJhdGVneSwgQHNlZSBqYXZhLmF3dC5UcmFuc3BhcmVuY3kKLSAgICAgKiBAcGFyYW0gdHJhbnNmZXJUeXBlIHRoZSB0cmFuc2ZlciB0eXBlIChwcmltaXRpdmUgamF2YSB0eXBlIAotICAgICAqIHRvIHVzZSBmb3IgdGhlIGNvbXBvbmVudHMpCi0gICAgICogCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBjb21iaW5lZCAKLSAgICAgKiBiaXRtYXNrcyBmb3IgdGhlIGNvbG9yIGJhbmRzIGlzIGxlc3MgdGhhbiBvbmUgb3IgZ3JlYXRlciB0aGFuIDMyCisgICAgICogQHBhcmFtIHNwYWNlCisgICAgICogICAgICAgICAgICB0aGUgY29sb3Igc3BhY2UuCisgICAgICogQHBhcmFtIGJpdHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBjb21wb25lbnQgbWFza3MuCisgICAgICogQHBhcmFtIHJtYXNrCisgICAgICogICAgICAgICAgICB0aGUgYml0bWFzayBjb3JyZXNwb25kaW5nIHRvIHRoZSByZWQgYmFuZC4KKyAgICAgKiBAcGFyYW0gZ21hc2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBiaXRtYXNrIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdyZWVuIGJhbmQuCisgICAgICogQHBhcmFtIGJtYXNrCisgICAgICogICAgICAgICAgICB0aGUgYml0bWFzayBjb3JyZXNwb25kaW5nIHRvIHRoZSBibHVlIGJhbmQuCisgICAgICogQHBhcmFtIGFtYXNrCisgICAgICogICAgICAgICAgICB0aGUgYml0bWFzayBjb3JyZXNwb25kaW5nIHRvIHRoZSBhbHBoYSBiYW5kLgorICAgICAqIEBwYXJhbSBpc0FscGhhUHJlbXVsdGlwbGllZAorICAgICAqICAgICAgICAgICAgd2hldGhlciB0aGUgYWxwaGEgaXMgcHJlLW11bHRpcGxpZWQgaW4gdGhpcyBjb2xvciBtb2RlbC4KKyAgICAgKiBAcGFyYW0gdHJhbnMKKyAgICAgKiAgICAgICAgICAgIHRoZSB0cmFuc3BhcmVuY3kgc3RyYXRlZ3ksIEBzZWUgamF2YS5hd3QuVHJhbnNwYXJlbmN5LgorICAgICAqIEBwYXJhbSB0cmFuc2ZlclR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSB0cmFuc2ZlciB0eXBlIChwcmltaXRpdmUgamF2YSB0eXBlIHRvIHVzZSBmb3IgdGhlCisgICAgICogICAgICAgICAgICBjb21wb25lbnRzKS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgY29tYmluZWQgYml0bWFza3MgZm9yIHRoZSBjb2xvcgorICAgICAqICAgICAgICAgICAgIGJhbmRzIGlzIGxlc3MgdGhhbiBvbmUgb3IgZ3JlYXRlciB0aGFuIDMyLgogICAgICAqLwotICAgIHB1YmxpYyBQYWNrZWRDb2xvck1vZGVsKENvbG9yU3BhY2Ugc3BhY2UsIGludCBiaXRzLCBpbnQgcm1hc2ssIGludCBnbWFzaywKLSAgICAgICAgICAgIGludCBibWFzaywgaW50IGFtYXNrLCBib29sZWFuIGlzQWxwaGFQcmVtdWx0aXBsaWVkLCBpbnQgdHJhbnMsCi0gICAgICAgICAgICBpbnQgdHJhbnNmZXJUeXBlKSB7CisgICAgcHVibGljIFBhY2tlZENvbG9yTW9kZWwoQ29sb3JTcGFjZSBzcGFjZSwgaW50IGJpdHMsIGludCBybWFzaywgaW50IGdtYXNrLCBpbnQgYm1hc2ssIGludCBhbWFzaywKKyAgICAgICAgICAgIGJvb2xlYW4gaXNBbHBoYVByZW11bHRpcGxpZWQsIGludCB0cmFucywgaW50IHRyYW5zZmVyVHlwZSkgewogCi0gICAgICAgIHN1cGVyKGJpdHMsIGNyZWF0ZUJpdHMocm1hc2ssIGdtYXNrLCBibWFzaywgYW1hc2spLCBzcGFjZSwKLSAgICAgICAgICAgICAgICAoYW1hc2sgPT0gMCA/IGZhbHNlIDogdHJ1ZSksIGlzQWxwaGFQcmVtdWx0aXBsaWVkLCB0cmFucywKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZVRyYW5zZmVyVHlwZSh0cmFuc2ZlclR5cGUpKTsKKyAgICAgICAgc3VwZXIoYml0cywgY3JlYXRlQml0cyhybWFzaywgZ21hc2ssIGJtYXNrLCBhbWFzayksIHNwYWNlLCAoYW1hc2sgPT0gMCA/IGZhbHNlIDogdHJ1ZSksCisgICAgICAgICAgICAgICAgaXNBbHBoYVByZW11bHRpcGxpZWQsIHRyYW5zLCB2YWxpZGF0ZVRyYW5zZmVyVHlwZSh0cmFuc2ZlclR5cGUpKTsKIAogICAgICAgICBpZiAocGl4ZWxfYml0cyA8IDEgfHwgcGl4ZWxfYml0cyA+IDMyKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjM2PVRoZSBiaXRzIGlzIGxlc3MgdGhhbiAxIG9yIGdyZWF0ZXIgdGhhbiAzMgpAQCAtMTIzLDcgKzE0NCw4IEBACiAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2xvckNvbXBvbmVudHM7IGkrKykgewogICAgICAgICAgICAgaWYgKGNzLmdldE1pblZhbHVlKGkpICE9IDAuMGYgfHwgY3MuZ2V0TWF4VmFsdWUoaSkgIT0gMS4wZikgewotICAgICAgICAgICAgICAgIC8vIGF3dC4yM0E9VGhlIG1pbi9tYXggbm9ybWFsaXplZCBjb21wb25lbnQgdmFsdWVzIGFyZSBub3QgMC4wLzEuMAorICAgICAgICAgICAgICAgIC8vIGF3dC4yM0E9VGhlIG1pbi9tYXggbm9ybWFsaXplZCBjb21wb25lbnQgdmFsdWVzIGFyZSBub3QKKyAgICAgICAgICAgICAgICAvLyAwLjAvMS4wCiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yM0EiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTQ0LDcgKzE2Niw3IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgV3JpdGFibGVSYXN0ZXIgZ2V0QWxwaGFSYXN0ZXIoV3JpdGFibGVSYXN0ZXIgcmFzdGVyKSB7Ci0gICAgICAgIGlmKCFoYXNBbHBoYSkgeworICAgICAgICBpZiAoIWhhc0FscGhhKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogCkBAIC0xNjUsMTggKzE4NywxNiBAQAogICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBQYWNrZWRDb2xvck1vZGVsKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgICAgIFBhY2tlZENvbG9yTW9kZWwgY20gPSAoUGFja2VkQ29sb3JNb2RlbCkgb2JqOworICAgICAgICBQYWNrZWRDb2xvck1vZGVsIGNtID0gKFBhY2tlZENvbG9yTW9kZWwpb2JqOwogCi0gICAgICAgIHJldHVybiAocGl4ZWxfYml0cyA9PSBjbS5nZXRQaXhlbFNpemUoKSAmJgotICAgICAgICAgICAgICAgIHRyYW5zZmVyVHlwZSA9PSBjbS5nZXRUcmFuc2ZlclR5cGUoKSAmJgotICAgICAgICAgICAgICAgIGNzLmdldFR5cGUoKSA9PSBjbS5nZXRDb2xvclNwYWNlKCkuZ2V0VHlwZSgpICYmCi0gICAgICAgICAgICAgICAgaGFzQWxwaGEgPT0gY20uaGFzQWxwaGEoKSAmJgotICAgICAgICAgICAgICAgIGlzQWxwaGFQcmVtdWx0aXBsaWVkID09IGNtLmlzQWxwaGFQcmVtdWx0aXBsaWVkKCkgJiYKLSAgICAgICAgICAgICAgICB0cmFuc3BhcmVuY3kgPT0gY20uZ2V0VHJhbnNwYXJlbmN5KCkgJiYKLSAgICAgICAgICAgICAgICBudW1Db2xvckNvbXBvbmVudHMgPT0gY20uZ2V0TnVtQ29sb3JDb21wb25lbnRzKCkmJgotICAgICAgICAgICAgICAgIG51bUNvbXBvbmVudHMgPT0gY20uZ2V0TnVtQ29tcG9uZW50cygpICYmCi0gICAgICAgICAgICAgICAgQXJyYXlzLmVxdWFscyhiaXRzLCBjbS5nZXRDb21wb25lbnRTaXplKCkpICYmCi0gICAgICAgICAgICAgICAgQXJyYXlzLmVxdWFscyhjb21wb25lbnRNYXNrcywgY20uZ2V0TWFza3MoKSkpOworICAgICAgICByZXR1cm4gKHBpeGVsX2JpdHMgPT0gY20uZ2V0UGl4ZWxTaXplKCkgJiYgdHJhbnNmZXJUeXBlID09IGNtLmdldFRyYW5zZmVyVHlwZSgpCisgICAgICAgICAgICAgICAgJiYgY3MuZ2V0VHlwZSgpID09IGNtLmdldENvbG9yU3BhY2UoKS5nZXRUeXBlKCkgJiYgaGFzQWxwaGEgPT0gY20uaGFzQWxwaGEoKQorICAgICAgICAgICAgICAgICYmIGlzQWxwaGFQcmVtdWx0aXBsaWVkID09IGNtLmlzQWxwaGFQcmVtdWx0aXBsaWVkKCkKKyAgICAgICAgICAgICAgICAmJiB0cmFuc3BhcmVuY3kgPT0gY20uZ2V0VHJhbnNwYXJlbmN5KCkKKyAgICAgICAgICAgICAgICAmJiBudW1Db2xvckNvbXBvbmVudHMgPT0gY20uZ2V0TnVtQ29sb3JDb21wb25lbnRzKCkKKyAgICAgICAgICAgICAgICAmJiBudW1Db21wb25lbnRzID09IGNtLmdldE51bUNvbXBvbmVudHMoKQorICAgICAgICAgICAgICAgICYmIEFycmF5cy5lcXVhbHMoYml0cywgY20uZ2V0Q29tcG9uZW50U2l6ZSgpKSAmJiBBcnJheXMuZXF1YWxzKGNvbXBvbmVudE1hc2tzLCBjbQorICAgICAgICAgICAgICAgIC5nZXRNYXNrcygpKSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xODcsMjUgKzIwNywyMyBAQAogICAgICAgICBpZiAoIShzbSBpbnN0YW5jZW9mIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCBlc20gPSAoU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCkgc207CisgICAgICAgIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgZXNtID0gKFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwpc207CiAKLSAgICAgICAgcmV0dXJuICgoZXNtLmdldE51bUJhbmRzKCkgPT0gbnVtQ29tcG9uZW50cykgJiYKLSAgICAgICAgICAgICAgICAoZXNtLmdldFRyYW5zZmVyVHlwZSgpID09IHRyYW5zZmVyVHlwZSkgJiYKLSAgICAgICAgICAgICAgICBBcnJheXMuZXF1YWxzKGVzbS5nZXRCaXRNYXNrcygpLCBjb21wb25lbnRNYXNrcykpOworICAgICAgICByZXR1cm4gKChlc20uZ2V0TnVtQmFuZHMoKSA9PSBudW1Db21wb25lbnRzKSAmJiAoZXNtLmdldFRyYW5zZmVyVHlwZSgpID09IHRyYW5zZmVyVHlwZSkgJiYgQXJyYXlzCisgICAgICAgICAgICAgICAgLmVxdWFscyhlc20uZ2V0Qml0TWFza3MoKSwgY29tcG9uZW50TWFza3MpKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU2FtcGxlTW9kZWwgY3JlYXRlQ29tcGF0aWJsZVNhbXBsZU1vZGVsKGludCB3LCBpbnQgaCkgewotICAgICAgICByZXR1cm4gbmV3IFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwodHJhbnNmZXJUeXBlLCB3LCBoLAotICAgICAgICAgICAgICAgIGNvbXBvbmVudE1hc2tzKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKHRyYW5zZmVyVHlwZSwgdywgaCwgY29tcG9uZW50TWFza3MpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGJpdG1hc2sgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGNvbG9yIGNvbXBvbmVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBkZXNpcmVkIGNvbG9yCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWFzaworICAgICAqIEBwYXJhbSBpbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBkZXNpcmVkIGNvbG9yLgorICAgICAqIEByZXR1cm4gdGhlIG1hc2suCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGludCBnZXRNYXNrKGludCBpbmRleCkgewogICAgICAgICByZXR1cm4gY29tcG9uZW50TWFza3NbaW5kZXhdOwpAQCAtMjE0LDcgKzIzMiw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgYml0bWFza3Mgb2YgdGhlIGNvbXBvbmVudHMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWFza3MKKyAgICAgKiBAcmV0dXJuIHRoZSBtYXNrcy4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50W10gZ2V0TWFza3MoKSB7CiAgICAgICAgIHJldHVybiAoY29tcG9uZW50TWFza3MuY2xvbmUoKSk7CkBAIC0yMjMsMTAgKzI0MSwxMSBAQAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgdGhlIGJpdHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNvbG9yTWFza0FycmF5IHRoZSBjb2xvciBtYXNrIGFycmF5Ci0gICAgICogQHBhcmFtIGFscGhhTWFzayB0aGUgYWxwaGEgbWFzawotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGludFtdCisgICAgICogQHBhcmFtIGNvbG9yTWFza0FycmF5CisgICAgICogICAgICAgICAgICB0aGUgY29sb3IgbWFzayBhcnJheS4KKyAgICAgKiBAcGFyYW0gYWxwaGFNYXNrCisgICAgICogICAgICAgICAgICB0aGUgYWxwaGEgbWFzay4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnRbXS4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBpbnRbXSBjcmVhdGVCaXRzKGludCBjb2xvck1hc2tBcnJheVtdLCBpbnQgYWxwaGFNYXNrKSB7CiAgICAgICAgIGludCBiaXRzW107CkBAIC0yNjIsMTUgKzI4MSwxNyBAQAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgdGhlIGJpdHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHJtYXNrIHRoZSBybWFzawotICAgICAqIEBwYXJhbSBnbWFzayB0aGUgZ21hc2sKLSAgICAgKiBAcGFyYW0gYm1hc2sgdGhlIGJtYXNrCi0gICAgICogQHBhcmFtIGFtYXNrIHRoZSBhbWFzawotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGludFtdCisgICAgICogQHBhcmFtIHJtYXNrCisgICAgICogICAgICAgICAgICB0aGUgcm1hc2suCisgICAgICogQHBhcmFtIGdtYXNrCisgICAgICogICAgICAgICAgICB0aGUgZ21hc2suCisgICAgICogQHBhcmFtIGJtYXNrCisgICAgICogICAgICAgICAgICB0aGUgYm1hc2suCisgICAgICogQHBhcmFtIGFtYXNrCisgICAgICogICAgICAgICAgICB0aGUgYW1hc2suCisgICAgICogQHJldHVybiB0aGUgaW50W10uCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50W10gY3JlYXRlQml0cyhpbnQgcm1hc2ssIGludCBnbWFzaywgaW50IGJtYXNrLAotICAgICAgICAgICAgaW50IGFtYXNrKSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50W10gY3JlYXRlQml0cyhpbnQgcm1hc2ssIGludCBnbWFzaywgaW50IGJtYXNrLCBpbnQgYW1hc2spIHsKIAogICAgICAgICBpbnQgbnVtQ29tcDsKICAgICAgICAgaWYgKGFtYXNrID09IDApIHsKQEAgLTMxMiw5ICszMzMsOSBAQAogICAgIC8qKgogICAgICAqIENvdW50IGNvbXAgYml0cy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29tcE1hc2sgdGhlIGNvbXAgbWFzawotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGludAorICAgICAqIEBwYXJhbSBjb21wTWFzaworICAgICAqICAgICAgICAgICAgdGhlIGNvbXAgbWFzay4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNvdW50Q29tcEJpdHMoaW50IGNvbXBNYXNrKSB7CiAgICAgICAgIGludCBiaXRzID0gMDsKQEAgLTM0MCwyMCArMzYxLDE5IEBACiAgICAgLyoqCiAgICAgICogVmFsaWRhdGUgdHJhbnNmZXIgdHlwZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHJhbnNmZXJUeXBlIHRoZSB0cmFuc2ZlciB0eXBlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW50CisgICAgICogQHBhcmFtIHRyYW5zZmVyVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIHRyYW5zZmVyIHR5cGUuCisgICAgICogQHJldHVybiB0aGUgaW50LgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGludCB2YWxpZGF0ZVRyYW5zZmVyVHlwZShpbnQgdHJhbnNmZXJUeXBlKSB7Ci0gICAgICAgIGlmICh0cmFuc2ZlclR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX0JZVEUgJiYKLSAgICAgICAgICAgICAgICB0cmFuc2ZlclR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVCAmJgotICAgICAgICAgICAgICAgIHRyYW5zZmVyVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfSU5UKSB7CisgICAgICAgIGlmICh0cmFuc2ZlclR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX0JZVEUgJiYgdHJhbnNmZXJUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9VU0hPUlQKKyAgICAgICAgICAgICAgICAmJiB0cmFuc2ZlclR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX0lOVCkgewogICAgICAgICAgICAgLy8gYXd0LjI0MD1UaGUgdHJhbnNmZXJUeXBlIG5vdCBpcyBvbmUgb2YgRGF0YUJ1ZmZlci5UWVBFX0JZVEUsCi0gICAgICAgICAgICAvLyAgICAgICAgICBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUIG9yIERhdGFCdWZmZXIuVFlQRV9JTlQKKyAgICAgICAgICAgIC8vIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQgb3IgRGF0YUJ1ZmZlci5UWVBFX0lOVAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNDAiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogICAgICAgICByZXR1cm4gdHJhbnNmZXJUeXBlOwotfQorICAgIH0KIAogICAgIC8qKgogICAgICAqIFBhcnNlcyB0aGUgY29tcG9uZW50cy4KQEAgLTM4MCw0ICs0MDAsMyBAQAogICAgIH0KIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsLmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsLmphdmEKaW5kZXggZTQxNDczZS4uOGU2NDZmOCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL1BpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9QaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwuamF2YQpAQCAtMTgsMzAgKzE4LDM5IEBACiAgKiBAYXV0aG9yIElnb3IgVi4gU3RvbHlhcm92CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5pbWFnZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFRoZSBQaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwgY2xhc3MgcmVwcmVzZW50cyBpbWFnZSBkYXRhIAotICogYXMgcmVwcmVzZW50ZWQgYXMgaW50ZXJsZWF2ZWQgcGl4ZWxzIGFuZCBmb3Igd2hpY2ggZWFjaCBzYW1wbGUgb2YgCi0gKiBhIHBpeGVsIHRha2VzIG9uZSBkYXRhIGVsZW1lbnQgb2YgdGhlIERhdGFCdWZmZXIuCisgKiBUaGUgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsIGNsYXNzIHJlcHJlc2VudHMgaW1hZ2UgZGF0YSBhcyByZXByZXNlbnRlZCBhcworICogaW50ZXJsZWF2ZWQgcGl4ZWxzIGFuZCBmb3Igd2hpY2ggZWFjaCBzYW1wbGUgb2YgYSBwaXhlbCB0YWtlcyBvbmUgZGF0YQorICogZWxlbWVudCBvZiB0aGUgRGF0YUJ1ZmZlci4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBQaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwgZXh0ZW5kcyBDb21wb25lbnRTYW1wbGVNb2RlbCB7CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsIHdpdGggdGhlIAotICAgICAqIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBQaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogcGFyYW1ldGVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YVR5cGUgdGhlIGRhdGEgdHlwZSBvZiB0aGUgc2FtcGxlcy4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIGltYWdlIGRhdGEuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gcGl4ZWxTdHJpZGUgdGhlIHBpeGVsIHN0cmlkZSBvZiB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gc2NhbmxpbmVTdHJpZGUgdGhlIHNjYW5saW5lIHN0cmlkZSBvZiB0aGUgb2YgdGhlIGltYWdlIGRhdGEuCi0gICAgICogQHBhcmFtIGJhbmRPZmZzZXRzIHRoZSBhcnJheSBvZiB0aGUgYmFuZCBvZmZzZXRzLgorICAgICAqIEBwYXJhbSBkYXRhVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgdHlwZSBvZiB0aGUgc2FtcGxlcy4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBwaXhlbFN0cmlkZQorICAgICAqICAgICAgICAgICAgdGhlIHBpeGVsIHN0cmlkZSBvZiB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gc2NhbmxpbmVTdHJpZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzY2FubGluZSBzdHJpZGUgb2YgdGhlIG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBiYW5kT2Zmc2V0cworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIHRoZSBiYW5kIG9mZnNldHMuCiAgICAgICovCi0gICAgcHVibGljIFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbChpbnQgZGF0YVR5cGUsIGludCB3LCBpbnQgaCwKLSAgICAgICAgICAgIGludCBwaXhlbFN0cmlkZSwgaW50IHNjYW5saW5lU3RyaWRlLCBpbnQgYmFuZE9mZnNldHNbXSkgeworICAgIHB1YmxpYyBQaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwoaW50IGRhdGFUeXBlLCBpbnQgdywgaW50IGgsIGludCBwaXhlbFN0cmlkZSwKKyAgICAgICAgICAgIGludCBzY2FubGluZVN0cmlkZSwgaW50IGJhbmRPZmZzZXRzW10pIHsKIAogICAgICAgICBzdXBlcihkYXRhVHlwZSwgdywgaCwgcGl4ZWxTdHJpZGUsIHNjYW5saW5lU3RyaWRlLCBiYW5kT2Zmc2V0cyk7CiAKQEAgLTU5LDcgKzY4LDggQEAKICAgICAgICAgbWF4T2Zmc2V0IC09IG1pbk9mZnNldDsKIAogICAgICAgICBpZiAobWF4T2Zmc2V0ID4gc2NhbmxpbmVTdHJpZGUpIHsKLSAgICAgICAgICAgIC8vIGF3dC4yNDE9QW55IG9mZnNldCBiZXR3ZWVuIGJhbmRzIGlzIGdyZWF0ZXIgdGhhbiB0aGUgU2NhbmxpbmUgc3RyaWRlCisgICAgICAgICAgICAvLyBhd3QuMjQxPUFueSBvZmZzZXQgYmV0d2VlbiBiYW5kcyBpcyBncmVhdGVyIHRoYW4gdGhlIFNjYW5saW5lCisgICAgICAgICAgICAvLyBzdHJpZGUKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjQxIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIApAQCAtNjksNyArNzksOCBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKHBpeGVsU3RyaWRlICogdyA+IHNjYW5saW5lU3RyaWRlKSB7Ci0gICAgICAgICAgICAvLyBhd3QuMjQzPVByb2R1Y3Qgb2YgUGl4ZWwgc3RyaWRlIGFuZCB3IGlzIGdyZWF0ZXIgdGhhbiBTY2FubGluZSBzdHJpZGUKKyAgICAgICAgICAgIC8vIGF3dC4yNDM9UHJvZHVjdCBvZiBQaXhlbCBzdHJpZGUgYW5kIHcgaXMgZ3JlYXRlciB0aGFuIFNjYW5saW5lCisgICAgICAgICAgICAvLyBzdHJpZGUKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjQzIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIApAQCAtODIsOCArOTMsOCBAQAogICAgICAgICAgICAgbmV3T2Zmc2V0c1tpXSA9IGJhbmRPZmZzZXRzW2JhbmRzW2ldXTsKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBuZXcgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsKGRhdGFUeXBlLCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgIHBpeGVsU3RyaWRlLCBzY2FubGluZVN0cmlkZSwgbmV3T2Zmc2V0cyk7CisgICAgICAgIHJldHVybiBuZXcgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsKGRhdGFUeXBlLCB3aWR0aCwgaGVpZ2h0LCBwaXhlbFN0cmlkZSwKKyAgICAgICAgICAgICAgICBzY2FubGluZVN0cmlkZSwgbmV3T2Zmc2V0cyk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xMDYsOCArMTE3LDggQEAKICAgICAgICAgICAgIG5ld09mZnNldHMgPSBiYW5kT2Zmc2V0czsKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBuZXcgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsKGRhdGFUeXBlLCB3LCBoLCBwaXhlbFN0cmlkZSwKLSAgICAgICAgICAgICAgICBwaXhlbFN0cmlkZSAqIHcsIG5ld09mZnNldHMpOworICAgICAgICByZXR1cm4gbmV3IFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbChkYXRhVHlwZSwgdywgaCwgcGl4ZWxTdHJpZGUsIHBpeGVsU3RyaWRlICogdywKKyAgICAgICAgICAgICAgICBuZXdPZmZzZXRzKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTEyMSw0ICsxMzIsMyBAQAogICAgIH0KIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvUkdCSW1hZ2VGaWx0ZXIuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9SR0JJbWFnZUZpbHRlci5qYXZhCmluZGV4IDlhNzY5OTcuLmY1ZmU1ZDkgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbWFnZS9SR0JJbWFnZUZpbHRlci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9SR0JJbWFnZUZpbHRlci5qYXZhCkBAIC0xOCw0NiArMTgsNDggQEAKICAqIEBhdXRob3IgSWdvciBWLiBTdG9seWFyb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmltYWdlOwogCi0KIC8qKgotICogVGhlIFJHQkltYWdlRmlsdGVyIGNsYXNzIHJlcHJlc2VudHMgYSBmaWx0ZXIgd2hpY2ggbW9kaWZpZXMKLSAqIHBpeGVscyBvZiBhbiBpbWFnZSBpbiB0aGUgZGVmYXVsdCBSR0IgQ29sb3JNb2RlbC4gCisgKiBUaGUgUkdCSW1hZ2VGaWx0ZXIgY2xhc3MgcmVwcmVzZW50cyBhIGZpbHRlciB3aGljaCBtb2RpZmllcyBwaXhlbHMgb2YgYW4KKyAqIGltYWdlIGluIHRoZSBkZWZhdWx0IFJHQiBDb2xvck1vZGVsLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFJHQkltYWdlRmlsdGVyIGV4dGVuZHMgSW1hZ2VGaWx0ZXIgewogCi0gICAgLyoqIAotICAgICAqIFRoZSBvcmlnbW9kZWwgaXMgdGhlIENvbG9yTW9kZWwgdG8gYmUgcmVwbGFjZWQgYnkgbmV3bW9kZWwgCi0gICAgICogd2hlbiBzdWJzdGl0dXRlQ29sb3JNb2RlbCBpcyBjYWxsZWQuCisgICAgLyoqCisgICAgICogVGhlIG9yaWdpbmFsIG1vZGVsIGlzIHRoZSBDb2xvck1vZGVsIHRvIGJlIHJlcGxhY2VkIGJ5IHRoZSBuZXcgbW9kZWwgd2hlbgorICAgICAqIHN1YnN0aXR1dGVDb2xvck1vZGVsIGlzIGNhbGxlZC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgQ29sb3JNb2RlbCBvcmlnbW9kZWw7CiAKLSAgICAvKiogCi0gICAgICogVGhlIG5ld21vZGVsIGlzIHRoZSBDb2xvck1vZGVsIHdpdGggd2hpY2ggdG8gcmVwbGFjZSBvcmlnbW9kZWwgCi0gICAgICogd2hlbiBzdWJzdGl0dXRlQ29sb3JNb2RlbCBpcyBjYWxsZWQuIAorICAgIC8qKgorICAgICAqIFRoZSBuZXcgbW9kZWwgaXMgdGhlIENvbG9yTW9kZWwgd2l0aCB3aGljaCB0byByZXBsYWNlIHRoZSBvcmlnaW5hbCBtb2RlbAorICAgICAqIHdoZW4gc3Vic3RpdHV0ZUNvbG9yTW9kZWwgaXMgY2FsbGVkLgogICAgICAqLwogICAgIHByb3RlY3RlZCBDb2xvck1vZGVsIG5ld21vZGVsOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBjYW5GaWx0ZXJJbmRleENvbG9yTW9kZWwgaW5kaWNhdGVzIGlmIGl0IGlzIAotICAgICAqIGFjY2VwdGFibGUgdG8gYXBwbHkgdGhlIGNvbG9yIGZpbHRlcmluZyBvZiB0aGUgZmlsdGVyUkdCIAotICAgICAqIG1ldGhvZCB0byB0aGUgY29sb3IgdGFibGUgZW50cmllcyBvZiBhbiBJbmRleENvbG9yTW9kZWwgCi0gICAgICogb2JqZWN0LgotICAgICAqICovCisgICAgLyoqCisgICAgICogVGhlIGNhbkZpbHRlckluZGV4Q29sb3JNb2RlbCBpbmRpY2F0ZXMgaWYgaXQgaXMgYWNjZXB0YWJsZSB0byBhcHBseSB0aGUKKyAgICAgKiBjb2xvciBmaWx0ZXJpbmcgb2YgdGhlIGZpbHRlclJHQiBtZXRob2QgdG8gdGhlIGNvbG9yIHRhYmxlIGVudHJpZXMgb2YgYW4KKyAgICAgKiBJbmRleENvbG9yTW9kZWwgb2JqZWN0LgorICAgICAqLwogICAgIHByb3RlY3RlZCBib29sZWFuIGNhbkZpbHRlckluZGV4Q29sb3JNb2RlbDsKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBSR0JJbWFnZUZpbHRlci4KICAgICAgKi8KLSAgICBwdWJsaWMgUkdCSW1hZ2VGaWx0ZXIoKSB7fQorICAgIHB1YmxpYyBSR0JJbWFnZUZpbHRlcigpIHsKKyAgICB9CiAKICAgICAvKioKLSAgICAgKiBGaWx0ZXJzIGFuIEluZGV4Q29sb3JNb2RlbCBvYmplY3QgYnkgY2FsbGluZyBmaWx0ZXJSR0IgZnVuY3Rpb24gZm9yCi0gICAgICogZWFjaCBlbnRyeSBvZiBJbmRleENvbG9yTW9kZWwuCisgICAgICogRmlsdGVycyBhbiBJbmRleENvbG9yTW9kZWwgb2JqZWN0IGJ5IGNhbGxpbmcgZmlsdGVyUkdCIGZ1bmN0aW9uIGZvciBlYWNoCisgICAgICogZW50cnkgb2YgSW5kZXhDb2xvck1vZGVsLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpY20gdGhlIEluZGV4Q29sb3JNb2RlbCB0byBiZSBmaWx0ZXJlZC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaWNtCisgICAgICogICAgICAgICAgICB0aGUgSW5kZXhDb2xvck1vZGVsIHRvIGJlIGZpbHRlcmVkLgogICAgICAqIEByZXR1cm4gdGhlIEluZGV4Q29sb3JNb2RlbC4KICAgICAgKi8KICAgICBwdWJsaWMgSW5kZXhDb2xvck1vZGVsIGZpbHRlckluZGV4Q29sb3JNb2RlbChJbmRleENvbG9yTW9kZWwgaWNtKSB7CkBAIC02OSwyOCArNzEsMzAgQEAKICAgICAgICAgaWNtLmdldFJHQnMoY29sb3JNYXApOwogICAgICAgICBpbnQgdHJhbnMgPSAtMTsKICAgICAgICAgYm9vbGVhbiBoYXNBbHBoYSA9IGZhbHNlOwotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbWFwU2l6ZTsgaSsrKXsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBTaXplOyBpKyspIHsKICAgICAgICAgICAgIGZpbHRlcmVkQ29sb3JNYXBbaV0gPSBmaWx0ZXJSR0IoLTEsIC0xLCBjb2xvck1hcFtpXSk7CiAgICAgICAgICAgICBpbnQgYWxwaGEgPSBmaWx0ZXJlZENvbG9yTWFwW2ldID4+PiAyNDsKLSAgICAgICAgICAgIGlmKGFscGhhICE9IDB4ZmYpewotICAgICAgICAgICAgICAgIGlmKCFoYXNBbHBoYSkgeworICAgICAgICAgICAgaWYgKGFscGhhICE9IDB4ZmYpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWhhc0FscGhhKSB7CiAgICAgICAgICAgICAgICAgICAgIGhhc0FscGhhID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoYWxwaGEgPT0gMCAmJiB0cmFucyA8IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoYWxwaGEgPT0gMCAmJiB0cmFucyA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBuZXcgSW5kZXhDb2xvck1vZGVsKGJpdHMsIG1hcFNpemUsIGZpbHRlcmVkQ29sb3JNYXAsIDAsCi0gICAgICAgICAgICAgICAgaGFzQWxwaGEsIHRyYW5zLCB0cmFuc2ZlclR5cGUpOworICAgICAgICByZXR1cm4gbmV3IEluZGV4Q29sb3JNb2RlbChiaXRzLCBtYXBTaXplLCBmaWx0ZXJlZENvbG9yTWFwLCAwLCBoYXNBbHBoYSwgdHJhbnMsCisgICAgICAgICAgICAgICAgdHJhbnNmZXJUeXBlKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBSZXBsYWNlcyB0aGUgb3JpZ2luYWwgY29sb3IgbW9kZWwgYW5kIHRoZSBuZXcgb25lLgogICAgICAqIAotICAgICAqIEBwYXJhbSBvbGRjbSB0aGUgb2xkIENvbG9yTW9kZWwuCi0gICAgICogQHBhcmFtIG5ld2NtIHRoZSBuZXcgQ29sb3JNb2RlbC4KKyAgICAgKiBAcGFyYW0gb2xkY20KKyAgICAgKiAgICAgICAgICAgIHRoZSBvbGQgQ29sb3JNb2RlbC4KKyAgICAgKiBAcGFyYW0gbmV3Y20KKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgQ29sb3JNb2RlbC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzdWJzdGl0dXRlQ29sb3JNb2RlbChDb2xvck1vZGVsIG9sZGNtLCBDb2xvck1vZGVsIG5ld2NtKSB7CiAgICAgICAgIG9yaWdtb2RlbCA9IG9sZGNtOwpAQCAtOTksMjkgKzEwMywyNyBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0Q29sb3JNb2RlbChDb2xvck1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIGlmKG1vZGVsIGluc3RhbmNlb2YgSW5kZXhDb2xvck1vZGVsICYmCi0gICAgICAgICAgICAgICAgY2FuRmlsdGVySW5kZXhDb2xvck1vZGVsKXsKLSAgICAgICAgICAgIEluZGV4Q29sb3JNb2RlbCBpY20gPSAoSW5kZXhDb2xvck1vZGVsKSBtb2RlbDsKKyAgICAgICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgSW5kZXhDb2xvck1vZGVsICYmIGNhbkZpbHRlckluZGV4Q29sb3JNb2RlbCkgeworICAgICAgICAgICAgSW5kZXhDb2xvck1vZGVsIGljbSA9IChJbmRleENvbG9yTW9kZWwpbW9kZWw7CiAgICAgICAgICAgICBDb2xvck1vZGVsIGZpbHRlcmVkTW9kZWwgPSBmaWx0ZXJJbmRleENvbG9yTW9kZWwoaWNtKTsKICAgICAgICAgICAgIHN1YnN0aXR1dGVDb2xvck1vZGVsKG1vZGVsLCBmaWx0ZXJlZE1vZGVsKTsKICAgICAgICAgICAgIGNvbnN1bWVyLnNldENvbG9yTW9kZWwoZmlsdGVyZWRNb2RlbCk7Ci0gICAgICAgIH1lbHNleworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgY29uc3VtZXIuc2V0Q29sb3JNb2RlbChDb2xvck1vZGVsLmdldFJHQmRlZmF1bHQoKSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIENvbG9yTW9kZWwgbW9kZWwsIAotICAgICAgICAgICAgaW50W10gcGl4ZWxzLCBpbnQgb2ZmLCBpbnQgc2NhbnNpemUpIHsKLSAgICAgICAgCi0gICAgICAgIGlmKG1vZGVsID09IG51bGwgfHwgbW9kZWwgPT0gb3JpZ21vZGVsKXsKKyAgICBwdWJsaWMgdm9pZCBzZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIENvbG9yTW9kZWwgbW9kZWwsIGludFtdIHBpeGVscywgaW50IG9mZiwKKyAgICAgICAgICAgIGludCBzY2Fuc2l6ZSkgeworCisgICAgICAgIGlmIChtb2RlbCA9PSBudWxsIHx8IG1vZGVsID09IG9yaWdtb2RlbCkgewogICAgICAgICAgICAgY29uc3VtZXIuc2V0UGl4ZWxzKHgsIHksIHcsIGgsIG5ld21vZGVsLCBwaXhlbHMsIG9mZiwgc2NhbnNpemUpOwotICAgICAgICB9ZWxzZXsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGludCByZ2JQaXhlbHNbXSA9IG5ldyBpbnRbd107Ci0gICAgICAgICAgICBmb3IoaW50IHN5ID0geSwgcGl4ZWxzT2ZmID0gb2ZmOyBzeSA8IHkgKyBoOyAKLSAgICAgICAgICAgICAgICBzeSsrLCBwaXhlbHNPZmYgKz0gc2NhbnNpemUpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvcihpbnQgc3ggPSB4LCBpZHggPSAwOyBzeCA8IHggKyB3OyBzeCsrLCBpZHgrKyl7CisgICAgICAgICAgICBmb3IgKGludCBzeSA9IHksIHBpeGVsc09mZiA9IG9mZjsgc3kgPCB5ICsgaDsgc3krKywgcGl4ZWxzT2ZmICs9IHNjYW5zaXplKSB7CisKKyAgICAgICAgICAgICAgICBmb3IgKGludCBzeCA9IHgsIGlkeCA9IDA7IHN4IDwgeCArIHc7IHN4KyssIGlkeCsrKSB7CiAgICAgICAgICAgICAgICAgICAgIHJnYlBpeGVsc1tpZHhdID0gbW9kZWwuZ2V0UkdCKHBpeGVsc1twaXhlbHNPZmYgKyBpZHhdKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZmlsdGVyUkdCUGl4ZWxzKHgsIHN5LCB3LCAxLCByZ2JQaXhlbHMsIDAsIHcpOwpAQCAtMTMwLDE5ICsxMzIsMTcgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIENvbG9yTW9kZWwgbW9kZWwsIAotICAgICAgICAgICAgYnl0ZVtdIHBpeGVscywgaW50IG9mZiwgaW50IHNjYW5zaXplKSB7Ci0gICAgICAgIAotICAgICAgICBpZihtb2RlbCA9PSBudWxsIHx8IG1vZGVsID09IG9yaWdtb2RlbCl7CisgICAgcHVibGljIHZvaWQgc2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBDb2xvck1vZGVsIG1vZGVsLCBieXRlW10gcGl4ZWxzLCBpbnQgb2ZmLAorICAgICAgICAgICAgaW50IHNjYW5zaXplKSB7CisKKyAgICAgICAgaWYgKG1vZGVsID09IG51bGwgfHwgbW9kZWwgPT0gb3JpZ21vZGVsKSB7CiAgICAgICAgICAgICBjb25zdW1lci5zZXRQaXhlbHMoeCwgeSwgdywgaCwgbmV3bW9kZWwsIHBpeGVscywgb2ZmLCBzY2Fuc2l6ZSk7Ci0gICAgICAgIH1lbHNleworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaW50IHJnYlBpeGVsc1tdID0gbmV3IGludFt3XTsKLSAgICAgICAgICAgIGZvcihpbnQgc3kgPSB5LCBwaXhlbHNPZmYgPSBvZmY7IHN5IDwgeSArIGg7IAotICAgICAgICAgICAgICAgIHN5KyssIHBpeGVsc09mZiArPSBzY2Fuc2l6ZSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKGludCBzeCA9IHgsIGlkeCA9IDA7IHN4IDwgeCArIHc7IHN4KyssIGlkeCsrKXsKLSAgICAgICAgICAgICAgICAgICAgcmdiUGl4ZWxzW2lkeF0gPSAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmdldFJHQihwaXhlbHNbcGl4ZWxzT2ZmICsgaWR4XSAmIDB4ZmYpOworICAgICAgICAgICAgZm9yIChpbnQgc3kgPSB5LCBwaXhlbHNPZmYgPSBvZmY7IHN5IDwgeSArIGg7IHN5KyssIHBpeGVsc09mZiArPSBzY2Fuc2l6ZSkgeworCisgICAgICAgICAgICAgICAgZm9yIChpbnQgc3ggPSB4LCBpZHggPSAwOyBzeCA8IHggKyB3OyBzeCsrLCBpZHgrKykgeworICAgICAgICAgICAgICAgICAgICByZ2JQaXhlbHNbaWR4XSA9IG1vZGVsLmdldFJHQihwaXhlbHNbcGl4ZWxzT2ZmICsgaWR4XSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBmaWx0ZXJSR0JQaXhlbHMoeCwgc3ksIHcsIDEsIHJnYlBpeGVscywgMCwgdyk7CiAgICAgICAgICAgICB9CkBAIC0xNTAsNDEgKzE1MCw0NiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEZpbHRlcnMgYSByZWdpb24gb2YgcGl4ZWxzIGluIHRoZSBkZWZhdWx0IFJHQiBDb2xvck1vZGVsIAotICAgICAqIGJ5IGNhbGxpbmcgdGhlIGZpbHRlclJHQiBtZXRob2QgZm9yIHRoZW0uCisgICAgICogRmlsdGVycyBhIHJlZ2lvbiBvZiBwaXhlbHMgaW4gdGhlIGRlZmF1bHQgUkdCIENvbG9yTW9kZWwgYnkgY2FsbGluZyB0aGUKKyAgICAgKiBmaWx0ZXJSR0IgbWV0aG9kIGZvciB0aGVtLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgcmVnaW9uLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgcmVnaW9uLgotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZnJlZ2lvbi4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHJlZ2lvbi4KLSAgICAgKiBAcGFyYW0gcGl4ZWxzIHRoZSBwaXhlbHMgYXJyYXkuCi0gICAgICogQHBhcmFtIG9mZiB0aGUgb2Zmc2V0IG9mIGFycmF5LgotICAgICAqIEBwYXJhbSBzY2Fuc2l6ZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiByb3dzIG9mIHBpeGVscyBpbiB0aGUgYXJyYXkuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgcmVnaW9uLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHJlZ2lvbi4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHJlZ2lvbi4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiByZWdpb24uCisgICAgICogQHBhcmFtIHBpeGVscworICAgICAqICAgICAgICAgICAgdGhlIHBpeGVscyBhcnJheS4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIGFycmF5LgorICAgICAqIEBwYXJhbSBzY2Fuc2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIGRpc3RhbmNlIGJldHdlZW4gcm93cyBvZiBwaXhlbHMgaW4gdGhlIGFycmF5LgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZpbHRlclJHQlBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgCi0gICAgICAgICAgICBpbnRbXSBwaXhlbHMsIGludCBvZmYsIGludCBzY2Fuc2l6ZSkgewotICAgICAgICAKLSAgICAgICAgZm9yKGludCBzeSA9IHksIGxpbmVPZmYgPSBvZmY7IHN5IDwgeSArIGg7IHN5KyssIGxpbmVPZmYgKz0gc2NhbnNpemUpewotICAgICAgICAgICAgZm9yKGludCBzeCA9IHgsIGlkeCA9IDA7IHN4IDwgeCArIHc7IHN4KyssIGlkeCsrKXsKLSAgICAgICAgICAgICAgICBwaXhlbHNbbGluZU9mZiArIGlkeF0gPSAKLSAgICAgICAgICAgICAgICAgICAgZmlsdGVyUkdCKHN4LCBzeSwgcGl4ZWxzW2xpbmVPZmYgKyBpZHhdKTsKKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXJSR0JQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludFtdIHBpeGVscywgaW50IG9mZiwgaW50IHNjYW5zaXplKSB7CisKKyAgICAgICAgZm9yIChpbnQgc3kgPSB5LCBsaW5lT2ZmID0gb2ZmOyBzeSA8IHkgKyBoOyBzeSsrLCBsaW5lT2ZmICs9IHNjYW5zaXplKSB7CisgICAgICAgICAgICBmb3IgKGludCBzeCA9IHgsIGlkeCA9IDA7IHN4IDwgeCArIHc7IHN4KyssIGlkeCsrKSB7CisgICAgICAgICAgICAgICAgcGl4ZWxzW2xpbmVPZmYgKyBpZHhdID0gZmlsdGVyUkdCKHN4LCBzeSwgcGl4ZWxzW2xpbmVPZmYgKyBpZHhdKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBjb25zdW1lci5zZXRQaXhlbHMoeCwgeSwgdywgaCwgQ29sb3JNb2RlbC5nZXRSR0JkZWZhdWx0KCksIAotICAgICAgICAgICAgICAgIHBpeGVscywgb2ZmLCBzY2Fuc2l6ZSk7CisgICAgICAgIGNvbnN1bWVyLnNldFBpeGVscyh4LCB5LCB3LCBoLCBDb2xvck1vZGVsLmdldFJHQmRlZmF1bHQoKSwgcGl4ZWxzLCBvZmYsIHNjYW5zaXplKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb3ZlcnRzIGEgc2luZ2xlIGlucHV0IHBpeGVsIGluIHRoZSBkZWZhdWx0IFJHQiBDb2xvck1vZGVsIAotICAgICAqIHRvIGEgc2luZ2xlIG91dHB1dCBwaXhlbC4KKyAgICAgKiBDb252ZXJ0cyBhIHNpbmdsZSBpbnB1dCBwaXhlbCBpbiB0aGUgZGVmYXVsdCBSR0IgQ29sb3JNb2RlbCB0byBhIHNpbmdsZQorICAgICAqIG91dHB1dCBwaXhlbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBwaXhlbCdzIGNvb3JkaW5hdGUuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgcGl4ZWwncyBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSByZ2IgYSBwaXhlbCBpbiB0aGUgZGVmYXVsdCBSR0IgY29sb3IgbW9kZWwuCi0gICAgICogCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIHBpeGVsJ3MgY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgcGl4ZWwncyBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSByZ2IKKyAgICAgKiAgICAgICAgICAgIGEgcGl4ZWwgaW4gdGhlIGRlZmF1bHQgUkdCIGNvbG9yIG1vZGVsLgogICAgICAqIEByZXR1cm4gYSBmaWx0ZXJlZCBwaXhlbCBpbiB0aGUgZGVmYXVsdCBSR0IgY29sb3IgbW9kZWwuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCBmaWx0ZXJSR0IoaW50IHgsIGludCB5LCBpbnQgcmdiKTsKIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvUmFzdGVyLmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvUmFzdGVyLmphdmEKaW5kZXggNGIyNDI2ZS4uNjc0OWZkZSAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL1Jhc3Rlci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9SYXN0ZXIuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBJZ29yIFYuIFN0b2x5YXJvdgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuaW1hZ2U7CiAKIGltcG9ydCBqYXZhLmF3dC5Qb2ludDsKQEAgLTI3LDcwICsyOCw5NSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFRoZSBSYXN0ZXIgY2xhc3MgcmVwcmVzZW50cyBhIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgotICogVGhpcyBjbGFzcyBpcyBkZWZpbmVkIGJ5IERhdGFCdWZmZXIgYW5kIFNhbXBsZU1vZGVsIG9iamVjdHMuIAotICogVGhlIERhdGFCdWZmZXIgb2JqZWN0IHN0b3JlcyBzYW1wbGUgdmFsdWVzIGFuZCBEU2FtcGxlTW9kZWwgZGVmaW5lcyAKLSAqIHRoZSBsb2NhdGlvbiBvZiBzYW1wbGUgaW4gdGhpcyBEYXRhQnVmZmVyLiAKKyAqIFRoZSBSYXN0ZXIgY2xhc3MgcmVwcmVzZW50cyBhIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLiBUaGlzIGNsYXNzIGlzCisgKiBkZWZpbmVkIGJ5IERhdGFCdWZmZXIgYW5kIFNhbXBsZU1vZGVsIG9iamVjdHMuIFRoZSBEYXRhQnVmZmVyIG9iamVjdCBzdG9yZXMKKyAqIHNhbXBsZSB2YWx1ZXMgYW5kIERTYW1wbGVNb2RlbCBkZWZpbmVzIHRoZSBsb2NhdGlvbiBvZiBzYW1wbGUgaW4gdGhpcworICogRGF0YUJ1ZmZlci4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBSYXN0ZXIgewogCi0gICAgLyoqIFRoZSBEYXRhQnVmZmVyIG9mIHRoaXMgUmFzdGVyLiAqLworICAgIC8qKgorICAgICAqIFRoZSBEYXRhQnVmZmVyIG9mIHRoaXMgUmFzdGVyLgorICAgICAqLwogICAgIHByb3RlY3RlZCBEYXRhQnVmZmVyIGRhdGFCdWZmZXI7CiAKLSAgICAvKiogVGhlIGhlaWdodCBvZiB0aGlzIFJhc3Rlci4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoaXMgUmFzdGVyLgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgaGVpZ2h0OwogCi0gICAgLyoqIFRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgcGl4ZWwgaW4gdGhpcyBSYXN0ZXIuICovCisgICAgLyoqCisgICAgICogVGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBwaXhlbCBpbiB0aGlzIFJhc3Rlci4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IG1pblg7CiAKLSAgICAvKiogVGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBwaXhlbCBpbiB0aGlzIFJhc3Rlci4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgWSBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IHBpeGVsIGluIHRoaXMgUmFzdGVyLgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgbWluWTsKIAotICAgIC8qKiBUaGUgbnVtYmVyIG9mIGJhbmRzIGluIHRoaXMgUmFzdGVyLiAqLworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2YgYmFuZHMgaW4gdGhpcyBSYXN0ZXIuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBudW1CYW5kczsKIAotICAgIC8qKiBUaGUgbnVtYmVyIG9mIGRhdGEgZWxlbWVudHMuICovCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBkYXRhIGVsZW1lbnRzLgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgbnVtRGF0YUVsZW1lbnRzOwogCi0gICAgLyoqIFRoZSBwYXJlbnQgb2YgdGhpcyBSYXN0ZXIuICovCisgICAgLyoqCisgICAgICogVGhlIHBhcmVudCBvZiB0aGlzIFJhc3Rlci4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgUmFzdGVyIHBhcmVudDsKIAotICAgIC8qKiBUaGUgU2FtcGxlTW9kZWwgb2YgdGhpcyBSYXN0ZXIuICovCisgICAgLyoqCisgICAgICogVGhlIFNhbXBsZU1vZGVsIG9mIHRoaXMgUmFzdGVyLgorICAgICAqLwogICAgIHByb3RlY3RlZCBTYW1wbGVNb2RlbCBzYW1wbGVNb2RlbDsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgWCB0cmFuc2xhdGlvbiBmcm9tIHRoZSBjb29yZGluYXRlIHNwYWNlIG9mIHRoZSAKLSAgICAgKiBTYW1wbGVNb2RlbCBvZiB0aGlzIFJhc3Rlci4KKyAgICAvKioKKyAgICAgKiBUaGUgWCB0cmFuc2xhdGlvbiBmcm9tIHRoZSBjb29yZGluYXRlIHNwYWNlIG9mIHRoZSBTYW1wbGVNb2RlbCBvZiB0aGlzCisgICAgICogUmFzdGVyLgogICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgc2FtcGxlTW9kZWxUcmFuc2xhdGVYOwogCi0gICAgLyoqIAotICAgICAqIFRoZSBZIHRyYW5zbGF0aW9uIGZyb20gdGhlIGNvb3JkaW5hdGUgc3BhY2Ugb2YgdGhlIAotICAgICAqIFNhbXBsZU1vZGVsIG9mIHRoaXMgUmFzdGVyLgorICAgIC8qKgorICAgICAqIFRoZSBZIHRyYW5zbGF0aW9uIGZyb20gdGhlIGNvb3JkaW5hdGUgc3BhY2Ugb2YgdGhlIFNhbXBsZU1vZGVsIG9mIHRoaXMKKyAgICAgKiBSYXN0ZXIuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBzYW1wbGVNb2RlbFRyYW5zbGF0ZVk7CiAKLSAgICAvKiogVGhlIHdpZHRoIG9mIHRoaXMgUmFzdGVyLiAqLworICAgIC8qKgorICAgICAqIFRoZSB3aWR0aCBvZiB0aGlzIFJhc3Rlci4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IHdpZHRoOwogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIFJhc3RlciBvYmplY3Qgd2l0aCBhIEJhbmRlZFNhbXBsZU1vZGVsIGFuZCB0aGUgc3BlY2lmaWVkIAorICAgICAqIENyZWF0ZXMgYSBSYXN0ZXIgb2JqZWN0IHdpdGggYSBCYW5kZWRTYW1wbGVNb2RlbCBhbmQgdGhlIHNwZWNpZmllZAogICAgICAqIERhdGFCdWZmZXIuIFRoZSBudW1iZXIgb2YgYmFuZHMgaXMgZGVmaW5lZCBieSB0aGUgbGVuZ3RoIG9mIGJhbmRPZmZzZXRzCiAgICAgICogb3IgYmFua0luZGljZXMgYXJyYXlzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhQnVmZmVyIHRoZSBzcGVjaWZpZWQgRGF0YUJ1ZmZlci4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIGltYWdlIGRhdGEuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UgZGF0YS4gCi0gICAgICogQHBhcmFtIGJhbmtJbmRpY2VzIHRoZSBiYW5rIGluZGljZXMgb2YgYmFuZHMuCi0gICAgICogQHBhcmFtIGJhbmRPZmZzZXRzIHRoZSBiYW5kIG9mZnNldHMgb2YgYmFuZHMuCi0gICAgICogQHBhcmFtIGxvY2F0aW9uIHRoZSBsb2NhdGlvbiB3aGljaCBkZWZpbmVzIHRoZSB1cHBlciBsZWZ0IGNvcm5lciAKLSAgICAgKiBvZiBSYXN0ZXIuCi0gICAgICogCisgICAgICogQHBhcmFtIGRhdGFCdWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgRGF0YUJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBzY2FubGluZVN0cmlkZQorICAgICAqICAgICAgICAgICAgdGhlIHNjYW5saW5lIHN0cmlkZSBvZiB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gYmFua0luZGljZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBiYW5rIGluZGljZXMgb2YgYmFuZHMuCisgICAgICogQHBhcmFtIGJhbmRPZmZzZXRzCisgICAgICogICAgICAgICAgICB0aGUgYmFuZCBvZmZzZXRzIG9mIGJhbmRzLgorICAgICAqIEBwYXJhbSBsb2NhdGlvbgorICAgICAqICAgICAgICAgICAgdGhlIGxvY2F0aW9uIHdoaWNoIGRlZmluZXMgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIFJhc3Rlci4KICAgICAgKiBAcmV0dXJuIHRoZSBXcml0YWJsZVJhc3RlciBvYmplY3QuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBXcml0YWJsZVJhc3RlciBjcmVhdGVCYW5kZWRSYXN0ZXIoRGF0YUJ1ZmZlciBkYXRhQnVmZmVyLAotICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgc2NhbmxpbmVTdHJpZGUsIGludCBiYW5rSW5kaWNlc1tdLAotICAgICAgICAgICAgaW50IGJhbmRPZmZzZXRzW10sIFBvaW50IGxvY2F0aW9uKSB7CisgICAgcHVibGljIHN0YXRpYyBXcml0YWJsZVJhc3RlciBjcmVhdGVCYW5kZWRSYXN0ZXIoRGF0YUJ1ZmZlciBkYXRhQnVmZmVyLCBpbnQgdywgaW50IGgsCisgICAgICAgICAgICBpbnQgc2NhbmxpbmVTdHJpZGUsIGludCBiYW5rSW5kaWNlc1tdLCBpbnQgYmFuZE9mZnNldHNbXSwgUG9pbnQgbG9jYXRpb24pIHsKIAogICAgICAgICBpZiAodyA8PSAwIHx8IGggPD0gMCkgewogICAgICAgICAgICAgLy8gYXd0LjIyRT13IG9yIGggaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8KQEAgLTEwMSw5ICsxMjcsOSBAQAogICAgICAgICAgICAgbG9jYXRpb24gPSBuZXcgUG9pbnQoMCwgMCk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoKGxvbmcpIGxvY2F0aW9uLnggKyB3ID4gSW50ZWdlci5NQVhfVkFMVUUKLSAgICAgICAgICAgICAgICB8fCAobG9uZykgbG9jYXRpb24ueSArIGggPiBJbnRlZ2VyLk1BWF9WQUxVRSkgewotICAgICAgICAgICAgLy8gYXd0LjI3Nj1sb2NhdGlvbi54ICsgdyBvciBsb2NhdGlvbi55ICsgaCByZXN1bHRzIGluIGludGVnZXIgb3ZlcmZsb3cKKyAgICAgICAgaWYgKChsb25nKWxvY2F0aW9uLnggKyB3ID4gSW50ZWdlci5NQVhfVkFMVUUgfHwgKGxvbmcpbG9jYXRpb24ueSArIGggPiBJbnRlZ2VyLk1BWF9WQUxVRSkgeworICAgICAgICAgICAgLy8gYXd0LjI3Nj1sb2NhdGlvbi54ICsgdyBvciBsb2NhdGlvbi55ICsgaCByZXN1bHRzIGluIGludGVnZXIKKyAgICAgICAgICAgIC8vIG92ZXJmbG93CiAgICAgICAgICAgICB0aHJvdyBuZXcgUmFzdGVyRm9ybWF0RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI3NiIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKQEAgLTExOSwzOSArMTQ1LDQzIEBACiAKICAgICAgICAgaW50IGRhdGFUeXBlID0gZGF0YUJ1ZmZlci5nZXREYXRhVHlwZSgpOwogCi0gICAgICAgIGlmIChkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfQllURQotICAgICAgICAgICAgICAgICYmIGRhdGFUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9VU0hPUlQKKyAgICAgICAgaWYgKGRhdGFUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9CWVRFICYmIGRhdGFUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9VU0hPUlQKICAgICAgICAgICAgICAgICAmJiBkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfSU5UKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjMwPWRhdGFUeXBlIGlzIG5vdCBvbmUgb2YgdGhlIHN1cHBvcnRlZCBkYXRhIHR5cGVzCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIzMCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgQmFuZGVkU2FtcGxlTW9kZWwgc2FtcGxlTW9kZWwgPSBuZXcgQmFuZGVkU2FtcGxlTW9kZWwoZGF0YVR5cGUsIHcsIGgsCi0gICAgICAgICAgICAgICAgc2NhbmxpbmVTdHJpZGUsIGJhbmtJbmRpY2VzLCBiYW5kT2Zmc2V0cyk7CisgICAgICAgIEJhbmRlZFNhbXBsZU1vZGVsIHNhbXBsZU1vZGVsID0gbmV3IEJhbmRlZFNhbXBsZU1vZGVsKGRhdGFUeXBlLCB3LCBoLCBzY2FubGluZVN0cmlkZSwKKyAgICAgICAgICAgICAgICBiYW5rSW5kaWNlcywgYmFuZE9mZnNldHMpOwogCiAgICAgICAgIHJldHVybiBuZXcgT3JkaW5hcnlXcml0YWJsZVJhc3RlcihzYW1wbGVNb2RlbCwgZGF0YUJ1ZmZlciwgbG9jYXRpb24pOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBSYXN0ZXIgb2JqZWN0IHdpdGggYSBCYW5kZWRTYW1wbGVNb2RlbCBhbmQgdGhlIHNwZWNpZmllZAotICAgICAqIGRhdGEgdHlwZS4gVGhlIERhdGEgdHlwZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotICAgICAqIFRZUEVfQllURSwgVFlQRV9VU0hPUlQsIG9yIFRZUEVfSU5ULiAKKyAgICAgKiBDcmVhdGVzIGEgUmFzdGVyIG9iamVjdCB3aXRoIGEgQmFuZGVkU2FtcGxlTW9kZWwgYW5kIHRoZSBzcGVjaWZpZWQgZGF0YQorICAgICAqIHR5cGUuIFRoZSBEYXRhIHR5cGUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogVFlQRV9CWVRFLAorICAgICAqIFRZUEVfVVNIT1JULCBvciBUWVBFX0lOVC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YVR5cGUgdGhlIGRhdGEgdHlwZSBvZiB0aGUgc2FtcGxlczoKLSAgICAgKiBUWVBFX0JZVEUsIFRZUEVfVVNIT1JULCBvciBUWVBFX0lOVC4gCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBkYXRhLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlIGRhdGEuIAotICAgICAqIEBwYXJhbSBzY2FubGluZVN0cmlkZSB0aGUgc2NhbmxpbmUgc3RyaWRlIG9mIHRoZSBpbWFnZSBkYXRhLgotICAgICAqIEBwYXJhbSBiYW5rSW5kaWNlcyB0aGUgYmFuayBpbmRpY2VzIG9mIGJhbmRzLgotICAgICAqIEBwYXJhbSBiYW5kT2Zmc2V0cyB0aGUgYmFuZCBvZmZzZXRzIG9mIGJhbmRzLgotICAgICAqIEBwYXJhbSBsb2NhdGlvbiB0aGUgbG9jYXRpb24gd2hpY2ggZGVmaW5lcyB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgCi0gICAgICogb2YgdGhlIFJhc3Rlci4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGF0YVR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHNhbXBsZXM6IFRZUEVfQllURSwgVFlQRV9VU0hPUlQsIG9yCisgICAgICogICAgICAgICAgICBUWVBFX0lOVC4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBzY2FubGluZVN0cmlkZQorICAgICAqICAgICAgICAgICAgdGhlIHNjYW5saW5lIHN0cmlkZSBvZiB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gYmFua0luZGljZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBiYW5rIGluZGljZXMgb2YgYmFuZHMuCisgICAgICogQHBhcmFtIGJhbmRPZmZzZXRzCisgICAgICogICAgICAgICAgICB0aGUgYmFuZCBvZmZzZXRzIG9mIGJhbmRzLgorICAgICAqIEBwYXJhbSBsb2NhdGlvbgorICAgICAqICAgICAgICAgICAgdGhlIGxvY2F0aW9uIHdoaWNoIGRlZmluZXMgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZQorICAgICAqICAgICAgICAgICAgUmFzdGVyLgogICAgICAqIEByZXR1cm4gdGhlIFdyaXRhYmxlUmFzdGVyIG9iamVjdC4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFdyaXRhYmxlUmFzdGVyIGNyZWF0ZUJhbmRlZFJhc3RlcihpbnQgZGF0YVR5cGUsIGludCB3LCBpbnQgaCwKLSAgICAgICAgICAgIGludCBzY2FubGluZVN0cmlkZSwgaW50IGJhbmtJbmRpY2VzW10sIGludCBiYW5kT2Zmc2V0c1tdLAotICAgICAgICAgICAgUG9pbnQgbG9jYXRpb24pIHsKKyAgICBwdWJsaWMgc3RhdGljIFdyaXRhYmxlUmFzdGVyIGNyZWF0ZUJhbmRlZFJhc3RlcihpbnQgZGF0YVR5cGUsIGludCB3LCBpbnQgaCwgaW50IHNjYW5saW5lU3RyaWRlLAorICAgICAgICAgICAgaW50IGJhbmtJbmRpY2VzW10sIGludCBiYW5kT2Zmc2V0c1tdLCBQb2ludCBsb2NhdGlvbikgewogCiAgICAgICAgIGlmICh3IDw9IDAgfHwgaCA8PSAwKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjJFPXcgb3IgaCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gemVybwpAQCAtMTYyLDkgKzE5Miw5IEBACiAgICAgICAgICAgICBsb2NhdGlvbiA9IG5ldyBQb2ludCgwLCAwKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICgobG9uZykgbG9jYXRpb24ueCArIHcgPiBJbnRlZ2VyLk1BWF9WQUxVRQotICAgICAgICAgICAgICAgIHx8IChsb25nKSBsb2NhdGlvbi55ICsgaCA+IEludGVnZXIuTUFYX1ZBTFVFKSB7Ci0gICAgICAgICAgICAvLyBhd3QuMjc2PWxvY2F0aW9uLnggKyB3IG9yIGxvY2F0aW9uLnkgKyBoIHJlc3VsdHMgaW4gaW50ZWdlciBvdmVyZmxvdworICAgICAgICBpZiAoKGxvbmcpbG9jYXRpb24ueCArIHcgPiBJbnRlZ2VyLk1BWF9WQUxVRSB8fCAobG9uZylsb2NhdGlvbi55ICsgaCA+IEludGVnZXIuTUFYX1ZBTFVFKSB7CisgICAgICAgICAgICAvLyBhd3QuMjc2PWxvY2F0aW9uLnggKyB3IG9yIGxvY2F0aW9uLnkgKyBoIHJlc3VsdHMgaW4gaW50ZWdlcgorICAgICAgICAgICAgLy8gb3ZlcmZsb3cKICAgICAgICAgICAgIHRocm93IG5ldyBSYXN0ZXJGb3JtYXRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjc2IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIApAQCAtMTczLDggKzIwMyw3IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI3NyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGRhdGFUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9CWVRFCi0gICAgICAgICAgICAgICAgJiYgZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVAorICAgICAgICBpZiAoZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX0JZVEUgJiYgZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVAogICAgICAgICAgICAgICAgICYmIGRhdGFUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9JTlQpIHsKICAgICAgICAgICAgIC8vIGF3dC4yMzA9ZGF0YVR5cGUgaXMgbm90IG9uZSBvZiB0aGUgc3VwcG9ydGVkIGRhdGEgdHlwZXMKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjMwIikpOyAvLyROT04tTkxTLTEkCkBAIC0xOTgsMzcgKzIyNyw0MCBAQAogICAgICAgICBEYXRhQnVmZmVyIGRhdGEgPSBudWxsOwogCiAgICAgICAgIHN3aXRjaCAoZGF0YVR5cGUpIHsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKLSAgICAgICAgICAgIGRhdGEgPSBuZXcgRGF0YUJ1ZmZlckJ5dGUoZGF0YVNpemUsIG51bUJhbmtzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6Ci0gICAgICAgICAgICBkYXRhID0gbmV3IERhdGFCdWZmZXJVU2hvcnQoZGF0YVNpemUsIG51bUJhbmtzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6Ci0gICAgICAgICAgICBkYXRhID0gbmV3IERhdGFCdWZmZXJJbnQoZGF0YVNpemUsIG51bUJhbmtzKTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKKyAgICAgICAgICAgICAgICBkYXRhID0gbmV3IERhdGFCdWZmZXJCeXRlKGRhdGFTaXplLCBudW1CYW5rcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6CisgICAgICAgICAgICAgICAgZGF0YSA9IG5ldyBEYXRhQnVmZmVyVVNob3J0KGRhdGFTaXplLCBudW1CYW5rcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6CisgICAgICAgICAgICAgICAgZGF0YSA9IG5ldyBEYXRhQnVmZmVySW50KGRhdGFTaXplLCBudW1CYW5rcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZUJhbmRlZFJhc3RlcihkYXRhLCB3LCBoLCBzY2FubGluZVN0cmlkZSwgYmFua0luZGljZXMsCi0gICAgICAgICAgICAgICAgYmFuZE9mZnNldHMsIGxvY2F0aW9uKTsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUJhbmRlZFJhc3RlcihkYXRhLCB3LCBoLCBzY2FubGluZVN0cmlkZSwgYmFua0luZGljZXMsIGJhbmRPZmZzZXRzLCBsb2NhdGlvbik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIFJhc3RlciBvYmplY3Qgd2l0aCBhIEJhbmRlZFNhbXBsZU1vZGVsIGFuZCB0aGUgc3BlY2lmaWVkCi0gICAgICogZGF0YSB0eXBlLiBUaGUgRGF0YSB0eXBlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci0gICAgICogVFlQRV9CWVRFLCBUWVBFX1VTSE9SVCwgb3IgVFlQRV9JTlQuIAorICAgICAqIENyZWF0ZXMgYSBSYXN0ZXIgb2JqZWN0IHdpdGggYSBCYW5kZWRTYW1wbGVNb2RlbCBhbmQgdGhlIHNwZWNpZmllZCBkYXRhCisgICAgICogdHlwZS4gVGhlIERhdGEgdHlwZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiBUWVBFX0JZVEUsCisgICAgICogVFlQRV9VU0hPUlQsIG9yIFRZUEVfSU5ULgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhVHlwZSB0aGUgZGF0YSB0eXBlIG9mIHRoZSBzYW1wbGVzOgotICAgICAqIFRZUEVfQllURSwgVFlQRV9VU0hPUlQsIG9yIFRZUEVfSU5ULiAKLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIGltYWdlIGRhdGEuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UgZGF0YS4gCi0gICAgICogQHBhcmFtIGJhbmRzIHRoZSBudW1iZXIgb2YgYmFuZHMuCi0gICAgICogQHBhcmFtIGxvY2F0aW9uIHRoZSBsb2NhdGlvbiB3aGljaCBkZWZpbmVzIHRoZSB1cHBlciBsZWZ0IGNvcm5lciAKLSAgICAgKiBvZiB0aGUgUmFzdGVyLgotICAgICAqIAorICAgICAqIEBwYXJhbSBkYXRhVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgdHlwZSBvZiB0aGUgc2FtcGxlczogVFlQRV9CWVRFLCBUWVBFX1VTSE9SVCwgb3IKKyAgICAgKiAgICAgICAgICAgIFRZUEVfSU5ULgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIGJhbmRzCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJhbmRzLgorICAgICAqIEBwYXJhbSBsb2NhdGlvbgorICAgICAqICAgICAgICAgICAgdGhlIGxvY2F0aW9uIHdoaWNoIGRlZmluZXMgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZQorICAgICAqICAgICAgICAgICAgUmFzdGVyLgogICAgICAqIEByZXR1cm4gdGhlIFdyaXRhYmxlUmFzdGVyIG9iamVjdC4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFdyaXRhYmxlUmFzdGVyIGNyZWF0ZUJhbmRlZFJhc3RlcihpbnQgZGF0YVR5cGUsIGludCB3LCBpbnQgaCwKLSAgICAgICAgICAgIGludCBiYW5kcywgUG9pbnQgbG9jYXRpb24pIHsKKyAgICBwdWJsaWMgc3RhdGljIFdyaXRhYmxlUmFzdGVyIGNyZWF0ZUJhbmRlZFJhc3RlcihpbnQgZGF0YVR5cGUsIGludCB3LCBpbnQgaCwgaW50IGJhbmRzLAorICAgICAgICAgICAgUG9pbnQgbG9jYXRpb24pIHsKIAogICAgICAgICBpZiAodyA8PSAwIHx8IGggPD0gMCkgewogICAgICAgICAgICAgLy8gYXd0LjIyRT13IG9yIGggaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8KQEAgLTIzOSw5ICsyNzEsOSBAQAogICAgICAgICAgICAgbG9jYXRpb24gPSBuZXcgUG9pbnQoMCwgMCk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoKGxvbmcpIGxvY2F0aW9uLnggKyB3ID4gSW50ZWdlci5NQVhfVkFMVUUKLSAgICAgICAgICAgICAgICB8fCAobG9uZykgbG9jYXRpb24ueSArIGggPiBJbnRlZ2VyLk1BWF9WQUxVRSkgewotICAgICAgICAgICAgLy8gYXd0LjI3Nj1sb2NhdGlvbi54ICsgdyBvciBsb2NhdGlvbi55ICsgaCByZXN1bHRzIGluIGludGVnZXIgb3ZlcmZsb3cKKyAgICAgICAgaWYgKChsb25nKWxvY2F0aW9uLnggKyB3ID4gSW50ZWdlci5NQVhfVkFMVUUgfHwgKGxvbmcpbG9jYXRpb24ueSArIGggPiBJbnRlZ2VyLk1BWF9WQUxVRSkgeworICAgICAgICAgICAgLy8gYXd0LjI3Nj1sb2NhdGlvbi54ICsgdyBvciBsb2NhdGlvbi55ICsgaCByZXN1bHRzIGluIGludGVnZXIKKyAgICAgICAgICAgIC8vIG92ZXJmbG93CiAgICAgICAgICAgICB0aHJvdyBuZXcgUmFzdGVyRm9ybWF0RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI3NiIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKQEAgLTI1NywyOCArMjg5LDMyIEBACiAgICAgICAgICAgICBiYW5kT2Zmc2V0c1tpXSA9IDA7CiAgICAgICAgICAgICBiYW5rSW5kaWNlc1tpXSA9IGk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZUJhbmRlZFJhc3RlcihkYXRhVHlwZSwgdywgaCwgdywgYmFua0luZGljZXMsIGJhbmRPZmZzZXRzLAotICAgICAgICAgICAgICAgIGxvY2F0aW9uKTsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUJhbmRlZFJhc3RlcihkYXRhVHlwZSwgdywgaCwgdywgYmFua0luZGljZXMsIGJhbmRPZmZzZXRzLCBsb2NhdGlvbik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIFJhc3RlciBvYmplY3Qgd2l0aCBhIFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbCAKLSAgICAgKiBhbmQgdGhlIHNwZWNpZmllZCBEYXRhQnVmZmVyLiAKKyAgICAgKiBDcmVhdGVzIGEgUmFzdGVyIG9iamVjdCB3aXRoIGEgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsIGFuZCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgRGF0YUJ1ZmZlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YUJ1ZmZlciB0aGUgRGF0YUJ1ZmZlci4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIGltYWdlIGRhdGEuCi0gICAgICogQHBhcmFtIHNjYW5saW5lU3RyaWRlIHRoZSBzY2FubGluZSBzdHJpZGUgb2YgdGhlIGltYWdlIGRhdGEuCi0gICAgICogQHBhcmFtIHBpeGVsU3RyaWRlIHRoZSBwaXhlbCBzdHJpZGUgb2YgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gYmFuZE9mZnNldHMgdGhlIGJhbmQgb2Zmc2V0cyBvZiBiYW5kcy4KLSAgICAgKiBAcGFyYW0gbG9jYXRpb24gdGhlIGxvY2F0aW9uIHdoaWNoIGRlZmluZXMgdGhlIHVwcGVyIGxlZnQgY29ybmVyIAotICAgICAqIG9mIHRoZSBSYXN0ZXIuCi0gICAgICogCisgICAgICogQHBhcmFtIGRhdGFCdWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBEYXRhQnVmZmVyLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBzY2FubGluZVN0cmlkZQorICAgICAqICAgICAgICAgICAgdGhlIHNjYW5saW5lIHN0cmlkZSBvZiB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gcGl4ZWxTdHJpZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwaXhlbCBzdHJpZGUgb2YgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gYmFuZE9mZnNldHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBiYW5kIG9mZnNldHMgb2YgYmFuZHMuCisgICAgICogQHBhcmFtIGxvY2F0aW9uCisgICAgICogICAgICAgICAgICB0aGUgbG9jYXRpb24gd2hpY2ggZGVmaW5lcyB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlCisgICAgICogICAgICAgICAgICBSYXN0ZXIuCiAgICAgICogQHJldHVybiB0aGUgV3JpdGFibGVSYXN0ZXIgb2JqZWN0LgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgV3JpdGFibGVSYXN0ZXIgY3JlYXRlSW50ZXJsZWF2ZWRSYXN0ZXIoRGF0YUJ1ZmZlciBkYXRhQnVmZmVyLAotICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgc2NhbmxpbmVTdHJpZGUsIGludCBwaXhlbFN0cmlkZSwKLSAgICAgICAgICAgIGludCBiYW5kT2Zmc2V0c1tdLCBQb2ludCBsb2NhdGlvbikgeworICAgIHB1YmxpYyBzdGF0aWMgV3JpdGFibGVSYXN0ZXIgY3JlYXRlSW50ZXJsZWF2ZWRSYXN0ZXIoRGF0YUJ1ZmZlciBkYXRhQnVmZmVyLCBpbnQgdywgaW50IGgsCisgICAgICAgICAgICBpbnQgc2NhbmxpbmVTdHJpZGUsIGludCBwaXhlbFN0cmlkZSwgaW50IGJhbmRPZmZzZXRzW10sIFBvaW50IGxvY2F0aW9uKSB7CiAKICAgICAgICAgaWYgKHcgPD0gMCB8fCBoIDw9IDApIHsKICAgICAgICAgICAgIC8vIGF3dC4yMkU9dyBvciBoIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB6ZXJvCkBAIC0yODksOSArMzI1LDkgQEAKICAgICAgICAgICAgIGxvY2F0aW9uID0gbmV3IFBvaW50KDAsIDApOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKChsb25nKSBsb2NhdGlvbi54ICsgdyA+IEludGVnZXIuTUFYX1ZBTFVFCi0gICAgICAgICAgICAgICAgfHwgKGxvbmcpIGxvY2F0aW9uLnkgKyBoID4gSW50ZWdlci5NQVhfVkFMVUUpIHsKLSAgICAgICAgICAgIC8vIGF3dC4yNzY9bG9jYXRpb24ueCArIHcgb3IgbG9jYXRpb24ueSArIGggcmVzdWx0cyBpbiBpbnRlZ2VyIG92ZXJmbG93CisgICAgICAgIGlmICgobG9uZylsb2NhdGlvbi54ICsgdyA+IEludGVnZXIuTUFYX1ZBTFVFIHx8IChsb25nKWxvY2F0aW9uLnkgKyBoID4gSW50ZWdlci5NQVhfVkFMVUUpIHsKKyAgICAgICAgICAgIC8vIGF3dC4yNzY9bG9jYXRpb24ueCArIHcgb3IgbG9jYXRpb24ueSArIGggcmVzdWx0cyBpbiBpbnRlZ2VyCisgICAgICAgICAgICAvLyBvdmVyZmxvdwogICAgICAgICAgICAgdGhyb3cgbmV3IFJhc3RlckZvcm1hdEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNzYiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCkBAIC0zMDEsOCArMzM3LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGludCBkYXRhVHlwZSA9IGRhdGFCdWZmZXIuZ2V0RGF0YVR5cGUoKTsKLSAgICAgICAgaWYgKGRhdGFUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9CWVRFCi0gICAgICAgICAgICAgICAgJiYgZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVCkgeworICAgICAgICBpZiAoZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX0JZVEUgJiYgZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVCkgewogICAgICAgICAgICAgLy8gYXd0LjIzMD1kYXRhVHlwZSBpcyBub3Qgb25lIG9mIHRoZSBzdXBwb3J0ZWQgZGF0YSB0eXBlcwogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMzAiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQpAQCAtMzE3LDM1ICszNTIsMzggQEAKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yN0IiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCi0gICAgICAgIFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbCBzYW1wbGVNb2RlbCA9IAotICAgICAgICAgICAgbmV3IFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbChkYXRhVHlwZSwgdywgaCwgCi0gICAgICAgICAgICAgICAgICAgIHBpeGVsU3RyaWRlLCBzY2FubGluZVN0cmlkZSwgYmFuZE9mZnNldHMpOworICAgICAgICBQaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwgc2FtcGxlTW9kZWwgPSBuZXcgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsKGRhdGFUeXBlLCB3LCBoLAorICAgICAgICAgICAgICAgIHBpeGVsU3RyaWRlLCBzY2FubGluZVN0cmlkZSwgYmFuZE9mZnNldHMpOwogCiAgICAgICAgIHJldHVybiBuZXcgT3JkaW5hcnlXcml0YWJsZVJhc3RlcihzYW1wbGVNb2RlbCwgZGF0YUJ1ZmZlciwgbG9jYXRpb24pOwogCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIFJhc3RlciBvYmplY3Qgd2l0aCBhIFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbCAKLSAgICAgKiBhbmQgdGhlIHNwZWNpZmllZCBkYXRhIHR5cGUuIFRoZSBEYXRhIHR5cGUgY2FuIGJlIG9uZSBvZiB0aGUgCi0gICAgICogZm9sbG93aW5nIHZhbHVlczoKLSAgICAgKiBUWVBFX0JZVEUsIFRZUEVfVVNIT1JULCBvciBUWVBFX0lOVC4gCisgICAgICogQ3JlYXRlcyBhIFJhc3RlciBvYmplY3Qgd2l0aCBhIFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbCBhbmQgdGhlCisgICAgICogc3BlY2lmaWVkIGRhdGEgdHlwZS4gVGhlIERhdGEgdHlwZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAgICAqIFRZUEVfQllURSwgVFlQRV9VU0hPUlQsIG9yIFRZUEVfSU5ULgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhVHlwZSB0aGUgZGF0YSB0eXBlIG9mIHRoZSBzYW1wbGVzOgotICAgICAqIFRZUEVfQllURSwgVFlQRV9VU0hPUlQsIG9yIFRZUEVfSU5ULiAKLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIGltYWdlIGRhdGEuCi0gICAgICogQHBhcmFtIHNjYW5saW5lU3RyaWRlIHRoZSBzY2FubGluZSBzdHJpZGUgb2YgdGhlIGltYWdlIGRhdGEuCi0gICAgICogQHBhcmFtIHBpeGVsU3RyaWRlIHRoZSBwaXhlbCBzdHJpZGUgb2YgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gYmFuZE9mZnNldHMgdGhlIGJhbmQgb2Zmc2V0cyBvZiBiYW5kcy4KLSAgICAgKiBAcGFyYW0gbG9jYXRpb24gdGhlIGxvY2F0aW9uIHdoaWNoIGRlZmluZXMgdGhlIHVwcGVyIGxlZnQgY29ybmVyIAotICAgICAqIG9mIHRoZSBSYXN0ZXIuCi0gICAgICogCisgICAgICogQHBhcmFtIGRhdGFUeXBlCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSB0eXBlIG9mIHRoZSBzYW1wbGVzOiBUWVBFX0JZVEUsIFRZUEVfVVNIT1JULCBvcgorICAgICAqICAgICAgICAgICAgVFlQRV9JTlQuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIHNjYW5saW5lU3RyaWRlCisgICAgICogICAgICAgICAgICB0aGUgc2NhbmxpbmUgc3RyaWRlIG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBwaXhlbFN0cmlkZQorICAgICAqICAgICAgICAgICAgdGhlIHBpeGVsIHN0cmlkZSBvZiBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBiYW5kT2Zmc2V0cworICAgICAqICAgICAgICAgICAgdGhlIGJhbmQgb2Zmc2V0cyBvZiBiYW5kcy4KKyAgICAgKiBAcGFyYW0gbG9jYXRpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBsb2NhdGlvbiB3aGljaCBkZWZpbmVzIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUKKyAgICAgKiAgICAgICAgICAgIFJhc3Rlci4KICAgICAgKiBAcmV0dXJuIHRoZSBXcml0YWJsZVJhc3RlciBvYmplY3QuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBXcml0YWJsZVJhc3RlciBjcmVhdGVJbnRlcmxlYXZlZFJhc3RlcihpbnQgZGF0YVR5cGUsIGludCB3LAotICAgICAgICAgICAgaW50IGgsIGludCBzY2FubGluZVN0cmlkZSwgaW50IHBpeGVsU3RyaWRlLCBpbnQgYmFuZE9mZnNldHNbXSwKLSAgICAgICAgICAgIFBvaW50IGxvY2F0aW9uKSB7CisgICAgcHVibGljIHN0YXRpYyBXcml0YWJsZVJhc3RlciBjcmVhdGVJbnRlcmxlYXZlZFJhc3RlcihpbnQgZGF0YVR5cGUsIGludCB3LCBpbnQgaCwKKyAgICAgICAgICAgIGludCBzY2FubGluZVN0cmlkZSwgaW50IHBpeGVsU3RyaWRlLCBpbnQgYmFuZE9mZnNldHNbXSwgUG9pbnQgbG9jYXRpb24pIHsKIAogICAgICAgICBpZiAodyA8PSAwIHx8IGggPD0gMCkgewogICAgICAgICAgICAgLy8gYXd0LjIyRT13IG9yIGggaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8KQEAgLTM1NiwxNCArMzk0LDEzIEBACiAgICAgICAgICAgICBsb2NhdGlvbiA9IG5ldyBQb2ludCgwLCAwKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICgobG9uZykgbG9jYXRpb24ueCArIHcgPiBJbnRlZ2VyLk1BWF9WQUxVRQotICAgICAgICAgICAgICAgIHx8IChsb25nKSBsb2NhdGlvbi55ICsgaCA+IEludGVnZXIuTUFYX1ZBTFVFKSB7Ci0gICAgICAgICAgICAvLyBhd3QuMjc2PWxvY2F0aW9uLnggKyB3IG9yIGxvY2F0aW9uLnkgKyBoIHJlc3VsdHMgaW4gaW50ZWdlciBvdmVyZmxvdworICAgICAgICBpZiAoKGxvbmcpbG9jYXRpb24ueCArIHcgPiBJbnRlZ2VyLk1BWF9WQUxVRSB8fCAobG9uZylsb2NhdGlvbi55ICsgaCA+IEludGVnZXIuTUFYX1ZBTFVFKSB7CisgICAgICAgICAgICAvLyBhd3QuMjc2PWxvY2F0aW9uLnggKyB3IG9yIGxvY2F0aW9uLnkgKyBoIHJlc3VsdHMgaW4gaW50ZWdlcgorICAgICAgICAgICAgLy8gb3ZlcmZsb3cKICAgICAgICAgICAgIHRocm93IG5ldyBSYXN0ZXJGb3JtYXRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjc2IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICBpZiAoZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX0JZVEUKLSAgICAgICAgICAgICAgICAmJiBkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUKSB7CisgICAgICAgIGlmIChkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfQllURSAmJiBkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjMwPWRhdGFUeXBlIGlzIG5vdCBvbmUgb2YgdGhlIHN1cHBvcnRlZCBkYXRhIHR5cGVzCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIzMCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CkBAIC0zODMsMzYgKzQyMCwzOCBAQAogICAgICAgICBEYXRhQnVmZmVyIGRhdGEgPSBudWxsOwogCiAgICAgICAgIHN3aXRjaCAoZGF0YVR5cGUpIHsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKLSAgICAgICAgICAgIGRhdGEgPSBuZXcgRGF0YUJ1ZmZlckJ5dGUoc2l6ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgotICAgICAgICAgICAgZGF0YSA9IG5ldyBEYXRhQnVmZmVyVVNob3J0KHNpemUpOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgorICAgICAgICAgICAgICAgIGRhdGEgPSBuZXcgRGF0YUJ1ZmZlckJ5dGUoc2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6CisgICAgICAgICAgICAgICAgZGF0YSA9IG5ldyBEYXRhQnVmZmVyVVNob3J0KHNpemUpOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUludGVybGVhdmVkUmFzdGVyKGRhdGEsIHcsIGgsIHNjYW5saW5lU3RyaWRlLCBwaXhlbFN0cmlkZSwKLSAgICAgICAgICAgICAgICBiYW5kT2Zmc2V0cywgbG9jYXRpb24pOworICAgICAgICByZXR1cm4gY3JlYXRlSW50ZXJsZWF2ZWRSYXN0ZXIoZGF0YSwgdywgaCwgc2NhbmxpbmVTdHJpZGUsIHBpeGVsU3RyaWRlLCBiYW5kT2Zmc2V0cywKKyAgICAgICAgICAgICAgICBsb2NhdGlvbik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIFJhc3RlciBvYmplY3Qgd2l0aCBhIFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbCAKLSAgICAgKiBhbmQgdGhlIHNwZWNpZmllZCBkYXRhIHR5cGUuIFRoZSBEYXRhIHR5cGUgY2FuIGJlIG9uZSBvZiB0aGUgCi0gICAgICogZm9sbG93aW5nIHZhbHVlczoKLSAgICAgKiBUWVBFX0JZVEUsIFRZUEVfVVNIT1JULCBvciBUWVBFX0lOVC4gCisgICAgICogQ3JlYXRlcyBhIFJhc3RlciBvYmplY3Qgd2l0aCBhIFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbCBhbmQgdGhlCisgICAgICogc3BlY2lmaWVkIGRhdGEgdHlwZS4gVGhlIERhdGEgdHlwZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAgICAqIFRZUEVfQllURSwgVFlQRV9VU0hPUlQsIG9yIFRZUEVfSU5ULgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhVHlwZSB0aGUgZGF0YSB0eXBlIG9mIHNhbXBsZXM6Ci0gICAgICogVFlQRV9CWVRFLCBUWVBFX1VTSE9SVCwgb3IgVFlQRV9JTlQuIAotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiBpbWFnZSBkYXRhLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gYmFuZHMgdGhlIG51bWJlciBvZiBiYW5kcy4KLSAgICAgKiBAcGFyYW0gbG9jYXRpb24gdGhlIGxvY2F0aW9uIHdoaWNoIGRlZmluZXMgdGhlIHVwcGVyIGxlZnQgY29ybmVyIAotICAgICAqIG9mIHRoZSBSYXN0ZXIuCi0gICAgICogCisgICAgICogQHBhcmFtIGRhdGFUeXBlCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSB0eXBlIG9mIHNhbXBsZXM6IFRZUEVfQllURSwgVFlQRV9VU0hPUlQsIG9yIFRZUEVfSU5ULgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBiYW5kcworICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBiYW5kcy4KKyAgICAgKiBAcGFyYW0gbG9jYXRpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBsb2NhdGlvbiB3aGljaCBkZWZpbmVzIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUKKyAgICAgKiAgICAgICAgICAgIFJhc3Rlci4KICAgICAgKiBAcmV0dXJuIHRoZSBXcml0YWJsZVJhc3Rlci4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFdyaXRhYmxlUmFzdGVyIGNyZWF0ZUludGVybGVhdmVkUmFzdGVyKGludCBkYXRhVHlwZSwgaW50IHcsCi0gICAgICAgICAgICBpbnQgaCwgaW50IGJhbmRzLCBQb2ludCBsb2NhdGlvbikgeworICAgIHB1YmxpYyBzdGF0aWMgV3JpdGFibGVSYXN0ZXIgY3JlYXRlSW50ZXJsZWF2ZWRSYXN0ZXIoaW50IGRhdGFUeXBlLCBpbnQgdywgaW50IGgsIGludCBiYW5kcywKKyAgICAgICAgICAgIFBvaW50IGxvY2F0aW9uKSB7CiAKICAgICAgICAgaWYgKHcgPD0gMCB8fCBoIDw9IDApIHsKICAgICAgICAgICAgIC8vIGF3dC4yMkU9dyBvciBoIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB6ZXJvCkBAIC00MjMsMTQgKzQ2MiwxMyBAQAogICAgICAgICAgICAgbG9jYXRpb24gPSBuZXcgUG9pbnQoMCwgMCk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoKGxvbmcpIGxvY2F0aW9uLnggKyB3ID4gSW50ZWdlci5NQVhfVkFMVUUKLSAgICAgICAgICAgICAgICB8fCAobG9uZykgbG9jYXRpb24ueSArIGggPiBJbnRlZ2VyLk1BWF9WQUxVRSkgewotICAgICAgICAgICAgLy8gYXd0LjI3Nj1sb2NhdGlvbi54ICsgdyBvciBsb2NhdGlvbi55ICsgaCByZXN1bHRzIGluIGludGVnZXIgb3ZlcmZsb3cKKyAgICAgICAgaWYgKChsb25nKWxvY2F0aW9uLnggKyB3ID4gSW50ZWdlci5NQVhfVkFMVUUgfHwgKGxvbmcpbG9jYXRpb24ueSArIGggPiBJbnRlZ2VyLk1BWF9WQUxVRSkgeworICAgICAgICAgICAgLy8gYXd0LjI3Nj1sb2NhdGlvbi54ICsgdyBvciBsb2NhdGlvbi55ICsgaCByZXN1bHRzIGluIGludGVnZXIKKyAgICAgICAgICAgIC8vIG92ZXJmbG93CiAgICAgICAgICAgICB0aHJvdyBuZXcgUmFzdGVyRm9ybWF0RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI3NiIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGRhdGFUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9CWVRFCi0gICAgICAgICAgICAgICAgJiYgZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVCkgeworICAgICAgICBpZiAoZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX0JZVEUgJiYgZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVCkgewogICAgICAgICAgICAgLy8gYXd0LjIzMD1kYXRhVHlwZSBpcyBub3Qgb25lIG9mIHRoZSBzdXBwb3J0ZWQgZGF0YSB0eXBlcwogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMzAiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQpAQCAtNDQwLDI2ICs0NzgsMzAgQEAKICAgICAgICAgICAgIGJhbmRPZmZzZXRzW2ldID0gaTsKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBjcmVhdGVJbnRlcmxlYXZlZFJhc3RlcihkYXRhVHlwZSwgdywgaCwgdyAqIGJhbmRzLCBiYW5kcywKLSAgICAgICAgICAgICAgICBiYW5kT2Zmc2V0cywgbG9jYXRpb24pOworICAgICAgICByZXR1cm4gY3JlYXRlSW50ZXJsZWF2ZWRSYXN0ZXIoZGF0YVR5cGUsIHcsIGgsIHcgKiBiYW5kcywgYmFuZHMsIGJhbmRPZmZzZXRzLCBsb2NhdGlvbik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIFJhc3RlciBvYmplY3Qgd2l0aCBhIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgIAotICAgICAqIGFuZCB0aGUgc3BlY2lmaWVkIERhdGFCdWZmZXIuIAorICAgICAqIENyZWF0ZXMgYSBSYXN0ZXIgb2JqZWN0IHdpdGggYSBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIGFuZCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgRGF0YUJ1ZmZlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YUJ1ZmZlciB0aGUgRGF0YUJ1ZmZlci4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIGltYWdlIGRhdGEuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gc2NhbmxpbmVTdHJpZGUgdGhlIHNjYW5saW5lIHN0cmlkZSBvZiB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gYmFuZE1hc2tzIHRoZSBiYW5kIG1hc2tzLgotICAgICAqIEBwYXJhbSBsb2NhdGlvbiB0aGUgbG9jYXRpb24gd2hpY2ggZGVmaW5lcyB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgCi0gICAgICogb2YgdGhlIFJhc3Rlci4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGF0YUJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIERhdGFCdWZmZXIuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gc2NhbmxpbmVTdHJpZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzY2FubGluZSBzdHJpZGUgb2YgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIGJhbmRNYXNrcworICAgICAqICAgICAgICAgICAgdGhlIGJhbmQgbWFza3MuCisgICAgICogQHBhcmFtIGxvY2F0aW9uCisgICAgICogICAgICAgICAgICB0aGUgbG9jYXRpb24gd2hpY2ggZGVmaW5lcyB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlCisgICAgICogICAgICAgICAgICBSYXN0ZXIuCiAgICAgICogQHJldHVybiB0aGUgV3JpdGFibGVSYXN0ZXIuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBXcml0YWJsZVJhc3RlciBjcmVhdGVQYWNrZWRSYXN0ZXIoRGF0YUJ1ZmZlciBkYXRhQnVmZmVyLAotICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgc2NhbmxpbmVTdHJpZGUsIGludCBiYW5kTWFza3NbXSwgUG9pbnQgbG9jYXRpb24pIHsKKyAgICBwdWJsaWMgc3RhdGljIFdyaXRhYmxlUmFzdGVyIGNyZWF0ZVBhY2tlZFJhc3RlcihEYXRhQnVmZmVyIGRhdGFCdWZmZXIsIGludCB3LCBpbnQgaCwKKyAgICAgICAgICAgIGludCBzY2FubGluZVN0cmlkZSwgaW50IGJhbmRNYXNrc1tdLCBQb2ludCBsb2NhdGlvbikgewogICAgICAgICBpZiAoZGF0YUJ1ZmZlciA9PSBudWxsKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjc4PWRhdGFCdWZmZXIgaXMgbnVsbAogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI3OCIpKTsgLy8kTk9OLU5MUy0xJApAQCAtNDc0LDkgKzUxNiw5IEBACiAgICAgICAgICAgICBsb2NhdGlvbiA9IG5ldyBQb2ludCgwLCAwKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICgobG9uZykgbG9jYXRpb24ueCArIHcgPiBJbnRlZ2VyLk1BWF9WQUxVRQotICAgICAgICAgICAgICAgIHx8IChsb25nKSBsb2NhdGlvbi55ICsgaCA+IEludGVnZXIuTUFYX1ZBTFVFKSB7Ci0gICAgICAgICAgICAvLyBhd3QuMjc2PWxvY2F0aW9uLnggKyB3IG9yIGxvY2F0aW9uLnkgKyBoIHJlc3VsdHMgaW4gaW50ZWdlciBvdmVyZmxvdworICAgICAgICBpZiAoKGxvbmcpbG9jYXRpb24ueCArIHcgPiBJbnRlZ2VyLk1BWF9WQUxVRSB8fCAobG9uZylsb2NhdGlvbi55ICsgaCA+IEludGVnZXIuTUFYX1ZBTFVFKSB7CisgICAgICAgICAgICAvLyBhd3QuMjc2PWxvY2F0aW9uLnggKyB3IG9yIGxvY2F0aW9uLnkgKyBoIHJlc3VsdHMgaW4gaW50ZWdlcgorICAgICAgICAgICAgLy8gb3ZlcmZsb3cKICAgICAgICAgICAgIHRocm93IG5ldyBSYXN0ZXJGb3JtYXRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjc2IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIApAQCAtNDkxLDM1ICs1MzMsMzcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGludCBkYXRhVHlwZSA9IGRhdGFCdWZmZXIuZ2V0RGF0YVR5cGUoKTsKLSAgICAgICAgaWYgKGRhdGFUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9CWVRFCi0gICAgICAgICAgICAgICAgJiYgZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVAorICAgICAgICBpZiAoZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX0JZVEUgJiYgZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVAogICAgICAgICAgICAgICAgICYmIGRhdGFUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9JTlQpIHsKICAgICAgICAgICAgIC8vIGF3dC4yMzA9ZGF0YVR5cGUgaXMgbm90IG9uZSBvZiB0aGUgc3VwcG9ydGVkIGRhdGEgdHlwZXMKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjMwIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIHNhbXBsZU1vZGVsID0gCi0gICAgICAgICAgICBuZXcgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbChkYXRhVHlwZSwgdywgaCwgCi0gICAgICAgICAgICAgICAgICAgIHNjYW5saW5lU3RyaWRlLCBiYW5kTWFza3MpOworICAgICAgICBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIHNhbXBsZU1vZGVsID0gbmV3IFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwoZGF0YVR5cGUsIHcsIGgsCisgICAgICAgICAgICAgICAgc2NhbmxpbmVTdHJpZGUsIGJhbmRNYXNrcyk7CiAKICAgICAgICAgcmV0dXJuIG5ldyBPcmRpbmFyeVdyaXRhYmxlUmFzdGVyKHNhbXBsZU1vZGVsLCBkYXRhQnVmZmVyLCBsb2NhdGlvbik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIFJhc3RlciBvYmplY3Qgd2l0aCBhIE11bHRpUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCAgIAotICAgICAqIGFuZCB0aGUgc3BlY2lmaWVkIERhdGFCdWZmZXIuCisgICAgICogQ3JlYXRlcyBhIFJhc3RlciBvYmplY3Qgd2l0aCBhIE11bHRpUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCBhbmQgdGhlCisgICAgICogc3BlY2lmaWVkIERhdGFCdWZmZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFCdWZmZXIgdGhlIERhdGFCdWZmZXIuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBkYXRhLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlIGRhdGEuCi0gICAgICogQHBhcmFtIGJpdHNQZXJQaXhlbCB0aGUgbnVtYmVyIG9mIGJpdHMgcGVyIHBpeGVsLgotICAgICAqIEBwYXJhbSBsb2NhdGlvbiB0aGUgbG9jYXRpb24gd2hpY2ggZGVmaW5lcyB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgCi0gICAgICogb2YgdGhlIFJhc3Rlci4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGF0YUJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIERhdGFCdWZmZXIuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gYml0c1BlclBpeGVsCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJpdHMgcGVyIHBpeGVsLgorICAgICAqIEBwYXJhbSBsb2NhdGlvbgorICAgICAqICAgICAgICAgICAgdGhlIGxvY2F0aW9uIHdoaWNoIGRlZmluZXMgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZQorICAgICAqICAgICAgICAgICAgUmFzdGVyLgogICAgICAqIEByZXR1cm4gdGhlIFdyaXRhYmxlUmFzdGVyLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgV3JpdGFibGVSYXN0ZXIgY3JlYXRlUGFja2VkUmFzdGVyKERhdGFCdWZmZXIgZGF0YUJ1ZmZlciwKLSAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IGJpdHNQZXJQaXhlbCwgUG9pbnQgbG9jYXRpb24pIHsKKyAgICBwdWJsaWMgc3RhdGljIFdyaXRhYmxlUmFzdGVyIGNyZWF0ZVBhY2tlZFJhc3RlcihEYXRhQnVmZmVyIGRhdGFCdWZmZXIsIGludCB3LCBpbnQgaCwKKyAgICAgICAgICAgIGludCBiaXRzUGVyUGl4ZWwsIFBvaW50IGxvY2F0aW9uKSB7CiAKICAgICAgICAgaWYgKHcgPD0gMCB8fCBoIDw9IDApIHsKICAgICAgICAgICAgIC8vIGF3dC4yMkU9dyBvciBoIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB6ZXJvCkBAIC01MzAsOSArNTc0LDkgQEAKICAgICAgICAgICAgIGxvY2F0aW9uID0gbmV3IFBvaW50KDAsIDApOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKChsb25nKSBsb2NhdGlvbi54ICsgdyA+IEludGVnZXIuTUFYX1ZBTFVFCi0gICAgICAgICAgICAgICAgfHwgKGxvbmcpIGxvY2F0aW9uLnkgKyBoID4gSW50ZWdlci5NQVhfVkFMVUUpIHsKLSAgICAgICAgICAgIC8vIGF3dC4yNzY9bG9jYXRpb24ueCArIHcgb3IgbG9jYXRpb24ueSArIGggcmVzdWx0cyBpbiBpbnRlZ2VyIG92ZXJmbG93CisgICAgICAgIGlmICgobG9uZylsb2NhdGlvbi54ICsgdyA+IEludGVnZXIuTUFYX1ZBTFVFIHx8IChsb25nKWxvY2F0aW9uLnkgKyBoID4gSW50ZWdlci5NQVhfVkFMVUUpIHsKKyAgICAgICAgICAgIC8vIGF3dC4yNzY9bG9jYXRpb24ueCArIHcgb3IgbG9jYXRpb24ueSArIGggcmVzdWx0cyBpbiBpbnRlZ2VyCisgICAgICAgICAgICAvLyBvdmVyZmxvdwogICAgICAgICAgICAgdGhyb3cgbmV3IFJhc3RlckZvcm1hdEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNzYiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCkBAIC01NDcsMzcgKzU5MSw0MCBAQAogICAgICAgICB9CiAKICAgICAgICAgaW50IGRhdGFUeXBlID0gZGF0YUJ1ZmZlci5nZXREYXRhVHlwZSgpOwotICAgICAgICBpZiAoZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX0JZVEUKLSAgICAgICAgICAgICAgICAmJiBkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUCisgICAgICAgIGlmIChkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfQllURSAmJiBkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUCiAgICAgICAgICAgICAgICAgJiYgZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX0lOVCkgewogICAgICAgICAgICAgLy8gYXd0LjIzMD1kYXRhVHlwZSBpcyBub3Qgb25lIG9mIHRoZSBzdXBwb3J0ZWQgZGF0YSB0eXBlcwogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMzAiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCi0gICAgICAgIE11bHRpUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCBzYW1wbGVNb2RlbCA9IAotICAgICAgICAgICAgbmV3IE11bHRpUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbChkYXRhVHlwZSwgdywgaCwgYml0c1BlclBpeGVsKTsKKyAgICAgICAgTXVsdGlQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIHNhbXBsZU1vZGVsID0gbmV3IE11bHRpUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbChkYXRhVHlwZSwgdywgaCwKKyAgICAgICAgICAgICAgICBiaXRzUGVyUGl4ZWwpOwogCiAgICAgICAgIHJldHVybiBuZXcgT3JkaW5hcnlXcml0YWJsZVJhc3RlcihzYW1wbGVNb2RlbCwgZGF0YUJ1ZmZlciwgbG9jYXRpb24pOwogCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIFJhc3RlciBvYmplY3Qgd2l0aCBhIE11bHRpUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCAgIAotICAgICAqIGFuZCB0aGUgc3BlY2lmaWVkIERhdGFCdWZmZXIuCisgICAgICogQ3JlYXRlcyBhIFJhc3RlciBvYmplY3Qgd2l0aCBhIE11bHRpUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCBhbmQgdGhlCisgICAgICogc3BlY2lmaWVkIERhdGFCdWZmZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGRhdGFUeXBlIHRoZSBkYXRhIHR5cGUgb2Ygc2FtcGxlczoKLSAgICAgKiBUWVBFX0JZVEUsIFRZUEVfVVNIT1JULCBvciBUWVBFX0lOVC4gCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBkYXRhLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlIGRhdGEuCi0gICAgICogQHBhcmFtIGJhbmRzIHRoZSBudW1iZXIgb2YgYmFuZHMuCi0gICAgICogQHBhcmFtIGJpdHNQZXJCYW5kIHRoZSBudW1iZXIgb2YgYml0cyBwZXIgYmFuZC4KLSAgICAgKiBAcGFyYW0gbG9jYXRpb24gdGhlIGxvY2F0aW9uIHdoaWNoIGRlZmluZXMgdGhlIHVwcGVyIGxlZnQgY29ybmVyIAotICAgICAqIG9mIHRoZSBSYXN0ZXIuCi0gICAgICogCisgICAgICogQHBhcmFtIGRhdGFUeXBlCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSB0eXBlIG9mIHNhbXBsZXM6IFRZUEVfQllURSwgVFlQRV9VU0hPUlQsIG9yIFRZUEVfSU5ULgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIGJhbmRzCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJhbmRzLgorICAgICAqIEBwYXJhbSBiaXRzUGVyQmFuZAorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBiaXRzIHBlciBiYW5kLgorICAgICAqIEBwYXJhbSBsb2NhdGlvbgorICAgICAqICAgICAgICAgICAgdGhlIGxvY2F0aW9uIHdoaWNoIGRlZmluZXMgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZQorICAgICAqICAgICAgICAgICAgUmFzdGVyLgogICAgICAqIEByZXR1cm4gdGhlIFdyaXRhYmxlUmFzdGVyLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgV3JpdGFibGVSYXN0ZXIgY3JlYXRlUGFja2VkUmFzdGVyKGludCBkYXRhVHlwZSwgaW50IHcsIGludCBoLAotICAgICAgICAgICAgaW50IGJhbmRzLCBpbnQgYml0c1BlckJhbmQsIFBvaW50IGxvY2F0aW9uKSB7CisgICAgcHVibGljIHN0YXRpYyBXcml0YWJsZVJhc3RlciBjcmVhdGVQYWNrZWRSYXN0ZXIoaW50IGRhdGFUeXBlLCBpbnQgdywgaW50IGgsIGludCBiYW5kcywKKyAgICAgICAgICAgIGludCBiaXRzUGVyQmFuZCwgUG9pbnQgbG9jYXRpb24pIHsKIAogICAgICAgICBpZiAodyA8PSAwIHx8IGggPD0gMCkgewogICAgICAgICAgICAgLy8gYXd0LjIyRT13IG9yIGggaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8KQEAgLTU4OCw5ICs2MzUsOSBAQAogICAgICAgICAgICAgbG9jYXRpb24gPSBuZXcgUG9pbnQoMCwgMCk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoKGxvbmcpIGxvY2F0aW9uLnggKyB3ID4gSW50ZWdlci5NQVhfVkFMVUUKLSAgICAgICAgICAgICAgICB8fCAobG9uZykgbG9jYXRpb24ueSArIGggPiBJbnRlZ2VyLk1BWF9WQUxVRSkgewotICAgICAgICAgICAgLy8gYXd0LjI3Nj1sb2NhdGlvbi54ICsgdyBvciBsb2NhdGlvbi55ICsgaCByZXN1bHRzIGluIGludGVnZXIgb3ZlcmZsb3cKKyAgICAgICAgaWYgKChsb25nKWxvY2F0aW9uLnggKyB3ID4gSW50ZWdlci5NQVhfVkFMVUUgfHwgKGxvbmcpbG9jYXRpb24ueSArIGggPiBJbnRlZ2VyLk1BWF9WQUxVRSkgeworICAgICAgICAgICAgLy8gYXd0LjI3Nj1sb2NhdGlvbi54ICsgdyBvciBsb2NhdGlvbi55ICsgaCByZXN1bHRzIGluIGludGVnZXIKKyAgICAgICAgICAgIC8vIG92ZXJmbG93CiAgICAgICAgICAgICB0aHJvdyBuZXcgUmFzdGVyRm9ybWF0RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI3NiIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKQEAgLTU5OSwxNSArNjQ2LDE1IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI3RCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGRhdGFUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9CWVRFCi0gICAgICAgICAgICAgICAgJiYgZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVAorICAgICAgICBpZiAoZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX0JZVEUgJiYgZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVAogICAgICAgICAgICAgICAgICYmIGRhdGFUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9JTlQpIHsKICAgICAgICAgICAgIC8vIGF3dC4yMzA9ZGF0YVR5cGUgaXMgbm90IG9uZSBvZiB0aGUgc3VwcG9ydGVkIGRhdGEgdHlwZXMKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjMwIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAogICAgICAgICBpZiAoYml0c1BlckJhbmQgKiBiYW5kcyA+IERhdGFCdWZmZXIuZ2V0RGF0YVR5cGVTaXplKGRhdGFUeXBlKSkgewotICAgICAgICAgICAgLy8gYXd0LjI3RT1UaGUgcHJvZHVjdCBvZiBiaXRzUGVyQmFuZCBhbmQgYmFuZHMgaXMgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgYml0cyBoZWxkIGJ5IGRhdGFUeXBlCisgICAgICAgICAgICAvLyBhd3QuMjdFPVRoZSBwcm9kdWN0IG9mIGJpdHNQZXJCYW5kIGFuZCBiYW5kcyBpcyBncmVhdGVyIHRoYW4gdGhlCisgICAgICAgICAgICAvLyBudW1iZXIgb2YgYml0cyBoZWxkIGJ5IGRhdGFUeXBlCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI3RSIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKQEAgLTYyMyw0MyArNjcwLDQ1IEBACiAgICAgICAgICAgICByZXR1cm4gY3JlYXRlUGFja2VkUmFzdGVyKGRhdGFUeXBlLCB3LCBoLCBiYW5kTWFza3MsIGxvY2F0aW9uKTsKICAgICAgICAgfQogICAgICAgICBEYXRhQnVmZmVyIGRhdGEgPSBudWxsOwotICAgICAgICBpbnQgc2l6ZSA9ICgoYml0c1BlckJhbmQgKiB3ICsgCi0gICAgICAgICAgICAgICAgRGF0YUJ1ZmZlci5nZXREYXRhVHlwZVNpemUoZGF0YVR5cGUpIC0gMSkgLyAKLSAgICAgICAgICAgICAgICBEYXRhQnVmZmVyLmdldERhdGFUeXBlU2l6ZShkYXRhVHlwZSkpICogaDsKKyAgICAgICAgaW50IHNpemUgPSAoKGJpdHNQZXJCYW5kICogdyArIERhdGFCdWZmZXIuZ2V0RGF0YVR5cGVTaXplKGRhdGFUeXBlKSAtIDEpIC8gRGF0YUJ1ZmZlcgorICAgICAgICAgICAgICAgIC5nZXREYXRhVHlwZVNpemUoZGF0YVR5cGUpKQorICAgICAgICAgICAgICAgICogaDsKIAogICAgICAgICBzd2l0Y2ggKGRhdGFUeXBlKSB7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6Ci0gICAgICAgICAgICBkYXRhID0gbmV3IERhdGFCdWZmZXJCeXRlKHNpemUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKLSAgICAgICAgICAgIGRhdGEgPSBuZXcgRGF0YUJ1ZmZlclVTaG9ydChzaXplKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6Ci0gICAgICAgICAgICBkYXRhID0gbmV3IERhdGFCdWZmZXJJbnQoc2l6ZSk7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6CisgICAgICAgICAgICAgICAgZGF0YSA9IG5ldyBEYXRhQnVmZmVyQnl0ZShzaXplKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKKyAgICAgICAgICAgICAgICBkYXRhID0gbmV3IERhdGFCdWZmZXJVU2hvcnQoc2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6CisgICAgICAgICAgICAgICAgZGF0YSA9IG5ldyBEYXRhQnVmZmVySW50KHNpemUpOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBjcmVhdGVQYWNrZWRSYXN0ZXIoZGF0YSwgdywgaCwgYml0c1BlckJhbmQsIGxvY2F0aW9uKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgUmFzdGVyIG9iamVjdCB3aXRoIGEgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCAgICAKLSAgICAgKiBhbmQgdGhlIHNwZWNpZmllZCBEYXRhQnVmZmVyLgorICAgICAqIENyZWF0ZXMgYSBSYXN0ZXIgb2JqZWN0IHdpdGggYSBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIGFuZCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgRGF0YUJ1ZmZlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YVR5cGUgdGhlIGRhdGEgdHlwZSBvZiBzYW1wbGVzOgotICAgICAqIFRZUEVfQllURSwgVFlQRV9VU0hPUlQsIG9yIFRZUEVfSU5ULiAKLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIGltYWdlIGRhdGEuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gYmFuZE1hc2tzIHRoZSBiYW5kIG1hc2tzLgotICAgICAqIEBwYXJhbSBsb2NhdGlvbiB0aGUgbG9jYXRpb24gd2hpY2ggZGVmaW5lcyB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgCi0gICAgICogb2YgdGhlIFJhc3Rlci4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGF0YVR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIHR5cGUgb2Ygc2FtcGxlczogVFlQRV9CWVRFLCBUWVBFX1VTSE9SVCwgb3IgVFlQRV9JTlQuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gYmFuZE1hc2tzCisgICAgICogICAgICAgICAgICB0aGUgYmFuZCBtYXNrcy4KKyAgICAgKiBAcGFyYW0gbG9jYXRpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBsb2NhdGlvbiB3aGljaCBkZWZpbmVzIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUKKyAgICAgKiAgICAgICAgICAgIFJhc3Rlci4KICAgICAgKiBAcmV0dXJuIHRoZSBXcml0YWJsZVJhc3Rlci4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFdyaXRhYmxlUmFzdGVyIGNyZWF0ZVBhY2tlZFJhc3RlcihpbnQgZGF0YVR5cGUsIGludCB3LCBpbnQgaCwKLSAgICAgICAgICAgIGludCBiYW5kTWFza3NbXSwgUG9pbnQgbG9jYXRpb24pIHsKLSAgICAgICAgCi0gICAgICAgIGlmIChkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfQllURQotICAgICAgICAgICAgICAgICYmIGRhdGFUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9VU0hPUlQKKyAgICBwdWJsaWMgc3RhdGljIFdyaXRhYmxlUmFzdGVyIGNyZWF0ZVBhY2tlZFJhc3RlcihpbnQgZGF0YVR5cGUsIGludCB3LCBpbnQgaCwgaW50IGJhbmRNYXNrc1tdLAorICAgICAgICAgICAgUG9pbnQgbG9jYXRpb24pIHsKKworICAgICAgICBpZiAoZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX0JZVEUgJiYgZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVAogICAgICAgICAgICAgICAgICYmIGRhdGFUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9JTlQpIHsKICAgICAgICAgICAgIC8vIGF3dC4yMzA9ZGF0YVR5cGUgaXMgbm90IG9uZSBvZiB0aGUgc3VwcG9ydGVkIGRhdGEgdHlwZXMKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjMwIikpOyAvLyROT04tTkxTLTEkCkBAIC02NzQsOSArNzIzLDkgQEAKICAgICAgICAgICAgIGxvY2F0aW9uID0gbmV3IFBvaW50KDAsIDApOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKChsb25nKSBsb2NhdGlvbi54ICsgdyA+IEludGVnZXIuTUFYX1ZBTFVFCi0gICAgICAgICAgICAgICAgfHwgKGxvbmcpIGxvY2F0aW9uLnkgKyBoID4gSW50ZWdlci5NQVhfVkFMVUUpIHsKLSAgICAgICAgICAgIC8vIGF3dC4yNzY9bG9jYXRpb24ueCArIHcgb3IgbG9jYXRpb24ueSArIGggcmVzdWx0cyBpbiBpbnRlZ2VyIG92ZXJmbG93CisgICAgICAgIGlmICgobG9uZylsb2NhdGlvbi54ICsgdyA+IEludGVnZXIuTUFYX1ZBTFVFIHx8IChsb25nKWxvY2F0aW9uLnkgKyBoID4gSW50ZWdlci5NQVhfVkFMVUUpIHsKKyAgICAgICAgICAgIC8vIGF3dC4yNzY9bG9jYXRpb24ueCArIHcgb3IgbG9jYXRpb24ueSArIGggcmVzdWx0cyBpbiBpbnRlZ2VyCisgICAgICAgICAgICAvLyBvdmVyZmxvdwogICAgICAgICAgICAgdGhyb3cgbmV3IFJhc3RlckZvcm1hdEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNzYiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCkBAIC02ODgsMTUgKzczNywxNSBAQAogICAgICAgICBEYXRhQnVmZmVyIGRhdGEgPSBudWxsOwogCiAgICAgICAgIHN3aXRjaCAoZGF0YVR5cGUpIHsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKLSAgICAgICAgICAgIGRhdGEgPSBuZXcgRGF0YUJ1ZmZlckJ5dGUodyAqIGgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKLSAgICAgICAgICAgIGRhdGEgPSBuZXcgRGF0YUJ1ZmZlclVTaG9ydCh3ICogaCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgotICAgICAgICAgICAgZGF0YSA9IG5ldyBEYXRhQnVmZmVySW50KHcgKiBoKTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKKyAgICAgICAgICAgICAgICBkYXRhID0gbmV3IERhdGFCdWZmZXJCeXRlKHcgKiBoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKKyAgICAgICAgICAgICAgICBkYXRhID0gbmV3IERhdGFCdWZmZXJVU2hvcnQodyAqIGgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgorICAgICAgICAgICAgICAgIGRhdGEgPSBuZXcgRGF0YUJ1ZmZlckludCh3ICogaCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gY3JlYXRlUGFja2VkUmFzdGVyKGRhdGEsIHcsIGgsIHcsIGJhbmRNYXNrcywgbG9jYXRpb24pOwpAQCAtNzA1LDE1ICs3NTQsMTYgQEAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIGEgUmFzdGVyIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgRGF0YUJ1ZmZlciBhbmQgU2FtcGxlTW9kZWwuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNtIHRoZSBzcGVjaWZpZWQgU2FtcGxlTW9kZWwuCi0gICAgICogQHBhcmFtIGRiIHRoZSBzcGVjaWZpZWQgRGF0YUJ1ZmZlci4KLSAgICAgKiBAcGFyYW0gbG9jYXRpb24gdGhlIGxvY2F0aW9uIHdoaWNoIGRlZmluZXMgdGhlIHVwcGVyIGxlZnQgY29ybmVyIAotICAgICAqIG9mIHRoZSBSYXN0ZXIuCi0gICAgICogCisgICAgICogQHBhcmFtIHNtCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIFNhbXBsZU1vZGVsLgorICAgICAqIEBwYXJhbSBkYgorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBEYXRhQnVmZmVyLgorICAgICAqIEBwYXJhbSBsb2NhdGlvbgorICAgICAqICAgICAgICAgICAgdGhlIGxvY2F0aW9uIHdoaWNoIGRlZmluZXMgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZQorICAgICAqICAgICAgICAgICAgUmFzdGVyLgogICAgICAqIEByZXR1cm4gdGhlIFJhc3Rlci4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJhc3RlciBjcmVhdGVSYXN0ZXIoU2FtcGxlTW9kZWwgc20sIERhdGFCdWZmZXIgZGIsCi0gICAgICAgICAgICBQb2ludCBsb2NhdGlvbikgeworICAgIHB1YmxpYyBzdGF0aWMgUmFzdGVyIGNyZWF0ZVJhc3RlcihTYW1wbGVNb2RlbCBzbSwgRGF0YUJ1ZmZlciBkYiwgUG9pbnQgbG9jYXRpb24pIHsKIAogICAgICAgICBpZiAoc20gPT0gbnVsbCB8fCBkYiA9PSBudWxsKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjdGPVNhbXBsZU1vZGVsIG9yIERhdGFCdWZmZXIgaXMgbnVsbApAQCAtNzMwLDE1ICs3ODAsMTYgQEAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIGEgV3JpdGFibGVSYXN0ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIFNhbXBsZU1vZGVsIGFuZCBEYXRhQnVmZmVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzbSB0aGUgc3BlY2lmaWVkIFNhbXBsZU1vZGVsLgotICAgICAqIEBwYXJhbSBkYiB0aGUgc3BlY2lmaWVkIERhdGFCdWZmZXIuCi0gICAgICogQHBhcmFtIGxvY2F0aW9uIHRoZSBsb2NhdGlvbiB3aGljaCBkZWZpbmVzIHRoZSB1cHBlciBsZWZ0IGNvcm5lciAKLSAgICAgKiBvZiB0aGUgUmFzdGVyLgotICAgICAqIAorICAgICAqIEBwYXJhbSBzbQorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBTYW1wbGVNb2RlbC4KKyAgICAgKiBAcGFyYW0gZGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgRGF0YUJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gbG9jYXRpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBsb2NhdGlvbiB3aGljaCBkZWZpbmVzIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUKKyAgICAgKiAgICAgICAgICAgIFJhc3Rlci4KICAgICAgKiBAcmV0dXJuIHRoZSBXcml0YWJsZVJhc3Rlci4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFdyaXRhYmxlUmFzdGVyIGNyZWF0ZVdyaXRhYmxlUmFzdGVyKFNhbXBsZU1vZGVsIHNtLAotICAgICAgICAgICAgRGF0YUJ1ZmZlciBkYiwgUG9pbnQgbG9jYXRpb24pIHsKKyAgICBwdWJsaWMgc3RhdGljIFdyaXRhYmxlUmFzdGVyIGNyZWF0ZVdyaXRhYmxlUmFzdGVyKFNhbXBsZU1vZGVsIHNtLCBEYXRhQnVmZmVyIGRiLCBQb2ludCBsb2NhdGlvbikgewogCiAgICAgICAgIGlmIChzbSA9PSBudWxsIHx8IGRiID09IG51bGwpIHsKICAgICAgICAgICAgIC8vIGF3dC4yN0Y9U2FtcGxlTW9kZWwgb3IgRGF0YUJ1ZmZlciBpcyBudWxsCkBAIC03NTUsMTQgKzgwNiwxNCBAQAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgYSBXcml0YWJsZVJhc3RlciB3aXRoIHRoZSBzcGVjaWZpZWQgU2FtcGxlTW9kZWwuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNtIHRoZSBzcGVjaWZpZWQgU2FtcGxlTW9kZWwuCi0gICAgICogQHBhcmFtIGxvY2F0aW9uIHRoZSBsb2NhdGlvbiB3aGljaCBkZWZpbmVzIHRoZSB1cHBlciBsZWZ0IGNvcm5lciAKLSAgICAgKiBvZiB0aGUgUmFzdGVyLgotICAgICAqIAorICAgICAqIEBwYXJhbSBzbQorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBTYW1wbGVNb2RlbC4KKyAgICAgKiBAcGFyYW0gbG9jYXRpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBsb2NhdGlvbiB3aGljaCBkZWZpbmVzIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUKKyAgICAgKiAgICAgICAgICAgIFJhc3Rlci4KICAgICAgKiBAcmV0dXJuIHRoZSBXcml0YWJsZVJhc3Rlci4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFdyaXRhYmxlUmFzdGVyIGNyZWF0ZVdyaXRhYmxlUmFzdGVyKFNhbXBsZU1vZGVsIHNtLAotICAgICAgICAgICAgUG9pbnQgbG9jYXRpb24pIHsKKyAgICBwdWJsaWMgc3RhdGljIFdyaXRhYmxlUmFzdGVyIGNyZWF0ZVdyaXRhYmxlUmFzdGVyKFNhbXBsZU1vZGVsIHNtLCBQb2ludCBsb2NhdGlvbikgewogCiAgICAgICAgIGlmIChzbSA9PSBudWxsKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjgwPVNhbXBsZU1vZGVsIGlzIG51bGwKQEAgLTc4MCwzNCArODMxLDQyIEBACiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IFJhc3RlciBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIFNhbXBsZU1vZGVsIGFuZAogICAgICAqIERhdGFCdWZmZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNhbXBsZU1vZGVsIHRoZSBzcGVjaWZpZWQgU2FtcGxlTW9kZWwuCi0gICAgICogQHBhcmFtIGRhdGFCdWZmZXIgdGhlIHNwZWNpZmllZCAgRGF0YUJ1ZmZlci4KLSAgICAgKiBAcGFyYW0gb3JpZ2luIHRoZSBzcGVjaWZpZWQgb3JpZ2luLgorICAgICAqIEBwYXJhbSBzYW1wbGVNb2RlbAorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBTYW1wbGVNb2RlbC4KKyAgICAgKiBAcGFyYW0gZGF0YUJ1ZmZlcgorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBEYXRhQnVmZmVyLgorICAgICAqIEBwYXJhbSBvcmlnaW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgb3JpZ2luLgogICAgICAqLwotICAgIHByb3RlY3RlZCBSYXN0ZXIoU2FtcGxlTW9kZWwgc2FtcGxlTW9kZWwsIERhdGFCdWZmZXIgZGF0YUJ1ZmZlciwKLSAgICAgICAgICAgIFBvaW50IG9yaWdpbikgeworICAgIHByb3RlY3RlZCBSYXN0ZXIoU2FtcGxlTW9kZWwgc2FtcGxlTW9kZWwsIERhdGFCdWZmZXIgZGF0YUJ1ZmZlciwgUG9pbnQgb3JpZ2luKSB7CiAKLSAgICAgICAgdGhpcyhzYW1wbGVNb2RlbCwgZGF0YUJ1ZmZlciwgbmV3IFJlY3RhbmdsZShvcmlnaW4ueCwgb3JpZ2luLnksCi0gICAgICAgICAgICAgICAgc2FtcGxlTW9kZWwuZ2V0V2lkdGgoKSwgc2FtcGxlTW9kZWwuZ2V0SGVpZ2h0KCkpLCBvcmlnaW4sIG51bGwpOworICAgICAgICB0aGlzKHNhbXBsZU1vZGVsLCBkYXRhQnVmZmVyLCBuZXcgUmVjdGFuZ2xlKG9yaWdpbi54LCBvcmlnaW4ueSwgc2FtcGxlTW9kZWwuZ2V0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICBzYW1wbGVNb2RlbC5nZXRIZWlnaHQoKSksIG9yaWdpbiwgbnVsbCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IFJhc3RlciBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIFNhbXBsZU1vZGVsLAotICAgICAqIERhdGFCdWZmZXIsIHJlY3Rhbmd1bGFyIHJlZ2lvbiBhbmQgcGFyZW50IFJhc3Rlci4gCisgICAgICogRGF0YUJ1ZmZlciwgcmVjdGFuZ3VsYXIgcmVnaW9uIGFuZCBwYXJlbnQgUmFzdGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzYW1wbGVNb2RlbCB0aGUgc3BlY2lmaWVkIFNhbXBsZU1vZGVsLgotICAgICAqIEBwYXJhbSBkYXRhQnVmZmVyIHRoZSBzcGVjaWZpZWQgRGF0YUJ1ZmZlci4KLSAgICAgKiBAcGFyYW0gYVJlZ2lvbiB0aGUgYSByZWN0YW5ndWxhciByZWdpb24gd2hpY2ggZGVmaW5lcyB0aGUgbmV3IGltYWdlIGJvdW5kcy4gCi0gICAgICogQHBhcmFtIHNhbXBsZU1vZGVsVHJhbnNsYXRlIHRoaXMgcG9pbnQgZGVmaW5lcyB0aGUgdHJhbnNsYXRpb24gcG9pbnQKLSAgICAgKiBmcm9tIHRoZSBTYW1wbGVNb2RlbCBjb29yZGluYXRlcyB0byB0aGUgbmV3IFJhc3RlciBjb29yZGluYXRlcy4KLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgb2YgdGhpcyBSYXN0ZXIuCisgICAgICogQHBhcmFtIHNhbXBsZU1vZGVsCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIFNhbXBsZU1vZGVsLgorICAgICAqIEBwYXJhbSBkYXRhQnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIERhdGFCdWZmZXIuCisgICAgICogQHBhcmFtIGFSZWdpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBhIHJlY3Rhbmd1bGFyIHJlZ2lvbiB3aGljaCBkZWZpbmVzIHRoZSBuZXcgaW1hZ2UgYm91bmRzLgorICAgICAqIEBwYXJhbSBzYW1wbGVNb2RlbFRyYW5zbGF0ZQorICAgICAqICAgICAgICAgICAgdGhpcyBwb2ludCBkZWZpbmVzIHRoZSB0cmFuc2xhdGlvbiBwb2ludCBmcm9tIHRoZSBTYW1wbGVNb2RlbAorICAgICAqICAgICAgICAgICAgY29vcmRpbmF0ZXMgdG8gdGhlIG5ldyBSYXN0ZXIgY29vcmRpbmF0ZXMuCisgICAgICogQHBhcmFtIHBhcmVudAorICAgICAqICAgICAgICAgICAgdGhlIHBhcmVudCBvZiB0aGlzIFJhc3Rlci4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUmFzdGVyKFNhbXBsZU1vZGVsIHNhbXBsZU1vZGVsLCBEYXRhQnVmZmVyIGRhdGFCdWZmZXIsCi0gICAgICAgICAgICBSZWN0YW5nbGUgYVJlZ2lvbiwgUG9pbnQgc2FtcGxlTW9kZWxUcmFuc2xhdGUsIFJhc3RlciBwYXJlbnQpIHsKKyAgICBwcm90ZWN0ZWQgUmFzdGVyKFNhbXBsZU1vZGVsIHNhbXBsZU1vZGVsLCBEYXRhQnVmZmVyIGRhdGFCdWZmZXIsIFJlY3RhbmdsZSBhUmVnaW9uLAorICAgICAgICAgICAgUG9pbnQgc2FtcGxlTW9kZWxUcmFuc2xhdGUsIFJhc3RlciBwYXJlbnQpIHsKIAogICAgICAgICBpZiAoc2FtcGxlTW9kZWwgPT0gbnVsbCB8fCBkYXRhQnVmZmVyID09IG51bGwgfHwgYVJlZ2lvbiA9PSBudWxsCiAgICAgICAgICAgICAgICAgfHwgc2FtcGxlTW9kZWxUcmFuc2xhdGUgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gYXd0LjI4MT1zYW1wbGVNb2RlbCwgZGF0YUJ1ZmZlciwgYVJlZ2lvbiBvciBzYW1wbGVNb2RlbFRyYW5zbGF0ZSBpcyBudWxsCisgICAgICAgICAgICAvLyBhd3QuMjgxPXNhbXBsZU1vZGVsLCBkYXRhQnVmZmVyLCBhUmVnaW9uIG9yIHNhbXBsZU1vZGVsVHJhbnNsYXRlCisgICAgICAgICAgICAvLyBpcyBudWxsCiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjgxIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIApAQCAtODE2LDI3ICs4NzUsMjUgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBSYXN0ZXJGb3JtYXRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjgyIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICBpZiAoKGxvbmcpIGFSZWdpb24ueCArIChsb25nKSBhUmVnaW9uLndpZHRoID4gSW50ZWdlci5NQVhfVkFMVUUpIHsKKyAgICAgICAgaWYgKChsb25nKWFSZWdpb24ueCArIChsb25nKWFSZWdpb24ud2lkdGggPiBJbnRlZ2VyLk1BWF9WQUxVRSkgewogICAgICAgICAgICAgLy8gYXd0LjI4Mz1PdmVyZmxvdyBYIGNvb3JkaW5hdGUgb2YgUmFzdGVyCiAgICAgICAgICAgICB0aHJvdyBuZXcgUmFzdGVyRm9ybWF0RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI4MyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgaWYgKChsb25nKSBhUmVnaW9uLnkgKyAobG9uZykgYVJlZ2lvbi5oZWlnaHQgPiBJbnRlZ2VyLk1BWF9WQUxVRSkgeworICAgICAgICBpZiAoKGxvbmcpYVJlZ2lvbi55ICsgKGxvbmcpYVJlZ2lvbi5oZWlnaHQgPiBJbnRlZ2VyLk1BWF9WQUxVRSkgewogICAgICAgICAgICAgLy8gYXd0LjI4ND1PdmVyZmxvdyBZIGNvb3JkaW5hdGUgb2YgUmFzdGVyCiAgICAgICAgICAgICB0aHJvdyBuZXcgUmFzdGVyRm9ybWF0RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI4NCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIGlmIChzYW1wbGVNb2RlbCBpbnN0YW5jZW9mIENvbXBvbmVudFNhbXBsZU1vZGVsKSB7CiAgICAgICAgICAgICB2YWxpZGF0ZURhdGFCdWZmZXIoZGF0YUJ1ZmZlciwgYVJlZ2lvbi53aWR0aCwgYVJlZ2lvbi5oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICgoQ29tcG9uZW50U2FtcGxlTW9kZWwpIHNhbXBsZU1vZGVsKS5nZXRTY2FubGluZVN0cmlkZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgKChDb21wb25lbnRTYW1wbGVNb2RlbClzYW1wbGVNb2RlbCkuZ2V0U2NhbmxpbmVTdHJpZGUoKSk7CiAgICAgICAgIH0gZWxzZSBpZiAoc2FtcGxlTW9kZWwgaW5zdGFuY2VvZiBNdWx0aVBpeGVsUGFja2VkU2FtcGxlTW9kZWwpIHsKICAgICAgICAgICAgIHZhbGlkYXRlRGF0YUJ1ZmZlcihkYXRhQnVmZmVyLCBhUmVnaW9uLndpZHRoLCBhUmVnaW9uLmhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgKChNdWx0aVBpeGVsUGFja2VkU2FtcGxlTW9kZWwpIHNhbXBsZU1vZGVsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTY2FubGluZVN0cmlkZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgKChNdWx0aVBpeGVsUGFja2VkU2FtcGxlTW9kZWwpc2FtcGxlTW9kZWwpLmdldFNjYW5saW5lU3RyaWRlKCkpOwogICAgICAgICB9IGVsc2UgaWYgKHNhbXBsZU1vZGVsIGluc3RhbmNlb2YgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCkgewogICAgICAgICAgICAgdmFsaWRhdGVEYXRhQnVmZmVyKGRhdGFCdWZmZXIsIGFSZWdpb24ud2lkdGgsIGFSZWdpb24uaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAoKFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwpIHNhbXBsZU1vZGVsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTY2FubGluZVN0cmlkZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgKChTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKXNhbXBsZU1vZGVsKS5nZXRTY2FubGluZVN0cmlkZSgpKTsKICAgICAgICAgfQogCiAgICAgICAgIHRoaXMuc2FtcGxlTW9kZWwgPSBzYW1wbGVNb2RlbDsKQEAgLTg1NiwzNiArOTEzLDQ0IEBACiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IFJhc3RlciB3aXRoIHRoZSBzcGVjaWZpZWQgU2FtcGxlTW9kZWwuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNhbXBsZU1vZGVsIHRoZSBzcGVjaWZpZWQgU2FtcGxlTW9kZWwuCi0gICAgICogQHBhcmFtIG9yaWdpbiB0aGUgb3JpZ2luLgorICAgICAqIEBwYXJhbSBzYW1wbGVNb2RlbAorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBTYW1wbGVNb2RlbC4KKyAgICAgKiBAcGFyYW0gb3JpZ2luCisgICAgICogICAgICAgICAgICB0aGUgb3JpZ2luLgogICAgICAqLwogICAgIHByb3RlY3RlZCBSYXN0ZXIoU2FtcGxlTW9kZWwgc2FtcGxlTW9kZWwsIFBvaW50IG9yaWdpbikgewotICAgICAgICB0aGlzKHNhbXBsZU1vZGVsLCBzYW1wbGVNb2RlbC5jcmVhdGVEYXRhQnVmZmVyKCksIG5ldyBSZWN0YW5nbGUoCi0gICAgICAgICAgICAgICAgb3JpZ2luLngsIG9yaWdpbi55LCBzYW1wbGVNb2RlbC5nZXRXaWR0aCgpLCBzYW1wbGVNb2RlbAotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEhlaWdodCgpKSwgb3JpZ2luLCBudWxsKTsKKyAgICAgICAgdGhpcyhzYW1wbGVNb2RlbCwgc2FtcGxlTW9kZWwuY3JlYXRlRGF0YUJ1ZmZlcigpLCBuZXcgUmVjdGFuZ2xlKG9yaWdpbi54LCBvcmlnaW4ueSwKKyAgICAgICAgICAgICAgICBzYW1wbGVNb2RlbC5nZXRXaWR0aCgpLCBzYW1wbGVNb2RlbC5nZXRIZWlnaHQoKSksIG9yaWdpbiwgbnVsbCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyB0aGUgY2hpbGQgb2YgdGhpcyBSYXN0ZXIgYnkgc2hhcmluZyB0aGUgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyCi0gICAgICogYXJlYSBpbiB0aGlzIFJhc3RlLiBUaGUgcGFyZW50WCwgcGFyZW50WSwgd2lkdGggCi0gICAgICogYW5kIGhlaWdodCBwYXJhbWV0ZXJzIHNwZWNpZnkgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgdG8gYmUgc2hhcmVkLgorICAgICAqIGFyZWEgaW4gdGhpcyByYXN0ZXIuIFRoZSBwYXJlbnRYLCBwYXJlbnRZLCB3aWR0aCBhbmQgaGVpZ2h0IHBhcmFtZXRlcnMKKyAgICAgKiBzcGVjaWZ5IHRoZSByZWN0YW5ndWxhciBhcmVhIHRvIGJlIHNoYXJlZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50WCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGlzIFJhc3Rlci4gCi0gICAgICogQHBhcmFtIHBhcmVudFkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhpcyBSYXN0ZXIuCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgY2hpbGQgYXJlYS4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIGNoaWxkIGFyZWEuCi0gICAgICogQHBhcmFtIGNoaWxkTWluWCB0aGUgWCBjb29yZGluYXRlIG9mIGNoaWxkIGFyZWEgbWFwcGVkIHRvIHRoZSBwYXJlbnRYCi0gICAgICogY29vcmRpbmF0ZS4KLSAgICAgKiBAcGFyYW0gY2hpbGRNaW5ZIHRoZSBZIGNvb3JkaW5hdGUgb2YgY2hpbGQgYXJlYSBtYXBwZWQgdG8gdGhlIHBhcmVudFkKLSAgICAgKiBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSBiYW5kTGlzdCB0aGUgYXJyYXkgb2YgYmFuZCBpbmRpY2llcy4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGFyZW50WAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhpcyBSYXN0ZXIuCisgICAgICogQHBhcmFtIHBhcmVudFkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoaXMgUmFzdGVyLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBjaGlsZCBhcmVhLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIGNoaWxkIGFyZWEuCisgICAgICogQHBhcmFtIGNoaWxkTWluWAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiBjaGlsZCBhcmVhIG1hcHBlZCB0byB0aGUgcGFyZW50WAorICAgICAqICAgICAgICAgICAgY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0gY2hpbGRNaW5ZCisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIGNoaWxkIGFyZWEgbWFwcGVkIHRvIHRoZSBwYXJlbnRZCisgICAgICogICAgICAgICAgICBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSBiYW5kTGlzdAorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGJhbmQgaW5kaWNlcy4KICAgICAgKiBAcmV0dXJuIHRoZSBSYXN0ZXIuCiAgICAgICovCi0gICAgcHVibGljIFJhc3RlciBjcmVhdGVDaGlsZChpbnQgcGFyZW50WCwgaW50IHBhcmVudFksIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgIGludCBjaGlsZE1pblgsIGludCBjaGlsZE1pblksIGludCBiYW5kTGlzdFtdKSB7CisgICAgcHVibGljIFJhc3RlciBjcmVhdGVDaGlsZChpbnQgcGFyZW50WCwgaW50IHBhcmVudFksIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGNoaWxkTWluWCwKKyAgICAgICAgICAgIGludCBjaGlsZE1pblksIGludCBiYW5kTGlzdFtdKSB7CiAgICAgICAgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSB7Ci0gICAgICAgICAgICAvLyBhd3QuMjg1PVdpZHRoIG9yIEhlaWdodCBvZiBjaGlsZCBSYXN0ZXIgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8KKyAgICAgICAgICAgIC8vIGF3dC4yODU9V2lkdGggb3IgSGVpZ2h0IG9mIGNoaWxkIFJhc3RlciBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8KKyAgICAgICAgICAgIC8vIHplcm8KICAgICAgICAgICAgIHRocm93IG5ldyBSYXN0ZXJGb3JtYXRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjg1IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIApAQCAtODk5LDIyICs5NjQsMjIgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBSYXN0ZXJGb3JtYXRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjg3IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICBpZiAoKGxvbmcpIHBhcmVudFggKyB3aWR0aCA+IEludGVnZXIuTUFYX1ZBTFVFKSB7CisgICAgICAgIGlmICgobG9uZylwYXJlbnRYICsgd2lkdGggPiBJbnRlZ2VyLk1BWF9WQUxVRSkgewogICAgICAgICAgICAgLy8gYXd0LjI4OD1wYXJlbnRYICsgd2lkdGggcmVzdWx0cyBpbiBpbnRlZ2VyIG92ZXJmbG93CiAgICAgICAgICAgICB0aHJvdyBuZXcgUmFzdGVyRm9ybWF0RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI4OCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgaWYgKChsb25nKSBwYXJlbnRZICsgaGVpZ2h0ID4gSW50ZWdlci5NQVhfVkFMVUUpIHsKKyAgICAgICAgaWYgKChsb25nKXBhcmVudFkgKyBoZWlnaHQgPiBJbnRlZ2VyLk1BWF9WQUxVRSkgewogICAgICAgICAgICAgLy8gYXd0LjI4OT1wYXJlbnRZICsgaGVpZ2h0IHJlc3VsdHMgaW4gaW50ZWdlciBvdmVyZmxvdwogICAgICAgICAgICAgdGhyb3cgbmV3IFJhc3RlckZvcm1hdEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yODkiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCi0gICAgICAgIGlmICgobG9uZykgY2hpbGRNaW5YICsgd2lkdGggPiBJbnRlZ2VyLk1BWF9WQUxVRSkgeworICAgICAgICBpZiAoKGxvbmcpY2hpbGRNaW5YICsgd2lkdGggPiBJbnRlZ2VyLk1BWF9WQUxVRSkgewogICAgICAgICAgICAgLy8gYXd0LjI4QT1jaGlsZE1pblggKyB3aWR0aCByZXN1bHRzIGluIGludGVnZXIgb3ZlcmZsb3cKICAgICAgICAgICAgIHRocm93IG5ldyBSYXN0ZXJGb3JtYXRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjhBIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICBpZiAoKGxvbmcpIGNoaWxkTWluWSArIGhlaWdodCA+IEludGVnZXIuTUFYX1ZBTFVFKSB7CisgICAgICAgIGlmICgobG9uZyljaGlsZE1pblkgKyBoZWlnaHQgPiBJbnRlZ2VyLk1BWF9WQUxVRSkgewogICAgICAgICAgICAgLy8gYXd0LjI4Qj1jaGlsZE1pblkgKyBoZWlnaHQgcmVzdWx0cyBpbiBpbnRlZ2VyIG92ZXJmbG93CiAgICAgICAgICAgICB0aHJvdyBuZXcgUmFzdGVyRm9ybWF0RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI4QiIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CkBAIC05MzAsMTUgKzk5NSwxNCBAQAogICAgICAgICBpbnQgY2hpbGRUcmFuc2xhdGVYID0gY2hpbGRNaW5YIC0gcGFyZW50WDsKICAgICAgICAgaW50IGNoaWxkVHJhbnNsYXRlWSA9IGNoaWxkTWluWSAtIHBhcmVudFk7CiAKLSAgICAgICAgcmV0dXJuIG5ldyBSYXN0ZXIoY2hpbGRNb2RlbCwgZGF0YUJ1ZmZlciwgbmV3IFJlY3RhbmdsZShjaGlsZE1pblgsCi0gICAgICAgICAgICAgICAgY2hpbGRNaW5ZLCB3aWR0aCwgaGVpZ2h0KSwgbmV3IFBvaW50KGNoaWxkVHJhbnNsYXRlWAotICAgICAgICAgICAgICAgICsgc2FtcGxlTW9kZWxUcmFuc2xhdGVYLCBjaGlsZFRyYW5zbGF0ZVkKLSAgICAgICAgICAgICAgICArIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSksIHRoaXMpOworICAgICAgICByZXR1cm4gbmV3IFJhc3RlcihjaGlsZE1vZGVsLCBkYXRhQnVmZmVyLAorICAgICAgICAgICAgICAgIG5ldyBSZWN0YW5nbGUoY2hpbGRNaW5YLCBjaGlsZE1pblksIHdpZHRoLCBoZWlnaHQpLCBuZXcgUG9pbnQoY2hpbGRUcmFuc2xhdGVYCisgICAgICAgICAgICAgICAgICAgICAgICArIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwgY2hpbGRUcmFuc2xhdGVZICsgc2FtcGxlTW9kZWxUcmFuc2xhdGVZKSwgdGhpcyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlIGEgY29tcGF0aWJsZSBXcml0YWJsZVJhc3RlciB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlcnMgCi0gICAgICogYXMgdGhpcyBSYXN0ZXIuCisgICAgICogQ3JlYXRlIGEgY29tcGF0aWJsZSBXcml0YWJsZVJhc3RlciB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlcnMgYXMgdGhpcworICAgICAqIFJhc3Rlci4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBXcml0YWJsZVJhc3Rlci4KICAgICAgKi8KQEAgLTk0NywxMiArMTAxMSwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZSBhIGNvbXBhdGlibGUgV3JpdGFibGVSYXN0ZXIgd2l0aCB0aGUgc2FtZSBwYXJhbWV0ZXJzIAotICAgICAqIGFzIHRoaXMgUmFzdGVyIGFuZCB0aGUgc3BlY2lmaWVkIHNpemUuCisgICAgICogQ3JlYXRlIGEgY29tcGF0aWJsZSBXcml0YWJsZVJhc3RlciB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlcnMgYXMgdGhpcworICAgICAqIFJhc3RlciBhbmQgdGhlIHNwZWNpZmllZCBzaXplLgogICAgICAqIAotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgbmV3IFdyaXRhYmxlUmFzdGVyLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIG5ldyBXcml0YWJsZVJhc3Rlci4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBuZXcgV3JpdGFibGVSYXN0ZXIuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIG5ldyBXcml0YWJsZVJhc3Rlci4KICAgICAgKiBAcmV0dXJuIHRoZSBXcml0YWJsZVJhc3Rlci4KICAgICAgKi8KICAgICBwdWJsaWMgV3JpdGFibGVSYXN0ZXIgY3JlYXRlQ29tcGF0aWJsZVdyaXRhYmxlUmFzdGVyKGludCB3LCBpbnQgaCkgewpAQCAtOTY3LDE4ICsxMDMyLDIwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlIGEgY29tcGF0aWJsZSBXcml0YWJsZVJhc3RlciB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlcnMgCi0gICAgICogYXMgdGhpcyBSYXN0ZXIgYW5kIHRoZSBzcGVjaWZpZWQgc2l6ZSBhbmQgbG9jYXRpb24uCisgICAgICogQ3JlYXRlIGEgY29tcGF0aWJsZSBXcml0YWJsZVJhc3RlciB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlcnMgYXMgdGhpcworICAgICAqIFJhc3RlciBhbmQgdGhlIHNwZWNpZmllZCBzaXplIGFuZCBsb2NhdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBuZXcgV3JpdGFibGVSYXN0ZXIuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgbmV3IFdyaXRhYmxlUmFzdGVyLgotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgbmV3IFdyaXRhYmxlUmFzdGVyLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIG5ldyBXcml0YWJsZVJhc3Rlci4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgbmV3IFdyaXRhYmxlUmFzdGVyLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBuZXcgV3JpdGFibGVSYXN0ZXIuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgbmV3IFdyaXRhYmxlUmFzdGVyLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBuZXcgV3JpdGFibGVSYXN0ZXIuCiAgICAgICogQHJldHVybiB0aGUgV3JpdGFibGVSYXN0ZXIuCiAgICAgICovCi0gICAgcHVibGljIFdyaXRhYmxlUmFzdGVyIGNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3RlcihpbnQgeCwgaW50IHksIGludCB3LAotICAgICAgICAgICAgaW50IGgpIHsKKyAgICBwdWJsaWMgV3JpdGFibGVSYXN0ZXIgY3JlYXRlQ29tcGF0aWJsZVdyaXRhYmxlUmFzdGVyKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKSB7CiAKICAgICAgICAgV3JpdGFibGVSYXN0ZXIgcmFzdGVyID0gY3JlYXRlQ29tcGF0aWJsZVdyaXRhYmxlUmFzdGVyKHcsIGgpOwogCkBAIC05ODYsMTIgKzEwNTMsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBjb21wYXRpYmxlIFdyaXRhYmxlUmFzdGVyIHdpdGggdGhlIHNhbWUgcGFyYW1ldGVycyAKLSAgICAgKiBhcyB0aGlzIFJhc3RlciBhbmQgdGhlIHNwZWNpZmllZCByZWN0YW5nbGUgd2hpY2ggZGV0ZXJtaW5lcwotICAgICAqIG5ldyBXcml0YWJsZVJhc3RlcidzIGxvY2F0aW9uIGFuZCBzaXplLgorICAgICAqIENyZWF0ZSBhIGNvbXBhdGlibGUgV3JpdGFibGVSYXN0ZXIgd2l0aCB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFzIHRoaXMKKyAgICAgKiBSYXN0ZXIgYW5kIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ2xlIHdoaWNoIGRldGVybWluZXMgbmV3IFdyaXRhYmxlUmFzdGVyJ3MKKyAgICAgKiBsb2NhdGlvbiBhbmQgc2l6ZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVjdCB0aGUgc3BlY2lmaWVkIFJlY3RhbmdsZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVjdAorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBSZWN0YW5nbGUuCiAgICAgICogQHJldHVybiB0aGUgV3JpdGFibGVSYXN0ZXIuCiAgICAgICovCiAgICAgcHVibGljIFdyaXRhYmxlUmFzdGVyIGNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3RlcihSZWN0YW5nbGUgcmVjdCkgewpAQCAtMTAwMCwyMyArMTA2NywyMSBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI4QyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3RlcihyZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCwKLSAgICAgICAgICAgICAgICByZWN0LmhlaWdodCk7CisgICAgICAgIHJldHVybiBjcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIocmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSB0cmFuc2xhdGVkIGNoaWxkIG9mIHRoaXMgUmFzdGVyLiBUaGUgTmV3IFJhc3RlcgotICAgICAqIG9iamVjdCBpcyBhIHJlZmVyZW5jZSB0byB0aGUgdGhpcyBSYXN0ZXIgd2l0aCBhIAotICAgICAqIGRpZmZlcmVudCBsb2NhdGlvbi4gCi0gICAgICogIAotICAgICAqIEBwYXJhbSBjaGlsZE1pblggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgbmV3IFJhc3Rlci4KLSAgICAgKiBAcGFyYW0gY2hpbGRNaW5ZIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIG5ldyBSYXN0ZXIuCisgICAgICogQ3JlYXRlcyB0aGUgdHJhbnNsYXRlZCBjaGlsZCBvZiB0aGlzIFJhc3Rlci4gVGhlIE5ldyBSYXN0ZXIgb2JqZWN0IGlzIGEKKyAgICAgKiByZWZlcmVuY2UgdG8gdGhlIHRoaXMgUmFzdGVyIHdpdGggYSBkaWZmZXJlbnQgbG9jYXRpb24uCiAgICAgICogCisgICAgICogQHBhcmFtIGNoaWxkTWluWAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgbmV3IFJhc3Rlci4KKyAgICAgKiBAcGFyYW0gY2hpbGRNaW5ZCisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBuZXcgUmFzdGVyLgogICAgICAqIEByZXR1cm4gdGhlIFJhc3Rlci4KICAgICAgKi8KICAgICBwdWJsaWMgUmFzdGVyIGNyZWF0ZVRyYW5zbGF0ZWRDaGlsZChpbnQgY2hpbGRNaW5YLCBpbnQgY2hpbGRNaW5ZKSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVDaGlsZChtaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0LCBjaGlsZE1pblgsIGNoaWxkTWluWSwKLSAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUNoaWxkKG1pblgsIG1pblksIHdpZHRoLCBoZWlnaHQsIGNoaWxkTWluWCwgY2hpbGRNaW5ZLCBudWxsKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEwMzgsNDEgKzExMDMsNDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkYXRhIGVsZW1lbnRzIHdoaWNoIHJlcHJlc2VudCB0aGUgcGl4ZWwgZGF0YSBvZiB0aGUgc3BlY2lmaWVkIAotICAgICAqIHJlY3RhbmdsZSBhcmVhIGFzIGEgcHJpbWl0aXZlIGFycmF5LiBUaGUgZm9sbG93aW5nIGltYWdlIGRhdGEgdHlwZXMKLSAgICAgKiBhcmUgc3VwcG9ydGVkOiBEYXRhQnVmZmVyLlRZUEVfQllURSwgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVCwgCi0gICAgICogRGF0YUJ1ZmZlci5UWVBFX0lOVCwgRGF0YUJ1ZmZlci5UWVBFX1NIT1JULCBEYXRhQnVmZmVyLlRZUEVfRkxPQVQsIAotICAgICAqIG9yIERhdGFCdWZmZXIuVFlQRV9ET1VCTEUuCisgICAgICogR2V0cyB0aGUgZGF0YSBlbGVtZW50cyB3aGljaCByZXByZXNlbnQgdGhlIHBpeGVsIGRhdGEgb2YgdGhlIHNwZWNpZmllZAorICAgICAqIHJlY3RhbmdsZSBhcmVhIGFzIGEgcHJpbWl0aXZlIGFycmF5LiBUaGUgZm9sbG93aW5nIGltYWdlIGRhdGEgdHlwZXMgYXJlCisgICAgICogc3VwcG9ydGVkOiBEYXRhQnVmZmVyLlRZUEVfQllURSwgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVCwKKyAgICAgKiBEYXRhQnVmZmVyLlRZUEVfSU5ULCBEYXRhQnVmZmVyLlRZUEVfU0hPUlQsIERhdGFCdWZmZXIuVFlQRV9GTE9BVCwgb3IKKyAgICAgKiBEYXRhQnVmZmVyLlRZUEVfRE9VQkxFLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIG91dERhdGEgdGhlIHJlc3VsdGluZyBhcnJheS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gb3V0RGF0YQorICAgICAqICAgICAgICAgICAgdGhlIHJlc3VsdGluZyBhcnJheS4KICAgICAgKiBAcmV0dXJuIHRoZSBkYXRhIGVsZW1lbnRzIG9mIHRoZSBzcGVjaWZpZWQgYXJlYSBvZiB0aGlzIFJhc3Rlci4KICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGdldERhdGFFbGVtZW50cyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgT2JqZWN0IG91dERhdGEpIHsKLSAgICAgICAgcmV0dXJuIHNhbXBsZU1vZGVsLmdldERhdGFFbGVtZW50cyh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLCB5Ci0gICAgICAgICAgICAgICAgLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVksIHcsIGgsIG91dERhdGEsIGRhdGFCdWZmZXIpOworICAgICAgICByZXR1cm4gc2FtcGxlTW9kZWwuZ2V0RGF0YUVsZW1lbnRzKHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsIHkgLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVksIHcsCisgICAgICAgICAgICAgICAgaCwgb3V0RGF0YSwgZGF0YUJ1ZmZlcik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGF0YSBlbGVtZW50cyB3aGljaCByZXByZXNlbnQgdGhlIHNwZWNpZmllZCBwaXhlbCBvZiAKLSAgICAgKiB0aGlzIFJhc3RlciBhcyBhIHByaW1pdGl2ZSBhcnJheS4gVGhlIGZvbGxvd2luZyBpbWFnZSBkYXRhIHR5cGVzCi0gICAgICogYXJlIHN1cHBvcnRlZDogRGF0YUJ1ZmZlci5UWVBFX0JZVEUsIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQsIAotICAgICAqIERhdGFCdWZmZXIuVFlQRV9JTlQsIERhdGFCdWZmZXIuVFlQRV9TSE9SVCwgRGF0YUJ1ZmZlci5UWVBFX0ZMT0FULCAKLSAgICAgKiBvciBEYXRhQnVmZmVyLlRZUEVfRE9VQkxFLgorICAgICAqIEdldHMgdGhlIGRhdGEgZWxlbWVudHMgd2hpY2ggcmVwcmVzZW50IHRoZSBzcGVjaWZpZWQgcGl4ZWwgb2YgdGhpcyBSYXN0ZXIKKyAgICAgKiBhcyBhIHByaW1pdGl2ZSBhcnJheS4gVGhlIGZvbGxvd2luZyBpbWFnZSBkYXRhIHR5cGVzIGFyZSBzdXBwb3J0ZWQ6CisgICAgICogRGF0YUJ1ZmZlci5UWVBFX0JZVEUsIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQsIERhdGFCdWZmZXIuVFlQRV9JTlQsCisgICAgICogRGF0YUJ1ZmZlci5UWVBFX1NIT1JULCBEYXRhQnVmZmVyLlRZUEVfRkxPQVQsIG9yIERhdGFCdWZmZXIuVFlQRV9ET1VCTEUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCi0gICAgICogQHBhcmFtIG91dERhdGEgdGhlIHJlc3VsdGluZyBkYXRhLgotICAgICAqIAorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCisgICAgICogQHBhcmFtIG91dERhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSByZXN1bHRpbmcgZGF0YS4KICAgICAgKiBAcmV0dXJuIHRoZSBkYXRhIGVsZW1lbnRzIG9mIHRoZSBzcGVjaWZpZWQgcGl4ZWwgb2YgdGhpcyBSYXN0ZXIuCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdCBnZXREYXRhRWxlbWVudHMoaW50IHgsIGludCB5LCBPYmplY3Qgb3V0RGF0YSkgewotICAgICAgICByZXR1cm4gc2FtcGxlTW9kZWwuZ2V0RGF0YUVsZW1lbnRzKHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsIHkKLSAgICAgICAgICAgICAgICAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgb3V0RGF0YSwgZGF0YUJ1ZmZlcik7CisgICAgICAgIHJldHVybiBzYW1wbGVNb2RlbC5nZXREYXRhRWxlbWVudHMoeCAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwgeSAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwKKyAgICAgICAgICAgICAgICBvdXREYXRhLCBkYXRhQnVmZmVyKTsKICAgICB9CiAKICAgICAvKioKQEAgLTExMjEsNyArMTE5MSw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgcGFyZW50IFJhc3RlciBmb3IgdGhpcyBSYXN0ZXIgb2JqZWN0LiAKKyAgICAgKiBHZXRzIHRoZSBwYXJlbnQgUmFzdGVyIGZvciB0aGlzIFJhc3RlciBvYmplY3QuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgcGFyZW50IFJhc3RlciBmb3IgdGhpcyBSYXN0ZXIgb2JqZWN0LgogICAgICAqLwpAQCAtMTEzMCwxNTAgKzEyMDAsMTczIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhIGRvdWJsZSBhcnJheSBvZiBzYW1wbGVzIGZvciB0aGUgc3BlY2lmaWVkIHBpeGVsIGluIHRoaXMgUmFzdGVyLiAKKyAgICAgKiBHZXRzIGEgZG91YmxlIGFycmF5IG9mIHNhbXBsZXMgZm9yIHRoZSBzcGVjaWZpZWQgcGl4ZWwgaW4gdGhpcyBSYXN0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIHBpeGVsJ3MgWCBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSB5IHRoZSBwaXhlbCdzIFkgY29vcmRpbmF0ZS4KLSAgICAgKiBAcGFyYW0gZEFycmF5IHRoZSBkb3VibGUgYXJyYXkgd2hlcmUgcmVzdWx0IGFycmF5IHdpbGwgYmUgc3RvcmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRvdWJsZSBhcnJheSBvZiBzYW1wbGVzIGZvciB0aGUgc3BlY2lmaWVkIHBpeGVsIGluIAotICAgICAqIHRoaXMgUmFzdGVyLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgcGl4ZWwncyBYIGNvb3JkaW5hdGUuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBwaXhlbCdzIFkgY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0gZEFycmF5CisgICAgICogICAgICAgICAgICB0aGUgZG91YmxlIGFycmF5IHdoZXJlIHJlc3VsdCBhcnJheSB3aWxsIGJlIHN0b3JlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBkb3VibGUgYXJyYXkgb2Ygc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCBwaXhlbCBpbiB0aGlzCisgICAgICogICAgICAgICBSYXN0ZXIuCiAgICAgICovCiAgICAgcHVibGljIGRvdWJsZVtdIGdldFBpeGVsKGludCB4LCBpbnQgeSwgZG91YmxlIGRBcnJheVtdKSB7Ci0gICAgICAgIHJldHVybiBzYW1wbGVNb2RlbC5nZXRQaXhlbCh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLCB5Ci0gICAgICAgICAgICAgICAgLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVksIGRBcnJheSwgZGF0YUJ1ZmZlcik7CisgICAgICAgIHJldHVybiBzYW1wbGVNb2RlbC5nZXRQaXhlbCh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLCB5IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCBkQXJyYXksCisgICAgICAgICAgICAgICAgZGF0YUJ1ZmZlcik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhIGZsb2F0IGFycmF5IG9mIHNhbXBsZXMgZm9yIHRoZSBzcGVjaWZpZWQgcGl4ZWwgaW4gdGhpcyBSYXN0ZXIuIAorICAgICAqIEdldHMgYSBmbG9hdCBhcnJheSBvZiBzYW1wbGVzIGZvciB0aGUgc3BlY2lmaWVkIHBpeGVsIGluIHRoaXMgUmFzdGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBwaXhlbCdzIFggY29vcmRpbmF0ZS4KLSAgICAgKiBAcGFyYW0geSB0aGUgcGl4ZWwncyBZIGNvb3JkaW5hdGUuCi0gICAgICogQHBhcmFtIGZBcnJheSB0aGUgZmxvYXQgYXJyYXkgd2hlcmUgdGhlIHJlc3VsdCBhcnJheSB3aWxsIGJlIHN0b3JlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBmbG9hdCBhcnJheSBvZiBzYW1wbGVzIGZvciB0aGUgc3BlY2lmaWVkIHBpeGVsIGluIAotICAgICAqIHRoaXMgUmFzdGVyLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgcGl4ZWwncyBYIGNvb3JkaW5hdGUuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBwaXhlbCdzIFkgY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0gZkFycmF5CisgICAgICogICAgICAgICAgICB0aGUgZmxvYXQgYXJyYXkgd2hlcmUgdGhlIHJlc3VsdCBhcnJheSB3aWxsIGJlIHN0b3JlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBmbG9hdCBhcnJheSBvZiBzYW1wbGVzIGZvciB0aGUgc3BlY2lmaWVkIHBpeGVsIGluIHRoaXMKKyAgICAgKiAgICAgICAgIFJhc3Rlci4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXRbXSBnZXRQaXhlbChpbnQgeCwgaW50IHksIGZsb2F0IGZBcnJheVtdKSB7Ci0gICAgICAgIHJldHVybiBzYW1wbGVNb2RlbC5nZXRQaXhlbCh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLCB5Ci0gICAgICAgICAgICAgICAgLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVksIGZBcnJheSwgZGF0YUJ1ZmZlcik7CisgICAgICAgIHJldHVybiBzYW1wbGVNb2RlbC5nZXRQaXhlbCh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLCB5IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCBmQXJyYXksCisgICAgICAgICAgICAgICAgZGF0YUJ1ZmZlcik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbiBpbnQgYXJyYXkgb2Ygc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCBwaXhlbCBpbiB0aGlzIFJhc3Rlci4gCisgICAgICogR2V0cyBhbiBpbnRlZ2VyIGFycmF5IG9mIHNhbXBsZXMgZm9yIHRoZSBzcGVjaWZpZWQgcGl4ZWwgaW4gdGhpcyBSYXN0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIHBpeGVsJ3MgWCBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSB5IHRoZSBwaXhlbCdzIFkgY29vcmRpbmF0ZS4KLSAgICAgKiBAcGFyYW0gaUFycmF5IHRoZSBpbnQgYXJyYXkgd2hlcmUgdGhlIHJlc3VsdCBhcnJheSB3aWxsIGJlIHN0b3JlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnQgYXJyYXkgb2Ygc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCBwaXhlbCBpbiAKLSAgICAgKiB0aGlzIFJhc3Rlci4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIHBpeGVsJ3MgWCBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgcGl4ZWwncyBZIGNvb3JkaW5hdGUuCisgICAgICogQHBhcmFtIGlBcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGludGVnZXIgYXJyYXkgd2hlcmUgdGhlIHJlc3VsdCBhcnJheSB3aWxsIGJlIHN0b3JlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnRlZ2VyIGFycmF5IG9mIHNhbXBsZXMgZm9yIHRoZSBzcGVjaWZpZWQgcGl4ZWwgaW4gdGhpcworICAgICAqICAgICAgICAgUmFzdGVyLgogICAgICAqLwogICAgIHB1YmxpYyBpbnRbXSBnZXRQaXhlbChpbnQgeCwgaW50IHksIGludCBpQXJyYXlbXSkgewotICAgICAgICByZXR1cm4gc2FtcGxlTW9kZWwuZ2V0UGl4ZWwoeCAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwgeQotICAgICAgICAgICAgICAgIC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCBpQXJyYXksIGRhdGFCdWZmZXIpOworICAgICAgICByZXR1cm4gc2FtcGxlTW9kZWwuZ2V0UGl4ZWwoeCAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwgeSAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgaUFycmF5LAorICAgICAgICAgICAgICAgIGRhdGFCdWZmZXIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYW4gZG91YmxlIGFycmF5IG9mIHNhbXBsZXMgZm9yIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIKLSAgICAgKiBhcmVhIG9mIHBpeGVscyBpbiB0aGlzIFJhc3Rlci4KKyAgICAgKiBHZXRzIGFuIGRvdWJsZSBhcnJheSBvZiBzYW1wbGVzIGZvciB0aGUgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyIGFyZWEgb2YKKyAgICAgKiBwaXhlbHMgaW4gdGhpcyBSYXN0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSBhcmVhIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHRoZSBhcmVhIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gZEFycmF5IHRoZSByZXN1bHRpbmcgYXJyYXkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZG91YmxlIGFycmF5IG9mIHNhbXBsZXMgZm9yIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIKLSAgICAgKiBhcmVhIG9mIHBpeGVscyBpbiB0aGlzIFJhc3Rlci4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gZEFycmF5CisgICAgICogICAgICAgICAgICB0aGUgcmVzdWx0aW5nIGFycmF5LgorICAgICAqIEByZXR1cm4gdGhlIGRvdWJsZSBhcnJheSBvZiBzYW1wbGVzIGZvciB0aGUgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyIGFyZWEgb2YKKyAgICAgKiAgICAgICAgIHBpeGVscyBpbiB0aGlzIFJhc3Rlci4KICAgICAgKi8KICAgICBwdWJsaWMgZG91YmxlW10gZ2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBkb3VibGUgZEFycmF5W10pIHsKLSAgICAgICAgcmV0dXJuIHNhbXBsZU1vZGVsLmdldFBpeGVscyh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLCB5Ci0gICAgICAgICAgICAgICAgLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVksIHcsIGgsIGRBcnJheSwgZGF0YUJ1ZmZlcik7CisgICAgICAgIHJldHVybiBzYW1wbGVNb2RlbC5nZXRQaXhlbHMoeCAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwgeSAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgdywgaCwKKyAgICAgICAgICAgICAgICBkQXJyYXksIGRhdGFCdWZmZXIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYW4gZmxvYXQgYXJyYXkgb2Ygc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhcgotICAgICAqIGFyZWEgb2YgcGl4ZWxzIGluIHRoaXMgUmFzdGVyLgorICAgICAqIEdldHMgYW4gZmxvYXQgYXJyYXkgb2Ygc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhciBhcmVhIG9mCisgICAgICogcGl4ZWxzIGluIHRoaXMgUmFzdGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIGZBcnJheSB0aGUgcmVzdWx0aW5nIGFycmF5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZsb2F0IGFycmF5IG9mIHNhbXBsZXMgZm9yIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIKLSAgICAgKiBhcmVhIG9mIHBpeGVscyBpbiB0aGlzIFJhc3Rlci4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gZkFycmF5CisgICAgICogICAgICAgICAgICB0aGUgcmVzdWx0aW5nIGFycmF5LgorICAgICAqIEByZXR1cm4gdGhlIGZsb2F0IGFycmF5IG9mIHNhbXBsZXMgZm9yIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIgYXJlYSBvZgorICAgICAqICAgICAgICAgcGl4ZWxzIGluIHRoaXMgUmFzdGVyLgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdFtdIGdldFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgZmxvYXQgZkFycmF5W10pIHsKLSAgICAgICAgcmV0dXJuIHNhbXBsZU1vZGVsLmdldFBpeGVscyh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLCB5Ci0gICAgICAgICAgICAgICAgLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVksIHcsIGgsIGZBcnJheSwgZGF0YUJ1ZmZlcik7CisgICAgICAgIHJldHVybiBzYW1wbGVNb2RlbC5nZXRQaXhlbHMoeCAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwgeSAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgdywgaCwKKyAgICAgICAgICAgICAgICBmQXJyYXksIGRhdGFCdWZmZXIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYW4gaW50IGFycmF5IG9mIHNhbXBsZXMgZm9yIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIKLSAgICAgKiBhcmVhIG9mIHBpeGVscyBpbiB0aGlzIFJhc3Rlci4KKyAgICAgKiBHZXRzIGFuIGludGVnZXIgYXJyYXkgb2Ygc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhciBhcmVhIG9mCisgICAgICogcGl4ZWxzIGluIHRoaXMgcmFzdGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiBwaXhlbCdzIHRoZSBhcmVhIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHBpeGVsJ3MgdGhlIGFyZWEgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSBpQXJyYXkgdGhlIHJlc3VsdGluZyBhcnJheS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnQgYXJyYXkgb2Ygc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhcgotICAgICAqIGFyZWEgb2YgcGl4ZWxzIGluIHRoaXMgUmFzdGVyLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiBwaXhlbCdzIHRoZSBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiBwaXhlbCdzIHRoZSBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gaUFycmF5CisgICAgICogICAgICAgICAgICB0aGUgcmVzdWx0aW5nIGFycmF5LgorICAgICAqIEByZXR1cm4gdGhlIGludGVnZXIgYXJyYXkgb2Ygc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhciBhcmVhCisgICAgICogICAgICAgICBvZiBwaXhlbHMgaW4gdGhpcyBSYXN0ZXIuCiAgICAgICovCiAgICAgcHVibGljIGludFtdIGdldFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGlBcnJheVtdKSB7Ci0gICAgICAgIHJldHVybiBzYW1wbGVNb2RlbC5nZXRQaXhlbHMoeCAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwgeQotICAgICAgICAgICAgICAgIC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCB3LCBoLCBpQXJyYXksIGRhdGFCdWZmZXIpOworICAgICAgICByZXR1cm4gc2FtcGxlTW9kZWwuZ2V0UGl4ZWxzKHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsIHkgLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVksIHcsIGgsCisgICAgICAgICAgICAgICAgaUFycmF5LCBkYXRhQnVmZmVyKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzYW1wbGUgZm9yIHRoZSBzcGVjaWZpZWQgYmFuZCBvZiB0aGUgc3BlY2lmaWVkCi0gICAgICogcGl4ZWwgYXMgYW4gaW50LgorICAgICAqIEdldHMgdGhlIHNhbXBsZSBmb3IgdGhlIHNwZWNpZmllZCBiYW5kIG9mIHRoZSBzcGVjaWZpZWQgcGl4ZWwgYXMgYW4KKyAgICAgKiBpbnRlZ2VyLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLgotICAgICAqIEBwYXJhbSBiIHRoZSBiYW5kLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNhbXBsZSBmb3IgdGhlIHNwZWNpZmllZCBiYW5kIG9mIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBwaXhlbCBhcyBhbiBpbnQuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4KKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIGJhbmQuCisgICAgICogQHJldHVybiB0aGUgc2FtcGxlIGZvciB0aGUgc3BlY2lmaWVkIGJhbmQgb2YgdGhlIHNwZWNpZmllZCBwaXhlbCBhcyBhbgorICAgICAqICAgICAgICAgaW50ZWdlci4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFNhbXBsZShpbnQgeCwgaW50IHksIGludCBiKSB7Ci0gICAgICAgIHJldHVybiBzYW1wbGVNb2RlbC5nZXRTYW1wbGUoeCAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwgeQotICAgICAgICAgICAgICAgIC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCBiLCBkYXRhQnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIHNhbXBsZU1vZGVsLmdldFNhbXBsZSh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLCB5IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCBiLAorICAgICAgICAgICAgICAgIGRhdGFCdWZmZXIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNhbXBsZSBmb3IgdGhlIHNwZWNpZmllZCBiYW5kIG9mIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBwaXhlbCBhcyBhIGRvdWJsZS4KKyAgICAgKiBHZXRzIHRoZSBzYW1wbGUgZm9yIHRoZSBzcGVjaWZpZWQgYmFuZCBvZiB0aGUgc3BlY2lmaWVkIHBpeGVsIGFzIGEKKyAgICAgKiBkb3VibGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCi0gICAgICogQHBhcmFtIGIgdGhlIGJhbmQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2FtcGxlIGZvciB0aGUgc3BlY2lmaWVkIGJhbmQgb2YgdGhlIHNwZWNpZmllZAotICAgICAqIHBpeGVsIGFzIGEgZG91YmxlLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBiYW5kLgorICAgICAqIEByZXR1cm4gdGhlIHNhbXBsZSBmb3IgdGhlIHNwZWNpZmllZCBiYW5kIG9mIHRoZSBzcGVjaWZpZWQgcGl4ZWwgYXMgYQorICAgICAqICAgICAgICAgZG91YmxlLgogICAgICAqLwogICAgIHB1YmxpYyBkb3VibGUgZ2V0U2FtcGxlRG91YmxlKGludCB4LCBpbnQgeSwgaW50IGIpIHsKLSAgICAgICAgcmV0dXJuIHNhbXBsZU1vZGVsLmdldFNhbXBsZURvdWJsZSh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLCB5Ci0gICAgICAgICAgICAgICAgLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVksIGIsIGRhdGFCdWZmZXIpOworICAgICAgICByZXR1cm4gc2FtcGxlTW9kZWwuZ2V0U2FtcGxlRG91YmxlKHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsIHkgLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVksIGIsCisgICAgICAgICAgICAgICAgZGF0YUJ1ZmZlcik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgc2FtcGxlIGZvciB0aGUgc3BlY2lmaWVkIGJhbmQgb2YgdGhlIHNwZWNpZmllZAotICAgICAqIHBpeGVsIGFzIGEgZmxvYXQuCisgICAgICogR2V0cyB0aGUgc2FtcGxlIGZvciB0aGUgc3BlY2lmaWVkIGJhbmQgb2YgdGhlIHNwZWNpZmllZCBwaXhlbCBhcyBhIGZsb2F0LgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLgotICAgICAqIEBwYXJhbSBiIHRoZSBiYW5kLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNhbXBsZSBmb3IgdGhlIHNwZWNpZmllZCBiYW5kIG9mIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBwaXhlbCBhcyBhIGZsb2F0LgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBiYW5kLgorICAgICAqIEByZXR1cm4gdGhlIHNhbXBsZSBmb3IgdGhlIHNwZWNpZmllZCBiYW5kIG9mIHRoZSBzcGVjaWZpZWQgcGl4ZWwgYXMgYQorICAgICAqICAgICAgICAgZmxvYXQuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldFNhbXBsZUZsb2F0KGludCB4LCBpbnQgeSwgaW50IGIpIHsKLSAgICAgICAgcmV0dXJuIHNhbXBsZU1vZGVsLmdldFNhbXBsZUZsb2F0KHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsIHkKLSAgICAgICAgICAgICAgICAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgYiwgZGF0YUJ1ZmZlcik7CisgICAgICAgIHJldHVybiBzYW1wbGVNb2RlbC5nZXRTYW1wbGVGbG9hdCh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLCB5IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCBiLAorICAgICAgICAgICAgICAgIGRhdGFCdWZmZXIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTI4Niw5NyArMTM3OSwxMDUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0cmFuc2xhdGlvbiBvZiB0aGUgWCBjb29yZGluYXRlIGZyb20gdGhlIFNhbXBsZU1vZGVsCi0gICAgICogY29vcmRpbmF0ZSBzeXN0ZW0gdG8gdGhlIFJhc3RlcnMncyBjb29yZGluYXRlIHN5c3RlbS4KKyAgICAgKiBHZXRzIHRoZSB0cmFuc2xhdGlvbiBvZiB0aGUgWCBjb29yZGluYXRlIGZyb20gdGhlIFNhbXBsZU1vZGVsIGNvb3JkaW5hdGUKKyAgICAgKiBzeXN0ZW0gdG8gdGhlIFJhc3RlcnMncyBjb29yZGluYXRlIHN5c3RlbS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgdHJhbnNsYXRpb24gb2YgdGhlIFggY29vcmRpbmF0ZSBmcm9tIAotICAgICAqIHRoZSBTYW1wbGVNb2RlbCBjb29yZGluYXRlIHN5c3RlbSB0byB0aGUgUmFzdGVycydzIAotICAgICAqIGNvb3JkaW5hdGUgc3lzdGVtLgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSB0cmFuc2xhdGlvbiBvZiB0aGUgWCBjb29yZGluYXRlIGZyb20gdGhlCisgICAgICogICAgICAgICBTYW1wbGVNb2RlbCBjb29yZGluYXRlIHN5c3RlbSB0byB0aGUgUmFzdGVycydzIGNvb3JkaW5hdGUgc3lzdGVtLgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVYKCkgewogICAgICAgICByZXR1cm4gc2FtcGxlTW9kZWxUcmFuc2xhdGVYOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRyYW5zbGF0aW9uIG9mIHRoZSBZIGNvb3JkaW5hdGUgZnJvbSB0aGUgU2FtcGxlTW9kZWwKLSAgICAgKiBjb29yZGluYXRlIHN5c3RlbSB0byB0aGUgUmFzdGVycydzIGNvb3JkaW5hdGUgc3lzdGVtLgorICAgICAqIEdldHMgdGhlIHRyYW5zbGF0aW9uIG9mIHRoZSBZIGNvb3JkaW5hdGUgZnJvbSB0aGUgU2FtcGxlTW9kZWwgY29vcmRpbmF0ZQorICAgICAqIHN5c3RlbSB0byB0aGUgUmFzdGVycydzIGNvb3JkaW5hdGUgc3lzdGVtLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSB0cmFuc2xhdGlvbiBvZiB0aGUgWSBjb29yZGluYXRlIGZyb20gCi0gICAgICogdGhlIFNhbXBsZU1vZGVsIGNvb3JkaW5hdGUgc3lzdGVtIHRvIHRoZSBSYXN0ZXJzJ3MgCi0gICAgICogY29vcmRpbmF0ZSBzeXN0ZW0uCi0KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgdHJhbnNsYXRpb24gb2YgdGhlIFkgY29vcmRpbmF0ZSBmcm9tIHRoZQorICAgICAqICAgICAgICAgU2FtcGxlTW9kZWwgY29vcmRpbmF0ZSBzeXN0ZW0gdG8gdGhlIFJhc3RlcnMncyBjb29yZGluYXRlIHN5c3RlbS4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWSgpIHsKICAgICAgICAgcmV0dXJuIHNhbXBsZU1vZGVsVHJhbnNsYXRlWTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkb3VibGUgYXJyYXkgb2Ygc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCBiYW5kIAotICAgICAqIG9mIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMgaW4gdGhpcyBSYXN0ZXIKLSAgICAgKiBhcyBhIGRvdWJsZSBhcnJheS4KKyAgICAgKiBHZXRzIHRoZSBkb3VibGUgYXJyYXkgb2Ygc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCBiYW5kIG9mIHRoZSBzcGVjaWZpZWQKKyAgICAgKiByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscyBpbiB0aGlzIFJhc3RlciBhcyBhIGRvdWJsZSBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4gCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gYiB0aGUgYmFuZC4KLSAgICAgKiBAcGFyYW0gZEFycmF5IHRoZSByZXN1bHRpbmcgZG91YmxlIGFycmF5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRvdWJsZSBhcnJheSBvZiBzYW1wbGVzIGZvciB0aGUgc3BlY2lmaWVkIGJhbmQgCi0gICAgICogb2YgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIGJhbmQuCisgICAgICogQHBhcmFtIGRBcnJheQorICAgICAqICAgICAgICAgICAgdGhlIHJlc3VsdGluZyBkb3VibGUgYXJyYXkuCisgICAgICogQHJldHVybiB0aGUgZG91YmxlIGFycmF5IG9mIHNhbXBsZXMgZm9yIHRoZSBzcGVjaWZpZWQgYmFuZCBvZiB0aGUKKyAgICAgKiAgICAgICAgIHNwZWNpZmllZCByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4KICAgICAgKi8KLSAgICBwdWJsaWMgZG91YmxlW10gZ2V0U2FtcGxlcyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGIsCi0gICAgICAgICAgICBkb3VibGUgZEFycmF5W10pIHsKKyAgICBwdWJsaWMgZG91YmxlW10gZ2V0U2FtcGxlcyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGIsIGRvdWJsZSBkQXJyYXlbXSkgewogCi0gICAgICAgIHJldHVybiBzYW1wbGVNb2RlbC5nZXRTYW1wbGVzKHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsIHkKLSAgICAgICAgICAgICAgICAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgdywgaCwgYiwgZEFycmF5LCBkYXRhQnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIHNhbXBsZU1vZGVsLmdldFNhbXBsZXMoeCAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwgeSAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgdywgaCwKKyAgICAgICAgICAgICAgICBiLCBkQXJyYXksIGRhdGFCdWZmZXIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGZsb2F0IGFycmF5IG9mIHNhbXBsZXMgZm9yIHRoZSBzcGVjaWZpZWQgYmFuZCAKLSAgICAgKiBvZiB0aGUgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzIGluIHRoaXMgUmFzdGVyCi0gICAgICogYXMgYSBmbG9hdCBhcnJheS4KKyAgICAgKiBHZXRzIHRoZSBmbG9hdCBhcnJheSBvZiBzYW1wbGVzIGZvciB0aGUgc3BlY2lmaWVkIGJhbmQgb2YgdGhlIHNwZWNpZmllZAorICAgICAqIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzIGluIHRoaXMgUmFzdGVyIGFzIGEgZmxvYXQgYXJyYXkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuIAotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIGIgdGhlIGJhbmQuCi0gICAgICogQHBhcmFtIGZBcnJheSB0aGUgcmVzdWx0aW5nIGZsb2F0IGFycmF5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZsb2F0IGFycmF5IG9mIHNhbXBsZXMgZm9yIHRoZSBzcGVjaWZpZWQgYmFuZCAKLSAgICAgKiBvZiB0aGUgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgYmFuZC4KKyAgICAgKiBAcGFyYW0gZkFycmF5CisgICAgICogICAgICAgICAgICB0aGUgcmVzdWx0aW5nIGZsb2F0IGFycmF5LgorICAgICAqIEByZXR1cm4gdGhlIGZsb2F0IGFycmF5IG9mIHNhbXBsZXMgZm9yIHRoZSBzcGVjaWZpZWQgYmFuZCBvZiB0aGUKKyAgICAgKiAgICAgICAgIHNwZWNpZmllZCByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXRbXSBnZXRTYW1wbGVzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgYiwgZmxvYXQgZkFycmF5W10pIHsKIAotICAgICAgICByZXR1cm4gc2FtcGxlTW9kZWwuZ2V0U2FtcGxlcyh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLCB5Ci0gICAgICAgICAgICAgICAgLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVksIHcsIGgsIGIsIGZBcnJheSwgZGF0YUJ1ZmZlcik7CisgICAgICAgIHJldHVybiBzYW1wbGVNb2RlbC5nZXRTYW1wbGVzKHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsIHkgLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVksIHcsIGgsCisgICAgICAgICAgICAgICAgYiwgZkFycmF5LCBkYXRhQnVmZmVyKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBpbnQgYXJyYXkgb2Ygc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCBiYW5kIAotICAgICAqIG9mIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMgaW4gdGhpcyBSYXN0ZXIKLSAgICAgKiBhcyBhIGludCBhcnJheS4KKyAgICAgKiBHZXRzIHRoZSBpbnRlZ2VyIGFycmF5IG9mIHNhbXBsZXMgZm9yIHRoZSBzcGVjaWZpZWQgYmFuZCBvZiB0aGUgc3BlY2lmaWVkCisgICAgICogcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMgaW4gdGhpcyBSYXN0ZXIgYXMgYSBpbnRlZ2VyIGFycmF5LgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLiAKLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSBiIHRoZSBiYW5kLgotICAgICAqIEBwYXJhbSBpQXJyYXkgdGhlIHJlc3VsdGluZyBpbnQgYXJyYXkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW50IGFycmF5IG9mIHNhbXBsZXMgZm9yIHRoZSBzcGVjaWZpZWQgYmFuZCAKLSAgICAgKiBvZiB0aGUgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgYmFuZC4KKyAgICAgKiBAcGFyYW0gaUFycmF5CisgICAgICogICAgICAgICAgICB0aGUgcmVzdWx0aW5nIGludGVnZXIgYXJyYXkuCisgICAgICogQHJldHVybiB0aGUgaW50ZWdlciBhcnJheSBvZiBzYW1wbGVzIGZvciB0aGUgc3BlY2lmaWVkIGJhbmQgb2YgdGhlCisgICAgICogICAgICAgICBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMuCiAgICAgICovCiAgICAgcHVibGljIGludFtdIGdldFNhbXBsZXMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBiLCBpbnQgaUFycmF5W10pIHsKLSAgICAgICAgcmV0dXJuIHNhbXBsZU1vZGVsLmdldFNhbXBsZXMoeCAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwgeQotICAgICAgICAgICAgICAgIC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCB3LCBoLCBiLCBpQXJyYXksIGRhdGFCdWZmZXIpOworICAgICAgICByZXR1cm4gc2FtcGxlTW9kZWwuZ2V0U2FtcGxlcyh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLCB5IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCB3LCBoLAorICAgICAgICAgICAgICAgIGIsIGlBcnJheSwgZGF0YUJ1ZmZlcik7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgdHJhbnNmZXIgdHlwZSBmb3IgcGl4ZWxzIG9mIHRoaXMgUmFzdGVyLgotICAgICAqIEBzZWUgU2FtcGxlTW9kZWwjZ2V0VHJhbnNmZXJUeXBlKCkKICAgICAgKiAKKyAgICAgKiBAc2VlIFNhbXBsZU1vZGVsI2dldFRyYW5zZmVyVHlwZSgpCiAgICAgICogQHJldHVybiB0aGUgdHJhbnNmZXIgdHlwZSBmb3IgcGl4ZWxzIG9mIHRoaXMgUmFzdGVyLgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0VHJhbnNmZXJUeXBlKCkgewpAQCAtMTM5NSwxOCArMTQ5NiwyMCBAQAogICAgIC8qKgogICAgICAqIFZhbGlkYXRlIGRhdGEgYnVmZmVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhQnVmZmVyIHRoZSBkYXRhIGJ1ZmZlcgotICAgICAqIEBwYXJhbSB3IHRoZSB3Ci0gICAgICogQHBhcmFtIGggdGhlIGgKLSAgICAgKiBAcGFyYW0gc2NhbmxpbmVTdHJpZGUgdGhlIHNjYW5saW5lIHN0cmlkZQorICAgICAqIEBwYXJhbSBkYXRhQnVmZmVyCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSBidWZmZXIuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3LgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaC4KKyAgICAgKiBAcGFyYW0gc2NhbmxpbmVTdHJpZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzY2FubGluZSBzdHJpZGUuCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZURhdGFCdWZmZXIoZmluYWwgRGF0YUJ1ZmZlciBkYXRhQnVmZmVyLCBmaW5hbCBpbnQgdywKLSAgICAgICAgICAgIGZpbmFsIGludCBoLCBmaW5hbCBpbnQgc2NhbmxpbmVTdHJpZGUpIHsKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlRGF0YUJ1ZmZlcihmaW5hbCBEYXRhQnVmZmVyIGRhdGFCdWZmZXIsIGZpbmFsIGludCB3LCBmaW5hbCBpbnQgaCwKKyAgICAgICAgICAgIGZpbmFsIGludCBzY2FubGluZVN0cmlkZSkgewogICAgICAgICBpZiAoZGF0YUJ1ZmZlci5nZXRTaXplKCkgPCAoc2NhbmxpbmVTdHJpZGUgKiAoaCAtIDEpICsgdyAtIDEpKSB7CiAgICAgICAgICAgICAvLyBhd3QuMjk4PWRhdGFCdWZmZXIgaXMgdG9vIHNtYWxsCiAgICAgICAgICAgICB0aHJvdyBuZXcgUmFzdGVyRm9ybWF0RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI5OCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAgICAgfQogfQotCi0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9SYXN0ZXJGb3JtYXRFeGNlcHRpb24uamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9SYXN0ZXJGb3JtYXRFeGNlcHRpb24uamF2YQppbmRleCA4NTc3ZGFkLi5jNjY3MTQxIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvUmFzdGVyRm9ybWF0RXhjZXB0aW9uLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL1Jhc3RlckZvcm1hdEV4Y2VwdGlvbi5qYXZhCkBAIC0xOCwyOCArMTgsMzEgQEAKICAqIEBhdXRob3IgSWdvciBWLiBTdG9seWFyb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmltYWdlOwogCi0KIC8qKgotICogVGhlIFJhc3RlckZvcm1hdEV4Y2VwdGlvbiBjbGFzcyByZXByZXNlbnRzIHRoZSBleGNlcHRpb24gCi0gKiB0aGF0IGlzIHRocm93biB3aGVuIHRoZXJlJ3MgYW4gaW52YWxpZCBsYXlvdXQKLSAqIGluIHRoZSBSYXN0ZXIuCisgKiBUaGUgUmFzdGVyRm9ybWF0RXhjZXB0aW9uIGNsYXNzIHJlcHJlc2VudHMgdGhlIGV4Y2VwdGlvbiB0aGF0IGlzIHRocm93biB3aGVuCisgKiB0aGVyZSdzIGFuIGludmFsaWQgbGF5b3V0IGluIHRoZSBSYXN0ZXIuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgUmFzdGVyRm9ybWF0RXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gOTY1OTg5OTYxMTYxNjQzMTVMOwogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IFJhc3RlckZvcm1hdEV4Y2VwdGlvbiB3aXRoIHRoZSAKLSAgICAgKiBzcGVjaWZpZWQgZGV0YWlsIG1lc3NhZ2UuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IFJhc3RlckZvcm1hdEV4Y2VwdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgZGV0YWlsCisgICAgICogbWVzc2FnZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcyB0aGUgZGV0YWlsIG1lc3NhZ2UuCisgICAgICogQHBhcmFtIHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZS4KICAgICAgKi8KICAgICBwdWJsaWMgUmFzdGVyRm9ybWF0RXhjZXB0aW9uKFN0cmluZyBzKSB7CiAgICAgICAgIHN1cGVyKHMpOwogICAgIH0KIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvUmFzdGVyT3AuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9SYXN0ZXJPcC5qYXZhCmluZGV4IGU4OTMzZWUuLjE5YTg0YzkgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbWFnZS9SYXN0ZXJPcC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9SYXN0ZXJPcC5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIEFsZXhleSBBLiBQZXRyZW5rbwogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuaW1hZ2U7CiAKIGltcG9ydCBqYXZhLmF3dC5SZW5kZXJpbmdIaW50czsKQEAgLTI1LDIwICsyNiwyMiBAQAogaW1wb3J0IGphdmEuYXd0Lmdlb20uUmVjdGFuZ2xlMkQ7CiAKIC8qKgotICogVGhlIFJhc3Rlck9wIGludGVyZmFjZSBwcm92aWRlcyBtZXRob2RzIGZvciBwZXJmb3JtaW5nIHRyYW5zZm9ybWF0aW9ucwotICogZnJvbSBzb3VyY2UgZGF0YSB0byBkZXN0aW5hdGlvbiBkYXRhIGZvciBSYXN0ZXIgb2JqZWN0cy4gVGhlIHNvdXJjZSBhbmQgCi0gKiBkZXN0aW5hdGlvbiBvYmplY3RzIHNob3VsZCBjb250YWluIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgYmFuZHMgZm9yIAotICogdGhlIHBhcnRpY3VsYXIgY2xhc3NlcyB3aGljaCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCisgKiBUaGUgUmFzdGVyT3AgaW50ZXJmYWNlIHByb3ZpZGVzIG1ldGhvZHMgZm9yIHBlcmZvcm1pbmcgdHJhbnNmb3JtYXRpb25zIGZyb20KKyAqIHNvdXJjZSBkYXRhIHRvIGRlc3RpbmF0aW9uIGRhdGEgZm9yIFJhc3RlciBvYmplY3RzLiBUaGUgc291cmNlIGFuZAorICogZGVzdGluYXRpb24gb2JqZWN0cyBzaG91bGQgY29udGFpbiB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIGJhbmRzIGZvciB0aGUKKyAqIHBhcnRpY3VsYXIgY2xhc3NlcyB3aGljaCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIFJhc3Rlck9wIHsKLSAgICAKKwogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBkZXN0aW5hdGlvbiBXcml0YWJsZVJhc3RlciB3aXRoIHRoZSBzcGVjaWZpZWQgUmFzdGVyOwotICAgICAqIHRoaXMgZGVzdGluYXRpb24gaW1hZ2UgZGF0YSBpcyBlbXB0eSBhbmQgaGFzIHRoZSBjb3JyZWN0IHNpemUgCi0gICAgICogYW5kIG51bWJlciBvZiBiYW5kcy4gICAKKyAgICAgKiBDcmVhdGVzIGEgZGVzdGluYXRpb24gV3JpdGFibGVSYXN0ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIFJhc3RlcjsgdGhpcworICAgICAqIGRlc3RpbmF0aW9uIGltYWdlIGRhdGEgaXMgZW1wdHkgYW5kIGhhcyB0aGUgY29ycmVjdCBzaXplIGFuZCBudW1iZXIgb2YKKyAgICAgKiBiYW5kcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3JjIHRoZSBzb3VyY2UgUmFzdGVyLgotICAgICAqIAorICAgICAqIEBwYXJhbSBzcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgUmFzdGVyLgogICAgICAqIEByZXR1cm4gdGhlIFdyaXRhYmxlUmFzdGVyLgogICAgICAqLwogICAgIHB1YmxpYyBXcml0YWJsZVJhc3RlciBjcmVhdGVDb21wYXRpYmxlRGVzdFJhc3RlcihSYXN0ZXIgc3JjKTsKQEAgLTQ3LDkgKzUwLDEwIEBACiAgICAgICogUGVyZm9ybXMgYSBmaWx0ZXIgb3BlcmF0aW9uIG9uIHRoZSBzb3VyY2UgUmFzdGVyIGFuZCBzdG9yZXMgdGhlIHJlc3VsdGluZwogICAgICAqIGltYWdlIGRhdGEgdG8gdGhlIGRlc3RpbmF0aW9uIFdyaXRhYmxlUmFzdGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzcmMgdGhlIHNvdXJjZSBSYXN0ZXIuCi0gICAgICogQHBhcmFtIGRzdCB0aGUgZGVzdGluYXRpb24gV3JpdGFibGVSYXN0ZXIsIHdoZXJlIHRoZSByZXN1bHQgaXMgc3RvcmVkLgotICAgICAqIAorICAgICAqIEBwYXJhbSBzcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgUmFzdGVyLgorICAgICAqIEBwYXJhbSBkc3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiBXcml0YWJsZVJhc3Rlciwgd2hlcmUgdGhlIHJlc3VsdCBpcyBzdG9yZWQuCiAgICAgICogQHJldHVybiB0aGUgZmlsdGVyZWQgV3JpdGFibGVSYXN0ZXIuCiAgICAgICovCiAgICAgcHVibGljIFdyaXRhYmxlUmFzdGVyIGZpbHRlcihSYXN0ZXIgc3JjLCBXcml0YWJsZVJhc3RlciBkc3QpOwpAQCAtNTcsMTkgKzYxLDIwIEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgYm91bmRzIG9mIHRoZSBmaWx0ZXJlZCBSYXN0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNyYyB0aGUgc291cmNlIFJhc3RlciB0byBiZSBmaWx0ZXJlZC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3JjCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIFJhc3RlciB0byBiZSBmaWx0ZXJlZC4KICAgICAgKiBAcmV0dXJuIHRoZSByZWN0YW5nbGUgYm91bmRzIG9mIHRoZSBmaWx0ZXJlZCBSYXN0ZXIuCiAgICAgICovCiAgICAgcHVibGljIFJlY3RhbmdsZTJEIGdldEJvdW5kczJEKFJhc3RlciBzcmMpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgcG9pbnQgb2YgdGhlIGRlc3RpbmF0aW9uIGltYWdlIHdoaWNoIGNvcnJlc3BvbmRzCi0gICAgICogdG8gdGhlIHNwZWNpZmllZCBwb2ludCBpbiB0aGUgc291cmNlIHJhc3Rlci4KKyAgICAgKiBHZXRzIHRoZSBwb2ludCBvZiB0aGUgZGVzdGluYXRpb24gaW1hZ2Ugd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlCisgICAgICogc3BlY2lmaWVkIHBvaW50IGluIHRoZSBzb3VyY2UgcmFzdGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzcmNQb2ludCB0aGUgcG9pbnQgb2YgdGhlIHNvdXJjZSByYXN0ZXIuCi0gICAgICogQHBhcmFtIGRzdFBvaW50IHRoZSBwb2ludCB3aGVyZSB0aGUgcmVzdWx0IHdpbGwgYmUgc3RvcmVkLgotICAgICAqIAorICAgICAqIEBwYXJhbSBzcmNQb2ludAorICAgICAqICAgICAgICAgICAgdGhlIHBvaW50IG9mIHRoZSBzb3VyY2UgcmFzdGVyLgorICAgICAqIEBwYXJhbSBkc3RQb2ludAorICAgICAqICAgICAgICAgICAgdGhlIHBvaW50IHdoZXJlIHRoZSByZXN1bHQgd2lsbCBiZSBzdG9yZWQuCiAgICAgICogQHJldHVybiB0aGUgZGVzdGluYXRpb24gcG9pbnQuCiAgICAgICovCiAgICAgcHVibGljIFBvaW50MkQgZ2V0UG9pbnQyRChQb2ludDJEIHNyY1BvaW50LCBQb2ludDJEIGRzdFBvaW50KTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9SZW5kZXJlZEltYWdlLmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvUmVuZGVyZWRJbWFnZS5qYXZhCmluZGV4IGRiM2E0YzguLjVlYWZhNjQgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbWFnZS9SZW5kZXJlZEltYWdlLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL1JlbmRlcmVkSW1hZ2UuamF2YQpAQCAtMTgsMzUgKzE4LDM3IEBACiAgKiBAYXV0aG9yIElnb3IgVi4gU3RvbHlhcm92CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5pbWFnZTsKIAogaW1wb3J0IGphdmEuYXd0LlJlY3RhbmdsZTsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCiAvKioKLSAqIFRoZSBSZW5kZXJlZEltYWdlIGludGVyZmFjZSBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgYWxsIG9iamVjdHMgd2hpY2ggCi0gKiBjb250YWlucyBpbWFnZSBkYXRhLiBUaGUgaW1hZ2UgZGF0YSBpcyByZXByZXNlbnRlZCBhcyBhIHNpbmdsZSB0aWxlIG9yIAotICogYW4gYXJyYXkgb2YgdGlsZXMuCisgKiBUaGUgUmVuZGVyZWRJbWFnZSBpbnRlcmZhY2Ugc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IGFsbCBvYmplY3RzIHdoaWNoCisgKiBjb250YWlucyBpbWFnZSBkYXRhLiBUaGUgaW1hZ2UgZGF0YSBpcyByZXByZXNlbnRlZCBhcyBhIHNpbmdsZSB0aWxlIG9yIGFuCisgKiBhcnJheSBvZiB0aWxlcy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgUmVuZGVyZWRJbWFnZSB7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBmcm9tIHRoZSBwcm9wZXJ0eSBzZXQgCi0gICAgICogb2YgdGhpcyBSZW5kZXJlZEltYWdlLgorICAgICAqIEdldHMgdGhlIHByb3BlcnR5IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGZyb20gdGhlIHByb3BlcnR5IHNldCBvZiB0aGlzCisgICAgICogUmVuZGVyZWRJbWFnZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgcHJvcGVydHkncyBuYW1lLgotICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgcHJvcGVydHkncyBuYW1lLgogICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIGNvcnJlc3BvbmRlZCB0byB0aGlzIHByb3BlcnR5J3MgbmFtZS4KICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBuYW1lKTsKIAogICAgIC8qKgotICAgICAqIENvcGllcyB0aGUgcmVnaW9uIG9mIHRoaXMgUmVuZGVyZWRJbWFnZSB0byB0aGUgc3BlY2lmaWVkIAotICAgICAqIFdyaXRhYmxlUmFzdGVyLiBUaGUgYm91bmRzIG9mIHRoZSByZWdpb24gYXJlIHRoZSBib3VuZHMgb2YgdGhlIAotICAgICAqIFdyaXRhYmxlUmFzdGVyLgorICAgICAqIENvcGllcyB0aGUgcmVnaW9uIG9mIHRoaXMgUmVuZGVyZWRJbWFnZSB0byB0aGUgc3BlY2lmaWVkIFdyaXRhYmxlUmFzdGVyLgorICAgICAqIFRoZSBib3VuZHMgb2YgdGhlIHJlZ2lvbiBhcmUgdGhlIGJvdW5kcyBvZiB0aGUgV3JpdGFibGVSYXN0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHJhc3RlciB0aGUgV3JpdGFibGVSYXN0ZXIuCi0gICAgICogCisgICAgICogQHBhcmFtIHJhc3RlcgorICAgICAqICAgICAgICAgICAgdGhlIFdyaXRhYmxlUmFzdGVyLgogICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgV3JpdGFibGVSYXN0ZXIuCiAgICAgICovCiAgICAgcHVibGljIFdyaXRhYmxlUmFzdGVyIGNvcHlEYXRhKFdyaXRhYmxlUmFzdGVyIHJhc3Rlcik7CkBAIC01NCwxOSArNTYsMTkgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBpbWFnZSBkYXRhIG9mIHRoZSBpbWFnZSdzIHJlZ2lvbiBhcyBvbmUgdGlsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVjdCB0aGUgcmVjdGFuZ3VsYXIgcmVnaW9uIG9mIFJlbmRlcmVkSW1hZ2UuCi0gICAgICogCisgICAgICogQHBhcmFtIHJlY3QKKyAgICAgKiAgICAgICAgICAgIHRoZSByZWN0YW5ndWxhciByZWdpb24gb2YgUmVuZGVyZWRJbWFnZS4KICAgICAgKiBAcmV0dXJuIHRoZSBpbWFnZSBkYXRhIG9mIHRoZSBpbWFnZSdzIHJlZ2lvbiBhcyBvbmUgdGlsZS4KICAgICAgKi8KICAgICBwdWJsaWMgUmFzdGVyIGdldERhdGEoUmVjdGFuZ2xlIHJlY3QpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbGwgUmVuZGVyZWRJbWFnZSBvYmplY3RzIHdoaWNoIGFyZSB0aGUgc291cmNlIG9mIHRoaXMKLSAgICAgKiBSZW5kZXJlZEltYWdlIG9iamVjdC4KKyAgICAgKiBHZXRzIGFsbCBSZW5kZXJlZEltYWdlIG9iamVjdHMgd2hpY2ggYXJlIHRoZSBzb3VyY2Ugb2YgdGhpcyBSZW5kZXJlZEltYWdlCisgICAgICogb2JqZWN0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBWZWN0b3Igb2YgUmVuZGVyZWRJbWFnZSBvYmplY3RzIHdoaWNoIGFyZSB0aGUgc291cmNlIAotICAgICAqIG9mIHRoaXMgUmVuZGVyZWRJbWFnZSBvYmplY3Qgb3IgbnVsbCwgaWYgdGhlcmUgaXMgbm8gaW5mb3JtYXRpb24KLSAgICAgKiBhYm91dCB0aGVtLgorICAgICAqIEByZXR1cm4gYSBWZWN0b3Igb2YgUmVuZGVyZWRJbWFnZSBvYmplY3RzIHdoaWNoIGFyZSB0aGUgc291cmNlIG9mIHRoaXMKKyAgICAgKiAgICAgICAgIFJlbmRlcmVkSW1hZ2Ugb2JqZWN0IG9yIG51bGwsIGlmIHRoZXJlIGlzIG5vIGluZm9ybWF0aW9uIGFib3V0CisgICAgICogICAgICAgICB0aGVtLgogICAgICAqLwogICAgIHB1YmxpYyBWZWN0b3I8UmVuZGVyZWRJbWFnZT4gZ2V0U291cmNlcygpOwogCkBAIC04NSwxNCArODcsMTMgQEAKICAgICBwdWJsaWMgU2FtcGxlTW9kZWwgZ2V0U2FtcGxlTW9kZWwoKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRpbGUgY29ycmVzcG9uZGVkIHRvIHRoZSBzcGVjaWZpZWQgaW5kaWNlcyBpbiB0aGUgdGlsZQotICAgICAqIGFycmF5LgorICAgICAqIEdldHMgdGhlIHRpbGUgY29ycmVzcG9uZGVkIHRvIHRoZSBzcGVjaWZpZWQgaW5kaWNlcyBpbiB0aGUgdGlsZSBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGlsZVggdGhlIFggaW5kZXggb2YgdGhlIHRpbGUuICAKLSAgICAgKiBAcGFyYW0gdGlsZVkgdGhlIFkgaW5kZXggb2YgdGhlIHRpbGUuIAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHRpbGUgY29ycmVzcG9uZGVkIHRvIHRoZSBzcGVjaWZpZWQgaW5kaWNlcyBpbiB0aGUgdGlsZQotICAgICAqIGFycmF5LgorICAgICAqIEBwYXJhbSB0aWxlWAorICAgICAqICAgICAgICAgICAgdGhlIFggaW5kZXggb2YgdGhlIHRpbGUuCisgICAgICogQHBhcmFtIHRpbGVZCisgICAgICogICAgICAgICAgICB0aGUgWSBpbmRleCBvZiB0aGUgdGlsZS4KKyAgICAgKiBAcmV0dXJuIHRoZSB0aWxlIGNvcnJlc3BvbmRlZCB0byB0aGUgc3BlY2lmaWVkIGluZGljZXMgaW4gdGhlIHRpbGUgYXJyYXkuCiAgICAgICovCiAgICAgcHVibGljIFJhc3RlciBnZXRUaWxlKGludCB0aWxlWCwgaW50IHRpbGVZKTsKIApAQCAtMTk1LDQgKzE5NiwzIEBACiAgICAgcHVibGljIGludCBnZXRIZWlnaHQoKTsKIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvUmVwbGljYXRlU2NhbGVGaWx0ZXIuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9SZXBsaWNhdGVTY2FsZUZpbHRlci5qYXZhCmluZGV4IDkyOTgxMjUuLjUxYzBmNDkgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbWFnZS9SZXBsaWNhdGVTY2FsZUZpbHRlci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9SZXBsaWNhdGVTY2FsZUZpbHRlci5qYXZhCkBAIC0xOCw1MyArMTgsNjkgQEAKICAqIEBhdXRob3IgSWdvciBWLiBTdG9seWFyb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmltYWdlOwogCiBpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCi0KIC8qKgotICogVGhlIFJlcGxpY2F0ZVNjYWxlRmlsdGVyIGNsYXNzIHNjYWxlcyBhbiBzb3VyY2UgaW1hZ2UgCi0gKiBieSByZXBsaWNhdGluZyByb3dzIGFuZCBjb2x1bW5zIG9mIHBpeGVscyB0byBzY2FsZSB1cCBvciAKLSAqIG9taXR0aW5nIHJvd3MgYW5kIGNvbHVtbnMgb2YgcGl4ZWxzIHRvIHNjYWxlIGRvd24uCisgKiBUaGUgUmVwbGljYXRlU2NhbGVGaWx0ZXIgY2xhc3Mgc2NhbGVzIGFuIHNvdXJjZSBpbWFnZSBieSByZXBsaWNhdGluZyByb3dzIGFuZAorICogY29sdW1ucyBvZiBwaXhlbHMgdG8gc2NhbGUgdXAgb3Igb21pdHRpbmcgcm93cyBhbmQgY29sdW1ucyBvZiBwaXhlbHMgdG8gc2NhbGUKKyAqIGRvd24uCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgUmVwbGljYXRlU2NhbGVGaWx0ZXIgZXh0ZW5kcyBJbWFnZUZpbHRlciB7CiAKLSAgICAvKiogVGhlIHdpZHRoIG9mIGEgc291cmNlIGltYWdlLiAqLworICAgIC8qKgorICAgICAqIFRoZSB3aWR0aCBvZiBhIHNvdXJjZSBpbWFnZS4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IHNyY1dpZHRoOwogCi0gICAgLyoqIFRoZSBoZWlnaHQgb2YgYSBzb3VyY2UgaW1hZ2UuICovCisgICAgLyoqCisgICAgICogVGhlIGhlaWdodCBvZiBhIHNvdXJjZSBpbWFnZS4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IHNyY0hlaWdodDsKIAotICAgIC8qKiBUaGUgd2lkdGggb2YgYSBkZXN0aW5hdGlvbiBpbWFnZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgd2lkdGggb2YgYSBkZXN0aW5hdGlvbiBpbWFnZS4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IGRlc3RXaWR0aDsKIAotICAgIC8qKiBUaGUgaGVpZ2h0IG9mIGEgZGVzdGluYXRpb24gaW1hZ2UuICovCisgICAgLyoqCisgICAgICogVGhlIGhlaWdodCBvZiBhIGRlc3RpbmF0aW9uIGltYWdlLgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgZGVzdEhlaWdodDsKIAotICAgIC8qKiBUaGUgaW50IGFycmF5IG9mIHNvdXJjZSByb3dzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBpbnRlZ2VyIGFycmF5IG9mIHNvdXJjZSByb3dzLgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnRbXSBzcmNyb3dzOwogCi0gICAgLyoqIFRoZSBpbnQgYXJyYXkgb2Ygc291cmNlIGNvbHVtbnMuICovCisgICAgLyoqCisgICAgICogVGhlIGludGVnZXIgYXJyYXkgb2Ygc291cmNlIGNvbHVtbnMuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGludFtdIHNyY2NvbHM7CiAKLSAgICAvKiogCi0gICAgICogQW4gT2JqZWN0IChieXRlIGFycmF5IHdpdGggYSBkZXN0aW5hdGlvbiB3aWR0aCkgcHJvdmlkZXMgCi0gICAgICogYSByb3cgb2YgcGl4ZWwgZGF0YSB0byB0aGUgSW1hZ2VDb25zdW1lci4gCisgICAgLyoqCisgICAgICogQW4gT2JqZWN0IChieXRlIGFycmF5IHdpdGggYSBkZXN0aW5hdGlvbiB3aWR0aCkgcHJvdmlkZXMgYSByb3cgb2YgcGl4ZWwKKyAgICAgKiBkYXRhIHRvIHRoZSBJbWFnZUNvbnN1bWVyLgogICAgICAqLwogICAgIHByb3RlY3RlZCBPYmplY3Qgb3V0cGl4YnVmOwogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IFJlcGxpY2F0ZVNjYWxlRmlsdGVyIHRoYXQgZmlsdGVycyAKLSAgICAgKiB0aGUgaW1hZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHdpZHRoIGFuZCBoZWlnaHQuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IFJlcGxpY2F0ZVNjYWxlRmlsdGVyIHRoYXQgZmlsdGVycyB0aGUgaW1hZ2Ugd2l0aCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgd2lkdGggYW5kIGhlaWdodC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHNjYWxlZCBpbWFnZS4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2Ygc2NhbGVkIGltYWdlLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHNjYWxlZCBpbWFnZS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHNjYWxlZCBpbWFnZS4KICAgICAgKi8KICAgICBwdWJsaWMgUmVwbGljYXRlU2NhbGVGaWx0ZXIoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIGlmKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDApIHsKKyAgICAgICAgaWYgKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDApIHsKICAgICAgICAgICAgIC8vIGF3dC4yMzQ9V2lkdGggb3IgSGVpZ2h0IGVxdWFscyB6ZXJvCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIzNCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CkBAIC03Nyw0MCArOTMsNDAgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKEhhc2h0YWJsZTw/LCA/PiBwcm9wcykgewogICAgICAgICBIYXNodGFibGU8T2JqZWN0LCBPYmplY3Q+IGZwcm9wczsKLSAgICAgICAgaWYocHJvcHMgPT0gbnVsbCkgeworICAgICAgICBpZiAocHJvcHMgPT0gbnVsbCkgewogICAgICAgICAgICAgZnByb3BzID0gbmV3IEhhc2h0YWJsZTxPYmplY3QsIE9iamVjdD4oKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZwcm9wcyA9IChIYXNodGFibGU8T2JqZWN0LCBPYmplY3Q+KSBwcm9wcy5jbG9uZSgpOworICAgICAgICAgICAgZnByb3BzID0gKEhhc2h0YWJsZTxPYmplY3QsIE9iamVjdD4pcHJvcHMuY2xvbmUoKTsKICAgICAgICAgfQogICAgICAgICBTdHJpbmcgcHJvcE5hbWUgPSAiUmVzY2FsZSBGaWx0ZXJzIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmcgcHJvcCA9ICJkZXN0V2lkdGg9IiArIGRlc3RXaWR0aCArICI7ICIgKyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICJkZXN0SGVpZ2h0PSIgKyBkZXN0SGVpZ2h0OyAvLyROT04tTkxTLTEkCisgICAgICAgIFN0cmluZyBwcm9wID0gImRlc3RXaWR0aD0iICsgZGVzdFdpZHRoICsgIjsgIiArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICAgICAgICAgICAgICAgICJkZXN0SGVpZ2h0PSIgKyBkZXN0SGVpZ2h0OyAvLyROT04tTkxTLTEkCiAgICAgICAgIE9iamVjdCBvID0gZnByb3BzLmdldChwcm9wTmFtZSk7Ci0gICAgICAgIGlmKG8gIT0gbnVsbCl7Ci0gICAgICAgICAgICBpZihvIGluc3RhbmNlb2YgU3RyaW5nKXsKKyAgICAgICAgaWYgKG8gIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBTdHJpbmcpIHsKICAgICAgICAgICAgICAgICBwcm9wID0gKFN0cmluZylvICsgIjsgIiArIHByb3A7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIHByb3AgPSAgby50b1N0cmluZygpICsgIjsgIiArIHByb3A7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJvcCA9IG8udG9TdHJpbmcoKSArICI7ICIgKyBwcm9wOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZnByb3BzLnB1dChwcm9wTmFtZSwgcHJvcCk7CiAgICAgICAgIGNvbnN1bWVyLnNldFByb3BlcnRpZXMoZnByb3BzKTsKLSAgICAgfQorICAgIH0KIAogICAgIC8vIHNldFBpeGVscyBtZXRob2RzIHByb2R1Y2UgcGl4ZWxzIGFjY29yZGluZyB0byBKYXZhIEFQSSBTcGFjaWZpY2F0aW9uCiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIAotICAgICAgICAgICAgQ29sb3JNb2RlbCBtb2RlbCwgaW50W10gcGl4ZWxzLCBpbnQgb2ZmLCBpbnQgc2NhbnNpemUpIHsKLSAgICAgICAgCi0gICAgICAgIGlmKHNyY2NvbHMgPT0gbnVsbCkgeworICAgIHB1YmxpYyB2b2lkIHNldFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgQ29sb3JNb2RlbCBtb2RlbCwgaW50W10gcGl4ZWxzLCBpbnQgb2ZmLAorICAgICAgICAgICAgaW50IHNjYW5zaXplKSB7CisKKyAgICAgICAgaWYgKHNyY2NvbHMgPT0gbnVsbCkgewogICAgICAgICAgICAgaW5pdEFycmF5cygpOwogICAgICAgICB9CiAgICAgICAgIGludCBidWZmW107Ci0gICAgICAgIGlmKG91dHBpeGJ1ZiA9PSBudWxsIHx8ICEob3V0cGl4YnVmIGluc3RhbmNlb2YgaW50W10pKXsKKyAgICAgICAgaWYgKG91dHBpeGJ1ZiA9PSBudWxsIHx8ICEob3V0cGl4YnVmIGluc3RhbmNlb2YgaW50W10pKSB7CiAgICAgICAgICAgICBidWZmID0gbmV3IGludFtkZXN0V2lkdGhdOwogICAgICAgICAgICAgb3V0cGl4YnVmID0gYnVmZjsKLSAgICAgICAgfWVsc2V7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBidWZmID0gKGludFtdKW91dHBpeGJ1ZjsKICAgICAgICAgfQogCkBAIC0xMjEsMzIgKzEzNywzMSBAQAogCiAgICAgICAgIGludCBzeCwgc3ksIGR4LCBkeTsKICAgICAgICAgZHkgPSBkc3RZOwotICAgICAgICB3aGlsZSgoZHkgPCBkZXN0SGVpZ2h0KSAmJiAoKHN5ID0gc3Jjcm93c1tkeV0pIDwgeSArIGgpKXsKKyAgICAgICAgd2hpbGUgKChkeSA8IGRlc3RIZWlnaHQpICYmICgoc3kgPSBzcmNyb3dzW2R5XSkgPCB5ICsgaCkpIHsKICAgICAgICAgICAgIGR4ID0gZHN0WDsKICAgICAgICAgICAgIGludCBzcmNPZmYgPSBvZmYgKyAoc3kgLSB5KSAqIHNjYW5zaXplOwotICAgICAgICAgICAgd2hpbGUoKGR4IDwgZGVzdFdpZHRoKSAmJiAoKHN4ID0gc3JjY29sc1tkeF0pIDwgeCArIHcpKXsKKyAgICAgICAgICAgIHdoaWxlICgoZHggPCBkZXN0V2lkdGgpICYmICgoc3ggPSBzcmNjb2xzW2R4XSkgPCB4ICsgdykpIHsKICAgICAgICAgICAgICAgICBidWZmW2R4XSA9IHBpeGVsc1tzcmNPZmYgKyAoc3ggLSB4KV07CiAgICAgICAgICAgICAgICAgZHgrKzsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgY29uc3VtZXIuc2V0UGl4ZWxzKGRzdFgsIGR5LCBkeCAtIGRzdFgsIDEsIG1vZGVsLCBidWZmLCAKLSAgICAgICAgICAgICAgICAgICAgZHN0WCwgZGVzdFdpZHRoKTsKKyAgICAgICAgICAgIGNvbnN1bWVyLnNldFBpeGVscyhkc3RYLCBkeSwgZHggLSBkc3RYLCAxLCBtb2RlbCwgYnVmZiwgZHN0WCwgZGVzdFdpZHRoKTsKICAgICAgICAgICAgIGR5Kys7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIAotICAgICAgICAgICAgQ29sb3JNb2RlbCBtb2RlbCwgYnl0ZVtdIHBpeGVscywgaW50IG9mZiwgaW50IHNjYW5zaXplKSB7Ci0gICAgICAgIAotICAgICAgICBpZihzcmNjb2xzID09IG51bGwpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIENvbG9yTW9kZWwgbW9kZWwsIGJ5dGVbXSBwaXhlbHMsIGludCBvZmYsCisgICAgICAgICAgICBpbnQgc2NhbnNpemUpIHsKKworICAgICAgICBpZiAoc3JjY29scyA9PSBudWxsKSB7CiAgICAgICAgICAgICBpbml0QXJyYXlzKCk7CiAgICAgICAgIH0KICAgICAgICAgYnl0ZSBidWZmW107Ci0gICAgICAgIGlmKG91dHBpeGJ1ZiA9PSBudWxsIHx8ICEob3V0cGl4YnVmIGluc3RhbmNlb2YgYnl0ZVtdKSl7CisgICAgICAgIGlmIChvdXRwaXhidWYgPT0gbnVsbCB8fCAhKG91dHBpeGJ1ZiBpbnN0YW5jZW9mIGJ5dGVbXSkpIHsKICAgICAgICAgICAgIGJ1ZmYgPSBuZXcgYnl0ZVtkZXN0V2lkdGhdOwogICAgICAgICAgICAgb3V0cGl4YnVmID0gYnVmZjsKLSAgICAgICAgfWVsc2V7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBidWZmID0gKGJ5dGVbXSlvdXRwaXhidWY7CiAgICAgICAgIH0KIApAQCAtMTU3LDE2ICsxNzIsMTUgQEAKIAogICAgICAgICBpbnQgc3gsIHN5LCBkeCwgZHk7CiAgICAgICAgIGR5ID0gZHN0WTsKLSAgICAgICAgd2hpbGUoKGR5IDwgZGVzdEhlaWdodCkgJiYgKChzeSA9IHNyY3Jvd3NbZHldKSA8IHkgKyBoKSl7CisgICAgICAgIHdoaWxlICgoZHkgPCBkZXN0SGVpZ2h0KSAmJiAoKHN5ID0gc3Jjcm93c1tkeV0pIDwgeSArIGgpKSB7CiAgICAgICAgICAgICBkeCA9IGRzdFg7CiAgICAgICAgICAgICBpbnQgc3JjT2ZmID0gb2ZmICsgKHN5IC0geSkgKiBzY2Fuc2l6ZTsKLSAgICAgICAgICAgIHdoaWxlKChkeCA8IGRlc3RXaWR0aCkgJiYgKChzeCA9IHNyY2NvbHNbZHhdKSA8IHggKyB3KSl7CisgICAgICAgICAgICB3aGlsZSAoKGR4IDwgZGVzdFdpZHRoKSAmJiAoKHN4ID0gc3JjY29sc1tkeF0pIDwgeCArIHcpKSB7CiAgICAgICAgICAgICAgICAgYnVmZltkeF0gPSBwaXhlbHNbc3JjT2ZmICsgKHN4IC0geCldOwogICAgICAgICAgICAgICAgIGR4Kys7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGNvbnN1bWVyLnNldFBpeGVscyhkc3RYLCBkeSwgZHggLSBkc3RYLCAxLCBtb2RlbCwgYnVmZiwgCi0gICAgICAgICAgICAgICAgICAgIGRzdFgsIGRlc3RXaWR0aCk7CisgICAgICAgICAgICBjb25zdW1lci5zZXRQaXhlbHMoZHN0WCwgZHksIGR4IC0gZHN0WCwgMSwgbW9kZWwsIGJ1ZmYsIGRzdFgsIGRlc3RXaWR0aCk7CiAgICAgICAgICAgICBkeSsrOwogICAgICAgICB9CiAgICAgfQpAQCAtMTc2LDEyICsxOTAsMTIgQEAKICAgICAgICAgc3JjV2lkdGggPSB3OwogICAgICAgICBzcmNIZWlnaHQgPSBoOwogCi0gICAgICAgIGlmKGRlc3RXaWR0aCA8IDAgJiYgZGVzdEhlaWdodCA8IDApeworICAgICAgICBpZiAoZGVzdFdpZHRoIDwgMCAmJiBkZXN0SGVpZ2h0IDwgMCkgewogICAgICAgICAgICAgZGVzdFdpZHRoID0gc3JjV2lkdGg7CiAgICAgICAgICAgICBkZXN0SGVpZ2h0ID0gc3JjSGVpZ2h0OwotICAgICAgICB9ZWxzZSBpZihkZXN0V2lkdGggPCAwKXsKKyAgICAgICAgfSBlbHNlIGlmIChkZXN0V2lkdGggPCAwKSB7CiAgICAgICAgICAgICBkZXN0V2lkdGggPSBkZXN0SGVpZ2h0ICogc3JjV2lkdGggLyBzcmNIZWlnaHQ7Ci0gICAgICAgIH1lbHNlIGlmKGRlc3RIZWlnaHQgPCAwKXsKKyAgICAgICAgfSBlbHNlIGlmIChkZXN0SGVpZ2h0IDwgMCkgewogICAgICAgICAgICAgZGVzdEhlaWdodCA9IGRlc3RXaWR0aCAqIHNyY0hlaWdodCAvIHNyY1dpZHRoOwogICAgICAgICB9CiAgICAgICAgIGNvbnN1bWVyLnNldERpbWVuc2lvbnMoZGVzdFdpZHRoLCBkZXN0SGVpZ2h0KTsKQEAgLTE5MCwyNCArMjA0LDIyIEBACiAgICAgLyoqCiAgICAgICogSW5pdGlhbGl6YXRpb24gb2Ygc3JjY29scyBhbmQgc3Jjcm93cyBhcnJheXMuCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRBcnJheXMoKXsKKyAgICBwcml2YXRlIHZvaWQgaW5pdEFycmF5cygpIHsKICAgICAgICAgaWYgKChkZXN0V2lkdGggPCAwKSB8fCAoZGVzdEhlaWdodCA8IDApKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHNyY2NvbHMgPSBuZXcgaW50W2Rlc3RXaWR0aF07CiAgICAgICAgIGludCBjYSA9IHNyY1dpZHRoID4+PiAxOwotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgZGVzdFdpZHRoOyBpKyspeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc3RXaWR0aDsgaSsrKSB7CiAgICAgICAgICAgICBzcmNjb2xzW2ldID0gKGkgKiBzcmNXaWR0aCArIGNhKSAvIGRlc3RXaWR0aDsKICAgICAgICAgfQogCiAgICAgICAgIHNyY3Jvd3MgPSBuZXcgaW50W2Rlc3RIZWlnaHRdOwogICAgICAgICBpbnQgcmEgPSBzcmNIZWlnaHQgPj4+IDE7Ci0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBkZXN0SGVpZ2h0OyBpKyspeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc3RIZWlnaHQ7IGkrKykgewogICAgICAgICAgICAgc3Jjcm93c1tpXSA9IChpICogc3JjSGVpZ2h0ICsgcmEpIC8gZGVzdEhlaWdodDsKICAgICAgICAgfQogICAgIH0KIAogfQotCi0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9SZXNjYWxlT3AuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9SZXNjYWxlT3AuamF2YQppbmRleCAwZTk2MDMxLi5kN2UyYmQ3IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvUmVzY2FsZU9wLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL1Jlc2NhbGVPcC5qYXZhCkBAIC0zMiwzMyArMzIsNDMgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBUaGUgQ2xhc3MgUmVzY2FsZU9wIHBlcmZvcm1zIHJlc2NhbGluZyBvZiB0aGUgc291cmNlIGltYWdlIGRhdGEKLSAqIGJ5IG11bHRpcGx5aW5nIHRoZSBwaXhlbCB2YWx1ZXMgd2l0aCBhIHNjYWxlIGZhY3RvciAKLSAqIGFuZCB0aGVuIGFkZGluZyBhbiBvZmZzZXQuCisgKiBUaGUgQ2xhc3MgUmVzY2FsZU9wIHBlcmZvcm1zIHJlc2NhbGluZyBvZiB0aGUgc291cmNlIGltYWdlIGRhdGEgYnkKKyAqIG11bHRpcGx5aW5nIHRoZSBwaXhlbCB2YWx1ZXMgd2l0aCBhIHNjYWxlIGZhY3RvciBhbmQgdGhlbiBhZGRpbmcgYW4gb2Zmc2V0LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFJlc2NhbGVPcCBpbXBsZW1lbnRzIEJ1ZmZlcmVkSW1hZ2VPcCwgUmFzdGVyT3AgewotICAgIAotICAgIC8qKiBUaGUgc2NhbGUgZmFjdG9ycy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBzY2FsZSBmYWN0b3JzLgorICAgICAqLwogICAgIHByaXZhdGUgZmxvYXQgc2NhbGVGYWN0b3JzW107Ci0gICAgCi0gICAgLyoqIFRoZSBvZmZzZXRzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIG9mZnNldHMuCisgICAgICovCiAgICAgcHJpdmF0ZSBmbG9hdCBvZmZzZXRzW107Ci0gICAgCi0gICAgLyoqIFRoZSBoaW50cy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBoaW50cy4KKyAgICAgKi8KICAgICBwcml2YXRlIFJlbmRlcmluZ0hpbnRzIGhpbnRzOwogCiAgICAgc3RhdGljIHsKICAgICAgICAgLy8gVE9ETwotICAgICAgICAvL1N5c3RlbS5sb2FkTGlicmFyeSgiaW1hZ2VvcHMiKTsKKyAgICAgICAgLy8gU3lzdGVtLmxvYWRMaWJyYXJ5KCJpbWFnZW9wcyIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBSZXNjYWxlT3Agb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCAKLSAgICAgKiBzY2FsZSBmYWN0b3JzIGFuZCBvZmZzZXRzLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBSZXNjYWxlT3Agb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBzY2FsZSBmYWN0b3JzIGFuZAorICAgICAqIG9mZnNldHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNjYWxlRmFjdG9ycyB0aGUgYXJyYXkgb2Ygc2NhbGUgZmFjdG9yIHZhbHVlcy4KLSAgICAgKiBAcGFyYW0gb2Zmc2V0cyB0aGUgYXJyYXkgb2Ygb2Zmc2V0IHZhbHVlcy4KLSAgICAgKiBAcGFyYW0gaGludHMgdGhlIFJlbmRlcmluZ0hpbnRzIG9yIG51bGwuCisgICAgICogQHBhcmFtIHNjYWxlRmFjdG9ycworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIHNjYWxlIGZhY3RvciB2YWx1ZXMuCisgICAgICogQHBhcmFtIG9mZnNldHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBvZmZzZXQgdmFsdWVzLgorICAgICAqIEBwYXJhbSBoaW50cworICAgICAqICAgICAgICAgICAgdGhlIFJlbmRlcmluZ0hpbnRzIG9yIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIFJlc2NhbGVPcChmbG9hdFtdIHNjYWxlRmFjdG9ycywgZmxvYXRbXSBvZmZzZXRzLCBSZW5kZXJpbmdIaW50cyBoaW50cykgewogICAgICAgICBpbnQgbnVtRmFjdG9ycyA9IE1hdGgubWluKHNjYWxlRmFjdG9ycy5sZW5ndGgsIG9mZnNldHMubGVuZ3RoKTsKQEAgLTczLDEyICs4MywxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBSZXNjYWxlT3Agb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCAKLSAgICAgKiBzY2FsZSBmYWN0b3IgYW5kIG9mZnNldC4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgUmVzY2FsZU9wIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgc2NhbGUgZmFjdG9yIGFuZAorICAgICAqIG9mZnNldC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2NhbGVGYWN0b3IgdGhlIHNjYWxlIGZhY3Rvci4KLSAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQuCi0gICAgICogQHBhcmFtIGhpbnRzIHRoZSBSZW5kZXJpbmdIaW50cyBvciBudWxsLgorICAgICAqIEBwYXJhbSBzY2FsZUZhY3RvcgorICAgICAqICAgICAgICAgICAgdGhlIHNjYWxlIGZhY3Rvci4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0LgorICAgICAqIEBwYXJhbSBoaW50cworICAgICAqICAgICAgICAgICAgdGhlIFJlbmRlcmluZ0hpbnRzIG9yIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIFJlc2NhbGVPcChmbG9hdCBzY2FsZUZhY3RvciwgZmxvYXQgb2Zmc2V0LCBSZW5kZXJpbmdIaW50cyBoaW50cykgewogICAgICAgICBzY2FsZUZhY3RvcnMgPSBuZXcgZmxvYXRbMV07CkBAIC0xMDYsOSArMTE5LDggQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBzY2FsZSBmYWN0b3JzIG9mIHRoaXMgUmVzY2FsZU9wLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzY2FsZUZhY3RvcnMgdGhlIGRlc2lyZWQgc2NhbGUgZmFjdG9ycyBhcnJheSB3aWxsIGJlIGNvcGllZCAKLSAgICAgKiB0byB0aGlzIGFycmF5LgotICAgICAqIAorICAgICAqIEBwYXJhbSBzY2FsZUZhY3RvcnMKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXNpcmVkIHNjYWxlIGZhY3RvcnMgYXJyYXkgd2lsbCBiZSBjb3BpZWQgdG8gdGhpcyBhcnJheS4KICAgICAgKiBAcmV0dXJuIHRoZSBzY2FsZSBmYWN0b3JzIGFycmF5LgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBmbG9hdFtdIGdldFNjYWxlRmFjdG9ycyhmbG9hdFtdIHNjYWxlRmFjdG9ycykgewpAQCAtMTI0LDggKzEzNiw4IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgb2Zmc2V0cyBhcnJheSBvZiB0aGlzIFJlc2NhbGVPcC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2Zmc2V0cyB0aGUgZGVzaXJlZCBvZmZzZXRzIGFycmF5IHdpbGwgYmUgY29waWVkIHRvIHRoaXMgYXJyYXkuCi0gICAgICogCisgICAgICogQHBhcmFtIG9mZnNldHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXNpcmVkIG9mZnNldHMgYXJyYXkgd2lsbCBiZSBjb3BpZWQgdG8gdGhpcyBhcnJheS4KICAgICAgKiBAcmV0dXJuIHRoZSBvZmZzZXRzIGFycmF5IG9mIHRoaXMgUmVzY2FsZU9wLgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBmbG9hdFtdIGdldE9mZnNldHMoZmxvYXRbXSBvZmZzZXRzKSB7CkBAIC0xNjgsMTcgKzE4MCwxMSBAQAogICAgICAgICAgICAgZHN0Q00gPSBDb2xvck1vZGVsLmdldFJHQmRlZmF1bHQoKTsKICAgICAgICAgfQogCi0gICAgICAgIFdyaXRhYmxlUmFzdGVyIHIgPQotICAgICAgICAgICAgICAgIGRzdENNLmlzQ29tcGF0aWJsZVNhbXBsZU1vZGVsKHNyYy5nZXRTYW1wbGVNb2RlbCgpKSA/Ci0gICAgICAgICAgICAgICAgc3JjLmdldFJhc3RlcigpLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3RlcihzcmMuZ2V0V2lkdGgoKSwgc3JjLmdldEhlaWdodCgpKSA6Ci0gICAgICAgICAgICAgICAgZHN0Q00uY3JlYXRlQ29tcGF0aWJsZVdyaXRhYmxlUmFzdGVyKHNyYy5nZXRXaWR0aCgpLCBzcmMuZ2V0SGVpZ2h0KCkpOworICAgICAgICBXcml0YWJsZVJhc3RlciByID0gZHN0Q00uaXNDb21wYXRpYmxlU2FtcGxlTW9kZWwoc3JjLmdldFNhbXBsZU1vZGVsKCkpID8gc3JjLmdldFJhc3RlcigpCisgICAgICAgICAgICAgICAgLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3RlcihzcmMuZ2V0V2lkdGgoKSwgc3JjLmdldEhlaWdodCgpKSA6IGRzdENNCisgICAgICAgICAgICAgICAgLmNyZWF0ZUNvbXBhdGlibGVXcml0YWJsZVJhc3RlcihzcmMuZ2V0V2lkdGgoKSwgc3JjLmdldEhlaWdodCgpKTsKIAotICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlcmVkSW1hZ2UoCi0gICAgICAgICAgICAgICAgZHN0Q00sCi0gICAgICAgICAgICAgICAgciwKLSAgICAgICAgICAgICAgICBkc3RDTS5pc0FscGhhUHJlbXVsdGlwbGllZCgpLAotICAgICAgICAgICAgICAgIG51bGwKLSAgICAgICAgKTsKKyAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJlZEltYWdlKGRzdENNLCByLCBkc3RDTS5pc0FscGhhUHJlbXVsdGlwbGllZCgpLCBudWxsKTsKICAgICB9CiAKICAgICBwdWJsaWMgZmluYWwgV3JpdGFibGVSYXN0ZXIgZmlsdGVyKFJhc3RlciBzcmMsIFdyaXRhYmxlUmFzdGVyIGRzdCkgewpAQCAtMTg2LDI2ICsxOTIsMjUgQEAKICAgICAgICAgICAgIGRzdCA9IGNyZWF0ZUNvbXBhdGlibGVEZXN0UmFzdGVyKHNyYyk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoc3JjLmdldE51bUJhbmRzKCkgIT0gZHN0LmdldE51bUJhbmRzKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBhd3QuMjFEPU51bWJlciBvZiBzcmMgYmFuZHMgKHswfSkgZG9lcyBub3QgbWF0Y2ggbnVtYmVyIG9mIGRzdCBiYW5kcyAoezF9KQorICAgICAgICAgICAgICAgIC8vIGF3dC4yMUQ9TnVtYmVyIG9mIHNyYyBiYW5kcyAoezB9KSBkb2VzIG5vdCBtYXRjaCBudW1iZXIgb2YKKyAgICAgICAgICAgICAgICAvLyBkc3QgYmFuZHMgKHsxfSkKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxRCIsIC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy5nZXROdW1CYW5kcygpLCBkc3QuZ2V0TnVtQmFuZHMoKSkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgIHRoaXMuc2NhbGVGYWN0b3JzLmxlbmd0aCAhPSAxICYmCi0gICAgICAgICAgICAgICAgdGhpcy5zY2FsZUZhY3RvcnMubGVuZ3RoICE9IHNyYy5nZXROdW1CYW5kcygpCi0gICAgICAgICkgewotICAgICAgICAgICAgLy8gYXd0LjIxRT1OdW1iZXIgb2Ygc2NhbGluZyBjb25zdGFudHMgaXMgbm90IGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgYmFuZHMKKyAgICAgICAgaWYgKHRoaXMuc2NhbGVGYWN0b3JzLmxlbmd0aCAhPSAxICYmIHRoaXMuc2NhbGVGYWN0b3JzLmxlbmd0aCAhPSBzcmMuZ2V0TnVtQmFuZHMoKSkgeworICAgICAgICAgICAgLy8gYXd0LjIxRT1OdW1iZXIgb2Ygc2NhbGluZyBjb25zdGFudHMgaXMgbm90IGVxdWFsIHRvIHRoZSBudW1iZXIgb2YKKyAgICAgICAgICAgIC8vIGJhbmRzCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxRSIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKICAgICAgICAgLy8gVE9ETwotICAgICAgICAvL2lmIChpcHBGaWx0ZXIoc3JjLCBkc3QsIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9DVVNUT00sIGZhbHNlKSAhPSAwKQotICAgICAgICAgICAgaWYgKHNsb3dGaWx0ZXIoc3JjLCBkc3QsIGZhbHNlKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gYXd0LjIxRj1VbmFibGUgdG8gdHJhbnNmb3JtIHNvdXJjZQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbWFnaW5nT3BFeGNlcHRpb24gKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxRiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQorICAgICAgICAvLyBpZiAoaXBwRmlsdGVyKHNyYywgZHN0LCBCdWZmZXJlZEltYWdlLlRZUEVfQ1VTVE9NLCBmYWxzZSkgIT0gMCkKKyAgICAgICAgaWYgKHNsb3dGaWx0ZXIoc3JjLCBkc3QsIGZhbHNlKSAhPSAwKSB7CisgICAgICAgICAgICAvLyBhd3QuMjFGPVVuYWJsZSB0byB0cmFuc2Zvcm0gc291cmNlCisgICAgICAgICAgICB0aHJvdyBuZXcgSW1hZ2luZ09wRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxRiIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIGRzdDsKICAgICB9CkBAIC0yMTMsMTEgKzIxOCwxMyBAQAogICAgIC8qKgogICAgICAqIFNsb3cgZmlsdGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzcmMgdGhlIHNyYwotICAgICAqIEBwYXJhbSBkc3QgdGhlIGRzdAotICAgICAqIEBwYXJhbSBza2lwQWxwaGEgdGhlIHNraXAgYWxwaGEKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnQKKyAgICAgKiBAcGFyYW0gc3JjCisgICAgICogICAgICAgICAgICB0aGUgc3JjLgorICAgICAqIEBwYXJhbSBkc3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBkc3QuCisgICAgICogQHBhcmFtIHNraXBBbHBoYQorICAgICAqICAgICAgICAgICAgdGhlIHNraXAgYWxwaGEuCisgICAgICogQHJldHVybiB0aGUgaW50LgogICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgaW50IHNsb3dGaWx0ZXIoUmFzdGVyIHNyYywgV3JpdGFibGVSYXN0ZXIgZHN0LCBib29sZWFuIHNraXBBbHBoYSkgewogICAgICAgICBTYW1wbGVNb2RlbCBzbSA9IHNyYy5nZXRTYW1wbGVNb2RlbCgpOwpAQCAtMjM1LDcgKzI0Miw3IEBACiAgICAgICAgIGludFtdIG1hc2tzID0gbmV3IGludFtudW1CYW5kc107CiAgICAgICAgIGludFtdIHNhbXBsZVNpemVzID0gc20uZ2V0U2FtcGxlU2l6ZSgpOwogCi0gICAgICAgIGZvciAoaW50IGk9MDsgaSA8IG51bUJhbmRzOyBpKyspeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKICAgICAgICAgICAgIG1heFZhbHVlc1tpXSA9ICgxIDw8IHNhbXBsZVNpemVzW2ldKSAtIDE7CiAgICAgICAgICAgICBtYXNrc1tpXSA9IH4obWF4VmFsdWVzW2ldKTsKICAgICAgICAgfQpAQCAtMjQ3LDggKzI1NCw4IEBACiAgICAgICAgIC8vIEN5Y2xlIG92ZXIgcGl4ZWxzIHRvIGJlIGNhbGN1bGF0ZWQKICAgICAgICAgaWYgKHNraXBBbHBoYSkgeyAvLyBBbHdheXMgc3VwcG9zZSB0aGF0IGFscGhhIGNoYW5uZWwgaXMgdGhlIGxhc3QgYmFuZAogICAgICAgICAgICAgaWYgKHNjYWxlRmFjdG9ycy5sZW5ndGggPiAxKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbHMubGVuZ3RoOyApewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBiYW5kSWR4ID0gMDsgYmFuZElkeCA8IG51bUJhbmRzLTE7IGJhbmRJZHgrKywgaSsrKXsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVscy5sZW5ndGg7KSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGJhbmRJZHggPSAwOyBiYW5kSWR4IDwgbnVtQmFuZHMgLSAxOyBiYW5kSWR4KyssIGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzW2ldID0gcGl4ZWxzW2ldICogc2NhbGVGYWN0b3JzW2JhbmRJZHhdICsgb2Zmc2V0c1tiYW5kSWR4XTsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBvdmVyZmxvdyBub3cKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKGludClwaXhlbHNbaV0gJiBtYXNrc1tiYW5kSWR4XSkgIT0gMCkgewpAQCAtMjYzLDggKzI3MCw4IEBACiAgICAgICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxzLmxlbmd0aDsgKXsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgYmFuZElkeCA9IDA7IGJhbmRJZHggPCBudW1CYW5kcy0xOyBiYW5kSWR4KyssIGkrKyl7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbHMubGVuZ3RoOykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBiYW5kSWR4ID0gMDsgYmFuZElkeCA8IG51bUJhbmRzIC0gMTsgYmFuZElkeCsrLCBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1tpXSA9IHBpeGVsc1tpXSAqIHNjYWxlRmFjdG9yc1swXSArIG9mZnNldHNbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3Igb3ZlcmZsb3cgbm93CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKChpbnQpcGl4ZWxzW2ldICYgbWFza3NbYmFuZElkeF0pICE9IDApIHsKQEAgLTI4MSw4ICsyODgsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKHNjYWxlRmFjdG9ycy5sZW5ndGggPiAxKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbHMubGVuZ3RoOyApewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBiYW5kSWR4ID0gMDsgYmFuZElkeCA8IG51bUJhbmRzOyBiYW5kSWR4KyssIGkrKyl7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbHMubGVuZ3RoOykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBiYW5kSWR4ID0gMDsgYmFuZElkeCA8IG51bUJhbmRzOyBiYW5kSWR4KyssIGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzW2ldID0gcGl4ZWxzW2ldICogc2NhbGVGYWN0b3JzW2JhbmRJZHhdICsgb2Zmc2V0c1tiYW5kSWR4XTsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBvdmVyZmxvdyBub3cKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKGludClwaXhlbHNbaV0gJiBtYXNrc1tiYW5kSWR4XSkgIT0gMCkgewpAQCAtMjk1LDggKzMwMiw4IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxzLmxlbmd0aDsgKXsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgYmFuZElkeCA9IDA7IGJhbmRJZHggPCBudW1CYW5kczsgYmFuZElkeCsrLCBpKyspeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxzLmxlbmd0aDspIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgYmFuZElkeCA9IDA7IGJhbmRJZHggPCBudW1CYW5kczsgYmFuZElkeCsrLCBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1tpXSA9IHBpeGVsc1tpXSAqIHNjYWxlRmFjdG9yc1swXSArIG9mZnNldHNbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3Igb3ZlcmZsb3cgbm93CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKChpbnQpcGl4ZWxzW2ldICYgbWFza3NbYmFuZElkeF0pICE9IDApIHsKQEAgLTMyOCwxOCArMzM1LDIwIEBACiAgICAgICAgIGludCBuQ29tcG9uZW50cyA9IHNyY0NNLmdldE51bUNvbXBvbmVudHMoKTsKICAgICAgICAgYm9vbGVhbiBza2lwQWxwaGE7CiAgICAgICAgIGlmIChzcmNDTS5oYXNBbHBoYSgpKSB7Ci0gICAgICAgICAgICBpZiAoc2NhbGVGYWN0b3JzLmxlbmd0aCA9PSAxIHx8IHNjYWxlRmFjdG9ycy5sZW5ndGggPT0gbkNvbXBvbmVudHMtMSkgeworICAgICAgICAgICAgaWYgKHNjYWxlRmFjdG9ycy5sZW5ndGggPT0gMSB8fCBzY2FsZUZhY3RvcnMubGVuZ3RoID09IG5Db21wb25lbnRzIC0gMSkgewogICAgICAgICAgICAgICAgIHNraXBBbHBoYSA9IHRydWU7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHNjYWxlRmFjdG9ycy5sZW5ndGggPT0gbkNvbXBvbmVudHMpIHsKICAgICAgICAgICAgICAgICBza2lwQWxwaGEgPSBmYWxzZTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gYXd0LjIxRT1OdW1iZXIgb2Ygc2NhbGluZyBjb25zdGFudHMgaXMgbm90IGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgYmFuZHMKKyAgICAgICAgICAgICAgICAvLyBhd3QuMjFFPU51bWJlciBvZiBzY2FsaW5nIGNvbnN0YW50cyBpcyBub3QgZXF1YWwgdG8gdGhlCisgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGJhbmRzCiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMUUiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChzY2FsZUZhY3RvcnMubGVuZ3RoID09IDEgfHwgc2NhbGVGYWN0b3JzLmxlbmd0aCA9PSBuQ29tcG9uZW50cykgewogICAgICAgICAgICAgc2tpcEFscGhhID0gZmFsc2U7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBhd3QuMjFFPU51bWJlciBvZiBzY2FsaW5nIGNvbnN0YW50cyBpcyBub3QgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBiYW5kcworICAgICAgICAgICAgLy8gYXd0LjIxRT1OdW1iZXIgb2Ygc2NhbGluZyBjb25zdGFudHMgaXMgbm90IGVxdWFsIHRvIHRoZSBudW1iZXIgb2YKKyAgICAgICAgICAgIC8vIGJhbmRzCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIxRSIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKQEAgLTM0OCwyNCArMzU3LDIyIEBACiAgICAgICAgICAgICBmaW5hbERzdCA9IGRzdDsKICAgICAgICAgICAgIGRzdCA9IGNyZWF0ZUNvbXBhdGlibGVEZXN0SW1hZ2Uoc3JjLCBzcmNDTSk7CiAgICAgICAgIH0gZWxzZSBpZiAoIXNyY0NNLmVxdWFscyhkc3QuZ2V0Q29sb3JNb2RlbCgpKSkgewotICAgICAgICAgICAgLy8gVHJlYXQgQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9SR0IgYW5kIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfQVJHQiBhcyBzYW1lCi0gICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAgICEoKHNyYy5nZXRUeXBlKCkgPT0gQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9SR0IgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjLmdldFR5cGUoKSA9PSBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0IpICYmCi0gICAgICAgICAgICAgICAgICAgICAgKGRzdC5nZXRUeXBlKCkgPT0gQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9SR0IgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgZHN0LmdldFR5cGUoKSA9PSBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0IpKQotICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAvLyBUcmVhdCBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX1JHQiBhbmQgQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9BUkdCCisgICAgICAgICAgICAvLyBhcyBzYW1lCisgICAgICAgICAgICBpZiAoISgoc3JjLmdldFR5cGUoKSA9PSBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX1JHQiB8fCBzcmMuZ2V0VHlwZSgpID09IEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfQVJHQikgJiYgKGRzdAorICAgICAgICAgICAgICAgICAgICAuZ2V0VHlwZSgpID09IEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfUkdCIHx8IGRzdC5nZXRUeXBlKCkgPT0gQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9BUkdCKSkpIHsKICAgICAgICAgICAgICAgICBmaW5hbERzdCA9IGRzdDsKICAgICAgICAgICAgICAgICBkc3QgPSBjcmVhdGVDb21wYXRpYmxlRGVzdEltYWdlKHNyYywgc3JjQ00pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLy8gVE9ETwotICAgICAgICAvL2lmIChpcHBGaWx0ZXIoc3JjLmdldFJhc3RlcigpLCBkc3QuZ2V0UmFzdGVyKCksIHNyYy5nZXRUeXBlKCksIHNraXBBbHBoYSkgIT0gMCkKLSAgICAgICAgICAgIGlmIChzbG93RmlsdGVyKHNyYy5nZXRSYXN0ZXIoKSwgZHN0LmdldFJhc3RlcigpLCBza2lwQWxwaGEpICE9IDApIHsKLSAgICAgICAgICAgICAgICAvLyBhd3QuMjFGPVVuYWJsZSB0byB0cmFuc2Zvcm0gc291cmNlCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEltYWdpbmdPcEV4Y2VwdGlvbiAoTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjFGIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9CisgICAgICAgIC8vIGlmIChpcHBGaWx0ZXIoc3JjLmdldFJhc3RlcigpLCBkc3QuZ2V0UmFzdGVyKCksIHNyYy5nZXRUeXBlKCksCisgICAgICAgIC8vIHNraXBBbHBoYSkgIT0gMCkKKyAgICAgICAgaWYgKHNsb3dGaWx0ZXIoc3JjLmdldFJhc3RlcigpLCBkc3QuZ2V0UmFzdGVyKCksIHNraXBBbHBoYSkgIT0gMCkgeworICAgICAgICAgICAgLy8gYXd0LjIxRj1VbmFibGUgdG8gdHJhbnNmb3JtIHNvdXJjZQorICAgICAgICAgICAgdGhyb3cgbmV3IEltYWdpbmdPcEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMUYiKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgfQogCiAgICAgICAgIGlmIChmaW5hbERzdCAhPSBudWxsKSB7CiAgICAgICAgICAgICBHcmFwaGljczJEIGcgPSBmaW5hbERzdC5jcmVhdGVHcmFwaGljcygpOwpAQCAtMzc4LDIxICszODUsMjYgQEAKICAgICAgICAgcmV0dXJuIGZpbmFsRHN0OwogICAgIH0KIAotICAgIC8vIERvbid0IGZvcmdldCB0byBwYXNzIGFsbG9jYXRlZCBhcnJheXMgZm9yIGxldmVscyBhbmQgdmFsdWVzLCBzaXplIHNob3VsZCBiZSBudW1CYW5kcyo0CisgICAgLy8gRG9uJ3QgZm9yZ2V0IHRvIHBhc3MgYWxsb2NhdGVkIGFycmF5cyBmb3IgbGV2ZWxzIGFuZCB2YWx1ZXMsIHNpemUgc2hvdWxkCisgICAgLy8gYmUgbnVtQmFuZHMqNAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgdGhlIGxldmVscy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc20gdGhlIHNtCi0gICAgICogQHBhcmFtIG51bUJhbmRzIHRoZSBudW0gYmFuZHMKLSAgICAgKiBAcGFyYW0gc2tpcEFscGhhIHRoZSBza2lwIGFscGhhCi0gICAgICogQHBhcmFtIGxldmVscyB0aGUgbGV2ZWxzCi0gICAgICogQHBhcmFtIHZhbHVlcyB0aGUgdmFsdWVzCi0gICAgICogQHBhcmFtIGNoYW5uZWxzT3JkZXIgdGhlIGNoYW5uZWxzIG9yZGVyCisgICAgICogQHBhcmFtIHNtCisgICAgICogICAgICAgICAgICB0aGUgc20uCisgICAgICogQHBhcmFtIG51bUJhbmRzCisgICAgICogICAgICAgICAgICB0aGUgbnVtIGJhbmRzLgorICAgICAqIEBwYXJhbSBza2lwQWxwaGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBza2lwIGFscGhhLgorICAgICAqIEBwYXJhbSBsZXZlbHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZXZlbHMuCisgICAgICogQHBhcmFtIHZhbHVlcworICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlcy4KKyAgICAgKiBAcGFyYW0gY2hhbm5lbHNPcmRlcgorICAgICAqICAgICAgICAgICAgdGhlIGNoYW5uZWxzIG9yZGVyLgogICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgdm9pZCBjcmVhdGVMZXZlbHMoCi0gICAgICAgICAgICBTYW1wbGVNb2RlbCBzbSwgaW50IG51bUJhbmRzLCBib29sZWFuIHNraXBBbHBoYSwKLSAgICAgICAgICAgIGludCBsZXZlbHNbXSwgaW50IHZhbHVlc1tdLCBpbnQgY2hhbm5lbHNPcmRlcltdCi0gICAgKSB7CisgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGNyZWF0ZUxldmVscyhTYW1wbGVNb2RlbCBzbSwgaW50IG51bUJhbmRzLCBib29sZWFuIHNraXBBbHBoYSwgaW50IGxldmVsc1tdLAorICAgICAgICAgICAgaW50IHZhbHVlc1tdLCBpbnQgY2hhbm5lbHNPcmRlcltdKSB7CiAgICAgICAgIC8vIFN1cHBvc2Ugc2FtZSBzYW1wbGUgc2l6ZSBmb3IgYWxsIGNoYW5uZWxzLCBvdGhlcndpc2UgdXNlIHNsb3cgZmlsdGVyCiAgICAgICAgIGludCBtYXhWYWx1ZSA9ICgxIDw8IHNtLmdldFNhbXBsZVNpemUoMCkpIC0gMTsKIApAQCAtNDExLDE3ICs0MjMsMTcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChza2lwQWxwaGEpIHsKLSAgICAgICAgICAgIGV4dFNjYWxlRmFjdG9yc1tudW1CYW5kcy0xXSA9IDE7Ci0gICAgICAgICAgICBleHRPZmZzZXRzW251bUJhbmRzLTFdID0gMDsKKyAgICAgICAgICAgIGV4dFNjYWxlRmFjdG9yc1tudW1CYW5kcyAtIDFdID0gMTsKKyAgICAgICAgICAgIGV4dE9mZnNldHNbbnVtQmFuZHMgLSAxXSA9IDA7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBDcmVhdGUgYSBsZXZlbHMKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPG51bUJhbmRzOyBpKyspIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CYW5kczsgaSsrKSB7CiAgICAgICAgICAgICBpZiAoZXh0U2NhbGVGYWN0b3JzW2ldID09IDApIHsKLSAgICAgICAgICAgICAgICBsZXZlbHNbaSo0XSA9IDA7Ci0gICAgICAgICAgICAgICAgbGV2ZWxzW2kqNCsxXSA9IDA7Ci0gICAgICAgICAgICAgICAgbGV2ZWxzW2kqNCsyXSA9IG1heFZhbHVlKzE7Ci0gICAgICAgICAgICAgICAgbGV2ZWxzW2kqNCszXSA9IG1heFZhbHVlKzE7CisgICAgICAgICAgICAgICAgbGV2ZWxzW2kgKiA0XSA9IDA7CisgICAgICAgICAgICAgICAgbGV2ZWxzW2kgKiA0ICsgMV0gPSAwOworICAgICAgICAgICAgICAgIGxldmVsc1tpICogNCArIDJdID0gbWF4VmFsdWUgKyAxOworICAgICAgICAgICAgICAgIGxldmVsc1tpICogNCArIDNdID0gbWF4VmFsdWUgKyAxOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBmbG9hdCBtaW5MZXZlbCA9IC1leHRPZmZzZXRzW2ldIC8gZXh0U2NhbGVGYWN0b3JzW2ldOwpAQCAtNDI5LDMzICs0NDEsMzMgQEAKIAogICAgICAgICAgICAgaWYgKG1pbkxldmVsIDwgMCkgewogICAgICAgICAgICAgICAgIG1pbkxldmVsID0gMDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobWluTGV2ZWwgPiBtYXhWYWx1ZSl7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1pbkxldmVsID4gbWF4VmFsdWUpIHsKICAgICAgICAgICAgICAgICBtaW5MZXZlbCA9IG1heFZhbHVlOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobWF4TGV2ZWwgPCAwKSB7CiAgICAgICAgICAgICAgICAgbWF4TGV2ZWwgPSAwOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtYXhMZXZlbCA+IG1heFZhbHVlKXsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobWF4TGV2ZWwgPiBtYXhWYWx1ZSkgewogICAgICAgICAgICAgICAgIG1heExldmVsID0gbWF4VmFsdWU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGxldmVsc1tpKjRdID0gMDsKKyAgICAgICAgICAgIGxldmVsc1tpICogNF0gPSAwOwogICAgICAgICAgICAgaWYgKG1pbkxldmVsID4gbWF4TGV2ZWwpIHsKLSAgICAgICAgICAgICAgICBsZXZlbHNbaSo0KzFdID0gKGludCkgbWF4TGV2ZWw7Ci0gICAgICAgICAgICAgICAgbGV2ZWxzW2kqNCsyXSA9IChpbnQpIG1pbkxldmVsOworICAgICAgICAgICAgICAgIGxldmVsc1tpICogNCArIDFdID0gKGludCltYXhMZXZlbDsKKyAgICAgICAgICAgICAgICBsZXZlbHNbaSAqIDQgKyAyXSA9IChpbnQpbWluTGV2ZWw7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxldmVsc1tpKjQrMV0gPSAoaW50KSBtaW5MZXZlbDsKLSAgICAgICAgICAgICAgICBsZXZlbHNbaSo0KzJdID0gKGludCkgbWF4TGV2ZWw7CisgICAgICAgICAgICAgICAgbGV2ZWxzW2kgKiA0ICsgMV0gPSAoaW50KW1pbkxldmVsOworICAgICAgICAgICAgICAgIGxldmVsc1tpICogNCArIDJdID0gKGludCltYXhMZXZlbDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxldmVsc1tpKjQrM10gPSBtYXhWYWx1ZSsxOworICAgICAgICAgICAgbGV2ZWxzW2kgKiA0ICsgM10gPSBtYXhWYWx1ZSArIDE7CiAKICAgICAgICAgICAgIC8vIEZpbGwgdmFsdWVzCi0gICAgICAgICAgICBmb3IgKGludCBrPTA7IGs8NDsgaysrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGlkeCA9IGkqNCtrOwotICAgICAgICAgICAgICAgIHZhbHVlc1tpZHhdID0gKGludCkgKGV4dFNjYWxlRmFjdG9yc1tpXSAqIGxldmVsc1tpZHhdICsgZXh0T2Zmc2V0c1tpXSk7CisgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDQ7IGsrKykgeworICAgICAgICAgICAgICAgIGludCBpZHggPSBpICogNCArIGs7CisgICAgICAgICAgICAgICAgdmFsdWVzW2lkeF0gPSAoaW50KShleHRTY2FsZUZhY3RvcnNbaV0gKiBsZXZlbHNbaWR4XSArIGV4dE9mZnNldHNbaV0pOwogICAgICAgICAgICAgICAgIGlmICh2YWx1ZXNbaWR4XSA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzW2lkeF0gPSAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWVzW2lkeF0gPiBtYXhWYWx1ZSl7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZXNbaWR4XSA+IG1heFZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgIHZhbHVlc1tpZHhdID0gbWF4VmFsdWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNDYzLDE0ICs0NzUsMTQgQEAKIAogICAgICAgICAvLyBSZW9yZGVyIGRhdGEgaWYgY2hhbm5lbHMgYXJlIHN0b3JlZCBpbiBkaWZmZXJlbnQgb3JkZXIKICAgICAgICAgaWYgKGNoYW5uZWxzT3JkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IGxlbiA9IG51bUJhbmRzKjQ7CisgICAgICAgICAgICBpbnQgbGVuID0gbnVtQmFuZHMgKiA0OwogICAgICAgICAgICAgaW50IHNhdmVkTGV2ZWxzW10gPSBuZXcgaW50W2xlbl07CiAgICAgICAgICAgICBpbnQgc2F2ZWRWYWx1ZXNbXSA9IG5ldyBpbnRbbGVuXTsKICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobGV2ZWxzLCAwLCBzYXZlZExldmVscywgMCwgbGVuKTsKICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodmFsdWVzLCAwLCBzYXZlZFZhbHVlcywgMCwgbGVuKTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hhbm5lbHNPcmRlci5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoc2F2ZWRMZXZlbHMsIGkqNCwgbGV2ZWxzLCBjaGFubmVsc09yZGVyW2ldKjQsIDQpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoc2F2ZWRWYWx1ZXMsIGkqNCwgdmFsdWVzLCBjaGFubmVsc09yZGVyW2ldKjQsIDQpOworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoc2F2ZWRMZXZlbHMsIGkgKiA0LCBsZXZlbHMsIGNoYW5uZWxzT3JkZXJbaV0gKiA0LCA0KTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHNhdmVkVmFsdWVzLCBpICogNCwgdmFsdWVzLCBjaGFubmVsc09yZGVyW2ldICogNCwgNCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC00NzksMTggKzQ5MSwxOCBAQAogICAgIC8qKgogICAgICAqIElwcCBmaWx0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNyYyB0aGUgc3JjCi0gICAgICogQHBhcmFtIGRzdCB0aGUgZHN0Ci0gICAgICogQHBhcmFtIGltYWdlVHlwZSB0aGUgaW1hZ2UgdHlwZQotICAgICAqIEBwYXJhbSBza2lwQWxwaGEgdGhlIHNraXAgYWxwaGEKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnQKKyAgICAgKiBAcGFyYW0gc3JjCisgICAgICogICAgICAgICAgICB0aGUgc3JjLgorICAgICAqIEBwYXJhbSBkc3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBkc3QuCisgICAgICogQHBhcmFtIGltYWdlVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIHR5cGUuCisgICAgICogQHBhcmFtIHNraXBBbHBoYQorICAgICAqICAgICAgICAgICAgdGhlIHNraXAgYWxwaGEuCisgICAgICogQHJldHVybiB0aGUgaW50LgogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgIHByaXZhdGUgZmluYWwgaW50IGlwcEZpbHRlcigKLSAgICAgICAgICAgIFJhc3RlciBzcmMsIFdyaXRhYmxlUmFzdGVyIGRzdCwKLSAgICAgICAgICAgIGludCBpbWFnZVR5cGUsIGJvb2xlYW4gc2tpcEFscGhhCi0gICAgKSB7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgaXBwRmlsdGVyKFJhc3RlciBzcmMsIFdyaXRhYmxlUmFzdGVyIGRzdCwgaW50IGltYWdlVHlwZSwgYm9vbGVhbiBza2lwQWxwaGEpIHsKICAgICAgICAgaW50IHJlczsKIAogICAgICAgICBpbnQgc3JjU3RyaWRlLCBkc3RTdHJpZGU7CkBAIC01MDMsOSArNTE1LDExIEBACiAgICAgICAgICAgICBjYXNlIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfQVJHQl9QUkU6CiAgICAgICAgICAgICBjYXNlIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfUkdCOiB7CiAgICAgICAgICAgICAgICAgY2hhbm5lbHMgPSA0OwotICAgICAgICAgICAgICAgIHNyY1N0cmlkZSA9IHNyYy5nZXRXaWR0aCgpKjQ7Ci0gICAgICAgICAgICAgICAgZHN0U3RyaWRlID0gZHN0LmdldFdpZHRoKCkqNDsKLSAgICAgICAgICAgICAgICBjaGFubmVsc09yZGVyID0gbmV3IGludFtdIHsyLCAxLCAwLCAzfTsKKyAgICAgICAgICAgICAgICBzcmNTdHJpZGUgPSBzcmMuZ2V0V2lkdGgoKSAqIDQ7CisgICAgICAgICAgICAgICAgZHN0U3RyaWRlID0gZHN0LmdldFdpZHRoKCkgKiA0OworICAgICAgICAgICAgICAgIGNoYW5uZWxzT3JkZXIgPSBuZXcgaW50W10geworICAgICAgICAgICAgICAgICAgICAgICAgMiwgMSwgMCwgMworICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTUxMyw4ICs1MjcsOCBAQAogICAgICAgICAgICAgY2FzZSBCdWZmZXJlZEltYWdlLlRZUEVfNEJZVEVfQUJHUl9QUkU6CiAgICAgICAgICAgICBjYXNlIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfQkdSOiB7CiAgICAgICAgICAgICAgICAgY2hhbm5lbHMgPSA0OwotICAgICAgICAgICAgICAgIHNyY1N0cmlkZSA9IHNyYy5nZXRXaWR0aCgpKjQ7Ci0gICAgICAgICAgICAgICAgZHN0U3RyaWRlID0gZHN0LmdldFdpZHRoKCkqNDsKKyAgICAgICAgICAgICAgICBzcmNTdHJpZGUgPSBzcmMuZ2V0V2lkdGgoKSAqIDQ7CisgICAgICAgICAgICAgICAgZHN0U3RyaWRlID0gZHN0LmdldFdpZHRoKCkgKiA0OwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC01MjcsOSArNTQxLDExIEBACiAKICAgICAgICAgICAgIGNhc2UgQnVmZmVyZWRJbWFnZS5UWVBFXzNCWVRFX0JHUjogewogICAgICAgICAgICAgICAgIGNoYW5uZWxzID0gMzsKLSAgICAgICAgICAgICAgICBzcmNTdHJpZGUgPSBzcmMuZ2V0V2lkdGgoKSozOwotICAgICAgICAgICAgICAgIGRzdFN0cmlkZSA9IGRzdC5nZXRXaWR0aCgpKjM7Ci0gICAgICAgICAgICAgICAgY2hhbm5lbHNPcmRlciA9IG5ldyBpbnRbXSB7MiwgMSwgMH07CisgICAgICAgICAgICAgICAgc3JjU3RyaWRlID0gc3JjLmdldFdpZHRoKCkgKiAzOworICAgICAgICAgICAgICAgIGRzdFN0cmlkZSA9IGRzdC5nZXRXaWR0aCgpICogMzsKKyAgICAgICAgICAgICAgICBjaGFubmVsc09yZGVyID0gbmV3IGludFtdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDIsIDEsIDAKKyAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC01NDQsNTUgKzU2MCw0NiBAQAogICAgICAgICAgICAgICAgIFNhbXBsZU1vZGVsIHNyY1NNID0gc3JjLmdldFNhbXBsZU1vZGVsKCk7CiAgICAgICAgICAgICAgICAgU2FtcGxlTW9kZWwgZHN0U00gPSBkc3QuZ2V0U2FtcGxlTW9kZWwoKTsKIAotICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY1NNIGluc3RhbmNlb2YgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3RTTSBpbnN0YW5jZW9mIFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbAotICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIGlmIChzcmNTTSBpbnN0YW5jZW9mIFBpeGVsSW50ZXJsZWF2ZWRTYW1wbGVNb2RlbAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZHN0U00gaW5zdGFuY2VvZiBQaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsCi0gICAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNTTS5nZXREYXRhVHlwZSgpICE9IERhdGFCdWZmZXIuVFlQRV9CWVRFIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0U00uZ2V0RGF0YVR5cGUoKSAhPSBEYXRhQnVmZmVyLlRZUEVfQllURQotICAgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNyY1NNLmdldERhdGFUeXBlKCkgIT0gRGF0YUJ1ZmZlci5UWVBFX0JZVEUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBkc3RTTS5nZXREYXRhVHlwZSgpICE9IERhdGFCdWZmZXIuVFlQRV9CWVRFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2xvd0ZpbHRlcihzcmMsIGRzdCwgc2tpcEFscGhhKTsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzID0gc3JjU00uZ2V0TnVtQmFuZHMoKTsgLy8gSGF2ZSBJUFAgZnVuY3Rpb25zIGZvciAxLCAzIGFuZCA0IGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzID0gc3JjU00uZ2V0TnVtQmFuZHMoKTsgLy8gSGF2ZSBJUFAgZnVuY3Rpb25zIGZvciAxLAorICAgICAgICAgICAgICAgICAgICAvLyAzIGFuZCA0IGNoYW5uZWxzCiAgICAgICAgICAgICAgICAgICAgIGlmICghKGNoYW5uZWxzID09IDEgfHwgY2hhbm5lbHMgPT0gMyB8fCBjaGFubmVscyA9PSA0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNsb3dGaWx0ZXIoc3JjLCBkc3QsIHNraXBBbHBoYSk7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBzcmNTdHJpZGUgPSAoKENvbXBvbmVudFNhbXBsZU1vZGVsKSBzcmNTTSkuZ2V0U2NhbmxpbmVTdHJpZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgZHN0U3RyaWRlID0gKChDb21wb25lbnRTYW1wbGVNb2RlbCkgZHN0U00pLmdldFNjYW5saW5lU3RyaWRlKCk7CisgICAgICAgICAgICAgICAgICAgIHNyY1N0cmlkZSA9ICgoQ29tcG9uZW50U2FtcGxlTW9kZWwpc3JjU00pLmdldFNjYW5saW5lU3RyaWRlKCk7CisgICAgICAgICAgICAgICAgICAgIGRzdFN0cmlkZSA9ICgoQ29tcG9uZW50U2FtcGxlTW9kZWwpZHN0U00pLmdldFNjYW5saW5lU3RyaWRlKCk7CiAKLSAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNPcmRlciA9ICgoQ29tcG9uZW50U2FtcGxlTW9kZWwpIHNyY1NNKS5nZXRCYW5kT2Zmc2V0cygpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoCi0gICAgICAgICAgICAgICAgICAgICAgICBzcmNTTSBpbnN0YW5jZW9mIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdFNNIGluc3RhbmNlb2YgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbAotICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICAgICBjaGFubmVsc09yZGVyID0gKChDb21wb25lbnRTYW1wbGVNb2RlbClzcmNTTSkuZ2V0QmFuZE9mZnNldHMoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNyY1NNIGluc3RhbmNlb2YgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZHN0U00gaW5zdGFuY2VvZiBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwKLSAgICAgICAgICAgICAgICAgICAgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCBzcHBzbTEgPSAoU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCkgc3JjU007Ci0gICAgICAgICAgICAgICAgICAgIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgc3Bwc20yID0gKFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwpIGRzdFNNOworICAgICAgICAgICAgICAgICAgICBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIHNwcHNtMSA9IChTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKXNyY1NNOworICAgICAgICAgICAgICAgICAgICBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIHNwcHNtMiA9IChTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKWRzdFNNOwogCiAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzID0gc3Bwc20xLmdldE51bUJhbmRzKCk7CiAKLSAgICAgICAgICAgICAgICAgICAgIC8vIFRZUEVfSU5UX1JHQiwgVFlQRV9JTlRfQVJHQi4uLgotICAgICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bwc20xLmdldERhdGFUeXBlKCkgIT0gRGF0YUJ1ZmZlci5UWVBFX0lOVCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcHNtMi5nZXREYXRhVHlwZSgpICE9IERhdGFCdWZmZXIuVFlQRV9JTlQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKGNoYW5uZWxzID09IDMgfHwgY2hhbm5lbHMgPT0gNCkKLSAgICAgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRZUEVfSU5UX1JHQiwgVFlQRV9JTlRfQVJHQi4uLgorICAgICAgICAgICAgICAgICAgICBpZiAoc3Bwc20xLmdldERhdGFUeXBlKCkgIT0gRGF0YUJ1ZmZlci5UWVBFX0lOVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHNwcHNtMi5nZXREYXRhVHlwZSgpICE9IERhdGFCdWZmZXIuVFlQRV9JTlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhKGNoYW5uZWxzID09IDMgfHwgY2hhbm5lbHMgPT0gNCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzbG93RmlsdGVyKHNyYywgZHN0LCBza2lwQWxwaGEpOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgY29tcGF0aWJpbGl0eSBvZiBzYW1wbGUgbW9kZWxzCi0gICAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhQXJyYXlzLmVxdWFscyhzcHBzbTEuZ2V0Qml0T2Zmc2V0cygpLCBzcHBzbTIuZ2V0Qml0T2Zmc2V0cygpKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFBcnJheXMuZXF1YWxzKHNwcHNtMS5nZXRCaXRNYXNrcygpLCBzcHBzbTIuZ2V0Qml0TWFza3MoKSkKLSAgICAgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghQXJyYXlzLmVxdWFscyhzcHBzbTEuZ2V0Qml0T2Zmc2V0cygpLCBzcHBzbTIuZ2V0Qml0T2Zmc2V0cygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFBcnJheXMuZXF1YWxzKHNwcHNtMS5nZXRCaXRNYXNrcygpLCBzcHBzbTIuZ2V0Qml0TWFza3MoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzbG93RmlsdGVyKHNyYywgZHN0LCBza2lwQWxwaGEpOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3Bwc20xLmdldFNhbXBsZVNpemUoaSkgIT0gOCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzbG93RmlsdGVyKHNyYywgZHN0LCBza2lwQWxwaGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNjAwLDExICs2MDcsMTIgQEAKIAogICAgICAgICAgICAgICAgICAgICBjaGFubmVsc09yZGVyID0gbmV3IGludFtjaGFubmVsc107CiAgICAgICAgICAgICAgICAgICAgIGludCBiaXRPZmZzZXRzW10gPSBzcHBzbTEuZ2V0Qml0T2Zmc2V0cygpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8Y2hhbm5lbHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzT3JkZXJbaV0gPSBiaXRPZmZzZXRzW2ldIC8gODsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIGlmIChjaGFubmVscyA9PSAzKSB7IC8vIERvbid0IHNraXAgY2hhbm5lbCBub3csIGNvdWxkIGJlIG9wdGltaXplZAorICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbHMgPT0gMykgeyAvLyBEb24ndCBza2lwIGNoYW5uZWwgbm93LCBjb3VsZCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW1pemVkCiAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscyA9IDQ7CiAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtNjE2LDEyICs2MjQsOSBAQAogCiAgICAgICAgICAgICAgICAgLy8gRmlsbCBvZmZzZXRzIGlmIHRoZXJlJ3MgYSBjaGlsZCByYXN0ZXIKICAgICAgICAgICAgICAgICBpZiAoc3JjLmdldFBhcmVudCgpICE9IG51bGwgfHwgZHN0LmdldFBhcmVudCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVgoKSAhPSAwIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWSgpICE9IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVYKCkgIT0gMCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVkoKSAhPSAwCi0gICAgICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3JjLmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWCgpICE9IDAgfHwgc3JjLmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWSgpICE9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBkc3QuZ2V0U2FtcGxlTW9kZWxUcmFuc2xhdGVYKCkgIT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRzdC5nZXRTYW1wbGVNb2RlbFRyYW5zbGF0ZVkoKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRzID0gbmV3IGludFs0XTsKICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldHNbMF0gPSAtc3JjLmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWCgpICsgc3JjLmdldE1pblgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldHNbMV0gPSAtc3JjLmdldFNhbXBsZU1vZGVsVHJhbnNsYXRlWSgpICsgc3JjLmdldE1pblkoKTsKQEAgLTYzMiw4ICs2MzcsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaW50IGxldmVsc1tdID0gbmV3IGludFs0KmNoYW5uZWxzXTsKLSAgICAgICAgaW50IHZhbHVlc1tdID0gbmV3IGludFs0KmNoYW5uZWxzXTsKKyAgICAgICAgaW50IGxldmVsc1tdID0gbmV3IGludFs0ICogY2hhbm5lbHNdOworICAgICAgICBpbnQgdmFsdWVzW10gPSBuZXcgaW50WzQgKiBjaGFubmVsc107CiAKICAgICAgICAgY3JlYXRlTGV2ZWxzKHNyYy5nZXRTYW1wbGVNb2RlbCgpLCBjaGFubmVscywgc2tpcEFscGhhLCBsZXZlbHMsIHZhbHVlcywgY2hhbm5lbHNPcmRlcik7CiAKQEAgLTY0NiwxMyArNjUxLDggQEAKICAgICAgICAgICAgIHJldHVybiAtMTsgLy8gVW5rbm93biBkYXRhIGJ1ZmZlciB0eXBlCiAgICAgICAgIH0KIAotICAgICAgICByZXMgPSBMb29rdXBPcC5pcHBMVVQoCi0gICAgICAgICAgICBzcmNEYXRhLCBzcmMuZ2V0V2lkdGgoKSwgc3JjLmdldEhlaWdodCgpLCBzcmNTdHJpZGUsCi0gICAgICAgICAgICBkc3REYXRhLCBkc3QuZ2V0V2lkdGgoKSwgZHN0LmdldEhlaWdodCgpLCBkc3RTdHJpZGUsCi0gICAgICAgICAgICBsZXZlbHMsIHZhbHVlcywKLSAgICAgICAgICAgIGNoYW5uZWxzLCBvZmZzZXRzLAotICAgICAgICAgICAgdHJ1ZQotICAgICAgICApOworICAgICAgICByZXMgPSBMb29rdXBPcC5pcHBMVVQoc3JjRGF0YSwgc3JjLmdldFdpZHRoKCksIHNyYy5nZXRIZWlnaHQoKSwgc3JjU3RyaWRlLCBkc3REYXRhLCBkc3QKKyAgICAgICAgICAgICAgICAuZ2V0V2lkdGgoKSwgZHN0LmdldEhlaWdodCgpLCBkc3RTdHJpZGUsIGxldmVscywgdmFsdWVzLCBjaGFubmVscywgb2Zmc2V0cywgdHJ1ZSk7CiAKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvU2FtcGxlTW9kZWwuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9TYW1wbGVNb2RlbC5qYXZhCmluZGV4IDQ0MDU5YTAuLmM5NjdmYTYgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbWFnZS9TYW1wbGVNb2RlbC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9TYW1wbGVNb2RlbC5qYXZhCkBAIC0xOCw0NCArMTgsNTcgQEAKICAqIEBhdXRob3IgSWdvciBWLiBTdG9seWFyb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmltYWdlOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogVGhlIFNhbXBsZU1vZGVsIGNsYXNzIGlzIGFic3RyYWN0IGNsYXNzIGZvciByZXRyaWV2aW5nIHBpeGVsJ3Mgc2FtcGxlcwotICogaW4gdGhlIGRhdGEgb2YgYW4gaW1hZ2UuIEVhY2ggcGl4ZWwgY29udGFpbnMgc2V2ZXJhbCBzYW1wbGVzLiBBIAotICogc2FtcGxlIGlzIHRoZSBzZXQgb2YgdmFsdWVzIG9mIHRoZSBiYW5kcyBmb3Igc2luZ2xlIHBpeGVsLiAKLSAqIEZvciBleGFtcGxlLCBlYWNoIHBpeGVsIGluIHRoZSBSR0IgbW9kZWwgY29udGFpbnMgdGhyZWUgc2FtcGxlcyAKLSAqIGFuZCB0aGVyZSBhcmUgdGhyZWUgY29ycmVzcG9uZGluZyBiYW5kcyBpbiB0aGUgaW1hZ2UgCi0gKiBkYXRhIG9mIHN1Y2ggcGl4ZWxzIHJlcHJlc2VudGluZyByZWQsIGdyZWVuIGFuZCBibHVlIGNvbXBvbmVudHMuCi0gKiA8cD4gCi0gKiBUaGUgaW1hZ2UgZGF0YSBpcyByZXByZXNlbnRlZCBhcyBhIFJhc3RlciB3aXRoIGEgRGF0YUJ1ZmZlciAKLSAqIGFuZCBhIFNhbXBsZU1vZGVsLiBUaGUgU2FtcGxlTW9kZWwgYWxsb3dzIGFjY2VzcyB0byB0aGUgc2FtcGxlcyBpbiB0aGUgCi0gKiBEYXRhQnVmZmVyLiAKKyAqIFRoZSBTYW1wbGVNb2RlbCBjbGFzcyBpcyBhYnN0cmFjdCBjbGFzcyBmb3IgcmV0cmlldmluZyBwaXhlbCdzIHNhbXBsZXMgaW4gdGhlCisgKiBkYXRhIG9mIGFuIGltYWdlLiBFYWNoIHBpeGVsIGNvbnRhaW5zIHNldmVyYWwgc2FtcGxlcy4gQSBzYW1wbGUgaXMgdGhlIHNldCBvZgorICogdmFsdWVzIG9mIHRoZSBiYW5kcyBmb3Igc2luZ2xlIHBpeGVsLiBGb3IgZXhhbXBsZSwgZWFjaCBwaXhlbCBpbiB0aGUgUkdCCisgKiBtb2RlbCBjb250YWlucyB0aHJlZSBzYW1wbGVzIGFuZCB0aGVyZSBhcmUgdGhyZWUgY29ycmVzcG9uZGluZyBiYW5kcyBpbiB0aGUKKyAqIGltYWdlIGRhdGEgb2Ygc3VjaCBwaXhlbHMgcmVwcmVzZW50aW5nIHJlZCwgZ3JlZW4gYW5kIGJsdWUgY29tcG9uZW50cy4KKyAqIDxwPgorICogVGhlIGltYWdlIGRhdGEgaXMgcmVwcmVzZW50ZWQgYXMgYSBSYXN0ZXIgd2l0aCBhIERhdGFCdWZmZXIgYW5kIGEKKyAqIFNhbXBsZU1vZGVsLiBUaGUgU2FtcGxlTW9kZWwgYWxsb3dzIGFjY2VzcyB0byB0aGUgc2FtcGxlcyBpbiB0aGUgRGF0YUJ1ZmZlci4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTYW1wbGVNb2RlbCB7CiAKLSAgICAvKiogVGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBkYXRhIHdoaWNoIHRoaXMgU2FtcGxlTW9kZWwgZGVzY3JpYmVzLiAqLworICAgIC8qKgorICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UgZGF0YSB3aGljaCB0aGlzIFNhbXBsZU1vZGVsIGRlc2NyaWJlcy4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IHdpZHRoOwogCi0gICAgLyoqIFRoZSBoZWlnaHQgb2YgdGhlIGltYWdlIGRhdGEgd2hpY2ggdGhpcyBTYW1wbGVNb2RlbCBkZXNjcmliZXMuICovCisgICAgLyoqCisgICAgICogVGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UgZGF0YSB3aGljaCB0aGlzIFNhbXBsZU1vZGVsIGRlc2NyaWJlcy4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IGhlaWdodDsKIAotICAgIC8qKiBUaGUgbnVtYmVyIG9mIGJhbmRzIG9mIGltYWdlIGRhdGEgd2hpY2ggdGhpcyBTYW1wbGVNb2RlbCBkZXNjcmliZXMuICovCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBiYW5kcyBvZiBpbWFnZSBkYXRhIHdoaWNoIHRoaXMgU2FtcGxlTW9kZWwgZGVzY3JpYmVzLgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgbnVtQmFuZHM7CiAKLSAgICAvKiogVGhlIGRhdGEgdHlwZSBvZiB0aGUgaW1hZ2UgZGF0YSB3aGljaCB0aGlzIFNhbXBsZU1vZGVsIGRlc2NyaWJlcy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgZGF0YSB0eXBlIG9mIHRoZSBpbWFnZSBkYXRhIHdoaWNoIHRoaXMgU2FtcGxlTW9kZWwgZGVzY3JpYmVzLgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgZGF0YVR5cGU7CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgU2FtcGxlTW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIGRhdGEgdHlwZSwKLSAgICAgKiB3aWR0aCwgaGVpZ2h0IGFuZCBudW1iZXIgb2YgYmFuZHMuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IFNhbXBsZU1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBkYXRhIHR5cGUsIHdpZHRoLAorICAgICAqIGhlaWdodCBhbmQgbnVtYmVyIG9mIGJhbmRzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhVHlwZSB0aGUgZGF0YSB0eXBlIG9mIHRoZSBpbWFnZSBkYXRhLgotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZSBkYXRhLgotICAgICAqIEBwYXJhbSBudW1CYW5kcyB0aGUgbnVtYmVyIG9mIGJhbmRzIG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBkYXRhVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgdHlwZSBvZiB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBudW1CYW5kcworICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBiYW5kcyBvZiB0aGUgaW1hZ2UgZGF0YS4KICAgICAgKi8KICAgICBwdWJsaWMgU2FtcGxlTW9kZWwoaW50IGRhdGFUeXBlLCBpbnQgdywgaW50IGgsIGludCBudW1CYW5kcykgewogICAgICAgICBpZiAodyA8PSAwIHx8IGggPD0gMCkgewpAQCAtNjMsMTUgKzc2LDE0IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjIyRSIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgZG91YmxlIHNxdXJlID0gKChkb3VibGUpIHcpICogKChkb3VibGUpIGgpOworICAgICAgICBkb3VibGUgc3F1cmUgPSAoKGRvdWJsZSl3KSAqICgoZG91YmxlKWgpOwogICAgICAgICBpZiAoc3F1cmUgPj0gSW50ZWdlci5NQVhfVkFMVUUpIHsKICAgICAgICAgICAgIC8vIGF3dC4yMkY9VGhlIHByb2R1Y3Qgb2YgdyBhbmQgaCBpcyBncmVhdGVyIHRoYW4gSW50ZWdlci5NQVhfVkFMVUUKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjJGIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICBpZiAoZGF0YVR5cGUgPCBEYXRhQnVmZmVyLlRZUEVfQllURSB8fAotICAgICAgICAgICAgICAgIGRhdGFUeXBlID4gRGF0YUJ1ZmZlci5UWVBFX0RPVUJMRSAmJgotICAgICAgICAgICAgICAgIGRhdGFUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9VTkRFRklORUQpIHsKKyAgICAgICAgaWYgKGRhdGFUeXBlIDwgRGF0YUJ1ZmZlci5UWVBFX0JZVEUgfHwgZGF0YVR5cGUgPiBEYXRhQnVmZmVyLlRZUEVfRE9VQkxFCisgICAgICAgICAgICAgICAgJiYgZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX1VOREVGSU5FRCkgewogICAgICAgICAgICAgLy8gYXd0LjIzMD1kYXRhVHlwZSBpcyBub3Qgb25lIG9mIHRoZSBzdXBwb3J0ZWQgZGF0YSB0eXBlcwogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yMzAiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQpAQCAtODksMTU0ICsxMDEsMTU2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGF0YSBhcnJheSBmb3IgdGhlIHNwZWNpZmllZCBwaXhlbCBvZiB0aGUgc3BlY2lmaWVkIAotICAgICAqIERhdGFCdWZmZXIgd2l0aCBvbmUgb2YgdGhlIGZvbGxvd2luZyB0eXBlczogCi0gICAgICogRGF0YUJ1ZmZlci5UWVBFX0JZVEUsIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQsIAotICAgICAqIERhdGFCdWZmZXIuVFlQRV9JTlQsIERhdGFCdWZmZXIuVFlQRV9TSE9SVCwgCisgICAgICogR2V0cyB0aGUgZGF0YSBhcnJheSBmb3IgdGhlIHNwZWNpZmllZCBwaXhlbCBvZiB0aGUgc3BlY2lmaWVkIERhdGFCdWZmZXIKKyAgICAgKiB3aXRoIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR5cGVzOiBEYXRhQnVmZmVyLlRZUEVfQllURSwKKyAgICAgKiBEYXRhQnVmZmVyLlRZUEVfVVNIT1JULCBEYXRhQnVmZmVyLlRZUEVfSU5ULCBEYXRhQnVmZmVyLlRZUEVfU0hPUlQsCiAgICAgICogRGF0YUJ1ZmZlci5UWVBFX0ZMT0FULCBvciBEYXRhQnVmZmVyLlRZUEVfRE9VQkxFLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgcGl4ZWwuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiBwaXhlbC4KLSAgICAgKiBAcGFyYW0gb2JqIHRoZSBPYmplY3QgaXMgYSBkYXRhIHdoZXJlIHRoZSByZXN1bHQgd2lsbCBiZSBzdG9yZWQuCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGltYWdlIGRhdGEuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGF0YSBhcnJheSBmb3IgdGhlIHNwZWNpZmllZCBwaXhlbCBvZiB0aGUgc3BlY2lmaWVkIAotICAgICAqIERhdGFCdWZmZXIuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgcGl4ZWwuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgcGl4ZWwuCisgICAgICogQHBhcmFtIG9iagorICAgICAqICAgICAgICAgICAgdGhlIE9iamVjdCBpcyBhIGRhdGEgd2hlcmUgdGhlIHJlc3VsdCB3aWxsIGJlIHN0b3JlZC4KKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHJldHVybiB0aGUgZGF0YSBhcnJheSBmb3IgdGhlIHNwZWNpZmllZCBwaXhlbCBvZiB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICBEYXRhQnVmZmVyLgogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0RGF0YUVsZW1lbnRzKGludCB4LCBpbnQgeSwgT2JqZWN0IG9iaiwKLSAgICAgICAgICAgIERhdGFCdWZmZXIgZGF0YSk7CisgICAgcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXREYXRhRWxlbWVudHMoaW50IHgsIGludCB5LCBPYmplY3Qgb2JqLCBEYXRhQnVmZmVyIGRhdGEpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgYXJyYXkgb2YgcGl4ZWwgZGF0YSBmb3IgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhciAKLSAgICAgKiBhcmVhIG9mIHBpeGVscyBvZiB0aGUgc3BlY2lmaWVkIERhdGFCdWZmZXIgd2l0aCBvbmUgb2YgCi0gICAgICogdGhlIGZvbGxvd2luZyB0eXBlczogCi0gICAgICogRGF0YUJ1ZmZlci5UWVBFX0JZVEUsIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQsIAotICAgICAqIERhdGFCdWZmZXIuVFlQRV9JTlQsIERhdGFCdWZmZXIuVFlQRV9TSE9SVCwgCi0gICAgICogRGF0YUJ1ZmZlci5UWVBFX0ZMT0FULCBvciBEYXRhQnVmZmVyLlRZUEVfRE9VQkxFLgorICAgICAqIEdldHMgdGhlIGFycmF5IG9mIHBpeGVsIGRhdGEgZm9yIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMKKyAgICAgKiBvZiB0aGUgc3BlY2lmaWVkIERhdGFCdWZmZXIgd2l0aCBvbmUgb2YgdGhlIGZvbGxvd2luZyB0eXBlczoKKyAgICAgKiBEYXRhQnVmZmVyLlRZUEVfQllURSwgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVCwgRGF0YUJ1ZmZlci5UWVBFX0lOVCwKKyAgICAgKiBEYXRhQnVmZmVyLlRZUEVfU0hPUlQsIERhdGFCdWZmZXIuVFlQRV9GTE9BVCwgb3IgRGF0YUJ1ZmZlci5UWVBFX0RPVUJMRS4KICAgICAgKiAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5ndWxhciBwaXhlbCBhcmVhLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3Rhbmd1bGFyIHBpeGVsIGFyZWEuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5ndWxhciBwaXhlbCBhcmVhLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3Rhbmd1bGFyIHBpeGVsIGFyZWEuCi0gICAgICogQHBhcmFtIG9iaiB0aGUgT2JqZWN0IGlzIGFuIGFycmF5IHdpdGggdGhlIHByaW1pdGl2ZSB0eXBlLAotICAgICAqIHdoZXJlIHRoZSByZXN1bHQgYXJyYXkgd2lsbCBiZSBzdG9yZWQuCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGltYWdlIGRhdGEuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgcGl4ZWwgZGF0YSBmb3IgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhciAKLSAgICAgKiBhcmVhIG9mIHBpeGVscyBvZiB0aGUgc3BlY2lmaWVkIERhdGFCdWZmZXIgb2JqZWN0LgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5ndWxhciBwaXhlbCBhcmVhLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5ndWxhciBwaXhlbCBhcmVhLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIHJlY3Rhbmd1bGFyIHBpeGVsIGFyZWEuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3Rhbmd1bGFyIHBpeGVsIGFyZWEuCisgICAgICogQHBhcmFtIG9iagorICAgICAqICAgICAgICAgICAgdGhlIE9iamVjdCBpcyBhbiBhcnJheSB3aXRoIHRoZSBwcmltaXRpdmUgdHlwZSwgd2hlcmUgdGhlCisgICAgICogICAgICAgICAgICByZXN1bHQgYXJyYXkgd2lsbCBiZSBzdG9yZWQuCisgICAgICogQHBhcmFtIGRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIHBpeGVsIGRhdGEgZm9yIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIgYXJlYSBvZgorICAgICAqICAgICAgICAgcGl4ZWxzIG9mIHRoZSBzcGVjaWZpZWQgRGF0YUJ1ZmZlciBvYmplY3QuCiAgICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXREYXRhRWxlbWVudHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIE9iamVjdCBvYmosCi0gICAgICAgICAgICBEYXRhQnVmZmVyIGRhdGEpIHsKKyAgICBwdWJsaWMgT2JqZWN0IGdldERhdGFFbGVtZW50cyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgT2JqZWN0IG9iaiwgRGF0YUJ1ZmZlciBkYXRhKSB7CiAgICAgICAgIGludCBudW1EYXRhRWxlbWVudHMgPSBnZXROdW1EYXRhRWxlbWVudHMoKTsKICAgICAgICAgaW50IGlkeCA9IDA7CiAKICAgICAgICAgc3dpdGNoIChnZXRUcmFuc2ZlclR5cGUoKSkgewotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgotICAgICAgICAgICAgYnl0ZSBiZGF0YVtdOwotICAgICAgICAgICAgYnl0ZSBiYnVmW10gPSBudWxsOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKKyAgICAgICAgICAgICAgICBieXRlIGJkYXRhW107CisgICAgICAgICAgICAgICAgYnl0ZSBiYnVmW10gPSBudWxsOwogCi0gICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBiZGF0YSA9IG5ldyBieXRlW251bURhdGFFbGVtZW50cyAqIHcgKiBoXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYmRhdGEgPSAoYnl0ZVtdKSBvYmo7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGJkYXRhID0gbmV3IGJ5dGVbbnVtRGF0YUVsZW1lbnRzICogdyAqIGhdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJkYXRhID0gKGJ5dGVbXSlvYmo7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBmb3IgKGludCBpID0geTsgaSA8IHkgKyBoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0geDsgaiA8IHggKyB3OyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYmJ1ZiA9IChieXRlW10pIGdldERhdGFFbGVtZW50cyhqLCBpLCBiYnVmLCBkYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBudW1EYXRhRWxlbWVudHM7IG4rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgYmRhdGFbaWR4KytdID0gYmJ1ZltuXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0geTsgaSA8IHkgKyBoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHg7IGogPCB4ICsgdzsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiYnVmID0gKGJ5dGVbXSlnZXREYXRhRWxlbWVudHMoaiwgaSwgYmJ1ZiwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IG51bURhdGFFbGVtZW50czsgbisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmRhdGFbaWR4KytdID0gYmJ1ZltuXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9iaiA9IGJkYXRhOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgb2JqID0gYmRhdGE7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfU0hPUlQ6Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKLSAgICAgICAgICAgIHNob3J0IHNkYXRhW107Ci0gICAgICAgICAgICBzaG9ydCBzYnVmW10gPSBudWxsOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfU0hPUlQ6CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6CisgICAgICAgICAgICAgICAgc2hvcnQgc2RhdGFbXTsKKyAgICAgICAgICAgICAgICBzaG9ydCBzYnVmW10gPSBudWxsOwogCi0gICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZGF0YSA9IG5ldyBzaG9ydFtudW1EYXRhRWxlbWVudHMgKiB3ICogaF07Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNkYXRhID0gKHNob3J0W10pIG9iajsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2RhdGEgPSBuZXcgc2hvcnRbbnVtRGF0YUVsZW1lbnRzICogdyAqIGhdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNkYXRhID0gKHNob3J0W10pb2JqOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZm9yIChpbnQgaSA9IHk7IGkgPCB5ICsgaDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHg7IGogPCB4ICsgdzsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNidWYgPSAoc2hvcnRbXSkgZ2V0RGF0YUVsZW1lbnRzKGosIGksIHNidWYsIGRhdGEpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IG51bURhdGFFbGVtZW50czsgbisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZGF0YVtpZHgrK10gPSBzYnVmW25dOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSB5OyBpIDwgeSArIGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0geDsgaiA8IHggKyB3OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNidWYgPSAoc2hvcnRbXSlnZXREYXRhRWxlbWVudHMoaiwgaSwgc2J1ZiwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IG51bURhdGFFbGVtZW50czsgbisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2RhdGFbaWR4KytdID0gc2J1ZltuXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9iaiA9IHNkYXRhOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgb2JqID0gc2RhdGE7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgotICAgICAgICAgICAgaW50IGlkYXRhW107Ci0gICAgICAgICAgICBpbnQgaWJ1ZltdID0gbnVsbDsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKKyAgICAgICAgICAgICAgICBpbnQgaWRhdGFbXTsKKyAgICAgICAgICAgICAgICBpbnQgaWJ1ZltdID0gbnVsbDsKIAotICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWRhdGEgPSBuZXcgaW50W251bURhdGFFbGVtZW50cyAqIHcgKiBoXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWRhdGEgPSAoaW50W10pIG9iajsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWRhdGEgPSBuZXcgaW50W251bURhdGFFbGVtZW50cyAqIHcgKiBoXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZGF0YSA9IChpbnRbXSlvYmo7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBmb3IgKGludCBpID0geTsgaSA8IHkgKyBoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0geDsgaiA8IHggKyB3OyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWJ1ZiA9IChpbnRbXSkgZ2V0RGF0YUVsZW1lbnRzKGosIGksIGlidWYsIGRhdGEpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IG51bURhdGFFbGVtZW50czsgbisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZGF0YVtpZHgrK10gPSBpYnVmW25dOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSB5OyBpIDwgeSArIGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0geDsgaiA8IHggKyB3OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlidWYgPSAoaW50W10pZ2V0RGF0YUVsZW1lbnRzKGosIGksIGlidWYsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBudW1EYXRhRWxlbWVudHM7IG4rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkYXRhW2lkeCsrXSA9IGlidWZbbl07CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvYmogPSBpZGF0YTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIG9iaiA9IGlkYXRhOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0ZMT0FUOgotICAgICAgICAgICAgZmxvYXQgZmRhdGFbXTsKLSAgICAgICAgICAgIGZsb2F0IGZidWZbXSA9IG51bGw7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9GTE9BVDoKKyAgICAgICAgICAgICAgICBmbG9hdCBmZGF0YVtdOworICAgICAgICAgICAgICAgIGZsb2F0IGZidWZbXSA9IG51bGw7CiAKLSAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZkYXRhID0gbmV3IGZsb2F0W251bURhdGFFbGVtZW50cyAqIHcgKiBoXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmRhdGEgPSAoZmxvYXRbXSkgb2JqOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmZGF0YSA9IG5ldyBmbG9hdFtudW1EYXRhRWxlbWVudHMgKiB3ICogaF07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZmRhdGEgPSAoZmxvYXRbXSlvYmo7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBmb3IgKGludCBpID0geTsgaSA8IHkgKyBoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0geDsgaiA8IHggKyB3OyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZmJ1ZiA9IChmbG9hdFtdKSBnZXREYXRhRWxlbWVudHMoaiwgaSwgZmJ1ZiwgZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtRGF0YUVsZW1lbnRzOyBuKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZkYXRhW2lkeCsrXSA9IGZidWZbbl07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHk7IGkgPCB5ICsgaDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSB4OyBqIDwgeCArIHc7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgZmJ1ZiA9IChmbG9hdFtdKWdldERhdGFFbGVtZW50cyhqLCBpLCBmYnVmLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtRGF0YUVsZW1lbnRzOyBuKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZGF0YVtpZHgrK10gPSBmYnVmW25dOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgb2JqID0gZmRhdGE7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBvYmogPSBmZGF0YTsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICBkb3VibGUgZGRhdGFbXTsKLSAgICAgICAgICAgIGRvdWJsZSBkYnVmW10gPSBudWxsOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgICAgIGRvdWJsZSBkZGF0YVtdOworICAgICAgICAgICAgICAgIGRvdWJsZSBkYnVmW10gPSBudWxsOwogCi0gICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkZGF0YSA9IG5ldyBkb3VibGVbbnVtRGF0YUVsZW1lbnRzICogdyAqIGhdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkZGF0YSA9IChkb3VibGVbXSkgb2JqOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBkZGF0YSA9IG5ldyBkb3VibGVbbnVtRGF0YUVsZW1lbnRzICogdyAqIGhdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRkYXRhID0gKGRvdWJsZVtdKW9iajsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSB5OyBpIDwgeSArIGg7IGkrKykgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSB4OyBqIDwgeCArIHc7IGorKykgewotICAgICAgICAgICAgICAgICAgICBkYnVmID0gKGRvdWJsZVtdKSBnZXREYXRhRWxlbWVudHMoaiwgaSwgZGJ1ZiwgZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtRGF0YUVsZW1lbnRzOyBuKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRkYXRhW2lkeCsrXSA9IGRidWZbbl07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHk7IGkgPCB5ICsgaDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSB4OyBqIDwgeCArIHc7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgZGJ1ZiA9IChkb3VibGVbXSlnZXREYXRhRWxlbWVudHMoaiwgaSwgZGJ1ZiwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IG51bURhdGFFbGVtZW50czsgbisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGRhdGFbaWR4KytdID0gZGJ1ZltuXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9iaiA9IGRkYXRhOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgb2JqID0gZGRhdGE7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgfQogCkBAIC0yNDQsMTQwICsyNTgsMTQ1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGF0YSBmb3IgYSBzaW5nbGUgcGl4ZWwgaW4gdGhlIHNwZWNpZmllZCBEYXRhQnVmZmVyCi0gICAgICogZnJvbSBhIHByaW1pdGl2ZSBhcnJheSB3aXRoIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR5cGVzOiAKLSAgICAgKiBEYXRhQnVmZmVyLlRZUEVfQllURSwgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVCwgCi0gICAgICogRGF0YUJ1ZmZlci5UWVBFX0lOVCwgRGF0YUJ1ZmZlci5UWVBFX1NIT1JULCAKLSAgICAgKiBEYXRhQnVmZmVyLlRZUEVfRkxPQVQsIG9yIERhdGFCdWZmZXIuVFlQRV9ET1VCTEUuIAorICAgICAqIFNldHMgdGhlIGRhdGEgZm9yIGEgc2luZ2xlIHBpeGVsIGluIHRoZSBzcGVjaWZpZWQgRGF0YUJ1ZmZlciBmcm9tIGEKKyAgICAgKiBwcmltaXRpdmUgYXJyYXkgd2l0aCBvbmUgb2YgdGhlIGZvbGxvd2luZyB0eXBlczogRGF0YUJ1ZmZlci5UWVBFX0JZVEUsCisgICAgICogRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVCwgRGF0YUJ1ZmZlci5UWVBFX0lOVCwgRGF0YUJ1ZmZlci5UWVBFX1NIT1JULAorICAgICAqIERhdGFCdWZmZXIuVFlQRV9GTE9BVCwgb3IgRGF0YUJ1ZmZlci5UWVBFX0RPVUJMRS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHBpeGVsLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgcGl4ZWwuCi0gICAgICogQHBhcmFtIG9iaiB0aGUgT2JqZWN0IC0gdGhlIGFycmF5IG9mIHByaW1pdGl2ZSBwaXhlbCBkYXRhCi0gICAgICogdG8gYmUgc2V0LiAKLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiBwaXhlbC4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiBwaXhlbC4KKyAgICAgKiBAcGFyYW0gb2JqCisgICAgICogICAgICAgICAgICB0aGUgT2JqZWN0IC0gdGhlIGFycmF5IG9mIHByaW1pdGl2ZSBwaXhlbCBkYXRhIHRvIGJlIHNldC4KKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGRhdGEuCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RGF0YUVsZW1lbnRzKGludCB4LCBpbnQgeSwgT2JqZWN0IG9iaiwKLSAgICAgICAgICAgIERhdGFCdWZmZXIgZGF0YSk7CisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RGF0YUVsZW1lbnRzKGludCB4LCBpbnQgeSwgT2JqZWN0IG9iaiwgRGF0YUJ1ZmZlciBkYXRhKTsKIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRhdGEgZWxlbWVudHMgZm9yIGEgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMgaW4gCi0gICAgICogdGhlIHNwZWNpZmllZCBEYXRhQnVmZmVyIGZyb20gYSBwcmltaXRpdmUgYXJyYXkgd2l0aCBvbmUgb2YgCi0gICAgICogdGhlIGZvbGxvd2luZyB0eXBlczogRGF0YUJ1ZmZlci5UWVBFX0JZVEUsIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQsIAotICAgICAqIERhdGFCdWZmZXIuVFlQRV9JTlQsIERhdGFCdWZmZXIuVFlQRV9TSE9SVCwgCi0gICAgICogRGF0YUJ1ZmZlci5UWVBFX0ZMT0FULCBvciBEYXRhQnVmZmVyLlRZUEVfRE9VQkxFLiAKKyAgICAgKiBTZXRzIHRoZSBkYXRhIGVsZW1lbnRzIGZvciBhIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzIGluIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBEYXRhQnVmZmVyIGZyb20gYSBwcmltaXRpdmUgYXJyYXkgd2l0aCBvbmUgb2YgdGhlIGZvbGxvd2luZyB0eXBlczoKKyAgICAgKiBEYXRhQnVmZmVyLlRZUEVfQllURSwgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVCwgRGF0YUJ1ZmZlci5UWVBFX0lOVCwKKyAgICAgKiBEYXRhQnVmZmVyLlRZUEVfU0hPUlQsIERhdGFCdWZmZXIuVFlQRV9GTE9BVCwgb3IgRGF0YUJ1ZmZlci5UWVBFX0RPVUJMRS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIgYXJlYS4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIgYXJlYS4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSBvYmogdGhlIE9iamVjdCAtIHRoZSBhcnJheSBvZiBwcmltaXRpdmUgcGl4ZWwgZGF0YQotICAgICAqIHRvIGJlIHNldC4gCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhciBhcmVhLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIgYXJlYS4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIG9iagorICAgICAqICAgICAgICAgICAgdGhlIE9iamVjdCAtIHRoZSBhcnJheSBvZiBwcmltaXRpdmUgcGl4ZWwgZGF0YSB0byBiZSBzZXQuCisgICAgICogQHBhcmFtIGRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkYXRhLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERhdGFFbGVtZW50cyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgT2JqZWN0IG9iaiwKLSAgICAgICAgICAgIERhdGFCdWZmZXIgZGF0YSkgeworICAgIHB1YmxpYyB2b2lkIHNldERhdGFFbGVtZW50cyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgT2JqZWN0IG9iaiwgRGF0YUJ1ZmZlciBkYXRhKSB7CiAgICAgICAgIGludCBudW1EYXRhRWxlbWVudHMgPSBnZXROdW1EYXRhRWxlbWVudHMoKTsKICAgICAgICAgaW50IGlkeCA9IDA7CiAKICAgICAgICAgc3dpdGNoIChnZXRUcmFuc2ZlclR5cGUoKSkgewotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgotICAgICAgICAgICAgYnl0ZSBiYnVmW10gPSBuZXcgYnl0ZVtudW1EYXRhRWxlbWVudHNdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IHk7IGkgPCB5ICsgaDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHg7IGogPCB4ICsgdzsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtRGF0YUVsZW1lbnRzOyBuKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJidWZbbl0gPSAoKGJ5dGVbXSkgb2JqKVtpZHgrK107CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgorICAgICAgICAgICAgICAgIGJ5dGUgYmJ1ZltdID0gbmV3IGJ5dGVbbnVtRGF0YUVsZW1lbnRzXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0geTsgaSA8IHkgKyBoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHg7IGogPCB4ICsgdzsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IG51bURhdGFFbGVtZW50czsgbisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmJ1ZltuXSA9ICgoYnl0ZVtdKW9iailbaWR4KytdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGF0YUVsZW1lbnRzKGosIGksIGJidWYsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNldERhdGFFbGVtZW50cyhqLCBpLCBiYnVmLCBkYXRhKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1NIT1JUOgotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6Ci0gICAgICAgICAgICBzaG9ydCBzYnVmW10gPSBuZXcgc2hvcnRbbnVtRGF0YUVsZW1lbnRzXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSB5OyBpIDwgeSArIGg7IGkrKykgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSB4OyBqIDwgeCArIHc7IGorKykgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IG51bURhdGFFbGVtZW50czsgbisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYnVmW25dID0gKChzaG9ydFtdKSBvYmopW2lkeCsrXTsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1NIT1JUOgorICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgorICAgICAgICAgICAgICAgIHNob3J0IHNidWZbXSA9IG5ldyBzaG9ydFtudW1EYXRhRWxlbWVudHNdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSB5OyBpIDwgeSArIGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0geDsgaiA8IHggKyB3OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtRGF0YUVsZW1lbnRzOyBuKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnVmW25dID0gKChzaG9ydFtdKW9iailbaWR4KytdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGF0YUVsZW1lbnRzKGosIGksIHNidWYsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNldERhdGFFbGVtZW50cyhqLCBpLCBzYnVmLCBkYXRhKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6Ci0gICAgICAgICAgICBpbnQgaWJ1ZltdID0gbmV3IGludFtudW1EYXRhRWxlbWVudHNdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IHk7IGkgPCB5ICsgaDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHg7IGogPCB4ICsgdzsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtRGF0YUVsZW1lbnRzOyBuKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlidWZbbl0gPSAoKGludFtdKSBvYmopW2lkeCsrXTsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0lOVDoKKyAgICAgICAgICAgICAgICBpbnQgaWJ1ZltdID0gbmV3IGludFtudW1EYXRhRWxlbWVudHNdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSB5OyBpIDwgeSArIGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0geDsgaiA8IHggKyB3OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtRGF0YUVsZW1lbnRzOyBuKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpYnVmW25dID0gKChpbnRbXSlvYmopW2lkeCsrXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNldERhdGFFbGVtZW50cyhqLCBpLCBpYnVmLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXREYXRhRWxlbWVudHMoaiwgaSwgaWJ1ZiwgZGF0YSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfRkxPQVQ6Ci0gICAgICAgICAgICBmbG9hdCBmYnVmW10gPSBuZXcgZmxvYXRbbnVtRGF0YUVsZW1lbnRzXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSB5OyBpIDwgeSArIGg7IGkrKykgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSB4OyBqIDwgeCArIHc7IGorKykgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IG51bURhdGFFbGVtZW50czsgbisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmYnVmW25dID0gKChmbG9hdFtdKSBvYmopW2lkeCsrXTsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0ZMT0FUOgorICAgICAgICAgICAgICAgIGZsb2F0IGZidWZbXSA9IG5ldyBmbG9hdFtudW1EYXRhRWxlbWVudHNdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSB5OyBpIDwgeSArIGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0geDsgaiA8IHggKyB3OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtRGF0YUVsZW1lbnRzOyBuKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYnVmW25dID0gKChmbG9hdFtdKW9iailbaWR4KytdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGF0YUVsZW1lbnRzKGosIGksIGZidWYsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNldERhdGFFbGVtZW50cyhqLCBpLCBmYnVmLCBkYXRhKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICBkb3VibGUgZGJ1ZltdID0gbmV3IGRvdWJsZVtudW1EYXRhRWxlbWVudHNdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IHk7IGkgPCB5ICsgaDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHg7IGogPCB4ICsgdzsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtRGF0YUVsZW1lbnRzOyBuKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRidWZbbl0gPSAoKGRvdWJsZVtdKSBvYmopW2lkeCsrXTsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0RPVUJMRToKKyAgICAgICAgICAgICAgICBkb3VibGUgZGJ1ZltdID0gbmV3IGRvdWJsZVtudW1EYXRhRWxlbWVudHNdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSB5OyBpIDwgeSArIGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0geDsgaiA8IHggKyB3OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtRGF0YUVsZW1lbnRzOyBuKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnVmW25dID0gKChkb3VibGVbXSlvYmopW2lkeCsrXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNldERhdGFFbGVtZW50cyhqLCBpLCBkYnVmLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXREYXRhRWxlbWVudHMoaiwgaSwgZGJ1ZiwgZGF0YSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgU2FtcGxlTW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIGJhbmRzIG9mIAotICAgICAqIHRoaXMgU2FtcGxlTW9kZWwuCisgICAgICogQ3JlYXRlcyBhIG5ldyBTYW1wbGVNb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgYmFuZHMgb2YgdGhpcyBTYW1wbGVNb2RlbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYmFuZHMgdGhlIGFycmF5IG9mIGJhbmRzIGZyb20gdGhpcyBTYW1wbGVNb2RlbC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBTYW1wbGVNb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgYmFuZHMgb2YgCi0gICAgICogdGhpcyBTYW1wbGVNb2RlbC4KKyAgICAgKiBAcGFyYW0gYmFuZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBiYW5kcyBmcm9tIHRoaXMgU2FtcGxlTW9kZWwuCisgICAgICogQHJldHVybiB0aGUgU2FtcGxlTW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIGJhbmRzIG9mIHRoaXMgU2FtcGxlTW9kZWwuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFNhbXBsZU1vZGVsIGNyZWF0ZVN1YnNldFNhbXBsZU1vZGVsKGludCBiYW5kc1tdKTsKIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIFNhbXBsZU1vZGVsIHdoaWNoIGhhcyB0aGUgc2FtZSBkYXRhIGFzIGluIAotICAgICAqIHRoaXMgU2FtcGxlTW9kZWwgd2l0aCBhIGRpZmZlcmVudCB3aWR0aCBhbmQgaGVpZ2h0LgorICAgICAqIENyZWF0ZXMgdGhlIFNhbXBsZU1vZGVsIHdoaWNoIGhhcyB0aGUgc2FtZSBkYXRhIGFzIGluIHRoaXMgU2FtcGxlTW9kZWwKKyAgICAgKiB3aXRoIGEgZGlmZmVyZW50IHdpZHRoIGFuZCBoZWlnaHQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGEwIHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gYTEgdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBTYW1wbGVNb2RlbCB3aGljaCBoYXMgdGhlIHNhbWUgZGF0YSBhcyBpbiAKLSAgICAgKiB0aGlzIFNhbXBsZU1vZGVsIHdpdGggYSBkaWZmZXJlbnQgd2lkdGggYW5kIGhlaWdodC4KKyAgICAgKiBAcGFyYW0gYTAKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gYTEKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHJldHVybiB0aGUgU2FtcGxlTW9kZWwgd2hpY2ggaGFzIHRoZSBzYW1lIGRhdGEgYXMgaW4gdGhpcyBTYW1wbGVNb2RlbAorICAgICAqICAgICAgICAgd2l0aCBhIGRpZmZlcmVudCB3aWR0aCBhbmQgaGVpZ2h0LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTYW1wbGVNb2RlbCBjcmVhdGVDb21wYXRpYmxlU2FtcGxlTW9kZWwoaW50IGEwLCBpbnQgYTEpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgc2FtcGxlcyBvZiB0aGUgc3BlY2lmaWVkIHBpeGVsIGFzIGEgaW50IGFycmF5LgorICAgICAqIEdldHMgdGhlIHNhbXBsZXMgb2YgdGhlIHNwZWNpZmllZCBwaXhlbCBhcyBhbiBpbnRlZ2VyIGFycmF5LgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgcGl4ZWwuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiBwaXhlbC4KLSAgICAgKiBAcGFyYW0gaUFycmF5IHRoZSBpbnQgYXJyYXkgd2hlcmUgcmVzdWx0IHdpbGwgYmUgc3RvcmVkLgotICAgICAqIEBwYXJhbSBkYXRhIHRoZSBpbWFnZSBkYXRhLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGludCBhcnJheSB3aXRoIHRoZSBzYW1wbGVzIG9mIHRoZSBzcGVjaWZpZWQgcGl4ZWwuCi0KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiBwaXhlbC4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiBwaXhlbC4KKyAgICAgKiBAcGFyYW0gaUFycmF5CisgICAgICogICAgICAgICAgICB0aGUgaW50ZWdlciBhcnJheSB3aGVyZSByZXN1bHQgd2lsbCBiZSBzdG9yZWQuCisgICAgICogQHBhcmFtIGRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEByZXR1cm4gdGhlIGludGVnZXIgYXJyYXkgd2l0aCB0aGUgc2FtcGxlcyBvZiB0aGUgc3BlY2lmaWVkIHBpeGVsLgogICAgICAqLwogICAgIHB1YmxpYyBpbnRbXSBnZXRQaXhlbChpbnQgeCwgaW50IHksIGludCBpQXJyYXlbXSwgRGF0YUJ1ZmZlciBkYXRhKSB7CiAgICAgICAgIGlmICh4IDwgMCB8fCB5IDwgMCB8fCB4ID49IHRoaXMud2lkdGggfHwgeSA+PSB0aGlzLmhlaWdodCkgewpAQCAtNDAwLDEyICs0MTksMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIGEgcGl4ZWwgb2YgdGhlIERhdGFCdWZmZXIgZnJvbSBhIGludCBhcnJheSBvZiBzYW1wbGVzLiAKKyAgICAgKiBTZXRzIGEgcGl4ZWwgb2YgdGhlIERhdGFCdWZmZXIgZnJvbSBhIGludGVnZXIgYXJyYXkgb2Ygc2FtcGxlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHBpeGVsLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgcGl4ZWwuCi0gICAgICogQHBhcmFtIGlBcnJheSB0aGUgaW50IGFycmF5LgotICAgICAqIEBwYXJhbSBkYXRhIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHBpeGVsLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHBpeGVsLgorICAgICAqIEBwYXJhbSBpQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlZ2VyIGFycmF5LgorICAgICAqIEBwYXJhbSBkYXRhCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgZGF0YS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQaXhlbChpbnQgeCwgaW50IHksIGludCBpQXJyYXlbXSwgRGF0YUJ1ZmZlciBkYXRhKSB7CiAgICAgICAgIGlmICh4IDwgMCB8fCB5IDwgMCB8fCB4ID49IHRoaXMud2lkdGggfHwgeSA+PSB0aGlzLmhlaWdodCkgewpAQCAtNDIwLDExICs0NDMsMTQgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBzYW1wbGVzIG9mIHRoZSBzcGVjaWZpZWQgcGl4ZWwgYXMgYSBmbG9hdCBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHBpeGVsLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgcGl4ZWwuCi0gICAgICogQHBhcmFtIGZBcnJheSB0aGUgZmxvYXQgYXJyYXkgd2hlcmUgcmVzdWx0IHdpbGwgYmUgc3RvcmVkLgotICAgICAqIEBwYXJhbSBkYXRhIHRoZSBpbWFnZSBkYXRhLgotICAgICAqIAorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHBpeGVsLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHBpeGVsLgorICAgICAqIEBwYXJhbSBmQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdCBhcnJheSB3aGVyZSByZXN1bHQgd2lsbCBiZSBzdG9yZWQuCisgICAgICogQHBhcmFtIGRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkYXRhLgogICAgICAqIEByZXR1cm4gdGhlIGZsb2F0IGFycmF5IHdpdGggdGhlIHNhbXBsZXMgb2YgdGhlIHNwZWNpZmllZCBwaXhlbC4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXRbXSBnZXRQaXhlbChpbnQgeCwgaW50IHksIGZsb2F0IGZBcnJheVtdLCBEYXRhQnVmZmVyIGRhdGEpIHsKQEAgLTQ0OCwxMiArNDc0LDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyBhIHBpeGVsIG9mIHRoZSBEYXRhQnVmZmVyIGZyb20gYSBmbG9hdCBhcnJheSBvZiBzYW1wbGVzLiAKKyAgICAgKiBTZXRzIGEgcGl4ZWwgb2YgdGhlIERhdGFCdWZmZXIgZnJvbSBhIGZsb2F0IGFycmF5IG9mIHNhbXBsZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiBwaXhlbC4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHBpeGVsLgotICAgICAqIEBwYXJhbSBmQXJyYXkgdGhlIGZsb2F0IGFycmF5LgotICAgICAqIEBwYXJhbSBkYXRhIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHBpeGVsLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHBpeGVsLgorICAgICAqIEBwYXJhbSBmQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdCBhcnJheS4KKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGRhdGEuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UGl4ZWwoaW50IHgsIGludCB5LCBmbG9hdCBmQXJyYXlbXSwgRGF0YUJ1ZmZlciBkYXRhKSB7CiAgICAgICAgIGlmICh4IDwgMCB8fCB5IDwgMCB8fCB4ID49IHRoaXMud2lkdGggfHwgeSA+PSB0aGlzLmhlaWdodCkgewpAQCAtNDY4LDExICs0OTgsMTQgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBzYW1wbGVzIG9mIHRoZSBzcGVjaWZpZWQgcGl4ZWwgYXMgYSBkb3VibGUgYXJyYXkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiBwaXhlbC4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHBpeGVsLgotICAgICAqIEBwYXJhbSBkQXJyYXkgdGhlIGRvdWJsZSBhcnJheSB3aGVyZSByZXN1bHQgd2lsbCBiZSBzdG9yZWQuCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGltYWdlIGRhdGEuCi0gICAgICogCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgcGl4ZWwuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgcGl4ZWwuCisgICAgICogQHBhcmFtIGRBcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGRvdWJsZSBhcnJheSB3aGVyZSByZXN1bHQgd2lsbCBiZSBzdG9yZWQuCisgICAgICogQHBhcmFtIGRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkYXRhLgogICAgICAqIEByZXR1cm4gdGhlIGRvdWJsZSBhcnJheSB3aXRoIHRoZSBzYW1wbGVzIG9mIHRoZSBzcGVjaWZpZWQgcGl4ZWwuCiAgICAgICovCiAgICAgcHVibGljIGRvdWJsZVtdIGdldFBpeGVsKGludCB4LCBpbnQgeSwgZG91YmxlIGRBcnJheVtdLCBEYXRhQnVmZmVyIGRhdGEpIHsKQEAgLTQ5NiwxMiArNTI5LDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyBhIHBpeGVsIG9mIHRoZSBEYXRhQnVmZmVyIGZyb20gYSBkb3VibGUgYXJyYXkgb2Ygc2FtcGxlcy4gCisgICAgICogU2V0cyBhIHBpeGVsIG9mIHRoZSBEYXRhQnVmZmVyIGZyb20gYSBkb3VibGUgYXJyYXkgb2Ygc2FtcGxlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHBpeGVsLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgcGl4ZWwuCi0gICAgICogQHBhcmFtIGRBcnJheSB0aGUgZG91YmxlIGFycmF5LgotICAgICAqIEBwYXJhbSBkYXRhIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHBpeGVsLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHBpeGVsLgorICAgICAqIEBwYXJhbSBkQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBkb3VibGUgYXJyYXkuCisgICAgICogQHBhcmFtIGRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFBpeGVsKGludCB4LCBpbnQgeSwgZG91YmxlIGRBcnJheVtdLCBEYXRhQnVmZmVyIGRhdGEpIHsKICAgICAgICAgaWYgKHggPCAwIHx8IHkgPCAwIHx8IHggPj0gdGhpcy53aWR0aCB8fCB5ID49IHRoaXMuaGVpZ2h0KSB7CkBAIC01MTQsNDMgKzU1MSw0OSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNhbXBsZSBvZiBhIHNwZWNpZmllZCBiYW5kIGZvciB0aGUgc3BlY2lmaWVkIHBpeGVsCi0gICAgICogYXMgYW4gaW50LgorICAgICAqIEdldHMgdGhlIHNhbXBsZSBvZiBhIHNwZWNpZmllZCBiYW5kIGZvciB0aGUgc3BlY2lmaWVkIHBpeGVsIGFzIGFuCisgICAgICogaW50ZWdlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHBpeGVsLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgcGl4ZWwuCi0gICAgICogQHBhcmFtIGIgdGhlIHNwZWNpZmllZCBiYW5kLgotICAgICAqIEBwYXJhbSBkYXRhIHRoZSBpbWFnZSBkYXRhLgotICAgICAqIAorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHBpeGVsLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHBpeGVsLgorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGJhbmQuCisgICAgICogQHBhcmFtIGRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkYXRhLgogICAgICAqIEByZXR1cm4gdGhlIHNhbXBsZSBvZiBhIHNwZWNpZmllZCBiYW5kIGZvciB0aGUgc3BlY2lmaWVkIHBpeGVsLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0U2FtcGxlKGludCB4LCBpbnQgeSwgaW50IGIsIERhdGFCdWZmZXIgZGF0YSk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzYW1wbGUgb2YgYSBzcGVjaWZpZWQgYmFuZCBmb3IgdGhlIHNwZWNpZmllZCBwaXhlbAotICAgICAqIGFzIGEgZmxvYXQuCisgICAgICogR2V0cyB0aGUgc2FtcGxlIG9mIGEgc3BlY2lmaWVkIGJhbmQgZm9yIHRoZSBzcGVjaWZpZWQgcGl4ZWwgYXMgYSBmbG9hdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHBpeGVsLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgcGl4ZWwuCi0gICAgICogQHBhcmFtIGIgdGhlIHNwZWNpZmllZCBiYW5kLgotICAgICAqIEBwYXJhbSBkYXRhIHRoZSBpbWFnZSBkYXRhLgotICAgICAqIAorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHBpeGVsLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHBpeGVsLgorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGJhbmQuCisgICAgICogQHBhcmFtIGRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkYXRhLgogICAgICAqIEByZXR1cm4gdGhlIHNhbXBsZSBvZiBhIHNwZWNpZmllZCBiYW5kIGZvciB0aGUgc3BlY2lmaWVkIHBpeGVsLgotCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldFNhbXBsZUZsb2F0KGludCB4LCBpbnQgeSwgaW50IGIsIERhdGFCdWZmZXIgZGF0YSkgewogICAgICAgICByZXR1cm4gZ2V0U2FtcGxlKHgsIHksIGIsIGRhdGEpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNhbXBsZSBvZiBhIHNwZWNpZmllZCBiYW5kIGZvciB0aGUgc3BlY2lmaWVkIHBpeGVsCi0gICAgICogYXMgYSBkb3VibGUuCisgICAgICogR2V0cyB0aGUgc2FtcGxlIG9mIGEgc3BlY2lmaWVkIGJhbmQgZm9yIHRoZSBzcGVjaWZpZWQgcGl4ZWwgYXMgYSBkb3VibGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiBwaXhlbC4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHBpeGVsLgotICAgICAqIEBwYXJhbSBiIHRoZSBzcGVjaWZpZWQgYmFuZC4KLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiBwaXhlbC4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiBwaXhlbC4KKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBiYW5kLgorICAgICAqIEBwYXJhbSBkYXRhCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgZGF0YS4KICAgICAgKiBAcmV0dXJuIHRoZSBzYW1wbGUgb2YgYSBzcGVjaWZpZWQgYmFuZCBmb3IgdGhlIHNwZWNpZmllZCBwaXhlbC4KICAgICAgKi8KICAgICBwdWJsaWMgZG91YmxlIGdldFNhbXBsZURvdWJsZShpbnQgeCwgaW50IHksIGludCBiLCBEYXRhQnVmZmVyIGRhdGEpIHsKQEAgLTU1OCwyMSArNjAxLDI1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgc2FtcGxlcyBvZiB0aGUgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzCi0gICAgICogYXMgYSBpbnQgYXJyYXkuCisgICAgICogR2V0cyB0aGUgc2FtcGxlcyBvZiB0aGUgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzIGFzIGFuCisgICAgICogaW50ZWdlciBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIGlBcnJheSB0aGUgaW50IGFycmF5IHdoZXJlIHJlc3VsdCB3aWxsIGJlIHN0b3JlZC4KLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnQgYXJyYXkgd2l0aCB0aGUgc2FtcGxlcyBvZiB0aGUgc3BlY2lmaWVkIAotICAgICAqIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIGlBcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGludGVnZXIgYXJyYXkgd2hlcmUgcmVzdWx0IHdpbGwgYmUgc3RvcmVkLgorICAgICAqIEBwYXJhbSBkYXRhCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnRlZ2VyIGFycmF5IHdpdGggdGhlIHNhbXBsZXMgb2YgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhcgorICAgICAqICAgICAgICAgYXJlYSBvZiBwaXhlbHMuCiAgICAgICovCi0gICAgcHVibGljIGludFtdIGdldFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGlBcnJheVtdLAotICAgICAgICAgICAgRGF0YUJ1ZmZlciBkYXRhKSB7CisgICAgcHVibGljIGludFtdIGdldFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGlBcnJheVtdLCBEYXRhQnVmZmVyIGRhdGEpIHsKICAgICAgICAgaWYgKHggPCAwIHx8IHkgPCAwIHx8IHggKyB3ID4gdGhpcy53aWR0aCB8fCB5ICsgaCA+IHRoaXMuaGVpZ2h0KSB7CiAgICAgICAgICAgICAvLyBhd3QuNjM9Q29vcmRpbmF0ZXMgYXJlIG5vdCBpbiBib3VuZHMKICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNjMiKSk7IC8vJE5PTi1OTFMtMSQKQEAgLTU5NywxOCArNjQ0LDIzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyBhbGwgb2YgdGhlIHNhbXBsZXMgZm9yIGEgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMgb2YgdGhlIERhdGFCdWZmZXIKLSAgICAgKiBmcm9tIGFuIGludCBhcnJheS4gCisgICAgICogU2V0cyBhbGwgb2YgdGhlIHNhbXBsZXMgZm9yIGEgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMgb2YgdGhlCisgICAgICogRGF0YUJ1ZmZlciBmcm9tIGFuIGludGVnZXIgYXJyYXkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSBpQXJyYXkgdGhlIGludCBhcnJheS4KLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBpQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlZ2VyIGFycmF5LgorICAgICAqIEBwYXJhbSBkYXRhCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgZGF0YS4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBpQXJyYXlbXSwKLSAgICAgICAgICAgIERhdGFCdWZmZXIgZGF0YSkgeworICAgIHB1YmxpYyB2b2lkIHNldFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGlBcnJheVtdLCBEYXRhQnVmZmVyIGRhdGEpIHsKICAgICAgICAgaWYgKHggPCAwIHx8IHkgPCAwIHx8IHggKyB3ID4gdGhpcy53aWR0aCB8fCB5ICsgaCA+IHRoaXMuaGVpZ2h0KSB7CiAgICAgICAgICAgICAvLyBhd3QuNjM9Q29vcmRpbmF0ZXMgYXJlIG5vdCBpbiBib3VuZHMKICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNjMiKSk7IC8vJE5PTi1OTFMtMSQKQEAgLTYyNCwyMSArNjc2LDI1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgc2FtcGxlcyBvZiB0aGUgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzIAotICAgICAqIGFzIGEgZmxvYXQgYXJyYXkuCisgICAgICogR2V0cyB0aGUgc2FtcGxlcyBvZiB0aGUgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzIGFzIGEgZmxvYXQKKyAgICAgKiBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIGZBcnJheSB0aGUgZmxvYXQgYXJyYXkgd2hlcmUgcmVzdWx0IHdpbGwgYmUgc3RvcmVkLgotICAgICAqIEBwYXJhbSBkYXRhIHRoZSBpbWFnZSBkYXRhLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZsb2F0IGFycmF5IHdpdGggdGhlIHNhbXBsZXMgb2YgdGhlIHNwZWNpZmllZCAKLSAgICAgKiByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBmQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdCBhcnJheSB3aGVyZSByZXN1bHQgd2lsbCBiZSBzdG9yZWQuCisgICAgICogQHBhcmFtIGRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEByZXR1cm4gdGhlIGZsb2F0IGFycmF5IHdpdGggdGhlIHNhbXBsZXMgb2YgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhcgorICAgICAqICAgICAgICAgYXJlYSBvZiBwaXhlbHMuCiAgICAgICovCi0gICAgcHVibGljIGZsb2F0W10gZ2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBmbG9hdCBmQXJyYXlbXSwKLSAgICAgICAgICAgIERhdGFCdWZmZXIgZGF0YSkgeworICAgIHB1YmxpYyBmbG9hdFtdIGdldFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgZmxvYXQgZkFycmF5W10sIERhdGFCdWZmZXIgZGF0YSkgewogICAgICAgICBpZiAoeCA8IDAgfHwgeSA8IDAgfHwgeCArIHcgPiB0aGlzLndpZHRoIHx8IHkgKyBoID4gdGhpcy5oZWlnaHQpIHsKICAgICAgICAgICAgIC8vIGF3dC42Mz1Db29yZGluYXRlcyBhcmUgbm90IGluIGJvdW5kcwogICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC42MyIpKTsgLy8kTk9OLU5MUy0xJApAQCAtNjYzLDE4ICs3MTksMjMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIGFsbCBvZiB0aGUgc2FtcGxlcyBmb3IgYSByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscyBvZiB0aGUgRGF0YUJ1ZmZlcgotICAgICAqIGZyb20gYSBmbG9hdCBhcnJheS4gCisgICAgICogU2V0cyBhbGwgb2YgdGhlIHNhbXBsZXMgZm9yIGEgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMgb2YgdGhlCisgICAgICogRGF0YUJ1ZmZlciBmcm9tIGEgZmxvYXQgYXJyYXkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSBmQXJyYXkgdGhlIGZsb2F0IGFycmF5LgotICAgICAqIEBwYXJhbSBkYXRhIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIGZBcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGZsb2F0IGFycmF5LgorICAgICAqIEBwYXJhbSBkYXRhCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgZGF0YS4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGZsb2F0IGZBcnJheVtdLAotICAgICAgICAgICAgRGF0YUJ1ZmZlciBkYXRhKSB7CisgICAgcHVibGljIHZvaWQgc2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBmbG9hdCBmQXJyYXlbXSwgRGF0YUJ1ZmZlciBkYXRhKSB7CiAgICAgICAgIGlmICh4IDwgMCB8fCB5IDwgMCB8fCB4ICsgdyA+IHRoaXMud2lkdGggfHwgeSArIGggPiB0aGlzLmhlaWdodCkgewogICAgICAgICAgICAgLy8gYXd0LjYzPUNvb3JkaW5hdGVzIGFyZSBub3QgaW4gYm91bmRzCiAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjYzIikpOyAvLyROT04tTkxTLTEkCkBAIC02OTAsMjEgKzc1MSwyNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNhbXBsZXMgb2YgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhciBhcmVhIG9mIHBpeGVscyAKLSAgICAgKiBhcyBhIGRvdWJsZSBhcnJheS4KKyAgICAgKiBHZXRzIHRoZSBzYW1wbGVzIG9mIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMgYXMgYSBkb3VibGUKKyAgICAgKiBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIGRBcnJheSB0aGUgZG91YmxlIGFycmF5IHdoZXJlIHJlc3VsdCB3aWxsIGJlIHN0b3JlZC4KLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkb3VibGUgYXJyYXkgd2l0aCB0aGUgc2FtcGxlcyBvZiB0aGUgc3BlY2lmaWVkIAotICAgICAqIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIGRBcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGRvdWJsZSBhcnJheSB3aGVyZSByZXN1bHQgd2lsbCBiZSBzdG9yZWQuCisgICAgICogQHBhcmFtIGRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEByZXR1cm4gdGhlIGRvdWJsZSBhcnJheSB3aXRoIHRoZSBzYW1wbGVzIG9mIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIKKyAgICAgKiAgICAgICAgIGFyZWEgb2YgcGl4ZWxzLgogICAgICAqLwotICAgIHB1YmxpYyBkb3VibGVbXSBnZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGRvdWJsZSBkQXJyYXlbXSwKLSAgICAgICAgICAgIERhdGFCdWZmZXIgZGF0YSkgeworICAgIHB1YmxpYyBkb3VibGVbXSBnZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGRvdWJsZSBkQXJyYXlbXSwgRGF0YUJ1ZmZlciBkYXRhKSB7CiAgICAgICAgIGlmICh4IDwgMCB8fCB5IDwgMCB8fCB4ICsgdyA+IHRoaXMud2lkdGggfHwgeSArIGggPiB0aGlzLmhlaWdodCkgewogICAgICAgICAgICAgLy8gYXd0LjYzPUNvb3JkaW5hdGVzIGFyZSBub3QgaW4gYm91bmRzCiAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjYzIikpOyAvLyROT04tTkxTLTEkCkBAIC03MjksMTggKzc5NCwyMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgYWxsIG9mIHRoZSBzYW1wbGVzIGZvciBhIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzIG9mIHRoZSBEYXRhQnVmZmVyCi0gICAgICogZnJvbSBhIGRvdWJsZSBhcnJheS4gCisgICAgICogU2V0cyBhbGwgb2YgdGhlIHNhbXBsZXMgZm9yIGEgcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMgb2YgdGhlCisgICAgICogRGF0YUJ1ZmZlciBmcm9tIGEgZG91YmxlIGFycmF5LgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gZEFycmF5IHRoZSBkb3VibGUgYXJyYXkuCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gZEFycmF5CisgICAgICogICAgICAgICAgICB0aGUgZG91YmxlIGFycmF5LgorICAgICAqIEBwYXJhbSBkYXRhCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgZGF0YS4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGRvdWJsZSBkQXJyYXlbXSwKLSAgICAgICAgICAgIERhdGFCdWZmZXIgZGF0YSkgeworICAgIHB1YmxpYyB2b2lkIHNldFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgZG91YmxlIGRBcnJheVtdLCBEYXRhQnVmZmVyIGRhdGEpIHsKICAgICAgICAgaWYgKHggPCAwIHx8IHkgPCAwIHx8IHggKyB3ID4gdGhpcy53aWR0aCB8fCB5ICsgaCA+IHRoaXMuaGVpZ2h0KSB7CiAgICAgICAgICAgICAvLyBhd3QuNjM9Q29vcmRpbmF0ZXMgYXJlIG5vdCBpbiBib3VuZHMKICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNjMiKSk7IC8vJE5PTi1OTFMtMSQKQEAgLTc1NiwzNCArODI2LDQ0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyBhIHNhbXBsZSBvZiB0aGUgc3BlY2lmaWVkIGJhbmQgZm9yIHRoZSBzcGVjaWZpZWQgcGl4ZWwKLSAgICAgKiBpbiB0aGUgRGF0YUJ1ZmZlciBhcyBpbnQgdmFsdWUuCisgICAgICogU2V0cyBhIHNhbXBsZSBvZiB0aGUgc3BlY2lmaWVkIGJhbmQgZm9yIHRoZSBzcGVjaWZpZWQgcGl4ZWwgaW4gdGhlCisgICAgICogRGF0YUJ1ZmZlciBhcyBpbnRlZ2VyIHZhbHVlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLgotICAgICAqIEBwYXJhbSBiIHRoZSBzcGVjaWZpZWQgYmFuZC4KLSAgICAgKiBAcGFyYW0gcyB0aGUgc2FtcGxlIGFzIGFuIGludCB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLgorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGJhbmQuCisgICAgICogQHBhcmFtIHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzYW1wbGUgYXMgYW4gaW50ZWdlciB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGRhdGEuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U2FtcGxlKGludCB4LCBpbnQgeSwgaW50IGIsIGludCBzLCBEYXRhQnVmZmVyIGRhdGEpOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgc2FtcGxlcyBvZiBhIHNwZWNpZmllZCBiYW5kIGZvciBhIHNwZWNpZmllZCByZWN0YW5ndWxhcgotICAgICAqIGFyZWEgb2YgcGl4ZWxzIGFzIGEgaW50IGFycmF5LgorICAgICAqIEdldHMgdGhlIHNhbXBsZXMgb2YgYSBzcGVjaWZpZWQgYmFuZCBmb3IgYSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIgYXJlYSBvZgorICAgICAqIHBpeGVscyBhcyBhIGludGVnZXIgYXJyYXkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIGIgdGhlIHNwZWNpZmllZCBiYW5kLgotICAgICAqIEBwYXJhbSBpQXJyYXkgdGhlIGludCBhcnJheSB3aGVyZSByZXN1bHQgd2lsbCBiZSBzdG9yZWQuCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGltYWdlIGRhdGEuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2FtcGxlcyBvZiBhIHNwZWNpZmllZCBiYW5kIGZvciBhIHNwZWNpZmllZCByZWN0YW5ndWxhcgotICAgICAqIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBiYW5kLgorICAgICAqIEBwYXJhbSBpQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlZ2VyIGFycmF5IHdoZXJlIHJlc3VsdCB3aWxsIGJlIHN0b3JlZC4KKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHJldHVybiB0aGUgc2FtcGxlcyBvZiBhIHNwZWNpZmllZCBiYW5kIGZvciBhIHNwZWNpZmllZCByZWN0YW5ndWxhciBhcmVhCisgICAgICogICAgICAgICBvZiBwaXhlbHMuCiAgICAgICovCi0gICAgcHVibGljIGludFtdIGdldFNhbXBsZXMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBiLCBpbnQgaUFycmF5W10sCi0gICAgICAgICAgICBEYXRhQnVmZmVyIGRhdGEpIHsKKyAgICBwdWJsaWMgaW50W10gZ2V0U2FtcGxlcyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGIsIGludCBpQXJyYXlbXSwgRGF0YUJ1ZmZlciBkYXRhKSB7CiAgICAgICAgIGludCBzYW1wbGVzW107CiAgICAgICAgIGludCBpZHggPSAwOwogCkBAIC04MDMsMTkgKzg4MywyNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHNhbXBsZXMgZnJvbSBhbiBpbnQgYXJyYXkgaW4gdGhlIHNwZWNpZmllZCBiYW5kIGZvciAKLSAgICAgKiB0aGUgc3BlY2lmaWVkIHJlY3RhbmdsZSBvZiBwaXhlbHMuCisgICAgICogU2V0cyB0aGUgc2FtcGxlcyBmcm9tIGFuIGludGVnZXIgYXJyYXkgaW4gdGhlIHNwZWNpZmllZCBiYW5kIGZvciB0aGUKKyAgICAgKiBzcGVjaWZpZWQgcmVjdGFuZ2xlIG9mIHBpeGVscy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gYiB0aGUgc3BlY2lmaWVkIGJhbmQuCi0gICAgICogQHBhcmFtIGlBcnJheSB0aGUgaW50IGFycmF5LgotICAgICAqIEBwYXJhbSBkYXRhIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBiYW5kLgorICAgICAqIEBwYXJhbSBpQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlZ2VyIGFycmF5LgorICAgICAqIEBwYXJhbSBkYXRhCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgZGF0YS4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTYW1wbGVzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgYiwgaW50IGlBcnJheVtdLAotICAgICAgICAgICAgRGF0YUJ1ZmZlciBkYXRhKSB7CisgICAgcHVibGljIHZvaWQgc2V0U2FtcGxlcyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGIsIGludCBpQXJyYXlbXSwgRGF0YUJ1ZmZlciBkYXRhKSB7CiAgICAgICAgIGludCBpZHggPSAwOwogICAgICAgICBmb3IgKGludCBpID0geTsgaSA8IHkgKyBoOyBpKyspIHsKICAgICAgICAgICAgIGZvciAoaW50IGogPSB4OyBqIDwgeCArIHc7IGorKykgewpAQCAtODI1LDIyICs5MTEsMjcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzYW1wbGVzIG9mIGEgc3BlY2lmaWVkIGJhbmQgZm9yIGEgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyCi0gICAgICogYXJlYSBvZiBwaXhlbHMgYXMgYSBmbG9hdCBhcnJheS4KKyAgICAgKiBHZXRzIHRoZSBzYW1wbGVzIG9mIGEgc3BlY2lmaWVkIGJhbmQgZm9yIGEgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyIGFyZWEgb2YKKyAgICAgKiBwaXhlbHMgYXMgYSBmbG9hdCBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gYiB0aGUgc3BlY2lmaWVkIGJhbmQuCi0gICAgICogQHBhcmFtIGZBcnJheSB0aGUgZmxvYXQgYXJyYXkgd2hlcmUgcmVzdWx0IHdpbGwgYmUgc3RvcmVkLgotICAgICAqIEBwYXJhbSBkYXRhIHRoZSBpbWFnZSBkYXRhLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNhbXBsZXMgb2YgYSBzcGVjaWZpZWQgYmFuZCBmb3IgYSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIKLSAgICAgKiBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgYmFuZC4KKyAgICAgKiBAcGFyYW0gZkFycmF5CisgICAgICogICAgICAgICAgICB0aGUgZmxvYXQgYXJyYXkgd2hlcmUgcmVzdWx0IHdpbGwgYmUgc3RvcmVkLgorICAgICAqIEBwYXJhbSBkYXRhCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcmV0dXJuIHRoZSBzYW1wbGVzIG9mIGEgc3BlY2lmaWVkIGJhbmQgZm9yIGEgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyIGFyZWEKKyAgICAgKiAgICAgICAgIG9mIHBpeGVscy4KICAgICAgKi8KLSAgICBwdWJsaWMgZmxvYXRbXSBnZXRTYW1wbGVzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgYiwKLSAgICAgICAgICAgIGZsb2F0IGZBcnJheVtdLCBEYXRhQnVmZmVyIGRhdGEpIHsKKyAgICBwdWJsaWMgZmxvYXRbXSBnZXRTYW1wbGVzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgYiwgZmxvYXQgZkFycmF5W10sIERhdGFCdWZmZXIgZGF0YSkgewogICAgICAgICBmbG9hdCBzYW1wbGVzW107CiAgICAgICAgIGludCBpZHggPSAwOwogCkBAIC04NjAsMTkgKzk1MSwyNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHNhbXBsZXMgZnJvbSBhbiBmbG9hdCBhcnJheSBpbiB0aGUgc3BlY2lmaWVkIGJhbmQgZm9yIAotICAgICAqIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ2xlIG9mIHBpeGVscy4KKyAgICAgKiBTZXRzIHRoZSBzYW1wbGVzIGZyb20gYW4gZmxvYXQgYXJyYXkgaW4gdGhlIHNwZWNpZmllZCBiYW5kIGZvciB0aGUKKyAgICAgKiBzcGVjaWZpZWQgcmVjdGFuZ2xlIG9mIHBpeGVscy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gYiB0aGUgc3BlY2lmaWVkIGJhbmQuCi0gICAgICogQHBhcmFtIGZBcnJheSB0aGUgZmxvYXQgYXJyYXkKLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgYmFuZC4KKyAgICAgKiBAcGFyYW0gZkFycmF5CisgICAgICogICAgICAgICAgICB0aGUgZmxvYXQgYXJyYXkuCisgICAgICogQHBhcmFtIGRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkYXRhLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNhbXBsZXMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBiLCBmbG9hdCBmQXJyYXlbXSwKLSAgICAgICAgICAgIERhdGFCdWZmZXIgZGF0YSkgeworICAgIHB1YmxpYyB2b2lkIHNldFNhbXBsZXMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBiLCBmbG9hdCBmQXJyYXlbXSwgRGF0YUJ1ZmZlciBkYXRhKSB7CiAgICAgICAgIGludCBpZHggPSAwOwogICAgICAgICBmb3IgKGludCBpID0geTsgaSA8IHkgKyBoOyBpKyspIHsKICAgICAgICAgICAgIGZvciAoaW50IGogPSB4OyBqIDwgeCArIHc7IGorKykgewpAQCAtODgyLDIyICs5NzksMjcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzYW1wbGVzIG9mIGEgc3BlY2lmaWVkIGJhbmQgZm9yIGEgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyCi0gICAgICogYXJlYSBvZiBwaXhlbHMgYXMgYSBkb3VibGUgYXJyYXkuCisgICAgICogR2V0cyB0aGUgc2FtcGxlcyBvZiBhIHNwZWNpZmllZCBiYW5kIGZvciBhIHNwZWNpZmllZCByZWN0YW5ndWxhciBhcmVhIG9mCisgICAgICogcGl4ZWxzIGFzIGEgZG91YmxlIGFycmF5LgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSBiIHRoZSBzcGVjaWZpZWQgYmFuZC4KLSAgICAgKiBAcGFyYW0gZEFycmF5IHRoZSBkb3VibGUgYXJyYXkgd2hlcmUgcmVzdWx0IHdpbGwgYmUgc3RvcmVkLgotICAgICAqIEBwYXJhbSBkYXRhIHRoZSBpbWFnZSBkYXRhLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNhbXBsZXMgb2YgYSBzcGVjaWZpZWQgYmFuZCBmb3IgYSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIKLSAgICAgKiBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgYmFuZC4KKyAgICAgKiBAcGFyYW0gZEFycmF5CisgICAgICogICAgICAgICAgICB0aGUgZG91YmxlIGFycmF5IHdoZXJlIHJlc3VsdCB3aWxsIGJlIHN0b3JlZC4KKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHJldHVybiB0aGUgc2FtcGxlcyBvZiBhIHNwZWNpZmllZCBiYW5kIGZvciBhIHNwZWNpZmllZCByZWN0YW5ndWxhciBhcmVhCisgICAgICogICAgICAgICBvZiBwaXhlbHMuCiAgICAgICovCi0gICAgcHVibGljIGRvdWJsZVtdIGdldFNhbXBsZXMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBiLAotICAgICAgICAgICAgZG91YmxlIGRBcnJheVtdLCBEYXRhQnVmZmVyIGRhdGEpIHsKKyAgICBwdWJsaWMgZG91YmxlW10gZ2V0U2FtcGxlcyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGIsIGRvdWJsZSBkQXJyYXlbXSwgRGF0YUJ1ZmZlciBkYXRhKSB7CiAgICAgICAgIGRvdWJsZSBzYW1wbGVzW107CiAgICAgICAgIGludCBpZHggPSAwOwogCkBAIC05MTcsMTkgKzEwMTksMjUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzYW1wbGVzIGZyb20gYW4gZG91YmxlIGFycmF5IGluIHRoZSBzcGVjaWZpZWQgYmFuZCBmb3IgCi0gICAgICogdGhlIHNwZWNpZmllZCByZWN0YW5nbGUgb2YgcGl4ZWxzLgorICAgICAqIFNldHMgdGhlIHNhbXBsZXMgZnJvbSBhbiBkb3VibGUgYXJyYXkgaW4gdGhlIHNwZWNpZmllZCBiYW5kIGZvciB0aGUKKyAgICAgKiBzcGVjaWZpZWQgcmVjdGFuZ2xlIG9mIHBpeGVscy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4KLSAgICAgKiBAcGFyYW0gYiB0aGUgc3BlY2lmaWVkIGJhbmQuCi0gICAgICogQHBhcmFtIGRBcnJheSB0aGUgZG91YmxlIGFycmF5Ci0gICAgICogQHBhcmFtIGRhdGEgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGJhbmQuCisgICAgICogQHBhcmFtIGRBcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGRvdWJsZSBhcnJheS4KKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGRhdGEuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2FtcGxlcyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGIsIGRvdWJsZSBkQXJyYXlbXSwKLSAgICAgICAgICAgIERhdGFCdWZmZXIgZGF0YSkgeworICAgIHB1YmxpYyB2b2lkIHNldFNhbXBsZXMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBiLCBkb3VibGUgZEFycmF5W10sIERhdGFCdWZmZXIgZGF0YSkgewogICAgICAgICBpbnQgaWR4ID0gMDsKICAgICAgICAgZm9yIChpbnQgaSA9IHk7IGkgPCB5ICsgaDsgaSsrKSB7CiAgICAgICAgICAgICBmb3IgKGludCBqID0geDsgaiA8IHggKyB3OyBqKyspIHsKQEAgLTkzOSw1MyArMTA0Nyw2MiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgYSBzYW1wbGUgb2YgdGhlIHNwZWNpZmllZCBiYW5kIGZvciB0aGUgc3BlY2lmaWVkIHBpeGVsCi0gICAgICogaW4gdGhlIERhdGFCdWZmZXIgYXMgZmxvYXQgdmFsdWUuCisgICAgICogU2V0cyBhIHNhbXBsZSBvZiB0aGUgc3BlY2lmaWVkIGJhbmQgZm9yIHRoZSBzcGVjaWZpZWQgcGl4ZWwgaW4gdGhlCisgICAgICogRGF0YUJ1ZmZlciBhcyBmbG9hdCB2YWx1ZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4KLSAgICAgKiBAcGFyYW0gYiB0aGUgc3BlY2lmaWVkIGJhbmQuCi0gICAgICogQHBhcmFtIHMgdGhlIHNhbXBsZSBhcyBmbG9hdCB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLgorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGJhbmQuCisgICAgICogQHBhcmFtIHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzYW1wbGUgYXMgZmxvYXQgdmFsdWUuCisgICAgICogQHBhcmFtIGRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFNhbXBsZShpbnQgeCwgaW50IHksIGludCBiLCBmbG9hdCBzLCBEYXRhQnVmZmVyIGRhdGEpIHsKLSAgICAgICAgc2V0U2FtcGxlKHgsIHksIGIsIChpbnQpIHMsIGRhdGEpOworICAgICAgICBzZXRTYW1wbGUoeCwgeSwgYiwgKGludClzLCBkYXRhKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIGEgc2FtcGxlIG9mIHRoZSBzcGVjaWZpZWQgYmFuZCBmb3IgdGhlIHNwZWNpZmllZCBwaXhlbAotICAgICAqIGluIHRoZSBEYXRhQnVmZmVyIGFzIGRvdWJsZSB2YWx1ZS4KKyAgICAgKiBTZXRzIGEgc2FtcGxlIG9mIHRoZSBzcGVjaWZpZWQgYmFuZCBmb3IgdGhlIHNwZWNpZmllZCBwaXhlbCBpbiB0aGUKKyAgICAgKiBEYXRhQnVmZmVyIGFzIGRvdWJsZSB2YWx1ZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4KLSAgICAgKiBAcGFyYW0gYiB0aGUgc3BlY2lmaWVkIGJhbmQuCi0gICAgICogQHBhcmFtIHMgdGhlIHNhbXBsZSBhcyBkb3VibGUgdmFsdWUuCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4KKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBiYW5kLgorICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICB0aGUgc2FtcGxlIGFzIGRvdWJsZSB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGRhdGEuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0U2FtcGxlKGludCB4LCBpbnQgeSwgaW50IGIsIGRvdWJsZSBzLCBEYXRhQnVmZmVyIGRhdGEpIHsKLSAgICAgICAgc2V0U2FtcGxlKHgsIHksIGIsIChpbnQpIHMsIGRhdGEpOworICAgICAgICBzZXRTYW1wbGUoeCwgeSwgYiwgKGludClzLCBkYXRhKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgRGF0YUJ1ZmZlciBvYmplY3Qgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIFNhbXBsZU1vZGVsLiAKLSAgICAgKiAgCi0gICAgICogQHJldHVybiB0aGUgRGF0YUJ1ZmZlciBvYmplY3Qgd2hpY2ggY29ycmVzcG9uZHMgdG8gCi0gICAgICogdGhlIFNhbXBsZU1vZGVsLgorICAgICAqIENyZWF0ZXMgYSBEYXRhQnVmZmVyIG9iamVjdCB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgU2FtcGxlTW9kZWwuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgRGF0YUJ1ZmZlciBvYmplY3Qgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIFNhbXBsZU1vZGVsLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBEYXRhQnVmZmVyIGNyZWF0ZURhdGFCdWZmZXIoKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHNhbXBsZSBzaXplIGluIGJpdHMgZm9yIHRoZSBzcGVjaWZpZWQgYmFuZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYmFuZCB0aGUgc3BlY2lmaWVkIGJhbmQuCi0gICAgICogCisgICAgICogQHBhcmFtIGJhbmQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgYmFuZC4KICAgICAgKiBAcmV0dXJuIHRoZSBzYW1wbGUgc2l6ZSBpbiBiaXRzIGZvciB0aGUgc3BlY2lmaWVkIGJhbmQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRTYW1wbGVTaXplKGludCBiYW5kKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgYW4gYXJyYXkgb2YgdGhlIHNhbXBsZSBzaXplIGluIGJpdHMgZm9yIGFsbCBiYW5kcy4KLSAgICAgKiAgCisgICAgICogCiAgICAgICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUgc2FtcGxlIHNpemUgaW4gYml0cyBmb3IgYWxsIGJhbmRzLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnRbXSBnZXRTYW1wbGVTaXplKCk7CkBAIC0xMDAwLDEwICsxMTE3LDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0cmFuc2ZlciB0eXBlIHVzZWQgdG8gdHJhbnNmZXIgcGl4ZWxzIHZpYSAKLSAgICAgKiB0aGUgZ2V0RGF0YUVsZW1lbnRzIGFuZCBzZXREYXRhRWxlbWVudHMgbWV0aG9kcy4KLSAgICAgKiBUcmFuc2ZlciB0eXBlIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIHByZWRlZmluZWQgdHlwZSAKLSAgICAgKiBmcm9tIERhdGFCdWZmZXIgY2xhc3Mgb3Igbm90LgorICAgICAqIEdldHMgdGhlIHRyYW5zZmVyIHR5cGUgdXNlZCB0byB0cmFuc2ZlciBwaXhlbHMgdmlhIHRoZSBnZXREYXRhRWxlbWVudHMKKyAgICAgKiBhbmQgc2V0RGF0YUVsZW1lbnRzIG1ldGhvZHMuIFRyYW5zZmVyIHR5cGUgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUKKyAgICAgKiBwcmVkZWZpbmVkIHR5cGUgZnJvbSBEYXRhQnVmZmVyIGNsYXNzIG9yIG5vdC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSB0cmFuc2ZlciB0eXBlLgogICAgICAqLwpAQCAtMTAxMiwyMCArMTEyOCwxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkYXRhIGVsZW1lbnRzIGZvciBwaXhlbCB0cmFuc2ZlcmluZwotICAgICAqIHZpYSB0aGUgZ2V0RGF0YUVsZW1lbnRzIGFuZCBzZXREYXRhRWxlbWVudHMgbWV0aG9kcy4gCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRhdGEgZWxlbWVudHMgZm9yIHBpeGVsIHRyYW5zZmVycmluZyB2aWEgdGhlCisgICAgICogZ2V0RGF0YUVsZW1lbnRzIGFuZCBzZXREYXRhRWxlbWVudHMgbWV0aG9kcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZGF0YSBlbGVtZW50cyBmb3IgcGl4ZWwgdHJhbnNmZXJpbmcKLSAgICAgKiB2aWEgdGhlIGdldERhdGFFbGVtZW50cyBhbmQgc2V0RGF0YUVsZW1lbnRzIG1ldGhvZHMuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGRhdGEgZWxlbWVudHMgZm9yIHBpeGVsIHRyYW5zZmVycmluZyB2aWEgdGhlCisgICAgICogICAgICAgICBnZXREYXRhRWxlbWVudHMgYW5kIHNldERhdGFFbGVtZW50cyBtZXRob2RzLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TnVtRGF0YUVsZW1lbnRzKCk7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgYmFuZHMgaW4gdGhlIGltYWdlIGRhdGEgb2YgdGhpcyAKLSAgICAgKiBTYW1wbGVNb2RlbCBvYmplY3QuCisgICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGJhbmRzIGluIHRoZSBpbWFnZSBkYXRhIG9mIHRoaXMgU2FtcGxlTW9kZWwgb2JqZWN0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBiYW5kcyBpbiB0aGUgaW1hZ2UgZGF0YSBvZiB0aGlzIAotICAgICAqIFNhbXBsZU1vZGVsIG9iamVjdC4KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYmFuZHMgaW4gdGhlIGltYWdlIGRhdGEgb2YgdGhpcyBTYW1wbGVNb2RlbCBvYmplY3QuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGludCBnZXROdW1CYW5kcygpIHsKICAgICAgICAgcmV0dXJuIG51bUJhbmRzOwpAQCAtMTA1MCw0ICsxMTY0LDMgQEAKICAgICB9CiAKIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL1Nob3J0TG9va3VwVGFibGUuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9TaG9ydExvb2t1cFRhYmxlLmphdmEKaW5kZXggNzdjOWM0NS4uNDMxOWQ1OCAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL1Nob3J0TG9va3VwVGFibGUuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvU2hvcnRMb29rdXBUYWJsZS5qYXZhCkBAIC0yMywyNyArMjMsMzAgQEAKIAogcGFja2FnZSBqYXZhLmF3dC5pbWFnZTsKIAotCiAvKioKLSAqIFRoZSBTaG9ydExvb2t1cFRhYmxlIGNsYXNzIHByb3ZpZGVzIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgZm9yIAotICogbG9va3VwIG9wZXJhdGlvbnMsIGFuZCBpcyBkZWZpbmVkIGJ5IGFuIGlucHV0IHNob3J0IGFycmF5IGZvciAKLSAqIGJhbmRzIG9yIGNvbXBvbmVudHMgb2YgaW1hZ2UgYW5kIGFuIG9mZnNldCB2YWx1ZS4KLSAqIFRoZSBvZmZzZXQgdmFsdWUgd2lsbCBiZSBzdWJ0cmFjdGVkIGZyb20gdGhlIGlucHV0IHZhbHVlcyBiZWZvcmUgCi0gKiBpbmRleGluZyB0aGUgaW5wdXQgYXJyYXlzLiBUaGUgb3V0cHV0IG9mIGEgbG9va3VwIG9wZXJhdGlvbiBpcyAKKyAqIFRoZSBTaG9ydExvb2t1cFRhYmxlIGNsYXNzIHByb3ZpZGVzIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgZm9yIGxvb2t1cAorICogb3BlcmF0aW9ucywgYW5kIGlzIGRlZmluZWQgYnkgYW4gaW5wdXQgc2hvcnQgYXJyYXkgZm9yIGJhbmRzIG9yIGNvbXBvbmVudHMgb2YKKyAqIGltYWdlIGFuZCBhbiBvZmZzZXQgdmFsdWUuIFRoZSBvZmZzZXQgdmFsdWUgd2lsbCBiZSBzdWJ0cmFjdGVkIGZyb20gdGhlIGlucHV0CisgKiB2YWx1ZXMgYmVmb3JlIGluZGV4aW5nIHRoZSBpbnB1dCBhcnJheXMuIFRoZSBvdXRwdXQgb2YgYSBsb29rdXAgb3BlcmF0aW9uIGlzCiAgKiByZXByZXNlbnRlZCBhcyBhbiB1bnNpZ25lZCBzaG9ydCBhcnJheS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBTaG9ydExvb2t1cFRhYmxlIGV4dGVuZHMgTG9va3VwVGFibGUgewotICAgIAotICAgIC8qKiBUaGUgZGF0YS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBkYXRhLgorICAgICAqLwogICAgIHByaXZhdGUgc2hvcnQgZGF0YVtdW107CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgU2hvcnRMb29rdXBUYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgb2Zmc2V0IHZhbHVlCi0gICAgICogYW5kIHRoZSBzcGVjaWZpZWQgc2hvcnQgYXJyYXkgd2hpY2ggcmVwcmVzZW50cyBsb29rdXAgdGFibGUgZm9yCi0gICAgICogYWxsIGJhbmRzLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBTaG9ydExvb2t1cFRhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBvZmZzZXQgdmFsdWUgYW5kCisgICAgICogdGhlIHNwZWNpZmllZCBzaG9ydCBhcnJheSB3aGljaCByZXByZXNlbnRzIGxvb2t1cCB0YWJsZSBmb3IgYWxsIGJhbmRzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgZGF0YSBhcnJheS4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IHZhbHVlLgorICAgICAqIEBwYXJhbSBkYXRhCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSBhcnJheS4KICAgICAgKi8KICAgICBwdWJsaWMgU2hvcnRMb29rdXBUYWJsZShpbnQgb2Zmc2V0LCBzaG9ydFtdIGRhdGEpIHsKICAgICAgICAgc3VwZXIob2Zmc2V0LCAxKTsKQEAgLTUzLDEyICs1NiwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBTaG9ydExvb2t1cFRhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBvZmZzZXQgdmFsdWUKLSAgICAgKiBhbmQgdGhlIHNwZWNpZmllZCBzaG9ydCBhcnJheSBvZiBhcnJheXMgd2hpY2ggcmVwcmVzZW50cyBsb29rdXAgdGFibGUKLSAgICAgKiBmb3IgZWFjaCBiYW5kLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBTaG9ydExvb2t1cFRhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBvZmZzZXQgdmFsdWUgYW5kCisgICAgICogdGhlIHNwZWNpZmllZCBzaG9ydCBhcnJheSBvZiBhcnJheXMgd2hpY2ggcmVwcmVzZW50cyBsb29rdXAgdGFibGUgZm9yCisgICAgICogZWFjaCBiYW5kLgogICAgICAqIAotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgZGF0YSBhcnJheSBvZiBhcnJheXMgZm9yIGVhY2ggYmFuZC4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IHZhbHVlLgorICAgICAqIEBwYXJhbSBkYXRhCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSBhcnJheSBvZiBhcnJheXMgZm9yIGVhY2ggYmFuZC4KICAgICAgKi8KICAgICBwdWJsaWMgU2hvcnRMb29rdXBUYWJsZShpbnQgb2Zmc2V0LCBzaG9ydFtdW10gZGF0YSkgewogICAgICAgICBzdXBlcihvZmZzZXQsIGRhdGEubGVuZ3RoKTsKQEAgLTcwLDkgKzc1LDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsb29rdXAgdGFibGUgb2YgdGhpcyBTaG9ydExvb2t1cFRhYmxlIG9iamVjdC4gSWYgCi0gICAgICogdGhpcyBTaG9ydExvb2t1cFRhYmxlIG9iamVjdCBoYXMgb25lIHNob3J0IGFycmF5IGZvciBhbGwgYmFuZHMsIAotICAgICAqIHRoZSByZXR1cm5lZCBhcnJheSBsZW5ndGggaXMgb25lLgorICAgICAqIEdldHMgdGhlIGxvb2t1cCB0YWJsZSBvZiB0aGlzIFNob3J0TG9va3VwVGFibGUgb2JqZWN0LiBJZiB0aGlzCisgICAgICogU2hvcnRMb29rdXBUYWJsZSBvYmplY3QgaGFzIG9uZSBzaG9ydCBhcnJheSBmb3IgYWxsIGJhbmRzLCB0aGUgcmV0dXJuZWQKKyAgICAgKiBhcnJheSBsZW5ndGggaXMgb25lLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGxvb2t1cCB0YWJsZSBvZiB0aGlzIFNob3J0TG9va3VwVGFibGUgb2JqZWN0LgogICAgICAqLwpAQCAtODEsMTQgKzg2LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhIHNob3J0IGFycmF5IHdoaWNoIGNvbnRhaW5zIHNhbXBsZXMgb2YgdGhlIHNwZWNpZmllZAotICAgICAqIHBpeGVsIHdoaWNoIGlzIHRyYW5zbGF0ZWQgd2l0aCB0aGUgbG9va3VwIHRhYmxlIG9mIHRoaXMgCi0gICAgICogU2hvcnRMb29rdXBUYWJsZSBvYmplY3QuIFRoZSByZXN1bHRlZCBhcnJheSBpcyBzdG9yZWQgdG8KLSAgICAgKiB0aGUgZHN0IGFycmF5LgorICAgICAqIFJldHVybnMgYSBzaG9ydCBhcnJheSB3aGljaCBjb250YWlucyBzYW1wbGVzIG9mIHRoZSBzcGVjaWZpZWQgcGl4ZWwgd2hpY2gKKyAgICAgKiBpcyB0cmFuc2xhdGVkIHdpdGggdGhlIGxvb2t1cCB0YWJsZSBvZiB0aGlzIFNob3J0TG9va3VwVGFibGUgb2JqZWN0LiBUaGUKKyAgICAgKiByZXN1bHRlZCBhcnJheSBpcyBzdG9yZWQgdG8gdGhlIGRzdCBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3JjIHRoZSBzb3VyY2UgYXJyYXkuCi0gICAgICogQHBhcmFtIGRzdCB0aGUgZGVzdGluYXRpb24gYXJyYXkgd2hlcmUgdGhlIHJlc3VsdCBjYW4gYmUgc3RvcmVkLgotICAgICAqIAorICAgICAqIEBwYXJhbSBzcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgYXJyYXkuCisgICAgICogQHBhcmFtIGRzdAorICAgICAqICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIGFycmF5IHdoZXJlIHRoZSByZXN1bHQgY2FuIGJlIHN0b3JlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBzaG9ydCBhcnJheSBvZiB0cmFuc2xhdGVkIHNhbXBsZXMgb2YgYSBwaXhlbC4KICAgICAgKi8KICAgICBwdWJsaWMgc2hvcnRbXSBsb29rdXBQaXhlbChzaG9ydFtdIHNyYywgc2hvcnRbXSBkc3QpIHsKQEAgLTk5LDExICsxMDQsMTEgQEAKICAgICAgICAgaW50IG9mZnNldCA9IGdldE9mZnNldCgpOwogICAgICAgICBpZiAoZ2V0TnVtQ29tcG9uZW50cygpID09IDEpIHsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3JjLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZHN0W2ldID0gZGF0YVswXVtzcmNbaV0tb2Zmc2V0XTsKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSBkYXRhWzBdW3NyY1tpXSAtIG9mZnNldF07CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdldE51bUNvbXBvbmVudHMoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZHN0W2ldID0gZGF0YVtpXVtzcmNbaV0tb2Zmc2V0XTsKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSBkYXRhW2ldW3NyY1tpXSAtIG9mZnNldF07CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMTE5LDExICsxMjQsMTEgQEAKICAgICAgICAgaW50IG9mZnNldCA9IGdldE9mZnNldCgpOwogICAgICAgICBpZiAoZ2V0TnVtQ29tcG9uZW50cygpID09IDEpIHsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3JjLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZHN0W2ldID0gZGF0YVswXVtzcmNbaV0tb2Zmc2V0XTsKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSBkYXRhWzBdW3NyY1tpXSAtIG9mZnNldF07CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdldE51bUNvbXBvbmVudHMoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZHN0W2ldID0gZGF0YVtpXVtzcmNbaV0tb2Zmc2V0XTsKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSBkYXRhW2ldW3NyY1tpXSAtIG9mZnNldF07CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL1NpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9TaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsLmphdmEKaW5kZXggMzExMzk1YS4uNjlmMzM1MyAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL1NpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbC5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIElnb3IgVi4gU3RvbHlhcm92CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5pbWFnZTsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CkBAIC0yNSwzOSArMjYsNTQgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkuYXd0LmludGVybmFsLm5scy5NZXNzYWdlczsKIAogLyoqCi0gKiBUaGUgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCBjbGFzcyByZXByZXNlbnRzIHBpeGVsIGRhdGEgCi0gKiB3aGVyZSBzZXZlcmFsIHNhbXBsZXMgY29tYmluZSB0byBjcmVhdGUgYSBzaW5nbGUgcGl4ZWwgYW5kIAotICogYXJlIHN0b3JlZCBpbiBhIHNpbmdsZSBkYXRhIGFycmF5IGVsZW1lbnQuIFRoaXMgY2xhc3MgCi0gKiBzdXBwb3J0cyBUWVBFX0JZVEUsIFRZUEVfVVNIT1JULCBUWVBFX0lOVCBkYXRhIHR5cGVzLiAKKyAqIFRoZSBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIGNsYXNzIHJlcHJlc2VudHMgcGl4ZWwgZGF0YSB3aGVyZSBzZXZlcmFsCisgKiBzYW1wbGVzIGNvbWJpbmUgdG8gY3JlYXRlIGEgc2luZ2xlIHBpeGVsIGFuZCBhcmUgc3RvcmVkIGluIGEgc2luZ2xlIGRhdGEKKyAqIGFycmF5IGVsZW1lbnQuIFRoaXMgY2xhc3Mgc3VwcG9ydHMgVFlQRV9CWVRFLCBUWVBFX1VTSE9SVCwgVFlQRV9JTlQgZGF0YQorICogdHlwZXMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCBleHRlbmRzIFNhbXBsZU1vZGVsIHsKIAotICAgIC8qKiBUaGUgYml0IG1hc2tzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBiaXQgbWFza3MuCisgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgYml0TWFza3NbXTsKIAotICAgIC8qKiBUaGUgYml0IG9mZnNldHMuICovCisgICAgLyoqCisgICAgICogVGhlIGJpdCBvZmZzZXRzLgorICAgICAqLwogICAgIHByaXZhdGUgaW50IGJpdE9mZnNldHNbXTsKIAotICAgIC8qKiBUaGUgYml0IHNpemVzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBiaXQgc2l6ZXMuCisgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgYml0U2l6ZXNbXTsKIAotICAgIC8qKiBUaGUgc2NhbmxpbmUgc3RyaWRlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBzY2FubGluZSBzdHJpZGUuCisgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgc2NhbmxpbmVTdHJpZGU7CiAKLSAgICAvKiogVGhlIG1heCBiaXQgc2l6ZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgbWF4IGJpdCBzaXplLgorICAgICAqLwogICAgIHByaXZhdGUgaW50IG1heEJpdFNpemU7CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQKICAgICAgKiBwYXJhbWV0ZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhVHlwZSB0aGUgZGF0YSB0eXBlIG9mIHNhbXBsZXMuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBkYXRhLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlIGRhdGEuCi0gICAgICogQHBhcmFtIGJpdE1hc2tzIHRoZSBiaXQgbWFza3MgZm9yIGFsbCB0aGUgYmFuZHMuCisgICAgICogQHBhcmFtIGRhdGFUeXBlCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSB0eXBlIG9mIHNhbXBsZXMuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gYml0TWFza3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBiaXQgbWFza3MgZm9yIGFsbCB0aGUgYmFuZHMuCiAgICAgICovCi0gICAgcHVibGljIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwoaW50IGRhdGFUeXBlLCBpbnQgdywgaW50IGgsCi0gICAgICAgICAgICBpbnQgYml0TWFza3NbXSkgeworICAgIHB1YmxpYyBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKGludCBkYXRhVHlwZSwgaW50IHcsIGludCBoLCBpbnQgYml0TWFza3NbXSkgewogICAgICAgICB0aGlzKGRhdGFUeXBlLCB3LCBoLCB3LCBiaXRNYXNrcyk7CiAgICAgfQogCkBAIC02NSwyMCArODEsMjQgQEAKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQKICAgICAgKiBwYXJhbWV0ZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhVHlwZSB0aGUgZGF0YSB0eXBlIG9mIHRoZSBzYW1wbGVzLgotICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UgZGF0YS4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZSBkYXRhLgotICAgICAqIEBwYXJhbSBzY2FubGluZVN0cmlkZSBUaGUgc2NhbmxpbmUgc3RyaWRlIG9mIHRoZSBpbWFnZSBkYXRhLgotICAgICAqIEBwYXJhbSBiaXRNYXNrcyB0aGUgYml0IG1hc2tzIGZvciBhbGwgdGhlIGJhbmRzLgorICAgICAqIEBwYXJhbSBkYXRhVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgdHlwZSBvZiB0aGUgc2FtcGxlcy4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZSBkYXRhLgorICAgICAqIEBwYXJhbSBzY2FubGluZVN0cmlkZQorICAgICAqICAgICAgICAgICAgdGhlIHNjYW5saW5lIHN0cmlkZSBvZiB0aGUgaW1hZ2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gYml0TWFza3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBiaXQgbWFza3MgZm9yIGFsbCB0aGUgYmFuZHMuCiAgICAgICovCi0gICAgcHVibGljIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwoaW50IGRhdGFUeXBlLCBpbnQgdywgaW50IGgsCi0gICAgICAgICAgICBpbnQgc2NhbmxpbmVTdHJpZGUsIGludCBiaXRNYXNrc1tdKSB7CisgICAgcHVibGljIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwoaW50IGRhdGFUeXBlLCBpbnQgdywgaW50IGgsIGludCBzY2FubGluZVN0cmlkZSwKKyAgICAgICAgICAgIGludCBiaXRNYXNrc1tdKSB7CiAKICAgICAgICAgc3VwZXIoZGF0YVR5cGUsIHcsIGgsIGJpdE1hc2tzLmxlbmd0aCk7CiAKLSAgICAgICAgaWYgKGRhdGFUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9CWVRFICYmCi0gICAgICAgICAgICAgICAgZGF0YVR5cGUgIT0gRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVCAmJgotICAgICAgICAgICAgICAgIGRhdGFUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9JTlQpIHsKKyAgICAgICAgaWYgKGRhdGFUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9CWVRFICYmIGRhdGFUeXBlICE9IERhdGFCdWZmZXIuVFlQRV9VU0hPUlQKKyAgICAgICAgICAgICAgICAmJiBkYXRhVHlwZSAhPSBEYXRhQnVmZmVyLlRZUEVfSU5UKSB7CiAgICAgICAgICAgICAvLyBhd3QuNjE9VW5zdXBwb3J0ZWQgZGF0YSB0eXBlOiB7MH0KICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNjEiLCAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlKSk7CkBAIC0xMDksOCArMTI5LDcgQEAKIAogICAgICAgICAgICAgICAgIGlmIChtYXNrICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgLy8gYXd0LjYyPVdyb25nIG1hc2sgOiB7MH0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImF3dC42MiIsIGJpdE1hc2tzW2ldKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC42MiIsIGJpdE1hc2tzW2ldKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTEzMiwzOSArMTUxLDM5IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjYzIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KICAgICAgICAgc3dpdGNoIChnZXRUcmFuc2ZlclR5cGUoKSkgewotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgotICAgICAgICAgICAgYnl0ZSBiZGF0YVtdOwotICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYmRhdGEgPSBuZXcgYnl0ZVsxXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYmRhdGEgPSAoYnl0ZVtdKSBvYmo7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgorICAgICAgICAgICAgICAgIGJ5dGUgYmRhdGFbXTsKKyAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYmRhdGEgPSBuZXcgYnl0ZVsxXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBiZGF0YSA9IChieXRlW10pb2JqOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgYmRhdGFbMF0gPSAoYnl0ZSkgZGF0YS5nZXRFbGVtKHkgKiBzY2FubGluZVN0cmlkZSArIHgpOwotICAgICAgICAgICAgb2JqID0gYmRhdGE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgotICAgICAgICAgICAgc2hvcnQgc2RhdGFbXTsKLSAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNkYXRhID0gbmV3IHNob3J0WzFdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzZGF0YSA9IChzaG9ydFtdKSBvYmo7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYmRhdGFbMF0gPSAoYnl0ZSlkYXRhLmdldEVsZW0oeSAqIHNjYW5saW5lU3RyaWRlICsgeCk7CisgICAgICAgICAgICAgICAgb2JqID0gYmRhdGE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6CisgICAgICAgICAgICAgICAgc2hvcnQgc2RhdGFbXTsKKyAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2RhdGEgPSBuZXcgc2hvcnRbMV07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2RhdGEgPSAoc2hvcnRbXSlvYmo7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzZGF0YVswXSA9IChzaG9ydCkgZGF0YS5nZXRFbGVtKHkgKiBzY2FubGluZVN0cmlkZSArIHgpOwotICAgICAgICAgICAgb2JqID0gc2RhdGE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgotICAgICAgICAgICAgaW50IGlkYXRhW107Ci0gICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZGF0YSA9IG5ldyBpbnRbMV07Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlkYXRhID0gKGludFtdKSBvYmo7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2RhdGFbMF0gPSAoc2hvcnQpZGF0YS5nZXRFbGVtKHkgKiBzY2FubGluZVN0cmlkZSArIHgpOworICAgICAgICAgICAgICAgIG9iaiA9IHNkYXRhOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgorICAgICAgICAgICAgICAgIGludCBpZGF0YVtdOworICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZGF0YSA9IG5ldyBpbnRbMV07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWRhdGEgPSAoaW50W10pb2JqOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWRhdGFbMF0gPSBkYXRhLmdldEVsZW0oeSAqIHNjYW5saW5lU3RyaWRlICsgeCk7Ci0gICAgICAgICAgICBvYmogPSBpZGF0YTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlkYXRhWzBdID0gZGF0YS5nZXRFbGVtKHkgKiBzY2FubGluZVN0cmlkZSArIHgpOworICAgICAgICAgICAgICAgIG9iaiA9IGlkYXRhOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBvYmo7CiAgICAgfQpAQCAtMTc2LDI2ICsxOTUsMjYgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNjMiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogICAgICAgICBzd2l0Y2ggKGdldFRyYW5zZmVyVHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6Ci0gICAgICAgICAgICBkYXRhLnNldEVsZW0oeSAqIHNjYW5saW5lU3RyaWRlICsgeCwgKChieXRlW10pIG9iailbMF0gJiAweGZmKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQ6Ci0gICAgICAgICAgICBkYXRhLnNldEVsZW0oeSAqIHNjYW5saW5lU3RyaWRlICsgeCwgKChzaG9ydFtdKSBvYmopWzBdICYgMHhmZmZmKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6Ci0gICAgICAgICAgICBkYXRhLnNldEVsZW0oeSAqIHNjYW5saW5lU3RyaWRlICsgeCwgKChpbnRbXSkgb2JqKVswXSk7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6CisgICAgICAgICAgICAgICAgZGF0YS5zZXRFbGVtKHkgKiBzY2FubGluZVN0cmlkZSArIHgsICgoYnl0ZVtdKW9iailbMF0gJiAweGZmKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKKyAgICAgICAgICAgICAgICBkYXRhLnNldEVsZW0oeSAqIHNjYW5saW5lU3RyaWRlICsgeCwgKChzaG9ydFtdKW9iailbMF0gJiAweGZmZmYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgorICAgICAgICAgICAgICAgIGRhdGEuc2V0RWxlbSh5ICogc2NhbmxpbmVTdHJpZGUgKyB4LCAoKGludFtdKW9iailbMF0pOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhpcyBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIG9iamVjdCB3aXRoIAotICAgICAqIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgorICAgICAqIENvbXBhcmVzIHRoaXMgU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogb2JqZWN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBvIHRoZSBPYmplY3QgdG8gYmUgY29tcGFyZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGlzIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgb2JqZWN0IGlzIAotICAgICAqIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgb2JqZWN0LCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIG8KKyAgICAgKiAgICAgICAgICAgIHRoZSBPYmplY3QgdG8gYmUgY29tcGFyZWQuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGlzIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgb2JqZWN0IGlzIGVxdWFsIHRvIHRoZQorICAgICAqICAgICAgICAgc3BlY2lmaWVkIG9iamVjdCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewpAQCAtMjAzLDIxICsyMjIsMjAgQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCi0gICAgICAgIFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwgbW9kZWwgPSAoU2luZ2xlUGl4ZWxQYWNrZWRTYW1wbGVNb2RlbCkgbzsKLSAgICAgICAgcmV0dXJuIHRoaXMud2lkdGggPT0gbW9kZWwud2lkdGggJiYKLSAgICAgICAgICAgICAgICB0aGlzLmhlaWdodCA9PSBtb2RlbC5oZWlnaHQgJiYKLSAgICAgICAgICAgICAgICB0aGlzLm51bUJhbmRzID09IG1vZGVsLm51bUJhbmRzICYmCi0gICAgICAgICAgICAgICAgdGhpcy5kYXRhVHlwZSA9PSBtb2RlbC5kYXRhVHlwZSAmJgotICAgICAgICAgICAgICAgIEFycmF5cy5lcXVhbHModGhpcy5iaXRNYXNrcywgbW9kZWwuYml0TWFza3MpICYmCi0gICAgICAgICAgICAgICAgQXJyYXlzLmVxdWFscyh0aGlzLmJpdE9mZnNldHMsIG1vZGVsLmJpdE9mZnNldHMpICYmCi0gICAgICAgICAgICAgICAgQXJyYXlzLmVxdWFscyh0aGlzLmJpdFNpemVzLCBtb2RlbC5iaXRTaXplcykgJiYKLSAgICAgICAgICAgICAgICB0aGlzLnNjYW5saW5lU3RyaWRlID09IG1vZGVsLnNjYW5saW5lU3RyaWRlOworICAgICAgICBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsIG1vZGVsID0gKFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwpbzsKKyAgICAgICAgcmV0dXJuIHRoaXMud2lkdGggPT0gbW9kZWwud2lkdGggJiYgdGhpcy5oZWlnaHQgPT0gbW9kZWwuaGVpZ2h0CisgICAgICAgICAgICAgICAgJiYgdGhpcy5udW1CYW5kcyA9PSBtb2RlbC5udW1CYW5kcyAmJiB0aGlzLmRhdGFUeXBlID09IG1vZGVsLmRhdGFUeXBlCisgICAgICAgICAgICAgICAgJiYgQXJyYXlzLmVxdWFscyh0aGlzLmJpdE1hc2tzLCBtb2RlbC5iaXRNYXNrcykKKyAgICAgICAgICAgICAgICAmJiBBcnJheXMuZXF1YWxzKHRoaXMuYml0T2Zmc2V0cywgbW9kZWwuYml0T2Zmc2V0cykKKyAgICAgICAgICAgICAgICAmJiBBcnJheXMuZXF1YWxzKHRoaXMuYml0U2l6ZXMsIG1vZGVsLmJpdFNpemVzKQorICAgICAgICAgICAgICAgICYmIHRoaXMuc2NhbmxpbmVTdHJpZGUgPT0gbW9kZWwuc2NhbmxpbmVTdHJpZGU7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFNhbXBsZU1vZGVsIGNyZWF0ZVN1YnNldFNhbXBsZU1vZGVsKGludCBiYW5kc1tdKSB7CiAgICAgICAgIGlmIChiYW5kcy5sZW5ndGggPiB0aGlzLm51bUJhbmRzKSB7Ci0gICAgICAgICAgICAvLyBhd3QuNjQ9VGhlIG51bWJlciBvZiB0aGUgYmFuZHMgaW4gdGhlIHN1YnNldCBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBiYW5kcyBpbiB0aGUgc2FtcGxlIG1vZGVsCisgICAgICAgICAgICAvLyBhd3QuNjQ9VGhlIG51bWJlciBvZiB0aGUgYmFuZHMgaW4gdGhlIHN1YnNldCBpcyBncmVhdGVyIHRoYW4gdGhlCisgICAgICAgICAgICAvLyBudW1iZXIgb2YgYmFuZHMgaW4gdGhlIHNhbXBsZSBtb2RlbAogICAgICAgICAgICAgdGhyb3cgbmV3IFJhc3RlckZvcm1hdEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC42NCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKQEAgLTIyNSwxNCArMjQzLDEzIEBACiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmFuZHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgIG1hc2tzW2ldID0gdGhpcy5iaXRNYXNrc1tiYW5kc1tpXV07CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKHRoaXMuZGF0YVR5cGUsIHRoaXMud2lkdGgsCi0gICAgICAgICAgICAgICAgdGhpcy5oZWlnaHQsIHRoaXMuc2NhbmxpbmVTdHJpZGUsIG1hc2tzKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKHRoaXMuZGF0YVR5cGUsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LAorICAgICAgICAgICAgICAgIHRoaXMuc2NhbmxpbmVTdHJpZGUsIG1hc2tzKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU2FtcGxlTW9kZWwgY3JlYXRlQ29tcGF0aWJsZVNhbXBsZU1vZGVsKGludCB3LCBpbnQgaCkgewotICAgICAgICByZXR1cm4gbmV3IFNpbmdsZVBpeGVsUGFja2VkU2FtcGxlTW9kZWwodGhpcy5kYXRhVHlwZSwgdywgaCwKLSAgICAgICAgICAgICAgICB0aGlzLmJpdE1hc2tzKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTaW5nbGVQaXhlbFBhY2tlZFNhbXBsZU1vZGVsKHRoaXMuZGF0YVR5cGUsIHcsIGgsIHRoaXMuYml0TWFza3MpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMjc3LDEwICsyOTQsOSBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnRbXSBnZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBpQXJyYXlbXSwKLSAgICAgICAgICAgIERhdGFCdWZmZXIgZGF0YSkgewotICAgICAgICBpZiAoKHggPCAwKSB8fCAoeSA8IDApIHx8ICgobG9uZykgeCArIChsb25nKSB3ID4gdGhpcy53aWR0aCkKLSAgICAgICAgICAgICAgICB8fCAoKGxvbmcpIHkgKyAobG9uZykgaCA+IHRoaXMuaGVpZ2h0KSkgeworICAgIHB1YmxpYyBpbnRbXSBnZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBpQXJyYXlbXSwgRGF0YUJ1ZmZlciBkYXRhKSB7CisgICAgICAgIGlmICgoeCA8IDApIHx8ICh5IDwgMCkgfHwgKChsb25nKXggKyAobG9uZyl3ID4gdGhpcy53aWR0aCkKKyAgICAgICAgICAgICAgICB8fCAoKGxvbmcpeSArIChsb25nKWggPiB0aGlzLmhlaWdodCkpIHsKICAgICAgICAgICAgIC8vIGF3dC42Mz1Db29yZGluYXRlcyBhcmUgbm90IGluIGJvdW5kcwogICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC42MyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CkBAIC0zMDYsMTMgKzMyMiwxMSBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGlBcnJheVtdLAotICAgICAgICAgICAgRGF0YUJ1ZmZlciBkYXRhKSB7Ci0gICAgICAgIGlmICgoeCA8IDApIHx8ICh5IDwgMCkgfHwgKChsb25nKSB4ICsgKGxvbmcpIHcgPiB0aGlzLndpZHRoKQotICAgICAgICAgICAgICAgIHx8ICgobG9uZykgeSArIChsb25nKSBoID4gdGhpcy5oZWlnaHQpKSB7CisgICAgcHVibGljIHZvaWQgc2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgaUFycmF5W10sIERhdGFCdWZmZXIgZGF0YSkgeworICAgICAgICBpZiAoKHggPCAwKSB8fCAoeSA8IDApIHx8ICgobG9uZyl4ICsgKGxvbmcpdyA+IHRoaXMud2lkdGgpCisgICAgICAgICAgICAgICAgfHwgKChsb25nKXkgKyAobG9uZyloID4gdGhpcy5oZWlnaHQpKSB7CiAgICAgICAgICAgICAvLyBhd3QuNjM9Q29vcmRpbmF0ZXMgYXJlIG5vdCBpbiBib3VuZHMKLSAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTWVzc2FnZXMKLSAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygiYXd0LjYzIikpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjYzIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAogICAgICAgICBpbnQgaWR4ID0gMDsKQEAgLTMzOSwxMyArMzUzLDExIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludFtdIGdldFNhbXBsZXMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBiLCBpbnQgaUFycmF5W10sCi0gICAgICAgICAgICBEYXRhQnVmZmVyIGRhdGEpIHsKLSAgICAgICAgaWYgKCh4IDwgMCkgfHwgKHkgPCAwKSB8fCAoKGxvbmcpIHggKyAobG9uZykgdyA+IHRoaXMud2lkdGgpCi0gICAgICAgICAgICAgICAgfHwgKChsb25nKSB5ICsgKGxvbmcpIGggPiB0aGlzLmhlaWdodCkpIHsKKyAgICBwdWJsaWMgaW50W10gZ2V0U2FtcGxlcyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGIsIGludCBpQXJyYXlbXSwgRGF0YUJ1ZmZlciBkYXRhKSB7CisgICAgICAgIGlmICgoeCA8IDApIHx8ICh5IDwgMCkgfHwgKChsb25nKXggKyAobG9uZyl3ID4gdGhpcy53aWR0aCkKKyAgICAgICAgICAgICAgICB8fCAoKGxvbmcpeSArIChsb25nKWggPiB0aGlzLmhlaWdodCkpIHsKICAgICAgICAgICAgIC8vIGF3dC42Mz1Db29yZGluYXRlcyBhcmUgbm90IGluIGJvdW5kcwotICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNZXNzYWdlcwotICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJhd3QuNjMiKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNjMiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCiAgICAgICAgIGludCBzYW1wbGVzW107CkBAIC0zNjcsMTAgKzM3OSw5IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U2FtcGxlcyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGIsIGludCBpQXJyYXlbXSwKLSAgICAgICAgICAgIERhdGFCdWZmZXIgZGF0YSkgewotICAgICAgICBpZiAoKHggPCAwKSB8fCAoeSA8IDApIHx8ICgobG9uZykgeCArIChsb25nKSB3ID4gdGhpcy53aWR0aCkKLSAgICAgICAgICAgICAgICB8fCAoKGxvbmcpIHkgKyAobG9uZykgaCA+IHRoaXMuaGVpZ2h0KSkgeworICAgIHB1YmxpYyB2b2lkIHNldFNhbXBsZXMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBiLCBpbnQgaUFycmF5W10sIERhdGFCdWZmZXIgZGF0YSkgeworICAgICAgICBpZiAoKHggPCAwKSB8fCAoeSA8IDApIHx8ICgobG9uZyl4ICsgKGxvbmcpdyA+IHRoaXMud2lkdGgpCisgICAgICAgICAgICAgICAgfHwgKChsb25nKXkgKyAobG9uZyloID4gdGhpcy5oZWlnaHQpKSB7CiAgICAgICAgICAgICAvLyBhd3QuNjM9Q29vcmRpbmF0ZXMgYXJlIG5vdCBpbiBib3VuZHMKICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuNjMiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQpAQCAtMzg5LDE1ICs0MDAsMTUgQEAKICAgICAgICAgaW50IHNpemUgPSAodGhpcy5oZWlnaHQgLSAxKSAqIHNjYW5saW5lU3RyaWRlICsgd2lkdGg7CiAKICAgICAgICAgc3dpdGNoICh0aGlzLmRhdGFUeXBlKSB7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6Ci0gICAgICAgICAgICBkYXRhID0gbmV3IERhdGFCdWZmZXJCeXRlKHNpemUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKLSAgICAgICAgICAgIGRhdGEgPSBuZXcgRGF0YUJ1ZmZlclVTaG9ydChzaXplKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6Ci0gICAgICAgICAgICBkYXRhID0gbmV3IERhdGFCdWZmZXJJbnQoc2l6ZSk7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0JZVEU6CisgICAgICAgICAgICAgICAgZGF0YSA9IG5ldyBEYXRhQnVmZmVyQnl0ZShzaXplKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1VTSE9SVDoKKyAgICAgICAgICAgICAgICBkYXRhID0gbmV3IERhdGFCdWZmZXJVU2hvcnQoc2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6CisgICAgICAgICAgICAgICAgZGF0YSA9IG5ldyBEYXRhQnVmZmVySW50KHNpemUpOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBkYXRhOwogICAgIH0KQEAgLTQwNSw5ICs0MTYsMTAgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBvZmZzZXQgb2YgdGhlIHNwZWNpZmllZCBwaXhlbCBpbiB0aGUgZGF0YSBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBzcGVjaWZpZWQgcGl4ZWwuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgc3BlY2lmaWVkIHBpeGVsLgotICAgICAqIAorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBzcGVjaWZpZWQgcGl4ZWwuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHNwZWNpZmllZCBwaXhlbC4KICAgICAgKiBAcmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIHNwZWNpZmllZCBwaXhlbC4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldE9mZnNldChpbnQgeCwgaW50IHkpIHsKQEAgLTQyNSw3ICs0MzcsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYW4gYXJyYXkgb2YgdGhlIGJpdCBvZmZzZXRzIG9mIHRoZSBkYXRhIGFycmF5IGVsZW1lbnRzLiAKKyAgICAgKiBHZXRzIGFuIGFycmF5IG9mIHRoZSBiaXQgb2Zmc2V0cyBvZiB0aGUgZGF0YSBhcnJheSBlbGVtZW50cy4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBiaXQgb2Zmc2V0cy4KICAgICAgKi8KQEAgLTUwNSw0ICs1MTcsMyBAQAogICAgIH0KIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvVGlsZU9ic2VydmVyLmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvVGlsZU9ic2VydmVyLmphdmEKaW5kZXggMzlkZWQwMi4uN2RkOTdlMiAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL1RpbGVPYnNlcnZlci5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9UaWxlT2JzZXJ2ZXIuamF2YQpAQCAtMTgsMjcgKzE4LDMyIEBACiAgKiBAYXV0aG9yIElnb3IgVi4gU3RvbHlhcm92CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5pbWFnZTsKIAotCiAvKioKLSAqIEFuIGFzeW5jaHJvbm91cyB1cGRhdGUgaW50ZXJmYWNlIGZvciByZWNlaXZpbmcgbm90aWZpY2F0aW9ucwotICogYWJvdXQgdGlsZSBpbmZvcm1hdGlvbiB3aGVuIHRpbGVzIG9mIGEgV3JpdGFibGVSZW5kZXJlZEltYWdlIAotICogYmVjb21lIG1vZGlmaWFibGUgb3IgdW5tb2RpZmlhYmxlLgorICogQW4gYXN5bmNocm9ub3VzIHVwZGF0ZSBpbnRlcmZhY2UgZm9yIHJlY2VpdmluZyBub3RpZmljYXRpb25zIGFib3V0IHRpbGUKKyAqIGluZm9ybWF0aW9uIHdoZW4gdGlsZXMgb2YgYSBXcml0YWJsZVJlbmRlcmVkSW1hZ2UgYmVjb21lIG1vZGlmaWFibGUgb3IKKyAqIHVubW9kaWZpYWJsZS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgVGlsZU9ic2VydmVyIHsKIAogICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGluZm9ybWF0aW9uIGFib3V0IGEgdGlsZQotICAgICAqIHVwZGF0ZSBpcyBhdmFpbGFibGUuCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gaW5mb3JtYXRpb24gYWJvdXQgYSB0aWxlIHVwZGF0ZSBpcyBhdmFpbGFibGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIGltYWdlLgotICAgICAqIEBwYXJhbSB0aWxlWCB0aGUgWCBpbmRleCBvZiB0aGUgdGlsZS4KLSAgICAgKiBAcGFyYW0gdGlsZVkgdGhlIFkgaW5kZXggb2YgdGhlIHRpbGUuCi0gICAgICogQHBhcmFtIHdpbGxCZVdyaXRhYmxlIHBhcmFtZXRlciB3aGljaCBpbmRpY2F0ZXMgd2hldGhlcgotICAgICAqIHRoZSB0aWxlIHdpbGwgYmUgZ3JhYmJlZCBmb3Igd3JpdGluZyBvciBiZSByZWxlYXNlZC4KKyAgICAgKiBAcGFyYW0gc291cmNlCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIGltYWdlLgorICAgICAqIEBwYXJhbSB0aWxlWAorICAgICAqICAgICAgICAgICAgdGhlIFggaW5kZXggb2YgdGhlIHRpbGUuCisgICAgICogQHBhcmFtIHRpbGVZCisgICAgICogICAgICAgICAgICB0aGUgWSBpbmRleCBvZiB0aGUgdGlsZS4KKyAgICAgKiBAcGFyYW0gd2lsbEJlV3JpdGFibGUKKyAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlciB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgdGlsZSB3aWxsIGJlIGdyYWJiZWQgZm9yCisgICAgICogICAgICAgICAgICB3cml0aW5nIG9yIGJlIHJlbGVhc2VkLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRpbGVVcGRhdGUoV3JpdGFibGVSZW5kZXJlZEltYWdlIHNvdXJjZSwgaW50IHRpbGVYLCBpbnQgdGlsZVksIGJvb2xlYW4gd2lsbEJlV3JpdGFibGUpOworICAgIHB1YmxpYyB2b2lkIHRpbGVVcGRhdGUoV3JpdGFibGVSZW5kZXJlZEltYWdlIHNvdXJjZSwgaW50IHRpbGVYLCBpbnQgdGlsZVksCisgICAgICAgICAgICBib29sZWFuIHdpbGxCZVdyaXRhYmxlKTsKIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvVm9sYXRpbGVJbWFnZS5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL1ZvbGF0aWxlSW1hZ2UuamF2YQppbmRleCAzYjBjZmIyLi5mMjRlODY2IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvVm9sYXRpbGVJbWFnZS5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9Wb2xhdGlsZUltYWdlLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgQWxleGV5IEEuIFBldHJlbmtvCiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5pbWFnZTsKIAogaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzOwpAQCAtMjgsMzUgKzI5LDM2IEBACiBpbXBvcnQgamF2YS5hd3QuVHJhbnNwYXJlbmN5OwogCiAvKioKLSAqIFRoZSBWb2xhdGlsZUltYWdlIGFic3RyYWN0IGNsYXNzIHJlcHJlc2VudHMgYW4gaW1hZ2Ugd2hpY2ggY2FuIGxvc2UgCi0gKiBpdHMgY29udGVudHMgYXQgYW55IHBvaW50LiBWb2xhdGlsZUltYWdlIG9iamVjdHMgYXJlIGRldmljZSBzcGVjaWZpYy4KLSAqIFRoaXMgY2xhc3MgcHJvdmllcyBtZXRob2RzIGZvciBjaGVja2luZyBpZiBvcGVyYXRpb24gb2YgdGhpcyBpbWFnZQotICogYXJlIGNvbXBhdGlibGUgZm9yIHRoZSBHcmFwaGljc0NvbmZpZ3VyYXRpb24uIAorICogVGhlIFZvbGF0aWxlSW1hZ2UgYWJzdHJhY3QgY2xhc3MgcmVwcmVzZW50cyBhbiBpbWFnZSB3aGljaCBjYW4gbG9zZSBpdHMKKyAqIGNvbnRlbnRzIGF0IGFueSBwb2ludC4gVm9sYXRpbGVJbWFnZSBvYmplY3RzIGFyZSBkZXZpY2Ugc3BlY2lmaWMuIFRoaXMgY2xhc3MKKyAqIHByb3ZpZGVzIG1ldGhvZHMgZm9yIGNoZWNraW5nIGlmIG9wZXJhdGlvbiBvZiB0aGlzIGltYWdlIGFyZSBjb21wYXRpYmxlIGZvcgorICogdGhlIEdyYXBoaWNzQ29uZmlndXJhdGlvbi4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWb2xhdGlsZUltYWdlIGV4dGVuZHMgSW1hZ2UKLSAgICAvLyBWb2xhdGlsZSBpbWFnZSBpbXBsZW1lbnRzIFRyYW5zcGFyZW5jeSBzaW5jZSAxLjUKLSAgICBpbXBsZW1lbnRzIFRyYW5zcGFyZW5jeSB7Ci0gICAgCi0gICAgLyoqIAotICAgICAqIFRoZSBDb25zdGFudCBJTUFHRV9JTkNPTVBBVElCTEUgaW5kaWNhdGVzIHRoYXQgdGhpcyBWb2xhdGlsZUltYWdlIAotICAgICAqIGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgR3JhcGhpY3NDb25maWd1cmF0aW9uIG9iamVjdC4gCisvLyBWb2xhdGlsZSBpbWFnZSBpbXBsZW1lbnRzIFRyYW5zcGFyZW5jeSBzaW5jZSAxLjUKKyAgICAgICAgaW1wbGVtZW50cyBUcmFuc3BhcmVuY3kgeworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IElNQUdFX0lOQ09NUEFUSUJMRSBpbmRpY2F0ZXMgdGhhdCB0aGlzIFZvbGF0aWxlSW1hZ2UgaXMgbm90CisgICAgICogYXBwbGljYWJsZSBmb3IgdGhlIEdyYXBoaWNzQ29uZmlndXJhdGlvbiBvYmplY3QuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU1BR0VfSU5DT01QQVRJQkxFID0gMjsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgSU1BR0VfT0sgaW5kaWNhdGVzIHRoYXQgVm9sYXRpbGVJbWFnZSBpcyByZWFkeSAKLSAgICAgKiBmb3IgdXNpbmcuCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IElNQUdFX09LIGluZGljYXRlcyB0aGF0IFZvbGF0aWxlSW1hZ2UgaXMgcmVhZHkgZm9yIHVzaW5nLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElNQUdFX09LID0gMDsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgSU1BR0VfUkVTVE9SRUQgaW5kaWNhdGVzIHRoYXQgVm9sYXRpbGVJbWFnZQotICAgICAqIHdpbGwgYmUgcmVhZHkgdG8gdXNlIGFmdGVyIHJlc3RvcmluZy4gCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IElNQUdFX1JFU1RPUkVEIGluZGljYXRlcyB0aGF0IFZvbGF0aWxlSW1hZ2Ugd2lsbCBiZSByZWFkeSB0bworICAgICAqIHVzZSBhZnRlciByZXN0b3JpbmcuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU1BR0VfUkVTVE9SRUQgPSAxOwogCi0gICAgLyoqIAotICAgICAqIFRoZSB0cmFuc3BhcmVuY3kgdmFsdWUgb2YgdGhpcyBpbWFnZS4gCisgICAgLyoqCisgICAgICogVGhlIHRyYW5zcGFyZW5jeSB2YWx1ZSBvZiB0aGlzIGltYWdlLgogICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgdHJhbnNwYXJlbmN5ID0gT1BBUVVFOwogCkBAIC02OCw4ICs3MCw4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHJlbmRlcmluZyBkYXRhIGlzIGxvc3QgZHVyaW5nIHZhbGlkYXRpbmcuCi0gICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciByZW5kZXJpbmcgb3BlcmF0aW9uIG9mIGltYWdlLgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiByZW5kZXJpbmcgZGF0YSBpcyBsb3N0IGR1cmluZyB2YWxpZGF0aW5nLiBUaGlzIG1ldGhvZAorICAgICAqIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgcmVuZGVyaW5nIG9wZXJhdGlvbiBvZiBpbWFnZS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGNvbnRlbnRzIGxvc3QgZHVyaW5nIHZhbGlkYXRpbmcsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KQEAgLTk4LDggKzEwMCw4IEBACiAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRIZWlnaHQoKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgYSBCdWZmZXJlZEltYWdlIHJlcHJlc2VudGF0aW9uIG9mIGN1cnJlbnQgVm9sYXRpbGVJbWFnZSB0aGF0Ci0gICAgICogd29uJ3QgYmUgYWZmZWN0ZWQgYnkgYW55IGNoYW5nZXMgdG8gdGhpcyBWb2xhdGlsZUltYWdlLgorICAgICAqIEdldHMgYSBCdWZmZXJlZEltYWdlIHJlcHJlc2VudGF0aW9uIG9mIGN1cnJlbnQgVm9sYXRpbGVJbWFnZSB0aGF0IHdvbid0CisgICAgICogYmUgYWZmZWN0ZWQgYnkgYW55IGNoYW5nZXMgdG8gdGhpcyBWb2xhdGlsZUltYWdlLgogICAgICAqIAogICAgICAqIEByZXR1cm4gYSBCdWZmZXJlZEltYWdlIHJlcHJlc2VudGF0aW9uIG9mIGN1cnJlbnQgVm9sYXRpbGVJbWFnZS4KICAgICAgKi8KQEAgLTExMywxNCArMTE1LDE0IEBACiAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRXaWR0aCgpOwogCiAgICAgLyoqCi0gICAgICogVmFsaWRhdGVzIHRoZSBkcmF3aW5nIHN1cmZhY2Ugb2YgdGhlIGltYWdlIGlmIHRoZSBzdXJmYWNlIGhhZCBiZWVuIAotICAgICAqIGxvc3QgYW5kIGlmIHRoZSBzcGFjaWZpZWQgR3JhcGhpY3NDb25maWd1cmF0aW9uIG9iamVjdCBpcyAgCi0gICAgICogYXBwbGljYWJsZSB0byB0aGlzIGltYWdlLiAKKyAgICAgKiBWYWxpZGF0ZXMgdGhlIGRyYXdpbmcgc3VyZmFjZSBvZiB0aGUgaW1hZ2UgaWYgdGhlIHN1cmZhY2UgaGFkIGJlZW4gbG9zdAorICAgICAqIGFuZCBpZiB0aGUgc3BlY2lmaWVkIEdyYXBoaWNzQ29uZmlndXJhdGlvbiBvYmplY3QgaXMgYXBwbGljYWJsZSB0byB0aGlzCisgICAgICogaW1hZ2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGdjIEdyYXBoaWNzQ29uZmlndXJhdGlvbiBvYmplY3QuCi0gICAgICogCisgICAgICogQHBhcmFtIGdjCisgICAgICogICAgICAgICAgICB0aGUgR3JhcGhpY3NDb25maWd1cmF0aW9uIG9iamVjdC4KICAgICAgKiBAcmV0dXJuIG9uZSBvZiB0aGUgaW1hZ2Ugc3RhdHVzIGNvbnN0YW50czogSU1BR0VfT0ssIElNQUdFX1JFU1RPUkVEIG9yCi0gICAgICogSU1BR0VfSU5DT01QQVRJQkxFLgorICAgICAqICAgICAgICAgSU1BR0VfSU5DT01QQVRJQkxFLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgdmFsaWRhdGUoR3JhcGhpY3NDb25maWd1cmF0aW9uIGdjKTsKIApkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL1dyaXRhYmxlUmFzdGVyLmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvV3JpdGFibGVSYXN0ZXIuamF2YQppbmRleCAwODkzOTE1Li41MTM2NmVlIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvV3JpdGFibGVSYXN0ZXIuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvV3JpdGFibGVSYXN0ZXIuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBJZ29yIFYuIFN0b2x5YXJvdgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuaW1hZ2U7CiAKIGltcG9ydCBqYXZhLmF3dC5Qb2ludDsKQEAgLTI2LDExNCArMjcsMTM2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LmF3dC5pbnRlcm5hbC5ubHMuTWVzc2FnZXM7CiAKIC8qKgotICogVGhlIFdyaXRhYmxlUmFzdGVyIGNsYXNzIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgZm9yIAotICogd3JpdGluZyBzYW1wbGVzIGFuZCBwaXhlbCBjYXBhYmlsaXRpZXMgdG8gdGhlIFJhc3Rlci4KKyAqIFRoZSBXcml0YWJsZVJhc3RlciBjbGFzcyBwcm92aWRlcyBmdW5jdGlvbmFsaXR5IGZvciB3cml0aW5nIHNhbXBsZXMgYW5kIHBpeGVsCisgKiBjYXBhYmlsaXRpZXMgdG8gdGhlIFJhc3Rlci4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBXcml0YWJsZVJhc3RlciBleHRlbmRzIFJhc3RlciB7CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgV3JpdGFibGVSYXN0ZXIgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCAKLSAgICAgKiBTYW1wbGVNb2RlbCwgRGF0YUJ1ZmZlciwgcmVjdGFuZ3VsYXIgcmVnaW9uIGFuZCBwYXJlbnQgCi0gICAgICogV3JpdGFibGVSYXN0ZXIuIAorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBXcml0YWJsZVJhc3RlciBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIFNhbXBsZU1vZGVsLAorICAgICAqIERhdGFCdWZmZXIsIHJlY3Rhbmd1bGFyIHJlZ2lvbiBhbmQgcGFyZW50IFdyaXRhYmxlUmFzdGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzYW1wbGVNb2RlbCB0aGUgc3BlY2lmaWVkIFNhbXBsZU1vZGVsLgotICAgICAqIEBwYXJhbSBkYXRhQnVmZmVyIHRoZSBzcGVjaWZpZWQgRGF0YUJ1ZmZlci4KLSAgICAgKiBAcGFyYW0gYVJlZ2lvbiB0aGUgcmVjdGFuZ3VsYXIgcmVnaW9uIHdoaWNoIGRlZmluZXMgdGhlIG5ldyBpbWFnZSBib3VuZHMuIAotICAgICAqIEBwYXJhbSBzYW1wbGVNb2RlbFRyYW5zbGF0ZSB0aGlzIHBvaW50IGRlZmluZXMgdGhlIHRyYW5zbGF0aW9uIHBvaW50Ci0gICAgICogZnJvbSB0aGUgU2FtcGxlTW9kZWwgdG8gdGhlIG5ldyBXcml0YWJsZVJhc3RlciBjb29yZGluYXRlcy4KLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgb2YgdGhpcyBXcml0YWJsZVJhc3Rlci4KKyAgICAgKiBAcGFyYW0gc2FtcGxlTW9kZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgU2FtcGxlTW9kZWwuCisgICAgICogQHBhcmFtIGRhdGFCdWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgRGF0YUJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gYVJlZ2lvbgorICAgICAqICAgICAgICAgICAgdGhlIHJlY3Rhbmd1bGFyIHJlZ2lvbiB3aGljaCBkZWZpbmVzIHRoZSBuZXcgaW1hZ2UgYm91bmRzLgorICAgICAqIEBwYXJhbSBzYW1wbGVNb2RlbFRyYW5zbGF0ZQorICAgICAqICAgICAgICAgICAgdGhpcyBwb2ludCBkZWZpbmVzIHRoZSB0cmFuc2xhdGlvbiBwb2ludCBmcm9tIHRoZSBTYW1wbGVNb2RlbAorICAgICAqICAgICAgICAgICAgdG8gdGhlIG5ldyBXcml0YWJsZVJhc3RlciBjb29yZGluYXRlcy4KKyAgICAgKiBAcGFyYW0gcGFyZW50CisgICAgICogICAgICAgICAgICB0aGUgcGFyZW50IG9mIHRoaXMgV3JpdGFibGVSYXN0ZXIuCiAgICAgICovCi0gICAgcHJvdGVjdGVkIFdyaXRhYmxlUmFzdGVyKFNhbXBsZU1vZGVsIHNhbXBsZU1vZGVsLCBEYXRhQnVmZmVyIGRhdGFCdWZmZXIsCi0gICAgICAgICAgICBSZWN0YW5nbGUgYVJlZ2lvbiwgUG9pbnQgc2FtcGxlTW9kZWxUcmFuc2xhdGUsCi0gICAgICAgICAgICBXcml0YWJsZVJhc3RlciBwYXJlbnQpIHsKKyAgICBwcm90ZWN0ZWQgV3JpdGFibGVSYXN0ZXIoU2FtcGxlTW9kZWwgc2FtcGxlTW9kZWwsIERhdGFCdWZmZXIgZGF0YUJ1ZmZlciwgUmVjdGFuZ2xlIGFSZWdpb24sCisgICAgICAgICAgICBQb2ludCBzYW1wbGVNb2RlbFRyYW5zbGF0ZSwgV3JpdGFibGVSYXN0ZXIgcGFyZW50KSB7CiAgICAgICAgIHN1cGVyKHNhbXBsZU1vZGVsLCBkYXRhQnVmZmVyLCBhUmVnaW9uLCBzYW1wbGVNb2RlbFRyYW5zbGF0ZSwgcGFyZW50KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgV3JpdGFibGVSYXN0ZXIgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZAotICAgICAqIFNhbXBsZU1vZGVsIHdoaWNoIGRlZmluZXMgYSBsYXlvdXQgb2YgdGhpcyBXcml0YWJsZVJhc3RlciBhbmQgCi0gICAgICogRGF0YUJ1ZmZlciBvYmplY3RzIHdoaWNoIGRlZmluZXMgdGhlIGltYWdlIGRhdGEuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IFdyaXRhYmxlUmFzdGVyIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgU2FtcGxlTW9kZWwKKyAgICAgKiB3aGljaCBkZWZpbmVzIGEgbGF5b3V0IG9mIHRoaXMgV3JpdGFibGVSYXN0ZXIgYW5kIERhdGFCdWZmZXIgb2JqZWN0cworICAgICAqIHdoaWNoIGRlZmluZXMgdGhlIGltYWdlIGRhdGEuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNhbXBsZU1vZGVsIHRoZSBzcGVjaWZpZWQgU2FtcGxlTW9kZWwuCi0gICAgICogQHBhcmFtIGRhdGFCdWZmZXIgdGhlIHNwZWNpZmllZCBEYXRhQnVmZmVyLgotICAgICAqIEBwYXJhbSBvcmlnaW4gdGhlIHBvaW50IG9mIG9yaWdpbi4KKyAgICAgKiBAcGFyYW0gc2FtcGxlTW9kZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgU2FtcGxlTW9kZWwuCisgICAgICogQHBhcmFtIGRhdGFCdWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgRGF0YUJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gb3JpZ2luCisgICAgICogICAgICAgICAgICB0aGUgcG9pbnQgb2Ygb3JpZ2luLgogICAgICAqLwotICAgIHByb3RlY3RlZCBXcml0YWJsZVJhc3RlcihTYW1wbGVNb2RlbCBzYW1wbGVNb2RlbCwgRGF0YUJ1ZmZlciBkYXRhQnVmZmVyLAotICAgICAgICAgICAgUG9pbnQgb3JpZ2luKSB7Ci0gICAgICAgIHRoaXMoc2FtcGxlTW9kZWwsIGRhdGFCdWZmZXIsIG5ldyBSZWN0YW5nbGUob3JpZ2luLngsIG9yaWdpbi55LAotICAgICAgICAgICAgICAgIHNhbXBsZU1vZGVsLndpZHRoLCBzYW1wbGVNb2RlbC5oZWlnaHQpLCBvcmlnaW4sIG51bGwpOworICAgIHByb3RlY3RlZCBXcml0YWJsZVJhc3RlcihTYW1wbGVNb2RlbCBzYW1wbGVNb2RlbCwgRGF0YUJ1ZmZlciBkYXRhQnVmZmVyLCBQb2ludCBvcmlnaW4pIHsKKyAgICAgICAgdGhpcyhzYW1wbGVNb2RlbCwgZGF0YUJ1ZmZlciwgbmV3IFJlY3RhbmdsZShvcmlnaW4ueCwgb3JpZ2luLnksIHNhbXBsZU1vZGVsLndpZHRoLAorICAgICAgICAgICAgICAgIHNhbXBsZU1vZGVsLmhlaWdodCksIG9yaWdpbiwgbnVsbCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IFdyaXRhYmxlUmFzdGVyIHdpdGggdGhlIHNwZWNpZmllZCBTYW1wbGVNb2RlbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2FtcGxlTW9kZWwgdGhlIHNwZWNpZmllZCBTYW1wbGVNb2RlbC4KLSAgICAgKiBAcGFyYW0gb3JpZ2luIHRoZSBvcmlnaW4uCisgICAgICogQHBhcmFtIHNhbXBsZU1vZGVsCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIFNhbXBsZU1vZGVsLgorICAgICAqIEBwYXJhbSBvcmlnaW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBvcmlnaW4uCiAgICAgICovCiAgICAgcHJvdGVjdGVkIFdyaXRhYmxlUmFzdGVyKFNhbXBsZU1vZGVsIHNhbXBsZU1vZGVsLCBQb2ludCBvcmlnaW4pIHsKLSAgICAgICAgdGhpcyhzYW1wbGVNb2RlbCwgc2FtcGxlTW9kZWwuY3JlYXRlRGF0YUJ1ZmZlcigpLCBuZXcgUmVjdGFuZ2xlKAotICAgICAgICAgICAgICAgIG9yaWdpbi54LCBvcmlnaW4ueSwgc2FtcGxlTW9kZWwud2lkdGgsIHNhbXBsZU1vZGVsLmhlaWdodCksCi0gICAgICAgICAgICAgICAgb3JpZ2luLCBudWxsKTsKKyAgICAgICAgdGhpcyhzYW1wbGVNb2RlbCwgc2FtcGxlTW9kZWwuY3JlYXRlRGF0YUJ1ZmZlcigpLCBuZXcgUmVjdGFuZ2xlKG9yaWdpbi54LCBvcmlnaW4ueSwKKyAgICAgICAgICAgICAgICBzYW1wbGVNb2RlbC53aWR0aCwgc2FtcGxlTW9kZWwuaGVpZ2h0KSwgb3JpZ2luLCBudWxsKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkYXRhIGZvciBhIHNpbmdsZSBwaXhlbCBmcm9tIGFuIGlucHV0IE9iamVjdCB3aGljaCAKLSAgICAgKiByZXByZXNlbnRzIGFuIGFycmF5IG9mIHByaW1pdGl2ZSB0eXBlczogRGF0YUJ1ZmZlci5UWVBFX0JZVEUsIAotICAgICAqIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQsIERhdGFCdWZmZXIuVFlQRV9JTlQsIERhdGFCdWZmZXIuVFlQRV9TSE9SVCwgCi0gICAgICogRGF0YUJ1ZmZlci5UWVBFX0ZMT0FULCBvciBEYXRhQnVmZmVyLlRZUEVfRE9VQkxFLgorICAgICAqIFNldHMgdGhlIGRhdGEgZm9yIGEgc2luZ2xlIHBpeGVsIGZyb20gYW4gaW5wdXQgT2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgYW4KKyAgICAgKiBhcnJheSBvZiBwcmltaXRpdmUgdHlwZXM6IERhdGFCdWZmZXIuVFlQRV9CWVRFLCBEYXRhQnVmZmVyLlRZUEVfVVNIT1JULAorICAgICAqIERhdGFCdWZmZXIuVFlQRV9JTlQsIERhdGFCdWZmZXIuVFlQRV9TSE9SVCwgRGF0YUJ1ZmZlci5UWVBFX0ZMT0FULCBvcgorICAgICAqIERhdGFCdWZmZXIuVFlQRV9ET1VCTEUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCi0gICAgICogQHBhcmFtIGluRGF0YSB0aGUgaW5wdXQgZGF0YS4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLgorICAgICAqIEBwYXJhbSBpbkRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnB1dCBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERhdGFFbGVtZW50cyhpbnQgeCwgaW50IHksIE9iamVjdCBpbkRhdGEpIHsKLSAgICAgICAgc2FtcGxlTW9kZWwuc2V0RGF0YUVsZW1lbnRzKHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsCi0gICAgICAgICAgICAgICAgeSAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgaW5EYXRhLCBkYXRhQnVmZmVyKTsKKyAgICAgICAgc2FtcGxlTW9kZWwuc2V0RGF0YUVsZW1lbnRzKHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsIHkgLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVksIGluRGF0YSwKKyAgICAgICAgICAgICAgICBkYXRhQnVmZmVyKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkYXRhIGVsZW1lbnRzIHdoaWNoIHJlcHJlc2VudCBwaXhlbCBkYXRhIHRvIHRoZSBzcGVjaWZpZWQgCi0gICAgICogcmVjdGFuZ2xlIGFyZWEgYXMgYSBwcmltaXRpdmUgYXJyYXkuIFRoZSBmb2xsb3dpbmcgaW1hZ2UgZGF0YSB0eXBlcwotICAgICAqIGFyZSBzdXBwb3J0ZWQ6IERhdGFCdWZmZXIuVFlQRV9CWVRFLCBEYXRhQnVmZmVyLlRZUEVfVVNIT1JULCAKLSAgICAgKiBEYXRhQnVmZmVyLlRZUEVfSU5ULCBEYXRhQnVmZmVyLlRZUEVfU0hPUlQsIERhdGFCdWZmZXIuVFlQRV9GTE9BVCwgCi0gICAgICogb3IgRGF0YUJ1ZmZlci5UWVBFX0RPVUJMRS4KKyAgICAgKiBTZXRzIHRoZSBkYXRhIGVsZW1lbnRzIHdoaWNoIHJlcHJlc2VudCBwaXhlbCBkYXRhIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiByZWN0YW5nbGUgYXJlYSBhcyBhIHByaW1pdGl2ZSBhcnJheS4gVGhlIGZvbGxvd2luZyBpbWFnZSBkYXRhIHR5cGVzIGFyZQorICAgICAqIHN1cHBvcnRlZDogRGF0YUJ1ZmZlci5UWVBFX0JZVEUsIERhdGFCdWZmZXIuVFlQRV9VU0hPUlQsCisgICAgICogRGF0YUJ1ZmZlci5UWVBFX0lOVCwgRGF0YUJ1ZmZlci5UWVBFX1NIT1JULCBEYXRhQnVmZmVyLlRZUEVfRkxPQVQsIG9yCisgICAgICogRGF0YUJ1ZmZlci5UWVBFX0RPVUJMRS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIGluRGF0YSB0aGUgYXJyYXkgb2YgcHJpbWl0aXZlIHR5cGUgZGF0YSB0byBiZSBzZXQgdG8gdGhlCi0gICAgICogc3BlY2lmaWVkIGFyZWEuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gaW5EYXRhCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgcHJpbWl0aXZlIHR5cGUgZGF0YSB0byBiZSBzZXQgdG8gdGhlIHNwZWNpZmllZAorICAgICAqICAgICAgICAgICAgYXJlYS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXREYXRhRWxlbWVudHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIE9iamVjdCBpbkRhdGEpIHsKLSAgICAgICAgc2FtcGxlTW9kZWwuc2V0RGF0YUVsZW1lbnRzKHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsCi0gICAgICAgICAgICAgICAgeSAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgdywgaCwgaW5EYXRhLCBkYXRhQnVmZmVyKTsKKyAgICAgICAgc2FtcGxlTW9kZWwuc2V0RGF0YUVsZW1lbnRzKHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsIHkgLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVksIHcsIGgsCisgICAgICAgICAgICAgICAgaW5EYXRhLCBkYXRhQnVmZmVyKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBjaGlsZCBvZiB0aGlzIFdyaXRhYmxlUmFzdGVyIGJ5IHNoYXJpbmcgdGhlIHNwZWNpZmllZCAKLSAgICAgKiByZWN0YW5ndWxhciBhcmVhIGluIHRoaXMgV3JpdGFibGVSYXN0ZXIuIAotICAgICAqIFRoZSBwYXJlbnRYLCBwYXJlbnRZLCB3aWR0aCBhbmQgaGVpZ2h0IHBhcmFtZXRlcnMgc3BlY2lmeSByZWN0YW5ndWxhcgotICAgICAqIGFyZWEgdG8gYmUgc2hhcmVkLgorICAgICAqIENyZWF0ZXMgdGhlIGNoaWxkIG9mIHRoaXMgV3JpdGFibGVSYXN0ZXIgYnkgc2hhcmluZyB0aGUgc3BlY2lmaWVkCisgICAgICogcmVjdGFuZ3VsYXIgYXJlYSBpbiB0aGlzIFdyaXRhYmxlUmFzdGVyLiBUaGUgcGFyZW50WCwgcGFyZW50WSwgd2lkdGggYW5kCisgICAgICogaGVpZ2h0IHBhcmFtZXRlcnMgc3BlY2lmeSByZWN0YW5ndWxhciBhcmVhIHRvIGJlIHNoYXJlZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50WCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiAKLSAgICAgKiB0aGUgc2hhcmVkIHJlY3RhbmdsZSB3aXRoIHJlc3BlY3QgdG8gdGhpcyBXcml0YWJsZVJhc3RlcicgY29vcmRpbmF0ZXMuIAotICAgICAqIEBwYXJhbSBwYXJlbnRZIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIAotICAgICAqIHRoZSBzaGFyZWQgcmVjdGFuZ2xlIHdpdGggcmVzcGVjdCB0byB0aGlzIFdyaXRhYmxlUmFzdGVyJyBjb29yZGluYXRlcy4gCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSBjaGlsZCBhcmVhLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIGNoaWxkIGFyZWEuCi0gICAgICogQHBhcmFtIGNoaWxkTWluWCB0aGUgWCBjb29yZGluYXRlIG9mIGNoaWxkIGFyZWEgbWFwcGVkIHRvIHRoZSBwYXJlbnRYCi0gICAgICogY29vcmRpbmF0ZS4KLSAgICAgKiBAcGFyYW0gY2hpbGRNaW5ZIHRoZSBZIGNvb3JkaW5hdGUgb2YgY2hpbGQgYXJlYSBtYXBwZWQgdG8gdGhlIHBhcmVudFkKLSAgICAgKiBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSBiYW5kTGlzdCB0aGUgYXJyYXkgb2YgYmFuZCBpbmRpY2llcy4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGFyZW50WAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHNoYXJlZAorICAgICAqICAgICAgICAgICAgcmVjdGFuZ2xlIHdpdGggcmVzcGVjdCB0byB0aGlzIFdyaXRhYmxlUmFzdGVyJyBjb29yZGluYXRlcy4KKyAgICAgKiBAcGFyYW0gcGFyZW50WQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHNoYXJlZAorICAgICAqICAgICAgICAgICAgcmVjdGFuZ2xlIHdpdGggcmVzcGVjdCB0byB0aGlzIFdyaXRhYmxlUmFzdGVyJyBjb29yZGluYXRlcy4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBjaGlsZCBhcmVhLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBjaGlsZCBhcmVhLgorICAgICAqIEBwYXJhbSBjaGlsZE1pblgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgY2hpbGQgYXJlYSBtYXBwZWQgdG8gdGhlIHBhcmVudFgKKyAgICAgKiAgICAgICAgICAgIGNvb3JkaW5hdGUuCisgICAgICogQHBhcmFtIGNoaWxkTWluWQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiBjaGlsZCBhcmVhIG1hcHBlZCB0byB0aGUgcGFyZW50WQorICAgICAqICAgICAgICAgICAgY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0gYmFuZExpc3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBiYW5kIGluZGljZXMuCiAgICAgICogQHJldHVybiB0aGUgY2hpbGQgV3JpdGFibGVSYXN0ZXIuCiAgICAgICovCi0gICAgcHVibGljIFdyaXRhYmxlUmFzdGVyIGNyZWF0ZVdyaXRhYmxlQ2hpbGQoaW50IHBhcmVudFgsIGludCBwYXJlbnRZLCBpbnQgdywKLSAgICAgICAgICAgIGludCBoLCBpbnQgY2hpbGRNaW5YLCBpbnQgY2hpbGRNaW5ZLCBpbnQgYmFuZExpc3RbXSkgeworICAgIHB1YmxpYyBXcml0YWJsZVJhc3RlciBjcmVhdGVXcml0YWJsZUNoaWxkKGludCBwYXJlbnRYLCBpbnQgcGFyZW50WSwgaW50IHcsIGludCBoLAorICAgICAgICAgICAgaW50IGNoaWxkTWluWCwgaW50IGNoaWxkTWluWSwgaW50IGJhbmRMaXN0W10pIHsKICAgICAgICAgaWYgKHcgPD0gMCB8fCBoIDw9IDApIHsKLSAgICAgICAgICAgIC8vIGF3dC4yNDQ9V2lkdGggb3IgSGVpZ2h0IG9mIGNoaWxkIFJhc3RlciBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gemVybworICAgICAgICAgICAgLy8gYXd0LjI0ND1XaWR0aCBvciBIZWlnaHQgb2YgY2hpbGQgUmFzdGVyIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0bworICAgICAgICAgICAgLy8gemVybwogICAgICAgICAgICAgdGhyb3cgbmV3IFJhc3RlckZvcm1hdEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNDQiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCkBAIC0xNDcsMjIgKzE3MCwyMiBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IFJhc3RlckZvcm1hdEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNDYiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCi0gICAgICAgIGlmICgobG9uZykgcGFyZW50WCArIHcgPiBJbnRlZ2VyLk1BWF9WQUxVRSkgeworICAgICAgICBpZiAoKGxvbmcpcGFyZW50WCArIHcgPiBJbnRlZ2VyLk1BWF9WQUxVRSkgewogICAgICAgICAgICAgLy8gYXd0LjI0Nz1wYXJlbnRYICsgdyByZXN1bHRzIGluIGludGVnZXIgb3ZlcmZsb3cKICAgICAgICAgICAgIHRocm93IG5ldyBSYXN0ZXJGb3JtYXRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjQ3IikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KIAotICAgICAgICBpZiAoKGxvbmcpIHBhcmVudFkgKyBoID4gSW50ZWdlci5NQVhfVkFMVUUpIHsKKyAgICAgICAgaWYgKChsb25nKXBhcmVudFkgKyBoID4gSW50ZWdlci5NQVhfVkFMVUUpIHsKICAgICAgICAgICAgIC8vIGF3dC4yNDg9cGFyZW50WSArIGggcmVzdWx0cyBpbiBpbnRlZ2VyIG92ZXJmbG93CiAgICAgICAgICAgICB0aHJvdyBuZXcgUmFzdGVyRm9ybWF0RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjI0OCIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAKLSAgICAgICAgaWYgKChsb25nKSBjaGlsZE1pblggKyB3ID4gSW50ZWdlci5NQVhfVkFMVUUpIHsKKyAgICAgICAgaWYgKChsb25nKWNoaWxkTWluWCArIHcgPiBJbnRlZ2VyLk1BWF9WQUxVRSkgewogICAgICAgICAgICAgLy8gYXd0LjI0OT1jaGlsZE1pblggKyB3IHJlc3VsdHMgaW4gaW50ZWdlciBvdmVyZmxvdwogICAgICAgICAgICAgdGhyb3cgbmV3IFJhc3RlckZvcm1hdEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC4yNDkiKSk7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgfQogCi0gICAgICAgIGlmICgobG9uZykgY2hpbGRNaW5ZICsgaCA+IEludGVnZXIuTUFYX1ZBTFVFKSB7CisgICAgICAgIGlmICgobG9uZyljaGlsZE1pblkgKyBoID4gSW50ZWdlci5NQVhfVkFMVUUpIHsKICAgICAgICAgICAgIC8vIGF3dC4yNEE9Y2hpbGRNaW5ZICsgaCByZXN1bHRzIGluIGludGVnZXIgb3ZlcmZsb3cKICAgICAgICAgICAgIHRocm93IG5ldyBSYXN0ZXJGb3JtYXRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJhd3QuMjRBIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KQEAgLTE3OSw1OSArMjAyLDYwIEBACiAgICAgICAgIGludCBjaGlsZFRyYW5zbGF0ZVkgPSBjaGlsZE1pblkgLSBwYXJlbnRZOwogCiAgICAgICAgIHJldHVybiBuZXcgV3JpdGFibGVSYXN0ZXIoY2hpbGRNb2RlbCwgZGF0YUJ1ZmZlciwKLSAgICAgICAgICAgICAgICBuZXcgUmVjdGFuZ2xlKGNoaWxkTWluWCwgY2hpbGRNaW5ZLCB3LCBoKSwKLSAgICAgICAgICAgICAgICBuZXcgUG9pbnQoY2hpbGRUcmFuc2xhdGVYICsgc2FtcGxlTW9kZWxUcmFuc2xhdGVYLAotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRUcmFuc2xhdGVZICsgc2FtcGxlTW9kZWxUcmFuc2xhdGVZKSwKLSAgICAgICAgICAgICAgICB0aGlzKTsKKyAgICAgICAgICAgICAgICBuZXcgUmVjdGFuZ2xlKGNoaWxkTWluWCwgY2hpbGRNaW5ZLCB3LCBoKSwgbmV3IFBvaW50KGNoaWxkVHJhbnNsYXRlWAorICAgICAgICAgICAgICAgICAgICAgICAgKyBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsIGNoaWxkVHJhbnNsYXRlWSArIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSksIHRoaXMpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIHRyYW5zbGF0ZWQgY2hpbGQgb2YgdGhpcyBXcml0YWJsZVJhc3Rlci4gCi0gICAgICogTmV3IFdyaXRhYmxlUmFzdGVyIG9iamVjdCBpcyBhIHJlZmVyZW5jZSB0byB0aGUgdGhpcyAKLSAgICAgKiBXcml0YWJsZVJhc3RlciBhbmQgd2l0aCBkaWZmZXJlbnQgbG9jYXRpb24uIAotICAgICAqICAKLSAgICAgKiBAcGFyYW0gY2hpbGRNaW5YIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIG5ldyBXcml0YWJsZVJhc3Rlci4KLSAgICAgKiBAcGFyYW0gY2hpbGRNaW5ZIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIG5ldyBXcml0YWJsZVJhc3Rlci4KKyAgICAgKiBDcmVhdGVzIHRoZSB0cmFuc2xhdGVkIGNoaWxkIG9mIHRoaXMgV3JpdGFibGVSYXN0ZXIuIE5ldyBXcml0YWJsZVJhc3RlcgorICAgICAqIG9iamVjdCBpcyBhIHJlZmVyZW5jZSB0byB0aGUgdGhpcyBXcml0YWJsZVJhc3RlciBhbmQgd2l0aCBkaWZmZXJlbnQKKyAgICAgKiBsb2NhdGlvbi4KICAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2hpbGRNaW5YCisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBuZXcgV3JpdGFibGVSYXN0ZXIuCisgICAgICogQHBhcmFtIGNoaWxkTWluWQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgbmV3IFdyaXRhYmxlUmFzdGVyLgogICAgICAqIEByZXR1cm4gdGhlIFdyaXRhYmxlUmFzdGVyLgogICAgICAqLwotICAgIHB1YmxpYyBXcml0YWJsZVJhc3RlciBjcmVhdGVXcml0YWJsZVRyYW5zbGF0ZWRDaGlsZChpbnQgY2hpbGRNaW5YLAotICAgICAgICAgICAgaW50IGNoaWxkTWluWSkgewotICAgICAgICByZXR1cm4gY3JlYXRlV3JpdGFibGVDaGlsZChtaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0LCBjaGlsZE1pblgsCi0gICAgICAgICAgICAgICAgY2hpbGRNaW5ZLCBudWxsKTsKKyAgICBwdWJsaWMgV3JpdGFibGVSYXN0ZXIgY3JlYXRlV3JpdGFibGVUcmFuc2xhdGVkQ2hpbGQoaW50IGNoaWxkTWluWCwgaW50IGNoaWxkTWluWSkgeworICAgICAgICByZXR1cm4gY3JlYXRlV3JpdGFibGVDaGlsZChtaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0LCBjaGlsZE1pblgsIGNoaWxkTWluWSwgbnVsbCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgcGFyZW50IFdyaXRhYmxlUmFzdGVyIGZvciB0aGlzIFdyaXRhYmxlUmFzdGVyIG9iamVjdC4gCisgICAgICogR2V0cyB0aGUgcGFyZW50IFdyaXRhYmxlUmFzdGVyIGZvciB0aGlzIFdyaXRhYmxlUmFzdGVyIG9iamVjdC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBwYXJlbnQgV3JpdGFibGVSYXN0ZXIgZm9yIHRoaXMgV3JpdGFibGVSYXN0ZXIgb2JqZWN0LgogICAgICAqLwogICAgIHB1YmxpYyBXcml0YWJsZVJhc3RlciBnZXRXcml0YWJsZVBhcmVudCgpIHsKLSAgICAgICAgcmV0dXJuIChXcml0YWJsZVJhc3RlcikgcGFyZW50OworICAgICAgICByZXR1cm4gKFdyaXRhYmxlUmFzdGVyKXBhcmVudDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHBpeGVscyBmcm9tIHRoZSBzcGVjaWZpZWQgc291cmNlIFJhc3RlciBzcmNSYXN0ZXIgdG8gdGhpcyAKKyAgICAgKiBTZXRzIHBpeGVscyBmcm9tIHRoZSBzcGVjaWZpZWQgc291cmNlIFJhc3RlciBzcmNSYXN0ZXIgdG8gdGhpcwogICAgICAqIFdyaXRhYmxlUmFzdGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzcmNSYXN0ZXIgdGhlIHNvdXJjZSBSYXN0ZXIuCisgICAgICogQHBhcmFtIHNyY1Jhc3RlcgorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBSYXN0ZXIuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UmVjdChSYXN0ZXIgc3JjUmFzdGVyKSB7CiAgICAgICAgIHNldFJlY3QoMCwgMCwgc3JjUmFzdGVyKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHBpeGVscyBmcm9tIHRoZSBzcGVjaWZpZWQgc291cmNlIFJhc3RlciBzcmNSYXN0ZXIgdG8gdGhpcyAKLSAgICAgKiBXcml0YWJsZVJhc3Rlci4gRWFjaCBwaXhlbCB3aXRoICh4LCB5KSBjb29yZGluYXRlcyBmcm9tIHRoZSBzb3VyY2UgCi0gICAgICogUmFzdGVyIGlzIGNvcGllZCB0byBwaXhlbCB3aXRoICh4K2R4LCB5K2R5KSBjb29yZGluYXRlcyBpbiB0aGlzCi0gICAgICogV3JpdGFibGVSYXN0ZXIuIFRoZSBwaXhlbHMgd2l0aCAoeCtkeCwgeStkeSkgY29vcmRpbmF0ZXMgd2hpY2gKLSAgICAgKiBhcmUgb3V0IHRoZSBib3VuZHMgb2YgdGhpcyByYXN0ZXIgYXJlIGlnbm9yZWQuIAotICAgICAqICAKLSAgICAgKiBAcGFyYW0gZHggdGhlIGRpc3RhbmNlIHRoZSBwaXhlbCdzIFggY29vcmRpbmF0ZSBpbiB0aGUgc291cmNlCi0gICAgICogUmFzdGVyIGlzIHRyYW5zbGF0ZWQgd2hlbiB3cml0dGllbiB0byB0aGlzIFdyaXRhYmxlUmFzdGVyLiAKLSAgICAgKiBAcGFyYW0gZHkgdGhlIGRpc3RhbmNlIHRoZSBwaXhlbCdzIFkgY29vcmRpbmF0ZSBpbiB0aGUgc291cmNlCi0gICAgICogUmFzdGVyIGlzIHRyYW5zbGF0ZWQgd2hlbiB3cml0dGllbiB0byB0aGlzIFdyaXRhYmxlUmFzdGVyLgotICAgICAqIEBwYXJhbSBzcmNSYXN0ZXIgdGhlIHNvdXJjZSBSYXN0ZXIuCisgICAgICogU2V0cyBwaXhlbHMgZnJvbSB0aGUgc3BlY2lmaWVkIHNvdXJjZSBSYXN0ZXIgc3JjUmFzdGVyIHRvIHRoaXMKKyAgICAgKiBXcml0YWJsZVJhc3Rlci4gRWFjaCBwaXhlbCB3aXRoICh4LCB5KSBjb29yZGluYXRlcyBmcm9tIHRoZSBzb3VyY2UgUmFzdGVyCisgICAgICogaXMgY29waWVkIHRvIHBpeGVsIHdpdGggKHgrZHgsIHkrZHkpIGNvb3JkaW5hdGVzIGluIHRoaXMgV3JpdGFibGVSYXN0ZXIuCisgICAgICogVGhlIHBpeGVscyB3aXRoICh4K2R4LCB5K2R5KSBjb29yZGluYXRlcyB3aGljaCBhcmUgb3V0IHRoZSBib3VuZHMgb2YgdGhpcworICAgICAqIHJhc3RlciBhcmUgaWdub3JlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBkaXN0YW5jZSB0aGUgcGl4ZWwncyBYIGNvb3JkaW5hdGUgaW4gdGhlIHNvdXJjZSBSYXN0ZXIgaXMKKyAgICAgKiAgICAgICAgICAgIHRyYW5zbGF0ZWQgd2hlbiB3cml0dGllbiB0byB0aGlzIFdyaXRhYmxlUmFzdGVyLgorICAgICAqIEBwYXJhbSBkeQorICAgICAqICAgICAgICAgICAgdGhlIGRpc3RhbmNlIHRoZSBwaXhlbCdzIFkgY29vcmRpbmF0ZSBpbiB0aGUgc291cmNlIFJhc3RlciBpcworICAgICAqICAgICAgICAgICAgdHJhbnNsYXRlZCB3aGVuIHdyaXR0aWVuIHRvIHRoaXMgV3JpdGFibGVSYXN0ZXIuCisgICAgICogQHBhcmFtIHNyY1Jhc3RlcgorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBSYXN0ZXIuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UmVjdChpbnQgZHgsIGludCBkeSwgUmFzdGVyIHNyY1Jhc3RlcikgewogICAgICAgICBpbnQgdyA9IHNyY1Jhc3Rlci5nZXRXaWR0aCgpOwpAQCAtMjcyLDQ3ICsyOTYsNDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHN3aXRjaCAoc2FtcGxlTW9kZWwuZ2V0RGF0YVR5cGUoKSkgewotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9CWVRFOgotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9TSE9SVDoKLSAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9JTlQ6Ci0gICAgICAgICAgICBpbnQgaVBpeGVsc0xpbmVbXSA9IG51bGw7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlQaXhlbHNMaW5lID0gc3JjUmFzdGVyLmdldFBpeGVscyhzcmNYLCBzcmNZICsgaSwgdywgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlQaXhlbHNMaW5lKTsKLSAgICAgICAgICAgICAgICBzZXRQaXhlbHMoZHN0WCwgZHN0WSArIGksIHcsIDEsIGlQaXhlbHNMaW5lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfQllURToKKyAgICAgICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX1NIT1JUOgorICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfVVNIT1JUOgorICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfSU5UOgorICAgICAgICAgICAgICAgIGludCBpUGl4ZWxzTGluZVtdID0gbnVsbDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpUGl4ZWxzTGluZSA9IHNyY1Jhc3Rlci5nZXRQaXhlbHMoc3JjWCwgc3JjWSArIGksIHcsIDEsIGlQaXhlbHNMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0UGl4ZWxzKGRzdFgsIGRzdFkgKyBpLCB3LCAxLCBpUGl4ZWxzTGluZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgRGF0YUJ1ZmZlci5UWVBFX0ZMT0FUOgotICAgICAgICAgICAgZmxvYXQgZlBpeGVsc0xpbmVbXSA9IG51bGw7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGg7IGkrKykgewotICAgICAgICAgICAgICAgIGZQaXhlbHNMaW5lID0gc3JjUmFzdGVyLmdldFBpeGVscyhzcmNYLCBzcmNZICsgaSwgdywgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZQaXhlbHNMaW5lKTsKLSAgICAgICAgICAgICAgICBzZXRQaXhlbHMoZHN0WCwgZHN0WSArIGksIHcsIDEsIGZQaXhlbHNMaW5lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfRkxPQVQ6CisgICAgICAgICAgICAgICAgZmxvYXQgZlBpeGVsc0xpbmVbXSA9IG51bGw7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZlBpeGVsc0xpbmUgPSBzcmNSYXN0ZXIuZ2V0UGl4ZWxzKHNyY1gsIHNyY1kgKyBpLCB3LCAxLCBmUGl4ZWxzTGluZSk7CisgICAgICAgICAgICAgICAgICAgIHNldFBpeGVscyhkc3RYLCBkc3RZICsgaSwgdywgMSwgZlBpeGVsc0xpbmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIERhdGFCdWZmZXIuVFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICBkb3VibGUgZFBpeGVsc0xpbmVbXSA9IG51bGw7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGg7IGkrKykgewotICAgICAgICAgICAgICAgIGRQaXhlbHNMaW5lID0gc3JjUmFzdGVyLmdldFBpeGVscyhzcmNYLCBzcmNZICsgaSwgdywgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRQaXhlbHNMaW5lKTsKLSAgICAgICAgICAgICAgICBzZXRQaXhlbHMoZHN0WCwgZHN0WSArIGksIHcsIDEsIGRQaXhlbHNMaW5lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhQnVmZmVyLlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgICAgIGRvdWJsZSBkUGl4ZWxzTGluZVtdID0gbnVsbDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBkUGl4ZWxzTGluZSA9IHNyY1Jhc3Rlci5nZXRQaXhlbHMoc3JjWCwgc3JjWSArIGksIHcsIDEsIGRQaXhlbHNMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0UGl4ZWxzKGRzdFgsIGRzdFkgKyBpLCB3LCAxLCBkUGl4ZWxzTGluZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGF0YSBmb3IgYSByZWN0YW5nbGUgb2YgcGl4ZWxzIGZyb20gYW4gaW5wdXQgUmFzdGVyIHRvCi0gICAgICogdGhpcyBXcml0YWJsZVJhc3Rlci4KKyAgICAgKiBTZXRzIHRoZSBkYXRhIGZvciBhIHJlY3RhbmdsZSBvZiBwaXhlbHMgZnJvbSBhbiBpbnB1dCBSYXN0ZXIgdG8gdGhpcworICAgICAqIFdyaXRhYmxlUmFzdGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50IHdoZXJlIHRoZSBkYXRhIG9mIAotICAgICAqIHRoZSBpbnB1dCBSYXN0ZXIgaXMgdG8gYmUgd3JpdHRlbi4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBwb2ludCB3aGVyZSB0aGUgZGF0YSBvZiAKLSAgICAgKiB0aGUgaW5wdXQgUmFzdGVyIGlzIHRvIGJlIHdyaXR0ZW4uCi0gICAgICogQHBhcmFtIGluUmFzdGVyIHRoZSBpbnB1dCBSYXN0ZXIuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50IHdoZXJlIHRoZSBkYXRhIG9mIHRoZSBpbnB1dAorICAgICAqICAgICAgICAgICAgUmFzdGVyIGlzIHRvIGJlIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50IHdoZXJlIHRoZSBkYXRhIG9mIHRoZSBpbnB1dAorICAgICAqICAgICAgICAgICAgUmFzdGVyIGlzIHRvIGJlIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIGluUmFzdGVyCisgICAgICogICAgICAgICAgICB0aGUgaW5wdXQgUmFzdGVyLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERhdGFFbGVtZW50cyhpbnQgeCwgaW50IHksIFJhc3RlciBpblJhc3RlcikgewogICAgICAgICBpbnQgZHN0WCA9IHggKyBpblJhc3Rlci5nZXRNaW5YKCk7CkBAIC0zMjEsOCArMzQ1LDggQEAKICAgICAgICAgaW50IHcgPSBpblJhc3Rlci5nZXRXaWR0aCgpOwogICAgICAgICBpbnQgaCA9IGluUmFzdGVyLmdldEhlaWdodCgpOwogCi0gICAgICAgIGlmIChkc3RYIDwgdGhpcy5taW5YIHx8IGRzdFggKyB3ID4gdGhpcy5taW5YICsgdGhpcy53aWR0aCB8fAotICAgICAgICAgICAgICAgIGRzdFkgPCB0aGlzLm1pblkgfHwgZHN0WSArIGggPiB0aGlzLm1pblkgKyB0aGlzLmhlaWdodCkgeworICAgICAgICBpZiAoZHN0WCA8IHRoaXMubWluWCB8fCBkc3RYICsgdyA+IHRoaXMubWluWCArIHRoaXMud2lkdGggfHwgZHN0WSA8IHRoaXMubWluWQorICAgICAgICAgICAgICAgIHx8IGRzdFkgKyBoID4gdGhpcy5taW5ZICsgdGhpcy5oZWlnaHQpIHsKICAgICAgICAgICAgIC8vIGF3dC42Mz1Db29yZGluYXRlcyBhcmUgbm90IGluIGJvdW5kcwogICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImF3dC42MyIpKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CkBAIC0zMzgsMTc5ICszNjIsMjMxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyBhIGludCBhcnJheSBvZiBzYW1wbGVzIGZvciB0aGUgc3BlY2lmaWVkIHBpeGVsIAotICAgICAqIGluIHRoaXMgV3JpdGFibGVSYXN0ZXIuIAorICAgICAqIFNldHMgYW4gaW50ZWdlciBhcnJheSBvZiBzYW1wbGVzIGZvciB0aGUgc3BlY2lmaWVkIHBpeGVsIGluIHRoaXMKKyAgICAgKiBXcml0YWJsZVJhc3Rlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgcGl4ZWwncyBYIGNvb3JkaW5hdGUuCi0gICAgICogQHBhcmFtIHkgdGhlIHBpeGVsJ3MgWSBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSBpQXJyYXkgdGhlIGludCBhcnJheSBvZiBzYW1wbGVzLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgcGl4ZWwncyBYIGNvb3JkaW5hdGUuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBwaXhlbCdzIFkgY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0gaUFycmF5CisgICAgICogICAgICAgICAgICB0aGUgaW50ZWdlciBhcnJheSBvZiBzYW1wbGVzLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFBpeGVsKGludCB4LCBpbnQgeSwgaW50IGlBcnJheVtdKSB7Ci0gICAgICAgIHNhbXBsZU1vZGVsLnNldFBpeGVsKHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsCi0gICAgICAgICAgICAgICAgeSAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgaUFycmF5LCBkYXRhQnVmZmVyKTsKKyAgICAgICAgc2FtcGxlTW9kZWwuc2V0UGl4ZWwoeCAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwgeSAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgaUFycmF5LAorICAgICAgICAgICAgICAgIGRhdGFCdWZmZXIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgYSBmbG9hdCBhcnJheSBvZiBzYW1wbGVzIGZvciB0aGUgc3BlY2lmaWVkIHBpeGVsIAotICAgICAqIGluIHRoaXMgV3JpdGFibGVSYXN0ZXIuIAorICAgICAqIFNldHMgYSBmbG9hdCBhcnJheSBvZiBzYW1wbGVzIGZvciB0aGUgc3BlY2lmaWVkIHBpeGVsIGluIHRoaXMKKyAgICAgKiBXcml0YWJsZVJhc3Rlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgcGl4ZWwncyBYIGNvb3JkaW5hdGUuCi0gICAgICogQHBhcmFtIHkgdGhlIHBpeGVsJ3MgWSBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSBmQXJyYXkgdGhlIGZsb2F0IGFycmF5IG9mIHNhbXBsZXMuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBwaXhlbCdzIFggY29vcmRpbmF0ZS4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIHBpeGVsJ3MgWSBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSBmQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdCBhcnJheSBvZiBzYW1wbGVzLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFBpeGVsKGludCB4LCBpbnQgeSwgZmxvYXQgZkFycmF5W10pIHsKLSAgICAgICAgc2FtcGxlTW9kZWwuc2V0UGl4ZWwoeCAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwKLSAgICAgICAgICAgICAgICB5IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCBmQXJyYXksIGRhdGFCdWZmZXIpOworICAgICAgICBzYW1wbGVNb2RlbC5zZXRQaXhlbCh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLCB5IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCBmQXJyYXksCisgICAgICAgICAgICAgICAgZGF0YUJ1ZmZlcik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyBhIGRvdWJsZSBhcnJheSBvZiBzYW1wbGVzIGZvciB0aGUgc3BlY2lmaWVkIHBpeGVsIAotICAgICAqIGluIHRoaXMgV3JpdGFibGVSYXN0ZXIuIAorICAgICAqIFNldHMgYSBkb3VibGUgYXJyYXkgb2Ygc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCBwaXhlbCBpbiB0aGlzCisgICAgICogV3JpdGFibGVSYXN0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIHBpeGVsJ3MgWCBjb29yZGluYXRlLgotICAgICAqIEBwYXJhbSB5IHRoZSBwaXhlbCdzIFkgY29vcmRpbmF0ZS4KLSAgICAgKiBAcGFyYW0gZEFycmF5IHRoZSBkb3VibGUgYXJyYXkgb2Ygc2FtcGxlcy4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIHBpeGVsJ3MgWCBjb29yZGluYXRlLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgcGl4ZWwncyBZIGNvb3JkaW5hdGUuCisgICAgICogQHBhcmFtIGRBcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGRvdWJsZSBhcnJheSBvZiBzYW1wbGVzLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFBpeGVsKGludCB4LCBpbnQgeSwgZG91YmxlIGRBcnJheVtdKSB7Ci0gICAgICAgIHNhbXBsZU1vZGVsLnNldFBpeGVsKHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsCi0gICAgICAgICAgICAgICAgeSAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgZEFycmF5LCBkYXRhQnVmZmVyKTsKKyAgICAgICAgc2FtcGxlTW9kZWwuc2V0UGl4ZWwoeCAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwgeSAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgZEFycmF5LAorICAgICAgICAgICAgICAgIGRhdGFCdWZmZXIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgYSBpbnQgYXJyYXkgb2Ygc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhciBhcmVhCi0gICAgICogb2YgcGl4ZWxzIGluIHRoaXMgV3JpdGFibGVSYXN0ZXIuIAorICAgICAqIFNldHMgYSBpbnRlZ2VyIGFycmF5IG9mIHNhbXBsZXMgZm9yIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIgYXJlYSBvZgorICAgICAqIHBpeGVscyBpbiB0aGlzIFdyaXRhYmxlUmFzdGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgcmVjdGFuZ3VsYXIgYXJlYS4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHJlY3Rhbmd1bGFyIGFyZWEuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHJlY3Rhbmd1bGFyIGFyZWEuCi0gICAgICogQHBhcmFtIGggdGhlIGhlaWdodCBvZiByZWN0YW5ndWxhciBhcmVhLgotICAgICAqIEBwYXJhbSBpQXJyYXkgdGhlIGludCBhcnJheSBvZiBzYW1wbGVzLgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHJlY3Rhbmd1bGFyIGFyZWEuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgcmVjdGFuZ3VsYXIgYXJlYS4KKyAgICAgKiBAcGFyYW0gdworICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHJlY3Rhbmd1bGFyIGFyZWEuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgcmVjdGFuZ3VsYXIgYXJlYS4KKyAgICAgKiBAcGFyYW0gaUFycmF5CisgICAgICogICAgICAgICAgICB0aGUgaW50ZWdlciBhcnJheSBvZiBzYW1wbGVzLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFBpeGVscyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGlBcnJheVtdKSB7Ci0gICAgICAgIHNhbXBsZU1vZGVsLnNldFBpeGVscyh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLAotICAgICAgICAgICAgICAgIHkgLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVksIHcsIGgsIGlBcnJheSwgZGF0YUJ1ZmZlcik7CisgICAgICAgIHNhbXBsZU1vZGVsLnNldFBpeGVscyh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLCB5IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCB3LCBoLCBpQXJyYXksCisgICAgICAgICAgICAgICAgZGF0YUJ1ZmZlcik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyBhIGZsb2F0IGFycmF5IG9mIHNhbXBsZXMgZm9yIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIgYXJlYQotICAgICAqIG9mIHBpeGVscyBpbiB0aGlzIFdyaXRhYmxlUmFzdGVyLiAKKyAgICAgKiBTZXRzIGEgZmxvYXQgYXJyYXkgb2Ygc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhciBhcmVhIG9mCisgICAgICogcGl4ZWxzIGluIHRoaXMgV3JpdGFibGVSYXN0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiByZWN0YW5ndWxhciBhcmVhLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgcmVjdGFuZ3VsYXIgYXJlYS4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgcmVjdGFuZ3VsYXIgYXJlYS4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHJlY3Rhbmd1bGFyIGFyZWEuCi0gICAgICogQHBhcmFtIGZBcnJheSB0aGUgZmxvYXQgYXJyYXkgb2Ygc2FtcGxlcy4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiByZWN0YW5ndWxhciBhcmVhLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHJlY3Rhbmd1bGFyIGFyZWEuCisgICAgICogQHBhcmFtIHcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aCBvZiByZWN0YW5ndWxhciBhcmVhLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHJlY3Rhbmd1bGFyIGFyZWEuCisgICAgICogQHBhcmFtIGZBcnJheQorICAgICAqICAgICAgICAgICAgdGhlIGZsb2F0IGFycmF5IG9mIHNhbXBsZXMuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBmbG9hdCBmQXJyYXlbXSkgewotICAgICAgICBzYW1wbGVNb2RlbC5zZXRQaXhlbHMoeCAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwKLSAgICAgICAgICAgICAgICB5IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCB3LCBoLCBmQXJyYXksIGRhdGFCdWZmZXIpOworICAgICAgICBzYW1wbGVNb2RlbC5zZXRQaXhlbHMoeCAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwgeSAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgdywgaCwgZkFycmF5LAorICAgICAgICAgICAgICAgIGRhdGFCdWZmZXIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgYSBkb3VibGUgYXJyYXkgb2Ygc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhciBhcmVhCi0gICAgICogb2YgcGl4ZWxzIGluIHRoaXMgV3JpdGFibGVSYXN0ZXIuIAorICAgICAqIFNldHMgYSBkb3VibGUgYXJyYXkgb2Ygc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhciBhcmVhIG9mCisgICAgICogcGl4ZWxzIGluIHRoaXMgV3JpdGFibGVSYXN0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiByZWN0YW5ndWxhciBhcmVhLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgcmVjdGFuZ3VsYXIgYXJlYS4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgcmVjdGFuZ3VsYXIgYXJlYS4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHJlY3Rhbmd1bGFyIGFyZWEuCi0gICAgICogQHBhcmFtIGRBcnJheSB0aGUgZG91YmxlIGFycmF5IG9mIHNhbXBsZXMuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgcmVjdGFuZ3VsYXIgYXJlYS4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiByZWN0YW5ndWxhciBhcmVhLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgcmVjdGFuZ3VsYXIgYXJlYS4KKyAgICAgKiBAcGFyYW0gaAorICAgICAqICAgICAgICAgICAgdGhlIGhlaWdodCBvZiByZWN0YW5ndWxhciBhcmVhLgorICAgICAqIEBwYXJhbSBkQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBkb3VibGUgYXJyYXkgb2Ygc2FtcGxlcy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGRvdWJsZSBkQXJyYXlbXSkgewotICAgICAgICBzYW1wbGVNb2RlbC5zZXRQaXhlbHMoeCAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwKLSAgICAgICAgICAgICAgICB5IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCB3LCBoLCBkQXJyYXksIGRhdGFCdWZmZXIpOworICAgICAgICBzYW1wbGVNb2RlbC5zZXRQaXhlbHMoeCAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwgeSAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgdywgaCwgZEFycmF5LAorICAgICAgICAgICAgICAgIGRhdGFCdWZmZXIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHNhbXBsZXMgZm9yIHRoZSBzcGVjaWZpZWQgYmFuZCBhbmQgdGhlIHNwZWNpZmllZAotICAgICAqIHJlY3Rhbmd1bGFyIGFyZWEgb2YgcGl4ZWxzIHdpdGggYW4gaW50IGFycmF5IG9mIHNhbXBsZXMuCisgICAgICogU2V0cyB0aGUgc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCBiYW5kIGFuZCB0aGUgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyCisgICAgICogYXJlYSBvZiBwaXhlbHMgd2l0aCBhbiBpbnRlZ2VyIGFycmF5IG9mIHNhbXBsZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSBhcmVhIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHRoZSBhcmVhIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gYiB0aGUgc3BlY2lmaWVkIGJhbmQuCi0gICAgICogQHBhcmFtIGlBcnJheSB0aGUgaW50IGFycmF5IG9mIHNhbXBsZXMuCi0KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBiYW5kLgorICAgICAqIEBwYXJhbSBpQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlZ2VyIGFycmF5IG9mIHNhbXBsZXMuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0U2FtcGxlcyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGIsIGludCBpQXJyYXlbXSkgewotICAgICAgICBzYW1wbGVNb2RlbC5zZXRTYW1wbGVzKHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsCi0gICAgICAgICAgICAgICAgeSAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgdywgaCwgYiwgaUFycmF5LCBkYXRhQnVmZmVyKTsKKyAgICAgICAgc2FtcGxlTW9kZWwuc2V0U2FtcGxlcyh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLCB5IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCB3LCBoLCBiLAorICAgICAgICAgICAgICAgIGlBcnJheSwgZGF0YUJ1ZmZlcik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCBiYW5kIGFuZCB0aGUgc3BlY2lmaWVkCi0gICAgICogcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMgd2l0aCBhIGZsb2F0IGFycmF5IG9mIHNhbXBsZXMuCisgICAgICogU2V0cyB0aGUgc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCBiYW5kIGFuZCB0aGUgc3BlY2lmaWVkIHJlY3Rhbmd1bGFyCisgICAgICogYXJlYSBvZiBwaXhlbHMgd2l0aCBhIGZsb2F0IGFycmF5IG9mIHNhbXBsZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCi0gICAgICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSBhcmVhIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHRoZSBhcmVhIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gYiB0aGUgc3BlY2lmaWVkIGJhbmQuCi0gICAgICogQHBhcmFtIGZBcnJheSB0aGUgZmxvYXQgYXJyYXkgb2Ygc2FtcGxlcy4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBiYW5kLgorICAgICAqIEBwYXJhbSBmQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdCBhcnJheSBvZiBzYW1wbGVzLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFNhbXBsZXMoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBiLCBmbG9hdCBmQXJyYXlbXSkgewotICAgICAgICBzYW1wbGVNb2RlbC5zZXRTYW1wbGVzKHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsCi0gICAgICAgICAgICAgICAgeSAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgdywgaCwgYiwgZkFycmF5LCBkYXRhQnVmZmVyKTsKKyAgICAgICAgc2FtcGxlTW9kZWwuc2V0U2FtcGxlcyh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLCB5IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCB3LCBoLCBiLAorICAgICAgICAgICAgICAgIGZBcnJheSwgZGF0YUJ1ZmZlcik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgc2FtcGxlcyBmb3IgdGhlIHNwZWNpZmllZCBiYW5kIGFuZCB0aGUgc3BlY2lmaWVkCi0gICAgICogcmVjdGFuZ3VsYXIgYXJlYSBvZiBwaXhlbHMgd2l0aCBhIGRvdWJsZSBhcnJheSBvZiBzYW1wbGVzLgorICAgICAqIFNldHMgdGhlIHNhbXBsZXMgZm9yIHRoZSBzcGVjaWZpZWQgYmFuZCBhbmQgdGhlIHNwZWNpZmllZCByZWN0YW5ndWxhcgorICAgICAqIGFyZWEgb2YgcGl4ZWxzIHdpdGggYSBkb3VibGUgYXJyYXkgb2Ygc2FtcGxlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBhcmVhIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBhcmVhIG9mIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIGFyZWEgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIGFyZWEgb2YgcGl4ZWxzLgotICAgICAqIEBwYXJhbSBiIHRoZSBzcGVjaWZpZWQgYmFuZC4KLSAgICAgKiBAcGFyYW0gZEFycmF5IHRoZSBkb3VibGUgYXJyYXkgb2Ygc2FtcGxlcy4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgYXJlYSBvZiBwaXhlbHMuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGFyZWEgb2YgcGl4ZWxzLgorICAgICAqIEBwYXJhbSBoCisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBhcmVhIG9mIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBiYW5kLgorICAgICAqIEBwYXJhbSBkQXJyYXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBkb3VibGUgYXJyYXkgb2Ygc2FtcGxlcy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTYW1wbGVzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgYiwgZG91YmxlIGRBcnJheVtdKSB7Ci0gICAgICAgIHNhbXBsZU1vZGVsLnNldFNhbXBsZXMoeCAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwKLSAgICAgICAgICAgICAgICB5IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCB3LCBoLCBiLCBkQXJyYXksIGRhdGFCdWZmZXIpOworICAgICAgICBzYW1wbGVNb2RlbC5zZXRTYW1wbGVzKHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsIHkgLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVksIHcsIGgsIGIsCisgICAgICAgICAgICAgICAgZEFycmF5LCBkYXRhQnVmZmVyKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzYW1wbGUgZm9yIHRoZSBzcGVjaWZpZWQgYmFuZCBhbmQgdGhlIHNwZWNpZmllZAotICAgICAqIHBpeGVsIHdpdGggYW4gaW50IHNhbXBsZS4KKyAgICAgKiBTZXRzIHRoZSBzYW1wbGUgZm9yIHRoZSBzcGVjaWZpZWQgYmFuZCBhbmQgdGhlIHNwZWNpZmllZCBwaXhlbCB3aXRoIGFuCisgICAgICogaW50ZWdlciBzYW1wbGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCi0gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCi0gICAgICogQHBhcmFtIGIgdGhlIHNwZWNpZmllZCBiYW5kLgotICAgICAqIEBwYXJhbSBzIHRoZSBzYW1wbGUgdG8gYmUgc2V0LgorICAgICAqIEBwYXJhbSB4CisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4KKyAgICAgKiBAcGFyYW0geQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgYmFuZC4KKyAgICAgKiBAcGFyYW0gcworICAgICAqICAgICAgICAgICAgdGhlIHNhbXBsZSB0byBiZSBzZXQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0U2FtcGxlKGludCB4LCBpbnQgeSwgaW50IGIsIGludCBzKSB7Ci0gICAgICAgIHNhbXBsZU1vZGVsLnNldFNhbXBsZSh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLAotICAgICAgICAgICAgICAgIHkgLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVksIGIsIHMsIGRhdGFCdWZmZXIpOworICAgICAgICBzYW1wbGVNb2RlbC5zZXRTYW1wbGUoeCAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwgeSAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgYiwgcywKKyAgICAgICAgICAgICAgICBkYXRhQnVmZmVyKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzYW1wbGUgZm9yIHRoZSBzcGVjaWZpZWQgYmFuZCBhbmQgdGhlIHNwZWNpZmllZAotICAgICAqIHBpeGVsIHdpdGggYSBmbG9hdCBzYW1wbGUuCisgICAgICogU2V0cyB0aGUgc2FtcGxlIGZvciB0aGUgc3BlY2lmaWVkIGJhbmQgYW5kIHRoZSBzcGVjaWZpZWQgcGl4ZWwgd2l0aCBhCisgICAgICogZmxvYXQgc2FtcGxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB4IHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLgotICAgICAqIEBwYXJhbSB5IHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLgotICAgICAqIEBwYXJhbSBiIHRoZSBzcGVjaWZpZWQgYmFuZC4KLSAgICAgKiBAcGFyYW0gcyB0aGUgc2FtcGxlIHRvIGJlIHNldC4KKyAgICAgKiBAcGFyYW0geAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWwuCisgICAgICogQHBhcmFtIHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLgorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGJhbmQuCisgICAgICogQHBhcmFtIHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzYW1wbGUgdG8gYmUgc2V0LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFNhbXBsZShpbnQgeCwgaW50IHksIGludCBiLCBmbG9hdCBzKSB7Ci0gICAgICAgIHNhbXBsZU1vZGVsLnNldFNhbXBsZSh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLAotICAgICAgICAgICAgICAgIHkgLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVksIGIsIHMsIGRhdGFCdWZmZXIpOworICAgICAgICBzYW1wbGVNb2RlbC5zZXRTYW1wbGUoeCAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWCwgeSAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgYiwgcywKKyAgICAgICAgICAgICAgICBkYXRhQnVmZmVyKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzYW1wbGUgZm9yIHRoZSBzcGVjaWZpZWQgYmFuZCBhbmQgdGhlIHNwZWNpZmllZAotICAgICAqIHBpeGVsIHdpdGggYSBpbnQgc2FtcGxlLgorICAgICAqIFNldHMgdGhlIHNhbXBsZSBmb3IgdGhlIHNwZWNpZmllZCBiYW5kIGFuZCB0aGUgc3BlY2lmaWVkIHBpeGVsIHdpdGggYW4KKyAgICAgKiBpbnRlZ2VyIHNhbXBsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4KLSAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4KLSAgICAgKiBAcGFyYW0gYiB0aGUgc3BlY2lmaWVkIGJhbmQuCi0gICAgICogQHBhcmFtIHMgdGhlIHNhbXBsZSB0byBiZSBzZXQuCisgICAgICogQHBhcmFtIHgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVsLgorICAgICAqIEBwYXJhbSB5CisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBwaXhlbC4KKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBiYW5kLgorICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICB0aGUgc2FtcGxlIHRvIGJlIHNldC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTYW1wbGUoaW50IHgsIGludCB5LCBpbnQgYiwgZG91YmxlIHMpIHsKLSAgICAgICAgc2FtcGxlTW9kZWwuc2V0U2FtcGxlKHggLSBzYW1wbGVNb2RlbFRyYW5zbGF0ZVgsCi0gICAgICAgICAgICAgICAgeSAtIHNhbXBsZU1vZGVsVHJhbnNsYXRlWSwgYiwgcywgZGF0YUJ1ZmZlcik7CisgICAgICAgIHNhbXBsZU1vZGVsLnNldFNhbXBsZSh4IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVYLCB5IC0gc2FtcGxlTW9kZWxUcmFuc2xhdGVZLCBiLCBzLAorICAgICAgICAgICAgICAgIGRhdGFCdWZmZXIpOwogICAgIH0KIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvV3JpdGFibGVSZW5kZXJlZEltYWdlLmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvV3JpdGFibGVSZW5kZXJlZEltYWdlLmphdmEKaW5kZXggZWUxY2I5ZS4uMDUyMzUzYiAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL1dyaXRhYmxlUmVuZGVyZWRJbWFnZS5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9Xcml0YWJsZVJlbmRlcmVkSW1hZ2UuamF2YQpAQCAtMTgsMjMgKzE4LDI3IEBACiAgKiBAYXV0aG9yIElnb3IgVi4gU3RvbHlhcm92CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5pbWFnZTsKIAogaW1wb3J0IGphdmEuYXd0LlBvaW50OwogCiAvKioKLSAqIFRoZSBXcml0ZWFibGVSZW5kZXJlZEltYWdlIGludGVyZmFjZSBpcyBpbnRlcmZhY2UgZm9yIG9iamVjdHMgd2hpY2gKLSAqIGNvbnRhaW5zIFJhc3RlciBkYXRhIG9mIG9uZSBvciBzZXZlcmFsIHRpbGVzLiBUaGlzIGludGVyZmFjZSBwcm92aWRlcwotICogbm90aWZpY2F0aW9uIG1laGFuaXNtIGZvciBvYnRhaW5pbmcgdGlsZSdzIHdyaXRpbmcgc3RhdHVzLiAgICAKKyAqIFRoZSBXcml0ZWFibGVSZW5kZXJlZEltYWdlIGludGVyZmFjZSBpcyBpbnRlcmZhY2UgZm9yIG9iamVjdHMgd2hpY2ggY29udGFpbnMKKyAqIFJhc3RlciBkYXRhIG9mIG9uZSBvciBzZXZlcmFsIHRpbGVzLiBUaGlzIGludGVyZmFjZSBwcm92aWRlcyBub3RpZmljYXRpb24KKyAqIG1lY2hhbmlzbSBmb3Igb2J0YWluaW5nIHRpbGUncyB3cml0aW5nIHN0YXR1cy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgV3JpdGFibGVSZW5kZXJlZEltYWdlIGV4dGVuZHMgUmVuZGVyZWRJbWFnZSB7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuZCBjaGVja3Mgb3V0IHRoZSB3cml0YWJsZSB0aWxlIGZvciB3cml0aW5nLiAKKyAgICAgKiBHZXRzIGFuZCBjaGVja3Mgb3V0IHRoZSB3cml0YWJsZSB0aWxlIGZvciB3cml0aW5nLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0aWxlWCB0aGUgWCBpbmRleCBvZiB0aGUgdGlsZS4gCi0gICAgICogQHBhcmFtIHRpbGVZIHRoZSBZIGluZGV4IG9mIHRoZSB0aWxlLgotICAgICAqIAorICAgICAqIEBwYXJhbSB0aWxlWAorICAgICAqICAgICAgICAgICAgdGhlIFggaW5kZXggb2YgdGhlIHRpbGUuCisgICAgICogQHBhcmFtIHRpbGVZCisgICAgICogICAgICAgICAgICB0aGUgWSBpbmRleCBvZiB0aGUgdGlsZS4KICAgICAgKiBAcmV0dXJuIHRoZSBXcml0YWJsZVJhc3Rlci4KICAgICAgKi8KICAgICBwdWJsaWMgV3JpdGFibGVSYXN0ZXIgZ2V0V3JpdGFibGVUaWxlKGludCB0aWxlWCwgaW50IHRpbGVZKTsKQEAgLTQyLDYwICs0Niw2NCBAQAogICAgIC8qKgogICAgICAqIFJlbW92ZXMgdGhlIHJlZ2lzdGVyZWQgVGlsZU9ic2VydmVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0byB0aGUgVGlsZU9ic2VydmVyIHdoaWNoIGlzIHJlZ2lzdGVyZWQgZm9yIHRoaXMKLSAgICAgKiBXcml0YWJsZVJlbmRlcmVkSW1hZ2UuCisgICAgICogQHBhcmFtIHRvCisgICAgICogICAgICAgICAgICB0aGUgVGlsZU9ic2VydmVyIHdoaWNoIGlzIHJlZ2lzdGVyZWQgZm9yIHRoaXMKKyAgICAgKiAgICAgICAgICAgIFdyaXRhYmxlUmVuZGVyZWRJbWFnZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZW1vdmVUaWxlT2JzZXJ2ZXIoVGlsZU9ic2VydmVyIHRvKTsKIAogICAgIC8qKgogICAgICAqIEFkZHMgdGhlIHNwZWNpZmllZCBUaWxlT2JzZXJ2ZXIgdG8gdGhpcyBXcml0YWJsZVJlbmRlcmVkSW1hZ2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIHRvIHRoZSBUaWxlT2JzZXJ2ZXIgb2JqZWN0IHRvIGJlIGFkZGVkLgorICAgICAqIEBwYXJhbSB0bworICAgICAqICAgICAgICAgICAgdGhlIFRpbGVPYnNlcnZlciBvYmplY3QgdG8gYmUgYWRkZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkVGlsZU9ic2VydmVyKFRpbGVPYnNlcnZlciB0byk7CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgaW1hZ2UgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgUmFzdGVyLiAgCisgICAgICogU2V0cyB0aGlzIGltYWdlIHRvIHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIFJhc3Rlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gciB0aGUgc3BlY2lmaWVkIFJhc3Rlci4KKyAgICAgKiBAcGFyYW0gcgorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBSYXN0ZXIuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RGF0YShSYXN0ZXIgcik7CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBhcnJheSBvZiBwb2ludHMgd2ljaCByZXByZXNlbnQgaW5kaWNlcyBvZiB0aWxlcyB3aGljaAotICAgICAqIGFyZSBjaGVjayBvdXQgZm9yIHdyaXRpbmcuCisgICAgICogR2V0cyB0aGUgYXJyYXkgb2YgcG9pbnRzIHdoaWNoIHJlcHJlc2VudCBpbmRpY2VzIG9mIHRpbGVzIHdoaWNoIGFyZSBjaGVjaworICAgICAqIG91dCBmb3Igd3JpdGluZy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBQb2ludHMuCisgICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgcG9pbnRzLgogICAgICAqLwogICAgIHB1YmxpYyBQb2ludFtdIGdldFdyaXRhYmxlVGlsZUluZGljZXMoKTsKIAogICAgIC8qKgogICAgICAqIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIHRpbGUgaXMgd3JpdGFibGUgb3Igbm90LgogICAgICAqIAotICAgICAqIEBwYXJhbSB0aWxlWCB0aGUgWCBpbmRleCBvZiB0aWxlLiAKLSAgICAgKiBAcGFyYW0gdGlsZVkgdGhlIFkgaW5kZXggb2YgdGlsZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgdGlsZSBpcyB3cml0YWJsZSwKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIHRpbGVYCisgICAgICogICAgICAgICAgICB0aGUgWCBpbmRleCBvZiB0aWxlLgorICAgICAqIEBwYXJhbSB0aWxlWQorICAgICAqICAgICAgICAgICAgdGhlIFkgaW5kZXggb2YgdGlsZS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgdGlsZSBpcyB3cml0YWJsZSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzVGlsZVdyaXRhYmxlKGludCB0aWxlWCwgaW50IHRpbGVZKTsKIAogICAgIC8qKgotICAgICAqIFJlbGVhc2UgdGhlIHNwZWNpZmllZCB3cml0YWJsZSB0aWxlLiBUaGlzIG1ldGhvZCByZW1vdmVzIHRoZSB3cml0ZXIgCi0gICAgICogZnJvbSB0aGUgdGlsZS4KKyAgICAgKiBSZWxlYXNlIHRoZSBzcGVjaWZpZWQgd3JpdGFibGUgdGlsZS4gVGhpcyBtZXRob2QgcmVtb3ZlcyB0aGUgd3JpdGVyIGZyb20KKyAgICAgKiB0aGUgdGlsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGlsZVggdGhlIFggaW5kZXggb2YgdGhlIHRpbGUuIAotICAgICAqIEBwYXJhbSB0aWxlWSB0aGUgWSBpbmRleCBvZiB0aGUgdGlsZS4KKyAgICAgKiBAcGFyYW0gdGlsZVgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGluZGV4IG9mIHRoZSB0aWxlLgorICAgICAqIEBwYXJhbSB0aWxlWQorICAgICAqICAgICAgICAgICAgdGhlIFkgaW5kZXggb2YgdGhlIHRpbGUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVsZWFzZVdyaXRhYmxlVGlsZShpbnQgdGlsZVgsIGludCB0aWxlWSk7CiAKICAgICAvKioKICAgICAgKiBDaGVja3MgaWYgdGhlcmUgaXMgYSB0aWxlIHdoaWNoIGlzIGNoZWNrZWQgb3V0IGZvciB3cml0aW5nLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgYW55IHRpbGUgaXMgY2hlY2tlZCBvdXQgZm9yIHdyaXRpbmcsIGZhbHNlIGlmIHRoZXJlCi0gICAgICogaXMgbm8gc3VjaCB0aWxlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgYW55IHRpbGUgaXMgY2hlY2tlZCBvdXQgZm9yIHdyaXRpbmcsIGZhbHNlIGlmIHRoZXJlIGlzCisgICAgICogICAgICAgICBubyBzdWNoIHRpbGUuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaGFzVGlsZVdyaXRlcnMoKTsKIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvcGFja2FnZS5odG1sIGIvYXd0L2phdmEvYXd0L2ltYWdlL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGQ2ZWYwCi0tLSAvZGV2L251bGwKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDggQEAKKzxodG1sPgorICA8Ym9keT4KKyAgICA8cD4KKyAgICAgIFRoaXMgcGFja2FnZSBjb250YWlucyBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzIHRoYXQgYWxsb3cgdG8gbW9kaWZ5IGV4aXN0aW5nIGltYWdlcyBvciB0byBjcmVhdGUgYSBuZXcgaW1hZ2UgcmF0aGVyIHRoYW4gbG9hZGluZyBpdCBmcm9tIGEgZmlsZS4KKyAgICA8L3A+CisgICBAc2luY2UgQW5kcm9pZCAxLjAKKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL3JlbmRlcmFibGUvQ29udGV4dHVhbFJlbmRlcmVkSW1hZ2VGYWN0b3J5LmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvcmVuZGVyYWJsZS9Db250ZXh0dWFsUmVuZGVyZWRJbWFnZUZhY3RvcnkuamF2YQppbmRleCAzZTk2NjM3Li4xODgxYTBjIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvcmVuZGVyYWJsZS9Db250ZXh0dWFsUmVuZGVyZWRJbWFnZUZhY3RvcnkuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvcmVuZGVyYWJsZS9Db250ZXh0dWFsUmVuZGVyZWRJbWFnZUZhY3RvcnkuamF2YQpAQCAtMTgsNzIgKzE4LDgwIEBACiAgKiBAYXV0aG9yIElnb3IgVi4gU3RvbHlhcm92CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5pbWFnZS5yZW5kZXJhYmxlOwogCiBpbXBvcnQgamF2YS5hd3QuZ2VvbS5SZWN0YW5nbGUyRDsKIGltcG9ydCBqYXZhLmF3dC5pbWFnZS5SZW5kZXJlZEltYWdlOwogCiAvKioKLSAqIEEgZmFjdG9yeSBmb3IgY3JlYXRpbmcgQ29udGV4dHVhbFJlbmRlcmVkSW1hZ2Ugb2JqZWN0cyB3aXRoIHV0aWxpdGllcyAKLSAqIGZvciBtYW5pcHVsYXRpbmcgdGhlIHByb3BlcnRpZXMgaW4gdGhlIHBhcmFtZXRlciBibG9jay4KKyAqIEEgZmFjdG9yeSBmb3IgY3JlYXRpbmcgQ29udGV4dHVhbFJlbmRlcmVkSW1hZ2Ugb2JqZWN0cyB3aXRoIHV0aWxpdGllcyBmb3IKKyAqIG1hbmlwdWxhdGluZyB0aGUgcHJvcGVydGllcyBpbiB0aGUgcGFyYW1ldGVyIGJsb2NrLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBDb250ZXh0dWFsUmVuZGVyZWRJbWFnZUZhY3RvcnkgZXh0ZW5kcyBSZW5kZXJlZEltYWdlRmFjdG9yeSB7CiAKICAgICAvKioKICAgICAgKiBNYXBzIGEgcmVuZGVyIGNvbnRleHQgdG8gYSBwYXJhbWV0ZXIgYmxvY2sgYW5kIGEgcmVuZGVyYWJsZSBpbWFnZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYTAgdGhlIGluZGV4Ci0gICAgICogQHBhcmFtIGExIHRoZSBSZW5kZXJDb250ZXh0Ci0gICAgICogQHBhcmFtIGEyIHRoZSBQYXJhbWV0ZXJCbG9jawotICAgICAqIEBwYXJhbSBhMyB0aGUgUmVuZGVyYWJsZUltYWdlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVuZGVyIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gYTAKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleC4KKyAgICAgKiBAcGFyYW0gYTEKKyAgICAgKiAgICAgICAgICAgIHRoZSBSZW5kZXJDb250ZXh0LgorICAgICAqIEBwYXJhbSBhMgorICAgICAqICAgICAgICAgICAgdGhlIFBhcmFtZXRlckJsb2NrLgorICAgICAqIEBwYXJhbSBhMworICAgICAqICAgICAgICAgICAgdGhlIFJlbmRlcmFibGVJbWFnZS4KKyAgICAgKiBAcmV0dXJuIHRoZSByZW5kZXIgY29udGV4dC4KICAgICAgKi8KLSAgICBwdWJsaWMgUmVuZGVyQ29udGV4dCBtYXBSZW5kZXJDb250ZXh0KGludCBhMCwgUmVuZGVyQ29udGV4dCBhMSwgUGFyYW1ldGVyQmxvY2sgYTIsIFJlbmRlcmFibGVJbWFnZSBhMyk7CisgICAgcHVibGljIFJlbmRlckNvbnRleHQgbWFwUmVuZGVyQ29udGV4dChpbnQgYTAsIFJlbmRlckNvbnRleHQgYTEsIFBhcmFtZXRlckJsb2NrIGEyLAorICAgICAgICAgICAgUmVuZGVyYWJsZUltYWdlIGEzKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBmcm9tIHRoZSBwYXJhbWV0ZXIgYmxvY2suCiAgICAgICogCi0gICAgICogQHBhcmFtIGEwIHRoZSBwYXJhbWV0ZXIgYmxvY2sgdG8gZXhhbWluZSB0byBmaW5kIHRoZSBwcm9wZXJ0eQotICAgICAqIEBwYXJhbSBhMSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKKyAgICAgKiBAcGFyYW0gYTAKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgYmxvY2sgdG8gZXhhbWluZSB0byBmaW5kIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiBAcGFyYW0gYTEKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShQYXJhbWV0ZXJCbG9jayBhMCwgU3RyaW5nIGExKTsKIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIHJlbmRlcmVkIGltYWdlIGRldGVybWluZWQgYnkgdGhlIHJlbmRlciBjb250ZXh0IGFuZAotICAgICAqIHBhcmFtZXRlciBibG9jay4KKyAgICAgKiBDcmVhdGVzIHRoZSByZW5kZXJlZCBpbWFnZSBkZXRlcm1pbmVkIGJ5IHRoZSByZW5kZXIgY29udGV4dCBhbmQgcGFyYW1ldGVyCisgICAgICogYmxvY2suCiAgICAgICogCi0gICAgICogQHBhcmFtIGEwIHRoZSBSZW5kZXJDb250ZXh0Ci0gICAgICogQHBhcmFtIGExIHRoZSBQYXJhbWV0ZXJCbG9jawotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlbmRlcmVkIGltYWdlCisgICAgICogQHBhcmFtIGEwCisgICAgICogICAgICAgICAgICB0aGUgUmVuZGVyQ29udGV4dC4KKyAgICAgKiBAcGFyYW0gYTEKKyAgICAgKiAgICAgICAgICAgIHRoZSBQYXJhbWV0ZXJCbG9jay4KKyAgICAgKiBAcmV0dXJuIHRoZSByZW5kZXJlZCBpbWFnZS4KICAgICAgKi8KICAgICBwdWJsaWMgUmVuZGVyZWRJbWFnZSBjcmVhdGUoUmVuZGVyQ29udGV4dCBhMCwgUGFyYW1ldGVyQmxvY2sgYTEpOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIGZyb20gdGhlIHBhcmFtZXRlciBibG9jay4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYTAgdGhlIHBhcmFtZXRlciBibG9jayB0byByZWFkIHRoZSBib3VuZHMgZnJvbQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGJvdW5kaW5nIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSBhMAorICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBibG9jayB0byByZWFkIHRoZSBib3VuZHMgZnJvbS4KKyAgICAgKiBAcmV0dXJuIHRoZSBib3VuZGluZyByZWN0YW5nbGUuCiAgICAgICovCiAgICAgcHVibGljIFJlY3RhbmdsZTJEIGdldEJvdW5kczJEKFBhcmFtZXRlckJsb2NrIGEwKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG5hbWVzIG9mIGFsbCBvZiB0aGUgc3VwcG9ydGVkIHByb3BlcnRpZXMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJvcGVydHkgbmFtZXMKKyAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSBuYW1lcy4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UHJvcGVydHlOYW1lcygpOwogCiAgICAgLyoqCiAgICAgICogQ2hlY2tzIGlmIHRoaXMgaW1hZ2UgZmFjdG9yeSBpcyBkeW5hbWljLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBpbWFnZSBmYWN0b3J5IGlzIGR5bmFtaWMKKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgaW1hZ2UgZmFjdG9yeSBpcyBkeW5hbWljLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzRHluYW1pYygpOwogCiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9yZW5kZXJhYmxlL1BhcmFtZXRlckJsb2NrLmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvcmVuZGVyYWJsZS9QYXJhbWV0ZXJCbG9jay5qYXZhCmluZGV4IDE1NTVmNDUuLjdkZGU3M2EgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZhL2F3dC9pbWFnZS9yZW5kZXJhYmxlL1BhcmFtZXRlckJsb2NrLmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL3JlbmRlcmFibGUvUGFyYW1ldGVyQmxvY2suamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBJZ29yIFYuIFN0b2x5YXJvdgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuaW1hZ2UucmVuZGVyYWJsZTsKIAogaW1wb3J0IGphdmEuYXd0LmltYWdlLlJlbmRlcmVkSW1hZ2U7CkBAIC0yNSwyOCArMjYsMzYgQEAKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCiAvKioKLSAqIFRoZSBDbGFzcyBQYXJhbWV0ZXJCbG9jayBncm91cHMgYW4gaW5kZXhlZCBzZXQgb2YgcGFyYW1ldGVyIGRhdGEgCi0gKiB3aXRoIGEgc2V0IG9mIHJlbmRlcmFibGUgKHNvdXJjZSkgaW1hZ2VzLiAgVGhlIG1hcHBpbmcgYmV0d2VlbgotICogdGhlIGluZGV4ZWQgcGFyYW1ldGVycyBhbmQgdGhlaXIgcHJvcGVydHkgbmFtZXMgaXMgcHJvdmlkZWQgCi0gKiBieSBhIHtAbGluayBDb250ZXh0dWFsUmVuZGVyZWRJbWFnZUZhY3Rvcnl9CisgKiBUaGUgY2xhc3MgUGFyYW1ldGVyQmxvY2sgZ3JvdXBzIGFuIGluZGV4ZWQgc2V0IG9mIHBhcmFtZXRlciBkYXRhIHdpdGggYSBzZXQKKyAqIG9mIHJlbmRlcmFibGUgKHNvdXJjZSkgaW1hZ2VzLiBUaGUgbWFwcGluZyBiZXR3ZWVuIHRoZSBpbmRleGVkIHBhcmFtZXRlcnMgYW5kCisgKiB0aGVpciBwcm9wZXJ0eSBuYW1lcyBpcyBwcm92aWRlZCBieSBhIHtAbGluayBDb250ZXh0dWFsUmVuZGVyZWRJbWFnZUZhY3Rvcnl9LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIFBhcmFtZXRlckJsb2NrIGltcGxlbWVudHMgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUgewogCi0KLSAgICAvKiogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IHNlcmlhbFZlcnNpb25VSUQuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTc1NzcxMTU1NTE3ODUyNDA3NTBMOwogCi0gICAgLyoqIFRoZSBzb3VyY2VzIChyZW5kZXJhYmxlIGltYWdlcykuICovCisgICAgLyoqCisgICAgICogVGhlIHNvdXJjZXMgKHJlbmRlcmFibGUgaW1hZ2VzKS4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgVmVjdG9yPE9iamVjdD4gc291cmNlcyA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOwogCi0gICAgLyoqIFRoZSBwYXJhbWV0ZXJzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBwYXJhbWV0ZXJzLgorICAgICAqLwogICAgIHByb3RlY3RlZCBWZWN0b3I8T2JqZWN0PiBwYXJhbWV0ZXJzID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgcGFyYW1ldGVyIGJsb2NrLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzb3VyY2VzIHRoZSB2ZWN0b3Igb2Ygc291cmNlIGltYWdlcwotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIHRoZSB2ZWN0b3Igb2YgcGFyYW1ldGVycworICAgICAqIEBwYXJhbSBzb3VyY2VzCisgICAgICogICAgICAgICAgICB0aGUgdmVjdG9yIG9mIHNvdXJjZSBpbWFnZXMuCisgICAgICogQHBhcmFtIHBhcmFtZXRlcnMKKyAgICAgKiAgICAgICAgICAgIHRoZSB2ZWN0b3Igb2YgcGFyYW1ldGVycy4KICAgICAgKi8KICAgICBwdWJsaWMgUGFyYW1ldGVyQmxvY2soVmVjdG9yPE9iamVjdD4gc291cmNlcywgVmVjdG9yPE9iamVjdD4gcGFyYW1ldGVycykgewogICAgICAgICBzZXRTb3VyY2VzKHNvdXJjZXMpOwpAQCAtNTYsNyArNjUsOCBAQAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBwYXJhbWV0ZXIgYmxvY2sgd2l0aCBubyBwYXJhbWV0ZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzb3VyY2VzIHRoZSB2ZWN0b3Igb2Ygc291cmNlIGltYWdlcworICAgICAqIEBwYXJhbSBzb3VyY2VzCisgICAgICogICAgICAgICAgICB0aGUgdmVjdG9yIG9mIHNvdXJjZSBpbWFnZXMuCiAgICAgICovCiAgICAgcHVibGljIFBhcmFtZXRlckJsb2NrKFZlY3RvcjxPYmplY3Q+IHNvdXJjZXMpIHsKICAgICAgICAgc2V0U291cmNlcyhzb3VyY2VzKTsKQEAgLTY1LDE4ICs3NSwyMCBAQAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBwYXJhbWV0ZXIgYmxvY2sgd2l0aCBubyBpbWFnZSBvciBwYXJhbWV0ZXIgdmVjdG9ycy4KICAgICAgKi8KLSAgICBwdWJsaWMgUGFyYW1ldGVyQmxvY2soKSB7fQorICAgIHB1YmxpYyBQYXJhbWV0ZXJCbG9jaygpIHsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBzb3VyY2UgaW1hZ2UgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBzb3VyY2UgaW1hZ2UKLSAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IHdoZXJlIHRoZSBzb3VyY2Ugd2lsbCBiZSBwbGFjZWQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoaXMgcGFyYW1ldGVyIGJsb2NrCisgICAgICogQHBhcmFtIHNvdXJjZQorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBpbWFnZS4KKyAgICAgKiBAcGFyYW0gaW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCB3aGVyZSB0aGUgc291cmNlIHdpbGwgYmUgcGxhY2VkLgorICAgICAqIEByZXR1cm4gdGhpcyBwYXJhbWV0ZXIgYmxvY2suCiAgICAgICovCiAgICAgcHVibGljIFBhcmFtZXRlckJsb2NrIHNldFNvdXJjZShPYmplY3Qgc291cmNlLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgaWYoc291cmNlcy5zaXplKCkgPCBpbmRleCArIDEpeworICAgICAgICBpZiAoc291cmNlcy5zaXplKCkgPCBpbmRleCArIDEpIHsKICAgICAgICAgICAgIHNvdXJjZXMuc2V0U2l6ZShpbmRleCArIDEpOwogICAgICAgICB9CiAgICAgICAgIHNvdXJjZXMuc2V0RWxlbWVudEF0KHNvdXJjZSwgaW5kZXgpOwpAQCAtODYsMTQgKzk4LDE1IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgcGFyYW1ldGVyIHZhbHVlIG9iamVjdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAqIAotICAgICAqIEBwYXJhbSBvYmogdGhlIHBhcmFtZXRlciB2YWx1ZSB0byBwbGFjZSBhdCB0aGUgZGVzaXJlZCBpbmRleAotICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggd2hlcmUgdGhlIG9iamVjdCBpcyB0byBiZSBwbGFjZWQgaW4gdGhlIAotICAgICAqIHZlY3RvciBvZiBwYXJhbWV0ZXJzCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGlzIHBhcmFtZXRlciBibG9jaworICAgICAqIEBwYXJhbSBvYmoKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgdmFsdWUgdG8gcGxhY2UgYXQgdGhlIGRlc2lyZWQgaW5kZXguCisgICAgICogQHBhcmFtIGluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggd2hlcmUgdGhlIG9iamVjdCBpcyB0byBiZSBwbGFjZWQgaW4gdGhlIHZlY3RvciBvZgorICAgICAqICAgICAgICAgICAgcGFyYW1ldGVycy4KKyAgICAgKiBAcmV0dXJuIHRoaXMgcGFyYW1ldGVyIGJsb2NrLgogICAgICAqLwogICAgIHB1YmxpYyBQYXJhbWV0ZXJCbG9jayBzZXQoT2JqZWN0IG9iaiwgaW50IGluZGV4KSB7Ci0gICAgICAgIGlmKHBhcmFtZXRlcnMuc2l6ZSgpIDwgaW5kZXggKyAxKXsKKyAgICAgICAgaWYgKHBhcmFtZXRlcnMuc2l6ZSgpIDwgaW5kZXggKyAxKSB7CiAgICAgICAgICAgICBwYXJhbWV0ZXJzLnNldFNpemUoaW5kZXggKyAxKTsKICAgICAgICAgfQogICAgICAgICBwYXJhbWV0ZXJzLnNldEVsZW1lbnRBdChvYmosIGluZGV4KTsKQEAgLTEwMyw5ICsxMTYsOSBAQAogICAgIC8qKgogICAgICAqIEFkZHMgYSBzb3VyY2UgdG8gdGhlIHZlY3RvciBvZiBzb3VyY2VzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSB0byBhZGQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoaXMgcGFyYW1ldGVyIGJsb2NrCisgICAgICogQHBhcmFtIHNvdXJjZQorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSB0byBhZGQuCisgICAgICogQHJldHVybiB0aGlzIHBhcmFtZXRlciBibG9jay4KICAgICAgKi8KICAgICBwdWJsaWMgUGFyYW1ldGVyQmxvY2sgYWRkU291cmNlKE9iamVjdCBzb3VyY2UpIHsKICAgICAgICAgc291cmNlcy5hZGRFbGVtZW50KHNvdXJjZSk7CkBAIC0xMTUsOSArMTI4LDkgQEAKICAgICAvKioKICAgICAgKiBBZGRzIHRoZSBvYmplY3QgdG8gdGhlIHZlY3RvciBvZiBwYXJhbWV0ZXIgdmFsdWVzCiAgICAgICogCi0gICAgICogQHBhcmFtIG9iaiB0aGUgb2JqIHRvIGFkZAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhpcyBwYXJhbWV0ZXIgYmxvY2sKKyAgICAgKiBAcGFyYW0gb2JqCisgICAgICogICAgICAgICAgICB0aGUgb2JqIHRvIGFkZC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgcGFyYW1ldGVyIGJsb2NrLgogICAgICAqLwogICAgIHB1YmxpYyBQYXJhbWV0ZXJCbG9jayBhZGQoT2JqZWN0IG9iaikgewogICAgICAgICBwYXJhbWV0ZXJzLmFkZEVsZW1lbnQob2JqKTsKQEAgLTEyNSwyMCArMTM4LDIyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmVjdG9yIG9mIHNvdXJjZXMsIHJlcGxhY2luZyB0aGUgZXhpc3RpbmcKLSAgICAgKiB2ZWN0b3Igb2Ygc291cmNlcywgaWYgYW55LgorICAgICAqIFNldHMgdGhlIHZlY3RvciBvZiBzb3VyY2VzLCByZXBsYWNpbmcgdGhlIGV4aXN0aW5nIHZlY3RvciBvZiBzb3VyY2VzLCBpZgorICAgICAqIGFueS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmNlcyB0aGUgbmV3IHNvdXJjZXMKKyAgICAgKiBAcGFyYW0gc291cmNlcworICAgICAqICAgICAgICAgICAgdGhlIG5ldyBzb3VyY2VzLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZXMoVmVjdG9yPE9iamVjdD4gc291cmNlcykgewogICAgICAgICB0aGlzLnNvdXJjZXMgPSBzb3VyY2VzOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZlY3RvciBvZiBwYXJhbWV0ZXJzLCByZXBsYWNpbmcgdGhlIGV4aXN0aW5nCi0gICAgICogdmVjdG9yIG9mIHBhcmFtZXRlcnMsIGlmIGFueS4KKyAgICAgKiBTZXRzIHRoZSB2ZWN0b3Igb2YgcGFyYW1ldGVycywgcmVwbGFjaW5nIHRoZSBleGlzdGluZyB2ZWN0b3Igb2YKKyAgICAgKiBwYXJhbWV0ZXJzLCBpZiBhbnkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHBhcmFtZXRlcnMgdGhlIG5ldyBwYXJhbWV0ZXJzCisgICAgICogQHBhcmFtIHBhcmFtZXRlcnMKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgcGFyYW1ldGVycy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJzKFZlY3RvcjxPYmplY3Q+IHBhcmFtZXRlcnMpIHsKICAgICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKQEAgLTE0Nyw3ICsxNjIsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHZlY3RvciBvZiBzb3VyY2VzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNvdXJjZXMKKyAgICAgKiBAcmV0dXJuIHRoZSBzb3VyY2VzLgogICAgICAqLwogICAgIHB1YmxpYyBWZWN0b3I8T2JqZWN0PiBnZXRTb3VyY2VzKCkgewogICAgICAgICByZXR1cm4gc291cmNlczsKQEAgLTE1Niw3ICsxNzEsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHZlY3RvciBvZiBwYXJhbWV0ZXJzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHBhcmFtZXRlcnMKKyAgICAgKiBAcmV0dXJuIHRoZSBwYXJhbWV0ZXJzLgogICAgICAqLwogICAgIHB1YmxpYyBWZWN0b3I8T2JqZWN0PiBnZXRQYXJhbWV0ZXJzKCkgewogICAgICAgICByZXR1cm4gcGFyYW1ldGVyczsKQEAgLTE2NSw5ICsxODAsOSBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHNvdXJjZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXgKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzb3VyY2Ugb2JqZWN0IGZvdW5kIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgKKyAgICAgKiBAcGFyYW0gaW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleC4KKyAgICAgKiBAcmV0dXJuIHRoZSBzb3VyY2Ugb2JqZWN0IGZvdW5kIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdCBnZXRTb3VyY2UoaW50IGluZGV4KSB7CiAgICAgICAgIHJldHVybiBzb3VyY2VzLmVsZW1lbnRBdChpbmRleCk7CkBAIC0xNzYsOSArMTkxLDkgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBvYmplY3QgcGFyYW1ldGVyIGZvdW5kIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCiAgICAgICogCi0gICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHBhcmFtZXRlciBvYmplY3QgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleAorICAgICAqIEBwYXJhbSBpbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4LgorICAgICAqIEByZXR1cm4gdGhlIHBhcmFtZXRlciBvYmplY3QgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdFBhcmFtZXRlcihpbnQgaW5kZXgpIHsKICAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnMuZWxlbWVudEF0KGluZGV4KTsKQEAgLTE4NywzMjggKzIwMiwzMzMgQEAKICAgICAvKioKICAgICAgKiBTaGFsbG93IGNsb25lIChjbG9uZXMgdXNpbmcgdGhlIHN1cGVyY2xhc3MgY2xvbmUgbWV0aG9kKS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjbG9uZSBvZiB0aGlzIG9iamVjdAorICAgICAqIEByZXR1cm4gdGhlIGNsb25lIG9mIHRoaXMgb2JqZWN0LgogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3Qgc2hhbGxvd0Nsb25lKCkgewotICAgICAgICB0cnl7CisgICAgICAgIHRyeSB7CiAgICAgICAgICAgICByZXR1cm4gc3VwZXIuY2xvbmUoKTsKLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhpcyBQYXJhbWV0ZXJCbG9jayBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBpZGVudGljYWwgY29weSBvZiB0aGlzIGluc3RhbmNlLgorICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CiAgICAgICAgIFBhcmFtZXRlckJsb2NrIHJlcGxpY2E7Ci0gICAgICAgIHRyeXsKKyAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHJlcGxpY2EgPSAoUGFyYW1ldGVyQmxvY2spc3VwZXIuY2xvbmUoKTsKLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9Ci0gICAgICAgIGlmKHNvdXJjZXMgIT0gbnVsbCl7CisgICAgICAgIGlmIChzb3VyY2VzICE9IG51bGwpIHsKICAgICAgICAgICAgIHJlcGxpY2Euc2V0U291cmNlcygoVmVjdG9yPE9iamVjdD4pKHNvdXJjZXMuY2xvbmUoKSkpOwogICAgICAgICB9Ci0gICAgICAgIGlmKHBhcmFtZXRlcnMgIT0gbnVsbCl7CisgICAgICAgIGlmIChwYXJhbWV0ZXJzICE9IG51bGwpIHsKICAgICAgICAgICAgIHJlcGxpY2Euc2V0UGFyYW1ldGVycygoVmVjdG9yPE9iamVjdD4pKHBhcmFtZXRlcnMuY2xvbmUoKSkpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXBsaWNhOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYW4gYXJyYXkgb2YgY2xhc3NlcyBjb3JyZXNwb25kaW5nIHRvIGFsbCBvZiB0aGUgcGFyYW1ldGVyCi0gICAgICogdmFsdWVzIGZvdW5kIGluIHRoZSBhcnJheSBvZiBwYXJhbWV0ZXJzLCBpbiBvcmRlci4KKyAgICAgKiBHZXRzIGFuIGFycmF5IG9mIGNsYXNzZXMgY29ycmVzcG9uZGluZyB0byBhbGwgb2YgdGhlIHBhcmFtZXRlciB2YWx1ZXMKKyAgICAgKiBmb3VuZCBpbiB0aGUgYXJyYXkgb2YgcGFyYW1ldGVycywgaW4gb3JkZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcGFyYW1ldGVyIGNsYXNzZXMKKyAgICAgKiBAcmV0dXJuIHRoZSBwYXJhbWV0ZXIgY2xhc3Nlcy4KICAgICAgKi8KICAgICBwdWJsaWMgQ2xhc3NbXSBnZXRQYXJhbUNsYXNzZXMoKSB7CiAgICAgICAgIGludCBjb3VudCA9IHBhcmFtZXRlcnMuc2l6ZSgpOwogICAgICAgICBDbGFzcyBwYXJhbUNsYXNzZXNbXSA9IG5ldyBDbGFzc1tjb3VudF07CiAKLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgIHBhcmFtQ2xhc3Nlc1tpXSA9IHBhcmFtZXRlcnMuZWxlbWVudEF0KGkpLmdldENsYXNzKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHBhcmFtQ2xhc3NlczsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSByZW5kZXJhYmxlIHNvdXJjZSBpbWFnZSBmb3VuZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4Ci0gICAgICogaW4gdGhlIHNvdXJjZSBhcnJheS4KKyAgICAgKiBHZXRzIHRoZSByZW5kZXJhYmxlIHNvdXJjZSBpbWFnZSBmb3VuZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGluIHRoZQorICAgICAqIHNvdXJjZSBhcnJheS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVuZGVyYWJsZSBzb3VyY2UgaW1hZ2UKKyAgICAgKiBAcGFyYW0gaW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleC4KKyAgICAgKiBAcmV0dXJuIHRoZSByZW5kZXJhYmxlIHNvdXJjZSBpbWFnZS4KICAgICAgKi8KICAgICBwdWJsaWMgUmVuZGVyYWJsZUltYWdlIGdldFJlbmRlcmFibGVTb3VyY2UoaW50IGluZGV4KSB7CiAgICAgICAgIHJldHVybiAoUmVuZGVyYWJsZUltYWdlKXNvdXJjZXMuZWxlbWVudEF0KGluZGV4KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcmFwcyB0aGUgc2hvcnQgdmFsdWUgaW4gYSBTaG9ydCBhbmQgcGxhY2VzIGl0IGluIHRoZSAKLSAgICAgKiBwYXJhbWV0ZXIgYmxvY2sgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KKyAgICAgKiBXcmFwcyB0aGUgc2hvcnQgdmFsdWUgaW4gYSBTaG9ydCBhbmQgcGxhY2VzIGl0IGluIHRoZSBwYXJhbWV0ZXIgYmxvY2sgYXQKKyAgICAgKiB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAqIAotICAgICAqIEBwYXJhbSBzIHRoZSBzaG9ydCB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyCi0gICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhpcyBwYXJhbWV0ZXIgYmxvY2sKKyAgICAgKiBAcGFyYW0gcworICAgICAqICAgICAgICAgICAgdGhlIHNob3J0IHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIuCisgICAgICogQHBhcmFtIGluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXguCisgICAgICogQHJldHVybiB0aGlzIHBhcmFtZXRlciBibG9jay4KICAgICAgKi8KICAgICBwdWJsaWMgUGFyYW1ldGVyQmxvY2sgc2V0KHNob3J0IHMsIGludCBpbmRleCkgewogICAgICAgICByZXR1cm4gc2V0KG5ldyBTaG9ydChzKSwgaW5kZXgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyYXBzIHRoZSBzaG9ydCB2YWx1ZSBpbiBhIFNob3J0IGFuZCBhZGRzIGl0IHRvIHRoZSAKLSAgICAgKiBwYXJhbWV0ZXIgYmxvY2suCisgICAgICogV3JhcHMgdGhlIHNob3J0IHZhbHVlIGluIGEgU2hvcnQgYW5kIGFkZHMgaXQgdG8gdGhlIHBhcmFtZXRlciBibG9jay4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcyB0aGUgc2hvcnQgdmFsdWUgb2YgdGhlIHBhcmFtZXRlcgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhpcyBwYXJhbWV0ZXIgYmxvY2sKKyAgICAgKiBAcGFyYW0gcworICAgICAqICAgICAgICAgICAgdGhlIHNob3J0IHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIuCisgICAgICogQHJldHVybiB0aGlzIHBhcmFtZXRlciBibG9jay4KICAgICAgKi8KICAgICBwdWJsaWMgUGFyYW1ldGVyQmxvY2sgYWRkKHNob3J0IHMpIHsKICAgICAgICAgcmV0dXJuIGFkZChuZXcgU2hvcnQocykpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyYXBzIHRoZSBsb25nIHZhbHVlIGluIGEgTG9uZyBhbmQgcGxhY2VzIGl0IGluIHRoZSAKLSAgICAgKiBwYXJhbWV0ZXIgYmxvY2sgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KKyAgICAgKiBXcmFwcyB0aGUgbG9uZyB2YWx1ZSBpbiBhIExvbmcgYW5kIHBsYWNlcyBpdCBpbiB0aGUgcGFyYW1ldGVyIGJsb2NrIGF0CisgICAgICogdGhlIHNwZWNpZmllZCBpbmRleC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbCB0aGUgbG9uZyB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyCi0gICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhpcyBwYXJhbWV0ZXIgYmxvY2sKKyAgICAgKiBAcGFyYW0gbAorICAgICAqICAgICAgICAgICAgdGhlIGxvbmcgdmFsdWUgb2YgdGhlIHBhcmFtZXRlci4KKyAgICAgKiBAcGFyYW0gaW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgcGFyYW1ldGVyIGJsb2NrLgogICAgICAqLwogICAgIHB1YmxpYyBQYXJhbWV0ZXJCbG9jayBzZXQobG9uZyBsLCBpbnQgaW5kZXgpIHsKICAgICAgICAgcmV0dXJuIHNldChuZXcgTG9uZyhsKSwgaW5kZXgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyYXBzIHRoZSBsb25nIHZhbHVlIGluIGEgTG9uZyBhbmQgYWRkcyBpdCB0byB0aGUgCi0gICAgICogcGFyYW1ldGVyIGJsb2NrLgorICAgICAqIFdyYXBzIHRoZSBsb25nIHZhbHVlIGluIGEgTG9uZyBhbmQgYWRkcyBpdCB0byB0aGUgcGFyYW1ldGVyIGJsb2NrLgogICAgICAqIAotICAgICAqIEBwYXJhbSBsIHRoZSBsb25nIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoaXMgcGFyYW1ldGVyIGJsb2NrCisgICAgICogQHBhcmFtIGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBsb25nIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIuCisgICAgICogQHJldHVybiB0aGlzIHBhcmFtZXRlciBibG9jay4KICAgICAgKi8KICAgICBwdWJsaWMgUGFyYW1ldGVyQmxvY2sgYWRkKGxvbmcgbCkgewogICAgICAgICByZXR1cm4gYWRkKG5ldyBMb25nKGwpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcmFwcyB0aGUgaW50IHZhbHVlIGluIGFuIEludGVnZXIgYW5kIHBsYWNlcyBpdCBpbiB0aGUgCi0gICAgICogcGFyYW1ldGVyIGJsb2NrIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCisgICAgICogV3JhcHMgdGhlIGludGVnZXIgdmFsdWUgaW4gYW4gSW50ZWdlciBhbmQgcGxhY2VzIGl0IGluIHRoZSBwYXJhbWV0ZXIKKyAgICAgKiBibG9jayBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAqIAotICAgICAqIEBwYXJhbSBpIHRoZSBpbnQgdmFsdWUgb2YgdGhlIHBhcmFtZXRlcgotICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXgKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoaXMgcGFyYW1ldGVyIGJsb2NrCisgICAgICogQHBhcmFtIGkKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIuCisgICAgICogQHBhcmFtIGluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXguCisgICAgICogQHJldHVybiB0aGlzIHBhcmFtZXRlciBibG9jay4KICAgICAgKi8KICAgICBwdWJsaWMgUGFyYW1ldGVyQmxvY2sgc2V0KGludCBpLCBpbnQgaW5kZXgpIHsKICAgICAgICAgcmV0dXJuIHNldChuZXcgSW50ZWdlcihpKSwgaW5kZXgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyYXBzIHRoZSBpbnQgdmFsdWUgaW4gYW4gSW50ZWdlciBhbmQgYWRkcyBpdCB0byB0aGUgCi0gICAgICogcGFyYW1ldGVyIGJsb2NrLgorICAgICAqIFdyYXBzIHRoZSBpbnRlZ2VyIHZhbHVlIGluIGFuIEludGVnZXIgYW5kIGFkZHMgaXQgdG8gdGhlIHBhcmFtZXRlciBibG9jay4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaSB0aGUgaW50IHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoaXMgcGFyYW1ldGVyIGJsb2NrCisgICAgICogQHBhcmFtIGkKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIuCisgICAgICogQHJldHVybiB0aGlzIHBhcmFtZXRlciBibG9jay4KICAgICAgKi8KICAgICBwdWJsaWMgUGFyYW1ldGVyQmxvY2sgYWRkKGludCBpKSB7CiAgICAgICAgIHJldHVybiBhZGQobmV3IEludGVnZXIoaSkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyYXBzIHRoZSBmbG9hdCB2YWx1ZSBpbiBhIEZsb2F0IGFuZCBwbGFjZXMgaXQgaW4gdGhlIAotICAgICAqIHBhcmFtZXRlciBibG9jayBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgorICAgICAqIFdyYXBzIHRoZSBmbG9hdCB2YWx1ZSBpbiBhIEZsb2F0IGFuZCBwbGFjZXMgaXQgaW4gdGhlIHBhcmFtZXRlciBibG9jayBhdAorICAgICAqIHRoZSBzcGVjaWZpZWQgaW5kZXguCiAgICAgICogCi0gICAgICogQHBhcmFtIGYgdGhlIGZsb2F0IHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIKLSAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGlzIHBhcmFtZXRlciBibG9jaworICAgICAqIEBwYXJhbSBmCisgICAgICogICAgICAgICAgICB0aGUgZmxvYXQgdmFsdWUgb2YgdGhlIHBhcmFtZXRlci4KKyAgICAgKiBAcGFyYW0gaW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgcGFyYW1ldGVyIGJsb2NrLgogICAgICAqLwogICAgIHB1YmxpYyBQYXJhbWV0ZXJCbG9jayBzZXQoZmxvYXQgZiwgaW50IGluZGV4KSB7CiAgICAgICAgIHJldHVybiBzZXQobmV3IEZsb2F0KGYpLCBpbmRleCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JhcHMgdGhlIGZsb2F0IHZhbHVlIGluIGEgRmxvYXQgYW5kIGFkZHMgaXQgdG8gdGhlIAotICAgICAqIHBhcmFtZXRlciBibG9jay4KKyAgICAgKiBXcmFwcyB0aGUgZmxvYXQgdmFsdWUgaW4gYSBGbG9hdCBhbmQgYWRkcyBpdCB0byB0aGUgcGFyYW1ldGVyIGJsb2NrLgogICAgICAqIAotICAgICAqIEBwYXJhbSBmIHRoZSBmbG9hdCB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGlzIHBhcmFtZXRlciBibG9jaworICAgICAqIEBwYXJhbSBmCisgICAgICogICAgICAgICAgICB0aGUgZmxvYXQgdmFsdWUgb2YgdGhlIHBhcmFtZXRlci4KKyAgICAgKiBAcmV0dXJuIHRoaXMgcGFyYW1ldGVyIGJsb2NrLgogICAgICAqLwogICAgIHB1YmxpYyBQYXJhbWV0ZXJCbG9jayBhZGQoZmxvYXQgZikgewogICAgICAgICByZXR1cm4gYWRkKG5ldyBGbG9hdChmKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JhcHMgdGhlIGRvdWJsZSB2YWx1ZSBpbiBhIERvdWJsZSBhbmQgcGxhY2VzIGl0IGluIHRoZSAKLSAgICAgKiBwYXJhbWV0ZXIgYmxvY2sgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KKyAgICAgKiBXcmFwcyB0aGUgZG91YmxlIHZhbHVlIGluIGEgRG91YmxlIGFuZCBwbGFjZXMgaXQgaW4gdGhlIHBhcmFtZXRlciBibG9jaworICAgICAqIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCiAgICAgICogCi0gICAgICogQHBhcmFtIGQgdGhlIGRvdWJsZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyCi0gICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhpcyBwYXJhbWV0ZXIgYmxvY2sKKyAgICAgKiBAcGFyYW0gZAorICAgICAqICAgICAgICAgICAgdGhlIGRvdWJsZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyLgorICAgICAqIEBwYXJhbSBpbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4LgorICAgICAqIEByZXR1cm4gdGhpcyBwYXJhbWV0ZXIgYmxvY2suCiAgICAgICovCiAgICAgcHVibGljIFBhcmFtZXRlckJsb2NrIHNldChkb3VibGUgZCwgaW50IGluZGV4KSB7CiAgICAgICAgIHJldHVybiBzZXQobmV3IERvdWJsZShkKSwgaW5kZXgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyYXBzIHRoZSBkb3VibGUgdmFsdWUgaW4gYSBEb3VibGUgYW5kIGFkZHMgaXQgdG8gdGhlIAotICAgICAqIHBhcmFtZXRlciBibG9jay4KKyAgICAgKiBXcmFwcyB0aGUgZG91YmxlIHZhbHVlIGluIGEgRG91YmxlIGFuZCBhZGRzIGl0IHRvIHRoZSBwYXJhbWV0ZXIgYmxvY2suCiAgICAgICogCi0gICAgICogQHBhcmFtIGQgdGhlIGRvdWJsZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGlzIHBhcmFtZXRlciBibG9jaworICAgICAqIEBwYXJhbSBkCisgICAgICogICAgICAgICAgICB0aGUgZG91YmxlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIuCisgICAgICogQHJldHVybiB0aGlzIHBhcmFtZXRlciBibG9jay4KICAgICAgKi8KICAgICBwdWJsaWMgUGFyYW1ldGVyQmxvY2sgYWRkKGRvdWJsZSBkKSB7CiAgICAgICAgIHJldHVybiBhZGQobmV3IERvdWJsZShkKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JhcHMgdGhlIGNoYXIgdmFsdWUgaW4gYSBDaGFyYWN0ZXIgYW5kIHBsYWNlcyBpdCBpbiB0aGUgCi0gICAgICogcGFyYW1ldGVyIGJsb2NrIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCisgICAgICogV3JhcHMgdGhlIGNoYXIgdmFsdWUgaW4gYSBDaGFyYWN0ZXIgYW5kIHBsYWNlcyBpdCBpbiB0aGUgcGFyYW1ldGVyIGJsb2NrCisgICAgICogYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYyB0aGUgY2hhciB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyCi0gICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhpcyBwYXJhbWV0ZXIgYmxvY2sKKyAgICAgKiBAcGFyYW0gYworICAgICAqICAgICAgICAgICAgdGhlIGNoYXIgdmFsdWUgb2YgdGhlIHBhcmFtZXRlci4KKyAgICAgKiBAcGFyYW0gaW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgcGFyYW1ldGVyIGJsb2NrLgogICAgICAqLwogICAgIHB1YmxpYyBQYXJhbWV0ZXJCbG9jayBzZXQoY2hhciBjLCBpbnQgaW5kZXgpIHsKICAgICAgICAgcmV0dXJuIHNldChuZXcgQ2hhcmFjdGVyKGMpLCBpbmRleCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JhcHMgdGhlIGNoYXIgdmFsdWUgaW4gYSBDaGFyYWN0ZXIgYW5kIGFkZHMgaXQgdG8gdGhlIAotICAgICAqIHBhcmFtZXRlciBibG9jay4KKyAgICAgKiBXcmFwcyB0aGUgY2hhciB2YWx1ZSBpbiBhIENoYXJhY3RlciBhbmQgYWRkcyBpdCB0byB0aGUgcGFyYW1ldGVyIGJsb2NrLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjIHRoZSBjaGFyIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoaXMgcGFyYW1ldGVyIGJsb2NrCisgICAgICogQHBhcmFtIGMKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIuCisgICAgICogQHJldHVybiB0aGlzIHBhcmFtZXRlciBibG9jay4KICAgICAgKi8KICAgICBwdWJsaWMgUGFyYW1ldGVyQmxvY2sgYWRkKGNoYXIgYykgewogICAgICAgICByZXR1cm4gYWRkKG5ldyBDaGFyYWN0ZXIoYykpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyYXBzIHRoZSBieXRlIHZhbHVlIGluIGEgQnl0ZSBhbmQgcGxhY2VzIGl0IGluIHRoZSAKLSAgICAgKiBwYXJhbWV0ZXIgYmxvY2sgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KKyAgICAgKiBXcmFwcyB0aGUgYnl0ZSB2YWx1ZSBpbiBhIEJ5dGUgYW5kIHBsYWNlcyBpdCBpbiB0aGUgcGFyYW1ldGVyIGJsb2NrIGF0CisgICAgICogdGhlIHNwZWNpZmllZCBpbmRleC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYiB0aGUgYnl0ZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyCi0gICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhpcyBwYXJhbWV0ZXIgYmxvY2sKKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlci4KKyAgICAgKiBAcGFyYW0gaW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgcGFyYW1ldGVyIGJsb2NrLgogICAgICAqLwogICAgIHB1YmxpYyBQYXJhbWV0ZXJCbG9jayBzZXQoYnl0ZSBiLCBpbnQgaW5kZXgpIHsKICAgICAgICAgcmV0dXJuIHNldChuZXcgQnl0ZShiKSwgaW5kZXgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyYXBzIHRoZSBieXRlIHZhbHVlIGluIGEgQnl0ZSBhbmQgYWRkcyBpdCB0byB0aGUgCi0gICAgICogcGFyYW1ldGVyIGJsb2NrLgorICAgICAqIFdyYXBzIHRoZSBieXRlIHZhbHVlIGluIGEgQnl0ZSBhbmQgYWRkcyBpdCB0byB0aGUgcGFyYW1ldGVyIGJsb2NrLgogICAgICAqIAotICAgICAqIEBwYXJhbSBiIHRoZSBieXRlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwYXJhbWV0ZXIgYmxvY2sKKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlci4KKyAgICAgKiBAcmV0dXJuIHRoZSBwYXJhbWV0ZXIgYmxvY2suCiAgICAgICovCiAgICAgcHVibGljIFBhcmFtZXRlckJsb2NrIGFkZChieXRlIGIpIHsKICAgICAgICAgcmV0dXJuIGFkZChuZXcgQnl0ZShiKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgUmVuZGVyZWRJbWFnZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGZyb20gdGhlIAotICAgICAqIHZlY3RvciBvZiBzb3VyY2UgaW1hZ2VzLgorICAgICAqIEdldHMgdGhlIFJlbmRlcmVkSW1hZ2UgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBmcm9tIHRoZSB2ZWN0b3Igb2Ygc291cmNlCisgICAgICogaW1hZ2VzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXgKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZW5kZXJlZCBpbWFnZQorICAgICAqIEBwYXJhbSBpbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4LgorICAgICAqIEByZXR1cm4gdGhlIHJlbmRlcmVkIGltYWdlLgogICAgICAqLwogICAgIHB1YmxpYyBSZW5kZXJlZEltYWdlIGdldFJlbmRlcmVkU291cmNlKGludCBpbmRleCkgewogICAgICAgICByZXR1cm4gKFJlbmRlcmVkSW1hZ2Upc291cmNlcy5lbGVtZW50QXQoaW5kZXgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNob3J0LXZhbHVlZCBwYXJhbWV0ZXIgZm91bmQgYXQgdGhlIGRlc2lyZWQgaW5kZXgKLSAgICAgKiBpbiB0aGUgdmVjdG9yIG9mIHBhcmFtZXRlciB2YWx1ZXMuCisgICAgICogR2V0cyB0aGUgc2hvcnQtdmFsdWVkIHBhcmFtZXRlciBmb3VuZCBhdCB0aGUgZGVzaXJlZCBpbmRleCBpbiB0aGUgdmVjdG9yCisgICAgICogb2YgcGFyYW1ldGVyIHZhbHVlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2hvcnQgcGFyYW1ldGVyCisgICAgICogQHBhcmFtIGluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXguCisgICAgICogQHJldHVybiB0aGUgc2hvcnQgcGFyYW1ldGVyLgogICAgICAqLwogICAgIHB1YmxpYyBzaG9ydCBnZXRTaG9ydFBhcmFtZXRlcihpbnQgaW5kZXgpIHsKICAgICAgICAgcmV0dXJuICgoU2hvcnQpcGFyYW1ldGVycy5lbGVtZW50QXQoaW5kZXgpKS5zaG9ydFZhbHVlKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgbG9uZy12YWx1ZWQgcGFyYW1ldGVyIGZvdW5kIGF0IHRoZSBkZXNpcmVkIGluZGV4Ci0gICAgICogaW4gdGhlIHZlY3RvciBvZiBwYXJhbWV0ZXIgdmFsdWVzLgorICAgICAqIEdldHMgdGhlIGxvbmctdmFsdWVkIHBhcmFtZXRlciBmb3VuZCBhdCB0aGUgZGVzaXJlZCBpbmRleCBpbiB0aGUgdmVjdG9yCisgICAgICogb2YgcGFyYW1ldGVyIHZhbHVlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbG9uZyBwYXJhbWV0ZXIKKyAgICAgKiBAcGFyYW0gaW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleC4KKyAgICAgKiBAcmV0dXJuIHRoZSBsb25nIHBhcmFtZXRlci4KICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBnZXRMb25nUGFyYW1ldGVyKGludCBpbmRleCkgewogICAgICAgICByZXR1cm4gKChMb25nKXBhcmFtZXRlcnMuZWxlbWVudEF0KGluZGV4KSkubG9uZ1ZhbHVlKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgaW50LXZhbHVlZCBwYXJhbWV0ZXIgZm91bmQgYXQgdGhlIGRlc2lyZWQgaW5kZXgKLSAgICAgKiBpbiB0aGUgdmVjdG9yIG9mIHBhcmFtZXRlciB2YWx1ZXMuCisgICAgICogR2V0cyB0aGUgaW50ZWdlci12YWx1ZWQgcGFyYW1ldGVyIGZvdW5kIGF0IHRoZSBkZXNpcmVkIGluZGV4IGluIHRoZQorICAgICAqIHZlY3RvciBvZiBwYXJhbWV0ZXIgdmFsdWVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXgKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnQgcGFyYW1ldGVyCisgICAgICogQHBhcmFtIGluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXguCisgICAgICogQHJldHVybiB0aGUgaW50ZWdlciBwYXJhbWV0ZXIuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRJbnRQYXJhbWV0ZXIoaW50IGluZGV4KSB7CiAgICAgICAgIHJldHVybiAoKEludGVnZXIpcGFyYW1ldGVycy5lbGVtZW50QXQoaW5kZXgpKS5pbnRWYWx1ZSgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGZsb2F0LXZhbHVlZCBwYXJhbWV0ZXIgZm91bmQgYXQgdGhlIGRlc2lyZWQgaW5kZXgKLSAgICAgKiBpbiB0aGUgdmVjdG9yIG9mIHBhcmFtZXRlciB2YWx1ZXMuCisgICAgICogR2V0cyB0aGUgZmxvYXQtdmFsdWVkIHBhcmFtZXRlciBmb3VuZCBhdCB0aGUgZGVzaXJlZCBpbmRleCBpbiB0aGUgdmVjdG9yCisgICAgICogb2YgcGFyYW1ldGVyIHZhbHVlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZmxvYXQgcGFyYW1ldGVyCisgICAgICogQHBhcmFtIGluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXguCisgICAgICogQHJldHVybiB0aGUgZmxvYXQgcGFyYW1ldGVyLgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdFBhcmFtZXRlcihpbnQgaW5kZXgpIHsKICAgICAgICAgcmV0dXJuICgoRmxvYXQpcGFyYW1ldGVycy5lbGVtZW50QXQoaW5kZXgpKS5mbG9hdFZhbHVlKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgZG91YmxlLXZhbHVlZCBwYXJhbWV0ZXIgZm91bmQgYXQgdGhlIGRlc2lyZWQgaW5kZXgKLSAgICAgKiBpbiB0aGUgdmVjdG9yIG9mIHBhcmFtZXRlciB2YWx1ZXMuCisgICAgICogR2V0cyB0aGUgZG91YmxlLXZhbHVlZCBwYXJhbWV0ZXIgZm91bmQgYXQgdGhlIGRlc2lyZWQgaW5kZXggaW4gdGhlIHZlY3RvcgorICAgICAqIG9mIHBhcmFtZXRlciB2YWx1ZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRvdWJsZSBwYXJhbWV0ZXIKKyAgICAgKiBAcGFyYW0gaW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleC4KKyAgICAgKiBAcmV0dXJuIHRoZSBkb3VibGUgcGFyYW1ldGVyLgogICAgICAqLwogICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlUGFyYW1ldGVyKGludCBpbmRleCkgewogICAgICAgICByZXR1cm4gKChEb3VibGUpcGFyYW1ldGVycy5lbGVtZW50QXQoaW5kZXgpKS5kb3VibGVWYWx1ZSgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNoYXItdmFsdWVkIHBhcmFtZXRlciBmb3VuZCBhdCB0aGUgZGVzaXJlZCBpbmRleAotICAgICAqIGluIHRoZSB2ZWN0b3Igb2YgcGFyYW1ldGVyIHZhbHVlcy4KKyAgICAgKiBHZXRzIHRoZSBjaGFyLXZhbHVlZCBwYXJhbWV0ZXIgZm91bmQgYXQgdGhlIGRlc2lyZWQgaW5kZXggaW4gdGhlIHZlY3RvcgorICAgICAqIG9mIHBhcmFtZXRlciB2YWx1ZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNoYXIgcGFyYW1ldGVyCisgICAgICogQHBhcmFtIGluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXguCisgICAgICogQHJldHVybiB0aGUgY2hhciBwYXJhbWV0ZXIuCiAgICAgICovCiAgICAgcHVibGljIGNoYXIgZ2V0Q2hhclBhcmFtZXRlcihpbnQgaW5kZXgpIHsKICAgICAgICAgcmV0dXJuICgoQ2hhcmFjdGVyKXBhcmFtZXRlcnMuZWxlbWVudEF0KGluZGV4KSkuY2hhclZhbHVlKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgYnl0ZS12YWx1ZWQgcGFyYW1ldGVyIGZvdW5kIGF0IHRoZSBkZXNpcmVkIGluZGV4Ci0gICAgICogaW4gdGhlIHZlY3RvciBvZiBwYXJhbWV0ZXIgdmFsdWVzLgorICAgICAqIEdldHMgdGhlIGJ5dGUtdmFsdWVkIHBhcmFtZXRlciBmb3VuZCBhdCB0aGUgZGVzaXJlZCBpbmRleCBpbiB0aGUgdmVjdG9yCisgICAgICogb2YgcGFyYW1ldGVyIHZhbHVlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYnl0ZSBwYXJhbWV0ZXIKKyAgICAgKiBAcGFyYW0gaW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleC4KKyAgICAgKiBAcmV0dXJuIHRoZSBieXRlIHBhcmFtZXRlci4KICAgICAgKi8KICAgICBwdWJsaWMgYnl0ZSBnZXRCeXRlUGFyYW1ldGVyKGludCBpbmRleCkgewogICAgICAgICByZXR1cm4gKChCeXRlKXBhcmFtZXRlcnMuZWxlbWVudEF0KGluZGV4KSkuYnl0ZVZhbHVlKCk7CkBAIC01MzEsNyArNTUxLDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHZlY3RvciBvZiBzb3VyY2VzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdmVjdG9yIG9mIHNvdXJjZXMKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHZlY3RvciBvZiBzb3VyY2VzLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TnVtU291cmNlcygpIHsKICAgICAgICAgcmV0dXJuIHNvdXJjZXMuc2l6ZSgpOwpAQCAtNTQwLDcgKzU2MCw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB2ZWN0b3Igb2YgcGFyYW1ldGVycy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHZlY3RvciBvZiBwYXJhbWV0ZXJzCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB2ZWN0b3Igb2YgcGFyYW1ldGVycy4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldE51bVBhcmFtZXRlcnMoKSB7CiAgICAgICAgIHJldHVybiBwYXJhbWV0ZXJzLnNpemUoKTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9pbWFnZS9yZW5kZXJhYmxlL1JlbmRlckNvbnRleHQuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9yZW5kZXJhYmxlL1JlbmRlckNvbnRleHQuamF2YQppbmRleCAzYTNiOTNjLi4wZGI1MTJmIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvcmVuZGVyYWJsZS9SZW5kZXJDb250ZXh0LmphdmEKKysrIGIvYXd0L2phdmEvYXd0L2ltYWdlL3JlbmRlcmFibGUvUmVuZGVyQ29udGV4dC5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIElnb3IgVi4gU3RvbHlhcm92CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5pbWFnZS5yZW5kZXJhYmxlOwogCiBpbXBvcnQgamF2YS5hd3QuUmVuZGVyaW5nSGludHM7CkBAIC0yNSwyNyArMjYsMzcgQEAKIGltcG9ydCBqYXZhLmF3dC5nZW9tLkFmZmluZVRyYW5zZm9ybTsKIAogLyoqCi0gKiBUaGUgQ2xhc3MgUmVuZGVyQ29udGV4dCBzdG9yZXMgZGF0YSBvbiBob3cgYW4gaW1hZ2UgaXMgdG8gYmUgCi0gKiByZW5kZXJlZDogdGhlIGFmZmluZSB0cmFuc2Zvcm0sIHRoZSBhcmVhIG9mIGludGVyZXN0LCBhbmQgCi0gKiB0aGUgcmVuZGVyaW5nIGhpbnRzLgorICogVGhlIENsYXNzIFJlbmRlckNvbnRleHQgc3RvcmVzIGRhdGEgb24gaG93IGFuIGltYWdlIGlzIHRvIGJlIHJlbmRlcmVkOiB0aGUKKyAqIGFmZmluZSB0cmFuc2Zvcm0sIHRoZSBhcmVhIG9mIGludGVyZXN0LCBhbmQgdGhlIHJlbmRlcmluZyBoaW50cy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBSZW5kZXJDb250ZXh0IGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKIAotICAgIC8qKiBUaGUgYWZmaW5lIHRyYW5zZm9ybS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgYWZmaW5lIHRyYW5zZm9ybS4KKyAgICAgKi8KICAgICBBZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtOwotICAgIAotICAgIC8qKiBUaGUgYXJlYSBvZiBpbnRlcmVzdC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBhcmVhIG9mIGludGVyZXN0LgorICAgICAqLwogICAgIFNoYXBlIGFvaTsKLSAgICAKLSAgICAvKiogVGhlIHJlbmRlcmluZyBoaW50cy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSByZW5kZXJpbmcgaGludHMuCisgICAgICovCiAgICAgUmVuZGVyaW5nSGludHMgaGludHM7CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgcmVuZGVyIGNvbnRleHQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHVzcjJkZXYgdGhlIGFmZmluZSB0cmFuc2Zvcm0KLSAgICAgKiBAcGFyYW0gYW9pIHRoZSBhcmVhIG9mIGludGVyZXN0Ci0gICAgICogQHBhcmFtIGhpbnRzIHRoZSByZW5kZXJpbmcgaGludHMKKyAgICAgKiBAcGFyYW0gdXNyMmRldgorICAgICAqICAgICAgICAgICAgdGhlIGFmZmluZSB0cmFuc2Zvcm0uCisgICAgICogQHBhcmFtIGFvaQorICAgICAqICAgICAgICAgICAgdGhlIGFyZWEgb2YgaW50ZXJlc3QuCisgICAgICogQHBhcmFtIGhpbnRzCisgICAgICogICAgICAgICAgICB0aGUgcmVuZGVyaW5nIGhpbnRzLgogICAgICAqLwogICAgIHB1YmxpYyBSZW5kZXJDb250ZXh0KEFmZmluZVRyYW5zZm9ybSB1c3IyZGV2LCBTaGFwZSBhb2ksIFJlbmRlcmluZ0hpbnRzIGhpbnRzKSB7CiAgICAgICAgIHRoaXMudHJhbnNmb3JtID0gKEFmZmluZVRyYW5zZm9ybSl1c3IyZGV2LmNsb25lKCk7CkBAIC01Niw4ICs2NywxMCBAQAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyByZW5kZXIgY29udGV4dCB3aXRoIG5vIHNwZWNpZmllZCBoaW50cy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXNyMmRldiB0aGUgYWZmaW5lIHRyYW5zZm9ybQotICAgICAqIEBwYXJhbSBhb2kgdGhlIGFyZWEgb2YgaW50ZXJlc3QKKyAgICAgKiBAcGFyYW0gdXNyMmRldgorICAgICAqICAgICAgICAgICAgdGhlIGFmZmluZSB0cmFuc2Zvcm0uCisgICAgICogQHBhcmFtIGFvaQorICAgICAqICAgICAgICAgICAgdGhlIGFyZWEgb2YgaW50ZXJlc3QuCiAgICAgICovCiAgICAgcHVibGljIFJlbmRlckNvbnRleHQoQWZmaW5lVHJhbnNmb3JtIHVzcjJkZXYsIFNoYXBlIGFvaSkgewogICAgICAgICB0aGlzKHVzcjJkZXYsIGFvaSwgbnVsbCk7CkBAIC02NiwxOCArNzksMjEgQEAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgcmVuZGVyIGNvbnRleHQgd2l0aCBubyBzcGVjaWZpZWQgYXJlYSBvZiBpbnRlcmVzdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXNyMmRldiB0aGUgYWZmaW5lIHRyYW5zZm9ybQotICAgICAqIEBwYXJhbSBoaW50cyB0aGUgcmVuZGVyaW5nIGhpbnRzCisgICAgICogQHBhcmFtIHVzcjJkZXYKKyAgICAgKiAgICAgICAgICAgIHRoZSBhZmZpbmUgdHJhbnNmb3JtLgorICAgICAqIEBwYXJhbSBoaW50cworICAgICAqICAgICAgICAgICAgdGhlIHJlbmRlcmluZyBoaW50cy4KICAgICAgKi8KICAgICBwdWJsaWMgUmVuZGVyQ29udGV4dChBZmZpbmVUcmFuc2Zvcm0gdXNyMmRldiwgUmVuZGVyaW5nSGludHMgaGludHMpIHsKICAgICAgICAgdGhpcyh1c3IyZGV2LCBudWxsLCBoaW50cyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHJlbmRlciBjb250ZXh0IHdpdGggbm8gcmVuZGVyaW5nIGhpbnRzIG9yIAotICAgICAqIGFyZWEgb2YgaW50ZXJlc3QuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHJlbmRlciBjb250ZXh0IHdpdGggbm8gcmVuZGVyaW5nIGhpbnRzIG9yIGFyZWEgb2YKKyAgICAgKiBpbnRlcmVzdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXNyMmRldiB0aGUgYWZmaW5lIHRyYW5zZm9ybQorICAgICAqIEBwYXJhbSB1c3IyZGV2CisgICAgICogICAgICAgICAgICB0aGUgYWZmaW5lIHRyYW5zZm9ybS4KICAgICAgKi8KICAgICBwdWJsaWMgUmVuZGVyQ29udGV4dChBZmZpbmVUcmFuc2Zvcm0gdXNyMmRldikgewogICAgICAgICB0aGlzKHVzcjJkZXYsIG51bGwsIG51bGwpOwpAQCAtOTEsMzYgKzEwNywzNiBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGFmZmluZSB0cmFuc2Zvcm0gZm9yIHRoaXMgcmVuZGVyIGNvbnRleHQuCiAgICAgICogCi0gICAgICogQHBhcmFtIG5ld1RyYW5zZm9ybSB0aGUgbmV3IGFmZmluZSB0cmFuc2Zvcm0KKyAgICAgKiBAcGFyYW0gbmV3VHJhbnNmb3JtCisgICAgICogICAgICAgICAgICB0aGUgbmV3IGFmZmluZSB0cmFuc2Zvcm0uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VHJhbnNmb3JtKEFmZmluZVRyYW5zZm9ybSBuZXdUcmFuc2Zvcm0pIHsKICAgICAgICAgdHJhbnNmb3JtID0gKEFmZmluZVRyYW5zZm9ybSluZXdUcmFuc2Zvcm0uY2xvbmUoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25jYXRlbmF0ZXMgdGhlIGN1cnJlbnQgdHJhbnNmb3JtIHdpdGggdGhlIHNwZWNpZmllZCB0cmFuc2Zvcm0KLSAgICAgKiAoc28gdGhleSBhcmUgYXBwbGllZCB3aXRoIHRoZSBzcGVjaWZpZWQgdHJhbnNmb3JtIGFjdGluZyBmaXJzdCkKLSAgICAgKiBhbmQgc2V0cyB0aGUgcmVzdWx0aW5nIHRyYW5zZm9ybSBhcyB0aGUgYWZmaW5lIHRyYW5zZm9ybSBvZiAKLSAgICAgKiB0aGlzIHJlbmRlcmluZyBjb250ZXh0LgorICAgICAqIENvbmNhdGVuYXRlcyB0aGUgY3VycmVudCB0cmFuc2Zvcm0gd2l0aCB0aGUgc3BlY2lmaWVkIHRyYW5zZm9ybSAoc28gdGhleQorICAgICAqIGFyZSBhcHBsaWVkIHdpdGggdGhlIHNwZWNpZmllZCB0cmFuc2Zvcm0gYWN0aW5nIGZpcnN0KSBhbmQgc2V0cyB0aGUKKyAgICAgKiByZXN1bHRpbmcgdHJhbnNmb3JtIGFzIHRoZSBhZmZpbmUgdHJhbnNmb3JtIG9mIHRoaXMgcmVuZGVyaW5nIGNvbnRleHQuCiAgICAgICogCi0gICAgICogQHBhcmFtIG1vZFRyYW5zZm9ybSB0aGUgbmV3IHRyYW5zZm9ybSB3aGljaCBtb2RpZmllcyB0aGUgCi0gICAgICogY3VycmVudCB0cmFuc2Zvcm0KLSAgICAgKiAKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIFJlbmRlckNvbnRleHQjcHJlQ29uY2F0ZW5hdGVUcmFuc2Zvcm0oQWZmaW5lVHJhbnNmb3JtKX0KKyAgICAgKiBAcGFyYW0gbW9kVHJhbnNmb3JtCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHRyYW5zZm9ybSB3aGljaCBtb2RpZmllcyB0aGUgY3VycmVudCB0cmFuc2Zvcm0uCisgICAgICogQGRlcHJlY2F0ZWQgdXNlCisgICAgICogICAgICAgICAgICAge0BsaW5rIFJlbmRlckNvbnRleHQjcHJlQ29uY2F0ZW5hdGVUcmFuc2Zvcm0oQWZmaW5lVHJhbnNmb3JtKX0KKyAgICAgKiAgICAgICAgICAgICAuCiAgICAgICovCi0gICAgQERlcHJlY2F0ZWQgICAgCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCBwcmVDb25jZXRlbmF0ZVRyYW5zZm9ybShBZmZpbmVUcmFuc2Zvcm0gbW9kVHJhbnNmb3JtKSB7CiAgICAgICAgIHByZUNvbmNhdGVuYXRlVHJhbnNmb3JtKG1vZFRyYW5zZm9ybSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uY2F0ZW5hdGVzIHRoZSBjdXJyZW50IHRyYW5zZm9ybSB3aXRoIHRoZSBzcGVjaWZpZWQgdHJhbnNmb3JtCi0gICAgICogKHNvIHRoZXkgYXJlIGFwcGxpZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHRyYW5zZm9ybSBhY3RpbmcgZmlyc3QpCi0gICAgICogYW5kIHNldHMgdGhlIHJlc3VsdGluZyB0cmFuc2Zvcm0gYXMgdGhlIGFmZmluZSB0cmFuc2Zvcm0gb2YgCi0gICAgICogdGhpcyByZW5kZXJpbmcgY29udGV4dC4KKyAgICAgKiBDb25jYXRlbmF0ZXMgdGhlIGN1cnJlbnQgdHJhbnNmb3JtIHdpdGggdGhlIHNwZWNpZmllZCB0cmFuc2Zvcm0gKHNvIHRoZXkKKyAgICAgKiBhcmUgYXBwbGllZCB3aXRoIHRoZSBzcGVjaWZpZWQgdHJhbnNmb3JtIGFjdGluZyBmaXJzdCkgYW5kIHNldHMgdGhlCisgICAgICogcmVzdWx0aW5nIHRyYW5zZm9ybSBhcyB0aGUgYWZmaW5lIHRyYW5zZm9ybSBvZiB0aGlzIHJlbmRlcmluZyBjb250ZXh0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBtb2RUcmFuc2Zvcm0gdGhlIG5ldyB0cmFuc2Zvcm0gd2hpY2ggbW9kaWZpZXMgdGhlIAotICAgICAqIGN1cnJlbnQgdHJhbnNmb3JtCisgICAgICogQHBhcmFtIG1vZFRyYW5zZm9ybQorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB0cmFuc2Zvcm0gd2hpY2ggbW9kaWZpZXMgdGhlIGN1cnJlbnQgdHJhbnNmb3JtLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHByZUNvbmNhdGVuYXRlVHJhbnNmb3JtKEFmZmluZVRyYW5zZm9ybSBtb2RUcmFuc2Zvcm0pIHsKICAgICAgICAgdHJhbnNmb3JtLnByZUNvbmNhdGVuYXRlKG1vZFRyYW5zZm9ybSk7CkBAIC0xMjksMTAgKzE0NSwxMCBAQAogICAgIC8qKgogICAgICAqIENvbmNhdGVuYXRlIHRoZSBzcGVjaWZpZWQgdHJhbnNmb3JtIHdpdGggdGhlIGN1cnJlbnQgdHJhbnNmb3JtLgogICAgICAqIAotICAgICAqIEBwYXJhbSBtb2RUcmFuc2Zvcm0gdGhlIG5ldyB0cmFuc2Zvcm0gd2hpY2ggbW9kaWZpZXMgdGhlIAotICAgICAqIGN1cnJlbnQgdHJhbnNmb3JtCi0gICAgICogCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBSZW5kZXJDb250ZXh0I2NvbmNhdGVuYXRlVHJhbnNmb3JtKEFmZmluZVRyYW5zZm9ybSl9CisgICAgICogQHBhcmFtIG1vZFRyYW5zZm9ybQorICAgICAqICAgICAgICAgICAgdGhlIG5ldyB0cmFuc2Zvcm0gd2hpY2ggbW9kaWZpZXMgdGhlIGN1cnJlbnQgdHJhbnNmb3JtLgorICAgICAqIEBkZXByZWNhdGVkIHVzZQorICAgICAqICAgICAgICAgICAgIHtAbGluayBSZW5kZXJDb250ZXh0I2NvbmNhdGVuYXRlVHJhbnNmb3JtKEFmZmluZVRyYW5zZm9ybSl9LgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgY29uY2V0ZW5hdGVUcmFuc2Zvcm0oQWZmaW5lVHJhbnNmb3JtIG1vZFRyYW5zZm9ybSkgewpAQCAtMTQyLDggKzE1OCw4IEBACiAgICAgLyoqCiAgICAgICogQ29uY2F0ZW5hdGUgdGhlIHNwZWNpZmllZCB0cmFuc2Zvcm0gd2l0aCB0aGUgY3VycmVudCB0cmFuc2Zvcm0uCiAgICAgICogCi0gICAgICogQHBhcmFtIG1vZFRyYW5zZm9ybSB0aGUgbmV3IHRyYW5zZm9ybSB3aGljaCBtb2RpZmllcyB0aGUgCi0gICAgICogY3VycmVudCB0cmFuc2Zvcm0KKyAgICAgKiBAcGFyYW0gbW9kVHJhbnNmb3JtCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHRyYW5zZm9ybSB3aGljaCBtb2RpZmllcyB0aGUgY3VycmVudCB0cmFuc2Zvcm0uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY29uY2F0ZW5hdGVUcmFuc2Zvcm0oQWZmaW5lVHJhbnNmb3JtIG1vZFRyYW5zZm9ybSkgewogICAgICAgICB0cmFuc2Zvcm0uY29uY2F0ZW5hdGUobW9kVHJhbnNmb3JtKTsKQEAgLTE1Miw3ICsxNjgsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHRyYW5zZm9ybS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0cmFuc2Zvcm0KKyAgICAgKiBAcmV0dXJuIHRoZSB0cmFuc2Zvcm0uCiAgICAgICovCiAgICAgcHVibGljIEFmZmluZVRyYW5zZm9ybSBnZXRUcmFuc2Zvcm0oKSB7CiAgICAgICAgIHJldHVybiAoQWZmaW5lVHJhbnNmb3JtKXRyYW5zZm9ybS5jbG9uZSgpOwpAQCAtMTYxLDcgKzE3Nyw4IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgYXJlYSBvZiBpbnRlcmVzdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmV3QW9pIHRoZSBuZXcgYXJlYSBvZiBpbnRlcmVzdAorICAgICAqIEBwYXJhbSBuZXdBb2kKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgYXJlYSBvZiBpbnRlcmVzdC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRBcmVhT2ZJbnRlcmVzdChTaGFwZSBuZXdBb2kpIHsKICAgICAgICAgYW9pID0gbmV3QW9pOwpAQCAtMTcwLDcgKzE4Nyw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgYXJlYSBvZiBpbnRlcmVzdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhcmVhIG9mIGludGVyZXN0CisgICAgICogQHJldHVybiB0aGUgYXJlYSBvZiBpbnRlcmVzdC4KICAgICAgKi8KICAgICBwdWJsaWMgU2hhcGUgZ2V0QXJlYU9mSW50ZXJlc3QoKSB7CiAgICAgICAgIHJldHVybiBhb2k7CkBAIC0xNzksNyArMTk2LDggQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSByZW5kZXJpbmcgaGludHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGhpbnRzIHRoZSBuZXcgcmVuZGVyaW5nIGhpbnRzCisgICAgICogQHBhcmFtIGhpbnRzCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHJlbmRlcmluZyBoaW50cy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRSZW5kZXJpbmdIaW50cyhSZW5kZXJpbmdIaW50cyBoaW50cykgewogICAgICAgICB0aGlzLmhpbnRzID0gaGludHM7CkBAIC0xODgsNyArMjA2LDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSByZW5kZXJpbmcgaGludHMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVuZGVyaW5nIGhpbnRzCisgICAgICogQHJldHVybiB0aGUgcmVuZGVyaW5nIGhpbnRzLgogICAgICAqLwogICAgIHB1YmxpYyBSZW5kZXJpbmdIaW50cyBnZXRSZW5kZXJpbmdIaW50cygpIHsKICAgICAgICAgcmV0dXJuIGhpbnRzOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL3JlbmRlcmFibGUvUmVuZGVyYWJsZUltYWdlLmphdmEgYi9hd3QvamF2YS9hd3QvaW1hZ2UvcmVuZGVyYWJsZS9SZW5kZXJhYmxlSW1hZ2UuamF2YQppbmRleCA4ODVkYzA2Li4yMTMzMmY3IDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvcmVuZGVyYWJsZS9SZW5kZXJhYmxlSW1hZ2UuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvcmVuZGVyYWJsZS9SZW5kZXJhYmxlSW1hZ2UuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBJZ29yIFYuIFN0b2x5YXJvdgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuaW1hZ2UucmVuZGVyYWJsZTsKIAogaW1wb3J0IGphdmEuYXd0LlJlbmRlcmluZ0hpbnRzOwpAQCAtMjUsMTA4ICsyNiwxMTMgQEAKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCiAvKioKLSAqIFRoZSBJbnRlcmZhY2UgUmVuZGVyYWJsZUltYWdlIGlzIGltcGxlbWVudGVkIGJ5IGFuIG9iamVjdCB0aGF0Ci0gKiBjb2xsZWN0cyBhbGwgb2YgdGhlIGltYWdlLXNwZWNpZmljIGRhdGEgdGhhdCBkZWZpbmVzIGEgc2luZ2xlIGltYWdlIAotICogdGhhdCBjb3VsZCBiZSByZW5kZXJlZCB0byBkaWZmZXJlbnQgcmVuZGVyaW5nIHRhcmdldHMuCisgKiBUaGUgSW50ZXJmYWNlIFJlbmRlcmFibGVJbWFnZSBpcyBpbXBsZW1lbnRlZCBieSBhbiBvYmplY3QgdGhhdCBjb2xsZWN0cyBhbGwKKyAqIG9mIHRoZSBpbWFnZS1zcGVjaWZpYyBkYXRhIHRoYXQgZGVmaW5lcyBhIHNpbmdsZSBpbWFnZSB0aGF0IGNvdWxkIGJlIHJlbmRlcmVkCisgKiB0byBkaWZmZXJlbnQgcmVuZGVyaW5nIHRhcmdldHMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIFJlbmRlcmFibGVJbWFnZSB7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IEhJTlRTX09CU0VSVkVEIGluZGljYXRlcyB0aGF0IHRoZSByZW5kZXJpbmcKLSAgICAgKiBoaW50cyBhcmUgYXBwbGllZCByYXRoZXIgdGhhbiBpZ25vcmVkLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBISU5UU19PQlNFUlZFRCBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVuZGVyaW5nIGhpbnRzIGFyZQorICAgICAqIGFwcGxpZWQgcmF0aGVyIHRoYW4gaWdub3JlZC4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBISU5UU19PQlNFUlZFRCA9ICJISU5UU19PQlNFUlZFRCI7IC8vJE5PTi1OTFMtMSQKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHByb3BlcnR5IGZyb20gdGhlIFJlbmRlcmFibGVJbWFnZSdzIHBhcmFtZXRlciBibG9jay4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBuYW1lKTsKIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIHJlbmRlcmVkIGltYWdlIGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgCi0gICAgICogaW4gdGhlIHBhcmFtZXRlcnMgYW5kIHRoZSByZW5kZXIgY29udGV4dC4KKyAgICAgKiBDcmVhdGVzIHRoZSByZW5kZXJlZCBpbWFnZSBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZQorICAgICAqIHBhcmFtZXRlcnMgYW5kIHRoZSByZW5kZXIgY29udGV4dC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVuZGVyQ29udGV4dCB0aGUgcmVuZGVyIGNvbnRleHQgZ2l2aW5nIHJlbmRlcmluZyBzcGVjaWZpY2F0aW9ucwotICAgICAqIHN1Y2ggYXMgdHJhbnNmb3JtYXRpb25zCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVuZGVyZWQgaW1hZ2UKKyAgICAgKiBAcGFyYW0gcmVuZGVyQ29udGV4dAorICAgICAqICAgICAgICAgICAgdGhlIHJlbmRlciBjb250ZXh0IGdpdmluZyByZW5kZXJpbmcgc3BlY2lmaWNhdGlvbnMgc3VjaCBhcworICAgICAqICAgICAgICAgICAgdHJhbnNmb3JtYXRpb25zLgorICAgICAqIEByZXR1cm4gdGhlIHJlbmRlcmVkIGltYWdlLgogICAgICAqLwogICAgIHB1YmxpYyBSZW5kZXJlZEltYWdlIGNyZWF0ZVJlbmRlcmluZyhSZW5kZXJDb250ZXh0IHJlbmRlckNvbnRleHQpOwogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgc2NhbGVkIHJlbmRlcmVkIGltYWdlIGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgCi0gICAgICogaW4gdGhlIHBhcmFtZXRlcnMgYW5kIHRoZSByZW5kZXIgY29udGV4dC4KKyAgICAgKiBDcmVhdGVzIHRoZSBzY2FsZWQgcmVuZGVyZWQgaW1hZ2UgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbgorICAgICAqIHRoZSBwYXJhbWV0ZXJzIGFuZCB0aGUgcmVuZGVyIGNvbnRleHQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHcgdGhlIGRlc2lyZWQgd2lkdGggYWZ0ZXIgc2NhbGluZyBvciB6ZXJvIGlmIHRoZSBzY2FsaW5nIAotICAgICAqIHNob3VsZCBiZSBwcm9wb3J0aW9uYWwsIGJhc2VkIG9uIHRoZSBoZWlnaHQKLSAgICAgKiBAcGFyYW0gaCB0aGUgZGVzaXJlZCBoZWlnaHQgYWZ0ZXIgc2NhbGluZyBvciB6ZXJvIGlmIHRoZSBzY2FsaW5nIAotICAgICAqIHNob3VsZCBiZSBwcm9wb3J0aW9uYWwsIGJhc2VkIG9uIHRoZSB3aWR0aAotICAgICAqIEBwYXJhbSBoaW50cyB0aGUgcmVuZGVyaW5nIGhpbnRzIHRvIHVzZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlbmRlcmVkIGltYWdlCi0gICAgICogCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYm90aCB0aGUgaGVpZ2h0IGFuZCB3aWR0aCBhcmUgemVybworICAgICAqIEBwYXJhbSB3CisgICAgICogICAgICAgICAgICB0aGUgZGVzaXJlZCB3aWR0aCBhZnRlciBzY2FsaW5nIG9yIHplcm8gaWYgdGhlIHNjYWxpbmcgc2hvdWxkCisgICAgICogICAgICAgICAgICBiZSBwcm9wb3J0aW9uYWwsIGJhc2VkIG9uIHRoZSBoZWlnaHQuCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXNpcmVkIGhlaWdodCBhZnRlciBzY2FsaW5nIG9yIHplcm8gaWYgdGhlIHNjYWxpbmcgc2hvdWxkCisgICAgICogICAgICAgICAgICBiZSBwcm9wb3J0aW9uYWwsIGJhc2VkIG9uIHRoZSB3aWR0aC4KKyAgICAgKiBAcGFyYW0gaGludHMKKyAgICAgKiAgICAgICAgICAgIHRoZSByZW5kZXJpbmcgaGludHMgdG8gdXNlLgorICAgICAqIEByZXR1cm4gdGhlIHJlbmRlcmVkIGltYWdlLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYm90aCB0aGUgaGVpZ2h0IGFuZCB3aWR0aCBhcmUgemVyby4KICAgICAgKi8KICAgICBwdWJsaWMgUmVuZGVyZWRJbWFnZSBjcmVhdGVTY2FsZWRSZW5kZXJpbmcoaW50IHcsIGludCBoLCBSZW5kZXJpbmdIaW50cyBoaW50cyk7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSB2ZWN0b3Igb2Ygc291cmNlcyBmcm9tIHRoZSBwYXJhbWV0ZXIgYmxvY2suCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgc291cmNlcworICAgICAqIEByZXR1cm4gdGhlIHNvdXJjZXMuCiAgICAgICovCiAgICAgcHVibGljIFZlY3RvcjxSZW5kZXJhYmxlSW1hZ2U+IGdldFNvdXJjZXMoKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG5hbWVzIG9mIGFsbCBvZiB0aGUgc3VwcG9ydGVkIHByb3BlcnRpZXMgaW4gdGhlIGN1cnJlbnQgY29udGV4dC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSBuYW1lcworICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnR5IG5hbWVzLgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQcm9wZXJ0eU5hbWVzKCk7CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IHJlbmRlcmluZyAodXNpbmcgdGhlIGlkZW50aXR5IHRyYW5zZm9ybQotICAgICAqIGFuZCBkZWZhdWx0IHJlbmRlciBjb250ZXh0KS4KKyAgICAgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IHJlbmRlcmluZyAodXNpbmcgdGhlIGlkZW50aXR5IHRyYW5zZm9ybSBhbmQgZGVmYXVsdAorICAgICAqIHJlbmRlciBjb250ZXh0KS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZW5kZXJlZCBpbWFnZQorICAgICAqIEByZXR1cm4gdGhlIHJlbmRlcmVkIGltYWdlLgogICAgICAqLwogICAgIHB1YmxpYyBSZW5kZXJlZEltYWdlIGNyZWF0ZURlZmF1bHRSZW5kZXJpbmcoKTsKIAogICAgIC8qKgogICAgICAqIENoZWNrcyBpZiB0aGlzIGNvbnRleHQgc3VwcG9ydHMgZHluYW1pYyByZW5kZXJpbmcuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGlzIGNvbnRleHQgc3VwcG9ydHMgZHluYW1pYyByZW5kZXJpbmcKKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgY29udGV4dCBzdXBwb3J0cyBkeW5hbWljIHJlbmRlcmluZy4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0R5bmFtaWMoKTsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UKKyAgICAgKiBAcmV0dXJuIHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldFdpZHRoKCk7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIKKyAgICAgKiBAcmV0dXJuIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyLgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdCBnZXRNaW5ZKCk7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIKKyAgICAgKiBAcmV0dXJuIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyLgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdCBnZXRNaW5YKCk7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UKKyAgICAgKiBAcmV0dXJuIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlLgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdCBnZXRIZWlnaHQoKTsKIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvcmVuZGVyYWJsZS9SZW5kZXJhYmxlSW1hZ2VPcC5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL3JlbmRlcmFibGUvUmVuZGVyYWJsZUltYWdlT3AuamF2YQppbmRleCA5OTNiYTVmLi5kYzQ1MzcyIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvcmVuZGVyYWJsZS9SZW5kZXJhYmxlSW1hZ2VPcC5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9yZW5kZXJhYmxlL1JlbmRlcmFibGVJbWFnZU9wLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgSWdvciBWLiBTdG9seWFyb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKICAqLworCiBwYWNrYWdlIGphdmEuYXd0LmltYWdlLnJlbmRlcmFibGU7CiAKIGltcG9ydCBqYXZhLmF3dC5SZW5kZXJpbmdIaW50czsKQEAgLTI5LDM1ICszMCw0NCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5hd3QuaW50ZXJuYWwubmxzLk1lc3NhZ2VzOwogCiAvKioKLSAqIFRoZSBDbGFzcyBSZW5kZXJhYmxlSW1hZ2VPcCBpcyBhIGJhc2ljIGltcGxlbWVudGF0aW9uIG9mIFJlbmRlcmFibGVJbWFnZSwgCi0gKiB3aXRoIG1ldGhvZHMgdG8gYWNjZXNzIHRoZSBwYXJhbWV0ZXIgZGF0YSBhbmQgcGVyZm9ybSByZW5kZXJpbmcKLSAqIG9wZXJhdGlvbnMuCisgKiBUaGUgQ2xhc3MgUmVuZGVyYWJsZUltYWdlT3AgaXMgYSBiYXNpYyBpbXBsZW1lbnRhdGlvbiBvZiBSZW5kZXJhYmxlSW1hZ2UsCisgKiB3aXRoIG1ldGhvZHMgdG8gYWNjZXNzIHRoZSBwYXJhbWV0ZXIgZGF0YSBhbmQgcGVyZm9ybSByZW5kZXJpbmcgb3BlcmF0aW9ucy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBSZW5kZXJhYmxlSW1hZ2VPcCBpbXBsZW1lbnRzIFJlbmRlcmFibGVJbWFnZSB7CiAKLSAgICAvKiogVGhlIENSSUYuICovCisgICAgLyoqCisgICAgICogVGhlIENSSUYuCisgICAgICovCiAgICAgQ29udGV4dHVhbFJlbmRlcmVkSW1hZ2VGYWN0b3J5IENSSUY7Ci0gICAgCi0gICAgLyoqIFRoZSBwYXJhbSBibG9jay4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBwYXJhbSBibG9jay4KKyAgICAgKi8KICAgICBQYXJhbWV0ZXJCbG9jayBwYXJhbUJsb2NrOwotICAgIAotICAgIC8qKiBUaGUgaGVpZ2h0LiAqLworCisgICAgLyoqCisgICAgICogVGhlIGhlaWdodC4KKyAgICAgKi8KICAgICBmbG9hdCBtaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0OwogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHJlbmRlcmFibGUgaW1hZ2Ugb3AuCiAgICAgICogCi0gICAgICogQHBhcmFtIENSSUYgdGhlIGNSSUYKLSAgICAgKiBAcGFyYW0gcGFyYW1CbG9jayB0aGUgcGFyYW0gYmxvY2sKKyAgICAgKiBAcGFyYW0gQ1JJRgorICAgICAqICAgICAgICAgICAgdGhlIGNSSUYuCisgICAgICogQHBhcmFtIHBhcmFtQmxvY2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbSBibG9jay4KICAgICAgKi8KICAgICBwdWJsaWMgUmVuZGVyYWJsZUltYWdlT3AoQ29udGV4dHVhbFJlbmRlcmVkSW1hZ2VGYWN0b3J5IENSSUYsIFBhcmFtZXRlckJsb2NrIHBhcmFtQmxvY2spIHsKICAgICAgICAgdGhpcy5DUklGID0gQ1JJRjsKLSAgICAgICAgdGhpcy5wYXJhbUJsb2NrID0gKFBhcmFtZXRlckJsb2NrKSBwYXJhbUJsb2NrLmNsb25lKCk7CisgICAgICAgIHRoaXMucGFyYW1CbG9jayA9IChQYXJhbWV0ZXJCbG9jaylwYXJhbUJsb2NrLmNsb25lKCk7CiAgICAgICAgIFJlY3RhbmdsZTJEIHIgPSBDUklGLmdldEJvdW5kczJEKHBhcmFtQmxvY2spOwotICAgICAgICBtaW5YID0gKGZsb2F0KSByLmdldE1pblgoKTsKLSAgICAgICAgbWluWSA9IChmbG9hdCkgci5nZXRNaW5ZKCk7Ci0gICAgICAgIHdpZHRoID0gKGZsb2F0KSByLmdldFdpZHRoKCk7Ci0gICAgICAgIGhlaWdodCA9IChmbG9hdCkgci5nZXRIZWlnaHQoKTsKKyAgICAgICAgbWluWCA9IChmbG9hdClyLmdldE1pblgoKTsKKyAgICAgICAgbWluWSA9IChmbG9hdClyLmdldE1pblkoKTsKKyAgICAgICAgd2lkdGggPSAoZmxvYXQpci5nZXRXaWR0aCgpOworICAgICAgICBoZWlnaHQgPSAoZmxvYXQpci5nZXRIZWlnaHQoKTsKICAgICB9CiAKICAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBuYW1lKSB7CkBAIC02NywyNyArNzcsMjcgQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBwYXJhbWV0ZXIgYmxvY2suCiAgICAgICogCi0gICAgICogQHBhcmFtIHBhcmFtQmxvY2sgdGhlIHBhcmFtIGJsb2NrCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcGFyYW1ldGVyIGJsb2NrCisgICAgICogQHBhcmFtIHBhcmFtQmxvY2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbSBibG9jay4KKyAgICAgKiBAcmV0dXJuIHRoZSBwYXJhbWV0ZXIgYmxvY2suCiAgICAgICovCiAgICAgcHVibGljIFBhcmFtZXRlckJsb2NrIHNldFBhcmFtZXRlckJsb2NrKFBhcmFtZXRlckJsb2NrIHBhcmFtQmxvY2spIHsKICAgICAgICAgUGFyYW1ldGVyQmxvY2sgb2xkUGFyYW0gPSB0aGlzLnBhcmFtQmxvY2s7Ci0gICAgICAgIHRoaXMucGFyYW1CbG9jayA9IChQYXJhbWV0ZXJCbG9jaykgcGFyYW1CbG9jay5jbG9uZSgpOworICAgICAgICB0aGlzLnBhcmFtQmxvY2sgPSAoUGFyYW1ldGVyQmxvY2spcGFyYW1CbG9jay5jbG9uZSgpOwogICAgICAgICByZXR1cm4gb2xkUGFyYW07CiAgICAgfQogCiAgICAgcHVibGljIFJlbmRlcmVkSW1hZ2UgY3JlYXRlUmVuZGVyaW5nKFJlbmRlckNvbnRleHQgcmVuZGVyQ29udGV4dCkgewogCiAgICAgICAgIFZlY3RvcjxSZW5kZXJhYmxlSW1hZ2U+IHNvdXJjZXMgPSBnZXRTb3VyY2VzKCk7Ci0gICAgICAgIFBhcmFtZXRlckJsb2NrIHJkUGFyYW0gPSAoUGFyYW1ldGVyQmxvY2spIHBhcmFtQmxvY2suY2xvbmUoKTsKKyAgICAgICAgUGFyYW1ldGVyQmxvY2sgcmRQYXJhbSA9IChQYXJhbWV0ZXJCbG9jaylwYXJhbUJsb2NrLmNsb25lKCk7CiAKICAgICAgICAgaWYgKHNvdXJjZXMgIT0gbnVsbCkgewogICAgICAgICAgICAgVmVjdG9yPE9iamVjdD4gcmRTb3VyY2VzID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CiAgICAgICAgICAgICBpbnQgaSA9IDA7CiAgICAgICAgICAgICB3aGlsZSAoaSA8IHNvdXJjZXMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgUmVuZGVyQ29udGV4dCBuZXdDb250ZXh0ID0gQ1JJRi5tYXBSZW5kZXJDb250ZXh0KGksIHJlbmRlckNvbnRleHQsIHBhcmFtQmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzKTsKKyAgICAgICAgICAgICAgICBSZW5kZXJDb250ZXh0IG5ld0NvbnRleHQgPSBDUklGCisgICAgICAgICAgICAgICAgICAgICAgICAubWFwUmVuZGVyQ29udGV4dChpLCByZW5kZXJDb250ZXh0LCBwYXJhbUJsb2NrLCB0aGlzKTsKICAgICAgICAgICAgICAgICBSZW5kZXJlZEltYWdlIHJkaW0gPSBzb3VyY2VzLmVsZW1lbnRBdChpKS5jcmVhdGVSZW5kZXJpbmcobmV3Q29udGV4dCk7CiAKICAgICAgICAgICAgICAgICBpZiAocmRpbSAhPSBudWxsKSB7CkBAIC0xMDMsMjAgKzExMywyMCBAQAogICAgIH0KIAogICAgIHB1YmxpYyBSZW5kZXJlZEltYWdlIGNyZWF0ZVNjYWxlZFJlbmRlcmluZyhpbnQgdywgaW50IGgsIFJlbmRlcmluZ0hpbnRzIGhpbnRzKSB7Ci0gICAgICAgIGlmKHcgPT0gMCAmJiBoID09IDApIHsKKyAgICAgICAgaWYgKHcgPT0gMCAmJiBoID09IDApIHsKICAgICAgICAgICAgIC8vIGF3dC42MD1XaWR0aCBhbmQgSGVpZ2h0IG11c3RuJ3QgYmUgZXF1YWwgemVybyBib3RoCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiYXd0LjYwIikpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KLSAgICAgICAgaWYodyA9PSAwKXsKLSAgICAgICAgICAgIHcgPSBNYXRoLnJvdW5kKGgqKGdldFdpZHRoKCkvZ2V0SGVpZ2h0KCkpKTsKKyAgICAgICAgaWYgKHcgPT0gMCkgeworICAgICAgICAgICAgdyA9IE1hdGgucm91bmQoaCAqIChnZXRXaWR0aCgpIC8gZ2V0SGVpZ2h0KCkpKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmKGggPT0gMCl7Ci0gICAgICAgICAgICBoID0gTWF0aC5yb3VuZCh3KihnZXRIZWlnaHQoKS9nZXRXaWR0aCgpKSk7CisgICAgICAgIGlmIChoID09IDApIHsKKyAgICAgICAgICAgIGggPSBNYXRoLnJvdW5kKHcgKiAoZ2V0SGVpZ2h0KCkgLyBnZXRXaWR0aCgpKSk7CiAgICAgICAgIH0KIAotICAgICAgICBkb3VibGUgc3ggPSAoZG91YmxlKXcvZ2V0V2lkdGgoKTsKLSAgICAgICAgZG91YmxlIHN5ID0gKGRvdWJsZSloL2dldEhlaWdodCgpOworICAgICAgICBkb3VibGUgc3ggPSAoZG91YmxlKXcgLyBnZXRXaWR0aCgpOworICAgICAgICBkb3VibGUgc3kgPSAoZG91YmxlKWggLyBnZXRIZWlnaHQoKTsKIAogICAgICAgICBBZmZpbmVUcmFuc2Zvcm0gYXQgPSBBZmZpbmVUcmFuc2Zvcm0uZ2V0U2NhbGVJbnN0YW5jZShzeCwgc3kpOwogICAgICAgICBSZW5kZXJDb250ZXh0IGNvbnRleHQgPSBuZXcgUmVuZGVyQ29udGV4dChhdCwgaGludHMpOwpAQCAtMTI0LDE1ICsxMzQsMTUgQEAKICAgICB9CiAKICAgICBwdWJsaWMgVmVjdG9yPFJlbmRlcmFibGVJbWFnZT4gZ2V0U291cmNlcygpIHsKLSAgICAgICAgaWYocGFyYW1CbG9jay5nZXROdW1Tb3VyY2VzKCkgPT0gMCkgeworICAgICAgICBpZiAocGFyYW1CbG9jay5nZXROdW1Tb3VyY2VzKCkgPT0gMCkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KICAgICAgICAgVmVjdG9yPFJlbmRlcmFibGVJbWFnZT4gdiA9IG5ldyBWZWN0b3I8UmVuZGVyYWJsZUltYWdlPigpOwotICAgICAgICBpbnQgIGkgPSAwOwotICAgICAgICB3aGlsZShpIDwgcGFyYW1CbG9jay5nZXROdW1Tb3VyY2VzKCkpeworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIHdoaWxlIChpIDwgcGFyYW1CbG9jay5nZXROdW1Tb3VyY2VzKCkpIHsKICAgICAgICAgICAgIE9iamVjdCBvID0gcGFyYW1CbG9jay5nZXRTb3VyY2UoaSk7Ci0gICAgICAgICAgICBpZihvIGluc3RhbmNlb2YgUmVuZGVyYWJsZUltYWdlKXsKLSAgICAgICAgICAgICAgICB2LmFkZEVsZW1lbnQoKFJlbmRlcmFibGVJbWFnZSkgbyk7CisgICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFJlbmRlcmFibGVJbWFnZSkgeworICAgICAgICAgICAgICAgIHYuYWRkRWxlbWVudCgoUmVuZGVyYWJsZUltYWdlKW8pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaSsrOwogICAgICAgICB9CkBAIC0xNzksNCArMTg5LDMgQEAKICAgICB9CiAKIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmEvYXd0L2ltYWdlL3JlbmRlcmFibGUvUmVuZGVyYWJsZUltYWdlUHJvZHVjZXIuamF2YSBiL2F3dC9qYXZhL2F3dC9pbWFnZS9yZW5kZXJhYmxlL1JlbmRlcmFibGVJbWFnZVByb2R1Y2VyLmphdmEKaW5kZXggN2ZkYTk4Yy4uZTgzZWJjNyAxMDA2NDQKLS0tIGEvYXd0L2phdmEvYXd0L2ltYWdlL3JlbmRlcmFibGUvUmVuZGVyYWJsZUltYWdlUHJvZHVjZXIuamF2YQorKysgYi9hd3QvamF2YS9hd3QvaW1hZ2UvcmVuZGVyYWJsZS9SZW5kZXJhYmxlSW1hZ2VQcm9kdWNlci5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIElnb3IgVi4gU3RvbHlhcm92CiAgKiBAdmVyc2lvbiAkUmV2aXNpb24kCiAgKi8KKwogcGFja2FnZSBqYXZhLmF3dC5pbWFnZS5yZW5kZXJhYmxlOwogCiBpbXBvcnQgamF2YS5hd3QuaW1hZ2UuQ29sb3JNb2RlbDsKQEAgLTI4LDI1ICsyOSwzNSBAQAogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKIC8qKgotICogVGhlIENsYXNzIFJlbmRlcmFibGVJbWFnZVByb2R1Y2VyIHByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgCi0gKiB0aGUgaW1hZ2UgcmVuZGVyaW5nLgorICogVGhlIENsYXNzIFJlbmRlcmFibGVJbWFnZVByb2R1Y2VyIHByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGltYWdlCisgKiByZW5kZXJpbmcuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgUmVuZGVyYWJsZUltYWdlUHJvZHVjZXIgaW1wbGVtZW50cyBJbWFnZVByb2R1Y2VyLCBSdW5uYWJsZSB7CiAKLSAgICAvKiogVGhlIHJibC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgcmJsLgorICAgICAqLwogICAgIFJlbmRlcmFibGVJbWFnZSByYmw7Ci0gICAgCi0gICAgLyoqIFRoZSByYy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSByYy4KKyAgICAgKi8KICAgICBSZW5kZXJDb250ZXh0IHJjOwotICAgIAotICAgIC8qKiBUaGUgY29uc3VtZXJzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGNvbnN1bWVycy4KKyAgICAgKi8KICAgICBWZWN0b3I8SW1hZ2VDb25zdW1lcj4gY29uc3VtZXJzID0gbmV3IFZlY3RvcjxJbWFnZUNvbnN1bWVyPigpOwogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHJlbmRlcmFibGUgaW1hZ2UgcHJvZHVjZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHJkYmxJbWFnZSB0aGUgcmRibCBpbWFnZQotICAgICAqIEBwYXJhbSByYyB0aGUgcmMKKyAgICAgKiBAcGFyYW0gcmRibEltYWdlCisgICAgICogICAgICAgICAgICB0aGUgcmRibCBpbWFnZS4KKyAgICAgKiBAcGFyYW0gcmMKKyAgICAgKiAgICAgICAgICAgIHRoZSByYy4KICAgICAgKi8KICAgICBwdWJsaWMgUmVuZGVyYWJsZUltYWdlUHJvZHVjZXIoUmVuZGVyYWJsZUltYWdlIHJkYmxJbWFnZSwgUmVuZGVyQ29udGV4dCByYykgewogICAgICAgICB0aGlzLnJibCA9IHJkYmxJbWFnZTsKQEAgLTU2LDcgKzY3LDggQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSByZW5kZXIgY29udGV4dC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmMgdGhlIG5ldyByZW5kZXIgY29udGV4dAorICAgICAqIEBwYXJhbSByYworICAgICAqICAgICAgICAgICAgdGhlIG5ldyByZW5kZXIgY29udGV4dC4KICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0UmVuZGVyQ29udGV4dChSZW5kZXJDb250ZXh0IHJjKSB7CiAgICAgICAgIHRoaXMucmMgPSByYzsKQEAgLTcyLDE2ICs4NCwxNyBAQAogICAgICAgICB0LnN0YXJ0KCk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgcmVxdWVzdFRvcERvd25MZWZ0UmlnaHRSZXNlbmQoSW1hZ2VDb25zdW1lciBpYykge30KKyAgICBwdWJsaWMgdm9pZCByZXF1ZXN0VG9wRG93bkxlZnRSaWdodFJlc2VuZChJbWFnZUNvbnN1bWVyIGljKSB7CisgICAgfQogCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUNvbnN1bWVyKEltYWdlQ29uc3VtZXIgaWMpIHsKLSAgICAgICAgaWYoaWMgIT0gbnVsbCkgeworICAgICAgICBpZiAoaWMgIT0gbnVsbCkgewogICAgICAgICAgICAgY29uc3VtZXJzLnJlbW92ZUVsZW1lbnQoaWMpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZENvbnN1bWVyKEltYWdlQ29uc3VtZXIgaWMpIHsKLSAgICAgICAgaWYoaWMgIT0gbnVsbCAmJiAhY29uc3VtZXJzLmNvbnRhaW5zKGljKSl7CisgICAgICAgIGlmIChpYyAhPSBudWxsICYmICFjb25zdW1lcnMuY29udGFpbnMoaWMpKSB7CiAgICAgICAgICAgICBjb25zdW1lcnMuYWRkRWxlbWVudChpYyk7CiAgICAgICAgIH0KICAgICB9CkBAIC05MCwxOSArMTAzLDE5IEBACiAgICAgICogQ3JlYXRlcyB0aGUgcmVuZGVyZWQgaW1hZ2UgaW4gYSBuZXcgdGhyZWFkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgaWYocmJsID09IG51bGwpIHsKKyAgICAgICAgaWYgKHJibCA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAogICAgICAgICBSZW5kZXJlZEltYWdlIHJkOwotICAgICAgICBpZihyYyAhPSBudWxsKSB7CisgICAgICAgIGlmIChyYyAhPSBudWxsKSB7CiAgICAgICAgICAgICByZCA9IHJibC5jcmVhdGVSZW5kZXJpbmcocmMpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmQgPSByYmwuY3JlYXRlRGVmYXVsdFJlbmRlcmluZygpOwogICAgICAgICB9CiAKICAgICAgICAgQ29sb3JNb2RlbCBjbSA9IHJkLmdldENvbG9yTW9kZWwoKTsKLSAgICAgICAgaWYoY20gPT0gbnVsbCkgeworICAgICAgICBpZiAoY20gPT0gbnVsbCkgewogICAgICAgICAgICAgY20gPSBDb2xvck1vZGVsLmdldFJHQmRlZmF1bHQoKTsKICAgICAgICAgfQogCkBAIC0xMTIsMTcgKzEyNSwxNSBAQAogCiAgICAgICAgIGZvciAoSW1hZ2VDb25zdW1lciBjIDogY29uc3VtZXJzKSB7CiAgICAgICAgICAgICBjLnNldERpbWVuc2lvbnModywgaCk7Ci0gICAgICAgICAgICBjLnNldEhpbnRzKEltYWdlQ29uc3VtZXIuVE9QRE9XTkxFRlRSSUdIVCB8Ci0gICAgICAgICAgICAgICAgICAgIEltYWdlQ29uc3VtZXIuQ09NUExFVEVTQ0FOTElORVMgfAotICAgICAgICAgICAgICAgICAgICBJbWFnZUNvbnN1bWVyLlNJTkdMRUZSQU1FIHwKLSAgICAgICAgICAgICAgICAgICAgSW1hZ2VDb25zdW1lci5TSU5HTEVQQVNTKTsKKyAgICAgICAgICAgIGMuc2V0SGludHMoSW1hZ2VDb25zdW1lci5UT1BET1dOTEVGVFJJR0hUIHwgSW1hZ2VDb25zdW1lci5DT01QTEVURVNDQU5MSU5FUworICAgICAgICAgICAgICAgICAgICB8IEltYWdlQ29uc3VtZXIuU0lOR0xFRlJBTUUgfCBJbWFnZUNvbnN1bWVyLlNJTkdMRVBBU1MpOwogICAgICAgICB9CiAKICAgICAgICAgaW50IHNjYW5MaW5lW10gPSBuZXcgaW50W3ddOwogICAgICAgICBpbnQgcGl4ZWxbXSA9IG51bGw7CiAKLSAgICAgICAgZm9yKGludCB5ID0gMDsgeSA8IGg7IHkrKyl7Ci0gICAgICAgICAgICBmb3IoaW50IHggPSAwOyB4IDwgdzsgeCsrKXsKKyAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgdzsgeCsrKSB7CiAgICAgICAgICAgICAgICAgcGl4ZWwgPSByLmdldFBpeGVsKHgsIHksIHBpeGVsKTsKICAgICAgICAgICAgICAgICBzY2FuTGluZVt4XSA9IGNtLmdldERhdGFFbGVtZW50KHBpeGVsLCAwKTsKICAgICAgICAgICAgIH0KQEAgLTEzOCw0ICsxNDksMyBAQAogICAgIH0KIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvcmVuZGVyYWJsZS9SZW5kZXJlZEltYWdlRmFjdG9yeS5qYXZhIGIvYXd0L2phdmEvYXd0L2ltYWdlL3JlbmRlcmFibGUvUmVuZGVyZWRJbWFnZUZhY3RvcnkuamF2YQppbmRleCAzNDVkODJjLi44ODFhNDBhIDEwMDY0NAotLS0gYS9hd3QvamF2YS9hd3QvaW1hZ2UvcmVuZGVyYWJsZS9SZW5kZXJlZEltYWdlRmFjdG9yeS5qYXZhCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9yZW5kZXJhYmxlL1JlbmRlcmVkSW1hZ2VGYWN0b3J5LmphdmEKQEAgLTE4LDI2ICsxOCwyOSBAQAogICogQGF1dGhvciBJZ29yIFYuIFN0b2x5YXJvdgogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCisKIHBhY2thZ2UgamF2YS5hd3QuaW1hZ2UucmVuZGVyYWJsZTsKIAogaW1wb3J0IGphdmEuYXd0LlJlbmRlcmluZ0hpbnRzOwogaW1wb3J0IGphdmEuYXd0LmltYWdlLlJlbmRlcmVkSW1hZ2U7CiAKIC8qKgotICogQSBmYWN0b3J5IGZvciBjcmVhdGluZyBSZW5kZXJlZEltYWdlIG9iamVjdHMgYmFzZWQgb24gcGFyYW1ldGVycwotICogYW5kIHJlbmRlcmluZyBoaW50cy4KKyAqIEEgZmFjdG9yeSBmb3IgY3JlYXRpbmcgUmVuZGVyZWRJbWFnZSBvYmplY3RzIGJhc2VkIG9uIHBhcmFtZXRlcnMgYW5kCisgKiByZW5kZXJpbmcgaGludHMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIFJlbmRlcmVkSW1hZ2VGYWN0b3J5IHsKIAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgdGhlIHJlbmRlcmVkIGltYWdlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBhMCB0aGUgUGFyYW1ldGVyQmxvY2sKLSAgICAgKiBAcGFyYW0gYTEgdGhlIFJlbmRlcmluZ0hpbnRzCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVuZGVyZWQgaW1hZ2UKKyAgICAgKiBAcGFyYW0gYTAKKyAgICAgKiAgICAgICAgICAgIHRoZSBQYXJhbWV0ZXJCbG9jay4KKyAgICAgKiBAcGFyYW0gYTEKKyAgICAgKiAgICAgICAgICAgIHRoZSBSZW5kZXJpbmdIaW50cy4KKyAgICAgKiBAcmV0dXJuIHRoZSByZW5kZXJlZCBpbWFnZS4KICAgICAgKi8KICAgICBwdWJsaWMgUmVuZGVyZWRJbWFnZSBjcmVhdGUoUGFyYW1ldGVyQmxvY2sgYTAsIFJlbmRlcmluZ0hpbnRzIGExKTsKIAogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YS9hd3QvaW1hZ2UvcmVuZGVyYWJsZS9wYWNrYWdlLmh0bWwgYi9hd3QvamF2YS9hd3QvaW1hZ2UvcmVuZGVyYWJsZS9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNhYWFiYwotLS0gL2Rldi9udWxsCisrKyBiL2F3dC9qYXZhL2F3dC9pbWFnZS9yZW5kZXJhYmxlL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDggQEAKKzxodG1sPgorICA8Ym9keT4KKyAgICA8cD4KKyAgICAgIFRoaXMgcGFja2FnZSBjb250YWlucyBjbGFzc2VzIHRvIGNyZWF0ZSBpbWFnZXMgd2hpY2ggYXJlIHJlbmRlcmluZy1pbmRlcGVuZGVudC4KKyAgICA8L3A+CisgICAgQHNpbmNlIEFuZHJvaWQgMS4wCisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2F3dC9wYWNrYWdlLmh0bWwgYi9hd3QvamF2YS9hd3QvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNmY5ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9hd3QvamF2YS9hd3QvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsOCBAQAorPGh0bWw+CisgIDxib2R5PgorICAgIDxwPgorICAgICAgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIGNsYXNzZXMgYW5kIGludGVyZmFjZXMgZm9yIGNyZWF0aW5nIChncmFwaGljYWwpIHVzZXIgaW50ZXJmYWNlcyAoR1VJKSwgcGFpbnRpbmcgMkQgZ3JhcGhpY3MgYW5kIGNyZWF0aW5nLCBtYW5pcHVsYXRpbmcgYW5kIGRyYXdpbmcgaW1hZ2VzLiAKKyAgICA8L3A+CisgIEBzaW5jZSBBbmRyb2lkIDEuMAorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9hd3QvamF2YS9iZWFucy9JbmRleGVkUHJvcGVydHlDaGFuZ2VFdmVudC5qYXZhIGIvYXd0L2phdmEvYmVhbnMvSW5kZXhlZFByb3BlcnR5Q2hhbmdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkwODRjNi4uMDAwMDAwMAotLS0gYS9hd3QvamF2YS9iZWFucy9JbmRleGVkUHJvcGVydHlDaGFuZ2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCi0gKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLSAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCi0gKiB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGphdmEuYmVhbnM7Ci0KLS8qKgotICogQSB0eXBlIG9mIHtAbGluayBQcm9wZXJ0eUNoYW5nZUV2ZW50fSB0aGF0IGluZGljYXRlcyB0aGF0IGFuIGluZGV4ZWQgcHJvcGVydHkKLSAqIGhhcyBjaGFuZ2VkLgotICogCi0gKiBAc2luY2UgMS41Ci0gKi8KLXB1YmxpYyBjbGFzcyBJbmRleGVkUHJvcGVydHlDaGFuZ2VFdmVudCBleHRlbmRzIFByb3BlcnR5Q2hhbmdlRXZlbnQgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTMyMDIyNzQ0ODQ5NTgwNjg3MEw7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGludCBpbmRleDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgcHJvcGVydHkgY2hhbmdlZCBldmVudCB3aXRoIGFuIGluZGljYXRpb24gb2YgdGhlIHByb3BlcnR5Ci0gICAgICogaW5kZXguCi0gICAgICogCi0gICAgICogQHBhcmFtIHNvdXJjZQotICAgICAqICAgICAgICAgICAgdGhlIGNoYW5nZWQgYmVhbi4KLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0gICAgICogICAgICAgICAgICB0aGUgY2hhbmdlZCBwcm9wZXJ0eSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gaW5kaWNhdGUgYW4KLSAgICAgKiAgICAgICAgICAgIHVuc3BlY2lmaWVkIHNldCBvZiB0aGUgcHJvcGVydGllcyBoYXZlIGNoYW5nZWQuCi0gICAgICogQHBhcmFtIG9sZFZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgcHJldmlvdXMgdmFsdWUgb2YgdGhlIHByb3BlcnR5LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotICAgICAqICAgICAgICAgICAgdGhlIDxjb2RlPnByb3BlcnR5TmFtZTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgdGhlCi0gICAgICogICAgICAgICAgICBwcmV2aW91cyB2YWx1ZSBpcyB1bmtub3duLgotICAgICAqIEBwYXJhbSBuZXdWYWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgcHJvcGVydHksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQotICAgICAqICAgICAgICAgICAgPGNvZGU+cHJvcGVydHlOYW1lPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPiBvciB0aGUgbmV3Ci0gICAgICogICAgICAgICAgICB2YWx1ZSBpcyB1bmtub3duLi4KLSAgICAgKiBAcGFyYW0gaW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgcHJvcGVydHkuCi0gICAgICovCi0gICAgcHVibGljIEluZGV4ZWRQcm9wZXJ0eUNoYW5nZUV2ZW50KE9iamVjdCBzb3VyY2UsIFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IGluZGV4KSB7Ci0gICAgICAgIHN1cGVyKHNvdXJjZSwgcHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQW5zd2VyIHRoZSBpbmRleCBvZiB0aGUgcHJvcGVydHkgdGhhdCB3YXMgY2hhbmdlZCBpbiB0aGlzIGV2ZW50LgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIHByb3BlcnR5IGVsZW1lbnQgaW5kZXguCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRJbmRleCgpIHsKLSAgICAgICAgcmV0dXJuIGluZGV4OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2JlYW5zL1Byb3BlcnR5Q2hhbmdlRXZlbnQuamF2YSBiL2F3dC9qYXZhL2JlYW5zL1Byb3BlcnR5Q2hhbmdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdjNzAzYS4uMDAwMDAwMAotLS0gYS9hd3QvamF2YS9iZWFucy9Qcm9wZXJ0eUNoYW5nZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGphdmEuYmVhbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci0KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUNoYW5nZUV2ZW50IGV4dGVuZHMgRXZlbnRPYmplY3QgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNzA0MjY5MzY4ODkzOTY0ODEyM0w7Ci0KLSAgICBTdHJpbmcgcHJvcGVydHlOYW1lOwotCi0gICAgT2JqZWN0IG9sZFZhbHVlOwotCi0gICAgT2JqZWN0IG5ld1ZhbHVlOwotCi0gICAgT2JqZWN0IHByb3BhZ2F0aW9uSWQ7Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlDaGFuZ2VFdmVudChPYmplY3Qgc291cmNlLCBTdHJpbmcgcHJvcGVydHlOYW1lLAotICAgICAgICAgICAgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLSAgICAgICAgc3VwZXIoc291cmNlKTsKLQotICAgICAgICB0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKLSAgICAgICAgdGhpcy5vbGRWYWx1ZSA9IG9sZFZhbHVlOwotICAgICAgICB0aGlzLm5ld1ZhbHVlID0gbmV3VmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0eU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGFnYXRpb25JZChPYmplY3QgcHJvcGFnYXRpb25JZCkgewotICAgICAgICB0aGlzLnByb3BhZ2F0aW9uSWQgPSBwcm9wYWdhdGlvbklkOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGFnYXRpb25JZCgpIHsKLSAgICAgICAgcmV0dXJuIHByb3BhZ2F0aW9uSWQ7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRPbGRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIG9sZFZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0TmV3VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiBuZXdWYWx1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9hd3QvamF2YS9iZWFucy9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLmphdmEgYi9hd3QvamF2YS9iZWFucy9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NDIyYzAuLjAwMDAwMDAKLS0tIGEvYXd0L2phdmEvYmVhbnMvUHJvcGVydHlDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBqYXZhLmJlYW5zOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCk7Ci19CmRpZmYgLS1naXQgYS9hd3QvamF2YS9iZWFucy9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyUHJveHkuamF2YSBiL2F3dC9qYXZhL2JlYW5zL1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGYzYWVjLi4wMDAwMDAwCi0tLSBhL2F3dC9qYXZhL2JlYW5zL1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBqYXZhLmJlYW5zOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXJQcm94eTsKLQotcHVibGljIGNsYXNzIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJQcm94eSBleHRlbmRzIEV2ZW50TGlzdGVuZXJQcm94eSBpbXBsZW1lbnRzCi0gICAgICAgIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCi0gICAgU3RyaW5nIHByb3BlcnR5TmFtZTsKLQotICAgIHB1YmxpYyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyUHJveHkoU3RyaW5nIHByb3BlcnR5TmFtZSwKLSAgICAgICAgICAgIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgc3VwZXIobGlzdGVuZXIpOwotICAgICAgICB0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSAoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikgZ2V0TGlzdGVuZXIoKTsKLSAgICAgICAgbGlzdGVuZXIucHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2F3dC9qYXZhL2JlYW5zL1Byb3BlcnR5Q2hhbmdlU3VwcG9ydC5qYXZhIGIvYXd0L2phdmEvYmVhbnMvUHJvcGVydHlDaGFuZ2VTdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NmU2M2EuLjAwMDAwMDAKLS0tIGEvYXd0L2phdmEvYmVhbnMvUHJvcGVydHlDaGFuZ2VTdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBqYXZhLmJlYW5zOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGNsYXNzIFByb3BlcnR5Q2hhbmdlU3VwcG9ydCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2NDAxMjUzNzczNzc5OTUxODAzbDsKLQotICAgIHByaXZhdGUgdHJhbnNpZW50IE9iamVjdCBzb3VyY2VCZWFuOwotCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgTGlzdDxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBhbGxQcm9wZXJ0aWVzQ2hhbmdlTGlzdGVuZXJzID0KLSAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4oKTsKLQotICAgIHByaXZhdGUgdHJhbnNpZW50IE1hcDxTdHJpbmcsIExpc3Q8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4+Ci0gICAgICAgICAgICBzZWxlY3RlZFByb3BlcnRpZXNDaGFuZ2VMaXN0ZW5lcnMgPQotICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+PigpOwotCi0gICAgLy8gZmllbGRzIGZvciBzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkKLSAgICBwcml2YXRlIEhhc2h0YWJsZTxTdHJpbmcsIExpc3Q8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4+IGNoaWxkcmVuOwotCi0gICAgcHJpdmF0ZSBPYmplY3Qgc291cmNlOwotCi0gICAgcHJpdmF0ZSBpbnQgcHJvcGVydHlDaGFuZ2VTdXBwb3J0U2VyaWFsaXplZERhdGFWZXJzaW9uID0gMTsKLQotICAgIHB1YmxpYyBQcm9wZXJ0eUNoYW5nZVN1cHBvcnQoT2JqZWN0IHNvdXJjZUJlYW4pIHsKLSAgICAgICAgaWYgKHNvdXJjZUJlYW4gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5zb3VyY2VCZWFuID0gc291cmNlQmVhbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2UoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG9sZFZhbHVlLAotICAgICAgICAgICAgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0gICAgICAgIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQgPSBjcmVhdGVQcm9wZXJ0eUNoYW5nZUV2ZW50KHByb3BlcnR5TmFtZSwKLSAgICAgICAgICAgICAgICBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotICAgICAgICBkb0ZpcmVQcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmlyZUluZGV4ZWRQcm9wZXJ0eUNoYW5nZShTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgaW5kZXgsCi0gICAgICAgICAgICBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCi0gICAgICAgIC8vIG51bGxzIGFuZCBlcXVhbHMgY2hlY2sgZG9uZSBpbiBkb0ZpcmUuLi4KLSAgICAgICAgZG9GaXJlUHJvcGVydHlDaGFuZ2UobmV3IEluZGV4ZWRQcm9wZXJ0eUNoYW5nZUV2ZW50KHNvdXJjZUJlYW4sCi0gICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIGluZGV4KSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwKLSAgICAgICAgICAgIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgaWYgKChwcm9wZXJ0eU5hbWUgIT0gbnVsbCkgJiYgKGxpc3RlbmVyICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUHJvcGVydGllc0NoYW5nZUxpc3RlbmVycy5nZXQocHJvcGVydHlOYW1lKTsKLQotICAgICAgICAgICAgaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgcHJvcGVydHlOYW1lLAotICAgICAgICAgICAgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBpZiAoKGxpc3RlbmVyICE9IG51bGwpICYmIChwcm9wZXJ0eU5hbWUgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIExpc3Q8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0KLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRQcm9wZXJ0aWVzQ2hhbmdlTGlzdGVuZXJzLmdldChwcm9wZXJ0eU5hbWUpOwotCi0gICAgICAgICAgICBpZiAobGlzdGVuZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+KCk7Ci0gICAgICAgICAgICAgICAgc2VsZWN0ZWRQcm9wZXJ0aWVzQ2hhbmdlTGlzdGVuZXJzLnB1dChwcm9wZXJ0eU5hbWUsIGxpc3RlbmVycyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFJJIGNvbXBhdGliaWxpdHkKLSAgICAgICAgICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJQcm94eSkgewotICAgICAgICAgICAgICAgIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJQcm94eSBwcm94eSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lclByb3h5KSBsaXN0ZW5lcjsKLQotICAgICAgICAgICAgICAgIGxpc3RlbmVycy5hZGQobmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJQcm94eSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5LmdldFByb3BlcnR5TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpIHByb3h5LmdldExpc3RlbmVyKCkpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJbXSBnZXRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycygKLSAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLSAgICAgICAgTGlzdDxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSBudWxsOwotCi0gICAgICAgIGlmIChwcm9wZXJ0eU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgbGlzdGVuZXJzID0gc2VsZWN0ZWRQcm9wZXJ0aWVzQ2hhbmdlTGlzdGVuZXJzLmdldChwcm9wZXJ0eU5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChsaXN0ZW5lcnMgPT0gbnVsbCkgPyBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcltdIHt9Ci0gICAgICAgICAgICAgICAgOiBsaXN0ZW5lcnMudG9BcnJheSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyW2xpc3RlbmVycy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2UoU3RyaW5nIHByb3BlcnR5TmFtZSwgYm9vbGVhbiBvbGRWYWx1ZSwKLSAgICAgICAgICAgIGJvb2xlYW4gbmV3VmFsdWUpIHsKLSAgICAgICAgUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCA9IGNyZWF0ZVByb3BlcnR5Q2hhbmdlRXZlbnQocHJvcGVydHlOYW1lLAotICAgICAgICAgICAgICAgIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0gICAgICAgIGRvRmlyZVByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmaXJlSW5kZXhlZFByb3BlcnR5Q2hhbmdlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBpbmRleCwKLSAgICAgICAgICAgIGJvb2xlYW4gb2xkVmFsdWUsIGJvb2xlYW4gbmV3VmFsdWUpIHsKLQotICAgICAgICBpZiAob2xkVmFsdWUgIT0gbmV3VmFsdWUpIHsKLSAgICAgICAgICAgIGZpcmVJbmRleGVkUHJvcGVydHlDaGFuZ2UocHJvcGVydHlOYW1lLCBpbmRleCwgQm9vbGVhbgotICAgICAgICAgICAgICAgICAgICAudmFsdWVPZihvbGRWYWx1ZSksIEJvb2xlYW4udmFsdWVPZihuZXdWYWx1ZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBvbGRWYWx1ZSwKLSAgICAgICAgICAgIGludCBuZXdWYWx1ZSkgewotICAgICAgICBQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50ID0gY3JlYXRlUHJvcGVydHlDaGFuZ2VFdmVudChwcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICAgICAgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLSAgICAgICAgZG9GaXJlUHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZpcmVJbmRleGVkUHJvcGVydHlDaGFuZ2UoU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IGluZGV4LAotICAgICAgICAgICAgaW50IG9sZFZhbHVlLCBpbnQgbmV3VmFsdWUpIHsKLQotICAgICAgICBpZiAob2xkVmFsdWUgIT0gbmV3VmFsdWUpIHsKLSAgICAgICAgICAgIGZpcmVJbmRleGVkUHJvcGVydHlDaGFuZ2UocHJvcGVydHlOYW1lLCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIob2xkVmFsdWUpLCBuZXcgSW50ZWdlcihuZXdWYWx1ZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGhhc0xpc3RlbmVycyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gYWxsUHJvcGVydGllc0NoYW5nZUxpc3RlbmVycy5zaXplKCkgPiAwOwotICAgICAgICBpZiAoIXJlc3VsdCAmJiAocHJvcGVydHlOYW1lICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUHJvcGVydGllc0NoYW5nZUxpc3RlbmVycy5nZXQocHJvcGVydHlOYW1lKTsKLSAgICAgICAgICAgIGlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGxpc3RlbmVycy5zaXplKCkgPiAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0gICAgICAgICAgICBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyUHJveHkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9ICgoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lclByb3h5KSBsaXN0ZW5lcikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eU5hbWUoKTsKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxzdCA9IChQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKQotICAgICAgICAgICAgICAgICAgICAgICAgKChQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyUHJveHkpIGxpc3RlbmVyKS5nZXRMaXN0ZW5lcigpOwotCi0gICAgICAgICAgICAgICAgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihuYW1lLCBsc3QpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhbGxQcm9wZXJ0aWVzQ2hhbmdlTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLSAgICAgICAgICAgIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJQcm94eSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKChQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyUHJveHkpIGxpc3RlbmVyKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5TmFtZSgpOwotICAgICAgICAgICAgICAgIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbHN0ID0gKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAoKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJQcm94eSkgbGlzdGVuZXIpLmdldExpc3RlbmVyKCk7Ci0gICAgICAgICAgICAgICAgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihuYW1lLCBsc3QpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhbGxQcm9wZXJ0aWVzQ2hhbmdlTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJbXSBnZXRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycygpIHsKLSAgICAgICAgQXJyYXlMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IHJlc3VsdCA9Ci0gICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPigKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsbFByb3BlcnRpZXNDaGFuZ2VMaXN0ZW5lcnMpOwotCi0gICAgICAgIGZvciAoU3RyaW5nIHByb3BlcnR5TmFtZSA6IHNlbGVjdGVkUHJvcGVydGllc0NoYW5nZUxpc3RlbmVycy5rZXlTZXQoKSkgewotICAgICAgICAgICAgTGlzdDxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBzZWxlY3RlZExpc3RlbmVycyA9Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUHJvcGVydGllc0NoYW5nZUxpc3RlbmVycy5nZXQocHJvcGVydHlOYW1lKTsKLQotICAgICAgICAgICAgaWYgKHNlbGVjdGVkTGlzdGVuZXJzICE9IG51bGwpIHsKLQotICAgICAgICAgICAgICAgIGZvciAoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IHNlbGVjdGVkTGlzdGVuZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQobmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJQcm94eShwcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0LnRvQXJyYXkobmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJbcmVzdWx0LnNpemUoKV0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gb29zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IGFsbFNlcmlhbGl6ZWRQcm9wZXJ0aWVzQ2hhbmdlTGlzdGVuZXJzID0KLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+KCk7Ci0KLSAgICAgICAgZm9yIChQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHBjbCA6IGFsbFByb3BlcnRpZXNDaGFuZ2VMaXN0ZW5lcnMpIHsKLSAgICAgICAgICAgIGlmIChwY2wgaW5zdGFuY2VvZiBTZXJpYWxpemFibGUpIHsKLSAgICAgICAgICAgICAgICBhbGxTZXJpYWxpemVkUHJvcGVydGllc0NoYW5nZUxpc3RlbmVycy5hZGQocGNsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4+Ci0gICAgICAgICAgICAgICAgc2VsZWN0ZWRTZXJpYWxpemVkUHJvcGVydGllc0NoYW5nZUxpc3RlbmVycyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4+KCk7Ci0KLSAgICAgICAgZm9yIChTdHJpbmcgcHJvcGVydHlOYW1lIDogc2VsZWN0ZWRQcm9wZXJ0aWVzQ2hhbmdlTGlzdGVuZXJzLmtleVNldCgpKSB7Ci0gICAgICAgICAgICBMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IGtleVZhbHVlcyA9Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUHJvcGVydGllc0NoYW5nZUxpc3RlbmVycy5nZXQocHJvcGVydHlOYW1lKTsKLQotICAgICAgICAgICAgaWYgKGtleVZhbHVlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTGlzdDxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBzZXJpYWxpemVkUHJvcGVydGllc0NoYW5nZUxpc3RlbmVycwotICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+KCk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcGNsIDoga2V5VmFsdWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwY2wgaW5zdGFuY2VvZiBTZXJpYWxpemFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRQcm9wZXJ0aWVzQ2hhbmdlTGlzdGVuZXJzLmFkZChwY2wpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCFzZXJpYWxpemVkUHJvcGVydGllc0NoYW5nZUxpc3RlbmVycy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRTZXJpYWxpemVkUHJvcGVydGllc0NoYW5nZUxpc3RlbmVycy5wdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lLCBzZXJpYWxpemVkUHJvcGVydGllc0NoYW5nZUxpc3RlbmVycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY2hpbGRyZW4gPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgTGlzdDxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPj4oCi0gICAgICAgICAgICAgICAgc2VsZWN0ZWRTZXJpYWxpemVkUHJvcGVydGllc0NoYW5nZUxpc3RlbmVycyk7Ci0gICAgICAgIGNoaWxkcmVuLnB1dCgiIiwgYWxsU2VyaWFsaXplZFByb3BlcnRpZXNDaGFuZ2VMaXN0ZW5lcnMpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIG9vcy53cml0ZU9iamVjdChjaGlsZHJlbik7Ci0KLSAgICAgICAgT2JqZWN0IHNvdXJjZSA9IG51bGw7Ci0gICAgICAgIGlmIChzb3VyY2VCZWFuIGluc3RhbmNlb2YgU2VyaWFsaXphYmxlKSB7Ci0gICAgICAgICAgICBzb3VyY2UgPSBzb3VyY2VCZWFuOwotICAgICAgICB9Ci0gICAgICAgIG9vcy53cml0ZU9iamVjdChzb3VyY2UpOwotCi0gICAgICAgIG9vcy53cml0ZUludChwcm9wZXJ0eUNoYW5nZVN1cHBvcnRTZXJpYWxpemVkRGF0YVZlcnNpb24pOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIG9pcykgdGhyb3dzIElPRXhjZXB0aW9uLAotICAgICAgICAgICAgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNoaWxkcmVuID0gKEhhc2h0YWJsZTxTdHJpbmcsIExpc3Q8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4+KSBvaXMKLSAgICAgICAgICAgICAgICAucmVhZE9iamVjdCgpOwotCi0gICAgICAgIHNlbGVjdGVkUHJvcGVydGllc0NoYW5nZUxpc3RlbmVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPj4oCi0gICAgICAgICAgICAgICAgY2hpbGRyZW4pOwotICAgICAgICBhbGxQcm9wZXJ0aWVzQ2hhbmdlTGlzdGVuZXJzID0gc2VsZWN0ZWRQcm9wZXJ0aWVzQ2hhbmdlTGlzdGVuZXJzCi0gICAgICAgICAgICAgICAgLnJlbW92ZSgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKGFsbFByb3BlcnRpZXNDaGFuZ2VMaXN0ZW5lcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgYWxsUHJvcGVydGllc0NoYW5nZUxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNvdXJjZUJlYW4gPSBvaXMucmVhZE9iamVjdCgpOwotICAgICAgICBwcm9wZXJ0eUNoYW5nZVN1cHBvcnRTZXJpYWxpemVkRGF0YVZlcnNpb24gPSBvaXMucmVhZEludCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGRvRmlyZVByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFByb3BlcnR5Q2hhbmdlRXZlbnQgY3JlYXRlUHJvcGVydHlDaGFuZ2VFdmVudChTdHJpbmcgcHJvcGVydHlOYW1lLAotICAgICAgICAgICAgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KHNvdXJjZUJlYW4sIHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsCi0gICAgICAgICAgICAgICAgbmV3VmFsdWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgUHJvcGVydHlDaGFuZ2VFdmVudCBjcmVhdGVQcm9wZXJ0eUNoYW5nZUV2ZW50KFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICBib29sZWFuIG9sZFZhbHVlLCBib29sZWFuIG5ld1ZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudChzb3VyY2VCZWFuLCBwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLAotICAgICAgICAgICAgICAgIG5ld1ZhbHVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFByb3BlcnR5Q2hhbmdlRXZlbnQgY3JlYXRlUHJvcGVydHlDaGFuZ2VFdmVudChTdHJpbmcgcHJvcGVydHlOYW1lLAotICAgICAgICAgICAgaW50IG9sZFZhbHVlLCBpbnQgbmV3VmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KHNvdXJjZUJlYW4sIHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsCi0gICAgICAgICAgICAgICAgbmV3VmFsdWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkb0ZpcmVQcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKTsKLSAgICAgICAgT2JqZWN0IG9sZFZhbHVlID0gZXZlbnQuZ2V0T2xkVmFsdWUoKTsKLSAgICAgICAgT2JqZWN0IG5ld1ZhbHVlID0gZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQotICAgICAgICBpZiAoKG5ld1ZhbHVlICE9IG51bGwpICYmIChvbGRWYWx1ZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICYmIG5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIENvcHkgdGhlIGxpc3RlbmVycyBjb2xsZWN0aW9ucyBzbyB0aGV5IGNhbiBiZSBtb2RpZmllZCB3aGlsZSB3ZSBmaXJlCi0gICAgICAgICAqIGV2ZW50cy4KLSAgICAgICAgICovCi0KLSAgICAgICAgLy8gTGlzdGVuZXJzIHRvIGFsbCBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzCi0gICAgICAgIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJbXSBsaXN0ZW5zVG9BbGw7Ci0gICAgICAgIC8vIExpc3RlbnMgdG8gYSBnaXZlbiBwcm9wZXJ0eSBjaGFuZ2UKLSAgICAgICAgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcltdIGxpc3RlbnNUb09uZSA9IG51bGw7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgbGlzdGVuc1RvQWxsID0gYWxsUHJvcGVydGllc0NoYW5nZUxpc3RlbmVycwotICAgICAgICAgICAgICAgICAgICAudG9BcnJheShuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lclthbGxQcm9wZXJ0aWVzQ2hhbmdlTGlzdGVuZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNpemUoKV0pOwotCi0gICAgICAgICAgICBMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHNlbGVjdGVkUHJvcGVydGllc0NoYW5nZUxpc3RlbmVycwotICAgICAgICAgICAgICAgICAgICAuZ2V0KHByb3BlcnR5TmFtZSk7Ci0gICAgICAgICAgICBpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsaXN0ZW5zVG9PbmUgPSBsaXN0ZW5lcnMKLSAgICAgICAgICAgICAgICAgICAgICAgIC50b0FycmF5KG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyW2xpc3RlbmVycy5zaXplKCldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEZpcmUgdGhlIGxpc3RlbmVycwotICAgICAgICBmb3IgKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5zVG9BbGwpIHsKLSAgICAgICAgICAgIGxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKLSAgICAgICAgfQotICAgICAgICBpZiAobGlzdGVuc1RvT25lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbnNUb09uZSkgewotICAgICAgICAgICAgICAgIGxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYXd0L2phdmF4L2ltYWdlaW8vSUlPRXhjZXB0aW9uLmphdmEgYi9hd3QvamF2YXgvaW1hZ2Vpby9JSU9FeGNlcHRpb24uamF2YQppbmRleCBmYmZlYjQyLi5jNzc3MTZjIDEwMDY0NAotLS0gYS9hd3QvamF2YXgvaW1hZ2Vpby9JSU9FeGNlcHRpb24uamF2YQorKysgYi9hd3QvamF2YXgvaW1hZ2Vpby9JSU9FeGNlcHRpb24uamF2YQpAQCAtMTgsMjIgKzE4LDI4IEBACiAgKiBAYXV0aG9yIFJ1c3RlbSBWLiBSYWZpa292CiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMyAkCiAgKi8KKwogcGFja2FnZSBqYXZheC5pbWFnZWlvOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAogLyoqCiAgKiBUaGUgSUlPRXhjZXB0aW9uIGNsYXNzIGluZGljYXRlcyBlcnJvcnMgaW4gcmVhZGluZy93cml0aW5nIG9wZXJhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSUlPRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24gewogCi0gICAgLyoqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBzZXJpYWxWZXJzaW9uVUlELgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zMjE2MjEwNzE4NjM4OTg1MjUxTDsKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJSU9FeGNlcHRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGRldGFpbGVkIG1lc3NhZ2UuCisgICAgICogQHBhcmFtIG1lc3NhZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWxlZCBtZXNzYWdlLgogICAgICAqLwogICAgIHB1YmxpYyBJSU9FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKICAgICAgICAgc3VwZXIobWVzc2FnZSk7CkBAIC00Miw4ICs0OCwxMCBAQAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJSU9FeGNlcHRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGRldGFpbGVkIG1lc3NhZ2UuCi0gICAgICogQHBhcmFtIGNhdXNlIHRoZSBjYXVzZSBvZiB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAcGFyYW0gbWVzc2FnZQorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbGVkIG1lc3NhZ2UuCisgICAgICogQHBhcmFtIGNhdXNlCisgICAgICogICAgICAgICAgICB0aGUgY2F1c2Ugb2YgdGhpcyBleGNlcHRpb24uCiAgICAgICovCiAgICAgcHVibGljIElJT0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7CiAgICAgICAgIHN1cGVyKG1lc3NhZ2UpOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmF4L2ltYWdlaW8vSUlPSW1hZ2UuamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL0lJT0ltYWdlLmphdmEKaW5kZXggZTE3YTlmYy4uZTllNTEzMCAxMDA2NDQKLS0tIGEvYXd0L2phdmF4L2ltYWdlaW8vSUlPSW1hZ2UuamF2YQorKysgYi9hd3QvamF2YXgvaW1hZ2Vpby9JSU9JbWFnZS5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIFJ1c3RlbSBWLiBSYWZpa292CiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMyAkCiAgKi8KKwogcGFja2FnZSBqYXZheC5pbWFnZWlvOwogCiBpbXBvcnQgamF2YXguaW1hZ2Vpby5tZXRhZGF0YS5JSU9NZXRhZGF0YTsKQEAgLTI3LDMzICsyOCw0NyBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiAvKioKLSAqIFRoZSBJSU9JbWFnZSBjbGFzcyBjb21iaW5lcyB0aGUgaW1hZ2UsIGltYWdlJ3MgdGh1bWJuYWlsIGFuZCBpbWFnZSdzIG1ldGFkYXRhLgotICogVGhlIGltYWdlIGNhbiBiZSBwcmVzZW50ZWQgYXMgUmVuZGVyZWRJbWFnZSBvciBSYXN0ZXIgb2JqZWN0LgorICogVGhlIElJT0ltYWdlIGNsYXNzIGNvbWJpbmVzIHRoZSBpbWFnZSwgaW1hZ2UncyB0aHVtYm5haWwgYW5kIGltYWdlJ3MKKyAqIG1ldGFkYXRhLiBUaGUgaW1hZ2UgY2FuIGJlIHByZXNlbnRlZCBhcyBSZW5kZXJlZEltYWdlIG9yIFJhc3RlciBvYmplY3QuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSUlPSW1hZ2UgewogCi0gICAgLyoqIFRoZSBpbWFnZSBvZiB0aGlzIElJT0ltYWdlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBpbWFnZSBvZiB0aGlzIElJT0ltYWdlLgorICAgICAqLwogICAgIHByb3RlY3RlZCBSZW5kZXJlZEltYWdlIGltYWdlOwotICAgIAotICAgIC8qKiBUaGUgcmFzdGVyIG9mIHRoaXMgSUlPSW1hZ2UuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmFzdGVyIG9mIHRoaXMgSUlPSW1hZ2UuCisgICAgICovCiAgICAgcHJvdGVjdGVkIFJhc3RlciByYXN0ZXI7Ci0gICAgCi0gICAgLyoqIFRoZSBsaXN0IHdpdGggdGh1bWJuYWlscyBhc3NvY2lhdGVkIHdpdGggdGhlIGltYWdlLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGxpc3Qgd2l0aCB0aHVtYm5haWxzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW1hZ2UuCisgICAgICovCiAgICAgcHJvdGVjdGVkIExpc3Q8PyBleHRlbmRzIEJ1ZmZlcmVkSW1hZ2U+IHRodW1ibmFpbHM7Ci0gICAgCi0gICAgLyoqIFRoZSBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGltYWdlLiAqLworCisgICAgLyoqCisgICAgICogVGhlIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW1hZ2UuCisgICAgICovCiAgICAgcHJvdGVjdGVkIElJT01ldGFkYXRhIG1ldGFkYXRhOwogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IElJT0ltYWdlIHdpdGggdGhlIHNwZWNpZmllZCBSZW5kZXJlZEltYWdlLCAKLSAgICAgKiBsaXN0IG9mIHRodW1ibmFpbHMgYW5kIG1ldGFkYXRhLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJSU9JbWFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgUmVuZGVyZWRJbWFnZSwgbGlzdCBvZgorICAgICAqIHRodW1ibmFpbHMgYW5kIG1ldGFkYXRhLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZSB0aGUgaW1hZ2Ugc3BlY2lmaWVkIGJ5IFJlbmRlcmVkSW1hZ2UuCi0gICAgICogQHBhcmFtIHRodW1ibmFpbHMgdGhlIGxpc3Qgb2YgQnVmZmVyZWRJbWFnZSBvYmplY3RzIHdoaWNoIAotICAgICAqIHJlcHJlc2VudCB0aGUgdGh1bWJuYWlscyBvZiB0aGUgaW1hZ2UuCi0gICAgICogQHBhcmFtIG1ldGFkYXRhIHRoZSBtZXRhZGF0YSBvZiB0aGUgaW1hZ2UuCisgICAgICogQHBhcmFtIGltYWdlCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2Ugc3BlY2lmaWVkIGJ5IFJlbmRlcmVkSW1hZ2UuCisgICAgICogQHBhcmFtIHRodW1ibmFpbHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBsaXN0IG9mIEJ1ZmZlcmVkSW1hZ2Ugb2JqZWN0cyB3aGljaCByZXByZXNlbnQgdGhlCisgICAgICogICAgICAgICAgICB0aHVtYm5haWxzIG9mIHRoZSBpbWFnZS4KKyAgICAgKiBAcGFyYW0gbWV0YWRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBtZXRhZGF0YSBvZiB0aGUgaW1hZ2UuCiAgICAgICovCi0gICAgcHVibGljIElJT0ltYWdlKFJlbmRlcmVkSW1hZ2UgaW1hZ2UsIExpc3Q8PyBleHRlbmRzIEJ1ZmZlcmVkSW1hZ2U+IHRodW1ibmFpbHMsIElJT01ldGFkYXRhIG1ldGFkYXRhKSB7CisgICAgcHVibGljIElJT0ltYWdlKFJlbmRlcmVkSW1hZ2UgaW1hZ2UsIExpc3Q8PyBleHRlbmRzIEJ1ZmZlcmVkSW1hZ2U+IHRodW1ibmFpbHMsCisgICAgICAgICAgICBJSU9NZXRhZGF0YSBtZXRhZGF0YSkgewogICAgICAgICBpZiAoaW1hZ2UgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW1hZ2Ugc2hvdWxkIG5vdCBiZSBOVUxMIik7CiAgICAgICAgIH0KQEAgLTY0LDEzICs3OSwxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJSU9JbWFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgUmFzdGVyLCBsaXN0IG9mCi0gICAgICogdGh1bWJuYWlscyBhbmQgbWV0YWRhdGEuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IElJT0ltYWdlIHdpdGggdGhlIHNwZWNpZmllZCBSYXN0ZXIsIGxpc3Qgb2YgdGh1bWJuYWlscworICAgICAqIGFuZCBtZXRhZGF0YS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmFzdGVyIHRoZSBSYXN0ZXIuCi0gICAgICogQHBhcmFtIHRodW1ibmFpbHMgdGhlIGxpc3Qgb2YgQnVmZmVyZWRJbWFnZSBvYmplY3RzIHdoaWNoIAotICAgICAqIHJlcHJlc2VudCB0aGUgdGh1bWJuYWlscyBvZiBSYXN0ZXIgZGF0YS4KLSAgICAgKiBAcGFyYW0gbWV0YWRhdGEgdGhlIG1ldGFkYXRhLgorICAgICAqIEBwYXJhbSByYXN0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBSYXN0ZXIuCisgICAgICogQHBhcmFtIHRodW1ibmFpbHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBsaXN0IG9mIEJ1ZmZlcmVkSW1hZ2Ugb2JqZWN0cyB3aGljaCByZXByZXNlbnQgdGhlCisgICAgICogICAgICAgICAgICB0aHVtYm5haWxzIG9mIFJhc3RlciBkYXRhLgorICAgICAqIEBwYXJhbSBtZXRhZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIG1ldGFkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyBJSU9JbWFnZShSYXN0ZXIgcmFzdGVyLCBMaXN0PD8gZXh0ZW5kcyBCdWZmZXJlZEltYWdlPiB0aHVtYm5haWxzLCBJSU9NZXRhZGF0YSBtZXRhZGF0YSkgewogICAgICAgICBpZiAocmFzdGVyID09IG51bGwpIHsKQEAgLTgzLDExICsxMDEsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBSZW5kZXJlZEltYWdlIG9iamVjdCBvciByZXR1cm5zIG51bGwgaWYgdGhpcyBJSU9JbWFnZSAKLSAgICAgKiBvYmplY3QgaXMgYXNzb2NpYXRlZCB3aXRoIGEgUmFzdGVyLgorICAgICAqIEdldHMgdGhlIFJlbmRlcmVkSW1hZ2Ugb2JqZWN0IG9yIHJldHVybnMgbnVsbCBpZiB0aGlzIElJT0ltYWdlIG9iamVjdCBpcworICAgICAqIGFzc29jaWF0ZWQgd2l0aCBhIFJhc3Rlci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBSZW5kZXJlZEltYWdlIG9iamVjdCBvciBudWxsIGlmIHRoaXMgSUlPSW1hZ2UgCi0gICAgICogb2JqZWN0IGlzIGFzc29jaWF0ZWQgd2l0aCBhIFJhc3Rlci4KKyAgICAgKiBAcmV0dXJuIHRoZSBSZW5kZXJlZEltYWdlIG9iamVjdCBvciBudWxsIGlmIHRoaXMgSUlPSW1hZ2Ugb2JqZWN0IGlzCisgICAgICogICAgICAgICBhc3NvY2lhdGVkIHdpdGggYSBSYXN0ZXIuCiAgICAgICovCiAgICAgcHVibGljIFJlbmRlcmVkSW1hZ2UgZ2V0UmVuZGVyZWRJbWFnZSgpIHsKICAgICAgICAgcmV0dXJuIGltYWdlOwpAQCAtOTYsNyArMTE0LDggQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBSZW5kZXJlZEltYWdlIHRvIHRoaXMgSUlPSW1hZ2Ugb2JqZWN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZSB0aGUgUmVuZGVyZWRJbWFnZSB0byBiZSBzZXQgdG8gdGhpcyBJSU9JbWFnZS4KKyAgICAgKiBAcGFyYW0gaW1hZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBSZW5kZXJlZEltYWdlIHRvIGJlIHNldCB0byB0aGlzIElJT0ltYWdlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFJlbmRlcmVkSW1hZ2UoUmVuZGVyZWRJbWFnZSBpbWFnZSkgewogICAgICAgICBpZiAoaW1hZ2UgPT0gbnVsbCkgewpAQCAtMTA3LDExICsxMjYsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIElJT0ltYWdlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggYSBSYXN0ZXIsIG9yIAotICAgICAqIGZhbHNlIGlmIGl0J3MgYXNzb2NpYXRlZCB3aXRoIGEgUmVuZGVyZWRJbWFnZS4KKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIElJT0ltYWdlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggYSBSYXN0ZXIsIG9yIGZhbHNlIGlmCisgICAgICogaXQncyBhc3NvY2lhdGVkIHdpdGggYSBSZW5kZXJlZEltYWdlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgSUlPSW1hZ2Ugb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBhIFJhc3Rlciwgb3IgCi0gICAgICogZmFsc2UgaWYgaXQncyBhc3NvY2lhdGVkIHdpdGggYSBSZW5kZXJlZEltYWdlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIElJT0ltYWdlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggYSBSYXN0ZXIsIG9yIGZhbHNlCisgICAgICogICAgICAgICBpZiBpdCdzIGFzc29jaWF0ZWQgd2l0aCBhIFJlbmRlcmVkSW1hZ2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaGFzUmFzdGVyKCkgewogICAgICAgICByZXR1cm4gcmFzdGVyICE9IG51bGw7CkBAIC0xMjEsOCArMTQwLDggQEAKICAgICAgKiBHZXRzIHRoZSBSYXN0ZXIgb2JqZWN0IG9yIHJldHVybnMgbnVsbCBpZiB0aGlzIElJT0ltYWdlIG9iamVjdCBpcwogICAgICAqIGFzc29jaWF0ZWQgd2l0aCBhIFJlbmRlcmVkSW1hZ2UuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgUmFzdGVyIG9yIG51bGwgaWYgdGhpcyBJSU9JbWFnZSBvYmplY3QKLSAgICAgKiBpcyBhc3NvY2lhdGVkIHdpdGggYSBSZW5kZXJlZEltYWdlLgorICAgICAqIEByZXR1cm4gdGhlIFJhc3RlciBvciBudWxsIGlmIHRoaXMgSUlPSW1hZ2Ugb2JqZWN0IGlzIGFzc29jaWF0ZWQgd2l0aCBhCisgICAgICogICAgICAgICBSZW5kZXJlZEltYWdlLgogICAgICAqLwogICAgIHB1YmxpYyBSYXN0ZXIgZ2V0UmFzdGVyKCkgewogICAgICAgICByZXR1cm4gcmFzdGVyOwpAQCAtMTMxLDcgKzE1MCw4IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgUmFzdGVyIHRvIHRoZSBJSU9JbWFnZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmFzdGVyIHRoZSBuZXcgUmFzdGVyIHRvIHRoZSBJSU9JbWFnZS4KKyAgICAgKiBAcGFyYW0gcmFzdGVyCisgICAgICogICAgICAgICAgICB0aGUgbmV3IFJhc3RlciB0byB0aGUgSUlPSW1hZ2UuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UmFzdGVyKFJhc3RlciByYXN0ZXIpIHsKICAgICAgICAgaWYgKHJhc3RlciA9PSBudWxsKSB7CkBAIC0xNTMsOCArMTczLDggQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSB0aHVtYm5haWwgd2l0aCB0aGUgc3BlY2lmaWVkIGluZGV4IGluIHRoZSBsaXN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIHRodW1ibmFpbCBpbiB0aGUgbGlzdC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgdGh1bWJuYWlsIGluIHRoZSBsaXN0LgogICAgICAqIEByZXR1cm4gdGhlIHRodW1ibmFpbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXggaW4gdGhlIGxpc3QuCiAgICAgICovCiAgICAgcHVibGljIEJ1ZmZlcmVkSW1hZ2UgZ2V0VGh1bWJuYWlsKGludCBpbmRleCkgewpAQCAtMTc2LDggKzE5Niw4IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgbGlzdCBvZiB0aHVtYm5haWxzIGltYWdlcyB0byB0aGlzIElJT0ltYWdlIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGh1bWJuYWlscyB0aGUgbGlzdCBvZiBCdWZmZXJlZEltYWdlIHdoaWNoIHJlcHJlc2VudAotICAgICAqIHRodW1ibmFpbHMuCisgICAgICogQHBhcmFtIHRodW1ibmFpbHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBsaXN0IG9mIEJ1ZmZlcmVkSW1hZ2Ugd2hpY2ggcmVwcmVzZW50IHRodW1ibmFpbHMuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VGh1bWJuYWlscyhMaXN0PD8gZXh0ZW5kcyBCdWZmZXJlZEltYWdlPiB0aHVtYm5haWxzKSB7CiAgICAgICAgIHRoaXMudGh1bWJuYWlscyA9IHRodW1ibmFpbHM7CkBAIC0xOTUsNyArMjE1LDggQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBtZXRhZGF0YSB0byB0aGlzIElJT0ltYWdlIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWV0YWRhdGEgdGhlIElJT01ldGFkYXRhLCBvciBudWxsLgorICAgICAqIEBwYXJhbSBtZXRhZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIElJT01ldGFkYXRhLCBvciBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldE1ldGFkYXRhKElJT01ldGFkYXRhIG1ldGFkYXRhKSB7CiAgICAgICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL0lJT1BhcmFtLmphdmEgYi9hd3QvamF2YXgvaW1hZ2Vpby9JSU9QYXJhbS5qYXZhCmluZGV4IGQ5OThiNmUuLjJjY2M5NDUgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL0lJT1BhcmFtLmphdmEKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vSUlPUGFyYW0uamF2YQpAQCAtMTgsNTYgKzE4LDgwIEBACiAgKiBAYXV0aG9yIFJ1c3RlbSBWLiBSYWZpa292CiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMyAkCiAgKi8KKwogcGFja2FnZSBqYXZheC5pbWFnZWlvOwogCiBpbXBvcnQgamF2YS5hd3QuKjsKIAogLyoqCi0gKiBUaGUgSUlPUGFyYW0gYWJzdHJhY3QgY2xhc3MgaXMgc3VwZXJjbGFzcyBmb3IgICAgIAotICogSW1hZ2VSZWFkUGFyYW0gYW5kIEltYWdlV3JpdGVQYXJhbSBjbGFzc2VzIGFuZCBwcm92aWRlcyAKLSAqIG1ldGhvZHMgYW5kIHZhcmlhYmxlcyB3aGljaCB0aGV5IHNoYXJlLgorICogVGhlIElJT1BhcmFtIGFic3RyYWN0IGNsYXNzIGlzIHN1cGVyY2xhc3MgZm9yIEltYWdlUmVhZFBhcmFtIGFuZAorICogSW1hZ2VXcml0ZVBhcmFtIGNsYXNzZXMgYW5kIHByb3ZpZGVzIG1ldGhvZHMgYW5kIHZhcmlhYmxlcyB3aGljaCB0aGV5IHNoYXJlLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIElJT1BhcmFtIHsKLSAgICAKLSAgICAvKiogVGhlIHNvdXJjZSByZWdpb24uICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgc291cmNlIHJlZ2lvbi4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgUmVjdGFuZ2xlIHNvdXJjZVJlZ2lvbjsKLSAgICAKLSAgICAvKiogVGhlIHNvdXJjZSB4IHN1YnNhbXBsaW5nLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHNvdXJjZSB4IHN1YnNhbXBsaW5nLgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgc291cmNlWFN1YnNhbXBsaW5nID0gMTsKLSAgICAKLSAgICAvKiogVGhlIHNvdXJjZSB5IHN1YnNhbXBsaW5nLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHNvdXJjZSB5IHN1YnNhbXBsaW5nLgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgc291cmNlWVN1YnNhbXBsaW5nID0gMTsKLSAgICAKLSAgICAvKiogVGhlIHN1YnNhbXBsaW5nIHggb2Zmc2V0LiAqLworCisgICAgLyoqCisgICAgICogVGhlIHN1YnNhbXBsaW5nIHggb2Zmc2V0LgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgc3Vic2FtcGxpbmdYT2Zmc2V0OwotICAgIAotICAgIC8qKiBUaGUgc3Vic2FtcGxpbmcgeSBvZmZzZXQuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3Vic2FtcGxpbmcgeSBvZmZzZXQuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBzdWJzYW1wbGluZ1lPZmZzZXQ7Ci0gICAgCi0gICAgLyoqIFRoZSBzb3VyY2UgYmFuZHMuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgc291cmNlIGJhbmRzLgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnRbXSBzb3VyY2VCYW5kczsKLSAgICAKLSAgICAvKiogVGhlIGRlc3RpbmF0aW9uIHR5cGUuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzdGluYXRpb24gdHlwZS4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgSW1hZ2VUeXBlU3BlY2lmaWVyIGRlc3RpbmF0aW9uVHlwZTsKLSAgICAKLSAgICAvKiogVGhlIGRlc3RpbmF0aW9uIG9mZnNldC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBkZXN0aW5hdGlvbiBvZmZzZXQuCisgICAgICovCiAgICAgcHJvdGVjdGVkIFBvaW50IGRlc3RpbmF0aW9uT2Zmc2V0ID0gbmV3IFBvaW50KDAsIDApOwotICAgIAotICAgIC8qKiBUaGUgZGVmYXVsdCBjb250cm9sbGVyLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgY29udHJvbGxlci4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgSUlPUGFyYW1Db250cm9sbGVyIGRlZmF1bHRDb250cm9sbGVyOwotICAgIAotICAgIC8qKiBUaGUgY29udHJvbGxlci4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBjb250cm9sbGVyLgorICAgICAqLwogICAgIHByb3RlY3RlZCBJSU9QYXJhbUNvbnRyb2xsZXIgY29udHJvbGxlcjsKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJSU9QYXJhbS4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSUlPUGFyYW0oKSB7fQorICAgIHByb3RlY3RlZCBJSU9QYXJhbSgpIHsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBzb3VyY2UgcmVnaW9uIGFzIGEgUmVjdGFuZ2xlIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmNlUmVnaW9uIHRoZSBSZWN0YW5nbGUgd2hpY2ggc3BlY2lmaWVzIHRoZSBzb3VyY2UgcmVnaW9uLgorICAgICAqIEBwYXJhbSBzb3VyY2VSZWdpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBSZWN0YW5nbGUgd2hpY2ggc3BlY2lmaWVzIHRoZSBzb3VyY2UgcmVnaW9uLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZVJlZ2lvbihSZWN0YW5nbGUgc291cmNlUmVnaW9uKSB7CiAgICAgICAgIGlmIChzb3VyY2VSZWdpb24gIT0gbnVsbCkgewpAQCAtOTEsOCArMTE1LDggQEAKICAgICAgICAgICAgIGlmIChzb3VyY2VSZWdpb24uaGVpZ2h0IDw9IHN1YnNhbXBsaW5nWU9mZnNldCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImhlaWdodCA8PSBzdWJzYW1wbGluZ1hPZmZzZXQiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vLS0gY2xvbmUgaXQgdG8gYXZvaWQgdW5leHBlY3RlZCBtb2RpZmljYXRpb25zCi0gICAgICAgICAgICB0aGlzLnNvdXJjZVJlZ2lvbiA9IChSZWN0YW5nbGUpIHNvdXJjZVJlZ2lvbi5jbG9uZSgpOworICAgICAgICAgICAgLy8gLS0gY2xvbmUgaXQgdG8gYXZvaWQgdW5leHBlY3RlZCBtb2RpZmljYXRpb25zCisgICAgICAgICAgICB0aGlzLnNvdXJjZVJlZ2lvbiA9IChSZWN0YW5nbGUpc291cmNlUmVnaW9uLmNsb25lKCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0aGlzLnNvdXJjZVJlZ2lvbiA9IG51bGw7CiAgICAgICAgIH0KQEAgLTEwNywyNCArMTMxLDI2IEBACiAgICAgICAgIGlmIChzb3VyY2VSZWdpb24gPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KLSAgICAgICAgLy8tLSBjbG9uZSBpdCB0byBhdm9pZCB1bmV4cGVjdGVkIG1vZGlmaWNhdGlvbnMKLSAgICAgICAgcmV0dXJuIChSZWN0YW5nbGUpIHNvdXJjZVJlZ2lvbi5jbG9uZSgpOworICAgICAgICAvLyAtLSBjbG9uZSBpdCB0byBhdm9pZCB1bmV4cGVjdGVkIG1vZGlmaWNhdGlvbnMKKyAgICAgICAgcmV0dXJuIChSZWN0YW5nbGUpc291cmNlUmVnaW9uLmNsb25lKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgc291cmNlIHN1YnNhbXBsaW5nLiBUaGUgc291cmNlWFN1YnNhbXBsaW5nIGFuZCAKLSAgICAgKiBzb3VyY2VZU3Vic2FtcGxpbmcgcGFyYW1ldGVycyBzcGVjaWZ5IHRoZSBudW1iZXIgb2Ygcm93cyAKLSAgICAgKiBhbmQgY29sdW1ucyB0byBhZHZhbmNlIGFmdGVyIGV2ZXJ5IHNvdXJjZSBwaXhlbC4KKyAgICAgKiBTZXRzIHRoZSBzb3VyY2Ugc3Vic2FtcGxpbmcuIFRoZSBzb3VyY2VYU3Vic2FtcGxpbmcgYW5kCisgICAgICogc291cmNlWVN1YnNhbXBsaW5nIHBhcmFtZXRlcnMgc3BlY2lmeSB0aGUgbnVtYmVyIG9mIHJvd3MgYW5kIGNvbHVtbnMgdG8KKyAgICAgKiBhZHZhbmNlIGFmdGVyIGV2ZXJ5IHNvdXJjZSBwaXhlbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmNlWFN1YnNhbXBsaW5nIHRoZSBzb3VyY2UgWCBzdWJzYW1wbGluZy4KLSAgICAgKiBAcGFyYW0gc291cmNlWVN1YnNhbXBsaW5nIHRoZSBzb3VyY2UgWSBzdWJzYW1wbGluZy4KLSAgICAgKiBAcGFyYW0gc3Vic2FtcGxpbmdYT2Zmc2V0IHRoZSBzdWJzYW1wbGluZyBYIG9mZnNldC4KLSAgICAgKiBAcGFyYW0gc3Vic2FtcGxpbmdZT2Zmc2V0IHRoZSBzdWJzYW1wbGluZyBZIG9mZnNldC4KKyAgICAgKiBAcGFyYW0gc291cmNlWFN1YnNhbXBsaW5nCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIFggc3Vic2FtcGxpbmcuCisgICAgICogQHBhcmFtIHNvdXJjZVlTdWJzYW1wbGluZworICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBZIHN1YnNhbXBsaW5nLgorICAgICAqIEBwYXJhbSBzdWJzYW1wbGluZ1hPZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdWJzYW1wbGluZyBYIG9mZnNldC4KKyAgICAgKiBAcGFyYW0gc3Vic2FtcGxpbmdZT2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgc3Vic2FtcGxpbmcgWSBvZmZzZXQuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U291cmNlU3Vic2FtcGxpbmcoaW50IHNvdXJjZVhTdWJzYW1wbGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb3VyY2VZU3Vic2FtcGxpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Vic2FtcGxpbmdYT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1YnNhbXBsaW5nWU9mZnNldCkgeworICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZVN1YnNhbXBsaW5nKGludCBzb3VyY2VYU3Vic2FtcGxpbmcsIGludCBzb3VyY2VZU3Vic2FtcGxpbmcsCisgICAgICAgICAgICBpbnQgc3Vic2FtcGxpbmdYT2Zmc2V0LCBpbnQgc3Vic2FtcGxpbmdZT2Zmc2V0KSB7CiAKICAgICAgICAgaWYgKHNvdXJjZVhTdWJzYW1wbGluZyA8PSAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzb3VyY2VYU3Vic2FtcGxpbmcgPD0gMCIpOwpAQCAtMTQxLDEwICsxNjcsMTAgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInN1YnNhbXBsaW5nWU9mZnNldCBpcyB3cm9uZyIpOwogICAgICAgICB9CiAKLSAgICAgICAgLy8tLSBkb2VzIHJlZ2lvbiBjb250YWluIHBpeGVscworICAgICAgICAvLyAtLSBkb2VzIHJlZ2lvbiBjb250YWluIHBpeGVscwogICAgICAgICBpZiAoc291cmNlUmVnaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChzb3VyY2VSZWdpb24ud2lkdGggPD0gc3Vic2FtcGxpbmdYT2Zmc2V0IHx8Ci0gICAgICAgICAgICAgICAgICAgIHNvdXJjZVJlZ2lvbi5oZWlnaHQgPD0gc3Vic2FtcGxpbmdZT2Zmc2V0KSB7CisgICAgICAgICAgICBpZiAoc291cmNlUmVnaW9uLndpZHRoIDw9IHN1YnNhbXBsaW5nWE9mZnNldAorICAgICAgICAgICAgICAgICAgICB8fCBzb3VyY2VSZWdpb24uaGVpZ2h0IDw9IHN1YnNhbXBsaW5nWU9mZnNldCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRoZXJlIGFyZSBubyBwaXhlbHMgaW4gcmVnaW9uIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE1Niw4ICsxODIsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNvdXJjZSBYIHN1YnNhbXBsaW5nIC0gdGhlIG51bWJlciBvZiBzb3VyY2UgCi0gICAgICogY29sdW1ucyB0byBhZHZhbmNlIGZvciBlYWNoIHBpeGVsLgorICAgICAqIEdldHMgdGhlIHNvdXJjZSBYIHN1YnNhbXBsaW5nIC0gdGhlIG51bWJlciBvZiBzb3VyY2UgY29sdW1ucyB0byBhZHZhbmNlCisgICAgICogZm9yIGVhY2ggcGl4ZWwuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgc291cmNlIFggc3Vic2FtcGxpbmcuCiAgICAgICovCkBAIC0xNjYsOCArMTkyLDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzb3VyY2UgWSBzdWJzYW1wbGluZyAtIHRoZSBudW1iZXIgb2Ygc291cmNlIAotICAgICAqIHJvd3MgdG8gYWR2YW5jZSBmb3IgZWFjaCBwaXhlbC4KKyAgICAgKiBHZXRzIHRoZSBzb3VyY2UgWSBzdWJzYW1wbGluZyAtIHRoZSBudW1iZXIgb2Ygc291cmNlIHJvd3MgdG8gYWR2YW5jZSBmb3IKKyAgICAgKiBlYWNoIHBpeGVsLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIHNvdXJjZSBZIHN1YnNhbXBsaW5nLgogICAgICAqLwpAQCAtMTk2LDcgKzIyMiw4IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgaW5kaWNlcyBvZiB0aGUgc291cmNlIGJhbmRzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzb3VyY2VCYW5kcyB0aGUgaW5kaWNlcyBvZiB0aGUgc291cmNlIGJhbmRzLgorICAgICAqIEBwYXJhbSBzb3VyY2VCYW5kcworICAgICAqICAgICAgICAgICAgdGhlIGluZGljZXMgb2YgdGhlIHNvdXJjZSBiYW5kcy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VCYW5kcyhpbnRbXSBzb3VyY2VCYW5kcykgewogICAgICAgICAvLyBUT0RPIGltcGxlbWVudApAQCAtMjE2LDcgKzI0Myw4IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgc3BlY2lmaWVkIEltYWdlVHlwZVNwZWNpZmllciBmb3IgdGhlIGRlc3RpbmF0aW9uIGltYWdlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvblR5cGUgdGhlIEltYWdlVHlwZVNwZWNpZmllci4KKyAgICAgKiBAcGFyYW0gZGVzdGluYXRpb25UeXBlCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VUeXBlU3BlY2lmaWVyLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERlc3RpbmF0aW9uVHlwZShJbWFnZVR5cGVTcGVjaWZpZXIgZGVzdGluYXRpb25UeXBlKSB7CiAgICAgICAgIC8vIFRPRE8gaW1wbGVtZW50CkBAIC0yMjUsNyArMjUzLDcgQEAKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHR5cGUgb2YgdGhlIGRlc3RpbmF0aW9uIGltYWdlIGFzIGFuIEltYWdlVHlwZVNwZWNpZmllci4gLgotICAgICAqICAKKyAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBJbWFnZVR5cGVTcGVjaWZpZXIuCiAgICAgICovCiAgICAgcHVibGljIEltYWdlVHlwZVNwZWNpZmllciBnZXREZXN0aW5hdGlvblR5cGUoKSB7CkBAIC0yMzQsMTggKzI2MiwxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIG9mZnNldCBpbiB0aGUgZGVzdGluYXRpb24gaW1hZ2Ugd2hlcmUgCi0gICAgICogdGhlIGRlY29kZWQgcGl4ZWxzIGFyZSBwbGFjZWQgYXMgYSByZXN1bHQgb2YgcmVhZGluZywgCi0gICAgICogb3Igc3BlY2lmaWVkIGFuIGFyZWEgdG8gYmUgd3JpdHRlbiB3aGlsZSB3cml0aW5nIG9wZXJhdGlvbi4KKyAgICAgKiBTZXRzIHRoZSBvZmZzZXQgaW4gdGhlIGRlc3RpbmF0aW9uIGltYWdlIHdoZXJlIHRoZSBkZWNvZGVkIHBpeGVscyBhcmUKKyAgICAgKiBwbGFjZWQgYXMgYSByZXN1bHQgb2YgcmVhZGluZywgb3Igc3BlY2lmaWVkIGFuIGFyZWEgdG8gYmUgd3JpdHRlbiB3aGlsZQorICAgICAqIHdyaXRpbmcgb3BlcmF0aW9uLgogICAgICAqIAotICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbk9mZnNldCB0aGUgZGVzdGluYXRpb24gb2Zmc2V0LgorICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbk9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIG9mZnNldC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXREZXN0aW5hdGlvbk9mZnNldChQb2ludCBkZXN0aW5hdGlvbk9mZnNldCkgewogICAgICAgICBpZiAoZGVzdGluYXRpb25PZmZzZXQgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZGVzdGluYXRpb25PZmZzZXQgPT0gbnVsbCEiKTsKICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdGhpcy5kZXN0aW5hdGlvbk9mZnNldCA9IChQb2ludCkgZGVzdGluYXRpb25PZmZzZXQuY2xvbmUoKTsKKworICAgICAgICB0aGlzLmRlc3RpbmF0aW9uT2Zmc2V0ID0gKFBvaW50KWRlc3RpbmF0aW9uT2Zmc2V0LmNsb25lKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNTQsMTQgKzI4MywxNSBAQAogICAgICAqIEByZXR1cm4gdGhlIG9mZnNldCBpbiB0aGUgZGVzdGluYXRpb24gaW1hZ2UuCiAgICAgICovCiAgICAgcHVibGljIFBvaW50IGdldERlc3RpbmF0aW9uT2Zmc2V0KCkgewotICAgICAgICByZXR1cm4gKFBvaW50KSBkZXN0aW5hdGlvbk9mZnNldC5jbG9uZSgpOyAgICAgICAgCisgICAgICAgIHJldHVybiAoUG9pbnQpZGVzdGluYXRpb25PZmZzZXQuY2xvbmUoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBJSU9QYXJhbUNvbnRyb2xsZXIgdG8gdGhpcyBJSU9QYXJhbSBvYmplY3QgZm9yCi0gICAgICogcHJvdmlkaW5nIHNldHRpbmdzIHRvIHRoaXMgSUlPUGFyYW0uCisgICAgICogU2V0cyB0aGUgSUlPUGFyYW1Db250cm9sbGVyIHRvIHRoaXMgSUlPUGFyYW0gb2JqZWN0IGZvciBwcm92aWRpbmcKKyAgICAgKiBzZXR0aW5ncyB0byB0aGlzIElJT1BhcmFtLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjb250cm9sbGVyIHRoZSBuZXcgSUlPUGFyYW1Db250cm9sbGVyLgorICAgICAqIEBwYXJhbSBjb250cm9sbGVyCisgICAgICogICAgICAgICAgICB0aGUgbmV3IElJT1BhcmFtQ29udHJvbGxlci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDb250cm9sbGVyKElJT1BhcmFtQ29udHJvbGxlciBjb250cm9sbGVyKSB7CiAgICAgICAgIC8vIFRPRE8gaW1wbGVtZW50CkBAIC0yNjksMTEgKzI5OSw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgY3VycmVudCBJSU9QYXJhbUNvbnRyb2xsZXIgY29udHJvbGxlciAKLSAgICAgKiBmb3IgdGhpcyBJSU9QYXJhbS4KKyAgICAgKiBHZXRzIHRoZSBjdXJyZW50IElJT1BhcmFtQ29udHJvbGxlciBjb250cm9sbGVyIGZvciB0aGlzIElJT1BhcmFtLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgSUlPUGFyYW1Db250cm9sbGVyIGNvbnRyb2xsZXIgCi0gICAgICogZm9yIHRoaXMgSUlPUGFyYW0uCisgICAgICogQHJldHVybiB0aGUgY3VycmVudCBJSU9QYXJhbUNvbnRyb2xsZXIgY29udHJvbGxlciBmb3IgdGhpcyBJSU9QYXJhbS4KICAgICAgKi8KICAgICBwdWJsaWMgSUlPUGFyYW1Db250cm9sbGVyIGdldENvbnRyb2xsZXIoKSB7CiAgICAgICAgIC8vIFRPRE8gaW1wbGVtZW50CkBAIC0yODEsMTEgKzMwOSwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGRlZmF1bHQgSUlPUGFyYW1Db250cm9sbGVyIGNvbnRyb2xsZXIgCi0gICAgICogZm9yIHRoaXMgSUlPUGFyYW0uCisgICAgICogR2V0cyB0aGUgZGVmYXVsdCBJSU9QYXJhbUNvbnRyb2xsZXIgY29udHJvbGxlciBmb3IgdGhpcyBJSU9QYXJhbS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IElJT1BhcmFtQ29udHJvbGxlciBjb250cm9sbGVyIAotICAgICAqIGZvciB0aGlzIElJT1BhcmFtLCBvciBudWxsLgorICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgSUlPUGFyYW1Db250cm9sbGVyIGNvbnRyb2xsZXIgZm9yIHRoaXMgSUlPUGFyYW0sIG9yCisgICAgICogICAgICAgICBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyBJSU9QYXJhbUNvbnRyb2xsZXIgZ2V0RGVmYXVsdENvbnRyb2xsZXIoKSB7CiAgICAgICAgIC8vIFRPRE8gaW1wbGVtZW50CkBAIC0yOTMsMTEgKzMyMCwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiBJSU9QYXJhbUNvbnRyb2xsZXIgaXMgaW5zdGFsbGVkIGZvciAKLSAgICAgKiB0aGlzIElJT1BhcmFtLiAKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgSUlPUGFyYW1Db250cm9sbGVyIGlzIGluc3RhbGxlZCBmb3IgdGhpcyBJSU9QYXJhbS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgSUlPUGFyYW1Db250cm9sbGVyIGlzIGluc3RhbGxlZCBmb3IgCi0gICAgICogdGhpcyBJSU9QYXJhbSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgSUlPUGFyYW1Db250cm9sbGVyIGlzIGluc3RhbGxlZCBmb3IgdGhpcyBJSU9QYXJhbSwgZmFsc2UKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb250cm9sbGVyKCkgewogICAgICAgICAvLyBUT0RPIGltcGxlbWVudApkaWZmIC0tZ2l0IGEvYXd0L2phdmF4L2ltYWdlaW8vSUlPUGFyYW1Db250cm9sbGVyLmphdmEgYi9hd3QvamF2YXgvaW1hZ2Vpby9JSU9QYXJhbUNvbnRyb2xsZXIuamF2YQppbmRleCAzMTUyMmMxLi4zMzhjYjI1IDEwMDY0NAotLS0gYS9hd3QvamF2YXgvaW1hZ2Vpby9JSU9QYXJhbUNvbnRyb2xsZXIuamF2YQorKysgYi9hd3QvamF2YXgvaW1hZ2Vpby9JSU9QYXJhbUNvbnRyb2xsZXIuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBTZXJnZXkgSS4gU2FsaXNoZXYKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4yICQKICAqLworCiBwYWNrYWdlIGphdmF4LmltYWdlaW87CiAKIC8qIApAQCAtMjYsMTggKzI3LDE5IEBACiAgKi8KIAogLyoqCi0gKiBUaGUgSUlPUGFyYW1Db250cm9sbGVyIHNwZWNpZmllcyBhbiBhY3RpdmF0ZSBtZXRob2QgdGhhdCBpbnZva2VzIHRoZSAKKyAqIFRoZSBJSU9QYXJhbUNvbnRyb2xsZXIgc3BlY2lmaWVzIGFuIGFjdGl2YXRlIG1ldGhvZCB0aGF0IGludm9rZXMgdGhlCiAgKiBjb250cm9sbGVyLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBJSU9QYXJhbUNvbnRyb2xsZXIgewogCiAgICAgLyoqCi0gICAgICogQWN0aXZhdGVzIHRoZSBjb250cm9sbGVyLiAKKyAgICAgKiBBY3RpdmF0ZXMgdGhlIGNvbnRyb2xsZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHBhcmFtIHRoZSBJSU9QYXJhbS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIElJT1BhcmFtIGhhcyBiZWVuIG1vZGlmaWVkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIHBhcmFtCisgICAgICogICAgICAgICAgICB0aGUgSUlPUGFyYW0uCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgSUlPUGFyYW0gaGFzIGJlZW4gbW9kaWZpZWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBib29sZWFuIGFjdGl2YXRlKElJT1BhcmFtIHBhcmFtKTsKIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmF4L2ltYWdlaW8vSW1hZ2VJTy5qYXZhIGIvYXd0L2phdmF4L2ltYWdlaW8vSW1hZ2VJTy5qYXZhCmluZGV4IGQ0Y2QxZGQuLmUwZDdlYzkgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL0ltYWdlSU8uamF2YQorKysgYi9hd3QvamF2YXgvaW1hZ2Vpby9JbWFnZUlPLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgUnVzdGVtIFYuIFJhZmlrb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4zICQKICAqLworCiBwYWNrYWdlIGphdmF4LmltYWdlaW87CiAKIGltcG9ydCBqYXZheC5pbWFnZWlvLnN0cmVhbS5JbWFnZUlucHV0U3RyZWFtOwpAQCAtMzQsNDQgKzM1LDQ3IEBACiBpbXBvcnQgamF2YS5uZXQuVVJMOwogCiAvKioKLSAqIFRoZSBJbWFnZUlPIGNsYXNzIHByb3ZpZGVzIHN0YXRpYyBtZXRob2RzIHRvIHBlcmZvbSAKLSAqIHJlYWRpbmcgYW5kIHdyaXRpbmcgb3BlcmF0aW9ucyB1c2luZyByZWdpc3RlcmVkCi0gKiBJbWFnZVJlYWRlciBhbmQgSW1hZ2VXcml0ZXIgb2JqZWN0cy4KKyAqIFRoZSBJbWFnZUlPIGNsYXNzIHByb3ZpZGVzIHN0YXRpYyBtZXRob2RzIHRvIHBlcmZvcm0gcmVhZGluZyBhbmQgd3JpdGluZworICogb3BlcmF0aW9ucyB1c2luZyByZWdpc3RlcmVkIEltYWdlUmVhZGVyIGFuZCBJbWFnZVdyaXRlciBvYmplY3RzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEltYWdlSU8gewogCi0gICAgLyoqIFRoZSBDb25zdGFudCByZWdpc3RyeS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY29uc3RhbnQgcmVnaXN0cnkuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUlPUmVnaXN0cnkgcmVnaXN0cnkgPSBJSU9SZWdpc3RyeS5nZXREZWZhdWx0SW5zdGFuY2UoKTsKIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBpbWFnZSBpby4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgSW1hZ2VJTy4KICAgICAgKi8KLSAgICBwcml2YXRlIEltYWdlSU8oKSB7fQotICAgIAorICAgIHByaXZhdGUgSW1hZ2VJTygpIHsKKyAgICB9CiAKICAgICAvKioKLSAgICAgKiBTY2FucyBmb3IgcGx1Zy1pbnMgaW4gdGhlIGNsYXNzIHBhdGgsIAotICAgICAqIGxvYWRzIHNwaSBjbGFzc2VzLCBhbmQgcmVnaXN0ZXJzIHRoZW0gd2l0aCB0aGUgSUlPUmVnaXN0cnkuCisgICAgICogU2NhbnMgZm9yIHBsdWctaW5zIGluIHRoZSBjbGFzcyBwYXRoLCBsb2FkcyBzcGkgY2xhc3NlcywgYW5kIHJlZ2lzdGVycworICAgICAqIHRoZW0gd2l0aCB0aGUgSUlPUmVnaXN0cnkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNjYW5Gb3JQbHVnaW5zKCkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyBmbGFnIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIGEgY2FjaGUgZmlsZSBpcyB1c2VkIHdoZW4gCi0gICAgICogY3JlYXRpbmcgSW1hZ2VJbnB1dFN0cmVhbXMgYW5kIEltYWdlT3V0cHV0U3RyZWFtcyBvciBub3QuCisgICAgICogU2V0cyBmbGFnIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIGEgY2FjaGUgZmlsZSBpcyB1c2VkIHdoZW4gY3JlYXRpbmcKKyAgICAgKiBJbWFnZUlucHV0U3RyZWFtcyBhbmQgSW1hZ2VPdXRwdXRTdHJlYW1zIG9yIG5vdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXNlQ2FjaGUgdGhlIHVzZSBjYWNoZSBmbGFnLgorICAgICAqIEBwYXJhbSB1c2VDYWNoZQorICAgICAqICAgICAgICAgICAgdGhlIHVzZSBjYWNoZSBmbGFnLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVc2VDYWNoZShib29sZWFuIHVzZUNhY2hlKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBmbGFnIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIGEgY2FjaGUgZmlsZSBpcyB1c2VkIHdoZW4gCi0gICAgICogY3JlYXRpbmcgSW1hZ2VJbnB1dFN0cmVhbXMgYW5kIEltYWdlT3V0cHV0U3RyZWFtcyBvciBub3QuCi0gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSB3aGljaCBpcyBzZXQgYnkgc2V0VXNlQ2FjaGUKLSAgICAgKiBtZXRob2QuCisgICAgICogR2V0cyB0aGUgZmxhZyB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciBhIGNhY2hlIGZpbGUgaXMgdXNlZCB3aGVuIGNyZWF0aW5nCisgICAgICogSW1hZ2VJbnB1dFN0cmVhbXMgYW5kIEltYWdlT3V0cHV0U3RyZWFtcyBvciBub3QuIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlCisgICAgICogY3VycmVudCB2YWx1ZSB3aGljaCBpcyBzZXQgYnkgc2V0VXNlQ2FjaGUgbWV0aG9kLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIHVzZSBjYWNoZSBmbGFnLgogICAgICAqLwpAQCAtODMsNDQgKzg3LDQ0IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgY2FjaGUgZGlyZWN0b3J5LgogICAgICAqIAotICAgICAqIEBwYXJhbSBjYWNoZURpcmVjdG9yeSB0aGUgRmlsZSB3aGljaCBzcGVjaWZpZXMgYSBjYWNoZSBkaXJlY3RvcnkuCisgICAgICogQHBhcmFtIGNhY2hlRGlyZWN0b3J5CisgICAgICogICAgICAgICAgICB0aGUgRmlsZSB3aGljaCBzcGVjaWZpZXMgYSBjYWNoZSBkaXJlY3RvcnkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldENhY2hlRGlyZWN0b3J5KEZpbGUgY2FjaGVEaXJlY3RvcnkpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIHlldCIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGRpcmVjdG9yeSB3aGVyZSBjYWNoZSBmaWxlcyBhcmUgY3JlYXRlZCwgcmV0dXJuZWQKLSAgICAgKiB0aGUgZmlsZSB3aGljaCBpcyBzZXQgYnkgc2V0Q2FjaGVEaXJlY3RvcnkgbWV0aG9kLCBvciBudWxsLgorICAgICAqIEdldHMgdGhlIGRpcmVjdG9yeSB3aGVyZSBjYWNoZSBmaWxlcyBhcmUgY3JlYXRlZCwgcmV0dXJuZWQgdGhlIGZpbGUgd2hpY2gKKyAgICAgKiBpcyBzZXQgYnkgc2V0Q2FjaGVEaXJlY3RvcnkgbWV0aG9kLCBvciBudWxsLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIEZpbGUgb2JqZWN0IHdoaWNoIGlzIHNldCBieSBzZXRDYWNoZURpcmVjdG9yeSBtZXRob2QsIAotICAgICAqIG9yIG51bGwuCisgICAgICogQHJldHVybiB0aGUgRmlsZSBvYmplY3Qgd2hpY2ggaXMgc2V0IGJ5IHNldENhY2hlRGlyZWN0b3J5IG1ldGhvZCwgb3IKKyAgICAgKiAgICAgICAgIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBGaWxlIGdldENhY2hlRGlyZWN0b3J5KCkgewogICAgICAgICAvLyBUT0RPIGltcGxlbWVudAotICAgICAgICAvLy0tIG51bGwgaW5kaWNhdGVzIHN5c3RlbS1kZXAgZGVmYXVsdCB0ZW1wb3JhcnkgZGlyZWN0b3J5CisgICAgICAgIC8vIC0tIG51bGwgaW5kaWNhdGVzIHN5c3RlbS1kZXAgZGVmYXVsdCB0ZW1wb3JhcnkgZGlyZWN0b3J5CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gSW1hZ2VJbnB1dFN0cmVhbSBmcm9tIHRoZSBzcGVjaWZpZWQgT2JqZWN0LgotICAgICAqIFRoZSBzcGVjaWZpZWQgT2JqZWN0IHNob3VsZCBvYnRhaW4gdGhlIGlucHV0IHNvdXJjZQotICAgICAqIHN1Y2ggYXMgRmlsZSwgb3IgSW5wdXRTdHJlYW0uICAgCisgICAgICogQ3JlYXRlcyBhbiBJbWFnZUlucHV0U3RyZWFtIGZyb20gdGhlIHNwZWNpZmllZCBPYmplY3QuIFRoZSBzcGVjaWZpZWQKKyAgICAgKiBPYmplY3Qgc2hvdWxkIG9idGFpbiB0aGUgaW5wdXQgc291cmNlIHN1Y2ggYXMgRmlsZSwgb3IgSW5wdXRTdHJlYW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIGlucHV0IHRoZSBpbnB1dCBPYmplY3Qgc3VjaCBhcyBGaWxlLCBvciBJbnB1dFN0cmVhbS4gICAKLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW5wdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnB1dCBPYmplY3Qgc3VjaCBhcyBGaWxlLCBvciBJbnB1dFN0cmVhbS4KICAgICAgKiBAcmV0dXJuIHRoZSBJbWFnZUlucHV0U3RyZWFtIG9iamVjdCwgb3IgbnVsbC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIHNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJbWFnZUlucHV0U3RyZWFtIGNyZWF0ZUltYWdlSW5wdXRTdHJlYW0oT2JqZWN0IGlucHV0KQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgc3RhdGljIEltYWdlSW5wdXRTdHJlYW0gY3JlYXRlSW1hZ2VJbnB1dFN0cmVhbShPYmplY3QgaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKICAgICAgICAgaWYgKGlucHV0ID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImlucHV0IHNvdXJjZSBjYW5ub3QgYmUgTlVMTCIpOwogICAgICAgICB9CiAKLSAgICAgICAgSXRlcmF0b3I8SW1hZ2VJbnB1dFN0cmVhbVNwaT4gaXQgPSByZWdpc3RyeS5nZXRTZXJ2aWNlUHJvdmlkZXJzKEltYWdlSW5wdXRTdHJlYW1TcGkuY2xhc3MsIHRydWUpOworICAgICAgICBJdGVyYXRvcjxJbWFnZUlucHV0U3RyZWFtU3BpPiBpdCA9IHJlZ2lzdHJ5LmdldFNlcnZpY2VQcm92aWRlcnMoSW1hZ2VJbnB1dFN0cmVhbVNwaS5jbGFzcywKKyAgICAgICAgICAgICAgICB0cnVlKTsKIAogICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CiAgICAgICAgICAgICBJbWFnZUlucHV0U3RyZWFtU3BpIHNwaSA9IGl0Lm5leHQoKTsKQEAgLTEzMiwyMyArMTM2LDIyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBJbWFnZU91dHB1dFN0cmVhbSB1c2luZyB0aGUgc3BlY2lmaWVkIE9iamVjdC4KLSAgICAgKiBUaGUgc3BlY2lmaWVkIE9iamVjdCBzaG91bGQgb2J0YWluIHRoZSBvdXRwdXQgc291cmNlCi0gICAgICogc3VjaCBhcyBGaWxlLCBvciBPdXRwdXRTdHJlYW0uICAgCisgICAgICogQ3JlYXRlcyBhbiBJbWFnZU91dHB1dFN0cmVhbSB1c2luZyB0aGUgc3BlY2lmaWVkIE9iamVjdC4gVGhlIHNwZWNpZmllZAorICAgICAqIE9iamVjdCBzaG91bGQgb2J0YWluIHRoZSBvdXRwdXQgc291cmNlIHN1Y2ggYXMgRmlsZSwgb3IgT3V0cHV0U3RyZWFtLgogICAgICAqIAotICAgICAqIEBwYXJhbSBvdXRwdXQgdGhlIG91dHB1dCBPYmplY3Qgc3VjaCBhcyBGaWxlLCBvciBPdXRwdXRTdHJlYW0uICAgCi0gICAgICogCisgICAgICogQHBhcmFtIG91dHB1dAorICAgICAqICAgICAgICAgICAgdGhlIG91dHB1dCBPYmplY3Qgc3VjaCBhcyBGaWxlLCBvciBPdXRwdXRTdHJlYW0uCiAgICAgICogQHJldHVybiB0aGUgSW1hZ2VPdXRwdXRTdHJlYW0gb2JqZWN0LCBvciBudWxsLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gc2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEltYWdlT3V0cHV0U3RyZWFtIGNyZWF0ZUltYWdlT3V0cHV0U3RyZWFtKE9iamVjdCBvdXRwdXQpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2VPdXRwdXRTdHJlYW0gY3JlYXRlSW1hZ2VPdXRwdXRTdHJlYW0oT2JqZWN0IG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKG91dHB1dCA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJvdXRwdXQgZGVzdGluYXRpb24gY2Fubm90IGJlIE5VTEwiKTsKICAgICAgICAgfQogCi0gICAgICAgIEl0ZXJhdG9yPEltYWdlT3V0cHV0U3RyZWFtU3BpPiBpdCA9IHJlZ2lzdHJ5LmdldFNlcnZpY2VQcm92aWRlcnMoSW1hZ2VPdXRwdXRTdHJlYW1TcGkuY2xhc3MsIHRydWUpOworICAgICAgICBJdGVyYXRvcjxJbWFnZU91dHB1dFN0cmVhbVNwaT4gaXQgPSByZWdpc3RyeS5nZXRTZXJ2aWNlUHJvdmlkZXJzKAorICAgICAgICAgICAgICAgIEltYWdlT3V0cHV0U3RyZWFtU3BpLmNsYXNzLCB0cnVlKTsKIAogICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CiAgICAgICAgICAgICBJbWFnZU91dHB1dFN0cmVhbVNwaSBzcGkgPSBpdC5uZXh0KCk7CkBAIC0xNjEsOCArMTY0LDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBhcnJheSBvZiBmb3JtYXQgbmFtZXMgYXMgU3RyaW5nIHdoaWNoIGNhbiBiZSAKLSAgICAgKiBkZWNvZGVkIGJ5IHJlZ2lzdGVyZWQgSW1hZ2VSZWFkZXIgb2JqZWN0cy4KKyAgICAgKiBHZXRzIHRoZSBhcnJheSBvZiBmb3JtYXQgbmFtZXMgYXMgU3RyaW5nIHdoaWNoIGNhbiBiZSBkZWNvZGVkIGJ5CisgICAgICogcmVnaXN0ZXJlZCBJbWFnZVJlYWRlciBvYmplY3RzLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGZvcm1hdCBuYW1lcy4KICAgICAgKi8KQEAgLTE3MSw4ICsxNzQsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGFycmF5IG9mIE1JTUUgdHlwZXMgYXMgU3RyaW5nIHdoaWNoIGNhbiBiZSAKLSAgICAgKiBkZWNvZGVkIGJ5IHJlZ2lzdGVyZWQgSW1hZ2VSZWFkZXIgb2JqZWN0cy4KKyAgICAgKiBHZXRzIHRoZSBhcnJheSBvZiBNSU1FIHR5cGVzIGFzIFN0cmluZyB3aGljaCBjYW4gYmUgZGVjb2RlZCBieSByZWdpc3RlcmVkCisgICAgICogSW1hZ2VSZWFkZXIgb2JqZWN0cy4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBNSU1FIHR5cGVzLgogICAgICAqLwpAQCAtMTgxLDEzICsxODQsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBJdGVyYXRvciBvZiByZWdpc3RlcmVkIEltYWdlUmVhZGVyIHdoaWNoIGFyZSBhYmxlIHRvIAotICAgICAqIGRlY29kZSBhbiBpbXB1dCBkYXRhIHNwZWNpZmllZCBieSBpbnB1dCBPYmplY3QuCisgICAgICogR2V0cyB0aGUgSXRlcmF0b3Igb2YgcmVnaXN0ZXJlZCBJbWFnZVJlYWRlciB3aGljaCBhcmUgYWJsZSB0byBkZWNvZGUgYW4KKyAgICAgKiBpbnB1dCBkYXRhIHNwZWNpZmllZCBieSBpbnB1dCBPYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIGlucHV0IHRoZSBpbnB1dCBPYmplY3Qgd2l0aCBlbmNvZGVkIGRhdGEgc3VjaCBhcyAKLSAgICAgKiBJbWFnZUlucHV0U3RyZWFtIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBJdGVyYXRvciBvZiByZWdpc3RlcmVkIEltYWdlUmVhZGVyLiAKKyAgICAgKiBAcGFyYW0gaW5wdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnB1dCBPYmplY3Qgd2l0aCBlbmNvZGVkIGRhdGEgc3VjaCBhcyBJbWFnZUlucHV0U3RyZWFtCisgICAgICogICAgICAgICAgICBvYmplY3QuCisgICAgICogQHJldHVybiB0aGUgSXRlcmF0b3Igb2YgcmVnaXN0ZXJlZCBJbWFnZVJlYWRlci4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPEltYWdlUmVhZGVyPiBnZXRJbWFnZVJlYWRlcnMoT2JqZWN0IGlucHV0KSB7CiAgICAgICAgIGlmIChpbnB1dCA9PSBudWxsKSB7CkBAIC0yMDEsMTEgKzIwNCwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIEl0ZXJhdG9yIG9mIHJlZ2lzdGVyZWQgSW1hZ2VSZWFkZXIgd2hpY2ggYXJlIGFibGUgdG8gCi0gICAgICogZGVjb2RlIHRoZSBzcGVjaWZpZWQgZm9ybWF0LgorICAgICAqIEdldHMgdGhlIEl0ZXJhdG9yIG9mIHJlZ2lzdGVyZWQgSW1hZ2VSZWFkZXIgd2hpY2ggYXJlIGFibGUgdG8gZGVjb2RlIHRoZQorICAgICAqIHNwZWNpZmllZCBmb3JtYXQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGZvcm1hdE5hbWUgdGhlIGZvcm1hdCBuYW1lIHN1Y2ggYXMgImpwZWciLCBvciAiZ2lmIi4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZm9ybWF0TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGZvcm1hdCBuYW1lIHN1Y2ggYXMgImpwZWciLCBvciAiZ2lmIi4KICAgICAgKiBAcmV0dXJuIHRoZSBJdGVyYXRvciBvZiByZWdpc3RlcmVkIEltYWdlUmVhZGVyLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8SW1hZ2VSZWFkZXI+IGdldEltYWdlUmVhZGVyc0J5Rm9ybWF0TmFtZShTdHJpbmcgZm9ybWF0TmFtZSkgewpAQCAtMjIwLDExICsyMjMsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBJdGVyYXRvciB3aGljaCBsaXN0cyB0aGUgcmVnaXN0ZXJlZCBJbWFnZVJlYWRlciBvYmplY3RzIHRoYXQKLSAgICAgKiBhcmUgYWJsZSB0byBkZWNvZGUgZmlsZXMgd2l0aCB0aGUgc3BlY2lmaWVkIHN1ZmZpeC4KKyAgICAgKiBHZXRzIHRoZSBJdGVyYXRvciB3aGljaCBsaXN0cyB0aGUgcmVnaXN0ZXJlZCBJbWFnZVJlYWRlciBvYmplY3RzIHRoYXQgYXJlCisgICAgICogYWJsZSB0byBkZWNvZGUgZmlsZXMgd2l0aCB0aGUgc3BlY2lmaWVkIHN1ZmZpeC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmlsZVN1ZmZpeCB0aGUgZmlsZSBzdWZmaXggc3VjaCBhcyAianBnIi4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZmlsZVN1ZmZpeAorICAgICAqICAgICAgICAgICAgdGhlIGZpbGUgc3VmZml4IHN1Y2ggYXMgImpwZyIuCiAgICAgICogQHJldHVybiB0aGUgSXRlcmF0b3Igb2YgcmVnaXN0ZXJlZCBJbWFnZVJlYWRlcnMuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBJdGVyYXRvcjxJbWFnZVJlYWRlcj4gZ2V0SW1hZ2VSZWFkZXJzQnlTdWZmaXgoU3RyaW5nIGZpbGVTdWZmaXgpIHsKQEAgLTIzOCwxMSArMjQxLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgSXRlcmF0b3Igb2YgcmVnaXN0ZXJlZCBJbWFnZVJlYWRlciBvYmplY3RzIHRoYXQKLSAgICAgKiBhcmUgYWJsZSB0byBkZWNvZGUgZmlsZXMgd2l0aCB0aGUgc3BlY2lmaWVkIE1JTUUgdHlwZS4KKyAgICAgKiBHZXRzIHRoZSBJdGVyYXRvciBvZiByZWdpc3RlcmVkIEltYWdlUmVhZGVyIG9iamVjdHMgdGhhdCBhcmUgYWJsZSB0bworICAgICAqIGRlY29kZSBmaWxlcyB3aXRoIHRoZSBzcGVjaWZpZWQgTUlNRSB0eXBlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBNSU1FVHlwZSB0aGUgTUlNRSB0eXBlIHN1Y2ggYXMgImltYWdlL2pwZWciLgotICAgICAqIAorICAgICAqIEBwYXJhbSBNSU1FVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIE1JTUUgdHlwZSBzdWNoIGFzICJpbWFnZS9qcGVnIi4KICAgICAgKiBAcmV0dXJuIHRoZSBJdGVyYXRvciBvZiByZWdpc3RlcmVkIEltYWdlUmVhZGVycy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPEltYWdlUmVhZGVyPiBnZXRJbWFnZVJlYWRlcnNCeU1JTUVUeXBlKFN0cmluZyBNSU1FVHlwZSkgewpAQCAtMjUwLDggKzI1Myw4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbiBhcnJheSBvZiBTdHJpbmdzIGdpdmluZyB0aGUgbmFtZXMgb2YgdGhlIGZvcm1hdHMgc3VwcG9ydGVkIAotICAgICAqIGJ5IHJlZ2lzdGVyZWQgSW1hZ2VXcml0ZXIgb2JqZWN0cy4KKyAgICAgKiBHZXRzIGFuIGFycmF5IG9mIFN0cmluZ3MgZ2l2aW5nIHRoZSBuYW1lcyBvZiB0aGUgZm9ybWF0cyBzdXBwb3J0ZWQgYnkKKyAgICAgKiByZWdpc3RlcmVkIEltYWdlV3JpdGVyIG9iamVjdHMuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgZm9ybWF0IG5hbWVzLgogICAgICAqLwpAQCAtMjYwLDcgKzI2Myw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbiBhcnJheSBvZiBTdHJpbmdzIGdpdmluZyB0aGUgTUlNRSB0eXBlcyBvZiB0aGUgZm9ybWF0cyBzdXBwb3J0ZWQgCisgICAgICogR2V0cyBhbiBhcnJheSBvZiBTdHJpbmdzIGdpdmluZyB0aGUgTUlNRSB0eXBlcyBvZiB0aGUgZm9ybWF0cyBzdXBwb3J0ZWQKICAgICAgKiBieSByZWdpc3RlcmVkIEltYWdlV3JpdGVyIG9iamVjdHMuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgTUlNRSB0eXBlcy4KQEAgLTI3MCwxMSArMjczLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgSXRlcmF0b3Igd2hpY2ggbGlzdHMgdGhlIHJlZ2lzdGVyZWQgSW1hZ2VSZWFkZXIgb2JqZWN0cyB0aGF0Ci0gICAgICogYXJlIGFibGUgdG8gZW5jb2RlIHRoZSBzcGVjaWZpZWQgaW1hZ2UgZm9ybWF0LgorICAgICAqIEdldHMgdGhlIEl0ZXJhdG9yIHdoaWNoIGxpc3RzIHRoZSByZWdpc3RlcmVkIEltYWdlUmVhZGVyIG9iamVjdHMgdGhhdCBhcmUKKyAgICAgKiBhYmxlIHRvIGVuY29kZSB0aGUgc3BlY2lmaWVkIGltYWdlIGZvcm1hdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZm9ybWF0TmFtZSB0aGUgaW1hZ2UgZm9ybWF0IG5hbWUgc3VjaCBhcyAianBlZyIuCi0gICAgICogCisgICAgICogQHBhcmFtIGZvcm1hdE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBmb3JtYXQgbmFtZSBzdWNoIGFzICJqcGVnIi4KICAgICAgKiBAcmV0dXJuIHRoZSBJdGVyYXRvciBvZiByZWdpc3RlcmVkIEltYWdlV3JpdGVyLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8SW1hZ2VXcml0ZXI+IGdldEltYWdlV3JpdGVyc0J5Rm9ybWF0TmFtZShTdHJpbmcgZm9ybWF0TmFtZSkgewpAQCAtMjg5LDExICsyOTIsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBJdGVyYXRvciB3aGljaCBsaXN0cyB0aGUgcmVnaXN0ZXJlZCBJbWFnZVJlYWRlciBvYmplY3RzIHRoYXQKLSAgICAgKiBhcmUgYWJsZSB0byBlbmNvZGUgdGhlIHNwZWNpZmllZCBzdWZmaXguCisgICAgICogR2V0cyB0aGUgSXRlcmF0b3Igd2hpY2ggbGlzdHMgdGhlIHJlZ2lzdGVyZWQgSW1hZ2VSZWFkZXIgb2JqZWN0cyB0aGF0IGFyZQorICAgICAqIGFibGUgdG8gZW5jb2RlIHRoZSBzcGVjaWZpZWQgc3VmZml4LgogICAgICAqIAotICAgICAqIEBwYXJhbSBmaWxlU3VmZml4IHRoZSBmaWxlIHN1ZmZpeCBzdWNoIGFzICJqcGciLgotICAgICAqIAorICAgICAqIEBwYXJhbSBmaWxlU3VmZml4CisgICAgICogICAgICAgICAgICB0aGUgZmlsZSBzdWZmaXggc3VjaCBhcyAianBnIi4KICAgICAgKiBAcmV0dXJuIHRoZSBJdGVyYXRvciBvZiByZWdpc3RlcmVkIEltYWdlV3JpdGVyLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8SW1hZ2VXcml0ZXI+IGdldEltYWdlV3JpdGVyc0J5U3VmZml4KFN0cmluZyBmaWxlU3VmZml4KSB7CkBAIC0zMDYsMTEgKzMwOSwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIEl0ZXJhdG9yIHdoaWNoIGxpc3RzIHRoZSByZWdpc3RlcmVkIEltYWdlUmVhZGVyIG9iamVjdHMgdGhhdAotICAgICAqIGFyZSBhYmxlIHRvIGVuY29kZSB0aGUgc3BlY2lmaWVkIE1JTUUgdHlwZS4KKyAgICAgKiBHZXRzIHRoZSBJdGVyYXRvciB3aGljaCBsaXN0cyB0aGUgcmVnaXN0ZXJlZCBJbWFnZVJlYWRlciBvYmplY3RzIHRoYXQgYXJlCisgICAgICogYWJsZSB0byBlbmNvZGUgdGhlIHNwZWNpZmllZCBNSU1FIHR5cGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIE1JTUVUeXBlIHRoZSBNSU1FIHR5cGUgc3VjaCBhcyAiaW1hZ2UvanBlZyIuCi0gICAgICogCisgICAgICogQHBhcmFtIE1JTUVUeXBlCisgICAgICogICAgICAgICAgICB0aGUgTUlNRSB0eXBlIHN1Y2ggYXMgImltYWdlL2pwZWciLgogICAgICAqIEByZXR1cm4gdGhlIEl0ZXJhdG9yIG9mIHJlZ2lzdGVyZWQgSW1hZ2VXcml0ZXIuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBJdGVyYXRvcjxJbWFnZVdyaXRlcj4gZ2V0SW1hZ2VXcml0ZXJzQnlNSU1FVHlwZShTdHJpbmcgTUlNRVR5cGUpIHsKQEAgLTMxOCwxMiArMzIxLDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbiBJbWFnZVdyaXRlciBvYmplY3Qgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIAotICAgICAqIHNwZWNpZmllZCBJbWFnZVJlYWRlciwgb3IgcmV0dXJucyBudWxsIGlmIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBJbWFnZVJlYWRlciBpcyBub3QgcmVnaXN0ZXJlZC4gCisgICAgICogR2V0cyBhbiBJbWFnZVdyaXRlciBvYmplY3Qgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIHNwZWNpZmllZAorICAgICAqIEltYWdlUmVhZGVyLCBvciByZXR1cm5zIG51bGwgaWYgdGhlIHNwZWNpZmllZCBJbWFnZVJlYWRlciBpcyBub3QKKyAgICAgKiByZWdpc3RlcmVkLgogICAgICAqIAotICAgICAqIEBwYXJhbSByZWFkZXIgdGhlIHNwZWNpZmllZCBJbWFnZVJlYWRlci4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVhZGVyCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIEltYWdlUmVhZGVyLgogICAgICAqIEByZXR1cm4gdGhlIEltYWdlV3JpdGVyLCBvciBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2VXcml0ZXIgZ2V0SW1hZ2VXcml0ZXIoSW1hZ2VSZWFkZXIgcmVhZGVyKSB7CkBAIC0zMzEsMTIgKzMzNCwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYW4gSW1hZ2VSZWFkZXIgb2JqZWN0IHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSAKLSAgICAgKiBzcGVjaWZpZWQgSW1hZ2VXcml0ZXIsIG9yIHJldHVybnMgbnVsbCBpZiB0aGUgc3BlY2lmaWVkCi0gICAgICogSW1hZ2VXcml0ZXIgaXMgbm90IHJlZ2lzdGVyZWQuIAorICAgICAqIEdldHMgYW4gSW1hZ2VSZWFkZXIgb2JqZWN0IHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBJbWFnZVdyaXRlciwgb3IgcmV0dXJucyBudWxsIGlmIHRoZSBzcGVjaWZpZWQgSW1hZ2VXcml0ZXIgaXMgbm90CisgICAgICogcmVnaXN0ZXJlZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gd3JpdGVyIHRoZSByZWdpc3RlcmVkIEltYWdlV3JpdGVyIG9iamVjdC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gd3JpdGVyCisgICAgICogICAgICAgICAgICB0aGUgcmVnaXN0ZXJlZCBJbWFnZVdyaXRlciBvYmplY3QuCiAgICAgICogQHJldHVybiB0aGUgSW1hZ2VSZWFkZXIuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBJbWFnZVJlYWRlciBnZXRJbWFnZVJlYWRlcihJbWFnZVdyaXRlciB3cml0ZXIpIHsKQEAgLTM0NCwxNyArMzQ3LDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgSXRlcmF0b3Igb2YgSW1hZ2VXcml0ZXIgb2JqZWN0cyB3aGljaCBhcmUgYWJsZSB0bwotICAgICAqIGVuY29kZSBpbWFnZXMgd2l0aCB0aGUgc3BlY2lmaWVkIEltYWdlVHlwZVNwZWNpZmllciBhbmQKLSAgICAgKiBmb3JtYXQuCisgICAgICogR2V0cyB0aGUgSXRlcmF0b3Igb2YgSW1hZ2VXcml0ZXIgb2JqZWN0cyB3aGljaCBhcmUgYWJsZSB0byBlbmNvZGUgaW1hZ2VzCisgICAgICogd2l0aCB0aGUgc3BlY2lmaWVkIEltYWdlVHlwZVNwZWNpZmllciBhbmQgZm9ybWF0LgogICAgICAqIAotICAgICAqIEBwYXJhbSB0eXBlIHRoZSBJbWFnZVR5cGVTcGVjaWZpZXIsIHdoaWNoIGRlZmluZXMgbGF5b3V0LgotICAgICAqIEBwYXJhbSBmb3JtYXROYW1lIHRoZSBmb3JtYXQgbmFtZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gdHlwZQorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlVHlwZVNwZWNpZmllciwgd2hpY2ggZGVmaW5lcyBsYXlvdXQuCisgICAgICogQHBhcmFtIGZvcm1hdE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBmb3JtYXQgbmFtZS4KICAgICAgKiBAcmV0dXJuIHRoZSBJdGVyYXRvciBvZiBJbWFnZVdyaXRlciBvYmplY3RzLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8SW1hZ2VXcml0ZXI+IGdldEltYWdlV3JpdGVycyhJbWFnZVR5cGVTcGVjaWZpZXIgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZm9ybWF0TmFtZSkgeworICAgIHB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8SW1hZ2VXcml0ZXI+IGdldEltYWdlV3JpdGVycyhJbWFnZVR5cGVTcGVjaWZpZXIgdHlwZSwgU3RyaW5nIGZvcm1hdE5hbWUpIHsKICAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJ0eXBlIGNhbm5vdCBiZSBOVUxMIik7CiAgICAgICAgIH0KQEAgLTM3MCwzMSArMzcyLDMxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgSXRlcmF0b3Igb2YgcmVnaXN0ZXJlZCBJbWFnZVRyYW5zY29kZXJzIHdoaWNoIAotICAgICAqIGFyZSBhYmxlIHRvIHRyYW5zY29kZSB0aGUgbWV0YWRhdGEgb2YgdGhlIHNwZWNpZmllZAotICAgICAqIEltYWdlUmVhZGVyIG9iamVjdCB0byBhIHN1aXRhYmxlIG9iamVjdCBmb3IgZW5jb2RpbmcgCi0gICAgICogYnkgdGhlIHNwZWNpZmllZCBJbWFnZVdyaXRlci4KKyAgICAgKiBHZXRzIHRoZSBJdGVyYXRvciBvZiByZWdpc3RlcmVkIEltYWdlVHJhbnNjb2RlcnMgd2hpY2ggYXJlIGFibGUgdG8KKyAgICAgKiB0cmFuc2NvZGUgdGhlIG1ldGFkYXRhIG9mIHRoZSBzcGVjaWZpZWQgSW1hZ2VSZWFkZXIgb2JqZWN0IHRvIGEgc3VpdGFibGUKKyAgICAgKiBvYmplY3QgZm9yIGVuY29kaW5nIGJ5IHRoZSBzcGVjaWZpZWQgSW1hZ2VXcml0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHJlYWRlciB0aGUgc3BlY2lmaWVkIEltYWdlUmVhZGVyLgotICAgICAqIEBwYXJhbSB3cml0ZXIgdGhlIHNwZWNpZmllZCBJbWFnZVdyaXRlci4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVhZGVyCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIEltYWdlUmVhZGVyLgorICAgICAqIEBwYXJhbSB3cml0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgSW1hZ2VXcml0ZXIuCiAgICAgICogQHJldHVybiB0aGUgSXRlcmF0b3Igb2YgcmVnaXN0ZXJlZCBJbWFnZVRyYW5zY29kZXJzLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8SW1hZ2VUcmFuc2NvZGVyPiBnZXRJbWFnZVRyYW5zY29kZXJzKEltYWdlUmVhZGVyIHJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2VXcml0ZXIgd3JpdGVyKSB7CisgICAgICAgICAgICBJbWFnZVdyaXRlciB3cml0ZXIpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIHlldCIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRzIGltYWdlIGRhdGEgZnJvbSB0aGUgc3BlY2lmaWVkIEZpbGUgYW5kIGRlY29kZXMgaXQgdXNpbmcgCi0gICAgICogdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVyZWQgSW1hZ2VSZWFkZXIgb2JqZWN0LiAKLSAgICAgKiBUaGUgRmlsZSBpcyB3cmFwcGVkIGluIGFuIEltYWdlSW5wdXRTdHJlYW0uCisgICAgICogUmVhZHMgaW1hZ2UgZGF0YSBmcm9tIHRoZSBzcGVjaWZpZWQgRmlsZSBhbmQgZGVjb2RlcyBpdCB1c2luZyB0aGUKKyAgICAgKiBhcHByb3ByaWF0ZSByZWdpc3RlcmVkIEltYWdlUmVhZGVyIG9iamVjdC4gVGhlIEZpbGUgaXMgd3JhcHBlZCBpbiBhbgorICAgICAqIEltYWdlSW5wdXRTdHJlYW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIGlucHV0IHRoZSBGaWxlIHRvIGJlIHJlYWQuCi0gICAgICogCisgICAgICogQHBhcmFtIGlucHV0CisgICAgICogICAgICAgICAgICB0aGUgRmlsZSB0byBiZSByZWFkLgogICAgICAqIEByZXR1cm4gdGhlIEJ1ZmZlcmVkSW1hZ2UgZGVjb2RlZCBmcm9tIHRoZSBzcGVjaWZpZWQgRmlsZSwgb3IgbnVsbC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBCdWZmZXJlZEltYWdlIHJlYWQoRmlsZSBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGlucHV0ID09IG51bGwpIHsKQEAgLTQwNiwxNSArNDA4LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgaW1hZ2UgZGF0YSBmcm9tIHRoZSBzcGVjaWZpZWQgSW5wdXRTdHJlYW0gYW5kIGRlY29kZXMgaXQgCi0gICAgICogdXNpbmcgYW4gYXBwcm9wcmlhdGUgcmVnaXN0ZXJlZCBhbiBJbWFnZVJlYWRlciBvYmplY3QuCisgICAgICogUmVhZHMgaW1hZ2UgZGF0YSBmcm9tIHRoZSBzcGVjaWZpZWQgSW5wdXRTdHJlYW0gYW5kIGRlY29kZXMgaXQgdXNpbmcgYW4KKyAgICAgKiBhcHByb3ByaWF0ZSByZWdpc3RlcmVkIGFuIEltYWdlUmVhZGVyIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5wdXQgdGhlIElucHV0U3RyZWFtLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIEJ1ZmZlcmVkSW1hZ2UgZGVjb2RlZCBmcm9tIHRoZSBzcGVjaWZpZWQgSW5wdXRTdHJlYW0sCi0gICAgICogb3IgbnVsbC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gaW5wdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbnB1dFN0cmVhbS4KKyAgICAgKiBAcmV0dXJuIHRoZSBCdWZmZXJlZEltYWdlIGRlY29kZWQgZnJvbSB0aGUgc3BlY2lmaWVkIElucHV0U3RyZWFtLCBvcgorICAgICAqICAgICAgICAgbnVsbC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBCdWZmZXJlZEltYWdlIHJlYWQoSW5wdXRTdHJlYW0gaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChpbnB1dCA9PSBudWxsKSB7CkBAIC00MjYsMTQgKzQyOCwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRzIGltYWdlIGRhdGEgZnJvbSB0aGUgc3BlY2lmaWVkIFVSTCBhbmQgZGVjb2RlcyBpdCB1c2luZyAKLSAgICAgKiB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXJlZCBJbWFnZVJlYWRlciBvYmplY3QuIAotICAgICAqICAKLSAgICAgKiBAcGFyYW0gaW5wdXQgdGhlIFVSTCB0byBiZSByZWFkLgorICAgICAqIFJlYWRzIGltYWdlIGRhdGEgZnJvbSB0aGUgc3BlY2lmaWVkIFVSTCBhbmQgZGVjb2RlcyBpdCB1c2luZyB0aGUKKyAgICAgKiBhcHByb3ByaWF0ZSByZWdpc3RlcmVkIEltYWdlUmVhZGVyIG9iamVjdC4KICAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW5wdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBVUkwgdG8gYmUgcmVhZC4KICAgICAgKiBAcmV0dXJuIHRoZSBCdWZmZXJlZEltYWdlIGRlY29kZWQgZnJvbSB0aGUgc3BlY2lmaWVkIFVSTCwgb3IgbnVsbC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBCdWZmZXJlZEltYWdlIHJlYWQoVVJMIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAoaW5wdXQgPT0gbnVsbCkgewpAQCAtNDQzLDIwICs0NDUsMjAgQEAKICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gaW5wdXQub3BlblN0cmVhbSgpOwogICAgICAgICBCdWZmZXJlZEltYWdlIHJlcyA9IHJlYWQoc3RyZWFtKTsKICAgICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgIAorCiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgaW1hZ2UgZGF0YSBmcm9tIHRoZSBzcGVjaWZpZWQgSW1hZ2VJbnB1dFN0cmVhbSBhbmQgZGVjb2RlcyBpdCAKLSAgICAgKiB1c2luZyBhcHByb3ByaWF0ZSByZWdpc3RlcmVkIGFuIEltYWdlUmVhZGVyIG9iamVjdC4KKyAgICAgKiBSZWFkcyBpbWFnZSBkYXRhIGZyb20gdGhlIHNwZWNpZmllZCBJbWFnZUlucHV0U3RyZWFtIGFuZCBkZWNvZGVzIGl0IHVzaW5nCisgICAgICogYXBwcm9wcmlhdGUgcmVnaXN0ZXJlZCBhbiBJbWFnZVJlYWRlciBvYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIHN0cmVhbSB0aGUgSW1hZ2VJbnB1dFN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBCdWZmZXJlZEltYWdlIGRlY29kZWQgZnJvbSB0aGUgc3BlY2lmaWVkIEltYWdlSW5wdXRTdHJlYW0sCi0gICAgICogb3IgbnVsbC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gc3RyZWFtCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VJbnB1dFN0cmVhbS4KKyAgICAgKiBAcmV0dXJuIHRoZSBCdWZmZXJlZEltYWdlIGRlY29kZWQgZnJvbSB0aGUgc3BlY2lmaWVkIEltYWdlSW5wdXRTdHJlYW0sIG9yCisgICAgICogICAgICAgICBudWxsLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEJ1ZmZlcmVkSW1hZ2UgcmVhZChJbWFnZUlucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxsKSB7CkBAIC00NzgsMjUgKzQ4MCwyNSBAQAogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAvLyBTdHJlYW0gY291bGQgYmUgYWxyZWFkeSBjbG9zZWQsIHByb2NlZWQgc2lsZW50bHkgaW4gdGhpcyBjYXNlCiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCBpbWFnZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCAodXNpbmcgYW4gCi0gICAgICogYXBwcm9wcmlhdGUgSW1hZ2VXcml0ZXIpIHRvIHRoZSBzcGVjaWZpZWQgSW1hZ2VPdXRwdXRTdHJlYW0uCisgICAgICogV3JpdGVzIHRoZSBzcGVjaWZpZWQgaW1hZ2UgaW4gdGhlIHNwZWNpZmllZCBmb3JtYXQgKHVzaW5nIGFuIGFwcHJvcHJpYXRlCisgICAgICogSW1hZ2VXcml0ZXIpIHRvIHRoZSBzcGVjaWZpZWQgSW1hZ2VPdXRwdXRTdHJlYW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIGltIHRoZSBSZW5kZXJlZEltYWdlLgotICAgICAqIEBwYXJhbSBmb3JtYXROYW1lIHRoZSBmb3JtYXQgbmFtZS4KLSAgICAgKiBAcGFyYW0gb3V0cHV0IHRoZSBJbWFnZU91dHB1dFN0cmVhbSB3aGVyZSBJbWFnZSB0byBiZSB3cml0dGVuLgotICAgICAqIAorICAgICAqIEBwYXJhbSBpbQorICAgICAqICAgICAgICAgICAgdGhlIFJlbmRlcmVkSW1hZ2UuCisgICAgICogQHBhcmFtIGZvcm1hdE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBmb3JtYXQgbmFtZS4KKyAgICAgKiBAcGFyYW0gb3V0cHV0CisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VPdXRwdXRTdHJlYW0gd2hlcmUgSW1hZ2UgdG8gYmUgd3JpdHRlbi4KICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIEltYWdlIGlzIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5LCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB3cml0ZShSZW5kZXJlZEltYWdlIGltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZm9ybWF0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2VPdXRwdXRTdHJlYW0gb3V0cHV0KQorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB3cml0ZShSZW5kZXJlZEltYWdlIGltLCBTdHJpbmcgZm9ybWF0TmFtZSwgSW1hZ2VPdXRwdXRTdHJlYW0gb3V0cHV0KQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogICAgICAgICBpZiAoaW0gPT0gbnVsbCkgewpAQCAtNTA5LDcgKzUxMSw4IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJvdXRwdXQgY2Fubm90IGJlIE5VTEwiKTsKICAgICAgICAgfQogCi0gICAgICAgIEl0ZXJhdG9yPEltYWdlV3JpdGVyPiBpdCA9IGdldEltYWdlV3JpdGVycyhJbWFnZVR5cGVTcGVjaWZpZXIuY3JlYXRlRnJvbVJlbmRlcmVkSW1hZ2UoaW0pLCBmb3JtYXROYW1lKTsKKyAgICAgICAgSXRlcmF0b3I8SW1hZ2VXcml0ZXI+IGl0ID0gZ2V0SW1hZ2VXcml0ZXJzKEltYWdlVHlwZVNwZWNpZmllci5jcmVhdGVGcm9tUmVuZGVyZWRJbWFnZShpbSksCisgICAgICAgICAgICAgICAgZm9ybWF0TmFtZSk7CiAgICAgICAgIGlmIChpdC5oYXNOZXh0KCkpIHsKICAgICAgICAgICAgIEltYWdlV3JpdGVyIHdyaXRlciA9IGl0Lm5leHQoKTsKICAgICAgICAgICAgIHdyaXRlci5zZXRPdXRwdXQob3V0cHV0KTsKQEAgLTUyMiwyMCArNTI1LDIwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBzcGVjaWZpZWQgaW1hZ2UgaW4gdGhlIHNwZWNpZmllZCBmb3JtYXQgKHVzaW5nIGFuIAotICAgICAqIGFwcHJvcHJpYXRlIEltYWdlV3JpdGVyKSB0byB0aGUgc3BlY2lmaWVkIEZpbGUuCisgICAgICogV3JpdGVzIHRoZSBzcGVjaWZpZWQgaW1hZ2UgaW4gdGhlIHNwZWNpZmllZCBmb3JtYXQgKHVzaW5nIGFuIGFwcHJvcHJpYXRlCisgICAgICogSW1hZ2VXcml0ZXIpIHRvIHRoZSBzcGVjaWZpZWQgRmlsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW0gdGhlIFJlbmRlcmVkSW1hZ2UuCi0gICAgICogQHBhcmFtIGZvcm1hdE5hbWUgdGhlIGZvcm1hdCBuYW1lLgotICAgICAqIEBwYXJhbSBvdXRwdXQgdGhlIG91dHB1dCBGaWxlIHdoZXJlIEltYWdlIHRvIGJlIHdyaXR0ZW4uCi0gICAgICogCisgICAgICogQHBhcmFtIGltCisgICAgICogICAgICAgICAgICB0aGUgUmVuZGVyZWRJbWFnZS4KKyAgICAgKiBAcGFyYW0gZm9ybWF0TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGZvcm1hdCBuYW1lLgorICAgICAqIEBwYXJhbSBvdXRwdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgRmlsZSB3aGVyZSBJbWFnZSB0byBiZSB3cml0dGVuLgogICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgSW1hZ2UgaXMgd3JpdHRlbiBzdWNjZXNzZnVsbHksIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHdyaXRlKFJlbmRlcmVkSW1hZ2UgaW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmb3JtYXROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIG91dHB1dCkKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gd3JpdGUoUmVuZGVyZWRJbWFnZSBpbSwgU3RyaW5nIGZvcm1hdE5hbWUsIEZpbGUgb3V0cHV0KQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogICAgICAgICBpZiAob3V0cHV0ID09IG51bGwpIHsKQEAgLTU1MywyMCArNTU2LDIwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBzcGVjaWZpZWQgaW1hZ2UgaW4gdGhlIHNwZWNpZmllZCBmb3JtYXQgKHVzaW5nIGFuIAotICAgICAqIGFwcHJvcHJpYXRlIEltYWdlV3JpdGVyKSB0byB0aGUgc3BlY2lmaWVkIE91dHB1dFN0cmVhbS4KKyAgICAgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCBpbWFnZSBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCAodXNpbmcgYW4gYXBwcm9wcmlhdGUKKyAgICAgKiBJbWFnZVdyaXRlcikgdG8gdGhlIHNwZWNpZmllZCBPdXRwdXRTdHJlYW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIGltIHRoZSBSZW5kZXJlZEltYWdlLgotICAgICAqIEBwYXJhbSBmb3JtYXROYW1lIHRoZSBmb3JtYXQgbmFtZS4KLSAgICAgKiBAcGFyYW0gb3V0cHV0IHRoZSBPdXRwdXRTdHJlYW0gd2hlcmUgSW1hZ2UgaXMgdG8gYmUgd3JpdHRlbi4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW0KKyAgICAgKiAgICAgICAgICAgIHRoZSBSZW5kZXJlZEltYWdlLgorICAgICAqIEBwYXJhbSBmb3JtYXROYW1lCisgICAgICogICAgICAgICAgICB0aGUgZm9ybWF0IG5hbWUuCisgICAgICogQHBhcmFtIG91dHB1dAorICAgICAqICAgICAgICAgICAgdGhlIE91dHB1dFN0cmVhbSB3aGVyZSBJbWFnZSBpcyB0byBiZSB3cml0dGVuLgogICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgSW1hZ2UgaXMgd3JpdHRlbiBzdWNjZXNzZnVsbHksIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHdyaXRlKFJlbmRlcmVkSW1hZ2UgaW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmb3JtYXROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0cHV0KQorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB3cml0ZShSZW5kZXJlZEltYWdlIGltLCBTdHJpbmcgZm9ybWF0TmFtZSwgT3V0cHV0U3RyZWFtIG91dHB1dCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKICAgICAgICAgaWYgKG91dHB1dCA9PSBudWxsKSB7CkBAIC01NzksMjYgKzU4MiwyOCBAQAogICAgICAgICByZXR1cm4gcnQ7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBGaWx0ZXIgdG8gbWF0Y2ggc3BpIGJ5IGZvcm1hdCBuYW1lLgogICAgICAqLwogICAgIHN0YXRpYyBjbGFzcyBGb3JtYXRGaWx0ZXIgaW1wbGVtZW50cyBTZXJ2aWNlUmVnaXN0cnkuRmlsdGVyIHsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgbmFtZS4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG5hbWUuCisgICAgICAgICAqLwogICAgICAgICBwcml2YXRlIFN0cmluZyBuYW1lOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZm9ybWF0IGZpbHRlci4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lCisgICAgICAgICAqIEBwYXJhbSBuYW1lCisgICAgICAgICAqICAgICAgICAgICAgdGhlIG5hbWUuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgRm9ybWF0RmlsdGVyKFN0cmluZyBuYW1lKSB7CiAgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIGJvb2xlYW4gZmlsdGVyKE9iamVjdCBwcm92aWRlcikgewotICAgICAgICAgICAgSW1hZ2VSZWFkZXJXcml0ZXJTcGkgc3BpID0gKEltYWdlUmVhZGVyV3JpdGVyU3BpKSBwcm92aWRlcjsKKyAgICAgICAgICAgIEltYWdlUmVhZGVyV3JpdGVyU3BpIHNwaSA9IChJbWFnZVJlYWRlcldyaXRlclNwaSlwcm92aWRlcjsKICAgICAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KHNwaS5nZXRGb3JtYXROYW1lcygpKS5jb250YWlucyhuYW1lKTsKICAgICAgICAgfQogICAgIH0KQEAgLTYwOCwxNCArNjEzLDE4IEBACiAgICAgICovCiAgICAgc3RhdGljIGNsYXNzIEZvcm1hdEFuZEVuY29kZUZpbHRlciBleHRlbmRzIEZvcm1hdEZpbHRlciB7CiAKLSAgICAgICAgLyoqIFRoZSB0eXBlLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHR5cGUuCisgICAgICAgICAqLwogICAgICAgICBwcml2YXRlIEltYWdlVHlwZVNwZWNpZmllciB0eXBlOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgZm9ybWF0IGFuZCBlbmNvZGUgZmlsdGVyLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUKLSAgICAgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUKKyAgICAgICAgICogQHBhcmFtIHR5cGUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgdHlwZS4KKyAgICAgICAgICogQHBhcmFtIG5hbWUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgbmFtZS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBGb3JtYXRBbmRFbmNvZGVGaWx0ZXIoSW1hZ2VUeXBlU3BlY2lmaWVyIHR5cGUsIFN0cmluZyBuYW1lKSB7CiAgICAgICAgICAgICBzdXBlcihuYW1lKTsKQEAgLTYyNCw3ICs2MzMsNyBAQAogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgYm9vbGVhbiBmaWx0ZXIoT2JqZWN0IHByb3ZpZGVyKSB7Ci0gICAgICAgICAgICBJbWFnZVdyaXRlclNwaSBzcGkgPSAoSW1hZ2VXcml0ZXJTcGkpIHByb3ZpZGVyOworICAgICAgICAgICAgSW1hZ2VXcml0ZXJTcGkgc3BpID0gKEltYWdlV3JpdGVyU3BpKXByb3ZpZGVyOwogICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmZpbHRlcihwcm92aWRlcikgJiYgc3BpLmNhbkVuY29kZUltYWdlKHR5cGUpOwogICAgICAgICB9CiAgICAgfQpAQCAtNjMzLDIxICs2NDIsMjQgQEAKICAgICAgKiBGaWx0ZXIgdG8gbWF0Y2ggc3BpIGJ5IHN1ZmZpeC4KICAgICAgKi8KICAgICBzdGF0aWMgY2xhc3MgU3VmZml4RmlsdGVyIGltcGxlbWVudHMgU2VydmljZVJlZ2lzdHJ5LkZpbHRlciB7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHN1Zi4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHN1Zi4KKyAgICAgICAgICovCiAgICAgICAgIHByaXZhdGUgU3RyaW5nIHN1ZjsKIAogICAgICAgICAvKioKICAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHN1ZmZpeCBmaWx0ZXIuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gc3VmIHRoZSBzdWYKKyAgICAgICAgICogQHBhcmFtIHN1ZgorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBzdWYuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgU3VmZml4RmlsdGVyKFN0cmluZyBzdWYpIHsKICAgICAgICAgICAgIHRoaXMuc3VmID0gc3VmOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIGJvb2xlYW4gZmlsdGVyKE9iamVjdCBwcm92aWRlcikgewotICAgICAgICAgICAgSW1hZ2VSZWFkZXJXcml0ZXJTcGkgc3BpID0gKEltYWdlUmVhZGVyV3JpdGVyU3BpKSBwcm92aWRlcjsKKyAgICAgICAgICAgIEltYWdlUmVhZGVyV3JpdGVyU3BpIHNwaSA9IChJbWFnZVJlYWRlcldyaXRlclNwaSlwcm92aWRlcjsKICAgICAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KHNwaS5nZXRGaWxlU3VmZml4ZXMoKSkuY29udGFpbnMoc3VmKTsKICAgICAgICAgfQogICAgIH0KQEAgLTY1NiwyMSArNjY4LDI0IEBACiAgICAgICogRmlsdGVyIHRvIG1hdGNoIHNwaSBieSBkZWNvZGluZyBwb3NzaWJpbGl0eS4KICAgICAgKi8KICAgICBzdGF0aWMgY2xhc3MgQ2FuUmVhZEZpbHRlciBpbXBsZW1lbnRzIFNlcnZpY2VSZWdpc3RyeS5GaWx0ZXIgewotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBpbnB1dC4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGlucHV0LgorICAgICAgICAgKi8KICAgICAgICAgcHJpdmF0ZSBPYmplY3QgaW5wdXQ7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBjYW4gcmVhZCBmaWx0ZXIuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gaW5wdXQgdGhlIGlucHV0CisgICAgICAgICAqIEBwYXJhbSBpbnB1dAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBpbnB1dC4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBDYW5SZWFkRmlsdGVyKE9iamVjdCBpbnB1dCkgewogICAgICAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0OwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIGJvb2xlYW4gZmlsdGVyKE9iamVjdCBwcm92aWRlcikgewotICAgICAgICAgICAgSW1hZ2VSZWFkZXJTcGkgc3BpID0gKEltYWdlUmVhZGVyU3BpKSBwcm92aWRlcjsKKyAgICAgICAgICAgIEltYWdlUmVhZGVyU3BpIHNwaSA9IChJbWFnZVJlYWRlclNwaSlwcm92aWRlcjsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHNwaS5jYW5EZWNvZGVJbnB1dChpbnB1dCk7CiAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CkBAIC02ODQsMTMgKzY5OSwxNiBAQAogICAgICAqLwogICAgIHN0YXRpYyBjbGFzcyBTcGlJdGVyYXRvclRvV3JpdGVyc0l0ZXJhdG9yV3JhcHBlciBpbXBsZW1lbnRzIEl0ZXJhdG9yPEltYWdlV3JpdGVyPiB7CiAKLSAgICAgICAgLyoqIFRoZSBiYWNrZW5kLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGJhY2tlbmQuCisgICAgICAgICAqLwogICAgICAgICBwcml2YXRlIEl0ZXJhdG9yPEltYWdlV3JpdGVyU3BpPiBiYWNrZW5kOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgc3BpIGl0ZXJhdG9yIHRvIHdyaXRlcnMgaXRlcmF0b3Igd3JhcHBlci4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBiYWNrZW5kIHRoZSBiYWNrZW5kCisgICAgICAgICAqIEBwYXJhbSBiYWNrZW5kCisgICAgICAgICAqICAgICAgICAgICAgdGhlIGJhY2tlbmQuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgU3BpSXRlcmF0b3JUb1dyaXRlcnNJdGVyYXRvcldyYXBwZXIoSXRlcmF0b3I8SW1hZ2VXcml0ZXJTcGk+IGJhY2tlbmQpIHsKICAgICAgICAgICAgIHRoaXMuYmFja2VuZCA9IGJhY2tlbmQ7CkBAIC02OTksNyArNzE3LDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIE5leHQuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBpbWFnZSB3cml0ZXIKKyAgICAgICAgICogQHJldHVybiB0aGUgaW1hZ2Ugd3JpdGVyLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIEltYWdlV3JpdGVyIG5leHQoKSB7CiAgICAgICAgICAgICB0cnkgewpAQCAtNzEzLDcgKzczMSw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBDaGVja3MgZm9yIG5leHQuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHN1Y2Nlc3NmdWwKKyAgICAgICAgICogQHJldHVybiB0cnVlLCBpZiBzdWNjZXNzZnVsLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKICAgICAgICAgICAgIHJldHVybiBiYWNrZW5kLmhhc05leHQoKTsKQEAgLTcyMyw3ICs3NDEsOCBAQAogICAgICAgICAgKiBSZW1vdmVzIHRoZS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVXNlIGRlcmVnaXN0ZXJTZXJ2aWNlcHJvdmlkZXIgaW5zdGVhZCBvZiBJdGVyYXRvci5yZW1vdmUoKSIpOworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiVXNlIGRlcmVnaXN0ZXJTZXJ2aWNlcHJvdmlkZXIgaW5zdGVhZCBvZiBJdGVyYXRvci5yZW1vdmUoKSIpOwogICAgICAgICB9CiAgICAgfQogCkBAIC03MzEsMTQgKzc1MCwxNyBAQAogICAgICAqIFdyYXBzIHNwaSdzIGl0ZXJhdG9yIHRvIEltYWdlUmVhZGVyIGl0ZXJhdG9yLgogICAgICAqLwogICAgIHN0YXRpYyBjbGFzcyBTcGlJdGVyYXRvclRvUmVhZGVyc0l0ZXJhdG9yV3JhcHBlciBpbXBsZW1lbnRzIEl0ZXJhdG9yPEltYWdlUmVhZGVyPiB7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIGJhY2tlbmQuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBiYWNrZW5kLgorICAgICAgICAgKi8KICAgICAgICAgcHJpdmF0ZSBJdGVyYXRvcjxJbWFnZVJlYWRlclNwaT4gYmFja2VuZDsKIAogICAgICAgICAvKioKICAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHNwaSBpdGVyYXRvciB0byByZWFkZXJzIGl0ZXJhdG9yIHdyYXBwZXIuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gYmFja2VuZCB0aGUgYmFja2VuZAorICAgICAgICAgKiBAcGFyYW0gYmFja2VuZAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBiYWNrZW5kLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIFNwaUl0ZXJhdG9yVG9SZWFkZXJzSXRlcmF0b3JXcmFwcGVyKEl0ZXJhdG9yPEltYWdlUmVhZGVyU3BpPiBiYWNrZW5kKSB7CiAgICAgICAgICAgICB0aGlzLmJhY2tlbmQgPSBiYWNrZW5kOwpAQCAtNzQ3LDcgKzc2OSw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBOZXh0LgogICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgaW1hZ2UgcmVhZGVyCisgICAgICAgICAqIEByZXR1cm4gdGhlIGltYWdlIHJlYWRlci4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBJbWFnZVJlYWRlciBuZXh0KCkgewogICAgICAgICAgICAgdHJ5IHsKQEAgLTc2MSw3ICs3ODMsNyBAQAogICAgICAgICAvKioKICAgICAgICAgICogQ2hlY2tzIGZvciBuZXh0LgogICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0cnVlLCBpZiBzdWNjZXNzZnVsCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgc3VjY2Vzc2Z1bC4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CiAgICAgICAgICAgICByZXR1cm4gYmFja2VuZC5oYXNOZXh0KCk7CkBAIC03NzEsNyArNzkzLDggQEAKICAgICAgICAgICogUmVtb3ZlcyB0aGUuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVzZSBkZXJlZ2lzdGVyU2VydmljZXByb3ZpZGVyIGluc3RlYWQgb2YgSXRlcmF0b3IucmVtb3ZlKCkiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlVzZSBkZXJlZ2lzdGVyU2VydmljZXByb3ZpZGVyIGluc3RlYWQgb2YgSXRlcmF0b3IucmVtb3ZlKCkiKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL0ltYWdlUmVhZFBhcmFtLmphdmEgYi9hd3QvamF2YXgvaW1hZ2Vpby9JbWFnZVJlYWRQYXJhbS5qYXZhCmluZGV4IGU2N2VkN2QuLjljYzVjNWYgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL0ltYWdlUmVhZFBhcmFtLmphdmEKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vSW1hZ2VSZWFkUGFyYW0uamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBTZXJnZXkgSS4gU2FsaXNoZXYKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4yICQKICAqLworCiBwYWNrYWdlIGphdmF4LmltYWdlaW87CiAKIGltcG9ydCBqYXZhLmF3dC5EaW1lbnNpb247CkBAIC0yOSw0NSArMzAsNTAgQEAKICAqLwogCiAvKioKLSAqIFRoZSBJbWFnZVJlYWRQYXJhbSBjbGFzcyBwcm92aWRlcyBpbmZvcm1hdGlvbiB0byB0aGUgSW1hZ2VSZWFkZXIgYWJvdXQKLSAqIGhvdyBhbiBpbWFnZSBpcyB0byBiZSBkZWNvZGVkLgorICogVGhlIEltYWdlUmVhZFBhcmFtIGNsYXNzIHByb3ZpZGVzIGluZm9ybWF0aW9uIHRvIHRoZSBJbWFnZVJlYWRlciBhYm91dCBob3cgYW4KKyAqIGltYWdlIGlzIHRvIGJlIGRlY29kZWQuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCi0KIHB1YmxpYyBjbGFzcyBJbWFnZVJlYWRQYXJhbSBleHRlbmRzIElJT1BhcmFtIHsKIAotICAgIC8qKiAKLSAgICAgKiBUaGlzIGZsYWcgaW5kaWNhdGVzIGlmIHRoaXMgSW1hZ2VSZWFkUGFyYW0gc3VwcG9ydHMgc2V0dGluZyB0aGUgc291cmNlIAotICAgICAqIHJlbmRlcmluZyBzaXplLiAgCisgICAgLyoqCisgICAgICogVGhpcyBmbGFnIGluZGljYXRlcyBpZiB0aGlzIEltYWdlUmVhZFBhcmFtIHN1cHBvcnRzIHNldHRpbmcgdGhlIHNvdXJjZQorICAgICAqIHJlbmRlcmluZyBzaXplLgogICAgICAqLwogICAgIHByb3RlY3RlZCBib29sZWFuIGNhblNldFNvdXJjZVJlbmRlclNpemU7Ci0gICAgCi0gICAgLyoqIAotICAgICAqIFRoZSBkZXN0aW5hdGlvbiBCdWZmZXJlZEltYWdlLiAKKworICAgIC8qKgorICAgICAqIFRoZSBkZXN0aW5hdGlvbiBCdWZmZXJlZEltYWdlLgogICAgICAqLwogICAgIHByb3RlY3RlZCBCdWZmZXJlZEltYWdlIGRlc3RpbmF0aW9uOwotICAgIAotICAgIC8qKiBUaGUgZGVzdGluYXRpb24gYmFuZHMuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzdGluYXRpb24gYmFuZHMuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGludFtdIGRlc3RpbmF0aW9uQmFuZHM7Ci0gICAgCi0gICAgLyoqIAotICAgICAqIFRoZSBtaW5pbXVtIHByb2dyZXNzaXZlIHBhc3MuICAKKworICAgIC8qKgorICAgICAqIFRoZSBtaW5pbXVtIHByb2dyZXNzaXZlIHBhc3MuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBtaW5Qcm9ncmVzc2l2ZVBhc3M7Ci0gICAgCi0gICAgLyoqIAotICAgICAqIFRoZSBudW1iZXIgb2YgcHJvZ3Jlc3NpdmUgcGFzc2VzLiAgCisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIHByb2dyZXNzaXZlIHBhc3Nlcy4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IG51bVByb2dyZXNzaXZlUGFzc2VzOwotICAgIAotICAgIC8qKiBUaGUgc291cmNlIHJlbmRlciBzaXplLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHNvdXJjZSByZW5kZXIgc2l6ZS4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgRGltZW5zaW9uIHNvdXJjZVJlbmRlclNpemU7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBJbWFnZVJlYWRlclBhcmFtIHN1cHBvcnRzIHJlbmRlcmluZyBhCi0gICAgICogc291cmNlIGltYWdlIGF0IGFuIGFyYml0cmFyeSBzaXplLgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIEltYWdlUmVhZGVyUGFyYW0gc3VwcG9ydHMgcmVuZGVyaW5nIGEgc291cmNlIGltYWdlCisgICAgICogYXQgYW4gYXJiaXRyYXJ5IHNpemUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgSW1hZ2VSZWFkZXJQYXJhbSBzdXBwb3J0cyByZW5kZXJpbmcgYQotICAgICAqIHNvdXJjZSBpbWFnZSBhdCBhbiBhcmJpdHJhcnkgc2l6ZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBJbWFnZVJlYWRlclBhcmFtIHN1cHBvcnRzIHJlbmRlcmluZyBhIHNvdXJjZSBpbWFnZQorICAgICAqICAgICAgICAgYXQgYW4gYXJiaXRyYXJ5IHNpemUsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjYW5TZXRTb3VyY2VSZW5kZXJTaXplKCkgewogICAgICAgICByZXR1cm4gY2FuU2V0U291cmNlUmVuZGVyU2l6ZTsKQEAgLTkyLDExICs5OCw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgaW5kZXggb2YgdGhlIG1heGltdW0gcGFzcyB0byBiZSBkZWNvZGVkLgotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgSW50ZWdlci5NQVhfVkFMVUUsIGlmIAotICAgICAqIGdldFNvdXJjZU51bVByb2dyZXNzaXZlUGFzc2VzKCkgbWV0aG9kIHJldHVybnMgdmFsdWUKLSAgICAgKiB0aGF0IGlzIGVxdWFsIHRvIEludGVnZXIuTUFYX1ZBTFVFLiBPdGhlcndpc2UKLSAgICAgKiB0aGlzIG1ldGhvZCByZXR1cm5zIAorICAgICAqIEdldHMgdGhlIGluZGV4IG9mIHRoZSBtYXhpbXVtIHBhc3MgdG8gYmUgZGVjb2RlZC4gVGhpcyBtZXRob2QgcmV0dXJucworICAgICAqIEludGVnZXIuTUFYX1ZBTFVFLCBpZiBnZXRTb3VyY2VOdW1Qcm9ncmVzc2l2ZVBhc3NlcygpIG1ldGhvZCByZXR1cm5zCisgICAgICogdmFsdWUgdGhhdCBpcyBlcXVhbCB0byBJbnRlZ2VyLk1BWF9WQUxVRS4gT3RoZXJ3aXNlIHRoaXMgbWV0aG9kIHJldHVybnMKICAgICAgKiBnZXRTb3VyY2VNaW5Qcm9ncmVzc2l2ZVBhc3MoKSArIGdldFNvdXJjZU51bVByb2dyZXNzaXZlUGFzc2VzKCkgLSAxLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBtYXhpbXVtIHBhc3MgdG8gYmUgZGVjb2RlZC4KQEAgLTEwOSwxOSArMTEzLDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgaW5kZXggb2YgdGhlIG1pbmltdW0gcHJvZ3Jlc3NpdmUgcGFzcyB0aGF0IGlzIGRlY29kZWQsCi0gICAgICogZGVmYXVsdCBpcyAwLiAKKyAgICAgKiBHZXRzIHRoZSBpbmRleCBvZiB0aGUgbWluaW11bSBwcm9ncmVzc2l2ZSBwYXNzIHRoYXQgaXMgZGVjb2RlZCwgZGVmYXVsdAorICAgICAqIGlzIDAuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIG1pbmltdW0gcHJvZ3Jlc3NpdmUgcGFzcyB0aGF0IGlzIGRlY29kZWQsCi0gICAgICogZGVmYXVsdCBpcyAwLgorICAgICAqICAgICAgICAgZGVmYXVsdCBpcyAwLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0U291cmNlTWluUHJvZ3Jlc3NpdmVQYXNzKCkgewogICAgICAgICByZXR1cm4gbWluUHJvZ3Jlc3NpdmVQYXNzOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBwcm9ncmVzc2l2ZSBwYXNzZXMuCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgSW50ZWdlci5NQVhfVkFMVUUuIAorICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBwcm9ncmVzc2l2ZSBwYXNzZXMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzCisgICAgICogSW50ZWdlci5NQVhfVkFMVUUuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHByb2dyZXNzaXZlIHBhc3Nlcy4KICAgICAgKi8KQEAgLTEzMCw4ICsxMzQsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGRpbWVuc2lvbiBvZiBzb3VyY2UgaW1hZ2Ugd2hpY2ggd2lsbCBiZSByZW5kZXJlZAotICAgICAqIGR1cmluZyBkZWNvZGluZyBwcm9jZXNzLgorICAgICAqIEdldHMgdGhlIGRpbWVuc2lvbiBvZiBzb3VyY2UgaW1hZ2Ugd2hpY2ggd2lsbCBiZSByZW5kZXJlZCBkdXJpbmcgZGVjb2RpbmcKKyAgICAgKiBwcm9jZXNzLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIHNvdXJjZSByZW5kZXIgc2l6ZS4KICAgICAgKi8KQEAgLTE0MCwxMSArMTQ0LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgc3BlY2lmaWVkIGRlc3RpbmF0aW9uIGltYWdlLgotICAgICAqIFRoaXMgaW1hZ2Ugd2lsbCBiZSB1c2VkIGJ5IHJlYWQsIHJlYWRBbGwsIGFuZCByZWFkUmFzdGVyIG1ldGhvZHMsCi0gICAgICogYW5kIGEgcmVmZXJlbmNlIHRvIGl0IHdpbGwgYmUgcmV0dXJuZWQgYnkgdGhvc2UgbWV0aG9kcy4KKyAgICAgKiBTZXRzIHRoZSBzcGVjaWZpZWQgZGVzdGluYXRpb24gaW1hZ2UuIFRoaXMgaW1hZ2Ugd2lsbCBiZSB1c2VkIGJ5IHJlYWQsCisgICAgICogcmVhZEFsbCwgYW5kIHJlYWRSYXN0ZXIgbWV0aG9kcywgYW5kIGEgcmVmZXJlbmNlIHRvIGl0IHdpbGwgYmUgcmV0dXJuZWQKKyAgICAgKiBieSB0aG9zZSBtZXRob2RzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbiB0aGUgZGVzdGluYXRpb24gaW1hZ2UuCisgICAgICogQHBhcmFtIGRlc3RpbmF0aW9uCisgICAgICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gaW1hZ2UuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RGVzdGluYXRpb24oQnVmZmVyZWRJbWFnZSBkZXN0aW5hdGlvbikgewogICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb247CkBAIC0xNTMsNyArMTU4LDggQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBpbmRpY2VzIG9mIHRoZSBkZXN0aW5hdGlvbiBiYW5kcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGVzdGluYXRpb25CYW5kcyB0aGUgaW5kaWNlcyBvZiB0aGUgZGVzdGluYXRpb24gYmFuZHMuCisgICAgICogQHBhcmFtIGRlc3RpbmF0aW9uQmFuZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRpY2VzIG9mIHRoZSBkZXN0aW5hdGlvbiBiYW5kcy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXREZXN0aW5hdGlvbkJhbmRzKGludFtdIGRlc3RpbmF0aW9uQmFuZHMpIHsKICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbkJhbmRzID0gZGVzdGluYXRpb25CYW5kczsKQEAgLTE2Nyw4ICsxNzMsMTAgQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBzb3VyY2UgcHJvZ3Jlc3NpdmUgcGFzc2VzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBtaW5QYXNzIHRoZSBpbmRleCBvZiB0aGUgbWluaW11bSBwYXNzIHRvIGJlIGRlY29kZWQuCi0gICAgICogQHBhcmFtIG51bVBhc3NlcyB0aGUgbnVtYmVyIG9mIHBhc3NlcyB0byBiZSBkZWNvZGVkLgorICAgICAqIEBwYXJhbSBtaW5QYXNzCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIG1pbmltdW0gcGFzcyB0byBiZSBkZWNvZGVkLgorICAgICAqIEBwYXJhbSBudW1QYXNzZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgcGFzc2VzIHRvIGJlIGRlY29kZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0U291cmNlUHJvZ3Jlc3NpdmVQYXNzZXMoaW50IG1pblBhc3MsIGludCBudW1QYXNzZXMpIHsKICAgICAgICAgbWluUHJvZ3Jlc3NpdmVQYXNzID0gbWluUGFzczsKQEAgLTE3NiwxOCArMTg0LDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGltZW5zaW9uIHNpemUgb2Ygc291cmNlIGltYWdlIGlmIGFuCi0gICAgICogaW1hZ2UgY2FuIGJlIHJlbmRlcmVkIGF0IGFuIGFyYml0cmFyeSBzaXplLgorICAgICAqIFNldHMgdGhlIGRpbWVuc2lvbiBzaXplIG9mIHNvdXJjZSBpbWFnZSBpZiBhbiBpbWFnZSBjYW4gYmUgcmVuZGVyZWQgYXQgYW4KKyAgICAgKiBhcmJpdHJhcnkgc2l6ZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSBvZiByZW5kZXJlZCBpbWFnZS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHRoZSB1bnN1cHBvcnRlZCBvcGVyYXRpb24gZXhjZXB0aW9uCisgICAgICogQHBhcmFtIHNpemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzaXplIG9mIHJlbmRlcmVkIGltYWdlLgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICB0aGUgdW5zdXBwb3J0ZWQgb3BlcmF0aW9uIGV4Y2VwdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VSZW5kZXJTaXplKERpbWVuc2lvbiBzaXplKSB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gewogICAgICAgICBpZiAoIWNhblNldFNvdXJjZVJlbmRlclNpemUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2FuJ3Qgc2V0IHNvdXJjZSByZW5kZXJlciBzaXplIik7CiAgICAgICAgIH0KLSAgICAgICAgc291cmNlUmVuZGVyU2l6ZSA9IHNpemU7ICAgICAgICAKKyAgICAgICAgc291cmNlUmVuZGVyU2l6ZSA9IHNpemU7CiAgICAgfQogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9JbWFnZVJlYWRlci5qYXZhIGIvYXd0L2phdmF4L2ltYWdlaW8vSW1hZ2VSZWFkZXIuamF2YQppbmRleCA3ODBkZTI2Li5jZjI4MmVkIDEwMDY0NAotLS0gYS9hd3QvamF2YXgvaW1hZ2Vpby9JbWFnZVJlYWRlci5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL0ltYWdlUmVhZGVyLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgUnVzdGVtIFYuIFJhZmlrb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4zICQKICAqLworCiBwYWNrYWdlIGphdmF4LmltYWdlaW87CiAKIGltcG9ydCBqYXZheC5pbWFnZWlvLnNwaS5JbWFnZVJlYWRlclNwaTsKQEAgLTM3LDU2ICszOCw3NyBAQAogaW1wb3J0IGphdmEuYXd0Lio7CiAKIC8qKgotICogVGhlIEltYWdlUmVhZGVyIGNsYXNzIGlzIGFuIGFic3RyYWN0IGNsYXNzIGZvciBkZWNvZGluZyBpbWFnZXMuCi0gKiBJbWFnZVJlYWRlciBvYmplY3RzIGFyZSBpbnN0YW50aWF0ZWQgYnkgdGhlIHNlcnZpY2UgcHJvdmlkZXIgCi0gKiBpbnRlcmZhY2UsIEltYWdlUmVhZGVyU3BpIGNsYXNzLCBmb3IgdGhlIHNwZWNpZmljIGZvcm1hdC4gCi0gKiBJbWFnZVJlYWRlclNwaSBjbGFzcyBzaG91bGQgYmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBJSU9SZWdpc3RyeSwgCi0gKiB3aGljaCB1c2VzIHRoZW0gZm9yIGZvcm1hdCByZWNvZ25pdGlvbiBhbmQgcHJlc2VudGF0aW9uIG9mIGF2YWlsYWJsZSAKLSAqIGZvcm1hdCByZWFkZXJzIGFuZCB3cml0ZXJzLgorICogVGhlIEltYWdlUmVhZGVyIGNsYXNzIGlzIGFuIGFic3RyYWN0IGNsYXNzIGZvciBkZWNvZGluZyBpbWFnZXMuIEltYWdlUmVhZGVyCisgKiBvYmplY3RzIGFyZSBpbnN0YW50aWF0ZWQgYnkgdGhlIHNlcnZpY2UgcHJvdmlkZXIgaW50ZXJmYWNlLCBJbWFnZVJlYWRlclNwaQorICogY2xhc3MsIGZvciB0aGUgc3BlY2lmaWMgZm9ybWF0LiBJbWFnZVJlYWRlclNwaSBjbGFzcyBzaG91bGQgYmUgcmVnaXN0ZXJlZAorICogd2l0aCB0aGUgSUlPUmVnaXN0cnksIHdoaWNoIHVzZXMgdGhlbSBmb3IgZm9ybWF0IHJlY29nbml0aW9uIGFuZCBwcmVzZW50YXRpb24KKyAqIG9mIGF2YWlsYWJsZSBmb3JtYXQgcmVhZGVycyBhbmQgd3JpdGVycy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBJbWFnZVJlYWRlciB7CiAKLSAgICAvKiogVGhlIG9yaWdpbmF0aW5nIHByb3ZpZGVyLiAqLworICAgIC8qKgorICAgICAqIFRoZSBvcmlnaW5hdGluZyBwcm92aWRlci4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgSW1hZ2VSZWFkZXJTcGkgb3JpZ2luYXRpbmdQcm92aWRlcjsKIAotICAgIC8qKiBUaGUgaW5wdXQgb2JqZWN0IHN1Y2ggYXMgSW1hZ2VJbnB1dFN0cmVhbS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgaW5wdXQgb2JqZWN0IHN1Y2ggYXMgSW1hZ2VJbnB1dFN0cmVhbS4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgT2JqZWN0IGlucHV0OwogCi0gICAgLyoqIFRoZSBzZWVrIGZvcndhcmQgb25seS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgc2VlayBmb3J3YXJkIG9ubHkuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gc2Vla0ZvcndhcmRPbmx5OwogCi0gICAgLyoqIAotICAgICAqIFRoZSBpZ25vcmUgbWV0YWRhdGEgZmxhZyBpbmRpY2F0ZXMgd2hldGhlciBjdXJyZW50IGlucHV0IHNvdXJjZSAKLSAgICAgKiBoYXMgYmVlbiBtYXJrZWQgYXMgbWV0YWRhdGEgaXMgYWxsb3dlZCB0byBiZSBpZ25vcmVkIGJ5IHNldElucHV0LiAKKyAgICAvKioKKyAgICAgKiBUaGUgaWdub3JlIG1ldGFkYXRhIGZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgY3VycmVudCBpbnB1dCBzb3VyY2UgaGFzIGJlZW4KKyAgICAgKiBtYXJrZWQgYXMgbWV0YWRhdGEgaXMgYWxsb3dlZCB0byBiZSBpZ25vcmVkIGJ5IHNldElucHV0LgogICAgICAqLwogICAgIHByb3RlY3RlZCBib29sZWFuIGlnbm9yZU1ldGFkYXRhOwogCi0gICAgLyoqIFRoZSBtaW5pbXVtIGluZGV4LiAqLworICAgIC8qKgorICAgICAqIFRoZSBtaW5pbXVtIGluZGV4LgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgbWluSW5kZXg7CiAKLSAgICAvKiogVGhlIGF2YWlsYWJsZSBsb2NhbGVzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBhdmFpbGFibGUgbG9jYWxlcy4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgTG9jYWxlW10gYXZhaWxhYmxlTG9jYWxlczsKIAotICAgIC8qKiBUaGUgbG9jYWxlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBsb2NhbGUuCisgICAgICovCiAgICAgcHJvdGVjdGVkIExvY2FsZSBsb2NhbGU7CiAKLSAgICAvKiogVGhlIGxpc3Qgb2Ygd2FybmluZyBsaXN0ZW5lcnMuICovCisgICAgLyoqCisgICAgICogVGhlIGxpc3Qgb2Ygd2FybmluZyBsaXN0ZW5lcnMuCisgICAgICovCiAgICAgcHJvdGVjdGVkIExpc3Q8SUlPUmVhZFdhcm5pbmdMaXN0ZW5lcj4gd2FybmluZ0xpc3RlbmVyczsKIAotICAgIC8qKiBUaGUgbGlzdCBvZiB3YXJuaW5nIGxvY2FsZXMuICovCisgICAgLyoqCisgICAgICogVGhlIGxpc3Qgb2Ygd2FybmluZyBsb2NhbGVzLgorICAgICAqLwogICAgIHByb3RlY3RlZCBMaXN0PExvY2FsZT4gd2FybmluZ0xvY2FsZXM7CiAKLSAgICAvKiogVGhlIGxpc3Qgb2YgcHJvZ3Jlc3MgbGlzdGVuZXJzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBsaXN0IG9mIHByb2dyZXNzIGxpc3RlbmVycy4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgTGlzdDxJSU9SZWFkUHJvZ3Jlc3NMaXN0ZW5lcj4gcHJvZ3Jlc3NMaXN0ZW5lcnM7CiAKLSAgICAvKiogVGhlIGxpc3Qgb2YgdXBkYXRlIGxpc3RlbmVycy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgbGlzdCBvZiB1cGRhdGUgbGlzdGVuZXJzLgorICAgICAqLwogICAgIHByb3RlY3RlZCBMaXN0PElJT1JlYWRVcGRhdGVMaXN0ZW5lcj4gdXBkYXRlTGlzdGVuZXJzOwogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEltYWdlUmVhZGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBvcmlnaW5hdGluZ1Byb3ZpZGVyIHRoZSBJbWFnZVJlYWRlclNwaSB3aGljaCAKLSAgICAgKiBpbnN0YW50aWVzIHRoaXMgSW1hZ2VSZWFkZXIuCisgICAgICogQHBhcmFtIG9yaWdpbmF0aW5nUHJvdmlkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVJlYWRlclNwaSB3aGljaCBpbnN0YW50aWF0ZXMgdGhpcyBJbWFnZVJlYWRlci4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgSW1hZ2VSZWFkZXIoSW1hZ2VSZWFkZXJTcGkgb3JpZ2luYXRpbmdQcm92aWRlcikgewogICAgICAgICB0aGlzLm9yaWdpbmF0aW5nUHJvdmlkZXIgPSBvcmlnaW5hdGluZ1Byb3ZpZGVyOwpAQCAtOTYsMTUgKzExOCwxNSBAQAogICAgICAqIEdldHMgdGhlIGZvcm1hdCBuYW1lIG9mIHRoaXMgaW5wdXQgc291cmNlLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGZvcm1hdCBuYW1lIG9mIHRoaXMgaW5wdXQgc291cmNlLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1hdE5hbWUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICByZXR1cm4gb3JpZ2luYXRpbmdQcm92aWRlci5nZXRGb3JtYXROYW1lcygpWzBdOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIEltYWdlUmVhZGVyU3BpIHdoaWNoIGluc3RhbnRpYXRlZCB0aGlzIEltYWdlUmVhZGVyLiAKKyAgICAgKiBHZXRzIHRoZSBJbWFnZVJlYWRlclNwaSB3aGljaCBpbnN0YW50aWF0ZWQgdGhpcyBJbWFnZVJlYWRlci4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBJbWFnZVJlYWRlclNwaS4KICAgICAgKi8KQEAgLTExMywxNCArMTM1LDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgc3BlY2lmaWVkIE9iamVjdCBhcyB0aGUgaW5wdXQgc291cmNlIG9mIHRoaXMgSW1hZ2VSZWFkZXIuIAorICAgICAqIFNldHMgdGhlIHNwZWNpZmllZCBPYmplY3QgYXMgdGhlIGlucHV0IHNvdXJjZSBvZiB0aGlzIEltYWdlUmVhZGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbnB1dCB0aGUgaW5wdXQgc291cmNlLCBpdCBjYW4gCi0gICAgICogYmUgYW4gSW1hZ2VJbnB1dFN0cmVhbSBvciBvdGhlciBzdXBwb3J0ZWQgb2JqZWN0cy4KLSAgICAgKiBAcGFyYW0gc2Vla0ZvcndhcmRPbmx5IGluZGljYXRlcyB3aGV0aGVyIHRoZSBzdHJlYW0gbXVzdAotICAgICAqIGJlIHJlYWQgc2VxdWVudGlhbGx5IGZyb20gaXRzIGN1cnJlbnQgc3RhcnRpbmcgcG9pbnQuCi0gICAgICogQHBhcmFtIGlnbm9yZU1ldGFkYXRhIHBhcmFtZXRlciB3aGljaCBpbmRpY2F0ZXMKLSAgICAgKiBpZiBtZXRhZGF0YSBtYXkgYmUgaWdub3JlZCBkdXJpbmcgcmVhZHMgb3Igbm90LgorICAgICAqIEBwYXJhbSBpbnB1dAorICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IHNvdXJjZSwgaXQgY2FuIGJlIGFuIEltYWdlSW5wdXRTdHJlYW0gb3Igb3RoZXIKKyAgICAgKiAgICAgICAgICAgIHN1cHBvcnRlZCBvYmplY3RzLgorICAgICAqIEBwYXJhbSBzZWVrRm9yd2FyZE9ubHkKKyAgICAgKiAgICAgICAgICAgIGluZGljYXRlcyB3aGV0aGVyIHRoZSBzdHJlYW0gbXVzdCBiZSByZWFkIHNlcXVlbnRpYWxseSBmcm9tCisgICAgICogICAgICAgICAgICBpdHMgY3VycmVudCBzdGFydGluZyBwb2ludC4KKyAgICAgKiBAcGFyYW0gaWdub3JlTWV0YWRhdGEKKyAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlciB3aGljaCBpbmRpY2F0ZXMgaWYgbWV0YWRhdGEgbWF5IGJlIGlnbm9yZWQgZHVyaW5nCisgICAgICogICAgICAgICAgICByZWFkcyBvciBub3QuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0SW5wdXQoT2JqZWN0IGlucHV0LCBib29sZWFuIHNlZWtGb3J3YXJkT25seSwgYm9vbGVhbiBpZ25vcmVNZXRhZGF0YSkgewogICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkgewpAQCAtMTM3LDkgKzE2Miw5IEBACiAgICAgLyoqCiAgICAgICogQ2hlY2tzIGlmIGlzIHN1cHBvcnRlZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5wdXQgdGhlIGlucHV0Ci0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiBpcyBzdXBwb3J0ZWQKKyAgICAgKiBAcGFyYW0gaW5wdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnB1dC4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIHN1cHBvcnRlZC4KICAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gaXNTdXBwb3J0ZWQoT2JqZWN0IGlucHV0KSB7CiAgICAgICAgIEltYWdlUmVhZGVyU3BpIHNwaSA9IGdldE9yaWdpbmF0aW5nUHJvdmlkZXIoKTsKQEAgLTE1OCwxMCArMTgzLDEyIEBACiAgICAgICogU2V0cyB0aGUgc3BlY2lmaWVkIE9iamVjdCBhcyB0aGUgaW5wdXQgc291cmNlIG9mIHRoaXMgSW1hZ2VSZWFkZXIuCiAgICAgICogTWV0YWRhdGEgaXMgbm90IGlnbm9yZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGlucHV0IHRoZSBpbnB1dCBzb3VyY2UsIGl0IGNhbiAKLSAgICAgKiBiZSBhbiBJbWFnZUlucHV0U3RyZWFtIG9yIG90aGVyIHN1cHBvcnRlZCBvYmplY3RzLgotICAgICAqIEBwYXJhbSBzZWVrRm9yd2FyZE9ubHkgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0cmVhbSBtdXN0Ci0gICAgICogYmUgcmVhZCBzZXF1ZW50aWFsbHkgZnJvbSBpdHMgY3VycmVudCBzdGFydGluZyBwb2ludC4KKyAgICAgKiBAcGFyYW0gaW5wdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnB1dCBzb3VyY2UsIGl0IGNhbiBiZSBhbiBJbWFnZUlucHV0U3RyZWFtIG9yIG90aGVyCisgICAgICogICAgICAgICAgICBzdXBwb3J0ZWQgb2JqZWN0cy4KKyAgICAgKiBAcGFyYW0gc2Vla0ZvcndhcmRPbmx5CisgICAgICogICAgICAgICAgICBpbmRpY2F0ZXMgd2hldGhlciB0aGUgc3RyZWFtIG11c3QgYmUgcmVhZCBzZXF1ZW50aWFsbHkgZnJvbQorICAgICAqICAgICAgICAgICAgaXRzIGN1cnJlbnQgc3RhcnRpbmcgcG9pbnQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0SW5wdXQoT2JqZWN0IGlucHV0LCBib29sZWFuIHNlZWtGb3J3YXJkT25seSkgewogICAgICAgICBzZXRJbnB1dChpbnB1dCwgc2Vla0ZvcndhcmRPbmx5LCBmYWxzZSk7CkBAIC0xNzEsOCArMTk4LDggQEAKICAgICAgKiBTZXRzIHRoZSBzcGVjaWZpZWQgT2JqZWN0IGFzIHRoZSBpbnB1dCBzb3VyY2Ugb2YgdGhpcyBJbWFnZVJlYWRlci4KICAgICAgKiBNZXRhZGF0YSBpcyBub3QgaWdub3JlZCBhbmQgZm9yd2FyZCBzZWVraW5nIGlzIG5vdCByZXF1aXJlZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5wdXQgdGhlIGlucHV0IHNvdXJjZSwgaXQgY2FuIAotICAgICAqIGJlIEltYWdlSW5wdXRTdHJlYW0gb3Igb3RoZXIgb2JqZWN0cy4KKyAgICAgKiBAcGFyYW0gaW5wdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnB1dCBzb3VyY2UsIGl0IGNhbiBiZSBJbWFnZUlucHV0U3RyZWFtIG9yIG90aGVyIG9iamVjdHMuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0SW5wdXQoT2JqZWN0IGlucHV0KSB7CiAgICAgICAgIHNldElucHV0KGlucHV0LCBmYWxzZSwgZmFsc2UpOwpAQCAtMTgxLDggKzIwOCw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgaW5wdXQgc291cmNlIG9iamVjdCBvZiB0aGlzIEltYWdlUmVhZGVyLCBvciByZXR1cm5zIG51bGwuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgdGhlIGlucHV0IHNvdXJjZSBvYmplY3Qgc3VjaCBhcyBJbWFnZUlucHV0U3RyZWFtLAotICAgICAqIG9yIG51bGwuCisgICAgICogQHJldHVybiB0aGUgaW5wdXQgc291cmNlIG9iamVjdCBzdWNoIGFzIEltYWdlSW5wdXRTdHJlYW0sIG9yIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdCBnZXRJbnB1dCgpIHsKICAgICAgICAgcmV0dXJuIGlucHV0OwpAQCAtMTkxLDMyICsyMTcsMzEgQEAKICAgICAvKioKICAgICAgKiBDaGVja3MgaWYgdGhlIGlucHV0IHNvdXJjZSBzdXBwb3J0cyBvbmx5IGZvcndhcmQgcmVhZGluZywgb3Igbm90LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIGlucHV0IHNvdXJjZSBzdXBwb3J0cyBvbmx5IGZvcndhcmQgcmVhZGluZywgCi0gICAgICogZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIGlucHV0IHNvdXJjZSBzdXBwb3J0cyBvbmx5IGZvcndhcmQgcmVhZGluZywgZmFsc2UKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1NlZWtGb3J3YXJkT25seSgpIHsKICAgICAgICAgcmV0dXJuIHNlZWtGb3J3YXJkT25seTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgaW5wdXQgc291cmNlIGFsbG93cyAKLSAgICAgKiB0byBtZXRhZGF0YSB0byBiZSBpZ25vcmVkIGJ5IHBhc3NpbmcgdHJ1ZSBhcyAKLSAgICAgKiB0aGUgaWdub3JlTWV0YWRhdGEgYXJndW1lbnQgdG8gdGhlIHNldElucHV0IG1ldGhvZC4KKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgaW5wdXQgc291cmNlIGFsbG93cyB0byBtZXRhZGF0YSB0byBiZSBpZ25vcmVkCisgICAgICogYnkgcGFzc2luZyB0cnVlIGFzIHRoZSBpZ25vcmVNZXRhZGF0YSBhcmd1bWVudCB0byB0aGUgc2V0SW5wdXQgbWV0aG9kLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdHJ1ZSBpZiB0aGUgY3VycmVudCBpbnB1dCBzb3VyY2UgYWxsb3dzIAotICAgICAqIHRvIG1ldGFkYXRhIHRvIGJlIGlnbm9yZWQgYnkgcGFzc2luZyB0cnVlIGFzIAotICAgICAqIHRoZSBpZ25vcmVNZXRhZGF0YSBhcmd1bWVudCB0byB0aGUgc2V0SW5wdXQgbWV0aG9kLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIGN1cnJlbnQgaW5wdXQgc291cmNlIGFsbG93cyB0byBtZXRhZGF0YSB0byBiZQorICAgICAqICAgICAgICAgaWdub3JlZCBieSBwYXNzaW5nIHRydWUgYXMgdGhlIGlnbm9yZU1ldGFkYXRhIGFyZ3VtZW50IHRvIHRoZQorICAgICAqICAgICAgICAgc2V0SW5wdXQgbWV0aG9kLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzSWdub3JpbmdNZXRhZGF0YSgpIHsKICAgICAgICAgcmV0dXJuIGlnbm9yZU1ldGFkYXRhOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1pbmltdW0gdmFsaWQgaW5kZXggZm9yIHJlYWRpbmcgYW4gaW1hZ2UsIHRodW1ibmFpbCwgCi0gICAgICogb3IgaW1hZ2UgbWV0YWRhdGEuIAorICAgICAqIEdldHMgdGhlIG1pbmltdW0gdmFsaWQgaW5kZXggZm9yIHJlYWRpbmcgYW4gaW1hZ2UsIHRodW1ibmFpbCwgb3IgaW1hZ2UKKyAgICAgKiBtZXRhZGF0YS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtaW5pbXVtIHZhbGlkIGluZGV4IGZvciByZWFkaW5nIGFuIGltYWdlLCB0aHVtYm5haWwsIAotICAgICAqIG9yIGltYWdlIG1ldGFkYXRhLgorICAgICAqIEByZXR1cm4gdGhlIG1pbmltdW0gdmFsaWQgaW5kZXggZm9yIHJlYWRpbmcgYW4gaW1hZ2UsIHRodW1ibmFpbCwgb3IgaW1hZ2UKKyAgICAgKiAgICAgICAgIG1ldGFkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TWluSW5kZXgoKSB7CiAgICAgICAgIHJldHVybiBtaW5JbmRleDsKQEAgLTIzNCw3ICsyNTksOCBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGxvY2FsZSB0byB0aGlzIEltYWdlUmVhZGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBsb2NhbGUgdGhlIExvY2FsZS4KKyAgICAgKiBAcGFyYW0gbG9jYWxlCisgICAgICogICAgICAgICAgICB0aGUgTG9jYWxlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldExvY2FsZShMb2NhbGUgbG9jYWxlKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwpAQCAtMjUyLDg5ICsyNzgsODggQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgaW1hZ2VzIGF2YWlsYWJsZSBpbiB0aGUgY3VycmVudCBpbnB1dCBzb3VyY2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGFsbG93U2VhcmNoIHRoZSBwYXJhbWV0ZXIgd2hpY2ggaW5kaWNhdGVzIHdoYXQKLSAgICAgKiBhIHNlYXJjaCBpcyByZXF1aXJlZDsgaWYgZmFsc2UsIHRoZSByZWFkZXIgbWF5IHJldHVybiAtMSAgCi0gICAgICogd2l0aG91dCBzZWFyY2hpbmcuCi0gICAgICogCisgICAgICogQHBhcmFtIGFsbG93U2VhcmNoCisgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIHdoaWNoIGluZGljYXRlcyB3aGF0IGEgc2VhcmNoIGlzIHJlcXVpcmVkOyBpZgorICAgICAqICAgICAgICAgICAgZmFsc2UsIHRoZSByZWFkZXIgbWF5IHJldHVybiAtMSB3aXRob3V0IHNlYXJjaGluZy4KICAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgaW1hZ2VzLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldE51bUltYWdlcyhib29sZWFuIGFsbG93U2VhcmNoKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSB3aWR0aCBvZiB0aGUgc3BlY2lmaWVkIGltYWdlIGluIGlucHV0IHNvdXJjZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleCB0aGUgaW1hZ2UgaW5kZXguCi0gICAgICogCisgICAgICogQHBhcmFtIGltYWdlSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBpbmRleC4KICAgICAgKiBAcmV0dXJuIHRoZSB3aWR0aCBpbiBwaXhlbHMuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0V2lkdGgoaW50IGltYWdlSW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGhlaWdodCBvZiB0aGUgc3BlY2lmaWVkIGltYWdlIGluIGlucHV0IHNvdXJjZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleCB0aGUgaW1hZ2UgaW5kZXguCi0gICAgICogCisgICAgICogQHBhcmFtIGltYWdlSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBpbmRleC4KICAgICAgKiBAcmV0dXJuIHRoZSBoZWlnaHQgaW4gcGl4ZWxzLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldEhlaWdodChpbnQgaW1hZ2VJbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIHRoZSBzdG9yYWdlIGZvcm1hdCBvZiB0aGUgc3BlY2lmaWVkIGltYWdlIHBsYWNlcyAKLSAgICAgKiBhbiBpbXBlZGltZW50IG9uIHJhbmRvbSBwaXhlbHMgYWNjZXNzIG9yIG5vdC4gCisgICAgICogQ2hlY2tzIGlmIHRoZSBzdG9yYWdlIGZvcm1hdCBvZiB0aGUgc3BlY2lmaWVkIGltYWdlIHBsYWNlcyBhbiBpbXBlZGltZW50CisgICAgICogb24gcmFuZG9tIHBpeGVscyBhY2Nlc3Mgb3Igbm90LgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZUluZGV4IHRoZSBpbWFnZSdzIGluZGV4LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHN0b3JhZ2UgZm9ybWF0IG9mIHRoZSBzcGVjaWZpZWQgaW1hZ2UgcGxhY2VzIAotICAgICAqIGFuIGltcGVkaW1lbnQgb24gcmFuZG9tIHBpeGVscyBhY2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlJ3MgaW5kZXguCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3RvcmFnZSBmb3JtYXQgb2YgdGhlIHNwZWNpZmllZCBpbWFnZSBwbGFjZXMgYW4KKyAgICAgKiAgICAgICAgIGltcGVkaW1lbnQgb24gcmFuZG9tIHBpeGVscyBhY2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNSYW5kb21BY2Nlc3NFYXN5KGludCBpbWFnZUluZGV4KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZmFsc2U7IC8vZGVmCisgICAgICAgIHJldHVybiBmYWxzZTsgLy8gZGVmCiAgICAgfQogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgYXNwZWN0IHJhdGlvICh3aWR0aCBkZXZpZGVkIGJ5IGhlaWdodCkgb2YgdGhlIGltYWdlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZUluZGV4IHRoZSBpbWFnZSBpbmRleC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGluZGV4LgogICAgICAqIEByZXR1cm4gdGhlIGFzcGVjdCByYXRpbyBvZiB0aGUgaW1hZ2UuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdCBnZXRBc3BlY3RSYXRpbyhpbnQgaW1hZ2VJbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIChmbG9hdCkgZ2V0V2lkdGgoaW1hZ2VJbmRleCkgLyBnZXRIZWlnaHQoaW1hZ2VJbmRleCk7CisgICAgICAgIHJldHVybiAoZmxvYXQpZ2V0V2lkdGgoaW1hZ2VJbmRleCkgLyBnZXRIZWlnaHQoaW1hZ2VJbmRleCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbiBJbWFnZVR5cGVTcGVjaWZpZXIgd2hpY2ggaW5kaWNhdGVzIHRoZSB0eXBlIG9mIHRoZSAKLSAgICAgKiBzcGVjaWZpZWQgaW1hZ2UuCisgICAgICogR2V0cyBhbiBJbWFnZVR5cGVTcGVjaWZpZXIgd2hpY2ggaW5kaWNhdGVzIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBpbWFnZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleCB0aGUgaW1hZ2UncyBpbmRleC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlJ3MgaW5kZXguCiAgICAgICogQHJldHVybiB0aGUgSW1hZ2VUeXBlU3BlY2lmaWVyLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgSW1hZ2VUeXBlU3BlY2lmaWVyIGdldFJhd0ltYWdlVHlwZShpbnQgaW1hZ2VJbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbiBJdGVyYXRvciBvZiBJbWFnZVR5cGVTcGVjaWZpZXIgb2JqZWN0cyB3aGljaCBhcmUgYXNzb2NpYXRlZAotICAgICAqIHdpdGggaW1hZ2UgdHlwZXMgdGhhdCBtYXkgYmUgdXNlZCB3aGVuIGRlY29kaW5nIHNwZWNpZmllZCBpbWFnZS4KKyAgICAgKiBHZXRzIGFuIEl0ZXJhdG9yIG9mIEltYWdlVHlwZVNwZWNpZmllciBvYmplY3RzIHdoaWNoIGFyZSBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiBpbWFnZSB0eXBlcyB0aGF0IG1heSBiZSB1c2VkIHdoZW4gZGVjb2Rpbmcgc3BlY2lmaWVkIGltYWdlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZUluZGV4IHRoZSBpbWFnZSBpbmRleC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGluZGV4LgogICAgICAqIEByZXR1cm4gYW4gSXRlcmF0b3Igb2YgSW1hZ2VUeXBlU3BlY2lmaWVyIG9iamVjdHMuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBJdGVyYXRvcjxJbWFnZVR5cGVTcGVjaWZpZXI+IGdldEltYWdlVHlwZXMoaW50IGltYWdlSW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIApAQCAtMzUxLDIxICszNzYsMjIgQEAKICAgICAgKiBHZXRzIGFuIElJT01ldGFkYXRhIG9iamVjdCBmb3IgdGhpcyBpbnB1dCBzb3VyY2UuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgSUlPTWV0YWRhdGEuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBJSU9NZXRhZGF0YSBnZXRTdHJlYW1NZXRhZGF0YSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIEdldHMgYW4gSUlPTWV0YWRhdGEgb2JqZWN0IGZvciB0aGlzIGlucHV0IHNvdXJjZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZm9ybWF0TmFtZSB0aGUgZGVzaXJlZCBtZXRhZGF0YSBmb3JtYXQgdG8gYmUgdXNlZCBpbiB0aGUgCi0gICAgICogcmV0dXJuZWQgSUlPTWV0YWRhdGEgb2JqZWN0LgotICAgICAqIEBwYXJhbSBub2RlTmFtZXMgdGhlIG5vZGUgbmFtZXMgb2YgdGhlIGRvY3VtZW50LgotICAgICAqIAorICAgICAqIEBwYXJhbSBmb3JtYXROYW1lCisgICAgICogICAgICAgICAgICB0aGUgZGVzaXJlZCBtZXRhZGF0YSBmb3JtYXQgdG8gYmUgdXNlZCBpbiB0aGUgcmV0dXJuZWQKKyAgICAgKiAgICAgICAgICAgIElJT01ldGFkYXRhIG9iamVjdC4KKyAgICAgKiBAcGFyYW0gbm9kZU5hbWVzCisgICAgICogICAgICAgICAgICB0aGUgbm9kZSBuYW1lcyBvZiB0aGUgZG9jdW1lbnQuCiAgICAgICogQHJldHVybiB0aGUgSUlPTWV0YWRhdGEuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBJSU9NZXRhZGF0YSBnZXRTdHJlYW1NZXRhZGF0YShTdHJpbmcgZm9ybWF0TmFtZSwgU2V0PFN0cmluZz4gbm9kZU5hbWVzKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTM3NSw4MyArNDAxLDg2IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgaW1hZ2UgbWV0YWRhdGEgb2YgdGhlIHNwZWNpZmllZCBpbWFnZSBpbiBpbnB1dCBzb3VyY2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGltYWdlSW5kZXggdGhlIGltYWdlIGluZGV4LgotICAgICAqIAorICAgICAqIEBwYXJhbSBpbWFnZUluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgaW5kZXguCiAgICAgICogQHJldHVybiB0aGUgSUlPTWV0YWRhdGEuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBJSU9NZXRhZGF0YSBnZXRJbWFnZU1ldGFkYXRhKGludCBpbWFnZUluZGV4KSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBpbWFnZSBtZXRhZGF0YSBvZiB0aGUgc3BlY2lmaWVkIGltYWdlIGlucHV0IHNvdXJjZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleCB0aGUgaW1hZ2UgaW5kZXguCi0gICAgICogQHBhcmFtIGZvcm1hdE5hbWUgdGhlIGRlc2lyZWQgbWV0YWRhdGEgZm9ybWF0IHRvIGJlIHVzZWQgaW4gdGhlIAotICAgICAqIHJldHVybmVkIElJT01ldGFkYXRhIG9iamVjdC4KLSAgICAgKiBAcGFyYW0gbm9kZU5hbWVzIHRoZSBub2RlIG5hbWVzIHdoaWNoIGNhbiBiZSBjb250YWluZWQgaW4KLSAgICAgKiB0aGUgZG9jdW1lbnQuCi0gICAgICogCisgICAgICogQHBhcmFtIGltYWdlSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBpbmRleC4KKyAgICAgKiBAcGFyYW0gZm9ybWF0TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGRlc2lyZWQgbWV0YWRhdGEgZm9ybWF0IHRvIGJlIHVzZWQgaW4gdGhlIHJldHVybmVkCisgICAgICogICAgICAgICAgICBJSU9NZXRhZGF0YSBvYmplY3QuCisgICAgICogQHBhcmFtIG5vZGVOYW1lcworICAgICAqICAgICAgICAgICAgdGhlIG5vZGUgbmFtZXMgd2hpY2ggY2FuIGJlIGNvbnRhaW5lZCBpbiB0aGUgZG9jdW1lbnQuCiAgICAgICogQHJldHVybiB0aGUgSUlPTWV0YWRhdGEuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwotICAgIHB1YmxpYyBJSU9NZXRhZGF0YSBnZXRJbWFnZU1ldGFkYXRhKGludCBpbWFnZUluZGV4LCBTdHJpbmcgZm9ybWF0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiBub2RlTmFtZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIElJT01ldGFkYXRhIGdldEltYWdlTWV0YWRhdGEoaW50IGltYWdlSW5kZXgsIFN0cmluZyBmb3JtYXROYW1lLCBTZXQ8U3RyaW5nPiBub2RlTmFtZXMpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgc3BlY2lmaWVkIGltYWdlIGFuZCByZXR1cm5zIGl0IGFzIGEgQnVmZmVyZWRJbWFnZQotICAgICAqIHVzaW5nIHRoZSBkZWZhdWx0IEltYWdlUmVhZFBhcmFtLgotICAgICAqICAKLSAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleCB0aGUgaW1hZ2UgaW5kZXguCisgICAgICogUmVhZHMgdGhlIHNwZWNpZmllZCBpbWFnZSBhbmQgcmV0dXJucyBpdCBhcyBhIEJ1ZmZlcmVkSW1hZ2UgdXNpbmcgdGhlCisgICAgICogZGVmYXVsdCBJbWFnZVJlYWRQYXJhbS4KICAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGluZGV4LgogICAgICAqIEByZXR1cm4gdGhlIEJ1ZmZlcmVkSW1hZ2UuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBCdWZmZXJlZEltYWdlIHJlYWQoaW50IGltYWdlSW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiByZWFkKGltYWdlSW5kZXgsIG51bGwpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRzIHRoZSBzcGVjaWZpZWQgaW1hZ2UgYW5kIHJldHVybnMgaXQgYXMgYSBCdWZmZXJlZEltYWdlCi0gICAgICogdXNpbmcgdGhlIHNwZWNpZmllZCBJbWFnZVJlYWRQYXJhbS4KKyAgICAgKiBSZWFkcyB0aGUgc3BlY2lmaWVkIGltYWdlIGFuZCByZXR1cm5zIGl0IGFzIGEgQnVmZmVyZWRJbWFnZSB1c2luZyB0aGUKKyAgICAgKiBzcGVjaWZpZWQgSW1hZ2VSZWFkUGFyYW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIGltYWdlSW5kZXggdGhlIGltYWdlIGluZGV4LgotICAgICAqIEBwYXJhbSBwYXJhbSB0aGUgSW1hZ2VSZWFkUGFyYW0uCi0gICAgICogCisgICAgICogQHBhcmFtIGltYWdlSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBpbmRleC4KKyAgICAgKiBAcGFyYW0gcGFyYW0KKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVJlYWRQYXJhbS4KICAgICAgKiBAcmV0dXJuIHRoZSBCdWZmZXJlZEltYWdlLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgQnVmZmVyZWRJbWFnZSByZWFkKGludCBpbWFnZUluZGV4LCBJbWFnZVJlYWRQYXJhbSBwYXJhbSkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCiAgICAgICogUmVhZHMgdGhlIHNwZWNpZmllZCBpbWFnZSBhbmQgcmV0dXJucyBhbiBJSU9JbWFnZSB3aXRoIHRoaXMgaW1hZ2UsCi0gICAgICogdGh1bWJuYWlscywgYW5kIG1ldGFkYXRhIGZvciB0aGlzIGltYWdlLCB1c2luZyAKLSAgICAgKiB0aGUgc3BlY2lmaWVkIEltYWdlUmVhZFBhcmFtLgorICAgICAqIHRodW1ibmFpbHMsIGFuZCBtZXRhZGF0YSBmb3IgdGhpcyBpbWFnZSwgdXNpbmcgdGhlIHNwZWNpZmllZAorICAgICAqIEltYWdlUmVhZFBhcmFtLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZUluZGV4IHRoZSBpbWFnZSBpbmRleC4KLSAgICAgKiBAcGFyYW0gcGFyYW0gdGhlIEltYWdlUmVhZFBhcmFtLgotICAgICAqIAorICAgICAqIEBwYXJhbSBpbWFnZUluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgaW5kZXguCisgICAgICogQHBhcmFtIHBhcmFtCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VSZWFkUGFyYW0uCiAgICAgICogQHJldHVybiB0aGUgSUlPSW1hZ2UuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBJSU9JbWFnZSByZWFkQWxsKGludCBpbWFnZUluZGV4LCBJbWFnZVJlYWRQYXJhbSBwYXJhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBJdGVyYXRvciBvZiBJSU9JbWFnZXMgZnJvbSB0aGUgaW5wdXQgc291cmNlLiAKKyAgICAgKiBSZXR1cm5zIGFuIEl0ZXJhdG9yIG9mIElJT0ltYWdlcyBmcm9tIHRoZSBpbnB1dCBzb3VyY2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIHBhcmFtcyB0aGUgSXRlcmF0b3Igb2YgSW1hZ2VSZWFkUGFyYW0gb2JqZWN0cy4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGFyYW1zCisgICAgICogICAgICAgICAgICB0aGUgSXRlcmF0b3Igb2YgSW1hZ2VSZWFkUGFyYW0gb2JqZWN0cy4KICAgICAgKiBAcmV0dXJuIHRoZSBpdGVyYXRvciBvZiBJSU9JbWFnZXMuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBJdGVyYXRvcjxJSU9JbWFnZT4gcmVhZEFsbChJdGVyYXRvcjw/IGV4dGVuZHMgSW1hZ2VSZWFkUGFyYW0+IHBhcmFtcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CkBAIC00NjAsMjMgKzQ4OSwyMyBAQAogICAgIC8qKgogICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGlzIHBsdWctaW4gc3VwcG9ydHMgcmVhZGluZyBhIFJhc3Rlci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgcGx1Zy1pbiBzdXBwb3J0cyByZWFkaW5nIGEgUmFzdGVyLAotICAgICAqIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgcGx1Zy1pbiBzdXBwb3J0cyByZWFkaW5nIGEgUmFzdGVyLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY2FuUmVhZFJhc3RlcigpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOyAvL2RlZgorICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGRlZgogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRzIGEgbmV3IFJhc3RlciBvYmplY3Qgd2hpY2ggY29udGFpbnMgdGhlIHJhdyBwaXhlbCBkYXRhIGZyb20gCi0gICAgICogdGhlIGltYWdlLiAKKyAgICAgKiBSZWFkcyBhIG5ldyBSYXN0ZXIgb2JqZWN0IHdoaWNoIGNvbnRhaW5zIHRoZSByYXcgcGl4ZWwgZGF0YSBmcm9tIHRoZQorICAgICAqIGltYWdlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZUluZGV4IHRoZSBpbWFnZSBpbmRleC4KLSAgICAgKiBAcGFyYW0gcGFyYW0gdGhlIEltYWdlUmVhZFBhcmFtLgotICAgICAqIAorICAgICAqIEBwYXJhbSBpbWFnZUluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgaW5kZXguCisgICAgICogQHBhcmFtIHBhcmFtCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VSZWFkUGFyYW0uCiAgICAgICogQHJldHVybiB0aGUgUmFzdGVyLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgUmFzdGVyIHJlYWRSYXN0ZXIoaW50IGltYWdlSW5kZXgsIEltYWdlUmVhZFBhcmFtIHBhcmFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVuc3VwcG9ydGVkIik7CkBAIC00ODUsMjIwICs1MTQsMjI2IEBACiAgICAgLyoqCiAgICAgICogQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgaW1hZ2UgaGFzIHRpbGVzIG9yIG5vdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleCB0aGUgaW1hZ2UncyBpbmRleC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgaW1hZ2UgaGFzIHRpbGVzLAotICAgICAqIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlJ3MgaW5kZXguCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIGltYWdlIGhhcyB0aWxlcywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0ltYWdlVGlsZWQoaW50IGltYWdlSW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsgLy9kZWYKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBkZWYKICAgICB9CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSB0aWxlIHdpZHRoIGluIHRoZSBzcGVjaWZpZWQgaW1hZ2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGltYWdlSW5kZXggdGhlIGltYWdlJ3MgaW5kZXguCi0gICAgICogCisgICAgICogQHBhcmFtIGltYWdlSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSdzIGluZGV4LgogICAgICAqIEByZXR1cm4gdGhlIHRpbGUgd2lkdGguCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0VGlsZVdpZHRoKGludCBpbWFnZUluZGV4KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0V2lkdGgoaW1hZ2VJbmRleCk7IC8vZGVmCisgICAgICAgIHJldHVybiBnZXRXaWR0aChpbWFnZUluZGV4KTsgLy8gZGVmCiAgICAgfQogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgdGlsZSBoZWlnaHQgaW4gdGhlIHNwZWNpZmllZCBpbWFnZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleCB0aGUgaW1hZ2UncyBpbmRleC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlJ3MgaW5kZXguCiAgICAgICogQHJldHVybiB0aGUgdGlsZSBoZWlnaHQuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0VGlsZUhlaWdodChpbnQgaW1hZ2VJbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldEhlaWdodChpbWFnZUluZGV4KTsgLy9kZWYKKyAgICAgICAgcmV0dXJuIGdldEhlaWdodChpbWFnZUluZGV4KTsgLy8gZGVmCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgdGlsZSBncmlkIGluIHRoZSAKKyAgICAgKiBHZXRzIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSB0aWxlIGdyaWQgaW4gdGhlCiAgICAgICogc3BlY2lmaWVkIGltYWdlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZUluZGV4IHRoZSBpbWFnZSdzIGluZGV4LgotICAgICAqIAorICAgICAqIEBwYXJhbSBpbWFnZUluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UncyBpbmRleC4KICAgICAgKiBAcmV0dXJuIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSB0aWxlIGdyaWQuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0VGlsZUdyaWRYT2Zmc2V0KGludCBpbWFnZUluZGV4KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gMDsgLy9kZWYKKyAgICAgICAgcmV0dXJuIDA7IC8vIGRlZgogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHRpbGUgZ3JpZCBpbiB0aGUgCisgICAgICogR2V0cyB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgdGlsZSBncmlkIGluIHRoZQogICAgICAqIHNwZWNpZmllZCBpbWFnZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleCB0aGUgaW1hZ2UncyBpbmRleC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlJ3MgaW5kZXguCiAgICAgICogQHJldHVybiB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgdGlsZSBncmlkLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFRpbGVHcmlkWU9mZnNldChpbnQgaW1hZ2VJbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIDA7IC8vZGVmCisgICAgICAgIHJldHVybiAwOyAvLyBkZWYKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgdGlsZSBzcGVjaWZpZWQgYnkgdGhlIHRpbGVYIGFuZCB0aWxlWSBwYXJhbWV0ZXJzCi0gICAgICogb2YgdGhlIHNwZWNpZmllZCBpbWFnZSBhbmQgcmV0dXJucyBpdCBhcyBhIEJ1ZmZlcmVkSW1hZ2UuIAorICAgICAqIFJlYWRzIHRoZSB0aWxlIHNwZWNpZmllZCBieSB0aGUgdGlsZVggYW5kIHRpbGVZIHBhcmFtZXRlcnMgb2YgdGhlCisgICAgICogc3BlY2lmaWVkIGltYWdlIGFuZCByZXR1cm5zIGl0IGFzIGEgQnVmZmVyZWRJbWFnZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleCB0aGUgaW1hZ2UgaW5kZXguCi0gICAgICogQHBhcmFtIHRpbGVYIHRoZSBYIGluZGV4IG9mIHRpbGUuCi0gICAgICogQHBhcmFtIHRpbGVZIHRoZSBZIGluZGV4IG9mIHRpbGUuCi0gICAgICogCisgICAgICogQHBhcmFtIGltYWdlSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBpbmRleC4KKyAgICAgKiBAcGFyYW0gdGlsZVgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGluZGV4IG9mIHRpbGUuCisgICAgICogQHBhcmFtIHRpbGVZCisgICAgICogICAgICAgICAgICB0aGUgWSBpbmRleCBvZiB0aWxlLgogICAgICAqIEByZXR1cm4gdGhlIEJ1ZmZlcmVkSW1hZ2UuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBCdWZmZXJlZEltYWdlIHJlYWRUaWxlKGludCBpbWFnZUluZGV4LCBpbnQgdGlsZVgsIGludCB0aWxlWSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgdGhlIHRpbGUgc3BlY2lmaWVkIGJ5IHRoZSB0aWxlWCBhbmQgdGlsZVkgcGFyYW1ldGVycwotICAgICAqIG9mIHRoZSBzcGVjaWZpZWQgaW1hZ2UgYW5kIHJldHVybnMgaXQgYXMgYSBSYXN0ZXIuIAorICAgICAqIFJlYWRzIHRoZSB0aWxlIHNwZWNpZmllZCBieSB0aGUgdGlsZVggYW5kIHRpbGVZIHBhcmFtZXRlcnMgb2YgdGhlCisgICAgICogc3BlY2lmaWVkIGltYWdlIGFuZCByZXR1cm5zIGl0IGFzIGEgUmFzdGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZUluZGV4IHRoZSBpbWFnZSBpbmRleC4KLSAgICAgKiBAcGFyYW0gdGlsZVggdGhlIFggaW5kZXggb2YgdGlsZS4KLSAgICAgKiBAcGFyYW0gdGlsZVkgdGhlIFkgaW5kZXggb2YgdGlsZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGluZGV4LgorICAgICAqIEBwYXJhbSB0aWxlWAorICAgICAqICAgICAgICAgICAgdGhlIFggaW5kZXggb2YgdGlsZS4KKyAgICAgKiBAcGFyYW0gdGlsZVkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGluZGV4IG9mIHRpbGUuCiAgICAgICogQHJldHVybiB0aGUgUmFzdGVyLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgUmFzdGVyIHJlYWRUaWxlUmFzdGVyKGludCBpbWFnZUluZGV4LCBpbnQgdGlsZVgsIGludCB0aWxlWSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVhZHMgdGhlIHNwZWNpZmllZCBpbWFnZSB1c2luZyB0aGUgc3BlY2lmaWVkIAotICAgICAqIEltYWdlUmVhZFBhcmFtIGFuZCByZXR1cm5zIGl0IGFzIGEgUmVuZGVyZWRJbWFnZS4KKyAgICAgKiBSZWFkcyB0aGUgc3BlY2lmaWVkIGltYWdlIHVzaW5nIHRoZSBzcGVjaWZpZWQgSW1hZ2VSZWFkUGFyYW0gYW5kIHJldHVybnMKKyAgICAgKiBpdCBhcyBhIFJlbmRlcmVkSW1hZ2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGltYWdlSW5kZXggdGhlIGltYWdlIGluZGV4LgotICAgICAqIEBwYXJhbSBwYXJhbSB0aGUgSW1hZ2VSZWFkUGFyYW0uCi0gICAgICogCisgICAgICogQHBhcmFtIGltYWdlSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBpbmRleC4KKyAgICAgKiBAcGFyYW0gcGFyYW0KKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVJlYWRQYXJhbS4KICAgICAgKiBAcmV0dXJuIHRoZSBSZW5kZXJlZEltYWdlLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgUmVuZGVyZWRJbWFnZSByZWFkQXNSZW5kZXJlZEltYWdlKGludCBpbWFnZUluZGV4LCBJbWFnZVJlYWRQYXJhbSBwYXJhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgUmVuZGVyZWRJbWFnZSByZWFkQXNSZW5kZXJlZEltYWdlKGludCBpbWFnZUluZGV4LCBJbWFnZVJlYWRQYXJhbSBwYXJhbSkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiByZWFkKGltYWdlSW5kZXgsIHBhcmFtKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGltYWdlIGZvcm1hdCBzdXBwb3J0ZWQgYnkgdGhpcyByZWFkZXIgCi0gICAgICogc3VwcG9ydHMgdGh1bWJuYWlsIHByZXZpZXcgaW1hZ2VzLgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgaW1hZ2UgZm9ybWF0IHN1cHBvcnRlZCBieSB0aGlzIHJlYWRlciBzdXBwb3J0cworICAgICAqIHRodW1ibmFpbCBwcmV2aWV3IGltYWdlcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGltYWdlIGZvcm1hdCBzdXBwb3J0ZWQgYnkgdGhpcyByZWFkZXIgCi0gICAgICogc3VwcG9ydHMgdGh1bWJuYWlsIHByZXZpZXcgaW1hZ2VzLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgaW1hZ2UgZm9ybWF0IHN1cHBvcnRlZCBieSB0aGlzIHJlYWRlciBzdXBwb3J0cworICAgICAqICAgICAgICAgdGh1bWJuYWlsIHByZXZpZXcgaW1hZ2VzLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gcmVhZGVyU3VwcG9ydHNUaHVtYm5haWxzKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7IC8vZGVmCisgICAgICAgIHJldHVybiBmYWxzZTsgLy8gZGVmCiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgaW1hZ2UgaGFzIHRodW1ibmFpbHMgb3Igbm90LgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZUluZGV4IHRoZSBpbWFnZSdzIGluZGV4LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCBpbWFnZSBoYXMgdGh1bWJuYWlscywKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIGltYWdlSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSdzIGluZGV4LgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCBpbWFnZSBoYXMgdGh1bWJuYWlscywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBoYXNUaHVtYm5haWxzKGludCBpbWFnZUluZGV4KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0TnVtVGh1bWJuYWlscyhpbWFnZUluZGV4KSA+IDA7IC8vZGVmCisgICAgICAgIHJldHVybiBnZXROdW1UaHVtYm5haWxzKGltYWdlSW5kZXgpID4gMDsgLy8gZGVmCiAgICAgfQogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHRodW1ibmFpbHMgZm9yIHRoZSBzcGVjaWZpZWQgaW1hZ2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGltYWdlSW5kZXggdGhlIGltYWdlJ3MgaW5kZXguCi0gICAgICogCisgICAgICogQHBhcmFtIGltYWdlSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSdzIGluZGV4LgogICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiB0aHVtYm5haWxzLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldE51bVRodW1ibmFpbHMoaW50IGltYWdlSW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiAwOyAvL2RlZgorICAgICAgICByZXR1cm4gMDsgLy8gZGVmCiAgICAgfQogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgd2lkdGggb2YgdGhlIHNwZWNpZmllZCB0aHVtYm5haWwgZm9yIHRoZSBzcGVjaWZpZWQgaW1hZ2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGltYWdlSW5kZXggdGhlIGltYWdlJ3MgaW5kZXguCi0gICAgICogQHBhcmFtIHRodW1ibmFpbEluZGV4IHRoZSB0aHVtYm5haWwncyBpbmRleC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlJ3MgaW5kZXguCisgICAgICogQHBhcmFtIHRodW1ibmFpbEluZGV4CisgICAgICogICAgICAgICAgICB0aGUgdGh1bWJuYWlsJ3MgaW5kZXguCiAgICAgICogQHJldHVybiB0aGUgdGh1bWJuYWlsIHdpZHRoLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFRodW1ibmFpbFdpZHRoKGludCBpbWFnZUluZGV4LCBpbnQgdGh1bWJuYWlsSW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiByZWFkVGh1bWJuYWlsKGltYWdlSW5kZXgsIHRodW1ibmFpbEluZGV4KS5nZXRXaWR0aCgpOyAgLy9kZWYKKyAgICAgICAgcmV0dXJuIHJlYWRUaHVtYm5haWwoaW1hZ2VJbmRleCwgdGh1bWJuYWlsSW5kZXgpLmdldFdpZHRoKCk7IC8vIGRlZgogICAgIH0KIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGhlaWdodCBvZiB0aGUgc3BlY2lmaWVkIHRodW1ibmFpbCBmb3IgdGhlIHNwZWNpZmllZCBpbWFnZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleCB0aGUgaW1hZ2UncyBpbmRleC4KLSAgICAgKiBAcGFyYW0gdGh1bWJuYWlsSW5kZXggdGhlIHRodW1ibmFpbCdzIGluZGV4LgotICAgICAqIAorICAgICAqIEBwYXJhbSBpbWFnZUluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UncyBpbmRleC4KKyAgICAgKiBAcGFyYW0gdGh1bWJuYWlsSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSB0aHVtYm5haWwncyBpbmRleC4KICAgICAgKiBAcmV0dXJuIHRoZSB0aHVtYm5haWwgaGVpZ2h0LgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFRodW1ibmFpbEhlaWdodChpbnQgaW1hZ2VJbmRleCwgaW50IHRodW1ibmFpbEluZGV4KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gcmVhZFRodW1ibmFpbChpbWFnZUluZGV4LCB0aHVtYm5haWxJbmRleCkuZ2V0SGVpZ2h0KCk7ICAvL2RlZgorICAgICAgICByZXR1cm4gcmVhZFRodW1ibmFpbChpbWFnZUluZGV4LCB0aHVtYm5haWxJbmRleCkuZ2V0SGVpZ2h0KCk7IC8vIGRlZgogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWRzIHRoZSB0aHVtYm5haWwgaW1hZ2UgZm9yIHRoZSBzcGVjaWZpZWQgaW1hZ2UKLSAgICAgKiBhcyBhIEJ1ZmZlcmVkSW1hZ2UuCi0gICAgICogIAotICAgICAqIEBwYXJhbSBpbWFnZUluZGV4IHRoZSBpbWFnZSBpbmRleC4KLSAgICAgKiBAcGFyYW0gdGh1bWJuYWlsSW5kZXggdGhlIHRodW1ibmFpbCBpbmRleC4KKyAgICAgKiBSZWFkcyB0aGUgdGh1bWJuYWlsIGltYWdlIGZvciB0aGUgc3BlY2lmaWVkIGltYWdlIGFzIGEgQnVmZmVyZWRJbWFnZS4KICAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGluZGV4LgorICAgICAqIEBwYXJhbSB0aHVtYm5haWxJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIHRodW1ibmFpbCBpbmRleC4KICAgICAgKiBAcmV0dXJuIHRoZSBCdWZmZXJlZEltYWdlLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgQnVmZmVyZWRJbWFnZSByZWFkVGh1bWJuYWlsKGludCBpbWFnZUluZGV4LCBpbnQgdGh1bWJuYWlsSW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQiKTsgLy9kZWYKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCIpOyAvLyBkZWYKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXF1ZXN0cyBhbiBhYm9ydCBvcGVyYXRpb24gZm9yIGN1cnJlbnQgcmVhZGluZyBvcGVyYXRpb24uIAorICAgICAqIFJlcXVlc3RzIGFuIGFib3J0IG9wZXJhdGlvbiBmb3IgY3VycmVudCByZWFkaW5nIG9wZXJhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhYm9ydCgpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IGEgcmVxdWVzdCB0byBhYm9ydCB0aGUgY3VycmVudCByZWFkIG9wZXJhdGlvbiAKLSAgICAgKiBoYXMgYmVlbiBtYWRlIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgYSByZXF1ZXN0IHRvIGFib3J0IHRoZSBjdXJyZW50IHJlYWQgb3BlcmF0aW9uIGhhcworICAgICAqIGJlZW4gbWFkZSBzdWNjZXNzZnVsbHkuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgcmVxdWVzdCB0byBhYm9ydCB0aGUgY3VycmVudCByZWFkIG9wZXJhdGlvbiAKLSAgICAgKiBoYXMgYmVlbiBtYWRlIHN1Y2Nlc3NmdWxseSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHJlcXVlc3QgdG8gYWJvcnQgdGhlIGN1cnJlbnQgcmVhZCBvcGVyYXRpb24gaGFzIGJlZW4KKyAgICAgKiAgICAgICAgIG1hZGUgc3VjY2Vzc2Z1bGx5LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gYWJvcnRSZXF1ZXN0ZWQoKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENsZWFycyBhbGwgcHJldmlvdXMgYWJvcnQgcmVxdWVzdCwgYW5kIGFib3J0UmVxdWVzdGVkIHJldHVybnMgZmFsc2UKLSAgICAgKiBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLgorICAgICAqIENsZWFycyBhbGwgcHJldmlvdXMgYWJvcnQgcmVxdWVzdCwgYW5kIGFib3J0UmVxdWVzdGVkIHJldHVybnMgZmFsc2UgYWZ0ZXIKKyAgICAgKiBjYWxsaW5nIHRoaXMgbWV0aG9kLgogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIGNsZWFyQWJvcnRSZXF1ZXN0KCkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKQEAgLTcwNyw3ICs3NDIsOCBAQAogICAgIC8qKgogICAgICAqIEFkZHMgdGhlIElJT1JlYWRXYXJuaW5nTGlzdGVuZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBJSU9SZWFkV2FybmluZ0xpc3RlbmVyLgorICAgICAqIEBwYXJhbSBsaXN0ZW5lcgorICAgICAqICAgICAgICAgICAgdGhlIElJT1JlYWRXYXJuaW5nTGlzdGVuZXIuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkSUlPUmVhZFdhcm5pbmdMaXN0ZW5lcihJSU9SZWFkV2FybmluZ0xpc3RlbmVyIGxpc3RlbmVyKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwpAQCAtNzE2LDcgKzc1Miw4IEBACiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIElJT1JlYWRXYXJuaW5nTGlzdGVuZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBJSU9SZWFkV2FybmluZ0xpc3RlbmVyIHRvIGJlIHJlbW92ZWQuCisgICAgICogQHBhcmFtIGxpc3RlbmVyCisgICAgICogICAgICAgICAgICB0aGUgSUlPUmVhZFdhcm5pbmdMaXN0ZW5lciB0byBiZSByZW1vdmVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlbW92ZUlJT1JlYWRXYXJuaW5nTGlzdGVuZXIoSUlPUmVhZFdhcm5pbmdMaXN0ZW5lciBsaXN0ZW5lcikgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKQEAgLTczMiw3ICs3NjksOCBAQAogICAgIC8qKgogICAgICAqIEFkZHMgdGhlIElJT1JlYWRQcm9ncmVzc0xpc3RlbmVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgSUlPUmVhZFByb2dyZXNzTGlzdGVuZXIuCisgICAgICogQHBhcmFtIGxpc3RlbmVyCisgICAgICogICAgICAgICAgICB0aGUgSUlPUmVhZFByb2dyZXNzTGlzdGVuZXIuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkSUlPUmVhZFByb2dyZXNzTGlzdGVuZXIoSUlPUmVhZFByb2dyZXNzTGlzdGVuZXIgbGlzdGVuZXIpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CkBAIC03NDEsNyArNzc5LDggQEAKICAgICAvKioKICAgICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgSUlPUmVhZFByb2dyZXNzTGlzdGVuZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBJSU9SZWFkUHJvZ3Jlc3NMaXN0ZW5lciB0byBiZSByZW1vdmVkLgorICAgICAqIEBwYXJhbSBsaXN0ZW5lcgorICAgICAqICAgICAgICAgICAgdGhlIElJT1JlYWRQcm9ncmVzc0xpc3RlbmVyIHRvIGJlIHJlbW92ZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVtb3ZlSUlPUmVhZFByb2dyZXNzTGlzdGVuZXIoSUlPUmVhZFByb2dyZXNzTGlzdGVuZXIgbGlzdGVuZXIpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CkBAIC03NTcsNyArNzk2LDggQEAKICAgICAvKioKICAgICAgKiBBZGRzIHRoZSBJSU9SZWFkVXBkYXRlTGlzdGVuZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBJSU9SZWFkVXBkYXRlTGlzdGVuZXIuCisgICAgICogQHBhcmFtIGxpc3RlbmVyCisgICAgICogICAgICAgICAgICB0aGUgSUlPUmVhZFVwZGF0ZUxpc3RlbmVyLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZElJT1JlYWRVcGRhdGVMaXN0ZW5lcihJSU9SZWFkVXBkYXRlTGlzdGVuZXIgbGlzdGVuZXIpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CkBAIC03NjYsNyArODA2LDggQEAKICAgICAvKioKICAgICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgSUlPUmVhZFVwZGF0ZUxpc3RlbmVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgSUlPUmVhZFVwZGF0ZUxpc3RlbmVyIHRvIGJlIHJlbW92ZWQuCisgICAgICogQHBhcmFtIGxpc3RlbmVyCisgICAgICogICAgICAgICAgICB0aGUgSUlPUmVhZFVwZGF0ZUxpc3RlbmVyIHRvIGJlIHJlbW92ZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVtb3ZlSUlPUmVhZFVwZGF0ZUxpc3RlbmVyKElJT1JlYWRVcGRhdGVMaXN0ZW5lciBsaXN0ZW5lcikgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKQEAgLTc4MCwyMjkgKzgyMSwyNDMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgdGhlIHN0YXJ0IG9mIGFuIHNlcXVlbmNlIG9mIGltYWdlIHJlYWRzCi0gICAgICogYnkgY2FsbGluZyB0aGUgc2VxdWVuY2VTdGFydGVkIG1ldGhvZCBvbiBhbGwgcmVnaXN0ZXJlZCAKLSAgICAgKiBJSU9SZWFkUHJvZ3Jlc3NMaXN0ZW5lcnMuIAorICAgICAqIFByb2Nlc3NlcyB0aGUgc3RhcnQgb2YgYW4gc2VxdWVuY2Ugb2YgaW1hZ2UgcmVhZHMgYnkgY2FsbGluZyB0aGUKKyAgICAgKiBzZXF1ZW5jZVN0YXJ0ZWQgbWV0aG9kIG9uIGFsbCByZWdpc3RlcmVkIElJT1JlYWRQcm9ncmVzc0xpc3RlbmVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWluSW5kZXggdGhlIG1pbmltdW0gaW5kZXguCisgICAgICogQHBhcmFtIG1pbkluZGV4CisgICAgICogICAgICAgICAgICB0aGUgbWluaW11bSBpbmRleC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzU2VxdWVuY2VTdGFydGVkKGludCBtaW5JbmRleCkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgdGhlIGNvbXBsZXRpb24gb2YgYW4gc2VxdWVuY2Ugb2YgaW1hZ2UgcmVhZHMKLSAgICAgKiBieSBjYWxsaW5nIHNlcXVlbmNlQ29tcGxldGUgbWV0aG9kIG9uIGFsbCByZWdpc3RlcmVkIAotICAgICAqIElJT1JlYWRQcm9ncmVzc0xpc3RlbmVycy4gCisgICAgICogUHJvY2Vzc2VzIHRoZSBjb21wbGV0aW9uIG9mIGFuIHNlcXVlbmNlIG9mIGltYWdlIHJlYWRzIGJ5IGNhbGxpbmcKKyAgICAgKiBzZXF1ZW5jZUNvbXBsZXRlIG1ldGhvZCBvbiBhbGwgcmVnaXN0ZXJlZCBJSU9SZWFkUHJvZ3Jlc3NMaXN0ZW5lcnMuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1NlcXVlbmNlQ29tcGxldGUoKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyB0aGUgc3RhcnQgb2YgYW4gaW1hZ2UgcmVhZCBieSBjYWxsaW5nIHRoZSBpbWFnZVN0YXJ0ZWQKLSAgICAgKiBtZXRob2Qgb24gYWxsIHJlZ2lzdGVyZWQgSUlPUmVhZFByb2dyZXNzTGlzdGVuZXJzLgorICAgICAqIFByb2Nlc3NlcyB0aGUgc3RhcnQgb2YgYW4gaW1hZ2UgcmVhZCBieSBjYWxsaW5nIHRoZSBpbWFnZVN0YXJ0ZWQgbWV0aG9kCisgICAgICogb24gYWxsIHJlZ2lzdGVyZWQgSUlPUmVhZFByb2dyZXNzTGlzdGVuZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZUluZGV4IHRoZSBpbWFnZSBpbmRleC4KKyAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGluZGV4LgogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NJbWFnZVN0YXJ0ZWQoaW50IGltYWdlSW5kZXgpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIHRoZSBjdXJyZW50IHBlcmNlbnRhZ2Ugb2YgaW1hZ2UgY29tcGxldGlvbiBieSBjYWxsaW5nIAotICAgICAqIHRoZSBpbWFnZVByb2dyZXNzIG1ldGhvZCBvbiBhbGwgcmVnaXN0ZXJlZCBJSU9SZWFkUHJvZ3Jlc3NMaXN0ZW5lcnMuCisgICAgICogUHJvY2Vzc2VzIHRoZSBjdXJyZW50IHBlcmNlbnRhZ2Ugb2YgaW1hZ2UgY29tcGxldGlvbiBieSBjYWxsaW5nIHRoZQorICAgICAqIGltYWdlUHJvZ3Jlc3MgbWV0aG9kIG9uIGFsbCByZWdpc3RlcmVkIElJT1JlYWRQcm9ncmVzc0xpc3RlbmVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGVyY2VudGFnZURvbmUgdGhlIHBlcmNlbnRhZ2UgZG9uZS4KKyAgICAgKiBAcGFyYW0gcGVyY2VudGFnZURvbmUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwZXJjZW50YWdlIGRvbmUuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0ltYWdlUHJvZ3Jlc3MoZmxvYXQgcGVyY2VudGFnZURvbmUpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIGltYWdlIGNvbXBsZXRpb24gYnkgY2FsbGluZyB0aGUgaW1hZ2VDb21wbGV0ZSBtZXRob2QKLSAgICAgKiBvbiBhbGwgcmVnaXN0ZXJlZCBJSU9SZWFkUHJvZ3Jlc3NMaXN0ZW5lcnMuIAorICAgICAqIFByb2Nlc3NlcyBpbWFnZSBjb21wbGV0aW9uIGJ5IGNhbGxpbmcgdGhlIGltYWdlQ29tcGxldGUgbWV0aG9kIG9uIGFsbAorICAgICAqIHJlZ2lzdGVyZWQgSUlPUmVhZFByb2dyZXNzTGlzdGVuZXJzLgogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NJbWFnZUNvbXBsZXRlKCkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgdGhlIHN0YXJ0IG9mIGEgdGh1bWJuYWlsIHJlYWQgYnkgY2FsbGluZyB0aGUKLSAgICAgKiB0aHVtYm5haWxTdGFydGVkIG1ldGhvZCBvbiBhbGwgcmVnaXN0ZXJlZCBJSU9SZWFkUHJvZ3Jlc3NMaXN0ZW5lcnMuIAorICAgICAqIFByb2Nlc3NlcyB0aGUgc3RhcnQgb2YgYSB0aHVtYm5haWwgcmVhZCBieSBjYWxsaW5nIHRoZSB0aHVtYm5haWxTdGFydGVkCisgICAgICogbWV0aG9kIG9uIGFsbCByZWdpc3RlcmVkIElJT1JlYWRQcm9ncmVzc0xpc3RlbmVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleCB0aGUgaW1hZ2UgaW5kZXguCi0gICAgICogQHBhcmFtIHRodW1ibmFpbEluZGV4IHRoZSB0aHVtYm5haWwgaW5kZXguCisgICAgICogQHBhcmFtIGltYWdlSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBpbmRleC4KKyAgICAgKiBAcGFyYW0gdGh1bWJuYWlsSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSB0aHVtYm5haWwgaW5kZXguCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1RodW1ibmFpbFN0YXJ0ZWQoaW50IGltYWdlSW5kZXgsIGludCB0aHVtYm5haWxJbmRleCkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgdGhlIGN1cnJlbnQgcGVyY2VudGFnZSBvZiB0aHVtYm5haWwgY29tcGxldGlvbiAKLSAgICAgKiBieSBjYWxsaW5nIHRoZSB0aHVtYm5haWxQcm9ncmVzcyBtZXRob2Qgb24gYWxsIHJlZ2lzdGVyZWQgCi0gICAgICogSUlPUmVhZFByb2dyZXNzTGlzdGVuZXJzLgorICAgICAqIFByb2Nlc3NlcyB0aGUgY3VycmVudCBwZXJjZW50YWdlIG9mIHRodW1ibmFpbCBjb21wbGV0aW9uIGJ5IGNhbGxpbmcgdGhlCisgICAgICogdGh1bWJuYWlsUHJvZ3Jlc3MgbWV0aG9kIG9uIGFsbCByZWdpc3RlcmVkIElJT1JlYWRQcm9ncmVzc0xpc3RlbmVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGVyY2VudGFnZURvbmUgdGhlIHBlcmNlbnRhZ2UgZG9uZS4KKyAgICAgKiBAcGFyYW0gcGVyY2VudGFnZURvbmUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwZXJjZW50YWdlIGRvbmUuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1RodW1ibmFpbFByb2dyZXNzKGZsb2F0IHBlcmNlbnRhZ2VEb25lKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyB0aGUgY29tcGxldGlvbiBvZiBhIHRodW1ibmFpbCByZWFkIAotICAgICAqIGJ5IGNhbGxpbmcgdGhlIHRodW1ibmFpbENvbXBsZXRlIG1ldGhvZCAKLSAgICAgKiBvbiBhbGwgcmVnaXN0ZXJlZCBJSU9SZWFkUHJvZ3Jlc3NMaXN0ZW5lcnMuIAorICAgICAqIFByb2Nlc3NlcyB0aGUgY29tcGxldGlvbiBvZiBhIHRodW1ibmFpbCByZWFkIGJ5IGNhbGxpbmcgdGhlCisgICAgICogdGh1bWJuYWlsQ29tcGxldGUgbWV0aG9kIG9uIGFsbCByZWdpc3RlcmVkIElJT1JlYWRQcm9ncmVzc0xpc3RlbmVycy4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVGh1bWJuYWlsQ29tcGxldGUoKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyBhIHJlYWQgYWJvcnRlZCBldmVudCBieSBjYWxsaW5nIHRoZSByZWFkQWJvcnRlZCAKLSAgICAgKiBtZXRob2Qgb24gYWxsIHJlZ2lzdGVyZWQgSUlPUmVhZFByb2dyZXNzTGlzdGVuZXJzLgorICAgICAqIFByb2Nlc3NlcyBhIHJlYWQgYWJvcnRlZCBldmVudCBieSBjYWxsaW5nIHRoZSByZWFkQWJvcnRlZCBtZXRob2Qgb24gYWxsCisgICAgICogcmVnaXN0ZXJlZCBJSU9SZWFkUHJvZ3Jlc3NMaXN0ZW5lcnMuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1JlYWRBYm9ydGVkKCkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgdGhlIGJlZ2lubmluZyBvZiBhIHByb2dyZXNzaXZlIHBhc3MgYnkgY2FsbGluZyAKLSAgICAgKiB0aGUgcGFzc1N0YXJ0ZWQgbWV0aG9kIG9uIGFsbCByZWdpc3RlcmVkIElJT1JlYWRVcGRhdGVMaXN0ZW5lcnMuCisgICAgICogUHJvY2Vzc2VzIHRoZSBiZWdpbm5pbmcgb2YgYSBwcm9ncmVzc2l2ZSBwYXNzIGJ5IGNhbGxpbmcgdGhlIHBhc3NTdGFydGVkCisgICAgICogbWV0aG9kIG9uIGFsbCByZWdpc3RlcmVkIElJT1JlYWRVcGRhdGVMaXN0ZW5lcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHRoZUltYWdlIHRoZSBpbWFnZSB0byBiZSB1cGRhdGVkLgotICAgICAqIEBwYXJhbSBwYXNzIHRoZSBjdXJyZW50IHBhc3MgaW5kZXguCi0gICAgICogQHBhcmFtIG1pblBhc3MgdGhlIG1pbmltdW0gcGFzcyBpbmRleC4KLSAgICAgKiBAcGFyYW0gbWF4UGFzcyB0aGUgbWF4aW11bSBwYXNzIGluZGV4LgotICAgICAqIEBwYXJhbSBtaW5YIHRoZSBYIGNvb3JkaW5hdGUgb2Ygb2YgdGhlIHVwcGVyIGxlZnQgcGl4ZWwuIAotICAgICAqIEBwYXJhbSBtaW5ZIHRoZSBZIGNvb3JkaW5hdGUgb2Ygb2YgdGhlIHVwcGVyIGxlZnQgcGl4ZWwuCi0gICAgICogQHBhcmFtIHBlcmlvZFggdGhlIGhvcml6b250YWwgc2VwYXJhdGlvbiBiZXR3ZWVuIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gcGVyaW9kWSB0aGUgdmVydGljYWwgc2VwYXJhdGlvbiBiZXR3ZWVuIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gYmFuZHMgdGhlIG51bWJlciBvZiBhZmZlY3RlZCBiYW5kcy4KKyAgICAgKiBAcGFyYW0gdGhlSW1hZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSB0byBiZSB1cGRhdGVkLgorICAgICAqIEBwYXJhbSBwYXNzCisgICAgICogICAgICAgICAgICB0aGUgY3VycmVudCBwYXNzIGluZGV4LgorICAgICAqIEBwYXJhbSBtaW5QYXNzCisgICAgICogICAgICAgICAgICB0aGUgbWluaW11bSBwYXNzIGluZGV4LgorICAgICAqIEBwYXJhbSBtYXhQYXNzCisgICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBwYXNzIGluZGV4LgorICAgICAqIEBwYXJhbSBtaW5YCisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIG9mIHRoZSB1cHBlciBsZWZ0IHBpeGVsLgorICAgICAqIEBwYXJhbSBtaW5ZCisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIG9mIHRoZSB1cHBlciBsZWZ0IHBpeGVsLgorICAgICAqIEBwYXJhbSBwZXJpb2RYCisgICAgICogICAgICAgICAgICB0aGUgaG9yaXpvbnRhbCBzZXBhcmF0aW9uIGJldHdlZW4gcGl4ZWxzLgorICAgICAqIEBwYXJhbSBwZXJpb2RZCisgICAgICogICAgICAgICAgICB0aGUgdmVydGljYWwgc2VwYXJhdGlvbiBiZXR3ZWVuIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gYmFuZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYWZmZWN0ZWQgYmFuZHMuCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1Bhc3NTdGFydGVkKEJ1ZmZlcmVkSW1hZ2UgdGhlSW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pblBhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heFBhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pblgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pblksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBlcmlvZFgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBlcmlvZFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50W10gYmFuZHMpIHsKKyAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzUGFzc1N0YXJ0ZWQoQnVmZmVyZWRJbWFnZSB0aGVJbWFnZSwgaW50IHBhc3MsIGludCBtaW5QYXNzLCBpbnQgbWF4UGFzcywKKyAgICAgICAgICAgIGludCBtaW5YLCBpbnQgbWluWSwgaW50IHBlcmlvZFgsIGludCBwZXJpb2RZLCBpbnRbXSBiYW5kcykgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgdGhlIHVwZGF0ZSBvZiBhIHNldCBvZiBzYW1wbGVzIGJ5IGNhbGxpbmcgCi0gICAgICogdGhlIGltYWdlVXBkYXRlIG1ldGhvZCBvbiBhbGwgcmVnaXN0ZXJlZCBJSU9SZWFkVXBkYXRlTGlzdGVuZXJzLiAgCisgICAgICogUHJvY2Vzc2VzIHRoZSB1cGRhdGUgb2YgYSBzZXQgb2Ygc2FtcGxlcyBieSBjYWxsaW5nIHRoZSBpbWFnZVVwZGF0ZQorICAgICAqIG1ldGhvZCBvbiBhbGwgcmVnaXN0ZXJlZCBJSU9SZWFkVXBkYXRlTGlzdGVuZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0aGVJbWFnZSB0aGUgaW1hZ2UgdG8gYmUgdXBkYXRlZC4KLSAgICAgKiBAcGFyYW0gbWluWCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IHBpeGVsLgotICAgICAqIEBwYXJhbSBtaW5ZIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgcGl4ZWwuCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB1cGRhdGVkIGFyZWEuCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHVwZGF0ZWQgYXJlYS4KLSAgICAgKiBAcGFyYW0gcGVyaW9kWCB0aGUgaG9yaXpvbnRhbCBzZXBhcmF0aW9uIGJldHdlZW4gcGl4ZWxzLgotICAgICAqIEBwYXJhbSBwZXJpb2RZIHRoZSB2ZXJ0aWNhbCBzZXBhcmF0aW9uIGJldHdlZW4gcGl4ZWxzLgotICAgICAqIEBwYXJhbSBiYW5kcyB0aGUgbnVtYmVyIG9mIGFmZmVjdGVkIGJhbmRzLgorICAgICAqIEBwYXJhbSB0aGVJbWFnZQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIHRvIGJlIHVwZGF0ZWQuCisgICAgICogQHBhcmFtIG1pblgKKyAgICAgKiAgICAgICAgICAgIHRoZSBYIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgcGl4ZWwuCisgICAgICogQHBhcmFtIG1pblkKKyAgICAgKiAgICAgICAgICAgIHRoZSBZIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgcGl4ZWwuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdXBkYXRlZCBhcmVhLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdXBkYXRlZCBhcmVhLgorICAgICAqIEBwYXJhbSBwZXJpb2RYCisgICAgICogICAgICAgICAgICB0aGUgaG9yaXpvbnRhbCBzZXBhcmF0aW9uIGJldHdlZW4gcGl4ZWxzLgorICAgICAqIEBwYXJhbSBwZXJpb2RZCisgICAgICogICAgICAgICAgICB0aGUgdmVydGljYWwgc2VwYXJhdGlvbiBiZXR3ZWVuIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gYmFuZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYWZmZWN0ZWQgYmFuZHMuCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0ltYWdlVXBkYXRlKEJ1ZmZlcmVkSW1hZ2UgdGhlSW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pblgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pblksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBlcmlvZFgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBlcmlvZFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50W10gYmFuZHMpIHsKKyAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSW1hZ2VVcGRhdGUoQnVmZmVyZWRJbWFnZSB0aGVJbWFnZSwgaW50IG1pblgsIGludCBtaW5ZLCBpbnQgd2lkdGgsCisgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnQgcGVyaW9kWCwgaW50IHBlcmlvZFksIGludFtdIGJhbmRzKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyB0aGUgZW5kIG9mIGEgcHJvZ3Jlc3NpdmUgcGFzcyBieSBjYWxsaW5nIHBhc3NDb21wbGV0ZQotICAgICAqIG1ldGhvZCBvZiByZWdpc3RlcmVkIElJT1JlYWRVcGRhdGVMaXN0ZW5lcnMuCisgICAgICogUHJvY2Vzc2VzIHRoZSBlbmQgb2YgYSBwcm9ncmVzc2l2ZSBwYXNzIGJ5IGNhbGxpbmcgcGFzc0NvbXBsZXRlIG1ldGhvZCBvZgorICAgICAqIHJlZ2lzdGVyZWQgSUlPUmVhZFVwZGF0ZUxpc3RlbmVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGhlSW1hZ2UgdGhlIGltYWdlIHRvIGJlIHVwZGF0ZWQuCisgICAgICogQHBhcmFtIHRoZUltYWdlCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgdG8gYmUgdXBkYXRlZC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzUGFzc0NvbXBsZXRlKEJ1ZmZlcmVkSW1hZ2UgdGhlSW1hZ2UpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIHRoZSBiZWdpbm5pbmcgb2YgYSB0aHVtYm5haWwgcHJvZ3Jlc3NpdmUgcGFzcwotICAgICAqIGJ5IGNhbGxpbmcgdGhlIHRodW1ibmFpbFBhc3NTdGFydGVkIG1ldGhvZCBvbiBhbGwgCi0gICAgICogcmVnaXN0ZXJlZCBJSU9SZWFkVXBkYXRlTGlzdGVuZXJzLgorICAgICAqIFByb2Nlc3NlcyB0aGUgYmVnaW5uaW5nIG9mIGEgdGh1bWJuYWlsIHByb2dyZXNzaXZlIHBhc3MgYnkgY2FsbGluZyB0aGUKKyAgICAgKiB0aHVtYm5haWxQYXNzU3RhcnRlZCBtZXRob2Qgb24gYWxsIHJlZ2lzdGVyZWQgSUlPUmVhZFVwZGF0ZUxpc3RlbmVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGhlVGh1bWJuYWlsIHRoZSB0aGUgdGh1bWJuYWlsIHRvIGJlIHVwZGF0ZWQuCi0gICAgICogQHBhcmFtIHBhc3MgdGhlIGN1cnJlbnQgcGFzcyBpbmRleC4KLSAgICAgKiBAcGFyYW0gbWluUGFzcyB0aGUgbWluaW11bSBwYXNzIGluZGV4LgotICAgICAqIEBwYXJhbSBtYXhQYXNzIHRoZSBtYXhpbXVtIHBhc3MgaW5kZXguCi0gICAgICogQHBhcmFtIG1pblggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBwaXhlbC4gCi0gICAgICogQHBhcmFtIG1pblkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBwaXhlbC4KLSAgICAgKiBAcGFyYW0gcGVyaW9kWCB0aGUgaG9yaXpvbnRhbCBzZXBhcmF0aW9uIGJldHdlZW4gcGl4ZWxzLgotICAgICAqIEBwYXJhbSBwZXJpb2RZIHRoZSB2ZXJ0aWNhbCBzZXBhcmF0aW9uIGJldHdlZW4gcGl4ZWxzLgotICAgICAqIEBwYXJhbSBiYW5kcyB0aGUgbnVtYmVyIG9mIGFmZmVjdGVkIGJhbmRzLgorICAgICAqIEBwYXJhbSB0aGVUaHVtYm5haWwKKyAgICAgKiAgICAgICAgICAgIHRoZSB0aHVtYm5haWwgdG8gYmUgdXBkYXRlZC4KKyAgICAgKiBAcGFyYW0gcGFzcworICAgICAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgcGFzcyBpbmRleC4KKyAgICAgKiBAcGFyYW0gbWluUGFzcworICAgICAqICAgICAgICAgICAgdGhlIG1pbmltdW0gcGFzcyBpbmRleC4KKyAgICAgKiBAcGFyYW0gbWF4UGFzcworICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gcGFzcyBpbmRleC4KKyAgICAgKiBAcGFyYW0gbWluWAorICAgICAqICAgICAgICAgICAgdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBwaXhlbC4KKyAgICAgKiBAcGFyYW0gbWluWQorICAgICAqICAgICAgICAgICAgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBwaXhlbC4KKyAgICAgKiBAcGFyYW0gcGVyaW9kWAorICAgICAqICAgICAgICAgICAgdGhlIGhvcml6b250YWwgc2VwYXJhdGlvbiBiZXR3ZWVuIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gcGVyaW9kWQorICAgICAqICAgICAgICAgICAgdGhlIHZlcnRpY2FsIHNlcGFyYXRpb24gYmV0d2VlbiBwaXhlbHMuCisgICAgICogQHBhcmFtIGJhbmRzCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGFmZmVjdGVkIGJhbmRzLgogICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NUaHVtYm5haWxQYXNzU3RhcnRlZChCdWZmZXJlZEltYWdlIHRoZVRodW1ibmFpbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWluUGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4UGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWluWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWluWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGVyaW9kWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGVyaW9kWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRbXSBiYW5kcykgeworICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NUaHVtYm5haWxQYXNzU3RhcnRlZChCdWZmZXJlZEltYWdlIHRoZVRodW1ibmFpbCwgaW50IHBhc3MsIGludCBtaW5QYXNzLAorICAgICAgICAgICAgaW50IG1heFBhc3MsIGludCBtaW5YLCBpbnQgbWluWSwgaW50IHBlcmlvZFgsIGludCBwZXJpb2RZLCBpbnRbXSBiYW5kcykgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgdGhlIHVwZGF0ZSBvZiBhIHNldCBvZiBzYW1wbGVzIGluIGEgdGh1bWJuYWlsIAotICAgICAqIGltYWdlIGJ5IGNhbGxpbmcgdGhlIHRodW1ibmFpbFVwZGF0ZSBtZXRob2Qgb24gYWxsCi0gICAgICogcmVnaXN0ZXJlZCBJSU9SZWFkVXBkYXRlTGlzdGVuZXJzLiAKKyAgICAgKiBQcm9jZXNzZXMgdGhlIHVwZGF0ZSBvZiBhIHNldCBvZiBzYW1wbGVzIGluIGEgdGh1bWJuYWlsIGltYWdlIGJ5IGNhbGxpbmcKKyAgICAgKiB0aGUgdGh1bWJuYWlsVXBkYXRlIG1ldGhvZCBvbiBhbGwgcmVnaXN0ZXJlZCBJSU9SZWFkVXBkYXRlTGlzdGVuZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0aGVUaHVtYm5haWwgdGhlIHRoZSB0aHVtYm5haWwgdG8gYmUgdXBkYXRlZC4KLSAgICAgKiBAcGFyYW0gbWluWCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IHBpeGVsLiAKLSAgICAgKiBAcGFyYW0gbWluWSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IHBpeGVsLgotICAgICAqIEBwYXJhbSBwZXJpb2RYIHRoZSBob3Jpem9udGFsIHNlcGFyYXRpb24gYmV0d2VlbiBwaXhlbHMuCi0gICAgICogQHBhcmFtIHBlcmlvZFkgdGhlIHZlcnRpY2FsIHNlcGFyYXRpb24gYmV0d2VlbiBwaXhlbHMuCi0gICAgICogQHBhcmFtIGJhbmRzIHRoZSBudW1iZXIgb2YgYWZmZWN0ZWQgYmFuZHMuCisgICAgICogQHBhcmFtIHRoZVRodW1ibmFpbAorICAgICAqICAgICAgICAgICAgdGhlIHRodW1ibmFpbCB0byBiZSB1cGRhdGVkLgorICAgICAqIEBwYXJhbSBtaW5YCisgICAgICogICAgICAgICAgICB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IHBpeGVsLgorICAgICAqIEBwYXJhbSBtaW5ZCisgICAgICogICAgICAgICAgICB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IHBpeGVsLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHRvdGFsIHdpZHRoIG9mIHRoZSB1cGRhdGVkIGFyZWEuCisgICAgICogQHBhcmFtIGhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIHRvdGFsIGhlaWdodCBvZiB0aGUgdXBkYXRlZCBhcmVhLgorICAgICAqIEBwYXJhbSBwZXJpb2RYCisgICAgICogICAgICAgICAgICB0aGUgaG9yaXpvbnRhbCBzZXBhcmF0aW9uIGJldHdlZW4gcGl4ZWxzLgorICAgICAqIEBwYXJhbSBwZXJpb2RZCisgICAgICogICAgICAgICAgICB0aGUgdmVydGljYWwgc2VwYXJhdGlvbiBiZXR3ZWVuIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gYmFuZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYWZmZWN0ZWQgYmFuZHMuCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1RodW1ibmFpbFVwZGF0ZShCdWZmZXJlZEltYWdlIHRoZVRodW1ibmFpbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pblgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW5ZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwZXJpb2RYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGVyaW9kWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludFtdIGJhbmRzKSB7CisgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1RodW1ibmFpbFVwZGF0ZShCdWZmZXJlZEltYWdlIHRoZVRodW1ibmFpbCwgaW50IG1pblgsIGludCBtaW5ZLAorICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcGVyaW9kWCwgaW50IHBlcmlvZFksIGludFtdIGJhbmRzKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyB0aGUgZW5kIG9mIGEgdGh1bWJuYWlsIHByb2dyZXNzaXZlIHBhc3MgCi0gICAgICogYnkgY2FsbGluZyB0aGUgdGh1bWJuYWlsUGFzc0NvbXBsZXRlIG1ldGhvZAotICAgICAqIG9uIGFsbCByZWdpc3RlcmVkIElJT1JlYWRVcGRhdGVMaXN0ZW5lcnMuIAorICAgICAqIFByb2Nlc3NlcyB0aGUgZW5kIG9mIGEgdGh1bWJuYWlsIHByb2dyZXNzaXZlIHBhc3MgYnkgY2FsbGluZyB0aGUKKyAgICAgKiB0aHVtYm5haWxQYXNzQ29tcGxldGUgbWV0aG9kIG9uIGFsbCByZWdpc3RlcmVkIElJT1JlYWRVcGRhdGVMaXN0ZW5lcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHRoZVRodW1ibmFpbCB0aGUgdGh1bWJuYWlsIHRvIGJlIHVwZGF0ZWQuCisgICAgICogQHBhcmFtIHRoZVRodW1ibmFpbAorICAgICAqICAgICAgICAgICAgdGhlIHRodW1ibmFpbCB0byBiZSB1cGRhdGVkLgogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NUaHVtYm5haWxQYXNzQ29tcGxldGUoQnVmZmVyZWRJbWFnZSB0aGVUaHVtYm5haWwpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIGEgd2FybmluZyBtZXNzYWdlIGJ5IGNhbGxpbmcgd2FybmluZ09jY3VycmVkIG1ldGhvZAotICAgICAqIG9mIHJlZ2lzdGVyZWQgSUlPUmVhZFdhcm5pbmdMaXN0ZW5lcnMuCisgICAgICogUHJvY2Vzc2VzIGEgd2FybmluZyBtZXNzYWdlIGJ5IGNhbGxpbmcgd2FybmluZ09jY3VycmVkIG1ldGhvZCBvZgorICAgICAqIHJlZ2lzdGVyZWQgSUlPUmVhZFdhcm5pbmdMaXN0ZW5lcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHdhcm5pbmcgdGhlIHdhcm5pbmcuCisgICAgICogQHBhcmFtIHdhcm5pbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSB3YXJuaW5nLgogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NXYXJuaW5nT2NjdXJyZWQoU3RyaW5nIHdhcm5pbmcpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIGEgd2FybmluZyBieSBjYWxsaW5nIHRoZSB3YXJuaW5nT2NjdXJyZWQgbWV0aG9kIAotICAgICAqIG9mIG9uIGFsbCByZWdpc3RlcmVkIElJT1JlYWRXYXJuaW5nTGlzdGVuZXJzLgorICAgICAqIFByb2Nlc3NlcyBhIHdhcm5pbmcgYnkgY2FsbGluZyB0aGUgd2FybmluZ09jY3VycmVkIG1ldGhvZCBvZiBvbiBhbGwKKyAgICAgKiByZWdpc3RlcmVkIElJT1JlYWRXYXJuaW5nTGlzdGVuZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBiYXNlTmFtZSB0aGUgYmFzZSBuYW1lIG9mIFJlc291cmNlQnVuZGxlcy4KLSAgICAgKiBAcGFyYW0ga2V5d29yZCB0aGUga2V5d29yZCB0byBpbmRleCB0aGUgd2FybmluZyBhbW9uZyBSZXNvdXJjZUJ1bmRsZXMuCisgICAgICogQHBhcmFtIGJhc2VOYW1lCisgICAgICogICAgICAgICAgICB0aGUgYmFzZSBuYW1lIG9mIFJlc291cmNlQnVuZGxlcy4KKyAgICAgKiBAcGFyYW0ga2V5d29yZAorICAgICAqICAgICAgICAgICAgdGhlIGtleXdvcmQgdG8gaW5kZXggdGhlIHdhcm5pbmcgYW1vbmcgUmVzb3VyY2VCdW5kbGVzLgogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NXYXJuaW5nT2NjdXJyZWQoU3RyaW5nIGJhc2VOYW1lLCBTdHJpbmcga2V5d29yZCkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKQEAgLTEwMjksMTMgKzEwODQsMTUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSByZWdpb24gb2Ygc291cmNlIGltYWdlIHRoYXQgc2hvdWxkIGJlIHJlYWQgd2l0aCB0aGUgCi0gICAgICogc3BlY2lmaWVkIHdpZHRoLCBoZWlnaHQgYW5kIEltYWdlUmVhZFBhcmFtLiAKKyAgICAgKiBHZXRzIHRoZSByZWdpb24gb2Ygc291cmNlIGltYWdlIHRoYXQgc2hvdWxkIGJlIHJlYWQgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogd2lkdGgsIGhlaWdodCBhbmQgSW1hZ2VSZWFkUGFyYW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIHBhcmFtIHRoZSBJbWFnZVJlYWRQYXJhbSBvYmplY3QsIG9yIG51bGwuCi0gICAgICogQHBhcmFtIHNyY1dpZHRoIHRoZSBzb3VyY2UgaW1hZ2UncyB3aWR0aC4KLSAgICAgKiBAcGFyYW0gc3JjSGVpZ2h0IHRoZSBzb3VyY2UgaW1hZ2UncyAgaGVpZ2h0LgotICAgICAqIAorICAgICAqIEBwYXJhbSBwYXJhbQorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlUmVhZFBhcmFtIG9iamVjdCwgb3IgbnVsbC4KKyAgICAgKiBAcGFyYW0gc3JjV2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgaW1hZ2UncyB3aWR0aC4KKyAgICAgKiBAcGFyYW0gc3JjSGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIGltYWdlJ3MgaGVpZ2h0LgogICAgICAqIEByZXR1cm4gdGhlIFJlY3RhbmdsZSBvZiBzb3VyY2UgcmVnaW9uLgogICAgICAqLwogICAgIHByb3RlY3RlZCBzdGF0aWMgUmVjdGFuZ2xlIGdldFNvdXJjZVJlZ2lvbihJbWFnZVJlYWRQYXJhbSBwYXJhbSwgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0KSB7CkBAIC0xMDQzLDU4ICsxMTAwLDYzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29tcHV0ZXMgdGhlIHNwZWNpZmllZCBzb3VyY2UgcmVnaW9uIGFuZCB0aGUgc3BlY2lmaWVkIGRlc3RpbmF0aW9uIAotICAgICAqIHJlZ2lvbiB3aXRoIHRoZSBzcGVjaWZpZWQgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHNvdXJjZSBpbWFnZSwKLSAgICAgKiBhbiBvcHRpb25hbCBkZXN0aW5hdGlvbiBpbWFnZSwgYW5kIGFuIEltYWdlUmVhZFBhcmFtLiAKKyAgICAgKiBDb21wdXRlcyB0aGUgc3BlY2lmaWVkIHNvdXJjZSByZWdpb24gYW5kIHRoZSBzcGVjaWZpZWQgZGVzdGluYXRpb24gcmVnaW9uCisgICAgICogd2l0aCB0aGUgc3BlY2lmaWVkIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBzb3VyY2UgaW1hZ2UsIGFuIG9wdGlvbmFsCisgICAgICogZGVzdGluYXRpb24gaW1hZ2UsIGFuZCBhbiBJbWFnZVJlYWRQYXJhbS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyYW0gdGhlIGFuIEltYWdlUmVhZFBhcmFtIG9iamVjdCwgb3IgbnVsbC4KLSAgICAgKiBAcGFyYW0gc3JjV2lkdGggdGhlIHNvdXJjZSBpbWFnZSdzIHdpZHRoLgotICAgICAqIEBwYXJhbSBzcmNIZWlnaHQgdGhlIHNvdXJjZSBpbWFnZSdzIGhlaWdodC4KLSAgICAgKiBAcGFyYW0gaW1hZ2UgdGhlIGRlc3RpbmF0aW9uIGltYWdlLgotICAgICAqIEBwYXJhbSBzcmNSZWdpb24gdGhlIHNvdXJjZSByZWdpb24uCi0gICAgICogQHBhcmFtIGRlc3RSZWdpb24gdGhlIGRlc3RpbmF0aW9uIHJlZ2lvbi4KKyAgICAgKiBAcGFyYW0gcGFyYW0KKyAgICAgKiAgICAgICAgICAgIHRoZSBhbiBJbWFnZVJlYWRQYXJhbSBvYmplY3QsIG9yIG51bGwuCisgICAgICogQHBhcmFtIHNyY1dpZHRoCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIGltYWdlJ3Mgd2lkdGguCisgICAgICogQHBhcmFtIHNyY0hlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBpbWFnZSdzIGhlaWdodC4KKyAgICAgKiBAcGFyYW0gaW1hZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiBpbWFnZS4KKyAgICAgKiBAcGFyYW0gc3JjUmVnaW9uCisgICAgICogICAgICAgICAgICB0aGUgc291cmNlIHJlZ2lvbi4KKyAgICAgKiBAcGFyYW0gZGVzdFJlZ2lvbgorICAgICAqICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIHJlZ2lvbi4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgY29tcHV0ZVJlZ2lvbnMoSW1hZ2VSZWFkUGFyYW0gcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyZWRJbWFnZSBpbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWN0YW5nbGUgc3JjUmVnaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY3RhbmdsZSBkZXN0UmVnaW9uKSB7CisgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGNvbXB1dGVSZWdpb25zKEltYWdlUmVhZFBhcmFtIHBhcmFtLCBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsCisgICAgICAgICAgICBCdWZmZXJlZEltYWdlIGltYWdlLCBSZWN0YW5nbGUgc3JjUmVnaW9uLCBSZWN0YW5nbGUgZGVzdFJlZ2lvbikgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGVja3MgdGhlIHZhbGlkaXR5IG9mIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGJhbmQgYW5kIGlzIGNhbGxlZAotICAgICAqIHdoZW4gdGhlIHJlYWRlciBrbm93cyB0aGUgbnVtYmVyIG9mIGJhbmRzIG9mIHRoZSBzb3VyY2UgaW1hZ2UgYW5kIAotICAgICAqIHRoZSBudW1iZXIgb2YgYmFuZHMgb2YgdGhlIGRlc3RpbmF0aW9uIGltYWdlLiAKKyAgICAgKiBDaGVja3MgdGhlIHZhbGlkaXR5IG9mIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGJhbmQgYW5kIGlzIGNhbGxlZCB3aGVuCisgICAgICogdGhlIHJlYWRlciBrbm93cyB0aGUgbnVtYmVyIG9mIGJhbmRzIG9mIHRoZSBzb3VyY2UgaW1hZ2UgYW5kIHRoZSBudW1iZXIKKyAgICAgKiBvZiBiYW5kcyBvZiB0aGUgZGVzdGluYXRpb24gaW1hZ2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIHBhcmFtIHRoZSBJbWFnZVJlYWRQYXJhbSBmb3IgcmVhZGluZyB0aGUgSW1hZ2UuCi0gICAgICogQHBhcmFtIG51bVNyY0JhbmRzIHRoZSBudW1iZXIgb2YgYmFuZHMgaW4gdGhlIHNvdXJjZS4KLSAgICAgKiBAcGFyYW0gbnVtRHN0QmFuZHMgdGhlIG51bWJlciBvZiBiYW5kcyBpbiB0aGUgZGVzdGluYXRpb24uCisgICAgICogQHBhcmFtIHBhcmFtCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VSZWFkUGFyYW0gZm9yIHJlYWRpbmcgdGhlIEltYWdlLgorICAgICAqIEBwYXJhbSBudW1TcmNCYW5kcworICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBiYW5kcyBpbiB0aGUgc291cmNlLgorICAgICAqIEBwYXJhbSBudW1Ec3RCYW5kcworICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBiYW5kcyBpbiB0aGUgZGVzdGluYXRpb24uCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGNoZWNrUmVhZFBhcmFtQmFuZFNldHRpbmdzKEltYWdlUmVhZFBhcmFtIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1TcmNCYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtRHN0QmFuZHMpIHsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgY2hlY2tSZWFkUGFyYW1CYW5kU2V0dGluZ3MoSW1hZ2VSZWFkUGFyYW0gcGFyYW0sIGludCBudW1TcmNCYW5kcywKKyAgICAgICAgICAgIGludCBudW1Ec3RCYW5kcykgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkZXN0aW5hdGlvbiBpbWFnZSB3aGVyZSB0aGUgZGVjb2RlZCBkYXRhIGlzIHdyaXR0ZW4uIAorICAgICAqIEdldHMgdGhlIGRlc3RpbmF0aW9uIGltYWdlIHdoZXJlIHRoZSBkZWNvZGVkIGRhdGEgaXMgd3JpdHRlbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyYW0gdGhlIEltYWdlUmVhZFBhcmFtLgotICAgICAqIEBwYXJhbSBpbWFnZVR5cGVzIHRoZSBpdGVyYXRvciBvZiBJbWFnZVR5cGVTcGVjaWZpZXIgb2JqZWN0cy4KLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBiZWluZyBkZWNvZGVkLgotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UgYmVpbmcgZGVjb2RlZC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGFyYW0KKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVJlYWRQYXJhbS4KKyAgICAgKiBAcGFyYW0gaW1hZ2VUeXBlcworICAgICAqICAgICAgICAgICAgdGhlIGl0ZXJhdG9yIG9mIEltYWdlVHlwZVNwZWNpZmllciBvYmplY3RzLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBiZWluZyBkZWNvZGVkLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlIGJlaW5nIGRlY29kZWQuCiAgICAgICogQHJldHVybiB0aGUgQnVmZmVyZWRJbWFnZSB3aGVyZSBkZWNvZGVkIHBpeGVscyBzaG91bGQgYmUgd3JpdHRlbi4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElJT0V4Y2VwdGlvbiB0aGUgSUlPRXhjZXB0aW9uIGlzIHRocm93biBpZiAKLSAgICAgKiB0aGVyZSBpcyBubyBzdWl0YWJsZSBJbWFnZVR5cGVTcGVjaWZpZXIuCisgICAgICogQHRocm93cyBJSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICB0aGUgSUlPRXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGVyZSBpcyBubyBzdWl0YWJsZQorICAgICAqICAgICAgICAgICAgIEltYWdlVHlwZVNwZWNpZmllci4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIEJ1ZmZlcmVkSW1hZ2UgZ2V0RGVzdGluYXRpb24oSW1hZ2VSZWFkUGFyYW0gcGFyYW0sIEl0ZXJhdG9yPEltYWdlVHlwZVNwZWNpZmllcj4gaW1hZ2VUeXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJSU9FeGNlcHRpb24geworICAgIHByb3RlY3RlZCBzdGF0aWMgQnVmZmVyZWRJbWFnZSBnZXREZXN0aW5hdGlvbihJbWFnZVJlYWRQYXJhbSBwYXJhbSwKKyAgICAgICAgICAgIEl0ZXJhdG9yPEltYWdlVHlwZVNwZWNpZmllcj4gaW1hZ2VUeXBlcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB0aHJvd3MgSUlPRXhjZXB0aW9uIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvYXd0L2phdmF4L2ltYWdlaW8vSW1hZ2VUcmFuc2NvZGVyLmphdmEgYi9hd3QvamF2YXgvaW1hZ2Vpby9JbWFnZVRyYW5zY29kZXIuamF2YQppbmRleCAxYTBkZTc2Li42MzJkODkwIDEwMDY0NAotLS0gYS9hd3QvamF2YXgvaW1hZ2Vpby9JbWFnZVRyYW5zY29kZXIuamF2YQorKysgYi9hd3QvamF2YXgvaW1hZ2Vpby9JbWFnZVRyYW5zY29kZXIuamF2YQpAQCAtMTgsNDMgKzE4LDUwIEBACiAgKiBAYXV0aG9yIFJ1c3RlbSBWLiBSYWZpa292CiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMyAkCiAgKi8KKwogcGFja2FnZSBqYXZheC5pbWFnZWlvOwogCiBpbXBvcnQgamF2YXguaW1hZ2Vpby5tZXRhZGF0YS5JSU9NZXRhZGF0YTsKIGltcG9ydCBqYXZheC5pbWFnZWlvLkltYWdlVHlwZVNwZWNpZmllcjsKIAogLyoqCi0gKiBUaGUgSW1hZ2VUcmFuc2NvZGVyIGludGVyZmFjZSBpcyB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQKLSAqIHBlcmZvcm0gaW1hZ2UgdHJhbnNjb2Rpbmcgb3BlcmF0aW9ucywgdGhhdCBpcywgdGFrZSBpbWFnZXMgd3JpdHRlbgotICogaW4gb25lIGZvcm1hdCBhbmQgd3JpdGUgdGhlbSBpbiBhbm90aGVyIGZvcm1hdCB1c2luZwotICogcmVhZC93cml0ZSBvcGVyYXRpb25zLiBTb21lIGltYWdlIGRhdGEgY2FuIGJlIGxvc3QgaW4gc3VjaCBwcm9jZXNzZXMuCi0gKiBUaGUgSW1hZ2VUcmFuc2NvZGVyIGludGVyZmFjZSBjb252ZXJ0cyBtZXRhZGF0YSBvYmplY3RzIChJSU9NZXRhZGF0YSkKLSAqIG9mIEltYWdlUmVhZGVyIHRvIGFwcm9wcmlhdGUgbWV0YWRhdGEgb2JqZWN0IGZvciBJbWFnZVdyaXRlci4KKyAqIFRoZSBJbWFnZVRyYW5zY29kZXIgaW50ZXJmYWNlIGlzIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsYXNzZXMgdGhhdCBwZXJmb3JtCisgKiBpbWFnZSB0cmFuc2NvZGluZyBvcGVyYXRpb25zLCB0aGF0IGlzLCB0YWtlIGltYWdlcyB3cml0dGVuIGluIG9uZSBmb3JtYXQgYW5kCisgKiB3cml0ZSB0aGVtIGluIGFub3RoZXIgZm9ybWF0IHVzaW5nIHJlYWQvd3JpdGUgb3BlcmF0aW9ucy4gU29tZSBpbWFnZSBkYXRhIGNhbgorICogYmUgbG9zdCBpbiBzdWNoIHByb2Nlc3Nlcy4gVGhlIEltYWdlVHJhbnNjb2RlciBpbnRlcmZhY2UgY29udmVydHMgbWV0YWRhdGEKKyAqIG9iamVjdHMgKElJT01ldGFkYXRhKSBvZiBJbWFnZVJlYWRlciB0byBhcHByb3ByaWF0ZSBtZXRhZGF0YSBvYmplY3QgZm9yCisgKiBJbWFnZVdyaXRlci4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSW1hZ2VUcmFuc2NvZGVyIHsKLSAgICAKKwogICAgIC8qKgogICAgICAqIENvbnZlcnRzIHRoZSBzcGVjaWZpZWQgSUlPTWV0YWRhdGEgb2JqZWN0IHVzaW5nIHRoZSBzcGVjaWZpZWQKICAgICAgKiBJbWFnZVdyaXRlUGFyYW0gZm9yIG9idGFpbmluZyB3cml0ZXIncyBtZXRhZGF0YSBzdHJ1Y3R1cmUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGluRGF0YSB0aGUgSUlPTWV0YWRhdGEuCi0gICAgICogQHBhcmFtIHBhcmFtIHRoZSBJbWFnZVdyaXRlUGFyYW0uCi0gICAgICogCisgICAgICogQHBhcmFtIGluRGF0YQorICAgICAqICAgICAgICAgICAgdGhlIElJT01ldGFkYXRhLgorICAgICAqIEBwYXJhbSBwYXJhbQorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlV3JpdGVQYXJhbS4KICAgICAgKiBAcmV0dXJuIHRoZSBJSU9NZXRhZGF0YSwgb3IgbnVsbC4KICAgICAgKi8KICAgICBJSU9NZXRhZGF0YSBjb252ZXJ0U3RyZWFtTWV0YWRhdGEoSUlPTWV0YWRhdGEgaW5EYXRhLCBJbWFnZVdyaXRlUGFyYW0gcGFyYW0pOwogCiAgICAgLyoqCiAgICAgICogQ29udmVydHMgdGhlIHNwZWNpZmllZCBJSU9NZXRhZGF0YSBvYmplY3QgdXNpbmcgdGhlIHNwZWNpZmllZAotICAgICAqIEltYWdlV3JpdGVQYXJhbSBmb3Igb2J0YWluaW5nIHdyaXRlcidzIG1ldGFkYXRhIHN0cnVjdHVyZSAKLSAgICAgKiBhbmQgSW1hZ2VUeXBlU3BlY2lmaWVyIG9iamVjdCBmb3Igb2J0YWluaW5nIHRoZSBsYXlvdXQgYW5kIAotICAgICAqIGNvbG9yIGluZm9ybWF0aW9uIG9mIHRoZSBpbWFnZSBmb3IgdGhpcyBtZXRhZGF0YS4KKyAgICAgKiBJbWFnZVdyaXRlUGFyYW0gZm9yIG9idGFpbmluZyB3cml0ZXIncyBtZXRhZGF0YSBzdHJ1Y3R1cmUgYW5kCisgICAgICogSW1hZ2VUeXBlU3BlY2lmaWVyIG9iamVjdCBmb3Igb2J0YWluaW5nIHRoZSBsYXlvdXQgYW5kIGNvbG9yIGluZm9ybWF0aW9uCisgICAgICogb2YgdGhlIGltYWdlIGZvciB0aGlzIG1ldGFkYXRhLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbkRhdGEgdGhlIElJT01ldGFkYXRhLgotICAgICAqIEBwYXJhbSBpbWFnZVR5cGUgdGhlIEltYWdlVHlwZVNwZWNpZmllci4KLSAgICAgKiBAcGFyYW0gcGFyYW0gdGhlIEltYWdlV3JpdGVQYXJhbS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW5EYXRhCisgICAgICogICAgICAgICAgICB0aGUgSUlPTWV0YWRhdGEuCisgICAgICogQHBhcmFtIGltYWdlVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlVHlwZVNwZWNpZmllci4KKyAgICAgKiBAcGFyYW0gcGFyYW0KKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVdyaXRlUGFyYW0uCiAgICAgICogQHJldHVybiB0aGUgSUlPTWV0YWRhdGEsIG9yIG51bGwuCiAgICAgICovCi0gICAgSUlPTWV0YWRhdGEgY29udmVydEltYWdlTWV0YWRhdGEoSUlPTWV0YWRhdGEgaW5EYXRhLCBJbWFnZVR5cGVTcGVjaWZpZXIgaW1hZ2VUeXBlLCBJbWFnZVdyaXRlUGFyYW0gcGFyYW0pOworICAgIElJT01ldGFkYXRhIGNvbnZlcnRJbWFnZU1ldGFkYXRhKElJT01ldGFkYXRhIGluRGF0YSwgSW1hZ2VUeXBlU3BlY2lmaWVyIGltYWdlVHlwZSwKKyAgICAgICAgICAgIEltYWdlV3JpdGVQYXJhbSBwYXJhbSk7CiB9CmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9JbWFnZVR5cGVTcGVjaWZpZXIuamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL0ltYWdlVHlwZVNwZWNpZmllci5qYXZhCmluZGV4IGM5M2YyNjkuLjUwNWIxYzQgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL0ltYWdlVHlwZVNwZWNpZmllci5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL0ltYWdlVHlwZVNwZWNpZmllci5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIFJ1c3RlbSBWLiBSYWZpa292CiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMyAkCiAgKi8KKwogcGFja2FnZSBqYXZheC5pbWFnZWlvOwogCiBpbXBvcnQgamF2YS5hd3QuaW1hZ2UuQ29sb3JNb2RlbDsKQEAgLTI3LDI3ICsyOCwzMSBAQAogaW1wb3J0IGphdmEuYXd0LmNvbG9yLkNvbG9yU3BhY2U7CiAKIC8qKgotICogVGhlIEltYWdlVHlwZVNwZWNpZmllciBjbGFzcyBwZXJmb3JtcyBjb252ZXJzaW9uIG9wZXJhdGlvbnMKLSAqIG9uIHRoZSBTYW1wbGVNb2RlbCBhbmQgdGhlIENvbG9yTW9kZWwgb2YgYW4gaW1hZ2UuCisgKiBUaGUgSW1hZ2VUeXBlU3BlY2lmaWVyIGNsYXNzIHBlcmZvcm1zIGNvbnZlcnNpb24gb3BlcmF0aW9ucyBvbiB0aGUKKyAqIFNhbXBsZU1vZGVsIGFuZCB0aGUgQ29sb3JNb2RlbCBvZiBhbiBpbWFnZS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBJbWFnZVR5cGVTcGVjaWZpZXIgewotICAgIAotICAgIC8qKiAKKworICAgIC8qKgogICAgICAqIFRoZSBDb2xvck1vZGVsIG9mIHRoaXMgSW1hZ2VUeXBlU3BlY2lmaWVyLgogICAgICAqLwogICAgIHByb3RlY3RlZCBDb2xvck1vZGVsIGNvbG9yTW9kZWw7Ci0gICAgCi0gICAgLyoqIAotICAgICAqIFRoZSBTYW1wbGVNb2RlbCBvZiB0aGlzIEltYWdlVHlwZVNwZWNpZmllci4gCisKKyAgICAvKioKKyAgICAgKiBUaGUgU2FtcGxlTW9kZWwgb2YgdGhpcyBJbWFnZVR5cGVTcGVjaWZpZXIuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIFNhbXBsZU1vZGVsIHNhbXBsZU1vZGVsOwogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEltYWdlVHlwZVNwZWNpZmllciB3aXRoIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBDb2xvck1vZGVsIGFuZCBTYW1wbGVNb2RlbCBvYmplY3RzLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJbWFnZVR5cGVTcGVjaWZpZXIgd2l0aCB0aGUgc3BlY2lmaWVkIENvbG9yTW9kZWwgYW5kCisgICAgICogU2FtcGxlTW9kZWwgb2JqZWN0cy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29sb3JNb2RlbCB0aGUgQ29sb3JNb2RlbC4KLSAgICAgKiBAcGFyYW0gc2FtcGxlTW9kZWwgdGhlIFNhbXBsZU1vZGVsLgorICAgICAqIEBwYXJhbSBjb2xvck1vZGVsCisgICAgICogICAgICAgICAgICB0aGUgQ29sb3JNb2RlbC4KKyAgICAgKiBAcGFyYW0gc2FtcGxlTW9kZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBTYW1wbGVNb2RlbC4KICAgICAgKi8KICAgICBwdWJsaWMgSW1hZ2VUeXBlU3BlY2lmaWVyKENvbG9yTW9kZWwgY29sb3JNb2RlbCwgU2FtcGxlTW9kZWwgc2FtcGxlTW9kZWwpIHsKICAgICAgICAgaWYgKGNvbG9yTW9kZWwgPT0gbnVsbCkgewpAQCAtNjUsMTAgKzcwLDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEltYWdlVHlwZVNwZWNpZmllciB1c2luZyB0aGUgc3BlY2lmaWVkIAotICAgICAqIFJlbmRlcmVkSW1hZ2UuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEltYWdlVHlwZVNwZWNpZmllciB1c2luZyB0aGUgc3BlY2lmaWVkIFJlbmRlcmVkSW1hZ2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIHJlbmRlcmVkSW1hZ2UgdGhlIFJlbmRlcmVkSW1hZ2UuCisgICAgICogQHBhcmFtIHJlbmRlcmVkSW1hZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBSZW5kZXJlZEltYWdlLgogICAgICAqLwogICAgIHB1YmxpYyBJbWFnZVR5cGVTcGVjaWZpZXIoUmVuZGVyZWRJbWFnZSByZW5kZXJlZEltYWdlKSB7CiAgICAgICAgIGlmIChyZW5kZXJlZEltYWdlID09IG51bGwpIHsKQEAgLTc5LDEzNiArODQsMTM5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBJbWFnZVR5cGVTcGVjaWZpZXIgd2l0aCB0aGUgc3BlY2lmaWVkCi0gICAgICogRGlyZWN0Q29sb3JNb2RlbCBhbmQgYSBwYWNrZWQgU2FtcGxlTW9kZWwuCisgICAgICogQ3JlYXRlcyBhbiBJbWFnZVR5cGVTcGVjaWZpZXIgd2l0aCB0aGUgc3BlY2lmaWVkIERpcmVjdENvbG9yTW9kZWwgYW5kIGEKKyAgICAgKiBwYWNrZWQgU2FtcGxlTW9kZWwuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNvbG9yU3BhY2UgdGhlIENvbG9yU3BhY2UuCi0gICAgICogQHBhcmFtIHJlZE1hc2sgdGhlIHJlZCBtYXNrLgotICAgICAqIEBwYXJhbSBncmVlbk1hc2sgdGhlIGdyZWVuIG1hc2suCi0gICAgICogQHBhcmFtIGJsdWVNYXNrIHRoZSBibHVlIG1hc2suCi0gICAgICogQHBhcmFtIGFscGhhTWFzayB0aGUgYWxwaGEgbWFzay4KLSAgICAgKiBAcGFyYW0gdHJhbnNmZXJUeXBlIHRoZSB0cmFuc2ZlciB0eXBlLgotICAgICAqIEBwYXJhbSBpc0FscGhhUHJlbXVsdGlwbGllZCB0aGUgcGFyYW1ldGVyIGluZGljYXRlcwotICAgICAqIGlmIHRoZSBjb2xvciBjaGFubmVsIGlzIHByZW11bHRpcGxpZWQgYnkgYWxwaGEuCi0gICAgICogCisgICAgICogQHBhcmFtIGNvbG9yU3BhY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBDb2xvclNwYWNlLgorICAgICAqIEBwYXJhbSByZWRNYXNrCisgICAgICogICAgICAgICAgICB0aGUgcmVkIG1hc2suCisgICAgICogQHBhcmFtIGdyZWVuTWFzaworICAgICAqICAgICAgICAgICAgdGhlIGdyZWVuIG1hc2suCisgICAgICogQHBhcmFtIGJsdWVNYXNrCisgICAgICogICAgICAgICAgICB0aGUgYmx1ZSBtYXNrLgorICAgICAqIEBwYXJhbSBhbHBoYU1hc2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbHBoYSBtYXNrLgorICAgICAqIEBwYXJhbSB0cmFuc2ZlclR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSB0cmFuc2ZlciB0eXBlLgorICAgICAqIEBwYXJhbSBpc0FscGhhUHJlbXVsdGlwbGllZAorICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBpbmRpY2F0ZXMgaWYgdGhlIGNvbG9yIGNoYW5uZWwgaXMgcHJlLW11bHRpcGxpZWQKKyAgICAgKiAgICAgICAgICAgIGJ5IGFscGhhLgogICAgICAqIEByZXR1cm4gdGhlIEltYWdlVHlwZVNwZWNpZmllci4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEltYWdlVHlwZVNwZWNpZmllciBjcmVhdGVQYWNrZWQoQ29sb3JTcGFjZSBjb2xvclNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVkTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdyZWVuTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsdWVNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJhbnNmZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQWxwaGFQcmVtdWx0aXBsaWVkKSB7CisgICAgcHVibGljIHN0YXRpYyBJbWFnZVR5cGVTcGVjaWZpZXIgY3JlYXRlUGFja2VkKENvbG9yU3BhY2UgY29sb3JTcGFjZSwgaW50IHJlZE1hc2ssCisgICAgICAgICAgICBpbnQgZ3JlZW5NYXNrLCBpbnQgYmx1ZU1hc2ssIGludCBhbHBoYU1hc2ssIGludCB0cmFuc2ZlclR5cGUsCisgICAgICAgICAgICBib29sZWFuIGlzQWxwaGFQcmVtdWx0aXBsaWVkKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIEltYWdlVHlwZVNwZWNpZmllciB3aXRoIHNwZWNpZmllZAotICAgICAqIENvbXBvbmVudENvbG9yTW9kZWwgYW5kIGEgUGl4ZWxJbnRlcmxlYXZlZFNhbXBsZU1vZGVsLgorICAgICAqIENyZWF0ZXMgYW4gSW1hZ2VUeXBlU3BlY2lmaWVyIHdpdGggc3BlY2lmaWVkIENvbXBvbmVudENvbG9yTW9kZWwgYW5kIGEKKyAgICAgKiBQaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNvbG9yU3BhY2UgdGhlIENvbG9yU3BhY2UuCi0gICAgICogQHBhcmFtIGJhbmRPZmZzZXRzIHRoZSBiYW5kIG9mZnNldHMuCi0gICAgICogQHBhcmFtIGRhdGFUeXBlIHRoZSBkYXRhIHR5cGUuCi0gICAgICogQHBhcmFtIGhhc0FscGhhIHRoZSBwYXJhbWV0ZXIgaW5kaWNhdGVzIGlmIGFscGhhIGNoYW5uZWwKLSAgICAgKiBpcyBuZWVkZWQuCi0gICAgICogQHBhcmFtIGlzQWxwaGFQcmVtdWx0aXBsaWVkIHRoZSBwYXJhbWV0ZXIgaW5kaWNhdGVzCi0gICAgICogaWYgdGhlIGNvbG9yIGNoYW5uZWwgaXMgcHJlbXVsdGlwbGllZCBieSBhbHBoYS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29sb3JTcGFjZQorICAgICAqICAgICAgICAgICAgdGhlIENvbG9yU3BhY2UuCisgICAgICogQHBhcmFtIGJhbmRPZmZzZXRzCisgICAgICogICAgICAgICAgICB0aGUgYmFuZCBvZmZzZXRzLgorICAgICAqIEBwYXJhbSBkYXRhVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgdHlwZS4KKyAgICAgKiBAcGFyYW0gaGFzQWxwaGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgaW5kaWNhdGVzIGlmIGFscGhhIGNoYW5uZWwgaXMgbmVlZGVkLgorICAgICAqIEBwYXJhbSBpc0FscGhhUHJlbXVsdGlwbGllZAorICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBpbmRpY2F0ZXMgaWYgdGhlIGNvbG9yIGNoYW5uZWwgaXMgcHJlLW11bHRpcGxpZWQKKyAgICAgKiAgICAgICAgICAgIGJ5IGFscGhhLgogICAgICAqIEByZXR1cm4gdGhlIEltYWdlVHlwZVNwZWNpZmllci4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEltYWdlVHlwZVNwZWNpZmllciBjcmVhdGVJbnRlcmxlYXZlZChDb2xvclNwYWNlIGNvbG9yU3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50W10gYmFuZE9mZnNldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRhdGFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzQWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0FscGhhUHJlbXVsdGlwbGllZCkgeworICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2VUeXBlU3BlY2lmaWVyIGNyZWF0ZUludGVybGVhdmVkKENvbG9yU3BhY2UgY29sb3JTcGFjZSwgaW50W10gYmFuZE9mZnNldHMsCisgICAgICAgICAgICBpbnQgZGF0YVR5cGUsIGJvb2xlYW4gaGFzQWxwaGEsIGJvb2xlYW4gaXNBbHBoYVByZW11bHRpcGxpZWQpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIHlldCIpOwogICAgIH0KIAotCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIEltYWdlVHlwZVNwZWNpZmllciBmb3IgYSBpbWFnZSB3aXRoIGEgCi0gICAgICogQmFuZGVkU2FtcGxlTW9kZWwgYW5kIGEgQ29tcG9uZW50Q29sb3JNb2RlbC4KKyAgICAgKiBDcmVhdGVzIGEgSW1hZ2VUeXBlU3BlY2lmaWVyIGZvciBhIGltYWdlIHdpdGggYSBCYW5kZWRTYW1wbGVNb2RlbCBhbmQgYQorICAgICAqIENvbXBvbmVudENvbG9yTW9kZWwuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNvbG9yU3BhY2UgdGhlIENvbG9yU3BhY2UuCi0gICAgICogQHBhcmFtIGJhbmtJbmRpY2VzIHRoZSBiYW5rIGluZGljZXMuCi0gICAgICogQHBhcmFtIGJhbmRPZmZzZXRzIHRoZSBiYW5kIG9mZnNldHMuCi0gICAgICogQHBhcmFtIGRhdGFUeXBlIHRoZSBkYXRhIHR5cGUuCi0gICAgICogQHBhcmFtIGhhc0FscGhhIHRoZSBwYXJhbWV0ZXIgaW5kaWNhdGVzIGEgcHJlc2VuY2Ugb2YgYWxwaGEgY2hhbm5lbC4KLSAgICAgKiBAcGFyYW0gaXNBbHBoYVByZW11bHRpcGxpZWQgdGhlIHBhcmFtZXRlciBpbmRpY2F0ZXMgd2hldGhlcgotICAgICAqIG9yIG5vdCBjb2xvciBjaGFubmVsIGlzIGFscGhhIHByZW11bHRpcGxpZWQuCi0gICAgICogCisgICAgICogQHBhcmFtIGNvbG9yU3BhY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBDb2xvclNwYWNlLgorICAgICAqIEBwYXJhbSBiYW5rSW5kaWNlcworICAgICAqICAgICAgICAgICAgdGhlIGJhbmsgaW5kaWNlcy4KKyAgICAgKiBAcGFyYW0gYmFuZE9mZnNldHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBiYW5kIG9mZnNldHMuCisgICAgICogQHBhcmFtIGRhdGFUeXBlCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSB0eXBlLgorICAgICAqIEBwYXJhbSBoYXNBbHBoYQorICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBpbmRpY2F0ZXMgYSBwcmVzZW5jZSBvZiBhbHBoYSBjaGFubmVsLgorICAgICAqIEBwYXJhbSBpc0FscGhhUHJlbXVsdGlwbGllZAorICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgY29sb3IgY2hhbm5lbCBpcyBhbHBoYQorICAgICAqICAgICAgICAgICAgcHJlLW11bHRpcGxpZWQuCiAgICAgICogQHJldHVybiB0aGUgaW1hZ2UgdHlwZSBzcGVjaWZpZXIKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEltYWdlVHlwZVNwZWNpZmllciBjcmVhdGVCYW5kZWQoQ29sb3JTcGFjZSBjb2xvclNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRbXSBiYW5rSW5kaWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50W10gYmFuZE9mZnNldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkYXRhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNBbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0FscGhhUHJlbXVsdGlwbGllZCkgeworICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2VUeXBlU3BlY2lmaWVyIGNyZWF0ZUJhbmRlZChDb2xvclNwYWNlIGNvbG9yU3BhY2UsIGludFtdIGJhbmtJbmRpY2VzLAorICAgICAgICAgICAgaW50W10gYmFuZE9mZnNldHMsIGludCBkYXRhVHlwZSwgYm9vbGVhbiBoYXNBbHBoYSwgYm9vbGVhbiBpc0FscGhhUHJlbXVsdGlwbGllZCkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyBhIEltYWdlVHlwZVNwZWNpZmllciBmb3IgYSBncmF5c2NhbGUgaW1hZ2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGJpdHMgdGhlIG51bWJlciBvZiBiaXRzIHBlciBncmF5IHZhbHVlLgotICAgICAqIEBwYXJhbSBkYXRhVHlwZSB0aGUgZGF0YSB0eXBlLgotICAgICAqIEBwYXJhbSBpc1NpZ25lZCBhIHNpZ25lZCBmbGFnLgotICAgICAqIAorICAgICAqIEBwYXJhbSBiaXRzCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJpdHMgcGVyIGdyYXkgdmFsdWUuCisgICAgICogQHBhcmFtIGRhdGFUeXBlCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSB0eXBlLgorICAgICAqIEBwYXJhbSBpc1NpZ25lZAorICAgICAqICAgICAgICAgICAgYSBzaWduZWQgZmxhZy4KICAgICAgKiBAcmV0dXJuIHRoZSBJbWFnZVR5cGVTcGVjaWZpZXIuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJbWFnZVR5cGVTcGVjaWZpZXIgY3JlYXRlR3JheXNjYWxlKGludCBiaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGF0YVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNTaWduZWQpIHsKKyAgICBwdWJsaWMgc3RhdGljIEltYWdlVHlwZVNwZWNpZmllciBjcmVhdGVHcmF5c2NhbGUoaW50IGJpdHMsIGludCBkYXRhVHlwZSwgYm9vbGVhbiBpc1NpZ25lZCkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyBhIEltYWdlVHlwZVNwZWNpZmllciBmb3IgYSBncmF5c2NhbGUgaW1hZ2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGJpdHMgdGhlIG51bWJlciBvZiBiaXRzIHBlciBncmF5IHZhbHVlLgotICAgICAqIEBwYXJhbSBkYXRhVHlwZSB0aGUgZGF0YSB0eXBlLgotICAgICAqIEBwYXJhbSBpc1NpZ25lZCBhIHNpZ25lZCBmbGFnLgotICAgICAqIEBwYXJhbSBpc0FscGhhUHJlbXVsdGlwbGllZCB0aGUgcGFyYW1ldGVyIGluZGljYXRlcwotICAgICAqIGlmIGNvbG9yIGNoYW5uZWwgaXMgcHJlbXVsdGlwbGllZCBieSBhbHBoYSwgb3Igbm90LgotICAgICAqIAorICAgICAqIEBwYXJhbSBiaXRzCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJpdHMgcGVyIGdyYXkgdmFsdWUuCisgICAgICogQHBhcmFtIGRhdGFUeXBlCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSB0eXBlLgorICAgICAqIEBwYXJhbSBpc1NpZ25lZAorICAgICAqICAgICAgICAgICAgYSBzaWduZWQgZmxhZy4KKyAgICAgKiBAcGFyYW0gaXNBbHBoYVByZW11bHRpcGxpZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgaW5kaWNhdGVzIGlmIGNvbG9yIGNoYW5uZWwgaXMgcHJlLW11bHRpcGxpZWQgYnkKKyAgICAgKiAgICAgICAgICAgIGFscGhhLCBvciBub3QuCiAgICAgICogQHJldHVybiB0aGUgSW1hZ2VUeXBlU3BlY2lmaWVyLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2VUeXBlU3BlY2lmaWVyIGNyZWF0ZUdyYXlzY2FsZShpbnQgYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRhdGFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzU2lnbmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQWxwaGFQcmVtdWx0aXBsaWVkKSB7CisgICAgcHVibGljIHN0YXRpYyBJbWFnZVR5cGVTcGVjaWZpZXIgY3JlYXRlR3JheXNjYWxlKGludCBiaXRzLCBpbnQgZGF0YVR5cGUsIGJvb2xlYW4gaXNTaWduZWQsCisgICAgICAgICAgICBib29sZWFuIGlzQWxwaGFQcmVtdWx0aXBsaWVkKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIGEgSW1hZ2VUeXBlU3BlY2lmaWVyIHdpdGggdGhlIGluZGV4ZWQgaW1hZ2UgZm9ybWF0LgogICAgICAqIAotICAgICAqIEBwYXJhbSByZWRMVVQgdGhlIHJlZCB2YWx1ZXMgb2YgaW5kZWNpZXMuCi0gICAgICogQHBhcmFtIGdyZWVuTFVUIHRoZSBncmVlbiB2YWx1ZXMgb2YgaW5kZWNpZXMuCi0gICAgICogQHBhcmFtIGJsdWVMVVQgdGhlIGJsdWUgdmFsdWVzIG9mIGluZGVjaWVzLgotICAgICAqIEBwYXJhbSBhbHBoYUxVVCB0aGUgYWxwaGEgdmFsdWVzIG9mIGluZGVjaWVzLgotICAgICAqIEBwYXJhbSBiaXRzIHRoZSBiaXRzIG51bWJlciBmb3IgZWFjaCBpbmRleC4KLSAgICAgKiBAcGFyYW0gZGF0YVR5cGUgdGhlIGRhdGEgdHlwZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVkTFVUCisgICAgICogICAgICAgICAgICB0aGUgcmVkIHZhbHVlcyBvZiBpbmRpY2VzLgorICAgICAqIEBwYXJhbSBncmVlbkxVVAorICAgICAqICAgICAgICAgICAgdGhlIGdyZWVuIHZhbHVlcyBvZiBpbmRpY2VzLgorICAgICAqIEBwYXJhbSBibHVlTFVUCisgICAgICogICAgICAgICAgICB0aGUgYmx1ZSB2YWx1ZXMgb2YgaW5kaWNlcy4KKyAgICAgKiBAcGFyYW0gYWxwaGFMVVQKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbHBoYSB2YWx1ZXMgb2YgaW5kaWNlcy4KKyAgICAgKiBAcGFyYW0gYml0cworICAgICAqICAgICAgICAgICAgdGhlIGJpdHMgbnVtYmVyIGZvciBlYWNoIGluZGV4LgorICAgICAqIEBwYXJhbSBkYXRhVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgdHlwZS4KICAgICAgKiBAcmV0dXJuIHRoZSBJbWFnZVR5cGVTcGVjaWZpZXIuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJbWFnZVR5cGVTcGVjaWZpZXIgY3JlYXRlSW5kZXhlZChieXRlW10gcmVkTFVULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGdyZWVuTFVULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJsdWVMVVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYWxwaGFMVVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkYXRhVHlwZSkgeworICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2VUeXBlU3BlY2lmaWVyIGNyZWF0ZUluZGV4ZWQoYnl0ZVtdIHJlZExVVCwgYnl0ZVtdIGdyZWVuTFVULCBieXRlW10gYmx1ZUxVVCwKKyAgICAgICAgICAgIGJ5dGVbXSBhbHBoYUxVVCwgaW50IGJpdHMsIGludCBkYXRhVHlwZSkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgSW1hZ2VUeXBlU3BlY2lmaWVyIGZyb20gCi0gICAgICogdGhlIHNwZWNpZmllZCBidWZmZXJlZCBpbWFnZSB0eXBlLgorICAgICAqIENyZWF0ZXMgdGhlIEltYWdlVHlwZVNwZWNpZmllciBmcm9tIHRoZSBzcGVjaWZpZWQgYnVmZmVyZWQgaW1hZ2UgdHlwZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYnVmZmVyZWRJbWFnZVR5cGUgdGhlIGJ1ZmZlcmVkIGltYWdlIHR5cGUuCi0gICAgICogCisgICAgICogQHBhcmFtIGJ1ZmZlcmVkSW1hZ2VUeXBlCisgICAgICogICAgICAgICAgICB0aGUgYnVmZmVyZWQgaW1hZ2UgdHlwZS4KICAgICAgKiBAcmV0dXJuIHRoZSBJbWFnZVR5cGVTcGVjaWZpZXIuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBJbWFnZVR5cGVTcGVjaWZpZXIgY3JlYXRlRnJvbUJ1ZmZlcmVkSW1hZ2VUeXBlKGludCBidWZmZXJlZEltYWdlVHlwZSkgewpAQCAtMjE2LDExICsyMjQsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBJbWFnZVR5cGVTcGVjaWZpZXIgZnJvbSAKLSAgICAgKiB0aGUgc3BlY2lmaWVkIFJlbmRlcmVkSW1hZ2UuCisgICAgICogQ3JlYXRlcyB0aGUgSW1hZ2VUeXBlU3BlY2lmaWVyIGZyb20gdGhlIHNwZWNpZmllZCBSZW5kZXJlZEltYWdlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZSB0aGUgUmVuZGVyZWRJbWFnZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW1hZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBSZW5kZXJlZEltYWdlLgogICAgICAqIEByZXR1cm4gdGhlIEltYWdlVHlwZVNwZWNpZmllci4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEltYWdlVHlwZVNwZWNpZmllciBjcmVhdGVGcm9tUmVuZGVyZWRJbWFnZShSZW5kZXJlZEltYWdlIGltYWdlKSB7CkBAIC0yNDIsNyArMjQ5LDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cworICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjb21wb25lbnRzLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TnVtQ29tcG9uZW50cygpIHsKICAgICAgICAgcmV0dXJuIGNvbG9yTW9kZWwuZ2V0TnVtQ29tcG9uZW50cygpOwpAQCAtMjUxLDcgKzI1OCw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGJhbmRzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBiYW5kcworICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBiYW5kcy4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldE51bUJhbmRzKCkgewogICAgICAgICByZXR1cm4gc2FtcGxlTW9kZWwuZ2V0TnVtQmFuZHMoKTsKQEAgLTI2MCw4ICsyNjcsOCBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBiaXRzIHBlciB0aGUgc3BlY2lmaWVkIGJhbmQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGJhbmQgdGhlIGluZGV4IG9mIGJhbmQuCi0gICAgICogCisgICAgICogQHBhcmFtIGJhbmQKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiBiYW5kLgogICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBiaXRzIHBlciB0aGUgc3BlY2lmaWVkIGJhbmQuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRCaXRzUGVyQmFuZChpbnQgYmFuZCkgewpAQCAtMjgzLDEzICsyOTAsMTQgQEAKICAgICAvKioKICAgICAgKiBHZXRzIGEgY29tcGF0aWJsZSBTYW1wbGVNb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd2lkdGggYW5kIGhlaWdodC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoLgotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gd2lkdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSB3aWR0aC4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0LgogICAgICAqIEByZXR1cm4gdGhlIFNhbXBsZU1vZGVsLgogICAgICAqLwogICAgIHB1YmxpYyBTYW1wbGVNb2RlbCBnZXRTYW1wbGVNb2RlbChpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgaWYgKChsb25nKXdpZHRoKmhlaWdodCA+IEludGVnZXIuTUFYX1ZBTFVFKSB7CisgICAgICAgIGlmICgobG9uZyl3aWR0aCAqIGhlaWdodCA+IEludGVnZXIuTUFYX1ZBTFVFKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ3aWR0aCAqIGhlaWdodCA+IEludGVnZXIuTUFYX1ZBTFVFIik7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHNhbXBsZU1vZGVsLmNyZWF0ZUNvbXBhdGlibGVTYW1wbGVNb2RlbCh3aWR0aCwgaGVpZ2h0KTsKQEAgLTI5OCwyMCArMzA2LDIxIEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgQ29sb3JNb2RlbCBhc3NvY2lhdGVkIHdpdGggdGhpcyBJbWFnZVR5cGVTcGVjaWZpZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgQ29sb3JNb2RlbCBhc3NvY2lhdGVkIHdpdGggdGhpcyBJbWFnZVR5cGVTcGVjaWZpZXIuIAorICAgICAqIEByZXR1cm4gdGhlIENvbG9yTW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSW1hZ2VUeXBlU3BlY2lmaWVyLgogICAgICAqLwogICAgIHB1YmxpYyBDb2xvck1vZGVsIGdldENvbG9yTW9kZWwoKSB7CiAgICAgICAgIHJldHVybiBjb2xvck1vZGVsOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIEJ1ZmZlcmVkSW1hZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHdpZHRoIGFuZCBoZWlnaHQgCi0gICAgICogYW5kIHRoZSBDb2xvck1hZGVsIGFuZCBTYW1wbGVNb2RlbCB3aGljaCBhcmUgc3BlY2lmaWVkIGJ5IHRoaXMgCisgICAgICogQ3JlYXRlcyB0aGUgQnVmZmVyZWRJbWFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgd2lkdGggYW5kIGhlaWdodCBhbmQgdGhlCisgICAgICogQ29sb3JNYWRlbCBhbmQgU2FtcGxlTW9kZWwgd2hpY2ggYXJlIHNwZWNpZmllZCBieSB0aGlzCiAgICAgICogSW1hZ2VUeXBlU3BlY2lmaWVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIEJ1ZmZlcmVkSW1hZ2UuCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBCdWZmZXJlZEltYWdlLgotICAgICAqIAorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBCdWZmZXJlZEltYWdlLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIEJ1ZmZlcmVkSW1hZ2UuCiAgICAgICogQHJldHVybiB0aGUgQnVmZmVyZWRJbWFnZS4KICAgICAgKi8KICAgICBwdWJsaWMgQnVmZmVyZWRJbWFnZSBjcmVhdGVCdWZmZXJlZEltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCkgewpAQCAtMzE5LDE5ICszMjgsMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGlzIEltYWdlVHlwZVNwZWNpZmllciBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIAotICAgICAqIG9iamVjdC4KKyAgICAgKiBDb21wYXJlcyB0aGlzIEltYWdlVHlwZVNwZWNpZmllciBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbyB0aGUgT2JqZWN0IHRvIGJlIGNvbXBhcmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIG9iamVjdCBpcyBhbiBJbWFnZVR5cGVTcGVjaWZpZXIgd2l0aCB0aGUgc2FtZQotICAgICAqIGRhdGEgYXMgdGhpcyBJbWFnZVR5cGVTcGVjaWZpZXIsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcGFyYW0gbworICAgICAqICAgICAgICAgICAgdGhlIE9iamVjdCB0byBiZSBjb21wYXJlZC4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBvYmplY3QgaXMgYW4gSW1hZ2VUeXBlU3BlY2lmaWVyIHdpdGggdGhlIHNhbWUgZGF0YQorICAgICAqICAgICAgICAgYXMgdGhpcyBJbWFnZVR5cGVTcGVjaWZpZXIsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKICAgICAgICAgYm9vbGVhbiBydCA9IGZhbHNlOwogICAgICAgICBpZiAobyBpbnN0YW5jZW9mIEltYWdlVHlwZVNwZWNpZmllcikgewotICAgICAgICAgICAgSW1hZ2VUeXBlU3BlY2lmaWVyIHRzID0gKEltYWdlVHlwZVNwZWNpZmllcikgbzsKKyAgICAgICAgICAgIEltYWdlVHlwZVNwZWNpZmllciB0cyA9IChJbWFnZVR5cGVTcGVjaWZpZXIpbzsKICAgICAgICAgICAgIHJ0ID0gY29sb3JNb2RlbC5lcXVhbHModHMuY29sb3JNb2RlbCkgJiYgc2FtcGxlTW9kZWwuZXF1YWxzKHRzLnNhbXBsZU1vZGVsKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcnQ7CmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9JbWFnZVdyaXRlUGFyYW0uamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL0ltYWdlV3JpdGVQYXJhbS5qYXZhCmluZGV4IGQzMmZhNTkuLmQ2NjE4ODkgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL0ltYWdlV3JpdGVQYXJhbS5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL0ltYWdlV3JpdGVQYXJhbS5qYXZhCkBAIC0xOCwxMDMgKzE4LDE0MSBAQAogICogQGF1dGhvciBSdXN0ZW0gVi4gUmFmaWtvdgogICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjMgJAogICovCisKIHBhY2thZ2UgamF2YXguaW1hZ2VpbzsKIAogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiBpbXBvcnQgamF2YS5hd3QuKjsKIAogLyoqCi0gKiBUaGUgSW1hZ2VXcml0ZVBhcmFtIGNsYXNzIHByb3ZpZGVzIGluZm9ybWF0aW9uIHRvIGFuIEltYWdlV3JpdGVyIAotICogYWJvdXQgaG93IGFuIGltYWdlIGlzIHRvIGJlIGVuY29kZWQuCisgKiBUaGUgSW1hZ2VXcml0ZVBhcmFtIGNsYXNzIHByb3ZpZGVzIGluZm9ybWF0aW9uIHRvIGFuIEltYWdlV3JpdGVyIGFib3V0IGhvdyBhbgorICogaW1hZ2UgaXMgdG8gYmUgZW5jb2RlZC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBJbWFnZVdyaXRlUGFyYW0gZXh0ZW5kcyBJSU9QYXJhbSB7CiAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IE1PREVfRElTQUJMRUQgaW5kaWNhdGVzIHRoYXQgCi0gICAgICogc3RyZWFtIGlzIG5vdCB0aWxlZCwgcHJvZ3Jlc3NpdmUsIG9yIGNvbXByZXNzZWQuCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IE1PREVfRElTQUJMRUQgaW5kaWNhdGVzIHRoYXQgc3RyZWFtIGlzIG5vdCB0aWxlZCwKKyAgICAgKiBwcm9ncmVzc2l2ZSwgb3IgY29tcHJlc3NlZC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0RJU0FCTEVEID0gMDsKLSAgICAKLSAgICAvKiogCi0gICAgICogVGhlIENvbnN0YW50IE1PREVfREVGQVVMVCBpbmRpY2F0ZXMgdGhhdCB0aGUgc3RyZWFtIHdpbGwgYmUgdGlsZWQsIAotICAgICAqIHByb2dyZXNzaXZlLCBvciBjb21wcmVzc2VkIGFjY29yZGluZyB0byB0aGUgcGx1Zy1pbidzIGRlZmF1bHQuIAorCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IE1PREVfREVGQVVMVCBpbmRpY2F0ZXMgdGhhdCB0aGUgc3RyZWFtIHdpbGwgYmUgdGlsZWQsCisgICAgICogcHJvZ3Jlc3NpdmUsIG9yIGNvbXByZXNzZWQgYWNjb3JkaW5nIHRvIHRoZSBwbHVnLWluJ3MgZGVmYXVsdC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0RFRkFVTFQgPSAxOwotICAgIAotICAgIC8qKiAKKworICAgIC8qKgogICAgICAqIFRoZSBDb25zdGFudCBNT0RFX0VYUExJQ0lUIGluZGljYXRlcyB0aGF0IHRoZSBzdHJlYW0gd2lsbCBiZSB0aWxlZCwKLSAgICAgKiBwcm9ncmVzc2l2ZSwgb3IgY29tcHJlc3NlZCBhY2NvcmRpbmcgdG8gY3VycmVudCBzZXR0aW5ncwotICAgICAqIHdoaWNoIGFyZSBkZWZpbmVkIGJ5IHNldCBtZXRob2RzLiAKKyAgICAgKiBwcm9ncmVzc2l2ZSwgb3IgY29tcHJlc3NlZCBhY2NvcmRpbmcgdG8gY3VycmVudCBzZXR0aW5ncyB3aGljaCBhcmUKKyAgICAgKiBkZWZpbmVkIGJ5IHNldCBtZXRob2RzLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfRVhQTElDSVQgPSAyOwotICAgIAotICAgIC8qKiAKLSAgICAgKiBUaGUgQ29uc3RhbnQgTU9ERV9DT1BZX0ZST01fTUVUQURBVEEgaW5kaWNhdGVzIHRoYXQgdGhlIHN0cmVhbQotICAgICAqIHdpbGwgYmUgdGlsZWQsIHByb2dyZXNzaXZlLCBvciBjb21wcmVzc2VkIGFjY29yZGluZyB0bwotICAgICAqIHN0cmVhbSBvciBpbWFnZSBtZXRhZGF0YS4gCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgTU9ERV9DT1BZX0ZST01fTUVUQURBVEEgaW5kaWNhdGVzIHRoYXQgdGhlIHN0cmVhbSB3aWxsIGJlCisgICAgICogdGlsZWQsIHByb2dyZXNzaXZlLCBvciBjb21wcmVzc2VkIGFjY29yZGluZyB0byBzdHJlYW0gb3IgaW1hZ2UgbWV0YWRhdGEuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9DT1BZX0ZST01fTUVUQURBVEEgPSAzOwotICAgIAotICAgIC8qKiBXaGV0aGVyIHRoZSBJbWFnZVdyaXRlciBjYW4gd3JpdGUgdGlsZXMuICovCisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoZSBJbWFnZVdyaXRlciBjYW4gd3JpdGUgdGlsZXMuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuV3JpdGVUaWxlcyA9IGZhbHNlOwotICAgIAotICAgIC8qKiBUaGUgdGlsaW5nIG1vZGUuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgdGlsaW5nIG1vZGUuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGludCB0aWxpbmdNb2RlID0gTU9ERV9DT1BZX0ZST01fTUVUQURBVEE7Ci0gICAgCi0gICAgLyoqIFRoZSBwcmVmZXJyZWQgdGlsZSBzaXplcy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBwcmVmZXJyZWQgdGlsZSBzaXplcy4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgRGltZW5zaW9uW10gcHJlZmVycmVkVGlsZVNpemVzID0gbnVsbDsKLSAgICAKLSAgICAvKiogVGhlIHRpbGluZyBzZXQuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgdGlsaW5nIHNldC4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgYm9vbGVhbiB0aWxpbmdTZXQgPSBmYWxzZTsKLSAgICAKLSAgICAvKiogVGhlIHRpbGUgd2lkdGguICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgdGlsZSB3aWR0aC4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IHRpbGVXaWR0aCA9IDA7Ci0gICAgCi0gICAgLyoqIFRoZSB0aWxlIGhlaWdodC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSB0aWxlIGhlaWdodC4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IHRpbGVIZWlnaHQgPSAwOwotICAgIAotICAgIC8qKiBXaGV0aGVyIHRoZSBJbWFnZVdyaXRlciBjYW4gb2Zmc2V0IHRpbGVzLiAqLworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgSW1hZ2VXcml0ZXIgY2FuIG9mZnNldCB0aWxlcy4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjYW5PZmZzZXRUaWxlcyA9IGZhbHNlOwotICAgIAotICAgIC8qKiBUaGUgdGlsZSBncmlkIHggb2Zmc2V0LiAqLworCisgICAgLyoqCisgICAgICogVGhlIHRpbGUgZ3JpZCB4IG9mZnNldC4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IHRpbGVHcmlkWE9mZnNldCA9IDA7Ci0gICAgCi0gICAgLyoqIFRoZSB0aWxlIGdyaWQgeSBvZmZzZXQuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgdGlsZSBncmlkIHkgb2Zmc2V0LgorICAgICAqLwogICAgIHByb3RlY3RlZCBpbnQgdGlsZUdyaWRZT2Zmc2V0ID0gMDsKLSAgICAKLSAgICAvKiogV2hldGhlciB0aGUgSW1hZ2VXcml0ZXIgY2FuIHdyaXRlIGluIHByb2dyZXNzaXZlIG1vZGUuICovCisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoZSBJbWFnZVdyaXRlciBjYW4gd3JpdGUgaW4gcHJvZ3Jlc3NpdmUgbW9kZS4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjYW5Xcml0ZVByb2dyZXNzaXZlID0gZmFsc2U7Ci0gICAgCi0gICAgLyoqIFRoZSBwcm9ncmVzc2l2ZSBtb2RlLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHByb2dyZXNzaXZlIG1vZGUuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBwcm9ncmVzc2l2ZU1vZGUgPSBNT0RFX0NPUFlfRlJPTV9NRVRBREFUQTsKLSAgICAKLSAgICAvKiogV2hldGhlciB0aGUgSW1hZ2VXcml0ZXIgY2FuIHdyaXRlIGluIGNvbXByZXNzZWQgbW9kZS4gKi8KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIEltYWdlV3JpdGVyIGNhbiB3cml0ZSBpbiBjb21wcmVzc2VkIG1vZGUuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuV3JpdGVDb21wcmVzc2VkID0gZmFsc2U7Ci0gICAgCi0gICAgLyoqIFRoZSBjb21wcmVzc2lvbiBtb2RlLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGNvbXByZXNzaW9uIG1vZGUuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGludCBjb21wcmVzc2lvbk1vZGUgPSBNT0RFX0NPUFlfRlJPTV9NRVRBREFUQTsKLSAgICAKLSAgICAvKiogVGhlIGNvbXByZXNzaW9uIHR5cGVzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGNvbXByZXNzaW9uIHR5cGVzLgorICAgICAqLwogICAgIHByb3RlY3RlZCBTdHJpbmdbXSBjb21wcmVzc2lvblR5cGVzID0gbnVsbDsKLSAgICAKLSAgICAvKiogVGhlIGNvbXByZXNzaW9uIHR5cGUuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29tcHJlc3Npb24gdHlwZS4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbXByZXNzaW9uVHlwZSA9IG51bGw7Ci0gICAgCi0gICAgLyoqIFRoZSBjb21wcmVzc2lvbiBxdWFsaXR5LiAqLworCisgICAgLyoqCisgICAgICogVGhlIGNvbXByZXNzaW9uIHF1YWxpdHkuCisgICAgICovCiAgICAgcHJvdGVjdGVkIGZsb2F0IGNvbXByZXNzaW9uUXVhbGl0eSA9IDEuMGY7Ci0gICAgCi0gICAgLyoqIFRoZSBsb2NhbGUuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgbG9jYWxlLgorICAgICAqLwogICAgIHByb3RlY3RlZCBMb2NhbGUgbG9jYWxlID0gbnVsbDsKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJbWFnZVdyaXRlUGFyYW0uCiAgICAgICovCi0gICAgcHJvdGVjdGVkIEltYWdlV3JpdGVQYXJhbSgpIHt9CisgICAgcHJvdGVjdGVkIEltYWdlV3JpdGVQYXJhbSgpIHsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgSW1hZ2VXcml0ZVBhcmFtIHdpdGggdGhlIHNwZWNpZmllZCBMb2NhbGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGxvY2FsZSB0aGUgTG9jYWxlLgorICAgICAqIEBwYXJhbSBsb2NhbGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBMb2NhbGUuCiAgICAgICovCiAgICAgcHVibGljIEltYWdlV3JpdGVQYXJhbShMb2NhbGUgbG9jYWxlKSB7CiAgICAgICAgIHRoaXMubG9jYWxlID0gbG9jYWxlOwpAQCAtMTIyLDcgKzE2MCw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgbW9kZSBmb3Igd3JpdGluZyB0aGUgc3RyZWFtIGluIGEgcHJvZ3Jlc3NpdmUgc2VxdWVuY2UuIAorICAgICAqIEdldHMgdGhlIG1vZGUgZm9yIHdyaXRpbmcgdGhlIHN0cmVhbSBpbiBhIHByb2dyZXNzaXZlIHNlcXVlbmNlLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgcHJvZ3Jlc3NpdmUgbW9kZS4KICAgICAgKi8KQEAgLTEzNCwyNCArMTcyLDI0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIGltYWdlcyBjYW4gYmUgd3JpdHRlbiB1c2luZyAKLSAgICAgKiBpbmNyZWFzaW5nIHF1YWxpdHkgcGFzc2VzIGJ5IHByb2dyZXNzaXZlLiAgCisgICAgICogUmV0dXJucyB0cnVlIGlmIGltYWdlcyBjYW4gYmUgd3JpdHRlbiB1c2luZyBpbmNyZWFzaW5nIHF1YWxpdHkgcGFzc2VzIGJ5CisgICAgICogcHJvZ3Jlc3NpdmUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIGltYWdlcyBjYW4gYmUgd3JpdHRlbiB1c2luZyAKLSAgICAgKiBpbmNyZWFzaW5nIHF1YWxpdHkgcGFzc2VzIGJ5IHByb2dyZXNzaXZlLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlIGlmIGltYWdlcyBjYW4gYmUgd3JpdHRlbiB1c2luZyBpbmNyZWFzaW5nIHF1YWxpdHkgcGFzc2VzIGJ5CisgICAgICogICAgICAgICBwcm9ncmVzc2l2ZSwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNhbldyaXRlUHJvZ3Jlc3NpdmUoKSB7CiAgICAgICAgIHJldHVybiBjYW5Xcml0ZVByb2dyZXNzaXZlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHByb2dyZXNzaXZlIG1vZGUgd2hpY2ggZGVmaW5lcyB3aGV0aGVyIHRoZSBzdHJlYW0gCi0gICAgICogY29udGFpbnMgYSBwcm9ncmVzc2l2ZSBzZXF1ZW5jZSBvZiBpbmNyZWFzaW5nIHF1YWxpdHkKLSAgICAgKiBkdXJpbmcgd3JpdGluZy4gVGhlIHByb2dyZXNzaXZlIG1vZGUgc2hvdWxkIGJlIG9uZSBvZgotICAgICAqIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiBNT0RFX0RJU0FCTEVELCBNT0RFX0RFRkFVTFQsIG9yCi0gICAgICogTU9ERV9DT1BZX0ZST01fTUVUQURBVEEuCisgICAgICogU2V0cyB0aGUgcHJvZ3Jlc3NpdmUgbW9kZSB3aGljaCBkZWZpbmVzIHdoZXRoZXIgdGhlIHN0cmVhbSBjb250YWlucyBhCisgICAgICogcHJvZ3Jlc3NpdmUgc2VxdWVuY2Ugb2YgaW5jcmVhc2luZyBxdWFsaXR5IGR1cmluZyB3cml0aW5nLiBUaGUKKyAgICAgKiBwcm9ncmVzc2l2ZSBtb2RlIHNob3VsZCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IE1PREVfRElTQUJMRUQsCisgICAgICogTU9ERV9ERUZBVUxULCBvciBNT0RFX0NPUFlfRlJPTV9NRVRBREFUQS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbW9kZSB0aGUgbmV3IHByb2dyZXNzaXZlIG1vZGUuCisgICAgICogQHBhcmFtIG1vZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgcHJvZ3Jlc3NpdmUgbW9kZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc2l2ZU1vZGUoaW50IG1vZGUpIHsKICAgICAgICAgaWYgKGNhbldyaXRlUHJvZ3Jlc3NpdmUoKSkgewpAQCAtMTY0LDIyICsyMDIsMjEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdyaXRlciBjYW4gdXNlIHRpbGVzIHdpdGggbm9uIHplcm8gCi0gICAgICogZ3JpZCBvZmZzZXRzIHdoaWxlIHdyaXRpbmcuIAorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgd3JpdGVyIGNhbiB1c2UgdGlsZXMgd2l0aCBub24gemVybyBncmlkIG9mZnNldHMgd2hpbGUKKyAgICAgKiB3cml0aW5nLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgd3JpdGVyIGNhbiB1c2UgdGlsZXMgd2l0aCBub24gemVybyAKLSAgICAgKiBncmlkIG9mZnNldHMgd2hpbGUgd3JpdGluZywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHdyaXRlciBjYW4gdXNlIHRpbGVzIHdpdGggbm9uIHplcm8gZ3JpZCBvZmZzZXRzCisgICAgICogICAgICAgICB3aGlsZSB3cml0aW5nLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY2FuT2Zmc2V0VGlsZXMoKSB7CiAgICAgICAgIHJldHVybiBjYW5PZmZzZXRUaWxlczsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB3cml0ZXIgY2FuIHdyaXRlIGltYWdlcyB3aXRoIAotICAgICAqIGNvbXByZXNzaW9uLiAgCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgd3JpdGVyIGNhbiB3cml0ZSBpbWFnZXMgd2l0aCBjb21wcmVzc2lvbi4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIHRydWUgaWYgdGhpcyB3cml0ZXIgY2FuIHdyaXRlIGltYWdlcyB3aXRoIAotICAgICAqIGNvbXByZXNzaW9uLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGlzIHdyaXRlciBjYW4gd3JpdGUgaW1hZ2VzIHdpdGggY29tcHJlc3Npb24sIGZhbHNlCisgICAgICogICAgICAgICBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY2FuV3JpdGVDb21wcmVzc2VkKCkgewogICAgICAgICByZXR1cm4gY2FuV3JpdGVDb21wcmVzc2VkOwpAQCAtMTg4LDcgKzIyNSw3IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3cml0ZXIgY2FuIHdyaXRlIHRpbGVzLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgd3JpdGVyIGNhbiB3cml0ZSB0aWxlcywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHdyaXRlciBjYW4gd3JpdGUgdGlsZXMsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjYW5Xcml0ZVRpbGVzKCkgewogICAgICAgICByZXR1cm4gY2FuV3JpdGVUaWxlczsKQEAgLTI0Nyw4ICsyODQsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGN1cnJlbnQgY29tcHJlc3Npb24gdHlwZSwgb3IgcmV0dXJucyBudWxsLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgY29tcHJlc3Npb24gdHlwZSwgb3IgcmV0dXJucyBudWxsIAotICAgICAqIGlmIGl0IGlzIG5vdCBzZXQuCisgICAgICogQHJldHVybiB0aGUgY3VycmVudCBjb21wcmVzc2lvbiB0eXBlLCBvciByZXR1cm5zIG51bGwgaWYgaXQgaXMgbm90IHNldC4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldENvbXByZXNzaW9uVHlwZSgpIHsKICAgICAgICAgY2hlY2tXcml0ZUNvbXByZXNzZWQoKTsKQEAgLTI1NywxNCArMjkzLDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhIGJpdCByYXRlIHdoaWNoIHJlcHJlc2VudHMgYW4gZXN0aW1hdGUgb2YgdGhlIG51bWJlciBvZiBiaXRzIAotICAgICAqIG9mIG91dHB1dCBkYXRhIGZvciBlYWNoIGJpdCBvZiBpbnB1dCBpbWFnZSBkYXRhIHdpdGggdGhlIHNwZWNpZmllZCAKLSAgICAgKiBxdWFsaXR5LgorICAgICAqIEdldHMgYSBiaXQgcmF0ZSB3aGljaCByZXByZXNlbnRzIGFuIGVzdGltYXRlIG9mIHRoZSBudW1iZXIgb2YgYml0cyBvZgorICAgICAqIG91dHB1dCBkYXRhIGZvciBlYWNoIGJpdCBvZiBpbnB1dCBpbWFnZSBkYXRhIHdpdGggdGhlIHNwZWNpZmllZCBxdWFsaXR5LgogICAgICAqIAotICAgICAqIEBwYXJhbSBxdWFsaXR5IHRoZSBxdWFsaXR5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gZXN0aW1hdGUgb2YgdGhlIGJpdCByYXRlLCBvciAtMS4wRiBpZiB0aGVyZSBpcyBubyAKLSAgICAgKiBlc3RpbWF0ZS4gCisgICAgICogQHBhcmFtIHF1YWxpdHkKKyAgICAgKiAgICAgICAgICAgIHRoZSBxdWFsaXR5LgorICAgICAqIEByZXR1cm4gYW4gZXN0aW1hdGUgb2YgdGhlIGJpdCByYXRlLCBvciAtMS4wRiBpZiB0aGVyZSBpcyBubyBlc3RpbWF0ZS4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0Qml0UmF0ZShmbG9hdCBxdWFsaXR5KSB7CiAgICAgICAgIGNoZWNrV3JpdGVDb21wcmVzc2VkKCk7CkBAIC0zMDEsOCArMzM1LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIGFycmF5IG9mIGZsb2F0cyB3aGljaCBkZWNyaWJlIAotICAgICAqIGNvbXByZXNzaW9uIHF1YWxpdHkgbGV2ZWxzLiAKKyAgICAgKiBHZXRzIGFuIGFycmF5IG9mIGZsb2F0cyB3aGljaCBkZXNjcmliZXMgY29tcHJlc3Npb24gcXVhbGl0eSBsZXZlbHMuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgY29tcHJlc3Npb24gcXVhbGl0eSB2YWx1ZXMuCiAgICAgICovCkBAIC0zMjMsNyArMzU2LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjdXJyZW50IGNvbXByZXNzaW9uIHR5cGUgdXNpbmcgdGhlIGN1cnJlbnQgTG9jYWxlLiAKKyAgICAgKiBHZXRzIHRoZSBjdXJyZW50IGNvbXByZXNzaW9uIHR5cGUgdXNpbmcgdGhlIGN1cnJlbnQgTG9jYWxlLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgY29tcHJlc3Npb24gdHlwZSB1c2luZyB0aGUgY3VycmVudCBMb2NhbGUuCiAgICAgICovCkBAIC0zNzcsOCArNDEwLDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIGFycmF5IG9mIERpbWVuc2lvbnMgZ2l2aW5nIHRoZSBzaXplcyBvZiB0aGUgdGlsZXMgYXMgCi0gICAgICogdGhleSBhcmUgZW5jb2RlZCBpbiB0aGUgb3V0cHV0IGZpbGUgb3Igc3RyZWFtLiAKKyAgICAgKiBHZXRzIGFuIGFycmF5IG9mIERpbWVuc2lvbnMgZ2l2aW5nIHRoZSBzaXplcyBvZiB0aGUgdGlsZXMgYXMgdGhleSBhcmUKKyAgICAgKiBlbmNvZGVkIGluIHRoZSBvdXRwdXQgZmlsZSBvciBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgcHJlZmVycmVkIHRpbGUgc2l6ZXMuCiAgICAgICovCkBAIC00MjAsMTEgKzQ1MywxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRpbGUgaGVpZ2h0IGluIGFuIGltYWdlIGFzIGl0IGlzIHdyaXR0ZW4gdG8gdGhlIAotICAgICAqIG91dHB1dCBzdHJlYW0uCisgICAgICogR2V0cyB0aGUgdGlsZSBoZWlnaHQgaW4gYW4gaW1hZ2UgYXMgaXQgaXMgd3JpdHRlbiB0byB0aGUgb3V0cHV0IHN0cmVhbS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0aWxlIGhlaWdodCBpbiBhbiBpbWFnZSBhcyBpdCBpcyB3cml0dGVuIHRvIHRoZSAKLSAgICAgKiBvdXRwdXQgc3RyZWFtLgorICAgICAqIEByZXR1cm4gdGhlIHRpbGUgaGVpZ2h0IGluIGFuIGltYWdlIGFzIGl0IGlzIHdyaXR0ZW4gdG8gdGhlIG91dHB1dAorICAgICAqICAgICAgICAgc3RyZWFtLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0VGlsZUhlaWdodCgpIHsKICAgICAgICAgY2hlY2tUaWxpbmcoKTsKQEAgLTQzNCwxMSArNDY2LDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0aWxlIHdpZHRoIGluIGFuIGltYWdlIGFzIGl0IGlzIHdyaXR0ZW4gdG8gdGhlIAotICAgICAqIG91dHB1dCBzdHJlYW0uCisgICAgICogR2V0cyB0aGUgdGlsZSB3aWR0aCBpbiBhbiBpbWFnZSBhcyBpdCBpcyB3cml0dGVuIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHRpbGUgd2lkdGggaW4gYW4gaW1hZ2UgYXMgaXQgaXMgd3JpdHRlbiB0byB0aGUgCi0gICAgICogb3V0cHV0IHN0cmVhbS4KKyAgICAgKiBAcmV0dXJuIHRoZSB0aWxlIHdpZHRoIGluIGFuIGltYWdlIGFzIGl0IGlzIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBzdHJlYW0uCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRUaWxlV2lkdGgoKSB7CiAgICAgICAgIGNoZWNrVGlsaW5nKCk7CkBAIC00NDgsMTEgKzQ3OCwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBjb21wcmVzc2lvbiB0eXBlIGhhcyBsb3NzbGVzcyAKLSAgICAgKiBjb21wcmVzc2lvbiBvciBub3QuIAorICAgICAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBjb21wcmVzc2lvbiB0eXBlIGhhcyBsb3NzbGVzcyBjb21wcmVzc2lvbiBvciBub3QuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgY3VycmVudCBjb21wcmVzc2lvbiB0eXBlIGhhcyBsb3NzbGVzcyAKLSAgICAgKiBjb21wcmVzc2lvbiwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIGN1cnJlbnQgY29tcHJlc3Npb24gdHlwZSBoYXMgbG9zc2xlc3MgY29tcHJlc3Npb24sCisgICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNDb21wcmVzc2lvbkxvc3NsZXNzKCkgewogICAgICAgICBjaGVja1dyaXRlQ29tcHJlc3NlZCgpOwpAQCAtNDcyLDEyICs1MDEsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjb21wcmVzc2lvbiBtb2RlIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0gICAgICogVGhlIHNwZWNpZmllZCBtb2RlIGNhbiBiZSBvbmUgb2YgdGhlIHByZWRlZmluZWQKLSAgICAgKiBjb25zdGFudHM6IE1PREVfREVGQVVMVCwgTU9ERV9ESVNBQkxFRCwgTU9ERV9FWFBMSUNJVCwgCi0gICAgICogb3IgTU9ERV9DT1BZX0ZST01fTUVUQURBVEEuCi0gICAgICogIAotICAgICAqIEBwYXJhbSBtb2RlIHRoZSBuZXcgY29tcHJlc3Npb24gbW9kZSB0byBiZSBzZXQuCisgICAgICogU2V0cyB0aGUgY29tcHJlc3Npb24gbW9kZSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLiBUaGUgc3BlY2lmaWVkIG1vZGUgY2FuCisgICAgICogYmUgb25lIG9mIHRoZSBwcmVkZWZpbmVkIGNvbnN0YW50czogTU9ERV9ERUZBVUxULCBNT0RFX0RJU0FCTEVELAorICAgICAqIE1PREVfRVhQTElDSVQsIG9yIE1PREVfQ09QWV9GUk9NX01FVEFEQVRBLgorICAgICAqIAorICAgICAqIEBwYXJhbSBtb2RlCisgICAgICogICAgICAgICAgICB0aGUgbmV3IGNvbXByZXNzaW9uIG1vZGUgdG8gYmUgc2V0LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENvbXByZXNzaW9uTW9kZShpbnQgbW9kZSkgewogICAgICAgICBjaGVja1dyaXRlQ29tcHJlc3NlZCgpOwpAQCAtNTAyLDggKzUzMSw4IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgY29tcHJlc3Npb24gcXVhbGl0eS4gVGhlIHZhbHVlIHNob3VsZCBiZSBiZXR3ZWVuIDAgYW5kIDEuCiAgICAgICogCi0gICAgICogQHBhcmFtIHF1YWxpdHkgdGhlIG5ldyBjb21wcmVzc2lvbiBxdWFsaXR5LCAKLSAgICAgKiBmbG9hdCB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEuIAorICAgICAqIEBwYXJhbSBxdWFsaXR5CisgICAgICogICAgICAgICAgICB0aGUgbmV3IGNvbXByZXNzaW9uIHF1YWxpdHksIGZsb2F0IHZhbHVlIGJldHdlZW4gMCBhbmQgMS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDb21wcmVzc2lvblF1YWxpdHkoZmxvYXQgcXVhbGl0eSkgewogICAgICAgICBjaGVja1dyaXRlQ29tcHJlc3NlZCgpOwpAQCAtNTE2LDExICs1NDUsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjb21wcmVzc2lvbiB0eXBlLiBUaGUgc3BlY2lmaWVkIHN0cmluZwotICAgICAqIHNob3VsZCBiZSBvbmUgb2YgdGhlIHZhbHVlcyByZXR1cm5lZCAKLSAgICAgKiBieSBnZXRDb21wcmVzc2lvblR5cGVzIG1ldGhvZC4KKyAgICAgKiBTZXRzIHRoZSBjb21wcmVzc2lvbiB0eXBlLiBUaGUgc3BlY2lmaWVkIHN0cmluZyBzaG91bGQgYmUgb25lIG9mIHRoZQorICAgICAqIHZhbHVlcyByZXR1cm5lZCBieSBnZXRDb21wcmVzc2lvblR5cGVzIG1ldGhvZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29tcHJlc3Npb25UeXBlIHRoZSBuZXcgY29tcHJlc3Npb24gdHlwZS4KKyAgICAgKiBAcGFyYW0gY29tcHJlc3Npb25UeXBlCisgICAgICogICAgICAgICAgICB0aGUgbmV3IGNvbXByZXNzaW9uIHR5cGUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q29tcHJlc3Npb25UeXBlKFN0cmluZyBjb21wcmVzc2lvblR5cGUpIHsKICAgICAgICAgY2hlY2tXcml0ZUNvbXByZXNzZWQoKTsKQEAgLTU0NywxMyArNTc2LDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgaW5zdHJ1Y3Rpb24gdGhhdCB0aWxpbmcgc2hvdWxkIGJlIHBlcmZvcm1lZCBmb3IgCi0gICAgICogdGhlIGltYWdlIGluIHRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLiAKKyAgICAgKiBTZXRzIHRoZSBpbnN0cnVjdGlvbiB0aGF0IHRpbGluZyBzaG91bGQgYmUgcGVyZm9ybWVkIGZvciB0aGUgaW1hZ2UgaW4gdGhlCisgICAgICogb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGlsZVdpZHRoIHRoZSB0aWxlJ3Mgd2lkdGguCi0gICAgICogQHBhcmFtIHRpbGVIZWlnaHQgdGhlIHRpbGUncyBoZWlnaHQuCi0gICAgICogQHBhcmFtIHRpbGVHcmlkWE9mZnNldCB0aGUgdGlsZSBncmlkJ3MgeCBvZmZzZXQuCi0gICAgICogQHBhcmFtIHRpbGVHcmlkWU9mZnNldCB0aGUgdGlsZSBncmlkJ3MgeSBvZmZzZXQuCisgICAgICogQHBhcmFtIHRpbGVXaWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHRpbGUncyB3aWR0aC4KKyAgICAgKiBAcGFyYW0gdGlsZUhlaWdodAorICAgICAqICAgICAgICAgICAgdGhlIHRpbGUncyBoZWlnaHQuCisgICAgICogQHBhcmFtIHRpbGVHcmlkWE9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIHRpbGUgZ3JpZCdzIHggb2Zmc2V0LgorICAgICAqIEBwYXJhbSB0aWxlR3JpZFlPZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSB0aWxlIGdyaWQncyB5IG9mZnNldC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRUaWxpbmcoaW50IHRpbGVXaWR0aCwgaW50IHRpbGVIZWlnaHQsIGludCB0aWxlR3JpZFhPZmZzZXQsIGludCB0aWxlR3JpZFlPZmZzZXQpIHsKICAgICAgICAgY2hlY2tUaWxpbmcoKTsKQEAgLTU2MywxOSArNTk2LDE3IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIkNhbid0IG9mZnNldCB0aWxlcyEiKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICh0aWxlV2lkdGggPD0wIHx8IHRpbGVIZWlnaHQgPD0gMCkgeworICAgICAgICBpZiAodGlsZVdpZHRoIDw9IDAgfHwgdGlsZUhlaWdodCA8PSAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0aWxlIGRpbWVuc2lvbnMgYXJlIG5vbi1wb3NpdGl2ZSEiKTsKICAgICAgICAgfQogCiAgICAgICAgIERpbWVuc2lvbiBwcmVmZXJyZWRUaWxlU2l6ZXNbXSA9IGdldFByZWZlcnJlZFRpbGVTaXplcygpOwogICAgICAgICBpZiAocHJlZmVycmVkVGlsZVNpemVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJlZmVycmVkVGlsZVNpemVzLmxlbmd0aDsgaSs9MikgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcmVmZXJyZWRUaWxlU2l6ZXMubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICAgICAgICAgICBEaW1lbnNpb24gbWluU2l6ZSA9IHByZWZlcnJlZFRpbGVTaXplc1tpXTsKLSAgICAgICAgICAgICAgICBEaW1lbnNpb24gbWF4U2l6ZSA9IHByZWZlcnJlZFRpbGVTaXplc1tpKzFdOwotICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVXaWR0aCA8IG1pblNpemUud2lkdGggfHwgdGlsZVdpZHRoID4gbWF4U2l6ZS53aWR0aCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgdGlsZUhlaWdodCA8IG1pblNpemUuaGVpZ2h0IHx8IHRpbGVIZWlnaHQgPiBtYXhTaXplLmhlaWdodAotICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIERpbWVuc2lvbiBtYXhTaXplID0gcHJlZmVycmVkVGlsZVNpemVzW2kgKyAxXTsKKyAgICAgICAgICAgICAgICBpZiAodGlsZVdpZHRoIDwgbWluU2l6ZS53aWR0aCB8fCB0aWxlV2lkdGggPiBtYXhTaXplLndpZHRoCisgICAgICAgICAgICAgICAgICAgICAgICB8fCB0aWxlSGVpZ2h0IDwgbWluU2l6ZS5oZWlnaHQgfHwgdGlsZUhlaWdodCA+IG1heFNpemUuaGVpZ2h0KSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgdGlsZSBzaXplISIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTYwMywxMSArNjM0LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgdGlsaW5nIG1vZGUuIFRoZSBzcGVjaWZpZWQgbW9kZSBzaG91bGQgYmUgb25lIG9mIHRoZSAKLSAgICAgKiBmb2xsb3dpbmcgdmFsdWVzOiBNT0RFX0RJU0FCTEVELCBNT0RFX0RFRkFVTFQsIE1PREVfRVhQTElDSVQsCi0gICAgICogb3IgTU9ERV9DT1BZX0ZST01fTUVUQURBVEEuCisgICAgICogU2V0cyB0aGUgdGlsaW5nIG1vZGUuIFRoZSBzcGVjaWZpZWQgbW9kZSBzaG91bGQgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcKKyAgICAgKiB2YWx1ZXM6IE1PREVfRElTQUJMRUQsIE1PREVfREVGQVVMVCwgTU9ERV9FWFBMSUNJVCwgb3IKKyAgICAgKiBNT0RFX0NPUFlfRlJPTV9NRVRBREFUQS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbW9kZSB0aGUgbmV3IHRpbGluZyBtb2RlLgorICAgICAqIEBwYXJhbSBtb2RlCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHRpbGluZyBtb2RlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFRpbGluZ01vZGUoaW50IG1vZGUpIHsKICAgICAgICAgY2hlY2tUaWxpbmcoKTsKQEAgLTYzMCw0ICs2NjIsMyBAQAogICAgICAgICB9CiAgICAgfQogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9JbWFnZVdyaXRlci5qYXZhIGIvYXd0L2phdmF4L2ltYWdlaW8vSW1hZ2VXcml0ZXIuamF2YQppbmRleCBkNjExOWIwLi44Njg3OWUwIDEwMDY0NAotLS0gYS9hd3QvamF2YXgvaW1hZ2Vpby9JbWFnZVdyaXRlci5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL0ltYWdlV3JpdGVyLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgUnVzdGVtIFYuIFJhZmlrb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4zICQKICAqLworCiBwYWNrYWdlIGphdmF4LmltYWdlaW87CiAKIGltcG9ydCBqYXZhLmF3dC5EaW1lbnNpb247CkBAIC00MCwzNCArNDEsNDkgQEAKIGltcG9ydCBqYXZheC5pbWFnZWlvLnNwaS5JbWFnZVdyaXRlclNwaTsKIAogLyoqCi0gKiBUaGUgSW1hZ2VXcml0ZXIgY2xhc3MgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZm9yIGVuY29kaW5nIGltYWdlcy4KLSAqIEltYWdlV3JpdGVyIG9iamVjdHMgYXJlIGluc3RhbnRpYXRlZCBieSB0aGUgc2VydmljZSBwcm92aWRlciAKLSAqIGludGVyZmFjZSwgSW1hZ2VXcml0ZXJTcGkgY2xhc3MsIGZvciB0aGUgc3BlY2lmaWMgZm9ybWF0LiAKLSAqIEltYWdlV3JpdGVyU3BpIGNsYXNzIHNob3VsZCBiZSByZWdpc3RlcmVkIHdpdGggdGhlIElJT1JlZ2lzdHJ5LCAKLSAqIHdoaWNoIHVzZXMgdGhlbSBmb3IgZm9ybWF0IHJlY29nbml0aW9uIGFuZCBwcmVzZW50YXRpb24gb2YgYXZhaWxhYmxlIAotICogZm9ybWF0IHJlYWRlcnMgYW5kIHdyaXRlcnMuCisgKiBUaGUgSW1hZ2VXcml0ZXIgY2xhc3MgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZm9yIGVuY29kaW5nIGltYWdlcy4gSW1hZ2VXcml0ZXIKKyAqIG9iamVjdHMgYXJlIGluc3RhbnRpYXRlZCBieSB0aGUgc2VydmljZSBwcm92aWRlciBpbnRlcmZhY2UsIEltYWdlV3JpdGVyU3BpCisgKiBjbGFzcywgZm9yIHRoZSBzcGVjaWZpYyBmb3JtYXQuIEltYWdlV3JpdGVyU3BpIGNsYXNzIHNob3VsZCBiZSByZWdpc3RlcmVkCisgKiB3aXRoIHRoZSBJSU9SZWdpc3RyeSwgd2hpY2ggdXNlcyB0aGVtIGZvciBmb3JtYXQgcmVjb2duaXRpb24gYW5kIHByZXNlbnRhdGlvbgorICogb2YgYXZhaWxhYmxlIGZvcm1hdCByZWFkZXJzIGFuZCB3cml0ZXJzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEltYWdlV3JpdGVyIGltcGxlbWVudHMgSW1hZ2VUcmFuc2NvZGVyIHsKIAotICAgIC8qKiBUaGUgYXZhaWxhYmxlIGxvY2FsZXMuICovCisgICAgLyoqCisgICAgICogVGhlIGF2YWlsYWJsZSBsb2NhbGVzLgorICAgICAqLwogICAgIHByb3RlY3RlZCBMb2NhbGVbXSBhdmFpbGFibGVMb2NhbGVzOwotICAgIAotICAgIC8qKiBUaGUgbG9jYWxlLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGxvY2FsZS4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgTG9jYWxlIGxvY2FsZTsKLSAgICAKLSAgICAvKiogVGhlIG9yaWdpbmF0aW5nIHByb3ZpZGVyLiAqLworCisgICAgLyoqCisgICAgICogVGhlIG9yaWdpbmF0aW5nIHByb3ZpZGVyLgorICAgICAqLwogICAgIHByb3RlY3RlZCBJbWFnZVdyaXRlclNwaSBvcmlnaW5hdGluZ1Byb3ZpZGVyOwotICAgIAotICAgIC8qKiBUaGUgb3V0cHV0LiAqLworCisgICAgLyoqCisgICAgICogVGhlIG91dHB1dC4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgT2JqZWN0IG91dHB1dDsKLSAgICAKLSAgICAvKiogVGhlIHByb2dyZXNzIGxpc3RlbmVycy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBwcm9ncmVzcyBsaXN0ZW5lcnMuCisgICAgICovCiAgICAgcHJvdGVjdGVkIExpc3Q8SUlPV3JpdGVQcm9ncmVzc0xpc3RlbmVyPiBwcm9ncmVzc0xpc3RlbmVyczsKLSAgICAKLSAgICAvKiogVGhlIHdhcm5pbmcgbGlzdGVuZXJzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHdhcm5pbmcgbGlzdGVuZXJzLgorICAgICAqLwogICAgIHByb3RlY3RlZCBMaXN0PElJT1dyaXRlV2FybmluZ0xpc3RlbmVyPiB3YXJuaW5nTGlzdGVuZXJzOwotICAgIAotICAgIC8qKiBUaGUgd2FybmluZyBsb2NhbGVzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHdhcm5pbmcgbG9jYWxlcy4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgTGlzdDxMb2NhbGU+IHdhcm5pbmdMb2NhbGVzOwogCiAgICAgLy8gSW5kaWNhdGVzIHRoYXQgYWJvcnQgb3BlcmF0aW9uIGlzIHJlcXVlc3RlZApAQCAtNzgsMjIgKzk0LDIxIEBACiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEltYWdlV3JpdGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBvcmlnaW5hdGluZ1Byb3ZpZGVyIHRoZSBJbWFnZVdyaXRlclNwaSB3aGljaCAKLSAgICAgKiBpbnN0YW50aWVzIHRoaXMgSW1hZ2VXcml0ZXIuCisgICAgICogQHBhcmFtIG9yaWdpbmF0aW5nUHJvdmlkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVdyaXRlclNwaSB3aGljaCBpbnN0YW50aWF0ZXMgdGhpcyBJbWFnZVdyaXRlci4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgSW1hZ2VXcml0ZXIoSW1hZ2VXcml0ZXJTcGkgb3JpZ2luYXRpbmdQcm92aWRlcikgewogICAgICAgICB0aGlzLm9yaWdpbmF0aW5nUHJvdmlkZXIgPSBvcmlnaW5hdGluZ1Byb3ZpZGVyOwogICAgIH0KIAogICAgIHB1YmxpYyBhYnN0cmFjdCBJSU9NZXRhZGF0YSBjb252ZXJ0U3RyZWFtTWV0YWRhdGEoSUlPTWV0YWRhdGEgaWlvTWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZVdyaXRlUGFyYW0gaW1hZ2VXcml0ZVBhcmFtKTsKKyAgICAgICAgICAgIEltYWdlV3JpdGVQYXJhbSBpbWFnZVdyaXRlUGFyYW0pOwogCiAgICAgcHVibGljIGFic3RyYWN0IElJT01ldGFkYXRhIGNvbnZlcnRJbWFnZU1ldGFkYXRhKElJT01ldGFkYXRhIGlpb01ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZVR5cGVTcGVjaWZpZXIgaW1hZ2VUeXBlU3BlY2lmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZVdyaXRlUGFyYW0gaW1hZ2VXcml0ZVBhcmFtKTsKKyAgICAgICAgICAgIEltYWdlVHlwZVNwZWNpZmllciBpbWFnZVR5cGVTcGVjaWZpZXIsIEltYWdlV3JpdGVQYXJhbSBpbWFnZVdyaXRlUGFyYW0pOwogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgSW1hZ2VXcml0ZXJTcGkgd2hpY2ggaW5zdGFudGlhdGVkIHRoaXMgSW1hZ2VXcml0ZXIuIAorICAgICAqIEdldHMgdGhlIEltYWdlV3JpdGVyU3BpIHdoaWNoIGluc3RhbnRpYXRlZCB0aGlzIEltYWdlV3JpdGVyLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIEltYWdlV3JpdGVyU3BpLgogICAgICAqLwpAQCAtMTAyLDEwICsxMTcsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgdGhlIHN0YXJ0IG9mIGFuIGltYWdlIHJlYWQgYnkgY2FsbGluZyB0aGVpciBpbWFnZVN0YXJ0ZWQKLSAgICAgKiBtZXRob2Qgb2YgcmVnaXN0ZXJlZCBJSU9Xcml0ZVByb2dyZXNzTGlzdGVuZXJzLgorICAgICAqIFByb2Nlc3NlcyB0aGUgc3RhcnQgb2YgYW4gaW1hZ2UgcmVhZCBieSBjYWxsaW5nIHRoZWlyIGltYWdlU3RhcnRlZCBtZXRob2QKKyAgICAgKiBvZiByZWdpc3RlcmVkIElJT1dyaXRlUHJvZ3Jlc3NMaXN0ZW5lcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGltYWdlSW5kZXggdGhlIGltYWdlIGluZGV4LgorICAgICAqIEBwYXJhbSBpbWFnZUluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgaW5kZXguCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0ltYWdlU3RhcnRlZChpbnQgaW1hZ2VJbmRleCkgewogICAgICAgICBpZiAobnVsbCAhPSBwcm9ncmVzc0xpc3RlbmVycykgewpAQCAtMTE2LDEwICsxMzIsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgdGhlIGN1cnJlbnQgcGVyY2VudGFnZSBvZiBpbWFnZSBjb21wbGV0aW9uIGJ5IGNhbGxpbmcgCisgICAgICogUHJvY2Vzc2VzIHRoZSBjdXJyZW50IHBlcmNlbnRhZ2Ugb2YgaW1hZ2UgY29tcGxldGlvbiBieSBjYWxsaW5nCiAgICAgICogaW1hZ2VQcm9ncmVzcyBtZXRob2Qgb2YgcmVnaXN0ZXJlZCBJSU9Xcml0ZVByb2dyZXNzTGlzdGVuZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHBlcmNlbnRhZ2VEb25lIHRoZSBwZXJjZW50YWdlIGRvbmUuCisgICAgICogQHBhcmFtIHBlcmNlbnRhZ2VEb25lCisgICAgICogICAgICAgICAgICB0aGUgcGVyY2VudGFnZSBkb25lLgogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NJbWFnZVByb2dyZXNzKGZsb2F0IHBlcmNlbnRhZ2VEb25lKSB7CiAgICAgICAgIGlmIChudWxsICE9IHByb2dyZXNzTGlzdGVuZXJzKSB7CkBAIC0xMzAsOCArMTQ3LDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgaW1hZ2UgY29tcGxldGlvbiBieSBjYWxsaW5nIGltYWdlQ29tcGxldGUgbWV0aG9kCi0gICAgICogb2YgcmVnaXN0ZXJlZCBJSU9Xcml0ZVByb2dyZXNzTGlzdGVuZXJzLiAKKyAgICAgKiBQcm9jZXNzZXMgaW1hZ2UgY29tcGxldGlvbiBieSBjYWxsaW5nIGltYWdlQ29tcGxldGUgbWV0aG9kIG9mIHJlZ2lzdGVyZWQKKyAgICAgKiBJSU9Xcml0ZVByb2dyZXNzTGlzdGVuZXJzLgogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NJbWFnZUNvbXBsZXRlKCkgewogICAgICAgICBpZiAobnVsbCAhPSBwcm9ncmVzc0xpc3RlbmVycykgewpAQCAtMTQyLDExICsxNTksMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgYSB3YXJuaW5nIG1lc3NhZ2UgYnkgY2FsbGluZyB3YXJuaW5nT2NjdXJyZWQgbWV0aG9kCi0gICAgICogb2YgcmVnaXN0ZXJlZCBJSU9Xcml0ZVdhcm5pbmdMaXN0ZW5lcnMuCisgICAgICogUHJvY2Vzc2VzIGEgd2FybmluZyBtZXNzYWdlIGJ5IGNhbGxpbmcgd2FybmluZ09jY3VycmVkIG1ldGhvZCBvZgorICAgICAqIHJlZ2lzdGVyZWQgSUlPV3JpdGVXYXJuaW5nTGlzdGVuZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZUluZGV4IHRoZSBpbWFnZSBpbmRleC4KLSAgICAgKiBAcGFyYW0gd2FybmluZyB0aGUgd2FybmluZy4KKyAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGluZGV4LgorICAgICAqIEBwYXJhbSB3YXJuaW5nCisgICAgICogICAgICAgICAgICB0aGUgd2FybmluZy4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzV2FybmluZ09jY3VycmVkKGludCBpbWFnZUluZGV4LCBTdHJpbmcgd2FybmluZykgewogICAgICAgICBpZiAobnVsbCA9PSB3YXJuaW5nKSB7CkBAIC0xNjAsMTMgKzE3OSwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyBhIHdhcm5pbmcgbWVzc2FnZSBieSBjYWxsaW5nIHdhcm5pbmdPY2N1cnJlZCBtZXRob2QKLSAgICAgKiBvZiByZWdpc3RlcmVkIElJT1dyaXRlV2FybmluZ0xpc3RlbmVycyB3aXRoIHN0cmluZyBmcm9tIAotICAgICAqIFJlc291cmNlQnVuZGxlLgorICAgICAqIFByb2Nlc3NlcyBhIHdhcm5pbmcgbWVzc2FnZSBieSBjYWxsaW5nIHdhcm5pbmdPY2N1cnJlZCBtZXRob2Qgb2YKKyAgICAgKiByZWdpc3RlcmVkIElJT1dyaXRlV2FybmluZ0xpc3RlbmVycyB3aXRoIHN0cmluZyBmcm9tIFJlc291cmNlQnVuZGxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZUluZGV4IHRoZSBpbWFnZSBpbmRleC4KLSAgICAgKiBAcGFyYW0gYnVuZGxlIHRoZSBuYW1lIG9mIFJlc291cmNlQnVuZGxlLgotICAgICAqIEBwYXJhbSBrZXkgdGhlIGtleXdvcmQuCisgICAgICogQHBhcmFtIGltYWdlSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBpbmRleC4KKyAgICAgKiBAcGFyYW0gYnVuZGxlCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiBSZXNvdXJjZUJ1bmRsZS4KKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUga2V5d29yZC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzV2FybmluZ09jY3VycmVkKGludCBpbWFnZUluZGV4LCBTdHJpbmcgYnVuZGxlLCBTdHJpbmcga2V5KSB7CiAgICAgICAgIGlmICh3YXJuaW5nTGlzdGVuZXJzICE9IG51bGwpIHsgLy8gRG9uJ3QgY2hlY2sgdGhlIHBhcmFtZXRlcnMKQEAgLTE4MCwxNyArMjAxLDE4IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXl3b3JkID09IG51bGwhIik7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBHZXQgdGhlIGNvbnRleHQgY2xhc3MgbG9hZGVyIGFuZCB0cnkgdG8gbG9jYXRlIHRoZSBidW5kbGUgd2l0aCBpdCBmaXJzdAotICAgICAgICBDbGFzc0xvYWRlciBjb250ZXh0Q2xhc3Nsb2FkZXIgPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbjxDbGFzc0xvYWRlcj4oKSB7CisgICAgICAgIC8vIEdldCB0aGUgY29udGV4dCBjbGFzcyBsb2FkZXIgYW5kIHRyeSB0byBsb2NhdGUgdGhlIGJ1bmRsZSB3aXRoIGl0CisgICAgICAgIC8vIGZpcnN0CisgICAgICAgIENsYXNzTG9hZGVyIGNvbnRleHRDbGFzc2xvYWRlciA9IEFjY2Vzc0NvbnRyb2xsZXIKKyAgICAgICAgICAgICAgICAuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uPENsYXNzTG9hZGVyPigpIHsKICAgICAgICAgICAgICAgICAgICAgcHVibGljIENsYXNzTG9hZGVyIHJ1bigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0pOwogCiAgICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBib3RoIGxpc3RlbmVycyBhbmQgbG9jYWxlcwogICAgICAgICBpbnQgbiA9IHdhcm5pbmdMaXN0ZW5lcnMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgICAgIElJT1dyaXRlV2FybmluZ0xpc3RlbmVyIGxpc3RlbmVyID0gd2FybmluZ0xpc3RlbmVycy5nZXQoaSk7CiAgICAgICAgICAgICBMb2NhbGUgbG9jYWxlID0gd2FybmluZ0xvY2FsZXMuZ2V0KGkpOwogCkBAIC0yMTgsMTAgKzI0MCwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHNwZWNpZmllZCBPYmplY3QgdG8gdGhlIG91dHB1dCBvZiB0aGlzIEltYWdlV3JpdGVyLiAKKyAgICAgKiBTZXRzIHRoZSBzcGVjaWZpZWQgT2JqZWN0IHRvIHRoZSBvdXRwdXQgb2YgdGhpcyBJbWFnZVdyaXRlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gb3V0cHV0IHRoZSBPYmplY3Qgd2hpY2ggcmVwcmVzZW50cyBkZXN0aW5hdGlvbiwgaXQgY2FuIAotICAgICAqIGJlIEltYWdlT3V0cHV0U3RyZWFtIG9yIG90aGVyIG9iamVjdHMuCisgICAgICogQHBhcmFtIG91dHB1dAorICAgICAqICAgICAgICAgICAgdGhlIE9iamVjdCB3aGljaCByZXByZXNlbnRzIGRlc3RpbmF0aW9uLCBpdCBjYW4gYmUKKyAgICAgKiAgICAgICAgICAgIEltYWdlT3V0cHV0U3RyZWFtIG9yIG90aGVyIG9iamVjdHMuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0T3V0cHV0KE9iamVjdCBvdXRwdXQpIHsKICAgICAgICAgaWYgKG91dHB1dCAhPSBudWxsKSB7CkBAIC0yNDQsMjYgKzI2NywyNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlcyBhIGNvbXBsZXRlZCBpbWFnZSBzdHJlYW0gdGhhdCBjb250YWlucyB0aGUgc3BlY2lmaWVkIGltYWdlLCAKKyAgICAgKiBXcml0ZXMgYSBjb21wbGV0ZWQgaW1hZ2Ugc3RyZWFtIHRoYXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBpbWFnZSwKICAgICAgKiBkZWZhdWx0IG1ldGFkYXRhLCBhbmQgdGh1bWJuYWlscyB0byB0aGUgb3V0cHV0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZSB0aGUgc3BlY2lmaWVkIGltYWdlIHRvIGJlIHdyaXR0ZW4uCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQKLSAgICAgKiBkdXJpbmcgd3JpdHRpbmcuCisgICAgICogQHBhcmFtIGltYWdlCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGltYWdlIHRvIGJlIHdyaXR0ZW4uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkIGR1cmluZyB3cml0aW5nLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHdyaXRlKElJT0ltYWdlIGltYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB3cml0ZShudWxsLCBpbWFnZSwgbnVsbCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIGEgY29tcGxldGVkIGltYWdlIHN0cmVhbSB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgCi0gICAgICogcmVuZGVyZWQgaW1hZ2UsIGRlZmF1bHQgbWV0YWRhdGEsIGFuZCB0aHVtYm5haWxzIHRvIHRoZSBvdXRwdXQuCisgICAgICogV3JpdGVzIGEgY29tcGxldGVkIGltYWdlIHN0cmVhbSB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgcmVuZGVyZWQKKyAgICAgKiBpbWFnZSwgZGVmYXVsdCBtZXRhZGF0YSwgYW5kIHRodW1ibmFpbHMgdG8gdGhlIG91dHB1dC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1hZ2UgdGhlIHNwZWNpZmllZCBSZW5kZXJlZEltYWdlIHRvIGJlIHdyaXR0ZW4uCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQKLSAgICAgKiBkdXJpbmcgd3JpdHRpbmcuCisgICAgICogQHBhcmFtIGltYWdlCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIFJlbmRlcmVkSW1hZ2UgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQgZHVyaW5nIHdyaXRpbmcuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd3JpdGUoUmVuZGVyZWRJbWFnZSBpbWFnZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgd3JpdGUobnVsbCwgbmV3IElJT0ltYWdlKGltYWdlLCBudWxsLCBudWxsKSwgbnVsbCk7CkBAIC0yNzMsMTYgKzI5NiwxOCBAQAogICAgICAqIFdyaXRlcyBhIGNvbXBsZXRlZCBpbWFnZSBzdHJlYW0gdGhhdCBjb250YWlucyB0aGUgc3BlY2lmaWVkIGltYWdlLAogICAgICAqIG1ldGFkYXRhIGFuZCB0aHVtYm5haWxzIHRvIHRoZSBvdXRwdXQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHN0cmVhbU1ldGFkYXRhIHRoZSBzdHJlYW0gbWV0YWRhdGEsIG9yIG51bGwuCi0gICAgICogQHBhcmFtIGltYWdlIHRoZSBzcGVjaWZpZWQgaW1hZ2UgdG8gYmUgd3JpdHRlbiwgaWYKLSAgICAgKiBjYW5Xcml0ZVJhc3RlcigpIG1ldGhvZCByZXR1cm5zIGZhbHNlLCB0aGVuIEltYWdlIG11c3QgY29udGFpbiAKLSAgICAgKiBvbmx5IFJlbmRlcmVkSW1hZ2UuCi0gICAgICogQHBhcmFtIHBhcmFtIHRoZSBJbWFnZVdyaXRlUGFyYW0sIG9yIG51bGwuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAtIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgd3JpdGluZy4KKyAgICAgKiBAcGFyYW0gc3RyZWFtTWV0YWRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJlYW0gbWV0YWRhdGEsIG9yIG51bGwuCisgICAgICogQHBhcmFtIGltYWdlCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGltYWdlIHRvIGJlIHdyaXR0ZW4sIGlmIGNhbldyaXRlUmFzdGVyKCkgbWV0aG9kCisgICAgICogICAgICAgICAgICByZXR1cm5zIGZhbHNlLCB0aGVuIEltYWdlIG11c3QgY29udGFpbiBvbmx5IFJlbmRlcmVkSW1hZ2UuCisgICAgICogQHBhcmFtIHBhcmFtCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VXcml0ZVBhcmFtLCBvciBudWxsLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHdyaXRpbmcuCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGUoSUlPTWV0YWRhdGEgc3RyZWFtTWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUlPSW1hZ2UgaW1hZ2UsIEltYWdlV3JpdGVQYXJhbSBwYXJhbSkgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlKElJT01ldGFkYXRhIHN0cmVhbU1ldGFkYXRhLCBJSU9JbWFnZSBpbWFnZSwgSW1hZ2VXcml0ZVBhcmFtIHBhcmFtKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCiAgICAgICogRGlzcG9zZXMgb2YgYW55IHJlc291cmNlcy4KQEAgLTI5MiwyNiArMzE3LDI2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVxdWVzdHMgYW4gYWJvcnQgb3BlcmF0aW9uIGZvciBjdXJyZW50IHdyaXRpbmcgb3BlcmF0aW9uLiAKKyAgICAgKiBSZXF1ZXN0cyBhbiBhYm9ydCBvcGVyYXRpb24gZm9yIGN1cnJlbnQgd3JpdGluZyBvcGVyYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFib3J0KCkgewogICAgICAgICBhYm9ydGVkID0gdHJ1ZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgYSByZXF1ZXN0IHRvIGFib3J0IHRoZSBjdXJyZW50IHdyaXRlIG9wZXJhdGlvbiAKLSAgICAgKiBoYXMgYmVlbiBtYWRlIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgYSByZXF1ZXN0IHRvIGFib3J0IHRoZSBjdXJyZW50IHdyaXRlIG9wZXJhdGlvbiBoYXMKKyAgICAgKiBiZWVuIG1hZGUgc3VjY2Vzc2Z1bGx5LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHJlcXVlc3QgdG8gYWJvcnQgdGhlIGN1cnJlbnQgd3JpdGUgb3BlcmF0aW9uIAotICAgICAqIGhhcyBiZWVuIG1hZGUgc3VjY2Vzc2Z1bGx5LCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgcmVxdWVzdCB0byBhYm9ydCB0aGUgY3VycmVudCB3cml0ZSBvcGVyYXRpb24gaGFzCisgICAgICogICAgICAgICBiZWVuIG1hZGUgc3VjY2Vzc2Z1bGx5LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBib29sZWFuIGFib3J0UmVxdWVzdGVkKCkgewogICAgICAgICByZXR1cm4gYWJvcnRlZDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDbGVhcnMgYWxsIHByZXZpb3VzIGFib3J0IHJlcXVlc3QsIGFuZCBhYm9ydFJlcXVlc3RlZCByZXR1cm5zIGZhbHNlCi0gICAgICogYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZC4KKyAgICAgKiBDbGVhcnMgYWxsIHByZXZpb3VzIGFib3J0IHJlcXVlc3QsIGFuZCBhYm9ydFJlcXVlc3RlZCByZXR1cm5zIGZhbHNlIGFmdGVyCisgICAgICogY2FsbGluZyB0aGlzIG1ldGhvZC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgY2xlYXJBYm9ydFJlcXVlc3QoKSB7CiAgICAgICAgIGFib3J0ZWQgPSBmYWxzZTsKQEAgLTMyMCw3ICszNDUsOCBAQAogICAgIC8qKgogICAgICAqIEFkZHMgdGhlIElJT1dyaXRlUHJvZ3Jlc3NMaXN0ZW5lciBsaXN0ZW5lci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIElJT1dyaXRlUHJvZ3Jlc3NMaXN0ZW5lciBsaXN0ZW5lci4KKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBJSU9Xcml0ZVByb2dyZXNzTGlzdGVuZXIgbGlzdGVuZXIuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkSUlPV3JpdGVQcm9ncmVzc0xpc3RlbmVyKElJT1dyaXRlUHJvZ3Jlc3NMaXN0ZW5lciBsaXN0ZW5lcikgewogICAgICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCkgewpAQCAtMzM3LDcgKzM2Myw4IEBACiAgICAgLyoqCiAgICAgICogQWRkcyB0aGUgSUlPV3JpdGVXYXJuaW5nTGlzdGVuZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBJSU9Xcml0ZVdhcm5pbmdMaXN0ZW5lciBsaXN0ZW5lci4KKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBJSU9Xcml0ZVdhcm5pbmdMaXN0ZW5lciBsaXN0ZW5lci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRJSU9Xcml0ZVdhcm5pbmdMaXN0ZW5lcihJSU9Xcml0ZVdhcm5pbmdMaXN0ZW5lciBsaXN0ZW5lcikgewogICAgICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCkgewpAQCAtMzU2LDggKzM4Myw4IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgb3V0cHV0IG9iamVjdCB0aGF0IHdhcyBzZXQgYnkgc2V0T3V0cHV0IG1ldGhvZC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBvdXRwdXQgb2JqZWN0IHN1Y2ggYXMgSW1hZ2VPdXRwdXRTdHJlYW0sIG9yIG51bGwgaWYKLSAgICAgKiBpdCBpcyBub3Qgc2V0LgorICAgICAqIEByZXR1cm4gdGhlIG91dHB1dCBvYmplY3Qgc3VjaCBhcyBJbWFnZU91dHB1dFN0cmVhbSwgb3IgbnVsbCBpZiBpdCBpcyBub3QKKyAgICAgKiAgICAgICAgIHNldC4KICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGdldE91dHB1dCgpIHsKICAgICAgICAgcmV0dXJuIG91dHB1dDsKQEAgLTM2Niw3ICszOTMsNyBAQAogICAgIC8qKgogICAgICAqIENoZWNrIG91dHB1dCByZXR1cm4gZmFsc2UuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiBzdWNjZXNzZnVsCisgICAgICogQHJldHVybiB0cnVlLCBpZiBzdWNjZXNzZnVsLgogICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBjaGVja091dHB1dFJldHVybkZhbHNlKCkgewogICAgICAgICBpZiAoZ2V0T3V0cHV0KCkgPT0gbnVsbCkgewpAQCAtMzg1LDEyNCArNDEyLDEyMiBAQAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVuc3VwcG9ydGVkIHdyaXRlIHZhcmlhbnQhIik7CiAgICAgfQogCi0KICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgYSBuZXcgZW1wdHkgaW1hZ2UgY2FuIGJlIGluc2VydGVkIGF0IAotICAgICAqIHRoZSBzcGVjaWZpZWQgaW5kZXguIAorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhIG5ldyBlbXB0eSBpbWFnZSBjYW4gYmUgaW5zZXJ0ZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleCB0aGUgc3BlY2lmaWVkIGluZGV4IG9mIGltYWdlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhIG5ldyBlbXB0eSBpbWFnZSBjYW4gYmUgaW5zZXJ0ZWQgYXQgCi0gICAgICogdGhlIHNwZWNpZmllZCBpbmRleCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBpbWFnZUluZGV4CisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGluZGV4IG9mIGltYWdlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhIG5ldyBlbXB0eSBpbWFnZSBjYW4gYmUgaW5zZXJ0ZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleCwKKyAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNhbkluc2VydEVtcHR5KGludCBpbWFnZUluZGV4KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICByZXR1cm4gY2hlY2tPdXRwdXRSZXR1cm5GYWxzZSgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhIG5ldyBpbWFnZSBjYW4gYmUgaW5zZXJ0ZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4gCisgICAgICogUmV0dXJucyB0cnVlIGlmIGEgbmV3IGltYWdlIGNhbiBiZSBpbnNlcnRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZUluZGV4IHRoZSBzcGVjaWZpZWQgaW5kZXggb2YgaW1hZ2UuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIGEgbmV3IGltYWdlIGNhbiBiZSBpbnNlcnRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LCAKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIGltYWdlSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgaW5kZXggb2YgaW1hZ2UuCisgICAgICogQHJldHVybiB0cnVlIGlmIGEgbmV3IGltYWdlIGNhbiBiZSBpbnNlcnRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LCBmYWxzZQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY2FuSW5zZXJ0SW1hZ2UoaW50IGltYWdlSW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBjaGVja091dHB1dFJldHVybkZhbHNlKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuZXMgdHJ1ZSBpZiB0aGUgaW1hZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGluZGV4IGNhbiBiZSByZW1vdmVkLgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgaW1hZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGluZGV4IGNhbiBiZSByZW1vdmVkLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZUluZGV4IHRoZSBzcGVjaWZpZWQgaW5kZXggb2YgaW1hZ2UuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBpbWFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXggY2FuIGJlIHJlbW92ZWQsCi0gICAgICogZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBpbWFnZUluZGV4CisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGluZGV4IG9mIGltYWdlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgaW1hZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGluZGV4IGNhbiBiZSByZW1vdmVkLCBmYWxzZQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY2FuUmVtb3ZlSW1hZ2UoaW50IGltYWdlSW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBjaGVja091dHB1dFJldHVybkZhbHNlKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIG1ldGFkYXRhIG9mIHRoZSBpbWFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXgKLSAgICAgKiBjYW4gYmUgcmVwbGFjZWQuCisgICAgICogUmV0dXJucyB0cnVlIGlmIG1ldGFkYXRhIG9mIHRoZSBpbWFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXggY2FuIGJlCisgICAgICogcmVwbGFjZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGltYWdlSW5kZXggdGhlIHNwZWNpZmllZCBpbWFnZSBpbmRleC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgbWV0YWRhdGEgb2YgdGhlIGltYWdlIHdpdGggdGhlIHNwZWNpZmllZCBpbmRleAotICAgICAqIGNhbiBiZSByZXBsYWNlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBpbWFnZUluZGV4CisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGltYWdlIGluZGV4LgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBtZXRhZGF0YSBvZiB0aGUgaW1hZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGluZGV4IGNhbiBiZQorICAgICAqICAgICAgICAgcmVwbGFjZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY2FuUmVwbGFjZUltYWdlTWV0YWRhdGEoaW50IGltYWdlSW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBjaGVja091dHB1dFJldHVybkZhbHNlKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHBpeGVscyBvZiB0aGUgaW1hZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGluZGV4IAotICAgICAqIGNhbiBiZSByZXBsYWNlZCBieSB0aGUgcmVwbGFjZVBpeGVscyAgbWV0aG9kcy4KKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgcGl4ZWxzIG9mIHRoZSBpbWFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXggY2FuIGJlCisgICAgICogcmVwbGFjZWQgYnkgdGhlIHJlcGxhY2VQaXhlbHMgbWV0aG9kcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleCB0aGUgaW1hZ2UncyBpbmRleC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgcGl4ZWxzIG9mIHRoZSBpbWFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXggCi0gICAgICogY2FuIGJlIHJlcGxhY2VkIGJ5IHRoZSByZXBsYWNlUGl4ZWxzICBtZXRob2RzLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIGltYWdlSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSdzIGluZGV4LgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBwaXhlbHMgb2YgdGhlIGltYWdlIHdpdGggdGhlIHNwZWNpZmllZCBpbmRleCBjYW4gYmUKKyAgICAgKiAgICAgICAgIHJlcGxhY2VkIGJ5IHRoZSByZXBsYWNlUGl4ZWxzIG1ldGhvZHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNhblJlcGxhY2VQaXhlbHMoaW50IGltYWdlSW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBjaGVja091dHB1dFJldHVybkZhbHNlKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzdHJlYW0gbWV0YWRhdGEgcHJlc2VudGVkIGluIHRoZSBvdXRwdXQKLSAgICAgKiBjYW4gYmUgcmVtb3ZlZC4KKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHN0cmVhbSBtZXRhZGF0YSBwcmVzZW50ZWQgaW4gdGhlIG91dHB1dCBjYW4gYmUKKyAgICAgKiByZW1vdmVkLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyZWFtIG1ldGFkYXRhIHByZXNlbnRlZCBpbiB0aGUgb3V0cHV0Ci0gICAgICogY2FuIGJlIHJlbW92ZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN0cmVhbSBtZXRhZGF0YSBwcmVzZW50ZWQgaW4gdGhlIG91dHB1dCBjYW4gYmUKKyAgICAgKiAgICAgICAgIHJlbW92ZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY2FuUmVwbGFjZVN0cmVhbU1ldGFkYXRhKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIGNoZWNrT3V0cHV0UmV0dXJuRmFsc2UoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdyaXRpbmcgb2YgYSBjb21wbGV0ZSBpbWFnZSBzdHJlYW0gd2hpY2gKLSAgICAgKiBjb250YWlucyBhIHNpbmdsZSBpbWFnZSBpcyBzdXBwb3J0ZWQgd2l0aCB1bmRlZmluZWQgcGl4ZWwgCi0gICAgICogdmFsdWVzIGFuZCBhc3NvY2lhdGVkIG1ldGFkYXRhIGFuZCB0aHVtYm5haWxzIHRvIHRoZSBvdXRwdXQuIAorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgd3JpdGluZyBvZiBhIGNvbXBsZXRlIGltYWdlIHN0cmVhbSB3aGljaCBjb250YWlucyBhCisgICAgICogc2luZ2xlIGltYWdlIGlzIHN1cHBvcnRlZCB3aXRoIHVuZGVmaW5lZCBwaXhlbCB2YWx1ZXMgYW5kIGFzc29jaWF0ZWQKKyAgICAgKiBtZXRhZGF0YSBhbmQgdGh1bWJuYWlscyB0byB0aGUgb3V0cHV0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgd3JpdGluZyBvZiBhIGNvbXBsZXRlIGltYWdlIHN0cmVhbSB3aGljaAotICAgICAqIGNvbnRhaW5zIGEgc2luZ2xlIGltYWdlIGlzIHN1cHBvcnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgd3JpdGluZyBvZiBhIGNvbXBsZXRlIGltYWdlIHN0cmVhbSB3aGljaCBjb250YWlucyBhCisgICAgICogICAgICAgICBzaW5nbGUgaW1hZ2UgaXMgc3VwcG9ydGVkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNhbldyaXRlRW1wdHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICByZXR1cm4gY2hlY2tPdXRwdXRSZXR1cm5GYWxzZSgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWV0aG9kcyB3aGljaCB0YWtlbiBhbiBJSU9JbWFnZVBhcmFtZXRlciAKLSAgICAgKiBjYW4gZGVhbCB3aXRoIGEgUmFzdGVyIHNvdXJjZSBpbWFnZS4KKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG1ldGhvZHMgd2hpY2ggdGFrZW4gYW4gSUlPSW1hZ2VQYXJhbWV0ZXIgY2FuIGRlYWwKKyAgICAgKiB3aXRoIGEgUmFzdGVyIHNvdXJjZSBpbWFnZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1ldGhvZHMgd2hpY2ggdGFrZW4gYW4gSUlPSW1hZ2VQYXJhbWV0ZXIgCi0gICAgICogY2FuIGRlYWwgd2l0aCBhIFJhc3RlciBzb3VyY2UgaW1hZ2UsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1ldGhvZHMgd2hpY2ggdGFrZW4gYW4gSUlPSW1hZ2VQYXJhbWV0ZXIgY2FuIGRlYWwKKyAgICAgKiAgICAgICAgIHdpdGggYSBSYXN0ZXIgc291cmNlIGltYWdlLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY2FuV3JpdGVSYXN0ZXJzKCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3cml0ZXIgY2FuIGFkZCBhbiBpbWFnZSB0byBzdHJlYW0gdGhhdAotICAgICAqIGFscmVhZHkgY29udGFpbnMgaGVhZGVyIGluZm9ybWF0aW9uLgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgd3JpdGVyIGNhbiBhZGQgYW4gaW1hZ2UgdG8gc3RyZWFtIHRoYXQgYWxyZWFkeQorICAgICAqIGNvbnRhaW5zIGhlYWRlciBpbmZvcm1hdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGlmIHRoZSB3cml0ZXIgY2FuIGFkZCBhbiBpbWFnZSB0byBzdHJlYW0gdGhhdAotICAgICAqIGFscmVhZHkgY29udGFpbnMgaGVhZGVyIGluZm9ybWF0aW9uLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiBpZiB0aGUgd3JpdGVyIGNhbiBhZGQgYW4gaW1hZ2UgdG8gc3RyZWFtIHRoYXQgYWxyZWFkeSBjb250YWlucworICAgICAqICAgICAgICAgaGVhZGVyIGluZm9ybWF0aW9uLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY2FuV3JpdGVTZXF1ZW5jZSgpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNTExLDE2ICs1MzYsMTggQEAKICAgICAvKioKICAgICAgKiBFbmRzIHRoZSBpbnNlcnRpb24gb2YgYSBuZXcgaW1hZ2UuCiAgICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGVuZEluc2VydEVtcHR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgdW5zdXBwb3J0ZWRPcGVyYXRpb24oKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBFbmRzIHRoZSByZXBhbGNlIHBpeGVscyBvcGVyYXRpb24uCisgICAgICogRW5kcyB0aGUgcmVwbGFjZSBwaXhlbHMgb3BlcmF0aW9uLgogICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBlbmRSZXBsYWNlUGl4ZWxzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgdW5zdXBwb3J0ZWRPcGVyYXRpb24oKTsKQEAgLTUyOSw3ICs1NTYsOCBAQAogICAgIC8qKgogICAgICAqIEVuZHMgYW4gZW1wdHkgd3JpdGUgb3BlcmF0aW9uLgogICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBlbmRXcml0ZUVtcHR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgdW5zdXBwb3J0ZWRPcGVyYXRpb24oKTsKQEAgLTUzOCw3ICs1NjYsOCBAQAogICAgIC8qKgogICAgICAqIEVuZHMgdGhlIHNlcXVlbmNlIG9mIHdyaXRlIG9wZXJhdGlvbnMuCiAgICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGVuZFdyaXRlU2VxdWVuY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB1bnN1cHBvcnRlZE9wZXJhdGlvbigpOwpAQCAtNTU4LDI1ICs1ODcsMjQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIElJT01ldGFkYXRhIG9iamVjdCB0aGF0IGNvbnRhaW5zIGRlZmF1bHQgdmFsdWVzIAotICAgICAqIGZvciBlbmNvZGluZyBhbiBpbWFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgdHlwZS4gCisgICAgICogR2V0cyBhbiBJSU9NZXRhZGF0YSBvYmplY3QgdGhhdCBjb250YWlucyBkZWZhdWx0IHZhbHVlcyBmb3IgZW5jb2RpbmcgYW4KKyAgICAgKiBpbWFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgdHlwZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1hZ2VUeXBlIHRoZSBJbWFnZVR5cGVTcGVjaWZpZXIuCi0gICAgICogQHBhcmFtIHBhcmFtIHRoZSBJbWFnZVdyaXRlUGFyYW0uCi0gICAgICogCisgICAgICogQHBhcmFtIGltYWdlVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlVHlwZVNwZWNpZmllci4KKyAgICAgKiBAcGFyYW0gcGFyYW0KKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVdyaXRlUGFyYW0uCiAgICAgICogQHJldHVybiB0aGUgSUlPTWV0YWRhdGEgb2JqZWN0LgogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBJSU9NZXRhZGF0YSBnZXREZWZhdWx0SW1hZ2VNZXRhZGF0YSgKLSAgICAgICAgICAgIEltYWdlVHlwZVNwZWNpZmllciBpbWFnZVR5cGUsCi0gICAgICAgICAgICBJbWFnZVdyaXRlUGFyYW0gcGFyYW0KLSAgICApOworICAgIHB1YmxpYyBhYnN0cmFjdCBJSU9NZXRhZGF0YSBnZXREZWZhdWx0SW1hZ2VNZXRhZGF0YShJbWFnZVR5cGVTcGVjaWZpZXIgaW1hZ2VUeXBlLAorICAgICAgICAgICAgSW1hZ2VXcml0ZVBhcmFtIHBhcmFtKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgYW4gSUlPTWV0YWRhdGEgb2JqZWN0IHRoYXQgY29udGFpbnMgZGVmYXVsdCB2YWx1ZXMgCi0gICAgICogZm9yIGVuY29kaW5nIGEgc3RyZWFtIG9mIGltYWdlcy4KKyAgICAgKiBHZXRzIGFuIElJT01ldGFkYXRhIG9iamVjdCB0aGF0IGNvbnRhaW5zIGRlZmF1bHQgdmFsdWVzIGZvciBlbmNvZGluZyBhCisgICAgICogc3RyZWFtIG9mIGltYWdlcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyYW0gdGhlIEltYWdlV3JpdGVQYXJhbS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGFyYW0KKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVdyaXRlUGFyYW0uCiAgICAgICogQHJldHVybiB0aGUgSUlPTWV0YWRhdGEgb2JqZWN0LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBJSU9NZXRhZGF0YSBnZXREZWZhdWx0U3RyZWFtTWV0YWRhdGEoSW1hZ2VXcml0ZVBhcmFtIHBhcmFtKTsKQEAgLTU5MSw5ICs2MTksOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGRlZmF1bHQgd3JpdGUgcGFyYW0uCi0gICAgICogR2V0cyBhIG5ldyBJbWFnZVdyaXRlUGFyYW0gb2JqZWN0IGZvciB0aGlzIEltYWdlV3JpdGVyIHdpdGggdGhlCi0gICAgICogY3VycmVudCBMb2NhbGUuCisgICAgICogR2V0cyB0aGUgZGVmYXVsdCB3cml0ZSBwYXJhbS4gR2V0cyBhIG5ldyBJbWFnZVdyaXRlUGFyYW0gb2JqZWN0IGZvciB0aGlzCisgICAgICogSW1hZ2VXcml0ZXIgd2l0aCB0aGUgY3VycmVudCBMb2NhbGUuCiAgICAgICogCiAgICAgICogQHJldHVybiBhIG5ldyBJbWFnZVdyaXRlUGFyYW0gb2JqZWN0IGZvciB0aGlzIEltYWdlV3JpdGVyLgogICAgICAqLwpAQCAtNjAyLDEyNCArNjI5LDEzMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIG51bWJlciBvZiB0aHVtYm5haWxzIHN1cG9ydGVkIGJ5IHRoZSBmb3JtYXQgCi0gICAgICogYmVpbmcgd3JpdHRlbiB3aXRoIHN1cHBvcnRlZCBpbWFnZSB0eXBlLCBpbWFnZSB3cml0ZSAKLSAgICAgKiBwYXJhbWV0ZXJzLCBzdHJlYW0sIGFuZCBpbWFnZSBtZXRhZGF0YSBvYmplY3RzLgorICAgICAqIEdldHMgdGhlIG51bWJlciBvZiB0aHVtYm5haWxzIHN1cHBvcnRlZCBieSB0aGUgZm9ybWF0IGJlaW5nIHdyaXR0ZW4gd2l0aAorICAgICAqIHN1cHBvcnRlZCBpbWFnZSB0eXBlLCBpbWFnZSB3cml0ZSBwYXJhbWV0ZXJzLCBzdHJlYW0sIGFuZCBpbWFnZSBtZXRhZGF0YQorICAgICAqIG9iamVjdHMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGltYWdlVHlwZSB0aGUgSW1hZ2VUeXBlU3BlY2lmaWVyLgotICAgICAqIEBwYXJhbSBwYXJhbSB0aGUgaW1hZ2UncyBwYXJhbWV0ZXJzLgotICAgICAqIEBwYXJhbSBzdHJlYW1NZXRhZGF0YSB0aGUgc3RyZWFtIG1ldGFkYXRhLgotICAgICAqIEBwYXJhbSBpbWFnZU1ldGFkYXRhIHRoZSBpbWFnZSBtZXRhZGF0YS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgdGh1bWJuYWlscyBzdXBwb3J0ZWQKKyAgICAgKiBAcGFyYW0gaW1hZ2VUeXBlCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VUeXBlU3BlY2lmaWVyLgorICAgICAqIEBwYXJhbSBwYXJhbQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlJ3MgcGFyYW1ldGVycy4KKyAgICAgKiBAcGFyYW0gc3RyZWFtTWV0YWRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJlYW0gbWV0YWRhdGEuCisgICAgICogQHBhcmFtIGltYWdlTWV0YWRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBtZXRhZGF0YS4KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgdGh1bWJuYWlscyBzdXBwb3J0ZWQuCiAgICAgICovCi0gICAgcHVibGljIGludCBnZXROdW1UaHVtYm5haWxzU3VwcG9ydGVkKAotICAgICAgICAgICAgSW1hZ2VUeXBlU3BlY2lmaWVyIGltYWdlVHlwZSwKLSAgICAgICAgICAgIEltYWdlV3JpdGVQYXJhbSBwYXJhbSwKLSAgICAgICAgICAgIElJT01ldGFkYXRhIHN0cmVhbU1ldGFkYXRhLAotICAgICAgICAgICAgSUlPTWV0YWRhdGEgaW1hZ2VNZXRhZGF0YQotICAgICkgeworICAgIHB1YmxpYyBpbnQgZ2V0TnVtVGh1bWJuYWlsc1N1cHBvcnRlZChJbWFnZVR5cGVTcGVjaWZpZXIgaW1hZ2VUeXBlLCBJbWFnZVdyaXRlUGFyYW0gcGFyYW0sCisgICAgICAgICAgICBJSU9NZXRhZGF0YSBzdHJlYW1NZXRhZGF0YSwgSUlPTWV0YWRhdGEgaW1hZ2VNZXRhZGF0YSkgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwcmVmZXJyZWQgdGh1bWJuYWlsIHNpemVzLgotICAgICAqIEdldHMgYW4gYXJyYXkgb2YgRGltZW5zaW9ucyB3aXRoIHRoZSBzaXplcyBmb3IgdGh1bWJuYWlsIGltYWdlcyAKLSAgICAgKiBhcyB0aGV5IGFyZSBlbmNvZGVkIGluIHRoZSBvdXRwdXQgZmlsZSBvciBzdHJlYW0uIAorICAgICAqIEdldHMgdGhlIHByZWZlcnJlZCB0aHVtYm5haWwgc2l6ZXMuIEdldHMgYW4gYXJyYXkgb2YgRGltZW5zaW9ucyB3aXRoIHRoZQorICAgICAqIHNpemVzIGZvciB0aHVtYm5haWwgaW1hZ2VzIGFzIHRoZXkgYXJlIGVuY29kZWQgaW4gdGhlIG91dHB1dCBmaWxlIG9yCisgICAgICogc3RyZWFtLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZVR5cGUgdGhlIEltYWdlVHlwZVNwZWNpZmllci4KLSAgICAgKiBAcGFyYW0gcGFyYW0gdGhlIEltYWdlV3JpdGVQYXJhbS4KLSAgICAgKiBAcGFyYW0gc3RyZWFtTWV0YWRhdGEgdGhlIHN0cmVhbSBtZXRhZGF0YS4KLSAgICAgKiBAcGFyYW0gaW1hZ2VNZXRhZGF0YSB0aGUgaW1hZ2UgbWV0YWRhdGEuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJlZmVycmVkIHRodW1ibmFpbCBzaXplcworICAgICAqIEBwYXJhbSBpbWFnZVR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVR5cGVTcGVjaWZpZXIuCisgICAgICogQHBhcmFtIHBhcmFtCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VXcml0ZVBhcmFtLgorICAgICAqIEBwYXJhbSBzdHJlYW1NZXRhZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIHN0cmVhbSBtZXRhZGF0YS4KKyAgICAgKiBAcGFyYW0gaW1hZ2VNZXRhZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIG1ldGFkYXRhLgorICAgICAqIEByZXR1cm4gdGhlIHByZWZlcnJlZCB0aHVtYm5haWwgc2l6ZXMuCiAgICAgICovCi0gICAgcHVibGljIERpbWVuc2lvbltdIGdldFByZWZlcnJlZFRodW1ibmFpbFNpemVzKAotICAgICAgICAgICAgSW1hZ2VUeXBlU3BlY2lmaWVyIGltYWdlVHlwZSwKLSAgICAgICAgICAgIEltYWdlV3JpdGVQYXJhbSBwYXJhbSwKLSAgICAgICAgICAgIElJT01ldGFkYXRhIHN0cmVhbU1ldGFkYXRhLAotICAgICAgICAgICAgSUlPTWV0YWRhdGEgaW1hZ2VNZXRhZGF0YQotICAgICkgeworICAgIHB1YmxpYyBEaW1lbnNpb25bXSBnZXRQcmVmZXJyZWRUaHVtYm5haWxTaXplcyhJbWFnZVR5cGVTcGVjaWZpZXIgaW1hZ2VUeXBlLAorICAgICAgICAgICAgSW1hZ2VXcml0ZVBhcmFtIHBhcmFtLCBJSU9NZXRhZGF0YSBzdHJlYW1NZXRhZGF0YSwgSUlPTWV0YWRhdGEgaW1hZ2VNZXRhZGF0YSkgewogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcmVwYXJlcyBpbnNlcnRpb24gb2YgYW4gZW1wdHkgaW1hZ2UgYnkgcmVxdWVzdGluZyB0aGUgaW5zZXJ0aW9uIG9mIAotICAgICAqIGEgbmV3IGltYWdlIGludG8gYW4gZXhpc3RpbmcgaW1hZ2Ugc3RyZWFtLgorICAgICAqIFByZXBhcmVzIGluc2VydGlvbiBvZiBhbiBlbXB0eSBpbWFnZSBieSByZXF1ZXN0aW5nIHRoZSBpbnNlcnRpb24gb2YgYSBuZXcKKyAgICAgKiBpbWFnZSBpbnRvIGFuIGV4aXN0aW5nIGltYWdlIHN0cmVhbS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleCB0aGUgaW1hZ2UgaW5kZXguCi0gICAgICogQHBhcmFtIGltYWdlVHlwZSB0aGUgaW1hZ2UgdHlwZS4KLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSBpbWFnZS4KLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlLgotICAgICAqIEBwYXJhbSBpbWFnZU1ldGFkYXRhIHRoZSBpbWFnZSBtZXRhZGF0YSwgb3IgbnVsbC4KLSAgICAgKiBAcGFyYW0gdGh1bWJuYWlscyB0aGUgYXJyYXkgdGh1bWJuYWlscyBmb3IgdGhpcyBpbWFnZSwgb3IgbnVsbC4KLSAgICAgKiBAcGFyYW0gcGFyYW0gdGhlIEltYWdlV3JpdGVQYXJhbSwgb3IgbnVsbC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGluZGV4LgorICAgICAqIEBwYXJhbSBpbWFnZVR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSB0eXBlLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZS4KKyAgICAgKiBAcGFyYW0gaW1hZ2VNZXRhZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIG1ldGFkYXRhLCBvciBudWxsLgorICAgICAqIEBwYXJhbSB0aHVtYm5haWxzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgdGh1bWJuYWlscyBmb3IgdGhpcyBpbWFnZSwgb3IgbnVsbC4KKyAgICAgKiBAcGFyYW0gcGFyYW0KKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVdyaXRlUGFyYW0sIG9yIG51bGwuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByZXBhcmVJbnNlcnRFbXB0eSgKLSAgICAgICAgICAgIGludCBpbWFnZUluZGV4LCBJbWFnZVR5cGVTcGVjaWZpZXIgaW1hZ2VUeXBlLAotICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgSUlPTWV0YWRhdGEgaW1hZ2VNZXRhZGF0YSwgTGlzdDw/IGV4dGVuZHMgQnVmZmVyZWRJbWFnZT4gdGh1bWJuYWlscywKLSAgICAgICAgICAgIEltYWdlV3JpdGVQYXJhbSBwYXJhbQotICAgICkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCBwcmVwYXJlSW5zZXJ0RW1wdHkoaW50IGltYWdlSW5kZXgsIEltYWdlVHlwZVNwZWNpZmllciBpbWFnZVR5cGUsIGludCB3aWR0aCwKKyAgICAgICAgICAgIGludCBoZWlnaHQsIElJT01ldGFkYXRhIGltYWdlTWV0YWRhdGEsIExpc3Q8PyBleHRlbmRzIEJ1ZmZlcmVkSW1hZ2U+IHRodW1ibmFpbHMsCisgICAgICAgICAgICBJbWFnZVdyaXRlUGFyYW0gcGFyYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHVuc3VwcG9ydGVkT3BlcmF0aW9uKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJlcGFyZXMgdGhlIHdyaXRlciB0byBjYWxsIHRoZSByZXBsYWNlUGl4ZWxzIG1ldGhvZCBmb3IgdGhlCi0gICAgICogc3BlY2lmaWVkIHJlZ2lvbi4gCisgICAgICogUHJlcGFyZXMgdGhlIHdyaXRlciB0byBjYWxsIHRoZSByZXBsYWNlUGl4ZWxzIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZAorICAgICAqIHJlZ2lvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleCB0aGUgaW1hZ2UncyBpbmRleC4KLSAgICAgKiBAcGFyYW0gcmVnaW9uIHRoZSBzcGVjaWZpZWQgcmVnaW9uLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBpbWFnZUluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UncyBpbmRleC4KKyAgICAgKiBAcGFyYW0gcmVnaW9uCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHJlZ2lvbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcHJlcGFyZVJlcGxhY2VQaXhlbHMoaW50IGltYWdlSW5kZXgsIFJlY3RhbmdsZSByZWdpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHVuc3VwcG9ydGVkT3BlcmF0aW9uKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJlcGFyZXMgdGhlIHdyaXRlciBmb3Igd3JpdGluZyBhbiBlbXB0eSBpbWFnZSBieSBiZWdpbm5pbmcgdGhlIAotICAgICAqIHByb2Nlc3Mgb2Ygd3JpdGluZyBhIGNvbXBsZXRlIGltYWdlIHN0cmVhbSB0aGF0IGNvbnRhaW5zIGEgc2luZ2xlIGltYWdlIAotICAgICAqIHdpdGggdW5kZWZpbmVkIHBpeGVsIHZhbHVlcywgbWV0YWRhdGEgYW5kIHRodW1ibmFpbHMsIAotICAgICAqIHRvIHRoZSBvdXRwdXQuIAorICAgICAqIFByZXBhcmVzIHRoZSB3cml0ZXIgZm9yIHdyaXRpbmcgYW4gZW1wdHkgaW1hZ2UgYnkgYmVnaW5uaW5nIHRoZSBwcm9jZXNzCisgICAgICogb2Ygd3JpdGluZyBhIGNvbXBsZXRlIGltYWdlIHN0cmVhbSB0aGF0IGNvbnRhaW5zIGEgc2luZ2xlIGltYWdlIHdpdGgKKyAgICAgKiB1bmRlZmluZWQgcGl4ZWwgdmFsdWVzLCBtZXRhZGF0YSBhbmQgdGh1bWJuYWlscywgdG8gdGhlIG91dHB1dC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RyZWFtTWV0YWRhdGEgdGhlIHN0cmVhbSBtZXRhZGF0YS4KLSAgICAgKiBAcGFyYW0gaW1hZ2VUeXBlIHRoZSBpbWFnZSB0eXBlLgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIGltYWdlLgotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UuCi0gICAgICogQHBhcmFtIGltYWdlTWV0YWRhdGEgdGhlIGltYWdlJ3MgbWV0YWRhdGEsIG9yIG51bGwuCi0gICAgICogQHBhcmFtIHRodW1ibmFpbHMgdGhlIGltYWdlJ3MgdGh1bWJuYWlscywgb3IgbnVsbC4KLSAgICAgKiBAcGFyYW0gcGFyYW0gdGhlIGltYWdlJ3MgcGFyYW1ldGVycywgb3IgbnVsbC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gc3RyZWFtTWV0YWRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJlYW0gbWV0YWRhdGEuCisgICAgICogQHBhcmFtIGltYWdlVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIHR5cGUuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGltYWdlLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlLgorICAgICAqIEBwYXJhbSBpbWFnZU1ldGFkYXRhCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UncyBtZXRhZGF0YSwgb3IgbnVsbC4KKyAgICAgKiBAcGFyYW0gdGh1bWJuYWlscworICAgICAqICAgICAgICAgICAgdGhlIGltYWdlJ3MgdGh1bWJuYWlscywgb3IgbnVsbC4KKyAgICAgKiBAcGFyYW0gcGFyYW0KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSdzIHBhcmFtZXRlcnMsIG9yIG51bGwuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByZXBhcmVXcml0ZUVtcHR5KAotICAgICAgICAgICAgSUlPTWV0YWRhdGEgc3RyZWFtTWV0YWRhdGEsIEltYWdlVHlwZVNwZWNpZmllciBpbWFnZVR5cGUsCi0gICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICBJSU9NZXRhZGF0YSBpbWFnZU1ldGFkYXRhLCBMaXN0PD8gZXh0ZW5kcyBCdWZmZXJlZEltYWdlPiB0aHVtYm5haWxzLAotICAgICAgICAgICAgSW1hZ2VXcml0ZVBhcmFtIHBhcmFtCi0gICAgKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHByZXBhcmVXcml0ZUVtcHR5KElJT01ldGFkYXRhIHN0cmVhbU1ldGFkYXRhLCBJbWFnZVR5cGVTcGVjaWZpZXIgaW1hZ2VUeXBlLAorICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBJSU9NZXRhZGF0YSBpbWFnZU1ldGFkYXRhLAorICAgICAgICAgICAgTGlzdDw/IGV4dGVuZHMgQnVmZmVyZWRJbWFnZT4gdGh1bWJuYWlscywgSW1hZ2VXcml0ZVBhcmFtIHBhcmFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB1bnN1cHBvcnRlZE9wZXJhdGlvbigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByZXBhcmVzIGEgc3RyZWFtIHRvIGFjY2VwdCBjYWxscyBvZiB3cml0ZVRvU2VxdWVuY2UgbWV0aG9kIAotICAgICAqIHVzaW5nIHRoZSBtZXRhZGF0YSBvYmplY3QuIAorICAgICAqIFByZXBhcmVzIGEgc3RyZWFtIHRvIGFjY2VwdCBjYWxscyBvZiB3cml0ZVRvU2VxdWVuY2UgbWV0aG9kIHVzaW5nIHRoZQorICAgICAqIG1ldGFkYXRhIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RyZWFtTWV0YWRhdGEgdGhlIHN0cmVhbSBtZXRhZGF0YS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gc3RyZWFtTWV0YWRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJlYW0gbWV0YWRhdGEuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHByZXBhcmVXcml0ZVNlcXVlbmNlKElJT01ldGFkYXRhIHN0cmVhbU1ldGFkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB1bnN1cHBvcnRlZE9wZXJhdGlvbigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyB0aGUgY29tcGxldGlvbiBvZiBhIHRodW1ibmFpbCByZWFkIAotICAgICAqIGJ5IGNhbGxpbmcgdGhlaXIgdGh1bWJuYWlsQ29tcGxldGUgbWV0aG9kIAotICAgICAqIG9mIHJlZ2lzdGVyZWQgSUlPV3JpdGVQcm9ncmVzc0xpc3RlbmVycy4gCisgICAgICogUHJvY2Vzc2VzIHRoZSBjb21wbGV0aW9uIG9mIGEgdGh1bWJuYWlsIHJlYWQgYnkgY2FsbGluZyB0aGVpcgorICAgICAqIHRodW1ibmFpbENvbXBsZXRlIG1ldGhvZCBvZiByZWdpc3RlcmVkIElJT1dyaXRlUHJvZ3Jlc3NMaXN0ZW5lcnMuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1RodW1ibmFpbENvbXBsZXRlKCkgewogICAgICAgICBpZiAocHJvZ3Jlc3NMaXN0ZW5lcnMgIT0gbnVsbCkgewpAQCAtNzMwLDExICs3NjQsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgdGhlIGN1cnJlbnQgcGVyY2VudGFnZSBvZiB0aHVtYm5haWwgY29tcGxldGlvbiAKLSAgICAgKiBieSBjYWxsaW5nIHRoZWlyIHRodW1ibmFpbFByb2dyZXNzIG1ldGhvZCBvZiByZWdpc3RlcmVkIAotICAgICAqIElJT1dyaXRlUHJvZ3Jlc3NMaXN0ZW5lcnMuCisgICAgICogUHJvY2Vzc2VzIHRoZSBjdXJyZW50IHBlcmNlbnRhZ2Ugb2YgdGh1bWJuYWlsIGNvbXBsZXRpb24gYnkgY2FsbGluZyB0aGVpcgorICAgICAqIHRodW1ibmFpbFByb2dyZXNzIG1ldGhvZCBvZiByZWdpc3RlcmVkIElJT1dyaXRlUHJvZ3Jlc3NMaXN0ZW5lcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHBlcmNlbnRhZ2VEb25lIHRoZSBwZXJjZW50YWdlIGRvbmUuCisgICAgICogQHBhcmFtIHBlcmNlbnRhZ2VEb25lCisgICAgICogICAgICAgICAgICB0aGUgcGVyY2VudGFnZSBkb25lLgogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NUaHVtYm5haWxQcm9ncmVzcyhmbG9hdCBwZXJjZW50YWdlRG9uZSkgewogICAgICAgICBpZiAocHJvZ3Jlc3NMaXN0ZW5lcnMgIT0gbnVsbCkgewpAQCAtNzQ1LDExICs3NzksMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgdGhlIHN0YXJ0IG9mIGEgdGh1bWJuYWlsIHJlYWQgYnkgY2FsbGluZyAKLSAgICAgKiB0aHVtYm5haWxTdGFydGVkIG1ldGhvZCBvZiByZWdpc3RlcmVkIElJT1dyaXRlUHJvZ3Jlc3NMaXN0ZW5lcnMuIAorICAgICAqIFByb2Nlc3NlcyB0aGUgc3RhcnQgb2YgYSB0aHVtYm5haWwgcmVhZCBieSBjYWxsaW5nIHRodW1ibmFpbFN0YXJ0ZWQKKyAgICAgKiBtZXRob2Qgb2YgcmVnaXN0ZXJlZCBJSU9Xcml0ZVByb2dyZXNzTGlzdGVuZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZUluZGV4IHRoZSBpbWFnZSBpbmRleC4KLSAgICAgKiBAcGFyYW0gdGh1bWJuYWlsSW5kZXggdGhlIHRodW1ibmFpbCBpbmRleC4KKyAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGluZGV4LgorICAgICAqIEBwYXJhbSB0aHVtYm5haWxJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIHRodW1ibmFpbCBpbmRleC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVGh1bWJuYWlsU3RhcnRlZChpbnQgaW1hZ2VJbmRleCwgaW50IHRodW1ibmFpbEluZGV4KSB7CiAgICAgICAgIGlmIChwcm9ncmVzc0xpc3RlbmVycyAhPSBudWxsKSB7CkBAIC03NjAsNyArNzk2LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgdGhhdCB0aGUgd3JpdGluZyBoYXMgYmVlbiBhYm9ydGVkIGJ5IGNhbGxpbmcgd3JpdGVBYm9ydGVkIAorICAgICAqIFByb2Nlc3NlcyB0aGF0IHRoZSB3cml0aW5nIGhhcyBiZWVuIGFib3J0ZWQgYnkgY2FsbGluZyB3cml0ZUFib3J0ZWQKICAgICAgKiBtZXRob2Qgb2YgcmVnaXN0ZXJlZCBJSU9Xcml0ZVByb2dyZXNzTGlzdGVuZXJzLgogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NXcml0ZUFib3J0ZWQoKSB7CkBAIC03ODksOCArODI1LDggQEAKICAgICAvKioKICAgICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgSUlPV3JpdGVQcm9ncmVzc0xpc3RlbmVyIGxpc3RlbmVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgcmVnaXN0ZXJlZCBJSU9Xcml0ZVByb2dyZXNzTGlzdGVuZXIgCi0gICAgICogdG8gYmUgcmVtb3ZlZC4KKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSByZWdpc3RlcmVkIElJT1dyaXRlUHJvZ3Jlc3NMaXN0ZW5lciB0byBiZSByZW1vdmVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlbW92ZUlJT1dyaXRlUHJvZ3Jlc3NMaXN0ZW5lcihJSU9Xcml0ZVByb2dyZXNzTGlzdGVuZXIgbGlzdGVuZXIpIHsKICAgICAgICAgaWYgKHByb2dyZXNzTGlzdGVuZXJzICE9IG51bGwgJiYgbGlzdGVuZXIgIT0gbnVsbCkgewpAQCAtODAzLDggKzgzOSw4IEBACiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIElJT1dyaXRlV2FybmluZ0xpc3RlbmVyIGxpc3RlbmVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgcmVnaXN0ZXJlZCBJSU9Xcml0ZVdhcm5pbmdMaXN0ZW5lciBsaXN0ZW5lcgotICAgICAqIHRvIGJlIHJlbW92ZWQuCisgICAgICogQHBhcmFtIGxpc3RlbmVyCisgICAgICogICAgICAgICAgICB0aGUgcmVnaXN0ZXJlZCBJSU9Xcml0ZVdhcm5pbmdMaXN0ZW5lciBsaXN0ZW5lciB0byBiZSByZW1vdmVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlbW92ZUlJT1dyaXRlV2FybmluZ0xpc3RlbmVyKElJT1dyaXRlV2FybmluZ0xpc3RlbmVyIGxpc3RlbmVyKSB7CiAgICAgICAgIGlmICh3YXJuaW5nTGlzdGVuZXJzID09IG51bGwgfHwgbGlzdGVuZXIgPT0gbnVsbCkgewpAQCAtODI2LDkgKzg2MiwxMCBAQAogICAgIC8qKgogICAgICAqIFJlbW92ZXMgdGhlIGltYWdlIHdpdGggdGhlIHNwZWNpZmllZCBpbmRleCBmcm9tIHRoZSBzdHJlYW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIGltYWdlSW5kZXggdGhlIGltYWdlJ3MgaW5kZXguCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIGltYWdlSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSdzIGluZGV4LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZW1vdmVJbWFnZShpbnQgaW1hZ2VJbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgdW5zdXBwb3J0ZWRPcGVyYXRpb24oKTsKQEAgLTgzNywzNiArODc0LDQyIEBACiAgICAgLyoqCiAgICAgICogUmVwbGFjZXMgaW1hZ2UgbWV0YWRhdGEgb2YgdGhlIGltYWdlIHdpdGggc3BlY2lmaWVkIGluZGV4LgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZUluZGV4IHRoZSBpbWFnZSdzIGluZGV4LgotICAgICAqIEBwYXJhbSBpbWFnZU1ldGFkYXRhIHRoZSBpbWFnZSBtZXRhZGF0YS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlJ3MgaW5kZXguCisgICAgICogQHBhcmFtIGltYWdlTWV0YWRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBtZXRhZGF0YS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVwbGFjZUltYWdlTWV0YWRhdGEoaW50IGltYWdlSW5kZXgsIElJT01ldGFkYXRhIGltYWdlTWV0YWRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHVuc3VwcG9ydGVkT3BlcmF0aW9uKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVwbGFjZXMgYSBwYXJ0IG9mIGFuIGltYWdlIHByZXNlbnRlZCBpbiB0aGUgb3V0cHV0Ci0gICAgICogd2l0aCB0aGUgc3BlY2lmaWVkIFJlbmRlcmVkSW1hZ2UuCisgICAgICogUmVwbGFjZXMgYSBwYXJ0IG9mIGFuIGltYWdlIHByZXNlbnRlZCBpbiB0aGUgb3V0cHV0IHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIFJlbmRlcmVkSW1hZ2UuCiAgICAgICogCi0gICAgICogQHBhcmFtIGltYWdlIHRoZSBSZW5kZXJlZEltYWdlLgotICAgICAqIEBwYXJhbSBwYXJhbSB0aGUgSW1hZ2VXcml0ZVBhcmFtLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBpbWFnZQorICAgICAqICAgICAgICAgICAgdGhlIFJlbmRlcmVkSW1hZ2UuCisgICAgICogQHBhcmFtIHBhcmFtCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VXcml0ZVBhcmFtLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZXBsYWNlUGl4ZWxzKFJlbmRlcmVkSW1hZ2UgaW1hZ2UsIEltYWdlV3JpdGVQYXJhbSBwYXJhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgdW5zdXBwb3J0ZWRPcGVyYXRpb24oKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXBsYWNlcyBhIHBhcnQgb2YgYW4gaW1hZ2UgcHJlc2VudGVkIGluIHRoZSBvdXRwdXQKLSAgICAgKiB3aXRoIHRoZSBzcGVjaWZpZWQgUmFzdGVyLgorICAgICAqIFJlcGxhY2VzIGEgcGFydCBvZiBhbiBpbWFnZSBwcmVzZW50ZWQgaW4gdGhlIG91dHB1dCB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBSYXN0ZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHJhc3RlciB0aGUgUmFzdGVyLgotICAgICAqIEBwYXJhbSBwYXJhbSB0aGUgSW1hZ2VXcml0ZVBhcmFtLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSByYXN0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBSYXN0ZXIuCisgICAgICogQHBhcmFtIHBhcmFtCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VXcml0ZVBhcmFtLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZXBsYWNlUGl4ZWxzKFJhc3RlciByYXN0ZXIsIEltYWdlV3JpdGVQYXJhbSBwYXJhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgdW5zdXBwb3J0ZWRPcGVyYXRpb24oKTsKQEAgLTg3NSw5ICs5MTgsMTAgQEAKICAgICAvKioKICAgICAgKiBSZXBsYWNlcyB0aGUgc3RyZWFtIG1ldGFkYXRhIG9mIHRoZSBvdXRwdXQgd2l0aCBuZXcgSUlPTWV0YWRhdGEuCiAgICAgICogCi0gICAgICogQHBhcmFtIHN0cmVhbU1ldGFkYXRhIHRoZSBuZXcgc3RyZWFtIG1ldGFkYXRhLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBzdHJlYW1NZXRhZGF0YQorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBzdHJlYW0gbWV0YWRhdGEuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VTdHJlYW1NZXRhZGF0YShJSU9NZXRhZGF0YSBzdHJlYW1NZXRhZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgdW5zdXBwb3J0ZWRPcGVyYXRpb24oKTsKQEAgLTg4Niw3ICs5MzAsOCBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGxvY2FsZSBvZiB0aGlzIEltYWdlV3JpdGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBsb2NhbGUgdGhlIG5ldyBsb2NhbGUuCisgICAgICogQHBhcmFtIGxvY2FsZQorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBsb2NhbGUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TG9jYWxlKExvY2FsZSBsb2NhbGUpIHsKICAgICAgICAgaWYgKGxvY2FsZSA9PSBudWxsKSB7CkBAIC05MjQsMjYgKzk2OSwzMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc2VydHMgaW1hZ2UgaW50byBleGlzdGluZyBvdXRwdXQgc3RyZWFtLiAKKyAgICAgKiBJbnNlcnRzIGltYWdlIGludG8gZXhpc3Rpbmcgb3V0cHV0IHN0cmVhbS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleCB0aGUgaW1hZ2UgaW5kZXggd2hlcmUgYW4gaW1hZ2Ugd2lsbCBiZSB3cml0dGVuLgotICAgICAqIEBwYXJhbSBpbWFnZSB0aGUgc3BlY2lmaWVkIGltYWdlIHRvIGJlIHdyaXR0ZW4uCi0gICAgICogQHBhcmFtIHBhcmFtIHRoZSBJbWFnZVdyaXRlUGFyYW0sIG9yIG51bGwuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIGltYWdlSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSBpbmRleCB3aGVyZSBhbiBpbWFnZSB3aWxsIGJlIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIGltYWdlCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGltYWdlIHRvIGJlIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIHBhcmFtCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VXcml0ZVBhcmFtLCBvciBudWxsLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUluc2VydChpbnQgaW1hZ2VJbmRleCwgSUlPSW1hZ2UgaW1hZ2UsIEltYWdlV3JpdGVQYXJhbSBwYXJhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUluc2VydChpbnQgaW1hZ2VJbmRleCwgSUlPSW1hZ2UgaW1hZ2UsIEltYWdlV3JpdGVQYXJhbSBwYXJhbSkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHVuc3VwcG9ydGVkT3BlcmF0aW9uKCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogV3JpdGVzIHRoZSBzcGVjaWZpZWQgaW1hZ2UgdG8gdGhlIHNlcXVlbmNlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbWFnZSB0aGUgaW1hZ2UgdG8gYmUgd3JpdHRlbi4KLSAgICAgKiBAcGFyYW0gcGFyYW0gdGhlIEltYWdlV3JpdGVQYXJhbSwgb3IgbnVsbC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZCAKLSAgICAgKiBkdXJpbmcgd3JpdHRpbmcuCisgICAgICogQHBhcmFtIGltYWdlCisgICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gcGFyYW0KKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVdyaXRlUGFyYW0sIG9yIG51bGwuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkIGR1cmluZyB3cml0aW5nLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9TZXF1ZW5jZShJSU9JbWFnZSBpbWFnZSwgSW1hZ2VXcml0ZVBhcmFtIHBhcmFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB1bnN1cHBvcnRlZE9wZXJhdGlvbigpOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmF4L2ltYWdlaW8vZXZlbnQvSUlPUmVhZFByb2dyZXNzTGlzdGVuZXIuamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL2V2ZW50L0lJT1JlYWRQcm9ncmVzc0xpc3RlbmVyLmphdmEKaW5kZXggM2Q2NTgwNy4uMjk0NDg5NiAxMDA2NDQKLS0tIGEvYXd0L2phdmF4L2ltYWdlaW8vZXZlbnQvSUlPUmVhZFByb2dyZXNzTGlzdGVuZXIuamF2YQorKysgYi9hd3QvamF2YXgvaW1hZ2Vpby9ldmVudC9JSU9SZWFkUHJvZ3Jlc3NMaXN0ZW5lci5qYXZhCkBAIC0xOCw4NiArMTgsMTA0IEBACiAgKiBAYXV0aG9yIFNlcmdleSBJLiBTYWxpc2hldgogICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjIgJAogICovCisKIHBhY2thZ2UgamF2YXguaW1hZ2Vpby5ldmVudDsKIAogaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwogaW1wb3J0IGphdmF4LmltYWdlaW8uSW1hZ2VSZWFkZXI7CiAKIC8qKgotICogVGhlIElJT1JlYWRQcm9ncmVzc0xpc3RlbmVyIGludGVyZmFjZSBub3RpZmllcyBjYWxsZXJzIAotICogYWJvdXQgdGhlIHByb2dyZXNzIG9mIHRoZSBpbWFnZSBhbmQgdGh1bWJuYWlsIHJlYWRpbmcgbWV0aG9kcy4KKyAqIFRoZSBJSU9SZWFkUHJvZ3Jlc3NMaXN0ZW5lciBpbnRlcmZhY2Ugbm90aWZpZXMgY2FsbGVycyBhYm91dCB0aGUgcHJvZ3Jlc3Mgb2YKKyAqIHRoZSBpbWFnZSBhbmQgdGh1bWJuYWlsIHJlYWRpbmcgbWV0aG9kcy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSUlPUmVhZFByb2dyZXNzTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKIAogICAgIC8qKgotICAgICAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgdGhhdCB0aGUgaW1hZ2UgcmVhZGluZyBoYXMgYmVlbiBjb21wbGV0ZWQuIAorICAgICAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgdGhhdCB0aGUgaW1hZ2UgcmVhZGluZyBoYXMgYmVlbiBjb21wbGV0ZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNvdXJjZSB0aGUgSW1hZ2VSZWFkZXIgb2JqZWN0IHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kLgorICAgICAqIEBwYXJhbSBzb3VyY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVJlYWRlciBvYmplY3Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QuCiAgICAgICovCiAgICAgdm9pZCBpbWFnZUNvbXBsZXRlKEltYWdlUmVhZGVyIHNvdXJjZSk7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBOb3RpZmllcyB0aGlzIGxpc3RlbmVyIGFib3V0IHRoZSBkZWdyZWUgb2YgY29tcGxldGlvbiBvZiB0aGUgcmVhZCBjYWxsLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIEltYWdlUmVhZGVyIG9iamVjdCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZC4KLSAgICAgKiBAcGFyYW0gcGVyY2VudGFnZURvbmUgdGhlIHBlcmNlbnRhZ2Ugb2YgZGVjb2RpbmcgZG9uZS4KKyAgICAgKiBAcGFyYW0gc291cmNlCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VSZWFkZXIgb2JqZWN0IHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kLgorICAgICAqIEBwYXJhbSBwZXJjZW50YWdlRG9uZQorICAgICAqICAgICAgICAgICAgdGhlIHBlcmNlbnRhZ2Ugb2YgZGVjb2RpbmcgZG9uZS4KICAgICAgKi8KICAgICB2b2lkIGltYWdlUHJvZ3Jlc3MoSW1hZ2VSZWFkZXIgc291cmNlLCBmbG9hdCBwZXJjZW50YWdlRG9uZSk7Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBOb3RpZmllcyB0aGlzIGxpc3RlbmVyIHRoYXQgYW4gaW1hZ2UgcmVhZCBvcGVyYXRpb24gaGFzIGJlZW4gc3RhcnRlZC4gCisgICAgICogTm90aWZpZXMgdGhpcyBsaXN0ZW5lciB0aGF0IGFuIGltYWdlIHJlYWQgb3BlcmF0aW9uIGhhcyBiZWVuIHN0YXJ0ZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNvdXJjZSB0aGUgSW1hZ2VSZWFkZXIgb2JqZWN0IHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kLgotICAgICAqIEBwYXJhbSBpbWFnZUluZGV4IHRoZSBpbmRleCBvZiB0aGUgaW1hZ2UgaW4gYW4gaW5wdXQgZmlsZSBvciAKLSAgICAgKiBzdHJlYW0gdG8gYmUgcmVhZC4KKyAgICAgKiBAcGFyYW0gc291cmNlCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VSZWFkZXIgb2JqZWN0IHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kLgorICAgICAqIEBwYXJhbSBpbWFnZUluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGltYWdlIGluIGFuIGlucHV0IGZpbGUgb3Igc3RyZWFtIHRvIGJlIHJlYWQuCiAgICAgICovCiAgICAgdm9pZCBpbWFnZVN0YXJ0ZWQoSW1hZ2VSZWFkZXIgc291cmNlLCBpbnQgaW1hZ2VJbmRleCk7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBOb3RpZmllcyB0aGlzIGxpc3RlbmVyIHRoYXQgYSByZWFkIG9wZXJhdGlvbiBoYXMgYmVlbiBhYm9ydGVkLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIEltYWdlUmVhZGVyIG9iamVjdCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gc291cmNlCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VSZWFkZXIgb2JqZWN0IHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kLgogICAgICAqLwogICAgIHZvaWQgcmVhZEFib3J0ZWQoSW1hZ2VSZWFkZXIgc291cmNlKTsKLSAgICAKKwogICAgIC8qKgotICAgICAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgdGhhdCBhIHNlcXVlbmNlIG9mIHJlYWQgb3BlcmF0aW9ucyBoYXMgYmVlbiBjb21wbGV0ZWQuIAorICAgICAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgdGhhdCBhIHNlcXVlbmNlIG9mIHJlYWQgb3BlcmF0aW9ucyBoYXMgYmVlbgorICAgICAqIGNvbXBsZXRlZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBJbWFnZVJlYWRlciBvYmplY3Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QuCisgICAgICogQHBhcmFtIHNvdXJjZQorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlUmVhZGVyIG9iamVjdCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZC4KICAgICAgKi8KICAgICB2b2lkIHNlcXVlbmNlQ29tcGxldGUoSW1hZ2VSZWFkZXIgc291cmNlKTsKLSAgICAKKwogICAgIC8qKgotICAgICAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgdGhhdCBhIHNlcXVlbmNlIG9mIHJlYWQgb3BlcmF0aW9uIGhhcyBiZWVuIHN0YXJ0ZWQuIAorICAgICAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgdGhhdCBhIHNlcXVlbmNlIG9mIHJlYWQgb3BlcmF0aW9uIGhhcyBiZWVuCisgICAgICogc3RhcnRlZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBJbWFnZVJlYWRlciBvYmplY3Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QuCi0gICAgICogQHBhcmFtIG1pbkluZGV4IHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgaW1hZ2UgdG8gYmUgcmVhZC4KKyAgICAgKiBAcGFyYW0gc291cmNlCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VSZWFkZXIgb2JqZWN0IHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kLgorICAgICAqIEBwYXJhbSBtaW5JbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBpbWFnZSB0byBiZSByZWFkLgogICAgICAqLwogICAgIHZvaWQgc2VxdWVuY2VTdGFydGVkKEltYWdlUmVhZGVyIHNvdXJjZSwgaW50IG1pbkluZGV4KTsKLSAgICAKKwogICAgIC8qKgogICAgICAqIE5vdGlmaWVzIHRoYXQgYSB0aHVtYm5haWwgcmVhZCBvcGVyYXRpb24gaGFzIGJlZW4gY29tcGxldGVkLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIEltYWdlUmVhZGVyIG9iamVjdCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gc291cmNlCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VSZWFkZXIgb2JqZWN0IHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kLgogICAgICAqLwogICAgIHZvaWQgdGh1bWJuYWlsQ29tcGxldGUoSW1hZ2VSZWFkZXIgc291cmNlKTsKLSAgICAKKwogICAgIC8qKgogICAgICAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgYWJvdXQgdGhlIGRlZ3JlZSBvZiBjb21wbGV0aW9uIG9mIHRoZSByZWFkIGNhbGwuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNvdXJjZSB0aGUgSW1hZ2VSZWFkZXIgb2JqZWN0IHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kLgotICAgICAqIEBwYXJhbSBwZXJjZW50YWdlRG9uZSB0aGUgcGVyY2VudGFnZSBvZiBkZWNvZGluZyBkb25lLgorICAgICAqIEBwYXJhbSBzb3VyY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVJlYWRlciBvYmplY3Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QuCisgICAgICogQHBhcmFtIHBlcmNlbnRhZ2VEb25lCisgICAgICogICAgICAgICAgICB0aGUgcGVyY2VudGFnZSBvZiBkZWNvZGluZyBkb25lLgogICAgICAqLwogICAgIHZvaWQgdGh1bWJuYWlsUHJvZ3Jlc3MoSW1hZ2VSZWFkZXIgc291cmNlLCBmbG9hdCBwZXJjZW50YWdlRG9uZSk7Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBOb3RpZmllcyB0aGlzIGxpc3RlbmVyIHRoYXQgYSB0aHVtYm5haWwgcmVhZGluZyBvcGVyYXRpb24gaGFzIGJlZW4gc3RhcnRlZC4gCisgICAgICogTm90aWZpZXMgdGhpcyBsaXN0ZW5lciB0aGF0IGEgdGh1bWJuYWlsIHJlYWRpbmcgb3BlcmF0aW9uIGhhcyBiZWVuCisgICAgICogc3RhcnRlZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBJbWFnZVJlYWRlciBvYmplY3Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QuCi0gICAgICogQHBhcmFtIGltYWdlSW5kZXggdGhlIGluZGV4IG9mIHRoZSBpbWFnZSBpbiBhbiBpbnB1dCBmaWxlIG9yIAotICAgICAqIHN0cmVhbSB0byBiZSByZWFkLgotICAgICAqIEBwYXJhbSB0aHVtYm5haWxJbmRleCB0aGUgaW5kZXggb2YgdGhlIHRodW1ibmFpbCB0byBiZSByZWFkLgorICAgICAqIEBwYXJhbSBzb3VyY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVJlYWRlciBvYmplY3Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QuCisgICAgICogQHBhcmFtIGltYWdlSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgaW1hZ2UgaW4gYW4gaW5wdXQgZmlsZSBvciBzdHJlYW0gdG8gYmUgcmVhZC4KKyAgICAgKiBAcGFyYW0gdGh1bWJuYWlsSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgdGh1bWJuYWlsIHRvIGJlIHJlYWQuCiAgICAgICovCiAgICAgdm9pZCB0aHVtYm5haWxTdGFydGVkKEltYWdlUmVhZGVyIHNvdXJjZSwgaW50IGltYWdlSW5kZXgsIGludCB0aHVtYm5haWxJbmRleCk7CiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL2V2ZW50L0lJT1JlYWRVcGRhdGVMaXN0ZW5lci5qYXZhIGIvYXd0L2phdmF4L2ltYWdlaW8vZXZlbnQvSUlPUmVhZFVwZGF0ZUxpc3RlbmVyLmphdmEKaW5kZXggY2U1ZTJmMS4uNDliZGJjYiAxMDA2NDQKLS0tIGEvYXd0L2phdmF4L2ltYWdlaW8vZXZlbnQvSUlPUmVhZFVwZGF0ZUxpc3RlbmVyLmphdmEKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vZXZlbnQvSUlPUmVhZFVwZGF0ZUxpc3RlbmVyLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgU2VyZ2V5IEkuIFNhbGlzaGV2CiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMiAkCiAgKi8KKwogcGFja2FnZSBqYXZheC5pbWFnZWlvLmV2ZW50OwogCiBpbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKQEAgLTMwLDEwOSArMzEsMTUyIEBACiAgKi8KIAogLyoqCi0gKiBUaGUgSUlPUmVhZFVwZGF0ZUxpc3RlbmVyIGludGVyZmFjZSBwcm92aWRlcyBmdW5jdGlvbmFsaXR5IAotICogdG8gcmVjZWl2ZSBub3RpZmljYXRpb24gb2YgcGl4ZWwgdXBkYXRlcyBkdXJpbmcgaW1hZ2UgYW5kIHRodW1ibmFpbCAKLSAqIHJlYWRpbmcgb3BlcmF0aW9ucy4KKyAqIFRoZSBJSU9SZWFkVXBkYXRlTGlzdGVuZXIgaW50ZXJmYWNlIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgdG8gcmVjZWl2ZQorICogbm90aWZpY2F0aW9uIG9mIHBpeGVsIHVwZGF0ZXMgZHVyaW5nIGltYWdlIGFuZCB0aHVtYm5haWwgcmVhZGluZyBvcGVyYXRpb25zLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBJSU9SZWFkVXBkYXRlTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKIAogICAgIC8qKgotICAgICAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgdGhhdCB0aGUgc3BlY2lmaWVkIGFyZWEgb2YgdGhlIGltYWdlIGhhcyBiZWVuIHVwZGF0ZWQuIAotICAgICAqIAotICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIEltYWdlUmVhZGVyIG9iamVjdCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZC4KLSAgICAgKiBAcGFyYW0gdGhlSW1hZ2UgdGhlIGltYWdlIHRvIGJlIHVwZGF0ZWQuCi0gICAgICogQHBhcmFtIG1pblggdGhlIG1pbmltdW0gWCBjb29yZGluYXRlIG9mIHRoZSBwaXhlbHMgaW4gdGhlIHVwZGF0ZWQgYXJlYS4KLSAgICAgKiBAcGFyYW0gbWluWSB0aGUgbWluaW11bSBZIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVscyBpbiB0aGUgdXBkYXRlZCBhcmVhLgotICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdXBkYXRlZCBhcmVhLgotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB1cGRhdGVkIGFyZWEuCi0gICAgICogQHBhcmFtIHBlcmlvZFggdGhlIGhvcml6b250YWwgc3BhY2luZyBwZXJpb2QgYmV0d2VlbiB1cGRhdGVkIAotICAgICAqIHBpeGVscywgaWYgaXQgZXF1YWxzIDEsIHRoZXJlIGlzIG5vIHNwYWNlIGJldHdlZW4gcGl4ZWxzLiAKLSAgICAgKiBAcGFyYW0gcGVyaW9kWSB0aGUgdmVydGljYWwgc3BhY2luZyBwZXJpb2QgYmV0d2VlbiB1cGRhdGVkIAotICAgICAqIHBpeGVscywgaWYgaXQgZXF1YWxzIDEsIHRoZXJlIGlzIG5vIHNwYWNlIGJldHdlZW4gcGl4ZWxzLgotICAgICAqIEBwYXJhbSBiYW5kcyB0aGUgYXJyYXkgb2YgaW50IHZhbHVlcyBpbmRpY2F0aW5nIHRoZSBiYW5kcyBiZWluZyB1cGRhdGVkLgotICAgICAqLwotICAgIHZvaWQgaW1hZ2VVcGRhdGUoSW1hZ2VSZWFkZXIgc291cmNlLCBCdWZmZXJlZEltYWdlIHRoZUltYWdlLCBpbnQgbWluWCwKLSAgICAgICAgICAgIGludCBtaW5ZLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBwZXJpb2RYLCBpbnQgcGVyaW9kWSwKLSAgICAgICAgICAgIGludFtdIGJhbmRzKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBOb3RpZmllcyB0aGlzIGxpc3RlbmVyIHRoYXQgdGhlIGN1cnJlbnQgcmVhZCBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZCBhIAotICAgICAqIHByb2dyZXNzaXZlIHBhc3MuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNvdXJjZSB0aGUgSW1hZ2VSZWFkZXIgb2JqZWN0IHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kLgotICAgICAqIEBwYXJhbSB0aGVJbWFnZSB0aGUgaW1hZ2UgdG8gYmUgdXBkYXRlZC4KLSAgICAgKi8KLSAgICB2b2lkIHBhc3NDb21wbGV0ZShJbWFnZVJlYWRlciBzb3VyY2UsIEJ1ZmZlcmVkSW1hZ2UgdGhlSW1hZ2UpOwotICAgIAotICAgIC8qKgotICAgICAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgdGhhdCB0aGUgY3VycmVudCByZWFkIG9wZXJhdGlvbiBoYXMgYmVndW4gCi0gICAgICogYSBwcm9ncmVzc2l2ZSBwYXNzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIEltYWdlUmVhZGVyIG9iamVjdCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZC4KLSAgICAgKiBAcGFyYW0gdGhlSW1hZ2UgdGhlIGltYWdlIHRvIGJlIHVwZGF0ZWQuCi0gICAgICogQHBhcmFtIHBhc3MgdGhlIG51bWVyIG9mIHRoZSBwYXNzLgotICAgICAqIEBwYXJhbSBtaW5QYXNzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgcGFzcyB0aGF0IHdpbGwgYmUgZGVjb2RlZC4KLSAgICAgKiBAcGFyYW0gbWF4UGFzcyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgcGFzcyB0aGF0IHdpbGwgYmUgZGVjb2RlZC4KLSAgICAgKiBAcGFyYW0gbWluWCB0aGUgbWluaW11bSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVscyBpbiB0aGUgdXBkYXRlZCBhcmVhLgotICAgICAqIEBwYXJhbSBtaW5ZIHRoZSBtaW5pbXVtIFkgY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWxzIGluIHRoZSB1cGRhdGVkIGFyZWEuCi0gICAgICogQHBhcmFtIHBlcmlvZFggdGhlIGhvcml6b250YWwgc3BhY2luZyBwZXJpb2QgYmV0d2VlbiB1cGRhdGVkIAotICAgICAqIHBpeGVscywgaWYgaXQgZXF1YWxzIDEsIHRoZXJlIGlzIG5vIHNwYWNlIGJldHdlZW4gcGl4ZWxzLiAKLSAgICAgICogQHBhcmFtIHBlcmlvZFkgdGhlIHZlcnRpY2FsIHNwYWNpbmcgcGVyaW9kIGJldHdlZW4gdXBkYXRlZCAKLSAgICAgKiBwaXhlbHMsIGlmIGl0IGVxdWFscyAxLCB0aGVyZSBpcyBubyBzcGFjZSBiZXR3ZWVuIHBpeGVscy4KLSAgICAgKiBAcGFyYW0gYmFuZHMgdGhlIGFycmF5IG9mIGludCB2YWx1ZXMgaW5kaWNhdGluZyB0aGUgYmFuZHMgYmVpbmcgdXBkYXRlZC4KLSAgICAgKi8KLSAgICB2b2lkIHBhc3NTdGFydGVkKEltYWdlUmVhZGVyIHNvdXJjZSwgQnVmZmVyZWRJbWFnZSB0aGVJbWFnZSwgaW50IHBhc3MsCi0gICAgICAgICAgICBpbnQgbWluUGFzcywgaW50IG1heFBhc3MsIGludCBtaW5YLCBpbnQgbWluWSwgaW50IHBlcmlvZFgsCi0gICAgICAgICAgICBpbnQgcGVyaW9kWSwgaW50W10gYmFuZHMpOwotCi0gICAgLyoqCi0gICAgICogTm90aWZpZXMgdGhpcyBsaXN0ZW5lciB0aGF0IHRoZSBjdXJyZW50IHRodW1ibmFpbCByZWFkIG9wZXJhdGlvbiBoYXMgIAotICAgICAqIGNvbXBsZXRlZCBhIHByb2dyZXNzaXZlIHBhc3MuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNvdXJjZSB0aGUgSW1hZ2VSZWFkZXIgb2JqZWN0IHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kLgotICAgICAqIEBwYXJhbSB0aGVJbWFnZSB0aGUgdGh1bWJuYWlsIHRvIGJlIHVwZGF0ZWQuCi0gICAgICovCi0gICAgdm9pZCB0aHVtYm5haWxQYXNzQ29tcGxldGUoSW1hZ2VSZWFkZXIgc291cmNlLCBCdWZmZXJlZEltYWdlIHRoZUltYWdlKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBOb3RpZmllcyB0aGlzIGxpc3RlbmVyIHRoYXQgdGhlIGN1cnJlbnQgdGh1bWJuYWlsIHJlYWQgb3BlcmF0aW9uIGhhcyAgCi0gICAgICogYmVndW4gYSBwcm9ncmVzc2l2ZSBwYXNzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIEltYWdlUmVhZGVyIG9iamVjdCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZC4KLSAgICAgKiBAcGFyYW0gdGhlVGh1bWJuYWlsIHRoZSB0aHVtYm5haWwgdG8gYmUgdXBkYXRlZC4KLSAgICAgKiBAcGFyYW0gcGFzcyB0aGUgbnVtZXIgb2YgdGhlIHBhc3MuCi0gICAgICogQHBhcmFtIG1pblBhc3MgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBwYXNzIHRoYXQgd2lsbCBiZSBkZWNvZGVkLgotICAgICAqIEBwYXJhbSBtYXhQYXNzIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBwYXNzIHRoYXQgd2lsbCBiZSBkZWNvZGVkLgotICAgICAqIEBwYXJhbSBtaW5YIHRoZSBtaW5pbXVtIFggY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWxzIGluIHRoZSB1cGRhdGVkIGFyZWEuCi0gICAgICogQHBhcmFtIG1pblkgdGhlIG1pbmltdW0gWSBjb29yZGluYXRlIG9mIHRoZSBwaXhlbHMgaW4gdGhlIHVwZGF0ZWQgYXJlYS4KLSAgICAgKiBAcGFyYW0gcGVyaW9kWCB0aGUgaG9yaXpvbnRhbCBzcGFjaW5nIHBlcmlvZCBiZXR3ZWVuIHVwZGF0ZWQgCi0gICAgICogcGl4ZWxzLCBpZiBpdCBlcXVhbHMgMSwgdGhlcmUgaXMgbm8gc3BhY2UgYmV0d2VlbiBwaXhlbHMuIAotICAgICAqIEBwYXJhbSBwZXJpb2RZIHRoZSB2ZXJ0aWNhbCBzcGFjaW5nIHBlcmlvZCBiZXR3ZWVuIHVwZGF0ZWQgCi0gICAgICogcGl4ZWxzLCBpZiBpdCBlcXVhbHMgMSwgdGhlcmUgaXMgbm8gc3BhY2UgYmV0d2VlbiBwaXhlbHMuCi0gICAgICogQHBhcmFtIGJhbmRzIHRoZSBhcnJheSBvZiBpbnQgdmFsdWVzIGluZGljYXRpbmcgdGhlIGJhbmRzIGJlaW5nIHVwZGF0ZWQuCi0gICAgICovCi0gICAgdm9pZCB0aHVtYm5haWxQYXNzU3RhcnRlZChJbWFnZVJlYWRlciBzb3VyY2UsIEJ1ZmZlcmVkSW1hZ2UgdGhlVGh1bWJuYWlsLAotICAgICAgICAgICAgaW50IHBhc3MsIGludCBtaW5QYXNzLCBpbnQgbWF4UGFzcywgaW50IG1pblgsIGludCBtaW5ZLAotICAgICAgICAgICAgaW50IHBlcmlvZFgsIGludCBwZXJpb2RZLCBpbnRbXSBiYW5kcyk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTm90aWZpZXMgdGhpcyBsaXN0ZW5lciB0aGF0IGEgc3BlY2lmaWVkIGFyZWEgb2YgYSB0aHVtYm5haWwgaW1hZ2UgaGFzIGJlZW4gCisgICAgICogTm90aWZpZXMgdGhpcyBsaXN0ZW5lciB0aGF0IHRoZSBzcGVjaWZpZWQgYXJlYSBvZiB0aGUgaW1hZ2UgaGFzIGJlZW4KICAgICAgKiB1cGRhdGVkLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIEltYWdlUmVhZGVyIG9iamVjdCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZC4KLSAgICAgKiBAcGFyYW0gdGhlVGh1bWJuYWlsIHRoZSB0aHVtYm5haWwgdG8gYmUgdXBkYXRlZC4KLSAgICAgKiBAcGFyYW0gbWluWCB0aGUgbWluaW11bSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVscyBpbiB0aGUgdXBkYXRlZCBhcmVhLgotICAgICAqIEBwYXJhbSBtaW5ZIHRoZSBtaW5pbXVtIFkgY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWxzIGluIHRoZSB1cGRhdGVkIGFyZWEuCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aCBvZiB1cGRhdGVkIGFyZWEuCi0gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHVwZGF0ZWQgYXJlYS4KLSAgICAgKiBAcGFyYW0gcGVyaW9kWCB0aGUgaG9yaXpvbnRhbCBzcGFjaW5nIHBlcmlvZCBiZXR3ZWVuIHVwZGF0ZWQgCi0gICAgICogcGl4ZWxzLCBpZiBpdCBlcXVhbHMgMSwgdGhlcmUgaXMgbm8gc3BhY2UgYmV0d2VlbiBwaXhlbHMuIAotICAgICAqIEBwYXJhbSBwZXJpb2RZIHRoZSB2ZXJ0aWNhbCBzcGFjaW5nIHBlcmlvZCBiZXR3ZWVuIHVwZGF0ZWQgCi0gICAgICogcGl4ZWxzLCBpZiBpdCBlcXVhbHMgMSwgdGhlcmUgaXMgbm8gc3BhY2UgYmV0d2VlbiBwaXhlbHMuCi0gICAgICogQHBhcmFtIGJhbmRzIHRoZSBhcnJheSBvZiBpbnQgdmFsdWVzIGluZGljYXRpbmcgdGhlIGJhbmRzIGJlaW5nIHVwZGF0ZWQuCisgICAgICogQHBhcmFtIHNvdXJjZQorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlUmVhZGVyIG9iamVjdCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gdGhlSW1hZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSB0byBiZSB1cGRhdGVkLgorICAgICAqIEBwYXJhbSBtaW5YCisgICAgICogICAgICAgICAgICB0aGUgbWluaW11bSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVscyBpbiB0aGUgdXBkYXRlZCBhcmVhLgorICAgICAqIEBwYXJhbSBtaW5ZCisgICAgICogICAgICAgICAgICB0aGUgbWluaW11bSBZIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVscyBpbiB0aGUgdXBkYXRlZCBhcmVhLgorICAgICAqIEBwYXJhbSB3aWR0aAorICAgICAqICAgICAgICAgICAgdGhlIHdpZHRoIG9mIHVwZGF0ZWQgYXJlYS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0CisgICAgICogICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHVwZGF0ZWQgYXJlYS4KKyAgICAgKiBAcGFyYW0gcGVyaW9kWAorICAgICAqICAgICAgICAgICAgdGhlIGhvcml6b250YWwgc3BhY2luZyBwZXJpb2QgYmV0d2VlbiB1cGRhdGVkIHBpeGVscywgaWYgaXQKKyAgICAgKiAgICAgICAgICAgIGVxdWFscyAxLCB0aGVyZSBpcyBubyBzcGFjZSBiZXR3ZWVuIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gcGVyaW9kWQorICAgICAqICAgICAgICAgICAgdGhlIHZlcnRpY2FsIHNwYWNpbmcgcGVyaW9kIGJldHdlZW4gdXBkYXRlZCBwaXhlbHMsIGlmIGl0CisgICAgICogICAgICAgICAgICBlcXVhbHMgMSwgdGhlcmUgaXMgbm8gc3BhY2UgYmV0d2VlbiBwaXhlbHMuCisgICAgICogQHBhcmFtIGJhbmRzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgaW50ZWdlciB2YWx1ZXMgaW5kaWNhdGluZyB0aGUgYmFuZHMgYmVpbmcKKyAgICAgKiAgICAgICAgICAgIHVwZGF0ZWQuCiAgICAgICovCi0gICAgdm9pZCB0aHVtYm5haWxVcGRhdGUoSW1hZ2VSZWFkZXIgc291cmNlLCBCdWZmZXJlZEltYWdlIHRoZVRodW1ibmFpbCwKLSAgICAgICAgICAgIGludCBtaW5YLCBpbnQgbWluWSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcGVyaW9kWCwKLSAgICAgICAgICAgIGludCBwZXJpb2RZLCBpbnRbXSBiYW5kcyk7Ci19CisgICAgdm9pZCBpbWFnZVVwZGF0ZShJbWFnZVJlYWRlciBzb3VyY2UsIEJ1ZmZlcmVkSW1hZ2UgdGhlSW1hZ2UsIGludCBtaW5YLCBpbnQgbWluWSwgaW50IHdpZHRoLAorICAgICAgICAgICAgaW50IGhlaWdodCwgaW50IHBlcmlvZFgsIGludCBwZXJpb2RZLCBpbnRbXSBiYW5kcyk7CiAKKyAgICAvKioKKyAgICAgKiBOb3RpZmllcyB0aGlzIGxpc3RlbmVyIHRoYXQgdGhlIGN1cnJlbnQgcmVhZCBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZCBhCisgICAgICogcHJvZ3Jlc3NpdmUgcGFzcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc291cmNlCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VSZWFkZXIgb2JqZWN0IHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kLgorICAgICAqIEBwYXJhbSB0aGVJbWFnZQorICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIHRvIGJlIHVwZGF0ZWQuCisgICAgICovCisgICAgdm9pZCBwYXNzQ29tcGxldGUoSW1hZ2VSZWFkZXIgc291cmNlLCBCdWZmZXJlZEltYWdlIHRoZUltYWdlKTsKKworICAgIC8qKgorICAgICAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgdGhhdCB0aGUgY3VycmVudCByZWFkIG9wZXJhdGlvbiBoYXMgYmVndW4gYQorICAgICAqIHByb2dyZXNzaXZlIHBhc3MuCisgICAgICogCisgICAgICogQHBhcmFtIHNvdXJjZQorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlUmVhZGVyIG9iamVjdCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gdGhlSW1hZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSB0byBiZSB1cGRhdGVkLgorICAgICAqIEBwYXJhbSBwYXNzCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHRoZSBwYXNzLgorICAgICAqIEBwYXJhbSBtaW5QYXNzCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHBhc3MgdGhhdCB3aWxsIGJlIGRlY29kZWQuCisgICAgICogQHBhcmFtIG1heFBhc3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBwYXNzIHRoYXQgd2lsbCBiZSBkZWNvZGVkLgorICAgICAqIEBwYXJhbSBtaW5YCisgICAgICogICAgICAgICAgICB0aGUgbWluaW11bSBYIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVscyBpbiB0aGUgdXBkYXRlZCBhcmVhLgorICAgICAqIEBwYXJhbSBtaW5ZCisgICAgICogICAgICAgICAgICB0aGUgbWluaW11bSBZIGNvb3JkaW5hdGUgb2YgdGhlIHBpeGVscyBpbiB0aGUgdXBkYXRlZCBhcmVhLgorICAgICAqIEBwYXJhbSBwZXJpb2RYCisgICAgICogICAgICAgICAgICB0aGUgaG9yaXpvbnRhbCBzcGFjaW5nIHBlcmlvZCBiZXR3ZWVuIHVwZGF0ZWQgcGl4ZWxzLCBpZiBpdAorICAgICAqICAgICAgICAgICAgZXF1YWxzIDEsIHRoZXJlIGlzIG5vIHNwYWNlIGJldHdlZW4gcGl4ZWxzLgorICAgICAqIEBwYXJhbSBwZXJpb2RZCisgICAgICogICAgICAgICAgICB0aGUgdmVydGljYWwgc3BhY2luZyBwZXJpb2QgYmV0d2VlbiB1cGRhdGVkIHBpeGVscywgaWYgaXQKKyAgICAgKiAgICAgICAgICAgIGVxdWFscyAxLCB0aGVyZSBpcyBubyBzcGFjZSBiZXR3ZWVuIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gYmFuZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBpbnRlZ2VyIHZhbHVlcyBpbmRpY2F0aW5nIHRoZSBiYW5kcyBiZWluZworICAgICAqICAgICAgICAgICAgdXBkYXRlZC4KKyAgICAgKi8KKyAgICB2b2lkIHBhc3NTdGFydGVkKEltYWdlUmVhZGVyIHNvdXJjZSwgQnVmZmVyZWRJbWFnZSB0aGVJbWFnZSwgaW50IHBhc3MsIGludCBtaW5QYXNzLAorICAgICAgICAgICAgaW50IG1heFBhc3MsIGludCBtaW5YLCBpbnQgbWluWSwgaW50IHBlcmlvZFgsIGludCBwZXJpb2RZLCBpbnRbXSBiYW5kcyk7CisKKyAgICAvKioKKyAgICAgKiBOb3RpZmllcyB0aGlzIGxpc3RlbmVyIHRoYXQgdGhlIGN1cnJlbnQgdGh1bWJuYWlsIHJlYWQgb3BlcmF0aW9uIGhhcworICAgICAqIGNvbXBsZXRlZCBhIHByb2dyZXNzaXZlIHBhc3MuCisgICAgICogCisgICAgICogQHBhcmFtIHNvdXJjZQorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlUmVhZGVyIG9iamVjdCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gdGhlSW1hZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSB0aHVtYm5haWwgdG8gYmUgdXBkYXRlZC4KKyAgICAgKi8KKyAgICB2b2lkIHRodW1ibmFpbFBhc3NDb21wbGV0ZShJbWFnZVJlYWRlciBzb3VyY2UsIEJ1ZmZlcmVkSW1hZ2UgdGhlSW1hZ2UpOworCisgICAgLyoqCisgICAgICogTm90aWZpZXMgdGhpcyBsaXN0ZW5lciB0aGF0IHRoZSBjdXJyZW50IHRodW1ibmFpbCByZWFkIG9wZXJhdGlvbiBoYXMKKyAgICAgKiBiZWd1biBhIHByb2dyZXNzaXZlIHBhc3MuCisgICAgICogCisgICAgICogQHBhcmFtIHNvdXJjZQorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlUmVhZGVyIG9iamVjdCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gdGhlVGh1bWJuYWlsCisgICAgICogICAgICAgICAgICB0aGUgdGh1bWJuYWlsIHRvIGJlIHVwZGF0ZWQuCisgICAgICogQHBhcmFtIHBhc3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgdGhlIHBhc3MuCisgICAgICogQHBhcmFtIG1pblBhc3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgcGFzcyB0aGF0IHdpbGwgYmUgZGVjb2RlZC4KKyAgICAgKiBAcGFyYW0gbWF4UGFzcworICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHBhc3MgdGhhdCB3aWxsIGJlIGRlY29kZWQuCisgICAgICogQHBhcmFtIG1pblgKKyAgICAgKiAgICAgICAgICAgIHRoZSBtaW5pbXVtIFggY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWxzIGluIHRoZSB1cGRhdGVkIGFyZWEuCisgICAgICogQHBhcmFtIG1pblkKKyAgICAgKiAgICAgICAgICAgIHRoZSBtaW5pbXVtIFkgY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWxzIGluIHRoZSB1cGRhdGVkIGFyZWEuCisgICAgICogQHBhcmFtIHBlcmlvZFgKKyAgICAgKiAgICAgICAgICAgIHRoZSBob3Jpem9udGFsIHNwYWNpbmcgcGVyaW9kIGJldHdlZW4gdXBkYXRlZCBwaXhlbHMsIGlmIGl0CisgICAgICogICAgICAgICAgICBlcXVhbHMgMSwgdGhlcmUgaXMgbm8gc3BhY2UgYmV0d2VlbiBwaXhlbHMuCisgICAgICogQHBhcmFtIHBlcmlvZFkKKyAgICAgKiAgICAgICAgICAgIHRoZSB2ZXJ0aWNhbCBzcGFjaW5nIHBlcmlvZCBiZXR3ZWVuIHVwZGF0ZWQgcGl4ZWxzLCBpZiBpdAorICAgICAqICAgICAgICAgICAgZXF1YWxzIDEsIHRoZXJlIGlzIG5vIHNwYWNlIGJldHdlZW4gcGl4ZWxzLgorICAgICAqIEBwYXJhbSBiYW5kcworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGludGVnZXIgdmFsdWVzIGluZGljYXRpbmcgdGhlIGJhbmRzIGJlaW5nCisgICAgICogICAgICAgICAgICB1cGRhdGVkLgorICAgICAqLworICAgIHZvaWQgdGh1bWJuYWlsUGFzc1N0YXJ0ZWQoSW1hZ2VSZWFkZXIgc291cmNlLCBCdWZmZXJlZEltYWdlIHRoZVRodW1ibmFpbCwgaW50IHBhc3MsCisgICAgICAgICAgICBpbnQgbWluUGFzcywgaW50IG1heFBhc3MsIGludCBtaW5YLCBpbnQgbWluWSwgaW50IHBlcmlvZFgsIGludCBwZXJpb2RZLCBpbnRbXSBiYW5kcyk7CisKKyAgICAvKioKKyAgICAgKiBOb3RpZmllcyB0aGlzIGxpc3RlbmVyIHRoYXQgYSBzcGVjaWZpZWQgYXJlYSBvZiBhIHRodW1ibmFpbCBpbWFnZSBoYXMKKyAgICAgKiBiZWVuIHVwZGF0ZWQuCisgICAgICogCisgICAgICogQHBhcmFtIHNvdXJjZQorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlUmVhZGVyIG9iamVjdCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gdGhlVGh1bWJuYWlsCisgICAgICogICAgICAgICAgICB0aGUgdGh1bWJuYWlsIHRvIGJlIHVwZGF0ZWQuCisgICAgICogQHBhcmFtIG1pblgKKyAgICAgKiAgICAgICAgICAgIHRoZSBtaW5pbXVtIFggY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWxzIGluIHRoZSB1cGRhdGVkIGFyZWEuCisgICAgICogQHBhcmFtIG1pblkKKyAgICAgKiAgICAgICAgICAgIHRoZSBtaW5pbXVtIFkgY29vcmRpbmF0ZSBvZiB0aGUgcGl4ZWxzIGluIHRoZSB1cGRhdGVkIGFyZWEuCisgICAgICogQHBhcmFtIHdpZHRoCisgICAgICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdXBkYXRlZCBhcmVhLgorICAgICAqIEBwYXJhbSBoZWlnaHQKKyAgICAgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdXBkYXRlZCBhcmVhLgorICAgICAqIEBwYXJhbSBwZXJpb2RYCisgICAgICogICAgICAgICAgICB0aGUgaG9yaXpvbnRhbCBzcGFjaW5nIHBlcmlvZCBiZXR3ZWVuIHVwZGF0ZWQgcGl4ZWxzLCBpZiBpdAorICAgICAqICAgICAgICAgICAgZXF1YWxzIDEsIHRoZXJlIGlzIG5vIHNwYWNlIGJldHdlZW4gcGl4ZWxzLgorICAgICAqIEBwYXJhbSBwZXJpb2RZCisgICAgICogICAgICAgICAgICB0aGUgdmVydGljYWwgc3BhY2luZyBwZXJpb2QgYmV0d2VlbiB1cGRhdGVkIHBpeGVscywgaWYgaXQKKyAgICAgKiAgICAgICAgICAgIGVxdWFscyAxLCB0aGVyZSBpcyBubyBzcGFjZSBiZXR3ZWVuIHBpeGVscy4KKyAgICAgKiBAcGFyYW0gYmFuZHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBpbnRlZ2VyIHZhbHVlcyBpbmRpY2F0aW5nIHRoZSBiYW5kcyBiZWluZworICAgICAqICAgICAgICAgICAgdXBkYXRlZC4KKyAgICAgKi8KKyAgICB2b2lkIHRodW1ibmFpbFVwZGF0ZShJbWFnZVJlYWRlciBzb3VyY2UsIEJ1ZmZlcmVkSW1hZ2UgdGhlVGh1bWJuYWlsLCBpbnQgbWluWCwgaW50IG1pblksCisgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBwZXJpb2RYLCBpbnQgcGVyaW9kWSwgaW50W10gYmFuZHMpOworfQpkaWZmIC0tZ2l0IGEvYXd0L2phdmF4L2ltYWdlaW8vZXZlbnQvSUlPUmVhZFdhcm5pbmdMaXN0ZW5lci5qYXZhIGIvYXd0L2phdmF4L2ltYWdlaW8vZXZlbnQvSUlPUmVhZFdhcm5pbmdMaXN0ZW5lci5qYXZhCmluZGV4IDkyZmEyNzUuLjMxOGE1ZGYgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL2V2ZW50L0lJT1JlYWRXYXJuaW5nTGlzdGVuZXIuamF2YQorKysgYi9hd3QvamF2YXgvaW1hZ2Vpby9ldmVudC9JSU9SZWFkV2FybmluZ0xpc3RlbmVyLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgU2VyZ2V5IEkuIFNhbGlzaGV2CiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMiAkCiAgKi8KKwogcGFja2FnZSBqYXZheC5pbWFnZWlvLmV2ZW50OwogCiBpbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7CkBAIC0yOSwxOCArMzAsMjAgQEAKICAqLwogCiAvKioKLSAqIFRoZSBJSU9SZWFkV2FybmluZ0xpc3RlbmVyIHByb3ZpZGVzIG1ldGhvZHMgdG8gcmVjZWl2ZSBub3RpZmljYXRpb24KLSAqIG9mIHdhcm5pbmcgbWVzc2FnZXMgZ2VuZXJhdGVkIGJ5IGltYWdlIAotICogYW5kIHRodW1ibmFpbCByZWFkaW5nIG1ldGhvZHMuCisgKiBUaGUgSUlPUmVhZFdhcm5pbmdMaXN0ZW5lciBwcm92aWRlcyBtZXRob2RzIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9uIG9mCisgKiB3YXJuaW5nIG1lc3NhZ2VzIGdlbmVyYXRlZCBieSBpbWFnZSBhbmQgdGh1bWJuYWlsIHJlYWRpbmcgbWV0aG9kcy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSUlPUmVhZFdhcm5pbmdMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewogCiAgICAgLyoqCi0gICAgICogTm90aWZpZXMgdGhpcyBsaXN0ZW5lciBhYm91dCBhIHdhcm5pbmcgKG5vbi1mYXRhbCBlcnJvcikgZHVyaW5nIGRlY29kaW5nLiAKKyAgICAgKiBOb3RpZmllcyB0aGlzIGxpc3RlbmVyIGFib3V0IGEgd2FybmluZyAobm9uLWZhdGFsIGVycm9yKSBkdXJpbmcgZGVjb2RpbmcuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNvdXJjZSB0aGUgSW1hZ2VSZWFkZXIgb2JqZWN0IHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kLgotICAgICAqIEBwYXJhbSB3YXJuaW5nIHRoZSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgd2FybmluZy4KKyAgICAgKiBAcGFyYW0gc291cmNlCisgICAgICogICAgICAgICAgICB0aGUgSW1hZ2VSZWFkZXIgb2JqZWN0IHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kLgorICAgICAqIEBwYXJhbSB3YXJuaW5nCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHdhcm5pbmcuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd2FybmluZ09jY3VycmVkKEltYWdlUmVhZGVyIHNvdXJjZSwgU3RyaW5nIHdhcm5pbmcpOwogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9ldmVudC9JSU9Xcml0ZVByb2dyZXNzTGlzdGVuZXIuamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL2V2ZW50L0lJT1dyaXRlUHJvZ3Jlc3NMaXN0ZW5lci5qYXZhCmluZGV4IDE5YWU0OTUuLjRhMmM1OTUgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL2V2ZW50L0lJT1dyaXRlUHJvZ3Jlc3NMaXN0ZW5lci5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL2V2ZW50L0lJT1dyaXRlUHJvZ3Jlc3NMaXN0ZW5lci5qYXZhCkBAIC0xOCw2OSArMTgsODQgQEAKICAqIEBhdXRob3IgUnVzdGVtIFYuIFJhZmlrb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4zICQKICAqLworCiBwYWNrYWdlIGphdmF4LmltYWdlaW8uZXZlbnQ7CiAKIGltcG9ydCBqYXZheC5pbWFnZWlvLkltYWdlV3JpdGVyOwogaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwogCiAvKioKLSAqIFRoZSBJSU9Xcml0ZVByb2dyZXNzTGlzdGVuZXIgaW50ZXJmYWNlIHByb3ZpZGVzIG1ldGhvZHMgdG8gCi0gKiByZWNlaXZlIG5vdGlmaWNhdGlvbiBhYm91dCB0aGUgcHJvZ3Jlc3Mgb2YgdGhlIGltYWdlIGFuZCAKLSAqIHRodW1ibmFpbCB3cml0aW5nIG1ldGhvZHMuCisgKiBUaGUgSUlPV3JpdGVQcm9ncmVzc0xpc3RlbmVyIGludGVyZmFjZSBwcm92aWRlcyBtZXRob2RzIHRvIHJlY2VpdmUKKyAqIG5vdGlmaWNhdGlvbiBhYm91dCB0aGUgcHJvZ3Jlc3Mgb2YgdGhlIGltYWdlIGFuZCB0aHVtYm5haWwgd3JpdGluZyBtZXRob2RzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBJSU9Xcml0ZVByb2dyZXNzTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKLSAgICAKKwogICAgIC8qKgotICAgICAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgdGhhdCBhbiBpbWFnZSB3cml0ZSBvcGVyYXRpb24gaGFzIGJlZW4gc3RhcnRlZC4gCisgICAgICogTm90aWZpZXMgdGhpcyBsaXN0ZW5lciB0aGF0IGFuIGltYWdlIHdyaXRlIG9wZXJhdGlvbiBoYXMgYmVlbiBzdGFydGVkLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIEltYWdlV3JpdGVyIG9iamVjdCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZC4KLSAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleCB0aGUgaW5kZXggb2YgdGhlIGltYWdlIGJlaW5nIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIHNvdXJjZQorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlV3JpdGVyIG9iamVjdCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBpbWFnZSBiZWluZyB3cml0dGVuLgogICAgICAqLwogICAgIHZvaWQgaW1hZ2VTdGFydGVkKEltYWdlV3JpdGVyIHNvdXJjZSwgaW50IGltYWdlSW5kZXgpOwotICAgIAorCiAgICAgLyoqCiAgICAgICogTm90aWZpZXMgdGhpcyBsaXN0ZW5lciBhYm91dCB0aGUgZGVncmVlIG9mIGNvbXBsZXRpb24gb2YgdGhlIHdyaXRlIGNhbGwuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNvdXJjZSB0aGUgSW1hZ2VXcml0ZXIgb2JqZWN0IHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kLgotICAgICAqIEBwYXJhbSBwZXJjZW50YWdlRG9uZSB0aGUgcGVyY2VudGFnZSBvZiBlbmNvZGluZyBkb25lLgorICAgICAqIEBwYXJhbSBzb3VyY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVdyaXRlciBvYmplY3Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QuCisgICAgICogQHBhcmFtIHBlcmNlbnRhZ2VEb25lCisgICAgICogICAgICAgICAgICB0aGUgcGVyY2VudGFnZSBvZiBlbmNvZGluZyBkb25lLgogICAgICAqLwogICAgIHZvaWQgaW1hZ2VQcm9ncmVzcyhJbWFnZVdyaXRlciBzb3VyY2UsIGZsb2F0IHBlcmNlbnRhZ2VEb25lKTsKLSAgICAKKwogICAgIC8qKgotICAgICAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgdGhhdCB0aGUgaW1hZ2Ugd3JpdGluZyBoYXMgYmVlbiBjb21wbGV0ZWQuIAorICAgICAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgdGhhdCB0aGUgaW1hZ2Ugd3JpdGluZyBoYXMgYmVlbiBjb21wbGV0ZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNvdXJjZSB0aGUgSW1hZ2VXcml0ZXIgb2JqZWN0IHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kLgorICAgICAqIEBwYXJhbSBzb3VyY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVdyaXRlciBvYmplY3Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QuCiAgICAgICovCiAgICAgdm9pZCBpbWFnZUNvbXBsZXRlKEltYWdlV3JpdGVyIHNvdXJjZSk7Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBOb3RpZmllcyB0aGlzIGxpc3RlbmVyIHRoYXQgYSB0aHVtYm5haWwgd3JpdGUgb3BlcmF0aW9uIGhhcyBiZWVuIHN0YXJ0ZWQuIAorICAgICAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgdGhhdCBhIHRodW1ibmFpbCB3cml0ZSBvcGVyYXRpb24gaGFzIGJlZW4gc3RhcnRlZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBJbWFnZVdyaXRlciBvYmplY3Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QuCi0gICAgICogQHBhcmFtIGltYWdlSW5kZXggdGhlIGluZGV4IG9mIHRoZSBpbWFnZSBiZWluZyB3cml0dGVuLgotICAgICAqIEBwYXJhbSB0aHVtYm5haWxJbmRleCB0aGUgaW5kZXggb2YgdGhlIHRodW1ibmFpbCBiZWluZyB3cml0dGVuLgorICAgICAqIEBwYXJhbSBzb3VyY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVdyaXRlciBvYmplY3Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QuCisgICAgICogQHBhcmFtIGltYWdlSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgaW1hZ2UgYmVpbmcgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gdGh1bWJuYWlsSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgdGh1bWJuYWlsIGJlaW5nIHdyaXR0ZW4uCiAgICAgICovCiAgICAgdm9pZCB0aHVtYm5haWxTdGFydGVkKEltYWdlV3JpdGVyIHNvdXJjZSwgaW50IGltYWdlSW5kZXgsIGludCB0aHVtYm5haWxJbmRleCk7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBOb3RpZmllcyB0aGlzIGxpc3RlbmVyIGFib3V0IHRoZSBkZWdyZWUgb2YgY29tcGxldGlvbiBvZiB0aGUgd3JpdGUgY2FsbC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBJbWFnZVdyaXRlciBvYmplY3Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QuCi0gICAgICogQHBhcmFtIHBlcmNlbnRhZ2VEb25lIHRoZSBwZXJjZW50YWdlIG9mIGVuY29kaW5nIGRvbmUuCisgICAgICogQHBhcmFtIHNvdXJjZQorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlV3JpdGVyIG9iamVjdCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gcGVyY2VudGFnZURvbmUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwZXJjZW50YWdlIG9mIGVuY29kaW5nIGRvbmUuCiAgICAgICovCiAgICAgdm9pZCB0aHVtYm5haWxQcm9ncmVzcyhJbWFnZVdyaXRlciBzb3VyY2UsIGZsb2F0IHBlcmNlbnRhZ2VEb25lKTsKLSAgICAKKwogICAgIC8qKgotICAgICAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgdGhhdCBhIHRodW1ibmFpbCB3cml0ZSBvcGVyYXRpb24gaGFzIGJlZW4gY29tcGxldGVkLgorICAgICAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgdGhhdCBhIHRodW1ibmFpbCB3cml0ZSBvcGVyYXRpb24gaGFzIGJlZW4KKyAgICAgKiBjb21wbGV0ZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNvdXJjZSB0aGUgSW1hZ2VXcml0ZXIgb2JqZWN0IHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kLgorICAgICAqIEBwYXJhbSBzb3VyY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVdyaXRlciBvYmplY3Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QuCiAgICAgICovCiAgICAgdm9pZCB0aHVtYm5haWxDb21wbGV0ZShJbWFnZVdyaXRlciBzb3VyY2UpOwotICAgIAorCiAgICAgLyoqCiAgICAgICogTm90aWZpZXMgdGhpcyBsaXN0ZW5lciB0aGF0IHdyaXRpbmcgb3BlcmF0aW9uIGhhcyBiZWVuIGFib3J0ZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNvdXJjZSB0aGUgSW1hZ2VXcml0ZXIgb2JqZWN0IHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kLgorICAgICAqIEBwYXJhbSBzb3VyY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVdyaXRlciBvYmplY3Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QuCiAgICAgICovCiAgICAgdm9pZCB3cml0ZUFib3J0ZWQoSW1hZ2VXcml0ZXIgc291cmNlKTsKIH0KZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL2V2ZW50L0lJT1dyaXRlV2FybmluZ0xpc3RlbmVyLmphdmEgYi9hd3QvamF2YXgvaW1hZ2Vpby9ldmVudC9JSU9Xcml0ZVdhcm5pbmdMaXN0ZW5lci5qYXZhCmluZGV4IGY1MzBkMjUuLjhlZTQxY2QgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL2V2ZW50L0lJT1dyaXRlV2FybmluZ0xpc3RlbmVyLmphdmEKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vZXZlbnQvSUlPV3JpdGVXYXJuaW5nTGlzdGVuZXIuamF2YQpAQCAtMTgsMjMgKzE4LDI5IEBACiAgKiBAYXV0aG9yIFJ1c3RlbSBWLiBSYWZpa292CiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMyAkCiAgKi8KKwogcGFja2FnZSBqYXZheC5pbWFnZWlvLmV2ZW50OwogCiBpbXBvcnQgamF2YXguaW1hZ2Vpby5JbWFnZVdyaXRlcjsKIGltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKIAogLyoqCi0gKiBUaGUgSUlPV3JpdGVXYXJuaW5nTGlzdGVuZXIgcHJvdmlkZXMgbWV0aG9kcyB0byByZWNlaXZlIG5vdGlmaWNhdGlvbgotICogb2Ygd2FybmluZ3MgZ2VuZXJhdGVkIGJ5IGltYWdlIGFuZCB0aHVtYm5haWwgd3JpdGluZyBtZXRob2RzLgorICogVGhlIElJT1dyaXRlV2FybmluZ0xpc3RlbmVyIHByb3ZpZGVzIG1ldGhvZHMgdG8gcmVjZWl2ZSBub3RpZmljYXRpb24gb2YKKyAqIHdhcm5pbmdzIGdlbmVyYXRlZCBieSBpbWFnZSBhbmQgdGh1bWJuYWlsIHdyaXRpbmcgbWV0aG9kcy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSUlPV3JpdGVXYXJuaW5nTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKLSAgICAKKwogICAgIC8qKgotICAgICAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgYWJvdXQgYSB3YXJuaW5nIChub24tZmF0YWwgZXJyb3IpIGR1cmluZyBlbmNvZGluZy4gCisgICAgICogTm90aWZpZXMgdGhpcyBsaXN0ZW5lciBhYm91dCBhIHdhcm5pbmcgKG5vbi1mYXRhbCBlcnJvcikgZHVyaW5nIGVuY29kaW5nLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIEltYWdlV3JpdGVyIG9iamVjdCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZC4KLSAgICAgKiBAcGFyYW0gaW1hZ2VJbmRleCB0aGUgaW5kZXggb2YgdGhlIGltYWdlIGdlbmVyYXRpbmcgdGhlIHdhcm5pbmcuCi0gICAgICogQHBhcmFtIHdhcm5pbmcgdGhlIHN0cmluZyBkZXNjcmliaW5nIHRoZSB3YXJuaW5nLgorICAgICAqIEBwYXJhbSBzb3VyY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBJbWFnZVdyaXRlciBvYmplY3Qgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QuCisgICAgICogQHBhcmFtIGltYWdlSW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgaW1hZ2UgZ2VuZXJhdGluZyB0aGUgd2FybmluZy4KKyAgICAgKiBAcGFyYW0gd2FybmluZworICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyBkZXNjcmliaW5nIHRoZSB3YXJuaW5nLgogICAgICAqLwogICAgIHZvaWQgd2FybmluZ09jY3VycmVkKEltYWdlV3JpdGVyIHNvdXJjZSwgaW50IGltYWdlSW5kZXgsIFN0cmluZyB3YXJuaW5nKTsKIH0KZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL2V2ZW50L3BhY2thZ2UuaHRtbCBiL2F3dC9qYXZheC9pbWFnZWlvL2V2ZW50L3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmZlMzlmCi0tLSAvZGV2L251bGwKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vZXZlbnQvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsOCBAQAorPGh0bWw+CisgIDxib2R5PgorICAgIDxwPgorICAgICAgVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGludGVyZmFjZXMgdG8gaGFuZGxlIGV2ZW50cyB3aGljaCBjYW4gYmUgZmlyZWQgZHVyaW5nIHRoZSByZWFkaW5nIG9yIHdyaXRpbmcgb2YgaW1hZ2VzLgorICAgIDwvcD4KKyAgQHNpbmNlIEFuZHJvaWQgMS4wCisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL21ldGFkYXRhL0lJT0ludmFsaWRUcmVlRXhjZXB0aW9uLmphdmEgYi9hd3QvamF2YXgvaW1hZ2Vpby9tZXRhZGF0YS9JSU9JbnZhbGlkVHJlZUV4Y2VwdGlvbi5qYXZhCmluZGV4IDg2OTBiMmIuLmJhOTA2NTcgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL21ldGFkYXRhL0lJT0ludmFsaWRUcmVlRXhjZXB0aW9uLmphdmEKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vbWV0YWRhdGEvSUlPSW52YWxpZFRyZWVFeGNlcHRpb24uamF2YQpAQCAtMjEsMjEgKzIxLDI2IEBACiBpbXBvcnQgamF2YXguaW1hZ2Vpby5JSU9FeGNlcHRpb247CiAKIC8qKgotICogVGhlIElJT0ludmFsaWRUcmVlRXhjZXB0aW9uIHByb3ZpZGVzIG5vdGlmaWNhdGlvbiBhYm91dAotICogZmFpbHMgb2YgSUlPTWV0YWRhdGFOb2RlcyB0cmVlIHBhcnNpbmcgYnkgSUlPTWV0YWRhdGEgb2JqZWN0LiAKKyAqIFRoZSBJSU9JbnZhbGlkVHJlZUV4Y2VwdGlvbiBwcm92aWRlcyBub3RpZmljYXRpb24gYWJvdXQgZmFpbHMgb2YKKyAqIElJT01ldGFkYXRhTm9kZXMgdHJlZSBwYXJzaW5nIGJ5IElJT01ldGFkYXRhIG9iamVjdC4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBJSU9JbnZhbGlkVHJlZUV4Y2VwdGlvbiBleHRlbmRzIElJT0V4Y2VwdGlvbiB7Ci0gICAgCi0gICAgLyoqIFRoZSBvZmZlbmRpbmcgbm9kZS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBvZmZlbmRpbmcgbm9kZS4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgTm9kZSBvZmZlbmRpbmdOb2RlID0gbnVsbDsKIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhbiBJSU9JbnZhbGlkVHJlZUV4Y2VwdGlvbiB3aXRoIHRoZQotICAgICAqIHNwZWNpZmllZCBkZXRhaWxlZCBtZXNzYWdlIGFuZCBzcGVjaWZpZWQgb2ZmZW5kaW5nCi0gICAgICogTm9kZS4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYW4gSUlPSW52YWxpZFRyZWVFeGNlcHRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGRldGFpbGVkCisgICAgICogbWVzc2FnZSBhbmQgc3BlY2lmaWVkIG9mZmVuZGluZyBOb2RlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBkZXRhaWxlZCBtZXNzYWdlLgotICAgICAqIEBwYXJhbSBvZmZlbmRpbmdOb2RlIHRoZSBvZmZlbmRpbmcgbm9kZS4KKyAgICAgKiBAcGFyYW0gbWVzc2FnZQorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbGVkIG1lc3NhZ2UuCisgICAgICogQHBhcmFtIG9mZmVuZGluZ05vZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZlbmRpbmcgbm9kZS4KICAgICAgKi8KICAgICBwdWJsaWMgSUlPSW52YWxpZFRyZWVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIE5vZGUgb2ZmZW5kaW5nTm9kZSkgewogICAgICAgICBzdXBlcihtZXNzYWdlKTsKQEAgLTQzLDEzICs0OCwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJSU9JbnZhbGlkVHJlZUV4Y2VwdGlvbiB3aXRoIHRoZQotICAgICAqIHNwZWNpZmllZCBkZXRhaWxlZCBtZXNzYWdlIGFuZCBzcGVjaWZpZWQgb2ZmZW5kaW5nCi0gICAgICogTm9kZS4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgSUlPSW52YWxpZFRyZWVFeGNlcHRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGRldGFpbGVkCisgICAgICogbWVzc2FnZSBhbmQgc3BlY2lmaWVkIG9mZmVuZGluZyBOb2RlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBkZXRhaWxlZCBtZXNzYWdlLgotICAgICAqIEBwYXJhbSBjYXVzZSB0aGUgY2F1c2Ugb2YgdGhpcyBleGNlcHRpb24uCi0gICAgICogQHBhcmFtIG9mZmVuZGluZ05vZGUgdGhlIG9mZmVuZGluZyBub2RlCisgICAgICogQHBhcmFtIG1lc3NhZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWxlZCBtZXNzYWdlLgorICAgICAqIEBwYXJhbSBjYXVzZQorICAgICAqICAgICAgICAgICAgdGhlIGNhdXNlIG9mIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBwYXJhbSBvZmZlbmRpbmdOb2RlCisgICAgICogICAgICAgICAgICB0aGUgb2ZmZW5kaW5nIG5vZGUuCiAgICAgICovCiAgICAgcHVibGljIElJT0ludmFsaWRUcmVlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UsIE5vZGUgb2ZmZW5kaW5nTm9kZSkgewogICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7CmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9tZXRhZGF0YS9JSU9NZXRhZGF0YS5qYXZhIGIvYXd0L2phdmF4L2ltYWdlaW8vbWV0YWRhdGEvSUlPTWV0YWRhdGEuamF2YQppbmRleCBmMjM4N2NjLi45NmNlYmY5IDEwMDY0NAotLS0gYS9hd3QvamF2YXgvaW1hZ2Vpby9tZXRhZGF0YS9JSU9NZXRhZGF0YS5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL21ldGFkYXRhL0lJT01ldGFkYXRhLmphdmEKQEAgLTE0LDYgKzE0LDcgQEAKICAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KKwogcGFja2FnZSBqYXZheC5pbWFnZWlvLm1ldGFkYXRhOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKQEAgLTIyLDczICsyMyw5MCBAQAogaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CiAKIC8qKgotICogVGhlIENsYXNzIElJT01ldGFkYXRhIHJlcHJlc2VudHMgdGhlIG1ldGFkYXRhIChidW5kbGVkIHdpdGggYW4gaW1hZ2UpCi0gKiBhcyBhIERvbS10eXBlIHRyZWUuCisgKiBUaGUgY2xhc3MgSUlPTWV0YWRhdGEgcmVwcmVzZW50cyB0aGUgbWV0YWRhdGEgKGJ1bmRsZWQgd2l0aCBhbiBpbWFnZSkgYXMgYQorICogRG9tLXR5cGUgdHJlZS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBJSU9NZXRhZGF0YSB7CiAKLSAgICAvKiogV2hldGhlciB0aGUgc3RhbmRhcmQgbWV0YWRhdGEgZm9ybWF0IGlzIHN1cHBvcnRlZC4gKi8KKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoZSBzdGFuZGFyZCBtZXRhZGF0YSBmb3JtYXQgaXMgc3VwcG9ydGVkLgorICAgICAqLwogICAgIHByb3RlY3RlZCBib29sZWFuIHN0YW5kYXJkRm9ybWF0U3VwcG9ydGVkOwotICAgIAotICAgIC8qKiBUaGUgbmF0aXZlIG1ldGFkYXRhIGZvcm1hdCBuYW1lLiAqLworCisgICAgLyoqCisgICAgICogVGhlIG5hdGl2ZSBtZXRhZGF0YSBmb3JtYXQgbmFtZS4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgU3RyaW5nIG5hdGl2ZU1ldGFkYXRhRm9ybWF0TmFtZTsKLSAgICAKLSAgICAvKiogVGhlIG5hdGl2ZSBtZXRhZGF0YSBmb3JtYXQgY2xhc3MgbmFtZS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBuYXRpdmUgbWV0YWRhdGEgZm9ybWF0IGNsYXNzIG5hbWUuCisgICAgICovCiAgICAgcHJvdGVjdGVkIFN0cmluZyBuYXRpdmVNZXRhZGF0YUZvcm1hdENsYXNzTmFtZTsKLSAgICAKLSAgICAvKiogVGhlIGV4dHJhIG1ldGFkYXRhIGZvcm1hdCBuYW1lcy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBleHRyYSBtZXRhZGF0YSBmb3JtYXQgbmFtZXMuCisgICAgICovCiAgICAgcHJvdGVjdGVkIFN0cmluZ1tdIGV4dHJhTWV0YWRhdGFGb3JtYXROYW1lczsKLSAgICAKLSAgICAvKiogVGhlIGV4dHJhIG1ldGFkYXRhIGZvcm1hdCBjbGFzcyBuYW1lcy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBleHRyYSBtZXRhZGF0YSBmb3JtYXQgY2xhc3MgbmFtZXMuCisgICAgICovCiAgICAgcHJvdGVjdGVkIFN0cmluZ1tdIGV4dHJhTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzOwotICAgIAotICAgIC8qKiBUaGUgZGVmYXVsdCBjb250cm9sbGVyLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgY29udHJvbGxlci4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgSUlPTWV0YWRhdGFDb250cm9sbGVyIGRlZmF1bHRDb250cm9sbGVyOwotICAgIAotICAgIC8qKiBUaGUgY29udHJvbGxlci4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBjb250cm9sbGVyLgorICAgICAqLwogICAgIHByb3RlY3RlZCBJSU9NZXRhZGF0YUNvbnRyb2xsZXIgY29udHJvbGxlcjsKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJSU9NZXRhZGF0YSB3aXRoIG5vIGRhdGEgc2V0LgogICAgICAqLwotICAgIHByb3RlY3RlZCBJSU9NZXRhZGF0YSgpIHt9CisgICAgcHJvdGVjdGVkIElJT01ldGFkYXRhKCkgeworICAgIH0KIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJSU9NZXRhZGF0YSB3aXRoIHRoZSBzcGVjaWZpZWQgZGF0YSBwYXJhbWV0ZXJzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzdGFuZGFyZE1ldGFkYXRhRm9ybWF0U3VwcG9ydGVkIHdoZXRoZXIgdGhlIHN0YW5kYXJkIG1ldGFkYXRhIGZvcm1hdCBpcyBzdXBwb3J0ZWQKLSAgICAgKiBAcGFyYW0gbmF0aXZlTWV0YWRhdGFGb3JtYXROYW1lIHRoZSBuYXRpdmUgbWV0YWRhdGEgZm9ybWF0IG5hbWUKLSAgICAgKiBAcGFyYW0gbmF0aXZlTWV0YWRhdGFGb3JtYXRDbGFzc05hbWUgdGhlIG5hdGl2ZSBtZXRhZGF0YSBmb3JtYXQgY2xhc3MgbmFtZQotICAgICAqIEBwYXJhbSBleHRyYU1ldGFkYXRhRm9ybWF0TmFtZXMgdGhlIGV4dHJhIG1ldGFkYXRhIGZvcm1hdCBuYW1lcwotICAgICAqIEBwYXJhbSBleHRyYU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcyB0aGUgZXh0cmEgbWV0YWRhdGEgZm9ybWF0IGNsYXNzIG5hbWVzCisgICAgICogQHBhcmFtIHN0YW5kYXJkTWV0YWRhdGFGb3JtYXRTdXBwb3J0ZWQKKyAgICAgKiAgICAgICAgICAgIHdoZXRoZXIgdGhlIHN0YW5kYXJkIG1ldGFkYXRhIGZvcm1hdCBpcyBzdXBwb3J0ZWQuCisgICAgICogQHBhcmFtIG5hdGl2ZU1ldGFkYXRhRm9ybWF0TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hdGl2ZSBtZXRhZGF0YSBmb3JtYXQgbmFtZS4KKyAgICAgKiBAcGFyYW0gbmF0aXZlTWV0YWRhdGFGb3JtYXRDbGFzc05hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYXRpdmUgbWV0YWRhdGEgZm9ybWF0IGNsYXNzIG5hbWUuCisgICAgICogQHBhcmFtIGV4dHJhTWV0YWRhdGFGb3JtYXROYW1lcworICAgICAqICAgICAgICAgICAgdGhlIGV4dHJhIG1ldGFkYXRhIGZvcm1hdCBuYW1lcy4KKyAgICAgKiBAcGFyYW0gZXh0cmFNZXRhZGF0YUZvcm1hdENsYXNzTmFtZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBleHRyYSBtZXRhZGF0YSBmb3JtYXQgY2xhc3MgbmFtZXMuCiAgICAgICovCi0gICAgcHJvdGVjdGVkIElJT01ldGFkYXRhKGJvb2xlYW4gc3RhbmRhcmRNZXRhZGF0YUZvcm1hdFN1cHBvcnRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hdGl2ZU1ldGFkYXRhRm9ybWF0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hdGl2ZU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBleHRyYU1ldGFkYXRhRm9ybWF0TmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGV4dHJhTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzKSB7CisgICAgcHJvdGVjdGVkIElJT01ldGFkYXRhKGJvb2xlYW4gc3RhbmRhcmRNZXRhZGF0YUZvcm1hdFN1cHBvcnRlZCwgU3RyaW5nIG5hdGl2ZU1ldGFkYXRhRm9ybWF0TmFtZSwKKyAgICAgICAgICAgIFN0cmluZyBuYXRpdmVNZXRhZGF0YUZvcm1hdENsYXNzTmFtZSwgU3RyaW5nW10gZXh0cmFNZXRhZGF0YUZvcm1hdE5hbWVzLAorICAgICAgICAgICAgU3RyaW5nW10gZXh0cmFNZXRhZGF0YUZvcm1hdENsYXNzTmFtZXMpIHsKICAgICAgICAgc3RhbmRhcmRGb3JtYXRTdXBwb3J0ZWQgPSBzdGFuZGFyZE1ldGFkYXRhRm9ybWF0U3VwcG9ydGVkOwogICAgICAgICB0aGlzLm5hdGl2ZU1ldGFkYXRhRm9ybWF0TmFtZSA9IG5hdGl2ZU1ldGFkYXRhRm9ybWF0TmFtZTsKICAgICAgICAgdGhpcy5uYXRpdmVNZXRhZGF0YUZvcm1hdENsYXNzTmFtZSA9IG5hdGl2ZU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lOwogICAgICAgICBpZiAoZXh0cmFNZXRhZGF0YUZvcm1hdE5hbWVzID09IG51bGwpIHsKICAgICAgICAgICAgIGlmIChleHRyYU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJleHRyYU1ldGFkYXRhRm9ybWF0TmFtZXMgPT0gbnVsbCAmJiBleHRyYU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcyAhPSBudWxsISIKLSAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICAgICAgImV4dHJhTWV0YWRhdGFGb3JtYXROYW1lcyA9PSBudWxsICYmIGV4dHJhTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzICE9IG51bGwhIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoZXh0cmFNZXRhZGF0YUZvcm1hdENsYXNzTmFtZXMgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiZXh0cmFNZXRhZGF0YUZvcm1hdE5hbWVzICE9IG51bGwgJiYgZXh0cmFNZXRhZGF0YUZvcm1hdENsYXNzTmFtZXMgPT0gbnVsbCEiCi0gICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICJleHRyYU1ldGFkYXRhRm9ybWF0TmFtZXMgIT0gbnVsbCAmJiBleHRyYU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcyA9PSBudWxsISIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGV4dHJhTWV0YWRhdGFGb3JtYXROYW1lcy5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImV4dHJhTWV0YWRhdGFGb3JtYXROYW1lcy5sZW5ndGggPT0gMCEiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChleHRyYU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcy5sZW5ndGggIT0gZXh0cmFNZXRhZGF0YUZvcm1hdE5hbWVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiZXh0cmFNZXRhZGF0YUZvcm1hdENsYXNzTmFtZXMubGVuZ3RoICE9IGV4dHJhTWV0YWRhdGFGb3JtYXROYW1lcy5sZW5ndGghIgotICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgICAgICAiZXh0cmFNZXRhZGF0YUZvcm1hdENsYXNzTmFtZXMubGVuZ3RoICE9IGV4dHJhTWV0YWRhdGFGb3JtYXROYW1lcy5sZW5ndGghIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB0aGlzLmV4dHJhTWV0YWRhdGFGb3JtYXROYW1lcyA9IGV4dHJhTWV0YWRhdGFGb3JtYXROYW1lcy5jbG9uZSgpOwogICAgICAgICAgICAgdGhpcy5leHRyYU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcyA9IGV4dHJhTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzLmNsb25lKCk7CkBAIC05OCwzMCArMTE2LDMyIEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgbWV0YWRhdGEgYXMgdHJlZS10eXBlIGRvY3VtZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBmb3JtYXROYW1lIHRoZSBmb3JtYXQgbmFtZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5vZGUgaW4gdHJlZSBmb3JtYXQKKyAgICAgKiBAcGFyYW0gZm9ybWF0TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGZvcm1hdCBuYW1lLgorICAgICAqIEByZXR1cm4gdGhlIG5vZGUgaW4gdHJlZSBmb3JtYXQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IE5vZGUgZ2V0QXNUcmVlKFN0cmluZyBmb3JtYXROYW1lKTsKLSAgICAKKwogICAgIC8qKgogICAgICAqIENoZWNrcyBpZiB0aGUgbWV0YWRhdGEgaXMgcmVhZCBvbmx5LgogICAgICAqIAogICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIG1ldGFkYXRhIGlzIHJlYWQgb25seS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1JlYWRPbmx5KCk7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBNZXJnZXMgdGhlIHNwZWNpZmllZCB0cmVlIHdpdGggdGhpcyBtZXRhZGF0YSB0cmVlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBmb3JtYXROYW1lIHRoZSBmb3JtYXQgb2YgdGhlIHNwZWNpZmllZCB0cmVlCi0gICAgICogQHBhcmFtIHJvb3QgdGhlIHJvb3Qgbm9kZSBvZiB0aGUgbWV0YWRhdGEgdHJlZQotICAgICAqIAotICAgICAqIEB0aHJvd3MgSUlPSW52YWxpZFRyZWVFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCB0cmVlCi0gICAgICogaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIHRoaXMgbWV0YWRhdGEgdHJlZS4KKyAgICAgKiBAcGFyYW0gZm9ybWF0TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGZvcm1hdCBvZiB0aGUgc3BlY2lmaWVkIHRyZWUuCisgICAgICogQHBhcmFtIHJvb3QKKyAgICAgKiAgICAgICAgICAgIHRoZSByb290IG5vZGUgb2YgdGhlIG1ldGFkYXRhIHRyZWUuCisgICAgICogQHRocm93cyBJSU9JbnZhbGlkVHJlZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzcGVjaWZpZWQgdHJlZSBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgdGhpcyBtZXRhZGF0YQorICAgICAqICAgICAgICAgICAgIHRyZWUuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgbWVyZ2VUcmVlKFN0cmluZyBmb3JtYXROYW1lLCBOb2RlIHJvb3QpIHRocm93cyBJSU9JbnZhbGlkVHJlZUV4Y2VwdGlvbjsKLSAgICAKKwogICAgIC8qKgogICAgICAqIFJlc2V0cyB0aGUgY29udHJvbGxlci4KICAgICAgKi8KQEAgLTEzMCw3ICsxNTAsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGNvbnRyb2xsZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWV0YWRhdGEgZG9jdW1lbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29udHJvbGxlcgorICAgICAqIEByZXR1cm4gdGhlIGNvbnRyb2xsZXIuCiAgICAgICovCiAgICAgcHVibGljIElJT01ldGFkYXRhQ29udHJvbGxlciBnZXRDb250cm9sbGVyKCkgewogICAgICAgICByZXR1cm4gY29udHJvbGxlcjsKQEAgLTEzOSw3ICsxNTksNyBAQAogICAgIC8qKgogICAgICAqIENoZWNrcyB3aGV0aGVyIHRoaXMgbWV0YWRhdGEgaGFzIGEgY29udHJvbGxlci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgbWV0YWRhdGEgaGFzIGEgY29udHJvbGxlcgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhpcyBtZXRhZGF0YSBoYXMgYSBjb250cm9sbGVyLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGhhc0NvbnRyb2xsZXIoKSB7CiAgICAgICAgIHJldHVybiBnZXRDb250cm9sbGVyKCkgIT0gbnVsbDsKQEAgLTE0OCw3ICsxNjgsNyBAQAogICAgIC8qKgogICAgICAqIEFjdGl2YXRlIHRoZSBjb250cm9sbGVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgc3VjY2Vzc2Z1bAorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgc3VjY2Vzc2Z1bC4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBhY3RpdmF0ZUNvbnRyb2xsZXIoKSB7CiAgICAgICAgIGlmICghaGFzQ29udHJvbGxlcigpKSB7CkBAIC0xNjAsNyArMTgwLDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IGNvbnRyb2xsZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBjb250cm9sbGVyCisgICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBjb250cm9sbGVyLgogICAgICAqLwogICAgIHB1YmxpYyBJSU9NZXRhZGF0YUNvbnRyb2xsZXIgZ2V0RGVmYXVsdENvbnRyb2xsZXIoKSB7CiAgICAgICAgIHJldHVybiBkZWZhdWx0Q29udHJvbGxlcjsKQEAgLTE2OSw3ICsxODksNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGV4dHJhIG1ldGFkYXRhIGZvcm1hdCBuYW1lcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBleHRyYSBtZXRhZGF0YSBmb3JtYXQgbmFtZXMKKyAgICAgKiBAcmV0dXJuIHRoZSBleHRyYSBtZXRhZGF0YSBmb3JtYXQgbmFtZXMuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ1tdIGdldEV4dHJhTWV0YWRhdGFGb3JtYXROYW1lcygpIHsKICAgICAgICAgcmV0dXJuIGV4dHJhTWV0YWRhdGFGb3JtYXROYW1lcyA9PSBudWxsID8gbnVsbCA6IGV4dHJhTWV0YWRhdGFGb3JtYXROYW1lcy5jbG9uZSgpOwpAQCAtMTc4LDIzICsxOTgsMjAgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBtZXRhZGF0YSBmb3JtYXQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGZvcm1hdE5hbWUgdGhlIGZvcm1hdCBuYW1lCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0YWRhdGEgZm9ybWF0CisgICAgICogQHBhcmFtIGZvcm1hdE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBmb3JtYXQgbmFtZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBtZXRhZGF0YSBmb3JtYXQuCiAgICAgICovCiAgICAgcHVibGljIElJT01ldGFkYXRhRm9ybWF0IGdldE1ldGFkYXRhRm9ybWF0KFN0cmluZyBmb3JtYXROYW1lKSB7Ci0gICAgICAgIHJldHVybiBJSU9NZXRhZGF0YVV0aWxzLmluc3RhbnRpYXRlTWV0YWRhdGFGb3JtYXQoCi0gICAgICAgICAgICAgICAgZm9ybWF0TmFtZSwKLSAgICAgICAgICAgICAgICBzdGFuZGFyZEZvcm1hdFN1cHBvcnRlZCwKLSAgICAgICAgICAgICAgICBuYXRpdmVNZXRhZGF0YUZvcm1hdE5hbWUsIG5hdGl2ZU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lLAotICAgICAgICAgICAgICAgIGV4dHJhTWV0YWRhdGFGb3JtYXROYW1lcywgZXh0cmFNZXRhZGF0YUZvcm1hdENsYXNzTmFtZXMKLSAgICAgICAgKTsKKyAgICAgICAgcmV0dXJuIElJT01ldGFkYXRhVXRpbHMuaW5zdGFudGlhdGVNZXRhZGF0YUZvcm1hdChmb3JtYXROYW1lLCBzdGFuZGFyZEZvcm1hdFN1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICBuYXRpdmVNZXRhZGF0YUZvcm1hdE5hbWUsIG5hdGl2ZU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lLCBleHRyYU1ldGFkYXRhRm9ybWF0TmFtZXMsCisgICAgICAgICAgICAgICAgZXh0cmFNZXRhZGF0YUZvcm1hdENsYXNzTmFtZXMpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG5hdGl2ZSBtZXRhZGF0YSBmb3JtYXQgbmFtZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuYXRpdmUgbWV0YWRhdGEgZm9ybWF0IG5hbWUKKyAgICAgKiBAcmV0dXJuIHRoZSBuYXRpdmUgbWV0YWRhdGEgZm9ybWF0IG5hbWUuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXROYXRpdmVNZXRhZGF0YUZvcm1hdE5hbWUoKSB7CiAgICAgICAgIHJldHVybiBuYXRpdmVNZXRhZGF0YUZvcm1hdE5hbWU7CkBAIC0yMDMsNyArMjIwLDcgQEAKICAgICAvKioKICAgICAgKiBDaGVja3MgaWYgdGhlIHN0YW5kYXJkIG1ldGFkYXRhIGZvcm1hdCBpcyBzdXBwb3J0ZWQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3RhbmRhcmQgbWV0YWRhdGEgZm9ybWF0IGlzIHN1cHBvcnRlZAorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHN0YW5kYXJkIG1ldGFkYXRhIGZvcm1hdCBpcyBzdXBwb3J0ZWQuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNTdGFuZGFyZE1ldGFkYXRhRm9ybWF0U3VwcG9ydGVkKCkgewogICAgICAgICByZXR1cm4gc3RhbmRhcmRGb3JtYXRTdXBwb3J0ZWQ7CkBAIC0yMTIsNyArMjI5LDcgQEAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBtZXRhZGF0YSBmb3JtYXQgbmFtZXMuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWV0YWRhdGEgZm9ybWF0IG5hbWVzCisgICAgICogQHJldHVybiB0aGUgbWV0YWRhdGEgZm9ybWF0IG5hbWVzLgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRNZXRhZGF0YUZvcm1hdE5hbWVzKCkgewogICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiByZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKQEAgLTIzOSw3ICsyNTYsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHN0YW5kYXJkIGNocm9tYSBub2RlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN0YW5kYXJkIGNocm9tYSBub2RlCisgICAgICogQHJldHVybiB0aGUgc3RhbmRhcmQgY2hyb21hIG5vZGUuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIElJT01ldGFkYXRhTm9kZSBnZXRTdGFuZGFyZENocm9tYU5vZGUoKSB7CiAgICAgICAgIHJldHVybiBudWxsOwpAQCAtMjQ4LDcgKzI2NSw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgc3RhbmRhcmQgY29tcHJlc3Npb24gbm9kZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzdGFuZGFyZCBjb21wcmVzc2lvbiBub2RlCisgICAgICogQHJldHVybiB0aGUgc3RhbmRhcmQgY29tcHJlc3Npb24gbm9kZS4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgSUlPTWV0YWRhdGFOb2RlIGdldFN0YW5kYXJkQ29tcHJlc3Npb25Ob2RlKCkgewogICAgICAgICByZXR1cm4gbnVsbDsKQEAgLTI1Nyw3ICsyNzQsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHN0YW5kYXJkIGRhdGEgbm9kZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzdGFuZGFyZCBkYXRhIG5vZGUKKyAgICAgKiBAcmV0dXJuIHRoZSBzdGFuZGFyZCBkYXRhIG5vZGUuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIElJT01ldGFkYXRhTm9kZSBnZXRTdGFuZGFyZERhdGFOb2RlKCkgewogICAgICAgICByZXR1cm4gbnVsbDsKQEAgLTI2Niw3ICsyODMsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHN0YW5kYXJkIGRpbWVuc2lvbiBub2RlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN0YW5kYXJkIGRpbWVuc2lvbiBub2RlCisgICAgICogQHJldHVybiB0aGUgc3RhbmRhcmQgZGltZW5zaW9uIG5vZGUuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIElJT01ldGFkYXRhTm9kZSBnZXRTdGFuZGFyZERpbWVuc2lvbk5vZGUoKSB7CiAgICAgICAgIHJldHVybiBudWxsOwpAQCAtMjc1LDcgKzI5Miw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgc3RhbmRhcmQgZG9jdW1lbnQgbm9kZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzdGFuZGFyZCBkb2N1bWVudCBub2RlCisgICAgICogQHJldHVybiB0aGUgc3RhbmRhcmQgZG9jdW1lbnQgbm9kZS4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgSUlPTWV0YWRhdGFOb2RlIGdldFN0YW5kYXJkRG9jdW1lbnROb2RlKCkgewogICAgICAgICByZXR1cm4gbnVsbDsKQEAgLTI4NCw3ICszMDEsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHN0YW5kYXJkIHRleHQgbm9kZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzdGFuZGFyZCB0ZXh0IG5vZGUKKyAgICAgKiBAcmV0dXJuIHRoZSBzdGFuZGFyZCB0ZXh0IG5vZGUuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIElJT01ldGFkYXRhTm9kZSBnZXRTdGFuZGFyZFRleHROb2RlKCkgewogICAgICAgICByZXR1cm4gbnVsbDsKQEAgLTI5Myw3ICszMTAsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHN0YW5kYXJkIHRpbGUgbm9kZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzdGFuZGFyZCB0aWxlIG5vZGUKKyAgICAgKiBAcmV0dXJuIHRoZSBzdGFuZGFyZCB0aWxlIG5vZGUuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIElJT01ldGFkYXRhTm9kZSBnZXRTdGFuZGFyZFRpbGVOb2RlKCkgewogICAgICAgICByZXR1cm4gbnVsbDsKQEAgLTMwMiw3ICszMTksNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHN0YW5kYXJkIHRyYW5zcGFyZW5jeSBub2RlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN0YW5kYXJkIHRyYW5zcGFyZW5jeSBub2RlCisgICAgICogQHJldHVybiB0aGUgc3RhbmRhcmQgdHJhbnNwYXJlbmN5IG5vZGUuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIElJT01ldGFkYXRhTm9kZSBnZXRTdGFuZGFyZFRyYW5zcGFyZW5jeU5vZGUoKSB7CiAgICAgICAgIHJldHVybiBudWxsOwpAQCAtMzExLDcgKzMyOCw3IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgbWV0YWRhdGEgYXMgYSB0cmVlIGluIHN0YW5kYXJkIGZvcm1hdC4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhZGF0YSBhcyBhIHRyZWUgaW4gc3RhbmRhcmQgZm9ybWF0CisgICAgICogQHJldHVybiB0aGUgbWV0YWRhdGEgYXMgYSB0cmVlIGluIHN0YW5kYXJkIGZvcm1hdC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgZmluYWwgSUlPTWV0YWRhdGFOb2RlIGdldFN0YW5kYXJkVHJlZSgpIHsKICAgICAgICAgLy8gQ3JlYXRlIHJvb3Qgbm9kZQpAQCAtMzQyLDE0ICszNTksMTUgQEAKICAgICAgICAgaWYgKChub2RlID0gZ2V0U3RhbmRhcmRUcmFuc3BhcmVuY3lOb2RlKCkpICE9IG51bGwpIHsKICAgICAgICAgICAgIHJvb3QuYXBwZW5kQ2hpbGQobm9kZSk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgY29udHJvbGxlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29udHJvbGxlciB0aGUgbmV3IGNvbnRyb2xsZXIKKyAgICAgKiBAcGFyYW0gY29udHJvbGxlcgorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBjb250cm9sbGVyLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENvbnRyb2xsZXIoSUlPTWV0YWRhdGFDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKICAgICAgICAgdGhpcy5jb250cm9sbGVyID0gY29udHJvbGxlcjsKQEAgLTM1OCwxMSArMzc2LDEzIEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgZnJvbSB0cmVlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBmb3JtYXROYW1lIHRoZSBuYW1lIG9mIHRoZSBtZXRhdGRhdGEgZm9ybWF0IG9mIHRoZSBmcm9tIHRyZWUKLSAgICAgKiBAcGFyYW0gcm9vdCB0aGUgcm9vdCBub2RlIG9mIHRoZSBmcm9tIHRyZWUKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElJT0ludmFsaWRUcmVlRXhjZXB0aW9uIGlmIHRoZSB0cmVlIG9yIGl0cyBmb3JtYXQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCAKLSAgICAgKiB0aGlzIG1ldGFkYXRhLgorICAgICAqIEBwYXJhbSBmb3JtYXROYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgbWV0YXRkYXRhIGZvcm1hdCBvZiB0aGUgZnJvbSB0cmVlLgorICAgICAqIEBwYXJhbSByb290CisgICAgICogICAgICAgICAgICB0aGUgcm9vdCBub2RlIG9mIHRoZSBmcm9tIHRyZWUuCisgICAgICogQHRocm93cyBJSU9JbnZhbGlkVHJlZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSB0cmVlIG9yIGl0cyBmb3JtYXQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGlzCisgICAgICogICAgICAgICAgICAgbWV0YWRhdGEuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RnJvbVRyZWUoU3RyaW5nIGZvcm1hdE5hbWUsIE5vZGUgcm9vdCkgdGhyb3dzIElJT0ludmFsaWRUcmVlRXhjZXB0aW9uIHsKICAgICAgICAgcmVzZXQoKTsKZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL21ldGFkYXRhL0lJT01ldGFkYXRhQ29udHJvbGxlci5qYXZhIGIvYXd0L2phdmF4L2ltYWdlaW8vbWV0YWRhdGEvSUlPTWV0YWRhdGFDb250cm9sbGVyLmphdmEKaW5kZXggZGZkNGU1Yy4uMTQwNTk0OCAxMDA2NDQKLS0tIGEvYXd0L2phdmF4L2ltYWdlaW8vbWV0YWRhdGEvSUlPTWV0YWRhdGFDb250cm9sbGVyLmphdmEKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vbWV0YWRhdGEvSUlPTWV0YWRhdGFDb250cm9sbGVyLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgU2VyZ2V5IEkuIFNhbGlzaGV2CiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMiAkCiAgKi8KKwogcGFja2FnZSBqYXZheC5pbWFnZWlvLm1ldGFkYXRhOwogCiAvKiAKQEAgLTI2LDIwICsyNywyMCBAQAogICovCiAKIC8qKgotICogVGhlIElJT01ldGFkYXRhQ29udHJvbGxlciBpbnRlcmZhY2UgcHJvdmlkZXMgYSBtZXRob2QgZm9yIAotICogaW1wbGVtZW50aW5nIG9iamVjdHMgdG8gYWN0aXZhdGUgdGhlIGNvbnRyb2xsZXIgd2l0aG91dCAKLSAqIGRlZmluaW5nIGhvdyB0aGUgY29udHJvbGxlciBvYnRhaW5zIHZhbHVlcy4KKyAqIFRoZSBJSU9NZXRhZGF0YUNvbnRyb2xsZXIgaW50ZXJmYWNlIHByb3ZpZGVzIGEgbWV0aG9kIGZvciBpbXBsZW1lbnRpbmcKKyAqIG9iamVjdHMgdG8gYWN0aXZhdGUgdGhlIGNvbnRyb2xsZXIgd2l0aG91dCBkZWZpbmluZyBob3cgdGhlIGNvbnRyb2xsZXIKKyAqIG9idGFpbnMgdmFsdWVzLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBJSU9NZXRhZGF0YUNvbnRyb2xsZXIgewogCiAgICAgLyoqCiAgICAgICogQWN0aXZhdGVzIGEgY29udHJvbGxlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWV0YWRhdGEgdGhlIG1ldGFkYXRhIHRvIGJlIG1vZGlmaWVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgSUlPTWV0YWRhdGEgaGFzIGJlZW4gbW9kaWZpZWQsIAotICAgICAqIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcGFyYW0gbWV0YWRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBtZXRhZGF0YSB0byBiZSBtb2RpZmllZC4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBJSU9NZXRhZGF0YSBoYXMgYmVlbiBtb2RpZmllZCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGFjdGl2YXRlKElJT01ldGFkYXRhIG1ldGFkYXRhKTsKIH0KLQpkaWZmIC0tZ2l0IGEvYXd0L2phdmF4L2ltYWdlaW8vbWV0YWRhdGEvSUlPTWV0YWRhdGFGb3JtYXQuamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL21ldGFkYXRhL0lJT01ldGFkYXRhRm9ybWF0LmphdmEKaW5kZXggOWUyNDZiNC4uMGU3ZTY5NyAxMDA2NDQKLS0tIGEvYXd0L2phdmF4L2ltYWdlaW8vbWV0YWRhdGEvSUlPTWV0YWRhdGFGb3JtYXQuamF2YQorKysgYi9hd3QvamF2YXgvaW1hZ2Vpby9tZXRhZGF0YS9JSU9NZXRhZGF0YUZvcm1hdC5qYXZhCkBAIC0yMSwzMjcgKzIxLDM4NCBAQAogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKIC8qKgotICogVGhlIEludGVyZmFjZSBJSU9NZXRhZGF0YUZvcm1hdCBpcyBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgCi0gKiBkZXNjcmliZSB0aGUgcnVsZXMgYW5kIGFsbG93ZWQgZWxlbWVudHMgZm9yIGEgbWV0YWRhdGEgZG9jdW1lbnQKLSAqIHRyZWUuCisgKiBUaGUgSW50ZXJmYWNlIElJT01ldGFkYXRhRm9ybWF0IGlzIGltcGxlbWVudGVkIGJ5IGNsYXNzZXMgdGhhdCBkZXNjcmliZSB0aGUKKyAqIHJ1bGVzIGFuZCBhbGxvd2VkIGVsZW1lbnRzIGZvciBhIG1ldGFkYXRhIGRvY3VtZW50IHRyZWUuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElJT01ldGFkYXRhRm9ybWF0IHsKIAotICAgIC8qKiBUaGUgQ0hJTERfUE9MSUNZX0VNUFRZLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDSElMRF9QT0xJQ1lfRU1QVFkuCisgICAgICovCiAgICAgaW50IENISUxEX1BPTElDWV9FTVBUWSA9IDA7Ci0gICAgCi0gICAgLyoqIFRoZSBDSElMRF9QT0xJQ1lfQUxMLiAqLwotICAgIGludCBDSElMRF9QT0xJQ1lfQUxMID0gMTsKLSAgICAKLSAgICAvKiogVGhlIENISUxEX1BPTElDWV9TT01FLiAqLwotICAgIGludCBDSElMRF9QT0xJQ1lfU09NRSA9IDI7Ci0gICAgCi0gICAgLyoqIFRoZSBDSElMRF9QT0xJQ1lfQ0hPSUNFLiAqLwotICAgIGludCBDSElMRF9QT0xJQ1lfQ0hPSUNFID0gMzsKLSAgICAKLSAgICAvKiogVGhlIENISUxEX1BPTElDWV9TRVFVRU5DRS4gKi8KLSAgICBpbnQgQ0hJTERfUE9MSUNZX1NFUVVFTkNFID0gNDsKLSAgICAKLSAgICAvKiogVGhlIENISUxEX1BPTElDWV9SRVBFQVQuICovCi0gICAgaW50IENISUxEX1BPTElDWV9SRVBFQVQgPSA1OwotICAgIAotICAgIC8qKiBUaGUgbWF4aW11bSB2YWx1ZSBmb3IgdGhlIGNoaWxkIHBvbGljeS4gKi8KLSAgICBpbnQgQ0hJTERfUE9MSUNZX01BWCA9IENISUxEX1BPTElDWV9SRVBFQVQ7Ci0KLSAgICAvKiogVGhlIERBVEFUWVBFX1NUUklORy4gKi8KLSAgICBpbnQgREFUQVRZUEVfU1RSSU5HID0gMDsKLSAgICAKLSAgICAvKiogVGhlIERBVEFUWVBFX0JPT0xFQU4uICovCi0gICAgaW50IERBVEFUWVBFX0JPT0xFQU4gPSAxOwotICAgIAotICAgIC8qKiBUaGUgREFUQVRZUEVfSU5URUdFUi4gKi8KLSAgICBpbnQgREFUQVRZUEVfSU5URUdFUiA9IDI7Ci0gICAgCi0gICAgLyoqIFRoZSBEQVRBVFlQRV9GTE9BVC4gKi8KLSAgICBpbnQgREFUQVRZUEVfRkxPQVQgPSAzOwotICAgIAotICAgIC8qKiBUaGUgREFUQVRZUEVfRE9VQkxFLiAqLwotICAgIGludCBEQVRBVFlQRV9ET1VCTEUgPSA0OwotCi0gICAgLyoqIFRoZSBWQUxVRV9OT05FLiAqLwotICAgIGludCBWQUxVRV9OT05FID0gMDsKLSAgICAKLSAgICAvKiogVGhlIFZBTFVFX0FSQklUUkFSWS4gKi8KLSAgICBpbnQgVkFMVUVfQVJCSVRSQVJZID0gMTsKLSAgICAKLSAgICAvKiogVGhlIFZBTFVFX1JBTkdFLiAqLwotICAgIGludCBWQUxVRV9SQU5HRSA9IDI7Ci0gICAgCi0gICAgLyoqIFRoZSBWQUxVRV9SQU5HRV9NSU5fSU5DTFVTSVZFX01BU0suICovCi0gICAgaW50IFZBTFVFX1JBTkdFX01JTl9JTkNMVVNJVkVfTUFTSyA9IDQ7Ci0gICAgCi0gICAgLyoqIFRoZSBWQUxVRV9SQU5HRV9NQVhfSU5DTFVTSVZFX01BU0suICovCi0gICAgaW50IFZBTFVFX1JBTkdFX01BWF9JTkNMVVNJVkVfTUFTSyA9IDg7Ci0gICAgCi0gICAgLyoqIFRoZSBWQUxVRV9FTlVNRVJBVElPTi4gKi8KLSAgICBpbnQgVkFMVUVfRU5VTUVSQVRJT04gPSAxNjsKLSAgICAKLSAgICAvKiogVGhlIFZBTFVFX0xJU1QuICovCi0gICAgaW50IFZBTFVFX0xJU1QgPSAzMjsKLSAgICAKLSAgICAvKiogVGhlIFZBTFVFX1JBTkdFX01JTl9JTkNMVVNJVkUuICovCi0gICAgaW50IFZBTFVFX1JBTkdFX01JTl9JTkNMVVNJVkUgPSBWQUxVRV9SQU5HRSB8IFZBTFVFX1JBTkdFX01JTl9JTkNMVVNJVkVfTUFTSzsKLSAgICAKLSAgICAvKiogVGhlIFZBTFVFX1JBTkdFX01BWF9JTkNMVVNJVkUuICovCi0gICAgaW50IFZBTFVFX1JBTkdFX01BWF9JTkNMVVNJVkUgPSBWQUxVRV9SQU5HRSB8IFZBTFVFX1JBTkdFX01BWF9JTkNMVVNJVkVfTUFTSzsKLSAgICAKLSAgICAvKiogVGhlIFZBTFVFX1JBTkdFX01JTl9NQVhfSU5DTFVTSVZFLiAqLwotICAgIGludCBWQUxVRV9SQU5HRV9NSU5fTUFYX0lOQ0xVU0lWRSA9Ci0gICAgICAgICAgICBWQUxVRV9SQU5HRSB8IFZBTFVFX1JBTkdFX01JTl9JTkNMVVNJVkVfTUFTSyB8IFZBTFVFX1JBTkdFX01BWF9JTkNMVVNJVkVfTUFTSzsKIAogICAgIC8qKgotICAgICAqIFRlbGxzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBlbGVtZW50IGlzIGFsbG93ZWQgZm9yIHRoZSBzcGVjaWZpZWQgCi0gICAgICogaW1hZ2UgdHlwZS4KKyAgICAgKiBUaGUgQ0hJTERfUE9MSUNZX0FMTC4KKyAgICAgKi8KKyAgICBpbnQgQ0hJTERfUE9MSUNZX0FMTCA9IDE7CisKKyAgICAvKioKKyAgICAgKiBUaGUgQ0hJTERfUE9MSUNZX1NPTUUuCisgICAgICovCisgICAgaW50IENISUxEX1BPTElDWV9TT01FID0gMjsKKworICAgIC8qKgorICAgICAqIFRoZSBDSElMRF9QT0xJQ1lfQ0hPSUNFLgorICAgICAqLworICAgIGludCBDSElMRF9QT0xJQ1lfQ0hPSUNFID0gMzsKKworICAgIC8qKgorICAgICAqIFRoZSBDSElMRF9QT0xJQ1lfU0VRVUVOQ0UuCisgICAgICovCisgICAgaW50IENISUxEX1BPTElDWV9TRVFVRU5DRSA9IDQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgQ0hJTERfUE9MSUNZX1JFUEVBVC4KKyAgICAgKi8KKyAgICBpbnQgQ0hJTERfUE9MSUNZX1JFUEVBVCA9IDU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWF4aW11bSB2YWx1ZSBmb3IgdGhlIGNoaWxkIHBvbGljeS4KKyAgICAgKi8KKyAgICBpbnQgQ0hJTERfUE9MSUNZX01BWCA9IENISUxEX1BPTElDWV9SRVBFQVQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgREFUQVRZUEVfU1RSSU5HLgorICAgICAqLworICAgIGludCBEQVRBVFlQRV9TVFJJTkcgPSAwOworCisgICAgLyoqCisgICAgICogVGhlIERBVEFUWVBFX0JPT0xFQU4uCisgICAgICovCisgICAgaW50IERBVEFUWVBFX0JPT0xFQU4gPSAxOworCisgICAgLyoqCisgICAgICogVGhlIERBVEFUWVBFX0lOVEVHRVIuCisgICAgICovCisgICAgaW50IERBVEFUWVBFX0lOVEVHRVIgPSAyOworCisgICAgLyoqCisgICAgICogVGhlIERBVEFUWVBFX0ZMT0FULgorICAgICAqLworICAgIGludCBEQVRBVFlQRV9GTE9BVCA9IDM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgREFUQVRZUEVfRE9VQkxFLgorICAgICAqLworICAgIGludCBEQVRBVFlQRV9ET1VCTEUgPSA0OworCisgICAgLyoqCisgICAgICogVGhlIFZBTFVFX05PTkUuCisgICAgICovCisgICAgaW50IFZBTFVFX05PTkUgPSAwOworCisgICAgLyoqCisgICAgICogVGhlIFZBTFVFX0FSQklUUkFSWS4KKyAgICAgKi8KKyAgICBpbnQgVkFMVUVfQVJCSVRSQVJZID0gMTsKKworICAgIC8qKgorICAgICAqIFRoZSBWQUxVRV9SQU5HRS4KKyAgICAgKi8KKyAgICBpbnQgVkFMVUVfUkFOR0UgPSAyOworCisgICAgLyoqCisgICAgICogVGhlIFZBTFVFX1JBTkdFX01JTl9JTkNMVVNJVkVfTUFTSy4KKyAgICAgKi8KKyAgICBpbnQgVkFMVUVfUkFOR0VfTUlOX0lOQ0xVU0lWRV9NQVNLID0gNDsKKworICAgIC8qKgorICAgICAqIFRoZSBWQUxVRV9SQU5HRV9NQVhfSU5DTFVTSVZFX01BU0suCisgICAgICovCisgICAgaW50IFZBTFVFX1JBTkdFX01BWF9JTkNMVVNJVkVfTUFTSyA9IDg7CisKKyAgICAvKioKKyAgICAgKiBUaGUgVkFMVUVfRU5VTUVSQVRJT04uCisgICAgICovCisgICAgaW50IFZBTFVFX0VOVU1FUkFUSU9OID0gMTY7CisKKyAgICAvKioKKyAgICAgKiBUaGUgVkFMVUVfTElTVC4KKyAgICAgKi8KKyAgICBpbnQgVkFMVUVfTElTVCA9IDMyOworCisgICAgLyoqCisgICAgICogVGhlIFZBTFVFX1JBTkdFX01JTl9JTkNMVVNJVkUuCisgICAgICovCisgICAgaW50IFZBTFVFX1JBTkdFX01JTl9JTkNMVVNJVkUgPSBWQUxVRV9SQU5HRSB8IFZBTFVFX1JBTkdFX01JTl9JTkNMVVNJVkVfTUFTSzsKKworICAgIC8qKgorICAgICAqIFRoZSBWQUxVRV9SQU5HRV9NQVhfSU5DTFVTSVZFLgorICAgICAqLworICAgIGludCBWQUxVRV9SQU5HRV9NQVhfSU5DTFVTSVZFID0gVkFMVUVfUkFOR0UgfCBWQUxVRV9SQU5HRV9NQVhfSU5DTFVTSVZFX01BU0s7CisKKyAgICAvKioKKyAgICAgKiBUaGUgVkFMVUVfUkFOR0VfTUlOX01BWF9JTkNMVVNJVkUuCisgICAgICovCisgICAgaW50IFZBTFVFX1JBTkdFX01JTl9NQVhfSU5DTFVTSVZFID0gVkFMVUVfUkFOR0UgfCBWQUxVRV9SQU5HRV9NSU5fSU5DTFVTSVZFX01BU0sKKyAgICAgICAgICAgIHwgVkFMVUVfUkFOR0VfTUFYX0lOQ0xVU0lWRV9NQVNLOworCisgICAgLyoqCisgICAgICogVGVsbHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaXMgYWxsb3dlZCBmb3IgdGhlIHNwZWNpZmllZCBpbWFnZQorICAgICAqIHR5cGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnROYW1lIHRoZSBlbGVtZW50IG5hbWUKLSAgICAgKiBAcGFyYW0gaW1hZ2VUeXBlIHRoZSBpbWFnZSB0eXBlCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaXMgYWxsb3dlZCBmb3IgdGhlIHNwZWNpZmllZCAKLSAgICAgKiBpbWFnZSB0eXBlCisgICAgICogQHBhcmFtIGVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICB0aGUgZWxlbWVudCBuYW1lLgorICAgICAqIEBwYXJhbSBpbWFnZVR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbWFnZSB0eXBlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCBlbGVtZW50IGlzIGFsbG93ZWQgZm9yIHRoZSBzcGVjaWZpZWQgaW1hZ2UKKyAgICAgKiAgICAgICAgIHR5cGUuCiAgICAgICovCiAgICAgYm9vbGVhbiBjYW5Ob2RlQXBwZWFyKFN0cmluZyBlbGVtZW50TmFtZSwgSW1hZ2VUeXBlU3BlY2lmaWVyIGltYWdlVHlwZSk7CiAKICAgICAvKioKICAgICAgKiBHZXRzIGRhdGEgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBvZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnROYW1lIHRoZSBlbGVtZW50IG5hbWUKLSAgICAgKiBAcGFyYW0gYXR0ck5hbWUgdGhlIGF0dHJpYnV0ZSBuYW1lCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYXR0cmlidXRlJ3MgZGF0YSB0eXBlCisgICAgICogQHBhcmFtIGVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICB0aGUgZWxlbWVudCBuYW1lLgorICAgICAqIEBwYXJhbSBhdHRyTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGF0dHJpYnV0ZSBuYW1lLgorICAgICAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSdzIGRhdGEgdHlwZS4KICAgICAgKi8KICAgICBpbnQgZ2V0QXR0cmlidXRlRGF0YVR5cGUoU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgYXR0ck5hbWUpOwotICAgIAorCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBvZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuCisgICAgICogR2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBvZiB0aGUgc3BlY2lmaWVkCisgICAgICogZWxlbWVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIGVsZW1lbnQgbmFtZQotICAgICAqIEBwYXJhbSBhdHRyTmFtZSB0aGUgYXR0cmlidXRlIG5hbWUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUncyBkZWZhdWx0IHZhbHVlCisgICAgICogQHBhcmFtIGVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICB0aGUgZWxlbWVudCBuYW1lLgorICAgICAqIEBwYXJhbSBhdHRyTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGF0dHJpYnV0ZSBuYW1lLgorICAgICAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSdzIGRlZmF1bHQgdmFsdWUuCiAgICAgICovCiAgICAgU3RyaW5nIGdldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZShTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBhdHRyTmFtZSk7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSB1c2VyLWZyaWVuZGx5IGRlc2NyaXB0aW9uIG9mIHRoZSBhdHRyaWJ1dGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnROYW1lIHRoZSBlbGVtZW50IG5hbWUKLSAgICAgKiBAcGFyYW0gYXR0ck5hbWUgdGhlIGF0dHJpYnV0ZSBuYW1lCi0gICAgICogQHBhcmFtIGxvY2FsZSB0aGUgbG9jYWxlIGdpdmluZyB0aGUgZGVzaXJlZCBsYW5ndWFnZSBmb3IgdGhlCi0gICAgICogZGVzY3JpcHRpb24KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgZGVzY3JpcHRpb24KKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IG5hbWUuCisgICAgICogQHBhcmFtIGF0dHJOYW1lCisgICAgICogICAgICAgICAgICB0aGUgYXR0cmlidXRlIG5hbWUuCisgICAgICogQHBhcmFtIGxvY2FsZQorICAgICAqICAgICAgICAgICAgdGhlIGxvY2FsZSBnaXZpbmcgdGhlIGRlc2lyZWQgbGFuZ3VhZ2UgZm9yIHRoZSBkZXNjcmlwdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgZGVzY3JpcHRpb24uCiAgICAgICovCiAgICAgU3RyaW5nIGdldEF0dHJpYnV0ZURlc2NyaXB0aW9uKFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIGF0dHJOYW1lLCBMb2NhbGUgbG9jYWxlKTsKLSAgICAKKwogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGF0dHJpYnV0ZSBlbnVtZXJhdGlvbnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnROYW1lIHRoZSBlbGVtZW50IG5hbWUKLSAgICAgKiBAcGFyYW0gYXR0ck5hbWUgdGhlIGF0dHJpYnV0ZSBuYW1lCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYXR0cmlidXRlIGVudW1lcmF0aW9ucworICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgbmFtZS4KKyAgICAgKiBAcGFyYW0gYXR0ck5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBhdHRyaWJ1dGUgbmFtZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgZW51bWVyYXRpb25zLgogICAgICAqLwogICAgIFN0cmluZ1tdIGdldEF0dHJpYnV0ZUVudW1lcmF0aW9ucyhTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBhdHRyTmFtZSk7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgYXR0cmlidXRlIGxpc3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnROYW1lIHRoZSBlbGVtZW50IG5hbWUKLSAgICAgKiBAcGFyYW0gYXR0ck5hbWUgdGhlIGF0dHJpYnV0ZSBuYW1lCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIGF0dHJpYnV0ZSBsaXN0CisgICAgICogQHBhcmFtIGVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICB0aGUgZWxlbWVudCBuYW1lLgorICAgICAqIEBwYXJhbSBhdHRyTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGF0dHJpYnV0ZSBuYW1lLgorICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBhdHRyaWJ1dGUgbGlzdC4KICAgICAgKi8KICAgICBpbnQgZ2V0QXR0cmlidXRlTGlzdE1heExlbmd0aChTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBhdHRyTmFtZSk7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBtaW5pbXVtIGxlbmd0aCBvZiB0aGUgYXR0cmlidXRlIGxpc3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnROYW1lIHRoZSBlbGVtZW50IG5hbWUKLSAgICAgKiBAcGFyYW0gYXR0ck5hbWUgdGhlIGF0dHJpYnV0ZSBuYW1lCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWluaW11bSBsZW5ndGggb2YgdGhlIGF0dHJpYnV0ZSBsaXN0CisgICAgICogQHBhcmFtIGVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICB0aGUgZWxlbWVudCBuYW1lLgorICAgICAqIEBwYXJhbSBhdHRyTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGF0dHJpYnV0ZSBuYW1lLgorICAgICAqIEByZXR1cm4gdGhlIG1pbmltdW0gbGVuZ3RoIG9mIHRoZSBhdHRyaWJ1dGUgbGlzdC4KICAgICAgKi8KICAgICBpbnQgZ2V0QXR0cmlidXRlTGlzdE1pbkxlbmd0aChTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBhdHRyTmFtZSk7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBtYXhpbXVtIHZhbHVlIGFsbG93ZWQgZm9yIHRoZSBhdHRyaWJ1dGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnROYW1lIHRoZSBlbGVtZW50IG5hbWUKLSAgICAgKiBAcGFyYW0gYXR0ck5hbWUgdGhlIGF0dHJpYnV0ZSBuYW1lCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWF4aW11bSB2YWx1ZSBhbGxvd2VkIGZvciB0aGUgYXR0cmlidXRlCisgICAgICogQHBhcmFtIGVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICB0aGUgZWxlbWVudCBuYW1lLgorICAgICAqIEBwYXJhbSBhdHRyTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGF0dHJpYnV0ZSBuYW1lLgorICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0gdmFsdWUgYWxsb3dlZCBmb3IgdGhlIGF0dHJpYnV0ZS4KICAgICAgKi8KICAgICBTdHJpbmcgZ2V0QXR0cmlidXRlTWF4VmFsdWUoU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgYXR0ck5hbWUpOwotICAgIAorCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgbWluaW11bSB2YWx1ZSBhbGxvd2VkIGZvciB0aGUgYXR0cmlidXRlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSB0aGUgZWxlbWVudCBuYW1lCi0gICAgICogQHBhcmFtIGF0dHJOYW1lIHRoZSBhdHRyaWJ1dGUgbmFtZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1pbmltdW0gdmFsdWUgYWxsb3dlZCBmb3IgdGhlIGF0dHJpYnV0ZQorICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgbmFtZS4KKyAgICAgKiBAcGFyYW0gYXR0ck5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBhdHRyaWJ1dGUgbmFtZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBtaW5pbXVtIHZhbHVlIGFsbG93ZWQgZm9yIHRoZSBhdHRyaWJ1dGUuCiAgICAgICovCiAgICAgU3RyaW5nIGdldEF0dHJpYnV0ZU1pblZhbHVlKFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIGF0dHJOYW1lKTsKLSAgICAKKwogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGF0dHJpYnV0ZSBuYW1lcyBhbGxvd2VkIGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnROYW1lIHRoZSBlbGVtZW50IG5hbWUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgbmFtZXMKKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IG5hbWUuCisgICAgICogQHJldHVybiB0aGUgYXR0cmlidXRlIG5hbWVzLgogICAgICAqLwogICAgIFN0cmluZ1tdIGdldEF0dHJpYnV0ZU5hbWVzKFN0cmluZyBlbGVtZW50TmFtZSk7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBhdHRyaWJ1dGUgdmFsdWUgdHlwZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIGVsZW1lbnQgbmFtZQotICAgICAqIEBwYXJhbSBhdHRyTmFtZSB0aGUgYXR0cmlidXRlIG5hbWUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgdmFsdWUgdHlwZQorICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgbmFtZS4KKyAgICAgKiBAcGFyYW0gYXR0ck5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBhdHRyaWJ1dGUgbmFtZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgdmFsdWUgdHlwZS4KICAgICAgKi8KICAgICBpbnQgZ2V0QXR0cmlidXRlVmFsdWVUeXBlKFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIGF0dHJOYW1lKTsKLSAgICAKKwogICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIGlzIHJlcXVpcmVkIAotICAgICAqIGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgZm9yIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBlbGVtZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSB0aGUgZWxlbWVudCBuYW1lCi0gICAgICogQHBhcmFtIGF0dHJOYW1lIHRoZSBhdHRyaWJ1dGUgbmFtZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgZm9yIHRoZSAKLSAgICAgKiBzcGVjaWZpZWQgZWxlbWVudAorICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgbmFtZS4KKyAgICAgKiBAcGFyYW0gYXR0ck5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBhdHRyaWJ1dGUgbmFtZS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIGlzIHJlcXVpcmVkIGZvciB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICBlbGVtZW50LgogICAgICAqLwogICAgIGJvb2xlYW4gaXNBdHRyaWJ1dGVSZXF1aXJlZChTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBhdHRyTmFtZSk7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBuYW1lcyBvZiB0aGUgcG9zc2libGUgY2hpbGQgZWxlbWVudHMgZm9yIHRoZSBnaXZlbiBlbGVtZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSB0aGUgZWxlbWVudCBuYW1lCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY2hpbGQgbmFtZXMKKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IG5hbWUuCisgICAgICogQHJldHVybiB0aGUgY2hpbGQgbmFtZXMuCiAgICAgICovCiAgICAgU3RyaW5nW10gZ2V0Q2hpbGROYW1lcyhTdHJpbmcgZWxlbWVudE5hbWUpOwotICAgIAorCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgY29uc3RhbnQgZGVzY3JpYmluZyB0aGUgZWxlbWVudCdzIGNoaWxkIHBvbGljeS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIGVsZW1lbnQgbmFtZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNoaWxkIHBvbGljeQorICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgbmFtZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjaGlsZCBwb2xpY3kuCiAgICAgICovCiAgICAgaW50IGdldENoaWxkUG9saWN5KFN0cmluZyBlbGVtZW50TmFtZSk7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSB1c2VyLWZyaWVuZGx5IGRlc2NyaXB0aW9uIG9mIHRoZSBlbGVtZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSB0aGUgZWxlbWVudCBuYW1lCi0gICAgICogQHBhcmFtIGxvY2FsZSB0aGUgbG9jYWxlIGdpdmluZyB0aGUgZGVzaXJlZCBsYW5ndWFnZSBmb3IgdGhlCi0gICAgICogZGVzY3JpcHRpb24KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50IGRlc2NyaXB0aW9uCisgICAgICogQHBhcmFtIGVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICB0aGUgZWxlbWVudCBuYW1lLgorICAgICAqIEBwYXJhbSBsb2NhbGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBsb2NhbGUgZ2l2aW5nIHRoZSBkZXNpcmVkIGxhbmd1YWdlIGZvciB0aGUgZGVzY3JpcHRpb24uCisgICAgICogQHJldHVybiB0aGUgZWxlbWVudCBkZXNjcmlwdGlvbi4KICAgICAgKi8KICAgICBTdHJpbmcgZ2V0RWxlbWVudERlc2NyaXB0aW9uKFN0cmluZyBlbGVtZW50TmFtZSwgTG9jYWxlIGxvY2FsZSk7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGlsZHJlbiBhbGxvd2VkIGZvciB0aGUgZWxlbWVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIGVsZW1lbnQgbmFtZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoaWxkcmVuIGFsbG93ZWQgZm9yIHRoZSBlbGVtZW50CisgICAgICogQHBhcmFtIGVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICB0aGUgZWxlbWVudCBuYW1lLgorICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoaWxkcmVuIGFsbG93ZWQgZm9yIHRoZSBlbGVtZW50LgogICAgICAqLwogICAgIGludCBnZXRFbGVtZW50TWF4Q2hpbGRyZW4oU3RyaW5nIGVsZW1lbnROYW1lKTsKLSAgICAKKwogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGNoaWxkcmVuIGFsbG93ZWQgZm9yIHRoZSBlbGVtZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSB0aGUgZWxlbWVudCBuYW1lCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWluaW11bSBudW1iZXIgb2YgY2hpbGRyZW4gYWxsb3dlZCBmb3IgdGhlIGVsZW1lbnQKKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IG5hbWUuCisgICAgICogQHJldHVybiB0aGUgbWluaW11bSBudW1iZXIgb2YgY2hpbGRyZW4gYWxsb3dlZCBmb3IgdGhlIGVsZW1lbnQuCiAgICAgICovCiAgICAgaW50IGdldEVsZW1lbnRNaW5DaGlsZHJlbihTdHJpbmcgZWxlbWVudE5hbWUpOwogCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgbWF4aW11bSBvYmplY3QgYXJyYXkgbGVuZ3RoIGFsbG93ZWQgZm9yIHRoZSBlbGVtZW50LgogICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSB0aGUgZWxlbWVudCBuYW1lCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWF4aW11bSBvYmplY3QgYXJyYXkgbGVuZ3RoIGFsbG93ZWQgZm9yIHRoZSBlbGVtZW50CisgICAgICogQHBhcmFtIGVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICB0aGUgZWxlbWVudCBuYW1lLgorICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0gb2JqZWN0IGFycmF5IGxlbmd0aCBhbGxvd2VkIGZvciB0aGUgZWxlbWVudC4KICAgICAgKi8KICAgICBpbnQgZ2V0T2JqZWN0QXJyYXlNYXhMZW5ndGgoU3RyaW5nIGVsZW1lbnROYW1lKTsKLSAgICAKKwogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG1pbmltdW0gb2JqZWN0IGFycmF5IGxlbmd0aCBhbGxvd2VkIGZvciB0aGUgZWxlbWVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIGVsZW1lbnQgbmFtZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1pbmltdW0gb2JqZWN0IGFycmF5IGxlbmd0aCBhbGxvd2VkIGZvciB0aGUgZWxlbWVudAorICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgbmFtZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBtaW5pbXVtIG9iamVjdCBhcnJheSBsZW5ndGggYWxsb3dlZCBmb3IgdGhlIGVsZW1lbnQuCiAgICAgICovCiAgICAgaW50IGdldE9iamVjdEFycmF5TWluTGVuZ3RoKFN0cmluZyBlbGVtZW50TmFtZSk7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBvYmplY3QgY2xhc3MgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnROYW1lIHRoZSBlbGVtZW50IG5hbWUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgY2xhc3MgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGVsZW1lbnQKKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IG5hbWUuCisgICAgICogQHJldHVybiB0aGUgb2JqZWN0IGNsYXNzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBlbGVtZW50LgogICAgICAqLwogICAgIENsYXNzPD8+IGdldE9iamVjdENsYXNzKFN0cmluZyBlbGVtZW50TmFtZSk7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBvYmplY3QgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGVsZW1lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnROYW1lIHRoZSBlbGVtZW50IG5hbWUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGVsZW1lbnQKKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IG5hbWUuCisgICAgICogQHJldHVybiB0aGUgb2JqZWN0IGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBlbGVtZW50LgogICAgICAqLwogICAgIE9iamVjdCBnZXRPYmplY3REZWZhdWx0VmFsdWUoU3RyaW5nIGVsZW1lbnROYW1lKTsKLSAgICAKKwogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG9iamVjdCBlbnVtZXJhdGlvbnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnROYW1lIHRoZSBlbGVtZW50IG5hbWUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgZW51bWVyYXRpb25zCisgICAgICogQHBhcmFtIGVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICB0aGUgZWxlbWVudCBuYW1lLgorICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCBlbnVtZXJhdGlvbnMuCiAgICAgICovCiAgICAgT2JqZWN0W10gZ2V0T2JqZWN0RW51bWVyYXRpb25zKFN0cmluZyBlbGVtZW50TmFtZSk7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBtYXhpbXVtIHZhbHVlIGFsbG93ZWQgZm9yIHRoZSBlbGVtZW50J3Mgb2JqZWN0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSB0aGUgZWxlbWVudCBuYW1lCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWF4aW11bSB2YWx1ZSBhbGxvd2VkIGZvciB0aGUgZWxlbWVudCdzIG9iamVjdAorICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgbmFtZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIHZhbHVlIGFsbG93ZWQgZm9yIHRoZSBlbGVtZW50J3Mgb2JqZWN0LgogICAgICAqLwogICAgIENvbXBhcmFibGU8Pz4gZ2V0T2JqZWN0TWF4VmFsdWUoU3RyaW5nIGVsZW1lbnROYW1lKTsKLSAgICAKKwogICAgIC8qKgogICAgICAqIEdldHMgdGhlIG1pbmltdW0gdmFsdWUgYWxsb3dlZCBmb3IgdGhlIGVsZW1lbnQncyBvYmplY3QuCiAgICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnROYW1lIHRoZSBlbGVtZW50IG5hbWUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtaW5pbXVtIHZhbHVlIGFsbG93ZWQgZm9yIHRoZSBlbGVtZW50J3Mgb2JqZWN0CisgICAgICogQHBhcmFtIGVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICB0aGUgZWxlbWVudCBuYW1lLgorICAgICAqIEByZXR1cm4gdGhlIG1pbmltdW0gdmFsdWUgYWxsb3dlZCBmb3IgdGhlIGVsZW1lbnQncyBvYmplY3QuCiAgICAgICovCiAgICAgQ29tcGFyYWJsZTw/PiBnZXRPYmplY3RNaW5WYWx1ZShTdHJpbmcgZWxlbWVudE5hbWUpOwotICAgIAorCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgY29uc3RhbnQgdGhhdCBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnQncyB2YWx1ZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIGVsZW1lbnQgbmFtZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvbnN0YW50IHRoYXQgaW5kaWNhdGVzIHRoZSB0eXBlIG9mIHRoZSBlbGVtZW50J3MgdmFsdWUKKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IG5hbWUuCisgICAgICogQHJldHVybiB0aGUgY29uc3RhbnQgdGhhdCBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnQncyB2YWx1ZS4KICAgICAgKi8KICAgICBpbnQgZ2V0T2JqZWN0VmFsdWVUeXBlKFN0cmluZyBlbGVtZW50TmFtZSk7CiAKICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSByb290IGVsZW1lbnQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgcm9vdCBlbGVtZW50CisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgcm9vdCBlbGVtZW50LgogICAgICAqLwogICAgIFN0cmluZyBnZXRSb290TmFtZSgpOwogfQpkaWZmIC0tZ2l0IGEvYXd0L2phdmF4L2ltYWdlaW8vbWV0YWRhdGEvSUlPTWV0YWRhdGFGb3JtYXRJbXBsLmphdmEgYi9hd3QvamF2YXgvaW1hZ2Vpby9tZXRhZGF0YS9JSU9NZXRhZGF0YUZvcm1hdEltcGwuamF2YQppbmRleCA0MzhhZTkwLi4xYTZlNTY4IDEwMDY0NAotLS0gYS9hd3QvamF2YXgvaW1hZ2Vpby9tZXRhZGF0YS9JSU9NZXRhZGF0YUZvcm1hdEltcGwuamF2YQorKysgYi9hd3QvamF2YXgvaW1hZ2Vpby9tZXRhZGF0YS9JSU9NZXRhZGF0YUZvcm1hdEltcGwuamF2YQpAQCAtMjMsNDUgKzIzLDYwIEBACiBpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwogCiAvKioKLSAqIFRoZSBJSU9NZXRhZGF0YUZvcm1hdEltcGwgY2xhc3MgcHJvdmlkZXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIAorICogVGhlIElJT01ldGFkYXRhRm9ybWF0SW1wbCBjbGFzcyBwcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKICAqIElJT01ldGFkYXRhRm9ybWF0IGludGVyZmFjZS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBJSU9NZXRhZGF0YUZvcm1hdEltcGwgaW1wbGVtZW50cyBJSU9NZXRhZGF0YUZvcm1hdCB7Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBzdGFuZGFyZE1ldGFkYXRhRm9ybWF0TmFtZS4gKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IkNvbnN0YW50RGVjbGFyZWRJbkFic3RyYWN0Q2xhc3MifSkKKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBzdGFuZGFyZE1ldGFkYXRhRm9ybWF0TmFtZS4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncyggeworICAgICAgICAiQ29uc3RhbnREZWNsYXJlZEluQWJzdHJhY3RDbGFzcyIKKyAgICB9KQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHN0YW5kYXJkTWV0YWRhdGFGb3JtYXROYW1lID0gImphdmF4X2ltYWdlaW9fMS4wIjsKIAotICAgIC8qKiBUaGUgc3RhbmRhcmQgZm9ybWF0LiAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiU3RhdGljTm9uRmluYWxGaWVsZCJ9KQorICAgIC8qKgorICAgICAqIFRoZSBzdGFuZGFyZCBmb3JtYXQuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoIHsKKyAgICAgICAgIlN0YXRpY05vbkZpbmFsRmllbGQiCisgICAgfSkKICAgICBwcml2YXRlIHN0YXRpYyBJSU9NZXRhZGF0YUZvcm1hdEltcGwgc3RhbmRhcmRGb3JtYXQ7CiAKLSAgICAvKiogVGhlIHJvb3QgbmFtZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgcm9vdCBuYW1lLgorICAgICAqLwogICAgIHByaXZhdGUgU3RyaW5nIHJvb3ROYW1lOwotICAgIAotICAgIC8qKiBUaGUgZWxlbWVudCBoYXNoLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGVsZW1lbnQgaGFzaC4KKyAgICAgKi8KICAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBFbGVtZW50PiBlbGVtZW50SGFzaCA9IG5ldyBIYXNoTWFwPFN0cmluZywgRWxlbWVudD4oKTsKIAotICAgIC8qKiBUaGUgcmVzb3VyY2UgYmFzZSBuYW1lLiAqLworICAgIC8qKgorICAgICAqIFRoZSByZXNvdXJjZSBiYXNlIG5hbWUuCisgICAgICovCiAgICAgcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2VCYXNlTmFtZSA9IGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIlJlc291cmNlcyI7CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYW4gSUlPTWV0YWRhdGFGb3JtYXRJbXBsIHdpdGggdGhlIHNwZWNpZmllZCByb290Ci0gICAgICogbmFtZSBhbmQgY2hpbGQgcG9saWN5IChub3QgQ0hJTERfUE9MSUNZX1JFUEVBVCkuCisgICAgICogSW5zdGFudGlhdGVzIGFuIElJT01ldGFkYXRhRm9ybWF0SW1wbCB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdCBuYW1lIGFuZAorICAgICAqIGNoaWxkIHBvbGljeSAobm90IENISUxEX1BPTElDWV9SRVBFQVQpLgogICAgICAqIAotICAgICAqIEBwYXJhbSByb290TmFtZSB0aGUgbmFtZSBvZiByb290IGVsZW1lbnQuCi0gICAgICogQHBhcmFtIGNoaWxkUG9saWN5IHRoZSBjaGlsZCBwb2xpY3kgZGVmaW5lZCBieSBvbmUgb2YgdGhlIAotICAgICAqIENISUxEX1BPTElDWV8qIGNvbnN0YW50cyAgKGV4Y2VwdCBDSElMRF9QT0xJQ1lfUkVQRUFUKS4KKyAgICAgKiBAcGFyYW0gcm9vdE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHJvb3QgZWxlbWVudC4KKyAgICAgKiBAcGFyYW0gY2hpbGRQb2xpY3kKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGlsZCBwb2xpY3kgZGVmaW5lZCBieSBvbmUgb2YgdGhlIENISUxEX1BPTElDWV8qCisgICAgICogICAgICAgICAgICBjb25zdGFudHMgKGV4Y2VwdCBDSElMRF9QT0xJQ1lfUkVQRUFUKS4KICAgICAgKi8KICAgICBwdWJsaWMgSUlPTWV0YWRhdGFGb3JtYXRJbXBsKFN0cmluZyByb290TmFtZSwgaW50IGNoaWxkUG9saWN5KSB7CiAgICAgICAgIGlmIChyb290TmFtZSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb290TmFtZSBpcyBudWxsIik7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgIGNoaWxkUG9saWN5IDwgQ0hJTERfUE9MSUNZX0VNUFRZIHx8Ci0gICAgICAgICAgICAgICAgY2hpbGRQb2xpY3kgPiBDSElMRF9QT0xJQ1lfTUFYIHx8Ci0gICAgICAgICAgICAgICAgY2hpbGRQb2xpY3kgPT0gQ0hJTERfUE9MSUNZX1JFUEVBVAotICAgICAgICApIHsKKyAgICAgICAgaWYgKGNoaWxkUG9saWN5IDwgQ0hJTERfUE9MSUNZX0VNUFRZIHx8IGNoaWxkUG9saWN5ID4gQ0hJTERfUE9MSUNZX01BWAorICAgICAgICAgICAgICAgIHx8IGNoaWxkUG9saWN5ID09IENISUxEX1BPTElDWV9SRVBFQVQpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNoaWxkUG9saWN5IGlzIG5vdCBvbmUgb2YgdGhlIHByZWRlZmluZWQgY29uc3RhbnRzIik7CiAgICAgICAgIH0KIApAQCAtNzMsMTIgKzg4LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGFuIElJT01ldGFkYXRhRm9ybWF0SW1wbCB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdAotICAgICAqIG5hbWUgYW5kIENISUxEX1BPTElDWV9SRVBFQVQgY2hpbGQgcG9saWN5LgorICAgICAqIEluc3RhbnRpYXRlcyBhbiBJSU9NZXRhZGF0YUZvcm1hdEltcGwgd2l0aCB0aGUgc3BlY2lmaWVkIHJvb3QgbmFtZSBhbmQKKyAgICAgKiBDSElMRF9QT0xJQ1lfUkVQRUFUIGNoaWxkIHBvbGljeS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcm9vdE5hbWUgdGhlIG5hbWUgb2Ygcm9vdCBlbGVtZW50LgotICAgICAqIEBwYXJhbSBtaW5DaGlsZHJlbiB0aGUgbWluaW11bSBudW1iZXIgb2YgY2hpbGRyZW4uCi0gICAgICogQHBhcmFtIG1heENoaWxkcmVuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGlsZHJlbgorICAgICAqIEBwYXJhbSByb290TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2Ygcm9vdCBlbGVtZW50LgorICAgICAqIEBwYXJhbSBtaW5DaGlsZHJlbgorICAgICAqICAgICAgICAgICAgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGNoaWxkcmVuLgorICAgICAqIEBwYXJhbSBtYXhDaGlsZHJlbgorICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoaWxkcmVuCiAgICAgICovCiAgICAgcHVibGljIElJT01ldGFkYXRhRm9ybWF0SW1wbChTdHJpbmcgcm9vdE5hbWUsIGludCBtaW5DaGlsZHJlbiwgaW50IG1heENoaWxkcmVuKSB7CiAgICAgICAgIGlmIChyb290TmFtZSA9PSBudWxsKSB7CkBAIC0xMDAsMjUgKzExOCwzMSBAQAogICAgICAgICBlbGVtZW50SGFzaC5wdXQocm9vdE5hbWUsIHJvb3QpOwogICAgIH0KIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiQWJzdHJhY3RNZXRob2RPdmVycmlkZXNBYnN0cmFjdE1ldGhvZCJ9KQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCB7CisgICAgICAgICJBYnN0cmFjdE1ldGhvZE92ZXJyaWRlc0Fic3RyYWN0TWV0aG9kIgorICAgIH0pCiAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gY2FuTm9kZUFwcGVhcihTdHJpbmcgZWxlbWVudE5hbWUsIEltYWdlVHlwZVNwZWNpZmllciBpbWFnZVR5cGUpOwogCiAgICAgLyoqCiAgICAgICogQWRkcyBhIG5ldyBhdHRyaWJ1dGUgdG8gYW4gZXhpc3RpbmcgZWxlbWVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gd2hpY2ggdGhlIG5ldyBhdHRyaWJ1dGUKLSAgICAgKiB3aWxsIGJlIGFkZGVkLgotICAgICAqIEBwYXJhbSBhdHRyTmFtZSB0aGUgYXR0cmlidXRlIG5hbWUuCi0gICAgICogQHBhcmFtIGRhdGFUeXBlIHRoZSBkYXRhIHR5cGUgb2YgdGhlIG5ldyBhdHRyaWJ1dGUuCi0gICAgICogQHBhcmFtIHJlcXVpcmVkIHRoZSBmbGFnIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgYXR0cmlidXRlCi0gICAgICogbXVzdCBiZSBwcmVzZW50LgotICAgICAqIEBwYXJhbSBsaXN0TWluTGVuZ3RoIHRoZSBtaW5pbXVtIGxlZ2FsIG51bWJlciBvZiBsaXN0IGl0ZW1zLgotICAgICAqIEBwYXJhbSBsaXN0TWF4TGVuZ3RoIHRoZSB0aGUgbWF4aW11bSBsZWdhbCBudW1iZXIgb2YgbGlzdCBpdGVtcy4KKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRvIHdoaWNoIHRoZSBuZXcgYXR0cmlidXRlIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgIGFkZGVkLgorICAgICAqIEBwYXJhbSBhdHRyTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGF0dHJpYnV0ZSBuYW1lLgorICAgICAqIEBwYXJhbSBkYXRhVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGRhdGEgdHlwZSBvZiB0aGUgbmV3IGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gcmVxdWlyZWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbGFnIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgYXR0cmlidXRlIG11c3QgYmUKKyAgICAgKiAgICAgICAgICAgIHByZXNlbnQuCisgICAgICogQHBhcmFtIGxpc3RNaW5MZW5ndGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBtaW5pbXVtIGxlZ2FsIG51bWJlciBvZiBsaXN0IGl0ZW1zLgorICAgICAqIEBwYXJhbSBsaXN0TWF4TGVuZ3RoCisgICAgICogICAgICAgICAgICB0aGUgdGhlIG1heGltdW0gbGVnYWwgbnVtYmVyIG9mIGxpc3QgaXRlbXMuCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlKAotICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgYXR0ck5hbWUsIGludCBkYXRhVHlwZSwKLSAgICAgICAgICAgIGJvb2xlYW4gcmVxdWlyZWQsIGludCBsaXN0TWluTGVuZ3RoLCBpbnQgbGlzdE1heExlbmd0aAotICAgICkgeworICAgIHByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZShTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBhdHRyTmFtZSwgaW50IGRhdGFUeXBlLAorICAgICAgICAgICAgYm9vbGVhbiByZXF1aXJlZCwgaW50IGxpc3RNaW5MZW5ndGgsIGludCBsaXN0TWF4TGVuZ3RoKSB7CiAgICAgICAgIGlmIChhdHRyTmFtZSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhdHRyTmFtZSA9PSBudWxsISIpOwogICAgICAgICB9CkBAIC0xNDQsMTggKzE2OCwyMSBAQAogICAgIC8qKgogICAgICAqIEFkZHMgYSBuZXcgYXR0cmlidXRlIHRvIGFuIGV4aXN0aW5nIGVsZW1lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnROYW1lIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRvIHdoaWNoIHRoZSBuZXcgYXR0cmlidXRlCi0gICAgICogd2lsbCBiZSBhZGRlZC4KLSAgICAgKiBAcGFyYW0gYXR0ck5hbWUgdGhlIGF0dHJpYnV0ZSBuYW1lLgotICAgICAqIEBwYXJhbSBkYXRhVHlwZSB0aGUgZGF0YSB0eXBlIG9mIHRoZSBuZXcgYXR0cmlidXRlLgotICAgICAqIEBwYXJhbSByZXF1aXJlZCB0aGUgZmxhZyB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIGF0dHJpYnV0ZQotICAgICAqIG11c3QgYmUgcHJlc2VudC4KLSAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIGVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0byB3aGljaCB0aGUgbmV3IGF0dHJpYnV0ZSB3aWxsIGJlCisgICAgICogICAgICAgICAgICBhZGRlZC4KKyAgICAgKiBAcGFyYW0gYXR0ck5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBhdHRyaWJ1dGUgbmFtZS4KKyAgICAgKiBAcGFyYW0gZGF0YVR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIHR5cGUgb2YgdGhlIG5ldyBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIHJlcXVpcmVkCisgICAgICogICAgICAgICAgICB0aGUgZmxhZyB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIGF0dHJpYnV0ZSBtdXN0IGJlCisgICAgICogICAgICAgICAgICBwcmVzZW50LgorICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlKAotICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgYXR0ck5hbWUsIGludCBkYXRhVHlwZSwKLSAgICAgICAgICAgIGJvb2xlYW4gcmVxdWlyZWQsIFN0cmluZyBkZWZhdWx0VmFsdWUKLSAgICApIHsKKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGUoU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgYXR0ck5hbWUsIGludCBkYXRhVHlwZSwKKyAgICAgICAgICAgIGJvb2xlYW4gcmVxdWlyZWQsIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKICAgICAgICAgaWYgKGF0dHJOYW1lID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImF0dHJOYW1lID09IG51bGwhIik7CiAgICAgICAgIH0KQEAgLTE3NywyMCArMjA0LDIzIEBACiAgICAgLyoqCiAgICAgICogQWRkcyBhIG5ldyBhdHRyaWJ1dGUgdG8gYW4gZXhpc3RpbmcgZWxlbWVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gd2hpY2ggdGhlIG5ldyBhdHRyaWJ1dGUKLSAgICAgKiB3aWxsIGJlIGFkZGVkLgotICAgICAqIEBwYXJhbSBhdHRyTmFtZSB0aGUgYXR0cmlidXRlIG5hbWUuCi0gICAgICogQHBhcmFtIGRhdGFUeXBlIHRoZSBkYXRhIHR5cGUgb2YgdGhlIG5ldyBhdHRyaWJ1dGUuCi0gICAgICogQHBhcmFtIHJlcXVpcmVkIHRoZSBmbGFnIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgYXR0cmlidXRlCi0gICAgICogbXVzdCBiZSBwcmVzZW50LgotICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS4KLSAgICAgKiBAcGFyYW0gZW51bWVyYXRlZFZhbHVlcyB0aGUgbGVnYWwgdmFsdWVzIGZvciB0aGUgYXR0cmlidXRlIGFzIAotICAgICAqIGEgbGlzdCBvZiBzdHJpbmdzLgorICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gd2hpY2ggdGhlIG5ldyBhdHRyaWJ1dGUgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgYWRkZWQuCisgICAgICogQHBhcmFtIGF0dHJOYW1lCisgICAgICogICAgICAgICAgICB0aGUgYXR0cmlidXRlIG5hbWUuCisgICAgICogQHBhcmFtIGRhdGFUeXBlCisgICAgICogICAgICAgICAgICB0aGUgZGF0YSB0eXBlIG9mIHRoZSBuZXcgYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSByZXF1aXJlZAorICAgICAqICAgICAgICAgICAgdGhlIGZsYWcgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBhdHRyaWJ1dGUgbXVzdCBiZQorICAgICAqICAgICAgICAgICAgcHJlc2VudC4KKyAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSBlbnVtZXJhdGVkVmFsdWVzCisgICAgICogICAgICAgICAgICB0aGUgbGVnYWwgdmFsdWVzIGZvciB0aGUgYXR0cmlidXRlIGFzIGEgbGlzdCBvZiBzdHJpbmdzLgogICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZSgKLSAgICAgICAgICAgIFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIGF0dHJOYW1lLCBpbnQgZGF0YVR5cGUsCi0gICAgICAgICAgICBib29sZWFuIHJlcXVpcmVkLCBTdHJpbmcgZGVmYXVsdFZhbHVlLCBMaXN0PFN0cmluZz4gZW51bWVyYXRlZFZhbHVlcwotICAgICkgeworICAgIHByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZShTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBhdHRyTmFtZSwgaW50IGRhdGFUeXBlLAorICAgICAgICAgICAgYm9vbGVhbiByZXF1aXJlZCwgU3RyaW5nIGRlZmF1bHRWYWx1ZSwgTGlzdDxTdHJpbmc+IGVudW1lcmF0ZWRWYWx1ZXMpIHsKICAgICAgICAgaWYgKGF0dHJOYW1lID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImF0dHJOYW1lID09IG51bGwhIik7CiAgICAgICAgIH0KQEAgLTIyNiwyNiArMjU2LDMwIEBACiAgICAgLyoqCiAgICAgICogQWRkcyBhIG5ldyBhdHRyaWJ1dGUgdG8gYW4gZXhpc3RpbmcgZWxlbWVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gd2hpY2ggdGhlIG5ldyBhdHRyaWJ1dGUKLSAgICAgKiB3aWxsIGJlIGFkZGVkLgotICAgICAqIEBwYXJhbSBhdHRyTmFtZSB0aGUgYXR0cmlidXRlIG5hbWUuCi0gICAgICogQHBhcmFtIGRhdGFUeXBlIHRoZSBkYXRhIHR5cGUgb2YgdGhlIG5ldyBhdHRyaWJ1dGUuCi0gICAgICogQHBhcmFtIHJlcXVpcmVkIHRoZSBmbGFnIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgYXR0cmlidXRlCi0gICAgICogbXVzdCBiZSBwcmVzZW50LgotICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYXR0cmlidXRlLgotICAgICAqIEBwYXJhbSBtaW5WYWx1ZSB0aGUgbWluaW11bSBsZWdhbCB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUuCi0gICAgICogQHBhcmFtIG1heFZhbHVlIHRoZSBtYXhpbXVtIGxlZ2FsIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZS4KLSAgICAgKiBAcGFyYW0gbWluSW5jbHVzaXZlIHRoZSBmbGFnIHdoaWNoIGluZGljYXRlcyAgCi0gICAgICogd2hldGhlciB0aGUgbWluVmFsdWUgaXMgaW5jbHVzaXZlLgotICAgICAqIEBwYXJhbSBtYXhJbmNsdXNpdmUgdGhlIGZsYWcgd2hpY2ggaW5kaWNhdGVzICAKLSAgICAgKiB3aGV0aGVyIHRoZSBtYXhWYWx1ZSBpcyBpbmNsdXNpdmUuCisgICAgICogQHBhcmFtIGVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0byB3aGljaCB0aGUgbmV3IGF0dHJpYnV0ZSB3aWxsIGJlCisgICAgICogICAgICAgICAgICBhZGRlZC4KKyAgICAgKiBAcGFyYW0gYXR0ck5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBhdHRyaWJ1dGUgbmFtZS4KKyAgICAgKiBAcGFyYW0gZGF0YVR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhIHR5cGUgb2YgdGhlIG5ldyBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIHJlcXVpcmVkCisgICAgICogICAgICAgICAgICB0aGUgZmxhZyB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIGF0dHJpYnV0ZSBtdXN0IGJlCisgICAgICogICAgICAgICAgICBwcmVzZW50LgorICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gbWluVmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBtaW5pbXVtIGxlZ2FsIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gbWF4VmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIGxlZ2FsIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gbWluSW5jbHVzaXZlCisgICAgICogICAgICAgICAgICB0aGUgZmxhZyB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgbWluVmFsdWUgaXMgaW5jbHVzaXZlLgorICAgICAqIEBwYXJhbSBtYXhJbmNsdXNpdmUKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbGFnIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHRoZSBtYXhWYWx1ZSBpcyBpbmNsdXNpdmUuCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlKAotICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgYXR0ck5hbWUsIGludCBkYXRhVHlwZSwKLSAgICAgICAgICAgIGJvb2xlYW4gcmVxdWlyZWQsIFN0cmluZyBkZWZhdWx0VmFsdWUsCi0gICAgICAgICAgICBTdHJpbmcgbWluVmFsdWUsIFN0cmluZyBtYXhWYWx1ZSwKLSAgICAgICAgICAgIGJvb2xlYW4gbWluSW5jbHVzaXZlLCBib29sZWFuIG1heEluY2x1c2l2ZQotICAgICkgeworICAgIHByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZShTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBhdHRyTmFtZSwgaW50IGRhdGFUeXBlLAorICAgICAgICAgICAgYm9vbGVhbiByZXF1aXJlZCwgU3RyaW5nIGRlZmF1bHRWYWx1ZSwgU3RyaW5nIG1pblZhbHVlLCBTdHJpbmcgbWF4VmFsdWUsCisgICAgICAgICAgICBib29sZWFuIG1pbkluY2x1c2l2ZSwgYm9vbGVhbiBtYXhJbmNsdXNpdmUpIHsKICAgICAgICAgaWYgKGF0dHJOYW1lID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImF0dHJOYW1lID09IG51bGwhIik7CiAgICAgICAgIH0KQEAgLTI3MiwyMCArMzA2LDIxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQWRkcyBhIG5ldyBhdHRyaWJ1dGUgd2l0aCBib29sZWFuIGRhdGEgdHlwZSB0byBhbiBleGlzdGluZyAKLSAgICAgKiBlbGVtZW50LgorICAgICAqIEFkZHMgYSBuZXcgYXR0cmlidXRlIHdpdGggYm9vbGVhbiBkYXRhIHR5cGUgdG8gYW4gZXhpc3RpbmcgZWxlbWVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gd2hpY2ggdGhlIG5ldyBhdHRyaWJ1dGUKLSAgICAgKiB3aWxsIGJlIGFkZGVkLgotICAgICAqIEBwYXJhbSBhdHRyTmFtZSB0aGUgYXR0cmlidXRlIG5hbWUuCi0gICAgICogQHBhcmFtIGhhc0RlZmF1bHRWYWx1ZSB0aGUgZmxhZyB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIGF0dHJpYnV0ZQotICAgICAqIG11c3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUuCi0gICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRvIHdoaWNoIHRoZSBuZXcgYXR0cmlidXRlIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgIGFkZGVkLgorICAgICAqIEBwYXJhbSBhdHRyTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGF0dHJpYnV0ZSBuYW1lLgorICAgICAqIEBwYXJhbSBoYXNEZWZhdWx0VmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbGFnIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgYXR0cmlidXRlIG11c3QgaGF2ZSBhCisgICAgICogICAgICAgICAgICBkZWZhdWx0IHZhbHVlLgorICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHZhbHVlLgogICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZEJvb2xlYW5BdHRyaWJ1dGUoCi0gICAgICAgICAgICBTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBhdHRyTmFtZSwKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzRGVmYXVsdFZhbHVlLCBib29sZWFuIGRlZmF1bHRWYWx1ZQotICAgICkgeworICAgIHByb3RlY3RlZCB2b2lkIGFkZEJvb2xlYW5BdHRyaWJ1dGUoU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgYXR0ck5hbWUsCisgICAgICAgICAgICBib29sZWFuIGhhc0RlZmF1bHRWYWx1ZSwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKICAgICAgICAgU3RyaW5nIGRlZmF1bHRWYWwgPSBoYXNEZWZhdWx0VmFsdWUgPyAoZGVmYXVsdFZhbHVlID8gIlRSVUUiIDogIkZBTFNFIikgOiBudWxsOwogICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oMik7CiAgICAgICAgIHZhbHVlcy5hZGQoIlRSVUUiKTsKQEAgLTI5NSwxMSArMzMwLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQWRkcyBhbiBleGlzdGluZyBlbGVtZW50IHRvIHRoZSBsaXN0IG9mIGNoaWxkIGVsZW1lbnRzIAotICAgICAqIG9mIHRoZSBzcGVjaWZpZWQgcGFyZW50IGVsZW1lbnQuCisgICAgICogQWRkcyBhbiBleGlzdGluZyBlbGVtZW50IHRvIHRoZSBsaXN0IG9mIGNoaWxkIGVsZW1lbnRzIG9mIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBwYXJlbnQgZWxlbWVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gYmUgYWRkZWQuCi0gICAgICogQHBhcmFtIHBhcmVudE5hbWUgdGhlIHBhcmVudCBlbGVtZW50IG5hbWUuCisgICAgICogQHBhcmFtIGVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0byBiZSBhZGRlZC4KKyAgICAgKiBAcGFyYW0gcGFyZW50TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHBhcmVudCBlbGVtZW50IG5hbWUuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRFbGVtZW50KFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIHBhcmVudE5hbWUpIHsKICAgICAgICAgRWxlbWVudCBwYXJlbnQgPSBmaW5kRWxlbWVudChwYXJlbnROYW1lKTsKQEAgLTMwOCwyMyArMzQ1LDIzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQWRkcyBhIG5ldyBlbGVtZW50IHR5cGUgdG8gdGhpcyBJSU9NZXRhZGF0YUZvcm1hdCB3aXRoIAotICAgICAqIGEgY2hpbGQgcG9saWN5IChpZiBwb2xpY3kgaXMgbm90IENISUxEX1BPTElDWV9SRVBFQVQpLgorICAgICAqIEFkZHMgYSBuZXcgZWxlbWVudCB0eXBlIHRvIHRoaXMgSUlPTWV0YWRhdGFGb3JtYXQgd2l0aCBhIGNoaWxkIHBvbGljeSAoaWYKKyAgICAgKiBwb2xpY3kgaXMgbm90IENISUxEX1BPTElDWV9SRVBFQVQpLgogICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0byBiZSBhZGRlZC4KLSAgICAgKiBAcGFyYW0gcGFyZW50TmFtZSB0aGUgcGFyZW50IGVsZW1lbnQgbmFtZS4KLSAgICAgKiBAcGFyYW0gY2hpbGRQb2xpY3kgb25lIG9mIHRoZSBDSElMRF9QT0xJQ1lfKiBjb25zdGFudHMgZGVmaW5lZAotICAgICAqIGJ5IElJT01ldGFkYXRhRm9ybWF0LgorICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gYmUgYWRkZWQuCisgICAgICogQHBhcmFtIHBhcmVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgZWxlbWVudCBuYW1lLgorICAgICAqIEBwYXJhbSBjaGlsZFBvbGljeQorICAgICAqICAgICAgICAgICAgb25lIG9mIHRoZSBDSElMRF9QT0xJQ1lfKiBjb25zdGFudHMgZGVmaW5lZCBieQorICAgICAqICAgICAgICAgICAgSUlPTWV0YWRhdGFGb3JtYXQuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgYWRkRWxlbWVudChTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBwYXJlbnROYW1lLCBpbnQgY2hpbGRQb2xpY3kpIHsKLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgIGNoaWxkUG9saWN5IDwgQ0hJTERfUE9MSUNZX0VNUFRZIHx8Ci0gICAgICAgICAgICAgICAgY2hpbGRQb2xpY3kgPiBDSElMRF9QT0xJQ1lfTUFYIHx8Ci0gICAgICAgICAgICAgICAgY2hpbGRQb2xpY3kgPT0gQ0hJTERfUE9MSUNZX1JFUEVBVAotICAgICAgICApIHsKKyAgICAgICAgaWYgKGNoaWxkUG9saWN5IDwgQ0hJTERfUE9MSUNZX0VNUFRZIHx8IGNoaWxkUG9saWN5ID4gQ0hJTERfUE9MSUNZX01BWAorICAgICAgICAgICAgICAgIHx8IGNoaWxkUG9saWN5ID09IENISUxEX1BPTElDWV9SRVBFQVQpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNoaWxkUG9saWN5IGlzIG5vdCBvbmUgb2YgdGhlIHByZWRlZmluZWQgY29uc3RhbnRzIik7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgRWxlbWVudCBwYXJlbnQgPSBmaW5kRWxlbWVudChwYXJlbnROYW1lKTsKICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gbmV3IEVsZW1lbnQoKTsKICAgICAgICAgZWxlbWVudC5uYW1lID0gZWxlbWVudE5hbWU7CkBAIC0zMzQsMTkgKzM3MSwyMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFkZHMgYSBuZXcgZWxlbWVudCB0eXBlIHRvIHRoaXMgSUlPTWV0YWRhdGFGb3JtYXQgd2l0aCAKLSAgICAgKiBDSElMRF9QT0xJQ1lfUkVQRUFUIGFuZCB0aGUgc3BlY2lmaWVkIG1pbmltdW0gYW5kIG1heGltdW0KLSAgICAgKiBudW1iZXIgb2YgY2hpbGQgZWxlbWVudHMuCisgICAgICogQWRkcyBhIG5ldyBlbGVtZW50IHR5cGUgdG8gdGhpcyBJSU9NZXRhZGF0YUZvcm1hdCB3aXRoCisgICAgICogQ0hJTERfUE9MSUNZX1JFUEVBVCBhbmQgdGhlIHNwZWNpZmllZCBtaW5pbXVtIGFuZCBtYXhpbXVtIG51bWJlciBvZiBjaGlsZAorICAgICAqIGVsZW1lbnRzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSB0aGUgZWxlbWVudCBuYW1lIHRvIGJlIGFkZGVkLgotICAgICAqIEBwYXJhbSBwYXJlbnROYW1lIHRoZSBwYXJlbnQgZWxlbWVudCBuYW1lLgotICAgICAqIEBwYXJhbSBtaW5DaGlsZHJlbiB0aGUgbWluaW11bSBudW1iZXIgb2YgY2hpbGQgZWxlbWVudHMuCi0gICAgICogQHBhcmFtIG1heENoaWxkcmVuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGlsZCBlbGVtZW50cy4KKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IG5hbWUgdG8gYmUgYWRkZWQuCisgICAgICogQHBhcmFtIHBhcmVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgZWxlbWVudCBuYW1lLgorICAgICAqIEBwYXJhbSBtaW5DaGlsZHJlbgorICAgICAqICAgICAgICAgICAgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGNoaWxkIGVsZW1lbnRzLgorICAgICAqIEBwYXJhbSBtYXhDaGlsZHJlbgorICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoaWxkIGVsZW1lbnRzLgogICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZEVsZW1lbnQoCi0gICAgICAgICAgICBTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBwYXJlbnROYW1lLAotICAgICAgICAgICAgaW50IG1pbkNoaWxkcmVuLCBpbnQgbWF4Q2hpbGRyZW4KLSAgICApIHsKKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRFbGVtZW50KFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIHBhcmVudE5hbWUsIGludCBtaW5DaGlsZHJlbiwKKyAgICAgICAgICAgIGludCBtYXhDaGlsZHJlbikgewogICAgICAgICBpZiAobWluQ2hpbGRyZW4gPCAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtaW5DaGlsZHJlbiA8IDAhIik7CiAgICAgICAgIH0KQEAgLTM2NSwxOSArNDA0LDIwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQWRkcyBhbiBPYmplY3QgcmVmZXJlbmNlIHdpdGggdGhlIHNwZWNpZmllZCBjbGFzcyB0eXBlIHRvIGJlIAotICAgICAqIHN0b3JlZCBhcyBlbGVtZW50J3MgdmFsdWUuIAorICAgICAqIEFkZHMgYW4gT2JqZWN0IHJlZmVyZW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgY2xhc3MgdHlwZSB0byBiZSBzdG9yZWQgYXMKKyAgICAgKiBlbGVtZW50J3MgdmFsdWUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnROYW1lIHRoZSBlbGVtZW50IG5hbWUuCi0gICAgICogQHBhcmFtIGNsYXNzVHlwZSB0aGUgY2xhc3MgaW5kaWNhdGVzIHRoZSBsZWdhbCB0eXBlcyBmb3IgCi0gICAgICogdGhlIG9iamVjdCdzIHZhbHVlLgotICAgICAqIEBwYXJhbSBhcnJheU1pbkxlbmd0aCB0aGUgbWluaW11bSBsZWdhbCBsZW5ndGggZm9yIHRoZSBhcnJheS4KLSAgICAgKiBAcGFyYW0gYXJyYXlNYXhMZW5ndGggdGhlIG1heGltdW0gbGVnYWwgbGVuZ3RoIGZvciB0aGUgYXJyYXkuCisgICAgICogQHBhcmFtIGVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICB0aGUgZWxlbWVudCBuYW1lLgorICAgICAqIEBwYXJhbSBjbGFzc1R5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBjbGFzcyBpbmRpY2F0ZXMgdGhlIGxlZ2FsIHR5cGVzIGZvciB0aGUgb2JqZWN0J3MgdmFsdWUuCisgICAgICogQHBhcmFtIGFycmF5TWluTGVuZ3RoCisgICAgICogICAgICAgICAgICB0aGUgbWluaW11bSBsZWdhbCBsZW5ndGggZm9yIHRoZSBhcnJheS4KKyAgICAgKiBAcGFyYW0gYXJyYXlNYXhMZW5ndGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIGxlZ2FsIGxlbmd0aCBmb3IgdGhlIGFycmF5LgogICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZE9iamVjdFZhbHVlKAotICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnROYW1lLCBDbGFzczw/PiBjbGFzc1R5cGUsCi0gICAgICAgICAgICBpbnQgYXJyYXlNaW5MZW5ndGgsIGludCBhcnJheU1heExlbmd0aAotICAgICkgeworICAgIHByb3RlY3RlZCB2b2lkIGFkZE9iamVjdFZhbHVlKFN0cmluZyBlbGVtZW50TmFtZSwgQ2xhc3M8Pz4gY2xhc3NUeXBlLCBpbnQgYXJyYXlNaW5MZW5ndGgsCisgICAgICAgICAgICBpbnQgYXJyYXlNYXhMZW5ndGgpIHsKICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gZmluZEVsZW1lbnQoZWxlbWVudE5hbWUpOwogCiAgICAgICAgIE9iamVjdFZhbHVlIG9ialZhbCA9IG5ldyBPYmplY3RWYWx1ZSgpOwpAQCAtMzkwLDIwICs0MzAsMjAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBZGRzIGFuIE9iamVjdCByZWZlcmVuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGNsYXNzIHR5cGUgdG8gYmUgCi0gICAgICogc3RvcmVkIGFzIGFuIGVsZW1lbnQncyB2YWx1ZS4gCisgICAgICogQWRkcyBhbiBPYmplY3QgcmVmZXJlbmNlIHdpdGggdGhlIHNwZWNpZmllZCBjbGFzcyB0eXBlIHRvIGJlIHN0b3JlZCBhcyBhbgorICAgICAqIGVsZW1lbnQncyB2YWx1ZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIGVsZW1lbnQgbmFtZS4KLSAgICAgKiBAcGFyYW0gY2xhc3NUeXBlIHRoZSBjbGFzcyBpbmRpY2F0ZXMgdGhlIGxlZ2FsIHR5cGVzIGZvciAKLSAgICAgKiB0aGUgb2JqZWN0J3MgdmFsdWUuCi0gICAgICogQHBhcmFtIHJlcXVpcmVkIGEgZmxhZyBpbmRpY2F0ZWQgdGhhdCB0aGlzIG9iamVjdCB2YWx1ZSAKLSAgICAgKiBtdXN0IGJlIHByZXNlbnQuCi0gICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSwgb3IgbnVsbC4KKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IG5hbWUuCisgICAgICogQHBhcmFtIGNsYXNzVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGNsYXNzIGluZGljYXRlcyB0aGUgbGVnYWwgdHlwZXMgZm9yIHRoZSBvYmplY3QncyB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gcmVxdWlyZWQKKyAgICAgKiAgICAgICAgICAgIGEgZmxhZyBpbmRpY2F0ZWQgdGhhdCB0aGlzIG9iamVjdCB2YWx1ZSBtdXN0IGJlIHByZXNlbnQuCisgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWUsIG9yIG51bGwuCiAgICAgICovCi0gICAgcHJvdGVjdGVkIDxUPiB2b2lkIGFkZE9iamVjdFZhbHVlKAotICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnROYW1lLCBDbGFzczxUPiBjbGFzc1R5cGUsCi0gICAgICAgICAgICBib29sZWFuIHJlcXVpcmVkLCBUIGRlZmF1bHRWYWx1ZQotICAgICkgeworICAgIHByb3RlY3RlZCA8VD4gdm9pZCBhZGRPYmplY3RWYWx1ZShTdHJpbmcgZWxlbWVudE5hbWUsIENsYXNzPFQ+IGNsYXNzVHlwZSwgYm9vbGVhbiByZXF1aXJlZCwKKyAgICAgICAgICAgIFQgZGVmYXVsdFZhbHVlKSB7CiAgICAgICAgIC8vIG5vdGU6IHJlcWlyZWQgaXMgYW4gdW51c2VkIHBhcmFtZXRlcgogICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBmaW5kRWxlbWVudChlbGVtZW50TmFtZSk7CiAKQEAgLTQxNiwyMiArNDU2LDIyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQWRkcyBhbiBPYmplY3QgcmVmZXJlbmNlIHdpdGggdGhlIHNwZWNpZmllZCBjbGFzcyB0eXBlIHRvIGJlIAotICAgICAqIHN0b3JlZCBhcyB0aGUgZWxlbWVudCdzIHZhbHVlLiAKKyAgICAgKiBBZGRzIGFuIE9iamVjdCByZWZlcmVuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGNsYXNzIHR5cGUgdG8gYmUgc3RvcmVkIGFzCisgICAgICogdGhlIGVsZW1lbnQncyB2YWx1ZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIGVsZW1lbnQgbmFtZS4KLSAgICAgKiBAcGFyYW0gY2xhc3NUeXBlIHRoZSBjbGFzcyBpbmRpY2F0ZXMgdGhlIGxlZ2FsIHR5cGVzIGZvciAKLSAgICAgKiB0aGUgb2JqZWN0IHZhbHVlLgotICAgICAqIEBwYXJhbSByZXF1aXJlZCBhIGZsYWcgaW5kaWNhdGVkIHRoYXQgdGhpcyBvYmplY3QgdmFsdWUgCi0gICAgICogbXVzdCBiZSBwcmVzZW50LgotICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUsIG9yIG51bGwuCi0gICAgICogQHBhcmFtIGVudW1lcmF0ZWRWYWx1ZXMgdGhlIGxpc3Qgb2YgbGVnYWwgdmFsdWVzIGZvciB0aGUgb2JqZWN0LgorICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgbmFtZS4KKyAgICAgKiBAcGFyYW0gY2xhc3NUeXBlCisgICAgICogICAgICAgICAgICB0aGUgY2xhc3MgaW5kaWNhdGVzIHRoZSBsZWdhbCB0eXBlcyBmb3IgdGhlIG9iamVjdCB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gcmVxdWlyZWQKKyAgICAgKiAgICAgICAgICAgIGEgZmxhZyBpbmRpY2F0ZWQgdGhhdCB0aGlzIG9iamVjdCB2YWx1ZSBtdXN0IGJlIHByZXNlbnQuCisgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWUsIG9yIG51bGwuCisgICAgICogQHBhcmFtIGVudW1lcmF0ZWRWYWx1ZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBsaXN0IG9mIGxlZ2FsIHZhbHVlcyBmb3IgdGhlIG9iamVjdC4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgPFQ+IHZvaWQgYWRkT2JqZWN0VmFsdWUoCi0gICAgICAgICAgICBTdHJpbmcgZWxlbWVudE5hbWUsIENsYXNzPFQ+IGNsYXNzVHlwZSwKLSAgICAgICAgICAgIGJvb2xlYW4gcmVxdWlyZWQsIFQgZGVmYXVsdFZhbHVlLAotICAgICAgICAgICAgTGlzdDw/IGV4dGVuZHMgVD4gZW51bWVyYXRlZFZhbHVlcwotICAgICkgeworICAgIHByb3RlY3RlZCA8VD4gdm9pZCBhZGRPYmplY3RWYWx1ZShTdHJpbmcgZWxlbWVudE5hbWUsIENsYXNzPFQ+IGNsYXNzVHlwZSwgYm9vbGVhbiByZXF1aXJlZCwKKyAgICAgICAgICAgIFQgZGVmYXVsdFZhbHVlLCBMaXN0PD8gZXh0ZW5kcyBUPiBlbnVtZXJhdGVkVmFsdWVzKSB7CiAgICAgICAgIC8vIG5vdGU6IHJlcWlyZWQgaXMgYW4gdW51c2VkIHBhcmFtZXRlcgogICAgICAgICBpZiAoZW51bWVyYXRlZFZhbHVlcyA9PSBudWxsIHx8IGVudW1lcmF0ZWRWYWx1ZXMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJlbnVtZXJhdGVkVmFsdWVzIGlzIGVtcHR5IG9yIG51bGwiKTsKQEAgLTQ0NCw3ICs0ODQsOCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImVudW1lcmF0ZWRWYWx1ZXMgY29udGFpbnMgYSB2YWx1ZSBub3Qgb2YgY2xhc3MgY2xhc3NUeXBlISIpOworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgImVudW1lcmF0ZWRWYWx1ZXMgY29udGFpbnMgYSB2YWx1ZSBub3Qgb2YgY2xhc3MgY2xhc3NUeXBlISIpOwogICAgICAgICB9CiAKICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gZmluZEVsZW1lbnQoZWxlbWVudE5hbWUpOwpAQCAtNDU5LDI1ICs1MDAsMjcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBZGRzIGFuIE9iamVjdCByZWZlcmVuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGNsYXNzIHR5cGUgdG8gYmUgCi0gICAgICogc3RvcmVkIGFzIHRoZSBlbGVtZW50J3MgdmFsdWUuIAorICAgICAqIEFkZHMgYW4gT2JqZWN0IHJlZmVyZW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgY2xhc3MgdHlwZSB0byBiZSBzdG9yZWQgYXMKKyAgICAgKiB0aGUgZWxlbWVudCdzIHZhbHVlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSB0aGUgZWxlbWVudCBuYW1lLgotICAgICAqIEBwYXJhbSBjbGFzc1R5cGUgdGhlIGNsYXNzIGluZGljYXRlcyB0aGUgbGVnYWwgdHlwZXMgZm9yIAotICAgICAqIHRoZSBvYmplY3QgdmFsdWUuCi0gICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSwgb3IgbnVsbC4KLSAgICAgKiBAcGFyYW0gbWluVmFsdWUgdGhlIG1pbmltdW0gbGVnYWwgdmFsdWUgZm9yIHRoZSBvYmplY3QgdmFsdWUuIAotICAgICAqIEBwYXJhbSBtYXhWYWx1ZSB0aGUgbWF4aW11bSBsZWdhbCB2YWx1ZSBmb3IgdGhlIG9iamVjdCB2YWx1ZS4gCi0gICAgICogQHBhcmFtIG1pbkluY2x1c2l2ZSB0aGUgZmxhZyB3aGljaCBpbmRpY2F0ZXMgCi0gICAgICogd2hldGhlciB0aGUgbWluVmFsdWUgaXMgaW5jbHVzaXZlLgotICAgICAqIEBwYXJhbSBtYXhJbmNsdXNpdmUgdGhlIGZsYWcgd2hpY2ggaW5kaWNhdGVzIAotICAgICAqIHdoZXRoZXIgdGhlIG1heFZhbHVlIGlzIGluY2x1c2l2ZS4KKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IG5hbWUuCisgICAgICogQHBhcmFtIGNsYXNzVHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGNsYXNzIGluZGljYXRlcyB0aGUgbGVnYWwgdHlwZXMgZm9yIHRoZSBvYmplY3QgdmFsdWUuCisgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWUsIG9yIG51bGwuCisgICAgICogQHBhcmFtIG1pblZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgbWluaW11bSBsZWdhbCB2YWx1ZSBmb3IgdGhlIG9iamVjdCB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gbWF4VmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIGxlZ2FsIHZhbHVlIGZvciB0aGUgb2JqZWN0IHZhbHVlLgorICAgICAqIEBwYXJhbSBtaW5JbmNsdXNpdmUKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbGFnIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHRoZSBtaW5WYWx1ZSBpcyBpbmNsdXNpdmUuCisgICAgICogQHBhcmFtIG1heEluY2x1c2l2ZQorICAgICAqICAgICAgICAgICAgdGhlIGZsYWcgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgdGhlIG1heFZhbHVlIGlzIGluY2x1c2l2ZS4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBPYmplY3QgJiBDb21wYXJhYmxlPD8gc3VwZXIgVD4+IHZvaWQgYWRkT2JqZWN0VmFsdWUoCi0gICAgICAgICAgICBTdHJpbmcgZWxlbWVudE5hbWUsIENsYXNzPFQ+IGNsYXNzVHlwZSwKLSAgICAgICAgICAgIFQgZGVmYXVsdFZhbHVlLCBDb21wYXJhYmxlPD8gc3VwZXIgVD4gbWluVmFsdWUsIENvbXBhcmFibGU8PyBzdXBlciBUPiBtYXhWYWx1ZSwKLSAgICAgICAgICAgIGJvb2xlYW4gbWluSW5jbHVzaXZlLCBib29sZWFuIG1heEluY2x1c2l2ZQotICAgICkgeworICAgIHByb3RlY3RlZCA8VCBleHRlbmRzIE9iamVjdCAmIENvbXBhcmFibGU8PyBzdXBlciBUPj4gdm9pZCBhZGRPYmplY3RWYWx1ZShTdHJpbmcgZWxlbWVudE5hbWUsCisgICAgICAgICAgICBDbGFzczxUPiBjbGFzc1R5cGUsIFQgZGVmYXVsdFZhbHVlLCBDb21wYXJhYmxlPD8gc3VwZXIgVD4gbWluVmFsdWUsCisgICAgICAgICAgICBDb21wYXJhYmxlPD8gc3VwZXIgVD4gbWF4VmFsdWUsIGJvb2xlYW4gbWluSW5jbHVzaXZlLCBib29sZWFuIG1heEluY2x1c2l2ZSkgewogICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBmaW5kRWxlbWVudChlbGVtZW50TmFtZSk7CiAKICAgICAgICAgT2JqZWN0VmFsdWU8VD4gb2JqVmFsID0gbmV3IE9iamVjdFZhbHVlPFQ+KCk7CkBAIC01NDAsNyArNTgzLDcgQEAKICAgICAgICAgaWYgKChhdHRyLnZhbHVlVHlwZSAmIFZBTFVFX1JBTkdFKSA9PSAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBdHRyaWJ1dGUgaXMgbm90IGEgcmFuZ2UhIik7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGF0dHIubWF4VmFsdWU7ICAgICAgICAKKyAgICAgICAgcmV0dXJuIGF0dHIubWF4VmFsdWU7CiAgICAgfQogCiAgICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVNaW5WYWx1ZShTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBhdHRyTmFtZSkgewpAQCAtNTU4LDEyICs2MDEsMTMgQEAKIAogICAgIHB1YmxpYyBpbnQgZ2V0QXR0cmlidXRlVmFsdWVUeXBlKFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIGF0dHJOYW1lKSB7CiAgICAgICAgIEF0dGxpc3QgYXR0ciA9IGZpbmRBdHRyaWJ1dGUoZWxlbWVudE5hbWUsIGF0dHJOYW1lKTsKLSAgICAgICAgcmV0dXJuIGF0dHIudmFsdWVUeXBlOyAgICAgICAgICAgICAgICAKKyAgICAgICAgcmV0dXJuIGF0dHIudmFsdWVUeXBlOwogICAgIH0KIAogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDaGlsZE5hbWVzKFN0cmluZyBlbGVtZW50TmFtZSkgewogICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBmaW5kRWxlbWVudChlbGVtZW50TmFtZSk7Ci0gICAgICAgIGlmIChlbGVtZW50LmNoaWxkUG9saWN5ID09IENISUxEX1BPTElDWV9FTVBUWSkgeyAvLyBFbGVtZW50IGNhbm5vdCBoYXZlIGNoaWxkcmVuCisgICAgICAgIGlmIChlbGVtZW50LmNoaWxkUG9saWN5ID09IENISUxEX1BPTElDWV9FTVBUWSkgeyAvLyBFbGVtZW50IGNhbm5vdCBoYXZlCisgICAgICAgICAgICAvLyBjaGlsZHJlbgogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGVsZW1lbnQuY2hpbGRyZW4udG9BcnJheShuZXcgU3RyaW5nW2VsZW1lbnQuY2hpbGRyZW4uc2l6ZSgpXSk7CkBAIC02ODksMTAgKzczMywxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgZnJvbSB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuIAotICAgICAqICAKLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIHNwZWNpZmllZCBlbGVtZW50IG5hbWUuCi0gICAgICogQHBhcmFtIGF0dHJOYW1lIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIG5hbWUuCisgICAgICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBmcm9tIHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBuYW1lLgorICAgICAqIEBwYXJhbSBhdHRyTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgbmFtZS4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgYXR0ck5hbWUpIHsKICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gZmluZEVsZW1lbnQoZWxlbWVudE5hbWUpOwpAQCAtNzAyLDcgKzc0OCw4IEBACiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgZnJvbSB0aGlzIGZvcm1hdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIHNwZWNpZmllZCBlbGVtZW50IG5hbWUuCisgICAgICogQHBhcmFtIGVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgbmFtZS4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVFbGVtZW50KFN0cmluZyBlbGVtZW50TmFtZSkgewogICAgICAgICBFbGVtZW50IGVsZW1lbnQ7CkBAIC03MTcsMTggKzc2NCwyMCBAQAogICAgIC8qKgogICAgICAqIFJlbW92ZXMgdGhlIG9iamVjdCB2YWx1ZSBmcm9tIHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIGVsZW1lbnQgbmFtZS4KKyAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IG5hbWUuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlT2JqZWN0VmFsdWUoU3RyaW5nIGVsZW1lbnROYW1lKSB7CiAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IGZpbmRFbGVtZW50KGVsZW1lbnROYW1lKTsKICAgICAgICAgZWxlbWVudC5vYmplY3RWYWx1ZSA9IG51bGw7CiAgICAgfQotICAgIAorCiAgICAgLyoqCi0gICAgICogU2V0cyBhIG5ldyBiYXNlIG5hbWUgZm9yIFJlc291cmNlQnVuZGxlcyBjb250YWluaW5nIAotICAgICAqIGRlc2NyaXB0aW9ucyBvZiBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBmb3IgdGhpcyBmb3JtYXQuCisgICAgICogU2V0cyBhIG5ldyBiYXNlIG5hbWUgZm9yIFJlc291cmNlQnVuZGxlcyBjb250YWluaW5nIGRlc2NyaXB0aW9ucyBvZgorICAgICAqIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGZvciB0aGlzIGZvcm1hdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2VCYXNlTmFtZSB0aGUgbmV3IHJlc291cmNlIGJhc2UgbmFtZS4KKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VCYXNlTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5ldyByZXNvdXJjZSBiYXNlIG5hbWUuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0UmVzb3VyY2VCYXNlTmFtZShTdHJpbmcgcmVzb3VyY2VCYXNlTmFtZSkgewogICAgICAgICBpZiAocmVzb3VyY2VCYXNlTmFtZSA9PSBudWxsKSB7CkBAIC03NDAsMTE3ICs3ODksMTgxIEBACiAgICAgLyoqCiAgICAgICogVGhlIENsYXNzIEVsZW1lbnQuCiAgICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJDbGFzc1dpdGhvdXRDb25zdHJ1Y3RvciJ9KQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCB7CisgICAgICAgICJDbGFzc1dpdGhvdXRDb25zdHJ1Y3RvciIKKyAgICB9KQogICAgIHByaXZhdGUgY2xhc3MgRWxlbWVudCB7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIG5hbWUuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBuYW1lLgorICAgICAgICAgKi8KICAgICAgICAgU3RyaW5nIG5hbWU7CiAKLSAgICAgICAgLyoqIFRoZSBjaGlsZHJlbi4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjaGlsZHJlbi4KKyAgICAgICAgICovCiAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIGF0dHJpYnV0ZXMuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBhdHRyaWJ1dGVzLgorICAgICAgICAgKi8KICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIEF0dGxpc3Q+IGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEF0dGxpc3Q+KCk7CiAKLSAgICAgICAgLyoqIFRoZSBtaW4gY2hpbGRyZW4uICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbWluIGNoaWxkcmVuLgorICAgICAgICAgKi8KICAgICAgICAgaW50IG1pbkNoaWxkcmVuOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBtYXggY2hpbGRyZW4uICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBtYXggY2hpbGRyZW4uCisgICAgICAgICAqLwogICAgICAgICBpbnQgbWF4Q2hpbGRyZW47Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIGNoaWxkIHBvbGljeS4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNoaWxkIHBvbGljeS4KKyAgICAgICAgICovCiAgICAgICAgIGludCBjaGlsZFBvbGljeTsKIAotICAgICAgICAvKiogVGhlIG9iamVjdCB2YWx1ZS4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBvYmplY3QgdmFsdWUuCisgICAgICAgICAqLwogICAgICAgICBPYmplY3RWYWx1ZSBvYmplY3RWYWx1ZTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBUaGUgQ2xhc3MgQXR0bGlzdC4KICAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IkNsYXNzV2l0aG91dENvbnN0cnVjdG9yIn0pCisgICAgQFN1cHByZXNzV2FybmluZ3MoIHsKKyAgICAgICAgIkNsYXNzV2l0aG91dENvbnN0cnVjdG9yIgorICAgIH0pCiAgICAgcHJpdmF0ZSBjbGFzcyBBdHRsaXN0IHsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgbmFtZS4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG5hbWUuCisgICAgICAgICAqLwogICAgICAgICBTdHJpbmcgbmFtZTsKIAotICAgICAgICAvKiogVGhlIGRhdGEgdHlwZS4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBkYXRhIHR5cGUuCisgICAgICAgICAqLwogICAgICAgICBpbnQgZGF0YVR5cGU7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIHJlcXVpcmVkLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcmVxdWlyZWQuCisgICAgICAgICAqLwogICAgICAgICBib29sZWFuIHJlcXVpcmVkOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBsaXN0IG1pbiBsZW5ndGguICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBsaXN0IG1pbiBsZW5ndGguCisgICAgICAgICAqLwogICAgICAgICBpbnQgbGlzdE1pbkxlbmd0aDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgbGlzdCBtYXggbGVuZ3RoLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbGlzdCBtYXggbGVuZ3RoLgorICAgICAgICAgKi8KICAgICAgICAgaW50IGxpc3RNYXhMZW5ndGg7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIGRlZmF1bHQgdmFsdWUuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlLgorICAgICAgICAgKi8KICAgICAgICAgU3RyaW5nIGRlZmF1bHRWYWx1ZTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgZW51bWVyYXRlZCB2YWx1ZXMuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBlbnVtZXJhdGVkIHZhbHVlcy4KKyAgICAgICAgICovCiAgICAgICAgIExpc3Q8U3RyaW5nPiBlbnVtZXJhdGVkVmFsdWVzOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBtaW4gdmFsdWUuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBtaW4gdmFsdWUuCisgICAgICAgICAqLwogICAgICAgICBTdHJpbmcgbWluVmFsdWU7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIG1heCB2YWx1ZS4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG1heCB2YWx1ZS4KKyAgICAgICAgICovCiAgICAgICAgIFN0cmluZyBtYXhWYWx1ZTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgbWluIGluY2x1c2l2ZS4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG1pbiBpbmNsdXNpdmUuCisgICAgICAgICAqLwogICAgICAgICBib29sZWFuIG1pbkluY2x1c2l2ZTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgbWF4IGluY2x1c2l2ZS4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG1heCBpbmNsdXNpdmUuCisgICAgICAgICAqLwogICAgICAgICBib29sZWFuIG1heEluY2x1c2l2ZTsKIAotICAgICAgICAvKiogVGhlIHZhbHVlIHR5cGUuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdmFsdWUgdHlwZS4KKyAgICAgICAgICovCiAgICAgICAgIGludCB2YWx1ZVR5cGU7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogVGhlIENsYXNzIE9iamVjdFZhbHVlLgogICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiQ2xhc3NXaXRob3V0Q29uc3RydWN0b3IifSkKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyggeworICAgICAgICAiQ2xhc3NXaXRob3V0Q29uc3RydWN0b3IiCisgICAgfSkKICAgICBwcml2YXRlIGNsYXNzIE9iamVjdFZhbHVlPFQ+IHsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgY2xhc3MgdHlwZS4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNsYXNzIHR5cGUuCisgICAgICAgICAqLwogICAgICAgICBDbGFzczxUPiBjbGFzc1R5cGU7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIGFycmF5IG1pbiBsZW5ndGguICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBhcnJheSBtaW4gbGVuZ3RoLgorICAgICAgICAgKi8KICAgICAgICAgaW50IGFycmF5TWluTGVuZ3RoOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBhcnJheSBtYXggbGVuZ3RoLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgYXJyYXkgbWF4IGxlbmd0aC4KKyAgICAgICAgICovCiAgICAgICAgIGludCBhcnJheU1heExlbmd0aDsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgZGVmYXVsdCB2YWx1ZS4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRlZmF1bHQgdmFsdWUuCisgICAgICAgICAqLwogICAgICAgICBUIGRlZmF1bHRWYWx1ZTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgZW51bWVyYXRlZCB2YWx1ZXMuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBlbnVtZXJhdGVkIHZhbHVlcy4KKyAgICAgICAgICovCiAgICAgICAgIExpc3Q8PyBleHRlbmRzIFQ+IGVudW1lcmF0ZWRWYWx1ZXM7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIG1pbiB2YWx1ZS4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG1pbiB2YWx1ZS4KKyAgICAgICAgICovCiAgICAgICAgIENvbXBhcmFibGU8PyBzdXBlciBUPiBtaW5WYWx1ZTsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgbWF4IHZhbHVlLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbWF4IHZhbHVlLgorICAgICAgICAgKi8KICAgICAgICAgQ29tcGFyYWJsZTw/IHN1cGVyIFQ+IG1heFZhbHVlOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBtaW4gaW5jbHVzaXZlLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbWluIGluY2x1c2l2ZS4KKyAgICAgICAgICovCiAgICAgICAgIGJvb2xlYW4gbWluSW5jbHVzaXZlOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBtYXggaW5jbHVzaXZlLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbWF4IGluY2x1c2l2ZS4KKyAgICAgICAgICovCiAgICAgICAgIGJvb2xlYW4gbWF4SW5jbHVzaXZlOwogCi0gICAgICAgIC8qKiBUaGUgdmFsdWUgdHlwZS4gKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB2YWx1ZSB0eXBlLgorICAgICAgICAgKi8KICAgICAgICAgaW50IHZhbHVlVHlwZTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBGaW5kIGVsZW1lbnQuCiAgICAgICogCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50CisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lLgorICAgICAqIEByZXR1cm4gdGhlIGVsZW1lbnQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBFbGVtZW50IGZpbmRFbGVtZW50KFN0cmluZyBuYW1lKSB7CiAgICAgICAgIEVsZW1lbnQgZWxlbWVudDsKQEAgLTg2NCwxNiArOTc3LDE4IEBACiAgICAgLyoqCiAgICAgICogRmluZCBhdHRyaWJ1dGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnROYW1lIHRoZSBlbGVtZW50IG5hbWUKLSAgICAgKiBAcGFyYW0gYXR0cmlidXRlTmFtZSB0aGUgYXR0cmlidXRlIG5hbWUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhdHRsaXN0CisgICAgICogQHBhcmFtIGVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICB0aGUgZWxlbWVudCBuYW1lLgorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lCisgICAgICogICAgICAgICAgICB0aGUgYXR0cmlidXRlIG5hbWUuCisgICAgICogQHJldHVybiB0aGUgYXR0bGlzdC4KICAgICAgKi8KICAgICBwcml2YXRlIEF0dGxpc3QgZmluZEF0dHJpYnV0ZShTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7CiAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IGZpbmRFbGVtZW50KGVsZW1lbnROYW1lKTsKICAgICAgICAgQXR0bGlzdCBhdHRyaWJ1dGU7CiAgICAgICAgIGlmICgoYXR0cmlidXRlID0gZWxlbWVudC5hdHRyaWJ1dGVzLmdldChhdHRyaWJ1dGVOYW1lKSkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYXR0cmlidXRlIG5hbWUgaXMgbnVsbCBvciBubyBzdWNoIGF0dHJpYnV0ZTogIiArIGF0dHJpYnV0ZU5hbWUpOworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYXR0cmlidXRlIG5hbWUgaXMgbnVsbCBvciBubyBzdWNoIGF0dHJpYnV0ZTogIgorICAgICAgICAgICAgICAgICAgICArIGF0dHJpYnV0ZU5hbWUpOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZTsKQEAgLTg4Miw5ICs5OTcsOSBAQAogICAgIC8qKgogICAgICAqIEZpbmQgb2JqZWN0IHZhbHVlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSB0aGUgZWxlbWVudCBuYW1lCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgb2JqZWN0IHZhbHVlCisgICAgICogQHBhcmFtIGVsZW1lbnROYW1lCisgICAgICogICAgICAgICAgICB0aGUgZWxlbWVudCBuYW1lLgorICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCB2YWx1ZS4KICAgICAgKi8KICAgICBwcml2YXRlIE9iamVjdFZhbHVlIGZpbmRPYmplY3RWYWx1ZShTdHJpbmcgZWxlbWVudE5hbWUpIHsKICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gZmluZEVsZW1lbnQoZWxlbWVudE5hbWUpOwpAQCAtODk4LDIzICsxMDEzLDI1IEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgcmVzb3VyY2Ugc3RyaW5nLgogICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkgdGhlIGtleQotICAgICAqIEBwYXJhbSBsb2NhbGUgdGhlIGxvY2FsZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlc291cmNlIHN0cmluZworICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiAgICAgICAgICAgIHRoZSBrZXkuCisgICAgICogQHBhcmFtIGxvY2FsZQorICAgICAqICAgICAgICAgICAgdGhlIGxvY2FsZS4KKyAgICAgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSBzdHJpbmcuCiAgICAgICovCiAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSwgTG9jYWxlIGxvY2FsZSkgewogICAgICAgICBpZiAobG9jYWxlID09IG51bGwpIHsKICAgICAgICAgICAgIGxvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBHZXQgdGhlIGNvbnRleHQgY2xhc3MgbG9hZGVyIGFuZCB0cnkgdG8gbG9jYXRlIHRoZSBidW5kbGUgd2l0aCBpdCBmaXJzdAotICAgICAgICBDbGFzc0xvYWRlciBjb250ZXh0Q2xhc3Nsb2FkZXIgPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbjxDbGFzc0xvYWRlcj4oKSB7CisgICAgICAgIC8vIEdldCB0aGUgY29udGV4dCBjbGFzcyBsb2FkZXIgYW5kIHRyeSB0byBsb2NhdGUgdGhlIGJ1bmRsZSB3aXRoIGl0CisgICAgICAgIC8vIGZpcnN0CisgICAgICAgIENsYXNzTG9hZGVyIGNvbnRleHRDbGFzc2xvYWRlciA9IEFjY2Vzc0NvbnRyb2xsZXIKKyAgICAgICAgICAgICAgICAuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uPENsYXNzTG9hZGVyPigpIHsKICAgICAgICAgICAgICAgICAgICAgcHVibGljIENsYXNzTG9hZGVyIHJ1bigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0pOwogCiAgICAgICAgIC8vIE5vdyB0cnkgdG8gZ2V0IHRoZSByZXNvdXJjZSBidW5kbGUKICAgICAgICAgUmVzb3VyY2VCdW5kbGUgcmI7CmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9tZXRhZGF0YS9JSU9NZXRhZGF0YU5vZGUuamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL21ldGFkYXRhL0lJT01ldGFkYXRhTm9kZS5qYXZhCmluZGV4IGQ1YWI3YTUuLmFkYzZkNjcgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL21ldGFkYXRhL0lJT01ldGFkYXRhTm9kZS5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL21ldGFkYXRhL0lJT01ldGFkYXRhTm9kZS5qYXZhCkBAIC0yNyw0NyArMjcsNzEgQEAKIGltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7CiBpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKIGltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKKwogLy8/Pz9BV1QKIC8vaW1wb3J0IG9yZy53M2MuZG9tLlR5cGVJbmZvOwogLy9pbXBvcnQgb3JnLnczYy5kb20uVXNlckRhdGFIYW5kbGVyOwogCiAvKioKLSAqIFRoZSBDbGFzcyBJSU9NZXRhZGF0YU5vZGUgcmVwcmVzZW50cyBhIG5vZGUgb2YgdGhlIAotICogKERPTS1zdHlsZSkgbWV0YWRhdGEgdHJlZS4KKyAqIFRoZSBDbGFzcyBJSU9NZXRhZGF0YU5vZGUgcmVwcmVzZW50cyBhIG5vZGUgb2YgdGhlIChET00tc3R5bGUpIG1ldGFkYXRhIHRyZWUuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSUlPTWV0YWRhdGFOb2RlIGltcGxlbWVudHMgRWxlbWVudCwgTm9kZUxpc3QgewogCi0gICAgLyoqIFRoZSBub2RlIG5hbWUuICovCisgICAgLyoqCisgICAgICogVGhlIG5vZGUgbmFtZS4KKyAgICAgKi8KICAgICBwcml2YXRlIFN0cmluZyBub2RlTmFtZTsKLSAgICAKLSAgICAvKiogVGhlIG5vZGUgdmFsdWUuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgbm9kZSB2YWx1ZS4KKyAgICAgKi8KICAgICBwcml2YXRlIFN0cmluZyBub2RlVmFsdWU7Ci0gICAgCi0gICAgLyoqIFRoZSBhdHRyaWJ1dGVzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGF0dHJpYnV0ZXMuCisgICAgICovCiAgICAgcHJpdmF0ZSBJSU9NZXRhZGF0YU5vZGVMaXN0IGF0dHJzID0gbmV3IElJT01ldGFkYXRhTm9kZUxpc3QobmV3IEFycmF5TGlzdDxJSU9NZXRhZGF0YU5vZGU+KCkpOwogCi0gICAgLyoqIFRoZSBwYXJlbnQgbm9kZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgcGFyZW50IG5vZGUuCisgICAgICovCiAgICAgcHJpdmF0ZSBJSU9NZXRhZGF0YU5vZGUgcGFyZW50OwotICAgIAotICAgIC8qKiBUaGUgZmlyc3QgY2hpbGQgbm9kZS4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBmaXJzdCBjaGlsZCBub2RlLgorICAgICAqLwogICAgIHByaXZhdGUgSUlPTWV0YWRhdGFOb2RlIGZpcnN0Q2hpbGQ7Ci0gICAgCi0gICAgLyoqIFRoZSBsYXN0IGNoaWxkIG5vZGUuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGFzdCBjaGlsZCBub2RlLgorICAgICAqLwogICAgIHByaXZhdGUgSUlPTWV0YWRhdGFOb2RlIGxhc3RDaGlsZDsKLSAgICAKLSAgICAvKiogVGhlIHByZXZpb3VzIHNpYmxpbmcuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJldmlvdXMgc2libGluZy4KKyAgICAgKi8KICAgICBwcml2YXRlIElJT01ldGFkYXRhTm9kZSBwcmV2aW91c1NpYmxpbmc7Ci0gICAgCi0gICAgLyoqIFRoZSBuZXh0IHNpYmxpbmcuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgbmV4dCBzaWJsaW5nLgorICAgICAqLwogICAgIHByaXZhdGUgSUlPTWV0YWRhdGFOb2RlIG5leHRTaWJsaW5nOwogCi0gICAgLyoqIFRoZSBudW1iZXIgb2YgY2hpbGRyZW4uICovCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBjaGlsZHJlbi4KKyAgICAgKi8KICAgICBwcml2YXRlIGludCBuQ2hpbGRyZW47CiAKLSAgICAvKiogVGhlIHVzZXIgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuICovCisgICAgLyoqCisgICAgICogVGhlIHVzZXIgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuCisgICAgICovCiAgICAgcHJpdmF0ZSBPYmplY3QgdXNlck9iamVjdDsKIAotICAgIC8qKiBUaGUgdGV4dCBjb250ZW50IG9mIHRoaXMgbm9kZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBjb250ZW50IG9mIHRoaXMgbm9kZS4KKyAgICAgKi8KICAgICBwcml2YXRlIFN0cmluZyB0ZXh0Q29udGVudDsKIAogICAgIC8qKgpAQCAtNzksMTggKzEwMywyMCBAQAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBlbXB0eSBub2RlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgogICAgICAqIAotICAgICAqIEBwYXJhbSBub2RlTmFtZSB0aGUgbm9kZSBuYW1lCisgICAgICogQHBhcmFtIG5vZGVOYW1lCisgICAgICogICAgICAgICAgICB0aGUgbm9kZSBuYW1lLgogICAgICAqLwogICAgIHB1YmxpYyBJSU9NZXRhZGF0YU5vZGUoU3RyaW5nIG5vZGVOYW1lKSB7CiAgICAgICAgIHRoaXMubm9kZU5hbWUgPSBub2RlTmFtZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgSUlPTWV0YWRhdGFOb2RlIHdpdGggdGhlIHNwZWNpZmllZCAKLSAgICAgKiBuYW1lIGFuZCB2YWx1ZS4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgSUlPTWV0YWRhdGFOb2RlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCB2YWx1ZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbm9kZU5hbWUgdGhlIG5vZGUgbmFtZQotICAgICAqIEBwYXJhbSBub2RlVmFsdWUgdGhlIG5vZGUgdmFsdWUKKyAgICAgKiBAcGFyYW0gbm9kZU5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBub2RlIG5hbWUuCisgICAgICogQHBhcmFtIG5vZGVWYWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIG5vZGUgdmFsdWUuCiAgICAgICovCiAgICAgcHJpdmF0ZSBJSU9NZXRhZGF0YU5vZGUoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgbm9kZVZhbHVlKSB7CiAgICAgICAgIHRoaXMubm9kZU5hbWUgPSBub2RlTmFtZTsKQEAgLTEwMiwxMiArMTI4LDEyIEBACiAgICAgfQogCiAgICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgQXR0ciBhdHRyTm9kZSA9IChBdHRyKSBhdHRycy5nZXROYW1lZEl0ZW0obmFtZSk7CisgICAgICAgIEF0dHIgYXR0ck5vZGUgPSAoQXR0cilhdHRycy5nZXROYW1lZEl0ZW0obmFtZSk7CiAgICAgICAgIHJldHVybiAoYXR0ck5vZGUgPT0gbnVsbCkgPyAiIiA6IGF0dHJOb2RlLmdldFZhbHVlKCk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICBBdHRyIGF0dHIgPSAoQXR0cikgYXR0cnMuZ2V0TmFtZWRJdGVtKG5hbWUpOworICAgICAgICBBdHRyIGF0dHIgPSAoQXR0cilhdHRycy5nZXROYW1lZEl0ZW0obmFtZSk7CiAgICAgICAgIGlmIChhdHRyICE9IG51bGwpIHsKICAgICAgICAgICAgIGF0dHIuc2V0VmFsdWUodmFsdWUpOwogICAgICAgICB9IGVsc2UgewpAQCAtMTE2LDcgKzE0Miw3IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgSUlPTWV0YWRhdGFBdHRyIGF0dHIgPSAoSUlPTWV0YWRhdGFBdHRyKSBhdHRycy5nZXROYW1lZEl0ZW0obmFtZSk7CisgICAgICAgIElJT01ldGFkYXRhQXR0ciBhdHRyID0gKElJT01ldGFkYXRhQXR0cilhdHRycy5nZXROYW1lZEl0ZW0obmFtZSk7CiAgICAgICAgIGlmIChhdHRyICE9IG51bGwpIHsKICAgICAgICAgICAgIGF0dHIuc2V0T3duZXJFbGVtZW50KG51bGwpOwogICAgICAgICAgICAgYXR0cnMubGlzdC5yZW1vdmUoYXR0cik7CkBAIC0xMjQsMTcgKzE1MCwxOSBAQAogICAgIH0KIAogICAgIHB1YmxpYyBBdHRyIGdldEF0dHJpYnV0ZU5vZGUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIChBdHRyKSBhdHRycy5nZXROYW1lZEl0ZW0obmFtZSk7CisgICAgICAgIHJldHVybiAoQXR0cilhdHRycy5nZXROYW1lZEl0ZW0obmFtZSk7CiAgICAgfQogCiAgICAgcHVibGljIEF0dHIgc2V0QXR0cmlidXRlTm9kZShBdHRyIG5ld0F0dHIpIHRocm93cyBET01FeGNlcHRpb24gewogICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBhbHJlYWR5IGluIHVzZS4KICAgICAgICAgRWxlbWVudCBvd25lciA9IG5ld0F0dHIuZ2V0T3duZXJFbGVtZW50KCk7CiAgICAgICAgIGlmIChvd25lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAob3duZXIgPT0gdGhpcykgeyAvLyBSZXBsYWNpbmcgYW4gYXR0cmlidXRlIG5vZGUgYnkgaXRzZWxmIGhhcyBubyBlZmZlY3QKKyAgICAgICAgICAgIGlmIChvd25lciA9PSB0aGlzKSB7IC8vIFJlcGxhY2luZyBhbiBhdHRyaWJ1dGUgbm9kZSBieSBpdHNlbGYgaGFzIG5vCisgICAgICAgICAgICAgICAgLy8gZWZmZWN0CiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVVNFX0FUVFJJQlVURV9FUlIsICJBdHRyaWJ1dGUgaXMgYWxyZWFkeSBpbiB1c2UiKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlVTRV9BVFRSSUJVVEVfRVJSLAorICAgICAgICAgICAgICAgICAgICAgICAgIkF0dHJpYnV0ZSBpcyBhbHJlYWR5IGluIHVzZSIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTE0Niw3ICsxNzQsNyBAQAogCiAgICAgICAgIElJT01ldGFkYXRhQXR0ciBpaW9BdHRyOwogICAgICAgICBpZiAobmV3QXR0ciBpbnN0YW5jZW9mIElJT01ldGFkYXRhQXR0cikgewotICAgICAgICAgICAgaWlvQXR0ciA9IChJSU9NZXRhZGF0YUF0dHIpIG5ld0F0dHI7CisgICAgICAgICAgICBpaW9BdHRyID0gKElJT01ldGFkYXRhQXR0ciluZXdBdHRyOwogICAgICAgICAgICAgaWlvQXR0ci5zZXRPd25lckVsZW1lbnQodGhpcyk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpaW9BdHRyID0gbmV3IElJT01ldGFkYXRhQXR0cihuYW1lLCBuZXdBdHRyLmdldFZhbHVlKCksIHRoaXMpOwpAQCAtMjA2LDcgKzIzNCw4IEBACiAgICAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGUobG9jYWxOYW1lKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVOUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgcXVhbGlmaWVkTmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVOUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgcXVhbGlmaWVkTmFtZSwgU3RyaW5nIHZhbHVlKQorICAgICAgICAgICAgdGhyb3dzIERPTUV4Y2VwdGlvbiB7CiAgICAgICAgIHNldEF0dHJpYnV0ZShxdWFsaWZpZWROYW1lLCB2YWx1ZSk7CiAgICAgfQogCkBAIC0yMjIsNyArMjUxLDggQEAKICAgICAgICAgcmV0dXJuIHNldEF0dHJpYnV0ZU5vZGUobmV3QXR0cik7CiAgICAgfQogCi0gICAgcHVibGljIE5vZGVMaXN0IGdldEVsZW1lbnRzQnlUYWdOYW1lTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7CisgICAgcHVibGljIE5vZGVMaXN0IGdldEVsZW1lbnRzQnlUYWdOYW1lTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSkKKyAgICAgICAgICAgIHRocm93cyBET01FeGNlcHRpb24gewogICAgICAgICByZXR1cm4gZ2V0RWxlbWVudHNCeVRhZ05hbWUobG9jYWxOYW1lKTsKICAgICB9CiAKQEAgLTIzNCwyMCArMjY0LDEwNSBAQAogICAgICAgICByZXR1cm4gaGFzQXR0cmlidXRlKGxvY2FsTmFtZSk7CiAgICAgfQogCi0gICAgLy8/Pz9BV1QKKyAgICAvLyA/Pz9BV1QKICAgICAvKgotICAgIHB1YmxpYyBUeXBlSW5mbyBnZXRTY2hlbWFUeXBlSW5mbygpIHsKLSAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJNZXRob2Qgbm90IHN1cHBvcnRlZCIpOwotICAgIH0qLworICAgICAqIHB1YmxpYyBUeXBlSW5mbyBnZXRTY2hlbWFUeXBlSW5mbygpIHsgdGhyb3cgbmV3CisgICAgICogRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk1ldGhvZCBub3Qgc3VwcG9ydGVkIik7IH0KKyAgICAgKi8KIAorICAgIC8qKgorICAgICAqIDxpPkRlc2NyaXB0aW9uIGNvcGllZCBmcm9tIGludGVyZmFjZTogb3JnLnczYy5kb20uRWxlbWVudCAoRE9NIExldmVsCisgICAgICogMyk8L2k+CisgICAgICogPHA+CisgICAgICogSWYgdGhlIHBhcmFtZXRlciBpc0lkIGlzIHRydWUsIHRoaXMgbWV0aG9kIGRlY2xhcmVzIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBhdHRyaWJ1dGUgdG8gYmUgYSB1c2VyLWRldGVybWluZWQgSUQgYXR0cmlidXRlIC4gVGhpcyBhZmZlY3RzIHRoZSB2YWx1ZQorICAgICAqIG9mIEF0dHIuaXNJZCBhbmQgdGhlIGJlaGF2aW9yIG9mIERvY3VtZW50LmdldEVsZW1lbnRCeUlkLCBidXQgZG9lcyBub3QKKyAgICAgKiBjaGFuZ2UgYW55IHNjaGVtYSB0aGF0IG1heSBiZSBpbiB1c2UsIGluIHBhcnRpY3VsYXIgdGhpcyBkb2VzIG5vdCBhZmZlY3QKKyAgICAgKiB0aGUgQXR0ci5zY2hlbWFUeXBlSW5mbyBvZiB0aGUgc3BlY2lmaWVkIEF0dHIgbm9kZS4gVXNlIHRoZSB2YWx1ZSBmYWxzZQorICAgICAqIGZvciB0aGUgcGFyYW1ldGVyIGlzSWQgdG8gdW5kZWNsYXJlIGFuIGF0dHJpYnV0ZSBmb3IgYmVpbmcgYQorICAgICAqIHVzZXItZGV0ZXJtaW5lZCBJRCBhdHRyaWJ1dGUuIFRvIHNwZWNpZnkgYW4gYXR0cmlidXRlIGJ5IGxvY2FsIG5hbWUgYW5kCisgICAgICogbmFtZXNwYWNlIFVSSSwgdXNlIHRoZSBzZXRJZEF0dHJpYnV0ZU5TIG1ldGhvZC4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIGlzSWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbGFnIHdoaWNoIGRldGVybWluZXMgd2hldGhlciB0aGlzIGF0dHJpYnV0ZSBpcyBvZiB0eXBlCisgICAgICogICAgICAgICAgICBJRC4KKyAgICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEgRE9NIGVycm9yIG9jY3VycmVkIHdoaWxlIHNldHRpbmcgdGhlIGF0dHJpYnV0ZSB0eXBlLgorICAgICAqICAgICAgICAgICAgIDxwPgorICAgICAqICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgbm9kZSBpcyByZWFkb25seS4KKyAgICAgKiAgICAgICAgICAgICA8YnI+CisgICAgICogICAgICAgICAgICAgTk9UX0ZPVU5EX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgbm9kZSBpcyBub3QgYW4KKyAgICAgKiAgICAgICAgICAgICBhdHRyaWJ1dGUgb2YgdGhpcyBlbGVtZW50LgorICAgICAqICAgICAgICAgICAgIDwvcD4KKyAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRJZEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0lkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJNZXRob2Qgbm90IHN1cHBvcnRlZCIpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldElkQXR0cmlidXRlTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwgYm9vbGVhbiBpc0lkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKKyAgICAvKioKKyAgICAgKiA8aT5EZXNjcmlwdGlvbiBjb3BpZWQgZnJvbSBpbnRlcmZhY2U6IG9yZy53M2MuZG9tLkVsZW1lbnQgKERPTSBMZXZlbAorICAgICAqIDMpPC9pPgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBwYXJhbWV0ZXIgaXNJZCBpcyB0cnVlLCB0aGlzIG1ldGhvZCBkZWNsYXJlcyB0aGUgc3BlY2lmaWVkCisgICAgICogYXR0cmlidXRlIHRvIGJlIGEgdXNlci1kZXRlcm1pbmVkIElEIGF0dHJpYnV0ZSAuIFRoaXMgYWZmZWN0cyB0aGUgdmFsdWUKKyAgICAgKiBvZiBBdHRyLmlzSWQgYW5kIHRoZSBiZWhhdmlvciBvZiBEb2N1bWVudC5nZXRFbGVtZW50QnlJZCwgYnV0IGRvZXMgbm90CisgICAgICogY2hhbmdlIGFueSBzY2hlbWEgdGhhdCBtYXkgYmUgaW4gdXNlLCBpbiBwYXJ0aWN1bGFyIHRoaXMgZG9lcyBub3QgYWZmZWN0CisgICAgICogdGhlIEF0dHIuc2NoZW1hVHlwZUluZm8gb2YgdGhlIHNwZWNpZmllZCBBdHRyIG5vZGUuIFVzZSB0aGUgdmFsdWUgZmFsc2UKKyAgICAgKiBmb3IgdGhlIHBhcmFtZXRlciBpc0lkIHRvIHVuZGVjbGFyZSBhbiBhdHRyaWJ1dGUgZm9yIGJlaW5nIGEKKyAgICAgKiB1c2VyLWRldGVybWluZWQgSUQgYXR0cmlidXRlLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZXNwYWNlVVJJCisgICAgICogICAgICAgICAgICB0aGUgbmFtZXNwYWNlIFVSSSBvZiB0aGUgYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSBsb2NhbE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBsb2NhbCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIGlzSWQKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbGFnIHdoaWNoIGRldGVybWluZXMgd2hldGhlciB0aGlzIGF0dHJpYnV0ZSBpcyBvZiB0eXBlCisgICAgICogICAgICAgICAgICBJRC4KKyAgICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEgRE9NIGVycm9yIG9jY3VycmVkIHdoaWxlIHNldHRpbmcgdGhlIGF0dHJpYnV0ZSB0eXBlLgorICAgICAqICAgICAgICAgICAgIDxwPgorICAgICAqICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgbm9kZSBpcyByZWFkb25seS4KKyAgICAgKiAgICAgICAgICAgICA8YnI+CisgICAgICogICAgICAgICAgICAgTk9UX0ZPVU5EX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgbm9kZSBpcyBub3QgYW4KKyAgICAgKiAgICAgICAgICAgICBhdHRyaWJ1dGUgb2YgdGhpcyBlbGVtZW50LgorICAgICAqICAgICAgICAgICAgIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJZEF0dHJpYnV0ZU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUsIGJvb2xlYW4gaXNJZCkKKyAgICAgICAgICAgIHRocm93cyBET01FeGNlcHRpb24gewogICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk1ldGhvZCBub3Qgc3VwcG9ydGVkIik7CiAgICAgfQogCisgICAgLyoqCisgICAgICogPGk+RGVzY3JpcHRpb24gY29waWVkIGZyb20gaW50ZXJmYWNlOiBvcmcudzNjLmRvbS5FbGVtZW50IChET00gTGV2ZWwKKyAgICAgKiAzKTwvaT4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgcGFyYW1ldGVyIGlzSWQgaXMgdHJ1ZSwgdGhpcyBtZXRob2QgZGVjbGFyZXMgdGhlIHNwZWNpZmllZAorICAgICAqIGF0dHJpYnV0ZSB0byBiZSBhIHVzZXItZGV0ZXJtaW5lZCBJRCBhdHRyaWJ1dGUgLiBUaGlzIGFmZmVjdHMgdGhlIHZhbHVlCisgICAgICogb2YgQXR0ci5pc0lkIGFuZCB0aGUgYmVoYXZpb3Igb2YgRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQsIGJ1dCBkb2VzIG5vdAorICAgICAqIGNoYW5nZSBhbnkgc2NoZW1hIHRoYXQgbWF5IGJlIGluIHVzZSwgaW4gcGFydGljdWxhciB0aGlzIGRvZXMgbm90IGFmZmVjdAorICAgICAqIHRoZSBBdHRyLnNjaGVtYVR5cGVJbmZvIG9mIHRoZSBzcGVjaWZpZWQgQXR0ciBub2RlLiBVc2UgdGhlIHZhbHVlIGZhbHNlCisgICAgICogZm9yIHRoZSBwYXJhbWV0ZXIgaXNJZCB0byB1bmRlY2xhcmUgYW4gYXR0cmlidXRlIGZvciBiZWluZyBhCisgICAgICogdXNlci1kZXRlcm1pbmVkIElEIGF0dHJpYnV0ZS4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIGlkQXR0cgorICAgICAqICAgICAgICAgICAgdGhlIGF0dHJpYnV0ZSBub2RlLgorICAgICAqIEBwYXJhbSBpc0lkCisgICAgICogICAgICAgICAgICB0aGUgZmxhZyB3aGljaCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBhdHRyaWJ1dGUgaXMgb2YgdHlwZQorICAgICAqICAgICAgICAgICAgSUQuCisgICAgICogQHRocm93cyBET01FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhIERPTSBlcnJvciBvY2N1cnJlZCB3aGlsZSBzZXR0aW5nIHRoZSBhdHRyaWJ1dGUgdHlwZS4KKyAgICAgKiAgICAgICAgICAgICA8cD4KKyAgICAgKiAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIG5vZGUgaXMgcmVhZG9ubHkuCisgICAgICogICAgICAgICAgICAgPGJyPgorICAgICAqICAgICAgICAgICAgIE5PVF9GT1VORF9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIG5vZGUgaXMgbm90IGFuCisgICAgICogICAgICAgICAgICAgYXR0cmlidXRlIG9mIHRoaXMgZWxlbWVudC4KKyAgICAgKiAgICAgICAgICAgICA8L3A+CisgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0SWRBdHRyaWJ1dGVOb2RlKEF0dHIgaWRBdHRyLCBib29sZWFuIGlzSWQpIHRocm93cyBET01FeGNlcHRpb24gewogICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk1ldGhvZCBub3Qgc3VwcG9ydGVkIik7CiAgICAgfQpAQCAtMzA1LDggKzQyMCw4IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJuZXdDaGlsZCA9PSBudWxsISIpOwogICAgICAgICB9CiAKLSAgICAgICAgSUlPTWV0YWRhdGFOb2RlIG5ld0lJT0NoaWxkID0gKElJT01ldGFkYXRhTm9kZSkgbmV3Q2hpbGQ7Ci0gICAgICAgIElJT01ldGFkYXRhTm9kZSByZWZJSU9DaGlsZCA9IChJSU9NZXRhZGF0YU5vZGUpIHJlZkNoaWxkOworICAgICAgICBJSU9NZXRhZGF0YU5vZGUgbmV3SUlPQ2hpbGQgPSAoSUlPTWV0YWRhdGFOb2RlKW5ld0NoaWxkOworICAgICAgICBJSU9NZXRhZGF0YU5vZGUgcmVmSUlPQ2hpbGQgPSAoSUlPTWV0YWRhdGFOb2RlKXJlZkNoaWxkOwogCiAgICAgICAgIG5ld0lJT0NoaWxkLnBhcmVudCA9IHRoaXM7CiAKQEAgLTM0OSw4ICs0NjQsOCBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibmV3Q2hpbGQgPT0gbnVsbCEiKTsKICAgICAgICAgfQogCi0gICAgICAgIElJT01ldGFkYXRhTm9kZSBuZXdJSU9DaGlsZCA9IChJSU9NZXRhZGF0YU5vZGUpIG5ld0NoaWxkOwotICAgICAgICBJSU9NZXRhZGF0YU5vZGUgb2xkSUlPQ2hpbGQgPSAoSUlPTWV0YWRhdGFOb2RlKSBvbGRDaGlsZDsKKyAgICAgICAgSUlPTWV0YWRhdGFOb2RlIG5ld0lJT0NoaWxkID0gKElJT01ldGFkYXRhTm9kZSluZXdDaGlsZDsKKyAgICAgICAgSUlPTWV0YWRhdGFOb2RlIG9sZElJT0NoaWxkID0gKElJT01ldGFkYXRhTm9kZSlvbGRDaGlsZDsKIAogICAgICAgICBJSU9NZXRhZGF0YU5vZGUgbmV4dCA9IG9sZElJT0NoaWxkLm5leHRTaWJsaW5nOwogICAgICAgICBJSU9NZXRhZGF0YU5vZGUgcHJldmlvdXMgPSBvbGRJSU9DaGlsZC5wcmV2aW91c1NpYmxpbmc7CkBAIC0zODksNyArNTA0LDcgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm9sZENoaWxkID09IG51bGwhIik7CiAgICAgICAgIH0KIAotICAgICAgICBJSU9NZXRhZGF0YU5vZGUgb2xkSUlPQ2hpbGQgPSAoSUlPTWV0YWRhdGFOb2RlKSBvbGRDaGlsZDsKKyAgICAgICAgSUlPTWV0YWRhdGFOb2RlIG9sZElJT0NoaWxkID0gKElJT01ldGFkYXRhTm9kZSlvbGRDaGlsZDsKIAogICAgICAgICAvLyBGaXggbmV4dCBhbmQgcHJldmlvdXMKICAgICAgICAgSUlPTWV0YWRhdGFOb2RlIHByZXZpb3VzID0gb2xkSUlPQ2hpbGQucHJldmlvdXNTaWJsaW5nOwpAQCAtNDM5LDcgKzU1NCw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gY2xvbmVkOyAgLy9UbyBjaGFuZ2UgYm9keSBvZiBpbXBsZW1lbnRlZCBtZXRob2RzIHVzZSBGaWxlIHwgU2V0dGluZ3MgfCBGaWxlIFRlbXBsYXRlcy4KKyAgICAgICAgcmV0dXJuIGNsb25lZDsgLy8gVG8gY2hhbmdlIGJvZHkgb2YgaW1wbGVtZW50ZWQgbWV0aG9kcyB1c2UgRmlsZSB8CisgICAgICAgIC8vIFNldHRpbmdzIHwgRmlsZSBUZW1wbGF0ZXMuCiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgbm9ybWFsaXplKCkgewpAQCAtNDcwLDUyICs1ODYsMzE0IEBACiAgICAgICAgIHJldHVybiBhdHRycy5saXN0LnNpemUoKSA+IDA7CiAgICAgfQogCisgICAgLyoqCisgICAgICogPGk+RGVzY3JpcHRpb24gY29waWVkIGZyb20gaW50ZXJmYWNlOiBvcmcudzNjLmRvbS5Ob2RlIChET00gTGV2ZWwgMyk8L2k+CisgICAgICogPHA+CisgICAgICogVGhlIGFic29sdXRlIGJhc2UgVVJJIG9mIHRoaXMgbm9kZSBvciBudWxsIGlmIHRoZSBpbXBsZW1lbnRhdGlvbiB3YXNuJ3QKKyAgICAgKiBhYmxlIHRvIG9idGFpbiBhbiBhYnNvbHV0ZSBVUkkuIFRoaXMgdmFsdWUgaXMgY29tcHV0ZWQgYXMgZGVzY3JpYmVkIGluLgorICAgICAqIEhvd2V2ZXIsIHdoZW4gdGhlIERvY3VtZW50IHN1cHBvcnRzIHRoZSBmZWF0dXJlICJIVE1MIiBbRE9NIExldmVsIDIKKyAgICAgKiBIVE1MXSwgdGhlIGJhc2UgVVJJIGlzIGNvbXB1dGVkIHVzaW5nIGZpcnN0IHRoZSB2YWx1ZSBvZiB0aGUgaHJlZgorICAgICAqIGF0dHJpYnV0ZSBvZiB0aGUgSFRNTCBCQVNFIGVsZW1lbnQgaWYgYW55LCBhbmQgdGhlIHZhbHVlIG9mIHRoZQorICAgICAqIGRvY3VtZW50VVJJIGF0dHJpYnV0ZSBmcm9tIHRoZSBEb2N1bWVudCBpbnRlcmZhY2Ugb3RoZXJ3aXNlLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFic29sdXRlIGJhc2UgVVJJLgorICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZVVSSSgpIHsKICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJNZXRob2Qgbm90IHN1cHBvcnRlZCIpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIDxpPkRlc2NyaXB0aW9uIGNvcGllZCBmcm9tIGludGVyZmFjZTogb3JnLnczYy5kb20uTm9kZSAoRE9NIExldmVsIDMpPC9pPgorICAgICAqIDxwPgorICAgICAqIENvbXBhcmVzIHRoZSByZWZlcmVuY2Ugbm9kZSwgaS5lLiB0aGUgbm9kZSBvbiB3aGljaCB0aGlzIG1ldGhvZCBpcyBiZWluZworICAgICAqIGNhbGxlZCwgd2l0aCBhIG5vZGUsIGkuZS4gdGhlIG9uZSBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIsIHdpdGggcmVnYXJkIHRvCisgICAgICogdGhlaXIgcG9zaXRpb24gaW4gdGhlIGRvY3VtZW50IGFuZCBhY2NvcmRpbmcgdG8gdGhlIGRvY3VtZW50IG9yZGVyLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3RoZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBub2RlIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgcmVmZXJlbmNlIG5vZGUuCisgICAgICogQHJldHVybiBSZXR1cm5zIGhvdyB0aGUgbm9kZSBpcyBwb3NpdGlvbmVkIHJlbGF0aXZlbHkgdG8gdGhlIHJlZmVyZW5jZQorICAgICAqICAgICAgICAgbm9kZS4KKyAgICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIE5PVF9TVVBQT1JURURfRVJSOiB3aGVuIHRoZSBjb21wYXJlZCBub2RlcyBhcmUgZnJvbSBkaWZmZXJlbnQKKyAgICAgKiAgICAgICAgICAgICBET00gaW1wbGVtZW50YXRpb25zIHRoYXQgZG8gbm90IGNvb3JkaW5hdGUgdG8gcmV0dXJuCisgICAgICogICAgICAgICAgICAgY29uc2lzdGVudCBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyByZXN1bHRzLgorICAgICAqLwogICAgIHB1YmxpYyBzaG9ydCBjb21wYXJlRG9jdW1lbnRQb3NpdGlvbihOb2RlIG90aGVyKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJNZXRob2Qgbm90IHN1cHBvcnRlZCIpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIDxpPkRlc2NyaXB0aW9uIGNvcGllZCBmcm9tIGludGVyZmFjZTogb3JnLnczYy5kb20uTm9kZSAoRE9NIExldmVsIDMpPC9pPgorICAgICAqIDxwPgorICAgICAqIFRoaXMgYXR0cmlidXRlIHJldHVybnMgdGhlIHRleHQgY29udGVudCBvZiB0aGlzIG5vZGUgYW5kIGl0cyBkZXNjZW5kYW50cy4KKyAgICAgKiBXaGVuIGl0IGlzIGRlZmluZWQgdG8gYmUgbnVsbCwgc2V0dGluZyBpdCBoYXMgbm8gZWZmZWN0LiBPbiBzZXR0aW5nLCBhbnkKKyAgICAgKiBwb3NzaWJsZSBjaGlsZHJlbiB0aGlzIG5vZGUgbWF5IGhhdmUgYXJlIHJlbW92ZWQgYW5kLCBpZiBpdCB0aGUgbmV3CisgICAgICogc3RyaW5nIGlzIG5vdCBlbXB0eSBvciBudWxsLCByZXBsYWNlZCBieSBhIHNpbmdsZSBUZXh0IG5vZGUgY29udGFpbmluZworICAgICAqIHRoZSBzdHJpbmcgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvLiBPbiBnZXR0aW5nLCBubyBzZXJpYWxpemF0aW9uIGlzCisgICAgICogcGVyZm9ybWVkLCB0aGUgcmV0dXJuZWQgc3RyaW5nIGRvZXMgbm90IGNvbnRhaW4gYW55IG1hcmt1cC4gTm8gd2hpdGVzcGFjZQorICAgICAqIG5vcm1hbGl6YXRpb24gaXMgcGVyZm9ybWVkIGFuZCB0aGUgcmV0dXJuZWQgc3RyaW5nIGRvZXMgbm90IGNvbnRhaW4gdGhlCisgICAgICogd2hpdGUgc3BhY2VzIGluIGVsZW1lbnQgY29udGVudCAoc2VlIHRoZSBhdHRyaWJ1dGUKKyAgICAgKiBUZXh0LmlzRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKS4gU2ltaWxhcmx5LCBvbiBzZXR0aW5nLCBubyBwYXJzaW5nIGlzCisgICAgICogcGVyZm9ybWVkIGVpdGhlciwgdGhlIGlucHV0IHN0cmluZyBpcyB0YWtlbiBhcyBwdXJlIHRleHR1YWwgY29udGVudC4gVGhlCisgICAgICogc3RyaW5nIHJldHVybmVkIGlzIG1hZGUgb2YgdGhlIHRleHQgY29udGVudCBvZiB0aGlzIG5vZGUgZGVwZW5kaW5nIG9uIGl0cworICAgICAqIHR5cGUsIGFzIGRlZmluZWQgYmVsb3c6CisgICAgICogPHRhYmxlPgorICAgICAqIDx0cj4KKyAgICAgKiA8dGQ+PHN0cm9uZz5Ob2RlIHR5cGU8L3N0cm9uZz48L3RkPgorICAgICAqIDx0ZD48c3Ryb25nPkNvbnRlbnQ8L3N0cm9uZz48L3RkPgorICAgICAqIDwvdHI+CisgICAgICogPHRyPgorICAgICAqIDx0ZD5FTEVNRU5UX05PREUsIEFUVFJJQlVURV9OT0RFLCBFTlRJVFlfTk9ERSwgRU5USVRZX1JFRkVSRU5DRV9OT0RFLAorICAgICAqIERPQ1VNRU5UX0ZSQUdNRU5UX05PREU8L3RkPgorICAgICAqIDx0ZD5jb25jYXRlbmF0aW9uIG9mIHRoZSB0ZXh0Q29udGVudCBhdHRyaWJ1dGUgdmFsdWUgb2YgZXZlcnkgY2hpbGQgbm9kZSwKKyAgICAgKiBleGNsdWRpbmcgQ09NTUVOVF9OT0RFIGFuZCBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgbm9kZXMuIFRoaXMgaXMgdGhlCisgICAgICogZW1wdHkgc3RyaW5nIGlmIHRoZSBub2RlIGhhcyBubyBjaGlsZHJlbi48L3RkPgorICAgICAqIDwvdHI+CisgICAgICogPHRyPgorICAgICAqIDx0ZD5URVhUX05PREUsIENEQVRBX1NFQ1RJT05fTk9ERSwgQ09NTUVOVF9OT0RFLAorICAgICAqIFBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERTwvdGQ+CisgICAgICogPHRkPm5vZGVWYWx1ZTwvdGQ+CisgICAgICogPC90cj4KKyAgICAgKiA8dHI+CisgICAgICogPHRkPkRPQ1VNRU5UX05PREUsIERPQ1VNRU5UX1RZUEVfTk9ERSwgTk9UQVRJT05fTk9ERTwvdGQ+CisgICAgICogPHRkPm51bGw8L3RkPgorICAgICAqIDwvdHI+CisgICAgICogPC90YWJsZT4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHJldHVybiB0aGUgdGV4dCBjb250ZW50IGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiB0aGlzIG5vZGUuCisgICAgICogQHRocm93cyBET01FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBET01TVFJJTkdfU0laRV9FUlI6IFJhaXNlZCB3aGVuIGl0IHdvdWxkIHJldHVybiBtb3JlCisgICAgICogICAgICAgICAgICAgY2hhcmFjdGVycyB0aGFuIGZpdCBpbiBhIERPTVN0cmluZyB2YXJpYWJsZSBvbiB0aGUKKyAgICAgKiAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBwbGF0Zm9ybS4KKyAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHRDb250ZW50KCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiB0ZXh0Q29udGVudDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiA8aT5EZXNjcmlwdGlvbiBjb3BpZWQgZnJvbSBpbnRlcmZhY2U6IG9yZy53M2MuZG9tLk5vZGUgKERPTSBMZXZlbCAzKTwvaT4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGF0dHJpYnV0ZSByZXR1cm5zIHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhpcyBub2RlIGFuZCBpdHMgZGVzY2VuZGFudHMuCisgICAgICogV2hlbiBpdCBpcyBkZWZpbmVkIHRvIGJlIG51bGwsIHNldHRpbmcgaXQgaGFzIG5vIGVmZmVjdC4gT24gc2V0dGluZywgYW55CisgICAgICogcG9zc2libGUgY2hpbGRyZW4gdGhpcyBub2RlIG1heSBoYXZlIGFyZSByZW1vdmVkIGFuZCwgaWYgaXQgdGhlIG5ldworICAgICAqIHN0cmluZyBpcyBub3QgZW1wdHkgb3IgbnVsbCwgcmVwbGFjZWQgYnkgYSBzaW5nbGUgVGV4dCBub2RlIGNvbnRhaW5pbmcKKyAgICAgKiB0aGUgc3RyaW5nIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0by4gT24gZ2V0dGluZywgbm8gc2VyaWFsaXphdGlvbiBpcworICAgICAqIHBlcmZvcm1lZCwgdGhlIHJldHVybmVkIHN0cmluZyBkb2VzIG5vdCBjb250YWluIGFueSBtYXJrdXAuIE5vIHdoaXRlc3BhY2UKKyAgICAgKiBub3JtYWxpemF0aW9uIGlzIHBlcmZvcm1lZCBhbmQgdGhlIHJldHVybmVkIHN0cmluZyBkb2VzIG5vdCBjb250YWluIHRoZQorICAgICAqIHdoaXRlIHNwYWNlcyBpbiBlbGVtZW50IGNvbnRlbnQgKHNlZSB0aGUgYXR0cmlidXRlCisgICAgICogVGV4dC5pc0VsZW1lbnRDb250ZW50V2hpdGVzcGFjZSkuIFNpbWlsYXJseSwgb24gc2V0dGluZywgbm8gcGFyc2luZyBpcworICAgICAqIHBlcmZvcm1lZCBlaXRoZXIsIHRoZSBpbnB1dCBzdHJpbmcgaXMgdGFrZW4gYXMgcHVyZSB0ZXh0dWFsIGNvbnRlbnQuIFRoZQorICAgICAqIHN0cmluZyByZXR1cm5lZCBpcyBtYWRlIG9mIHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhpcyBub2RlIGRlcGVuZGluZyBvbiBpdHMKKyAgICAgKiB0eXBlLCBhcyBkZWZpbmVkIGJlbG93OgorICAgICAqIDx0YWJsZT4KKyAgICAgKiA8dHI+CisgICAgICogPHRkPjxzdHJvbmc+Tm9kZSB0eXBlPC9zdHJvbmc+PC90ZD4KKyAgICAgKiA8dGQ+PHN0cm9uZz5Db250ZW50PC9zdHJvbmc+PC90ZD4KKyAgICAgKiA8L3RyPgorICAgICAqIDx0cj4KKyAgICAgKiA8dGQ+RUxFTUVOVF9OT0RFLCBBVFRSSUJVVEVfTk9ERSwgRU5USVRZX05PREUsIEVOVElUWV9SRUZFUkVOQ0VfTk9ERSwKKyAgICAgKiBET0NVTUVOVF9GUkFHTUVOVF9OT0RFPC90ZD4KKyAgICAgKiA8dGQ+Y29uY2F0ZW5hdGlvbiBvZiB0aGUgdGV4dENvbnRlbnQgYXR0cmlidXRlIHZhbHVlIG9mIGV2ZXJ5IGNoaWxkIG5vZGUsCisgICAgICogZXhjbHVkaW5nIENPTU1FTlRfTk9ERSBhbmQgUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIG5vZGVzLiBUaGlzIGlzIHRoZQorICAgICAqIGVtcHR5IHN0cmluZyBpZiB0aGUgbm9kZSBoYXMgbm8gY2hpbGRyZW4uPC90ZD4KKyAgICAgKiA8L3RyPgorICAgICAqIDx0cj4KKyAgICAgKiA8dGQ+VEVYVF9OT0RFLCBDREFUQV9TRUNUSU9OX05PREUsIENPTU1FTlRfTk9ERSwKKyAgICAgKiBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU8L3RkPgorICAgICAqIDx0ZD5ub2RlVmFsdWU8L3RkPgorICAgICAqIDwvdHI+CisgICAgICogPHRyPgorICAgICAqIDx0ZD5ET0NVTUVOVF9OT0RFLCBET0NVTUVOVF9UWVBFX05PREUsIE5PVEFUSU9OX05PREU8L3RkPgorICAgICAqIDx0ZD5udWxsPC90ZD4KKyAgICAgKiA8L3RyPgorICAgICAqIDwvdGFibGU+CisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSB0ZXh0Q29udGVudAorICAgICAqICAgICAgICAgICAgdGhlIHRleHQgY29udGVudCBmb3IgdGhpcyBub2RlLgorICAgICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgd2hlbiB0aGUgbm9kZSBpcworICAgICAqICAgICAgICAgICAgIHJlYWRvbmx5LgorICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFRleHRDb250ZW50KFN0cmluZyB0ZXh0Q29udGVudCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7CiAgICAgICAgIHRoaXMudGV4dENvbnRlbnQgPSB0ZXh0Q29udGVudDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiA8aT5EZXNjcmlwdGlvbiBjb3BpZWQgZnJvbSBpbnRlcmZhY2U6IG9yZy53M2MuZG9tLk5vZGUgKERPTSBMZXZlbCAzKTwvaT4KKyAgICAgKiA8cD4KKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBub2RlIGlzIHRoZSBzYW1lIG5vZGUgYXMgdGhlIGdpdmVuIG9uZS4gVGhpcyBtZXRob2QKKyAgICAgKiBwcm92aWRlcyBhIHdheSB0byBkZXRlcm1pbmUgd2hldGhlciB0d28gTm9kZSByZWZlcmVuY2VzIHJldHVybmVkIGJ5IHRoZQorICAgICAqIGltcGxlbWVudGF0aW9uIHJlZmVyZW5jZSB0aGUgc2FtZSBvYmplY3QuIFdoZW4gdHdvIE5vZGUgcmVmZXJlbmNlcyBhcmUKKyAgICAgKiByZWZlcmVuY2VzIHRvIHRoZSBzYW1lIG9iamVjdCwgZXZlbiBpZiB0aHJvdWdoIGEgcHJveHksIHRoZSByZWZlcmVuY2VzCisgICAgICogbWF5IGJlIHVzZWQgY29tcGxldGVseSBpbnRlcmNoYW5nZWFibHksIHN1Y2ggdGhhdCBhbGwgYXR0cmlidXRlcyBoYXZlIHRoZQorICAgICAqIHNhbWUgdmFsdWVzIGFuZCBjYWxsaW5nIHRoZSBzYW1lIERPTSBtZXRob2Qgb24gZWl0aGVyIHJlZmVyZW5jZSBhbHdheXMKKyAgICAgKiBoYXMgZXhhY3RseSB0aGUgc2FtZSBlZmZlY3QuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBvdGhlcgorICAgICAqICAgICAgICAgICAgdGhlIG5vZGUgdG8gdGVzdCBhZ2FpbnN0LgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIG5vZGVzIGFyZSB0aGUgc2FtZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzU2FtZU5vZGUoTm9kZSBvdGhlcikgewogICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk1ldGhvZCBub3Qgc3VwcG9ydGVkIik7CiAgICAgfQogCisgICAgLyoqCisgICAgICogPGk+RGVzY3JpcHRpb24gY29waWVkIGZyb20gaW50ZXJmYWNlOiBvcmcudzNjLmRvbS5Ob2RlIChET00gTGV2ZWwgMyk8L2k+CisgICAgICogPHA+CisgICAgICogTG9vayB1cCB0aGUgcHJlZml4IGFzc29jaWF0ZWQgdG8gdGhlIGdpdmVuIG5hbWVzcGFjZSBVUkksIHN0YXJ0aW5nIGZyb20KKyAgICAgKiB0aGlzIG5vZGUuIFRoZSBkZWZhdWx0IG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgYXJlIGlnbm9yZWQgYnkgdGhpcyBtZXRob2QuCisgICAgICogU2VlIGZvciBkZXRhaWxzIG9uIHRoZSBhbGdvcml0aG0gdXNlZCBieSB0aGlzIG1ldGhvZC4KKyAgICAgKiA8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIG5hbWVzcGFjZVVSSQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWVzcGFjZSBVUkkgdG8gbG9vayBmb3IuCisgICAgICogQHJldHVybiB0aGUgYXNzb2NpYXRlZCBuYW1lc3BhY2UgcHJlZml4IGlmIGZvdW5kIG9yIG51bGwgaWYgbm9uZSBpcworICAgICAqICAgICAgICAgZm91bmQuIElmIG1vcmUgdGhhbiBvbmUgcHJlZml4IGFyZSBhc3NvY2lhdGVkIHRvIHRoZSBuYW1lc3BhY2UKKyAgICAgKiAgICAgICAgIHByZWZpeCwgdGhlIHJldHVybmVkIG5hbWVzcGFjZSBwcmVmaXggaXMgaW1wbGVtZW50YXRpb24KKyAgICAgKiAgICAgICAgIGRlcGVuZGVudC4KKyAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGxvb2t1cFByZWZpeChTdHJpbmcgbmFtZXNwYWNlVVJJKSB7CiAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiA8aT5EZXNjcmlwdGlvbiBjb3BpZWQgZnJvbSBpbnRlcmZhY2U6IG9yZy53M2MuZG9tLk5vZGUgKERPTSBMZXZlbCAzKTwvaT4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBjaGVja3MgaWYgdGhlIHNwZWNpZmllZCBuYW1lc3BhY2VVUkkgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCisgICAgICogb3Igbm90LgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZXNwYWNlVVJJCisgICAgICogICAgICAgICAgICB0aGUgbmFtZXNwYWNlIFVSSSB0byBsb29rIGZvci4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlVVJJIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSwKKyAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZVVSSSkgewogICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk1ldGhvZCBub3Qgc3VwcG9ydGVkIik7CiAgICAgfQogCisgICAgLyoqCisgICAgICogPGk+RGVzY3JpcHRpb24gY29waWVkIGZyb20gaW50ZXJmYWNlOiBvcmcudzNjLmRvbS5Ob2RlIChET00gTGV2ZWwgMyk8L2k+CisgICAgICogPHA+CisgICAgICogTG9vayB1cCB0aGUgbmFtZXNwYWNlIFVSSSBhc3NvY2lhdGVkIHRvIHRoZSBnaXZlbiBwcmVmaXgsIHN0YXJ0aW5nIGZyb20KKyAgICAgKiB0aGlzIG5vZGUuIFNlZSBmb3IgZGV0YWlscyBvbiB0aGUgYWxnb3JpdGhtIHVzZWQgYnkgdGhpcyBtZXRob2QuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBwcmVmaXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBwcmVmaXggdG8gbG9vayBmb3IuIElmIHRoaXMgcGFyYW1ldGVyIGlzIG51bGwsIHRoZSBtZXRob2QKKyAgICAgKiAgICAgICAgICAgIHdpbGwgcmV0dXJuIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSBVUkkgaWYgYW55LgorICAgICAqIEByZXR1cm4gdGhlIGFzc29jaWF0ZWQgbmFtZXNwYWNlIFVSSSBvciBudWxsIGlmIG5vbmUgaXMgZm91bmQuCisgICAgICovCiAgICAgcHVibGljIFN0cmluZyBsb29rdXBOYW1lc3BhY2VVUkkoU3RyaW5nIHByZWZpeCkgewogICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk1ldGhvZCBub3Qgc3VwcG9ydGVkIik7CiAgICAgfQogCisgICAgLyoqCisgICAgICogPGk+RGVzY3JpcHRpb24gY29waWVkIGZyb20gaW50ZXJmYWNlOiBvcmcudzNjLmRvbS5Ob2RlIChET00gTGV2ZWwgMyk8L2k+CisgICAgICogPHA+CisgICAgICogVGVzdHMgd2hldGhlciB0d28gbm9kZXMgYXJlIGVxdWFsLiBUaGlzIG1ldGhvZCB0ZXN0cyBmb3IgZXF1YWxpdHkgb2YKKyAgICAgKiBub2Rlcywgbm90IHNhbWVuZXNzIChpLmUuLCB3aGV0aGVyIHRoZSB0d28gbm9kZXMgYXJlIHJlZmVyZW5jZXMgdG8gdGhlCisgICAgICogc2FtZSBvYmplY3QpIHdoaWNoIGNhbiBiZSB0ZXN0ZWQgd2l0aCBOb2RlLmlzU2FtZU5vZGUoKS4gQWxsIG5vZGVzIHRoYXQKKyAgICAgKiBhcmUgdGhlIHNhbWUgd2lsbCBhbHNvIGJlIGVxdWFsLCB0aG91Z2ggdGhlIHJldmVyc2UgbWF5IG5vdCBiZSB0cnVlLiBUd28KKyAgICAgKiBub2RlcyBhcmUgZXF1YWwgaWYgYW5kIG9ubHkgaWYgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBzYXRpc2ZpZWQ6CisgICAgICogPHA+CisgICAgICogPGxpPlRoZSB0d28gbm9kZXMgYXJlIG9mIHRoZSBzYW1lIHR5cGUuPC9saT4KKyAgICAgKiA8bGk+VGhlIGZvbGxvd2luZyBzdHJpbmcgYXR0cmlidXRlcyBhcmUgZXF1YWw6IG5vZGVOYW1lLCBsb2NhbE5hbWUsCisgICAgICogbmFtZXNwYWNlVVJJLCBwcmVmaXgsIG5vZGVWYWx1ZSAuIFRoaXMgaXM6IHRoZXkgYXJlIGJvdGggbnVsbCwgb3IgdGhleQorICAgICAqIGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFuZCBhcmUgY2hhcmFjdGVyIGZvciBjaGFyYWN0ZXIgaWRlbnRpY2FsLjwvbGk+CisgICAgICogPGxpPlRoZSBhdHRyaWJ1dGVzIE5hbWVkTm9kZU1hcHMgYXJlIGVxdWFsLiBUaGlzIGlzOiB0aGV5IGFyZSBib3RoIG51bGwsCisgICAgICogb3IgdGhleSBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhbmQgZm9yIGVhY2ggbm9kZSB0aGF0IGV4aXN0cyBpbiBvbmUgbWFwCisgICAgICogdGhlcmUgaXMgYSBub2RlIHRoYXQgZXhpc3RzIGluIHRoZSBvdGhlciBtYXAgYW5kIGlzIGVxdWFsLCBhbHRob3VnaCBub3QKKyAgICAgKiBuZWNlc3NhcmlseSBhdCB0aGUgc2FtZSBpbmRleC48L2xpPgorICAgICAqIDxsaT5UaGUgY2hpbGROb2RlcyBOb2RlTGlzdHMgYXJlIGVxdWFsLiBUaGlzIGlzOiB0aGV5IGFyZSBib3RoIG51bGwsIG9yCisgICAgICogdGhleSBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhbmQgY29udGFpbiBlcXVhbCBub2RlcyBhdCB0aGUgc2FtZSBpbmRleC4gTm90ZQorICAgICAqIHRoYXQgbm9ybWFsaXphdGlvbiBjYW4gYWZmZWN0IGVxdWFsaXR5OyB0byBhdm9pZCB0aGlzLCBub2RlcyBzaG91bGQgYmUKKyAgICAgKiBub3JtYWxpemVkIGJlZm9yZSBiZWluZyBjb21wYXJlZC48L2xpPgorICAgICAqIDwvcD4KKyAgICAgKiBGb3IgdHdvIERvY3VtZW50VHlwZSBub2RlcyB0byBiZSBlcXVhbCwgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIG11c3QKKyAgICAgKiBhbHNvIGJlIHNhdGlzZmllZDoKKyAgICAgKiA8cD4KKyAgICAgKiA8bGk+VGhlIGZvbGxvd2luZyBzdHJpbmcgYXR0cmlidXRlcyBhcmUgZXF1YWw6IHB1YmxpY0lkLCBzeXN0ZW1JZCwKKyAgICAgKiBpbnRlcm5hbFN1YnNldC48L2xpPgorICAgICAqIDxsaT5UaGUgZW50aXRpZXMgTmFtZWROb2RlTWFwcyBhcmUgZXF1YWwuPC9saT4KKyAgICAgKiA8bGk+VGhlIG5vdGF0aW9ucyBOYW1lZE5vZGVNYXBzIGFyZSBlcXVhbC48L2xpPgorICAgICAqIDwvcD4KKyAgICAgKiBPbiB0aGUgb3RoZXIgaGFuZCwgdGhlIGZvbGxvd2luZyBkbyBub3QgYWZmZWN0IGVxdWFsaXR5OiB0aGUKKyAgICAgKiBvd25lckRvY3VtZW50LCBiYXNlVVJJLCBhbmQgcGFyZW50Tm9kZSBhdHRyaWJ1dGVzLCB0aGUgc3BlY2lmaWVkCisgICAgICogYXR0cmlidXRlIGZvciBBdHRyIG5vZGVzLCB0aGUgc2NoZW1hVHlwZUluZm8gYXR0cmlidXRlIGZvciBBdHRyIGFuZAorICAgICAqIEVsZW1lbnQgbm9kZXMsIHRoZSBUZXh0LmlzRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlIGF0dHJpYnV0ZSBmb3IgVGV4dAorICAgICAqIG5vZGVzLCBhcyB3ZWxsIGFzIGFueSB1c2VyIGRhdGEgb3IgZXZlbnQgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgb24gdGhlCisgICAgICogbm9kZXMuIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlOiBBcyBhIGdlbmVyYWwgcnVsZSwgYW55dGhpbmcgbm90IG1lbnRpb25lZCBpbiB0aGUgZGVzY3JpcHRpb24gYWJvdmUKKyAgICAgKiBpcyBub3Qgc2lnbmlmaWNhbnQgaW4gY29uc2lkZXJhdGlvbiBvZiBlcXVhbGl0eSBjaGVja2luZy4gTm90ZSB0aGF0CisgICAgICogZnV0dXJlIHZlcnNpb25zIG9mIHRoaXMgc3BlY2lmaWNhdGlvbiBtYXkgdGFrZSBpbnRvIGFjY291bnQgbW9yZQorICAgICAqIGF0dHJpYnV0ZXMgYW5kIGltcGxlbWVudGF0aW9ucyBjb25mb3JtIHRvIHRoaXMgc3BlY2lmaWNhdGlvbiBhcmUgZXhwZWN0ZWQKKyAgICAgKiB0byBiZSB1cGRhdGVkIGFjY29yZGluZ2x5LgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYXJnCisgICAgICogICAgICAgICAgICB0aGUgbm9kZSB0byBjb21wYXJlIGVxdWFsaXR5IHdpdGguCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgbm9kZXMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNFcXVhbE5vZGUoTm9kZSBhcmcpIHsKICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJNZXRob2Qgbm90IHN1cHBvcnRlZCIpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIDxpPkRlc2NyaXB0aW9uIGNvcGllZCBmcm9tIGludGVyZmFjZTogb3JnLnczYy5kb20uTm9kZSAoRE9NIExldmVsIDMpPC9pPgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBzcGVjaWFsaXplZCBvYmplY3Qgd2hpY2ggaW1wbGVtZW50cyB0aGUgc3BlY2lhbGl6ZWQKKyAgICAgKiBBUElzIG9mIHRoZSBzcGVjaWZpZWQgZmVhdHVyZSBhbmQgdmVyc2lvbiwgYXMgc3BlY2lmaWVkIGluLiBUaGUKKyAgICAgKiBzcGVjaWFsaXplZCBvYmplY3QgbWF5IGFsc28gYmUgb2J0YWluZWQgYnkgdXNpbmcgYmluZGluZy1zcGVjaWZpYyBjYXN0aW5nCisgICAgICogbWV0aG9kcyBidXQgaXMgbm90IG5lY2Vzc2FyaWx5IGV4cGVjdGVkIHRvLCBhcyBkaXNjdXNzZWQgaW4uIFRoaXMgbWV0aG9kCisgICAgICogYWxzbyBhbGxvdyB0aGUgaW1wbGVtZW50YXRpb24gdG8gcHJvdmlkZSBzcGVjaWFsaXplZCBvYmplY3RzIHdoaWNoIGRvIG5vdAorICAgICAqIHN1cHBvcnQgdGhlIE5vZGUgaW50ZXJmYWNlLgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZmVhdHVyZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGZlYXR1cmUgcmVxdWVzdGVkLiBOb3RlIHRoYXQgYW55IHBsdXMgc2lnbiAiKyIKKyAgICAgKiAgICAgICAgICAgIHByZXBlbmRlZCB0byB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZSB3aWxsIGJlIGlnbm9yZWQgc2luY2UgaXQKKyAgICAgKiAgICAgICAgICAgIGlzIG5vdCBzaWduaWZpY2FudCBpbiB0aGUgY29udGV4dCBvZiB0aGlzIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gdmVyc2lvbgorICAgICAqICAgICAgICAgICAgdGhpcyBpcyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGZlYXR1cmUgdG8gdGVzdC4KKyAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3Qgd2hpY2ggaW1wbGVtZW50cyB0aGUgc3BlY2lhbGl6ZWQgQVBJcyBvZiB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICBmZWF0dXJlIGFuZCB2ZXJzaW9uLCBpZiBhbnksIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gb2JqZWN0IHdoaWNoCisgICAgICogICAgICAgICBpbXBsZW1lbnRzIGludGVyZmFjZXMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZmVhdHVyZS4gSWYgdGhlCisgICAgICogICAgICAgICBET01PYmplY3QgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QgaW1wbGVtZW50cyB0aGUgTm9kZSBpbnRlcmZhY2UsCisgICAgICogICAgICAgICBpdCBtdXN0IGRlbGVnYXRlIHRvIHRoZSBwcmltYXJ5IGNvcmUgTm9kZSBhbmQgbm90IHJldHVybiByZXN1bHRzCisgICAgICogICAgICAgICBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgcHJpbWFyeSBjb3JlIE5vZGUgc3VjaCBhcyBhdHRyaWJ1dGVzLAorICAgICAqICAgICAgICAgY2hpbGROb2RlcywgZXRjLgorICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgZ2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgU3RyaW5nIHZlcnNpb24pIHsKICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJNZXRob2Qgbm90IHN1cHBvcnRlZCIpOwogICAgIH0KIAotICAgIC8vPz8/QVdUCisgICAgLy8gPz8/QVdUCiAgICAgLyoKLSAgICBwdWJsaWMgT2JqZWN0IHNldFVzZXJEYXRhKFN0cmluZyBrZXksIE9iamVjdCBkYXRhLCBVc2VyRGF0YUhhbmRsZXIgaGFuZGxlcikgewotICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk1ldGhvZCBub3Qgc3VwcG9ydGVkIik7Ci0gICAgfSovCisgICAgICogcHVibGljIE9iamVjdCBzZXRVc2VyRGF0YShTdHJpbmcga2V5LCBPYmplY3QgZGF0YSwgVXNlckRhdGFIYW5kbGVyCisgICAgICogaGFuZGxlcikgeyB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwKKyAgICAgKiAiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTsgfQorICAgICAqLwogCisgICAgLyoqCisgICAgICogPGk+RGVzY3JpcHRpb24gY29waWVkIGZyb20gaW50ZXJmYWNlOiBvcmcudzNjLmRvbS5Ob2RlIChET00gTGV2ZWwgMyk8L2k+CisgICAgICogPHA+CisgICAgICogUmV0cmlldmVzIHRoZSBvYmplY3QgYXNzb2NpYXRlZCB0byBhIGtleSBvbiBhIHRoaXMgbm9kZS4gVGhlIG9iamVjdCBtdXN0CisgICAgICogZmlyc3QgaGF2ZSBiZWVuIHNldCB0byB0aGlzIG5vZGUgYnkgY2FsbGluZyBzZXRVc2VyRGF0YSB3aXRoIHRoZSBzYW1lCisgICAgICoga2V5LgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICB0aGUga2V5IHRoZSBvYmplY3QgaXMgYXNzb2NpYXRlZCB0by4KKyAgICAgKiBAcmV0dXJuIHRoZSBET01Vc2VyRGF0YSBhc3NvY2lhdGVkIHRvIHRoZSBnaXZlbiBrZXkgb24gdGhpcyBub2RlLCBvciBudWxsCisgICAgICogICAgICAgICBpZiB0aGVyZSB3YXMgbm9uZS4KKyAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGdldFVzZXJEYXRhKFN0cmluZyBrZXkpIHsKICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJNZXRob2Qgbm90IHN1cHBvcnRlZCIpOwogICAgIH0KQEAgLTU0MCw3ICs5MTgsNyBAQAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHVzZXIgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgdXNlciBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZQorICAgICAqIEByZXR1cm4gdGhlIHVzZXIgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdCBnZXRVc2VyT2JqZWN0KCkgewogICAgICAgICByZXR1cm4gdXNlck9iamVjdDsKQEAgLTU0OSw3ICs5MjcsOCBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHVzZXIgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHVzZXJPYmplY3QgdGhlIG5ldyB1c2VyIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlCisgICAgICogQHBhcmFtIHVzZXJPYmplY3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdXNlciBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRVc2VyT2JqZWN0KE9iamVjdCB1c2VyT2JqZWN0KSB7CiAgICAgICAgIHRoaXMudXNlck9iamVjdCA9IHVzZXJPYmplY3Q7CkBAIC01NTksMTYgKzkzOCwyMSBAQAogICAgICAqIFRoZSBDbGFzcyBJSU9NZXRhZGF0YUF0dHIuCiAgICAgICovCiAgICAgcHJpdmF0ZSBjbGFzcyBJSU9NZXRhZGF0YUF0dHIgZXh0ZW5kcyBJSU9NZXRhZGF0YU5vZGUgaW1wbGVtZW50cyBBdHRyIHsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgb3duZXIgZWxlbWVudC4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG93bmVyIGVsZW1lbnQuCisgICAgICAgICAqLwogICAgICAgICBwcml2YXRlIEVsZW1lbnQgb3duZXJFbGVtZW50OwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgaUlPIG1ldGFkYXRhIGF0dHIuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZQotICAgICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCi0gICAgICAgICAqIEBwYXJhbSBvd25lciB0aGUgb3duZXIKKyAgICAgICAgICogQHBhcmFtIG5hbWUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgbmFtZS4KKyAgICAgICAgICogQHBhcmFtIHZhbHVlCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlLgorICAgICAgICAgKiBAcGFyYW0gb3duZXIKKyAgICAgICAgICogICAgICAgICAgICB0aGUgb3duZXIuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgSUlPTWV0YWRhdGFBdHRyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUsIEVsZW1lbnQgb3duZXIpIHsKICAgICAgICAgICAgIHN1cGVyKG5hbWUsIHZhbHVlKTsKQEAgLTU5OCwxMiArOTgyLDE2IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBTZXRzIHRoZSBvd25lciBlbGVtZW50LgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIG93bmVyRWxlbWVudCB0aGUgbmV3IG93bmVyIGVsZW1lbnQKKyAgICAgICAgICogQHBhcmFtIG93bmVyRWxlbWVudAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgb3duZXIgZWxlbWVudC4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldE93bmVyRWxlbWVudChFbGVtZW50IG93bmVyRWxlbWVudCkgewogICAgICAgICAgICAgdGhpcy5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7CiAgICAgICAgIH0KIAorICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNJZCgpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTsKICAgICAgICAgfQpAQCAtNjE4LDE0ICsxMDA2LDE3IEBACiAgICAgICogVGhlIENsYXNzIElJT01ldGFkYXRhTm9kZUxpc3QuCiAgICAgICovCiAgICAgcHJpdmF0ZSBjbGFzcyBJSU9NZXRhZGF0YU5vZGVMaXN0IGltcGxlbWVudHMgTm9kZUxpc3QsIE5hbWVkTm9kZU1hcCB7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIGxpc3QuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBsaXN0LgorICAgICAgICAgKi8KICAgICAgICAgcHJpdmF0ZSBMaXN0PElJT01ldGFkYXRhTm9kZT4gbGlzdDsKIAogICAgICAgICAvKioKICAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGlJTyBtZXRhZGF0YSBub2RlIGxpc3QuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gbGlzdCB0aGUgbGlzdAorICAgICAgICAgKiBAcGFyYW0gbGlzdAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBsaXN0LgogICAgICAgICAgKi8KICAgICAgICAgSUlPTWV0YWRhdGFOb2RlTGlzdChMaXN0PElJT01ldGFkYXRhTm9kZT4gbGlzdCkgewogICAgICAgICAgICAgdGhpcy5saXN0ID0gbGlzdDsKQEAgLTY0NCw3ICsxMDM1LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBOb2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgZm9yKElJT01ldGFkYXRhTm9kZSBub2RlOmxpc3QpIHsKKyAgICAgICAgICAgIGZvciAoSUlPTWV0YWRhdGFOb2RlIG5vZGUgOiBsaXN0KSB7CiAgICAgICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKG5vZGUuZ2V0Tm9kZU5hbWUoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgICAgICAgICAgICAgfQpAQCAtNjUzLDExICsxMDQ0LDEzIEBACiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgTm9kZSBzZXROYW1lZEl0ZW0oTm9kZSBhcmcpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCAiVGhpcyBOYW1lZE5vZGVNYXAgaXMgcmVhZC1vbmx5ISIpOworICAgICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLAorICAgICAgICAgICAgICAgICAgICAiVGhpcyBOYW1lZE5vZGVNYXAgaXMgcmVhZC1vbmx5ISIpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIE5vZGUgcmVtb3ZlTmFtZWRJdGVtKFN0cmluZyBuYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgIlRoaXMgTmFtZWROb2RlTWFwIGlzIHJlYWQtb25seSEiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwKKyAgICAgICAgICAgICAgICAgICAgIlRoaXMgTmFtZWROb2RlTWFwIGlzIHJlYWQtb25seSEiKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBOb2RlIGdldE5hbWVkSXRlbU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewpAQCAtNjY1LDExICsxMDU4LDEzIEBACiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgTm9kZSBzZXROYW1lZEl0ZW1OUyhOb2RlIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsICJUaGlzIE5hbWVkTm9kZU1hcCBpcyByZWFkLW9ubHkhIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsCisgICAgICAgICAgICAgICAgICAgICJUaGlzIE5hbWVkTm9kZU1hcCBpcyByZWFkLW9ubHkhIik7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgTm9kZSByZW1vdmVOYW1lZEl0ZW1OUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgIlRoaXMgTmFtZWROb2RlTWFwIGlzIHJlYWQtb25seSEiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwKKyAgICAgICAgICAgICAgICAgICAgIlRoaXMgTmFtZWROb2RlTWFwIGlzIHJlYWQtb25seSEiKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL21ldGFkYXRhL0lJT1N0YW5kYXJkTWV0YWRhdGFGb3JtYXQuamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL21ldGFkYXRhL0lJT1N0YW5kYXJkTWV0YWRhdGFGb3JtYXQuamF2YQppbmRleCA5NGQyMTI1Li43MDZjYjJmIDEwMDY0NAotLS0gYS9hd3QvamF2YXgvaW1hZ2Vpby9tZXRhZGF0YS9JSU9TdGFuZGFyZE1ldGFkYXRhRm9ybWF0LmphdmEKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vbWV0YWRhdGEvSUlPU3RhbmRhcmRNZXRhZGF0YUZvcm1hdC5qYXZhCkBAIC0xNSwxOCArMTUsMTkgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0KIHBhY2thZ2UgamF2YXguaW1hZ2Vpby5tZXRhZGF0YTsKIAogaW1wb3J0IGphdmF4LmltYWdlaW8uSW1hZ2VUeXBlU3BlY2lmaWVyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAKIC8qKgotICogVGhlIENsYXNzIElJT1N0YW5kYXJkTWV0YWRhdGFGb3JtYXQgZGVzY3JpYmVzIHRoZSBydWxlcyBvZiB0aGUgCi0gKiBzdGFuZGFyZCBtZXRhZGF0YSBmb3JtYXQuCisgKiBUaGUgY2xhc3MgSUlPU3RhbmRhcmRNZXRhZGF0YUZvcm1hdCBkZXNjcmliZXMgdGhlIHJ1bGVzIG9mIHRoZSBzdGFuZGFyZAorICogbWV0YWRhdGEgZm9ybWF0LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwotY2xhc3MgSUlPU3RhbmRhcmRNZXRhZGF0YUZvcm1hdCAgZXh0ZW5kcyBJSU9NZXRhZGF0YUZvcm1hdEltcGwgewotICAgIAorY2xhc3MgSUlPU3RhbmRhcmRNZXRhZGF0YUZvcm1hdCBleHRlbmRzIElJT01ldGFkYXRhRm9ybWF0SW1wbCB7CisKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgSUlPU3RhbmRhcmRNZXRhZGF0YUZvcm1hdC4KICAgICAgKi8KQEAgLTQxLDcgKzQyLDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBCdWlsZHMgdGhlIGR0ZCB0aGF0IGRlc2NyaWJlcyB0aGUgc3RhbmRhcmQgbWV0YWRhdGEgZm9ybWF0LgorICAgICAqIEJ1aWxkcyB0aGUgRFREIHRoYXQgZGVzY3JpYmVzIHRoZSBzdGFuZGFyZCBtZXRhZGF0YSBmb3JtYXQuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGJ1aWxkRFREKCkgewogICAgICAgICAvLyBDSFJPTUEKQEAgLTgwLDcgKzgxLDEwIEBACiAgICAgICAgIGFkZEF0dHJpYnV0ZSgiQ29sb3JTcGFjZVR5cGUiLCAibmFtZSIsIERBVEFUWVBFX1NUUklORywgdHJ1ZSwgbnVsbCwgdmFsdWVzKTsKIAogICAgICAgICBhZGRFbGVtZW50KCJOdW1DaGFubmVscyIsICJDaHJvbWEiLCBDSElMRF9QT0xJQ1lfRU1QVFkpOwotICAgICAgICBhZGRBdHRyaWJ1dGUoIk51bUNoYW5uZWxzIiwgInZhbHVlIiwgREFUQVRZUEVfSU5URUdFUiwgdHJ1ZSwgMCwgSW50ZWdlci5NQVhfVkFMVUUpOyAvLyBsaXN0IC0gd2h5PworICAgICAgICBhZGRBdHRyaWJ1dGUoIk51bUNoYW5uZWxzIiwgInZhbHVlIiwgREFUQVRZUEVfSU5URUdFUiwgdHJ1ZSwgMCwgSW50ZWdlci5NQVhfVkFMVUUpOyAvLyBsaXN0CisgICAgICAgIC8vIC0KKyAgICAgICAgLy8gd2h5CisgICAgICAgIC8vID8KIAogICAgICAgICBhZGRFbGVtZW50KCJHYW1tYSIsICJDaHJvbWEiLCBDSElMRF9QT0xJQ1lfRU1QVFkpOwogICAgICAgICBhZGRBdHRyaWJ1dGUoIkdhbW1hIiwgInZhbHVlIiwgREFUQVRZUEVfRkxPQVQsIHRydWUsIG51bGwpOwpAQCAtMTQyLDEwICsxNDYsOCBAQAogICAgICAgICBhZGRBdHRyaWJ1dGUoIkJpdHNQZXJTYW1wbGUiLCAidmFsdWUiLCBEQVRBVFlQRV9JTlRFR0VSLCB0cnVlLCAxLCBJbnRlZ2VyLk1BWF9WQUxVRSk7IC8vIGxpc3QKIAogICAgICAgICBhZGRFbGVtZW50KCJTaWduaWZpY2FudEJpdHNQZXJTYW1wbGUiLCAiRGF0YSIsIENISUxEX1BPTElDWV9FTVBUWSk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAiU2lnbmlmaWNhbnRCaXRzUGVyU2FtcGxlIiwgInZhbHVlIiwKLSAgICAgICAgICAgICAgICBEQVRBVFlQRV9JTlRFR0VSLCB0cnVlLCAxLCBJbnRlZ2VyLk1BWF9WQUxVRQotICAgICAgICApOyAvLyBsaXN0CisgICAgICAgIGFkZEF0dHJpYnV0ZSgiU2lnbmlmaWNhbnRCaXRzUGVyU2FtcGxlIiwgInZhbHVlIiwgREFUQVRZUEVfSU5URUdFUiwgdHJ1ZSwgMSwKKyAgICAgICAgICAgICAgICBJbnRlZ2VyLk1BWF9WQUxVRSk7IC8vIGxpc3QKIAogICAgICAgICBhZGRFbGVtZW50KCJTYW1wbGVNU0IiLCAiRGF0YSIsIENISUxEX1BPTElDWV9FTVBUWSk7CiAgICAgICAgIGFkZEF0dHJpYnV0ZSgiU2FtcGxlTVNCIiwgInZhbHVlIiwgREFUQVRZUEVfSU5URUdFUiwgdHJ1ZSwgMSwgSW50ZWdlci5NQVhfVkFMVUUpOyAvLyBsaXN0CkBAIC0yMjQsNDkgKzIyNiwyOSBAQAogCiAgICAgICAgIGFkZEVsZW1lbnQoIkltYWdlQ3JlYXRpb25UaW1lIiwgIkRvY3VtZW50IiwgQ0hJTERfUE9MSUNZX0VNUFRZKTsKICAgICAgICAgYWRkQXR0cmlidXRlKCJJbWFnZUNyZWF0aW9uVGltZSIsICJ5ZWFyIiwgREFUQVRZUEVfSU5URUdFUiwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAiSW1hZ2VDcmVhdGlvblRpbWUiLCAibW9udGgiLAotICAgICAgICAgICAgICAgIERBVEFUWVBFX0lOVEVHRVIsIHRydWUsIG51bGwsICIxIiwgIjEyIiwgdHJ1ZSwgdHJ1ZQotICAgICAgICApOwotICAgICAgICBhZGRBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgIkltYWdlQ3JlYXRpb25UaW1lIiwgImRheSIsCi0gICAgICAgICAgICAgICAgREFUQVRZUEVfSU5URUdFUiwgdHJ1ZSwgbnVsbCwgIjEiLCAiMzEiLCB0cnVlLCB0cnVlCi0gICAgICAgICk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAiSW1hZ2VDcmVhdGlvblRpbWUiLCAiaG91ciIsCi0gICAgICAgICAgICAgICAgREFUQVRZUEVfSU5URUdFUiwgZmFsc2UsICIwIiwgIjAiLCAiMjMiLCB0cnVlLCB0cnVlCi0gICAgICAgICk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAiSW1hZ2VDcmVhdGlvblRpbWUiLCAibWludXRlIiwKLSAgICAgICAgICAgICAgICBEQVRBVFlQRV9JTlRFR0VSLCBmYWxzZSwgIjAiLCAiMCIsICI1OSIsIHRydWUsIHRydWUKLSAgICAgICAgKTsKLSAgICAgICAgYWRkQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICJJbWFnZUNyZWF0aW9uVGltZSIsICJzZWNvbmQiLAotICAgICAgICAgICAgICAgIERBVEFUWVBFX0lOVEVHRVIsIGZhbHNlLCAiMCIsICIwIiwgIjYwIiwgdHJ1ZSwgdHJ1ZQotICAgICAgICApOworICAgICAgICBhZGRBdHRyaWJ1dGUoIkltYWdlQ3JlYXRpb25UaW1lIiwgIm1vbnRoIiwgREFUQVRZUEVfSU5URUdFUiwgdHJ1ZSwgbnVsbCwgIjEiLCAiMTIiLCB0cnVlLAorICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICBhZGRBdHRyaWJ1dGUoIkltYWdlQ3JlYXRpb25UaW1lIiwgImRheSIsIERBVEFUWVBFX0lOVEVHRVIsIHRydWUsIG51bGwsICIxIiwgIjMxIiwgdHJ1ZSwKKyAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgICAgYWRkQXR0cmlidXRlKCJJbWFnZUNyZWF0aW9uVGltZSIsICJob3VyIiwgREFUQVRZUEVfSU5URUdFUiwgZmFsc2UsICIwIiwgIjAiLCAiMjMiLCB0cnVlLAorICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICBhZGRBdHRyaWJ1dGUoIkltYWdlQ3JlYXRpb25UaW1lIiwgIm1pbnV0ZSIsIERBVEFUWVBFX0lOVEVHRVIsIGZhbHNlLCAiMCIsICIwIiwgIjU5IiwgdHJ1ZSwKKyAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgICAgYWRkQXR0cmlidXRlKCJJbWFnZUNyZWF0aW9uVGltZSIsICJzZWNvbmQiLCBEQVRBVFlQRV9JTlRFR0VSLCBmYWxzZSwgIjAiLCAiMCIsICI2MCIsIHRydWUsCisgICAgICAgICAgICAgICAgdHJ1ZSk7CiAKICAgICAgICAgYWRkRWxlbWVudCgiSW1hZ2VNb2RpZmljYXRpb25UaW1lIiwgIkRvY3VtZW50IiwgQ0hJTERfUE9MSUNZX0VNUFRZKTsKICAgICAgICAgYWRkQXR0cmlidXRlKCJJbWFnZU1vZGlmaWNhdGlvblRpbWUiLCAieWVhciIsIERBVEFUWVBFX0lOVEVHRVIsIHRydWUsIG51bGwpOwotICAgICAgICBhZGRBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgIkltYWdlTW9kaWZpY2F0aW9uVGltZSIsICJtb250aCIsCi0gICAgICAgICAgICAgICAgREFUQVRZUEVfSU5URUdFUiwgdHJ1ZSwgbnVsbCwgIjEiLCAiMTIiLCB0cnVlLCB0cnVlCi0gICAgICAgICk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAiSW1hZ2VNb2RpZmljYXRpb25UaW1lIiwgImRheSIsCi0gICAgICAgICAgICAgICAgREFUQVRZUEVfSU5URUdFUiwgdHJ1ZSwgbnVsbCwgIjEiLCAiMzEiLCB0cnVlLCB0cnVlCi0gICAgICAgICk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAiSW1hZ2VNb2RpZmljYXRpb25UaW1lIiwgImhvdXIiLAotICAgICAgICAgICAgICAgIERBVEFUWVBFX0lOVEVHRVIsIGZhbHNlLCAiMCIsICIwIiwgIjIzIiwgdHJ1ZSwgdHJ1ZQotICAgICAgICApOwotICAgICAgICBhZGRBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgIkltYWdlTW9kaWZpY2F0aW9uVGltZSIsICJtaW51dGUiLAotICAgICAgICAgICAgICAgIERBVEFUWVBFX0lOVEVHRVIsIGZhbHNlLCAiMCIsICIwIiwgIjU5IiwgdHJ1ZSwgdHJ1ZQotICAgICAgICApOwotICAgICAgICBhZGRBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgIkltYWdlTW9kaWZpY2F0aW9uVGltZSIsICJzZWNvbmQiLAotICAgICAgICAgICAgICAgIERBVEFUWVBFX0lOVEVHRVIsIGZhbHNlLCAiMCIsICIwIiwgIjYwIiwgdHJ1ZSwgdHJ1ZQotICAgICAgICApOworICAgICAgICBhZGRBdHRyaWJ1dGUoIkltYWdlTW9kaWZpY2F0aW9uVGltZSIsICJtb250aCIsIERBVEFUWVBFX0lOVEVHRVIsIHRydWUsIG51bGwsICIxIiwgIjEyIiwKKyAgICAgICAgICAgICAgICB0cnVlLCB0cnVlKTsKKyAgICAgICAgYWRkQXR0cmlidXRlKCJJbWFnZU1vZGlmaWNhdGlvblRpbWUiLCAiZGF5IiwgREFUQVRZUEVfSU5URUdFUiwgdHJ1ZSwgbnVsbCwgIjEiLCAiMzEiLCB0cnVlLAorICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICBhZGRBdHRyaWJ1dGUoIkltYWdlTW9kaWZpY2F0aW9uVGltZSIsICJob3VyIiwgREFUQVRZUEVfSU5URUdFUiwgZmFsc2UsICIwIiwgIjAiLCAiMjMiLAorICAgICAgICAgICAgICAgIHRydWUsIHRydWUpOworICAgICAgICBhZGRBdHRyaWJ1dGUoIkltYWdlTW9kaWZpY2F0aW9uVGltZSIsICJtaW51dGUiLCBEQVRBVFlQRV9JTlRFR0VSLCBmYWxzZSwgIjAiLCAiMCIsICI1OSIsCisgICAgICAgICAgICAgICAgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgIGFkZEF0dHJpYnV0ZSgiSW1hZ2VNb2RpZmljYXRpb25UaW1lIiwgInNlY29uZCIsIERBVEFUWVBFX0lOVEVHRVIsIGZhbHNlLCAiMCIsICIwIiwgIjYwIiwKKyAgICAgICAgICAgICAgICB0cnVlLCB0cnVlKTsKIAogICAgICAgICAvLyBURVhUCiAgICAgICAgIGFkZEVsZW1lbnQoIlRleHQiLCBzdGFuZGFyZE1ldGFkYXRhRm9ybWF0TmFtZSwgMCwgSW50ZWdlci5NQVhfVkFMVUUpOyAvLyBDSElMRF9QT0xJQ1lfUkVQRUFUCkBAIC0zMTMsNCArMjk1LDMgQEAKICAgICAgICAgYWRkQXR0cmlidXRlKCJPcGFxdWVUaWxlIiwgInkiLCBEQVRBVFlQRV9JTlRFR0VSLCB0cnVlLCBudWxsKTsKICAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL21ldGFkYXRhL3BhY2thZ2UuaHRtbCBiL2F3dC9qYXZheC9pbWFnZWlvL21ldGFkYXRhL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWJkNTFiCi0tLSAvZGV2L251bGwKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vbWV0YWRhdGEvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsOCBAQAorPGh0bWw+CisgIDxib2R5PgorICAgIDxwPgorICAgICAgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIGNsYXNzZXMgd2hpY2ggYWxsb3dzIHRvIHJlYWQgYW5kIHdyaXRlIGRlc2NyaWJpbmcgbWV0YWRhdGEgb2YgaW1hZ2UgZmlsZXMuCisgICAgPC9wPgorICBAc2luY2UgQW5kcm9pZCAxLjAKKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvYXd0L2phdmF4L2ltYWdlaW8vcGFja2FnZS5odG1sIGIvYXd0L2phdmF4L2ltYWdlaW8vcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZDYxNDgKLS0tIC9kZXYvbnVsbAorKysgYi9hd3QvamF2YXgvaW1hZ2Vpby9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSw4IEBACis8aHRtbD4KKyAgPGJvZHk+CisgICAgPHA+CisgICAgICBUaGlzIHBhY2thZ2UgY29udGFpbnMgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcyB3aGljaCBwcm92aWRlcyBhbiBJbWFnZSBJL08gQVBJLiBUaGUgY29udGFpbmVkIGNsYXNzZXMgYW5kIGludGVyZmFjZXMgYWxsb3cgcmVhZGluZyBhbmQgd3JpdGluZyBpbWFnZSBmaWxlcyBvZiBkaWZmZXJlbnQgZm9ybWF0cy4KKyAgICA8L3A+CisgIEBzaW5jZSBBbmRyb2lkIDEuMAorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9wbHVnaW5zL2JtcC9CTVBJbWFnZVdyaXRlUGFyYW0uamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL3BsdWdpbnMvYm1wL0JNUEltYWdlV3JpdGVQYXJhbS5qYXZhCmluZGV4IDBjZDQ0ZGIuLmVjZmIyMGEgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL3BsdWdpbnMvYm1wL0JNUEltYWdlV3JpdGVQYXJhbS5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL3BsdWdpbnMvYm1wL0JNUEltYWdlV3JpdGVQYXJhbS5qYXZhCkBAIC0xNSwxOSArMTUsMjEgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0KIHBhY2thZ2UgamF2YXguaW1hZ2Vpby5wbHVnaW5zLmJtcDsKIAogaW1wb3J0IGphdmF4LmltYWdlaW8uSW1hZ2VXcml0ZVBhcmFtOwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKIC8qKgotICogVGhlIEJNUEltYWdlV3JpdGVQYXJhbSBjbGFzcyBhbGxvd3MgZW5jb2RpbmcgYW4gaW1hZ2UgaW4KLSAqIEJNUCBmb3JtYXQuCisgKiBUaGUgQk1QSW1hZ2VXcml0ZVBhcmFtIGNsYXNzIGFsbG93cyBlbmNvZGluZyBhbiBpbWFnZSBpbiBCTVAgZm9ybWF0LgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEJNUEltYWdlV3JpdGVQYXJhbSBleHRlbmRzIEltYWdlV3JpdGVQYXJhbSB7Ci0gICAgCi0gICAgLyoqIFRoZSB0b3AgZG93bi4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSB0b3AgZG93bi4KKyAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gdG9wRG93bjsgLy8gRGVmYXVsdCBpcyBib3R0b20tdXAKIAogICAgIC8qKgpAQCAtNDEsMzMgKzQzLDM1IEBACiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEJNUEltYWdlV3JpdGVQYXJhbSB3aXRoIHRoZSBzcGVjaWZpZWQgTG9jYWxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBsb2NhbGUgdGhlIHNwZWNpZmllZCBMb2NhbGUuCisgICAgICogQHBhcmFtIGxvY2FsZQorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBMb2NhbGUuCiAgICAgICovCiAgICAgcHVibGljIEJNUEltYWdlV3JpdGVQYXJhbShMb2NhbGUgbG9jYWxlKSB7CiAgICAgICAgIHN1cGVyKGxvY2FsZSk7CiAKICAgICAgICAgLy8gU2V0IHRoZSBjb21wcmVzc2lvbgogICAgICAgICBjYW5Xcml0ZUNvbXByZXNzZWQgPSB0cnVlOwotICAgICAgICBjb21wcmVzc2lvblR5cGVzID0gbmV3IFN0cmluZ1tdIHsiQklfUkdCIiwgIkJJX1JMRTgiLCAiQklfUkxFNCIsICJCSV9CSVRGSUVMRFMifTsKLSAgICAgICAgY29tcHJlc3Npb25UeXBlID0gY29tcHJlc3Npb25UeXBlc1swXTsgCisgICAgICAgIGNvbXByZXNzaW9uVHlwZXMgPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgICAgICJCSV9SR0IiLCAiQklfUkxFOCIsICJCSV9STEU0IiwgIkJJX0JJVEZJRUxEUyIKKyAgICAgICAgfTsKKyAgICAgICAgY29tcHJlc3Npb25UeXBlID0gY29tcHJlc3Npb25UeXBlc1swXTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRydWUgaWYgdGhlIGRhdGEgd2lsbCBiZSB3cml0dGVuIGluIGEgdG9wLWRvd24gb3JkZXIsIAotICAgICAqIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBTZXRzIHRydWUgaWYgdGhlIGRhdGEgd2lsbCBiZSB3cml0dGVuIGluIGEgdG9wLWRvd24gb3JkZXIsIGZhbHNlCisgICAgICogb3RoZXJ3aXNlLgogICAgICAqIAotICAgICAqIEBwYXJhbSB0b3BEb3duIHRoZSBuZXcgdG9wLWRvd24gdmFsdWUuIAorICAgICAqIEBwYXJhbSB0b3BEb3duCisgICAgICogICAgICAgICAgICB0aGUgbmV3IHRvcC1kb3duIHZhbHVlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFRvcERvd24oYm9vbGVhbiB0b3BEb3duKSB7CiAgICAgICAgIHRoaXMudG9wRG93biA9IHRvcERvd247CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBkYXRhIGlzIHdyaXR0ZW4gaW4gdG9wLWRvd24gb3JkZXIsIGZhbHNlCi0gICAgICogb3RoZXJ3aXNlLgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGF0YSBpcyB3cml0dGVuIGluIHRvcC1kb3duIG9yZGVyLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBkYXRhIGlzIHdyaXR0ZW4gaW4gdG9wLWRvd24gb3JkZXIsIGZhbHNlCi0gICAgICogb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGF0YSBpcyB3cml0dGVuIGluIHRvcC1kb3duIG9yZGVyLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNUb3BEb3duKCkgewogICAgICAgICByZXR1cm4gdG9wRG93bjsKZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL3BsdWdpbnMvYm1wL3BhY2thZ2UuaHRtbCBiL2F3dC9qYXZheC9pbWFnZWlvL3BsdWdpbnMvYm1wL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDk0YTEwCi0tLSAvZGV2L251bGwKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vcGx1Z2lucy9ibXAvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsOCBAQAorPGh0bWw+CisgIDxib2R5PgorICAgIDxwPgorICAgICAgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIGF1eGlsaWFyeSBjbGFzc2VzIGZvciB0aGUgYnVpbHQtaW4gQk1QIGltYWdlIHBsdWctaW4uCisgICAgPC9wPgorICBAc2luY2UgQW5kcm9pZCAxLjAKKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvYXd0L2phdmF4L2ltYWdlaW8vcGx1Z2lucy9qcGVnL0pQRUdIdWZmbWFuVGFibGUuamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL3BsdWdpbnMvanBlZy9KUEVHSHVmZm1hblRhYmxlLmphdmEKaW5kZXggMzk4Yzk2MC4uNjdiNTA0YiAxMDA2NDQKLS0tIGEvYXd0L2phdmF4L2ltYWdlaW8vcGx1Z2lucy9qcGVnL0pQRUdIdWZmbWFuVGFibGUuamF2YQorKysgYi9hd3QvamF2YXgvaW1hZ2Vpby9wbHVnaW5zL2pwZWcvSlBFR0h1ZmZtYW5UYWJsZS5qYXZhCkBAIC0xOCw4MiArMTgsOTAgQEAKIHBhY2thZ2UgamF2YXguaW1hZ2Vpby5wbHVnaW5zLmpwZWc7CiAKIC8qKgotICogVGhlIEpQRUdIdWZmbWFuVGFibGUgY2xhc3MgcmVwcmVzZW50cyBhIHNpbmdsZSBKUEVHIEh1ZmZtYW4gdGFibGUuIAotICogSXQgY29udGFpbnMgdGhlIHN0YW5kYXJkIHRhYmxlcyBmcm9tIHRoZSBKUEVHIHNwZWNpZmljYXRpb24uCisgKiBUaGUgSlBFR0h1ZmZtYW5UYWJsZSBjbGFzcyByZXByZXNlbnRzIGEgc2luZ2xlIEpQRUcgSHVmZm1hbiB0YWJsZS4gSXQKKyAqIGNvbnRhaW5zIHRoZSBzdGFuZGFyZCB0YWJsZXMgZnJvbSB0aGUgSlBFRyBzcGVjaWZpY2F0aW9uLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEpQRUdIdWZmbWFuVGFibGUgewotICAgIAotICAgIC8qKiBUaGUgc3RhbmRhcmQgREMgbHVtaW5hbmNlIEh1ZmZtYW4gdGFibGUgLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSlBFR0h1ZmZtYW5UYWJsZSBTdGREQ0x1bWluYW5jZSA9IG5ldyBKUEVHSHVmZm1hblRhYmxlKAotICAgICAgICAgICAgbmV3IHNob3J0W10gezAsIDEsIDUsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAotICAgICAgICAgICAgbmV3IHNob3J0W10gezAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDB4MEEsIDB4MEJ9LAotICAgICAgICAgICAgZmFsc2UKLSAgICApOwogCi0gICAgLyoqIFRoZSBzdGFuZGFyZCBEQyBjaHJvbWluYW5jZSBIdWZmbWFuIHRhYmxlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSlBFR0h1ZmZtYW5UYWJsZSBTdGREQ0Nocm9taW5hbmNlID0gbmV3IEpQRUdIdWZmbWFuVGFibGUoCi0gICAgICAgICAgICBuZXcgc2hvcnRbXSB7MCwgMywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMH0sCi0gICAgICAgICAgICBuZXcgc2hvcnRbXSB7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMHgwQSwgMHgwQn0sCi0gICAgICAgICAgICBmYWxzZQotICAgICk7CisgICAgLyoqCisgICAgICogVGhlIHN0YW5kYXJkIERDIGx1bWluYW5jZSBIdWZmbWFuIHRhYmxlIC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEpQRUdIdWZmbWFuVGFibGUgU3RkRENMdW1pbmFuY2UgPSBuZXcgSlBFR0h1ZmZtYW5UYWJsZShuZXcgc2hvcnRbXSB7CisgICAgICAgICAgICAwLCAxLCA1LCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwCisgICAgfSwgbmV3IHNob3J0W10geworICAgICAgICAgICAgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMHgwQSwgMHgwQgorICAgIH0sIGZhbHNlKTsKIAotICAgIC8qKiBUaGUgc3RhbmRhcmQgQUMgbHVtaW5hbmNlIEh1ZmZtYW4gdGFibGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBKUEVHSHVmZm1hblRhYmxlIFN0ZEFDTHVtaW5hbmNlID0gbmV3IEpQRUdIdWZmbWFuVGFibGUoCi0gICAgICAgICAgICBuZXcgc2hvcnRbXSB7MCwgMiwgMSwgMywgMywgMiwgNCwgMywgNSwgNSwgNCwgNCwgMCwgMCwgMSwgMHg3RH0sCi0gICAgICAgICAgICBuZXcgc2hvcnRbXSB7Ci0gICAgICAgICAgICAgICAgICAgIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDAsIDB4MDQsIDB4MTEsIDB4MDUsIDB4MTIsIDB4MjEsIDB4MzEsIDB4NDEsIDB4MDYsCi0gICAgICAgICAgICAgICAgICAgIDB4MTMsIDB4NTEsIDB4NjEsIDB4MDcsIDB4MjIsIDB4NzEsIDB4MTQsIDB4MzIsIDB4ODEsIDB4OTEsIDB4QTEsIDB4MDgsCi0gICAgICAgICAgICAgICAgICAgIDB4MjMsIDB4NDIsIDB4QjEsIDB4QzEsIDB4MTUsIDB4NTIsIDB4RDEsIDB4RjAsIDB4MjQsIDB4MzMsIDB4NjIsIDB4NzIsCi0gICAgICAgICAgICAgICAgICAgIDB4ODIsIDB4MDksIDB4MEEsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksIDB4MUEsIDB4MjUsIDB4MjYsIDB4MjcsIDB4MjgsCi0gICAgICAgICAgICAgICAgICAgIDB4MjksIDB4MkEsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsIDB4MzksIDB4M0EsIDB4NDMsIDB4NDQsIDB4NDUsCi0gICAgICAgICAgICAgICAgICAgIDB4NDYsIDB4NDcsIDB4NDgsIDB4NDksIDB4NEEsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIDB4NTgsIDB4NTksCi0gICAgICAgICAgICAgICAgICAgIDB4NUEsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIDB4NjgsIDB4NjksIDB4NkEsIDB4NzMsIDB4NzQsIDB4NzUsCi0gICAgICAgICAgICAgICAgICAgIDB4NzYsIDB4NzcsIDB4NzgsIDB4NzksIDB4N0EsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIDB4ODgsIDB4ODksCi0gICAgICAgICAgICAgICAgICAgIDB4OEEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIDB4OTgsIDB4OTksIDB4OUEsIDB4QTIsIDB4QTMsCi0gICAgICAgICAgICAgICAgICAgIDB4QTQsIDB4QTUsIDB4QTYsIDB4QTcsIDB4QTgsIDB4QTksIDB4QUEsIDB4QjIsIDB4QjMsIDB4QjQsIDB4QjUsIDB4QjYsCi0gICAgICAgICAgICAgICAgICAgIDB4QjcsIDB4QjgsIDB4QjksIDB4QkEsIDB4QzIsIDB4QzMsIDB4QzQsIDB4QzUsIDB4QzYsIDB4QzcsIDB4QzgsIDB4QzksCi0gICAgICAgICAgICAgICAgICAgIDB4Q0EsIDB4RDIsIDB4RDMsIDB4RDQsIDB4RDUsIDB4RDYsIDB4RDcsIDB4RDgsIDB4RDksIDB4REEsIDB4RTEsIDB4RTIsCi0gICAgICAgICAgICAgICAgICAgIDB4RTMsIDB4RTQsIDB4RTUsIDB4RTYsIDB4RTcsIDB4RTgsIDB4RTksIDB4RUEsIDB4RjEsIDB4RjIsIDB4RjMsIDB4RjQsCi0gICAgICAgICAgICAgICAgICAgIDB4RjUsIDB4RjYsIDB4RjcsIDB4RjgsIDB4RjksIDB4RkEKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICBmYWxzZQotICAgICk7CisgICAgLyoqCisgICAgICogVGhlIHN0YW5kYXJkIERDIGNocm9taW5hbmNlIEh1ZmZtYW4gdGFibGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBKUEVHSHVmZm1hblRhYmxlIFN0ZERDQ2hyb21pbmFuY2UgPSBuZXcgSlBFR0h1ZmZtYW5UYWJsZShuZXcgc2hvcnRbXSB7CisgICAgICAgICAgICAwLCAzLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwCisgICAgfSwgbmV3IHNob3J0W10geworICAgICAgICAgICAgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMHgwQSwgMHgwQgorICAgIH0sIGZhbHNlKTsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgc3RhbmRhcmQgQUMgY2hyb21pbmFuY2UgSHVmZm1hbiB0YWJsZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEpQRUdIdWZmbWFuVGFibGUgU3RkQUNDaHJvbWluYW5jZSA9IG5ldyBKUEVHSHVmZm1hblRhYmxlKAotICAgICAgICAgICAgbmV3IHNob3J0W10gezAsIDIsIDEsIDIsIDQsIDQsIDMsIDQsIDcsIDUsIDQsIDQsIDAsIDEsIDIsIDB4Nzd9LAotICAgICAgICAgICAgbmV3IHNob3J0W10gewotICAgICAgICAgICAgICAgICAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDExLCAweDA0LCAweDA1LCAweDIxLCAweDMxLCAweDA2LCAweDEyLCAweDQxLAotICAgICAgICAgICAgICAgICAgICAweDUxLCAweDA3LCAweDYxLCAweDcxLCAweDEzLCAweDIyLCAweDMyLCAweDgxLCAweDA4LCAweDE0LCAweDQyLCAweDkxLAotICAgICAgICAgICAgICAgICAgICAweEExLCAweEIxLCAweEMxLCAweDA5LCAweDIzLCAweDMzLCAweDUyLCAweEYwLCAweDE1LCAweDYyLCAweDcyLCAweEQxLAotICAgICAgICAgICAgICAgICAgICAweDBBLCAweDE2LCAweDI0LCAweDM0LCAweEUxLCAweDI1LCAweEYxLCAweDE3LCAweDE4LCAweDE5LCAweDFBLCAweDI2LAotICAgICAgICAgICAgICAgICAgICAweDI3LCAweDI4LCAweDI5LCAweDJBLCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LCAweDNBLCAweDQzLCAweDQ0LAotICAgICAgICAgICAgICAgICAgICAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LCAweDQ5LCAweDRBLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LAotICAgICAgICAgICAgICAgICAgICAweDU5LCAweDVBLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAweDY4LCAweDY5LCAweDZBLCAweDczLCAweDc0LAotICAgICAgICAgICAgICAgICAgICAweDc1LCAweDc2LCAweDc3LCAweDc4LCAweDc5LCAweDdBLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LAotICAgICAgICAgICAgICAgICAgICAweDg4LCAweDg5LCAweDhBLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LCAweDk5LCAweDlBLAotICAgICAgICAgICAgICAgICAgICAweEEyLCAweEEzLCAweEE0LCAweEE1LCAweEE2LCAweEE3LCAweEE4LCAweEE5LCAweEFBLCAweEIyLCAweEIzLCAweEI0LAotICAgICAgICAgICAgICAgICAgICAweEI1LCAweEI2LCAweEI3LCAweEI4LCAweEI5LCAweEJBLCAweEMyLCAweEMzLCAweEM0LCAweEM1LCAweEM2LCAweEM3LAotICAgICAgICAgICAgICAgICAgICAweEM4LCAweEM5LCAweENBLCAweEQyLCAweEQzLCAweEQ0LCAweEQ1LCAweEQ2LCAweEQ3LCAweEQ4LCAweEQ5LCAweERBLAotICAgICAgICAgICAgICAgICAgICAweEUyLCAweEUzLCAweEU0LCAweEU1LCAweEU2LCAweEU3LCAweEU4LCAweEU5LCAweEVBLCAweEYyLCAweEYzLCAweEY0LAotICAgICAgICAgICAgICAgICAgICAweEY1LCAweEY2LCAweEY3LCAweEY4LCAweEY5LCAweEZBCi0gICAgICAgICAgICB9LAotICAgICAgICAgICAgZmFsc2UKLSAgICApOworICAgIC8qKgorICAgICAqIFRoZSBzdGFuZGFyZCBBQyBsdW1pbmFuY2UgSHVmZm1hbiB0YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEpQRUdIdWZmbWFuVGFibGUgU3RkQUNMdW1pbmFuY2UgPSBuZXcgSlBFR0h1ZmZtYW5UYWJsZShuZXcgc2hvcnRbXSB7CisgICAgICAgICAgICAwLCAyLCAxLCAzLCAzLCAyLCA0LCAzLCA1LCA1LCA0LCA0LCAwLCAwLCAxLCAweDdECisgICAgfSwgbmV3IHNob3J0W10geworICAgICAgICAgICAgMHgwMSwgMHgwMiwgMHgwMywgMHgwMCwgMHgwNCwgMHgxMSwgMHgwNSwgMHgxMiwgMHgyMSwgMHgzMSwgMHg0MSwgMHgwNiwgMHgxMywgMHg1MSwKKyAgICAgICAgICAgIDB4NjEsIDB4MDcsIDB4MjIsIDB4NzEsIDB4MTQsIDB4MzIsIDB4ODEsIDB4OTEsIDB4QTEsIDB4MDgsIDB4MjMsIDB4NDIsIDB4QjEsIDB4QzEsCisgICAgICAgICAgICAweDE1LCAweDUyLCAweEQxLCAweEYwLCAweDI0LCAweDMzLCAweDYyLCAweDcyLCAweDgyLCAweDA5LCAweDBBLCAweDE2LCAweDE3LCAweDE4LAorICAgICAgICAgICAgMHgxOSwgMHgxQSwgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyQSwgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwgMHgzOSwKKyAgICAgICAgICAgIDB4M0EsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsIDB4NDksIDB4NEEsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsCisgICAgICAgICAgICAweDU4LCAweDU5LCAweDVBLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAweDY4LCAweDY5LCAweDZBLCAweDczLCAweDc0LCAweDc1LAorICAgICAgICAgICAgMHg3NiwgMHg3NywgMHg3OCwgMHg3OSwgMHg3QSwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwgMHg4OSwgMHg4QSwgMHg5MiwKKyAgICAgICAgICAgIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIDB4OTgsIDB4OTksIDB4OUEsIDB4QTIsIDB4QTMsIDB4QTQsIDB4QTUsIDB4QTYsIDB4QTcsCisgICAgICAgICAgICAweEE4LCAweEE5LCAweEFBLCAweEIyLCAweEIzLCAweEI0LCAweEI1LCAweEI2LCAweEI3LCAweEI4LCAweEI5LCAweEJBLCAweEMyLCAweEMzLAorICAgICAgICAgICAgMHhDNCwgMHhDNSwgMHhDNiwgMHhDNywgMHhDOCwgMHhDOSwgMHhDQSwgMHhEMiwgMHhEMywgMHhENCwgMHhENSwgMHhENiwgMHhENywgMHhEOCwKKyAgICAgICAgICAgIDB4RDksIDB4REEsIDB4RTEsIDB4RTIsIDB4RTMsIDB4RTQsIDB4RTUsIDB4RTYsIDB4RTcsIDB4RTgsIDB4RTksIDB4RUEsIDB4RjEsIDB4RjIsCisgICAgICAgICAgICAweEYzLCAweEY0LCAweEY1LCAweEY2LCAweEY3LCAweEY4LCAweEY5LCAweEZBCisgICAgfSwgZmFsc2UpOwogCi0gICAgLyoqIFRoZSBsZW5ndGhzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBzdGFuZGFyZCBBQyBjaHJvbWluYW5jZSBIdWZmbWFuIHRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSlBFR0h1ZmZtYW5UYWJsZSBTdGRBQ0Nocm9taW5hbmNlID0gbmV3IEpQRUdIdWZmbWFuVGFibGUobmV3IHNob3J0W10geworICAgICAgICAgICAgMCwgMiwgMSwgMiwgNCwgNCwgMywgNCwgNywgNSwgNCwgNCwgMCwgMSwgMiwgMHg3NworICAgIH0sIG5ldyBzaG9ydFtdIHsKKyAgICAgICAgICAgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MTEsIDB4MDQsIDB4MDUsIDB4MjEsIDB4MzEsIDB4MDYsIDB4MTIsIDB4NDEsIDB4NTEsIDB4MDcsCisgICAgICAgICAgICAweDYxLCAweDcxLCAweDEzLCAweDIyLCAweDMyLCAweDgxLCAweDA4LCAweDE0LCAweDQyLCAweDkxLCAweEExLCAweEIxLCAweEMxLCAweDA5LAorICAgICAgICAgICAgMHgyMywgMHgzMywgMHg1MiwgMHhGMCwgMHgxNSwgMHg2MiwgMHg3MiwgMHhEMSwgMHgwQSwgMHgxNiwgMHgyNCwgMHgzNCwgMHhFMSwgMHgyNSwKKyAgICAgICAgICAgIDB4RjEsIDB4MTcsIDB4MTgsIDB4MTksIDB4MUEsIDB4MjYsIDB4MjcsIDB4MjgsIDB4MjksIDB4MkEsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsCisgICAgICAgICAgICAweDM5LCAweDNBLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LCAweDQ5LCAweDRBLCAweDUzLCAweDU0LCAweDU1LCAweDU2LAorICAgICAgICAgICAgMHg1NywgMHg1OCwgMHg1OSwgMHg1QSwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgMHg2OCwgMHg2OSwgMHg2QSwgMHg3MywgMHg3NCwKKyAgICAgICAgICAgIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsIDB4NzksIDB4N0EsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIDB4ODgsIDB4ODksCisgICAgICAgICAgICAweDhBLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LCAweDk5LCAweDlBLCAweEEyLCAweEEzLCAweEE0LCAweEE1LAorICAgICAgICAgICAgMHhBNiwgMHhBNywgMHhBOCwgMHhBOSwgMHhBQSwgMHhCMiwgMHhCMywgMHhCNCwgMHhCNSwgMHhCNiwgMHhCNywgMHhCOCwgMHhCOSwgMHhCQSwKKyAgICAgICAgICAgIDB4QzIsIDB4QzMsIDB4QzQsIDB4QzUsIDB4QzYsIDB4QzcsIDB4QzgsIDB4QzksIDB4Q0EsIDB4RDIsIDB4RDMsIDB4RDQsIDB4RDUsIDB4RDYsCisgICAgICAgICAgICAweEQ3LCAweEQ4LCAweEQ5LCAweERBLCAweEUyLCAweEUzLCAweEU0LCAweEU1LCAweEU2LCAweEU3LCAweEU4LCAweEU5LCAweEVBLCAweEYyLAorICAgICAgICAgICAgMHhGMywgMHhGNCwgMHhGNSwgMHhGNiwgMHhGNywgMHhGOCwgMHhGOSwgMHhGQQorICAgIH0sIGZhbHNlKTsKKworICAgIC8qKgorICAgICAqIFRoZSBsZW5ndGhzLgorICAgICAqLwogICAgIHByaXZhdGUgc2hvcnQgbGVuZ3Roc1tdOwotICAgIAotICAgIC8qKiBUaGUgdmFsdWVzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHZhbHVlcy4KKyAgICAgKi8KICAgICBwcml2YXRlIHNob3J0IHZhbHVlc1tdOwogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGpQRUcgaHVmZm1hbiB0YWJsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGVuZ3RocyB0aGUgbGVuZ3RocwotICAgICAqIEBwYXJhbSB2YWx1ZXMgdGhlIHZhbHVlcwotICAgICAqIEBwYXJhbSBjb3B5IHRoZSBjb3B5CisgICAgICogQHBhcmFtIGxlbmd0aHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGhzCisgICAgICogQHBhcmFtIHZhbHVlcworICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlcworICAgICAqIEBwYXJhbSBjb3B5CisgICAgICogICAgICAgICAgICB0aGUgY29weQogICAgICAqLwogICAgIEpQRUdIdWZmbWFuVGFibGUoc2hvcnRbXSBsZW5ndGhzLCBzaG9ydFtdIHZhbHVlcywgYm9vbGVhbiBjb3B5KSB7CiAgICAgICAgIC8vIENvbnN0cnVjdGlvbiBvZiBzdGFuZGFyZCB0YWJsZXMgd2l0aG91dCBjaGVja3MKQEAgLTEwNiw5ICsxMTQsMTEgQEAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgSlBFR0h1ZmZtYW5UYWJsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGVuZ3RocyB0aGUgYXJyYXkgb2Ygc2hvcnRzIGxlbmd0aHMuCi0gICAgICogQHBhcmFtIHZhbHVlcyB0aGUgYXJyYXkgb2Ygc2hvcnRzIGNvbnRhaW5pbmcgCi0gICAgICogdGhlIHZhbHVlcyBpbiBvcmRlciBvZiBpbmNyZWFzaW5nIGNvZGUgbGVuZ3RoLgorICAgICAqIEBwYXJhbSBsZW5ndGhzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2Ygc2hvcnRzIGxlbmd0aHMuCisgICAgICogQHBhcmFtIHZhbHVlcworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIHNob3J0cyBjb250YWluaW5nIHRoZSB2YWx1ZXMgaW4gb3JkZXIgb2YKKyAgICAgKiAgICAgICAgICAgIGluY3JlYXNpbmcgY29kZSBsZW5ndGguCiAgICAgICovCiAgICAgcHVibGljIEpQRUdIdWZmbWFuVGFibGUoc2hvcnRbXSBsZW5ndGhzLCBzaG9ydFtdIHZhbHVlcykgewogICAgICAgICBpZiAobGVuZ3RocyA9PSBudWxsKSB7CkBAIC0xNDUsOCArMTU1LDggQEAKICAgICAvKioKICAgICAgKiBHZXRzIGFuIGFycmF5IG9mIGxlbmd0aHMgaW4gdGhlIEh1ZmZtYW4gdGFibGUuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgYXJyYXkgb2Ygc2hvcnQgdmFsdWVzIHJlcHJlc2VudGluZyB0aGUKLSAgICAgKiBsZW5ndGggdmFsdWVzIGluIHRoZSBIdWZmbWFuIHRhYmxlLgorICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIHNob3J0IHZhbHVlcyByZXByZXNlbnRpbmcgdGhlIGxlbmd0aCB2YWx1ZXMgaW4gdGhlCisgICAgICogICAgICAgICBIdWZmbWFuIHRhYmxlLgogICAgICAqLwogICAgIHB1YmxpYyBzaG9ydFtdIGdldExlbmd0aHMoKSB7CiAgICAgICAgIHNob3J0IG5ld0xlbmd0aHNbXSA9IG5ldyBzaG9ydFtsZW5ndGhzLmxlbmd0aF07CkBAIC0xNTUsOCArMTY1LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIGFycmF5IG9mIHZhbHVlcyByZXByZXNlbnRlZCBieSBpbmNyZWFzaW5nIGxlbmd0aCBvZiAKLSAgICAgKiB0aGVpciBjb2Rlcy4KKyAgICAgKiBHZXRzIGFuIGFycmF5IG9mIHZhbHVlcyByZXByZXNlbnRlZCBieSBpbmNyZWFzaW5nIGxlbmd0aCBvZiB0aGVpciBjb2Rlcy4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiB2YWx1ZXMuCiAgICAgICovCkBAIC0xNjksOCArMTc4LDEwIEBACiAgICAgLyoqCiAgICAgICogQ2hlY2sgaHVmZm1hbiB0YWJsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGVuZ3RocyB0aGUgbGVuZ3RocwotICAgICAqIEBwYXJhbSB2YWx1ZXMgdGhlIHZhbHVlcworICAgICAqIEBwYXJhbSBsZW5ndGhzCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3Rocy4KKyAgICAgKiBAcGFyYW0gdmFsdWVzCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWVzLgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tIdWZmbWFuVGFibGUoc2hvcnRbXSBsZW5ndGhzLCBzaG9ydFtdIHZhbHVlcykgewogICAgICAgICBpbnQgbnVtTGVhdmVzID0gMDsKQEAgLTE3OSwxMyArMTkwLDE1IEBACiAgICAgICAgICAgICBudW1MZWF2ZXMgKz0gbGVuZ3RoOwogICAgICAgICAgICAgcG9zc2libGVMZWF2ZXMgLT0gbGVuZ3RoOwogICAgICAgICAgICAgaWYgKHBvc3NpYmxlTGVhdmVzIDwgMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgSHVmZm1hbiB0YWJsZSBwcm92aWRlZCwgbGVuZ3RocyBhcmUgaW5jb3JyZWN0LiIpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBIdWZmbWFuIHRhYmxlIHByb3ZpZGVkLCBsZW5ndGhzIGFyZSBpbmNvcnJlY3QuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwb3NzaWJsZUxlYXZlcyA8PD0gMTsKICAgICAgICAgfQogCiAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoICE9IG51bUxlYXZlcykgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBIdWZmbWFuIHRhYmxlIHByb3ZpZGVkLCBzdW0gb2YgbGVuZ3RocyAhPSB2YWx1ZXMuIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBIdWZmbWFuIHRhYmxlIHByb3ZpZGVkLCBzdW0gb2YgbGVuZ3RocyAhPSB2YWx1ZXMuIik7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL3BsdWdpbnMvanBlZy9KUEVHSW1hZ2VSZWFkUGFyYW0uamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL3BsdWdpbnMvanBlZy9KUEVHSW1hZ2VSZWFkUGFyYW0uamF2YQppbmRleCBkZDA4ZDUxLi4yZjNhOWE4IDEwMDY0NAotLS0gYS9hd3QvamF2YXgvaW1hZ2Vpby9wbHVnaW5zL2pwZWcvSlBFR0ltYWdlUmVhZFBhcmFtLmphdmEKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vcGx1Z2lucy9qcGVnL0pQRUdJbWFnZVJlYWRQYXJhbS5qYXZhCkBAIC0yMCwxOCArMjAsMjYgQEAKIGltcG9ydCBqYXZheC5pbWFnZWlvLkltYWdlUmVhZFBhcmFtOwogCiAvKioKLSAqIFRoZSBKUEVHSW1hZ2VSZWFkUGFyYW0gY2xhc3MgcHJvdmlkZXMgZnVuY3Rpb25hbGl0eSB0byBzZXQgSHVmZm1hbiB0YWJsZXMgCi0gKiBhbmQgcXVhbnRpemF0aW9uIHRhYmxlcyB3aGVuIHVzaW5nIHRoZSBKUEVHIHJlYWRlciBwbHVnLWluLgorICogVGhlIEpQRUdJbWFnZVJlYWRQYXJhbSBjbGFzcyBwcm92aWRlcyBmdW5jdGlvbmFsaXR5IHRvIHNldCBIdWZmbWFuIHRhYmxlcyBhbmQKKyAqIHF1YW50aXphdGlvbiB0YWJsZXMgd2hlbiB1c2luZyB0aGUgSlBFRyByZWFkZXIgcGx1Zy1pbi4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBKUEVHSW1hZ2VSZWFkUGFyYW0gZXh0ZW5kcyBJbWFnZVJlYWRQYXJhbSB7Ci0gICAgCi0gICAgLyoqIFRoZSBxIHRhYmxlcy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBxIHRhYmxlcy4KKyAgICAgKi8KICAgICBwcml2YXRlIEpQRUdRVGFibGUgcVRhYmxlc1tdOwotICAgIAotICAgIC8qKiBUaGUgZGMgaHVmZm1hbiB0YWJsZXMuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGMgaHVmZm1hbiB0YWJsZXMuCisgICAgICovCiAgICAgcHJpdmF0ZSBKUEVHSHVmZm1hblRhYmxlIGRjSHVmZm1hblRhYmxlc1tdOwotICAgIAotICAgIC8qKiBUaGUgYWMgaHVmZm1hbiB0YWJsZXMuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgYWMgaHVmZm1hbiB0YWJsZXMuCisgICAgICovCiAgICAgcHJpdmF0ZSBKUEVHSHVmZm1hblRhYmxlIGFjSHVmZm1hblRhYmxlc1tdOwogCiAgICAgLyoqCkBAIC00MywyOSArNTEsMjggQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGFibGVzIGFyZSBzZXQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGFibGVzIGFyZSBzZXQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRhYmxlcyBhcmUgc2V0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gYXJlVGFibGVzU2V0KCkgewogICAgICAgICByZXR1cm4gcVRhYmxlcyAhPSBudWxsOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHF1YW50aXphdGlvbiBhbmQgSHVmZm1hbiB0YWJsZXMgZm9yIHVzaW5nIGluIAotICAgICAqIGRlY29kaW5nIHN0cmVhbXMuCisgICAgICogU2V0cyB0aGUgcXVhbnRpemF0aW9uIGFuZCBIdWZmbWFuIHRhYmxlcyBmb3IgdXNpbmcgaW4gZGVjb2Rpbmcgc3RyZWFtcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcVRhYmxlcyB0aGUgcXVhbnRpemF0aW9uIHRhYmxlcy4KLSAgICAgKiBAcGFyYW0gRENIdWZmbWFuVGFibGVzIHRoZSBzdGFuZGFydCBEQyBIdWZmbWFuIHRhYmxlcy4KLSAgICAgKiBAcGFyYW0gQUNIdWZmbWFuVGFibGVzIHRoZSBzdGFuZGFydCBBQyBodWZmbWFuIHRhYmxlcy4KKyAgICAgKiBAcGFyYW0gcVRhYmxlcworICAgICAqICAgICAgICAgICAgdGhlIHF1YW50aXphdGlvbiB0YWJsZXMuCisgICAgICogQHBhcmFtIERDSHVmZm1hblRhYmxlcworICAgICAqICAgICAgICAgICAgdGhlIHN0YW5kYXJ0IERDIEh1ZmZtYW4gdGFibGVzLgorICAgICAqIEBwYXJhbSBBQ0h1ZmZtYW5UYWJsZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFuZGFydCBBQyBodWZmbWFuIHRhYmxlcy4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWNvZGVUYWJsZXMoCi0gICAgICAgICAgICBKUEVHUVRhYmxlW10gcVRhYmxlcywKLSAgICAgICAgICAgIEpQRUdIdWZmbWFuVGFibGVbXSBEQ0h1ZmZtYW5UYWJsZXMsCi0gICAgICAgICAgICBKUEVHSHVmZm1hblRhYmxlW10gQUNIdWZmbWFuVGFibGVzCi0gICAgKSB7CisgICAgcHVibGljIHZvaWQgc2V0RGVjb2RlVGFibGVzKEpQRUdRVGFibGVbXSBxVGFibGVzLCBKUEVHSHVmZm1hblRhYmxlW10gRENIdWZmbWFuVGFibGVzLAorICAgICAgICAgICAgSlBFR0h1ZmZtYW5UYWJsZVtdIEFDSHVmZm1hblRhYmxlcykgewogICAgICAgICBpZiAocVRhYmxlcyA9PSBudWxsIHx8IERDSHVmZm1hblRhYmxlcyA9PSBudWxsIHx8IEFDSHVmZm1hblRhYmxlcyA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIEpQRUcgdGFibGUgYXJyYXlzIik7CiAgICAgICAgIH0KLSAgICAgICAgaWYoRENIdWZmbWFuVGFibGVzLmxlbmd0aCAhPSBBQ0h1ZmZtYW5UYWJsZXMubGVuZ3RoKSB7CisgICAgICAgIGlmIChEQ0h1ZmZtYW5UYWJsZXMubGVuZ3RoICE9IEFDSHVmZm1hblRhYmxlcy5sZW5ndGgpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgSlBFRyB0YWJsZSBhcnJheXMiKTsKICAgICAgICAgfQogICAgICAgICBpZiAocVRhYmxlcy5sZW5ndGggPiA0IHx8IERDSHVmZm1hblRhYmxlcy5sZW5ndGggPiA0KSB7CkBAIC0xMTIsNSArMTE5LDUgQEAKICAgICAgKi8KICAgICBwdWJsaWMgSlBFR0h1ZmZtYW5UYWJsZVtdIGdldEFDSHVmZm1hblRhYmxlcygpIHsKICAgICAgICAgcmV0dXJuIGFjSHVmZm1hblRhYmxlcyA9PSBudWxsID8gbnVsbCA6IGFjSHVmZm1hblRhYmxlcy5jbG9uZSgpOwotICAgIH0gICAgCisgICAgfQogfQpkaWZmIC0tZ2l0IGEvYXd0L2phdmF4L2ltYWdlaW8vcGx1Z2lucy9qcGVnL0pQRUdJbWFnZVdyaXRlUGFyYW0uamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL3BsdWdpbnMvanBlZy9KUEVHSW1hZ2VXcml0ZVBhcmFtLmphdmEKaW5kZXggMzRhM2NkOS4uYjk3OTkxMSAxMDA2NDQKLS0tIGEvYXd0L2phdmF4L2ltYWdlaW8vcGx1Z2lucy9qcGVnL0pQRUdJbWFnZVdyaXRlUGFyYW0uamF2YQorKysgYi9hd3QvamF2YXgvaW1hZ2Vpby9wbHVnaW5zL2pwZWcvSlBFR0ltYWdlV3JpdGVQYXJhbS5qYXZhCkBAIC0yMywzOCArMjMsNTIgQEAKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCiAvKioKLSAqIFRoZSBKUEVHSW1hZ2VXcml0ZVBhcmFtIGNsYXNzIGFsbG93cyB0byBzZXQgSlBFRyBIdWZmbWFuIHRhYmxlcyAKLSAqIGFuZCBxdWFudGl6YXRpb24gd2hlbiB1c2luZyB0aGUgSlBFRyB3cml0ZXIgcGx1Zy1pbi4KKyAqIFRoZSBKUEVHSW1hZ2VXcml0ZVBhcmFtIGNsYXNzIGFsbG93cyB0byBzZXQgSlBFRyBIdWZmbWFuIHRhYmxlcyBhbmQKKyAqIHF1YW50aXphdGlvbiB3aGVuIHVzaW5nIHRoZSBKUEVHIHdyaXRlciBwbHVnLWluLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEpQRUdJbWFnZVdyaXRlUGFyYW0gZXh0ZW5kcyBJbWFnZVdyaXRlUGFyYW0gewotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgQ09NUF9RVUFMSVRZX1ZBTFVFUy4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdFtdIENPTVBfUVVBTElUWV9WQUxVRVMgPSB7MC4wNWYsIDAuNzVmLCAwLjk1Zn07Ci0gICAgCi0gICAgLyoqIFRoZSBDb25zdGFudCBDT01QX1FVQUxJVFlfREVTQ1JJUFRJT05TLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPTVBfUVVBTElUWV9ERVNDUklQVElPTlMgPSB7Ci0gICAgICAgICAgICAiTWluaW11bSB1c2VmdWwiLAotICAgICAgICAgICAgIlZpc3VhbGx5IGxvc3NsZXNzIiwKLSAgICAgICAgICAgICJNYXhpbXVtIHVzZWZ1bCIKKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBDT01QX1FVQUxJVFlfVkFMVUVTLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0W10gQ09NUF9RVUFMSVRZX1ZBTFVFUyA9IHsKKyAgICAgICAgICAgIDAuMDVmLCAwLjc1ZiwgMC45NWYKICAgICB9OwogCi0gICAgLyoqIFRoZSBxIHRhYmxlcy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgQ09NUF9RVUFMSVRZX0RFU0NSSVBUSU9OUy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT01QX1FVQUxJVFlfREVTQ1JJUFRJT05TID0geworICAgICAgICAgICAgIk1pbmltdW0gdXNlZnVsIiwgIlZpc3VhbGx5IGxvc3NsZXNzIiwgIk1heGltdW0gdXNlZnVsIgorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBUaGUgcSB0YWJsZXMuCisgICAgICovCiAgICAgcHJpdmF0ZSBKUEVHUVRhYmxlW10gcVRhYmxlczsKLSAgICAKLSAgICAvKiogVGhlIGRjIGh1ZmZtYW4gdGFibGVzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGRjIGh1ZmZtYW4gdGFibGVzLgorICAgICAqLwogICAgIHByaXZhdGUgSlBFR0h1ZmZtYW5UYWJsZVtdIGRjSHVmZm1hblRhYmxlczsKLSAgICAKLSAgICAvKiogVGhlIGFjIGh1ZmZtYW4gdGFibGVzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGFjIGh1ZmZtYW4gdGFibGVzLgorICAgICAqLwogICAgIHByaXZhdGUgSlBFR0h1ZmZtYW5UYWJsZVtdIGFjSHVmZm1hblRhYmxlczsKIAotICAgIC8qKiBUaGUgb3B0aW1pemUgaHVmZm1hbiB0YWJsZXMuICovCisgICAgLyoqCisgICAgICogVGhlIG9wdGltaXplIGh1ZmZtYW4gdGFibGVzLgorICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBvcHRpbWl6ZUh1ZmZtYW5UYWJsZXM7CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgSlBFR0ltYWdlV3JpdGVQYXJhbSBvYmplY3Qgd2l0aCAKLSAgICAgKiB0aGUgc3BlY2lmaWVkIExvY2FsZS4KKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgSlBFR0ltYWdlV3JpdGVQYXJhbSBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIExvY2FsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbG9jYWxlIHRoZSBMb2NhbGUuCisgICAgICogQHBhcmFtIGxvY2FsZQorICAgICAqICAgICAgICAgICAgdGhlIExvY2FsZS4KICAgICAgKi8KICAgICBwdWJsaWMgSlBFR0ltYWdlV3JpdGVQYXJhbShMb2NhbGUgbG9jYWxlKSB7CiAgICAgICAgIHN1cGVyKGxvY2FsZSk7CkBAIC02MywzNyArNzcsMzggQEAKICAgICAgICAgcHJvZ3Jlc3NpdmVNb2RlID0gSW1hZ2VXcml0ZVBhcmFtLk1PREVfRElTQUJMRUQ7CiAKICAgICAgICAgY2FuV3JpdGVDb21wcmVzc2VkID0gdHJ1ZTsKLSAgICAgICAgY29tcHJlc3Npb25UeXBlcyA9IG5ldyBTdHJpbmdbXXsiSlBFRyJ9OwotICAgICAgICBjb21wcmVzc2lvblR5cGUgPSBjb21wcmVzc2lvblR5cGVzWzBdOyAKKyAgICAgICAgY29tcHJlc3Npb25UeXBlcyA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAiSlBFRyIKKyAgICAgICAgfTsKKyAgICAgICAgY29tcHJlc3Npb25UeXBlID0gY29tcHJlc3Npb25UeXBlc1swXTsKICAgICAgICAgY29tcHJlc3Npb25RdWFsaXR5ID0gSlBFR0NvbnN0cy5ERUZBVUxUX0pQRUdfQ09NUFJFU1NJT05fUVVBTElUWTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGFibGVzIGFyZSBzZXQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGFibGVzIGFyZSBzZXQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRhYmxlcyBhcmUgc2V0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gYXJlVGFibGVzU2V0KCkgewogICAgICAgICByZXR1cm4gcVRhYmxlcyAhPSBudWxsOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHF1YW50aXphdGlvbiBhbmQgSHVmZm1hbiB0YWJsZXMgZm9yIHVzaW5nIGluIAotICAgICAqIGVuY29kaW5nIHN0cmVhbXMuCisgICAgICogU2V0cyB0aGUgcXVhbnRpemF0aW9uIGFuZCBIdWZmbWFuIHRhYmxlcyBmb3IgdXNpbmcgaW4gZW5jb2Rpbmcgc3RyZWFtcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcVRhYmxlcyB0aGUgcXVhbnRpemF0aW9uIHRhYmxlcy4KLSAgICAgKiBAcGFyYW0gRENIdWZmbWFuVGFibGVzIHRoZSBzdGFuZGFydCBEQyBIdWZmbWFuIHRhYmxlcy4KLSAgICAgKiBAcGFyYW0gQUNIdWZmbWFuVGFibGVzIHRoZSBzdGFuZGFydCBBQyBodWZmbWFuIHRhYmxlcy4KKyAgICAgKiBAcGFyYW0gcVRhYmxlcworICAgICAqICAgICAgICAgICAgdGhlIHF1YW50aXphdGlvbiB0YWJsZXMuCisgICAgICogQHBhcmFtIERDSHVmZm1hblRhYmxlcworICAgICAqICAgICAgICAgICAgdGhlIHN0YW5kYXJ0IERDIEh1ZmZtYW4gdGFibGVzLgorICAgICAqIEBwYXJhbSBBQ0h1ZmZtYW5UYWJsZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFuZGFydCBBQyBodWZmbWFuIHRhYmxlcy4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGVUYWJsZXMoCi0gICAgICAgICAgICBKUEVHUVRhYmxlW10gcVRhYmxlcywKLSAgICAgICAgICAgIEpQRUdIdWZmbWFuVGFibGVbXSBEQ0h1ZmZtYW5UYWJsZXMsCi0gICAgICAgICAgICBKUEVHSHVmZm1hblRhYmxlW10gQUNIdWZmbWFuVGFibGVzCi0gICAgKSB7CisgICAgcHVibGljIHZvaWQgc2V0RW5jb2RlVGFibGVzKEpQRUdRVGFibGVbXSBxVGFibGVzLCBKUEVHSHVmZm1hblRhYmxlW10gRENIdWZmbWFuVGFibGVzLAorICAgICAgICAgICAgSlBFR0h1ZmZtYW5UYWJsZVtdIEFDSHVmZm1hblRhYmxlcykgewogICAgICAgICBpZiAocVRhYmxlcyA9PSBudWxsIHx8IERDSHVmZm1hblRhYmxlcyA9PSBudWxsIHx8IEFDSHVmZm1hblRhYmxlcyA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIEpQRUcgdGFibGUgYXJyYXlzIik7CiAgICAgICAgIH0KLSAgICAgICAgaWYoRENIdWZmbWFuVGFibGVzLmxlbmd0aCAhPSBBQ0h1ZmZtYW5UYWJsZXMubGVuZ3RoKSB7CisgICAgICAgIGlmIChEQ0h1ZmZtYW5UYWJsZXMubGVuZ3RoICE9IEFDSHVmZm1hblRhYmxlcy5sZW5ndGgpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgSlBFRyB0YWJsZSBhcnJheXMiKTsKICAgICAgICAgfQogICAgICAgICBpZiAocVRhYmxlcy5sZW5ndGggPiA0IHx8IERDSHVmZm1hblRhYmxlcy5sZW5ndGggPiA0KSB7CkBAIC0xNTUsMjEgKzE3MCwyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIGZsYWcgaW5kaWNhdGVkIHRoYXQgdGhlIHdyaXRlciB3aWxsIGdlbmVyYXRlIG9wdGltaXplZCAKLSAgICAgKiBIdWZmbWFuIHRhYmxlcyBmb3IgdGhlIGltYWdlIGFzIHBhcnQgb2YgdGhlIHdyaXRpbmcgcHJvY2Vzcy4KKyAgICAgKiBTZXRzIHRoZSBmbGFnIGluZGljYXRlZCB0aGF0IHRoZSB3cml0ZXIgd2lsbCBnZW5lcmF0ZSBvcHRpbWl6ZWQgSHVmZm1hbgorICAgICAqIHRhYmxlcyBmb3IgdGhlIGltYWdlIGFzIHBhcnQgb2YgdGhlIHdyaXRpbmcgcHJvY2Vzcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gb3B0aW1pemUgdGhlIGZsYWcgb2Ygb3B0aW1pemluZyBodWZmbWFuIHRhYmxlcy4KKyAgICAgKiBAcGFyYW0gb3B0aW1pemUKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbGFnIG9mIG9wdGltaXppbmcgaHVmZm1hbiB0YWJsZXMuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0T3B0aW1pemVIdWZmbWFuVGFibGVzKGJvb2xlYW4gb3B0aW1pemUpIHsKICAgICAgICAgb3B0aW1pemVIdWZmbWFuVGFibGVzID0gb3B0aW1pemU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3cml0ZXIgZ2VuZXJhdGVzIG9wdGltaXplZCBIdWZmbWFuIHRhYmxlcywKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3cml0ZXIgZ2VuZXJhdGVzIG9wdGltaXplZCBIdWZmbWFuIHRhYmxlcywgZmFsc2UKKyAgICAgKiBvdGhlcndpc2UuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgdHJ1ZSBpZiB0aGUgd3JpdGVyIGdlbmVyYXRlcyBvcHRpbWl6ZWQgSHVmZm1hbiB0YWJsZXMsCi0gICAgICogZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHdyaXRlciBnZW5lcmF0ZXMgb3B0aW1pemVkIEh1ZmZtYW4gdGFibGVzLCBmYWxzZQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGdldE9wdGltaXplSHVmZm1hblRhYmxlcygpIHsKICAgICAgICAgcmV0dXJuIG9wdGltaXplSHVmZm1hblRhYmxlczsKZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL3BsdWdpbnMvanBlZy9KUEVHUVRhYmxlLmphdmEgYi9hd3QvamF2YXgvaW1hZ2Vpby9wbHVnaW5zL2pwZWcvSlBFR1FUYWJsZS5qYXZhCmluZGV4IDBjNWIzN2UuLjM0NjFkNDYgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL3BsdWdpbnMvanBlZy9KUEVHUVRhYmxlLmphdmEKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vcGx1Z2lucy9qcGVnL0pQRUdRVGFibGUuamF2YQpAQCAtMTgsODggKzE4LDkyIEBACiAgKiBAYXV0aG9yIFJ1c3RlbSBWLiBSYWZpa292CiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMyAkCiAgKi8KKwogcGFja2FnZSBqYXZheC5pbWFnZWlvLnBsdWdpbnMuanBlZzsKIAogLyoqCi0gKiBUaGUgSlBFR1FUYWJsZSBjbGFzcyByZXByZXNlbnRzIGEgc2luZ2xlIEpQRUcgcXVhbnRpemF0aW9uIHRhYmxlIAotICogYW5kIHByb3ZpZGVzIGZvciB0aGUgc3RhbmRhcmQgdGFibGVzIHRha2VuIGZyb20gdGhlIEpQRUcgc3BlY2lmaWNhdGlvbi4KKyAqIFRoZSBKUEVHUVRhYmxlIGNsYXNzIHJlcHJlc2VudHMgYSBzaW5nbGUgSlBFRyBxdWFudGl6YXRpb24gdGFibGUgYW5kIHByb3ZpZGVzCisgKiBmb3IgdGhlIHN0YW5kYXJkIHRhYmxlcyB0YWtlbiBmcm9tIHRoZSBKUEVHIHNwZWNpZmljYXRpb24uCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgSlBFR1FUYWJsZSB7CiAKLSAgICAvKiogVGhlIENvbnN0YW50IFNJWkUuICovCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IFNJWkUuCisgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNJWkUgPSA2NDsKLSAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IEJBU0VMSU5FX01BWC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBCQVNFTElORV9NQVguCisgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEJBU0VMSU5FX01BWCA9IDI1NTsKLSAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IE1BWC4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBNQVguCisgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1BWCA9IDMyNzY3OwogCi0KLSAgICAvKiogVGhlIHRhYmxlLiAqLworICAgIC8qKgorICAgICAqIFRoZSB0YWJsZS4KKyAgICAgKi8KICAgICBwcml2YXRlIGludFtdIHRoZVRhYmxlOwogCiAgICAgLyoKLSAgICAgKiBLMSAmIEsyIHRhYmxlcyBjYW4gYmUgZm91bmQgaW4gdGhlIEpQRUcgZm9ybWF0IHNwZWNpZmljYXRpb24gCi0gICAgICogYXQgaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvSlBFRy9pdHUtdDgxLnBkZgorICAgICAqIEsxICYgSzIgdGFibGVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgSlBFRyBmb3JtYXQgc3BlY2lmaWNhdGlvbiBhdAorICAgICAqIGh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL0pQRUcvaXR1LXQ4MS5wZGYKICAgICAgKi8KIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgSzFMdW1UYWJsZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgSzFMdW1UYWJsZS4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBLMUx1bVRhYmxlID0gbmV3IGludFtdIHsKLSAgICAgICAgMTYsICAxMSwgIDEwLCAgMTYsICAyNCwgIDQwLCAgNTEsICA2MSwKLSAgICAgICAgMTIsICAxMiwgIDE0LCAgMTksICAyNiwgIDU4LCAgNjAsICA1NSwKLSAgICAgICAgMTQsICAxMywgIDE2LCAgMjQsICA0MCwgIDU3LCAgNjksICA1NiwKLSAgICAgICAgMTQsICAxNywgIDIyLCAgMjksICA1MSwgIDg3LCAgODAsICA2MiwKLSAgICAgICAgMTgsICAyMiwgIDM3LCAgNTYsICA2OCwgIDEwOSwgMTAzLCA3NywKLSAgICAgICAgMjQsICAzNSwgIDU1LCAgNjQsICA4MSwgIDEwNCwgMTEzLCA5MiwKLSAgICAgICAgNDksICA2NCwgIDc4LCAgODcsICAxMDMsIDEyMSwgMTIwLCAxMDEsCi0gICAgICAgIDcyLCAgOTIsICA5NSwgIDk4LCAgMTEyLCAxMDAsIDEwMywgOTkKKyAgICAgICAgICAgIDE2LCAxMSwgMTAsIDE2LCAyNCwgNDAsIDUxLCA2MSwgMTIsIDEyLCAxNCwgMTksIDI2LCA1OCwgNjAsIDU1LCAxNCwgMTMsIDE2LCAyNCwgNDAsIDU3LAorICAgICAgICAgICAgNjksIDU2LCAxNCwgMTcsIDIyLCAyOSwgNTEsIDg3LCA4MCwgNjIsIDE4LCAyMiwgMzcsIDU2LCA2OCwgMTA5LCAxMDMsIDc3LCAyNCwgMzUsIDU1LAorICAgICAgICAgICAgNjQsIDgxLCAxMDQsIDExMywgOTIsIDQ5LCA2NCwgNzgsIDg3LCAxMDMsIDEyMSwgMTIwLCAxMDEsIDcyLCA5MiwgOTUsIDk4LCAxMTIsIDEwMCwKKyAgICAgICAgICAgIDEwMywgOTkKICAgICB9OwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBLMkNoclRhYmxlLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBLMkNoclRhYmxlLgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIEsyQ2hyVGFibGUgPSBuZXcgaW50W10gewotICAgICAgICAxNywgIDE4LCAgMjQsICA0NywgIDk5LCAgOTksICA5OSwgIDk5LAotICAgICAgICAxOCwgIDIxLCAgMjYsICA2NiwgIDk5LCAgOTksICA5OSwgIDk5LAotICAgICAgICAyNCwgIDI2LCAgNTYsICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAotICAgICAgICA0NywgIDY2LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAotICAgICAgICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAotICAgICAgICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAotICAgICAgICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAotICAgICAgICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5CisgICAgICAgICAgICAxNywgMTgsIDI0LCA0NywgOTksIDk5LCA5OSwgOTksIDE4LCAyMSwgMjYsIDY2LCA5OSwgOTksIDk5LCA5OSwgMjQsIDI2LCA1NiwgOTksIDk5LCA5OSwKKyAgICAgICAgICAgIDk5LCA5OSwgNDcsIDY2LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LAorICAgICAgICAgICAgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5CiAgICAgfTsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgSzFMdW1pbmFuY2UgaW5kaWNhdGVzIHN0YW5kYXJ0IHRhYmxlIEsuMSBmcm9tIEpQRUcKLSAgICAgKiBzcGVjaWZpY2F0aW9uIGFuZCBwcm9kdWNlcyAiZ29vZCIgcXVhbGl0eSBvdXRwdXQuIAorICAgIC8qKgorICAgICAqIFRoZSBLMUx1bWluYW5jZSBpbmRpY2F0ZXMgc3RhbmRhcmQgdGFibGUgSy4xIGZyb20gSlBFRyBzcGVjaWZpY2F0aW9uIGFuZAorICAgICAqIHByb2R1Y2VzICJnb29kIiBxdWFsaXR5IG91dHB1dC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEpQRUdRVGFibGUgSzFMdW1pbmFuY2UgPSBuZXcgSlBFR1FUYWJsZShLMUx1bVRhYmxlKTsKLSAgICAKLSAgICAvKiogCi0gICAgICogVGhlIEsxRGl2Mkx1bWluYW5jZSBpbmRpY2F0ZXMgSy4xIHRhYmxlIGZyb20gSlBFRwotICAgICAqIHNwZWNpZmljYXRpb24gd2l0aCBhbGwgZWxlbWVudHMgZGl2aWRlZCBieSAyIGFuZCBwcm9kdWNlcwotICAgICAqICJ2ZXJ5IGdvb2QiIHF1YWxpdHkgb3V0cHV0LiAKKworICAgIC8qKgorICAgICAqIFRoZSBLMURpdjJMdW1pbmFuY2UgaW5kaWNhdGVzIEsuMSB0YWJsZSBmcm9tIEpQRUcgc3BlY2lmaWNhdGlvbiB3aXRoIGFsbAorICAgICAqIGVsZW1lbnRzIGRpdmlkZWQgYnkgMiBhbmQgcHJvZHVjZXMgInZlcnkgZ29vZCIgcXVhbGl0eSBvdXRwdXQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBKUEVHUVRhYmxlIEsxRGl2Mkx1bWluYW5jZSA9IEsxTHVtaW5hbmNlLmdldFNjYWxlZEluc3RhbmNlKDAuNWYsIHRydWUpOwotICAgIAotICAgIC8qKiAKLSAgICAgKiBUaGUgSzJDaHJvbWluYW5jZSBpbmRpY2F0ZXMgSy4yIHRhYmxlIGZyb20gSlBFRwotICAgICAqIHNwZWNpZmljYXRpb24gYW5kIHByb2R1Y2VzICJnb29kIiBxdWFsaXR5IG91dHB1dC4gCisKKyAgICAvKioKKyAgICAgKiBUaGUgSzJDaHJvbWluYW5jZSBpbmRpY2F0ZXMgSy4yIHRhYmxlIGZyb20gSlBFRyBzcGVjaWZpY2F0aW9uIGFuZAorICAgICAqIHByb2R1Y2VzICJnb29kIiBxdWFsaXR5IG91dHB1dC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEpQRUdRVGFibGUgSzJDaHJvbWluYW5jZSA9IG5ldyBKUEVHUVRhYmxlKEsyQ2hyVGFibGUpOwotICAgIAotICAgIC8qKiAKKworICAgIC8qKgogICAgICAqIFRoZSBDb25zdGFudCBLMkRpdjJDaHJvbWluYW5jZSBpbmRpY2F0ZXMgSy4yIHRhYmxlIGZyb20gSlBFRwotICAgICAqIHNwZWNpZmljYXRpb24gd2l0aCBhbGwgZWxlbWVudHMgZGl2aWRlZCBieSAyIGFuZCBwcm9kdWNlcwotICAgICAqICJ2ZXJ5IGdvb2QiIHF1YWxpdHkgb3V0cHV0LiAKKyAgICAgKiBzcGVjaWZpY2F0aW9uIHdpdGggYWxsIGVsZW1lbnRzIGRpdmlkZWQgYnkgMiBhbmQgcHJvZHVjZXMgInZlcnkgZ29vZCIKKyAgICAgKiBxdWFsaXR5IG91dHB1dC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEpQRUdRVGFibGUgSzJEaXYyQ2hyb21pbmFuY2UgPSBLMkNocm9taW5hbmNlLmdldFNjYWxlZEluc3RhbmNlKDAuNWYsIHRydWUpOzsKIAotCiAgICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEpQRUdRVGFibGUgZnJvbSB0aGUgYXJyYXksIHdoaWNoIAotICAgICAqIHNob3VsZCBjb250YWluIDY0IGVsZW1lbnRzIGluIG5hdHVyYWwgb3JkZXIuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEpQRUdRVGFibGUgZnJvbSB0aGUgYXJyYXksIHdoaWNoIHNob3VsZCBjb250YWluIDY0CisgICAgICogZWxlbWVudHMgaW4gbmF0dXJhbCBvcmRlci4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGFibGUgdGhlIHF1YW50aXphdGlvbiB0YWJsZS4KKyAgICAgKiBAcGFyYW0gdGFibGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBxdWFudGl6YXRpb24gdGFibGUuCiAgICAgICovCiAgICAgcHVibGljIEpQRUdRVGFibGUoaW50W10gdGFibGUpIHsKICAgICAgICAgaWYgKHRhYmxlID09IG51bGwpIHsKQEAgLTExMiwyMyArMTE2LDIyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgY3VycmVudCBxdWFudGl6YXRpb24gdGFibGUgYXMgYW4gYXJyYXkgb2YgaW50IHZhbHVlcy4KKyAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHF1YW50aXphdGlvbiB0YWJsZSBhcyBhbiBhcnJheSBvZiBpbnRlZ2VyIHZhbHVlcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHF1YW50aXphdGlvbiB0YWJsZSBhcyBhbiBhcnJheSBvZiBpbnQgdmFsdWVzLgorICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgcXVhbnRpemF0aW9uIHRhYmxlIGFzIGFuIGFycmF5IG9mIGludGVnZXIgdmFsdWVzLgogICAgICAqLwogICAgIHB1YmxpYyBpbnRbXSBnZXRUYWJsZSgpIHsKICAgICAgICAgcmV0dXJuIHRoZVRhYmxlLmNsb25lKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgc2NhbGVkIGluc3RhbmNlIGFzIHF1YW50aXphdGlvbiB0YWJsZSB3aGVyZSAKLSAgICAgKiB0aGUgdmFsdWVzIGFyZSBtdWx0aXBsaWVkIGJ5IHRoZSBzY2FsZUZhY3RvciBhbmQgdGhlbiBjbGFtcGVkIAotICAgICAqIGlmIGZvcmNlQmFzZWxpbmUgaXMgdHJ1ZS4KKyAgICAgKiBHZXRzIHRoZSBzY2FsZWQgaW5zdGFuY2UgYXMgcXVhbnRpemF0aW9uIHRhYmxlIHdoZXJlIHRoZSB2YWx1ZXMgYXJlCisgICAgICogbXVsdGlwbGllZCBieSB0aGUgc2NhbGVGYWN0b3IgYW5kIHRoZW4gY2xhbXBlZCBpZiBmb3JjZUJhc2VsaW5lIGlzIHRydWUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNjYWxlRmFjdG9yIHRoZSBzY2FsZSBmYWN0b3Igb2YgdGFibGUuCi0gICAgICogQHBhcmFtIGZvcmNlQmFzZWxpbmUgdGhlIGZvcmNlIGJhc2VsaW5lIGZsYWcsIHRoZSB2YWx1ZXMgCi0gICAgICogc2hvdWxkIGJlIGNsYW1wZWQgaWYgdHJ1ZS4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2NhbGVGYWN0b3IKKyAgICAgKiAgICAgICAgICAgIHRoZSBzY2FsZSBmYWN0b3Igb2YgdGFibGUuCisgICAgICogQHBhcmFtIGZvcmNlQmFzZWxpbmUKKyAgICAgKiAgICAgICAgICAgIHRoZSBmb3JjZSBiYXNlbGluZSBmbGFnLCB0aGUgdmFsdWVzIHNob3VsZCBiZSBjbGFtcGVkIGlmIHRydWUuCiAgICAgICogQHJldHVybiB0aGUgbmV3IHF1YW50aXphdGlvbiB0YWJsZS4KICAgICAgKi8KICAgICBwdWJsaWMgSlBFR1FUYWJsZSBnZXRTY2FsZWRJbnN0YW5jZShmbG9hdCBzY2FsZUZhY3RvciwgYm9vbGVhbiBmb3JjZUJhc2VsaW5lKSB7CkBAIC0xNTYsNyArMTU5LDcgQEAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAvLy0tIFRPRE8gbW9yZSBpbmZvcm1hdGl2ZSBpbmZvCisgICAgICAgIC8vIC0tIFRPRE8gbW9yZSBpbmZvcm1hdGl2ZSBpbmZvCiAgICAgICAgIHJldHVybiAiSlBFR1FUYWJsZSI7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvYXd0L2phdmF4L2ltYWdlaW8vcGx1Z2lucy9qcGVnL3BhY2thZ2UuaHRtbCBiL2F3dC9qYXZheC9pbWFnZWlvL3BsdWdpbnMvanBlZy9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ1NzVjNAotLS0gL2Rldi9udWxsCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL3BsdWdpbnMvanBlZy9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSw4IEBACis8aHRtbD4KKyAgPGJvZHk+CisgICAgPHA+CisgICAgICBUaGlzIHBhY2thZ2UgY29udGFpbnMgYXV4aWxpYXJ5IGNsYXNzZXMgZm9yIHRoZSBidWlsdC1pbiBKUEVHIGltYWdlIHBsdWctaW4uCisgICAgPC9wPgorICBAc2luY2UgQW5kcm9pZCAxLjAKKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvYXd0L2phdmF4L2ltYWdlaW8vc3BpL0lJT1JlZ2lzdHJ5LmphdmEgYi9hd3QvamF2YXgvaW1hZ2Vpby9zcGkvSUlPUmVnaXN0cnkuamF2YQppbmRleCAzYzFjOTg5Li4wMWRkZWFhIDEwMDY0NAotLS0gYS9hd3QvamF2YXgvaW1hZ2Vpby9zcGkvSUlPUmVnaXN0cnkuamF2YQorKysgYi9hd3QvamF2YXgvaW1hZ2Vpby9zcGkvSUlPUmVnaXN0cnkuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBSdXN0ZW0gVi4gUmFmaWtvdgogICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjMgJAogICovCisKIHBhY2thZ2UgamF2YXguaW1hZ2Vpby5zcGk7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwpAQCAtMzksMzcgKzQwLDQxIEBACiAgKi8KIAogLyoqCi0gKiBUaGUgSUlPUmVnaXN0cnkgY2xhc3MgcmVnaXN0ZXJzIHNlcnZpY2UgcHJvdmlkZXIgaW5zdGFuY2VzIAotICogKFNQSSkuIFNlcnZpY2UgcHJvdmlkZXIgaW5zdGFuY2VzIGFyZSByZWNvZ25pemVkIGJ5IHNwZWNpZmljIAotICogbWV0YS1pbmZvcm1hdGlvbiBpbiB0aGUgSkFSIGZpbGVzIGNvbnRhaW5pbmcgdGhlbS4gVGhlIEpBUgotICogZmlsZXMgd2l0aCBTUEkgY2xhc3NlcyBhcmUgbG9hZGVkIGZyb20gdGhlIGFwcGxpY2F0aW9uIGNsYXNzIAotICogcGF0aC4gCisgKiBUaGUgSUlPUmVnaXN0cnkgY2xhc3MgcmVnaXN0ZXJzIHNlcnZpY2UgcHJvdmlkZXIgaW5zdGFuY2VzIChTUEkpLiBTZXJ2aWNlCisgKiBwcm92aWRlciBpbnN0YW5jZXMgYXJlIHJlY29nbml6ZWQgYnkgc3BlY2lmaWMgbWV0YS1pbmZvcm1hdGlvbiBpbiB0aGUgSkFSCisgKiBmaWxlcyBjb250YWluaW5nIHRoZW0uIFRoZSBKQVIgZmlsZXMgd2l0aCBTUEkgY2xhc3NlcyBhcmUgbG9hZGVkIGZyb20gdGhlCisgKiBhcHBsaWNhdGlvbiBjbGFzcyBwYXRoLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIElJT1JlZ2lzdHJ5IGV4dGVuZHMgU2VydmljZVJlZ2lzdHJ5IHsKIAotICAgIC8qKiBUaGUgaW5zdGFuY2UuICovCisgICAgLyoqCisgICAgICogVGhlIGluc3RhbmNlLgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIElJT1JlZ2lzdHJ5IGluc3RhbmNlOwogCi0gICAgLyoqIFRoZSBDb25zdGFudCBDQVRFR09SSUVTLiAqLworICAgIC8qKgorICAgICAqIFRoZSBDb25zdGFudCBDQVRFR09SSUVTLgorICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzW10gQ0FURUdPUklFUyA9IG5ldyBDbGFzc1tdIHsKLSAgICAgICAgamF2YXguaW1hZ2Vpby5zcGkuSW1hZ2VXcml0ZXJTcGkuY2xhc3MsCi0gICAgICAgIGphdmF4LmltYWdlaW8uc3BpLkltYWdlUmVhZGVyU3BpLmNsYXNzLAotICAgICAgICBqYXZheC5pbWFnZWlvLnNwaS5JbWFnZUlucHV0U3RyZWFtU3BpLmNsYXNzLAotICAgICAgICAvL2phdmF4LmltYWdlaW8uc3BpLkltYWdlVHJhbnNjb2RlclNwaS5jbGFzcywKLSAgICAgICAgamF2YXguaW1hZ2Vpby5zcGkuSW1hZ2VPdXRwdXRTdHJlYW1TcGkuY2xhc3MKKyAgICAgICAgICAgIGphdmF4LmltYWdlaW8uc3BpLkltYWdlV3JpdGVyU3BpLmNsYXNzLCBqYXZheC5pbWFnZWlvLnNwaS5JbWFnZVJlYWRlclNwaS5jbGFzcywKKyAgICAgICAgICAgIGphdmF4LmltYWdlaW8uc3BpLkltYWdlSW5wdXRTdHJlYW1TcGkuY2xhc3MsCisgICAgICAgICAgICAvLyBqYXZheC5pbWFnZWlvLnNwaS5JbWFnZVRyYW5zY29kZXJTcGkuY2xhc3MsCisgICAgICAgICAgICBqYXZheC5pbWFnZWlvLnNwaS5JbWFnZU91dHB1dFN0cmVhbVNwaS5jbGFzcwogICAgIH07CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgaUlPIHJlZ2lzdHJ5LgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJSU8gcmVnaXN0cnkuCiAgICAgICovCiAgICAgcHJpdmF0ZSBJSU9SZWdpc3RyeSgpIHsKLSAgICAgICAgc3VwZXIoQXJyYXlzLjxDbGFzczw/Pj5hc0xpc3QoQ0FURUdPUklFUykuaXRlcmF0b3IoKSk7CisgICAgICAgIHN1cGVyKEFycmF5cy48Q2xhc3M8Pz4+IGFzTGlzdChDQVRFR09SSUVTKS5pdGVyYXRvcigpKTsKICAgICAgICAgcmVnaXN0ZXJCdWlsdGluU3BpcygpOwogICAgICAgICByZWdpc3RlckFwcGxpY2F0aW9uQ2xhc3NwYXRoU3BpcygpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlZ2lzdGVyIGJ1aWx0aW4gc3Bpcy4KKyAgICAgKiBSZWdpc3RlciBidWlsdC1pbiBTUElzLgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCByZWdpc3RlckJ1aWx0aW5TcGlzKCkgewogICAgICAgICByZWdpc3RlclNlcnZpY2VQcm92aWRlcihuZXcgSlBFR0ltYWdlV3JpdGVyU3BpKCkpOwpAQCAtODAsOSArODUsOSBAQAogICAgICAgICByZWdpc3RlclNlcnZpY2VQcm92aWRlcihuZXcgRmlsZUlJU1NwaSgpKTsKICAgICAgICAgcmVnaXN0ZXJTZXJ2aWNlUHJvdmlkZXIobmV3IFJBRklPU1NwaSgpKTsKICAgICAgICAgcmVnaXN0ZXJTZXJ2aWNlUHJvdmlkZXIobmV3IFJBRklJU1NwaSgpKTsKLSAgICAgICAgcmVnaXN0ZXJTZXJ2aWNlUHJvdmlkZXIobmV3IE91dHB1dFN0cmVhbUlPU1NwaSgpKTsgICAgICAgIAorICAgICAgICByZWdpc3RlclNlcnZpY2VQcm92aWRlcihuZXcgT3V0cHV0U3RyZWFtSU9TU3BpKCkpOwogICAgICAgICByZWdpc3RlclNlcnZpY2VQcm92aWRlcihuZXcgSW5wdXRTdHJlYW1JSVNTcGkoKSk7Ci0gICAgICAgIC8vLS0gVE9ETyBpbXBsZW1lbnQKKyAgICAgICAgLy8gLS0gVE9ETyBpbXBsZW1lbnQKICAgICB9CiAKICAgICAvKioKQEAgLTkxLDcgKzk2LDggQEAKICAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IElJT1JlZ2lzdHJ5IGluc3RhbmNlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgSUlPUmVnaXN0cnkgZ2V0RGVmYXVsdEluc3RhbmNlKCkgewotICAgICAgICAvLyBUT0RPIGltcGxlbWVudCBvd24gaW5zdGFuY2UgZm9yIGVhY2ggVGhyZWFkR3JvdXAgKHNlZSBhbHNvIFRocmVhZExvY2FsKQorICAgICAgICAvLyBUT0RPIGltcGxlbWVudCBvd24gaW5zdGFuY2UgZm9yIGVhY2ggVGhyZWFkR3JvdXAgKHNlZSBhbHNvCisgICAgICAgIC8vIFRocmVhZExvY2FsKQogICAgICAgICBzeW5jaHJvbml6ZWQgKElJT1JlZ2lzdHJ5LmNsYXNzKSB7CiAgICAgICAgICAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGluc3RhbmNlID0gbmV3IElJT1JlZ2lzdHJ5KCk7CkBAIC0xMDEsMTAgKzEwNyw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVnaXN0ZXJzIGFsbCBzZXJ2aWNlIHByb3ZpZGVycyBmcm9tIHRoZSBhcHBsaWNhdGlvbiBjbGFzcyAKLSAgICAgKiBwYXRoLgorICAgICAqIFJlZ2lzdGVycyBhbGwgc2VydmljZSBwcm92aWRlcnMgZnJvbSB0aGUgYXBwbGljYXRpb24gY2xhc3MgcGF0aC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZWdpc3RlckFwcGxpY2F0aW9uQ2xhc3NwYXRoU3BpcygpIHsKLSAgICAgICAgLy8tLSBUT0RPIGltcGxlbWVudCBmb3Igbm9uLWJ1aWx0aW4gcGx1Z2lucworICAgICAgICAvLyAtLSBUT0RPIGltcGxlbWVudCBmb3Igbm9uLWJ1aWx0aW4gcGx1Z2lucwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL3NwaS9JSU9TZXJ2aWNlUHJvdmlkZXIuamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL3NwaS9JSU9TZXJ2aWNlUHJvdmlkZXIuamF2YQppbmRleCBmNTg3M2JmLi5lOTQ3Njc3IDEwMDY0NAotLS0gYS9hd3QvamF2YXgvaW1hZ2Vpby9zcGkvSUlPU2VydmljZVByb3ZpZGVyLmphdmEKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vc3BpL0lJT1NlcnZpY2VQcm92aWRlci5qYXZhCkBAIC0xOCwyNyArMTgsMzYgQEAKICAqIEBhdXRob3IgUnVzdGVtIFYuIFJhZmlrb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4zICQKICAqLworCiBwYWNrYWdlIGphdmF4LmltYWdlaW8uc3BpOwogCiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIAogLyoqCi0gKiBUaGUgSUlPU2VydmljZVByb3ZpZGVyIGFic3RyYWN0IGNsYXNzIHByb3ZpZGVzIGJhc2UgZnVuY3Rpb25hbGl0eSAKLSAqIGZvciBpbWFnZWlvIHNlcnZpY2UgcHJvdmlkZXIgaW50ZXJmYWNlcyAoU1BJcykuIAorICogVGhlIElJT1NlcnZpY2VQcm92aWRlciBhYnN0cmFjdCBjbGFzcyBwcm92aWRlcyBiYXNlIGZ1bmN0aW9uYWxpdHkgZm9yIEltYWdlSU8KKyAqIHNlcnZpY2UgcHJvdmlkZXIgaW50ZXJmYWNlcyAoU1BJcykuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSUlPU2VydmljZVByb3ZpZGVyIGltcGxlbWVudHMgUmVnaXN0ZXJhYmxlU2VydmljZSB7CiAKLSAgICAvKiogVGhlIHZlbmRvciBuYW1lIG9mIHRoaXMgc2VydmljZSBwcm92aWRlci4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgdmVuZG9yIG5hbWUgb2YgdGhpcyBzZXJ2aWNlIHByb3ZpZGVyLgorICAgICAqLwogICAgIHByb3RlY3RlZCBTdHJpbmcgdmVuZG9yTmFtZTsKLSAgICAKLSAgICAvKiogVGhlIHZlcnNpb24gb2YgdGhpcyBzZXJ2aWNlIHByb3ZpZGVyLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHZlcnNpb24gb2YgdGhpcyBzZXJ2aWNlIHByb3ZpZGVyLgorICAgICAqLwogICAgIHByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbjsKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJSU9TZXJ2aWNlUHJvdmlkZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHZlbmRvck5hbWUgdGhlIHZlbmRvciBuYW1lIG9mIHNlcnZpY2UgcHJvdmlkZXIuCi0gICAgICogQHBhcmFtIHZlcnNpb24gdGhlIHZlcnNpb24gb2Ygc2VydmljZSBwcm92aWRlci4KKyAgICAgKiBAcGFyYW0gdmVuZG9yTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHZlbmRvciBuYW1lIG9mIHNlcnZpY2UgcHJvdmlkZXIuCisgICAgICogQHBhcmFtIHZlcnNpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSB2ZXJzaW9uIG9mIHNlcnZpY2UgcHJvdmlkZXIuCiAgICAgICovCiAgICAgcHVibGljIElJT1NlcnZpY2VQcm92aWRlcihTdHJpbmcgdmVuZG9yTmFtZSwgU3RyaW5nIHZlcnNpb24pIHsKICAgICAgICAgaWYgKHZlbmRvck5hbWUgPT0gbnVsbCkgewpAQCAtODUsMTIgKzk0LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhIGRlc2NyaXB0aW9uIG9mIHRoaXMgc2VydmljZSBwcm92aWRlci4gICAKLSAgICAgKiBUaGUgcmVzdWx0IHN0cmluZyBzaG91bGQgYmUgbG9jYWxpemVkIGZvciB0aGUgc3BlY2lmaWVkIAotICAgICAqIExvY2FsZS4KKyAgICAgKiBHZXRzIGEgZGVzY3JpcHRpb24gb2YgdGhpcyBzZXJ2aWNlIHByb3ZpZGVyLiBUaGUgcmVzdWx0IHN0cmluZyBzaG91bGQgYmUKKyAgICAgKiBsb2NhbGl6ZWQgZm9yIHRoZSBzcGVjaWZpZWQgTG9jYWxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBsb2NhbGUgdGhlIHNwZWNpZmllZCBMb2NhbGUuCi0gICAgICogCisgICAgICogQHBhcmFtIGxvY2FsZQorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBMb2NhbGUuCiAgICAgICogQHJldHVybiB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBzZXJ2aWNlIHByb3ZpZGVyLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oTG9jYWxlIGxvY2FsZSk7CmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9zcGkvSW1hZ2VJbnB1dFN0cmVhbVNwaS5qYXZhIGIvYXd0L2phdmF4L2ltYWdlaW8vc3BpL0ltYWdlSW5wdXRTdHJlYW1TcGkuamF2YQppbmRleCA0N2QyMTBhLi5mYzg1OWE4IDEwMDY0NAotLS0gYS9hd3QvamF2YXgvaW1hZ2Vpby9zcGkvSW1hZ2VJbnB1dFN0cmVhbVNwaS5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL3NwaS9JbWFnZUlucHV0U3RyZWFtU3BpLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgUnVzdGVtIFYuIFJhZmlrb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4zICQKICAqLworCiBwYWNrYWdlIGphdmF4LmltYWdlaW8uc3BpOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtMjUsMTMgKzI2LDE2IEBACiBpbXBvcnQgamF2YXguaW1hZ2Vpby5zdHJlYW0uSW1hZ2VJbnB1dFN0cmVhbTsKIAogLyoqCi0gKiBUaGUgSW1hZ2VJbnB1dFN0cmVhbVNwaSBhYnN0cmFjdCBjbGFzcyBpcyBhIHNlcnZpY2UgcHJvdmlkZXIgCi0gKiBpbnRlcmZhY2UgKFNQSSkgZm9yIEltYWdlSW5wdXRTdHJlYW1zLiAgCisgKiBUaGUgSW1hZ2VJbnB1dFN0cmVhbVNwaSBhYnN0cmFjdCBjbGFzcyBpcyBhIHNlcnZpY2UgcHJvdmlkZXIgaW50ZXJmYWNlIChTUEkpCisgKiBmb3IgSW1hZ2VJbnB1dFN0cmVhbXMuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW1hZ2VJbnB1dFN0cmVhbVNwaSBleHRlbmRzIElJT1NlcnZpY2VQcm92aWRlciBpbXBsZW1lbnRzCi0gICAgICAgIFJlZ2lzdGVyYWJsZVNlcnZpY2UgewotICAgIAotICAgIC8qKiBUaGUgaW5wdXQgY2xhc3MuICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW1hZ2VJbnB1dFN0cmVhbVNwaSBleHRlbmRzIElJT1NlcnZpY2VQcm92aWRlciBpbXBsZW1lbnRzIFJlZ2lzdGVyYWJsZVNlcnZpY2UgeworCisgICAgLyoqCisgICAgICogVGhlIGlucHV0IGNsYXNzLgorICAgICAqLwogICAgIHByb3RlY3RlZCBDbGFzczw/PiBpbnB1dENsYXNzOwogCiAgICAgLyoqCkBAIC00NCw5ICs0OCwxMiBAQAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJbWFnZUlucHV0U3RyZWFtU3BpLgogICAgICAqIAotICAgICAqIEBwYXJhbSB2ZW5kb3JOYW1lIHRoZSB2ZW5kb3IgbmFtZS4KLSAgICAgKiBAcGFyYW0gdmVyc2lvbiB0aGUgdmVyc2lvbi4KLSAgICAgKiBAcGFyYW0gaW5wdXRDbGFzcyB0aGUgaW5wdXQgY2xhc3MuCisgICAgICogQHBhcmFtIHZlbmRvck5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSB2ZW5kb3IgbmFtZS4KKyAgICAgKiBAcGFyYW0gdmVyc2lvbgorICAgICAqICAgICAgICAgICAgdGhlIHZlcnNpb24uCisgICAgICogQHBhcmFtIGlucHV0Q2xhc3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnB1dCBjbGFzcy4KICAgICAgKi8KICAgICBwdWJsaWMgSW1hZ2VJbnB1dFN0cmVhbVNwaShTdHJpbmcgdmVuZG9yTmFtZSwgU3RyaW5nIHZlcnNpb24sIENsYXNzPD8+IGlucHV0Q2xhc3MpIHsKICAgICAgICAgc3VwZXIodmVuZG9yTmFtZSwgdmVyc2lvbik7CkBAIC01NCw4ICs2MSw4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbiBpbnB1dCBDbGFzcyBvYmplY3QgdGhhdCByZXByZXNlbnRzIGNsYXNzIG9yIAotICAgICAqIGludGVyZmFjZSB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgYW4gaW5wdXQgc291cmNlLgorICAgICAqIEdldHMgYW4gaW5wdXQgQ2xhc3Mgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBjbGFzcyBvciBpbnRlcmZhY2UgdGhhdCBtdXN0CisgICAgICogYmUgaW1wbGVtZW50ZWQgYnkgYW4gaW5wdXQgc291cmNlLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGlucHV0IGNsYXNzLgogICAgICAqLwpAQCAtNjQsNjEgKzcxLDU5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBJbWFnZUlucHV0U3RyZWFtIGNhbiB1c2UgYSBjYWNoZSAKLSAgICAgKiBmaWxlLiBJZiB0aGlzIG1ldGhvZCByZXR1cm5zIGZhbHNlLCB0aGUgdmFsdWUgb2YgdGhlIAotICAgICAqIHVzZUNhY2hlIHBhcmFtZXRlciBvZiBjcmVhdGVJbnB1dFN0cmVhbUluc3RhbmNlIHdpbGwgCi0gICAgICogYmUgaWdub3JlZC4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBmYWxzZS4KKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIEltYWdlSW5wdXRTdHJlYW0gY2FuIHVzZSBhIGNhY2hlIGZpbGUuIElmIHRoaXMgbWV0aG9kCisgICAgICogcmV0dXJucyBmYWxzZSwgdGhlIHZhbHVlIG9mIHRoZSB1c2VDYWNoZSBwYXJhbWV0ZXIgb2YKKyAgICAgKiBjcmVhdGVJbnB1dFN0cmVhbUluc3RhbmNlIHdpbGwgYmUgaWdub3JlZC4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KKyAgICAgKiByZXR1cm5zIGZhbHNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgSW1hZ2VJbnB1dFN0cmVhbSBjYW4gdXNlIGEgY2FjaGUgCi0gICAgICogZmlsZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIEltYWdlSW5wdXRTdHJlYW0gY2FuIHVzZSBhIGNhY2hlIGZpbGUsIGZhbHNlCisgICAgICogICAgICAgICBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY2FuVXNlQ2FjaGVGaWxlKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7IC8vLS0gZGVmCisgICAgICAgIHJldHVybiBmYWxzZTsgLy8gLS0gZGVmCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBJbWFnZUlucHV0U3RyZWFtIGltcGxlbWVudGF0aW9uIAotICAgICAqIHJlcXVpcmVzIHRoZSB1c2Ugb2YgYSBjYWNoZSBmaWxlLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiAKLSAgICAgKiByZXR1cm5zIGZhbHNlLgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgSW1hZ2VJbnB1dFN0cmVhbSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aGUgdXNlIG9mIGEKKyAgICAgKiBjYWNoZSBmaWxlLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGZhbHNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgSW1hZ2VJbnB1dFN0cmVhbSBpbXBsZW1lbnRhdGlvbiAKLSAgICAgKiByZXF1aXJlcyB0aGUgdXNlIG9mIGEgY2FjaGUgZmlsZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIEltYWdlSW5wdXRTdHJlYW0gaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGhlIHVzZSBvZgorICAgICAqICAgICAgICAgYSBjYWNoZSBmaWxlLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gbmVlZHNDYWNoZUZpbGUoKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gZGVmCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgSW1hZ2VJbnB1dFN0cmVhbSBhc3NvY2lhdGVkIHdpdGggdGhpcyAKLSAgICAgKiBzZXJ2aWNlIHByb3ZpZGVyLiBUaGUgaW5wdXQgb2JqZWN0IHNob3VsZAotICAgICAqIGJlIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyByZXR1cm5lZCBieSB0aCBnZXRJbnB1dENsYXNzIAotICAgICAqIG1ldGhvZC4gVGhpcyBtZXRob2QgdXNlcyB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeQotICAgICAqIGZvciB0aGUgY2FjaGUgZmlsZSBpZiB0aGUgdXNlQ2FjaGUgcGFyYW1ldGVyIGlzIHRydWUuIAorICAgICAqIENyZWF0ZXMgdGhlIEltYWdlSW5wdXRTdHJlYW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2VydmljZSBwcm92aWRlci4gVGhlCisgICAgICogaW5wdXQgb2JqZWN0IHNob3VsZCBiZSBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgcmV0dXJuZWQgYnkgdGhlCisgICAgICogZ2V0SW5wdXRDbGFzcyBtZXRob2QuIFRoaXMgbWV0aG9kIHVzZXMgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgZm9yIHRoZQorICAgICAqIGNhY2hlIGZpbGUgaWYgdGhlIHVzZUNhY2hlIHBhcmFtZXRlciBpcyB0cnVlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpbnB1dCB0aGUgaW5wdXQgT2JqZWN0LgotICAgICAqIEBwYXJhbSB1c2VDYWNoZSB0aGUgZmxhZyBpbmRpY2F0aW5nIGlmIGEgY2FjaGUgZmlsZSAKLSAgICAgKiBpcyBuZWVkZWQgb3Igbm90LgotICAgICAqIEBwYXJhbSBjYWNoZURpciB0aGUgY2FjaGUgZGlyZWN0b3J5LgotICAgICAqIAorICAgICAqIEBwYXJhbSBpbnB1dAorICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IE9iamVjdC4KKyAgICAgKiBAcGFyYW0gdXNlQ2FjaGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbGFnIGluZGljYXRpbmcgaWYgYSBjYWNoZSBmaWxlIGlzIG5lZWRlZCBvciBub3QuCisgICAgICogQHBhcmFtIGNhY2hlRGlyCisgICAgICogICAgICAgICAgICB0aGUgY2FjaGUgZGlyZWN0b3J5LgogICAgICAqIEByZXR1cm4gdGhlIEltYWdlSW5wdXRTdHJlYW0uCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBJbWFnZUlucHV0U3RyZWFtIGNyZWF0ZUlucHV0U3RyZWFtSW5zdGFuY2UoT2JqZWN0IGlucHV0LCBib29sZWFuIHVzZUNhY2hlLAogICAgICAgICAgICAgRmlsZSBjYWNoZURpcikgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgSW1hZ2VJbnB1dFN0cmVhbSBhc3NvY2lhdGVkIHdpdGggdGhpcyAKLSAgICAgKiBzZXJ2aWNlIHByb3ZpZGVyLiBUaGUgaW5wdXQgb2JqZWN0IHNob3VsZAotICAgICAqIGJlIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyByZXR1cm5lZCBieSBnZXRJbnB1dENsYXNzIAotICAgICAqIG1ldGhvZC4gVGhpcyBtZXRob2QgdXNlcyB0aGUgZGVmYXVsdCBzeXN0ZW0gZGlyZWN0b3J5Ci0gICAgICogZm9yIHRoZSBjYWNoZSBmaWxlLCBpZiBpdCBpcyBuZWVkZWQuIAorICAgICAqIENyZWF0ZXMgdGhlIEltYWdlSW5wdXRTdHJlYW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2VydmljZSBwcm92aWRlci4gVGhlCisgICAgICogaW5wdXQgb2JqZWN0IHNob3VsZCBiZSBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgcmV0dXJuZWQgYnkgZ2V0SW5wdXRDbGFzcworICAgICAqIG1ldGhvZC4gVGhpcyBtZXRob2QgdXNlcyB0aGUgZGVmYXVsdCBzeXN0ZW0gZGlyZWN0b3J5IGZvciB0aGUgY2FjaGUgZmlsZSwKKyAgICAgKiBpZiBpdCBpcyBuZWVkZWQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGlucHV0IHRoZSBpbnB1dCBPYmplY3QuCi0gICAgICogCisgICAgICogQHBhcmFtIGlucHV0CisgICAgICogICAgICAgICAgICB0aGUgaW5wdXQgT2JqZWN0LgogICAgICAqIEByZXR1cm4gdGhlIEltYWdlSW5wdXRTdHJlYW0uCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBJbWFnZUlucHV0U3RyZWFtIGNyZWF0ZUlucHV0U3RyZWFtSW5zdGFuY2UoT2JqZWN0IGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICByZXR1cm4gY3JlYXRlSW5wdXRTdHJlYW1JbnN0YW5jZShpbnB1dCwgdHJ1ZSwgbnVsbCk7CmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9zcGkvSW1hZ2VPdXRwdXRTdHJlYW1TcGkuamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL3NwaS9JbWFnZU91dHB1dFN0cmVhbVNwaS5qYXZhCmluZGV4IGQ0NWUyNGMuLmI3YTlhNWMgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL3NwaS9JbWFnZU91dHB1dFN0cmVhbVNwaS5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL3NwaS9JbWFnZU91dHB1dFN0cmVhbVNwaS5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIFJ1c3RlbSBWLiBSYWZpa292CiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMyAkCiAgKi8KKwogcGFja2FnZSBqYXZheC5pbWFnZWlvLnNwaTsKIAogaW1wb3J0IGphdmF4LmltYWdlaW8uc3RyZWFtLkltYWdlT3V0cHV0U3RyZWFtOwpAQCAtMjUsMTMgKzI2LDE3IEBACiBpbXBvcnQgamF2YS5pby5GaWxlOwogCiAvKioKLSAqIFRoZSBJbWFnZU91dHB1dFN0cmVhbVNwaSBhYnN0cmFjdCBjbGFzcyBpcyBhIHNlcnZpY2UgcHJvdmlkZXIgCi0gKiBpbnRlcmZhY2UgKFNQSSkgZm9yIEltYWdlT3V0cHV0U3RyZWFtcy4gCisgKiBUaGUgSW1hZ2VPdXRwdXRTdHJlYW1TcGkgYWJzdHJhY3QgY2xhc3MgaXMgYSBzZXJ2aWNlIHByb3ZpZGVyIGludGVyZmFjZSAoU1BJKQorICogZm9yIEltYWdlT3V0cHV0U3RyZWFtcy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBJbWFnZU91dHB1dFN0cmVhbVNwaSBleHRlbmRzIElJT1NlcnZpY2VQcm92aWRlciBpbXBsZW1lbnRzCiAgICAgICAgIFJlZ2lzdGVyYWJsZVNlcnZpY2UgewotICAgIAotICAgIC8qKiBUaGUgb3V0cHV0IGNsYXNzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIG91dHB1dCBjbGFzcy4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgQ2xhc3M8Pz4gb3V0cHV0Q2xhc3M7CiAKICAgICAvKioKQEAgLTQ0LDkgKzQ5LDEyIEBACiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEltYWdlT3V0cHV0U3RyZWFtU3BpLgogICAgICAqIAotICAgICAqIEBwYXJhbSB2ZW5kb3JOYW1lIHRoZSB2ZW5kb3IgbmFtZS4KLSAgICAgKiBAcGFyYW0gdmVyc2lvbiB0aGUgdmVyc2lvbi4KLSAgICAgKiBAcGFyYW0gb3V0cHV0Q2xhc3MgdGhlIG91dHB1dCBjbGFzcy4KKyAgICAgKiBAcGFyYW0gdmVuZG9yTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHZlbmRvciBuYW1lLgorICAgICAqIEBwYXJhbSB2ZXJzaW9uCisgICAgICogICAgICAgICAgICB0aGUgdmVyc2lvbi4KKyAgICAgKiBAcGFyYW0gb3V0cHV0Q2xhc3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgY2xhc3MuCiAgICAgICovCiAgICAgcHVibGljIEltYWdlT3V0cHV0U3RyZWFtU3BpKFN0cmluZyB2ZW5kb3JOYW1lLCBTdHJpbmcgdmVyc2lvbiwgQ2xhc3M8Pz4gb3V0cHV0Q2xhc3MpIHsKICAgICAgICAgc3VwZXIodmVuZG9yTmFtZSwgdmVyc2lvbik7CkBAIC01NCw4ICs2Miw4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbiBvdXRwdXQgQ2xhc3Mgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgY2xhc3Mgb3IgCi0gICAgICogaW50ZXJmYWNlIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhbiBvdXRwdXQgc291cmNlLgorICAgICAqIEdldHMgYW4gb3V0cHV0IENsYXNzIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGNsYXNzIG9yIGludGVyZmFjZSB0aGF0CisgICAgICogbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhbiBvdXRwdXQgc291cmNlLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIG91dHB1dCBjbGFzcy4KICAgICAgKi8KQEAgLTY0LDYzICs3Miw2MSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgSW1hZ2VPdXRwdXRTdHJlYW0gY2FuIHVzZSBhIGNhY2hlIAotICAgICAqIGZpbGUuIElmIHRoaXMgbWV0aG9kIHJldHVybnMgZmFsc2UsIHRoZSB2YWx1ZSBvZiB0aGUgCi0gICAgICogdXNlQ2FjaGUgcGFyYW1ldGVyIG9mIGNyZWF0ZU91dHB1dFN0cmVhbUluc3RhbmNlIHdpbGwgCi0gICAgICogYmUgaWdub3JlZC4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBmYWxzZS4KKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIEltYWdlT3V0cHV0U3RyZWFtIGNhbiB1c2UgYSBjYWNoZSBmaWxlLiBJZiB0aGlzCisgICAgICogbWV0aG9kIHJldHVybnMgZmFsc2UsIHRoZSB2YWx1ZSBvZiB0aGUgdXNlQ2FjaGUgcGFyYW1ldGVyIG9mCisgICAgICogY3JlYXRlT3V0cHV0U3RyZWFtSW5zdGFuY2Ugd2lsbCBiZSBpZ25vcmVkLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgorICAgICAqIHJldHVybnMgZmFsc2UuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBJbWFnZU91dHB1dFN0cmVhbSBjYW4gdXNlIGEgY2FjaGUgCi0gICAgICogZmlsZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIEltYWdlT3V0cHV0U3RyZWFtIGNhbiB1c2UgYSBjYWNoZSBmaWxlLCBmYWxzZQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNhblVzZUNhY2hlRmlsZSgpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBkZWYKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIEltYWdlT3V0cHV0U3RyZWFtICBpbXBsZW1lbnRhdGlvbiAKLSAgICAgKiByZXF1aXJlcyB0aGUgdXNlIG9mIGEgY2FjaGUgZmlsZS4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gCi0gICAgICogcmV0dXJucyBmYWxzZS4KKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIEltYWdlT3V0cHV0U3RyZWFtIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRoZSB1c2Ugb2YKKyAgICAgKiBhIGNhY2hlIGZpbGUuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgZmFsc2UuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBJbWFnZU91dHB1dFN0cmVhbSAgaW1wbGVtZW50YXRpb24gCi0gICAgICogcmVxdWlyZXMgdGhlIHVzZSBvZiBhIGNhY2hlIGZpbGUsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBJbWFnZU91dHB1dFN0cmVhbSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aGUgdXNlIG9mCisgICAgICogICAgICAgICBhIGNhY2hlIGZpbGUsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBuZWVkc0NhY2hlRmlsZSgpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBkZWYKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBJbWFnZU91dHB1dFN0cmVhbSBhc3NvY2lhdGVkIHdpdGggdGhpcyAKLSAgICAgKiBzZXJ2aWNlIHByb3ZpZGVyLiBUaGUgb3V0cHV0IG9iamVjdCBzaG91bGQKLSAgICAgKiBiZSBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgcmV0dXJuZWQgYnkgZ2V0T3V0cHV0Q2xhc3MgCi0gICAgICogbWV0aG9kLiBUaGlzIG1ldGhvZCB1c2VzIHRoZSBkZWZhdWx0IHN5c3RlbSBkaXJlY3RvcnkKLSAgICAgKiBmb3IgdGhlIGNhY2hlIGZpbGUsIGlmIGl0IGlzIG5lZWRlZC4gCisgICAgICogQ3JlYXRlcyB0aGUgSW1hZ2VPdXRwdXRTdHJlYW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2VydmljZSBwcm92aWRlci4gVGhlCisgICAgICogb3V0cHV0IG9iamVjdCBzaG91bGQgYmUgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIHJldHVybmVkIGJ5CisgICAgICogZ2V0T3V0cHV0Q2xhc3MgbWV0aG9kLiBUaGlzIG1ldGhvZCB1c2VzIHRoZSBkZWZhdWx0IHN5c3RlbSBkaXJlY3RvcnkgZm9yCisgICAgICogdGhlIGNhY2hlIGZpbGUsIGlmIGl0IGlzIG5lZWRlZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gb3V0cHV0IHRoZSBvdXRwdXQgT2JqZWN0LgotICAgICAqIAorICAgICAqIEBwYXJhbSBvdXRwdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgT2JqZWN0LgogICAgICAqIEByZXR1cm4gdGhlIEltYWdlT3V0cHV0U3RyZWFtLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgSW1hZ2VPdXRwdXRTdHJlYW0gY3JlYXRlT3V0cHV0U3RyZWFtSW5zdGFuY2UoT2JqZWN0IG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIGNyZWF0ZU91dHB1dFN0cmVhbUluc3RhbmNlKG91dHB1dCwgdHJ1ZSwgbnVsbCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgSW1hZ2VPdXRwdXRTdHJlYW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgCi0gICAgICogc2VydmljZSBwcm92aWRlci4gVGhlIG91dHB1dCBvYmplY3Qgc2hvdWxkCi0gICAgICogYmUgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIHJldHVybmVkIGJ5IGdldElucHV0Q2xhc3MgCi0gICAgICogbWV0aG9kLiBUaGlzIG1ldGhvZCB1c2VzIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5Ci0gICAgICogZm9yIHRoZSBjYWNoZSBmaWxlLCBpZiB0aGUgdXNlQ2FjaGUgcGFyYW1ldGVyIGlzIHRydWUuIAorICAgICAqIENyZWF0ZXMgdGhlIEltYWdlT3V0cHV0U3RyZWFtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZpY2UgcHJvdmlkZXIuIFRoZQorICAgICAqIG91dHB1dCBvYmplY3Qgc2hvdWxkIGJlIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyByZXR1cm5lZCBieQorICAgICAqIGdldElucHV0Q2xhc3MgbWV0aG9kLiBUaGlzIG1ldGhvZCB1c2VzIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IGZvciB0aGUKKyAgICAgKiBjYWNoZSBmaWxlLCBpZiB0aGUgdXNlQ2FjaGUgcGFyYW1ldGVyIGlzIHRydWUuCiAgICAgICogCi0gICAgICogQHBhcmFtIG91dHB1dCB0aGUgb3V0cHV0IE9iamVjdC4KLSAgICAgKiBAcGFyYW0gdXNlQ2FjaGUgdGhlIGZsYWcgaW5kaWNhdGluZyBpZiBjYWNoZSBmaWxlIAotICAgICAqIGlzIG5lZWRlZCBvciBub3QuCi0gICAgICogQHBhcmFtIGNhY2hlRGlyIHRoZSBjYWNoZSBkaXJlY3RvcnkuCi0gICAgICogCisgICAgICogQHBhcmFtIG91dHB1dAorICAgICAqICAgICAgICAgICAgdGhlIG91dHB1dCBPYmplY3QuCisgICAgICogQHBhcmFtIHVzZUNhY2hlCisgICAgICogICAgICAgICAgICB0aGUgZmxhZyBpbmRpY2F0aW5nIGlmIGNhY2hlIGZpbGUgaXMgbmVlZGVkIG9yIG5vdC4KKyAgICAgKiBAcGFyYW0gY2FjaGVEaXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBjYWNoZSBkaXJlY3RvcnkuCiAgICAgICogQHJldHVybiB0aGUgSW1hZ2VPdXRwdXRTdHJlYW0uCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBJbWFnZU91dHB1dFN0cmVhbSBjcmVhdGVPdXRwdXRTdHJlYW1JbnN0YW5jZShPYmplY3Qgb3V0cHV0LAotICAgICAgICAgICAgYm9vbGVhbiB1c2VDYWNoZSwgRmlsZSBjYWNoZURpcikgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIHB1YmxpYyBhYnN0cmFjdCBJbWFnZU91dHB1dFN0cmVhbSBjcmVhdGVPdXRwdXRTdHJlYW1JbnN0YW5jZShPYmplY3Qgb3V0cHV0LCBib29sZWFuIHVzZUNhY2hlLAorICAgICAgICAgICAgRmlsZSBjYWNoZURpcikgdGhyb3dzIElPRXhjZXB0aW9uOwogfQpkaWZmIC0tZ2l0IGEvYXd0L2phdmF4L2ltYWdlaW8vc3BpL0ltYWdlUmVhZGVyU3BpLmphdmEgYi9hd3QvamF2YXgvaW1hZ2Vpby9zcGkvSW1hZ2VSZWFkZXJTcGkuamF2YQppbmRleCAyZTI0ODRjLi4wNTI4ZDI1IDEwMDY0NAotLS0gYS9hd3QvamF2YXgvaW1hZ2Vpby9zcGkvSW1hZ2VSZWFkZXJTcGkuamF2YQorKysgYi9hd3QvamF2YXgvaW1hZ2Vpby9zcGkvSW1hZ2VSZWFkZXJTcGkuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBSdXN0ZW0gVi4gUmFmaWtvdgogICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjMgJAogICovCisKIHBhY2thZ2UgamF2YXguaW1hZ2Vpby5zcGk7CiAKIGltcG9ydCBqYXZheC5pbWFnZWlvLnN0cmVhbS5JbWFnZUlucHV0U3RyZWFtOwpAQCAtMjUsMjAgKzI2LDI4IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAogLyoqCi0gKiBUaGUgSW1hZ2VSZWFkZXJTcGkgYWJzdHJhY3QgY2xhc3MgaXMgYSBzZXJ2aWNlIHByb3ZpZGVyIAotICogaW50ZXJmYWNlIChTUEkpIGZvciBJbWFnZVJlYWRlcnMuCisgKiBUaGUgSW1hZ2VSZWFkZXJTcGkgYWJzdHJhY3QgY2xhc3MgaXMgYSBzZXJ2aWNlIHByb3ZpZGVyIGludGVyZmFjZSAoU1BJKSBmb3IKKyAqIEltYWdlUmVhZGVycy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBJbWFnZVJlYWRlclNwaSBleHRlbmRzIEltYWdlUmVhZGVyV3JpdGVyU3BpIHsKIAotICAgIC8qKiAKLSAgICAgKiBUaGUgU1RBTkRBUkRfSU5QVVRfVFlQRSBjb250YWlucyBJbWFnZUlucHV0U3RyZWFtLmNsYXNzLiAKKyAgICAvKioKKyAgICAgKiBUaGUgU1RBTkRBUkRfSU5QVVRfVFlQRSBjb250YWlucyBJbWFnZUlucHV0U3RyZWFtLmNsYXNzLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3NbXSBTVEFOREFSRF9JTlBVVF9UWVBFID0gbmV3IENsYXNzW10ge0ltYWdlSW5wdXRTdHJlYW0uY2xhc3N9OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3NbXSBTVEFOREFSRF9JTlBVVF9UWVBFID0gbmV3IENsYXNzW10geworICAgICAgICBJbWFnZUlucHV0U3RyZWFtLmNsYXNzCisgICAgfTsKIAotICAgIC8qKiBUaGUgaW5wdXQgdHlwZXMuICovCisgICAgLyoqCisgICAgICogVGhlIGlucHV0IHR5cGVzLgorICAgICAqLwogICAgIHByb3RlY3RlZCBDbGFzc1tdIGlucHV0VHlwZXM7Ci0gICAgCi0gICAgLyoqIFRoZSB3cml0ZXIgU1BJIG5hbWVzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHdyaXRlciBTUEkgbmFtZXMuCisgICAgICovCiAgICAgcHJvdGVjdGVkIFN0cmluZ1tdIHdyaXRlclNwaU5hbWVzOwogCiAgICAgLyoqCkBAIC01MSw0OSArNjAsNjIgQEAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgSW1hZ2VSZWFkZXJTcGkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHZlbmRvck5hbWUgdGhlIHZlbmRvciBuYW1lLgotICAgICAqIEBwYXJhbSB2ZXJzaW9uIHRoZSB2ZXJzaW9uLgotICAgICAqIEBwYXJhbSBuYW1lcyB0aGUgZm9ybWF0IG5hbWVzLgotICAgICAqIEBwYXJhbSBzdWZmaXhlcyB0aGUgYXJyYXkgb2Ygc3RyaW5ncyByZXByZXNlbnRpbmcgdGhlIGZpbGUgc3VmZml4ZXMuIAotICAgICAqIEBwYXJhbSBNSU1FVHlwZXMgdGhlIGFuIGFycmF5IG9mIHN0cmluZ3MgcmVwcmVzZW50aW5nIE1JTUUgdHlwZXMuCi0gICAgICogQHBhcmFtIHBsdWdpbkNsYXNzTmFtZSB0aGUgcGx1Z2luIGNsYXNzIG5hbWUuCi0gICAgICogQHBhcmFtIGlucHV0VHlwZXMgdGhlIGlucHV0IHR5cGVzLgotICAgICAqIEBwYXJhbSB3cml0ZXJTcGlOYW1lcyB0aGUgYXJyYXkgb2Ygc3RyaW5ncyB3aXRoIGNsYXNzIG5hbWVzIG9mIGFsbCAKLSAgICAgKiBhc3NvY2lhdGVkIEltYWdlV3JpdGVycy4KLSAgICAgKiBAcGFyYW0gc3VwcG9ydHNTdGFuZGFyZFN0cmVhbU1ldGFkYXRhRm9ybWF0IHRoZSB2YWx1ZSBpbmRpY2F0aW5nCi0gICAgICogaWYgc3RyZWFtIG1ldGFkYXRhIGNhbiBiZSBkZXNjcmliZWQgYnkgc3RhbmRhcnQgbWV0YWRhdGEgZm9ybWF0LgotICAgICAqIEBwYXJhbSBuYXRpdmVTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWUgdGhlIG5hdGl2ZSBzdHJlYW0gbWV0YWRhdGEgCi0gICAgICogZm9ybWF0IG5hbWUsIHJldHVybmVkIGJ5IGdldE5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZS4KLSAgICAgKiBAcGFyYW0gbmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXRDbGFzc05hbWUgdGhlIG5hdGl2ZSBzdHJlYW0gCi0gICAgICogbWV0YWRhdGEgZm9ybWF0IGNsYXNzIG5hbWUsIHJldHVybmVkIGJ5IGdldE5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0LgotICAgICAqIEBwYXJhbSBleHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZXMgdGhlIGV4dHJhIHN0cmVhbSBtZXRhZGF0YSAKLSAgICAgKiBmb3JtYXQgbmFtZXMsIHJldHVybmVkIGJ5IGdldEV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lcy4KLSAgICAgKiBAcGFyYW0gZXh0cmFTdHJlYW1NZXRhZGF0YUZvcm1hdENsYXNzTmFtZXMgdGhlIGV4dHJhIHN0cmVhbSBtZXRhZGF0YSAKLSAgICAgKiBmb3JtYXQgY2xhc3MgbmFtZXMsIHJldHVybmVkIGJ5IGdldFN0cmVhbU1ldGFkYXRhRm9ybWF0LgotICAgICAqIEBwYXJhbSBzdXBwb3J0c1N0YW5kYXJkSW1hZ2VNZXRhZGF0YUZvcm1hdCB0aGUgdmFsdWUgaW5kaWNhdGluZwotICAgICAqIGlmIGltYWdlIG1ldGFkYXRhIGNhbiBiZSBkZXNjcmliZWQgYnkgc3RhbmRhcnQgbWV0YWRhdGEgZm9ybWF0LgotICAgICAqIEBwYXJhbSBuYXRpdmVJbWFnZU1ldGFkYXRhRm9ybWF0TmFtZSB0aGUgbmF0aXZlIGltYWdlIG1ldGFkYXRhIAotICAgICAqIGZvcm1hdCBuYW1lLCByZXR1cm5lZCBieSBnZXROYXRpdmVJbWFnZU1ldGFkYXRhRm9ybWF0TmFtZS4KLSAgICAgKiBAcGFyYW0gbmF0aXZlSW1hZ2VNZXRhZGF0YUZvcm1hdENsYXNzTmFtZSB0aGUgbmF0aXZlIGltYWdlCi0gICAgICogbWV0YWRhdGEgZm9ybWF0IGNsYXNzIG5hbWUsIHJldHVybmVkIGJ5IGdldE5hdGl2ZUltYWdlTWV0YWRhdGFGb3JtYXQuCi0gICAgICogQHBhcmFtIGV4dHJhSW1hZ2VNZXRhZGF0YUZvcm1hdE5hbWVzIHRoZSBleHRyYSBpbWFnZSBtZXRhZGF0YSAKLSAgICAgKiBmb3JtYXQgbmFtZXMsIHJldHVybmVkIGJ5IGdldEV4dHJhSW1hZ2VNZXRhZGF0YUZvcm1hdE5hbWVzLgotICAgICAqIEBwYXJhbSBleHRyYUltYWdlTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzIHRoZSBleHRyYSBpbWFnZSBtZXRhZGF0YSAKLSAgICAgKiBmb3JtYXQgY2xhc3MgbmFtZXMsIHJldHVybmVkIGJ5IGdldEltYWdlTWV0YWRhdGFGb3JtYXQuCisgICAgICogQHBhcmFtIHZlbmRvck5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSB2ZW5kb3IgbmFtZS4KKyAgICAgKiBAcGFyYW0gdmVyc2lvbgorICAgICAqICAgICAgICAgICAgdGhlIHZlcnNpb24uCisgICAgICogQHBhcmFtIG5hbWVzCisgICAgICogICAgICAgICAgICB0aGUgZm9ybWF0IG5hbWVzLgorICAgICAqIEBwYXJhbSBzdWZmaXhlcworICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIHN0cmluZ3MgcmVwcmVzZW50aW5nIHRoZSBmaWxlIHN1ZmZpeGVzLgorICAgICAqIEBwYXJhbSBNSU1FVHlwZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbiBhcnJheSBvZiBzdHJpbmdzIHJlcHJlc2VudGluZyBNSU1FIHR5cGVzLgorICAgICAqIEBwYXJhbSBwbHVnaW5DbGFzc05hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBwbHVnLWluIGNsYXNzIG5hbWUuCisgICAgICogQHBhcmFtIGlucHV0VHlwZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnB1dCB0eXBlcy4KKyAgICAgKiBAcGFyYW0gd3JpdGVyU3BpTmFtZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBzdHJpbmdzIHdpdGggY2xhc3MgbmFtZXMgb2YgYWxsIGFzc29jaWF0ZWQKKyAgICAgKiAgICAgICAgICAgIEltYWdlV3JpdGVycy4KKyAgICAgKiBAcGFyYW0gc3VwcG9ydHNTdGFuZGFyZFN0cmVhbU1ldGFkYXRhRm9ybWF0CisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgaW5kaWNhdGluZyBpZiBzdHJlYW0gbWV0YWRhdGEgY2FuIGJlIGRlc2NyaWJlZCBieQorICAgICAqICAgICAgICAgICAgc3RhbmRhcmQgbWV0YWRhdGEgZm9ybWF0LgorICAgICAqIEBwYXJhbSBuYXRpdmVTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYXRpdmUgc3RyZWFtIG1ldGFkYXRhIGZvcm1hdCBuYW1lLCByZXR1cm5lZCBieQorICAgICAqICAgICAgICAgICAgZ2V0TmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lLgorICAgICAqIEBwYXJhbSBuYXRpdmVTdHJlYW1NZXRhZGF0YUZvcm1hdENsYXNzTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hdGl2ZSBzdHJlYW0gbWV0YWRhdGEgZm9ybWF0IGNsYXNzIG5hbWUsIHJldHVybmVkIGJ5CisgICAgICogICAgICAgICAgICBnZXROYXRpdmVTdHJlYW1NZXRhZGF0YUZvcm1hdC4KKyAgICAgKiBAcGFyYW0gZXh0cmFTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWVzCisgICAgICogICAgICAgICAgICB0aGUgZXh0cmEgc3RyZWFtIG1ldGFkYXRhIGZvcm1hdCBuYW1lcywgcmV0dXJuZWQgYnkKKyAgICAgKiAgICAgICAgICAgIGdldEV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lcy4KKyAgICAgKiBAcGFyYW0gZXh0cmFTdHJlYW1NZXRhZGF0YUZvcm1hdENsYXNzTmFtZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBleHRyYSBzdHJlYW0gbWV0YWRhdGEgZm9ybWF0IGNsYXNzIG5hbWVzLCByZXR1cm5lZCBieQorICAgICAqICAgICAgICAgICAgZ2V0U3RyZWFtTWV0YWRhdGFGb3JtYXQuCisgICAgICogQHBhcmFtIHN1cHBvcnRzU3RhbmRhcmRJbWFnZU1ldGFkYXRhRm9ybWF0CisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgaW5kaWNhdGluZyBpZiBpbWFnZSBtZXRhZGF0YSBjYW4gYmUgZGVzY3JpYmVkIGJ5CisgICAgICogICAgICAgICAgICBzdGFuZGFyZCBtZXRhZGF0YSBmb3JtYXQuCisgICAgICogQHBhcmFtIG5hdGl2ZUltYWdlTWV0YWRhdGFGb3JtYXROYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmF0aXZlIGltYWdlIG1ldGFkYXRhIGZvcm1hdCBuYW1lLCByZXR1cm5lZCBieQorICAgICAqICAgICAgICAgICAgZ2V0TmF0aXZlSW1hZ2VNZXRhZGF0YUZvcm1hdE5hbWUuCisgICAgICogQHBhcmFtIG5hdGl2ZUltYWdlTWV0YWRhdGFGb3JtYXRDbGFzc05hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYXRpdmUgaW1hZ2UgbWV0YWRhdGEgZm9ybWF0IGNsYXNzIG5hbWUsIHJldHVybmVkIGJ5CisgICAgICogICAgICAgICAgICBnZXROYXRpdmVJbWFnZU1ldGFkYXRhRm9ybWF0LgorICAgICAqIEBwYXJhbSBleHRyYUltYWdlTWV0YWRhdGFGb3JtYXROYW1lcworICAgICAqICAgICAgICAgICAgdGhlIGV4dHJhIGltYWdlIG1ldGFkYXRhIGZvcm1hdCBuYW1lcywgcmV0dXJuZWQgYnkKKyAgICAgKiAgICAgICAgICAgIGdldEV4dHJhSW1hZ2VNZXRhZGF0YUZvcm1hdE5hbWVzLgorICAgICAqIEBwYXJhbSBleHRyYUltYWdlTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzCisgICAgICogICAgICAgICAgICB0aGUgZXh0cmEgaW1hZ2UgbWV0YWRhdGEgZm9ybWF0IGNsYXNzIG5hbWVzLCByZXR1cm5lZCBieQorICAgICAqICAgICAgICAgICAgZ2V0SW1hZ2VNZXRhZGF0YUZvcm1hdC4KICAgICAgKi8KICAgICBwdWJsaWMgSW1hZ2VSZWFkZXJTcGkoU3RyaW5nIHZlbmRvck5hbWUsIFN0cmluZyB2ZXJzaW9uLCBTdHJpbmdbXSBuYW1lcywgU3RyaW5nW10gc3VmZml4ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIE1JTUVUeXBlcywgU3RyaW5nIHBsdWdpbkNsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NbXSBpbnB1dFR5cGVzLCBTdHJpbmdbXSB3cml0ZXJTcGlOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzdXBwb3J0c1N0YW5kYXJkU3RyZWFtTWV0YWRhdGFGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYXRpdmVTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYXRpdmVTdHJlYW1NZXRhZGF0YUZvcm1hdENsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gZXh0cmFTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBleHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzdXBwb3J0c1N0YW5kYXJkSW1hZ2VNZXRhZGF0YUZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hdGl2ZUltYWdlTWV0YWRhdGFGb3JtYXROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmF0aXZlSW1hZ2VNZXRhZGF0YUZvcm1hdENsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gZXh0cmFJbWFnZU1ldGFkYXRhRm9ybWF0TmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGV4dHJhSW1hZ2VNZXRhZGF0YUZvcm1hdENsYXNzTmFtZXMpIHsKKyAgICAgICAgICAgIFN0cmluZ1tdIE1JTUVUeXBlcywgU3RyaW5nIHBsdWdpbkNsYXNzTmFtZSwgQ2xhc3NbXSBpbnB1dFR5cGVzLAorICAgICAgICAgICAgU3RyaW5nW10gd3JpdGVyU3BpTmFtZXMsIGJvb2xlYW4gc3VwcG9ydHNTdGFuZGFyZFN0cmVhbU1ldGFkYXRhRm9ybWF0LAorICAgICAgICAgICAgU3RyaW5nIG5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZSwgU3RyaW5nIG5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lLAorICAgICAgICAgICAgU3RyaW5nW10gZXh0cmFTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWVzLCBTdHJpbmdbXSBleHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcywKKyAgICAgICAgICAgIGJvb2xlYW4gc3VwcG9ydHNTdGFuZGFyZEltYWdlTWV0YWRhdGFGb3JtYXQsIFN0cmluZyBuYXRpdmVJbWFnZU1ldGFkYXRhRm9ybWF0TmFtZSwKKyAgICAgICAgICAgIFN0cmluZyBuYXRpdmVJbWFnZU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lLCBTdHJpbmdbXSBleHRyYUltYWdlTWV0YWRhdGFGb3JtYXROYW1lcywKKyAgICAgICAgICAgIFN0cmluZ1tdIGV4dHJhSW1hZ2VNZXRhZGF0YUZvcm1hdENsYXNzTmFtZXMpIHsKICAgICAgICAgc3VwZXIodmVuZG9yTmFtZSwgdmVyc2lvbiwgbmFtZXMsIHN1ZmZpeGVzLCBNSU1FVHlwZXMsIHBsdWdpbkNsYXNzTmFtZSwKICAgICAgICAgICAgICAgICBzdXBwb3J0c1N0YW5kYXJkU3RyZWFtTWV0YWRhdGFGb3JtYXQsIG5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZSwKICAgICAgICAgICAgICAgICBuYXRpdmVTdHJlYW1NZXRhZGF0YUZvcm1hdENsYXNzTmFtZSwgZXh0cmFTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWVzLApAQCAtMTA5LDggKzEzMSw4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbiBhcnJheSBvZiBDbGFzcyBvYmplY3RzIHdob3NlIHR5cGVzIGNhbiBiZSB1c2VkIAotICAgICAqIGFzIGlucHV0IGZvciB0aGlzIHJlYWRlci4KKyAgICAgKiBHZXRzIGFuIGFycmF5IG9mIENsYXNzIG9iamVjdHMgd2hvc2UgdHlwZXMgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIHRoaXMKKyAgICAgKiByZWFkZXIuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgaW5wdXQgdHlwZXMuCiAgICAgICovCkBAIC0xMTksNjYgKzE0MSw2MiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZm9ybWF0IG9mIHNvdXJjZSBvYmplY3QgaXMKLSAgICAgKiBzdXBwb3J0ZWQgYnkgdGhpcyByZWFkZXIuCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBmb3JtYXQgb2Ygc291cmNlIG9iamVjdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyByZWFkZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIG9iamVjdCB0byBiZSBkZWNvZGVkIAotICAgICAqIChmb3IgZXhhbXBsZSBhbiBJbWFnZUlucHV0U3RyZWFtKS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZvcm1hdCBvZiBzb3VyY2Ugb2JqZWN0IGlzCi0gICAgICogc3VwcG9ydGVkIGJ5IHRoaXMgcmVhZGVyLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIHNvdXJjZQorICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBvYmplY3QgdG8gYmUgZGVjb2RlZCAoZm9yIGV4YW1wbGUgYW4KKyAgICAgKiAgICAgICAgICAgIEltYWdlSW5wdXRTdHJlYW0pLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIGZvcm1hdCBvZiBzb3VyY2Ugb2JqZWN0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHJlYWRlciwKKyAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gY2FuRGVjb2RlSW5wdXQoT2JqZWN0IHNvdXJjZSkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgSW1hZ2VSZWFkZXIgaW1wbGVtZW50YXRpb24gZm9yCi0gICAgICogdGhpcyBzZXJ2aWNlIHByb3ZpZGVyLgorICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIEltYWdlUmVhZGVyIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIHNlcnZpY2UKKyAgICAgKiBwcm92aWRlci4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBJbWFnZVJlYWRlci4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIEltYWdlUmVhZGVyIGNyZWF0ZVJlYWRlckluc3RhbmNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlYWRlckluc3RhbmNlKG51bGwpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIEltYWdlUmVhZGVyIGltcGxlbWVudGF0aW9uIGZvcgotICAgICAqIHRoaXMgc2VydmljZSBwcm92aWRlci4KKyAgICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSBJbWFnZVJlYWRlciBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyBzZXJ2aWNlCisgICAgICogcHJvdmlkZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGV4dGVuc2lvbiB0aGUgYSBwbHVnaW4gc3BlY2lmaWMgZXh0ZW5zaW9uIG9iamVjdCwgb3IgbnVsbC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZXh0ZW5zaW9uCisgICAgICogICAgICAgICAgICB0aGUgYSBwbHVnLWluIHNwZWNpZmljIGV4dGVuc2lvbiBvYmplY3QsIG9yIG51bGwuCiAgICAgICogQHJldHVybiB0aGUgSW1hZ2VSZWFkZXIuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBJbWFnZVJlYWRlciBjcmVhdGVSZWFkZXJJbnN0YW5jZShPYmplY3QgZXh0ZW5zaW9uKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBJbWFnZVJlYWRlciBvYmplY3QgCi0gICAgICogaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIEltYWdlUmVhZGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIAotICAgICAqIHNlcnZpY2UgcHJvdmlkZXIgb3Igbm90LgorICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIEltYWdlUmVhZGVyIG9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZgorICAgICAqIHRoZSBJbWFnZVJlYWRlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXJ2aWNlIHByb3ZpZGVyIG9yIG5vdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVhZGVyIHRoZSBJbWFnZVJlYWRlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgSW1hZ2VSZWFkZXIgb2JqZWN0IAotICAgICAqIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBJbWFnZVJlYWRlciBhc3NvY2lhdGVkIHdpdGggdGhpcyAKLSAgICAgKiBzZXJ2aWNlIHByb3ZpZGVyLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIHJlYWRlcgorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlUmVhZGVyLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCBJbWFnZVJlYWRlciBvYmplY3QgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlCisgICAgICogICAgICAgICBJbWFnZVJlYWRlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXJ2aWNlIHByb3ZpZGVyLCBmYWxzZQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzT3duUmVhZGVyKEltYWdlUmVhZGVyIHJlYWRlcikgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbiBhcnJheSBvZiBzdHJpbmdzIHdpdGggbmFtZXMgb2YgdGhlIEltYWdlV3JpdGVyU3BpIAotICAgICAqIGNsYXNzZXMgdGhhdCBzdXBwb3J0IHRoZSBpbnRlcm5hbCBtZXRhZGF0YSByZXByZXNlbnRhdGlvbiAKLSAgICAgKiB1c2VkIGJ5IHRoZSBJbWFnZVJlYWRlciBvZiB0aGlzIHNlcnZpY2UgcHJvdmlkZXIsIG9yIG51bGwgaWYgCi0gICAgICogdGhlcmUgYXJlIG5vIHN1Y2ggSW1hZ2VXcml0ZXJzLgorICAgICAqIEdldHMgYW4gYXJyYXkgb2Ygc3RyaW5ncyB3aXRoIG5hbWVzIG9mIHRoZSBJbWFnZVdyaXRlclNwaSBjbGFzc2VzIHRoYXQKKyAgICAgKiBzdXBwb3J0IHRoZSBpbnRlcm5hbCBtZXRhZGF0YSByZXByZXNlbnRhdGlvbiB1c2VkIGJ5IHRoZSBJbWFnZVJlYWRlciBvZgorICAgICAqIHRoaXMgc2VydmljZSBwcm92aWRlciwgb3IgbnVsbCBpZiB0aGVyZSBhcmUgbm8gc3VjaCBJbWFnZVdyaXRlcnMuCiAgICAgICogCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiBzdHJpbmdzIHdpdGggbmFtZXMgb2YgdGhlIEltYWdlV3JpdGVyU3BpIAotICAgICAqIGNsYXNzZXMuCisgICAgICogQHJldHVybiB0aGUgYXJyYXkgb2Ygc3RyaW5ncyB3aXRoIG5hbWVzIG9mIHRoZSBJbWFnZVdyaXRlclNwaSBjbGFzc2VzLgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRJbWFnZVdyaXRlclNwaU5hbWVzKCkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0Iik7CmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9zcGkvSW1hZ2VSZWFkZXJXcml0ZXJTcGkuamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL3NwaS9JbWFnZVJlYWRlcldyaXRlclNwaS5qYXZhCmluZGV4IGIzYzBmOTIuLjljYTA4YjUgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL3NwaS9JbWFnZVJlYWRlcldyaXRlclNwaS5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL3NwaS9JbWFnZVJlYWRlcldyaXRlclNwaS5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIFJ1c3RlbSBWLiBSYWZpa292CiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMyAkCiAgKi8KKwogcGFja2FnZSBqYXZheC5pbWFnZWlvLnNwaTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS54LmltYWdlaW8ubWV0YWRhdGEuSUlPTWV0YWRhdGFVdGlsczsKQEAgLTI1LDk3ICsyNiwxMzggQEAKIGltcG9ydCBqYXZheC5pbWFnZWlvLm1ldGFkYXRhLklJT01ldGFkYXRhRm9ybWF0OwogCiAvKioKLSAqIFRoZSBJbWFnZVJlYWRlcldyaXRlclNwaSBjbGFzcyBpcyBhIHN1cGVyY2xhc3MgZm9yIHRoZSAKLSAqIEltYWdlUmVhZGVyU3BpIGFuZCBJbWFnZVdyaXRlclNwaSBTUElzLgorICogVGhlIEltYWdlUmVhZGVyV3JpdGVyU3BpIGNsYXNzIGlzIGEgc3VwZXJjbGFzcyBmb3IgdGhlIEltYWdlUmVhZGVyU3BpIGFuZAorICogSW1hZ2VXcml0ZXJTcGkgU1BJcy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBJbWFnZVJlYWRlcldyaXRlclNwaSBleHRlbmRzIElJT1NlcnZpY2VQcm92aWRlcgotICAgICAgICBpbXBsZW1lbnRzIFJlZ2lzdGVyYWJsZVNlcnZpY2UgeworcHVibGljIGFic3RyYWN0IGNsYXNzIEltYWdlUmVhZGVyV3JpdGVyU3BpIGV4dGVuZHMgSUlPU2VydmljZVByb3ZpZGVyIGltcGxlbWVudHMKKyAgICAgICAgUmVnaXN0ZXJhYmxlU2VydmljZSB7CiAKLSAgICAvKiogVGhlIG5hbWVzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBuYW1lcy4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgU3RyaW5nW10gbmFtZXM7Ci0gICAgCi0gICAgLyoqIFRoZSBzdWZmaXhlcy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBzdWZmaXhlcy4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgU3RyaW5nW10gc3VmZml4ZXM7Ci0gICAgCi0gICAgLyoqIFRoZSBNSU1FIHR5cGVzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIE1JTUUgdHlwZXMuCisgICAgICovCiAgICAgcHJvdGVjdGVkIFN0cmluZ1tdIE1JTUVUeXBlczsKLSAgICAKLSAgICAvKiogVGhlIHBsdWdpbiBjbGFzcyBuYW1lLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHBsdWctaW4gY2xhc3MgbmFtZS4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgU3RyaW5nIHBsdWdpbkNsYXNzTmFtZTsKLSAgICAKLSAgICAvKiogV2hldGhlciB0aGUgcmVhZGVyL3dyaXRlciBzdXBwb3J0cyBzdGFuZGFyZCBzdHJlYW0gbWV0YWRhdGEgZm9ybWF0LiAqLworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgcmVhZGVyL3dyaXRlciBzdXBwb3J0cyBzdGFuZGFyZCBzdHJlYW0gbWV0YWRhdGEgZm9ybWF0LgorICAgICAqLwogICAgIHByb3RlY3RlZCBib29sZWFuIHN1cHBvcnRzU3RhbmRhcmRTdHJlYW1NZXRhZGF0YUZvcm1hdDsKLSAgICAKLSAgICAvKiogVGhlIG5hdGl2ZSBzdHJlYW0gbWV0YWRhdGEgZm9ybWF0IG5hbWUuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgbmF0aXZlIHN0cmVhbSBtZXRhZGF0YSBmb3JtYXQgbmFtZS4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgU3RyaW5nIG5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZTsKLSAgICAKLSAgICAvKiogVGhlIG5hdGl2ZSBzdHJlYW0gbWV0YWRhdGEgZm9ybWF0IGNsYXNzIG5hbWUuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgbmF0aXZlIHN0cmVhbSBtZXRhZGF0YSBmb3JtYXQgY2xhc3MgbmFtZS4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgU3RyaW5nIG5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lOwotICAgIAotICAgIC8qKiBUaGUgZXh0cmEgc3RyZWFtIG1ldGFkYXRhIGZvcm1hdCBuYW1lcy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBleHRyYSBzdHJlYW0gbWV0YWRhdGEgZm9ybWF0IG5hbWVzLgorICAgICAqLwogICAgIHByb3RlY3RlZCBTdHJpbmdbXSBleHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZXM7Ci0gICAgCi0gICAgLyoqIFRoZSBleHRyYSBzdHJlYW0gbWV0YWRhdGEgZm9ybWF0IGNsYXNzIG5hbWVzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIGV4dHJhIHN0cmVhbSBtZXRhZGF0YSBmb3JtYXQgY2xhc3MgbmFtZXMuCisgICAgICovCiAgICAgcHJvdGVjdGVkIFN0cmluZ1tdIGV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzOwotICAgIAotICAgIC8qKiBXaGV0aGVyIHRoZSByZWFkZXIvd3JpdGVyIHN1cHBvcnRzIHN0YW5kYXJkIGltYWdlIG1ldGFkYXRhIGZvcm1hdC4gKi8KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIHJlYWRlci93cml0ZXIgc3VwcG9ydHMgc3RhbmRhcmQgaW1hZ2UgbWV0YWRhdGEgZm9ybWF0LgorICAgICAqLwogICAgIHByb3RlY3RlZCBib29sZWFuIHN1cHBvcnRzU3RhbmRhcmRJbWFnZU1ldGFkYXRhRm9ybWF0OwotICAgIAotICAgIC8qKiBUaGUgbmF0aXZlIGltYWdlIG1ldGFkYXRhIGZvcm1hdCBuYW1lLiAqLworCisgICAgLyoqCisgICAgICogVGhlIG5hdGl2ZSBpbWFnZSBtZXRhZGF0YSBmb3JtYXQgbmFtZS4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgU3RyaW5nIG5hdGl2ZUltYWdlTWV0YWRhdGFGb3JtYXROYW1lOwotICAgIAotICAgIC8qKiBUaGUgbmF0aXZlIGltYWdlIG1ldGFkYXRhIGZvcm1hdCBjbGFzcyBuYW1lLiAqLworCisgICAgLyoqCisgICAgICogVGhlIG5hdGl2ZSBpbWFnZSBtZXRhZGF0YSBmb3JtYXQgY2xhc3MgbmFtZS4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgU3RyaW5nIG5hdGl2ZUltYWdlTWV0YWRhdGFGb3JtYXRDbGFzc05hbWU7Ci0gICAgCi0gICAgLyoqIFRoZSBleHRyYSBpbWFnZSBtZXRhZGF0YSBmb3JtYXQgbmFtZXMuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgZXh0cmEgaW1hZ2UgbWV0YWRhdGEgZm9ybWF0IG5hbWVzLgorICAgICAqLwogICAgIHByb3RlY3RlZCBTdHJpbmdbXSBleHRyYUltYWdlTWV0YWRhdGFGb3JtYXROYW1lczsKLSAgICAKLSAgICAvKiogVGhlIGV4dHJhIGltYWdlIG1ldGFkYXRhIGZvcm1hdCBjbGFzcyBuYW1lcy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBleHRyYSBpbWFnZSBtZXRhZGF0YSBmb3JtYXQgY2xhc3MgbmFtZXMuCisgICAgICovCiAgICAgcHJvdGVjdGVkIFN0cmluZ1tdIGV4dHJhSW1hZ2VNZXRhZGF0YUZvcm1hdENsYXNzTmFtZXM7CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgSW1hZ2VSZWFkZXJXcml0ZXJTcGkuCiAgICAgICogCi0gICAgICogQHBhcmFtIHZlbmRvck5hbWUgdGhlIHZlbmRvciBuYW1lLgotICAgICAqIEBwYXJhbSB2ZXJzaW9uIHRoZSB2ZXJzaW9uLgotICAgICAqIEBwYXJhbSBuYW1lcyB0aGUgZm9ybWF0IG5hbWVzLgotICAgICAqIEBwYXJhbSBzdWZmaXhlcyB0aGUgYXJyYXkgb2Ygc3RyaW5ncyByZXByZXNlbnRpbmcgdGhlIGZpbGUgc3VmZml4ZXMuIAotICAgICAqIEBwYXJhbSBNSU1FVHlwZXMgdGhlIGFuIGFycmF5IG9mIHN0cmluZ3MgcmVwcmVzZW50aW5nIE1JTUUgdHlwZXMuCi0gICAgICogQHBhcmFtIHBsdWdpbkNsYXNzTmFtZSB0aGUgcGx1Z2luIGNsYXNzIG5hbWUuCi0gICAgICogQHBhcmFtIHN1cHBvcnRzU3RhbmRhcmRTdHJlYW1NZXRhZGF0YUZvcm1hdCB0aGUgdmFsdWUgaW5kaWNhdGluZwotICAgICAqIGlmIHN0cmVhbSBtZXRhZGF0YSBjYW4gYmUgZGVzY3JpYmVkIGJ5IHN0YW5kYXJ0IG1ldGFkYXRhIGZvcm1hdC4KLSAgICAgKiBAcGFyYW0gbmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lIHRoZSBuYXRpdmUgc3RyZWFtIG1ldGFkYXRhIAotICAgICAqIGZvcm1hdCBuYW1lLCByZXR1cm5lZCBieSBnZXROYXRpdmVTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWUuCi0gICAgICogQHBhcmFtIG5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lIHRoZSBuYXRpdmUgc3RyZWFtIAotICAgICAqIG1ldGFkYXRhIGZvcm1hdCBjbGFzcyBuYW1lLCByZXR1cm5lZCBieSBnZXROYXRpdmVTdHJlYW1NZXRhZGF0YUZvcm1hdC4KLSAgICAgKiBAcGFyYW0gZXh0cmFTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWVzIHRoZSBleHRyYSBzdHJlYW0gbWV0YWRhdGEgCi0gICAgICogZm9ybWF0IG5hbWVzLCByZXR1cm5lZCBieSBnZXRFeHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZXMuCi0gICAgICogQHBhcmFtIGV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzIHRoZSBleHRyYSBzdHJlYW0gbWV0YWRhdGEgCi0gICAgICogZm9ybWF0IGNsYXNzIG5hbWVzLCByZXR1cm5lZCBieSBnZXRTdHJlYW1NZXRhZGF0YUZvcm1hdC4KLSAgICAgKiBAcGFyYW0gc3VwcG9ydHNTdGFuZGFyZEltYWdlTWV0YWRhdGFGb3JtYXQgdGhlIHZhbHVlIGluZGljYXRpbmcKLSAgICAgKiBpZiBpbWFnZSBtZXRhZGF0YSBjYW4gYmUgZGVzY3JpYmVkIGJ5IHN0YW5kYXJkIG1ldGFkYXRhIGZvcm1hdC4KLSAgICAgKiBAcGFyYW0gbmF0aXZlSW1hZ2VNZXRhZGF0YUZvcm1hdE5hbWUgdGhlIG5hdGl2ZSBpbWFnZSBtZXRhZGF0YSAKLSAgICAgKiBmb3JtYXQgbmFtZSwgcmV0dXJuZWQgYnkgZ2V0TmF0aXZlSW1hZ2VNZXRhZGF0YUZvcm1hdE5hbWUuCi0gICAgICogQHBhcmFtIG5hdGl2ZUltYWdlTWV0YWRhdGFGb3JtYXRDbGFzc05hbWUgdGhlIG5hdGl2ZSBpbWFnZQotICAgICAqIG1ldGFkYXRhIGZvcm1hdCBjbGFzcyBuYW1lLCByZXR1cm5lZCBieSBnZXROYXRpdmVJbWFnZU1ldGFkYXRhRm9ybWF0LgotICAgICAqIEBwYXJhbSBleHRyYUltYWdlTWV0YWRhdGFGb3JtYXROYW1lcyB0aGUgZXh0cmEgaW1hZ2UgbWV0YWRhdGEgCi0gICAgICogZm9ybWF0IG5hbWVzLCByZXR1cm5lZCBieSBnZXRFeHRyYUltYWdlTWV0YWRhdGFGb3JtYXROYW1lcy4KLSAgICAgKiBAcGFyYW0gZXh0cmFJbWFnZU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcyB0aGUgZXh0cmEgaW1hZ2UgbWV0YWRhdGEgCi0gICAgICogZm9ybWF0IGNsYXNzIG5hbWVzLCByZXR1cm5lZCBieSBnZXRJbWFnZU1ldGFkYXRhRm9ybWF0LgorICAgICAqIEBwYXJhbSB2ZW5kb3JOYW1lCisgICAgICogICAgICAgICAgICB0aGUgdmVuZG9yIG5hbWUuCisgICAgICogQHBhcmFtIHZlcnNpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSB2ZXJzaW9uLgorICAgICAqIEBwYXJhbSBuYW1lcworICAgICAqICAgICAgICAgICAgdGhlIGZvcm1hdCBuYW1lcy4KKyAgICAgKiBAcGFyYW0gc3VmZml4ZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSBvZiBzdHJpbmdzIHJlcHJlc2VudGluZyB0aGUgZmlsZSBzdWZmaXhlcy4KKyAgICAgKiBAcGFyYW0gTUlNRVR5cGVzCisgICAgICogICAgICAgICAgICB0aGUgYW4gYXJyYXkgb2Ygc3RyaW5ncyByZXByZXNlbnRpbmcgTUlNRSB0eXBlcy4KKyAgICAgKiBAcGFyYW0gcGx1Z2luQ2xhc3NOYW1lCisgICAgICogICAgICAgICAgICB0aGUgcGx1Zy1pbiBjbGFzcyBuYW1lLgorICAgICAqIEBwYXJhbSBzdXBwb3J0c1N0YW5kYXJkU3RyZWFtTWV0YWRhdGFGb3JtYXQKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSBpbmRpY2F0aW5nIGlmIHN0cmVhbSBtZXRhZGF0YSBjYW4gYmUgZGVzY3JpYmVkIGJ5CisgICAgICogICAgICAgICAgICBzdGFuZGFyZCBtZXRhZGF0YSBmb3JtYXQuCisgICAgICogQHBhcmFtIG5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hdGl2ZSBzdHJlYW0gbWV0YWRhdGEgZm9ybWF0IG5hbWUsIHJldHVybmVkIGJ5CisgICAgICogICAgICAgICAgICBnZXROYXRpdmVTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWUuCisgICAgICogQHBhcmFtIG5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmF0aXZlIHN0cmVhbSBtZXRhZGF0YSBmb3JtYXQgY2xhc3MgbmFtZSwgcmV0dXJuZWQgYnkKKyAgICAgKiAgICAgICAgICAgIGdldE5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0LgorICAgICAqIEBwYXJhbSBleHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBleHRyYSBzdHJlYW0gbWV0YWRhdGEgZm9ybWF0IG5hbWVzLCByZXR1cm5lZCBieQorICAgICAqICAgICAgICAgICAgZ2V0RXh0cmFTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWVzLgorICAgICAqIEBwYXJhbSBleHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcworICAgICAqICAgICAgICAgICAgdGhlIGV4dHJhIHN0cmVhbSBtZXRhZGF0YSBmb3JtYXQgY2xhc3MgbmFtZXMsIHJldHVybmVkIGJ5CisgICAgICogICAgICAgICAgICBnZXRTdHJlYW1NZXRhZGF0YUZvcm1hdC4KKyAgICAgKiBAcGFyYW0gc3VwcG9ydHNTdGFuZGFyZEltYWdlTWV0YWRhdGFGb3JtYXQKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSBpbmRpY2F0aW5nIGlmIGltYWdlIG1ldGFkYXRhIGNhbiBiZSBkZXNjcmliZWQgYnkKKyAgICAgKiAgICAgICAgICAgIHN0YW5kYXJkIG1ldGFkYXRhIGZvcm1hdC4KKyAgICAgKiBAcGFyYW0gbmF0aXZlSW1hZ2VNZXRhZGF0YUZvcm1hdE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYXRpdmUgaW1hZ2UgbWV0YWRhdGEgZm9ybWF0IG5hbWUsIHJldHVybmVkIGJ5CisgICAgICogICAgICAgICAgICBnZXROYXRpdmVJbWFnZU1ldGFkYXRhRm9ybWF0TmFtZS4KKyAgICAgKiBAcGFyYW0gbmF0aXZlSW1hZ2VNZXRhZGF0YUZvcm1hdENsYXNzTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hdGl2ZSBpbWFnZSBtZXRhZGF0YSBmb3JtYXQgY2xhc3MgbmFtZSwgcmV0dXJuZWQgYnkKKyAgICAgKiAgICAgICAgICAgIGdldE5hdGl2ZUltYWdlTWV0YWRhdGFGb3JtYXQuCisgICAgICogQHBhcmFtIGV4dHJhSW1hZ2VNZXRhZGF0YUZvcm1hdE5hbWVzCisgICAgICogICAgICAgICAgICB0aGUgZXh0cmEgaW1hZ2UgbWV0YWRhdGEgZm9ybWF0IG5hbWVzLCByZXR1cm5lZCBieQorICAgICAqICAgICAgICAgICAgZ2V0RXh0cmFJbWFnZU1ldGFkYXRhRm9ybWF0TmFtZXMuCisgICAgICogQHBhcmFtIGV4dHJhSW1hZ2VNZXRhZGF0YUZvcm1hdENsYXNzTmFtZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBleHRyYSBpbWFnZSBtZXRhZGF0YSBmb3JtYXQgY2xhc3MgbmFtZXMsIHJldHVybmVkIGJ5CisgICAgICogICAgICAgICAgICBnZXRJbWFnZU1ldGFkYXRhRm9ybWF0LgogICAgICAqLwogICAgIHB1YmxpYyBJbWFnZVJlYWRlcldyaXRlclNwaShTdHJpbmcgdmVuZG9yTmFtZSwgU3RyaW5nIHZlcnNpb24sIFN0cmluZ1tdIG5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBzdWZmaXhlcywgU3RyaW5nW10gTUlNRVR5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGx1Z2luQ2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHN1cHBvcnRzU3RhbmRhcmRTdHJlYW1NZXRhZGF0YUZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBleHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHN1cHBvcnRzU3RhbmRhcmRJbWFnZU1ldGFkYXRhRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmF0aXZlSW1hZ2VNZXRhZGF0YUZvcm1hdE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYXRpdmVJbWFnZU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBleHRyYUltYWdlTWV0YWRhdGFGb3JtYXROYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gZXh0cmFJbWFnZU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcykgeworICAgICAgICAgICAgU3RyaW5nW10gc3VmZml4ZXMsIFN0cmluZ1tdIE1JTUVUeXBlcywgU3RyaW5nIHBsdWdpbkNsYXNzTmFtZSwKKyAgICAgICAgICAgIGJvb2xlYW4gc3VwcG9ydHNTdGFuZGFyZFN0cmVhbU1ldGFkYXRhRm9ybWF0LCBTdHJpbmcgbmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lLAorICAgICAgICAgICAgU3RyaW5nIG5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lLCBTdHJpbmdbXSBleHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZXMsCisgICAgICAgICAgICBTdHJpbmdbXSBleHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcywKKyAgICAgICAgICAgIGJvb2xlYW4gc3VwcG9ydHNTdGFuZGFyZEltYWdlTWV0YWRhdGFGb3JtYXQsIFN0cmluZyBuYXRpdmVJbWFnZU1ldGFkYXRhRm9ybWF0TmFtZSwKKyAgICAgICAgICAgIFN0cmluZyBuYXRpdmVJbWFnZU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lLCBTdHJpbmdbXSBleHRyYUltYWdlTWV0YWRhdGFGb3JtYXROYW1lcywKKyAgICAgICAgICAgIFN0cmluZ1tdIGV4dHJhSW1hZ2VNZXRhZGF0YUZvcm1hdENsYXNzTmFtZXMpIHsKICAgICAgICAgc3VwZXIodmVuZG9yTmFtZSwgdmVyc2lvbik7CiAKICAgICAgICAgaWYgKG5hbWVzID09IG51bGwgfHwgbmFtZXMubGVuZ3RoID09IDApIHsKQEAgLTEzNyw2MCArMTc5LDU0IEBACiAgICAgICAgIHRoaXMubmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lID0gbmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lOwogICAgICAgICB0aGlzLm5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lID0gbmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXRDbGFzc05hbWU7CiAKLSAgICAgICAgdGhpcy5leHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZXMgPQotICAgICAgICAgICAgICAgIGV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lcyA9PSBudWxsID8KLSAgICAgICAgICAgICAgICBudWxsIDogZXh0cmFTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWVzLmNsb25lKCk7CisgICAgICAgIHRoaXMuZXh0cmFTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWVzID0gZXh0cmFTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWVzID09IG51bGwgPyBudWxsCisgICAgICAgICAgICAgICAgOiBleHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZXMuY2xvbmUoKTsKIAotICAgICAgICB0aGlzLmV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzID0KLSAgICAgICAgICAgICAgICBleHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcyA9PSBudWxsID8KLSAgICAgICAgICAgICAgICBudWxsIDogZXh0cmFTdHJlYW1NZXRhZGF0YUZvcm1hdENsYXNzTmFtZXMuY2xvbmUoKTsKKyAgICAgICAgdGhpcy5leHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcyA9IGV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzID09IG51bGwgPyBudWxsCisgICAgICAgICAgICAgICAgOiBleHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcy5jbG9uZSgpOwogCiAgICAgICAgIHRoaXMuc3VwcG9ydHNTdGFuZGFyZEltYWdlTWV0YWRhdGFGb3JtYXQgPSBzdXBwb3J0c1N0YW5kYXJkSW1hZ2VNZXRhZGF0YUZvcm1hdDsKICAgICAgICAgdGhpcy5uYXRpdmVJbWFnZU1ldGFkYXRhRm9ybWF0TmFtZSA9IG5hdGl2ZUltYWdlTWV0YWRhdGFGb3JtYXROYW1lOwogICAgICAgICB0aGlzLm5hdGl2ZUltYWdlTWV0YWRhdGFGb3JtYXRDbGFzc05hbWUgPSBuYXRpdmVJbWFnZU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lOwogCi0gICAgICAgIHRoaXMuZXh0cmFJbWFnZU1ldGFkYXRhRm9ybWF0TmFtZXMgPQotICAgICAgICAgICAgICAgIGV4dHJhSW1hZ2VNZXRhZGF0YUZvcm1hdE5hbWVzID09IG51bGwgPwotICAgICAgICAgICAgICAgIG51bGwgOiBleHRyYUltYWdlTWV0YWRhdGFGb3JtYXROYW1lcy5jbG9uZSgpOworICAgICAgICB0aGlzLmV4dHJhSW1hZ2VNZXRhZGF0YUZvcm1hdE5hbWVzID0gZXh0cmFJbWFnZU1ldGFkYXRhRm9ybWF0TmFtZXMgPT0gbnVsbCA/IG51bGwKKyAgICAgICAgICAgICAgICA6IGV4dHJhSW1hZ2VNZXRhZGF0YUZvcm1hdE5hbWVzLmNsb25lKCk7CiAKLSAgICAgICAgdGhpcy5leHRyYUltYWdlTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzID0KLSAgICAgICAgICAgICAgICBleHRyYUltYWdlTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzID09IG51bGwgPwotICAgICAgICAgICAgICAgIG51bGwgOiBleHRyYUltYWdlTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzLmNsb25lKCk7CisgICAgICAgIHRoaXMuZXh0cmFJbWFnZU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcyA9IGV4dHJhSW1hZ2VNZXRhZGF0YUZvcm1hdENsYXNzTmFtZXMgPT0gbnVsbCA/IG51bGwKKyAgICAgICAgICAgICAgICA6IGV4dHJhSW1hZ2VNZXRhZGF0YUZvcm1hdENsYXNzTmFtZXMuY2xvbmUoKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgSW1hZ2VSZWFkZXJXcml0ZXJTcGkuCiAgICAgICovCi0gICAgcHVibGljIEltYWdlUmVhZGVyV3JpdGVyU3BpKCkge30KKyAgICBwdWJsaWMgSW1hZ2VSZWFkZXJXcml0ZXJTcGkoKSB7CisgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbiBhcnJheSBvZiBzdHJpbmdzIHJlcHJlc2VudGluZyBuYW1lcyBvZiB0aGUgZm9ybWF0cyAKLSAgICAgKiB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRoZSBJbWFnZVJlYWRlciAKLSAgICAgKiBvciBJbWFnZVdyaXRlciBpbXBsZW1lbnRhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXJ2aWNlIAotICAgICAqIHByb3ZpZGVyLiAKKyAgICAgKiBHZXRzIGFuIGFycmF5IG9mIHN0cmluZ3MgcmVwcmVzZW50aW5nIG5hbWVzIG9mIHRoZSBmb3JtYXRzIHRoYXQgY2FuIGJlCisgICAgICogdXNlZCBieSB0aGUgSW1hZ2VSZWFkZXIgb3IgSW1hZ2VXcml0ZXIgaW1wbGVtZW50YXRpb24gYXNzb2NpYXRlZCB3aXRoCisgICAgICogdGhpcyBzZXJ2aWNlIHByb3ZpZGVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2Ygc3VwcG9ydGVkIGZvcm1hdCBuYW1lcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBzdXBwb3J0ZWQgZm9ybWF0IG5hbWVzLgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRGb3JtYXROYW1lcygpIHsKICAgICAgICAgcmV0dXJuIG5hbWVzLmNsb25lKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbiBhcnJheSBvZiBzdHJpbmdzIHJlcHJlc2VudGluZyBmaWxlIHN1ZmZpeGVzIAotICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgZm9ybWF0cyB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRoZSAKLSAgICAgKiBJbWFnZVJlYWRlciBvciBJbWFnZVdyaXRlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCi0gICAgICogc2VydmljZSBwcm92aWRlci4KKyAgICAgKiBHZXRzIGFuIGFycmF5IG9mIHN0cmluZ3MgcmVwcmVzZW50aW5nIGZpbGUgc3VmZml4ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZQorICAgICAqIGZvcm1hdHMgdGhhdCBjYW4gYmUgdXNlZCBieSB0aGUgSW1hZ2VSZWFkZXIgb3IgSW1hZ2VXcml0ZXIgaW1wbGVtZW50YXRpb24KKyAgICAgKiBvZiB0aGlzIHNlcnZpY2UgcHJvdmlkZXIuCiAgICAgICogCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiBmaWxlIHN1ZmZpeGVzLgorICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGZpbGUgc3VmZml4ZXMuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ1tdIGdldEZpbGVTdWZmaXhlcygpIHsKICAgICAgICAgcmV0dXJuIHN1ZmZpeGVzID09IG51bGwgPyBudWxsIDogc3VmZml4ZXMuY2xvbmUoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIGFycmF5IG9mIHN0cmluZ3Mgd2l0aCB0aGUgbmFtZXMgb2YgCi0gICAgICogYWRkaXRpb25hbCBmb3JtYXRzIG9mIHRoZSBpbWFnZSBtZXRhZGF0YSBvYmplY3RzIAotICAgICAqIHByb2R1Y2VkIG9yIGNvbnN1bWVkIGJ5IHRoaXMgcGx1Zy1pbi4KKyAgICAgKiBHZXRzIGFuIGFycmF5IG9mIHN0cmluZ3Mgd2l0aCB0aGUgbmFtZXMgb2YgYWRkaXRpb25hbCBmb3JtYXRzIG9mIHRoZQorICAgICAqIGltYWdlIG1ldGFkYXRhIG9iamVjdHMgcHJvZHVjZWQgb3IgY29uc3VtZWQgYnkgdGhpcyBwbHVnLWluLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGV4dHJhIGltYWdlIG1ldGFkYXRhIGZvcm1hdCBuYW1lcy4KICAgICAgKi8KQEAgLTE5OSw1MiArMjM1LDQ5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbiBhcnJheSBvZiBzdHJpbmdzIHdpdGggdGhlIG5hbWVzIG9mIAotICAgICAqIGFkZGl0aW9uYWwgZm9ybWF0cyBvZiB0aGUgc3RyZWFtIG1ldGFkYXRhIG9iamVjdHMgCi0gICAgICogcHJvZHVjZWQgb3IgY29uc3VtZWQgYnkgdGhpcyBwbHVnLWluLgorICAgICAqIEdldHMgYW4gYXJyYXkgb2Ygc3RyaW5ncyB3aXRoIHRoZSBuYW1lcyBvZiBhZGRpdGlvbmFsIGZvcm1hdHMgb2YgdGhlCisgICAgICogc3RyZWFtIG1ldGFkYXRhIG9iamVjdHMgcHJvZHVjZWQgb3IgY29uc3VtZWQgYnkgdGhpcyBwbHVnLWluLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGV4dHJhIHN0cmVhbSBtZXRhZGF0YSBmb3JtYXQgbmFtZXMuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ1tdIGdldEV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lcygpIHsKLSAgICAgICAgcmV0dXJuIGV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lcyA9PSBudWxsID8gbnVsbCA6IGV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lcy5jbG9uZSgpOworICAgICAgICByZXR1cm4gZXh0cmFTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWVzID09IG51bGwgPyBudWxsIDogZXh0cmFTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWVzCisgICAgICAgICAgICAgICAgLmNsb25lKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbiBJSU9NZXRhZGF0YUZvcm1hdCBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgaW1hZ2UgCi0gICAgICogbWV0YWRhdGEgZm9ybWF0IG5hbWUuIAorICAgICAqIEdldHMgYW4gSUlPTWV0YWRhdGFGb3JtYXQgb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIGltYWdlIG1ldGFkYXRhIGZvcm1hdAorICAgICAqIG5hbWUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGZvcm1hdE5hbWUgdGhlIGZvcm1hdCBuYW1lLgotICAgICAqIAorICAgICAqIEBwYXJhbSBmb3JtYXROYW1lCisgICAgICogICAgICAgICAgICB0aGUgZm9ybWF0IG5hbWUuCiAgICAgICogQHJldHVybiB0aGUgSUlPTWV0YWRhdGFGb3JtYXQsIG9yIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIElJT01ldGFkYXRhRm9ybWF0IGdldEltYWdlTWV0YWRhdGFGb3JtYXQoU3RyaW5nIGZvcm1hdE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIElJT01ldGFkYXRhVXRpbHMuaW5zdGFudGlhdGVNZXRhZGF0YUZvcm1hdCgKLSAgICAgICAgICAgICAgICBmb3JtYXROYW1lLCBzdXBwb3J0c1N0YW5kYXJkSW1hZ2VNZXRhZGF0YUZvcm1hdCwKLSAgICAgICAgICAgICAgICBuYXRpdmVJbWFnZU1ldGFkYXRhRm9ybWF0TmFtZSwgbmF0aXZlSW1hZ2VNZXRhZGF0YUZvcm1hdENsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICBleHRyYUltYWdlTWV0YWRhdGFGb3JtYXROYW1lcywgZXh0cmFJbWFnZU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcwotICAgICAgICApOworICAgICAgICByZXR1cm4gSUlPTWV0YWRhdGFVdGlscy5pbnN0YW50aWF0ZU1ldGFkYXRhRm9ybWF0KGZvcm1hdE5hbWUsCisgICAgICAgICAgICAgICAgc3VwcG9ydHNTdGFuZGFyZEltYWdlTWV0YWRhdGFGb3JtYXQsIG5hdGl2ZUltYWdlTWV0YWRhdGFGb3JtYXROYW1lLAorICAgICAgICAgICAgICAgIG5hdGl2ZUltYWdlTWV0YWRhdGFGb3JtYXRDbGFzc05hbWUsIGV4dHJhSW1hZ2VNZXRhZGF0YUZvcm1hdE5hbWVzLAorICAgICAgICAgICAgICAgIGV4dHJhSW1hZ2VNZXRhZGF0YUZvcm1hdENsYXNzTmFtZXMpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYW4gSUlPTWV0YWRhdGFGb3JtYXQgb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIHN0cmVhbSAKLSAgICAgKiBtZXRhZGF0YSBmb3JtYXQgbmFtZS4gCisgICAgICogR2V0cyBhbiBJSU9NZXRhZGF0YUZvcm1hdCBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgc3RyZWFtIG1ldGFkYXRhIGZvcm1hdAorICAgICAqIG5hbWUuCiAgICAgICogCi0gICAgICogQHBhcmFtIGZvcm1hdE5hbWUgdGhlIGZvcm1hdCBuYW1lLgotICAgICAqIAorICAgICAqIEBwYXJhbSBmb3JtYXROYW1lCisgICAgICogICAgICAgICAgICB0aGUgZm9ybWF0IG5hbWUuCiAgICAgICogQHJldHVybiB0aGUgSUlPTWV0YWRhdGFGb3JtYXQsIG9yIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIElJT01ldGFkYXRhRm9ybWF0IGdldFN0cmVhbU1ldGFkYXRhRm9ybWF0KFN0cmluZyBmb3JtYXROYW1lKSB7Ci0gICAgICAgIHJldHVybiBJSU9NZXRhZGF0YVV0aWxzLmluc3RhbnRpYXRlTWV0YWRhdGFGb3JtYXQoCi0gICAgICAgICAgICAgICAgZm9ybWF0TmFtZSwgc3VwcG9ydHNTdGFuZGFyZFN0cmVhbU1ldGFkYXRhRm9ybWF0LAotICAgICAgICAgICAgICAgIG5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZSwgbmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXRDbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgZXh0cmFTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWVzLCBleHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcwotICAgICAgICApOworICAgICAgICByZXR1cm4gSUlPTWV0YWRhdGFVdGlscy5pbnN0YW50aWF0ZU1ldGFkYXRhRm9ybWF0KGZvcm1hdE5hbWUsCisgICAgICAgICAgICAgICAgc3VwcG9ydHNTdGFuZGFyZFN0cmVhbU1ldGFkYXRhRm9ybWF0LCBuYXRpdmVTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWUsCisgICAgICAgICAgICAgICAgbmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXRDbGFzc05hbWUsIGV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lcywKKyAgICAgICAgICAgICAgICBleHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbiBhcnJheSBvZiBzdHJpbmdzIHJlcHJlc2VudGluZyB0aGUgTUlNRSB0eXBlcyAKLSAgICAgKiBvZiB0aGUgZm9ybWF0cyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIAotICAgICAqIEltYWdlUmVhZGVyIG9yIEltYWdlV3JpdGVyIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgCisgICAgICogR2V0cyBhbiBhcnJheSBvZiBzdHJpbmdzIHJlcHJlc2VudGluZyB0aGUgTUlNRSB0eXBlcyBvZiB0aGUgZm9ybWF0cyB0aGF0CisgICAgICogYXJlIHN1cHBvcnRlZCBieSB0aGUgSW1hZ2VSZWFkZXIgb3IgSW1hZ2VXcml0ZXIgaW1wbGVtZW50YXRpb24gb2YgdGhpcwogICAgICAqIHNlcnZpY2UgcHJvdmlkZXIuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgYXJyYXkgTUlNRSB0eXBlcy4KQEAgLTI1NCwzMiArMjg3LDMwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgbmF0aXZlIGltYWdlIG1ldGFkYXRhIGZvcm1hdCBmb3IgCi0gICAgICogdGhpcyByZWFkZXIvd3JpdGVyLCB3aGljaCBhbGxvd3MgZm9yIGxvc3NsZXNzIGVuY29kaW5nCi0gICAgICogb3IgZGVjb2Rpbmcgb2YgdGhlIGltYWdlIG1ldGFkYXRhIHdpdGggdGhlIGZvcm1hdC4KKyAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBuYXRpdmUgaW1hZ2UgbWV0YWRhdGEgZm9ybWF0IGZvciB0aGlzIHJlYWRlci93cml0ZXIsCisgICAgICogd2hpY2ggYWxsb3dzIGZvciBsb3NzbGVzcyBlbmNvZGluZyBvciBkZWNvZGluZyBvZiB0aGUgaW1hZ2UgbWV0YWRhdGEgd2l0aAorICAgICAqIHRoZSBmb3JtYXQuCiAgICAgICogCi0gICAgICogQHJldHVybiB0aGUgc3RyaW5nIHdpdGggbmF0aXZlIGltYWdlIG1ldGFkYXRhIGZvcm1hdCBuYW1lLCAKLSAgICAgKiBvciBudWxsLgorICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyB3aXRoIG5hdGl2ZSBpbWFnZSBtZXRhZGF0YSBmb3JtYXQgbmFtZSwgb3IgbnVsbC4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldE5hdGl2ZUltYWdlTWV0YWRhdGFGb3JtYXROYW1lKCkgewogICAgICAgICByZXR1cm4gbmF0aXZlSW1hZ2VNZXRhZGF0YUZvcm1hdE5hbWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgbmF0aXZlIHN0cmVhbSBtZXRhZGF0YSBmb3JtYXQgZm9yIAotICAgICAqIHRoaXMgcmVhZGVyL3dyaXRlciwgd2hpY2ggYWxsb3dzIGZvciBsb3NzbGVzcyBlbmNvZGluZwotICAgICAqIG9yIGRlY29kaW5nIG9mIHRoZSBzdHJlYW0gbWV0YWRhdGEgd2l0aCB0aGUgZm9ybWF0LgorICAgICAqIEdldHMgdGhlIG5hbWUgb2YgdGhlIG5hdGl2ZSBzdHJlYW0gbWV0YWRhdGEgZm9ybWF0IGZvciB0aGlzCisgICAgICogcmVhZGVyL3dyaXRlciwgd2hpY2ggYWxsb3dzIGZvciBsb3NzbGVzcyBlbmNvZGluZyBvciBkZWNvZGluZyBvZiB0aGUKKyAgICAgKiBzdHJlYW0gbWV0YWRhdGEgd2l0aCB0aGUgZm9ybWF0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyB3aXRoIG5hdGl2ZSBzdHJlYW0gbWV0YWRhdGEgZm9ybWF0IG5hbWUsIAotICAgICAqIG9yIG51bGwuCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIHdpdGggbmF0aXZlIHN0cmVhbSBtZXRhZGF0YSBmb3JtYXQgbmFtZSwgb3IgbnVsbC4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldE5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZSgpIHsKICAgICAgICAgcmV0dXJuIG5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBJbWFnZVJlYWRlciAKLSAgICAgKiBvciBJbWFnZVdyaXRlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXJ2aWNlIHByb3ZpZGVyLgorICAgICAqIEdldHMgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIEltYWdlUmVhZGVyIG9yIEltYWdlV3JpdGVyIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoaXMgc2VydmljZSBwcm92aWRlci4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBjbGFzcyBuYW1lLgogICAgICAqLwpAQCAtMjg4LDI2ICszMTksMjQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgdGhlIHN0YW5kYXJkIG1ldGFkYXRhIGZvcm1hdCBpcyBzdXBwb3J0ZWQgCi0gICAgICogYnkgdGhlIGdldEFzVHJlZSBhbmQgc2V0RnJvbVRyZWUgbWV0aG9kcyBmb3IgdGhlIAotICAgICAqIGltYWdlIG1ldGFkYXRhIG9iamVjdHMgcHJvZHVjZWQgb3IgY29uc3VtZWQgYnkgdGhpcyAKLSAgICAgKiByZWFkZXIgb3Igd3JpdGVyLgorICAgICAqIENoZWNrcyBpZiB0aGUgc3RhbmRhcmQgbWV0YWRhdGEgZm9ybWF0IGlzIHN1cHBvcnRlZCBieSB0aGUgZ2V0QXNUcmVlIGFuZAorICAgICAqIHNldEZyb21UcmVlIG1ldGhvZHMgZm9yIHRoZSBpbWFnZSBtZXRhZGF0YSBvYmplY3RzIHByb2R1Y2VkIG9yIGNvbnN1bWVkCisgICAgICogYnkgdGhpcyByZWFkZXIgb3Igd3JpdGVyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgc3RhbmRhcmQgaW1hZ2UgbWV0YWRhdGEgZm9ybWF0IGlzIAotICAgICAqIHN1cHBvcnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgc3RhbmRhcmQgaW1hZ2UgbWV0YWRhdGEgZm9ybWF0IGlzIHN1cHBvcnRlZCwgZmFsc2UKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YW5kYXJkSW1hZ2VNZXRhZGF0YUZvcm1hdFN1cHBvcnRlZCgpIHsKICAgICAgICAgcmV0dXJuIHN1cHBvcnRzU3RhbmRhcmRJbWFnZU1ldGFkYXRhRm9ybWF0OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyBpZiB0aGUgc3RhbmRhcmQgbWV0YWRhdGEgZm9ybWF0IGlzIHN1cHBvcnRlZCAKLSAgICAgKiBieSB0aGUgZ2V0QXNUcmVlIGFuZCBzZXRGcm9tVHJlZSBtZXRob2RzIGZvciB0aGUgCi0gICAgICogc3RyZWFtIG1ldGFkYXRhIG9iamVjdHMgcHJvZHVjZWQgb3IgY29uc3VtZWQgYnkgdGhpcyAKLSAgICAgKiByZWFkZXIgb3Igd3JpdGVyLgorICAgICAqIENoZWNrcyBpZiB0aGUgc3RhbmRhcmQgbWV0YWRhdGEgZm9ybWF0IGlzIHN1cHBvcnRlZCBieSB0aGUgZ2V0QXNUcmVlIGFuZAorICAgICAqIHNldEZyb21UcmVlIG1ldGhvZHMgZm9yIHRoZSBzdHJlYW0gbWV0YWRhdGEgb2JqZWN0cyBwcm9kdWNlZCBvciBjb25zdW1lZAorICAgICAqIGJ5IHRoaXMgcmVhZGVyIG9yIHdyaXRlci4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHN0YW5kYXJkIHN0cmVhbSBtZXRhZGF0YSBmb3JtYXQgaXMgCi0gICAgICogc3VwcG9ydGVkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlLCBpZiBzdGFuZGFyZCBzdHJlYW0gbWV0YWRhdGEgZm9ybWF0IGlzIHN1cHBvcnRlZCwgZmFsc2UKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YW5kYXJkU3RyZWFtTWV0YWRhdGFGb3JtYXRTdXBwb3J0ZWQoKSB7CiAgICAgICAgIHJldHVybiBzdXBwb3J0c1N0YW5kYXJkU3RyZWFtTWV0YWRhdGFGb3JtYXQ7CmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9zcGkvSW1hZ2VUcmFuc2NvZGVyU3BpLmphdmEgYi9hd3QvamF2YXgvaW1hZ2Vpby9zcGkvSW1hZ2VUcmFuc2NvZGVyU3BpLmphdmEKaW5kZXggNjhjNDAyNC4uNzQyYWYxOSAxMDA2NDQKLS0tIGEvYXd0L2phdmF4L2ltYWdlaW8vc3BpL0ltYWdlVHJhbnNjb2RlclNwaS5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL3NwaS9JbWFnZVRyYW5zY29kZXJTcGkuamF2YQpAQCAtMTgsMTYgKzE4LDE4IEBACiAgKiBAYXV0aG9yIFJ1c3RlbSBWLiBSYWZpa292CiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMyAkCiAgKi8KKwogcGFja2FnZSBqYXZheC5pbWFnZWlvLnNwaTsKIAogaW1wb3J0IGphdmF4LmltYWdlaW8uSW1hZ2VUcmFuc2NvZGVyOwogCiAvKioKLSAqIFRoZSBJbWFnZVRyYW5zY29kZXJTcGkgY2xhc3MgaXMgYSBzZXJ2aWNlIHByb3ZpZGVyIGludGVyZmFjZSAoU1BJKSAKLSAqIGZvciBJbWFnZVRyYW5zY29kZXJzLgorICogVGhlIEltYWdlVHJhbnNjb2RlclNwaSBjbGFzcyBpcyBhIHNlcnZpY2UgcHJvdmlkZXIgaW50ZXJmYWNlIChTUEkpIGZvcgorICogSW1hZ2VUcmFuc2NvZGVycy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBJbWFnZVRyYW5zY29kZXJTcGkgZXh0ZW5kcyBJSU9TZXJ2aWNlUHJvdmlkZXIKLSAgICAgICAgaW1wbGVtZW50cyBSZWdpc3RlcmFibGVTZXJ2aWNlIHsKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBJbWFnZVRyYW5zY29kZXJTcGkgZXh0ZW5kcyBJSU9TZXJ2aWNlUHJvdmlkZXIgaW1wbGVtZW50cyBSZWdpc3RlcmFibGVTZXJ2aWNlIHsKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJbWFnZVRyYW5zY29kZXJTcGkuCkBAIC0zNiwzNyArMzgsMzcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgSW1hZ2VUcmFuc2NvZGVyU3BpIHdpdGggdGhlIHNwZWNpZmllZAotICAgICAqIHZlbmRvciBuYW1lIGFuZCB2ZXJzaW9uLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJbWFnZVRyYW5zY29kZXJTcGkgd2l0aCB0aGUgc3BlY2lmaWVkIHZlbmRvciBuYW1lIGFuZAorICAgICAqIHZlcnNpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIHZlbmRvck5hbWUgdGhlIHZlbmRvciBuYW1lLgotICAgICAqIEBwYXJhbSB2ZXJzaW9uIHRoZSB2ZXJzaW9uLgorICAgICAqIEBwYXJhbSB2ZW5kb3JOYW1lCisgICAgICogICAgICAgICAgICB0aGUgdmVuZG9yIG5hbWUuCisgICAgICogQHBhcmFtIHZlcnNpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSB2ZXJzaW9uLgogICAgICAqLwogICAgIHB1YmxpYyBJbWFnZVRyYW5zY29kZXJTcGkoU3RyaW5nIHZlbmRvck5hbWUsIFN0cmluZyB2ZXJzaW9uKSB7CiAgICAgICAgIHN1cGVyKHZlbmRvck5hbWUsIHZlcnNpb24pOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNsYXNzIG5hbWUgb2YgYW4gSW1hZ2VSZWFkZXJTcGkgdGhhdCAKLSAgICAgKiBwcm9kdWNlcyBJSU9NZXRhZGF0YSBvYmplY3RzIHRoYXQgY2FuIGJlIHVzZWQgYXMgCi0gICAgICogaW5wdXQgdG8gdGhpcyB0cmFuc2NvZGVyLgorICAgICAqIEdldHMgdGhlIGNsYXNzIG5hbWUgb2YgYW4gSW1hZ2VSZWFkZXJTcGkgdGhhdCBwcm9kdWNlcyBJSU9NZXRhZGF0YQorICAgICAqIG9iamVjdHMgdGhhdCBjYW4gYmUgdXNlZCBhcyBpbnB1dCB0byB0aGlzIHRyYW5zY29kZXIuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgY2xhc3MgbmFtZSBvZiBhbiBJbWFnZVJlYWRlclNwaS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFJlYWRlclNlcnZpY2VQcm92aWRlck5hbWUoKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNsYXNzIG5hbWUgb2YgYW4gSW1hZ2VXcml0ZXJTcGkgdGhhdCAKLSAgICAgKiBwcm9kdWNlcyBJSU9NZXRhZGF0YSBvYmplY3RzIHRoYXQgY2FuIGJlIHVzZWQgYXMgCi0gICAgICogaW5wdXQgdG8gdGhpcyB0cmFuc2NvZGVyLgorICAgICAqIEdldHMgdGhlIGNsYXNzIG5hbWUgb2YgYW4gSW1hZ2VXcml0ZXJTcGkgdGhhdCBwcm9kdWNlcyBJSU9NZXRhZGF0YQorICAgICAqIG9iamVjdHMgdGhhdCBjYW4gYmUgdXNlZCBhcyBpbnB1dCB0byB0aGlzIHRyYW5zY29kZXIuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgY2xhc3MgbmFtZSBvZiBhbiBJbWFnZVdyaXRlclNwaS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFdyaXRlclNlcnZpY2VQcm92aWRlck5hbWUoKTsKIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIEltYWdlVHJhbnNjb2RlciBhc3NvY2lhdGVkIAotICAgICAqIHdpdGggdGhpcyBzZXJ2aWNlIHByb3ZpZGVyLgorICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIEltYWdlVHJhbnNjb2RlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXJ2aWNlCisgICAgICogcHJvdmlkZXIuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgSW1hZ2VUcmFuc2NvZGVyIGluc3RhbmNlLgogICAgICAqLwpkaWZmIC0tZ2l0IGEvYXd0L2phdmF4L2ltYWdlaW8vc3BpL0ltYWdlV3JpdGVyU3BpLmphdmEgYi9hd3QvamF2YXgvaW1hZ2Vpby9zcGkvSW1hZ2VXcml0ZXJTcGkuamF2YQppbmRleCA5NzllZjc3Li5iZjI1NDU1IDEwMDY0NAotLS0gYS9hd3QvamF2YXgvaW1hZ2Vpby9zcGkvSW1hZ2VXcml0ZXJTcGkuamF2YQorKysgYi9hd3QvamF2YXgvaW1hZ2Vpby9zcGkvSW1hZ2VXcml0ZXJTcGkuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBSdXN0ZW0gVi4gUmFmaWtvdgogICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjMgJAogICovCisKIHBhY2thZ2UgamF2YXguaW1hZ2Vpby5zcGk7CiAKIGltcG9ydCBqYXZheC5pbWFnZWlvLnN0cmVhbS5JbWFnZUlucHV0U3RyZWFtOwpAQCAtMjcsMTggKzI4LDI4IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAogLyoqCi0gKiBUaGUgSW1hZ2VXcml0ZXJTcGkgYWJzdHJhY3QgY2xhc3MgaXMgYSBzZXJ2aWNlIHByb3ZpZGVyIAotICogaW50ZXJmYWNlIChTUEkpIGZvciBJbWFnZVdyaXRlcnMuCisgKiBUaGUgSW1hZ2VXcml0ZXJTcGkgYWJzdHJhY3QgY2xhc3MgaXMgYSBzZXJ2aWNlIHByb3ZpZGVyIGludGVyZmFjZSAoU1BJKSBmb3IKKyAqIEltYWdlV3JpdGVycy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBJbWFnZVdyaXRlclNwaSBleHRlbmRzIEltYWdlUmVhZGVyV3JpdGVyU3BpIHsKIAotICAgIC8qKiBUaGUgU1RBTkRBUkRfT1VUUFVUX1RZUEUgY29udGFpbnMgSW1hZ2VJbnB1dFN0cmVhbS5jbGFzcy4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzW10gU1RBTkRBUkRfT1VUUFVUX1RZUEUgPSBuZXcgQ2xhc3NbXSB7SW1hZ2VJbnB1dFN0cmVhbS5jbGFzc307CisgICAgLyoqCisgICAgICogVGhlIFNUQU5EQVJEX09VVFBVVF9UWVBFIGNvbnRhaW5zIEltYWdlSW5wdXRTdHJlYW0uY2xhc3MuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzc1tdIFNUQU5EQVJEX09VVFBVVF9UWVBFID0gbmV3IENsYXNzW10geworICAgICAgICBJbWFnZUlucHV0U3RyZWFtLmNsYXNzCisgICAgfTsKIAotICAgIC8qKiBUaGUgb3V0cHV0IHR5cGVzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBvdXRwdXQgdHlwZXMuCisgICAgICovCiAgICAgcHJvdGVjdGVkIENsYXNzW10gb3V0cHV0VHlwZXM7Ci0gICAgCi0gICAgLyoqIFRoZSByZWFkZXIgc3BpIG5hbWVzLiAqLworCisgICAgLyoqCisgICAgICogVGhlIHJlYWRlciBTUEkgbmFtZXMuCisgICAgICovCiAgICAgcHJvdGVjdGVkIFN0cmluZ1tdIHJlYWRlclNwaU5hbWVzOwogCiAgICAgLyoqCkBAIC01MSw1MCArNjIsNjIgQEAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgSW1hZ2VXcml0ZXJTcGkgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHZlbmRvck5hbWUgdGhlIHZlbmRvciBuYW1lLgotICAgICAqIEBwYXJhbSB2ZXJzaW9uIHRoZSB2ZXJzaW9uLgotICAgICAqIEBwYXJhbSBuYW1lcyB0aGUgZm9ybWF0IG5hbWVzLgotICAgICAqIEBwYXJhbSBzdWZmaXhlcyB0aGUgYXJyYXkgb2Ygc3RyaW5ncyByZXByZXNlbnRpbmcgdGhlIGZpbGUgc3VmZml4ZXMuIAotICAgICAqIEBwYXJhbSBNSU1FVHlwZXMgdGhlIGFuIGFycmF5IG9mIHN0cmluZ3MgcmVwcmVzZW50aW5nIE1JTUUgdHlwZXMuCi0gICAgICogQHBhcmFtIHBsdWdpbkNsYXNzTmFtZSB0aGUgcGx1Z2luIGNsYXNzIG5hbWUuCi0gICAgICogQHBhcmFtIG91dHB1dFR5cGVzIHRoZSBvdXRwdXQgdHlwZXMuCi0gICAgICogQHBhcmFtIHJlYWRlclNwaU5hbWVzIHRoZSBhcnJheSBvZiBzdHJpbmdzIHdpdGggY2xhc3MgbmFtZXMgb2YgYWxsIAotICAgICAqIGFzc29jaWF0ZWQgSW1hZ2VSZWFkZXJzLgotICAgICAqIEBwYXJhbSBzdXBwb3J0c1N0YW5kYXJkU3RyZWFtTWV0YWRhdGFGb3JtYXQgdGhlIHZhbHVlIGluZGljYXRpbmcKLSAgICAgKiBpZiBzdHJlYW0gbWV0YWRhdGEgY2FuIGJlIGRlc2NyaWJlZCBieSBzdGFuZGFyZCBtZXRhZGF0YSBmb3JtYXQuCi0gICAgICogQHBhcmFtIG5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZSB0aGUgbmF0aXZlIHN0cmVhbSBtZXRhZGF0YSAKLSAgICAgKiBmb3JtYXQgbmFtZSwgcmV0dXJuZWQgYnkgZ2V0TmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lLgotICAgICAqIEBwYXJhbSBuYXRpdmVTdHJlYW1NZXRhZGF0YUZvcm1hdENsYXNzTmFtZSB0aGUgbmF0aXZlIHN0cmVhbSAKLSAgICAgKiBtZXRhZGF0YSBmb3JtYXQgY2xhc3MgbmFtZSwgcmV0dXJuZWQgYnkgZ2V0TmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXQuCi0gICAgICogQHBhcmFtIGV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lcyB0aGUgZXh0cmEgc3RyZWFtIG1ldGFkYXRhIAotICAgICAqIGZvcm1hdCBuYW1lcywgcmV0dXJuZWQgYnkgZ2V0RXh0cmFTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWVzLgotICAgICAqIEBwYXJhbSBleHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcyB0aGUgZXh0cmEgc3RyZWFtIG1ldGFkYXRhIAotICAgICAqIGZvcm1hdCBjbGFzcyBuYW1lcywgcmV0dXJuZWQgYnkgZ2V0U3RyZWFtTWV0YWRhdGFGb3JtYXQuCi0gICAgICogQHBhcmFtIHN1cHBvcnRzU3RhbmRhcmRJbWFnZU1ldGFkYXRhRm9ybWF0IHRoZSB2YWx1ZSBpbmRpY2F0aW5nCi0gICAgICogaWYgaW1hZ2UgbWV0YWRhdGEgY2FuIGJlIGRlc2NyaWJlZCBieSBzdGFuZGFyZCBtZXRhZGF0YSBmb3JtYXQuCi0gICAgICogQHBhcmFtIG5hdGl2ZUltYWdlTWV0YWRhdGFGb3JtYXROYW1lIHRoZSBuYXRpdmUgaW1hZ2UgbWV0YWRhdGEgCi0gICAgICogZm9ybWF0IG5hbWUsIHJldHVybmVkIGJ5IGdldE5hdGl2ZUltYWdlTWV0YWRhdGFGb3JtYXROYW1lLgotICAgICAqIEBwYXJhbSBuYXRpdmVJbWFnZU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lIHRoZSBuYXRpdmUgaW1hZ2UKLSAgICAgKiBtZXRhZGF0YSBmb3JtYXQgY2xhc3MgbmFtZSwgcmV0dXJuZWQgYnkgZ2V0TmF0aXZlSW1hZ2VNZXRhZGF0YUZvcm1hdC4KLSAgICAgKiBAcGFyYW0gZXh0cmFJbWFnZU1ldGFkYXRhRm9ybWF0TmFtZXMgdGhlIGV4dHJhIGltYWdlIG1ldGFkYXRhIAotICAgICAqIGZvcm1hdCBuYW1lcywgcmV0dXJuZWQgYnkgZ2V0RXh0cmFJbWFnZU1ldGFkYXRhRm9ybWF0TmFtZXMuCi0gICAgICogQHBhcmFtIGV4dHJhSW1hZ2VNZXRhZGF0YUZvcm1hdENsYXNzTmFtZXMgdGhlIGV4dHJhIGltYWdlIG1ldGFkYXRhIAotICAgICAqIGZvcm1hdCBjbGFzcyBuYW1lcywgcmV0dXJuZWQgYnkgZ2V0SW1hZ2VNZXRhZGF0YUZvcm1hdC4KKyAgICAgKiBAcGFyYW0gdmVuZG9yTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHZlbmRvciBuYW1lLgorICAgICAqIEBwYXJhbSB2ZXJzaW9uCisgICAgICogICAgICAgICAgICB0aGUgdmVyc2lvbi4KKyAgICAgKiBAcGFyYW0gbmFtZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBmb3JtYXQgbmFtZXMuCisgICAgICogQHBhcmFtIHN1ZmZpeGVzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2Ygc3RyaW5ncyByZXByZXNlbnRpbmcgdGhlIGZpbGUgc3VmZml4ZXMuCisgICAgICogQHBhcmFtIE1JTUVUeXBlcworICAgICAqICAgICAgICAgICAgdGhlIGFuIGFycmF5IG9mIHN0cmluZ3MgcmVwcmVzZW50aW5nIE1JTUUgdHlwZXMuCisgICAgICogQHBhcmFtIHBsdWdpbkNsYXNzTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIHBsdWctaW4gY2xhc3MgbmFtZS4KKyAgICAgKiBAcGFyYW0gb3V0cHV0VHlwZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgdHlwZXMuCisgICAgICogQHBhcmFtIHJlYWRlclNwaU5hbWVzCisgICAgICogICAgICAgICAgICB0aGUgYXJyYXkgb2Ygc3RyaW5ncyB3aXRoIGNsYXNzIG5hbWVzIG9mIGFsbCBhc3NvY2lhdGVkCisgICAgICogICAgICAgICAgICBJbWFnZVJlYWRlcnMuCisgICAgICogQHBhcmFtIHN1cHBvcnRzU3RhbmRhcmRTdHJlYW1NZXRhZGF0YUZvcm1hdAorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIGluZGljYXRpbmcgaWYgc3RyZWFtIG1ldGFkYXRhIGNhbiBiZSBkZXNjcmliZWQgYnkKKyAgICAgKiAgICAgICAgICAgIHN0YW5kYXJkIG1ldGFkYXRhIGZvcm1hdC4KKyAgICAgKiBAcGFyYW0gbmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmF0aXZlIHN0cmVhbSBtZXRhZGF0YSBmb3JtYXQgbmFtZSwgcmV0dXJuZWQgYnkKKyAgICAgKiAgICAgICAgICAgIGdldE5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZS4KKyAgICAgKiBAcGFyYW0gbmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXRDbGFzc05hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYXRpdmUgc3RyZWFtIG1ldGFkYXRhIGZvcm1hdCBjbGFzcyBuYW1lLCByZXR1cm5lZCBieQorICAgICAqICAgICAgICAgICAgZ2V0TmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXQuCisgICAgICogQHBhcmFtIGV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lcworICAgICAqICAgICAgICAgICAgdGhlIGV4dHJhIHN0cmVhbSBtZXRhZGF0YSBmb3JtYXQgbmFtZXMsIHJldHVybmVkIGJ5CisgICAgICogICAgICAgICAgICBnZXRFeHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZXMuCisgICAgICogQHBhcmFtIGV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzCisgICAgICogICAgICAgICAgICB0aGUgZXh0cmEgc3RyZWFtIG1ldGFkYXRhIGZvcm1hdCBjbGFzcyBuYW1lcywgcmV0dXJuZWQgYnkKKyAgICAgKiAgICAgICAgICAgIGdldFN0cmVhbU1ldGFkYXRhRm9ybWF0LgorICAgICAqIEBwYXJhbSBzdXBwb3J0c1N0YW5kYXJkSW1hZ2VNZXRhZGF0YUZvcm1hdAorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIGluZGljYXRpbmcgaWYgaW1hZ2UgbWV0YWRhdGEgY2FuIGJlIGRlc2NyaWJlZCBieQorICAgICAqICAgICAgICAgICAgc3RhbmRhcmQgbWV0YWRhdGEgZm9ybWF0LgorICAgICAqIEBwYXJhbSBuYXRpdmVJbWFnZU1ldGFkYXRhRm9ybWF0TmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hdGl2ZSBpbWFnZSBtZXRhZGF0YSBmb3JtYXQgbmFtZSwgcmV0dXJuZWQgYnkKKyAgICAgKiAgICAgICAgICAgIGdldE5hdGl2ZUltYWdlTWV0YWRhdGFGb3JtYXROYW1lLgorICAgICAqIEBwYXJhbSBuYXRpdmVJbWFnZU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmF0aXZlIGltYWdlIG1ldGFkYXRhIGZvcm1hdCBjbGFzcyBuYW1lLCByZXR1cm5lZCBieQorICAgICAqICAgICAgICAgICAgZ2V0TmF0aXZlSW1hZ2VNZXRhZGF0YUZvcm1hdC4KKyAgICAgKiBAcGFyYW0gZXh0cmFJbWFnZU1ldGFkYXRhRm9ybWF0TmFtZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBleHRyYSBpbWFnZSBtZXRhZGF0YSBmb3JtYXQgbmFtZXMsIHJldHVybmVkIGJ5CisgICAgICogICAgICAgICAgICBnZXRFeHRyYUltYWdlTWV0YWRhdGFGb3JtYXROYW1lcy4KKyAgICAgKiBAcGFyYW0gZXh0cmFJbWFnZU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcworICAgICAqICAgICAgICAgICAgdGhlIGV4dHJhIGltYWdlIG1ldGFkYXRhIGZvcm1hdCBjbGFzcyBuYW1lcywgcmV0dXJuZWQgYnkKKyAgICAgKiAgICAgICAgICAgIGdldEltYWdlTWV0YWRhdGFGb3JtYXQuCiAgICAgICovCi0gICAgcHVibGljIEltYWdlV3JpdGVyU3BpKFN0cmluZyB2ZW5kb3JOYW1lLCBTdHJpbmcgdmVyc2lvbiwgU3RyaW5nW10gbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHN1ZmZpeGVzLCBTdHJpbmdbXSBNSU1FVHlwZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwbHVnaW5DbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzW10gb3V0cHV0VHlwZXMsIFN0cmluZ1tdIHJlYWRlclNwaU5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHN1cHBvcnRzU3RhbmRhcmRTdHJlYW1NZXRhZGF0YUZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hdGl2ZVN0cmVhbU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBleHRyYVN0cmVhbU1ldGFkYXRhRm9ybWF0TmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHN1cHBvcnRzU3RhbmRhcmRJbWFnZU1ldGFkYXRhRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmF0aXZlSW1hZ2VNZXRhZGF0YUZvcm1hdE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYXRpdmVJbWFnZU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBleHRyYUltYWdlTWV0YWRhdGFGb3JtYXROYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gZXh0cmFJbWFnZU1ldGFkYXRhRm9ybWF0Q2xhc3NOYW1lcykgeworICAgIHB1YmxpYyBJbWFnZVdyaXRlclNwaShTdHJpbmcgdmVuZG9yTmFtZSwgU3RyaW5nIHZlcnNpb24sIFN0cmluZ1tdIG5hbWVzLCBTdHJpbmdbXSBzdWZmaXhlcywKKyAgICAgICAgICAgIFN0cmluZ1tdIE1JTUVUeXBlcywgU3RyaW5nIHBsdWdpbkNsYXNzTmFtZSwgQ2xhc3NbXSBvdXRwdXRUeXBlcywKKyAgICAgICAgICAgIFN0cmluZ1tdIHJlYWRlclNwaU5hbWVzLCBib29sZWFuIHN1cHBvcnRzU3RhbmRhcmRTdHJlYW1NZXRhZGF0YUZvcm1hdCwKKyAgICAgICAgICAgIFN0cmluZyBuYXRpdmVTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWUsIFN0cmluZyBuYXRpdmVTdHJlYW1NZXRhZGF0YUZvcm1hdENsYXNzTmFtZSwKKyAgICAgICAgICAgIFN0cmluZ1tdIGV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lcywgU3RyaW5nW10gZXh0cmFTdHJlYW1NZXRhZGF0YUZvcm1hdENsYXNzTmFtZXMsCisgICAgICAgICAgICBib29sZWFuIHN1cHBvcnRzU3RhbmRhcmRJbWFnZU1ldGFkYXRhRm9ybWF0LCBTdHJpbmcgbmF0aXZlSW1hZ2VNZXRhZGF0YUZvcm1hdE5hbWUsCisgICAgICAgICAgICBTdHJpbmcgbmF0aXZlSW1hZ2VNZXRhZGF0YUZvcm1hdENsYXNzTmFtZSwgU3RyaW5nW10gZXh0cmFJbWFnZU1ldGFkYXRhRm9ybWF0TmFtZXMsCisgICAgICAgICAgICBTdHJpbmdbXSBleHRyYUltYWdlTWV0YWRhdGFGb3JtYXRDbGFzc05hbWVzKSB7CiAgICAgICAgIHN1cGVyKHZlbmRvck5hbWUsIHZlcnNpb24sIG5hbWVzLCBzdWZmaXhlcywgTUlNRVR5cGVzLCBwbHVnaW5DbGFzc05hbWUsCiAgICAgICAgICAgICAgICAgc3VwcG9ydHNTdGFuZGFyZFN0cmVhbU1ldGFkYXRhRm9ybWF0LCBuYXRpdmVTdHJlYW1NZXRhZGF0YUZvcm1hdE5hbWUsCiAgICAgICAgICAgICAgICAgbmF0aXZlU3RyZWFtTWV0YWRhdGFGb3JtYXRDbGFzc05hbWUsIGV4dHJhU3RyZWFtTWV0YWRhdGFGb3JtYXROYW1lcywKQEAgLTExMSw4ICsxMzQsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZm9ybWF0IG9mIHRoZSB3cml0ZXIncyBvdXRwdXQgaXMgbG9zc2xlc3MuIAotICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgdHJ1ZS4KKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGZvcm1hdCBvZiB0aGUgd3JpdGVyJ3Mgb3V0cHV0IGlzIGxvc3NsZXNzLiBUaGUKKyAgICAgKiBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgdHJ1ZS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGEgZm9ybWF0IGlzIGxvc3NsZXNzLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCkBAIC0xMjEsOCArMTQ0LDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIGFycmF5IG9mIENsYXNzIG9iamVjdHMgd2hvc2UgdHlwZXMgCi0gICAgICogY2FuIGJlIHVzZWQgYXMgb3V0cHV0IGZvciB0aGlzIHdyaXRlci4KKyAgICAgKiBHZXRzIGFuIGFycmF5IG9mIENsYXNzIG9iamVjdHMgd2hvc2UgdHlwZXMgY2FuIGJlIHVzZWQgYXMgb3V0cHV0IGZvciB0aGlzCisgICAgICogd3JpdGVyLgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIG91dHB1dCB0eXBlcy4KICAgICAgKi8KQEAgLTEzMSw3NyArMTU0LDcyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBJbWFnZVdyaXRlciBpbXBsZW1lbnRhdGlvbiBhc3NvY2lhdGVkIAotICAgICAqIHdpdGggdGhpcyBzZXJ2aWNlIHByb3ZpZGVyIGNhbiBlbmNvZGUgYW4gaW1hZ2Ugd2l0aCAKLSAgICAgKiB0aGUgc3BlY2lmaWVkIHR5cGUuCisgICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBJbWFnZVdyaXRlciBpbXBsZW1lbnRhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcworICAgICAqIHNlcnZpY2UgcHJvdmlkZXIgY2FuIGVuY29kZSBhbiBpbWFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgdHlwZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHlwZSB0aGUgSW1hZ2VUeXBlU3BlY2lmaWVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgYW4gaW1hZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHR5cGUgY2FuIGJlCi0gICAgICogZW5jb2RlZCwgZmFsc2Ugb3RoZXJ3aXNlLiAKKyAgICAgKiBAcGFyYW0gdHlwZQorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlVHlwZVNwZWNpZmllci4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGFuIGltYWdlIHdpdGggdGhlIHNwZWNpZmllZCB0eXBlIGNhbiBiZSBlbmNvZGVkLCBmYWxzZQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGNhbkVuY29kZUltYWdlKEltYWdlVHlwZVNwZWNpZmllciB0eXBlKTsKIAogICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgSW1hZ2VXcml0ZXIgaW1wbGVtZW50YXRpb24gYXNzb2NpYXRlZCAKLSAgICAgKiB3aXRoIHRoaXMgc2VydmljZSBwcm92aWRlciBjYW4gZW5jb2RlIHRoZSBzcGVjaWZpZWQgUmVuZGVyZWRJbWFnZS4KKyAgICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhlIEltYWdlV3JpdGVyIGltcGxlbWVudGF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgICAgICogc2VydmljZSBwcm92aWRlciBjYW4gZW5jb2RlIHRoZSBzcGVjaWZpZWQgUmVuZGVyZWRJbWFnZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW0gdGhlIFJlbmRlcmVkSW1hZ2UuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlLCBpZiBSZW5kZXJlZEltYWdlIGNhbiBiZSBlbmNvZGVkLCAKLSAgICAgKiBmYWxzZSBvdGhlcndpc2UuIAorICAgICAqIEBwYXJhbSBpbQorICAgICAqICAgICAgICAgICAgdGhlIFJlbmRlcmVkSW1hZ2UuCisgICAgICogQHJldHVybiB0cnVlLCBpZiBSZW5kZXJlZEltYWdlIGNhbiBiZSBlbmNvZGVkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY2FuRW5jb2RlSW1hZ2UoUmVuZGVyZWRJbWFnZSBpbSkgewogICAgICAgICByZXR1cm4gY2FuRW5jb2RlSW1hZ2UoSW1hZ2VUeXBlU3BlY2lmaWVyLmNyZWF0ZUZyb21SZW5kZXJlZEltYWdlKGltKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgSW1hZ2VXcml0ZXIgaW1wbGVtZW50YXRpb24gZm9yCi0gICAgICogdGhpcyBzZXJ2aWNlIHByb3ZpZGVyLgorICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIEltYWdlV3JpdGVyIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIHNlcnZpY2UKKyAgICAgKiBwcm92aWRlci4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBJbWFnZVdyaXRlci4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIEltYWdlV3JpdGVyIGNyZWF0ZVdyaXRlckluc3RhbmNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIGNyZWF0ZVdyaXRlckluc3RhbmNlKG51bGwpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIEltYWdlV3JpdGVyIGltcGxlbWVudGF0aW9uIGZvcgotICAgICAqIHRoaXMgc2VydmljZSBwcm92aWRlci4KKyAgICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSBJbWFnZVdyaXRlciBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyBzZXJ2aWNlCisgICAgICogcHJvdmlkZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGV4dGVuc2lvbiB0aGUgYSBwbHVnaW4gc3BlY2lmaWMgZXh0ZW5zaW9uIG9iamVjdCwgb3IgbnVsbC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gZXh0ZW5zaW9uCisgICAgICogICAgICAgICAgICB0aGUgYSBwbHVnLWluIHNwZWNpZmljIGV4dGVuc2lvbiBvYmplY3QsIG9yIG51bGwuCiAgICAgICogQHJldHVybiB0aGUgSW1hZ2VXcml0ZXIuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBJbWFnZVdyaXRlciBjcmVhdGVXcml0ZXJJbnN0YW5jZShPYmplY3QgZXh0ZW5zaW9uKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBJbWFnZVdyaXRlciBvYmplY3QgCi0gICAgICogaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIEltYWdlV3JpdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIAotICAgICAqIHNlcnZpY2UgcHJvdmlkZXIgb3Igbm90LgorICAgICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIEltYWdlV3JpdGVyIG9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZgorICAgICAqIHRoZSBJbWFnZVdyaXRlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXJ2aWNlIHByb3ZpZGVyIG9yIG5vdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gd3JpdGVyIHRoZSBJbWFnZVdyaXRlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgSW1hZ2VXcml0ZXIgb2JqZWN0IAotICAgICAqIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBJbWFnZVdyaXRlciBhc3NvY2lhdGVkIHdpdGggdGhpcyAKLSAgICAgKiBzZXJ2aWNlIHByb3ZpZGVyLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIHdyaXRlcgorICAgICAqICAgICAgICAgICAgdGhlIEltYWdlV3JpdGVyLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCBJbWFnZVdyaXRlciBvYmplY3QgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlCisgICAgICogICAgICAgICBJbWFnZVdyaXRlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXJ2aWNlIHByb3ZpZGVyLCBmYWxzZQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzT3duV3JpdGVyKEltYWdlV3JpdGVyIHdyaXRlcikgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbiBhcnJheSBvZiBzdHJpbmdzIHdpdGggbmFtZXMgb2YgdGhlIEltYWdlUmVhZGVyU3BpIAotICAgICAqIGNsYXNzZXMgdGhhdCBzdXBwb3J0IHRoZSBpbnRlcm5hbCBtZXRhZGF0YSByZXByZXNlbnRhdGlvbiAKLSAgICAgKiB1c2VkIGJ5IHRoZSBJbWFnZVdyaXRlciBvZiB0aGlzIHNlcnZpY2UgcHJvdmlkZXIsIG9yIG51bGwgaWYgCi0gICAgICogdGhlcmUgYXJlIG5vIHN1Y2ggSW1hZ2VSZWFkZXJzLgorICAgICAqIEdldHMgYW4gYXJyYXkgb2Ygc3RyaW5ncyB3aXRoIG5hbWVzIG9mIHRoZSBJbWFnZVJlYWRlclNwaSBjbGFzc2VzIHRoYXQKKyAgICAgKiBzdXBwb3J0IHRoZSBpbnRlcm5hbCBtZXRhZGF0YSByZXByZXNlbnRhdGlvbiB1c2VkIGJ5IHRoZSBJbWFnZVdyaXRlciBvZgorICAgICAqIHRoaXMgc2VydmljZSBwcm92aWRlciwgb3IgbnVsbCBpZiB0aGVyZSBhcmUgbm8gc3VjaCBJbWFnZVJlYWRlcnMuCiAgICAgICogCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiBzdHJpbmdzIHdpdGggbmFtZXMgb2YgdGhlIEltYWdlV3JpdGVyU3BpIAotICAgICAqIGNsYXNzZXMuCisgICAgICogQHJldHVybiB0aGUgYXJyYXkgb2Ygc3RyaW5ncyB3aXRoIG5hbWVzIG9mIHRoZSBJbWFnZVdyaXRlclNwaSBjbGFzc2VzLgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRJbWFnZVJlYWRlclNwaU5hbWVzKCkgewogICAgICAgICByZXR1cm4gcmVhZGVyU3BpTmFtZXM7CmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9zcGkvUmVnaXN0ZXJhYmxlU2VydmljZS5qYXZhIGIvYXd0L2phdmF4L2ltYWdlaW8vc3BpL1JlZ2lzdGVyYWJsZVNlcnZpY2UuamF2YQppbmRleCBiNTA3NTRlLi5hZTJmNGQzIDEwMDY0NAotLS0gYS9hd3QvamF2YXgvaW1hZ2Vpby9zcGkvUmVnaXN0ZXJhYmxlU2VydmljZS5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL3NwaS9SZWdpc3RlcmFibGVTZXJ2aWNlLmphdmEKQEAgLTE4LDMzICsxOCwzNyBAQAogICogQGF1dGhvciBSdXN0ZW0gVi4gUmFmaWtvdgogICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjMgJAogICovCisKIHBhY2thZ2UgamF2YXguaW1hZ2Vpby5zcGk7CiAKIC8qKgotICogVGhlIFJlZ2lzdGVyYWJsZVNlcnZpY2UgaW50ZXJmYWNlIHByb3ZpZGVzIHNlcnZpY2UgcHJvdmlkZXIgCi0gKiBvYmplY3RzIHRoYXQgY2FuIGJlIHJlZ2lzdGVyZWQgYnkgYSBTZXJ2aWNlUmVnaXN0cnksIGFuZCAKLSAqIG5vdGlmaWNhdGlvbnMgdGhhdCByZWdpc3RyYXRpb24gYW5kIGRlcmVnaXN0cmF0aW9uIGhhdmUgYmVlbgotICogcGVyZm9ybWVkLgorICogVGhlIFJlZ2lzdGVyYWJsZVNlcnZpY2UgaW50ZXJmYWNlIHByb3ZpZGVzIHNlcnZpY2UgcHJvdmlkZXIgb2JqZWN0cyB0aGF0IGNhbgorICogYmUgcmVnaXN0ZXJlZCBieSBhIFNlcnZpY2VSZWdpc3RyeSwgYW5kIG5vdGlmaWNhdGlvbnMgdGhhdCByZWdpc3RyYXRpb24gYW5kCisgKiBkZXJlZ2lzdHJhdGlvbiBoYXZlIGJlZW4gcGVyZm9ybWVkLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGludGVyZmFjZSBSZWdpc3RlcmFibGVTZXJ2aWNlIHsKLSAgICAKKwogICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBvYmplY3Qgd2hpY2ggaW1wbGVtZW50cyB0aGlzCi0gICAgICogaW50ZXJmYWNlIGlzIHJlZ2lzdGVyZWQgdG8gdGhlIHNwZWNpZmllZCBjYXRlZ29yeSBvZiB0aGUgCi0gICAgICogc3BlY2lmaWVkIHJlZ2lzdHJ5LgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBvYmplY3Qgd2hpY2ggaW1wbGVtZW50cyB0aGlzIGludGVyZmFjZSBpcworICAgICAqIHJlZ2lzdGVyZWQgdG8gdGhlIHNwZWNpZmllZCBjYXRlZ29yeSBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lzdHJ5LgogICAgICAqIAotICAgICAqIEBwYXJhbSByZWdpc3RyeSB0aGUgU2VydmljZVJlZ2lzdHJ5IHRvIGJlIHJlZ2lzdGVyZWQuCi0gICAgICogQHBhcmFtIGNhdGVnb3J5IHRoZSBjbGFzcyByZXByZXNlbnRpbmcgYSBjYXRlZ29yeS4KKyAgICAgKiBAcGFyYW0gcmVnaXN0cnkKKyAgICAgKiAgICAgICAgICAgIHRoZSBTZXJ2aWNlUmVnaXN0cnkgdG8gYmUgcmVnaXN0ZXJlZC4KKyAgICAgKiBAcGFyYW0gY2F0ZWdvcnkKKyAgICAgKiAgICAgICAgICAgIHRoZSBjbGFzcyByZXByZXNlbnRpbmcgYSBjYXRlZ29yeS4KICAgICAgKi8KICAgICB2b2lkIG9uUmVnaXN0cmF0aW9uKFNlcnZpY2VSZWdpc3RyeSByZWdpc3RyeSwgQ2xhc3M8Pz4gY2F0ZWdvcnkpOwotICAgIAorCiAgICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIG9iamVjdCB3aGljaCBpbXBsZW1lbnRzIHRoaXMKLSAgICAgKiBpbnRlcmZhY2UgaXMgZGVyZWdpc3RlcmVkIHRvIHRoZSBzcGVjaWZpZWQgY2F0ZWdvcnkgb2YgdGhlIAotICAgICAqIHNwZWNpZmllZCByZWdpc3RyeS4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgb2JqZWN0IHdoaWNoIGltcGxlbWVudHMgdGhpcyBpbnRlcmZhY2UgaXMKKyAgICAgKiBkZXJlZ2lzdGVyZWQgdG8gdGhlIHNwZWNpZmllZCBjYXRlZ29yeSBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lzdHJ5LgogICAgICAqIAotICAgICAqIEBwYXJhbSByZWdpc3RyeSB0aGUgU2VydmljZVJlZ2lzdHJ5IHRvIGJlIHJlZ2lzdGVyZWQuCi0gICAgICogQHBhcmFtIGNhdGVnb3J5IHRoZSBjbGFzcyByZXByZXNlbnRpbmcgYSBjYXRlZ29yeS4KKyAgICAgKiBAcGFyYW0gcmVnaXN0cnkKKyAgICAgKiAgICAgICAgICAgIHRoZSBTZXJ2aWNlUmVnaXN0cnkgdG8gYmUgcmVnaXN0ZXJlZC4KKyAgICAgKiBAcGFyYW0gY2F0ZWdvcnkKKyAgICAgKiAgICAgICAgICAgIHRoZSBjbGFzcyByZXByZXNlbnRpbmcgYSBjYXRlZ29yeS4KICAgICAgKi8KICAgICB2b2lkIG9uRGVyZWdpc3RyYXRpb24oU2VydmljZVJlZ2lzdHJ5IHJlZ2lzdHJ5LCBDbGFzczw/PiBjYXRlZ29yeSk7CiB9CmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9zcGkvU2VydmljZVJlZ2lzdHJ5LmphdmEgYi9hd3QvamF2YXgvaW1hZ2Vpby9zcGkvU2VydmljZVJlZ2lzdHJ5LmphdmEKaW5kZXggMWExOGIwMi4uNzliMDJhMyAxMDA2NDQKLS0tIGEvYXd0L2phdmF4L2ltYWdlaW8vc3BpL1NlcnZpY2VSZWdpc3RyeS5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL3NwaS9TZXJ2aWNlUmVnaXN0cnkuamF2YQpAQCAtMTgsNDggKzE4LDUzIEBACiAgKiBAYXV0aG9yIFJ1c3RlbSBWLiBSYWZpa292CiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMyAkCiAgKi8KKwogcGFja2FnZSBqYXZheC5pbWFnZWlvLnNwaTsKIAogaW1wb3J0IGphdmEudXRpbC4qOwogaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CiAKIC8qKgotICogVGhlIFNlcnZpY2VSZWdpc3RyeSBjbGFzcyBwcm92aWRlcyBhYmlsaXR5IHRvIHJlZ2lzdGVyLCAKLSAqIGRlcmVnaXN0ZXIsIGxvb2sgdXAgYW5kIG9idGFpbiBzZXJ2aWNlIHByb3ZpZGVyIGluc3RhbmNlcyAoU1BJcykuCi0gKiBBIHNlcnZpY2UgbWVhbnMgYSBzZXQgb2YgaW50ZXJmYWNlcyBhbmQgY2xhc3NlcywgYW5kIGEgc2VydmljZSAKLSAqIHByb3ZpZGVyIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIGEgc2VydmljZS4gU2VydmljZSBwcm92aWRlcnMgY2FuIAotICogYmUgYXNzb2NpYXRlZCB3aXRoIG9uZSBvciBtb3JlIGNhdGVnb3JpZXMuIEVhY2ggY2F0ZWdvcnkgaXMgZGVmaW5lZCAKLSAqIGJ5IGEgY2xhc3Mgb3IgaW50ZXJmYWNlLiBPbmx5IGEgc2luZ2xlIGluc3RhbmNlIG9mIGEgZWFjaCBjbGFzcyBpcyAKLSAqIGFsbG93ZWQgdG8gYmUgcmVnaXN0ZXJlZCBhcyBhIGNhdGVnb3J5LiAKKyAqIFRoZSBTZXJ2aWNlUmVnaXN0cnkgY2xhc3MgcHJvdmlkZXMgYWJpbGl0eSB0byByZWdpc3RlciwgZGVyZWdpc3RlciwgbG9vayB1cAorICogYW5kIG9idGFpbiBzZXJ2aWNlIHByb3ZpZGVyIGluc3RhbmNlcyAoU1BJcykuIEEgc2VydmljZSBtZWFucyBhIHNldCBvZgorICogaW50ZXJmYWNlcyBhbmQgY2xhc3NlcywgYW5kIGEgc2VydmljZSBwcm92aWRlciBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBhCisgKiBzZXJ2aWNlLiBTZXJ2aWNlIHByb3ZpZGVycyBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIG9uZSBvciBtb3JlIGNhdGVnb3JpZXMuCisgKiBFYWNoIGNhdGVnb3J5IGlzIGRlZmluZWQgYnkgYSBjbGFzcyBvciBpbnRlcmZhY2UuIE9ubHkgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgYQorICogZWFjaCBjbGFzcyBpcyBhbGxvd2VkIHRvIGJlIHJlZ2lzdGVyZWQgYXMgYSBjYXRlZ29yeS4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBTZXJ2aWNlUmVnaXN0cnkgewogCi0gICAgLyoqIFRoZSBjYXRlZ29yaWVzLiAqLworICAgIC8qKgorICAgICAqIFRoZSBjYXRlZ29yaWVzLgorICAgICAqLwogICAgIENhdGVnb3JpZXNNYXAgY2F0ZWdvcmllcyA9IG5ldyBDYXRlZ29yaWVzTWFwKHRoaXMpOwogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IFNlcnZpY2VSZWdpc3RyeSB3aXRoIHRoZSBzcGVjaWZpZWQgY2F0ZWdvcmllcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2F0ZWdvcmllc0l0ZXJhdG9yIGFuIEl0ZXJhdG9yIG9mIENsYXNzIG9iamVjdHMgCi0gICAgICogZm9yIGRlZmluaW5nIG9mIGNhdGVnb3JpZXMuCisgICAgICogQHBhcmFtIGNhdGVnb3JpZXNJdGVyYXRvcgorICAgICAqICAgICAgICAgICAgYW4gSXRlcmF0b3Igb2YgQ2xhc3Mgb2JqZWN0cyBmb3IgZGVmaW5pbmcgb2YgY2F0ZWdvcmllcy4KICAgICAgKi8KICAgICBwdWJsaWMgU2VydmljZVJlZ2lzdHJ5KEl0ZXJhdG9yPENsYXNzPD8+PiBjYXRlZ29yaWVzSXRlcmF0b3IpIHsKICAgICAgICAgaWYgKG51bGwgPT0gY2F0ZWdvcmllc0l0ZXJhdG9yKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYXRlZ29yaWVzIGl0ZXJhdG9yIHNob3VsZCBub3QgYmUgTlVMTCIpOwogICAgICAgICB9Ci0gICAgICAgIHdoaWxlKGNhdGVnb3JpZXNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIENsYXNzPD8+IGMgPSAgY2F0ZWdvcmllc0l0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgd2hpbGUgKGNhdGVnb3JpZXNJdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIENsYXNzPD8+IGMgPSBjYXRlZ29yaWVzSXRlcmF0b3IubmV4dCgpOwogICAgICAgICAgICAgY2F0ZWdvcmllcy5hZGRDYXRlZ29yeShjKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIExvb2tzIHVwIGFuZCBpbnN0YW50aWF0ZXMgdGhlIGF2YWlsYWJsZSBwcm92aWRlcnMgb2YgdGhpcyBzZXJ2aWNlIHVzaW5nIAorICAgICAqIExvb2tzIHVwIGFuZCBpbnN0YW50aWF0ZXMgdGhlIGF2YWlsYWJsZSBwcm92aWRlcnMgb2YgdGhpcyBzZXJ2aWNlIHVzaW5nCiAgICAgICogdGhlIHNwZWNpZmllZCBjbGFzcyBsb2FkZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHByb3ZpZGVyQ2xhc3MgdGhlIENsYXNzIG9iamVjdCBvZiB0aGUgcHJvdmlkZXIgdG8gYmUgbG9va2VkIHVwLgotICAgICAqIEBwYXJhbSBsb2FkZXIgdGhlIGNsYXNzIGxvYWRlciB0byBiZSB1c2VkLgotICAgICAqIAorICAgICAqIEBwYXJhbSBwcm92aWRlckNsYXNzCisgICAgICogICAgICAgICAgICB0aGUgQ2xhc3Mgb2JqZWN0IG9mIHRoZSBwcm92aWRlciB0byBiZSBsb29rZWQgdXAuCisgICAgICogQHBhcmFtIGxvYWRlcgorICAgICAqICAgICAgICAgICAgdGhlIGNsYXNzIGxvYWRlciB0byBiZSB1c2VkLgogICAgICAqIEByZXR1cm4gdGhlIGl0ZXJhdG9yIG9mIHByb3ZpZGVycyBvYmplY3RzIGZvciB0aGlzIHNlcnZpY2UuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyA8VD4gSXRlcmF0b3I8VD4gbG9va3VwUHJvdmlkZXJzKENsYXNzPFQ+IHByb3ZpZGVyQ2xhc3MsIENsYXNzTG9hZGVyIGxvYWRlcikgewpAQCAtNjcsMTEgKzcyLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogTG9va3MgdXAgYW5kIGluc3RhbnRpYXRlcyB0aGUgYXZhaWxhYmxlIHByb3ZpZGVycyBvZiB0aGlzIHNlcnZpY2UgdXNpbmcgCisgICAgICogTG9va3MgdXAgYW5kIGluc3RhbnRpYXRlcyB0aGUgYXZhaWxhYmxlIHByb3ZpZGVycyBvZiB0aGlzIHNlcnZpY2UgdXNpbmcKICAgICAgKiB0aGUgY29udGV4dCBjbGFzcyBsb2FkZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIHByb3ZpZGVyQ2xhc3MgdGhlIENsYXNzIG9iamVjdCBvZiB0aGUgcHJvdmlkZXIgdG8gYmUgbG9va2VkIHVwLgotICAgICAqIAorICAgICAqIEBwYXJhbSBwcm92aWRlckNsYXNzCisgICAgICogICAgICAgICAgICB0aGUgQ2xhc3Mgb2JqZWN0IG9mIHRoZSBwcm92aWRlciB0byBiZSBsb29rZWQgdXAuCiAgICAgICogQHJldHVybiB0aGUgaXRlcmF0b3Igb2YgcHJvdmlkZXJzIG9iamVjdHMgZm9yIHRoaXMgc2VydmljZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIDxUPiBJdGVyYXRvcjxUPiBsb29rdXBQcm92aWRlcnMoQ2xhc3M8VD4gcHJvdmlkZXJDbGFzcykgewpAQCAtNzksMTQgKzg0LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVnaXN0ZXJzIHRoZSBzcGVjaWZpZWQgc2VydmljZSBwcm92aWRlciBvYmplY3QgaW4gdGhlCi0gICAgICogc3BlY2lmaWVkIGNhdGVnb3JpZXMuCisgICAgICogUmVnaXN0ZXJzIHRoZSBzcGVjaWZpZWQgc2VydmljZSBwcm92aWRlciBvYmplY3QgaW4gdGhlIHNwZWNpZmllZAorICAgICAqIGNhdGVnb3JpZXMuCiAgICAgICogCi0gICAgICogQHBhcmFtIHByb3ZpZGVyIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIgdG8gYmUgcmVnaXN0ZXJlZC4KLSAgICAgKiBAcGFyYW0gY2F0ZWdvcnkgdGhlIGNhdGVnb3J5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBubyBwcm92aWRlciBvZiB0aGUgc2FtZSBjbGFzcyBpcyByZWdpc3RlcmVkIAotICAgICAqIGluIHRoaXMgY2F0ZWdvcnksIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcGFyYW0gcHJvdmlkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIgdG8gYmUgcmVnaXN0ZXJlZC4KKyAgICAgKiBAcGFyYW0gY2F0ZWdvcnkKKyAgICAgKiAgICAgICAgICAgIHRoZSBjYXRlZ29yeS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIG5vIHByb3ZpZGVyIG9mIHRoZSBzYW1lIGNsYXNzIGlzIHJlZ2lzdGVyZWQgaW4gdGhpcworICAgICAqICAgICAgICAgY2F0ZWdvcnksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgPFQ+IGJvb2xlYW4gcmVnaXN0ZXJTZXJ2aWNlUHJvdmlkZXIoVCBwcm92aWRlciwgQ2xhc3M8VD4gY2F0ZWdvcnkpIHsKICAgICAgICAgcmV0dXJuIGNhdGVnb3JpZXMuYWRkUHJvdmlkZXIocHJvdmlkZXIsIGNhdGVnb3J5KTsKQEAgLTk1LDcgKzEwMSw4IEBACiAgICAgLyoqCiAgICAgICogUmVnaXN0ZXJzIGEgbGlzdCBvZiBzZXJ2aWNlIHByb3ZpZGVycy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvdmlkZXJzIHRoZSBsaXN0IG9mIHNlcnZpY2UgcHJvdmlkZXJzLgorICAgICAqIEBwYXJhbSBwcm92aWRlcnMKKyAgICAgKiAgICAgICAgICAgIHRoZSBsaXN0IG9mIHNlcnZpY2UgcHJvdmlkZXJzLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyU2VydmljZVByb3ZpZGVycyhJdGVyYXRvcjw/PiBwcm92aWRlcnMpIHsKICAgICAgICAgZm9yIChJdGVyYXRvcjw/PiBpdGVyYXRvciA9IHByb3ZpZGVyczsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewpAQCAtMTA0LDY3ICsxMTEsNzAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWdpc3RlcnMgdGhlIHNwZWNpZmllZCBzZXJ2aWNlIHByb3ZpZGVyIG9iamVjdCBpbiBhbGwKLSAgICAgKiBjYXRlZ29yaWVzLgorICAgICAqIFJlZ2lzdGVycyB0aGUgc3BlY2lmaWVkIHNlcnZpY2UgcHJvdmlkZXIgb2JqZWN0IGluIGFsbCBjYXRlZ29yaWVzLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwcm92aWRlciB0aGUgc2VydmljZSBwcm92aWRlci4KKyAgICAgKiBAcGFyYW0gcHJvdmlkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZXJ2aWNlIHByb3ZpZGVyLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyU2VydmljZVByb3ZpZGVyKE9iamVjdCBwcm92aWRlcikgewogICAgICAgICBjYXRlZ29yaWVzLmFkZFByb3ZpZGVyKHByb3ZpZGVyLCBudWxsKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBEZXJlZ2lzdGVycyB0aGUgc3BlY2lmaWVzIHNlcnZpY2UgcHJvdmlkZXIgZnJvbSB0aGUKLSAgICAgKiBzcGVjaWZpZWQgY2F0ZWdvcnkuCisgICAgICogRGVyZWdpc3RlcnMgdGhlIHNwZWNpZmllcyBzZXJ2aWNlIHByb3ZpZGVyIGZyb20gdGhlIHNwZWNpZmllZCBjYXRlZ29yeS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvdmlkZXIgdGhlIHNlcnZpY2UgcHJvdmlkZXIgdG8gYmUgZGVyZWdpc3RlcmVkLgotICAgICAqIEBwYXJhbSBjYXRlZ29yeSB0aGUgc3BlY2lmaWVkIGNhdGVnb3J5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcHJvdmlkZXIgd2FzIGFscmVhZHkgcmVnaXN0ZXJlZCAKLSAgICAgKiBpbiB0aGUgc3BlY2lmaWVkIGNhdGVnb3J5LCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIHByb3ZpZGVyCisgICAgICogICAgICAgICAgICB0aGUgc2VydmljZSBwcm92aWRlciB0byBiZSBkZXJlZ2lzdGVyZWQuCisgICAgICogQHBhcmFtIGNhdGVnb3J5CisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGNhdGVnb3J5LgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHByb3ZpZGVyIHdhcyBhbHJlYWR5IHJlZ2lzdGVyZWQgaW4gdGhlIHNwZWNpZmllZAorICAgICAqICAgICAgICAgY2F0ZWdvcnksIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgPFQ+IGJvb2xlYW4gZGVyZWdpc3RlclNlcnZpY2VQcm92aWRlcihUIHByb3ZpZGVyLCBDbGFzczxUPiBjYXRlZ29yeSkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRGVyZWdpc3RlcnMgdGhlIHNwZWNpZmllZCBzZXJ2aWNlIHByb3ZpZGVyIGZyb20gYWxsCi0gICAgICogY2F0ZWdvcmllcy4KKyAgICAgKiBEZXJlZ2lzdGVycyB0aGUgc3BlY2lmaWVkIHNlcnZpY2UgcHJvdmlkZXIgZnJvbSBhbGwgY2F0ZWdvcmllcy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvdmlkZXIgdGhlIHNwZWNpZmllZCBzZXJ2aWNlIHByb3ZpZGVyLgorICAgICAqIEBwYXJhbSBwcm92aWRlcgorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBzZXJ2aWNlIHByb3ZpZGVyLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRlcmVnaXN0ZXJTZXJ2aWNlUHJvdmlkZXIoT2JqZWN0IHByb3ZpZGVyKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIEl0ZXJhdG9yIG9mIHJlZ2lzdGVyZWQgc2VydmljZSBwcm92aWRlcnMKLSAgICAgKiBpbiB0aGUgc3BlY2lmaWVkIGNhdGVnb3J5IHdoaWNoIHNhdGlzZnkgdGhlIHNwZWNpZmllZCBGaWx0ZXIuIAotICAgICAqIFRoZSB1c2VPcmRlcmluZyBwYXJhbWV0ZXIgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGl0ZXJhdG9yIHdpbGwgCi0gICAgICogcmV0dXJuIGFsbCBvZiB0aGUgc2VydmVyIHByb3ZpZGVyIG9iamVjdHMgaW4gYSBzZXQgb3JkZXIuIAorICAgICAqIEdldHMgYW4gSXRlcmF0b3Igb2YgcmVnaXN0ZXJlZCBzZXJ2aWNlIHByb3ZpZGVycyBpbiB0aGUgc3BlY2lmaWVkCisgICAgICogY2F0ZWdvcnkgd2hpY2ggc2F0aXNmeSB0aGUgc3BlY2lmaWVkIEZpbHRlci4gVGhlIHVzZU9yZGVyaW5nIHBhcmFtZXRlcgorICAgICAqIGluZGljYXRlcyB3aGV0aGVyIHRoZSBpdGVyYXRvciB3aWxsIHJldHVybiBhbGwgb2YgdGhlIHNlcnZlciBwcm92aWRlcgorICAgICAqIG9iamVjdHMgaW4gYSBzZXQgb3JkZXIuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNhdGVnb3J5IHRoZSBzcGVjaWZpZWQgY2F0ZWdvcnkuCi0gICAgICogQHBhcmFtIGZpbHRlciB0aGUgc3BlY2lmaWVkIGZpbHRlci4KLSAgICAgKiBAcGFyYW0gdXNlT3JkZXJpbmcgdGhlIGZsYWcgaW5kaWNhdGluZyB0aGF0IHByb3ZpZGVycyBhcmUgb3JkZXJlZAotICAgICAqIGluIHRoZSByZXR1cm5lZCBJdGVyYXRvci4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2F0ZWdvcnkKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgY2F0ZWdvcnkuCisgICAgICogQHBhcmFtIGZpbHRlcgorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBmaWx0ZXIuCisgICAgICogQHBhcmFtIHVzZU9yZGVyaW5nCisgICAgICogICAgICAgICAgICB0aGUgZmxhZyBpbmRpY2F0aW5nIHRoYXQgcHJvdmlkZXJzIGFyZSBvcmRlcmVkIGluIHRoZSByZXR1cm5lZAorICAgICAqICAgICAgICAgICAgSXRlcmF0b3IuCiAgICAgICogQHJldHVybiB0aGUgaXRlcmF0b3Igb2YgcmVnaXN0ZXJlZCBzZXJ2aWNlIHByb3ZpZGVycy4KICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgPFQ+IEl0ZXJhdG9yPFQ+IGdldFNlcnZpY2VQcm92aWRlcnMoQ2xhc3M8VD4gY2F0ZWdvcnksIEZpbHRlciBmaWx0ZXIsIGJvb2xlYW4gdXNlT3JkZXJpbmcpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWx0ZXJlZEl0ZXJhdG9yPFQ+KGZpbHRlciwgKEl0ZXJhdG9yPFQ+KWNhdGVnb3JpZXMuZ2V0UHJvdmlkZXJzKGNhdGVnb3J5LCB1c2VPcmRlcmluZykpOworICAgICAgICByZXR1cm4gbmV3IEZpbHRlcmVkSXRlcmF0b3I8VD4oZmlsdGVyLCAoSXRlcmF0b3I8VD4pY2F0ZWdvcmllcy5nZXRQcm92aWRlcnMoY2F0ZWdvcnksCisgICAgICAgICAgICAgICAgdXNlT3JkZXJpbmcpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGFuIEl0ZXJhdG9yIG9mIGFsbCByZWdpc3RlcmVkIHNlcnZpY2UgcHJvdmlkZXJzCi0gICAgICogaW4gdGhlIHNwZWNpZmllZCBjYXRlZ29yeS4gVGhlIHVzZU9yZGVyaW5nIHBhcmFtZXRlcgotICAgICAqIGluZGljYXRlcyB3aGV0aGVyIHRoZSBpdGVyYXRvciB3aWxsIHJldHVybiBhbGwgb2YgdGhlIHNlcnZlciAKLSAgICAgKiBwcm92aWRlciBvYmplY3RzIGluIGEgc2V0IG9yZGVyLiAKKyAgICAgKiBHZXRzIGFuIEl0ZXJhdG9yIG9mIGFsbCByZWdpc3RlcmVkIHNlcnZpY2UgcHJvdmlkZXJzIGluIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBjYXRlZ29yeS4gVGhlIHVzZU9yZGVyaW5nIHBhcmFtZXRlciBpbmRpY2F0ZXMgd2hldGhlciB0aGUgaXRlcmF0b3Igd2lsbAorICAgICAqIHJldHVybiBhbGwgb2YgdGhlIHNlcnZlciBwcm92aWRlciBvYmplY3RzIGluIGEgc2V0IG9yZGVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBjYXRlZ29yeSB0aGUgc3BlY2lmaWVkIGNhdGVnb3J5LgotICAgICAqIEBwYXJhbSB1c2VPcmRlcmluZyB0aGUgZmxhZyBpbmRpY2F0aW5nIHRoYXQgcHJvdmlkZXJzIGFyZSBvcmRlcmVkCi0gICAgICogaW4gdGhlIHJldHVybmVkIEl0ZXJhdG9yLgotICAgICAqIAorICAgICAqIEBwYXJhbSBjYXRlZ29yeQorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBjYXRlZ29yeS4KKyAgICAgKiBAcGFyYW0gdXNlT3JkZXJpbmcKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbGFnIGluZGljYXRpbmcgdGhhdCBwcm92aWRlcnMgYXJlIG9yZGVyZWQgaW4gdGhlIHJldHVybmVkCisgICAgICogICAgICAgICAgICBJdGVyYXRvci4KICAgICAgKiBAcmV0dXJuIHRoZSBJdGVyYXRvciBvZiBzZXJ2aWNlIHByb3ZpZGVycy4KICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKQEAgLTE3MywxMSArMTgzLDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgcmVnaXN0ZXJlZCBzZXJ2aWNlIHByb3ZpZGVyIG9iamVjdCB0aGF0IGhhcyB0aGUgCi0gICAgICogc3BlY2lmaWVkIGNsYXNzIHR5cGUuCisgICAgICogR2V0cyB0aGUgcmVnaXN0ZXJlZCBzZXJ2aWNlIHByb3ZpZGVyIG9iamVjdCB0aGF0IGhhcyB0aGUgc3BlY2lmaWVkIGNsYXNzCisgICAgICogdHlwZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvdmlkZXJDbGFzcyB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyIGNsYXNzLgotICAgICAqIAorICAgICAqIEBwYXJhbSBwcm92aWRlckNsYXNzCisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyIGNsYXNzLgogICAgICAqIEByZXR1cm4gdGhlIHNlcnZpY2UgcHJvdmlkZXIgb2JqZWN0LgogICAgICAqLwogICAgIHB1YmxpYyA8VD4gVCBnZXRTZXJ2aWNlUHJvdmlkZXJCeUNsYXNzKENsYXNzPFQ+IHByb3ZpZGVyQ2xhc3MpIHsKQEAgLTE4NSwyOCArMTk1LDMyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyBhbiBvcmRlcmluZyBiZXR3ZWVuIHR3byBzZXJ2aWNlIHByb3ZpZGVyIG9iamVjdHMgCi0gICAgICogd2l0aGluIHRoZSBzcGVjaWZpZWQgY2F0ZWdvcnkuIAorICAgICAqIFNldHMgYW4gb3JkZXJpbmcgYmV0d2VlbiB0d28gc2VydmljZSBwcm92aWRlciBvYmplY3RzIHdpdGhpbiB0aGUKKyAgICAgKiBzcGVjaWZpZWQgY2F0ZWdvcnkuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNhdGVnb3J5IHRoZSBzcGVjaWZpZWQgY2F0ZWdvcnkuCi0gICAgICogQHBhcmFtIGZpcnN0UHJvdmlkZXIgdGhlIGZpcnN0IHByb3ZpZGVyLgotICAgICAqIEBwYXJhbSBzZWNvbmRQcm92aWRlciB0aGUgc2Vjb25kIHByb3ZpZGVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhIHByZXZpb3VzbHkgdW5zZXQgb3JkZXIgd2FzIHNldC4KKyAgICAgKiBAcGFyYW0gY2F0ZWdvcnkKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgY2F0ZWdvcnkuCisgICAgICogQHBhcmFtIGZpcnN0UHJvdmlkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBwcm92aWRlci4KKyAgICAgKiBAcGFyYW0gc2Vjb25kUHJvdmlkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgcHJvdmlkZXIuCisgICAgICogQHJldHVybiB0cnVlLCBpZiBhIHByZXZpb3VzbHkgdW5zZXQgb3JkZXIgd2FzIHNldC4KICAgICAgKi8KICAgICBwdWJsaWMgPFQ+IGJvb2xlYW4gc2V0T3JkZXJpbmcoQ2xhc3M8VD4gY2F0ZWdvcnksIFQgZmlyc3RQcm92aWRlciwgVCBzZWNvbmRQcm92aWRlcikgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVW5zZXRzIGFuIG9yZGVyaW5nIGJldHdlZW4gdHdvIHNlcnZpY2UgcHJvdmlkZXIgb2JqZWN0cyAKLSAgICAgKiB3aXRoaW4gdGhlIHNwZWNpZmllZCBjYXRlZ29yeS4KKyAgICAgKiBVbnNldHMgYW4gb3JkZXJpbmcgYmV0d2VlbiB0d28gc2VydmljZSBwcm92aWRlciBvYmplY3RzIHdpdGhpbiB0aGUKKyAgICAgKiBzcGVjaWZpZWQgY2F0ZWdvcnkuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNhdGVnb3J5IHRoZSBzcGVjaWZpZWQgY2F0ZWdvcnkuCi0gICAgICogQHBhcmFtIGZpcnN0UHJvdmlkZXIgdGhlIGZpcnN0IHByb3ZpZGVyLgotICAgICAqIEBwYXJhbSBzZWNvbmRQcm92aWRlciB0aGUgc2Vjb25kIHByb3ZpZGVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhIHByZXZpb3VzbHkgdW5zZXQgb3JkZXIgd2FzIHJlbW92ZWQuCisgICAgICogQHBhcmFtIGNhdGVnb3J5CisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGNhdGVnb3J5LgorICAgICAqIEBwYXJhbSBmaXJzdFByb3ZpZGVyCisgICAgICogICAgICAgICAgICB0aGUgZmlyc3QgcHJvdmlkZXIuCisgICAgICogQHBhcmFtIHNlY29uZFByb3ZpZGVyCisgICAgICogICAgICAgICAgICB0aGUgc2Vjb25kIHByb3ZpZGVyLgorICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgYSBwcmV2aW91c2x5IHVuc2V0IG9yZGVyIHdhcyByZW1vdmVkLgogICAgICAqLwogICAgIHB1YmxpYyA8VD4gYm9vbGVhbiB1bnNldE9yZGVyaW5nKENsYXNzPFQ+IGNhdGVnb3J5LCBUIGZpcnN0UHJvdmlkZXIsIFQgc2Vjb25kUHJvdmlkZXIpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIHlldCIpOwpAQCAtMjE1LDcgKzIyOSw4IEBACiAgICAgLyoqCiAgICAgICogRGVyZWdpc3RlcnMgYWxsIHByb3ZpZGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgY2F0ZWdvcnkuCiAgICAgICogCi0gICAgICogQHBhcmFtIGNhdGVnb3J5IHRoZSBzcGVjaWZpZWQgY2F0ZWdvcnkuCisgICAgICogQHBhcmFtIGNhdGVnb3J5CisgICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIGNhdGVnb3J5LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRlcmVnaXN0ZXJBbGwoQ2xhc3M8Pz4gY2F0ZWdvcnkpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIHlldCIpOwpAQCAtMjI5LDMyICsyNDQsMzEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBGaW5hbGl6ZXMgdGhpcyBvYmplY3QuIAorICAgICAqIEZpbmFsaXplcyB0aGlzIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAdGhyb3dzIFRocm93YWJsZSB0aHJvd3MgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyAKLSAgICAgKiBmaW5hbGl6YXRpb24uCisgICAgICogQHRocm93cyBUaHJvd2FibGUKKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIGZpbmFsaXphdGlvbi4KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAvL1RPRE8gdW5jb21tZW50IHdoZW4gZGVyZWdpc3RlckFsbCBpcyBpbXBsZW1lbnRlZAotICAgICAgICAvL2RlcmVnaXN0ZXJBbGwoKTsKKyAgICAgICAgLy8gVE9ETyB1bmNvbW1lbnQgd2hlbiBkZXJlZ2lzdGVyQWxsIGlzIGltcGxlbWVudGVkCisgICAgICAgIC8vIGRlcmVnaXN0ZXJBbGwoKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyIGhhcyBiZWVuIGFscmVhZHkgcmVnaXN0ZXJlZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvdmlkZXIgdGhlIHByb3ZpZGVyIHRvIGJlIGNoZWNrZWQuCi0gICAgICogCisgICAgICogQHBhcmFtIHByb3ZpZGVyCisgICAgICogICAgICAgICAgICB0aGUgcHJvdmlkZXIgdG8gYmUgY2hlY2tlZC4KICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcGVjaWZpZWQgcHJvdmlkZXIgaGFzIGJlZW4gYWxyZWFkeSByZWdpc3RlcmVkLAotICAgICAqIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgcHJvdmlkZXIpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIHlldCIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYW4gaXRlcmF0b3Igb2YgQ2xhc3Mgb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgCi0gICAgICogY2F0ZWdvcmllcy4KKyAgICAgKiBHZXRzIGFuIGl0ZXJhdG9yIG9mIENsYXNzIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IGNhdGVnb3JpZXMuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgSXRlcmF0b3Igb2YgQ2xhc3Mgb2JqZWN0cy4KICAgICAgKi8KQEAgLTI2MywyMCArMjc3LDIyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhlIFNlcnZpY2VSZWdpc3RyeS5GaWx0ZXIgaW50ZXJmYWNlIGlzIHVzZWQgYnkgCi0gICAgICogU2VydmljZVJlZ2lzdHJ5LmdldFNlcnZpY2VQcm92aWRlcnMgdG8gZmlsdGVyIHByb3ZpZGVycyBhY2NvcmRpbmcKLSAgICAgKiB0byB0aGUgc3BlY2lmaWVkIGNyaXRlcmlvbi4gCisgICAgICogVGhlIFNlcnZpY2VSZWdpc3RyeS5GaWx0ZXIgaW50ZXJmYWNlIGlzIHVzZWQgYnkKKyAgICAgKiBTZXJ2aWNlUmVnaXN0cnkuZ2V0U2VydmljZVByb3ZpZGVycyB0byBmaWx0ZXIgcHJvdmlkZXJzIGFjY29yZGluZyB0byB0aGUKKyAgICAgKiBzcGVjaWZpZWQgY3JpdGVyaW9uLgorICAgICAqIAorICAgICAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEZpbHRlciB7Ci0gICAgICAgIAorCiAgICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBwcm92aWRlciBzYXRpc2ZpZXMgdGhlIAotICAgICAgICAgKiBjcml0ZXJpb24gb2YgdGhpcyBGaWx0ZXIuCisgICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyIHNhdGlzZmllcyB0aGUgY3JpdGVyaW9uIG9mCisgICAgICAgICAqIHRoaXMgRmlsdGVyLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHByb3ZpZGVyIHRoZSBwcm92aWRlci4KLSAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyIHNhdGlzZmllcyB0aGUgCi0gICAgICAgICAqIGNyaXRlcmlvbiBvZiB0aGlzIEZpbHRlciwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICAgKiBAcGFyYW0gcHJvdmlkZXIKKyAgICAgICAgICogICAgICAgICAgICB0aGUgcHJvdmlkZXIuCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIHNwZWNpZmllZCBwcm92aWRlciBzYXRpc2ZpZXMgdGhlIGNyaXRlcmlvbiBvZgorICAgICAgICAgKiAgICAgICAgIHRoaXMgRmlsdGVyLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICAqLwogICAgICAgICBib29sZWFuIGZpbHRlcihPYmplY3QgcHJvdmlkZXIpOwogICAgIH0KQEAgLTI4NSwzMCArMzAxLDM2IEBACiAgICAgICogVGhlIENsYXNzIENhdGVnb3JpZXNNYXAuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2F0ZWdvcmllc01hcCB7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIGNhdGVnb3JpZXMuICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjYXRlZ29yaWVzLgorICAgICAgICAgKi8KICAgICAgICAgTWFwPENsYXNzPD8+LCBQcm92aWRlcnNNYXA+IGNhdGVnb3JpZXMgPSBuZXcgSGFzaE1hcDxDbGFzczw/PiwgUHJvdmlkZXJzTWFwPigpOwogCi0gICAgICAgIC8qKiBUaGUgcmVnaXN0cnkuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcmVnaXN0cnkuCisgICAgICAgICAqLwogICAgICAgICBTZXJ2aWNlUmVnaXN0cnkgcmVnaXN0cnk7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBjYXRlZ29yaWVzIG1hcC4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSByZWdpc3RyeSB0aGUgcmVnaXN0cnkKKyAgICAgICAgICogQHBhcmFtIHJlZ2lzdHJ5CisgICAgICAgICAqICAgICAgICAgICAgdGhlIHJlZ2lzdHJ5LgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIENhdGVnb3JpZXNNYXAoU2VydmljZVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7CiAgICAgICAgICAgICB0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7CiAgICAgICAgIH0KIAotICAgICAgICAvLy0tIFRPRE86IHVzZU9yZGVyaW5nCisgICAgICAgIC8vIC0tIFRPRE86IHVzZU9yZGVyaW5nCiAgICAgICAgIC8qKgogICAgICAgICAgKiBHZXRzIHRoZSBwcm92aWRlcnMuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gY2F0ZWdvcnkgdGhlIGNhdGVnb3J5Ci0gICAgICAgICAqIEBwYXJhbSB1c2VPcmRlcmluZyB0aGUgdXNlIG9yZGVyaW5nCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBwcm92aWRlcnMKKyAgICAgICAgICogQHBhcmFtIGNhdGVnb3J5CisgICAgICAgICAqICAgICAgICAgICAgdGhlIGNhdGVnb3J5LgorICAgICAgICAgKiBAcGFyYW0gdXNlT3JkZXJpbmcKKyAgICAgICAgICogICAgICAgICAgICB0aGUgdXNlIG9yZGVyaW5nLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBwcm92aWRlcnMuCiAgICAgICAgICAqLwogICAgICAgICBJdGVyYXRvcjw/PiBnZXRQcm92aWRlcnMoQ2xhc3M8Pz4gY2F0ZWdvcnksIGJvb2xlYW4gdXNlT3JkZXJpbmcpIHsKICAgICAgICAgICAgIFByb3ZpZGVyc01hcCBwcm92aWRlcnMgPSBjYXRlZ29yaWVzLmdldChjYXRlZ29yeSk7CkBAIC0zMjEsNyArMzQzLDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIExpc3QuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBpdGVyYXRvcjwgY2xhc3M8Pz4+CisgICAgICAgICAqIEByZXR1cm4gdGhlIGl0ZXJhdG9yPCBjbGFzczw/Pj4uCiAgICAgICAgICAqLwogICAgICAgICBJdGVyYXRvcjxDbGFzczw/Pj4gbGlzdCgpIHsKICAgICAgICAgICAgIHJldHVybiBjYXRlZ29yaWVzLmtleVNldCgpLml0ZXJhdG9yKCk7CkBAIC0zMzAsNyArMzUyLDggQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEFkZHMgdGhlIGNhdGVnb3J5LgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGNhdGVnb3J5IHRoZSBjYXRlZ29yeQorICAgICAgICAgKiBAcGFyYW0gY2F0ZWdvcnkKKyAgICAgICAgICogICAgICAgICAgICB0aGUgY2F0ZWdvcnkuCiAgICAgICAgICAqLwogICAgICAgICB2b2lkIGFkZENhdGVnb3J5KENsYXNzPD8+IGNhdGVnb3J5KSB7CiAgICAgICAgICAgICBjYXRlZ29yaWVzLnB1dChjYXRlZ29yeSwgbmV3IFByb3ZpZGVyc01hcCgpKTsKQEAgLTM0MSwxMCArMzY0LDExIEBACiAgICAgICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gdGhlIHByb3ZpZGVyIHdpbGwgYmUgYWRkZWQgdG8gYWxsIGNhdGVnb3JpZXMKICAgICAgICAgICogd2hpY2ggdGhlIHByb3ZpZGVyIGlzIGFzc2lnbmFibGUgZnJvbS4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBwcm92aWRlciBwcm92aWRlciB0byBhZGQKLSAgICAgICAgICogQHBhcmFtIGNhdGVnb3J5IGNhdGVnb3J5IHRvIGFkZCBwcm92aWRlciB0bwotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiBpZiB0aGVyZSB3ZXJlIHN1Y2ggcHJvdmlkZXIgaW4gc29tZSBjYXRlZ29yeQorICAgICAgICAgKiBAcGFyYW0gcHJvdmlkZXIKKyAgICAgICAgICogICAgICAgICAgICBwcm92aWRlciB0byBhZGQuCisgICAgICAgICAqIEBwYXJhbSBjYXRlZ29yeQorICAgICAgICAgKiAgICAgICAgICAgIGNhdGVnb3J5IHRvIGFkZCBwcm92aWRlciB0by4KKyAgICAgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGVyZSB3ZXJlIHN1Y2ggcHJvdmlkZXIgaW4gc29tZSBjYXRlZ29yeS4KICAgICAgICAgICovCiAgICAgICAgIGJvb2xlYW4gYWRkUHJvdmlkZXIoT2JqZWN0IHByb3ZpZGVyLCBDbGFzczw/PiBjYXRlZ29yeSkgewogICAgICAgICAgICAgaWYgKHByb3ZpZGVyID09IG51bGwpIHsKQEAgLTM1NSwxMSArMzc5LDExIEBACiAgICAgICAgICAgICBpZiAoY2F0ZWdvcnkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHJ0ID0gZmluZEFuZEFkZChwcm92aWRlcik7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJ0ICA9IGFkZFRvTmFtZWQocHJvdmlkZXIsIGNhdGVnb3J5KTsKKyAgICAgICAgICAgICAgICBydCA9IGFkZFRvTmFtZWQocHJvdmlkZXIsIGNhdGVnb3J5KTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKHByb3ZpZGVyIGluc3RhbmNlb2YgUmVnaXN0ZXJhYmxlU2VydmljZSkgewotICAgICAgICAgICAgICAgICgoUmVnaXN0ZXJhYmxlU2VydmljZSkgcHJvdmlkZXIpLm9uUmVnaXN0cmF0aW9uKHJlZ2lzdHJ5LCBjYXRlZ29yeSk7CisgICAgICAgICAgICAgICAgKChSZWdpc3RlcmFibGVTZXJ2aWNlKXByb3ZpZGVyKS5vblJlZ2lzdHJhdGlvbihyZWdpc3RyeSwgY2F0ZWdvcnkpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXR1cm4gcnQ7CkBAIC0zNjgsMTAgKzM5MiwxMSBAQAogICAgICAgICAvKioKICAgICAgICAgICogQWRkcyB0aGUgdG8gbmFtZWQuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gcHJvdmlkZXIgdGhlIHByb3ZpZGVyCi0gICAgICAgICAqIEBwYXJhbSBjYXRlZ29yeSB0aGUgY2F0ZWdvcnkKLSAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgc3VjY2Vzc2Z1bAorICAgICAgICAgKiBAcGFyYW0gcHJvdmlkZXIKKyAgICAgICAgICogICAgICAgICAgICB0aGUgcHJvdmlkZXIuCisgICAgICAgICAqIEBwYXJhbSBjYXRlZ29yeQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBjYXRlZ29yeS4KKyAgICAgICAgICogQHJldHVybiB0cnVlLCBpZiBzdWNjZXNzZnVsLgogICAgICAgICAgKi8KICAgICAgICAgcHJpdmF0ZSBib29sZWFuIGFkZFRvTmFtZWQoT2JqZWN0IHByb3ZpZGVyLCBDbGFzczw/PiBjYXRlZ29yeSkgewogICAgICAgICAgICAgT2JqZWN0IG9iaiA9IGNhdGVnb3JpZXMuZ2V0KGNhdGVnb3J5KTsKQEAgLTM4MCwxNSArNDA1LDE1IEBACiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBjYXRlZ29yeTogIiArIGNhdGVnb3J5KTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcmV0dXJuICgoUHJvdmlkZXJzTWFwKSBvYmopLmFkZFByb3ZpZGVyKHByb3ZpZGVyKTsKKyAgICAgICAgICAgIHJldHVybiAoKFByb3ZpZGVyc01hcClvYmopLmFkZFByb3ZpZGVyKHByb3ZpZGVyKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBGaW5kIGFuZCBhZGQuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gcHJvdmlkZXIgdGhlIHByb3ZpZGVyCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHN1Y2Nlc3NmdWwKKyAgICAgICAgICogQHBhcmFtIHByb3ZpZGVyCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHByb3ZpZGVyLgorICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHN1Y2Nlc3NmdWwuCiAgICAgICAgICAqLwogICAgICAgICBwcml2YXRlIGJvb2xlYW4gZmluZEFuZEFkZChPYmplY3QgcHJvdmlkZXIpIHsKICAgICAgICAgICAgIGJvb2xlYW4gcnQgPSBmYWxzZTsKQEAgLTQwNSwxNyArNDMwLDE5IEBACiAgICAgICogVGhlIENsYXNzIFByb3ZpZGVyc01hcC4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQcm92aWRlcnNNYXAgewotICAgICAgICAvLy0tIFRPRE86IHByb3ZpZGVycyBvcmRlcmluZyBzdXBwb3J0CisgICAgICAgIC8vIC0tIFRPRE86IHByb3ZpZGVycyBvcmRlcmluZyBzdXBwb3J0CiAKLSAgICAgICAgLyoqIFRoZSBwcm92aWRlcnMuICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcHJvdmlkZXJzLgorICAgICAgICAgKi8KICAgICAgICAgTWFwPENsYXNzPD8+LCBPYmplY3Q+IHByb3ZpZGVycyA9IG5ldyBIYXNoTWFwPENsYXNzPD8+LCBPYmplY3Q+KCk7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEFkZHMgdGhlIHByb3ZpZGVyLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHByb3ZpZGVyIHRoZSBwcm92aWRlcgotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0cnVlLCBpZiBzdWNjZXNzZnVsCisgICAgICAgICAqIEBwYXJhbSBwcm92aWRlcgorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBwcm92aWRlci4KKyAgICAgICAgICogQHJldHVybiB0cnVlLCBpZiBzdWNjZXNzZnVsLgogICAgICAgICAgKi8KICAgICAgICAgYm9vbGVhbiBhZGRQcm92aWRlcihPYmplY3QgcHJvdmlkZXIpIHsKICAgICAgICAgICAgIHJldHVybiBwcm92aWRlcnMucHV0KHByb3ZpZGVyLmdldENsYXNzKCksIHByb3ZpZGVyKSAhPSBudWxsOwpAQCAtNDI0LDE5ICs0NTEsMTkgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEdldHMgdGhlIHByb3ZpZGVyIGNsYXNzZXMuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBwcm92aWRlciBjbGFzc2VzCisgICAgICAgICAqIEByZXR1cm4gdGhlIHByb3ZpZGVyIGNsYXNzZXMuCiAgICAgICAgICAqLwogICAgICAgICBJdGVyYXRvcjxDbGFzczw/Pj4gZ2V0UHJvdmlkZXJDbGFzc2VzKCkgewogICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVycy5rZXlTZXQoKS5pdGVyYXRvcigpOwogICAgICAgICB9CiAKLSAgICAgICAgLy8tLSBUT0RPIG9yZGVyaW5nCisgICAgICAgIC8vIC0tIFRPRE8gb3JkZXJpbmcKICAgICAgICAgLyoqCiAgICAgICAgICAqIEdldHMgdGhlIHByb3ZpZGVycy4KICAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSB1c2VyT3JkZXJpbmcgdGhlIHVzZXIgb3JkZXJpbmcKLSAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIHByb3ZpZGVycworICAgICAgICAgKiBAcGFyYW0gdXNlck9yZGVyaW5nCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHVzZXIgb3JkZXJpbmcuCisgICAgICAgICAqIEByZXR1cm4gdGhlIHByb3ZpZGVycy4KICAgICAgICAgICovCiAgICAgICAgIEl0ZXJhdG9yPD8+IGdldFByb3ZpZGVycyhib29sZWFuIHVzZXJPcmRlcmluZykgewogICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVycy52YWx1ZXMoKS5pdGVyYXRvcigpOwpAQCAtNDQ4LDIwICs0NzUsMjggQEAKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBGaWx0ZXJlZEl0ZXJhdG9yPEU+IGltcGxlbWVudHMgSXRlcmF0b3I8RT4gewogCi0gICAgICAgIC8qKiBUaGUgZmlsdGVyLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGZpbHRlci4KKyAgICAgICAgICovCiAgICAgICAgIHByaXZhdGUgRmlsdGVyIGZpbHRlcjsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgYmFja2VuZC4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGJhY2tlbmQuCisgICAgICAgICAqLwogICAgICAgICBwcml2YXRlIEl0ZXJhdG9yPEU+IGJhY2tlbmQ7Ci0gICAgICAgIAotICAgICAgICAvKiogVGhlIG5leHQgb2JqLiAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbmV4dCBvYmouCisgICAgICAgICAqLwogICAgICAgICBwcml2YXRlIEUgbmV4dE9iajsKIAogICAgICAgICAvKioKICAgICAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IGZpbHRlcmVkIGl0ZXJhdG9yLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGZpbHRlciB0aGUgZmlsdGVyCi0gICAgICAgICAqIEBwYXJhbSBiYWNrZW5kIHRoZSBiYWNrZW5kCisgICAgICAgICAqIEBwYXJhbSBmaWx0ZXIKKyAgICAgICAgICogICAgICAgICAgICB0aGUgZmlsdGVyLgorICAgICAgICAgKiBAcGFyYW0gYmFja2VuZAorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBiYWNrZW5kLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIEZpbHRlcmVkSXRlcmF0b3IoRmlsdGVyIGZpbHRlciwgSXRlcmF0b3I8RT4gYmFja2VuZCkgewogICAgICAgICAgICAgdGhpcy5maWx0ZXIgPSBmaWx0ZXI7CkBAIC00NzIsNyArNTA3LDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIE5leHQuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBlCisgICAgICAgICAqIEByZXR1cm4gdGhlIGUuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgRSBuZXh0KCkgewogICAgICAgICAgICAgaWYgKG5leHRPYmogPT0gbnVsbCkgewpAQCAtNDg2LDcgKzUyMSw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBDaGVja3MgZm9yIG5leHQuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHN1Y2Nlc3NmdWwKKyAgICAgICAgICogQHJldHVybiB0cnVlLCBpZiBzdWNjZXNzZnVsLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKICAgICAgICAgICAgIHJldHVybiBuZXh0T2JqICE9IG51bGw7CkBAIC01MDAsNyArNTM1LDggQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIG5leHRPYmogdG8gYSBuZXh0IHByb3ZpZGVyIG1hdGNoaW5nIHRoZSBjcml0ZXJpb24gZ2l2ZW4gYnkgdGhlIGZpbHRlci4KKyAgICAgICAgICogU2V0cyBuZXh0T2JqIHRvIGEgbmV4dCBwcm92aWRlciBtYXRjaGluZyB0aGUgY3JpdGVyaW9uIGdpdmVuIGJ5IHRoZQorICAgICAgICAgKiBmaWx0ZXIuCiAgICAgICAgICAqLwogICAgICAgICBwcml2YXRlIHZvaWQgZmluZE5leHQoKSB7CiAgICAgICAgICAgICBuZXh0T2JqID0gbnVsbDsKZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL3NwaS9wYWNrYWdlLmh0bWwgYi9hd3QvamF2YXgvaW1hZ2Vpby9zcGkvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4Y2VmZjQKLS0tIC9kZXYvbnVsbAorKysgYi9hd3QvamF2YXgvaW1hZ2Vpby9zcGkvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsOCBAQAorPGh0bWw+CisgIDxib2R5PgorICAgIDxwPgorICAgIFRoaXMgcGFja2FnZSBwcm92aWRlcyBzZXZlcmFsIFNlcnZpY2UgUHJvdmlkZXIgSW50ZXJmYWNlIChTUEkpIGNsYXNzZXMgZm9yIHJlYWRlcnMsIHdyaXRlcnMsIHRyYW5zY29kZXJzIGFuZCBzdHJlYW1zIHRvIGhhbmRsZSBpbWFnZXMuCisgICAgPC9wPgorICBAc2luY2UgQW5kcm9pZCAxLjAKKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvYXd0L2phdmF4L2ltYWdlaW8vc3RyZWFtL0ZpbGVDYWNoZUltYWdlSW5wdXRTdHJlYW0uamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL3N0cmVhbS9GaWxlQ2FjaGVJbWFnZUlucHV0U3RyZWFtLmphdmEKaW5kZXggNDdiYzE4OS4uNzEwYWM2NiAxMDA2NDQKLS0tIGEvYXd0L2phdmF4L2ltYWdlaW8vc3RyZWFtL0ZpbGVDYWNoZUltYWdlSW5wdXRTdHJlYW0uamF2YQorKysgYi9hd3QvamF2YXgvaW1hZ2Vpby9zdHJlYW0vRmlsZUNhY2hlSW1hZ2VJbnB1dFN0cmVhbS5qYXZhCkBAIC0xNSwzOCArMTUsNDMgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0KIHBhY2thZ2UgamF2YXguaW1hZ2Vpby5zdHJlYW07CiAKIGltcG9ydCBqYXZhLmlvLio7CiAKIC8qKgotICogVGhlIEZpbGVDYWNoZUltYWdlSW5wdXRTdHJlYW0gY2xhc3MgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YKLSAqIEltYWdlSW5wdXRTdHJlYW0gd2hpY2ggcmVhZHMgZnJvbSBpdHMgSW5wdXRTdHJlYW0KLSAqIGFuZCB1c2VzIGEgdGVtcG9yYXJ5IGZpbGUgYXMgYSBjYWNoZS4gCisgKiBUaGUgRmlsZUNhY2hlSW1hZ2VJbnB1dFN0cmVhbSBjbGFzcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBJbWFnZUlucHV0U3RyZWFtCisgKiB3aGljaCByZWFkcyBmcm9tIGl0cyBJbnB1dFN0cmVhbSBhbmQgdXNlcyBhIHRlbXBvcmFyeSBmaWxlIGFzIGEgY2FjaGUuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgRmlsZUNhY2hlSW1hZ2VJbnB1dFN0cmVhbSBleHRlbmRzIEltYWdlSW5wdXRTdHJlYW1JbXBsIHsKLSAgICAKLSAgICAvKiogVGhlIGlzLiAqLwotICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gaXM7Ci0gICAgCi0gICAgLyoqIFRoZSBmaWxlLiAqLwotICAgIHByaXZhdGUgRmlsZSBmaWxlOwotICAgIAotICAgIC8qKiBUaGUgcmFmLiAqLwotICAgIHByaXZhdGUgUmFuZG9tQWNjZXNzRmlsZSByYWY7Ci0KIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBGaWxlQ2FjaGVJbWFnZUlucHV0U3RyZWFtIGZyb20KLSAgICAgKiB0aGUgc3BlY2lmaWVkIElucHV0U3RyZWFtIGFuZCB1c2luZyB0aGUgc3BlY2lmaWVkIAotICAgICAqIEZpbGUgYXMgaXRzIGNhY2hlIGRpcmVjdG9yeS4KKyAgICAgKiBUaGUgaXMuCisgICAgICovCisgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBpczsKKworICAgIC8qKgorICAgICAqIFRoZSBmaWxlLgorICAgICAqLworICAgIHByaXZhdGUgRmlsZSBmaWxlOworCisgICAgLyoqCisgICAgICogVGhlIHJhZi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFJhbmRvbUFjY2Vzc0ZpbGUgcmFmOworCisgICAgLyoqCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEZpbGVDYWNoZUltYWdlSW5wdXRTdHJlYW0gZnJvbSB0aGUgc3BlY2lmaWVkCisgICAgICogSW5wdXRTdHJlYW0gYW5kIHVzaW5nIHRoZSBzcGVjaWZpZWQgRmlsZSBhcyBpdHMgY2FjaGUgZGlyZWN0b3J5LgogICAgICAqIAotICAgICAqIEBwYXJhbSBzdHJlYW0gdGhlIElucHV0U3RyZWFtIGZvciByZWFkaW5nLgotICAgICAqIEBwYXJhbSBjYWNoZURpciB0aGUgY2FjaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBjaGFjaGUgZmlsZQotICAgICAqIHdpbGwgYmUgY3JlYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gc3RyZWFtCisgICAgICogICAgICAgICAgICB0aGUgSW5wdXRTdHJlYW0gZm9yIHJlYWRpbmcuCisgICAgICogQHBhcmFtIGNhY2hlRGlyCisgICAgICogICAgICAgICAgICB0aGUgY2FjaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBjYWNoZSBmaWxlIHdpbGwgYmUgY3JlYXRlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgcHVibGljIEZpbGVDYWNoZUltYWdlSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gc3RyZWFtLCBGaWxlIGNhY2hlRGlyKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAoc3RyZWFtID09IG51bGwpIHsKQEAgLTU1LDcgKzYwLDggQEAKICAgICAgICAgaXMgPSBzdHJlYW07CiAKICAgICAgICAgaWYgKGNhY2hlRGlyID09IG51bGwgfHwgY2FjaGVEaXIuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgZmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoRmlsZUNhY2hlSW1hZ2VPdXRwdXRTdHJlYW0uSUlPX1RFTVBfRklMRV9QUkVGSVgsIG51bGwsIGNhY2hlRGlyKTsKKyAgICAgICAgICAgIGZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKEZpbGVDYWNoZUltYWdlT3V0cHV0U3RyZWFtLklJT19URU1QX0ZJTEVfUFJFRklYLCBudWxsLAorICAgICAgICAgICAgICAgICAgICBjYWNoZURpcik7CiAgICAgICAgICAgICBmaWxlLmRlbGV0ZU9uRXhpdCgpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm90IGEgZGlyZWN0b3J5ISIpOwpkaWZmIC0tZ2l0IGEvYXd0L2phdmF4L2ltYWdlaW8vc3RyZWFtL0ZpbGVDYWNoZUltYWdlT3V0cHV0U3RyZWFtLmphdmEgYi9hd3QvamF2YXgvaW1hZ2Vpby9zdHJlYW0vRmlsZUNhY2hlSW1hZ2VPdXRwdXRTdHJlYW0uamF2YQppbmRleCBhZTQ4NTg1Li4xMzVhZmFiIDEwMDY0NAotLS0gYS9hd3QvamF2YXgvaW1hZ2Vpby9zdHJlYW0vRmlsZUNhY2hlSW1hZ2VPdXRwdXRTdHJlYW0uamF2YQorKysgYi9hd3QvamF2YXgvaW1hZ2Vpby9zdHJlYW0vRmlsZUNhY2hlSW1hZ2VPdXRwdXRTdHJlYW0uamF2YQpAQCAtMTUsNyArMTUsNiBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLQogcGFja2FnZSBqYXZheC5pbWFnZWlvLnN0cmVhbTsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0yNCwzNSArMjMsNDggQEAKIGltcG9ydCBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGU7CiAKIC8qKgotICogVGhlIEZpbGVDYWNoZUltYWdlT3V0cHV0U3RyZWFtIGNsYXNzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIAotICogSW1hZ2VPdXRwdXRTdHJlYW0gdGhhdCB3cml0ZXMgdG8gaXRzIE91dHB1dFN0cmVhbQotICogdXNpbmcgYSB0ZW1wb3JhcnkgZmlsZSBhcyBhIGNhY2hlLiAKKyAqIFRoZSBGaWxlQ2FjaGVJbWFnZU91dHB1dFN0cmVhbSBjbGFzcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZgorICogSW1hZ2VPdXRwdXRTdHJlYW0gdGhhdCB3cml0ZXMgdG8gaXRzIE91dHB1dFN0cmVhbSB1c2luZyBhIHRlbXBvcmFyeSBmaWxlIGFzIGEKKyAqIGNhY2hlLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIEZpbGVDYWNoZUltYWdlT3V0cHV0U3RyZWFtIGV4dGVuZHMgSW1hZ2VPdXRwdXRTdHJlYW1JbXBsIHsKLSAgICAKLSAgICAvKiogVGhlIENvbnN0YW50IElJT19URU1QX0ZJTEVfUFJFRklYLiAqLworCisgICAgLyoqCisgICAgICogVGhlIENvbnN0YW50IElJT19URU1QX0ZJTEVfUFJFRklYLgorICAgICAqLwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUlPX1RFTVBfRklMRV9QUkVGSVggPSAiaWlvQ2FjaGUiOwotICAgIAotICAgIC8qKiBUaGUgQ29uc3RhbnQgTUFYX0JVRkZFUl9MRU4uICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29uc3RhbnQgTUFYX0JVRkZFUl9MRU4uCisgICAgICovCiAgICAgc3RhdGljIGZpbmFsIGludCBNQVhfQlVGRkVSX0xFTiA9IDEwNDg1NzU7IC8vIDEgTUIgLSBpcyBpdCBub3QgdG9vIG11Y2g/CiAKLSAgICAvKiogVGhlIG9zLiAqLworICAgIC8qKgorICAgICAqIFRoZSBvcy4KKyAgICAgKi8KICAgICBwcml2YXRlIE91dHB1dFN0cmVhbSBvczsKLSAgICAKLSAgICAvKiogVGhlIGZpbGUuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgZmlsZS4KKyAgICAgKi8KICAgICBwcml2YXRlIEZpbGUgZmlsZTsKLSAgICAKLSAgICAvKiogVGhlIHJhZi4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSByYWYuCisgICAgICovCiAgICAgcHJpdmF0ZSBSYW5kb21BY2Nlc3NGaWxlIHJhZjsKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIEZpbGVDYWNoZUltYWdlT3V0cHV0U3RyZWFtLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzdHJlYW0gdGhlIE91dHB1dFN0cmVhbSBmb3Igd3JpdGluZy4KLSAgICAgKiBAcGFyYW0gY2FjaGVEaXIgdGhlIGNhY2hlIGRpcmVjdG9yeSB3aGVyZSB0aGUgY2hhY2hlIGZpbGUKLSAgICAgKiB3aWxsIGJlIGNyZWF0ZWQuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIHN0cmVhbQorICAgICAqICAgICAgICAgICAgdGhlIE91dHB1dFN0cmVhbSBmb3Igd3JpdGluZy4KKyAgICAgKiBAcGFyYW0gY2FjaGVEaXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBjYWNoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGNhY2hlIGZpbGUgd2lsbCBiZSBjcmVhdGVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgRmlsZUNhY2hlSW1hZ2VPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIHN0cmVhbSwgRmlsZSBjYWNoZURpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxsKSB7CkBAIC05Niw3ICsxMDgsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBmbHVzaEJpdHMoKTsgLy8gU2VlIHRoZSBmbHVzaEJpdHMgbWV0aG9kIGRlc2NyaXB0aW9uCi0gICAgICAgIAorCiAgICAgICAgIHJhZi53cml0ZShiKTsKICAgICAgICAgc3RyZWFtUG9zKys7CiAgICAgfQpAQCAtMTQ4LDcgKzE2MCw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBieXRlIGJ1ZmZlcltdID0gbmV3IGJ5dGVbTUFYX0JVRkZFUl9MRU5dOwogICAgICAgICAgICAgd2hpbGUgKGJ5dGVzVG9SZWFkID4gMCkgewotICAgICAgICAgICAgICAgIGludCBjb3VudCA9IChpbnQpIE1hdGgubWluKE1BWF9CVUZGRVJfTEVOLCBieXRlc1RvUmVhZCk7CisgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gKGludClNYXRoLm1pbihNQVhfQlVGRkVSX0xFTiwgYnl0ZXNUb1JlYWQpOwogICAgICAgICAgICAgICAgIHJhZi5yZWFkRnVsbHkoYnVmZmVyLCAwLCBjb3VudCk7CiAgICAgICAgICAgICAgICAgb3Mud3JpdGUoYnVmZmVyLCAwLCBjb3VudCk7CiAgICAgICAgICAgICAgICAgYnl0ZXNUb1JlYWQgLT0gY291bnQ7CkBAIC0xNjksNyArMTgxLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHJhZi5zZWVrKHBvcyk7Ci0gICAgICAgIHN0cmVhbVBvcyA9IHJhZi5nZXRGaWxlUG9pbnRlcigpOyAgICAgICAgCisgICAgICAgIHN0cmVhbVBvcyA9IHJhZi5nZXRGaWxlUG9pbnRlcigpOwogICAgICAgICBiaXRPZmZzZXQgPSAwOwogICAgIH0KIApAQCAtMTc3LDcgKzE4OSw3IEBACiAgICAgcHVibGljIGxvbmcgbGVuZ3RoKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgcmV0dXJuIHJhZi5sZW5ndGgoKTsKLSAgICAgICAgfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHJldHVybiAtMUw7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9zdHJlYW0vRmlsZUltYWdlSW5wdXRTdHJlYW0uamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL3N0cmVhbS9GaWxlSW1hZ2VJbnB1dFN0cmVhbS5qYXZhCmluZGV4IDY2ODBhZTAuLmI5YjYwMDIgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL3N0cmVhbS9GaWxlSW1hZ2VJbnB1dFN0cmVhbS5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL3N0cmVhbS9GaWxlSW1hZ2VJbnB1dFN0cmVhbS5qYXZhCkBAIC0xNSw3ICsxNSw2IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotCiBwYWNrYWdlIGphdmF4LmltYWdlaW8uc3RyZWFtOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTI0LDI0ICsyMywzMSBAQAogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogCiAvKioKLSAqIFRoZSBGaWxlSW1hZ2VJbnB1dFN0cmVhbSBjbGFzcyBpbXBsZW1lbnRzIEltYWdlSW5wdXRTdHJlYW0gCi0gKiBhbmQgb2J0YWlucyBpdHMgaW5wdXQgZGF0YSBmcm9tIGEgRmlsZSBvciBSYW5kb21BY2Nlc3NGaWxlLiAKKyAqIFRoZSBGaWxlSW1hZ2VJbnB1dFN0cmVhbSBjbGFzcyBpbXBsZW1lbnRzIEltYWdlSW5wdXRTdHJlYW0gYW5kIG9idGFpbnMgaXRzCisgKiBpbnB1dCBkYXRhIGZyb20gYSBGaWxlIG9yIFJhbmRvbUFjY2Vzc0ZpbGUuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgRmlsZUltYWdlSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbWFnZUlucHV0U3RyZWFtSW1wbCB7Ci0gICAgCi0gICAgLyoqIFRoZSByYWYuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmFmLgorICAgICAqLwogICAgIFJhbmRvbUFjY2Vzc0ZpbGUgcmFmOwogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEZpbGVJbWFnZUlucHV0U3RyZWFtIGZyb20gdGhlIHNwZWNpZmllZCBGaWxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBmIHRoZSBGaWxlIG9mIGlucHV0IGRhdGEuCi0gICAgICogCi0gICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBmaWxlIAotICAgICAqIGRvZXNuJ3QgZXhpc3QuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIGYKKyAgICAgKiAgICAgICAgICAgIHRoZSBGaWxlIG9mIGlucHV0IGRhdGEuCisgICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIGZpbGUgZG9lc24ndCBleGlzdC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJEdXBsaWNhdGVUaHJvd3MifSkKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyggeworICAgICAgICAiRHVwbGljYXRlVGhyb3dzIgorICAgIH0pCiAgICAgcHVibGljIEZpbGVJbWFnZUlucHV0U3RyZWFtKEZpbGUgZikgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAoZiA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmID09IG51bGwhIik7CkBAIC01MSwxMCArNTcsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgRmlsZUltYWdlSW5wdXRTdHJlYW0gZnJvbSB0aGUgc3BlY2lmaWVkIAorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBGaWxlSW1hZ2VJbnB1dFN0cmVhbSBmcm9tIHRoZSBzcGVjaWZpZWQKICAgICAgKiBSYW5kb21BY2Nlc3NGaWxlLgogICAgICAqIAotICAgICAqIEBwYXJhbSByYWYgdGhlIFJhbmRvbUFjY2Vzc0ZpbGUgb2YgaW5wdXQgZGF0YS4KKyAgICAgKiBAcGFyYW0gcmFmCisgICAgICogICAgICAgICAgICB0aGUgUmFuZG9tQWNjZXNzRmlsZSBvZiBpbnB1dCBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyBGaWxlSW1hZ2VJbnB1dFN0cmVhbShSYW5kb21BY2Nlc3NGaWxlIHJhZikgewogICAgICAgICBpZiAocmFmID09IG51bGwpIHsKQEAgLTkxLDcgKzk4LDcgQEAKICAgICBwdWJsaWMgbG9uZyBsZW5ndGgoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICByZXR1cm4gcmFmLmxlbmd0aCgpOwotICAgICAgICB9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgcmV0dXJuIC0xTDsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL3N0cmVhbS9GaWxlSW1hZ2VPdXRwdXRTdHJlYW0uamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL3N0cmVhbS9GaWxlSW1hZ2VPdXRwdXRTdHJlYW0uamF2YQppbmRleCBlYWFmZTE0Li4yNzMwYmE2IDEwMDY0NAotLS0gYS9hd3QvamF2YXgvaW1hZ2Vpby9zdHJlYW0vRmlsZUltYWdlT3V0cHV0U3RyZWFtLmphdmEKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vc3RyZWFtL0ZpbGVJbWFnZU91dHB1dFN0cmVhbS5qYXZhCkBAIC0xOCwzOSArMTgsNDQgQEAKICAqIEBhdXRob3IgUnVzdGVtIFYuIFJhZmlrb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4zICQKICAqLworCiBwYWNrYWdlIGphdmF4LmltYWdlaW8uc3RyZWFtOwogCiBpbXBvcnQgamF2YS5pby4qOwogCiAvKioKLSAqIFRoZSBGaWxlSW1hZ2VPdXRwdXRTdHJlYW0gY2xhc3MgaW1wbGVtZW50cyBJbWFnZU91dHB1dFN0cmVhbSAKLSAqIGFuZCB3cml0ZXMgdGhlIG91dHB1dCBkYXRhIHRvIGEgRmlsZSBvciBSYW5kb21BY2Nlc3NGaWxlLiAKKyAqIFRoZSBGaWxlSW1hZ2VPdXRwdXRTdHJlYW0gY2xhc3MgaW1wbGVtZW50cyBJbWFnZU91dHB1dFN0cmVhbSBhbmQgd3JpdGVzIHRoZQorICogb3V0cHV0IGRhdGEgdG8gYSBGaWxlIG9yIFJhbmRvbUFjY2Vzc0ZpbGUuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCiBwdWJsaWMgY2xhc3MgRmlsZUltYWdlT3V0cHV0U3RyZWFtIGV4dGVuZHMgSW1hZ2VPdXRwdXRTdHJlYW1JbXBsIHsKIAotICAgIC8qKiBUaGUgZmlsZS4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgZmlsZS4KKyAgICAgKi8KICAgICBSYW5kb21BY2Nlc3NGaWxlIGZpbGU7CiAKICAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgRmlsZUltYWdlT3V0cHV0U3RyZWFtIHdpdGggdGhlIHNwZWNpZmllZAotICAgICAqIEZpbGUuCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IEZpbGVJbWFnZU91dHB1dFN0cmVhbSB3aXRoIHRoZSBzcGVjaWZpZWQgRmlsZS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZiB0aGUgb3V0cHV0IEZpbGUuCi0gICAgICogCi0gICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIGZpbGUgbm90IGZvdW5kLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBmCisgICAgICogICAgICAgICAgICB0aGUgb3V0cHV0IEZpbGUuCisgICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZmlsZSBub3QgZm91bmQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHB1YmxpYyBGaWxlSW1hZ2VPdXRwdXRTdHJlYW0oRmlsZSBmKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMoZiAhPSBudWxsCi0gICAgICAgICAgICAgICAgPyBuZXcgUmFuZG9tQWNjZXNzRmlsZShmLCAicnciKQotICAgICAgICAgICAgICAgIDogbnVsbCk7CisgICAgICAgIHRoaXMoZiAhPSBudWxsID8gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUoZiwgInJ3IikgOiBudWxsKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgRmlsZUltYWdlT3V0cHV0U3RyZWFtIHdpdGggdGhlIHNwZWNpZmllZAogICAgICAqIFJhbmRvbUFjY2Vzc0ZpbGUuCiAgICAgICogCi0gICAgICogQHBhcmFtIHJhZiB0aGUgb3V0cHV0IFJhbmRvbUFjY2Vzc0ZpbGUuCisgICAgICogQHBhcmFtIHJhZgorICAgICAqICAgICAgICAgICAgdGhlIG91dHB1dCBSYW5kb21BY2Nlc3NGaWxlLgogICAgICAqLwogICAgIHB1YmxpYyBGaWxlSW1hZ2VPdXRwdXRTdHJlYW0oUmFuZG9tQWNjZXNzRmlsZSByYWYpIHsKICAgICAgICAgaWYgKHJhZiA9PSBudWxsKSB7CkBAIC0xMDIsMTQgKzEwNywxNCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgY2hlY2tDbG9zZWQoKTsKICAgICAgICAgICAgIHJldHVybiBmaWxlLmxlbmd0aCgpOwotICAgICAgICB9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmxlbmd0aCgpOyAvLyAtMUwKICAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNlZWsobG9uZyBwb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vLS0gY2hlY2tDbG9zZWQoKSBpcyBwZXJmb3JtZWQgaW4gc3VwZXIuc2VlaygpCisgICAgICAgIC8vIC0tIGNoZWNrQ2xvc2VkKCkgaXMgcGVyZm9ybWVkIGluIHN1cGVyLnNlZWsoKQogICAgICAgICBzdXBlci5zZWVrKHBvcyk7CiAgICAgICAgIGZpbGUuc2Vlayhwb3MpOwogICAgICAgICBzdHJlYW1Qb3MgPSBmaWxlLmdldEZpbGVQb2ludGVyKCk7CmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9zdHJlYW0vSUlPQnl0ZUJ1ZmZlci5qYXZhIGIvYXd0L2phdmF4L2ltYWdlaW8vc3RyZWFtL0lJT0J5dGVCdWZmZXIuamF2YQppbmRleCA5NjFhN2IzLi44NjdkODA4IDEwMDY0NAotLS0gYS9hd3QvamF2YXgvaW1hZ2Vpby9zdHJlYW0vSUlPQnl0ZUJ1ZmZlci5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL3N0cmVhbS9JSU9CeXRlQnVmZmVyLmphdmEKQEAgLTE4LDM1ICsxOCw0NiBAQAogICogQGF1dGhvciBTZXJnZXkgSS4gU2FsaXNoZXYKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4yICQKICAqLworCiBwYWNrYWdlIGphdmF4LmltYWdlaW8uc3RyZWFtOwogCi0vKiogCi0qIEBhdXRob3IgU2VyZ2V5IEkuIFNhbGlzaGV2Ci0qIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4yICQKLSovCisvLyAKKy8vIEBhdXRob3IgU2VyZ2V5IEkuIFNhbGlzaGV2CisvLyBAdmVyc2lvbiAkUmV2aXNpb246IDEuMiAkCisvLwogCiAvKioKLSAqIFRoZSBJSU9CeXRlQnVmZmVyIGNsYXNzIHJlcHJlc2VudHMgYSBieXRlIGFycmF5IHdpdGggb2Zmc2V0IGFuZCAKLSAqIGxlbmd0aCB0aGF0IGlzIHVzZWQgYnkgSW1hZ2VJbnB1dFN0cmVhbSBmb3Igb2J0YWluaW5nIGEgc2VxdWVuY2UgCi0gKiBvZiBieXRlcy4KKyAqIFRoZSBJSU9CeXRlQnVmZmVyIGNsYXNzIHJlcHJlc2VudHMgYSBieXRlIGFycmF5IHdpdGggb2Zmc2V0IGFuZCBsZW5ndGggdGhhdAorICogaXMgdXNlZCBieSBJbWFnZUlucHV0U3RyZWFtIGZvciBvYnRhaW5pbmcgYSBzZXF1ZW5jZSBvZiBieXRlcy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBjbGFzcyBJSU9CeXRlQnVmZmVyIHsKLSAgICAKLSAgICAvKiogVGhlIGRhdGEuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGF0YS4KKyAgICAgKi8KICAgICBwcml2YXRlIGJ5dGVbXSBkYXRhOwotICAgIAotICAgIC8qKiBUaGUgb2Zmc2V0LiAqLworCisgICAgLyoqCisgICAgICogVGhlIG9mZnNldC4KKyAgICAgKi8KICAgICBwcml2YXRlIGludCBvZmZzZXQ7Ci0gICAgCi0gICAgLyoqIFRoZSBsZW5ndGguICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGVuZ3RoLgorICAgICAqLwogICAgIHByaXZhdGUgaW50IGxlbmd0aDsKIAogICAgIC8qKgogICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBJSU9CeXRlQnVmZmVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRhIHRoZSBieXRlIGFycmF5LgotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCBpbiB0aGUgYXJyYXkuCi0gICAgICogQHBhcmFtIGxlbmd0aCB0aGUgbGVuZ3RoIG9mIGFycmF5LgorICAgICAqIEBwYXJhbSBkYXRhCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSBhcnJheS4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IGluIHRoZSBhcnJheS4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIGFycmF5LgogICAgICAqLwogICAgIHB1YmxpYyBJSU9CeXRlQnVmZmVyKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CkBAIC04NCw3ICs5NSw4IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgbmV3IGRhdGEgYXJyYXkgdG8gdGhpcyBJSU9CeXRlQnVmZmVyIG9iamVjdC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgbmV3IGRhdGEgYXJyYXkuCisgICAgICogQHBhcmFtIGRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgZGF0YSBhcnJheS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXREYXRhKGJ5dGVbXSBkYXRhKSB7CiAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CkBAIC05Myw3ICsxMDUsOCBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGxlbmd0aCBvZiBkYXRhIHdoaWNoIHdpbGwgYmUgdXNlZC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGVuZ3RoIHRoZSBuZXcgbGVuZ3RoLgorICAgICAqIEBwYXJhbSBsZW5ndGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgbGVuZ3RoLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldExlbmd0aChpbnQgbGVuZ3RoKSB7CiAgICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoOwpAQCAtMTAyLDEwICsxMTUsMTAgQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBvZmZzZXQgaW4gdGhlIGRhdGEgYXJyYXkgb2YgdGhpcyBJSU9CeXRlQnVmZmVyLgogICAgICAqIAotICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG5ldyBvZmZzZXQuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIG5ldyBvZmZzZXQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0T2Zmc2V0KGludCBvZmZzZXQpIHsKICAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7CiAgICAgfQogfQotCmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9zdHJlYW0vSW1hZ2VJbnB1dFN0cmVhbS5qYXZhIGIvYXd0L2phdmF4L2ltYWdlaW8vc3RyZWFtL0ltYWdlSW5wdXRTdHJlYW0uamF2YQppbmRleCA3NzFlOWZmLi4zZGVjNWQyIDEwMDY0NAotLS0gYS9hd3QvamF2YXgvaW1hZ2Vpby9zdHJlYW0vSW1hZ2VJbnB1dFN0cmVhbS5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL3N0cmVhbS9JbWFnZUlucHV0U3RyZWFtLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEBhdXRob3IgUnVzdGVtIFYuIFJhZmlrb3YKICAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4yICQKICAqLworCiBwYWNrYWdlIGphdmF4LmltYWdlaW8uc3RyZWFtOwogCiBpbXBvcnQgamF2YS5pby5EYXRhSW5wdXQ7CkBAIC0yNSwyMSArMjYsMjQgQEAKIGltcG9ydCBqYXZhLm5pby5CeXRlT3JkZXI7CiAKIC8qKgotICogVGhlIEltYWdlSW5wdXRTdHJlYW0gcmVwcmVzZW50cyBpbnB1dCBzdHJlYW0gaW50ZXJmYWNlIHRoYXQgaXMgCi0gKiB1c2VkIGJ5IEltYWdlUmVhZGVycy4KKyAqIFRoZSBJbWFnZUlucHV0U3RyZWFtIHJlcHJlc2VudHMgaW5wdXQgc3RyZWFtIGludGVyZmFjZSB0aGF0IGlzIHVzZWQgYnkKKyAqIEltYWdlUmVhZGVycy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSW1hZ2VJbnB1dFN0cmVhbSBleHRlbmRzIERhdGFJbnB1dCB7CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzcGVjaWZpZWQgYnl0ZSBvcmRlciBmb3IgcmVhZGluZyBvZiBkYXRhIHZhbHVlcyAKLSAgICAgKiBmcm9tIHRoaXMgc3RyZWFtLiAKKyAgICAgKiBTZXRzIHRoZSBzcGVjaWZpZWQgYnl0ZSBvcmRlciBmb3IgcmVhZGluZyBvZiBkYXRhIHZhbHVlcyBmcm9tIHRoaXMKKyAgICAgKiBzdHJlYW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIGJ5dGVPcmRlciB0aGUgYnl0ZSBvcmRlci4KKyAgICAgKiBAcGFyYW0gYnl0ZU9yZGVyCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSBvcmRlci4KICAgICAgKi8KICAgICB2b2lkIHNldEJ5dGVPcmRlcihCeXRlT3JkZXIgYnl0ZU9yZGVyKTsKIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGJ5dGUgb3JkZXIuIAorICAgICAqIEdldHMgdGhlIGJ5dGUgb3JkZXIuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgYnl0ZSBvcmRlci4KICAgICAgKi8KQEAgLTQ4LDE1OCArNTIsMTUxIEBACiAgICAgLyoqCiAgICAgICogUmVhZHMgYSBieXRlIGZyb20gdGhlIHN0cmVhbS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBieXRlIG9mIHRoZSBzdHJlYW0sIG9yIC0xIGZvciBFT0YgaW5kaWNhdGluZy4gCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHJldHVybiB0aGUgYnl0ZSBvZiB0aGUgc3RyZWFtLCBvciAtMSBmb3IgRU9GIGluZGljYXRpbmcuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmVhZHMgbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIGlzIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgYXJyYXkncyBsZW5ndGgKLSAgICAgKiBhbmQgc3RvcmVzIGEgcmVzdWx0IHRvIHRoaXMgYXJyYXkuCisgICAgICogUmVhZHMgbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIGlzIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgYXJyYXkncyBsZW5ndGggYW5kCisgICAgICogc3RvcmVzIGEgcmVzdWx0IHRvIHRoaXMgYXJyYXkuCiAgICAgICogCi0gICAgICogQHBhcmFtIGIgdGhlIGJ5dGUgYXJyYXkuCi0gICAgICogCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGFycmF5LgogICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiByZWFkIGJ5dGVzLCBvciAtMSBpbmRpY2F0ZWQgRU9GLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBpbnQgcmVhZChieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmVhZHMgdGhlIG51bWJlciBvZiBieXRlcyBzcGVjaWZpZWQgYnkgbGVuIHBhcmFtZXRlciBmcm9tIAotICAgICAqIHRoZSBzdHJlYW0gYW5kIHN0b3JlcyBhIHJlc3VsdCB0byB0aGUgc3BlY2lmaWVkIGFycmF5Ci0gICAgICogd2l0aCB0aGUgc3BlY2lmaWVkIG9mZnNldC4KKyAgICAgKiBSZWFkcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHNwZWNpZmllZCBieSBsZW4gcGFyYW1ldGVyIGZyb20gdGhlIHN0cmVhbSBhbmQKKyAgICAgKiBzdG9yZXMgYSByZXN1bHQgdG8gdGhlIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBiIHRoZSBieXRlIGFycmF5LgotICAgICAqIEBwYXJhbSBvZmYgdGhlIG9mZnNldC4KLSAgICAgKiBAcGFyYW0gbGVuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVhZC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgYXJyYXkuCisgICAgICogQHBhcmFtIG9mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldC4KKyAgICAgKiBAcGFyYW0gbGVuCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHJlYWQuCiAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHJlYWQgYnl0ZXMsIG9yIC0xIGluZGljYXRlZCBFT0YuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIGludCByZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHNwZWNpZmllZCBieSBsZW4gcGFyYW1ldGVyIAotICAgICAqIGZyb20gdGhlIHN0cmVhbSwgYW5kIG1vZGlmaWVzIHRoZSBzcGVjaWZpZWQgSUlPQnl0ZUJ1ZmZlciAKLSAgICAgKiB3aXRoIHRoZSBieXRlIGFycmF5LCBvZmZzZXQsIGFuZCBsZW5ndGguCisgICAgICogUmVhZHMgdGhlIG51bWJlciBvZiBieXRlcyBzcGVjaWZpZWQgYnkgbGVuIHBhcmFtZXRlciBmcm9tIHRoZSBzdHJlYW0sIGFuZAorICAgICAqIG1vZGlmaWVzIHRoZSBzcGVjaWZpZWQgSUlPQnl0ZUJ1ZmZlciB3aXRoIHRoZSBieXRlIGFycmF5LCBvZmZzZXQsIGFuZAorICAgICAqIGxlbmd0aC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYnVmIHRoZSBJSU9CeXRlQnVmZmVyLgotICAgICAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSByZWFkLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBidWYKKyAgICAgKiAgICAgICAgICAgIHRoZSBJSU9CeXRlQnVmZmVyLgorICAgICAqIEBwYXJhbSBsZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVhZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgdm9pZCByZWFkQnl0ZXMoSUlPQnl0ZUJ1ZmZlciBidWYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJlYWRzIGEgYnl0ZSBmcm9tIHRoZSBzdHJlYW0gYW5kIHJldHVybnMgYSBib29sZWFuIHRydWUgdmFsdWUgCi0gICAgICogaWYgaXQgaXMgbm9uIHplcm8sIGZhbHNlIGlmIGl0IGlzIHplcm8uCisgICAgICogUmVhZHMgYSBieXRlIGZyb20gdGhlIHN0cmVhbSBhbmQgcmV0dXJucyBhIGJvb2xlYW4gdHJ1ZSB2YWx1ZSBpZiBpdCBpcworICAgICAqIG5vbiB6ZXJvLCBmYWxzZSBpZiBpdCBpcyB6ZXJvLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSBib29sZWFuIHZhbHVlIGZvciByZWFkIGJ5dGUuIAotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEByZXR1cm4gdGhlIGJvb2xlYW4gdmFsdWUgZm9yIHJlYWQgYnl0ZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgYm9vbGVhbiByZWFkQm9vbGVhbigpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJlYWRzIGEgYnl0ZSBmcm9tIHRoZSBzdHJlYW0gYW5kIHJldHVybnMgaXRzIHZhbHVlCi0gICAgICogYXMgc2lnbmVkIGJ5dGUuCisgICAgICogUmVhZHMgYSBieXRlIGZyb20gdGhlIHN0cmVhbSBhbmQgcmV0dXJucyBpdHMgdmFsdWUgYXMgc2lnbmVkIGJ5dGUuCiAgICAgICogCi0gICAgICogQHJldHVybiBhIHNpZ25lZCBieXRlIHZhbHVlIGZvciByZWFkIGJ5dGUuIAotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEByZXR1cm4gdGhlIHNpZ25lZCBieXRlIHZhbHVlIGZvciByZWFkIGJ5dGUuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIGJ5dGUgcmVhZEJ5dGUoKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBhIGJ5dGUgZnJvbSB0aGUgc3RyZWFtIGFuZCByZXR1cm5zIGl0cyB2YWx1ZQotICAgICAqIGFzIGludC4KKyAgICAgKiBSZWFkcyBhIGJ5dGUgZnJvbSB0aGUgc3RyZWFtIGFuZCByZXR1cm5zIGl0cyB2YWx1ZSBhcyBhbiBpbnRlZ2VyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSB1bnNpZ25lZCBieXRlIHZhbHVlIGZvciByZWFkIGJ5dGUgYXMgaW50LiAKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSB1bnNpZ25lZCBieXRlIHZhbHVlIGZvciByZWFkIGJ5dGUgYXMgYW4gaW50ZWdlci4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgaW50IHJlYWRVbnNpZ25lZEJ5dGUoKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyAyIGJ5dGVzIGZyb20gdGhlIHN0cmVhbSwgYW5kIHJldHVybnMgdGhlIHJlc3VsdCAKLSAgICAgKiBhcyBhIHNob3J0LgorICAgICAqIFJlYWRzIDIgYnl0ZXMgZnJvbSB0aGUgc3RyZWFtLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGFzIGEgc2hvcnQuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgc2lnbmVkIHNob3J0IHZhbHVlIGZyb20gdGhlIHN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgc2hvcnQgcmVhZFNob3J0KCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmVhZHMgMiBieXRlcyBmcm9tIHRoZSBzdHJlYW0gYW5kIHJldHVybnMgaXRzIHZhbHVlCi0gICAgICogYXMgYW4gdW5zaWduZWQgc2hvcnQuCisgICAgICogUmVhZHMgMiBieXRlcyBmcm9tIHRoZSBzdHJlYW0gYW5kIHJldHVybnMgaXRzIHZhbHVlIGFzIGFuIHVuc2lnbmVkIHNob3J0LgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSB1bnNpZ25lZCBzaG9ydCB2YWx1ZSBjb2RlZCBpbiBhbiBpbnQuIAotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEByZXR1cm4gYSB1bnNpZ25lZCBzaG9ydCB2YWx1ZSBjb2RlZCBpbiBhbiBpbnRlZ2VyLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBpbnQgcmVhZFVuc2lnbmVkU2hvcnQoKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyAyIGJ5dGVzIGZyb20gdGhlIHN0cmVhbSBhbmQgcmV0dXJucyB0aGVpciAKLSAgICAgKiB1bnNpZ25lZCBjaGFyIHZhbHVlLgorICAgICAqIFJlYWRzIDIgYnl0ZXMgZnJvbSB0aGUgc3RyZWFtIGFuZCByZXR1cm5zIHRoZWlyIHVuc2lnbmVkIGNoYXIgdmFsdWUuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgdW5zaWduZWQgY2hhciB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgY2hhciByZWFkQ2hhcigpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJlYWRzIDQgYnl0ZXMgZnJvbSB0aGUgc3RyZWFtLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IAotICAgICAqIGFzIGFuIGludC4KKyAgICAgKiBSZWFkcyA0IGJ5dGVzIGZyb20gdGhlIHN0cmVhbSwgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBhbiBpbnRlZ2VyLgogICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNpZ25lZCBpbnQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEByZXR1cm4gdGhlIHNpZ25lZCBpbnRlZ2VyIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgaW50IHJlYWRJbnQoKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyA0IGJ5dGVzIGZyb20gdGhlIHN0cmVhbSBhbmQgcmV0dXJucyBpdHMgdmFsdWUKLSAgICAgKiBhcyBsb25nLgorICAgICAqIFJlYWRzIDQgYnl0ZXMgZnJvbSB0aGUgc3RyZWFtIGFuZCByZXR1cm5zIGl0cyB2YWx1ZSBhcyBsb25nLgogICAgICAqIAotICAgICAqIEByZXR1cm4gYSB1bnNpZ25lZCBpbnQgdmFsdWUgYXMgbG9uZy4gCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHJldHVybiB0aGUgdW5zaWduZWQgaW50ZWdlciB2YWx1ZSBhcyBsb25nLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBsb25nIHJlYWRVbnNpZ25lZEludCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJlYWRzIDggYnl0ZXMgZnJvbSB0aGUgc3RyZWFtLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IAotICAgICAqIGFzIGEgbG9uZy4KKyAgICAgKiBSZWFkcyA4IGJ5dGVzIGZyb20gdGhlIHN0cmVhbSwgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBhIGxvbmcuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgbG9uZyB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIGxvbmcgcmVhZExvbmcoKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyA0IGJ5dGVzIGZyb20gdGhlIHN0cmVhbSwgYW5kIHJldHVybnMgdGhlIHJlc3VsdCAKLSAgICAgKiBhcyBhIGZsb2F0LgorICAgICAqIFJlYWRzIDQgYnl0ZXMgZnJvbSB0aGUgc3RyZWFtLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGFzIGEgZmxvYXQuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgZmxvYXQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBmbG9hdCByZWFkRmxvYXQoKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyA4IGJ5dGVzIGZyb20gdGhlIHN0cmVhbSwgYW5kIHJldHVybnMgdGhlIHJlc3VsdCAKLSAgICAgKiBhcyBhIGRvdWJsZS4KKyAgICAgKiBSZWFkcyA4IGJ5dGVzIGZyb20gdGhlIHN0cmVhbSwgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBhIGRvdWJsZS4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBkb3VibGUgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBkb3VibGUgcmVhZERvdWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIApAQCAtMjA3LDEyMCArMjA0LDEzNCBAQAogICAgICAqIFJlYWRzIGEgbGluZSBmcm9tIHRoZSBzdHJlYW0uCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgc3RyaW5nIGNvbnRhaW5lZCB0aGUgbGluZSBmcm9tIHRoZSBzdHJlYW0uCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIFN0cmluZyByZWFkTGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJlYWRzIGJ5dGVzIGZyb20gdGhlIHN0cmVhbSBpbiBhIHN0cmluZyB0aGF0IGhhcyBiZWVuIGVuY29kZWQgCi0gICAgICogaW4gYSBtb2RpZmllZCBVVEYtOCBmb3JtYXQuCisgICAgICogUmVhZHMgYnl0ZXMgZnJvbSB0aGUgc3RyZWFtIGluIGEgc3RyaW5nIHRoYXQgaGFzIGJlZW4gZW5jb2RlZCBpbiBhCisgICAgICogbW9kaWZpZWQgVVRGLTggZm9ybWF0LgogICAgICAqIAogICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZWFkIGZyb20gc3RyZWFtIGFuZCBtb2RpZmllZCBVVEYtOCBmb3JtYXQuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIFN0cmluZyByZWFkVVRGKCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmVhZHMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUgc3RyZWFtLCAKLSAgICAgKiBhbmQgc3RvcmVzIHRoZSByZXN1bHQgaW50byB0aGUgc3BlY2lmaWVkIGFycmF5IHN0YXJ0aW5nIGF0IAotICAgICAqIHRoZSBzcGVjaWZpZWQgaW5kZXggb2Zmc2V0LiAKKyAgICAgKiBSZWFkcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBzdHJlYW0sIGFuZCBzdG9yZXMgdGhlCisgICAgICogcmVzdWx0IGludG8gdGhlIHNwZWNpZmllZCBhcnJheSBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IG9mZnNldC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYiB0aGUgYnl0ZSBhcnJheS4KLSAgICAgKiBAcGFyYW0gb2ZmIHRoZSBvZmZzZXQuCi0gICAgICogQHBhcmFtIGxlbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHJlYWQuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGFycmF5LgorICAgICAqIEBwYXJhbSBvZmYKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQuCisgICAgICogQHBhcmFtIGxlbgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSByZWFkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICB2b2lkIHJlYWRGdWxseShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmVhZHMgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIHN0cmVhbSB3aGljaCBpcyBlcXVhbCB0byAKLSAgICAgKiB0aGUgc3BlY2lmaWVkIGFycmF5J3MgbGVuZ3RoLCBhbmQgc3RvcmVzIHRoZW0gaW50byAKLSAgICAgKiB0aGlzIGFycmF5LgorICAgICAqIFJlYWRzIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBzdHJlYW0gd2hpY2ggaXMgZXF1YWwgdG8gdGhlIHNwZWNpZmllZAorICAgICAqIGFycmF5J3MgbGVuZ3RoLCBhbmQgc3RvcmVzIHRoZW0gaW50byB0aGlzIGFycmF5LgogICAgICAqIAotICAgICAqIEBwYXJhbSBiIHRoZSBieXRlIGFycmF5LgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSBhcnJheS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgdm9pZCByZWFkRnVsbHkoYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJlYWRzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHNob3J0cyBmcm9tIHRoZSBzdHJlYW0sIAotICAgICAqIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbnRvIHRoZSBzcGVjaWZpZWQgYXJyYXkgc3RhcnRpbmcgYXQgCi0gICAgICogdGhlIHNwZWNpZmllZCBpbmRleCBvZmZzZXQuIAorICAgICAqIFJlYWRzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHNob3J0cyBmcm9tIHRoZSBzdHJlYW0sIGFuZCBzdG9yZXMgdGhlCisgICAgICogcmVzdWx0IGludG8gdGhlIHNwZWNpZmllZCBhcnJheSBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IG9mZnNldC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcyB0aGUgc2hvcnQgYXJyYXkuCi0gICAgICogQHBhcmFtIG9mZiB0aGUgb2Zmc2V0LgotICAgICAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBzaG9ydHMgdG8gYmUgcmVhZC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gcworICAgICAqICAgICAgICAgICAgdGhlIHNob3J0IGFycmF5LgorICAgICAqIEBwYXJhbSBvZmYKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQuCisgICAgICogQHBhcmFtIGxlbgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBzaG9ydHMgdG8gYmUgcmVhZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgdm9pZCByZWFkRnVsbHkoc2hvcnRbXSBzLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBjaGFycyBmcm9tIHRoZSBzdHJlYW0sIAotICAgICAqIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbnRvIHRoZSBzcGVjaWZpZWQgYXJyYXkgc3RhcnRpbmcgYXQgCi0gICAgICogdGhlIHNwZWNpZmllZCBpbmRleCBvZmZzZXQuIAorICAgICAqIFJlYWRzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNoYXJzIGZyb20gdGhlIHN0cmVhbSwgYW5kIHN0b3JlcyB0aGUKKyAgICAgKiByZXN1bHQgaW50byB0aGUgc3BlY2lmaWVkIGFycmF5IHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggb2Zmc2V0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBjIHRoZSBjaGFyIGFycmF5LgotICAgICAqIEBwYXJhbSBvZmYgdGhlIG9mZnNldC4KLSAgICAgKiBAcGFyYW0gbGVuIHRoZSBudW1iZXIgb2YgY2hhcnMgdG8gYmUgcmVhZC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gYworICAgICAqICAgICAgICAgICAgdGhlIGNoYXIgYXJyYXkuCisgICAgICogQHBhcmFtIG9mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldC4KKyAgICAgKiBAcGFyYW0gbGVuCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNoYXJzIHRvIGJlIHJlYWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHZvaWQgcmVhZEZ1bGx5KGNoYXJbXSBjLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBpbnRzIGZyb20gdGhlIHN0cmVhbSwgCi0gICAgICogYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGludG8gdGhlIHNwZWNpZmllZCBhcnJheSBzdGFydGluZyBhdCAKLSAgICAgKiB0aGUgc3BlY2lmaWVkIGluZGV4IG9mZnNldC4gCisgICAgICogUmVhZHMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgaW50ZWdlciBmcm9tIHRoZSBzdHJlYW0sIGFuZCBzdG9yZXMgdGhlCisgICAgICogcmVzdWx0IGludG8gdGhlIHNwZWNpZmllZCBhcnJheSBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IG9mZnNldC4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gaSB0aGUgaW50IGFycmF5LgotICAgICAqIEBwYXJhbSBvZmYgdGhlIG9mZnNldC4KLSAgICAgKiBAcGFyYW0gbGVuIHRoZSBudW1iZXIgb2YgaW50cyB0byBiZSByZWFkLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBpCisgICAgICogICAgICAgICAgICB0aGUgaW50ZWdlciBhcnJheS4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0LgorICAgICAqIEBwYXJhbSBsZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgaW50ZWdlciB0byBiZSByZWFkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICB2b2lkIHJlYWRGdWxseShpbnRbXSBpLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBsb25ncyBmcm9tIHRoZSBzdHJlYW0sIAotICAgICAqIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbnRvIHRoZSBzcGVjaWZpZWQgYXJyYXkgc3RhcnRpbmcgYXQgCi0gICAgICogdGhlIHNwZWNpZmllZCBpbmRleCBvZmZzZXQuIAorICAgICAqIFJlYWRzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGxvbmdzIGZyb20gdGhlIHN0cmVhbSwgYW5kIHN0b3JlcyB0aGUKKyAgICAgKiByZXN1bHQgaW50byB0aGUgc3BlY2lmaWVkIGFycmF5IHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggb2Zmc2V0LgogICAgICAqIAotICAgICAqIEBwYXJhbSBsIHRoZSBsb25nIGFycmF5LgotICAgICAqIEBwYXJhbSBvZmYgdGhlIG9mZnNldC4KLSAgICAgKiBAcGFyYW0gbGVuIHRoZSBudW1iZXIgb2YgbG9uZ3MgdG8gYmUgcmVhZC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gbAorICAgICAqICAgICAgICAgICAgdGhlIGxvbmcgYXJyYXkuCisgICAgICogQHBhcmFtIG9mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldC4KKyAgICAgKiBAcGFyYW0gbGVuCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGxvbmdzIHRvIGJlIHJlYWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHZvaWQgcmVhZEZ1bGx5KGxvbmdbXSBsLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBmbG9hdHMgZnJvbSB0aGUgc3RyZWFtLCAKLSAgICAgKiBhbmQgc3RvcmVzIHRoZSByZXN1bHQgaW50byB0aGUgc3BlY2lmaWVkIGFycmF5IHN0YXJ0aW5nIGF0IAotICAgICAqIHRoZSBzcGVjaWZpZWQgaW5kZXggb2Zmc2V0LiAKKyAgICAgKiBSZWFkcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBmbG9hdHMgZnJvbSB0aGUgc3RyZWFtLCBhbmQgc3RvcmVzIHRoZQorICAgICAqIHJlc3VsdCBpbnRvIHRoZSBzcGVjaWZpZWQgYXJyYXkgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBvZmZzZXQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGYgdGhlIGZsb2F0IGFycmF5LgotICAgICAqIEBwYXJhbSBvZmYgdGhlIG9mZnNldC4KLSAgICAgKiBAcGFyYW0gbGVuIHRoZSBudW1iZXIgb2YgZmxvYXRzIHRvIGJlIHJlYWQuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIGYKKyAgICAgKiAgICAgICAgICAgIHRoZSBmbG9hdCBhcnJheS4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0LgorICAgICAqIEBwYXJhbSBsZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZmxvYXRzIHRvIGJlIHJlYWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHZvaWQgcmVhZEZ1bGx5KGZsb2F0W10gZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmVhZHMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZG91YmxlcyBmcm9tIHRoZSBzdHJlYW0sIAotICAgICAqIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbnRvIHRoZSBzcGVjaWZpZWQgYXJyYXkgc3RhcnRpbmcgYXQgCi0gICAgICogdGhlIHNwZWNpZmllZCBpbmRleCBvZmZzZXQuIAorICAgICAqIFJlYWRzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGRvdWJsZXMgZnJvbSB0aGUgc3RyZWFtLCBhbmQgc3RvcmVzIHRoZQorICAgICAqIHJlc3VsdCBpbnRvIHRoZSBzcGVjaWZpZWQgYXJyYXkgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBvZmZzZXQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGQgdGhlIGRvdWJsZSBhcnJheS4KLSAgICAgKiBAcGFyYW0gb2ZmIHRoZSBvZmZzZXQuCi0gICAgICogQHBhcmFtIGxlbiB0aGUgbnVtYmVyIG9mIGRvdWJsZXMgdG8gYmUgcmVhZC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gZAorICAgICAqICAgICAgICAgICAgdGhlIGRvdWJsZSBhcnJheS4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0LgorICAgICAqIEBwYXJhbSBsZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZG91YmxlcyB0byBiZSByZWFkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICB2b2lkIHJlYWRGdWxseShkb3VibGVbXSBkLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKQEAgLTMyOCw4ICszMzksOCBAQAogICAgICAqIEdldHMgdGhlIHN0cmVhbSBwb3NpdGlvbi4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBzdHJlYW0gcG9zaXRpb24uCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIGxvbmcgZ2V0U3RyZWFtUG9zaXRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKQEAgLTMzNywxNyArMzQ4LDE4IEBACiAgICAgICogR2V0cyB0aGUgYml0IG9mZnNldC4KICAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBiaXQgb2Zmc2V0LgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBpbnQgZ2V0Qml0T2Zmc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgYml0IG9mZnNldCB0byBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgNy4gCisgICAgICogU2V0cyB0aGUgYml0IG9mZnNldCB0byBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgNy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYml0T2Zmc2V0IHRoZSBiaXQgb2Zmc2V0LgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBiaXRPZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBiaXQgb2Zmc2V0LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICB2b2lkIHNldEJpdE9mZnNldChpbnQgYml0T2Zmc2V0KSB0aHJvd3MgSU9FeGNlcHRpb247CiAKQEAgLTM1NSw5MCArMzY3LDk0IEBACiAgICAgICogUmVhZHMgYSBiaXQgZnJvbSB0aGUgc3RyZWFtIGFuZCByZXR1cm5zIHRoZSB2YWx1ZSAwIG9yIDEuCiAgICAgICogCiAgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2Ygc2luZ2xlIGJpdDogMCBvciAxLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBpbnQgcmVhZEJpdCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIFJlYWQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYml0cyBhbmQgcmV0dXJucyB0aGVpciB2YWx1ZXMgYXMgbG9uZy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbnVtQml0cyB0aGUgbnVtYmVyIG9mIGJpdHMgdG8gYmUgcmVhZC4KLSAgICAgKiAKKyAgICAgKiBAcGFyYW0gbnVtQml0cworICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBiaXRzIHRvIGJlIHJlYWQuCiAgICAgICogQHJldHVybiB0aGUgYml0IHN0cmluZyBhcyBhIGxvbmcuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIGxvbmcgcmVhZEJpdHMoaW50IG51bUJpdHMpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgc3RyZWFtLiAKLSAgICAgKiAgCi0gICAgICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJlYW0sIG9yIC0xIGlmIHVua25vd24uIAorICAgICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgc3RyZWFtLgogICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgc3RyZWFtLCBvciAtMSBpZiB1bmtub3duLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBsb25nIGxlbmd0aCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFNraXBlcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBieSBtb3Zpbmcgc3RyZWFtIHBvc2l0aW9uLiAKKyAgICAgKiBTa2lwcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBieSBtb3Zpbmcgc3RyZWFtIHBvc2l0aW9uLgogICAgICAqIAotICAgICAqIEBwYXJhbSBuIHRoZSBudW1iZXIgb2YgYnl0ZXMuCi0gICAgICogCisgICAgICogQHBhcmFtIG4KKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMuCiAgICAgICogQHJldHVybiB0aGUgYWN0dWFsIHNraXBwZWQgbnVtYmVyIG9mIGJ5dGVzLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBpbnQgc2tpcEJ5dGVzKGludCBuKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTa2lwZXMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgYnkgbW92aW5nIHN0cmVhbSBwb3NpdGlvbi4gCisgICAgICogU2tpcHMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgYnkgbW92aW5nIHN0cmVhbSBwb3NpdGlvbi4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gbiB0aGUgbnVtYmVyIG9mIGJ5dGVzLgotICAgICAqIAorICAgICAqIEBwYXJhbSBuCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzLgogICAgICAqIEByZXR1cm4gdGhlIGFjdHVhbCBza2lwcGVkIG51bWJlciBvZiBieXRlcy4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgbG9uZyBza2lwQnl0ZXMobG9uZyBuKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHN0cmVhbSBwb3NpdGlvbiB0byB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLiAKKyAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHN0cmVhbSBwb3NpdGlvbiB0byB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwb3MgYSBmaWxlIHBvaW50ZXIgcG9zaXRpb24uCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIHBvcworICAgICAqICAgICAgICAgICAgYSBmaWxlIHBvaW50ZXIgcG9zaXRpb24uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHZvaWQgc2Vlayhsb25nIHBvcykgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogTWFya3MgYSBwb3NpdGlvbiBpbiB0aGUgc3RyZWFtIHRvIGJlIHJldHVybmVkIHRvIGJ5IGEgc3Vic2VxdWVudCAKLSAgICAgKiBjYWxsIHRvIHJlc2V0LiAKKyAgICAgKiBNYXJrcyBhIHBvc2l0aW9uIGluIHRoZSBzdHJlYW0gdG8gYmUgcmV0dXJuZWQgdG8gYnkgYSBzdWJzZXF1ZW50IGNhbGwgdG8KKyAgICAgKiByZXNldC4KICAgICAgKi8KICAgICB2b2lkIG1hcmsoKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGZpbGUgcG9pbnRlciB0byBpdHMgcHJldmlvdXMgcG9zaXRpb24uCiAgICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBGbHVzaGVzIHRoZSBpbml0aWFsIHBvc2l0aW9uIGluIHRoaXMgc3RyZWFtIHByaW9yIHRvIHRoZQotICAgICAqIHNwZWNpZmllZCBzdHJlYW0gcG9zaXRpb24uCisgICAgICogRmx1c2hlcyB0aGUgaW5pdGlhbCBwb3NpdGlvbiBpbiB0aGlzIHN0cmVhbSBwcmlvciB0byB0aGUgc3BlY2lmaWVkIHN0cmVhbQorICAgICAqIHBvc2l0aW9uLgogICAgICAqIAotICAgICAqIEBwYXJhbSBwb3MgdGhlIHBvc2l0aW9uLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBwb3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb3NpdGlvbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgdm9pZCBmbHVzaEJlZm9yZShsb25nIHBvcykgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogRmx1c2hlcyB0aGUgaW5pdGlhbCBwb3NpdGlvbiBpbiB0aGlzIHN0cmVhbSBwcmlvciB0byB0aGUKLSAgICAgKiBjdXJyZW50IHN0cmVhbSBwb3NpdGlvbi4KKyAgICAgKiBGbHVzaGVzIHRoZSBpbml0aWFsIHBvc2l0aW9uIGluIHRoaXMgc3RyZWFtIHByaW9yIHRvIHRoZSBjdXJyZW50IHN0cmVhbQorICAgICAqIHBvc2l0aW9uLgogICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCkBAIC00NTAsMzYgKzQ2NiwzNyBAQAogICAgIGxvbmcgZ2V0Rmx1c2hlZFBvc2l0aW9uKCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBJbWFnZUlucHV0U3RyZWFtIGNhY2hlcyBkYXRhIGluIG9yZGVyIAotICAgICAqIHRvIGFsbG93IHNlZWtpbmcgYmFja3dhcmRzLgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIEltYWdlSW5wdXRTdHJlYW0gY2FjaGVzIGRhdGEgaW4gb3JkZXIgdG8gYWxsb3cKKyAgICAgKiBzZWVraW5nIGJhY2t3YXJkcy4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBJbWFnZUlucHV0U3RyZWFtIGNhY2hlcyBkYXRhIGluIG9yZGVyIAotICAgICAqIHRvIGFsbG93IHNlZWtpbmcgYmFja3dhcmRzLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiB0cnVlLCBpZiB0aGlzIEltYWdlSW5wdXRTdHJlYW0gY2FjaGVzIGRhdGEgaW4gb3JkZXIgdG8gYWxsb3cKKyAgICAgKiAgICAgICAgIHNlZWtpbmcgYmFja3dhcmRzLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgYm9vbGVhbiBpc0NhY2hlZCgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgSW1hZ2VJbnB1dFN0cmVhbSBjYWNoZXMgZGF0YSBpbiBvcmRlciAKLSAgICAgKiB0byBhbGxvdyBzZWVraW5nIGJhY2t3YXJkcywgYW5kIGtlZXBzIGl0IGluIG1lbW9yeS4KKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBJbWFnZUlucHV0U3RyZWFtIGNhY2hlcyBkYXRhIGluIG9yZGVyIHRvIGFsbG93CisgICAgICogc2Vla2luZyBiYWNrd2FyZHMsIGFuZCBrZWVwcyBpdCBpbiBtZW1vcnkuCiAgICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgSW1hZ2VJbnB1dFN0cmVhbSBjYWNoZXMgZGF0YSBpbiBvcmRlciAKLSAgICAgKiB0byBhbGxvdyBzZWVraW5nIGJhY2t3YXJkcywgYW5kIGtlZXBzIGl0IGluIG1lbW9yeS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgSW1hZ2VJbnB1dFN0cmVhbSBjYWNoZXMgZGF0YSBpbiBvcmRlciB0byBhbGxvdworICAgICAqICAgICAgICAgc2Vla2luZyBiYWNrd2FyZHMsIGFuZCBrZWVwcyBpdCBpbiBtZW1vcnkuCiAgICAgICovCiAgICAgYm9vbGVhbiBpc0NhY2hlZE1lbW9yeSgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgSW1hZ2VJbnB1dFN0cmVhbSBjYWNoZXMgZGF0YSBpbiBvcmRlciAKLSAgICAgKiB0byBhbGxvdyBzZWVraW5nIGJhY2t3YXJkcywgYW5kIGtlZXBzIGl0IGluIGEgdGVtcG9yYXJ5IGZpbGUuCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgSW1hZ2VJbnB1dFN0cmVhbSBjYWNoZXMgZGF0YSBpbiBvcmRlciB0byBhbGxvdworICAgICAqIHNlZWtpbmcgYmFja3dhcmRzLCBhbmQga2VlcHMgaXQgaW4gYSB0ZW1wb3JhcnkgZmlsZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBJbWFnZUlucHV0U3RyZWFtIGNhY2hlcyBkYXRhIGluIG9yZGVyIAotICAgICAqIHRvIGFsbG93IHNlZWtpbmcgYmFja3dhcmRzLCBhbmQga2VlcHMgaXQgaW4gYSB0ZW1wb3JhcnkgZmlsZS4KKyAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoaXMgSW1hZ2VJbnB1dFN0cmVhbSBjYWNoZXMgZGF0YSBpbiBvcmRlciB0byBhbGxvdworICAgICAqICAgICAgICAgc2Vla2luZyBiYWNrd2FyZHMsIGFuZCBrZWVwcyBpdCBpbiBhIHRlbXBvcmFyeSBmaWxlLgogICAgICAqLwogICAgIGJvb2xlYW4gaXNDYWNoZWRGaWxlKCk7CiAKICAgICAvKioKICAgICAgKiBDbG9zZXMgdGhpcyBzdHJlYW0uCiAgICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb247CiB9CmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9zdHJlYW0vSW1hZ2VJbnB1dFN0cmVhbUltcGwuamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL3N0cmVhbS9JbWFnZUlucHV0U3RyZWFtSW1wbC5qYXZhCmluZGV4IDgzYWMxM2EuLmQ3OWRhNDEgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL3N0cmVhbS9JbWFnZUlucHV0U3RyZWFtSW1wbC5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL3N0cmVhbS9JbWFnZUlucHV0U3RyZWFtSW1wbC5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBAYXV0aG9yIFJ1c3RlbSBWLiBSYWZpa292CiAgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMyAkCiAgKi8KKwogcGFja2FnZSBqYXZheC5pbWFnZWlvLnN0cmVhbTsKIAogaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOwpAQCAtMjUsMzggKzI2LDU0IEBACiBpbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOwogCiAvKioKLSAqIFRoZSBJbWFnZUlucHV0U3RyZWFtSW1wbCBhYnN0cmFjdCBjbGFzcyBpbXBsZW1lbnRzCi0gKiB0aGUgSW1hZ2VJbnB1dFN0cmVhbSBpbnRlcmZhY2UuCisgKiBUaGUgSW1hZ2VJbnB1dFN0cmVhbUltcGwgYWJzdHJhY3QgY2xhc3MgaW1wbGVtZW50cyB0aGUgSW1hZ2VJbnB1dFN0cmVhbQorICogaW50ZXJmYWNlLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEltYWdlSW5wdXRTdHJlYW1JbXBsIGltcGxlbWVudHMgSW1hZ2VJbnB1dFN0cmVhbSB7CiAKLSAgICAvKiogVGhlIGJ5dGUgb3JkZXIuICovCisgICAgLyoqCisgICAgICogVGhlIGJ5dGUgb3JkZXIuCisgICAgICovCiAgICAgcHJvdGVjdGVkIEJ5dGVPcmRlciBieXRlT3JkZXIgPSBCeXRlT3JkZXIuQklHX0VORElBTjsKIAotICAgIC8qKiBUaGUgc3RyZWFtIHBvc2l0aW9uLiAqLworICAgIC8qKgorICAgICAqIFRoZSBzdHJlYW0gcG9zaXRpb24uCisgICAgICovCiAgICAgcHJvdGVjdGVkIGxvbmcgc3RyZWFtUG9zID0gMDsKLSAgICAKLSAgICAvKiogVGhlIGZsdXNoZWQgcG9zaXRpb24uICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgZmx1c2hlZCBwb3NpdGlvbi4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgbG9uZyBmbHVzaGVkUG9zID0gMDsKLSAgICAKLSAgICAvKiogVGhlIGJpdCBvZmZzZXQuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgYml0IG9mZnNldC4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IGJpdE9mZnNldCA9IDA7CiAKLSAgICAvKiogVGhlIGNsb3NlZC4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY2xvc2VkLgorICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBjbG9zZWQgPSBmYWxzZTsKIAotICAgIC8qKiBUaGUgcG9zaXRpb24gc3RhY2suICovCisgICAgLyoqCisgICAgICogVGhlIHBvc2l0aW9uIHN0YWNrLgorICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgUG9zaXRpb25TdGFjayBwb3NTdGFjayA9IG5ldyBQb3NpdGlvblN0YWNrKCk7CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgSW1hZ2VJbnB1dFN0cmVhbUltcGwuCiAgICAgICovCi0gICAgcHVibGljIEltYWdlSW5wdXRTdHJlYW1JbXBsKCkge30KKyAgICBwdWJsaWMgSW1hZ2VJbnB1dFN0cmVhbUltcGwoKSB7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogQ2hlY2sgaWYgdGhlIHN0cmVhbSBpcyBjbG9zZWQgYW5kIGlmIHRydWUsIHRocm93cyBhbiBJT0V4Y2VwdGlvbi4KICAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCB0aGUgc3RyZWFtIGlzIGNsb3NlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHN0cmVhbSBpcyBjbG9zZWQuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgY2hlY2tDbG9zZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAoY2xvc2VkKSB7CkBAIC0xMDYsNyArMTIzLDcgQEAKICAgICAgICAgaWYgKGIgPCAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgRU9GRXhjZXB0aW9uKCJFT0YgcmVhY2hlZCIpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoYnl0ZSkgYjsKKyAgICAgICAgcmV0dXJuIChieXRlKWI7CiAgICAgfQogCiAgICAgcHVibGljIGludCByZWFkVW5zaWduZWRCeXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTEyNSw1OCArMTQyLDU3IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgRU9GRXhjZXB0aW9uKCJFT0YgcmVhY2hlZCIpOwogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIGJ5dGVPcmRlciA9PSBCeXRlT3JkZXIuQklHX0VORElBTiA/Ci0gICAgICAgICAgICAgICAgKHNob3J0KSAoKGIxIDw8IDgpIHwgKGIyICYgMHhmZikpIDoKLSAgICAgICAgICAgICAgICAoc2hvcnQpICgoYjIgPDwgOCkgfCAoYjEgJiAweGZmKSk7CisgICAgICAgIHJldHVybiBieXRlT3JkZXIgPT0gQnl0ZU9yZGVyLkJJR19FTkRJQU4gPyAoc2hvcnQpKChiMSA8PCA4KSB8IChiMiAmIDB4ZmYpKQorICAgICAgICAgICAgICAgIDogKHNob3J0KSgoYjIgPDwgOCkgfCAoYjEgJiAweGZmKSk7CiAgICAgfQogCiAgICAgcHVibGljIGludCByZWFkVW5zaWduZWRTaG9ydCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vLS0gVE9ETyBpbXBsZW1lbnQKKyAgICAgICAgLy8gLS0gVE9ETyBpbXBsZW1lbnQKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgcHVibGljIGNoYXIgcmVhZENoYXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvLy0tIFRPRE8gaW1wbGVtZW50CisgICAgICAgIC8vIC0tIFRPRE8gaW1wbGVtZW50CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwogICAgIH0KIAogICAgIHB1YmxpYyBpbnQgcmVhZEludCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vLS0gVE9ETyBpbXBsZW1lbnQKKyAgICAgICAgLy8gLS0gVE9ETyBpbXBsZW1lbnQKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgcHVibGljIGxvbmcgcmVhZFVuc2lnbmVkSW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8tLSBUT0RPIGltcGxlbWVudAorICAgICAgICAvLyAtLSBUT0RPIGltcGxlbWVudAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICBwdWJsaWMgbG9uZyByZWFkTG9uZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vLS0gVE9ETyBpbXBsZW1lbnQKKyAgICAgICAgLy8gLS0gVE9ETyBpbXBsZW1lbnQKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgcHVibGljIGZsb2F0IHJlYWRGbG9hdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vLS0gVE9ETyBpbXBsZW1lbnQKKyAgICAgICAgLy8gLS0gVE9ETyBpbXBsZW1lbnQKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgcHVibGljIGRvdWJsZSByZWFkRG91YmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8tLSBUT0RPIGltcGxlbWVudAorICAgICAgICAvLyAtLSBUT0RPIGltcGxlbWVudAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICBwdWJsaWMgU3RyaW5nIHJlYWRMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8tLSBUT0RPIGltcGxlbWVudAorICAgICAgICAvLyAtLSBUT0RPIGltcGxlbWVudAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICBwdWJsaWMgU3RyaW5nIHJlYWRVVEYoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvLy0tIFRPRE8gaW1wbGVtZW50CisgICAgICAgIC8vIC0tIFRPRE8gaW1wbGVtZW50CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHJlYWRGdWxseShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8tLSBUT0RPIGltcGxlbWVudAorICAgICAgICAvLyAtLSBUT0RPIGltcGxlbWVudAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKQEAgLTE4NSwzMiArMjAxLDMyIEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgcmVhZEZ1bGx5KHNob3J0W10gcywgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8tLSBUT0RPIGltcGxlbWVudAorICAgICAgICAvLyAtLSBUT0RPIGltcGxlbWVudAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCByZWFkRnVsbHkoY2hhcltdIGMsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vLS0gVE9ETyBpbXBsZW1lbnQKKyAgICAgICAgLy8gLS0gVE9ETyBpbXBsZW1lbnQKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgcmVhZEZ1bGx5KGludFtdIGksIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vLS0gVE9ETyBpbXBsZW1lbnQKKyAgICAgICAgLy8gLS0gVE9ETyBpbXBsZW1lbnQKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgcmVhZEZ1bGx5KGxvbmdbXSBsLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvLy0tIFRPRE8gaW1wbGVtZW50CisgICAgICAgIC8vIC0tIFRPRE8gaW1wbGVtZW50CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHJlYWRGdWxseShmbG9hdFtdIGYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vLS0gVE9ETyBpbXBsZW1lbnQKKyAgICAgICAgLy8gLS0gVE9ETyBpbXBsZW1lbnQKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgcmVhZEZ1bGx5KGRvdWJsZVtdIGQsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vLS0gVE9ETyBpbXBsZW1lbnQKKyAgICAgICAgLy8gLS0gVE9ETyBpbXBsZW1lbnQKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCkBAIC0yMzAsMTIgKzI0NiwxMiBAQAogICAgIH0KIAogICAgIHB1YmxpYyBpbnQgcmVhZEJpdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vLS0gVE9ETyBpbXBsZW1lbnQKKyAgICAgICAgLy8gLS0gVE9ETyBpbXBsZW1lbnQKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgcHVibGljIGxvbmcgcmVhZEJpdHMoaW50IG51bUJpdHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vLS0gVE9ETyBpbXBsZW1lbnQKKyAgICAgICAgLy8gLS0gVE9ETyBpbXBsZW1lbnQKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCkBAIC0yNDQsMTIgKzI2MCwxMiBAQAogICAgIH0KIAogICAgIHB1YmxpYyBpbnQgc2tpcEJ5dGVzKGludCBuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvLy0tIFRPRE8gaW1wbGVtZW50CisgICAgICAgIC8vIC0tIFRPRE8gaW1wbGVtZW50CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwogICAgIH0KIAogICAgIHB1YmxpYyBsb25nIHNraXBCeXRlcyhsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vLS0gVE9ETyBpbXBsZW1lbnQKKyAgICAgICAgLy8gLS0gVE9ETyBpbXBsZW1lbnQKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCkBAIC0yNzIsNyArMjg4LDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vLS0gVE9ETyBiaXQgcG9zCisgICAgICAgIC8vIC0tIFRPRE8gYml0IHBvcwogICAgICAgICBpZiAoIXBvc1N0YWNrLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgbG9uZyBwID0gcG9zU3RhY2sucG9wKCk7CiAgICAgICAgICAgICBpZiAocCA8IGZsdXNoZWRQb3MpIHsKQEAgLTI5MCw3ICszMDYsNyBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIlRyeWluZyB0byBmbHVzaCB3aXRoaW4gYWxyZWFkeSBmbHVzaGVkIHBvcnRpb24iKTsKICAgICAgICAgfQogICAgICAgICBmbHVzaGVkUG9zID0gcG9zOwotICAgICAgICAvLy0tIFRPRE8gaW1wbGVtZW50CisgICAgICAgIC8vIC0tIFRPRE8gaW1wbGVtZW50CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMzAyLDE1ICszMTgsMTUgQEAKICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiBpc0NhY2hlZCgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOyAvL2RlZgorICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGRlZgogICAgIH0KIAogICAgIHB1YmxpYyBib29sZWFuIGlzQ2FjaGVkTWVtb3J5KCkgewotICAgICAgICByZXR1cm4gZmFsc2U7IC8vZGVmCisgICAgICAgIHJldHVybiBmYWxzZTsgLy8gZGVmCiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gaXNDYWNoZWRGaWxlKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7IC8vZGVmCisgICAgICAgIHJldHVybiBmYWxzZTsgLy8gZGVmCiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMzIyLDcgKzMzOCw4IEBACiAgICAgLyoqCiAgICAgICogRmluYWxpemVzIHRoaXMgb2JqZWN0LgogICAgICAqIAotICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlIGlmIGFuIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAdGhyb3dzIFRocm93YWJsZQorICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3Vycy4KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewpAQCAtMzM5LDI1ICszNTYsMzEgQEAKICAgICAgKiBUaGUgQ2xhc3MgUG9zaXRpb25TdGFjay4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQb3NpdGlvblN0YWNrIHsKLSAgICAgICAgCi0gICAgICAgIC8qKiBUaGUgQ29uc3RhbnQgU0laRS4gKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIENvbnN0YW50IFNJWkUuCisgICAgICAgICAqLwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRSA9IDEwOwogCi0gICAgICAgIC8qKiBUaGUgdmFsdWVzLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHZhbHVlcy4KKyAgICAgICAgICovCiAgICAgICAgIHByaXZhdGUgbG9uZ1tdIHZhbHVlcyA9IG5ldyBsb25nW1NJWkVdOwotICAgICAgICAKLSAgICAgICAgLyoqIFRoZSBwb3MuICovCi0gICAgICAgIHByaXZhdGUgaW50IHBvcyA9IDA7CiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBwb3MuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGludCBwb3MgPSAwOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBQdXNoLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHYgdGhlIHYKKyAgICAgICAgICogQHBhcmFtIHYKKyAgICAgICAgICogICAgICAgICAgICB0aGUgdi4KICAgICAgICAgICovCiAgICAgICAgIHZvaWQgcHVzaChsb25nIHYpIHsKICAgICAgICAgICAgIGlmIChwb3MgPj0gdmFsdWVzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIGVuc3VyZShwb3MrMSk7CisgICAgICAgICAgICAgICAgZW5zdXJlKHBvcyArIDEpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgdmFsdWVzW3BvcysrXSA9IHY7CiAgICAgICAgIH0KQEAgLTM2NSw3ICszODgsNyBAQAogICAgICAgICAvKioKICAgICAgICAgICogUG9wLgogICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgbG9uZworICAgICAgICAgKiBAcmV0dXJuIHRoZSBsb25nLgogICAgICAgICAgKi8KICAgICAgICAgbG9uZyBwb3AoKSB7CiAgICAgICAgICAgICByZXR1cm4gdmFsdWVzWy0tcG9zXTsKQEAgLTM3NCw3ICszOTcsNyBAQAogICAgICAgICAvKioKICAgICAgICAgICogQ2hlY2tzIGlmIGlzIGVtcHR5LgogICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0cnVlLCBpZiBpcyBlbXB0eQorICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIGlzIGVtcHR5LgogICAgICAgICAgKi8KICAgICAgICAgYm9vbGVhbiBpc0VtcHR5KCkgewogICAgICAgICAgICAgcmV0dXJuIHBvcyA9PSAwOwpAQCAtMzgzLDcgKzQwNiw4IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBFbnN1cmUuCiAgICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZQorICAgICAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBzaXplLgogICAgICAgICAgKi8KICAgICAgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZShpbnQgc2l6ZSkgewogICAgICAgICAgICAgbG9uZ1tdIGFyciA9IG5ldyBsb25nW01hdGgubWF4KDIgKiB2YWx1ZXMubGVuZ3RoLCBzaXplKV07CmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9zdHJlYW0vSW1hZ2VPdXRwdXRTdHJlYW0uamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL3N0cmVhbS9JbWFnZU91dHB1dFN0cmVhbS5qYXZhCmluZGV4IGU1OWI2OWQuLjI4ZWM5MzIgMTAwNjQ0Ci0tLSBhL2F3dC9qYXZheC9pbWFnZWlvL3N0cmVhbS9JbWFnZU91dHB1dFN0cmVhbS5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL3N0cmVhbS9JbWFnZU91dHB1dFN0cmVhbS5qYXZhCkBAIC0xOCwyNTIgKzE4LDI4OSBAQAogICogQGF1dGhvciBSdXN0ZW0gVi4gUmFmaWtvdgogICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjIgJAogICovCisKIHBhY2thZ2UgamF2YXguaW1hZ2Vpby5zdHJlYW07CiAKIGltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXQ7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAogLyoqCi0gKiBUaGUgSW1hZ2VPdXRwdXRTdHJlYW0gcmVwcmVzZW50cyBvdXRwdXQgc3RyZWFtIGludGVyZmFjZSB0aGF0IGlzIAotICogdXNlZCBieSBJbWFnZVdyaXRlcnMuCisgKiBUaGUgSW1hZ2VPdXRwdXRTdHJlYW0gcmVwcmVzZW50cyBvdXRwdXQgc3RyZWFtIGludGVyZmFjZSB0aGF0IGlzIHVzZWQgYnkKKyAqIEltYWdlV3JpdGVycy4KKyAqIAorICogQHNpbmNlIEFuZHJvaWQgMS4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSW1hZ2VPdXRwdXRTdHJlYW0gZXh0ZW5kcyBEYXRhT3V0cHV0LCBJbWFnZUlucHV0U3RyZWFtIHsKIAogICAgIC8qKgotICAgICAqIFdyaXRlcyBhIHNpbmdsZSBieXRlIHRvIHRoZSBzdHJlYW0gYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uIAorICAgICAqIFdyaXRlcyBhIHNpbmdsZSBieXRlIHRvIHRoZSBzdHJlYW0gYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIGIgdGhlIGludCB2YWx1ZSwgb2Ygd2hpY2ggdGhlIDggbG93ZXN0IGJpdHMgCi0gICAgICogd2lsbCBiZSB3cml0dGVuLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgaW50ZWdlciB2YWx1ZSwgb2Ygd2hpY2ggdGhlIDggbG93ZXN0IGJpdHMgd2lsbCBiZSB3cml0dGVuLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKICAgICAgKiBXcml0ZXMgdGhlIGJ5dGVzIGFycmF5IHRvIHRoZSBzdHJlYW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIGIgdGhlIGJ5dGUgYXJyYXkgdG8gYmUgd3JpdHRlbi4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgYXJyYXkgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgdm9pZCB3cml0ZShieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIGEgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIHNwZWNpZmllZCBieXRlIGFycmF5Ci0gICAgICogYmVnZ2luaW5nIGZyb20gdGhlIHNwZWNpZmllZCBvZmZzZXQuCisgICAgICogV3JpdGVzIGEgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIHNwZWNpZmllZCBieXRlIGFycmF5IGJlZ2lubmluZyBmcm9tIHRoZQorICAgICAqIHNwZWNpZmllZCBvZmZzZXQuCiAgICAgICogCi0gICAgICogQHBhcmFtIGIgdGhlIGJ5dGUgYXJyYXkuCi0gICAgICogQHBhcmFtIG9mZiB0aGUgb2Zmc2V0LgotICAgICAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSB3cml0dGVuLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSBhcnJheS4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0LgorICAgICAqIEBwYXJhbSBsZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBzcGVjaWZpZWQgYm9vbGVhbiB2YWx1ZSB0byB0aGUgc3RyZWFtLCAxIGlmIGl0IGlzIHRydWUsCi0gICAgICogMCBpZiBpdCBpcyBmYWxzZS4KKyAgICAgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCBib29sZWFuIHZhbHVlIHRvIHRoZSBzdHJlYW0sIDEgaWYgaXQgaXMgdHJ1ZSwgMCBpZgorICAgICAqIGl0IGlzIGZhbHNlLgogICAgICAqIAotICAgICAqIEBwYXJhbSBiIHRoZSBib29sZWFuIHZhbHVlIHRvIGJlIHdyaXR0ZW4uCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBib29sZWFuIHZhbHVlIHRvIGJlIHdyaXR0ZW4uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHZvaWQgd3JpdGVCb29sZWFuKGJvb2xlYW4gYikgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSA4IGxvd2VzdCBiaXRzIG9mIHRoZSBzcGVjaWZpZWQgaW50IHZhbHVlIHRvIHRoZSBzdHJlYW0uIAorICAgICAqIFdyaXRlcyB0aGUgOCBsb3dlc3QgYml0cyBvZiB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUgdG8gdGhlIHN0cmVhbS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gYiB0aGUgc3BlY2lmaWVkIGludCB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICB2b2lkIHdyaXRlQnl0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIGEgc2hvcnQgdmFsdWUgdG8gdGhlIG91dHB1dCBzdHJlYW0uIAorICAgICAqIFdyaXRlcyBhIHNob3J0IHZhbHVlIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgogICAgICAqIAotICAgICAqIEBwYXJhbSB2IHRoZSBzaG9ydCB2YWx1ZSB0byBiZSB3cml0dGVuLiAKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gdgorICAgICAqICAgICAgICAgICAgdGhlIHNob3J0IHZhbHVlIHRvIGJlIHdyaXR0ZW4uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHZvaWQgd3JpdGVTaG9ydChpbnQgdikgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSAxNiBsb3dlc3QgYml0cyBvZiB0aGUgc3BlY2lmaWVkIGludCB2YWx1ZSB0byB0aGUgc3RyZWFtLgorICAgICAqIFdyaXRlcyB0aGUgMTYgbG93ZXN0IGJpdHMgb2YgdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlIHRvIHRoZSBzdHJlYW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIHYgdGhlIHNwZWNpZmllZCBpbnQgdmFsdWUuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIHYKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgdm9pZCB3cml0ZUNoYXIoaW50IHYpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFdyaXRlcyBhbiBpbnRlZ2VyIHZhbHVlIHRvIHRoZSBvdXRwdXQgc3RyZWFtLiAKKyAgICAgKiBXcml0ZXMgYW4gaW50ZWdlciB2YWx1ZSB0byB0aGUgb3V0cHV0IHN0cmVhbS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdiB0aGUgaW50ZWdlciB2YWx1ZSB0byBiZSB3cml0dGVuLiAKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gdgorICAgICAqICAgICAgICAgICAgdGhlIGludGVnZXIgdmFsdWUgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgdm9pZCB3cml0ZUludChpbnQgdikgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCiAgICAgICogV3JpdGUgbG9uZy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gdiB0aGUgbG9uZyB2YWx1ZQotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSB2CisgICAgICogICAgICAgICAgICB0aGUgbG9uZyB2YWx1ZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgdm9pZCB3cml0ZUxvbmcobG9uZyB2KSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgYSBmbG9hdCB2YWx1ZSB0byB0aGUgb3V0cHV0IHN0cmVhbS4gCisgICAgICogV3JpdGVzIGEgZmxvYXQgdmFsdWUgdG8gdGhlIG91dHB1dCBzdHJlYW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIHYgdGhlIGZsb2F0IHdoaWNoIGNvbnRhaW5zIHZhbHVlIHRvIGJlIHdyaXR0ZW4uIAotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSB2CisgICAgICogICAgICAgICAgICB0aGUgZmxvYXQgd2hpY2ggY29udGFpbnMgdmFsdWUgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgdm9pZCB3cml0ZUZsb2F0KGZsb2F0IHYpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFdyaXRlcyBhIGRvdWJsZSB2YWx1ZSB0byB0aGUgb3V0cHV0IHN0cmVhbS4gCisgICAgICogV3JpdGVzIGEgZG91YmxlIHZhbHVlIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgogICAgICAqIAotICAgICAqIEBwYXJhbSB2IHRoZSBkb3VibGUgd2hpY2ggY29udGFpbnMgdmFsdWUgdG8gYmUgd3JpdHRlbi4gCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIHYKKyAgICAgKiAgICAgICAgICAgIHRoZSBkb3VibGUgd2hpY2ggY29udGFpbnMgdmFsdWUgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgdikgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCiAgICAgICogV3JpdGVzIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzdHJlYW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIHMgdGhlIHN0cmluZyB0byBiZSB3cml0dGVuLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGJlIHdyaXR0ZW4uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHZvaWQgd3JpdGVCeXRlcyhTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCiAgICAgICogV3JpdGVzIHRoZSBzcGVjaWZpZWQgU3RyaW5nIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzIHRoZSBTdHJpbmcgdG8gYmUgd3JpdHRlbi4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gcworICAgICAqICAgICAgICAgICAgdGhlIFN0cmluZyB0byBiZSB3cml0dGVuLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICB2b2lkIHdyaXRlQ2hhcnMoU3RyaW5nIHMpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFdyaXRlcyAyIGJ5dGVzIHRvIHRoZSBvdXRwdXQgc3RyZWFtIGluIAotICAgICAqIHRoZSBtb2RpZmllZCBVVEYtOCAgcmVwcmVzZW50YXRpb24gb2YgZXZlcnkgY2hhcmFjdGVyIG9mCi0gICAgICogdGhlIHNwZWNpZmllZCBzdHJpbmcuICAgICAgCisgICAgICogV3JpdGVzIDIgYnl0ZXMgdG8gdGhlIG91dHB1dCBzdHJlYW0gaW4gdGhlIG1vZGlmaWVkIFVURi04IHJlcHJlc2VudGF0aW9uCisgICAgICogb2YgZXZlcnkgY2hhcmFjdGVyIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5nLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIGJlIHdyaXR0ZW4uCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIGJlIHdyaXR0ZW4uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHZvaWQgd3JpdGVVVEYoU3RyaW5nIHMpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIEZsdXNoZXMgdGhlIGluaXRpYWwgcG9zaXRpb24gaW4gdGhpcyBzdHJlYW0gcHJpb3IgdG8gdGhlCi0gICAgICogc3BlY2lmaWVkIHN0cmVhbSBwb3NpdGlvbi4KKyAgICAgKiBGbHVzaGVzIHRoZSBpbml0aWFsIHBvc2l0aW9uIGluIHRoaXMgc3RyZWFtIHByaW9yIHRvIHRoZSBzcGVjaWZpZWQgc3RyZWFtCisgICAgICogcG9zaXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIHBvcyB0aGUgcG9zaXRpb24uCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIHBvcworICAgICAqICAgICAgICAgICAgdGhlIHBvc2l0aW9uLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICB2b2lkIGZsdXNoQmVmb3JlKGxvbmcgcG9zKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKLQogICAgIC8qKgotICAgICAqIFdyaXRlcyBhIGxlbiBudW1iZXIgb2Ygc2hvcnQgdmFsdWVzIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheQotICAgICAqIHRvIHRoZSBzdHJlYW0uCisgICAgICogV3JpdGVzIGEgbGVuIG51bWJlciBvZiBzaG9ydCB2YWx1ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IHRvIHRoZQorICAgICAqIHN0cmVhbS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gcyB0aGUgc2hvcnRzIGFycmF5IHRvIGJlIHdyaXR0ZW4uCi0gICAgICogQHBhcmFtIG9mZiB0aGUgb2Zmc2V0IGluIHRoZSBjaGFyIGFycmF5LgotICAgICAqIEBwYXJhbSBsZW4gdGhlIGxlbmd0aCBvZiBjaGFycyB0byBiZSB3cml0dGVuLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICB0aGUgc2hvcnRzIGFycmF5IHRvIGJlIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIG9mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgY2hhciBhcnJheS4KKyAgICAgKiBAcGFyYW0gbGVuCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIGNoYXJzIHRvIGJlIHdyaXR0ZW4uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHZvaWQgd3JpdGVTaG9ydHMoc2hvcnRbXSBzLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKICAgICAgKiBXcml0ZXMgYSBsZW4gbnVtYmVyIG9mIGNoYXJzIHRvIHRoZSBzdHJlYW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIGMgdGhlIGNoYXIgYXJyYXkgdG8gYmUgd3JpdHRlbi4KLSAgICAgKiBAcGFyYW0gb2ZmIHRoZSBvZmZzZXQgaW4gdGhlIGNoYXIgYXJyYXkuCi0gICAgICogQHBhcmFtIGxlbiB0aGUgbGVuZ3RoIG9mIGNoYXJzIHRvIGJlIHdyaXR0ZW4uCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIGMKKyAgICAgKiAgICAgICAgICAgIHRoZSBjaGFyIGFycmF5IHRvIGJlIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIG9mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgY2hhciBhcnJheS4KKyAgICAgKiBAcGFyYW0gbGVuCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIGNoYXJzIHRvIGJlIHdyaXR0ZW4uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHZvaWQgd3JpdGVDaGFycyhjaGFyW10gYywgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIGEgbGVuIG51bWJlciBvZiBpbnQgdmFsdWVzIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheQotICAgICAqIHRvIHRoZSBzdHJlYW0uCisgICAgICogV3JpdGVzIGEgbGVuIG51bWJlciBvZiBpbnRlZ2VyIHZhbHVlcyBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgdG8gdGhlCisgICAgICogc3RyZWFtLgogICAgICAqIAotICAgICAqIEBwYXJhbSBpIHRoZSBpbnQgYXJyYXkgdG8gYmUgd3JpdHRlbi4KLSAgICAgKiBAcGFyYW0gb2ZmIHRoZSBvZmZzZXQgaW4gdGhlIGNoYXIgYXJyYXkuCi0gICAgICogQHBhcmFtIGxlbiB0aGUgbGVuZ3RoIG9mIGNoYXJzIHRvIGJlIHdyaXR0ZW4uCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIGkKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlZ2VyIGFycmF5IHRvIGJlIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIG9mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgY2hhciBhcnJheS4KKyAgICAgKiBAcGFyYW0gbGVuCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIGNoYXJzIHRvIGJlIHdyaXR0ZW4uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHZvaWQgd3JpdGVJbnRzKGludFtdIGksIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFdyaXRlcyBhIGxlbiBudW1iZXIgb2YgbG9uZyB2YWx1ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5Ci0gICAgICogdG8gdGhlIHN0cmVhbS4KKyAgICAgKiBXcml0ZXMgYSBsZW4gbnVtYmVyIG9mIGxvbmcgdmFsdWVzIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSB0byB0aGUKKyAgICAgKiBzdHJlYW0uCiAgICAgICogCi0gICAgICogQHBhcmFtIGwgdGhlIGxvbmcgYXJyYXkgdG8gYmUgd3JpdHRlbi4KLSAgICAgKiBAcGFyYW0gb2ZmIHRoZSBvZmZzZXQgaW4gdGhlIGNoYXIgYXJyYXkuCi0gICAgICogQHBhcmFtIGxlbiB0aGUgbGVuZ3RoIG9mIGNoYXJzIHRvIGJlIHdyaXR0ZW4uCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIGwKKyAgICAgKiAgICAgICAgICAgIHRoZSBsb25nIGFycmF5IHRvIGJlIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIG9mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgY2hhciBhcnJheS4KKyAgICAgKiBAcGFyYW0gbGVuCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIGNoYXJzIHRvIGJlIHdyaXR0ZW4uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHZvaWQgd3JpdGVMb25ncyhsb25nW10gbCwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIGEgbGVuIG51bWJlciBvZiBmbG9hdCB2YWx1ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5Ci0gICAgICogdG8gdGhlIHN0cmVhbS4KKyAgICAgKiBXcml0ZXMgYSBsZW4gbnVtYmVyIG9mIGZsb2F0IHZhbHVlcyBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgdG8gdGhlCisgICAgICogc3RyZWFtLgogICAgICAqIAotICAgICAqIEBwYXJhbSBmIHRoZSBmbG9hdCBhcnJheSB0byBiZSB3cml0dGVuLgotICAgICAqIEBwYXJhbSBvZmYgdGhlIG9mZnNldCBpbiB0aGUgY2hhciBhcnJheS4KLSAgICAgKiBAcGFyYW0gbGVuIHRoZSBsZW5ndGggb2YgY2hhcnMgdG8gYmUgd3JpdHRlbi4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gZgorICAgICAqICAgICAgICAgICAgdGhlIGZsb2F0IGFycmF5IHRvIGJlIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIG9mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgY2hhciBhcnJheS4KKyAgICAgKiBAcGFyYW0gbGVuCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIGNoYXJzIHRvIGJlIHdyaXR0ZW4uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHZvaWQgd3JpdGVGbG9hdHMoZmxvYXRbXSBmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgYSBsZW4gbnVtYmVyIG9mIGRvdWJsZSB2YWx1ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5Ci0gICAgICogdG8gdGhlIHN0cmVhbS4KKyAgICAgKiBXcml0ZXMgYSBsZW4gbnVtYmVyIG9mIGRvdWJsZSB2YWx1ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IHRvIHRoZQorICAgICAqIHN0cmVhbS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZCB0aGUgZG91YmxlIGFycmF5IHRvIGJlIHdyaXR0ZW4uCi0gICAgICogQHBhcmFtIG9mZiB0aGUgb2Zmc2V0IGluIHRoZSBjaGFyIGFycmF5LgotICAgICAqIEBwYXJhbSBsZW4gdGhlIGxlbmd0aCBvZiBjaGFycyB0byBiZSB3cml0dGVuLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEBwYXJhbSBkCisgICAgICogICAgICAgICAgICB0aGUgZG91YmxlIGFycmF5IHRvIGJlIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIG9mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBpbiB0aGUgY2hhciBhcnJheS4KKyAgICAgKiBAcGFyYW0gbGVuCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIGNoYXJzIHRvIGJlIHdyaXR0ZW4uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHZvaWQgd3JpdGVEb3VibGVzKGRvdWJsZVtdIGQsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIFdyaXRlcyBhIHNpbmdsZSBiaXQgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uCiAgICAgICogCi0gICAgICogQHBhcmFtIGJpdCB0aGUgYW4gaW50IHdob3NlIGxlYXN0IHNpZ25pZmljYW50IGJpdCBpcyB0byBiZSAKLSAgICAgKiB3cml0dGVuIHRvIHRoZSBzdHJlYW0uCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBTaWduYWxzIHRoYXQgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICogQHBhcmFtIGJpdAorICAgICAqICAgICAgICAgICAgdGhlIGludGVnZXIgd2hvc2UgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IGlzIHRvIGJlIHdyaXR0ZW4gdG8KKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJlYW0uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgogICAgICAqLwogICAgIHZvaWQgd3JpdGVCaXQoaW50IGJpdCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIGEgc2VxdWVuY2Ugb2YgYml0cyBiZWdnaW5pbmcgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyAgICAgKiBXcml0ZXMgYSBzZXF1ZW5jZSBvZiBiaXRzIGJlZ2lubmluZyBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uLgogICAgICAqIAotICAgICAqIEBwYXJhbSBiaXRzIGEgbG9uZyB2YWx1ZSBjb250YWluaW5nIHRoZSBiaXRzIHRvIGJlIHdyaXR0ZW4sCi0gICAgICogc3RhcnRpbmcgd2l0aCB0aGUgYml0IGluIHBvc2l0aW9uIG51bUJpdHMgLSAxIGRvd24gdG8gdGhlIAotICAgICAqIGxlYXN0IHNpZ25pZmljYW50IGJpdC4KLSAgICAgKiBAcGFyYW0gbnVtQml0cyB0aGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGJpdCAsIAotICAgICAqIGl0IGNhbiBiZSBiZXR3ZWVuIDAgYW5kIDY0LiAKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFNpZ25hbHMgdGhhdCBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKiBAcGFyYW0gYml0cworICAgICAqICAgICAgICAgICAgdGhlIGxvbmcgdmFsdWUgY29udGFpbmluZyB0aGUgYml0cyB0byBiZSB3cml0dGVuLCBzdGFydGluZworICAgICAqICAgICAgICAgICAgd2l0aCB0aGUgYml0IGluIHBvc2l0aW9uIG51bUJpdHMgLSAxIGRvd24gdG8gdGhlIGxlYXN0CisgICAgICogICAgICAgICAgICBzaWduaWZpY2FudCBiaXQuCisgICAgICogQHBhcmFtIG51bUJpdHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgYml0LCBpdCBjYW4gYmUgYmV0d2VlbiAwIGFuZCA2NC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQuCiAgICAgICovCiAgICAgdm9pZCB3cml0ZUJpdHMobG9uZyBiaXRzLCBpbnQgbnVtQml0cykgdGhyb3dzIElPRXhjZXB0aW9uOwogCmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9zdHJlYW0vSW1hZ2VPdXRwdXRTdHJlYW1JbXBsLmphdmEgYi9hd3QvamF2YXgvaW1hZ2Vpby9zdHJlYW0vSW1hZ2VPdXRwdXRTdHJlYW1JbXBsLmphdmEKaW5kZXggYzNkODBmYS4uMGZlZjc4ZiAxMDA2NDQKLS0tIGEvYXd0L2phdmF4L2ltYWdlaW8vc3RyZWFtL0ltYWdlT3V0cHV0U3RyZWFtSW1wbC5qYXZhCisrKyBiL2F3dC9qYXZheC9pbWFnZWlvL3N0cmVhbS9JbWFnZU91dHB1dFN0cmVhbUltcGwuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogICogQGF1dGhvciBSdXN0ZW0gVi4gUmFmaWtvdgogICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjMgJAogICovCisKIHBhY2thZ2UgamF2YXguaW1hZ2Vpby5zdHJlYW07CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtMjksMTYgKzMwLDE5IEBACiAgKi8KIAogLyoqCi0gKiBUaGUgSW1hZ2VPdXRwdXRTdHJlYW1JbXBsIGFic3RyYWN0IGNsYXNzIGltcGxlbWVudHMKLSAqIHRoZSBJbWFnZU91dHB1dFN0cmVhbSBpbnRlcmZhY2UuCisgKiBUaGUgSW1hZ2VPdXRwdXRTdHJlYW1JbXBsIGFic3RyYWN0IGNsYXNzIGltcGxlbWVudHMgdGhlIEltYWdlT3V0cHV0U3RyZWFtCisgKiBpbnRlcmZhY2UuCisgKiAKKyAqIEBzaW5jZSBBbmRyb2lkIDEuMAogICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW1hZ2VPdXRwdXRTdHJlYW1JbXBsIGV4dGVuZHMgSW1hZ2VJbnB1dFN0cmVhbUltcGwKLSAgICAgICAgaW1wbGVtZW50cyBJbWFnZU91dHB1dFN0cmVhbSB7CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW1hZ2VPdXRwdXRTdHJlYW1JbXBsIGV4dGVuZHMgSW1hZ2VJbnB1dFN0cmVhbUltcGwgaW1wbGVtZW50cworICAgICAgICBJbWFnZU91dHB1dFN0cmVhbSB7CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgSW1hZ2VPdXRwdXRTdHJlYW1JbXBsLgogICAgICAqLwotICAgIHB1YmxpYyBJbWFnZU91dHB1dFN0cmVhbUltcGwoKSB7fQorICAgIHB1YmxpYyBJbWFnZU91dHB1dFN0cmVhbUltcGwoKSB7CisgICAgfQogCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbjsKIApAQCAtNjIsNyArNjYsNyBAQAogICAgICAgICB9IGVsc2UgewogCiAgICAgICAgIH0KLSAgICAgICAgLy8tLSBUT0RPIGltcGxlbWVudAorICAgICAgICAvLyAtLSBUT0RPIGltcGxlbWVudAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKQEAgLTc2LDcgKzgwLDcgQEAKICAgICAgICAgfSBlbHNlIHsKIAogICAgICAgICB9Ci0gICAgICAgIC8vLS0gVE9ETyBpbXBsZW1lbnQKKyAgICAgICAgLy8gLS0gVE9ETyBpbXBsZW1lbnQKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCkBAIC04Niw3ICs5MCw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAKICAgICAgICAgfQotICAgICAgICAvLy0tIFRPRE8gaW1wbGVtZW50CisgICAgICAgIC8vIC0tIFRPRE8gaW1wbGVtZW50CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwogICAgIH0KIApAQCAtMTA4LDYyICsxMTIsNjMgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB3cml0ZVVURihTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8tLSBUT0RPIGltcGxlbWVudAorICAgICAgICAvLyAtLSBUT0RPIGltcGxlbWVudAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB3cml0ZVNob3J0cyhzaG9ydFtdIHMsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vLS0gVE9ETyBpbXBsZW1lbnQKKyAgICAgICAgLy8gLS0gVE9ETyBpbXBsZW1lbnQKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgd3JpdGVDaGFycyhjaGFyW10gYywgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8tLSBUT0RPIGltcGxlbWVudAorICAgICAgICAvLyAtLSBUT0RPIGltcGxlbWVudAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB3cml0ZUludHMoaW50W10gaSwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8tLSBUT0RPIGltcGxlbWVudAorICAgICAgICAvLyAtLSBUT0RPIGltcGxlbWVudAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB3cml0ZUxvbmdzKGxvbmdbXSBsLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvLy0tIFRPRE8gaW1wbGVtZW50CisgICAgICAgIC8vIC0tIFRPRE8gaW1wbGVtZW50CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHdyaXRlRmxvYXRzKGZsb2F0W10gZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8tLSBUT0RPIGltcGxlbWVudAorICAgICAgICAvLyAtLSBUT0RPIGltcGxlbWVudAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB3cml0ZURvdWJsZXMoZG91YmxlW10gZCwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8tLSBUT0RPIGltcGxlbWVudAorICAgICAgICAvLyAtLSBUT0RPIGltcGxlbWVudAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB3cml0ZUJpdChpbnQgYml0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvLy0tIFRPRE8gaW1wbGVtZW50CisgICAgICAgIC8vIC0tIFRPRE8gaW1wbGVtZW50CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHdyaXRlQml0cyhsb25nIGJpdHMsIGludCBudW1CaXRzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvLy0tIFRPRE8gaW1wbGVtZW50CisgICAgICAgIC8vIC0tIFRPRE8gaW1wbGVtZW50CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEZsdXNoZXMgdGhlIGJpdHMuIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgaW4gdGhlIHdyaXRlCi0gICAgICogbWV0aG9kcyBieSBzdWJjbGFzc2VzLgorICAgICAqIEZsdXNoZXMgdGhlIGJpdHMuIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgaW4gdGhlIHdyaXRlIG1ldGhvZHMgYnkKKyAgICAgKiBzdWJjbGFzc2VzLgogICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gU2lnbmFscyB0aGF0IGFuIEkvTyBleGNlcHRpb24gaGFzIG9jY3VycmVkLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBmbHVzaEJpdHMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAoYml0T2Zmc2V0ID09IDApIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8tLSBUT0RPIGltcGxlbWVudAorCisgICAgICAgIC8vIC0tIFRPRE8gaW1wbGVtZW50CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2F3dC9qYXZheC9pbWFnZWlvL3N0cmVhbS9NZW1vcnlDYWNoZUltYWdlSW5wdXRTdHJlYW0uamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL3N0cmVhbS9NZW1vcnlDYWNoZUltYWdlSW5wdXRTdHJlYW0uamF2YQppbmRleCBhM2Q0NzBiLi5kN2ZjNzkxIDEwMDY0NAotLS0gYS9hd3QvamF2YXgvaW1hZ2Vpby9zdHJlYW0vTWVtb3J5Q2FjaGVJbWFnZUlucHV0U3RyZWFtLmphdmEKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vc3RyZWFtL01lbW9yeUNhY2hlSW1hZ2VJbnB1dFN0cmVhbS5qYXZhCkBAIC0xNSw3ICsxNSw2IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotCiBwYWNrYWdlIGphdmF4LmltYWdlaW8uc3RyZWFtOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnguaW1hZ2Vpby5zdHJlYW0uUmFuZG9tQWNjZXNzTWVtb3J5Q2FjaGU7CkBAIC0yNCwyMiArMjMsMjkgQEAKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogCiAvKioKLSAqIFRoZSBNZW1vcnlDYWNoZUltYWdlSW5wdXRTdHJlYW0gY2xhc3MgaW1wbGVtZW50cyBJbWFnZUlucHV0U3RyZWFtCi0gKiB1c2luZyBhIG1lbW9yeSBidWZmZXIgZm9yIGNhY2hpbmcgdGhlIGRhdGEuCisgKiBUaGUgTWVtb3J5Q2FjaGVJbWFnZUlucHV0U3RyZWFtIGNsYXNzIGltcGxlbWVudHMgSW1hZ2VJbnB1dFN0cmVhbSB1c2luZyBhCisgKiBtZW1vcnkgYnVmZmVyIGZvciBjYWNoaW5nIHRoZSBkYXRhLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwotcHVibGljIGNsYXNzIE1lbW9yeUNhY2hlSW1hZ2VJbnB1dFN0cmVhbSAgZXh0ZW5kcyBJbWFnZUlucHV0U3RyZWFtSW1wbCB7Ci0gICAgCi0gICAgLyoqIFRoZSBpcy4gKi8KK3B1YmxpYyBjbGFzcyBNZW1vcnlDYWNoZUltYWdlSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbWFnZUlucHV0U3RyZWFtSW1wbCB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaXMuCisgICAgICovCiAgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBpczsKLSAgICAKLSAgICAvKiogVGhlIHJhbWMuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmFtYy4KKyAgICAgKi8KICAgICBwcml2YXRlIFJhbmRvbUFjY2Vzc01lbW9yeUNhY2hlIHJhbWMgPSBuZXcgUmFuZG9tQWNjZXNzTWVtb3J5Q2FjaGUoKTsKIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBNZW1vcnlDYWNoZUltYWdlSW5wdXRTdHJlYW0KLSAgICAgKiB3aGljaCByZWFkcyBmcm9tIHRoZSBzcGVjaWZpZWQgSW5wdXRTdHJlYW0uCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IE1lbW9yeUNhY2hlSW1hZ2VJbnB1dFN0cmVhbSB3aGljaCByZWFkcyBmcm9tIHRoZQorICAgICAqIHNwZWNpZmllZCBJbnB1dFN0cmVhbS4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RyZWFtIHRoZSBJbnB1dFN0cmVhbSB0byBiZSByZWFkLgorICAgICAqIEBwYXJhbSBzdHJlYW0KKyAgICAgKiAgICAgICAgICAgIHRoZSBJbnB1dFN0cmVhbSB0byBiZSByZWFkLgogICAgICAqLwogICAgIHB1YmxpYyBNZW1vcnlDYWNoZUltYWdlSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gc3RyZWFtKSB7CiAgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvYXd0L2phdmF4L2ltYWdlaW8vc3RyZWFtL01lbW9yeUNhY2hlSW1hZ2VPdXRwdXRTdHJlYW0uamF2YSBiL2F3dC9qYXZheC9pbWFnZWlvL3N0cmVhbS9NZW1vcnlDYWNoZUltYWdlT3V0cHV0U3RyZWFtLmphdmEKaW5kZXggOTZkZWQ0My4uMWRmNDBhMyAxMDA2NDQKLS0tIGEvYXd0L2phdmF4L2ltYWdlaW8vc3RyZWFtL01lbW9yeUNhY2hlSW1hZ2VPdXRwdXRTdHJlYW0uamF2YQorKysgYi9hd3QvamF2YXgvaW1hZ2Vpby9zdHJlYW0vTWVtb3J5Q2FjaGVJbWFnZU91dHB1dFN0cmVhbS5qYXZhCkBAIC0xNSw3ICsxNSw2IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotCiBwYWNrYWdlIGphdmF4LmltYWdlaW8uc3RyZWFtOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnguaW1hZ2Vpby5zdHJlYW0uUmFuZG9tQWNjZXNzTWVtb3J5Q2FjaGU7CkBAIC0yMywyNCArMjIsMzAgQEAKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCi0KIC8qKgotICogVGhlIE1lbW9yeUNhY2hlSW1hZ2VPdXRwdXRTdHJlYW0gY2xhc3MgaW1wbGVtZW50cyBJbWFnZU91dHB1dFN0cmVhbQotICogdXNpbmcgYSBtZW1vcnkgYnVmZmVyIGZvciBjYWNoaW5nIHRoZSBkYXRhLgorICogVGhlIE1lbW9yeUNhY2hlSW1hZ2VPdXRwdXRTdHJlYW0gY2xhc3MgaW1wbGVtZW50cyBJbWFnZU91dHB1dFN0cmVhbSB1c2luZyBhCisgKiBtZW1vcnkgYnVmZmVyIGZvciBjYWNoaW5nIHRoZSBkYXRhLgorICogCisgKiBAc2luY2UgQW5kcm9pZCAxLjAKICAqLwogcHVibGljIGNsYXNzIE1lbW9yeUNhY2hlSW1hZ2VPdXRwdXRTdHJlYW0gZXh0ZW5kcyBJbWFnZU91dHB1dFN0cmVhbUltcGwgewotICAgIAotICAgIC8qKiBUaGUgb3MuICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgb3MuCisgICAgICovCiAgICAgT3V0cHV0U3RyZWFtIG9zOwotICAgIAotICAgIC8qKiBUaGUgcmFtYy4gKi8KKworICAgIC8qKgorICAgICAqIFRoZSByYW1jLgorICAgICAqLwogICAgIFJhbmRvbUFjY2Vzc01lbW9yeUNhY2hlIHJhbWMgPSBuZXcgUmFuZG9tQWNjZXNzTWVtb3J5Q2FjaGUoKTsKIAogICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBNZW1vcnlDYWNoZUltYWdlT3V0cHV0U3RyZWFtCi0gICAgICogd2hpY2ggd3JpdGVzIHRvIHRoZSBzcGVjaWZpZWQgT3V0cHV0U3RyZWFtLgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBNZW1vcnlDYWNoZUltYWdlT3V0cHV0U3RyZWFtIHdoaWNoIHdyaXRlcyB0byB0aGUKKyAgICAgKiBzcGVjaWZpZWQgT3V0cHV0U3RyZWFtLgogICAgICAqIAotICAgICAqIEBwYXJhbSBzdHJlYW0gdGhlIE91dHB1dFN0cmVhbS4KKyAgICAgKiBAcGFyYW0gc3RyZWFtCisgICAgICogICAgICAgICAgICB0aGUgT3V0cHV0U3RyZWFtLgogICAgICAqLwogICAgIHB1YmxpYyBNZW1vcnlDYWNoZUltYWdlT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBzdHJlYW0pIHsKICAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxsKSB7CkBAIC0xMjUsNiArMTMwLDYgQEAKICAgICAgICAgcmFtYy5nZXREYXRhKG9zLCBuQnl0ZXMsIGZsdXNoZWRQb3NpdGlvbik7CiAgICAgICAgIHJhbWMuZnJlZUJlZm9yZShuZXdGbHVzaGVkUG9zaXRpb24pOwogCi0gICAgICAgIG9zLmZsdXNoKCk7ICAgICAgICAKKyAgICAgICAgb3MuZmx1c2goKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9hd3QvamF2YXgvaW1hZ2Vpby9zdHJlYW0vcGFja2FnZS5odG1sIGIvYXd0L2phdmF4L2ltYWdlaW8vc3RyZWFtL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2Y1M2MzCi0tLSAvZGV2L251bGwKKysrIGIvYXd0L2phdmF4L2ltYWdlaW8vc3RyZWFtL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDggQEAKKzxodG1sPgorICA8Ym9keT4KKyAgICA8cD4KKyAgICAgIFRoaXMgcGFja2FnZSBjb250YWlucyBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzIGZvciBoYW5kbGluZyBpbWFnZXMgd2l0aCBsb3ctbGV2ZWwgSS9PIG9wZXJhdGlvbnMuIAorICAgIDwvcD4KKyAgQHNpbmNlIEFuZHJvaWQgMS4wCisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2F3dC9vcmcvYXBhY2hlL2hhcm1vbnkvYXd0L2ludGVybmFsL25scy9NZXNzYWdlcy5qYXZhIGIvYXd0L29yZy9hcGFjaGUvaGFybW9ueS9hd3QvaW50ZXJuYWwvbmxzL01lc3NhZ2VzLmphdmEKaW5kZXggOTY3NjJjOS4uYzM0MDM1OCAxMDA2NDQKLS0tIGEvYXd0L29yZy9hcGFjaGUvaGFybW9ueS9hd3QvaW50ZXJuYWwvbmxzL01lc3NhZ2VzLmphdmEKKysrIGIvYXd0L29yZy9hcGFjaGUvaGFybW9ueS9hd3QvaW50ZXJuYWwvbmxzL01lc3NhZ2VzLmphdmEKQEAgLTcxLDcgKzcxLDkgQEAKICAgICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgbWVzc2FnZSBmb3IgdGhhdCBrZXkgaW4gdGhlIHN5c3RlbSBtZXNzYWdlIGJ1bmRsZS4KICAgICAgKi8KICAgICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIG1zZykgeworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgcmV0dXJuIE1zZ0hlbHAuZ2V0U3RyaW5nKG1zZyk7CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICB9CiAKICAgICAvKioKQEAgLTEzOCw2ICsxNDAsMTIgQEAKICAgICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgbWVzc2FnZSBmb3IgdGhhdCBrZXkgaW4gdGhlIHN5c3RlbSBtZXNzYWdlIGJ1bmRsZS4KICAgICAgKi8KICAgICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIG1zZywgT2JqZWN0W10gYXJncykgeworICAgICAgICAvLyBCRUdJTiBhbmRyb2lkLWNoYW5nZWQKICAgICAgICAgcmV0dXJuIE1zZ0hlbHAuZ2V0U3RyaW5nKG1zZywgYXJncyk7CisgICAgICAgIC8vIEVORCBhbmRyb2lkLWNoYW5nZWQKICAgICB9CisKKyAgICAvLyBCRUdJTiBhbmRyb2lkLW5vdGUKKyAgICAvLyBEdXBsaWNhdGUgY29kZSB3YXMgZHJvcHBlZCBpbiBmYXZvciBvZiB1c2luZyBNc2dIZWxwLgorICAgIC8vIEVORCBhbmRyb2lkLW5vdGUKIH0KZGlmZiAtLWdpdCBhL2F3dC9vcmcvYXBhY2hlL2hhcm1vbnkvYmVhbnMvaW50ZXJuYWwvbmxzL01lc3NhZ2VzLmphdmEgYi9hd3Qvb3JnL2FwYWNoZS9oYXJtb255L2JlYW5zL2ludGVybmFsL25scy9NZXNzYWdlcy5qYXZhCmluZGV4IDcyN2M3NTcuLjUxZTgxNjggMTAwNjQ0Ci0tLSBhL2F3dC9vcmcvYXBhY2hlL2hhcm1vbnkvYmVhbnMvaW50ZXJuYWwvbmxzL01lc3NhZ2VzLmphdmEKKysrIGIvYXd0L29yZy9hcGFjaGUvaGFybW9ueS9iZWFucy9pbnRlcm5hbC9ubHMvTWVzc2FnZXMuamF2YQpAQCAtMzAsOCArMzAsMTcgQEAKIGltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKIAotaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5rZXJuZWwudm0uVk07Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Nc2dIZWxwOworLy8gQkVHSU4gYW5kcm9pZC1kZWxldGVkCisvKgorICogRm9yIEFuZHJvaWQsIHRoaXMgbW9kdWxlIGlzIGEgc2VwYXJhdGUgbGlicmFyeSBhbmQgbm90IHBhcnQgb2YgdGhlCisgKiBib290IGNsYXNzcGF0aCwgc28gaXRzIHJlc291cmNlcyB3b24ndCBiZSBmb3VuZCBvbiB0aGUgYm9vdCBjbGFzc3BhdGgKKyAqIGFzIGlzIGFzc3VtZWQgYnkgTXNnSGVscC5nZXRTdHJpbmcoKS4gV2UgaW5zdGVhZCB1c2UgYSBsb2NhbCBNc2dIZWxwCisgKiB3aGljaCBib3R0b21zIG91dCBpbiBhIGNhbGwgdG8gdGhlIHVzZWZ1bCBwYXJ0IG9mIGl0cyBsb3dlci1sZXZlbAorICogbmFtZXNha2UuCisgKi8KKy8vaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5rZXJuZWwudm0uVk07CisvL2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLk1zZ0hlbHA7CisvLyBFTkQgYW5kcm9pZC1kZWxldGVkCiAKIC8qKgogICogVGhpcyBjbGFzcyByZXRyaWV2ZXMgc3RyaW5ncyBmcm9tIGEgcmVzb3VyY2UgYnVuZGxlIGFuZCByZXR1cm5zIHRoZW0sCkBAIC00OSw4ICs1OCwxMCBAQAogICovCiBwdWJsaWMgY2xhc3MgTWVzc2FnZXMgewogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNSZXNvdXJjZSA9Ci0gICAgICAgICJvcmcuYXBhY2hlLmhhcm1vbnkuYmVhbnMuaW50ZXJuYWwubmxzLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAorICAgIC8vIEJFR0lOIGFuZHJvaWQtZGVsZXRlZAorICAgIC8vIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzUmVzb3VyY2UgPQorICAgIC8vICAgICAib3JnLmFwYWNoZS5oYXJtb255LmJlYW5zLmludGVybmFsLm5scy5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKKyAgICAvLyBFTkQgYW5kcm9pZC1kZWxldGVkCiAKICAgICAvKioKICAgICAgKiBSZXRyaWV2ZXMgYSBtZXNzYWdlIHdoaWNoIGhhcyBubyBhcmd1bWVudHMuCkBAIC02MCw3ICs3MSw5IEBACiAgICAgICogQHJldHVybiBTdHJpbmcgdGhlIG1lc3NhZ2UgZm9yIHRoYXQga2V5IGluIHRoZSBzeXN0ZW0gbWVzc2FnZSBidW5kbGUuCiAgICAgICovCiAgICAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBtc2cpIHsKLSAgICAgICAgcmV0dXJuIE1zZ0hlbHAuZ2V0U3RyaW5nKHNSZXNvdXJjZSwgbXNnKTsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgIHJldHVybiBNc2dIZWxwLmdldFN0cmluZyhtc2cpOworICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjcsNiArMTQwLDEyIEBACiAgICAgICogQHJldHVybiBTdHJpbmcgdGhlIG1lc3NhZ2UgZm9yIHRoYXQga2V5IGluIHRoZSBzeXN0ZW0gbWVzc2FnZSBidW5kbGUuCiAgICAgICovCiAgICAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBtc2csIE9iamVjdFtdIGFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIE1zZ0hlbHAuZ2V0U3RyaW5nKHNSZXNvdXJjZSwgbXNnLCBhcmdzKTsKKyAgICAgICAgLy8gQkVHSU4gYW5kcm9pZC1jaGFuZ2VkCisgICAgICAgIHJldHVybiBNc2dIZWxwLmdldFN0cmluZyhtc2csIGFyZ3MpOworICAgICAgICAvLyBFTkQgYW5kcm9pZC1jaGFuZ2VkCiAgICAgfQorCisgICAgLy8gQkVHSU4gYW5kcm9pZC1ub3RlCisgICAgLy8gRHVwbGljYXRlIGNvZGUgd2FzIGRyb3BwZWQgaW4gZmF2b3Igb2YgdXNpbmcgTXNnSGVscC4KKyAgICAvLyBFTkQgYW5kcm9pZC1ub3RlCiB9CmRpZmYgLS1naXQgYS9hd3Qvb3JnL2FwYWNoZS9oYXJtb255L2JlYW5zL2ludGVybmFsL25scy9Nc2dIZWxwLmphdmEgYi9hd3Qvb3JnL2FwYWNoZS9oYXJtb255L2JlYW5zL2ludGVybmFsL25scy9Nc2dIZWxwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhmYWFiZgotLS0gL2Rldi9udWxsCisrKyBiL2F3dC9vcmcvYXBhY2hlL2hhcm1vbnkvYmVhbnMvaW50ZXJuYWwvbmxzL01zZ0hlbHAuamF2YQpAQCAtMCwwICsxLDg2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiB0aGUgY2xhc3Mgb2YgdGhlIHNhbWUgbmFtZSBpbgorICogb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuaGFybW9ueS5iZWFucy5pbnRlcm5hbC5ubHM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnR5UmVzb3VyY2VCdW5kbGU7CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247CisKKy8qKgorICogVGhpcyBjbGFzcyBjb250YWlucyBoZWxwZXIgbWV0aG9kcyBmb3IgbG9hZGluZyByZXNvdXJjZSBidW5kbGVzIGFuZAorICogZm9ybWF0dGluZyBleHRlcm5hbCBtZXNzYWdlIHN0cmluZ3MuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNc2dIZWxwIHsKKyAgICAvKiogbmFtZSBvZiB0aGUgcmVzb3VyY2UgZm9yIHRoaXMgY2xhc3MgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfTkFNRSA9CisgICAgICAgICIvb3JnL2FwYWNoZS9oYXJtb255L2JlYW5zL2ludGVybmFsL25scy9tZXNzYWdlcy5wcm9wZXJ0aWVzIjsKKworICAgIC8qKiB0aGUgcmVzb3VyY2UgYnVuZGxlIGZvciB0aGlzIGNsYXNzICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgVEhFX0JVTkRMRTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIFJlc291cmNlQnVuZGxlIHJiID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBNc2dIZWxwLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgIFJFU09VUkNFX05BTUUpOworICAgICAgICAgICAgcmIgPSBuZXcgUHJvcGVydHlSZXNvdXJjZUJ1bmRsZShpbik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBMb2dnZXIuZ2xvYmFsLndhcm5pbmcoIkNvdWxkbid0IHJlYWQgcmVzb3VyY2UgYnVuZGxlOiAiICsKKyAgICAgICAgICAgICAgICAgICAgZXgpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBTaG91bGRuJ3QgaGFwcGVuLCBidXQgZGVhbCBhdCBsZWFzdCBzb21ld2hhdCBncmFjZWZ1bGx5LgorICAgICAgICAgICAgTG9nZ2VyLmdsb2JhbC53YXJuaW5nKCJDb3VsZG4ndCBmaW5kIHJlc291cmNlIGJ1bmRsZTogIiArCisgICAgICAgICAgICAgICAgICAgIGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIFRIRV9CVU5ETEUgPSByYjsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBtc2cpIHsKKyAgICAgICAgaWYgKFRIRV9CVU5ETEUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1zZzsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIFRIRV9CVU5ETEUuZ2V0U3RyaW5nKG1zZyk7CisgICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gIk1pc3NpbmcgbWVzc2FnZTogIiArIG1zZzsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIG1zZywgT2JqZWN0W10gYXJncykgeworICAgICAgICBTdHJpbmcgZm9ybWF0ID0gbXNnOworICAgICAgICBpZiAoVEhFX0JVTkRMRSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZvcm1hdCA9IFRIRV9CVU5ETEUuZ2V0U3RyaW5nKG1zZyk7CisgICAgICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTXNnSGVscC5mb3JtYXQoZm9ybWF0LCBhcmdzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hd3Qvb3JnL2FwYWNoZS9oYXJtb255L2JlYW5zL2ludGVybmFsL25scy9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYXd0L3Jlc291cmNlcy9vcmcvYXBhY2hlL2hhcm1vbnkvYmVhbnMvaW50ZXJuYWxzL25scy9tZXNzYWdlcy5wcm9wZXJ0aWVzCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhd3Qvb3JnL2FwYWNoZS9oYXJtb255L2JlYW5zL2ludGVybmFsL25scy9tZXNzYWdlcy5wcm9wZXJ0aWVzCnJlbmFtZSB0byBhd3QvcmVzb3VyY2VzL29yZy9hcGFjaGUvaGFybW9ueS9iZWFucy9pbnRlcm5hbHMvbmxzL21lc3NhZ2VzLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsgYi9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rCmluZGV4IDRlN2Q2ZDIuLjJkZmU2NTkgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKKysrIGIvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5tawpAQCAtNCwxMiArNCwxMyBAQAogIyBTZXQgVVNFX0NBTUVSQV9TVFVCIGZvciBub24tZW11bGF0b3IgYW5kIG5vbi1zaW11bGF0b3IgYnVpbGRzLCBpZiB5b3Ugd2FudAogIyB0aGUgY2FtZXJhIHNlcnZpY2UgdG8gdXNlIHRoZSBmYWtlIGNhbWVyYS4gIEZvciBlbXVsYXRvciBvciBzaW11bGF0b3IgYnVpbGRzLAogIyB3ZSBhbHdheXMgdXNlIHRoZSBmYWtlIGNhbWVyYS4KLSMKLWlmZXEgKCQoQk9BUkRfQ0FNRVJBX0xJQlJBUklFUyksKQotVVNFX0NBTUVSQV9TVFVCOj10cnVlCi1lbHNlCisKK2lmZXEgKCQoVVNFX0NBTUVSQV9TVFVCKSwpCiBVU0VfQ0FNRVJBX1NUVUI6PWZhbHNlCitpZm5lcSAoJChmaWx0ZXIgc29vbmVyIGdlbmVyaWMgc2ltLCQoVEFSR0VUX0RFVklDRSkpLCkKK1VTRV9DQU1FUkFfU1RVQjo9dHJ1ZQogZW5kaWYgI2xpYmNhbWVyYXN0dWIKK2VuZGlmCiAKIGlmZXEgKCQoVVNFX0NBTUVSQV9TVFVCKSx0cnVlKQogIwpAQCAtNTEsNyArNTIsNyBAQAogTE9DQUxfU1RBVElDX0xJQlJBUklFUyArPSBsaWJjYW1lcmFzdHViCiBMT0NBTF9DRkxBR1MgKz0gLWluY2x1ZGUgQ2FtZXJhSGFyZHdhcmVTdHViLmgKIGVsc2UKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gJChCT0FSRF9DQU1FUkFfTElCUkFSSUVTKQorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJjYW1lcmEgCiBlbmRpZgogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcCBiL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCmluZGV4IDU3ODRjNGIuLjgwMGZmYTQgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCisrKyBiL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCkBAIC0xLDYgKzEsNyBAQAogLyoKICoqCi0qKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKiogQ29weXJpZ2h0IChDKSAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKiBDb3B5cmlnaHQgKEMpIDIwMDggSFRDIEluYy4KICoqCiAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE1LDcgKzE2LDcgQEAKICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KIAotCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkNhbWVyYVNlcnZpY2UiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKQEAgLTE1NSwxMCArMTU2LDIyIEBACiB7CiAgICAgTE9HRCgiQ2xpZW50IEUgY29uc3RydWN0b3IiKTsKICAgICBtSGFyZHdhcmUgPSBvcGVuQ2FtZXJhSGFyZHdhcmUoKTsKLSAgICBtSGFzRnJhbWVDYWxsYmFjayA9IGZhbHNlOworCisgICAgLy8gQ2FsbGJhY2sgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdAorICAgIG1GcmFtZUNhbGxiYWNrRmxhZyA9IEZSQU1FX0NBTExCQUNLX0ZMQUdfTk9PUDsKICAgICBMT0dEKCJDbGllbnQgWCBjb25zdHJ1Y3RvciIpOwogfQogCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmNvbm5lY3QoY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNsaWVudCkKK3sKKyAgICAvLyByZW12b2Ugb2xkIGNsaWVudAorICAgIExPR0QoImNvbm5lY3QgKG5ldyBjbGllbnQpIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtQ2FtZXJhQ2xpZW50ID0gY2xpZW50OworICAgIG1GcmFtZUNhbGxiYWNrRmxhZyA9IEZSQU1FX0NBTExCQUNLX0ZMQUdfTk9PUDsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKICNpZiBIQVZFX0FORFJPSURfT1MKIHN0YXRpYyB2b2lkICp1bnJlZ2lzdGVyX3N1cmZhY2Uodm9pZCAqYXJnKQogewpAQCAtMTcwLDcgKzE4Myw3IEBACiAjZW5kaWYKIAogQ2FtZXJhU2VydmljZTo6Q2xpZW50Ojp+Q2xpZW50KCkKLXsgCit7CiAgICAgLy8gc3BpbiBkb3duIGhhcmR3YXJlCiAgICAgTE9HRCgiQ2xpZW50IEUgZGVzdHJ1Y3RvciIpOwogICAgIGlmIChtU3VyZmFjZSAhPSAwKSB7CkBAIC0xNzksNyArMTkyLDcgQEAKICAgICAgICAgLy8gV2UgdW5yZWdpc3RlciB0aGUgYnVmZmVycyBpbiBhIGRpZmZlcmVudCB0aHJlYWQgYmVjYXVzZSBiaW5kZXIgZG9lcwogICAgICAgICAvLyBub3QgbGV0IHVzIG1ha2Ugc3ljaHJvbm91cyB0cmFuc2FjdGlvbnMgaW4gYSBiaW5kZXIgZGVzdHJ1Y3RvciAodGhhdAogICAgICAgICAvLyBpcywgdXBvbiBvdXIgcmVhY2hpbmcgYSByZWZjb3VudCBvZiB6ZXJvLikKLSAgICAgICAgcHRocmVhZF9jcmVhdGUoJnRociwgTlVMTCwgCisgICAgICAgIHB0aHJlYWRfY3JlYXRlKCZ0aHIsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJfc3VyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2UuZ2V0KCkpOwogICAgICAgICBwdGhyZWFkX2pvaW4odGhyLCBOVUxMKTsKQEAgLTIyNywxMiArMjQwLDEyIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi0vLyB0ZWxsIHRoZSBzZXJ2aWNlIHdoZXRoZXIgdG8gY2FsbGJhY2sgd2l0aCBlYWNoIHByZXZpZXcgZnJhbWUKLXZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpzZXRIYXNGcmFtZUNhbGxiYWNrKGJvb2wgaW5zdGFsbGVkKQorLy8gc2V0IHRoZSBmcmFtZSBjYWxsYmFjayBmbGFnIHRvIGFmZmVjdCBob3cgdGhlIHJlY2VpdmVkIGZyYW1lcyBmcm9tCisvLyBwcmV2aWV3IGFyZSBoYW5kbGVkLgordm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OnNldEZyYW1lQ2FsbGJhY2tGbGFnKGludCBmcmFtZV9jYWxsYmFja19mbGFnKQogewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBtSGFzRnJhbWVDYWxsYmFjayA9IGluc3RhbGxlZDsKLSAgICAvLyBJZiBpbnN0YWxsZWQgaXMgZmFsc2UsIG1QcmV2aWV3QnVmZmVyIHdpbGwgYmUgcmVsZWFzZWQgaW4gc3RvcFByZXZpZXcoKS4KKyAgICBtRnJhbWVDYWxsYmFja0ZsYWcgPSBmcmFtZV9jYWxsYmFja19mbGFnOwogfQogCiAvLyBzdGFydCBwcmV2aWV3IG1vZGUsIG11c3QgY2FsbCBzZXRQcmV2aWV3RGlzcGxheSBmaXJzdApAQCAtMjUwLDI0ICsyNjMsMjQgQEAKICAgICAgICAgTE9HRSgibUhhcmR3YXJlIGlzIE5VTEwsIHJldHVybmluZy4iKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICAKKwogICAgIGlmIChtU3VyZmFjZSA9PSAwKSB7CiAgICAgICAgIExPR0UoInNldFByZXZpZXdEaXNwbGF5IG11c3QgYmUgY2FsbGVkIGJlZm9yZSBzdGFydFByZXZpZXchIik7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgCisKICAgICAvLyBYWFg6IFRoaXMgbmVlZHMgdG8gYmUgaW1wcm92ZWQuIHJlbW92ZSBhbGwgaGFyZGNvZGVkIHN0dWZmCi0gICAgCisKICAgICBpbnQgdywgaDsKICAgICBDYW1lcmFQYXJhbWV0ZXJzIHBhcmFtcyhtSGFyZHdhcmUtPmdldFBhcmFtZXRlcnMoKSk7CiAgICAgcGFyYW1zLmdldFByZXZpZXdTaXplKCZ3LCAmaCk7Ci0gICAgCisKICAgICBtU3VyZmFjZS0+dW5yZWdpc3RlckJ1ZmZlcnMoKTsKIAogI2lmIERFQlVHX0RVTVBfUFJFVklFV19GUkFNRV9UT19GSUxFCiAgICAgZGVidWdfZnJhbWVfY250ID0gMDsKICNlbmRpZgotICAgIAorCiAgICAgc3RhdHVzX3QgcmV0ID0gbUhhcmR3YXJlLT5zdGFydFByZXZpZXcocHJldmlld0NhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFTZXJ2aWNlLmdldCgpKTsKICAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CkBAIC0yNzcsNyArMjkwLDcgQEAKICAgICB9CiAgICAgZWxzZSBMT0dFKCJtSGFyZHdhcmUtPnN0YXJ0UHJldmlldygpIGZhaWxlZCB3aXRoIHN0YXR1cyAlZFxuIiwKICAgICAgICAgICAgICAgcmV0KTsKLSAgICAKKwogICAgIHJldHVybiByZXQ7CiB9CiAKQEAgLTI5NSw3ICszMDgsNyBAQAogCiAgICAgbUhhcmR3YXJlLT5zdG9wUHJldmlldygpOwogICAgIExPR0QoInN0b3BQcmV2aWV3KCksIGhhcmR3YXJlIHN0b3BwZWQgT0siKTsKLSAgICAKKwogICAgIGlmIChtU3VyZmFjZSAhPSAwKSB7CiAgICAgICAgIG1TdXJmYWNlLT51bnJlZ2lzdGVyQnVmZmVycygpOwogICAgIH0KQEAgLTM2MSw2ICszNzQsNyBAQAogLy8gcHJldmlldyBjYWxsYmFjayAtIGZyYW1lIGJ1ZmZlciB1cGRhdGUKIHZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpwcmV2aWV3Q2FsbGJhY2soY29uc3Qgc3A8SU1lbW9yeT4mIG1lbSwgdm9pZCogdXNlcikKIHsKKyAgICBMT0dWKCJwcmV2aWV3Q2FsbGJhY2soKSIpOwogICAgIHNwPENsaWVudD4gY2xpZW50ID0gZ2V0Q2xpZW50RnJvbUNvb2tpZSh1c2VyKTsKICAgICBpZiAoY2xpZW50ID09IDApIHsKICAgICAgICAgcmV0dXJuOwpAQCAtMzk1LDcgKzQwOSw3IEBACiAgICAgY2xpZW50LT5wb3N0RnJhbWUobWVtKTsKIAogI2lmIERFQlVHX0NMSUVOVF9SRUZFUkVOQ0VTCi0gICAgLy8qKioqIGlmIHRoZSBjbGllbnQncyByZWZjb3VudCBpcyAxLCB0aGVuIHdlIGFyZSBhYm91dCB0byBkZXN0cm95IGl0IGhlcmUsIAorICAgIC8vKioqKiBpZiB0aGUgY2xpZW50J3MgcmVmY291bnQgaXMgMSwgdGhlbiB3ZSBhcmUgYWJvdXQgdG8gZGVzdHJveSBpdCBoZXJlLAogICAgIC8vIHdoaWNoIGlzIGJhZC0tcHJpbnQgYWxsIHJlZmNvdW50cy4KICAgICBpZiAoY2xpZW50LT5nZXRTdHJvbmdDb3VudCgpID09IDEpIHsKICAgICAgICAgTE9HRSgiKysrKysrKysrKysrKysrKyAoUFJFVklFVykgVEhJUyBXSUxMIENBVVNFIEEgTE9DS1VQISIpOwpAQCAtNDMxLDcgKzQ0NSw3IEBACiAgICAgICAgIExPR0UoIm1IYXJkd2FyZSBpcyBOVUxMLCByZXR1cm5pbmcuIik7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgCisKICAgICBpZiAobVN1cmZhY2UgIT0gTlVMTCkKICAgICAgICAgbVN1cmZhY2UtPnVucmVnaXN0ZXJCdWZmZXJzKCk7CiAKQEAgLTQ5NSw3ICs1MDksNyBAQAogICAgIGNsaWVudC0+cG9zdFJhdyhtZW0pOwogCiAjaWYgREVCVUdfQ0xJRU5UX1JFRkVSRU5DRVMKLSAgICAvLyoqKiogaWYgdGhlIGNsaWVudCdzIHJlZmNvdW50IGlzIDEsIHRoZW4gd2UgYXJlIGFib3V0IHRvIGRlc3Ryb3kgaXQgaGVyZSwgCisgICAgLy8qKioqIGlmIHRoZSBjbGllbnQncyByZWZjb3VudCBpcyAxLCB0aGVuIHdlIGFyZSBhYm91dCB0byBkZXN0cm95IGl0IGhlcmUsCiAgICAgLy8gd2hpY2ggaXMgYmFkLS1wcmludCBhbGwgcmVmY291bnRzLgogICAgIGlmIChjbGllbnQtPmdldFN0cm9uZ0NvdW50KCkgPT0gMSkgewogICAgICAgICBMT0dFKCIrKysrKysrKysrKysrKysrIChSQVcpIFRISVMgV0lMTCBDQVVTRSBBIExPQ0tVUCEiKTsKQEAgLTUzMiw3ICs1NDYsNyBAQAogICAgIGNsaWVudC0+cG9zdEpwZWcobWVtKTsKIAogI2lmIERFQlVHX0NMSUVOVF9SRUZFUkVOQ0VTCi0gICAgLy8qKioqIGlmIHRoZSBjbGllbnQncyByZWZjb3VudCBpcyAxLCB0aGVuIHdlIGFyZSBhYm91dCB0byBkZXN0cm95IGl0IGhlcmUsIAorICAgIC8vKioqKiBpZiB0aGUgY2xpZW50J3MgcmVmY291bnQgaXMgMSwgdGhlbiB3ZSBhcmUgYWJvdXQgdG8gZGVzdHJveSBpdCBoZXJlLAogICAgIC8vIHdoaWNoIGlzIGJhZC0tcHJpbnQgYWxsIHJlZmNvdW50cy4KICAgICBpZiAoY2xpZW50LT5nZXRTdHJvbmdDb3VudCgpID09IDEpIHsKICAgICAgICAgTE9HRSgiKysrKysrKysrKysrKysrKyAoSlBFRykgVEhJUyBXSUxMIENBVVNFIEEgTE9DS1VQISIpOwpAQCAtNjE1LDM3ICs2MjksNzQgQEAKICAgICBtQ2FtZXJhQ2xpZW50LT5qcGVnQ2FsbGJhY2sobWVtKTsKIH0KIAordm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmNvcHlGcmFtZUFuZFBvc3RDb3BpZWRGcmFtZShzcDxJTWVtb3J5SGVhcD4gaGVhcCwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpCit7CisgICAgTE9HVigiY29weUZyYW1lQW5kUG9zdENvcGllZEZyYW1lIik7CisgICAgLy8gSXQgaXMgbmVjZXNzYXJ5IHRvIGNvcHkgb3V0IG9mIHBtZW0gYmVmb3JlIHNlbmRpbmcgdGhpcyB0bworICAgIC8vIHRoZSBjYWxsYmFjay4gRm9yIGVmZmljaWVuY3ksIHJldXNlIHRoZSBzYW1lIE1lbW9yeUhlYXBCYXNlCisgICAgLy8gcHJvdmlkZWQgaXQncyBiaWcgZW5vdWdoLiBEb24ndCBhbGxvY2F0ZSB0aGUgbWVtb3J5IG9yCisgICAgLy8gcGVyZm9ybSB0aGUgY29weSBpZiB0aGVyZSdzIG5vIGNhbGxiYWNrLgorICAgIGlmIChtUHJldmlld0J1ZmZlciA9PSAwKSB7CisgICAgICAgIG1QcmV2aWV3QnVmZmVyID0gbmV3IE1lbW9yeUhlYXBCYXNlKHNpemUsIDAsIE5VTEwpOworICAgIH0gZWxzZSBpZiAoc2l6ZSA+IG1QcmV2aWV3QnVmZmVyLT52aXJ0dWFsU2l6ZSgpKSB7CisgICAgICAgIG1QcmV2aWV3QnVmZmVyLmNsZWFyKCk7CisgICAgICAgIG1QcmV2aWV3QnVmZmVyID0gbmV3IE1lbW9yeUhlYXBCYXNlKHNpemUsIDAsIE5VTEwpOworICAgICAgICBpZiAobVByZXZpZXdCdWZmZXIgPT0gMCkgeworICAgICAgICAgICAgTE9HRSgiZmFpbGVkIHRvIGFsbG9jYXRlIHNwYWNlIGZvciBwcmV2aWV3IGJ1ZmZlciIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIG1lbWNweShtUHJldmlld0J1ZmZlci0+YmFzZSgpLAorICAgICAgICAgICAodWludDhfdCAqKWhlYXAtPmJhc2UoKSArIG9mZnNldCwgc2l6ZSk7CisKKyAgICBzcDxNZW1vcnlCYXNlPiBmcmFtZSA9IG5ldyBNZW1vcnlCYXNlKG1QcmV2aWV3QnVmZmVyLCAwLCBzaXplKTsKKyAgICBpZiAoZnJhbWUgPT0gMCkgeworICAgICAgICBMT0dFKCJmYWlsZWQgdG8gYWxsb2NhdGUgc3BhY2UgZm9yIGZyYW1lIGNhbGxiYWNrIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUNhbWVyYUNsaWVudC0+ZnJhbWVDYWxsYmFjayhmcmFtZSk7Cit9CisKIHZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50Ojpwb3N0RnJhbWUoY29uc3Qgc3A8SU1lbW9yeT4mIG1lbSkKIHsKKyAgICBMT0dWKCJwb3N0RnJhbWUiKTsKKyAgICBpZiAobWVtID09IDApIHsKKyAgICAgICAgTE9HVygibWVtIGlzIGEgbnVsbCBwb2ludGVyIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBzc2l6ZV90IG9mZnNldDsKICAgICBzaXplX3Qgc2l6ZTsKICAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IG1lbS0+Z2V0TWVtb3J5KCZvZmZzZXQsICZzaXplKTsKLQotICAgIHNwPE1lbW9yeUJhc2U+IGZyYW1lOwotCiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgc3VyZmFjZUxvY2sobVN1cmZhY2VMb2NrKTsKLSAgICAgICAgaWYgKG1TdXJmYWNlICE9IE5VTEwpCisgICAgICAgIGlmIChtU3VyZmFjZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICBtU3VyZmFjZS0+cG9zdEJ1ZmZlcihvZmZzZXQpOwotICAgIH0KLSAgICAKLSAgICAvLyBJdCBpcyBuZWNlc3NhcnkgdG8gY29weSBvdXQgb2YgcG1lbSBiZWZvcmUgc2VuZGluZyB0aGlzIHRvIHRoZSBjYWxsYmFjay4KLSAgICAvLyBGb3IgZWZmaWNpZW5jeSwgcmV1c2UgdGhlIHNhbWUgTWVtb3J5SGVhcEJhc2UgcHJvdmlkZWQgaXQncyBiaWcgZW5vdWdoLgotICAgIC8vIERvbid0IGFsbG9jYXRlIHRoZSBtZW1vcnkgb3IgcGVyZm9ybSB0aGUgY29weSBpZiB0aGVyZSdzIG5vIGNhbGxiYWNrLgotICAgIGlmIChtSGFzRnJhbWVDYWxsYmFjaykgewotICAgICAgICBpZiAobVByZXZpZXdCdWZmZXIgPT0gMCkgewotICAgICAgICAgICAgbVByZXZpZXdCdWZmZXIgPSBuZXcgTWVtb3J5SGVhcEJhc2Uoc2l6ZSwgMCwgTlVMTCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2l6ZSA+IG1QcmV2aWV3QnVmZmVyLT52aXJ0dWFsU2l6ZSgpKSB7Ci0gICAgICAgICAgICBtUHJldmlld0J1ZmZlci5jbGVhcigpOwotICAgICAgICAgICAgbVByZXZpZXdCdWZmZXIgPSBuZXcgTWVtb3J5SGVhcEJhc2Uoc2l6ZSwgMCwgTlVMTCk7CiAgICAgICAgIH0KLSAgICAgICAgbWVtY3B5KG1QcmV2aWV3QnVmZmVyLT5iYXNlKCksICh1aW50OF90ICopaGVhcC0+YmFzZSgpICsgb2Zmc2V0LCBzaXplKTsKLSAgICAgICAgZnJhbWUgPSBuZXcgTWVtb3J5QmFzZShtUHJldmlld0J1ZmZlciwgMCwgc2l6ZSk7CiAgICAgfQotICAgIAotICAgIC8vIERvIG5vdCBob2xkIHRoZSBjbGllbnQgbG9jayB3aGlsZSBjYWxsaW5nIGJhY2suCi0gICAgaWYgKGZyYW1lICE9IDApIHsKLSAgICAgICAgbUNhbWVyYUNsaWVudC0+ZnJhbWVDYWxsYmFjayhmcmFtZSk7CisKKyAgICAvLyBJcyB0aGUgY2FsbGJhY2sgZW5hYmxlZCBvciBub3Q/CisgICAgaWYgKCEobUZyYW1lQ2FsbGJhY2tGbGFnICYgRlJBTUVfQ0FMTEJBQ0tfRkxBR19FTkFCTEVfTUFTSykpIHsKKyAgICAgICAgLy8gSWYgdGhlIGVuYWJsZSBiaXQgaXMgb2ZmLCB0aGUgY29weS1vdXQgYW5kIG9uZS1zaG90IGJpdHMgYXJlIGlnbm9yZWQKKyAgICAgICAgTE9HVigiZnJhbWUgY2FsbGJhY2sgaXMgZGlhYmxlZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSXMgdGhlIHJlY2VpdmVkIGZyYW1lIGNvcGllZCBvdXQgb3Igbm90PworICAgIGlmIChtRnJhbWVDYWxsYmFja0ZsYWcgJiBGUkFNRV9DQUxMQkFDS19GTEFHX0NPUFlfT1VUX01BU0spIHsKKyAgICAgICAgTE9HVigiZnJhbWUgaXMgY29waWVkIG91dCIpOworICAgICAgICBjb3B5RnJhbWVBbmRQb3N0Q29waWVkRnJhbWUoaGVhcCwgb2Zmc2V0LCBzaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dWKCJmcmFtZSBpcyBkaXJlY3RseSBzZW50IG91dCB3aXRob3V0IGNvcHlpbmciKTsKKyAgICAgICAgbUNhbWVyYUNsaWVudC0+ZnJhbWVDYWxsYmFjayhtZW0pOworICAgIH0KKworICAgIC8vIElzIHRoaXMgaXMgb25lLXNob3Qgb25seT8KKyAgICBpZiAobUZyYW1lQ2FsbGJhY2tGbGFnICYgRlJBTUVfQ0FMTEJBQ0tfRkxBR19PTkVfU0hPVF9NQVNLKSB7CisgICAgICAgIExPR1YoIk9uZS1zaG90IG9ubHksIHRodXMgY2xlYXIgdGhlIGJpdHMgYW5kIGRpc2FibGUgZnJhbWUgY2FsbGJhY2siKTsKKyAgICAgICAgbUZyYW1lQ2FsbGJhY2tGbGFnICY9IH4oRlJBTUVfQ0FMTEJBQ0tfRkxBR19PTkVfU0hPVF9NQVNLIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVfQ0FMTEJBQ0tfRkxBR19DT1BZX09VVF9NQVNLIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVfQ0FMTEJBQ0tfRkxBR19FTkFCTEVfTUFTSyk7CiAgICAgfQogfQogCkBAIC03MTEsNyArNzYyLDcgQEAKICAgICB9CiAKICAgICBzdGF0dXNfdCBlcnIgPSBCbkNhbWVyYVNlcnZpY2U6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLSAgICAKKwogICAgIExPR0QoIisrKyBvblRyYW5zYWN0IGVyciAlZCBjb2RlICVkIiwgZXJyLCBjb2RlKTsKIAogICAgIGlmIChlcnIgPT0gVU5LTk9XTl9UUkFOU0FDVElPTiB8fCBlcnIgPT0gUEVSTUlTU0lPTl9ERU5JRUQpIHsKZGlmZiAtLWdpdCBhL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaCBiL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaAppbmRleCA2ODNjNTFiLi5iMjI1YWE5IDEwMDY0NAotLS0gYS9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKKysrIGIvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCkBAIC0xLDYgKzEsNyBAQAogLyoKICoqCi0qKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKiogQ29weXJpZ2h0IChDKSAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKiBDb3B5cmlnaHQgKEMpIDIwMDggSFRDIEluYy4KICoqCiAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTIwLDYgKzIxLDggQEAKIAogI2luY2x1ZGUgPHVpL0lDYW1lcmFTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8dWkvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1aS9DYW1lcmEuaD4KKwogY2xhc3MgYW5kcm9pZDo6TWVtb3J5SGVhcEJhc2U7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTMyLDcgKzM1LDcgQEAKIC8vIFdoZW4gZW5hYmxlZCwgdGhpcyBmZWF0dXJlIGFsbG93cyB5b3UgdG8gc2VuZCBhbiBldmVudCB0byB0aGUgQ2FtZXJhU2VydmljZQogLy8gc28gdGhhdCB5b3UgY2FuIGNhdXNlIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBoZWFwIG9iamVjdCBnV2Vha0hlYXAsIGRlZmluZWQKIC8vIGJlbG93LCB0byBiZSBwcmludGVkLiBZb3Ugd2lsbCBhbHNvIG5lZWQgdG8gc2V0IERFQlVHX1JFRlM9MSBhbmQKLS8vIERFQlVHX1JFRlNfRU5BQkxFRF9CWV9ERUZBVUxUPTAgaW4gbGlidXRpbHMvUmVmQmFzZS5jcHAuIFlvdSBqdXN0IGhhdmUgdG8gCisvLyBERUJVR19SRUZTX0VOQUJMRURfQllfREVGQVVMVD0wIGluIGxpYnV0aWxzL1JlZkJhc2UuY3BwLiBZb3UganVzdCBoYXZlIHRvCiAvLyBzZXQgZ1dlYWtIZWFwIHRvIHRoZSBhcHByb3ByaWF0ZSBoZWFwIHlvdSB3YW50IHRvIHRyYWNrLgogCiAjZGVmaW5lIERFQlVHX0hFQVBfTEVBS1MgMApAQCAtNjcsMTEgKzcwLDE1IEBACiAgICAgcHVibGljOgogICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBkaXNjb25uZWN0KCk7CiAKKyAgICAgICAgLy8gY29ubmVjdCBuZXcgY2xpZW50IHdpdGggZXhpc3RpbmcgY2FtZXJhIHJlbW90ZQorICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBjb25uZWN0KGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjbGllbnQpOworCiAgICAgICAgIC8vIHBhc3MgdGhlIGJ1ZmZlcmVkIElTdXJmYWNlIHRvIHRoZSBjYW1lcmEgc2VydmljZQogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRQcmV2aWV3RGlzcGxheShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpOwotICAgICAgICAKLSAgICAgICAgLy8gdGVsbCB0aGUgc2VydmljZSB3aGV0aGVyIHRvIGNhbGxiYWNrIHdpdGggZWFjaCBwcmV2aWV3IGZyYW1lCi0gICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHNldEhhc0ZyYW1lQ2FsbGJhY2soYm9vbCBpbnN0YWxsZWQpOworCisgICAgICAgIC8vIHNldCB0aGUgZnJhbWUgY2FsbGJhY2sgZmxhZyB0byBhZmZlY3QgaG93IHRoZSByZWNlaXZlZCBmcmFtZXMgZnJvbQorICAgICAgICAvLyBwcmV2aWV3IGFyZSBoYW5kbGVkLgorICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBzZXRGcmFtZUNhbGxiYWNrRmxhZyhpbnQgZnJhbWVfY2FsbGJhY2tfZmxhZyk7CiAKICAgICAgICAgLy8gc3RhcnQgcHJldmlldyBtb2RlLCBtdXN0IGNhbGwgc2V0UHJldmlld0Rpc3BsYXkgZmlyc3QKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc3RhcnRQcmV2aWV3KCk7CkBAIC0xMTIsNiArMTE5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcG9zdFJhdyhjb25zdCBzcDxJTWVtb3J5PiYgbWVtKTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcG9zdEpwZWcoY29uc3Qgc3A8SU1lbW9yeT4mIG1lbSk7CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHBvc3RGcmFtZShjb25zdCBzcDxJTWVtb3J5PiYgbWVtKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgY29weUZyYW1lQW5kUG9zdENvcGllZEZyYW1lKHNwPElNZW1vcnlIZWFwPiBoZWFwLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHBvc3RFcnJvcihzdGF0dXNfdCBlcnJvcik7CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHBvc3RBdXRvRm9jdXMoYm9vbCBmb2N1c2VkKTsKIApAQCAtMTE5LDIwICsxMjcsMjAgQEAKICAgICAgICAgbXV0YWJsZSAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOwogICAgICAgICAvLyBtU3VyZmFjZUxvY2sgc3luY2hyb25pemVzIGFjY2VzcyB0byBtU3VyZmFjZSBiZXR3ZWVuCiAgICAgICAgIC8vIHNldFByZXZpZXdTdXJmYWNlKCkgYW5kIHBvc3RGcmFtZSgpLiAgTm90ZSB0aGF0IGFtb25nCi0gICAgICAgIC8vIHRoZSBwdWJsaWMgbWV0aG9kcywgYWxsIGFjY2Vzc2VzIHRvIG1TdXJmYWNlIGFyZSAKKyAgICAgICAgLy8gdGhlIHB1YmxpYyBtZXRob2RzLCBhbGwgYWNjZXNzZXMgdG8gbVN1cmZhY2UgYXJlCiAgICAgICAgIC8vIHN5bmNyaG9uaXplZCBieSBtTG9jay4gIEhvd2V2ZXIsIHBvc3RGcmFtZSgpIGlzIGNhbGxlZAotICAgICAgICAvLyBieSB0aGUgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgY2FsbGJhY2ssIGFuZCBuZWVkcyB0byAKKyAgICAgICAgLy8gYnkgdGhlIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlIGNhbGxiYWNrLCBhbmQgbmVlZHMgdG8KICAgICAgICAgLy8gYWNjZXNzIG1TdXJmYWNlLiAgSXQgY2Fubm90IGhvbGQgbUxvY2ssIGhvd2V2ZXIsIGJlY2F1c2UKICAgICAgICAgLy8gc3RvcFByZXZpZXcoKSBtYXkgYmUgaG9sZGluZyB0aGF0IGxvY2sgd2hpbGUgYXR0ZW1wdGluZwogICAgICAgICAvLyB0b3Agc3RvcCBwcmV2aWV3LCBhbmQgc3RvcFByZXZpZXcgaXRzZWxmIHdpbGwgYmxvY2sgd2FpdGluZwotICAgICAgICAvLyBmb3IgYSBjYWxsYmFjayBmcm9tIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLiAgSWYgdGhpcyAKKyAgICAgICAgLy8gZm9yIGEgY2FsbGJhY2sgZnJvbSBDYW1lcmFIYXJkd2FyZUludGVyZmFjZS4gIElmIHRoaXMKICAgICAgICAgLy8gaGFwcGVucywgaXQgd2lsbCBjYXVzZSBhIGRlYWRsb2NrLgogICAgICAgICBtdXRhYmxlICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2VMb2NrOwogICAgICAgICBtdXRhYmxlICAgICBDb25kaXRpb24gICAgICAgICAgICAgICAgICAgbVJlYWR5OwogICAgICAgICAgICAgICAgICAgICBzcDxDYW1lcmFTZXJ2aWNlPiAgICAgICAgICAgbUNhbWVyYVNlcnZpY2U7CiAgICAgICAgICAgICAgICAgICAgIHNwPElTdXJmYWNlPiAgICAgICAgICAgICAgICBtU3VyZmFjZTsKICAgICAgICAgICAgICAgICAgICAgc3A8TWVtb3J5SGVhcEJhc2U+ICAgICAgICAgIG1QcmV2aWV3QnVmZmVyOwotICAgICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUhhc0ZyYW1lQ2FsbGJhY2s7CisgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVDYWxsYmFja0ZsYWc7CiAKICAgICAgICAgICAgICAgICAgICAgLy8gdGhlc2UgYXJlIGltbXV0YWJsZSBvbmNlIHRoZSBvYmplY3QgaXMgY3JlYXRlZCwKICAgICAgICAgICAgICAgICAgICAgLy8gdGhleSBkb24ndCBuZWVkIHRvIGJlIHByb3RlY3RlZCBieSBhIGxvY2sKZGlmZiAtLWdpdCBhL2ltL2phdmEvYW5kcm9pZC9pbS9CcmFuZGluZ1Jlc291cmNlSURzLmphdmEgYi9pbS9qYXZhL2FuZHJvaWQvaW0vQnJhbmRpbmdSZXNvdXJjZUlEcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NjA3MjIKLS0tIC9kZXYvbnVsbAorKysgYi9pbS9qYXZhL2FuZHJvaWQvaW0vQnJhbmRpbmdSZXNvdXJjZUlEcy5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmltOworCisvKioKKyAqIEBoaWRlCisgKiBEZWZpbmVzIHRoZSBJRHMgb2YgYnJhbmRpbmcgcmVzb3VyY2VzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEJyYW5kaW5nUmVzb3VyY2VJRHMgeworICAgIC8qKgorICAgICAqIFRoZSBsb2dvIGljb24gb2YgdGhlIHByb3ZpZGVyIHdoaWNoIGlzIGRpc3BsYXllZCBpbiB0aGUgbGFuZGluZyBwYWdlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERSQVdBQkxFX0xPR08gICAgICAgICAgICAgICAgPSAxMDA7CisgICAgLyoqCisgICAgICogVGhlIGljb24gb2Ygb25saW5lIHByZXNlbmNlIHN0YXR1cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEUkFXQUJMRV9QUkVTRU5DRV9PTkxJTkUgICAgID0gMTAyOworICAgIC8qKgorICAgICAqIFRoZSBpY29uIG9mIGJ1c3kgcHJlc2VuY2Ugc3RhdHVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERSQVdBQkxFX1BSRVNFTkNFX0JVU1kgICAgICAgPSAxMDM7CisgICAgLyoqCisgICAgICogVGhlIGljb24gb2YgYXdheSBwcmVzZW5jZSBzdGF0dXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFJBV0FCTEVfUFJFU0VOQ0VfQVdBWSAgICAgICA9IDEwNDsKKyAgICAvKioKKyAgICAgKiBUaGUgaWNvbiBvZiBpbnZpc2libGUgcHJlc2VuY2Ugc3RhdHVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERSQVdBQkxFX1BSRVNFTkNFX0lOVklTSUJMRSAgPSAxMDU7CisgICAgLyoqCisgICAgICogVGhlIGljb24gb2Ygb2ZmbGluZSBwcmVzZW5jZSBzdGF0dXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFJBV0FCTEVfUFJFU0VOQ0VfT0ZGTElORSAgICA9IDEwNjsKKyAgICAvKioKKyAgICAgKiBUaGUgbGFiZWwgb2YgdGhlIG1lbnUgdG8gZ28gdG8gdGhlIGNvbnRhY3QgbGlzdCBzY3JlZW4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RSSU5HX01FTlVfQ09OVEFDVF9MSVNUICAgICA9IDEwNzsKKworfQpkaWZmIC0tZ2l0IGEvaW0vamF2YS9hbmRyb2lkL2ltL0lJbVBsdWdpbi5haWRsIGIvaW0vamF2YS9hbmRyb2lkL2ltL0lJbVBsdWdpbi5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyOWNkMGUKLS0tIC9kZXYvbnVsbAorKysgYi9pbS9qYXZhL2FuZHJvaWQvaW0vSUltUGx1Z2luLmFpZGwKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuaW07CisKKy8qKgorICogQGhpZGUKKyAqLworaW50ZXJmYWNlIElJbVBsdWdpbiB7CisgICAgLyoqCisgICAgICogTm90aWZ5IHRoZSBwbHVnaW4gdGhlIGZyb250IGRvb3IgYWN0aXZpdHkgaXMgY3JlYXRlZC4gVGhpcyBnaXZlcyB0aGUgcGx1Z2luIGEgY2hhbmNlIHRvCisgICAgICogc3RhcnQgaXRzIG93biBzZXJ2aWNzLCBldGMuCisgICAgICovCisgICAgdm9pZCBvblN0YXJ0KCk7CisgICAgCisgICAgLyoqCisgICAgICogTm90aWZ5IHRoZSBwbHVnaW4gdGhlIGZyb250IGRvb3IgYWN0aXZpdHkgaXMgc3RvcHBpbmcuCisgICAgICovCisgICAgdm9pZCBvblN0b3AoKTsKKworICAgIC8qKgorICAgICAqIFNpZ24gaW4gdG8gdGhlIHNlcnZpY2UgZm9yIHRoZSBhY2NvdW50IHBhc3NlZCBpbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY2NvdW50IHRoZSBhY2NvdW50IGlkIGZvciB0aGUgYWNjb250IHRvIGJlIHNpZ25lZCBpbnRvLgorICAgICAqLworICAgIHZvaWQgc2lnbkluKGxvbmcgYWNjb3VudCk7CisKKyAgICAvKioKKyAgICAgKiBTaWduIG91dCBvZiB0aGUgc2VydmljZSBmb3IgdGhlIGFjY291bnQgcGFzc2VkIGluLgorICAgICAqCisgICAgICogQHBhcmFtIGFjY291bnQgdGhlIGFjY291bnQgaWQgZm9yIHRoZSBhY2NvbnQgdG8gYmUgc2lnbmVkIG91dCBvZi4KKyAgICAgKi8KKyAgICB2b2lkIHNpZ25PdXQobG9uZyBhY2NvdW50KTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHBhY2thZ2UgbmFtZSB1c2VkIHRvIGxvYWQgdGhlIHJlc291cmNlcyBmb3IgdGhlIGdpdmVuIHByb3ZpZGVyIG5hbWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBwYWNrYWdlIG5hbWUgdG8gbG9hZCB0aGUgcmVzb3VyY3MgZm9yIHRoZSBnaXZlbiBwcm92aWRlci4KKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0UmVzb3VyY2VQYWNrYWdlTmFtZUZvclByb3ZpZGVyKFN0cmluZyBwcm92aWRlck5hbWUpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG1hcCBvZiBicmFuZGluZyByZXNvdXJjZXMgZm9yIHRoZSBnaXZlbiBwcm92aWRlci4gVGhlIGtleXMgYXJlIGRlZmluZWQKKyAgICAgKiBpbiB7QGxpbmsgYW5kcm9pZC5pbS5CcmFuZGluZ1Jlc291cmNlSURzfS4gVGhlIHZhbHVlcyBhcmUgdGhlIHJlc291cmNlIGlkZW50aWZpZXJzIGdlbmVyYXRlZAorICAgICAqIGJ5IHRoZSBhYXB0IHRvb2wuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBtYXAgb2YgYnJhbmRpbmcgcmVzb3VyY2VzIGZvciB0aGUgZ2l2ZW4gcHJvdmlkZXIuCisgICAgICovCisgICAgTWFwIGdldFJlc291cmNlTWFwRm9yUHJvdmlkZXIoU3RyaW5nIHByb3ZpZGVyTmFtZSk7CisKKyAgICAvKgorICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHN1cHBvcnRlZCBJTSBwcm92aWRlcnMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgTGlzdCBvZiBzdXBwb3J0ZWQgcHJvdmlkZXJzLgorICAgICAqLworICAgIExpc3QgZ2V0U3VwcG9ydGVkUHJvdmlkZXJzKCk7Cit9CmRpZmYgLS1naXQgYS9pbS9qYXZhL2FuZHJvaWQvaW0vSW1QbHVnaW5Db25zdHMuamF2YSBiL2ltL2phdmEvYW5kcm9pZC9pbS9JbVBsdWdpbkNvbnN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNjQ5M2YKLS0tIC9kZXYvbnVsbAorKysgYi9pbS9qYXZhL2FuZHJvaWQvaW0vSW1QbHVnaW5Db25zdHMuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmltOworCisvKioKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBJbVBsdWdpbkNvbnN0cyB7CisgICAgLyoqCisgICAgICogVGhlIGludGVudCBhY3Rpb24gbmFtZSBmb3IgdGhlIHBsdWdpbiBzZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9BQ1RJT05fTkFNRSA9ICJhbmRyb2lkLmltLnBsdWdpbiI7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9HTEVTL2VnbG5hdGl2ZXMuaCBiL2luY2x1ZGUvR0xFUy9lZ2xuYXRpdmVzLmgKaW5kZXggZjllNTQ0Yy4uMWNkNTdkMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9HTEVTL2VnbG5hdGl2ZXMuaAorKysgYi9pbmNsdWRlL0dMRVMvZWdsbmF0aXZlcy5oCkBAIC0zMyw3ICszMyw3IEBACiB0eXBlZGVmIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgTmF0aXZlRGlzcGxheVR5cGU7CiAKIC8qIAotICogVGhpcyBhIGNvbnZlbmlhbmNlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIE5hdGl2ZVdpbmRvd1R5cGUgc3VyZmFjZQorICogVGhpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIE5hdGl2ZVdpbmRvd1R5cGUgc3VyZmFjZQogICogdGhhdCBtYXBzIHRvIHRoZSB3aG9sZSBzY3JlZW4KICAqIFRoaXMgZnVuY3Rpb24gaXMgYWN0dWFsbHkgaW1wbGVtZW50ZWQgaW4gbGlidWkuc28KICAqLwpAQCAtNTAsNiArNTAsNyBAQAogewogICAgIE5BVElWRV9QSVhFTF9GT1JNQVRfUkdCQV84ODg4ICAgPSAxLAogICAgIE5BVElWRV9QSVhFTF9GT1JNQVRfUkdCXzU2NSAgICAgPSA0LAorICAgIE5BVElWRV9QSVhFTF9GT1JNQVRfQkdSQV84ODg4ICAgPSA1LAogICAgIE5BVElWRV9QSVhFTF9GT1JNQVRfUkdCQV81NTUxICAgPSA2LAogICAgIE5BVElWRV9QSVhFTF9GT1JNQVRfUkdCQV80NDQ0ICAgPSA3LAogICAgIE5BVElWRV9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIyX1NQPSAweDEwLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcml2YXRlL29wZW5nbGVzL2dsX2NvbnRleHQuaCBiL2luY2x1ZGUvcHJpdmF0ZS9vcGVuZ2xlcy9nbF9jb250ZXh0LmgKaW5kZXggNjdkNTBmZC4uMmFhNzhkOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wcml2YXRlL29wZW5nbGVzL2dsX2NvbnRleHQuaAorKysgYi9pbmNsdWRlL3ByaXZhdGUvb3BlbmdsZXMvZ2xfY29udGV4dC5oCkBAIC01MzIsNiArNTMyLDEwIEBACiAgICAgICAgICAgICB2ZXJ0ZXhfdCBjb25zdCogdjEsCiAgICAgICAgICAgICB2ZXJ0ZXhfdCBjb25zdCogdjIpOwogCisgICAgdm9pZCBpbml0TGluZSgKKyAgICAgICAgICAgIHZlcnRleF90IGNvbnN0KiB2MCwKKyAgICAgICAgICAgIHZlcnRleF90IGNvbnN0KiB2MSk7CisKICAgICBpbmxpbmUgdm9pZCBpbml0TGVycCh2ZXJ0ZXhfdCBjb25zdCogdjAsIHVpbnQzMl90IGVuYWJsZXMpOwogCiAgICAgaW50IGl0ZXJhdG9yc1NjYWxlKGludDMyX3QgaXRbM10sCkBAIC01NDMsNiArNTQ3LDkgQEAKICAgICB2b2lkIGl0ZXJhdG9yczAwMzIoaW50MzJfdCBpdFszXSwKICAgICAgICAgICAgIGludDMyX3QgYzAsIGludDMyX3QgYzEsIGludDMyX3QgYzIpIGNvbnN0OwogCisgICAgdm9pZCBpdGVyYXRvcnMwMDMyKGludDY0X3QgaXRbM10sCisgICAgICAgICAgICBpbnQzMl90IGMwLCBpbnQzMl90IGMxLCBpbnQzMl90IGMyKSBjb25zdDsKKwogICAgIEdHTGNvb3JkIGFyZWEoKSBjb25zdCB7IHJldHVybiBtX2FyZWE7IH0KIAogcHJpdmF0ZToKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWkvQmxpdEhhcmR3YXJlLmggYi9pbmNsdWRlL3VpL0JsaXRIYXJkd2FyZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGUxYzEyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdWkvQmxpdEhhcmR3YXJlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9CTElUX0hBUkRXQVJFX0gKLSNkZWZpbmUgQU5EUk9JRF9CTElUX0hBUkRXQVJFX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIHN1cHBvcnRlZCBwaXhlbC1mb3JtYXRzLiB0aGVzZSBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aAotICogZ3JhcGhpY3MvUGl4ZWxGb3JtYXQuamF2YSwgdWkvUGl4ZWxGb3JtYXQuaCwgcGl4ZWxmbGluZ2VyL2Zvcm1hdC5oCi0gKi8KLQotZW51bQotewotICAgIENPUFlCSVRfUkdCQV84ODg4ICAgID0gMSwKLSAgICBDT1BZQklUX1JHQl81NjUgICAgICA9IDQsCi0gICAgQ09QWUJJVF9SR0JBXzU1NTEgICAgPSA2LAotICAgIENPUFlCSVRfUkdCQV80NDQ0ICAgID0gNywKLSAgICBDT1BZQklUX1lDYkNyXzQyMl9TUCA9IDB4MTAsCi0gICAgQ09QWUJJVF9ZQ2JDcl80MjBfU1AgPSAweDExCi19OwotCi0vKiBuYW1lIGZvciBjb3B5Yml0X3NldF9wYXJhbWV0ZXIgKi8KLWVudW0gCi17Ci0gICAgLyogcm90YXRpb24gb2YgdGhlIHNvdXJjZSBpbWFnZSBpbiBkZWdyZWVzICgwIHRvIDM1OSkgKi8KLSAgICBDT1BZQklUX1JPVEFUSU9OX0RFRyAgICA9IDEsCi0gICAgLyogcGxhbmUgYWxwaGEgdmFsdWUgKi8KLSAgICBDT1BZQklUX1BMQU5FX0FMUEhBICAgICA9IDIsCi0gICAgLyogZW5hYmxlIG9yIGRpc2FibGUgZGl0aGVyaW5nICovCi0gICAgQ09QWUJJVF9ESVRIRVIgICAgICAgICAgPSAzLAotICAgIC8qIHRyYW5zZm9ybWF0aW9uIGFwcGxpZWQgKHRoaXMgaXMgYSBzdXBlcnNldCBvZiBDT1BZQklUX1JPVEFUSU9OX0RFRykgKi8KLSAgICBDT1BZQklUX1RSQU5TRk9STSAgICAgICA9IDQsCi19OwotCi0vKiB2YWx1ZXMgZm9yIGNvcHliaXRfc2V0X3BhcmFtZXRlcihDT1BZQklUX1RSQU5TRk9STSkgKi8KLWVudW0gewotICAgIC8qIGZsaXAgc291cmNlIGltYWdlIGhvcml6b250YWxseSAqLwotICAgIENPUFlCSVRfVFJBTlNGT1JNX0ZMSVBfSCAgICA9IDB4MDEsCi0gICAgLyogZmxpcCBzb3VyY2UgaW1hZ2UgdmVydGljYWxseSAqLwotICAgIENPUFlCSVRfVFJBTlNGT1JNX0ZMSVBfViAgICA9IDB4MDIsCi0gICAgLyogcm90YXRlIHNvdXJjZSBpbWFnZSA5MCBkZWdyZXMgKi8KLSAgICBDT1BZQklUX1RSQU5TRk9STV9ST1RfOTAgICAgPSAweDA0LAotICAgIC8qIHJvdGF0ZSBzb3VyY2UgaW1hZ2UgMTgwIGRlZ3JlcyAqLwotICAgIENPUFlCSVRfVFJBTlNGT1JNX1JPVF8xODAgICA9IDB4MDMsCi0gICAgLyogcm90YXRlIHNvdXJjZSBpbWFnZSAyNzAgZGVncmVzICovCi0gICAgQ09QWUJJVF9UUkFOU0ZPUk1fUk9UXzI3MCAgID0gMHgwNywKLX07Ci0KLS8qIGVuYWJsZS9kaXNhYmxlIHZhbHVlIGNvcHliaXRfc2V0X3BhcmFtZXRlciAqLwotZW51bSB7Ci0gICAgQ09QWUJJVF9ESVNBQkxFID0gMCwKLSAgICBDT1BZQklUX0VOQUJMRSAgPSAxCi19OwotCi0vKiB1c2UgZ2V0KCkgdG8gcXVlcnkgc3RhdGljIGluZm9ybWF0aW9ucyBhYm91dCB0aGUgaGFyZHdhcmUgKi8KLWVudW0gewotICAgIC8qIE1heGltdW0gYW1vdW50IG9mIG1pbmlmaWNhdGlvbiBzdXBwb3J0ZWQgYnkgdGhlIGhhcmR3YXJlKi8KLSAgICBDT1BZQklUX01JTklGSUNBVElPTl9MSU1JVCAgPSAxLAotICAgIC8qIE1heGltdW0gYW1vdW50IG9mIG1hZ25pZmljYXRpb24gc3VwcG9ydGVkIGJ5IHRoZSBoYXJkd2FyZSAqLwotICAgIENPUFlCSVRfTUFHTklGSUNBVElPTl9MSU1JVCA9IDIsCi0gICAgLyogTnVtYmVyIG9mIGZyYWN0aW9uYWwgYml0cyBzdXBwb3J0IGJ5IHRoZSBzY2FsaW5nIGVuZ2luZSAqLwotICAgIENPUFlCSVRfU0NBTElOR19GUkFDX0JJVFMgICA9IDMsCi0gICAgLyogU3VwcG9ydGVkIHJvdGF0aW9uIHN0ZXAgaW4gZGVncmVzLiAqLwotICAgIENPUFlCSVRfUk9UQVRJT05fU1RFUF9ERUcgICA9IDQsCi19OwotCi1zdHJ1Y3QgY29weWJpdF9pbWFnZV90IHsKLSAgICB1aW50MzJfdCAgICB3OwotICAgIHVpbnQzMl90ICAgIGg7Ci0gICAgaW50MzJfdCAgICAgZm9ybWF0OwotICAgIHVpbnQzMl90ICAgIG9mZnNldDsKLSAgICB2b2lkKiAgICAgICBiYXNlOwotICAgIGludCAgICAgICAgIGZkOwotfTsKLQotCi1zdHJ1Y3QgY29weWJpdF9yZWN0X3QgewotICAgIGludCBsOwotICAgIGludCB0OwotICAgIGludCByOwotICAgIGludCBiOwotfTsKLQotc3RydWN0IGNvcHliaXRfcmVnaW9uX3QgewotICAgIGludCAoKm5leHQpKGNvcHliaXRfcmVnaW9uX3QgY29uc3QqLCBjb3B5Yml0X3JlY3RfdCogcmVjdCk7IAotfTsKLQotc3RydWN0IGNvcHliaXRfdAotewotICAgIGludCAoKnNldF9wYXJhbWV0ZXIpKHN0cnVjdCBjb3B5Yml0X3QqIGhhbmRsZSwgaW50IG5hbWUsIGludCB2YWx1ZSk7Ci0KLSAgICBpbnQgKCpnZXQpKHN0cnVjdCBjb3B5Yml0X3QqIGhhbmRsZSwgaW50IG5hbWUpOwotICAgIAotICAgIGludCAoKmJsaXQpKAotICAgICAgICAgICAgc3RydWN0IGNvcHliaXRfdCogaGFuZGxlLCAKLSAgICAgICAgICAgIHN0cnVjdCBjb3B5Yml0X2ltYWdlX3QgY29uc3QqIGRzdCwgCi0gICAgICAgICAgICBzdHJ1Y3QgY29weWJpdF9pbWFnZV90IGNvbnN0KiBzcmMsCi0gICAgICAgICAgICBzdHJ1Y3QgY29weWJpdF9yZWdpb25fdCBjb25zdCogcmVnaW9uKTsKLQotICAgIGludCAoKnN0cmV0Y2gpKAotICAgICAgICAgICAgc3RydWN0IGNvcHliaXRfdCogaGFuZGxlLCAKLSAgICAgICAgICAgIHN0cnVjdCBjb3B5Yml0X2ltYWdlX3QgY29uc3QqIGRzdCwgCi0gICAgICAgICAgICBzdHJ1Y3QgY29weWJpdF9pbWFnZV90IGNvbnN0KiBzcmMsIAotICAgICAgICAgICAgc3RydWN0IGNvcHliaXRfcmVjdF90IGNvbnN0KiBkc3RfcmVjdCwKLSAgICAgICAgICAgIHN0cnVjdCBjb3B5Yml0X3JlY3RfdCBjb25zdCogc3JjX3JlY3QsCi0gICAgICAgICAgICBzdHJ1Y3QgY29weWJpdF9yZWdpb25fdCBjb25zdCogcmVnaW9uKTsKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBjb3B5Yml0X3QqIGNvcHliaXRfaW5pdCgpOwotCi1pbnQgY29weWJpdF90ZXJtKHN0cnVjdCBjb3B5Yml0X3QqIGhhbmRsZSk7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmIF9fY3BsdXNwbHVzCi19IC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0jZW5kaWYgLy8gQU5EUk9JRF9CTElUX0hBUkRXQVJFX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWkvQ2FtZXJhLmggYi9pbmNsdWRlL3VpL0NhbWVyYS5oCmluZGV4IDU2MmEwYTIuLjEyNGYwN2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWkvQ2FtZXJhLmgKKysrIGIvaW5jbHVkZS91aS9DYW1lcmEuaApAQCAtMSw1ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDA4IEhUQyBJbmMuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0yMSw2ICsyMiwzOSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKKy8qCisgKiBBIHNldCBvZiBiaXQgbWFza3MgZm9yIHNwZWNpZnlpbmcgaG93IHRoZSByZWNlaXZlZCBmcmFtZXMgZnJvbSBwcmV2aWV3IGFyZQorICogaGFuZGxlZCBiZWZvcmUgdGhlIGZyYW1lIGNhbGxiYWNrIGNhbGwuCisgKgorICogVGhlIGxlYXN0IHNpZ25pZmljYW50IDMgYml0cyBvZiBhbiAiaW50IiB2YWx1ZSBhcmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlOgorICoKKyAqIC4uLi4uIDAgMCAwCisgKiAgICAgICBeIF4gXgorICogICAgICAgfCB8IHwtLS0tLS0tLS0+IGRldGVybWluZSB3aGV0aGVyIHRoZSBjYWxsYmFjayBpcyBlbmFibGVkIG9yIG5vdAorICogICAgICAgfCB8LS0tLS0tLS0tLS0+IGRldGVybWluZSB3aGV0aGVyIHRoZSBjYWxsYmFjayBpcyBvbmUtc2hvdCBvciBub3QKKyAqICAgICAgIHwtLS0tLS0tLS0tLS0tPiBkZXRlcm1pbmUgd2hldGhlciB0aGUgZnJhbWUgaXMgY29waWVkIG91dCBvciBub3QKKyAqCisgKiBGb3IgaW5zdGFuY2UsCisgKiAxLiAweDAwIGRpc2FibGVzIHRoZSBjYWxsYmFjay4gSW4gdGhpcyBjYXNlLCBjb3B5IG91dCBhbmQgb25lIHNob3QgYml0cworICogICAgYXJlIGlnbm9yZWQuCisgKiAyLiAweDAxIGVuYWJsZXMgYSBjYWxsYmFjayB3aXRob3V0IGNvcHlpbmcgb3V0IHRoZSByZWNpZXZpZWQgZnJhbWVzLiBBCisgKiAgICB0eXBpY2FsIHVzZSBjYXNlIGlzIHRoZSBDYW1jb3JkZXIgYXBwbGljYXRpb24gdG8gYXZvaWQgbWFraW5nIGNvc3RseQorICogICAgZnJhbWUgY29waWVzLgorICogMy4gMHgwNSBpcyBlbmFibGluZyBhIGNhbGxiYWNrIHdpdGggZnJhbWUgY29waWVkIG91dCByZXBlYXRlZGx5LiBBIHR5cGljYWwKKyAqICAgIHVzZSBjYXNlIGlzIHRoZSBDYW1lcmEgYXBwbGljYXRpb24uCisgKiA0LiAweDA3IGlzIGVuYWJsaW5nIGEgY2FsbGJhY2sgd2l0aCBmcmFtZSBjb3BpZWQgb3V0IG9ubHkgb25jZS4gQSB0eXBpY2FsIHVzZQorICogICAgY2FzZSBpcyB0aGUgQmFyY29kZSBzY2FubmVyIGFwcGxpY2F0aW9uLgorICovCisjZGVmaW5lIEZSQU1FX0NBTExCQUNLX0ZMQUdfRU5BQkxFX01BU0sgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgRlJBTUVfQ0FMTEJBQ0tfRkxBR19PTkVfU0hPVF9NQVNLICAgICAgICAgICAgMHgwMgorI2RlZmluZSBGUkFNRV9DQUxMQkFDS19GTEFHX0NPUFlfT1VUX01BU0sgICAgICAgICAgICAweDA0CisKKy8vIFR5cGljYWwgdXNlIGNhc2VzCisjZGVmaW5lIEZSQU1FX0NBTExCQUNLX0ZMQUdfTk9PUCAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgRlJBTUVfQ0FMTEJBQ0tfRkxBR19DQU1DT1JERVIgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBGUkFNRV9DQUxMQkFDS19GTEFHX0NBTUVSQSAgICAgICAgICAgICAgICAgICAweDA1CisjZGVmaW5lIEZSQU1FX0NBTExCQUNLX0ZMQUdfQkFSQ09ERV9TQ0FOTkVSICAgICAgICAgIDB4MDcKKwogY2xhc3MgSUNhbWVyYVNlcnZpY2U7CiBjbGFzcyBJQ2FtZXJhOwogY2xhc3MgU3VyZmFjZTsKQEAgLTM1LDE1ICs2OSwyMSBAQAogY2xhc3MgQ2FtZXJhIDogcHVibGljIEJuQ2FtZXJhQ2xpZW50LCBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKIHsKIHB1YmxpYzoKKyAgICAgICAgICAgIC8vIGNvbnN0cnVjdCBhIGNhbWVyYSBjbGllbnQgZnJvbSBhbiBleGlzdGluZyByZW1vdGUKKyAgICAgICAgICAgIENhbWVyYShjb25zdCBzcDxJQ2FtZXJhPiYgY2FtZXJhKTsKKwogICAgIHN0YXRpYyAgc3A8Q2FtZXJhPiAgY29ubmVjdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgfkNhbWVyYSgpOworICAgICAgICAgICAgdm9pZCAgICAgICAgaW5pdCgpOwogCisgICAgICAgICAgICBzdGF0dXNfdCAgICByZWNvbm5lY3QoKTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIGRpc2Nvbm5lY3QoKTsKIAogICAgICAgICAgICAgc3RhdHVzX3QgICAgZ2V0U3RhdHVzKCkgeyByZXR1cm4gbVN0YXR1czsgfQogCiAgICAgICAgICAgICAvLyBwYXNzIHRoZSBidWZmZXJlZCBJU3VyZmFjZSB0byB0aGUgY2FtZXJhIHNlcnZpY2UKICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldFByZXZpZXdEaXNwbGF5KGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgIHNldFByZXZpZXdEaXNwbGF5KGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSk7CiAKICAgICAgICAgICAgIC8vIHN0YXJ0IHByZXZpZXcgbW9kZSwgbXVzdCBjYWxsIHNldFByZXZpZXdEaXNwbGF5IGZpcnN0CiAgICAgICAgICAgICBzdGF0dXNfdCAgICBzdGFydFByZXZpZXcoKTsKQEAgLTY2LDcgKzEwNiwxMSBAQAogICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0U2h1dHRlckNhbGxiYWNrKHNodXR0ZXJfY2FsbGJhY2sgY2IsIHZvaWQgKmNvb2tpZSk7CiAgICAgICAgICAgICB2b2lkICAgICAgICBzZXRSYXdDYWxsYmFjayhmcmFtZV9jYWxsYmFjayBjYiwgdm9pZCAqY29va2llKTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIHNldEpwZWdDYWxsYmFjayhmcmFtZV9jYWxsYmFjayBjYiwgdm9pZCAqY29va2llKTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgIHNldEZyYW1lQ2FsbGJhY2soZnJhbWVfY2FsbGJhY2sgY2IsIHZvaWQgKmNvb2tpZSk7CisKKyAgICAgICAgICAgIHZvaWQgICAgICAgIHNldEZyYW1lQ2FsbGJhY2soZnJhbWVfY2FsbGJhY2sgY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29va2llLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZV9jYWxsYmFja19mbGFnID0gRlJBTUVfQ0FMTEJBQ0tfRkxBR19OT09QKTsKKwogICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0RXJyb3JDYWxsYmFjayhlcnJvcl9jYWxsYmFjayBjYiwgdm9pZCAqY29va2llKTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIHNldEF1dG9Gb2N1c0NhbGxiYWNrKGF1dG9mb2N1c19jYWxsYmFjayBjYiwgdm9pZCAqY29va2llKTsKICAgICAvLyBJQ2FtZXJhQ2xpZW50IGludGVyZmFjZQpAQCAtNzcsNyArMTIxLDggQEAKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGVycm9yQ2FsbGJhY2soc3RhdHVzX3QgZXJyb3IpOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgYXV0b0ZvY3VzQ2FsbGJhY2soYm9vbCBmb2N1c2VkKTsKIAotICAgIAorICAgIHNwPElDYW1lcmE+ICAgICAgICAgcmVtb3RlKCk7CisKIHByaXZhdGU6CiAgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmEoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pOwpAQCAtODUsMTQgKzEzMCwxNCBAQAogICAgICAgICAgICAgY2xhc3MgRGVhdGhOb3RpZmllcjogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICAgICAgRGVhdGhOb3RpZmllcigpIHsgICAgICAKKyAgICAgICAgICAgICAgICBEZWF0aE5vdGlmaWVyKCkgewogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKKwogICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pOwogICAgICAgICAgICAgfTsKLSAgICAgICAgCisKICAgICAgICAgICAgIHN0YXRpYyBzcDxEZWF0aE5vdGlmaWVyPiBtRGVhdGhOb3RpZmllcjsKLSAgICAgICAgCisKICAgICAgICAgICAgIC8vIGhlbHBlciBmdW5jdGlvbiB0byBvYnRhaW4gY2FtZXJhIHNlcnZpY2UgaGFuZGxlCiAgICAgICAgICAgICBzdGF0aWMgY29uc3Qgc3A8SUNhbWVyYVNlcnZpY2U+JiBnZXRDYW1lcmFTZXJ2aWNlKCk7CiAKQEAgLTExMSwxMiArMTU2LDEyIEBACiAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICptRXJyb3JDYWxsYmFja0Nvb2tpZTsKICAgICAgICAgICAgIGF1dG9mb2N1c19jYWxsYmFjayAgbUF1dG9Gb2N1c0NhbGxiYWNrOwogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAqbUF1dG9Gb2N1c0NhbGxiYWNrQ29va2llOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGZyaWVuZCBjbGFzcyBEZWF0aE5vdGlmaWVyOwogCiAgICAgICAgICAgICBzdGF0aWMgIE11dGV4ICAgICAgICAgICAgICAgbUxvY2s7CiAgICAgICAgICAgICBzdGF0aWMgIHNwPElDYW1lcmFTZXJ2aWNlPiAgbUNhbWVyYVNlcnZpY2U7Ci0gICAgICAgICAgICAKKwogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWkvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaCBiL2luY2x1ZGUvdWkvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaAppbmRleCA1ZmE5MzNmLi4xNGFjOTZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VpL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmgKKysrIGIvaW5jbHVkZS91aS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oCkBAIC0zOSw0OCArMzksNDIgQEAKIHR5cGVkZWYgdm9pZCAoKmF1dG9mb2N1c19jYWxsYmFjaykoYm9vbCBmb2N1c2VkLCB2b2lkKiB1c2VyKTsKIAogLyoqCi0gKiBUaGlzIGRlZmluZXMgdGhlIGludGVyZmFjZSB0byB0aGUgY2FtZXJhIGhhcmR3YXJlIGFic3RyYWN0aW9uCi0gKiBsYXllci4gSXQgc3VwcG9ydHMgc2V0dGluZyBhbmQgZ2V0dGluZyBwYXJhbWV0ZXJzLCBsaXZlCi0gKiBwcmV2aWV3aW5nIGFuZCB0YWtpbmcgcGljdHVyZXMuIEl0IGlzIGEgcmVmZXJlbmNlZCBjb3VudGVkCi0gKiBpbnRlcmZhY2Ugd2l0aCBSZWZCYXNlIGFzIGl0cyBiYXNlIGNsYXNzLgorICogQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaCBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgdG8gdGhlCisgKiBjYW1lcmEgaGFyZHdhcmUgYWJzdHJhY3Rpb24gbGF5ZXIsIHVzZWQgZm9yIHNldHRpbmcgYW5kIGdldHRpbmcKKyAqIHBhcmFtZXRlcnMsIGxpdmUgcHJldmlld2luZywgYW5kIHRha2luZyBwaWN0dXJlcy4KICAqCi0gKiBUaGUgb3BlbkNhbWVyYUhhcmR3YXJlIGZ1bmN0aW9uIGlzIHVzZWQgdG8KLSAqIHJldHJpZXZlIGEgc3Ryb25nIHBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIG9mIHRoaXMgaW50ZXJmYWNlCi0gKiBhbmQgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KKyAqIEl0IGlzIGEgcmVmZXJlbmNlZCBjb3VudGVkIGludGVyZmFjZSB3aXRoIFJlZkJhc2UgYXMgaXRzIGJhc2UgY2xhc3MuCisgKiBDYW1lcmFTZXJ2aWNlIGNhbGxzIG9wZW5DYW1lcmFIYXJkd2FyZSgpIHRvIHJldHJpZXZlIGEgc3Ryb25nIHBvaW50ZXIgdG8gdGhlCisgKiBpbnN0YW5jZSBvZiB0aGlzIGludGVyZmFjZSBhbmQgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gVGhlCisgKiBmb2xsb3dpbmcgc3RlcHMgZGVzY3JpYmUgYSB0eXBpY2FsIHNlcXVlbmNlOgogICoKLSAqIEFmdGVyIGNhbGxpbmcgb3BlbkNhbWVyYUhhcmR3YXJlIHRoZSBnZXRQYXJhbWV0ZXJzIGFuZAotICogc2V0UGFyYW1ldGVycyBhcmUgdXNlZCB0byBpbml0aWFsaXplIHRoZSBjYW1lcmEgaW5zdGFuY2UuCisgKiAgIC0jIEFmdGVyIENhbWVyYVNlcnZpY2UgY2FsbHMgb3BlbkNhbWVyYUhhcmR3YXJlKCksIGdldFBhcmFtZXRlcnMoKSBhbmQKKyAqICAgICAgc2V0UGFyYW1ldGVycygpIGFyZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGNhbWVyYSBpbnN0YW5jZS4KKyAqICAgICAgQ2FtZXJhU2VydmljZSBjYWxscyBnZXRQcmV2aWV3SGVhcCgpIHRvIGVzdGFibGlzaCBhY2Nlc3MgdG8gdGhlCisgKiAgICAgIHByZXZpZXcgaGVhcCBzbyBpdCBjYW4gYmUgcmVnaXN0ZXJlZCB3aXRoIFN1cmZhY2VGbGluZ2VyIGZvcgorICogICAgICBlZmZpY2llbnQgZGlzcGxheSB1cGRhdGluZyB3aGlsZSBpbiBwcmV2aWV3IG1vZGUuCisgKiAgIC0jIHN0YXJ0UHJldmlldygpIGlzIGNhbGxlZCwgd2hpY2ggaXMgcGFzc2VkIGEgcHJldmlld19jYWxsYmFjaygpCisgKiAgICAgIGZ1bmN0aW9uIGFuZCBhIHVzZXIgcGFyYW1ldGVyLiBUaGUgY2FtZXJhIGluc3RhbmNlIHRoZW4gcGVyaW9kaWNhbGx5CisgKiAgICAgIGNhbGxzIHByZXZpZXdfY2FsbGJhY2soKSBlYWNoIHRpbWUgYSBuZXcgcHJldmlldyBmcmFtZSBpcyBhdmFpbGFibGUuCisgKiAgICAgIFRoZSBjYWxsYmFjayByb3V0aW5lIGhhcyB0d28gcGFyYW1ldGVyczogdGhlIGZpcnN0IGlzIGEgcG9pbnRlciB0bworICogICAgICB0aGUgSU1lbW9yeSBjb250YWluaW5nIHRoZSBmcmFtZSBhbmQgdGhlIHNlY29uZCBhIHVzZXIgcGFyYW1ldGVyLiBJZgorICogICAgICB0aGUgcHJldmlld19jYWxsYmFjayBjb2RlIG5lZWRzIHRvIHVzZSB0aGlzIG1lbW9yeSBhZnRlciByZXR1cm5pbmcsCisgKiAgICAgIGl0IG11c3QgY29weSB0aGUgZGF0YS4KICAqCi0gKiBUaGVuIGdldFByZXZpZXdIZWFwIGlzIGNhbGxlZCB0byBnZXQgYWNjZXNzIHRvIHRoZSBwcmV2aWV3Ci0gKiBoZWFwIHNvIGl0IGNhbiBiZSByZWdpc3RlcmVkIHdpdGggdGhlIFN1cmZhY2VGbGluZ2VyIGZvciBlZmZpY2llbnQKLSAqIGRpc3BsYXkgdXBkYXRpbmcgd2hpbGUgaW4gdGhlIHByZXZpZXcgbW9kZS4KKyAqIFByaW9yIHRvIHRha2luZyBhIHBpY3R1cmUsIENhbWVyYVNlcnZpY2UgY2FsbHMgYXV0b2ZvY3VzKCkgd2l0aAorICogYXV0b2ZvY3VzX2NhbGxiYWNrKCkgYW5kIGEgdXNlciBwYXJhbWV0ZXIuIFdoZW4gYXV0byBmb2N1c2luZyBoYXMKKyAqIGNvbXBsZXRlZCwgdGhlIGNhbWVyYSBpbnN0YW5jZSBjYWxscyBhdXRvZm9jdXNfY2FsbGJhY2soKSwgd2hpY2ggaW5mb3JtcworICogdGhlIGFwcGxpY2F0aW9uIHdoZXRoZXIgZm9jdXNpbmcgd2FzIHN1Y2Nlc3NmdWwuIFRoZSBjYW1lcmEgaW5zdGFuY2UKKyAqIG9ubHkgY2FsbHMgYXV0b2ZvY3VzX2NhbGxiYWNrKCkgb25jZSBhbmQgaXQgaXMgdXAgdG8gdGhlIGFwcGxpY2F0aW9uIHRvCisgKiBjYWxsIGF1dG9Gb2N1cygpIGFnYWluIGlmIHJlZm9jdXNpbmcgaXMgZGVzaXJlZC4KICAqCi0gKiBOZXh0IHN0YXJ0UHJldmlldyBpcyBjYWxsZWQgd2hpY2ggaXMgcGFzc2VkIGEgcHJldmlld19jYWxsYmFjawotICogZnVuY3Rpb24gYW5kIGEgdXNlciBwYXJhbWV0ZXIuIFRoZSBjYW1lcmEgaW5zdGFuY2UgdGhlbgotICogcGVyaW9kaWNhbGx5IGNhbGxzIHByZXZpZXdfY2FsbGJhY2sgZWFjaCB0aW1lIGEgbmV3Ci0gKiBwcmV2aWV3IGZyYW1lIGlzIGF2YWlsYWJsZS4gVGhlIGNhbGwgYmFjayByb3V0aW5lIGhhcwotICogdHdvIHBhcmFtZXRlcnMsIHRoZSBmaXJzdCBpcyBhIHBvaW50ZXIgdG8gdGhlIHRoZSBJTWVtb3J5IGNvbnRhaW5pbmcKLSAqIHRoZSBmcmFtZSBhbmQgdGhlIG90aGVyIGlzIHRoZSB1c2VyIHBhcmFtZXRlci4gSWYgdGhlIHByZXZpZXdfY2FsbGJhY2sKLSAqIGNvZGUgbmVlZHMgdG8gdXNlIHRoaXMgbWVtb3J5IGFmdGVyIHJldHVybmluZyBpdCBtdXN0IGNvcHkKLSAqIHRoZSBkYXRhLgotICoKLSAqIFByaW9yIHRvIHRha2luZyBhIHBpY3R1cmUgdGhlIGF1dG9Gb2N1cyBtZXRob2QgaXMgdXN1YWxseSBjYWxsZWQgd2l0aCBhCi0gKiBhdXRvZm9jdXNfY2FsbGJhY2sgYW5kIGEgdXNlciBwYXJhbWV0ZXIuIFdoZW4gYXV0byBmb2N1c2luZwotICogaGFzIGNvbXBsZXRlZCB0aGUgY2FtZXJhIGluc3RhbmNlIGNhbGxzIGF1dG9mb2N1c19jYWxsYmFjayB3aGljaAotICogaW5mb3JtcyB0aGUgYXBwbGljYXRpb24gaWYgZm9jdXNpbmcgd2FzIHN1Y2Nlc3NmdWwgb3Igbm90LgotICogVGhlIGNhbWVyYSBpbnN0YW5jZSBvbmx5IGNhbGxzIHRoZSBhdXRvZm9jdXNfY2FsbGJhY2sgb25jZSBhbmQgaXQKLSAqIGlzIHVwIHRvIHRoZSBhcHBsaWNhdGlvbiB0byBjYWxsIGF1dG9Gb2N1cyBhZ2FpbiBpZiByZWZvY3VzaW5nIGlzIGRlc2lyZWQuCi0gKgotICogVGhlIG1ldGhvZCB0YWtlUGljdHVyZSBpcyBjYWxsZWQgdG8gcmVxdWVzdCB0aGF0IHRoZSBjYW1lcmEgaW5zdGFuY2UgdGFrZSBhCi0gKiBwaWN0dXJlLiBUaGlzIG1ldGhvZCBoYXMgdGhyZWUgY2FsbGJhY2tzOiBzaHV0dGVyX2NhbGxiYWNrLCByYXdfY2FsbGJhY2ssCi0gKiBhbmQganBlZ19jYWxsYmFjay4gQXMgc29vbiBhcyB0aGUgc2h1dHRlciBzbmFwcyBhbmQgaXQgaXMgc2FmZSB0byBtb3ZlIHRoZQotICogY2FtZXJhLCBzaHV0dGVyX2NhbGxiYWNrIGlzIGNhbGxlZC4gIFR5cGljYWxseSwgeW91IHdvdWxkIHdhbnQgdG8gcGxheSB0aGUKLSAqIHNodXR0ZXIgc291bmQgYXQgdGhpcyBtb21lbnQuIExhdGVyLCB3aGVuIHRoZSByYXcgaW1hZ2UgaXMgYXZhaWxhYmxlIHRoZQotICogcmF3X2NhbGxiYWNrIGlzIGNhbGxlZCB3aXRoIGEgcG9pbnRlciB0byB0aGUgSU1lbW9yeSBjb250YWluaW5nIHRoZSByYXcKLSAqIGltYWdlLiAgRmluYWxseSwgd2hlbiB0aGUgZW5jb2RlZCBqcGVnIGltYWdlIGlzIGF2YWlsYWJsZSB0aGUganBlZ19jYWxsYmFjawotICogd2lsbCBiZSBjYWxsZWQgd2l0aCBhIHBvaW50ZXIgdG8gdGhlIElNZW1vcnkgY29udGFpbmluZyB0aGUganBlZyBpbWFnZS4gIEFzCi0gKiB3aXRoIHRoZSBwcmV2aWV3X2NhbGxiYWNrIHRoZSBtZW1vcnkgbXVzdCBiZSBjb3BpZWQgaWYgaXQncyBuZWVkZWQgYWZ0ZXIKLSAqIHJldHVybmluZy4KKyAqIENhbWVyYVNlcnZpY2UgY2FsbHMgdGFrZVBpY3R1cmUoKSB0byByZXF1ZXN0IHRoZSBjYW1lcmEgaW5zdGFuY2UgdGFrZSBhCisgKiBwaWN0dXJlLiBUaGlzIG1ldGhvZCBoYXMgdHdvIGNhbGxiYWNrczogcmF3X2NhbGxiYWNrKCkgYW5kIGpwZWdfY2FsbGJhY2soKS4KKyAqIFdoZW4gdGhlIHJhdyBpbWFnZSBpcyBhdmFpbGFibGUsIHJhd19jYWxsYmFjaygpIGlzIGNhbGxlZCB3aXRoIGEgcG9pbnRlcgorICogdG8gdGhlIElNZW1vcnkgY29udGFpbmluZyB0aGUgcmF3IGltYWdlLiBXaGVuIHRoZSBqcGVnIGltYWdlIGlzIGF2YWlsYWJsZSwKKyAqIGpwZWdfY2FsbGJhY2soKSBpcyBjYWxsZWQgd2l0aCBhIHBvaW50ZXIgdG8gdGhlIElNZW1vcnkgY29udGFpbmluZyB0aGUKKyAqIGpwZWcgaW1hZ2UuIEFzIHdpdGggcHJldmlld19jYWxsYmFjaygpLCB0aGUgbWVtb3J5IG11c3QgYmUgY29waWVkIGlmIGl0J3MKKyAqIG5lZWRlZCBhZnRlciByZXR1cm5pbmcuCiAgKi8KIGNsYXNzIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZSB7CiBwdWJsaWM6CkBAIC0xMDQsNyArOTgsNyBAQAogICAgIC8qKgogICAgICAqIFN0YXJ0IGF1dG8gZm9jdXMsIHRoZSBjYWxsYmFjayByb3V0aW5lIGlzIGNhbGxlZAogICAgICAqIG9uY2Ugd2hlbiBmb2N1c2luZyBpcyBjb21wbGV0ZS4gYXV0b0ZvY3VzKCkgd2lsbAotICAgICAqIGJlIGNhbGxlZCBhZ2FpbmVkIGlmIGFub3RoZXIgYXV0byBmb2N1cyBpcyBuZWVkZWQuCisgICAgICogYmUgY2FsbGVkIGFnYWluIGlmIGFub3RoZXIgYXV0byBmb2N1cyBpcyBuZWVkZWQuCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBhdXRvRm9jdXMoYXV0b2ZvY3VzX2NhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIpID0gMDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWkvRUdMRGlzcGxheVN1cmZhY2UuaCBiL2luY2x1ZGUvdWkvRUdMRGlzcGxheVN1cmZhY2UuaAppbmRleCBhOWNmZDVhLi4wMTkwZTA5IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VpL0VHTERpc3BsYXlTdXJmYWNlLmgKKysrIGIvaW5jbHVkZS91aS9FR0xEaXNwbGF5U3VyZmFjZS5oCkBAIC0yMywxMSArMjMsMTIgQEAKICNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KIAogI2luY2x1ZGUgPHVpL0VHTE5hdGl2ZVN1cmZhY2UuaD4KLSNpbmNsdWRlIDx1aS9CbGl0SGFyZHdhcmUuaD4KIAogI2luY2x1ZGUgPHBpeGVsZmxpbmdlci9waXhlbGZsaW5nZXIuaD4KICNpbmNsdWRlIDxsaW51eC9mYi5oPgogCitzdHJ1Y3QgY29weWJpdF9kZXZpY2VfdDsKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTcxLDcgKzcyLDcgQEAKICAgICBpbnQzMl90ICAgICAgICAgICAgIG1Td2FwQ291bnQ7CiAgICAgbnNlY3NfdCAgICAgICAgICAgICBtU2xlZXA7CiAgICAgdWludDMyX3QgICAgICAgICAgICBtRmVhdHVyZUZsYWdzOwotICAgIGNvcHliaXRfdCogICAgICAgICAgbUJsaXRFbmdpbmU7CisgICAgY29weWJpdF9kZXZpY2VfdCogICBtQmxpdEVuZ2luZTsKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91aS9JQ2FtZXJhLmggYi9pbmNsdWRlL3VpL0lDYW1lcmEuaAppbmRleCA2YWEzOTQwLi45OWMwZDg2IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VpL0lDYW1lcmEuaAorKysgYi9pbmNsdWRlL3VpL0lDYW1lcmEuaApAQCAtMjAsMTMgKzIwLDE1IEBACiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL0lJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDx1dGlscy9QYXJjZWwuaD4KLQogI2luY2x1ZGUgPHVpL0lTdXJmYWNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvSU1lbW9yeS5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1aS9DYW1lcmEuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitjbGFzcyBJQ2FtZXJhQ2xpZW50OworCiBjbGFzcyBJQ2FtZXJhOiBwdWJsaWMgSUludGVyZmFjZQogewogcHVibGljOgpAQCAtMzQsMTEgKzM2LDE1IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBkaXNjb25uZWN0KCkgPSAwOwogCisgICAgLy8gY29ubmVjdCBuZXcgY2xpZW50IHdpdGggZXhpc3RpbmcgY2FtZXJhIHJlbW90ZQorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGNvbm5lY3QoY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNsaWVudCkgPSAwOworCiAgICAgLy8gcGFzcyB0aGUgYnVmZmVyZWQgSVN1cmZhY2UgdG8gdGhlIGNhbWVyYSBzZXJ2aWNlCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKSA9IDA7Ci0gICAgCi0gICAgLy8gdGVsbCB0aGUgc2VydmljZSB3aGV0aGVyIHRvIGNhbGxiYWNrIHdpdGggZWFjaCBwcmV2aWV3IGZyYW1lCi0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgc2V0SGFzRnJhbWVDYWxsYmFjayhib29sIGluc3RhbGxlZCkgPSAwOworCisgICAgLy8gc2V0IHRoZSBmcmFtZSBjYWxsYmFjayBmbGFnIHRvIGFmZmVjdCBob3cgdGhlIHJlY2VpdmVkIGZyYW1lcyBmcm9tCisgICAgLy8gcHJldmlldyBhcmUgaGFuZGxlZC4KKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBzZXRGcmFtZUNhbGxiYWNrRmxhZyhpbnQgZnJhbWVfY2FsbGJhY2tfZmxhZykgPSAwOwogCiAgICAgLy8gc3RhcnQgcHJldmlldyBtb2RlLCBtdXN0IGNhbGwgc2V0UHJldmlld0Rpc3BsYXkgZmlyc3QKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzdGFydFByZXZpZXcoKSA9IDA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3VpL0lPdmVybGF5LmggYi9pbmNsdWRlL3VpL0lPdmVybGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIzZmYwNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdWkvSU92ZXJsYXkuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0lPVkVSTEFZX0gKKyNkZWZpbmUgQU5EUk9JRF9JT1ZFUkxBWV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dWkvUGl4ZWxGb3JtYXQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBJT3ZlcmxheSA6IHB1YmxpYyBJSW50ZXJmYWNlCit7CitwdWJsaWM6IAorICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoT3ZlcmxheSk7CisKKyAgICB2aXJ0dWFsIHZvaWQgZGVzdHJveSgpID0gMDsgLy8gb25lLXdheQorICAgIAorICAgIHZpcnR1YWwgc3NpemVfdCBzd2FwQnVmZmVycygpID0gMDsKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgQm5PdmVybGF5IDogcHVibGljIEJuSW50ZXJmYWNlPElPdmVybGF5PgoreworcHVibGljOgorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCggdWludDMyX3QgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9JT1ZFUkxBWV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3VpL0lTdXJmYWNlLmggYi9pbmNsdWRlL3VpL0lTdXJmYWNlLmgKaW5kZXggY2E2OTFmNS4uZmYwMzFkNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS91aS9JU3VyZmFjZS5oCisrKyBiL2luY2x1ZGUvdWkvSVN1cmZhY2UuaApAQCAtMzAsNiArMzAsNyBAQAogdHlwZWRlZiBpbnQzMl90ICAgIFN1cmZhY2VJRDsKIAogY2xhc3MgSU1lbW9yeUhlYXA7CitjbGFzcyBPdmVybGF5OwogCiBjbGFzcyBJU3VyZmFjZSA6IHB1YmxpYyBJSW50ZXJmYWNlCiB7CkBAIC00Miw2ICs0Myw5IEBACiAgICAgdmlydHVhbCB2b2lkIHBvc3RCdWZmZXIoc3NpemVfdCBvZmZzZXQpID0gMDsgLy8gb25lLXdheQogCiAgICAgdmlydHVhbCB2b2lkIHVucmVnaXN0ZXJCdWZmZXJzKCkgPSAwOworICAgIAorICAgIHZpcnR1YWwgc3A8T3ZlcmxheT4gY3JlYXRlT3ZlcmxheSgKKyAgICAgICAgICAgIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIGludDMyX3QgZm9ybWF0KSA9IDA7CiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VpL0lTdXJmYWNlRmxpbmdlckNsaWVudC5oIGIvaW5jbHVkZS91aS9JU3VyZmFjZUZsaW5nZXJDbGllbnQuaAppbmRleCBiYjJkMzlmLi41YjkzNjFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VpL0lTdXJmYWNlRmxpbmdlckNsaWVudC5oCisrKyBiL2luY2x1ZGUvdWkvSVN1cmZhY2VGbGluZ2VyQ2xpZW50LmgKQEAgLTUyLDcgKzUyLDYgQEAKICAgICBzdHJ1Y3Qgc3VyZmFjZV9kYXRhX3QgewogICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIHRva2VuOwogICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIGlkZW50aXR5OwotICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIHR5cGU7CiAgICAgICAgIHNwPElNZW1vcnlIZWFwPiAgICAgaGVhcFsyXTsKICAgICAgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsJiBwYXJjZWwpOwogICAgICAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWkvS2V5Y29kZUxhYmVscy5oIGIvaW5jbHVkZS91aS9LZXljb2RlTGFiZWxzLmgKaW5kZXggNzQ3OTI1ZC4uNTNjMTE4OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS91aS9LZXljb2RlTGFiZWxzLmgKKysrIGIvaW5jbHVkZS91aS9LZXljb2RlTGFiZWxzLmgKQEAgLTEwNywxMiArMTA3LDE4IEBACiAgICAgeyAiTUVOVSIsIDgyIH0sCiAgICAgeyAiTk9USUZJQ0FUSU9OIiwgODMgfSwKICAgICB7ICJTRUFSQ0giLCA4NCB9LAorICAgIHsgIlBMQVlQQVVTRSIsIDg1IH0sCisgICAgeyAiU1RPUCIsIDg2IH0sCisgICAgeyAiTkVYVFNPTkciLCA4NyB9LAorICAgIHsgIlBSRVZJT1VTU09ORyIsIDg4IH0sCisgICAgeyAiUkVXSU5EIiwgODkgfSwKKyAgICB7ICJGT1JXQVJEIiwgOTAgfSwKIAogICAgIC8vIE5PVEU6IElmIHlvdSBhZGQgYSBuZXcga2V5Y29kZSBoZXJlIHlvdSBtdXN0IGFsc28gYWRkIGl0IHRvOgogICAgIC8vICAgKGVudW0gS2V5Q29kZSwgaW4gdGhpcyBmaWxlKQotICAgIC8vICAgamF2YS9hbmRyb2lkL2FuZHJvaWQvdmlldy9LZXlFdmVudC5qYXZhCisgICAgLy8gICBmcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9LZXlFdmVudC5qYXZhCiAgICAgLy8gICB0b29scy9wdXBwZXRfbWFzdGVyL1B1cHBldE1hc3Rlci5uYXZfa2V5cy5weQotICAgIC8vICAgYXBwcy9jb21tb24vcmVzL3ZhbHVlcy9hdHRycy54bWwKKyAgICAvLyAgIGZyYW1ld29ya3MvYmFzZS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzLnhtbAogCiAgICAgeyBOVUxMLCAwIH0KIH07CkBAIC0yMDQsNyArMjEwLDEzIEBACiAgICAga0tleUNvZGVQbHVzID0gODEsCiAgICAga0tleUNvZGVNZW51ID0gODIsCiAgICAga0tleUNvZGVOb3RpZmljYXRpb24gPSA4MywKLSAgICBrS2V5Q29kZVNlYXJjaCA9IDg0CisgICAga0tleUNvZGVTZWFyY2ggPSA4NCwKKyAgICBrS2V5Q29kZVBsYXlQYXVzZSA9IDg1LAorICAgIGtLZXlDb2RlU3RvcCA9IDg2LAorICAgIGtLZXlDb2RlTmV4dFNvbmcgPSA4NywKKyAgICBrS2V5Q29kZVByZXZpb3VzU29uZyA9IDg4LAorICAgIGtLZXlDb2RlUmV3aW5kID0gODksCisgICAga0tleUNvZGVGb3J3YXJkID0gOTAKIH0gS2V5Q29kZTsKIAogc3RhdGljIGNvbnN0IEtleWNvZGVMYWJlbCBGTEFHU1tdID0gewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91aS9PdmVybGF5LmggYi9pbmNsdWRlL3VpL092ZXJsYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjQ3ODBmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS91aS9PdmVybGF5LmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9PVkVSTEFZX0gKKyNkZWZpbmUgQU5EUk9JRF9PVkVSTEFZX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1aS9QaXhlbEZvcm1hdC5oPgorCisjaW5jbHVkZSA8aGFyZHdhcmUvb3ZlcmxheS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIElPdmVybGF5OworY2xhc3MgSU1lbW9yeTsKK2NsYXNzIElNZW1vcnlIZWFwOworCitjbGFzcyBPdmVybGF5IDogcHVibGljIHZpcnR1YWwgUmVmQmFzZQoreworcHVibGljOgorICAgIE92ZXJsYXkob3ZlcmxheV90KiBvdmVybGF5LCAKKyAgICAgICAgICAgIGNvbnN0IHNwPElPdmVybGF5PiYgbywgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwKTsKKworICAgIC8qIGRlc3Ryb3lzIHRoaXMgb3ZlcmxheSAqLworICAgIHZvaWQgZGVzdHJveSgpOworICAgIAorICAgIC8qIHBvc3Qvc3dhcHMgYnVmZmVycyAqLworICAgIHN0YXR1c190IHN3YXBCdWZmZXJzKCk7CisgICAgCisgICAgLyogZ2V0IHRoZSBIQUwgaGFuZGxlIGZvciB0aGlzIG92ZXJsYXkgKi8KKyAgICBvdmVybGF5X2hhbmRsZV90IGNvbnN0KiBnZXRIYW5kbGVSZWYoKSBjb25zdDsKKyAgICAKKyAgICAvKiByZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhlIGN1cnJlbnQgYnVmZmVyICovCisgICAgc2l6ZV90IGdldEJ1ZmZlck9mZnNldCgpIGNvbnN0OworICAgIAorICAgIC8qIHJldHVybnMgYSBoZWFwIHRvIHRoaXMgb3ZlcmxheS4gdGhpcyBtYXkgbm90IGJlIHN1cHBvcnRlZC4gKi8KKyAgICBzcDxJTWVtb3J5SGVhcD4gZ2V0SGVhcCgpIGNvbnN0OworICAgIAorICAgIC8qIGdldCBwaHlzaWNhbCBpbmZvcm1hdGlvbnMgYWJvdXQgdGhlIG92ZXJsYXkgKi8KKyAgICB1aW50MzJfdCBnZXRXaWR0aCgpIGNvbnN0OworICAgIHVpbnQzMl90IGdldEhlaWdodCgpIGNvbnN0OworICAgIGludDMyX3QgZ2V0Rm9ybWF0KCkgY29uc3Q7CisgICAgaW50MzJfdCBnZXRXaWR0aFN0cmlkZSgpIGNvbnN0OworICAgIGludDMyX3QgZ2V0SGVpZ2h0U3RyaWRlKCkgY29uc3Q7CisKKyAgICBzdGF0aWMgc3A8T3ZlcmxheT4gcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsJiBkYXRhKTsKKyAgICBzdGF0aWMgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwqIHJlcGx5LCBjb25zdCBzcDxPdmVybGF5PiYgbyk7CisKK3ByaXZhdGU6CisgICAgT3ZlcmxheShvdmVybGF5X2hhbmRsZV90KiwgY29uc3Qgc3A8SU92ZXJsYXk+JiwgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiwgIAorICAgICAgICAgICAgdWludDMyX3QgdywgdWludDMyX3QgaCwgaW50MzJfdCBmLCB1aW50MzJfdCB3cywgdWludDMyX3QgaHMpOworCisgICAgdmlydHVhbCB+T3ZlcmxheSgpOworCisgICAgc3A8SU92ZXJsYXk+ICAgICAgICBtT3ZlcmxheTsKKyAgICBzcDxJTWVtb3J5SGVhcD4gICAgIG1IZWFwOworICAgIHNpemVfdCAgICAgICAgICAgICAgbUN1cnJlbnRCdWZmZXJPZmZzZXQ7CisgICAgb3ZlcmxheV9oYW5kbGVfdCBjb25zdCAqbU92ZXJsYXlIYW5kbGU7CisgICAgdWludDMyX3QgICAgICAgICAgICBtV2lkdGg7CisgICAgdWludDMyX3QgICAgICAgICAgICBtSGVpZ2h0OworICAgIGludDMyX3QgICAgICAgICAgICAgbUZvcm1hdDsKKyAgICBpbnQzMl90ICAgICAgICAgICAgIG1XaWR0aFN0cmlkZTsKKyAgICBpbnQzMl90ICAgICAgICAgICAgIG1IZWlnaHRTdHJpZGU7Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX09WRVJMQVlfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91aS9QaXhlbEZvcm1hdC5oIGIvaW5jbHVkZS91aS9QaXhlbEZvcm1hdC5oCmluZGV4IGQ1NmE0YTcuLmM2MWRmMzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWkvUGl4ZWxGb3JtYXQuaAorKysgYi9pbmNsdWRlL3VpL1BpeGVsRm9ybWF0LmgKQEAgLTYxLDYgKzYxLDcgQEAKICAgICBQSVhFTF9GT1JNQVRfUkdCWF84ODg4ICAgPSBHR0xfUElYRUxfRk9STUFUX1JHQlhfODg4OCwgIC8vIDR4OC1iaXQgUkdCMAogICAgIFBJWEVMX0ZPUk1BVF9SR0JfODg4ICAgICA9IEdHTF9QSVhFTF9GT1JNQVRfUkdCXzg4OCwgICAgLy8gM3g4LWJpdCBSR0IKICAgICBQSVhFTF9GT1JNQVRfUkdCXzU2NSAgICAgPSBHR0xfUElYRUxfRk9STUFUX1JHQl81NjUsICAgIC8vIDE2LWJpdCBSR0IKKyAgICBQSVhFTF9GT1JNQVRfQkdSQV84ODg4ICAgPSBHR0xfUElYRUxfRk9STUFUX0JHUkFfODg4OCwgIC8vIDR4OC1iaXQgQkdSQQogICAgIFBJWEVMX0ZPUk1BVF9SR0JBXzU1NTEgICA9IEdHTF9QSVhFTF9GT1JNQVRfUkdCQV81NTUxLCAgLy8gMTYtYml0IEFSR0IKICAgICBQSVhFTF9GT1JNQVRfUkdCQV80NDQ0ICAgPSBHR0xfUElYRUxfRk9STUFUX1JHQkFfNDQ0NCwgIC8vIDE2LWJpdCBBUkdCCiAgICAgUElYRUxfRk9STUFUX0FfOCAgICAgICAgID0gR0dMX1BJWEVMX0ZPUk1BVF9BXzgsICAgICAgICAvLyA4LWJpdCBBCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VpL1JlZ2lvbi5oIGIvaW5jbHVkZS91aS9SZWdpb24uaAppbmRleCBhODZlNjMwLi5hMGM0NjA4IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VpL1JlZ2lvbi5oCisrKyBiL2luY2x1ZGUvdWkvUmVnaW9uLmgKQEAgLTI0LDcgKzI0LDggQEAKICNpbmNsdWRlIDx1dGlscy9QYXJjZWwuaD4KIAogI2luY2x1ZGUgPHVpL1JlY3QuaD4KLSNpbmNsdWRlIDx1aS9CbGl0SGFyZHdhcmUuaD4KKworI2luY2x1ZGUgPGhhcmR3YXJlL2NvcHliaXQuaD4KIAogI2luY2x1ZGUgPGNvcmVjZy9Ta1JlZ2lvbi5oPgogCkBAIC0xNjYsNyArMTY3LDYgQEAKICAgICB9CiAgICAgbXV0YWJsZSBSZWdpb246Oml0ZXJhdG9yIGk7CiB9OwotCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWkvU3VyZmFjZS5oIGIvaW5jbHVkZS91aS9TdXJmYWNlLmgKaW5kZXggMGE3NWJmMy4uMmUyNGY4NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91aS9TdXJmYWNlLmgKKysrIGIvaW5jbHVkZS91aS9TdXJmYWNlLmgKQEAgLTQ4LDcgKzQ4LDcgQEAKICAgICAgICAgdm9pZCogICAgICAgYmFzZTsKICAgICAgICAgdWludDMyX3QgICAgcmVzZXJ2ZWRbMl07CiAgICAgfTsKLSAgICAKKwogICAgIGJvb2wgICAgICAgIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiB0aGlzICYmIG1Ub2tlbj49MCAmJiBtQ2xpZW50IT0wOyB9CiAgICAgU3VyZmFjZUlEICAgSUQoKSBjb25zdCAgICAgIHsgcmV0dXJuIG1Ub2tlbjsgfQogCkBAIC01OSwxOCArNTksMTcgQEAKIAogICAgIHZvaWQqICAgICAgIGhlYXBCYXNlKGludCBpKSBjb25zdDsKICAgICB1aW50MzJfdCAgICBnZXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIG1GbGFnczsgfQotICAgIGludCAgICAgICAgIGdldE1lbW9yeVR5cGUoKSBjb25zdCB7IHJldHVybiBtTWVtb3J5VHlwZTsgfQotICAgIAorCiAgICAgLy8gc2V0U3dhcFJlY3RhbmdsZSgpIGlzIG1haW5seSB1c2VkIGJ5IEVHTAogICAgIHZvaWQgICAgICAgIHNldFN3YXBSZWN0YW5nbGUoY29uc3QgUmVjdCYgcik7CiAgICAgY29uc3QgUmVjdCYgc3dhcFJlY3RhbmdsZSgpIGNvbnN0OwogICAgIHN0YXR1c190ICAgIG5leHRCdWZmZXIoU3VyZmFjZUluZm8qIGluZm8pOwotICAgIAorCiAgICAgc3A8U3VyZmFjZT4gICAgICAgICBkdXAoKSBjb25zdDsKICAgICBzdGF0aWMgc3A8U3VyZmFjZT4gIHJlYWRGcm9tUGFyY2VsKFBhcmNlbCogcGFyY2VsKTsKICAgICBzdGF0aWMgc3RhdHVzX3QgICAgIHdyaXRlVG9QYXJjZWwoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UsIFBhcmNlbCogcGFyY2VsKTsKICAgICBzdGF0aWMgYm9vbCAgICAgICAgIGlzU2FtZVN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIGxocywgY29uc3Qgc3A8U3VyZmFjZT4mIHJocyk7Ci0gICAgCisKICAgICBzdGF0dXNfdCAgICBzZXRMYXllcihpbnQzMl90IGxheWVyKTsKICAgICBzdGF0dXNfdCAgICBzZXRQb3NpdGlvbihpbnQzMl90IHgsIGludDMyX3QgeSk7CiAgICAgc3RhdHVzX3QgICAgc2V0U2l6ZSh1aW50MzJfdCB3LCB1aW50MzJfdCBoKTsKQEAgLTgzLDEzICs4MiwxNCBAQAogICAgIHN0YXR1c190ICAgIHNldEFscGhhKGZsb2F0IGFscGhhPTEuMGYpOwogICAgIHN0YXR1c190ICAgIHNldE1hdHJpeChmbG9hdCBkc2R4LCBmbG9hdCBkdGR4LCBmbG9hdCBkc2R5LCBmbG9hdCBkdGR5KTsKICAgICBzdGF0dXNfdCAgICBzZXRGcmVlemVUaW50KHVpbnQzMl90IHRpbnQpOwotICAgIAorCiAgICAgdWludDMyX3QgICAgZ2V0SWRlbnRpdHkoKSBjb25zdCB7IHJldHVybiBtSWRlbnRpdHk7IH0KIHByaXZhdGU6CiAgICAgZnJpZW5kIGNsYXNzIFN1cmZhY2VDb21wb3NlckNsaWVudDsKIAotICAgIC8vIGNhbWVyYSBuZWVkcyBhY2Nlc3MgdG8gdGhlIElTdXJmYWNlIGJpbmRlciBpbnRlcmZhY2UgZm9yIHByZXZpZXcKKyAgICAvLyBjYW1lcmEgYW5kIGNhbWNvcmRlciBuZWVkIGFjY2VzcyB0byB0aGUgSVN1cmZhY2UgYmluZGVyIGludGVyZmFjZSBmb3IgcHJldmlldwogICAgIGZyaWVuZCBjbGFzcyBDYW1lcmE7CisgICAgZnJpZW5kIGNsYXNzIE1lZGlhUmVjb3JkZXI7CiAgICAgLy8gbWVkaWFwbGF5ZXIgbmVlZHMgYWNjZXNzIHRvIElTdXJmYWNlIGZvciBkaXNwbGF5CiAgICAgZnJpZW5kIGNsYXNzIE1lZGlhUGxheWVyOwogICAgIGNvbnN0IHNwPElTdXJmYWNlPiYgZ2V0SVN1cmZhY2UoKSBjb25zdCB7IHJldHVybiBtU3VyZmFjZTsgfQpAQCAtOTgsMTkgKzk4LDE5IEBACiAgICAgU3VyZmFjZSYgb3BlcmF0b3IgPSAoU3VyZmFjZSYgcmhzKTsKICAgICBTdXJmYWNlKGNvbnN0IFN1cmZhY2UmIHJocyk7CiAKLSAgICBTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4mIGNsaWVudCwgCisgICAgU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICBjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UsCiAgICAgICAgICAgICBjb25zdCBJU3VyZmFjZUZsaW5nZXJDbGllbnQ6OnN1cmZhY2VfZGF0YV90JiBkYXRhLAogICAgICAgICAgICAgdWludDMyX3QgdywgdWludDMyX3QgaCwgUGl4ZWxGb3JtYXQgZm9ybWF0LCB1aW50MzJfdCBmbGFncywKICAgICAgICAgICAgIGJvb2wgb3duZXIgPSB0cnVlKTsKLSAgICAKKwogICAgIFN1cmZhY2UoU3VyZmFjZSBjb25zdCogcmhzKTsKIAogICAgIH5TdXJmYWNlKCk7CiAKICAgICBSZWdpb24gZGlydHlSZWdpb24oKSBjb25zdDsKICAgICB2b2lkIHNldERpcnR5UmVnaW9uKGNvbnN0IFJlZ2lvbiYgcmVnaW9uKSBjb25zdDsKLSAgICAKKwogICAgIC8vIHRoaXMgbG9ja3MgcHJvdGVjdHMgY2FsbHMgdG8gbG9ja1N1cmZhY2UoKSAvIHVubG9ja1N1cmZhY2UoKQogICAgIC8vIGFuZCBpcyBjYWxsZWQgYnkgU3VyZmFjZUNvbXBvc2VyQ2xpZW50LgogICAgIE11dGV4JiBnZXRMb2NrKCkgY29uc3QgeyByZXR1cm4gbVN1cmZhY2VMb2NrOyB9CkBAIC0xMTgsNyArMTE4LDYgQEAKICAgICBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+ICAgbUNsaWVudDsKICAgICBzcDxJU3VyZmFjZT4gICAgICAgICAgICAgICAgbVN1cmZhY2U7CiAgICAgc3A8SU1lbW9yeUhlYXA+ICAgICAgICAgICAgIG1IZWFwWzJdOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtTWVtb3J5VHlwZTsKICAgICBTdXJmYWNlSUQgICAgICAgICAgICAgICAgICAgbVRva2VuOwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtSWRlbnRpdHk7CiAgICAgUGl4ZWxGb3JtYXQgICAgICAgICAgICAgICAgIG1Gb3JtYXQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxzL0lQQ1RocmVhZFN0YXRlLmggYi9pbmNsdWRlL3V0aWxzL0lQQ1RocmVhZFN0YXRlLmgKaW5kZXggNDcwNDNiOC4uMDQ5MGZkMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS91dGlscy9JUENUaHJlYWRTdGF0ZS5oCisrKyBiL2luY2x1ZGUvdXRpbHMvSVBDVGhyZWFkU3RhdGUuaApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL1BhcmNlbC5oPgogI2luY2x1ZGUgPHV0aWxzL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCiAjaWZkZWYgSEFWRV9XSU4zMl9QUk9DCiB0eXBlZGVmICBpbnQgIHVpZF90OwpAQCAtOTIsNiArOTMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvb2tpZSk7CiAgICAgCiAgICAgY29uc3QgICBzcDxQcm9jZXNzU3RhdGU+ICAgIG1Qcm9jZXNzOworICAgICAgICAgICAgVmVjdG9yPEJCaW5kZXIqPiAgICBtUGVuZGluZ1N0cm9uZ0RlcmVmczsKKyAgICAgICAgICAgIFZlY3RvcjxSZWZCYXNlOjp3ZWFrcmVmX3R5cGUqPiBtUGVuZGluZ1dlYWtEZXJlZnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgUGFyY2VsICAgICAgICAgICAgICBtSW47CiAgICAgICAgICAgICBQYXJjZWwgICAgICAgICAgICAgIG1PdXQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxzL01lbW9yeUhlYXBQbWVtLmggYi9pbmNsdWRlL3V0aWxzL01lbW9yeUhlYXBQbWVtLmgKaW5kZXggYjY5NGIyMC4uNjAzMzVhZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS91dGlscy9NZW1vcnlIZWFwUG1lbS5oCisrKyBiL2luY2x1ZGUvdXRpbHMvTWVtb3J5SGVhcFBtZW0uaApAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgPHV0aWxzL01lbW9yeURlYWxlci5oPgogI2luY2x1ZGUgPHV0aWxzL01lbW9yeUhlYXBCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvSU1lbW9yeS5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTMxLDExICszMSwyMSBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotY2xhc3MgU3ViUmVnaW9uTWVtb3J5OwotCiBjbGFzcyBNZW1vcnlIZWFwUG1lbSA6IHB1YmxpYyBIZWFwSW50ZXJmYWNlLCBwdWJsaWMgTWVtb3J5SGVhcEJhc2UKIHsKIHB1YmxpYzoKKyAgICBjbGFzcyBNZW1vcnlQbWVtIDogcHVibGljIEJuTWVtb3J5IHsKKyAgICBwdWJsaWM6CisgICAgICAgIE1lbW9yeVBtZW0oY29uc3Qgc3A8TWVtb3J5SGVhcFBtZW0+JiBoZWFwKTsKKyAgICAgICAgfk1lbW9yeVBtZW0oKTsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIGNvbnN0IHNwPE1lbW9yeUhlYXBQbWVtPiYgIGdldEhlYXAoKSBjb25zdCB7IHJldHVybiBtQ2xpZW50SGVhcDsgfQorICAgIHByaXZhdGU6CisgICAgICAgIGZyaWVuZCBjbGFzcyBNZW1vcnlIZWFwUG1lbTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJldm9rZSgpID0gMDsKKyAgICAgICAgc3A8TWVtb3J5SGVhcFBtZW0+ICBtQ2xpZW50SGVhcDsKKyAgICB9OworICAgIAogICAgIE1lbW9yeUhlYXBQbWVtKGNvbnN0IHNwPE1lbW9yeUhlYXBCYXNlPiYgcG1lbUhlYXAsCiAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSBJTWVtb3J5SGVhcDo6TUFQX09OQ0UpOwogICAgIH5NZW1vcnlIZWFwUG1lbSgpOwpAQCAtNTEsMTEgKzYxLDE2IEBACiAgICAgCiAgICAgLyogcmV2b2tlIGFsbCBhbGxvY2F0aW9ucyBtYWRlIGJ5IHRoaXMgaGVhcCAqLwogICAgIHZpcnR1YWwgdm9pZCByZXZva2UoKTsKLSAgICAKKworcHJpdmF0ZToKKyAgICAvKiB1c2UgdGhpcyB0byBjcmVhdGUgeW91ciBvd24gSU1lbW9yeSBmb3IgbWFwTWVtb3J5ICovCisgICAgdmlydHVhbCBzcDxNZW1vcnlQbWVtPiBjcmVhdGVNZW1vcnkoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpOworICAgIHZvaWQgcmVtb3ZlKGNvbnN0IHdwPE1lbW9yeVBtZW0+JiBtZW1vcnkpOworCiBwcml2YXRlOgogICAgIHNwPE1lbW9yeUhlYXBCYXNlPiAgICAgICAgICAgICAgbVBhcmVudEhlYXA7CiAgICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgICAgICAgICBtTG9jazsKLSAgICBWZWN0b3I8IHdwPFN1YlJlZ2lvbk1lbW9yeT4gPiAgIG1BbGxvY2F0aW9uczsKKyAgICBTb3J0ZWRWZWN0b3I8IHdwPE1lbW9yeVBtZW0+ID4gIG1BbGxvY2F0aW9uczsKIH07CiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy9SZXNvdXJjZVR5cGVzLmggYi9pbmNsdWRlL3V0aWxzL1Jlc291cmNlVHlwZXMuaAppbmRleCAzMWI5YWE4Li4yZDU2ZTNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL3V0aWxzL1Jlc291cmNlVHlwZXMuaAorKysgYi9pbmNsdWRlL3V0aWxzL1Jlc291cmNlVHlwZXMuaApAQCAtMTQwLDggKzE0MCw2IEBACiAgICAgdm9pZCBzZXJpYWxpemUodm9pZCogb3V0RGF0YSk7CiAgICAgLy8gRGVzZXJpYWxpemUvVW5tYXJzaGFsbCB0aGUgcGF0Y2ggZGF0YQogICAgIHN0YXRpYyBSZXNfcG5nXzlwYXRjaCogZGVzZXJpYWxpemUoY29uc3Qgdm9pZCogZGF0YSk7Ci0gICAgLy8gRGVzZXJpYWxpemUvVW5tYXJzaGFsbCB0aGUgcGF0Y2ggZGF0YSBpbnRvIGEgbmV3bHkgbWFsbG9jLWVkIGJsb2NrCi0gICAgc3RhdGljIHZvaWQgZGVzZXJpYWxpemUoY29uc3Qgdm9pZCogZGF0YSwgUmVzX3BuZ185cGF0Y2gqIG91dERhdGEpOwogICAgIC8vIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIHNlcmlhbGl6ZWQgZGF0YSBzdHJ1Y3R1cmUKICAgICBzaXplX3Qgc2VyaWFsaXplZFNpemUoKTsKIH07CkBAIC04NjAsNiArODU4LDcgQEAKICAgICAgICAgS0VZU0hJRERFTl9BTlkgPSAweDAwMDAsCiAgICAgICAgIEtFWVNISURERU5fTk8gPSAweDAwMDEsCiAgICAgICAgIEtFWVNISURERU5fWUVTID0gMHgwMDAyLAorICAgICAgICBLRVlTSElEREVOX1NPRlQgPSAweDAwMDMsCiAgICAgfTsKICAgICAKICAgICB1bmlvbiB7CkBAIC05ODksMTEgKzk4OCwyMCBAQAogICAgICAgICByZXR1cm4gZGlmZnM7CiAgICAgfQogICAgIAotICAgIC8vIFJldHVybiB0cnVlIGlmICd0aGlzJyBpcyBtb3JlIHNwZWNpZmljIHRoYW4gJ28nLgorICAgIC8vIFJldHVybiB0cnVlIGlmICd0aGlzJyBpcyBtb3JlIHNwZWNpZmljIHRoYW4gJ28nLiAgT3B0aW9uYWxseSwgaWYKKyAgICAvLyAncmVxdWVzdGVkJyBpcyBudWxsLCB0aGVuIHRoZXkgd2lsbCBhbHNvIGJlIGNvbXBhcmVkIGFnYWluc3QgdGhlCisgICAgLy8gcmVxdWVzdGVkIGNvbmZpZ3VyYXRpb24gYW5kIHRydWUgd2lsbCBvbmx5IGJlIHJldHVybmVkIGlmICd0aGlzJworICAgIC8vIGlzIGEgYmV0dGVyIGNhbmRpZGF0ZSB0aGFuICdvJyBmb3IgdGhlIGNvbmZpZ3VyYXRpb24uICBUaGlzIGFzc3VtZXMgdGhhdAorICAgIC8vIG1hdGNoKCkgaGFzIGFscmVhZHkgYmVlbiB1c2VkIHRvIHJlbW92ZSBhbnkgY29uZmlndXJhdGlvbnMgdGhhdCBkb24ndAorICAgIC8vIG1hdGNoIHRoZSByZXF1ZXN0ZWQgY29uZmlndXJhdGlvbiBhdCBhbGw7IGlmIHRoZXkgYXJlIG5vdCBmaXJzdCBmaWx0ZXJlZCwKKyAgICAvLyBub24tbWF0Y2hpbmcgcmVzdWx0cyBjYW4gYmUgY29uc2lkZXJlZCBiZXR0ZXIgdGhhbiBtYXRjaGluZyBvbmVzLgogICAgIGlubGluZSBib29sCiAgICAgaXNCZXR0ZXJUaGFuKGNvbnN0IFJlc1RhYmxlX2NvbmZpZyYgbywgY29uc3QgUmVzVGFibGVfY29uZmlnKiByZXF1ZXN0ZWQgPSBOVUxMKSBjb25zdCB7CisgICAgICAgIC8vIFRoZSBvcmRlciBvZiB0aGUgZm9sbG93aW5nIHRlc3RzIGRlZmluZXMgdGhlIGltcG9ydGFuY2Ugb2Ygb25lCisgICAgICAgIC8vIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIG92ZXIgYW5vdGhlci4gIFRob3NlIHRlc3RzIGZpcnN0IGFyZSBtb3JlCisgICAgICAgIC8vIGltcG9ydGFudCwgdHJ1bXBpbmcgYW55IHZhbHVlcyBpbiB0aG9zZSBmb2xsb3dpbmcgdGhlbS4KICAgICAgICAgaWYgKGltc2kgIT0gMCAmJiAoIXJlcXVlc3RlZCB8fCByZXF1ZXN0ZWQtPmltc2kgIT0gMCkpIHsKLSAgICAgICAgICAgIGlmIChtY2MgIT0gMCAmJiAoIXJlcXVlc3RlZCB8fCByZXF1ZXN0ZWQtPm1jYyE9IDApKSB7CisgICAgICAgICAgICBpZiAobWNjICE9IDAgJiYgKCFyZXF1ZXN0ZWQgfHwgcmVxdWVzdGVkLT5tY2MgIT0gMCkpIHsKICAgICAgICAgICAgICAgICBpZiAoby5tY2MgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CkBAIC0xMDM0LDkgKzEwNDIsMjQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoaW5wdXQgIT0gMCAmJiAoIXJlcXVlc3RlZCB8fCByZXF1ZXN0ZWQtPmlucHV0ICE9IDApKSB7Ci0gICAgICAgICAgICBpZiAoKGlucHV0RmxhZ3MmTUFTS19LRVlTSElEREVOKSAhPSAwICYmICghcmVxdWVzdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAocmVxdWVzdGVkLT5pbnB1dEZsYWdzJk1BU0tfS0VZU0hJRERFTikgIT0gMCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoKG8uaW5wdXRGbGFncyZNQVNLX0tFWVNISURERU4pID09IDApIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBrZXlzSGlkZGVuID0gaW5wdXRGbGFncyZNQVNLX0tFWVNISURERU47CisgICAgICAgICAgICBjb25zdCBpbnQgcmVxS2V5c0hpZGRlbiA9IHJlcXVlc3RlZAorICAgICAgICAgICAgICAgICAgICA/IHJlcXVlc3RlZC0+aW5wdXRGbGFncyZNQVNLX0tFWVNISURERU4gOiAwOworICAgICAgICAgICAgaWYgKGtleXNIaWRkZW4gIT0gMCAmJiByZXFLZXlzSGlkZGVuICE9IDApIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgb0tleXNIaWRkZW4gPSBvLmlucHV0RmxhZ3MmTUFTS19LRVlTSElEREVOOworICAgICAgICAgICAgICAgIC8vTE9HSSgiaXNCZXR0ZXJUaGFuIGtleXNIaWRkZW46IGN1cj0lZCwgZ2l2ZW49JWQsIGNvbmZpZz0lZFxuIiwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAga2V5c0hpZGRlbiwgb0tleXNIaWRkZW4sIHJlcUtleXNIaWRkZW4pOworICAgICAgICAgICAgICAgIGlmIChvS2V5c0hpZGRlbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vTE9HSSgiQmV0dGVyIGJlY2F1c2UgMCEiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEZvciBjb21wYXRpYmlsaXR5LCB3ZSBjb3VudCBLRVlTSElEREVOX05PIGFzIGJlaW5nCisgICAgICAgICAgICAgICAgLy8gdGhlIHNhbWUgYXMgS0VZU0hJRERFTl9TT0ZULiAgSGVyZSB3ZSBkaXNhbWJpZ3VhdGUgdGhlc2UKKyAgICAgICAgICAgICAgICAvLyBtYXkgbWFraW5nIGFuIGV4YWN0IG1hdGNoIG1vcmUgc3BlY2lmaWMuCisgICAgICAgICAgICAgICAgaWYgKGtleXNIaWRkZW4gPT0gcmVxS2V5c0hpZGRlbiAmJiBvS2V5c0hpZGRlbiAhPSByZXFLZXlzSGlkZGVuKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gaXMgYW4gZXhhY3QgbWF0Y2gsIGFuZAorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZ2l2ZW4gb25lIGlzIG5vdCwgc28gdGhlIGN1cnJlbnQgb25lIGlzIGJldHRlci4KKyAgICAgICAgICAgICAgICAgICAgLy9MT0dJKCJCZXR0ZXIgYmVjYXVzZSBvdGhlciBub3Qgc2FtZSEiKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMTA3OCw3ICsxMTAxLDggQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICAKLSAgICAvLyBSZXR1cm4gdHJ1ZSBpZiAndGhpcycgbWF0Y2hlcyB0aGUgcGFyYW1ldGVycyBpbiAnc2V0dGluZ3MnLgorICAgIC8vIFJldHVybiB0cnVlIGlmICd0aGlzJyBjYW4gYmUgY29uc2lkZXJlZCBhIG1hdGNoIGZvciB0aGUgcGFyYW1ldGVycyBpbgorICAgIC8vICdzZXR0aW5ncycuCiAgICAgaW5saW5lIGJvb2wgbWF0Y2goY29uc3QgUmVzVGFibGVfY29uZmlnJiBzZXR0aW5ncykgY29uc3QgewogICAgICAgICBpZiAoaW1zaSAhPSAwKSB7CiAgICAgICAgICAgICBpZiAoc2V0dGluZ3MubWNjICE9IDAgJiYgbWNjICE9IDAKQEAgLTExMjEsNyArMTE0NSwxNCBAQAogICAgICAgICAgICAgY29uc3QgaW50IHNldEtleXNIaWRkZW4gPSBzZXR0aW5ncy5pbnB1dEZsYWdzJk1BU0tfS0VZU0hJRERFTjsKICAgICAgICAgICAgIGlmIChzZXRLZXlzSGlkZGVuICE9IDAgJiYga2V5c0hpZGRlbiAhPSAwCiAgICAgICAgICAgICAgICAgJiYga2V5c0hpZGRlbiAhPSBzZXRLZXlzSGlkZGVuKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIC8vIEZvciBjb21wYXRpYmlsaXR5LCB3ZSBjb3VudCBhIHJlcXVlc3QgZm9yIEtFWVNISURERU5fTk8gYXMgYWxzbworICAgICAgICAgICAgICAgIC8vIG1hdGNoaW5nIHRoZSBtb3JlIHJlY2VudCBLRVlTSElEREVOX1NPRlQuICBCYXNpY2FsbHkKKyAgICAgICAgICAgICAgICAvLyBLRVlTSElEREVOX05PIG1lYW5zIHRoZXJlIGlzIHNvbWUga2luZCBvZiBrZXlib2FyZCBhdmFpbGFibGUuCisgICAgICAgICAgICAgICAgLy9MT0dJKCJNYXRjaGluZyBrZXlzSGlkZGVuOiBoYXZlPSVkLCBjb25maWc9JWRcbiIsIGtleXNIaWRkZW4sIHNldEtleXNIaWRkZW4pOworICAgICAgICAgICAgICAgIGlmIChrZXlzSGlkZGVuICE9IEtFWVNISURERU5fTk8gfHwgc2V0S2V5c0hpZGRlbiAhPSBLRVlTSElEREVOX1NPRlQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy9MT0dJKCJObyBtYXRjaCEiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5rZXlib2FyZCAhPSAwICYmIGtleWJvYXJkICE9IDAKICAgICAgICAgICAgICAgICAmJiBrZXlib2FyZCAhPSBzZXR0aW5ncy5rZXlib2FyZCkgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy9UaW1lVXRpbHMuaCBiL2luY2x1ZGUvdXRpbHMvVGltZVV0aWxzLmgKaW5kZXggMzBlNTMzMC4uYjE5ZTAyMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS91dGlscy9UaW1lVXRpbHMuaAorKysgYi9pbmNsdWRlL3V0aWxzL1RpbWVVdGlscy5oCkBAIC0xNywxMCArMTcsMTEgQEAKICNpZm5kZWYgQU5EUk9JRF9USU1FX0gKICNkZWZpbmUgQU5EUk9JRF9USU1FX0gKIAorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxjdXRpbHMvdHp0aW1lLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDx0aW1lLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CiAKQEAgLTU4LDcgKzU5LDcgQEAKICAgICBUaW1lKCk7CiAKICAgICB2b2lkIHN3aXRjaFRpbWV6b25lKGNvbnN0IGNoYXIgKnRpbWV6b25lKTsKLSAgICBTdHJpbmc4IGZvcm1hdChjb25zdCBjaGFyICpmb3JtYXQpIGNvbnN0OworICAgIFN0cmluZzggZm9ybWF0KGNvbnN0IGNoYXIgKmZvcm1hdCwgY29uc3Qgc3RydWN0IHN0cmZ0aW1lX2xvY2FsZSAqbG9jYWxlKSBjb25zdDsKICAgICB2b2lkIGZvcm1hdDI0NDUoc2hvcnQqIGJ1ZiwgYm9vbCBoYXNUaW1lKSBjb25zdDsKICAgICBTdHJpbmc4IHRvU3RyaW5nKCkgY29uc3Q7CiAgICAgdm9pZCBzZXRUb05vdygpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy9zdHJpbmdfYXJyYXkuaCBiL2luY2x1ZGUvdXRpbHMvc3RyaW5nX2FycmF5LmgKaW5kZXggZWRlMDY0NC4uMDY0ZGRhMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91dGlscy9zdHJpbmdfYXJyYXkuaAorKysgYi9pbmNsdWRlL3V0aWxzL3N0cmluZ19hcnJheS5oCkBAIC0xMTEsNiArMTExLDE5IEBACiAgICAgICAgIHJldHVybiBtQXJyYXlbaWR4XTsKICAgICB9CiAKKyAgICAvLworICAgIC8vIFNldCBlbnRyeSBOIHRvIHNwZWNpZmllZCBzdHJpbmcuCisgICAgLy8gW3Nob3VsZCB1c2Ugb3BlcmF0b3JbXSBoZXJlXQorICAgIC8vCisgICAgdm9pZCBzZXRFbnRyeShpbnQgaWR4LCBjb25zdCBjaGFyKiBzdHIpIHsKKyAgICAgICAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IG1DdXJyZW50KQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBkZWxldGVbXSBtQXJyYXlbaWR4XTsKKyAgICAgICAgaW50IGxlbiA9IHN0cmxlbihzdHIpOworICAgICAgICBtQXJyYXlbaWR4XSA9IG5ldyBjaGFyW2xlbisxXTsKKyAgICAgICAgbWVtY3B5KG1BcnJheVtpZHhdLCBzdHIsIGxlbisxKTsKKyAgICB9CisKIHByaXZhdGU6CiAgICAgaW50ICAgICBtTWF4OwogICAgIGludCAgICAgbUN1cnJlbnQ7CmRpZmYgLS1naXQgYS9saWJzL2F1ZGlvZmxpbmdlci9BMmRwQXVkaW9JbnRlcmZhY2UuY3BwIGIvbGlicy9hdWRpb2ZsaW5nZXIvQTJkcEF1ZGlvSW50ZXJmYWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTQ3OTVjCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9hdWRpb2ZsaW5nZXIvQTJkcEF1ZGlvSW50ZXJmYWNlLmNwcApAQCAtMCwwICsxLDE4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkEyZHBBdWRpb0ludGVyZmFjZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKKyNpbmNsdWRlICJBMmRwQXVkaW9JbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJhdWRpby9saWJhMmRwLmgiCisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0EyZHBBdWRpb0ludGVyZmFjZTo6QTJkcEF1ZGlvSW50ZXJmYWNlKCkgOgorICAgIG1PdXRwdXQoMCkKK3sKK30KKworQTJkcEF1ZGlvSW50ZXJmYWNlOjp+QTJkcEF1ZGlvSW50ZXJmYWNlKCkKK3sKKyAgICBkZWxldGUgbU91dHB1dDsKK30KKworc3RhdHVzX3QgQTJkcEF1ZGlvSW50ZXJmYWNlOjppbml0Q2hlY2soKQoreworICAgIHJldHVybiAwOworfQorCitBdWRpb1N0cmVhbU91dCogQTJkcEF1ZGlvSW50ZXJmYWNlOjpvcGVuT3V0cHV0U3RyZWFtKAorICAgICAgICBpbnQgZm9ybWF0LCBpbnQgY2hhbm5lbENvdW50LCB1aW50MzJfdCBzYW1wbGVSYXRlLCBzdGF0dXNfdCAqc3RhdHVzKQoreworICAgIExPR0QoIkEyZHBBdWRpb0ludGVyZmFjZTo6b3Blbk91dHB1dFN0cmVhbSAlZCwgJWQsICVkXG4iLCBmb3JtYXQsIGNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIHN0YXR1c190IGVyciA9IDA7CisKKyAgICAvLyBvbmx5IG9uZSBvdXRwdXQgc3RyZWFtIGFsbG93ZWQKKyAgICBpZiAobU91dHB1dCkgeworICAgICAgICBpZiAoc3RhdHVzKQorICAgICAgICAgICAgKnN0YXR1cyA9IC0xOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvLyBjcmVhdGUgbmV3IG91dHB1dCBzdHJlYW0KKyAgICBBMmRwQXVkaW9TdHJlYW1PdXQqIG91dCA9IG5ldyBBMmRwQXVkaW9TdHJlYW1PdXQoKTsKKyAgICBpZiAoKGVyciA9IG91dC0+c2V0KGZvcm1hdCwgY2hhbm5lbENvdW50LCBzYW1wbGVSYXRlKSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgbU91dHB1dCA9IG91dDsKKyAgICB9IGVsc2UgeworICAgICAgICBkZWxldGUgb3V0OworICAgIH0KKyAgICAKKyAgICBpZiAoc3RhdHVzKQorICAgICAgICAqc3RhdHVzID0gZXJyOworICAgIHJldHVybiBtT3V0cHV0OworfQorCitBdWRpb1N0cmVhbUluKiBBMmRwQXVkaW9JbnRlcmZhY2U6Om9wZW5JbnB1dFN0cmVhbSgKKyAgICAgICAgaW50IGZvcm1hdCwgaW50IGNoYW5uZWxDb3VudCwgdWludDMyX3Qgc2FtcGxlUmF0ZSwgc3RhdHVzX3QgKnN0YXR1cykKK3sKKyAgICBpZiAoc3RhdHVzKQorICAgICAgICAqc3RhdHVzID0gLTE7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXR1c190IEEyZHBBdWRpb0ludGVyZmFjZTo6c3RhbmRieSgpCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXR1c190IEEyZHBBdWRpb0ludGVyZmFjZTo6c2V0TWljTXV0ZShib29sIHN0YXRlKQoreworICAgIHJldHVybiAwOworfQorCitzdGF0dXNfdCBBMmRwQXVkaW9JbnRlcmZhY2U6OmdldE1pY011dGUoYm9vbCogc3RhdGUpCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXR1c190IEEyZHBBdWRpb0ludGVyZmFjZTo6c2V0UGFyYW1ldGVyKGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisgICAgTE9HRCgic2V0UGFyYW1ldGVyICVzLCVzXG4iLCBrZXksIHZhbHVlKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdHVzX3QgQTJkcEF1ZGlvSW50ZXJmYWNlOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2KQoreworICAgIHJldHVybiAwOworfQorCitzdGF0dXNfdCBBMmRwQXVkaW9JbnRlcmZhY2U6OnNldE1hc3RlclZvbHVtZShmbG9hdCB2KQoreworICAgIHJldHVybiAwOworfQorCitzdGF0dXNfdCBBMmRwQXVkaW9JbnRlcmZhY2U6OmRvUm91dGluZygpCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXR1c190IEEyZHBBdWRpb0ludGVyZmFjZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCit7CisgICAgcmV0dXJuIDA7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQTJkcEF1ZGlvSW50ZXJmYWNlOjpBMmRwQXVkaW9TdHJlYW1PdXQ6OkEyZHBBdWRpb1N0cmVhbU91dCgpIDoKKyAgICBtRmQoLTEpLCBtU3RhcnRDb3VudCgwKSwgbVJldHJ5Q291bnQoMCksIG1EYXRhKE5VTEwpLAorICAgIG1Jbml0aWFsaXplZChmYWxzZSksIG1CdWZmZXJSZW1haW5pbmcoMCkKK3sKK30KKworc3RhdHVzX3QgQTJkcEF1ZGlvSW50ZXJmYWNlOjpBMmRwQXVkaW9TdHJlYW1PdXQ6OnNldCgKKyAgICAgICAgaW50IGZvcm1hdCwgaW50IGNoYW5uZWxzLCB1aW50MzJfdCByYXRlKQoreworICAgIExPR0QoIkEyZHBBdWRpb1N0cmVhbU91dDo6c2V0ICVkLCAlZCwgJWRcbiIsIGZvcm1hdCwgY2hhbm5lbHMsIHJhdGUpOworCisgICAgLy8gZml4IHVwIGRlZmF1bHRzCisgICAgaWYgKGZvcm1hdCA9PSAwKSBmb3JtYXQgPSBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVDsKKyAgICBpZiAoY2hhbm5lbHMgPT0gMCkgY2hhbm5lbHMgPSBjaGFubmVsQ291bnQoKTsKKyAgICBpZiAocmF0ZSA9PSAwKSByYXRlID0gc2FtcGxlUmF0ZSgpOworCisgICAgLy8gY2hlY2sgdmFsdWVzCisgICAgaWYgKChmb3JtYXQgIT0gQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQpIHx8CisgICAgICAgICAgICAoY2hhbm5lbHMgIT0gY2hhbm5lbENvdW50KCkpIHx8CisgICAgICAgICAgICAocmF0ZSAhPSBzYW1wbGVSYXRlKCkpKQorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitBMmRwQXVkaW9JbnRlcmZhY2U6OkEyZHBBdWRpb1N0cmVhbU91dDo6fkEyZHBBdWRpb1N0cmVhbU91dCgpCit7CisgICAgaWYgKG1EYXRhKQorICAgICAgICBhMmRwX2NsZWFudXAobURhdGEpOworfQorCitzc2l6ZV90IEEyZHBBdWRpb0ludGVyZmFjZTo6QTJkcEF1ZGlvU3RyZWFtT3V0Ojp3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBieXRlcykKK3sgICAgCisgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgaW50IHJldCA9IGEyZHBfaW5pdCgiMDA6MDA6MDA6MDA6MDA6MDAiLCA0NDEwMCwgMiwgJm1EYXRhKTsKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIHNpemVfdCByZW1haW5pbmcgPSBieXRlczsKKyAgICB3aGlsZSAocmVtYWluaW5nID4gMCkgeworICAgICAgICBpbnQgd3JpdHRlbiA9IGEyZHBfd3JpdGUobURhdGEsIGJ1ZmZlciwgcmVtYWluaW5nKTsgICAgICAgIAorICAgICAgICByZW1haW5pbmcgLT0gd3JpdHRlbjsKKyAgICAgICAgYnVmZmVyID0gKChjaGFyICopYnVmZmVyKSArIHdyaXR0ZW47CisgICAgfQorICAgIAorICAgIHJldHVybiBieXRlczsKK30KKworc3RhdHVzX3QgQTJkcEF1ZGlvSW50ZXJmYWNlOjpBMmRwQXVkaW9TdHJlYW1PdXQ6OnN0YW5kYnkoKQoreworICAgIHJldHVybiAwOworfQorCitzdGF0dXNfdCBBMmRwQXVkaW9JbnRlcmZhY2U6OkEyZHBBdWRpb1N0cmVhbU91dDo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCit7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2F1ZGlvZmxpbmdlci9BMmRwQXVkaW9JbnRlcmZhY2UuaCBiL2xpYnMvYXVkaW9mbGluZ2VyL0EyZHBBdWRpb0ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYmY5MzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2F1ZGlvZmxpbmdlci9BMmRwQXVkaW9JbnRlcmZhY2UuaApAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQTJEUF9BVURJT19IQVJEV0FSRV9ICisjZGVmaW5lIEEyRFBfQVVESU9fSEFSRFdBUkVfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKKyNpbmNsdWRlIDxoYXJkd2FyZS9BdWRpb0hhcmR3YXJlQmFzZS5oPgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQTJkcEF1ZGlvSW50ZXJmYWNlIDogcHVibGljIEF1ZGlvSGFyZHdhcmVCYXNlCit7CisgICAgY2xhc3MgQTJkcEF1ZGlvU3RyZWFtT3V0OworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICBBMmRwQXVkaW9JbnRlcmZhY2UoKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgIH5BMmRwQXVkaW9JbnRlcmZhY2UoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGluaXRDaGVjaygpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhbmRieSgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSk7CisKKyAgICAvLyBtaWMgbXV0ZQorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0TWljTXV0ZShib29sIHN0YXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldE1pY011dGUoYm9vbCogc3RhdGUpOworCisgICAgLy8gVGVtcG9yYXJ5IGludGVyZmFjZSwgZG8gbm90IHVzZQorICAgIC8vIFRPRE86IFJlcGxhY2Ugd2l0aCBhIG1vcmUgZ2VuZXJpYyBrZXk6dmFsdWUgZ2V0L3NldCBtZWNoYW5pc20KKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFBhcmFtZXRlcihjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbHVlKTsKKworICAgIC8vIGNyZWF0ZSBJL08gc3RyZWFtcworICAgIHZpcnR1YWwgQXVkaW9TdHJlYW1PdXQqIG9wZW5PdXRwdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQ9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudD0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlPTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXM9MCk7CisKKyAgICB2aXJ0dWFsIEF1ZGlvU3RyZWFtSW4qIG9wZW5JbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGRvUm91dGluZygpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworCitwcml2YXRlOgorICAgIGNsYXNzIEEyZHBBdWRpb1N0cmVhbU91dCA6IHB1YmxpYyBBdWRpb1N0cmVhbU91dCB7CisgICAgcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEyZHBBdWRpb1N0cmVhbU91dCgpOworICAgICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5BMmRwQXVkaW9TdHJlYW1PdXQoKTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXQoaW50IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSk7CisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgICAgc2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIDQ0MTAwOyB9CisgICAgICAgIC8vIG11c3QgYmUgMzItYml0IGFsaWduZWQgLSBkcml2ZXIgb25seSBzZWVtcyB0byBsaWtlIDQ4MDAKKyAgICAgICAgdmlydHVhbCBzaXplX3QgICAgICBidWZmZXJTaXplKCkgY29uc3QgeyByZXR1cm4gNTEyMDsgfQorICAgICAgICB2aXJ0dWFsIGludCAgICAgICAgIGNoYW5uZWxDb3VudCgpIGNvbnN0IHsgcmV0dXJuIDI7IH0KKyAgICAgICAgdmlydHVhbCBpbnQgICAgICAgICBmb3JtYXQoKSBjb25zdCB7IHJldHVybiBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVDsgfQorICAgICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgIGxhdGVuY3koKSBjb25zdCB7IHJldHVybiAwOyB9CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSkgeyByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047IH0KKyAgICAgICAgdmlydHVhbCBzc2l6ZV90ICAgICB3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBieXRlcyk7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc3RhbmRieSgpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKworICAgIHByaXZhdGU6CisgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbUZkOworICAgICAgICAgICAgICAgIGludCAgICAgICAgIG1TdGFydENvdW50OworICAgICAgICAgICAgICAgIGludCAgICAgICAgIG1SZXRyeUNvdW50OworICAgICAgICAgICAgICAgIHZvaWQqICAgICAgIG1EYXRhOworICAgICAgICAgICAgICAgIGJvb2wgICAgICAgIG1Jbml0aWFsaXplZDsKKworI2RlZmluZSBrQnVmZmVyU2l6ZSA1MDAwMAorICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJba0J1ZmZlclNpemVdOworICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJSZW1haW5pbmc7CisgICAgfTsKKworICAgIE11dGV4ICAgICAgICAgICAgICAgICAgIG1Mb2NrOworICAgIEEyZHBBdWRpb1N0cmVhbU91dCogICAgIG1PdXRwdXQ7Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBMkRQX0FVRElPX0hBUkRXQVJFX0gKZGlmZiAtLWdpdCBhL2xpYnMvYXVkaW9mbGluZ2VyL0FuZHJvaWQubWsgYi9saWJzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rCmluZGV4IGE5Y2IzMDMuLmQxNmUzZTEgMTAwNjQ0Ci0tLSBhL2xpYnMvYXVkaW9mbGluZ2VyL0FuZHJvaWQubWsKKysrIGIvbGlicy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5tawpAQCAtNDUsOSArNDUsMTIgQEAKIAogTE9DQUxfTU9EVUxFOj0gbGliYXVkaW9mbGluZ2VyCiAKLWlmZXEgKCQoVEFSR0VUX0FSQ0gpLGFybSkgICMgbm90IHNpbXVsYXRvcgotICBMT0NBTF9DRkxBR1MgKz0gLURXSVRIX0JMVUVUT09USAoraWZlcSAoJChCT0FSRF9IQVZFX0JMVUVUT09USCksdHJ1ZSkKKyAgTE9DQUxfU1JDX0ZJTEVTICs9IEEyZHBBdWRpb0ludGVyZmFjZS5jcHAKKyAgTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJhMmRwCisgIExPQ0FMX0NGTEFHUyArPSAtRFdJVEhfQkxVRVRPT1RIIC1EV0lUSF9BMkRQCiAgIExPQ0FMX0NfSU5DTFVERVMgKz0gJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGJsdWV6LWxpYnMpCisgIExPQ0FMX0NfSU5DTFVERVMgKz0gJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGJsdWV6LXV0aWxzKQogZW5kaWYKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9EdW1wSW50ZXJmYWNlLmNwcCBiL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvRHVtcEludGVyZmFjZS5jcHAKaW5kZXggNWZmMmYxOC4uOGVlZTljYyAxMDA2NDQKLS0tIGEvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9EdW1wSW50ZXJmYWNlLmNwcAorKysgYi9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb0R1bXBJbnRlcmZhY2UuY3BwCkBAIC0yLDE2ICsyLDE2IEBACiAqKgogKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCiAKQEAgLTI4LDYgKzI4LDggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitib29sIGdGaXJzdCA9IHRydWU7ICAgICAgIC8vIHRydWUgaWYgZmlyc3Qgd3JpdGUgYWZ0ZXIgYSBzdGFuZGJ5CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogQXVkaW9EdW1wSW50ZXJmYWNlOjpBdWRpb0R1bXBJbnRlcmZhY2UoQXVkaW9IYXJkd2FyZUludGVyZmFjZSogaHcpCkBAIC00MCwxNyArNDIsMjUgQEAKIH0KIAogCitBdWRpb0R1bXBJbnRlcmZhY2U6On5BdWRpb0R1bXBJbnRlcmZhY2UoKQoreworICAgIGlmKG1GaW5hbEludGVyZmFjZSkgZGVsZXRlIG1GaW5hbEludGVyZmFjZTsKKyAgICBpZihtU3RyZWFtT3V0KSBkZWxldGUgbVN0cmVhbU91dDsKK30KKworCiBzdGF0dXNfdCBBdWRpb0R1bXBJbnRlcmZhY2U6OnN0YW5kYnkoKQogewogICAgIGlmKG1TdHJlYW1PdXQpICBtU3RyZWFtT3V0LT5DbG9zZSgpOworICAgIGdGaXJzdCA9IHRydWU7CiAgICAgcmV0dXJuIG1GaW5hbEludGVyZmFjZS0+c3RhbmRieSgpOwogfQogCiAKIEF1ZGlvU3RyZWFtT3V0KiBBdWRpb0R1bXBJbnRlcmZhY2U6Om9wZW5PdXRwdXRTdHJlYW0oCi0gICAgICAgIGludCBmb3JtYXQsIGludCBjaGFubmVsQ291bnQsIHVpbnQzMl90IHNhbXBsZVJhdGUpCisgICAgICAgIGludCBmb3JtYXQsIGludCBjaGFubmVsQ291bnQsIHVpbnQzMl90IHNhbXBsZVJhdGUsIHN0YXR1c190ICpzdGF0dXMpCiB7Ci0gICAgQXVkaW9TdHJlYW1PdXQqIG91dEZpbmFsID0gbUZpbmFsSW50ZXJmYWNlLT5vcGVuT3V0cHV0U3RyZWFtKGZvcm1hdCwgY2hhbm5lbENvdW50LCBzYW1wbGVSYXRlKTsKKyAgICBBdWRpb1N0cmVhbU91dCogb3V0RmluYWwgPSBtRmluYWxJbnRlcmZhY2UtPm9wZW5PdXRwdXRTdHJlYW0oZm9ybWF0LCBjaGFubmVsQ291bnQsIHNhbXBsZVJhdGUsIHN0YXR1cyk7CiAKICAgICBpZihvdXRGaW5hbCkgewogICAgICAgICBtU3RyZWFtT3V0ID0gIG5ldyBBdWRpb1N0cmVhbU91dER1bXAob3V0RmluYWwpOwpAQCAtNjksMTMgKzc5LDI2IEBACiAgICAgbU91dEZpbGUgPSAwOwogfQogCisKK0F1ZGlvU3RyZWFtT3V0RHVtcDo6fkF1ZGlvU3RyZWFtT3V0RHVtcCgpCit7CisgICAgQ2xvc2UoKTsKKyAgICBkZWxldGUgbUZpbmFsU3RyZWFtOworfQorCiBzc2l6ZV90IEF1ZGlvU3RyZWFtT3V0RHVtcDo6d3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3QgYnl0ZXMpCiB7CiAgICAgc3NpemVfdCByZXQ7Ci0gICAgCisKICAgICByZXQgPSBtRmluYWxTdHJlYW0tPndyaXRlKGJ1ZmZlciwgYnl0ZXMpOwotICAgIGlmKCFtT3V0RmlsZSkgewotICAgICAgICBtT3V0RmlsZSA9IGZvcGVuKEZMSU5HRVJfRFVNUF9OQU1FLCAiYWIiKTsKKyAgICBpZighbU91dEZpbGUgJiYgZ0ZpcnN0KSB7CisgICAgICAgIGdGaXJzdCA9IGZhbHNlOworICAgICAgICAvLyBjaGVjayBpZiBkdW1wIGZpbGUgZXhpc3QKKyAgICAgICAgbU91dEZpbGUgPSBmb3BlbihGTElOR0VSX0RVTVBfTkFNRSwgInIiKTsKKyAgICAgICAgaWYobU91dEZpbGUpIHsKKyAgICAgICAgICAgIGZjbG9zZShtT3V0RmlsZSk7CisgICAgICAgICAgICBtT3V0RmlsZSA9IGZvcGVuKEZMSU5HRVJfRFVNUF9OQU1FLCAiYWIiKTsKKyAgICAgICAgfQogICAgIH0KICAgICBpZiAobU91dEZpbGUpIHsKICAgICAgICAgZndyaXRlKGJ1ZmZlciwgYnl0ZXMsIDEsIG1PdXRGaWxlKTsKZGlmZiAtLWdpdCBhL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvRHVtcEludGVyZmFjZS5oIGIvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9EdW1wSW50ZXJmYWNlLmgKaW5kZXggNzMyYjk3ZC4uYTY1ZTU2YSAxMDA2NDQKLS0tIGEvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9EdW1wSW50ZXJmYWNlLmgKKysrIGIvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9EdW1wSW50ZXJmYWNlLmgKQEAgLTIsMTYgKzIsMTYgQEAKICoqCiAqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KIApAQCAtMjEsMzMgKzIxLDM1IEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKLSNpbmNsdWRlIDxoYXJkd2FyZS9BdWRpb0hhcmR3YXJlSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvQXVkaW9IYXJkd2FyZUJhc2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi0jZGVmaW5lIEZMSU5HRVJfRFVNUF9OQU1FICIvdG1wL0ZsaW5nZXJPdXQucGNtIiAvLyBuYW1lIG9mIGZpbGUgdXNlZCBmb3IgZHVtcAorI2RlZmluZSBGTElOR0VSX0RVTVBfTkFNRSAiL2RhdGEvRmxpbmdlck91dC5wY20iIC8vIG5hbWUgb2YgZmlsZSB1c2VkIGZvciBkdW1wCiAKIGNsYXNzIEF1ZGlvU3RyZWFtT3V0RHVtcCA6IHB1YmxpYyBBdWRpb1N0cmVhbU91dCB7CiBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbU91dER1bXAoIEF1ZGlvU3RyZWFtT3V0KiBGaW5hbFN0cmVhbSk7CisgICAgICAgICAgICAgICAgICAgICAgICB+QXVkaW9TdHJlYW1PdXREdW1wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgIHdyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGJ5dGVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAorCiAgICAgdmlydHVhbCB1aW50MzJfdCAgICBzYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbUZpbmFsU3RyZWFtLT5zYW1wbGVSYXRlKCk7IH0KICAgICB2aXJ0dWFsIHNpemVfdCAgICAgIGJ1ZmZlclNpemUoKSBjb25zdCB7IHJldHVybiBtRmluYWxTdHJlYW0tPmJ1ZmZlclNpemUoKTsgfQogICAgIHZpcnR1YWwgaW50ICAgICAgICAgY2hhbm5lbENvdW50KCkgY29uc3QgeyByZXR1cm4gbUZpbmFsU3RyZWFtLT5jaGFubmVsQ291bnQoKTsgfQogICAgIHZpcnR1YWwgaW50ICAgICAgICAgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUZpbmFsU3RyZWFtLT5mb3JtYXQoKTsgfQorICAgIHZpcnR1YWwgdWludDMyX3QgICAgbGF0ZW5jeSgpIGNvbnN0IHsgcmV0dXJuIG1GaW5hbFN0cmVhbS0+bGF0ZW5jeSgpOyB9CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIG1GaW5hbFN0cmVhbS0+c2V0Vm9sdW1lKHZvbHVtZSk7IH0KICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7IHJldHVybiBtRmluYWxTdHJlYW0tPmR1bXAoZmQsIGFyZ3MpOyB9CiAgICAgdm9pZCAgICAgICAgICAgICAgICBDbG9zZSh2b2lkKTsKIAogcHJpdmF0ZToKLSAgICBBdWRpb1N0cmVhbU91dCAgKm1GaW5hbFN0cmVhbTsKLSAgICBGSUxFICAgICAgICAgICAgKm1PdXRGaWxlOyAgICAgLy8gb3V0cHV0IGZpbGUKKyAgICBBdWRpb1N0cmVhbU91dCAgICAgICptRmluYWxTdHJlYW07CisgICAgRklMRSAgICAgICAgICAgICAgICAqbU91dEZpbGU7ICAgICAvLyBvdXRwdXQgZmlsZQogfTsKIAogCi1jbGFzcyBBdWRpb0R1bXBJbnRlcmZhY2UgOiBwdWJsaWMgIEF1ZGlvSGFyZHdhcmVJbnRlcmZhY2UKK2NsYXNzIEF1ZGlvRHVtcEludGVyZmFjZSA6IHB1YmxpYyBBdWRpb0hhcmR3YXJlQmFzZQogewogCiBwdWJsaWM6CkBAIC01NiwxMCArNTgsMTAgQEAKICAgICB2aXJ0dWFsIEF1ZGlvU3RyZWFtT3V0KiBvcGVuT3V0cHV0U3RyZWFtKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0PTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQ9MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZT0wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZT0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzPTApOworICAgIHZpcnR1YWwgICAgICAgICAgICAgfkF1ZGlvRHVtcEludGVyZmFjZSgpOwogCi0gICAgdmlydHVhbCAgICAgICAgICAgICB+QXVkaW9EdW1wSW50ZXJmYWNlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ZGVsZXRlIG1GaW5hbEludGVyZmFjZTt9CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBpbml0Q2hlY2soKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyZXR1cm4gbUZpbmFsSW50ZXJmYWNlLT5pbml0Q2hlY2soKTt9CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpCkBAIC02NywxMyArNjksNiBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIG1GaW5hbEludGVyZmFjZS0+c2V0TWFzdGVyVm9sdW1lKHZvbHVtZSk7fQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRSb3V0aW5nKGludCBtb2RlLCB1aW50MzJfdCByb3V0ZXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAge3JldHVybiBtRmluYWxJbnRlcmZhY2UtPnNldFJvdXRpbmcobW9kZSwgcm91dGVzKTt9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRSb3V0aW5nKGludCBtb2RlLCB1aW50MzJfdCogcm91dGVzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyZXR1cm4gbUZpbmFsSW50ZXJmYWNlLT5nZXRSb3V0aW5nKG1vZGUsIHJvdXRlcyk7fQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0TW9kZShpbnQqIG1vZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAge3JldHVybiBtRmluYWxJbnRlcmZhY2UtPmdldE1vZGUobW9kZSk7fQotICAgIAogICAgIC8vIG1pYyBtdXRlCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRNaWNNdXRlKGJvb2wgc3RhdGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3JldHVybiBtRmluYWxJbnRlcmZhY2UtPnNldE1pY011dGUoc3RhdGUpO30KQEAgLTgzLDE3ICs3OCwxNyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVyKGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3JldHVybiBtRmluYWxJbnRlcmZhY2UtPnNldFBhcmFtZXRlcihrZXksIHZhbHVlKTt9CiAKLSAgICB2aXJ0dWFsIEF1ZGlvU3RyZWFtSW4qIG9wZW5JbnB1dFN0cmVhbSggaW50IGZvcm1hdCwgaW50IGNoYW5uZWxDb3VudCwgdWludDMyX3Qgc2FtcGxlUmF0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIG1GaW5hbEludGVyZmFjZS0+b3BlbklucHV0U3RyZWFtKCBmb3JtYXQsIGNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSk7fQorICAgIHZpcnR1YWwgQXVkaW9TdHJlYW1Jbiogb3BlbklucHV0U3RyZWFtKCBpbnQgZm9ybWF0LCBpbnQgY2hhbm5lbENvdW50LCB1aW50MzJfdCBzYW1wbGVSYXRlLCBzdGF0dXNfdCAqc3RhdHVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyZXR1cm4gbUZpbmFsSW50ZXJmYWNlLT5vcGVuSW5wdXRTdHJlYW0oIGZvcm1hdCwgY2hhbm5lbENvdW50LCBzYW1wbGVSYXRlLCBzdGF0dXMpO30KIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIHsgcmV0dXJuIG1GaW5hbEludGVyZmFjZS0+ZHVtcFN0YXRlKGZkLCBhcmdzKTsgfQogCiBwcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBkb1JvdXRpbmcoKSB7cmV0dXJuIDA7fQotICAgIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZG9Sb3V0aW5nKCkge3JldHVybiBtRmluYWxJbnRlcmZhY2UtPnNldFJvdXRpbmcobU1vZGUsIG1Sb3V0ZXNbbU1vZGVdKTt9CisKICAgICBBdWRpb0hhcmR3YXJlSW50ZXJmYWNlICAqbUZpbmFsSW50ZXJmYWNlOwogICAgIEF1ZGlvU3RyZWFtT3V0RHVtcCAgICAgICptU3RyZWFtT3V0OwotICAgIAorCiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcCBiL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKaW5kZXggZmIyMTYyOS4uNTNiMThhZCAxMDA2NDQKLS0tIGEvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAorKysgYi9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCkBAIC0zMSw2ICszMSw4IEBACiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVjb3JkLmg+CiAKQEAgLTQxLDkgKzQzLDEzIEBACiAjaW5jbHVkZSAiQXVkaW9NaXhlci5oIgogI2luY2x1ZGUgIkF1ZGlvRmxpbmdlci5oIgogCisjaWZkZWYgV0lUSF9BMkRQCisjaW5jbHVkZSAiQTJkcEF1ZGlvSW50ZXJmYWNlLmgiCisjZW5kaWYKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdGF0aWMgY29uc3QgbnNlY3NfdCBrU3RhbmRieVRpbWVJbk5zZWNzID0gc2Vjb25kcygzKTsKKy8vc3RhdGljIGNvbnN0IG5zZWNzX3Qga1N0YW5kYnlUaW1lSW5Oc2VjcyA9IHNlY29uZHMoMyk7CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBrQnVmZmVyUmVjb3ZlcnlJblVzZWNzID0gMjAwMDsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGtNYXhCdWZmZXJSZWNvdmVyeUluVXNlY3MgPSAyMDAwMDsKIHN0YXRpYyBjb25zdCBmbG9hdCBNQVhfR0FJTiA9IDQwOTYuMGY7CkBAIC05Myw4ICs5OSw5IEBACiAKIEF1ZGlvRmxpbmdlcjo6QXVkaW9GbGluZ2VyKCkKICAgICA6IEJuQXVkaW9GbGluZ2VyKCksIFRocmVhZChmYWxzZSksCi0gICAgICAgIG1NYXN0ZXJWb2x1bWUoMCksIG1NYXN0ZXJNdXRlKHRydWUpLAotICAgICAgICBtQXVkaW9NaXhlcigwKSwgbUF1ZGlvSGFyZHdhcmUoMCksIG1PdXRwdXQoMCksIG1BdWRpb1JlY29yZFRocmVhZCgwKSwKKyAgICAgICAgbU1hc3RlclZvbHVtZSgwKSwgbU1hc3Rlck11dGUodHJ1ZSksIG1IYXJkd2FyZUF1ZGlvTWl4ZXIoMCksIG1BMmRwQXVkaW9NaXhlcigwKSwKKyAgICAgICAgbUF1ZGlvTWl4ZXIoMCksIG1BdWRpb0hhcmR3YXJlKDApLCBtQTJkcEF1ZGlvSW50ZXJmYWNlKDApLAorICAgICAgICBtSGFyZHdhcmVPdXRwdXQoMCksIG1BMmRwT3V0cHV0KDApLCBtT3V0cHV0KDApLCBtQXVkaW9SZWNvcmRUaHJlYWQoMCksCiAgICAgICAgIG1TYW1wbGVSYXRlKDApLCBtRnJhbWVDb3VudCgwKSwgbUNoYW5uZWxDb3VudCgwKSwgbUZvcm1hdCgwKSwKICAgICAgICAgbU1peEJ1ZmZlcigwKSwgbUxhc3RXcml0ZVRpbWUoMCksIG1OdW1Xcml0ZXMoMCksIG1OdW1EZWxheWVkV3JpdGVzKDApLAogICAgICAgICBtU3RhbmRieShmYWxzZSksIG1JbldyaXRlKGZhbHNlKQpAQCAtMTA1LDE3ICsxMTIsMTQgQEAKICAgICBpZiAobUF1ZGlvSGFyZHdhcmUtPmluaXRDaGVjaygpID09IE5PX0VSUk9SKSB7CiAgICAgICAgIC8vIG9wZW4gMTYtYml0IG91dHB1dCBzdHJlYW0gZm9yIHMvdyBtaXhlcgogICAgICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19PVVRQVVRfT1BFTjsKLSAgICAgICAgbU91dHB1dCA9IG1BdWRpb0hhcmR3YXJlLT5vcGVuT3V0cHV0U3RyZWFtKEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgICAgICBtSGFyZHdhcmVPdXRwdXQgPSBtQXVkaW9IYXJkd2FyZS0+b3Blbk91dHB1dFN0cmVhbShBdWRpb1N5c3RlbTo6UENNXzE2X0JJVCwgMCwgMCwgJnN0YXR1cyk7CiAgICAgICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX0lETEU7Ci0gICAgICAgIGlmIChtT3V0cHV0KSB7Ci0gICAgICAgICAgICBtU2FtcGxlUmF0ZSA9IG1PdXRwdXQtPnNhbXBsZVJhdGUoKTsKLSAgICAgICAgICAgIG1DaGFubmVsQ291bnQgPSBtT3V0cHV0LT5jaGFubmVsQ291bnQoKTsKLSAgICAgICAgICAgIG1Gb3JtYXQgPSBtT3V0cHV0LT5mb3JtYXQoKTsKLSAgICAgICAgICAgIG1NaXhCdWZmZXJTaXplID0gbU91dHB1dC0+YnVmZmVyU2l6ZSgpOwotICAgICAgICAgICAgbUZyYW1lQ291bnQgPSBtTWl4QnVmZmVyU2l6ZSAvIG1DaGFubmVsQ291bnQgLyBzaXplb2YoaW50MTZfdCk7Ci0gICAgICAgICAgICBtTWl4QnVmZmVyID0gbmV3IGludDE2X3RbbUZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50XTsKLSAgICAgICAgICAgIG1lbXNldChtTWl4QnVmZmVyLCAwLCBtTWl4QnVmZmVyU2l6ZSk7Ci0gICAgICAgICAgICBtQXVkaW9NaXhlciA9IG5ldyBBdWRpb01peGVyKG1GcmFtZUNvdW50LCBtU2FtcGxlUmF0ZSk7CisgICAgICAgIGlmIChtSGFyZHdhcmVPdXRwdXQpIHsKKyAgICAgICAgICAgIG1TYW1wbGVSYXRlID0gbUhhcmR3YXJlT3V0cHV0LT5zYW1wbGVSYXRlKCk7CisgICAgICAgICAgICBtSGFyZHdhcmVBdWRpb01peGVyID0gbmV3IEF1ZGlvTWl4ZXIoZ2V0T3V0cHV0RnJhbWVDb3VudChtSGFyZHdhcmVPdXRwdXQpLCBtU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICBzZXRPdXRwdXQobUhhcmR3YXJlT3V0cHV0KTsKKwogICAgICAgICAgICAgLy8gRklYTUUgLSB0aGlzIHNob3VsZCBjb21lIGZyb20gc2V0dGluZ3MKICAgICAgICAgICAgIHNldE1hc3RlclZvbHVtZSgxLjBmKTsKICAgICAgICAgICAgIHNldFJvdXRpbmcoQXVkaW9TeXN0ZW06Ok1PREVfTk9STUFMLCBBdWRpb1N5c3RlbTo6Uk9VVEVfU1BFQUtFUiwgQXVkaW9TeXN0ZW06OlJPVVRFX0FMTCk7CkBAIC0xMjQsMjAgKzEyOCw4NyBAQAogICAgICAgICAgICAgc2V0TW9kZShBdWRpb1N5c3RlbTo6TU9ERV9OT1JNQUwpOwogICAgICAgICAgICAgbU1hc3Rlck11dGUgPSBmYWxzZTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIG91dHB1dCBzdHJlYW0iKTsKKyAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIG91dHB1dCBzdHJlYW0sIHN0YXR1czogJWQiLCBzdGF0dXMpOwogICAgICAgICB9Ci0gICAgfSBlbHNlIHsKKyAgICAgICAgCisjaWZkZWYgV0lUSF9BMkRQCisgICAgICAgIC8vIENyZWF0ZSBBMkRQIGludGVyZmFjZQorICAgICAgICBtQTJkcEF1ZGlvSW50ZXJmYWNlID0gbmV3IEEyZHBBdWRpb0ludGVyZmFjZSgpOworICAgICAgICBtQTJkcE91dHB1dCA9IG1BMmRwQXVkaW9JbnRlcmZhY2UtPm9wZW5PdXRwdXRTdHJlYW0oQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQsIDAsIDAsICZzdGF0dXMpOyAgICAgICAKKyAgICAgICAgbUEyZHBBdWRpb01peGVyID0gbmV3IEF1ZGlvTWl4ZXIoZ2V0T3V0cHV0RnJhbWVDb3VudChtQTJkcE91dHB1dCksIG1BMmRwT3V0cHV0LT5zYW1wbGVSYXRlKCkpOworCisgICAgICAgIC8vIGNyZWF0ZSBhIGJ1ZmZlciBiaWcgZW5vdWdoIGZvciBib3RoIGhhcmR3YXJlIGFuZCBBMkRQIGF1ZGlvIG91dHB1dC4KKyAgICAgICAgc2l6ZV90IGh3RnJhbWVDb3VudCA9IGdldE91dHB1dEZyYW1lQ291bnQobUhhcmR3YXJlT3V0cHV0KTsKKyAgICAgICAgc2l6ZV90IGEyZHBGcmFtZUNvdW50ID0gZ2V0T3V0cHV0RnJhbWVDb3VudChtQTJkcE91dHB1dCk7CisgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gKGh3RnJhbWVDb3VudCA+IGEyZHBGcmFtZUNvdW50ID8gaHdGcmFtZUNvdW50IDogYTJkcEZyYW1lQ291bnQpOworI2Vsc2UKKyAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSBnZXRPdXRwdXRGcmFtZUNvdW50KG1IYXJkd2FyZU91dHB1dCk7CisjZW5kaWYKKyAgICAgICAgLy8gRklYTUUgLSBDdXJyZW50IG1peGVyIGltcGxlbWVudGF0aW9uIG9ubHkgc3VwcG9ydHMgc3RlcmVvIG91dHB1dDogQWx3YXlzCisgICAgICAgIC8vIEFsbG9jYXRlIGEgc3RlcmVvIGJ1ZmZlciBldmVuIGlmIEhXIG91dHB1dCBpcyBtb25vLgorICAgICAgICBtTWl4QnVmZmVyID0gbmV3IGludDE2X3RbZnJhbWVDb3VudCAqIDJdOworICAgICAgICBtZW1zZXQobU1peEJ1ZmZlciwgMCwgZnJhbWVDb3VudCAqIDIgKiBzaXplb2YoaW50MTZfdCkpOworICAgICAgICAKKyAgICAgICAgLy8gU3RhcnQgcmVjb3JkIHRocmVhZAorICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQgPSBuZXcgQXVkaW9SZWNvcmRUaHJlYWQobUF1ZGlvSGFyZHdhcmUpOworICAgICAgICBpZiAobUF1ZGlvUmVjb3JkVGhyZWFkICE9IDApIHsKKyAgICAgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZC0+cnVuKCJBdWRpb1JlY29yZFRocmVhZCIsIFBSSU9SSVRZX1VSR0VOVF9BVURJTyk7ICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgfSBlbHNlIHsKICAgICAgICAgTE9HRSgiQ291bGRuJ3QgZXZlbiBpbml0aWFsaXplIHRoZSBzdHViYmVkIGF1ZGlvIGhhcmR3YXJlISIpOwogICAgIH0KKworICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICAvLyBGSVhNRTogV2hhdCBwcm9wZXJ0eSBzaG91bGQgdGhpcyBiZT8/PworICAgIHByb3BlcnR5X2dldCgicm8uYXVkaW8uc2lsZW50IiwgdmFsdWUsICIwIik7CisgICAgaWYgKGF0b2kodmFsdWUpKSB7CisgICAgICAgIExPR0QoIlNpbGVuY2UgaXMgZ29sZGVuIik7CisgICAgICAgIG1NYXN0ZXJNdXRlID0gdHJ1ZTsKKyAgICB9CiB9CiAKIEF1ZGlvRmxpbmdlcjo6fkF1ZGlvRmxpbmdlcigpCiB7CisgICAgaWYgKG1BdWRpb1JlY29yZFRocmVhZCAhPSAwKSB7CisgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZC0+ZXhpdCgpOworICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQuY2xlYXIoKTsgICAgICAgIAorICAgIH0KICAgICBkZWxldGUgbU91dHB1dDsKKyAgICBkZWxldGUgbUEyZHBPdXRwdXQ7CiAgICAgZGVsZXRlIG1BdWRpb0hhcmR3YXJlOworICAgIGRlbGV0ZSBtQTJkcEF1ZGlvSW50ZXJmYWNlOwogICAgIGRlbGV0ZSBbXSBtTWl4QnVmZmVyOwotICAgIGRlbGV0ZSBtQXVkaW9NaXhlcjsKLSAgICBtQXVkaW9SZWNvcmRUaHJlYWQuY2xlYXIoKTsKKyAgICBkZWxldGUgbUhhcmR3YXJlQXVkaW9NaXhlcjsKKyAgICBkZWxldGUgbUEyZHBBdWRpb01peGVyOworfQorIAordm9pZCBBdWRpb0ZsaW5nZXI6OnNldE91dHB1dChBdWRpb1N0cmVhbU91dCogb3V0cHV0KQoreworICAgIC8vIGxvY2sgb24gbU91dHB1dExvY2sgdG8gcHJldmVudCB0aHJlYWRMb29wKCkgZnJvbSBzdGFydmluZyB1cworICAgIE11dGV4OjpBdXRvbG9jayBfbDIobU91dHB1dExvY2spOworICAgIAorICAgIC8vIHRvIHN5bmNocm9uaXplIHdpdGggdGhyZWFkTG9vcCgpCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIGlmIChtT3V0cHV0ICE9IG91dHB1dCkgeworICAgICAgICBtU2FtcGxlUmF0ZSA9IG91dHB1dC0+c2FtcGxlUmF0ZSgpOworICAgICAgICBtQ2hhbm5lbENvdW50ID0gb3V0cHV0LT5jaGFubmVsQ291bnQoKTsKKyAgICAKKyAgICAgICAgLy8gRklYTUUgLSBDdXJyZW50IG1peGVyIGltcGxlbWVudGF0aW9uIG9ubHkgc3VwcG9ydHMgc3RlcmVvIG91dHB1dAorICAgICAgICBpZiAobUNoYW5uZWxDb3VudCA9PSAxKSB7CisgICAgICAgICAgICBMT0dFKCJJbnZhbGlkIGF1ZGlvIGhhcmR3YXJlIGNoYW5uZWwgY291bnQiKTsKKyAgICAgICAgfQorICAgICAgICBtRm9ybWF0ID0gb3V0cHV0LT5mb3JtYXQoKTsKKyAgICAgICAgbUZyYW1lQ291bnQgPSBnZXRPdXRwdXRGcmFtZUNvdW50KG91dHB1dCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgIG1BdWRpb01peGVyID0gKG91dHB1dCA9PSBtQTJkcE91dHB1dCA/IG1BMmRwQXVkaW9NaXhlciA6IG1IYXJkd2FyZUF1ZGlvTWl4ZXIpOworICAgICAgICBtT3V0cHV0ID0gb3V0cHV0OworICAgIH0KK30KKworc2l6ZV90IEF1ZGlvRmxpbmdlcjo6Z2V0T3V0cHV0RnJhbWVDb3VudChBdWRpb1N0cmVhbU91dCogb3V0cHV0KSAKK3sKKyAgICByZXR1cm4gb3V0cHV0LT5idWZmZXJTaXplKCkgLyBvdXRwdXQtPmNoYW5uZWxDb3VudCgpIC8gc2l6ZW9mKGludDE2X3QpOwogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmR1bXBDbGllbnRzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKQEAgLTIwMSw4ICsyNzIsOCBAQAogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwotICAgIAotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkF1ZGlvTWl4ZXIgdHJhY2tzOiAlMDh4XG4iLCBhdWRpb01peGVyKCkudHJhY2tOYW1lcygpKTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkF1ZGlvTWl4ZXIgdHJhY2tzOiAlMDh4XG4iLCBhdWRpb01peGVyKCktPnRyYWNrTmFtZXMoKSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgImxhc3Qgd3JpdGUgb2NjdXJyZWQgKG1zZWNzKTogJWxsdVxuIiwgbnMybXMoc3lzdGVtVGltZSgpIC0gbUxhc3RXcml0ZVRpbWUpKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CkBAIC0yNTQsMTcgKzMyNSwyNiBAQAogLy8gVGhyZWFkIHZpcnR1YWxzCiBib29sIEF1ZGlvRmxpbmdlcjo6dGhyZWFkTG9vcCgpCiB7Ci0gICAgbnNlY3NfdCBtYXhQZXJpb2QgPSBzZWNvbmRzKG1GcmFtZUNvdW50KSAvIG1TYW1wbGVSYXRlICogMjsKICAgICB1bnNpZ25lZCBsb25nIHNsZWVwVGltZSA9IGtCdWZmZXJSZWNvdmVyeUluVXNlY3M7Ci0gICAgY29uc3Qgc2l6ZV90IG1peEJ1ZmZlclNpemUgPSBtRnJhbWVDb3VudCptQ2hhbm5lbENvdW50KnNpemVvZihpbnQxNl90KTsKICAgICBpbnQxNl90KiBjdXJCdWYgPSBtTWl4QnVmZmVyOwogICAgIFZlY3Rvcjwgc3A8VHJhY2s+ID4gdHJhY2tzVG9SZW1vdmU7Ci0gICAgc2l6ZV90IGVuYWJsZWRUcmFja3M7CisgICAgc2l6ZV90IGVuYWJsZWRUcmFja3MgPSAwOwogICAgIG5zZWNzX3Qgc3RhbmRieVRpbWUgPSBzeXN0ZW1UaW1lKCk7CisgICAgQXVkaW9NaXhlciogbWl4ZXIgPSAwOworICAgIHNpemVfdCBmcmFtZUNvdW50ID0gMDsKKyAgICBpbnQgY2hhbm5lbENvdW50ID0gMDsKKyAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gMDsKKyAgICBBdWRpb1N0cmVhbU91dCogb3V0cHV0ID0gMDsKIAogICAgIGRvIHsKICAgICAgICAgZW5hYmxlZFRyYWNrcyA9IDA7Ci0gICAgICAgIHsgLy8gc2NvcGUgZm9yIHRoZSBsb2NrCisgICAgICAgIHsgLy8gc2NvcGUgZm9yIHRoZSBtTG9jaworICAgICAgICAKKyAgICAgICAgICAgIC8vIGxvY2tpbmcgYnJpZWZseSBvbiB0aGUgc2Vjb25kYXJ5IG1PdXRwdXRMb2NrIGlzIG5lY2Vzc2FyeSB0byBhdm9pZAorICAgICAgICAgICAgLy8gaGF2aW5nIHRoaXMgdGhyZWFkIHN0YXJ2ZSB0aGUgdGhyZWFkIHRoYXQgY2FsbGVkIHNldE91dHB1dCgpCisgICAgICAgICAgICBtT3V0cHV0TG9jay5sb2NrKCk7CisgICAgICAgICAgICBtT3V0cHV0TG9jay51bmxvY2soKTsKKwogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAgICAgICAgIGNvbnN0IFNvcnRlZFZlY3Rvcjwgd3A8VHJhY2s+ID4mIGFjdGl2ZVRyYWNrcyA9IG1BY3RpdmVUcmFja3M7CiAKQEAgLTI4Niw2ICszNjYsMTUgQEAKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgLy8gZ2V0IGFjdGl2ZSBtaXhlciBhbmQgb3V0cHV0IHBhcmFtZXRlciB3aGlsZSB0aGUgbG9jayBpcyBoZWxkIGFuZCBrZWVwIHRoZW0KKyAgICAgICAgICAgIC8vIGNvbnNpc3RlbnQgdGlsbCB0aGUgbmV4dCBsb29wLgorICAgICAgICAgICAgCisgICAgICAgICAgICBtaXhlciA9IGF1ZGlvTWl4ZXIoKTsKKyAgICAgICAgICAgIGZyYW1lQ291bnQgPSBtRnJhbWVDb3VudDsKKyAgICAgICAgICAgIGNoYW5uZWxDb3VudCA9IG1DaGFubmVsQ291bnQ7CisgICAgICAgICAgICBzYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7CisgICAgICAgICAgICBvdXRwdXQgPSBtT3V0cHV0OworICAgICAgICAgICAgCiAgICAgICAgICAgICAvLyBmaW5kIG91dCB3aGljaCB0cmFja3MgbmVlZCB0byBiZSBwcm9jZXNzZWQKICAgICAgICAgICAgIHNpemVfdCBjb3VudCA9IGFjdGl2ZVRyYWNrcy5zaXplKCk7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7CkBAIC0yOTQsMTMgKzM4MywxMSBAQAogCiAgICAgICAgICAgICAgICAgVHJhY2sqIGNvbnN0IHRyYWNrID0gdC5nZXQoKTsKICAgICAgICAgICAgICAgICBhdWRpb190cmFja19jYmxrX3QqIGNibGsgPSB0cmFjay0+Y2JsaygpOwotICAgICAgICAgICAgICAgIHVpbnQzMl90IHUgPSBjYmxrLT51c2VyOwotICAgICAgICAgICAgICAgIHVpbnQzMl90IHMgPSBjYmxrLT5zZXJ2ZXI7CiAKICAgICAgICAgICAgICAgICAvLyBUaGUgZmlyc3QgdGltZSBhIHRyYWNrIGlzIGFkZGVkIHdlIHdhaXQKICAgICAgICAgICAgICAgICAvLyBmb3IgYWxsIGl0cyBidWZmZXJzIHRvIGJlIGZpbGxlZCBiZWZvcmUgcHJvY2Vzc2luZyBpdAotICAgICAgICAgICAgICAgIGF1ZGlvTWl4ZXIoKS5zZXRBY3RpdmVUcmFjayh0cmFjay0+bmFtZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAoKHUgPiBzKSAmJiAodHJhY2stPmlzUmVhZHkodSwgcykgfHwgdHJhY2stPmlzU3RvcHBlZCgpKSAmJgorICAgICAgICAgICAgICAgIG1peGVyLT5zZXRBY3RpdmVUcmFjayh0cmFjay0+bmFtZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoY2Jsay0+ZnJhbWVzUmVhZHkoKSAmJiAodHJhY2stPmlzUmVhZHkoKSB8fCB0cmFjay0+aXNTdG9wcGVkKCkpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAhdHJhY2stPmlzUGF1c2VkKCkpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAvL0xPR0QoInU9JTA4eCwgcz0lMDh4IFtPS10iLCB1LCBzKTsKQEAgLTMyNSw5ICs0MTIsOCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgLy8gWFhYOiB0aGVzZSB0aGluZ3MgRE9OJ1QgbmVlZCB0byBiZSBkb25lIGVhY2ggdGltZQotICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyJiBtaXhlcihhdWRpb01peGVyKCkpOwotICAgICAgICAgICAgICAgICAgICBtaXhlci5zZXRCdWZmZXJQcm92aWRlcih0cmFjayk7Ci0gICAgICAgICAgICAgICAgICAgIG1peGVyLmVuYWJsZShBdWRpb01peGVyOjpNSVhJTkcpOworICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIodHJhY2spOworICAgICAgICAgICAgICAgICAgICBtaXhlci0+ZW5hYmxlKEF1ZGlvTWl4ZXI6Ok1JWElORyk7CiAKICAgICAgICAgICAgICAgICAgICAgaW50IHBhcmFtOwogICAgICAgICAgICAgICAgICAgICBpZiAoIHRyYWNrLT5tRmlsbGluZ1VwU3RhdHVzID09IFRyYWNrOjpGU19GSUxMRUQpIHsKQEAgLTM0MiwxNSArNDI4LDE1IEBACiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSA9IEF1ZGlvTWl4ZXI6OlJBTVBfVk9MVU1FOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1peGVyLnNldFBhcmFtZXRlcihwYXJhbSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgbGVmdCk7Ci0gICAgICAgICAgICAgICAgICAgIG1peGVyLnNldFBhcmFtZXRlcihwYXJhbSwgQXVkaW9NaXhlcjo6Vk9MVU1FMSwgcmlnaHQpOwotICAgICAgICAgICAgICAgICAgICBtaXhlci5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIocGFyYW0sIEF1ZGlvTWl4ZXI6OlZPTFVNRTAsIGxlZnQpOworICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKHBhcmFtLCBBdWRpb01peGVyOjpWT0xVTUUxLCByaWdodCk7CisgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OkZPUk1BVCwgdHJhY2stPmZvcm1hdCgpKTsKLSAgICAgICAgICAgICAgICAgICAgbWl4ZXIuc2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpDSEFOTkVMX0NPVU5ULCB0cmFjay0+Y2hhbm5lbENvdW50KCkpOwotICAgICAgICAgICAgICAgICAgICBtaXhlci5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpSRVNBTVBMRSwKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlNBTVBMRV9SQVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50KGNibGstPnNhbXBsZVJhdGUpKTsKQEAgLTM2MSw4ICs0NDcsNyBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8vTE9HRCgidT0lMDh4LCBzPSUwOHggW05PVCBSRUFEWV0iLCB1LCBzKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1N0b3BwZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1GaWxsaW5nVXBTdGF0dXMgPSBUcmFjazo6RlNfRklMTElORzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tRmxhZ3MgPSAwOyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5yZXNldCgpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjay0+aXNUZXJtaW5hdGVkKCkgfHwgdHJhY2stPmlzU3RvcHBlZCgpIHx8IHRyYWNrLT5pc1BhdXNlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGNvbnN1bWVkIGFsbCB0aGUgYnVmZmVycyBvZiB0aGlzIHRyYWNrLgpAQCAtMzc4LDcgKzQ2Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgLy8gTE9HVigiZGlzYWJsZSglZCkiLCB0cmFjay0+bmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9NaXhlcigpLmRpc2FibGUoQXVkaW9NaXhlcjo6TUlYSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgbWl4ZXItPmRpc2FibGUoQXVkaW9NaXhlcjo6TUlYSU5HKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTM5MCwyNiArNDc1LDI3IEBACiAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFja3MucmVtb3ZlKHRyYWNrKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbVRyYWNrcy5yZW1vdmUodHJhY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9NaXhlcigpLmRlbGV0ZVRyYWNrTmFtZSh0cmFjay0+bU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPmRlbGV0ZVRyYWNrTmFtZSh0cmFjay0+bU5hbWUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KKyAgICAgICAgICAgIH0gIAorICAgICAgIH0KICAgICAgICAgaWYgKExJS0VMWShlbmFibGVkVHJhY2tzKSkgewogICAgICAgICAgICAgLy8gbWl4IGJ1ZmZlcnMuLi4KLSAgICAgICAgICAgIGF1ZGlvTWl4ZXIoKS5wcm9jZXNzKGN1ckJ1Zik7CisgICAgICAgICAgICBtaXhlci0+cHJvY2VzcyhjdXJCdWYpOwogCiAgICAgICAgICAgICAvLyBvdXRwdXQgYXVkaW8gdG8gaGFyZHdhcmUKICAgICAgICAgICAgIG1MYXN0V3JpdGVUaW1lID0gc3lzdGVtVGltZSgpOwogICAgICAgICAgICAgbUluV3JpdGUgPSB0cnVlOwotICAgICAgICAgICAgbU91dHB1dC0+d3JpdGUoY3VyQnVmLCBtaXhCdWZmZXJTaXplKTsKKyAgICAgICAgICAgIHNpemVfdCBtaXhCdWZmZXJTaXplID0gZnJhbWVDb3VudCpjaGFubmVsQ291bnQqc2l6ZW9mKGludDE2X3QpOworICAgICAgICAgICAgb3V0cHV0LT53cml0ZShjdXJCdWYsIG1peEJ1ZmZlclNpemUpOwogICAgICAgICAgICAgbU51bVdyaXRlcysrOwogICAgICAgICAgICAgbUluV3JpdGUgPSBmYWxzZTsKICAgICAgICAgICAgIG1TdGFuZGJ5ID0gZmFsc2U7CiAgICAgICAgICAgICBuc2Vjc190IHRlbXAgPSBzeXN0ZW1UaW1lKCk7CiAgICAgICAgICAgICBzdGFuZGJ5VGltZSA9IHRlbXAgKyBrU3RhbmRieVRpbWVJbk5zZWNzOwogICAgICAgICAgICAgbnNlY3NfdCBkZWx0YSA9IHRlbXAgLSBtTGFzdFdyaXRlVGltZTsKKyAgICAgICAgICAgIG5zZWNzX3QgbWF4UGVyaW9kID0gc2Vjb25kcyhmcmFtZUNvdW50KSAvIHNhbXBsZVJhdGUgKiAyOwogICAgICAgICAgICAgaWYgKGRlbHRhID4gbWF4UGVyaW9kKSB7CiAgICAgICAgICAgICAgICAgTE9HVygid3JpdGUgYmxvY2tlZCBmb3IgJWxsdSBtc2VjcyIsIG5zMm1zKGRlbHRhKSk7CiAgICAgICAgICAgICAgICAgbU51bURlbGF5ZWRXcml0ZXMrKzsKQEAgLTQ1OCw0MyArNTQ0LDYwIEBACiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgIGludCBmb3JtYXQsCiAgICAgICAgIGludCBjaGFubmVsQ291bnQsCi0gICAgICAgIGludCBidWZmZXJDb3VudCwKLSAgICAgICAgdWludDMyX3QgZmxhZ3MpCisgICAgICAgIGludCBmcmFtZUNvdW50LAorICAgICAgICB1aW50MzJfdCBmbGFncywKKyAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKKyAgICAgICAgc3RhdHVzX3QgKnN0YXR1cykKIHsKLSAgICBpZiAoc3RyZWFtVHlwZSA+PSBBdWRpb1RyYWNrOjpOVU1fU1RSRUFNX1RZUEVTKSB7Ci0gICAgICAgIExPR0UoImludmFsaWQgc3RyZWFtIHR5cGUiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKHNhbXBsZVJhdGUgPiBNQVhfU0FNUExFX1JBVEUpIHsKLSAgICAgICAgTE9HRSgiU2FtcGxlIHJhdGUgb3V0IG9mIHJhbmdlOiAlZCIsIHNhbXBsZVJhdGUpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KICAgICBzcDxUcmFjaz4gdHJhY2s7CiAgICAgc3A8VHJhY2tIYW5kbGU+IHRyYWNrSGFuZGxlOwotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0KLSAgICBpZiAobVNhbXBsZVJhdGUgPT0gMCkgewotICAgICAgICBMT0dFKCJBdWRpbyBkcml2ZXIgbm90IGluaXRpYWxpemVkLiIpOwotICAgICAgICByZXR1cm4gdHJhY2tIYW5kbGU7Ci0gICAgfQotCiAgICAgc3A8Q2xpZW50PiBjbGllbnQ7Ci0gICAgd3A8Q2xpZW50PiB3Y2xpZW50ID0gbUNsaWVudHMudmFsdWVGb3IocGlkKTsKKyAgICB3cDxDbGllbnQ+IHdjbGllbnQ7CisgICAgc3RhdHVzX3QgbFN0YXR1czsKIAotICAgIGlmICh3Y2xpZW50ICE9IE5VTEwpIHsKLSAgICAgICAgY2xpZW50ID0gd2NsaWVudC5wcm9tb3RlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY2xpZW50ID0gbmV3IENsaWVudCh0aGlzLCBwaWQpOwotICAgICAgICBtQ2xpZW50cy5hZGQocGlkLCBjbGllbnQpOworICAgIGlmIChzdHJlYW1UeXBlID49IEF1ZGlvVHJhY2s6Ok5VTV9TVFJFQU1fVFlQRVMpIHsKKyAgICAgICAgTE9HRSgiaW52YWxpZCBzdHJlYW0gdHlwZSIpOworICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQogCi0gICAgLy8gRklYTUU6IEJ1ZmZlciBzaXplIHNob3VsZCBiZSBiYXNlZCBvbiBzYW1wbGUgcmF0ZSBmb3IgY29uc2lzdGVudCBsYXRlbmN5Ci0gICAgdHJhY2sgPSBuZXcgVHJhY2sodGhpcywgY2xpZW50LCBzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsCi0gICAgICAgICAgICBjaGFubmVsQ291bnQsIGJ1ZmZlckNvdW50LCBjaGFubmVsQ291bnQgPT0gMSA/IG1NaXhCdWZmZXJTaXplPj4xIDogbU1peEJ1ZmZlclNpemUpOwotICAgIG1UcmFja3MuYWRkKHRyYWNrKTsKLSAgICB0cmFja0hhbmRsZSA9IG5ldyBUcmFja0hhbmRsZSh0cmFjayk7CisgICAgLy8gUmVzYW1wbGVyIGltcGxlbWVudGF0aW9uIGxpbWl0cyBpbnB1dCBzYW1wbGluZyByYXRlIHRvIDIgeCBvdXRwdXQgc2FtcGxpbmcgcmF0ZS4KKyAgICBpZiAoc2FtcGxlUmF0ZSA+IE1BWF9TQU1QTEVfUkFURSB8fCBzYW1wbGVSYXRlID4gbVNhbXBsZVJhdGUqMikgeworICAgICAgICBMT0dFKCJTYW1wbGUgcmF0ZSBvdXQgb2YgcmFuZ2U6ICVkIiwgc2FtcGxlUmF0ZSk7CisgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICAgICAgaWYgKG1TYW1wbGVSYXRlID09IDApIHsKKyAgICAgICAgICAgIExPR0UoIkF1ZGlvIGRyaXZlciBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICAgICAgICBsU3RhdHVzID0gTk9fSU5JVDsKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfQorCisgICAgICAgIHdjbGllbnQgPSBtQ2xpZW50cy52YWx1ZUZvcihwaWQpOworCisgICAgICAgIGlmICh3Y2xpZW50ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNsaWVudCA9IHdjbGllbnQucHJvbW90ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2xpZW50ID0gbmV3IENsaWVudCh0aGlzLCBwaWQpOworICAgICAgICAgICAgbUNsaWVudHMuYWRkKHBpZCwgY2xpZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHRyYWNrID0gbmV3IFRyYWNrKHRoaXMsIGNsaWVudCwgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LAorICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCwgZnJhbWVDb3VudCwgc2hhcmVkQnVmZmVyKTsKKyAgICAgICAgbVRyYWNrcy5hZGQodHJhY2spOworICAgICAgICB0cmFja0hhbmRsZSA9IG5ldyBUcmFja0hhbmRsZSh0cmFjayk7CisKKyAgICAgICAgbFN0YXR1cyA9IE5PX0VSUk9SOworICAgIH0KKworRXhpdDoKKyAgICBpZihzdGF0dXMpIHsKKyAgICAgICAgKnN0YXR1cyA9IGxTdGF0dXM7CisgICAgfQogICAgIHJldHVybiB0cmFja0hhbmRsZTsKIH0KIApAQCAtNTE4LDYgKzYyMSwxNiBAQAogICAgIHJldHVybiBtRnJhbWVDb3VudDsKIH0KIAordWludDMyX3QgQXVkaW9GbGluZ2VyOjpsYXRlbmN5KCkgY29uc3QKK3sKKyAgICBpZiAobU91dHB1dCkgeworICAgICAgICByZXR1cm4gbU91dHB1dC0+bGF0ZW5jeSgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnNldE1hc3RlclZvbHVtZShmbG9hdCB2YWx1ZSkKIHsKICAgICAvLyBjaGVjayBjYWxsaW5nIHBlcm1pc3Npb25zCkBAIC01NDksNiArNjYyLDIxIEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCisjaWZkZWYgV0lUSF9BMkRQCisgICAgTE9HRCgic2V0Um91dGluZyAlZCAlZCAlZFxuIiwgbW9kZSwgcm91dGVzLCBtYXNrKTsKKyAgICBpZiAobW9kZSA9PSBBdWRpb1N5c3RlbTo6TU9ERV9OT1JNQUwgJiYgCisgICAgICAgICAgICAobWFzayAmIEF1ZGlvU3lzdGVtOjpST1VURV9CTFVFVE9PVEhfQTJEUCkpIHsKKyAgICAgICAgaWYgKHJvdXRlcyAmIEF1ZGlvU3lzdGVtOjpST1VURV9CTFVFVE9PVEhfQTJEUCkgeworICAgICAgICAgICAgTE9HRCgic2V0IG91dHB1dCB0byBBMkRQXG4iKTsKKyAgICAgICAgICAgIHNldE91dHB1dChtQTJkcE91dHB1dCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dEKCJzZXQgb3V0cHV0IHRvIGhhcmR3YXJlIGF1ZGlvXG4iKTsKKyAgICAgICAgICAgIHNldE91dHB1dChtSGFyZHdhcmVPdXRwdXQpOworICAgICAgICB9CisgICAgICAgIExPR0QoInNldE91dHB1dCBkb25lXG4iKTsKKyAgICB9CisjZW5kaWYKKwogICAgIEF1dG9NdXRleCBsb2NrKG1IYXJkd2FyZUxvY2spOwogICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX0dFVF9ST1VUSU5HOwogICAgIHVpbnQzMl90IHI7CkBAIC02NTYsNyArNzg0LDcgQEAKICAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBdWRpb1RyYWNrOjpOVU1fU1RSRUFNX1RZUEVTKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIAorCiAgICAgbVN0cmVhbVR5cGVzW3N0cmVhbV0udm9sdW1lID0gdmFsdWU7CiAgICAgc3RhdHVzX3QgcmV0ID0gTk9fRVJST1I7CiAgICAgaWYgKHN0cmVhbSA9PSBBdWRpb1RyYWNrOjpWT0lDRV9DQUxMKSB7CkBAIC03NTAsNiArODc4LDcgQEAKICAgICAgICAgLy8gYnVmZmVycyBiZWZvcmUgcGxheWluZy4gVGhpcyBpcyB0byBlbnN1cmUgdGhlIGNsaWVudCB3aWxsCiAgICAgICAgIC8vIGVmZmVjdGl2ZWx5IGdldCB0aGUgbGF0ZW5jeSBpdCByZXF1ZXN0ZWQuCiAgICAgICAgIHRyYWNrLT5tRmlsbGluZ1VwU3RhdHVzID0gVHJhY2s6OkZTX0ZJTExJTkc7CisgICAgICAgIHRyYWNrLT5tUmVzZXREb25lID0gZmFsc2U7CiAgICAgICAgIG1BY3RpdmVUcmFja3MuYWRkKHRyYWNrKTsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KQEAgLTc3MSw3ICs5MDAsNyBAQAogICAgIGlmICh0IT1OVUxMKSB7CiAgICAgICAgIHQtPnJlc2V0KCk7CiAgICAgfQotICAgIGF1ZGlvTWl4ZXIoKS5kZWxldGVUcmFja05hbWUobmFtZSk7CisgICAgYXVkaW9NaXhlcigpLT5kZWxldGVUcmFja05hbWUobmFtZSk7CiAgICAgbUFjdGl2ZVRyYWNrcy5yZW1vdmUodHJhY2spOwogICAgIG1XYWl0V29ya0NWLmJyb2FkY2FzdCgpOwogfQpAQCAtNzg5LDcgKzkxOCw3IEBACiAgICAgaWYgKG1BY3RpdmVUcmFja3MuaW5kZXhPZih0cmFjaykgPCAwKSB7CiAgICAgICAgIExPR1YoInJlbW92ZSB0cmFjayAoJWQpIGFuZCBkZWxldGUgZnJvbSBtaXhlciIsIHRyYWNrLT5uYW1lKCkpOwogICAgICAgICBtVHJhY2tzLnJlbW92ZSh0cmFjayk7Ci0gICAgICAgIGF1ZGlvTWl4ZXIoKS5kZWxldGVUcmFja05hbWUoa2VlcC0+bmFtZSgpKTsKKyAgICAgICAgYXVkaW9NaXhlcigpLT5kZWxldGVUcmFja05hbWUoa2VlcC0+bmFtZSgpKTsKICAgICB9CiB9CiAKQEAgLTgyMywzOCArOTUyLDUzIEBACiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgaW50IGZvcm1hdCwKICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCi0gICAgICAgICAgICBpbnQgYnVmZmVyQ291bnQsCi0gICAgICAgICAgICBpbnQgYnVmZmVyU2l6ZSkKKyAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlcikKICAgICA6ICAgUmVmQmFzZSgpLAogICAgICAgICBtQXVkaW9GbGluZ2VyKGF1ZGlvRmxpbmdlciksCiAgICAgICAgIG1DbGllbnQoY2xpZW50KSwKICAgICAgICAgbVN0cmVhbVR5cGUoc3RyZWFtVHlwZSksCi0gICAgICAgIG1Gb3JtYXQoZm9ybWF0KSwKLSAgICAgICAgbUNoYW5uZWxDb3VudChjaGFubmVsQ291bnQpLAotICAgICAgICBtQnVmZmVyQ291bnQoYnVmZmVyQ291bnQpLAotICAgICAgICBtRmxhZ3MoMCksCi0gICAgICAgIG1CdWZmZXJTaXplKGJ1ZmZlclNpemUpLAorICAgICAgICBtRnJhbWVDb3VudCgwKSwKICAgICAgICAgbVN0YXRlKElETEUpLAotICAgICAgICBtQ2xpZW50VGlkKC0xKQorICAgICAgICBtQ2xpZW50VGlkKC0xKSwKKyAgICAgICAgbUZvcm1hdChmb3JtYXQpLAorICAgICAgICBtRmxhZ3MoMCkKIHsKLSAgICBtTmFtZSA9IGF1ZGlvRmxpbmdlci0+YXVkaW9NaXhlcigpLmdldFRyYWNrTmFtZSgpOworICAgIG1OYW1lID0gYXVkaW9GbGluZ2VyLT5hdWRpb01peGVyKCktPmdldFRyYWNrTmFtZSgpOwogICAgIGlmIChtTmFtZSA8IDApIHsKICAgICAgICAgTE9HRSgibm8gbW9yZSB0cmFjayBuYW1lcyBhdmFpbGxhYmxlIik7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKKyAgICBMT0dWX0lGKHNoYXJlZEJ1ZmZlciAhPSAwLCAic2hhcmVkQnVmZmVyOiAlcCwgc2l6ZTogJWQiLCBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSwgc2hhcmVkQnVmZmVyLT5zaXplKCkpOworCisKICAgICAvLyBMT0dEKCJDcmVhdGluZyB0cmFjayB3aXRoICVkIGJ1ZmZlcnMgQCAlZCBieXRlcyIsIGJ1ZmZlckNvdW50LCBidWZmZXJTaXplKTsKLSAgICBzaXplX3Qgc2l6ZSA9IHNpemVvZihhdWRpb190cmFja19jYmxrX3QpICsgYnVmZmVyQ291bnQgKiBidWZmZXJTaXplOworICAgc2l6ZV90IHNpemUgPSBzaXplb2YoYXVkaW9fdHJhY2tfY2Jsa190KTsKKyAgIHNpemVfdCBidWZmZXJTaXplID0gZnJhbWVDb3VudCpjaGFubmVsQ291bnQqc2l6ZW9mKGludDE2X3QpOworICAgaWYgKHNoYXJlZEJ1ZmZlciA9PSAwKSB7CisgICAgICAgc2l6ZSArPSBidWZmZXJTaXplOworICAgfQorCiAgICAgbUNibGtNZW1vcnkgPSBjbGllbnQtPmhlYXAoKS0+YWxsb2NhdGUoc2l6ZSk7CiAgICAgaWYgKG1DYmxrTWVtb3J5ICE9IDApIHsKICAgICAgICAgbUNibGsgPSBzdGF0aWNfY2FzdDxhdWRpb190cmFja19jYmxrX3QgKj4obUNibGtNZW1vcnktPnBvaW50ZXIoKSk7CiAgICAgICAgIGlmIChtQ2JsaykgeyAvLyBjb25zdHJ1Y3QgdGhlIHNoYXJlZCBzdHJ1Y3R1cmUgaW4tcGxhY2UuCiAgICAgICAgICAgICBuZXcobUNibGspIGF1ZGlvX3RyYWNrX2NibGtfdCgpOwogICAgICAgICAgICAgLy8gY2xlYXIgYWxsIGJ1ZmZlcnMKLSAgICAgICAgICAgIG1DYmxrLT5zaXplID0gYnVmZmVyU2l6ZTsKKyAgICAgICAgICAgIG1DYmxrLT5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKICAgICAgICAgICAgIG1DYmxrLT5zYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKLSAgICAgICAgICAgIG1CdWZmZXJzID0gKGNoYXIqKW1DYmxrICsgc2l6ZW9mKGF1ZGlvX3RyYWNrX2NibGtfdCk7Ci0gICAgICAgICAgICBtZW1zZXQobUJ1ZmZlcnMsIDAsIGJ1ZmZlckNvdW50ICogYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBtQ2Jsay0+Y2hhbm5lbHMgPSBjaGFubmVsQ291bnQ7CisgICAgICAgICAgICBpZiAoc2hhcmVkQnVmZmVyID09IDApIHsKKyAgICAgICAgICAgICAgICBtQnVmZmVyID0gKGNoYXIqKW1DYmxrICsgc2l6ZW9mKGF1ZGlvX3RyYWNrX2NibGtfdCk7CisgICAgICAgICAgICAgICAgbWVtc2V0KG1CdWZmZXIsIDAsIGZyYW1lQ291bnQqY2hhbm5lbENvdW50KnNpemVvZihpbnQxNl90KSk7CisgICAgICAgICAgICAgICAgLy8gRm9yY2UgdW5kZXJydW4gY29uZGl0aW9uIHRvIGF2b2lkIGZhbHNlIHVuZGVycnVuIGNhbGxiYWNrIHVudGlsIGZpcnN0IGRhdGEgaXMKKyAgICAgICAgICAgICAgICAvLyB3cml0dGVuIHRvIGJ1ZmZlcgorICAgICAgICAgICAgICAgIG1DYmxrLT5mbG93Q29udHJvbEZsYWcgPSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtQnVmZmVyID0gc2hhcmVkQnVmZmVyLT5wb2ludGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQnVmZmVyRW5kID0gKHVpbnQ4X3QgKiltQnVmZmVyICsgYnVmZmVyU2l6ZTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIExPR0UoIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBBdWRpb1RyYWNrIHNpemU9JXUiLCBzaXplKTsKQEAgLTg3MywxNSArMTAxNywxNiBAQAogdm9pZCBBdWRpb0ZsaW5nZXI6OlRyYWNrQmFzZTo6cmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKIHsKICAgICBidWZmZXItPnJhdyA9IDA7Ci0gICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKKyAgICBtRnJhbWVDb3VudCA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKICAgICBzdGVwKCk7CisgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKIH0KIAogYm9vbCBBdWRpb0ZsaW5nZXI6OlRyYWNrQmFzZTo6c3RlcCgpIHsKICAgICBib29sIHJlc3VsdDsKICAgICBhdWRpb190cmFja19jYmxrX3QqIGNibGsgPSB0aGlzLT5jYmxrKCk7Ci0gICAgCi0gICAgcmVzdWx0ID0gY2Jsay0+c3RlcFNlcnZlcihidWZmZXJDb3VudCgpKTsgCisKKyAgICByZXN1bHQgPSBjYmxrLT5zdGVwU2VydmVyKG1GcmFtZUNvdW50KTsKICAgICBpZiAoIXJlc3VsdCkgewogICAgICAgICBMT0dWKCJzdGVwU2VydmVyIGZhaWxlZCBhY3F1aXJpbmcgY2JsayBtdXRleCIpOwogICAgICAgICBtRmxhZ3MgfD0gU1RFUFNFUlZFUl9GQUlMRUQ7CkBAIC04OTQsNyArMTAzOSwxMCBAQAogCiAgICAgY2Jsay0+dXNlciA9IDA7CiAgICAgY2Jsay0+c2VydmVyID0gMDsKLSAgICBtRmxhZ3MgPSAwOyAgICAKKyAgICBjYmxrLT51c2VyQmFzZSA9IDA7CisgICAgY2Jsay0+c2VydmVyQmFzZSA9IDA7CisgICAgbUZsYWdzID0gMDsKKyAgICBMT0dWKCJUcmFja0Jhc2U6OnJlc2V0Iik7CiB9CiAKIHNwPElNZW1vcnk+IEF1ZGlvRmxpbmdlcjo6VHJhY2tCYXNlOjpnZXRDYmxrKCkgY29uc3QKQEAgLTkwNiw2ICsxMDU0LDI3IEBACiAgICAgcmV0dXJuIG1DYmxrLT5zYW1wbGVSYXRlOwogfQogCitpbnQgQXVkaW9GbGluZ2VyOjpUcmFja0Jhc2U6OmNoYW5uZWxDb3VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUNibGstPmNoYW5uZWxzOworfQorCit2b2lkKiBBdWRpb0ZsaW5nZXI6OlRyYWNrQmFzZTo6Z2V0QnVmZmVyKHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgZnJhbWVzKSBjb25zdCB7CisgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gdGhpcy0+Y2JsaygpOworICAgIGludDE2X3QgKmJ1ZmZlclN0YXJ0ID0gKGludDE2X3QgKiltQnVmZmVyICsgKG9mZnNldC1jYmxrLT5zZXJ2ZXJCYXNlKSpjYmxrLT5jaGFubmVsczsKKyAgICBpbnQxNl90ICpidWZmZXJFbmQgPSBidWZmZXJTdGFydCArIGZyYW1lcyAqIGNibGstPmNoYW5uZWxzOworCisgICAgLy8gQ2hlY2sgdmFsaWRpdHkgb2YgcmV0dXJuZWQgcG9pbnRlciBpbiBjYXNlIHRoZSB0cmFjayBjb250cm9sIGJsb2NrIHdvdWxkIGhhdmUgYmVlbiBjb3JydXB0ZWQuCisgICAgaWYgKGJ1ZmZlclN0YXJ0IDwgbUJ1ZmZlciB8fCBidWZmZXJTdGFydCA+IGJ1ZmZlckVuZCB8fCBidWZmZXJFbmQgPiBtQnVmZmVyRW5kKSB7CisgICAgICAgIExPR1coIlRyYWNrQmFzZTo6Z2V0QnVmZmVyIGJ1ZmZlciBvdXQgb2YgcmFuZ2U6XG4gICAgc3RhcnQ6ICVwLCBlbmQgJXAgLCBtQnVmZmVyICVwIG1CdWZmZXJFbmQgJXBcbiAgICBcCisgICAgICAgICAgICAgICAgc2VydmVyICVkLCBzZXJ2ZXJCYXNlICVkLCB1c2VyICVkLCB1c2VyQmFzZSAlZCIsCisgICAgICAgICAgICAgICAgYnVmZmVyU3RhcnQsIGJ1ZmZlckVuZCwgbUJ1ZmZlciwgbUJ1ZmZlckVuZCwKKyAgICAgICAgICAgICAgICBjYmxrLT5zZXJ2ZXIsIGNibGstPnNlcnZlckJhc2UsIGNibGstPnVzZXIsIGNibGstPnVzZXJCYXNlKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIGJ1ZmZlclN0YXJ0OworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIEF1ZGlvRmxpbmdlcjo6VHJhY2s6OlRyYWNrKApAQCAtOTE1LDEzICsxMDg0LDE0IEBACiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgaW50IGZvcm1hdCwKICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCi0gICAgICAgICAgICBpbnQgYnVmZmVyQ291bnQsCi0gICAgICAgICAgICBpbnQgYnVmZmVyU2l6ZSkKLSAgICA6ICAgVHJhY2tCYXNlKGF1ZGlvRmxpbmdlciwgY2xpZW50LCBzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxDb3VudCwgYnVmZmVyQ291bnQsIGJ1ZmZlclNpemUpCisgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCwKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIpCisgICAgOiAgIFRyYWNrQmFzZShhdWRpb0ZsaW5nZXIsIGNsaWVudCwgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsQ291bnQsIGZyYW1lQ291bnQsIHNoYXJlZEJ1ZmZlcikKIHsKICAgICBtVm9sdW1lWzBdID0gMS4wZjsKICAgICBtVm9sdW1lWzFdID0gMS4wZjsKICAgICBtTXV0ZSA9IGZhbHNlOworICAgIG1TaGFyZWRCdWZmZXIgPSBzaGFyZWRCdWZmZXI7CiB9CiAKIEF1ZGlvRmxpbmdlcjo6VHJhY2s6On5UcmFjaygpCkBAIC05NDMsOCArMTExMyw4IEBACiAgICAgICAgICAgICBtQ2xpZW50LT5waWQoKSwKICAgICAgICAgICAgIG1TdHJlYW1UeXBlLAogICAgICAgICAgICAgbUZvcm1hdCwKLSAgICAgICAgICAgIG1DaGFubmVsQ291bnQsCi0gICAgICAgICAgICBtQnVmZmVyQ291bnQsCisgICAgICAgICAgICBtQ2Jsay0+Y2hhbm5lbHMsCisgICAgICAgICAgICBtRnJhbWVDb3VudCwKICAgICAgICAgICAgIG1TdGF0ZSwKICAgICAgICAgICAgIG1NdXRlLAogICAgICAgICAgICAgbUZpbGxpbmdVcFN0YXR1cywKQEAgLTk1OCwzNiArMTEyOCw1MCBAQAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpUcmFjazo6Z2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKIHsKICAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gdGhpcy0+Y2JsaygpOwotICAgICB1aW50MzJfdCB1ID0gY2Jsay0+dXNlcjsKLSAgICAgdWludDMyX3QgcyA9IGNibGstPnNlcnZlcjsKLSAgICAgCi0gICAgIC8vIENoZWNrIGlmIGxhc3Qgc3RlcFNlcnZlciBmYWlsZWQsIHRyeSB0byBzdGVwIG5vdyAKKyAgICAgdWludDMyX3QgZnJhbWVzUmVhZHk7CisgICAgIHVpbnQzMl90IGZyYW1lc1JlcSA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKKworICAgICAvLyBDaGVjayBpZiBsYXN0IHN0ZXBTZXJ2ZXIgZmFpbGVkLCB0cnkgdG8gc3RlcCBub3cKICAgICAgaWYgKG1GbGFncyAmIFRyYWNrQmFzZTo6U1RFUFNFUlZFUl9GQUlMRUQpIHsKICAgICAgICAgIGlmICghc3RlcCgpKSAgZ290byBnZXROZXh0QnVmZmVyX2V4aXQ7CiAgICAgICAgICBMT0dWKCJzdGVwU2VydmVyIHJlY292ZXJlZCIpOwogICAgICAgICAgbUZsYWdzICY9IH5UcmFja0Jhc2U6OlNURVBTRVJWRVJfRkFJTEVEOwogICAgICB9CiAKLSAgICAgaWYgKExJS0VMWSh1ID4gcykpIHsKLSAgICAgICAgIGludCBpbmRleCA9IHMgJiBhdWRpb190cmFja19jYmxrX3Q6OkJVRkZFUl9NQVNLOwotICAgICAgICAgYnVmZmVyLT5yYXcgPSBnZXRCdWZmZXIoaW5kZXgpOwotICAgICAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gbUF1ZGlvRmxpbmdlci0+ZnJhbWVDb3VudCgpOwotICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICBmcmFtZXNSZWFkeSA9IGNibGstPmZyYW1lc1JlYWR5KCk7CisKKyAgICAgaWYgKExJS0VMWShmcmFtZXNSZWFkeSkpIHsKKyAgICAgICAgdWludDMyX3QgcyA9IGNibGstPnNlcnZlcjsKKyAgICAgICAgdWludDMyX3QgYnVmZmVyRW5kID0gY2Jsay0+c2VydmVyQmFzZSArIGNibGstPmZyYW1lQ291bnQ7CisKKyAgICAgICAgYnVmZmVyRW5kID0gKGNibGstPmxvb3BFbmQgPCBidWZmZXJFbmQpID8gY2Jsay0+bG9vcEVuZCA6IGJ1ZmZlckVuZDsKKyAgICAgICAgaWYgKGZyYW1lc1JlcSA+IGZyYW1lc1JlYWR5KSB7CisgICAgICAgICAgICBmcmFtZXNSZXEgPSBmcmFtZXNSZWFkeTsKKyAgICAgICAgfQorICAgICAgICBpZiAocyArIGZyYW1lc1JlcSA+IGJ1ZmZlckVuZCkgeworICAgICAgICAgICAgZnJhbWVzUmVxID0gYnVmZmVyRW5kIC0gczsKKyAgICAgICAgfQorCisgICAgICAgICBidWZmZXItPnJhdyA9IGdldEJ1ZmZlcihzLCBmcmFtZXNSZXEpOworICAgICAgICAgaWYgKGJ1ZmZlci0+cmF3ID09IDApIGdvdG8gZ2V0TmV4dEJ1ZmZlcl9leGl0OworCisgICAgICAgICBidWZmZXItPmZyYW1lQ291bnQgPSBmcmFtZXNSZXE7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgfQorCiBnZXROZXh0QnVmZmVyX2V4aXQ6CiAgICAgIGJ1ZmZlci0+cmF3ID0gMDsKICAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKICAgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKIH0KIAotYm9vbCBBdWRpb0ZsaW5nZXI6OlRyYWNrOjppc1JlYWR5KHVpbnQzMl90IHUsIGludDMyX3QgcykgY29uc3QgeworYm9vbCBBdWRpb0ZsaW5nZXI6OlRyYWNrOjppc1JlYWR5KCkgY29uc3QgewogICAgIGlmIChtRmlsbGluZ1VwU3RhdHVzICE9IEZTX0ZJTExJTkcpIHJldHVybiB0cnVlOwotICAgIGNvbnN0IHVpbnQzMl90IHVfc2VxID0gdSAmIGF1ZGlvX3RyYWNrX2NibGtfdDo6U0VRVUVOQ0VfTUFTSzsKLSAgICBjb25zdCB1aW50MzJfdCB1X2J1ZiA9IHUgJiBhdWRpb190cmFja19jYmxrX3Q6OkJVRkZFUl9NQVNLOwotICAgIGNvbnN0IHVpbnQzMl90IHNfc2VxID0gcyAmIGF1ZGlvX3RyYWNrX2NibGtfdDo6U0VRVUVOQ0VfTUFTSzsKLSAgICBjb25zdCB1aW50MzJfdCBzX2J1ZiA9IHMgJiBhdWRpb190cmFja19jYmxrX3Q6OkJVRkZFUl9NQVNLOwotICAgIGlmICh1X3NlcSA+IHNfc2VxICYmIHVfYnVmID09IHNfYnVmKSB7CisKKyAgICBpZiAobUNibGstPmZyYW1lc1JlYWR5KCkgPj0gbUNibGstPmZyYW1lQ291bnQgfHwKKyAgICAgICAgbUNibGstPmZvcmNlUmVhZHkpIHsKICAgICAgICAgbUZpbGxpbmdVcFN0YXR1cyA9IEZTX0ZJTExFRDsKKyAgICAgICAgbUNibGstPmZvcmNlUmVhZHkgPSAwOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTAwNiw3ICsxMTkwLDcgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUF1ZGlvRmxpbmdlci0+bUxvY2spOwogICAgIGlmIChtU3RhdGUgPiBTVE9QUEVEKSB7CiAgICAgICAgIG1TdGF0ZSA9IFNUT1BQRUQ7Ci0gICAgICAgIC8vIElmIHRoZSB0cmFjayBpcyBub3QgYWN0aXZlIChQQVVTRUQgYW5kIGJ1ZmZlcnMgZnVsbCksIGZsdXNoIGJ1ZmZlcnMgIAorICAgICAgICAvLyBJZiB0aGUgdHJhY2sgaXMgbm90IGFjdGl2ZSAoUEFVU0VEIGFuZCBidWZmZXJzIGZ1bGwpLCBmbHVzaCBidWZmZXJzCiAgICAgICAgIGlmIChtQXVkaW9GbGluZ2VyLT5tQWN0aXZlVHJhY2tzLmluZGV4T2YodGhpcykgPCAwKSB7CiAgICAgICAgICAgICByZXNldCgpOwogICAgICAgICB9CkBAIC0xMDM4LDE1ICsxMjIyLDI0IEBACiAgICAgLy8gTk9URTogcmVzZXQoKSB3aWxsIHJlc2V0IGNibGstPnVzZXIgYW5kIGNibGstPnNlcnZlciB3aXRoCiAgICAgLy8gdGhlIHJpc2sgdGhhdCBhdCB0aGUgc2FtZSB0aW1lLCB0aGUgQXVkaW9NaXhlciBpcyB0cnlpbmcgdG8gcmVhZAogICAgIC8vIGRhdGEuIEluIHRoaXMgY2FzZSwgZ2V0TmV4dEJ1ZmZlcigpIHdvdWxkIHJldHVybiBhIE5VTEwgcG9pbnRlcgotICAgIC8vIGFzIGF1ZGlvIGJ1ZmZlciA9PiB0aGUgQXVkaW9NaXhlciBjb2RlIE1VU1QgYWx3YXlzIHRlc3QgdGhhdCBwb2ludGVyIAotICAgIC8vIHJldHVybmVkIGJ5IGdldE5leHRCdWZmZXIoKSBpcyBub3QgTlVMTCEgCisgICAgLy8gYXMgYXVkaW8gYnVmZmVyID0+IHRoZSBBdWRpb01peGVyIGNvZGUgTVVTVCBhbHdheXMgdGVzdCB0aGF0IHBvaW50ZXIKKyAgICAvLyByZXR1cm5lZCBieSBnZXROZXh0QnVmZmVyKCkgaXMgbm90IE5VTEwhCiAgICAgcmVzZXQoKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlRyYWNrOjpyZXNldCgpCiB7Ci0gICAgVHJhY2tCYXNlOjpyZXNldCgpOwotICAgIG1GaWxsaW5nVXBTdGF0dXMgPSBGU19GSUxMSU5HOworICAgIC8vIERvIG5vdCByZXNldCB0d2ljZSB0byBhdm9pZCBkaXNjYXJkaW5nIGRhdGEgd3JpdHRlbiBqdXN0IGFmdGVyIGEgZmx1c2ggYW5kIGJlZm9yZQorICAgIC8vIHRoZSBhdWRpb2ZsaW5nZXIgdGhyZWFkIGRldGVjdHMgdGhlIHRyYWNrIGlzIHN0b3BwZWQuCisgICAgaWYgKCFtUmVzZXREb25lKSB7CisgICAgICAgIFRyYWNrQmFzZTo6cmVzZXQoKTsKKyAgICAgICAgLy8gRm9yY2UgdW5kZXJydW4gY29uZGl0aW9uIHRvIGF2b2lkIGZhbHNlIHVuZGVycnVuIGNhbGxiYWNrIHVudGlsIGZpcnN0IGRhdGEgaXMKKyAgICAgICAgLy8gd3JpdHRlbiB0byBidWZmZXIKKyAgICAgICAgbUNibGstPmZsb3dDb250cm9sRmxhZyA9IDE7CisgICAgICAgIG1DYmxrLT5mb3JjZVJlYWR5ID0gMDsKKyAgICAgICAgbUZpbGxpbmdVcFN0YXR1cyA9IEZTX0ZJTExJTkc7ICAgICAgICAKKyAgICAgICAgbVJlc2V0RG9uZSA9IHRydWU7CisgICAgfQogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6VHJhY2s6Om11dGUoYm9vbCBtdXRlZCkKQEAgLTExMTIsMjYgKzEzMDUsMTUgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1zcDxBdWRpb0ZsaW5nZXI6OkF1ZGlvUmVjb3JkVGhyZWFkPiBBdWRpb0ZsaW5nZXI6OmF1ZGlvUmVjb3JkVGhyZWFkKCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtQXVkaW9SZWNvcmRUaHJlYWQ7Ci19Ci0KLXZvaWQgQXVkaW9GbGluZ2VyOjplbmRSZWNvcmQoKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbUF1ZGlvUmVjb3JkVGhyZWFkLmNsZWFyKCk7Ci19Ci0KIHNwPElBdWRpb1JlY29yZD4gQXVkaW9GbGluZ2VyOjpvcGVuUmVjb3JkKAogICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgIGludCBzdHJlYW1UeXBlLAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICBpbnQgZm9ybWF0LAogICAgICAgICBpbnQgY2hhbm5lbENvdW50LAotICAgICAgICBpbnQgYnVmZmVyQ291bnQsCi0gICAgICAgIHVpbnQzMl90IGZsYWdzKQorICAgICAgICBpbnQgZnJhbWVDb3VudCwKKyAgICAgICAgdWludDMyX3QgZmxhZ3MsCisgICAgICAgIHN0YXR1c190ICpzdGF0dXMpCiB7CiAgICAgc3A8QXVkaW9SZWNvcmRUaHJlYWQ+IHRocmVhZDsKICAgICBzcDxSZWNvcmRUcmFjaz4gcmVjb3JkVHJhY2s7CkBAIC0xMTM5LDQ2ICsxMzIxLDQ2IEBACiAgICAgc3A8Q2xpZW50PiBjbGllbnQ7CiAgICAgd3A8Q2xpZW50PiB3Y2xpZW50OwogICAgIEF1ZGlvU3RyZWFtSW4qIGlucHV0ID0gMDsKKyAgICBpbnQgaW5GcmFtZUNvdW50OworICAgIHNpemVfdCBpbnB1dEJ1ZmZlclNpemU7CisgICAgc3RhdHVzX3QgbFN0YXR1czsKIAogICAgIC8vIGNoZWNrIGNhbGxpbmcgcGVybWlzc2lvbnMKICAgICBpZiAoIXJlY29yZGluZ0FsbG93ZWQoKSkgeworICAgICAgICBsU3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKICAgICBpZiAodWludDMyX3Qoc3RyZWFtVHlwZSkgPj0gQXVkaW9SZWNvcmQ6Ok5VTV9TVFJFQU1fVFlQRVMpIHsKICAgICAgICAgTE9HRSgiaW52YWxpZCBzdHJlYW0gdHlwZSIpOworICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQogCiAgICAgaWYgKHNhbXBsZVJhdGUgPiBNQVhfU0FNUExFX1JBVEUpIHsKICAgICAgICAgTE9HRSgiU2FtcGxlIHJhdGUgb3V0IG9mIHJhbmdlIik7CisgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKICAgICBpZiAobVNhbXBsZVJhdGUgPT0gMCkgewogICAgICAgICBMT0dFKCJBdWRpbyBkcml2ZXIgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIGxTdGF0dXMgPSBOT19JTklUOwogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQogCi0gICAgLy8gQ3JlYXRlIGF1ZGlvIHRocmVhZCAtIHRha2UgbXV0ZXggdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbgotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgaWYgKG1BdWRpb1JlY29yZFRocmVhZCAhPSAwKSB7Ci0gICAgICAgICAgICBMT0dFKCJSZWNvcmQgY2hhbm5lbCBhbHJlYWR5IG9wZW4iKTsKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgfQotICAgICAgICB0aHJlYWQgPSBuZXcgQXVkaW9SZWNvcmRUaHJlYWQodGhpcyk7Ci0gICAgICAgIG1BdWRpb1JlY29yZFRocmVhZCA9IHRocmVhZDsKKyAgICBpZiAobUF1ZGlvUmVjb3JkVGhyZWFkID09IDApIHsKKyAgICAgICAgTE9HRSgiQXVkaW8gcmVjb3JkIHRocmVhZCBub3Qgc3RhcnRlZCIpOworICAgICAgICBsU3RhdHVzID0gTk9fSU5JVDsKKyAgICAgICAgZ290byBFeGl0OwogICAgIH0KLSAgICAvLyBJdCdzIHNhZmUgdG8gcmVsZWFzZSB0aGUgbXV0ZXggaGVyZSBzaW5jZSB0aGUgY2xpZW50IGRvZXNuJ3QgZ2V0IGEKLSAgICAvLyBoYW5kbGUgdW50aWwgd2UgcmV0dXJuIGZyb20gdGhpcyBjYWxsCiAKLSAgICAvLyBvcGVuIGRyaXZlciwgaW5pdGlhbGl6ZSBoL3cKLSAgICBpbnB1dCA9IG1BdWRpb0hhcmR3YXJlLT5vcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVCwgY2hhbm5lbENvdW50LCBzYW1wbGVSYXRlKTsKLSAgICBpZiAoIWlucHV0KSB7Ci0gICAgICAgIExPR0UoIkVycm9yIG9wZW5pbmcgaW5wdXQgc3RyZWFtIik7Ci0gICAgICAgIG1BdWRpb1JlY29yZFRocmVhZC5jbGVhcigpOworCisgICAgLy8gQ2hlY2sgdGhhdCBhdWRpbyBpbnB1dCBzdHJlYW0gYWNjZXB0cyByZXF1ZXN0ZWQgYXVkaW8gcGFyYW1ldGVycyAKKyAgICBpbnB1dEJ1ZmZlclNpemUgPSBtQXVkaW9IYXJkd2FyZS0+Z2V0SW5wdXRCdWZmZXJTaXplKHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbENvdW50KTsKKyAgICBpZiAoaW5wdXRCdWZmZXJTaXplID09IDApIHsKKyAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgTE9HRSgiQmFkIGF1ZGlvIGlucHV0IHBhcmFtZXRlcnM6IHNhbXBsaW5nIHJhdGUgJXUsIGZvcm1hdCAlZCwgY2hhbm5lbHMgJWQiLCAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsQ291bnQpOwogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQogCkBAIC0xMTk0LDM3ICsxMzc2LDM4IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvLyBmcmFtZUNvdW50IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBpbnB1dCBidWZmZXIgc2l6ZQorICAgIGluRnJhbWVDb3VudCA9IGlucHV0QnVmZmVyU2l6ZS9jaGFubmVsQ291bnQvc2l6ZW9mKHNob3J0KTsKKyAgICBmcmFtZUNvdW50ID0gKChmcmFtZUNvdW50IC0gMSkvaW5GcmFtZUNvdW50ICsgMSkgKiBpbkZyYW1lQ291bnQ7CisKICAgICAvLyBjcmVhdGUgbmV3IHJlY29yZCB0cmFjayBhbmQgcGFzcyB0byByZWNvcmQgdGhyZWFkCiAgICAgcmVjb3JkVHJhY2sgPSBuZXcgUmVjb3JkVHJhY2sodGhpcywgY2xpZW50LCBzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVsQ291bnQsIGJ1ZmZlckNvdW50LCBpbnB1dC0+YnVmZmVyU2l6ZSgpKTsKLQotICAgIC8vIHNwaW4gdXAgcmVjb3JkIHRocmVhZAotICAgIHRocmVhZC0+b3BlbihyZWNvcmRUcmFjaywgaW5wdXQpOwotICAgIHRocmVhZC0+cnVuKCJBdWRpb1JlY29yZFRocmVhZCIsIFBSSU9SSVRZX1VSR0VOVF9BVURJTyk7CisgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxDb3VudCwgZnJhbWVDb3VudCk7CiAKICAgICAvLyByZXR1cm4gdG8gaGFuZGxlIHRvIGNsaWVudAogICAgIHJlY29yZEhhbmRsZSA9IG5ldyBSZWNvcmRIYW5kbGUocmVjb3JkVHJhY2spOworICAgIGxTdGF0dXMgPSBOT19FUlJPUjsKIAogRXhpdDoKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgICpzdGF0dXMgPSBsU3RhdHVzOworICAgIH0KICAgICByZXR1cm4gcmVjb3JkSGFuZGxlOwogfQogCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnN0YXJ0UmVjb3JkKCkgewotICAgIHNwPEF1ZGlvUmVjb3JkVGhyZWFkPiB0ID0gYXVkaW9SZWNvcmRUaHJlYWQoKTsKLSAgICBpZiAodCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gdC0+c3RhcnQoKTsKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6c3RhcnRSZWNvcmQoUmVjb3JkVHJhY2sqIHJlY29yZFRyYWNrKSB7CisgICAgaWYgKG1BdWRpb1JlY29yZFRocmVhZCAhPSAwKSB7CisgICAgICAgIHJldHVybiBtQXVkaW9SZWNvcmRUaHJlYWQtPnN0YXJ0KHJlY29yZFRyYWNrKTsgICAgICAgIAorICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OnN0b3BSZWNvcmQoKSB7Ci0gICAgc3A8QXVkaW9SZWNvcmRUaHJlYWQ+IHQgPSBhdWRpb1JlY29yZFRocmVhZCgpOwotICAgIGlmICh0ICE9IDApIHQtPnN0b3AoKTsKK3ZvaWQgQXVkaW9GbGluZ2VyOjpzdG9wUmVjb3JkKFJlY29yZFRyYWNrKiByZWNvcmRUcmFjaykgeworICAgIGlmIChtQXVkaW9SZWNvcmRUaHJlYWQgIT0gMCkgeworICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQtPnN0b3AocmVjb3JkVHJhY2spOworICAgIH0KIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OmV4aXRSZWNvcmQoKQotewotICAgIHNwPEF1ZGlvUmVjb3JkVGhyZWFkPiB0ID0gYXVkaW9SZWNvcmRUaHJlYWQoKTsKLSAgICBpZiAodCAhPSAwKSB0LT5leGl0KCk7Ci19CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMTIzNSw1NSArMTQxOCw2OSBAQAogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgIGludCBmb3JtYXQsCiAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAotICAgICAgICAgICAgaW50IGJ1ZmZlckNvdW50LAotICAgICAgICAgICAgaW50IGJ1ZmZlclNpemUpCisgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCkKICAgICA6ICAgVHJhY2tCYXNlKGF1ZGlvRmxpbmdlciwgY2xpZW50LCBzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsCi0gICAgICAgICAgICBjaGFubmVsQ291bnQsIGJ1ZmZlckNvdW50LCBidWZmZXJTaXplKSwKKyAgICAgICAgICAgIGNoYW5uZWxDb3VudCwgZnJhbWVDb3VudCwgMCksCiAgICAgICAgICAgICBtT3ZlcmZsb3coZmFsc2UpCiB7CiB9CiAKIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVHJhY2s6On5SZWNvcmRUcmFjaygpCiB7Ci0gICAgbUF1ZGlvRmxpbmdlci0+YXVkaW9NaXhlcigpLmRlbGV0ZVRyYWNrTmFtZShtTmFtZSk7Ci0gICAgbUF1ZGlvRmxpbmdlci0+ZXhpdFJlY29yZCgpOworICAgIG1BdWRpb0ZsaW5nZXItPmF1ZGlvTWl4ZXIoKS0+ZGVsZXRlVHJhY2tOYW1lKG1OYW1lKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUcmFjazo6Z2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKIHsKLSAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gdGhpcy0+Y2JsaygpOwotICAgICBjb25zdCB1aW50MzJfdCB1X3NlcSA9IGNibGstPnVzZXIgJiBhdWRpb190cmFja19jYmxrX3Q6OlNFUVVFTkNFX01BU0s7Ci0gICAgIGNvbnN0IHVpbnQzMl90IHVfYnVmID0gY2Jsay0+dXNlciAmIGF1ZGlvX3RyYWNrX2NibGtfdDo6QlVGRkVSX01BU0s7Ci0gICAgIGNvbnN0IHVpbnQzMl90IHNfc2VxID0gY2Jsay0+c2VydmVyICYgYXVkaW9fdHJhY2tfY2Jsa190OjpTRVFVRU5DRV9NQVNLOwotICAgICBjb25zdCB1aW50MzJfdCBzX2J1ZiA9IGNibGstPnNlcnZlciAmIGF1ZGlvX3RyYWNrX2NibGtfdDo6QlVGRkVSX01BU0s7Ci0gICAgIAotICAgICAvLyBDaGVjayBpZiBsYXN0IHN0ZXBTZXJ2ZXIgZmFpbGVkLCB0cnkgdG8gc3RlcCBub3cgCi0gICAgIGlmIChtRmxhZ3MgJiBUcmFja0Jhc2U6OlNURVBTRVJWRVJfRkFJTEVEKSB7Ci0gICAgICAgICBpZiAoIXN0ZXAoKSkgIGdvdG8gZ2V0TmV4dEJ1ZmZlcl9leGl0OwotICAgICAgICAgTE9HVigic3RlcFNlcnZlciByZWNvdmVyZWQiKTsKLSAgICAgICAgIG1GbGFncyAmPSB+VHJhY2tCYXNlOjpTVEVQU0VSVkVSX0ZBSUxFRDsKLSAgICAgfQorICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IHRoaXMtPmNibGsoKTsKKyAgICB1aW50MzJfdCBmcmFtZXNBdmFpbDsKKyAgICB1aW50MzJfdCBmcmFtZXNSZXEgPSBidWZmZXItPmZyYW1lQ291bnQ7CiAKLSAgICAgaWYgKExJS0VMWShzX3NlcSA9PSB1X3NlcSB8fCBzX2J1ZiAhPSB1X2J1ZikpIHsKLSAgICAgICAgIGJ1ZmZlci0+cmF3ID0gZ2V0QnVmZmVyKHNfYnVmKTsKLSAgICAgICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IG1BdWRpb0ZsaW5nZXItPmZyYW1lQ291bnQoKTsKLSAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgfQorICAgICAvLyBDaGVjayBpZiBsYXN0IHN0ZXBTZXJ2ZXIgZmFpbGVkLCB0cnkgdG8gc3RlcCBub3cKKyAgICBpZiAobUZsYWdzICYgVHJhY2tCYXNlOjpTVEVQU0VSVkVSX0ZBSUxFRCkgeworICAgICAgICBpZiAoIXN0ZXAoKSkgZ290byBnZXROZXh0QnVmZmVyX2V4aXQ7CisgICAgICAgIExPR1YoInN0ZXBTZXJ2ZXIgcmVjb3ZlcmVkIik7CisgICAgICAgIG1GbGFncyAmPSB+VHJhY2tCYXNlOjpTVEVQU0VSVkVSX0ZBSUxFRDsKKyAgICB9CiAKLWdldE5leHRCdWZmZXJfZXhpdDogICAgIAotICAgICBidWZmZXItPnJhdyA9IDA7Ci0gICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7Ci0gICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgZnJhbWVzQXZhaWwgPSBjYmxrLT5mcmFtZXNBdmFpbGFibGVfbCgpOworCisgICAgaWYgKExJS0VMWShmcmFtZXNBdmFpbCkpIHsKKyAgICAgICAgdWludDMyX3QgcyA9IGNibGstPnNlcnZlcjsKKyAgICAgICAgdWludDMyX3QgYnVmZmVyRW5kID0gY2Jsay0+c2VydmVyQmFzZSArIGNibGstPmZyYW1lQ291bnQ7CisKKyAgICAgICAgaWYgKGZyYW1lc1JlcSA+IGZyYW1lc0F2YWlsKSB7CisgICAgICAgICAgICBmcmFtZXNSZXEgPSBmcmFtZXNBdmFpbDsKKyAgICAgICAgfQorICAgICAgICBpZiAocyArIGZyYW1lc1JlcSA+IGJ1ZmZlckVuZCkgeworICAgICAgICAgICAgZnJhbWVzUmVxID0gYnVmZmVyRW5kIC0gczsKKyAgICAgICAgfQorCisgICAgICAgIGJ1ZmZlci0+cmF3ID0gZ2V0QnVmZmVyKHMsIGZyYW1lc1JlcSk7CisgICAgICAgIGlmIChidWZmZXItPnJhdyA9PSAwKSBnb3RvIGdldE5leHRCdWZmZXJfZXhpdDsKKworICAgICAgICBidWZmZXItPmZyYW1lQ291bnQgPSBmcmFtZXNSZXE7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKK2dldE5leHRCdWZmZXJfZXhpdDoKKyAgICBidWZmZXItPnJhdyA9IDA7CisgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKKyAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRyYWNrOjpzdGFydCgpCiB7Ci0gICAgcmV0dXJuIG1BdWRpb0ZsaW5nZXItPnN0YXJ0UmVjb3JkKCk7CisgICAgcmV0dXJuIG1BdWRpb0ZsaW5nZXItPnN0YXJ0UmVjb3JkKHRoaXMpOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVHJhY2s6OnN0b3AoKQogewotICAgIG1BdWRpb0ZsaW5nZXItPnN0b3BSZWNvcmQoKTsKKyAgICBtQXVkaW9GbGluZ2VyLT5zdG9wUmVjb3JkKHRoaXMpOworICAgIFRyYWNrQmFzZTo6cmVzZXQoKTsKKyAgICAvLyBGb3JjZSBvdmVyZXJydW4gY29uZGl0aW9uIHRvIGF2b2lkIGZhbHNlIG92ZXJydW4gY2FsbGJhY2sgdW50aWwgZmlyc3QgZGF0YSBpcworICAgIC8vIHJlYWQgZnJvbSBidWZmZXIKKyAgICBtQ2Jsay0+Zmxvd0NvbnRyb2xGbGFnID0gMTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTI5NCw3ICsxNDkxLDkgQEAKIHsKIH0KIAotQXVkaW9GbGluZ2VyOjpSZWNvcmRIYW5kbGU6On5SZWNvcmRIYW5kbGUoKSB7fQorQXVkaW9GbGluZ2VyOjpSZWNvcmRIYW5kbGU6On5SZWNvcmRIYW5kbGUoKSB7CisgICAgc3RvcCgpOworfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZEhhbmRsZTo6c3RhcnQoKSB7CiAgICAgTE9HVigiUmVjb3JkSGFuZGxlOjpzdGFydCgpIik7CkBAIC0xMzE4LDEwICsxNTE3LDggQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1BdWRpb0ZsaW5nZXI6OkF1ZGlvUmVjb3JkVGhyZWFkOjpBdWRpb1JlY29yZFRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIpIDoKLSAgICBtQXVkaW9GbGluZ2VyKGF1ZGlvRmxpbmdlciksCi0gICAgbVJlY29yZFRyYWNrKDApLAotICAgIG1JbnB1dCgwKSwKK0F1ZGlvRmxpbmdlcjo6QXVkaW9SZWNvcmRUaHJlYWQ6OkF1ZGlvUmVjb3JkVGhyZWFkKEF1ZGlvSGFyZHdhcmVJbnRlcmZhY2UqIGF1ZGlvSGFyZHdhcmUpIDoKKyAgICBtQXVkaW9IYXJkd2FyZShhdWRpb0hhcmR3YXJlKSwKICAgICBtQWN0aXZlKGZhbHNlKQogewogfQpAQCAtMTMzMywxMDggKzE1MzAsMTIzIEBACiBib29sIEF1ZGlvRmxpbmdlcjo6QXVkaW9SZWNvcmRUaHJlYWQ6OnRocmVhZExvb3AoKQogewogICAgIExPR1YoIkF1ZGlvUmVjb3JkVGhyZWFkOiBzdGFydCByZWNvcmQgbG9vcCIpOworICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciBidWZmZXI7CisgICAgaW50IGluQnVmZmVyU2l6ZSA9IDA7CisgICAgaW50IGluRnJhbWVDb3VudCA9IDA7CisgICAgQXVkaW9TdHJlYW1JbiogaW5wdXQgPSAwOwogCisgICAgbUFjdGl2ZSA9IDA7CisgICAgCiAgICAgLy8gc3RhcnQgcmVjb3JkaW5nCiAgICAgd2hpbGUgKCFleGl0UGVuZGluZygpKSB7CiAgICAgICAgIGlmICghbUFjdGl2ZSkgewogICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgaWYgKCFtQWN0aXZlICYmICFleGl0UGVuZGluZygpKSB7CiAgICAgICAgICAgICAgICAgTE9HVigiQXVkaW9SZWNvcmRUaHJlYWQ6IGxvb3Agc3RvcHBpbmciKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5wdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGlucHV0OworICAgICAgICAgICAgICAgICAgICBpbnB1dCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1SZWNvcmRUcmFjay5jbGVhcigpOworCiAgICAgICAgICAgICAgICAgbVdhaXRXb3JrQ1Yud2FpdChtTG9jayk7CisgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICBMT0dWKCJBdWRpb1JlY29yZFRocmVhZDogbG9vcCBzdGFydGluZyIpOworICAgICAgICAgICAgICAgIGlmIChtUmVjb3JkVHJhY2sgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpbnB1dCA9IG1BdWRpb0hhcmR3YXJlLT5vcGVuSW5wdXRTdHJlYW0obVJlY29yZFRyYWNrLT5mb3JtYXQoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZWNvcmRUcmFjay0+Y2hhbm5lbENvdW50KCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVjb3JkVHJhY2stPnNhbXBsZVJhdGUoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtU3RhcnRTdGF0dXMpOworICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXJTaXplID0gaW5wdXQtPmJ1ZmZlclNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluRnJhbWVDb3VudCA9IGluQnVmZmVyU2l6ZS9pbnB1dC0+ZnJhbWVTaXplKCk7ICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtU3RhcnRTdGF0dXMgPSBOT19JTklUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobVN0YXJ0U3RhdHVzICE9Tk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HVygicmVjb3JkIHN0YXJ0IGZhaWxlZCwgc3RhdHVzICVkIiwgbVN0YXJ0U3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBtUmVjb3JkVHJhY2suY2xlYXIoKTsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gcHJvbW90ZSBzdHJvbmcgcmVmIHNvIHRyYWNrIGlzbid0IGRlbGV0ZWQgd2hpbGUgd2UgYWNjZXNzIGl0Ci0gICAgICAgICAgICBzcDxSZWNvcmRUcmFjaz4gdCA9IG1SZWNvcmRUcmFjay5wcm9tb3RlKCk7CisgICAgICAgIH0gZWxzZSBpZiAobVJlY29yZFRyYWNrICE9IDApewogCi0gICAgICAgICAgICAvLyBpZiB3ZSBsb3NlIHRoZSB3ZWFrIHJlZmVyZW5jZSwgY2xpZW50IGlzIGdvbmUuCi0gICAgICAgICAgICBpZiAodCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgTE9HVigiQXVkaW9SZWNvcmRUaHJlYWQ6IGNsaWVudCBkZWxldGVkIHRyYWNrIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChMSUtFTFkodC0+Z2V0TmV4dEJ1ZmZlcigmbUJ1ZmZlcikgPT0gTk9fRVJST1IpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1JbnB1dC0+cmVhZChtQnVmZmVyLnJhdywgdC0+bUJ1ZmZlclNpemUpIDwgMCkgeworICAgICAgICAgICAgYnVmZmVyLmZyYW1lQ291bnQgPSBpbkZyYW1lQ291bnQ7CisgICAgICAgICAgICBpZiAoTElLRUxZKG1SZWNvcmRUcmFjay0+Z2V0TmV4dEJ1ZmZlcigmYnVmZmVyKSA9PSBOT19FUlJPUikpIHsKKyAgICAgICAgICAgICAgICBMT0dWKCJBdWRpb1JlY29yZFRocmVhZCByZWFkOiAlZCBmcmFtZXMiLCBidWZmZXIuZnJhbWVDb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKGlucHV0LT5yZWFkKGJ1ZmZlci5yYXcsIGluQnVmZmVyU2l6ZSkgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgIExPR0UoIkVycm9yIHJlYWRpbmcgYXVkaW8gaW5wdXQiKTsKICAgICAgICAgICAgICAgICAgICAgc2xlZXAoMSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHQtPnJlbGVhc2VCdWZmZXIoJm1CdWZmZXIpOworICAgICAgICAgICAgICAgIG1SZWNvcmRUcmFjay0+cmVsZWFzZUJ1ZmZlcigmYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBtUmVjb3JkVHJhY2stPm92ZXJmbG93KCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIGNsaWVudCBpc24ndCByZXRyaWV2aW5nIGJ1ZmZlcnMgZmFzdCBlbm91Z2gKICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGlmICghdC0+c2V0T3ZlcmZsb3coKSkKKyAgICAgICAgICAgICAgICBpZiAoIW1SZWNvcmRUcmFjay0+c2V0T3ZlcmZsb3coKSkKICAgICAgICAgICAgICAgICAgICAgTE9HVygiQXVkaW9SZWNvcmRUaHJlYWQ6IGJ1ZmZlciBvdmVyZmxvdyIpOworICAgICAgICAgICAgICAgIC8vIFJlbGVhc2UgdGhlIHByb2Nlc3NvciBmb3IgYSB3aGlsZSBiZWZvcmUgYXNraW5nIGZvciBhIG5ldyBidWZmZXIuCisgICAgICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGdpdmUgdGhlIGFwcGxpY2F0aW9uIG1vcmUgY2hhbmNlIHRvIHJlYWQgZnJvbSB0aGUgYnVmZmVyIGFuZAorICAgICAgICAgICAgICAgIC8vIGNsZWFyIHRoZSBvdmVyZmxvdy4KKyAgICAgICAgICAgICAgICB1c2xlZXAoNTAwMCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICB9OworICAgIH0KIAotICAgIC8vIGNsb3NlIGhhcmR3YXJlCi0gICAgY2xvc2UoKTsKIAotICAgIC8vIGRlbGV0ZSB0aGlzIG9iamVjdCAtIG5vIG1vcmUgZGF0YSByZWZlcmVuY2VzIGFmdGVyIHRoaXMgY2FsbAotICAgIG1BdWRpb0ZsaW5nZXItPmVuZFJlY29yZCgpOworICAgIGlmIChpbnB1dCkgeworICAgICAgICBkZWxldGUgaW5wdXQ7CisgICAgfQorICAgIG1SZWNvcmRUcmFjay5jbGVhcigpOworICAgIAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpBdWRpb1JlY29yZFRocmVhZDo6b3Blbihjb25zdCBzcDxSZWNvcmRUcmFjaz4mIHJlY29yZFRyYWNrLCBBdWRpb1N0cmVhbUluICppbnB1dCkgewotICAgIExPR1YoIkF1ZGlvUmVjb3JkVGhyZWFkOjpvcGVuIik7Ci0gICAgLy8gY2hlY2sgZm9yIHJlY29yZCBjaGFubmVsIGFscmVhZHkgb3BlbgotICAgIEF1dG9NdXRleCBsb2NrKCZtTG9jayk7Ci0gICAgaWYgKG1SZWNvcmRUcmFjayAhPSBOVUxMKSB7Ci0gICAgICAgIExPR0UoIlJlY29yZCBjaGFubmVsIGFscmVhZHkgb3BlbiIpOwotICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7Ci0gICAgfQotICAgIG1SZWNvcmRUcmFjayA9IHJlY29yZFRyYWNrOwotICAgIG1JbnB1dCA9IGlucHV0OwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpBdWRpb1JlY29yZFRocmVhZDo6c3RhcnQoKQorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpBdWRpb1JlY29yZFRocmVhZDo6c3RhcnQoUmVjb3JkVHJhY2sqIHJlY29yZFRyYWNrKQogewogICAgIExPR1YoIkF1ZGlvUmVjb3JkVGhyZWFkOjpzdGFydCIpOwogICAgIEF1dG9NdXRleCBsb2NrKCZtTG9jayk7Ci0gICAgaWYgKG1BY3RpdmUpIHJldHVybiAtRUJVU1k7CisgICAgbUFjdGl2ZSA9IHRydWU7CisgICAgLy8gSWYgc3RhcnRpbmcgdGhlIGFjdGl2ZSB0cmFjaywganVzdCByZXNldCBtQWN0aXZlIGluIGNhc2UgYSBzdG9wCisgICAgLy8gd2FzIHBlbmRpbmcgYW5kIGV4aXQKKyAgICBpZiAocmVjb3JkVHJhY2sgPT0gbVJlY29yZFRyYWNrLmdldCgpKSByZXR1cm4gTk9fRVJST1I7CiAKLSAgICBzcDxSZWNvcmRUcmFjaz4gdCA9IG1SZWNvcmRUcmFjay5wcm9tb3RlKCk7Ci0gICAgaWYgKHQgPT0gMCkgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgaWYgKG1SZWNvcmRUcmFjayAhPSAwKSByZXR1cm4gLUVCVVNZOworCisgICAgbVJlY29yZFRyYWNrID0gcmVjb3JkVHJhY2s7CiAKICAgICAvLyBzaWduYWwgdGhyZWFkIHRvIHN0YXJ0CiAgICAgTE9HVigiU2lnbmFsIHJlY29yZCB0aHJlYWQiKTsKLSAgICBtQWN0aXZlID0gdHJ1ZTsKICAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgbVdhaXRXb3JrQ1Yud2FpdChtTG9jayk7CisgICAgTE9HVigiUmVjb3JkIHN0YXJ0ZWQsIHN0YXR1cyAlZCIsIG1TdGFydFN0YXR1cyk7CisgICAgcmV0dXJuIG1TdGFydFN0YXR1czsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OkF1ZGlvUmVjb3JkVGhyZWFkOjpzdG9wKCkgewordm9pZCBBdWRpb0ZsaW5nZXI6OkF1ZGlvUmVjb3JkVGhyZWFkOjpzdG9wKFJlY29yZFRyYWNrKiByZWNvcmRUcmFjaykgewogICAgIExPR1YoIkF1ZGlvUmVjb3JkVGhyZWFkOjpzdG9wIik7CiAgICAgQXV0b011dGV4IGxvY2soJm1Mb2NrKTsKLSAgICBpZiAobUFjdGl2ZSkgeworICAgIGlmIChtQWN0aXZlICYmIChyZWNvcmRUcmFjayA9PSBtUmVjb3JkVHJhY2suZ2V0KCkpKSB7CiAgICAgICAgIG1BY3RpdmUgPSBmYWxzZTsKLSAgICAgICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7CiAgICAgfQogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6QXVkaW9SZWNvcmRUaHJlYWQ6OmV4aXQoKQogewogICAgIExPR1YoIkF1ZGlvUmVjb3JkVGhyZWFkOjpleGl0Iik7Ci0gICAgQXV0b011dGV4IGxvY2soJm1Mb2NrKTsKLSAgICByZXF1ZXN0RXhpdCgpOwotICAgIG1XYWl0V29ya0NWLnNpZ25hbCgpOworICAgIHsKKyAgICAgICAgQXV0b011dGV4IGxvY2soJm1Mb2NrKTsKKyAgICAgICAgcmVxdWVzdEV4aXQoKTsKKyAgICAgICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7CisgICAgfQorICAgIHJlcXVlc3RFeGl0QW5kV2FpdCgpOwogfQogCiAKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6QXVkaW9SZWNvcmRUaHJlYWQ6OmNsb3NlKCkKLXsKLSAgICBMT0dWKCJBdWRpb1JlY29yZFRocmVhZDo6Y2xvc2UiKTsKLSAgICBBdXRvTXV0ZXggbG9jaygmbUxvY2spOwotICAgIGlmICghbUlucHV0KSByZXR1cm4gTk9fSU5JVDsKLSAgICBkZWxldGUgbUlucHV0OwotICAgIG1JbnB1dCA9IDA7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Om9uVHJhbnNhY3QoCiAgICAgICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCiB7CmRpZmYgLS1naXQgYS9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaCBiL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCmluZGV4IDhjMDI2MTcuLmQ5ZjdiNDkgMTAwNjQ0Ci0tLSBhL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCisrKyBiL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCkBAIC00MywxMyArNDMsMTcgQEAKIGNsYXNzIEF1ZGlvTWl4ZXI7CiBjbGFzcyBBdWRpb0J1ZmZlcjsKIAorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICNkZWZpbmUgTElLRUxZKCBleHAgKSAgICAgICAoX19idWlsdGluX2V4cGVjdCggKGV4cCkgIT0gMCwgdHJ1ZSAgKSkKICNkZWZpbmUgVU5MSUtFTFkoIGV4cCApICAgICAoX19idWlsdGluX2V4cGVjdCggKGV4cCkgIT0gMCwgZmFsc2UgKSkKIAorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK3N0YXRpYyBjb25zdCBuc2Vjc190IGtTdGFuZGJ5VGltZUluTnNlY3MgPSBzZWNvbmRzKDMpOworCiBjbGFzcyBBdWRpb0ZsaW5nZXIgOiBwdWJsaWMgQm5BdWRpb0ZsaW5nZXIsIHByb3RlY3RlZCBUaHJlYWQKIHsKIHB1YmxpYzoKQEAgLTY5LDEzICs3MywxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmZmVyQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKTsKIAogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIHNhbXBsZVJhdGUoKSBjb25zdDsKICAgICB2aXJ0dWFsICAgICBpbnQgICAgICAgICBjaGFubmVsQ291bnQoKSBjb25zdDsKICAgICB2aXJ0dWFsICAgICBpbnQgICAgICAgICBmb3JtYXQoKSBjb25zdDsKICAgICB2aXJ0dWFsICAgICBzaXplX3QgICAgICBmcmFtZUNvdW50KCkgY29uc3Q7CisgICAgdmlydHVhbCAgICAgc2l6ZV90ICAgICAgbGF0ZW5jeSgpIGNvbnN0OwogCiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgc2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZhbHVlKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBzZXRNYXN0ZXJNdXRlKGJvb2wgbXV0ZWQpOwpAQCAtMTI4LDggKzEzNSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZmZXJDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpOwogCiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgb25UcmFuc2FjdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29kZSwKQEAgLTE0MSwxMiArMTQ5LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9GbGluZ2VyKCk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgfkF1ZGlvRmxpbmdlcigpOwogICAgIAorICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIHNldE91dHB1dChBdWRpb1N0cmVhbU91dCogb3V0cHV0KTsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICBnZXRPdXRwdXRGcmFtZUNvdW50KEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQpOworCiAgICAgLy8gSW50ZXJuYWwgZHVtcCB1dGlsaXRlcy4KICAgICBzdGF0dXNfdCBkdW1wUGVybWlzc2lvbkRlbmlhbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogICAgIHN0YXR1c190IGR1bXBDbGllbnRzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAgICAgc3RhdHVzX3QgZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogICAgIHN0YXR1c190IGR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKLSAgICAKKwogICAgIC8vIC0tLSBDbGllbnQgLS0tCiAgICAgY2xhc3MgQ2xpZW50IDogcHVibGljIFJlZkJhc2UgewogICAgIHB1YmxpYzoKQEAgLTE4MywxNyArMTk0LDE3IEBACiAgICAgICAgIH07CiAKICAgICAgICAgZW51bSB0cmFja19mbGFncyB7Ci0gICAgICAgICAgICBTVEVQU0VSVkVSX0ZBSUxFRCA9IDB4MDEgICAvLyAgU3RlcFNlcnZlciBjb3VsZCBub3QgYWNxdWlyZSBjYmxrLT5sb2NrIG11dGV4IAorICAgICAgICAgICAgU1RFUFNFUlZFUl9GQUlMRUQgPSAweDAxICAgLy8gIFN0ZXBTZXJ2ZXIgY291bGQgbm90IGFjcXVpcmUgY2Jsay0+bG9jayBtdXRleAogICAgICAgICB9OwotICAgICAgICAKKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrQmFzZSggIGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPENsaWVudD4mIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZmZlckNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+VHJhY2tCYXNlKCk7CiAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydCgpID0gMDsKQEAgLTIwMyw2ICsyMTQsNyBAQAogICAgIHByb3RlY3RlZDoKICAgICAgICAgZnJpZW5kIGNsYXNzIEF1ZGlvRmxpbmdlcjsKICAgICAgICAgZnJpZW5kIGNsYXNzIFJlY29yZEhhbmRsZTsKKyAgICAgICAgZnJpZW5kIGNsYXNzIEF1ZGlvUmVjb3JkVGhyZWFkOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tCYXNlKGNvbnN0IFRyYWNrQmFzZSYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrQmFzZSYgb3BlcmF0b3IgPSAoY29uc3QgVHJhY2tCYXNlJik7CkBAIC0yMjIsMTkgKzIzNCwxMSBAQAogICAgICAgICAgICAgcmV0dXJuIG1Gb3JtYXQ7CiAgICAgICAgIH0KIAotICAgICAgICBpbnQgY2hhbm5lbENvdW50KCkgY29uc3QgewotICAgICAgICAgICAgcmV0dXJuIG1DaGFubmVsQ291bnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgYnVmZmVyQ291bnQoKSBjb25zdCB7Ci0gICAgICAgICAgICByZXR1cm4gbUJ1ZmZlckNvdW50OwotICAgICAgICB9CisgICAgICAgIGludCBjaGFubmVsQ291bnQoKSBjb25zdCA7CiAKICAgICAgICAgaW50IHNhbXBsZVJhdGUoKSBjb25zdDsKIAotICAgICAgICB2b2lkKiBnZXRCdWZmZXIoaW50IG4pIGNvbnN0IHsKLSAgICAgICAgICAgIHJldHVybiAoY2hhciopbUJ1ZmZlcnMgKyBuICogbUJ1ZmZlclNpemU7Ci0gICAgICAgIH0KKyAgICAgICAgdm9pZCogZ2V0QnVmZmVyKHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgZnJhbWVzKSBjb25zdDsKIAogICAgICAgICBpbnQgbmFtZSgpIGNvbnN0IHsKICAgICAgICAgICAgIHJldHVybiBtTmFtZTsKQEAgLTI1NiwxNiArMjYwLDE1IEBACiAgICAgICAgIHNwPElNZW1vcnk+ICAgICAgICAgbUNibGtNZW1vcnk7CiAgICAgICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogbUNibGs7CiAgICAgICAgIGludCAgICAgICAgICAgICAgICAgbVN0cmVhbVR5cGU7Ci0gICAgICAgIHVpbnQ4X3QgICAgICAgICAgICAgbUZvcm1hdDsKLSAgICAgICAgdWludDhfdCAgICAgICAgICAgICBtQ2hhbm5lbENvdW50OwotICAgICAgICB1aW50OF90ICAgICAgICAgICAgIG1CdWZmZXJDb3VudDsKLSAgICAgICAgdWludDhfdCAgICAgICAgICAgICBtRmxhZ3M7Ci0gICAgICAgIHZvaWQqICAgICAgICAgICAgICAgbUJ1ZmZlcnM7Ci0gICAgICAgIHNpemVfdCAgICAgICAgICAgICAgbUJ1ZmZlclNpemU7CisgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgbUJ1ZmZlcjsKKyAgICAgICAgdm9pZCogICAgICAgICAgICAgICBtQnVmZmVyRW5kOworICAgICAgICB1aW50MzJfdCAgICAgICAgICAgIG1GcmFtZUNvdW50OwogICAgICAgICBpbnQgICAgICAgICAgICAgICAgIG1OYW1lOwogICAgICAgICAvLyB3ZSBkb24ndCByZWFsbHkgbmVlZCBhIGxvY2sgZm9yIHRoZXNlCiAgICAgICAgIGludCAgICAgICAgICAgICAgICAgbVN0YXRlOwogICAgICAgICBpbnQgICAgICAgICAgICAgICAgIG1DbGllbnRUaWQ7CisgICAgICAgIHVpbnQ4X3QgICAgICAgICAgICAgbUZvcm1hdDsKKyAgICAgICAgdWludDhfdCAgICAgICAgICAgICBtRmxhZ3M7CiAgICAgfTsKIAogICAgIC8vIHBsYXliYWNrIHRyYWNrCkBAIC0yNzcsOCArMjgwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZmZXJDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgflRyYWNrKCk7CiAKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOwpAQCAtMzEyLDcgKzMxNSw3IEBACiAgICAgICAgICAgICByZXR1cm4gbVN0YXRlID09IFBBVVNFRDsKICAgICAgICAgfQogCi0gICAgICAgIGJvb2wgaXNSZWFkeSh1aW50MzJfdCB1LCBpbnQzMl90IHMpIGNvbnN0OworICAgICAgICBib29sIGlzUmVhZHkoKSBjb25zdDsKIAogICAgICAgICB2b2lkIHNldFBhdXNlZCgpIHsgbVN0YXRlID0gUEFVU0VEOyB9CiAgICAgICAgIHZvaWQgcmVzZXQoKTsKQEAgLTMyNCw2ICszMjcsOCBAQAogICAgICAgICBlbnVtIHtGU19GSUxMSU5HLCBGU19GSUxMRUQsIEZTX0FDVElWRX07CiAgICAgICAgIG11dGFibGUgdWludDhfdCAgICAgbUZpbGxpbmdVcFN0YXR1czsKICAgICAgICAgaW50OF90ICAgICAgICAgICAgICBtUmV0cnlDb3VudDsKKyAgICAgICAgc3A8SU1lbW9yeT4gICAgICAgICBtU2hhcmVkQnVmZmVyOworICAgICAgICBib29sICAgICAgICAgICAgICAgIG1SZXNldERvbmU7CiAgICAgfTsgIC8vIGVuZCBvZiBUcmFjawogCiAgICAgZnJpZW5kIGNsYXNzIEF1ZGlvQnVmZmVyOwpAQCAtMzY2LDggKzM3MSw4IEBACiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcmVtb3ZlX3RyYWNrX2wod3A8VHJhY2s+IHRyYWNrLCBpbnQgbmFtZSk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZGVzdHJveVRyYWNrKGNvbnN0IHNwPFRyYWNrPiYgdHJhY2spOwogCi0gICAgICAgICAgICAgICAgQXVkaW9NaXhlciYgYXVkaW9NaXhlcigpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICptQXVkaW9NaXhlcjsKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyKiBhdWRpb01peGVyKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUF1ZGlvTWl4ZXI7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgLy8gcmVjb3JkIHRyYWNrCkBAIC0zNzksOCArMzg0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZmZXJDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+UmVjb3JkVHJhY2soKTsKIAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHN0YXJ0KCk7CkBAIC00MTksNDMgKzQyMywzNCBAQAogICAgIGNsYXNzIEF1ZGlvUmVjb3JkVGhyZWFkIDogcHVibGljIFRocmVhZAogICAgIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIEF1ZGlvUmVjb3JkVGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlcik7CisgICAgICAgIEF1ZGlvUmVjb3JkVGhyZWFkKEF1ZGlvSGFyZHdhcmVJbnRlcmZhY2UqIGF1ZGlvSGFyZHdhcmUpOwogICAgICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5BdWRpb1JlY29yZFRocmVhZCgpOwogICAgICAgICB2aXJ0dWFsIGJvb2wgICAgICAgIHRocmVhZExvb3AoKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICByZWFkeVRvUnVuKCkgeyByZXR1cm4gTk9fRVJST1I7IH0KICAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICBvbkZpcnN0UmVmKCkge30KIAotICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIG9wZW4oY29uc3Qgc3A8UmVjb3JkVHJhY2s+JiByZWNvcmRUcmFjaywgQXVkaW9TdHJlYW1JbiAqaW5wdXQpOwotICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc3RvcCgpOwotICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIGNsb3NlKCk7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc3RhcnQoUmVjb3JkVHJhY2sqIHJlY29yZFRyYWNrKTsKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzdG9wKFJlY29yZFRyYWNrKiByZWNvcmRUcmFjayk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZXhpdCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzT3BlbigpIHsgcmV0dXJuIGJvb2wobVJlY29yZFRyYWNrICE9IE5VTEwpOyB9CiAKICAgICBwcml2YXRlOgogICAgICAgICAgICAgICAgIEF1ZGlvUmVjb3JkVGhyZWFkKCk7Ci0gICAgICAgICAgICAgICAgc3A8QXVkaW9GbGluZ2VyPiAgICAgICAgICAgICAgICAgICAgbUF1ZGlvRmxpbmdlcjsKLSAgICAgICAgICAgICAgICB3cDxSZWNvcmRUcmFjaz4gICAgICAgICAgICAgICAgICAgICBtUmVjb3JkVHJhY2s7Ci0gICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1JbiogICAgICAgICAgICAgICAgICAgICAgbUlucHV0OworICAgICAgICAgICAgICAgIEF1ZGlvSGFyZHdhcmVJbnRlcmZhY2UgICAgICAgICAgICAgICptQXVkaW9IYXJkd2FyZTsKKyAgICAgICAgICAgICAgICBzcDxSZWNvcmRUcmFjaz4gICAgICAgICAgICAgICAgICAgICBtUmVjb3JkVHJhY2s7CiAgICAgICAgICAgICAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7CiAgICAgICAgICAgICAgICAgQ29uZGl0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdhaXRXb3JrQ1Y7Ci0gICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyICAgICAgICAgbUJ1ZmZlcjsKICAgICAgICAgICAgICAgICB2b2xhdGlsZSBib29sICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZlOworICAgICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydFN0YXR1czsKICAgICB9OwogCiAgICAgZnJpZW5kIGNsYXNzIEF1ZGlvUmVjb3JkVGhyZWFkOwogCi0gICAgICAgICAgICAgICAgc3A8QXVkaW9SZWNvcmRUaHJlYWQ+IGF1ZGlvUmVjb3JkVGhyZWFkKCk7Ci0gICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZW5kUmVjb3JkKCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc3RhcnRSZWNvcmQoKTsKLSAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzdG9wUmVjb3JkKCk7Ci0gICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZXhpdFJlY29yZCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEF1ZGlvSGFyZHdhcmVJbnRlcmZhY2UqIGF1ZGlvSGFyZHdhcmUoKSB7IHJldHVybiBtQXVkaW9IYXJkd2FyZTsgfQorICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHN0YXJ0UmVjb3JkKFJlY29yZFRyYWNrKiByZWNvcmRUcmFjayk7CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc3RvcFJlY29yZChSZWNvcmRUcmFjayogcmVjb3JkVHJhY2spOwogCiAgICAgbXV0YWJsZSAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGFyZHdhcmVMb2NrOwogICAgIG11dGFibGUgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7CisgICAgbXV0YWJsZSAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0TG9jazsKICAgICBtdXRhYmxlICAgICBDb25kaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XYWl0V29ya0NWOwogICAgICAgICAgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjwgcGlkX3QsIHdwPENsaWVudD4gPiAgICAgbUNsaWVudHM7CiAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPCB3cDxUcmFjaz4gPiAgICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2tzOwpAQCAtNDY1LDE1ICs0NjAsMTkgQEAKICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWFzdGVyTXV0ZTsKICAgICAgICAgICAgICAgICBzdHJlYW1fdHlwZV90ICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZXNbQXVkaW9UcmFjazo6TlVNX1NUUkVBTV9UWVBFU107CiAKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyKiAgICAgICAgICAgICAgICAgICAgICAgICBtSGFyZHdhcmVBdWRpb01peGVyOworICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXIqICAgICAgICAgICAgICAgICAgICAgICAgIG1BMmRwQXVkaW9NaXhlcjsKICAgICAgICAgICAgICAgICBBdWRpb01peGVyKiAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhlcjsKICAgICAgICAgICAgICAgICBBdWRpb0hhcmR3YXJlSW50ZXJmYWNlKiAgICAgICAgICAgICBtQXVkaW9IYXJkd2FyZTsKKyAgICAgICAgICAgICAgICBBdWRpb0hhcmR3YXJlSW50ZXJmYWNlKiAgICAgICAgICAgICBtQTJkcEF1ZGlvSW50ZXJmYWNlOworICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtT3V0KiAgICAgICAgICAgICAgICAgICAgIG1IYXJkd2FyZU91dHB1dDsKKyAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbU91dCogICAgICAgICAgICAgICAgICAgICBtQTJkcE91dHB1dDsKICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbU91dCogICAgICAgICAgICAgICAgICAgICBtT3V0cHV0OwogICAgICAgICAgICAgICAgIHNwPEF1ZGlvUmVjb3JkVGhyZWFkPiAgICAgICAgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZDsKICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZTsKICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudDsKICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhbm5lbENvdW50OwogICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQ7Ci0gICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1peEJ1ZmZlclNpemU7CiAgICAgICAgICAgICAgICAgaW50MTZfdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1peEJ1ZmZlcjsKICAgICBtdXRhYmxlICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGFyZHdhcmVTdGF0dXM7CiAgICAgICAgICAgICAgICAgbnNlY3NfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RXcml0ZVRpbWU7CmRpZmYgLS1naXQgYS9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb0hhcmR3YXJlR2VuZXJpYy5jcHAgYi9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb0hhcmR3YXJlR2VuZXJpYy5jcHAKaW5kZXggYjFlNWI3Zi4uZTZhMTYzYiAxMDA2NDQKLS0tIGEvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9IYXJkd2FyZUdlbmVyaWMuY3BwCisrKyBiL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvSGFyZHdhcmVHZW5lcmljLmNwcApAQCAtMiwxNiArMiwxNiBAQAogKioKICoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAqKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogCkBAIC02OCwxNiArNjgsMjUgQEAKIH0KIAogQXVkaW9TdHJlYW1PdXQqIEF1ZGlvSGFyZHdhcmVHZW5lcmljOjpvcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICBpbnQgZm9ybWF0LCBpbnQgY2hhbm5lbENvdW50LCB1aW50MzJfdCBzYW1wbGVSYXRlKQorICAgICAgICBpbnQgZm9ybWF0LCBpbnQgY2hhbm5lbENvdW50LCB1aW50MzJfdCBzYW1wbGVSYXRlLCBzdGF0dXNfdCAqc3RhdHVzKQogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKIAogICAgIC8vIG9ubHkgb25lIG91dHB1dCBzdHJlYW0gYWxsb3dlZAotICAgIGlmIChtT3V0cHV0KSByZXR1cm4gMDsKKyAgICBpZiAobU91dHB1dCkgeworICAgICAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgICAgICAqc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCiAgICAgLy8gY3JlYXRlIG5ldyBvdXRwdXQgc3RyZWFtCiAgICAgQXVkaW9TdHJlYW1PdXRHZW5lcmljKiBvdXQgPSBuZXcgQXVkaW9TdHJlYW1PdXRHZW5lcmljKCk7Ci0gICAgaWYgKG91dC0+c2V0KHRoaXMsIG1GZCwgZm9ybWF0LCBjaGFubmVsQ291bnQsIHNhbXBsZVJhdGUpID09IE5PX0VSUk9SKSB7CisgICAgc3RhdHVzX3QgbFN0YXR1cyA9IG91dC0+c2V0KHRoaXMsIG1GZCwgZm9ybWF0LCBjaGFubmVsQ291bnQsIHNhbXBsZVJhdGUpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgKnN0YXR1cyA9IGxTdGF0dXM7CisgICAgfQorICAgIGlmIChsU3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgIG1PdXRwdXQgPSBvdXQ7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZGVsZXRlIG91dDsKQEAgLTkwLDE2ICs5OSwyNSBAQAogfQogCiBBdWRpb1N0cmVhbUluKiBBdWRpb0hhcmR3YXJlR2VuZXJpYzo6b3BlbklucHV0U3RyZWFtKAotICAgICAgICBpbnQgZm9ybWF0LCBpbnQgY2hhbm5lbENvdW50LCB1aW50MzJfdCBzYW1wbGVSYXRlKQorICAgICAgICBpbnQgZm9ybWF0LCBpbnQgY2hhbm5lbENvdW50LCB1aW50MzJfdCBzYW1wbGVSYXRlLCBzdGF0dXNfdCAqc3RhdHVzKQogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKIAogICAgIC8vIG9ubHkgb25lIGlucHV0IHN0cmVhbSBhbGxvd2VkCi0gICAgaWYgKG1JbnB1dCkgcmV0dXJuIDA7CisgICAgaWYgKG1JbnB1dCkgeworICAgICAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgICAgICAqc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCiAgICAgLy8gY3JlYXRlIG5ldyBvdXRwdXQgc3RyZWFtCiAgICAgQXVkaW9TdHJlYW1JbkdlbmVyaWMqIGluID0gbmV3IEF1ZGlvU3RyZWFtSW5HZW5lcmljKCk7Ci0gICAgaWYgKGluLT5zZXQodGhpcywgbUZkLCBmb3JtYXQsIGNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSkgPT0gTk9fRVJST1IpIHsKKyAgICBzdGF0dXNfdCBsU3RhdHVzID0gaW4tPnNldCh0aGlzLCBtRmQsIGZvcm1hdCwgY2hhbm5lbENvdW50LCBzYW1wbGVSYXRlKTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgICpzdGF0dXMgPSBsU3RhdHVzOworICAgIH0KKyAgICBpZiAobFN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICBtSW5wdXQgPSBpbjsKICAgICB9IGVsc2UgewogICAgICAgICBkZWxldGUgaW47CmRpZmYgLS1naXQgYS9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb0hhcmR3YXJlR2VuZXJpYy5oIGIvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9IYXJkd2FyZUdlbmVyaWMuaAppbmRleCAxMGNjNDVkLi5hMjM0MmNkIDEwMDY0NAotLS0gYS9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb0hhcmR3YXJlR2VuZXJpYy5oCisrKyBiL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvSGFyZHdhcmVHZW5lcmljLmgKQEAgLTIsMTYgKzIsMTYgQEAKICoqCiAqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KIApAQCAtMjMsNyArMjMsNyBAQAogCiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogCi0jaW5jbHVkZSA8aGFyZHdhcmUvQXVkaW9IYXJkd2FyZUludGVyZmFjZS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL0F1ZGlvSGFyZHdhcmVCYXNlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDcsNiArNDcsNyBAQAogICAgIHZpcnR1YWwgc2l6ZV90ICAgICAgYnVmZmVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIDQwOTY7IH0KICAgICB2aXJ0dWFsIGludCAgICAgICAgIGNoYW5uZWxDb3VudCgpIGNvbnN0IHsgcmV0dXJuIDI7IH0KICAgICB2aXJ0dWFsIGludCAgICAgICAgIGZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUOyB9CisgICAgdmlydHVhbCB1aW50MzJfdCAgICBsYXRlbmN5KCkgY29uc3QgeyByZXR1cm4gMDsgfQogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSkgeyByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047IH0KICAgICB2aXJ0dWFsIHNzaXplX3QgICAgIHdyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGJ5dGVzKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKQEAgLTc2LDYgKzc3LDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldEdhaW4oZmxvYXQgZ2FpbikgeyByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047IH0KICAgICB2aXJ0dWFsIHNzaXplX3QgICAgIHJlYWQodm9pZCogYnVmZmVyLCBzc2l6ZV90IGJ5dGVzKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHN0YW5kYnkoKSB7IHJldHVybiBOT19FUlJPUjsgfQogCiBwcml2YXRlOgogICAgIEF1ZGlvSGFyZHdhcmVHZW5lcmljICptQXVkaW9IYXJkd2FyZTsKQEAgLTg0LDcgKzg2LDcgQEAKIH07CiAKIAotY2xhc3MgQXVkaW9IYXJkd2FyZUdlbmVyaWMgOiBwdWJsaWMgIEF1ZGlvSGFyZHdhcmVJbnRlcmZhY2UKK2NsYXNzIEF1ZGlvSGFyZHdhcmVHZW5lcmljIDogcHVibGljIEF1ZGlvSGFyZHdhcmVCYXNlCiB7CiBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0hhcmR3YXJlR2VuZXJpYygpOwpAQCAtMTA1LDEyICsxMDcsMTQgQEAKICAgICB2aXJ0dWFsIEF1ZGlvU3RyZWFtT3V0KiBvcGVuT3V0cHV0U3RyZWFtKAogICAgICAgICAgICAgaW50IGZvcm1hdD0wLAogICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudD0wLAotICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZT0wKTsKKyAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGU9MCwKKyAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXM9MCk7CiAKICAgICB2aXJ0dWFsIEF1ZGlvU3RyZWFtSW4qIG9wZW5JbnB1dFN0cmVhbSgKICAgICAgICAgICAgIGludCBmb3JtYXQsCiAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAotICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSk7CisgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyk7CiAKICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBjbG9zZU91dHB1dFN0cmVhbShBdWRpb1N0cmVhbU91dEdlbmVyaWMqIG91dCk7CiAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgY2xvc2VJbnB1dFN0cmVhbShBdWRpb1N0cmVhbUluR2VuZXJpYyogaW4pOwpAQCAtMTIwLDcgKzEyNCw3IEBACiAKIHByaXZhdGU6CiAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwotICAgIAorCiAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgbUxvY2s7CiAgICAgQXVkaW9TdHJlYW1PdXRHZW5lcmljICAgKm1PdXRwdXQ7CiAgICAgQXVkaW9TdHJlYW1JbkdlbmVyaWMgICAgKm1JbnB1dDsKZGlmZiAtLWdpdCBhL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvSGFyZHdhcmVJbnRlcmZhY2UuY3BwIGIvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9IYXJkd2FyZUludGVyZmFjZS5jcHAKaW5kZXggNzM4N2IzZC4uYWM3NmExOSAxMDA2NDQKLS0tIGEvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9IYXJkd2FyZUludGVyZmFjZS5jcHAKKysrIGIvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9IYXJkd2FyZUludGVyZmFjZS5jcHAKQEAgLTI2LDcgKzI2LDcgQEAKICNpbmNsdWRlICJBdWRpb0hhcmR3YXJlU3R1Yi5oIgogI2luY2x1ZGUgIkF1ZGlvSGFyZHdhcmVHZW5lcmljLmgiCiAKLS8vICNkZWZpbmUgRFVNUF9GTElOR0VSX09VVCAgICAgICAgLy8gaWYgZGVmaW5lZCBhbGxvd3MgcmVjb3JkaW5nIHNhbXBsZXMgaW4gYSBmaWxlCisvLyNkZWZpbmUgRFVNUF9GTElOR0VSX09VVCAgICAgICAgLy8gaWYgZGVmaW5lZCBhbGxvd3MgcmVjb3JkaW5nIHNhbXBsZXMgaW4gYSBmaWxlCiAjaWZkZWYgRFVNUF9GTElOR0VSX09VVAogI2luY2x1ZGUgIkF1ZGlvRHVtcEludGVyZmFjZS5oIgogI2VuZGlmCkBAIC01NCw2ICs1NCw3IEBACiAgICAgIlNQRUFLRVIgIiwKICAgICAiQkxVRVRPT1RIICIsCiAgICAgIkhFQURTRVQgIgorICAgICJCTFVFVE9PVEhfQTJEUCAiCiB9Owogc3RhdGljIGNvbnN0IGNoYXIqIHJvdXRlTm9uZSA9ICJOT05FIjsKIApAQCAtMTE1LDI0ICsxMTYsMTAgQEAKICAgICAvLyBUaGlzIGNvZGUgYWRkcyBhIHJlY29yZCBvZiBidWZmZXJzIGluIGEgZmlsZSB0byB3cml0ZSBjYWxscyBtYWRlIGJ5IEF1ZGlvRmxpbmdlci4KICAgICAvLyBJdCByZXBsYWNlcyB0aGUgY3VycmVudCBBdWRpb0hhcmR3YXJlSW50ZXJmYWNlIG9iamVjdCBieSBhbiBpbnRlcm1lZGlhdGUgb25lIHdoaWNoCiAgICAgLy8gd2lsbCByZWNvcmQgYnVmZmVycyBpbiBhIGZpbGUgKGFmdGVyIHNlbmRpbmcgdGhlbSB0byBoYXJkd2FyZSkgZm9yIHRlc3RpbmcgcHVycG9zZS4KLSAgICAvLyBUaGlzIGZlYXR1cmUgaXMgZW5hYmxlZCBieSBkZWZpbmluZyBzeW1ib2wgRFVNUF9GTElOR0VSX09VVCBhbmQgc2V0dGluZyBlbnZpcm9uZW1lbnQKLSAgICAvLyAiYXVkaW9mbGluZ2VyLmR1bXAgPSAxIi4gVGhlIG91dHB1dCBmaWxlIGlzICJ0bXAvRmxpbmdlck91dC5wY20iLiBQYXVzZSBhcmUgbm90IHJlY29yZGVkCi0gICAgLy8gaW4gdGhlIGZpbGUuCisgICAgLy8gVGhpcyBmZWF0dXJlIGlzIGVuYWJsZWQgYnkgZGVmaW5pbmcgc3ltYm9sIERVTVBfRkxJTkdFUl9PVVQuCisgICAgLy8gVGhlIG91dHB1dCBmaWxlIGlzIEZMSU5HRVJfRFVNUF9OQU1FLiBQYXVzZSBhcmUgbm90IHJlY29yZGVkIGluIHRoZSBmaWxlLgogICAgIAotICAgIC8vIHJlYWQgZHVtcCBtb2RlCi0gICAgcHJvcGVydHlfZ2V0KCJhdWRpb2ZsaW5nZXIuZHVtcCIsIHZhbHVlLCAiMCIpOwotICAgIHN3aXRjaCh2YWx1ZVswXSkgewotICAgIGNhc2UgJzEnOgotICAgICAgICBMT0dWKCJEdW1wIG1vZGUiKTsKLSAgICAgICAgaHcgPSBuZXcgQXVkaW9EdW1wSW50ZXJmYWNlKGh3KTsgICAgLy8gcmVwbGFjZSBpbnRlcmZhY2UKLSAgICAgICAgcmV0dXJuIGh3OwotICAgICAgICBicmVhazsKLSAgICBjYXNlICcwJzoKLSAgICBkZWZhdWx0OgotICAgICAgICBMT0dWKCJObyBEdW1wIG1vZGUiKTsKLSAgICAgICAgcmV0dXJuIGh3OwotICAgICAgICBicmVhazsKLSAgICB9CisgICAgaHcgPSBuZXcgQXVkaW9EdW1wSW50ZXJmYWNlKGh3KTsgICAgLy8gcmVwbGFjZSBpbnRlcmZhY2UKICNlbmRpZgogICAgIHJldHVybiBodzsKIH0KQEAgLTE0Myw3ICsxMzAsNyBAQAogCiBBdWRpb1N0cmVhbUluOjp+QXVkaW9TdHJlYW1JbigpIHt9CiAKLUF1ZGlvSGFyZHdhcmVJbnRlcmZhY2U6OkF1ZGlvSGFyZHdhcmVJbnRlcmZhY2UoKQorQXVkaW9IYXJkd2FyZUJhc2U6OkF1ZGlvSGFyZHdhcmVCYXNlKCkKIHsKICAgICAvLyBmb3JjZSBhIHJvdXRpbmcgdXBkYXRlIG9uIGluaXRpYWxpemF0aW9uCiAgICAgbWVtc2V0KCZtUm91dGVzLCAwLCBzaXplb2YobVJvdXRlcykpOwpAQCAtMTUxLDcgKzEzOCw3IEBACiB9CiAKIC8vIGdlbmVyaWNzIGZvciBhdWRpbyByb3V0aW5nIC0gdGhlIHJlYWwgd29yayBpcyBkb25lIGluIGRvUm91dGluZwotc3RhdHVzX3QgQXVkaW9IYXJkd2FyZUludGVyZmFjZTo6c2V0Um91dGluZyhpbnQgbW9kZSwgdWludDMyX3Qgcm91dGVzKQorc3RhdHVzX3QgQXVkaW9IYXJkd2FyZUJhc2U6OnNldFJvdXRpbmcoaW50IG1vZGUsIHVpbnQzMl90IHJvdXRlcykKIHsKICNpZiBMT0dfUk9VVElOR19DQUxMUwogICAgIExPR0QoInNldFJvdXRpbmc6IG1vZGU9JXMsIHJvdXRlcz1bJXNdIiwgZGlzcGxheU1vZGUobW9kZSksIGRpc3BsYXlSb3V0ZXMocm91dGVzKSk7CkBAIC0xNzMsNyArMTYwLDcgQEAKICAgICByZXR1cm4gZG9Sb3V0aW5nKCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvSGFyZHdhcmVJbnRlcmZhY2U6OmdldFJvdXRpbmcoaW50IG1vZGUsIHVpbnQzMl90KiByb3V0ZXMpCitzdGF0dXNfdCBBdWRpb0hhcmR3YXJlQmFzZTo6Z2V0Um91dGluZyhpbnQgbW9kZSwgdWludDMyX3QqIHJvdXRlcykKIHsKICAgICBpZiAobW9kZSA9PSBBdWRpb1N5c3RlbTo6TU9ERV9DVVJSRU5UKQogICAgICAgICBtb2RlID0gbU1vZGU7CkBAIC0xODcsNyArMTc0LDcgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvSGFyZHdhcmVJbnRlcmZhY2U6OnNldE1vZGUoaW50IG1vZGUpCitzdGF0dXNfdCBBdWRpb0hhcmR3YXJlQmFzZTo6c2V0TW9kZShpbnQgbW9kZSkKIHsKICNpZiBMT0dfUk9VVElOR19DQUxMUwogICAgIExPR0QoInNldE1vZGUoJXMpIiwgZGlzcGxheU1vZGUobW9kZSkpOwpAQCAtMjA0LDI1ICsxOTEsNDUgQEAKICAgICByZXR1cm4gZG9Sb3V0aW5nKCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvSGFyZHdhcmVJbnRlcmZhY2U6OmdldE1vZGUoaW50KiBtb2RlKQorc3RhdHVzX3QgQXVkaW9IYXJkd2FyZUJhc2U6OmdldE1vZGUoaW50KiBtb2RlKQogewogICAgIC8vIEltcGxlbWVudDogc2V0IGF1ZGlvIHJvdXRpbmcKICAgICAqbW9kZSA9IG1Nb2RlOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgQXVkaW9IYXJkd2FyZUludGVyZmFjZTo6c2V0UGFyYW1ldGVyKGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogdmFsdWUpCitzdGF0dXNfdCBBdWRpb0hhcmR3YXJlQmFzZTo6c2V0UGFyYW1ldGVyKGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogdmFsdWUpCiB7CiAgICAgLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyB0byBpZ25vcmUKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvSGFyZHdhcmVJbnRlcmZhY2U6OmR1bXBTdGF0ZShpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCisKKy8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KK3NpemVfdCBBdWRpb0hhcmR3YXJlQmFzZTo6Z2V0SW5wdXRCdWZmZXJTaXplKHVpbnQzMl90IHNhbXBsZVJhdGUsIGludCBmb3JtYXQsIGludCBjaGFubmVsQ291bnQpCit7CisgICAgaWYgKHNhbXBsZVJhdGUgIT0gODAwMCkgeworICAgICAgICBMT0dXKCJnZXRJbnB1dEJ1ZmZlclNpemUgYmFkIHNhbXBsaW5nIHJhdGU6ICVkIiwgc2FtcGxlUmF0ZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoZm9ybWF0ICE9IEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUKSB7CisgICAgICAgIExPR1coImdldElucHV0QnVmZmVyU2l6ZSBiYWQgZm9ybWF0OiAlZCIsIGZvcm1hdCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoY2hhbm5lbENvdW50ICE9IDEpIHsKKyAgICAgICAgTE9HVygiZ2V0SW5wdXRCdWZmZXJTaXplIGJhZCBjaGFubmVsIGNvdW50OiAlZCIsIGNoYW5uZWxDb3VudCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiAzMjA7Cit9CisKK3N0YXR1c190IEF1ZGlvSGFyZHdhcmVCYXNlOjpkdW1wU3RhdGUoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQogewogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkF1ZGlvSGFyZHdhcmVJbnRlcmZhY2U6OmR1bXBTdGF0ZVxuIik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQXVkaW9IYXJkd2FyZUJhc2U6OmR1bXBTdGF0ZVxuIik7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0bU1vZGU6ICVkXG4iLCBtTW9kZSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwpkaWZmIC0tZ2l0IGEvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9IYXJkd2FyZVN0dWIuY3BwIGIvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9IYXJkd2FyZVN0dWIuY3BwCmluZGV4IDAwNDZkYjguLmQzMDk5MDIgMTAwNjQ0Ci0tLSBhL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvSGFyZHdhcmVTdHViLmNwcAorKysgYi9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb0hhcmR3YXJlU3R1Yi5jcHAKQEAgLTIsMTYgKzIsMTYgQEAKICoqCiAqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KIApAQCAtNDcsMjAgKzQ3LDI4IEBACiB9CiAKIEF1ZGlvU3RyZWFtT3V0KiBBdWRpb0hhcmR3YXJlU3R1Yjo6b3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgaW50IGZvcm1hdCwgaW50IGNoYW5uZWxDb3VudCwgdWludDMyX3Qgc2FtcGxlUmF0ZSkKKyAgICAgICAgaW50IGZvcm1hdCwgaW50IGNoYW5uZWxDb3VudCwgdWludDMyX3Qgc2FtcGxlUmF0ZSwgc3RhdHVzX3QgKnN0YXR1cykKIHsKICAgICBBdWRpb1N0cmVhbU91dFN0dWIqIG91dCA9IG5ldyBBdWRpb1N0cmVhbU91dFN0dWIoKTsKLSAgICBpZiAob3V0LT5zZXQoZm9ybWF0LCBjaGFubmVsQ291bnQsIHNhbXBsZVJhdGUpID09IE5PX0VSUk9SKQorICAgIHN0YXR1c190IGxTdGF0dXMgPSBvdXQtPnNldChmb3JtYXQsIGNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICAqc3RhdHVzID0gbFN0YXR1czsKKyAgICB9CisgICAgaWYgKGxTdGF0dXMgPT0gTk9fRVJST1IpCiAgICAgICAgIHJldHVybiBvdXQ7CiAgICAgZGVsZXRlIG91dDsKICAgICByZXR1cm4gMDsKIH0KIAogQXVkaW9TdHJlYW1JbiogQXVkaW9IYXJkd2FyZVN0dWI6Om9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgaW50IGZvcm1hdCwgaW50IGNoYW5uZWxDb3VudCwgdWludDMyX3Qgc2FtcGxlUmF0ZSkKKyAgICAgICAgaW50IGZvcm1hdCwgaW50IGNoYW5uZWxDb3VudCwgdWludDMyX3Qgc2FtcGxlUmF0ZSwgc3RhdHVzX3QgKnN0YXR1cykKIHsKICAgICBBdWRpb1N0cmVhbUluU3R1YiogaW4gPSBuZXcgQXVkaW9TdHJlYW1JblN0dWIoKTsKLSAgICBpZiAoaW4tPnNldChmb3JtYXQsIGNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSkgPT0gTk9fRVJST1IpCisgICAgc3RhdHVzX3QgbFN0YXR1cyA9IGluLT5zZXQoZm9ybWF0LCBjaGFubmVsQ291bnQsIHNhbXBsZVJhdGUpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgKnN0YXR1cyA9IGxTdGF0dXM7CisgICAgfQorICAgIGlmIChsU3RhdHVzID09IE5PX0VSUk9SKQogICAgICAgICByZXR1cm4gaW47CiAgICAgZGVsZXRlIGluOwogICAgIHJldHVybiAwOwpAQCAtMTAyLDcgKzExMCw3IEBACiAgICAgaWYgKGZvcm1hdCA9PSAwKSBmb3JtYXQgPSBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVDsKICAgICBpZiAoY2hhbm5lbHMgPT0gMCkgY2hhbm5lbHMgPSBjaGFubmVsQ291bnQoKTsKICAgICBpZiAocmF0ZSA9PSAwKSByYXRlID0gc2FtcGxlUmF0ZSgpOwotICAgIAorCiAgICAgaWYgKChmb3JtYXQgPT0gQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQpICYmCiAgICAgICAgICAgICAoY2hhbm5lbHMgPT0gY2hhbm5lbENvdW50KCkpICYmCiAgICAgICAgICAgICAocmF0ZSA9PSBzYW1wbGVSYXRlKCkpKQpAQCAtMTI5LDcgKzEzNyw3IEBACiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRmb3JtYXQ6ICVkXG4iLCBmb3JtYXQoKSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIDo6d3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOyAKKyAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvSGFyZHdhcmVTdHViLmggYi9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb0hhcmR3YXJlU3R1Yi5oCmluZGV4IDFhNjE1NTIuLjUzMTZkNjAgMTAwNjQ0Ci0tLSBhL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvSGFyZHdhcmVTdHViLmgKKysrIGIvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9IYXJkd2FyZVN0dWIuaApAQCAtMiwxNiArMiwxNiBAQAogKioKICoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAqKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKLSNpbmNsdWRlIDxoYXJkd2FyZS9BdWRpb0hhcmR3YXJlSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvQXVkaW9IYXJkd2FyZUJhc2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zNCw2ICszNCw3IEBACiAgICAgdmlydHVhbCBzaXplX3QgICAgICBidWZmZXJTaXplKCkgY29uc3QgeyByZXR1cm4gNDA5NjsgfQogICAgIHZpcnR1YWwgaW50ICAgICAgICAgY2hhbm5lbENvdW50KCkgY29uc3QgeyByZXR1cm4gMjsgfQogICAgIHZpcnR1YWwgaW50ICAgICAgICAgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQ7IH0KKyAgICB2aXJ0dWFsIHVpbnQzMl90ICAgIGxhdGVuY3koKSBjb25zdCB7IHJldHVybiAwOyB9CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lKSB7IHJldHVybiBOT19FUlJPUjsgfQogICAgIHZpcnR1YWwgc3NpemVfdCAgICAgd3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3QgYnl0ZXMpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwpAQCAtNDksOSArNTAsMTAgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldEdhaW4oZmxvYXQgZ2FpbikgeyByZXR1cm4gTk9fRVJST1I7IH0KICAgICB2aXJ0dWFsIHNzaXplX3QgICAgIHJlYWQodm9pZCogYnVmZmVyLCBzc2l6ZV90IGJ5dGVzKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHN0YW5kYnkoKSB7IHJldHVybiBOT19FUlJPUjsgfQogfTsKIAotY2xhc3MgQXVkaW9IYXJkd2FyZVN0dWIgOiBwdWJsaWMgIEF1ZGlvSGFyZHdhcmVJbnRlcmZhY2UKK2NsYXNzIEF1ZGlvSGFyZHdhcmVTdHViIDogcHVibGljICBBdWRpb0hhcmR3YXJlQmFzZQogewogcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9IYXJkd2FyZVN0dWIoKTsKQEAgLTcyLDEyICs3NCwxNCBAQAogICAgIHZpcnR1YWwgQXVkaW9TdHJlYW1PdXQqIG9wZW5PdXRwdXRTdHJlYW0oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQ9MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudD0wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlPTApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlPTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXM9MCk7CiAKICAgICB2aXJ0dWFsIEF1ZGlvU3RyZWFtSW4qIG9wZW5JbnB1dFN0cmVhbSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBkb1JvdXRpbmcoKSB7IHJldHVybiBOT19FUlJPUjsgfQpkaWZmIC0tZ2l0IGEvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5jcHAgYi9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmNwcAppbmRleCA5ZjFiMTdmLi5iMDM0NjdmIDEwMDY0NAotLS0gYS9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmNwcAorKysgYi9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmNwcApAQCAtMiwxNiArMiwxNiBAQAogKioKICoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAqKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogCkBAIC0yNDcsOCArMjQ3LDggQEAKIHZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfdDo6YWRqdXN0Vm9sdW1lUmFtcCgpCiB7CiAgICAgZm9yIChpbnQgaT0wIDsgaTwyIDsgaSsrKSB7Ci0gICAgICAgIGlmICgoKHZvbHVtZUluY1tpXT4wKSAmJiAoKHByZXZWb2x1bWVbaV0+PjE2KSA+PSB2b2x1bWVbaV0pKSB8fAotICAgICAgICAgICAgKCh2b2x1bWVJbmNbaV08MCkgJiYgKChwcmV2Vm9sdW1lW2ldPj4xNikgPD0gdm9sdW1lW2ldKSkpIHsKKyAgICAgICAgaWYgKCgodm9sdW1lSW5jW2ldPjApICYmICgoKHByZXZWb2x1bWVbaV0rdm9sdW1lSW5jW2ldKT4+MTYpID49IHZvbHVtZVtpXSkpIHx8CisgICAgICAgICAgICAoKHZvbHVtZUluY1tpXTwwKSAmJiAoKChwcmV2Vm9sdW1lW2ldK3ZvbHVtZUluY1tpXSk+PjE2KSA8PSB2b2x1bWVbaV0pKSkgewogICAgICAgICAgICAgdm9sdW1lSW5jW2ldID0gMDsKICAgICAgICAgICAgIHByZXZWb2x1bWVbaV0gPSB2b2x1bWVbaV08PDE2OwogICAgICAgICB9CkBAIC0zMDcsNyArMzA3LDcgQEAKICAgICAgICAgbiB8PSBORUVEU19DSEFOTkVMXzEgKyB0LmNoYW5uZWxDb3VudCAtIDE7CiAgICAgICAgIG4gfD0gTkVFRFNfRk9STUFUXzE2OwogICAgICAgICBuIHw9IHQuZG9lc1Jlc2FtcGxlKCkgPyBORUVEU19SRVNBTVBMRV9FTkFCTEVEIDogTkVFRFNfUkVTQU1QTEVfRElTQUJMRUQ7Ci0gICAgICAgIAorICAgICAgIAogICAgICAgICBpZiAodC52b2x1bWVJbmNbMF18dC52b2x1bWVJbmNbMV0pIHsKICAgICAgICAgICAgIHZvbHVtZVJhbXAgPSAxOwogICAgICAgICB9IGVsc2UgaWYgKCF0LmRvZXNSZXNhbXBsZSgpICYmIHQudm9sdW1lUkwgPT0gMCkgewpAQCAtMzcwLDcgKzM3MCw3IEBACiAKICAgIHN0YXRlLT5ob29rKHN0YXRlLCBvdXRwdXQpOwogCi0gICAvLyBOb3cgdGhhdCB0aGUgdm9sdW1lIHJhbXAgaGFzIGJlZW4gZG9uZSwgc2V0IG9wdGltYWwgc3RhdGUgYW5kIAorICAgLy8gTm93IHRoYXQgdGhlIHZvbHVtZSByYW1wIGhhcyBiZWVuIGRvbmUsIHNldCBvcHRpbWFsIHN0YXRlIGFuZAogICAgLy8gdHJhY2sgaG9va3MgZm9yIHN1YnNlcXVlbnQgbWl4ZXIgcHJvY2VzcwogICAgaWYgKGNvdW50QWN0aXZlVHJhY2tzKSB7CiAgICAgICAgaW50IGFsbE11dGVkID0gMTsKQEAgLTM5Nyw3ICszOTcsNyBAQAogICAgfQogfQogCi1zdGF0aWMgaW5saW5lIAorc3RhdGljIGlubGluZQogaW50MzJfdCBtdWxBZGQoaW50MTZfdCBpbiwgaW50MTZfdCB2LCBpbnQzMl90IGEpCiB7CiAjaWYgZGVmaW5lZChfX2FybV9fKSAmJiAhZGVmaW5lZChfX3RodW1iX18pCkBAIC00MTIsNyArNDEyLDcgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgaW5saW5lIAorc3RhdGljIGlubGluZQogaW50MzJfdCBtdWwoaW50MTZfdCBpbiwgaW50MTZfdCB2KQogewogI2lmIGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX190aHVtYl9fKQpAQCAtNDI3LDcgKzQyNyw3IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIGlubGluZSAKK3N0YXRpYyBpbmxpbmUKIGludDMyX3QgbXVsQWRkUkwoaW50IGxlZnQsIHVpbnQzMl90IGluUkwsIHVpbnQzMl90IHZSTCwgaW50MzJfdCBhKQogewogI2lmIGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX190aHVtYl9fKQpAQCAtNDUzLDcgKzQ1Myw3IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIGlubGluZSAKK3N0YXRpYyBpbmxpbmUKIGludDMyX3QgbXVsUkwoaW50IGxlZnQsIHVpbnQzMl90IGluUkwsIHVpbnQzMl90IHZSTCkKIHsKICNpZiBkZWZpbmVkKF9fYXJtX18pICYmICFkZWZpbmVkKF9fdGh1bWJfXykKQEAgLTUxMyw3ICs1MTMsNyBAQAogICAgIC8vTE9HRCgiWzBdICVwOiBpbmM9JWYsIHYwPSVmLCB2MT0lZCwgZmluYWw9JWYsIGNvdW50PSVkIiwKICAgICAvLyAgICAgICAgdCwgdmxJbmMvNjU1MzYuMGYsIHZsLzY1NTM2LjBmLCB0LT52b2x1bWVbMF0sCiAgICAgLy8gICAgICAgKHZsICsgdmxJbmMqZnJhbWVDb3VudCkvNjU1MzYuMGYsIGZyYW1lQ291bnQpOwotICAgIAorICAgCiAgICAgLy8gcmFtcCB2b2x1bWUKICAgICBkbyB7CiAgICAgICAgICpvdXQrKyArPSAodmwgPj4gMTYpICogKCp0ZW1wKysgPj4gMTIpOwpAQCAtNTQ4LDcgKzU0OCw3IEBACiAgICAgICAgICAgICB2bCArPSB2bEluYzsKICAgICAgICAgICAgIHZyICs9IHZySW5jOwogICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOwotICAgICAgICAKKyAgICAgICAKICAgICAgICAgdC0+cHJldlZvbHVtZVswXSA9IHZsOwogICAgICAgICB0LT5wcmV2Vm9sdW1lWzFdID0gdnI7CiAgICAgICAgIHQtPmFkanVzdFZvbHVtZVJhbXAoKTsKQEAgLTU5MCw3ICs1OTAsNyBAQAogICAgICAgICAgICAgdmwgKz0gdmxJbmM7CiAgICAgICAgICAgICB2ciArPSB2ckluYzsKICAgICAgICAgfSB3aGlsZSAoLS1mcmFtZUNvdW50KTsKLSAgICAgICAgCisgICAgICAgCiAgICAgICAgIHQtPnByZXZWb2x1bWVbMF0gPSB2bDsKICAgICAgICAgdC0+cHJldlZvbHVtZVsxXSA9IHZyOwogICAgICAgICB0LT5hZGp1c3RWb2x1bWVSYW1wKCk7CkBAIC02MDksNyArNjA5LDcgQEAKICAgICB0LT5pbiA9IGluOwogfQogCi1pbmxpbmUgCitpbmxpbmUKIHZvaWQgQXVkaW9NaXhlcjo6ZGl0aGVyQW5kQ2xhbXAoaW50MzJfdCogb3V0LCBpbnQzMl90IGNvbnN0ICpzdW1zLCBzaXplX3QgYykKIHsKICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGMgOyBpKyspIHsKQEAgLTYzMyw4ICs2MzMsMTIgQEAKICAgICAgICAgY29uc3QgaW50IGkgPSAzMSAtIF9fYnVpbHRpbl9jbHooZW4pOwogICAgICAgICBlbiAmPSB+KDE8PGkpOwogICAgICAgICB0cmFja190JiB0ID0gc3RhdGUtPnRyYWNrc1tpXTsKLSAgICAgICAgdC5idWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmdC5idWZmZXIpOwotICAgICAgICBpZiAodC5idWZmZXIucmF3KSB7CisgICAgICAgIHNpemVfdCBvdXRGcmFtZXMgPSBzdGF0ZS0+ZnJhbWVDb3VudDsKKyAgICAgICAgd2hpbGUgKG91dEZyYW1lcykgeworICAgICAgICAgICAgdC5idWZmZXIuZnJhbWVDb3VudCA9IG91dEZyYW1lczsKKyAgICAgICAgICAgIHQuYnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIoJnQuYnVmZmVyKTsKKyAgICAgICAgICAgIGlmICghdC5idWZmZXIucmF3KSBicmVhazsKKyAgICAgICAgICAgIG91dEZyYW1lcyAtPSB0LmJ1ZmZlci5mcmFtZUNvdW50OwogICAgICAgICAgICAgdC5idWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmdC5idWZmZXIpOwogICAgICAgICB9CiAgICAgfQpAQCAtNjUyLDEyICs2NTYsMTQgQEAKICAgICAgICAgY29uc3QgaW50IGkgPSAzMSAtIF9fYnVpbHRpbl9jbHooZW4pOwogICAgICAgICBlbiAmPSB+KDE8PGkpOwogICAgICAgICB0cmFja190JiB0ID0gc3RhdGUtPnRyYWNrc1tpXTsKKyAgICAgICAgdC5idWZmZXIuZnJhbWVDb3VudCA9IHN0YXRlLT5mcmFtZUNvdW50OwogICAgICAgICB0LmJ1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZ0LmJ1ZmZlcik7CisgICAgICAgIHQuZnJhbWVDb3VudCA9IHQuYnVmZmVyLmZyYW1lQ291bnQ7CiAgICAgICAgIHQuaW4gPSB0LmJ1ZmZlci5yYXc7CiAgICAgICAgIC8vIHQuaW4gPT0gTlVMTCBjYW4gaGFwcGVuIGlmIHRoZSB0cmFjayB3YXMgZmx1c2hlZCBqdXN0IGFmdGVyIGhhdmluZwogICAgICAgICAvLyBiZWVuIGVuYWJsZWQgZm9yIG1peGluZy4KICAgICAgICAgaWYgKHQuaW4gPT0gTlVMTCkKLSAgICAgICAgICAgIGVuYWJsZWRUcmFja3MgJj0gfigxPDxpKTsgCisgICAgICAgICAgICBlbmFibGVkVHJhY2tzICY9IH4oMTw8aSk7CiAgICAgfQogCiAgICAgLy8gdGhpcyBhc3N1bWVzIG91dHB1dCAxNiBiaXRzIHN0ZXJlbywgbm8gcmVzYW1wbGluZwpAQCAtNjcxLDEyICs2NzcsMzEgQEAKICAgICAgICAgICAgIGNvbnN0IGludCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGVuKTsKICAgICAgICAgICAgIGVuICY9IH4oMTw8aSk7CiAgICAgICAgICAgICB0cmFja190JiB0ID0gc3RhdGUtPnRyYWNrc1tpXTsKLSAgICAgICAgICAgICh0Lmhvb2spKCZ0LCBvdXRUZW1wLCBCTE9DS1NJWkUsIHN0YXRlLT5yZXNhbXBsZVRlbXApOworICAgICAgICAgICAgc2l6ZV90IG91dEZyYW1lcyA9IEJMT0NLU0laRTsKKyAgICAgICAgICAgCisgICAgICAgICAgICB3aGlsZSAob3V0RnJhbWVzKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IGluRnJhbWVzID0gKHQuZnJhbWVDb3VudCA+IG91dEZyYW1lcyk/b3V0RnJhbWVzOnQuZnJhbWVDb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoaW5GcmFtZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgKHQuaG9vaykoJnQsIG91dFRlbXAgKyAoQkxPQ0tTSVpFLW91dEZyYW1lcykqTUFYX05VTV9DSEFOTkVMUywgaW5GcmFtZXMsIHN0YXRlLT5yZXNhbXBsZVRlbXApOworICAgICAgICAgICAgICAgICAgICB0LmZyYW1lQ291bnQgLT0gaW5GcmFtZXM7CisgICAgICAgICAgICAgICAgICAgIG91dEZyYW1lcyAtPSBpbkZyYW1lczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHQuZnJhbWVDb3VudCA9PSAwICYmIG91dEZyYW1lcykgeworICAgICAgICAgICAgICAgICAgICB0LmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZ0LmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIHQuYnVmZmVyLmZyYW1lQ291bnQgPSBudW1GcmFtZXMgLSAoQkxPQ0tTSVpFIC0gb3V0RnJhbWVzKTsKKyAgICAgICAgICAgICAgICAgICAgdC5idWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmdC5idWZmZXIpOworICAgICAgICAgICAgICAgICAgICB0LmluID0gdC5idWZmZXIucmF3OworICAgICAgICAgICAgICAgICAgICBpZiAodC5pbiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkVHJhY2tzICY9IH4oMTw8aSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0LmZyYW1lQ291bnQgPSB0LmJ1ZmZlci5mcmFtZUNvdW50OworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBkaXRoZXJBbmRDbGFtcChvdXQsIG91dFRlbXAsIEJMT0NLU0laRSk7CiAgICAgICAgIG91dCArPSBCTE9DS1NJWkU7Ci0KICAgICAgICAgbnVtRnJhbWVzIC09IEJMT0NLU0laRTsKICAgICB9IHdoaWxlIChudW1GcmFtZXMpOwogCkBAIC03MTMsMTIgKzczOCwxOSBAQAogICAgICAgICBpZiAoKHQubmVlZHMgJiBORUVEU19SRVNBTVBMRV9fTUFTSykgPT0gTkVFRFNfUkVTQU1QTEVfRU5BQkxFRCkgewogICAgICAgICAgICAgKHQuaG9vaykoJnQsIG91dFRlbXAsIG51bUZyYW1lcywgc3RhdGUtPnJlc2FtcGxlVGVtcCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0LmJ1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZ0LmJ1ZmZlcik7Ci0gICAgICAgICAgICB0LmluID0gdC5idWZmZXIucmF3OwotICAgICAgICAgICAgLy8gdC5pbiA9PSBOVUxMIGNhbiBoYXBwZW4gaWYgdGhlIHRyYWNrIHdhcyBmbHVzaGVkIGp1c3QgYWZ0ZXIgaGF2aW5nCi0gICAgICAgICAgICAvLyBiZWVuIGVuYWJsZWQgZm9yIG1peGluZy4KLSAgICAgICAgICAgIGlmICh0LmluKSB7Ci0gICAgICAgICAgICAgICAgKHQuaG9vaykoJnQsIG91dFRlbXAsIG51bUZyYW1lcywgc3RhdGUtPnJlc2FtcGxlVGVtcCk7CisKKyAgICAgICAgICAgIHNpemVfdCBvdXRGcmFtZXMgPSBudW1GcmFtZXM7CisgICAgICAgICAgIAorICAgICAgICAgICAgd2hpbGUgKG91dEZyYW1lcykgeworICAgICAgICAgICAgICAgIHQuYnVmZmVyLmZyYW1lQ291bnQgPSBvdXRGcmFtZXM7CisgICAgICAgICAgICAgICAgdC5idWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmdC5idWZmZXIpOworICAgICAgICAgICAgICAgIHQuaW4gPSB0LmJ1ZmZlci5yYXc7CisgICAgICAgICAgICAgICAgLy8gdC5pbiA9PSBOVUxMIGNhbiBoYXBwZW4gaWYgdGhlIHRyYWNrIHdhcyBmbHVzaGVkIGp1c3QgYWZ0ZXIgaGF2aW5nCisgICAgICAgICAgICAgICAgLy8gYmVlbiBlbmFibGVkIGZvciBtaXhpbmcuCisgICAgICAgICAgICAgICAgaWYgKHQuaW4gPT0gTlVMTCkgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAodC5ob29rKSgmdCwgb3V0VGVtcCArIChudW1GcmFtZXMtb3V0RnJhbWVzKSpNQVhfTlVNX0NIQU5ORUxTLCB0LmJ1ZmZlci5mcmFtZUNvdW50LCBzdGF0ZS0+cmVzYW1wbGVUZW1wKTsKKyAgICAgICAgICAgICAgICBvdXRGcmFtZXMgLT0gdC5idWZmZXIuZnJhbWVDb3VudDsKICAgICAgICAgICAgICAgICB0LmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZ0LmJ1ZmZlcik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTczNCw0NSArNzY2LDUxIEBACiAgICAgY29uc3QgdHJhY2tfdCYgdCA9IHN0YXRlLT50cmFja3NbaV07CiAKICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXImIGIodC5idWZmZXIpOwotICAgIHQuYnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIoJmIpOwotICAgIGludDE2X3QgY29uc3QgKmluID0gdC5idWZmZXIuaTE2OwotCi0gICAgLy8gaW4gPT0gTlVMTCBjYW4gaGFwcGVuIGlmIHRoZSB0cmFjayB3YXMgZmx1c2hlZCBqdXN0IGFmdGVyIGhhdmluZwotICAgIC8vIGJlZW4gZW5hYmxlZCBmb3IgbWl4aW5nLgotICAgIGlmIChpbiA9PSBOVUxMKSB7Ci0gICAgICAgIG1lbXNldChvdXRwdXQsIDAsIHN0YXRlLT5mcmFtZUNvdW50Kk1BWF9OVU1fQ0hBTk5FTFMqc2l6ZW9mKGludDE2X3QpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKKyAgIAogICAgIGludDMyX3QqIG91dCA9IHN0YXRpY19jYXN0PGludDMyX3QqPihvdXRwdXQpOwogICAgIHNpemVfdCBudW1GcmFtZXMgPSBzdGF0ZS0+ZnJhbWVDb3VudDsKKyAgCiAgICAgY29uc3QgaW50MTZfdCB2bCA9IHQudm9sdW1lWzBdOwogICAgIGNvbnN0IGludDE2X3QgdnIgPSB0LnZvbHVtZVsxXTsKICAgICBjb25zdCB1aW50MzJfdCB2cmwgPSB0LnZvbHVtZVJMOwotICAgIGlmIChVTkxJS0VMWSh1aW50MzJfdCh2bCkgPiBVTklUWV9HQUlOIHx8IHVpbnQzMl90KHZyKSA+IFVOSVRZX0dBSU4pKSB7Ci0gICAgICAgIC8vIHZvbHVtZSBpcyBib29zdGVkLCBzbyB3ZSBtaWdodCBuZWVkIHRvIGNsYW1wIGV2ZW4gdGhvdWdoCi0gICAgICAgIC8vIHdlIHByb2Nlc3Mgb25seSBvbmUgdHJhY2suCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHJsID0gKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QgY29uc3QgKj4oaW4pOwotICAgICAgICAgICAgaW4gKz0gMjsKLSAgICAgICAgICAgIGludDMyX3QgbCA9IG11bFJMKDEsIHJsLCB2cmwpID4+IDEyOwotICAgICAgICAgICAgaW50MzJfdCByID0gbXVsUkwoMCwgcmwsIHZybCkgPj4gMTI7Ci0gICAgICAgICAgICAvLyBjbGFtcGluZy4uLgotICAgICAgICAgICAgbCA9IGNsYW1wMTYobCk7Ci0gICAgICAgICAgICByID0gY2xhbXAxNihyKTsKLSAgICAgICAgICAgICpvdXQrKyA9IChyPDwxNikgfCAobCAmIDB4RkZGRik7Ci0gICAgICAgIH0gd2hpbGUgKC0tbnVtRnJhbWVzKTsKLSAgICB9IGVsc2UgewotICAgICAgICBkbyB7Ci0gICAgICAgICAgICB1aW50MzJfdCBybCA9ICpyZWludGVycHJldF9jYXN0PHVpbnQzMl90IGNvbnN0ICo+KGluKTsKLSAgICAgICAgICAgIGluICs9IDI7Ci0gICAgICAgICAgICBpbnQzMl90IGwgPSBtdWxSTCgxLCBybCwgdnJsKSA+PiAxMjsKLSAgICAgICAgICAgIGludDMyX3QgciA9IG11bFJMKDAsIHJsLCB2cmwpID4+IDEyOwotICAgICAgICAgICAgKm91dCsrID0gKHI8PDE2KSB8IChsICYgMHhGRkZGKTsKLSAgICAgICAgfSB3aGlsZSAoLS1udW1GcmFtZXMpOwotICAgIH0KKyAgICB3aGlsZSAobnVtRnJhbWVzKSB7CisgICAgICAgIGIuZnJhbWVDb3VudCA9IG51bUZyYW1lczsKKyAgICAgICAgdC5idWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmYik7CisgICAgICAgIGludDE2X3QgY29uc3QgKmluID0gYi5pMTY7CiAKLSAgICB0LmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZiKTsKKyAgICAgICAgLy8gaW4gPT0gTlVMTCBjYW4gaGFwcGVuIGlmIHRoZSB0cmFjayB3YXMgZmx1c2hlZCBqdXN0IGFmdGVyIGhhdmluZworICAgICAgICAvLyBiZWVuIGVuYWJsZWQgZm9yIG1peGluZy4KKyAgICAgICAgaWYgKGluID09IE5VTEwpIHsKKyAgICAgICAgICAgIG1lbXNldChvdXQsIDAsIG51bUZyYW1lcypNQVhfTlVNX0NIQU5ORUxTKnNpemVvZihpbnQxNl90KSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc2l6ZV90IG91dEZyYW1lcyA9IGIuZnJhbWVDb3VudDsKKyAgICAgICAKKyAgICAgICAgaWYgKFVOTElLRUxZKHVpbnQzMl90KHZsKSA+IFVOSVRZX0dBSU4gfHwgdWludDMyX3QodnIpID4gVU5JVFlfR0FJTikpIHsKKyAgICAgICAgICAgIC8vIHZvbHVtZSBpcyBib29zdGVkLCBzbyB3ZSBtaWdodCBuZWVkIHRvIGNsYW1wIGV2ZW4gdGhvdWdoCisgICAgICAgICAgICAvLyB3ZSBwcm9jZXNzIG9ubHkgb25lIHRyYWNrLgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIHVpbnQzMl90IHJsID0gKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QgY29uc3QgKj4oaW4pOworICAgICAgICAgICAgICAgIGluICs9IDI7CisgICAgICAgICAgICAgICAgaW50MzJfdCBsID0gbXVsUkwoMSwgcmwsIHZybCkgPj4gMTI7CisgICAgICAgICAgICAgICAgaW50MzJfdCByID0gbXVsUkwoMCwgcmwsIHZybCkgPj4gMTI7CisgICAgICAgICAgICAgICAgLy8gY2xhbXBpbmcuLi4KKyAgICAgICAgICAgICAgICBsID0gY2xhbXAxNihsKTsKKyAgICAgICAgICAgICAgICByID0gY2xhbXAxNihyKTsKKyAgICAgICAgICAgICAgICAqb3V0KysgPSAocjw8MTYpIHwgKGwgJiAweEZGRkYpOworICAgICAgICAgICAgfSB3aGlsZSAoLS1vdXRGcmFtZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIHVpbnQzMl90IHJsID0gKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QgY29uc3QgKj4oaW4pOworICAgICAgICAgICAgICAgIGluICs9IDI7CisgICAgICAgICAgICAgICAgaW50MzJfdCBsID0gbXVsUkwoMSwgcmwsIHZybCkgPj4gMTI7CisgICAgICAgICAgICAgICAgaW50MzJfdCByID0gbXVsUkwoMCwgcmwsIHZybCkgPj4gMTI7CisgICAgICAgICAgICAgICAgKm91dCsrID0gKHI8PDE2KSB8IChsICYgMHhGRkZGKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKC0tb3V0RnJhbWVzKTsKKyAgICAgICAgfQorICAgICAgICBudW1GcmFtZXMgLT0gYi5mcmFtZUNvdW50OworICAgICAgICB0LmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZiKTsKKyAgICB9CiB9CiAKIC8vIDIgdHJhY2tzIGlzIGFsc28gYSBjb21tb24gY2FzZQpAQCAtNzg0LDcxICs4MjIsODkgQEAKICAgICBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGVuKTsKICAgICBjb25zdCB0cmFja190JiB0MCA9IHN0YXRlLT50cmFja3NbaV07CiAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyJiBiMCh0MC5idWZmZXIpOwotICAgIHQwLmJ1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZiMCk7CiAKICAgICBlbiAmPSB+KDE8PGkpOwogICAgIGkgPSAzMSAtIF9fYnVpbHRpbl9jbHooZW4pOwogICAgIGNvbnN0IHRyYWNrX3QmIHQxID0gc3RhdGUtPnRyYWNrc1tpXTsKICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXImIGIxKHQxLmJ1ZmZlcik7Ci0gICAgdDEuYnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIoJmIxKTsKLQorICAgCiAgICAgaW50MTZfdCBjb25zdCAqaW4wOwogICAgIGNvbnN0IGludDE2X3QgdmwwID0gdDAudm9sdW1lWzBdOwogICAgIGNvbnN0IGludDE2X3QgdnIwID0gdDAudm9sdW1lWzFdOworICAgIHNpemVfdCBmcmFtZUNvdW50MCA9IDA7CisgIAogICAgIGludDE2X3QgY29uc3QgKmluMTsKICAgICBjb25zdCBpbnQxNl90IHZsMSA9IHQxLnZvbHVtZVswXTsKICAgICBjb25zdCBpbnQxNl90IHZyMSA9IHQxLnZvbHVtZVsxXTsKLSAgICBzaXplX3QgbnVtRnJhbWVzID0gc3RhdGUtPmZyYW1lQ291bnQ7CisgICAgc2l6ZV90IGZyYW1lQ291bnQxID0gMDsKKyAgIAogICAgIGludDMyX3QqIG91dCA9IHN0YXRpY19jYXN0PGludDMyX3QqPihvdXRwdXQpOworICAgIHNpemVfdCBudW1GcmFtZXMgPSBzdGF0ZS0+ZnJhbWVDb3VudDsKKyAgICBpbnQxNl90IGNvbnN0ICpidWZmID0gTlVMTDsKIAotICAgIC8vIHQwLzEuYnVmZmVyLmkxNiA9PSBOVUxMIGNhbiBoYXBwZW4gaWYgdGhlIHRyYWNrIHdhcyBmbHVzaGVkIGp1c3QgYWZ0ZXIgaGF2aW5nCi0gICAgLy8gYmVlbiBlbmFibGVkIGZvciBtaXhpbmcuCi0gICAgaWYgKHQwLmJ1ZmZlci5pMTYgIT0gTlVMTCkgewotICAgICAgICBpbjAgPSB0MC5idWZmZXIuaTE2OwotICAgICAgICBpZiAodDEuYnVmZmVyLmkxNiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpbjEgPSB0MS5idWZmZXIuaTE2OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW4xID0gbmV3IGludDE2X3RbTUFYX05VTV9DSEFOTkVMUyAqIHN0YXRlLT5mcmFtZUNvdW50XTsKLSAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKWluMSwgMCwgc3RhdGUtPmZyYW1lQ291bnQqTUFYX05VTV9DSEFOTkVMUypzaXplb2YoaW50MTZfdCkpOworICAKKyAgICB3aGlsZSAobnVtRnJhbWVzKSB7CisgICAKKyAgICAgICAgaWYgKGZyYW1lQ291bnQwID09IDApIHsKKyAgICAgICAgICAgIGIwLmZyYW1lQ291bnQgPSBudW1GcmFtZXM7CisgICAgICAgICAgICB0MC5idWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmYjApOworICAgICAgICAgICAgaWYgKGIwLmkxNiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBidWZmID0gbmV3IGludDE2X3RbTUFYX05VTV9DSEFOTkVMUyAqIHN0YXRlLT5mcmFtZUNvdW50XTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW4wID0gYnVmZjsKKyAgICAgICAgICAgICAgICBiMC5mcmFtZUNvdW50ID0gbnVtRnJhbWVzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbjAgPSBiMC5pMTY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmFtZUNvdW50MCA9IGIwLmZyYW1lQ291bnQ7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpbjAgPSBuZXcgaW50MTZfdFtNQVhfTlVNX0NIQU5ORUxTICogc3RhdGUtPmZyYW1lQ291bnRdOwotICAgICAgICBtZW1zZXQoKHZvaWQgKilpbjAsIDAsIHN0YXRlLT5mcmFtZUNvdW50Kk1BWF9OVU1fQ0hBTk5FTFMqc2l6ZW9mKGludDE2X3QpKTsKLSAgICAgICAgaWYgKHQxLmJ1ZmZlci5pMTYgIT0gTlVMTCkgewotICAgICAgICAgICAgaW4xID0gdDEuYnVmZmVyLmkxNjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGluMSA9IGluMDsKKyAgICAgICAgaWYgKGZyYW1lQ291bnQxID09IDApIHsKKyAgICAgICAgICAgIGIxLmZyYW1lQ291bnQgPSBudW1GcmFtZXM7CisgICAgICAgICAgICB0MS5idWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmYjEpOworICAgICAgICAgICAgaWYgKGIxLmkxNiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBidWZmID0gbmV3IGludDE2X3RbTUFYX05VTV9DSEFOTkVMUyAqIHN0YXRlLT5mcmFtZUNvdW50XTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW4xID0gYnVmZjsKKyAgICAgICAgICAgICAgICBiMS5mcmFtZUNvdW50ID0gbnVtRnJhbWVzOworICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbjEgPSBiMS5pMTY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmFtZUNvdW50MSA9IGIxLmZyYW1lQ291bnQ7CiAgICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgZG8gewotICAgICAgICBpbnQzMl90IGwwID0gKmluMCsrOwotICAgICAgICBpbnQzMl90IHIwID0gKmluMCsrOwotICAgICAgICBsMCA9IG11bChsMCwgdmwwKTsKLSAgICAgICAgcjAgPSBtdWwocjAsIHZyMCk7Ci0gICAgICAgIGludDMyX3QgbCA9ICppbjErKzsKLSAgICAgICAgaW50MzJfdCByID0gKmluMSsrOwotICAgICAgICBsID0gbXVsQWRkKGwsIHZsMSwgbDApID4+IDEyOwotICAgICAgICByID0gbXVsQWRkKHIsIHZyMSwgcjApID4+IDEyOwotICAgICAgICAvLyBjbGFtcGluZy4uLgotICAgICAgICBsID0gY2xhbXAxNihsKTsKLSAgICAgICAgciA9IGNsYW1wMTYocik7Ci0gICAgICAgICpvdXQrKyA9IChyPDwxNikgfCAobCAmIDB4RkZGRik7Ci0gICAgfSB3aGlsZSAoLS1udW1GcmFtZXMpOworICAgICAgIAorICAgICAgICBzaXplX3Qgb3V0RnJhbWVzID0gZnJhbWVDb3VudDAgPCBmcmFtZUNvdW50MT9mcmFtZUNvdW50MDpmcmFtZUNvdW50MTsKIAotICAgIAotICAgIGlmICh0MC5idWZmZXIuaTE2ICE9IE5VTEwpIHsKLSAgICAgICAgdDAuYnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJmIwKTsKLSAgICAgICAgaWYgKHQxLmJ1ZmZlci5pMTYgIT0gTlVMTCkgewotICAgICAgICAgICAgdDEuYnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJmIxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRlbGV0ZSBbXSBpbjE7CisgICAgICAgIG51bUZyYW1lcyAtPSBvdXRGcmFtZXM7CisgICAgICAgIGZyYW1lQ291bnQwIC09IG91dEZyYW1lczsKKyAgICAgICAgZnJhbWVDb3VudDEgLT0gb3V0RnJhbWVzOworICAgICAgIAorICAgICAgICBkbyB7CisgICAgICAgICAgICBpbnQzMl90IGwwID0gKmluMCsrOworICAgICAgICAgICAgaW50MzJfdCByMCA9ICppbjArKzsKKyAgICAgICAgICAgIGwwID0gbXVsKGwwLCB2bDApOworICAgICAgICAgICAgcjAgPSBtdWwocjAsIHZyMCk7CisgICAgICAgICAgICBpbnQzMl90IGwgPSAqaW4xKys7CisgICAgICAgICAgICBpbnQzMl90IHIgPSAqaW4xKys7CisgICAgICAgICAgICBsID0gbXVsQWRkKGwsIHZsMSwgbDApID4+IDEyOworICAgICAgICAgICAgciA9IG11bEFkZChyLCB2cjEsIHIwKSA+PiAxMjsKKyAgICAgICAgICAgIC8vIGNsYW1waW5nLi4uCisgICAgICAgICAgICBsID0gY2xhbXAxNihsKTsKKyAgICAgICAgICAgIHIgPSBjbGFtcDE2KHIpOworICAgICAgICAgICAgKm91dCsrID0gKHI8PDE2KSB8IChsICYgMHhGRkZGKTsKKyAgICAgICAgfSB3aGlsZSAoLS1vdXRGcmFtZXMpOworICAgICAgIAorICAgICAgICBpZiAoZnJhbWVDb3VudDAgPT0gMCkgeworICAgICAgICAgICAgdDAuYnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJmIwKTsKICAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRlbGV0ZSBbXSBpbjA7Ci0gICAgICAgIGlmICh0MS5idWZmZXIuaTE2ICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGZyYW1lQ291bnQxID09IDApIHsKICAgICAgICAgICAgIHQxLmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZiMSk7CiAgICAgICAgIH0KKyAgICB9ICAgCisgICAgICAgCisgICAgaWYgKGJ1ZmYgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgW10gYnVmZjsgICAgICAgCiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmggYi9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmgKaW5kZXggOWNhMTA5Zi4uNzJjYTI4YSAxMDA2NDQKLS0tIGEvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5oCisrKyBiL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuaApAQCAtMiwxNiArMiwxNiBAQAogKioKICoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAqKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogCkBAIC0xMzAsNyArMTMwLDcgQEAKIAogICAgICAgICBpbnQzMl90ICAgICB2b2x1bWVJbmNbMl07CiAKLSAgICAgICAgdWludDE2X3QgICAgcmVzZXJ2ZWQ7CisgICAgICAgIHVpbnQxNl90ICAgIGZyYW1lQ291bnQ7CiAKICAgICAgICAgdWludDhfdCAgICAgY2hhbm5lbENvdW50IDogNDsKICAgICAgICAgdWludDhfdCAgICAgZW5hYmxlZCAgICAgIDogMTsKZGlmZiAtLWdpdCBhL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyLmNwcCBiL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyLmNwcAppbmRleCBjOTNlYWQzLi41ZGFiYWNiIDEwMDY0NAotLS0gYS9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlci5jcHAKKysrIGIvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXIuY3BwCkBAIC0xNCwxNyArMTQsMjMgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9SZXNhbXBsZXIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLQogI2luY2x1ZGUgIkF1ZGlvUmVzYW1wbGVyLmgiCiAjaW5jbHVkZSAiQXVkaW9SZXNhbXBsZXJTaW5jLmgiCiAjaW5jbHVkZSAiQXVkaW9SZXNhbXBsZXJDdWJpYy5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNpZmRlZiBfX0FSTV9BUkNIXzVFX18gIC8vIG9wdGltaXplZCBhc20gb3B0aW9uCisgICAgI2RlZmluZSBBU01fQVJNX1JFU0FNUDEgLy8gZW5hYmxlIGFzbSBvcHRpbWlzYXRpb24gZm9yIFJlc2FtcGxlck9yZGVyMQorI2VuZGlmIC8vIF9fQVJNX0FSQ0hfNUVfXwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBjbGFzcyBBdWRpb1Jlc2FtcGxlck9yZGVyMSA6IHB1YmxpYyBBdWRpb1Jlc2FtcGxlciB7CkBAIC00Niw2ICs1MiwxNSBAQAogICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpOwogICAgIHZvaWQgcmVzYW1wbGVTdGVyZW8xNihpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAogICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpOworI2lmZGVmIEFTTV9BUk1fUkVTQU1QMSAgLy8gYXNtIG9wdGltaXNhdGlvbiBmb3IgUmVzYW1wbGVyT3JkZXIxCisgICAgdm9pZCBBc21Nb25vMTZMb29wKGludDE2X3QgKmluLCBpbnQzMl90KiBtYXhPdXRQdCwgaW50MzJfdCBtYXhJbklkeCwKKyAgICAgICAgICAgIHNpemVfdCAmb3V0cHV0SW5kZXgsIGludDMyX3QqIG91dCwgc2l6ZV90ICZpbnB1dEluZGV4LCBpbnQzMl90IHZsLCBpbnQzMl90IHZyLAorICAgICAgICAgICAgdWludDMyX3QgJnBoYXNlRnJhY3Rpb24sIHVpbnQzMl90IHBoYXNlSW5jcmVtZW50KTsKKyAgICB2b2lkIEFzbVN0ZXJlbzE2TG9vcChpbnQxNl90ICppbiwgaW50MzJfdCogbWF4T3V0UHQsIGludDMyX3QgbWF4SW5JZHgsCisgICAgICAgICAgICBzaXplX3QgJm91dHB1dEluZGV4LCBpbnQzMl90KiBvdXQsIHNpemVfdCAmaW5wdXRJbmRleCwgaW50MzJfdCB2bCwgaW50MzJfdCB2ciwKKyAgICAgICAgICAgIHVpbnQzMl90ICZwaGFzZUZyYWN0aW9uLCB1aW50MzJfdCBwaGFzZUluY3JlbWVudCk7CisjZW5kaWYgIC8vIEFTTV9BUk1fUkVTQU1QMQorCiAgICAgc3RhdGljIGlubGluZSBpbnQzMl90IEludGVycChpbnQzMl90IHgwLCBpbnQzMl90IHgxLCB1aW50MzJfdCBmKSB7CiAgICAgICAgIHJldHVybiB4MCArICgoKHgxIC0geDApICogKGludDMyX3QpKGYgPj4ga1ByZUludGVycFNoaWZ0KSkgPj4ga051bUludGVycEJpdHMpOwogICAgIH0KQEAgLTczLDIwICs4OCwyMyBAQAogCiAgICAgaWYgKHF1YWxpdHkgPT0gREVGQVVMVCkKICAgICAgICAgcXVhbGl0eSA9IExPV19RVUFMSVRZOwotICAgIAorCiAgICAgc3dpdGNoIChxdWFsaXR5KSB7CiAgICAgZGVmYXVsdDoKICAgICBjYXNlIExPV19RVUFMSVRZOgorICAgICAgICBMT0dWKCJDcmVhdGUgbGluZWFyIFJlc2FtcGxlciIpOwogICAgICAgICByZXNhbXBsZXIgPSBuZXcgQXVkaW9SZXNhbXBsZXJPcmRlcjEoYml0RGVwdGgsIGluQ2hhbm5lbENvdW50LCBzYW1wbGVSYXRlKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBNRURfUVVBTElUWToKKyAgICAgICAgTE9HVigiQ3JlYXRlIGN1YmljIFJlc2FtcGxlciIpOwogICAgICAgICByZXNhbXBsZXIgPSBuZXcgQXVkaW9SZXNhbXBsZXJDdWJpYyhiaXREZXB0aCwgaW5DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEhJR0hfUVVBTElUWToKKyAgICAgICAgTE9HVigiQ3JlYXRlIHNpbmMgUmVzYW1wbGVyIik7CiAgICAgICAgIHJlc2FtcGxlciA9IG5ldyBBdWRpb1Jlc2FtcGxlclNpbmMoYml0RGVwdGgsIGluQ2hhbm5lbENvdW50LCBzYW1wbGVSYXRlKTsKICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIAorCiAgICAgLy8gaW5pdGlhbGl6ZSByZXNhbXBsZXIKICAgICByZXNhbXBsZXItPmluaXQoKTsKICAgICByZXR1cm4gcmVzYW1wbGVyOwpAQCAtMTAzLDEwICsxMjEsMTAgQEAKICAgICAgICAgICAgICAgICBpbkNoYW5uZWxDb3VudCk7CiAgICAgICAgIC8vIExPR19BU1NFUlQoMCk7CiAgICAgfQotICAgIAorCiAgICAgLy8gaW5pdGlhbGl6ZSBjb21tb24gbWVtYmVycwogICAgIG1Wb2x1bWVbMF0gPSBtVm9sdW1lWzFdID0gMDsKLSAgICBtQnVmZmVyLnJhdyA9IE5VTEw7CisgICAgbUJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKIAogICAgIC8vIHNhdmUgZm9ybWF0IGZvciBxdWljayBsb29rdXAKICAgICBpZiAoaW5DaGFubmVsQ291bnQgPT0gMSkgewpAQCAtMTYwLDE5ICsxNzgsMzEgQEAKICAgICB1aW50MzJfdCBwaGFzZUluY3JlbWVudCA9IG1QaGFzZUluY3JlbWVudDsKICAgICBzaXplX3Qgb3V0cHV0SW5kZXggPSAwOwogICAgIHNpemVfdCBvdXRwdXRTYW1wbGVDb3VudCA9IG91dEZyYW1lQ291bnQgKiAyOworICAgIHNpemVfdCBpbkZyYW1lQ291bnQgPSAob3V0RnJhbWVDb3VudCptSW5TYW1wbGVSYXRlKS9tU2FtcGxlUmF0ZTsKIAogICAgIC8vIExPR0UoInN0YXJ0aW5nIHJlc2FtcGxlICVkIGZyYW1lcywgaW5wdXRJbmRleD0lZCwgcGhhc2VGcmFjdGlvbj0lZCwgcGhhc2VJbmNyZW1lbnQ9JWRcbiIsCi0gICAgLy8JCW91dEZyYW1lQ291bnQsIGlucHV0SW5kZXgsIHBoYXNlRnJhY3Rpb24sIHBoYXNlSW5jcmVtZW50KTsKKyAgICAvLyAgICAgIG91dEZyYW1lQ291bnQsIGlucHV0SW5kZXgsIHBoYXNlRnJhY3Rpb24sIHBoYXNlSW5jcmVtZW50KTsKIAogICAgIHdoaWxlIChvdXRwdXRJbmRleCA8IG91dHB1dFNhbXBsZUNvdW50KSB7CiAKICAgICAgICAgLy8gYnVmZmVyIGlzIGVtcHR5LCBmZXRjaCBhIG5ldyBvbmUKLSAgICAgICAgaWYgKG1CdWZmZXIucmF3ID09IE5VTEwpIHsKKyAgICAgICAgd2hpbGUgKG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwKSB7CisgICAgICAgICAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSBpbkZyYW1lQ291bnQ7CiAgICAgICAgICAgICBwcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmbUJ1ZmZlcik7Ci0gICAgICAgICAgICBpZiAobUJ1ZmZlci5yYXcgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChtQnVmZmVyLnJhdyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZ290byByZXNhbXBsZVN0ZXJlbzE2X2V4aXQ7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8vIExPR0UoIk5ldyBidWZmZXIgZmV0Y2hlZDogJWQgZnJhbWVzXG4iLCBtQnVmZmVyLmZyYW1lQ291bnQpOworICAgICAgICAgICAgaWYgKG1CdWZmZXIuZnJhbWVDb3VudCA+IGlucHV0SW5kZXgpIGJyZWFrOworCisgICAgICAgICAgICBpbnB1dEluZGV4IC09IG1CdWZmZXIuZnJhbWVDb3VudDsKKyAgICAgICAgICAgIG1YMEwgPSBtQnVmZmVyLmkxNlttQnVmZmVyLmZyYW1lQ291bnQqMi0yXTsKKyAgICAgICAgICAgIG1YMFIgPSBtQnVmZmVyLmkxNlttQnVmZmVyLmZyYW1lQ291bnQqMi0xXTsKKyAgICAgICAgICAgIHByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZtQnVmZmVyKTsKKyAgICAgICAgICAgICAvLyBtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCBub3cgc28gd2UgcmVsb2FkIGEgbmV3IGJ1ZmZlcgogICAgICAgICB9CisKICAgICAgICAgaW50MTZfdCAqaW4gPSBtQnVmZmVyLmkxNjsKIAogICAgICAgICAvLyBoYW5kbGUgYm91bmRhcnkgY2FzZQpAQCAtMTg3LDM0ICsyMTcsNDcgQEAKIAogICAgICAgICAvLyBwcm9jZXNzIGlucHV0IHNhbXBsZXMKICAgICAgICAgLy8gTE9HRSgiZ2VuZXJhbCBjYXNlXG4iKTsKLSAgICAgICAgd2hpbGUgKG91dHB1dEluZGV4IDwgb3V0cHV0U2FtcGxlQ291bnQpIHsKKworI2lmZGVmIEFTTV9BUk1fUkVTQU1QMSAgLy8gYXNtIG9wdGltaXNhdGlvbiBmb3IgUmVzYW1wbGVyT3JkZXIxCisgICAgICAgIGlmIChpbnB1dEluZGV4ICsgMiA8IG1CdWZmZXIuZnJhbWVDb3VudCkgeworICAgICAgICAgICAgaW50MzJfdCogbWF4T3V0UHQ7CisgICAgICAgICAgICBpbnQzMl90IG1heEluSWR4OworCisgICAgICAgICAgICBtYXhPdXRQdCA9IG91dCArIChvdXRwdXRTYW1wbGVDb3VudCAtIDIpOyAgIC8vIDIgYmVjYXVzZSAyIGZyYW1lcyBwZXIgbG9vcAorICAgICAgICAgICAgbWF4SW5JZHggPSBtQnVmZmVyLmZyYW1lQ291bnQgLSAyOworICAgICAgICAgICAgQXNtU3RlcmVvMTZMb29wKGluLCBtYXhPdXRQdCwgbWF4SW5JZHgsIG91dHB1dEluZGV4LCBvdXQsIGlucHV0SW5kZXgsIHZsLCB2ciwKKyAgICAgICAgICAgICAgICAgICAgcGhhc2VGcmFjdGlvbiwgcGhhc2VJbmNyZW1lbnQpOworICAgICAgICB9CisjZW5kaWYgIC8vIEFTTV9BUk1fUkVTQU1QMQorCisgICAgICAgIHdoaWxlIChvdXRwdXRJbmRleCA8IG91dHB1dFNhbXBsZUNvdW50ICYmIGlucHV0SW5kZXggPCBtQnVmZmVyLmZyYW1lQ291bnQpIHsKICAgICAgICAgICAgIG91dFtvdXRwdXRJbmRleCsrXSArPSB2bCAqIEludGVycChpbltpbnB1dEluZGV4KjItMl0sCiAgICAgICAgICAgICAgICAgICAgIGluW2lucHV0SW5kZXgqMl0sIHBoYXNlRnJhY3Rpb24pOwogICAgICAgICAgICAgb3V0W291dHB1dEluZGV4KytdICs9IHZyICogSW50ZXJwKGluW2lucHV0SW5kZXgqMi0xXSwKICAgICAgICAgICAgICAgICAgICAgaW5baW5wdXRJbmRleCoyKzFdLCBwaGFzZUZyYWN0aW9uKTsKICAgICAgICAgICAgIEFkdmFuY2UoJmlucHV0SW5kZXgsICZwaGFzZUZyYWN0aW9uLCBwaGFzZUluY3JlbWVudCk7Ci0gICAgICAgICAgICBpZiAoaW5wdXRJbmRleCA+PSBtQnVmZmVyLmZyYW1lQ291bnQpCi0gICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KKwogICAgICAgICAvLyBMT0dFKCJsb29wIGRvbmUgLSBvdXRwdXRJbmRleD0lZCwgaW5wdXRJbmRleD0lZFxuIiwgb3V0cHV0SW5kZXgsIGlucHV0SW5kZXgpOwogCiAgICAgICAgIC8vIGlmIGRvbmUgd2l0aCBidWZmZXIsIHNhdmUgc2FtcGxlcwogICAgICAgICBpZiAoaW5wdXRJbmRleCA+PSBtQnVmZmVyLmZyYW1lQ291bnQpIHsKICAgICAgICAgICAgIGlucHV0SW5kZXggLT0gbUJ1ZmZlci5mcmFtZUNvdW50OwogCi0gICAgICAgICAgICAvLyBMT0dFKCJidWZmZXIgZG9uZSwgbmV3IGlucHV0IGluZGV4IiwgaW5wdXRJbmRleCk7CisgICAgICAgICAgICAvLyBMT0dFKCJidWZmZXIgZG9uZSwgbmV3IGlucHV0IGluZGV4ICVkIiwgaW5wdXRJbmRleCk7CiAKICAgICAgICAgICAgIG1YMEwgPSBtQnVmZmVyLmkxNlttQnVmZmVyLmZyYW1lQ291bnQqMi0yXTsKICAgICAgICAgICAgIG1YMFIgPSBtQnVmZmVyLmkxNlttQnVmZmVyLmZyYW1lQ291bnQqMi0xXTsKICAgICAgICAgICAgIHByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZtQnVmZmVyKTsKIAotICAgICAgICAgICAgLy8gdmVyaWZ5IHRoYXQgdGhlIHJlbGVhc2VCdWZmZXIgTlVMTFMgdGhlIGJ1ZmZlciBwb2ludGVyIAotICAgICAgICAgICAgLy8gTE9HX0FTU0VSVChtQnVmZmVyLnJhdyA9PSBOVUxMKTsKKyAgICAgICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZSByZWxlYXNlQnVmZmVyIHJlc2V0cyB0aGUgYnVmZmVyIGZyYW1lQ291bnQKKyAgICAgICAgICAgIC8vIExPR19BU1NFUlQobUJ1ZmZlci5mcmFtZUNvdW50ID09IDApOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gTE9HRSgib3V0cHV0IGJ1ZmZlciBmdWxsIC0gb3V0cHV0SW5kZXg9JWQsIGlucHV0SW5kZXg9JWRcbiIsIG91dHB1dEluZGV4LCBpbnB1dEluZGV4KTsKIAorcmVzYW1wbGVTdGVyZW8xNl9leGl0OgogICAgIC8vIHNhdmUgc3RhdGUKICAgICBtSW5wdXRJbmRleCA9IGlucHV0SW5kZXg7CiAgICAgbVBoYXNlRnJhY3Rpb24gPSBwaGFzZUZyYWN0aW9uOwpAQCAtMjMxLDE4ICsyNzQsMjcgQEAKICAgICB1aW50MzJfdCBwaGFzZUluY3JlbWVudCA9IG1QaGFzZUluY3JlbWVudDsKICAgICBzaXplX3Qgb3V0cHV0SW5kZXggPSAwOwogICAgIHNpemVfdCBvdXRwdXRTYW1wbGVDb3VudCA9IG91dEZyYW1lQ291bnQgKiAyOworICAgIHNpemVfdCBpbkZyYW1lQ291bnQgPSAob3V0RnJhbWVDb3VudCptSW5TYW1wbGVSYXRlKS9tU2FtcGxlUmF0ZTsKIAogICAgIC8vIExPR0UoInN0YXJ0aW5nIHJlc2FtcGxlICVkIGZyYW1lcywgaW5wdXRJbmRleD0lZCwgcGhhc2VGcmFjdGlvbj0lZCwgcGhhc2VJbmNyZW1lbnQ9JWRcbiIsCiAgICAgLy8gICAgICBvdXRGcmFtZUNvdW50LCBpbnB1dEluZGV4LCBwaGFzZUZyYWN0aW9uLCBwaGFzZUluY3JlbWVudCk7Ci0KICAgICB3aGlsZSAob3V0cHV0SW5kZXggPCBvdXRwdXRTYW1wbGVDb3VudCkgewotCiAgICAgICAgIC8vIGJ1ZmZlciBpcyBlbXB0eSwgZmV0Y2ggYSBuZXcgb25lCi0gICAgICAgIGlmIChtQnVmZmVyLnJhdyA9PSBOVUxMKSB7CisgICAgICAgIHdoaWxlIChtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCkgeworICAgICAgICAgICAgbUJ1ZmZlci5mcmFtZUNvdW50ID0gaW5GcmFtZUNvdW50OwogICAgICAgICAgICAgcHJvdmlkZXItPmdldE5leHRCdWZmZXIoJm1CdWZmZXIpOwotICAgICAgICAgICAgaWYgKG1CdWZmZXIucmF3ID09IE5VTEwpCi0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAobUJ1ZmZlci5yYXcgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1JbnB1dEluZGV4ID0gaW5wdXRJbmRleDsKKyAgICAgICAgICAgICAgICBtUGhhc2VGcmFjdGlvbiA9IHBoYXNlRnJhY3Rpb247CisgICAgICAgICAgICAgICAgZ290byByZXNhbXBsZU1vbm8xNl9leGl0OworICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gTE9HRSgiTmV3IGJ1ZmZlciBmZXRjaGVkOiAlZCBmcmFtZXNcbiIsIG1CdWZmZXIuZnJhbWVDb3VudCk7CisgICAgICAgICAgICBpZiAobUJ1ZmZlci5mcmFtZUNvdW50ID4gIGlucHV0SW5kZXgpIGJyZWFrOworCisgICAgICAgICAgICBpbnB1dEluZGV4IC09IG1CdWZmZXIuZnJhbWVDb3VudDsKKyAgICAgICAgICAgIG1YMEwgPSBtQnVmZmVyLmkxNlttQnVmZmVyLmZyYW1lQ291bnQtMV07CisgICAgICAgICAgICBwcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmbUJ1ZmZlcik7CisgICAgICAgICAgICAvLyBtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCBub3cgc28gd2UgcmVsb2FkIGEgbmV3IGJ1ZmZlcgogICAgICAgICB9CiAgICAgICAgIGludDE2X3QgKmluID0gbUJ1ZmZlci5pMTY7CiAKQEAgLTI1OSwzOCArMzExLDI4NCBAQAogCiAgICAgICAgIC8vIHByb2Nlc3MgaW5wdXQgc2FtcGxlcwogICAgICAgICAvLyBMT0dFKCJnZW5lcmFsIGNhc2VcbiIpOwotICAgICAgICB3aGlsZSAob3V0cHV0SW5kZXggPCBvdXRwdXRTYW1wbGVDb3VudCkgeworCisjaWZkZWYgQVNNX0FSTV9SRVNBTVAxICAvLyBhc20gb3B0aW1pc2F0aW9uIGZvciBSZXNhbXBsZXJPcmRlcjEKKyAgICAgICAgaWYgKGlucHV0SW5kZXggKyAyIDwgbUJ1ZmZlci5mcmFtZUNvdW50KSB7CisgICAgICAgICAgICBpbnQzMl90KiBtYXhPdXRQdDsKKyAgICAgICAgICAgIGludDMyX3QgbWF4SW5JZHg7CisKKyAgICAgICAgICAgIG1heE91dFB0ID0gb3V0ICsgKG91dHB1dFNhbXBsZUNvdW50IC0gMik7CisgICAgICAgICAgICBtYXhJbklkeCA9IChpbnQzMl90KW1CdWZmZXIuZnJhbWVDb3VudCAtIDI7CisgICAgICAgICAgICAgICAgQXNtTW9ubzE2TG9vcChpbiwgbWF4T3V0UHQsIG1heEluSWR4LCBvdXRwdXRJbmRleCwgb3V0LCBpbnB1dEluZGV4LCB2bCwgdnIsCisgICAgICAgICAgICAgICAgICAgICAgICBwaGFzZUZyYWN0aW9uLCBwaGFzZUluY3JlbWVudCk7CisgICAgICAgIH0KKyNlbmRpZiAgLy8gQVNNX0FSTV9SRVNBTVAxCisKKyAgICAgICAgd2hpbGUgKG91dHB1dEluZGV4IDwgb3V0cHV0U2FtcGxlQ291bnQgJiYgaW5wdXRJbmRleCA8IG1CdWZmZXIuZnJhbWVDb3VudCkgewogICAgICAgICAgICAgaW50MzJfdCBzYW1wbGUgPSBJbnRlcnAoaW5baW5wdXRJbmRleC0xXSwgaW5baW5wdXRJbmRleF0sCiAgICAgICAgICAgICAgICAgICAgIHBoYXNlRnJhY3Rpb24pOwogICAgICAgICAgICAgb3V0W291dHB1dEluZGV4KytdICs9IHZsICogc2FtcGxlOwogICAgICAgICAgICAgb3V0W291dHB1dEluZGV4KytdICs9IHZyICogc2FtcGxlOwogICAgICAgICAgICAgQWR2YW5jZSgmaW5wdXRJbmRleCwgJnBoYXNlRnJhY3Rpb24sIHBoYXNlSW5jcmVtZW50KTsKLSAgICAgICAgICAgIGlmIChpbnB1dEluZGV4ID49IG1CdWZmZXIuZnJhbWVDb3VudCkKLSAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQorCisKICAgICAgICAgLy8gTE9HRSgibG9vcCBkb25lIC0gb3V0cHV0SW5kZXg9JWQsIGlucHV0SW5kZXg9JWRcbiIsIG91dHB1dEluZGV4LCBpbnB1dEluZGV4KTsKIAogICAgICAgICAvLyBpZiBkb25lIHdpdGggYnVmZmVyLCBzYXZlIHNhbXBsZXMKICAgICAgICAgaWYgKGlucHV0SW5kZXggPj0gbUJ1ZmZlci5mcmFtZUNvdW50KSB7CiAgICAgICAgICAgICBpbnB1dEluZGV4IC09IG1CdWZmZXIuZnJhbWVDb3VudDsKIAotICAgICAgICAgICAgLy8gTE9HRSgiYnVmZmVyIGRvbmUsIG5ldyBpbnB1dCBpbmRleCIsIGlucHV0SW5kZXgpOworICAgICAgICAgICAgLy8gTE9HRSgiYnVmZmVyIGRvbmUsIG5ldyBpbnB1dCBpbmRleCAlZCIsIGlucHV0SW5kZXgpOwogCiAgICAgICAgICAgICBtWDBMID0gbUJ1ZmZlci5pMTZbbUJ1ZmZlci5mcmFtZUNvdW50LTFdOwogICAgICAgICAgICAgcHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJm1CdWZmZXIpOwogCi0gICAgICAgICAgICAvLyB2ZXJpZnkgdGhhdCB0aGUgcmVsZWFzZUJ1ZmZlciBOVUxMUyB0aGUgYnVmZmVyIHBvaW50ZXIgCi0gICAgICAgICAgICAvLyBMT0dfQVNTRVJUKG1CdWZmZXIucmF3ID09IE5VTEwpOworICAgICAgICAgICAgLy8gdmVyaWZ5IHRoYXQgdGhlIHJlbGVhc2VCdWZmZXIgcmVzZXRzIHRoZSBidWZmZXIgZnJhbWVDb3VudAorICAgICAgICAgICAgLy8gTE9HX0FTU0VSVChtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBMT0dFKCJvdXRwdXQgYnVmZmVyIGZ1bGwgLSBvdXRwdXRJbmRleD0lZCwgaW5wdXRJbmRleD0lZFxuIiwgb3V0cHV0SW5kZXgsIGlucHV0SW5kZXgpOwogCityZXNhbXBsZU1vbm8xNl9leGl0OgogICAgIC8vIHNhdmUgc3RhdGUKICAgICBtSW5wdXRJbmRleCA9IGlucHV0SW5kZXg7CiAgICAgbVBoYXNlRnJhY3Rpb24gPSBwaGFzZUZyYWN0aW9uOwogfQogCisjaWZkZWYgQVNNX0FSTV9SRVNBTVAxICAvLyBhc20gb3B0aW1pc2F0aW9uIGZvciBSZXNhbXBsZXJPcmRlcjEKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICBBc21Nb25vMTZMb29wCisqICAgYXNtIG9wdGltaXplZCBtb25vdG9uaWMgbG9vcCB2ZXJzaW9uOyBvbmUgbG9vcCBpcyAyIGZyYW1lcworKiAgIElucHV0OgorKiAgICAgICBpbiA6IHBvaW50ZXIgb24gaW5wdXQgc2FtcGxlcworKiAgICAgICBtYXhPdXRQdCA6IHBvaW50ZXIgb24gZmlyc3Qgbm90IGZpbGxlZAorKiAgICAgICBtYXhJbklkeCA6IGluZGV4IG9uIGZpcnN0IG5vdCB1c2VkCisqICAgICAgIG91dHB1dEluZGV4IDogcG9pbnRlciBvbiBjdXJyZW50IG91dHB1dCBpbmRleAorKiAgICAgICBvdXQgOiBwb2ludGVyIG9uIG91dHB1dCBidWZmZXIKKyogICAgICAgaW5wdXRJbmRleCA6IHBvaW50ZXIgb24gY3VycmVudCBpbnB1dCBpbmRleAorKiAgICAgICB2bCwgdnIgOiBsZWZ0IGFuZCByaWdodCBnYWluCisqICAgICAgIHBoYXNlRnJhY3Rpb24gOiBwb2ludGVyIG9uIGN1cnJlbnQgcGhhc2UgZnJhY3Rpb24KKyogICAgICAgcGhhc2VJbmNyZW1lbnQKKyogICBPdXB1dDoKKyogICAgICAgb3V0cHV0SW5kZXggOgorKiAgICAgICBvdXQgOiB1cGRhdGVkIGJ1ZmZlcgorKiAgICAgICBpbnB1dEluZGV4IDogaW5kZXggb2YgbmV4dCB0byB1c2UKKyogICAgICAgcGhhc2VGcmFjdGlvbiA6IHBoYXNlIGZyYWN0aW9uIGZvciBuZXh0IGludGVycG9sYXRpb24KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEF1ZGlvUmVzYW1wbGVyT3JkZXIxOjpBc21Nb25vMTZMb29wKGludDE2X3QgKmluLCBpbnQzMl90KiBtYXhPdXRQdCwgaW50MzJfdCBtYXhJbklkeCwKKyAgICAgICAgICAgIHNpemVfdCAmb3V0cHV0SW5kZXgsIGludDMyX3QqIG91dCwgc2l6ZV90ICZpbnB1dEluZGV4LCBpbnQzMl90IHZsLCBpbnQzMl90IHZyLAorICAgICAgICAgICAgdWludDMyX3QgJnBoYXNlRnJhY3Rpb24sIHVpbnQzMl90IHBoYXNlSW5jcmVtZW50KQoreworI2RlZmluZSBNT19QQVJBTTUgICAiMzYiICAgICAgICAvLyBvZmZzZXQgb2YgcGFyYW1ldGVyIDUgKG91dHB1dEluZGV4KQorCisgICAgYXNtKAorICAgICAgICAic3RtZmQgIHNwISwge3I0LCByNSwgcjYsIHI3LCByOCwgcjksIHIxMCwgcjExLCBscn1cbiIKKyAgICAgICAgLy8gZ2V0IHBhcmFtZXRlcnMKKyAgICAgICAgIiAgIGxkciByNiwgW3NwLCAjIiBNT19QQVJBTTUgIiArIDIwXVxuIiAgICAvLyAmcGhhc2VGcmFjdGlvbgorICAgICAgICAiICAgbGRyIHI2LCBbcjZdXG4iICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBoYXNlRnJhY3Rpb24KKyAgICAgICAgIiAgIGxkciByNywgW3NwLCAjIiBNT19QQVJBTTUgIiArIDhdXG4iICAgICAvLyAmaW5wdXRJbmRleAorICAgICAgICAiICAgbGRyIHI3LCBbcjddXG4iICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlucHV0SW5kZXgKKyAgICAgICAgIiAgIGxkciByOCwgW3NwLCAjIiBNT19QQVJBTTUgIiArIDRdXG4iICAgICAvLyBvdXQKKyAgICAgICAgIiAgIGxkciByMCwgW3NwLCAjIiBNT19QQVJBTTUgIiArIDBdXG4iICAgICAvLyAmb3V0cHV0SW5kZXgKKyAgICAgICAgIiAgIGxkciByMCwgW3IwXVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXRwdXRJbmRleAorICAgICAgICAiICAgYWRkIHI4LCByMCwgYXNsICMyXG4iICAgICAgICAgICAgICAgICAgIC8vIGN1ck91dAorICAgICAgICAiICAgbGRyIHI5LCBbc3AsICMiIE1PX1BBUkFNNSAiICsgMjRdXG4iICAgIC8vIHBoYXNlSW5jcmVtZW50CisgICAgICAgICIgICBsZHIgcjEwLCBbc3AsICMiIE1PX1BBUkFNNSAiICsgMTJdXG4iICAgLy8gdmwKKyAgICAgICAgIiAgIGxkciByMTEsIFtzcCwgIyIgTU9fUEFSQU01ICIgKyAxNl1cbiIgICAvLyB2cgorCisgICAgICAgIC8vIHIwIHBpbiwgeDAsIFNhbXAKKworICAgICAgICAvLyByMSBpbgorICAgICAgICAvLyByMiBtYXhPdXRQdAorICAgICAgICAvLyByMyBtYXhJbklkeAorCisgICAgICAgIC8vIHI0IHgxLCBpMSwgaTMsIE91dDEKKyAgICAgICAgLy8gcjUgb3V0MAorCisgICAgICAgIC8vIHI2IGZyYWMKKyAgICAgICAgLy8gcjcgaW5wdXRJbmRleAorICAgICAgICAvLyByOCBjdXJPdXQKKworICAgICAgICAvLyByOSBpbmMKKyAgICAgICAgLy8gcjEwIHZsCisgICAgICAgIC8vIHIxMSB2cgorCisgICAgICAgIC8vIHIxMgorICAgICAgICAvLyByMTMgc3AKKyAgICAgICAgLy8gcjE0CisKKyAgICAgICAgLy8gdGhlIGZvbGxvd2luZyBsb29wIHdvcmtzIG9uIDIgZnJhbWVzCisKKyAgICAgICAgIi5ZNEwwMTpcbiIKKyAgICAgICAgIiAgIGNtcCByOCwgcjJcbiIgICAgICAgICAgICAgICAgICAgLy8gY3VyT3V0IC0gbWF4Q3VyT3V0CisgICAgICAgICIgICBiY3MgLlk0TDAyXG4iCisKKyNkZWZpbmUgTU9fT05FX0ZSQU1FIFwKKyAgICAiICAgYWRkIHIwLCByMSwgcjcsIGFzbCAjMVxuIiAgICAgICAvKiBpbiArIGlucHV0SW5kZXggKi9cCisgICAgIiAgIGxkcnNoIHI0LCBbcjBdXG4iICAgICAgICAgICAgICAgLyogaW5baW5wdXRJbmRleF0gKi9cCisgICAgIiAgIGxkciByNSwgW3I4XVxuIiAgICAgICAgICAgICAgICAgLyogb3V0W291dHB1dEluZGV4XSAqL1wKKyAgICAiICAgbGRyc2ggcjAsIFtyMCwgIy0yXVxuIiAgICAgICAgICAvKiBpbltpbnB1dEluZGV4LTFdICovXAorICAgICIgICBiaWMgcjYsIHI2LCAjMHhDMDAwMDAwMFxuIiAgICAgIC8qIHBoYXNlRnJhY3Rpb24gJiAuLi4gKi9cCisgICAgIiAgIHN1YiByNCwgcjQsIHIwXG4iICAgICAgICAgICAgICAgLyogaW5baW5wdXRJbmRleF0gLSBpbltpbnB1dEluZGV4LTFdICovXAorICAgICIgICBtb3YgcjQsIHI0LCBsc2wgIzJcbiIgICAgICAgICAgIC8qIDw8MiAqL1wKKyAgICAiICAgc211bHd0IHI0LCByNCwgcjZcbiIgICAgICAgICAgICAvKiAoeDEteDApKi4uICovXAorICAgICIgICBhZGQgcjYsIHI2LCByOVxuIiAgICAgICAgICAgICAgIC8qIHBoYXNlRnJhY3Rpb24gKyBwaGFzZUluY3JlbWVudCAqL1wKKyAgICAiICAgYWRkIHIwLCByMCwgcjRcbiIgICAgICAgICAgICAgICAvKiB4MCAtICguLikgKi9cCisgICAgIiAgIG1sYSByNSwgcjAsIHIxMCwgcjVcbiIgICAgICAgICAgLyogdmwqaW50ZXJwICsgb3V0W10gKi9cCisgICAgIiAgIGxkciByNCwgW3I4LCAjNF1cbiIgICAgICAgICAgICAgLyogb3V0W291dHB1dEluZGV4KzFdICovXAorICAgICIgICBzdHIgcjUsIFtyOF0sICM0XG4iICAgICAgICAgICAgIC8qIG91dFtvdXRwdXRJbmRleCsrXSA9IC4uLiAqL1wKKyAgICAiICAgbWxhIHI0LCByMCwgcjExLCByNFxuIiAgICAgICAgICAvKiB2cippbnRlcnAgKyBvdXRbXSAqL1wKKyAgICAiICAgYWRkIHI3LCByNywgcjYsIGxzciAjMzBcbiIgICAgICAvKiBpbnB1dEluZGV4ICsgcGhhc2VGcmFjdGlvbj4+MzAgKi9cCisgICAgIiAgIHN0ciByNCwgW3I4XSwgIzRcbiIgICAgICAgICAgICAgLyogb3V0W291dHB1dEluZGV4KytdID0gLi4uICovCisKKyAgICAgICAgTU9fT05FX0ZSQU1FICAgIC8vIGZyYW1lIDEKKyAgICAgICAgTU9fT05FX0ZSQU1FICAgIC8vIGZyYW1lIDIKKworICAgICAgICAiICAgY21wIHI3LCByM1xuIiAgICAgICAgICAgICAgICAgICAvLyBpbnB1dEluZGV4IC0gbWF4SW5JZHgKKyAgICAgICAgIiAgIGJjYyAuWTRMMDFcbiIKKyAgICAgICAgIi5ZNEwwMjpcbiIKKworICAgICAgICAiICAgYmljIHI2LCByNiwgIzB4QzAwMDAwMDBcbiIgICAgICAgICAgICAgLy8gcGhhc2VGcmFjdGlvbiAmIC4uLgorICAgICAgICAvLyBzYXZlIG1vZGlmaWVkIHZhbHVlcworICAgICAgICAiICAgbGRyIHIwLCBbc3AsICMiIE1PX1BBUkFNNSAiICsgMjBdXG4iICAgIC8vICZwaGFzZUZyYWN0aW9uCisgICAgICAgICIgICBzdHIgcjYsIFtyMF1cbiIgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGhhc2VGcmFjdGlvbgorICAgICAgICAiICAgbGRyIHIwLCBbc3AsICMiIE1PX1BBUkFNNSAiICsgOF1cbiIgICAgIC8vICZpbnB1dEluZGV4CisgICAgICAgICIgICBzdHIgcjcsIFtyMF1cbiIgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXRJbmRleAorICAgICAgICAiICAgbGRyIHIwLCBbc3AsICMiIE1PX1BBUkFNNSAiICsgNF1cbiIgICAgIC8vIG91dAorICAgICAgICAiICAgc3ViIHI4LCByMFxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1ck91dCAtIG91dAorICAgICAgICAiICAgYXNyIHI4LCAjMlxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldyBvdXRwdXRJbmRleAorICAgICAgICAiICAgbGRyIHIwLCBbc3AsICMiIE1PX1BBUkFNNSAiICsgMF1cbiIgICAgIC8vICZvdXRwdXRJbmRleAorICAgICAgICAiICAgc3RyIHI4LCBbcjBdXG4iICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgb3V0cHV0SW5kZXgKKworICAgICAgICAiICAgbGRtZmQgICBzcCEsIHtyNCwgcjUsIHI2LCByNywgcjgsIHI5LCByMTAsIHIxMSwgcGN9XG4iCisgICAgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICBBc21TdGVyZW8xNkxvb3AKKyogICBhc20gb3B0aW1pemVkIHN0ZXJlbyBsb29wIHZlcnNpb247IG9uZSBsb29wIGlzIDIgZnJhbWVzCisqICAgSW5wdXQ6CisqICAgICAgIGluIDogcG9pbnRlciBvbiBpbnB1dCBzYW1wbGVzCisqICAgICAgIG1heE91dFB0IDogcG9pbnRlciBvbiBmaXJzdCBub3QgZmlsbGVkCisqICAgICAgIG1heEluSWR4IDogaW5kZXggb24gZmlyc3Qgbm90IHVzZWQKKyogICAgICAgb3V0cHV0SW5kZXggOiBwb2ludGVyIG9uIGN1cnJlbnQgb3V0cHV0IGluZGV4CisqICAgICAgIG91dCA6IHBvaW50ZXIgb24gb3V0cHV0IGJ1ZmZlcgorKiAgICAgICBpbnB1dEluZGV4IDogcG9pbnRlciBvbiBjdXJyZW50IGlucHV0IGluZGV4CisqICAgICAgIHZsLCB2ciA6IGxlZnQgYW5kIHJpZ2h0IGdhaW4KKyogICAgICAgcGhhc2VGcmFjdGlvbiA6IHBvaW50ZXIgb24gY3VycmVudCBwaGFzZSBmcmFjdGlvbgorKiAgICAgICBwaGFzZUluY3JlbWVudAorKiAgIE91cHV0OgorKiAgICAgICBvdXRwdXRJbmRleCA6CisqICAgICAgIG91dCA6IHVwZGF0ZWQgYnVmZmVyCisqICAgICAgIGlucHV0SW5kZXggOiBpbmRleCBvZiBuZXh0IHRvIHVzZQorKiAgICAgICBwaGFzZUZyYWN0aW9uIDogcGhhc2UgZnJhY3Rpb24gZm9yIG5leHQgaW50ZXJwb2xhdGlvbgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgQXVkaW9SZXNhbXBsZXJPcmRlcjE6OkFzbVN0ZXJlbzE2TG9vcChpbnQxNl90ICppbiwgaW50MzJfdCogbWF4T3V0UHQsIGludDMyX3QgbWF4SW5JZHgsCisgICAgICAgICAgICBzaXplX3QgJm91dHB1dEluZGV4LCBpbnQzMl90KiBvdXQsIHNpemVfdCAmaW5wdXRJbmRleCwgaW50MzJfdCB2bCwgaW50MzJfdCB2ciwKKyAgICAgICAgICAgIHVpbnQzMl90ICZwaGFzZUZyYWN0aW9uLCB1aW50MzJfdCBwaGFzZUluY3JlbWVudCkKK3sKKyNkZWZpbmUgU1RfUEFSQU01ICAgICI0MCIgICAgIC8vIG9mZnNldCBvZiBwYXJhbWV0ZXIgNSAob3V0cHV0SW5kZXgpCisgICAgYXNtKAorICAgICAgICAic3RtZmQgIHNwISwge3I0LCByNSwgcjYsIHI3LCByOCwgcjksIHIxMCwgcjExLCByMTIsIGxyfVxuIgorICAgICAgICAvLyBnZXQgcGFyYW1ldGVycworICAgICAgICAiICAgbGRyIHI2LCBbc3AsICMiIFNUX1BBUkFNNSAiICsgMjBdXG4iICAgIC8vICZwaGFzZUZyYWN0aW9uCisgICAgICAgICIgICBsZHIgcjYsIFtyNl1cbiIgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGhhc2VGcmFjdGlvbgorICAgICAgICAiICAgbGRyIHI3LCBbc3AsICMiIFNUX1BBUkFNNSAiICsgOF1cbiIgICAgIC8vICZpbnB1dEluZGV4CisgICAgICAgICIgICBsZHIgcjcsIFtyN11cbiIgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXRJbmRleAorICAgICAgICAiICAgbGRyIHI4LCBbc3AsICMiIFNUX1BBUkFNNSAiICsgNF1cbiIgICAgIC8vIG91dAorICAgICAgICAiICAgbGRyIHIwLCBbc3AsICMiIFNUX1BBUkFNNSAiICsgMF1cbiIgICAgIC8vICZvdXRwdXRJbmRleAorICAgICAgICAiICAgbGRyIHIwLCBbcjBdXG4iICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG91dHB1dEluZGV4CisgICAgICAgICIgICBhZGQgcjgsIHIwLCBhc2wgIzJcbiIgICAgICAgICAgICAgICAgICAgLy8gY3VyT3V0CisgICAgICAgICIgICBsZHIgcjksIFtzcCwgIyIgU1RfUEFSQU01ICIgKyAyNF1cbiIgICAgLy8gcGhhc2VJbmNyZW1lbnQKKyAgICAgICAgIiAgIGxkciByMTAsIFtzcCwgIyIgU1RfUEFSQU01ICIgKyAxMl1cbiIgICAvLyB2bAorICAgICAgICAiICAgbGRyIHIxMSwgW3NwLCAjIiBTVF9QQVJBTTUgIiArIDE2XVxuIiAgIC8vIHZyCisKKyAgICAgICAgLy8gcjAgcGluLCB4MCwgU2FtcAorCisgICAgICAgIC8vIHIxIGluCisgICAgICAgIC8vIHIyIG1heE91dFB0CisgICAgICAgIC8vIHIzIG1heEluSWR4CisKKyAgICAgICAgLy8gcjQgeDEsIGkxLCBpMywgb3V0MQorICAgICAgICAvLyByNSBvdXQwCisKKyAgICAgICAgLy8gcjYgZnJhYworICAgICAgICAvLyByNyBpbnB1dEluZGV4CisgICAgICAgIC8vIHI4IGN1ck91dAorCisgICAgICAgIC8vIHI5IGluYworICAgICAgICAvLyByMTAgdmwKKyAgICAgICAgLy8gcjExIHZyCisKKyAgICAgICAgLy8gcjEyIHRlbXBvcmFyeQorICAgICAgICAvLyByMTMgc3AKKyAgICAgICAgLy8gcjE0CisKKyAgICAgICAgIi5ZNUwwMTpcbiIKKyAgICAgICAgIiAgIGNtcCByOCwgcjJcbiIgICAgICAgICAgICAgICAgICAgLy8gY3VyT3V0IC0gbWF4Q3VyT3V0CisgICAgICAgICIgICBiY3MgLlk1TDAyXG4iCisKKyNkZWZpbmUgU1RfT05FX0ZSQU1FIFwKKyAgICAiICAgYmljIHI2LCByNiwgIzB4QzAwMDAwMDBcbiIgICAgICAvKiBwaGFzZUZyYWN0aW9uICYgLi4uICovXAorXAorICAgICIgICBhZGQgcjAsIHIxLCByNywgYXNsICMyXG4iICAgICAgIC8qIGluICsgMippbnB1dEluZGV4ICovXAorXAorICAgICIgICBsZHJzaCByNCwgW3IwXVxuIiAgICAgICAgICAgICAgIC8qIGluWzIqaW5wdXRJbmRleF0gKi9cCisgICAgIiAgIGxkciByNSwgW3I4XVxuIiAgICAgICAgICAgICAgICAgLyogb3V0W291dHB1dEluZGV4XSAqL1wKKyAgICAiICAgbGRyc2ggcjEyLCBbcjAsICMtNF1cbiIgICAgICAgICAvKiBpblsyKmlucHV0SW5kZXgtMl0gKi9cCisgICAgIiAgIHN1YiByNCwgcjQsIHIxMlxuIiAgICAgICAgICAgICAgLyogaW5bMipJbnB1dEluZGV4XSAtIGluWzIqSW5wdXRJbmRleC0yXSAqL1wKKyAgICAiICAgbW92IHI0LCByNCwgbHNsICMyXG4iICAgICAgICAgICAvKiA8PDIgKi9cCisgICAgIiAgIHNtdWx3dCByNCwgcjQsIHI2XG4iICAgICAgICAgICAgLyogKHgxLXgwKSouLiAqL1wKKyAgICAiICAgYWRkIHIxMiwgcjEyLCByNFxuIiAgICAgICAgICAgICAvKiB4MCAtICguLikgKi9cCisgICAgIiAgIG1sYSByNSwgcjEyLCByMTAsIHI1XG4iICAgICAgICAgLyogdmwqaW50ZXJwICsgb3V0W10gKi9cCisgICAgIiAgIGxkciByNCwgW3I4LCAjNF1cbiIgICAgICAgICAgICAgLyogb3V0W291dHB1dEluZGV4KzFdICovXAorICAgICIgICBzdHIgcjUsIFtyOF0sICM0XG4iICAgICAgICAgICAgIC8qIG91dFtvdXRwdXRJbmRleCsrXSA9IC4uLiAqL1wKK1wKKyAgICAiICAgbGRyc2ggcjEyLCBbcjAsICMrMl1cbiIgICAgICAgICAvKiBpblsyKmlucHV0SW5kZXgrMV0gKi9cCisgICAgIiAgIGxkcnNoIHIwLCBbcjAsICMtMl1cbiIgICAgICAgICAgLyogaW5bMippbnB1dEluZGV4LTFdICovXAorICAgICIgICBzdWIgcjEyLCByMTIsIHIwXG4iICAgICAgICAgICAgIC8qIGluWzIqSW5wdXRJbmRleF0gLSBpblsyKklucHV0SW5kZXgtMl0gKi9cCisgICAgIiAgIG1vdiByMTIsIHIxMiwgbHNsICMyXG4iICAgICAgICAgLyogPDwyICovXAorICAgICIgICBzbXVsd3QgcjEyLCByMTIsIHI2XG4iICAgICAgICAgIC8qICh4MS14MCkqLi4gKi9cCisgICAgIiAgIGFkZCByMTIsIHIwLCByMTJcbiIgICAgICAgICAgICAgLyogeDAgLSAoLi4pICovXAorICAgICIgICBtbGEgcjQsIHIxMiwgcjExLCByNFxuIiAgICAgICAgIC8qIHZyKmludGVycCArIG91dFtdICovXAorICAgICIgICBzdHIgcjQsIFtyOF0sICM0XG4iICAgICAgICAgICAgIC8qIG91dFtvdXRwdXRJbmRleCsrXSA9IC4uLiAqL1wKK1wKKyAgICAiICAgYWRkIHI2LCByNiwgcjlcbiIgICAgICAgICAgICAgICAvKiBwaGFzZUZyYWN0aW9uICsgcGhhc2VJbmNyZW1lbnQgKi9cCisgICAgIiAgIGFkZCByNywgcjcsIHI2LCBsc3IgIzMwXG4iICAgICAgLyogaW5wdXRJbmRleCArIHBoYXNlRnJhY3Rpb24+PjMwICovCisKKyAgICBTVF9PTkVfRlJBTUUgICAgLy8gZnJhbWUgMQorICAgIFNUX09ORV9GUkFNRSAgICAvLyBmcmFtZSAxCisKKyAgICAgICAgIiAgIGNtcCByNywgcjNcbiIgICAgICAgICAgICAgICAgICAgICAgIC8vIGlucHV0SW5kZXggLSBtYXhJbklkeAorICAgICAgICAiICAgYmNjIC5ZNUwwMVxuIgorICAgICAgICAiLlk1TDAyOlxuIgorCisgICAgICAgICIgICBiaWMgcjYsIHI2LCAjMHhDMDAwMDAwMFxuIiAgICAgICAgICAgICAgLy8gcGhhc2VGcmFjdGlvbiAmIC4uLgorICAgICAgICAvLyBzYXZlIG1vZGlmaWVkIHZhbHVlcworICAgICAgICAiICAgbGRyIHIwLCBbc3AsICMiIFNUX1BBUkFNNSAiICsgMjBdXG4iICAgIC8vICZwaGFzZUZyYWN0aW9uCisgICAgICAgICIgICBzdHIgcjYsIFtyMF1cbiIgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGhhc2VGcmFjdGlvbgorICAgICAgICAiICAgbGRyIHIwLCBbc3AsICMiIFNUX1BBUkFNNSAiICsgOF1cbiIgICAgIC8vICZpbnB1dEluZGV4CisgICAgICAgICIgICBzdHIgcjcsIFtyMF1cbiIgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXRJbmRleAorICAgICAgICAiICAgbGRyIHIwLCBbc3AsICMiIFNUX1BBUkFNNSAiICsgNF1cbiIgICAgIC8vIG91dAorICAgICAgICAiICAgc3ViIHI4LCByMFxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1ck91dCAtIG91dAorICAgICAgICAiICAgYXNyIHI4LCAjMlxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldyBvdXRwdXRJbmRleAorICAgICAgICAiICAgbGRyIHIwLCBbc3AsICMiIFNUX1BBUkFNNSAiICsgMF1cbiIgICAgIC8vICZvdXRwdXRJbmRleAorICAgICAgICAiICAgc3RyIHI4LCBbcjBdXG4iICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgb3V0cHV0SW5kZXgKKworICAgICAgICAiICAgbGRtZmQgICBzcCEsIHtyNCwgcjUsIHI2LCByNywgcjgsIHI5LCByMTAsIHIxMSwgcjEyLCBwY31cbiIKKyAgICApOworfQorCisjZW5kaWYgIC8vIEFTTV9BUk1fUkVTQU1QMQorCisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIH0KIDsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyQ3ViaWMuY3BwIGIvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJDdWJpYy5jcHAKaW5kZXggNGY0MzdiZi4uMWQyNDdiZCAxMDA2NDQKLS0tIGEvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJDdWJpYy5jcHAKKysrIGIvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJDdWJpYy5jcHAKQEAgLTYwLDkgKzYwLDExIEBACiAgICAgdWludDMyX3QgcGhhc2VJbmNyZW1lbnQgPSBtUGhhc2VJbmNyZW1lbnQ7CiAgICAgc2l6ZV90IG91dHB1dEluZGV4ID0gMDsKICAgICBzaXplX3Qgb3V0cHV0U2FtcGxlQ291bnQgPSBvdXRGcmFtZUNvdW50ICogMjsKLSAgICAKKyAgICBzaXplX3QgaW5GcmFtZUNvdW50ID0gKG91dEZyYW1lQ291bnQqbUluU2FtcGxlUmF0ZSkvbVNhbXBsZVJhdGU7CisKICAgICAvLyBmZXRjaCBmaXJzdCBidWZmZXIKLSAgICBpZiAobUJ1ZmZlci5yYXcgPT0gTlVMTCkgeworICAgIGlmIChtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCkgeworICAgICAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSBpbkZyYW1lQ291bnQ7CiAgICAgICAgIHByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZtQnVmZmVyKTsKICAgICAgICAgaWYgKG1CdWZmZXIucmF3ID09IE5VTEwpCiAgICAgICAgICAgICByZXR1cm47CkBAIC03OSw3ICs4MSw3IEBACiAgICAgICAgIG91dFtvdXRwdXRJbmRleCsrXSArPSB2bCAqIGludGVycCgmbGVmdCwgeCk7CiAgICAgICAgIG91dFtvdXRwdXRJbmRleCsrXSArPSB2ciAqIGludGVycCgmcmlnaHQsIHgpOwogICAgICAgICAvLyBvdXRbb3V0cHV0SW5kZXgrK10gKz0gdnIgKiBpbltpbnB1dEluZGV4KjJdOwotICAgICAgICAKKwogICAgICAgICAvLyBpbmNyZW1lbnQgcGhhc2UKICAgICAgICAgcGhhc2VGcmFjdGlvbiArPSBwaGFzZUluY3JlbWVudDsKICAgICAgICAgdWludDMyX3QgaW5kZXhJbmNyZW1lbnQgPSAocGhhc2VGcmFjdGlvbiA+PiBrTnVtUGhhc2VCaXRzKTsKQEAgLTkyLDYgKzk0LDcgQEAKICAgICAgICAgICAgIGlmIChpbnB1dEluZGV4ID09IG1CdWZmZXIuZnJhbWVDb3VudCkgewogICAgICAgICAgICAgICAgIGlucHV0SW5kZXggPSAwOwogICAgICAgICAgICAgICAgIHByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZtQnVmZmVyKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSBpbkZyYW1lQ291bnQ7CiAgICAgICAgICAgICAgICAgcHJvdmlkZXItPmdldE5leHRCdWZmZXIoJm1CdWZmZXIpOwogICAgICAgICAgICAgICAgIGlmIChtQnVmZmVyLnJhdyA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgICBnb3RvIHNhdmVfc3RhdGU7ICAvLyB1Z2x5LCBidXQgZWZmaWNpZW50CkBAIC0xMjIsOSArMTI1LDExIEBACiAgICAgdWludDMyX3QgcGhhc2VJbmNyZW1lbnQgPSBtUGhhc2VJbmNyZW1lbnQ7CiAgICAgc2l6ZV90IG91dHB1dEluZGV4ID0gMDsKICAgICBzaXplX3Qgb3V0cHV0U2FtcGxlQ291bnQgPSBvdXRGcmFtZUNvdW50ICogMjsKLSAgICAKKyAgICBzaXplX3QgaW5GcmFtZUNvdW50ID0gKG91dEZyYW1lQ291bnQqbUluU2FtcGxlUmF0ZSkvbVNhbXBsZVJhdGU7CisKICAgICAvLyBmZXRjaCBmaXJzdCBidWZmZXIKLSAgICBpZiAobUJ1ZmZlci5yYXcgPT0gTlVMTCkgeworICAgIGlmIChtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCkgeworICAgICAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSBpbkZyYW1lQ291bnQ7CiAgICAgICAgIHByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZtQnVmZmVyKTsKICAgICAgICAgaWYgKG1CdWZmZXIucmF3ID09IE5VTEwpCiAgICAgICAgICAgICByZXR1cm47CkBAIC0xNDEsNyArMTQ2LDcgQEAKICAgICAgICAgc2FtcGxlID0gaW50ZXJwKCZsZWZ0LCB4KTsKICAgICAgICAgb3V0W291dHB1dEluZGV4KytdICs9IHZsICogc2FtcGxlOwogICAgICAgICBvdXRbb3V0cHV0SW5kZXgrK10gKz0gdnIgKiBzYW1wbGU7Ci0gICAgICAgIAorCiAgICAgICAgIC8vIGluY3JlbWVudCBwaGFzZQogICAgICAgICBwaGFzZUZyYWN0aW9uICs9IHBoYXNlSW5jcmVtZW50OwogICAgICAgICB1aW50MzJfdCBpbmRleEluY3JlbWVudCA9IChwaGFzZUZyYWN0aW9uID4+IGtOdW1QaGFzZUJpdHMpOwpAQCAtMTU0LDYgKzE1OSw3IEBACiAgICAgICAgICAgICBpZiAoaW5wdXRJbmRleCA9PSBtQnVmZmVyLmZyYW1lQ291bnQpIHsKICAgICAgICAgICAgICAgICBpbnB1dEluZGV4ID0gMDsKICAgICAgICAgICAgICAgICBwcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmbUJ1ZmZlcik7CisgICAgICAgICAgICAgICAgbUJ1ZmZlci5mcmFtZUNvdW50ID0gaW5GcmFtZUNvdW50OwogICAgICAgICAgICAgICAgIHByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZtQnVmZmVyKTsKICAgICAgICAgICAgICAgICBpZiAobUJ1ZmZlci5yYXcgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgZ290byBzYXZlX3N0YXRlOyAgLy8gdWdseSwgYnV0IGVmZmljaWVudApkaWZmIC0tZ2l0IGEvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcCBiL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luYy5jcHAKaW5kZXggZTcxMGQxNi4uOWU1ZTI1NCAxMDA2NDQKLS0tIGEvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcAorKysgYi9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwCkBAIC0yNSwxOCArMjUsMTggQEAKICAqIFRoZXNlIGNvZWZpY2llbnRzIGFyZSBjb21wdXRlZCB3aXRoIHRoZSAiZmlyIiB1dGlsaXR5IGZvdW5kIGluCiAgKiB0b29scy9yZXNhbXBsZXJfdG9vbHMKICAqIFRPRE86IEEgZ29vZCBvcHRpbWl6YXRpb24gd291bGQgYmUgdG8gdHJhbnNwb3NlIHRoaXMgbWF0cml4LCB0byB0YWtlCi0gKiBiZXR0ZXIgYWR2YW50YWdlIG9mIHRoZSBkYXRhLWNhY2hlLiAKKyAqIGJldHRlciBhZHZhbnRhZ2Ugb2YgdGhlIGRhdGEtY2FjaGUuCiAgKi8KIGNvbnN0IGludDMyX3QgQXVkaW9SZXNhbXBsZXJTaW5jOjptRmlyQ29lZnNVcFtdID0gewotCQkweDdmZmZmZmZmLCAweDdmMTVkMDc4LCAweDdjNWUwZGE2LCAweDc3ZWNkODY3LCAweDcxZTJlMjUxLCAweDZhNmMzMDRhLCAweDYxYmU3MjY5LCAweDU4MTcwNDEyLCAweDRkYjhhYjA1LCAweDQyZTkyZWE2LCAweDM3ZWVlMjE0LCAweDJkMGUzYmIxLCAweDIyODc5MzY2LCAweDE4OTUxZTk1LCAweDBmNjkzZDBkLCAweDA3MmQyNjIxLCAKLQkgICAgMHgwMDAwMDAwMCwgMHhmOWY2NjY1NSwgMHhmNTFhNWZkNywgMHhmMTZiYmQ4NCwgMHhlZWUwZDlhYywgMHhlZDY3YTkyMiwgMHhlY2U3MGRlNiwgMHhlZDQwNTg5NywgMHhlZTUwZTUwNSwgMHhlZmYzYmUzMCwgMHhmMjAzMzcwZiwgMHhmNDVhNjc0MSwgMHhmNmQ2N2Q1MywgMHhmOTU3ZGI2NiwgMHhmYmMyZjY0NywgMHhmZTAwZjJiOSwgCi0JICAgIDB4MDAwMDAwMDAsIDB4MDFiMzcyMTgsIDB4MDMxM2EwYzYsIDB4MDQxZDkzMGQsIDB4MDRkMjgwNTcsIDB4MDUzNzMxYjAsIDB4MDU1MzRkZmYsIDB4MDUzMDliZmQsIDB4MDRkYTQ0MGQsIDB4MDQ1YzFhZWUsIDB4MDNjMWZjZGQsIDB4MDMxNzNlZjUsIDB4MDI2NjNhZTgsIDB4MDFiN2Y3MzYsIDB4MDExM2VjNzksIDB4MDA3ZmU2YTksIAotCSAgICAweDAwMDAwMDAwLCAweGZmOTZiMjI5LCAweGZmNDRmOTlmLCAweGZmMGE4NmJlLCAweGZlZTVmODAzLCAweGZlZDUxOGZkLCAweGZlZDUyMWZkLCAweGZlZTJmNGZkLCAweGZlZmI1NGY4LCAweGZmMWIxNTliLCAweGZmM2Y0MjAzLCAweGZmNjUzOWUwLCAweGZmOGFjNTAyLCAweGZmYWUxZGRkLCAweGZmY2RmM2Y5LCAweGZmZTk2Nzk4LCAKLQkgICAgMHgwMDAwMDAwMCwgMHgwMDExOWRlNiwgMHgwMDFlNmI3ZSwgMHgwMDI2Y2I3YSwgMHgwMDJiNDgzMCwgMHgwMDJjODNkNiwgMHgwMDJiMmE4MiwgMHgwMDI3ZTY3YSwgMHgwMDIzNTZmOSwgMHgwMDFlMDk4ZSwgMHgwMDE4NzVlNCwgMHgwMDEyZmJiZSwgMHgwMDBkZTJkMSwgMHgwMDA5NWMxMCwgMHgwMDA1ODQxNCwgMHgwMDAyNjYzNiwgCi0JICAgIDB4MDAwMDAwMDAsIDB4ZmZmZTQ0YTksIDB4ZmZmZDIwNmQsIDB4ZmZmYzdiN2YsIDB4ZmZmYzNjOGYsIDB4ZmZmYzRhYzIsIDB4ZmZmYzhmMmIsIDB4ZmZmY2Y1YzQsIDB4ZmZmZDZkZjMsIDB4ZmZmZGVhYjIsIDB4ZmZmZTYyNzUsIDB4ZmZmZWNlY2YsIDB4ZmZmZjJjMDcsIDB4ZmZmZjc4OGMsIDB4ZmZmZmI0NzEsIDB4ZmZmZmUwZjIsIAotCSAgICAweDAwMDAwMDAwLCAweDAwMDAxM2U2LCAweDAwMDAxZjAzLCAweDAwMDAyMzk2LCAweDAwMDAyMzk5LCAweDAwMDAyMGI2LCAweDAwMDAxYzNjLCAweDAwMDAxNzIyLCAweDAwMDAxMjE2LCAweDAwMDAwZDgxLCAweDAwMDAwOTljLCAweDAwMDAwNjdjLCAweDAwMDAwNDE5LCAweDAwMDAwMjVmLCAweDAwMDAwMTMxLCAweDAwMDAwMDcwLCAKLQkgICAgMHgwMDAwMDAwMCwgMHhmZmZmZmZjNywgMHhmZmZmZmZiMywgMHhmZmZmZmZiMywgMHhmZmZmZmZiZSwgMHhmZmZmZmZjZCwgMHhmZmZmZmZkYiwgMHhmZmZmZmZlNywgMHhmZmZmZmZmMCwgMHhmZmZmZmZmNywgMHhmZmZmZmZmYiwgMHhmZmZmZmZmZSwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgCi0JICAgIDB4MDAwMDAwMDAgLy8gdGhpcyBvbmUgaXMgbmVlZGVkIGZvciBsZXJwaW5nIHRoZSBsYXN0IGNvZWZmaWNpZW50CisgICAgICAgIDB4N2ZmZmZmZmYsIDB4N2YxNWQwNzgsIDB4N2M1ZTBkYTYsIDB4NzdlY2Q4NjcsIDB4NzFlMmUyNTEsIDB4NmE2YzMwNGEsIDB4NjFiZTcyNjksIDB4NTgxNzA0MTIsIDB4NGRiOGFiMDUsIDB4NDJlOTJlYTYsIDB4MzdlZWUyMTQsIDB4MmQwZTNiYjEsIDB4MjI4NzkzNjYsIDB4MTg5NTFlOTUsIDB4MGY2OTNkMGQsIDB4MDcyZDI2MjEsCisgICAgICAgIDB4MDAwMDAwMDAsIDB4ZjlmNjY2NTUsIDB4ZjUxYTVmZDcsIDB4ZjE2YmJkODQsIDB4ZWVlMGQ5YWMsIDB4ZWQ2N2E5MjIsIDB4ZWNlNzBkZTYsIDB4ZWQ0MDU4OTcsIDB4ZWU1MGU1MDUsIDB4ZWZmM2JlMzAsIDB4ZjIwMzM3MGYsIDB4ZjQ1YTY3NDEsIDB4ZjZkNjdkNTMsIDB4Zjk1N2RiNjYsIDB4ZmJjMmY2NDcsIDB4ZmUwMGYyYjksCisgICAgICAgIDB4MDAwMDAwMDAsIDB4MDFiMzcyMTgsIDB4MDMxM2EwYzYsIDB4MDQxZDkzMGQsIDB4MDRkMjgwNTcsIDB4MDUzNzMxYjAsIDB4MDU1MzRkZmYsIDB4MDUzMDliZmQsIDB4MDRkYTQ0MGQsIDB4MDQ1YzFhZWUsIDB4MDNjMWZjZGQsIDB4MDMxNzNlZjUsIDB4MDI2NjNhZTgsIDB4MDFiN2Y3MzYsIDB4MDExM2VjNzksIDB4MDA3ZmU2YTksCisgICAgICAgIDB4MDAwMDAwMDAsIDB4ZmY5NmIyMjksIDB4ZmY0NGY5OWYsIDB4ZmYwYTg2YmUsIDB4ZmVlNWY4MDMsIDB4ZmVkNTE4ZmQsIDB4ZmVkNTIxZmQsIDB4ZmVlMmY0ZmQsIDB4ZmVmYjU0ZjgsIDB4ZmYxYjE1OWIsIDB4ZmYzZjQyMDMsIDB4ZmY2NTM5ZTAsIDB4ZmY4YWM1MDIsIDB4ZmZhZTFkZGQsIDB4ZmZjZGYzZjksIDB4ZmZlOTY3OTgsCisgICAgICAgIDB4MDAwMDAwMDAsIDB4MDAxMTlkZTYsIDB4MDAxZTZiN2UsIDB4MDAyNmNiN2EsIDB4MDAyYjQ4MzAsIDB4MDAyYzgzZDYsIDB4MDAyYjJhODIsIDB4MDAyN2U2N2EsIDB4MDAyMzU2ZjksIDB4MDAxZTA5OGUsIDB4MDAxODc1ZTQsIDB4MDAxMmZiYmUsIDB4MDAwZGUyZDEsIDB4MDAwOTVjMTAsIDB4MDAwNTg0MTQsIDB4MDAwMjY2MzYsCisgICAgICAgIDB4MDAwMDAwMDAsIDB4ZmZmZTQ0YTksIDB4ZmZmZDIwNmQsIDB4ZmZmYzdiN2YsIDB4ZmZmYzNjOGYsIDB4ZmZmYzRhYzIsIDB4ZmZmYzhmMmIsIDB4ZmZmY2Y1YzQsIDB4ZmZmZDZkZjMsIDB4ZmZmZGVhYjIsIDB4ZmZmZTYyNzUsIDB4ZmZmZWNlY2YsIDB4ZmZmZjJjMDcsIDB4ZmZmZjc4OGMsIDB4ZmZmZmI0NzEsIDB4ZmZmZmUwZjIsCisgICAgICAgIDB4MDAwMDAwMDAsIDB4MDAwMDEzZTYsIDB4MDAwMDFmMDMsIDB4MDAwMDIzOTYsIDB4MDAwMDIzOTksIDB4MDAwMDIwYjYsIDB4MDAwMDFjM2MsIDB4MDAwMDE3MjIsIDB4MDAwMDEyMTYsIDB4MDAwMDBkODEsIDB4MDAwMDA5OWMsIDB4MDAwMDA2N2MsIDB4MDAwMDA0MTksIDB4MDAwMDAyNWYsIDB4MDAwMDAxMzEsIDB4MDAwMDAwNzAsCisgICAgICAgIDB4MDAwMDAwMDAsIDB4ZmZmZmZmYzcsIDB4ZmZmZmZmYjMsIDB4ZmZmZmZmYjMsIDB4ZmZmZmZmYmUsIDB4ZmZmZmZmY2QsIDB4ZmZmZmZmZGIsIDB4ZmZmZmZmZTcsIDB4ZmZmZmZmZjAsIDB4ZmZmZmZmZjcsIDB4ZmZmZmZmZmIsIDB4ZmZmZmZmZmUsIDB4ZmZmZmZmZmYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisgICAgICAgIDB4MDAwMDAwMDAgLy8gdGhpcyBvbmUgaXMgbmVlZGVkIGZvciBsZXJwaW5nIHRoZSBsYXN0IGNvZWZmaWNpZW50CiB9OwogCiAvKgpAQCAtNDYsMjAgKzQ2LDIwIEBACiAgKiB0aGVzZSBjb2VmZmljaWVudCBmcm9tIHRoZSBhYm92ZSBieSAiU3RyZXRjaGluZyIgdGhlbSBpbiB0aW1lKS4KICAqLwogY29uc3QgaW50MzJfdCBBdWRpb1Jlc2FtcGxlclNpbmM6Om1GaXJDb2Vmc0Rvd25bXSA9IHsKLQkJMHg3ZmZmZmZmZiwgMHg3ZjU1ZTQ2ZCwgMHg3ZDViNGM2MCwgMHg3YTFiNGI5OCwgMHg3NWE3ZmIxNCwgMHg3MDE5ZjBiZCwgMHg2OThmODc1YSwgMHg2MjJiZmQ1OSwgMHg1YTE2NzI1NiwgMHg1MTc4Y2M1NCwgMHg0ODdlOGU2YywgMHgzZjUzYWFlOCwgMHgzNjIzNWFkNCwgMHgyZDE3MDQ3YiwgMHgyNDU1MzlhYiwgMHgxYzAwZDU0MCwgCi0JICAgIDB4MTQzODNlNTcsIDB4MGQxNGQ1Y2EsIDB4MDZhYTkxMGIsIDB4MDEwN2MzOGIsIDB4ZmMzNTE2NTQsIDB4ZjgzNWFiYWUsIDB4ZjUwNzZiNDUsIDB4ZjJhMzcyMDIsIDB4ZjBmZTlmYWEsIDB4ZjAwYTNiYmQsIDB4ZWZiNGFhODEsIDB4ZWZlYTJiMDUsIDB4ZjA5NTk3MTYsIDB4ZjFhMTFlODMsIDB4ZjJmNmY3YTAsIDB4ZjQ4MWZmZjQsIAotCSAgICAweGY2MmU0OGNlLCAweGY3ZTk4Y2E1LCAweGY5YTM4YjRjLCAweGZiNGU0YmZhLCAweGZjZGU0NTZmLCAweGZlNGE2ZDMwLCAweGZmOGMyZmRmLCAweDAwOWY1NTU1LCAweDAxODFkMzkzLCAweDAyMzM5NDBmLCAweDAyYjYyZjA2LCAweDAzMGNhMDdkLCAweDAzM2FmYTYyLCAweDAzNDYxNzI1LCAweDAzMzM0ZjgzLCAweDAzMDgzNWZhLCAKLQkgICAgMHgwMmNhNTljYywgMHgwMjdmMTJkMSwgMHgwMjJiNTcwZCwgMHgwMWQzOWE0OSwgMHgwMTdiYjc4ZiwgMHgwMTI2ZTQxNCwgMHgwMGQ3YWFhZiwgMHgwMDhmZWVjNywgMHgwMDUwZjU4NCwgMHgwMDFiNzNlMywgMHhmZmVmYTA2MywgMHhmZmNkNDZlZCwgMHhmZmIzZGRjZCwgMHhmZmEyOWFhYSwgMHhmZjk4ODY5MSwgMHhmZjk0OTA2NiwgCi0JICAgIDB4ZmY5NTlkMjQsIDB4ZmY5YTk1OWUsIDB4ZmZhMjcxOTUsIDB4ZmZhYzQwMTEsIDB4ZmZiNzJkMmIsIDB4ZmZjMjg1NjksIDB4ZmZjZGI3MDYsIDB4ZmZkODUxNzEsIDB4ZmZlMjAzNjQsIDB4ZmZlYTk3ZTksIDB4ZmZmMWYyYjIsIDB4ZmZmODBjMDYsIDB4ZmZmY2VjOTIsIDB4MDAwMGE5NTUsIDB4MDAwMzVmZDgsIDB4MDAwNTMyY2YsIAotCSAgICAweDAwMDY0NzM1LCAweDAwMDZjMWY5LCAweDAwMDZjNjJkLCAweDAwMDY3M2JhLCAweDAwMDVlNjhmLCAweDAwMDUzNjMwLCAweDAwMDQ3NWEzLCAweDAwMDNiMzk3LCAweDAwMDJmYWMxLCAweDAwMDI1MjU3LCAweDAwMDFiZTllLCAweDAwMDE0MTdhLCAweDAwMDBkYWZkLCAweDAwMDA4OWViLCAweDAwMDA0YzI4LCAweDAwMDAxZjFkLCAKLQkgICAgMHgwMDAwMDAwMCwgMHhmZmZmZWMxMCwgMHhmZmZmZTBiZSwgMHhmZmZmZGJjNSwgMHhmZmZmZGIzOSwgMHhmZmZmZGQ4YiwgMHhmZmZmZTE4MiwgMHhmZmZmZTYzOCwgMHhmZmZmZWIwYSwgMHhmZmZmZWY4ZiwgMHhmZmZmZjM4YiwgMHhmZmZmZjZlMywgMHhmZmZmZjk5MywgMHhmZmZmZmJhNiwgMHhmZmZmZmQzMCwgMHhmZmZmZmU0YSwgCi0JICAgIDB4ZmZmZmZmMDksIDB4ZmZmZmZmODUsIDB4ZmZmZmZmZDEsIDB4ZmZmZmZmZmIsIDB4MDAwMDAwMGYsIDB4MDAwMDAwMTYsIDB4MDAwMDAwMTUsIDB4MDAwMDAwMTIsIDB4MDAwMDAwMGQsIDB4MDAwMDAwMDksIDB4MDAwMDAwMDYsIDB4MDAwMDAwMDMsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIAotCSAgICAweDAwMDAwMDAwIC8vIHRoaXMgb25lIGlzIG5lZWRlZCBmb3IgbGVycGluZyB0aGUgbGFzdCBjb2VmZmljaWVudAorICAgICAgICAweDdmZmZmZmZmLCAweDdmNTVlNDZkLCAweDdkNWI0YzYwLCAweDdhMWI0Yjk4LCAweDc1YTdmYjE0LCAweDcwMTlmMGJkLCAweDY5OGY4NzVhLCAweDYyMmJmZDU5LCAweDVhMTY3MjU2LCAweDUxNzhjYzU0LCAweDQ4N2U4ZTZjLCAweDNmNTNhYWU4LCAweDM2MjM1YWQ0LCAweDJkMTcwNDdiLCAweDI0NTUzOWFiLCAweDFjMDBkNTQwLAorICAgICAgICAweDE0MzgzZTU3LCAweDBkMTRkNWNhLCAweDA2YWE5MTBiLCAweDAxMDdjMzhiLCAweGZjMzUxNjU0LCAweGY4MzVhYmFlLCAweGY1MDc2YjQ1LCAweGYyYTM3MjAyLCAweGYwZmU5ZmFhLCAweGYwMGEzYmJkLCAweGVmYjRhYTgxLCAweGVmZWEyYjA1LCAweGYwOTU5NzE2LCAweGYxYTExZTgzLCAweGYyZjZmN2EwLCAweGY0ODFmZmY0LAorICAgICAgICAweGY2MmU0OGNlLCAweGY3ZTk4Y2E1LCAweGY5YTM4YjRjLCAweGZiNGU0YmZhLCAweGZjZGU0NTZmLCAweGZlNGE2ZDMwLCAweGZmOGMyZmRmLCAweDAwOWY1NTU1LCAweDAxODFkMzkzLCAweDAyMzM5NDBmLCAweDAyYjYyZjA2LCAweDAzMGNhMDdkLCAweDAzM2FmYTYyLCAweDAzNDYxNzI1LCAweDAzMzM0ZjgzLCAweDAzMDgzNWZhLAorICAgICAgICAweDAyY2E1OWNjLCAweDAyN2YxMmQxLCAweDAyMmI1NzBkLCAweDAxZDM5YTQ5LCAweDAxN2JiNzhmLCAweDAxMjZlNDE0LCAweDAwZDdhYWFmLCAweDAwOGZlZWM3LCAweDAwNTBmNTg0LCAweDAwMWI3M2UzLCAweGZmZWZhMDYzLCAweGZmY2Q0NmVkLCAweGZmYjNkZGNkLCAweGZmYTI5YWFhLCAweGZmOTg4NjkxLCAweGZmOTQ5MDY2LAorICAgICAgICAweGZmOTU5ZDI0LCAweGZmOWE5NTllLCAweGZmYTI3MTk1LCAweGZmYWM0MDExLCAweGZmYjcyZDJiLCAweGZmYzI4NTY5LCAweGZmY2RiNzA2LCAweGZmZDg1MTcxLCAweGZmZTIwMzY0LCAweGZmZWE5N2U5LCAweGZmZjFmMmIyLCAweGZmZjgwYzA2LCAweGZmZmNlYzkyLCAweDAwMDBhOTU1LCAweDAwMDM1ZmQ4LCAweDAwMDUzMmNmLAorICAgICAgICAweDAwMDY0NzM1LCAweDAwMDZjMWY5LCAweDAwMDZjNjJkLCAweDAwMDY3M2JhLCAweDAwMDVlNjhmLCAweDAwMDUzNjMwLCAweDAwMDQ3NWEzLCAweDAwMDNiMzk3LCAweDAwMDJmYWMxLCAweDAwMDI1MjU3LCAweDAwMDFiZTllLCAweDAwMDE0MTdhLCAweDAwMDBkYWZkLCAweDAwMDA4OWViLCAweDAwMDA0YzI4LCAweDAwMDAxZjFkLAorICAgICAgICAweDAwMDAwMDAwLCAweGZmZmZlYzEwLCAweGZmZmZlMGJlLCAweGZmZmZkYmM1LCAweGZmZmZkYjM5LCAweGZmZmZkZDhiLCAweGZmZmZlMTgyLCAweGZmZmZlNjM4LCAweGZmZmZlYjBhLCAweGZmZmZlZjhmLCAweGZmZmZmMzhiLCAweGZmZmZmNmUzLCAweGZmZmZmOTkzLCAweGZmZmZmYmE2LCAweGZmZmZmZDMwLCAweGZmZmZmZTRhLAorICAgICAgICAweGZmZmZmZjA5LCAweGZmZmZmZjg1LCAweGZmZmZmZmQxLCAweGZmZmZmZmZiLCAweDAwMDAwMDBmLCAweDAwMDAwMDE2LCAweDAwMDAwMDE1LCAweDAwMDAwMDEyLCAweDAwMDAwMDBkLCAweDAwMDAwMDA5LCAweDAwMDAwMDA2LCAweDAwMDAwMDAzLCAweDAwMDAwMDAyLCAweDAwMDAwMDAxLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorICAgICAgICAweDAwMDAwMDAwIC8vIHRoaXMgb25lIGlzIG5lZWRlZCBmb3IgbGVycGluZyB0aGUgbGFzdCBjb2VmZmljaWVudAogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1zdGF0aWMgaW5saW5lIAorc3RhdGljIGlubGluZQogaW50MzJfdCBtdWxSTChpbnQgbGVmdCwgaW50MzJfdCBpbiwgdWludDMyX3QgdlJMKQogewogI2lmIGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX190aHVtYl9fKQpAQCAtODUsNyArODUsNyBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyBpbmxpbmUgCitzdGF0aWMgaW5saW5lCiBpbnQzMl90IG11bEFkZChpbnQxNl90IGluLCBpbnQzMl90IHYsIGludDMyX3QgYSkKIHsKICNpZiBkZWZpbmVkKF9fYXJtX18pICYmICFkZWZpbmVkKF9fdGh1bWJfXykKQEAgLTk1LDEyICs5NSwxNCBAQAogICAgICAgICAgOiBbaW5dIiVyIihpbiksIFt2XSJyIih2KSwgW2FdInIiKGEpCiAgICAgICAgICA6ICk7CiAgICAgcmV0dXJuIG91dDsKLSNlbHNlICAgIAotICAgIHJldHVybiBhICsgKChpbiAqIGludDMyX3QodikpPj4xNik7CisjZWxzZQorICAgIHJldHVybiBhICsgaW4gKiAodj4+MTYpOworICAgIC8vIGltcHJvdmVkIHByZWNpc2lvbgorICAgIC8vIHJldHVybiBhICsgaW4gKiAodj4+MTYpICsgKChpbiAqICh2ICYgMHhmZmZmKSkgPj4gMTYpOwogI2VuZGlmCiB9CiAKLXN0YXRpYyBpbmxpbmUgCitzdGF0aWMgaW5saW5lCiBpbnQzMl90IG11bEFkZFJMKGludCBsZWZ0LCB1aW50MzJfdCBpblJMLCBpbnQzMl90IHYsIGludDMyX3QgYSkKIHsKICNpZiBkZWZpbmVkKF9fYXJtX18pICYmICFkZWZpbmVkKF9fdGh1bWJfXykKQEAgLTExOSw5ICsxMjEsMTEgQEAKICAgICByZXR1cm4gb3V0OwogI2Vsc2UKICAgICBpZiAobGVmdCkgewotICAgICAgICByZXR1cm4gYSArICgoaW50MTZfdChpblJMJjB4RkZGRikgKiBpbnQzMl90KHYpKT4+MTYpOworICAgICAgICByZXR1cm4gYSArIChpbnQxNl90KGluUkwmMHhGRkZGKSAqICh2Pj4xNikpOworICAgICAgICAvL2ltcHJvdmVkIHByZWNpc2lvbgorICAgICAgICAvLyByZXR1cm4gYSArIChpbnQxNl90KGluUkwmMHhGRkZGKSAqICh2Pj4xNikpICsgKChpbnQxNl90KGluUkwmMHhGRkZGKSAqICh2ICYgMHhmZmZmKSkgPj4gMTYpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBhICsgKChpbnQxNl90KGluUkw+PjE2KSAqIGludDMyX3QodikpPj4xNik7CisgICAgICAgIHJldHVybiBhICsgKGludDE2X3QoaW5STD4+MTYpICogKHY+PjE2KSk7CiAgICAgfQogI2VuZGlmCiB9CkBAIC0xMjksMzcgKzEzMywzNyBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBBdWRpb1Jlc2FtcGxlclNpbmM6OkF1ZGlvUmVzYW1wbGVyU2luYyhpbnQgYml0RGVwdGgsCi0JCWludCBpbkNoYW5uZWxDb3VudCwgaW50MzJfdCBzYW1wbGVSYXRlKQotCTogQXVkaW9SZXNhbXBsZXIoYml0RGVwdGgsIGluQ2hhbm5lbENvdW50LCBzYW1wbGVSYXRlKSwKLQltU3RhdGUoMCkKKyAgICAgICAgaW50IGluQ2hhbm5lbENvdW50LCBpbnQzMl90IHNhbXBsZVJhdGUpCisgICAgOiBBdWRpb1Jlc2FtcGxlcihiaXREZXB0aCwgaW5DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUpLAorICAgIG1TdGF0ZSgwKQogewotCS8qIAotCSAqIExheW91dCBvZiB0aGUgc3RhdGUgYnVmZmVyIGZvciAzMiB0YXA6Ci0JICogCi0JICogInByZXNlbnQiIHNhbXBsZSAgICAgICAgICAgIGJlZ2lubmluZyBvZiAybmQgYnVmZmVyCi0JICogICAgICAgICAgICAgICAgIHYgICAgICAgICAgICAgICAgdgotCSAqICAwICAgICAgICAgICAgICAwMSAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgIDIzICAgICAgICAgICAgICAzCi0JICogIDAgICAgICAgICAgICAgIEYwICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgRjAgICAgICAgICAgICAgIEYKLQkgKiBbcHBwcHBwcHBwcHBwcHBwSW5ubm5ubm5ubm5ubm5ubm5wcHBwcHBwcHBwcHBwcHBJbm5ubm5ubm5ubm5ubm5ubl0KLQkgKiAgICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgIF4gaGVhZAotCSAqIAotCSAqIHAgPSBwYXN0IHNhbXBsZXMsIGNvbnZvbHV0ZWQgd2l0aCB0aGUgKHApb3NpdGl2ZSBzaWRlIG9mIHNpbmMoKQotCSAqIG4gPSBmdXR1cmUgc2FtcGxlcywgY29udm9sdXRlZCB3aXRoIHRoZSAobillZ2F0aXZlIHNpZGUgb2Ygc2luYygpCi0JICogciA9IGV4dHJhIHNwYWNlIGZvciBpbXBsZW1lbnRpbmcgdGhlIHJpbmcgYnVmZmVyCi0JICogCi0JICovCisgICAgLyoKKyAgICAgKiBMYXlvdXQgb2YgdGhlIHN0YXRlIGJ1ZmZlciBmb3IgMzIgdGFwOgorICAgICAqCisgICAgICogInByZXNlbnQiIHNhbXBsZSAgICAgICAgICAgIGJlZ2lubmluZyBvZiAybmQgYnVmZmVyCisgICAgICogICAgICAgICAgICAgICAgIHYgICAgICAgICAgICAgICAgdgorICAgICAqICAwICAgICAgICAgICAgICAwMSAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgIDIzICAgICAgICAgICAgICAzCisgICAgICogIDAgICAgICAgICAgICAgIEYwICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgRjAgICAgICAgICAgICAgIEYKKyAgICAgKiBbcHBwcHBwcHBwcHBwcHBwSW5ubm5ubm5ubm5ubm5ubm5wcHBwcHBwcHBwcHBwcHBJbm5ubm5ubm5ubm5ubm5ubl0KKyAgICAgKiAgICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgIF4gaGVhZAorICAgICAqCisgICAgICogcCA9IHBhc3Qgc2FtcGxlcywgY29udm9sdXRlZCB3aXRoIHRoZSAocClvc2l0aXZlIHNpZGUgb2Ygc2luYygpCisgICAgICogbiA9IGZ1dHVyZSBzYW1wbGVzLCBjb252b2x1dGVkIHdpdGggdGhlIChuKWVnYXRpdmUgc2lkZSBvZiBzaW5jKCkKKyAgICAgKiByID0gZXh0cmEgc3BhY2UgZm9yIGltcGxlbWVudGluZyB0aGUgcmluZyBidWZmZXIKKyAgICAgKgorICAgICAqLwogCi0JY29uc3Qgc2l6ZV90IG51bUNvZWZzID0gMipoYWxmTnVtQ29lZnM7Ci0JY29uc3Qgc2l6ZV90IHN0YXRlU2l6ZSA9IG51bUNvZWZzICogaW5DaGFubmVsQ291bnQgKiAyOwotCW1TdGF0ZSA9IG5ldyBpbnQxNl90W3N0YXRlU2l6ZV07Ci0JbWVtc2V0KG1TdGF0ZSwgMCwgc2l6ZW9mKGludDE2X3QpKnN0YXRlU2l6ZSk7Ci0JbUltcHVsc2UgPSBtU3RhdGUgKyAoaGFsZk51bUNvZWZzLTEpKmluQ2hhbm5lbENvdW50OwotCW1SaW5nRnVsbCA9IG1JbXB1bHNlICsgKG51bUNvZWZzKzEpKmluQ2hhbm5lbENvdW50OworICAgIGNvbnN0IHNpemVfdCBudW1Db2VmcyA9IDIqaGFsZk51bUNvZWZzOworICAgIGNvbnN0IHNpemVfdCBzdGF0ZVNpemUgPSBudW1Db2VmcyAqIGluQ2hhbm5lbENvdW50ICogMjsKKyAgICBtU3RhdGUgPSBuZXcgaW50MTZfdFtzdGF0ZVNpemVdOworICAgIG1lbXNldChtU3RhdGUsIDAsIHNpemVvZihpbnQxNl90KSpzdGF0ZVNpemUpOworICAgIG1JbXB1bHNlID0gbVN0YXRlICsgKGhhbGZOdW1Db2Vmcy0xKSppbkNoYW5uZWxDb3VudDsKKyAgICBtUmluZ0Z1bGwgPSBtSW1wdWxzZSArIChudW1Db2VmcysxKSppbkNoYW5uZWxDb3VudDsKIH0KIAogQXVkaW9SZXNhbXBsZXJTaW5jOjp+QXVkaW9SZXNhbXBsZXJTaW5jKCkKIHsKLQlkZWxldGUgW10gbVN0YXRlOworICAgIGRlbGV0ZSBbXSBtU3RhdGU7CiB9CiAKIHZvaWQgQXVkaW9SZXNhbXBsZXJTaW5jOjppbml0KCkgewpAQCAtMTY4LDkgKzE3Miw5IEBACiB2b2lkIEF1ZGlvUmVzYW1wbGVyU2luYzo6cmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKQogewotCW1GaXJDb2VmcyA9IChtSW5TYW1wbGVSYXRlIDw9IG1TYW1wbGVSYXRlKSA/IG1GaXJDb2Vmc1VwIDogbUZpckNvZWZzRG93bjsKKyAgICBtRmlyQ29lZnMgPSAobUluU2FtcGxlUmF0ZSA8PSBtU2FtcGxlUmF0ZSkgPyBtRmlyQ29lZnNVcCA6IG1GaXJDb2Vmc0Rvd247CiAKLQkvLyBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIHJlc2FtcGxlcgorICAgIC8vIHNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgcmVzYW1wbGVyCiAgICAgc3dpdGNoIChtQ2hhbm5lbENvdW50KSB7CiAgICAgY2FzZSAxOgogICAgICAgICByZXNhbXBsZTwxPihvdXQsIG91dEZyYW1lQ291bnQsIHByb3ZpZGVyKTsKQEAgLTE5Myw0MyArMTk3LDY4IEBACiAgICAgdWludDMyX3QgcGhhc2VJbmNyZW1lbnQgPSBtUGhhc2VJbmNyZW1lbnQ7CiAgICAgc2l6ZV90IG91dHB1dEluZGV4ID0gMDsKICAgICBzaXplX3Qgb3V0cHV0U2FtcGxlQ291bnQgPSBvdXRGcmFtZUNvdW50ICogMjsKKyAgICBzaXplX3QgaW5GcmFtZUNvdW50ID0gKG91dEZyYW1lQ291bnQqbUluU2FtcGxlUmF0ZSkvbVNhbXBsZVJhdGU7CiAKICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXImIGJ1ZmZlcihtQnVmZmVyKTsKICAgICB3aGlsZSAob3V0cHV0SW5kZXggPCBvdXRwdXRTYW1wbGVDb3VudCkgewogICAgICAgICAvLyBidWZmZXIgaXMgZW1wdHksIGZldGNoIGEgbmV3IG9uZQotICAgICAgICBpZiAoYnVmZmVyLnJhdyA9PSBOVUxMKSB7CisgICAgICAgIHdoaWxlIChidWZmZXIuZnJhbWVDb3VudCA9PSAwKSB7CisgICAgICAgICAgICBidWZmZXIuZnJhbWVDb3VudCA9IGluRnJhbWVDb3VudDsKICAgICAgICAgICAgIHByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZidWZmZXIpOwotICAgICAgICAgICAgaWYgKGJ1ZmZlci5yYXcgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAJCWNvbnN0IHVpbnQzMl90IHBoYXNlSW5kZXggPSBwaGFzZUZyYWN0aW9uID4+IGtOdW1QaGFzZUJpdHM7Ci0gICAgICAgIAlpZiAocGhhc2VJbmRleCkgewotICAgICAgICAJCXJlYWQ8Q0hBTk5FTFM+KGltcHVsc2UsIHBoYXNlRnJhY3Rpb24sIGJ1ZmZlci5pMTYsIGlucHV0SW5kZXgpOworICAgICAgICAgICAgaWYgKGJ1ZmZlci5yYXcgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGdvdG8gcmVzYW1wbGVfZXhpdDsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHBoYXNlSW5kZXggPSBwaGFzZUZyYWN0aW9uID4+IGtOdW1QaGFzZUJpdHM7CisgICAgICAgICAgICBpZiAocGhhc2VJbmRleCA9PSAxKSB7CisgICAgICAgICAgICAgICAgLy8gcmVhZCBvbmUgZnJhbWUKKyAgICAgICAgICAgICAgICByZWFkPENIQU5ORUxTPihpbXB1bHNlLCBwaGFzZUZyYWN0aW9uLCBidWZmZXIuaTE2LCBpbnB1dEluZGV4KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocGhhc2VJbmRleCA9PSAyKSB7CisgICAgICAgICAgICAgICAgLy8gcmVhZCAyIGZyYW1lcworICAgICAgICAgICAgICAgIHJlYWQ8Q0hBTk5FTFM+KGltcHVsc2UsIHBoYXNlRnJhY3Rpb24sIGJ1ZmZlci5pMTYsIGlucHV0SW5kZXgpOworICAgICAgICAgICAgICAgIGlucHV0SW5kZXgrKzsKKyAgICAgICAgICAgICAgICBpZiAoaW5wdXRJbmRleCA+PSBtQnVmZmVyLmZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRJbmRleCAtPSBtQnVmZmVyLmZyYW1lQ291bnQ7CisgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZidWZmZXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJlYWQ8Q0hBTk5FTFM+KGltcHVsc2UsIHBoYXNlRnJhY3Rpb24sIGJ1ZmZlci5pMTYsIGlucHV0SW5kZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGludDE2X3QgKmluID0gYnVmZmVyLmkxNjsKLSAgICAJY29uc3Qgc2l6ZV90IGZyYW1lQ291bnQgPSBidWZmZXIuZnJhbWVDb3VudDsKKyAgICAgICAgY29uc3Qgc2l6ZV90IGZyYW1lQ291bnQgPSBidWZmZXIuZnJhbWVDb3VudDsKIAotICAgIAkvLyBBbHdheXMgcmVhZC1pbiB0aGUgZmlyc3Qgc2FtcGxlcyBmcm9tIHRoZSBpbnB1dCBidWZmZXIKLSAgICAJaW50MTZfdCogaGVhZCA9IGltcHVsc2UgKyBoYWxmTnVtQ29lZnMqQ0hBTk5FTFM7Ci0JCWhlYWRbMF0gPSBpbltpbnB1dEluZGV4KkNIQU5ORUxTICsgMF07Ci0JCWlmIChDSEFOTkVMUyA9PSAyKQotCQkJaGVhZFsxXSA9IGluW2lucHV0SW5kZXgqQ0hBTk5FTFMgKyAxXTsKKyAgICAgICAgLy8gQWx3YXlzIHJlYWQtaW4gdGhlIGZpcnN0IHNhbXBsZXMgZnJvbSB0aGUgaW5wdXQgYnVmZmVyCisgICAgICAgIGludDE2X3QqIGhlYWQgPSBpbXB1bHNlICsgaGFsZk51bUNvZWZzKkNIQU5ORUxTOworICAgICAgICBoZWFkWzBdID0gaW5baW5wdXRJbmRleCpDSEFOTkVMUyArIDBdOworICAgICAgICBpZiAoQ0hBTk5FTFMgPT0gMikKKyAgICAgICAgICAgIGhlYWRbMV0gPSBpbltpbnB1dEluZGV4KkNIQU5ORUxTICsgMV07CiAKICAgICAgICAgLy8gaGFuZGxlIGJvdW5kYXJ5IGNhc2UKLSAgICAJaW50MzJfdCBsLCByOworICAgICAgICBpbnQzMl90IGwsIHI7CiAgICAgICAgIHdoaWxlIChvdXRwdXRJbmRleCA8IG91dHB1dFNhbXBsZUNvdW50KSB7Ci0gICAgICAgIAlmaWx0ZXJDb2VmZmljaWVudDxDSEFOTkVMUz4obCwgciwgcGhhc2VGcmFjdGlvbiwgaW1wdWxzZSk7Ci0gICAgCQlvdXRbb3V0cHV0SW5kZXgrK10gPSBtdWxSTCgxLCBsLCB2UkwpOwotICAgIAkJb3V0W291dHB1dEluZGV4KytdID0gbXVsUkwoMCwgciwgdlJMKTsKKyAgICAgICAgICAgIGZpbHRlckNvZWZmaWNpZW50PENIQU5ORUxTPihsLCByLCBwaGFzZUZyYWN0aW9uLCBpbXB1bHNlKTsKKyAgICAgICAgICAgIG91dFtvdXRwdXRJbmRleCsrXSArPSAyICogbXVsUkwoMSwgbCwgdlJMKTsKKyAgICAgICAgICAgIG91dFtvdXRwdXRJbmRleCsrXSArPSAyICogbXVsUkwoMCwgciwgdlJMKTsKIAotICAgICAgICAJcGhhc2VGcmFjdGlvbiArPSBwaGFzZUluY3JlbWVudDsKLSAgICAJCWNvbnN0IHVpbnQzMl90IHBoYXNlSW5kZXggPSBwaGFzZUZyYWN0aW9uID4+IGtOdW1QaGFzZUJpdHM7Ci0gICAgICAgIAlpZiAocGhhc2VJbmRleCkgewotICAgICAgICAJCWlucHV0SW5kZXggKz0gcGhhc2VJbmRleDsKLSAgICAgICAgCQlpZiAoaW5wdXRJbmRleCA+PSBmcmFtZUNvdW50KQotICAgICAgICAJCQlicmVhazsKLSAgICAgICAgCQlyZWFkPENIQU5ORUxTPihpbXB1bHNlLCBwaGFzZUZyYWN0aW9uLCBpbiwgaW5wdXRJbmRleCk7Ci0gICAgICAgIAl9CisgICAgICAgICAgICBwaGFzZUZyYWN0aW9uICs9IHBoYXNlSW5jcmVtZW50OworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgcGhhc2VJbmRleCA9IHBoYXNlRnJhY3Rpb24gPj4ga051bVBoYXNlQml0czsKKyAgICAgICAgICAgIGlmIChwaGFzZUluZGV4ID09IDEpIHsKKyAgICAgICAgICAgICAgICBpbnB1dEluZGV4Kys7CisgICAgICAgICAgICAgICAgaWYgKGlucHV0SW5kZXggPj0gZnJhbWVDb3VudCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAvLyBuZWVkIGEgbmV3IGJ1ZmZlcgorICAgICAgICAgICAgICAgIHJlYWQ8Q0hBTk5FTFM+KGltcHVsc2UsIHBoYXNlRnJhY3Rpb24sIGluLCBpbnB1dEluZGV4KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZihwaGFzZUluZGV4ID09IDIpIHsgICAgLy8gbWF4aW11bSB2YWx1ZQorICAgICAgICAgICAgICAgIGlucHV0SW5kZXgrKzsKKyAgICAgICAgICAgICAgICBpZiAoaW5wdXRJbmRleCA+PSBmcmFtZUNvdW50KQorICAgICAgICAgICAgICAgICAgICBicmVhazsgIC8vIDAgZnJhbWUgYXZhaWxhYmxlLCAyIGZyYW1lcyBuZWVkZWQKKyAgICAgICAgICAgICAgICAvLyByZWFkIGZpcnN0IGZyYW1lCisgICAgICAgICAgICAgICAgcmVhZDxDSEFOTkVMUz4oaW1wdWxzZSwgcGhhc2VGcmFjdGlvbiwgaW4sIGlucHV0SW5kZXgpOworICAgICAgICAgICAgICAgIGlucHV0SW5kZXgrKzsKKyAgICAgICAgICAgICAgICBpZiAoaW5wdXRJbmRleCA+PSBmcmFtZUNvdW50KQorICAgICAgICAgICAgICAgICAgICBicmVhazsgIC8vIDAgZnJhbWUgYXZhaWxhYmxlLCAxIGZyYW1lIG5lZWRlZAorICAgICAgICAgICAgICAgIC8vIHJlYWQgc2Vjb25kIGZyYW1lCisgICAgICAgICAgICAgICAgcmVhZDxDSEFOTkVMUz4oaW1wdWxzZSwgcGhhc2VGcmFjdGlvbiwgaW4sIGlucHV0SW5kZXgpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLy8gaWYgZG9uZSB3aXRoIGJ1ZmZlciwgc2F2ZSBzYW1wbGVzCkBAIC0yMzksODAgKzI2OCw4OSBAQAogICAgICAgICB9CiAgICAgfQogCityZXNhbXBsZV9leGl0OgogICAgIG1JbXB1bHNlID0gaW1wdWxzZTsKICAgICBtSW5wdXRJbmRleCA9IGlucHV0SW5kZXg7CiAgICAgbVBoYXNlRnJhY3Rpb24gPSBwaGFzZUZyYWN0aW9uOwogfQogCiB0ZW1wbGF0ZTxpbnQgQ0hBTk5FTFM+CisvKioqCisqIHJlYWQoKQorKgorKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIG9ubHkgb25lIGZyYW1lIGZyb20gaW5wdXQgYnVmZmVyIGFuZCB3cml0ZXMgaXQgaW4KKyogc3RhdGUgYnVmZmVyCisqCisqKi8KIHZvaWQgQXVkaW9SZXNhbXBsZXJTaW5jOjpyZWFkKAotCQlpbnQxNl90KiYgaW1wdWxzZSwgdWludDMyX3QmIHBoYXNlRnJhY3Rpb24sCi0JCWludDE2X3QgY29uc3QqIGluLCBzaXplX3QgaW5wdXRJbmRleCkKKyAgICAgICAgaW50MTZfdComIGltcHVsc2UsIHVpbnQzMl90JiBwaGFzZUZyYWN0aW9uLAorICAgICAgICBpbnQxNl90IGNvbnN0KiBpbiwgc2l6ZV90IGlucHV0SW5kZXgpCiB7Ci0JLy8gcmVhZCBuZXcgc2FtcGxlcyBpbnRvIHRoZSByaW5nIGJ1ZmZlcgotCXdoaWxlIChwaGFzZUZyYWN0aW9uID4+IGtOdW1QaGFzZUJpdHMpIHsKLQkJY29uc3QgdWludDMyX3QgcGhhc2VJbmRleCA9IHBoYXNlRnJhY3Rpb24gPj4ga051bVBoYXNlQml0czsKLQkJaW1wdWxzZSArPSBDSEFOTkVMUzsKLQkJcGhhc2VGcmFjdGlvbiAtPSAxTFU8PGtOdW1QaGFzZUJpdHM7Ci0JCWlmIChpbXB1bHNlID49IG1SaW5nRnVsbCkgewotCQkJY29uc3Qgc2l6ZV90IHN0YXRlU2l6ZSA9IChoYWxmTnVtQ29lZnMqMikqQ0hBTk5FTFM7Ci0JCQltZW1jcHkobVN0YXRlLCBtU3RhdGUrc3RhdGVTaXplLCBzaXplb2YoaW50MTZfdCkqc3RhdGVTaXplKTsKLQkJCWltcHVsc2UgLT0gc3RhdGVTaXplOwotCQl9Ci0JCWludDE2X3QqIGhlYWQgPSBpbXB1bHNlICsgaGFsZk51bUNvZWZzKkNIQU5ORUxTOwotCQloZWFkWzBdID0gaW5baW5wdXRJbmRleCpDSEFOTkVMUyArIDBdOwotCQlpZiAoQ0hBTk5FTFMgPT0gMikKLQkJCWhlYWRbMV0gPSBpbltpbnB1dEluZGV4KkNIQU5ORUxTICsgMV07Ci0JfQorICAgIGNvbnN0IHVpbnQzMl90IHBoYXNlSW5kZXggPSBwaGFzZUZyYWN0aW9uID4+IGtOdW1QaGFzZUJpdHM7CisgICAgaW1wdWxzZSArPSBDSEFOTkVMUzsKKyAgICBwaGFzZUZyYWN0aW9uIC09IDFMVTw8a051bVBoYXNlQml0czsKKyAgICBpZiAoaW1wdWxzZSA+PSBtUmluZ0Z1bGwpIHsKKyAgICAgICAgY29uc3Qgc2l6ZV90IHN0YXRlU2l6ZSA9IChoYWxmTnVtQ29lZnMqMikqQ0hBTk5FTFM7CisgICAgICAgIG1lbWNweShtU3RhdGUsIG1TdGF0ZStzdGF0ZVNpemUsIHNpemVvZihpbnQxNl90KSpzdGF0ZVNpemUpOworICAgICAgICBpbXB1bHNlIC09IHN0YXRlU2l6ZTsKKyAgICB9CisgICAgaW50MTZfdCogaGVhZCA9IGltcHVsc2UgKyBoYWxmTnVtQ29lZnMqQ0hBTk5FTFM7CisgICAgaGVhZFswXSA9IGluW2lucHV0SW5kZXgqQ0hBTk5FTFMgKyAwXTsKKyAgICBpZiAoQ0hBTk5FTFMgPT0gMikKKyAgICAgICAgaGVhZFsxXSA9IGluW2lucHV0SW5kZXgqQ0hBTk5FTFMgKyAxXTsKIH0KIAogdGVtcGxhdGU8aW50IENIQU5ORUxTPgogdm9pZCBBdWRpb1Jlc2FtcGxlclNpbmM6OmZpbHRlckNvZWZmaWNpZW50KAotCQlpbnQzMl90JiBsLCBpbnQzMl90JiByLCB1aW50MzJfdCBwaGFzZSwgaW50MTZfdCBjb25zdCAqc2FtcGxlcykKLXsJCi0JLy8gY29tcHV0ZSB0aGUgaW5kZXggb2YgdGhlIGNvZWZmaWNpZW50IG9uIHRoZSBwb3NpdGl2ZSBzaWRlIGFuZAotCS8vIG5lZ2F0aXZlIHNpZGUKLQl1aW50MzJfdCBpbmRleFAgPSAocGhhc2UgJiBjTWFzaykgPj4gY1NoaWZ0OwotCXVpbnQxNl90IGxlcnBQICA9IChwaGFzZSAmIHBNYXNrKSA+PiBwU2hpZnQ7Ci0JdWludDMyX3QgaW5kZXhOID0gKC1waGFzZSAmIGNNYXNrKSA+PiBjU2hpZnQ7Ci0JdWludDE2X3QgbGVycE4gID0gKC1waGFzZSAmIHBNYXNrKSA+PiBwU2hpZnQ7Ci0JCi0JbCA9IDA7Ci0JciA9IDA7Ci0JaW50MzJfdCBjb25zdCogY29lZnMgPSBtRmlyQ29lZnM7Ci0JaW50MTZfdCBjb25zdCAqc1AgPSBzYW1wbGVzOwotCWludDE2X3QgY29uc3QgKnNOID0gc2FtcGxlcytDSEFOTkVMUzsKLQlmb3IgKHVuc2lnbmVkIGludCBpPTAgOyBpPGhhbGZOdW1Db2Vmcy80IDsgaSsrKSB7Ci0JCWludGVycG9sYXRlPENIQU5ORUxTPihsLCByLCBjb2VmcytpbmRleFAsIGxlcnBQLCBzUCk7Ci0JCWludGVycG9sYXRlPENIQU5ORUxTPihsLCByLCBjb2VmcytpbmRleE4sIGxlcnBOLCBzTik7Ci0JCXNQIC09IENIQU5ORUxTOyBzTiArPSBDSEFOTkVMUzsgY29lZnMgKz0gMTw8Y29lZnNCaXRzOworICAgICAgICBpbnQzMl90JiBsLCBpbnQzMl90JiByLCB1aW50MzJfdCBwaGFzZSwgaW50MTZfdCBjb25zdCAqc2FtcGxlcykKK3sKKyAgICAvLyBjb21wdXRlIHRoZSBpbmRleCBvZiB0aGUgY29lZmZpY2llbnQgb24gdGhlIHBvc2l0aXZlIHNpZGUgYW5kCisgICAgLy8gbmVnYXRpdmUgc2lkZQorICAgIHVpbnQzMl90IGluZGV4UCA9IChwaGFzZSAmIGNNYXNrKSA+PiBjU2hpZnQ7CisgICAgdWludDE2X3QgbGVycFAgID0gKHBoYXNlICYgcE1hc2spID4+IHBTaGlmdDsKKyAgICB1aW50MzJfdCBpbmRleE4gPSAoLXBoYXNlICYgY01hc2spID4+IGNTaGlmdDsKKyAgICB1aW50MTZfdCBsZXJwTiAgPSAoLXBoYXNlICYgcE1hc2spID4+IHBTaGlmdDsKKyAgICBpZiAoKGluZGV4UCA9PSAwKSAmJiAobGVycFAgPT0gMCkpIHsKKyAgICAgICAgaW5kZXhOID0gY01hc2sgPj4gY1NoaWZ0OworICAgICAgICBsZXJwTiA9IHBNYXNrID4+IHBTaGlmdDsKKyAgICB9CisKKyAgICBsID0gMDsKKyAgICByID0gMDsKKyAgICBpbnQzMl90IGNvbnN0KiBjb2VmcyA9IG1GaXJDb2VmczsKKyAgICBpbnQxNl90IGNvbnN0ICpzUCA9IHNhbXBsZXM7CisgICAgaW50MTZfdCBjb25zdCAqc04gPSBzYW1wbGVzK0NIQU5ORUxTOworICAgIGZvciAodW5zaWduZWQgaW50IGk9MCA7IGk8aGFsZk51bUNvZWZzLzQgOyBpKyspIHsKICAgICAgICAgaW50ZXJwb2xhdGU8Q0hBTk5FTFM+KGwsIHIsIGNvZWZzK2luZGV4UCwgbGVycFAsIHNQKTsKICAgICAgICAgaW50ZXJwb2xhdGU8Q0hBTk5FTFM+KGwsIHIsIGNvZWZzK2luZGV4TiwgbGVycE4sIHNOKTsKLQkJc1AgLT0gQ0hBTk5FTFM7IHNOICs9IENIQU5ORUxTOyBjb2VmcyArPSAxPDxjb2Vmc0JpdHM7CisgICAgICAgIHNQIC09IENIQU5ORUxTOyBzTiArPSBDSEFOTkVMUzsgY29lZnMgKz0gMTw8Y29lZnNCaXRzOwogICAgICAgICBpbnRlcnBvbGF0ZTxDSEFOTkVMUz4obCwgciwgY29lZnMraW5kZXhQLCBsZXJwUCwgc1ApOwogICAgICAgICBpbnRlcnBvbGF0ZTxDSEFOTkVMUz4obCwgciwgY29lZnMraW5kZXhOLCBsZXJwTiwgc04pOwotCQlzUCAtPSBDSEFOTkVMUzsgc04gKz0gQ0hBTk5FTFM7IGNvZWZzICs9IDE8PGNvZWZzQml0czsKKyAgICAgICAgc1AgLT0gQ0hBTk5FTFM7IHNOICs9IENIQU5ORUxTOyBjb2VmcyArPSAxPDxjb2Vmc0JpdHM7CiAgICAgICAgIGludGVycG9sYXRlPENIQU5ORUxTPihsLCByLCBjb2VmcytpbmRleFAsIGxlcnBQLCBzUCk7CiAgICAgICAgIGludGVycG9sYXRlPENIQU5ORUxTPihsLCByLCBjb2VmcytpbmRleE4sIGxlcnBOLCBzTik7Ci0JCXNQIC09IENIQU5ORUxTOyBzTiArPSBDSEFOTkVMUzsgY29lZnMgKz0gMTw8Y29lZnNCaXRzOwotCX0KKyAgICAgICAgc1AgLT0gQ0hBTk5FTFM7IHNOICs9IENIQU5ORUxTOyBjb2VmcyArPSAxPDxjb2Vmc0JpdHM7CisgICAgICAgIGludGVycG9sYXRlPENIQU5ORUxTPihsLCByLCBjb2VmcytpbmRleFAsIGxlcnBQLCBzUCk7CisgICAgICAgIGludGVycG9sYXRlPENIQU5ORUxTPihsLCByLCBjb2VmcytpbmRleE4sIGxlcnBOLCBzTik7CisgICAgICAgIHNQIC09IENIQU5ORUxTOyBzTiArPSBDSEFOTkVMUzsgY29lZnMgKz0gMTw8Y29lZnNCaXRzOworICAgIH0KIH0KIAogdGVtcGxhdGU8aW50IENIQU5ORUxTPgogdm9pZCBBdWRpb1Jlc2FtcGxlclNpbmM6OmludGVycG9sYXRlKAogICAgICAgICBpbnQzMl90JiBsLCBpbnQzMl90JiByLAotCQlpbnQzMl90IGNvbnN0KiBjb2VmcywgaW50MTZfdCBsZXJwLCBpbnQxNl90IGNvbnN0KiBzYW1wbGVzKQorICAgICAgICBpbnQzMl90IGNvbnN0KiBjb2VmcywgaW50MTZfdCBsZXJwLCBpbnQxNl90IGNvbnN0KiBzYW1wbGVzKQogewotCWludDMyX3QgYzAgPSBjb2Vmc1swXTsKLQlpbnQzMl90IGMxID0gY29lZnNbMV07Ci0JaW50MzJfdCBzaW5jID0gbXVsQWRkKGxlcnAsIChjMS1jMCk8PDEsIGMwKTsKLQlpZiAoQ0hBTk5FTFMgPT0gMikgewotCQl1aW50MzJfdCBybCA9ICpyZWludGVycHJldF9jYXN0PHVpbnQzMl90IGNvbnN0Kj4oc2FtcGxlcyk7Ci0JCWwgPSBtdWxBZGRSTCgxLCBybCwgc2luYywgbCk7Ci0JCXIgPSBtdWxBZGRSTCgwLCBybCwgc2luYywgcik7Ci0JfSBlbHNlIHsKLQkJciA9IGwgPSBtdWxBZGQoc2FtcGxlc1swXSwgc2luYywgbCk7Ci0JfQorICAgIGludDMyX3QgYzAgPSBjb2Vmc1swXTsKKyAgICBpbnQzMl90IGMxID0gY29lZnNbMV07CisgICAgaW50MzJfdCBzaW5jID0gbXVsQWRkKGxlcnAsIChjMS1jMCk8PDEsIGMwKTsKKyAgICBpZiAoQ0hBTk5FTFMgPT0gMikgeworICAgICAgICB1aW50MzJfdCBybCA9ICpyZWludGVycHJldF9jYXN0PHVpbnQzMl90IGNvbnN0Kj4oc2FtcGxlcyk7CisgICAgICAgIGwgPSBtdWxBZGRSTCgxLCBybCwgc2luYywgbCk7CisgICAgICAgIHIgPSBtdWxBZGRSTCgwLCBybCwgc2luYywgcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgciA9IGwgPSBtdWxBZGQoc2FtcGxlc1swXSwgc2luYywgbCk7CisgICAgfQogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmMuaCBiL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luYy5oCmluZGV4IDg5Yjk1NzcuLmU2Y2I5MGIgMTAwNjQ0Ci0tLSBhL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luYy5oCisrKyBiL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luYy5oCkBAIC0yNCwxOSArMjQsMjAgQEAKICNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogY2xhc3MgQXVkaW9SZXNhbXBsZXJTaW5jIDogcHVibGljIEF1ZGlvUmVzYW1wbGVyIHsKIHB1YmxpYzoKLQlBdWRpb1Jlc2FtcGxlclNpbmMoaW50IGJpdERlcHRoLCBpbnQgaW5DaGFubmVsQ291bnQsIGludDMyX3Qgc2FtcGxlUmF0ZSk7CisgICAgQXVkaW9SZXNhbXBsZXJTaW5jKGludCBiaXREZXB0aCwgaW50IGluQ2hhbm5lbENvdW50LCBpbnQzMl90IHNhbXBsZVJhdGUpOwogCi0JfkF1ZGlvUmVzYW1wbGVyU2luYygpOwotCQorICAgIH5BdWRpb1Jlc2FtcGxlclNpbmMoKTsKKwogICAgIHZpcnR1YWwgdm9pZCByZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAogICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpOwogcHJpdmF0ZToKICAgICB2b2lkIGluaXQoKTsKLSAgICAKKwogICAgIHRlbXBsYXRlPGludCBDSEFOTkVMUz4KICAgICB2b2lkIHJlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCiAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcik7CkBAIC01MiwxMiArNTMsMTIgQEAKIAogICAgIHRlbXBsYXRlPGludCBDSEFOTkVMUz4KICAgICBpbmxpbmUgdm9pZCByZWFkKGludDE2X3QqJiBpbXB1bHNlLCB1aW50MzJfdCYgcGhhc2VGcmFjdGlvbiwKLSAgICAJCWludDE2X3QgY29uc3QqIGluLCBzaXplX3QgaW5wdXRJbmRleCk7CisgICAgICAgICAgICBpbnQxNl90IGNvbnN0KiBpbiwgc2l6ZV90IGlucHV0SW5kZXgpOwogCiAgICAgaW50MTZfdCAqbVN0YXRlOwogICAgIGludDE2X3QgKm1JbXB1bHNlOwogICAgIGludDE2X3QgKm1SaW5nRnVsbDsKLSAgICAKKwogICAgIGludDMyX3QgY29uc3QgKiBtRmlyQ29lZnM7CiAgICAgc3RhdGljIGNvbnN0IGludDMyX3QgbUZpckNvZWZzRG93bltdOwogICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IG1GaXJDb2Vmc1VwW107CkBAIC02NywxNSArNjgsMTUgQEAKICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBSRVNBTVBMRV9GSVJfTEVSUF9JTlRfQklUUyAgPSA0OwogCiAgICAgLy8gd2UgaGF2ZSAxNiBjb2VmcyBzYW1wbGVzIHBlciB6ZXJvLWNyb3NzaW5nCi0gICAgc3RhdGljIGNvbnN0IGludCBjb2Vmc0JpdHMgPSBSRVNBTVBMRV9GSVJfTEVSUF9JTlRfQklUUzsKLSAgICBzdGF0aWMgY29uc3QgaW50IGNTaGlmdCA9IGtOdW1QaGFzZUJpdHMgLSBjb2Vmc0JpdHM7Ci0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGNNYXNrICA9ICgoMTw8Y29lZnNCaXRzKS0xKSA8PCBjU2hpZnQ7CisgICAgc3RhdGljIGNvbnN0IGludCBjb2Vmc0JpdHMgPSBSRVNBTVBMRV9GSVJfTEVSUF9JTlRfQklUUzsgICAgICAgIC8vIDQKKyAgICBzdGF0aWMgY29uc3QgaW50IGNTaGlmdCA9IGtOdW1QaGFzZUJpdHMgLSBjb2Vmc0JpdHM7ICAgICAgICAgICAgLy8gMjYKKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgY01hc2sgID0gKCgxPDxjb2Vmc0JpdHMpLTEpIDw8IGNTaGlmdDsgICAgLy8gMHhmPDwyNiA9IDNjMDAgMDAwMAogCiAgICAgLy8gYW5kIHdlIHVzZSAxNSBiaXRzIHRvIGludGVycG9sYXRlIGJldHdlZW4gdGhlc2Ugc2FtcGxlcwogICAgIC8vIHRoaXMgY2Fubm90IGNoYW5nZSBiZWNhdXNlIHRoZSBtdWwgYmVsb3cgcmVseSBvbiBpdC4KICAgICBzdGF0aWMgY29uc3QgaW50IHBMZXJwQml0cyA9IDE1OwotICAgIHN0YXRpYyBjb25zdCBpbnQgcFNoaWZ0ID0ga051bVBoYXNlQml0cyAtIGNvZWZzQml0cyAtIHBMZXJwQml0czsKLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgcE1hc2sgID0gKCgxPDxwTGVycEJpdHMpLTEpIDw8IHBTaGlmdDsKKyAgICBzdGF0aWMgY29uc3QgaW50IHBTaGlmdCA9IGtOdW1QaGFzZUJpdHMgLSBjb2Vmc0JpdHMgLSBwTGVycEJpdHM7ICAgIC8vIDExCisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IHBNYXNrICA9ICgoMTw8cExlcnBCaXRzKS0xKSA8PCBwU2hpZnQ7ICAgIC8vIDB4N2ZmZiA8PCAxMQogCiAgICAgLy8gbnVtYmVyIG9mIHplcm8tY3Jvc3Npbmcgb24gZWFjaCBzaWRlCiAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBoYWxmTnVtQ29lZnMgPSBSRVNBTVBMRV9GSVJfTlVNX0NPRUY7CmRpZmYgLS1naXQgYS9saWJzL3N1cmZhY2VmbGluZ2VyL0FuZHJvaWQubWsgYi9saWJzL3N1cmZhY2VmbGluZ2VyL0FuZHJvaWQubWsKaW5kZXggNzc0MTQ1Ni4uZDE0Y2ViZiAxMDA2NDQKLS0tIGEvbGlicy9zdXJmYWNlZmxpbmdlci9BbmRyb2lkLm1rCisrKyBiL2xpYnMvc3VyZmFjZWZsaW5nZXIvQW5kcm9pZC5tawpAQCAtMzEsNiArMzEsNyBAQAogZW5kaWYKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGliaGFyZHdhcmUgXAogCWxpYnV0aWxzIFwKIAlsaWJjdXRpbHMgXAogCWxpYnVpIFwKZGlmZiAtLWdpdCBhL2xpYnMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZS5jcHAgYi9saWJzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuY3BwCmluZGV4IDVkZDk0NDYuLmNkNzIxNzkgMTAwNjQ0Ci0tLSBhL2xpYnMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZS5jcHAKKysrIGIvbGlicy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmNwcApAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgogCiAjaW5jbHVkZSA8R0xFUy9lZ2wuaD4KIApAQCAtMjcsNyArMjgsOSBAQAogI2luY2x1ZGUgPHVpL0VHTERpc3BsYXlTdXJmYWNlLmg+CiAKICNpbmNsdWRlICJEaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmgiCi0jaW5jbHVkZSAidWkvQmxpdEhhcmR3YXJlLmgiCisKKyNpbmNsdWRlIDxoYXJkd2FyZS9jb3B5Yml0Lmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvb3ZlcmxheS5oPgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIApAQCAtOTEsMTkgKzk0LDEzIEBACiAgICAgZmluaSgpOwogfQogCi1mbG9hdCBEaXNwbGF5SGFyZHdhcmU6OmdldERwaVgoKSBjb25zdCAgICAgICAgICAgeyByZXR1cm4gbURwaVg7IH0KLWZsb2F0IERpc3BsYXlIYXJkd2FyZTo6Z2V0RHBpWSgpIGNvbnN0ICAgICAgICAgICB7IHJldHVybiBtRHBpWTsgfQotZmxvYXQgRGlzcGxheUhhcmR3YXJlOjpnZXRSZWZyZXNoUmF0ZSgpIGNvbnN0ICAgIHsgcmV0dXJuIG1SZWZyZXNoUmF0ZTsgfQotCi1pbnQgRGlzcGxheUhhcmR3YXJlOjpnZXRXaWR0aCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVdpZHRoOwotfQotaW50IERpc3BsYXlIYXJkd2FyZTo6Z2V0SGVpZ2h0KCkgY29uc3QgewotICAgIHJldHVybiBtSGVpZ2h0OwotfQotUGl4ZWxGb3JtYXQgRGlzcGxheUhhcmR3YXJlOjpnZXRGb3JtYXQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Gb3JtYXQ7Ci19CitmbG9hdCBEaXNwbGF5SGFyZHdhcmU6OmdldERwaVgoKSBjb25zdCAgICAgICAgICB7IHJldHVybiBtRHBpWDsgfQorZmxvYXQgRGlzcGxheUhhcmR3YXJlOjpnZXREcGlZKCkgY29uc3QgICAgICAgICAgeyByZXR1cm4gbURwaVk7IH0KK2Zsb2F0IERpc3BsYXlIYXJkd2FyZTo6Z2V0RGVuc2l0eSgpIGNvbnN0ICAgICAgIHsgcmV0dXJuIG1EZW5zaXR5OyB9CitmbG9hdCBEaXNwbGF5SGFyZHdhcmU6OmdldFJlZnJlc2hSYXRlKCkgY29uc3QgICB7IHJldHVybiBtUmVmcmVzaFJhdGU7IH0KK2ludCBEaXNwbGF5SGFyZHdhcmU6OmdldFdpZHRoKCkgY29uc3QgICAgICAgICAgIHsgcmV0dXJuIG1XaWR0aDsgfQoraW50IERpc3BsYXlIYXJkd2FyZTo6Z2V0SGVpZ2h0KCkgY29uc3QgICAgICAgICAgeyByZXR1cm4gbUhlaWdodDsgfQorUGl4ZWxGb3JtYXQgRGlzcGxheUhhcmR3YXJlOjpnZXRGb3JtYXQoKSBjb25zdCAgeyByZXR1cm4gbUZvcm1hdDsgfQogCiB2b2lkIERpc3BsYXlIYXJkd2FyZTo6aW5pdCh1aW50MzJfdCBkcHkpCiB7CkBAIC0xOTUsNiArMTkyLDEyIEBACiAgICAgICAgIG1EcGlZID0gMjUuNGYgKiBmbG9hdCh2YWx1ZSkvRUdMX0RJU1BMQVlfU0NBTElORzsKICAgICB9CiAgICAgbVJlZnJlc2hSYXRlID0gNjAuZjsgICAgLy8gVE9ETzogZ2V0IHRoZSByZWFsIHJlZnJlc2ggcmF0ZSAKKyAgICAKKyAgICAvLyBjb21wdXRlIGEgImRlbnNpdHkiIGF1dG9tYXRpY2FsbHkgYXMgYSBzY2FsZSBmYWN0b3IgZnJvbSAxNjAgZHBpCisgICAgLy8gVE9ETzogdGhpcyB2YWx1ZSBzaG91bGQgYmUgY2FsY3VsYXRlZCBhIGNvbXBpbGUgdGltZSBiYXNlZCBvbiB0aGUKKyAgICAvLyBib2FyZC4KKyAgICBtRGVuc2l0eSA9IGZsb29yZigobURwaVg+bURwaVkgPyBtRHBpWCA6IG1EcGlZKSowLjFmICsgMC41ZikgKiAoMTAuMGYvMTYwLjBmKTsKKyAgICBMT0dJKCJkZW5zaXR5ID0gJWYiLCBtRGVuc2l0eSk7CiAKICAgICAvKgogICAgICAqIENyZWF0ZSBvdXIgT3BlbkdMIEVTIGNvbnRleHQKQEAgLTIzNyw4ICsyNDAsMTggQEAKICAgICBtU3VyZmFjZSA9IHN1cmZhY2U7CiAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogICAgIG1Gb3JtYXQgID0gR0dMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1OworICAgIAorICAgIGh3X21vZHVsZV90IGNvbnN0KiBtb2R1bGU7CiAKLSAgICBtQmxpdEVuZ2luZSA9IGNvcHliaXRfaW5pdCgpOworICAgIG1CbGl0RW5naW5lID0gTlVMTDsKKyAgICBpZiAoaHdfZ2V0X21vZHVsZShDT1BZQklUX0hBUkRXQVJFX01PRFVMRV9JRCwgJm1vZHVsZSkgPT0gMCkgeworICAgICAgICBjb3B5Yml0X29wZW4obW9kdWxlLCAmbUJsaXRFbmdpbmUpOworICAgIH0KKworICAgIG1PdmVybGF5RW5naW5lID0gTlVMTDsKKyAgICBpZiAoaHdfZ2V0X21vZHVsZShPVkVSTEFZX0hBUkRXQVJFX01PRFVMRV9JRCwgJm1vZHVsZSkgPT0gMCkgeworICAgICAgICBvdmVybGF5X29wZW4obW9kdWxlLCAmbU92ZXJsYXlFbmdpbmUpOworICAgIH0KIH0KIAogLyoKQEAgLTI1Miw3ICsyNjUsOCBAQAogewogICAgIGVnbE1ha2VDdXJyZW50KG1EaXNwbGF5LCBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19DT05URVhUKTsKICAgICBlZ2xUZXJtaW5hdGUobURpc3BsYXkpOwotICAgIGNvcHliaXRfdGVybShtQmxpdEVuZ2luZSk7CisgICAgY29weWJpdF9jbG9zZShtQmxpdEVuZ2luZSk7CisgICAgb3ZlcmxheV9jbG9zZShtT3ZlcmxheUVuZ2luZSk7CiB9CiAKIHZvaWQgRGlzcGxheUhhcmR3YXJlOjpyZWxlYXNlU2NyZWVuKCkgY29uc3QKZGlmZiAtLWdpdCBhL2xpYnMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZS5oIGIvbGlicy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmgKaW5kZXggMjk5ZTIzNi4uZGU0YTJjYyAxMDA2NDQKLS0tIGEvbGlicy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmgKKysrIGIvbGlicy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmgKQEAgLTI2LDYgKzI2LDggQEAKIAogI2luY2x1ZGUgIkRpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmVCYXNlLmgiCiAKK3N0cnVjdCBvdmVybGF5X2RldmljZV90Oworc3RydWN0IGNvcHliaXRfZGV2aWNlX3Q7CiBzdHJ1Y3QgY29weWJpdF9pbWFnZV90Owogc3RydWN0IGNvcHliaXRfdDsKIApAQCAtNjQsNiArNjYsNyBAQAogICAgIGZsb2F0ICAgICAgIGdldERwaVgoKSBjb25zdDsKICAgICBmbG9hdCAgICAgICBnZXREcGlZKCkgY29uc3Q7CiAgICAgZmxvYXQgICAgICAgZ2V0UmVmcmVzaFJhdGUoKSBjb25zdDsKKyAgICBmbG9hdCAgICAgICBnZXREZW5zaXR5KCkgY29uc3Q7CiAgICAgaW50ICAgICAgICAgZ2V0V2lkdGgoKSBjb25zdDsKICAgICBpbnQgICAgICAgICBnZXRIZWlnaHQoKSBjb25zdDsKICAgICBQaXhlbEZvcm1hdCBnZXRGb3JtYXQoKSBjb25zdDsKQEAgLTc0LDcgKzc3LDggQEAKICAgICB2b2lkIGdldERpc3BsYXlTdXJmYWNlKGNvcHliaXRfaW1hZ2VfdCogaW1nKSBjb25zdDsKICAgICB2b2lkIGdldERpc3BsYXlTdXJmYWNlKEdHTFN1cmZhY2UqIGZiKSBjb25zdDsKICAgICBFR0xEaXNwbGF5IGdldEVHTERpc3BsYXkoKSBjb25zdCB7IHJldHVybiBtRGlzcGxheTsgfQotICAgIGNvcHliaXRfdCogZ2V0QmxpdEVuZ2luZSgpIGNvbnN0IHsgcmV0dXJuIG1CbGl0RW5naW5lOyB9CisgICAgY29weWJpdF9kZXZpY2VfdCogZ2V0QmxpdEVuZ2luZSgpIGNvbnN0IHsgcmV0dXJuIG1CbGl0RW5naW5lOyB9CisgICAgb3ZlcmxheV9kZXZpY2VfdCogZ2V0T3ZlcmxheUVuZ2luZSgpIGNvbnN0IHsgcmV0dXJuIG1PdmVybGF5RW5naW5lOyB9CiAgICAgCiAgICAgUmVjdCBib3VuZHMoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBSZWN0KG1XaWR0aCwgbUhlaWdodCk7CkBAIC05MSwxMyArOTUsMTUgQEAKICAgICBmbG9hdCAgICAgICAgICAgbURwaVg7CiAgICAgZmxvYXQgICAgICAgICAgIG1EcGlZOwogICAgIGZsb2F0ICAgICAgICAgICBtUmVmcmVzaFJhdGU7CisgICAgZmxvYXQgICAgICAgICAgIG1EZW5zaXR5OwogICAgIGludCAgICAgICAgICAgICBtV2lkdGg7CiAgICAgaW50ICAgICAgICAgICAgIG1IZWlnaHQ7CiAgICAgUGl4ZWxGb3JtYXQgICAgIG1Gb3JtYXQ7CiAgICAgdWludDMyX3QgICAgICAgIG1GbGFnczsKICAgICBtdXRhYmxlIFJlZ2lvbiAgbURpcnR5OwogICAgIHNwPEVHTERpc3BsYXlTdXJmYWNlPiBtRGlzcGxheVN1cmZhY2U7Ci0gICAgY29weWJpdF90KiAgICAgIG1CbGl0RW5naW5lOworICAgIGNvcHliaXRfZGV2aWNlX3QqICAgICBtQmxpdEVuZ2luZTsKKyAgICBvdmVybGF5X2RldmljZV90KiAgICAgbU92ZXJsYXlFbmdpbmU7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlQmFzZS5jcHAgYi9saWJzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmVCYXNlLmNwcAppbmRleCA5MGY2Mjg3Li5mNzVlNWMyIDEwMDY0NAotLS0gYS9saWJzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmVCYXNlLmNwcAorKysgYi9saWJzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmVCYXNlLmNwcApAQCAtNDksOCArNDksMTAgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBrU2xlZXBGaWxlTmFtZSA9ICIvc3lzL2FuZHJvaWRfcG93ZXIvd2FpdF9mb3JfZmJfc2xlZXAiOwotc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBrV2FrZUZpbGVOYW1lID0gIi9zeXMvYW5kcm9pZF9wb3dlci93YWl0X2Zvcl9mYl93YWtlIjsKK3N0YXRpYyBjaGFyIGNvbnN0ICoga1NsZWVwRmlsZU5hbWUgPSAiL3N5cy9wb3dlci93YWl0X2Zvcl9mYl9zbGVlcCI7CitzdGF0aWMgY2hhciBjb25zdCAqIGtXYWtlRmlsZU5hbWUgPSAiL3N5cy9wb3dlci93YWl0X2Zvcl9mYl93YWtlIjsKK3N0YXRpYyBjaGFyIGNvbnN0ICogY29uc3Qga09sZFNsZWVwRmlsZU5hbWUgPSAiL3N5cy9hbmRyb2lkX3Bvd2VyL3dhaXRfZm9yX2ZiX3NsZWVwIjsKK3N0YXRpYyBjaGFyIGNvbnN0ICogY29uc3Qga09sZFdha2VGaWxlTmFtZSA9ICIvc3lzL2FuZHJvaWRfcG93ZXIvd2FpdF9mb3JfZmJfd2FrZSI7CiAKIC8vIFRoaXMgZGlyIGV4aXN0cyBpZiB0aGUgZnJhbWVidWZmZXIgY29uc29sZSBpcyBwcmVzZW50LCBlaXRoZXIgYnVpbHQgaW50bwogLy8gdGhlIGtlcm5lbCBvciBsb2FkZWQgYXMgYSBtb2R1bGUuCkBAIC0xMjMsMTYgKzEyNSwyMiBAQAogc3RhdHVzX3QgRGlzcGxheUhhcmR3YXJlQmFzZTo6RGlzcGxheUV2ZW50VGhyZWFkOjpyZWFkeVRvUnVuKCkKIHsKICAgICBpZiAoYWNjZXNzKGtTbGVlcEZpbGVOYW1lLCBSX09LKSB8fCBhY2Nlc3Moa1dha2VGaWxlTmFtZSwgUl9PSykpIHsKLSAgICAgICAgTE9HRSgiQ291bGRuJ3Qgb3BlbiAlcyBvciAlcyIsIGtTbGVlcEZpbGVOYW1lLCBrV2FrZUZpbGVOYW1lKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIGlmIChhY2Nlc3Moa09sZFNsZWVwRmlsZU5hbWUsIFJfT0spIHx8IGFjY2VzcyhrT2xkV2FrZUZpbGVOYW1lLCBSX09LKSkgeworICAgICAgICAgICAgTE9HRSgiQ291bGRuJ3Qgb3BlbiAlcyBvciAlcyIsIGtTbGVlcEZpbGVOYW1lLCBrV2FrZUZpbGVOYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisgICAgICAgIGtTbGVlcEZpbGVOYW1lID0ga09sZFNsZWVwRmlsZU5hbWU7CisgICAgICAgIGtXYWtlRmlsZU5hbWUgPSBrT2xkV2FrZUZpbGVOYW1lOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIHN0YXR1c190IERpc3BsYXlIYXJkd2FyZUJhc2U6OkRpc3BsYXlFdmVudFRocmVhZDo6aW5pdENoZWNrKCkgY29uc3QKIHsKLSAgICByZXR1cm4gKGFjY2VzcyhrU2xlZXBGaWxlTmFtZSwgUl9PSykgPT0gMCAmJgotICAgICAgICAgICAgYWNjZXNzKGtXYWtlRmlsZU5hbWUsIFJfT0spID09IDAgJiYKKyAgICByZXR1cm4gKCgoYWNjZXNzKGtTbGVlcEZpbGVOYW1lLCBSX09LKSA9PSAwICYmCisgICAgICAgICAgICBhY2Nlc3Moa1dha2VGaWxlTmFtZSwgUl9PSykgPT0gMCkgfHwKKyAgICAgICAgICAgIChhY2Nlc3Moa09sZFNsZWVwRmlsZU5hbWUsIFJfT0spID09IDAgJiYKKyAgICAgICAgICAgIGFjY2VzcyhrT2xkV2FrZUZpbGVOYW1lLCBSX09LKSA9PSAwKSkgJiYKICAgICAgICAgICAgIGFjY2VzcyhrRmJjb25TeXNEaXIsIEZfT0spICE9IDApID8gTk9fRVJST1IgOiBOT19JTklUOwogfQogCmRpZmYgLS1naXQgYS9saWJzL3N1cmZhY2VmbGluZ2VyL0dQVUhhcmR3YXJlL0dQVUhhcmR3YXJlLmNwcCBiL2xpYnMvc3VyZmFjZWZsaW5nZXIvR1BVSGFyZHdhcmUvR1BVSGFyZHdhcmUuY3BwCmluZGV4IGIyNGEwZjIuLmViNzVmOTkgMTAwNjQ0Ci0tLSBhL2xpYnMvc3VyZmFjZWZsaW5nZXIvR1BVSGFyZHdhcmUvR1BVSGFyZHdhcmUuY3BwCisrKyBiL2xpYnMvc3VyZmFjZWZsaW5nZXIvR1BVSGFyZHdhcmUvR1BVSGFyZHdhcmUuY3BwCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAKKyNpbmNsdWRlIDx1dGlscy9JQmluZGVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvTWVtb3J5RGVhbGVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvTWVtb3J5QmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL01lbW9yeUhlYXBQbWVtLmg+CkBAIC00OCwzNiArNDksMTEzIEBACiAKICNpbmNsdWRlICJHUFVIYXJkd2FyZS9HUFVIYXJkd2FyZS5oIgogCisKIC8qIAotICogVGhpcyBmaWxlIG1hbmFnZXMgdGhlIEdQVSBpZiB0aGVyZSBpcyBvbmUuIFRoZSBpbnRlbnQgaXMgdGhhdCB0aGlzIGNvZGUKLSAqIG5lZWRzIHRvIGJlIGRpZmZlcmVudCBmb3IgZXZlcnkgZGV2Y2UuIEN1cnJlbnRseSB0aGVyZSBpcyBubyBhYnN0cmFjdGlvbiwKLSAqIGJ1dCBpbiB0aGUgbG9uZyB0ZXJtLCB0aGlzIGNvZGUgbmVlZHMgdG8gYmUgcmVmYWN0b3JlZCBzbyB0aGF0IEFQSSBhbmQKLSAqIGltcGxlbWVudGF0aW9uIGFyZSBzZXBhcmF0ZWQuCisgKiBNYW5hZ2UgdGhlIEdQVS4gVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB2ZXJ5IHNwZWNpZmljIHRvIHRoZSBHMS4KKyAqIFRoZXJlIGFyZSBubyBhYnN0cmFjdGlvbiBoZXJlLiAKICAqIAotICogSW4gdGhpcyBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uLCB0aGUgR1BVLCBpdHMgbWVtb3J5IGFuZCByZWdpc3RlciBhcmUKLSAqIG1hbmFnZWQgaGVyZS4gQ2xpZW50cyAoc3VjaCBhcyBPcGVuR0wgRVMpIHJlcXVlc3QgdGhlIEdQVSB3aGVuIHRoZW4gbmVlZAotICogaXQgYW5kIGFyZSBnaXZlbiBhIHJldm9rYWJsZSBoZWFwIGNvbnRhaW5pbmcgdGhlIHJlZ2lzdGVycyBvbiBtZW1vcnkuIAorICogQWxsIHRoaXMgY29kZSB3aWxsIHNvb24gZ28tYXdheSBhbmQgYmUgcmVwbGFjZWQgYnkgYSBuZXcgYXJjaGl0ZWN0dXJlCisgKiBmb3IgbWFuYWdpbmcgZ3JhcGhpY3MgYWNjZWxlcmF0b3JzLgorICogCisgKiBJbiB0aGUgbWVhbnRpbWUsIGl0IGlzIGNvbmNlcHR1YWxseSBwb3NzaWJsZSB0byBpbnN0YW50aWF0ZSBhCisgKiBHUFVIYXJkd2FyZUludGVyZmFjZSBmb3IgYW5vdGhlciBHUFUgKHNlZSBHUFVGYWN0b3J5IGF0IHRoZSBib3R0b20KKyAqIG9mIHRoaXMgZmlsZSk7IHByYWN0aWNhbGx5Li4uIGRvdWJ0ZnVsLgogICogCiAgKi8KIAogbmFtZXNwYWNlIGFuZHJvaWQgeworCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorY2xhc3MgR1BVQ2xpZW50SGVhcDsKK2NsYXNzIEdQVUFyZWFIZWFwOworCitjbGFzcyBHUFVIYXJkd2FyZSA6IHB1YmxpYyBHUFVIYXJkd2FyZUludGVyZmFjZSwgcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50Cit7CitwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGludCBHUFVfUkVTRVJWRURfU0laRTsKKyAgICBzdGF0aWMgY29uc3QgaW50IEdQVVJfU0laRTsKKworICAgICAgICAgICAgR1BVSGFyZHdhcmUoKTsKKyAgICB2aXJ0dWFsIH5HUFVIYXJkd2FyZSgpOworICAgIAorICAgIHZpcnR1YWwgdm9pZCByZXZva2UoaW50IHBpZCk7CisgICAgdmlydHVhbCBzcDxNZW1vcnlEZWFsZXI+IHJlcXVlc3QoaW50IHBpZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZXF1ZXN0KGludCBwaWQsIAorICAgICAgICAgICAgY29uc3Qgc3A8SUdQVUNhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgICAgICAgICBJU3VyZmFjZUNvbXBvc2VyOjpncHVfaW5mb190KiBncHUpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBmcmllbmRseVJldm9rZSgpOworICAgIHZpcnR1YWwgdm9pZCB1bmNvbmRpdGlvbmFsUmV2b2tlKCk7CisgICAgCisgICAgdmlydHVhbCBwaWRfdCBnZXRPd25lcigpIGNvbnN0IHsgcmV0dXJuIG1Pd25lcjsgfQorCisgICAgLy8gdXNlZCBmb3IgZGVidWdnaW5nIG9ubHkuLi4KKyAgICB2aXJ0dWFsIHNwPFNpbXBsZUJlc3RGaXRBbGxvY2F0b3I+IGdldEFsbG9jYXRvcigpIGNvbnN0OworCitwcml2YXRlOgorICAgIAorICAgIAorICAgIGVudW0geworICAgICAgICBOT19PV05FUiA9IC0xLAorICAgIH07CisgICAgICAgIAorICAgIHN0cnVjdCBHUFVBcmVhIHsKKyAgICAgICAgc3A8R1BVQXJlYUhlYXA+ICAgICBoZWFwOworICAgICAgICBzcDxNZW1vcnlIZWFwUG1lbT4gIGNsaWVudEhlYXA7CisgICAgICAgIHNwPElNZW1vcnk+IG1hcCgpOworICAgIH07CisgICAgCisgICAgc3RydWN0IENsaWVudCB7CisgICAgICAgIHBpZF90ICAgICAgIHBpZDsKKyAgICAgICAgR1BVQXJlYSAgICAgc21pOworICAgICAgICBHUFVBcmVhICAgICBlYmk7CisgICAgICAgIEdQVUFyZWEgICAgIHJlZzsKKyAgICAgICAgdm9pZCBjcmVhdGVDbGllbnRIZWFwcygpOworICAgICAgICB2b2lkIHJldm9rZUFsbEhlYXBzKCk7CisgICAgfTsKKyAgICAKKyAgICBDbGllbnQmIGdldENsaWVudExvY2tlZChwaWRfdCBwaWQpOworICAgIHN0YXR1c190IHJlcXVlc3RMb2NrZWQoaW50IHBpZCk7CisgICAgdm9pZCByZWxlYXNlTG9ja2VkKCk7CisgICAgdm9pZCB0YWtlQmFja0dQVUxvY2tlZCgpOworICAgIHZvaWQgcmVnaXN0ZXJDYWxsYmFja0xvY2tlZChjb25zdCBzcDxJR1BVQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgICAgIENsaWVudCYgY2xpZW50KTsKKworICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pOworCisgICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgbUxvY2s7CisgICAgc3A8R1BVQXJlYUhlYXA+ICAgICAgICAgbVNNSUhlYXA7CisgICAgc3A8R1BVQXJlYUhlYXA+ICAgICAgICAgbUVCSUhlYXA7CisgICAgc3A8R1BVQXJlYUhlYXA+ICAgICAgICAgbVJFR0hlYXA7CisKKyAgICBLZXllZFZlY3RvcjxwaWRfdCwgQ2xpZW50PiBtQ2xpZW50czsKKyAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IHdwPElCaW5kZXI+LCBwaWRfdCA+IG1SZWdpc3RlcmVkQ2xpZW50czsKKyAgICAKKyAgICBwaWRfdCAgICAgICAgICAgICAgICAgICBtT3duZXI7CisKKyAgICBzcDxNZW1vcnlEZWFsZXI+ICAgICAgICBtQ3VycmVudEFsbG9jYXRvcjsKKyAgICBzcDxJR1BVQ2FsbGJhY2s+ICAgICAgICBtQ2FsbGJhY2s7CisgICAgCisgICAgc3A8U2ltcGxlQmVzdEZpdEFsbG9jYXRvcj4gIG1BbGxvY2F0b3I7CisKKyAgICBDb25kaXRpb24gICAgICAgICAgICAgICBtQ29uZGl0aW9uOworfTsKKwogLy8gc2l6ZSByZXNlcnZlZCBmb3IgR1BVIHN1cmZhY2VzCiAvLyAxMjAwIEtCIGZpdHMgZXhhY3RseToKIC8vICAtIHR3byAzMjAqNDgwIDE2LWJpdHMgZG91YmxlLWJ1ZmZlcmVkIHN1cmZhY2VzCiAvLyAgLSBvbmUgMzIwKjQ4MCAzMi1iaXRzIGRvdWJsZS1idWZmZXJlZCBzdXJmYWNlCi0vLyAgLSBvbmUgMzIwKjI0MCAxNi1iaXRzIGRvdWJsZS1idWZmZXJkLCA0eCBhbnRpLWFsaWFzZWQgc3VyZmFjZQotc3RhdGljIGNvbnN0IGludCBHUFVfUkVTRVJWRURfU0laRSAgPSAxMjAwICogMTAyNDsKLQotc3RhdGljIGNvbnN0IGludCBHUFVSX1NJWkUgICAgICAgICAgPSAxICogMTAyNCAqIDEwMjQ7CisvLyAgLSBvbmUgMzIwKjI0MCAxNi1iaXRzIGRvdWJsZS1idWZmZXJlZCwgNHggYW50aS1hbGlhc2VkIHN1cmZhY2UKK2NvbnN0IGludCBHUFVIYXJkd2FyZTo6R1BVX1JFU0VSVkVEX1NJWkUgID0gMTIwMCAqIDEwMjQ7Citjb25zdCBpbnQgR1BVSGFyZHdhcmU6OkdQVVJfU0laRSAgICAgICAgICA9IDEgKiAxMDI0ICogMTAyNDsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC8qIAogICogR1BVSGFuZGxlIGlzIGEgc3BlY2lhbCBJTWVtb3J5IGdpdmVuIHRvIHRoZSBjbGllbnQuIEl0IHJlcHJlc2VudHMgdGhlaXIKICAqIGhhbmRsZSB0byB0aGUgR1BVLiBPbmNlIHRoZXkgZ2l2ZSBpdCB1cCwgdGhleSBsb29zZSBHUFUgYWNjZXNzLCBvciBpZgotICogdGhleSBleHBsaWNpdGVseSByZXZva2UgdGhlaXIgYWNjZXMgdGhyb3VnaCB0aGUgYmluZGVyIGNvZGUgMTAwMC4KKyAqIHRoZXkgZXhwbGljaXRseSByZXZva2UgdGhlaXIgYWNjZXNzIHRocm91Z2ggdGhlIGJpbmRlciBjb2RlIDEwMDAuCiAgKiBJbiBib3RoIGNhc2VzLCB0aGlzIHRyaWdnZXJzIGEgY2FsbGJhY2sgdG8gcmV2b2tlKCkKICAqIGZpcnN0LCBhbmQgdGhlbiBhY3R1YWxseSBwb3dlcnMgZG93biB0aGUgY2hpcC4KICAqIApAQCAtOTIsNDIgKzE3MCw5OSBAQAogICogCiAgKi8KIAotY2xhc3MgR1BVSGFuZGxlIDogcHVibGljIEJuTWVtb3J5CitjbGFzcyBHUFVDbGllbnRIZWFwIDogcHVibGljIE1lbW9yeUhlYXBQbWVtCiB7CiBwdWJsaWM6Ci0gICAgICAgICAgICBHUFVIYW5kbGUoY29uc3Qgc3A8R1BVSGFyZHdhcmU+JiBncHUsIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCkKLSAgICAgICAgICAgICAgICA6IG1HUFUoZ3B1KSwgbUNsaWVudEhlYXAoaGVhcCkgewotICAgICAgICAgICAgfQotICAgIHZpcnR1YWwgfkdQVUhhbmRsZSgpOwotICAgIHZpcnR1YWwgc3A8SU1lbW9yeUhlYXA+IGdldE1lbW9yeShzc2l6ZV90KiBvZmZzZXQsIHNpemVfdCogc2l6ZSkgY29uc3Q7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBvblRyYW5zYWN0KAotICAgICAgICAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncyk7Ci0gICAgdm9pZCBzZXRPd25lcihpbnQgb3duZXIpIHsgbU93bmVyID0gb3duZXI7IH0KLXByaXZhdGU6Ci0gICAgdm9pZCByZXZva2VOb3RpZmljYXRpb24oKTsKKyAgICBHUFVDbGllbnRIZWFwKGNvbnN0IHdwPEdQVUhhcmR3YXJlPiYgZ3B1LCAKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lbW9yeUhlYXBCYXNlPiYgaGVhcCkKKyAgICAgICAgOiAgTWVtb3J5SGVhcFBtZW0oaGVhcCksIG1HUFUoZ3B1KSB7IH0KK3Byb3RlY3RlZDoKICAgICB3cDxHUFVIYXJkd2FyZT4gbUdQVTsKLSAgICBzcDxJTWVtb3J5SGVhcD4gbUNsaWVudEhlYXA7Ci0gICAgaW50IG1Pd25lcjsKIH07CiAKLUdQVUhhbmRsZTo6fkdQVUhhbmRsZSgpIHsgCitjbGFzcyBHUFVBcmVhSGVhcCA6IHB1YmxpYyBNZW1vcnlIZWFwQmFzZQoreworcHVibGljOgorICAgIEdQVUFyZWFIZWFwKGNvbnN0IHdwPEdQVUhhcmR3YXJlPiYgZ3B1LAorICAgICAgICAgICAgY29uc3QgY2hhciogY29uc3QgdnJhbSwgc2l6ZV90IHNpemU9MCwgc2l6ZV90IHJlc2VydmVkPTApCisgICAgOiBNZW1vcnlIZWFwQmFzZSh2cmFtLCBzaXplKSwgbUdQVShncHUpIHsgCisgICAgICAgIGlmIChiYXNlKCkgIT0gTUFQX0ZBSUxFRCkgeworICAgICAgICAgICAgaWYgKHJlc2VydmVkID09IDApCisgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgPSB2aXJ0dWFsU2l6ZSgpOworICAgICAgICAgICAgbUFsbG9jYXRvciA9IG5ldyBTaW1wbGVCZXN0Rml0QWxsb2NhdG9yKHJlc2VydmVkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB2aXJ0dWFsIHNwPE1lbW9yeUhlYXBQbWVtPiBjcmVhdGVDbGllbnRIZWFwKCkgeworICAgICAgICBzcDxNZW1vcnlIZWFwQmFzZT4gcGFyZW50SGVhcCh0aGlzKTsKKyAgICAgICAgcmV0dXJuIG5ldyBHUFVDbGllbnRIZWFwKG1HUFUsIHBhcmVudEhlYXApOworICAgIH0KKyAgICB2aXJ0dWFsIGNvbnN0IHNwPFNpbXBsZUJlc3RGaXRBbGxvY2F0b3I+JiBnZXRBbGxvY2F0b3IoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQWxsb2NhdG9yOyAKKyAgICB9Citwcml2YXRlOgorICAgIHNwPFNpbXBsZUJlc3RGaXRBbGxvY2F0b3I+ICBtQWxsb2NhdG9yOworcHJvdGVjdGVkOgorICAgIHdwPEdQVUhhcmR3YXJlPiBtR1BVOworfTsKKworY2xhc3MgR1BVUmVnaXN0ZXJIZWFwIDogcHVibGljIEdQVUFyZWFIZWFwCit7CitwdWJsaWM6CisgICAgR1BVUmVnaXN0ZXJIZWFwKGNvbnN0IHNwPEdQVUhhcmR3YXJlPiYgZ3B1KQorICAgICAgICA6IEdQVUFyZWFIZWFwKGdwdSwgIi9kZXYvaHczZCIsIEdQVUhhcmR3YXJlOjpHUFVSX1NJWkUpIHsgfQorICAgIHZpcnR1YWwgc3A8TWVtb3J5SGVhcFBtZW0+IGNyZWF0ZUNsaWVudEhlYXAoKSB7CisgICAgICAgIHNwPE1lbW9yeUhlYXBCYXNlPiBwYXJlbnRIZWFwKHRoaXMpOworICAgICAgICByZXR1cm4gbmV3IE1lbW9yeUhlYXBSZWdzKG1HUFUsIHBhcmVudEhlYXApOworICAgIH0KK3ByaXZhdGU6CisgICAgY2xhc3MgTWVtb3J5SGVhcFJlZ3MgOiBwdWJsaWMgR1BVQ2xpZW50SGVhcCAgeworICAgIHB1YmxpYzoKKyAgICAgICAgTWVtb3J5SGVhcFJlZ3MoY29uc3Qgd3A8R1BVSGFyZHdhcmU+JiBncHUsIAorICAgICAgICAgICAgIGNvbnN0IHNwPE1lbW9yeUhlYXBCYXNlPiYgaGVhcCkKKyAgICAgICAgICAgIDogR1BVQ2xpZW50SGVhcChncHUsIGhlYXApIHsgfQorICAgICAgICBzcDxNZW1vcnlIZWFwUG1lbTo6TWVtb3J5UG1lbT4gY3JlYXRlTWVtb3J5KHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJldm9rZSgpOworICAgIHByaXZhdGU6CisgICAgICAgIGNsYXNzIEdQVUhhbmRsZSA6IHB1YmxpYyBNZW1vcnlIZWFwUG1lbTo6TWVtb3J5UG1lbSB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIEdQVUhhbmRsZShjb25zdCBzcDxHUFVIYXJkd2FyZT4mIGdwdSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8TWVtb3J5SGVhcFBtZW0+JiBoZWFwKQorICAgICAgICAgICAgICAgIDogTWVtb3J5SGVhcFBtZW06Ok1lbW9yeVBtZW0oaGVhcCksIAorICAgICAgICAgICAgICAgICAgbUdQVShncHUpLCBtT3duZXIoZ3B1LT5nZXRPd25lcigpKSB7IH0KKyAgICAgICAgICAgIHZpcnR1YWwgfkdQVUhhbmRsZSgpOworICAgICAgICAgICAgdmlydHVhbCBzcDxJTWVtb3J5SGVhcD4gZ2V0TWVtb3J5KAorICAgICAgICAgICAgICAgICAgICBzc2l6ZV90KiBvZmZzZXQsIHNpemVfdCogc2l6ZSkgY29uc3Q7CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgcmV2b2tlKCkgeyB9OworICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBvblRyYW5zYWN0KAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIAorICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncyk7CisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICB2b2lkIHJldm9rZU5vdGlmaWNhdGlvbigpOworICAgICAgICAgICAgd3A8R1BVSGFyZHdhcmU+IG1HUFU7CisgICAgICAgICAgICBwaWRfdCBtT3duZXI7CisgICAgICAgIH07CisgICAgfTsKK307CisKK0dQVVJlZ2lzdGVySGVhcDo6TWVtb3J5SGVhcFJlZ3M6OkdQVUhhbmRsZTo6fkdQVUhhbmRsZSgpIHsgCiAgICAgLy9MT0dEKCJHUFVIYW5kbGUgJXAgcmVsZWFzZWQsIHJldm9raW5nIEdQVSIsIHRoaXMpOwogICAgIHJldm9rZU5vdGlmaWNhdGlvbigpOyAKIH0KLQotdm9pZCBHUFVIYW5kbGU6OnJldm9rZU5vdGlmaWNhdGlvbigpICB7Cit2b2lkIEdQVVJlZ2lzdGVySGVhcDo6TWVtb3J5SGVhcFJlZ3M6OkdQVUhhbmRsZTo6cmV2b2tlTm90aWZpY2F0aW9uKCkgIHsKICAgICBzcDxHUFVIYXJkd2FyZT4gaHcobUdQVS5wcm9tb3RlKCkpOwogICAgIGlmIChodyAhPSAwKSB7CiAgICAgICAgIGh3LT5yZXZva2UobU93bmVyKTsKICAgICB9CiB9Ci1zcDxJTWVtb3J5SGVhcD4gR1BVSGFuZGxlOjpnZXRNZW1vcnkoc3NpemVfdCogb2Zmc2V0LCBzaXplX3QqIHNpemUpIGNvbnN0CitzcDxJTWVtb3J5SGVhcD4gR1BVUmVnaXN0ZXJIZWFwOjpNZW1vcnlIZWFwUmVnczo6R1BVSGFuZGxlOjpnZXRNZW1vcnkoCisgICAgICAgIHNzaXplX3QqIG9mZnNldCwgc2l6ZV90KiBzaXplKSBjb25zdAogeworICAgIHNwPE1lbW9yeUhlYXBQbWVtPiBoZWFwID0gZ2V0SGVhcCgpOwogICAgIGlmIChvZmZzZXQpICpvZmZzZXQgPSAwOwotICAgIGlmIChzaXplKSAgICpzaXplID0gbUNsaWVudEhlYXAgIT0wID8gbUNsaWVudEhlYXAtPnZpcnR1YWxTaXplKCkgOiAwOwotICAgIHJldHVybiBtQ2xpZW50SGVhcDsKKyAgICBpZiAoc2l6ZSkgICAqc2l6ZSA9IGhlYXAgIT0wID8gaGVhcC0+dmlydHVhbFNpemUoKSA6IDA7CisgICAgcmV0dXJuIGhlYXA7CiB9Ci1zdGF0dXNfdCBHUFVIYW5kbGU6Om9uVHJhbnNhY3QoCitzdGF0dXNfdCBHUFVSZWdpc3RlckhlYXA6Ok1lbW9yeUhlYXBSZWdzOjpHUFVIYW5kbGU6Om9uVHJhbnNhY3QoCiAgICAgICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCiB7CiAgICAgc3RhdHVzX3QgZXJyID0gQm5NZW1vcnk6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKQEAgLTE1MCwyMiArMjg1LDE0IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1jbGFzcyBNZW1vcnlIZWFwUmVncyA6IHB1YmxpYyBNZW1vcnlIZWFwUG1lbSAKLXsKLXB1YmxpYzoKLSAgICAgICAgICAgIE1lbW9yeUhlYXBSZWdzKGNvbnN0IHdwPEdQVUhhcmR3YXJlPiYgZ3B1LCBjb25zdCBzcDxNZW1vcnlIZWFwQmFzZT4mIGhlYXApOwotICAgIHZpcnR1YWwgfk1lbW9yeUhlYXBSZWdzKCk7Ci0gICAgc3A8SU1lbW9yeT4gbWFwTWVtb3J5KHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmV2b2tlKCk7Ci1wcml2YXRlOgotICAgIHdwPEdQVUhhcmR3YXJlPiBtR1BVOwotfTsKIAotTWVtb3J5SGVhcFJlZ3M6Ok1lbW9yeUhlYXBSZWdzKGNvbnN0IHdwPEdQVUhhcmR3YXJlPiYgZ3B1LCBjb25zdCBzcDxNZW1vcnlIZWFwQmFzZT4mIGhlYXApCi0gICAgOiAgTWVtb3J5SGVhcFBtZW0oaGVhcCksIG1HUFUoZ3B1KQorc3A8TWVtb3J5SGVhcFBtZW06Ok1lbW9yeVBtZW0+IEdQVVJlZ2lzdGVySGVhcDo6TWVtb3J5SGVhcFJlZ3M6OmNyZWF0ZU1lbW9yeSgKKyAgICAgICAgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpCiB7CisgICAgc3A8R1BVSGFuZGxlPiBtZW1vcnk7CisgICAgc3A8R1BVSGFyZHdhcmU+IGdwdSA9IG1HUFUucHJvbW90ZSgpOworICAgIGlmIChoZWFwSUQoKT4wICYmIGdwdSE9MCkgewogI2lmIEhBVkVfQU5EUk9JRF9PUwotICAgIGlmIChoZWFwSUQoKT4wKSB7CiAgICAgICAgIC8qIHRoaXMgaXMgd2hlcmUgdGhlIEdQVSBpcyBwb3dlcmVkIG9uIGFuZCB0aGUgcmVnaXN0ZXJzIGFyZSBtYXBwZWQKICAgICAgICAgICogaW4gdGhlIGNsaWVudCAqLwogICAgICAgICAvL0xPR0QoImlvY3RsKEhXM0RfR1JBTlRfR1BVKSIpOwpAQCAtMTc0LDI3ICszMDEsMTYgQEAKICAgICAgICAgICAgIC8vIGl0IGNhbiBoYXBwZW4gaWYgdGhlIG1hc3RlciBoZWFwIGhhcyBiZWVuIGNsb3NlZCBhbHJlYWR5CiAgICAgICAgICAgICAvLyBpbiB3aGljaCBjYXNlIHRoZSBHUFUgYWxyZWFkeSBpcyByZXZva2VkIChhcHAgY3Jhc2ggZm9yCiAgICAgICAgICAgICAvLyBpbnN0YW5jZSkuCi0gICAgICAgICAgICAvL0xPR1coIkhXM0RfR1JBTlRfR1BVIGZhaWxlZCAoJXMpLCBtRkQ9JWQsIGJhc2U9JXAiLAotICAgICAgICAgICAgLy8gICAgICAgIHN0cmVycm9yKGVycm5vKSwgaGVhcElEKCksIGJhc2UoKSk7CisgICAgICAgICAgICBMT0dXKCJIVzNEX0dSQU5UX0dQVSBmYWlsZWQgKCVzKSwgbUZEPSVkLCBiYXNlPSVwIiwKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pLCBoZWFwSUQoKSwgYmFzZSgpKTsKICAgICAgICAgfQotICAgIH0KLSNlbmRpZgotfQotCi1NZW1vcnlIZWFwUmVnczo6fk1lbW9yeUhlYXBSZWdzKCkgCi17Ci19Ci0KLXNwPElNZW1vcnk+IE1lbW9yeUhlYXBSZWdzOjptYXBNZW1vcnkoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpCi17Ci0gICAgc3A8R1BVSGFuZGxlPiBtZW1vcnk7Ci0gICAgc3A8R1BVSGFyZHdhcmU+IGdwdSA9IG1HUFUucHJvbW90ZSgpOwotICAgIGlmIChoZWFwSUQoKT4wICYmIGdwdSE9MCkgCiAgICAgICAgIG1lbW9yeSA9IG5ldyBHUFVIYW5kbGUoZ3B1LCB0aGlzKTsKKyNlbmRpZgorICAgIH0KICAgICByZXR1cm4gbWVtb3J5OwogfQogCi12b2lkIE1lbW9yeUhlYXBSZWdzOjpyZXZva2UoKSAKK3ZvaWQgR1BVUmVnaXN0ZXJIZWFwOjpNZW1vcnlIZWFwUmVnczo6cmV2b2tlKCkgCiB7CiAgICAgTWVtb3J5SGVhcFBtZW06OnJldm9rZSgpOwogI2lmIEhBVkVfQU5EUk9JRF9PUwpAQCAtMjA3LDI1ICszMjMsNiBAQAogI2VuZGlmCiB9CiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBHUFVSZWdpc3RlckhlYXAgOiBwdWJsaWMgUE1lbUhlYXBJbnRlcmZhY2UKLXsKLXB1YmxpYzoKLSAgICBHUFVSZWdpc3RlckhlYXAoY29uc3Qgc3A8R1BVSGFyZHdhcmU+JiBncHUpCi0gICAgICAgIDogUE1lbUhlYXBJbnRlcmZhY2UoIi9kZXYvaHczZCIsIEdQVVJfU0laRSksIG1HUFUoZ3B1KQotICAgIHsKLSAgICB9Ci0gICAgdmlydHVhbCB+R1BVUmVnaXN0ZXJIZWFwKCkgewotICAgIH0KLSAgICB2aXJ0dWFsIHNwPE1lbW9yeUhlYXBQbWVtPiBjcmVhdGVDbGllbnRIZWFwKCkgewotICAgICAgICBzcDxNZW1vcnlIZWFwQmFzZT4gcGFyZW50SGVhcCh0aGlzKTsKLSAgICAgICAgcmV0dXJuIG5ldyBNZW1vcnlIZWFwUmVncyhtR1BVLCBwYXJlbnRIZWFwKTsKLSAgICB9Ci1wcml2YXRlOgotICAgIHdwPEdQVUhhcmR3YXJlPiBtR1BVOwotfTsKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBHUFVIYXJkd2FyZTo6R1BVSGFyZHdhcmUoKQpAQCAtMjM3LDg1ICszMzQsODcgQEAKIHsKIH0KIAotc3A8TWVtb3J5RGVhbGVyPiBHUFVIYXJkd2FyZTo6cmVxdWVzdChpbnQgcGlkKQorc3RhdHVzX3QgR1BVSGFyZHdhcmU6OnJlcXVlc3RMb2NrZWQoaW50IHBpZCkKIHsKLSAgICBzcDxNZW1vcnlEZWFsZXI+IGRlYWxlcjsKLQotICAgIExPR0QoInBpZCAlZCByZXF1ZXN0aW5nIGdwdSBzdXJmYWNlIChjdXJyZW50IG93bmVyID0gJWQpIiwgcGlkLCBtT3duZXIpOwotCiAgICAgY29uc3QgaW50IHNlbGZfcGlkID0gZ2V0cGlkKCk7CiAgICAgaWYgKHBpZCA9PSBzZWxmX3BpZCkgewogICAgICAgICAvLyBjYW4ndCB1c2UgR1BVIGZyb20gc3VyZmFjZWZsaW5nZXIncyBwcm9jZXNzCi0gICAgICAgIHJldHVybiBkZWFsZXI7Ci0gICAgfQotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAKLSAgICBpZiAobU93bmVyICE9IHBpZCkgewotICAgICAgICAvLyBzb21lb25lIGFscmVhZHkgaGFzIHRoZSBncHUuCi0gICAgICAgIHRha2VCYWNrR1BVTG9ja2VkKCk7Ci0KLSAgICAgICAgLy8gcmVsZWFzZUxvY2tlZCgpIHNob3VsZCBiZSBhIG5vLW9wIG1vc3Qgb2YgdGhlIHRpbWUKLSAgICAgICAgcmVsZWFzZUxvY2tlZCgpOwotCi0gICAgICAgIHJlcXVlc3RMb2NrZWQoKTsgCi0gICAgfQotCi0gICAgZGVhbGVyID0gbUFsbG9jYXRvcjsKLSAgICBtT3duZXIgPSBwaWQ7Ci0gICAgaWYgKGRlYWxlciA9PSAwKSB7Ci0gICAgICAgIG1Pd25lciA9IFNVUkZBQ0VfRkFJTEVEOwotICAgIH0KLSAgICAKLSAgICBMT0dEX0lGKGRlYWxlciE9MCwgImdwdSBzdXJmYWNlIGdyYW50ZWQgdG8gcGlkICVkIiwgbU93bmVyKTsKLSAgICByZXR1cm4gZGVhbGVyOwotfQotCi1zdGF0dXNfdCBHUFVIYXJkd2FyZTo6cmVxdWVzdChjb25zdCBzcDxJR1BVQ2FsbGJhY2s+JiBjYWxsYmFjaywKLSAgICAgICAgSVN1cmZhY2VDb21wb3Nlcjo6Z3B1X2luZm9fdCogZ3B1KQotewotICAgIHNwPElNZW1vcnk+IGdwdUhhbmRsZTsKLSAgICBJUENUaHJlYWRTdGF0ZSogaXBjID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKLSAgICBjb25zdCBpbnQgcGlkID0gaXBjLT5nZXRDYWxsaW5nUGlkKCk7Ci0gICAgY29uc3QgaW50IHNlbGZfcGlkID0gZ2V0cGlkKCk7Ci0KLSAgICBMT0dEKCJwaWQgJWQgcmVxdWVzdGluZyBncHUgY29yZSAob3duZXIgPSAlZCkiLCBwaWQsIG1Pd25lcik7Ci0KLSAgICBpZiAocGlkID09IHNlbGZfcGlkKSB7Ci0gICAgICAgIC8vIGNhbid0IHVzZSBHUFUgZnJvbSBzdXJmYWNlZmxpbmdlcidzIHByb2Nlc3MKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KIAotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1Pd25lciAhPSBwaWQpIHsKLSAgICAgICAgLy8gc29tZW9uZSBhbHJlYWR5IGhhcyB0aGUgZ3B1LgotICAgICAgICB0YWtlQmFja0dQVUxvY2tlZCgpOwotCi0gICAgICAgIC8vIHJlbGVhc2VMb2NrZWQoKSBzaG91bGQgYmUgYSBuby1vcCBtb3N0IG9mIHRoZSB0aW1lCi0gICAgICAgIHJlbGVhc2VMb2NrZWQoKTsKLQotICAgICAgICByZXF1ZXN0TG9ja2VkKCk7IAorICAgICAgICBpZiAobVJFR0hlYXAgIT0gMCkgeworICAgICAgICAgICAgaWYgKG1Pd25lciAhPSBOT19PV05FUikgeworICAgICAgICAgICAgICAgIC8vIHNvbWVvbmUgYWxyZWFkeSBoYXMgdGhlIGdwdS4KKyAgICAgICAgICAgICAgICB0YWtlQmFja0dQVUxvY2tlZCgpOworICAgICAgICAgICAgICAgIHJlbGVhc2VMb2NrZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGZpcnN0IHRpbWUsIGluaXRpYWxpemUgdGhlIHN0dWZmLgorICAgICAgICAgICAgaWYgKG1TTUlIZWFwID09IDApCisgICAgICAgICAgICAgICAgbVNNSUhlYXAgPSBuZXcgR1BVQXJlYUhlYXAodGhpcywgIi9kZXYvcG1lbV9ncHUwIik7CisgICAgICAgICAgICBpZiAobUVCSUhlYXAgPT0gMCkKKyAgICAgICAgICAgICAgICBtRUJJSGVhcCA9IG5ldyBHUFVBcmVhSGVhcCh0aGlzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICIvZGV2L3BtZW1fZ3B1MSIsIDAsIEdQVV9SRVNFUlZFRF9TSVpFKTsKKyAgICAgICAgICAgIG1SRUdIZWFwID0gbmV3IEdQVVJlZ2lzdGVySGVhcCh0aGlzKTsKKyAgICAgICAgICAgIG1BbGxvY2F0b3IgPSBtRUJJSGVhcC0+Z2V0QWxsb2NhdG9yKCk7CisgICAgICAgICAgICBpZiAobUFsbG9jYXRvciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLy8gc29tZXRoaW5nIHdlbnQgdGVycmlibHkgd3JvbmcuCisgICAgICAgICAgICAgICAgbVNNSUhlYXAuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtRUJJSGVhcC5jbGVhcigpOworICAgICAgICAgICAgICAgIG1SRUdIZWFwLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIENsaWVudCYgY2xpZW50ID0gZ2V0Q2xpZW50TG9ja2VkKHBpZCk7CisgICAgICAgIG1DdXJyZW50QWxsb2NhdG9yID0gbmV3IE1lbW9yeURlYWxlcihjbGllbnQuZWJpLmNsaWVudEhlYXAsIG1BbGxvY2F0b3IpOworICAgICAgICBtT3duZXIgPSBwaWQ7CiAgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KIAotICAgIGlmIChtSGVhcFIuaXNWYWxpZCgpKSB7CitzcDxNZW1vcnlEZWFsZXI+IEdQVUhhcmR3YXJlOjpyZXF1ZXN0KGludCBwaWQpCit7CisgICAgc3A8TWVtb3J5RGVhbGVyPiBkZWFsZXI7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBDbGllbnQqIGNsaWVudDsKKyAgICBMT0dEKCJwaWQgJWQgcmVxdWVzdGluZyBncHUgc3VyZmFjZSAoY3VycmVudCBvd25lciA9ICVkKSIsIHBpZCwgbU93bmVyKTsKKyAgICBpZiAocmVxdWVzdExvY2tlZChwaWQpID09IE5PX0VSUk9SKSB7CisgICAgICAgIGRlYWxlciA9IG1DdXJyZW50QWxsb2NhdG9yOworICAgICAgICBMT0dEX0lGKGRlYWxlciE9MCwgImdwdSBzdXJmYWNlIGdyYW50ZWQgdG8gcGlkICVkIiwgbU93bmVyKTsKKyAgICB9CisgICAgcmV0dXJuIGRlYWxlcjsKK30KKworc3RhdHVzX3QgR1BVSGFyZHdhcmU6OnJlcXVlc3QoaW50IHBpZCwgY29uc3Qgc3A8SUdQVUNhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgICAgIElTdXJmYWNlQ29tcG9zZXI6OmdwdV9pbmZvX3QqIGdwdSkKK3sKKyAgICBpZiAoY2FsbGJhY2sgPT0gMCkKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKworICAgIHNwPElNZW1vcnk+IGdwdUhhbmRsZTsKKyAgICBMT0dEKCJwaWQgJWQgcmVxdWVzdGluZyBncHUgY29yZSAob3duZXIgPSAlZCkiLCBwaWQsIG1Pd25lcik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzdGF0dXNfdCBlcnIgPSByZXF1ZXN0TG9ja2VkKHBpZCk7CisgICAgaWYgKGVyciA9PSBOT19FUlJPUikgeworICAgICAgICAvLyBpdCdzIGd1YXJhbnRlZWQgdG8gYmUgdGhlcmUsIGJlIGNvbnN0cnVjdGlvbgorICAgICAgICBDbGllbnQmIGNsaWVudCA9IG1DbGllbnRzLmVkaXRWYWx1ZUZvcihwaWQpOworICAgICAgICByZWdpc3RlckNhbGxiYWNrTG9ja2VkKGNhbGxiYWNrLCBjbGllbnQpOwogICAgICAgICBncHUtPmNvdW50ID0gMjsKLSAgICAgICAgZ3B1LT5yZWdpb25zWzBdLnJlZ2lvbiA9IG1IZWFwMC5tYXAodHJ1ZSk7Ci0gICAgICAgIGdwdS0+cmVnaW9uc1swXS5yZXNlcnZlZCA9IG1IZWFwMC5yZXNlcnZlZDsKLSAgICAgICAgZ3B1LT5yZWdpb25zWzFdLnJlZ2lvbiA9IG1IZWFwMS5tYXAodHJ1ZSk7Ci0gICAgICAgIGdwdS0+cmVnaW9uc1sxXS5yZXNlcnZlZCA9IG1IZWFwMS5yZXNlcnZlZDsKLSAgICAgICAgZ3B1LT5yZWdzID0gbUhlYXBSLm1hcCgpOworICAgICAgICBncHUtPnJlZ2lvbnNbMF0ucmVnaW9uID0gY2xpZW50LnNtaS5tYXAoKTsKKyAgICAgICAgZ3B1LT5yZWdpb25zWzFdLnJlZ2lvbiA9IGNsaWVudC5lYmkubWFwKCk7CisgICAgICAgIGdwdS0+cmVncyAgICAgICAgICAgICAgPSBjbGllbnQucmVnLm1hcCgpOworICAgICAgICBncHUtPnJlZ2lvbnNbMF0ucmVzZXJ2ZWQgPSAwOworICAgICAgICBncHUtPnJlZ2lvbnNbMV0ucmVzZXJ2ZWQgPSBHUFVfUkVTRVJWRURfU0laRTsKICAgICAgICAgaWYgKGdwdS0+cmVncyAhPSAwKSB7Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDwgR1BVSGFuZGxlKiA+KGdwdS0+cmVncy5nZXQoKSktPnNldE93bmVyKHBpZCk7CisgICAgICAgICAgICAvL0xPR0QoImdwdSBjb3JlIGdyYW50ZWQgdG8gcGlkICVkLCBoYW5kbGUgYmFzZT0lcCIsCisgICAgICAgICAgICAvLyAgICAgICAgbU93bmVyLCBncHUtPnJlZ3MtPnBvaW50ZXIoKSk7CiAgICAgICAgIH0KICAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgICAgIG1Pd25lciA9IHBpZDsKLSAgICAgICAgLy9MT0dEKCJncHUgY29yZSBncmFudGVkIHRvIHBpZCAlZCwgaGFuZGxlIGJhc2U9JXAiLAotICAgICAgICAvLyAgICAgICAgbU93bmVyLCBncHUtPnJlZ3MtPnBvaW50ZXIoKSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgTE9HVygiY291bGRuJ3QgZ3JhbnQgZ3B1IGNvcmUgdG8gcGlkICVkIiwgcGlkKTsKICAgICB9Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgcmV0dXJuIGVycjsKIH0KIAogdm9pZCBHUFVIYXJkd2FyZTo6cmV2b2tlKGludCBwaWQpCkBAIC0zMzAsMTYgKzQyOSwxNiBAQAogICAgICAgICAvLyBtT3duZXIgY291bGQgYmUgPDAgaWYgdGhlIHNhbWUgcHJvY2VzcyBhY3F1aXJlZCB0aGUgR1BVCiAgICAgICAgIC8vIHNldmVyYWwgdGltZXMgd2l0aG91dCByZWxlYXNpbmcgaXQgZmlyc3QuCiAgICAgICAgIG1Db25kaXRpb24uc2lnbmFsKCk7Ci0gICAgICAgIHJlbGVhc2VMb2NrZWQodHJ1ZSk7CisgICAgICAgIHJlbGVhc2VMb2NrZWQoKTsKICAgICB9CiB9CiAKIHN0YXR1c190IEdQVUhhcmR3YXJlOjpmcmllbmRseVJldm9rZSgpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICB0YWtlQmFja0dQVUxvY2tlZCgpOwogICAgIC8vTE9HRCgiZnJpZW5kbHlSZXZva2Ugb3duZXI9JWQiLCBtT3duZXIpOwotICAgIHJlbGVhc2VMb2NrZWQodHJ1ZSk7CisgICAgdGFrZUJhY2tHUFVMb2NrZWQoKTsKKyAgICByZWxlYXNlTG9ja2VkKCk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCkBAIC0zNTMsOTAgKzQ1MiwzNyBAQAogICAgIH0KIH0KIAotdm9pZCBHUFVIYXJkd2FyZTo6cmVxdWVzdExvY2tlZCgpCit2b2lkIEdQVUhhcmR3YXJlOjpyZWxlYXNlTG9ja2VkKCkKIHsKLSAgICBpZiAobUFsbG9jYXRvciA9PSAwKSB7Ci0gICAgICAgIEdQVVBhcnQqIHBhcnQgPSAwOwotICAgICAgICBzcDxQTWVtSGVhcD4gc3VyZmFjZUhlYXA7Ci0gICAgICAgIGlmIChtSGVhcDEucHJvbW90ZSgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAvL0xPR0QoInJlcXVlc3RMb2NrZWQ6ICgxKSBjcmVhdGluZyBuZXcgaGVhcCIpOwotICAgICAgICAgICAgbUhlYXAxLnNldChuZXcgUE1lbUhlYXAoIi9kZXYvcG1lbV9ncHUxIiwgMCwgR1BVX1JFU0VSVkVEX1NJWkUpKTsKKyAgICAvL0xPR0QoInJldm9raW5nIGdwdSBmcm9tIHBpZCAlZCIsIG1Pd25lcik7CisgICAgaWYgKG1Pd25lciAhPSBOT19PV05FUikgeworICAgICAgICAvLyB0aGlzIG1heSBmYWlsIGJlY2F1c2UgdGhlIGNsaWVudCBtaWdodCBoYXZlIGRpZWQsIGFuZCBoYXZlCisgICAgICAgIC8vIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBsaXN0LgorICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUNsaWVudHMuaW5kZXhPZktleShtT3duZXIpOworICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgQ2xpZW50JiBjbGllbnQobUNsaWVudHMuZWRpdFZhbHVlQXQoaW5kZXgpKTsKKyAgICAgICAgICAgIGNsaWVudC5yZXZva2VBbGxIZWFwcygpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChtSGVhcDEuaXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICAvL0xPR0QoInJlcXVlc3RMb2NrZWQ6ICgxKSBoZWFwIGlzIHZhbGlkIik7Ci0gICAgICAgICAgICAvLyBOT1RFOiBpZiBHUFUxIGlzIGF2YWlsYWJsZSB3ZSB1c2UgaXQgZm9yIG91ciBzdXJmYWNlcwotICAgICAgICAgICAgLy8gdGhpcyBjb3VsZCBiZSBkZXZpY2Ugc3BlY2lmaWMsIHNvIHdlIHNob3VsZCBkbyBzb21ldGhpbmcgbW9yZQotICAgICAgICAgICAgLy8gZ2VuZXJpYwotICAgICAgICAgICAgc3VyZmFjZUhlYXAgPSBzdGF0aWNfY2FzdDwgUE1lbUhlYXAqID4oIG1IZWFwMS5nZXRIZWFwKCkuZ2V0KCkgKTsKLSAgICAgICAgICAgIHBhcnQgPSAmbUhlYXAxOwotICAgICAgICAgICAgaWYgKG1IZWFwMC5wcm9tb3RlKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAvL0xPR0QoInJlcXVlc3RMb2NrZWQ6ICgwKSBjcmVhdGluZyBuZXcgaGVhcCIpOwotICAgICAgICAgICAgICAgIG1IZWFwMC5zZXQobmV3IFBNZW1IZWFwKCIvZGV2L3BtZW1fZ3B1MCIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vTE9HRCgicmVxdWVzdExvY2tlZDogKDEpIGhlYXAgaXMgbm90IHZhbGlkIik7Ci0gICAgICAgICAgICAvLyBObyBHUFUxLCB1c2UgR1BVMCBvbmx5Ci0gICAgICAgICAgICBpZiAobUhlYXAwLnByb21vdGUoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIC8vTE9HRCgicmVxdWVzdExvY2tlZDogKDApIGNyZWF0aW5nIG5ldyBoZWFwIik7Ci0gICAgICAgICAgICAgICAgbUhlYXAwLnNldChuZXcgUE1lbUhlYXAoIi9kZXYvcG1lbV9ncHUwIiwgMCwgR1BVX1JFU0VSVkVEX1NJWkUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtSGVhcDAuaXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICAgICAgLy9MT0dEKCJyZXF1ZXN0TG9ja2VkOiAoMCkgaGVhcCBpcyB2YWxpZCIpOwotICAgICAgICAgICAgICAgIHN1cmZhY2VIZWFwID0gc3RhdGljX2Nhc3Q8IFBNZW1IZWFwKiA+KCBtSGVhcDAuZ2V0SGVhcCgpLmdldCgpICk7Ci0gICAgICAgICAgICAgICAgcGFydCA9ICZtSGVhcDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChtSGVhcDAuaXNWYWxpZCgpIHx8IG1IZWFwMS5pc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgIGlmIChtSGVhcFIucHJvbW90ZSgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgLy9MT0dEKCJyZXF1ZXN0TG9ja2VkOiAoUikgY3JlYXRpbmcgbmV3IHJlZ2lzdGVyIGhlYXAiKTsKLSAgICAgICAgICAgICAgICBtSGVhcFIuc2V0KG5ldyBHUFVSZWdpc3RlckhlYXAodGhpcykpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gd2UgZ290IG5vdGhpbmcuLi4KLSAgICAgICAgICAgIG1IZWFwMC5jbGVhcigpOwotICAgICAgICAgICAgbUhlYXAxLmNsZWFyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUhlYXBSLmlzVmFsaWQoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgLy9MT0dEKCJyZXF1ZXN0TG9ja2VkOiAoUikgcmVnaXN0ZXIgaGVhcCBub3QgdmFsaWQhISEiKTsKLSAgICAgICAgICAgIC8vIGRhbW4sIGNvdWxkbid0IGdldCB0aGUgZ3B1IHJlZ2lzdGVycyEKLSAgICAgICAgICAgIG1IZWFwMC5jbGVhcigpOwotICAgICAgICAgICAgbUhlYXAxLmNsZWFyKCk7Ci0gICAgICAgICAgICBzdXJmYWNlSGVhcC5jbGVhcigpOwotICAgICAgICAgICAgcGFydCA9IE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3VyZmFjZUhlYXAgIT0gMCAmJiBwYXJ0ICYmIHBhcnQtPmdldENsaWVudEhlYXAoKSE9MCkgewotICAgICAgICAgICAgcGFydC0+cmVzZXJ2ZWQgPSBHUFVfUkVTRVJWRURfU0laRTsKLSAgICAgICAgICAgIHBhcnQtPnN1cmZhY2UgPSB0cnVlOwotICAgICAgICAgICAgbUFsbG9jYXRvckRlYnVnID0gc3RhdGljX2Nhc3Q8U2ltcGxlQmVzdEZpdEFsbG9jYXRvcio+KAotICAgICAgICAgICAgICAgICAgICBzdXJmYWNlSGVhcC0+Z2V0QWxsb2NhdG9yKCkuZ2V0KCkpOwotICAgICAgICAgICAgbUFsbG9jYXRvciA9IG5ldyBNZW1vcnlEZWFsZXIoCi0gICAgICAgICAgICAgICAgICAgIHBhcnQtPmdldENsaWVudEhlYXAoKSwKLSAgICAgICAgICAgICAgICAgICAgc3VyZmFjZUhlYXAtPmdldEFsbG9jYXRvcigpKTsKLSAgICAgICAgfQorICAgICAgICBtT3duZXIgPSBOT19PV05FUjsKKyAgICAgICAgbUN1cnJlbnRBbGxvY2F0b3IuY2xlYXIoKTsKKyAgICAgICAgbUNhbGxiYWNrLmNsZWFyKCk7CiAgICAgfQogfQogCi12b2lkIEdQVUhhcmR3YXJlOjpyZWxlYXNlTG9ja2VkKGJvb2wgZGlzcG9zZSkKK0dQVUhhcmR3YXJlOjpDbGllbnQmIEdQVUhhcmR3YXJlOjpnZXRDbGllbnRMb2NrZWQocGlkX3QgcGlkKQogewotICAgIC8qIAotICAgICAqIGlmIGRpc3Bvc2UgaXMgc2V0LCB3ZSB3aWxsIGZvcmNlIHRoZSBkZXN0cnVjdGlvbiBvZiB0aGUgaGVhcCwKLSAgICAgKiBzbyBpdCBpcyBnaXZlbiBiYWNrIHRvIG90aGVyIHN5c3RlbXMsIHN1Y2ggYXMgY2FtZXJhLgotICAgICAqIE90aGVyd2lzZSwgd2UnbGwga2VlcCBhIHdlYWsgcG9pbnRlciB0byBpdCwgdGhpcyB3YXkgd2UgbWlnaHQgYmUgYWJsZQotICAgICAqIHRvIHJldXNlIGl0IGxhdGVyIGlmIGl0J3Mgc3RpbGwgYXJvdW5kLiAKLSAgICAgKi8KLSAgICAvL0xPR0QoInJldm9raW5nIGdwdSBmcm9tIHBpZCAlZCIsIG1Pd25lcik7Ci0gICAgbU93bmVyID0gTk9fT1dORVI7Ci0gICAgbUFsbG9jYXRvci5jbGVhcigpOwotICAgIG1DYWxsYmFjay5jbGVhcigpOwotCi0gICAgLyogaWYgd2UncmUgYXNrZWQgZm9yIGEgZnVsbCByZXZva2UsIGRpc3Bvc2Ugb25seSBvZiB0aGUgaGVhcAotICAgICAqIHdlJ3JlIG5vdCB1c2luZyBmb3Igc3VyZmFjZSAoYXMgd2UgbWlnaHQgbmVlZCBpdCB3aGlsZSBkcmF3aW5nKSAqLwotICAgIG1IZWFwMC5yZWxlYXNlKG1IZWFwMC5zdXJmYWNlID8gZmFsc2UgOiBkaXNwb3NlKTsKLSAgICBtSGVhcDEucmVsZWFzZShtSGVhcDEuc3VyZmFjZSA/IGZhbHNlIDogZGlzcG9zZSk7Ci0gICAgbUhlYXBSLnJlbGVhc2UoZmFsc2UpOworICAgIHNzaXplX3QgaW5kZXggPSBtQ2xpZW50cy5pbmRleE9mS2V5KHBpZCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBDbGllbnQgY2xpZW50OworICAgICAgICBjbGllbnQucGlkID0gcGlkOworICAgICAgICBjbGllbnQuc21pLmhlYXAgPSBtU01JSGVhcDsKKyAgICAgICAgY2xpZW50LmViaS5oZWFwID0gbUVCSUhlYXA7CisgICAgICAgIGNsaWVudC5yZWcuaGVhcCA9IG1SRUdIZWFwOworICAgICAgICBpbmRleCA9IG1DbGllbnRzLmFkZChwaWQsIGNsaWVudCk7CisgICAgfQorICAgIENsaWVudCYgY2xpZW50KG1DbGllbnRzLmVkaXRWYWx1ZUF0KGluZGV4KSk7CisgICAgY2xpZW50LmNyZWF0ZUNsaWVudEhlYXBzKCk7CisgICAgcmV0dXJuIGNsaWVudDsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNDQ0LDggKzQ5MCw3IEBACiAKIHNwPFNpbXBsZUJlc3RGaXRBbGxvY2F0b3I+IEdQVUhhcmR3YXJlOjpnZXRBbGxvY2F0b3IoKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBzcDxTaW1wbGVCZXN0Rml0QWxsb2NhdG9yPiBhbGxvY2F0b3IgPSBtQWxsb2NhdG9yRGVidWcucHJvbW90ZSgpOwotICAgIHJldHVybiBhbGxvY2F0b3I7CisgICAgcmV0dXJuIG1BbGxvY2F0b3I7CiB9CiAKIHZvaWQgR1BVSGFyZHdhcmU6OnVuY29uZGl0aW9uYWxSZXZva2UoKQpAQCAtNDU2LDEwMiArNTAxLDgxIEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0KLUdQVUhhcmR3YXJlOjpHUFVQYXJ0OjpHUFVQYXJ0KCkKLSAgICA6IHN1cmZhY2UoZmFsc2UpLCByZXNlcnZlZCgwKQotewotfQotCi1HUFVIYXJkd2FyZTo6R1BVUGFydDo6fkdQVVBhcnQoKSB7Ci19Ci0gICAgCi1jb25zdCBzcDxQTWVtSGVhcEludGVyZmFjZT4mIEdQVUhhcmR3YXJlOjpHUFVQYXJ0OjpnZXRIZWFwKCkgY29uc3QgewotICAgIHJldHVybiBtSGVhcDsKLX0KLQotY29uc3Qgc3A8TWVtb3J5SGVhcFBtZW0+JiBHUFVIYXJkd2FyZTo6R1BVUGFydDo6Z2V0Q2xpZW50SGVhcCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUNsaWVudEhlYXA7Ci19Ci0KLWJvb2wgR1BVSGFyZHdhcmU6OkdQVVBhcnQ6OmlzVmFsaWQoKSBjb25zdCB7Ci0gICAgcmV0dXJuICgobUhlYXAhPTApICYmIChtSGVhcC0+YmFzZSgpICE9IE1BUF9GQUlMRUQpKTsKLX0KLQotdm9pZCBHUFVIYXJkd2FyZTo6R1BVUGFydDo6Y2xlYXIoKSAKLXsKLSAgICBtSGVhcC5jbGVhcigpOwotICAgIG1IZWFwV2Vhay5jbGVhcigpOwotICAgIG1DbGllbnRIZWFwLmNsZWFyKCk7Ci0gICAgc3VyZmFjZSA9IGZhbHNlOwotfQotCi12b2lkIEdQVUhhcmR3YXJlOjpHUFVQYXJ0OjpzZXQoY29uc3Qgc3A8UE1lbUhlYXBJbnRlcmZhY2U+JiBoZWFwKSAKLXsKLSAgICBtSGVhcFdlYWsuY2xlYXIoKTsKLSAgICBpZiAoaGVhcCE9MCAmJiBoZWFwLT5iYXNlKCkgPT0gTUFQX0ZBSUxFRCkgewotICAgICAgICBtSGVhcC5jbGVhcigpOwotICAgICAgICBtQ2xpZW50SGVhcC5jbGVhcigpOwotICAgIH0gZWxzZSB7IAotICAgICAgICBtSGVhcCA9IGhlYXA7Ci0gICAgICAgIG1DbGllbnRIZWFwID0gbUhlYXAtPmNyZWF0ZUNsaWVudEhlYXAoKTsKLSAgICB9Ci19Ci0KLWJvb2wgR1BVSGFyZHdhcmU6OkdQVVBhcnQ6OnByb21vdGUoKSAKLXsKLSAgICAvL0xPR0QoIm1IZWFwV2Vhaz0lcCwgbUhlYXA9JXAiLCBtSGVhcFdlYWsudW5zYWZlX2dldCgpLCBtSGVhcC5nZXQoKSk7Ci0gICAgaWYgKG1IZWFwID09IDApIHsKLSAgICAgICAgbUhlYXAgPSBtSGVhcFdlYWsucHJvbW90ZSgpOwotICAgIH0KLSAgICBpZiAobUhlYXAgIT0gMCkgewotICAgICAgICBpZiAobUNsaWVudEhlYXAgIT0gMCkgewotICAgICAgICAgICAgbUNsaWVudEhlYXAtPnJldm9rZSgpOwotICAgICAgICB9Ci0gICAgICAgIG1DbGllbnRIZWFwID0gbUhlYXAtPmNyZWF0ZUNsaWVudEhlYXAoKTsKLSAgICB9ICBlbHNlIHsKLSAgICAgICAgc3VyZmFjZSA9IGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gbUhlYXAgIT0gMDsKLX0KLQotc3A8SU1lbW9yeT4gR1BVSGFyZHdhcmU6OkdQVVBhcnQ6Om1hcChib29sIGNsZWFyKSAKLXsKK3NwPElNZW1vcnk+IEdQVUhhcmR3YXJlOjpHUFVBcmVhOjptYXAoKSB7CiAgICAgc3A8SU1lbW9yeT4gbWVtb3J5OwotICAgIGlmIChtQ2xpZW50SGVhcCAhPSBOVUxMKSB7Ci0gICAgICAgIG1lbW9yeSA9IG1DbGllbnRIZWFwLT5tYXBNZW1vcnkoMCwgbUhlYXAtPnZpcnR1YWxTaXplKCkpOwotICAgICAgICBpZiAoY2xlYXIgJiYgbWVtb3J5IT0wKSB7Ci0gICAgICAgICAgICAvL1N0b3BXYXRjaCBzdygibWVtc2V0Iik7Ci0gICAgICAgICAgICBtZW1zZXQobWVtb3J5LT5wb2ludGVyKCksIDAsIG1lbW9yeS0+c2l6ZSgpKTsKLSAgICAgICAgfQorICAgIGlmIChjbGllbnRIZWFwICE9IDAgJiYgaGVhcCAhPSAwKSB7CisgICAgICAgIG1lbW9yeSA9IGNsaWVudEhlYXAtPm1hcE1lbW9yeSgwLCBoZWFwLT52aXJ0dWFsU2l6ZSgpKTsKICAgICB9CiAgICAgcmV0dXJuIG1lbW9yeTsKIH0KIAotdm9pZCBHUFVIYXJkd2FyZTo6R1BVUGFydDo6cmVsZWFzZShib29sIGRpc3Bvc2UpCit2b2lkIEdQVUhhcmR3YXJlOjpDbGllbnQ6OmNyZWF0ZUNsaWVudEhlYXBzKCkgCiB7Ci0gICAgaWYgKG1DbGllbnRIZWFwICE9IDApIHsKLSAgICAgICAgbUNsaWVudEhlYXAtPnJldm9rZSgpOwotICAgICAgICBtQ2xpZW50SGVhcC5jbGVhcigpOworICAgIGlmIChzbWkuY2xpZW50SGVhcCA9PSAwKQorICAgICAgICBzbWkuY2xpZW50SGVhcCA9IHNtaS5oZWFwLT5jcmVhdGVDbGllbnRIZWFwKCk7CisgICAgaWYgKGViaS5jbGllbnRIZWFwID09IDApCisgICAgICAgIGViaS5jbGllbnRIZWFwID0gZWJpLmhlYXAtPmNyZWF0ZUNsaWVudEhlYXAoKTsKKyAgICBpZiAocmVnLmNsaWVudEhlYXAgPT0gMCkKKyAgICAgICAgcmVnLmNsaWVudEhlYXAgPSByZWcuaGVhcC0+Y3JlYXRlQ2xpZW50SGVhcCgpOworfQorCit2b2lkIEdQVUhhcmR3YXJlOjpDbGllbnQ6OnJldm9rZUFsbEhlYXBzKCkgCit7CisgICAgaWYgKHNtaS5jbGllbnRIZWFwICE9IDApCisgICAgICAgIHNtaS5jbGllbnRIZWFwLT5yZXZva2UoKTsKKyAgICBpZiAoZWJpLmNsaWVudEhlYXAgIT0gMCkKKyAgICAgICAgZWJpLmNsaWVudEhlYXAtPnJldm9rZSgpOworICAgIGlmIChyZWcuY2xpZW50SGVhcCAhPSAwKQorICAgICAgICByZWcuY2xpZW50SGVhcC0+cmV2b2tlKCk7Cit9CisKK3ZvaWQgR1BVSGFyZHdhcmU6OnJlZ2lzdGVyQ2FsbGJhY2tMb2NrZWQoY29uc3Qgc3A8SUdQVUNhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgICAgIENsaWVudCYgY2xpZW50KQoreworICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IGNhbGxiYWNrLT5hc0JpbmRlcigpOworICAgIGlmIChtUmVnaXN0ZXJlZENsaWVudHMuYWRkKGJpbmRlciwgY2xpZW50LnBpZCkgPj0gMCkgeworICAgICAgICBiaW5kZXItPmxpbmtUb0RlYXRoKHRoaXMpOwogICAgIH0KLSAgICBpZiAoZGlzcG9zZSkgewotICAgICAgICBpZiAobUhlYXBXZWFrIT0wICYmIG1IZWFwPT0wKSB7Ci0gICAgICAgICAgICBtSGVhcCA9IG1IZWFwV2Vhay5wcm9tb3RlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1IZWFwICE9IDApIHsKLSAgICAgICAgICAgIG1IZWFwLT5kaXNwb3NlKCk7Ci0gICAgICAgICAgICBtSGVhcFdlYWsuY2xlYXIoKTsKLSAgICAgICAgICAgIG1IZWFwLmNsZWFyKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdXJmYWNlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAobUhlYXAgIT0gMCkgewotICAgICAgICAgICAgbUhlYXBXZWFrID0gbUhlYXA7Ci0gICAgICAgICAgICBtSGVhcC5jbGVhcigpOworfQorCit2b2lkIEdQVUhhcmR3YXJlOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBwaWRfdCBwaWQgPSBtUmVnaXN0ZXJlZENsaWVudHMudmFsdWVGb3Iod2hvKTsKKyAgICBpZiAocGlkICE9IDApIHsKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IG1DbGllbnRzLmluZGV4T2ZLZXkocGlkKTsKKyAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgIC8vTE9HRCgiKioqIHJlbW92aW5nIGNsaWVudCBhdCAlZCIsIGluZGV4KTsKKyAgICAgICAgICAgIENsaWVudCYgY2xpZW50KG1DbGllbnRzLmVkaXRWYWx1ZUF0KGluZGV4KSk7CisgICAgICAgICAgICBjbGllbnQucmV2b2tlQWxsSGVhcHMoKTsgLy8gbm90IHJlYWxseSBuZWVkZWQgaW4gdGhlb3J5CisgICAgICAgICAgICBtQ2xpZW50cy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKKyAgICAgICAgICAgIGlmIChtQ2xpZW50cy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vTE9HRCgiKioqIHdhcyBsYXN0IGNsaWVudCBjbG9zaW5nIGV2ZXJ5dGhpbmciKTsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2suY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtQWxsb2NhdG9yLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRBbGxvY2F0b3IuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtU01JSGVhcC5jbGVhcigpOworICAgICAgICAgICAgICAgIG1SRUdIZWFwLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gTk9URTogd2UgY2Fubm90IGNsZWFyIHRoZSBFQkkgaGVhcCBiZWNhdXNlIHN1cmZhY2VmbGluZ2VyCisgICAgICAgICAgICAgICAgLy8gaXRzZWxmIG1heSBiZSB1c2luZyBpdCwgc2luY2UgdGhpcyBpcyB3aGVyZSBzdXJmYWNlcworICAgICAgICAgICAgICAgIC8vIGFyZSBhbGxvY2F0ZWQuIGlmIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgY29tcG9zaXRpbmcgCisgICAgICAgICAgICAgICAgLy8gYSBzdXJmYWNlIChldmVuIGlmIGl0cyBwcm9jZXNzIGp1c3QgZGllZCksIHdlIGNhbm5vdAorICAgICAgICAgICAgICAgIC8vIHJpcCB0aGUgaGVhcCB1bmRlciBvdXIgZmVldC4KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBtT3duZXIgPSBOT19PV05FUjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3NwPEdQVUhhcmR3YXJlSW50ZXJmYWNlPiBHUFVGYWN0b3J5OjpnZXRHUFUoKQoreworICAgIHJldHVybiBuZXcgR1BVSGFyZHdhcmUoKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9saWJzL3N1cmZhY2VmbGluZ2VyL0dQVUhhcmR3YXJlL0dQVUhhcmR3YXJlLmggYi9saWJzL3N1cmZhY2VmbGluZ2VyL0dQVUhhcmR3YXJlL0dQVUhhcmR3YXJlLmgKaW5kZXggOWE3OGI5OS4uMzM1NDUyOCAxMDA2NDQKLS0tIGEvbGlicy9zdXJmYWNlZmxpbmdlci9HUFVIYXJkd2FyZS9HUFVIYXJkd2FyZS5oCisrKyBiL2xpYnMvc3VyZmFjZWZsaW5nZXIvR1BVSGFyZHdhcmUvR1BVSGFyZHdhcmUuaApAQCAtMjIsOTIgKzIyLDM5IEBACiAKICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisKKyNpbmNsdWRlIDx1aS9JU3VyZmFjZUNvbXBvc2VyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWNsYXNzIEdQVUhhcmR3YXJlSW50ZXJmYWNlIDogcHVibGljIFJlZkJhc2UKK2NsYXNzIElHUFVDYWxsYmFjazsKKworY2xhc3MgR1BVSGFyZHdhcmVJbnRlcmZhY2UgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCiB7CiBwdWJsaWM6CiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgIHJldm9rZShpbnQgcGlkKSA9IDA7CiAgICAgdmlydHVhbCBzcDxNZW1vcnlEZWFsZXI+ICAgIHJlcXVlc3QoaW50IHBpZCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICByZXF1ZXN0KGNvbnN0IHNwPElHUFVDYWxsYmFjaz4mIGNhbGxiYWNrLAorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICByZXF1ZXN0KGludCBwaWQsIGNvbnN0IHNwPElHUFVDYWxsYmFjaz4mIGNhbGxiYWNrLAogICAgICAgICAgICAgSVN1cmZhY2VDb21wb3Nlcjo6Z3B1X2luZm9fdCogZ3B1KSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgZnJpZW5kbHlSZXZva2UoKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgIHVuY29uZGl0aW9uYWxSZXZva2UoKSA9IDA7CiAgICAgCiAgICAgLy8gdXNlZCBmb3IgZGVidWdnaW5nIG9ubHkuLi4KICAgICB2aXJ0dWFsIHNwPFNpbXBsZUJlc3RGaXRBbGxvY2F0b3I+IGdldEFsbG9jYXRvcigpIGNvbnN0ICA9IDA7CiAgICAgdmlydHVhbCBwaWRfdCBnZXRPd25lcigpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgdW5jb25kaXRpb25hbFJldm9rZSgpID0gMDsKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1jbGFzcyBJTWVtb3J5OwotY2xhc3MgTWVtb3J5SGVhcFBtZW07Ci1jbGFzcyBQTWVtSGVhcDsKLQotY2xhc3MgR1BVSGFyZHdhcmUgOiBwdWJsaWMgR1BVSGFyZHdhcmVJbnRlcmZhY2UKLXsKK2NsYXNzIEdQVUZhY3RvcnkKK3sgICAgCiBwdWJsaWM6Ci0gICAgICAgICAgICBHUFVIYXJkd2FyZSgpOwotICAgIHZpcnR1YWwgfkdQVUhhcmR3YXJlKCk7Ci0gICAgCi0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgIHJldm9rZShpbnQgcGlkKTsKLSAgICB2aXJ0dWFsIHNwPE1lbW9yeURlYWxlcj4gICAgcmVxdWVzdChpbnQgcGlkKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgcmVxdWVzdChjb25zdCBzcDxJR1BVQ2FsbGJhY2s+JiBjYWxsYmFjaywKLSAgICAgICAgICAgIElTdXJmYWNlQ29tcG9zZXI6OmdwdV9pbmZvX3QqIGdwdSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgZnJpZW5kbHlSZXZva2UoKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgdW5jb25kaXRpb25hbFJldm9rZSgpOwotICAgIAotICAgIC8vIHVzZWQgZm9yIGRlYnVnZ2luZyBvbmx5Li4uCi0gICAgdmlydHVhbCBzcDxTaW1wbGVCZXN0Rml0QWxsb2NhdG9yPiBnZXRBbGxvY2F0b3IoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHBpZF90IGdldE93bmVyKCkgY29uc3QgeyByZXR1cm4gbU93bmVyOyB9Ci0gICAgCi1wcml2YXRlOgotICAgIGVudW0gewotICAgICAgICBOT19PV05FUiAgICAgICAgPSAtMSwKLSAgICAgICAgU1VSRkFDRV9GQUlMRUQgID0gLTIKLSAgICB9OwotICAgIAotICAgIHZvaWQgcmVxdWVzdExvY2tlZCgpOwotICAgIHZvaWQgcmVsZWFzZUxvY2tlZChib29sIGRpc3Bvc2UgPSBmYWxzZSk7Ci0gICAgdm9pZCB0YWtlQmFja0dQVUxvY2tlZCgpOwotICAgIAotICAgIGNsYXNzIEdQVVBhcnQKLSAgICB7Ci0gICAgcHVibGljOgotICAgICAgICBib29sIHN1cmZhY2U7Ci0gICAgICAgIHNpemVfdCByZXNlcnZlZDsKLSAgICAgICAgR1BVUGFydCgpOwotICAgICAgICB+R1BVUGFydCgpOwotICAgICAgICBjb25zdCBzcDxQTWVtSGVhcEludGVyZmFjZT4mIGdldEhlYXAoKSBjb25zdDsKLSAgICAgICAgY29uc3Qgc3A8TWVtb3J5SGVhcFBtZW0+JiBnZXRDbGllbnRIZWFwKCkgY29uc3Q7Ci0gICAgICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0OwotICAgICAgICB2b2lkIGNsZWFyKCk7Ci0gICAgICAgIHZvaWQgc2V0KGNvbnN0IHNwPFBNZW1IZWFwSW50ZXJmYWNlPiYgaGVhcCk7Ci0gICAgICAgIGJvb2wgcHJvbW90ZSgpOwotICAgICAgICBzcDxJTWVtb3J5PiBtYXAoYm9vbCBjbGVhciA9IGZhbHNlKTsKLSAgICAgICAgdm9pZCByZWxlYXNlKGJvb2wgZGlzcG9zZSk7Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgc3A8UE1lbUhlYXBJbnRlcmZhY2U+ICAgbUhlYXA7Ci0gICAgICAgIHdwPFBNZW1IZWFwSW50ZXJmYWNlPiAgIG1IZWFwV2VhazsKLSAgICAgICAgc3A8TWVtb3J5SGVhcFBtZW0+ICAgICAgbUNsaWVudEhlYXA7Ci0gICAgfTsKLSAgICAKLSAgICBtdXRhYmxlIE11dGV4ICAgbUxvY2s7Ci0gICAgR1BVUGFydCAgICAgICAgIG1IZWFwMDsgLy8gU01JCi0gICAgR1BVUGFydCAgICAgICAgIG1IZWFwMTsgLy8gRUJJMQotICAgIEdQVVBhcnQgICAgICAgICBtSGVhcFI7Ci0gICAgc3A8TWVtb3J5RGVhbGVyPiBtQWxsb2NhdG9yOwotICAgIHBpZF90ICAgICAgICAgICAgbU93bmVyOwotICAgIHNwPElHUFVDYWxsYmFjaz4gbUNhbGxiYWNrOwotICAgIHdwPFNpbXBsZUJlc3RGaXRBbGxvY2F0b3I+IG1BbGxvY2F0b3JEZWJ1ZzsKLSAgICAKLSAgICBDb25kaXRpb24gICAgICAgbUNvbmRpdGlvbjsKKyAgICAvLyB0aGUgZ3B1IGZhY3RvcnkKKyAgICBzdGF0aWMgc3A8R1BVSGFyZHdhcmVJbnRlcmZhY2U+IGdldEdQVSgpOwogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9saWJzL3N1cmZhY2VmbGluZ2VyL0xheWVyLmNwcCBiL2xpYnMvc3VyZmFjZWZsaW5nZXIvTGF5ZXIuY3BwCmluZGV4IDRmNmJhZTEuLjhiYTA4NTEgMTAwNjQ0Ci0tLSBhL2xpYnMvc3VyZmFjZWZsaW5nZXIvTGF5ZXIuY3BwCisrKyBiL2xpYnMvc3VyZmFjZWZsaW5nZXIvTGF5ZXIuY3BwCkBAIC05MiwyNiArOTIsMjkgQEAKICAgICBzdGF0dXNfdCBlcnIgPSBnZXRQaXhlbEZvcm1hdEluZm8oZm9ybWF0LCAmaW5mbyk7CiAgICAgaWYgKGVycikgcmV0dXJuIGVycjsKIAotICAgIC8vIFRPRE86IGlmIGVIYXJkd2FyZSBpcyBleHBsaWNpdGVseSByZXF1ZXN0ZWQsIHdlIHNob3VsZCBmYWlsCisgICAgLy8gVE9ETzogaWYgZUhhcmR3YXJlIGlzIGV4cGxpY2l0bHkgcmVxdWVzdGVkLCB3ZSBzaG91bGQgZmFpbAogICAgIC8vIG9uIHN5c3RlbXMgd2hlcmUgd2UgY2FuJ3QgYWxsb2NhdGUgbWVtb3J5IHRoYXQgY2FuIGJlIHVzZWQgd2l0aAogICAgIC8vIERNQSBlbmdpbmVzIGZvciBpbnN0YW5jZS4KKyAgICAKKyAgICAvLyBGSVhNRTogd2UgYWx3YXlzIGFzayBmb3IgaGFyZHdhcmUgZm9yIG5vdyAodGhpcyBzaG91bGQgY29tZSBmcm9tIGNvcHliaXQpCisgICAgZmxhZ3MgfD0gSVN1cmZhY2VDb21wb3Nlcjo6ZUhhcmR3YXJlOwogCi0gICAgaW50IG1lbW9yeV90eXBlID0gTkFUSVZFX01FTU9SWV9UWVBFX1BNRU07CisgICAgY29uc3QgdWludDMyX3QgbWVtb3J5X2ZsYWdzID0gZmxhZ3MgJiAKKyAgICAgICAgICAgIChJU3VyZmFjZUNvbXBvc2VyOjplR1BVIHwgCisgICAgICAgICAgICAgSVN1cmZhY2VDb21wb3Nlcjo6ZUhhcmR3YXJlIHwgCisgICAgICAgICAgICAgSVN1cmZhY2VDb21wb3Nlcjo6ZVNlY3VyZSk7CiAgICAgCiAgICAgLy8gcGl4ZWwtYWxpZ25tZW50LiB0aGUgZmluYWwgYWxpZ25tZW50IG1heSBiZSBiaWdnZXIgYmVjYXVzZQogICAgIC8vIHdlIGFsd2F5cyBmb3JjZSBhIDQtYnl0ZSBhbGlnbmVkIGJwci4KICAgICB1aW50MzJfdCBhbGlnbm1lbnQgPSAxOwogCi0gICAgY29uc3QgdWludDMyX3QgbWFzayA9IElTdXJmYWNlQ29tcG9zZXI6OmVHUFUgfCBJU3VyZmFjZUNvbXBvc2VyOjplU2VjdXJlOwotICAgIGlmICgoZmxhZ3MgJiBtYXNrKSA9PSBJU3VyZmFjZUNvbXBvc2VyOjplR1BVKSB7Ci0gICAgICAgIC8vIGRvbid0IGdyYW50IEdQVSBtZW1vcnkgaWYgR1BVIGlzIGRpc2FibGVkCi0gICAgICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICAgICAgcHJvcGVydHlfZ2V0KCJkZWJ1Zy5lZ2wuaHciLCB2YWx1ZSwgIjEiKTsKLSAgICAgICAgaWYgKGF0b2kodmFsdWUpICE9IDApIHsKLSAgICAgICAgICAgIGZsYWdzIHw9IElTdXJmYWNlQ29tcG9zZXI6OmVIYXJkd2FyZTsKLSAgICAgICAgICAgIG1lbW9yeV90eXBlID0gTkFUSVZFX01FTU9SWV9UWVBFX0dQVTsKLSAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgdmFsdWUgc2hvdWxkIGNvbWUgZnJvbSB0aGUgaC93Ci0gICAgICAgICAgICBhbGlnbm1lbnQgPSA4OyAKKyAgICBpZiAoZmxhZ3MgJiBJU3VyZmFjZUNvbXBvc2VyOjplR1BVKSB7CisgICAgICAgIC8vIEZJWE1FOiB0aGlzIHZhbHVlIHNob3VsZCBjb21lIGZyb20gdGhlIGgvdworICAgICAgICBhbGlnbm1lbnQgPSA4OyAKKyAgICAgICAgLy8gRklYTUU6IHRoaXMgaXMgbXNtNzIwMUEgc3BlY2lmaWMsIGFzIGl0cyBHUFUgb25seSBzdXBwb3J0cworICAgICAgICAvLyBCR1JBXzg4ODguCisgICAgICAgIGlmIChmb3JtYXQgPT0gUElYRUxfRk9STUFUX1JHQkFfODg4OCkgeworICAgICAgICAgICAgZm9ybWF0ID0gUElYRUxfRk9STUFUX0JHUkFfODg4ODsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTE5LDcgKzEyMiw3IEBACiAgICAgbU5lZWRzQmxlbmRpbmcgPSAoaW5mby5oX2FscGhhIC0gaW5mby5sX2FscGhhKSA+IDA7CiAgICAgc3A8TWVtb3J5RGVhbGVyPiBhbGxvY2F0b3JzWzJdOwogICAgIGZvciAoaW50IGk9MCA7IGk8MiA7IGkrKykgewotICAgICAgICBhbGxvY2F0b3JzW2ldID0gY2xpZW50LT5jcmVhdGVBbGxvY2F0b3IobWVtb3J5X3R5cGUpOworICAgICAgICBhbGxvY2F0b3JzW2ldID0gY2xpZW50LT5jcmVhdGVBbGxvY2F0b3IobWVtb3J5X2ZsYWdzKTsKICAgICAgICAgaWYgKGFsbG9jYXRvcnNbaV0gPT0gMCkKICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CiAgICAgICAgIG1CdWZmZXJzW2ldLmluaXQoYWxsb2NhdG9yc1tpXSk7CkBAIC0xMzMsNyArMTM2LDcgQEAKICAgICBtU3VyZmFjZSA9IG5ldyBTdXJmYWNlKGNsaWVudEluZGV4KCksCiAgICAgICAgICAgICBhbGxvY2F0b3JzWzBdLT5nZXRNZW1vcnlIZWFwKCksCiAgICAgICAgICAgICBhbGxvY2F0b3JzWzFdLT5nZXRNZW1vcnlIZWFwKCksCi0gICAgICAgICAgICBtZW1vcnlfdHlwZSwgbUlkZW50aXR5KTsKKyAgICAgICAgICAgIG1JZGVudGl0eSk7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC0xODAsNyArMTgzLDcgQEAKICAgICAgICAgZnJvbnQuZ2V0Qml0bWFwU3VyZmFjZSgmc3JjKTsKICAgICAgICAgY29weWJpdF9yZWN0X3Qgc3JlY3QgPSB7IDAsIDAsIHQud2lkdGgsIHQuaGVpZ2h0IH07CiAKLSAgICAgICAgY29weWJpdF90KiBjb3B5Yml0ID0gbUZsaW5nZXItPmdldEJsaXRFbmdpbmUoKTsKKyAgICAgICAgY29weWJpdF9kZXZpY2VfdCogY29weWJpdCA9IG1GbGluZ2VyLT5nZXRCbGl0RW5naW5lKCk7CiAgICAgICAgIGNvcHliaXQtPnNldF9wYXJhbWV0ZXIoY29weWJpdCwgQ09QWUJJVF9UUkFOU0ZPUk0sIGdldE9yaWVudGF0aW9uKCkpOwogICAgICAgICBjb3B5Yml0LT5zZXRfcGFyYW1ldGVyKGNvcHliaXQsIENPUFlCSVRfUExBTkVfQUxQSEEsIHMuYWxwaGEpOwogICAgICAgICBjb3B5Yml0LT5zZXRfcGFyYW1ldGVyKGNvcHliaXQsIENPUFlCSVRfRElUSEVSLApkaWZmIC0tZ2l0IGEvbGlicy9zdXJmYWNlZmxpbmdlci9MYXllckJhc2UuY3BwIGIvbGlicy9zdXJmYWNlZmxpbmdlci9MYXllckJhc2UuY3BwCmluZGV4IDE3YzlmNDIuLmFmMzUzZTIgMTAwNjQ0Ci0tLSBhL2xpYnMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCYXNlLmNwcAorKysgYi9saWJzL3N1cmZhY2VmbGluZ2VyL0xheWVyQmFzZS5jcHAKQEAgLTMwLDcgKzMwLDcgQEAKICNpbmNsdWRlICJEaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmgiCiAKIAotLy8gV2UgZG9uJ3QgaG9ub3IgdGhlIHByZW11bHRpcGxpYWQgYWxwaGEgZmxhZ3MsIHdoaWNoIG1lYW5zIHRoYXQKKy8vIFdlIGRvbid0IGhvbm9yIHRoZSBwcmVtdWx0aXBsaWVkIGFscGhhIGZsYWdzLCB3aGljaCBtZWFucyB0aGF0CiAvLyBwcmVtdWx0aXBsaWVkIHN1cmZhY2UgbWF5IGJlIGNvbXBvc2VkIHVzaW5nIGEgbm9uLXByZW11bHRpcGxpZWQKIC8vIGVxdWF0aW9uLiBXZSBkbyB0aGlzIGJlY2F1c2UgaXQgbWF5IGJlIGEgbG90IGZhc3RlciBvbiBzb21lIGhhcmR3YXJlCiAvLyBUaGUgY29ycmVjdCB2YWx1ZSBpcyBIT05PUl9QUkVNVUxUSVBMSUVEX0FMUEhBID0gMQpAQCAtMjU2LDcgKzI1Niw3IEBACiAKICAgICAvLyBzZWUgaWYgd2UgY2FuL3Nob3VsZCB1c2UgMkQgaC93IHdpdGggdGhlIG5ldyBjb25maWd1cmF0aW9uCiAgICAgbUNhblVzZUNvcHlCaXQgPSBmYWxzZTsKLSAgICBjb3B5Yml0X3QqIGNvcHliaXQgPSBtRmxpbmdlci0+Z2V0QmxpdEVuZ2luZSgpOworICAgIGNvcHliaXRfZGV2aWNlX3QqIGNvcHliaXQgPSBtRmxpbmdlci0+Z2V0QmxpdEVuZ2luZSgpOwogICAgIGlmIChjb3B5Yml0KSB7IAogICAgICAgICBjb25zdCBpbnQgc3RlcCA9IGNvcHliaXQtPmdldChjb3B5Yml0LCBDT1BZQklUX1JPVEFUSU9OX1NURVBfREVHKTsKICAgICAgICAgY29uc3QgaW50IHNjYWxlQml0cyA9IGNvcHliaXQtPmdldChjb3B5Yml0LCBDT1BZQklUX1NDQUxJTkdfRlJBQ19CSVRTKTsKQEAgLTQxMyw3ICs0MTMsNyBAQAogICAgICAgICAvLyBwcmVtdWx0aXBsaWVkIGFscGhhLgogICAgICAgICAKICAgICAgICAgLy8gSWYgdGhlIHRleHR1cmUgZG9lc24ndCBoYXZlIGFuIGFscGhhIGNoYW5uZWwgd2UgY2FuCi0gICAgICAgIC8vIHVzZSBSRVBMQUNFIGFuZCBzd2l0Y2ggdG8gbm9uIHByZW11bHRpcGxpZWQtYWxwaGEKKyAgICAgICAgLy8gdXNlIFJFUExBQ0UgYW5kIHN3aXRjaCB0byBub24gcHJlbXVsdGlwbGllZCBhbHBoYQogICAgICAgICAvLyBibGVuZGluZyAoU1JDQS9PTkVfTUlOVVNfU1JDQSkuCiAgICAgICAgIAogICAgICAgICBHTGVudW0gZW52LCBzcmM7CkBAIC00MzEsMTEgKzQzMSwxMSBAQAogICAgICAgICBnbFRleEVudngoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIGVudik7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZ2xUZXhFbnZ4KEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9SRVBMQUNFKTsKKyAgICAgICAgZ2xDb2xvcjR4KDB4MTAwMDAsIDB4MTAwMDAsIDB4MTAwMDAsIDB4MTAwMDApOwogICAgICAgICBpZiAobmVlZHNCbGVuZGluZygpKSB7CiAgICAgICAgICAgICBHTGVudW0gc3JjID0gbVByZW11bHRpcGxpZWRBbHBoYSA/IEdMX09ORSA6IEdMX1NSQ19BTFBIQTsKICAgICAgICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKICAgICAgICAgICAgIGdsQmxlbmRGdW5jKHNyYywgR0xfT05FX01JTlVTX1NSQ19BTFBIQSk7Ci0gICAgICAgICAgICBnbENvbG9yNHgoMHgxMDAwMCwgMHgxMDAwMCwgMHgxMDAwMCwgMHgxMDAwMCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBnbERpc2FibGUoR0xfQkxFTkQpOwogICAgICAgICB9CkBAIC00NjMsNyArNDYzLDcgQEAKICAgICAgICAgICAgIGdsTWF0cml4TW9kZShHTF9URVhUVVJFKTsKICAgICAgICAgICAgIGdsTG9hZElkZW50aXR5KCk7CiAgICAgICAgICAgICBpZiAoIShtRmxhZ3MgJiBEaXNwbGF5SGFyZHdhcmU6Ok5QT1RfRVhURU5TSU9OKSkgewotICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHNtYWxlc3QgcG93ZXItb2YtdHdvIHRoYXQgd2lsbCBhY2NvbW9kYXRlIG91ciBzdXJmYWNlCisgICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgc21hbGxlc3QgcG93ZXItb2YtdHdvIHRoYXQgd2lsbCBhY2NvbW1vZGF0ZSBvdXIgc3VyZmFjZQogICAgICAgICAgICAgICAgIEdMdWludCB0dyA9IDEgPDwgKDMxIC0gY2x6KHQud2lkdGgpKTsKICAgICAgICAgICAgICAgICBHTHVpbnQgdGggPSAxIDw8ICgzMSAtIGNseih0LmhlaWdodCkpOwogICAgICAgICAgICAgICAgIGlmICh0dyA8IHQud2lkdGgpICB0dyA8PD0gMTsKQEAgLTU1Niw3ICs1NTYsNyBAQAogICAgIEdMdWludCB0ZXh0dXJlX3cgPSB0dzsKICAgICBHTHVpbnQgdGV4dHVyZV9oID0gdGg7CiAgICAgaWYgKCEoZmxhZ3MgJiBEaXNwbGF5SGFyZHdhcmU6Ok5QT1RfRVhURU5TSU9OKSkgewotICAgICAgICAvLyBmaW5kIHRoZSBzbWFsZXN0IHBvd2VyLW9mLXR3byB0aGF0IHdpbGwgYWNjb21vZGF0ZSBvdXIgc3VyZmFjZQorICAgICAgICAvLyBmaW5kIHRoZSBzbWFsbGVzdCBwb3dlci1vZi10d28gdGhhdCB3aWxsIGFjY29tbW9kYXRlIG91ciBzdXJmYWNlCiAgICAgICAgIHRleHR1cmVfdyA9IDEgPDwgKDMxIC0gY2x6KHQud2lkdGgpKTsKICAgICAgICAgdGV4dHVyZV9oID0gMSA8PCAoMzEgLSBjbHoodC5oZWlnaHQpKTsKICAgICAgICAgaWYgKHRleHR1cmVfdyA8IHQud2lkdGgpICB0ZXh0dXJlX3cgPDw9IDE7CkBAIC01ODIsNiArNTgyLDggQEAKICAgICAgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9ESVJFQ1RfVEVYVFVSRV8yRF9RVUFMQ09NTSwgMCwKICAgICAgICAgICAgICAgICAgICAgR0xfUkdCQSwgdHcsIHRoLCAwLAogICAgICAgICAgICAgICAgICAgICBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCB0LmRhdGEpOworICAgICAgICB9IGVsc2UgaWYgKHQuZm9ybWF0ID09IEdHTF9QSVhFTF9GT1JNQVRfQkdSQV84ODg4KSB7CisgICAgICAgICAgICAvLyBUT0RPOiBhZGQgR0xfQkdSQSBleHRlbnNpb24KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIG9vcHMsIHdlIGRvbid0IGhhbmRsZSB0aGlzIGZvcm1hdCwgdHJ5IHRoZSByZWd1bGFyIHBhdGgKICAgICAgICAgICAgIGdvdG8gcmVndWxhcjsKQEAgLTU5Miw3ICs1OTQsNyBAQAogcmVndWxhcjoKICAgICAgICAgUmVjdCBib3VuZHMoZGlydHkuYm91bmRzKCkpOwogICAgICAgICBHTHZvaWQqIGRhdGEgPSAwOwotICAgICAgICBpZiAodGV4dHVyZV93IT10ZXh0dXJlV2lkdGggfHwgdGV4dHVyZV93IT10ZXh0dXJlSGVpZ2h0KSB7CisgICAgICAgIGlmICh0ZXh0dXJlX3chPXRleHR1cmVXaWR0aCB8fCB0ZXh0dXJlX2ghPXRleHR1cmVIZWlnaHQpIHsKICAgICAgICAgICAgIC8vIHRleHR1cmUgc2l6ZSBjaGFuZ2VkLCB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBvbmUKIAogICAgICAgICAgICAgaWYgKCF0ZXh0dXJlV2lkdGggfHwgIXRleHR1cmVIZWlnaHQpIHsKQEAgLTYwNiwzMSArNjA4LDM2IEBACiAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy5zZXQoUmVjdCh0dywgdGgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0KKyAgICAgICAgICAgIAogICAgICAgICAgICAgaWYgKHQuZm9ybWF0ID09IEdHTF9QSVhFTF9GT1JNQVRfUkdCXzU2NSkgewogICAgICAgICAgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgR0xfUkdCLCB0dywgdGgsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBHTF9SR0IsIHRleHR1cmVfdywgdGV4dHVyZV9oLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgR0xfUkdCLCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSwgZGF0YSk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHQuZm9ybWF0ID09IEdHTF9QSVhFTF9GT1JNQVRfUkdCQV80NDQ0KSB7CiAgICAgICAgICAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICBHTF9SR0JBLCB0dywgdGgsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBHTF9SR0JBLCB0ZXh0dXJlX3csIHRleHR1cmVfaCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgIEdMX1JHQkEsIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzQsIGRhdGEpOwogICAgICAgICAgICAgfSBlbHNlIGlmICh0LmZvcm1hdCA9PSBHR0xfUElYRUxfRk9STUFUX1JHQkFfODg4OCkgewogICAgICAgICAgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgR0xfUkdCQSwgdHcsIHRoLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgR0xfUkdCQSwgdGV4dHVyZV93LCB0ZXh0dXJlX2gsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBkYXRhKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoIHQuZm9ybWF0ID09IEdHTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIyX1NQIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICB0LmZvcm1hdCA9PSBHR0xfUElYRUxfRk9STUFUX1lDYkNyXzQyMF9TUCkgewogICAgICAgICAgICAgICAgIC8vIGp1c3Qgc2hvdyB0aGUgWSBwbGFuZSBvZiBZVVYgYnVmZmVycwogICAgICAgICAgICAgICAgIGRhdGEgPSB0LmRhdGE7CiAgICAgICAgICAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICBHTF9MVU1JTkFOQ0UsIHR3LCB0aCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdMX0xVTUlOQU5DRSwgdGV4dHVyZV93LCB0ZXh0dXJlX2gsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICBHTF9MVU1JTkFOQ0UsIEdMX1VOU0lHTkVEX0JZVEUsIGRhdGEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBvb3BzLCB3ZSBkb24ndCBoYW5kbGUgdGhpcyBmb3JtYXQhCisgICAgICAgICAgICAgICAgTE9HRSgibGF5ZXIgJXAsIHRleHR1cmU9JWQsIHVzaW5nIGZvcm1hdCAlZCwgd2hpY2ggaXMgbm90ICIKKyAgICAgICAgICAgICAgICAgICAgICJzdXBwb3J0ZWQgYnkgdGhlIEdMIiwgdGhpcywgdGV4dHVyZU5hbWUsIHQuZm9ybWF0KTsKKyAgICAgICAgICAgICAgICB0ZXh0dXJlTmFtZSA9IC0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgdGV4dHVyZVdpZHRoID0gdHc7Ci0gICAgICAgICAgICB0ZXh0dXJlSGVpZ2h0ID0gdGg7CisgICAgICAgICAgICB0ZXh0dXJlV2lkdGggPSB0ZXh0dXJlX3c7CisgICAgICAgICAgICB0ZXh0dXJlSGVpZ2h0ID0gdGV4dHVyZV9oOwogICAgICAgICB9Ci0gICAgICAgIGlmICghZGF0YSkgeworICAgICAgICBpZiAoIWRhdGEgJiYgdGV4dHVyZU5hbWU+PTApIHsKICAgICAgICAgICAgIGlmICh0LmZvcm1hdCA9PSBHR0xfUElYRUxfRk9STUFUX1JHQl81NjUpIHsKICAgICAgICAgICAgICAgICBnbFRleFN1YkltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGJvdW5kcy50b3AsIHQud2lkdGgsIGJvdW5kcy5oZWlnaHQoKSwKZGlmZiAtLWdpdCBhL2xpYnMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCYXNlLmggYi9saWJzL3N1cmZhY2VmbGluZ2VyL0xheWVyQmFzZS5oCmluZGV4IDEwYzFiYzEuLmIzZjM3NzEgMTAwNjQ0Ci0tLSBhL2xpYnMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCYXNlLmgKKysrIGIvbGlicy9zdXJmYWNlZmxpbmdlci9MYXllckJhc2UuaApAQCAtMjMsNiArMjMsOCBAQAogI2luY2x1ZGUgPHByaXZhdGUvdWkvTGF5ZXJTdGF0ZS5oPgogCiAjaW5jbHVkZSA8dWkvUmVnaW9uLmg+CisjaW5jbHVkZSA8dWkvT3ZlcmxheS5oPgorCiAjaW5jbHVkZSA8cGl4ZWxmbGluZ2VyL3BpeGVsZmxpbmdlci5oPgogCiAjaW5jbHVkZSAiVHJhbnNmb3JtLmgiCkBAIC0yMjMsMTYgKzIyNSwxNCBAQAogICAgICAgICBTdXJmYWNlKFN1cmZhY2VJRCBpZCwgaW50IGlkZW50aXR5KSB7IAogICAgICAgICAgICAgbVBhcmFtcy50b2tlbiA9IGlkOwogICAgICAgICAgICAgbVBhcmFtcy5pZGVudGl0eSA9IGlkZW50aXR5OwotICAgICAgICAgICAgbVBhcmFtcy50eXBlID0gMDsKICAgICAgICAgfQogICAgICAgICBTdXJmYWNlKFN1cmZhY2VJRCBpZCwgCiAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwMCwKICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAxLAotICAgICAgICAgICAgICAgIGludCBtZW1vcnlfdHlwZSwgaW50IGlkZW50aXR5KQorICAgICAgICAgICAgICAgIGludCBpZGVudGl0eSkKICAgICAgICAgewogICAgICAgICAgICAgbVBhcmFtcy50b2tlbiA9IGlkOwogICAgICAgICAgICAgbVBhcmFtcy5pZGVudGl0eSA9IGlkZW50aXR5OwotICAgICAgICAgICAgbVBhcmFtcy50eXBlID0gbWVtb3J5X3R5cGU7CiAgICAgICAgICAgICBtUGFyYW1zLmhlYXBbMF0gPSBoZWFwMDsKICAgICAgICAgICAgIG1QYXJhbXMuaGVhcFsxXSA9IGhlYXAxOwogICAgICAgICB9CkBAIC0yNDAsOCArMjQwLDggQEAKICAgICAgICAgICAgIC8vIFRPRE86IFdlIG5vdyBoYXZlIGEgcG9pbnQgaGVyZSB3ZXJlIHdlIGNhbiBjbGVhbi11cCB0aGUKICAgICAgICAgICAgIC8vIGNsaWVudCdzIG1lc3MuCiAgICAgICAgICAgICAvLyBUaGlzIGlzIGFsc28gd2hlcmUgc3VyZmFjZSBpZCBzaG91bGQgYmUgcmVjeWNsZWQuCi0gICAgICAgICAgICAvL0xPR0QoIlN1cmZhY2UgJWQsIGhlYXBzPXslcCwgJXB9LCB0eXBlPSVkIGRlc3Ryb3llZCIsCi0gICAgICAgICAgICAvLyAgICAgICAgbUlkLCBtSGVhcFswXS5nZXQoKSwgbUhlYXBbMV0uZ2V0KCksIG1NZW1vcnlUeXBlKTsKKyAgICAgICAgICAgIC8vTE9HRCgiU3VyZmFjZSAlZCwgaGVhcHM9eyVwLCAlcH0gZGVzdHJveWVkIiwKKyAgICAgICAgICAgIC8vICAgICAgICBtSWQsIG1IZWFwWzBdLmdldCgpLCBtSGVhcFsxXS5nZXQoKSk7CiAgICAgICAgIH0KIAogICAgICAgICB2aXJ0dWFsIHZvaWQgZ2V0U3VyZmFjZURhdGEoCkBAIC0yNTQsNiArMjU0LDEwIEBACiAgICAgICAgICAgICAgICAgeyByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047IH0KICAgICAgICAgdmlydHVhbCB2b2lkIHBvc3RCdWZmZXIoc3NpemVfdCBvZmZzZXQpIHsgfQogICAgICAgICB2aXJ0dWFsIHZvaWQgdW5yZWdpc3RlckJ1ZmZlcnMoKSB7IH07CisgICAgICAgIHZpcnR1YWwgc3A8T3ZlcmxheT4gY3JlYXRlT3ZlcmxheSgKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCBpbnQzMl90IGZvcm1hdCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH07CiAKICAgICBwcml2YXRlOgogICAgICAgICBJU3VyZmFjZUZsaW5nZXJDbGllbnQ6OnN1cmZhY2VfZGF0YV90IG1QYXJhbXM7CmRpZmYgLS1naXQgYS9saWJzL3N1cmZhY2VmbGluZ2VyL0xheWVyQmx1ci5jcHAgYi9saWJzL3N1cmZhY2VmbGluZ2VyL0xheWVyQmx1ci5jcHAKaW5kZXggMTkyY2VkYS4uZTNhZTdmYiAxMDA2NDQKLS0tIGEvbGlicy9zdXJmYWNlZmxpbmdlci9MYXllckJsdXIuY3BwCisrKyBiL2xpYnMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCbHVyLmNwcApAQCAtMTQ1LDExICsxNDUsMTMgQEAKICAgICAgICAgICAgIG1SZWZyZXNoQ2FjaGUgPSBmYWxzZTsKICAgICAgICAgICAgIG1BdXRvUmVmcmVzaFBlbmRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgIAotICAgICAgICAgICAgdWludDE2X3QqIGNvbnN0IHBpeGVscyA9ICh1aW50MTZfdCopbWFsbG9jKHcqaCoyKTsKKyAgICAgICAgICAgIC8vIGFsbG9jYXRlIGVub3VnaCBtZW1vcnkgZm9yIDQtYnl0ZXMgKDIgcGl4ZWxzKSBhbGlnbmVkIGRhdGEKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgcyA9ICh3ICsgMSkgJiB+MTsKKyAgICAgICAgICAgIHVpbnQxNl90KiBjb25zdCBwaXhlbHMgPSAodWludDE2X3QqKW1hbGxvYyhzKmgqMik7CiAKLSAgICAgICAgICAgIC8vIHRoaXMgcmVhZHMgdGhlIGZyYW1lLWJ1ZmZlciwgc28gYSBoL3cgR0wgd291bGQgaGF2ZSB0bworICAgICAgICAgICAgLy8gVGhpcyByZWFkcyB0aGUgZnJhbWUtYnVmZmVyLCBzbyBhIGgvdyBHTCB3b3VsZCBoYXZlIHRvCiAgICAgICAgICAgICAvLyBmaW5pc2goKSBpdHMgcmVuZGVyaW5nIGZpcnN0LiB3ZSBkb24ndCB3YW50IHRvIGRvIHRoYXQKLSAgICAgICAgICAgIC8vIHRvbyBvZnRlbi4KKyAgICAgICAgICAgIC8vIHRvbyBvZnRlbi4gUmVhZCBkYXRhIGlzIDQtYnl0ZXMgYWxpZ25lZC4KICAgICAgICAgICAgIGdsUmVhZFBpeGVscyhYLCBZLCB3LCBoLCBHTF9SR0IsIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81LCBwaXhlbHMpOwogICAgICAgICAgICAgCiAgICAgICAgICAgICAvLyBibHVyIHRoYXQgdGV4dHVyZS4KQEAgLTE1Nyw3ICsxNTksNyBAQAogICAgICAgICAgICAgYmwudmVyc2lvbiA9IHNpemVvZihHR0xTdXJmYWNlKTsKICAgICAgICAgICAgIGJsLndpZHRoID0gdzsKICAgICAgICAgICAgIGJsLmhlaWdodCA9IGg7Ci0gICAgICAgICAgICBibC5zdHJpZGUgPSB3OworICAgICAgICAgICAgYmwuc3RyaWRlID0gczsKICAgICAgICAgICAgIGJsLmZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfUkdCXzU2NTsKICAgICAgICAgICAgIGJsLmRhdGEgPSAoR0dMdWJ5dGUqKXBpeGVsczsgICAgICAgICAgICAKICAgICAgICAgICAgIGJsdXJGaWx0ZXIoJmJsLCA4LCAyKTsKZGlmZiAtLWdpdCBhL2xpYnMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCdWZmZXIuY3BwIGIvbGlicy9zdXJmYWNlZmxpbmdlci9MYXllckJ1ZmZlci5jcHAKaW5kZXggZDg3MWZjMy4uMzg2MWU2OCAxMDA2NDQKLS0tIGEvbGlicy9zdXJmYWNlZmxpbmdlci9MYXllckJ1ZmZlci5jcHAKKysrIGIvbGlicy9zdXJmYWNlZmxpbmdlci9MYXllckJ1ZmZlci5jcHAKQEAgLTEwNCw3ICsxMDQsNyBAQAogICAgICAgICAgKiB0aGUgcmVxdWVzdGVkIHNjYWxlIGZhY3RvciwgaW4gd2hpY2ggY2FzZSB3ZSBwZXJmb3JtIHRoZSBzY2FsaW5nCiAgICAgICAgICAqIGluIHNldmVyYWwgcGFzc2VzLiAqLwogCi0gICAgICAgIGNvcHliaXRfdCogY29weWJpdCA9IG1GbGluZ2VyLT5nZXRCbGl0RW5naW5lKCk7CisgICAgICAgIGNvcHliaXRfZGV2aWNlX3QqIGNvcHliaXQgPSBtRmxpbmdlci0+Z2V0QmxpdEVuZ2luZSgpOwogICAgICAgICBjb25zdCBmbG9hdCBtaW4gPSBjb3B5Yml0LT5nZXQoY29weWJpdCwgQ09QWUJJVF9NSU5JRklDQVRJT05fTElNSVQpOwogICAgICAgICBjb25zdCBmbG9hdCBtYWcgPSBjb3B5Yml0LT5nZXQoY29weWJpdCwgQ09QWUJJVF9NQUdOSUZJQ0FUSU9OX0xJTUlUKTsKIApAQCAtMTIzLDcgKzEyMyw3IEBACiAgICAgICAgICAgICBpZiAoVU5MSUtFTFkobVRlbXBvcmFyeURlYWxlciA9PSAwKSkgewogICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlIGEgbWVtb3J5LWRlYWxlciBmb3IgdGhpcyB0aGUgZmlyc3QgdGltZQogICAgICAgICAgICAgICAgIG1UZW1wb3JhcnlEZWFsZXIgPSBtRmxpbmdlci0+Z2V0U3VyZmFjZUhlYXBNYW5hZ2VyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC0+Y3JlYXRlSGVhcChOQVRJVkVfTUVNT1JZX1RZUEVfUE1FTSk7CisgICAgICAgICAgICAgICAgICAgICAgICAtPmNyZWF0ZUhlYXAoSVN1cmZhY2VDb21wb3Nlcjo6ZUhhcmR3YXJlKTsKICAgICAgICAgICAgICAgICBtVGVtcEJpdG1hcC5pbml0KG1UZW1wb3JhcnlEZWFsZXIpOwogICAgICAgICAgICAgfQogCkBAIC0yMzAsNyArMjMwLDE4IEBACiBzdGF0dXNfdCBMYXllckJ1ZmZlcjo6cmVnaXN0ZXJCdWZmZXJzKGludCB3LCBpbnQgaCwgaW50IGhzdHJpZGUsIGludCB2c3RyaWRlLAogICAgICAgICAgICAgUGl4ZWxGb3JtYXQgZm9ybWF0LCBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIG1lbW9yeUhlYXApCiB7Ci0gICAgc3RhdHVzX3QgZXJyID0gKG1lbW9yeUhlYXAhPTAgJiYgbWVtb3J5SGVhcC0+aGVhcElEKCkgPj0gMCkgPyBOT19FUlJPUiA6IE5PX0lOSVQ7CisgICAgaWYgKG1lbW9yeUhlYXAgPT0gTlVMTCkgeworICAgICAgICAvLyB0aGlzIGlzIGFsbG93ZWQsIGJ1dCBpbiB0aGlzIGNhc2UsIGl0IGlzIGlsbGVnYWwgdG8gcmVjZWl2ZQorICAgICAgICAvLyBwb3N0QnVmZmVyKCkuIFRoZSBzdXJmYWNlIGp1c3QgZXJhc2VzIHRoZSBmcmFtZWJ1ZmZlciB3aXRoCisgICAgICAgIC8vIGZ1bGx5IHRyYW5zcGFyZW50IHBpeGVscy4KKyAgICAgICAgbUhlYXAuY2xlYXIoKTsKKyAgICAgICAgbVdpZHRoID0gdzsKKyAgICAgICAgbUhlaWdodCA9IGg7CisgICAgICAgIG1OZWVkc0JsZW5kaW5nID0gZmFsc2U7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgCisgICAgc3RhdHVzX3QgZXJyID0gKG1lbW9yeUhlYXAtPmhlYXBJRCgpID49IDApID8gTk9fRVJST1IgOiBOT19JTklUOwogICAgIGlmIChlcnIgIT0gTk9fRVJST1IpCiAgICAgICAgIHJldHVybiBlcnI7CiAKQEAgLTI4MSw2ICsyOTIsMzIgQEAKICAgICBpbnZhbGlkYXRlTG9ja2VkKCk7CiB9CiAKK3NwPE92ZXJsYXk+IExheWVyQnVmZmVyOjpjcmVhdGVPdmVybGF5KHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIGludDMyX3QgZm9ybWF0KQoreworICAgIHNwPE92ZXJsYXk+IHJlc3VsdDsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtSGVhcCAhPSAwIHx8IG1CdWZmZXIgIT0gMCkgeworICAgICAgICAvLyB3ZSdyZSBhIHB1c2ggc3VyZmFjZS4gZXJyb3IuCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIG92ZXJsYXlfZGV2aWNlX3QqIG92ZXJsYXlfZGV2ID0gbUZsaW5nZXItPmdldE92ZXJsYXlFbmdpbmUoKTsKKyAgICBpZiAob3ZlcmxheV9kZXYgPT0gTlVMTCkgeworICAgICAgICAvLyBvdmVybGF5cyBub3Qgc3VwcG9ydGVkCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgb3ZlcmxheV90KiBvdmVybGF5ID0gb3ZlcmxheV9kZXYtPmNyZWF0ZU92ZXJsYXkob3ZlcmxheV9kZXYsIHcsIGgsIGZvcm1hdCk7CisgICAgaWYgKG92ZXJsYXkgPT0gTlVMTCkgeworICAgICAgICAvLyBjb3VsZG4ndCBjcmVhdGUgdGhlIG92ZXJsYXkgKG5vIG1lbW9yeT8gbm8gbW9yZSBvdmVybGF5cz8pCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIC8qIFRPRE86IGltcGxlbWVudCB0aGUgcmVhbCBzdHVmZiBoZXJlICovCisgICAgCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwogc3A8TGF5ZXJCdWZmZXI6OkJ1ZmZlcj4gTGF5ZXJCdWZmZXI6OmdldEJ1ZmZlcigpIGNvbnN0CiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTMzMCw2ICszNjcsMTUgQEAKICAgICAgICAgb3duZXItPnVucmVnaXN0ZXJCdWZmZXJzKCk7CiB9CiAKK3NwPE92ZXJsYXk+IExheWVyQnVmZmVyOjpTdXJmYWNlQnVmZmVyOjpjcmVhdGVPdmVybGF5KAorICAgICAgICB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCBpbnQzMl90IGZvcm1hdCkgeworICAgIHNwPE92ZXJsYXk+IHJlc3VsdDsKKyAgICBMYXllckJ1ZmZlciogb3duZXIoZ2V0T3duZXIoKSk7CisgICAgaWYgKG93bmVyKQorICAgICAgICByZXN1bHQgPSBvd25lci0+Y3JlYXRlT3ZlcmxheSh3LCBoLCBmb3JtYXQpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKIHZvaWQgTGF5ZXJCdWZmZXI6OlN1cmZhY2VCdWZmZXI6OmRpc293bigpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKZGlmZiAtLWdpdCBhL2xpYnMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCdWZmZXIuaCBiL2xpYnMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCdWZmZXIuaAppbmRleCBlZjQ3M2RkLi4zZTYxNmYyIDEwMDY0NAotLS0gYS9saWJzL3N1cmZhY2VmbGluZ2VyL0xheWVyQnVmZmVyLmgKKysrIGIvbGlicy9zdXJmYWNlZmxpbmdlci9MYXllckJ1ZmZlci5oCkBAIC0zMyw2ICszMyw3IEBACiAKIGNsYXNzIE1lbW9yeURlYWxlcjsKIGNsYXNzIFJlZ2lvbjsKK2NsYXNzIE92ZXJsYXk7CiAKIGNsYXNzIExheWVyQnVmZmVyIDogcHVibGljIExheWVyQmFzZUNsaWVudAogewpAQCAtNTYsNiArNTcsNyBAQAogICAgICAgICAgICAgUGl4ZWxGb3JtYXQgZm9ybWF0LCBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXApOwogICAgIHZvaWQgcG9zdEJ1ZmZlcihzc2l6ZV90IG9mZnNldCk7CiAgICAgdm9pZCB1bnJlZ2lzdGVyQnVmZmVycygpOworICAgIHNwPE92ZXJsYXk+IGNyZWF0ZU92ZXJsYXkodWludDMyX3QgdywgdWludDMyX3QgaCwgaW50MzJfdCBmb3JtYXQpOwogICAgIHZvaWQgaW52YWxpZGF0ZSgpOwogICAgIHZvaWQgaW52YWxpZGF0ZUxvY2tlZCgpOwogCkBAIC0xMDcsNyArMTA5LDkgQEAKICAgICAgICAgICAgICAgICBQaXhlbEZvcm1hdCBmb3JtYXQsIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBwb3N0QnVmZmVyKHNzaXplX3Qgb2Zmc2V0KTsKICAgICAgICAgdmlydHVhbCB2b2lkIHVucmVnaXN0ZXJCdWZmZXJzKCk7Ci0gICAgICAgIHZvaWQgZGlzb3duKCk7CisgICAgICAgIHZpcnR1YWwgc3A8T3ZlcmxheT4gY3JlYXRlT3ZlcmxheSgKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCBpbnQzMl90IGZvcm1hdCk7CisgICAgICAgdm9pZCBkaXNvd24oKTsKICAgICBwcml2YXRlOgogICAgICAgICBMYXllckJ1ZmZlciogZ2V0T3duZXIoKSBjb25zdCB7CiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpkaWZmIC0tZ2l0IGEvbGlicy9zdXJmYWNlZmxpbmdlci9MYXllckRpbS5jcHAgYi9saWJzL3N1cmZhY2VmbGluZ2VyL0xheWVyRGltLmNwcAppbmRleCBmYzIzZDUzLi4wYzM0N2NjIDEwMDY0NAotLS0gYS9saWJzL3N1cmZhY2VmbGluZ2VyL0xheWVyRGltLmNwcAorKysgYi9saWJzL3N1cmZhY2VmbGluZ2VyL0xheWVyRGltLmNwcApAQCAtNDgsNyArNDgsNyBAQAogewogICAgIC8vIG11c3Qgb25seSBiZSBjYWxsZWQgb25jZS4KICAgICBtRGltbWVyRGVhbGVyID0gZmxpbmdlci0+Z2V0U3VyZmFjZUhlYXBNYW5hZ2VyKCkKLSAgICAgICAgICAgIC0+Y3JlYXRlSGVhcChOQVRJVkVfTUVNT1JZX1RZUEVfUE1FTSk7CisgICAgICAgICAgICAtPmNyZWF0ZUhlYXAoSVN1cmZhY2VDb21wb3Nlcjo6ZUhhcmR3YXJlKTsKICAgICBpZiAobURpbW1lckRlYWxlciAhPSAwKSB7CiAgICAgICAgIG1EaW1tZXJCaXRtYXAuaW5pdChtRGltbWVyRGVhbGVyKTsKICAgICAgICAgbURpbW1lckJpdG1hcC5zZXRCaXRzKHcsIGgsIDEsIFBJWEVMX0ZPUk1BVF9SR0JfNTY1KTsKQEAgLTgxLDcgKzgxLDcgQEAKICAgICAgICAgICAgIG1EaW1tZXJCaXRtYXAuZ2V0Qml0bWFwU3VyZmFjZSgmc3JjKTsKICAgICAgICAgICAgIGNvbnN0IGNvcHliaXRfcmVjdF90JiBzcmVjdChkcmVjdCk7CiAKLSAgICAgICAgICAgIGNvcHliaXRfdCogY29weWJpdCA9IG1GbGluZ2VyLT5nZXRCbGl0RW5naW5lKCk7CisgICAgICAgICAgICBjb3B5Yml0X2RldmljZV90KiBjb3B5Yml0ID0gbUZsaW5nZXItPmdldEJsaXRFbmdpbmUoKTsKICAgICAgICAgICAgIGNvcHliaXQtPnNldF9wYXJhbWV0ZXIoY29weWJpdCwgQ09QWUJJVF9UUkFOU0ZPUk0sIDApOwogICAgICAgICAgICAgY29weWJpdC0+c2V0X3BhcmFtZXRlcihjb3B5Yml0LCBDT1BZQklUX1BMQU5FX0FMUEhBLCBzLmFscGhhKTsKICAgICAgICAgICAgIGNvcHliaXQtPnNldF9wYXJhbWV0ZXIoY29weWJpdCwgQ09QWUJJVF9ESVRIRVIsIENPUFlCSVRfRU5BQkxFKTsKZGlmZiAtLWdpdCBhL2xpYnMvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZUZsaW5nZXIuY3BwIGIvbGlicy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlRmxpbmdlci5jcHAKaW5kZXggNDU0OTZiMi4uZThkZTIxYSAxMDA2NDQKLS0tIGEvbGlicy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlRmxpbmdlci5jcHAKKysrIGIvbGlicy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlRmxpbmdlci5jcHAKQEAgLTM4LDcgKzM4LDYgQEAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogI2luY2x1ZGUgPHV0aWxzL1N0b3BXYXRjaC5oPgogCi0jaW5jbHVkZSA8dWkvQmxpdEhhcmR3YXJlLmg+CiAjaW5jbHVkZSA8dWkvUGl4ZWxGb3JtYXQuaD4KICNpbmNsdWRlIDx1aS9EaXNwbGF5SW5mby5oPgogI2luY2x1ZGUgPHVpL0VHTERpc3BsYXlTdXJmYWNlLmg+CkBAIC0yMDIsMjMgKzIwMSw2IEBACiB7CiAgICAgTE9HSSgiU3VyZmFjZUZsaW5nZXIgaXMgc3RhcnRpbmciKTsKIAotICAgIC8vIGNyZWF0ZSB0aGUgc2hhcmVkIGNvbnRyb2wtYmxvY2sKLSAgICBtU2VydmVySGVhcCA9IG5ldyBNZW1vcnlEZWFsZXIoNDA5NiwgTWVtb3J5RGVhbGVyOjpSRUFEX09OTFkpOwotICAgIExPR0VfSUYobVNlcnZlckhlYXA9PTAsICJjYW4ndCBjcmVhdGUgc2hhcmVkIG1lbW9yeSBkZWFsZXIiKTsKLQotICAgIG1TZXJ2ZXJDYmxrTWVtb3J5ID0gbVNlcnZlckhlYXAtPmFsbG9jYXRlKDQwOTYpOwotICAgIExPR0VfSUYobVNlcnZlckNibGtNZW1vcnk9PTAsICJjYW4ndCBjcmVhdGUgc2hhcmVkIGNvbnRyb2wgYmxvY2siKTsKLQotICAgIG1TZXJ2ZXJDYmxrID0gc3RhdGljX2Nhc3Q8c3VyZmFjZV9mbGluZ2VyX2NibGtfdCAqPihtU2VydmVyQ2Jsa01lbW9yeS0+cG9pbnRlcigpKTsKLSAgICBMT0dFX0lGKG1TZXJ2ZXJDYmxrPT0wLCAiY2FuJ3QgZ2V0IHRvIHNoYXJlZCBjb250cm9sIGJsb2NrJ3MgYWRkcmVzcyIpOwotICAgIG5ldyhtU2VydmVyQ2Jsaykgc3VyZmFjZV9mbGluZ2VyX2NibGtfdDsKLQotICAgIC8vIGNyZWF0ZSB0aGUgc3VyZmFjZSBIZWFwIG1hbmFnZXIsIHdoaWNoIG1hbmFnZXMgdGhlIGhlYXBzCi0gICAgLy8gKGJlIGl0IGluIFJBTSBvciBWUkFNKSB3aGVyZSBzdXJmYWNlcyBhcmUgYWxsb2NhdGVkCi0gICAgLy8gV2UgZ2l2ZSA4IE1CIHBlciBjbGllbnQuCi0gICAgbVN1cmZhY2VIZWFwTWFuYWdlciA9IG5ldyBTdXJmYWNlSGVhcE1hbmFnZXIoOCA8PCAyMCk7Ci0gICAgbUdQVSA9IG5ldyBHUFVIYXJkd2FyZSgpOwotCiAgICAgLy8gZGVidWdnaW5nIHN0dWZmLi4uCiAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwogICAgIHByb3BlcnR5X2dldCgiZGVidWcuc2Yuc2hvd3VwZGF0ZXMiLCB2YWx1ZSwgIjAiKTsKQEAgLTI0NCwxMSArMjI2LDE2IEBACiAgICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmbVdvcm1ob2xlVGV4TmFtZSk7CiB9CiAKLWNvcHliaXRfdCogU3VyZmFjZUZsaW5nZXI6OmdldEJsaXRFbmdpbmUoKSBjb25zdAorY29weWJpdF9kZXZpY2VfdCogU3VyZmFjZUZsaW5nZXI6OmdldEJsaXRFbmdpbmUoKSBjb25zdAogewogICAgIHJldHVybiBncmFwaGljUGxhbmUoMCkuZGlzcGxheUhhcmR3YXJlKCkuZ2V0QmxpdEVuZ2luZSgpOwogfQogCitvdmVybGF5X2RldmljZV90KiBTdXJmYWNlRmxpbmdlcjo6Z2V0T3ZlcmxheUVuZ2luZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGdyYXBoaWNQbGFuZSgwKS5kaXNwbGF5SGFyZHdhcmUoKS5nZXRPdmVybGF5RW5naW5lKCk7Cit9CisKIHNwPElNZW1vcnk+IFN1cmZhY2VGbGluZ2VyOjpnZXRDYmxrKCkgY29uc3QKIHsKICAgICByZXR1cm4gbVNlcnZlckNibGtNZW1vcnk7CkBAIC0yNTcsNyArMjQ0LDkgQEAKIHN0YXR1c190IFN1cmZhY2VGbGluZ2VyOjpyZXF1ZXN0R1BVKGNvbnN0IHNwPElHUFVDYWxsYmFjaz4mIGNhbGxiYWNrLAogICAgICAgICBncHVfaW5mb190KiBncHUpCiB7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUdQVS0+cmVxdWVzdChjYWxsYmFjaywgZ3B1KTsKKyAgICBJUENUaHJlYWRTdGF0ZSogaXBjID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKKyAgICBjb25zdCBpbnQgcGlkID0gaXBjLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgc3RhdHVzX3QgZXJyID0gbUdQVS0+cmVxdWVzdChwaWQsIGNhbGxiYWNrLCBncHUpOwogICAgIHJldHVybiBlcnI7CiB9CiAKQEAgLTM2MCw3ICszNDksMjYgQEAKICAgICBMT0dJKCAgICJTdXJmYWNlRmxpbmdlcidzIG1haW4gdGhyZWFkIHJlYWR5IHRvIHJ1bi4gIgogICAgICAgICAgICAgIkluaXRpYWxpemluZyBncmFwaGljcyBIL1cuLi4iKTsKIAotICAgIC8vCisgICAgLy8gY3JlYXRlIHRoZSBzaGFyZWQgY29udHJvbC1ibG9jaworICAgIG1TZXJ2ZXJIZWFwID0gbmV3IE1lbW9yeURlYWxlcig0MDk2LCBNZW1vcnlEZWFsZXI6OlJFQURfT05MWSk7CisgICAgTE9HRV9JRihtU2VydmVySGVhcD09MCwgImNhbid0IGNyZWF0ZSBzaGFyZWQgbWVtb3J5IGRlYWxlciIpOworCisgICAgbVNlcnZlckNibGtNZW1vcnkgPSBtU2VydmVySGVhcC0+YWxsb2NhdGUoNDA5Nik7CisgICAgTE9HRV9JRihtU2VydmVyQ2Jsa01lbW9yeT09MCwgImNhbid0IGNyZWF0ZSBzaGFyZWQgY29udHJvbCBibG9jayIpOworCisgICAgbVNlcnZlckNibGsgPSBzdGF0aWNfY2FzdDxzdXJmYWNlX2ZsaW5nZXJfY2Jsa190ICo+KG1TZXJ2ZXJDYmxrTWVtb3J5LT5wb2ludGVyKCkpOworICAgIExPR0VfSUYobVNlcnZlckNibGs9PTAsICJjYW4ndCBnZXQgdG8gc2hhcmVkIGNvbnRyb2wgYmxvY2sncyBhZGRyZXNzIik7CisgICAgbmV3KG1TZXJ2ZXJDYmxrKSBzdXJmYWNlX2ZsaW5nZXJfY2Jsa190OworCisgICAgLy8gZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBHUFUgaWYgd2UgaGF2ZSBvbmUKKyAgICBtR1BVID0gR1BVRmFjdG9yeTo6Z2V0R1BVKCk7CisKKyAgICAvLyBjcmVhdGUgdGhlIHN1cmZhY2UgSGVhcCBtYW5hZ2VyLCB3aGljaCBtYW5hZ2VzIHRoZSBoZWFwcworICAgIC8vIChiZSBpdCBpbiBSQU0gb3IgVlJBTSkgd2hlcmUgc3VyZmFjZXMgYXJlIGFsbG9jYXRlZAorICAgIC8vIFdlIGdpdmUgOCBNQiBwZXIgY2xpZW50LgorICAgIG1TdXJmYWNlSGVhcE1hbmFnZXIgPSBuZXcgU3VyZmFjZUhlYXBNYW5hZ2VyKHRoaXMsIDggPDwgMjApOworCisgICAgCiAgICAgR0xFU19sb2NhbFN1cmZhY2VNYW5hZ2VyID0gc3RhdGljX2Nhc3Q8SVN1cmZhY2VDb21wb3Nlcio+KHRoaXMpOwogCiAgICAgLy8gd2Ugb25seSBzdXBwb3J0IG9uZSBkaXNwbGF5IGN1cnJlbnRseQpAQCAtMzk1LDcgKzQwMyw3IEBACiAgICAgZGNibGstPnhkcGkgICAgICAgICA9IGh3LmdldERwaVgoKTsKICAgICBkY2Jsay0+eWRwaSAgICAgICAgID0gaHcuZ2V0RHBpWSgpOwogICAgIGRjYmxrLT5mcHMgICAgICAgICAgPSBody5nZXRSZWZyZXNoUmF0ZSgpOwotICAgIGRjYmxrLT5kZW5zaXR5ICAgICAgPSAxLjBmOyAvLyBYWFg6IGRvIHNvbWV0aW5nIG1vcmUgcmVhbCBoZXJlLi4uCisgICAgZGNibGstPmRlbnNpdHkgICAgICA9IGh3LmdldERlbnNpdHkoKTsKICAgICBhc20gdm9sYXRpbGUgKCIiOjo6Im1lbW9yeSIpOwogCiAgICAgLy8gSW5pdGlhbGl6ZSBPcGVuR0x8RVMKQEAgLTQwNyw2ICs0MTUsNyBAQAogICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX05FQVJFU1QpOwogICAgIGdsVGV4RW52eChHTF9URVhUVVJFX0VOViwgR0xfVEVYVFVSRV9FTlZfTU9ERSwgR0xfUkVQTEFDRSk7CiAgICAgZ2xQaXhlbFN0b3JlaShHTF9VTlBBQ0tfQUxJR05NRU5ULCA0KTsKKyAgICBnbFBpeGVsU3RvcmVpKEdMX1BBQ0tfQUxJR05NRU5ULCA0KTsgCiAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9WRVJURVhfQVJSQVkpOwogICAgIGdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7CiAgICAgZ2xTaGFkZU1vZGVsKEdMX0ZMQVQpOwpAQCAtMTY3OSw3ICsxNjg4LDcgQEAKIENsaWVudDo6Q2xpZW50KENsaWVudElEIGNsaWVudElELCBjb25zdCBzcDxTdXJmYWNlRmxpbmdlcj4mIGZsaW5nZXIpCiAgICAgOiBjdHJsYmxrKDApLCBjaWQoY2xpZW50SUQpLCBtUGlkKDApLCBtQml0bWFwKDApLCBtRmxpbmdlcihmbGluZ2VyKQogewotICAgIG1TaGFyZWRIZWFwQWxsb2NhdG9yID0gZ2V0U3VyZmFjZUhlYXBNYW5hZ2VyKCktPmNyZWF0ZUhlYXAoTkFUSVZFX01FTU9SWV9UWVBFX0hFQVApOworICAgIG1TaGFyZWRIZWFwQWxsb2NhdG9yID0gZ2V0U3VyZmFjZUhlYXBNYW5hZ2VyKCktPmNyZWF0ZUhlYXAoKTsKICAgICBjb25zdCBpbnQgcGdzaXplID0gZ2V0cGFnZXNpemUoKTsKICAgICBjb25zdCBpbnQgY2Jsa3NpemU9KChzaXplb2YocGVyX2NsaWVudF9jYmxrX3QpKyhwZ3NpemUtMSkpJn4ocGdzaXplLTEpKTsKICAgICBtQ2Jsa0hlYXAgPSBuZXcgTWVtb3J5RGVhbGVyKGNibGtzaXplKTsKQEAgLTE3MDMsMTAgKzE3MTIsNiBAQAogICAgIHJldHVybiBtRmxpbmdlci0+Z2V0U3VyZmFjZUhlYXBNYW5hZ2VyKCk7CiB9CiAKLWNvbnN0IHNwPEdQVUhhcmR3YXJlSW50ZXJmYWNlPiYgQ2xpZW50OjpnZXRHUFUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1GbGluZ2VyLT5nZXRHUFUoKTsKLX0KLQogaW50MzJfdCBDbGllbnQ6OmdlbmVyYXRlSWQoaW50IHBpZCkKIHsKICAgICBjb25zdCB1aW50MzJfdCBpID0gY2x6KCB+bUJpdG1hcCApOwpAQCAtMTczNCwyNSArMTczOSwxMSBAQAogICAgIH0KIH0KIAotc3A8TWVtb3J5RGVhbGVyPiBDbGllbnQ6OmNyZWF0ZUFsbG9jYXRvcihpbnQgbWVtb3J5X3R5cGUpCitzcDxNZW1vcnlEZWFsZXI+IENsaWVudDo6Y3JlYXRlQWxsb2NhdG9yKHVpbnQzMl90IGZsYWdzKQogewogICAgIHNwPE1lbW9yeURlYWxlcj4gYWxsb2NhdG9yOwotICAgIGlmIChtZW1vcnlfdHlwZSA9PSBOQVRJVkVfTUVNT1JZX1RZUEVfR1BVKSB7Ci0gICAgICAgIGFsbG9jYXRvciA9IGdldEdQVSgpLT5yZXF1ZXN0KGdldENsaWVudFBpZCgpKTsKLSAgICAgICAgaWYgKGFsbG9jYXRvciA9PSAwKQotICAgICAgICAgICAgbWVtb3J5X3R5cGUgPSBOQVRJVkVfTUVNT1JZX1RZUEVfUE1FTTsKLSAgICB9Ci0gICAgaWYgKG1lbW9yeV90eXBlID09IE5BVElWRV9NRU1PUllfVFlQRV9QTUVNKSB7Ci0gICAgICAgIGFsbG9jYXRvciA9IG1QTWVtQWxsb2NhdG9yOwotICAgICAgICBpZiAoYWxsb2NhdG9yID09IDApIHsKLSAgICAgICAgICAgIGFsbG9jYXRvciA9IGdldFN1cmZhY2VIZWFwTWFuYWdlcigpLT5jcmVhdGVIZWFwKAotICAgICAgICAgICAgICAgICAgICBOQVRJVkVfTUVNT1JZX1RZUEVfUE1FTSk7Ci0gICAgICAgICAgICBtUE1lbUFsbG9jYXRvciA9IGFsbG9jYXRvcjsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoYWxsb2NhdG9yID09IDApCi0gICAgICAgIGFsbG9jYXRvciA9IG1TaGFyZWRIZWFwQWxsb2NhdG9yOwotCisgICAgYWxsb2NhdG9yID0gZ2V0U3VyZmFjZUhlYXBNYW5hZ2VyKCktPmNyZWF0ZUhlYXAoCisgICAgICAgICAgICBmbGFncywgZ2V0Q2xpZW50UGlkKCksIG1TaGFyZWRIZWFwQWxsb2NhdG9yKTsKICAgICByZXR1cm4gYWxsb2NhdG9yOwogfQogCmRpZmYgLS1naXQgYS9saWJzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VGbGluZ2VyLmggYi9saWJzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VGbGluZ2VyLmgKaW5kZXggMTU4MTQ3NC4uOTIwMjFkMCAxMDA2NDQKLS0tIGEvbGlicy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlRmxpbmdlci5oCisrKyBiL2xpYnMvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZUZsaW5nZXIuaApAQCAtNDEsNyArNDEsOCBAQAogI2luY2x1ZGUgIkJvb3RBbmltYXRpb24uaCIKICNpbmNsdWRlICJCYXJyaWVyLmgiCiAKLXN0cnVjdCBjb3B5Yml0X3Q7CitzdHJ1Y3QgY29weWJpdF9kZXZpY2VfdDsKK3N0cnVjdCBvdmVybGF5X2RldmljZV90OwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTc0LDcgKzc1LDcgQEAKICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgIGdlbmVyYXRlSWQoaW50IHBpZCk7CiAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBmcmVlKGludDMyX3QgaWQpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgYmluZExheWVyKExheWVyQmFzZUNsaWVudCogbGF5ZXIsIGludDMyX3QgaWQpOwotICAgICAgICAgICAgc3A8TWVtb3J5RGVhbGVyPiAgICAgICAgY3JlYXRlQWxsb2NhdG9yKGludCBtZW1vcnlfdHlwZSk7CisgICAgICAgICAgICBzcDxNZW1vcnlEZWFsZXI+ICAgICAgICBjcmVhdGVBbGxvY2F0b3IodWludDMyX3QgbWVtb3J5X3R5cGUpOwogCiAgICAgaW5saW5lICBib29sICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkKGludDMyX3QgaSkgY29uc3Q7CiAgICAgaW5saW5lICBjb25zdCB1aW50OF90KiAgICAgICAgICBpblVzZUFycmF5KCkgY29uc3Q7CkBAIC05Miw3ICs5Myw2IEBACiAgICAgCiBwcml2YXRlOgogICAgIGludCAgICAgICAgICAgICAgICAgICAgIGdldENsaWVudFBpZCgpIGNvbnN0IHsgcmV0dXJuIG1QaWQ7IH0KLSAgICBjb25zdCBzcDxHUFVIYXJkd2FyZUludGVyZmFjZT4mICBnZXRHUFUoKSBjb25zdDsKICAgICAgICAgCiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1QaWQ7CiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgIG1CaXRtYXA7CkBAIC0xNzksNyArMTc5LDggQEAKICAgICAgICAgICAgICAgICByZXR1cm4gbUdQVTsgCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGNvcHliaXRfdCogZ2V0QmxpdEVuZ2luZSgpIGNvbnN0OworICAgICAgICAgICAgY29weWJpdF9kZXZpY2VfdCogZ2V0QmxpdEVuZ2luZSgpIGNvbnN0OworICAgICAgICAgICAgb3ZlcmxheV9kZXZpY2VfdCogZ2V0T3ZlcmxheUVuZ2luZSgpIGNvbnN0OwogICAgICAgICAgICAgCiBwcml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyBCQ2xpZW50OwpkaWZmIC0tZ2l0IGEvbGlicy9zdXJmYWNlZmxpbmdlci9WUmFtSGVhcC5jcHAgYi9saWJzL3N1cmZhY2VmbGluZ2VyL1ZSYW1IZWFwLmNwcAppbmRleCAzODUyZDUxLi43N2JjNTc2IDEwMDY0NAotLS0gYS9saWJzL3N1cmZhY2VmbGluZ2VyL1ZSYW1IZWFwLmNwcAorKysgYi9saWJzL3N1cmZhY2VmbGluZ2VyL1ZSYW1IZWFwLmNwcApAQCAtMzcsNiArMzcsOCBAQAogCiAjaW5jbHVkZSA8R0xFUy9lZ2xuYXRpdmVzLmg+CiAKKyNpbmNsdWRlICJHUFVIYXJkd2FyZS9HUFVIYXJkd2FyZS5oIgorI2luY2x1ZGUgIlN1cmZhY2VGbGluZ2VyLmgiCiAjaW5jbHVkZSAiVlJhbUhlYXAuaCIKIAogI2lmIEhBVkVfQU5EUk9JRF9PUwpAQCAtNTksOCArNjEsOSBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotU3VyZmFjZUhlYXBNYW5hZ2VyOjpTdXJmYWNlSGVhcE1hbmFnZXIoc2l6ZV90IGNsaWVudEhlYXBTaXplKQotICAgIDogbUNsaWVudEhlYXBTaXplKGNsaWVudEhlYXBTaXplKQorU3VyZmFjZUhlYXBNYW5hZ2VyOjpTdXJmYWNlSGVhcE1hbmFnZXIoY29uc3Qgc3A8U3VyZmFjZUZsaW5nZXI+JiBmbGluZ2VyLCAKKyAgICAgICAgc2l6ZV90IGNsaWVudEhlYXBTaXplKQorICAgIDogbUZsaW5nZXIoZmxpbmdlciksIG1DbGllbnRIZWFwU2l6ZShjbGllbnRIZWFwU2l6ZSkKIHsKICAgICBTdXJmYWNlSGVhcE1hbmFnZXI6Omdsb2JhbF9wbWVtX2hlYXAgPSAxOwogfQpAQCAtODEsMjUgKzg0LDUzIEBACiAgICAgfQogfQogCi1zcDxNZW1vcnlEZWFsZXI+IFN1cmZhY2VIZWFwTWFuYWdlcjo6Y3JlYXRlSGVhcChpbnQgdHlwZSkKK3NwPE1lbW9yeURlYWxlcj4gU3VyZmFjZUhlYXBNYW5hZ2VyOjpjcmVhdGVIZWFwKAorICAgICAgICB1aW50MzJfdCBmbGFncywKKyAgICAgICAgcGlkX3QgY2xpZW50X3BpZCwKKyAgICAgICAgY29uc3Qgc3A8TWVtb3J5RGVhbGVyPiYgZGVmYXVsdEFsbG9jYXRvcikKIHsKLSAgICBpZiAoIWdsb2JhbF9wbWVtX2hlYXAgJiYgdHlwZT09TkFUSVZFX01FTU9SWV9UWVBFX1BNRU0pCi0gICAgICAgIHR5cGUgPSBOQVRJVkVfTUVNT1JZX1RZUEVfSEVBUDsKLQotICAgIGNvbnN0IHNwPFBNZW1IZWFwPiYgaGVhcChtUE1lbUhlYXApOwogICAgIHNwPE1lbW9yeURlYWxlcj4gZGVhbGVyOyAKLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIE5BVElWRV9NRU1PUllfVFlQRV9IRUFQOgotICAgICAgICBkZWFsZXIgPSBuZXcgTWVtb3J5RGVhbGVyKG1DbGllbnRIZWFwU2l6ZSwgMCwgIlNGTmF0aXZlSGVhcCIpOwotICAgICAgICBicmVhazsKIAotICAgIGNhc2UgTkFUSVZFX01FTU9SWV9UWVBFX1BNRU06Ci0gICAgICAgIGlmIChoZWFwICE9IDApIHsKLSAgICAgICAgICAgIGRlYWxlciA9IG5ldyBNZW1vcnlEZWFsZXIoIAotICAgICAgICAgICAgICAgICAgICBoZWFwLT5jcmVhdGVDbGllbnRIZWFwKCksCi0gICAgICAgICAgICAgICAgICAgIGhlYXAtPmdldEFsbG9jYXRvcigpKTsKKyAgICBpZiAoZmxhZ3MgJiBJU3VyZmFjZUNvbXBvc2VyOjplR1BVKSB7CisgICAgICAgIC8vIGRvbid0IGdyYW50IEdQVSBtZW1vcnkgaWYgR1BVIGlzIGRpc2FibGVkCisgICAgICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICAgICAgcHJvcGVydHlfZ2V0KCJkZWJ1Zy5lZ2wuaHciLCB2YWx1ZSwgIjEiKTsKKyAgICAgICAgaWYgKGF0b2kodmFsdWUpID09IDApIHsKKyAgICAgICAgICAgIGZsYWdzICY9IH5JU3VyZmFjZUNvbXBvc2VyOjplR1BVOwogICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChmbGFncyAmIElTdXJmYWNlQ29tcG9zZXI6OmVHUFUpIHsKKyAgICAgICAgLy8gRklYTUU6IHRoaXMgaXMgbXNtNzIwMUEgc3BlY2lmaWMsIHdoZXJlIGdwdSBzdXJmYWNlcyBtYXkgbm90IGJlIHNlY3VyZQorICAgICAgICBpZiAoIShmbGFncyAmIElTdXJmYWNlQ29tcG9zZXI6OmVTZWN1cmUpKSB7CisgICAgICAgICAgICAvLyBpZiBHUFUgZG9lc24ndCB3b3JrLCB3ZSB0cnkgZUhhcmR3YXJlCisgICAgICAgICAgICBmbGFncyB8PSBJU3VyZmFjZUNvbXBvc2VyOjplSGFyZHdhcmU7CisgICAgICAgICAgICAvLyBhc2tlZCBmb3IgR1BVIG1lbW9yeSwgdHJ5IHRoYXQgZmlyc3QKKyAgICAgICAgICAgIGRlYWxlciA9IG1GbGluZ2VyLT5nZXRHUFUoKS0+cmVxdWVzdChjbGllbnRfcGlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChkZWFsZXIgPT0gTlVMTCkgeworICAgICAgICBpZiAoZGVmYXVsdEFsbG9jYXRvciAhPSBOVUxMKQorICAgICAgICAgICAgLy8gaWYgYSBkZWZhdWx0IGFsbG9jYXRvciBpcyBnaXZlbiwgdXNlIHRoYXQKKyAgICAgICAgICAgIGRlYWxlciA9IGRlZmF1bHRBbGxvY2F0b3I7CisgICAgfQorICAgIAorICAgIGlmIChkZWFsZXIgPT0gTlVMTCkgeworICAgICAgICAvLyBhbHdheXMgdHJ5IGgvdyBhY2NlbGVyYXRlZCBtZW1vcnkgZmlyc3QKKyAgICAgICAgaWYgKGdsb2JhbF9wbWVtX2hlYXApIHsKKyAgICAgICAgICAgIGNvbnN0IHNwPFBNZW1IZWFwPiYgaGVhcChtUE1lbUhlYXApOworICAgICAgICAgICAgaWYgKGRlYWxlciA9PSBOVUxMICYmIGhlYXAgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGRlYWxlciA9IG5ldyBNZW1vcnlEZWFsZXIoIAorICAgICAgICAgICAgICAgICAgICAgICAgaGVhcC0+Y3JlYXRlQ2xpZW50SGVhcCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVhcC0+Z2V0QWxsb2NhdG9yKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGRlYWxlciA9PSBOVUxMKSB7CisgICAgICAgIC8vIHJldHVybiB0aGUgYXNobWVtIGFsbG9jYXRvciAoc29mdHdhcmUgcmVuZGVyaW5nKQorICAgICAgICBkZWFsZXIgPSBuZXcgTWVtb3J5RGVhbGVyKG1DbGllbnRIZWFwU2l6ZSwgMCwgIlNGTmF0aXZlSGVhcCIpOwogICAgIH0KICAgICByZXR1cm4gZGVhbGVyOwogfQpAQCAtMTIyLDIyICsxNTMsOCBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotUE1lbUhlYXBJbnRlcmZhY2U6OlBNZW1IZWFwSW50ZXJmYWNlKGludCBmZCwgc2l6ZV90IHNpemUpCi0gICAgOiBNZW1vcnlIZWFwQmFzZShmZCwgc2l6ZSkgewotfQotUE1lbUhlYXBJbnRlcmZhY2U6OlBNZW1IZWFwSW50ZXJmYWNlKGNvbnN0IGNoYXIqIGRldmljZSwgc2l6ZV90IHNpemUpCi0gICAgOiBNZW1vcnlIZWFwQmFzZShkZXZpY2UsIHNpemUpIHsKLX0KLVBNZW1IZWFwSW50ZXJmYWNlOjpQTWVtSGVhcEludGVyZmFjZShzaXplX3Qgc2l6ZSwgdWludDMyX3QgZmxhZ3MsIGNoYXIgY29uc3QgKiBuYW1lKQotICAgIDogTWVtb3J5SGVhcEJhc2Uoc2l6ZSwgZmxhZ3MsIG5hbWUpIHsKLX0KLVBNZW1IZWFwSW50ZXJmYWNlOjp+UE1lbUhlYXBJbnRlcmZhY2UoKSB7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCiBQTWVtSGVhcDo6UE1lbUhlYXAoY29uc3QgY2hhciogY29uc3QgZGV2aWNlLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IHJlc2VydmVkKQotICAgIDogUE1lbUhlYXBJbnRlcmZhY2UoZGV2aWNlLCBzaXplKQorICAgIDogTWVtb3J5SGVhcEJhc2UoZGV2aWNlLCBzaXplKQogewogICAgIC8vTE9HRCgiJXMsICVwLCBtRkQ9JWQiLCBfX1BSRVRUWV9GVU5DVElPTl9fLCB0aGlzLCBoZWFwSUQoKSk7CiAgICAgaWYgKGJhc2UoKSAhPSBNQVBfRkFJTEVEKSB7CmRpZmYgLS1naXQgYS9saWJzL3N1cmZhY2VmbGluZ2VyL1ZSYW1IZWFwLmggYi9saWJzL3N1cmZhY2VmbGluZ2VyL1ZSYW1IZWFwLmgKaW5kZXggMDNlMDMzNi4uOTE0MDE2NyAxMDA2NDQKLS0tIGEvbGlicy9zdXJmYWNlZmxpbmdlci9WUmFtSGVhcC5oCisrKyBiL2xpYnMvc3VyZmFjZWZsaW5nZXIvVlJhbUhlYXAuaApAQCAtMjcsMTYgKzI3LDE5IEBACiAKIGNsYXNzIFBNZW1IZWFwOwogY2xhc3MgTWVtb3J5SGVhcFBtZW07CitjbGFzcyBTdXJmYWNlRmxpbmdlcjsgCiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBjbGFzcyBTdXJmYWNlSGVhcE1hbmFnZXIgIDogcHVibGljIFJlZkJhc2UKIHsKIHB1YmxpYzoKLSAgICBTdXJmYWNlSGVhcE1hbmFnZXIoc2l6ZV90IGNsaWVudEhlYXBTaXplKTsKKyAgICBTdXJmYWNlSGVhcE1hbmFnZXIoY29uc3Qgc3A8U3VyZmFjZUZsaW5nZXI+JiBmbGluZ2VyLCBzaXplX3QgY2xpZW50SGVhcFNpemUpOwogICAgIHZpcnR1YWwgflN1cmZhY2VIZWFwTWFuYWdlcigpOwogICAgIHZpcnR1YWwgdm9pZCBvbkZpcnN0UmVmKCk7Ci0gICAgc3A8TWVtb3J5RGVhbGVyPiBjcmVhdGVIZWFwKGludCB0eXBlKTsKKyAgICAvKiB1c2UgSVN1cmZhY2VDb21wb3NlciBmbGFncyBlR1BVfGVIQXJkd2FyZXxlU2VjdXJlICovCisgICAgc3A8TWVtb3J5RGVhbGVyPiBjcmVhdGVIZWFwKHVpbnQzMl90IGZsYWdzPTAsIHBpZF90IGNsaWVudF9waWQgPSAwLAorICAgICAgICAgICAgY29uc3Qgc3A8TWVtb3J5RGVhbGVyPiYgZGVmYXVsdEFsbG9jYXRvciA9IDApOwogICAgIAogICAgIC8vIHVzZWQgZm9yIGRlYnVnZ2luZyBvbmx5Li4uCiAgICAgc3A8U2ltcGxlQmVzdEZpdEFsbG9jYXRvcj4gZ2V0QWxsb2NhdG9yKGludCB0eXBlKSBjb25zdDsKQEAgLTQ0LDYgKzQ3LDcgQEAKIHByaXZhdGU6CiAgICAgc3A8UE1lbUhlYXA+IGdldEhlYXAoaW50IHR5cGUpIGNvbnN0OwogCisgICAgc3A8U3VyZmFjZUZsaW5nZXI+IG1GbGluZ2VyOwogICAgIG11dGFibGUgTXV0ZXggICBtTG9jazsKICAgICBzaXplX3QgICAgICAgICAgbUNsaWVudEhlYXBTaXplOwogICAgIHNwPFBNZW1IZWFwPiAgICBtUE1lbUhlYXA7CkBAIC01MiwxOSArNTYsNyBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotY2xhc3MgUE1lbUhlYXBJbnRlcmZhY2UgOiBwdWJsaWMgTWVtb3J5SGVhcEJhc2UKLXsKLXB1YmxpYzoKLSAgICBQTWVtSGVhcEludGVyZmFjZShpbnQgZmQsIHNpemVfdCBzaXplKTsKLSAgICBQTWVtSGVhcEludGVyZmFjZShjb25zdCBjaGFyKiBkZXZpY2UsIHNpemVfdCBzaXplID0gMCk7Ci0gICAgUE1lbUhlYXBJbnRlcmZhY2Uoc2l6ZV90IHNpemUsIHVpbnQzMl90IGZsYWdzID0gMCwgY2hhciBjb25zdCAqIG5hbWUgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIH5QTWVtSGVhcEludGVyZmFjZSgpOwotICAgIHZpcnR1YWwgc3A8TWVtb3J5SGVhcFBtZW0+IGNyZWF0ZUNsaWVudEhlYXAoKSA9IDA7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgUE1lbUhlYXAgOiBwdWJsaWMgUE1lbUhlYXBJbnRlcmZhY2UKK2NsYXNzIFBNZW1IZWFwIDogcHVibGljIE1lbW9yeUhlYXBCYXNlCiB7CiBwdWJsaWM6CiAgICAgICAgICAgICAgICAgUE1lbUhlYXAoY29uc3QgY2hhciogY29uc3QgdnJhbSwKZGlmZiAtLWdpdCBhL2xpYnMvdWkvQW5kcm9pZC5tayBiL2xpYnMvdWkvQW5kcm9pZC5tawppbmRleCA3MTU3OWM1Li43YjUxMzAwIDEwMDY0NAotLS0gYS9saWJzL3VpL0FuZHJvaWQubWsKKysrIGIvbGlicy91aS9BbmRyb2lkLm1rCkBAIC0yLDcgKzIsNiBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX1NSQ19GSUxFUzo9IFwKLQlCbGl0SGFyZHdhcmUuY3BwIFwKIAlDYW1lcmEuY3BwIFwKIAlDYW1lcmFQYXJhbWV0ZXJzLmNwcCBcCiAJRUdMRGlzcGxheVN1cmZhY2UuY3BwIFwKQEAgLTE0LDEwICsxMywxMiBAQAogCUlDYW1lcmEuY3BwIFwKIAlJQ2FtZXJhQ2xpZW50LmNwcCBcCiAJSUNhbWVyYVNlcnZpY2UuY3BwIFwKKwlJT3ZlcmxheS5jcHAgXAogCUlTdXJmYWNlQ29tcG9zZXIuY3BwIFwKIAlJU3VyZmFjZS5jcHAgXAogCUlTdXJmYWNlRmxpbmdlckNsaWVudC5jcHAgXAogCUxheWVyU3RhdGUuY3BwIFwKKwlPdmVybGF5LmNwcCBcCiAJUGl4ZWxGb3JtYXQuY3BwIFwKIAlQb2ludC5jcHAgXAogCVJlY3QuY3BwIFwKZGlmZiAtLWdpdCBhL2xpYnMvdWkvQmxpdEhhcmR3YXJlLmNwcCBiL2xpYnMvdWkvQmxpdEhhcmR3YXJlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA4MzhiNC4uMDAwMDAwMAotLS0gYS9saWJzL3VpL0JsaXRIYXJkd2FyZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiU3VyZmFjZUZsaW5nZXIiCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotCi0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLQotI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotCi0jaWYgSEFWRV9BTkRST0lEX09TCi0jaW5jbHVkZSA8bGludXgvZmIuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fbWRwLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHVpL0JsaXRIYXJkd2FyZS5oPgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1jbGFzcyBDb3B5Yml0TVNNN0sgOiBwdWJsaWMgY29weWJpdF90IHsKLXB1YmxpYzoKLSAgICBDb3B5Yml0TVNNN0soKTsKLSAgICB+Q29weWJpdE1TTTdLKCk7Ci0gICAgCi0gICAgc3RhdHVzX3QgZ2V0U3RhdHVzKCkgY29uc3QgewotICAgICAgICBpZiAobUZEPDApIHJldHVybiBtRkQ7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBzZXRQYXJhbWV0ZXIoaW50IG5hbWUsIGludCB2YWx1ZSk7Ci0KLSAgICBzdGF0dXNfdCBnZXQoaW50IG5hbWUpOwotCi0gICAgc3RhdHVzX3QgYmxpdCggCi0gICAgICAgICAgICBjb25zdCBjb3B5Yml0X2ltYWdlX3QmIGRzdCwKLSAgICAgICAgICAgIGNvbnN0IGNvcHliaXRfaW1hZ2VfdCYgc3JjLAotICAgICAgICAgICAgY29weWJpdF9yZWdpb25fdCBjb25zdCogcmVnaW9uKTsKLQotICAgIHN0YXR1c190IHN0cmV0Y2goIAotICAgICAgICAgICAgY29uc3QgY29weWJpdF9pbWFnZV90JiBkc3QsCi0gICAgICAgICAgICBjb25zdCBjb3B5Yml0X2ltYWdlX3QmIHNyYywgCi0gICAgICAgICAgICBjb25zdCBjb3B5Yml0X3JlY3RfdCYgZHN0X3JlY3QsCi0gICAgICAgICAgICBjb25zdCBjb3B5Yml0X3JlY3RfdCYgc3JjX3JlY3QsCi0gICAgICAgICAgICBjb3B5Yml0X3JlZ2lvbl90IGNvbnN0KiByZWdpb24pOwotCi0jaWYgSEFWRV9BTkRST0lEX09TCi1wcml2YXRlOgotICAgIHN0YXRpYyBpbnQgY29weWJpdF9zZXRfcGFyYW1ldGVyKGNvcHliaXRfdCogaGFuZGxlLCBpbnQgbmFtZSwgaW50IHZhbHVlKTsKLSAgICBzdGF0aWMgaW50IGNvcHliaXRfYmxpdCggY29weWJpdF90KiBoYW5kbGUsIAotICAgICAgICAgICAgY29weWJpdF9pbWFnZV90IGNvbnN0KiBkc3QsIGNvcHliaXRfaW1hZ2VfdCBjb25zdCogc3JjLAotICAgICAgICAgICAgY29weWJpdF9yZWdpb25fdCBjb25zdCogcmVnaW9uKTsKLSAgICBzdGF0aWMgaW50IGNvcHliaXRfc3RyZXRjaChjb3B5Yml0X3QqIGhhbmRsZSwgCi0gICAgICAgICAgICBjb3B5Yml0X2ltYWdlX3QgY29uc3QqIGRzdCwgIGNvcHliaXRfaW1hZ2VfdCBjb25zdCogc3JjLCAKLSAgICAgICAgICAgIGNvcHliaXRfcmVjdF90IGNvbnN0KiBkc3RfcmVjdCwgY29weWJpdF9yZWN0X3QgY29uc3QqIHNyY19yZWN0LAotICAgICAgICAgICAgY29weWJpdF9yZWdpb25fdCBjb25zdCogcmVnaW9uKTsKLSAgICBzdGF0aWMgaW50IGNvcHliaXRfZ2V0KGNvcHliaXRfdCogaGFuZGxlLCBpbnQgbmFtZSk7Ci0KLSAgICBpbnQgZ2V0Rm9ybWF0KGludCBmb3JtYXQpOwotICAgIHZvaWQgc2V0SW1hZ2UobWRwX2ltZyogaW1nLCBjb25zdCBjb3B5Yml0X2ltYWdlX3QmIHJocyk7Ci0gICAgdm9pZCBzZXRSZWN0cyhtZHBfYmxpdF9yZXEqIHJlcSwgY29uc3QgY29weWJpdF9yZWN0X3QmIGRzdCwKLSAgICAgICAgICAgIGNvbnN0IGNvcHliaXRfcmVjdF90JiBzcmMsIGNvbnN0IGNvcHliaXRfcmVjdF90JiBzY2lzc29yKTsKLSAgICB2b2lkIHNldEluZm9zKG1kcF9ibGl0X3JlcSogcmVxKTsKLSAgICBzdGF0aWMgdm9pZCBpbnRlcnNlY3QoY29weWJpdF9yZWN0X3QqIG91dCwgCi0gICAgICAgICAgICBjb25zdCBjb3B5Yml0X3JlY3RfdCYgbGhzLCBjb25zdCBjb3B5Yml0X3JlY3RfdCYgcmhzKTsKLSAgICBzdGF0dXNfdCBtc21fY29weWJpdCh2b2lkIGNvbnN0KiBsaXN0KTsKLSNlbmRpZgotICAgIGludCBtRkQ7Ci0gICAgdWludDhfdCBtQWxwaGE7Ci0gICAgdWludDhfdCBtRmxhZ3M7Ci19OwotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBjb3B5Yml0X3QqIGNvcHliaXRfaW5pdCgpCi17Ci0gICAgQ29weWJpdE1TTTdLKiBlbmdpbmUgPSBuZXcgQ29weWJpdE1TTTdLKCk7Ci0gICAgaWYgKGVuZ2luZS0+Z2V0U3RhdHVzKCkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgZGVsZXRlIGVuZ2luZTsKLSAgICAgICAgZW5naW5lID0gMDsKLSAgICB9Ci0gICAgcmV0dXJuIChzdHJ1Y3QgY29weWJpdF90KillbmdpbmU7Ci0gICAgICAgIAotfQotCi1pbnQgY29weWJpdF90ZXJtKGNvcHliaXRfdCogaGFuZGxlKQotewotICAgIGRlbGV0ZSBzdGF0aWNfY2FzdDxDb3B5Yml0TVNNN0sqPihoYW5kbGUpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGlubGluZQotaW50IG1pbihpbnQgYSwgaW50IGIpIHsKLSAgICByZXR1cm4gKGE8YikgPyBhIDogYjsKLX0KLQotc3RhdGljIGlubGluZQotaW50IG1heChpbnQgYSwgaW50IGIpIHsKLSAgICByZXR1cm4gKGE+YikgPyBhIDogYjsKLX0KLQotc3RhdGljIGlubGluZQotdm9pZCBNVUxESVYodWludDMyX3QmIGEsIHVpbnQzMl90JiBiLCBpbnQgbXVsLCBpbnQgZGl2KQotewotICAgIGlmIChtdWwgIT0gZGl2KSB7Ci0gICAgICAgIGEgPSAobXVsICogYSkgLyBkaXY7Ci0gICAgICAgIGIgPSAobXVsICogYikgLyBkaXY7Ci0gICAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBIQVZFX0FORFJPSURfT1MKLQotaW50IENvcHliaXRNU003Szo6Y29weWJpdF9zZXRfcGFyYW1ldGVyKGNvcHliaXRfdCogaGFuZGxlLCBpbnQgbmFtZSwgaW50IHZhbHVlKQotewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxDb3B5Yml0TVNNN0sqPihoYW5kbGUpLT5zZXRQYXJhbWV0ZXIobmFtZSwgdmFsdWUpOwotfQotCi1pbnQgQ29weWJpdE1TTTdLOjpjb3B5Yml0X2dldChjb3B5Yml0X3QqIGhhbmRsZSwgaW50IG5hbWUpCi17Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PENvcHliaXRNU003Syo+KGhhbmRsZSktPmdldChuYW1lKTsKLX0KLQotaW50IENvcHliaXRNU003Szo6Y29weWJpdF9ibGl0KAotICAgICAgICBjb3B5Yml0X3QqIGhhbmRsZSwgCi0gICAgICAgIGNvcHliaXRfaW1hZ2VfdCBjb25zdCogZHN0LCAKLSAgICAgICAgY29weWJpdF9pbWFnZV90IGNvbnN0KiBzcmMsCi0gICAgICAgIHN0cnVjdCBjb3B5Yml0X3JlZ2lvbl90IGNvbnN0KiByZWdpb24pCi17Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PENvcHliaXRNU003Syo+KGhhbmRsZSktPmJsaXQoKmRzdCwgKnNyYywgcmVnaW9uKTsKLX0KLQotaW50IENvcHliaXRNU003Szo6Y29weWJpdF9zdHJldGNoKAotICAgICAgICBjb3B5Yml0X3QqIGhhbmRsZSwgCi0gICAgICAgIGNvcHliaXRfaW1hZ2VfdCBjb25zdCogZHN0LCAKLSAgICAgICAgY29weWJpdF9pbWFnZV90IGNvbnN0KiBzcmMsIAotICAgICAgICBjb3B5Yml0X3JlY3RfdCBjb25zdCogZHN0X3JlY3QsCi0gICAgICAgIGNvcHliaXRfcmVjdF90IGNvbnN0KiBzcmNfcmVjdCwKLSAgICAgICAgc3RydWN0IGNvcHliaXRfcmVnaW9uX3QgY29uc3QqIHJlZ2lvbikKLXsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q29weWJpdE1TTTdLKj4oaGFuZGxlKS0+c3RyZXRjaCgKLSAgICAgICAgICAgICpkc3QsICpzcmMsICpkc3RfcmVjdCwgKnNyY19yZWN0LCByZWdpb24pOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNvcHliaXRNU003Szo6Q29weWJpdE1TTTdLKCkKLSAgICA6IG1GRCgtMSksIG1BbHBoYShNRFBfQUxQSEFfTk9QKSwgbUZsYWdzKDApCi17Ci0gICAgaW50IGZkID0gb3BlbigiL2Rldi9ncmFwaGljcy9mYjAiLCBPX1JEV1IsIDApOwotICAgIGlmIChmZCA+IDApIHsKLSAgICAgICAgc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIGZpbmZvOwotICAgICAgICBpZiAoaW9jdGwoZmQsIEZCSU9HRVRfRlNDUkVFTklORk8sICZmaW5mbykgPT0gMCkgewotICAgICAgICAgICAgaWYgKCFzdHJjbXAoZmluZm8uaWQsICJtc21mYiIpKSB7Ci0gICAgICAgICAgICAgICAgbUZEID0gZmQ7Ci0gICAgICAgICAgICAgICAgY29weWJpdF90OjpzZXRfcGFyYW1ldGVyID0gY29weWJpdF9zZXRfcGFyYW1ldGVyOwotICAgICAgICAgICAgICAgIGNvcHliaXRfdDo6Z2V0ID0gY29weWJpdF9nZXQ7Ci0gICAgICAgICAgICAgICAgY29weWJpdF90OjpibGl0ID0gY29weWJpdF9ibGl0OwotICAgICAgICAgICAgICAgIGNvcHliaXRfdDo6c3RyZXRjaCA9IGNvcHliaXRfc3RyZXRjaDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoZmQ8MCB8fCBtRkQ8MCkgewotICAgICAgICBpZiAoZmQ+MCkgeyBjbG9zZShmZCk7IH0KLSAgICAgICAgbUZEID0gLWVycm5vOwotICAgIH0KLX0KLQotQ29weWJpdE1TTTdLOjp+Q29weWJpdE1TTTdLKCkKLXsKLSAgICBpZiAobUZEID4gMCl7Ci0gICAgICAgIGNsb3NlKG1GRCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBDb3B5Yml0TVNNN0s6OnNldFBhcmFtZXRlcihpbnQgbmFtZSwgaW50IHZhbHVlKQotewotICAgIHN3aXRjaChuYW1lKSB7Ci0gICAgY2FzZSBDT1BZQklUX1JPVEFUSU9OX0RFRzoKLSAgICAgICAgc3dpdGNoICh2YWx1ZSkgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICBtRmxhZ3MgJj0gfjB4NzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDkwOgotICAgICAgICAgICAgbUZsYWdzICY9IH4weDc7Ci0gICAgICAgICAgICBtRmxhZ3MgfD0gTURQX1JPVF85MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE4MDoKLSAgICAgICAgICAgIG1GbGFncyAmPSB+MHg3OwotICAgICAgICAgICAgbUZsYWdzIHw9IE1EUF9ST1RfMTgwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjcwOgotICAgICAgICAgICAgbUZsYWdzICY9IH4weDc7Ci0gICAgICAgICAgICBtRmxhZ3MgfD0gTURQX1JPVF8yNzA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDT1BZQklUX1BMQU5FX0FMUEhBOgotICAgICAgICBpZiAodmFsdWUgPCAwKSAgICAgIHZhbHVlID0gMDsKLSAgICAgICAgaWYgKHZhbHVlID49IDI1NikgICB2YWx1ZSA9IDI1NTsKLSAgICAgICAgbUFscGhhID0gdmFsdWU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQ09QWUJJVF9ESVRIRVI6Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBDT1BZQklUX0VOQUJMRSkgewotICAgICAgICAgICAgbUZsYWdzIHw9IE1EUF9ESVRIRVI7Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gQ09QWUJJVF9ESVNBQkxFKSB7Ci0gICAgICAgICAgICBtRmxhZ3MgJj0gfk1EUF9ESVRIRVI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDT1BZQklUX1RSQU5TRk9STToKLSAgICAgICAgbUZsYWdzICY9IH4weDc7Ci0gICAgICAgIG1GbGFncyB8PSB2YWx1ZSAmIDB4NzsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBDb3B5Yml0TVNNN0s6OmdldChpbnQgbmFtZSkKLXsKLSAgICBzd2l0Y2gobmFtZSkgewotICAgIGNhc2UgQ09QWUJJVF9NSU5JRklDQVRJT05fTElNSVQ6Ci0gICAgICAgIHJldHVybiA0OwotICAgIGNhc2UgQ09QWUJJVF9NQUdOSUZJQ0FUSU9OX0xJTUlUOgotICAgICAgICByZXR1cm4gNDsKLSAgICBjYXNlIENPUFlCSVRfU0NBTElOR19GUkFDX0JJVFM6Ci0gICAgICAgIHJldHVybiAzMjsKLSAgICBjYXNlIENPUFlCSVRfUk9UQVRJT05fU1RFUF9ERUc6Ci0gICAgICAgIHJldHVybiA5MDsKLSAgICB9Ci0gICAgcmV0dXJuIEJBRF9WQUxVRTsKLX0KLQotc3RhdHVzX3QgQ29weWJpdE1TTTdLOjpibGl0KCAKLSAgICAgICAgY29uc3QgY29weWJpdF9pbWFnZV90JiBkc3QsCi0gICAgICAgIGNvbnN0IGNvcHliaXRfaW1hZ2VfdCYgc3JjLAotICAgICAgICBjb3B5Yml0X3JlZ2lvbl90IGNvbnN0KiByZWdpb24pCi17Ci0gICAgCi0gICAgY29weWJpdF9yZWN0X3QgZHIgPSB7IDAsIDAsIGRzdC53LCBkc3QuaCB9OwotICAgIGNvcHliaXRfcmVjdF90IHNyID0geyAwLCAwLCBzcmMudywgc3JjLmggfTsKLSAgICByZXR1cm4gQ29weWJpdE1TTTdLOjpzdHJldGNoKGRzdCwgc3JjLCBkciwgc3IsIHJlZ2lvbik7Ci19Ci0KLXN0YXR1c190IENvcHliaXRNU003Szo6c3RyZXRjaCggCi0gICAgICAgIGNvbnN0IGNvcHliaXRfaW1hZ2VfdCYgZHN0LAotICAgICAgICBjb25zdCBjb3B5Yml0X2ltYWdlX3QmIHNyYywgCi0gICAgICAgIGNvbnN0IGNvcHliaXRfcmVjdF90JiBkc3RfcmVjdCwKLSAgICAgICAgY29uc3QgY29weWJpdF9yZWN0X3QmIHNyY19yZWN0LAotICAgICAgICBjb3B5Yml0X3JlZ2lvbl90IGNvbnN0KiByZWdpb24pCi17Ci0gICAgc3RydWN0IHsKLSAgICAgICAgdWludDMyX3QgY291bnQ7Ci0gICAgICAgIHN0cnVjdCBtZHBfYmxpdF9yZXEgcmVxWzEyXTsKLSAgICB9IGxpc3Q7Ci0gICAgCi0gICAgaWYgKG1BbHBoYTwyNTUpIHsKLSAgICAgICAgc3dpdGNoIChzcmMuZm9ybWF0KSB7Ci0gICAgICAgICAgICAvLyB3ZSBkb250JyBzdXBwb3J0IHBsYW5lIGFscGhhIHdpdGggUkdCQSBmb3JtYXRzCi0gICAgICAgICAgICBjYXNlIENPUFlCSVRfUkdCQV84ODg4OgotICAgICAgICAgICAgY2FzZSBDT1BZQklUX1JHQkFfNTU1MToKLSAgICAgICAgICAgIGNhc2UgQ09QWUJJVF9SR0JBXzQ0NDQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgfQotICAgICAgICAKLSAgICBjb25zdCB1aW50MzJfdCBtYXhDb3VudCA9IHNpemVvZihsaXN0LnJlcSkvc2l6ZW9mKGxpc3QucmVxWzBdKTsKLSAgICBjb25zdCBjb3B5Yml0X3JlY3RfdCBib3VuZHMgPSB7IDAsIDAsIGRzdC53LCBkc3QuaCB9OwotICAgIGNvcHliaXRfcmVjdF90IGNsaXA7Ci0gICAgbGlzdC5jb3VudCA9IDA7Ci0gICAgaW50IGVyciA9IDA7Ci0gICAgd2hpbGUgKCFlcnIgJiYgcmVnaW9uLT5uZXh0KHJlZ2lvbiwgJmNsaXApKSB7Ci0gICAgICAgIGludGVyc2VjdCgmY2xpcCwgYm91bmRzLCBjbGlwKTsKLSAgICAgICAgc2V0SW5mb3MoJmxpc3QucmVxW2xpc3QuY291bnRdKTsKLSAgICAgICAgc2V0SW1hZ2UoJmxpc3QucmVxW2xpc3QuY291bnRdLmRzdCwgZHN0KTsKLSAgICAgICAgc2V0SW1hZ2UoJmxpc3QucmVxW2xpc3QuY291bnRdLnNyYywgc3JjKTsKLSAgICAgICAgc2V0UmVjdHMoJmxpc3QucmVxW2xpc3QuY291bnRdLCBkc3RfcmVjdCwgc3JjX3JlY3QsIGNsaXApOwotICAgICAgICBpZiAoKytsaXN0LmNvdW50ID09IG1heENvdW50KSB7Ci0gICAgICAgICAgICBlcnIgPSBtc21fY29weWJpdCgmbGlzdCk7Ci0gICAgICAgICAgICBsaXN0LmNvdW50ID0gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIWVyciAmJiBsaXN0LmNvdW50KSB7Ci0gICAgICAgIGVyciA9IG1zbV9jb3B5Yml0KCZsaXN0KTsKLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgQ29weWJpdE1TTTdLOjptc21fY29weWJpdCh2b2lkIGNvbnN0KiBsaXN0KQotewotICAgIGludCBlcnIgPSBpb2N0bChtRkQsIE1TTUZCX0JMSVQsIHN0YXRpY19jYXN0PG1kcF9ibGl0X3JlcV9saXN0IGNvbnN0Kj4obGlzdCkpOwotICAgIExPR0VfSUYoZXJyPDAsICJjb3B5Qml0cyBmYWlsZWQgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgaWYgKGVyciA9PSAwKQotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgcmV0dXJuIC1lcnJubzsKLX0KLQotaW50IENvcHliaXRNU003Szo6Z2V0Rm9ybWF0KGludCBmb3JtYXQpCi17Ci0gICAgc3dpdGNoIChmb3JtYXQpIHsKLSAgICBjYXNlIENPUFlCSVRfUkdCQV84ODg4OiAgICAgcmV0dXJuIE1EUF9SR0JBXzg4ODg7Ci0gICAgY2FzZSBDT1BZQklUX1JHQl81NjU6ICAgICAgIHJldHVybiBNRFBfUkdCXzU2NTsKLSAgICBjYXNlIENPUFlCSVRfWUNiQ3JfNDIyX1NQOiAgcmV0dXJuIE1EUF9ZX0NCQ1JfSDJWMTsKLSAgICBjYXNlIENPUFlCSVRfWUNiQ3JfNDIwX1NQOiAgcmV0dXJuIE1EUF9ZX0NCQ1JfSDJWMjsKLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotCi12b2lkIENvcHliaXRNU003Szo6c2V0SW5mb3MobWRwX2JsaXRfcmVxKiByZXEpCi17Ci0gICAgcmVxLT5hbHBoYSA9IG1BbHBoYTsKLSAgICByZXEtPnRyYW5zcF9tYXNrID0gTURQX1RSQU5TUF9OT1A7Ci0gICAgcmVxLT5mbGFncyA9IG1GbGFnczsKLX0KLQotdm9pZCBDb3B5Yml0TVNNN0s6OnNldEltYWdlKG1kcF9pbWcqIGltZywgY29uc3QgY29weWJpdF9pbWFnZV90JiByaHMpCi17Ci0gICAgaW1nLT53aWR0aCAgICAgID0gcmhzLnc7Ci0gICAgaW1nLT5oZWlnaHQgICAgID0gcmhzLmg7Ci0gICAgaW1nLT5mb3JtYXQgICAgID0gZ2V0Rm9ybWF0KHJocy5mb3JtYXQpOwotICAgIGltZy0+b2Zmc2V0ICAgICA9IHJocy5vZmZzZXQ7Ci0gICAgaW1nLT5tZW1vcnlfaWQgID0gcmhzLmZkOwotfQotICAgIAotdm9pZCBDb3B5Yml0TVNNN0s6OnNldFJlY3RzKG1kcF9ibGl0X3JlcSogZSwgCi0gICAgICAgIGNvbnN0IGNvcHliaXRfcmVjdF90JiBkc3QsIGNvbnN0IGNvcHliaXRfcmVjdF90JiBzcmMsCi0gICAgICAgIGNvbnN0IGNvcHliaXRfcmVjdF90JiBzY2lzc29yKQotewotICAgIGNvcHliaXRfcmVjdF90IGNsaXA7Ci0gICAgaW50ZXJzZWN0KCZjbGlwLCBzY2lzc29yLCBkc3QpOwotCi0gICAgZS0+ZHN0X3JlY3QueCAgPSBjbGlwLmw7Ci0gICAgZS0+ZHN0X3JlY3QueSAgPSBjbGlwLnQ7Ci0gICAgZS0+ZHN0X3JlY3QudyAgPSBjbGlwLnIgLSBjbGlwLmw7Ci0gICAgZS0+ZHN0X3JlY3QuaCAgPSBjbGlwLmIgLSBjbGlwLnQ7Ci0KLSAgICB1aW50MzJfdCBXLCBIOwotICAgIGlmIChtRmxhZ3MgJiBDT1BZQklUX1RSQU5TRk9STV9ST1RfOTApIHsKLSAgICAgICAgZS0+c3JjX3JlY3QueCAgPSAoY2xpcC50IC0gZHN0LnQpICsgc3JjLnQ7Ci0gICAgICAgIGUtPnNyY19yZWN0LnkgID0gKGRzdC5yIC0gY2xpcC5yKSArIHNyYy5sOwotICAgICAgICBlLT5zcmNfcmVjdC53ICA9IChjbGlwLmIgLSBjbGlwLnQpOwotICAgICAgICBlLT5zcmNfcmVjdC5oICA9IChjbGlwLnIgLSBjbGlwLmwpOwotICAgICAgICBXID0gZHN0LmIgLSBkc3QudDsKLSAgICAgICAgSCA9IGRzdC5yIC0gZHN0Lmw7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZS0+c3JjX3JlY3QueCAgPSAoY2xpcC5sIC0gZHN0LmwpICsgc3JjLmw7Ci0gICAgICAgIGUtPnNyY19yZWN0LnkgID0gKGNsaXAudCAtIGRzdC50KSArIHNyYy50OwotICAgICAgICBlLT5zcmNfcmVjdC53ICA9IChjbGlwLnIgLSBjbGlwLmwpOwotICAgICAgICBlLT5zcmNfcmVjdC5oICA9IChjbGlwLmIgLSBjbGlwLnQpOwotICAgICAgICBXID0gZHN0LnIgLSBkc3QubDsKLSAgICAgICAgSCA9IGRzdC5iIC0gZHN0LnQ7Ci0gICAgfQotICAgIE1VTERJVihlLT5zcmNfcmVjdC54LCBlLT5zcmNfcmVjdC53LCBzcmMuciAtIHNyYy5sLCBXKTsKLSAgICBNVUxESVYoZS0+c3JjX3JlY3QueSwgZS0+c3JjX3JlY3QuaCwgc3JjLmIgLSBzcmMudCwgSCk7Ci0gICAgaWYgKG1GbGFncyAmIENPUFlCSVRfVFJBTlNGT1JNX0ZMSVBfVikgewotICAgICAgICBlLT5zcmNfcmVjdC55ID0gZS0+c3JjLmhlaWdodCAtIChlLT5zcmNfcmVjdC55ICsgZS0+c3JjX3JlY3QuaCk7Ci0gICAgfQotICAgIGlmIChtRmxhZ3MgJiBDT1BZQklUX1RSQU5TRk9STV9GTElQX0gpIHsKLSAgICAgICAgZS0+c3JjX3JlY3QueCA9IGUtPnNyYy53aWR0aCAgLSAoZS0+c3JjX3JlY3QueCArIGUtPnNyY19yZWN0LncpOwotICAgIH0KLX0KLQotdm9pZCBDb3B5Yml0TVNNN0s6OmludGVyc2VjdChjb3B5Yml0X3JlY3RfdCogb3V0LCAKLSAgICAgICAgY29uc3QgY29weWJpdF9yZWN0X3QmIGxocywgY29uc3QgY29weWJpdF9yZWN0X3QmIHJocykKLXsKLSAgICBvdXQtPmwgPSBtYXgobGhzLmwsIHJocy5sKTsKLSAgICBvdXQtPnQgPSBtYXgobGhzLnQsIHJocy50KTsKLSAgICBvdXQtPnIgPSBtaW4obGhzLnIsIHJocy5yKTsKLSAgICBvdXQtPmIgPSBtaW4obGhzLmIsIHJocy5iKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNlbHNlIC8vIEhBVkVfQU5EUk9JRF9PUwotCi1Db3B5Yml0TVNNN0s6OkNvcHliaXRNU003SygpCi0gICAgOiBtRkQoLTEpCi17Ci19Ci0KLUNvcHliaXRNU003Szo6fkNvcHliaXRNU003SygpCi17Ci19Ci0KLXN0YXR1c190IENvcHliaXRNU003Szo6c2V0UGFyYW1ldGVyKGludCBuYW1lLCBpbnQgdmFsdWUpCi17Ci0gICAgcmV0dXJuIE5PX0lOSVQ7Ci19Ci0KLXN0YXR1c190IENvcHliaXRNU003Szo6Z2V0KGludCBuYW1lKQotewotICAgIHJldHVybiBCQURfVkFMVUU7Ci19Ci0KLXN0YXR1c190IENvcHliaXRNU003Szo6YmxpdCggCi0gICAgICAgIGNvbnN0IGNvcHliaXRfaW1hZ2VfdCYgZHN0LAotICAgICAgICBjb25zdCBjb3B5Yml0X2ltYWdlX3QmIHNyYywKLSAgICAgICAgY29weWJpdF9yZWdpb25fdCBjb25zdCogcmVnaW9uKQotewotICAgIHJldHVybiBOT19JTklUOwotfQotCi1zdGF0dXNfdCBDb3B5Yml0TVNNN0s6OnN0cmV0Y2goIAotICAgICAgICBjb25zdCBjb3B5Yml0X2ltYWdlX3QmIGRzdCwKLSAgICAgICAgY29uc3QgY29weWJpdF9pbWFnZV90JiBzcmMsIAotICAgICAgICBjb25zdCBjb3B5Yml0X3JlY3RfdCYgZHN0X3JlY3QsCi0gICAgICAgIGNvbnN0IGNvcHliaXRfcmVjdF90JiBzcmNfcmVjdCwKLSAgICAgICAgY29weWJpdF9yZWdpb25fdCBjb25zdCogcmVnaW9uKQotewotICAgIHJldHVybiBOT19JTklUOwotfQotCi0jZW5kaWYgLy8gSEFWRV9BTkRST0lEX09TCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy91aS9DYW1lcmEuY3BwIGIvbGlicy91aS9DYW1lcmEuY3BwCmluZGV4IDE1MjhlNmUuLjk1MjcwMDkgMTAwNjQ0Ci0tLSBhL2xpYnMvdWkvQ2FtZXJhLmNwcAorKysgYi9saWJzL3VpL0NhbWVyYS5jcHAKQEAgLTEsMjggKzEsMjggQEAKIC8qCiAqKgotKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqIENvcHlyaWdodCAoQykgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKiogQ29weXJpZ2h0IChDKSAyMDA4IEhUQyBJbmMuCiAqKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkNhbWVyYSIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQogI2luY2x1ZGUgPHV0aWxzL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlIDx1dGlscy9JTWVtb3J5Lmg+CiAjaW5jbHVkZSA8dWkvU3VyZmFjZS5oPgotCiAjaW5jbHVkZSA8dWkvQ2FtZXJhLmg+CiAjaW5jbHVkZSA8dWkvSUNhbWVyYVNlcnZpY2UuaD4KIApAQCAtNjAsMjAgKzYwLDM2IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogQ2FtZXJhOjpDYW1lcmEoKQotICAgICAgOiBtU3RhdHVzKFVOS05PV05fRVJST1IpLAotICAgICAgICBtU2h1dHRlckNhbGxiYWNrKDApLAotICAgICAgICBtU2h1dHRlckNhbGxiYWNrQ29va2llKDApLAotICAgICAgICBtUmF3Q2FsbGJhY2soMCksCi0gICAgICAgIG1SYXdDYWxsYmFja0Nvb2tpZSgwKSwKLSAgICAgICAgbUpwZWdDYWxsYmFjaygwKSwKLSAgICAgICAgbUpwZWdDYWxsYmFja0Nvb2tpZSgwKSwKLSAgICAgICAgbUZyYW1lQ2FsbGJhY2soMCksCi0gICAgICAgIG1GcmFtZUNhbGxiYWNrQ29va2llKDApLAotICAgICAgICBtRXJyb3JDYWxsYmFjaygwKSwKLSAgICAgICAgbUVycm9yQ2FsbGJhY2tDb29raWUoMCksCi0gICAgICAgIG1BdXRvRm9jdXNDYWxsYmFjaygwKSwKLSAgICAgICAgbUF1dG9Gb2N1c0NhbGxiYWNrQ29va2llKDApCiB7CisgICAgaW5pdCgpOworfQorCitDYW1lcmE6OkNhbWVyYShjb25zdCBzcDxJQ2FtZXJhPiYgY2FtZXJhKQoreworICAgIGluaXQoKTsKKyAgICAvLyBjb25uZWN0IHRoaXMgY2xpZW50IHRvIGV4aXN0aW5nIGNhbWVyYSByZW1vdGUKKyAgICBpZiAoY2FtZXJhLT5jb25uZWN0KHRoaXMpID09IE5PX0VSUk9SKSB7CisgICAgICAgIG1TdGF0dXMgPSBOT19FUlJPUjsKKyAgICAgICAgbUNhbWVyYSA9IGNhbWVyYTsKKyAgICAgICAgY2FtZXJhLT5hc0JpbmRlcigpLT5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhOjppbml0KCkKK3sKKyAgICBtU3RhdHVzID0gVU5LTk9XTl9FUlJPUjsKKyAgICBtU2h1dHRlckNhbGxiYWNrID0gMDsKKyAgICBtU2h1dHRlckNhbGxiYWNrQ29va2llID0gMDsKKyAgICBtUmF3Q2FsbGJhY2sgPSAwOworICAgIG1SYXdDYWxsYmFja0Nvb2tpZSA9IDA7CisgICAgbUpwZWdDYWxsYmFjayA9IDA7CisgICAgbUpwZWdDYWxsYmFja0Nvb2tpZSA9IDA7CisgICAgbUZyYW1lQ2FsbGJhY2sgPSAwOworICAgIG1GcmFtZUNhbGxiYWNrQ29va2llID0gMDsKKyAgICBtRXJyb3JDYWxsYmFjayA9IDA7CisgICAgbUVycm9yQ2FsbGJhY2tDb29raWUgPSAwOworICAgIG1BdXRvRm9jdXNDYWxsYmFjayA9IDA7CisgICAgbUF1dG9Gb2N1c0NhbGxiYWNrQ29va2llID0gMDsKIH0KIAogQ2FtZXJhOjp+Q2FtZXJhKCkKQEAgLTgzLDYgKzk5LDcgQEAKIAogc3A8Q2FtZXJhPiBDYW1lcmE6OmNvbm5lY3QoKQogeworICAgIExPR1YoImNvbm5lY3QiKTsKICAgICBzcDxDYW1lcmE+IGMgPSBuZXcgQ2FtZXJhKCk7CiAgICAgY29uc3Qgc3A8SUNhbWVyYVNlcnZpY2U+JiBjcyA9IGdldENhbWVyYVNlcnZpY2UoKTsKICAgICBpZiAoY3MgIT0gMCkgewpAQCAtOTcsNiArMTE0LDcgQEAKIAogdm9pZCBDYW1lcmE6OmRpc2Nvbm5lY3QoKQogeworICAgIExPR1YoImRpc2Nvbm5lY3QiKTsKICAgICBpZiAobUNhbWVyYSAhPSAwKSB7CiAgICAgICAgIG1FcnJvckNhbGxiYWNrID0gMDsKICAgICAgICAgbUNhbWVyYS0+ZGlzY29ubmVjdCgpOwpAQCAtMTA0LDkgKzEyMiwyNCBAQAogICAgIH0KIH0KIAorc3RhdHVzX3QgQ2FtZXJhOjpyZWNvbm5lY3QoKQoreworICAgIExPR1YoInJlY29ubmVjdCIpOworICAgIGlmIChtQ2FtZXJhICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1DYW1lcmEtPmNvbm5lY3QodGhpcyk7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQorCitzcDxJQ2FtZXJhPiBDYW1lcmE6OnJlbW90ZSgpCit7CisgICAgcmV0dXJuIG1DYW1lcmE7Cit9CisKIC8vIHBhc3MgdGhlIGJ1ZmZlcmVkIElTdXJmYWNlIHRvIHRoZSBjYW1lcmEgc2VydmljZQogc3RhdHVzX3QgQ2FtZXJhOjpzZXRQcmV2aWV3RGlzcGxheShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkKIHsKKyAgICBMT0dWKCJzZXRQcmV2aWV3RGlzcGxheSIpOwogICAgIGlmIChzdXJmYWNlID09IDApIHsKICAgICAgICAgTE9HRSgiYXBwIHBhc3NlZCBOVUxMIHN1cmZhY2UiKTsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CkBAIC0xMTQsODEgKzE0NywxMDUgQEAKICAgICByZXR1cm4gbUNhbWVyYS0+c2V0UHJldmlld0Rpc3BsYXkoc3VyZmFjZS0+Z2V0SVN1cmZhY2UoKSk7CiB9CiAKK3N0YXR1c190IENhbWVyYTo6c2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKQoreworICAgIExPR1YoInNldFByZXZpZXdEaXNwbGF5Iik7CisgICAgaWYgKHN1cmZhY2UgPT0gMCkgeworICAgICAgICBMT0dFKCJhcHAgcGFzc2VkIE5VTEwgc3VyZmFjZSIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1DYW1lcmEtPnNldFByZXZpZXdEaXNwbGF5KHN1cmZhY2UpOworfQorCisKIC8vIHN0YXJ0IHByZXZpZXcgbW9kZSwgbXVzdCBjYWxsIHNldFByZXZpZXdEaXNwbGF5IGZpcnN0CiBzdGF0dXNfdCBDYW1lcmE6OnN0YXJ0UHJldmlldygpCiB7CisgICAgTE9HVigic3RhcnRQcmV2aWV3Iik7CiAgICAgcmV0dXJuIG1DYW1lcmEtPnN0YXJ0UHJldmlldygpOwogfQogCiAvLyBzdG9wIHByZXZpZXcgbW9kZQogdm9pZCBDYW1lcmE6OnN0b3BQcmV2aWV3KCkKIHsKKyAgICBMT0dWKCJzdG9wUHJldmlldyIpOwogICAgIG1DYW1lcmEtPnN0b3BQcmV2aWV3KCk7CiB9CiAKIHN0YXR1c190IENhbWVyYTo6YXV0b0ZvY3VzKCkKIHsKKyAgICBMT0dWKCJhdXRvRm9jdXMiKTsKICAgICByZXR1cm4gbUNhbWVyYS0+YXV0b0ZvY3VzKCk7CiB9CiAKIC8vIHRha2UgYSBwaWN0dXJlCiBzdGF0dXNfdCBDYW1lcmE6OnRha2VQaWN0dXJlKCkKIHsKKyAgICBMT0dWKCJ0YWtlUGljdHVyZSIpOwogICAgIHJldHVybiBtQ2FtZXJhLT50YWtlUGljdHVyZSgpOwogfQogCiAvLyBzZXQgcHJldmlldy9jYXB0dXJlIHBhcmFtZXRlcnMgLSBrZXkvdmFsdWUgcGFpcnMKIHN0YXR1c190IENhbWVyYTo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBwYXJhbXMpCiB7CisgICAgTE9HVigic2V0UGFyYW1ldGVycyIpOwogICAgIHJldHVybiBtQ2FtZXJhLT5zZXRQYXJhbWV0ZXJzKHBhcmFtcyk7CiB9CiAKIC8vIGdldCBwcmV2aWV3L2NhcHR1cmUgcGFyYW1ldGVycyAtIGtleS92YWx1ZSBwYWlycwogU3RyaW5nOCBDYW1lcmE6OmdldFBhcmFtZXRlcnMoKSBjb25zdAogeworICAgIExPR1YoImdldFBhcmFtZXRlcnMiKTsKICAgICBTdHJpbmc4IHBhcmFtcyA9IG1DYW1lcmEtPmdldFBhcmFtZXRlcnMoKTsKICAgICByZXR1cm4gcGFyYW1zOwogfQogCiB2b2lkIENhbWVyYTo6c2V0QXV0b0ZvY3VzQ2FsbGJhY2soYXV0b2ZvY3VzX2NhbGxiYWNrIGNiLCB2b2lkICpjb29raWUpCiB7CisgICAgTE9HVigic2V0QXV0b0ZvY3VzQ2FsbGJhY2siKTsKICAgICBtQXV0b0ZvY3VzQ2FsbGJhY2sgPSBjYjsKICAgICBtQXV0b0ZvY3VzQ2FsbGJhY2tDb29raWUgPSBjb29raWU7CiB9CiAKIHZvaWQgQ2FtZXJhOjpzZXRTaHV0dGVyQ2FsbGJhY2soc2h1dHRlcl9jYWxsYmFjayBjYiwgdm9pZCAqY29va2llKQogeworICAgIExPR1YoInNldFNodXR0ZXJDYWxsYmFjayIpOwogICAgIG1TaHV0dGVyQ2FsbGJhY2sgPSBjYjsKICAgICBtU2h1dHRlckNhbGxiYWNrQ29va2llID0gY29va2llOwogfQogCiB2b2lkIENhbWVyYTo6c2V0UmF3Q2FsbGJhY2soZnJhbWVfY2FsbGJhY2sgY2IsIHZvaWQgKmNvb2tpZSkKIHsKKyAgICBMT0dWKCJzZXRSYXdDYWxsYmFjayIpOwogICAgIG1SYXdDYWxsYmFjayA9IGNiOwogICAgIG1SYXdDYWxsYmFja0Nvb2tpZSA9IGNvb2tpZTsKIH0KIAogdm9pZCBDYW1lcmE6OnNldEpwZWdDYWxsYmFjayhmcmFtZV9jYWxsYmFjayBjYiwgdm9pZCAqY29va2llKQogeworICAgIExPR1YoInNldEpwZWdDYWxsYmFjayIpOwogICAgIG1KcGVnQ2FsbGJhY2sgPSBjYjsKICAgICBtSnBlZ0NhbGxiYWNrQ29va2llID0gY29va2llOwogfQogCi12b2lkIENhbWVyYTo6c2V0RnJhbWVDYWxsYmFjayhmcmFtZV9jYWxsYmFjayBjYiwgdm9pZCAqY29va2llKQordm9pZCBDYW1lcmE6OnNldEZyYW1lQ2FsbGJhY2soZnJhbWVfY2FsbGJhY2sgY2IsIHZvaWQgKmNvb2tpZSwgaW50IGZyYW1lX2NhbGxiYWNrX2ZsYWcpCiB7CisgICAgTE9HVigic2V0RnJhbWVDYWxsYmFjayIpOwogICAgIG1GcmFtZUNhbGxiYWNrID0gY2I7CiAgICAgbUZyYW1lQ2FsbGJhY2tDb29raWUgPSBjb29raWU7Ci0gICAgbUNhbWVyYS0+c2V0SGFzRnJhbWVDYWxsYmFjayhjYiAhPSBOVUxMKTsKKyAgICBtQ2FtZXJhLT5zZXRGcmFtZUNhbGxiYWNrRmxhZyhmcmFtZV9jYWxsYmFja19mbGFnKTsKIH0KIAogdm9pZCBDYW1lcmE6OnNldEVycm9yQ2FsbGJhY2soZXJyb3JfY2FsbGJhY2sgY2IsIHZvaWQgKmNvb2tpZSkKIHsKKyAgICBMT0dWKCJzZXRFcnJvckNhbGxiYWNrIik7CiAgICAgbUVycm9yQ2FsbGJhY2sgPSBjYjsKICAgICBtRXJyb3JDYWxsYmFja0Nvb2tpZSA9IGNvb2tpZTsKIH0KIAogdm9pZCBDYW1lcmE6OmF1dG9Gb2N1c0NhbGxiYWNrKGJvb2wgZm9jdXNlZCkKIHsKKyAgICBMT0dWKCJhdXRvRm9jdXNDYWxsYmFjayIpOwogICAgIGlmIChtQXV0b0ZvY3VzQ2FsbGJhY2spIHsKICAgICAgICAgbUF1dG9Gb2N1c0NhbGxiYWNrKGZvY3VzZWQsIG1BdXRvRm9jdXNDYWxsYmFja0Nvb2tpZSk7CiAgICAgfQpAQCAtMTk2LDYgKzI1Myw3IEBACiAKIHZvaWQgQ2FtZXJhOjpzaHV0dGVyQ2FsbGJhY2soKQogeworICAgIExPR1YoInNodXR0ZXJDYWxsYmFjayIpOwogICAgIGlmIChtU2h1dHRlckNhbGxiYWNrKSB7CiAgICAgICAgIG1TaHV0dGVyQ2FsbGJhY2sobVNodXR0ZXJDYWxsYmFja0Nvb2tpZSk7CiAgICAgfQpAQCAtMjAzLDYgKzI2MSw3IEBACiAKIHZvaWQgQ2FtZXJhOjpyYXdDYWxsYmFjayhjb25zdCBzcDxJTWVtb3J5PiYgcGljdHVyZSkKIHsKKyAgICBMT0dWKCJyYXdDYWxsYmFjayIpOwogICAgIGlmIChtUmF3Q2FsbGJhY2spIHsKICAgICAgICAgbVJhd0NhbGxiYWNrKHBpY3R1cmUsIG1SYXdDYWxsYmFja0Nvb2tpZSk7CiAgICAgfQpAQCAtMjExLDYgKzI3MCw3IEBACiAvLyBjYWxsYmFjayBmcm9tIGNhbWVyYSBzZXJ2aWNlIHdoZW4gaW1hZ2UgaXMgcmVhZHkKIHZvaWQgQ2FtZXJhOjpqcGVnQ2FsbGJhY2soY29uc3Qgc3A8SU1lbW9yeT4mIHBpY3R1cmUpCiB7CisgICAgTE9HVigianBlZ0NhbGxiYWNrIik7CiAgICAgaWYgKG1KcGVnQ2FsbGJhY2spIHsKICAgICAgICAgbUpwZWdDYWxsYmFjayhwaWN0dXJlLCBtSnBlZ0NhbGxiYWNrQ29va2llKTsKICAgICB9CkBAIC0yMTksNiArMjc5LDcgQEAKIC8vIGNhbGxiYWNrIGZyb20gY2FtZXJhIHNlcnZpY2Ugd2hlbiB2aWRlbyBmcmFtZSBpcyByZWFkeQogdm9pZCBDYW1lcmE6OmZyYW1lQ2FsbGJhY2soY29uc3Qgc3A8SU1lbW9yeT4mIGZyYW1lKQogeworICAgIExPR1YoImZyYW1lQ2FsbGJhY2siKTsKICAgICBpZiAobUZyYW1lQ2FsbGJhY2spIHsKICAgICAgICAgbUZyYW1lQ2FsbGJhY2soZnJhbWUsIG1GcmFtZUNhbGxiYWNrQ29va2llKTsKICAgICB9CkBAIC0yMjcsMTkgKzI4OCwyMSBAQAogLy8gY2FsbGJhY2sgZnJvbSBjYW1lcmEgc2VydmljZSB3aGVuIGFuIGVycm9yIG9jY3VycyBpbiBwcmV2aWV3IG9yIHRha2VQaWN0dXJlCiB2b2lkIENhbWVyYTo6ZXJyb3JDYWxsYmFjayhzdGF0dXNfdCBlcnJvcikKIHsKKyAgICBMT0dWKCJlcnJvckNhbGxiYWNrIik7CiAgICAgaWYgKG1FcnJvckNhbGxiYWNrKSB7CiAgICAgICAgIG1FcnJvckNhbGxiYWNrKGVycm9yLCBtRXJyb3JDYWxsYmFja0Nvb2tpZSk7CiAgICAgfQogfQogCi12b2lkIENhbWVyYTo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKSB7ICAgIAordm9pZCBDYW1lcmE6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykgewogICAgIExPR1coIklDYW1lcmEgZGllZCIpOwogICAgIGlmIChtRXJyb3JDYWxsYmFjaykgewogICAgICAgICBtRXJyb3JDYWxsYmFjayhERUFEX09CSkVDVCwgbUVycm9yQ2FsbGJhY2tDb29raWUpOwogICAgIH0KIH0KIAotdm9pZCBDYW1lcmE6OkRlYXRoTm90aWZpZXI6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykgeyAgICAKK3ZvaWQgQ2FtZXJhOjpEZWF0aE5vdGlmaWVyOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pIHsKKyAgICBMT0dWKCJiaW5kZXJEaWVkIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKENhbWVyYTo6bUxvY2spOwogICAgIENhbWVyYTo6bUNhbWVyYVNlcnZpY2UuY2xlYXIoKTsKICAgICBMT0dXKCJDYW1lcmEgc2VydmVyIGRpZWQhIik7CmRpZmYgLS1naXQgYS9saWJzL3VpL0VHTERpc3BsYXlTdXJmYWNlLmNwcCBiL2xpYnMvdWkvRUdMRGlzcGxheVN1cmZhY2UuY3BwCmluZGV4IGVhMjQ1ZjUuLjQ0MjU4YTggMTAwNjQ0Ci0tLSBhL2xpYnMvdWkvRUdMRGlzcGxheVN1cmZhY2UuY3BwCisrKyBiL2xpYnMvdWkvRUdMRGlzcGxheVN1cmZhY2UuY3BwCkBAIC0yOCwxMSArMjgsMTUgQEAKIAogI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KICNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKworI2luY2x1ZGUgPGhhcmR3YXJlL2NvcHliaXQuaD4KIAogI2luY2x1ZGUgPHVpL1N1cmZhY2VDb21wb3NlckNsaWVudC5oPgogI2luY2x1ZGUgPHVpL0Rpc3BsYXlJbmZvLmg+CiAjaW5jbHVkZSA8dWkvUmVjdC5oPgogI2luY2x1ZGUgPHVpL1JlZ2lvbi5oPgorI2luY2x1ZGUgPHVpL0VHTERpc3BsYXlTdXJmYWNlLmg+CiAKICNpZiBIQVZFX0FORFJPSURfT1MKICNpbmNsdWRlIDxsaW51eC9tc21fbWRwLmg+CkBAIC00Miw3ICs0Niw2IEBACiAKICNpbmNsdWRlIDxwaXhlbGZsaW5nZXIvZm9ybWF0Lmg+CiAKLSNpbmNsdWRlIDx1aS9FR0xEaXNwbGF5U3VyZmFjZS5oPgogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTc4LDcgKzgxLDEyIEBACiAgICAgbUJsaXRFbmdpbmUgPSAwOwogICAgIGVnbF9uYXRpdmVfd2luZG93X3Q6OmZkID0gbWFwRnJhbWVCdWZmZXIoKTsKICAgICBpZiAoZWdsX25hdGl2ZV93aW5kb3dfdDo6ZmQgPj0gMCkgewotICAgICAgICBtQmxpdEVuZ2luZSA9IGNvcHliaXRfaW5pdCgpOworICAgICAgICAKKyAgICAgICAgaHdfbW9kdWxlX3QgY29uc3QqIG1vZHVsZTsKKyAgICAgICAgaWYgKGh3X2dldF9tb2R1bGUoQ09QWUJJVF9IQVJEV0FSRV9NT0RVTEVfSUQsICZtb2R1bGUpID09IDApIHsKKyAgICAgICAgICAgIGNvcHliaXRfb3Blbihtb2R1bGUsICZtQmxpdEVuZ2luZSk7CisgICAgICAgIH0KKyAgICAgICAgCiAgICAgICAgIGNvbnN0IGZsb2F0IGluMm1tID0gMjUuNGY7CiAgICAgICAgIGZsb2F0IHJlZnJlc2hSYXRlID0gMTAwMDAwMDAwMDAwMDAwMExMVSAvICgKICAgICAgICAgICAgICAgICBmbG9hdCggbUluZm8udXBwZXJfbWFyZ2luICsgbUluZm8ubG93ZXJfbWFyZ2luICsgbUluZm8ueXJlcyApCkBAIC0xMDgsNyArMTE2LDcgQEAKIEVHTERpc3BsYXlTdXJmYWNlOjp+RUdMRGlzcGxheVN1cmZhY2UoKQogewogICAgIG1hZ2ljID0gMDsKLSAgICBjb3B5Yml0X3Rlcm0obUJsaXRFbmdpbmUpOworICAgIGNvcHliaXRfY2xvc2UobUJsaXRFbmdpbmUpOwogICAgIG1CbGl0RW5naW5lID0gMDsKICAgICBjbG9zZShlZ2xfbmF0aXZlX3dpbmRvd190OjpmZCk7CiAgICAgbXVubWFwKG1GYlswXS5kYXRhLCBtU2l6ZSk7CkBAIC0xNDcsOSArMTU1LDYgQEAKIAogdWludDMyX3QgRUdMRGlzcGxheVN1cmZhY2U6OnN3YXBCdWZmZXJzKCkKIHsKLSAgICBpZiAoIShtRmxhZ3MgJiBQQUdFX0ZMSVApKQotICAgICAgICByZXR1cm4gMDsKLQogI2RlZmluZSBTSE9XX0ZQUyAwCiAjaWYgU0hPV19GUFMKICAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsKQEAgLTE3MSw2ICsxNzYsMTEgQEAKICAgICAgICAgfQogICAgIH0KICNlbmRpZgorICAgIC8qIElmIHdlIGNhbid0IGRvIHRoZSBwYWdlX2ZsaXAsIGp1c3QgY29weSB0aGUgYmFjayBidWZmZXIgdG8gdGhlIGZyb250ICovCisgICAgaWYgKCEobUZsYWdzICYgUEFHRV9GTElQKSkgeworICAgICAgICBtZW1jcHkobUZiWzBdLmRhdGEsIG1GYlsxXS5kYXRhLCBtSW5mby54cmVzKm1JbmZvLnlyZXMqMik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAogICAgIC8vIGRvIHRoZSBhY3R1YWwgZmxpcAogICAgIG1JbmRleCA9IDEgLSBtSW5kZXg7CkBAIC0xOTIsNyArMjAyLDcgQEAKICAgICAgKiB3aXRoIG1zbTdrLgogICAgICAqLwogICAgIGlmIChlZ2xfbmF0aXZlX3dpbmRvd190OjptZW1vcnlfdHlwZSA9PSBOQVRJVkVfTUVNT1JZX1RZUEVfR1BVICYmIG9lbVswXSAmJiBtQmxpdEVuZ2luZSkgewotICAgICAgICBjb3B5Yml0X3QgKmNvcHliaXQgPSBtQmxpdEVuZ2luZTsKKyAgICAgICAgY29weWJpdF9kZXZpY2VfdCAqY29weWJpdCA9IG1CbGl0RW5naW5lOwogICAgICAgICBjb3B5Yml0X3JlY3RfdCBzZHJlY3QgPSB7IDAsIDAsCiAgICAgICAgICAgICAgICAgZWdsX25hdGl2ZV93aW5kb3dfdDo6d2lkdGgsIGVnbF9uYXRpdmVfd2luZG93X3Q6OmhlaWdodCB9OwogICAgICAgICBjb3B5Yml0X2ltYWdlX3QgZHN0ID0gewpAQCAtMjczLDYgKzI4MywxMiBAQAogICAgIH0gZWxzZQogI2VuZGlmCiAgICAgeworICAgICAgICAvKiBubyBleHRyYSBjb3B5IG5lZWRlZCBzaW5jZSB3ZSBjb3BpZWQgYmFjayB0byBmcm9udCBpbnN0ZWFkIG9mCisgICAgICAgICAqIGZsaXBwaW5nICovCisgICAgICAgIGlmICghKG1GbGFncyAmIFBBR0VfRkxJUCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCiAgICAgICAgIFJlZ2lvbjo6aXRlcmF0b3IgaXRlcmF0b3IoY29weWJhY2spOwogICAgICAgICBpZiAoaXRlcmF0b3IpIHsKICAgICAgICAgICAgIFJlY3QgcjsKQEAgLTM3MywxMiArMzg5LDExIEBACiAgICAgICAgIC8vIGJsZWFnaCwgYmFkIGluZm8gZnJvbSB0aGUgZHJpdmVyCiAgICAgICAgIHJlZnJlc2hSYXRlID0gNjAqMTAwMDsgIC8vIDYwIEh6CiAgICAgfQotCiAgICAgaWYgKGludChpbmZvLndpZHRoKSA8PSAwIHx8IGludChpbmZvLmhlaWdodCkgPD0gMCkgewogICAgICAgICAvLyB0aGUgZHJpdmVyIGRvZXNuJ3QgcmV0dXJuIHRoYXQgaW5mb3JtYXRpb24KICAgICAgICAgLy8gZGVmYXVsdCB0byAxNjAgZHBpCi0gICAgICAgIGluZm8ud2lkdGggID0gNTE7Ci0gICAgICAgIGluZm8uaGVpZ2h0ID0gMzg7CisgICAgICAgIGluZm8ud2lkdGggID0gKChpbmZvLnhyZXMgKiAyNS40ZikvMTYwLjBmICsgMC41Zik7CisgICAgICAgIGluZm8uaGVpZ2h0ID0gKChpbmZvLnlyZXMgKiAyNS40ZikvMTYwLjBmICsgMC41Zik7CiAgICAgfQogCiAgICAgZmxvYXQgeGRwaSA9IChpbmZvLnhyZXMgKiAyNS40ZikgLyBpbmZvLndpZHRoOwpkaWZmIC0tZ2l0IGEvbGlicy91aS9FR0xOYXRpdmVXaW5kb3dTdXJmYWNlLmNwcCBiL2xpYnMvdWkvRUdMTmF0aXZlV2luZG93U3VyZmFjZS5jcHAKaW5kZXggMGI2YWZjMC4uZDU1ZmI3MCAxMDA2NDQKLS0tIGEvbGlicy91aS9FR0xOYXRpdmVXaW5kb3dTdXJmYWNlLmNwcAorKysgYi9saWJzL3VpL0VHTE5hdGl2ZVdpbmRvd1N1cmZhY2UuY3BwCkBAIC0xNjMsNyArMTYzLDEyIEBACiAgICAgICAgIGVnbF9uYXRpdmVfd2luZG93X3Q6OmZvcm1hdCA9IGluZm8uZm9ybWF0OwogICAgICAgICBlZ2xfbmF0aXZlX3dpbmRvd190OjpiYXNlICAgPSBpbnRwdHJfdChpbmZvLmJhc2UpOwogICAgICAgICBlZ2xfbmF0aXZlX3dpbmRvd190OjpvZmZzZXQgPSBpbnRwdHJfdChpbmZvLmJpdHMpIC0gaW50cHRyX3QoaW5mby5iYXNlKTsKLSAgICAgICAgZWdsX25hdGl2ZV93aW5kb3dfdDo6bWVtb3J5X3R5cGUgPSBtU3VyZmFjZS0+Z2V0TWVtb3J5VHlwZSgpOworICAgICAgICAvLyBGSVhNRTogZWdsX25hdGl2ZV93aW5kb3dfdDo6bWVtb3J5X3R5cGUgdXNlZCB0byBiZSBzZXQgZnJvbQorICAgICAgICAvLyBtU3VyZmFjZSwgYnV0IHdlIHdhbnRlZCB0byBicmVhayB0aGlzIGRlcGVuZGVuY3kuIFdlIHNldCBpdCB0bworICAgICAgICAvLyBHUFUgYmVjYXVzZSB0aGUgc29mdHdhcmUgcmVuZGVyZWQgZG9lc24ndCBjYXJlLCBidXQgdGhlIGgvdworICAgICAgICAvLyBhY2NlbGVyYXRvciBuZWVkcyBpdC4gRXZlbnR1YWxseSwgdGhpcyB2YWx1ZSBzaG91bGQgZ28gYXdheQorICAgICAgICAvLyBjb21wbGV0ZWx5LCBzaW5jZSBtZW1vcnkgd2lsbCBiZSBtYW5hZ2VkIGJ5IE9wZW5HTC4KKyAgICAgICAgZWdsX25hdGl2ZV93aW5kb3dfdDo6bWVtb3J5X3R5cGUgPSBOQVRJVkVfTUVNT1JZX1RZUEVfR1BVOyAKICAgICAgICAgZWdsX25hdGl2ZV93aW5kb3dfdDo6ZmQgPSAwOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYnMvdWkvRXZlbnRIdWIuY3BwIGIvbGlicy91aS9FdmVudEh1Yi5jcHAKaW5kZXggZjBjNzdiYS4uYWJlNzQwNyAxMDA2NDQKLS0tIGEvbGlicy91aS9FdmVudEh1Yi5jcHAKKysrIGIvbGlicy91aS9FdmVudEh1Yi5jcHAKQEAgLTMxNSw5ICszMTUsOCBAQAogICAgICAgICB9CiAKICAgICAgICAgLy9wcmludGYoInBvbGwgJWQsIHJldHVybmVkICVkXG4iLCBtRkRDb3VudCwgcG9sbHJlcyk7Ci0gICAgICAgIGlmKG1GRHNbMF0ucmV2ZW50cyAmIFBPTExJTikgewotICAgICAgICAgICAgcmVhZF9ub3RpZnkobUZEc1swXS5mZCk7Ci0gICAgICAgIH0KKworICAgICAgICAvLyBtRkRzWzBdIGlzIHVzZWQgZm9yIGlub3RpZnksIHNvIHByb2Nlc3MgcmVndWxhciBldmVudHMgc3RhcnRpbmcgYXQgbUZEc1sxXQogICAgICAgICBmb3IoaSA9IDE7IGkgPCBtRkRDb3VudDsgaSsrKSB7CiAgICAgICAgICAgICBpZihtRkRzW2ldLnJldmVudHMpIHsKICAgICAgICAgICAgICAgICBMT0dWKCJyZXZlbnRzIGZvciAlZCA9IDB4JTA4eCIsIGksIG1GRHNbaV0ucmV2ZW50cyk7CkBAIC0zNTcsNiArMzU2LDEyIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyByZWFkX25vdGlmeSgpIHdpbGwgbW9kaWZ5IG1GRHMgYW5kIG1GRENvdW50LCBzbyB0aGlzIG11c3QgYmUgZG9uZSBhZnRlcgorICAgICAgICAvLyBwcm9jZXNzaW5nIGFsbCBvdGhlciBldmVudHMuCisgICAgICAgIGlmKG1GRHNbMF0ucmV2ZW50cyAmIFBPTExJTikgeworICAgICAgICAgICAgcmVhZF9ub3RpZnkobUZEc1swXS5mZCk7CisgICAgICAgIH0KICAgICB9CiB9CiAKQEAgLTYwNyw3ICs2MTIsNyBAQAogICAgICAgICBzcHJpbnRmKHByb3BOYW1lLCAiaHcua2V5Ym9hcmRzLiV1LmRldm5hbWUiLCBwdWJsaWNJRCk7CiAgICAgICAgIHByb3BlcnR5X3NldChwcm9wTmFtZSwgZGV2bmFtZSk7CiAKLSAgICAgICAgTE9HSSgiTmV3IGtleWJvYXJkOiBwdWJsaWNJRD0lZCBkZXZpY2UtPmlkPSVkIGRldm5hbWU9JyVzIHByb3BOYW1lPSclcycga2V5bGF5b3V0PSclcydcbiIsCisgICAgICAgIExPR0koIk5ldyBrZXlib2FyZDogcHVibGljSUQ9JWQgZGV2aWNlLT5pZD0lZCBkZXZuYW1lPSclcycgcHJvcE5hbWU9JyVzJyBrZXlsYXlvdXQ9JyVzJ1xuIiwKICAgICAgICAgICAgICAgICBwdWJsaWNJRCwgZGV2aWNlLT5pZCwgZGV2bmFtZSwgcHJvcE5hbWUsIGtleWxheW91dEZpbGVuYW1lKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2xpYnMvdWkvSUNhbWVyYS5jcHAgYi9saWJzL3VpL0lDYW1lcmEuY3BwCmluZGV4IDQyMGJiNDkuLjZhMmRjNmIgMTAwNjQ0Ci0tLSBhL2xpYnMvdWkvSUNhbWVyYS5jcHAKKysrIGIvbGlicy91aS9JQ2FtZXJhLmNwcApAQCAtMiw0MSArMiw0MCBAQAogKioKICoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAqKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIklDYW1lcmEiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KICNpbmNsdWRlIDx1dGlscy9QYXJjZWwuaD4KLQogI2luY2x1ZGUgPHVpL0lDYW1lcmEuaD4KIAotI2RlZmluZSBMT0dfVEFHICJAQEBAQEBAQEBAQCBDQU1FUkEgQEBAQEBAQEBAQEAiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogZW51bSB7CiAgICAgRElTQ09OTkVDVCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCiAgICAgU0VUX1BSRVZJRVdfRElTUExBWSwKLSAgICBTRVRfSEFTX0ZSQU1FX0NBTExCQUNLLAorICAgIFNFVF9GUkFNRV9DQUxMQkFDS19GTEFHLAogICAgIFNUQVJUX1BSRVZJRVcsCiAgICAgU1RPUF9QUkVWSUVXLAogICAgIEFVVE9fRk9DVVMsCiAgICAgVEFLRV9QSUNUVVJFLAogICAgIFNFVF9QQVJBTUVURVJTLAotICAgIEdFVF9QQVJBTUVURVJTCisgICAgR0VUX1BBUkFNRVRFUlMsCisgICAgQ09OTkVDVAogfTsKIAogY2xhc3MgQnBDYW1lcmE6IHB1YmxpYyBCcEludGVyZmFjZTxJQ2FtZXJhPgpAQCAtNTAsNiArNDksNyBAQAogICAgIC8vIGRpc2Nvbm5lY3QgZnJvbSBjYW1lcmEgc2VydmljZQogICAgIHZvaWQgZGlzY29ubmVjdCgpCiAgICAgeworICAgICAgICBMT0dWKCJkaXNjb25uZWN0Iik7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmE6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChESVNDT05ORUNULCBkYXRhLCAmcmVwbHkpOwpAQCAtNTgsMjUgKzU4LDI5IEBACiAgICAgLy8gcGFzcyB0aGUgYnVmZmVyZWQgSVN1cmZhY2UgdG8gdGhlIGNhbWVyYSBzZXJ2aWNlCiAgICAgc3RhdHVzX3Qgc2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKQogICAgIHsKKyAgICAgICAgTE9HVigic2V0UHJldmlld0Rpc3BsYXkiKTsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihzdXJmYWNlLT5hc0JpbmRlcigpKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9QUkVWSUVXX0RJU1BMQVksIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9Ci0gICAgCi0gICAgLy8gdGVsbCB0aGUgc2VydmljZSB3aGV0aGVyIHRvIGNhbGxiYWNrIHdpdGggZWFjaCBwcmV2aWV3IGZyYW1lCi0gICAgdm9pZCBzZXRIYXNGcmFtZUNhbGxiYWNrKGJvb2wgaW5zdGFsbGVkKQorCisgICAgLy8gc2V0IHRoZSBmcmFtZSBjYWxsYmFjayBmbGFnIHRvIGFmZmVjdCBob3cgdGhlIHJlY2VpdmVkIGZyYW1lcyBmcm9tCisgICAgLy8gcHJldmlldyBhcmUgaGFuZGxlZC4KKyAgICB2b2lkIHNldEZyYW1lQ2FsbGJhY2tGbGFnKGludCBmcmFtZV9jYWxsYmFja19mbGFnKQogICAgIHsKKyAgICAgICAgTE9HVigic2V0RnJhbWVDYWxsYmFja0ZsYWcoJWQpIiwgZnJhbWVfY2FsbGJhY2tfZmxhZyk7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmE6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClpbnN0YWxsZWQpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0hBU19GUkFNRV9DQUxMQkFDSywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGZyYW1lX2NhbGxiYWNrX2ZsYWcpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0ZSQU1FX0NBTExCQUNLX0ZMQUcsIGRhdGEsICZyZXBseSk7CiAgICAgfQogCiAgICAgLy8gc3RhcnQgcHJldmlldyBtb2RlLCBtdXN0IGNhbGwgc2V0UHJldmlld0Rpc3BsYXkgZmlyc3QKICAgICBzdGF0dXNfdCBzdGFydFByZXZpZXcoKQogICAgIHsKKyAgICAgICAgTE9HVigic3RhcnRQcmV2aWV3Iik7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmE6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTVEFSVF9QUkVWSUVXLCBkYXRhLCAmcmVwbHkpOwpAQCAtODYsNiArOTAsNyBAQAogICAgIC8vIHN0b3AgcHJldmlldyBtb2RlCiAgICAgdm9pZCBzdG9wUHJldmlldygpCiAgICAgeworICAgICAgICBMT0dWKCJzdG9wUHJldmlldyIpOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU1RPUF9QUkVWSUVXLCBkYXRhLCAmcmVwbHkpOwpAQCAtOTQsNiArOTksNyBAQAogICAgIC8vIGF1dG8gZm9jdXMKICAgICBzdGF0dXNfdCBhdXRvRm9jdXMoKQogICAgIHsKKyAgICAgICAgTE9HVigiYXV0b0ZvY3VzIik7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmE6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChBVVRPX0ZPQ1VTLCBkYXRhLCAmcmVwbHkpOwpAQCAtMTA0LDYgKzExMCw3IEBACiAgICAgLy8gdGFrZSBhIHBpY3R1cmUgLSByZXR1cm5zIGFuIElNZW1vcnkgKHJlZi1jb3VudGVkIG1tYXApCiAgICAgc3RhdHVzX3QgdGFrZVBpY3R1cmUoKQogICAgIHsKKyAgICAgICAgTE9HVigidGFrZVBpY3R1cmUiKTsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFRBS0VfUElDVFVSRSwgZGF0YSwgJnJlcGx5KTsKQEAgLTExNCw2ICsxMjEsNyBAQAogICAgIC8vIHNldCBwcmV2aWV3L2NhcHR1cmUgcGFyYW1ldGVycyAtIGtleS92YWx1ZSBwYWlycwogICAgIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYgcGFyYW1zKQogICAgIHsKKyAgICAgICAgTE9HVigic2V0UGFyYW1ldGVycyIpOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlU3RyaW5nOChwYXJhbXMpOwpAQCAtMTI0LDExICsxMzIsMjAgQEAKICAgICAvLyBnZXQgcHJldmlldy9jYXB0dXJlIHBhcmFtZXRlcnMgLSBrZXkvdmFsdWUgcGFpcnMKICAgICBTdHJpbmc4IGdldFBhcmFtZXRlcnMoKSBjb25zdAogICAgIHsKKyAgICAgICAgTE9HVigiZ2V0UGFyYW1ldGVycyIpOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1BBUkFNRVRFUlMsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkU3RyaW5nOCgpOwogICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNvbm5lY3QoY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmE6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoY2FtZXJhQ2xpZW50LT5hc0JpbmRlcigpKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENPTk5FQ1QsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CiB9OwogCiBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoQ2FtZXJhLCAiYW5kcm9pZC5oYXJkd2FyZS5JQ2FtZXJhIik7CkBAIC0xNDYsNTMgKzE2Myw2OCBAQAogewogICAgIHN3aXRjaChjb2RlKSB7CiAgICAgICAgIGNhc2UgRElTQ09OTkVDVDogeworICAgICAgICAgICAgTE9HVigiRElTQ09OTkVDVCIpOwogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDYW1lcmEsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGRpc2Nvbm5lY3QoKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTRVRfUFJFVklFV19ESVNQTEFZOiB7CisgICAgICAgICAgICBMT0dWKCJTRVRfUFJFVklFV19ESVNQTEFZIik7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgc3A8SVN1cmZhY2U+IHN1cmZhY2UgPSBpbnRlcmZhY2VfY2FzdDxJU3VyZmFjZT4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0UHJldmlld0Rpc3BsYXkoc3VyZmFjZSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFNFVF9IQVNfRlJBTUVfQ0FMTEJBQ0s6IHsKKyAgICAgICAgY2FzZSBTRVRfRlJBTUVfQ0FMTEJBQ0tfRkxBRzogeworICAgICAgICAgICAgTE9HVigiU0VUX0ZSQU1FX0NBTExCQUNLX1RZUEUiKTsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBib29sIGluc3RhbGxlZCA9IChib29sKWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBzZXRIYXNGcmFtZUNhbGxiYWNrKGluc3RhbGxlZCk7CisgICAgICAgICAgICBpbnQgZnJhbWVfY2FsbGJhY2tfZmxhZyA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBzZXRGcmFtZUNhbGxiYWNrRmxhZyhmcmFtZV9jYWxsYmFja19mbGFnKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTVEFSVF9QUkVWSUVXOiB7CisgICAgICAgICAgICBMT0dWKCJTVEFSVF9QUkVWSUVXIik7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhcnRQcmV2aWV3KCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFNUT1BfUFJFVklFVzogeworICAgICAgICAgICAgTE9HVigiU1RPUF9QUkVWSUVXIik7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgc3RvcFByZXZpZXcoKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBBVVRPX0ZPQ1VTOiB7CisgICAgICAgICAgICBMT0dWKCJBVVRPX0ZPQ1VTIik7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoYXV0b0ZvY3VzKCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFRBS0VfUElDVFVSRTogeworICAgICAgICAgICAgTE9HVigiVEFLRV9QSUNUVVJFIik7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIodGFrZVBpY3R1cmUoKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgU0VUX1BBUkFNRVRFUlM6IHsKKyAgICAgICAgICAgIExPR1YoIlNFVF9QQVJBTUVURVJTIik7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgIFN0cmluZzggcGFyYW1zKGRhdGEucmVhZFN0cmluZzgoKSk7Ci0gICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0UGFyYW1ldGVycyhwYXJhbXMpKTsKKyAgICAgICAgICAgIFN0cmluZzggcGFyYW1zKGRhdGEucmVhZFN0cmluZzgoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRQYXJhbWV0ZXJzKHBhcmFtcykpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBHRVRfUEFSQU1FVEVSUzogeworICAgICAgICAgICAgTE9HVigiR0VUX1BBUkFNRVRFUlMiKTsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3RyaW5nOChnZXRQYXJhbWV0ZXJzKCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBDT05ORUNUOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3A8SUNhbWVyYUNsaWVudD4gY2FtZXJhQ2xpZW50ID0gaW50ZXJmYWNlX2Nhc3Q8SUNhbWVyYUNsaWVudD4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoY29ubmVjdChjYW1lcmFDbGllbnQpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGlicy91aS9JQ2FtZXJhQ2xpZW50LmNwcCBiL2xpYnMvdWkvSUNhbWVyYUNsaWVudC5jcHAKaW5kZXggMzczNzAzNC4uYzVkNmQ1MiAxMDA2NDQKLS0tIGEvbGlicy91aS9JQ2FtZXJhQ2xpZW50LmNwcAorKysgYi9saWJzL3VpL0lDYW1lcmFDbGllbnQuY3BwCkBAIC0xNSw5ICsxNSwxMSBAQAogKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIklDYW1lcmFDbGllbnQiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KICNpbmNsdWRlIDx1aS9JQ2FtZXJhQ2xpZW50Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTQyLDYgKzQ0LDcgQEAKICAgICAvLyBjYWxsYmFjayB0byBsZXQgdGhlIGFwcCBrbm93IHRoZSBzaHV0dGVyIGhhcyBjbG9zZWQsIGlkZWFsIGZvciBwbGF5aW5nIHRoZSBzaHV0dGVyIHNvdW5kCiAgICAgdm9pZCBzaHV0dGVyQ2FsbGJhY2soKQogICAgIHsKKyAgICAgICAgTE9HVigic2h1dHRlckNhbGxiYWNrIik7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmFDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTSFVUVEVSX0NBTExCQUNLLCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKQEAgLTUwLDYgKzUzLDcgQEAKICAgICAvLyBjYWxsYmFjayBmcm9tIGNhbWVyYSBzZXJ2aWNlIHRvIGFwcCB3aXRoIHBpY3R1cmUgZGF0YQogICAgIHZvaWQgcmF3Q2FsbGJhY2soY29uc3Qgc3A8SU1lbW9yeT4mIHBpY3R1cmUpCiAgICAgeworICAgICAgICBMT0dWKCJyYXdDYWxsYmFjayIpOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKHBpY3R1cmUtPmFzQmluZGVyKCkpOwpAQCAtNTksNiArNjMsNyBAQAogICAgIC8vIGNhbGxiYWNrIGZyb20gY2FtZXJhIHNlcnZpY2UgdG8gYXBwIHdpdGggcGljdHVyZSBkYXRhCiAgICAgdm9pZCBqcGVnQ2FsbGJhY2soY29uc3Qgc3A8SU1lbW9yeT4mIHBpY3R1cmUpCiAgICAgeworICAgICAgICBMT0dWKCJqcGVnQ2FsbGJhY2siKTsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYUNsaWVudDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihwaWN0dXJlLT5hc0JpbmRlcigpKTsKQEAgLTY4LDYgKzczLDcgQEAKICAgICAvLyBjYWxsYmFjayBmcm9tIGNhbWVyYSBzZXJ2aWNlIHRvIGFwcCB3aXRoIHZpZGVvIGZyYW1lIGRhdGEKICAgICB2b2lkIGZyYW1lQ2FsbGJhY2soY29uc3Qgc3A8SU1lbW9yeT4mIGZyYW1lKQogICAgIHsKKyAgICAgICAgTE9HVigiZnJhbWVDYWxsYmFjayIpOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGZyYW1lLT5hc0JpbmRlcigpKTsKQEAgLTc3LDYgKzgzLDcgQEAKICAgICAvLyBjYWxsYmFjayBmcm9tIGNhbWVyYSBzZXJ2aWNlIHRvIGFwcCB0byByZXBvcnQgZXJyb3IKICAgICB2b2lkIGVycm9yQ2FsbGJhY2soc3RhdHVzX3QgZXJyb3IpCiAgICAgeworICAgICAgICBMT0dWKCJlcnJvckNhbGxiYWNrIik7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmFDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihlcnJvcik7CkBAIC04Niw2ICs5Myw3IEBACiAgICAgLy8gY2FsbGJhY2sgZnJvbSBjYW1lcmEgc2VydmljZSB0byBhcHAgdG8gcmVwb3J0IGF1dG9mb2N1cyBjb21wbGV0aW9uCiAgICAgdm9pZCBhdXRvRm9jdXNDYWxsYmFjayhib29sIGZvY3VzZWQpCiAgICAgeworICAgICAgICBMT0dWKCJhdXRvRm9jdXNDYWxsYmFjayIpOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoZm9jdXNlZCk7CkBAIC0xMDgsMzUgKzExNiw0MSBAQAogewogICAgIHN3aXRjaChjb2RlKSB7CiAgICAgICAgIGNhc2UgU0hVVFRFUl9DQUxMQkFDSzogeworICAgICAgICAgICAgTE9HVigiU0hVVFRFUl9DQUxMQkFDSyIpOwogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDYW1lcmFDbGllbnQsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHNodXR0ZXJDYWxsYmFjaygpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFJBV19DQUxMQkFDSzogeworICAgICAgICAgICAgTE9HVigiUkFXX0NBTExCQUNLIik7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYUNsaWVudCwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgc3A8SU1lbW9yeT4gcGljdHVyZSA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICAgICAgICAgIHJhd0NhbGxiYWNrKHBpY3R1cmUpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIEpQRUdfQ0FMTEJBQ0s6IHsKKyAgICAgICAgICAgIExPR1YoIkpQRUdfQ0FMTEJBQ0siKTsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhQ2xpZW50LCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBzcDxJTWVtb3J5PiBwaWN0dXJlID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOwogICAgICAgICAgICAganBlZ0NhbGxiYWNrKHBpY3R1cmUpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIEZSQU1FX0NBTExCQUNLOiB7CisgICAgICAgICAgICBMT0dWKCJGUkFNRV9DQUxMQkFDSyIpOwogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDYW1lcmFDbGllbnQsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHNwPElNZW1vcnk+IGZyYW1lID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOwogICAgICAgICAgICAgZnJhbWVDYWxsYmFjayhmcmFtZSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgRVJST1JfQ0FMTEJBQ0s6IHsKKyAgICAgICAgICAgIExPR1YoIkVSUk9SX0NBTExCQUNLIik7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYUNsaWVudCwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyb3IgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgZXJyb3JDYWxsYmFjayhlcnJvcik7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgQVVUT0ZPQ1VTX0NBTExCQUNLOiB7CisgICAgICAgICAgICBMT0dWKCJBVVRPRk9DVVNfQ0FMTEJBQ0siKTsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhQ2xpZW50LCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBib29sIGZvY3VzZWQgPSAoYm9vbClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXV0b0ZvY3VzQ2FsbGJhY2soZm9jdXNlZCk7CmRpZmYgLS1naXQgYS9saWJzL3VpL0lPdmVybGF5LmNwcCBiL2xpYnMvdWkvSU92ZXJsYXkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZDFlYTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3VpL0lPdmVybGF5LmNwcApAQCAtMCwwICsxLDg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDx1dGlscy9QYXJjZWwuaD4KKyNpbmNsdWRlIDx1dGlscy9JSW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlIDx1aS9JT3ZlcmxheS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2VudW0geworICAgIERFU1RST1kgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLCAvLyBvbmUtd2F5IHRyYW5zYWN0aW9uCisgICAgU1dBUF9CVUZGRVJTLAorfTsKKworY2xhc3MgQnBPdmVybGF5IDogcHVibGljIEJwSW50ZXJmYWNlPElPdmVybGF5PgoreworcHVibGljOgorICAgIEJwT3ZlcmxheShjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKKyAgICAgICAgOiBCcEludGVyZmFjZTxJT3ZlcmxheT4oaW1wbCkKKyAgICB7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGRlc3Ryb3koKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU92ZXJsYXk6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChERVNUUk9ZLCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHNzaXplX3Qgc3dhcEJ1ZmZlcnMoKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU92ZXJsYXk6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTV0FQX0JVRkZFUlMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9Cit9OworCitJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoT3ZlcmxheSwgImFuZHJvaWQudWkuSU92ZXJsYXkiKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIENIRUNLX0lOVEVSRkFDRShpbnRlcmZhY2UsIGRhdGEsIHJlcGx5KSBcCisgICAgICAgIGRvIHsgaWYgKCFkYXRhLmVuZm9yY2VJbnRlcmZhY2UoaW50ZXJmYWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpKSB7IFwKKyAgICAgICAgICAgIExPR1coIkNhbGwgaW5jb3JyZWN0bHkgcm91dGVkIHRvICIgI2ludGVyZmFjZSk7IFwKKyAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsgXAorICAgICAgICB9IH0gd2hpbGUgKDApCisKK3N0YXR1c190IEJuT3ZlcmxheTo6b25UcmFuc2FjdCgKKyAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQoreworICAgIHN3aXRjaChjb2RlKSB7CisgICAgICAgIGNhc2UgREVTVFJPWTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElPdmVybGF5LCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBkZXN0cm95KCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgU1dBUF9CVUZGRVJTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU92ZXJsYXksIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHNzaXplX3Qgb2Zmc2V0ID0gc3dhcEJ1ZmZlcnMoKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG9mZnNldCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworICAgIH0KK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvdWkvSVN1cmZhY2UuY3BwIGIvbGlicy91aS9JU3VyZmFjZS5jcHAKaW5kZXggODE3ZjRkOS4uYzFjOTU5NiAxMDA2NDQKLS0tIGEvbGlicy91aS9JU3VyZmFjZS5jcHAKKysrIGIvbGlicy91aS9JU3VyZmFjZS5jcHAKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDx1dGlscy9JTWVtb3J5Lmg+CiAKICNpbmNsdWRlIDx1aS9JU3VyZmFjZS5oPgorI2luY2x1ZGUgPHVpL092ZXJsYXkuaD4KIAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0zMCw2ICszMSw3IEBACiAgICAgUkVHSVNURVJfQlVGRkVSUyA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCiAgICAgVU5SRUdJU1RFUl9CVUZGRVJTLAogICAgIFBPU1RfQlVGRkVSLCAvLyBvbmUtd2F5IHRyYW5zYWN0aW9uCisgICAgQ1JFQVRFX09WRVJMQVksCiB9OwogCiBjbGFzcyBCcFN1cmZhY2UgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SVN1cmZhY2U+CkBAIC03MCw2ICs3MiwxOCBAQAogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVN1cmZhY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChVTlJFR0lTVEVSX0JVRkZFUlMsIGRhdGEsICZyZXBseSk7CiAgICAgfQorCisgICAgdmlydHVhbCBzcDxPdmVybGF5PiBjcmVhdGVPdmVybGF5KAorICAgICAgICAgICAgIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIGludDMyX3QgZm9ybWF0KQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVN1cmZhY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMih3KTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGgpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoZm9ybWF0KTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENSRUFURV9PVkVSTEFZLCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gT3ZlcmxheTo6cmVhZEZyb21QYXJjZWwocmVwbHkpOworICAgIH0KIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShTdXJmYWNlLCAiYW5kcm9pZC51aS5JU3VyZmFjZSIpOwpAQCAtMTA5LDYgKzEyMywxNCBAQAogICAgICAgICAgICAgcG9zdEJ1ZmZlcihvZmZzZXQpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIENSRUFURV9PVkVSTEFZOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVN1cmZhY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGludCB3ID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGludCBoID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGludCBmID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHNwPE92ZXJsYXk+IG8gPSBjcmVhdGVPdmVybGF5KHcsIGgsIHcpOworICAgICAgICAgICAgcmV0dXJuIE92ZXJsYXk6OndyaXRlVG9QYXJjZWwocmVwbHksIG8pOworICAgICAgICB9IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9saWJzL3VpL0lTdXJmYWNlRmxpbmdlckNsaWVudC5jcHAgYi9saWJzL3VpL0lTdXJmYWNlRmxpbmdlckNsaWVudC5jcHAKaW5kZXggOTQ0NGFmNy4uZGQ2YTc5OCAxMDA2NDQKLS0tIGEvbGlicy91aS9JU3VyZmFjZUZsaW5nZXJDbGllbnQuY3BwCisrKyBiL2xpYnMvdWkvSVN1cmZhY2VGbGluZ2VyQ2xpZW50LmNwcApAQCAtODIsNyArODIsNyBAQAogICAgICAgICBkYXRhLndyaXRlSW50MzIoZm9ybWF0KTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGZsYWdzKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENSRUFURV9TVVJGQUNFLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBwYXJhbXMtPnJlYWRGcm9tUGFyY2VsKGRhdGEpOworICAgICAgICBwYXJhbXMtPnJlYWRGcm9tUGFyY2VsKHJlcGx5KTsKICAgICAgICAgcmV0dXJuIGludGVyZmFjZV9jYXN0PElTdXJmYWNlPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwogICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApAQCAtMTkxLDcgKzE5MSw2IEBACiB7CiAgICAgdG9rZW4gPSBwYXJjZWwucmVhZEludDMyKCk7CiAgICAgaWRlbnRpdHkgID0gcGFyY2VsLnJlYWRJbnQzMigpOwotICAgIHR5cGUgPSBwYXJjZWwucmVhZEludDMyKCk7CiAgICAgaGVhcFswXSA9IGludGVyZmFjZV9jYXN0PElNZW1vcnlIZWFwPihwYXJjZWwucmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICBoZWFwWzFdID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeUhlYXA+KHBhcmNlbC5yZWFkU3Ryb25nQmluZGVyKCkpOwogICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTIwMSw3ICsyMDAsNiBAQAogewogICAgIHBhcmNlbC0+d3JpdGVJbnQzMih0b2tlbik7CiAgICAgcGFyY2VsLT53cml0ZUludDMyKGlkZW50aXR5KTsKLSAgICBwYXJjZWwtPndyaXRlSW50MzIodHlwZSk7CiAgICAgcGFyY2VsLT53cml0ZVN0cm9uZ0JpbmRlcihoZWFwWzBdIT0wID8gaGVhcFswXS0+YXNCaW5kZXIoKSA6IE5VTEwpOwogICAgIHBhcmNlbC0+d3JpdGVTdHJvbmdCaW5kZXIoaGVhcFsxXSE9MCA/IGhlYXBbMV0tPmFzQmluZGVyKCkgOiBOVUxMKTsKICAgICByZXR1cm4gTk9fRVJST1I7CmRpZmYgLS1naXQgYS9saWJzL3VpL092ZXJsYXkuY3BwIGIvbGlicy91aS9PdmVybGF5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjY3YzNlCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy91aS9PdmVybGF5LmNwcApAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx1dGlscy9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8dXRpbHMvUGFyY2VsLmg+CisKKyNpbmNsdWRlIDx1aS9JT3ZlcmxheS5oPgorI2luY2x1ZGUgPHVpL092ZXJsYXkuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitPdmVybGF5OjpPdmVybGF5KG92ZXJsYXlfaGFuZGxlX3QqIGhhbmRsZSwgCisgICAgICAgIGNvbnN0IHNwPElPdmVybGF5PiYgbywgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLCAKKyAgICAgICAgdWludDMyX3QgdywgdWludDMyX3QgaCwgaW50MzJfdCBmLCB1aW50MzJfdCB3cywgdWludDMyX3QgaHMpCisgICAgOiBtT3ZlcmxheShvKSwgbUhlYXAoaGVhcCksIG1DdXJyZW50QnVmZmVyT2Zmc2V0KDApLCBtT3ZlcmxheUhhbmRsZShoYW5kbGUpLAorICAgICAgbVdpZHRoKHcpLCBtSGVpZ2h0KGgpLCBtRm9ybWF0KGYpLCBtV2lkdGhTdHJpZGUod3MpLCBtSGVpZ2h0U3RyaWRlKGhzKQoreworfQorCitPdmVybGF5OjpPdmVybGF5KG92ZXJsYXlfdCogb3ZlcmxheSwgCisgICAgICAgIGNvbnN0IHNwPElPdmVybGF5PiYgbywgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwKQorICAgIDogbU92ZXJsYXkobyksIG1IZWFwKGhlYXApIAoreworICAgIG1DdXJyZW50QnVmZmVyT2Zmc2V0ID0gMDsgCisgICAgbU92ZXJsYXlIYW5kbGUgPSBvdmVybGF5LT5nZXRIYW5kbGVSZWYob3ZlcmxheSk7CisgICAgbVdpZHRoID0gb3ZlcmxheS0+dzsKKyAgICBtSGVpZ2h0ID0gb3ZlcmxheS0+aDsKKyAgICBtRm9ybWF0ID0gb3ZlcmxheS0+Zm9ybWF0OyAKKyAgICBtV2lkdGhTdHJpZGUgPSBvdmVybGF5LT53X3N0cmlkZTsKKyAgICBtSGVpZ2h0U3RyaWRlID0gb3ZlcmxheS0+aF9zdHJpZGU7Cit9CisKKworT3ZlcmxheTo6fk92ZXJsYXkoKSB7Cit9CisKK3ZvaWQgT3ZlcmxheTo6ZGVzdHJveSgpIHsgIAorICAgIG1PdmVybGF5LT5kZXN0cm95KCk7Cit9CisKK3N0YXR1c190IE92ZXJsYXk6OnN3YXBCdWZmZXJzKCkgeworICAgIHNzaXplX3QgcmVzdWx0ID0gbU92ZXJsYXktPnN3YXBCdWZmZXJzKCk7CisgICAgaWYgKHJlc3VsdCA8IDApCisgICAgICAgIHJldHVybiBzdGF0dXNfdChyZXN1bHQpOworICAgIG1DdXJyZW50QnVmZmVyT2Zmc2V0ID0gcmVzdWx0OworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworb3ZlcmxheV9oYW5kbGVfdCBjb25zdCogT3ZlcmxheTo6Z2V0SGFuZGxlUmVmKCkgY29uc3QgeworICAgIHJldHVybiBtT3ZlcmxheUhhbmRsZTsKK30KKworc2l6ZV90IE92ZXJsYXk6OmdldEJ1ZmZlck9mZnNldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUN1cnJlbnRCdWZmZXJPZmZzZXQ7Cit9CisKK3NwPElNZW1vcnlIZWFwPiBPdmVybGF5OjpnZXRIZWFwKCkgY29uc3QgeworICAgIHJldHVybiBtSGVhcDsKK30KKwordWludDMyX3QgT3ZlcmxheTo6Z2V0V2lkdGgoKSBjb25zdCB7CisgICAgcmV0dXJuIG1XaWR0aDsKK30KKwordWludDMyX3QgT3ZlcmxheTo6Z2V0SGVpZ2h0KCkgY29uc3QgeworICAgIHJldHVybiBtSGVpZ2h0OworfQorCitpbnQzMl90IE92ZXJsYXk6OmdldEZvcm1hdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUZvcm1hdDsKK30KKworaW50MzJfdCBPdmVybGF5OjpnZXRXaWR0aFN0cmlkZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVdpZHRoU3RyaWRlOworfQorCitpbnQzMl90IE92ZXJsYXk6OmdldEhlaWdodFN0cmlkZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUhlaWdodFN0cmlkZTsKK30KKworc3A8T3ZlcmxheT4gT3ZlcmxheTo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsJiBkYXRhKSB7CisgICAgc3A8T3ZlcmxheT4gcmVzdWx0OworICAgIHNwPElPdmVybGF5PiBvdmVybGF5ID0gSU92ZXJsYXk6OmFzSW50ZXJmYWNlKGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICBpZiAob3ZlcmxheSAhPSBOVUxMKSB7CisgICAgICAgIHNwPElNZW1vcnlIZWFwPiBoZWFwID0gSU1lbW9yeUhlYXA6OmFzSW50ZXJmYWNlKGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgdWludDMyX3QgdyA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIHVpbnQzMl90IGggPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICB1aW50MzJfdCBmID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgdWludDMyX3Qgd3MgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICB1aW50MzJfdCBocyA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIC8qIEZJWE1FOiBoYW5kbGVzIHNob3VsZCBiZSBwcm9tb3RlZCB0byAicmVhbCIgQVBJIGFuZCBiZSBoYW5kbGVkIGJ5IAorICAgICAgICAgKiB0aGUgZnJhbWV3b3JrICovCisgICAgICAgIGludCBudW1mZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGludCBudW1pbnQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBvdmVybGF5X2hhbmRsZV90KiBoYW5kbGUgPSAob3ZlcmxheV9oYW5kbGVfdCopbWFsbG9jKAorICAgICAgICAgICAgICAgIHNpemVvZihvdmVybGF5X2hhbmRsZV90KSArIG51bWludCpzaXplb2YoaW50KSk7CisgICAgICAgIGZvciAoaW50IGk9MCA7IGk8bnVtZmQgOyBpKyspCisgICAgICAgICAgICBoYW5kbGUtPmZkc1tpXSA9IGRhdGEucmVhZEZpbGVEZXNjcmlwdG9yKCk7CisgICAgICAgIGZvciAoaW50IGk9MCA7IGk8bnVtaW50IDsgaSsrKQorICAgICAgICAgICAgaGFuZGxlLT5kYXRhW2ldID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmVzdWx0ID0gbmV3IE92ZXJsYXkoaGFuZGxlLCBvdmVybGF5LCBoZWFwLCB3LCBoLCBmLCB3cywgaHMpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0dXNfdCBPdmVybGF5Ojp3cml0ZVRvUGFyY2VsKFBhcmNlbCogcmVwbHksIGNvbnN0IHNwPE92ZXJsYXk+JiBvKSB7CisgICAgaWYgKG8gIT0gTlVMTCkgeworICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoby0+bU92ZXJsYXktPmFzQmluZGVyKCkpOworICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoby0+bUhlYXAtPmFzQmluZGVyKCkpOworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihvLT5tV2lkdGgpOworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihvLT5tSGVpZ2h0KTsKKyAgICAgICAgcmVwbHktPndyaXRlSW50MzIoby0+bUZvcm1hdCk7CisgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG8tPm1XaWR0aFN0cmlkZSk7CisgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG8tPm1IZWlnaHRTdHJpZGUpOworICAgICAgICAvKiBGSVhNRTogaGFuZGxlcyBzaG91bGQgYmUgcHJvbW90ZWQgdG8gInJlYWwiIEFQSSBhbmQgYmUgaGFuZGxlZCBieSAKKyAgICAgICAgICogdGhlIGZyYW1ld29yayAqLworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihvLT5tT3ZlcmxheUhhbmRsZS0+bnVtRmRzKTsKKyAgICAgICAgcmVwbHktPndyaXRlSW50MzIoby0+bU92ZXJsYXlIYW5kbGUtPm51bUludHMpOworICAgICAgICBmb3IgKGludCBpPTAgOyBpPG8tPm1PdmVybGF5SGFuZGxlLT5udW1GZHMgOyBpKyspCisgICAgICAgICAgICByZXBseS0+d3JpdGVGaWxlRGVzY3JpcHRvcihvLT5tT3ZlcmxheUhhbmRsZS0+ZmRzW2ldKTsKKyAgICAgICAgZm9yIChpbnQgaT0wIDsgaTxvLT5tT3ZlcmxheUhhbmRsZS0+bnVtSW50cyA7IGkrKykKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG8tPm1PdmVybGF5SGFuZGxlLT5kYXRhW2ldKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoTlVMTCk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9saWJzL3VpL1N1cmZhY2UuY3BwIGIvbGlicy91aS9TdXJmYWNlLmNwcAppbmRleCAwYTlhYWFkLi40ZWE5YWUyIDEwMDY0NAotLS0gYS9saWJzL3VpL1N1cmZhY2UuY3BwCisrKyBiL2xpYnMvdWkvU3VyZmFjZS5jcHAKQEAgLTQ3LDcgKzQ3LDcgQEAKICAgICAgICAgY29uc3QgSVN1cmZhY2VGbGluZ2VyQ2xpZW50OjpzdXJmYWNlX2RhdGFfdCYgZGF0YSwKICAgICAgICAgdWludDMyX3QgdywgdWludDMyX3QgaCwgUGl4ZWxGb3JtYXQgZm9ybWF0LCB1aW50MzJfdCBmbGFncywKICAgICAgICAgYm9vbCBvd25lcikKLSAgICA6IG1DbGllbnQoY2xpZW50KSwgbVN1cmZhY2Uoc3VyZmFjZSksIG1NZW1vcnlUeXBlKGRhdGEudHlwZSksCisgICAgOiBtQ2xpZW50KGNsaWVudCksIG1TdXJmYWNlKHN1cmZhY2UpLAogICAgICAgbVRva2VuKGRhdGEudG9rZW4pLCBtSWRlbnRpdHkoZGF0YS5pZGVudGl0eSksCiAgICAgICBtRm9ybWF0KGZvcm1hdCksIG1GbGFncyhmbGFncyksIG1Pd25lcihvd25lcikKIHsKQEAgLTY3LDcgKzY3LDYgQEAKICAgICBtU3VyZmFjZSA9IHJocy0+bVN1cmZhY2U7CiAgICAgbUhlYXBbMF0gPSByaHMtPm1IZWFwWzBdOwogICAgIG1IZWFwWzFdID0gcmhzLT5tSGVhcFsxXTsKLSAgICBtTWVtb3J5VHlwZSA9IHJocy0+bU1lbW9yeVR5cGU7CiAgICAgbUZvcm1hdCAgPSByaHMtPm1Gb3JtYXQ7CiAgICAgbUZsYWdzICAgPSByaHMtPm1GbGFnczsKICAgICBtU3VyZmFjZUhlYXBCYXNlWzBdID0gcmhzLT5tU3VyZmFjZUhlYXBCYXNlWzBdOwpAQCAtMTg2LDcgKzE4NSw2IEBACiAgICAgc3A8SVN1cmZhY2U+IHN1cmZhY2UgICAgPSBpbnRlcmZhY2VfY2FzdDxJU3VyZmFjZT4ocGFyY2VsLT5yZWFkU3Ryb25nQmluZGVyKCkpOwogICAgIGRhdGEuaGVhcFswXSAgICAgICAgICAgID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeUhlYXA+KHBhcmNlbC0+cmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICBkYXRhLmhlYXBbMV0gICAgICAgICAgICA9IGludGVyZmFjZV9jYXN0PElNZW1vcnlIZWFwPihwYXJjZWwtPnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgZGF0YS50eXBlICAgICAgICAgICAgICAgPSBwYXJjZWwtPnJlYWRJbnQzMigpOwogICAgIGRhdGEudG9rZW4gICAgICAgICAgICAgID0gcGFyY2VsLT5yZWFkSW50MzIoKTsKICAgICBkYXRhLmlkZW50aXR5ICAgICAgICAgICA9IHBhcmNlbC0+cmVhZEludDMyKCk7CiAgICAgUGl4ZWxGb3JtYXQgZm9ybWF0ICAgICAgPSBwYXJjZWwtPnJlYWRJbnQzMigpOwpAQCAtMjA3LDcgKzIwNSw2IEBACiAgICAgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiBjbGllbnQ7CiAgICAgc3A8SVN1cmZhY2U+IHN1cjsKICAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcFsyXTsKLSAgICBpbnQgdHlwZSA9IDA7CiAgICAgaWYgKHN1cmZhY2UtPmlzVmFsaWQoKSkgewogICAgICAgICB0b2tlbiA9IHN1cmZhY2UtPm1Ub2tlbjsKICAgICAgICAgaWRlbnRpdHkgPSBzdXJmYWNlLT5tSWRlbnRpdHk7CkBAIC0yMTUsNyArMjEyLDYgQEAKICAgICAgICAgc3VyID0gc3VyZmFjZS0+bVN1cmZhY2U7CiAgICAgICAgIGhlYXBbMF0gPSBzdXJmYWNlLT5tSGVhcFswXTsKICAgICAgICAgaGVhcFsxXSA9IHN1cmZhY2UtPm1IZWFwWzFdOwotICAgICAgICB0eXBlID0gc3VyZmFjZS0+bU1lbW9yeVR5cGU7CiAgICAgICAgIGZvcm1hdCA9IHN1cmZhY2UtPm1Gb3JtYXQ7CiAgICAgICAgIGZsYWdzID0gc3VyZmFjZS0+bUZsYWdzOwogICAgIH0KQEAgLTIyMyw3ICsyMTksNiBAQAogICAgIHBhcmNlbC0+d3JpdGVTdHJvbmdCaW5kZXIoc3VyIT0wICAgICA/IHN1ci0+YXNCaW5kZXIoKSAgICAgIDogTlVMTCk7CiAgICAgcGFyY2VsLT53cml0ZVN0cm9uZ0JpbmRlcihoZWFwWzBdIT0wID8gaGVhcFswXS0+YXNCaW5kZXIoKSAgOiBOVUxMKTsKICAgICBwYXJjZWwtPndyaXRlU3Ryb25nQmluZGVyKGhlYXBbMV0hPTAgPyBoZWFwWzFdLT5hc0JpbmRlcigpICA6IE5VTEwpOwotICAgIHBhcmNlbC0+d3JpdGVJbnQzMih0eXBlKTsKICAgICBwYXJjZWwtPndyaXRlSW50MzIodG9rZW4pOwogICAgIHBhcmNlbC0+d3JpdGVJbnQzMihpZGVudGl0eSk7CiAgICAgcGFyY2VsLT53cml0ZUludDMyKGZvcm1hdCk7CmRpZmYgLS1naXQgYS9saWJzL3VpL1RpbWUuY3BwIGIvbGlicy91aS9UaW1lLmNwcAppbmRleCBjOTg2NjdmLi5iNTUzOTEzIDEwMDY0NAotLS0gYS9saWJzL3VpL1RpbWUuY3BwCisrKyBiL2xpYnMvdWkvVGltZS5jcHAKQEAgLTg1LDEwICs4NSwxMCBAQAogfQogCiBTdHJpbmc4IAotVGltZTo6Zm9ybWF0KGNvbnN0IGNoYXIgKmZvcm1hdCkgY29uc3QKK1RpbWU6OmZvcm1hdChjb25zdCBjaGFyICpmb3JtYXQsIGNvbnN0IHN0cnVjdCBzdHJmdGltZV9sb2NhbGUgKmxvY2FsZSkgY29uc3QKIHsKICAgICBjaGFyIGJ1ZlsyNTddOwotICAgIGludCBuID0gc3RyZnRpbWUoYnVmLCAyNTcsIGZvcm1hdCwgJih0aGlzLT50KSk7CisgICAgaW50IG4gPSBzdHJmdGltZV90eihidWYsIDI1NywgZm9ybWF0LCAmKHRoaXMtPnQpLCBsb2NhbGUpOwogICAgIGlmIChuID4gMCkgewogICAgICAgICByZXR1cm4gU3RyaW5nOChidWYpOwogICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL0FuZHJvaWQubWsgYi9saWJzL3V0aWxzL0FuZHJvaWQubWsKaW5kZXggNGE2OGRjMS4uY2RiOGNhMiAxMDA2NDQKLS0tIGEvbGlicy91dGlscy9BbmRyb2lkLm1rCisrKyBiL2xpYnMvdXRpbHMvQW5kcm9pZC5tawpAQCAtMTM5LDYgKzEzOSwxNCBAQAogCWxpYmxvZyBcCiAJbGliY3V0aWxzCiAKK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCitpZmVxICgkKFRBUkdFVF9PUyktJChUQVJHRVRfQVJDSCksbGludXgteDg2KQorIyBUaGlzIGlzIG5lZWRlZCBvbiB4ODYgdG8gYnJpbmcgaW4gZGxfaXRlcmF0ZV9waGRyIGZvciBDYWxsU3RhY2suY3BwCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IFwKKwlsaWJkbAorZW5kaWYgIyBsaW51eC14ODYKK2VuZGlmICMgc2ltCisKIExPQ0FMX01PRFVMRTo9IGxpYnV0aWxzCiAKICNMT0NBTF9DRkxBR1MrPQpkaWZmIC0tZ2l0IGEvbGlicy91dGlscy9DYWxsU3RhY2suY3BwIGIvbGlicy91dGlscy9DYWxsU3RhY2suY3BwCmluZGV4IDQ5Njg2NjYuLjI2ZmIyMmEgMTAwNjQ0Ci0tLSBhL2xpYnMvdXRpbHMvQ2FsbFN0YWNrLmNwcAorKysgYi9saWJzL3V0aWxzL0NhbGxTdGFjay5jcHAKQEAgLTc5LDM1ICs3OSwzNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgCi1jb25zdCBjaGFyICpsb29rdXBfc3ltYm9sKGNvbnN0IHZvaWQqIGFkZHIsIHVpbnQzMl90ICpvZmZzZXQsIGNoYXIqIG5hbWUsIHNpemVfdCBidWZTaXplKQorY29uc3QgY2hhciAqbG9va3VwX3N5bWJvbChjb25zdCB2b2lkKiBhZGRyLCB2b2lkICoqb2Zmc2V0LCBjaGFyKiBuYW1lLCBzaXplX3QgYnVmU2l6ZSkKIHsKICNpZiBIQVZFX0RMQUREUgotCURsX2luZm8gaW5mbzsKLQlpZiAoZGxhZGRyKGFkZHIsICZpbmZvKSkgewotCQkqb2Zmc2V0ID0gKHVpbnQzMl90KWluZm8uZGxpX3NhZGRyOwotCQlyZXR1cm4gaW5mby5kbGlfc25hbWU7Ci0JfQorICAgIERsX2luZm8gaW5mbzsKKyAgICBpZiAoZGxhZGRyKGFkZHIsICZpbmZvKSkgeworICAgICAgICAqb2Zmc2V0ID0gaW5mby5kbGlfc2FkZHI7CisgICAgICAgIHJldHVybiBpbmZvLmRsaV9zbmFtZTsKKyAgICB9CiAjZW5kaWYKLQlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIAogaW50MzJfdCBsaW51eF9nY2NfZGVtYW5nbGVyKGNvbnN0IGNoYXIgKm1hbmdsZWRfbmFtZSwgY2hhciAqdW5tYW5nbGVkX25hbWUsIHNpemVfdCBidWZmZXJzaXplKQogewotCXNpemVfdCBvdXRfbGVuID0gMDsKKyAgICBzaXplX3Qgb3V0X2xlbiA9IDA7CiAjaWYgSEFWRV9DWFhBQkkKLQlpbnQgc3RhdHVzID0gMDsKLQljaGFyICpkZW1hbmdsZWQgPSBhYmk6Ol9fY3hhX2RlbWFuZ2xlKG1hbmdsZWRfbmFtZSwgMCwgJm91dF9sZW4sICZzdGF0dXMpOwotCWlmIChzdGF0dXMgPT0gMCkgewotCQkvLyBPSwotCQlpZiAob3V0X2xlbiA8IGJ1ZmZlcnNpemUpIG1lbWNweSh1bm1hbmdsZWRfbmFtZSwgZGVtYW5nbGVkLCBvdXRfbGVuKTsKLQkJZWxzZSBvdXRfbGVuID0gMDsKLQkJZnJlZShkZW1hbmdsZWQpOwotCX0gZWxzZSB7Ci0JCW91dF9sZW4gPSAwOwotCX0KKyAgICBpbnQgc3RhdHVzID0gMDsKKyAgICBjaGFyICpkZW1hbmdsZWQgPSBhYmk6Ol9fY3hhX2RlbWFuZ2xlKG1hbmdsZWRfbmFtZSwgMCwgJm91dF9sZW4sICZzdGF0dXMpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICAvLyBPSworICAgICAgICBpZiAob3V0X2xlbiA8IGJ1ZmZlcnNpemUpIG1lbWNweSh1bm1hbmdsZWRfbmFtZSwgZGVtYW5nbGVkLCBvdXRfbGVuKTsKKyAgICAgICAgZWxzZSBvdXRfbGVuID0gMDsKKyAgICAgICAgZnJlZShkZW1hbmdsZWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG91dF9sZW4gPSAwOworICAgIH0KICNlbmRpZgotCXJldHVybiBvdXRfbGVuOworICAgIHJldHVybiBvdXRfbGVuOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMTUsMTIgKzExNSwxMiBAQAogY2xhc3MgTWFwSW5mbyB7CiAgICAgc3RydWN0IG1hcGluZm8gewogICAgICAgICBzdHJ1Y3QgbWFwaW5mbyAqbmV4dDsKLSAgICAgICAgdW5zaWduZWQgc3RhcnQ7Ci0gICAgICAgIHVuc2lnbmVkIGVuZDsKKyAgICAgICAgdWludDY0X3Qgc3RhcnQ7CisgICAgICAgIHVpbnQ2NF90IGVuZDsKICAgICAgICAgY2hhciBuYW1lW107CiAgICAgfTsKIAotICAgIGNvbnN0IGNoYXIgKm1hcF90b19uYW1lKHVuc2lnbmVkIHBjLCBjb25zdCBjaGFyKiBkZWYpIHsKKyAgICBjb25zdCBjaGFyICptYXBfdG9fbmFtZSh1aW50NjRfdCBwYywgY29uc3QgY2hhciogZGVmKSB7CiAgICAgICAgIG1hcGluZm8qIG1pID0gZ2V0TWFwSW5mb0xpc3QoKTsKICAgICAgICAgd2hpbGUobWkpIHsKICAgICAgICAgICAgIGlmICgocGMgPj0gbWktPnN0YXJ0KSAmJiAocGMgPCBtaS0+ZW5kKSkKQEAgLTEzOSw4ICsxMzksOCBAQAogICAgICAgICBpZiAobGluZVsyMF0gIT0gJ3gnKSByZXR1cm4gMDsKICAgICAgICAgbWkgPSAobWFwaW5mbyopbWFsbG9jKHNpemVvZihtYXBpbmZvKSArIChsZW4gLSA0NykpOwogICAgICAgICBpZiAobWkgPT0gMCkgcmV0dXJuIDA7Ci0gICAgICAgIG1pLT5zdGFydCA9IHN0cnRvdWwobGluZSwgMCwgMTYpOwotICAgICAgICBtaS0+ZW5kID0gc3RydG91bChsaW5lICsgOSwgMCwgMTYpOworICAgICAgICBtaS0+c3RhcnQgPSBzdHJ0b3VsbChsaW5lLCAwLCAxNik7CisgICAgICAgIG1pLT5lbmQgPSBzdHJ0b3VsbChsaW5lICsgOSwgMCwgMTYpOwogICAgICAgICBtaS0+bmV4dCA9IDA7CiAgICAgICAgIHN0cmNweShtaS0+bmFtZSwgbGluZSArIDQ5KTsKICAgICAgICAgcmV0dXJuIG1pOwpAQCAtMTg0LDcgKzE4NCw3IEBACiAgICAgfQogICAgIAogICAgIHN0YXRpYyBjb25zdCBjaGFyICptYXBBZGRyZXNzVG9OYW1lKGNvbnN0IHZvaWQqIHBjLCBjb25zdCBjaGFyKiBkZWYpIHsKLSAgICAgICAgcmV0dXJuIHNNYXBJbmZvLm1hcF90b19uYW1lKCh1bnNpZ25lZClwYywgZGVmKTsKKyAgICAgICAgcmV0dXJuIHNNYXBJbmZvLm1hcF90b19uYW1lKCh1aW50NjRfdClwYywgZGVmKTsKICAgICB9CiAKIH07CkBAIC0yNzgsNyArMjc4LDcgQEAKICAgICBjaGFyIHRtcFsyNTZdOwogICAgIGNoYXIgdG1wMVszMl07CiAgICAgY2hhciB0bXAyWzMyXTsKLSAgICB1aW50MzJfdCBvZmZzOworICAgIHZvaWQgKm9mZnM7CiAKICAgICBjb25zdCB2b2lkKiBpcCA9IG1TdGFja1tsZXZlbF07CiAgICAgaWYgKCFpcCkgcmV0dXJuIHJlczsKQEAgLTI5MSwxNCArMjkxLDE0IEBACiAgICAgaWYgKG5hbWUpIHsKICAgICAgICAgaWYgKGxpbnV4X2djY19kZW1hbmdsZXIobmFtZSwgdG1wLCAyNTYpICE9IDApCiAgICAgICAgICAgICBuYW1lID0gdG1wOwotICAgICAgICBzbnByaW50Zih0bXAxLCAzMiwgIjB4JTA4eDogPCIsIChzaXplX3QpaXApOwotICAgICAgICBzbnByaW50Zih0bXAyLCAzMiwgIj4rMHglMDh4Iiwgb2Zmcyk7CisgICAgICAgIHNucHJpbnRmKHRtcDEsIDMyLCAiMHglcDogPCIsIGlwKTsKKyAgICAgICAgc25wcmludGYodG1wMiwgMzIsICI+KzB4JXAiLCBvZmZzKTsKICAgICAgICAgcmVzLmFwcGVuZCh0bXAxKTsKICAgICAgICAgcmVzLmFwcGVuZChuYW1lKTsKICAgICAgICAgcmVzLmFwcGVuZCh0bXAyKTsKICAgICB9IGVsc2UgeyAKICAgICAgICAgbmFtZSA9IE1hcEluZm86Om1hcEFkZHJlc3NUb05hbWUoaXAsICI8dW5rbm93bj4iKTsKLSAgICAgICAgc25wcmludGYodG1wLCAyNTYsICJwYyAlMDh4ICAlcyIsIChzaXplX3QpaXAsIG5hbWUpOworICAgICAgICBzbnByaW50Zih0bXAsIDI1NiwgInBjICVwICAlcyIsIGlwLCBuYW1lKTsKICAgICAgICAgcmVzLmFwcGVuZCh0bXApOwogICAgIH0KICAgICByZXMuYXBwZW5kKCJcbiIpOwpkaWZmIC0tZ2l0IGEvbGlicy91dGlscy9JUENUaHJlYWRTdGF0ZS5jcHAgYi9saWJzL3V0aWxzL0lQQ1RocmVhZFN0YXRlLmNwcAppbmRleCBjYTQ5ZDlhLi4wNGFlMTQyIDEwMDY0NAotLS0gYS9saWJzL3V0aWxzL0lQQ1RocmVhZFN0YXRlLmNwcAorKysgYi9saWJzL3V0aWxzL0lQQ1RocmVhZFN0YXRlLmNwcApAQCAtMzkxLDYgKzM5MSwyOSBAQAogICAgIHN0YXR1c190IHJlc3VsdDsKICAgICBkbyB7CiAgICAgICAgIGludDMyX3QgY21kOworICAgICAgICAKKyAgICAgICAgLy8gV2hlbiB3ZSd2ZSBjbGVhcmVkIHRoZSBpbmNvbWluZyBjb21tYW5kIHF1ZXVlLCBwcm9jZXNzIGFueSBwZW5kaW5nIGRlcmVmcworICAgICAgICBpZiAobUluLmRhdGFQb3NpdGlvbigpID49IG1Jbi5kYXRhU2l6ZSgpKSB7CisgICAgICAgICAgICBzaXplX3QgbnVtUGVuZGluZyA9IG1QZW5kaW5nV2Vha0RlcmVmcy5zaXplKCk7CisgICAgICAgICAgICBpZiAobnVtUGVuZGluZyA+IDApIHsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVBlbmRpbmc7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBSZWZCYXNlOjp3ZWFrcmVmX3R5cGUqIHJlZnMgPSBtUGVuZGluZ1dlYWtEZXJlZnNbaV07CisgICAgICAgICAgICAgICAgICAgIHJlZnMtPmRlY1dlYWsobVByb2Nlc3MuZ2V0KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtUGVuZGluZ1dlYWtEZXJlZnMuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbnVtUGVuZGluZyA9IG1QZW5kaW5nU3Ryb25nRGVyZWZzLnNpemUoKTsKKyAgICAgICAgICAgIGlmIChudW1QZW5kaW5nID4gMCkgeworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtUGVuZGluZzsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIEJCaW5kZXIqIG9iaiA9IG1QZW5kaW5nU3Ryb25nRGVyZWZzW2ldOworICAgICAgICAgICAgICAgICAgICBvYmotPmRlY1N0cm9uZyhtUHJvY2Vzcy5nZXQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1QZW5kaW5nU3Ryb25nRGVyZWZzLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBub3cgZ2V0IHRoZSBuZXh0IGNvbW1hbmQgdG8gYmUgcHJvY2Vzc2VkLCB3YWl0aW5nIGlmIG5lY2Vzc2FyeQogICAgICAgICByZXN1bHQgPSB0YWxrV2l0aERyaXZlcigpOwogICAgICAgICBpZiAocmVzdWx0ID49IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBzaXplX3QgSU4gPSBtSW4uZGF0YUF2YWlsKCk7CkBAIC04MzIsNyArODU1LDcgQEAKICAgICAgICAgICAgIExPR19SRU1PVEVSRUZTKCJCUl9SRUxFQVNFIGZyb20gZHJpdmVyIG9uICVwIiwgb2JqKTsKICAgICAgICAgICAgIG9iai0+cHJpbnRSZWZzKCk7CiAgICAgICAgIH0KLSAgICAgICAgb2JqLT5kZWNTdHJvbmcobVByb2Nlc3MuZ2V0KCkpOworICAgICAgICBtUGVuZGluZ1N0cm9uZ0RlcmVmcy5wdXNoKG9iaik7CiAgICAgICAgIGJyZWFrOwogICAgICAgICAKICAgICBjYXNlIEJSX0lOQ1JFRlM6CkBAIC04NTMsNyArODc2LDcgQEAKICAgICAgICAgLy9MT0dfQVNTRVJUKHJlZnMtPnJlZkJhc2UoKSA9PSBvYmosCiAgICAgICAgIC8vICAgICAgICAgICAiQlJfREVDUkVGUzogb2JqZWN0ICVwIGRvZXMgbm90IG1hdGNoIGNvb2tpZSAlcCAoZXhwZWN0ZWQgJXApIiwKICAgICAgICAgLy8gICAgICAgICAgIHJlZnMsIG9iaiwgcmVmcy0+cmVmQmFzZSgpKTsKLSAgICAgICAgcmVmcy0+ZGVjV2VhayhtUHJvY2Vzcy5nZXQoKSk7CisgICAgICAgIG1QZW5kaW5nV2Vha0RlcmVmcy5wdXNoKHJlZnMpOwogICAgICAgICBicmVhazsKICAgICAgICAgCiAgICAgY2FzZSBCUl9BVFRFTVBUX0FDUVVJUkU6CmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL0xvZ1NvY2tldC5jcHAgYi9saWJzL3V0aWxzL0xvZ1NvY2tldC5jcHAKaW5kZXggZTY0Zjc5NC4uNTVjMWI5OSAxMDA2NDQKLS0tIGEvbGlicy91dGlscy9Mb2dTb2NrZXQuY3BwCisrKyBiL2xpYnMvdXRpbHMvTG9nU29ja2V0LmNwcApAQCAtMTYsNyArMTYsNyBAQAogCiAKICNpZm5kZWYgSEFWRV9XSU5TT0NLCi0jZGVmaW5lIFNPQ0tFVExPRworLy8jZGVmaW5lIFNPQ0tFVExPRwogI2VuZGlmCiAKICNpZmRlZiBTT0NLRVRMT0cKZGlmZiAtLWdpdCBhL2xpYnMvdXRpbHMvTWVtb3J5RGVhbGVyLmNwcCBiL2xpYnMvdXRpbHMvTWVtb3J5RGVhbGVyLmNwcAppbmRleCBlNmQxZDE4Li5jZjgyMDFiIDEwMDY0NAotLS0gYS9saWJzL3V0aWxzL01lbW9yeURlYWxlci5jcHAKKysrIGIvbGlicy91dGlscy9NZW1vcnlEZWFsZXIuY3BwCkBAIC0zODcsMjEgKzM4NywyMyBAQAogICAgIHN0YXJ0ID0gKHN0YXJ0ICsgcGFnZXNpemUtMSkgJiB+KHBhZ2VzaXplLTEpOwogICAgIGVuZCAmPSB+KHBhZ2VzaXplLTEpOyAgICAKIAotICAgIHZvaWQqIGNvbnN0IHN0YXJ0X3B0ciA9ICh2b2lkKikoaW50cHRyX3QoZ2V0SGVhcCgpLT5iYXNlKCkpICsgc3RhcnQpOwotICAgIHNpemVfdCBzaXplID0gZW5kLXN0YXJ0OworICAgIGlmIChzdGFydCA8IGVuZCkgeworICAgICAgICB2b2lkKiBjb25zdCBzdGFydF9wdHIgPSAodm9pZCopKGludHB0cl90KGdldEhlYXAoKS0+YmFzZSgpKSArIHN0YXJ0KTsKKyAgICAgICAgc2l6ZV90IHNpemUgPSBlbmQtc3RhcnQ7CiAKICNpZm5kZWYgTkRFQlVHCi0gICAgbWVtc2V0KHN0YXJ0X3B0ciwgMHhkZiwgc2l6ZSk7CisgICAgICAgIG1lbXNldChzdGFydF9wdHIsIDB4ZGYsIHNpemUpOwogI2VuZGlmCi0gIAotLy8gTUFEVl9SRU1PVkUgaXMgbm90IGRlZmluZWQgb24gRGFwcGVyIGJhc2VkIEdvb2J1bnR1IAorCisgICAgICAgIC8vIE1BRFZfUkVNT1ZFIGlzIG5vdCBkZWZpbmVkIG9uIERhcHBlciBiYXNlZCBHb29idW50dSAKICNpZmRlZiBNQURWX1JFTU9WRSAKLSAgICBpZiAoc2l6ZSkgewotICAgICAgICBpbnQgZXJyID0gbWFkdmlzZShzdGFydF9wdHIsIHNpemUsIE1BRFZfUkVNT1ZFKTsKLSAgICAgICAgTE9HV19JRihlcnIsICJtYWR2aXNlKCVwLCAldSwgTUFEVl9SRU1PVkUpIHJldHVybmVkICVzIiwKLSAgICAgICAgICAgICAgICBzdGFydF9wdHIsIHNpemUsIGVycjwwID8gc3RyZXJyb3IoZXJybm8pIDogIk9rIik7Ci0gICAgfQorICAgICAgICBpZiAoc2l6ZSkgeworICAgICAgICAgICAgaW50IGVyciA9IG1hZHZpc2Uoc3RhcnRfcHRyLCBzaXplLCBNQURWX1JFTU9WRSk7CisgICAgICAgICAgICBMT0dXX0lGKGVyciwgIm1hZHZpc2UoJXAsICV1LCBNQURWX1JFTU9WRSkgcmV0dXJuZWQgJXMiLAorICAgICAgICAgICAgICAgICAgICBzdGFydF9wdHIsIHNpemUsIGVycjwwID8gc3RyZXJyb3IoZXJybm8pIDogIk9rIik7CisgICAgICAgIH0KICNlbmRpZgorICAgIH0KIH0KIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvdXRpbHMvTWVtb3J5SGVhcFBtZW0uY3BwIGIvbGlicy91dGlscy9NZW1vcnlIZWFwUG1lbS5jcHAKaW5kZXggMWU1YTFjYy4uZWJhMmIzMCAxMDA2NDQKLS0tIGEvbGlicy91dGlscy9NZW1vcnlIZWFwUG1lbS5jcHAKKysrIGIvbGlicy91dGlscy9NZW1vcnlIZWFwUG1lbS5jcHAKQEAgLTM4LDkgKzM4LDIwIEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1jbGFzcyBNZW1vcnlIZWFwUG1lbTsKK01lbW9yeUhlYXBQbWVtOjpNZW1vcnlQbWVtOjpNZW1vcnlQbWVtKGNvbnN0IHNwPE1lbW9yeUhlYXBQbWVtPiYgaGVhcCkKKyAgICA6IEJuTWVtb3J5KCksIG1DbGllbnRIZWFwKGhlYXApCit7Cit9CiAKLWNsYXNzIFN1YlJlZ2lvbk1lbW9yeSA6IHB1YmxpYyBCbk1lbW9yeSB7CitNZW1vcnlIZWFwUG1lbTo6TWVtb3J5UG1lbTo6fk1lbW9yeVBtZW0oKSB7CisgICAgaWYgKG1DbGllbnRIZWFwICE9IE5VTEwpIHsKKyAgICAgICAgbUNsaWVudEhlYXAtPnJlbW92ZSh0aGlzKTsKKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBTdWJSZWdpb25NZW1vcnkgOiBwdWJsaWMgTWVtb3J5SGVhcFBtZW06Ok1lbW9yeVBtZW0gewogcHVibGljOgogICAgIFN1YlJlZ2lvbk1lbW9yeShjb25zdCBzcDxNZW1vcnlIZWFwUG1lbT4mIGhlYXAsIHNzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CiAgICAgdmlydHVhbCB+U3ViUmVnaW9uTWVtb3J5KCk7CkBAIC01MCwxNSArNjEsMTQgQEAKICAgICB2b2lkIHJldm9rZSgpOwogICAgIHNpemVfdCAgICAgICAgICAgICAgbVNpemU7CiAgICAgc3NpemVfdCAgICAgICAgICAgICBtT2Zmc2V0OwotICAgIHNwPE1lbW9yeUhlYXBQbWVtPiAgbUNsaWVudEhlYXA7CiB9OwogCiBTdWJSZWdpb25NZW1vcnk6OlN1YlJlZ2lvbk1lbW9yeShjb25zdCBzcDxNZW1vcnlIZWFwUG1lbT4mIGhlYXAsCiAgICAgICAgIHNzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKLSAgICA6IG1TaXplKHNpemUpLCBtT2Zmc2V0KG9mZnNldCksIG1DbGllbnRIZWFwKGhlYXApCisgICAgOiBNZW1vcnlIZWFwUG1lbTo6TWVtb3J5UG1lbShoZWFwKSwgbVNpemUoc2l6ZSksIG1PZmZzZXQob2Zmc2V0KQogewogI2lmbmRlZiBOREVCVUcKLSAgICB2b2lkKiBjb25zdCBzdGFydF9wdHIgPSAodm9pZCopKGludHB0cl90KG1DbGllbnRIZWFwLT5iYXNlKCkpICsgb2Zmc2V0KTsKKyAgICB2b2lkKiBjb25zdCBzdGFydF9wdHIgPSAodm9pZCopKGludHB0cl90KGdldEhlYXAoKS0+YmFzZSgpKSArIG9mZnNldCk7CiAgICAgbWVtc2V0KHN0YXJ0X3B0ciwgMHhkYSwgc2l6ZSk7CiAjZW5kaWYKIApAQCAtODAsNyArOTAsNyBAQAogewogICAgIGlmIChvZmZzZXQpICpvZmZzZXQgPSBtT2Zmc2V0OwogICAgIGlmIChzaXplKSAgICpzaXplID0gbVNpemU7Ci0gICAgcmV0dXJuIG1DbGllbnRIZWFwOworICAgIHJldHVybiBnZXRIZWFwKCk7CiB9CiAKIFN1YlJlZ2lvbk1lbW9yeTo6flN1YlJlZ2lvbk1lbW9yeSgpCkBAIC05OCw4ICsxMDgsOSBAQAogICAgIC8vIHByb21vdGUoKSBpdC4KICAgICAKICNpZiBIQVZFX0FORFJPSURfT1MKLSAgICBpZiAobUNsaWVudEhlYXAgIT0gTlVMTCkgewotICAgICAgICBpbnQgb3VyX2ZkID0gbUNsaWVudEhlYXAtPmhlYXBJRCgpOworICAgIGlmIChtU2l6ZSAhPSBOVUxMKSB7CisgICAgICAgIGNvbnN0IHNwPE1lbW9yeUhlYXBQbWVtPiYgaGVhcChnZXRIZWFwKCkpOworICAgICAgICBpbnQgb3VyX2ZkID0gaGVhcC0+aGVhcElEKCk7CiAgICAgICAgIHN0cnVjdCBwbWVtX3JlZ2lvbiBzdWI7CiAgICAgICAgIHN1Yi5vZmZzZXQgPSBtT2Zmc2V0OwogICAgICAgICBzdWIubGVuID0gbVNpemU7CkBAIC0xMDcsNyArMTE4LDcgQEAKICAgICAgICAgTE9HRV9JRihlcnI8MCwgIlBNRU1fVU5NQVAgZmFpbGVkICglcyksICIKICAgICAgICAgICAgICAgICAibUZEPSVkLCBzdWIub2Zmc2V0PSVsdSwgc3ViLnNpemU9JWx1IiwKICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubyksIG91cl9mZCwgc3ViLm9mZnNldCwgc3ViLmxlbik7Ci0gICAgICAgIG1DbGllbnRIZWFwLmNsZWFyKCk7CisgICAgICAgIG1TaXplID0gMDsKICAgICB9CiAjZW5kaWYKIH0KQEAgLTE1NywxMCArMTY4LDcgQEAKIAogc3A8SU1lbW9yeT4gTWVtb3J5SGVhcFBtZW06Om1hcE1lbW9yeShzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKIHsKLSAgICBzcDxTdWJSZWdpb25NZW1vcnk+IG1lbW9yeTsKLSAgICBpZiAoaGVhcElEKCkgPiAwKSAKLSAgICAgICAgbWVtb3J5ID0gbmV3IFN1YlJlZ2lvbk1lbW9yeSh0aGlzLCBvZmZzZXQsIHNpemUpOwotCisgICAgc3A8TWVtb3J5UG1lbT4gbWVtb3J5ID0gY3JlYXRlTWVtb3J5KG9mZnNldCwgc2l6ZSk7CiAgICAgaWYgKG1lbW9yeSAhPSAwKSB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgICAgIG1BbGxvY2F0aW9ucy5hZGQobWVtb3J5KTsKQEAgLTE2OCw2ICsxNzYsMTUgQEAKICAgICByZXR1cm4gbWVtb3J5OwogfQogCitzcDxNZW1vcnlIZWFwUG1lbTo6TWVtb3J5UG1lbT4gTWVtb3J5SGVhcFBtZW06OmNyZWF0ZU1lbW9yeSgKKyAgICAgICAgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpCit7CisgICAgc3A8U3ViUmVnaW9uTWVtb3J5PiBtZW1vcnk7CisgICAgaWYgKGhlYXBJRCgpID4gMCkgCisgICAgICAgIG1lbW9yeSA9IG5ldyBTdWJSZWdpb25NZW1vcnkodGhpcywgb2Zmc2V0LCBzaXplKTsKKyAgICByZXR1cm4gbWVtb3J5OworfQorCiBzdGF0dXNfdCBNZW1vcnlIZWFwUG1lbTo6c2xhcCgpCiB7CiAjaWYgSEFWRV9BTkRST0lEX09TCkBAIC0yMDYsMjEgKzIyMywyNiBAQAogCiB2b2lkIE1lbW9yeUhlYXBQbWVtOjpyZXZva2UoKQogewotICAgIFZlY3Rvcjwgd3A8U3ViUmVnaW9uTWVtb3J5PiA+IGFsbG9jYXRpb25zOworICAgIFNvcnRlZFZlY3Rvcjwgd3A8TWVtb3J5UG1lbT4gPiBhbGxvY2F0aW9uczsKIAogICAgIHsgLy8gc2NvcGUgZm9yIGxvY2sKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAgICAgYWxsb2NhdGlvbnMgPSBtQWxsb2NhdGlvbnM7Ci0gICAgICAgIG1BbGxvY2F0aW9ucy5jbGVhcigpOwogICAgIH0KICAgICAKICAgICBzc2l6ZV90IGNvdW50ID0gYWxsb2NhdGlvbnMuc2l6ZSgpOwogICAgIGZvciAoc3NpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7Ci0gICAgICAgIHNwPFN1YlJlZ2lvbk1lbW9yeT4gbWVtb3J5KGFsbG9jYXRpb25zW2ldLnByb21vdGUoKSk7CisgICAgICAgIHNwPE1lbW9yeVBtZW0+IG1lbW9yeShhbGxvY2F0aW9uc1tpXS5wcm9tb3RlKCkpOwogICAgICAgICBpZiAobWVtb3J5ICE9IDApCiAgICAgICAgICAgICBtZW1vcnktPnJldm9rZSgpOwogICAgIH0KIH0KIAordm9pZCBNZW1vcnlIZWFwUG1lbTo6cmVtb3ZlKGNvbnN0IHdwPE1lbW9yeVBtZW0+JiBtZW1vcnkpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtQWxsb2NhdGlvbnMucmVtb3ZlKG1lbW9yeSk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvdXRpbHMvUmVzb3VyY2VUeXBlcy5jcHAgYi9saWJzL3V0aWxzL1Jlc291cmNlVHlwZXMuY3BwCmluZGV4IGE1ZmU5ZmIuLjVhMDlmYjQgMTAwNjQ0Ci0tLSBhL2xpYnMvdXRpbHMvUmVzb3VyY2VUeXBlcy5jcHAKKysrIGIvbGlicy91dGlscy9SZXNvdXJjZVR5cGVzLmNwcApAQCAtMTY0LDcgKzE2NCwxMSBAQAogCiBzaXplX3QgUmVzX3BuZ185cGF0Y2g6OnNlcmlhbGl6ZWRTaXplKCkKIHsKLSAgICByZXR1cm4gc2l6ZW9mKFJlc19wbmdfOXBhdGNoKQorICAgIC8vIFRoZSBzaXplIG9mIHRoaXMgc3RydWN0IGlzIDMyIGJ5dGVzIG9uIHRoZSAzMi1iaXQgdGFyZ2V0IHN5c3RlbQorICAgIC8vIDQgKiBpbnQ4X3QKKyAgICAvLyA0ICogaW50MzJfdAorICAgIC8vIDMgKiBwb2ludGVyCisgICAgcmV0dXJuIDMyCiAgICAgICAgICAgICArIG51bVhEaXZzICogc2l6ZW9mKGludDMyX3QpCiAgICAgICAgICAgICArIG51bVlEaXZzICogc2l6ZW9mKGludDMyX3QpCiAgICAgICAgICAgICArIG51bUNvbG9ycyAqIHNpemVvZih1aW50MzJfdCk7CkBAIC0xODAsOCArMTg0LDEwIEBACiB2b2lkIFJlc19wbmdfOXBhdGNoOjpzZXJpYWxpemUodm9pZCAqIG91dERhdGEpCiB7CiAgICAgY2hhciogZGF0YSA9IChjaGFyKikgb3V0RGF0YTsKLSAgICBtZW1tb3ZlKGRhdGEsIHRoaXMsIHNpemVvZihSZXNfcG5nXzlwYXRjaCkpOwotICAgIGRhdGEgKz0gIHNpemVvZihSZXNfcG5nXzlwYXRjaCk7CisgICAgbWVtbW92ZShkYXRhLCAmd2FzRGVzZXJpYWxpemVkLCA0KTsgICAgIC8vIGNvcHkgIHdhc0Rlc2VyaWFsaXplZCwgbnVtWERpdnMsIG51bVlEaXZzLCBudW1Db2xvcnMKKyAgICBtZW1tb3ZlKGRhdGEgKyAxMiwgJnBhZGRpbmdMZWZ0LCAxNik7ICAgLy8gY29weSBwYWRkaW5nWFhYWAorICAgIGRhdGEgKz0gMzI7CisKICAgICBtZW1tb3ZlKGRhdGEsIHRoaXMtPnhEaXZzLCBudW1YRGl2cyAqIHNpemVvZihpbnQzMl90KSk7CiAgICAgZGF0YSArPSAgbnVtWERpdnMgKiBzaXplb2YoaW50MzJfdCk7CiAgICAgbWVtbW92ZShkYXRhLCB0aGlzLT55RGl2cywgbnVtWURpdnMgKiBzaXplb2YoaW50MzJfdCkpOwpAQCAtMTg5LDI3ICsxOTUsMzIgQEAKICAgICBtZW1tb3ZlKGRhdGEsIHRoaXMtPmNvbG9ycywgbnVtQ29sb3JzICogc2l6ZW9mKHVpbnQzMl90KSk7CiB9CiAKLVJlc19wbmdfOXBhdGNoKiBSZXNfcG5nXzlwYXRjaDo6ZGVzZXJpYWxpemUoY29uc3Qgdm9pZCogaW5EYXRhKQotewotICAgIGRlc2VyaWFsaXplKGluRGF0YSwgKFJlc19wbmdfOXBhdGNoKikgaW5EYXRhKTsKLSAgICByZXR1cm4gKFJlc19wbmdfOXBhdGNoKikgaW5EYXRhOwotfQotCi12b2lkIFJlc19wbmdfOXBhdGNoOjpkZXNlcmlhbGl6ZShjb25zdCB2b2lkKiBpbkRhdGEsIFJlc19wbmdfOXBhdGNoKiBvdXREYXRhKSB7Ci0gICAgUmVzX3BuZ185cGF0Y2gqIHBhdGNoID0gKFJlc19wbmdfOXBhdGNoKikgaW5EYXRhOworc3RhdGljIHZvaWQgZGVzZXJpYWxpemVJbnRlcm5hbChjb25zdCB2b2lkKiBpbkRhdGEsIFJlc19wbmdfOXBhdGNoKiBvdXREYXRhKSB7CisgICAgY2hhciogcGF0Y2ggPSAoY2hhciopIGluRGF0YTsKICAgICBpZiAoaW5EYXRhICE9IG91dERhdGEpIHsKLSAgICAgICAgbWVtY3B5KG91dERhdGEsIGluRGF0YSwgcGF0Y2gtPnNlcmlhbGl6ZWRTaXplKCkpOworICAgICAgICBtZW1tb3ZlKCZvdXREYXRhLT53YXNEZXNlcmlhbGl6ZWQsIHBhdGNoLCA0KTsgICAgIC8vIGNvcHkgIHdhc0Rlc2VyaWFsaXplZCwgbnVtWERpdnMsIG51bVlEaXZzLCBudW1Db2xvcnMKKyAgICAgICAgbWVtbW92ZSgmb3V0RGF0YS0+cGFkZGluZ0xlZnQsIHBhdGNoICsgMTIsIDQpOyAgICAgLy8gY29weSAgd2FzRGVzZXJpYWxpemVkLCBudW1YRGl2cywgbnVtWURpdnMsIG51bUNvbG9ycwogICAgIH0KICAgICBvdXREYXRhLT53YXNEZXNlcmlhbGl6ZWQgPSB0cnVlOwogICAgIGNoYXIqIGRhdGEgPSAoY2hhciopb3V0RGF0YTsKICAgICBkYXRhICs9ICBzaXplb2YoUmVzX3BuZ185cGF0Y2gpOwogICAgIG91dERhdGEtPnhEaXZzID0gKGludDMyX3QqKSBkYXRhOwotICAgIGRhdGEgKz0gIHBhdGNoLT5udW1YRGl2cyAqIHNpemVvZihpbnQzMl90KTsKKyAgICBkYXRhICs9ICBvdXREYXRhLT5udW1YRGl2cyAqIHNpemVvZihpbnQzMl90KTsKICAgICBvdXREYXRhLT55RGl2cyA9IChpbnQzMl90KikgZGF0YTsKLSAgICBkYXRhICs9ICBwYXRjaC0+bnVtWURpdnMgKiBzaXplb2YoaW50MzJfdCk7CisgICAgZGF0YSArPSAgb3V0RGF0YS0+bnVtWURpdnMgKiBzaXplb2YoaW50MzJfdCk7CiAgICAgb3V0RGF0YS0+Y29sb3JzID0gKHVpbnQzMl90KikgZGF0YTsKIH0KIAorUmVzX3BuZ185cGF0Y2gqIFJlc19wbmdfOXBhdGNoOjpkZXNlcmlhbGl6ZShjb25zdCB2b2lkKiBpbkRhdGEpCit7CisgICAgaWYgKHNpemVvZih2b2lkKikgIT0gc2l6ZW9mKGludDMyX3QpKSB7CisgICAgICAgIExPR0UoIkNhbm5vdCBkZXNlcmlhbGl6ZSBvbiBub24gMzItYml0IHN5c3RlbVxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBkZXNlcmlhbGl6ZUludGVybmFsKGluRGF0YSwgKFJlc19wbmdfOXBhdGNoKikgaW5EYXRhKTsKKyAgICByZXR1cm4gKFJlc19wbmdfOXBhdGNoKikgaW5EYXRhOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zODYzLDcgKzM4NzQsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBjb25maWdJbmRleD0wOyBjb25maWdJbmRleDxOVEM7IGNvbmZpZ0luZGV4KyspIHsKICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVzVGFibGVfdHlwZSogdHlwZSA9IHR5cGVDb25maWdzLT5jb25maWdzW2NvbmZpZ0luZGV4XTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCgoKGludCl0eXBlKSYweDMpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgoKHVpbnQ2NF90KXR5cGUpJjB4MykgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICBOT04tSU5URUdFUiBSZXNUYWJsZV90eXBlIEFERFJFU1M6ICVwXG4iLCB0eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL2Z1dGV4X3N5bmNocm8uYyBiL2xpYnMvdXRpbHMvZnV0ZXhfc3luY2hyby5jCmluZGV4IGMxMzc2MGQuLmJhMTk1MjAgMTAwNjQ0Ci0tLSBhL2xpYnMvdXRpbHMvZnV0ZXhfc3luY2hyby5jCisrKyBiL2xpYnMvdXRpbHMvZnV0ZXhfc3luY2hyby5jCkBAIC0yNSw4ICsyNSw4IEBACiAjaW5jbHVkZSA8cHJpdmF0ZS91dGlscy9mdXRleF9zeW5jaHJvLmg+CiAKIAotLy8gVGhpcyBmdXRleCBnbHVlIGNvZGUgaXMgbmVlZCBvbiBkZXNrdG9wIGxpbnV4LCBidXQgaXMgcGFydCBvZiBrbGliYyBvbiBBUk0KLSNpZiAhZGVmaW5lZChfX2FybV9fKQorLy8gVGhpcyBmdXRleCBnbHVlIGNvZGUgaXMgbmVlZCBvbiBkZXNrdG9wIGxpbnV4LCBidXQgaXMgYWxyZWFkeSBwYXJ0IG9mIGJpb25pYy4KKyNpZiAhZGVmaW5lZChIQVZFX0ZVVEVYX1dSQVBQRVJTKQogCiAjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KIHR5cGVkZWYgdW5zaWduZWQgaW50IHUzMjsKQEAgLTc2LDcgKzc2LDcgQEAKIGludCBfX2F0b21pY19zd2FwKGludCBfbmV3LCB2b2xhdGlsZSBpbnQgKnB0cik7CiBpbnQgX19hdG9taWNfZGVjKHZvbGF0aWxlIGludCAqcHRyKTsKIAotI2VuZGlmIC8vICFkZWZpbmVkKF9fYXJtX18pCisjZW5kaWYgLy8gIWRlZmluZWQoSEFWRV9GVVRFWF9XUkFQUEVSUykKIAogCiAvLyBsb2NrIHN0YXRlcwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYkdMRVNfQ00vZ2xfd3JhcHBlci5jcHAgYi9vcGVuZ2wvbGliR0xFU19DTS9nbF93cmFwcGVyLmNwcAppbmRleCA1ZGE0ZjlhLi4zYjdmNDVlIDEwMDY0NAotLS0gYS9vcGVuZ2wvbGliR0xFU19DTS9nbF93cmFwcGVyLmNwcAorKysgYi9vcGVuZ2wvbGliR0xFU19DTS9nbF93cmFwcGVyLmNwcApAQCAtMzczLDYgKzM3Myw3IEBACiAKIHN0YXRpYyBzcDxHUFVSZXZva2VSZXF1ZXN0ZXI+IGdSZXZva2VyQ2FsbGJhY2s7CiAKKwogc3RhdGljIHJlcXVlc3RfZ3B1X3QqIGdwdV9hY3F1aXJlKHZvaWQqIHVzZXIpCiB7CiAgICAgc3A8SVN1cmZhY2VDb21wb3Nlcj4gc2VydmVyKCBnZXRTdXJmYWNlRmxpbmdlcigpICk7CkBAIC0zODMsNyArMzg0LDEwIEBACiAgICAgfQogICAgIAogICAgIElTdXJmYWNlQ29tcG9zZXI6OmdwdV9pbmZvX3QgaW5mbzsKLSAgICBnUmV2b2tlckNhbGxiYWNrID0gbmV3IEdQVVJldm9rZVJlcXVlc3RlcigpOworICAgIAorICAgIGlmIChnUmV2b2tlckNhbGxiYWNrID09IDApCisgICAgICAgIGdSZXZva2VyQ2FsbGJhY2sgPSBuZXcgR1BVUmV2b2tlUmVxdWVzdGVyKCk7CisKICAgICBzdGF0dXNfdCBlcnIgPSBzZXJ2ZXItPnJlcXVlc3RHUFUoZ1Jldm9rZXJDYWxsYmFjaywgJmluZm8pOwogICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKICAgICAgICAgTE9HRCgicmVxdWVzdEdQVSByZXR1cm5lZCAlZCIsIGVycik7CkBAIC01NDksNiArNTUzLDIxIEBACiAgICAgcmV0dXJuIC0xOwogfQogCitzdGF0aWMgRUdMaW50IGNvbmZpZ1RvVW5pcXVlSWQoZWdsX2Rpc3BsYXlfdCBjb25zdCogZHAsIGludCBpLCBpbnQgaW5kZXgpIAoreworICAgIC8vIE5PVEU6IHRoaXMgbWFwcGluZyB3b3JrcyBvbmx5IGlmIHdlIGhhdmUgbm8gbW9yZSB0aGFuIHR3byBFR0xpbXBsCisgICAgcmV0dXJuIChpPjAgPyBkcC0+bnVtQ29uZmlnc1swXSA6IDApICsgaW5kZXg7Cit9CisKK3N0YXRpYyB2b2lkIHVuaXF1ZUlkVG9Db25maWcoZWdsX2Rpc3BsYXlfdCBjb25zdCogZHAsIEVHTGludCBjb25maWdJZCwKKyAgICAgICAgaW50JiBpLCBpbnQmIGluZGV4KSAKK3sKKyAgICAvLyBOT1RFOiB0aGlzIG1hcHBpbmcgd29ya3Mgb25seSBpZiB3ZSBoYXZlIG5vIG1vcmUgdGhhbiB0d28gRUdMaW1wbAorICAgIHNpemVfdCBudW1Db25maWdzID0gZHAtPm51bUNvbmZpZ3NbMF07CisgICAgaSA9IGNvbmZpZ0lkIC8gbnVtQ29uZmlnczsKKyAgICBpbmRleCA9IGNvbmZpZ0lkICUgbnVtQ29uZmlnczsKK30KKwogc3RhdGljIGludCBjbXBfY29uZmlncyhjb25zdCB2b2lkKiBhLCBjb25zdCB2b2lkICpiKQogewogICAgIEVHTENvbmZpZyBjMCA9ICooRUdMQ29uZmlnIGNvbnN0ICopYTsKQEAgLTU1Nyw3ICs1NzYsNyBAQAogfQogCiBzdGF0aWMgY2hhciBjb25zdCAqIGNvbnN0IGdWZW5kb3JTdHJpbmcgICAgID0gIkFuZHJvaWQiOwotc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBnVmVyc2lvblN0cmluZyAgICA9ICIxLjIgQW5kcm9pZCBNRVRBLUVHTCI7CitzdGF0aWMgY2hhciBjb25zdCAqIGNvbnN0IGdWZXJzaW9uU3RyaW5nICAgID0gIjEuMyBBbmRyb2lkIE1FVEEtRUdMIjsKIHN0YXRpYyBjaGFyIGNvbnN0ICogY29uc3QgZ0NsaWVudEFwaVN0cmluZyAgPSAiT3BlbkdMIEVTIjsKIAogc3RydWN0IGV4dGVudGlvbl9tYXBfdCB7CkBAIC04MzQsNyArODUzLDEzIEBACiAgICAgICAgIHByb3BlcnR5X2dldCgiZGVidWcuZWdsLmh3IiwgdmFsdWUsICIxIik7CiAgICAgICAgIGlmIChhdG9pKHZhbHVlKSAhPSAwKSB7CiAgICAgICAgICAgICBjbngtPmhvb2tzID0gJmdIb29rc1tJTVBMX0hBUkRXQVJFXTsKLSAgICAgICAgICAgIGNueC0+ZHNvID0gbG9hZF9kcml2ZXIoImxpYmhnbC5zbyIsIGNueC0+aG9va3MpOworICAgICAgICAgICAgcHJvcGVydHlfZ2V0KCJkZWJ1Zy5lZ2wucHJvZmlsZXIiLCB2YWx1ZSwgIjAiKTsKKyAgICAgICAgICAgIGlmIChhdG9pKHZhbHVlKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY254LT5kc28gPSBsb2FkX2RyaXZlcigibGliaGdsLnNvIiwgY254LT5ob29rcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPR1coIlVzaW5nIGluc3RydW1lbnRlZCBoL3cgT3BlbkdMIEVTIGxpYnJhcnkiKTsKKyAgICAgICAgICAgICAgICBjbngtPmRzbyA9IGxvYWRfZHJpdmVyKCJsaWJoZ2xkLnNvIiwgY254LT5ob29rcyk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBMT0dEKCIzRCBoYXJkd2FyZSBhY2NlbGVyYXRpb24gaXMgZGlzYWJsZWQiKTsKICAgICAgICAgfQpAQCAtODY0LDYgKzg4OSw4IEBACiAgICAgICAgIAogICAgICAgICBkLT5kcHlzW0lNUExfSEFSRFdBUkVdID0gY254LT5ob29rcy0+ZWdsLmVnbEdldERpc3BsYXkoZGlzcGxheSk7CiAgICAgICAgIGlmIChkLT5kcHlzW0lNUExfSEFSRFdBUkVdID09IEVHTF9OT19ESVNQTEFZKSB7CisgICAgICAgICAgICBMT0dFKCJoL3cgYWNjZWxlcmF0ZWQgZWdsR2V0RGlzcGxheSgpIGZhaWxlZCAoJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgZWdsX3N0cmVycm9yKGNueC0+aG9va3MtPmVnbC5lZ2xHZXRFcnJvcigpKSk7CiAgICAgICAgICAgICBkbGNsb3NlKCh2b2lkKiljbngtPmRzbyk7CiAgICAgICAgICAgICBjbngtPmRzbyA9IDA7CiAgICAgICAgICAgICAvLyBpbiBjYXNlIG9mIGZhaWx1cmUsIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHdlIGRvbid0IHRyeSBhZ2FpbgpAQCAtOTAwLDcgKzkyNywxMCBAQAogICAgICAgICBlZ2xfY29ubmVjdGlvbl90KiBjb25zdCBjbnggPSAmZ0VHTEltcGxbaV07CiAgICAgICAgIGNueC0+bWFqb3IgPSAtMTsKICAgICAgICAgY254LT5taW5vciA9IC0xOwotICAgICAgICBpZiAoY254LT5kc28gJiYgY254LT5ob29rcy0+ZWdsLmVnbEluaXRpYWxpemUoCisgICAgICAgIGlmICghY254LT5kc28pIAorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKGNueC0+aG9va3MtPmVnbC5lZ2xJbml0aWFsaXplKAogICAgICAgICAgICAgICAgIGRwLT5kcHlzW2ldLCAmY254LT5tYWpvciwgJmNueC0+bWlub3IpKSB7CiAKICAgICAgICAgICAgIC8vTE9HRCgiaW5pdGlhbGl6ZWQgJWQgZHB5PSVwLCB2ZXI9JWQuJWQsIGNueD0lcCIsCkBAIC05MTIsMTAgKzk0MiwxMCBAQAogICAgICAgICAgICAgZHAtPnF1ZXJ5U3RyaW5nW2ldLnZlcnNpb24gPQogICAgICAgICAgICAgICAgIGNueC0+aG9va3MtPmVnbC5lZ2xRdWVyeVN0cmluZyhkcC0+ZHB5c1tpXSwgRUdMX1ZFUlNJT04pOwogICAgICAgICAgICAgZHAtPnF1ZXJ5U3RyaW5nW2ldLmV4dGVuc2lvbnMgPSBzdHJkdXAoCi0gICAgICAgICAgICAgICAgY254LT5ob29rcy0+ZWdsLmVnbFF1ZXJ5U3RyaW5nKGRwLT5kcHlzW2ldLCBFR0xfRVhURU5TSU9OUykpOworICAgICAgICAgICAgICAgICAgICBjbngtPmhvb2tzLT5lZ2wuZWdsUXVlcnlTdHJpbmcoZHAtPmRweXNbaV0sIEVHTF9FWFRFTlNJT05TKSk7CiAgICAgICAgICAgICBkcC0+cXVlcnlTdHJpbmdbaV0uY2xpZW50QXBpID0KICAgICAgICAgICAgICAgICBjbngtPmhvb2tzLT5lZ2wuZWdsUXVlcnlTdHJpbmcoZHAtPmRweXNbaV0sIEVHTF9DTElFTlRfQVBJUyk7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgLy8gRHluYW1pY2FsbHkgaW5zZXJ0IGV4dGVuc2lvbnMgd2Uga25vdyBhYm91dAogICAgICAgICAgICAgaWYgKGNueC0+aG9va3MtPmVnbC5lZ2xTd2FwUmVjdGFuZ2xlQU5EUk9JRCkKICAgICAgICAgICAgICAgICBhZGRfZXh0ZW5zaW9uKGRwLCBkcC0+cXVlcnlTdHJpbmdbaV0uZXh0ZW5zaW9ucywKQEAgLTkyNCwxMiArOTU0LDE1IEBACiAgICAgICAgICAgICBpZiAoY254LT5ob29rcy0+ZWdsLmVnbFF1ZXJ5U3RyaW5nQ29uZmlnQU5EUk9JRCkKICAgICAgICAgICAgICAgICBhZGRfZXh0ZW5zaW9uKGRwLCBkcC0+cXVlcnlTdHJpbmdbaV0uZXh0ZW5zaW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICJFR0xfQU5EUk9JRF9xdWVyeV9zdHJpbmdfY29uZmlnIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dEKCIlZDogZWdsSW5pdGlhbGl6ZSgpIGZhaWxlZCAoJXMpIiwgCisgICAgICAgICAgICAgICAgICAgIGksIGVnbF9zdHJlcnJvcihjbngtPmhvb2tzLT5lZ2wuZWdsR2V0RXJyb3IoKSkpOwogICAgICAgICB9CiAgICAgfQotICAgICAgICAgICAgCisKICAgICAvLyBCdWlsZCB0aGUgZXh0ZW5zaW9uIGxpc3QgdGhhdCBkZXBlbmRzIG9uIHRoZSBjdXJyZW50IGNvbmZpZy4KICAgICAvLyBJdCBpcyB0aGUgaW50ZXJzZWN0aW9uIG9mIG91ciBleHRlbnNpb24gbGlzdCBhbmQgdGhlCi0gICAgLy8gdW5kZXJsYXlpbmcgRUdMJ3MgZXh0ZW5zaW9ucyBsaXN0CisgICAgLy8gdW5kZXJseWluZyBFR0wncyBleHRlbnNpb25zIGxpc3QKICAgICBFR0xCb29sZWFuIHJlcyA9IEVHTF9GQUxTRTsKICAgICBmb3IgKGludCBpPTAgOyBpPDIgOyBpKyspIHsKICAgICAgICAgZWdsX2Nvbm5lY3Rpb25fdCogY29uc3QgY254ID0gJmdFR0xJbXBsW2ldOwpAQCAtOTUxLDEwICs5ODQsMTAgQEAKICAgICAgICAgICAgIH0gd2hpbGUgKCpwKTsKICAgICAgICAgICAgIGZyZWUoKHZvaWQqKW91cl9leHRlbnNpb25zX29yZyk7CiAKLSAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgdHJhaWxsaW5nIHdoaXRlIHNwYWNlCisgICAgICAgICAgICAvLyByZW1vdmUgdGhlIHRyYWlsaW5nIHdoaXRlIHNwYWNlCiAgICAgICAgICAgICBpZiAoZXh0ZW5zaW9uc19jb25maWdbMF0gIT0gMCkgewogICAgICAgICAgICAgICAgIHNpemVfdCBsID0gc3RybGVuKGV4dGVuc2lvbnNfY29uZmlnKSAtIDE7IC8vIG5ldyBzaXplCi0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uc19jb25maWdbbF0gPSAwOyAvLyByZW1vdmUgdGhlIHRyYWlsbGluZyB3aGl0ZSBzcGFjZQorICAgICAgICAgICAgICAgIGV4dGVuc2lvbnNfY29uZmlnW2xdID0gMDsgLy8gcmVtb3ZlIHRoZSB0cmFpbGluZyB3aGl0ZSBzcGFjZQogICAgICAgICAgICAgICAgIGV4dGVuc2lvbnNfY29uZmlnID0gKGNoYXIqKXJlYWxsb2MoZXh0ZW5zaW9uc19jb25maWcsIGwrMSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGV4dGVuc2lvbnNfY29uZmlnID0gKGNoYXIqKXJlYWxsb2MoZXh0ZW5zaW9uc19jb25maWcsIDEpOwpAQCAtMTA2NSwxNSArMTA5OCw3NCBAQAogICAgICAgICByZXR1cm4gRUdMX1RSVUU7CiAgICAgfQogCisgICAgRUdMaW50IG47CiAgICAgRUdMQm9vbGVhbiByZXMgPSBFR0xfRkFMU0U7CiAgICAgKm51bV9jb25maWcgPSAwOworCisgICAgCisgICAgLy8gSXQgaXMgdW5mb3J0dW5hdGUsIGJ1dCB3ZSBuZWVkIHRvIHJlbWFwIHRoZSBFR0xfQ09ORklHX0lEcywgCisgICAgLy8gdG8gZG8gIHRoaXMsIHdlIGhhdmUgdG8gZ28gdGhyb3VnaCB0aGUgYXR0cmliX2xpc3QgYXJyYXkgb25jZQorICAgIC8vIHRvIGZpZ3VyZSBvdXQgYm90aCBpdHMgc2l6ZSBhbmQgaWYgaXQgY29udGFpbnMgYW4gRUdMX0NPTkZJR19JRAorICAgIC8vIGtleS4gSWYgc28sIHRoZSBmdWxsIGFycmF5IGlzIGNvcGllZCBhbmQgcGF0Y2hlZC4KKyAgICAvLyBOT1RFOiB3ZSBhc3N1bWUgdGhhdCB0aGVyZSBjYW4gYmUgb25seSBvbmUgb2NjdXJyZW5jZQorICAgIC8vIG9mIEVHTF9DT05GSUdfSUQuCisgICAgCisgICAgRUdMaW50IHBhdGNoX2luZGV4ID0gLTE7CisgICAgR0xpbnQgYXR0cjsKKyAgICBzaXplX3Qgc2l6ZSA9IDA7CisgICAgd2hpbGUgKChhdHRyPWF0dHJpYl9saXN0W3NpemVdKSkgeworICAgICAgICBpZiAoYXR0ciA9PSBFR0xfQ09ORklHX0lEKQorICAgICAgICAgICAgcGF0Y2hfaW5kZXggPSBzaXplOworICAgICAgICBzaXplICs9IDI7CisgICAgfQorICAgIGlmIChwYXRjaF9pbmRleCA+PSAwKSB7CisgICAgICAgIHNpemUgKz0gMjsgLy8gd2UgbmVlZCBjb3B5IHRoZSBzZW50aW5lbCBhcyB3ZWxsCisgICAgICAgIEVHTGludCogbmV3X2xpc3QgPSAoRUdMaW50KiltYWxsb2Moc2l6ZSpzaXplb2YoRUdMaW50KSk7CisgICAgICAgIGlmIChuZXdfbGlzdCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfQUxMT0MsIEVHTF9GQUxTRSk7CisgICAgICAgIG1lbWNweShuZXdfbGlzdCwgYXR0cmliX2xpc3QsIHNpemUqc2l6ZW9mKEVHTGludCkpOworCisgICAgICAgIC8vIHBhdGNoIHRoZSByZXF1ZXN0ZWQgRUdMX0NPTkZJR19JRAorICAgICAgICBpbnQgaSwgaW5kZXg7CisgICAgICAgIEVHTGludCYgY29uZmlnSWQobmV3X2xpc3RbcGF0Y2hfaW5kZXgrMV0pOworICAgICAgICB1bmlxdWVJZFRvQ29uZmlnKGRwLCBjb25maWdJZCwgaSwgaW5kZXgpOworICAgICAgICAKKyAgICAgICAgZWdsX2Nvbm5lY3Rpb25fdCogY29uc3QgY254ID0gJmdFR0xJbXBsW2ldOworICAgICAgICBpZiAoY254LT5kc28pIHsKKyAgICAgICAgICAgIGNueC0+aG9va3MtPmVnbC5lZ2xHZXRDb25maWdBdHRyaWIoCisgICAgICAgICAgICAgICAgICAgIGRwLT5kcHlzW2ldLCBkcC0+Y29uZmlnc1tpXVtpbmRleF0sIAorICAgICAgICAgICAgICAgICAgICBFR0xfQ09ORklHX0lELCAmY29uZmlnSWQpOworCisgICAgICAgICAgICAvLyBhbmQgc3dpdGNoIHRvIHRoZSBuZXcgbGlzdAorICAgICAgICAgICAgYXR0cmliX2xpc3QgPSBjb25zdF9jYXN0PGNvbnN0IEVHTGludCAqPihuZXdfbGlzdCk7CisKKyAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIHRoZSBvbmx5IGNvbmZpZ3VyYXRpb24gdGhhdCBjYW4gbWF0Y2ggaXMKKyAgICAgICAgICAgIC8vIGRwLT5jb25maWdzW2ldW2luZGV4XSwgaG93ZXZlciwgd2UgZG9uJ3Qga25vdyBpZiBpdCB3b3VsZCBiZQorICAgICAgICAgICAgLy8gcmVqZWN0ZWQgYmVjYXVzZSBvZiB0aGUgb3RoZXIgYXR0cmlidXRlcywgc28gd2UgZG8gaGF2ZSB0byBjYWxsCisgICAgICAgICAgICAvLyBjbngtPmhvb2tzLT5lZ2wuZWdsQ2hvb3NlQ29uZmlnKCkgLS0gYnV0IHdlIGRvbid0IGhhdmUgdG8gbG9vcAorICAgICAgICAgICAgLy8gdGhyb3VnaCBhbGwgdGhlIEVHTGltcGxbXS4KKyAgICAgICAgICAgIC8vIFdlIGFsc28ga25vdyB3ZSBjYW4gb25seSBnZXQgYSBzaW5nbGUgY29uZmlnIGJhY2ssIGFuZCB3ZSBrbm93CisgICAgICAgICAgICAvLyB3aGljaCBvbmUuCisKKyAgICAgICAgICAgIHJlcyA9IGNueC0+aG9va3MtPmVnbC5lZ2xDaG9vc2VDb25maWcoCisgICAgICAgICAgICAgICAgICAgIGRwLT5kcHlzW2ldLCBhdHRyaWJfbGlzdCwgY29uZmlncywgY29uZmlnX3NpemUsICZuKTsKKyAgICAgICAgICAgIGlmIChyZXMgJiYgbj4wKSB7CisgICAgICAgICAgICAgICAgLy8gbiBoYXMgdG8gYmUgMCBvciAxLCBieSBjb25zdHJ1Y3Rpb24sIGFuZCB3ZSBhbHJlYWR5IGtub3cKKyAgICAgICAgICAgICAgICAvLyB3aGljaCBjb25maWcgaXQgd2lsbCByZXR1cm4gKHNpbmNlIHRoZXJlIGNhbiBiZSBvbmx5IG9uZSkuCisgICAgICAgICAgICAgICAgY29uZmlnc1swXSA9IE1BS0VfQ09ORklHKGksIGluZGV4KTsKKyAgICAgICAgICAgICAgICAqbnVtX2NvbmZpZyA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmcmVlKGNvbnN0X2Nhc3Q8RUdMaW50ICo+KGF0dHJpYl9saXN0KSk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCiAgICAgZm9yIChpbnQgaT0wIDsgaTwyIDsgaSsrKSB7CiAgICAgICAgIGVnbF9jb25uZWN0aW9uX3QqIGNvbnN0IGNueCA9ICZnRUdMSW1wbFtpXTsKICAgICAgICAgaWYgKGNueC0+ZHNvKSB7Ci0gICAgICAgICAgICBFR0xpbnQgbjsKICAgICAgICAgICAgIGlmIChjbngtPmhvb2tzLT5lZ2wuZWdsQ2hvb3NlQ29uZmlnKAotICAgICAgICAgICAgICAgICAgICBkcC0+ZHB5c1tpXSwgYXR0cmliX2xpc3QsIGNvbmZpZ3MsIGNvbmZpZ19zaXplLCAmbikpCi0gICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRwLT5kcHlzW2ldLCBhdHRyaWJfbGlzdCwgY29uZmlncywgY29uZmlnX3NpemUsICZuKSkgewogICAgICAgICAgICAgICAgIC8vIG5vdyB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhlc2UgY2xpZW50IEVHTENvbmZpZyB0byBvdXIKICAgICAgICAgICAgICAgICAvLyBpbnRlcm5hbCBFR0xDb25maWcgZm9ybWF0LiBUaGlzIGlzIGRvbmUgaW4gTyhuIGxvZyBuKS4KICAgICAgICAgICAgICAgICBmb3IgKGludCBqPTAgOyBqPG4gOyBqKyspIHsKQEAgLTExMDIsNiArMTE5NCwxMyBAQAogICAgIGludCBpPTAsIGluZGV4PTA7CiAgICAgZWdsX2Nvbm5lY3Rpb25fdCogY254ID0gdmFsaWRhdGVfZGlzcGxheV9jb25maWcoZHB5LCBjb25maWcsIGRwLCBpLCBpbmRleCk7CiAgICAgaWYgKCFjbngpIHJldHVybiBFR0xfRkFMU0U7CisgICAgCisgICAgaWYgKGF0dHJpYnV0ZSA9PSBFR0xfQ09ORklHX0lEKSB7CisgICAgICAgIC8vIEVHTF9DT05GSUdfSURzIG11c3QgYmUgdW5pcXVlLCBqdXN0IHVzZSB0aGUgb3JkZXIgb2YgdGhlIHNlbGVjdGVkCisgICAgICAgIC8vIEVHTENvbmZpZy4KKyAgICAgICAgKnZhbHVlID0gY29uZmlnVG9VbmlxdWVJZChkcCwgaSwgaW5kZXgpOworICAgICAgICByZXR1cm4gRUdMX1RSVUU7CisgICAgfQogICAgIHJldHVybiBjbngtPmhvb2tzLT5lZ2wuZWdsR2V0Q29uZmlnQXR0cmliKAogICAgICAgICAgICAgZHAtPmRweXNbaV0sIGRwLT5jb25maWdzW2ldW2luZGV4XSwgYXR0cmlidXRlLCB2YWx1ZSk7CiB9CmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL1RleHR1cmVPYmplY3RNYW5hZ2VyLmNwcCBiL29wZW5nbC9saWJhZ2wvVGV4dHVyZU9iamVjdE1hbmFnZXIuY3BwCmluZGV4IDEyZmFlNjMuLmNlMzE4NTQgMTAwNjQ0Ci0tLSBhL29wZW5nbC9saWJhZ2wvVGV4dHVyZU9iamVjdE1hbmFnZXIuY3BwCisrKyBiL29wZW5nbC9saWJhZ2wvVGV4dHVyZU9iamVjdE1hbmFnZXIuY3BwCkBAIC0xMjksNyArMTI5LDcgQEAKICAgICAvLyBzbyBmb3Igbm93LCB3ZSBqdXN0IGxvb3NlIGl0LgogICAgIG1lbXNldChjcm9wX3JlY3QsIDAsIHNpemVvZihjcm9wX3JlY3QpKTsKIAotICAgIC8vIGl0IHdvdWxkIGJlIG5pY2UgaWQgd2UgY291bGQga2VlcCB0aGUgZ2VuZXJhdGVfbWlwbWFwIGZsYWcKKyAgICAvLyBpdCB3b3VsZCBiZSBuaWNlIGlmIHdlIGNvdWxkIGtlZXAgdGhlIGdlbmVyYXRlX21pcG1hcCBmbGFnLAogICAgIC8vIHdlIHdvdWxkIGhhdmUgdG8gZ2VuZXJhdGUgdGhlbSByaWdodCBub3cgdGhvdWdoLgogICAgIGdlbmVyYXRlX21pcG1hcCA9IEdMX0ZBTFNFOwogCkBAIC0yODYsNyArMjg2LDcgQEAKIAogdm9pZCBFR0xTdXJmYWNlTWFuYWdlcjo6ZGVsZXRlVGV4dHVyZXMoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnRva2VucykKIHsKLSAgICAvLyBmcmVlIGFsbCB0ZXh1cmVzCisgICAgLy8gZnJlZSBhbGwgdGV4dHVyZXMKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGZvciAoR0xzaXplaSBpPTAgOyBpPG4gOyBpKyspIHsKICAgICAgICAgY29uc3QgR0x1aW50IHQoKnRva2VucysrKTsKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvYXJyYXkuY3BwIGIvb3BlbmdsL2xpYmFnbC9hcnJheS5jcHAKaW5kZXggMWY2NzU3ZC4uOGZhNzU2NiAxMDA2NDQKLS0tIGEvb3BlbmdsL2xpYmFnbC9hcnJheS5jcHAKKysrIGIvb3BlbmdsL2xpYmFnbC9hcnJheS5jcHAKQEAgLTExMTYsOCArMTExNiw4IEBACiAgICAgaWYgKGVuYWJsZXMgJiBHR0xfRU5BQkxFX1RNVVMpIHsgLy8gbmVlZHMgdGV4dHVyZSB0cmFuc2Zvcm1zCiAgICAgICAgIHdhbnQgfD0gdHJhbnNmb3JtX3N0YXRlX3Q6OlRFWFRVUkU7CiAgICAgfQotICAgIGlmIChjLT5jbGlwUGxhbmVzLmVuYWJsZSkgeyAvLyBuZWVkcyBleWUgY29vcmRzCi0gICAgICAgIHdhbnQgfD0gdHJhbnNmb3JtX3N0YXRlX3Q6Ok1PREVMVklFVzsKKyAgICBpZiAoYy0+Y2xpcFBsYW5lcy5lbmFibGUgfHwgKGVuYWJsZXMgJiBHR0xfRU5BQkxFX0ZPRykpIHsgCisgICAgICAgIHdhbnQgfD0gdHJhbnNmb3JtX3N0YXRlX3Q6Ok1PREVMVklFVzsgLy8gbmVlZHMgZXllIGNvb3JkcwogICAgIH0KICAgICBvZ2xlc192YWxpZGF0ZV90cmFuc2Zvcm0oYywgd2FudCk7CiAKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvZWdsLmNwcCBiL29wZW5nbC9saWJhZ2wvZWdsLmNwcAppbmRleCA4NTRhNDllLi4zZThkY2E5IDEwMDY0NAotLS0gYS9vcGVuZ2wvbGliYWdsL2VnbC5jcHAKKysrIGIvb3BlbmdsL2xpYmFnbC9lZ2wuY3BwCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8R0xFUy9lZ2wuaD4KIAogI2luY2x1ZGUgPHBpeGVsZmxpbmdlci9mb3JtYXQuaD4KKyNpbmNsdWRlIDxwaXhlbGZsaW5nZXIvcGl4ZWxmbGluZ2VyLmg+CiAKICNpbmNsdWRlICJjb250ZXh0LmgiCiAjaW5jbHVkZSAic3RhdGUuaCIKQEAgLTU3LDcgKzU4LDcgQEAKICNpZm5kZWYgSEFWRV9BTkRST0lEX09TCiBuYW1lc3BhY2UgZ2wgewogcHRocmVhZF9rZXlfdCBnR0xLZXkgPSAtMTsKLX07IC8vIG5hbXNwYWNlIGdsCit9OyAvLyBuYW1lc3BhY2UgZ2wKICNlbmRpZgogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpAQCAtMTU2LDcgKzE1Nyw3IEBACiBlZ2xfc3VyZmFjZV90OjplZ2xfc3VyZmFjZV90KEVHTERpc3BsYXkgZHB5LAogICAgICAgICBFR0xDb25maWcgY29uZmlnLAogICAgICAgICBpbnQzMl90IGRlcHRoRm9ybWF0KQotICAgIDogbWFnaWMoMHgzMTQxNTI2NSksIGRweShkcHkpLCBjb25maWcoY29uZmlnKSwgY3R4KDApCisgICAgOiBtYWdpYyhNQUdJQyksIGRweShkcHkpLCBjb25maWcoY29uZmlnKSwgY3R4KDApCiB7CiAgICAgZGVwdGgudmVyc2lvbiA9IHNpemVvZihHR0xTdXJmYWNlKTsKICAgICBkZXB0aC5kYXRhID0gMDsKQEAgLTI0MCw3ICsyNDEsNyBAQAogewogICAgIHVpbnQzMl90IGZsYWdzID0gbmF0aXZlV2luZG93LT5zd2FwQnVmZmVycyhuYXRpdmVXaW5kb3cpOwogICAgIGlmIChmbGFncyAmIEVHTF9OQVRJVkVTX0ZMQUdfU0laRV9DSEFOR0VEKSB7Ci0gICAgICAgIC8vIFRPRE86IHdlIHByb2JhbHkgc2hvdWxkIHJlc2V0IHRoZSBzd2FwIHJlY3QgaGVyZQorICAgICAgICAvLyBUT0RPOiB3ZSBwcm9iYWJseSBzaG91bGQgcmVzZXQgdGhlIHN3YXAgcmVjdCBoZXJlCiAgICAgICAgIC8vIGlmIHRoZSB3aW5kb3cgc2l6ZSBoYXMgY2hhbmdlZAogICAgICAgICAvLyAgICB3aW5kb3ctPnNldFN3YXBSZWN0YW5nbGUoUmVjdChpbmZvLncsIGluZm8uaCkpOwogICAgICAgICBpZiAoZGVwdGguZGF0YSkgewpAQCAtNDAyLDEyICs0MDMsMTMgQEAKIHsKICAgICBzaXplX3Qgc2l6ZSA9IHcqaDsKICAgICBzd2l0Y2ggKGYpIHsKLSAgICBjYXNlIEdHTF9QSVhFTF9GT1JNQVRfUkdCXzU2NTogICAgICBzaXplICo9IDI7IGJyZWFrOwotICAgIGNhc2UgR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg6ICAgIHNpemUgKj0gNDsgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgTE9HRSgiaW5jb21wYXRpYmxlIHBpeGVsIGZvcm1hdCBmb3IgcGJ1ZmZlciAoZm9ybWF0PSVkKSIsIGYpOwotICAgICAgICBwYnVmZmVyLmRhdGEgPSAwOwotICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHR0xfUElYRUxfRk9STUFUX0FfODogICAgICAgICAgc2l6ZSAqPSAxOyBicmVhazsKKyAgICAgICAgY2FzZSBHR0xfUElYRUxfRk9STUFUX1JHQl81NjU6ICAgICAgc2l6ZSAqPSAyOyBicmVhazsKKyAgICAgICAgY2FzZSBHR0xfUElYRUxfRk9STUFUX1JHQkFfODg4ODogICAgc2l6ZSAqPSA0OyBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR0UoImluY29tcGF0aWJsZSBwaXhlbCBmb3JtYXQgZm9yIHBidWZmZXIgKGZvcm1hdD0lZCkiLCBmKTsKKyAgICAgICAgICAgIHBidWZmZXIuZGF0YSA9IDA7CisgICAgICAgICAgICBicmVhazsKICAgICB9CiAgICAgcGJ1ZmZlci52ZXJzaW9uID0gc2l6ZW9mKEdHTFN1cmZhY2UpOwogICAgIHBidWZmZXIud2lkdGggICA9IHc7CkBAIC00ODgsMjggKzQ5MCwyOCBAQAogfTsKIAogc3RhdGljIGNvbnN0IGV4dGVudGlvbl9tYXBfdCBnRXh0ZW50aW9uTWFwW10gPSB7Ci0gICAgeyAiZWdsU3dhcFJlY3RhbmdsZUFORFJPSUQiLCAgICAgICAgICAgICh2b2lkKCopKCkpJmVnbFN3YXBSZWN0YW5nbGVBTkRST0lEIH0sCi0gICAgeyAiZ2xEcmF3VGV4c09FUyIsICAgICAgICAgICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsRHJhd1RleHNPRVMgfSwKLSAgICB7ICJnbERyYXdUZXhpT0VTIiwgICAgICAgICAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xEcmF3VGV4aU9FUyB9LAotICAgIHsgImdsRHJhd1RleGZPRVMiLCAgICAgICAgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbERyYXdUZXhmT0VTIH0sCi0gICAgeyAiZ2xEcmF3VGV4eE9FUyIsICAgICAgICAgICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsRHJhd1RleHhPRVMgfSwKLSAgICB7ICJnbERyYXdUZXhzdk9FUyIsICAgICAgICAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xEcmF3VGV4c3ZPRVMgfSwKLSAgICB7ICJnbERyYXdUZXhpdk9FUyIsICAgICAgICAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xEcmF3VGV4aXZPRVMgfSwKLSAgICB7ICJnbERyYXdUZXhmdk9FUyIsICAgICAgICAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xEcmF3VGV4ZnZPRVMgfSwKLSAgICB7ICJnbERyYXdUZXh4dk9FUyIsICAgICAgICAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xEcmF3VGV4eHZPRVMgfSwKLSAgICB7ICJnbFF1ZXJ5TWF0cml4eE9FUyIsICAgICAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xRdWVyeU1hdHJpeHhPRVMgfSwKLSAgICB7ICJnbENsaXBQbGFuZWYiLCAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xDbGlwUGxhbmVmIH0sCi0gICAgeyAiZ2xDbGlwUGxhbmV4IiwgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsQ2xpcFBsYW5leCB9LAotICAgIHsgImdsQmluZEJ1ZmZlciIsICAgICAgICAgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbEJpbmRCdWZmZXIgfSwKLSAgICB7ICJnbEJ1ZmZlckRhdGEiLCAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xCdWZmZXJEYXRhIH0sCi0gICAgeyAiZ2xCdWZmZXJTdWJEYXRhIiwgICAgICAgICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsQnVmZmVyU3ViRGF0YSB9LAotICAgIHsgImdsRGVsZXRlQnVmZmVycyIsICAgICAgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbERlbGV0ZUJ1ZmZlcnMgfSwKLSAgICB7ICJnbEdlbkJ1ZmZlcnMiLCAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xHZW5CdWZmZXJzIH0sCisgICAgeyAiZWdsU3dhcFJlY3RhbmdsZUFORFJPSUQiLCAgICAodm9pZCgqKSgpKSZlZ2xTd2FwUmVjdGFuZ2xlQU5EUk9JRCB9LAorICAgIHsgImdsRHJhd1RleHNPRVMiLCAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xEcmF3VGV4c09FUyB9LAorICAgIHsgImdsRHJhd1RleGlPRVMiLCAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xEcmF3VGV4aU9FUyB9LAorICAgIHsgImdsRHJhd1RleGZPRVMiLCAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xEcmF3VGV4Zk9FUyB9LAorICAgIHsgImdsRHJhd1RleHhPRVMiLCAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xEcmF3VGV4eE9FUyB9LAorICAgIHsgImdsRHJhd1RleHN2T0VTIiwgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xEcmF3VGV4c3ZPRVMgfSwKKyAgICB7ICJnbERyYXdUZXhpdk9FUyIsICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsRHJhd1RleGl2T0VTIH0sCisgICAgeyAiZ2xEcmF3VGV4ZnZPRVMiLCAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbERyYXdUZXhmdk9FUyB9LAorICAgIHsgImdsRHJhd1RleHh2T0VTIiwgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xEcmF3VGV4eHZPRVMgfSwKKyAgICB7ICJnbFF1ZXJ5TWF0cml4eE9FUyIsICAgICAgICAgICh2b2lkKCopKCkpJmdsUXVlcnlNYXRyaXh4T0VTIH0sCisgICAgeyAiZ2xDbGlwUGxhbmVmIiwgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbENsaXBQbGFuZWYgfSwKKyAgICB7ICJnbENsaXBQbGFuZXgiLCAgICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsQ2xpcFBsYW5leCB9LAorICAgIHsgImdsQmluZEJ1ZmZlciIsICAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xCaW5kQnVmZmVyIH0sCisgICAgeyAiZ2xCdWZmZXJEYXRhIiwgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbEJ1ZmZlckRhdGEgfSwKKyAgICB7ICJnbEJ1ZmZlclN1YkRhdGEiLCAgICAgICAgICAgICh2b2lkKCopKCkpJmdsQnVmZmVyU3ViRGF0YSB9LAorICAgIHsgImdsRGVsZXRlQnVmZmVycyIsICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xEZWxldGVCdWZmZXJzIH0sCisgICAgeyAiZ2xHZW5CdWZmZXJzIiwgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbEdlbkJ1ZmZlcnMgfSwKIH07CiAKIC8qIAogICogSW4gdGhlIGxpc3RzIGJlbG93LCBhdHRyaWJ1dGVzIG5hbWVzIE1VU1QgYmUgc29ydGVkLgotICogQWRkaXRpbm5hbHksIGFsbCBjb25maWdzIG11c3QgYmUgc29ydGVkIGFjY29yZGluZyB0bworICogQWRkaXRpb25hbGx5LCBhbGwgY29uZmlncyBtdXN0IGJlIHNvcnRlZCBhY2NvcmRpbmcgdG8KICAqIHRoZSBFR0wgc3BlY2lmaWNhdGlvbi4KICAqLwogCkBAIC01MTcsOSArNTE5LDEwIEBACiAgICAgICAgIHsgRUdMX1NURU5DSUxfU0laRSwgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgeyBFR0xfQ09ORklHX0NBVkVBVCwgICAgICAgICAgICAgIEVHTF9TTE9XX0NPTkZJRyAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICB7IEVHTF9MRVZFTCwgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgIHsgRUdMX01BWF9QQlVGRkVSX0hFSUdIVCwgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgeyBFR0xfTUFYX1BCVUZGRVJfUElYRUxTLCAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICB7IEVHTF9NQVhfUEJVRkZFUl9XSURUSCwgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgIHsgRUdMX01BWF9QQlVGRkVSX0hFSUdIVCwgICAgICAgICBHR0xfTUFYX1ZJRVdQT1JUX0RJTVMgICAgICAgICAgICAgfSwKKyAgICAgICAgeyBFR0xfTUFYX1BCVUZGRVJfUElYRUxTLCAgICAgICAgIAorICAgICAgICAgICAgICAgIEdHTF9NQVhfVklFV1BPUlRfRElNUypHR0xfTUFYX1ZJRVdQT1JUX0RJTVMgICAgICAgICAgICAgICAgIH0sCisgICAgICAgIHsgRUdMX01BWF9QQlVGRkVSX1dJRFRILCAgICAgICAgICBHR0xfTUFYX1ZJRVdQT1JUX0RJTVMgICAgICAgICAgICAgfSwKICAgICAgICAgeyBFR0xfTkFUSVZFX1JFTkRFUkFCTEUsICAgICAgICAgIEVHTF9UUlVFICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICB7IEVHTF9OQVRJVkVfVklTVUFMX0lELCAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgIHsgRUdMX05BVElWRV9WSVNVQUxfVFlQRSwgICAgICAgICBHR0xfUElYRUxfRk9STUFUX1JHQl81NjUgICAgICAgICAgfSwKQEAgLTUzNiw0OSArNTM5LDcyIEBACiB9OwogCiAvLyBUaGVzZSBjb25maWdzIGNhbiBvdmVycmlkZSB0aGUgYmFzZSBhdHRyaWJ1dGUgbGlzdAorLy8gTk9URTogd2hlbiBhZGRpbmcgYSBjb25maWcgaGVyZSwgZG9uJ3QgZm9yZ2V0IHRvIHVwZGF0ZSBlZ2xDcmVhdGUqU3VyZmFjZSgpCiAKIHN0YXRpYyBjb25maWdfcGFpcl90IGNvbnN0IGNvbmZpZ18wX2F0dHJpYnV0ZV9saXN0W10gPSB7Ci0gICAgICAgIHsgRUdMX0JVRkZFUl9TSVpFLCAgICAgICAgMTYgfSwKLSAgICAgICAgeyBFR0xfQUxQSEFfU0laRSwgICAgICAgICAgMCB9LAotICAgICAgICB7IEVHTF9CTFVFX1NJWkUsICAgICAgICAgICA1IH0sCi0gICAgICAgIHsgRUdMX0dSRUVOX1NJWkUsICAgICAgICAgIDYgfSwKLSAgICAgICAgeyBFR0xfUkVEX1NJWkUsICAgICAgICAgICAgNSB9LAotICAgICAgICB7IEVHTF9ERVBUSF9TSVpFLCAgICAgICAgICAwIH0sCi0gICAgICAgIHsgRUdMX0NPTkZJR19JRCwgICAgICAgICAgIDAgfSwKLSAgICAgICAgeyBFR0xfU1VSRkFDRV9UWVBFLCAgICAgICAgRUdMX1dJTkRPV19CSVQgfCBFR0xfUElYTUFQX0JJVCB9LAorICAgICAgICB7IEVHTF9CVUZGRVJfU0laRSwgICAgIDE2IH0sCisgICAgICAgIHsgRUdMX0FMUEhBX1NJWkUsICAgICAgIDAgfSwKKyAgICAgICAgeyBFR0xfQkxVRV9TSVpFLCAgICAgICAgNSB9LAorICAgICAgICB7IEVHTF9HUkVFTl9TSVpFLCAgICAgICA2IH0sCisgICAgICAgIHsgRUdMX1JFRF9TSVpFLCAgICAgICAgIDUgfSwKKyAgICAgICAgeyBFR0xfREVQVEhfU0laRSwgICAgICAgMCB9LAorICAgICAgICB7IEVHTF9DT05GSUdfSUQsICAgICAgICAwIH0sCisgICAgICAgIHsgRUdMX1NVUkZBQ0VfVFlQRSwgICAgIEVHTF9XSU5ET1dfQklUfEVHTF9QQlVGRkVSX0JJVHxFR0xfUElYTUFQX0JJVCB9LAogfTsKIAogc3RhdGljIGNvbmZpZ19wYWlyX3QgY29uc3QgY29uZmlnXzFfYXR0cmlidXRlX2xpc3RbXSA9IHsKLSAgICAgICAgeyBFR0xfQlVGRkVSX1NJWkUsICAgICAgICAxNiB9LAotICAgICAgICB7IEVHTF9BTFBIQV9TSVpFLCAgICAgICAgICAwIH0sCi0gICAgICAgIHsgRUdMX0JMVUVfU0laRSwgICAgICAgICAgIDUgfSwKLSAgICAgICAgeyBFR0xfR1JFRU5fU0laRSwgICAgICAgICAgNiB9LAotICAgICAgICB7IEVHTF9SRURfU0laRSwgICAgICAgICAgICA1IH0sCi0gICAgICAgIHsgRUdMX0RFUFRIX1NJWkUsICAgICAgICAgMTYgfSwKLSAgICAgICAgeyBFR0xfQ09ORklHX0lELCAgICAgICAgICAgMSB9LAotICAgICAgICB7IEVHTF9TVVJGQUNFX1RZUEUsICAgICAgICBFR0xfV0lORE9XX0JJVCB8IEVHTF9QSVhNQVBfQklUIH0sCisgICAgICAgIHsgRUdMX0JVRkZFUl9TSVpFLCAgICAgMTYgfSwKKyAgICAgICAgeyBFR0xfQUxQSEFfU0laRSwgICAgICAgMCB9LAorICAgICAgICB7IEVHTF9CTFVFX1NJWkUsICAgICAgICA1IH0sCisgICAgICAgIHsgRUdMX0dSRUVOX1NJWkUsICAgICAgIDYgfSwKKyAgICAgICAgeyBFR0xfUkVEX1NJWkUsICAgICAgICAgNSB9LAorICAgICAgICB7IEVHTF9ERVBUSF9TSVpFLCAgICAgIDE2IH0sCisgICAgICAgIHsgRUdMX0NPTkZJR19JRCwgICAgICAgIDEgfSwKKyAgICAgICAgeyBFR0xfU1VSRkFDRV9UWVBFLCAgICAgRUdMX1dJTkRPV19CSVR8RUdMX1BCVUZGRVJfQklUfEVHTF9QSVhNQVBfQklUIH0sCiB9OwogCiBzdGF0aWMgY29uZmlnX3BhaXJfdCBjb25zdCBjb25maWdfMl9hdHRyaWJ1dGVfbGlzdFtdID0gewotICAgICAgICB7IEVHTF9CVUZGRVJfU0laRSwgICAgICAgIDMyIH0sCi0gICAgICAgIHsgRUdMX0FMUEhBX1NJWkUsICAgICAgICAgIDggfSwKLSAgICAgICAgeyBFR0xfQkxVRV9TSVpFLCAgICAgICAgICAgOCB9LAotICAgICAgICB7IEVHTF9HUkVFTl9TSVpFLCAgICAgICAgICA4IH0sCi0gICAgICAgIHsgRUdMX1JFRF9TSVpFLCAgICAgICAgICAgIDggfSwKLSAgICAgICAgeyBFR0xfREVQVEhfU0laRSwgICAgICAgICAgMCB9LAotICAgICAgICB7IEVHTF9DT05GSUdfSUQsICAgICAgICAgICAyIH0sCi0gICAgICAgIHsgRUdMX1NVUkZBQ0VfVFlQRSwgICAgICAgIEVHTF9XSU5ET1dfQklUIHwgRUdMX1BJWE1BUF9CSVQgfSwKKyAgICAgICAgeyBFR0xfQlVGRkVSX1NJWkUsICAgICAzMiB9LAorICAgICAgICB7IEVHTF9BTFBIQV9TSVpFLCAgICAgICA4IH0sCisgICAgICAgIHsgRUdMX0JMVUVfU0laRSwgICAgICAgIDggfSwKKyAgICAgICAgeyBFR0xfR1JFRU5fU0laRSwgICAgICAgOCB9LAorICAgICAgICB7IEVHTF9SRURfU0laRSwgICAgICAgICA4IH0sCisgICAgICAgIHsgRUdMX0RFUFRIX1NJWkUsICAgICAgIDAgfSwKKyAgICAgICAgeyBFR0xfQ09ORklHX0lELCAgICAgICAgMiB9LAorICAgICAgICB7IEVHTF9TVVJGQUNFX1RZUEUsICAgICBFR0xfV0lORE9XX0JJVHxFR0xfUEJVRkZFUl9CSVR8RUdMX1BJWE1BUF9CSVQgfSwKIH07CiAKIHN0YXRpYyBjb25maWdfcGFpcl90IGNvbnN0IGNvbmZpZ18zX2F0dHJpYnV0ZV9saXN0W10gPSB7Ci0gICAgICAgIHsgRUdMX0JVRkZFUl9TSVpFLCAgICAgICAgMzIgfSwKLSAgICAgICAgeyBFR0xfQUxQSEFfU0laRSwgICAgICAgICAgOCB9LAotICAgICAgICB7IEVHTF9CTFVFX1NJWkUsICAgICAgICAgICA4IH0sCi0gICAgICAgIHsgRUdMX0dSRUVOX1NJWkUsICAgICAgICAgIDggfSwKLSAgICAgICAgeyBFR0xfUkVEX1NJWkUsICAgICAgICAgICAgOCB9LAotICAgICAgICB7IEVHTF9ERVBUSF9TSVpFLCAgICAgICAgIDE2IH0sCi0gICAgICAgIHsgRUdMX0NPTkZJR19JRCwgICAgICAgICAgIDMgfSwKLSAgICAgICAgeyBFR0xfU1VSRkFDRV9UWVBFLCAgICAgICAgRUdMX1dJTkRPV19CSVQgfCBFR0xfUElYTUFQX0JJVCB9LAorICAgICAgICB7IEVHTF9CVUZGRVJfU0laRSwgICAgIDMyIH0sCisgICAgICAgIHsgRUdMX0FMUEhBX1NJWkUsICAgICAgIDggfSwKKyAgICAgICAgeyBFR0xfQkxVRV9TSVpFLCAgICAgICAgOCB9LAorICAgICAgICB7IEVHTF9HUkVFTl9TSVpFLCAgICAgICA4IH0sCisgICAgICAgIHsgRUdMX1JFRF9TSVpFLCAgICAgICAgIDggfSwKKyAgICAgICAgeyBFR0xfREVQVEhfU0laRSwgICAgICAxNiB9LAorICAgICAgICB7IEVHTF9DT05GSUdfSUQsICAgICAgICAzIH0sCisgICAgICAgIHsgRUdMX1NVUkZBQ0VfVFlQRSwgICAgIEVHTF9XSU5ET1dfQklUfEVHTF9QQlVGRkVSX0JJVHxFR0xfUElYTUFQX0JJVCB9LAorfTsKKworc3RhdGljIGNvbmZpZ19wYWlyX3QgY29uc3QgY29uZmlnXzRfYXR0cmlidXRlX2xpc3RbXSA9IHsKKyAgICAgICAgeyBFR0xfQlVGRkVSX1NJWkUsICAgICAgOCB9LAorICAgICAgICB7IEVHTF9BTFBIQV9TSVpFLCAgICAgICA4IH0sCisgICAgICAgIHsgRUdMX0JMVUVfU0laRSwgICAgICAgIDAgfSwKKyAgICAgICAgeyBFR0xfR1JFRU5fU0laRSwgICAgICAgMCB9LAorICAgICAgICB7IEVHTF9SRURfU0laRSwgICAgICAgICAwIH0sCisgICAgICAgIHsgRUdMX0RFUFRIX1NJWkUsICAgICAgIDAgfSwKKyAgICAgICAgeyBFR0xfQ09ORklHX0lELCAgICAgICAgNCB9LAorICAgICAgICB7IEVHTF9TVVJGQUNFX1RZUEUsICAgICBFR0xfV0lORE9XX0JJVHxFR0xfUEJVRkZFUl9CSVR8RUdMX1BJWE1BUF9CSVQgfSwKK307CisKK3N0YXRpYyBjb25maWdfcGFpcl90IGNvbnN0IGNvbmZpZ181X2F0dHJpYnV0ZV9saXN0W10gPSB7CisgICAgICAgIHsgRUdMX0JVRkZFUl9TSVpFLCAgICAgIDggfSwKKyAgICAgICAgeyBFR0xfQUxQSEFfU0laRSwgICAgICAgOCB9LAorICAgICAgICB7IEVHTF9CTFVFX1NJWkUsICAgICAgICAwIH0sCisgICAgICAgIHsgRUdMX0dSRUVOX1NJWkUsICAgICAgIDAgfSwKKyAgICAgICAgeyBFR0xfUkVEX1NJWkUsICAgICAgICAgMCB9LAorICAgICAgICB7IEVHTF9ERVBUSF9TSVpFLCAgICAgIDE2IH0sCisgICAgICAgIHsgRUdMX0NPTkZJR19JRCwgICAgICAgIDUgfSwKKyAgICAgICAgeyBFR0xfU1VSRkFDRV9UWVBFLCAgICAgRUdMX1dJTkRPV19CSVR8RUdMX1BCVUZGRVJfQklUfEVHTF9QSVhNQVBfQklUIH0sCiB9OwogCiBzdGF0aWMgY29uZmlnc190IGNvbnN0IGdDb25maWdzW10gPSB7CkBAIC01ODYsNiArNjEyLDggQEAKICAgICAgICAgeyBjb25maWdfMV9hdHRyaWJ1dGVfbGlzdCwgTkVMRU0oY29uZmlnXzFfYXR0cmlidXRlX2xpc3QpIH0sCiAgICAgICAgIHsgY29uZmlnXzJfYXR0cmlidXRlX2xpc3QsIE5FTEVNKGNvbmZpZ18yX2F0dHJpYnV0ZV9saXN0KSB9LAogICAgICAgICB7IGNvbmZpZ18zX2F0dHJpYnV0ZV9saXN0LCBORUxFTShjb25maWdfM19hdHRyaWJ1dGVfbGlzdCkgfSwKKyAgICAgICAgeyBjb25maWdfNF9hdHRyaWJ1dGVfbGlzdCwgTkVMRU0oY29uZmlnXzRfYXR0cmlidXRlX2xpc3QpIH0sCisgICAgICAgIHsgY29uZmlnXzVfYXR0cmlidXRlX2xpc3QsIE5FTEVNKGNvbmZpZ181X2F0dHJpYnV0ZV9saXN0KSB9LAogfTsKIAogc3RhdGljIGNvbmZpZ19tYW5hZ2VtZW50X3QgY29uc3QgZ0NvbmZpZ01hbmFnZW1lbnRbXSA9IHsKQEAgLTY2OSw3ICs2OTcsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gYXR0cmlidXRlIG5vbnQgZm91bmQuIHRoaXMgc2hvdWxkIE5FVkVSIGhhcHBlbi4KKyAgICAgICAgICAgIC8vIGF0dHJpYnV0ZSBub3QgZm91bmQuIHRoaXMgc2hvdWxkIE5FVkVSIGhhcHBlbi4KICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIGVycm9yLCB0aGlzIGF0dHJpYnV0ZSBkb2Vzbid0IGV4aXN0CkBAIC03NzksMTEgKzgwNywxOSBAQAogICAgICAgICBwaXhlbEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4OyAKICAgICAgICAgZGVwdGhGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX1pfMTY7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAgcGl4ZWxGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX0FfODsgCisgICAgICAgIGRlcHRoRm9ybWF0ID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgICBwaXhlbEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfQV84OyAKKyAgICAgICAgZGVwdGhGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX1pfMTY7CisgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX01BVENILCBFR0xfTk9fU1VSRkFDRSk7CiAgICAgfQogCi0gICAgLy8gWFhYOiB3ZSBkb24ndCBoYXZlIGFjY2VzcyB0byB0aGUgcGl4ZWxGb3JtYXQgaGVyZSBqdXN0IHlldC4KKyAgICAvLyBGSVhNRTogd2UgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIHBpeGVsRm9ybWF0IGhlcmUganVzdCB5ZXQuCiAgICAgLy8gKGl0J3MgcG9zc2libGUgdGhhdCB0aGUgc3VyZmFjZSBpcyBub3QgZnVsbHkgaW5pdGlhbGl6ZWQpCiAgICAgLy8gbWF5YmUgdGhpcyBzaG91bGQgYmUgZG9uZSBhZnRlciB0aGUgcGFnZS1mbGlwCiAgICAgLy9pZiAoRUdMaW50KGluZm8uZm9ybWF0KSAhPSBwaXhlbEZvcm1hdCkKQEAgLTg0MCw2ICs4NzYsMTQgQEAKICAgICAgICAgcGl4ZWxGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX1JHQkFfODg4ODsgCiAgICAgICAgIGRlcHRoRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9aXzE2OwogICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgIHBpeGVsRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9BXzg7IAorICAgICAgICBkZXB0aEZvcm1hdCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgICAgcGl4ZWxGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX0FfODsgCisgICAgICAgIGRlcHRoRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9aXzE2OworICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9NQVRDSCwgRUdMX05PX1NVUkZBQ0UpOwogICAgIH0KQEAgLTg5Niw2ICs5NDAsMTQgQEAKICAgICAgICAgcGl4ZWxGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX1JHQkFfODg4ODsgCiAgICAgICAgIGRlcHRoRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9aXzE2OwogICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgIHBpeGVsRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9BXzg7IAorICAgICAgICBkZXB0aEZvcm1hdCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgICAgcGl4ZWxGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX0FfODsgCisgICAgICAgIGRlcHRoRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9aXzE2OworICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9NQVRDSCwgRUdMX05PX1NVUkZBQ0UpOwogICAgIH0KQEAgLTk3OSw3ICsxMDMxLDcgQEAKICAgICBFR0xCb29sZWFuIHJlcyA9IEVHTF9UUlVFOwogICAgIGVnbF9kaXNwbGF5X3QmIGQgPSBlZ2xfZGlzcGxheV90OjpnZXRfZGlzcGxheShkcHkpOwogICAgIGlmIChhbmRyb2lkX2F0b21pY19kZWMoJmQuaW5pdGlhbGl6ZWQpID09IDEpIHsKLSAgICAgICAgLy8gVE9ETzogZGVzdHJveSBhbGwgcmVzb3VyY2VzIChzdXJmYWNlcywgY29udGV4dGVzLCBldGMuLi4pCisgICAgICAgIC8vIFRPRE86IGRlc3Ryb3kgYWxsIHJlc291cmNlcyAoc3VyZmFjZXMsIGNvbnRleHRzLCBldGMuLi4pCiAgICAgICAgIC8vcHRocmVhZF9tdXRleF9sb2NrKCZnSW5pdE11dGV4KTsKICAgICAgICAgLy9wdGhyZWFkX211dGV4X3VubG9jaygmZ0luaXRNdXRleCk7CiAgICAgfQpAQCAtMTEwNSwxMSArMTE1Nyw3IEBACiBFR0xTdXJmYWNlIGVnbENyZWF0ZVBidWZmZXJTdXJmYWNlKCBFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpCiB7Ci0gICAgLy8gbm9uZSBvZiBvdXIgY29uZmlncyBzdXBwb3J0IHBidWZmZXJzCi0gICAgLy8gKGluIGZhY3QgaXQncyB3b3JraW5nIGJ1dCBzaW5jZSB3ZSBjYW4ndCB1c2UgdGhlbSBhcyAKLSAgICAvLyB0ZXh0dXJlcyB5ZXQsIGl0J3Mgbm90IHVzZWZ1bCBhdCBhbGwpCi0gICAgLy9jcmVhdGVQYnVmZmVyU3VyZmFjZShkcHksIGNvbmZpZywgYXR0cmliX2xpc3QpOwotICAgIHJldHVybiBFR0xfTk9fU1VSRkFDRTsKKyAgICByZXR1cm4gY3JlYXRlUGJ1ZmZlclN1cmZhY2UoZHB5LCBjb25maWcsIGF0dHJpYl9saXN0KTsKIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogRUdMQm9vbGVhbiBlZ2xEZXN0cm95U3VyZmFjZShFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBlZ2xTdXJmYWNlKQpAQCAtMTIzMSw2ICsxMjc5LDEzIEBACiAgICAgfQogCiAgICAgRUdMQ29udGV4dCBjdXJyZW50X2N0eCA9IEVHTF9OT19DT05URVhUOworICAgIAorICAgIGlmICgocmVhZCA9PSBFR0xfTk9fU1VSRkFDRSAmJiBkcmF3ID09IEVHTF9OT19TVVJGQUNFKSAmJiAoY3R4ICE9IEVHTF9OT19DT05URVhUKSkKKyAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfTUFUQ0gsIEVHTF9GQUxTRSk7CisKKyAgICBpZiAoKHJlYWQgIT0gRUdMX05PX1NVUkZBQ0UgfHwgZHJhdyAhPSBFR0xfTk9fU1VSRkFDRSkgJiYgKGN0eCA9PSBFR0xfTk9fQ09OVEVYVCkpCisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX01BVENILCBFR0xfRkFMU0UpOworCiAgICAgaWYgKGN0eCA9PSBFR0xfTk9fQ09OVEVYVCkgewogICAgICAgICAvLyBpZiB3ZSdyZSBkZXRhY2hpbmcsIHdlIG5lZWQgdGhlIGN1cnJlbnQgY29udGV4dAogICAgICAgICBjdXJyZW50X2N0eCA9IChFR0xDb250ZXh0KWdldEdsVGhyZWFkU3BlY2lmaWMoKTsKQEAgLTE0ODYsNyArMTU0MSw3IEBACiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEFuZHJvaWQgZXh0ZW50aW9ucworLy8gQW5kcm9pZCBleHRlbnNpb25zCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHZvaWQgKCplZ2xHZXRQcm9jQWRkcmVzcyAoY29uc3QgY2hhciAqcHJvY25hbWUpKSgpCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL2xpZ2h0LmNwcCBiL29wZW5nbC9saWJhZ2wvbGlnaHQuY3BwCmluZGV4IDg3NzI1Y2IuLjI1YzQxZDAgMTAwNjQ0Ci0tLSBhL29wZW5nbC9saWJhZ2wvbGlnaHQuY3BwCisrKyBiL29wZW5nbC9saWJhZ2wvbGlnaHQuY3BwCkBAIC0xMTcsMTEgKzExNywxMSBAQAogfQogCiBzdGF0aWMgR0xmaXhlZCBmb2dfbGluZWFyKG9nbGVzX2NvbnRleHRfdCogYywgR0xmaXhlZCB6KSB7Ci0gICAgcmV0dXJuIGNsYW1wRihnZ2xNdWx4KChjLT5mb2cuZW5kIC0geiksIGMtPmZvZy5pbnZFbmRNaW51c1N0YXJ0KSk7CisgICAgcmV0dXJuIGNsYW1wRihnZ2xNdWx4KChjLT5mb2cuZW5kIC0gKCh6PDApPy16OnopKSwgYy0+Zm9nLmludkVuZE1pbnVzU3RhcnQpKTsKIH0KIAogc3RhdGljIEdMZml4ZWQgZm9nX2V4cChvZ2xlc19jb250ZXh0X3QqIGMsIEdMZml4ZWQgeikgewotICAgIGNvbnN0IGZsb2F0IGUgPSBmaXhlZFRvRmxvYXQoZ2dsTXVseChjLT5mb2cuZGVuc2l0eSwgeikpOworICAgIGNvbnN0IGZsb2F0IGUgPSBmaXhlZFRvRmxvYXQoZ2dsTXVseChjLT5mb2cuZGVuc2l0eSwgKCh6PDApPy16OnopKSk7CiAgICAgcmV0dXJuIGNsYW1wRihnZ2xGbG9hdFRvRml4ZWQoZmFzdGV4cGYoLWUpKSk7CiB9CiAKQEAgLTU1NiwxMSArNTU2LDExIEBACiAgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEdMX0ZPR19TVEFSVDoKLSAgICAgICAgYy0+Zm9nLnN0YXJ0ID0gZ2dsQ2xhbXB4KHBhcmFtKTsKKyAgICAgICAgYy0+Zm9nLnN0YXJ0ID0gcGFyYW07CiAgICAgICAgIGMtPmZvZy5pbnZFbmRNaW51c1N0YXJ0ID0gZ2dsUmVjaXAoYy0+Zm9nLmVuZCAtIGMtPmZvZy5zdGFydCk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgR0xfRk9HX0VORDoKLSAgICAgICAgYy0+Zm9nLmVuZCA9IGdnbENsYW1weChwYXJhbSk7CisgICAgICAgIGMtPmZvZy5lbmQgPSBwYXJhbTsKICAgICAgICAgYy0+Zm9nLmludkVuZE1pbnVzU3RhcnQgPSBnZ2xSZWNpcChjLT5mb2cuZW5kIC0gYy0+Zm9nLnN0YXJ0KTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBHTF9GT0dfTU9ERToKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvbWF0cml4LmNwcCBiL29wZW5nbC9saWJhZ2wvbWF0cml4LmNwcAppbmRleCA0NDFkYTM4Li5mMTc1Y2RhIDEwMDY0NAotLS0gYS9vcGVuZ2wvbGliYWdsL21hdHJpeC5jcHAKKysrIGIvb3BlbmdsL2xpYmFnbC9tYXRyaXguY3BwCkBAIC05OCw4ICs5OCw5IEBACiAgICAgYy0+YXJyYXlzLnBlcnNwZWN0aXZlID0gKGMtPmNsaXBQbGFuZXMuZW5hYmxlKSA/CiAgICAgICAgIG9nbGVzX3ZlcnRleF9jbGlwQWxsUGVyc3BlY3RpdmUzRCA6IG9nbGVzX3ZlcnRleF9wZXJzcGVjdGl2ZTNEOwogICAgIGlmIChlbmFibGVzICYgKEdHTF9FTkFCTEVfREVQVEhfVEVTVHxHR0xfRU5BQkxFX0ZPRykpIHsKLSAgICAgICAgYy0+YXJyYXlzLnBlcnNwZWN0aXZlID0gKGMtPmNsaXBQbGFuZXMuZW5hYmxlKSA/Ci0gICAgICAgICAgICBvZ2xlc192ZXJ0ZXhfY2xpcEFsbFBlcnNwZWN0aXZlM0RaIDogb2dsZXNfdmVydGV4X3BlcnNwZWN0aXZlM0RaOworICAgICAgICBjLT5hcnJheXMucGVyc3BlY3RpdmUgPSBvZ2xlc192ZXJ0ZXhfcGVyc3BlY3RpdmUzRFo7CisgICAgICAgIGlmIChjLT5jbGlwUGxhbmVzLmVuYWJsZSB8fCAoZW5hYmxlcyZHR0xfRU5BQkxFX0ZPRykpCisgICAgICAgICAgICBjLT5hcnJheXMucGVyc3BlY3RpdmUgPSBvZ2xlc192ZXJ0ZXhfY2xpcEFsbFBlcnNwZWN0aXZlM0RaOwogICAgIH0KICAgICBpZiAoKGMtPmFycmF5cy52ZXJ0ZXguc2l6ZSAhPSA0KSAmJgogICAgICAgICAoYy0+dHJhbnNmb3Jtcy5tdnA0LmZsYWdzICYgdHJhbnNmb3JtX3Q6OkZMQUdTXzJEX1BST0pFQ1RJT04pKSB7CmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL3ByaW1pdGl2ZXMuY3BwIGIvb3BlbmdsL2xpYmFnbC9wcmltaXRpdmVzLmNwcAppbmRleCAyMGU4ZDM3Li5mMTY0YzAyIDEwMDY0NAotLS0gYS9vcGVuZ2wvbGliYWdsL3ByaW1pdGl2ZXMuY3BwCisrKyBiL29wZW5nbC9saWJhZ2wvcHJpbWl0aXZlcy5jcHAKQEAgLTEzMyw3ICsxMzMsNyBAQAogewogICAgIGlmICghKHYtPmZsYWdzICYgdmVydGV4X3Q6OkxJVCkpIHsKICAgICAgICAgdi0+ZmxhZ3MgfD0gdmVydGV4X3Q6OkxJVDsKLSAgICAgICAgdi0+Zm9nID0gYy0+Zm9nLmZvZyhjLCB2LT53aW5kb3cueik7CisgICAgICAgIHYtPmZvZyA9IGMtPmZvZy5mb2coYywgdi0+ZXllLnopOwogICAgICAgICBjb25zdCBHTHZvaWQqIGNwID0gYy0+YXJyYXlzLmNvbG9yLmVsZW1lbnQoCiAgICAgICAgICAgICAgICAgdi0+aW5kZXggJiB2ZXJ0ZXhfY2FjaGVfdDo6SU5ERVhfTUFTSyk7CiAgICAgICAgIGMtPmFycmF5cy5jb2xvci5mZXRjaChjLCB2LT5jb2xvci52LCBjcCk7CkBAIC0xNDQsMTQgKzE0NCwxNCBAQAogewogICAgIGlmICghKHYtPmZsYWdzICYgdmVydGV4X3Q6OkxJVCkpIHsKICAgICAgICAgdi0+ZmxhZ3MgfD0gdmVydGV4X3Q6OkxJVDsKLSAgICAgICAgdi0+Zm9nID0gYy0+Zm9nLmZvZyhjLCB2LT53aW5kb3cueik7CisgICAgICAgIHYtPmZvZyA9IGMtPmZvZy5mb2coYywgdi0+ZXllLnopOwogICAgIH0KIH0KIHN0YXRpYyBpbmxpbmUKIHZvaWQgbGlnaHRWZXJ0ZXhTbW9vdGhGb2cob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdikKIHsKICAgICBpZiAoISh2LT5mbGFncyAmIHZlcnRleF90OjpMSVQpKSB7Ci0gICAgICAgIHYtPmZvZyA9IGMtPmZvZy5mb2coYywgdi0+d2luZG93LnopOworICAgICAgICB2LT5mb2cgPSBjLT5mb2cuZm9nKGMsIHYtPmV5ZS56KTsKICAgICAgICAgYy0+bGlnaHRpbmcubGlnaHRWZXJ0ZXgoYywgdik7CiAgICAgfQogfQpAQCAtMjQzLDEyICsyNDMsMjAgQEAKICAgICBtX2FyZWEgPSBtX2R4MDEqbV9keTAyICsgKC1tX2R5MTApKm1fZHgyMDsKIH0KIAordm9pZCBjb21wdXRlX2l0ZXJhdG9yc190Ojppbml0TGluZSgKKyAgICAgICAgdmVydGV4X3QgY29uc3QqIHYwLCB2ZXJ0ZXhfdCBjb25zdCogdjEpCit7CisgICAgbV9keDAxID0gbV9keTAyID0gdjEtPndpbmRvdy54IC0gdjAtPndpbmRvdy54OworICAgIG1fZHkxMCA9IG1fZHgyMCA9IHYwLT53aW5kb3cueSAtIHYxLT53aW5kb3cueTsKKyAgICBtX2FyZWEgPSBtX2R4MDEqbV9keTAyICsgKC1tX2R5MTApKm1fZHgyMDsKK30KKwogdm9pZCBjb21wdXRlX2l0ZXJhdG9yc190Ojppbml0TGVycCh2ZXJ0ZXhfdCBjb25zdCogdjAsIHVpbnQzMl90IGVuYWJsZXMpCiB7CiAgICAgbV94MCA9IHYwLT53aW5kb3cueDsKICAgICBtX3kwID0gdjAtPndpbmRvdy55OwogICAgIGNvbnN0IEdHTGNvb3JkIGFyZWEgPSAobV9hcmVhICsgVFJJX0hBTEYpID4+IFRSSV9GUkFDVElPTl9CSVRTOwotICAgIGNvbnN0IEdHTGNvb3JkIG1pbkFyZWEgPSAyOyAvLyBjYW5ub3QgYmUgaW52ZXJzZWQKKyAgICBjb25zdCBHR0xjb29yZCBtaW5BcmVhID0gMjsgLy8gY2Fubm90IGJlIGludmVydGVkCiAgICAgLy8gdHJpYW5nbGVzIHdpdGggYW4gYXJlYSBzbWFsbGVyIHRoYW4gMS4wIGFyZSBub3Qgc21vb3RoLXNoYWRlZAogCiAgICAgaW50IHE9MCwgcz0wLCBkPTA7CkBAIC0zMzYsNiArMzQ0LDIwIEBACiAgICAgaXRbMl0gPSBkY2R5OwogfQogCit2b2lkIGNvbXB1dGVfaXRlcmF0b3JzX3Q6Oml0ZXJhdG9yczAwMzIoaW50NjRfdCogaXQsCisgICAgICAgIGludDMyX3QgYzAsIGludDMyX3QgYzEsIGludDMyX3QgYzIpIGNvbnN0Cit7CisgICAgY29uc3QgaW50IHMgPSBtX2FyZWFfc2NhbGUgLSAxNjsKKyAgICBpbnQzMl90IGRjMDEgPSAoYzEgLSBjMCk+PnM7CisgICAgaW50MzJfdCBkYzAyID0gKGMyIC0gYzApPj5zOworICAgIC8vIDE2LjE2IHggMTYuMTYgPT0gMzIuMzIKKyAgICBpbnQ2NF90IGRjZHggPSBnZ2xNdWxpaShkYzAxLCBtX2R5MDIpICsgZ2dsTXVsaWkoZGMwMiwgbV9keTEwKTsKKyAgICBpbnQ2NF90IGRjZHkgPSBnZ2xNdWxpaShkYzAyLCBtX2R4MDEpICsgZ2dsTXVsaWkoZGMwMSwgbV9keDIwKTsKKyAgICBpdFsgMF0gPSAoYzA8PDE2KSAtICgoZGNkeCptX3gwICsgZGNkeSptX3kwKT4+NCk7CisgICAgaXRbIDFdID0gZGNkeDsKKyAgICBpdFsgMl0gPSBkY2R5OworfQorCiAjaWYgZGVmaW5lZChfX2FybV9fKSAmJiAhZGVmaW5lZChfX3RodW1iX18pCiBpbmxpbmUgdm9pZCBjb21wdXRlX2l0ZXJhdG9yc190OjppdGVyYXRvcnMwMDMyKGludDMyX3QqIGl0LAogICAgICAgICBpbnQzMl90IGMwLCBpbnQzMl90IGMxLCBpbnQzMl90IGMyKSBjb25zdApAQCAtMzQ2LDE2ICszNjgsMTEgQEAKIHZvaWQgY29tcHV0ZV9pdGVyYXRvcnNfdDo6aXRlcmF0b3JzMDAzMihpbnQzMl90KiBpdCwKICAgICAgICAgaW50MzJfdCBjMCwgaW50MzJfdCBjMSwgaW50MzJfdCBjMikgY29uc3QKIHsKLSAgICBjb25zdCBpbnQgcyA9IG1fYXJlYV9zY2FsZSAtIDE2OwotICAgIGludDMyX3QgZGMwMSA9IChjMSAtIGMwKT4+czsKLSAgICBpbnQzMl90IGRjMDIgPSAoYzIgLSBjMCk+PnM7Ci0gICAgLy8gMTYuMTYgeCAxNi4xNiA9PSAzMi4zMgotICAgIGludDY0X3QgZGNkeCA9IGdnbE11bGlpKGRjMDEsIG1fZHkwMikgKyBnZ2xNdWxpaShkYzAyLCBtX2R5MTApOwotICAgIGludDY0X3QgZGNkeSA9IGdnbE11bGlpKGRjMDIsIG1fZHgwMSkgKyBnZ2xNdWxpaShkYzAxLCBtX2R4MjApOwotICAgIGludDMyX3QgYyA9IChjMDw8MTYpIC0gKChkY2R4Km1feDAgKyBkY2R5Km1feTApPj40KTsKLSAgICBpdFsgMF0gPSBjOwotICAgIGl0WyAxXSA9IGRjZHg7Ci0gICAgaXRbIDJdID0gZGNkeTsKKyAgICBpbnQ2NF90IGl0NjRbM107CisgICAgaXRlcmF0b3JzMDAzMihpdCwgYzAsIGMxLCBjMik7CisgICAgaXRbMF0gPSBpdDY0WzBdOworICAgIGl0WzFdID0gaXQ2NFsxXTsKKyAgICBpdFsyXSA9IGl0NjRbMl07CiB9CiAjZW5kaWYKIApAQCAtNDU0LDcgKzQ3MSw3IEBACiAgICAgICAgICAgICBjLT5hcnJheXMuY29sb3IuZmV0Y2goYywgdi0+Y29sb3IudiwgY3ApOwogICAgICAgICB9CiAgICAgICAgIGlmIChlbmFibGVzICYgR0dMX0VOQUJMRV9GT0cpIHsKLSAgICAgICAgICAgIHYtPmZvZyA9IGMtPmZvZy5mb2coYywgdi0+d2luZG93LnopOworICAgICAgICAgICAgdi0+Zm9nID0gYy0+Zm9nLmZvZyhjLCB2LT5leWUueik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTUxNCwyMiArNTMxLDEyIEBACiAKIHZvaWQgcHJpbWl0aXZlX2xpbmUob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSkKIHsKLSAgICAvLyBUaGlzIGlzIGEgY2hlZXp5IGltcGxlbWVudGF0aW9uIG9mIGxpbmUgZHJhd2luZyB0aGF0Ci0gICAgLy8gdXNlcyAyIHRyaWFuZ2xlcyBwZXIgbGluZS4gCi0gICAgLy8gVGhhdCBzYWlkLCBob3cgb2Z0ZW4gbGluZSBkcmF3aW5nIGlzIHVzZWQ/Ci0KICAgICAvLyBnZXQgdGV4dHVyZSBjb29yZGluYXRlcwogICAgIGZldGNoX3RleGNvb3JkKGMsIHYwLCB2MSwgdjEpOwogCiAgICAgLy8gbGlnaHQvc2hhZGUgdGhlIHZlcnRpY2VzIGZpcnN0ICh0aGV5J3JlIGNvcGllZCBiZWxvdykKICAgICBjLT5saWdodGluZy5saWdodFRyaWFuZ2xlKGMsIHYwLCB2MSwgdjEpOwogCi0gICAgdmVydGV4X3Qgdls0XTsKLSAgICB2WzBdID0gKnYwOwotICAgIHZbMV0gPSAqdjE7Ci0gICAgdjAgPSAmdlswXTsKLSAgICB2MSA9ICZ2WzFdOwotCiAgICAgLy8gY2xpcCB0aGUgbGluZSBpZiBuZWVkZWQKICAgICBpZiAoZ2dsX3VubGlrZWx5KCh2MC0+ZmxhZ3MgfCB2MS0+ZmxhZ3MpICYgdmVydGV4X3Q6OkNMSVBfQUxMKSkgewogICAgICAgICB1bnNpZ25lZCBpbnQgY291bnQgPSBjbGlwX2xpbmUoYywgdjAsIHYxKTsKQEAgLTU0Niw4ICs1NTMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdHTF9FTkFCTEVfREVQVEhfVEVTVDsKIAogICAgIGlmIChnZ2xfdW5saWtlbHkoZW5hYmxlcyAmIG1hc2spKSB7Ci0gICAgICAgIGMtPmxlcnAuaW5pdFRyaWFuZ2xlKHYwLCB2MSwgdjEpOwotICAgICAgICBsZXJwX3RyaWFuZ2xlKGMsIHYwLCB2MSwgdjEpOworICAgICAgICBjLT5sZXJwLmluaXRMaW5lKHYwLCB2MSk7CisgICAgICAgIGxlcnBfdHJpYW5nbGUoYywgdjAsIHYxLCB2MCk7CiAgICAgfQogCiAgICAgLy8gcmVuZGVyIG91ciBsaW5lCkBAIC02NTQsMTcgKzY2MSwyNiBAQAogICAgICAgICBjb25zdCBpbnQzMl90IHYweiA9IGNsYW1wWih2MC0+d2luZG93LnopOwogICAgICAgICBjb25zdCBpbnQzMl90IHYxeiA9IGNsYW1wWih2MS0+d2luZG93LnopOwogICAgICAgICBjb25zdCBpbnQzMl90IHYyeiA9IGNsYW1wWih2Mi0+d2luZG93LnopOwotICAgICAgICBsZXJwLml0ZXJhdG9yczAwMzIoaXR6LCB2MHosIHYxeiwgdjJ6KTsKICAgICAgICAgaWYgKGdnbF91bmxpa2VseShjLT5wb2x5Z29uT2Zmc2V0LmVuYWJsZSkpIHsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdW5pdHMgPSAoYy0+cG9seWdvbk9mZnNldC51bml0cyA8PCAxNik7CiAgICAgICAgICAgICBjb25zdCBHTGZpeGVkIGZhY3RvciA9IGMtPnBvbHlnb25PZmZzZXQuZmFjdG9yOwotICAgICAgICAgICAgY29uc3QgR0xmaXhlZCB1bml0cyA9IGMtPnBvbHlnb25PZmZzZXQudW5pdHM7Ci0gICAgICAgICAgICBpbnQzMl90IG1heERlcHRoU2xvcGUgPSBtYXgoYWJzKGl0elsxXSksIGFicyhpdHpbMl0pKTsKLSAgICAgICAgICAgIGludDMyX3Qgb2Zmc2V0ID0gKGludDY0X3QobWF4RGVwdGhTbG9wZSkqZmFjdG9yICsKLSAgICAgICAgICAgICAgICAgICAgKGludDY0X3QodW5pdHMpIDw8IDE2KSkgPj4gMTY7Ci0gICAgICAgICAgICBpdHpbMF0gKz0gb2Zmc2V0OyAvLyBYWFg6IHRoaXMgY2FuIGNhdXNlIG92ZXJmbG93cworICAgICAgICAgICAgaWYgKGZhY3RvcikgeworICAgICAgICAgICAgICAgIGludDY0X3QgaXR6NjRbM107CisgICAgICAgICAgICAgICAgbGVycC5pdGVyYXRvcnMwMDMyKGl0ejY0LCB2MHosIHYxeiwgdjJ6KTsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IG1heERlcHRoU2xvcGUgPSBtYXgoaXR6NjRbMV0sIGl0ejY0WzJdKTsKKyAgICAgICAgICAgICAgICBpdHpbMF0gPSB1aW50MzJfdChpdHo2NFswXSkgCisgICAgICAgICAgICAgICAgICAgICAgICArIHVpbnQzMl90KChtYXhEZXB0aFNsb3BlKmZhY3Rvcik+PjE2KSArIHVuaXRzOworICAgICAgICAgICAgICAgIGl0elsxXSA9IHVpbnQzMl90KGl0ejY0WzFdKTsKKyAgICAgICAgICAgICAgICBpdHpbMl0gPSB1aW50MzJfdChpdHo2NFsyXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxlcnAuaXRlcmF0b3JzMDAzMihpdHosIHYweiwgdjF6LCB2MnopOworICAgICAgICAgICAgICAgIGl0elswXSArPSB1bml0czsgCisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsZXJwLml0ZXJhdG9yczAwMzIoaXR6LCB2MHosIHYxeiwgdjJ6KTsKICAgICAgICAgfQogICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnpHcmFkM3h2KGMsIGl0eik7Ci0gICAgfQorICAgIH0gICAgCiAKICAgICBpZiAoZ2dsX3VubGlrZWx5KGVuYWJsZXMgJiBHR0xfRU5BQkxFX0ZPRykpIHsKICAgICAgICAgR0xmaXhlZCBpdGZbM107CkBAIC04ODAsMTEgKzg5NiwxMSBAQAogICAgICAgICAgICAgICAgIHZlcnRleF90Kiogb3V0cHV0ID0gb3ZsOwogICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBvYyA9IDA7CiAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNlbnRpbmVsID0gMDsKLSAgICAgICAgICAgICAgICAvLyBwcmV2aW91cyB2ZXJ0aWNlLCBjb21wdXRlIGRpc3RhbmNlIHRvIHRoZSBwbGFuZQorICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzIHZlcnRleCwgY29tcHV0ZSBkaXN0YW5jZSB0byB0aGUgcGxhbmUKICAgICAgICAgICAgICAgICB2ZXJ0ZXhfdCogcyA9IGl2bFtpYy0xXTsKICAgICAgICAgICAgICAgICBjb25zdCB2ZWM0X3QmIGVxdWF0aW9uID0gYy0+Y2xpcFBsYW5lcy5wbGFuZVtwbGFuZV0uZXF1YXRpb247CiAgICAgICAgICAgICAgICAgR0xmaXhlZCBzZCA9IGRvdDQoZXF1YXRpb24udiwgcy0+ZXllLnYpOwotICAgICAgICAgICAgICAgIC8vIGNsaXAgZWFjaCB2ZXJ0aWNlIGFnYWluc3QgdGhpcyBwbGFuZS4uLgorICAgICAgICAgICAgICAgIC8vIGNsaXAgZWFjaCB2ZXJ0ZXggYWdhaW5zdCB0aGlzIHBsYW5lLi4uCiAgICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaT0wIDsgaTxpYyA7IGkrKykgeyAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfdCogcCA9IGl2bFtpXTsKICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0xmaXhlZCBwZCA9IGRvdDQoZXF1YXRpb24udiwgcC0+ZXllLnYpOwpAQCAtOTQ2LDEwICs5NjIsMTAgQEAKICAgICAgICAgICAgICAgICB2ZXJ0ZXhfdCoqIG91dHB1dCA9IG92bDsKICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgb2MgPSAwOwogICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzZW50aW5lbCA9IDA7Ci0gICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgdmVydGljZSwgY29tcHV0ZSBkaXN0YW5jZSB0byB0aGUgcGxhbmUKKyAgICAgICAgICAgICAgICAvLyBwcmV2aW91cyB2ZXJ0ZXgsIGNvbXB1dGUgZGlzdGFuY2UgdG8gdGhlIHBsYW5lCiAgICAgICAgICAgICAgICAgdmVydGV4X3QqIHMgPSBpdmxbaWMtMV07CiAgICAgICAgICAgICAgICAgR0xmaXhlZCBzZCA9IGZydXN0dW1QbGFuZURpc3QocGxhbmUsIHMtPmNsaXApOwotICAgICAgICAgICAgICAgIC8vIGNsaXAgZWFjaCB2ZXJ0aWNlIGFnYWluc3QgdGhpcyBwbGFuZS4uLgorICAgICAgICAgICAgICAgIC8vIGNsaXAgZWFjaCB2ZXJ0ZXggYWdhaW5zdCB0aGlzIHBsYW5lLi4uCiAgICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaT0wIDsgaTxpYyA7IGkrKykgeyAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfdCogcCA9IGl2bFtpXTsKICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0xmaXhlZCBwZCA9IGZydXN0dW1QbGFuZURpc3QocGxhbmUsIHAtPmNsaXApOwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC92ZXJ0ZXguY3BwIGIvb3BlbmdsL2xpYmFnbC92ZXJ0ZXguY3BwCmluZGV4IDViY2M5ZGMuLmRhZDA0ZDYgMTAwNjQ0Ci0tLSBhL29wZW5nbC9saWJhZ2wvdmVydGV4LmNwcAorKysgYi9vcGVuZ2wvbGliYWdsL3ZlcnRleC5jcHAKQEAgLTk5LDcgKzk5LDcgQEAKICAgICBjLT5hcnJheXMuY3VsbCAmPSBjbGlwOwogCiAgICAgaWYgKGdnbF9saWtlbHkoIWNsaXApKSB7Ci0gICAgICAgIC8vIGlmIHRoZSB2ZXJ0aWNlIGlzIGNsaXBwZWQsIHdlIGRvbid0IGRvIHRoZSBwZXJzcGVjdGl2ZQorICAgICAgICAvLyBpZiB0aGUgdmVydGV4IGlzIGNsaXBwZWQsIHdlIGRvbid0IGRvIHRoZSBwZXJzcGVjdGl2ZQogICAgICAgICAvLyBkaXZpZGUsIHNpbmNlIHdlIGRvbid0IG5lZWQgaXRzIHdpbmRvdyBjb29yZGluYXRlcy4KICAgICAgICAgcGVyc3BlY3RpdmUoYywgdiwgZW5hYmxlcyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDUzZTdkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL0FuZHJvaWQubWsKQEAgLTAsMCArMSBAQAoraW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTY3M2NiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE3IEBACisjIENvcHlyaWdodCAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX1NSQ19GSUxFUzo9IGFwcC1saW51eC5jIGRlbW8uYy5hcm0KK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliR0xFU19DTSBsaWJ1aQorTE9DQUxfTU9EVUxFOj0gYW5nZWxlcworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQorCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfU1JDX0ZJTEVTOj0gZ3B1c3RhdGUuYworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJHTEVTX0NNCitMT0NBTF9NT0RVTEU6PSBncHVzdGF0ZQorTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvTU9EVUxFX0xJQ0VOU0VfQlNEX09SX0xHUEwgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9NT0RVTEVfTElDRU5TRV9CU0RfT1JfTEdQTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvTU9EVUxFX0xJQ0VOU0VfQlNEX09SX0xHUEwKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL1JFQURNRS50eHQgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YjhhNGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9SRUFETUUudHh0CkBAIC0wLDAgKzEsNzcgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK1NhbiBBbmdlbGVzIE9ic2VydmF0aW9uIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUNCitDb3B5cmlnaHQgMjAwNC0yMDA1IEpldHJvIExhdWhhDQorV2ViOiBodHRwOi8vaWtpLmZpL2pldHJvLw0KK1NlZSBmaWxlIGxpY2Vuc2UudHh0IGZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24uDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorVGhpcyBpcyBhbiBPcGVuR0wgRVMgcG9ydCBvZiB0aGUgc21hbGwgc2VsZi1ydW5uaW5nIGRlbW9uc3RyYXRpb24NCitjYWxsZWQgIlNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIiwgd2hpY2ggd2FzIGZpcnN0IHByZXNlbnRlZCBpbiB0aGUNCitBc3NlbWJseScyMDA0IGV2ZW50LiBJdCB3b24gdGhlIGZpcnN0IHBsYWNlIGluIHRoZSA0IEtCIGludHJvDQorY29tcGV0aXRpb24gY2F0ZWdvcnkuDQorDQorVGhlIGRlbW9uc3RyYXRpb24gZmVhdHVyZXMgYSBzaWdodHNlZWluZyBvZiBhIGZ1dHVyaXN0aWMgY2l0eQ0KK2hhdmluZyBtYW55IGRpZmZlcmVudCBraW5kIG9mIGJ1aWxkaW5ncyBhbmQgaXRlbXMuIEV2ZXJ5dGhpbmcgaXMNCitmbGF0IHNoYWRlZCB3aXRoIHRocmVlIGRpZmZlcmVudCBsaWdodHMuDQorDQorVGhlIG9yaWdpbmFsIHZlcnNpb24gd2FzIG1hZGUgZm9yIGRlc2t0b3Agd2l0aCBPcGVuR0wuIEl0IHdhcw0KK25hdHVyYWxseSBoZWF2aWx5IHNpemUgb3B0aW1pemVkIGluIG9yZGVyIHRvIGZpdCBpdCBpbiB0aGUgc2l6ZQ0KK2xpbWl0LiBGb3IgdGhpcyBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlIG11Y2ggb2YgdGhlIGNvZGUgaXMNCitjbGVhbmVkIHVwIGFuZCB0aGUgc291bmQgaXMgcmVtb3ZlZC4gQWxzbyBkZXRhaWwgbGV2ZWwgaXMgbG93ZXJlZCwNCithbHRob3VnaCBpdCBzdGlsbCBjb250YWlucyBvdmVyIDYwMDAwIGZhY2VzLg0KKw0KK1RoZSBXaW4zMiAoMjAwMC9YUCkgYmluYXJ5IHBhY2thZ2Ugb2Ygb3JpZ2luYWwgdmVyc2lvbiBpcw0KK2F2YWlsYWJsZSBmcm9tIHRoaXMgYWRkcmVzczogaHR0cDovL2pldC5yby9maWxlcy9hbmdlbGVzLnppcA0KKw0KK0ZpcnN0IHZlcnNpb24gb2YgdGhpcyBPcGVuR0wgRVMgcG9ydCB3YXMgc3VibWl0dGVkIHRvIHRoZSBLaHJvbm9zDQorT3BlbkdMIEVTIENvZGluZyBDaGFsbGVuZ2UgaGVsZCBpbiAyMDA0LTIwMDUuDQorDQorQXMgYSBjb2RlIGV4YW1wbGUsIHRoaXMgc291cmNlIHNob3dzIHRoZSBmb2xsb3dpbmc6DQorICAqIEhvdyB0byBjcmVhdGUgYSBtaW5pbWFsIGFuZCBwb3J0YWJsZSBhZCBob2MgZnJhbWV3b3JrDQorICAgIGZvciBzbWFsbCB0ZXN0aW5nL2RlbW9uc3RyYXRpb24gcHJvZ3JhbXMuIFRoaXMgZnJhbWV3b3JrDQorICAgIGNvbXBpbGVzIGZvciBib3RoIGRlc2t0b3AgYW5kIFBvY2tldFBDIFdpbjMyIGVudmlyb25tZW50LA0KKyAgICBhbmQgYSBzZXBhcmF0ZSBzb3VyY2UgaXMgaW5jbHVkZWQgZm9yIExpbnV4IHdpdGggWDExLg0KKyAgKiBIb3cgdG8gZHluYW1pY2FsbHkgZmluZCBhbmQgdXNlIHRoZSBPcGVuR0wgRVMgRExMIG9yDQorICAgIHNoYXJlZCBvYmplY3QsIHNvIHRoYXQgdGhlIGxpYnJhcnkgaXMgbm90IG5lZWRlZCBhdA0KKyAgICB0aGUgY29tcGlsZS9saW5rIHN0YWdlLg0KKyAgKiBIb3cgdG8gdXNlIHRoZSBiYXNpYyBmZWF0dXJlcyBvZiBPcGVuR0wgRVMgMS4wLzEuMQ0KKyAgICBDb21tb24gTGl0ZSwgc3VjaCBhcyB2ZXJ0ZXggYXJyYXlzLCBjb2xvciBhcnJheXMgYW5kDQorICAgIGxpZ2h0aW5nLg0KKyAgKiBIb3cgdG8gY3JlYXRlIGEgc2VsZiBjb250YWluZWQgc21hbGwgZGVtb25zdHJhdGlvbg0KKyAgICBhcHBsaWNhdGlvbiB3aXRoIG9iamVjdHMgZ2VuZXJhdGVkIHVzaW5nIHByb2NlZHVyYWwNCisgICAgYWxnb3JpdGhtcy4NCisNCitBcyB0aGUgb3JpZ2luYWwgdmVyc2lvbiB3YXMgb3B0aW1pemVkIGZvciBzaXplIGluc3RlYWQgb2YNCitwZXJmb3JtYW5jZSwgdGhhdCBob2xkcyB0cnVlIGZvciB0aGlzIE9wZW5HTCBFUyB2ZXJzaW9uIGFzDQord2VsbC4gVGh1cyB0aGUgcGVyZm9ybWFuY2UgY291bGQgYmUgc2lnbmlmaWNhbnRseSBpbmNyZWFzZWQsDQorZm9yIGV4YW1wbGUgYnkgY2hhbmdpbmcgdGhlIGNvZGUgdG8gdXNlIGdsRHJhd0VsZW1lbnRzDQoraW5zdGVhZCBvZiBnbERyYXdBcnJheXMuIFRoZSBjb2RlIHVzZXMgb25seSBPcGVuR0wgRVMgMS4wDQorQ29tbW9uIExpdGUgLWxldmVsIGZ1bmN0aW9uIGNhbGxzIHdpdGhvdXQgYW55IGV4dGVuc2lvbnMuDQorDQorVGhlIHJlZmVyZW5jZSBPcGVuR0wgRVMgaW1wbGVtZW50YXRpb25zIHVzZWQgZm9yIHRoaXMgYXBwbGljYXRpb246DQorICAqIEh5YnJpZCdzIE9wZW5HTCBFUyBBUEkgSW1wbGVtZW50YXRpb24gKEdlcmJlcmEpIHZlcnNpb24gMi4wLjQNCisgICAgUHJlYnVpbHQgV2luMzIgUEMgZXhlY3V0YWJsZTogU2FuT0dMRVMtR2VyYmVyYS5leGUNCisgICogUG93ZXJWUiBNQlggU0RLLCBPcGVuR0wgRVMgV2luZG93cyBQQyBFbXVsYXRpb24gdmVyc2lvbiAxLjA0LjE0LjAxNzANCisgICAgUHJlYnVpbHQgV2luMzIgUEMgZXhlY3V0YWJsZTogU2FuT0dMRVMtUFZSU0RLLmV4ZQ0KKw0KK05vdGUgdGhhdCBESVNBQkxFX0lNUE9SVEdMIHByZXByb2Nlc3NvciBtYWNybyBjYW4gYmUgdXNlZA0KK3RvIHNwZWNpZnkgbm90IHRvIHVzZSBkeW5hbWljIHJ1bnRpbWUgYmluZGluZyBvZiB0aGUgbGlicmFyeS4NCitZb3UgYWxzbyBuZWVkIHRvIGRlZmluZSBwcmVwcm9jZXNzb3IgbWFjcm8gUFZSU0RLIHRvIGNvbXBpbGUNCit0aGUgc291cmNlIHdpdGggUG93ZXJWUiBPcGVuR0wgRVMgU0RLLg0KKw0KK1RoZSBkZW1vIGFwcGxpY2F0aW9uIGlzIGJyaWVmbHkgdGVzdGVkIHdpdGggYSBmZXcgb3RoZXIgT3BlbkdMIEVTDQoraW1wbGVtZW50YXRpb25zIGFzIHdlbGwgKGUuZy4gVmluY2VudCwgR0xFU29uR0wgb24gTGludXgsIERlbGwNCitBeGltIFg1MHYpLiBNb3N0IG9mIHRoZXNlIG90aGVyIGltcGxlbWVudGF0aW9ucyByZW5kZXJlZCB0aGUgZGVtbw0KK2Vycm9uZW91c2x5IGluIHNvbWUgYXNwZWN0LiBUaGlzIG1heSBpbmRpY2F0ZSB0aGF0IHRoZSBkZW1vIHNvdXJjZQ0KK2NvdWxkIHN0aWxsIGhhdmUgc29tZSB3b3JrIHRvIGRvIHdpdGggY29tcGF0aWJpbGl0eSBhbmQgY29ycmVjdA0KK0FQSSB1c2FnZSwgYWx0aG91Z2ggdGhlIG5vbi1jb25mb3JtaW5nIGltcGxlbWVudGF0aW9ucyBhcmUgbW9zdA0KK3Byb2JhYmx5IHVuZmluaXNoZWQgYXMgd2VsbC4NCisNCitUaGFua3MgYW5kIEFja25vd2xlZGdlbWVudHM6DQorDQorKiBUb25pIEz2bm5iZXJnICghQ3ViZSkgY3JlYXRlZCB0aGUgbXVzaWMgZm9yIG9yaWdpbmFsIHZlcnNpb24sIHdoaWNoDQorICBpcyBub3QgZmVhdHVyZWQgaW4gdGhpcyBPcGVuR0wgRVMgcG9ydC4NCisqIFNhcmEgS2FwbGkgKHN0IFJhbmEpIGZvciBhZGRpdGlvbmFsIGNhbWVyYSB3b3JrLg0KKyogUGF1bCBCb3Vya2UgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdXBlcnNoYXBlcy4NCisNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9hcHAtbGludXguYyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2FwcC1saW51eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MzllYjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9hcHAtbGludXguYwpAQCAtMCwwICsxLDIyMiBAQAorLyogU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24gT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZQorICogQ29weXJpZ2h0IDIwMDQtMjAwNSBKZXRybyBMYXVoYQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFdlYjogaHR0cDovL2lraS5maS9qZXRyby8KKyAqCisgKiBUaGlzIHNvdXJjZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgRUlUSEVSOgorICogICAoMSkgVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIFRoZSB0ZXh0IG9mIHRoZSBHTlUgTGVzc2VyCisgKiAgICAgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4gdGhlCisgKiAgICAgICBmaWxlIExJQ0VOU0UtTEdQTC50eHQuCisgKiAgICgyKSBUaGUgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluCisgKiAgICAgICB0aGUgZmlsZSBMSUNFTlNFLUJTRC50eHQuCisgKgorICogVGhpcyBzb3VyY2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgZmlsZXMKKyAqIExJQ0VOU0UtTEdQTC50eHQgYW5kIExJQ0VOU0UtQlNELnR4dCBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICRJZDogYXBwLWxpbnV4LmMsdiAxLjQgMjAwNS8wMi8wOCAxODo0Mjo0OCB0b25pYyBFeHAgJAorICogJFJldmlzaW9uOiAxLjQgJAorICoKKyAqIFBhcnRzIG9mIHRoaXMgc291cmNlIGZpbGUgaXMgYmFzZWQgb24gdGVzdC9leGFtcGxlIGNvZGUgZnJvbQorICogR0xFU29uR0wgaW1wbGVtZW50YXRpb24gYnkgRGF2aWQgQmx5dGhlLiBIZXJlIGlzIGNvcHkgb2YgdGhlCisgKiBsaWNlbnNlIG5vdGljZSBmcm9tIHRoYXQgc291cmNlOgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgRGF2aWQgQmx5dGhlICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIERBVklEIEJMWVRIRSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKyNpbmNsdWRlIDxHTEVTL2VnbC5oPgorCisjaW5jbHVkZSAiYXBwLmgiCisKKworaW50IGdBcHBBbGl2ZSA9IDE7CisKK3N0YXRpYyBjb25zdCBjaGFyIHNBcHBOYW1lW10gPQorICAgICJTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlIChMaW51eCkiOworCitzdGF0aWMgaW50IHNXaW5kb3dXaWR0aCA9IFdJTkRPV19ERUZBVUxUX1dJRFRIOworc3RhdGljIGludCBzV2luZG93SGVpZ2h0ID0gV0lORE9XX0RFRkFVTFRfSEVJR0hUOworc3RhdGljIEVHTERpc3BsYXkgc0VnbERpc3BsYXkgPSBFR0xfTk9fRElTUExBWTsKK3N0YXRpYyBFR0xDb250ZXh0IHNFZ2xDb250ZXh0ID0gRUdMX05PX0NPTlRFWFQ7CitzdGF0aWMgRUdMU3VyZmFjZSBzRWdsU3VyZmFjZSA9IEVHTF9OT19TVVJGQUNFOworCitjb25zdCBjaGFyICplZ2xfc3RyZXJyb3IodW5zaWduZWQgZXJyKQoreworICAgIHN3aXRjaChlcnIpeworICAgIGNhc2UgRUdMX1NVQ0NFU1M6IHJldHVybiAiU1VDQ0VTUyI7CisgICAgY2FzZSBFR0xfTk9UX0lOSVRJQUxJWkVEOiByZXR1cm4gIk5PVCBJTklUSUFMSVpFRCI7CisgICAgY2FzZSBFR0xfQkFEX0FDQ0VTUzogcmV0dXJuICJCQUQgQUNDRVNTIjsKKyAgICBjYXNlIEVHTF9CQURfQUxMT0M6IHJldHVybiAiQkFEIEFMTE9DIjsKKyAgICBjYXNlIEVHTF9CQURfQVRUUklCVVRFOiByZXR1cm4gIkJBRF9BVFRSSUJVVEUiOworICAgIGNhc2UgRUdMX0JBRF9DT05GSUc6IHJldHVybiAiQkFEIENPTkZJRyI7CisgICAgY2FzZSBFR0xfQkFEX0NPTlRFWFQ6IHJldHVybiAiQkFEIENPTlRFWFQiOworICAgIGNhc2UgRUdMX0JBRF9DVVJSRU5UX1NVUkZBQ0U6IHJldHVybiAiQkFEIENVUlJFTlQgU1VSRkFDRSI7CisgICAgY2FzZSBFR0xfQkFEX0RJU1BMQVk6IHJldHVybiAiQkFEIERJU1BMQVkiOworICAgIGNhc2UgRUdMX0JBRF9NQVRDSDogcmV0dXJuICJCQUQgTUFUQ0giOworICAgIGNhc2UgRUdMX0JBRF9OQVRJVkVfUElYTUFQOiByZXR1cm4gIkJBRCBOQVRJVkUgUElYTUFQIjsKKyAgICBjYXNlIEVHTF9CQURfTkFUSVZFX1dJTkRPVzogcmV0dXJuICJCQUQgTkFUSVZFIFdJTkRPVyI7CisgICAgY2FzZSBFR0xfQkFEX1BBUkFNRVRFUjogcmV0dXJuICJCQUQgUEFSQU1FVEVSIjsKKyAgICBjYXNlIEVHTF9CQURfU1VSRkFDRTogcmV0dXJuICJCQURfU1VSRkFDRSI7CisvLyAgICBjYXNlIEVHTF9DT05URVhUX0xPU1Q6IHJldHVybiAiQ09OVEVYVCBMT1NUIjsKKyAgICBkZWZhdWx0OiByZXR1cm4gIlVOS05PV04iOworICAgIH0KK30KKwordm9pZCBlZ2xfZXJyb3IoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICB1bnNpZ25lZCBlcnIgPSBlZ2xHZXRFcnJvcigpOworICAgIGlmKGVyciAhPSBFR0xfU1VDQ0VTUykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiJXMoKTogZWdsIGVycm9yIDB4JXggKCVzKVxuIiwgCisgICAgICAgICAgICAgICAgbmFtZSwgZXJyLCBlZ2xfc3RyZXJyb3IoZXJyKSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjaGVja0dMRXJyb3JzKCkKK3sKKyAgICBHTGVudW0gZXJyb3IgPSBnbEdldEVycm9yKCk7CisgICAgaWYgKGVycm9yICE9IEdMX05PX0VSUk9SKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkdMIEVycm9yOiAweCUwNHhcbiIsIChpbnQpZXJyb3IpOworfQorCisKK3N0YXRpYyB2b2lkIGNoZWNrRUdMRXJyb3JzKCkKK3sKKyAgICBFR0xpbnQgZXJyb3IgPSBlZ2xHZXRFcnJvcigpOworICAgIC8vIEdMRVNvbkdMIHNlZW1zIHRvIGJlIHJldHVybmluZyAwIHdoZW4gdGhlcmUgaXMgbm8gZXJyb3JzPworICAgIGlmIChlcnJvciAmJiBlcnJvciAhPSBFR0xfU1VDQ0VTUykKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFR0wgRXJyb3I6IDB4JTA0eFxuIiwgKGludCllcnJvcik7Cit9CisKK3N0YXRpYyBpbnQgaW5pdEdyYXBoaWNzKCkKK3sKKyAgICBFR0xpbnQgc19jb25maWdBdHRyaWJzW10gPSB7CisgICAgICAgICBFR0xfUkVEX1NJWkUsICAgICAgIDUsCisgICAgICAgICBFR0xfR1JFRU5fU0laRSwgICAgIDYsCisgICAgICAgICBFR0xfQkxVRV9TSVpFLCAgICAgIDUsCisgI2lmIDEKKyAgICAgICAgIEVHTF9ERVBUSF9TSVpFLCAgICAgMTYsCisgICAgICAgICBFR0xfU1RFTkNJTF9TSVpFLCAgIDAsCisgI2Vsc2UKKyAgICAgICAgIEVHTF9BTFBIQV9TSVpFLCAgICAgRUdMX0RPTlRfQ0FSRSwKKyAgICAgICAgIEVHTF9ERVBUSF9TSVpFLCAgICAgRUdMX0RPTlRfQ0FSRSwKKyAgICAgICAgIEVHTF9TVEVOQ0lMX1NJWkUsICAgRUdMX0RPTlRfQ0FSRSwKKyAgICAgICAgIEVHTF9TVVJGQUNFX1RZUEUsICAgRUdMX0RPTlRfQ0FSRSwKKyAjZW5kaWYKKyAgICAgICAgIEVHTF9OT05FCisgICAgIH07CisgICAgIAorICAgICBFR0xpbnQgbnVtQ29uZmlncyA9IC0xOworICAgICBFR0xpbnQgbWFqb3JWZXJzaW9uOworICAgICBFR0xpbnQgbWlub3JWZXJzaW9uOworICAgICBFR0xDb25maWcgY29uZmlnOworICAgICBFR0xDb250ZXh0IGNvbnRleHQ7CisgICAgIEVHTFN1cmZhY2Ugc3VyZmFjZTsKKyAgICAgCisgICAgIEVHTERpc3BsYXkgZHB5OworCisgICAgIGRweSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSk7CisgICAgIGVnbF9lcnJvcigiZWdsR2V0RGlzcGxheSIpOworICAgICBmcHJpbnRmKHN0ZGVyciwiZHB5ID0gMHglMDh4XG4iLCAodW5zaWduZWQpIGRweSk7CisgICAgIAorICAgICBlZ2xJbml0aWFsaXplKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7CisgICAgIGVnbF9lcnJvcigiZWdsSW5pdGlhbGl6ZSIpOworCisgICAgIGVnbEdldENvbmZpZ3MoZHB5LCBOVUxMLCAwLCAmbnVtQ29uZmlncyk7CisgICAgIGVnbF9lcnJvcigiZWdsR2V0Q29uZmlncyIpOworICAgICBmcHJpbnRmKHN0ZGVyciwibnVtIGNvbmZpZ3MgJWRcbiIsIG51bUNvbmZpZ3MpOworICAgICAKKyAgICAgZWdsQ2hvb3NlQ29uZmlnKGRweSwgc19jb25maWdBdHRyaWJzLCAmY29uZmlnLCAxLCAmbnVtQ29uZmlncyk7CisgICAgIGVnbF9lcnJvcigiZWdsQ2hvb3NlQ29uZmlnIik7CisKKyAgICAgc3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZHB5LCBjb25maWcsCisgICAgICAgICAgICAgYW5kcm9pZF9jcmVhdGVEaXNwbGF5U3VyZmFjZSgpLCBOVUxMKTsKKyAgICAgZWdsX2Vycm9yKCJlZ2xNYXBXaW5kb3dTdXJmYWNlIik7CisKKyAgICAgZnByaW50ZihzdGRlcnIsInN1cmZhY2UgPSAlcFxuIiwgc3VyZmFjZSk7CisKKyAgICAgY29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQoZHB5LCBjb25maWcsIE5VTEwsIE5VTEwpOworICAgICBlZ2xfZXJyb3IoImVnbENyZWF0ZUNvbnRleHQiKTsKKyAgICAgZnByaW50ZihzdGRlcnIsImNvbnRleHQgPSAlcFxuIiwgY29udGV4dCk7CisgICAgIAorICAgICBlZ2xNYWtlQ3VycmVudChkcHksIHN1cmZhY2UsIHN1cmZhY2UsIGNvbnRleHQpOyAgIAorICAgICBlZ2xfZXJyb3IoImVnbE1ha2VDdXJyZW50Iik7CisKKyAgICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX1dJRFRILCAmc1dpbmRvd1dpZHRoKTsKKyAgICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX0hFSUdIVCwgJnNXaW5kb3dIZWlnaHQpOworCisgICAgc0VnbERpc3BsYXkgPSBkcHk7CisgICAgc0VnbFN1cmZhY2UgPSBzdXJmYWNlOworICAgIHNFZ2xDb250ZXh0ID0gY29udGV4dDsKKworICAgIHJldHVybiBFR0xfVFJVRTsKK30KKworCitzdGF0aWMgdm9pZCBkZWluaXRHcmFwaGljcygpCit7CisgICAgZWdsTWFrZUN1cnJlbnQoc0VnbERpc3BsYXksIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIGVnbERlc3Ryb3lDb250ZXh0KHNFZ2xEaXNwbGF5LCBzRWdsQ29udGV4dCk7CisgICAgZWdsRGVzdHJveVN1cmZhY2Uoc0VnbERpc3BsYXksIHNFZ2xTdXJmYWNlKTsKKyAgICBlZ2xUZXJtaW5hdGUoc0VnbERpc3BsYXkpOworfQorCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgLy8gbm90IHJlZmVyZW5jZWQ6CisgICAgYXJnYyA9IGFyZ2M7CisgICAgYXJndiA9IGFyZ3Y7CisKKyAgICBpZiAoIWluaXRHcmFwaGljcygpKQorICAgIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJHcmFwaGljcyBpbml0aWFsaXphdGlvbiBmYWlsZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisKKyAgICBhcHBJbml0KCk7CisgICAgCisgICAgd2hpbGUgKGdBcHBBbGl2ZSkKKyAgICB7CisgICAgICAgIHN0cnVjdCB0aW1ldmFsIHRpbWVOb3c7CisKKyAgICAgICAgaWYgKGdBcHBBbGl2ZSkKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0dGltZW9mZGF5KCZ0aW1lTm93LCBOVUxMKTsKKyAgICAgICAgICAgIGFwcFJlbmRlcih0aW1lTm93LnR2X3NlYyAqIDEwMDAgKyB0aW1lTm93LnR2X3VzZWMgLyAxMDAwLAorICAgICAgICAgICAgICAgICAgICAgIHNXaW5kb3dXaWR0aCwgc1dpbmRvd0hlaWdodCk7CisgICAgICAgICAgICBjaGVja0dMRXJyb3JzKCk7CisgICAgICAgICAgICBlZ2xTd2FwQnVmZmVycyhzRWdsRGlzcGxheSwgc0VnbFN1cmZhY2UpOworICAgICAgICAgICAgY2hlY2tFR0xFcnJvcnMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGFwcERlaW5pdCgpOworICAgIGRlaW5pdEdyYXBoaWNzKCk7CisKKyAgICByZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvYXBwLmggYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9hcHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGViZDM1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvYXBwLmgKQEAgLTAsMCArMSw1NiBAQAorLyogU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24gT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZQorICogQ29weXJpZ2h0IDIwMDQtMjAwNSBKZXRybyBMYXVoYQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFdlYjogaHR0cDovL2lraS5maS9qZXRyby8KKyAqCisgKiBUaGlzIHNvdXJjZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgRUlUSEVSOgorICogICAoMSkgVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIFRoZSB0ZXh0IG9mIHRoZSBHTlUgTGVzc2VyCisgKiAgICAgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4gdGhlCisgKiAgICAgICBmaWxlIExJQ0VOU0UtTEdQTC50eHQuCisgKiAgICgyKSBUaGUgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluCisgKiAgICAgICB0aGUgZmlsZSBMSUNFTlNFLUJTRC50eHQuCisgKgorICogVGhpcyBzb3VyY2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgZmlsZXMKKyAqIExJQ0VOU0UtTEdQTC50eHQgYW5kIExJQ0VOU0UtQlNELnR4dCBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICRJZDogYXBwLmgsdiAxLjE0IDIwMDUvMDIvMDYgMjE6MTM6NTQgdG9uaWMgRXhwICQKKyAqICRSZXZpc2lvbjogMS4xNCAkCisgKi8KKworI2lmbmRlZiBBUFBfSF9JTkNMVURFRAorI2RlZmluZSBBUFBfSF9JTkNMVURFRAorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisjZGVmaW5lIFdJTkRPV19ERUZBVUxUX1dJRFRIICAgIDY0MAorI2RlZmluZSBXSU5ET1dfREVGQVVMVF9IRUlHSFQgICA0ODAKKworI2RlZmluZSBXSU5ET1dfQlBQICAgICAgICAgICAgICAxNgorCisKKy8vIFRoZSBzaW1wbGUgZnJhbWV3b3JrIGV4cGVjdHMgdGhlIGFwcGxpY2F0aW9uIGNvZGUgdG8gZGVmaW5lIHRoZXNlIGZ1bmN0aW9ucy4KK2V4dGVybiB2b2lkIGFwcEluaXQoKTsKK2V4dGVybiB2b2lkIGFwcERlaW5pdCgpOworZXh0ZXJuIHZvaWQgYXBwUmVuZGVyKGxvbmcgdGljaywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKworLyogVmFsdWUgaXMgbm9uLXplcm8gd2hlbiBhcHBsaWNhdGlvbiBpcyBhbGl2ZSwgYW5kIDAgd2hlbiBpdCBpcyBjbG9zaW5nLgorICogRGVmaW5lZCBieSB0aGUgYXBwbGljYXRpb24gZnJhbWV3b3JrLgorICovCitleHRlcm4gaW50IGdBcHBBbGl2ZTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisKKyNlbmRpZiAvLyAhQVBQX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2NhbXMuaCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2NhbXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjFhY2IzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvY2Ftcy5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qIFNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUKKyAqIENvcHlyaWdodCAyMDA0LTIwMDUgSmV0cm8gTGF1aGEKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBXZWI6IGh0dHA6Ly9pa2kuZmkvamV0cm8vCisgKgorICogVGhpcyBzb3VyY2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIEVJVEhFUjoKKyAqICAgKDEpIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBUaGUgdGV4dCBvZiB0aGUgR05VIExlc3NlcgorICogICAgICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluIHRoZQorICogICAgICAgZmlsZSBMSUNFTlNFLUxHUEwudHh0LgorICogICAoMikgVGhlIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbgorICogICAgICAgdGhlIGZpbGUgTElDRU5TRS1CU0QudHh0LgorICoKKyAqIFRoaXMgc291cmNlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIGZpbGVzCisgKiBMSUNFTlNFLUxHUEwudHh0IGFuZCBMSUNFTlNFLUJTRC50eHQgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAkSWQ6IGNhbXMuaCx2IDEuNyAyMDA1LzAxLzMxIDIyOjE1OjE1IHRvbmljIEV4cCAkCisgKiAkUmV2aXNpb246IDEuNyAkCisgKi8KKworI2lmbmRlZiBDQU1TX0hfSU5DTFVERUQKKyNkZWZpbmUgQ0FNU19IX0lOQ0xVREVECisKKworLyogTGVuZ3RoIGluIG1pbGxpc2Vjb25kcyBvZiBvbmUgY2FtZXJhIHRyYWNrIGJhc2UgdW5pdC4KKyAqIFRoZSB2YWx1ZSBvcmlnaW5hdGVzIGZyb20gdGhlIG11c2ljIHN5bmNocm9uaXphdGlvbi4KKyAqLworI2RlZmluZSBDQU1UUkFDS19MRU4gICAgNTQ0MgorCisKKy8vIENhbWVyYSB0cmFjayBkZWZpbml0aW9uIGZvciBvbmUgY2FtZXJhIHRydWNraW5nIHNob3QuCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIEZpdmUgcGFyYW1ldGVycyBvZiBzcmNbNV0gYW5kIGRlc3RbNV06CisgICAgICogZXllWCwgZXllWSwgZXllWiwgdmlld0FuZ2xlLCB2aWV3SGVpZ2h0T2ZmcworICAgICAqLworICAgIHNob3J0IHNyY1s1XSwgZGVzdFs1XTsKKyAgICB1bnNpZ25lZCBjaGFyIGRpc3Q7ICAgICAvLyBpZiA+MCwgY2FtIHJvdGF0ZXMgYXJvdW5kIGV5ZSB4eSBvbiBkaXN0ICogMC4xCisgICAgdW5zaWduZWQgY2hhciBsZW47ICAgICAgLy8gbGVuZ3RoIG11bHRpcGxpZXIKK30gQ0FNVFJBQ0s7CisKK3N0YXRpYyBDQU1UUkFDSyBzQ2FtVHJhY2tzW10gPQoreworICAgIHsgeyA0NTAwLCAyNzAwLCAxMDAsIDcwLCAtMzAgfSwgeyA1MCwgNTAsIC05MCwgLTEwMCwgMCB9LCAyMCwgMSB9LAorICAgIHsgeyAtMTQ0OCwgNDI5NCwgMjUsIDM2MywgMCB9LCB7IC0xMzYsIDIwMiwgMTI1LCAtOTgsIDEwMCB9LCAwLCAxIH0sCisgICAgeyB7IDE0MzcsIDQ5MzAsIDIwMCwgLTI3NSwgLTIwIH0sIHsgMTY4NCwgMCwgMCwgOSwgMCB9LCAwLCAxIH0sCisgICAgeyB7IDE4MDAsIDM2MDksIDIwMCwgMCwgNjc1IH0sIHsgMCwgMCwgMCwgMzAwLCAwIH0sIDAsIDEgfSwKKyAgICB7IHsgOTIzLCA5OTYsIDUwLCAyMzM2LCAtODAgfSwgeyAwLCAtMjAsIC01MCwgMCwgMTcwIH0sIDAsIDEgfSwKKyAgICB7IHsgLTE2NjMsIC00MywgNjAwLCAyMTcwLCAwIH0sIHsgMjAsIDAsIC02MDAsIDAsIDEwMCB9LCAwLCAxIH0sCisgICAgeyB7IDEwNDksIC0xNDIwLCAxNzUsIDIxMTEsIC0xNyB9LCB7IDAsIDAsIDAsIC0zMzQsIDAgfSwgMCwgMiB9LAorICAgIHsgeyAwLCAwLCA1MCwgMzAwLCAyNSB9LCB7IDAsIDAsIDAsIDMwMCwgMCB9LCA3MCwgMiB9LAorICAgIHsgeyAtNDczLCAtOTUzLCAzNTAwLCAtMzUzLCAtMzUwIH0sIHsgMCwgMCwgLTI4MDAsIDAsIDAgfSwgMCwgMiB9LAorICAgIHsgeyAxOTEsIDE5MzgsIDM1LCAxMTM5LCAtMTcgfSwgeyAxMjA1LCAtMjkwOSwgMCwgMCwgMCB9LCAwLCAyIH0sCisgICAgeyB7IC0xNDQ5LCAtMjcwMCwgMTUwLCAwLCAwIH0sIHsgMCwgMjAwMCwgMCwgMCwgMCB9LCAwLCAyIH0sCisgICAgeyB7IDUyNzMsIDQ5OTIsIDY1MCwgMzczLCAtNTAgfSwgeyAtNDU5OCwgLTMwNzIsIDAsIDAsIDAgfSwgMCwgMiB9LAorICAgIHsgeyAzMjIzLCAtMzI4MiwgMTA3NSwgLTM5MywgLTI1IH0sIHsgMTY0OSwgLTE2NDksIDAsIDAsIDAgfSwgMCwgMiB9Cit9OworI2RlZmluZSBDQU1UUkFDS19DT1VOVCAoc2l6ZW9mKGNhbVRyYWNrcykgLyBzaXplb2YoY2FtVHJhY2tzWzBdKSkKKworCisjZW5kaWYgLy8gIUNBTVNfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvZGVtby5jIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvZGVtby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMmYzOTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9kZW1vLmMKQEAgLTAsMCArMSw3OTIgQEAKKy8qIFNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUKKyAqIENvcHlyaWdodCAyMDA0LTIwMDUgSmV0cm8gTGF1aGEKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBXZWI6IGh0dHA6Ly9pa2kuZmkvamV0cm8vCisgKgorICogVGhpcyBzb3VyY2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIEVJVEhFUjoKKyAqICAgKDEpIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBUaGUgdGV4dCBvZiB0aGUgR05VIExlc3NlcgorICogICAgICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluIHRoZQorICogICAgICAgZmlsZSBMSUNFTlNFLUxHUEwudHh0LgorICogICAoMikgVGhlIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbgorICogICAgICAgdGhlIGZpbGUgTElDRU5TRS1CU0QudHh0LgorICoKKyAqIFRoaXMgc291cmNlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIGZpbGVzCisgKiBMSUNFTlNFLUxHUEwudHh0IGFuZCBMSUNFTlNFLUJTRC50eHQgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAkSWQ6IGRlbW8uYyx2IDEuMTAgMjAwNS8wMi8wOCAyMDo1NDozOSB0b25pYyBFeHAgJAorICogJFJldmlzaW9uOiAxLjEwICQKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisKKyNpbmNsdWRlICJhcHAuaCIKKyNpbmNsdWRlICJzaGFwZXMuaCIKKyNpbmNsdWRlICJjYW1zLmgiCisKKworLy8gVG90YWwgcnVuIGxlbmd0aCBpcyAyMCAqIGNhbWVyYSB0cmFjayBiYXNlIHVuaXQgbGVuZ3RoIChzZWUgY2Ftcy5oKS4KKyNkZWZpbmUgUlVOX0xFTkdUSCAgKDIwICogQ0FNVFJBQ0tfTEVOKQorI3VuZGVmIFBJCisjZGVmaW5lIFBJIDMuMTQxNTkyNjUzNTg5NzkzMmYKKyNkZWZpbmUgUkFORE9NX1VJTlRfTUFYIDY1NTM1CisKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc1JhbmRvbVNlZWQgPSAwOworCitzdGF0aWMgdm9pZCBzZWVkUmFuZG9tKHVuc2lnbmVkIGxvbmcgc2VlZCkKK3sKKyAgICBzUmFuZG9tU2VlZCA9IHNlZWQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJhbmRvbVVJbnQoKQoreworICAgIHNSYW5kb21TZWVkID0gc1JhbmRvbVNlZWQgKiAweDM0M2ZkICsgMHgyNjllYzM7CisgICAgcmV0dXJuIHNSYW5kb21TZWVkID4+IDE2OworfQorCisKKy8vIENhcHBlZCBjb252ZXJzaW9uIGZyb20gZmxvYXQgdG8gZml4ZWQuCitzdGF0aWMgbG9uZyBmbG9hdFRvRml4ZWQoZmxvYXQgdmFsdWUpCit7CisgICAgaWYgKHZhbHVlIDwgLTMyNzY4KSB2YWx1ZSA9IC0zMjc2ODsKKyAgICBpZiAodmFsdWUgPiAzMjc2NykgdmFsdWUgPSAzMjc2NzsKKyAgICByZXR1cm4gKGxvbmcpKHZhbHVlICogNjU1MzYpOworfQorCisjZGVmaW5lIEZJWEVEKHZhbHVlKSBmbG9hdFRvRml4ZWQodmFsdWUpCisKKworLy8gRGVmaW5pdGlvbiBvZiBvbmUgR0wgb2JqZWN0IGluIHRoaXMgZGVtby4KK3R5cGVkZWYgc3RydWN0IHsKKyAgICAvKiBWZXJ0ZXggYXJyYXkgYW5kIGNvbG9yIGFycmF5IGFyZSBlbmFibGVkIGZvciBhbGwgb2JqZWN0cywgc28gdGhlaXIKKyAgICAgKiBwb2ludGVycyBtdXN0IGFsd2F5cyBiZSB2YWxpZCBhbmQgbm9uLU5VTEwuIE5vcm1hbCBhcnJheSBpcyBub3QKKyAgICAgKiB1c2VkIGJ5IHRoZSBncm91bmQgcGxhbmUsIHNvIHdoZW4gaXRzIHBvaW50ZXIgaXMgTlVMTCB0aGVuIG5vcm1hbAorICAgICAqIGFycmF5IHVzYWdlIGlzIGRpc2FibGVkLgorICAgICAqCisgICAgICogVmVydGV4IGFycmF5IGlzIHN1cHBvc2VkIHRvIHVzZSBHTF9GSVhFRCBkYXRhdHlwZSBhbmQgc3RyaWRlIDAKKyAgICAgKiAoaS5lLiB0aWdodGx5IHBhY2tlZCBhcnJheSkuIENvbG9yIGFycmF5IGlzIHN1cHBvc2VkIHRvIGhhdmUgNAorICAgICAqIGNvbXBvbmVudHMgcGVyIGNvbG9yIHdpdGggR0xfVU5TSUdORURfQllURSBkYXRhdHlwZSBhbmQgc3RyaWRlIDAuCisgICAgICogTm9ybWFsIGFycmF5IGlzIHN1cHBvc2VkIHRvIHVzZSBHTF9GSVhFRCBkYXRhdHlwZSBhbmQgc3RyaWRlIDAuCisgICAgICovCisgICAgR0xmaXhlZCAqdmVydGV4QXJyYXk7CisgICAgR0x1Ynl0ZSAqY29sb3JBcnJheTsKKyAgICBHTGZpeGVkICpub3JtYWxBcnJheTsKKyAgICBHTGludCB2ZXJ0ZXhDb21wb25lbnRzOworICAgIEdMc2l6ZWkgY291bnQ7Cit9IEdMT0JKRUNUOworCisKK3N0YXRpYyBsb25nIHNTdGFydFRpY2sgPSAwOworc3RhdGljIGxvbmcgc1RpY2sgPSAwOworCitzdGF0aWMgaW50IHNDdXJyZW50Q2FtVHJhY2sgPSAwOworc3RhdGljIGxvbmcgc0N1cnJlbnRDYW1UcmFja1N0YXJ0VGljayA9IDA7CitzdGF0aWMgbG9uZyBzTmV4dENhbVRyYWNrU3RhcnRUaWNrID0gMHg3ZmZmZmZmZjsKKworc3RhdGljIEdMT0JKRUNUICpzU3VwZXJTaGFwZU9iamVjdHNbU1VQRVJTSEFQRV9DT1VOVF0gPSB7IE5VTEwgfTsKK3N0YXRpYyBHTE9CSkVDVCAqc0dyb3VuZFBsYW5lID0gTlVMTDsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZmxvYXQgeCwgeSwgejsKK30gVkVDVE9SMzsKKworCitzdGF0aWMgdm9pZCBmcmVlR0xPYmplY3QoR0xPQkpFQ1QgKm9iamVjdCkKK3sKKyAgICBpZiAob2JqZWN0ID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBmcmVlKG9iamVjdC0+bm9ybWFsQXJyYXkpOworICAgIGZyZWUob2JqZWN0LT5jb2xvckFycmF5KTsKKyAgICBmcmVlKG9iamVjdC0+dmVydGV4QXJyYXkpOworICAgIGZyZWUob2JqZWN0KTsKK30KKworCitzdGF0aWMgR0xPQkpFQ1QgKiBuZXdHTE9iamVjdChsb25nIHZlcnRpY2VzLCBpbnQgdmVydGV4Q29tcG9uZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2VOb3JtYWxBcnJheSkKK3sKKyAgICBHTE9CSkVDVCAqcmVzdWx0OworICAgIHJlc3VsdCA9IChHTE9CSkVDVCAqKW1hbGxvYyhzaXplb2YoR0xPQkpFQ1QpKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlc3VsdC0+Y291bnQgPSB2ZXJ0aWNlczsKKyAgICByZXN1bHQtPnZlcnRleENvbXBvbmVudHMgPSB2ZXJ0ZXhDb21wb25lbnRzOworICAgIHJlc3VsdC0+dmVydGV4QXJyYXkgPSAoR0xmaXhlZCAqKW1hbGxvYyh2ZXJ0aWNlcyAqIHZlcnRleENvbXBvbmVudHMgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoR0xmaXhlZCkpOworICAgIHJlc3VsdC0+Y29sb3JBcnJheSA9IChHTHVieXRlICopbWFsbG9jKHZlcnRpY2VzICogNCAqIHNpemVvZihHTHVieXRlKSk7CisgICAgaWYgKHVzZU5vcm1hbEFycmF5KQorICAgIHsKKyAgICAgICAgcmVzdWx0LT5ub3JtYWxBcnJheSA9IChHTGZpeGVkICopbWFsbG9jKHZlcnRpY2VzICogMyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoR0xmaXhlZCkpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJlc3VsdC0+bm9ybWFsQXJyYXkgPSBOVUxMOworICAgIGlmIChyZXN1bHQtPnZlcnRleEFycmF5ID09IE5VTEwgfHwKKyAgICAgICAgcmVzdWx0LT5jb2xvckFycmF5ID09IE5VTEwgfHwKKyAgICAgICAgKHVzZU5vcm1hbEFycmF5ICYmIHJlc3VsdC0+bm9ybWFsQXJyYXkgPT0gTlVMTCkpCisgICAgeworICAgICAgICBmcmVlR0xPYmplY3QocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIHZvaWQgZHJhd0dMT2JqZWN0KEdMT0JKRUNUICpvYmplY3QpCit7CisgICAgYXNzZXJ0KG9iamVjdCAhPSBOVUxMKTsKKworICAgIGdsVmVydGV4UG9pbnRlcihvYmplY3QtPnZlcnRleENvbXBvbmVudHMsIEdMX0ZJWEVELAorICAgICAgICAgICAgICAgICAgICAwLCBvYmplY3QtPnZlcnRleEFycmF5KTsKKyAgICBnbENvbG9yUG9pbnRlcig0LCBHTF9VTlNJR05FRF9CWVRFLCAwLCBvYmplY3QtPmNvbG9yQXJyYXkpOworCisgICAgLy8gQWxyZWFkeSBkb25lIGluIGluaXRpYWxpemF0aW9uOgorICAgIC8vZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9WRVJURVhfQVJSQVkpOworICAgIC8vZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9DT0xPUl9BUlJBWSk7CisKKyAgICBpZiAob2JqZWN0LT5ub3JtYWxBcnJheSkKKyAgICB7CisgICAgICAgIGdsTm9ybWFsUG9pbnRlcihHTF9GSVhFRCwgMCwgb2JqZWN0LT5ub3JtYWxBcnJheSk7CisgICAgICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfTk9STUFMX0FSUkFZKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9OT1JNQUxfQVJSQVkpOworICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRVMsIDAsIG9iamVjdC0+Y291bnQpOworfQorCisKK3N0YXRpYyB2b2lkIHZlY3RvcjNTdWIoVkVDVE9SMyAqZGVzdCwgVkVDVE9SMyAqdjEsIFZFQ1RPUjMgKnYyKQoreworICAgIGRlc3QtPnggPSB2MS0+eCAtIHYyLT54OworICAgIGRlc3QtPnkgPSB2MS0+eSAtIHYyLT55OworICAgIGRlc3QtPnogPSB2MS0+eiAtIHYyLT56OworfQorCisKK3N0YXRpYyB2b2lkIHN1cGVyU2hhcGVNYXAoVkVDVE9SMyAqcG9pbnQsIGZsb2F0IHIxLCBmbG9hdCByMiwgZmxvYXQgdCwgZmxvYXQgcCkKK3sKKyAgICAvLyBzcGhlcmUtbWFwcGluZyBvZiBzdXBlcnNoYXBlIHBhcmFtZXRlcnMKKyAgICBwb2ludC0+eCA9IChmbG9hdCkoY29zKHQpICogY29zKHApIC8gcjEgLyByMik7CisgICAgcG9pbnQtPnkgPSAoZmxvYXQpKHNpbih0KSAqIGNvcyhwKSAvIHIxIC8gcjIpOworICAgIHBvaW50LT56ID0gKGZsb2F0KShzaW4ocCkgLyByMik7Cit9CisKKworc3RhdGljIGZsb2F0IHNzRnVuYyhjb25zdCBmbG9hdCB0LCBjb25zdCBmbG9hdCAqcCkKK3sKKyAgICByZXR1cm4gKGZsb2F0KShwb3cocG93KGZhYnMoY29zKHBbMF0gKiB0IC8gNCkpIC8gcFsxXSwgcFs0XSkgKworICAgICAgICAgICAgICAgICAgICAgICBwb3coZmFicyhzaW4ocFswXSAqIHQgLyA0KSkgLyBwWzJdLCBwWzVdKSwgMSAvIHBbM10pKTsKK30KKworCisvLyBDcmVhdGVzIGFuZCByZXR1cm5zIGEgc3VwZXJzaGFwZSBvYmplY3QuCisvLyBCYXNlZCBvbiBQYXVsIEJvdXJrZSdzIFBPVi1SYXkgaW1wbGVtZW50YXRpb24uCisvLyBodHRwOi8vYXN0cm9ub215LnN3aW4uZWR1LmF1L35wYm91cmtlL3BvdnJheS9zdXBlcnNoYXBlLworc3RhdGljIEdMT0JKRUNUICogY3JlYXRlU3VwZXJTaGFwZShjb25zdCBmbG9hdCAqcGFyYW1zKQoreworICAgIGNvbnN0IGludCByZXNvbDEgPSAoaW50KXBhcmFtc1tTVVBFUlNIQVBFX1BBUkFNUyAtIDNdOworICAgIGNvbnN0IGludCByZXNvbDIgPSAoaW50KXBhcmFtc1tTVVBFUlNIQVBFX1BBUkFNUyAtIDJdOworICAgIC8vIGxhdGl0dWRlIDAgdG8gcGkvMiBmb3Igbm8gbWlycm9yZWQgYm90dG9tCisgICAgLy8gKGxhdGl0dWRlQmVnaW49PTAgZm9yIC1waS8yIHRvIHBpLzIgb3JpZ2luYWxseSkKKyAgICBjb25zdCBpbnQgbGF0aXR1ZGVCZWdpbiA9IHJlc29sMiAvIDQ7CisgICAgY29uc3QgaW50IGxhdGl0dWRlRW5kID0gcmVzb2wyIC8gMjsgICAgLy8gbm9uLWluY2x1c2l2ZQorICAgIGNvbnN0IGludCBsb25naXR1ZGVDb3VudCA9IHJlc29sMTsKKyAgICBjb25zdCBpbnQgbGF0aXR1ZGVDb3VudCA9IGxhdGl0dWRlRW5kIC0gbGF0aXR1ZGVCZWdpbjsKKyAgICBjb25zdCBsb25nIHRyaWFuZ2xlQ291bnQgPSBsb25naXR1ZGVDb3VudCAqIGxhdGl0dWRlQ291bnQgKiAyOworICAgIGNvbnN0IGxvbmcgdmVydGljZXMgPSB0cmlhbmdsZUNvdW50ICogMzsKKyAgICBHTE9CSkVDVCAqcmVzdWx0OworICAgIGZsb2F0IGJhc2VDb2xvclszXTsKKyAgICBpbnQgYSwgbG9uZ2l0dWRlLCBsYXRpdHVkZTsKKyAgICBsb25nIGN1cnJlbnRWZXJ0ZXgsIGN1cnJlbnRRdWFkOworCisgICAgcmVzdWx0ID0gbmV3R0xPYmplY3QodmVydGljZXMsIDMsIDEpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBmb3IgKGEgPSAwOyBhIDwgMzsgKythKQorICAgICAgICBiYXNlQ29sb3JbYV0gPSAoKHJhbmRvbVVJbnQoKSAlIDE1NSkgKyAxMDApIC8gMjU1LmY7CisKKyAgICBjdXJyZW50UXVhZCA9IDA7CisgICAgY3VycmVudFZlcnRleCA9IDA7CisKKyAgICAvLyBsb25naXR1ZGUgLXBpIHRvIHBpCisgICAgZm9yIChsb25naXR1ZGUgPSAwOyBsb25naXR1ZGUgPCBsb25naXR1ZGVDb3VudDsgKytsb25naXR1ZGUpCisgICAgeworCisgICAgICAgIC8vIGxhdGl0dWRlIDAgdG8gcGkvMgorICAgICAgICBmb3IgKGxhdGl0dWRlID0gbGF0aXR1ZGVCZWdpbjsgbGF0aXR1ZGUgPCBsYXRpdHVkZUVuZDsgKytsYXRpdHVkZSkKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQgdDEgPSAtUEkgKyBsb25naXR1ZGUgKiAyICogUEkgLyByZXNvbDE7CisgICAgICAgICAgICBmbG9hdCB0MiA9IC1QSSArIChsb25naXR1ZGUgKyAxKSAqIDIgKiBQSSAvIHJlc29sMTsKKyAgICAgICAgICAgIGZsb2F0IHAxID0gLVBJIC8gMiArIGxhdGl0dWRlICogMiAqIFBJIC8gcmVzb2wyOworICAgICAgICAgICAgZmxvYXQgcDIgPSAtUEkgLyAyICsgKGxhdGl0dWRlICsgMSkgKiAyICogUEkgLyByZXNvbDI7CisgICAgICAgICAgICBmbG9hdCByMCwgcjEsIHIyLCByMzsKKworICAgICAgICAgICAgcjAgPSBzc0Z1bmModDEsIHBhcmFtcyk7CisgICAgICAgICAgICByMSA9IHNzRnVuYyhwMSwgJnBhcmFtc1s2XSk7CisgICAgICAgICAgICByMiA9IHNzRnVuYyh0MiwgcGFyYW1zKTsKKyAgICAgICAgICAgIHIzID0gc3NGdW5jKHAyLCAmcGFyYW1zWzZdKTsKKworICAgICAgICAgICAgaWYgKHIwICE9IDAgJiYgcjEgIT0gMCAmJiByMiAhPSAwICYmIHIzICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVkVDVE9SMyBwYSwgcGIsIHBjLCBwZDsKKyAgICAgICAgICAgICAgICBWRUNUT1IzIHYxLCB2MiwgbjsKKyAgICAgICAgICAgICAgICBmbG9hdCBjYTsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICAvL2Zsb2F0IGxlblNxLCBpbnZMZW5TcTsKKworICAgICAgICAgICAgICAgIHN1cGVyU2hhcGVNYXAoJnBhLCByMCwgcjEsIHQxLCBwMSk7CisgICAgICAgICAgICAgICAgc3VwZXJTaGFwZU1hcCgmcGIsIHIyLCByMSwgdDIsIHAxKTsKKyAgICAgICAgICAgICAgICBzdXBlclNoYXBlTWFwKCZwYywgcjIsIHIzLCB0MiwgcDIpOworICAgICAgICAgICAgICAgIHN1cGVyU2hhcGVNYXAoJnBkLCByMCwgcjMsIHQxLCBwMik7CisKKyAgICAgICAgICAgICAgICAvLyBrbHVkZ2UgdG8gc2V0IGxvd2VyIGVkZ2Ugb2YgdGhlIG9iamVjdCB0byBmaXhlZCBsZXZlbAorICAgICAgICAgICAgICAgIGlmIChsYXRpdHVkZSA9PSBsYXRpdHVkZUJlZ2luICsgMSkKKyAgICAgICAgICAgICAgICAgICAgcGEueiA9IHBiLnogPSAwOworCisgICAgICAgICAgICAgICAgdmVjdG9yM1N1YigmdjEsICZwYiwgJnBhKTsKKyAgICAgICAgICAgICAgICB2ZWN0b3IzU3ViKCZ2MiwgJnBkLCAmcGEpOworCisgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIG5vcm1hbCB3aXRoIGNyb3NzIHByb2R1Y3QuCisgICAgICAgICAgICAgICAgLyogICBpICAgIGogICAgayAgICAgIGkgICAgagorICAgICAgICAgICAgICAgICAqIHYxLnggdjEueSB2MS56IHwgdjEueCB2MS55CisgICAgICAgICAgICAgICAgICogdjIueCB2Mi55IHYyLnogfCB2Mi54IHYyLnkKKyAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgIG4ueCA9IHYxLnkgKiB2Mi56IC0gdjEueiAqIHYyLnk7CisgICAgICAgICAgICAgICAgbi55ID0gdjEueiAqIHYyLnggLSB2MS54ICogdjIuejsKKyAgICAgICAgICAgICAgICBuLnogPSB2MS54ICogdjIueSAtIHYxLnkgKiB2Mi54OworCisgICAgICAgICAgICAgICAgLyogUHJlLW5vcm1hbGl6YXRpb24gb2YgdGhlIG5vcm1hbHMgaXMgZGlzYWJsZWQgaGVyZSBiZWNhdXNlCisgICAgICAgICAgICAgICAgICogdGhleSB3aWxsIGJlIG5vcm1hbGl6ZWQgYW55d2F5IGxhdGVyIGR1ZSB0byBhdXRvbWF0aWMKKyAgICAgICAgICAgICAgICAgKiBub3JtYWxpemF0aW9uIChHTF9OT1JNQUxJWkUpLiBJdCBpcyBlbmFibGVkIGJlY2F1c2UgdGhlCisgICAgICAgICAgICAgICAgICogb2JqZWN0cyBhcmUgc2NhbGVkIHdpdGggZ2xTY2FsZS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgIGxlblNxID0gbi54ICogbi54ICsgbi55ICogbi55ICsgbi56ICogbi56OworICAgICAgICAgICAgICAgIGludkxlblNxID0gKGZsb2F0KSgxIC8gc3FydChsZW5TcSkpOworICAgICAgICAgICAgICAgIG4ueCAqPSBpbnZMZW5TcTsKKyAgICAgICAgICAgICAgICBuLnkgKj0gaW52TGVuU3E7CisgICAgICAgICAgICAgICAgbi56ICo9IGludkxlblNxOworICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICBjYSA9IHBhLnogKyAwLjVmOworCisgICAgICAgICAgICAgICAgZm9yIChpID0gY3VycmVudFZlcnRleCAqIDM7CisgICAgICAgICAgICAgICAgICAgICBpIDwgKGN1cnJlbnRWZXJ0ZXggKyA2KSAqIDM7CisgICAgICAgICAgICAgICAgICAgICBpICs9IDMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQtPm5vcm1hbEFycmF5W2ldID0gRklYRUQobi54KTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5ub3JtYWxBcnJheVtpICsgMV0gPSBGSVhFRChuLnkpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQtPm5vcm1hbEFycmF5W2kgKyAyXSA9IEZJWEVEKG4ueik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaSA9IGN1cnJlbnRWZXJ0ZXggKiA0OworICAgICAgICAgICAgICAgICAgICAgaSA8IChjdXJyZW50VmVydGV4ICsgNikgKiA0OworICAgICAgICAgICAgICAgICAgICAgaSArPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGEsIGNvbG9yWzNdOworICAgICAgICAgICAgICAgICAgICBmb3IgKGEgPSAwOyBhIDwgMzsgKythKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2xvclthXSA9IChpbnQpKGNhICogYmFzZUNvbG9yW2FdICogMjU1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xvclthXSA+IDI1NSkgY29sb3JbYV0gPSAyNTU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5jb2xvckFycmF5W2ldID0gKEdMdWJ5dGUpY29sb3JbMF07CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+Y29sb3JBcnJheVtpICsgMV0gPSAoR0x1Ynl0ZSljb2xvclsxXTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5jb2xvckFycmF5W2kgKyAyXSA9IChHTHVieXRlKWNvbG9yWzJdOworICAgICAgICAgICAgICAgICAgICByZXN1bHQtPmNvbG9yQXJyYXlbaSArIDNdID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogM10gPSBGSVhFRChwYS54KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMV0gPSBGSVhFRChwYS55KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMl0gPSBGSVhFRChwYS56KTsKKyAgICAgICAgICAgICAgICArK2N1cnJlbnRWZXJ0ZXg7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogM10gPSBGSVhFRChwYi54KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMV0gPSBGSVhFRChwYi55KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMl0gPSBGSVhFRChwYi56KTsKKyAgICAgICAgICAgICAgICArK2N1cnJlbnRWZXJ0ZXg7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogM10gPSBGSVhFRChwZC54KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMV0gPSBGSVhFRChwZC55KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMl0gPSBGSVhFRChwZC56KTsKKyAgICAgICAgICAgICAgICArK2N1cnJlbnRWZXJ0ZXg7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogM10gPSBGSVhFRChwYi54KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMV0gPSBGSVhFRChwYi55KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMl0gPSBGSVhFRChwYi56KTsKKyAgICAgICAgICAgICAgICArK2N1cnJlbnRWZXJ0ZXg7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogM10gPSBGSVhFRChwYy54KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMV0gPSBGSVhFRChwYy55KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMl0gPSBGSVhFRChwYy56KTsKKyAgICAgICAgICAgICAgICArK2N1cnJlbnRWZXJ0ZXg7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogM10gPSBGSVhFRChwZC54KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMV0gPSBGSVhFRChwZC55KTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMl0gPSBGSVhFRChwZC56KTsKKyAgICAgICAgICAgICAgICArK2N1cnJlbnRWZXJ0ZXg7CisgICAgICAgICAgICB9IC8vIHIwICYmIHIxICYmIHIyICYmIHIzCisgICAgICAgICAgICArK2N1cnJlbnRRdWFkOworICAgICAgICB9IC8vIGxhdGl0dWRlCisgICAgfSAvLyBsb25naXR1ZGUKKworICAgIC8vIFNldCBudW1iZXIgb2YgdmVydGljZXMgaW4gb2JqZWN0IHRvIHRoZSBhY3R1YWwgYW1vdW50IGNyZWF0ZWQuCisgICAgcmVzdWx0LT5jb3VudCA9IGN1cnJlbnRWZXJ0ZXg7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyBHTE9CSkVDVCAqIGNyZWF0ZUdyb3VuZFBsYW5lKCkKK3sKKyAgICBjb25zdCBpbnQgc2NhbGUgPSA0OworICAgIGNvbnN0IGludCB5QmVnaW4gPSAtMTUsIHlFbmQgPSAxNTsgICAgLy8gZW5kcyBhcmUgbm9uLWluY2x1c2l2ZQorICAgIGNvbnN0IGludCB4QmVnaW4gPSAtMTUsIHhFbmQgPSAxNTsKKyAgICBjb25zdCBsb25nIHRyaWFuZ2xlQ291bnQgPSAoeUVuZCAtIHlCZWdpbikgKiAoeEVuZCAtIHhCZWdpbikgKiAyOworICAgIGNvbnN0IGxvbmcgdmVydGljZXMgPSB0cmlhbmdsZUNvdW50ICogMzsKKyAgICBHTE9CSkVDVCAqcmVzdWx0OworICAgIGludCB4LCB5OworICAgIGxvbmcgY3VycmVudFZlcnRleCwgY3VycmVudFF1YWQ7CisKKyAgICByZXN1bHQgPSBuZXdHTE9iamVjdCh2ZXJ0aWNlcywgMiwgMCk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGN1cnJlbnRRdWFkID0gMDsKKyAgICBjdXJyZW50VmVydGV4ID0gMDsKKworICAgIGZvciAoeSA9IHlCZWdpbjsgeSA8IHlFbmQ7ICsreSkKKyAgICB7CisgICAgICAgIGZvciAoeCA9IHhCZWdpbjsgeCA8IHhFbmQ7ICsreCkKKyAgICAgICAgeworICAgICAgICAgICAgR0x1Ynl0ZSBjb2xvcjsKKyAgICAgICAgICAgIGludCBpLCBhOworICAgICAgICAgICAgY29sb3IgPSAoR0x1Ynl0ZSkoKHJhbmRvbVVJbnQoKSAmIDB4NWYpICsgODEpOyAgLy8gMTAxIDExMTEKKyAgICAgICAgICAgIGZvciAoaSA9IGN1cnJlbnRWZXJ0ZXggKiA0OyBpIDwgKGN1cnJlbnRWZXJ0ZXggKyA2KSAqIDQ7IGkgKz0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXN1bHQtPmNvbG9yQXJyYXlbaV0gPSBjb2xvcjsKKyAgICAgICAgICAgICAgICByZXN1bHQtPmNvbG9yQXJyYXlbaSArIDFdID0gY29sb3I7CisgICAgICAgICAgICAgICAgcmVzdWx0LT5jb2xvckFycmF5W2kgKyAyXSA9IGNvbG9yOworICAgICAgICAgICAgICAgIHJlc3VsdC0+Y29sb3JBcnJheVtpICsgM10gPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBeGlzIGJpdHMgZm9yIHF1YWQgdHJpYW5nbGVzOgorICAgICAgICAgICAgLy8geDogMDExMTAwICgweDFjKSwgeTogMTEwMDAxICgweDMxKSAgKGNsb2Nrd2lzZSkKKyAgICAgICAgICAgIC8vIHg6IDAwMTExMCAoMHgwZSksIHk6IDEwMDAxMSAoMHgyMykgIChjb3VudGVyLWNsb2Nrd2lzZSkKKyAgICAgICAgICAgIGZvciAoYSA9IDA7IGEgPCA2OyArK2EpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHhtID0geCArICgoMHgxYyA+PiBhKSAmIDEpOworICAgICAgICAgICAgICAgIGNvbnN0IGludCB5bSA9IHkgKyAoKDB4MzEgPj4gYSkgJiAxKTsKKyAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBtID0gKGZsb2F0KShjb3MoeG0gKiAyKSAqIHNpbih5bSAqIDQpICogMC43NWYpOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDJdID0KKyAgICAgICAgICAgICAgICAgICAgRklYRUQoeG0gKiBzY2FsZSArIG0pOworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDIgKyAxXSA9CisgICAgICAgICAgICAgICAgICAgIEZJWEVEKHltICogc2NhbGUgKyBtKTsKKyAgICAgICAgICAgICAgICArK2N1cnJlbnRWZXJ0ZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2N1cnJlbnRRdWFkOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIHZvaWQgZHJhd0dyb3VuZFBsYW5lKCkKK3sKKyAgICBnbERpc2FibGUoR0xfQ1VMTF9GQUNFKTsKKyAgICBnbERpc2FibGUoR0xfREVQVEhfVEVTVCk7CisgICAgZ2xFbmFibGUoR0xfQkxFTkQpOworICAgIGdsQmxlbmRGdW5jKEdMX1pFUk8sIEdMX1NSQ19DT0xPUik7CisgICAgZ2xEaXNhYmxlKEdMX0xJR0hUSU5HKTsKKworICAgIGRyYXdHTE9iamVjdChzR3JvdW5kUGxhbmUpOworCisgICAgZ2xFbmFibGUoR0xfTElHSFRJTkcpOworICAgIGdsRGlzYWJsZShHTF9CTEVORCk7CisgICAgZ2xFbmFibGUoR0xfREVQVEhfVEVTVCk7Cit9CisKKworc3RhdGljIHZvaWQgZHJhd0ZhZGVRdWFkKCkKK3sKKyAgICBzdGF0aWMgY29uc3QgR0xmaXhlZCBxdWFkVmVydGljZXNbXSA9IHsKKyAgICAgICAgLTB4MTAwMDAsIC0weDEwMDAwLAorICAgICAgICAgMHgxMDAwMCwgLTB4MTAwMDAsCisgICAgICAgIC0weDEwMDAwLCAgMHgxMDAwMCwKKyAgICAgICAgIDB4MTAwMDAsIC0weDEwMDAwLAorICAgICAgICAgMHgxMDAwMCwgIDB4MTAwMDAsCisgICAgICAgIC0weDEwMDAwLCAgMHgxMDAwMAorICAgIH07CisKKyAgICBjb25zdCBpbnQgYmVnaW5GYWRlID0gc1RpY2sgLSBzQ3VycmVudENhbVRyYWNrU3RhcnRUaWNrOworICAgIGNvbnN0IGludCBlbmRGYWRlID0gc05leHRDYW1UcmFja1N0YXJ0VGljayAtIHNUaWNrOworICAgIGNvbnN0IGludCBtaW5GYWRlID0gYmVnaW5GYWRlIDwgZW5kRmFkZSA/IGJlZ2luRmFkZSA6IGVuZEZhZGU7CisKKyAgICBpZiAobWluRmFkZSA8IDEwMjQpCisgICAgeworICAgICAgICBjb25zdCBHTGZpeGVkIGZhZGVDb2xvciA9IG1pbkZhZGUgPDwgNjsKKyAgICAgICAgZ2xDb2xvcjR4KGZhZGVDb2xvciwgZmFkZUNvbG9yLCBmYWRlQ29sb3IsIDApOworCisgICAgICAgIGdsRGlzYWJsZShHTF9ERVBUSF9URVNUKTsKKyAgICAgICAgZ2xFbmFibGUoR0xfQkxFTkQpOworICAgICAgICBnbEJsZW5kRnVuYyhHTF9aRVJPLCBHTF9TUkNfQ09MT1IpOworICAgICAgICBnbERpc2FibGUoR0xfTElHSFRJTkcpOworCisgICAgICAgIGdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOworICAgICAgICBnbExvYWRJZGVudGl0eSgpOworCisgICAgICAgIGdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKTsKKyAgICAgICAgZ2xMb2FkSWRlbnRpdHkoKTsKKworICAgICAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9DT0xPUl9BUlJBWSk7CisgICAgICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX05PUk1BTF9BUlJBWSk7CisgICAgICAgIGdsVmVydGV4UG9pbnRlcigyLCBHTF9GSVhFRCwgMCwgcXVhZFZlcnRpY2VzKTsKKyAgICAgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFUywgMCwgNik7CisKKyAgICAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9DT0xPUl9BUlJBWSk7CisKKyAgICAgICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CisKKyAgICAgICAgZ2xFbmFibGUoR0xfTElHSFRJTkcpOworICAgICAgICBnbERpc2FibGUoR0xfQkxFTkQpOworICAgICAgICBnbEVuYWJsZShHTF9ERVBUSF9URVNUKTsKKyAgICB9Cit9CisKKworLy8gQ2FsbGVkIGZyb20gdGhlIGFwcCBmcmFtZXdvcmsuCit2b2lkIGFwcEluaXQoKQoreworICAgIGludCBhOworCisgICAgZ2xFbmFibGUoR0xfTk9STUFMSVpFKTsKKyAgICBnbEVuYWJsZShHTF9ERVBUSF9URVNUKTsKKyAgICBnbERpc2FibGUoR0xfQ1VMTF9GQUNFKTsKKyAgICBnbFNoYWRlTW9kZWwoR0xfRkxBVCk7CisKKyAgICBnbEVuYWJsZShHTF9MSUdIVElORyk7CisgICAgZ2xFbmFibGUoR0xfTElHSFQwKTsKKyAgICBnbEVuYWJsZShHTF9MSUdIVDEpOworICAgIGdsRW5hYmxlKEdMX0xJR0hUMik7CisKKyAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1ZFUlRFWF9BUlJBWSk7CisgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9DT0xPUl9BUlJBWSk7CisKKyAgICBzZWVkUmFuZG9tKDE1KTsKKworICAgIGZvciAoYSA9IDA7IGEgPCBTVVBFUlNIQVBFX0NPVU5UOyArK2EpCisgICAgeworICAgICAgICBzU3VwZXJTaGFwZU9iamVjdHNbYV0gPSBjcmVhdGVTdXBlclNoYXBlKHNTdXBlclNoYXBlUGFyYW1zW2FdKTsKKyAgICAgICAgYXNzZXJ0KHNTdXBlclNoYXBlT2JqZWN0c1thXSAhPSBOVUxMKTsKKyAgICB9CisgICAgc0dyb3VuZFBsYW5lID0gY3JlYXRlR3JvdW5kUGxhbmUoKTsKKyAgICBhc3NlcnQoc0dyb3VuZFBsYW5lICE9IE5VTEwpOworfQorCisKKy8vIENhbGxlZCBmcm9tIHRoZSBhcHAgZnJhbWV3b3JrLgordm9pZCBhcHBEZWluaXQoKQoreworICAgIGludCBhOworICAgIGZvciAoYSA9IDA7IGEgPCBTVVBFUlNIQVBFX0NPVU5UOyArK2EpCisgICAgICAgIGZyZWVHTE9iamVjdChzU3VwZXJTaGFwZU9iamVjdHNbYV0pOworICAgIGZyZWVHTE9iamVjdChzR3JvdW5kUGxhbmUpOworfQorCisKK3N0YXRpYyB2b2lkIGdsdVBlcnNwZWN0aXZlKEdMZmxvYXQgZm92eSwgR0xmbG9hdCBhc3BlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpCit7CisgICAgR0xmbG9hdCB4bWluLCB4bWF4LCB5bWluLCB5bWF4OworCisgICAgeW1heCA9IHpOZWFyICogKEdMZmxvYXQpdGFuKGZvdnkgKiBQSSAvIDM2MCk7CisgICAgeW1pbiA9IC15bWF4OworICAgIHhtaW4gPSB5bWluICogYXNwZWN0OworICAgIHhtYXggPSB5bWF4ICogYXNwZWN0OworCisgICAgZ2xGcnVzdHVteCgoR0xmaXhlZCkoeG1pbiAqIDY1NTM2KSwgKEdMZml4ZWQpKHhtYXggKiA2NTUzNiksCisgICAgICAgICAgICAgICAoR0xmaXhlZCkoeW1pbiAqIDY1NTM2KSwgKEdMZml4ZWQpKHltYXggKiA2NTUzNiksCisgICAgICAgICAgICAgICAoR0xmaXhlZCkoek5lYXIgKiA2NTUzNiksIChHTGZpeGVkKSh6RmFyICogNjU1MzYpKTsKK30KKworCitzdGF0aWMgdm9pZCBwcmVwYXJlRnJhbWUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIGdsVmlld3BvcnQoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisKKyAgICBnbENsZWFyQ29sb3J4KChHTGZpeGVkKSgwLjFmICogNjU1MzYpLAorICAgICAgICAgICAgICAgICAgKEdMZml4ZWQpKDAuMmYgKiA2NTUzNiksCisgICAgICAgICAgICAgICAgICAoR0xmaXhlZCkoMC4zZiAqIDY1NTM2KSwgMHgxMDAwMCk7CisgICAgZ2xDbGVhcihHTF9ERVBUSF9CVUZGRVJfQklUIHwgR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisKKyAgICBnbE1hdHJpeE1vZGUoR0xfUFJPSkVDVElPTik7CisgICAgZ2xMb2FkSWRlbnRpdHkoKTsKKyAgICBnbHVQZXJzcGVjdGl2ZSg0NSwgKGZsb2F0KXdpZHRoIC8gaGVpZ2h0LCAwLjVmLCAxNTApOworCisgICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CisKKyAgICBnbExvYWRJZGVudGl0eSgpOworfQorCisKK3N0YXRpYyB2b2lkIGNvbmZpZ3VyZUxpZ2h0QW5kTWF0ZXJpYWwoKQoreworICAgIHN0YXRpYyBHTGZpeGVkIGxpZ2h0MFBvc2l0aW9uW10gPSB7IC0weDQwMDAwLCAweDEwMDAwLCAweDEwMDAwLCAwIH07CisgICAgc3RhdGljIEdMZml4ZWQgbGlnaHQwRGlmZnVzZVtdID0geyAweDEwMDAwLCAweDY2NjYsIDAsIDB4MTAwMDAgfTsKKyAgICBzdGF0aWMgR0xmaXhlZCBsaWdodDFQb3NpdGlvbltdID0geyAweDEwMDAwLCAtMHgyMDAwMCwgLTB4MTAwMDAsIDAgfTsKKyAgICBzdGF0aWMgR0xmaXhlZCBsaWdodDFEaWZmdXNlW10gPSB7IDB4MTFlYiwgMHgyM2Q3LCAweDU5OTksIDB4MTAwMDAgfTsKKyAgICBzdGF0aWMgR0xmaXhlZCBsaWdodDJQb3NpdGlvbltdID0geyAtMHgxMDAwMCwgMCwgLTB4NDAwMDAsIDAgfTsKKyAgICBzdGF0aWMgR0xmaXhlZCBsaWdodDJEaWZmdXNlW10gPSB7IDB4MTFlYiwgMHgyYjg1LCAweDIzZDcsIDB4MTAwMDAgfTsKKyAgICBzdGF0aWMgR0xmaXhlZCBtYXRlcmlhbFNwZWN1bGFyW10gPSB7IDB4MTAwMDAsIDB4MTAwMDAsIDB4MTAwMDAsIDB4MTAwMDAgfTsKKworICAgIGdsTGlnaHR4dihHTF9MSUdIVDAsIEdMX1BPU0lUSU9OLCBsaWdodDBQb3NpdGlvbik7CisgICAgZ2xMaWdodHh2KEdMX0xJR0hUMCwgR0xfRElGRlVTRSwgbGlnaHQwRGlmZnVzZSk7CisgICAgZ2xMaWdodHh2KEdMX0xJR0hUMSwgR0xfUE9TSVRJT04sIGxpZ2h0MVBvc2l0aW9uKTsKKyAgICBnbExpZ2h0eHYoR0xfTElHSFQxLCBHTF9ESUZGVVNFLCBsaWdodDFEaWZmdXNlKTsKKyAgICBnbExpZ2h0eHYoR0xfTElHSFQyLCBHTF9QT1NJVElPTiwgbGlnaHQyUG9zaXRpb24pOworICAgIGdsTGlnaHR4dihHTF9MSUdIVDIsIEdMX0RJRkZVU0UsIGxpZ2h0MkRpZmZ1c2UpOworICAgIGdsTWF0ZXJpYWx4dihHTF9GUk9OVF9BTkRfQkFDSywgR0xfU1BFQ1VMQVIsIG1hdGVyaWFsU3BlY3VsYXIpOworCisgICAgZ2xNYXRlcmlhbHgoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX1NISU5JTkVTUywgNjAgPDwgMTYpOworICAgIGdsRW5hYmxlKEdMX0NPTE9SX01BVEVSSUFMKTsKK30KKworCitzdGF0aWMgdm9pZCBkcmF3TW9kZWxzKGZsb2F0IHpTY2FsZSkKK3sKKyAgICBjb25zdCBpbnQgdHJhbnNsYXRpb25TY2FsZSA9IDk7CisgICAgaW50IHgsIHk7CisKKyAgICBzZWVkUmFuZG9tKDkpOworCisgICAgZ2xTY2FsZXgoMSA8PCAxNiwgMSA8PCAxNiwgKEdMZml4ZWQpKHpTY2FsZSAqIDY1NTM2KSk7CisKKyAgICBmb3IgKHkgPSAtNTsgeSA8PSA1OyArK3kpCisgICAgeworICAgICAgICBmb3IgKHggPSAtNTsgeCA8PSA1OyArK3gpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0IGJ1aWxkaW5nU2NhbGU7CisgICAgICAgICAgICBHTGZpeGVkIGZpeGVkU2NhbGU7CisKKyAgICAgICAgICAgIGludCBjdXJTaGFwZSA9IHJhbmRvbVVJbnQoKSAlIFNVUEVSU0hBUEVfQ09VTlQ7CisgICAgICAgICAgICBidWlsZGluZ1NjYWxlID0gc1N1cGVyU2hhcGVQYXJhbXNbY3VyU2hhcGVdW1NVUEVSU0hBUEVfUEFSQU1TIC0gMV07CisgICAgICAgICAgICBmaXhlZFNjYWxlID0gKEdMZml4ZWQpKGJ1aWxkaW5nU2NhbGUgKiA2NTUzNik7CisKKyAgICAgICAgICAgIGdsUHVzaE1hdHJpeCgpOworICAgICAgICAgICAgZ2xUcmFuc2xhdGV4KCh4ICogdHJhbnNsYXRpb25TY2FsZSkgKiA2NTUzNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoeSAqIHRyYW5zbGF0aW9uU2NhbGUpICogNjU1MzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICBnbFJvdGF0ZXgoKEdMZml4ZWQpKChyYW5kb21VSW50KCkgJSAzNjApIDw8IDE2KSwgMCwgMCwgMSA8PCAxNik7CisgICAgICAgICAgICBnbFNjYWxleChmaXhlZFNjYWxlLCBmaXhlZFNjYWxlLCBmaXhlZFNjYWxlKTsKKworICAgICAgICAgICAgZHJhd0dMT2JqZWN0KHNTdXBlclNoYXBlT2JqZWN0c1tjdXJTaGFwZV0pOworICAgICAgICAgICAgZ2xQb3BNYXRyaXgoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoeCA9IC0yOyB4IDw9IDI7ICsreCkKKyAgICB7CisgICAgICAgIGNvbnN0IGludCBzaGlwU2NhbGUxMDAgPSB0cmFuc2xhdGlvblNjYWxlICogNTAwOworICAgICAgICBjb25zdCBpbnQgb2ZmczEwMCA9IHggKiBzaGlwU2NhbGUxMDAgKyAoc1RpY2sgJSBzaGlwU2NhbGUxMDApOworICAgICAgICBmbG9hdCBvZmZzID0gb2ZmczEwMCAqIDAuMDFmOworICAgICAgICBHTGZpeGVkIGZpeGVkT2ZmcyA9IChHTGZpeGVkKShvZmZzICogNjU1MzYpOworICAgICAgICBnbFB1c2hNYXRyaXgoKTsKKyAgICAgICAgZ2xUcmFuc2xhdGV4KGZpeGVkT2ZmcywgLTQgKiA2NTUzNiwgMiA8PCAxNik7CisgICAgICAgIGRyYXdHTE9iamVjdChzU3VwZXJTaGFwZU9iamVjdHNbU1VQRVJTSEFQRV9DT1VOVCAtIDFdKTsKKyAgICAgICAgZ2xQb3BNYXRyaXgoKTsKKyAgICAgICAgZ2xQdXNoTWF0cml4KCk7CisgICAgICAgIGdsVHJhbnNsYXRleCgtNCAqIDY1NTM2LCBmaXhlZE9mZnMsIDQgPDwgMTYpOworICAgICAgICBnbFJvdGF0ZXgoOTAgPDwgMTYsIDAsIDAsIDEgPDwgMTYpOworICAgICAgICBkcmF3R0xPYmplY3Qoc1N1cGVyU2hhcGVPYmplY3RzW1NVUEVSU0hBUEVfQ09VTlQgLSAxXSk7CisgICAgICAgIGdsUG9wTWF0cml4KCk7CisgICAgfQorfQorCisKKy8qIEZvbGxvd2luZyBnbHVMb29rQXQgaW1wbGVtZW50YXRpb24gaXMgYWRhcHRlZCBmcm9tIHRoZQorICogTWVzYSAzRCBHcmFwaGljcyBsaWJyYXJ5LiBodHRwOi8vd3d3Lm1lc2EzZC5vcmcKKyAqLworc3RhdGljIHZvaWQgZ2x1TG9va0F0KEdMZmxvYXQgZXlleCwgR0xmbG9hdCBleWV5LCBHTGZsb2F0IGV5ZXosCisJICAgICAgICAgICAgICBHTGZsb2F0IGNlbnRlcngsIEdMZmxvYXQgY2VudGVyeSwgR0xmbG9hdCBjZW50ZXJ6LAorCSAgICAgICAgICAgICAgR0xmbG9hdCB1cHgsIEdMZmxvYXQgdXB5LCBHTGZsb2F0IHVweikKK3sKKyAgICBHTGZsb2F0IG1bMTZdOworICAgIEdMZmxvYXQgeFszXSwgeVszXSwgelszXTsKKyAgICBHTGZsb2F0IG1hZzsKKworICAgIC8qIE1ha2Ugcm90YXRpb24gbWF0cml4ICovCisKKyAgICAvKiBaIHZlY3RvciAqLworICAgIHpbMF0gPSBleWV4IC0gY2VudGVyeDsKKyAgICB6WzFdID0gZXlleSAtIGNlbnRlcnk7CisgICAgelsyXSA9IGV5ZXogLSBjZW50ZXJ6OworICAgIG1hZyA9IChmbG9hdClzcXJ0KHpbMF0gKiB6WzBdICsgelsxXSAqIHpbMV0gKyB6WzJdICogelsyXSk7CisgICAgaWYgKG1hZykgewkJCS8qIG1waWNobGVyLCAxOTk1MDUxNSAqLworICAgICAgICB6WzBdIC89IG1hZzsKKyAgICAgICAgelsxXSAvPSBtYWc7CisgICAgICAgIHpbMl0gLz0gbWFnOworICAgIH0KKworICAgIC8qIFkgdmVjdG9yICovCisgICAgeVswXSA9IHVweDsKKyAgICB5WzFdID0gdXB5OworICAgIHlbMl0gPSB1cHo7CisKKyAgICAvKiBYIHZlY3RvciA9IFkgY3Jvc3MgWiAqLworICAgIHhbMF0gPSB5WzFdICogelsyXSAtIHlbMl0gKiB6WzFdOworICAgIHhbMV0gPSAteVswXSAqIHpbMl0gKyB5WzJdICogelswXTsKKyAgICB4WzJdID0geVswXSAqIHpbMV0gLSB5WzFdICogelswXTsKKworICAgIC8qIFJlY29tcHV0ZSBZID0gWiBjcm9zcyBYICovCisgICAgeVswXSA9IHpbMV0gKiB4WzJdIC0gelsyXSAqIHhbMV07CisgICAgeVsxXSA9IC16WzBdICogeFsyXSArIHpbMl0gKiB4WzBdOworICAgIHlbMl0gPSB6WzBdICogeFsxXSAtIHpbMV0gKiB4WzBdOworCisgICAgLyogbXBpY2hsZXIsIDE5OTUwNTE1ICovCisgICAgLyogY3Jvc3MgcHJvZHVjdCBnaXZlcyBhcmVhIG9mIHBhcmFsbGVsb2dyYW0sIHdoaWNoIGlzIDwgMS4wIGZvcgorICAgICAqIG5vbi1wZXJwZW5kaWN1bGFyIHVuaXQtbGVuZ3RoIHZlY3RvcnM7IHNvIG5vcm1hbGl6ZSB4LCB5IGhlcmUKKyAgICAgKi8KKworICAgIG1hZyA9IChmbG9hdClzcXJ0KHhbMF0gKiB4WzBdICsgeFsxXSAqIHhbMV0gKyB4WzJdICogeFsyXSk7CisgICAgaWYgKG1hZykgeworICAgICAgICB4WzBdIC89IG1hZzsKKyAgICAgICAgeFsxXSAvPSBtYWc7CisgICAgICAgIHhbMl0gLz0gbWFnOworICAgIH0KKworICAgIG1hZyA9IChmbG9hdClzcXJ0KHlbMF0gKiB5WzBdICsgeVsxXSAqIHlbMV0gKyB5WzJdICogeVsyXSk7CisgICAgaWYgKG1hZykgeworICAgICAgICB5WzBdIC89IG1hZzsKKyAgICAgICAgeVsxXSAvPSBtYWc7CisgICAgICAgIHlbMl0gLz0gbWFnOworICAgIH0KKworI2RlZmluZSBNKHJvdyxjb2wpICBtW2NvbCo0K3Jvd10KKyAgICBNKDAsIDApID0geFswXTsKKyAgICBNKDAsIDEpID0geFsxXTsKKyAgICBNKDAsIDIpID0geFsyXTsKKyAgICBNKDAsIDMpID0gMC4wOworICAgIE0oMSwgMCkgPSB5WzBdOworICAgIE0oMSwgMSkgPSB5WzFdOworICAgIE0oMSwgMikgPSB5WzJdOworICAgIE0oMSwgMykgPSAwLjA7CisgICAgTSgyLCAwKSA9IHpbMF07CisgICAgTSgyLCAxKSA9IHpbMV07CisgICAgTSgyLCAyKSA9IHpbMl07CisgICAgTSgyLCAzKSA9IDAuMDsKKyAgICBNKDMsIDApID0gMC4wOworICAgIE0oMywgMSkgPSAwLjA7CisgICAgTSgzLCAyKSA9IDAuMDsKKyAgICBNKDMsIDMpID0gMS4wOworI3VuZGVmIE0KKyAgICB7CisgICAgICAgIGludCBhOworICAgICAgICBHTGZpeGVkIGZpeGVkTVsxNl07CisgICAgICAgIGZvciAoYSA9IDA7IGEgPCAxNjsgKythKQorICAgICAgICAgICAgZml4ZWRNW2FdID0gKEdMZml4ZWQpKG1bYV0gKiA2NTUzNik7CisgICAgICAgIGdsTXVsdE1hdHJpeHgoZml4ZWRNKTsKKyAgICB9CisKKyAgICAvKiBUcmFuc2xhdGUgRXllIHRvIE9yaWdpbiAqLworICAgIGdsVHJhbnNsYXRleCgoR0xmaXhlZCkoLWV5ZXggKiA2NTUzNiksCisgICAgICAgICAgICAgICAgIChHTGZpeGVkKSgtZXlleSAqIDY1NTM2KSwKKyAgICAgICAgICAgICAgICAgKEdMZml4ZWQpKC1leWV6ICogNjU1MzYpKTsKK30KKworCitzdGF0aWMgdm9pZCBjYW1UcmFjaygpCit7CisgICAgZmxvYXQgbGVycFs1XTsKKyAgICBmbG9hdCBlWCwgZVksIGVaLCBjWCwgY1ksIGNaOworICAgIGZsb2F0IHRyYWNrUG9zOworICAgIENBTVRSQUNLICpjYW07CisgICAgbG9uZyBjdXJyZW50Q2FtVGljazsKKyAgICBpbnQgYTsKKworICAgIGlmIChzTmV4dENhbVRyYWNrU3RhcnRUaWNrIDw9IHNUaWNrKQorICAgIHsKKyAgICAgICAgKytzQ3VycmVudENhbVRyYWNrOworICAgICAgICBzQ3VycmVudENhbVRyYWNrU3RhcnRUaWNrID0gc05leHRDYW1UcmFja1N0YXJ0VGljazsKKyAgICB9CisgICAgc05leHRDYW1UcmFja1N0YXJ0VGljayA9IHNDdXJyZW50Q2FtVHJhY2tTdGFydFRpY2sgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQ2FtVHJhY2tzW3NDdXJyZW50Q2FtVHJhY2tdLmxlbiAqIENBTVRSQUNLX0xFTjsKKworICAgIGNhbSA9ICZzQ2FtVHJhY2tzW3NDdXJyZW50Q2FtVHJhY2tdOworICAgIGN1cnJlbnRDYW1UaWNrID0gc1RpY2sgLSBzQ3VycmVudENhbVRyYWNrU3RhcnRUaWNrOworICAgIHRyYWNrUG9zID0gKGZsb2F0KWN1cnJlbnRDYW1UaWNrIC8gKENBTVRSQUNLX0xFTiAqIGNhbS0+bGVuKTsKKworICAgIGZvciAoYSA9IDA7IGEgPCA1OyArK2EpCisgICAgICAgIGxlcnBbYV0gPSAoY2FtLT5zcmNbYV0gKyBjYW0tPmRlc3RbYV0gKiB0cmFja1BvcykgKiAwLjAxZjsKKworICAgIGlmIChjYW0tPmRpc3QpCisgICAgeworICAgICAgICBmbG9hdCBkaXN0ID0gY2FtLT5kaXN0ICogMC4xZjsKKyAgICAgICAgY1ggPSBsZXJwWzBdOworICAgICAgICBjWSA9IGxlcnBbMV07CisgICAgICAgIGNaID0gbGVycFsyXTsKKyAgICAgICAgZVggPSBjWCAtIChmbG9hdCljb3MobGVycFszXSkgKiBkaXN0OworICAgICAgICBlWSA9IGNZIC0gKGZsb2F0KXNpbihsZXJwWzNdKSAqIGRpc3Q7CisgICAgICAgIGVaID0gY1ogLSBsZXJwWzRdOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBlWCA9IGxlcnBbMF07CisgICAgICAgIGVZID0gbGVycFsxXTsKKyAgICAgICAgZVogPSBsZXJwWzJdOworICAgICAgICBjWCA9IGVYICsgKGZsb2F0KWNvcyhsZXJwWzNdKTsKKyAgICAgICAgY1kgPSBlWSArIChmbG9hdClzaW4obGVycFszXSk7CisgICAgICAgIGNaID0gZVogKyBsZXJwWzRdOworICAgIH0KKyAgICBnbHVMb29rQXQoZVgsIGVZLCBlWiwgY1gsIGNZLCBjWiwgMCwgMCwgMSk7Cit9CisKKworLy8gQ2FsbGVkIGZyb20gdGhlIGFwcCBmcmFtZXdvcmsuCisvKiBUaGUgdGljayBpcyBjdXJyZW50IHRpbWUgaW4gbWlsbGlzZWNvbmRzLCB3aWR0aCBhbmQgaGVpZ2h0CisgKiBhcmUgdGhlIGltYWdlIGRpbWVuc2lvbnMgdG8gYmUgcmVuZGVyZWQuCisgKi8KK3ZvaWQgYXBwUmVuZGVyKGxvbmcgdGljaywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIGlmIChzU3RhcnRUaWNrID09IDApCisgICAgICAgIHNTdGFydFRpY2sgPSB0aWNrOworICAgIGlmICghZ0FwcEFsaXZlKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBBY3R1YWwgdGljayB2YWx1ZSBpcyAiYmx1cnJlZCIgYSBsaXR0bGUgYml0LgorICAgIHNUaWNrID0gKHNUaWNrICsgdGljayAtIHNTdGFydFRpY2spID4+IDE7CisKKyAgICAvLyBUZXJtaW5hdGUgYXBwbGljYXRpb24gYWZ0ZXIgcnVubmluZyB0aHJvdWdoIHRoZSBkZW1vbnN0cmF0aW9uIG9uY2UuCisgICAgaWYgKHNUaWNrID49IFJVTl9MRU5HVEgpCisgICAgeworICAgICAgICBnQXBwQWxpdmUgPSAwOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gUHJlcGFyZSBPcGVuR0wgRVMgZm9yIHJlbmRlcmluZyBvZiB0aGUgZnJhbWUuCisgICAgcHJlcGFyZUZyYW1lKHdpZHRoLCBoZWlnaHQpOworCisgICAgLy8gVXBkYXRlIHRoZSBjYW1lcmEgcG9zaXRpb24gYW5kIHNldCB0aGUgbG9va2F0LgorICAgIGNhbVRyYWNrKCk7CisKKyAgICAvLyBDb25maWd1cmUgZW52aXJvbm1lbnQuCisgICAgY29uZmlndXJlTGlnaHRBbmRNYXRlcmlhbCgpOworCisgICAgLy8gRHJhdyB0aGUgcmVmbGVjdGlvbiBieSBkcmF3aW5nIG1vZGVscyB3aXRoIG5lZ2F0ZWQgWi1heGlzLgorICAgIGdsUHVzaE1hdHJpeCgpOworICAgIGRyYXdNb2RlbHMoLTEpOworICAgIGdsUG9wTWF0cml4KCk7CisKKyAgICAvLyBCbGVuZCB0aGUgZ3JvdW5kIHBsYW5lIHRvIHRoZSB3aW5kb3cuCisgICAgZHJhd0dyb3VuZFBsYW5lKCk7CisKKyAgICAvLyBEcmF3IGFsbCB0aGUgbW9kZWxzIG5vcm1hbGx5LgorICAgIGRyYXdNb2RlbHMoMSk7CisKKyAgICAvLyBEcmF3IGZhZGUgcXVhZCBvdmVyIHdob2xlIHdpbmRvdyAod2hlbiBjaGFuZ2luZyBjYW1lcmFzKS4KKyAgICBkcmF3RmFkZVF1YWQoKTsKK30KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2dwdXN0YXRlLmMgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9ncHVzdGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNTQwYzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9ncHVzdGF0ZS5jCkBAIC0wLDAgKzEsMzkgQEAKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCitzdGF0aWMgdm9pZCAqbWFwX21lbW9yeShjb25zdCBjaGFyICpmbiwgdW5zaWduZWQgYmFzZSwgdW5zaWduZWQgc2l6ZSkKK3sKKyAgICBpbnQgZmQ7CisgICAgdm9pZCAqcHRyOworICAgIAorICAgIGZkID0gb3BlbihmbiwgT19SRFdSIHwgT19TWU5DKTsKKyAgICBpZihmZCA8IDApIHsKKyAgICAgICAgcGVycm9yKCJjYW5ub3Qgb3BlbiAlcyBmb3IgbWFwcGluZyIpOworICAgICAgICByZXR1cm4gTUFQX0ZBSUxFRDsKKyAgICB9CisKKyAgICBwdHIgPSBtbWFwKDAsIHNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisgICAgICAgICAgICAgICBNQVBfU0hBUkVELCBmZCwgYmFzZSk7CisgICAgY2xvc2UoZmQpOworICAgIAorICAgIGlmKHB0ciA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCJjYW5ub3QgbWFwICVzIChAJTA4eCwlMDh4KVxuIiwgZm4sIGJhc2UsIHNpemUpOworICAgIH0KKyAgICByZXR1cm4gcHRyOyAgICAKK30KKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisgICAgdm9pZCAqZ3JwX3JlZ3MgPSBtYXBfbWVtb3J5KCIvZGV2L2h3M2QiLCAwLCAxMDI0ICogMTAyNCk7CisgICAgcHJpbnRmKCJHUFUgYmFzZSBtYXBwZWQgYXQgJXBcbiIsIGdycF9yZWdzKTsKKyAgICBpbnQgc3RhdGVfb2Zmc2V0ID0gMHgxMDE0MDsKKyAgICBwcmludGYoIkdQVSBzdGF0ZSA9ICUwOGx4XG4iLAorICAgICAgICAgICAgKigobG9uZyopKChjaGFyKilncnBfcmVncyArIHN0YXRlX29mZnNldCkpICApOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9pbmNsdWRlL0dMRVMvZWdsLmggYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9pbmNsdWRlL0dMRVMvZWdsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RmODQxMAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2luY2x1ZGUvR0xFUy9lZ2wuaApAQCAtMCwwICsxLDIyOSBAQAorI2lmbmRlZiBfX2VnbF9oXworI2RlZmluZSBfX2VnbF9oXworCisvKgorKiogTGljZW5zZSBBcHBsaWNhYmlsaXR5LiBFeGNlcHQgdG8gdGhlIGV4dGVudCBwb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlCisqKiBtYWRlIHN1YmplY3QgdG8gYW4gYWx0ZXJuYXRpdmUgbGljZW5zZSBhcyBwZXJtaXR0ZWQgaW4gdGhlIFNHSSBGcmVlCisqKiBTb2Z0d2FyZSBMaWNlbnNlIEIsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMKKyoqIGZpbGUgYXJlIHN1YmplY3Qgb25seSB0byB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgTGljZW5zZS4gWW91IG1heSBub3QgdXNlCisqKiB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5CisqKiBvZiB0aGUgTGljZW5zZSBhdCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCBhdHRuOiBMZWdhbCBTZXJ2aWNlcywgMTYwMAorKiogQW1waGl0aGVhdHJlIFBhcmt3YXksIE1vdW50YWluIFZpZXcsIENBIDk0MDQzLTEzNTEsIG9yIGF0OgorKioKKyoqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9GcmVlQgorKioKKyoqIE5vdGUgdGhhdCwgYXMgcHJvdmlkZWQgaW4gdGhlIExpY2Vuc2UsIHRoZSBTb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiogIkFTIElTIiBiYXNpcywgd2l0aCBBTEwgRVhQUkVTUyBBTkQgSU1QTElFRCBXQVJSQU5USUVTIEFORCBDT05ESVRJT05TCisqKiBESVNDTEFJTUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIElNUExJRUQgV0FSUkFOVElFUyBBTkQKKyoqIENPTkRJVElPTlMgT0YgTUVSQ0hBTlRBQklMSVRZLCBTQVRJU0ZBQ1RPUlkgUVVBTElUWSwgRklUTkVTUyBGT1IgQQorKiogUEFSVElDVUxBUiBQVVJQT1NFLCBBTkQgTk9OLUlORlJJTkdFTUVOVC4KKyoqCisqKiBPcmlnaW5hbCBDb2RlLiBUaGUgT3JpZ2luYWwgQ29kZSBpczogT3BlbkdMIFNhbXBsZSBJbXBsZW1lbnRhdGlvbiwKKyoqIFZlcnNpb24gMS4yLjEsIHJlbGVhc2VkIEphbnVhcnkgMjYsIDIwMDAsIGRldmVsb3BlZCBieSBTaWxpY29uIEdyYXBoaWNzLAorKiogSW5jLiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKGMpIDE5OTEtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisqKiBDb3B5cmlnaHQgaW4gYW55IHBvcnRpb25zIGNyZWF0ZWQgYnkgdGhpcmQgcGFydGllcyBpcyBhcyBpbmRpY2F0ZWQKKyoqIGVsc2V3aGVyZSBoZXJlaW4uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqKgorKiogQWRkaXRpb25hbCBOb3RpY2UgUHJvdmlzaW9uczogVGhlIGFwcGxpY2F0aW9uIHByb2dyYW1taW5nIGludGVyZmFjZXMKKyoqIGVzdGFibGlzaGVkIGJ5IFNHSSBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBPcmlnaW5hbCBDb2RlIGFyZSBUaGUKKyoqIE9wZW5HTChSKSBHcmFwaGljcyBTeXN0ZW06IEEgU3BlY2lmaWNhdGlvbiAoVmVyc2lvbiAxLjIuMSksIHJlbGVhc2VkCisqKiBBcHJpbCAxLCAxOTk5OyBUaGUgT3BlbkdMKFIpIEdyYXBoaWNzIFN5c3RlbSBVdGlsaXR5IExpYnJhcnkgKFZlcnNpb24KKyoqIDEuMyksIHJlbGVhc2VkIE5vdmVtYmVyIDQsIDE5OTg7IGFuZCBPcGVuR0woUikgR3JhcGhpY3Mgd2l0aCB0aGUgWAorKiogV2luZG93IFN5c3RlbShSKSAoVmVyc2lvbiAxLjMpLCByZWxlYXNlZCBPY3RvYmVyIDE5LCAxOTk4LiBUaGlzIHNvZnR3YXJlCisqKiB3YXMgY3JlYXRlZCB1c2luZyB0aGUgT3BlbkdMKFIpIHZlcnNpb24gMS4yLjEgU2FtcGxlIEltcGxlbWVudGF0aW9uCisqKiBwdWJsaXNoZWQgYnkgU0dJLCBidXQgaGFzIG5vdCBiZWVuIGluZGVwZW5kZW50bHkgdmVyaWZpZWQgYXMgYmVpbmcKKyoqIGNvbXBsaWFudCB3aXRoIHRoZSBPcGVuR0woUikgdmVyc2lvbiAxLjIuMSBTcGVjaWZpY2F0aW9uLgorKi8KKworI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlIDxHTEVTL2VnbHR5cGVzLmg+CisKKy8qCisqKiBlZ2x0eXBlcy5oIGlzIHBsYXRmb3JtIGRlcGVuZGVudC4gSXQgZGVmaW5lczoKKyoqCisqKiAgICAgLSBFR0wgdHlwZXMgYW5kIHJlc291cmNlcworKiogICAgIC0gTmF0aXZlIHR5cGVzCisqKiAgICAgLSBFR0wgYW5kIG5hdGl2ZSBoYW5kbGUgdmFsdWVzCisqKgorKiogRUdMIHR5cGVzIGFuZCByZXNvdXJjZXMgYXJlIHRvIGJlIHR5cGVkZWYnZWQgd2l0aCBhcHByb3ByaWF0ZSBwbGF0Zm9ybQorKiogZGVwZW5kZW50IHJlc291cmNlIGhhbmRsZSB0eXBlcy4gRUdMaW50IG11c3QgYmUgYW4gaW50ZWdlciBvZiBhdCBsZWFzdAorKiogMzItYml0LgorKioKKyoqIE5hdGl2ZURpc3BsYXlUeXBlLCBOYXRpdmVXaW5kb3dUeXBlIGFuZCBOYXRpdmVQaXhtYXBUeXBlIGFyZSB0byBiZQorKiogcmVwbGFjZWQgd2l0aCBjb3JyZXNwb25kaW5nIHR5cGVzIG9mIHRoZSBuYXRpdmUgd2luZG93IHN5c3RlbSBpbiBlZ2wuaC4KKyoqCisqKiBFR0wgYW5kIG5hdGl2ZSBoYW5kbGUgdmFsdWVzIG11c3QgbWF0Y2ggdGhlaXIgdHlwZXMuCisqKgorKiogRXhhbXBsZSBlZ2x0eXBlcy5oOgorKi8KKworI2lmIDAKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG5hdGl2ZV93aW5kb3dfc3lzdGVtLmg+CisKKy8qCisqKiBUeXBlcyBhbmQgcmVzb3VyY2VzCisqLwordHlwZWRlZiBpbnQgRUdMQm9vbGVhbjsKK3R5cGVkZWYgaW50MzJfdCBFR0xpbnQ7Cit0eXBlZGVmIHZvaWQgKkVHTERpc3BsYXk7Cit0eXBlZGVmIHZvaWQgKkVHTENvbmZpZzsKK3R5cGVkZWYgdm9pZCAqRUdMU3VyZmFjZTsKK3R5cGVkZWYgdm9pZCAqRUdMQ29udGV4dDsKKworLyoKKyoqIEVHTCBhbmQgbmF0aXZlIGhhbmRsZSB2YWx1ZXMKKyovCisjZGVmaW5lIEVHTF9ERUZBVUxUX0RJU1BMQVkgKChOYXRpdmVEaXNwbGF5VHlwZSkwKQorI2RlZmluZSBFR0xfTk9fQ09OVEVYVCAoKEVHTENvbnRleHQpMCkKKyNkZWZpbmUgRUdMX05PX0RJU1BMQVkgKChFR0xEaXNwbGF5KTApCisjZGVmaW5lIEVHTF9OT19TVVJGQUNFICgoRUdMU3VyZmFjZSkwKQorCisjZW5kaWYKKworLyoKKyoqIFZlcnNpb25pbmcgYW5kIGV4dGVuc2lvbnMKKyovCisjZGVmaW5lIEVHTF9WRVJTSU9OXzFfMAkJICAgICAgIDEKKworLyoKKyoqIEJvb2xlYW4KKyovCisjZGVmaW5lIEVHTF9GQUxTRQkJICAgICAgIDAKKyNkZWZpbmUgRUdMX1RSVUUJCSAgICAgICAxCisKKy8qCisqKiBFcnJvcnMKKyovCisjZGVmaW5lIEVHTF9TVUNDRVNTCQkgICAgICAgMHgzMDAwCisjZGVmaW5lIEVHTF9OT1RfSU5JVElBTElaRUQJICAgICAgIDB4MzAwMQorI2RlZmluZSBFR0xfQkFEX0FDQ0VTUwkJICAgICAgIDB4MzAwMgorI2RlZmluZSBFR0xfQkFEX0FMTE9DCQkgICAgICAgMHgzMDAzCisjZGVmaW5lIEVHTF9CQURfQVRUUklCVVRFCSAgICAgICAweDMwMDQKKyNkZWZpbmUgRUdMX0JBRF9DT05GSUcJCSAgICAgICAweDMwMDUKKyNkZWZpbmUgRUdMX0JBRF9DT05URVhUCQkgICAgICAgMHgzMDA2CisjZGVmaW5lIEVHTF9CQURfQ1VSUkVOVF9TVVJGQUNFICAgICAgICAweDMwMDcKKyNkZWZpbmUgRUdMX0JBRF9ESVNQTEFZCQkgICAgICAgMHgzMDA4CisjZGVmaW5lIEVHTF9CQURfTUFUQ0gJCSAgICAgICAweDMwMDkKKyNkZWZpbmUgRUdMX0JBRF9OQVRJVkVfUElYTUFQCSAgICAgICAweDMwMEEKKyNkZWZpbmUgRUdMX0JBRF9OQVRJVkVfV0lORE9XCSAgICAgICAweDMwMEIKKyNkZWZpbmUgRUdMX0JBRF9QQVJBTUVURVIJICAgICAgIDB4MzAwQworI2RlZmluZSBFR0xfQkFEX1NVUkZBQ0UJCSAgICAgICAweDMwMEQKKy8qIDB4MzAwRSAtIDB4MzAxRiByZXNlcnZlZCBmb3IgYWRkaXRpb25hbCBlcnJvcnMuICovCisKKy8qCisqKiBDb25maWcgYXR0cmlidXRlcworKi8KKyNkZWZpbmUgRUdMX0JVRkZFUl9TSVpFCQkgICAgICAgMHgzMDIwCisjZGVmaW5lIEVHTF9BTFBIQV9TSVpFCQkgICAgICAgMHgzMDIxCisjZGVmaW5lIEVHTF9CTFVFX1NJWkUJCSAgICAgICAweDMwMjIKKyNkZWZpbmUgRUdMX0dSRUVOX1NJWkUJCSAgICAgICAweDMwMjMKKyNkZWZpbmUgRUdMX1JFRF9TSVpFCQkgICAgICAgMHgzMDI0CisjZGVmaW5lIEVHTF9ERVBUSF9TSVpFCQkgICAgICAgMHgzMDI1CisjZGVmaW5lIEVHTF9TVEVOQ0lMX1NJWkUJICAgICAgIDB4MzAyNgorI2RlZmluZSBFR0xfQ09ORklHX0NBVkVBVAkgICAgICAgMHgzMDI3CisjZGVmaW5lIEVHTF9DT05GSUdfSUQJCSAgICAgICAweDMwMjgKKyNkZWZpbmUgRUdMX0xFVkVMCQkgICAgICAgMHgzMDI5CisjZGVmaW5lIEVHTF9NQVhfUEJVRkZFUl9IRUlHSFQJICAgICAgIDB4MzAyQQorI2RlZmluZSBFR0xfTUFYX1BCVUZGRVJfUElYRUxTCSAgICAgICAweDMwMkIKKyNkZWZpbmUgRUdMX01BWF9QQlVGRkVSX1dJRFRICSAgICAgICAweDMwMkMKKyNkZWZpbmUgRUdMX05BVElWRV9SRU5ERVJBQkxFCSAgICAgICAweDMwMkQKKyNkZWZpbmUgRUdMX05BVElWRV9WSVNVQUxfSUQJICAgICAgIDB4MzAyRQorI2RlZmluZSBFR0xfTkFUSVZFX1ZJU1VBTF9UWVBFCSAgICAgICAweDMwMkYKKy8qI2RlZmluZSBFR0xfUFJFU0VSVkVEX1JFU09VUkNFUwkgMHgzMDMwKi8KKyNkZWZpbmUgRUdMX1NBTVBMRVMJCSAgICAgICAweDMwMzEKKyNkZWZpbmUgRUdMX1NBTVBMRV9CVUZGRVJTCSAgICAgICAweDMwMzIKKyNkZWZpbmUgRUdMX1NVUkZBQ0VfVFlQRQkgICAgICAgMHgzMDMzCisjZGVmaW5lIEVHTF9UUkFOU1BBUkVOVF9UWVBFCSAgICAgICAweDMwMzQKKyNkZWZpbmUgRUdMX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUUgICAgIDB4MzAzNQorI2RlZmluZSBFR0xfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUgICAgMHgzMDM2CisjZGVmaW5lIEVHTF9UUkFOU1BBUkVOVF9SRURfVkFMVUUgICAgICAweDMwMzcKKworLyoKKyoqIENvbmZpZyBhdHRyaWJ1dGUgYW5kIHZhbHVlCisqLworI2RlZmluZSBFR0xfTk9ORQkJICAgICAgIDB4MzAzOAorLyogMHgzMDM5IC0gMHgzMDRGIHJlc2VydmVkIGZvciBhZGRpdGlvbmFsIGNvbmZpZyBhdHRyaWJ1dGVzLiAqLworCisvKgorKiogQ29uZmlnIHZhbHVlcworKi8KKyNkZWZpbmUgRUdMX0RPTlRfQ0FSRQkJICAgICAgICgoRUdMaW50KSAtMSkKKyNkZWZpbmUgRUdMX1BCVUZGRVJfQklUCQkgICAgICAgMHgwMQorI2RlZmluZSBFR0xfUElYTUFQX0JJVAkJICAgICAgIDB4MDIKKyNkZWZpbmUgRUdMX1dJTkRPV19CSVQJCSAgICAgICAweDA0CisjZGVmaW5lIEVHTF9TTE9XX0NPTkZJRwkJICAgICAgIDB4MzA1MAorI2RlZmluZSBFR0xfTk9OX0NPTkZPUk1BTlRfQ09ORklHICAgICAgMHgzMDUxCisjZGVmaW5lIEVHTF9UUkFOU1BBUkVOVF9SR0IJICAgICAgIDB4MzA1MgorCisvKgorKiogU3RyaW5nIG5hbWVzCisqLworI2RlZmluZSBFR0xfVkVORE9SCQkgICAgICAgMHgzMDUzCisjZGVmaW5lIEVHTF9WRVJTSU9OCQkgICAgICAgMHgzMDU0CisjZGVmaW5lIEVHTF9FWFRFTlNJT05TCQkgICAgICAgMHgzMDU1CisKKy8qCisqKiBTdXJmYWNlIGF0dHJpYnV0ZXMKKyovCisjZGVmaW5lIEVHTF9IRUlHSFQJCSAgICAgICAweDMwNTYKKyNkZWZpbmUgRUdMX1dJRFRICQkgICAgICAgMHgzMDU3CisjZGVmaW5lIEVHTF9MQVJHRVNUX1BCVUZGRVIJICAgICAgIDB4MzA1OAorCisvKgorKiogQ3VycmVudCBzdXJmYWNlcworKi8KKyNkZWZpbmUgRUdMX0RSQVcJCSAgICAgICAweDMwNTkKKyNkZWZpbmUgRUdMX1JFQUQJCSAgICAgICAweDMwNUEKKworLyoKKyoqIEVuZ2luZXMKKyovCisjZGVmaW5lIEVHTF9DT1JFX05BVElWRV9FTkdJTkUJICAgICAgIDB4MzA1QgorCisvKiAweDMwNUMtMHgzRkZGRiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLworCisvKgorKiogRnVuY3Rpb25zCisqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitHTEFQSSBFR0xpbnQgQVBJRU5UUlkgZWdsR2V0RXJyb3IgKHZvaWQpOworCitHTEFQSSBFR0xEaXNwbGF5IEFQSUVOVFJZIGVnbEdldERpc3BsYXkgKE5hdGl2ZURpc3BsYXlUeXBlIGRpc3BsYXkpOworR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xJbml0aWFsaXplIChFR0xEaXNwbGF5IGRweSwgRUdMaW50ICptYWpvciwgRUdMaW50ICptaW5vcik7CitHTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbFRlcm1pbmF0ZSAoRUdMRGlzcGxheSBkcHkpOworR0xBUEkgY29uc3QgY2hhciAqIEFQSUVOVFJZIGVnbFF1ZXJ5U3RyaW5nIChFR0xEaXNwbGF5IGRweSwgRUdMaW50IG5hbWUpOworR0xBUEkgdm9pZCAoKiBBUElFTlRSWSBlZ2xHZXRQcm9jQWRkcmVzcyAoY29uc3QgY2hhciAqcHJvY25hbWUpKSgpOworCitHTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbEdldENvbmZpZ3MgKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgKmNvbmZpZ3MsIEVHTGludCBjb25maWdfc2l6ZSwgRUdMaW50ICpudW1fY29uZmlnKTsKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsQ2hvb3NlQ29uZmlnIChFR0xEaXNwbGF5IGRweSwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCwgRUdMQ29uZmlnICpjb25maWdzLCBFR0xpbnQgY29uZmlnX3NpemUsIEVHTGludCAqbnVtX2NvbmZpZyk7CitHTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbEdldENvbmZpZ0F0dHJpYiAoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsIEVHTGludCBhdHRyaWJ1dGUsIEVHTGludCAqdmFsdWUpOworCitHTEFQSSBFR0xTdXJmYWNlIEFQSUVOVFJZIGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UgKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLCBOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdywgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7CitHTEFQSSBFR0xTdXJmYWNlIEFQSUVOVFJZIGVnbENyZWF0ZVBpeG1hcFN1cmZhY2UgKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLCBOYXRpdmVQaXhtYXBUeXBlIHBpeG1hcCwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7CitHTEFQSSBFR0xTdXJmYWNlIEFQSUVOVFJZIGVnbENyZWF0ZVBidWZmZXJTdXJmYWNlIChFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7CitHTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbERlc3Ryb3lTdXJmYWNlIChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlKTsKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsUXVlcnlTdXJmYWNlIChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlLCBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgKnZhbHVlKTsKKworR0xBUEkgRUdMQ29udGV4dCBBUElFTlRSWSBlZ2xDcmVhdGVDb250ZXh0IChFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywgRUdMQ29udGV4dCBzaGFyZV9saXN0LCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsRGVzdHJveUNvbnRleHQgKEVHTERpc3BsYXkgZHB5LCBFR0xDb250ZXh0IGN0eCk7CitHTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbE1ha2VDdXJyZW50IChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBkcmF3LCBFR0xTdXJmYWNlIHJlYWQsIEVHTENvbnRleHQgY3R4KTsKK0dMQVBJIEVHTENvbnRleHQgQVBJRU5UUlkgZWdsR2V0Q3VycmVudENvbnRleHQgKHZvaWQpOworR0xBUEkgRUdMU3VyZmFjZSBBUElFTlRSWSBlZ2xHZXRDdXJyZW50U3VyZmFjZSAoRUdMaW50IHJlYWRkcmF3KTsKK0dMQVBJIEVHTERpc3BsYXkgQVBJRU5UUlkgZWdsR2V0Q3VycmVudERpc3BsYXkgKHZvaWQpOworR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xRdWVyeUNvbnRleHQgKEVHTERpc3BsYXkgZHB5LCBFR0xDb250ZXh0IGN0eCwgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSk7CisKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsV2FpdEdMICh2b2lkKTsKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsV2FpdE5hdGl2ZSAoRUdMaW50IGVuZ2luZSk7CitHTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbFN3YXBCdWZmZXJzIChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBkcmF3KTsKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsQ29weUJ1ZmZlcnMgKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsIE5hdGl2ZVBpeG1hcFR5cGUgdGFyZ2V0KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fX2VnbF9oXyAqLwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvaW5jbHVkZS9HTEVTL2VnbHR5cGVzLmggYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9pbmNsdWRlL0dMRVMvZWdsdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGIzNmM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvaW5jbHVkZS9HTEVTL2VnbHR5cGVzLmgKQEAgLTAsMCArMSwyMCBAQAorLyoKKyoqIFR5cGVzIGFuZCByZXNvdXJjZXMKKyovCit0eXBlZGVmIGludCBFR0xCb29sZWFuOwordHlwZWRlZiBsb25nIEVHTGludDsKK3R5cGVkZWYgdm9pZCAqRUdMRGlzcGxheTsKK3R5cGVkZWYgdm9pZCAqRUdMQ29uZmlnOwordHlwZWRlZiB2b2lkICpFR0xTdXJmYWNlOwordHlwZWRlZiB2b2lkICpFR0xDb250ZXh0OwordHlwZWRlZiB2b2lkICpOYXRpdmVEaXNwbGF5VHlwZTsKK3R5cGVkZWYgdm9pZCAqTmF0aXZlV2luZG93VHlwZTsKK3R5cGVkZWYgdm9pZCAqTmF0aXZlUGl4bWFwVHlwZTsKKworLyoKKyoqIEVHTCBhbmQgbmF0aXZlIGhhbmRsZSB2YWx1ZXMKKyovCisjZGVmaW5lIEVHTF9ERUZBVUxUX0RJU1BMQVkgKChOYXRpdmVEaXNwbGF5VHlwZSkwKQorI2RlZmluZSBFR0xfTk9fQ09OVEVYVCAoKEVHTENvbnRleHQpMCkKKyNkZWZpbmUgRUdMX05PX0RJU1BMQVkgKChFR0xEaXNwbGF5KTApCisjZGVmaW5lIEVHTF9OT19TVVJGQUNFICgoRUdMU3VyZmFjZSkwKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvaW5jbHVkZS9HTEVTL2dsLmggYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9pbmNsdWRlL0dMRVMvZ2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTU0ODIyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvaW5jbHVkZS9HTEVTL2dsLmgKQEAgLTAsMCArMSw1ODQgQEAKKyNpZm5kZWYgX19nbF9oXworI2RlZmluZSBfX2dsX2hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoKKyoqIExpY2Vuc2UgQXBwbGljYWJpbGl0eS4gRXhjZXB0IHRvIHRoZSBleHRlbnQgcG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZQorKiogbWFkZSBzdWJqZWN0IHRvIGFuIGFsdGVybmF0aXZlIGxpY2Vuc2UgYXMgcGVybWl0dGVkIGluIHRoZSBTR0kgRnJlZQorKiogU29mdHdhcmUgTGljZW5zZSBCLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIiksIHRoZSBjb250ZW50cyBvZiB0aGlzCisqKiBmaWxlIGFyZSBzdWJqZWN0IG9ubHkgdG8gdGhlIHByb3Zpc2lvbnMgb2YgdGhlIExpY2Vuc2UuIFlvdSBtYXkgbm90IHVzZQorKiogdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weQorKiogb2YgdGhlIExpY2Vuc2UgYXQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgYXR0bjogTGVnYWwgU2VydmljZXMsIDE2MDAKKyoqIEFtcGhpdGhlYXRyZSBQYXJrd2F5LCBNb3VudGFpbiBWaWV3LCBDQSA5NDA0My0xMzUxLCBvciBhdDoKKyoqIAorKiogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0ZyZWVCCisqKiAKKyoqIE5vdGUgdGhhdCwgYXMgcHJvdmlkZWQgaW4gdGhlIExpY2Vuc2UsIHRoZSBTb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiogIkFTIElTIiBiYXNpcywgd2l0aCBBTEwgRVhQUkVTUyBBTkQgSU1QTElFRCBXQVJSQU5USUVTIEFORCBDT05ESVRJT05TCisqKiBESVNDTEFJTUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIElNUExJRUQgV0FSUkFOVElFUyBBTkQKKyoqIENPTkRJVElPTlMgT0YgTUVSQ0hBTlRBQklMSVRZLCBTQVRJU0ZBQ1RPUlkgUVVBTElUWSwgRklUTkVTUyBGT1IgQQorKiogUEFSVElDVUxBUiBQVVJQT1NFLCBBTkQgTk9OLUlORlJJTkdFTUVOVC4KKyoqIAorKiogT3JpZ2luYWwgQ29kZS4gVGhlIE9yaWdpbmFsIENvZGUgaXM6IE9wZW5HTCBTYW1wbGUgSW1wbGVtZW50YXRpb24sCisqKiBWZXJzaW9uIDEuMi4xLCByZWxlYXNlZCBKYW51YXJ5IDI2LCAyMDAwLCBkZXZlbG9wZWQgYnkgU2lsaWNvbiBHcmFwaGljcywKKyoqIEluYy4gVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChjKSAxOTkxLTIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorKiogQ29weXJpZ2h0IGluIGFueSBwb3J0aW9ucyBjcmVhdGVkIGJ5IHRoaXJkIHBhcnRpZXMgaXMgYXMgaW5kaWNhdGVkCisqKiBlbHNld2hlcmUgaGVyZWluLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorKiogCisqKiBBZGRpdGlvbmFsIE5vdGljZSBQcm92aXNpb25zOiBUaGUgYXBwbGljYXRpb24gcHJvZ3JhbW1pbmcgaW50ZXJmYWNlcworKiogZXN0YWJsaXNoZWQgYnkgU0dJIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIE9yaWdpbmFsIENvZGUgYXJlIFRoZQorKiogT3BlbkdMKFIpIEdyYXBoaWNzIFN5c3RlbTogQSBTcGVjaWZpY2F0aW9uIChWZXJzaW9uIDEuMi4xKSwgcmVsZWFzZWQKKyoqIEFwcmlsIDEsIDE5OTk7IFRoZSBPcGVuR0woUikgR3JhcGhpY3MgU3lzdGVtIFV0aWxpdHkgTGlicmFyeSAoVmVyc2lvbgorKiogMS4zKSwgcmVsZWFzZWQgTm92ZW1iZXIgNCwgMTk5ODsgYW5kIE9wZW5HTChSKSBHcmFwaGljcyB3aXRoIHRoZSBYCisqKiBXaW5kb3cgU3lzdGVtKFIpIChWZXJzaW9uIDEuMyksIHJlbGVhc2VkIE9jdG9iZXIgMTksIDE5OTguIFRoaXMgc29mdHdhcmUKKyoqIHdhcyBjcmVhdGVkIHVzaW5nIHRoZSBPcGVuR0woUikgdmVyc2lvbiAxLjIuMSBTYW1wbGUgSW1wbGVtZW50YXRpb24KKyoqIHB1Ymxpc2hlZCBieSBTR0ksIGJ1dCBoYXMgbm90IGJlZW4gaW5kZXBlbmRlbnRseSB2ZXJpZmllZCBhcyBiZWluZworKiogY29tcGxpYW50IHdpdGggdGhlIE9wZW5HTChSKSB2ZXJzaW9uIDEuMi4xIFNwZWNpZmljYXRpb24uCisqLworCisjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKEFQSUVOVFJZKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQorI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOIDEKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKworI2lmbmRlZiBBUElFTlRSWQorI2RlZmluZSBBUElFTlRSWQorI2VuZGlmCisjaWZuZGVmIEdMQVBJCisjZGVmaW5lIEdMQVBJIGV4dGVybgorI2VuZGlmCisKK3R5cGVkZWYgdW5zaWduZWQgaW50IEdMZW51bTsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBHTGJvb2xlYW47Cit0eXBlZGVmIHVuc2lnbmVkIGludCBHTGJpdGZpZWxkOwordHlwZWRlZiBzaWduZWQgY2hhciBHTGJ5dGU7Cit0eXBlZGVmIHNob3J0IEdMc2hvcnQ7Cit0eXBlZGVmIGludCBHTGludDsKK3R5cGVkZWYgaW50IEdMc2l6ZWk7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgR0x1Ynl0ZTsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgR0x1c2hvcnQ7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBHTHVpbnQ7Cit0eXBlZGVmIGZsb2F0IEdMZmxvYXQ7Cit0eXBlZGVmIGZsb2F0IEdMY2xhbXBmOwordHlwZWRlZiB2b2lkIEdMdm9pZDsKK3R5cGVkZWYgaW50IEdMaW50cHRyQVJCOwordHlwZWRlZiBpbnQgR0xzaXplaXB0ckFSQjsKK3R5cGVkZWYgaW50IEdMZml4ZWQ7Cit0eXBlZGVmIGludCBHTGNsYW1weDsKKy8qIEludGVybmFsIGNvbnZlbmllbmNlIHR5cGVkZWZzICovCit0eXBlZGVmIHZvaWQgKCpfR0xmdW5jcHRyKSgpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRXh0ZW5zaW9ucyAqLworI2RlZmluZSBHTF9PRVNfVkVSU0lPTl8xXzAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHTF9PRVNfcmVhZF9mb3JtYXQgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHTF9PRVNfY29tcHJlc3NlZF9wYWxldHRlZF90ZXh0dXJlIDEKKworLyogQ2xlYXJCdWZmZXJNYXNrICovCisjZGVmaW5lIEdMX0RFUFRIX0JVRkZFUl9CSVQgICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIEdMX1NURU5DSUxfQlVGRkVSX0JJVCAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEdMX0NPTE9SX0JVRkZFUl9CSVQgICAgICAgICAgICAgICAweDAwMDA0MDAwCisKKy8qIEJvb2xlYW4gKi8KKyNkZWZpbmUgR0xfRkFMU0UgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR0xfVFJVRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKworLyogQmVnaW5Nb2RlICovCisjZGVmaW5lIEdMX1BPSU5UUyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgR0xfTElORVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBHTF9MSU5FX0xPT1AgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIEdMX0xJTkVfU1RSSVAgICAgICAgICAgICAgICAgICAgICAweDAwMDMKKyNkZWZpbmUgR0xfVFJJQU5HTEVTICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBHTF9UUklBTkdMRV9TVFJJUCAgICAgICAgICAgICAgICAgMHgwMDA1CisjZGVmaW5lIEdMX1RSSUFOR0xFX0ZBTiAgICAgICAgICAgICAgICAgICAweDAwMDYKKworLyogQWxwaGFGdW5jdGlvbiAqLworI2RlZmluZSBHTF9ORVZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIEdMX0xFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDEKKyNkZWZpbmUgR0xfRVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMgorI2RlZmluZSBHTF9MRVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAzCisjZGVmaW5lIEdMX0dSRUFURVIgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDQKKyNkZWZpbmUgR0xfTk9URVFVQUwgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwNQorI2RlZmluZSBHTF9HRVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjA2CisjZGVmaW5lIEdMX0FMV0FZUyAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDcKKworLyogQmxlbmRpbmdGYWN0b3JEZXN0ICovCisjZGVmaW5lIEdMX1pFUk8gICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdMX09ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdMX1NSQ19DT0xPUiAgICAgICAgICAgICAgICAgICAgICAweDAzMDAKKyNkZWZpbmUgR0xfT05FX01JTlVTX1NSQ19DT0xPUiAgICAgICAgICAgIDB4MDMwMQorI2RlZmluZSBHTF9TUkNfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgMHgwMzAyCisjZGVmaW5lIEdMX09ORV9NSU5VU19TUkNfQUxQSEEgICAgICAgICAgICAweDAzMDMKKyNkZWZpbmUgR0xfRFNUX0FMUEhBICAgICAgICAgICAgICAgICAgICAgIDB4MDMwNAorI2RlZmluZSBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBICAgICAgICAgICAgMHgwMzA1CisKKy8qIEJsZW5kaW5nRmFjdG9yU3JjICovCisvKiAgICAgIEdMX1pFUk8gKi8KKy8qICAgICAgR0xfT05FICovCisjZGVmaW5lIEdMX0RTVF9DT0xPUiAgICAgICAgICAgICAgICAgICAgICAweDAzMDYKKyNkZWZpbmUgR0xfT05FX01JTlVTX0RTVF9DT0xPUiAgICAgICAgICAgIDB4MDMwNworI2RlZmluZSBHTF9TUkNfQUxQSEFfU0FUVVJBVEUgICAgICAgICAgICAgMHgwMzA4CisvKiAgICAgIEdMX1NSQ19BTFBIQSAqLworLyogICAgICBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBICovCisvKiAgICAgIEdMX0RTVF9BTFBIQSAqLworLyogICAgICBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBICovCisKKy8qIENvbG9yTWF0ZXJpYWxGYWNlICovCisvKiAgICAgIEdMX0ZST05UX0FORF9CQUNLICovCisKKy8qIENvbG9yTWF0ZXJpYWxQYXJhbWV0ZXIgKi8KKy8qICAgICAgR0xfQU1CSUVOVF9BTkRfRElGRlVTRSAqLworCisvKiBDb2xvclBvaW50ZXJUeXBlICovCisvKiAgICAgIEdMX1VOU0lHTkVEX0JZVEUgKi8KKy8qICAgICAgR0xfRkxPQVQgKi8KKy8qICAgICAgR0xfRklYRUQgKi8KKworLyogQ3VsbEZhY2VNb2RlICovCisjZGVmaW5lIEdMX0ZST05UICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDQKKyNkZWZpbmUgR0xfQkFDSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwNQorI2RlZmluZSBHTF9GUk9OVF9BTkRfQkFDSyAgICAgICAgICAgICAgICAgMHgwNDA4CisKKy8qIERlcHRoRnVuY3Rpb24gKi8KKy8qICAgICAgR0xfTkVWRVIgKi8KKy8qICAgICAgR0xfTEVTUyAqLworLyogICAgICBHTF9FUVVBTCAqLworLyogICAgICBHTF9MRVFVQUwgKi8KKy8qICAgICAgR0xfR1JFQVRFUiAqLworLyogICAgICBHTF9OT1RFUVVBTCAqLworLyogICAgICBHTF9HRVFVQUwgKi8KKy8qICAgICAgR0xfQUxXQVlTICovCisKKy8qIEVuYWJsZUNhcCAqLworI2RlZmluZSBHTF9GT0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQjYwCisjZGVmaW5lIEdMX0xJR0hUSU5HICAgICAgICAgICAgICAgICAgICAgICAweDBCNTAKKyNkZWZpbmUgR0xfVEVYVFVSRV8yRCAgICAgICAgICAgICAgICAgICAgIDB4MERFMQorI2RlZmluZSBHTF9DVUxMX0ZBQ0UgICAgICAgICAgICAgICAgICAgICAgMHgwQjQ0CisjZGVmaW5lIEdMX0FMUEhBX1RFU1QgICAgICAgICAgICAgICAgICAgICAweDBCQzAKKyNkZWZpbmUgR0xfQkxFTkQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEJFMgorI2RlZmluZSBHTF9DT0xPUl9MT0dJQ19PUCAgICAgICAgICAgICAgICAgMHgwQkYyCisjZGVmaW5lIEdMX0RJVEhFUiAgICAgICAgICAgICAgICAgICAgICAgICAweDBCRDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9URVNUICAgICAgICAgICAgICAgICAgIDB4MEI5MAorI2RlZmluZSBHTF9ERVBUSF9URVNUICAgICAgICAgICAgICAgICAgICAgMHgwQjcxCisvKiAgICAgIEdMX0xJR0hUMCAqLworLyogICAgICBHTF9MSUdIVDEgKi8KKy8qICAgICAgR0xfTElHSFQyICovCisvKiAgICAgIEdMX0xJR0hUMyAqLworLyogICAgICBHTF9MSUdIVDQgKi8KKy8qICAgICAgR0xfTElHSFQ1ICovCisvKiAgICAgIEdMX0xJR0hUNiAqLworLyogICAgICBHTF9MSUdIVDcgKi8KKyNkZWZpbmUgR0xfUE9JTlRfU01PT1RIICAgICAgICAgICAgICAgICAgIDB4MEIxMAorI2RlZmluZSBHTF9MSU5FX1NNT09USCAgICAgICAgICAgICAgICAgICAgMHgwQjIwCisjZGVmaW5lIEdMX1NDSVNTT1JfVEVTVCAgICAgICAgICAgICAgICAgICAweDBDMTEKKyNkZWZpbmUgR0xfQ09MT1JfTUFURVJJQUwgICAgICAgICAgICAgICAgIDB4MEI1NworI2RlZmluZSBHTF9OT1JNQUxJWkUgICAgICAgICAgICAgICAgICAgICAgMHgwQkExCisjZGVmaW5lIEdMX1JFU0NBTEVfTk9STUFMICAgICAgICAgICAgICAgICAweDgwM0EKKyNkZWZpbmUgR0xfUE9MWUdPTl9PRkZTRVRfRklMTCAgICAgICAgICAgIDB4ODAzNworI2RlZmluZSBHTF9WRVJURVhfQVJSQVkgICAgICAgICAgICAgICAgICAgMHg4MDc0CisjZGVmaW5lIEdMX05PUk1BTF9BUlJBWSAgICAgICAgICAgICAgICAgICAweDgwNzUKKyNkZWZpbmUgR0xfQ09MT1JfQVJSQVkgICAgICAgICAgICAgICAgICAgIDB4ODA3NgorI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZICAgICAgICAgICAgMHg4MDc4CisjZGVmaW5lIEdMX01VTFRJU0FNUExFICAgICAgICAgICAgICAgICAgICAweDgwOUQKKyNkZWZpbmUgR0xfU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFICAgICAgIDB4ODA5RQorI2RlZmluZSBHTF9TQU1QTEVfQUxQSEFfVE9fT05FICAgICAgICAgICAgMHg4MDlGCisjZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRSAgICAgICAgICAgICAgICAweDgwQTAKKworLyogRXJyb3JDb2RlICovCisjZGVmaW5lIEdMX05PX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdMX0lOVkFMSURfRU5VTSAgICAgICAgICAgICAgICAgICAweDA1MDAKKyNkZWZpbmUgR0xfSU5WQUxJRF9WQUxVRSAgICAgICAgICAgICAgICAgIDB4MDUwMQorI2RlZmluZSBHTF9JTlZBTElEX09QRVJBVElPTiAgICAgICAgICAgICAgMHgwNTAyCisjZGVmaW5lIEdMX1NUQUNLX09WRVJGTE9XICAgICAgICAgICAgICAgICAweDA1MDMKKyNkZWZpbmUgR0xfU1RBQ0tfVU5ERVJGTE9XICAgICAgICAgICAgICAgIDB4MDUwNAorI2RlZmluZSBHTF9PVVRfT0ZfTUVNT1JZICAgICAgICAgICAgICAgICAgMHgwNTA1CisKKy8qIEZvZ01vZGUgKi8KKy8qICAgICAgR0xfTElORUFSICovCisjZGVmaW5lIEdMX0VYUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgR0xfRVhQMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMQorCisvKiBGb2dQYXJhbWV0ZXIgKi8KKyNkZWZpbmUgR0xfRk9HX0RFTlNJVFkgICAgICAgICAgICAgICAgICAgIDB4MEI2MgorI2RlZmluZSBHTF9GT0dfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgMHgwQjYzCisjZGVmaW5lIEdMX0ZPR19FTkQgICAgICAgICAgICAgICAgICAgICAgICAweDBCNjQKKyNkZWZpbmUgR0xfRk9HX01PREUgICAgICAgICAgICAgICAgICAgICAgIDB4MEI2NQorI2RlZmluZSBHTF9GT0dfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgMHgwQjY2CisKKy8qIEZyb250RmFjZURpcmVjdGlvbiAqLworI2RlZmluZSBHTF9DVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOTAwCisjZGVmaW5lIEdMX0NDVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5MDEKKworLyogR2V0UE5hbWUgKi8KKyNkZWZpbmUgR0xfU01PT1RIX1BPSU5UX1NJWkVfUkFOR0UgICAgICAgIDB4MEIxMgorI2RlZmluZSBHTF9TTU9PVEhfTElORV9XSURUSF9SQU5HRSAgICAgICAgMHgwQjIyCisjZGVmaW5lIEdMX0FMSUFTRURfUE9JTlRfU0laRV9SQU5HRSAgICAgICAweDg0NkQKKyNkZWZpbmUgR0xfQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFICAgICAgIDB4ODQ2RQorI2RlZmluZSBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEVfT0VTIDB4OEI5QQorI2RlZmluZSBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVF9PRVMgMHg4QjlCCisjZGVmaW5lIEdMX01BWF9MSUdIVFMgICAgICAgICAgICAgICAgICAgICAweDBEMzEKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfU0laRSAgICAgICAgICAgICAgIDB4MEQzMworI2RlZmluZSBHTF9NQVhfTU9ERUxWSUVXX1NUQUNLX0RFUFRIICAgICAgMHgwRDM2CisjZGVmaW5lIEdMX01BWF9QUk9KRUNUSU9OX1NUQUNLX0RFUFRIICAgICAweDBEMzgKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfU1RBQ0tfREVQVEggICAgICAgIDB4MEQzOQorI2RlZmluZSBHTF9NQVhfVklFV1BPUlRfRElNUyAgICAgICAgICAgICAgMHgwRDNBCisjZGVmaW5lIEdMX01BWF9FTEVNRU5UU19WRVJUSUNFUyAgICAgICAgICAweDgwRTgKKyNkZWZpbmUgR0xfTUFYX0VMRU1FTlRTX0lORElDRVMgICAgICAgICAgIDB4ODBFOQorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9VTklUUyAgICAgICAgICAgICAgMHg4NEUyCisjZGVmaW5lIEdMX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyAweDg2QTIKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMgICAgIDB4ODZBMworI2RlZmluZSBHTF9TVUJQSVhFTF9CSVRTICAgICAgICAgICAgICAgICAgMHgwRDUwCisjZGVmaW5lIEdMX1JFRF9CSVRTICAgICAgICAgICAgICAgICAgICAgICAweDBENTIKKyNkZWZpbmUgR0xfR1JFRU5fQklUUyAgICAgICAgICAgICAgICAgICAgIDB4MEQ1MworI2RlZmluZSBHTF9CTFVFX0JJVFMgICAgICAgICAgICAgICAgICAgICAgMHgwRDU0CisjZGVmaW5lIEdMX0FMUEhBX0JJVFMgICAgICAgICAgICAgICAgICAgICAweDBENTUKKyNkZWZpbmUgR0xfREVQVEhfQklUUyAgICAgICAgICAgICAgICAgICAgIDB4MEQ1NgorI2RlZmluZSBHTF9TVEVOQ0lMX0JJVFMgICAgICAgICAgICAgICAgICAgMHgwRDU3CisKKy8qIEhpbnRNb2RlICovCisjZGVmaW5lIEdMX0RPTlRfQ0FSRSAgICAgICAgICAgICAgICAgICAgICAweDExMDAKKyNkZWZpbmUgR0xfRkFTVEVTVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MTEwMQorI2RlZmluZSBHTF9OSUNFU1QgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMTAyCisKKy8qIEhpbnRUYXJnZXQgKi8KKyNkZWZpbmUgR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5UICAgIDB4MEM1MAorI2RlZmluZSBHTF9QT0lOVF9TTU9PVEhfSElOVCAgICAgICAgICAgICAgMHgwQzUxCisjZGVmaW5lIEdMX0xJTkVfU01PT1RIX0hJTlQgICAgICAgICAgICAgICAweDBDNTIKKyNkZWZpbmUgR0xfUE9MWUdPTl9TTU9PVEhfSElOVCAgICAgICAgICAgIDB4MEM1MworI2RlZmluZSBHTF9GT0dfSElOVCAgICAgICAgICAgICAgICAgICAgICAgMHgwQzU0CisKKy8qIExpZ2h0TW9kZWxQYXJhbWV0ZXIgKi8KKyNkZWZpbmUgR0xfTElHSFRfTU9ERUxfQU1CSUVOVCAgICAgICAgICAgIDB4MEI1MworI2RlZmluZSBHTF9MSUdIVF9NT0RFTF9UV09fU0lERSAgICAgICAgICAgMHgwQjUyCisKKy8qIExpZ2h0UGFyYW1ldGVyICovCisjZGVmaW5lIEdMX0FNQklFTlQgICAgICAgICAgICAgICAgICAgICAgICAweDEyMDAKKyNkZWZpbmUgR0xfRElGRlVTRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIwMQorI2RlZmluZSBHTF9TUEVDVUxBUiAgICAgICAgICAgICAgICAgICAgICAgMHgxMjAyCisjZGVmaW5lIEdMX1BPU0lUSU9OICAgICAgICAgICAgICAgICAgICAgICAweDEyMDMKKyNkZWZpbmUgR0xfU1BPVF9ESVJFQ1RJT04gICAgICAgICAgICAgICAgIDB4MTIwNAorI2RlZmluZSBHTF9TUE9UX0VYUE9ORU5UICAgICAgICAgICAgICAgICAgMHgxMjA1CisjZGVmaW5lIEdMX1NQT1RfQ1VUT0ZGICAgICAgICAgICAgICAgICAgICAweDEyMDYKKyNkZWZpbmUgR0xfQ09OU1RBTlRfQVRURU5VQVRJT04gICAgICAgICAgIDB4MTIwNworI2RlZmluZSBHTF9MSU5FQVJfQVRURU5VQVRJT04gICAgICAgICAgICAgMHgxMjA4CisjZGVmaW5lIEdMX1FVQURSQVRJQ19BVFRFTlVBVElPTiAgICAgICAgICAweDEyMDkKKworLyogRGF0YVR5cGUgKi8KKyNkZWZpbmUgR0xfQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQwMAorI2RlZmluZSBHTF9VTlNJR05FRF9CWVRFICAgICAgICAgICAgICAgICAgMHgxNDAxCisjZGVmaW5lIEdMX1NIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MDIKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlQgICAgICAgICAgICAgICAgIDB4MTQwMworI2RlZmluZSBHTF9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDA2CisjZGVmaW5lIEdMX0ZJWEVEICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MEMKKworLyogTG9naWNPcCAqLworI2RlZmluZSBHTF9DTEVBUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTAwCisjZGVmaW5lIEdMX0FORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDEKKyNkZWZpbmUgR0xfQU5EX1JFVkVSU0UgICAgICAgICAgICAgICAgICAgIDB4MTUwMgorI2RlZmluZSBHTF9DT1BZICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTAzCisjZGVmaW5lIEdMX0FORF9JTlZFUlRFRCAgICAgICAgICAgICAgICAgICAweDE1MDQKKyNkZWZpbmUgR0xfTk9PUCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwNQorI2RlZmluZSBHTF9YT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTA2CisjZGVmaW5lIEdMX09SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDcKKyNkZWZpbmUgR0xfTk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwOAorI2RlZmluZSBHTF9FUVVJViAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTA5CisjZGVmaW5lIEdMX0lOVkVSVCAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MEEKKyNkZWZpbmUgR0xfT1JfUkVWRVJTRSAgICAgICAgICAgICAgICAgICAgIDB4MTUwQgorI2RlZmluZSBHTF9DT1BZX0lOVkVSVEVEICAgICAgICAgICAgICAgICAgMHgxNTBDCisjZGVmaW5lIEdMX09SX0lOVkVSVEVEICAgICAgICAgICAgICAgICAgICAweDE1MEQKKyNkZWZpbmUgR0xfTkFORCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwRQorI2RlZmluZSBHTF9TRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTBGCisKKy8qIE1hdGVyaWFsRmFjZSAqLworLyogICAgICBHTF9GUk9OVF9BTkRfQkFDSyAqLworCisvKiBNYXRlcmlhbFBhcmFtZXRlciAqLworI2RlZmluZSBHTF9FTUlTU0lPTiAgICAgICAgICAgICAgICAgICAgICAgMHgxNjAwCisjZGVmaW5lIEdMX1NISU5JTkVTUyAgICAgICAgICAgICAgICAgICAgICAweDE2MDEKKyNkZWZpbmUgR0xfQU1CSUVOVF9BTkRfRElGRlVTRSAgICAgICAgICAgIDB4MTYwMgorLyogICAgICBHTF9BTUJJRU5UICovCisvKiAgICAgIEdMX0RJRkZVU0UgKi8KKy8qICAgICAgR0xfU1BFQ1VMQVIgKi8KKworLyogTWF0cml4TW9kZSAqLworI2RlZmluZSBHTF9NT0RFTFZJRVcgICAgICAgICAgICAgICAgICAgICAgMHgxNzAwCisjZGVmaW5lIEdMX1BST0pFQ1RJT04gICAgICAgICAgICAgICAgICAgICAweDE3MDEKKyNkZWZpbmUgR0xfVEVYVFVSRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MTcwMgorCisvKiBOb3JtYWxQb2ludGVyVHlwZSAqLworLyogICAgICBHTF9CWVRFICovCisvKiAgICAgIEdMX1NIT1JUICovCisvKiAgICAgIEdMX0ZMT0FUICovCisvKiAgICAgIEdMX0ZJWEVEICovCisKKy8qIFBpeGVsRm9ybWF0ICovCisjZGVmaW5lIEdMX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAweDE5MDYKKyNkZWZpbmUgR0xfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTkwNworI2RlZmluZSBHTF9SR0JBICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOTA4CisjZGVmaW5lIEdMX0xVTUlOQU5DRSAgICAgICAgICAgICAgICAgICAgICAweDE5MDkKKyNkZWZpbmUgR0xfTFVNSU5BTkNFX0FMUEhBICAgICAgICAgICAgICAgIDB4MTkwQQorCisvKiBQaXhlbFN0b3JlUGFyYW1ldGVyICovCisjZGVmaW5lIEdMX1VOUEFDS19BTElHTk1FTlQgICAgICAgICAgICAgICAweDBDRjUKKyNkZWZpbmUgR0xfUEFDS19BTElHTk1FTlQgICAgICAgICAgICAgICAgIDB4MEQwNQorCisvKiBQaXhlbFR5cGUgKi8KKy8qICAgICAgR0xfVU5TSUdORURfQllURSAqLworI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80ICAgICAgICAgMHg4MDMzCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzEgICAgICAgICAweDgwMzQKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNV82XzUgICAgICAgICAgIDB4ODM2MworCisvKiBTaGFkaW5nTW9kZWwgKi8KKyNkZWZpbmUgR0xfRkxBVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUQwMAorI2RlZmluZSBHTF9TTU9PVEggICAgICAgICAgICAgICAgICAgICAgICAgMHgxRDAxCisKKy8qIFN0ZW5jaWxGdW5jdGlvbiAqLworLyogICAgICBHTF9ORVZFUiAqLworLyogICAgICBHTF9MRVNTICovCisvKiAgICAgIEdMX0VRVUFMICovCisvKiAgICAgIEdMX0xFUVVBTCAqLworLyogICAgICBHTF9HUkVBVEVSICovCisvKiAgICAgIEdMX05PVEVRVUFMICovCisvKiAgICAgIEdMX0dFUVVBTCAqLworLyogICAgICBHTF9BTFdBWVMgKi8KKworLyogU3RlbmNpbE9wICovCisvKiAgICAgIEdMX1pFUk8gKi8KKyNkZWZpbmUgR0xfS0VFUCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUUwMAorI2RlZmluZSBHTF9SRVBMQUNFICAgICAgICAgICAgICAgICAgICAgICAgMHgxRTAxCisjZGVmaW5lIEdMX0lOQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFFMDIKKyNkZWZpbmUgR0xfREVDUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUUwMworLyogICAgICBHTF9JTlZFUlQgKi8KKworLyogU3RyaW5nTmFtZSAqLworI2RlZmluZSBHTF9WRU5ET1IgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRjAwCisjZGVmaW5lIEdMX1JFTkRFUkVSICAgICAgICAgICAgICAgICAgICAgICAweDFGMDEKKyNkZWZpbmUgR0xfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgIDB4MUYwMgorI2RlZmluZSBHTF9FWFRFTlNJT05TICAgICAgICAgICAgICAgICAgICAgMHgxRjAzCisKKy8qIFRleENvb3JkUG9pbnRlclR5cGUgKi8KKy8qICAgICAgR0xfU0hPUlQgKi8KKy8qICAgICAgR0xfRkxPQVQgKi8KKy8qICAgICAgR0xfRklYRUQgKi8KKy8qICAgICAgR0xfQllURSAqLworCisvKiBUZXh0dXJlRW52TW9kZSAqLworI2RlZmluZSBHTF9NT0RVTEFURSAgICAgICAgICAgICAgICAgICAgICAgMHgyMTAwCisjZGVmaW5lIEdMX0RFQ0FMICAgICAgICAgICAgICAgICAgICAgICAgICAweDIxMDEKKy8qICAgICAgR0xfQkxFTkQgKi8KKyNkZWZpbmUgR0xfQUREICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwNAorLyogICAgICBHTF9SRVBMQUNFICovCisKKy8qIFRleHR1cmVFbnZQYXJhbWV0ZXIgKi8KKyNkZWZpbmUgR0xfVEVYVFVSRV9FTlZfTU9ERSAgICAgICAgICAgICAgIDB4MjIwMAorI2RlZmluZSBHTF9URVhUVVJFX0VOVl9DT0xPUiAgICAgICAgICAgICAgMHgyMjAxCisKKy8qIFRleHR1cmVFbnZUYXJnZXQgKi8KKyNkZWZpbmUgR0xfVEVYVFVSRV9FTlYgICAgICAgICAgICAgICAgICAgIDB4MjMwMAorCisvKiBUZXh0dXJlTWFnRmlsdGVyICovCisjZGVmaW5lIEdMX05FQVJFU1QgICAgICAgICAgICAgICAgICAgICAgICAweDI2MDAKKyNkZWZpbmUgR0xfTElORUFSICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjYwMQorCisvKiBUZXh0dXJlTWluRmlsdGVyICovCisvKiAgICAgIEdMX05FQVJFU1QgKi8KKy8qICAgICAgR0xfTElORUFSICovCisjZGVmaW5lIEdMX05FQVJFU1RfTUlQTUFQX05FQVJFU1QgICAgICAgICAweDI3MDAKKyNkZWZpbmUgR0xfTElORUFSX01JUE1BUF9ORUFSRVNUICAgICAgICAgIDB4MjcwMQorI2RlZmluZSBHTF9ORUFSRVNUX01JUE1BUF9MSU5FQVIgICAgICAgICAgMHgyNzAyCisjZGVmaW5lIEdMX0xJTkVBUl9NSVBNQVBfTElORUFSICAgICAgICAgICAweDI3MDMKKworLyogVGV4dHVyZVBhcmFtZXRlck5hbWUgKi8KKyNkZWZpbmUgR0xfVEVYVFVSRV9NQUdfRklMVEVSICAgICAgICAgICAgIDB4MjgwMAorI2RlZmluZSBHTF9URVhUVVJFX01JTl9GSUxURVIgICAgICAgICAgICAgMHgyODAxCisjZGVmaW5lIEdMX1RFWFRVUkVfV1JBUF9TICAgICAgICAgICAgICAgICAweDI4MDIKKyNkZWZpbmUgR0xfVEVYVFVSRV9XUkFQX1QgICAgICAgICAgICAgICAgIDB4MjgwMworCisvKiBUZXh0dXJlVGFyZ2V0ICovCisvKiAgICAgIEdMX1RFWFRVUkVfMkQgKi8KKworLyogVGV4dHVyZVVuaXQgKi8KKyNkZWZpbmUgR0xfVEVYVFVSRTAgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDMAorI2RlZmluZSBHTF9URVhUVVJFMSAgICAgICAgICAgICAgICAgICAgICAgMHg4NEMxCisjZGVmaW5lIEdMX1RFWFRVUkUyICAgICAgICAgICAgICAgICAgICAgICAweDg0QzIKKyNkZWZpbmUgR0xfVEVYVFVSRTMgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDMworI2RlZmluZSBHTF9URVhUVVJFNCAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM0CisjZGVmaW5lIEdMX1RFWFRVUkU1ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzUKKyNkZWZpbmUgR0xfVEVYVFVSRTYgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNgorI2RlZmluZSBHTF9URVhUVVJFNyAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM3CisjZGVmaW5lIEdMX1RFWFRVUkU4ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzgKKyNkZWZpbmUgR0xfVEVYVFVSRTkgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDOQorI2RlZmluZSBHTF9URVhUVVJFMTAgICAgICAgICAgICAgICAgICAgICAgMHg4NENBCisjZGVmaW5lIEdMX1RFWFRVUkUxMSAgICAgICAgICAgICAgICAgICAgICAweDg0Q0IKKyNkZWZpbmUgR0xfVEVYVFVSRTEyICAgICAgICAgICAgICAgICAgICAgIDB4ODRDQworI2RlZmluZSBHTF9URVhUVVJFMTMgICAgICAgICAgICAgICAgICAgICAgMHg4NENECisjZGVmaW5lIEdMX1RFWFRVUkUxNCAgICAgICAgICAgICAgICAgICAgICAweDg0Q0UKKyNkZWZpbmUgR0xfVEVYVFVSRTE1ICAgICAgICAgICAgICAgICAgICAgIDB4ODRDRgorI2RlZmluZSBHTF9URVhUVVJFMTYgICAgICAgICAgICAgICAgICAgICAgMHg4NEQwCisjZGVmaW5lIEdMX1RFWFRVUkUxNyAgICAgICAgICAgICAgICAgICAgICAweDg0RDEKKyNkZWZpbmUgR0xfVEVYVFVSRTE4ICAgICAgICAgICAgICAgICAgICAgIDB4ODREMgorI2RlZmluZSBHTF9URVhUVVJFMTkgICAgICAgICAgICAgICAgICAgICAgMHg4NEQzCisjZGVmaW5lIEdMX1RFWFRVUkUyMCAgICAgICAgICAgICAgICAgICAgICAweDg0RDQKKyNkZWZpbmUgR0xfVEVYVFVSRTIxICAgICAgICAgICAgICAgICAgICAgIDB4ODRENQorI2RlZmluZSBHTF9URVhUVVJFMjIgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ2CisjZGVmaW5lIEdMX1RFWFRVUkUyMyAgICAgICAgICAgICAgICAgICAgICAweDg0RDcKKyNkZWZpbmUgR0xfVEVYVFVSRTI0ICAgICAgICAgICAgICAgICAgICAgIDB4ODREOAorI2RlZmluZSBHTF9URVhUVVJFMjUgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ5CisjZGVmaW5lIEdMX1RFWFRVUkUyNiAgICAgICAgICAgICAgICAgICAgICAweDg0REEKKyNkZWZpbmUgR0xfVEVYVFVSRTI3ICAgICAgICAgICAgICAgICAgICAgIDB4ODREQgorI2RlZmluZSBHTF9URVhUVVJFMjggICAgICAgICAgICAgICAgICAgICAgMHg4NERDCisjZGVmaW5lIEdMX1RFWFRVUkUyOSAgICAgICAgICAgICAgICAgICAgICAweDg0REQKKyNkZWZpbmUgR0xfVEVYVFVSRTMwICAgICAgICAgICAgICAgICAgICAgIDB4ODRERQorI2RlZmluZSBHTF9URVhUVVJFMzEgICAgICAgICAgICAgICAgICAgICAgMHg4NERGCisKKy8qIFRleHR1cmVXcmFwTW9kZSAqLworI2RlZmluZSBHTF9SRVBFQVQgICAgICAgICAgICAgICAgICAgICAgICAgMHgyOTAxCisjZGVmaW5lIEdMX0NMQU1QX1RPX0VER0UgICAgICAgICAgICAgICAgICAweDgxMkYKKworLyogUGl4ZWxJbnRlcm5hbEZvcm1hdCAqLworI2RlZmluZSBHTF9QQUxFVFRFNF9SR0I4X09FUyAgICAgICAgICAgICAgMHg4QjkwCisjZGVmaW5lIEdMX1BBTEVUVEU0X1JHQkE4X09FUyAgICAgICAgICAgICAweDhCOTEKKyNkZWZpbmUgR0xfUEFMRVRURTRfUjVfRzZfQjVfT0VTICAgICAgICAgIDB4OEI5MgorI2RlZmluZSBHTF9QQUxFVFRFNF9SR0JBNF9PRVMgICAgICAgICAgICAgMHg4QjkzCisjZGVmaW5lIEdMX1BBTEVUVEU0X1JHQjVfQTFfT0VTICAgICAgICAgICAweDhCOTQKKyNkZWZpbmUgR0xfUEFMRVRURThfUkdCOF9PRVMgICAgICAgICAgICAgIDB4OEI5NQorI2RlZmluZSBHTF9QQUxFVFRFOF9SR0JBOF9PRVMgICAgICAgICAgICAgMHg4Qjk2CisjZGVmaW5lIEdMX1BBTEVUVEU4X1I1X0c2X0I1X09FUyAgICAgICAgICAweDhCOTcKKyNkZWZpbmUgR0xfUEFMRVRURThfUkdCQTRfT0VTICAgICAgICAgICAgIDB4OEI5OAorI2RlZmluZSBHTF9QQUxFVFRFOF9SR0I1X0ExX09FUyAgICAgICAgICAgMHg4Qjk5CisKKy8qIFZlcnRleFBvaW50ZXJUeXBlICovCisvKiAgICAgIEdMX1NIT1JUICovCisvKiAgICAgIEdMX0ZMT0FUICovCisvKiAgICAgIEdMX0ZJWEVEICovCisvKiAgICAgIEdMX0JZVEUgKi8KKworLyogTGlnaHROYW1lICovCisjZGVmaW5lIEdMX0xJR0hUMCAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgR0xfTElHSFQxICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMQorI2RlZmluZSBHTF9MSUdIVDIgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAyCisjZGVmaW5lIEdMX0xJR0hUMyAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDMKKyNkZWZpbmUgR0xfTElHSFQ0ICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwNAorI2RlZmluZSBHTF9MSUdIVDUgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDA1CisjZGVmaW5lIEdMX0xJR0hUNiAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDYKKyNkZWZpbmUgR0xfTElHSFQ3ICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwNworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQWN0aXZlVGV4dHVyZSAoR0xlbnVtIHRleHR1cmUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEFscGhhRnVuYyAoR0xlbnVtIGZ1bmMsIEdMY2xhbXBmIHJlZik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQWxwaGFGdW5jeCAoR0xlbnVtIGZ1bmMsIEdMY2xhbXB4IHJlZik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZFRleHR1cmUgKEdMZW51bSB0YXJnZXQsIEdMdWludCB0ZXh0dXJlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCbGVuZEZ1bmMgKEdMZW51bSBzZmFjdG9yLCBHTGVudW0gZGZhY3Rvcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ2xlYXIgKEdMYml0ZmllbGQgbWFzayk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ2xlYXJDb2xvciAoR0xjbGFtcGYgcmVkLCBHTGNsYW1wZiBncmVlbiwgR0xjbGFtcGYgYmx1ZSwgR0xjbGFtcGYgYWxwaGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsZWFyQ29sb3J4IChHTGNsYW1weCByZWQsIEdMY2xhbXB4IGdyZWVuLCBHTGNsYW1weCBibHVlLCBHTGNsYW1weCBhbHBoYSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ2xlYXJEZXB0aGYgKEdMY2xhbXBmIGRlcHRoKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGVhckRlcHRoeCAoR0xjbGFtcHggZGVwdGgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsZWFyU3RlbmNpbCAoR0xpbnQgcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ2xpZW50QWN0aXZlVGV4dHVyZSAoR0xlbnVtIHRleHR1cmUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yNGYgKEdMZmxvYXQgcmVkLCBHTGZsb2F0IGdyZWVuLCBHTGZsb2F0IGJsdWUsIEdMZmxvYXQgYWxwaGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yNHggKEdMZml4ZWQgcmVkLCBHTGZpeGVkIGdyZWVuLCBHTGZpeGVkIGJsdWUsIEdMZml4ZWQgYWxwaGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yTWFzayAoR0xib29sZWFuIHJlZCwgR0xib29sZWFuIGdyZWVuLCBHTGJvb2xlYW4gYmx1ZSwgR0xib29sZWFuIGFscGhhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvclBvaW50ZXIgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weVRleEltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvcHlUZXhTdWJJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEN1bGxGYWNlIChHTGVudW0gbW9kZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlVGV4dHVyZXMgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICp0ZXh0dXJlcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVwdGhGdW5jIChHTGVudW0gZnVuYyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVwdGhNYXNrIChHTGJvb2xlYW4gZmxhZyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVwdGhSYW5nZWYgKEdMY2xhbXBmIHpOZWFyLCBHTGNsYW1wZiB6RmFyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZXB0aFJhbmdleCAoR0xjbGFtcHggek5lYXIsIEdMY2xhbXB4IHpGYXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERpc2FibGUgKEdMZW51bSBjYXApOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERpc2FibGVDbGllbnRTdGF0ZSAoR0xlbnVtIGFycmF5KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEcmF3QXJyYXlzIChHTGVudW0gbW9kZSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdFbGVtZW50cyAoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVuYWJsZSAoR0xlbnVtIGNhcCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRW5hYmxlQ2xpZW50U3RhdGUgKEdMZW51bSBhcnJheSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRmluaXNoICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGbHVzaCAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRm9nZiAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dmdiAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZvZ3ggKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRm9neHYgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcm9udEZhY2UgKEdMZW51bSBtb2RlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcnVzdHVtZiAoR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJ1c3R1bXggKEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdlblRleHR1cmVzIChHTHNpemVpIG4sIEdMdWludCAqdGV4dHVyZXMpOworR0xBUEkgR0xlbnVtIEFQSUVOVFJZIGdsR2V0RXJyb3IgKHZvaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEludGVnZXJ2IChHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xBUEkgY29uc3QgR0x1Ynl0ZSAqIEFQSUVOVFJZIGdsR2V0U3RyaW5nIChHTGVudW0gbmFtZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsSGludCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIG1vZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpZ2h0TW9kZWxmIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpZ2h0TW9kZWxmdiAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpZ2h0TW9kZWx4IChHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpZ2h0TW9kZWx4diAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpZ2h0ZiAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpZ2h0ZnYgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpZ2h0eCAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpZ2h0eHYgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpbmVXaWR0aCAoR0xmbG9hdCB3aWR0aCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGluZVdpZHRoeCAoR0xmaXhlZCB3aWR0aCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTG9hZElkZW50aXR5ICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMb2FkTWF0cml4ZiAoY29uc3QgR0xmbG9hdCAqbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTG9hZE1hdHJpeHggKGNvbnN0IEdMZml4ZWQgKm0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExvZ2ljT3AgKEdMZW51bSBvcGNvZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hdGVyaWFsZiAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0ZXJpYWxmdiAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXRlcmlhbHggKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hdGVyaWFseHYgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0cml4TW9kZSAoR0xlbnVtIG1vZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRNYXRyaXhmIChjb25zdCBHTGZsb2F0ICptKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0TWF0cml4eCAoY29uc3QgR0xmaXhlZCAqbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRmIChHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCByLCBHTGZsb2F0IHEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0eCAoR0xlbnVtIHRhcmdldCwgR0xmaXhlZCBzLCBHTGZpeGVkIHQsIEdMZml4ZWQgciwgR0xmaXhlZCBxKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWwzZiAoR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsM3ggKEdMZml4ZWQgbngsIEdMZml4ZWQgbnksIEdMZml4ZWQgbnopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5vcm1hbFBvaW50ZXIgKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xPcnRob2YgKEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE9ydGhveCAoR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUGl4ZWxTdG9yZWkgKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvaW50U2l6ZSAoR0xmbG9hdCBzaXplKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQb2ludFNpemV4IChHTGZpeGVkIHNpemUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvbHlnb25PZmZzZXQgKEdMZmxvYXQgZmFjdG9yLCBHTGZsb2F0IHVuaXRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQb2x5Z29uT2Zmc2V0eCAoR0xmaXhlZCBmYWN0b3IsIEdMZml4ZWQgdW5pdHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvcE1hdHJpeCAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHVzaE1hdHJpeCAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVhZFBpeGVscyAoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnBpeGVscyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUm90YXRlZiAoR0xmbG9hdCBhbmdsZSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUm90YXRleCAoR0xmaXhlZCBhbmdsZSwgR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2FtcGxlQ292ZXJhZ2UgKEdMY2xhbXBmIHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTYW1wbGVDb3ZlcmFnZXggKEdMY2xhbXB4IHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTY2FsZWYgKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNjYWxleCAoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Npc3NvciAoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNoYWRlTW9kZWwgKEdMZW51bSBtb2RlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTdGVuY2lsRnVuYyAoR0xlbnVtIGZ1bmMsIEdMaW50IHJlZiwgR0x1aW50IG1hc2spOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFN0ZW5jaWxNYXNrIChHTHVpbnQgbWFzayk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3RlbmNpbE9wIChHTGVudW0gZmFpbCwgR0xlbnVtIHpmYWlsLCBHTGVudW0genBhc3MpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkUG9pbnRlciAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleEVudmYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4RW52ZnYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhFbnZ4IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleEVudnh2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4SW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleFBhcmFtZXRlcmYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4UGFyYW1ldGVyeCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhTdWJJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVHJhbnNsYXRlZiAoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVHJhbnNsYXRleCAoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4UG9pbnRlciAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZpZXdwb3J0IChHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX2dsX2hfICovCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9saWNlbnNlLUJTRC50eHQgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9saWNlbnNlLUJTRC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkyNGUzYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2xpY2Vuc2UtQlNELnR4dApAQCAtMCwwICsxLDM0IEBACitUaGlzIGlzIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3IgdGhlICJTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiINCitPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlIHNvdXJjZSBjb2RlDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24gT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZQ0KK0NvcHlyaWdodCAoYykgMjAwNC0yMDA1LCBKZXRybyBMYXVoYQ0KK0FsbCByaWdodHMgcmVzZXJ2ZWQuDQorDQorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zDQorYXJlIG1ldDoNCisNCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodA0KKyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbg0KKyAgICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCisgICAgICBkaXN0cmlidXRpb24uDQorICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgc29mdHdhcmUgcHJvZHVjdCdzIGNvcHlyaWdodCBvd25lciBub3INCisgICAgICB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUNCisgICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4NCisgICAgICBwZXJtaXNzaW9uLg0KKw0KK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCisiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KK0xJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KK0EgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQorT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQorU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEDQorVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUg0KK1BST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YNCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORw0KK05FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUw0KK1NPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2xpY2Vuc2UtTEdQTC50eHQgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9saWNlbnNlLUxHUEwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZTNmNWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9saWNlbnNlLUxHUEwudHh0CkBAIC0wLDAgKzEsNTA0IEBACisJCSAgR05VIExFU1NFUiBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisJCSAgICAgICBWZXJzaW9uIDIuMSwgRmVicnVhcnkgMTk5OQorCisgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCisgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKK1tUaGlzIGlzIHRoZSBmaXJzdCByZWxlYXNlZCB2ZXJzaW9uIG9mIHRoZSBMZXNzZXIgR1BMLiAgSXQgYWxzbyBjb3VudHMKKyBhcyB0aGUgc3VjY2Vzc29yIG9mIHRoZSBHTlUgTGlicmFyeSBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBoZW5jZQorIHRoZSB2ZXJzaW9uIG51bWJlciAyLjEuXQorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZXMgYXJlIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZQorZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLgorCisgIFRoaXMgbGljZW5zZSwgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIHNvbWUKK3NwZWNpYWxseSBkZXNpZ25hdGVkIHNvZnR3YXJlIHBhY2thZ2VzLS10eXBpY2FsbHkgbGlicmFyaWVzLS1vZiB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgb3RoZXIgYXV0aG9ycyB3aG8gZGVjaWRlIHRvIHVzZSBpdC4gIFlvdQorY2FuIHVzZSBpdCB0b28sIGJ1dCB3ZSBzdWdnZXN0IHlvdSBmaXJzdCB0aGluayBjYXJlZnVsbHkgYWJvdXQgd2hldGhlcgordGhpcyBsaWNlbnNlIG9yIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIHRoZSBiZXR0ZXIKK3N0cmF0ZWd5IHRvIHVzZSBpbiBhbnkgcGFydGljdWxhciBjYXNlLCBiYXNlZCBvbiB0aGUgZXhwbGFuYXRpb25zIGJlbG93LgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tIG9mIHVzZSwKK25vdCBwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQKK3lvdSBoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UKK2ZvciB0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpOyB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQKK2l0IGlmIHlvdSB3YW50IGl0OyB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBhbmQgdXNlIHBpZWNlcyBvZgoraXQgaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBhcmUgaW5mb3JtZWQgdGhhdCB5b3UgY2FuIGRvCit0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorZGlzdHJpYnV0b3JzIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGVzZQorcmlnaHRzLiAgVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yCit5b3UgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5IG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgd2hldGhlciBncmF0aXMKK29yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0IHdlIGdhdmUKK3lvdS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZSBzb3VyY2UKK2NvZGUuICBJZiB5b3UgbGluayBvdGhlciBjb2RlIHdpdGggdGhlIGxpYnJhcnksIHlvdSBtdXN0IHByb3ZpZGUKK2NvbXBsZXRlIG9iamVjdCBmaWxlcyB0byB0aGUgcmVjaXBpZW50cywgc28gdGhhdCB0aGV5IGNhbiByZWxpbmsgdGhlbQord2l0aCB0aGUgbGlicmFyeSBhZnRlciBtYWtpbmcgY2hhbmdlcyB0byB0aGUgbGlicmFyeSBhbmQgcmVjb21waWxpbmcKK2l0LiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIgcmlnaHRzLgorCisgIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCBhIHR3by1zdGVwIG1ldGhvZDogKDEpIHdlIGNvcHlyaWdodCB0aGUKK2xpYnJhcnksIGFuZCAoMikgd2Ugb2ZmZXIgeW91IHRoaXMgbGljZW5zZSwgd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsCitwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgbGlicmFyeS4KKworICBUbyBwcm90ZWN0IGVhY2ggZGlzdHJpYnV0b3IsIHdlIHdhbnQgdG8gbWFrZSBpdCB2ZXJ5IGNsZWFyIHRoYXQKK3RoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGUgZnJlZSBsaWJyYXJ5LiAgQWxzbywgaWYgdGhlIGxpYnJhcnkgaXMKK21vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB0aGUgcmVjaXBpZW50cyBzaG91bGQga25vdwordGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsIHZlcnNpb24sIHNvIHRoYXQgdGhlIG9yaWdpbmFsCithdXRob3IncyByZXB1dGF0aW9uIHdpbGwgbm90IGJlIGFmZmVjdGVkIGJ5IHByb2JsZW1zIHRoYXQgbWlnaHQgYmUKK2ludHJvZHVjZWQgYnkgb3RoZXJzLgorDAorICBGaW5hbGx5LCBzb2Z0d2FyZSBwYXRlbnRzIHBvc2UgYSBjb25zdGFudCB0aHJlYXQgdG8gdGhlIGV4aXN0ZW5jZSBvZgorYW55IGZyZWUgcHJvZ3JhbS4gIFdlIHdpc2ggdG8gbWFrZSBzdXJlIHRoYXQgYSBjb21wYW55IGNhbm5vdAorZWZmZWN0aXZlbHkgcmVzdHJpY3QgdGhlIHVzZXJzIG9mIGEgZnJlZSBwcm9ncmFtIGJ5IG9idGFpbmluZyBhCityZXN0cmljdGl2ZSBsaWNlbnNlIGZyb20gYSBwYXRlbnQgaG9sZGVyLiAgVGhlcmVmb3JlLCB3ZSBpbnNpc3QgdGhhdAorYW55IHBhdGVudCBsaWNlbnNlIG9idGFpbmVkIGZvciBhIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgbXVzdCBiZQorY29uc2lzdGVudCB3aXRoIHRoZSBmdWxsIGZyZWVkb20gb2YgdXNlIHNwZWNpZmllZCBpbiB0aGlzIGxpY2Vuc2UuCisKKyAgTW9zdCBHTlUgc29mdHdhcmUsIGluY2x1ZGluZyBzb21lIGxpYnJhcmllcywgaXMgY292ZXJlZCBieSB0aGUKK29yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhpcyBsaWNlbnNlLCB0aGUgR05VIExlc3NlcgorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBjZXJ0YWluIGRlc2lnbmF0ZWQgbGlicmFyaWVzLCBhbmQKK2lzIHF1aXRlIGRpZmZlcmVudCBmcm9tIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgV2UgdXNlCit0aGlzIGxpY2Vuc2UgZm9yIGNlcnRhaW4gbGlicmFyaWVzIGluIG9yZGVyIHRvIHBlcm1pdCBsaW5raW5nIHRob3NlCitsaWJyYXJpZXMgaW50byBub24tZnJlZSBwcm9ncmFtcy4KKworICBXaGVuIGEgcHJvZ3JhbSBpcyBsaW5rZWQgd2l0aCBhIGxpYnJhcnksIHdoZXRoZXIgc3RhdGljYWxseSBvciB1c2luZworYSBzaGFyZWQgbGlicmFyeSwgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSB0d28gaXMgbGVnYWxseSBzcGVha2luZyBhCitjb21iaW5lZCB3b3JrLCBhIGRlcml2YXRpdmUgb2YgdGhlIG9yaWdpbmFsIGxpYnJhcnkuICBUaGUgb3JkaW5hcnkKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgdGhlcmVmb3JlIHBlcm1pdHMgc3VjaCBsaW5raW5nIG9ubHkgaWYgdGhlCitlbnRpcmUgY29tYmluYXRpb24gZml0cyBpdHMgY3JpdGVyaWEgb2YgZnJlZWRvbS4gIFRoZSBMZXNzZXIgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgcGVybWl0cyBtb3JlIGxheCBjcml0ZXJpYSBmb3IgbGlua2luZyBvdGhlciBjb2RlIHdpdGgKK3RoZSBsaWJyYXJ5LgorCisgIFdlIGNhbGwgdGhpcyBsaWNlbnNlIHRoZSAiTGVzc2VyIiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGJlY2F1c2UgaXQKK2RvZXMgTGVzcyB0byBwcm90ZWN0IHRoZSB1c2VyJ3MgZnJlZWRvbSB0aGFuIHRoZSBvcmRpbmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZS4gIEl0IGFsc28gcHJvdmlkZXMgb3RoZXIgZnJlZSBzb2Z0d2FyZSBkZXZlbG9wZXJzIExlc3MKK29mIGFuIGFkdmFudGFnZSBvdmVyIGNvbXBldGluZyBub24tZnJlZSBwcm9ncmFtcy4gIFRoZXNlIGRpc2FkdmFudGFnZXMKK2FyZSB0aGUgcmVhc29uIHdlIHVzZSB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbWFueQorbGlicmFyaWVzLiAgSG93ZXZlciwgdGhlIExlc3NlciBsaWNlbnNlIHByb3ZpZGVzIGFkdmFudGFnZXMgaW4gY2VydGFpbgorc3BlY2lhbCBjaXJjdW1zdGFuY2VzLgorCisgIEZvciBleGFtcGxlLCBvbiByYXJlIG9jY2FzaW9ucywgdGhlcmUgbWF5IGJlIGEgc3BlY2lhbCBuZWVkIHRvCitlbmNvdXJhZ2UgdGhlIHdpZGVzdCBwb3NzaWJsZSB1c2Ugb2YgYSBjZXJ0YWluIGxpYnJhcnksIHNvIHRoYXQgaXQgYmVjb21lcworYSBkZS1mYWN0byBzdGFuZGFyZC4gIFRvIGFjaGlldmUgdGhpcywgbm9uLWZyZWUgcHJvZ3JhbXMgbXVzdCBiZQorYWxsb3dlZCB0byB1c2UgdGhlIGxpYnJhcnkuICBBIG1vcmUgZnJlcXVlbnQgY2FzZSBpcyB0aGF0IGEgZnJlZQorbGlicmFyeSBkb2VzIHRoZSBzYW1lIGpvYiBhcyB3aWRlbHkgdXNlZCBub24tZnJlZSBsaWJyYXJpZXMuICBJbiB0aGlzCitjYXNlLCB0aGVyZSBpcyBsaXR0bGUgdG8gZ2FpbiBieSBsaW1pdGluZyB0aGUgZnJlZSBsaWJyYXJ5IHRvIGZyZWUKK3NvZnR3YXJlIG9ubHksIHNvIHdlIHVzZSB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisKKyAgSW4gb3RoZXIgY2FzZXMsIHBlcm1pc3Npb24gdG8gdXNlIGEgcGFydGljdWxhciBsaWJyYXJ5IGluIG5vbi1mcmVlCitwcm9ncmFtcyBlbmFibGVzIGEgZ3JlYXRlciBudW1iZXIgb2YgcGVvcGxlIHRvIHVzZSBhIGxhcmdlIGJvZHkgb2YKK2ZyZWUgc29mdHdhcmUuICBGb3IgZXhhbXBsZSwgcGVybWlzc2lvbiB0byB1c2UgdGhlIEdOVSBDIExpYnJhcnkgaW4KK25vbi1mcmVlIHByb2dyYW1zIGVuYWJsZXMgbWFueSBtb3JlIHBlb3BsZSB0byB1c2UgdGhlIHdob2xlIEdOVQorb3BlcmF0aW5nIHN5c3RlbSwgYXMgd2VsbCBhcyBpdHMgdmFyaWFudCwgdGhlIEdOVS9MaW51eCBvcGVyYXRpbmcKK3N5c3RlbS4KKworICBBbHRob3VnaCB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgTGVzcyBwcm90ZWN0aXZlIG9mIHRoZQordXNlcnMnIGZyZWVkb20sIGl0IGRvZXMgZW5zdXJlIHRoYXQgdGhlIHVzZXIgb2YgYSBwcm9ncmFtIHRoYXQgaXMKK2xpbmtlZCB3aXRoIHRoZSBMaWJyYXJ5IGhhcyB0aGUgZnJlZWRvbSBhbmQgdGhlIHdoZXJld2l0aGFsIHRvIHJ1bgordGhhdCBwcm9ncmFtIHVzaW5nIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeS4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4gIFBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhCisid29yayBiYXNlZCBvbiB0aGUgbGlicmFyeSIgYW5kIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBsaWJyYXJ5Ii4gIFRoZQorZm9ybWVyIGNvbnRhaW5zIGNvZGUgZGVyaXZlZCBmcm9tIHRoZSBsaWJyYXJ5LCB3aGVyZWFzIHRoZSBsYXR0ZXIgbXVzdAorYmUgY29tYmluZWQgd2l0aCB0aGUgbGlicmFyeSBpbiBvcmRlciB0byBydW4uCisMCisJCSAgR05VIExFU1NFUiBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgQWdyZWVtZW50IGFwcGxpZXMgdG8gYW55IHNvZnR3YXJlIGxpYnJhcnkgb3Igb3RoZXIKK3Byb2dyYW0gd2hpY2ggY29udGFpbnMgYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9yCitvdGhlciBhdXRob3JpemVkIHBhcnR5IHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mCit0aGlzIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChhbHNvIGNhbGxlZCAidGhpcyBMaWNlbnNlIikuCitFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworICBBICJsaWJyYXJ5IiBtZWFucyBhIGNvbGxlY3Rpb24gb2Ygc29mdHdhcmUgZnVuY3Rpb25zIGFuZC9vciBkYXRhCitwcmVwYXJlZCBzbyBhcyB0byBiZSBjb252ZW5pZW50bHkgbGlua2VkIHdpdGggYXBwbGljYXRpb24gcHJvZ3JhbXMKKyh3aGljaCB1c2Ugc29tZSBvZiB0aG9zZSBmdW5jdGlvbnMgYW5kIGRhdGEpIHRvIGZvcm0gZXhlY3V0YWJsZXMuCisKKyAgVGhlICJMaWJyYXJ5IiwgYmVsb3csIHJlZmVycyB0byBhbnkgc3VjaCBzb2Z0d2FyZSBsaWJyYXJ5IG9yIHdvcmsKK3doaWNoIGhhcyBiZWVuIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZXNlIHRlcm1zLiAgQSAid29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkiIG1lYW5zIGVpdGhlciB0aGUgTGlicmFyeSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyCitjb3B5cmlnaHQgbGF3OiB0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIExpYnJhcnkgb3IgYQorcG9ydGlvbiBvZiBpdCwgZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZAorc3RyYWlnaHRmb3J3YXJkbHkgaW50byBhbm90aGVyIGxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcworaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluIHRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikKKworICAiU291cmNlIGNvZGUiIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYSBsaWJyYXJ5LCBjb21wbGV0ZSBzb3VyY2UgY29kZSBtZWFucworYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55IGFzc29jaWF0ZWQKK2ludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8gY29udHJvbCBjb21waWxhdGlvbgorYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgbGlicmFyeS4KKworICBBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyBhIHByb2dyYW0gdXNpbmcgdGhlIExpYnJhcnkgaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCBvdXRwdXQgZnJvbQorc3VjaCBhIHByb2dyYW0gaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZAorb24gdGhlIExpYnJhcnkgKGluZGVwZW5kZW50IG9mIHRoZSB1c2Ugb2YgdGhlIExpYnJhcnkgaW4gYSB0b29sIGZvcgord3JpdGluZyBpdCkuICBXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIExpYnJhcnkgZG9lcworYW5kIHdoYXQgdGhlIHByb2dyYW0gdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IGRvZXMuCisgIAorICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBMaWJyYXJ5J3MKK2NvbXBsZXRlIHNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0Cit5b3UgY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbgorYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QKK2FsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55Cit3YXJyYW50eTsgYW5kIGRpc3RyaWJ1dGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZQorTGlicmFyeS4KKworICBZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LAorYW5kIHlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYQorZmVlLgorDAorICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBMaWJyYXJ5IG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBUaGUgbW9kaWZpZWQgd29yayBtdXN0IGl0c2VsZiBiZSBhIHNvZnR3YXJlIGxpYnJhcnkuCisKKyAgICBiKSBZb3UgbXVzdCBjYXVzZSB0aGUgZmlsZXMgbW9kaWZpZWQgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYykgWW91IG11c3QgY2F1c2UgdGhlIHdob2xlIG9mIHRoZSB3b3JrIHRvIGJlIGxpY2Vuc2VkIGF0IG5vCisgICAgY2hhcmdlIHRvIGFsbCB0aGlyZCBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBkKSBJZiBhIGZhY2lsaXR5IGluIHRoZSBtb2RpZmllZCBMaWJyYXJ5IHJlZmVycyB0byBhIGZ1bmN0aW9uIG9yIGEKKyAgICB0YWJsZSBvZiBkYXRhIHRvIGJlIHN1cHBsaWVkIGJ5IGFuIGFwcGxpY2F0aW9uIHByb2dyYW0gdGhhdCB1c2VzCisgICAgdGhlIGZhY2lsaXR5LCBvdGhlciB0aGFuIGFzIGFuIGFyZ3VtZW50IHBhc3NlZCB3aGVuIHRoZSBmYWNpbGl0eQorICAgIGlzIGludm9rZWQsIHRoZW4geW91IG11c3QgbWFrZSBhIGdvb2QgZmFpdGggZWZmb3J0IHRvIGVuc3VyZSB0aGF0LAorICAgIGluIHRoZSBldmVudCBhbiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgc3VjaCBmdW5jdGlvbiBvcgorICAgIHRhYmxlLCB0aGUgZmFjaWxpdHkgc3RpbGwgb3BlcmF0ZXMsIGFuZCBwZXJmb3JtcyB3aGF0ZXZlciBwYXJ0IG9mCisgICAgaXRzIHB1cnBvc2UgcmVtYWlucyBtZWFuaW5nZnVsLgorCisgICAgKEZvciBleGFtcGxlLCBhIGZ1bmN0aW9uIGluIGEgbGlicmFyeSB0byBjb21wdXRlIHNxdWFyZSByb290cyBoYXMKKyAgICBhIHB1cnBvc2UgdGhhdCBpcyBlbnRpcmVseSB3ZWxsLWRlZmluZWQgaW5kZXBlbmRlbnQgb2YgdGhlCisgICAgYXBwbGljYXRpb24uICBUaGVyZWZvcmUsIFN1YnNlY3Rpb24gMmQgcmVxdWlyZXMgdGhhdCBhbnkKKyAgICBhcHBsaWNhdGlvbi1zdXBwbGllZCBmdW5jdGlvbiBvciB0YWJsZSB1c2VkIGJ5IHRoaXMgZnVuY3Rpb24gbXVzdAorICAgIGJlIG9wdGlvbmFsOiBpZiB0aGUgYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IGl0LCB0aGUgc3F1YXJlCisgICAgcm9vdCBmdW5jdGlvbiBtdXN0IHN0aWxsIGNvbXB1dGUgc3F1YXJlIHJvb3RzLikKKworVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgoraWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgTGlicmFyeSwKK2FuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgordGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQorc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91CitkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKK29uIHRoZSBMaWJyYXJ5LCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgordGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKK2VudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZQoraXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIExpYnJhcnkuCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIExpYnJhcnkKK3dpdGggdGhlIExpYnJhcnkgKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5KSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBvcHQgdG8gYXBwbHkgdGhlIHRlcm1zIG9mIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UgdG8gYSBnaXZlbiBjb3B5IG9mIHRoZSBMaWJyYXJ5LiAgVG8gZG8KK3RoaXMsIHlvdSBtdXN0IGFsdGVyIGFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSwgc28KK3RoYXQgdGhleSByZWZlciB0byB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwKK2luc3RlYWQgb2YgdG8gdGhpcyBMaWNlbnNlLiAgKElmIGEgbmV3ZXIgdmVyc2lvbiB0aGFuIHZlcnNpb24gMiBvZiB0aGUKK29yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGhhcyBhcHBlYXJlZCwgdGhlbiB5b3UgY2FuIHNwZWNpZnkKK3RoYXQgdmVyc2lvbiBpbnN0ZWFkIGlmIHlvdSB3aXNoLikgIERvIG5vdCBtYWtlIGFueSBvdGhlciBjaGFuZ2UgaW4KK3RoZXNlIG5vdGljZXMuCisMCisgIE9uY2UgdGhpcyBjaGFuZ2UgaXMgbWFkZSBpbiBhIGdpdmVuIGNvcHksIGl0IGlzIGlycmV2ZXJzaWJsZSBmb3IKK3RoYXQgY29weSwgc28gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gYWxsCitzdWJzZXF1ZW50IGNvcGllcyBhbmQgZGVyaXZhdGl2ZSB3b3JrcyBtYWRlIGZyb20gdGhhdCBjb3B5LgorCisgIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSB3aXNoIHRvIGNvcHkgcGFydCBvZiB0aGUgY29kZSBvZgordGhlIExpYnJhcnkgaW50byBhIHByb2dyYW0gdGhhdCBpcyBub3QgYSBsaWJyYXJ5LgorCisgIDQuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYSBwb3J0aW9uIG9yCitkZXJpdmF0aXZlIG9mIGl0LCB1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybQordW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWNjb21wYW55CitpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUsIHdoaWNoCittdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEKK21lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZS4KKworICBJZiBkaXN0cmlidXRpb24gb2Ygb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQorZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUKK3NvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2Ugc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudCB0bworZGlzdHJpYnV0ZSB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKworICA1LiBBIHByb2dyYW0gdGhhdCBjb250YWlucyBubyBkZXJpdmF0aXZlIG9mIGFueSBwb3J0aW9uIG9mIHRoZQorTGlicmFyeSwgYnV0IGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCB0aGUgTGlicmFyeSBieSBiZWluZyBjb21waWxlZCBvcgorbGlua2VkIHdpdGggaXQsIGlzIGNhbGxlZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIuICBTdWNoIGEKK3dvcmssIGluIGlzb2xhdGlvbiwgaXMgbm90IGEgZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5LCBhbmQKK3RoZXJlZm9yZSBmYWxscyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgSG93ZXZlciwgbGlua2luZyBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeQorY3JlYXRlcyBhbiBleGVjdXRhYmxlIHRoYXQgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5IChiZWNhdXNlIGl0Citjb250YWlucyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSksIHJhdGhlciB0aGFuIGEgIndvcmsgdGhhdCB1c2VzIHRoZQorbGlicmFyeSIuICBUaGUgZXhlY3V0YWJsZSBpcyB0aGVyZWZvcmUgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UuCitTZWN0aW9uIDYgc3RhdGVzIHRlcm1zIGZvciBkaXN0cmlidXRpb24gb2Ygc3VjaCBleGVjdXRhYmxlcy4KKworICBXaGVuIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB1c2VzIG1hdGVyaWFsIGZyb20gYSBoZWFkZXIgZmlsZQordGhhdCBpcyBwYXJ0IG9mIHRoZSBMaWJyYXJ5LCB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIG1heSBiZSBhCitkZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnkgZXZlbiB0aG91Z2ggdGhlIHNvdXJjZSBjb2RlIGlzIG5vdC4KK1doZXRoZXIgdGhpcyBpcyB0cnVlIGlzIGVzcGVjaWFsbHkgc2lnbmlmaWNhbnQgaWYgdGhlIHdvcmsgY2FuIGJlCitsaW5rZWQgd2l0aG91dCB0aGUgTGlicmFyeSwgb3IgaWYgdGhlIHdvcmsgaXMgaXRzZWxmIGEgbGlicmFyeS4gIFRoZQordGhyZXNob2xkIGZvciB0aGlzIHRvIGJlIHRydWUgaXMgbm90IHByZWNpc2VseSBkZWZpbmVkIGJ5IGxhdy4KKworICBJZiBzdWNoIGFuIG9iamVjdCBmaWxlIHVzZXMgb25seSBudW1lcmljYWwgcGFyYW1ldGVycywgZGF0YQorc3RydWN0dXJlIGxheW91dHMgYW5kIGFjY2Vzc29ycywgYW5kIHNtYWxsIG1hY3JvcyBhbmQgc21hbGwgaW5saW5lCitmdW5jdGlvbnMgKHRlbiBsaW5lcyBvciBsZXNzIGluIGxlbmd0aCksIHRoZW4gdGhlIHVzZSBvZiB0aGUgb2JqZWN0CitmaWxlIGlzIHVucmVzdHJpY3RlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGxlZ2FsbHkgYSBkZXJpdmF0aXZlCit3b3JrLiAgKEV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhpcyBvYmplY3QgY29kZSBwbHVzIHBvcnRpb25zIG9mIHRoZQorTGlicmFyeSB3aWxsIHN0aWxsIGZhbGwgdW5kZXIgU2VjdGlvbiA2LikKKworICBPdGhlcndpc2UsIGlmIHRoZSB3b3JrIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSwgeW91IG1heQorZGlzdHJpYnV0ZSB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDYuCitBbnkgZXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGF0IHdvcmsgYWxzbyBmYWxsIHVuZGVyIFNlY3Rpb24gNiwKK3doZXRoZXIgb3Igbm90IHRoZXkgYXJlIGxpbmtlZCBkaXJlY3RseSB3aXRoIHRoZSBMaWJyYXJ5IGl0c2VsZi4KKwwKKyAgNi4gQXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBTZWN0aW9ucyBhYm92ZSwgeW91IG1heSBhbHNvIGNvbWJpbmUgb3IKK2xpbmsgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhCit3b3JrIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZCBkaXN0cmlidXRlIHRoYXQgd29yawordW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgdGhlIHRlcm1zIHBlcm1pdAorbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrIGZvciB0aGUgY3VzdG9tZXIncyBvd24gdXNlIGFuZCByZXZlcnNlCitlbmdpbmVlcmluZyBmb3IgZGVidWdnaW5nIHN1Y2ggbW9kaWZpY2F0aW9ucy4KKworICBZb3UgbXVzdCBnaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCBlYWNoIGNvcHkgb2YgdGhlIHdvcmsgdGhhdCB0aGUKK0xpYnJhcnkgaXMgdXNlZCBpbiBpdCBhbmQgdGhhdCB0aGUgTGlicmFyeSBhbmQgaXRzIHVzZSBhcmUgY292ZXJlZCBieQordGhpcyBMaWNlbnNlLiAgWW91IG11c3Qgc3VwcGx5IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZiB0aGUgd29yaworZHVyaW5nIGV4ZWN1dGlvbiBkaXNwbGF5cyBjb3B5cmlnaHQgbm90aWNlcywgeW91IG11c3QgaW5jbHVkZSB0aGUKK2NvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBMaWJyYXJ5IGFtb25nIHRoZW0sIGFzIHdlbGwgYXMgYSByZWZlcmVuY2UKK2RpcmVjdGluZyB0aGUgdXNlciB0byB0aGUgY29weSBvZiB0aGlzIExpY2Vuc2UuICBBbHNvLCB5b3UgbXVzdCBkbyBvbmUKK29mIHRoZXNlIHRoaW5nczoKKworICAgIGEpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nCisgICAgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSBmb3IgdGhlIExpYnJhcnkgaW5jbHVkaW5nIHdoYXRldmVyCisgICAgY2hhbmdlcyB3ZXJlIHVzZWQgaW4gdGhlIHdvcmsgKHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIKKyAgICBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlKTsgYW5kLCBpZiB0aGUgd29yayBpcyBhbiBleGVjdXRhYmxlIGxpbmtlZAorICAgIHdpdGggdGhlIExpYnJhcnksIHdpdGggdGhlIGNvbXBsZXRlIG1hY2hpbmUtcmVhZGFibGUgIndvcmsgdGhhdAorICAgIHVzZXMgdGhlIExpYnJhcnkiLCBhcyBvYmplY3QgY29kZSBhbmQvb3Igc291cmNlIGNvZGUsIHNvIHRoYXQgdGhlCisgICAgdXNlciBjYW4gbW9kaWZ5IHRoZSBMaWJyYXJ5IGFuZCB0aGVuIHJlbGluayB0byBwcm9kdWNlIGEgbW9kaWZpZWQKKyAgICBleGVjdXRhYmxlIGNvbnRhaW5pbmcgdGhlIG1vZGlmaWVkIExpYnJhcnkuICAoSXQgaXMgdW5kZXJzdG9vZAorICAgIHRoYXQgdGhlIHVzZXIgd2hvIGNoYW5nZXMgdGhlIGNvbnRlbnRzIG9mIGRlZmluaXRpb25zIGZpbGVzIGluIHRoZQorICAgIExpYnJhcnkgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgYWJsZSB0byByZWNvbXBpbGUgdGhlIGFwcGxpY2F0aW9uCisgICAgdG8gdXNlIHRoZSBtb2RpZmllZCBkZWZpbml0aW9ucy4pCisKKyAgICBiKSBVc2UgYSBzdWl0YWJsZSBzaGFyZWQgbGlicmFyeSBtZWNoYW5pc20gZm9yIGxpbmtpbmcgd2l0aCB0aGUKKyAgICBMaWJyYXJ5LiAgQSBzdWl0YWJsZSBtZWNoYW5pc20gaXMgb25lIHRoYXQgKDEpIHVzZXMgYXQgcnVuIHRpbWUgYQorICAgIGNvcHkgb2YgdGhlIGxpYnJhcnkgYWxyZWFkeSBwcmVzZW50IG9uIHRoZSB1c2VyJ3MgY29tcHV0ZXIgc3lzdGVtLAorICAgIHJhdGhlciB0aGFuIGNvcHlpbmcgbGlicmFyeSBmdW5jdGlvbnMgaW50byB0aGUgZXhlY3V0YWJsZSwgYW5kICgyKQorICAgIHdpbGwgb3BlcmF0ZSBwcm9wZXJseSB3aXRoIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgaWYKKyAgICB0aGUgdXNlciBpbnN0YWxscyBvbmUsIGFzIGxvbmcgYXMgdGhlIG1vZGlmaWVkIHZlcnNpb24gaXMKKyAgICBpbnRlcmZhY2UtY29tcGF0aWJsZSB3aXRoIHRoZSB2ZXJzaW9uIHRoYXQgdGhlIHdvcmsgd2FzIG1hZGUgd2l0aC4KKworICAgIGMpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0CisgICAgbGVhc3QgdGhyZWUgeWVhcnMsIHRvIGdpdmUgdGhlIHNhbWUgdXNlciB0aGUgbWF0ZXJpYWxzCisgICAgc3BlY2lmaWVkIGluIFN1YnNlY3Rpb24gNmEsIGFib3ZlLCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZQorICAgIHRoYW4gdGhlIGNvc3Qgb2YgcGVyZm9ybWluZyB0aGlzIGRpc3RyaWJ1dGlvbi4KKworICAgIGQpIElmIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5CisgICAgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIG9mZmVyIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlIGFib3ZlCisgICAgc3BlY2lmaWVkIG1hdGVyaWFscyBmcm9tIHRoZSBzYW1lIHBsYWNlLgorCisgICAgZSkgVmVyaWZ5IHRoYXQgdGhlIHVzZXIgaGFzIGFscmVhZHkgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZXNlCisgICAgbWF0ZXJpYWxzIG9yIHRoYXQgeW91IGhhdmUgYWxyZWFkeSBzZW50IHRoaXMgdXNlciBhIGNvcHkuCisKKyAgRm9yIGFuIGV4ZWN1dGFibGUsIHRoZSByZXF1aXJlZCBmb3JtIG9mIHRoZSAid29yayB0aGF0IHVzZXMgdGhlCitMaWJyYXJ5IiBtdXN0IGluY2x1ZGUgYW55IGRhdGEgYW5kIHV0aWxpdHkgcHJvZ3JhbXMgbmVlZGVkIGZvcgorcmVwcm9kdWNpbmcgdGhlIGV4ZWN1dGFibGUgZnJvbSBpdC4gIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sCit0aGUgbWF0ZXJpYWxzIHRvIGJlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcworbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yCitjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uCit3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQgaXRzZWxmIGFjY29tcGFuaWVzCit0aGUgZXhlY3V0YWJsZS4KKworICBJdCBtYXkgaGFwcGVuIHRoYXQgdGhpcyByZXF1aXJlbWVudCBjb250cmFkaWN0cyB0aGUgbGljZW5zZQorcmVzdHJpY3Rpb25zIG9mIG90aGVyIHByb3ByaWV0YXJ5IGxpYnJhcmllcyB0aGF0IGRvIG5vdCBub3JtYWxseQorYWNjb21wYW55IHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgU3VjaCBhIGNvbnRyYWRpY3Rpb24gbWVhbnMgeW91IGNhbm5vdAordXNlIGJvdGggdGhlbSBhbmQgdGhlIExpYnJhcnkgdG9nZXRoZXIgaW4gYW4gZXhlY3V0YWJsZSB0aGF0IHlvdQorZGlzdHJpYnV0ZS4KKwwKKyAgNy4gWW91IG1heSBwbGFjZSBsaWJyYXJ5IGZhY2lsaXRpZXMgdGhhdCBhcmUgYSB3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSBzaWRlLWJ5LXNpZGUgaW4gYSBzaW5nbGUgbGlicmFyeSB0b2dldGhlciB3aXRoIG90aGVyIGxpYnJhcnkKK2ZhY2lsaXRpZXMgbm90IGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSBzdWNoIGEgY29tYmluZWQKK2xpYnJhcnksIHByb3ZpZGVkIHRoYXQgdGhlIHNlcGFyYXRlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBiYXNlZCBvbgordGhlIExpYnJhcnkgYW5kIG9mIHRoZSBvdGhlciBsaWJyYXJ5IGZhY2lsaXRpZXMgaXMgb3RoZXJ3aXNlCitwZXJtaXR0ZWQsIGFuZCBwcm92aWRlZCB0aGF0IHlvdSBkbyB0aGVzZSB0d28gdGhpbmdzOgorCisgICAgYSkgQWNjb21wYW55IHRoZSBjb21iaW5lZCBsaWJyYXJ5IHdpdGggYSBjb3B5IG9mIHRoZSBzYW1lIHdvcmsKKyAgICBiYXNlZCBvbiB0aGUgTGlicmFyeSwgdW5jb21iaW5lZCB3aXRoIGFueSBvdGhlciBsaWJyYXJ5CisgICAgZmFjaWxpdGllcy4gIFRoaXMgbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgICAgU2VjdGlvbnMgYWJvdmUuCisKKyAgICBiKSBHaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCB0aGUgY29tYmluZWQgbGlicmFyeSBvZiB0aGUgZmFjdAorICAgIHRoYXQgcGFydCBvZiBpdCBpcyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBleHBsYWluaW5nCisgICAgd2hlcmUgdG8gZmluZCB0aGUgYWNjb21wYW55aW5nIHVuY29tYmluZWQgZm9ybSBvZiB0aGUgc2FtZSB3b3JrLgorCisgIDguIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvciBkaXN0cmlidXRlCit0aGUgTGlicmFyeSBleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueQorYXR0ZW1wdCBvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yCitkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIKK3JpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuICBIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywKK29yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIgdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMKK3Rlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KKworICA5LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKK3NpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCitkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKK21vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKK2FsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKK3RoZSBMaWJyYXJ5IG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIDEwLiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5KSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSwgbGluayB3aXRoIG9yIG1vZGlmeSB0aGUgTGlicmFyeQorc3ViamVjdCB0byB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgorcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgorWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgd2l0aAordGhpcyBMaWNlbnNlLgorDAorICAxMS4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5IGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIExpYnJhcnkuCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhbnkKK3BhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBhcHBseSwKK2FuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyIGNpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSB3aGljaCBpcworaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCitnZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCit0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAorc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwordG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90CitpbXBvc2UgdGhhdCBjaG9pY2UuCisKK1RoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bworYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMTIuIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgTGlicmFyeSBpcyByZXN0cmljdGVkIGluCitjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKK29yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgTGlicmFyeSB1bmRlciB0aGlzIExpY2Vuc2UgbWF5IGFkZAorYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZyB0aG9zZSBjb3VudHJpZXMsCitzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZyBjb3VudHJpZXMgbm90IHRodXMKK2V4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzIHRoZSBsaW1pdGF0aW9uIGFzIGlmCit3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KKworICAxMy4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcKK3ZlcnNpb25zIG9mIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4KK1N1Y2ggbmV3IHZlcnNpb25zIHdpbGwgYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwKK2J1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0byBhZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgTGlicmFyeQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kCisiYW55IGxhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kCitjb25kaXRpb25zIGVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIExpYnJhcnkgZG9lcyBub3Qgc3BlY2lmeSBhCitsaWNlbnNlIHZlcnNpb24gbnVtYmVyLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKwwKKyAgMTQuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBMaWJyYXJ5IGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGluY29tcGF0aWJsZSB3aXRoIHRoZXNlLAord3JpdGUgdG8gdGhlIGF1dGhvciB0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMKK2NvcHlyaWdodGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMgbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyCitkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzIG9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzCitvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kIG9mIHByb21vdGluZyB0aGUgc2hhcmluZworYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KKworCQkJICAgIE5PIFdBUlJBTlRZCisKKyAgMTUuIEJFQ0FVU0UgVEhFIExJQlJBUlkgSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PCitXQVJSQU5UWSBGT1IgVEhFIExJQlJBUlksIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLgorRVhDRVBUIFdIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IKK09USEVSIFBBUlRJRVMgUFJPVklERSBUSEUgTElCUkFSWSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZCitLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKK0lNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFCitMSUJSQVJZIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRSBMSUJSQVJZIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRQorVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDE2LiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOCitXUklUSU5HIFdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWQorQU5EL09SIFJFRElTVFJJQlVURSBUSEUgTElCUkFSWSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UKK0ZPUiBEQU1BR0VTLCBJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IKK0NPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFCitMSUJSQVJZIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HCitSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkgWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQQorRkFJTFVSRSBPRiBUSEUgTElCUkFSWSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFNPRlRXQVJFKSwgRVZFTiBJRgorU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorREFNQUdFUy4KKworCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworDAorICAgICAgICAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgTGlicmFyaWVzCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgbGlicmFyeSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHdlIHJlY29tbWVuZCBtYWtpbmcgaXQgZnJlZSBzb2Z0d2FyZSB0aGF0CitldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UuICBZb3UgY2FuIGRvIHNvIGJ5IHBlcm1pdHRpbmcKK3JlZGlzdHJpYnV0aW9uIHVuZGVyIHRoZXNlIHRlcm1zIChvciwgYWx0ZXJuYXRpdmVseSwgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSkuCisKKyAgVG8gYXBwbHkgdGhlc2UgdGVybXMsIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIGxpYnJhcnkuICBJdCBpcworc2FmZXN0IHRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0IHRoZQorImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBsaWJyYXJ5J3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KKworWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKK3NjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIGxpYnJhcnksIGlmCituZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6CisKKyAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUKKyAgbGlicmFyeSBgRnJvYicgKGEgbGlicmFyeSBmb3IgdHdlYWtpbmcga25vYnMpIHdyaXR0ZW4gYnkgSmFtZXMgUmFuZG9tIEhhY2tlci4KKworICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5OTAKKyAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKKworVGhhdCdzIGFsbCB0aGVyZSBpcyB0byBpdCEKKworCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9saWNlbnNlLnR4dCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2xpY2Vuc2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMDg0MWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9saWNlbnNlLnR4dApAQCAtMCwwICsxLDE5IEBACitTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlDQorQ29weXJpZ2h0IDIwMDQtMjAwNSBKZXRybyBMYXVoYQ0KK0FsbCByaWdodHMgcmVzZXJ2ZWQuDQorV2ViOiBodHRwOi8vaWtpLmZpL2pldHJvLw0KKw0KK1RoaXMgc291cmNlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcg0KK21vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgRUlUSEVSOg0KKyAgKDEpIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlDQorICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQNCisgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIFRoZSB0ZXh0IG9mIHRoZSBHTlUgTGVzc2VyDQorICAgICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluIHRoZQ0KKyAgICAgIGZpbGUgTElDRU5TRS1MR1BMLnR4dC4NCisgICgyKSBUaGUgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluDQorICAgICAgdGhlIGZpbGUgTElDRU5TRS1CU0QudHh0Lg0KKw0KK1RoaXMgc291cmNlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgZmlsZXMNCitMSUNFTlNFLUxHUEwudHh0IGFuZCBMSUNFTlNFLUJTRC50eHQgZm9yIG1vcmUgZGV0YWlscy4NCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9zaGFwZXMuaCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL3NoYXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZmZhZTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9zaGFwZXMuaApAQCAtMCwwICsxLDU5IEBACisvKiBTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA1IEpldHJvIExhdWhhCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogV2ViOiBodHRwOi8vaWtpLmZpL2pldHJvLworICoKKyAqIFRoaXMgc291cmNlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBFSVRIRVI6CisgKiAgICgxKSBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gVGhlIHRleHQgb2YgdGhlIEdOVSBMZXNzZXIKKyAqICAgICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbiB0aGUKKyAqICAgICAgIGZpbGUgTElDRU5TRS1MR1BMLnR4dC4KKyAqICAgKDIpIFRoZSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4KKyAqICAgICAgIHRoZSBmaWxlIExJQ0VOU0UtQlNELnR4dC4KKyAqCisgKiBUaGlzIHNvdXJjZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBmaWxlcworICogTElDRU5TRS1MR1BMLnR4dCBhbmQgTElDRU5TRS1CU0QudHh0IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogJElkOiBzaGFwZXMuaCx2IDEuNiAyMDA1LzAxLzMxIDIyOjE1OjMwIHRvbmljIEV4cCAkCisgKiAkUmV2aXNpb246IDEuNiAkCisgKi8KKworI2lmbmRlZiBTSEFQRVNfSF9JTkNMVURFRAorI2RlZmluZSBTSEFQRVNfSF9JTkNMVURFRAorCisKKyNkZWZpbmUgU1VQRVJTSEFQRV9QQVJBTVMgMTUKKworc3RhdGljIGNvbnN0IGZsb2F0IHNTdXBlclNoYXBlUGFyYW1zW11bU1VQRVJTSEFQRV9QQVJBTVNdID0KK3sKKyAgICAvLyBtICBhICAgICBiICAgICBuMSAgICAgIG4yICAgICBuMyAgICAgbSAgICAgYSAgICAgYiAgICAgbjEgICAgIG4yICAgICAgbjMgICByZXMxIHJlczIgc2NhbGUgIChvcmcucmVzMSxyZXMyKQorICAgIHsgMTAsIDEsICAgIDIsICAgIDkwLCAgICAgIDEsICAgLTQ1LCAgICA4LCAgICAxLCAgICAxLCAgICAtMSwgICAgIDEsICAtMC40ZiwgICAyMCwgIDMwLCAyIH0sIC8vIDQwLCA2MAorICAgIHsgMTAsIDEsICAgIDIsICAgIDkwLCAgICAgIDEsICAgLTQ1LCAgICA0LCAgICAxLCAgICAxLCAgICAxMCwgICAgIDEsICAtMC40ZiwgICAyMCwgIDIwLCA0IH0sIC8vIDQwLCA0MAorICAgIHsgMTAsIDEsICAgIDIsICAgIDYwLCAgICAgIDEsICAgLTEwLCAgICA0LCAgICAxLCAgICAxLCAgICAtMSwgICAgLTIsICAtMC40ZiwgICA0MSwgIDQxLCAxIH0sIC8vIDgyLCA4MgorICAgIHsgIDYsIDEsICAgIDEsICAgIDYwLCAgICAgIDEsICAgLTcwLCAgICA4LCAgICAxLCAgICAxLCAgMC40ZiwgICAgIDMsICAwLjI1ZiwgICAyMCwgIDIwLCAxIH0sIC8vIDQwLCA0MAorICAgIHsgIDQsIDEsICAgIDEsICAgIDMwLCAgICAgIDEsICAgIDIwLCAgIDEyLCAgICAxLCAgICAxLCAgMC40ZiwgICAgIDMsICAwLjI1ZiwgICAxMCwgIDMwLCAxIH0sIC8vIDIwLCA2MAorICAgIHsgIDgsIDEsICAgIDEsICAgIDMwLCAgICAgIDEsICAgIC00LCAgICA4LCAgICAyLCAgICAxLCAgICAtMSwgICAgIDUsICAgMC41ZiwgICAyNSwgIDI2LCAxIH0sIC8vIDYwLCA2MAorICAgIHsgMTMsIDEsICAgIDEsICAgIDMwLCAgICAgIDEsICAgIC00LCAgIDEzLCAgICAxLCAgICAxLCAgICAgMSwgICAgIDUsICAgICAgMSwgICAzMCwgIDMwLCA2IH0sIC8vIDYwLCA2MAorICAgIHsgMTAsIDEsIDEuMWYsIC0wLjVmLCAgIDAuMWYsICAgIDcwLCAgIDYwLCAgICAxLCAgICAxLCAgIC05MCwgICAgIDAsIC0wLjI1ZiwgICAyMCwgIDYwLCA4IH0sIC8vIDYwLCAxODAKKyAgICB7ICA3LCAxLCAgICAxLCAgICAyMCwgIC0wLjNmLCAtMy41ZiwgICAgNiwgICAgMSwgICAgMSwgICAgLTEsICA0LjVmLCAgIDAuNWYsICAgMTAsICAyMCwgNCB9LCAvLyA2MCwgODAKKyAgICB7ICA0LCAxLCAgICAxLCAgICAxMCwgICAgIDEwLCAgICAxMCwgICAgNCwgICAgMSwgICAgMSwgICAgMTAsICAgIDEwLCAgICAgMTAsICAgMTAsICAyMCwgMSB9LCAvLyAyMCwgNDAKKyAgICB7ICA0LCAxLCAgICAxLCAgICAgMSwgICAgICAxLCAgICAgMSwgICAgNCwgICAgMSwgICAgMSwgICAgIDEsICAgICAxLCAgICAgIDEsICAgMTAsICAxMCwgMiB9LCAvLyAxMCwgMTAKKyAgICB7ICAxLCAxLCAgICAxLCAgICAzOCwgLTAuMjVmLCAgICAxOSwgICAgNCwgICAgMSwgICAgMSwgICAgMTAsICAgIDEwLCAgICAgMTAsICAgMTAsICAxNSwgMiB9LCAvLyAyMCwgNDAKKyAgICB7ICAyLCAxLCAgICAxLCAgMC43ZiwgICAwLjNmLCAgMC4yZiwgICAgMywgICAgMSwgICAgMSwgICAxMDAsICAgMTAwLCAgICAxMDAsICAgMTAsICAyNSwgMiB9LCAvLyAyMCwgNTAKKyAgICB7ICA2LCAxLCAgICAxLCAgICAgMSwgICAgICAxLCAgICAgMSwgICAgMywgICAgMSwgICAgMSwgICAgIDEsICAgICAxLCAgICAgIDEsICAgMzAsICAzMCwgMiB9LCAvLyA2MCwgNjAKKyAgICB7ICAzLCAxLCAgICAxLCAgICAgMSwgICAgICAxLCAgICAgMSwgICAgNiwgICAgMSwgICAgMSwgICAgIDIsICAgICAxLCAgICAgIDEsICAgMTAsICAyMCwgMiB9LCAvLyAyMCwgNDAKKyAgICB7ICA2LCAxLCAgICAxLCAgICAgNiwgICA1LjVmLCAgIDEwMCwgICAgNiwgICAgMSwgICAgMSwgICAgMjUsICAgIDEwLCAgICAgMTAsICAgMzAsICAyMCwgMiB9LCAvLyA2MCwgNDAKKyAgICB7ICAzLCAxLCAgICAxLCAgMC41ZiwgICAxLjdmLCAgMS43ZiwgICAgMiwgICAgMSwgICAgMSwgICAgMTAsICAgIDEwLCAgICAgMTAsICAgMjAsICAyMCwgMiB9LCAvLyA0MCwgNDAKKyAgICB7ICA1LCAxLCAgICAxLCAgMC4xZiwgICAxLjdmLCAgMS43ZiwgICAgMSwgICAgMSwgICAgMSwgIDAuM2YsICAwLjVmLCAgIDAuNWYsICAgMjAsICAyMCwgNCB9LCAvLyA0MCwgNDAKKyAgICB7ICAyLCAxLCAgICAxLCAgICAgNiwgICA1LjVmLCAgIDEwMCwgICAgNiwgICAgMSwgICAgMSwgICAgIDQsICAgIDEwLCAgICAgMTAsICAgMTAsICAyMiwgMSB9LCAvLyA0MCwgNDAKKyAgICB7ICA2LCAxLCAgICAxLCAgICAtMSwgICAgIDcwLCAgMC4xZiwgICAgOSwgICAgMSwgMC41ZiwgICAtOTgsIDAuMDVmLCAgICAtNDUsICAgMjAsICAzMCwgNCB9LCAvLyA2MCwgOTEKKyAgICB7ICA2LCAxLCAgICAxLCAgICAtMSwgICAgIDkwLCAtMC4xZiwgICAgNywgICAgMSwgICAgMSwgICAgOTAsICAxLjNmLCAgICAgMzQsICAgMTMsICAxNiwgMSB9LCAvLyAzMiwgNjAKK307CisjZGVmaW5lIFNVUEVSU0hBUEVfQ09VTlQgKHNpemVvZihzU3VwZXJTaGFwZVBhcmFtcykgLyBzaXplb2Yoc1N1cGVyU2hhcGVQYXJhbXNbMF0pKQorCisKKyNlbmRpZiAvLyAhU0hBUEVTX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9maWx0ZXIvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy9maWx0ZXIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzQyNTNjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2ZpbHRlci9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTYgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKwlmaWx0ZXIuYworCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJjdXRpbHMgXAorICAgIGxpYkdMRVNfQ00gXAorICAgIGxpYnVpCisKK0xPQ0FMX01PRFVMRTo9IHRlc3Qtb3BlbmdsLWZpbHRlcgorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9maWx0ZXIvZmlsdGVyLmMgYi9vcGVuZ2wvdGVzdHMvZmlsdGVyL2ZpbHRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YmFjMDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZmlsdGVyL2ZpbHRlci5jCkBAIC0wLDAgKzEsMTI1IEBACisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPEdMRVMvZWdsLmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgICBpZiAoYXJnYyE9MiAmJiBhcmdjIT0zKSB7CisgICAgICAgIHByaW50ZigidXNhZ2U6ICVzIDwwLTY+IFtwYnVmZmVyXVxuIiwgYXJndlswXSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAKKyAgICBjb25zdCBpbnQgdGVzdCA9IGF0b2koYXJndlsxXSk7CisgICAgaW50IHVzZVBidWZmZXIgPSBhcmdjPT0zICYmICFzdHJjbXAoYXJndlsyXSwgInBidWZmZXIiKTsKKyAgICBFR0xpbnQgc19jb25maWdBdHRyaWJzW10gPSB7CisgICAgICAgICBFR0xfU1VSRkFDRV9UWVBFLCBFR0xfUEJVRkZFUl9CSVR8RUdMX1dJTkRPV19CSVQsCisgICAgICAgICBFR0xfUkVEX1NJWkUsICAgICAgIDUsCisgICAgICAgICBFR0xfR1JFRU5fU0laRSwgICAgIDYsCisgICAgICAgICBFR0xfQkxVRV9TSVpFLCAgICAgIDUsCisgICAgICAgICBFR0xfTk9ORQorICAgICB9OworICAgICAKKyAgICAgRUdMaW50IG51bUNvbmZpZ3MgPSAtMTsKKyAgICAgRUdMaW50IG1ham9yVmVyc2lvbjsKKyAgICAgRUdMaW50IG1pbm9yVmVyc2lvbjsKKyAgICAgRUdMQ29uZmlnIGNvbmZpZzsKKyAgICAgRUdMQ29udGV4dCBjb250ZXh0OworICAgICBFR0xTdXJmYWNlIHN1cmZhY2U7CisgICAgIEVHTGludCB3LCBoOworICAgICAKKyAgICAgRUdMRGlzcGxheSBkcHk7CisKKyAgICAgZHB5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKKyAgICAgZWdsSW5pdGlhbGl6ZShkcHksICZtYWpvclZlcnNpb24sICZtaW5vclZlcnNpb24pOworICAgICBlZ2xDaG9vc2VDb25maWcoZHB5LCBzX2NvbmZpZ0F0dHJpYnMsICZjb25maWcsIDEsICZudW1Db25maWdzKTsKKyAgICAgaWYgKCF1c2VQYnVmZmVyKSB7CisgICAgICAgICBzdXJmYWNlID0gZWdsQ3JlYXRlV2luZG93U3VyZmFjZShkcHksIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgYW5kcm9pZF9jcmVhdGVEaXNwbGF5U3VyZmFjZSgpLCBOVUxMKTsKKyAgICAgfSBlbHNlIHsKKyAgICAgICAgIHByaW50ZigidXNpbmcgcGJ1ZmZlclxuIik7CisgICAgICAgICBFR0xpbnQgYXR0cmlic1tdID0geyBFR0xfV0lEVEgsIDMyMCwgRUdMX0hFSUdIVCwgNDgwLCBFR0xfTk9ORSB9OworICAgICAgICAgc3VyZmFjZSA9IGVnbENyZWF0ZVBidWZmZXJTdXJmYWNlKGRweSwgY29uZmlnLCBhdHRyaWJzKTsKKyAgICAgfQorICAgICBjb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChkcHksIGNvbmZpZywgTlVMTCwgTlVMTCk7CisgICAgIGVnbE1ha2VDdXJyZW50KGRweSwgc3VyZmFjZSwgc3VyZmFjZSwgY29udGV4dCk7ICAgCisgICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9XSURUSCwgJncpOworICAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfSEVJR0hULCAmaCk7CisgICAgIEdMaW50IGRpbSA9IHc8aCA/IHcgOiBoOworCisgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisKKyAgICAgR0xpbnQgY3JvcFs0XSA9IHsgMCwgNCwgNCwgLTQgfTsKKyAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAwKTsKKyAgICAgZ2xUZXhQYXJhbWV0ZXJpdihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMsIGNyb3ApOworICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOworICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOworICAgICBnbFRleEVudngoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX1JFUExBQ0UpOworICAgICBnbEVuYWJsZShHTF9URVhUVVJFXzJEKTsKKyAgICAgZ2xDb2xvcjRmKDEsMSwxLDEpOworCisgICAgIC8vIHBhY2tpbmcgaXMgYWx3YXlzIDQKKyAgICAgdWludDhfdCB0OFtdICA9IHsgCisgICAgICAgICAgICAgMHgwMCwgMHg1NSwgMHgwMCwgMHg1NSwgCisgICAgICAgICAgICAgMHhBQSwgMHhGRiwgMHhBQSwgMHhGRiwKKyAgICAgICAgICAgICAweDAwLCAweDU1LCAweDAwLCAweDU1LCAKKyAgICAgICAgICAgICAweEFBLCAweEZGLCAweEFBLCAweEZGICB9OworCisgICAgIHVpbnQxNl90IHQxNltdICA9IHsgCisgICAgICAgICAgICAgMHgwMDAwLCAweDU1NTUsIDB4MDAwMCwgMHg1NTU1LCAKKyAgICAgICAgICAgICAweEFBQUEsIDB4RkZGRiwgMHhBQUFBLCAweEZGRkYsCisgICAgICAgICAgICAgMHgwMDAwLCAweDU1NTUsIDB4MDAwMCwgMHg1NTU1LCAKKyAgICAgICAgICAgICAweEFBQUEsIDB4RkZGRiwgMHhBQUFBLCAweEZGRkYgIH07CisKKyAgICAgdWludDE2X3QgdDU1NTFbXSAgPSB7IAorICAgICAgICAgICAgIDB4MDAwMCwgMHhGRkZGLCAweDAwMDAsIDB4RkZGRiwgCisgICAgICAgICAgICAgMHhGRkZGLCAweDAwMDAsIDB4RkZGRiwgMHgwMDAwLAorICAgICAgICAgICAgIDB4MDAwMCwgMHhGRkZGLCAweDAwMDAsIDB4RkZGRiwgCisgICAgICAgICAgICAgMHhGRkZGLCAweDAwMDAsIDB4RkZGRiwgMHgwMDAwICB9OworCisgICAgIHVpbnQzMl90IHQzMltdICA9IHsgCisgICAgICAgICAgICAgMHhGRjAwMDAwMCwgMHhGRjAwMDBGRiwgMHhGRjAwRkYwMCwgMHhGRkZGMDAwMCwgCisgICAgICAgICAgICAgMHhGRjAwRkYwMCwgMHhGRkZGMDAwMCwgMHhGRjAwMDAwMCwgMHhGRjAwMDBGRiwgCisgICAgICAgICAgICAgMHhGRjAwRkZGRiwgMHhGRjAwRkYwMCwgMHgwMEZGMDBGRiwgMHhGRkZGRkYwMCwgCisgICAgICAgICAgICAgMHhGRjAwMDAwMCwgMHhGRkZGMDBGRiwgMHhGRjAwRkZGRiwgMHhGRkZGRkZGRgorICAgICB9OworCisgICAgIHN3aXRjaCh0ZXN0KSAKKyAgICAgeworICAgICBjYXNlIDE6CisgICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfTFVNSU5BTkNFLAorICAgICAgICAgICAgICAgICA0LCA0LCAwLCBHTF9MVU1JTkFOQ0UsIEdMX1VOU0lHTkVEX0JZVEUsIHQ4KTsKKyAgICAgICAgIGJyZWFrOworICAgICBjYXNlIDI6CisgICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCLAorICAgICAgICAgICAgICAgICA0LCA0LCAwLCBHTF9SR0IsIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81LCB0MTYpOworICAgICAgICAgYnJlYWs7CisgICAgIGNhc2UgMzoKKyAgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLAorICAgICAgICAgICAgICAgICA0LCA0LCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80LCB0MTYpOworICAgICAgICAgYnJlYWs7CisgICAgIGNhc2UgNDoKKyAgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9MVU1JTkFOQ0VfQUxQSEEsCisgICAgICAgICAgICAgICAgIDQsIDQsIDAsIEdMX0xVTUlOQU5DRV9BTFBIQSwgR0xfVU5TSUdORURfQllURSwgdDE2KTsKKyAgICAgICAgIGJyZWFrOworICAgICBjYXNlIDU6CisgICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwKKyAgICAgICAgICAgICAgICAgNCwgNCwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMSwgdDU1NTEpOworICAgICAgICAgYnJlYWs7CisgICAgIGNhc2UgNjoKKyAgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLAorICAgICAgICAgICAgICAgICA0LCA0LCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCB0MzIpOworICAgICAgICAgYnJlYWs7CisgICAgIH0KKworICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIGRpbSwgZGltKTsKKworICAgICBpZiAoIXVzZVBidWZmZXIpIHsKKyAgICAgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7CisgICAgIH0gZWxzZSB7CisgICAgICAgICBnbEZpbmlzaCgpOworICAgICB9CisgICAgIAorICAgICBlZ2xUZXJtaW5hdGUoZHB5KTsKKyAgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZmluaXNoL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvZmluaXNoL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdiOTVlZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9maW5pc2gvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE2IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisJZmluaXNoLmMKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGliY3V0aWxzIFwKKyAgICBsaWJHTEVTX0NNIFwKKyAgICBsaWJ1aQorCitMT0NBTF9NT0RVTEU6PSB0ZXN0LW9wZW5nbC1maW5pc2gKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZmluaXNoL2ZpbmlzaC5jIGIvb3BlbmdsL3Rlc3RzL2ZpbmlzaC9maW5pc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWZlMjI3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2ZpbmlzaC9maW5pc2guYwpAQCAtMCwwICsxLDIyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorCisjaW5jbHVkZSA8R0xFUy9lZ2wuaD4KKworbG9uZyBsb25nIHN5c3RlbVRpbWUoKQoreworICAgIHN0cnVjdCB0aW1lc3BlYyB0OworICAgIHQudHZfc2VjID0gdC50dl9uc2VjID0gMDsKKyAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnQpOworICAgIHJldHVybiAobG9uZyBsb25nKSh0LnR2X3NlYykqMTAwMDAwMDAwMExMICsgdC50dl9uc2VjOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisgICAgRUdMaW50IHNfY29uZmlnQXR0cmlic1tdID0geworICAgICAgICAgRUdMX1JFRF9TSVpFLCAgICAgICA1LAorICAgICAgICAgRUdMX0dSRUVOX1NJWkUsICAgICA2LAorICAgICAgICAgRUdMX0JMVUVfU0laRSwgICAgICA1LAorICAgICAgICAgRUdMX05PTkUKKyAgICAgfTsKKyAgICAgCisgICAgIEVHTGludCBudW1Db25maWdzID0gLTE7CisgICAgIEVHTGludCBtYWpvclZlcnNpb247CisgICAgIEVHTGludCBtaW5vclZlcnNpb247CisgICAgIEVHTENvbmZpZyBjb25maWc7CisgICAgIEVHTENvbnRleHQgY29udGV4dDsKKyAgICAgRUdMU3VyZmFjZSBzdXJmYWNlOworICAgICBFR0xpbnQgdywgaDsKKyAgICAgCisgICAgIEVHTERpc3BsYXkgZHB5OworCisgICAgIGRweSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSk7CisgICAgIGVnbEluaXRpYWxpemUoZHB5LCAmbWFqb3JWZXJzaW9uLCAmbWlub3JWZXJzaW9uKTsKKyAgICAgZWdsQ2hvb3NlQ29uZmlnKGRweSwgc19jb25maWdBdHRyaWJzLCAmY29uZmlnLCAxLCAmbnVtQ29uZmlncyk7CisgICAgIHN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKGRweSwgY29uZmlnLCAKKyAgICAgICAgICAgICBhbmRyb2lkX2NyZWF0ZURpc3BsYXlTdXJmYWNlKCksIE5VTEwpOworICAgICBjb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChkcHksIGNvbmZpZywgTlVMTCwgTlVMTCk7CisgICAgIGVnbE1ha2VDdXJyZW50KGRweSwgc3VyZmFjZSwgc3VyZmFjZSwgY29udGV4dCk7ICAgCisgICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9XSURUSCwgJncpOworICAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfSEVJR0hULCAmaCk7CisgICAgIEdMaW50IGRpbSA9IHc8aCA/IHcgOiBoOworCisgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgMCk7CisgICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX05FQVJFU1QpOworICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9ORUFSRVNUKTsKKyAgICAgZ2xUZXhFbnZ4KEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9SRVBMQUNFKTsKKyAgICAgZ2xFbmFibGUoR0xfVEVYVFVSRV8yRCk7CisgICAgIGdsQ29sb3I0ZigxLDEsMSwxKTsKKyAgICAgZ2xEaXNhYmxlKEdMX0RJVEhFUik7CisgICAgIGdsU2hhZGVNb2RlbChHTF9GTEFUKTsKKworICAgICBsb25nIGxvbmcgbm93LCB0OworICAgICBpbnQgaTsKKworICAgICBjaGFyKiB0ZXhlbHMgPSBtYWxsb2MoNTEyKjUxMioyKTsKKyAgICAgbWVtc2V0KHRleGVscywweEZGLDUxMio1MTIqMik7CisgICAgIAorICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCLAorICAgICAgICAgICAgIDUxMiwgNTEyLCAwLCBHTF9SR0IsIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81LCB0ZXhlbHMpOworCisgICAgIGNoYXIqIGRzdCA9IG1hbGxvYygzMjAqNDgwKjIpOworICAgICBtZW1zZXQoZHN0LCAwLCAzMjAqNDgwKjIpOworICAgICBwcmludGYoIjMwNzIwMCBieXRlcyBtZW1jcHlcbiIpOworICAgICBmb3IgKGk9MCA7IGk8NCA7IGkrKykgeworICAgICAgICAgbm93ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgbWVtY3B5KGRzdCwgdGV4ZWxzLCAzMjAqNDgwKjIpOworICAgICAgICAgdCA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIHByaW50ZigibWVtY3B5KCkgdGltZSA9ICVsbHUgdXNcbiIsICh0LW5vdykvMTAwMCk7CisgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgfQorICAgICBmcmVlKGRzdCk7CisKKyAgICAgZnJlZSh0ZXhlbHMpOworCisgICAgIHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgMCwgLTIwKTsKKyAgICAgCisgICAgIHByaW50ZigiNTEyeDUxMiB1bm1vZGlmaWVkIHRleHR1cmUsIDUxMng1MTIgYmxpdDpcbiIpOworICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworICAgICBmb3IgKGk9MCA7IGk8NCA7IGkrKykgeworICAgICAgICAgR0xpbnQgY3JvcFs0XSA9IHsgMCwgNTEyLCA1MTIsIC01MTIgfTsKKyAgICAgICAgIGdsVGV4UGFyYW1ldGVyaXYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTLCBjcm9wKTsKKyAgICAgICAgIG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIGdsRHJhd1RleGlPRVMoMCwgMCwgMCwgNTEyLCA1MTIpOworICAgICAgICAgZ2xGaW5pc2goKTsKKyAgICAgICAgIHQgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBwcmludGYoImdsRmluaXNoKCkgdGltZSA9ICVsbHUgdXNcbiIsICh0LW5vdykvMTAwMCk7CisgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7CisgICAgIH0KKyAgICAgCisgICAgIHByaW50ZigiNTEyeDUxMiB1bm1vZGlmaWVkIHRleHR1cmUsIDF4MSBibGl0OlxuIik7CisgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgIGZvciAoaT0wIDsgaTw0IDsgaSsrKSB7CisgICAgICAgICBHTGludCBjcm9wWzRdID0geyAwLCAxLCAxLCAtMSB9OworICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpdihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMsIGNyb3ApOworICAgICAgICAgbm93ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgZ2xEcmF3VGV4aU9FUygwLCAwLCAwLCAxLCAxKTsKKyAgICAgICAgIGdsRmluaXNoKCk7CisgICAgICAgICB0ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgcHJpbnRmKCJnbEZpbmlzaCgpIHRpbWUgPSAlbGx1IHVzXG4iLCAodC1ub3cpLzEwMDApOworICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOworICAgICB9CisgICAgIAorICAgICBwcmludGYoIjUxMng1MTIgdW5tb2RpZmllZCB0ZXh0dXJlLCA1MTJ4NTEyIGJsaXQgKHgyKTpcbiIpOworICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworICAgICBmb3IgKGk9MCA7IGk8NCA7IGkrKykgeworICAgICAgICAgR0xpbnQgY3JvcFs0XSA9IHsgMCwgNTEyLCA1MTIsIC01MTIgfTsKKyAgICAgICAgIGdsVGV4UGFyYW1ldGVyaXYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTLCBjcm9wKTsKKyAgICAgICAgIG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIGdsRHJhd1RleGlPRVMoMCwgMCwgMCwgNTEyLCA1MTIpOworICAgICAgICAgZ2xEcmF3VGV4aU9FUygwLCAwLCAwLCA1MTIsIDUxMik7CisgICAgICAgICBnbEZpbmlzaCgpOworICAgICAgICAgdCA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIHByaW50ZigiZ2xGaW5pc2goKSB0aW1lID0gJWxsdSB1c1xuIiwgKHQtbm93KS8xMDAwKTsKKyAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKyAgICAgfQorCisgICAgIHByaW50ZigiNTEyeDUxMiB1bm1vZGlmaWVkIHRleHR1cmUsIDF4MSBibGl0ICh4Mik6XG4iKTsKKyAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgZm9yIChpPTAgOyBpPDQgOyBpKyspIHsKKyAgICAgICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDEsIDEsIC0xIH07CisgICAgICAgICBnbFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUywgY3JvcCk7CisgICAgICAgICBub3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIDEsIDEpOworICAgICAgICAgZ2xEcmF3VGV4aU9FUygwLCAwLCAwLCAxLCAxKTsKKyAgICAgICAgIGdsRmluaXNoKCk7CisgICAgICAgICB0ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgcHJpbnRmKCJnbEZpbmlzaCgpIHRpbWUgPSAlbGx1IHVzXG4iLCAodC1ub3cpLzEwMDApOworICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOworICAgICB9CisKKyAgICAgCisgICAgIHByaW50ZigiNTEyeDUxMiAoMXgxIHRleGVsIE1PRElGSUVEIHRleHR1cmUpLCA1MTJ4NTEyIGJsaXQ6XG4iKTsKKyAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgZm9yIChpPTAgOyBpPDQgOyBpKyspIHsKKyAgICAgICAgIHVpbnQxNl90IGdyZWVuID0gMHg3RTA7CisgICAgICAgICBHTGludCBjcm9wWzRdID0geyAwLCA1MTIsIDUxMiwgLTUxMiB9OworICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpdihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMsIGNyb3ApOworICAgICAgICAgZ2xUZXhTdWJJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIDAsIDAsIDEsIDEsIEdMX1JHQiwgR0xfVU5TSUdORURfU0hPUlRfNV82XzUsICZncmVlbik7CisgICAgICAgICBub3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIDUxMiwgNTEyKTsKKyAgICAgICAgIGdsRmluaXNoKCk7CisgICAgICAgICB0ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgcHJpbnRmKCJnbEZpbmlzaCgpIHRpbWUgPSAlbGx1IHVzXG4iLCAodC1ub3cpLzEwMDApOworICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOworICAgICB9CisKKworICAgICBpbnQxNl90IHRleGVsID0gMHhGODAwOworICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCLAorICAgICAgICAgICAgIDEsIDEsIDAsIEdMX1JHQiwgR0xfVU5TSUdORURfU0hPUlRfNV82XzUsICZ0ZXhlbCk7CisKKyAgICAgcHJpbnRmKCIxeDEgdW5tb2RpZmllZCB0ZXh0dXJlLCAxeDEgYmxpdDpcbiIpOworICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworICAgICBmb3IgKGk9MCA7IGk8NCA7IGkrKykgeworICAgICAgICAgR0xpbnQgY3JvcFs0XSA9IHsgMCwgMSwgMSwgLTEgfTsKKyAgICAgICAgIGdsVGV4UGFyYW1ldGVyaXYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTLCBjcm9wKTsKKyAgICAgICAgIG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIGdsRHJhd1RleGlPRVMoMCwgMCwgMCwgMSwgMSk7CisgICAgICAgICBnbEZpbmlzaCgpOworICAgICAgICAgdCA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIHByaW50ZigiZ2xGaW5pc2goKSB0aW1lID0gJWxsdSB1c1xuIiwgKHQtbm93KS8xMDAwKTsKKyAgICAgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7CisgICAgIH0KKworICAgICBwcmludGYoIjF4MSB1bm1vZGlmaWVkIHRleHR1cmUsIDUxMng1MTIgYmxpdDpcbiIpOworICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworICAgICBmb3IgKGk9MCA7IGk8NCA7IGkrKykgeworICAgICAgICAgR0xpbnQgY3JvcFs0XSA9IHsgMCwgMSwgMSwgLTEgfTsKKyAgICAgICAgIGdsVGV4UGFyYW1ldGVyaXYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTLCBjcm9wKTsKKyAgICAgICAgIG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIGdsRHJhd1RleGlPRVMoMCwgMCwgMCwgNTEyLCA1MTIpOworICAgICAgICAgZ2xGaW5pc2goKTsKKyAgICAgICAgIHQgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBwcmludGYoImdsRmluaXNoKCkgdGltZSA9ICVsbHUgdXNcbiIsICh0LW5vdykvMTAwMCk7CisgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7CisgICAgIH0KKworICAgICBwcmludGYoIjF4MSAoMXgxIHRleGVsIE1PRElGSUVEIHRleHR1cmUpLCA1MTJ4NTEyIGJsaXQ6XG4iKTsKKyAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgZm9yIChpPTAgOyBpPDQgOyBpKyspIHsKKyAgICAgICAgIHVpbnQxNl90IGdyZWVuID0gMHg3RTA7CisgICAgICAgICBHTGludCBjcm9wWzRdID0geyAwLCAxLCAxLCAtMSB9OworICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpdihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMsIGNyb3ApOworICAgICAgICAgZ2xUZXhTdWJJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIDAsIDAsIDEsIDEsIEdMX1JHQiwgR0xfVU5TSUdORURfU0hPUlRfNV82XzUsICZncmVlbik7CisgICAgICAgICBub3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIDEsIDEpOworICAgICAgICAgZ2xGaW5pc2goKTsKKyAgICAgICAgIHQgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBwcmludGYoImdsRmluaXNoKCkgdGltZSA9ICVsbHUgdXNcbiIsICh0LW5vdykvMTAwMCk7CisgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7CisgICAgIH0KKworICAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9zZnNpbS9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL3Nmc2ltL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGExYTAzYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9zZnNpbS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTUgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKwllZ2xfc3VyZmFjZS5jcHAgXAorCXNmc2ltLmMKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGliR0xFU19DTQorCitMT0NBTF9NT0RVTEU6PSB0ZXN0LW9wZW5nbC1zZnNpbQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9zZnNpbS9lZ2xfc3VyZmFjZS5jcHAgYi9vcGVuZ2wvdGVzdHMvc2ZzaW0vZWdsX3N1cmZhY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNzc3ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvc2ZzaW0vZWdsX3N1cmZhY2UuY3BwCkBAIC0wLDAgKzEsMzQ2IEBACisvKiAKKyAqKgorICoqIENvcHlyaWdodCAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqKgorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCh0aGUgIkxpY2Vuc2UiKTsgCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisgKioKKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorICoqCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nIHNvZnR3YXJlIAorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMgCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKworI2luY2x1ZGUgPEdMRVMvZWdsLmg+CisKKyNpbmNsdWRlICJlZ2xfc3VyZmFjZS5oIgorCisjZGVmaW5lIExPR0koeC4uLikgZG8geyBwcmludGYoIklORk86ICIgeCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIExPR1coeC4uLikgZG8geyBwcmludGYoIldBUk46ICIgeCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIExPR0UoeC4uLikgZG8geyBwcmludGYoIkVSUjogIiB4KTsgfSB3aGlsZSAoMCkKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitlZ2xfbmF0aXZlX3dpbmRvd190KiBhbmRyb2lkX2NyZWF0ZURpc3BsYXlTdXJmYWNlKCkKK3sKKyAgICBlZ2xfbmF0aXZlX3dpbmRvd190KiBzID0gbmV3IGFuZHJvaWQ6OkVHTERpc3BsYXlTdXJmYWNlKCk7CisgICAgcy0+bWVtb3J5X3R5cGUgPSBOQVRJVkVfTUVNT1JZX1RZUEVfR1BVOworICAgIHJldHVybiBzOworfQorCisjZGVmaW5lIExJS0VMWSggZXhwICkgICAgICAgKF9fYnVpbHRpbl9leHBlY3QoIChleHApICE9IDAsIHRydWUgICkpCisjZGVmaW5lIFVOTElLRUxZKCBleHAgKSAgICAgKF9fYnVpbHRpbl9leHBlY3QoIChleHApICE9IDAsIGZhbHNlICkpCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK25hbWVzcGFjZSBhbmRyb2lkIHsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRUdMRGlzcGxheVN1cmZhY2U6OkVHTERpc3BsYXlTdXJmYWNlKCkKKyAgICA6IEVHTE5hdGl2ZVN1cmZhY2U8RUdMRGlzcGxheVN1cmZhY2U+KCkKK3sKKyAgICBlZ2xfbmF0aXZlX3dpbmRvd190Ojp2ZXJzaW9uID0gc2l6ZW9mKGVnbF9uYXRpdmVfd2luZG93X3QpOworICAgIGVnbF9uYXRpdmVfd2luZG93X3Q6OmlkZW50ID0gMDsKKyAgICBlZ2xfbmF0aXZlX3dpbmRvd190OjppbmNSZWYgPSAmRUdMRGlzcGxheVN1cmZhY2U6Omhvb2tfaW5jUmVmOworICAgIGVnbF9uYXRpdmVfd2luZG93X3Q6OmRlY1JlZiA9ICZFR0xEaXNwbGF5U3VyZmFjZTo6aG9va19kZWNSZWY7CisgICAgZWdsX25hdGl2ZV93aW5kb3dfdDo6c3dhcEJ1ZmZlcnMgPSAmRUdMRGlzcGxheVN1cmZhY2U6Omhvb2tfc3dhcEJ1ZmZlcnM7CisgICAgZWdsX25hdGl2ZV93aW5kb3dfdDo6c2V0U3dhcFJlY3RhbmdsZSA9ICZFR0xEaXNwbGF5U3VyZmFjZTo6aG9va19zZXRTd2FwUmVjdGFuZ2xlOworICAgIGVnbF9uYXRpdmVfd2luZG93X3Q6Om5leHRCdWZmZXIgPSAmRUdMRGlzcGxheVN1cmZhY2U6Omhvb2tfbmV4dEJ1ZmZlcjsKKyAgICBlZ2xfbmF0aXZlX3dpbmRvd190Ojpjb25uZWN0ID0gMDsKKyAgICBlZ2xfbmF0aXZlX3dpbmRvd190OjpkaXNjb25uZWN0ID0gMDsKKworICAgIG1GYlswXS5kYXRhID0gMDsKKyAgICBtRmJbMV0uZGF0YSA9IDA7CisgICAgZWdsX25hdGl2ZV93aW5kb3dfdDo6ZmQgPSBtYXBGcmFtZUJ1ZmZlcigpOworICAgIGlmIChlZ2xfbmF0aXZlX3dpbmRvd190OjpmZCA+PSAwKSB7CisgICAgICAgIGNvbnN0IGZsb2F0IGluMm1tID0gMjUuNGY7CisgICAgICAgIGZsb2F0IHJlZnJlc2hSYXRlID0gMTAwMDAwMDAwMDAwMDAwMExMVSAvICgKKyAgICAgICAgICAgICAgICBmbG9hdCggbUluZm8udXBwZXJfbWFyZ2luICsgbUluZm8ubG93ZXJfbWFyZ2luICsgbUluZm8ueXJlcyApIAorICAgICAgICAgICAgICAgICogKCBtSW5mby5sZWZ0X21hcmdpbiAgKyBtSW5mby5yaWdodF9tYXJnaW4gKyBtSW5mby54cmVzICkKKyAgICAgICAgICAgICAgICAqIG1JbmZvLnBpeGNsb2NrKTsKKworICAgICAgICBjb25zdCBHR0xTdXJmYWNlJiBidWZmZXIgPSBtRmJbMSAtIG1JbmRleF07CisgICAgICAgIGVnbF9uYXRpdmVfd2luZG93X3Q6OndpZHRoICA9IGJ1ZmZlci53aWR0aDsKKyAgICAgICAgZWdsX25hdGl2ZV93aW5kb3dfdDo6aGVpZ2h0ID0gYnVmZmVyLmhlaWdodDsKKyAgICAgICAgZWdsX25hdGl2ZV93aW5kb3dfdDo6c3RyaWRlID0gYnVmZmVyLnN0cmlkZTsKKyAgICAgICAgZWdsX25hdGl2ZV93aW5kb3dfdDo6Zm9ybWF0ID0gYnVmZmVyLmZvcm1hdDsKKyAgICAgICAgZWdsX25hdGl2ZV93aW5kb3dfdDo6YmFzZSAgID0gaW50cHRyX3QobUZiWzBdLmRhdGEpOworICAgICAgICBlZ2xfbmF0aXZlX3dpbmRvd190OjpvZmZzZXQgPQorICAgICAgICAgICAgaW50cHRyX3QoYnVmZmVyLmRhdGEpIC0gZWdsX25hdGl2ZV93aW5kb3dfdDo6YmFzZTsKKyAgICAgICAgZWdsX25hdGl2ZV93aW5kb3dfdDo6ZmxhZ3MgID0gMDsKKyAgICAgICAgZWdsX25hdGl2ZV93aW5kb3dfdDo6eGRwaSA9IChtSW5mby54cmVzICogaW4ybW0pIC8gbUluZm8ud2lkdGg7CisgICAgICAgIGVnbF9uYXRpdmVfd2luZG93X3Q6OnlkcGkgPSAobUluZm8ueXJlcyAqIGluMm1tKSAvIG1JbmZvLmhlaWdodDsKKyAgICAgICAgZWdsX25hdGl2ZV93aW5kb3dfdDo6ZnBzICA9IHJlZnJlc2hSYXRlOworICAgICAgICBlZ2xfbmF0aXZlX3dpbmRvd190OjptZW1vcnlfdHlwZSA9IE5BVElWRV9NRU1PUllfVFlQRV9GQjsKKyAgICAgICAgLy8gbm8gZXJyb3IsIHNldCB0aGUgbWFnaWMgd29yZAorICAgICAgICBlZ2xfbmF0aXZlX3dpbmRvd190OjptYWdpYyA9IDB4NjAwOTEzOworICAgIH0KKyAgICBtU3dhcENvdW50ID0gLTE7CisgICAgbVBhZ2VGbGlwQ291bnQgPSAwOworfQorCitFR0xEaXNwbGF5U3VyZmFjZTo6fkVHTERpc3BsYXlTdXJmYWNlKCkKK3sKKyAgICBtYWdpYyA9IDA7CisgICAgY2xvc2UoZWdsX25hdGl2ZV93aW5kb3dfdDo6ZmQpOworICAgIG11bm1hcChtRmJbMF0uZGF0YSwgbVNpemUpOworICAgIGlmICghKG1GbGFncyAmIFBBR0VfRkxJUCkpCisgICAgICAgIGZyZWUoKHZvaWQqKW1GYlsxXS5kYXRhKTsKK30KKwordm9pZCBFR0xEaXNwbGF5U3VyZmFjZTo6aG9va19pbmNSZWYoTmF0aXZlV2luZG93VHlwZSB3aW5kb3cpIHsKKyAgICBFR0xEaXNwbGF5U3VyZmFjZSogdGhhdCA9IHN0YXRpY19jYXN0PEVHTERpc3BsYXlTdXJmYWNlKj4od2luZG93KTsKKyAgICB0aGF0LT5pbmNTdHJvbmcodGhhdCk7Cit9Cit2b2lkIEVHTERpc3BsYXlTdXJmYWNlOjpob29rX2RlY1JlZihOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdykgeworICAgIEVHTERpc3BsYXlTdXJmYWNlKiB0aGF0ID0gc3RhdGljX2Nhc3Q8RUdMRGlzcGxheVN1cmZhY2UqPih3aW5kb3cpOworICAgIHRoYXQtPmRlY1N0cm9uZyh0aGF0KTsKK30KK3VpbnQzMl90IEVHTERpc3BsYXlTdXJmYWNlOjpob29rX3N3YXBCdWZmZXJzKE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93KSB7CisgICAgRUdMRGlzcGxheVN1cmZhY2UqIHRoYXQgPSBzdGF0aWNfY2FzdDxFR0xEaXNwbGF5U3VyZmFjZSo+KHdpbmRvdyk7CisgICAgcmV0dXJuIHRoYXQtPnN3YXBCdWZmZXJzKCk7Cit9Cit1aW50MzJfdCBFR0xEaXNwbGF5U3VyZmFjZTo6aG9va19uZXh0QnVmZmVyKE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93KSB7CisgICAgRUdMRGlzcGxheVN1cmZhY2UqIHRoYXQgPSBzdGF0aWNfY2FzdDxFR0xEaXNwbGF5U3VyZmFjZSo+KHdpbmRvdyk7CisgICAgcmV0dXJuIHRoYXQtPm5leHRCdWZmZXIoKTsKK30KK3ZvaWQgRUdMRGlzcGxheVN1cmZhY2U6Omhvb2tfc2V0U3dhcFJlY3RhbmdsZShOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdywKKyAgICAgICAgaW50IGwsIGludCB0LCBpbnQgdywgaW50IGgpIHsKKyAgICBFR0xEaXNwbGF5U3VyZmFjZSogdGhhdCA9IHN0YXRpY19jYXN0PEVHTERpc3BsYXlTdXJmYWNlKj4od2luZG93KTsKKyAgICB0aGF0LT5zZXRTd2FwUmVjdGFuZ2xlKGwsIHQsIHcsIGgpOworfQorCit2b2lkIEVHTERpc3BsYXlTdXJmYWNlOjpzZXRTd2FwUmVjdGFuZ2xlKGludCBsLCBpbnQgdCwgaW50IHcsIGludCBoKQoreworICAgIG1JbmZvLnJlc2VydmVkWzBdID0gMHg1NDQ0NTA1NTsgLy8gIlVQRFQiOworICAgIG1JbmZvLnJlc2VydmVkWzFdID0gKHVpbnQxNl90KWwgfCAoKHVpbnQzMl90KXQgPDwgMTYpOworICAgIG1JbmZvLnJlc2VydmVkWzJdID0gKHVpbnQxNl90KShsK3cpIHwgKCh1aW50MzJfdCkodCtoKSA8PCAxNik7Cit9CisKK3VpbnQzMl90IEVHTERpc3BsYXlTdXJmYWNlOjpzd2FwQnVmZmVycygpCit7CisgICAgaWYgKCEobUZsYWdzICYgUEFHRV9GTElQKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyBkbyB0aGUgYWN0dWFsIGZsaXAKKyAgICBtSW5kZXggPSAxIC0gbUluZGV4OworICAgIG1JbmZvLmFjdGl2YXRlID0gRkJfQUNUSVZBVEVfVkJMOworICAgIG1JbmZvLnlvZmZzZXQgPSBtSW5kZXggPyBtSW5mby55cmVzIDogMDsKKyAgICBpZiAoaW9jdGwoZWdsX25hdGl2ZV93aW5kb3dfdDo6ZmQsIEZCSU9QVVRfVlNDUkVFTklORk8sICZtSW5mbykgPT0gLTEpIHsKKyAgICAgICAgTE9HRSgiRkJJT1BVVF9WU0NSRUVOSU5GTyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoKKyAgICAgKiB0aGlzIGlzIGEgbW9uc3RydW91cyBoYWNrOiBCZWNhdXNlIHRoZSBoL3cgYWNjZWxlcmF0b3IgaXMgbm90IGFibGUKKyAgICAgKiB0byByZW5kZXIgZGlyZWN0bHkgaW50byB0aGUgZnJhbWVidWZmZXIsIHdlIG5lZWQgdG8gY29weSBpdHMKKyAgICAgKiBpbnRlcm5hbCBmcmFtZWJ1ZmZlciBvdXQgdG8gdGhlIGZiLiB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBpbnRlcm5hbCBmYgorICAgICAqIGlzIGdpdmVuIGluIG9lbVswXS4gCisgICAgICogQWxsIHRoaXMgaXMgbmVlZGVkIG9ubHkgaW4gc3RhbmRhbG9uZSBtb2RlLCBpbiBTdXJmYWNlRmxpbmdlciBtb2RlCisgICAgICogd2UgY29udHJvbCB3aGVyZSB0aGUgR1BVIHJlbmRlcnMuCisgICAgICovCisgICAgaWYgKGVnbF9uYXRpdmVfd2luZG93X3Q6Om1lbW9yeV90eXBlID09IE5BVElWRV9NRU1PUllfVFlQRV9HUFUgJiYgb2VtWzBdKSB7CisgICAgICAgIC8vIGNvdWxkIHVzZSBNRFAgaGVyZSwgYnV0IHRoYXQncyB0cmlja3kgYmVjYXVzZSB3ZSBuZWVkCisgICAgICAgIC8vIC9kZXYvcG1lbV9ncHUqIGZpbGVkZXNjcmlwdG9yCisgICAgICAgIGNvbnN0IEdHTFN1cmZhY2UmIGJ1ZmZlciA9IG1GYlttSW5kZXhdOworICAgICAgICBtZW1jcHkoIGJ1ZmZlci5kYXRhLAorICAgICAgICAgICAgICAgICh2b2lkKikob2VtWzBdICsgZWdsX25hdGl2ZV93aW5kb3dfdDo6b2Zmc2V0KSwKKyAgICAgICAgICAgICAgICBidWZmZXIuc3RyaWRlKmJ1ZmZlci5oZWlnaHQqMik7CisgICAgfQorCisgICAgLy8gdXBkYXRlIHRoZSBhZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gZHJhdyB0byBuZXh0CisgICAgY29uc3QgR0dMU3VyZmFjZSYgYnVmZmVyID0gbUZiWzEgLSBtSW5kZXhdOworICAgIGVnbF9uYXRpdmVfd2luZG93X3Q6Om9mZnNldCA9CisgICAgICAgIGludHB0cl90KGJ1ZmZlci5kYXRhKSAtIGVnbF9uYXRpdmVfd2luZG93X3Q6OmJhc2U7CisKKyAgICBtUGFnZUZsaXBDb3VudCsrOworCisgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBzY3JlZW4tc2l6ZSBjaGFuZ2VzIGZvciBub3cKKyAgICByZXR1cm4gMDsKK30KKworaW50MzJfdCBFR0xEaXNwbGF5U3VyZmFjZTo6Z2V0UGFnZUZsaXBDb3VudCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1QYWdlRmxpcENvdW50OworfQorCit1aW50MzJfdCBFR0xEaXNwbGF5U3VyZmFjZTo6bmV4dEJ1ZmZlcigpCit7CisgICAgLy8gdXBkYXRlIHRoZSBhZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gZHJhdyB0byBuZXh0CisgICAgY29uc3QgR0dMU3VyZmFjZSYgYnVmZmVyID0gbUZiW21JbmRleF07CisgICAgZWdsX25hdGl2ZV93aW5kb3dfdDo6b2Zmc2V0ID0KKyAgICAgICAgaW50cHRyX3QoYnVmZmVyLmRhdGEpIC0gZWdsX25hdGl2ZV93aW5kb3dfdDo6YmFzZTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IEVHTERpc3BsYXlTdXJmYWNlOjptYXBGcmFtZUJ1ZmZlcigpCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGRldmljZV90ZW1wbGF0ZVtdID0geworICAgICAgICAgICAgIi9kZXYvZ3JhcGhpY3MvZmIldSIsCisgICAgICAgICAgICAiL2Rldi9mYiV1IiwKKyAgICAgICAgICAgIDAgfTsKKyAgICBpbnQgZmQgPSAtMTsKKyAgICBpbnQgaT0wOworICAgIGNoYXIgbmFtZVs2NF07CisgICAgd2hpbGUgKChmZD09LTEpICYmIGRldmljZV90ZW1wbGF0ZVtpXSkgeworICAgICAgICBzbnByaW50ZihuYW1lLCA2NCwgZGV2aWNlX3RlbXBsYXRlW2ldLCAwKTsKKyAgICAgICAgZmQgPSBvcGVuKG5hbWUsIE9fUkRXUiwgMCk7CisgICAgICAgIGkrKzsKKyAgICB9CisgICAgaWYgKGZkIDwgMCkKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKworICAgIHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyBmaW5mbzsKKyAgICBpZiAoaW9jdGwoZmQsIEZCSU9HRVRfRlNDUkVFTklORk8sICZmaW5mbykgPT0gLTEpCisgICAgICAgIHJldHVybiAtZXJybm87CisKKyAgICBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gaW5mbzsKKyAgICBpZiAoaW9jdGwoZmQsIEZCSU9HRVRfVlNDUkVFTklORk8sICZpbmZvKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKworICAgIGluZm8ucmVzZXJ2ZWRbMF0gPSAwOworICAgIGluZm8ucmVzZXJ2ZWRbMV0gPSAwOworICAgIGluZm8ucmVzZXJ2ZWRbMl0gPSAwOworICAgIGluZm8ueG9mZnNldCA9IDA7CisgICAgaW5mby55b2Zmc2V0ID0gMDsKKyAgICBpbmZvLnlyZXNfdmlydHVhbCA9IGluZm8ueXJlcyAqIDI7CisgICAgaW5mby5iaXRzX3Blcl9waXhlbCA9IDE2OworICAgIGluZm8uYWN0aXZhdGUgPSBGQl9BQ1RJVkFURV9OT1c7CisKKyAgICB1aW50MzJfdCBmbGFncyA9IFBBR0VfRkxJUDsKKyAgICBpZiAoaW9jdGwoZmQsIEZCSU9QVVRfVlNDUkVFTklORk8sICZpbmZvKSA9PSAtMSkgeworICAgICAgICBpbmZvLnlyZXNfdmlydHVhbCA9IGluZm8ueXJlczsKKyAgICAgICAgZmxhZ3MgJj0gflBBR0VfRkxJUDsKKyAgICAgICAgTE9HVygiRkJJT1BVVF9WU0NSRUVOSU5GTyBmYWlsZWQsIHBhZ2UgZmxpcHBpbmcgbm90IHN1cHBvcnRlZCIpOworICAgIH0KKworICAgIGlmIChpbmZvLnlyZXNfdmlydHVhbCA8IGluZm8ueXJlcyAqIDIpIHsKKyAgICAgICAgaW5mby55cmVzX3ZpcnR1YWwgPSBpbmZvLnlyZXM7CisgICAgICAgIGZsYWdzICY9IH5QQUdFX0ZMSVA7CisgICAgICAgIExPR1coInBhZ2UgZmxpcHBpbmcgbm90IHN1cHBvcnRlZCAoeXJlc192aXJ0dWFsPSVkLCByZXF1ZXN0ZWQ9JWQpIiwKKyAgICAgICAgICAgICAgICBpbmZvLnlyZXNfdmlydHVhbCwgaW5mby55cmVzKjIpOworICAgIH0KKworICAgIGlmIChpb2N0bChmZCwgRkJJT0dFVF9WU0NSRUVOSU5GTywgJmluZm8pID09IC0xKQorICAgICAgICByZXR1cm4gLWVycm5vOyAgICAKKworICAgIGludCByZWZyZXNoUmF0ZSA9IDEwMDAwMDAwMDAwMDAwMDBMTFUgLyAKKyAgICAoCisgICAgICAgICAgICB1aW50NjRfdCggaW5mby51cHBlcl9tYXJnaW4gKyBpbmZvLmxvd2VyX21hcmdpbiArIGluZm8ueXJlcyApIAorICAgICAgICAgICAgKiAoIGluZm8ubGVmdF9tYXJnaW4gICsgaW5mby5yaWdodF9tYXJnaW4gKyBpbmZvLnhyZXMgKQorICAgICAgICAgICAgKiBpbmZvLnBpeGNsb2NrCisgICAgKTsKKworICAgIGlmIChyZWZyZXNoUmF0ZSA9PSAwKSB7CisgICAgICAgIC8vIGJsZWFnaCwgYmFkIGluZm8gZnJvbSB0aGUgZHJpdmVyCisgICAgICAgIHJlZnJlc2hSYXRlID0gNjAqMTAwMDsgIC8vIDYwIEh6CisgICAgfQorCisgICAgaWYgKGludChpbmZvLndpZHRoKSA8PSAwIHx8IGludChpbmZvLmhlaWdodCkgPD0gMCkgeworICAgICAgICAvLyBzdHVwaWQgZHJpdmVyLCBkb2Vzbid0IHJldHVybiB0aGF0IGluZm9ybWF0aW9uCisgICAgICAgIC8vIGRlZmF1bHQgdG8gU29vbmVyJ3Mgc2NyZWVuIHNpemUgKDE2MCBkcGkpCisgICAgICAgIGluZm8ud2lkdGggID0gNTE7CisgICAgICAgIGluZm8uaGVpZ2h0ID0gMzg7CisgICAgfQorCisgICAgZmxvYXQgeGRwaSA9IChpbmZvLnhyZXMgKiAyNS40ZikgLyBpbmZvLndpZHRoOyAKKyAgICBmbG9hdCB5ZHBpID0gKGluZm8ueXJlcyAqIDI1LjRmKSAvIGluZm8uaGVpZ2h0OworICAgIGZsb2F0IGZwcyAgPSByZWZyZXNoUmF0ZSAvIDEwMDAuMGY7IAorCisgICAgTE9HSSggICAidXNpbmcgKGZkPSVkKVxuIgorICAgICAgICAgICAgImlkICAgICAgICAgICA9ICVzXG4iCisgICAgICAgICAgICAieHJlcyAgICAgICAgID0gJWQgcHhcbiIKKyAgICAgICAgICAgICJ5cmVzICAgICAgICAgPSAlZCBweFxuIgorICAgICAgICAgICAgInhyZXNfdmlydHVhbCA9ICVkIHB4XG4iCisgICAgICAgICAgICAieXJlc192aXJ0dWFsID0gJWQgcHhcbiIKKyAgICAgICAgICAgICJicHAgICAgICAgICAgPSAlZFxuIgorICAgICAgICAgICAgInIgICAgICAgICAgICA9ICUydToldVxuIgorICAgICAgICAgICAgImcgICAgICAgICAgICA9ICUydToldVxuIgorICAgICAgICAgICAgImIgICAgICAgICAgICA9ICUydToldVxuIiwKKyAgICAgICAgICAgIGZkLAorICAgICAgICAgICAgZmluZm8uaWQsCisgICAgICAgICAgICBpbmZvLnhyZXMsCisgICAgICAgICAgICBpbmZvLnlyZXMsCisgICAgICAgICAgICBpbmZvLnhyZXNfdmlydHVhbCwKKyAgICAgICAgICAgIGluZm8ueXJlc192aXJ0dWFsLAorICAgICAgICAgICAgaW5mby5iaXRzX3Blcl9waXhlbCwKKyAgICAgICAgICAgIGluZm8ucmVkLm9mZnNldCwgaW5mby5yZWQubGVuZ3RoLAorICAgICAgICAgICAgaW5mby5ncmVlbi5vZmZzZXQsIGluZm8uZ3JlZW4ubGVuZ3RoLAorICAgICAgICAgICAgaW5mby5ibHVlLm9mZnNldCwgaW5mby5ibHVlLmxlbmd0aAorICAgICk7CisKKyAgICBMT0dJKCAgICJ3aWR0aCAgICAgICAgPSAlZCBtbSAoJWYgZHBpKVxuIgorICAgICAgICAgICAgImhlaWdodCAgICAgICA9ICVkIG1tICglZiBkcGkpXG4iCisgICAgICAgICAgICAicmVmcmVzaCByYXRlID0gJS4yZiBIelxuIiwKKyAgICAgICAgICAgIGluZm8ud2lkdGgsICB4ZHBpLAorICAgICAgICAgICAgaW5mby5oZWlnaHQsIHlkcGksCisgICAgICAgICAgICBmcHMKKyAgICApOworCisgICAgCisgICAgaWYgKGlvY3RsKGZkLCBGQklPR0VUX0ZTQ1JFRU5JTkZPLCAmZmluZm8pID09IC0xKQorICAgICAgICByZXR1cm4gLWVycm5vOworCisgICAgaWYgKGZpbmZvLnNtZW1fbGVuIDw9IDApCisgICAgICAgIHJldHVybiAtZXJybm87CisKKyAgICAvKgorICAgICAqIE9wZW4gYW5kIG1hcCB0aGUgZGlzcGxheS4KKyAgICAgKi8KKworICAgIHZvaWQqIGJ1ZmZlciAgPSAodWludDE2X3QqKSBtbWFwKAorICAgICAgICAgICAgMCwgZmluZm8uc21lbV9sZW4sCisgICAgICAgICAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorICAgICAgICAgICAgTUFQX1NIQVJFRCwKKyAgICAgICAgICAgIGZkLCAwKTsKKworICAgIGlmIChidWZmZXIgPT0gTUFQX0ZBSUxFRCkKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKworICAgIC8vIGF0IGxlYXN0IGZvciBub3csIGFsd2F5cyBjbGVhciB0aGUgZmIKKyAgICBtZW1zZXQoYnVmZmVyLCAwLCBmaW5mby5zbWVtX2xlbik7CisKKyAgICB1aW50OF90KiBvZmZzY3JlZW5bMl07CisgICAgb2Zmc2NyZWVuWzBdID0gKHVpbnQ4X3QqKWJ1ZmZlcjsKKyAgICBpZiAoZmxhZ3MgJiBQQUdFX0ZMSVApIHsKKyAgICAgICAgb2Zmc2NyZWVuWzFdID0gKHVpbnQ4X3QqKWJ1ZmZlciArIGZpbmZvLmxpbmVfbGVuZ3RoKmluZm8ueXJlczsKKyAgICB9IGVsc2UgeworICAgICAgICBvZmZzY3JlZW5bMV0gPSAodWludDhfdCopbWFsbG9jKGZpbmZvLnNtZW1fbGVuKTsKKyAgICAgICAgaWYgKG9mZnNjcmVlblsxXSA9PSAwKSB7CisgICAgICAgICAgICBtdW5tYXAoYnVmZmVyLCBmaW5mby5zbWVtX2xlbik7CisgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1GbGFncyA9IGZsYWdzOworICAgIG1JbmZvID0gaW5mbzsKKyAgICBtRmluZm8gPSBmaW5mbzsKKyAgICBtU2l6ZSA9IGZpbmZvLnNtZW1fbGVuOworICAgIG1JbmRleCA9IDA7CisgICAgZm9yIChpbnQgaT0wIDsgaTwyIDsgaSsrKSB7CisgICAgICAgIG1GYltpXS52ZXJzaW9uID0gc2l6ZW9mKEdHTFN1cmZhY2UpOworICAgICAgICBtRmJbaV0ud2lkdGggICA9IGluZm8ueHJlczsKKyAgICAgICAgbUZiW2ldLmhlaWdodCAgPSBpbmZvLnlyZXM7CisgICAgICAgIG1GYltpXS5zdHJpZGUgID0gZmluZm8ubGluZV9sZW5ndGggLyAoaW5mby5iaXRzX3Blcl9waXhlbCA+PiAzKTsKKyAgICAgICAgbUZiW2ldLmRhdGEgICAgPSAodWludDhfdCopKG9mZnNjcmVlbltpXSk7CisgICAgICAgIG1GYltpXS5mb3JtYXQgID0gTkFUSVZFX1BJWEVMX0ZPUk1BVF9SR0JfNTY1OworICAgIH0KKyAgICByZXR1cm4gZmQ7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvc2ZzaW0vZWdsX3N1cmZhY2UuaCBiL29wZW5nbC90ZXN0cy9zZnNpbS9lZ2xfc3VyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYTk0ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvc2ZzaW0vZWdsX3N1cmZhY2UuaApAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TSU1fRUdMX1NVUkZBQ0VfSAorI2RlZmluZSBBTkRST0lEX1NJTV9FR0xfU1VSRkFDRV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8R0xFUy9lZ2xuYXRpdmVzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgc3NpemVfdCAgICB2ZXJzaW9uOyAgICAvLyBhbHdheXMgc2V0IHRvIHNpemVvZihHR0xTdXJmYWNlKQorICAgIHVpbnQzMl90ICAgd2lkdGg7ICAgICAgLy8gd2lkdGggaW4gcGl4ZWxzCisgICAgdWludDMyX3QgICBoZWlnaHQ7ICAgICAvLyBoZWlnaHQgaW4gcGl4ZWxzCisgICAgaW50MzJfdCAgICBzdHJpZGU7ICAgICAvLyBzdHJpZGUgaW4gcGl4ZWxzCisgICAgdWludDhfdCogICBkYXRhOyAgICAgICAvLyBwb2ludGVyIHRvIHRoZSBiaXRzCisgICAgdWludDhfdCAgICBmb3JtYXQ7ICAgICAvLyBwaXhlbCBmb3JtYXQKKyAgICB1aW50OF90ICAgIHJmdVszXTsgICAgIC8vIG11c3QgYmUgemVybworICAgIHZvaWQqICAgICAgcmVzZXJ2ZWQ7Cit9IEdHTFN1cmZhY2U7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbmFtZXNwYWNlIGFuZHJvaWQgeworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RlbXBsYXRlIDxjbGFzcyBUWVBFPgorY2xhc3MgRUdMTmF0aXZlU3VyZmFjZSA6IHB1YmxpYyBlZ2xfbmF0aXZlX3dpbmRvd190Cit7CitwdWJsaWM6CisgICAgRUdMTmF0aXZlU3VyZmFjZSgpIDogbUNvdW50KDApIHsgCisgICAgICAgIG1lbXNldChlZ2xfbmF0aXZlX3dpbmRvd190OjpyZXNlcnZlZCwgMCwgCisgICAgICAgICAgICAgICAgc2l6ZW9mKGVnbF9uYXRpdmVfd2luZG93X3Q6OnJlc2VydmVkKSk7CisgICAgICAgIG1lbXNldChlZ2xfbmF0aXZlX3dpbmRvd190OjpyZXNlcnZlZF9wcm9jLCAwLCAKKyAgICAgICAgICAgICAgICBzaXplb2YoZWdsX25hdGl2ZV93aW5kb3dfdDo6cmVzZXJ2ZWRfcHJvYykpOworICAgICAgICBtZW1zZXQoZWdsX25hdGl2ZV93aW5kb3dfdDo6b2VtLCAwLCAKKyAgICAgICAgICAgICAgICBzaXplb2YoZWdsX25hdGl2ZV93aW5kb3dfdDo6b2VtKSk7CisgICAgfQorICAgIGlubGluZSB2b2lkIGluY1N0cm9uZyh2b2lkKikgY29uc3QgeworICAgICAgICAvKiBpbiBhIHJlYWwgaW1wbGVtZW50YXRpb24sIHRoZSBpbmMgbXVzdCBiZSBhdG9taWMgKi8KKyAgICAgICAgbUNvdW50Kys7CisgICAgfQorICAgIGlubGluZSB2b2lkIGRlY1N0cm9uZyh2b2lkKikgY29uc3QgeworICAgICAgICAvKiBpbiBhIHJlYWwgaW1wbGVtZW50YXRpb24sIHRoZSBkZWMgbXVzdCBiZSBhdG9taWMgKi8KKyAgICAgICAgaWYgKC0tbUNvdW50ID09IDEpIHsKKyAgICAgICAgICAgICBkZWxldGUgc3RhdGljX2Nhc3Q8Y29uc3QgVFlQRSo+KHRoaXMpOworICAgICAgICAgfQorICAgIH0KK3Byb3RlY3RlZDoKKyAgICBFR0xOYXRpdmVTdXJmYWNlJiBvcGVyYXRvciA9IChjb25zdCBFR0xOYXRpdmVTdXJmYWNlJiByaHMpOworICAgIEVHTE5hdGl2ZVN1cmZhY2UoY29uc3QgRUdMTmF0aXZlU3VyZmFjZSYgcmhzKTsKKyAgICBpbmxpbmUgfkVHTE5hdGl2ZVN1cmZhY2UoKSB7IH07CisgICAgbXV0YWJsZSB2b2xhdGlsZSBpbnQzMl90IG1Db3VudDsKK307CisKKworY2xhc3MgRUdMRGlzcGxheVN1cmZhY2UgOiBwdWJsaWMgRUdMTmF0aXZlU3VyZmFjZTxFR0xEaXNwbGF5U3VyZmFjZT4KK3sKK3B1YmxpYzoKKyAgICBFR0xEaXNwbGF5U3VyZmFjZSgpOworICAgIH5FR0xEaXNwbGF5U3VyZmFjZSgpOworCisgICAgaW50MzJfdCBnZXRQYWdlRmxpcENvdW50KCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIHZvaWQgICAgICAgICBob29rX2luY1JlZihOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdyk7CisgICAgc3RhdGljIHZvaWQgICAgICAgICBob29rX2RlY1JlZihOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdyk7CisgICAgc3RhdGljIHVpbnQzMl90ICAgICBob29rX3N3YXBCdWZmZXJzKE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93KTsKKyAgICBzdGF0aWMgdm9pZCAgICAgICAgIGhvb2tfc2V0U3dhcFJlY3RhbmdsZShOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdywgaW50IGwsIGludCB0LCBpbnQgdywgaW50IGgpOworICAgIHN0YXRpYyB1aW50MzJfdCAgICAgaG9va19uZXh0QnVmZmVyKE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93KTsKKworICAgIHVpbnQzMl90ICAgIHN3YXBCdWZmZXJzKCk7CisgICAgdWludDMyX3QgICAgbmV4dEJ1ZmZlcigpOworICAgIHZvaWQgICAgICAgIHNldFN3YXBSZWN0YW5nbGUoaW50IGwsIGludCB0LCBpbnQgdywgaW50IGgpOworCisgICAgaW50ICAgIG1hcEZyYW1lQnVmZmVyKCk7CisKKyAgICBlbnVtIHsKKyAgICAgICAgUEFHRV9GTElQID0gMHgwMDAwMDAwMQorICAgIH07CisgICAgR0dMU3VyZmFjZSAgICAgICAgICBtRmJbMl07CisgICAgaW50ICAgICAgICAgICAgICAgICBtSW5kZXg7CisgICAgdWludDMyX3QgICAgICAgICAgICBtRmxhZ3M7CisgICAgc2l6ZV90ICAgICAgICAgICAgICBtU2l6ZTsKKyAgICBmYl92YXJfc2NyZWVuaW5mbyAgIG1JbmZvOworICAgIGZiX2ZpeF9zY3JlZW5pbmZvICAgbUZpbmZvOworICAgIGludDMyX3QgICAgICAgICAgICAgbVBhZ2VGbGlwQ291bnQ7CisgICAgaW50MzJfdCAgICAgICAgICAgICBtU3dhcENvdW50OworICAgIHVpbnQzMl90ICAgICAgICAgICAgbUZlYXR1cmVGbGFnczsKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgLy8gQU5EUk9JRF9TSU1fRUdMX1NVUkZBQ0VfSAorCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvc2ZzaW0vc2ZzaW0uYyBiL29wZW5nbC90ZXN0cy9zZnNpbS9zZnNpbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YmE0OTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvc2ZzaW0vc2ZzaW0uYwpAQCAtMCwwICsxLDExMiBAQAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxHTEVTL2VnbC5oPgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisgICAgaWYgKGFyZ2MgIT0gMikgeworICAgICAgICBwcmludGYoInVzYWdlOiAlcyA8MC02PlxuIiwgYXJndlswXSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAKKyAgICBjb25zdCBpbnQgdGVzdCA9IGF0b2koYXJndlsxXSk7CisKKyAgICBFR0xpbnQgc19jb25maWdBdHRyaWJzW10gPSB7CisgICAgICAgICBFR0xfUkVEX1NJWkUsICAgICAgIDUsCisgICAgICAgICBFR0xfR1JFRU5fU0laRSwgICAgIDYsCisgICAgICAgICBFR0xfQkxVRV9TSVpFLCAgICAgIDUsCisgICAgICAgICBFR0xfTk9ORQorICAgICB9OworICAgICAKKyAgICAgRUdMaW50IG51bUNvbmZpZ3MgPSAtMTsKKyAgICAgRUdMaW50IG1ham9yVmVyc2lvbjsKKyAgICAgRUdMaW50IG1pbm9yVmVyc2lvbjsKKyAgICAgRUdMQ29uZmlnIGNvbmZpZzsKKyAgICAgRUdMQ29udGV4dCBjb250ZXh0OworICAgICBFR0xTdXJmYWNlIHN1cmZhY2U7CisgICAgIEVHTGludCB3LCBoOworICAgICAKKyAgICAgRUdMRGlzcGxheSBkcHk7CisKKyAgICAgZHB5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKKyAgICAgZWdsSW5pdGlhbGl6ZShkcHksICZtYWpvclZlcnNpb24sICZtaW5vclZlcnNpb24pOworICAgICBlZ2xDaG9vc2VDb25maWcoZHB5LCBzX2NvbmZpZ0F0dHJpYnMsICZjb25maWcsIDEsICZudW1Db25maWdzKTsKKyAgICAgc3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZHB5LCBjb25maWcsCisgICAgICAgICAgICAgYW5kcm9pZF9jcmVhdGVEaXNwbGF5U3VyZmFjZSgpLCBOVUxMKTsKKyAgICAgY29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQoZHB5LCBjb25maWcsIE5VTEwsIE5VTEwpOworICAgICBlZ2xNYWtlQ3VycmVudChkcHksIHN1cmZhY2UsIHN1cmZhY2UsIGNvbnRleHQpOyAgIAorICAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfV0lEVEgsICZ3KTsKKyAgICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX0hFSUdIVCwgJmgpOworICAgICBHTGludCBkaW0gPSB3PGggPyB3IDogaDsKKworICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworCisgICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDQsIDQsIC00IH07CisgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgMCk7CisgICAgIGdsVGV4UGFyYW1ldGVyaXYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTLCBjcm9wKTsKKyAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICAgZ2xUZXhFbnZ4KEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9SRVBMQUNFKTsKKyAgICAgZ2xFbmFibGUoR0xfVEVYVFVSRV8yRCk7CisgICAgIGdsQ29sb3I0ZigxLDEsMSwxKTsKKworICAgICAvLyBwYWNraW5nIGlzIGFsd2F5cyA0CisgICAgIHVpbnQ4X3QgdDhbXSAgPSB7IAorICAgICAgICAgICAgIDB4MDAsIDB4NTUsIDB4MDAsIDB4NTUsIAorICAgICAgICAgICAgIDB4QUEsIDB4RkYsIDB4QUEsIDB4RkYsCisgICAgICAgICAgICAgMHgwMCwgMHg1NSwgMHgwMCwgMHg1NSwgCisgICAgICAgICAgICAgMHhBQSwgMHhGRiwgMHhBQSwgMHhGRiAgfTsKKworICAgICB1aW50MTZfdCB0MTZbXSAgPSB7IAorICAgICAgICAgICAgIDB4MDAwMCwgMHg1NTU1LCAweDAwMDAsIDB4NTU1NSwgCisgICAgICAgICAgICAgMHhBQUFBLCAweEZGRkYsIDB4QUFBQSwgMHhGRkZGLAorICAgICAgICAgICAgIDB4MDAwMCwgMHg1NTU1LCAweDAwMDAsIDB4NTU1NSwgCisgICAgICAgICAgICAgMHhBQUFBLCAweEZGRkYsIDB4QUFBQSwgMHhGRkZGICB9OworCisgICAgIHVpbnQxNl90IHQ1NTUxW10gID0geyAKKyAgICAgICAgICAgICAweDAwMDAsIDB4RkZGRiwgMHgwMDAwLCAweEZGRkYsIAorICAgICAgICAgICAgIDB4RkZGRiwgMHgwMDAwLCAweEZGRkYsIDB4MDAwMCwKKyAgICAgICAgICAgICAweDAwMDAsIDB4RkZGRiwgMHgwMDAwLCAweEZGRkYsIAorICAgICAgICAgICAgIDB4RkZGRiwgMHgwMDAwLCAweEZGRkYsIDB4MDAwMCAgfTsKKworICAgICB1aW50MzJfdCB0MzJbXSAgPSB7IAorICAgICAgICAgICAgIDB4RkYwMDAwMDAsIDB4RkYwMDAwRkYsIDB4RkYwMEZGMDAsIDB4RkZGRjAwMDAsIAorICAgICAgICAgICAgIDB4RkYwMEZGMDAsIDB4RkZGRjAwMDAsIDB4RkYwMDAwMDAsIDB4RkYwMDAwRkYsIAorICAgICAgICAgICAgIDB4RkYwMEZGRkYsIDB4RkYwMEZGMDAsIDB4MDBGRjAwRkYsIDB4RkZGRkZGMDAsIAorICAgICAgICAgICAgIDB4RkYwMDAwMDAsIDB4RkZGRjAwRkYsIDB4RkYwMEZGRkYsIDB4RkZGRkZGRkYKKyAgICAgfTsKKworICAgICBzd2l0Y2godGVzdCkgCisgICAgIHsKKyAgICAgY2FzZSAxOgorICAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX0xVTUlOQU5DRSwKKyAgICAgICAgICAgICAgICAgNCwgNCwgMCwgR0xfTFVNSU5BTkNFLCBHTF9VTlNJR05FRF9CWVRFLCB0OCk7CisgICAgICAgICBicmVhazsKKyAgICAgY2FzZSAyOgorICAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQiwKKyAgICAgICAgICAgICAgICAgNCwgNCwgMCwgR0xfUkdCLCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSwgdDE2KTsKKyAgICAgICAgIGJyZWFrOworICAgICBjYXNlIDM6CisgICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwKKyAgICAgICAgICAgICAgICAgNCwgNCwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCwgdDE2KTsKKyAgICAgICAgIGJyZWFrOworICAgICBjYXNlIDQ6CisgICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfTFVNSU5BTkNFX0FMUEhBLAorICAgICAgICAgICAgICAgICA0LCA0LCAwLCBHTF9MVU1JTkFOQ0VfQUxQSEEsIEdMX1VOU0lHTkVEX0JZVEUsIHQxNik7CisgICAgICAgICBicmVhazsKKyAgICAgY2FzZSA1OgorICAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsCisgICAgICAgICAgICAgICAgIDQsIDQsIDAsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzEsIHQ1NTUxKTsKKyAgICAgICAgIGJyZWFrOworICAgICBjYXNlIDY6CisgICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwKKyAgICAgICAgICAgICAgICAgNCwgNCwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgdDMyKTsKKyAgICAgICAgIGJyZWFrOworICAgICB9CisKKyAgICAgZ2xEcmF3VGV4aU9FUygwLCAwLCAwLCBkaW0sIGRpbSk7CisKKyAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKyAgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGV4dHVyZXMvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy90ZXh0dXJlcy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYzkwMjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvdGV4dHVyZXMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE2IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisJdGV4dHVyZXMuYworCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJjdXRpbHMgXAorICAgIGxpYkdMRVNfQ00gXAorICAgIGxpYnVpCisKK0xPQ0FMX01PRFVMRTo9IHRlc3Qtb3BlbmdsLXRleHR1cmVzCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3RleHR1cmVzL3RleHR1cmVzLmMgYi9vcGVuZ2wvdGVzdHMvdGV4dHVyZXMvdGV4dHVyZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGUzYmUxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3RleHR1cmVzL3RleHR1cmVzLmMKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxHTEVTL2VnbC5oPgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisgICAgRUdMaW50IHNfY29uZmlnQXR0cmlic1tdID0geworICAgICAgICAgRUdMX1JFRF9TSVpFLCAgICAgICA1LAorICAgICAgICAgRUdMX0dSRUVOX1NJWkUsICAgICA2LAorICAgICAgICAgRUdMX0JMVUVfU0laRSwgICAgICA1LAorICAgICAgICAgRUdMX05PTkUKKyAgICAgfTsKKyAgICAgCisgICAgIEVHTGludCBudW1Db25maWdzID0gLTE7CisgICAgIEVHTGludCBtYWpvclZlcnNpb247CisgICAgIEVHTGludCBtaW5vclZlcnNpb247CisgICAgIEVHTENvbmZpZyBjb25maWc7CisgICAgIEVHTENvbnRleHQgY29udGV4dDsKKyAgICAgRUdMU3VyZmFjZSBzdXJmYWNlOworICAgICBFR0xpbnQgdywgaDsKKyAgICAgCisgICAgIEVHTERpc3BsYXkgZHB5OworCisgICAgIGRweSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSk7CisgICAgIGVnbEluaXRpYWxpemUoZHB5LCAmbWFqb3JWZXJzaW9uLCAmbWlub3JWZXJzaW9uKTsKKyAgICAgZWdsQ2hvb3NlQ29uZmlnKGRweSwgc19jb25maWdBdHRyaWJzLCAmY29uZmlnLCAxLCAmbnVtQ29uZmlncyk7CisgICAgIHN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKGRweSwgY29uZmlnLAorICAgICAgICAgICAgIGFuZHJvaWRfY3JlYXRlRGlzcGxheVN1cmZhY2UoKSwgTlVMTCk7CisgICAgIGNvbnRleHQgPSBlZ2xDcmVhdGVDb250ZXh0KGRweSwgY29uZmlnLCBOVUxMLCBOVUxMKTsKKyAgICAgZWdsTWFrZUN1cnJlbnQoZHB5LCBzdXJmYWNlLCBzdXJmYWNlLCBjb250ZXh0KTsgICAKKyAgICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX1dJRFRILCAmdyk7CisgICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9IRUlHSFQsICZoKTsKKyAgICAgR0xpbnQgZGltID0gdzxoID8gdyA6IGg7CisKKworICAgICBHTGludCBjcm9wWzRdID0geyAwLCA0LCA0LCAtNCB9OworICAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIDApOworICAgICBnbFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUywgY3JvcCk7CisgICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7CisgICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CisgICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVBfVE9fRURHRSk7CisgICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfQ0xBTVBfVE9fRURHRSk7CisgICAgIGdsVGV4RW52eChHTF9URVhUVVJFX0VOViwgR0xfVEVYVFVSRV9FTlZfTU9ERSwgR0xfUkVQTEFDRSk7CisgICAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfMkQpOworICAgICBnbENvbG9yNGYoMSwxLDEsMSk7CisKKyAgICAgLy8gcGFja2luZyBpcyBhbHdheXMgNAorICAgICB1aW50OF90IHQ4W10gID0geyAKKyAgICAgICAgICAgICAweDAwLCAweDU1LCAweDAwLCAweDU1LCAKKyAgICAgICAgICAgICAweEFBLCAweEZGLCAweEFBLCAweEZGLAorICAgICAgICAgICAgIDB4MDAsIDB4NTUsIDB4MDAsIDB4NTUsIAorICAgICAgICAgICAgIDB4QUEsIDB4RkYsIDB4QUEsIDB4RkYgIH07CisKKyAgICAgdWludDE2X3QgdDE2W10gID0geyAKKyAgICAgICAgICAgICAweDAwMDAsIDB4NTU1NSwgMHgwMDAwLCAweDU1NTUsIAorICAgICAgICAgICAgIDB4QUFBQSwgMHhGRkZGLCAweEFBQUEsIDB4RkZGRiwKKyAgICAgICAgICAgICAweDAwMDAsIDB4NTU1NSwgMHgwMDAwLCAweDU1NTUsIAorICAgICAgICAgICAgIDB4QUFBQSwgMHhGRkZGLCAweEFBQUEsIDB4RkZGRiAgfTsKKworICAgICB1aW50MTZfdCB0NTU1MVtdICA9IHsgCisgICAgICAgICAgICAgMHgwMDAwLCAweEZGRkYsIDB4MDAwMCwgMHhGRkZGLCAKKyAgICAgICAgICAgICAweEZGRkYsIDB4MDAwMCwgMHhGRkZGLCAweDAwMDAsCisgICAgICAgICAgICAgMHgwMDAwLCAweEZGRkYsIDB4MDAwMCwgMHhGRkZGLCAKKyAgICAgICAgICAgICAweEZGRkYsIDB4MDAwMCwgMHhGRkZGLCAweDAwMDAgIH07CisKKyAgICAgdWludDMyX3QgdDMyW10gID0geyAKKyAgICAgICAgICAgICAweEZGMDAwMDAwLCAweEZGMDAwMEZGLCAweEZGMDBGRjAwLCAweEZGRkYwMDAwLCAKKyAgICAgICAgICAgICAweEZGMDBGRjAwLCAweEZGRkYwMDAwLCAweEZGMDAwMDAwLCAweEZGMDAwMEZGLCAKKyAgICAgICAgICAgICAweEZGMDBGRkZGLCAweEZGMDBGRjAwLCAweDAwRkYwMEZGLCAweEZGRkZGRjAwLCAKKyAgICAgICAgICAgICAweEZGMDAwMDAwLCAweEZGRkYwMEZGLCAweEZGMDBGRkZGLCAweEZGRkZGRkZGCisgICAgIH07CisKKworICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfTFVNSU5BTkNFLCA0LCA0LCAwLCBHTF9MVU1JTkFOQ0UsIEdMX1VOU0lHTkVEX0JZVEUsIHQ4KTsKKyAgICAgZ2xEcmF3VGV4aU9FUygwLCAwLCAwLCBkaW0vMiwgZGltLzIpOworCisgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0IsIDQsIDQsIDAsIEdMX1JHQiwgR0xfVU5TSUdORURfU0hPUlRfNV82XzUsIHQxNik7CisgICAgIGdsRHJhd1RleGlPRVMoZGltLzIsIDAsIDAsIGRpbS8yLCBkaW0vMik7CisKKyAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIDQsIDQsIDAsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzQsIHQxNik7CisgICAgIGdsRHJhd1RleGlPRVMoMCwgZGltLzIsIDAsIGRpbS8yLCBkaW0vMik7CisKKyAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIDQsIDQsIDAsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIHQzMik7CisgICAgIGdsRHJhd1RleGlPRVMoZGltLzIsIGRpbS8yLCAwLCBkaW0vMiwgZGltLzIpOworCisgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7CisgICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3RyaXRleC9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL3RyaXRleC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZGFjNGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvdHJpdGV4L0FuZHJvaWQubWsKQEAgLTAsMCArMSwxNiBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorCXRyaXRleC5jCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorCWxpYmN1dGlscyBcCisgICAgbGliR0xFU19DTSBcCisgICAgbGlidWkKKworTE9DQUxfTU9EVUxFOj0gdGVzdC1vcGVuZ2wtdHJpdGV4CisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3RyaXRleC90cml0ZXguYyBiL29wZW5nbC90ZXN0cy90cml0ZXgvdHJpdGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGViZTdkNAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy90cml0ZXgvdHJpdGV4LmMKQEAgLTAsMCArMSwyNzEgQEAKKy8vIENhbGxzIGdsRHJhd0VsZW1lbnRzKCkgdGhlIG51bWJlciBvZiB0aW1lcyBzcGVjaWZpZWQgYnkKKy8vIElURVJBVElPTlMuIFNob3VsZCBkcmF3IGEgY2hlY2tlcmJvYXJkIG9uIHRoZSBzY3JlZW4gYWZ0ZXIKKy8vIGEgZmV3IHNlY29uZHMuCisvLworLy8gUG9ydGVkIGZyb20gYSBKYXZhIHZlcnNpb24gYnkgR29vZ2xlLgorCisjaW5jbHVkZSA8R0xFUy9lZ2wuaD4NCisjaW5jbHVkZSA8c3RkaW8uaD4NCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorDQorRUdMRGlzcGxheSBlZ2xEaXNwbGF5Ow0KK0VHTFN1cmZhY2UgZWdsU3VyZmFjZTsNCitFR0xDb250ZXh0IGVnbENvbnRleHQ7DQorR0x1aW50IHRleHR1cmU7DQorDQorI2RlZmluZSBGSVhFRF9PTkUgMHgxMDAwMAorI2RlZmluZSBJVEVSQVRJT05TIDUwDQorDQoraW50IGluaXRfZ2xfc3VyZmFjZSh2b2lkKTsNCit2b2lkIGZyZWVfZ2xfc3VyZmFjZSh2b2lkKTsNCit2b2lkIGluaXRfc2NlbmUodm9pZCk7DQordm9pZCByZW5kZXIoaW50IHF1YWRzKTsNCit2b2lkIGNyZWF0ZV90ZXh0dXJlKHZvaWQpOworaW50IHJlYWRUaW1lcih2b2lkKTsNCisKK3N0YXRpYyB2b2lkIGdsdUxvb2tBdChmbG9hdCBleWVYLCBmbG9hdCBleWVZLCBmbG9hdCBleWVaLAorICAgICAgICBmbG9hdCBjZW50ZXJYLCBmbG9hdCBjZW50ZXJZLCBmbG9hdCBjZW50ZXJaLCBmbG9hdCB1cFgsIGZsb2F0IHVwWSwKKyAgICAgICAgZmxvYXQgdXBaKQoreworICAgIC8vIFNlZSB0aGUgT3BlbkdMIEdMVVQgZG9jdW1lbnRhdGlvbiBmb3IgZ2x1TG9va0F0IGZvciBhIGRlc2NyaXB0aW9uCisgICAgLy8gb2YgdGhlIGFsZ29yaXRobS4gV2UgaW1wbGVtZW50IGl0IGluIGEgc3RyYWlnaHRmb3J3YXJkIHdheToKKworICAgIGZsb2F0IGZ4ID0gY2VudGVyWCAtIGV5ZVg7CisgICAgZmxvYXQgZnkgPSBjZW50ZXJZIC0gZXllWTsKKyAgICBmbG9hdCBmeiA9IGNlbnRlclogLSBleWVaOworCisgICAgLy8gTm9ybWFsaXplIGYKKyAgICBmbG9hdCBybGYgPSAxLjBmIC8gc3FydGYoZngqZnggKyBmeSpmeSArIGZ6KmZ6KTsKKyAgICBmeCAqPSBybGY7CisgICAgZnkgKj0gcmxmOworICAgIGZ6ICo9IHJsZjsKKworICAgIC8vIE5vcm1hbGl6ZSB1cAorICAgIGZsb2F0IHJsdXAgPSAxLjBmIC8gc3FydGYodXBYKnVwWCArIHVwWSp1cFkgKyB1cFoqdXBaKTsKKyAgICB1cFggKj0gcmx1cDsKKyAgICB1cFkgKj0gcmx1cDsKKyAgICB1cFogKj0gcmx1cDsKKworICAgIC8vIGNvbXB1dGUgcyA9IGYgeCB1cCAoeCBtZWFucyAiY3Jvc3MgcHJvZHVjdCIpCisKKyAgICBmbG9hdCBzeCA9IGZ5ICogdXBaIC0gZnogKiB1cFk7CisgICAgZmxvYXQgc3kgPSBmeiAqIHVwWCAtIGZ4ICogdXBaOworICAgIGZsb2F0IHN6ID0gZnggKiB1cFkgLSBmeSAqIHVwWDsKKworICAgIC8vIGNvbXB1dGUgdSA9IHMgeCBmCisgICAgZmxvYXQgdXggPSBzeSAqIGZ6IC0gc3ogKiBmeTsKKyAgICBmbG9hdCB1eSA9IHN6ICogZnggLSBzeCAqIGZ6OworICAgIGZsb2F0IHV6ID0gc3ggKiBmeSAtIHN5ICogZng7CisKKyAgICBmbG9hdCBtWzE2XSA7CisgICAgbVswXSA9IHN4OworICAgIG1bMV0gPSB1eDsKKyAgICBtWzJdID0gLWZ4OworICAgIG1bM10gPSAwLjBmOworCisgICAgbVs0XSA9IHN5OworICAgIG1bNV0gPSB1eTsKKyAgICBtWzZdID0gLWZ5OworICAgIG1bN10gPSAwLjBmOworCisgICAgbVs4XSA9IHN6OworICAgIG1bOV0gPSB1ejsKKyAgICBtWzEwXSA9IC1mejsKKyAgICBtWzExXSA9IDAuMGY7CisKKyAgICBtWzEyXSA9IDAuMGY7CisgICAgbVsxM10gPSAwLjBmOworICAgIG1bMTRdID0gMC4wZjsKKyAgICBtWzE1XSA9IDEuMGY7CisKKyAgICBnbE11bHRNYXRyaXhmKG0pOworICAgIGdsVHJhbnNsYXRlZigtZXllWCwgLWV5ZVksIC1leWVaKTsKK30KKw0KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikNCit7DQorICAgIGludCBxOworICAgIGludCBzdGFydCwgZW5kOw0KKworICAgIHByaW50ZigiSW5pdGlhbGl6aW5nIEVHTC4uLlxuIik7CisNCisgICAgaWYoIWluaXRfZ2xfc3VyZmFjZSgpKQ0KKyAgICB7DQorICAgICAgICBwcmludGYoIkdMIGluaXRpYWxpc2F0aW9uIGZhaWxlZCAtIGV4aXRpbmdcbiIpOw0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisNCisgICAgaW5pdF9zY2VuZSgpOw0KKw0KKyAgICBjcmVhdGVfdGV4dHVyZSgpOw0KKw0KKyAgICBwcmludGYoIlN0YXJ0IHRlc3QuLi5cbiIpOworCisgICAgcmVuZGVyKGFyZ2M9PTIgPyBhdG9pKGFyZ3ZbMV0pIDogSVRFUkFUSU9OUyk7DQorDQorICAgIGZyZWVfZ2xfc3VyZmFjZSgpOw0KKw0KKyAgICByZXR1cm4gMDsNCit9DQorDQoraW50IGluaXRfZ2xfc3VyZmFjZSh2b2lkKQ0KK3sNCisgICAgRUdMaW50IG51bUNvbmZpZ3MgPSAxOw0KKyAgICBFR0xDb25maWcgbXlDb25maWcgPSB7MH07DQorICAgIEVHTGludCBhdHRyaWJbXSA9DQorICAgIHsNCisgICAgICAgICAgICBFR0xfREVQVEhfU0laRSwgICAgIDE2LA0KKyAgICAgICAgICAgIEVHTF9OT05FDQorICAgIH07DQorDQorICAgIGlmICggKGVnbERpc3BsYXkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpKSA9PSBFR0xfTk9fRElTUExBWSApDQorICAgIHsNCisgICAgICAgIHByaW50ZigiZWdsR2V0RGlzcGxheSBmYWlsZWRcbiIpOw0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisNCisgICAgaWYgKCBlZ2xJbml0aWFsaXplKGVnbERpc3BsYXksIE5VTEwsIE5VTEwpICE9IEVHTF9UUlVFICkNCisgICAgew0KKyAgICAgICAgcHJpbnRmKCJlZ2xJbml0aWFsaXplIGZhaWxlZFxuIik7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKw0KKyAgICBpZiAoIGVnbENob29zZUNvbmZpZyhlZ2xEaXNwbGF5LCBhdHRyaWIsICZteUNvbmZpZywgMSwgJm51bUNvbmZpZ3MpICE9IEVHTF9UUlVFICkNCisgICAgew0KKyAgICAgICAgcHJpbnRmKCJlZ2xDaG9vc2VDb25maWcgZmFpbGVkXG4iKTsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorDQorICAgIGlmICggKGVnbFN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKGVnbERpc3BsYXksIG15Q29uZmlnLAorICAgICAgICAgICAgYW5kcm9pZF9jcmVhdGVEaXNwbGF5U3VyZmFjZSgpLCAwKSkgPT0gRUdMX05PX1NVUkZBQ0UgKQ0KKyAgICB7DQorICAgICAgICBwcmludGYoImVnbENyZWF0ZVdpbmRvd1N1cmZhY2UgZmFpbGVkXG4iKTsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorDQorICAgIGlmICggKGVnbENvbnRleHQgPSBlZ2xDcmVhdGVDb250ZXh0KGVnbERpc3BsYXksIG15Q29uZmlnLCAwLCAwKSkgPT0gRUdMX05PX0NPTlRFWFQgKQ0KKyAgICB7DQorICAgICAgICBwcmludGYoImVnbENyZWF0ZUNvbnRleHQgZmFpbGVkXG4iKTsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorDQorICAgIGlmICggZWdsTWFrZUN1cnJlbnQoZWdsRGlzcGxheSwgZWdsU3VyZmFjZSwgZWdsU3VyZmFjZSwgZWdsQ29udGV4dCkgIT0gRUdMX1RSVUUgKQ0KKyAgICB7DQorICAgICAgICBwcmludGYoImVnbE1ha2VDdXJyZW50IGZhaWxlZFxuIik7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKw0KKyAgICByZXR1cm4gMTsNCit9DQorDQordm9pZCBmcmVlX2dsX3N1cmZhY2Uodm9pZCkNCit7DQorICAgIGlmIChlZ2xEaXNwbGF5ICE9IEVHTF9OT19ESVNQTEFZKQ0KKyAgICB7DQorICAgICAgICBlZ2xNYWtlQ3VycmVudCggRUdMX05PX0RJU1BMQVksIEVHTF9OT19TVVJGQUNFLA0KKyAgICAgICAgICAgICAgICBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX0NPTlRFWFQgKTsNCisgICAgICAgIGVnbERlc3Ryb3lDb250ZXh0KCBlZ2xEaXNwbGF5LCBlZ2xDb250ZXh0ICk7DQorICAgICAgICBlZ2xEZXN0cm95U3VyZmFjZSggZWdsRGlzcGxheSwgZWdsU3VyZmFjZSApOw0KKyAgICAgICAgZWdsVGVybWluYXRlKCBlZ2xEaXNwbGF5ICk7DQorICAgICAgICBlZ2xEaXNwbGF5ID0gRUdMX05PX0RJU1BMQVk7DQorICAgIH0NCit9DQorDQordm9pZCBpbml0X3NjZW5lKHZvaWQpDQorew0KKyAgICBnbERpc2FibGUoR0xfRElUSEVSKTsKKyAgICBnbEVuYWJsZShHTF9DVUxMX0ZBQ0UpOworCisgICAgZmxvYXQgcmF0aW8gPSAzMjAuMGYgLyA0ODAuMGY7CisgICAgZ2xWaWV3cG9ydCgwLCAwLCAzMjAsIDQ4MCk7CisKKyAgICBnbE1hdHJpeE1vZGUoR0xfUFJPSkVDVElPTik7CisgICAgZ2xMb2FkSWRlbnRpdHkoKTsKKyAgICBnbEZydXN0dW1mKC1yYXRpbywgcmF0aW8sIC0xLCAxLCAxLCAxMCk7CisKKyAgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsNCisgICAgZ2xMb2FkSWRlbnRpdHkoKTsKKyAgICBnbHVMb29rQXQoCisgICAgICAgICAgICAwLCAwLCAzLCAgLy8gZXllCisgICAgICAgICAgICAwLCAwLCAwLCAgLy8gY2VudGVyCisgICAgICAgICAgICAwLCAxLCAwKTsgLy8gdXAKKw0KKyAgICBnbEVuYWJsZShHTF9URVhUVVJFXzJEKTsNCisgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9WRVJURVhfQVJSQVkpOw0KKyAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkpOworfQ0KKw0KK3ZvaWQgY3JlYXRlX3RleHR1cmUodm9pZCkNCit7DQorICAgIGNvbnN0IHVuc2lnbmVkIGludCBvbiA9IDB4ZmYwMDAwZmY7CisgICAgY29uc3QgdW5zaWduZWQgaW50IG9mZiA9IDB4ZmZmZmZmZmY7CisgICAgY29uc3QgdW5zaWduZWQgaW50IHBpeGVsc1tdID0KKyAgICB7CisgICAgICAgICAgICBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLAorICAgICAgICAgICAgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwKKyAgICAgICAgICAgIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsCisgICAgICAgICAgICBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLAorICAgICAgICAgICAgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwKKyAgICAgICAgICAgIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sCisgICAgICAgICAgICBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLAorICAgICAgICAgICAgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwKKyAgICB9Ow0KKyAgICBnbEdlblRleHR1cmVzKDEsICZ0ZXh0dXJlKTsNCisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0dXJlKTsNCisgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIDgsIDgsIDAsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIHBpeGVscyk7DQorICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX05FQVJFU1QpOw0KKyAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9ORUFSRVNUKTsNCisgICAgZ2xUZXhFbnZ4KEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9SRVBMQUNFKTsNCit9DQorDQordm9pZCByZW5kZXIoaW50IHF1YWRzKQ0KK3sNCisgICAgaW50IGksIGo7DQorDQorICAgIGNvbnN0IEdMZmxvYXQgdmVydGljZXNbXSA9IHsNCisgICAgICAgICAgICAtMSwgIC0xLCAgMCwNCisgICAgICAgICAgICAgMSwgIC0xLCAgMCwNCisgICAgICAgICAgICAgMSwgICAxLCAgMCwNCisgICAgICAgICAgICAtMSwgICAxLCAgMA0KKyAgICB9Ow0KKw0KKyAgICBjb25zdCBHTGZpeGVkIHRleENvb3Jkc1tdID0gew0KKyAgICAgICAgICAgIDAsICAgICAgICAgICAgMCwNCisgICAgICAgICAgICBGSVhFRF9PTkUsICAgIDAsDQorICAgICAgICAgICAgRklYRURfT05FLCAgICBGSVhFRF9PTkUsDQorICAgICAgICAgICAgMCwgICAgICAgICAgICBGSVhFRF9PTkUNCisgICAgfTsNCisNCisgICAgY29uc3QgR0x1c2hvcnQgdGVtcGxhdGVbXSA9IHsgMCwgMSwgMiwgIDAsIDIsIDMgfTsKKworCisgICAgR0x1c2hvcnQqIGluZGljZXMgPSAoR0x1c2hvcnQqKW1hbGxvYyhxdWFkcypzaXplb2YodGVtcGxhdGUpKTsKKyAgICBmb3IgKGk9MCA7IGk8cXVhZHMgOyBpKyspCisgICAgICAgIG1lbWNweShpbmRpY2VzKyhzaXplb2YodGVtcGxhdGUpL3NpemVvZihpbmRpY2VzWzBdKSkqaSwgdGVtcGxhdGUsIHNpemVvZih0ZW1wbGF0ZSkpOworDQorICAgIGdsVmVydGV4UG9pbnRlcigzLCBHTF9GTE9BVCwgMCwgdmVydGljZXMpOw0KKyAgICBnbFRleENvb3JkUG9pbnRlcigyLCBHTF9GSVhFRCwgMCwgdGV4Q29vcmRzKTsKKworICAgIC8vIG1ha2Ugc3VyZSB0byBkbyBhIGNvdXBsZSBlZ2xTd2FwQnVmZmVycyB0byBtYWtlIHN1cmUgdGhlcmUgYXJlCisgICAgLy8gbm8gcHJvYmxlbXMgd2l0aCB0aGUgdmVyeSBmaXJzdCBvbmVzICh3aG8ga25vd3MpCisgICAgZ2xDbGVhckNvbG9yKDAuNCwgMC40LCAwLjQsIDAuNCk7CisgICAgZ2xDbGVhcihHTF9ERVBUSF9CVUZGRVJfQklUIHwgR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgZWdsU3dhcEJ1ZmZlcnMoZWdsRGlzcGxheSwgZWdsU3VyZmFjZSk7CisgICAgZ2xDbGVhckNvbG9yKDAuNiwgMC42LCAwLjYsIDAuNik7CisgICAgZ2xDbGVhcihHTF9ERVBUSF9CVUZGRVJfQklUIHwgR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgZWdsU3dhcEJ1ZmZlcnMoZWdsRGlzcGxheSwgZWdsU3VyZmFjZSk7CisgICAgZ2xDbGVhckNvbG9yKDEuMCwgMS4wLCAxLjAsIDEuMCk7CisKKyAgICBmb3IgKGo9MCA7IGo8MTAgOyBqKyspIHsKKyAgICAgICAgcHJpbnRmKCJsb29wICVkIC8gMTAgKCVkIHF1YWRzIC8gbG9vcClcbiIsIGosIHF1YWRzKTsKKworICAgICAgICBpbnQgbmVsZW0gPSBzaXplb2YodGVtcGxhdGUpL3NpemVvZih0ZW1wbGF0ZVswXSk7CisgICAgICAgIGdsQ2xlYXIoR0xfREVQVEhfQlVGRkVSX0JJVCB8IEdMX0NPTE9SX0JVRkZFUl9CSVQpOworICAgICAgICBnbERyYXdFbGVtZW50cyhHTF9UUklBTkdMRVMsIG5lbGVtKnF1YWRzLCBHTF9VTlNJR05FRF9TSE9SVCwgaW5kaWNlcyk7CisgICAgICAgIGVnbFN3YXBCdWZmZXJzKGVnbERpc3BsYXksIGVnbFN1cmZhY2UpOworICAgIH0KKworICAgIGZyZWUoaW5kaWNlcyk7DQorfQ0KKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dlbiBiL29wZW5nbC90b29scy9nbGdlbi9nZW4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWM0OTg2MQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9nZW4KQEAgLTAsMCArMSw5OSBAQAorIyEvYmluL3NoCitybSAtcmYgb3V0IGdlbmVyYXRlZAorCitta2RpciBvdXQKK21rZGlyIC1wIG91dC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcworbWtkaXIgLXAgb3V0L2NvbS9nb29nbGUvYW5kcm9pZC9nbGVzX2puaQorbWtkaXIgLXAgb3V0L2FuZHJvaWQvZ3JhcGhpY3MKKworZWNobyAicGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzOyIgPiBvdXQvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuamF2YQorZWNobyAicHVibGljIGludGVyZmFjZSBDYW52YXMge30iID4+IG91dC9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhCisKK0dMRklMRT1vdXQvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wuamF2YQorY3Agc3R1YnMvR0xIZWFkZXIuamF2YS1pZiAkR0xGSUxFCisKK0dMR0VOX0ZJTEVTPSJDRnVuYy5qYXZhIENUeXBlLmphdmEgQ29kZUVtaXR0ZXIuamF2YSBHZW5lcmF0ZUdMLmphdmEgSkZ1bmMuamF2YSBKVHlwZS5qYXZhIEpuaUNvZGVFbWl0dGVyLmphdmEgUGFyYW1ldGVyQ2hlY2tlci5qYXZhIgorCitwdXNoZCBzcmMgPiAvZGV2L251bGwKK2phdmFjICR7R0xHRU5fRklMRVN9Citwb3BkID4gL2Rldi9udWxsCitqYXZhIC1jbGFzc3BhdGggc3JjIEdlbmVyYXRlR0wgLWMgZ2xzcGVjLTEuMCBnbHNwZWMtMS4wZXh0IGdsc3BlYy0xLjEgZ2xzcGVjLTEuMWV4dCBnbHNwZWMtMS4xZXh0cGFjayBnbHNwZWMtY2hlY2tzCisKK3B1c2hkIG91dCA+IC9kZXYvbnVsbAorbWtkaXIgY2xhc3NlcworamF2YWMgLWQgY2xhc3NlcyBjb20vZ29vZ2xlL2FuZHJvaWQvZ2xlc19qbmkvR0xJbXBsLmphdmEgamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMC5qYXZhIGphdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTBFeHQuamF2YSBqYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExLmphdmEgamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dC5qYXZhIGphdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHRlbnNpb25QYWNrLmphdmEKK3BvcGQgPiAvZGV2L251bGwKKworcm0gLXJmIGdlbmVyYXRlZAorbWtkaXIgLXAgZ2VuZXJhdGVkL0MKK2NwIG91dC9jb21fZ29vZ2xlX2FuZHJvaWRfZ2xlc19qbmlfR0xJbXBsLmNwcCBnZW5lcmF0ZWQvQworY3AgLXIgb3V0L2NvbSBnZW5lcmF0ZWQKK2NwIC1yIG91dC9qYXZheCBnZW5lcmF0ZWQKKworcm0gLXJmIG91dAorCisjIGNvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9HTEltcGwuY3BwCitpZiBjbXAgLi4vLi4vLi4vZnJhbWV3b3Jrcy9iYXNlL2NvcmUvam5pL2NvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9HTEltcGwuY3BwIGdlbmVyYXRlZC9DL2NvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9HTEltcGwuY3BwIDsgdGhlbgorZWNobyBjb21fZ29vZ2xlX2FuZHJvaWRfZ2xlc19qbmlfR0xJbXBsLmNwcCB1bmNoYW5nZWQKK2Vsc2UKK2VjaG8gUGxlYXNlIGVkaXQgLi4vLi4vLi4vZnJhbWV3b3Jrcy9iYXNlL2NvcmUvam5pL2NvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9HTEltcGwuY3BwCitlY2hvIFBsZWFzZSBjcCBnZW5lcmF0ZWQvQy9jb21fZ29vZ2xlX2FuZHJvaWRfZ2xlc19qbmlfR0xJbXBsLmNwcCAuLi8uLi8uLi9mcmFtZXdvcmtzL2Jhc2UvY29yZS9qbmkKK2ZpCisKKyMgR0xJbXBsLmphdmEKK2lmIGNtcCAuLi8uLi9qYXZhL2NvbS9nb29nbGUvYW5kcm9pZC9nbGVzX2puaS9HTEltcGwuamF2YSBnZW5lcmF0ZWQvY29tL2dvb2dsZS9hbmRyb2lkL2dsZXNfam5pL0dMSW1wbC5qYXZhIDsgdGhlbgorZWNobyBHTEltcGwuamF2YSB1bmNoYW5nZWQKK2Vsc2UKK2VjaG8gUGxlYXNlIGVkaXQgLi4vLi4vamF2YS9jb20vZ29vZ2xlL2FuZHJvaWQvZ2xlc19qbmkvR0xJbXBsLmphdmEKK2VjaG8gUGxlYXNlIGNwIGdlbmVyYXRlZC9jb20vZ29vZ2xlL2FuZHJvaWQvZ2xlc19qbmkvR0xJbXBsLmphdmEgLi4vLi4vamF2YS9jb20vZ29vZ2xlL2FuZHJvaWQvZ2xlc19qbmkKK2ZpCisKKyMgR0wuamF2YQoraWYgY21wIC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wuamF2YSBnZW5lcmF0ZWQvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wuamF2YSA7IHRoZW4KK2VjaG8gR0wuamF2YSB1bmNoYW5nZWQKK2Vsc2UKK2VjaG8gUGxlYXNlIGVkaXQgLi4vLi4vamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTC5qYXZhCitlY2hvIFBsZWFzZSBjcCBnZW5lcmF0ZWQvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wuamF2YSAuLi8uLi9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMLmphdmEKK2ZpCisKKyMgR0wxMC5qYXZhCitpZiBjbXAgLi4vLi4vamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDEwLmphdmEgZ2VuZXJhdGVkL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTAuamF2YSA7IHRoZW4KK2VjaG8gR0wxMC5qYXZhIHVuY2hhbmdlZAorZWxzZQorZWNobyBQbGVhc2UgZWRpdCAuLi8uLi9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTAuamF2YQorZWNobyBQbGVhc2UgY3AgZ2VuZXJhdGVkL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTAuamF2YSAuLi8uLi9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTAuamF2YQorZmkKKworIyBHTDEwRXh0LmphdmEKK2lmIGNtcCAuLi8uLi9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTBFeHQuamF2YSBnZW5lcmF0ZWQvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMEV4dC5qYXZhIDsgdGhlbgorZWNobyBHTDEwRXh0LmphdmEgdW5jaGFuZ2VkCitlbHNlCitlY2hvIFBsZWFzZSBlZGl0IC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMEV4dC5qYXZhCitlY2hvIFBsZWFzZSBjcCBnZW5lcmF0ZWQvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMEV4dC5qYXZhIC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMEV4dC5qYXZhCitmaQorCisjIEdMMTEuamF2YQoraWYgY21wIC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMS5qYXZhIGdlbmVyYXRlZC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExLmphdmEgOyB0aGVuCitlY2hvIEdMMTEuamF2YSB1bmNoYW5nZWQKK2Vsc2UKK2VjaG8gUGxlYXNlIGVkaXQgLi4vLi4vamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExLmphdmEKK2VjaG8gUGxlYXNlIGNwIGdlbmVyYXRlZC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExLmphdmEgLi4vLi4vamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExLmphdmEKK2ZpCisKKyMgR0wxMUV4dC5qYXZhCitpZiBjbXAgLi4vLi4vamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExRXh0LmphdmEgZ2VuZXJhdGVkL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHQuamF2YSA7IHRoZW4KK2VjaG8gR0wxMUV4dC5qYXZhIHVuY2hhbmdlZAorZWxzZQorZWNobyBQbGVhc2UgZWRpdCAuLi8uLi9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHQuamF2YQorZWNobyBQbGVhc2UgY3AgZ2VuZXJhdGVkL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHQuamF2YSAuLi8uLi9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHQuamF2YQorZmkKKworIyBHTDExRXh0ZW5zaW9uUGFjay5qYXZhCitpZiBjbXAgLi4vLi4vamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExRXh0ZW5zaW9uUGFjay5qYXZhIGdlbmVyYXRlZC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExRXh0ZW5zaW9uUGFjay5qYXZhIDsgdGhlbgorZWNobyBHTDExRXh0ZW5zaW9uUGFjay5qYXZhIHVuY2hhbmdlZAorZWxzZQorZWNobyBQbGVhc2UgZWRpdCAuLi8uLi9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHRlbnNpb25QYWNrLmphdmEKK2VjaG8gUGxlYXNlIGNwIGdlbmVyYXRlZC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExRXh0ZW5zaW9uUGFjay5qYXZhIC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dGVuc2lvblBhY2suamF2YQorZmkKKworcm0gLXJmIGdlbmVyYXRlZApkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dsc3BlYy0xLjAgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDQyMzIwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dsc3BlYy0xLjAKQEAgLTAsMCArMSwxMDYgQEAKK3ZvaWQgZ2xBY3RpdmVUZXh0dXJlICggR0xlbnVtIHRleHR1cmUgKQ0KK3ZvaWQgZ2xBbHBoYUZ1bmMgKCBHTGVudW0gZnVuYywgR0xjbGFtcGYgcmVmICkNCit2b2lkIGdsQWxwaGFGdW5jeCAoIEdMZW51bSBmdW5jLCBHTGNsYW1weCByZWYgKQ0KK3ZvaWQgZ2xCaW5kVGV4dHVyZSAoIEdMZW51bSB0YXJnZXQsIEdMdWludCB0ZXh0dXJlICkNCit2b2lkIGdsQmxlbmRGdW5jICggR0xlbnVtIHNmYWN0b3IsIEdMZW51bSBkZmFjdG9yICkNCit2b2lkIGdsQ2xlYXIgKCBHTGJpdGZpZWxkIG1hc2sgKQ0KK3ZvaWQgZ2xDbGVhckNvbG9yICggR0xjbGFtcGYgcmVkLCBHTGNsYW1wZiBncmVlbiwgR0xjbGFtcGYgYmx1ZSwgR0xjbGFtcGYgYWxwaGEgKQ0KK3ZvaWQgZ2xDbGVhckNvbG9yeCAoIEdMY2xhbXB4IHJlZCwgR0xjbGFtcHggZ3JlZW4sIEdMY2xhbXB4IGJsdWUsIEdMY2xhbXB4IGFscGhhICkNCit2b2lkIGdsQ2xlYXJEZXB0aGYgKCBHTGNsYW1wZiBkZXB0aCApDQordm9pZCBnbENsZWFyRGVwdGh4ICggR0xjbGFtcHggZGVwdGggKQ0KK3ZvaWQgZ2xDbGVhclN0ZW5jaWwgKCBHTGludCBzICkNCit2b2lkIGdsQ2xpZW50QWN0aXZlVGV4dHVyZSAoIEdMZW51bSB0ZXh0dXJlICkNCit2b2lkIGdsQ29sb3I0ZiAoIEdMZmxvYXQgcmVkLCBHTGZsb2F0IGdyZWVuLCBHTGZsb2F0IGJsdWUsIEdMZmxvYXQgYWxwaGEgKQ0KK3ZvaWQgZ2xDb2xvcjR4ICggR0xmaXhlZCByZWQsIEdMZml4ZWQgZ3JlZW4sIEdMZml4ZWQgYmx1ZSwgR0xmaXhlZCBhbHBoYSApDQordm9pZCBnbENvbG9yTWFzayAoIEdMYm9vbGVhbiByZWQsIEdMYm9vbGVhbiBncmVlbiwgR0xib29sZWFuIGJsdWUsIEdMYm9vbGVhbiBhbHBoYSApDQordm9pZCBnbENvbG9yUG9pbnRlciAoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyICkNCit2b2lkIGdsQ29tcHJlc3NlZFRleEltYWdlMkQgKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhICkNCit2b2lkIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQgKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEgKQ0KK3ZvaWQgZ2xDb3B5VGV4SW1hZ2UyRCAoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIgKQ0KK3ZvaWQgZ2xDb3B5VGV4U3ViSW1hZ2UyRCAoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCApDQordm9pZCBnbEN1bGxGYWNlICggR0xlbnVtIG1vZGUgKQ0KK3ZvaWQgZ2xEZWxldGVUZXh0dXJlcyAoIEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICp0ZXh0dXJlcyApDQordm9pZCBnbERlcHRoRnVuYyAoIEdMZW51bSBmdW5jICkNCit2b2lkIGdsRGVwdGhNYXNrICggR0xib29sZWFuIGZsYWcgKQ0KK3ZvaWQgZ2xEZXB0aFJhbmdlZiAoIEdMY2xhbXBmIHpOZWFyLCBHTGNsYW1wZiB6RmFyICkNCit2b2lkIGdsRGVwdGhSYW5nZXggKCBHTGNsYW1weCB6TmVhciwgR0xjbGFtcHggekZhciApDQordm9pZCBnbERpc2FibGUgKCBHTGVudW0gY2FwICkNCit2b2lkIGdsRGlzYWJsZUNsaWVudFN0YXRlICggR0xlbnVtIGFycmF5ICkNCit2b2lkIGdsRHJhd0FycmF5cyAoIEdMZW51bSBtb2RlLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCApDQordm9pZCBnbERyYXdFbGVtZW50cyAoIEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICppbmRpY2VzICkNCit2b2lkIGdsRW5hYmxlICggR0xlbnVtIGNhcCApDQordm9pZCBnbEVuYWJsZUNsaWVudFN0YXRlICggR0xlbnVtIGFycmF5ICkNCit2b2lkIGdsRmluaXNoICggdm9pZCApDQordm9pZCBnbEZsdXNoICggdm9pZCApDQordm9pZCBnbEZvZ2YgKCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0gKQ0KK3ZvaWQgZ2xGb2dmdiAoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICkNCit2b2lkIGdsRm9neCAoIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSApDQordm9pZCBnbEZvZ3h2ICggR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMgKQ0KK3ZvaWQgZ2xGcm9udEZhY2UgKCBHTGVudW0gbW9kZSApDQordm9pZCBnbEZydXN0dW1mICggR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhciApDQordm9pZCBnbEZydXN0dW14ICggR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhciApDQordm9pZCBnbEdlblRleHR1cmVzICggR0xzaXplaSBuLCBHTHVpbnQgKnRleHR1cmVzICkNCitHTGVudW0gZ2xHZXRFcnJvciAoIHZvaWQgKQ0KK3ZvaWQgZ2xHZXRJbnRlZ2VydiAoIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyApDQorY29uc3QgR0x1Ynl0ZSAqIGdsR2V0U3RyaW5nICggR0xlbnVtIG5hbWUgKQ0KK3ZvaWQgZ2xIaW50ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIG1vZGUgKQ0KK3ZvaWQgZ2xMaWdodE1vZGVsZiAoIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSApDQordm9pZCBnbExpZ2h0TW9kZWxmdiAoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICkNCit2b2lkIGdsTGlnaHRNb2RlbHggKCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0gKQ0KK3ZvaWQgZ2xMaWdodE1vZGVseHYgKCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApDQordm9pZCBnbExpZ2h0ZiAoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICkNCit2b2lkIGdsTGlnaHRmdiAoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMgKQ0KK3ZvaWQgZ2xMaWdodHggKCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSApDQordm9pZCBnbExpZ2h0eHYgKCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zICkNCit2b2lkIGdsTGluZVdpZHRoICggR0xmbG9hdCB3aWR0aCApDQordm9pZCBnbExpbmVXaWR0aHggKCBHTGZpeGVkIHdpZHRoICkNCit2b2lkIGdsTG9hZElkZW50aXR5ICggdm9pZCApDQordm9pZCBnbExvYWRNYXRyaXhmICggY29uc3QgR0xmbG9hdCAqbSApDQordm9pZCBnbExvYWRNYXRyaXh4ICggY29uc3QgR0xmaXhlZCAqbSApDQordm9pZCBnbExvZ2ljT3AgKCBHTGVudW0gb3Bjb2RlICkNCit2b2lkIGdsTWF0ZXJpYWxmICggR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSApDQordm9pZCBnbE1hdGVyaWFsZnYgKCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMgKQ0KK3ZvaWQgZ2xNYXRlcmlhbHggKCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtICkNCit2b2lkIGdsTWF0ZXJpYWx4diAoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApDQordm9pZCBnbE1hdHJpeE1vZGUgKCBHTGVudW0gbW9kZSApDQordm9pZCBnbE11bHRNYXRyaXhmICggY29uc3QgR0xmbG9hdCAqbSApDQordm9pZCBnbE11bHRNYXRyaXh4ICggY29uc3QgR0xmaXhlZCAqbSApDQordm9pZCBnbE11bHRpVGV4Q29vcmQ0ZiAoIEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIsIEdMZmxvYXQgcSApDQordm9pZCBnbE11bHRpVGV4Q29vcmQ0eCAoIEdMZW51bSB0YXJnZXQsIEdMZml4ZWQgcywgR0xmaXhlZCB0LCBHTGZpeGVkIHIsIEdMZml4ZWQgcSApDQordm9pZCBnbE5vcm1hbDNmICggR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueiApDQordm9pZCBnbE5vcm1hbDN4ICggR0xmaXhlZCBueCwgR0xmaXhlZCBueSwgR0xmaXhlZCBueiApDQordm9pZCBnbE5vcm1hbFBvaW50ZXIgKCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciApDQordm9pZCBnbE9ydGhvZiAoIEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIgKQ0KK3ZvaWQgZ2xPcnRob3ggKCBHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyICkNCit2b2lkIGdsUGl4ZWxTdG9yZWkgKCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtICkNCit2b2lkIGdsUG9pbnRTaXplICggR0xmbG9hdCBzaXplICkNCit2b2lkIGdsUG9pbnRTaXpleCAoIEdMZml4ZWQgc2l6ZSApDQordm9pZCBnbFBvbHlnb25PZmZzZXQgKCBHTGZsb2F0IGZhY3RvciwgR0xmbG9hdCB1bml0cyApDQordm9pZCBnbFBvbHlnb25PZmZzZXR4ICggR0xmaXhlZCBmYWN0b3IsIEdMZml4ZWQgdW5pdHMgKQ0KK3ZvaWQgZ2xQb3BNYXRyaXggKCB2b2lkICkNCit2b2lkIGdsUHVzaE1hdHJpeCAoIHZvaWQgKQ0KK3ZvaWQgZ2xSZWFkUGl4ZWxzICggR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnBpeGVscyApDQordm9pZCBnbFJvdGF0ZWYgKCBHTGZsb2F0IGFuZ2xlLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6ICkNCit2b2lkIGdsUm90YXRleCAoIEdMZml4ZWQgYW5nbGUsIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHogKQ0KK3ZvaWQgZ2xTYW1wbGVDb3ZlcmFnZSAoIEdMY2xhbXBmIHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0ICkNCit2b2lkIGdsU2FtcGxlQ292ZXJhZ2V4ICggR0xjbGFtcHggdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQgKQ0KK3ZvaWQgZ2xTY2FsZWYgKCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6ICkNCit2b2lkIGdsU2NhbGV4ICggR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiApDQordm9pZCBnbFNjaXNzb3IgKCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCApDQordm9pZCBnbFNoYWRlTW9kZWwgKCBHTGVudW0gbW9kZSApDQordm9pZCBnbFN0ZW5jaWxGdW5jICggR0xlbnVtIGZ1bmMsIEdMaW50IHJlZiwgR0x1aW50IG1hc2sgKQ0KK3ZvaWQgZ2xTdGVuY2lsTWFzayAoIEdMdWludCBtYXNrICkNCit2b2lkIGdsU3RlbmNpbE9wICggR0xlbnVtIGZhaWwsIEdMZW51bSB6ZmFpbCwgR0xlbnVtIHpwYXNzICkNCit2b2lkIGdsVGV4Q29vcmRQb2ludGVyICggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIgKQ0KK3ZvaWQgZ2xUZXhFbnZmICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICkNCit2b2lkIGdsVGV4RW52ZnYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApDQordm9pZCBnbFRleEVudnggKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0gKQ0KK3ZvaWQgZ2xUZXhFbnZ4diAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zICkNCit2b2lkIGdsVGV4SW1hZ2UyRCAoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzICkNCit2b2lkIGdsVGV4UGFyYW1ldGVyZiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSApDQordm9pZCBnbFRleFBhcmFtZXRlcnggKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0gKQ0KK3ZvaWQgZ2xUZXhTdWJJbWFnZTJEICggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMgKQ0KK3ZvaWQgZ2xUcmFuc2xhdGVmICggR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiApDQordm9pZCBnbFRyYW5zbGF0ZXggKCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6ICkNCit2b2lkIGdsVmVydGV4UG9pbnRlciAoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyICkNCit2b2lkIGdsVmlld3BvcnQgKCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCApDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dsc3BlYy0xLjBleHQgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDE5NzU4Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dsc3BlYy0xLjBleHQKQEAgLTAsMCArMSBAQAorR0xiaXRmaWVsZCBnbFF1ZXJ5TWF0cml4eE9FUyAoIEdMZml4ZWQgKm1hbnRpc3NhLCBHTGludCAqZXhwb25lbnQgKQ0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9nbHNwZWMtMS4xIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dsc3BlYy0xLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE0OWE3ZgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9nbHNwZWMtMS4xCkBAIC0wLDAgKzEsNDIgQEAKK3ZvaWQgZ2xCaW5kQnVmZmVyICggR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlciApDQordm9pZCBnbEJ1ZmZlckRhdGEgKCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSwgR0xlbnVtIHVzYWdlICkNCit2b2lkIGdsQnVmZmVyU3ViRGF0YSAoIEdMZW51bSB0YXJnZXQsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaXB0ciBzaXplLCBjb25zdCBHTHZvaWQgKmRhdGEgKQ0KK3ZvaWQgZ2xDbGlwUGxhbmVmICggR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZsb2F0ICplcXVhdGlvbiApDQordm9pZCBnbENsaXBQbGFuZXggKCBHTGVudW0gcGxhbmUsIGNvbnN0IEdMZml4ZWQgKmVxdWF0aW9uICkNCit2b2lkIGdsQ29sb3I0dWIgKCBHTHVieXRlIHJlZCwgR0x1Ynl0ZSBncmVlbiwgR0x1Ynl0ZSBibHVlLCBHTHVieXRlIGFscGhhICkNCit2b2lkIGdsQ29sb3JQb2ludGVyICggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTGludCBvZmZzZXQgKQ0KK3ZvaWQgZ2xEZWxldGVCdWZmZXJzICggR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmJ1ZmZlcnMgKQ0KK3ZvaWQgZ2xEcmF3RWxlbWVudHMgKCBHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIEdMaW50IG9mZnNldCApDQordm9pZCBnbEdlbkJ1ZmZlcnMgKCBHTHNpemVpIG4sIEdMdWludCAqYnVmZmVycyApDQordm9pZCBnbEdldEJvb2xlYW52ICggR0xlbnVtIHBuYW1lLCBHTGJvb2xlYW4gKnBhcmFtcyApDQordm9pZCBnbEdldEJ1ZmZlclBhcmFtZXRlcml2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zICkNCit2b2lkIGdsR2V0Q2xpcFBsYW5lZiAoIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqZXFuICkNCit2b2lkIGdsR2V0Q2xpcFBsYW5leCAoIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqZXFuICkNCit2b2lkIGdsR2V0Rml4ZWR2ICggR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMgKQ0KK3ZvaWQgZ2xHZXRGbG9hdHYgKCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyApDQordm9pZCBnbEdldExpZ2h0ZnYgKCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zICkNCit2b2lkIGdsR2V0TGlnaHR4diAoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMgKQ0KK3ZvaWQgZ2xHZXRNYXRlcmlhbGZ2ICggR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zICkNCit2b2lkIGdsR2V0TWF0ZXJpYWx4diAoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyApDQordm9pZCBnbEdldFRleEVudml2ICggR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zICkNCit2b2lkIGdsR2V0VGV4RW52eHYgKCBHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyApDQordm9pZCBnbEdldFRleFBhcmFtZXRlcmZ2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMgKQ0KK3ZvaWQgZ2xHZXRUZXhQYXJhbWV0ZXJpdiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyApDQordm9pZCBnbEdldFRleFBhcmFtZXRlcnh2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMgKQ0KK0dMYm9vbGVhbiBnbElzQnVmZmVyICggR0x1aW50IGJ1ZmZlciApDQorR0xib29sZWFuIGdsSXNFbmFibGVkICggR0xlbnVtIGNhcCApDQorR0xib29sZWFuIGdsSXNUZXh0dXJlICggR0x1aW50IHRleHR1cmUgKQ0KK3ZvaWQgZ2xOb3JtYWxQb2ludGVyICggR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTGludCBvZmZzZXQgKQ0KK3ZvaWQgZ2xQb2ludFBhcmFtZXRlcmYgKCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0gKQ0KK3ZvaWQgZ2xQb2ludFBhcmFtZXRlcmZ2ICggR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMgKQ0KK3ZvaWQgZ2xQb2ludFBhcmFtZXRlcnggKCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0gKQ0KK3ZvaWQgZ2xQb2ludFBhcmFtZXRlcnh2ICggR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMgKQ0KK3ZvaWQgZ2xQb2ludFNpemVQb2ludGVyT0VTICggR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIgKQ0KK3ZvaWQgZ2xUZXhDb29yZFBvaW50ZXIgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMaW50IG9mZnNldCApDQordm9pZCBnbFRleEVudmkgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtICkNCit2b2lkIGdsVGV4RW52aXYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMgKQ0KK3ZvaWQgZ2xUZXhQYXJhbWV0ZXJmdiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICkNCit2b2lkIGdsVGV4UGFyYW1ldGVyaSAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0gKQ0KK3ZvaWQgZ2xUZXhQYXJhbWV0ZXJpdiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyApDQordm9pZCBnbFRleFBhcmFtZXRlcnh2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMgKQ0KK3ZvaWQgZ2xWZXJ0ZXhQb2ludGVyICggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTGludCBvZmZzZXQgKQ0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9nbHNwZWMtMS4xZXh0IGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dsc3BlYy0xLjFleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MwOGM3MwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9nbHNwZWMtMS4xZXh0CkBAIC0wLDAgKzEsMTYgQEAKK3ZvaWQgZ2xDdXJyZW50UGFsZXR0ZU1hdHJpeE9FUyAoIEdMdWludCBtYXRyaXhwYWxldHRlaW5kZXggKQ0KK3ZvaWQgZ2xEcmF3VGV4Zk9FUyAoIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgd2lkdGgsIEdMZmxvYXQgaGVpZ2h0ICkNCit2b2lkIGdsRHJhd1RleGZ2T0VTICggY29uc3QgR0xmbG9hdCAqY29vcmRzICkNCit2b2lkIGdsRHJhd1RleGlPRVMgKCBHTGludCB4LCBHTGludCB5LCBHTGludCB6LCBHTGludCB3aWR0aCwgR0xpbnQgaGVpZ2h0ICkNCit2b2lkIGdsRHJhd1RleGl2T0VTICggY29uc3QgR0xpbnQgKmNvb3JkcyApDQordm9pZCBnbERyYXdUZXhzT0VTICggR0xzaG9ydCB4LCBHTHNob3J0IHksIEdMc2hvcnQgeiwgR0xzaG9ydCB3aWR0aCwgR0xzaG9ydCBoZWlnaHQgKQ0KK3ZvaWQgZ2xEcmF3VGV4c3ZPRVMgKCBjb25zdCBHTHNob3J0ICpjb29yZHMgKQ0KK3ZvaWQgZ2xEcmF3VGV4eE9FUyAoIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHosIEdMZml4ZWQgd2lkdGgsIEdMZml4ZWQgaGVpZ2h0ICkNCit2b2lkIGdsRHJhd1RleHh2T0VTICggY29uc3QgR0xmaXhlZCAqY29vcmRzICkNCit2b2lkIGdsRW5hYmxlICggR0xlbnVtIGNhcCApDQordm9pZCBnbEVuYWJsZUNsaWVudFN0YXRlICggR0xlbnVtIGFycmF5ICkNCit2b2lkIGdsTG9hZFBhbGV0dGVGcm9tTW9kZWxWaWV3TWF0cml4T0VTICggdm9pZCApDQordm9pZCBnbE1hdHJpeEluZGV4UG9pbnRlck9FUyAoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyICkNCit2b2lkIGdsTWF0cml4SW5kZXhQb2ludGVyT0VTICggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTGludCBvZmZzZXQgKQ0KK3ZvaWQgZ2xXZWlnaHRQb2ludGVyT0VTICggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIgKQ0KK3ZvaWQgZ2xXZWlnaHRQb2ludGVyT0VTICggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTGludCBvZmZzZXQgKQ0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9nbHNwZWMtMS4xZXh0cGFjayBiL29wZW5nbC90b29scy9nbGdlbi9nbHNwZWMtMS4xZXh0cGFjawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTllNmQyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dsc3BlYy0xLjFleHRwYWNrCkBAIC0wLDAgKzEsMzggQEAKK3ZvaWQgZ2xCaW5kRnJhbWVidWZmZXJPRVMgKCBHTGludCB0YXJnZXQsIEdMaW50IGZyYW1lYnVmZmVyICkKK3ZvaWQgZ2xCaW5kUmVuZGVyYnVmZmVyT0VTICggR0xpbnQgdGFyZ2V0LCBHTGludCByZW5kZXJidWZmZXIgKQordm9pZCBnbEJpbmRUZXh0dXJlICggR0xpbnQgdGFyZ2V0LCBHTGludCB0ZXh0dXJlICkKK3ZvaWQgZ2xCbGVuZEVxdWF0aW9uICggR0xpbnQgbW9kZSApCit2b2lkIGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlICggR0xpbnQgbW9kZVJHQiwgR0xpbnQgbW9kZUFscGhhICkKK3ZvaWQgZ2xCbGVuZEZ1bmNTZXBhcmF0ZSAoIEdMaW50IHNyY1JHQiwgR0xpbnQgZHN0UkdCLCBHTGludCBzcmNBbHBoYSwgR0xpbnQgZHN0QWxwaGEgKQorR0xpbnQgZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzT0VTICggR0xpbnQgdGFyZ2V0ICkKK3ZvaWQgZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCAoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEgKQordm9pZCBnbENvcHlUZXhJbWFnZTJEICggR0xpbnQgdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHdpZHRoLCBHTGludCBoZWlnaHQsIEdMaW50IGJvcmRlciApCit2b2lkIGdsRGVsZXRlRnJhbWVidWZmZXJzT0VTICggR0xpbnQgbiwgR0xpbnQgKmZyYW1lYnVmZmVycyApCit2b2lkIGdsRGVsZXRlUmVuZGVyYnVmZmVyc09FUyAoIEdMaW50IG4sIEdMaW50ICpyZW5kZXJidWZmZXJzICkKK3ZvaWQgZ2xFbmFibGUgKCBHTGludCBjYXAgKQordm9pZCBnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyT0VTICggR0xpbnQgdGFyZ2V0LCBHTGludCBhdHRhY2htZW50LCBHTGludCByZW5kZXJidWZmZXJ0YXJnZXQsIEdMaW50IHJlbmRlcmJ1ZmZlciApCit2b2lkIGdsRnJhbWVidWZmZXJUZXh0dXJlMkRPRVMgKCBHTGludCB0YXJnZXQsIEdMaW50IGF0dGFjaG1lbnQsIEdMaW50IHRleHRhcmdldCwgR0xpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwgKQordm9pZCBnbEdlbmVyYXRlTWlwbWFwT0VTICggR0xpbnQgdGFyZ2V0ICkKK3ZvaWQgZ2xHZW5GcmFtZWJ1ZmZlcnNPRVMgKCBHTGludCBuLCBHTGludCAqZnJhbWVidWZmZXJzICkKK3ZvaWQgZ2xHZW5SZW5kZXJidWZmZXJzT0VTICggR0xpbnQgbiwgR0xpbnQgKnJlbmRlcmJ1ZmZlcnMgKQordm9pZCBnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2T0VTICggR0xpbnQgdGFyZ2V0LCBHTGludCBhdHRhY2htZW50LCBHTGludCBwbmFtZSwgR0xpbnQgKnBhcmFtcyApCit2b2lkIGdsR2V0SW50ZWdlcnYgKCBHTGludCBwbmFtZSwgR0xpbnQgKnBhcmFtcyApCit2b2lkIGdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZPRVMgKCBHTGludCB0YXJnZXQsIEdMaW50IHBuYW1lLCBHTGludCAqcGFyYW1zICkKK3ZvaWQgZ2xHZXRUZXhHZW5mdiAoIEdMaW50IGNvb3JkLCBHTGludCBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zICkKK3ZvaWQgZ2xHZXRUZXhHZW5pdiAoIEdMaW50IGNvb3JkLCBHTGludCBwbmFtZSwgR0xpbnQgKnBhcmFtcyApCit2b2lkIGdsR2V0VGV4R2VueHYgKCBHTGludCBjb29yZCwgR0xpbnQgcG5hbWUsIEdMaW50ICpwYXJhbXMgKQorR0xib29sZWFuIGdsSXNGcmFtZWJ1ZmZlck9FUyAoIEdMaW50IGZyYW1lYnVmZmVyICkKK0dMYm9vbGVhbiBnbElzUmVuZGVyYnVmZmVyT0VTICggR0xpbnQgcmVuZGVyYnVmZmVyICkKK3ZvaWQgZ2xSZW5kZXJidWZmZXJTdG9yYWdlT0VTICggR0xpbnQgdGFyZ2V0LCBHTGludCBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgd2lkdGgsIEdMaW50IGhlaWdodCApCit2b2lkIGdsU3RlbmNpbE9wICggR0xpbnQgZmFpbCwgR0xpbnQgemZhaWwsIEdMaW50IHpwYXNzICkKK3ZvaWQgZ2xUZXhFbnZmICggR0xpbnQgdGFyZ2V0LCBHTGludCBwbmFtZSwgR0xmbG9hdCBwYXJhbSApCit2b2lkIGdsVGV4RW52ZnYgKCBHTGludCB0YXJnZXQsIEdMaW50IHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMgKQordm9pZCBnbFRleEVudnggKCBHTGludCB0YXJnZXQsIEdMaW50IHBuYW1lLCBHTGludCBwYXJhbSApCit2b2lkIGdsVGV4RW52eHYgKCBHTGludCB0YXJnZXQsIEdMaW50IHBuYW1lLCBHTGludCAqcGFyYW1zICkKK3ZvaWQgZ2xUZXhHZW5mICggR0xpbnQgY29vcmQsIEdMaW50IHBuYW1lLCBHTGZsb2F0IHBhcmFtICkKK3ZvaWQgZ2xUZXhHZW5mdiAoIEdMaW50IGNvb3JkLCBHTGludCBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zICkKK3ZvaWQgZ2xUZXhHZW5pICggR0xpbnQgY29vcmQsIEdMaW50IHBuYW1lLCBHTGludCBwYXJhbSApCit2b2lkIGdsVGV4R2VuaXYgKCBHTGludCBjb29yZCwgR0xpbnQgcG5hbWUsIEdMaW50ICpwYXJhbXMgKQordm9pZCBnbFRleEdlbnggKCBHTGludCBjb29yZCwgR0xpbnQgcG5hbWUsIEdMaW50IHBhcmFtICkKK3ZvaWQgZ2xUZXhHZW54diAoIEdMaW50IGNvb3JkLCBHTGludCBwbmFtZSwgR0xpbnQgKnBhcmFtcyApCit2b2lkIGdsVGV4UGFyYW1ldGVyZiAoIEdMaW50IHRhcmdldCwgR0xpbnQgcG5hbWUsIEdMZmxvYXQgcGFyYW0gKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dsc3BlYy1jaGVja3MgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLWNoZWNrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODRlZDY1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dsc3BlYy1jaGVja3MKQEAgLTAsMCArMSw1OSBAQAorZ2xDbGlwUGxhbmVmIGNoZWNrIGVxdWF0aW9uIDQNCitnbENsaXBQbGFuZXggY2hlY2sgZXF1YXRpb24gNA0KK2dsRGVsZXRlQnVmZmVycyBjaGVjayBidWZmZXJzIG4gDQorZ2xEZWxldGVUZXh0dXJlcyBjaGVjayB0ZXh0dXJlcyBuDQorZ2xEcmF3RWxlbWVudHMgY2hlY2tfQUlPT0JFIGluZGljZXMgY291bnQNCitnbEZvZyBpZmNoZWNrIHBhcmFtcyAxIHBuYW1lIEdMX0ZPR19NT0RFLEdMX0ZPR19ERU5TSVRZLEdMX0ZPR19TVEFSVCxHTF9GT0dfRU5EIGlmY2hlY2sgcGFyYW1zIDQgcG5hbWUgR0xfRk9HX0NPTE9SDQorZ2xHZW5CdWZmZXJzIGNoZWNrIGJ1ZmZlcnMgbg0KK2dsR2VuVGV4dHVyZXMgY2hlY2sgdGV4dHVyZXMgbg0KK2dsR2V0Q2xpcFBsYW5lIGNoZWNrIGVxbiA0DQorZ2xHZXRJbnRlZ2VydiBpZmNoZWNrIHBhcmFtcyAxIHBuYW1lIEdMX0FMUEhBX0JJVFMsR0xfQUxQSEFfVEVTVF9GVU5DLEdMX0FMUEhBX1RFU1RfUkVGLEdMX0JMRU5EX0RTVCxHTF9CTFVFX0JJVFMsR0xfQ09MT1JfQVJSQVlfQlVGRkVSX0JJTkRJTkcsR0xfQ09MT1JfQVJSQVlfU0laRSxHTF9DT0xPUl9BUlJBWV9TVFJJREUsR0xfQ09MT1JfQVJSQVlfVFlQRSxHTF9DVUxMX0ZBQ0UsR0xfREVQVEhfQklUUyxHTF9ERVBUSF9DTEVBUl9WQUxVRSxHTF9ERVBUSF9GVU5DLEdMX0RFUFRIX1dSSVRFTUFTSyxHTF9GT0dfREVOU0lUWSxHTF9GT0dfRU5ELEdMX0ZPR19NT0RFLEdMX0ZPR19TVEFSVCxHTF9GUk9OVF9GQUNFLEdMX0dSRUVOX0JJVFMsR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVRfT0VTLEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRV9PRVMsR0xfTElHSFRfTU9ERUxfVFdPX1NJREUsR0xfTElORV9TTU9PVEhfSElOVCxHTF9MSU5FX1dJRFRILEdMX0xPR0lDX09QX01PREUsR0xfTUFUUklYX0lOREVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FUyxHTF9NQVRSSVhfSU5ERVhfQVJSQVlfU0laRV9PRVMsR0xfTUFUUklYX0lOREVYX0FSUkFZX1NUUklERV9PRVMsR0xfTUFUUklYX0lOREVYX0FSUkFZX1RZUEVfT0VTLEdMX01BVFJJWF9NT0RFLEdMX01BWF9DTElQX1BMQU5FUyxHTF9NQVhfRUxFTUVOVFNfSU5ESUNFUyxHTF9NQVhfRUxFTUVOVFNfVkVSVElDRVMsR0xfTUFYX0xJR0hUUyxHTF9NQVhfTU9ERUxWSUVXX1NUQUNLX0RFUFRILEdMX01BWF9QQUxFVFRFX01BVFJJQ0VTX09FUyxHTF9NQVhfUFJPSkVDVElPTl9TVEFDS19ERVBUSCxHTF9NQVhfVEVYVFVSRV9TSVpFLEdMX01BWF9URVhUVVJFX1NUQUNLX0RFUFRILEdMX01BWF9URVhUVVJFX1VOSVRTLEdMX01BWF9WRVJURVhfVU5JVFNfT0VTLEdMX01PREVMVklFV19TVEFDS19ERVBUSCxHTF9OT1JNQUxfQVJSQVlfQlVGRkVSX0JJTkRJTkcsR0xfTk9STUFMX0FSUkFZX1NUUklERSxHTF9OT1JNQUxfQVJSQVlfVFlQRSxHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMsR0xfUEFDS19BTElHTk1FTlQsR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5ULEdMX1BPSU5UX1NJWkUsR0xfUE9JTlRfU0laRV9BUlJBWV9CVUZGRVJfQklORElOR19PRVMsR0xfUE9JTlRfU0laRV9BUlJBWV9TVFJJREVfT0VTLEdMX1BPSU5UX1NJWkVfQVJSQVlfVFlQRV9PRVMsR0xfUE9JTlRfU01PT1RIX0hJTlQsR0xfUE9MWUdPTl9PRkZTRVRfRkFDVE9SLEdMX1BPTFlHT05fT0ZGU0VUX1VOSVRTLEdMX1BST0pFQ1RJT05fU1RBQ0tfREVQVEgsR0xfUkVEX0JJVFMsR0xfU0hBREVfTU9ERUwsR0xfU1RFTkNJTF9CSVRTLEdMX1NURU5DSUxfQ0xFQVJfVkFMVUUsR0xfU1RFTkNJTF9GQUlMLEdMX1NURU5DSUxfRlVOQyxHTF9TVEVOQ0lMX1BBU1NfREVQVEhfRkFJTCxHTF9TVEVOQ0lMX1BBU1NfREVQVEhfUEFTUyxHTF9TVEVOQ0lMX1JFRixHTF9TVEVOQ0lMX1ZBTFVFX01BU0ssR0xfU1RFTkNJTF9XUklURU1BU0ssR0xfU1VCUElYRUxfQklUUyxHTF9URVhUVVJFX0JJTkRJTkdfMkQsR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9CVUZGRVJfQklORElORyxHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1NJWkUsR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TVFJJREUsR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9UWVBFLEdMX1RFWFRVUkVfU1RBQ0tfREVQVEgsR0xfVU5QQUNLX0FMSUdOTUVOVCxHTF9WRVJURVhfQVJSQVlfQlVGRkVSX0JJTkRJTkcsR0xfVkVSVEVYX0FSUkFZX1NJWkUsR0xfVkVSVEVYX0FSUkFZX1NUUklERSxHTF9WRVJURVhfQVJSQVlfVFlQRSxHTF9XRUlHSFRfQVJSQVlfQlVGRkVSX0JJTkRJTkdfT0VTLEdMX1dFSUdIVF9BUlJBWV9TSVpFX09FUyxHTF9XRUlHSFRfQVJSQVlfU1RSSURFX09FUyxHTF9XRUlHSFRfQVJSQVlfVFlQRV9PRVMgaWZjaGVjayBwYXJhbXMgMiBwbmFtZSBHTF9BTElBU0VEX1BPSU5UX1NJWkVfUkFOR0UsR0xfQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFLEdMX0RFUFRIX1JBTkdFLEdMX01BWF9WSUVXUE9SVF9ESU1TLEdMX1NNT09USF9MSU5FX1dJRFRIX1JBTkdFLEdMX1NNT09USF9QT0lOVF9TSVpFX1JBTkdFIGlmY2hlY2sgcGFyYW1zIDQgcG5hbWUgR0xfQ09MT1JfQ0xFQVJfVkFMVUUsR0xfQ09MT1JfV1JJVEVNQVNLLEdMX1NDSVNTT1JfQk9YLEdMX1ZJRVdQT1JUIGlmY2hlY2sgcGFyYW1zIDE2IHBuYW1lIEdMX01PREVMVklFV19NQVRSSVgsR0xfTU9ERUxWSUVXX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVMsR0xfUFJPSkVDVElPTl9NQVRSSVgsR0xfUFJPSkVDVElPTl9NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTLEdMX1RFWFRVUkVfTUFUUklYLEdMX1RFWFRVUkVfTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUyBpZmNoZWNrIHBhcmFtcyBfTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTIHBuYW1lIEdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTLEdMX0ZPR19DT0xPUixHTF9MSUdIVF9NT0RFTF9BTUJJRU5UDQorZ2xHZXRMaWdodCBpZmNoZWNrIHBhcmFtcyAxIHBuYW1lIEdMX1NQT1RfRVhQT05FTlQsR0xfU1BPVF9DVVRPRkYsR0xfQ09OU1RBTlRfQVRURU5VQVRJT04sR0xfTElORUFSX0FUVEVOVUFUSU9OLEdMX1FVQURSQVRJQ19BVFRFTlVBVElPTiBpZmNoZWNrIHBhcmFtcyAzIHBuYW1lIEdMX1NQT1RfRElSRUNUSU9OIGlmY2hlY2sgcGFyYW1zIDQgcG5hbWUgR0xfQU1CSUVOVCxHTF9ESUZGVVNFLEdMX1NQRUNVTEFSLEdMX0VNSVNTSU9ODQorZ2xHZXRNYXRlcmlhbCBpZmNoZWNrIHBhcmFtcyAxIHBuYW1lIEdMX1NISU5JTkVTUyBpZmNoZWNrIHBhcmFtcyA0IHBuYW1lIEdMX0FNQklFTlQsR0xfRElGRlVTRSxHTF9TUEVDVUxBUixHTF9FTUlTU0lPTixHTF9BTUJJRU5UX0FORF9ESUZGVVNFDQorZ2xHZXRUZXhFbnYgaWZjaGVjayBwYXJhbXMgMSBwbmFtZSBHTF9URVhUVVJFX0VOVl9NT0RFLEdMX0NPTUJJTkVfUkdCLEdMX0NPTUJJTkVfQUxQSEEgaWZjaGVjayBwYXJhbXMgNCBwbmFtZSBHTF9URVhUVVJFX0VOVl9DT0xPUg0KK2dsR2V0VGV4UGFyYW1ldGVyIGNoZWNrIHBhcmFtcyAxDQorZ2xMaWdodE1vZGVsIGlmY2hlY2sgcGFyYW1zIDEgcG5hbWUgR0xfTElHSFRfTU9ERUxfVFdPX1NJREUgaWZjaGVjayBwYXJhbXMgNCBwbmFtZSBHTF9MSUdIVF9NT0RFTF9BTUJJRU5UDQorZ2xMaWdodCBpZmNoZWNrIHBhcmFtcyAxIHBuYW1lIEdMX1NQT1RfRVhQT05FTlQsR0xfU1BPVF9DVVRPRkYsR0xfQ09OU1RBTlRfQVRURU5VQVRJT04sR0xfTElORUFSX0FUVEVOVUFUSU9OLEdMX1FVQURSQVRJQ19BVFRFTlVBVElPTiBpZmNoZWNrIHBhcmFtcyAzIHBuYW1lIEdMX1NQT1RfRElSRUNUSU9OIGlmY2hlY2sgcGFyYW1zIDQgcG5hbWUgR0xfQU1CSUVOVCxHTF9ESUZGVVNFLEdMX1NQRUNVTEFSLEdMX0VNSVNTSU9ODQorZ2xMb2FkTWF0cml4IGNoZWNrIG0gMTYNCitnbE1hdGVyaWFsIGlmY2hlY2sgcGFyYW1zIDEgcG5hbWUgR0xfU0hJTklORVNTIGlmY2hlY2sgcGFyYW1zIDQgcG5hbWUgR0xfQU1CSUVOVCxHTF9ESUZGVVNFLEdMX1NQRUNVTEFSLEdMX0VNSVNTSU9OLEdMX0FNQklFTlRfQU5EX0RJRkZVU0UNCitnbE11bHRNYXRyaXggY2hlY2sgbSAxNg0KK2dsUG9pbnRQYXJhbWV0ZXIgY2hlY2sgcGFyYW1zIDENCitnbFRleEVudiBpZmNoZWNrIHBhcmFtcyAxIHBuYW1lIEdMX1RFWFRVUkVfRU5WX01PREUsR0xfQ09NQklORV9SR0IsR0xfQ09NQklORV9BTFBIQSBpZmNoZWNrIHBhcmFtcyA0IHBuYW1lIEdMX1RFWFRVUkVfRU5WX0NPTE9SDQorZ2xUZXhJbWFnZTJEIG51bGxBbGxvd2VkDQorZ2xUZXhTdWJJbWFnZTJEIG51bGxBbGxvd2VkDQorZ2xCdWZmZXJEYXRhIG51bGxBbGxvd2VkDQorZ2xUZXhQYXJhbWV0ZXIgY2hlY2sgcGFyYW1zIDENCitnbFF1ZXJ5TWF0cml4eE9FUyBjaGVjayBtYW50aXNzYSAxNiBjaGVjayBleHBvbmVudCAxNiByZXR1cm4gLTENCitnbERyYXdUZXhmdk9FUyBjaGVjayBjb29yZHMgNQ0KK2dsRHJhd1RleGl2T0VTIGNoZWNrIGNvb3JkcyA1DQorZ2xEcmF3VGV4c3ZPRVMgY2hlY2sgY29vcmRzIDUNCitnbERyYXdUZXh4dk9FUyBjaGVjayBjb29yZHMgNQ0KK2dsQmluZEZyYW1lYnVmZmVyT0VTIHVuc3VwcG9ydGVkDQorZ2xCaW5kUmVuZGVyYnVmZmVyT0VTIHVuc3VwcG9ydGVkDQorZ2xCbGVuZEVxdWF0aW9uIHVuc3VwcG9ydGVkDQorZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGUgdW5zdXBwb3J0ZWQNCitnbEJsZW5kRnVuY1NlcGFyYXRlIHVuc3VwcG9ydGVkDQorZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzT0VTIHVuc3VwcG9ydGVkIHJldHVybiAwDQorZ2xDdXJyZW50UGFsZXR0ZU1hdHJpeE9FUyB1bnN1cHBvcnRlZA0KK2dsRGVsZXRlRnJhbWVidWZmZXJzT0VTIHVuc3VwcG9ydGVkDQorZ2xEZWxldGVSZW5kZXJidWZmZXJzT0VTIHVuc3VwcG9ydGVkDQorZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlck9FUyB1bnN1cHBvcnRlZA0KK2dsRnJhbWVidWZmZXJTdG9yYWdlT0VTIHVuc3VwcG9ydGVkDQorZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE9FUyB1bnN1cHBvcnRlZA0KK2dsR2VuRnJhbWVidWZmZXJzT0VTIHVuc3VwcG9ydGVkDQorZ2xHZW5SZW5kZXJidWZmZXJzT0VTIHVuc3VwcG9ydGVkDQorZ2xHZW5lcmF0ZU1pcG1hcE9FUyB1bnN1cHBvcnRlZA0KK2dsR2V0QnVmZmVyUGFyYW1ldGVyIHVuc3VwcG9ydGVkDQorZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdk9FUyB1bnN1cHBvcnRlZA0KK2dsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZPRVMgdW5zdXBwb3J0ZWQNCitnbEdldFRleEdlbiB1bnN1cHBvcnRlZA0KK2dsSXNGcmFtZWJ1ZmZlck9FUyB1bnN1cHBvcnRlZCByZXR1cm4gSk5JX0ZBTFNFDQorZ2xJc1JlbmRlcmJ1ZmZlck9FUyB1bnN1cHBvcnRlZCByZXR1cm4gSk5JX0ZBTFNFDQorZ2xMb2FkUGFsZXR0ZUZyb21Nb2RlbFZpZXdNYXRyaXhPRVMgdW5zdXBwb3J0ZWQNCitnbE1hdHJpeEluZGV4UG9pbnRlck9FUyB1bnN1cHBvcnRlZA0KK2dsUmVuZGVyYnVmZmVyU3RvcmFnZU9FUyB1bnN1cHBvcnRlZCByZXR1cm4gZmFsc2UNCitnbFRleEdlbiB1bnN1cHBvcnRlZA0KK2dsVGV4R2VuZiB1bnN1cHBvcnRlZA0KK2dsVGV4R2VuaSB1bnN1cHBvcnRlZA0KK2dsVGV4R2VueCB1bnN1cHBvcnRlZA0KK2dsV2VpZ2h0UG9pbnRlck9FUyB1bnN1cHBvcnRlZA0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zcmMvQ0Z1bmMuamF2YSBiL29wZW5nbC90b29scy9nbGdlbi9zcmMvQ0Z1bmMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzk0ZjQxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9DRnVuYy5qYXZhCkBAIC0wLDAgKzEsMTU1IEBACisNCitpbXBvcnQgamF2YS51dGlsLio7DQorDQorcHVibGljIGNsYXNzIENGdW5jIHsNCisNCisgICAgU3RyaW5nIG9yaWdpbmFsOw0KKw0KKyAgICBDVHlwZSBmdHlwZTsNCisgICAgU3RyaW5nIGZuYW1lOw0KKw0KKyAgICBMaXN0PFN0cmluZz4gYXJnTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCisgICAgTGlzdDxDVHlwZT4gYXJnVHlwZXMgPSBuZXcgQXJyYXlMaXN0PENUeXBlPigpOw0KKw0KKyAgICBib29sZWFuIGhhc1BvaW50ZXJBcmcgPSBmYWxzZTsNCisgICAgYm9vbGVhbiBoYXNUeXBlZFBvaW50ZXJBcmcgPSBmYWxzZTsNCisNCisgICAgcHVibGljIENGdW5jKFN0cmluZyBvcmlnaW5hbCkgew0KKyAgICAgICAgdGhpcy5vcmlnaW5hbCA9IG9yaWdpbmFsOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3JpZ2luYWwoKSB7DQorICAgICAgICByZXR1cm4gb3JpZ2luYWw7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgZm5hbWUpIHsNCisgICAgICAgIHRoaXMuZm5hbWUgPSBmbmFtZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7DQorICAgICAgICByZXR1cm4gZm5hbWU7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0VHlwZShDVHlwZSBmdHlwZSkgew0KKyAgICAgICAgdGhpcy5mdHlwZSA9IGZ0eXBlOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBDVHlwZSBnZXRUeXBlKCkgew0KKyAgICAgICAgcmV0dXJuIGZ0eXBlOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIGFkZEFyZ3VtZW50KFN0cmluZyBhcmdOYW1lLCBDVHlwZSBhcmdUeXBlKSB7DQorICAgICAgICBhcmdOYW1lcy5hZGQoYXJnTmFtZSk7DQorICAgICAgICBhcmdUeXBlcy5hZGQoYXJnVHlwZSk7DQorDQorICAgICAgICBpZiAoYXJnVHlwZS5pc1BvaW50ZXIoKSkgew0KKyAgICAgICAgICAgIGhhc1BvaW50ZXJBcmcgPSB0cnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGFyZ1R5cGUuaXNUeXBlZFBvaW50ZXIoKSkgew0KKyAgICAgICAgICAgIGhhc1R5cGVkUG9pbnRlckFyZyA9IHRydWU7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHVibGljIGludCBnZXROdW1BcmdzKCkgew0KKyAgICAgICAgcmV0dXJuIGFyZ05hbWVzLnNpemUoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGdldEFyZ0luZGV4KFN0cmluZyBuYW1lKSB7DQorICAgICAgICBpbnQgbGVuID0gYXJnTmFtZXMuc2l6ZSgpOw0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgew0KKyAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhhcmdOYW1lcy5nZXQoaSkpKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldEFyZ05hbWUoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gYXJnTmFtZXMuZ2V0KGluZGV4KTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgQ1R5cGUgZ2V0QXJnVHlwZShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiBhcmdUeXBlcy5nZXQoaW5kZXgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGhhc1BvaW50ZXJBcmcoKSB7DQorICAgICAgICByZXR1cm4gaGFzUG9pbnRlckFyZzsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNUeXBlZFBvaW50ZXJBcmcoKSB7DQorICAgICAgICByZXR1cm4gaGFzVHlwZWRQb2ludGVyQXJnOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQorICAgICAgICBTdHJpbmcgcyA9ICAiRnVuY3Rpb24gIiArIGZuYW1lICsgIiByZXR1cm5zICIgKyBmdHlwZSArICI6ICI7DQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ05hbWVzLnNpemUoKTsgaSsrKSB7DQorICAgICAgICAgICAgaWYgKGkgPiAwKSB7DQorICAgICAgICAgICAgICAgIHMgKz0gIiwgIjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcyArPSBhcmdUeXBlcy5nZXQoaSkgKyAiICIgKyBhcmdOYW1lcy5nZXQoaSk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gczsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgc3RhdGljIENGdW5jIHBhcnNlQ0Z1bmMoU3RyaW5nIHMpIHsNCisgICAgICAgIENGdW5jIGNmdW5jID0gbmV3IENGdW5jKHMpOw0KKyAgICAgICAgU3RyaW5nW10gdG9rZW5zID0gcy5zcGxpdCgiXFxzIik7DQorDQorICAgICAgICBpbnQgaSA9IDA7DQorICAgICAgICBDVHlwZSBmdHlwZSA9IG5ldyBDVHlwZSgpOw0KKyAgICAgICAgU3RyaW5nIGZ0eXBlTmFtZSA9IHRva2Vuc1tpKytdOw0KKyAgICAgICAgaWYgKGZ0eXBlTmFtZS5lcXVhbHMoImNvbnN0IikpIHsNCisgICAgICAgICAgICBmdHlwZS5zZXRJc0NvbnN0KHRydWUpOw0KKyAgICAgICAgICAgIGZ0eXBlTmFtZSA9IHRva2Vuc1tpKytdOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZnR5cGUuc2V0QmFzZVR5cGUoZnR5cGVOYW1lKTsNCisNCisgICAgICAgIFN0cmluZyBmbmFtZSA9IHRva2Vuc1tpKytdOw0KKyAgICAgICAgaWYgKGZuYW1lLmVxdWFscygiKiIpKSB7DQorICAgICAgICAgICAgZnR5cGUuc2V0SXNQb2ludGVyKHRydWUpOw0KKyAgICAgICAgICAgIGZuYW1lID0gdG9rZW5zW2krK107DQorICAgICAgICB9DQorCQ0KKyAgICAgICAgY2Z1bmMuc2V0TmFtZShmbmFtZSk7DQorICAgICAgICBjZnVuYy5zZXRUeXBlKGZ0eXBlKTsNCisJDQorICAgICAgICB3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsNCisgICAgICAgICAgICBTdHJpbmcgdG9rID0gdG9rZW5zW2krK107DQorCSAgICANCisgICAgICAgICAgICBpZiAodG9rLmVxdWFscygiKCIpKSB7DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAodG9rLmVxdWFscygiKSIpKSB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBDVHlwZSBhcmdUeXBlID0gbmV3IENUeXBlKCk7DQorCSAgICANCisgICAgICAgICAgICBTdHJpbmcgYXJnVHlwZU5hbWUgPSB0b2s7DQorICAgICAgICAgICAgU3RyaW5nIGFyZ05hbWUgPSAiIjsNCisJICAgIA0KKyAgICAgICAgICAgIGlmIChhcmdUeXBlTmFtZS5lcXVhbHMoImNvbnN0IikpIHsNCisgICAgICAgICAgICAgICAgYXJnVHlwZS5zZXRJc0NvbnN0KHRydWUpOw0KKyAgICAgICAgICAgICAgICBhcmdUeXBlTmFtZSA9IHRva2Vuc1tpKytdOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBhcmdUeXBlLnNldEJhc2VUeXBlKGFyZ1R5cGVOYW1lKTsNCisNCisgICAgICAgICAgICBpZiAoYXJnVHlwZU5hbWUuZXF1YWxzKCJ2b2lkIikpIHsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKwkgICAgDQorICAgICAgICAgICAgYXJnTmFtZSA9IHRva2Vuc1tpKytdOw0KKyAgICAgICAgICAgIGlmIChhcmdOYW1lLnN0YXJ0c1dpdGgoIioiKSkgew0KKyAgICAgICAgICAgICAgICBhcmdUeXBlLnNldElzUG9pbnRlcih0cnVlKTsNCisgICAgICAgICAgICAgICAgYXJnTmFtZSA9IGFyZ05hbWUuc3Vic3RyaW5nKDEsIGFyZ05hbWUubGVuZ3RoKCkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoYXJnTmFtZS5lbmRzV2l0aCgiLCIpKSB7DQorICAgICAgICAgICAgICAgIGFyZ05hbWUgPSBhcmdOYW1lLnN1YnN0cmluZygwLCBhcmdOYW1lLmxlbmd0aCgpIC0gMSk7DQorICAgICAgICAgICAgfQ0KKwkgICAgDQorICAgICAgICAgICAgY2Z1bmMuYWRkQXJndW1lbnQoYXJnTmFtZSwgYXJnVHlwZSk7DQorICAgICAgICB9DQorDQorICAgICAgICByZXR1cm4gY2Z1bmM7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9DVHlwZS5qYXZhIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9DVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMWVjNjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0NUeXBlLmphdmEKQEAgLTAsMCArMSw4NSBAQAorDQorcHVibGljIGNsYXNzIENUeXBlIHsNCisNCisgICAgU3RyaW5nIGJhc2VUeXBlOw0KKyAgICBib29sZWFuIGlzQ29uc3Q7DQorICAgIGJvb2xlYW4gaXNQb2ludGVyOw0KKw0KKyAgICBwdWJsaWMgQ1R5cGUoKSB7DQorICAgIH0NCisNCisgICAgcHVibGljIENUeXBlKFN0cmluZyBiYXNlVHlwZSkgew0KKwlzZXRCYXNlVHlwZShiYXNlVHlwZSk7DQorICAgIH0NCisNCisgICAgcHVibGljIENUeXBlKFN0cmluZyBiYXNlVHlwZSwgYm9vbGVhbiBpc0NvbnN0LCBib29sZWFuIGlzUG9pbnRlcikgew0KKwlzZXRCYXNlVHlwZShiYXNlVHlwZSk7DQorCXNldElzQ29uc3QoaXNDb25zdCk7DQorCXNldElzUG9pbnRlcihpc1BvaW50ZXIpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVjbGFyYXRpb24oKSB7DQorCXJldHVybiBiYXNlVHlwZSArIChpc1BvaW50ZXIgPyAiICoiIDogIiIpOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgdm9pZCBzZXRJc0NvbnN0KGJvb2xlYW4gaXNDb25zdCkgew0KKwl0aGlzLmlzQ29uc3QgPSBpc0NvbnN0Ow0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGlzQ29uc3QoKSB7DQorCXJldHVybiBpc0NvbnN0Ow0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldElzUG9pbnRlcihib29sZWFuIGlzUG9pbnRlcikgew0KKwl0aGlzLmlzUG9pbnRlciA9IGlzUG9pbnRlcjsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1BvaW50ZXIoKSB7DQorCXJldHVybiBpc1BvaW50ZXI7DQorICAgIH0NCisNCisgICAgYm9vbGVhbiBpc1ZvaWQoKSB7DQorCVN0cmluZyBiYXNlVHlwZSA9IGdldEJhc2VUeXBlKCk7DQorCXJldHVybiBiYXNlVHlwZS5lcXVhbHMoIkdMdm9pZCIpIHx8DQorCSAgICBiYXNlVHlwZS5lcXVhbHMoInZvaWQiKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1R5cGVkUG9pbnRlcigpIHsNCisJcmV0dXJuIGlzUG9pbnRlcigpICYmICFpc1ZvaWQoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRCYXNlVHlwZShTdHJpbmcgYmFzZVR5cGUpIHsNCisJdGhpcy5iYXNlVHlwZSA9IGJhc2VUeXBlOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZVR5cGUoKSB7DQorCXJldHVybiBiYXNlVHlwZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KKwlTdHJpbmcgcyA9ICIiOw0KKwlpZiAoaXNDb25zdCgpKSB7DQorCSAgICBzICs9ICJjb25zdCAiOw0KKwl9DQorCXMgKz0gYmFzZVR5cGU7DQorCWlmIChpc1BvaW50ZXIoKSkgew0KKwkgICAgcyArPSAiKiI7DQorCX0NCisNCisJcmV0dXJuIHM7DQorICAgIH0NCisNCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsNCisJcmV0dXJuIGJhc2VUeXBlLmhhc2hDb2RlKCkgXiAoaXNQb2ludGVyID8gMiA6IDApIF4gKGlzQ29uc3QgPyAxIDogMCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7DQorCWlmIChvICE9IG51bGwgJiYgbyBpbnN0YW5jZW9mIENUeXBlKSB7DQorCSAgICBDVHlwZSBjID0gKENUeXBlKW87DQorCSAgICByZXR1cm4gYmFzZVR5cGUuZXF1YWxzKGMuYmFzZVR5cGUpICYmDQorCQlpc1BvaW50ZXIoKSA9PSBjLmlzUG9pbnRlcigpICYmDQorCQlpc0NvbnN0KCkgPT0gYy5pc0NvbnN0KCk7DQorCX0NCisJcmV0dXJuIGZhbHNlOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zcmMvQ29kZUVtaXR0ZXIuamF2YSBiL29wZW5nbC90b29scy9nbGdlbi9zcmMvQ29kZUVtaXR0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTliOTBhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9Db2RlRW1pdHRlci5qYXZhCkBAIC0wLDAgKzEsOCBAQAorDQorcHVibGljIGludGVyZmFjZSBDb2RlRW1pdHRlciB7DQorDQorICAgIHZvaWQgc2V0VmVyc2lvbihpbnQgdmVyc2lvbiwgYm9vbGVhbiBleHQsIGJvb2xlYW4gcGFjayk7DQorICAgIHZvaWQgZW1pdENvZGUoQ0Z1bmMgY2Z1bmMsIFN0cmluZyBvcmlnaW5hbCk7DQorICAgIHZvaWQgYWRkTmF0aXZlUmVnaXN0cmF0aW9uKFN0cmluZyBmbmFtZSk7DQorICAgIHZvaWQgZW1pdE5hdGl2ZVJlZ2lzdHJhdGlvbigpOw0KK30NCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0dlbmVyYXRlR0wuamF2YSBiL29wZW5nbC90b29scy9nbGdlbi9zcmMvR2VuZXJhdGVHTC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1N2VlNmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0dlbmVyYXRlR0wuamF2YQpAQCAtMCwwICsxLDE2NCBAQAorDQoraW1wb3J0IGphdmEuaW8uKjsNCitpbXBvcnQgamF2YS51dGlsLio7DQorDQorcHVibGljIGNsYXNzIEdlbmVyYXRlR0wgew0KKw0KKyAgICBzdGF0aWMgdm9pZCBjb3B5KFN0cmluZyBmaWxlbmFtZSwgUHJpbnRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZmlsZW5hbWUpKTsNCisgICAgICAgIFN0cmluZyBzOw0KKyAgICAgICAgd2hpbGUgKChzID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIG91dC5wcmludGxuKHMpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZW1pdChpbnQgdmVyc2lvbiwgYm9vbGVhbiBleHQsIGJvb2xlYW4gcGFjaywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVFbWl0dGVyIGVtaXR0ZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBzcGVjUmVhZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gZ2xTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBnbEltcGxTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBjU3RyZWFtKSB0aHJvd3MgRXhjZXB0aW9uIHsNCisgICAgICAgIFN0cmluZyBzID0gbnVsbDsNCisgICAgICAgIGludCBjb3VudGVyID0gMDsNCisgICAgICAgIHdoaWxlICgocyA9IHNwZWNSZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGlmIChzLnRyaW0oKS5zdGFydHNXaXRoKCIvLyIpKSB7DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBDRnVuYyBjZnVuYyA9IENGdW5jLnBhcnNlQ0Z1bmMocyk7DQorDQorICAgICAgICAgICAgU3RyaW5nIGZuYW1lID0gY2Z1bmMuZ2V0TmFtZSgpOw0KKyAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKCJzdHVicy8iICsgZm5hbWUgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuamF2YS0xIiArIHZlcnNpb24gKyAiLWlmIik7DQorICAgICAgICAgICAgaWYgKGYuZXhpc3RzKCkpIHsNCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTcGVjaWFsLWNhc2luZyBmdW5jdGlvbiAiICsgZm5hbWUpOw0KKyAgICAgICAgICAgICAgICBjb3B5KCJzdHVicy8iICsgZm5hbWUgKw0KKyAgICAgICAgICAgICAgICAgICAgICIuamF2YS0xIiArIHZlcnNpb24gKyAiLWlmIiwgZ2xTdHJlYW0pOw0KKyAgICAgICAgICAgICAgICBjb3B5KCJzdHVicy8iICsgZm5hbWUgKyAiLmphdmEtaW1wbCIsIGdsSW1wbFN0cmVhbSk7DQorICAgICAgICAgICAgICAgIGNvcHkoInN0dWJzLyIgKyBmbmFtZSArICIuY3BwIiwgY1N0cmVhbSk7DQorDQorICAgICAgICAgICAgICAgIC8vIFJlZ2lzdGVyIG5hdGl2ZSBmdW5jdGlvbiBuYW1lcw0KKyAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBiZSBpbXByb3ZlZCB0byByZXF1aXJlIGZld2VyIGRpc2NyZXRlIGZpbGVzDQorICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9ICJzdHVicy8iICsgZm5hbWUgKyAiLm5hdGl2ZVJlZyI7DQorICAgICAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0NCisgICAgICAgICAgICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmaWxlbmFtZSkpOw0KKyAgICAgICAgICAgICAgICBTdHJpbmcgbmZ1bmM7DQorICAgICAgICAgICAgICAgIHdoaWxlICgobmZ1bmMgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICBlbWl0dGVyLmFkZE5hdGl2ZVJlZ2lzdHJhdGlvbihuZnVuYyk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBlbWl0dGVyLnNldFZlcnNpb24odmVyc2lvbiwgZXh0LCBwYWNrKTsNCisgICAgICAgICAgICAgICAgZW1pdHRlci5lbWl0Q29kZShjZnVuYywgcyk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gew0KKyAgICAgICAgU3RyaW5nIGNsYXNzUGF0aE5hbWUgPSAiY29tL2dvb2dsZS9hbmRyb2lkL2dsZXNfam5pL0dMSW1wbCI7DQorICAgICAgICBib29sZWFuIHVzZUNvbnRleHRQb2ludGVyID0gdHJ1ZTsNCisNCisgICAgICAgIGludCBhaWR4ID0gMDsNCisgICAgICAgIHdoaWxlIChhcmdzW2FpZHhdLmNoYXJBdCgwKSA9PSAnLScpIHsNCisgICAgICAgICAgICBzd2l0Y2ggKGFyZ3NbYWlkeF0uY2hhckF0KDEpKSB7DQorICAgICAgICAgICAgY2FzZSAnYyc6DQorICAgICAgICAgICAgICAgIHVzZUNvbnRleHRQb2ludGVyID0gZmFsc2U7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVW5rbm93biBmbGFnOiAiICsgYXJnc1thaWR4XSk7DQorICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBhaWR4Kys7DQorICAgICAgICB9DQorDQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInVzZUNvbnRleHRQb2ludGVyID0gIiArIHVzZUNvbnRleHRQb2ludGVyKTsNCisNCisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHNwZWMxMFJlYWRlciA9DQorICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGFyZ3NbYWlkeCsrXSkpOw0KKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgc3BlYzEwRXh0UmVhZGVyID0NCisgICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoYXJnc1thaWR4KytdKSk7DQorICAgICAgICBCdWZmZXJlZFJlYWRlciBzcGVjMTFSZWFkZXIgPQ0KKyAgICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihhcmdzW2FpZHgrK10pKTsNCisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHNwZWMxMUV4dFJlYWRlciA9DQorICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGFyZ3NbYWlkeCsrXSkpOw0KKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgc3BlYzExRXh0UGFja1JlYWRlciA9DQorICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGFyZ3NbYWlkeCsrXSkpOw0KKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgY2hlY2tzUmVhZGVyID0NCisgICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoYXJnc1thaWR4KytdKSk7DQorDQorICAgICAgICBTdHJpbmcgZ2wxMEZpbGVuYW1lID0gImphdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTAuamF2YSI7DQorICAgICAgICBTdHJpbmcgZ2wxMEV4dEZpbGVuYW1lID0NCisgICAgICAgICAgICAiamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMEV4dC5qYXZhIjsNCisgICAgICAgIFN0cmluZyBnbDExRmlsZW5hbWUgPSAiamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMS5qYXZhIjsNCisgICAgICAgIFN0cmluZyBnbDExRXh0RmlsZW5hbWUgPQ0KKyAgICAgICAgICAgICJqYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExRXh0LmphdmEiOw0KKyAgICAgICAgU3RyaW5nIGdsMTFFeHRQYWNrRmlsZW5hbWUgPQ0KKyAgICAgICAgICAgICJqYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExRXh0ZW5zaW9uUGFjay5qYXZhIjsNCisgICAgICAgIFN0cmluZyBnbEltcGxGaWxlbmFtZSA9ICJjb20vZ29vZ2xlL2FuZHJvaWQvZ2xlc19qbmkvR0xJbXBsLmphdmEiOw0KKyAgICAgICAgU3RyaW5nIGNGaWxlbmFtZSA9ICJjb21fZ29vZ2xlX2FuZHJvaWRfZ2xlc19qbmlfR0xJbXBsLmNwcCI7DQorDQorICAgICAgICBQcmludFN0cmVhbSBnbDEwU3RyZWFtID0NCisgICAgICAgICAgICBuZXcgUHJpbnRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oIm91dC8iICsgZ2wxMEZpbGVuYW1lKSk7DQorICAgICAgICBQcmludFN0cmVhbSBnbDEwRXh0U3RyZWFtID0NCisgICAgICAgICAgICBuZXcgUHJpbnRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oIm91dC8iICsgZ2wxMEV4dEZpbGVuYW1lKSk7DQorICAgICAgICBQcmludFN0cmVhbSBnbDExU3RyZWFtID0NCisgICAgICAgICAgICBuZXcgUHJpbnRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oIm91dC8iICsgZ2wxMUZpbGVuYW1lKSk7DQorICAgICAgICBQcmludFN0cmVhbSBnbDExRXh0U3RyZWFtID0NCisgICAgICAgICAgICBuZXcgUHJpbnRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oIm91dC8iICsgZ2wxMUV4dEZpbGVuYW1lKSk7DQorICAgICAgICBQcmludFN0cmVhbSBnbDExRXh0UGFja1N0cmVhbSA9DQorICAgICAgICAgICAgbmV3IFByaW50U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKCJvdXQvIiArIGdsMTFFeHRQYWNrRmlsZW5hbWUpKTsNCisgICAgICAgIFByaW50U3RyZWFtIGdsSW1wbFN0cmVhbSA9DQorICAgICAgICAgICAgbmV3IFByaW50U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKCJvdXQvIiArIGdsSW1wbEZpbGVuYW1lKSk7DQorICAgICAgICBQcmludFN0cmVhbSBjU3RyZWFtID0NCisgICAgICAgICAgICBuZXcgUHJpbnRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oIm91dC8iICsgY0ZpbGVuYW1lKSk7DQorDQorICAgICAgICBQYXJhbWV0ZXJDaGVja2VyIGNoZWNrZXIgPSBuZXcgUGFyYW1ldGVyQ2hlY2tlcihjaGVja3NSZWFkZXIpOw0KKw0KKyAgICAgICAgQ29kZUVtaXR0ZXIgZW1pdHRlciA9DQorICAgICAgICAgICAgbmV3IEpuaUNvZGVFbWl0dGVyKGNsYXNzUGF0aE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsMTBTdHJlYW0sIGdsMTBFeHRTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsMTFTdHJlYW0sIGdsMTFFeHRTdHJlYW0sIGdsMTFFeHRQYWNrU3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbEltcGxTdHJlYW0sIGNTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZUNvbnRleHRQb2ludGVyKTsNCisNCisgICAgICAgIGdsMTBTdHJlYW0ucHJpbnRsbigiLyogLy9kZXZpY2UvamF2YS9hbmRyb2lkLyIgKyBnbDEwRmlsZW5hbWUpOw0KKyAgICAgICAgZ2wxMEV4dFN0cmVhbS5wcmludGxuKCIvKiAvL2RldmljZS9qYXZhL2FuZHJvaWQvIiArIGdsMTBFeHRGaWxlbmFtZSk7DQorICAgICAgICBnbDExU3RyZWFtLnByaW50bG4oIi8qIC8vZGV2aWNlL2phdmEvYW5kcm9pZC8iICsgZ2wxMUZpbGVuYW1lKTsNCisgICAgICAgIGdsMTFFeHRTdHJlYW0ucHJpbnRsbigiLyogLy9kZXZpY2UvamF2YS9hbmRyb2lkLyIgKyBnbDExRXh0RmlsZW5hbWUpOw0KKyAgICAgICAgZ2wxMUV4dFBhY2tTdHJlYW0ucHJpbnRsbigiLyogLy9kZXZpY2UvamF2YS9hbmRyb2lkLyIgKw0KKyAgICAgICAgICAgIGdsMTFFeHRQYWNrRmlsZW5hbWUpOw0KKyAgICAgICAgZ2xJbXBsU3RyZWFtLnByaW50bG4oIi8qIC8vZGV2aWNlL2phdmEvYW5kcm9pZC8iICsgZ2xJbXBsRmlsZW5hbWUpOw0KKyAgICAgICAgY1N0cmVhbS5wcmludGxuKCIvKiAvL2RldmljZS9saWJzL2FuZHJvaWRfcnVudGltZS8iICsgY0ZpbGVuYW1lKTsNCisNCisgICAgICAgIGNvcHkoInN0dWJzL0dMMTBIZWFkZXIuamF2YS1pZiIsIGdsMTBTdHJlYW0pOw0KKyAgICAgICAgY29weSgic3R1YnMvR0wxMEV4dEhlYWRlci5qYXZhLWlmIiwgZ2wxMEV4dFN0cmVhbSk7DQorICAgICAgICBjb3B5KCJzdHVicy9HTDExSGVhZGVyLmphdmEtaWYiLCBnbDExU3RyZWFtKTsNCisgICAgICAgIGNvcHkoInN0dWJzL0dMMTFFeHRIZWFkZXIuamF2YS1pZiIsIGdsMTFFeHRTdHJlYW0pOw0KKyAgICAgICAgY29weSgic3R1YnMvR0wxMUV4dGVuc2lvblBhY2tIZWFkZXIuamF2YS1pZiIsIGdsMTFFeHRQYWNrU3RyZWFtKTsNCisgICAgICAgIGNvcHkoInN0dWJzL0dMSW1wbEhlYWRlci5qYXZhLWltcGwiLCBnbEltcGxTdHJlYW0pOw0KKyAgICAgICAgY29weSgic3R1YnMvR0xDSGVhZGVyLmNwcCIsIGNTdHJlYW0pOw0KKw0KKyAgICAgICAgZW1pdCgwLCBmYWxzZSwgZmFsc2UsDQorICAgICAgICAgICAgIGVtaXR0ZXIsIHNwZWMxMFJlYWRlciwgZ2wxMFN0cmVhbSwgZ2xJbXBsU3RyZWFtLCBjU3RyZWFtKTsNCisgICAgICAgIGVtaXQoMCwgdHJ1ZSwgZmFsc2UsDQorICAgICAgICAgICAgIGVtaXR0ZXIsIHNwZWMxMEV4dFJlYWRlciwgZ2wxMEV4dFN0cmVhbSwgZ2xJbXBsU3RyZWFtLCBjU3RyZWFtKTsNCisgICAgICAgIGVtaXQoMSwgZmFsc2UsIGZhbHNlLA0KKyAgICAgICAgICAgICBlbWl0dGVyLCBzcGVjMTFSZWFkZXIsIGdsMTFTdHJlYW0sIGdsSW1wbFN0cmVhbSwgY1N0cmVhbSk7DQorICAgICAgICBlbWl0KDEsIHRydWUsIGZhbHNlLA0KKyAgICAgICAgICAgICBlbWl0dGVyLCBzcGVjMTFFeHRSZWFkZXIsIGdsMTFFeHRTdHJlYW0sIGdsSW1wbFN0cmVhbSwgY1N0cmVhbSk7DQorICAgICAgICBlbWl0KDEsIHRydWUsIHRydWUsDQorICAgICAgICAgICAgIGVtaXR0ZXIsIHNwZWMxMUV4dFBhY2tSZWFkZXIsIGdsMTFFeHRQYWNrU3RyZWFtLCBnbEltcGxTdHJlYW0sDQorICAgICAgICAgICAgIGNTdHJlYW0pOw0KKw0KKyAgICAgICAgZW1pdHRlci5lbWl0TmF0aXZlUmVnaXN0cmF0aW9uKCk7DQorDQorICAgICAgICBnbDEwU3RyZWFtLnByaW50bG4oIn0iKTsNCisgICAgICAgIGdsMTBFeHRTdHJlYW0ucHJpbnRsbigifSIpOw0KKyAgICAgICAgZ2wxMVN0cmVhbS5wcmludGxuKCJ9Iik7DQorICAgICAgICBnbDExRXh0U3RyZWFtLnByaW50bG4oIn0iKTsNCisgICAgICAgIGdsMTFFeHRQYWNrU3RyZWFtLnByaW50bG4oIn0iKTsNCisgICAgICAgIGdsSW1wbFN0cmVhbS5wcmludGxuKCJ9Iik7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9KRnVuYy5qYXZhIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9KRnVuYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZDQ2NmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0pGdW5jLmphdmEKQEAgLTAsMCArMSwxNDggQEAKKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitwdWJsaWMgY2xhc3MgSkZ1bmMgew0KKw0KKyAgICBTdHJpbmcgY2xhc3NOYW1lID0gImNvbS5nb29nbGUuYW5kcm9pZC5nbGVzX2puaS5HTDExSW1wbCI7DQorDQorICAgIENGdW5jIGNmdW5jOw0KKyAgICBKVHlwZSBmdHlwZTsNCisgICAgU3RyaW5nIGZuYW1lOw0KKw0KKyAgICBMaXN0PFN0cmluZz4gYXJnTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCisgICAgTGlzdDxKVHlwZT4gYXJnVHlwZXMgPSBuZXcgQXJyYXlMaXN0PEpUeXBlPigpOw0KKyAgICBMaXN0PEludGVnZXI+IGFyZ0NJbmRpY2VzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOw0KKw0KKyAgICBib29sZWFuIGhhc0J1ZmZlckFyZyA9IGZhbHNlOw0KKyAgICBib29sZWFuIGhhc1R5cGVkQnVmZmVyQXJnID0gZmFsc2U7DQorICAgIEFycmF5TGlzdDxTdHJpbmc+IGJ1ZmZlckFyZ05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQorDQorICAgIHB1YmxpYyBKRnVuYyhDRnVuYyBjZnVuYykgew0KKyAgICAgICAgdGhpcy5jZnVuYyA9IGNmdW5jOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBDRnVuYyBnZXRDRnVuYygpIHsNCisgICAgICAgIHJldHVybiBjZnVuYzsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBmbmFtZSkgew0KKyAgICAgICAgdGhpcy5mbmFtZSA9IGZuYW1lOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCisgICAgICAgIHJldHVybiBmbmFtZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKEpUeXBlIGZ0eXBlKSB7DQorICAgICAgICB0aGlzLmZ0eXBlID0gZnR5cGU7DQorICAgIH0NCisNCisgICAgcHVibGljIEpUeXBlIGdldFR5cGUoKSB7DQorICAgICAgICByZXR1cm4gZnR5cGU7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsNCisgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgew0KKyAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGJvb2xlYW4gaGFzQnVmZmVyQXJnKCkgew0KKyAgICAgICAgcmV0dXJuIGhhc0J1ZmZlckFyZzsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNUeXBlZEJ1ZmZlckFyZygpIHsNCisgICAgICAgIHJldHVybiBoYXNUeXBlZEJ1ZmZlckFyZzsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldEJ1ZmZlckFyZ05hbWUoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gYnVmZmVyQXJnTmFtZXMuZ2V0KGluZGV4KTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBhZGRBcmd1bWVudChTdHJpbmcgYXJnTmFtZSwgSlR5cGUgYXJnVHlwZSwgaW50IGNpbmRleCkgew0KKyAgICAgICAgYXJnTmFtZXMuYWRkKGFyZ05hbWUpOw0KKyAgICAgICAgYXJnVHlwZXMuYWRkKGFyZ1R5cGUpOw0KKyAgICAgICAgYXJnQ0luZGljZXMuYWRkKG5ldyBJbnRlZ2VyKGNpbmRleCkpOw0KKw0KKyAgICAgICAgaWYgKGFyZ1R5cGUuaXNCdWZmZXIoKSkgew0KKyAgICAgICAgICAgIGhhc0J1ZmZlckFyZyA9IHRydWU7DQorICAgICAgICAgICAgYnVmZmVyQXJnTmFtZXMuYWRkKGFyZ05hbWUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGFyZ1R5cGUuaXNUeXBlZEJ1ZmZlcigpKSB7DQorICAgICAgICAgICAgaGFzVHlwZWRCdWZmZXJBcmcgPSB0cnVlOw0KKyAgICAgICAgICAgIGJ1ZmZlckFyZ05hbWVzLmFkZChhcmdOYW1lKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGdldE51bUFyZ3MoKSB7DQorICAgICAgICByZXR1cm4gYXJnTmFtZXMuc2l6ZSgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnQgZ2V0QXJnSW5kZXgoU3RyaW5nIG5hbWUpIHsNCisgICAgICAgIGludCBsZW4gPSBhcmdOYW1lcy5zaXplKCk7DQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7DQorICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKGFyZ05hbWVzLmdldChpKSkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIC0xOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXJnTmFtZShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiBhcmdOYW1lcy5nZXQoaW5kZXgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBKVHlwZSBnZXRBcmdUeXBlKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIGFyZ1R5cGVzLmdldChpbmRleCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGludCBnZXRBcmdDSW5kZXgoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gYXJnQ0luZGljZXMuZ2V0KGluZGV4KS5pbnRWYWx1ZSgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBzdGF0aWMgSkZ1bmMgY29udmVydChDRnVuYyBjZnVuYywgYm9vbGVhbiB1c2VBcnJheSkgew0KKyAgICAgICAgSkZ1bmMgamZ1bmMgPSBuZXcgSkZ1bmMoY2Z1bmMpOw0KKyAgICAgICAgamZ1bmMuc2V0TmFtZShjZnVuYy5nZXROYW1lKCkpOw0KKyAgICAgICAgamZ1bmMuc2V0VHlwZShKVHlwZS5jb252ZXJ0KGNmdW5jLmdldFR5cGUoKSwgZmFsc2UpKTsNCisJDQorICAgICAgICBpbnQgbnVtQXJncyA9IGNmdW5jLmdldE51bUFyZ3MoKTsNCisgICAgICAgIGludCBudW1PZmZzZXRzID0gMDsNCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXJnczsgaSsrKSB7DQorICAgICAgICAgICAgQ1R5cGUgY0FyZ1R5cGUgPSBjZnVuYy5nZXRBcmdUeXBlKGkpOw0KKyAgICAgICAgICAgIGlmIChjQXJnVHlwZS5pc1R5cGVkUG9pbnRlcigpICYmIHVzZUFycmF5KSB7DQorICAgICAgICAgICAgICAgICsrbnVtT2Zmc2V0czsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFyZ3M7IGkrKykgew0KKyAgICAgICAgICAgIFN0cmluZyBjQXJnTmFtZSA9IGNmdW5jLmdldEFyZ05hbWUoaSk7DQorICAgICAgICAgICAgQ1R5cGUgY0FyZ1R5cGUgPSBjZnVuYy5nZXRBcmdUeXBlKGkpOw0KKw0KKyAgICAgICAgICAgIGpmdW5jLmFkZEFyZ3VtZW50KGNBcmdOYW1lLCBKVHlwZS5jb252ZXJ0KGNBcmdUeXBlLCB1c2VBcnJheSksIGkpOw0KKyAgICAgICAgICAgIGlmIChjQXJnVHlwZS5pc1R5cGVkUG9pbnRlcigpICYmIHVzZUFycmF5KSB7DQorICAgICAgICAgICAgICAgIGlmIChudW1PZmZzZXRzID4gMSkgew0KKyAgICAgICAgICAgICAgICAgICAgamZ1bmMuYWRkQXJndW1lbnQoY0FyZ05hbWUgKyAiT2Zmc2V0IiwgbmV3IEpUeXBlKCJpbnQiKSwgaSk7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBqZnVuYy5hZGRBcmd1bWVudCgib2Zmc2V0IiwgbmV3IEpUeXBlKCJpbnQiKSwgaSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICByZXR1cm4gamZ1bmM7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCisgICAgICAgIFN0cmluZyBzID0gICJGdW5jdGlvbiAiICsgZm5hbWUgKyAiIHJldHVybnMgIiArIGZ0eXBlICsgIjogIjsNCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJnTmFtZXMuc2l6ZSgpOyBpKyspIHsNCisgICAgICAgICAgICBpZiAoaSA+IDApIHsNCisgICAgICAgICAgICAgICAgcyArPSAiLCAiOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBzICs9IGFyZ1R5cGVzLmdldChpKSArICIgIiArIGFyZ05hbWVzLmdldChpKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBzOw0KKyAgICB9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zcmMvSlR5cGUuamF2YSBiL29wZW5nbC90b29scy9nbGdlbi9zcmMvSlR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTZkNDQwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9KVHlwZS5qYXZhCkBAIC0wLDAgKzEsMTM5IEBACisNCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQorDQorcHVibGljIGNsYXNzIEpUeXBlIHsNCisgICAgDQorICAgIFN0cmluZyBiYXNlVHlwZTsNCisgICAgYm9vbGVhbiBpc0FycmF5Ow0KKyAgICBib29sZWFuIGlzQ2xhc3M7DQorDQorICAgIHN0YXRpYyBIYXNoTWFwPENUeXBlLEpUeXBlPiB0eXBlTWFwcGluZyA9IG5ldyBIYXNoTWFwPENUeXBlLEpUeXBlPigpOw0KKyAgICBzdGF0aWMgSGFzaE1hcDxDVHlwZSxKVHlwZT4gYXJyYXlUeXBlTWFwcGluZyA9IG5ldyBIYXNoTWFwPENUeXBlLEpUeXBlPigpOw0KKw0KKyAgICBzdGF0aWMgew0KKwkvLyBQcmltaXRpdmUgdHlwZXMNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xiaXRmaWVsZCIpLCBuZXcgSlR5cGUoImludCIpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xib29sZWFuIiksIG5ldyBKVHlwZSgiYm9vbGVhbiIpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xjbGFtcGYiKSwgbmV3IEpUeXBlKCJmbG9hdCIpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xjbGFtcHgiKSwgbmV3IEpUeXBlKCJpbnQiKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMZW51bSIpLCBuZXcgSlR5cGUoImludCIpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xmbG9hdCIpLCBuZXcgSlR5cGUoImZsb2F0IikpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGZpeGVkIiksIG5ldyBKVHlwZSgiaW50IikpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGludCIpLCBuZXcgSlR5cGUoImludCIpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xpbnRwdHIiKSwgbmV3IEpUeXBlKCJpbnQiKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMc2hvcnQiKSwgbmV3IEpUeXBlKCJzaG9ydCIpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xzaXplaSIpLCBuZXcgSlR5cGUoImludCIpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xzaXplaXB0ciIpLCBuZXcgSlR5cGUoImludCIpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0x1Ynl0ZSIpLCBuZXcgSlR5cGUoImJ5dGUiKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMdWludCIpLCBuZXcgSlR5cGUoImludCIpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgidm9pZCIpLCBuZXcgSlR5cGUoInZvaWQiKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMdWJ5dGUiLCB0cnVlLCB0cnVlKSwgbmV3IEpUeXBlKCJTdHJpbmciKSk7DQorDQorCS8vIFVudHlwZWQgcG9pbnRlcnMgbWFwIHRvIHVudHlwZWQgQnVmZmVycw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHZvaWQiLCB0cnVlLCB0cnVlKSwNCisJCQluZXcgSlR5cGUoImphdmEubmlvLkJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMdm9pZCIsIGZhbHNlLCB0cnVlKSwNCisJCQluZXcgSlR5cGUoImphdmEubmlvLkJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoInZvaWQiLCBmYWxzZSwgdHJ1ZSksDQorCQkJbmV3IEpUeXBlKCJqYXZhLm5pby5CdWZmZXIiLCB0cnVlLCBmYWxzZSkpOw0KKw0KKwkvLyBUeXBlZCBwb2ludGVycyBtYXAgdG8gdHlwZWQgQnVmZmVycw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGJvb2xlYW4iLCBmYWxzZSwgdHJ1ZSksDQorCQkJbmV3IEpUeXBlKCJqYXZhLm5pby5JbnRCdWZmZXIiLCB0cnVlLCBmYWxzZSkpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGZpeGVkIiwgZmFsc2UsIHRydWUpLA0KKwkJCW5ldyBKVHlwZSgiamF2YS5uaW8uSW50QnVmZmVyIiwgdHJ1ZSwgZmFsc2UpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xmaXhlZCIsIHRydWUsIHRydWUpLA0KKwkJCW5ldyBKVHlwZSgiamF2YS5uaW8uSW50QnVmZmVyIiwgdHJ1ZSwgZmFsc2UpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xmbG9hdCIsIGZhbHNlLCB0cnVlKSwNCisJCQluZXcgSlR5cGUoImphdmEubmlvLkZsb2F0QnVmZmVyIiwgdHJ1ZSwgZmFsc2UpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xmbG9hdCIsIHRydWUsIHRydWUpLA0KKwkJCW5ldyBKVHlwZSgiamF2YS5uaW8uRmxvYXRCdWZmZXIiLCB0cnVlLCBmYWxzZSkpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGludCIsIGZhbHNlLCB0cnVlKSwNCisJCQluZXcgSlR5cGUoImphdmEubmlvLkludEJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMaW50IiwgdHJ1ZSwgdHJ1ZSksDQorCQkJbmV3IEpUeXBlKCJqYXZhLm5pby5JbnRCdWZmZXIiLCB0cnVlLCBmYWxzZSkpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHVpbnQiLCBmYWxzZSwgdHJ1ZSksDQorCQkJbmV3IEpUeXBlKCJqYXZhLm5pby5JbnRCdWZmZXIiLCB0cnVlLCBmYWxzZSkpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHVpbnQiLCB0cnVlLCB0cnVlKSwNCisJCQluZXcgSlR5cGUoImphdmEubmlvLkludEJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMc2hvcnQiLCB0cnVlLCB0cnVlKSwNCisJCQluZXcgSlR5cGUoImphdmEubmlvLlNob3J0QnVmZmVyIiwgdHJ1ZSwgZmFsc2UpKTsNCisNCisJLy8gVHlwZWQgcG9pbnRlcnMgbWFwIHRvIGFycmF5cyArIG9mZnNldHMNCisJYXJyYXlUeXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGJvb2xlYW4iLCBmYWxzZSwgdHJ1ZSksDQorCQkJICAgICBuZXcgSlR5cGUoImJvb2xlYW4iLCBmYWxzZSwgdHJ1ZSkpOw0KKwlhcnJheVR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMZml4ZWQiLCB0cnVlLCB0cnVlKSwgbmV3IEpUeXBlKCJpbnQiLCBmYWxzZSwgdHJ1ZSkpOw0KKwlhcnJheVR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMZml4ZWQiLCBmYWxzZSwgdHJ1ZSksIG5ldyBKVHlwZSgiaW50IiwgZmFsc2UsIHRydWUpKTsNCisJYXJyYXlUeXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGZsb2F0IiwgZmFsc2UsIHRydWUpLCBuZXcgSlR5cGUoImZsb2F0IiwgZmFsc2UsIHRydWUpKTsNCisJYXJyYXlUeXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGZsb2F0IiwgdHJ1ZSwgdHJ1ZSksIG5ldyBKVHlwZSgiZmxvYXQiLCBmYWxzZSwgdHJ1ZSkpOw0KKwlhcnJheVR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMaW50IiwgZmFsc2UsIHRydWUpLCBuZXcgSlR5cGUoImludCIsIGZhbHNlLCB0cnVlKSk7DQorCWFycmF5VHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xpbnQiLCB0cnVlLCB0cnVlKSwgbmV3IEpUeXBlKCJpbnQiLCBmYWxzZSwgdHJ1ZSkpOw0KKwlhcnJheVR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMc2hvcnQiLCB0cnVlLCB0cnVlKSwgbmV3IEpUeXBlKCJzaG9ydCIsIGZhbHNlLCB0cnVlKSk7DQorCWFycmF5VHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0x1aW50IiwgZmFsc2UsIHRydWUpLCBuZXcgSlR5cGUoImludCIsIGZhbHNlLCB0cnVlKSk7DQorCWFycmF5VHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0x1aW50IiwgdHJ1ZSwgdHJ1ZSksIG5ldyBKVHlwZSgiaW50IiwgZmFsc2UsIHRydWUpKTsNCisJYXJyYXlUeXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGludHB0ciIpLCBuZXcgSlR5cGUoImludCIsIGZhbHNlLCB0cnVlKSk7DQorCWFycmF5VHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xzaXplaXB0ciIpLCBuZXcgSlR5cGUoImludCIsIGZhbHNlLCB0cnVlKSk7DQorICAgIH0NCisNCisgICAgcHVibGljIEpUeXBlKCkgew0KKyAgICB9DQorDQorICAgIHB1YmxpYyBKVHlwZShTdHJpbmcgcHJpbWl0aXZlVHlwZU5hbWUpIHsNCisJdGhpcy5iYXNlVHlwZSA9IHByaW1pdGl2ZVR5cGVOYW1lOw0KKwl0aGlzLmlzQ2xhc3MgPSBmYWxzZTsNCisJdGhpcy5pc0FycmF5ID0gZmFsc2U7DQorICAgIH0NCisNCisgICAgcHVibGljIEpUeXBlKFN0cmluZyBwcmltaXRpdmVUeXBlTmFtZSwgYm9vbGVhbiBpc0NsYXNzLCBib29sZWFuIGlzQXJyYXkpIHsNCisJdGhpcy5iYXNlVHlwZSA9IHByaW1pdGl2ZVR5cGVOYW1lOw0KKwl0aGlzLmlzQ2xhc3MgPSBpc0NsYXNzOw0KKwl0aGlzLmlzQXJyYXkgPSBpc0FycmF5Ow0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZVR5cGUoKSB7DQorCXJldHVybiBiYXNlVHlwZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KKwlyZXR1cm4gYmFzZVR5cGUgKyAoaXNBcnJheSA/ICJbXSIgOiAiIik7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gaXNBcnJheSgpIHsNCisJcmV0dXJuIGlzQXJyYXk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gaXNDbGFzcygpIHsNCisJcmV0dXJuIGlzQ2xhc3M7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7DQorCXJldHVybiAhaXNDbGFzcygpICYmICFpc0FycmF5KCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gaXNWb2lkKCkgew0KKwlyZXR1cm4gYmFzZVR5cGUuZXF1YWxzKCJ2b2lkIik7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gaXNCdWZmZXIoKSB7DQorCXJldHVybiBiYXNlVHlwZS5pbmRleE9mKCJCdWZmZXIiKSAhPSAtMTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1R5cGVkQnVmZmVyKCkgew0KKwlyZXR1cm4gIWJhc2VUeXBlLmVxdWFscygiamF2YS5uaW8uQnVmZmVyIikgJiYNCisJICAgIChiYXNlVHlwZS5pbmRleE9mKCJCdWZmZXIiKSAhPSAtMSk7DQorICAgIH0NCisNCisgICAgcHVibGljIHN0YXRpYyBKVHlwZSBjb252ZXJ0KENUeXBlIGN0eXBlLCBib29sZWFuIHVzZUFycmF5KSB7DQorIAlKVHlwZSBqYXZhVHlwZSA9IG51bGw7DQorIAlpZiAodXNlQXJyYXkpIHsNCisgCSAgICBqYXZhVHlwZSA9IGFycmF5VHlwZU1hcHBpbmcuZ2V0KGN0eXBlKTsNCisgCX0NCisgCWlmIChqYXZhVHlwZSA9PSBudWxsKSB7DQorIAkgICAgamF2YVR5cGUgPSB0eXBlTWFwcGluZy5nZXQoY3R5cGUpOw0KKyAJfQ0KKyAJaWYgKGphdmFUeXBlID09IG51bGwpIHsNCisgCSAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgQyB0eXBlOiAiICsgY3R5cGUpOw0KKyAJfQ0KKyAJcmV0dXJuIGphdmFUeXBlOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zcmMvSm5pQ29kZUVtaXR0ZXIuamF2YSBiL29wZW5nbC90b29scy9nbGdlbi9zcmMvSm5pQ29kZUVtaXR0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2I5YTNlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9KbmlDb2RlRW1pdHRlci5qYXZhCkBAIC0wLDAgKzEsMTA4NiBAQAoraW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEVtaXRzIGEgSmF2YSBpbnRlcmZhY2UgYW5kIEphdmEgJiBDIGltcGxlbWVudGF0aW9uIGZvciBhIEMgZnVuY3Rpb24uCisgKgorICogPHA+IFRoZSBKYXZhIGludGVyZmFjZSB3aWxsIGhhdmUgQnVmZmVyIGFuZCBhcnJheSB2YXJpYW50cyBmb3IgZnVuY3Rpb25zIHRoYXQKKyAqIGhhdmUgYSB0eXBlZCBwb2ludGVyIGFyZ3VtZW50LiAgVGhlIGFycmF5IHZhcmlhbnQgd2lsbCBjb252ZXJ0IGEgc2luZ2xlICI8dHlwZT4gKmRhdGEiCisgKiBhcmd1bWVudCB0byBhIHBhaXIgb2YgYXJndW1lbnRzICI8dHlwZT5bXSBkYXRhLCBpbnQgb2Zmc2V0Ii4KKyAqLworcHVibGljIGNsYXNzIEpuaUNvZGVFbWl0dGVyIGltcGxlbWVudHMgQ29kZUVtaXR0ZXIgeworCisgICAgLy8gSWYgdHJ1ZSwgdXNlIEMrKyBzdHlsZSBmb3IgY2FsbGluZyB0aHJvdWdoIGEgSk5JRW52ICo6CisgICAgLy8gZW52LT5GdW5jKC4uLikKKyAgICAvLyBJZiBmYWxzZSwgdXNlIEMgc3R5bGU6CisgICAgLy8gKCplbnYpLT5GdW5jKGVudiwgLi4uKQorICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIG1Vc2VDUGx1c1BsdXMgPSB0cnVlOworCisgICAgYm9vbGVhbiBtVXNlQ29udGV4dFBvaW50ZXIgPSB0cnVlOworCisgICAgU3RyaW5nIG1DbGFzc1BhdGhOYW1lOworICAgIAorICAgIFBhcmFtZXRlckNoZWNrZXIgbUNoZWNrZXI7CisgICAgUHJpbnRTdHJlYW0gbUphdmExMEludGVyZmFjZVN0cmVhbTsKKyAgICBQcmludFN0cmVhbSBtSmF2YTEwRXh0SW50ZXJmYWNlU3RyZWFtOworICAgIFByaW50U3RyZWFtIG1KYXZhMTFJbnRlcmZhY2VTdHJlYW07CisgICAgUHJpbnRTdHJlYW0gbUphdmExMUV4dEludGVyZmFjZVN0cmVhbTsKKyAgICBQcmludFN0cmVhbSBtSmF2YTExRXh0UGFja0ludGVyZmFjZVN0cmVhbTsKKyAgICBQcmludFN0cmVhbSBtSmF2YUltcGxTdHJlYW07CisgICAgUHJpbnRTdHJlYW0gbUNTdHJlYW07CisKKyAgICBQcmludFN0cmVhbSBtSmF2YUludGVyZmFjZVN0cmVhbTsKKworICAgIExpc3Q8U3RyaW5nPiBuYXRpdmVSZWdpc3RyYXRpb25zID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisKKyAgICBib29sZWFuIG5lZWRzRXhpdDsKKworICAgIHN0YXRpYyBTdHJpbmcgaW5kZW50ID0gIiAgICAiOworCisgICAgSGFzaFNldDxTdHJpbmc+IG1GdW5jdGlvbnNFbWl0dGVkID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworCisgICAgLyoqCisgICAgICogQHBhcmFtIGphdmExMEludGVyZmFjZVN0cmVhbSB0aGUgUHJpbnRTdHJlYW0gdG8gd2hpY2ggdG8gZW1pdCB0aGUgSmF2YSBpbnRlcmZhY2UgZm9yIEdMIDEuMCBmdW5jdGlvbnMKKyAgICAgKiBAcGFyYW0gamF2YTEwRXh0SW50ZXJmYWNlU3RyZWFtIHRoZSBQcmludFN0cmVhbSB0byB3aGljaCB0byBlbWl0IHRoZSBKYXZhIGludGVyZmFjZSBmb3IgR0wgMS4wIGV4dGVuc2lvbiBmdW5jdGlvbnMKKyAgICAgKiBAcGFyYW0gamF2YTExSW50ZXJmYWNlU3RyZWFtIHRoZSBQcmludFN0cmVhbSB0byB3aGljaCB0byBlbWl0IHRoZSBKYXZhIGludGVyZmFjZSBmb3IgR0wgMS4xIGZ1bmN0aW9ucyAKKyAgICAgKiBAcGFyYW0gamF2YTExRXh0SW50ZXJmYWNlU3RyZWFtIHRoZSBQcmludFN0cmVhbSB0byB3aGljaCB0byBlbWl0IHRoZSBKYXZhIGludGVyZmFjZSBmb3IgR0wgMS4xIEV4dGVuc2lvbiBmdW5jdGlvbnMKKyAgICAgKiBAcGFyYW0gamF2YTExRXh0UGFja0ludGVyZmFjZVN0cmVhbSB0aGUgUHJpbnRTdHJlYW0gdG8gd2hpY2ggdG8gZW1pdCB0aGUgSmF2YSBpbnRlcmZhY2UgZm9yIEdMIDEuMSBFeHRlbnNpb24gUGFjayBmdW5jdGlvbnMKKyAgICAgKiBAcGFyYW0gamF2YUltcGxTdHJlYW0gdGhlIFByaW50U3RyZWFtIHRvIHdoaWNoIHRvIGVtaXQgdGhlIEphdmEgaW1wbGVtZW50YXRpb24KKyAgICAgKiBAcGFyYW0gY1N0cmVhbSB0aGUgUHJpbnRTdHJlYW0gdG8gd2hpY2ggdG8gZW1pdCB0aGUgQyBpbXBsZW1lbnRhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBKbmlDb2RlRW1pdHRlcihTdHJpbmcgY2xhc3NQYXRoTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyQ2hlY2tlciBjaGVja2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBqYXZhMTBJbnRlcmZhY2VTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIGphdmExMEV4dEludGVyZmFjZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gamF2YTExSW50ZXJmYWNlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBqYXZhMTFFeHRJbnRlcmZhY2VTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIGphdmExMUV4dFBhY2tJbnRlcmZhY2VTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIGphdmFJbXBsU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBjU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVzZUNvbnRleHRQb2ludGVyKSB7CisgICAgICAgIG1DbGFzc1BhdGhOYW1lID0gY2xhc3NQYXRoTmFtZTsKKyAgICAgICAgbUNoZWNrZXIgPSBjaGVja2VyOworICAgICAgICBtSmF2YTEwSW50ZXJmYWNlU3RyZWFtID0gamF2YTEwSW50ZXJmYWNlU3RyZWFtOworICAgICAgICBtSmF2YTEwRXh0SW50ZXJmYWNlU3RyZWFtID0gamF2YTEwRXh0SW50ZXJmYWNlU3RyZWFtOworICAgICAgICBtSmF2YTExSW50ZXJmYWNlU3RyZWFtID0gamF2YTExSW50ZXJmYWNlU3RyZWFtOworICAgICAgICBtSmF2YTExRXh0SW50ZXJmYWNlU3RyZWFtID0gamF2YTExRXh0SW50ZXJmYWNlU3RyZWFtOworICAgICAgICBtSmF2YTExRXh0UGFja0ludGVyZmFjZVN0cmVhbSA9IGphdmExMUV4dFBhY2tJbnRlcmZhY2VTdHJlYW07CisgICAgICAgIG1KYXZhSW1wbFN0cmVhbSA9IGphdmFJbXBsU3RyZWFtOworICAgICAgICBtQ1N0cmVhbSA9IGNTdHJlYW07CisgICAgICAgIG1Vc2VDb250ZXh0UG9pbnRlciA9IHVzZUNvbnRleHRQb2ludGVyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFZlcnNpb24oaW50IHZlcnNpb24sIGJvb2xlYW4gZXh0LCBib29sZWFuIHBhY2spIHsKKyAgICAgICAgaWYgKHZlcnNpb24gPT0gMCkgeworICAgICAgICAgICAgbUphdmFJbnRlcmZhY2VTdHJlYW0gPSBleHQgPyBtSmF2YTEwRXh0SW50ZXJmYWNlU3RyZWFtIDoKKyAgICAgICAgICAgICAgICBtSmF2YTEwSW50ZXJmYWNlU3RyZWFtOworICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb24gPT0gMSkgeworICAgICAgICAgICAgbUphdmFJbnRlcmZhY2VTdHJlYW0gPSBleHQgPworICAgICAgICAgICAgICAgIChwYWNrID8gbUphdmExMUV4dFBhY2tJbnRlcmZhY2VTdHJlYW0gOgorICAgICAgICAgICAgICAgICBtSmF2YTExRXh0SW50ZXJmYWNlU3RyZWFtKSA6CisgICAgICAgICAgICAgICAgbUphdmExMUludGVyZmFjZVN0cmVhbTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJCYWQgdmVyc2lvbjogIiArIHZlcnNpb24pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW1pdENvZGUoQ0Z1bmMgY2Z1bmMsIFN0cmluZyBvcmlnaW5hbCkgeworICAgICAgICBKRnVuYyBqZnVuYzsKKyAgICAgICAgU3RyaW5nIHNpZ25hdHVyZTsKKyAgICAgICAgYm9vbGVhbiBkdXBsaWNhdGU7CisgICAgICAgIAorICAgICAgICBpZiAoY2Z1bmMuaGFzVHlwZWRQb2ludGVyQXJnKCkpIHsKKyAgICAgICAgICAgIGpmdW5jID0gSkZ1bmMuY29udmVydChjZnVuYywgdHJ1ZSk7CisKKyAgICAgICAgICAgIC8vIERvbid0IGVtaXQgZHVwbGljYXRlIGZ1bmN0aW9ucworICAgICAgICAgICAgLy8gVGhlc2UgbWF5IGFwcGVhciBiZWNhdXNlIHRoZXkgYXJlIGRlZmluZWQgaW4gbXVsdGlwbGUKKyAgICAgICAgICAgIC8vIEphdmEgaW50ZXJmYWNlcyAoZS5nLiwgR0wxMS9HTDExRXh0ZW5zaW9uUGFjaykKKyAgICAgICAgICAgIHNpZ25hdHVyZSA9IGpmdW5jLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBkdXBsaWNhdGUgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChtRnVuY3Rpb25zRW1pdHRlZC5jb250YWlucyhzaWduYXR1cmUpKSB7CisgICAgICAgICAgICAgICAgZHVwbGljYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUZ1bmN0aW9uc0VtaXR0ZWQuYWRkKHNpZ25hdHVyZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghZHVwbGljYXRlKSB7CisgICAgICAgICAgICAgICAgZW1pdE5hdGl2ZURlY2xhcmF0aW9uKGpmdW5jLCBtSmF2YUltcGxTdHJlYW0pOworICAgICAgICAgICAgICAgIGVtaXRKYXZhQ29kZShqZnVuYywgbUphdmFJbXBsU3RyZWFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVtaXRKYXZhSW50ZXJmYWNlQ29kZShqZnVuYywgbUphdmFJbnRlcmZhY2VTdHJlYW0pOworICAgICAgICAgICAgaWYgKCFkdXBsaWNhdGUpIHsKKyAgICAgICAgICAgICAgICBlbWl0Sm5pQ29kZShqZnVuYywgbUNTdHJlYW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgamZ1bmMgPSBKRnVuYy5jb252ZXJ0KGNmdW5jLCBmYWxzZSk7CisKKyAgICAgICAgc2lnbmF0dXJlID0gamZ1bmMudG9TdHJpbmcoKTsKKyAgICAgICAgZHVwbGljYXRlID0gZmFsc2U7CisgICAgICAgIGlmIChtRnVuY3Rpb25zRW1pdHRlZC5jb250YWlucyhzaWduYXR1cmUpKSB7CisgICAgICAgICAgICBkdXBsaWNhdGUgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUZ1bmN0aW9uc0VtaXR0ZWQuYWRkKHNpZ25hdHVyZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWR1cGxpY2F0ZSkgeworICAgICAgICAgICAgZW1pdE5hdGl2ZURlY2xhcmF0aW9uKGpmdW5jLCBtSmF2YUltcGxTdHJlYW0pOworICAgICAgICB9CisgICAgICAgIGVtaXRKYXZhSW50ZXJmYWNlQ29kZShqZnVuYywgbUphdmFJbnRlcmZhY2VTdHJlYW0pOworICAgICAgICBpZiAoIWR1cGxpY2F0ZSkgeworICAgICAgICAgICAgZW1pdEphdmFDb2RlKGpmdW5jLCBtSmF2YUltcGxTdHJlYW0pOworICAgICAgICAgICAgZW1pdEpuaUNvZGUoamZ1bmMsIG1DU3RyZWFtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVtaXROYXRpdmVEZWNsYXJhdGlvbihKRnVuYyBqZnVuYywgUHJpbnRTdHJlYW0gb3V0KSB7CisgICAgICAgIG91dC5wcmludGxuKCIgICAgLy8gQyBmdW5jdGlvbiAiICsgamZ1bmMuZ2V0Q0Z1bmMoKS5nZXRPcmlnaW5hbCgpKTsKKyAgICAgICAgb3V0LnByaW50bG4oKTsKKworICAgICAgICBlbWl0RnVuY3Rpb24oamZ1bmMsIG91dCwgdHJ1ZSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVtaXRKYXZhSW50ZXJmYWNlQ29kZShKRnVuYyBqZnVuYywgUHJpbnRTdHJlYW0gb3V0KSB7CisgICAgICAgIGVtaXRGdW5jdGlvbihqZnVuYywgb3V0LCBmYWxzZSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW1pdEphdmFDb2RlKEpGdW5jIGpmdW5jLCBQcmludFN0cmVhbSBvdXQpIHsKKyAgICAgICAgZW1pdEZ1bmN0aW9uKGpmdW5jLCBvdXQsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorICAgIAorICAgIHZvaWQgZW1pdEZ1bmN0aW9uQ2FsbChKRnVuYyBqZnVuYywgUHJpbnRTdHJlYW0gb3V0LCBTdHJpbmcgaWlpLCBib29sZWFuIGdyYWJBcnJheSApIHsKKyAgICAgICAgYm9vbGVhbiBpc1ZvaWQgPSBqZnVuYy5nZXRUeXBlKCkuaXNWb2lkKCk7CisgICAgICAgIGJvb2xlYW4gaXNQb2ludGVyRnVuYyA9IGpmdW5jLmdldE5hbWUoKS5lbmRzV2l0aCgiUG9pbnRlciIpICYmCisgICAgICAgICAgICBqZnVuYy5nZXRDRnVuYygpLmhhc1BvaW50ZXJBcmcoKTsKKworICAgICAgICBpZiAoIWlzVm9pZCkgeworICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGpmdW5jLmdldFR5cGUoKSArICIgX3JldHVyblZhbHVlOyIpOworICAgICAgICB9CisgICAgICAgIG91dC5wcmludGxuKGlpaSArCisgICAgICAgICAgICAgICAgICAgIChpc1ZvaWQgPyAiIiA6ICJfcmV0dXJuVmFsdWUgPSAiKSArCisgICAgICAgICAgICAgICAgICAgIGpmdW5jLmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgIChpc1BvaW50ZXJGdW5jID8gIkJvdW5kcyIgOiAiIiApICsKKyAgICAgICAgICAgICAgICAgICAgIigiKTsKKwkKKyAgICAgICAgaW50IG51bUFyZ3MgPSBqZnVuYy5nZXROdW1BcmdzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXJnczsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgYXJnTmFtZSA9IGpmdW5jLmdldEFyZ05hbWUoaSk7CisgICAgICAgICAgICBKVHlwZSBhcmdUeXBlID0gamZ1bmMuZ2V0QXJnVHlwZShpKTsKKworICAgICAgICAgICAgaWYgKGdyYWJBcnJheSAmJiBhcmdUeXBlLmlzVHlwZWRCdWZmZXIoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlTmFtZSA9IGFyZ1R5cGUuZ2V0QmFzZVR5cGUoKTsKKyAgICAgICAgICAgICAgICB0eXBlTmFtZSA9IHR5cGVOYW1lLnN1YnN0cmluZyg5LCB0eXBlTmFtZS5sZW5ndGgoKSAtIDYpOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArICJnZXQiICsgdHlwZU5hbWUgKyAiQXJyYXkoIiArIGFyZ05hbWUgKyAiKSwiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoaWlpICsgaW5kZW50ICsgImdldE9mZnNldCgiICsgYXJnTmFtZSArICIpIik7IAorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoaWlpICsgaW5kZW50ICsgYXJnTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaSA9PSBudW1BcmdzIC0gMSkgeworICAgICAgICAgICAgICAgIGlmIChpc1BvaW50ZXJGdW5jKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIsIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArIGFyZ05hbWUgKyAiLnJlbWFpbmluZygpIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIsIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwkKKyAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIik7Iik7CisgICAgfQorCisgICAgdm9pZCBwcmludElmY2hlY2tQb3N0YW1ibGUoUHJpbnRTdHJlYW0gb3V0LCBib29sZWFuIGlzQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZW1pdEV4Y2VwdGlvbkNoZWNrLCBTdHJpbmcgaWlpKSB7CisgICAgICAgIHByaW50SWZjaGVja1Bvc3RhbWJsZShvdXQsIGlzQnVmZmVyLCBlbWl0RXhjZXB0aW9uQ2hlY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2Zmc2V0IiwgIl9yZW1haW5pbmciLCBpaWkpOworICAgIH0KKworICAgIHZvaWQgcHJpbnRJZmNoZWNrUG9zdGFtYmxlKFByaW50U3RyZWFtIG91dCwgYm9vbGVhbiBpc0J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGVtaXRFeGNlcHRpb25DaGVjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb2Zmc2V0LCBTdHJpbmcgcmVtYWluaW5nLCBTdHJpbmcgaWlpKSB7CisgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgZGVmYXVsdDoiKTsKKyAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgICAgX25lZWRlZCA9IDA7Iik7CisgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICAgIGJyZWFrOyIpOworICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAifSIpOworCisgICAgICAgIG91dC5wcmludGxuKGlpaSArICJpZiAoIiArIHJlbWFpbmluZyArICIgPCBfbmVlZGVkKSB7Iik7CisgICAgICAgIGlmIChlbWl0RXhjZXB0aW9uQ2hlY2spIHsKKyAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArICJfZXhjZXB0aW9uID0gMTsiKTsKKyAgICAgICAgfQorICAgICAgICBvdXQucHJpbnRsbihpaWkgKyBpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAobVVzZUNQbHVzUGx1cyA/ICJfZW52IiA6ICIoKl9lbnYpIikgKworICAgICAgICAgICAgICAgICAgICAiLT5UaHJvd05ldygiICsKKyAgICAgICAgICAgICAgICAgICAgKG1Vc2VDUGx1c1BsdXMgPyAiIiA6ICJfZW52LCAiKSArCisgICAgICAgICAgICAgICAgICAgICJJQUVDbGFzcywgIiArCisgICAgICAgICAgICAgICAgICAgICJcIiIgKworICAgICAgICAgICAgICAgICAgICAoaXNCdWZmZXIgPyAKKyAgICAgICAgICAgICAgICAgICAgICJyZW1haW5pbmcoKSIgOiAibGVuZ3RoIC0gIiArIG9mZnNldCkgKworICAgICAgICAgICAgICAgICAgICAiIDwgbmVlZGVkXCIpOyIpOworICAgICAgICBvdXQucHJpbnRsbihpaWkgKyBpbmRlbnQgKyAiZ290byBleGl0OyIpOworICAgICAgICBuZWVkc0V4aXQgPSB0cnVlOworICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAifSIpOworICAgIH0KKworICAgIGJvb2xlYW4gaXNOdWxsQWxsb3dlZChDRnVuYyBjZnVuYykgeworICAgICAgICBTdHJpbmdbXSBjaGVja3MgPSBtQ2hlY2tlci5nZXRDaGVja3MoY2Z1bmMuZ2V0TmFtZSgpKTsKKyAgICAgICAgaW50IGluZGV4ID0gMTsKKyAgICAgICAgaWYgKGNoZWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBjaGVja3MubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJyZXR1cm4iKSkgeworICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAyOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5zdGFydHNXaXRoKCJjaGVjayIpKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDM7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygiaWZjaGVjayIpKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygidW5zdXBwb3J0ZWQiKSkgeworICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoIm51bGxBbGxvd2VkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvcjogdW5rbm93biBrZXl3b3JkIFwiIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja3NbaW5kZXhdICsgIlwiIik7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgU3RyaW5nIGdldEVycm9yUmV0dXJuVmFsdWUoQ0Z1bmMgY2Z1bmMpIHsKKyAgICAgICAgQ1R5cGUgcmV0dXJuVHlwZSA9IGNmdW5jLmdldFR5cGUoKTsKKyAgICAgICAgYm9vbGVhbiBpc1ZvaWQgPSByZXR1cm5UeXBlLmlzVm9pZCgpOworICAgICAgICBpZiAoaXNWb2lkKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ1tdIGNoZWNrcyA9IG1DaGVja2VyLmdldENoZWNrcyhjZnVuYy5nZXROYW1lKCkpOworCisgICAgICAgIGludCBpbmRleCA9IDE7CisgICAgICAgIGlmIChjaGVja3MgIT0gbnVsbCkgeworICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgY2hlY2tzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygicmV0dXJuIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoZWNrc1tpbmRleCArIDFdOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5zdGFydHNXaXRoKCJjaGVjayIpKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDM7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygiaWZjaGVjayIpKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygidW5zdXBwb3J0ZWQiKSkgeworICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoIm51bGxBbGxvd2VkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiB1bmtub3duIGtleXdvcmQgXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrc1tpbmRleF0gKyAiXCIiKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgYm9vbGVhbiBpc1Vuc3VwcG9ydGVkRnVuYyhDRnVuYyBjZnVuYykgeworICAgICAgICBTdHJpbmdbXSBjaGVja3MgPSBtQ2hlY2tlci5nZXRDaGVja3MoY2Z1bmMuZ2V0TmFtZSgpKTsKKyAgICAgICAgaW50IGluZGV4ID0gMTsKKyAgICAgICAgaWYgKGNoZWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBjaGVja3MubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJ1bnN1cHBvcnRlZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoInJldHVybiIpKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDI7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLnN0YXJ0c1dpdGgoImNoZWNrIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJpZmNoZWNrIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gNTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJudWxsQWxsb3dlZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvcjogdW5rbm93biBrZXl3b3JkIFwiIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja3NbaW5kZXhdICsgIlwiIik7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCBlbWl0TmF0aXZlQm91bmRzQ2hlY2tzKENGdW5jIGNmdW5jLCBTdHJpbmcgY25hbWUsIFByaW50U3RyZWFtIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0J1ZmZlciwgYm9vbGVhbiBlbWl0RXhjZXB0aW9uQ2hlY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvZmZzZXQsIFN0cmluZyByZW1haW5pbmcsIFN0cmluZyBpaWkpIHsKKyAgICAgICAgQ1R5cGUgcmV0dXJuVHlwZSA9IGNmdW5jLmdldFR5cGUoKTsKKyAgICAgICAgYm9vbGVhbiBpc1ZvaWQgPSByZXR1cm5UeXBlLmlzVm9pZCgpOworCisgICAgICAgIFN0cmluZ1tdIGNoZWNrcyA9IG1DaGVja2VyLmdldENoZWNrcyhjZnVuYy5nZXROYW1lKCkpOworICAgICAgICBTdHJpbmcgY2hlY2tWYXI7CisgICAgICAgIFN0cmluZyByZXR2YWwgPSBnZXRFcnJvclJldHVyblZhbHVlKGNmdW5jKTsKKworICAgICAgICBib29sZWFuIGxhc3RXYXNJZmNoZWNrID0gZmFsc2U7CisKKyAgICAgICAgaW50IGluZGV4ID0gMTsKKyAgICAgICAgaWYgKGNoZWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICBib29sZWFuIHJlbWFpbmluZ0RlY2xhcmVkID0gZmFsc2U7CisgICAgICAgICAgICBib29sZWFuIG51bGxDaGVja0RlY2xhcmVkID0gZmFsc2U7CisgICAgICAgICAgICBib29sZWFuIG9mZnNldENoZWNrZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGNoZWNrcy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hlY2tzW2luZGV4XS5zdGFydHNXaXRoKCJjaGVjayIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0V2FzSWZjaGVjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRJZmNoZWNrUG9zdGFtYmxlKG91dCwgaXNCdWZmZXIsIGVtaXRFeGNlcHRpb25DaGVjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIHJlbWFpbmluZywgaWlpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBsYXN0V2FzSWZjaGVjayA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBpZiAoY25hbWUgIT0gbnVsbCAmJiAhY25hbWUuZXF1YWxzKGNoZWNrc1tpbmRleCArIDFdKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJpZiAoIiArIHJlbWFpbmluZyArICIgPCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzW2luZGV4ICsgMl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSB7Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbWl0RXhjZXB0aW9uQ2hlY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArICJfZXhjZXB0aW9uID0gMTsiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCQkgICAgU3RyaW5nIGV4Y2VwdGlvbkNsYXNzTmFtZSA9ICJJQUVDbGFzcyI7CisJCSAgICAvLyBJZiB0aGUgImNoZWNrIiBrZXl3b3JkIHdhcyBvZiB0aGUgZm9ybQorCQkgICAgLy8gImNoZWNrXzxjbGFzcyBuYW1lPiIsIHVzZSB0aGUgY2xhc3MgbmFtZSBpbiB0aGUKKwkJICAgIC8vIGV4Y2VwdGlvbiB0byBiZSB0aHJvd24KKwkJICAgIGludCB1bmRlcnNjb3JlID0gY2hlY2tzW2luZGV4XS5pbmRleE9mKCdfJyk7CisJCSAgICBpZiAodW5kZXJzY29yZSA+PSAwKSB7CisJCQlleGNlcHRpb25DbGFzc05hbWUgPSBjaGVja3NbaW5kZXhdLnN1YnN0cmluZyh1bmRlcnNjb3JlICsgMSkgKyAiQ2xhc3MiOworCQkgICAgfQorICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyBpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVVzZUNQbHVzUGx1cyA/ICJfZW52IiA6ICIoKl9lbnYpIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLT5UaHJvd05ldygiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1Vc2VDUGx1c1BsdXMgPyAiIiA6ICJfZW52LCAiKSArCisJCQkJZXhjZXB0aW9uQ2xhc3NOYW1lICsgIiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNCdWZmZXIgPyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW1haW5pbmcoKSIgOiAibGVuZ3RoIC0gIiArIG9mZnNldCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIDwgIiArIGNoZWNrc1tpbmRleCArIDJdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiKTsiKTsKKworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyBpbmRlbnQgKyAiZ290byBleGl0OyIpOworICAgICAgICAgICAgICAgICAgICBuZWVkc0V4aXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAifSIpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAzOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoImlmY2hlY2siKSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBtYXRjaGVzID0gY2hlY2tzW2luZGV4ICsgNF0uc3BsaXQoIiwiKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIWxhc3RXYXNJZmNoZWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiaW50IF9uZWVkZWQ7Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN3aXRjaCAoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja3NbaW5kZXggKyAzXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSB7Iik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF0Y2hlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiNpZiBkZWZpbmVkKCIgKyBtYXRjaGVzW2ldICsgIikiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGNhc2UgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzW2ldICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiI2VuZGlmIC8vIGRlZmluZWQoIiArIG1hdGNoZXNbaV0gKyAiKSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgIF9uZWVkZWQgPSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzW2luZGV4ICsgMl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOyIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICBicmVhazsiKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgbGFzdFdhc0lmY2hlY2sgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpbmRleCArPSA1OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoInJldHVybiIpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAyOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoInVuc3VwcG9ydGVkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygibnVsbEFsbG93ZWQiKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiB1bmtub3duIGtleXdvcmQgXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrc1tpbmRleF0gKyAiXCIiKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGxhc3RXYXNJZmNoZWNrKSB7CisgICAgICAgICAgICBwcmludElmY2hlY2tQb3N0YW1ibGUob3V0LCBpc0J1ZmZlciwgZW1pdEV4Y2VwdGlvbkNoZWNrLCBpaWkpOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbGVhbiBoYXNOb25Db25zdEFyZyhKRnVuYyBqZnVuYywgQ0Z1bmMgY2Z1bmMsCisgICAgICAgIExpc3Q8SW50ZWdlcj4gbm9uUHJpbWl0aXZlQXJncykgeworICAgICAgICBpZiAobm9uUHJpbWl0aXZlQXJncy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gbm9uUHJpbWl0aXZlQXJncy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIGludCBpZHggPSBub25QcmltaXRpdmVBcmdzLmdldChpKS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgICAgIGludCBjSW5kZXggPSBqZnVuYy5nZXRBcmdDSW5kZXgoaWR4KTsKKyAgICAgICAgICAgICAgICBpZiAoamZ1bmMuZ2V0QXJnVHlwZShpZHgpLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWNmdW5jLmdldEFyZ1R5cGUoY0luZGV4KS5pc0NvbnN0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChqZnVuYy5nZXRBcmdUeXBlKGlkeCkuaXNCdWZmZXIoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWNmdW5jLmdldEFyZ1R5cGUoY0luZGV4KS5pc0NvbnN0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBFbWl0IGEgZnVuY3Rpb24gaW4gc2V2ZXJhbCB2YXJpYW50czoKKyAgICAgKgorICAgICAqIGlmIG5hdGl2ZURlY2w6IHB1YmxpYyBuYXRpdmUgPHJldHVybnR5cGU+IGZ1bmMoYXJncyk7CisgICAgICoKKyAgICAgKiBpZiAhbmF0aXZlRGVjbDoKKyAgICAgKiAgIGlmIGludGVyZmFjZURlY2w6ICBwdWJsaWMgPHJldHVybnR5cGU+IGZ1bmMoYXJncyk7CisgICAgICogICBpZiAhaW50ZXJmYWNlRGVjbDogcHVibGljIDxyZXR1cm50eXBlPiBmdW5jKGFyZ3MpIHsgYm9keSB9CisgICAgICovCisgICAgdm9pZCBlbWl0RnVuY3Rpb24oSkZ1bmMgamZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gb3V0LAorICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbmF0aXZlRGVjbCwgYm9vbGVhbiBpbnRlcmZhY2VEZWNsKSB7CisgICAgICAgIGJvb2xlYW4gaXNQb2ludGVyRnVuYyA9CisgICAgICAgICAgICBqZnVuYy5nZXROYW1lKCkuZW5kc1dpdGgoIlBvaW50ZXIiKSAmJgorICAgICAgICAgICAgamZ1bmMuZ2V0Q0Z1bmMoKS5oYXNQb2ludGVyQXJnKCk7CisKKyAgICAgICAgaWYgKCFuYXRpdmVEZWNsICYmICFpbnRlcmZhY2VEZWNsICYmICFpc1BvaW50ZXJGdW5jKSB7CisgICAgICAgICAgICAvLyBJZiBpdCdzIG5vdCBhIHBvaW50ZXIgZnVuY3Rpb24sIHdlJ3ZlIGFscmVhZHkgZW1pdHRlZCBpdAorICAgICAgICAgICAgLy8gd2l0aCBuYXRpdmVEZWNsID09IHRydWUKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc1BvaW50ZXJGdW5jKSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgKG5hdGl2ZURlY2wgPyAicHJpdmF0ZSBuYXRpdmUgIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgKGludGVyZmFjZURlY2wgPyAiIiA6ICJwdWJsaWMgIikpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGpmdW5jLmdldFR5cGUoKSArICIgIiArCisgICAgICAgICAgICAgICAgICAgICAgICBqZnVuYy5nZXROYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgKG5hdGl2ZURlY2wgPyAiQm91bmRzIiA6ICIiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiKCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgIChuYXRpdmVEZWNsID8gInB1YmxpYyBuYXRpdmUgIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgKGludGVyZmFjZURlY2wgPyAiIiA6ICJwdWJsaWMgIikpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGpmdW5jLmdldFR5cGUoKSArICIgIiArCisgICAgICAgICAgICAgICAgICAgICAgICBqZnVuYy5nZXROYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIigiKTsKKyAgICAgICAgfQorCQorICAgICAgICBpbnQgbnVtQXJncyA9IGpmdW5jLmdldE51bUFyZ3MoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BcmdzOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBhcmdOYW1lID0gamZ1bmMuZ2V0QXJnTmFtZShpKTsKKyAgICAgICAgICAgIEpUeXBlIGFyZ1R5cGUgPSBqZnVuYy5nZXRBcmdUeXBlKGkpOworCSAgICAKKyAgICAgICAgICAgIG91dC5wcmludChpbmRlbnQgKyBpbmRlbnQgKyBhcmdUeXBlICsgIiAiICsgYXJnTmFtZSk7CisgICAgICAgICAgICBpZiAoaSA9PSBudW1BcmdzIC0gMSkgeworICAgICAgICAgICAgICAgIGlmIChpc1BvaW50ZXJGdW5jICYmIG5hdGl2ZURlY2wpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiwiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgaW5kZW50ICsgImludCByZW1haW5pbmciKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChuYXRpdmVEZWNsIHx8IGludGVyZmFjZURlY2wpIHsKKyAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICIpOyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIikgeyIpOworCisgICAgICAgICAgICBTdHJpbmcgaWlpID0gaW5kZW50ICsgaW5kZW50OworCisgICAgICAgICAgICBTdHJpbmcgZm5hbWUgPSBqZnVuYy5nZXROYW1lKCk7CisgICAgICAgICAgICBpZiAoaXNQb2ludGVyRnVuYykgeworICAgICAgICAgICAgICAgIC8vIFRPRE8gLSBkZWFsIHdpdGggVkJPIHZhcmlhbnRzCisgICAgICAgICAgICAgICAgaWYgKGZuYW1lLmVxdWFscygiZ2xDb2xvclBvaW50ZXIiKSkgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiaWYgKChzaXplID09IDQpICYmIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgKCh0eXBlID09IEdMX0ZMT0FUKSB8fCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAodHlwZSA9PSBHTF9VTlNJR05FRF9CWVRFKSB8fCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAodHlwZSA9PSBHTF9GSVhFRCkpICYmIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgKHN0cmlkZSA+PSAwKSkgeyIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyBpbmRlbnQgKyAiX2NvbG9yUG9pbnRlciA9IHBvaW50ZXI7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJ9Iik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmbmFtZS5lcXVhbHMoImdsTm9ybWFsUG9pbnRlciIpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJpZiAoKCh0eXBlID09IEdMX0ZMT0FUKSB8fCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAodHlwZSA9PSBHTF9CWVRFKSB8fCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAodHlwZSA9PSBHTF9TSE9SVCkgfHwiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHR5cGUgPT0gR0xfRklYRUQpKSAmJiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgIChzdHJpZGUgPj0gMCkpIHsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgaW5kZW50ICsgIl9ub3JtYWxQb2ludGVyID0gcG9pbnRlcjsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIn0iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZuYW1lLmVxdWFscygiZ2xUZXhDb29yZFBvaW50ZXIiKSkgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiaWYgKCgoc2l6ZSA9PSAyKSB8fCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAoc2l6ZSA9PSAzKSB8fCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAoc2l6ZSA9PSA0KSkgJiYiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAoKHR5cGUgPT0gR0xfRkxPQVQpIHx8Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICh0eXBlID09IEdMX0JZVEUpIHx8Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICh0eXBlID09IEdMX1NIT1JUKSB8fCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAodHlwZSA9PSBHTF9GSVhFRCkpICYmIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgKHN0cmlkZSA+PSAwKSkgeyIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyBpbmRlbnQgKyAiX3RleENvb3JkUG9pbnRlciA9IHBvaW50ZXI7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJ9Iik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmbmFtZS5lcXVhbHMoImdsVmVydGV4UG9pbnRlciIpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJpZiAoKChzaXplID09IDIpIHx8Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgIChzaXplID09IDMpIHx8Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgIChzaXplID09IDQpKSAmJiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICgodHlwZSA9PSBHTF9GTE9BVCkgfHwiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHR5cGUgPT0gR0xfQllURSkgfHwiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHR5cGUgPT0gR0xfU0hPUlQpIHx8Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICh0eXBlID09IEdMX0ZJWEVEKSkgJiYiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAoc3RyaWRlID49IDApKSB7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArICJfdmVydGV4UG9pbnRlciA9IHBvaW50ZXI7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJ9Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBlbWl0Qm91bmRzQ2hlY2tzKGpmdW5jLCBvdXQsIGlpaSk7CisgICAgICAgICAgICBlbWl0RnVuY3Rpb25DYWxsKGpmdW5jLCBvdXQsIGlpaSwgZmFsc2UpOworCisgICAgICAgICAgICBib29sZWFuIGlzVm9pZCA9IGpmdW5jLmdldFR5cGUoKS5pc1ZvaWQoKTsKKworICAgICAgICAgICAgaWYgKCFpc1ZvaWQpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyBpbmRlbnQgKyAicmV0dXJuIF9yZXR1cm5WYWx1ZTsiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJ9Iik7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRKbmlOYW1lKEpUeXBlIGpUeXBlKSB7CisgICAgICAgIFN0cmluZyBqbmlOYW1lID0gIiI7CisgICAgICAgIGlmIChqVHlwZS5pc0NsYXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAiTCIgKyBqVHlwZS5nZXRCYXNlVHlwZSgpICsgIjsiOworICAgICAgICB9IGVsc2UgaWYgKGpUeXBlLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgam5pTmFtZSA9ICJbIjsKKyAgICAgICAgfQorCQorICAgICAgICBTdHJpbmcgYmFzZVR5cGUgPSBqVHlwZS5nZXRCYXNlVHlwZSgpOworICAgICAgICBpZiAoYmFzZVR5cGUuZXF1YWxzKCJpbnQiKSkgeworICAgICAgICAgICAgam5pTmFtZSArPSAiSSI7CisgICAgICAgIH0gZWxzZSBpZiAoYmFzZVR5cGUuZXF1YWxzKCJmbG9hdCIpKSB7CisgICAgICAgICAgICBqbmlOYW1lICs9ICJGIjsKKyAgICAgICAgfSBlbHNlIGlmIChiYXNlVHlwZS5lcXVhbHMoImJvb2xlYW4iKSkgeworICAgICAgICAgICAgam5pTmFtZSArPSAiWiI7CisgICAgICAgIH0gZWxzZSBpZiAoYmFzZVR5cGUuZXF1YWxzKCJzaG9ydCIpKSB7CisgICAgICAgICAgICBqbmlOYW1lICs9ICJTIjsKKyAgICAgICAgfSBlbHNlIGlmIChiYXNlVHlwZS5lcXVhbHMoImxvbmciKSkgeworICAgICAgICAgICAgam5pTmFtZSArPSAiTCI7CisgICAgICAgIH0gZWxzZSBpZiAoYmFzZVR5cGUuZXF1YWxzKCJieXRlIikpIHsKKyAgICAgICAgICAgIGpuaU5hbWUgKz0gIkIiOworICAgICAgICB9CisgICAgICAgIHJldHVybiBqbmlOYW1lOworICAgIH0KKworICAgIFN0cmluZyBnZXRKbmlUeXBlKEpUeXBlIGpUeXBlKSB7CisgICAgICAgIGlmIChqVHlwZS5pc1ZvaWQoKSkgeworICAgICAgICAgICAgcmV0dXJuICJ2b2lkIjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBiYXNlVHlwZSA9IGpUeXBlLmdldEJhc2VUeXBlKCk7CisgICAgICAgIGlmIChqVHlwZS5pc1ByaW1pdGl2ZSgpKSB7CisgICAgICAgICAgICBpZiAoYmFzZVR5cGUuZXF1YWxzKCJTdHJpbmciKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAianN0cmluZyI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiAiaiIgKyBiYXNlVHlwZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChqVHlwZS5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiAiaiIgKyBiYXNlVHlwZSArICJBcnJheSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gImpvYmplY3QiOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIFN0cmluZyBnZXRKbmlNYW5nbGVkTmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlQWxsKCJfIiwgIl8xIik7CisgICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2VBbGwoIjsiLCAiXzIiKTsKKyAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZUFsbCgiXFxbIiwgIl8zIik7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVtaXRKbmlDb2RlKEpGdW5jIGpmdW5jLCBQcmludFN0cmVhbSBvdXQpIHsKKyAgICAgICAgQ0Z1bmMgY2Z1bmMgPSBqZnVuYy5nZXRDRnVuYygpOworCQorICAgICAgICAvLyBFbWl0IGNvbW1lbnQgaWRlbnRpZnlpbmcgb3JpZ2luYWwgQyBmdW5jdGlvbgorICAgICAgICAvLworICAgICAgICAvLyBFeGFtcGxlOgorICAgICAgICAvLworICAgICAgICAvLyAvKiB2b2lkIGdsQ2xpcFBsYW5lZiAoIEdMZW51bSBwbGFuZSwgY29uc3QgR0xmbG9hdCAqZXF1YXRpb24gKSAqLworICAgICAgICAvLworICAgICAgICBvdXQucHJpbnRsbigiLyogIiArIGNmdW5jLmdldE9yaWdpbmFsKCkgKyAiICovIik7CisKKyAgICAgICAgLy8gRW1pdCBKTkkgc2lnbmF0dXJlIChuYW1lKQorICAgICAgICAvLworICAgICAgICAvLyBFeGFtcGxlOgorICAgICAgICAvLworICAgICAgICAvLyB2b2lkCisgICAgICAgIC8vIGFuZHJvaWRfZ2xDbGlwUGxhbmVmX19JXzNGSQorICAgICAgICAvLworCisgICAgICAgIFN0cmluZyBvdXROYW1lID0gImFuZHJvaWRfIiArIGpmdW5jLmdldE5hbWUoKTsKKyAgICAgICAgYm9vbGVhbiBpc1BvaW50ZXJGdW5jID0gb3V0TmFtZS5lbmRzV2l0aCgiUG9pbnRlciIpICYmCisgICAgICAgICAgICBqZnVuYy5nZXRDRnVuYygpLmhhc1BvaW50ZXJBcmcoKTsKKyAgICAgICAgYm9vbGVhbiBpc1ZCT1BvaW50ZXJGdW5jID0gKG91dE5hbWUuZW5kc1dpdGgoIlBvaW50ZXIiKSB8fAorICAgICAgICAgICAgb3V0TmFtZS5lbmRzV2l0aCgiRHJhd0VsZW1lbnRzIikpICYmCisgICAgICAgICAgICAhamZ1bmMuZ2V0Q0Z1bmMoKS5oYXNQb2ludGVyQXJnKCk7CisgICAgICAgIGlmIChpc1BvaW50ZXJGdW5jKSB7CisgICAgICAgICAgICBvdXROYW1lICs9ICJCb3VuZHMiOworICAgICAgICB9CisKKyAgICAgICAgb3V0LnByaW50KCJzdGF0aWMgIik7CisgICAgICAgIG91dC5wcmludGxuKGdldEpuaVR5cGUoamZ1bmMuZ2V0VHlwZSgpKSk7CisgICAgICAgIG91dC5wcmludChvdXROYW1lKTsKKworICAgICAgICBTdHJpbmcgcnNpZ25hdHVyZSA9IGdldEpuaU5hbWUoamZ1bmMuZ2V0VHlwZSgpKTsKKworICAgICAgICBTdHJpbmcgc2lnbmF0dXJlID0gIiI7CisgICAgICAgIGludCBudW1BcmdzID0gamZ1bmMuZ2V0TnVtQXJncygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFyZ3M7IGkrKykgeworICAgICAgICAgICAgSlR5cGUgYXJnVHlwZSA9IGpmdW5jLmdldEFyZ1R5cGUoaSk7CisgICAgICAgICAgICBzaWduYXR1cmUgKz0gZ2V0Sm5pTmFtZShhcmdUeXBlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNQb2ludGVyRnVuYykgeworICAgICAgICAgICAgc2lnbmF0dXJlICs9ICJJIjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFwcGVuZCBzaWduYXR1cmUgdG8gZnVuY3Rpb24gbmFtZQorICAgICAgICBTdHJpbmcgc2lnID0gZ2V0Sm5pTWFuZ2xlZE5hbWUoc2lnbmF0dXJlKS5yZXBsYWNlKCcuJywgJ18nKTsgICAgICAgIAorICAgICAgICBvdXQucHJpbnQoIl9fIiArIHNpZyk7CisgICAgICAgIG91dE5hbWUgKz0gIl9fIiArIHNpZzsKKwkKKyAgICAgICAgc2lnbmF0dXJlID0gc2lnbmF0dXJlLnJlcGxhY2UoJy4nLCAnLycpOworICAgICAgICByc2lnbmF0dXJlID0gcnNpZ25hdHVyZS5yZXBsYWNlKCcuJywgJy8nKTsKKwkKKyAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICAgICAgaWYgKHJzaWduYXR1cmUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgcnNpZ25hdHVyZSA9ICJWIjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBzID0gIntcIiIgKworICAgICAgICAgICAgamZ1bmMuZ2V0TmFtZSgpICsKKyAgICAgICAgICAgIChpc1BvaW50ZXJGdW5jID8gIkJvdW5kcyIgOiAiIikgKworICAgICAgICAgICAgIlwiLCBcIigiICsgc2lnbmF0dXJlICsiKSIgKworICAgICAgICAgICAgcnNpZ25hdHVyZSArCisgICAgICAgICAgICAiXCIsICh2b2lkICopICIgKworICAgICAgICAgICAgb3V0TmFtZSArCisgICAgICAgICAgICAiIH0sIjsKKyAgICAgICAgbmF0aXZlUmVnaXN0cmF0aW9ucy5hZGQocyk7CisKKyAgICAgICAgTGlzdDxJbnRlZ2VyPiBub25QcmltaXRpdmVBcmdzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworICAgICAgICBpbnQgbnVtQnVmZmVyQXJncyA9IDA7CisgICAgICAgIExpc3Q8U3RyaW5nPiBidWZmZXJBcmdOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCisgICAgICAgIC8vIEVtaXQgSk5JIHNpZ25hdHVyZSAoYXJndW1lbnRzKQorICAgICAgICAvLworICAgICAgICAvLyBFeGFtcGxlOgorICAgICAgICAvLworICAgICAgICAvLyAoSk5JRW52ICpfZW52LCBqb2JqZWN0IHRoaXMsIGppbnQgcGxhbmUsIGpmbG9hdEFycmF5IGVxdWF0aW9uX3JlZiwgamludCBvZmZzZXQpIHsKKyAgICAgICAgLy8KKyAgICAgICAgb3V0LnByaW50KCIgIChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMiKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BcmdzOyBpKyspIHsKKyAgICAgICAgICAgIG91dC5wcmludCgiLCAiKTsKKyAgICAgICAgICAgIEpUeXBlIGFyZ1R5cGUgPSBqZnVuYy5nZXRBcmdUeXBlKGkpOworICAgICAgICAgICAgU3RyaW5nIHN1ZmZpeDsKKyAgICAgICAgICAgIGlmICghYXJnVHlwZS5pc1ByaW1pdGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGFyZ1R5cGUuaXNBcnJheSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9ICJfcmVmIjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSAiX2J1ZiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5vblByaW1pdGl2ZUFyZ3MuYWRkKG5ldyBJbnRlZ2VyKGkpKTsKKyAgICAgICAgICAgICAgICBpZiAoamZ1bmMuZ2V0QXJnVHlwZShpKS5pc0J1ZmZlcigpKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBjSW5kZXggPSBqZnVuYy5nZXRBcmdDSW5kZXgoaSk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbmFtZSA9IGNmdW5jLmdldEFyZ05hbWUoY0luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyQXJnTmFtZXMuYWRkKGNuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgbnVtQnVmZmVyQXJncysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3VmZml4ID0gIiI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG91dC5wcmludChnZXRKbmlUeXBlKGFyZ1R5cGUpICsgIiAiICsgamZ1bmMuZ2V0QXJnTmFtZShpKSArIHN1ZmZpeCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzUG9pbnRlckZ1bmMpIHsKKyAgICAgICAgICAgIG91dC5wcmludCgiLCBqaW50IHJlbWFpbmluZyIpOworICAgICAgICB9CisgICAgICAgIG91dC5wcmludGxuKCIpIHsiKTsKKwkKKyAgICAgICAgaW50IG51bUFycmF5cyA9IDA7CisgICAgICAgIGludCBudW1CdWZmZXJzID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub25QcmltaXRpdmVBcmdzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpbnQgaWR4ID0gbm9uUHJpbWl0aXZlQXJncy5nZXQoaSkuaW50VmFsdWUoKTsKKyAgICAgICAgICAgIGludCBjSW5kZXggPSBqZnVuYy5nZXRBcmdDSW5kZXgoaWR4KTsKKyAgICAgICAgICAgIFN0cmluZyBjbmFtZSA9IGNmdW5jLmdldEFyZ05hbWUoY0luZGV4KTsKKyAgICAgICAgICAgIGlmIChqZnVuYy5nZXRBcmdUeXBlKGlkeCkuaXNBcnJheSgpKSB7CisgICAgICAgICAgICAgICAgKytudW1BcnJheXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoamZ1bmMuZ2V0QXJnVHlwZShpZHgpLmlzQnVmZmVyKCkpIHsKKyAgICAgICAgICAgICAgICArK251bUJ1ZmZlcnM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBFbWl0IG1ldGhvZCBib2R5CisKKyAgICAgICAgLy8gRW1pdCBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgZm9yIF9leGNlcHRpb24gYW5kIF9yZXR1cm5WYWx1ZQorICAgICAgICAvLworICAgICAgICAvLyBFeGFtcGxlOgorICAgICAgICAvLworICAgICAgICAvLyBhbmRyb2lkOjpnbDo6b2dsZXNfY29udGV4dF90ICpjdHg7CisgICAgICAgIC8vIAorICAgICAgICAvLyBqaW50IF9leGNlcHRpb247CisgICAgICAgIC8vIEdMZW51bSBfcmV0dXJuVmFsdWU7CisgICAgICAgIC8vCisgICAgICAgIENUeXBlIHJldHVyblR5cGUgPSBjZnVuYy5nZXRUeXBlKCk7CisgICAgICAgIGJvb2xlYW4gaXNWb2lkID0gcmV0dXJuVHlwZS5pc1ZvaWQoKTsKKworICAgICAgICBib29sZWFuIGlzVW5zdXBwb3J0ZWQgPSBpc1Vuc3VwcG9ydGVkRnVuYyhjZnVuYyk7CisgICAgICAgIGlmIChpc1Vuc3VwcG9ydGVkKSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgIl9lbnYtPlRocm93TmV3KFVPRUNsYXNzLCIpOworICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICAgXCIiICsgY2Z1bmMuZ2V0TmFtZSgpICsgIlwiKTsiKTsKKyAgICAgICAgICAgIGlmICghaXNWb2lkKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHJldHZhbCA9IGdldEVycm9yUmV0dXJuVmFsdWUoY2Z1bmMpOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJyZXR1cm4gIiArIHJldHZhbCArICI7Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQucHJpbnRsbigifSIpOworICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtVXNlQ29udGV4dFBvaW50ZXIpIHsKKyAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCisgICAgICAgICAgICAgICAgImFuZHJvaWQ6OmdsOjpvZ2xlc19jb250ZXh0X3QgKmN0eCA9IGdldENvbnRleHQoX2VudiwgX3RoaXMpOyIpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBlbWl0RXhjZXB0aW9uQ2hlY2sgPSAobnVtQXJyYXlzID4gMCB8fCBudW1CdWZmZXJzID4gMCkgJiYKKyAgICAgICAgICAgIGhhc05vbkNvbnN0QXJnKGpmdW5jLCBjZnVuYywgbm9uUHJpbWl0aXZlQXJncyk7CisgICAgICAgIC8vIG1DaGVja2VyLmdldENoZWNrcyhjZnVuYy5nZXROYW1lKCkpICE9IG51bGwKKworICAgICAgICAvLyBFbWl0IGFuIF9leGVwdGlvbiB2YXJpYWJsZSBpZiB0aGVyZSB3aWxsIGJlIGVycm9yIGNoZWNrcworICAgICAgICBpZiAoZW1pdEV4Y2VwdGlvbkNoZWNrKSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiamludCBfZXhjZXB0aW9uID0gMDsiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEVtaXQgYSBzaW5nbGUgX2FycmF5IG9yIG11bHRpcGxlIF9YWFhBcnJheSB2YXJpYWJsZXMKKyAgICAgICAgaWYgKG51bUJ1ZmZlckFyZ3MgPT0gMSkgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJqYXJyYXkgX2FycmF5ID0gKGphcnJheSkgMDsiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQnVmZmVyQXJnczsgaSsrKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgImphcnJheSBfIiArIGJ1ZmZlckFyZ05hbWVzLmdldChpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFycmF5ID0gKGphcnJheSkgMDsiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWlzVm9pZCkgeworICAgICAgICAgICAgU3RyaW5nIHJldHZhbCA9IGdldEVycm9yUmV0dXJuVmFsdWUoY2Z1bmMpOworICAgICAgICAgICAgaWYgKHJldHZhbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgcmV0dXJuVHlwZS5nZXREZWNsYXJhdGlvbigpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIF9yZXR1cm5WYWx1ZSA9ICIgKyByZXR2YWwgKyAiOyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyByZXR1cm5UeXBlLmdldERlY2xhcmF0aW9uKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgX3JldHVyblZhbHVlOyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRW1pdCBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgZm9yIHBvaW50ZXIgYXJndW1lbnRzCisgICAgICAgIC8vCisgICAgICAgIC8vIEV4YW1wbGU6CisgICAgICAgIC8vCisgICAgICAgIC8vIEdMZml4ZWQgKmVxbl9iYXNlOworICAgICAgICAvLyBHTGZpeGVkICplcW47CisgICAgICAgIC8vCisgICAgICAgIFN0cmluZyBvZmZzZXQgPSAib2Zmc2V0IjsKKyAgICAgICAgU3RyaW5nIHJlbWFpbmluZyA9ICJfcmVtYWluaW5nIjsKKyAgICAgICAgaWYgKG5vblByaW1pdGl2ZUFyZ3Muc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub25QcmltaXRpdmVBcmdzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IGlkeCA9IG5vblByaW1pdGl2ZUFyZ3MuZ2V0KGkpLmludFZhbHVlKCk7CisgICAgICAgICAgICAgICAgaW50IGNJbmRleCA9IGpmdW5jLmdldEFyZ0NJbmRleChpZHgpOworICAgICAgICAgICAgICAgIFN0cmluZyBjbmFtZSA9IGNmdW5jLmdldEFyZ05hbWUoY0luZGV4KTsKKworICAgICAgICAgICAgICAgIENUeXBlIHR5cGUgPSBjZnVuYy5nZXRBcmdUeXBlKGpmdW5jLmdldEFyZ0NJbmRleChpZHgpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZGVjbCA9IHR5cGUuZ2V0RGVjbGFyYXRpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAoamZ1bmMuZ2V0QXJnVHlwZShpZHgpLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlY2wuZW5kc1dpdGgoIioiKSA/ICIiIDogIiAiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmdW5jLmdldEFyZ05hbWUoaWR4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfYmFzZSA9ICgiICsgZGVjbCArICIpIDA7Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlbWFpbmluZyA9IChudW1BcnJheXMgPD0gMSAmJiBudW1CdWZmZXJzIDw9IDEpID8gIl9yZW1haW5pbmciIDoKKyAgICAgICAgICAgICAgICAgICAgIl8iICsgY25hbWUgKyAiUmVtYWluaW5nIjsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqaW50ICIgKyByZW1haW5pbmcgKyAiOyIpOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlY2wuZW5kc1dpdGgoIioiKSA/ICIiIDogIiAiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZ1bmMuZ2V0QXJnTmFtZShpZHgpICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiA9ICgiICsgZGVjbCArICIpIDA7Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcmV0dmFsID0gaXNWb2lkID8gIiIgOiAiIF9yZXR1cm5WYWx1ZSI7CisKKyAgICAgICAgLy8gRW1pdCAnR2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbCcgZm9yIGFycmF5cworICAgICAgICAvLyBFbWl0ICdHZXRQb2ludGVyJyBjYWxscyBmb3IgQnVmZmVyIHBvaW50ZXJzCisgICAgICAgIGludCBidWZBcmdJZHggPSAwOworICAgICAgICBpZiAobm9uUHJpbWl0aXZlQXJncy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vblByaW1pdGl2ZUFyZ3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgaWR4ID0gbm9uUHJpbWl0aXZlQXJncy5nZXQoaSkuaW50VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBpbnQgY0luZGV4ID0gamZ1bmMuZ2V0QXJnQ0luZGV4KGlkeCk7CisJCQorICAgICAgICAgICAgICAgIFN0cmluZyBjbmFtZSA9IGNmdW5jLmdldEFyZ05hbWUoY0luZGV4KTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSBudW1BcnJheXMgPD0gMSA/ICJvZmZzZXQiIDoKKyAgICAgICAgICAgICAgICAgICAgY25hbWUgKyAiT2Zmc2V0IjsKKyAgICAgICAgICAgICAgICByZW1haW5pbmcgPSAobnVtQXJyYXlzIDw9IDEgJiYgbnVtQnVmZmVycyA8PSAxKSA/ICJfcmVtYWluaW5nIiA6CisgICAgICAgICAgICAgICAgICAgICJfIiArIGNuYW1lICsgIlJlbWFpbmluZyI7CisKKyAgICAgICAgICAgICAgICBpZiAoamZ1bmMuZ2V0QXJnVHlwZShpZHgpLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWYgKCEiICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNuYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9yZWYpIHsiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVtaXRFeGNlcHRpb25DaGVjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgaW5kZW50ICsgIl9leGNlcHRpb24gPSAxOyIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICIgICAgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVXNlQ1BsdXNQbHVzID8gIl9lbnYiIDogIigqX2VudikiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItPlRocm93TmV3KCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVVzZUNQbHVzUGx1cyA/ICIiIDogIl9lbnYsICIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklBRUNsYXNzLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiArIGNuYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiA9PSBudWxsXCIpOyIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiICAgIGdvdG8gZXhpdDsiKTsKKyAgICAgICAgICAgICAgICAgICAgbmVlZHNFeGl0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIn0iKTsKKworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiaWYgKCIgKyBvZmZzZXQgKyAiIDwgMCkgeyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoZW1pdEV4Y2VwdGlvbkNoZWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyBpbmRlbnQgKyAiX2V4Y2VwdGlvbiA9IDE7Iik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIiAgICAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1Vc2VDUGx1c1BsdXMgPyAiX2VudiIgOiAiKCpfZW52KSIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0+VGhyb3dOZXcoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVXNlQ1BsdXNQbHVzID8gIiIgOiAiX2VudiwgIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSUFFQ2xhc3MsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgb2Zmc2V0ICsgIiA8IDBcIik7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICIgICAgZ290byBleGl0OyIpOworICAgICAgICAgICAgICAgICAgICBuZWVkc0V4aXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAifSIpOworCisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArIHJlbWFpbmluZyArICIgPSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVXNlQ1BsdXNQbHVzID8gIl9lbnYiIDogIigqX2VudikiKSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0+R2V0QXJyYXlMZW5ndGgoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVVzZUNQbHVzUGx1cyA/ICIiIDogIl9lbnYsICIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNuYW1lICsgIl9yZWYpIC0gIiArIG9mZnNldCArICI7Iik7CisKKyAgICAgICAgICAgICAgICAgICAgZW1pdE5hdGl2ZUJvdW5kc0NoZWNrcyhjZnVuYywgY25hbWUsIG91dCwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEV4Y2VwdGlvbkNoZWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgcmVtYWluaW5nLCAiICAgICIpOworCisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNuYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9iYXNlID0gKCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnVuYy5nZXRBcmdUeXBlKGNJbmRleCkuZ2V0RGVjbGFyYXRpb24oKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICIgICAgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVXNlQ1BsdXNQbHVzID8gIl9lbnYiIDogIigqX2VudikiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVXNlQ1BsdXNQbHVzID8gIiIgOiAiX2VudiwgIikgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZ1bmMuZ2V0QXJnTmFtZShpZHgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9yZWYsIChqYm9vbGVhbiAqKTApOyIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbmFtZSArICIgPSAiICsgY25hbWUgKyAiX2Jhc2UgKyAiICsgb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXJyYXkgPSBudW1CdWZmZXJBcmdzIDw9IDEgPyAiX2FycmF5IiA6CisgICAgICAgICAgICAgICAgICAgICAgICAiXyIgKyBidWZmZXJBcmdOYW1lcy5nZXQoYnVmQXJnSWR4KyspICsgIkFycmF5IjsKKworICAgICAgICAgICAgICAgICAgICBib29sZWFuIG51bGxBbGxvd2VkID0gaXNOdWxsQWxsb3dlZChjZnVuYyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChudWxsQWxsb3dlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgImlmICgiICsgY25hbWUgKyAiX2J1ZikgeyIpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KGluZGVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNuYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiA9ICgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Z1bmMuZ2V0QXJnVHlwZShjSW5kZXgpLmdldERlY2xhcmF0aW9uKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKWdldFBvaW50ZXIoX2VudiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNuYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9idWYsICYiICsgYXJyYXkgKyAiLCAmIiArIHJlbWFpbmluZyArICIpOyIpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChudWxsQWxsb3dlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIn0iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGVtaXROYXRpdmVCb3VuZHNDaGVja3MoY2Z1bmMsIGNuYW1lLCBvdXQsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEV4Y2VwdGlvbkNoZWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgcmVtYWluaW5nLCAiICAgICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghaXNWb2lkKSB7CisgICAgICAgICAgICBvdXQucHJpbnQoaW5kZW50ICsgIl9yZXR1cm5WYWx1ZSA9ICIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0LnByaW50KGluZGVudCk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIG5hbWUgPSBjZnVuYy5nZXROYW1lKCk7CisKKyAgICAgICAgaWYgKG1Vc2VDb250ZXh0UG9pbnRlcikgeworICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDIsIG5hbWUubGVuZ3RoKCkpOyAvLyBTdHJpcCBvZmYgJ2dsJyBwcmVmaXgKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCAxKS50b0xvd2VyQ2FzZSgpICsKKyAgICAgICAgICAgICAgICBuYW1lLnN1YnN0cmluZygxLCBuYW1lLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIG91dC5wcmludCgiY3R4LT5wcm9jcy4iKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgb3V0LnByaW50KG5hbWUgKyAoaXNQb2ludGVyRnVuYyA/ICJCb3VuZHMiIDogIiIpICsgIigiKTsKKworICAgICAgICBudW1BcmdzID0gY2Z1bmMuZ2V0TnVtQXJncygpOyAgICAKKyAgICAgICAgaWYgKG51bUFyZ3MgPT0gMCkgeworICAgICAgICAgICAgaWYgKG1Vc2VDb250ZXh0UG9pbnRlcikgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJjdHgpOyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiKTsiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtVXNlQ29udGV4dFBvaW50ZXIpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiY3R4LCIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BcmdzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZWNhc3Q7CisgICAgICAgICAgICAgICAgaWYgKGkgPT0gbnVtQXJncyAtIDEgJiYgaXNWQk9Qb2ludGVyRnVuYykgeworICAgICAgICAgICAgICAgICAgICB0eXBlY2FzdCA9ICJjb25zdCBHTHZvaWQgKiI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdHlwZWNhc3QgPSBjZnVuYy5nZXRBcmdUeXBlKGkpLmdldERlY2xhcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dC5wcmludChpbmRlbnQgKyBpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiKCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlY2FzdCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICIpIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNmdW5jLmdldEFyZ05hbWUoaSkpOworCisgICAgICAgICAgICAgICAgaWYgKGkgPT0gbnVtQXJncyAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzUG9pbnRlckZ1bmMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIsIik7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyBpbmRlbnQgKyAiKEdMc2l6ZWkpcmVtYWluaW5nIik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiwiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiKTsiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuZWVkc0V4aXQpIHsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiZXhpdDoiKTsKKyAgICAgICAgICAgIG5lZWRzRXhpdCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgYnVmQXJnSWR4ID0gMDsKKyAgICAgICAgaWYgKG5vblByaW1pdGl2ZUFyZ3Muc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IG5vblByaW1pdGl2ZUFyZ3Muc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBpbnQgaWR4ID0gbm9uUHJpbWl0aXZlQXJncy5nZXQoaSkuaW50VmFsdWUoKTsKKworICAgICAgICAgICAgICAgIGludCBjSW5kZXggPSBqZnVuYy5nZXRBcmdDSW5kZXgoaWR4KTsKKyAgICAgICAgICAgICAgICBpZiAoamZ1bmMuZ2V0QXJnVHlwZShpZHgpLmlzQXJyYXkoKSkgeworCQkgICAgCisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBhcmd1bWVudCBpcyAnY29uc3QnLCBHTCB3aWxsIG5vdCB3cml0ZSB0byBpdC4KKyAgICAgICAgICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSBjYW4gdXNlIHRoZSAnSk5JX0FCT1JUJyBmbGFnIHRvIGF2b2lkCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBuZWVkIHRvIHdyaXRlIGJhY2sgdG8gdGhlIEphdmEgYXJyYXkKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlmICgiICsgamZ1bmMuZ2V0QXJnTmFtZShpZHgpICsgIl9iYXNlKSB7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArIGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVXNlQ1BsdXNQbHVzID8gIl9lbnYiIDogIigqX2VudikiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVVzZUNQbHVzUGx1cyA/ICIiIDogIl9lbnYsICIpICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmdW5jLmdldEFyZ05hbWUoaWR4KSArICJfcmVmLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Z1bmMuZ2V0QXJnTmFtZShjSW5kZXgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9iYXNlLCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyBpbmRlbnQgKyBpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2Z1bmMuZ2V0QXJnVHlwZShjSW5kZXgpLmlzQ29uc3QoKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSk5JX0FCT1JUIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2V4Y2VwdGlvbiA/IEpOSV9BQk9SVDogMCIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJ9Iik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChqZnVuYy5nZXRBcmdUeXBlKGlkeCkuaXNCdWZmZXIoKSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXJyYXkgPSBudW1CdWZmZXJBcmdzIDw9IDEgPyAiX2FycmF5IiA6CisgICAgICAgICAgICAgICAgICAgICAgICAiXyIgKyBidWZmZXJBcmdOYW1lcy5nZXQoYnVmQXJnSWR4KyspICsgIkFycmF5IjsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgImlmICgiICsgYXJyYXkgKyAiKSB7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArIGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWxlYXNlUG9pbnRlcihfZW52LCAiICsgYXJyYXkgKyAiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Z1bmMuZ2V0QXJnTmFtZShjSW5kZXgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjZnVuYy5nZXRBcmdUeXBlKGNJbmRleCkuaXNDb25zdCgpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKTklfRkFMU0UiIDogIl9leGNlcHRpb24gPyBKTklfRkFMU0UgOiBKTklfVFJVRSIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJ9Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFpc1ZvaWQpIHsKKyAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJyZXR1cm4gX3JldHVyblZhbHVlOyIpOworICAgICAgICB9CisKKyAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKKyAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGROYXRpdmVSZWdpc3RyYXRpb24oU3RyaW5nIHMpIHsKKyAgICAgICAgbmF0aXZlUmVnaXN0cmF0aW9ucy5hZGQocyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW1pdE5hdGl2ZVJlZ2lzdHJhdGlvbigpIHsKKyAgICAgICAgbUNTdHJlYW0ucHJpbnRsbigic3RhdGljIGNvbnN0IGNoYXIgKmNsYXNzUGF0aE5hbWUgPSBcIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgbUNsYXNzUGF0aE5hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgIlwiOyIpOworICAgICAgICBtQ1N0cmVhbS5wcmludGxuKCk7CisKKyAgICAgICAgbUNTdHJlYW0ucHJpbnRsbigic3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBtZXRob2RzW10gPSB7Iik7CisKKyAgICAgICAgbUNTdHJlYW0ucHJpbnRsbigie1wiX25hdGl2ZUNsYXNzSW5pdFwiLCBcIigpVlwiLCAodm9pZCopbmF0aXZlQ2xhc3NJbml0IH0sIik7CisKKyAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBpID0gbmF0aXZlUmVnaXN0cmF0aW9ucy5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIG1DU3RyZWFtLnByaW50bG4oaS5uZXh0KCkpOworICAgICAgICB9CisKKyAgICAgICAgbUNTdHJlYW0ucHJpbnRsbigifTsiKTsKKyAgICAgICAgbUNTdHJlYW0ucHJpbnRsbigpOworICAgIAorCisgICAgICAgIG1DU3RyZWFtLnByaW50bG4oImludCByZWdpc3Rlcl9jb21fZ29vZ2xlX2FuZHJvaWRfZ2xlc19qbmlfR0xJbXBsKEpOSUVudiAqX2VudikiKTsKKyAgICAgICAgbUNTdHJlYW0ucHJpbnRsbigieyIpOworICAgICAgICBtQ1N0cmVhbS5wcmludGxuKGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAiaW50IGVycjsiKTsKKworICAgICAgICBtQ1N0cmVhbS5wcmludGxuKGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAiZXJyID0gYW5kcm9pZDo6QW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhfZW52LCBjbGFzc1BhdGhOYW1lLCBtZXRob2RzLCBORUxFTShtZXRob2RzKSk7Iik7CisKKyAgICAgICAgbUNTdHJlYW0ucHJpbnRsbihpbmRlbnQgKyAicmV0dXJuIGVycjsiKTsKKyAgICAgICAgbUNTdHJlYW0ucHJpbnRsbigifSIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zcmMvUGFyYW1ldGVyQ2hlY2tlci5qYXZhIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9QYXJhbWV0ZXJDaGVja2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYyNmFjZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zcmMvUGFyYW1ldGVyQ2hlY2tlci5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKK3B1YmxpYyBjbGFzcyBQYXJhbWV0ZXJDaGVja2VyIHsKKworICAgIEhhc2hNYXA8U3RyaW5nLFN0cmluZ1tdPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsU3RyaW5nW10+KCk7CisKKyAgICBwdWJsaWMgUGFyYW1ldGVyQ2hlY2tlcihCdWZmZXJlZFJlYWRlciByZWFkZXIpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgczsKKyAgICAgICAgd2hpbGUgKChzID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZ1tdIHRva2VucyA9IHMuc3BsaXQoIlxccyIpOworICAgICAgICAgICAgbWFwLnB1dCh0b2tlbnNbMF0sIHRva2Vucyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q2hlY2tzKFN0cmluZyBmdW5jdGlvbk5hbWUpIHsKKyAgICAgICAgU3RyaW5nW10gY2hlY2tzID0gbWFwLmdldChmdW5jdGlvbk5hbWUpOworICAgICAgICBpZiAoY2hlY2tzID09IG51bGwgJiYKKyAgICAgICAgICAgIChmdW5jdGlvbk5hbWUuZW5kc1dpdGgoImZ2IikgfHwKKyAgICAgICAgICAgICBmdW5jdGlvbk5hbWUuZW5kc1dpdGgoInh2IikgfHwKKyAgICAgICAgICAgICBmdW5jdGlvbk5hbWUuZW5kc1dpdGgoIml2IikpKSB7CisgICAgICAgICAgICBmdW5jdGlvbk5hbWUgPSBmdW5jdGlvbk5hbWUuc3Vic3RyaW5nKDAsIGZ1bmN0aW9uTmFtZS5sZW5ndGgoKSAtIDIpOworICAgICAgICAgICAgY2hlY2tzID0gbWFwLmdldChmdW5jdGlvbk5hbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjaGVja3M7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMMTBFeHRIZWFkZXIuamF2YS1pZiBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTDEwRXh0SGVhZGVyLmphdmEtaWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA5OTljMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTDEwRXh0SGVhZGVyLmphdmEtaWYKQEAgLTAsMCArMSwyMiBAQAorKioKKyoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8vIFRoaXMgc291cmNlIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKKworcGFja2FnZSBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlczsKKworcHVibGljIGludGVyZmFjZSBHTDEwRXh0IGV4dGVuZHMgR0wgeworCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0wxMEhlYWRlci5qYXZhLWlmIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMMTBIZWFkZXIuamF2YS1pZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzkyODIxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMMTBIZWFkZXIuamF2YS1pZgpAQCAtMCwwICsxLDI1OSBAQAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8vIFRoaXMgc291cmNlIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKKworcGFja2FnZSBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlczsKKworcHVibGljIGludGVyZmFjZSBHTDEwIGV4dGVuZHMgR0wgeworICAgIGludCBHTF9BREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMTA0OworICAgIGludCBHTF9BTElBU0VEX0xJTkVfV0lEVEhfUkFOR0UgICAgICAgICAgICAgID0gMHg4NDZFOworICAgIGludCBHTF9BTElBU0VEX1BPSU5UX1NJWkVfUkFOR0UgICAgICAgICAgICAgID0gMHg4NDZEOworICAgIGludCBHTF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOTA2OworICAgIGludCBHTF9BTFBIQV9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDU1OworICAgIGludCBHTF9BTFBIQV9URVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkMwOworICAgIGludCBHTF9BTFdBWVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjA3OworICAgIGludCBHTF9BTUJJRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMjAwOworICAgIGludCBHTF9BTUJJRU5UX0FORF9ESUZGVVNFICAgICAgICAgICAgICAgICAgID0gMHgxNjAyOworICAgIGludCBHTF9BTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTAxOworICAgIGludCBHTF9BTkRfSU5WRVJURUQgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTA0OworICAgIGludCBHTF9BTkRfUkVWRVJTRSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTAyOworICAgIGludCBHTF9CQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNDA1OworICAgIGludCBHTF9CTEVORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkUyOworICAgIGludCBHTF9CTFVFX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDU0OworICAgIGludCBHTF9CWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDAwOworICAgIGludCBHTF9DQ1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwOTAxOworICAgIGludCBHTF9DTEFNUF9UT19FREdFICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MTJGOworICAgIGludCBHTF9DTEVBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTAwOworICAgIGludCBHTF9DT0xPUl9BUlJBWSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDc2OworICAgIGludCBHTF9DT0xPUl9CVUZGRVJfQklUICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDAwOworICAgIGludCBHTF9DT0xPUl9MT0dJQ19PUCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkYyOworICAgIGludCBHTF9DT0xPUl9NQVRFUklBTCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjU3OworICAgIGludCBHTF9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyAgICAgICAgICAgID0gMHg4NkEzOworICAgIGludCBHTF9DT05TVEFOVF9BVFRFTlVBVElPTiAgICAgICAgICAgICAgICAgID0gMHgxMjA3OworICAgIGludCBHTF9DT1BZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTAzOworICAgIGludCBHTF9DT1BZX0lOVkVSVEVEICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTBDOworICAgIGludCBHTF9DVUxMX0ZBQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjQ0OworICAgIGludCBHTF9DVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwOTAwOworICAgIGludCBHTF9ERUNBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyMTAxOworICAgIGludCBHTF9ERUNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRTAzOworICAgIGludCBHTF9ERVBUSF9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDU2OworICAgIGludCBHTF9ERVBUSF9CVUZGRVJfQklUICAgICAgICAgICAgICAgICAgICAgID0gMHgwMTAwOworICAgIGludCBHTF9ERVBUSF9URVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjcxOworICAgIGludCBHTF9ESUZGVVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMjAxOworICAgIGludCBHTF9ESVRIRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkQwOworICAgIGludCBHTF9ET05UX0NBUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMTAwOworICAgIGludCBHTF9EU1RfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMzA0OworICAgIGludCBHTF9EU1RfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMzA2OworICAgIGludCBHTF9FTUlTU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNjAwOworICAgIGludCBHTF9FUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjAyOworICAgIGludCBHTF9FUVVJViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTA5OworICAgIGludCBHTF9FWFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwODAwOworICAgIGludCBHTF9FWFAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwODAxOworICAgIGludCBHTF9FWFRFTlNJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRjAzOworICAgIGludCBHTF9GQUxTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsKKyAgICBpbnQgR0xfRkFTVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTEwMTsKKyAgICBpbnQgR0xfRklYRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwQzsKKyAgICBpbnQgR0xfRkxBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUQwMDsKKyAgICBpbnQgR0xfRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwNjsKKyAgICBpbnQgR0xfRk9HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI2MDsKKyAgICBpbnQgR0xfRk9HX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI2NjsKKyAgICBpbnQgR0xfRk9HX0RFTlNJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI2MjsKKyAgICBpbnQgR0xfRk9HX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI2NDsKKyAgICBpbnQgR0xfRk9HX0hJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEM1NDsKKyAgICBpbnQgR0xfRk9HX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI2NTsKKyAgICBpbnQgR0xfRk9HX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI2MzsKKyAgICBpbnQgR0xfRlJPTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDQwNDsKKyAgICBpbnQgR0xfRlJPTlRfQU5EX0JBQ0sgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDQwODsKKyAgICBpbnQgR0xfR0VRVUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDIwNjsKKyAgICBpbnQgR0xfR1JFQVRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDIwNDsKKyAgICBpbnQgR0xfR1JFRU5fQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQ1MzsKKyAgICBpbnQgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVRfT0VTICA9IDB4OEI5QjsKKyAgICBpbnQgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFX09FUyAgICA9IDB4OEI5QTsKKyAgICBpbnQgR0xfSU5DUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUUwMjsKKyAgICBpbnQgR0xfSU5WQUxJRF9FTlVNICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDUwMDsKKyAgICBpbnQgR0xfSU5WQUxJRF9PUEVSQVRJT04gICAgICAgICAgICAgICAgICAgICA9IDB4MDUwMjsKKyAgICBpbnQgR0xfSU5WQUxJRF9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDUwMTsKKyAgICBpbnQgR0xfSU5WRVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwQTsKKyAgICBpbnQgR0xfS0VFUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUUwMDsKKyAgICBpbnQgR0xfTEVRVUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDIwMzsKKyAgICBpbnQgR0xfTEVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDIwMTsKKyAgICBpbnQgR0xfTElHSFRfTU9ERUxfQU1CSUVOVCAgICAgICAgICAgICAgICAgICA9IDB4MEI1MzsKKyAgICBpbnQgR0xfTElHSFRfTU9ERUxfVFdPX1NJREUgICAgICAgICAgICAgICAgICA9IDB4MEI1MjsKKyAgICBpbnQgR0xfTElHSFQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwMDsKKyAgICBpbnQgR0xfTElHSFQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwMTsKKyAgICBpbnQgR0xfTElHSFQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwMjsKKyAgICBpbnQgR0xfTElHSFQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwMzsKKyAgICBpbnQgR0xfTElHSFQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwNDsKKyAgICBpbnQgR0xfTElHSFQ1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwNTsKKyAgICBpbnQgR0xfTElHSFQ2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwNjsKKyAgICBpbnQgR0xfTElHSFQ3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwNzsKKyAgICBpbnQgR0xfTElHSFRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI1MDsKKyAgICBpbnQgR0xfTElORV9MT09QICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMjsKKyAgICBpbnQgR0xfTElORV9TTU9PVEggICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEIyMDsKKyAgICBpbnQgR0xfTElORV9TTU9PVEhfSElOVCAgICAgICAgICAgICAgICAgICAgICA9IDB4MEM1MjsKKyAgICBpbnQgR0xfTElORV9TVFJJUCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMzsKKyAgICBpbnQgR0xfTElORUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MjYwMTsKKyAgICBpbnQgR0xfTElORUFSX0FUVEVOVUFUSU9OICAgICAgICAgICAgICAgICAgICA9IDB4MTIwODsKKyAgICBpbnQgR0xfTElORUFSX01JUE1BUF9MSU5FQVIgICAgICAgICAgICAgICAgICA9IDB4MjcwMzsKKyAgICBpbnQgR0xfTElORUFSX01JUE1BUF9ORUFSRVNUICAgICAgICAgICAgICAgICA9IDB4MjcwMTsKKyAgICBpbnQgR0xfTElORVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMTsKKyAgICBpbnQgR0xfTFVNSU5BTkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTkwOTsKKyAgICBpbnQgR0xfTFVNSU5BTkNFX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTkwQTsKKyAgICBpbnQgR0xfTUFYX0VMRU1FTlRTX0lORElDRVMgICAgICAgICAgICAgICAgICA9IDB4ODBFOTsKKyAgICBpbnQgR0xfTUFYX0VMRU1FTlRTX1ZFUlRJQ0VTICAgICAgICAgICAgICAgICA9IDB4ODBFODsKKyAgICBpbnQgR0xfTUFYX0xJR0hUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQzMTsKKyAgICBpbnQgR0xfTUFYX01PREVMVklFV19TVEFDS19ERVBUSCAgICAgICAgICAgICA9IDB4MEQzNjsKKyAgICBpbnQgR0xfTUFYX1BST0pFQ1RJT05fU1RBQ0tfREVQVEggICAgICAgICAgICA9IDB4MEQzODsKKyAgICBpbnQgR0xfTUFYX1RFWFRVUkVfU0laRSAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQzMzsKKyAgICBpbnQgR0xfTUFYX1RFWFRVUkVfU1RBQ0tfREVQVEggICAgICAgICAgICAgICA9IDB4MEQzOTsKKyAgICBpbnQgR0xfTUFYX1RFWFRVUkVfVU5JVFMgICAgICAgICAgICAgICAgICAgICA9IDB4ODRFMjsKKyAgICBpbnQgR0xfTUFYX1ZJRVdQT1JUX0RJTVMgICAgICAgICAgICAgICAgICAgICA9IDB4MEQzQTsKKyAgICBpbnQgR0xfTU9ERUxWSUVXICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTcwMDsKKyAgICBpbnQgR0xfTU9EVUxBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MjEwMDsKKyAgICBpbnQgR0xfTVVMVElTQU1QTEUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA5RDsKKyAgICBpbnQgR0xfTkFORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwRTsKKyAgICBpbnQgR0xfTkVBUkVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MjYwMDsKKyAgICBpbnQgR0xfTkVBUkVTVF9NSVBNQVBfTElORUFSICAgICAgICAgICAgICAgICA9IDB4MjcwMjsKKyAgICBpbnQgR0xfTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCAgICAgICAgICAgICAgICA9IDB4MjcwMDsKKyAgICBpbnQgR0xfTkVWRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDIwMDsKKyAgICBpbnQgR0xfTklDRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTEwMjsKKyAgICBpbnQgR0xfTk9fRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7CisgICAgaW50IEdMX05PT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDU7CisgICAgaW50IEdMX05PUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDg7CisgICAgaW50IEdMX05PUk1BTF9BUlJBWSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwNzU7CisgICAgaW50IEdMX05PUk1BTElaRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCQTE7CisgICAgaW50IEdMX05PVEVRVUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAyMDU7CisgICAgaW50IEdMX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyAgICAgICAgPSAweDg2QTI7CisgICAgaW50IEdMX09ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOworICAgIGludCBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBICAgICAgICAgICAgICAgICAgID0gMHgwMzA1OworICAgIGludCBHTF9PTkVfTUlOVVNfRFNUX0NPTE9SICAgICAgICAgICAgICAgICAgID0gMHgwMzA3OworICAgIGludCBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBICAgICAgICAgICAgICAgICAgID0gMHgwMzAzOworICAgIGludCBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SICAgICAgICAgICAgICAgICAgID0gMHgwMzAxOworICAgIGludCBHTF9PUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTA3OworICAgIGludCBHTF9PUl9JTlZFUlRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTBEOworICAgIGludCBHTF9PUl9SRVZFUlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTBCOworICAgIGludCBHTF9PVVRfT0ZfTUVNT1JZICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNTA1OworICAgIGludCBHTF9QQUNLX0FMSUdOTUVOVCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDA1OworICAgIGludCBHTF9QQUxFVFRFNF9SNV9HNl9CNV9PRVMgICAgICAgICAgICAgICAgID0gMHg4QjkyOworICAgIGludCBHTF9QQUxFVFRFNF9SR0I1X0ExX09FUyAgICAgICAgICAgICAgICAgID0gMHg4Qjk0OworICAgIGludCBHTF9QQUxFVFRFNF9SR0I4X09FUyAgICAgICAgICAgICAgICAgICAgID0gMHg4QjkwOworICAgIGludCBHTF9QQUxFVFRFNF9SR0JBNF9PRVMgICAgICAgICAgICAgICAgICAgID0gMHg4QjkzOworICAgIGludCBHTF9QQUxFVFRFNF9SR0JBOF9PRVMgICAgICAgICAgICAgICAgICAgID0gMHg4QjkxOworICAgIGludCBHTF9QQUxFVFRFOF9SNV9HNl9CNV9PRVMgICAgICAgICAgICAgICAgID0gMHg4Qjk3OworICAgIGludCBHTF9QQUxFVFRFOF9SR0I1X0ExX09FUyAgICAgICAgICAgICAgICAgID0gMHg4Qjk5OworICAgIGludCBHTF9QQUxFVFRFOF9SR0I4X09FUyAgICAgICAgICAgICAgICAgICAgID0gMHg4Qjk1OworICAgIGludCBHTF9QQUxFVFRFOF9SR0JBNF9PRVMgICAgICAgICAgICAgICAgICAgID0gMHg4Qjk4OworICAgIGludCBHTF9QQUxFVFRFOF9SR0JBOF9PRVMgICAgICAgICAgICAgICAgICAgID0gMHg4Qjk2OworICAgIGludCBHTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQgICAgICAgICAgID0gMHgwQzUwOworICAgIGludCBHTF9QT0lOVF9TTU9PVEggICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjEwOworICAgIGludCBHTF9QT0lOVF9TTU9PVEhfSElOVCAgICAgICAgICAgICAgICAgICAgID0gMHgwQzUxOworICAgIGludCBHTF9QT0lOVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwOworICAgIGludCBHTF9QT0lOVF9GQURFX1RIUkVTSE9MRF9TSVpFICAgICAgICAgICAgID0gMHg4MTI4OworICAgIGludCBHTF9QT0lOVF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjExOworICAgIGludCBHTF9QT0xZR09OX09GRlNFVF9GSUxMICAgICAgICAgICAgICAgICAgID0gMHg4MDM3OworICAgIGludCBHTF9QT0xZR09OX1NNT09USF9ISU5UICAgICAgICAgICAgICAgICAgID0gMHgwQzUzOworICAgIGludCBHTF9QT1NJVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMjAzOworICAgIGludCBHTF9QUk9KRUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNzAxOworICAgIGludCBHTF9RVUFEUkFUSUNfQVRURU5VQVRJT04gICAgICAgICAgICAgICAgID0gMHgxMjA5OworICAgIGludCBHTF9SRURfQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDUyOworICAgIGludCBHTF9SRU5ERVJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRjAxOworICAgIGludCBHTF9SRVBFQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyOTAxOworICAgIGludCBHTF9SRVBMQUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRTAxOworICAgIGludCBHTF9SRVNDQUxFX05PUk1BTCAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDNBOworICAgIGludCBHTF9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOTA3OworICAgIGludCBHTF9SR0JBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOTA4OworICAgIGludCBHTF9TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UgICAgICAgICAgICAgID0gMHg4MDlFOworICAgIGludCBHTF9TQU1QTEVfQUxQSEFfVE9fT05FICAgICAgICAgICAgICAgICAgID0gMHg4MDlGOworICAgIGludCBHTF9TQU1QTEVfQ09WRVJBR0UgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MEEwOworICAgIGludCBHTF9TQ0lTU09SX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQzExOworICAgIGludCBHTF9TRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTBGOworICAgIGludCBHTF9TSElOSU5FU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNjAxOworICAgIGludCBHTF9TSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDAyOworICAgIGludCBHTF9TTU9PVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRDAxOworICAgIGludCBHTF9TTU9PVEhfTElORV9XSURUSF9SQU5HRSAgICAgICAgICAgICAgID0gMHgwQjIyOworICAgIGludCBHTF9TTU9PVEhfUE9JTlRfU0laRV9SQU5HRSAgICAgICAgICAgICAgID0gMHgwQjEyOworICAgIGludCBHTF9TUEVDVUxBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMjAyOworICAgIGludCBHTF9TUE9UX0NVVE9GRiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMjA2OworICAgIGludCBHTF9TUE9UX0RJUkVDVElPTiAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMjA0OworICAgIGludCBHTF9TUE9UX0VYUE9ORU5UICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMjA1OworICAgIGludCBHTF9TUkNfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMzAyOworICAgIGludCBHTF9TUkNfQUxQSEFfU0FUVVJBVEUgICAgICAgICAgICAgICAgICAgID0gMHgwMzA4OworICAgIGludCBHTF9TUkNfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMzAwOworICAgIGludCBHTF9TVEFDS19PVkVSRkxPVyAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNTAzOworICAgIGludCBHTF9TVEFDS19VTkRFUkZMT1cgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNTA0OworICAgIGludCBHTF9TVEVOQ0lMX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDU3OworICAgIGludCBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQgICAgICAgICAgICAgICAgICAgID0gMHgwNDAwOworICAgIGludCBHTF9TVEVOQ0lMX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjkwOworICAgIGludCBHTF9TVUJQSVhFTF9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDUwOworICAgIGludCBHTF9URVhUVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNzAyOworICAgIGludCBHTF9URVhUVVJFXzJEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwREUxOworICAgIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZICAgICAgICAgICAgICAgICAgID0gMHg4MDc4OworICAgIGludCBHTF9URVhUVVJFX0VOViAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyMzAwOworICAgIGludCBHTF9URVhUVVJFX0VOVl9DT0xPUiAgICAgICAgICAgICAgICAgICAgID0gMHgyMjAxOworICAgIGludCBHTF9URVhUVVJFX0VOVl9NT0RFICAgICAgICAgICAgICAgICAgICAgID0gMHgyMjAwOworICAgIGludCBHTF9URVhUVVJFX01BR19GSUxURVIgICAgICAgICAgICAgICAgICAgID0gMHgyODAwOworICAgIGludCBHTF9URVhUVVJFX01JTl9GSUxURVIgICAgICAgICAgICAgICAgICAgID0gMHgyODAxOworICAgIGludCBHTF9URVhUVVJFX1dSQVBfUyAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyODAyOworICAgIGludCBHTF9URVhUVVJFX1dSQVBfVCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyODAzOworICAgIGludCBHTF9URVhUVVJFMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEMwOworICAgIGludCBHTF9URVhUVVJFMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEMxOworICAgIGludCBHTF9URVhUVVJFMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEMyOworICAgIGludCBHTF9URVhUVVJFMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEMzOworICAgIGludCBHTF9URVhUVVJFNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEM0OworICAgIGludCBHTF9URVhUVVJFNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEM1OworICAgIGludCBHTF9URVhUVVJFNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEM2OworICAgIGludCBHTF9URVhUVVJFNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEM3OworICAgIGludCBHTF9URVhUVVJFOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEM4OworICAgIGludCBHTF9URVhUVVJFOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEM5OworICAgIGludCBHTF9URVhUVVJFMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NENBOworICAgIGludCBHTF9URVhUVVJFMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NENCOworICAgIGludCBHTF9URVhUVVJFMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NENDOworICAgIGludCBHTF9URVhUVVJFMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NENEOworICAgIGludCBHTF9URVhUVVJFMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NENFOworICAgIGludCBHTF9URVhUVVJFMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NENGOworICAgIGludCBHTF9URVhUVVJFMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQwOworICAgIGludCBHTF9URVhUVVJFMTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQxOworICAgIGludCBHTF9URVhUVVJFMTggICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQyOworICAgIGludCBHTF9URVhUVVJFMTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQzOworICAgIGludCBHTF9URVhUVVJFMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQ0OworICAgIGludCBHTF9URVhUVVJFMjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQ1OworICAgIGludCBHTF9URVhUVVJFMjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQ2OworICAgIGludCBHTF9URVhUVVJFMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQ3OworICAgIGludCBHTF9URVhUVVJFMjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQ4OworICAgIGludCBHTF9URVhUVVJFMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQ5OworICAgIGludCBHTF9URVhUVVJFMjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NERBOworICAgIGludCBHTF9URVhUVVJFMjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NERCOworICAgIGludCBHTF9URVhUVVJFMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NERDOworICAgIGludCBHTF9URVhUVVJFMjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEREOworICAgIGludCBHTF9URVhUVVJFMzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NERFOworICAgIGludCBHTF9URVhUVVJFMzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NERGOworICAgIGludCBHTF9UUklBTkdMRV9GQU4gICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDA2OworICAgIGludCBHTF9UUklBTkdMRV9TVFJJUCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDA1OworICAgIGludCBHTF9UUklBTkdMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDA0OworICAgIGludCBHTF9UUlVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTsKKyAgICBpbnQgR0xfVU5QQUNLX0FMSUdOTUVOVCAgICAgICAgICAgICAgICAgICAgICA9IDB4MENGNTsKKyAgICBpbnQgR0xfVU5TSUdORURfQllURSAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwMTsKKyAgICBpbnQgR0xfVU5TSUdORURfU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwMzsKKyAgICBpbnQgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCAgICAgICAgICAgICAgICA9IDB4ODAzMzsKKyAgICBpbnQgR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMSAgICAgICAgICAgICAgICA9IDB4ODAzNDsKKyAgICBpbnQgR0xfVU5TSUdORURfU0hPUlRfNV82XzUgICAgICAgICAgICAgICAgICA9IDB4ODM2MzsKKyAgICBpbnQgR0xfVkVORE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUYwMDsKKyAgICBpbnQgR0xfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUYwMjsKKyAgICBpbnQgR0xfVkVSVEVYX0FSUkFZICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA3NDsKKyAgICBpbnQgR0xfWE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwNjsKKyAgICBpbnQgR0xfWkVSTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7CisKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTDExRXh0SGVhZGVyLmphdmEtaWYgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0wxMUV4dEhlYWRlci5qYXZhLWlmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZTIxNjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0wxMUV4dEhlYWRlci5qYXZhLWlmCkBAIC0wLDAgKzEsNDAgQEAKKyoqCisqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvLyBUaGlzIHNvdXJjZSBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCisKK3BhY2thZ2UgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXM7CisKK3B1YmxpYyBpbnRlcmZhY2UgR0wxMUV4dCBleHRlbmRzIEdMIHsKKyAgICBpbnQgR0xfTUFUUklYX0lOREVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FUyA9IDB4OEI5RTsKKyAgICBpbnQgR0xfTUFUUklYX0lOREVYX0FSUkFZX09FUyAgICAgICAgICAgICAgICA9IDB4ODg0NDsKKyAgICBpbnQgR0xfTUFUUklYX0lOREVYX0FSUkFZX1BPSU5URVJfT0VTICAgICAgICA9IDB4ODg0OTsKKyAgICBpbnQgR0xfTUFUUklYX0lOREVYX0FSUkFZX1NJWkVfT0VTICAgICAgICAgICA9IDB4ODg0NjsKKyAgICBpbnQgR0xfTUFUUklYX0lOREVYX0FSUkFZX1NUUklERV9PRVMgICAgICAgICA9IDB4ODg0ODsKKyAgICBpbnQgR0xfTUFUUklYX0lOREVYX0FSUkFZX1RZUEVfT0VTICAgICAgICAgICA9IDB4ODg0NzsKKyAgICBpbnQgR0xfTUFUUklYX1BBTEVUVEVfT0VTICAgICAgICAgICAgICAgICAgICA9IDB4ODg0MDsKKyAgICBpbnQgR0xfTUFYX1BBTEVUVEVfTUFUUklDRVNfT0VTICAgICAgICAgICAgICA9IDB4ODg0MjsKKyAgICBpbnQgR0xfTUFYX1ZFUlRFWF9VTklUU19PRVMgICAgICAgICAgICAgICAgICA9IDB4ODZBNDsKKyAgICBpbnQgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTICAgICAgICAgICAgICAgICA9IDB4OEI5RDsKKyAgICBpbnQgR0xfV0VJR0hUX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FUyAgICAgICA9IDB4ODg5RTsKKyAgICBpbnQgR0xfV0VJR0hUX0FSUkFZX09FUyAgICAgICAgICAgICAgICAgICAgICA9IDB4ODZBRDsKKyAgICBpbnQgR0xfV0VJR0hUX0FSUkFZX1BPSU5URVJfT0VTICAgICAgICAgICAgICA9IDB4ODZBQzsKKyAgICBpbnQgR0xfV0VJR0hUX0FSUkFZX1NJWkVfT0VTICAgICAgICAgICAgICAgICA9IDB4ODZBQjsKKyAgICBpbnQgR0xfV0VJR0hUX0FSUkFZX1NUUklERV9PRVMgICAgICAgICAgICAgICA9IDB4ODZBQTsKKyAgICBpbnQgR0xfV0VJR0hUX0FSUkFZX1RZUEVfT0VTICAgICAgICAgICAgICAgICA9IDB4ODZBOTsKKworICAgIHZvaWQgZ2xUZXhQYXJhbWV0ZXJmdihpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW0sIGludCBvZmZzZXQpOworCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0wxMUV4dGVuc2lvblBhY2tIZWFkZXIuamF2YS1pZiBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTDExRXh0ZW5zaW9uUGFja0hlYWRlci5qYXZhLWlmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MDAxOTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0wxMUV4dGVuc2lvblBhY2tIZWFkZXIuamF2YS1pZgpAQCAtMCwwICsxLDEwOCBAQAorKioKKyoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8vIFRoaXMgc291cmNlIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKKworcGFja2FnZSBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlczsKKworcHVibGljIGludGVyZmFjZSBHTDExRXh0ZW5zaW9uUGFjayBleHRlbmRzIEdMIHsKKyAgICBpbnQgR0xfQkxFTkRfRFNUX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MENBOworICAgIGludCBHTF9CTEVORF9EU1RfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwQzg7CisgICAgaW50IEdMX0JMRU5EX0VRVUFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODAwOTsKKyAgICBpbnQgR0xfQkxFTkRfRVFVQVRJT05fQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4ODNEOworICAgIGludCBHTF9CTEVORF9FUVVBVElPTl9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwMDk7CisgICAgaW50IEdMX0JMRU5EX1NSQ19BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODBDQjsKKyAgICBpbnQgR0xfQkxFTkRfU1JDX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MEM5OworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UMF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRTA7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQxX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFMTsKKyAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDJfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0UyOworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UM19PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRTM7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQ0X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFNDsKKyAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0U1OworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UNl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRTY7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQ3X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFNzsKKyAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDhfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0U4OworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UOV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRTk7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQxMF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFQTsKKyAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDExX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0VCOworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UMTJfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRUM7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQxM19PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFRDsKKyAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDE0X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0VFOworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UMTVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRUY7CisgICAgaW50IEdMX0RFQ1JfV1JBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUwODsKKyAgICBpbnQgR0xfREVQVEhfQVRUQUNITUVOVF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDAwOworICAgIGludCBHTF9ERVBUSF9DT01QT05FTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE5MDI7CisgICAgaW50IEdMX0RFUFRIX0NPTVBPTkVOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODFBNTsKKyAgICBpbnQgR0xfREVQVEhfQ09NUE9ORU5UMjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MUE2OworICAgIGludCBHTF9ERVBUSF9DT01QT05FTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgxQTc7CisgICAgaW50IEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX05BTUVfT0VTICAgICAgICAgICA9IDB4OENEMTsKKyAgICBpbnQgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfVFlQRV9PRVMgICAgICAgICAgID0gMHg4Q0QwOworICAgIGludCBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfQ1VCRV9NQVBfRkFDRV9PRVMgPSAweDhDRDM7CisgICAgaW50IEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9MRVZFTF9PRVMgICAgICAgICA9IDB4OENEMjsKKyAgICBpbnQgR0xfRlJBTUVCVUZGRVJfQklORElOR19PRVMgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0E2OworICAgIGludCBHTF9GUkFNRUJVRkZFUl9DT01QTEVURV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRDU7CisgICAgaW50IEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfQVRUQUNITUVOVF9PRVMgICAgICAgICAgICA9IDB4OENENjsKKyAgICBpbnQgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9ESU1FTlNJT05TX09FUyAgICAgICAgICAgID0gMHg4Q0Q5OworICAgIGludCBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RSQVdfQlVGRkVSX09FUyAgICAgICAgICAgPSAweDhDREI7CisgICAgaW50IEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRk9STUFUU19PRVMgICAgICAgICAgICAgICA9IDB4OENEQTsKKyAgICBpbnQgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlRfT0VTICAgID0gMHg4Q0Q3OworICAgIGludCBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX1JFQURfQlVGRkVSX09FUyAgICAgICAgICAgPSAweDhDREM7CisgICAgaW50IEdMX0ZSQU1FQlVGRkVSX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ0MDsKKyAgICBpbnQgR0xfRlJBTUVCVUZGRVJfVU5TVVBQT1JURURfT0VTICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0REOworICAgIGludCBHTF9GVU5DX0FERCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwMDY7CisgICAgaW50IEdMX0ZVTkNfUkVWRVJTRV9TVUJUUkFDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODAwQjsKKyAgICBpbnQgR0xfRlVOQ19TVUJUUkFDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDBBOworICAgIGludCBHTF9JTkNSX1dSQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1MDc7CisgICAgaW50IEdMX0lOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OX09FUyAgICAgICAgICAgICAgICA9IDB4MDUwNjsKKyAgICBpbnQgR0xfTUFYX0NPTE9SX0FUVEFDSE1FTlRTX09FUyAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0RGOworICAgIGludCBHTF9NQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1MUM7CisgICAgaW50IEdMX01BWF9SRU5ERVJCVUZGRVJfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRFODsKKyAgICBpbnQgR0xfTUlSUk9SRURfUkVQRUFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MzcwOworICAgIGludCBHTF9OT1JNQUxfTUFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1MTE7CisgICAgaW50IEdMX1JFRkxFQ1RJT05fTUFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxMjsKKyAgICBpbnQgR0xfUkVOREVSQlVGRkVSX0FMUEhBX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDUzOworICAgIGludCBHTF9SRU5ERVJCVUZGRVJfQklORElOR19PRVMgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDQTc7CisgICAgaW50IEdMX1JFTkRFUkJVRkZFUl9CTFVFX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ1MjsKKyAgICBpbnQgR0xfUkVOREVSQlVGRkVSX0RFUFRIX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDU0OworICAgIGludCBHTF9SRU5ERVJCVUZGRVJfR1JFRU5fU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgPSAweDhENTE7CisgICAgaW50IEdMX1JFTkRFUkJVRkZFUl9IRUlHSFRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ0MzsKKyAgICBpbnQgR0xfUkVOREVSQlVGRkVSX0lOVEVSTkFMX0ZPUk1BVF9PRVMgICAgICAgICAgICAgICAgID0gMHg4RDQ0OworICAgIGludCBHTF9SRU5ERVJCVUZGRVJfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENDE7CisgICAgaW50IEdMX1JFTkRFUkJVRkZFUl9SRURfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ1MDsKKyAgICBpbnQgR0xfUkVOREVSQlVGRkVSX1NURU5DSUxfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgID0gMHg4RDU1OworICAgIGludCBHTF9SRU5ERVJCVUZGRVJfV0lEVEhfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENDI7CisgICAgaW50IEdMX1JHQjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA1NzsKKyAgICBpbnQgR0xfUkdCNTY1X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDYyOworICAgIGludCBHTF9SR0I4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwNTE7CisgICAgaW50IEdMX1JHQkE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA1NjsKKyAgICBpbnQgR0xfUkdCQTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDU4OworICAgIGludCBHTF9TVEVOQ0lMX0FUVEFDSE1FTlRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhEMjA7CisgICAgaW50IEdMX1NURU5DSUxfSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTkwMTsKKyAgICBpbnQgR0xfU1RFTkNJTF9JTkRFWDFfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDQ2OworICAgIGludCBHTF9TVEVOQ0lMX0lOREVYNF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENDc7CisgICAgaW50IEdMX1NURU5DSUxfSU5ERVg4X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ0ODsKKyAgICBpbnQgR0xfU1RSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gLTE7CisgICAgaW50IEdMX1RFWFRVUkVfQklORElOR19DVUJFX01BUCAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxNDsKKyAgICBpbnQgR0xfVEVYVFVSRV9DVUJFX01BUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTEzOworICAgIGludCBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1ggICAgICAgICAgICAgICAgICAgICAgPSAweDg1MTY7CisgICAgaW50IEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWSAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxODsKKyAgICBpbnQgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9aICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTFBOworICAgIGludCBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggICAgICAgICAgICAgICAgICAgICAgPSAweDg1MTU7CisgICAgaW50IEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWSAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxNzsKKyAgICBpbnQgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTE5OworICAgIGludCBHTF9URVhUVVJFX0dFTl9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDI1MDA7CisgICAgaW50IEdMX1RFWFRVUkVfR0VOX1NUUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ2MDsKKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMMTFIZWFkZXIuamF2YS1pZiBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTDExSGVhZGVyLmphdmEtaWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBlNWE2YgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTDExSGVhZGVyLmphdmEtaWYKQEAgLTAsMCArMSwxNDUgQEAKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvLyBUaGlzIHNvdXJjZSBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCisKK3BhY2thZ2UgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXM7CisKK3B1YmxpYyBpbnRlcmZhY2UgR0wxMSBleHRlbmRzIEdMMTAgeworICAgIGludCBHTF9BQ1RJVkVfVEVYVFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RTA7CisgICAgaW50IEdMX0FERF9TSUdORUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU3NDsKKyAgICBpbnQgR0xfQUxQSEFfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDFDOworICAgIGludCBHTF9BTFBIQV9URVNUX0ZVTkMgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCQzE7CisgICAgaW50IEdMX0FMUEhBX1RFU1RfUkVGICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJDMjsKKyAgICBpbnQgR0xfQVJSQVlfQlVGRkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4ODkyOworICAgIGludCBHTF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgICAgICAgICAgICAgICAgPSAweDg4OTQ7CisgICAgaW50IEdMX0JMRU5EX0RTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJFMDsKKyAgICBpbnQgR0xfQkxFTkRfU1JDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkUxOworICAgIGludCBHTF9CVUZGRVJfQUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4QkI7CisgICAgaW50IEdMX0JVRkZFUl9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODc2NDsKKyAgICBpbnQgR0xfQlVGRkVSX1VTQUdFICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NzY1OworICAgIGludCBHTF9DTElFTlRfQUNUSVZFX1RFWFRVUkUgICAgICAgICAgICAgICAgICAgPSAweDg0RTE7CisgICAgaW50IEdMX0NMSVBfUExBTkUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MzAwMDsKKyAgICBpbnQgR0xfQ0xJUF9QTEFORTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgzMDAxOworICAgIGludCBHTF9DTElQX1BMQU5FMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDMwMDI7CisgICAgaW50IEdMX0NMSVBfUExBTkUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MzAwMzsKKyAgICBpbnQgR0xfQ0xJUF9QTEFORTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgzMDA0OworICAgIGludCBHTF9DTElQX1BMQU5FNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDMwMDU7CisgICAgaW50IEdMX0NPTE9SX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAgICAgICA9IDB4ODg5ODsKKyAgICBpbnQgR0xfQ09MT1JfQVJSQVlfUE9JTlRFUiAgICAgICAgICAgICAgICAgICAgID0gMHg4MDkwOworICAgIGludCBHTF9DT0xPUl9BUlJBWV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwODE7CisgICAgaW50IEdMX0NPTE9SX0FSUkFZX1NUUklERSAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA4MzsKKyAgICBpbnQgR0xfQ09MT1JfQVJSQVlfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDgyOworICAgIGludCBHTF9DT0xPUl9DTEVBUl9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgPSAweDBDMjI7CisgICAgaW50IEdMX0NPTE9SX1dSSVRFTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEMyMzsKKyAgICBpbnQgR0xfQ09NQklORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTcwOworICAgIGludCBHTF9DT01CSU5FX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1NzI7CisgICAgaW50IEdMX0NPTUJJTkVfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU3MTsKKyAgICBpbnQgR0xfQ09OU1RBTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTc2OworICAgIGludCBHTF9DT09SRF9SRVBMQUNFX09FUyAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4NjI7CisgICAgaW50IEdMX0NVTExfRkFDRV9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI0NTsKKyAgICBpbnQgR0xfQ1VSUkVOVF9DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjAwOworICAgIGludCBHTF9DVVJSRU5UX05PUk1BTCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCMDI7CisgICAgaW50IEdMX0NVUlJFTlRfVEVYVFVSRV9DT09SRFMgICAgICAgICAgICAgICAgICA9IDB4MEIwMzsKKyAgICBpbnQgR0xfREVQVEhfQ0xFQVJfVkFMVUUgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjczOworICAgIGludCBHTF9ERVBUSF9GVU5DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNzQ7CisgICAgaW50IEdMX0RFUFRIX1JBTkdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI3MDsKKyAgICBpbnQgR0xfREVQVEhfV1JJVEVNQVNLICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjcyOworICAgIGludCBHTF9ET1QzX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg2QUU7CisgICAgaW50IEdMX0RPVDNfUkdCQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODZBRjsKKyAgICBpbnQgR0xfRFlOQU1JQ19EUkFXICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4OEU4OworICAgIGludCBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiAgICAgICAgICAgICAgICAgICAgPSAweDg4OTM7CisgICAgaW50IEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAgICAgICAgICA9IDB4ODg5NTsKKyAgICBpbnQgR0xfRlJPTlRfRkFDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjQ2OworICAgIGludCBHTF9HRU5FUkFURV9NSVBNQVAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgxOTE7CisgICAgaW50IEdMX0dFTkVSQVRFX01JUE1BUF9ISU5UICAgICAgICAgICAgICAgICAgICA9IDB4ODE5MjsKKyAgICBpbnQgR0xfSU5URVJQT0xBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTc1OworICAgIGludCBHTF9MSU5FX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCMjE7CisgICAgaW50IEdMX0xPR0lDX09QX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJGMDsKKyAgICBpbnQgR0xfTUFUUklYX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkEwOworICAgIGludCBHTF9NQVhfQ0xJUF9QTEFORVMgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBEMzI7CisgICAgaW50IEdMX01PREVMVklFV19NQVRSSVggICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJBNjsKKyAgICBpbnQgR0xfTU9ERUxWSUVXX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVMgID0gMHg4OThEOworICAgIGludCBHTF9NT0RFTFZJRVdfU1RBQ0tfREVQVEggICAgICAgICAgICAgICAgICAgPSAweDBCQTM7CisgICAgaW50IEdMX05PUk1BTF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgICAgICAgICA9IDB4ODg5NzsKKyAgICBpbnQgR0xfTk9STUFMX0FSUkFZX1BPSU5URVIgICAgICAgICAgICAgICAgICAgID0gMHg4MDhGOworICAgIGludCBHTF9OT1JNQUxfQVJSQVlfU1RSSURFICAgICAgICAgICAgICAgICAgICAgPSAweDgwN0Y7CisgICAgaW50IEdMX05PUk1BTF9BUlJBWV9UWVBFICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA3RTsKKyAgICBpbnQgR0xfT1BFUkFORDBfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTk4OworICAgIGludCBHTF9PUEVSQU5EMF9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1OTA7CisgICAgaW50IEdMX09QRVJBTkQxX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU5OTsKKyAgICBpbnQgR0xfT1BFUkFORDFfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTkxOworICAgIGludCBHTF9PUEVSQU5EMl9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1OUE7CisgICAgaW50IEdMX09QRVJBTkQyX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU5MjsKKyAgICBpbnQgR0xfUE9JTlRfRElTVEFOQ0VfQVRURU5VQVRJT04gICAgICAgICAgICAgID0gMHg4MTI5OworICAgIGludCBHTF9QT0lOVF9GQURFX1RIUkVTSE9MRF9TSVpFICAgICAgICAgICAgICAgPSAweDgxMjg7CisgICAgaW50IEdMX1BPSU5UX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEIxMTsKKyAgICBpbnQgR0xfUE9JTlRfU0laRV9BUlJBWV9CVUZGRVJfQklORElOR19PRVMgICAgID0gMHg4QjlGOworICAgIGludCBHTF9QT0lOVF9TSVpFX0FSUkFZX09FUyAgICAgICAgICAgICAgICAgICAgPSAweDhCOUM7CisgICAgaW50IEdMX1BPSU5UX1NJWkVfQVJSQVlfUE9JTlRFUl9PRVMgICAgICAgICAgICA9IDB4ODk4QzsKKyAgICBpbnQgR0xfUE9JTlRfU0laRV9BUlJBWV9TVFJJREVfT0VTICAgICAgICAgICAgID0gMHg4OThCOworICAgIGludCBHTF9QT0lOVF9TSVpFX0FSUkFZX1RZUEVfT0VTICAgICAgICAgICAgICAgPSAweDg5OEE7CisgICAgaW50IEdMX1BPSU5UX1NJWkVfTUFYICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODEyNzsKKyAgICBpbnQgR0xfUE9JTlRfU0laRV9NSU4gICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MTI2OworICAgIGludCBHTF9QT0lOVF9TUFJJVEVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4NjE7CisgICAgaW50IEdMX1BPTFlHT05fT0ZGU0VUX0ZBQ1RPUiAgICAgICAgICAgICAgICAgICA9IDB4ODAzODsKKyAgICBpbnQgR0xfUE9MWUdPTl9PRkZTRVRfVU5JVFMgICAgICAgICAgICAgICAgICAgID0gMHgyQTAwOworICAgIGludCBHTF9QUkVWSU9VUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1Nzg7CisgICAgaW50IEdMX1BSSU1BUllfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU3NzsKKyAgICBpbnQgR0xfUFJPSkVDVElPTl9NQVRSSVggICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkE3OworICAgIGludCBHTF9QUk9KRUNUSU9OX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVMgPSAweDg5OEU7CisgICAgaW50IEdMX1BST0pFQ1RJT05fU1RBQ0tfREVQVEggICAgICAgICAgICAgICAgICA9IDB4MEJBNDsKKyAgICBpbnQgR0xfUkdCX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTczOworICAgIGludCBHTF9TQU1QTEVfQlVGRkVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwQTg7CisgICAgaW50IEdMX1NBTVBMRV9DT1ZFUkFHRV9JTlZFUlQgICAgICAgICAgICAgICAgICA9IDB4ODBBQjsKKyAgICBpbnQgR0xfU0FNUExFX0NPVkVSQUdFX1ZBTFVFICAgICAgICAgICAgICAgICAgID0gMHg4MEFBOworICAgIGludCBHTF9TQU1QTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwQTk7CisgICAgaW50IEdMX1NDSVNTT1JfQk9YICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEMxMDsKKyAgICBpbnQgR0xfU0hBREVfTU9ERUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjU0OworICAgIGludCBHTF9TUkMwX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1ODg7CisgICAgaW50IEdMX1NSQzBfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU4MDsKKyAgICBpbnQgR0xfU1JDMV9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTg5OworICAgIGludCBHTF9TUkMxX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1ODE7CisgICAgaW50IEdMX1NSQzJfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU4QTsKKyAgICBpbnQgR0xfU1JDMl9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTgyOworICAgIGludCBHTF9TVEFUSUNfRFJBVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4RTQ7CisgICAgaW50IEdMX1NURU5DSUxfQ0xFQVJfVkFMVUUgICAgICAgICAgICAgICAgICAgICA9IDB4MEI5MTsKKyAgICBpbnQgR0xfU1RFTkNJTF9GQUlMICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjk0OworICAgIGludCBHTF9TVEVOQ0lMX0ZVTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCOTI7CisgICAgaW50IEdMX1NURU5DSUxfUEFTU19ERVBUSF9GQUlMICAgICAgICAgICAgICAgICA9IDB4MEI5NTsKKyAgICBpbnQgR0xfU1RFTkNJTF9QQVNTX0RFUFRIX1BBU1MgICAgICAgICAgICAgICAgID0gMHgwQjk2OworICAgIGludCBHTF9TVEVOQ0lMX1JFRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCOTc7CisgICAgaW50IEdMX1NURU5DSUxfVkFMVUVfTUFTSyAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI5MzsKKyAgICBpbnQgR0xfU1RFTkNJTF9XUklURU1BU0sgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjk4OworICAgIGludCBHTF9TVUJUUkFDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RTc7CisgICAgaW50IEdMX1RFWFRVUkVfQklORElOR18yRCAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA2OTsKKyAgICBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgID0gMHg4ODlBOworICAgIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1BPSU5URVIgICAgICAgICAgICAgPSAweDgwOTI7CisgICAgaW50IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU0laRSAgICAgICAgICAgICAgICA9IDB4ODA4ODsKKyAgICBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TVFJJREUgICAgICAgICAgICAgID0gMHg4MDhBOworICAgIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1RZUEUgICAgICAgICAgICAgICAgPSAweDgwODk7CisgICAgaW50IEdMX1RFWFRVUkVfTUFUUklYICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJBODsKKyAgICBpbnQgR0xfVEVYVFVSRV9NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTICAgID0gMHg4OThGOworICAgIGludCBHTF9URVhUVVJFX1NUQUNLX0RFUFRIICAgICAgICAgICAgICAgICAgICAgPSAweDBCQTU7CisgICAgaW50IEdMX1ZFUlRFWF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgICAgICAgICA9IDB4ODg5NjsKKyAgICBpbnQgR0xfVkVSVEVYX0FSUkFZX1BPSU5URVIgICAgICAgICAgICAgICAgICAgID0gMHg4MDhFOworICAgIGludCBHTF9WRVJURVhfQVJSQVlfU0laRSAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwN0E7CisgICAgaW50IEdMX1ZFUlRFWF9BUlJBWV9TVFJJREUgICAgICAgICAgICAgICAgICAgICA9IDB4ODA3QzsKKyAgICBpbnQgR0xfVkVSVEVYX0FSUkFZX1RZUEUgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDdCOworICAgIGludCBHTF9WSUVXUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCQTI7CisgICAgaW50IEdMX1dSSVRFX09OTFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODhCOTsKKworICAgIHZvaWQgZ2xHZXRQb2ludGVydihpbnQgcG5hbWUsIGphdmEubmlvLkJ1ZmZlcltdIHBhcmFtcyk7CmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0wxMUltcGxIZWFkZXIuamF2YS1pbXBsIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMMTFJbXBsSGVhZGVyLmphdmEtaW1wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDFiZTY1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMMTFJbXBsSGVhZGVyLmphdmEtaW1wbApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKy8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKy8vIFRoaXMgc291cmNlIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKKworcGFja2FnZSBjb20uZ29vZ2xlLmFuZHJvaWQuZ2xlc19qbmk7CisKK2ltcG9ydCBqYXZhLm5pby5CdWZmZXI7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKKworcHVibGljIGNsYXNzIEdMMTFJbXBsIGltcGxlbWVudHMgR0wxMSB7CisKKyAgICAvLyBQcml2YXRlIGFjY2Vzc29ycyBmb3IgbmF0aXZlIGNvZGUKKworICAgIG5hdGl2ZSBwcml2YXRlIHN0YXRpYyB2b2lkIF9uYXRpdmVDbGFzc0luaXQoKTsKKyAgICBzdGF0aWMgeworCV9uYXRpdmVDbGFzc0luaXQoKTsKKyAgICB9CisKKyAgICBCdWZmZXIgX2NvbG9yUG9pbnRlciA9IG51bGw7CisgICAgQnVmZmVyIF9ub3JtYWxQb2ludGVyID0gbnVsbDsKKyAgICBCdWZmZXIgX3RleENvb3JkUG9pbnRlciA9IG51bGw7CisgICAgQnVmZmVyIF92ZXJ0ZXhQb2ludGVyID0gbnVsbDsKKworICAgIHB1YmxpYyBHTDExSW1wbCgpIHsKKyAgICB9CisKKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMQ0hlYWRlci5jcHAgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0xDSGVhZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDk1Njg2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMQ0hlYWRlci5jcHAKQEAgLTAsMCArMSwxMjkgQEAKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvLyBUaGlzIHNvdXJjZSBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCisKKyNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KKyNpbmNsdWRlIDx1dGlscy9taXNjLmg+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisKKyNpbmNsdWRlIDxwcml2YXRlL29wZW5nbGVzL2dsX2NvbnRleHQuaD4KKworI2RlZmluZSBfTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTIFwKKyAgICAgICAgKDo6YW5kcm9pZDo6T0dMRVNfTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTKQorCitzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKKworc3RhdGljIGpjbGFzcyBuaW9BY2Nlc3NDbGFzczsKK3N0YXRpYyBqY2xhc3MgYnVmZmVyQ2xhc3M7CitzdGF0aWMgamNsYXNzIE9PTUVDbGFzczsKK3N0YXRpYyBqY2xhc3MgVU9FQ2xhc3M7CitzdGF0aWMgamNsYXNzIElBRUNsYXNzOworc3RhdGljIGpjbGFzcyBBSU9PQkVDbGFzczsKK3N0YXRpYyBqbWV0aG9kSUQgZ2V0QmFzZVBvaW50ZXJJRDsKK3N0YXRpYyBqbWV0aG9kSUQgZ2V0QmFzZUFycmF5SUQ7CitzdGF0aWMgam1ldGhvZElEIGdldEJhc2VBcnJheU9mZnNldElEOworc3RhdGljIGpmaWVsZElEIHBvc2l0aW9uSUQ7CitzdGF0aWMgamZpZWxkSUQgbGltaXRJRDsKK3N0YXRpYyBqZmllbGRJRCBlbGVtZW50U2l6ZVNoaWZ0SUQ7CisKKy8qIENhY2hlIG1ldGhvZCBJRHMgZWFjaCB0aW1lIHRoZSBjbGFzcyBpcyBsb2FkZWQuICovCisKK3ZvaWQKK25hdGl2ZUNsYXNzSW5pdEJ1ZmZlcihKTklFbnYgKl9lbnYpCit7CisgICAgamNsYXNzIG5pb0FjY2Vzc0NsYXNzTG9jYWwgPSBfZW52LT5GaW5kQ2xhc3MoImphdmEvbmlvL05JT0FjY2VzcyIpOworICAgIG5pb0FjY2Vzc0NsYXNzID0gKGpjbGFzcykgX2Vudi0+TmV3R2xvYmFsUmVmKG5pb0FjY2Vzc0NsYXNzTG9jYWwpOworCisgICAgamNsYXNzIGJ1ZmZlckNsYXNzTG9jYWwgPSBfZW52LT5GaW5kQ2xhc3MoImphdmEvbmlvL0J1ZmZlciIpOworICAgIGJ1ZmZlckNsYXNzID0gKGpjbGFzcykgX2Vudi0+TmV3R2xvYmFsUmVmKGJ1ZmZlckNsYXNzTG9jYWwpOworCisgICAgZ2V0QmFzZVBvaW50ZXJJRCA9IF9lbnYtPkdldFN0YXRpY01ldGhvZElEKG5pb0FjY2Vzc0NsYXNzLAorICAgICAgICAgICAgImdldEJhc2VQb2ludGVyIiwgIihMamF2YS9uaW8vQnVmZmVyOylKIik7CisgICAgZ2V0QmFzZUFycmF5SUQgPSBfZW52LT5HZXRTdGF0aWNNZXRob2RJRChuaW9BY2Nlc3NDbGFzcywKKyAgICAgICAgICAgICJnZXRCYXNlQXJyYXkiLCAiKExqYXZhL25pby9CdWZmZXI7KUxqYXZhL2xhbmcvT2JqZWN0OyIpOworICAgIGdldEJhc2VBcnJheU9mZnNldElEID0gX2Vudi0+R2V0U3RhdGljTWV0aG9kSUQobmlvQWNjZXNzQ2xhc3MsCisgICAgICAgICAgICAiZ2V0QmFzZUFycmF5T2Zmc2V0IiwgIihMamF2YS9uaW8vQnVmZmVyOylJIik7CisKKyAgICBwb3NpdGlvbklEID0gX2Vudi0+R2V0RmllbGRJRChidWZmZXJDbGFzcywgInBvc2l0aW9uIiwgIkkiKTsKKyAgICBsaW1pdElEID0gX2Vudi0+R2V0RmllbGRJRChidWZmZXJDbGFzcywgImxpbWl0IiwgIkkiKTsKKyAgICBlbGVtZW50U2l6ZVNoaWZ0SUQgPQorICAgICAgICBfZW52LT5HZXRGaWVsZElEKGJ1ZmZlckNsYXNzLCAiX2VsZW1lbnRTaXplU2hpZnQiLCAiSSIpOworfQorCisKK3N0YXRpYyB2b2lkCituYXRpdmVDbGFzc0luaXQoSk5JRW52ICpfZW52LCBqY2xhc3MgZ2xJbXBsQ2xhc3MpCit7CisgICAgbmF0aXZlQ2xhc3NJbml0QnVmZmVyKF9lbnYpOworCisgICAgamNsYXNzIElBRUNsYXNzTG9jYWwgPQorICAgICAgICBfZW52LT5GaW5kQ2xhc3MoImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKTsKKyAgICBqY2xhc3MgT09NRUNsYXNzTG9jYWwgPQorICAgICAgICAgX2Vudi0+RmluZENsYXNzKCJqYXZhL2xhbmcvT3V0T2ZNZW1vcnlFcnJvciIpOworICAgIGpjbGFzcyBVT0VDbGFzc0xvY2FsID0KKyAgICAgICAgIF9lbnYtPkZpbmRDbGFzcygiamF2YS9sYW5nL1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIik7CisgICAgamNsYXNzIEFJT09CRUNsYXNzTG9jYWwgPQorICAgICAgICAgX2Vudi0+RmluZENsYXNzKCJqYXZhL2xhbmcvQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7CisKKyAgICBJQUVDbGFzcyA9IChqY2xhc3MpIF9lbnYtPk5ld0dsb2JhbFJlZihJQUVDbGFzc0xvY2FsKTsKKyAgICBPT01FQ2xhc3MgPSAoamNsYXNzKSBfZW52LT5OZXdHbG9iYWxSZWYoT09NRUNsYXNzTG9jYWwpOworICAgIFVPRUNsYXNzID0gKGpjbGFzcykgX2Vudi0+TmV3R2xvYmFsUmVmKFVPRUNsYXNzTG9jYWwpOworICAgIEFJT09CRUNsYXNzID0gKGpjbGFzcykgX2Vudi0+TmV3R2xvYmFsUmVmKEFJT09CRUNsYXNzTG9jYWwpOworfQorCitzdGF0aWMgdm9pZCAqCitnZXRQb2ludGVyKEpOSUVudiAqX2Vudiwgam9iamVjdCBidWZmZXIsIGphcnJheSAqYXJyYXksIGppbnQgKnJlbWFpbmluZykKK3sKKyAgICBqaW50IHBvc2l0aW9uOworICAgIGppbnQgbGltaXQ7CisgICAgamludCBlbGVtZW50U2l6ZVNoaWZ0OworICAgIGpsb25nIHBvaW50ZXI7CisgICAgamludCBvZmZzZXQ7CisgICAgdm9pZCAqZGF0YTsKKworICAgIHBvc2l0aW9uID0gX2Vudi0+R2V0SW50RmllbGQoYnVmZmVyLCBwb3NpdGlvbklEKTsKKyAgICBsaW1pdCA9IF9lbnYtPkdldEludEZpZWxkKGJ1ZmZlciwgbGltaXRJRCk7CisgICAgZWxlbWVudFNpemVTaGlmdCA9IF9lbnYtPkdldEludEZpZWxkKGJ1ZmZlciwgZWxlbWVudFNpemVTaGlmdElEKTsKKyAgICAqcmVtYWluaW5nID0gKGxpbWl0IC0gcG9zaXRpb24pIDw8IGVsZW1lbnRTaXplU2hpZnQ7CisgICAgcG9pbnRlciA9IF9lbnYtPkNhbGxTdGF0aWNMb25nTWV0aG9kKG5pb0FjY2Vzc0NsYXNzLAorICAgICAgICAgICAgZ2V0QmFzZVBvaW50ZXJJRCwgYnVmZmVyKTsKKyAgICBpZiAocG9pbnRlciAhPSAwTCkgeworICAgICAgICAqYXJyYXkgPSBOVUxMOworICAgICAgICByZXR1cm4gKHZvaWQgKikgKGppbnQpIHBvaW50ZXI7CisgICAgfQorICAgIAorICAgICphcnJheSA9IChqYXJyYXkpIF9lbnYtPkNhbGxTdGF0aWNPYmplY3RNZXRob2QobmlvQWNjZXNzQ2xhc3MsCisgICAgICAgICAgICBnZXRCYXNlQXJyYXlJRCwgYnVmZmVyKTsKKyAgICBvZmZzZXQgPSBfZW52LT5DYWxsU3RhdGljSW50TWV0aG9kKG5pb0FjY2Vzc0NsYXNzLAorICAgICAgICAgICAgZ2V0QmFzZUFycmF5T2Zmc2V0SUQsIGJ1ZmZlcik7CisgICAgZGF0YSA9IF9lbnYtPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoKmFycmF5LCAoamJvb2xlYW4gKikgMCk7CisgICAgCisgICAgcmV0dXJuICh2b2lkICopICgoY2hhciAqKSBkYXRhICsgb2Zmc2V0KTsKK30KKworCitzdGF0aWMgdm9pZAorcmVsZWFzZVBvaW50ZXIoSk5JRW52ICpfZW52LCBqYXJyYXkgYXJyYXksIHZvaWQgKmRhdGEsIGpib29sZWFuIGNvbW1pdCkKK3sKKyAgICBfZW52LT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChhcnJheSwgZGF0YSwKKwkJCQkJICAgY29tbWl0ID8gMCA6IEpOSV9BQk9SVCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTEhlYWRlci5qYXZhLWlmIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMSGVhZGVyLmphdmEtaWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I3OGYzZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTEhlYWRlci5qYXZhLWlmCkBAIC0wLDAgKzEsMjIgQEAKKy8qIC8vZGV2aWNlL2phdmEvYW5kcm9pZC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTC5qYXZhCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlczsKKworcHVibGljIGludGVyZmFjZSBHTCB7Cit9CisKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTEltcGxIZWFkZXIuamF2YS1pbXBsIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMSW1wbEhlYWRlci5qYXZhLWltcGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIzYTQxYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTEltcGxIZWFkZXIuamF2YS1pbXBsCkBAIC0wLDAgKzEsNDggQEAKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvLyBUaGlzIHNvdXJjZSBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCisKK3BhY2thZ2UgY29tLmdvb2dsZS5hbmRyb2lkLmdsZXNfam5pOworCitpbXBvcnQgamF2YS5uaW8uQnVmZmVyOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTA7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMEV4dDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDExOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTFFeHQ7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMUV4dGVuc2lvblBhY2s7CisKK3B1YmxpYyBjbGFzcyBHTEltcGwgaW1wbGVtZW50cyBHTDEwLCBHTDEwRXh0LCBHTDExLCBHTDExRXh0LCBHTDExRXh0ZW5zaW9uUGFjayB7CisKKyAgICAvLyBQcml2YXRlIGFjY2Vzc29ycyBmb3IgbmF0aXZlIGNvZGUKKworICAgIG5hdGl2ZSBwcml2YXRlIHN0YXRpYyB2b2lkIF9uYXRpdmVDbGFzc0luaXQoKTsKKyAgICBzdGF0aWMgeworCV9uYXRpdmVDbGFzc0luaXQoKTsKKyAgICB9CisKKyAgICBCdWZmZXIgX2NvbG9yUG9pbnRlciA9IG51bGw7CisgICAgQnVmZmVyIF9ub3JtYWxQb2ludGVyID0gbnVsbDsKKyAgICBCdWZmZXIgX3RleENvb3JkUG9pbnRlciA9IG51bGw7CisgICAgQnVmZmVyIF92ZXJ0ZXhQb2ludGVyID0gbnVsbDsKKworICAgIHB1YmxpYyBHTEltcGwoKSB7CisgICAgfQorCisgICAgIHB1YmxpYyB2b2lkIGdsR2V0UG9pbnRlcnYoaW50IHBuYW1lLCBqYXZhLm5pby5CdWZmZXJbXSBwYXJhbXMpIHsKKyAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiZ2xHZXRQb2ludGVydiIpOworICAgICB9CisKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbEdldFN0cmluZy5jcHAgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xHZXRTdHJpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZTEyOTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xHZXRTdHJpbmcuY3BwCkBAIC0wLDAgKzEsMTAgQEAKKyNpbmNsdWRlIDxzdHJpbmcuaD4NCisNCisvKiBjb25zdCBHTHVieXRlICogZ2xHZXRTdHJpbmcgKCBHTGVudW0gbmFtZSApICovDQoranN0cmluZw0KK2FuZHJvaWRfZ2xHZXRTdHJpbmcNCisgIChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgbmFtZSkgew0KKyAgICBjb25zdCBjaGFyICogY2hhcnMgPSAoY29uc3QgY2hhciAqKWdsR2V0U3RyaW5nKChHTGVudW0pbmFtZSk7DQorICAgIGpzdHJpbmcgb3V0cHV0ID0gX2Vudi0+TmV3U3RyaW5nVVRGKGNoYXJzKTsNCisgICAgcmV0dXJuIG91dHB1dDsNCit9DQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsR2V0U3RyaW5nLmphdmEtMTAtaWYgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xHZXRTdHJpbmcuamF2YS0xMC1pZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OThmYWJjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsR2V0U3RyaW5nLmphdmEtMTAtaWYKQEAgLTAsMCArMSw0IEBACisgICAgcHVibGljIFN0cmluZyBnbEdldFN0cmluZygNCisgICAgICAgIGludCBuYW1lDQorICAgICk7DQorDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsR2V0U3RyaW5nLmphdmEtaWYgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xHZXRTdHJpbmcuamF2YS1pZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OThmYWJjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsR2V0U3RyaW5nLmphdmEtaWYKQEAgLTAsMCArMSw0IEBACisgICAgcHVibGljIFN0cmluZyBnbEdldFN0cmluZygNCisgICAgICAgIGludCBuYW1lDQorICAgICk7DQorDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsR2V0U3RyaW5nLmphdmEtaW1wbCBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbEdldFN0cmluZy5qYXZhLWltcGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM3ODgxYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbEdldFN0cmluZy5qYXZhLWltcGwKQEAgLTAsMCArMSwxNiBAQAorICAgIC8vIEMgZnVuY3Rpb24gY29uc3QgR0x1Ynl0ZSAqIGdsR2V0U3RyaW5nICggR0xlbnVtIG5hbWUgKQ0KKw0KKyAgICBwdWJsaWMgbmF0aXZlIFN0cmluZyBfZ2xHZXRTdHJpbmcoDQorICAgICAgICBpbnQgbmFtZQ0KKyAgICApOw0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIGdsR2V0U3RyaW5nKA0KKyAgICAgICAgaW50IG5hbWUNCisgICAgKSB7DQorICAgICAgICBTdHJpbmcgcmV0dXJuVmFsdWU7DQorICAgICAgICByZXR1cm5WYWx1ZSA9IF9nbEdldFN0cmluZygNCisgICAgICAgICAgICBuYW1lDQorICAgICAgICApOw0KKyAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOw0KKyAgICB9DQorDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsR2V0U3RyaW5nLm5hdGl2ZVJlZyBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbEdldFN0cmluZy5uYXRpdmVSZWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY0MTg3YwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbEdldFN0cmluZy5uYXRpdmVSZWcKQEAgLTAsMCArMSBAQAoreyJfZ2xHZXRTdHJpbmciLCAiKEkpTGphdmEvbGFuZy9TdHJpbmc7IiwgKHZvaWQgKikgYW5kcm9pZF9nbEdldFN0cmluZyB9LA0K