LyoKICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAogKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCiAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCiAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgojaWZuZGVmIEFDVElWRU1RX1VUSUxfREFURV9IXwojZGVmaW5lIEFDVElWRU1RX1VUSUxfREFURV9IXwoKbmFtZXNwYWNlIGFjdGl2ZW1xewpuYW1lc3BhY2UgdXRpbHsKICAgIAogICAgLyoqCiAgICAgKiBXcmFwcGVyIGNsYXNzIGFyb3VuZCBhIHRpbWUgdmFsdWUgaW4gbWlsbGlzZWNvbmRzLiAgVGhpcwogICAgICogY2xhc3MgaXMgY29tcGFyYWJsZSB0byBKYXZhJ3MgamF2YS51dGlsLkRhdGUgY2xhc3MuCiAgICAgKi8KICAgIGNsYXNzIERhdGUKICAgIHsKICAgIHByaXZhdGU6CiAgICAKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgdW5kZXJseWluZyB0aW1lIHZhbHVlIGluIG1pbGxpc2Vjb25kc6cKICAgICAgICAgKi8KICAgICAgICBsb25nIGxvbmcgdGltZTsKICAgICAgICAKICAgIHB1YmxpYzoKICAgIAogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IgLSBzZXRzIHRpbWUgdG8gbm93LgogICAgICAgICAqLwogICAgCURhdGUoKXsKICAgICAgICAgICAgdGltZSA9IGdldEN1cnJlbnRUaW1lTWlsbGlzZWNvbmRzKCk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8qKgogICAgICAgICAqIENvbnN0cnVjdHMgdGhlIGRhdGUgd2l0aCBhIGdpdmVuIHRpbWUgdmFsdWUuCiAgICAgICAgICogQHBhcmFtIG1pbGxpc2Vjb25kcyBUaGUgdGltZSBpbiBtaWxsaXNlY29uZHM7CiAgICAgICAgICovCiAgICAgICAgRGF0ZSggbG9uZyBsb25nIG1pbGxpc2Vjb25kcyApewogICAgICAgICAgICB0aGlzLT50aW1lID0gbWlsbGlzZWNvbmRzOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBDb3B5IGNvbnN0cnVjdG9yLgogICAgICAgICAqLwogICAgICAgIERhdGUoIGNvbnN0IERhdGUmIHNvdXJjZSApewogICAgICAgICAgICAoKnRoaXMpID0gc291cmNlOwogICAgICAgIH0KICAgICAgICAKICAgIAl2aXJ0dWFsIH5EYXRlKCl7fQogICAgICAgIAogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIHVuZGVybHlpbmcgdGltZS4KICAgICAgICAgKiBAcmV0dXJuIFRoZSB1bmRlcmx5aW5nIHRpbWUgdmFsdWUgaW4gbWlsbGlzZWNvbmRzLgogICAgICAgICAqLwogICAgICAgIGxvbmcgbG9uZyBnZXRUaW1lKCkgY29uc3R7CiAgICAgICAgICAgIHJldHVybiB0aW1lOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB1bmRlcmx5aW5nIHRpbWUuCiAgICAgICAgICogQHBhcmFtIG1pbGxpc2Vjb25kcyBUaGUgdW5kZXJseWluZyB0aW1lIHZhbHVlIGluCiAgICAgICAgICogbWlsbGlzZWNvbmRzLgogICAgICAgICAqLwogICAgICAgIHZvaWQgc2V0VGltZSggbG9uZyBsb25nIG1pbGxpc2Vjb25kcyApewogICAgICAgICAgICB0aGlzLT50aW1lID0gbWlsbGlzZWNvbmRzOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBEZXRlcm1pbmVzIHdldGhlciBvciBub3QgdGhpcyBkYXRlIGZhbGxzIGFmdGVyIHRoZQogICAgICAgICAqIHNwZWNpZmllZCB0aW1lLgogICAgICAgICAqIEBwYXJhbSB3aGVuIFRoZSBkYXRlIHRvIGNvbXBhcmUKICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBkYXRlIGZhbGxzIGFmdGVyIHdoZW4uCiAgICAgICAgICovCiAgICAgICAgYm9vbCBhZnRlciggRGF0ZSYgd2hlbiApIGNvbnN0ewogICAgICAgICAgICByZXR1cm4gdGltZSA+IHdoZW4udGltZTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3ZXRoZXIgb3Igbm90IHRoaXMgZGF0ZSBmYWxscyBiZWZvcmUgdGhlCiAgICAgICAgICogc3BlY2lmaWVkIHRpbWUuCiAgICAgICAgICogQHBhcmFtIHdoZW4gVGhlIGRhdGUgdG8gY29tcGFyZQogICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGRhdGUgZmFsbHMgYmVmb3JlIHdoZW4uCiAgICAgICAgICovCiAgICAgICAgYm9vbCBiZWZvcmUoIERhdGUmIHdoZW4gKSBjb25zdHsKICAgICAgICAgICAgcmV0dXJuIHRpbWUgPCB3aGVuLnRpbWU7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZXMgd2V0aGVyIG9yIG5vdCB0aGlzIGRhdGUgaXMgZXF1YWwgdG8gdGhlCiAgICAgICAgICogc3BlY2lmaWVkIHRpbWUuCiAgICAgICAgICogQHBhcmFtIHdoZW4gVGhlIGRhdGUgdG8gY29tcGFyZQogICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGRhdGUgaXMgZXF1YWwgdG8gd2hlbi4KICAgICAgICAgKi8KICAgICAgICBib29sIGVxdWFscyggRGF0ZSYgd2hlbiApIGNvbnN0ewogICAgICAgICAgICByZXR1cm4gdGltZSA9PSB3aGVuLnRpbWU7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8qKgogICAgICAgICAqIEFzc2lnbm1lbnQgb3BlcmF0b3IuCiAgICAgICAgICovCiAgICAgICAgRGF0ZSYgb3BlcmF0b3IgPSggY29uc3QgRGF0ZSYgc291cmNlICl7CiAgICAgICAgICAgIHRoaXMtPnRpbWUgPSBzb3VyY2UudGltZTsKICAgICAgICAgICAgcmV0dXJuICp0aGlzOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHRpbWUgaW4gbWlsbGlzZWNvbmRzLiAgQ29tcGFyYWJsZQogICAgICAgICAqIHRvIEphdmEncyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMgbWV0aG9kLgogICAgICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgdGltZSBpbiBtaWxsaXNlY29uZHMuCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGxvbmcgbG9uZyBnZXRDdXJyZW50VGltZU1pbGxpc2Vjb25kcygpOyAgICAgICAgCiAgICB9OwogICAgCn19CgojZW5kaWYgLypBQ1RJVkVNUV9VVElMX0RBVEVfSF8qLwo=