LyoKKiBDb3B5cmlnaHQgqSB7MTk5Ny0xOTk5fSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogRmlsZSBHUkVHT0NBTC5ICioKKiBNb2RpZmljYXRpb24gSGlzdG9yeToKKgoqICAgRGF0ZSAgICAgICAgTmFtZSAgICAgICAgRGVzY3JpcHRpb24KKiAgIDA0LzIyLzk3ICAgIGFsaXUgICAgICAgIE92ZXJoYXVsZWQgaGVhZGVyLgoqICAgIDA3LzI4Lzk4ICAgIHN0ZXBoZW4gICAgICAgIFN5bmMgd2l0aCBKREsgMS4yCiogICAgMDkvMDQvOTggICAgc3RlcGhlbiAgICAgICAgUmUtc3luYyB3aXRoIEpESyA4LzMxIHB1dGJhY2sKKiAgICAwOS8xNC85OCAgICBzdGVwaGVuICAgICAgICBDaGFuZ2VkIHR5cGUgb2Yga09uZURheSwga09uZVdlZWsgdG8gZG91YmxlLgoqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpeGVkIGJ1ZyBpbiByb2xsKCkgCiogICAxMC8xNS85OSAgICBhbGl1ICAgICAgICBGaXhlZCBqMzEsIGluY29ycmVjdCBXRUVLX09GX1lFQVIgY29tcHV0YXRpb24uCiogICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBkb2N1bWVudGF0aW9uIG9mIFdFRUtfT0ZfWUVBUiBjb21wdXRhdGlvbi4KKiAgIDEwLzE1Lzk5ICAgIGFsaXUgICAgICAgIEZpeGVkIGozMiwgY2Fubm90IHNldCBkYXRlIHRvIEZlYiAyOSAyMDAwIEFELgoqICAgICAgICAgICAgICAgICAgICAgICAgICAge0pESyBidWcgNDIxMDIwOSA0MjA5MjcyfQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqLwogICAgICAgICAKI2lmbmRlZiBHUkVHT0NBTF9ICiNkZWZpbmUgR1JFR09DQUxfSAoKI2luY2x1ZGUgInVuaWNvZGUvY2FsZW5kYXIuaCIKCi8qKgogKiBDb25jcmV0ZSBjbGFzcyB3aGljaCBwcm92aWRlcyB0aGUgc3RhbmRhcmQgY2FsZW5kYXIgdXNlZCBieSBtb3N0IG9mIHRoZSB3b3JsZC4KICogPFA+CiAqIFRoZSBzdGFuZGFyZCAoR3JlZ29yaWFuKSBjYWxlbmRhciBoYXMgMiBlcmFzLCBCQyBhbmQgQUQuCiAqIDxQPgogKiBUaGlzIGltcGxlbWVudGF0aW9uIGhhbmRsZXMgYSBzaW5nbGUgZGlzY29udGludWl0eSwgd2hpY2ggY29ycmVzcG9uZHMgYnkgZGVmYXVsdCB0bwogKiB0aGUgZGF0ZSB0aGUgR3JlZ29yaWFuIGNhbGVuZGFyIHdhcyBvcmlnaW5hbGx5IGluc3RpdHV0ZWQgKE9jdG9iZXIgMTUsIDE1ODIpLiBOb3QgYWxsCiAqIGNvdW50cmllcyBhZG9wdGVkIHRoZSBHcmVnb3JpYW4gY2FsZW5kYXIgdGhlbiwgc28gdGhpcyBjdXRvdmVyIGRhdGUgbWF5IGJlIGNoYW5nZWQgYnkKICogdGhlIGNhbGxlci4KICogPFA+CiAqIFByaW9yIHRvIHRoZSBpbnN0aXR1dGlvbiBvZiB0aGUgR3JlZ29yaWFuIENhbGVuZGFyLCBOZXcgWWVhcidzIERheSB3YXMgTWFyY2ggMjUuIFRvCiAqIGF2b2lkIGNvbmZ1c2lvbiwgdGhpcyBDYWxlbmRhciBhbHdheXMgdXNlcyBKYW51YXJ5IDEuIEEgbWFudWFsIGFkanVzdG1lbnQgbWF5IGJlIG1hZGUKICogaWYgZGVzaXJlZCBmb3IgZGF0ZXMgdGhhdCBhcmUgcHJpb3IgdG8gdGhlIEdyZWdvcmlhbiBjaGFuZ2VvdmVyIGFuZCB3aGljaCBmYWxsCiAqIGJldHdlZW4gSmFudWFyeSAxIGFuZCBNYXJjaCAyNC4KICoKICogPHA+VmFsdWVzIGNhbGN1bGF0ZWQgZm9yIHRoZSA8Y29kZT5XRUVLX09GX1lFQVI8L2NvZGU+IGZpZWxkIHJhbmdlIGZyb20gMSB0bwogKiA1My4gIFdlZWsgMSBmb3IgYSB5ZWFyIGlzIHRoZSBmaXJzdCB3ZWVrIHRoYXQgY29udGFpbnMgYXQgbGVhc3QKICogPGNvZGU+Z2V0TWluaW1hbERheXNJbkZpcnN0V2VlaygpPC9jb2RlPiBkYXlzIGZyb20gdGhhdCB5ZWFyLiAgSXQgdGh1cwogKiBkZXBlbmRzIG9uIHRoZSB2YWx1ZXMgb2YgPGNvZGU+Z2V0TWluaW1hbERheXNJbkZpcnN0V2VlaygpPC9jb2RlPiwKICogPGNvZGU+Z2V0Rmlyc3REYXlPZldlZWsoKTwvY29kZT4sIGFuZCB0aGUgZGF5IG9mIHRoZSB3ZWVrIG9mIEphbnVhcnkgMS4KICogV2Vla3MgYmV0d2VlbiB3ZWVrIDEgb2Ygb25lIHllYXIgYW5kIHdlZWsgMSBvZiB0aGUgZm9sbG93aW5nIHllYXIgYXJlCiAqIG51bWJlcmVkIHNlcXVlbnRpYWxseSBmcm9tIDIgdG8gNTIgb3IgNTMgKGFzIG5lZWRlZCkuCiAqCiAqIDxwPkZvciBleGFtcGxlLCBKYW51YXJ5IDEsIDE5OTggd2FzIGEgVGh1cnNkYXkuICBJZgogKiA8Y29kZT5nZXRGaXJzdERheU9mV2VlaygpPC9jb2RlPiBpcyA8Y29kZT5NT05EQVk8L2NvZGU+IGFuZAogKiA8Y29kZT5nZXRNaW5pbWFsRGF5c0luRmlyc3RXZWVrKCk8L2NvZGU+IGlzIDQgKHRoZXNlIGFyZSB0aGUgdmFsdWVzCiAqIHJlZmxlY3RpbmcgSVNPIDg2MDEgYW5kIG1hbnkgbmF0aW9uYWwgc3RhbmRhcmRzKSwgdGhlbiB3ZWVrIDEgb2YgMTk5OCBzdGFydHMKICogb24gRGVjZW1iZXIgMjksIDE5OTcsIGFuZCBlbmRzIG9uIEphbnVhcnkgNCwgMTk5OC4gIElmLCBob3dldmVyLAogKiA8Y29kZT5nZXRGaXJzdERheU9mV2VlaygpPC9jb2RlPiBpcyA8Y29kZT5TVU5EQVk8L2NvZGU+LCB0aGVuIHdlZWsgMSBvZiAxOTk4CiAqIHN0YXJ0cyBvbiBKYW51YXJ5IDQsIDE5OTgsIGFuZCBlbmRzIG9uIEphbnVhcnkgMTAsIDE5OTg7IHRoZSBmaXJzdCB0aHJlZSBkYXlzCiAqIG9mIDE5OTggdGhlbiBhcmUgcGFydCBvZiB3ZWVrIDUzIG9mIDE5OTcuCiAqCiAqIDxwPkV4YW1wbGUgZm9yIHVzaW5nIEdyZWdvcmlhbkNhbGVuZGFyOgogKiA8cHJlPgogKiAuICAgIC8vIGdldCB0aGUgc3VwcG9ydGVkIGlkcyBmb3IgR01ULTA4OjAwIChQYWNpZmljIFN0YW5kYXJkIFRpbWUpCiAqIC4gICAgaW50MzJfdCBpZHNDb3VudDsKICogLiAgICBjb25zdCBVbmljb2RlU3RyaW5nKiogaWRzID0gVGltZVpvbmU6OmNyZWF0ZUF2YWlsYWJsZUlEcygtOCAqIDYwICogNjAgKiAxMDAwLCBpZHNDb3VudCk7CiAqIC4gICAgLy8gaWYgbm8gaWRzIHdlcmUgcmV0dXJuZWQsIHNvbWV0aGluZyBpcyB3cm9uZy4gZ2V0IG91dC4KICogLiAgICBpZiAoaWRzQ291bnQgPT0gMCkgewogKiAuICAgICAgICByZXR1cm47CiAqIC4gICAgfQogKiAuCiAqIC4gICAgLy8gYmVnaW4gb3V0cHV0CiAqIC4gICAgY291dCA8PCAiQ3VycmVudCBUaW1lIiA8PCBlbmRsOwogKiAuCiAqIC4gICAgLy8gY3JlYXRlIGEgUGFjaWZpYyBTdGFuZGFyZCBUaW1lIHRpbWUgem9uZQogKiAuICAgIFNpbXBsZVRpbWVab25lKiBwZHQgPSBuZXcgU2ltcGxlVGltZVpvbmUoLTggKiA2MCAqIDYwICogMTAwMCwgKihpZHNbMF0pKTsKICogLiAgICAKICogLiAgICAvLyBzZXQgdXAgcnVsZXMgZm9yIGRheWxpZ2h0IHNhdmluZ3MgdGltZQogKiAuICAgIHBkdC0+c2V0U3RhcnRSdWxlKENhbGVuZGFyOjpBUFJJTCwgMSwgQ2FsZW5kYXI6OlNVTkRBWSwgMiAqIDYwICogNjAgKiAxMDAwKTsKICogLiAgICBwZHQtPnNldEVuZFJ1bGUoQ2FsZW5kYXI6Ok9DVE9CRVIsIC0xLCBDYWxlbmRhcjo6U1VOREFZLCAyICogNjAgKiA2MCAqIDEwMDApOwogKiAuICAgIAogKiAuICAgIC8vIGNyZWF0ZSBhIEdyZWdvcmlhbkNhbGVuZGFyIHdpdGggdGhlIFBhY2lmaWMgRGF5bGlnaHQgdGltZSB6b25lCiAqIC4gICAgLy8gYW5kIHRoZSBjdXJyZW50IGRhdGUgYW5kIHRpbWUKICogLiAgICBVRXJyb3JDb2RlIHN1Y2Nlc3MgPSBVX1pFUk9fRVJST1I7CiAqIC4gICAgQ2FsZW5kYXIqIGNhbGVuZGFyID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCBwZHQsIHN1Y2Nlc3MgKTsKICogLiAgICAKICogLiAgICAvLyBwcmludCBvdXQgYSBidW5jaCBvZiBpbnRlcmVzdGluZyB0aGluZ3MKICogLiAgICBjb3V0IDw8ICJFUkE6ICIgPDwgY2FsZW5kYXItPmdldCggQ2FsZW5kYXI6OkVSQSwgc3VjY2VzcyApIDw8IGVuZGw7CiAqIC4gICAgY291dCA8PCAiWUVBUjogIiA8PCBjYWxlbmRhci0+Z2V0KCBDYWxlbmRhcjo6WUVBUiwgc3VjY2VzcyApIDw8IGVuZGw7CiAqIC4gICAgY291dCA8PCAiTU9OVEg6ICIgPDwgY2FsZW5kYXItPmdldCggQ2FsZW5kYXI6Ok1PTlRILCBzdWNjZXNzICkgPDwgZW5kbDsKICogLiAgICBjb3V0IDw8ICJXRUVLX09GX1lFQVI6ICIgPDwgY2FsZW5kYXItPmdldCggQ2FsZW5kYXI6OldFRUtfT0ZfWUVBUiwgc3VjY2VzcyApIDw8IGVuZGw7CiAqIC4gICAgY291dCA8PCAiV0VFS19PRl9NT05USDogIiA8PCBjYWxlbmRhci0+Z2V0KCBDYWxlbmRhcjo6V0VFS19PRl9NT05USCwgc3VjY2VzcyApIDw8IGVuZGw7CiAqIC4gICAgY291dCA8PCAiREFURTogIiA8PCBjYWxlbmRhci0+Z2V0KCBDYWxlbmRhcjo6REFURSwgc3VjY2VzcyApIDw8IGVuZGw7CiAqIC4gICAgY291dCA8PCAiREFZX09GX01PTlRIOiAiIDw8IGNhbGVuZGFyLT5nZXQoIENhbGVuZGFyOjpEQVlfT0ZfTU9OVEgsIHN1Y2Nlc3MgKSA8PCBlbmRsOwogKiAuICAgIGNvdXQgPDwgIkRBWV9PRl9ZRUFSOiAiIDw8IGNhbGVuZGFyLT5nZXQoIENhbGVuZGFyOjpEQVlfT0ZfWUVBUiwgc3VjY2VzcyApIDw8IGVuZGw7CiAqIC4gICAgY291dCA8PCAiREFZX09GX1dFRUs6ICIgPDwgY2FsZW5kYXItPmdldCggQ2FsZW5kYXI6OkRBWV9PRl9XRUVLLCBzdWNjZXNzICkgPDwgZW5kbDsKICogLiAgICBjb3V0IDw8ICJEQVlfT0ZfV0VFS19JTl9NT05USDogIiA8PCBjYWxlbmRhci0+Z2V0KCBDYWxlbmRhcjo6REFZX09GX1dFRUtfSU5fTU9OVEgsIHN1Y2Nlc3MgKSA8PCBlbmRsOwogKiAuICAgIGNvdXQgPDwgIkFNX1BNOiAiIDw8IGNhbGVuZGFyLT5nZXQoIENhbGVuZGFyOjpBTV9QTSwgc3VjY2VzcyApIDw8IGVuZGw7CiAqIC4gICAgY291dCA8PCAiSE9VUjogIiA8PCBjYWxlbmRhci0+Z2V0KCBDYWxlbmRhcjo6SE9VUiwgc3VjY2VzcyApIDw8IGVuZGw7CiAqIC4gICAgY291dCA8PCAiSE9VUl9PRl9EQVk6ICIgPDwgY2FsZW5kYXItPmdldCggQ2FsZW5kYXI6OkhPVVJfT0ZfREFZLCBzdWNjZXNzICkgPDwgZW5kbDsKICogLiAgICBjb3V0IDw8ICJNSU5VVEU6ICIgPDwgY2FsZW5kYXItPmdldCggQ2FsZW5kYXI6Ok1JTlVURSwgc3VjY2VzcyApIDw8IGVuZGw7CiAqIC4gICAgY291dCA8PCAiU0VDT05EOiAiIDw8IGNhbGVuZGFyLT5nZXQoIENhbGVuZGFyOjpTRUNPTkQsIHN1Y2Nlc3MgKSA8PCBlbmRsOwogKiAuICAgIGNvdXQgPDwgIk1JTExJU0VDT05EOiAiIDw8IGNhbGVuZGFyLT5nZXQoIENhbGVuZGFyOjpNSUxMSVNFQ09ORCwgc3VjY2VzcyApIDw8IGVuZGw7CiAqIC4gICAgY291dCA8PCAiWk9ORV9PRkZTRVQ6ICIgPDwgKGNhbGVuZGFyLT5nZXQoIENhbGVuZGFyOjpaT05FX09GRlNFVCwgc3VjY2VzcyApLyg2MCo2MCoxMDAwKSkgPDwgZW5kbDsKICogLiAgICBjb3V0IDw8ICJEU1RfT0ZGU0VUOiAiIDw8IChjYWxlbmRhci0+Z2V0KCBDYWxlbmRhcjo6RFNUX09GRlNFVCwgc3VjY2VzcyApLyg2MCo2MCoxMDAwKSkgPDwgZW5kbDsKICogLgogKiAuICAgIGNvdXQgPDwgIkN1cnJlbnQgVGltZSwgd2l0aCBob3VyIHJlc2V0IHRvIDMiIDw8IGVuZGw7CiAqIC4gICAgY2FsZW5kYXItPmNsZWFyKENhbGVuZGFyOjpIT1VSX09GX0RBWSk7IC8vIHNvIGRvZXNuJ3Qgb3ZlcnJpZGUKICogLiAgICBjYWxlbmRhci0+c2V0KENhbGVuZGFyOjpIT1VSLCAzKTsKICogLiAgICBjb3V0IDw8ICJFUkE6ICIgPDwgY2FsZW5kYXItPmdldCggQ2FsZW5kYXI6OkVSQSwgc3VjY2VzcyApIDw8IGVuZGw7CiAqIC4gICAgY291dCA8PCAiWUVBUjogIiA8PCBjYWxlbmRhci0+Z2V0KCBDYWxlbmRhcjo6WUVBUiwgc3VjY2VzcyApIDw8IGVuZGw7CiAqIC4gICAgY291dCA8PCAiTU9OVEg6ICIgPDwgY2FsZW5kYXItPmdldCggQ2FsZW5kYXI6Ok1PTlRILCBzdWNjZXNzICkgPDwgZW5kbDsKICogLiAgICBjb3V0IDw8ICJXRUVLX09GX1lFQVI6ICIgPDwgY2FsZW5kYXItPmdldCggQ2FsZW5kYXI6OldFRUtfT0ZfWUVBUiwgc3VjY2VzcyApIDw8IGVuZGw7CiAqIC4gICAgY291dCA8PCAiV0VFS19PRl9NT05USDogIiA8PCBjYWxlbmRhci0+Z2V0KCBDYWxlbmRhcjo6V0VFS19PRl9NT05USCwgc3VjY2VzcyApIDw8IGVuZGw7CiAqIC4gICAgY291dCA8PCAiREFURTogIiA8PCBjYWxlbmRhci0+Z2V0KCBDYWxlbmRhcjo6REFURSwgc3VjY2VzcyApIDw8IGVuZGw7CiAqIC4gICAgY291dCA8PCAiREFZX09GX01PTlRIOiAiIDw8IGNhbGVuZGFyLT5nZXQoIENhbGVuZGFyOjpEQVlfT0ZfTU9OVEgsIHN1Y2Nlc3MgKSA8PCBlbmRsOwogKiAuICAgIGNvdXQgPDwgIkRBWV9PRl9ZRUFSOiAiIDw8IGNhbGVuZGFyLT5nZXQoIENhbGVuZGFyOjpEQVlfT0ZfWUVBUiwgc3VjY2VzcyApIDw8IGVuZGw7CiAqIC4gICAgY291dCA8PCAiREFZX09GX1dFRUs6ICIgPDwgY2FsZW5kYXItPmdldCggQ2FsZW5kYXI6OkRBWV9PRl9XRUVLLCBzdWNjZXNzICkgPDwgZW5kbDsKICogLiAgICBjb3V0IDw8ICJEQVlfT0ZfV0VFS19JTl9NT05USDogIiA8PCBjYWxlbmRhci0+Z2V0KCBDYWxlbmRhcjo6REFZX09GX1dFRUtfSU5fTU9OVEgsIHN1Y2Nlc3MgKSA8PCBlbmRsOwogKiAuICAgIGNvdXQgPDwgIkFNX1BNOiAiIDw8IGNhbGVuZGFyLT5nZXQoIENhbGVuZGFyOjpBTV9QTSwgc3VjY2VzcyApIDw8IGVuZGw7CiAqIC4gICAgY291dCA8PCAiSE9VUjogIiA8PCBjYWxlbmRhci0+Z2V0KCBDYWxlbmRhcjo6SE9VUiwgc3VjY2VzcyApIDw8IGVuZGw7CiAqIC4gICAgY291dCA8PCAiSE9VUl9PRl9EQVk6ICIgPDwgY2FsZW5kYXItPmdldCggQ2FsZW5kYXI6OkhPVVJfT0ZfREFZLCBzdWNjZXNzICkgPDwgZW5kbDsKICogLiAgICBjb3V0IDw8ICJNSU5VVEU6ICIgPDwgY2FsZW5kYXItPmdldCggQ2FsZW5kYXI6Ok1JTlVURSwgc3VjY2VzcyApIDw8IGVuZGw7CiAqIC4gICAgY291dCA8PCAiU0VDT05EOiAiIDw8IGNhbGVuZGFyLT5nZXQoIENhbGVuZGFyOjpTRUNPTkQsIHN1Y2Nlc3MgKSA8PCBlbmRsOwogKiAuICAgIGNvdXQgPDwgIk1JTExJU0VDT05EOiAiIDw8IGNhbGVuZGFyLT5nZXQoIENhbGVuZGFyOjpNSUxMSVNFQ09ORCwgc3VjY2VzcyApIDw8IGVuZGw7CiAqIC4gICAgY291dCA8PCAiWk9ORV9PRkZTRVQ6ICIgPDwgKGNhbGVuZGFyLT5nZXQoIENhbGVuZGFyOjpaT05FX09GRlNFVCwgc3VjY2VzcyApLyg2MCo2MCoxMDAwKSkgPDwgZW5kbDsgLy8gaW4gaG91cnMKICogLiAgICBjb3V0IDw8ICJEU1RfT0ZGU0VUOiAiIDw8IChjYWxlbmRhci0+Z2V0KCBDYWxlbmRhcjo6RFNUX09GRlNFVCwgc3VjY2VzcyApLyg2MCo2MCoxMDAwKSkgPDwgZW5kbDsgLy8gaW4gaG91cnMKICogLgogKiAuICAgIGRlbGV0ZVtdIGlkczsKICogLiAgICBkZWxldGUgY2FsZW5kYXI7IC8vIGFsc28gZGVsZXRlcyBwZHQKICogLgogKiA8L3ByZT4KICovCmNsYXNzIFVfSTE4Tl9BUEkgR3JlZ29yaWFuQ2FsZW5kYXI6IHB1YmxpYyBDYWxlbmRhciB7CnB1YmxpYzoKCiAgICAvKioKICAgICAqIFVzZWZ1bCBjb25zdGFudHMgZm9yIEdyZWdvcmlhbkNhbGVuZGFyIGFuZCBUaW1lWm9uZS4KICAgICAqLwogICAgZW51bSBFRXJhcyB7CiAgICAgICAgQkMsCiAgICAgICAgQUQKICAgIH07CgogICAgLyoqCiAgICAgKiBDb25zdHJ1Y3RzIGEgZGVmYXVsdCBHcmVnb3JpYW5DYWxlbmRhciB1c2luZyB0aGUgY3VycmVudCB0aW1lIGluIHRoZSBkZWZhdWx0IHRpbWUKICAgICAqIHpvbmUgd2l0aCB0aGUgZGVmYXVsdCBsb2NhbGUuCiAgICAgKgogICAgICogQHBhcmFtIHN1Y2Nlc3MgIEluZGljYXRlcyB0aGUgc3RhdHVzIG9mIEdyZWdvcmlhbkNhbGVuZGFyIG9iamVjdCBjb25zdHJ1Y3Rpb24uCiAgICAgKiAgICAgICAgICAgICAgICAgUmV0dXJucyBVX1pFUk9fRVJST1IgaWYgY29uc3RydWN0ZWQgc3VjY2Vzc2Z1bGx5LgogICAgICovCiAgICBHcmVnb3JpYW5DYWxlbmRhcihVRXJyb3JDb2RlJiBzdWNjZXNzKTsKCiAgICAvKioKICAgICAqIENvbnN0cnVjdHMgYSBHcmVnb3JpYW5DYWxlbmRhciBiYXNlZCBvbiB0aGUgY3VycmVudCB0aW1lIGluIHRoZSBnaXZlbiB0aW1lIHpvbmUKICAgICAqIHdpdGggdGhlIGRlZmF1bHQgbG9jYWxlLiBDbGllbnRzIGFyZSBubyBsb25nZXIgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZSBnaXZlbgogICAgICogdGltZSB6b25lIG9iamVjdCBhZnRlciBpdCdzIGFkb3B0ZWQuCiAgICAgKgogICAgICogQHBhcmFtIHpvbmVUb0Fkb3B0ICAgICBUaGUgZ2l2ZW4gdGltZXpvbmUuCiAgICAgKiBAcGFyYW0gc3VjY2VzcyAgSW5kaWNhdGVzIHRoZSBzdGF0dXMgb2YgR3JlZ29yaWFuQ2FsZW5kYXIgb2JqZWN0IGNvbnN0cnVjdGlvbi4KICAgICAqICAgICAgICAgICAgICAgICBSZXR1cm5zIFVfWkVST19FUlJPUiBpZiBjb25zdHJ1Y3RlZCBzdWNjZXNzZnVsbHkuCiAgICAgKi8KICAgIEdyZWdvcmlhbkNhbGVuZGFyKFRpbWVab25lKiB6b25lVG9BZG9wdCwgVUVycm9yQ29kZSYgc3VjY2Vzcyk7CgogICAgLyoqCiAgICAgKiBDb25zdHJ1Y3RzIGEgR3JlZ29yaWFuQ2FsZW5kYXIgYmFzZWQgb24gdGhlIGN1cnJlbnQgdGltZSBpbiB0aGUgZ2l2ZW4gdGltZSB6b25lCiAgICAgKiB3aXRoIHRoZSBkZWZhdWx0IGxvY2FsZS4KICAgICAqCiAgICAgKiBAcGFyYW0gem9uZSAgICAgVGhlIGdpdmVuIHRpbWV6b25lLgogICAgICogQHBhcmFtIHN1Y2Nlc3MgIEluZGljYXRlcyB0aGUgc3RhdHVzIG9mIEdyZWdvcmlhbkNhbGVuZGFyIG9iamVjdCBjb25zdHJ1Y3Rpb24uCiAgICAgKiAgICAgICAgICAgICAgICAgUmV0dXJucyBVX1pFUk9fRVJST1IgaWYgY29uc3RydWN0ZWQgc3VjY2Vzc2Z1bGx5LgogICAgICovCiAgICBHcmVnb3JpYW5DYWxlbmRhcihjb25zdCBUaW1lWm9uZSYgem9uZSwgVUVycm9yQ29kZSYgc3VjY2Vzcyk7CgogICAgLyoqCiAgICAgKiBDb25zdHJ1Y3RzIGEgR3JlZ29yaWFuQ2FsZW5kYXIgYmFzZWQgb24gdGhlIGN1cnJlbnQgdGltZSBpbiB0aGUgZGVmYXVsdCB0aW1lIHpvbmUKICAgICAqIHdpdGggdGhlIGdpdmVuIGxvY2FsZS4KICAgICAqCiAgICAgKiBAcGFyYW0gYUxvY2FsZSAgVGhlIGdpdmVuIGxvY2FsZS4KICAgICAqIEBwYXJhbSBzdWNjZXNzICBJbmRpY2F0ZXMgdGhlIHN0YXR1cyBvZiBHcmVnb3JpYW5DYWxlbmRhciBvYmplY3QgY29uc3RydWN0aW9uLgogICAgICogICAgICAgICAgICAgICAgIFJldHVybnMgVV9aRVJPX0VSUk9SIGlmIGNvbnN0cnVjdGVkIHN1Y2Nlc3NmdWxseS4KICAgICAqLwogICAgR3JlZ29yaWFuQ2FsZW5kYXIoY29uc3QgTG9jYWxlJiBhTG9jYWxlLCBVRXJyb3JDb2RlJiBzdWNjZXNzKTsKCiAgICAvKioKICAgICAqIENvbnN0cnVjdHMgYSBHcmVnb3JpYW5DYWxlbmRhciBiYXNlZCBvbiB0aGUgY3VycmVudCB0aW1lIGluIHRoZSBnaXZlbiB0aW1lIHpvbmUKICAgICAqIHdpdGggdGhlIGdpdmVuIGxvY2FsZS4gQ2xpZW50cyBhcmUgbm8gbG9uZ2VyIHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyB0aGUgZ2l2ZW4KICAgICAqIHRpbWUgem9uZSBvYmplY3QgYWZ0ZXIgaXQncyBhZG9wdGVkLgogICAgICoKICAgICAqIEBwYXJhbSB6b25lVG9BZG9wdCAgICAgVGhlIGdpdmVuIHRpbWV6b25lLgogICAgICogQHBhcmFtIGFMb2NhbGUgIFRoZSBnaXZlbiBsb2NhbGUuCiAgICAgKiBAcGFyYW0gc3VjY2VzcyAgSW5kaWNhdGVzIHRoZSBzdGF0dXMgb2YgR3JlZ29yaWFuQ2FsZW5kYXIgb2JqZWN0IGNvbnN0cnVjdGlvbi4KICAgICAqICAgICAgICAgICAgICAgICBSZXR1cm5zIFVfWkVST19FUlJPUiBpZiBjb25zdHJ1Y3RlZCBzdWNjZXNzZnVsbHkuCiAgICAgKi8KICAgIEdyZWdvcmlhbkNhbGVuZGFyKFRpbWVab25lKiB6b25lVG9BZG9wdCwgY29uc3QgTG9jYWxlJiBhTG9jYWxlLCBVRXJyb3JDb2RlJiBzdWNjZXNzKTsKCiAgICAvKioKICAgICAqIENvbnN0cnVjdHMgYSBHcmVnb3JpYW5DYWxlbmRhciBiYXNlZCBvbiB0aGUgY3VycmVudCB0aW1lIGluIHRoZSBnaXZlbiB0aW1lIHpvbmUKICAgICAqIHdpdGggdGhlIGdpdmVuIGxvY2FsZS4KICAgICAqCiAgICAgKiBAcGFyYW0gem9uZSAgICAgVGhlIGdpdmVuIHRpbWV6b25lLgogICAgICogQHBhcmFtIGFMb2NhbGUgIFRoZSBnaXZlbiBsb2NhbGUuCiAgICAgKiBAcGFyYW0gc3VjY2VzcyAgSW5kaWNhdGVzIHRoZSBzdGF0dXMgb2YgR3JlZ29yaWFuQ2FsZW5kYXIgb2JqZWN0IGNvbnN0cnVjdGlvbi4KICAgICAqICAgICAgICAgICAgICAgICBSZXR1cm5zIFVfWkVST19FUlJPUiBpZiBjb25zdHJ1Y3RlZCBzdWNjZXNzZnVsbHkuCiAgICAgKi8KICAgIEdyZWdvcmlhbkNhbGVuZGFyKGNvbnN0IFRpbWVab25lJiB6b25lLCBjb25zdCBMb2NhbGUmIGFMb2NhbGUsIFVFcnJvckNvZGUmIHN1Y2Nlc3MpOwoKICAgIC8qKgogICAgICogQ29uc3RydWN0cyBhIEdyZWdvcmlhbkNhbGVuZGFyIHdpdGggdGhlIGdpdmVuIEFEIGRhdGUgc2V0IGluIHRoZSBkZWZhdWx0IHRpbWUKICAgICAqIHpvbmUgd2l0aCB0aGUgZGVmYXVsdCBsb2NhbGUuCiAgICAgKgogICAgICogQHBhcmFtIHllYXIgICAgIFRoZSB2YWx1ZSB1c2VkIHRvIHNldCB0aGUgWUVBUiB0aW1lIGZpZWxkIGluIHRoZSBjYWxlbmRhci4KICAgICAqIEBwYXJhbSBtb250aCAgICBUaGUgdmFsdWUgdXNlZCB0byBzZXQgdGhlIE1PTlRIIHRpbWUgZmllbGQgaW4gdGhlIGNhbGVuZGFyLiBNb250aAogICAgICogICAgICAgICAgICAgICAgIHZhbHVlIGlzIDAtYmFzZWQuIGUuZy4sIDAgZm9yIEphbnVhcnkuCiAgICAgKiBAcGFyYW0gZGF0ZSAgICAgVGhlIHZhbHVlIHVzZWQgdG8gc2V0IHRoZSBEQVRFIHRpbWUgZmllbGQgaW4gdGhlIGNhbGVuZGFyLgogICAgICogQHBhcmFtIHN1Y2Nlc3MgIEluZGljYXRlcyB0aGUgc3RhdHVzIG9mIEdyZWdvcmlhbkNhbGVuZGFyIG9iamVjdCBjb25zdHJ1Y3Rpb24uCiAgICAgKiAgICAgICAgICAgICAgICAgUmV0dXJucyBVX1pFUk9fRVJST1IgaWYgY29uc3RydWN0ZWQgc3VjY2Vzc2Z1bGx5LgogICAgICovCiAgICBHcmVnb3JpYW5DYWxlbmRhcihpbnQzMl90IHllYXIsIGludDMyX3QgbW9udGgsIGludDMyX3QgZGF0ZSwgVUVycm9yQ29kZSYgc3VjY2Vzcyk7CgogICAgLyoqCiAgICAgKiBDb25zdHJ1Y3RzIGEgR3JlZ29yaWFuQ2FsZW5kYXIgd2l0aCB0aGUgZ2l2ZW4gQUQgZGF0ZSBhbmQgdGltZSBzZXQgZm9yIHRoZQogICAgICogZGVmYXVsdCB0aW1lIHpvbmUgd2l0aCB0aGUgZGVmYXVsdCBsb2NhbGUuCiAgICAgKgogICAgICogQHBhcmFtIHllYXIgICAgIFRoZSB2YWx1ZSB1c2VkIHRvIHNldCB0aGUgWUVBUiB0aW1lIGZpZWxkIGluIHRoZSBjYWxlbmRhci4KICAgICAqIEBwYXJhbSBtb250aCAgICBUaGUgdmFsdWUgdXNlZCB0byBzZXQgdGhlIE1PTlRIIHRpbWUgZmllbGQgaW4gdGhlIGNhbGVuZGFyLiBNb250aAogICAgICogICAgICAgICAgICAgICAgIHZhbHVlIGlzIDAtYmFzZWQuIGUuZy4sIDAgZm9yIEphbnVhcnkuCiAgICAgKiBAcGFyYW0gZGF0ZSAgICAgVGhlIHZhbHVlIHVzZWQgdG8gc2V0IHRoZSBEQVRFIHRpbWUgZmllbGQgaW4gdGhlIGNhbGVuZGFyLgogICAgICogQHBhcmFtIGhvdXIgICAgIFRoZSB2YWx1ZSB1c2VkIHRvIHNldCB0aGUgSE9VUl9PRl9EQVkgdGltZSBmaWVsZCBpbiB0aGUgY2FsZW5kYXIuCiAgICAgKiBAcGFyYW0gbWludXRlICAgVGhlIHZhbHVlIHVzZWQgdG8gc2V0IHRoZSBNSU5VVEUgdGltZSBmaWVsZCBpbiB0aGUgY2FsZW5kYXIuCiAgICAgKiBAcGFyYW0gc3VjY2VzcyAgSW5kaWNhdGVzIHRoZSBzdGF0dXMgb2YgR3JlZ29yaWFuQ2FsZW5kYXIgb2JqZWN0IGNvbnN0cnVjdGlvbi4KICAgICAqICAgICAgICAgICAgICAgICBSZXR1cm5zIFVfWkVST19FUlJPUiBpZiBjb25zdHJ1Y3RlZCBzdWNjZXNzZnVsbHkuCiAgICAgKi8KICAgIEdyZWdvcmlhbkNhbGVuZGFyKGludDMyX3QgeWVhciwgaW50MzJfdCBtb250aCwgaW50MzJfdCBkYXRlLCBpbnQzMl90IGhvdXIsIGludDMyX3QgbWludXRlLCBVRXJyb3JDb2RlJiBzdWNjZXNzKTsKCiAgICAvKioKICAgICAqIENvbnN0cnVjdHMgYSBHcmVnb3JpYW5DYWxlbmRhciB3aXRoIHRoZSBnaXZlbiBBRCBkYXRlIGFuZCB0aW1lIHNldCBmb3IgdGhlCiAgICAgKiBkZWZhdWx0IHRpbWUgem9uZSB3aXRoIHRoZSBkZWZhdWx0IGxvY2FsZS4KICAgICAqCiAgICAgKiBAcGFyYW0geWVhciAgICAgVGhlIHZhbHVlIHVzZWQgdG8gc2V0IHRoZSBZRUFSIHRpbWUgZmllbGQgaW4gdGhlIGNhbGVuZGFyLgogICAgICogQHBhcmFtIG1vbnRoICAgIFRoZSB2YWx1ZSB1c2VkIHRvIHNldCB0aGUgTU9OVEggdGltZSBmaWVsZCBpbiB0aGUgY2FsZW5kYXIuIE1vbnRoCiAgICAgKiAgICAgICAgICAgICAgICAgdmFsdWUgaXMgMC1iYXNlZC4gZS5nLiwgMCBmb3IgSmFudWFyeS4KICAgICAqIEBwYXJhbSBkYXRlICAgICBUaGUgdmFsdWUgdXNlZCB0byBzZXQgdGhlIERBVEUgdGltZSBmaWVsZCBpbiB0aGUgY2FsZW5kYXIuCiAgICAgKiBAcGFyYW0gaG91ciAgICAgVGhlIHZhbHVlIHVzZWQgdG8gc2V0IHRoZSBIT1VSX09GX0RBWSB0aW1lIGZpZWxkIGluIHRoZSBjYWxlbmRhci4KICAgICAqIEBwYXJhbSBtaW51dGUgICBUaGUgdmFsdWUgdXNlZCB0byBzZXQgdGhlIE1JTlVURSB0aW1lIGZpZWxkIGluIHRoZSBjYWxlbmRhci4KICAgICAqIEBwYXJhbSBzZWNvbmQgICBUaGUgdmFsdWUgdXNlZCB0byBzZXQgdGhlIFNFQ09ORCB0aW1lIGZpZWxkIGluIHRoZSBjYWxlbmRhci4KICAgICAqIEBwYXJhbSBzdWNjZXNzICBJbmRpY2F0ZXMgdGhlIHN0YXR1cyBvZiBHcmVnb3JpYW5DYWxlbmRhciBvYmplY3QgY29uc3RydWN0aW9uLgogICAgICogICAgICAgICAgICAgICAgIFJldHVybnMgVV9aRVJPX0VSUk9SIGlmIGNvbnN0cnVjdGVkIHN1Y2Nlc3NmdWxseS4KICAgICAqLwogICAgR3JlZ29yaWFuQ2FsZW5kYXIoaW50MzJfdCB5ZWFyLCBpbnQzMl90IG1vbnRoLCBpbnQzMl90IGRhdGUsIGludDMyX3QgaG91ciwgaW50MzJfdCBtaW51dGUsIGludDMyX3Qgc2Vjb25kLCBVRXJyb3JDb2RlJiBzdWNjZXNzKTsKCiAgICAvKioKICAgICAqIERlc3RydWN0b3IKICAgICAqLwogICAgdmlydHVhbCB+R3JlZ29yaWFuQ2FsZW5kYXIoKTsKCiAgICAvKioKICAgICAqIENvcHkgY29uc3RydWN0b3IKICAgICAqLwogICAgR3JlZ29yaWFuQ2FsZW5kYXIoY29uc3QgR3JlZ29yaWFuQ2FsZW5kYXImIHNvdXJjZSk7CgogICAgLyoqCiAgICAgKiBEZWZhdWx0IGFzc2lnbm1lbnQgb3BlcmF0b3IKICAgICAqLwogICAgR3JlZ29yaWFuQ2FsZW5kYXImIG9wZXJhdG9yPShjb25zdCBHcmVnb3JpYW5DYWxlbmRhciYgcmlnaHQpOwoKICAgIC8qKgogICAgICogQ3JlYXRlIGFuZCByZXR1cm4gYSBwb2x5bW9ycGhpYyBjb3B5IG9mIHRoaXMgY2FsZW5kYXIuCiAgICAgKi8KICAgIHZpcnR1YWwgQ2FsZW5kYXIqIGNsb25lKHZvaWQpIGNvbnN0OwoKICAgIC8qKgogICAgICogU2V0cyB0aGUgR3JlZ29yaWFuQ2FsZW5kYXIgY2hhbmdlIGRhdGUuIFRoaXMgaXMgdGhlIHBvaW50IHdoZW4gdGhlIHN3aXRjaCBmcm9tCiAgICAgKiBKdWxpYW4gZGF0ZXMgdG8gR3JlZ29yaWFuIGRhdGVzIG9jY3VycmVkLiBEZWZhdWx0IGlzIDAwOjAwOjAwIGxvY2FsIHRpbWUsIE9jdG9iZXIKICAgICAqIDE1LCAxNTgyLiBQcmV2aW91cyB0byB0aGlzIHRpbWUgYW5kIGRhdGUgd2lsbCBiZSBKdWxpYW4gZGF0ZXMuCiAgICAgKgogICAgICogQHBhcmFtIGRhdGUgICAgIFRoZSBnaXZlbiBHcmVnb3JpYW4gY3V0b3ZlciBkYXRlLgogICAgICogQHBhcmFtIHN1Y2Nlc3MgIE91dHB1dCBwYXJhbSBzZXQgdG8gc3VjY2Vzcy9mYWlsdXJlIGNvZGUgb24gZXhpdC4KICAgICAqLwogICAgdm9pZCBzZXRHcmVnb3JpYW5DaGFuZ2UoVURhdGUgZGF0ZSwgVUVycm9yQ29kZSYgc3VjY2Vzcyk7CgogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBHcmVnb3JpYW4gQ2FsZW5kYXIgY2hhbmdlIGRhdGUuIFRoaXMgaXMgdGhlIHBvaW50IHdoZW4gdGhlIHN3aXRjaCBmcm9tCiAgICAgKiBKdWxpYW4gZGF0ZXMgdG8gR3JlZ29yaWFuIGRhdGVzIG9jY3VycmVkLiBEZWZhdWx0IGlzIDAwOjAwOjAwIGxvY2FsIHRpbWUsIE9jdG9iZXIKICAgICAqIDE1LCAxNTgyLiBQcmV2aW91cyB0byB0aGlzIHRpbWUgYW5kIGRhdGUgd2lsbCBiZSBKdWxpYW4gZGF0ZXMuCiAgICAgKgogICAgICogQHJldHVybiAgIFRoZSBHcmVnb3JpYW4gY3V0b3ZlciB0aW1lIGZvciB0aGlzIGNhbGVuZGFyLgogICAgICovCiAgICBVRGF0ZSBnZXRHcmVnb3JpYW5DaGFuZ2Uodm9pZCkgY29uc3Q7CgogICAgLyoqCiAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4geWVhciBpcyBhIGxlYXAgeWVhci4gRGV0ZXJtaW5hdGlvbiBvZiB3aGV0aGVyIGEgeWVhciBpcwogICAgICogYSBsZWFwIHllYXIgaXMgYWN0dWFsbHkgdmVyeSBjb21wbGljYXRlZC4gV2UgZG8gc29tZXRoaW5nIGNydWRlIGFuZCBtb3N0bHkKICAgICAqIGNvcnJlY3QgaGVyZSwgYnV0IGZvciBhIHJlYWwgZGV0ZXJtaW5hdGlvbiB5b3UgbmVlZCBhIGxvdCBvZiBjb250ZXh0dWFsCiAgICAgKiBpbmZvcm1hdGlvbi4gRm9yIGV4YW1wbGUsIGluIFN3ZWRlbiwgdGhlIGNoYW5nZSBmcm9tIEp1bGlhbiB0byBHcmVnb3JpYW4gaGFwcGVuZWQKICAgICAqIGluIGEgY29tcGxleCB3YXkgcmVzdWx0aW5nIGluIG1pc3NlZCBsZWFwIHllYXJzIGFuZCBkb3VibGUgbGVhcCB5ZWFycyBiZXR3ZWVuCiAgICAgKiAxNzAwIGFuZCAxNzUzLiBBbm90aGVyIGV4YW1wbGUgaXMgdGhhdCBhZnRlciB0aGUgc3RhcnQgb2YgdGhlIEp1bGlhbiBjYWxlbmRhciBpbgogICAgICogNDUgQi5DLiwgdGhlIGxlYXAgeWVhcnMgZGlkIG5vdCByZWd1bGFyaXplIHVudGlsIDggQS5ELiBUaGlzIG1ldGhvZCBpZ25vcmVzIHRoZXNlCiAgICAgKiBxdWlya3MsIGFuZCBwYXlzIGF0dGVudGlvbiBvbmx5IHRvIHRoZSBKdWxpYW4gb25zZXQgZGF0ZSBhbmQgdGhlIEdyZWdvcmlhbgogICAgICogY3V0b3ZlciAod2hpY2ggY2FuIGJlIGNoYW5nZWQpLgogICAgICoKICAgICAqIEBwYXJhbSB5ZWFyICBUaGUgZ2l2ZW4geWVhci4KICAgICAqIEByZXR1cm4gICAgICBUcnVlIGlmIHRoZSBnaXZlbiB5ZWFyIGlzIGEgbGVhcCB5ZWFyOyBmYWxzZSBvdGhlcndpc2UuCiAgICAgKi8KICAgIGJvb2xfdCBpc0xlYXBZZWFyKGludDMyX3QgeWVhcikgY29uc3Q7CgogICAgLyoqCiAgICAgKiBDb21wYXJlcyB0aGUgZXF1YWxpdHkgb2YgdHdvIEdyZWdvcmlhbkNhbGVuZGFyIG9iamVjdHMuIE9iamVjdHMgb2YgZGlmZmVyZW50CiAgICAgKiBzdWJjbGFzc2VzIGFyZSBjb25zaWRlcmVkIHVuZXF1YWwuICBUaGlzIGlzIGEgc3RyaWN0IGVxdWFsaXR5IHRlc3Q7IHNlZSB0aGUKICAgICAqIGRvY3VtZW50YXRpb24gZm9yIENhbGVuZGFyOjpvcGVyYXRvcj09KCkuCiAgICAgKgogICAgICogQHBhcmFtIHRoYXQgIFRoZSBHcmVnb3JpYW5DYWxlbmRhciBvYmplY3QgdG8gYmUgY29tcGFyZWQgd2l0aC4KICAgICAqIEByZXR1cm4gICAgICBUcnVlIGlmIHRoZSBnaXZlbiBHcmVnb3JpYW5DYWxlbmRhciBpcyB0aGUgc2FtZSBhcyB0aGlzCiAgICAgKiAgICAgICAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXI7IGZhbHNlIG90aGVyd2lzZS4KICAgICAqLwogICAgdmlydHVhbCBib29sX3Qgb3BlcmF0b3I9PShjb25zdCBDYWxlbmRhciYgdGhhdCkgY29uc3Q7CgogICAgLyoqCiAgICAgKiBDYWxlbmRhciBvdmVycmlkZS4KICAgICAqIFJldHVybiB0cnVlIGlmIGFub3RoZXIgQ2FsZW5kYXIgb2JqZWN0IGlzIGVxdWl2YWxlbnQgdG8gdGhpcyBvbmUuICBBbiBlcXVpdmFsZW50CiAgICAgKiBDYWxlbmRhciB3aWxsIGJlaGF2ZSBleGFjdGx5IGFzIHRoaXMgb25lIGRvZXMsIGJ1dCBtYXkgYmUgc2V0IHRvIGEgZGlmZmVyZW50IHRpbWUuCiAgICAgKi8KICAgIHZpcnR1YWwgYm9vbF90IGVxdWl2YWxlbnRUbyhjb25zdCBDYWxlbmRhciYgb3RoZXIpIGNvbnN0OwoKICAgIC8qKgogICAgICogKE92ZXJyaWRlcyBDYWxlbmRhcikgVURhdGUgQXJpdGhtZXRpYyBmdW5jdGlvbi4gQWRkcyB0aGUgc3BlY2lmaWVkIChzaWduZWQpIGFtb3VudAogICAgICogb2YgdGltZSB0byB0aGUgZ2l2ZW4gdGltZSBmaWVsZCwgYmFzZWQgb24gdGhlIGNhbGVuZGFyJ3MgcnVsZXMuICBGb3IgbW9yZQogICAgICogaW5mb3JtYXRpb24sIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgQ2FsZW5kYXI6OmFkZCgpLgogICAgICoKICAgICAqIEBwYXJhbSBmaWVsZCAgIFRoZSB0aW1lIGZpZWxkLgogICAgICogQHBhcmFtIGFtb3VudCAgVGhlIGFtb3VudCBvZiBkYXRlIG9yIHRpbWUgdG8gYmUgYWRkZWQgdG8gdGhlIGZpZWxkLgogICAgICogQHBhcmFtIHN0YXR1cyAgT3V0cHV0IHBhcmFtIHNldCB0byBzdWNjZXNzL2ZhaWx1cmUgY29kZSBvbiBleGl0LiBJZiBhbnkgdmFsdWUKICAgICAqICAgICAgICAgICAgICAgIHByZXZpb3VzbHkgc2V0IGluIHRoZSB0aW1lIGZpZWxkIGlzIGludmFsaWQsIHRoaXMgd2lsbCBiZSBzZXQgdG8KICAgICAqICAgICAgICAgICAgICAgIGFuIGVycm9yIHN0YXR1cy4KICAgICAqLwogICAgdmlydHVhbCB2b2lkIGFkZChFRGF0ZUZpZWxkcyBmaWVsZCwgaW50MzJfdCBhbW91bnQsIFVFcnJvckNvZGUmIHN0YXR1cyk7CgogICAgLyoqCiAgICAgKiAoT3ZlcnJpZGVzIENhbGVuZGFyKSBSb2xscyB1cCBvciBkb3duIGJ5IHRoZSBnaXZlbiBhbW91bnQgaW4gdGhlIHNwZWNpZmllZCBmaWVsZC4KICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIENhbGVuZGFyOjpyb2xsKCkuCiAgICAgKgogICAgICogQHBhcmFtIGZpZWxkICAgVGhlIHRpbWUgZmllbGQuCiAgICAgKiBAcGFyYW0gYW1vdW50ICBJbmRpY2F0ZXMgYW1vdW50IHRvIHJvbGwuCiAgICAgKiBAcGFyYW0gc3RhdHVzICBPdXRwdXQgcGFyYW0gc2V0IHRvIHN1Y2Nlc3MvZmFpbHVyZSBjb2RlIG9uIGV4aXQuIElmIGFueSB2YWx1ZQogICAgICogICAgICAgICAgICAgICAgcHJldmlvdXNseSBzZXQgaW4gdGhlIHRpbWUgZmllbGQgaXMgaW52YWxpZCwgdGhpcyB3aWxsIGJlIHNldCB0bwogICAgICogICAgICAgICAgICAgICAgYW4gZXJyb3Igc3RhdHVzLgogICAgICovCiAgICB2aXJ0dWFsIHZvaWQgcm9sbChFRGF0ZUZpZWxkcyBmaWVsZCwgaW50MzJfdCBhbW91bnQsIFVFcnJvckNvZGUmIHN0YXR1cyk7CgogICAgLyoqCiAgICAgKiAoT3ZlcnJpZGVzIENhbGVuZGFyKSBSZXR1cm5zIG1pbmltdW0gdmFsdWUgZm9yIHRoZSBnaXZlbiBmaWVsZC4gZS5nLiBmb3IKICAgICAqIEdyZWdvcmlhbiBEQVlfT0ZfTU9OVEgsIDEuCiAgICAgKi8KICAgIHZpcnR1YWwgaW50MzJfdCBnZXRNaW5pbXVtKEVEYXRlRmllbGRzIGZpZWxkKSBjb25zdDsKCiAgICAvKioKICAgICAqIChPdmVycmlkZXMgQ2FsZW5kYXIpIFJldHVybnMgbWF4aW11bSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGZpZWxkLiBlLmcuIGZvcgogICAgICogR3JlZ29yaWFuIERBWV9PRl9NT05USCwgMzEuCiAgICAgKi8KICAgIHZpcnR1YWwgaW50MzJfdCBnZXRNYXhpbXVtKEVEYXRlRmllbGRzIGZpZWxkKSBjb25zdDsKCiAgICAvKioKICAgICAqIChPdmVycmlkZXMgQ2FsZW5kYXIpIFJldHVybnMgaGlnaGVzdCBtaW5pbXVtIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZmllbGQgaWYgdmFyaWVzLgogICAgICogT3RoZXJ3aXNlIHNhbWUgYXMgZ2V0TWluaW11bSgpLiBGb3IgR3JlZ29yaWFuLCBubyBkaWZmZXJlbmNlLgogICAgICovCiAgICB2aXJ0dWFsIGludDMyX3QgZ2V0R3JlYXRlc3RNaW5pbXVtKEVEYXRlRmllbGRzIGZpZWxkKSBjb25zdDsKCiAgICAvKioKICAgICAqIChPdmVycmlkZXMgQ2FsZW5kYXIpIFJldHVybnMgbG93ZXN0IG1heGltdW0gdmFsdWUgZm9yIHRoZSBnaXZlbiBmaWVsZCBpZiB2YXJpZXMuCiAgICAgKiBPdGhlcndpc2Ugc2FtZSBhcyBnZXRNYXhpbXVtKCkuIEZvciBHcmVnb3JpYW4gREFZX09GX01PTlRILCAyOC4KICAgICAqLwogICAgdmlydHVhbCBpbnQzMl90IGdldExlYXN0TWF4aW11bShFRGF0ZUZpZWxkcyBmaWVsZCkgY29uc3Q7CgogICAgLyoqCiAgICAgKiBSZXR1cm4gdGhlIG1pbmltdW0gdmFsdWUgdGhhdCB0aGlzIGZpZWxkIGNvdWxkIGhhdmUsIGdpdmVuIHRoZSBjdXJyZW50IGRhdGUuCiAgICAgKiBGb3IgdGhlIEdyZWdvcmlhbiBjYWxlbmRhciwgdGhpcyBpcyB0aGUgc2FtZSBhcyBnZXRNaW5pbXVtKCkgYW5kIGdldEdyZWF0ZXN0TWluaW11bSgpLgogICAgICovCiAgICBpbnQzMl90IGdldEFjdHVhbE1pbmltdW0oRURhdGVGaWVsZHMgZmllbGQpIGNvbnN0OwoKICAgIC8qKgogICAgICogUmV0dXJuIHRoZSBtYXhpbXVtIHZhbHVlIHRoYXQgdGhpcyBmaWVsZCBjb3VsZCBoYXZlLCBnaXZlbiB0aGUgY3VycmVudCBkYXRlLgogICAgICogRm9yIGV4YW1wbGUsIHdpdGggdGhlIGRhdGUgIkZlYiAzLCAxOTk3IiBhbmQgdGhlIERBWV9PRl9NT05USCBmaWVsZCwgdGhlIGFjdHVhbAogICAgICogbWF4aW11bSB3b3VsZCBiZSAyODsgZm9yICJGZWIgMywgMTk5NiIgaXQgcyAyOS4gIFNpbWlsYXJseSBmb3IgYSBIZWJyZXcgY2FsZW5kYXIsCiAgICAgKiBmb3Igc29tZSB5ZWFycyB0aGUgYWN0dWFsIG1heGltdW0gZm9yIE1PTlRIIGlzIDEyLCBhbmQgZm9yIG90aGVycyAxMy4KICAgICAqLwogICAgaW50MzJfdCBnZXRBY3R1YWxNYXhpbXVtKEVEYXRlRmllbGRzIGZpZWxkKSBjb25zdDsKCiAgICAvKioKICAgICAqIChPdmVycmlkZXMgQ2FsZW5kYXIpIFJldHVybiB0cnVlIGlmIHRoZSBjdXJyZW50IGRhdGUgZm9yIHRoaXMgQ2FsZW5kYXIgaXMgaW4KICAgICAqIERheWxpZ2h0IFNhdmluZ3MgVGltZS4gUmVjb2duaXplcyBEU1RfT0ZGU0VULCBpZiBpdCBpcyBzZXQuCiAgICAgKgogICAgICogQHBhcmFtIHN0YXR1cyBGaWxsLWluIHBhcmFtZXRlciB3aGljaCByZWNlaXZlcyB0aGUgc3RhdHVzIG9mIHRoaXMgb3BlcmF0aW9uLgogICAgICogQHJldHVybiAgIFRydWUgaWYgdGhlIGN1cnJlbnQgZGF0ZSBmb3IgdGhpcyBDYWxlbmRhciBpcyBpbiBEYXlsaWdodCBTYXZpbmdzIFRpbWUsCiAgICAgKiAgICAgICAgICAgZmFsc2UsIG90aGVyd2lzZS4KICAgICAqLwogICAgdmlydHVhbCBib29sX3QgaW5EYXlsaWdodFRpbWUoVUVycm9yQ29kZSYgc3RhdHVzKSBjb25zdDsKCnB1YmxpYzoKCiAgICAvKioKICAgICAqIE92ZXJyaWRlIENhbGVuZGFyIFJldHVybnMgYSB1bmlxdWUgY2xhc3MgSUQgUE9MWU1PUlBISUNBTExZLiBQdXJlIHZpcnR1YWwKICAgICAqIG92ZXJyaWRlLiBUaGlzIG1ldGhvZCBpcyB0byBpbXBsZW1lbnQgYSBzaW1wbGUgdmVyc2lvbiBvZiBSVFRJLCBzaW5jZSBub3QgYWxsIEMrKwogICAgICogY29tcGlsZXJzIHN1cHBvcnQgZ2VudWluZSBSVFRJLiBQb2x5bW9ycGhpYyBvcGVyYXRvcj09KCkgYW5kIGNsb25lKCkgbWV0aG9kcyBjYWxsCiAgICAgKiB0aGlzIG1ldGhvZC4KICAgICAqCiAgICAgKiBAcmV0dXJuICAgVGhlIGNsYXNzIElEIGZvciB0aGlzIG9iamVjdC4gQWxsIG9iamVjdHMgb2YgYSBnaXZlbiBjbGFzcyBoYXZlIHRoZQogICAgICogICAgICAgICAgIHNhbWUgY2xhc3MgSUQuIE9iamVjdHMgb2Ygb3RoZXIgY2xhc3NlcyBoYXZlIGRpZmZlcmVudCBjbGFzcyBJRHMuCiAgICAgKi8KICAgIHZpcnR1YWwgVUNsYXNzSUQgZ2V0RHluYW1pY0NsYXNzSUQodm9pZCkgY29uc3QgeyByZXR1cm4gKFVDbGFzc0lEKSZmZ0NsYXNzSUQ7IH0KCiAgICAvKioKICAgICAqIFJldHVybiB0aGUgY2xhc3MgSUQgZm9yIHRoaXMgY2xhc3MuIFRoaXMgaXMgdXNlZnVsIG9ubHkgZm9yIGNvbXBhcmluZyB0byBhIHJldHVybgogICAgICogdmFsdWUgZnJvbSBnZXREeW5hbWljQ2xhc3NJRCgpLiBGb3IgZXhhbXBsZToKICAgICAqCiAgICAgKiAgICAgIEJhc2UqIHBvbHltb3JwaGljX3BvaW50ZXIgPSBjcmVhdGVQb2x5bW9ycGhpY09iamVjdCgpOwogICAgICogICAgICBpZiAocG9seW1vcnBoaWNfcG9pbnRlci0+Z2V0RHluYW1pY0NsYXNzSUQoKSA9PQogICAgICogICAgICAgICAgRGVyaXZlZDo6Z2V0U3RhdGljQ2xhc3NJRCgpKSAuLi4KICAgICAqCiAgICAgKiBAcmV0dXJuICAgVGhlIGNsYXNzIElEIGZvciBhbGwgb2JqZWN0cyBvZiB0aGlzIGNsYXNzLgogICAgICovCiAgICBzdGF0aWMgVUNsYXNzSUQgZ2V0U3RhdGljQ2xhc3NJRCh2b2lkKSB7IHJldHVybiAoVUNsYXNzSUQpJmZnQ2xhc3NJRDsgfQoKcHJvdGVjdGVkOgoKICAgIC8qKgogICAgICogKE92ZXJyaWRlcyBDYWxlbmRhcikgQ29udmVydHMgR01UIGFzIG1pbGxpc2Vjb25kcyB0byB0aW1lIGZpZWxkIHZhbHVlcy4KICAgICAqLwogICAgdmlydHVhbCB2b2lkIGNvbXB1dGVGaWVsZHMoVUVycm9yQ29kZSYgc3RhdHVzKTsKCiAgICAvKioKICAgICAqIChPdmVycmlkZXMgQ2FsZW5kYXIpIENvbnZlcnRzIENhbGVuZGFyJ3MgdGltZSBmaWVsZCB2YWx1ZXMgdG8gR01UIGFzCiAgICAgKiBtaWxsaXNlY29uZHMuCiAgICAgKgogICAgICogQHBhcmFtIHN0YXR1cyAgT3V0cHV0IHBhcmFtIHNldCB0byBzdWNjZXNzL2ZhaWx1cmUgY29kZSBvbiBleGl0LiBJZiBhbnkgdmFsdWUKICAgICAqICAgICAgICAgICAgICAgIHByZXZpb3VzbHkgc2V0IGluIHRoZSB0aW1lIGZpZWxkIGlzIGludmFsaWQsIHRoaXMgd2lsbCBiZSBzZXQgdG8KICAgICAqICAgICAgICAgICAgICAgIGFuIGVycm9yIHN0YXR1cy4KICAgICAqLwogICAgdmlydHVhbCB2b2lkIGNvbXB1dGVUaW1lKFVFcnJvckNvZGUmIHN0YXR1cyk7Cgpwcml2YXRlOiAKICAgIC8qKgogICAgICogUmV0dXJuIHRoZSBFUkEuICBXZSBuZWVkIGEgc3BlY2lhbCBtZXRob2QgZm9yIHRoaXMgYmVjYXVzZSB0aGUKICAgICAqIGRlZmF1bHQgRVJBIGlzIEFELCBidXQgYSB6ZXJvICh1bnNldCkgRVJBIGlzIEJDLgogICAgICovCiAgICBpbnQzMl90IGludGVybmFsR2V0RXJhKCkgY29uc3Q7CgogICAgLy8gdGhpcyBpcyAyXjUyIC0gMSwgdGhlIGxhcmdlc3QgYWxsb3dhYmxlIG1hbnRpc3NhIHdpdGggYSAwIGV4cG9uZW50IGluIGEgNjQtYml0IGRvdWJsZQogICAgc3RhdGljIGNvbnN0IFVEYXRlIEVBUkxJRVNUX1NVUFBPUlRFRF9NSUxMSVM7CiAgICBzdGF0aWMgY29uc3QgVURhdGUgTEFURVNUX1NVUFBPUlRFRF9NSUxMSVM7CgogICAgaW50MzJfdCBtb250aExlbmd0aChpbnQzMl90IG1vbnRoKSBjb25zdDsKICAgIGludDMyX3QgbW9udGhMZW5ndGgoaW50MzJfdCBtb250aCwgaW50MzJfdCB5ZWFyKSBjb25zdDsKCiAgICBpbnQzMl90IHllYXJMZW5ndGgoaW50MzJfdCB5ZWFyKSBjb25zdDsKCiAgICBpbnQzMl90IHllYXJMZW5ndGgodm9pZCkgY29uc3Q7CgogICAgLyoqCiAgICAgKiBBZnRlciBhZGp1c3RtZW50cyBzdWNoIGFzIGFkZChNT05USCksIGFkZChZRUFSKSwgd2UgZG9uJ3Qgd2FudCB0aGUKICAgICAqIG1vbnRoIHRvIGp1bXAgYXJvdW5kLiAgRS5nLiwgd2UgZG9uJ3Qgd2FudCBKYW4gMzEgKyAxIG1vbnRoIHRvIGdvIHRvIE1hcgogICAgICogMywgd2Ugd2FudCBpdCB0byBnbyB0byBGZWIgMjguICBBZGp1c3RtZW50cyB3aGljaCBtaWdodCBydW4gaW50byB0aGlzCiAgICAgKiBwcm9ibGVtIGNhbGwgdGhpcyBtZXRob2QgdG8gcmV0YWluIHRoZSBwcm9wZXIgbW9udGguCiAgICAgKi8KICAgIHZvaWQgcGluRGF5T2ZNb250aCh2b2lkKTsKCiAgICAvKioKICAgICAqIFJldHVybiB0aGUgZGF5IG51bWJlciB3aXRoIHJlc3BlY3QgdG8gdGhlIGVwb2NoLiAgSmFudWFyeSAxLCAxOTcwIChHcmVnb3JpYW4pCiAgICAgKiBpcyBkYXkgemVyby4KICAgICAqLwogICAgVURhdGUgZ2V0RXBvY2hEYXkoVUVycm9yQ29kZSYgc3RhdHVzKTsKCiAgICBzdGF0aWMgZG91YmxlIGNvbXB1dGVKdWxpYW5EYXlPZlllYXIoYm9vbF90IGlzR3JlZ29yaWFuLCBpbnQzMl90IHllYXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbF90JiBpc0xlYXApOwoKICAgIGludDMyX3QgY29tcHV0ZVJlbGF0aXZlRE9XKCkgY29uc3Q7CgogICAgaW50MzJfdCBjb21wdXRlUmVsYXRpdmVET1coZG91YmxlIGp1bGlhbkRheSkgY29uc3Q7CgogICAgaW50MzJfdCBjb21wdXRlRE9ZZnJvbVdPWShkb3VibGUganVsaWFuRGF5T2ZZZWFyKSBjb25zdDsKCiAgICAvKioKICAgICAqIENvbXB1dGUgdGhlIEp1bGlhbiBkYXkgbnVtYmVyIHVuZGVyIGVpdGhlciB0aGUgR3JlZ29yaWFuIG9yIHRoZQogICAgICogSnVsaWFuIGNhbGVuZGFyLCB1c2luZyB0aGUgZ2l2ZW4geWVhciBhbmQgdGhlIHJlbWFpbmluZyBmaWVsZHMuCiAgICAgKiBAcGFyYW0gaXNHcmVnb3JpYW4gaWYgdHJ1ZSwgdXNlIHRoZSBHcmVnb3JpYW4gY2FsZW5kYXIKICAgICAqIEBwYXJhbSB5ZWFyIHRoZSBhZGp1c3RlZCB5ZWFyIG51bWJlciwgd2l0aCAwIGluZGljYXRpbmcgdGhlCiAgICAgKiB5ZWFyIDEgQkMsIC0xIGluZGljYXRpbmcgMiBCQywgZXRjLgogICAgICogQHJldHVybiB0aGUgSnVsaWFuIGRheSBudW1iZXIKICAgICAqLwogICAgZG91YmxlIGNvbXB1dGVKdWxpYW5EYXkoYm9vbF90IGlzR3JlZ29yaWFuLCBpbnQzMl90IHllYXIpOwoKICAgIC8qKgogICAgICogQ29tcHV0ZSB0aGUgZGF0ZS1iYXNlZCBmaWVsZHMgZ2l2ZW4gdGhlIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2ggc3RhcnQuIERvCiAgICAgKiBub3QgY29tcHV0ZSB0aGUgdGltZS1iYXNlZCBmaWVsZHMgKEhPVVIsIE1JTlVURSwgZXRjLikuCiAgICAgKgogICAgICogQHBhcmFtIHRoZVRpbWUgdGhlIHRpbWUgaW4gd2FsbCBtaWxsaXMgKGVpdGhlciBTdGFuZGFyZCBvciBEU1QpLAogICAgICogd2hpY2hldmVyIGlzIGluIGVmZmVjdAogICAgICogQHBhcmFtIHF1aWNrIGlmIHRydWUsIG9ubHkgY29tcHV0ZSB0aGUgRVJBLCBZRUFSLCBNT05USCwgREFURSwKICAgICAqIERBWV9PRl9XRUVLLCBhbmQgREFZX09GX1lFQVIuCiAgICAgKi8KICAgIHZvaWQgdGltZVRvRmllbGRzKFVEYXRlIHRoZVRpbWUsIGJvb2xfdCBxdWljaywgVUVycm9yQ29kZSYgc3RhdHVzKTsKCgogICAgLyoqCiAgICAgKiBSZXR1cm4gdGhlIHdlZWsgbnVtYmVyIG9mIGEgZGF5LCB3aXRoaW4gYSBwZXJpb2QuIFRoaXMgbWF5IGJlIHRoZSB3ZWVrIG51bWJlciBpbgogICAgICogYSB5ZWFyLCBvciB0aGUgd2VlayBudW1iZXIgaW4gYSBtb250aC4gVXN1YWxseSB0aGlzIHdpbGwgYmUgYSB2YWx1ZSA+PSAxLCBidXQgaWYKICAgICAqIHNvbWUgaW5pdGlhbCBkYXlzIG9mIHRoZSBwZXJpb2QgYXJlIGV4Y2x1ZGVkIGZyb20gd2VlayAxLCBiZWNhdXNlCiAgICAgKiBtaW5pbWFsRGF5c0luRmlyc3RXZWVrIGlzID4gMSwgdGhlbiB0aGUgd2VlayBudW1iZXIgd2lsbCBiZSB6ZXJvIGZvciB0aG9zZQogICAgICogaW5pdGlhbCBkYXlzLiBSZXF1aXJlcyB0aGUgZGF5IG9mIHdlZWsgZm9yIHRoZSBnaXZlbiBkYXRlIGluIG9yZGVyIHRvIGRldGVybWluZQogICAgICogdGhlIGRheSBvZiB3ZWVrIG9mIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHBlcmlvZC4KICAgICAqCiAgICAgKiBAcGFyYW0gZGF0ZSAgRGF5LW9mLXllYXIgb3IgZGF5LW9mLW1vbnRoLiBTaG91bGQgYmUgMSBmb3IgZmlyc3QgZGF5IG9mIHBlcmlvZC4KICAgICAqIEBwYXJhbSBkYXkgICBEYXktb2Ytd2VlayBmb3IgZ2l2ZW4gZGF5T2ZQZXJpb2QuIDEtYmFzZWQgd2l0aCAxPVN1bmRheS4KICAgICAqIEByZXR1cm4gICAgICBXZWVrIG51bWJlciwgb25lLWJhc2VkLCBvciB6ZXJvIGlmIHRoZSBkYXkgZmFsbHMgaW4gcGFydCBvZiB0aGUKICAgICAqICAgICAgICAgICAgICBtb250aCBiZWZvcmUgdGhlIGZpcnN0IHdlZWssIHdoZW4gdGhlcmUgYXJlIGRheXMgYmVmb3JlIHRoZSBmaXJzdAogICAgICogICAgICAgICAgICAgIHdlZWsgYmVjYXVzZSB0aGUgbWluaW11bSBkYXlzIGluIHRoZSBmaXJzdCB3ZWVrIGlzIG1vcmUgdGhhbiBvbmUuCiAgICAgKi8KICAgIGludDMyX3Qgd2Vla051bWJlcihpbnQzMl90IGRhdGUsIGludDMyX3QgZGF5KTsKCiAgICAvKioKICAgICAqIFZhbGlkYXRlcyB0aGUgdmFsdWVzIG9mIHRoZSBzZXQgdGltZSBmaWVsZHMuICBUcnVlIGlmIHRoZXkncmUgYWxsIHZhbGlkLgogICAgICovCiAgICBib29sX3QgdmFsaWRhdGVGaWVsZHModm9pZCkgY29uc3Q7CgogICAgLyoqCiAgICAgKiBWYWxpZGF0ZXMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiB0aW1lIGZpZWxkLiAgVHJ1ZSBpZiBpdCdzIHZhbGlkLgogICAgICovCiAgICBib29sX3QgYm91bmRzQ2hlY2soaW50MzJfdCB2YWx1ZSwgRURhdGVGaWVsZHMgZmllbGQpIGNvbnN0OwoKICAgIC8qKgogICAgICogUmV0dXJuIHRoZSBwc2V1ZG8tdGltZS1zdGFtcCBmb3IgdHdvIGZpZWxkcywgZ2l2ZW4gdGhlaXIKICAgICAqIGluZGl2aWR1YWwgcHNldWRvLXRpbWUtc3RhbXBzLiAgSWYgZWl0aGVyIG9mIHRoZSBmaWVsZHMKICAgICAqIGlzIHVuc2V0LCB0aGVuIHRoZSBhZ2dyZWdhdGUgaXMgdW5zZXQuICBPdGhlcndpc2UsIHRoZQogICAgICogYWdncmVnYXRlIGlzIHRoZSBsYXRlciBvZiB0aGUgdHdvIHN0YW1wcy4KICAgICAqLwogICAgaW50MzJfdCBhZ2dyZWdhdGVTdGFtcChpbnQzMl90IHN0YW1wX2EsIGludDMyX3Qgc3RhbXBfYik7CgogICAgLyoqCiAgICAgKiBUaGUgcG9pbnQgYXQgd2hpY2ggdGhlIEdyZWdvcmlhbiBjYWxlbmRhciBydWxlcyBhcmUgdXNlZCwgbWVhc3VyZWQgaW4KICAgICAqIG1pbGxpc2Vjb25kcyBmcm9tIHRoZSBzdGFuZGFyZCBlcG9jaC4gIERlZmF1bHQgaXMgT2N0b2JlciAxNSwgMTU4MgogICAgICogKEdyZWdvcmlhbikgMDA6MDA6MDAgVVRDLCB0aGF0IGlzLCBPY3RvYmVyIDQsIDE1ODIgKEp1bGlhbikgaXMgZm9sbG93ZWQKICAgICAqIGJ5IE9jdG9iZXIgMTUsIDE1ODIgKEdyZWdvcmlhbikuICBUaGlzIGNvcnJlc3BvbmRzIHRvIEp1bGlhbiBkYXkgbnVtYmVyCiAgICAgKiAyMjk5MTYxLgogICAgICovCiAgICAvLyBUaGlzIGlzIG1lYXN1cmVkIGZyb20gdGhlIHN0YW5kYXJkIGVwb2NoLCBub3QgaW4gSnVsaWFuIERheXMuCiAgICBVRGF0ZSAgICAgICAgICAgICAgICBmR3JlZ29yaWFuQ3V0b3ZlcjsKCiAgICAvKioKICAgICAqIE1pZG5pZ2h0LCBsb2NhbCB0aW1lICh1c2luZyB0aGlzIENhbGVuZGFyJ3MgVGltZVpvbmUpIGF0IG9yIGJlZm9yZSB0aGUKICAgICAqIGdyZWdvcmlhbkN1dG92ZXIuIFRoaXMgaXMgYSBwdXJlIGRhdGUgdmFsdWUgd2l0aCBubyB0aW1lIG9mIGRheSBvcgogICAgICogdGltZXpvbmUgY29tcG9uZW50LgogICAgICovCiAgICBVRGF0ZSAgICAgICAgICAgICAgICAgZk5vcm1hbGl6ZWRHcmVnb3JpYW5DdXRvdmVyOy8vID0gZ3JlZ29yaWFuQ3V0b3ZlcjsKCiAgICAvKioKICAgICAqIFRoZSB5ZWFyIG9mIHRoZSBncmVnb3JpYW5DdXRvdmVyLCB3aXRoIDAgcmVwcmVzZW50aW5nCiAgICAgKiAxIEJDLCAtMSByZXByZXNlbnRpbmcgMiBCQywgZXRjLgogICAgICovCiAgICBpbnQzMl90IGZHcmVnb3JpYW5DdXRvdmVyWWVhcjsvLyA9IDE1ODI7CgogICAgc3RhdGljIGNoYXIgZmdDbGFzc0lEOwoKICAgIC8qKgogICAgICogQ29udmVydHMgdGltZSBhcyBtaWxsaXNlY29uZHMgdG8gSnVsaWFuIGRhdGUuIFRoZSBKdWxpYW4gZGF0ZSB1c2VkIGhlcmUgaXMgbm90IGEKICAgICAqIHRydWUgSnVsaWFuIGRhdGUsIHNpbmNlIGl0IGlzIG1lYXN1cmVkIGZyb20gbWlkbmlnaHQsIG5vdCBub29uLgogICAgICoKICAgICAqIEBwYXJhbSBtaWxsaXMgIFRoZSBnaXZlbiBtaWxsaXNlY29uZHMuCiAgICAgKiBAcmV0dXJuICAgICAgICBUaGUgSnVsaWFuIGRhdGUgbnVtYmVyLgogICAgICovCiAgICBzdGF0aWMgZG91YmxlIG1pbGxpc1RvSnVsaWFuRGF5KFVEYXRlIG1pbGxpcyk7CgogICAgLyoqCiAgICAgKiBDb252ZXJ0cyBKdWxpYW4gZGF0ZSB0byB0aW1lIGFzIG1pbGxpc2Vjb25kcy4gVGhlIEp1bGlhbiBkYXRlIHVzZWQgaGVyZSBpcyBub3QgYQogICAgICogdHJ1ZSBKdWxpYW4gZGF0ZSwgc2luY2UgaXQgaXMgbWVhc3VyZWQgZnJvbSBtaWRuaWdodCwgbm90IG5vb24uCiAgICAgKgogICAgICogQHBhcmFtIGp1bGlhbiAgVGhlIGdpdmVuIEp1bGlhbiBkYXRlIG51bWJlci4KICAgICAqIEByZXR1cm4gICAgICAgIFRpbWUgYXMgbWlsbGlzZWNvbmRzLgogICAgICovCiAgICBzdGF0aWMgVURhdGUganVsaWFuRGF5VG9NaWxsaXMoZG91YmxlIGp1bGlhbik7CgogICAgLyoqCiAgICAgKiBDb252ZXJ0IGEgcXVhc2kgSnVsaWFuIGRhdGUgdG8gdGhlIGRheSBvZiB0aGUgd2Vlay4gVGhlIEp1bGlhbiBkYXRlIHVzZWQgaGVyZSBpcwogICAgICogbm90IGEgdHJ1ZSBKdWxpYW4gZGF0ZSwgc2luY2UgaXQgaXMgbWVhc3VyZWQgZnJvbSBtaWRuaWdodCwgbm90IG5vb24uIFJldHVybgogICAgICogdmFsdWUgaXMgb25lLWJhc2VkLgogICAgICoKICAgICAqIEByZXR1cm4gICBEYXkgbnVtYmVyIGZyb20gMS4uNyAoU1VOLi5TQVQpLgogICAgICovCiAgICBzdGF0aWMgdWludDhfdCBqdWxpYW5EYXlUb0RheU9mV2Vlayhkb3VibGUganVsaWFuKTsKICAgIC8qKgogICAgICogRGl2aWRlIHR3byBsb25nIGludGVnZXJzLCByZXR1cm5pbmcgdGhlIGZsb29yIG9mIHRoZSBxdW90aWVudC4KICAgICAqIDxwPgogICAgICogVW5saWtlIHRoZSBidWlsdC1pbiBkaXZpc2lvbiwgdGhpcyBpcyBtYXRoZW1hdGljYWxseSB3ZWxsLWJlaGF2ZWQuCiAgICAgKiBFLmcuLCA8Y29kZT4tMS80PC9jb2RlPiA9PiAwCiAgICAgKiBidXQgPGNvZGU+Zmxvb3JEaXZpZGUoLTEsNCk8L2NvZGU+ID0+IC0xLgogICAgICogQHBhcmFtIG51bWVyYXRvciB0aGUgbnVtZXJhdG9yCiAgICAgKiBAcGFyYW0gZGVub21pbmF0b3IgYSBkaXZpc29yIHdoaWNoIG11c3QgYmUgPiAwCiAgICAgKiBAcmV0dXJuIHRoZSBmbG9vciBvZiB0aGUgcXVvdGllbnQuCiAgICAgKi8KICAgIHN0YXRpYyBkb3VibGUgZmxvb3JEaXZpZGUoZG91YmxlIG51bWVyYXRvciwgZG91YmxlIGRlbm9taW5hdG9yKTsKCiAgICAvKioKICAgICAqIERpdmlkZSB0d28gaW50ZWdlcnMsIHJldHVybmluZyB0aGUgZmxvb3Igb2YgdGhlIHF1b3RpZW50LgogICAgICogPHA+CiAgICAgKiBVbmxpa2UgdGhlIGJ1aWx0LWluIGRpdmlzaW9uLCB0aGlzIGlzIG1hdGhlbWF0aWNhbGx5IHdlbGwtYmVoYXZlZC4KICAgICAqIEUuZy4sIDxjb2RlPi0xLzQ8L2NvZGU+ID0+IDAKICAgICAqIGJ1dCA8Y29kZT5mbG9vckRpdmlkZSgtMSw0KTwvY29kZT4gPT4gLTEuCiAgICAgKiBAcGFyYW0gbnVtZXJhdG9yIHRoZSBudW1lcmF0b3IKICAgICAqIEBwYXJhbSBkZW5vbWluYXRvciBhIGRpdmlzb3Igd2hpY2ggbXVzdCBiZSA+IDAKICAgICAqIEByZXR1cm4gdGhlIGZsb29yIG9mIHRoZSBxdW90aWVudC4KICAgICAqLwogICAgc3RhdGljIGludDMyX3QgZmxvb3JEaXZpZGUoaW50MzJfdCBudW1lcmF0b3IsIGludDMyX3QgZGVub21pbmF0b3IpOwoKICAgIC8qKgogICAgICogRGl2aWRlIHR3byBpbnRlZ2VycywgcmV0dXJuaW5nIHRoZSBmbG9vciBvZiB0aGUgcXVvdGllbnQsIGFuZAogICAgICogdGhlIG1vZHVsdXMgcmVtYWluZGVyLgogICAgICogPHA+CiAgICAgKiBVbmxpa2UgdGhlIGJ1aWx0LWluIGRpdmlzaW9uLCB0aGlzIGlzIG1hdGhlbWF0aWNhbGx5IHdlbGwtYmVoYXZlZC4KICAgICAqIEUuZy4sIDxjb2RlPi0xLzQ8L2NvZGU+ID0+IDAgYW5kIDxjb2RlPi0xJTQ8L2NvZGU+ID0+IC0xLAogICAgICogYnV0IDxjb2RlPmZsb29yRGl2aWRlKC0xLDQpPC9jb2RlPiA9PiAtMSB3aXRoIDxjb2RlPnJlbWFpbmRlclswXTwvY29kZT4gPT4gMy4KICAgICAqIEBwYXJhbSBudW1lcmF0b3IgdGhlIG51bWVyYXRvcgogICAgICogQHBhcmFtIGRlbm9taW5hdG9yIGEgZGl2aXNvciB3aGljaCBtdXN0IGJlID4gMAogICAgICogQHBhcmFtIHJlbWFpbmRlciBhbiBhcnJheSBvZiBhdCBsZWFzdCBvbmUgZWxlbWVudCBpbiB3aGljaCB0aGUgdmFsdWUKICAgICAqIDxjb2RlPm51bWVyYXRvciBtb2QgZGVub21pbmF0b3I8L2NvZGU+IGlzIHJldHVybmVkLiBVbmxpa2UgPGNvZGU+bnVtZXJhdG9yCiAgICAgKiAlIGRlbm9taW5hdG9yPC9jb2RlPiwgdGhpcyB3aWxsIGFsd2F5cyBiZSBub24tbmVnYXRpdmUuCiAgICAgKiBAcmV0dXJuIHRoZSBmbG9vciBvZiB0aGUgcXVvdGllbnQuCiAgICAgKi8KICAgIHN0YXRpYyBpbnQzMl90IGZsb29yRGl2aWRlKGludDMyX3QgbnVtZXJhdG9yLCBpbnQzMl90IGRlbm9taW5hdG9yLCBpbnQzMl90IHJlbWFpbmRlcltdKTsKCiAgICAvKioKICAgICAqIERpdmlkZSB0d28gaW50ZWdlcnMsIHJldHVybmluZyB0aGUgZmxvb3Igb2YgdGhlIHF1b3RpZW50LCBhbmQKICAgICAqIHRoZSBtb2R1bHVzIHJlbWFpbmRlci4KICAgICAqIDxwPgogICAgICogVW5saWtlIHRoZSBidWlsdC1pbiBkaXZpc2lvbiwgdGhpcyBpcyBtYXRoZW1hdGljYWxseSB3ZWxsLWJlaGF2ZWQuCiAgICAgKiBFLmcuLCA8Y29kZT4tMS80PC9jb2RlPiA9PiAwIGFuZCA8Y29kZT4tMSU0PC9jb2RlPiA9PiAtMSwKICAgICAqIGJ1dCA8Y29kZT5mbG9vckRpdmlkZSgtMSw0KTwvY29kZT4gPT4gLTEgd2l0aCA8Y29kZT5yZW1haW5kZXJbMF08L2NvZGU+ID0+IDMuCiAgICAgKiBAcGFyYW0gbnVtZXJhdG9yIHRoZSBudW1lcmF0b3IKICAgICAqIEBwYXJhbSBkZW5vbWluYXRvciBhIGRpdmlzb3Igd2hpY2ggbXVzdCBiZSA+IDAKICAgICAqIEBwYXJhbSByZW1haW5kZXIgYW4gYXJyYXkgb2YgYXQgbGVhc3Qgb25lIGVsZW1lbnQgaW4gd2hpY2ggdGhlIHZhbHVlCiAgICAgKiA8Y29kZT5udW1lcmF0b3IgbW9kIGRlbm9taW5hdG9yPC9jb2RlPiBpcyByZXR1cm5lZC4gVW5saWtlIDxjb2RlPm51bWVyYXRvcgogICAgICogJSBkZW5vbWluYXRvcjwvY29kZT4sIHRoaXMgd2lsbCBhbHdheXMgYmUgbm9uLW5lZ2F0aXZlLgogICAgICogQHJldHVybiB0aGUgZmxvb3Igb2YgdGhlIHF1b3RpZW50LgogICAgICovCiAgICBzdGF0aWMgaW50MzJfdCBmbG9vckRpdmlkZShkb3VibGUgbnVtZXJhdG9yLCBpbnQzMl90IGRlbm9taW5hdG9yLCBpbnQzMl90IHJlbWFpbmRlcltdKTsKCgogICAgc3RhdGljIGNvbnN0IFVEYXRlICAgICAgIGtQYXBhbEN1dG92ZXI7ICAgICAgICAgICAgIC8vIEN1dG92ZXIgZGVjcmVlZCBieSBQb3BlIEdyZWdvcnkKCiAgICBzdGF0aWMgY29uc3QgaW50MzJfdCAgICAga0phbjFfMUp1bGlhbkRheTsgICAgICAgIC8vIEphbnVhcnkgMSwgeWVhciAxIChHcmVnb3JpYW4pCiAgICBzdGF0aWMgY29uc3QgaW50MzJfdCAgICAga0Vwb2NoU3RhcnRBc0p1bGlhbkRheTsgLy8gSmFudWFyeSAxLCAxOTcwIChHcmVnb3JpYW4pCiAgICBzdGF0aWMgY29uc3QgaW50MzJfdCAgICAga0Vwb2NoWWVhcjsKCiAgICBzdGF0aWMgY29uc3QgaW50MzJfdCAgICAga051bURheXMgW107CiAgICBzdGF0aWMgY29uc3QgaW50MzJfdCAgICAga0xlYXBOdW1EYXlzIFtdOwogICAgc3RhdGljIGNvbnN0IGludDMyX3QgICAgIGtNb250aExlbmd0aCBbXTsKICAgIHN0YXRpYyBjb25zdCBpbnQzMl90ICAgICBrTGVhcE1vbnRoTGVuZ3RoIFtdOwoKICAgIHN0YXRpYyBjb25zdCBpbnQzMl90ICAgICBrTWluVmFsdWVzIFtdOwogICAgc3RhdGljIGNvbnN0IGludDMyX3QgICAgIGtMZWFzdE1heFZhbHVlcyBbXTsKICAgIHN0YXRpYyBjb25zdCBpbnQzMl90ICAgICBrTWF4VmFsdWVzIFtdOwoKICAgIC8vIFVzZWZ1bCBtaWxsaXNlY29uZCBjb25zdGFudHMKICAgIHN0YXRpYyBjb25zdCBpbnQzMl90ICAgIGtPbmVTZWNvbmQ7CiAgICBzdGF0aWMgY29uc3QgaW50MzJfdCAgICBrT25lTWludXRlOwogICAgc3RhdGljIGNvbnN0IGludDMyX3QgICAga09uZUhvdXI7CiAgICBzdGF0aWMgY29uc3QgZG91YmxlICAgICAgICBrT25lRGF5OwogICAgc3RhdGljIGNvbnN0IGRvdWJsZSAgICAgICAga09uZVdlZWs7Cn07CgoKaW5saW5lIHVpbnQ4X3QgR3JlZ29yaWFuQ2FsZW5kYXI6Omp1bGlhbkRheVRvRGF5T2ZXZWVrKGRvdWJsZSBqdWxpYW4pCnsKICAvLyBJZiBqdWxpYW4gaXMgbmVnYXRpdmUsIHRoZW4ganVsaWFuJTcgd2lsbCBiZSBuZWdhdGl2ZSwgc28gd2UgYWRqdXN0CiAgLy8gYWNjb3JkaW5nbHkuICBXZSBhZGQgMSBiZWNhdXNlIEp1bGlhbiBkYXkgMCBpcyBNb25kYXkuCiAgaW50OF90IGRheU9mV2VlayA9IChpbnQ4X3QpIHVwcnZfZm1vZChqdWxpYW4gKyAxLCA3KTsKICAKICB1aW50OF90IHJlc3VsdCA9IGRheU9mV2VlayArICgoZGF5T2ZXZWVrIDwgMCkgPyAoNyArIFNVTkRBWSkgOiBTVU5EQVkpOwogIHJldHVybiByZXN1bHQ7Cn0KCiNlbmRpZiAvLyBfR1JFR09DQUwKLy9lb2YKICAgICAgICAK