memoscan
← all memos

Memo 0xd628a2cf…1b7195 on Ethereum

IGVmZmVjdHMKICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudDoKICogLSBtYXBQYXJhbWV0ZXJzKHgsIHkpIC0gTWFwIG5vcm1hbGl6ZWQgaW5wdXQgdG8gZWZmZWN0LXNwZWNpZmljIHZhbHVlcwogKiAtIGNyZWF0ZVVuaWZvcm1zKGRldmljZSkgLSBDcmVhdGUgR1BVIHVuaWZvcm0gYnVmZmVycyBhbmQgYmluZCBncm91cHMKICogLSB3cml0ZVVuaWZvcm1zKGRldmljZSwgbWFwcGVkUGFyYW1zKSAtIFdyaXRlIHBhcmFtZXRlcnMgdG8gR1BVCiAqLwpjbGFzcyBFZmZlY3QgewogICAgY29uc3RydWN0b3IoaWQsIG5hbWUpIHsKICAgICAgICB0aGlzLmlkID0gaWQ7CiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKICAgICAgICAKICAgICAgICAvLyBTdHJ1Y3R1cmVkIHN0YXRlIGZvbGxvd2luZyBhYnN0cmFjdGlvbiBydWxlcwogICAgICAgIHRoaXMuc3RhdGUgPSB7CiAgICAgICAgICAgIC8vIEVmZmVjdCBwYXJhbWV0ZXJzIChub3JtYWxpemVkIDAtMSkKICAgICAgICAgICAgcGFyYW1ldGVyczogewogICAgICAgICAgICAgICAgeDogMC41LAogICAgICAgICAgICAgICAgeTogMC41LAogICAgICAgICAgICAgICAgdGltZTogMC4wICAvLyBBbmltYXRpb24gdGltZQogICAgICAgICAgICB9LAogICAgICAgICAgICAKICAgICAgICAgICAgLy8gR1BVIHJlc291cmNlcwogICAgICAgICAgICB1bmlmb3JtczogewogICAgICAgICAgICAgICAgYnVmZmVyOiBudWxsLAogICAgICAgICAgICAgICAgYmluZEdyb3VwOiBudWxsLAogICAgICAgICAgICAgICAgbGF5b3V0OiBudWxsLAogICAgICAgICAgICAgICAgbmVlZHNVcGRhdGU6IHRydWUKICAgICAgICAgICAgfSwKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIEVmZmVjdCBtZXRhZGF0YQogICAgICAgICAgICBtZXRhZGF0YTogewogICAgICAgICAgICAgICAgaXNJbml0aWFsaXplZDogZmFsc2UsCiAgICAgICAgICAgICAgICBsYXN0VXBkYXRlVGltZTogMCwKICAgICAgICAgICAgICAgIHVwZGF0ZUNvdW50OiAwCiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIAogICAgICAgIC8vIEVmZmVjdC1zcGVjaWZpYyBjb25maWd1cmF0aW9uIChvdmVycmlkZSBpbiBzdWJjbGFzc2VzKQogICAgICAgIHRoaXMuY29uZmlnID0ge307CiAgICAgICAgCiAgICAgICAgdGhpcy5sb2coJ2RlYnVnJywgYEVmZmVjdCBjcmVhdGVkOiAke3RoaXMubmFtZX0gKElEOiAke3RoaXMuaWR9KWApOwogICAgfQogICAgCiAgICAvKioKICAgICAqIE1hcCBub3JtYWxpemVkIFhZIHBhcmFtZXRlcnMgKDAtMSkgdG8gZWZmZWN0LXNwZWNpZmljIHZhbHVlcwogICAgICogTXVzdCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzCiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIE5vcm1hbGl6ZWQgWCBwYXJhbWV0ZXIgKDAtMSkKICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gTm9ybWFsaXplZCBZIHBhcmFtZXRlciAoMC0xKQogICAgICogQHJldHVybnMge09iamVjdH0gRWZmZWN0LXNwZWNpZmljIHBhcmFtZXRlciB2YWx1ZXMKICAgICAqLwogICAgbWFwUGFyYW1ldGVycyh4LCB5KSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBtYXBQYXJhbWV0ZXJzKCkgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSAke3RoaXMubmFtZX1gKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBDcmVhdGUgR1BVIHVuaWZvcm0gYnVmZmVycyBhbmQgYmluZCBncm91cCBsYXlvdXQKICAgICAqIE11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcwogICAgICogQHBhcmFtIHtHUFVEZXZpY2V9IGRldmljZSAtIFdlYkdQVSBkZXZpY2UKICAgICAqLwogICAgYXN5bmMgY3JlYXRlVW5pZm9ybXMoZGV2aWNlKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjcmVhdGVVbmlmb3JtcygpIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgJHt0aGlzLm5hbWV9YCk7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogV3JpdGUgcGFyYW1ldGVyIHZhbHVlcyB0byBHUFUgdW5pZm9ybSBidWZmZXIKICAgICAqIE11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcwogICAgICogQHBhcmFtIHtHUFVEZXZpY2V9IGRldmljZSAtIFdlYkdQVSBkZXZpY2UKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBtYXBwZWRQYXJhbXMgLSBFZmZlY3Qtc3BlY2lmaWMgcGFyYW1ldGVyIHZhbHVlcwogICAgICovCiAgICB3cml0ZVVuaWZvcm1zKGRldmljZSwgbWFwcGVkUGFyYW1zKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB3cml0ZVVuaWZvcm1zKCkgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSAke3RoaXMubmFtZX1gKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBVcGRhdGUgZWZmZWN0IHBhcmFtZXRlcnMgKG5vcm1hbGl6ZWQgMC0xKQogICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBOb3JtYWxpemVkIFggcGFyYW1ldGVyICgwLTEpCiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIE5vcm1hbGl6ZWQgWSBwYXJhbWV0ZXIgKDAtMSkKICAgICAqLwogICAgdXBkYXRlUGFyYW1ldGVycyh4LCB5KSB7CiAgICAgICAgdGhpcy5zdGF0ZS5wYXJhbWV0ZXJzLnggPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB4KSk7CiAgICAgICAgdGhpcy5zdGF0ZS5wYXJhbWV0ZXJzLnkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB5KSk7CiAgICAgICAgdGhpcy5zdGF0ZS51bmlmb3Jtcy5uZWVkc1VwZGF0ZSA9IHRydWU7CiAgICAgICAgdGhpcy5zdGF0ZS5tZXRhZGF0YS5sYXN0VXBkYXRlVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAgICAgIHRoaXMuc3RhdGUubWV0YWRhdGEudXBkYXRlQ291bnQrKzsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBVcGRhdGUgYW5pbWF0aW9uIHRpbWUKICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIC0gVGltZSBpbiBzZWNvbmRzCiAgICAgKi8KICAgIHVwZGF0ZVRpbWUodGltZSkgewogICAgICAgIHRoaXMuc3RhdGUucGFyYW1ldGVycy50aW1lID0gdGltZTsKICAgICAgICB0aGlzLnN0YXRlLnVuaWZvcm1zLm5lZWRzVXBkYXRlID0gdHJ1ZTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBHZXQgbWFwcGVkIHBhcmFtZXRlcnMgYmFzZWQgb24gY3VycmVudCBzdGF0ZQogICAgICogQHJldHVybnMge09iamVjdH0gTWFwcGVkIHBhcmFtZXRlciB2YWx1ZXMKICAgICAqLwogICAgZ2V0TWFwcGVkUGFyYW1ldGVycygpIHsKICAgICAgICByZXR1cm4gdGhpcy5tYXBQYXJhbWV0ZXJzKAogICAgICAgICAgICB0aGlzLnN0YXRlLnBhcmFtZXRlcnMueCwKICAgICAgICAgICAgdGhpcy5zdGF0ZS5wYXJhbWV0ZXJzLnkKICAgICAgICApOwogICAgfQogICAgCiAgICAvKioKICAgICAqIEdldCBiaW5kIGdyb3VwIGZvciByZW5kZXJpbmcKICAgICAqIEByZXR1cm5zIHtHUFVCaW5kR3JvdXB9IEJpbmQgZ3JvdXAgZm9yIHRoaXMgZWZmZWN0CiAgICAgKi8KICAgIGdldEJpbmRHcm91cCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS51bmlmb3Jtcy5iaW5kR3JvdXA7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogR2V0IGJpbmQgZ3JvdXAgbGF5b3V0IGZvciBwaXBlbGluZSBjcmVhdGlvbgogICAgICogQHJldHVybnMge0dQVUJpbmRHcm91cExheW91dH0gQmluZCBncm91cCBsYXlvdXQKICAgICAqLwogICAgZ2V0QmluZEdyb3VwTGF5b3V0KCkgewogICAgICAgIHJldHVybiB0aGlzLnN0YXRlLnVuaWZvcm1zLmxheW91dDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBDaGVjayBpZiBlZmZlY3QgaXMgaW5pdGlhbGl6ZWQKICAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGluaXRpYWxpemVkCiAgICAgKi8KICAgIGlzSW5pdGlhbGl6ZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUubWV0YWRhdGEuaXNJbml0aWFsaXplZDsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBHZXQgZWZmZWN0IHN0YXRlIGZvciBkZWJ1Z2dpbmcKICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEN1cnJlbnQgZWZmZWN0IHN0YXRlCiAgICAgKi8KICAgIGdldEVmZmVjdFN0YXRlKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGlkOiB0aGlzLmlkLAogICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsCiAgICAgICAgICAgIGlzSW5pdGlhbGl6ZWQ6IHRoaXMuc3RhdGUubWV0YWRhdGEuaXNJbml0aWFsaXplZCwKICAgICAgICAgICAgcGFyYW1ldGVyczogeyAuLi50aGlzLnN0YXRlLnBhcmFtZXRlcnMgfSwKICAgICAgICAgICAgbWFwcGVkUGFyYW1ldGVyczogdGhpcy5pc0luaXRpYWxpemVkKCkgPyB0aGlzLmdldE1hcHBlZFBhcmFtZXRlcnMoKSA6IG51bGwsCiAgICAgICAgICAgIHVwZGF0ZUNvdW50OiB0aGlzLnN0YXRlLm1ldGFkYXRhLnVwZGF0ZUNvdW50LAogICAgICAgICAgICBjb25maWc6IHsgLi4udGhpcy5jb25maWcgfQogICAgICAgIH07CiAgICB9CiAgICAKICAgIC8qKgogICAgICogQ2xlYW4gdXAgR1BVIHJlc291cmNlcwogICAgICovCiAgICBkZXN0cm95KCkgewogICAgICAgIGlmICh0aGlzLnN0YXRlLnVuaWZvcm1zLmJ1ZmZlcikgewogICAgICAgICAgICB0aGlzLnN0YXRlLnVuaWZvcm1zLmJ1ZmZlci5kZXN0cm95KCk7CiAgICAgICAgICAgIHRoaXMuc3RhdGUudW5pZm9ybXMuYnVmZmVyID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgdGhpcy5zdGF0ZS51bmlmb3Jtcy5iaW5kR3JvdXAgPSBudWxsOwogICAgICAgIHRoaXMuc3RhdGUudW5pZm9ybXMubGF5b3V0ID0gbnVsbDsKICAgICAgICB0aGlzLnN0YXRlLm1ldGFkYXRhLmlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAgICAgICAKICAgICAgICB0aGlzLmxvZygnaW5mbycsIGBFZmZlY3QgZGVzdHJveWVkOiAke3RoaXMubmFtZX1gKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBIZWxwZXIgbWV0aG9kIGZvciBsb2dnaW5nCiAgICAgKi8KICAgIGxvZyhsZXZlbCwgbWVzc2FnZSwgZGF0YSA9IG51bGwpIHsKICAgICAgICBMb2dnZXJbbGV2ZWxdKCdFRkZFQ1QnLCBgWyR7dGhpcy5uYW1lfV0gJHttZXNzYWdlfWAsIGRhdGEpOwogICAgfQp9CgpFZmZlY3Q7CgoKLy8gVFZTdGF0aWNFZmZlY3QgLSBQcm9jZWR1cmFsbHkgZ2VuZXJhdGVkIFRWIHN0YXRpYyBzbm93Ci8vIFB1cmUgYmxhY2sgJiB3aGl0ZSBub2lzZSwgbm8gQ1JUIGFydGlmYWN0cywgb3B0aW1pemVkIGZvciA2MGZwcysKCmNsYXNzIFRWU3RhdGljRWZmZWN0IGV4dGVuZHMgRWZmZWN0IHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKDAsICdUViBTdGF0aWMnKTsKICAgICAgICAKICAgICAgICAvLyBFZmZlY3Qtc3BlY2lmaWMgY29uZmlndXJhdGlvbgogICAgICAgIHRoaXMuY29uZmlnID0gewogICAgICAgICAgICBpbnRlbnNpdHk6IDEuMCwgICAgICAgICAvLyBTdGF0aWMgaW50ZW5zaXR5ICgwLTEpCiAgICAgICAgICAgIHNwZWVkOiAxLjAsICAgICAgICAgICAgIC8vIEFuaW1hdGlvbiBzcGVlZCBtdWx0aXBsaWVyCiAgICAgICAgICAgIGNvbnRyYXN0OiAxLjUsICAgICAgICAgIC8vIENvbnRyYXN0IGJvb3N0IC0gcHVzaGVzIHRvIGJsYWNrL3doaXRlIGV4dHJlbWVzCiAgICAgICAgICAgIGJyaWdodG5lc3M6IDEuMCAgICAgICAgIC8vIE92ZXJhbGwgYnJpZ2h0bmVzcyAoMS4wID0gZnVsbCByYW5nZSkKICAgICAgICB9OwoKICAgICAgICAvLyBQcmUtYWxsb2NhdGVkIHVuaWZvcm0gYnVmZmVyIOKAlCByZXVzZWQgZXZlcnkgZnJhbWUgdG8gYXZvaWQgR0MgcHJlc3N1cmUKICAgICAgICB0aGlzLnVuaWZvcm1EYXRhID0gbmV3IEZsb2F0MzJBcnJheSgxMik7CiAgICAgICAgCiAgICAgICAgdGhpcy5sb2coJ2luZm8nLCAnVFZTdGF0aWNFZmZlY3QgY3JlYXRlZCB3aXRoIGNvbmZpZzonLCB0aGlzLmNvbmZpZyk7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogTWFwIG5vcm1hbGl6ZWQgWFkgcGFyYW1ldGVycyB0byBzdGF0aWMtc3BlY2lmaWMgdmFsdWVzCiAgICAgKiBGb3IgUGhhc2UgQiwgWC9ZIGFyZSBub3QgdXNlZCAobm8gaW50ZXJhY3Rpb24geWV0KQogICAgICogVGltZSBpcyB0aGUgbWFpbiBwYXJhbWV0ZXIgZm9yIGFuaW1hdGlvbgogICAgICogQHBhcmFtIHtudW1iZXJ9IHggLSBOb3JtYWxpemVkIFggcGFyYW1ldGVyICgwLTEpIC0gdW51c2VkIGluIFBoYXNlIEIKICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gTm9ybWFsaXplZCBZIHBhcmFtZXRlciAoMC0xKSAtIHVudXNlZCBpbiBQaGFzZSBCCiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBTdGF0aWMtc3BlY2lmaWMgcGFyYW1ldGVyIHZhbHVlcwogICAgICovCiAgICBtYXBQYXJhbWV0ZXJzKHgsIHkpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0aW1lOiB0aGlzLnN0YXRlLnBhcmFtZXRlcnMudGltZSwKICAgICAgICAgICAgaW50ZW5zaXR5OiB0aGlzLmNvbmZpZy5pbnRlbnNpdHksCiAgICAgICAgICAgIHNwZWVkOiB0aGlzLmNvbmZpZy5zcGVlZCwKICAgICAgICAgICAgY29udHJhc3Q6IHRoaXMuY29uZmlnLmNvbnRyYXN0LAogICAgICAgICAgICBicmlnaHRuZXNzOiB0aGlzLmNvbmZpZy5icmlnaHRuZXNzLAogICAgICAgICAgICAvLyBSZXNvbHV0aW9uIHdpbGwgYmUgc2V0IGluIHdyaXRlVW5pZm9ybXMKICAgICAgICAgICAgcmVzb2x1dGlvblg6IDE5MjAsCiAgICAgICAgICAgIHJlc29sdXRpb25ZOiAxMDgwCiAgICAgICAgfTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBDcmVhdGUgR1BVIHVuaWZvcm0gYnVmZmVycyBmb3IgVFYgc3RhdGljIHBhcmFtZXRlcnMKICAgICAqIEBwYXJhbSB7R1BVRGV2aWNlfSBkZXZpY2UgLSBXZWJHUFUgZGV2aWNlCiAgICAgKi8KICAgIGFzeW5jIGNyZWF0ZVVuaWZvcm1zKGRldmljZSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHRoaXMubG9nKCdkZWJ1ZycsICdDcmVhdGluZyBUViBzdGF0aWMgdW5pZm9ybSBidWZmZXJzLi4uJyk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBEZWZpbmUgdW5pZm9ybSBidWZmZXIgbGF5b3V0CiAgICAgICAgICAgIC8vIHN0cnVjdCBTdGF0aWNVbmlmb3JtcyB7CiAgICAgICAgICAgIC8vICAgICB0aW1lOiBmMzIsICAgICAgICAgICAvLyBDdXJyZW50IHRpbWUgZm9yIGFuaW1hdGlvbgogICAgICAgICAgICAvLyAgICAgaW50ZW5zaXR5OiBmMzIsICAgICAgLy8gU3RhdGljIGludGVuc2l0eQogICAgICAgICAgICAvLyAgICAgX3BhZDI6IGYzMiwgICAgICAgICAgLy8gcmVzZXJ2ZWQKICAgICAgICAgICAgLy8gICAgIHNwZWVkOiBmMzIsICAgICAgICAgIC8vIEFuaW1hdGlvbiBzcGVlZAogICAgICAgICAgICAvLyAgICAgY29udHJhc3Q6IGYzMiwgICAgICAgLy8gQ29udHJhc3QgbXVsdGlwbGllcgogICAgICAgICAgICAvLyAgICAgX3BhZDU6IGYzMiwgICAgICAgICAgLy8gcmVzZXJ2ZWQKICAgICAgICAgICAgLy8gICAgIGJyaWdodG5lc3M6IGYzMiwgICAgIC8vIE92ZXJhbGwgYnJpZ2h0bmVzcwogICAgICAgICAgICAvLyAgICAgcGFkZGluZzE6IGYzMiwgICAgICAgLy8gQWxpZ25tZW50IHBhZGRpbmcKICAgICAgICAgICAgLy8gICAgIHJlc29sdXRpb246IHZlYzI8ZjMyPiAvLyBTY3JlZW4gcmVzb2x1dGlvbiAoOCBieXRlcykKICAgICAgICAgICAgLy8gICAgIHBhZGRpbmcyOiB2ZWMyPGYzMj4gIC8vIEFsaWdubWVudCBwYWRkaW5nICg4IGJ5dGVzKQogICAgICAgICAgICAvLyB9CiAgICAgICAgICAgIC8vIFRvdGFsOiA0OCBieXRlcyAoYWxpZ25lZCB0byAxNikKICAgICAgICAgICAgY29uc3QgdW5pZm9ybUJ1ZmZlclNpemUgPSA0ODsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIENyZWF0ZSB1bmlmb3JtIGJ1ZmZlcgogICAgICAgICAgICB0aGlzLnN0YXRlLnVuaWZvcm1zLmJ1ZmZlciA9IGRldmljZS5jcmVhdGVCdWZmZXIoewogICAgICAgICAgICAgICAgc2l6ZTogdW5pZm9ybUJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICB1c2FnZTogR1BVQnVmZmVyVXNhZ2UuVU5JRk9STSB8IEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNULAogICAgICAgICAgICAgICAgbGFiZWw6ICdUViBTdGF0aWMgVW5pZm9ybXMnCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gQ3JlYXRlIGJpbmQgZ3JvdXAgbGF5b3V0IChncm91cCAwIGZvciB0aGlzIGVmZmVjdCkKICAgICAgICAgICAgdGhpcy5zdGF0ZS51bmlmb3Jtcy5sYXlvdXQgPSBkZXZpY2UuY3JlYXRlQmluZEdyb3VwTGF5b3V0KHsKICAgICAgICAgICAgICAgIGVudHJpZXM6IFt7CiAgICAgICAgICAgICAgICAgICAgYmluZGluZzogMCwKICAgICAgICAgICAgICAgICAgICB2aXNpYmlsaXR5OiBHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCB8IEdQVVNoYWRlclN0YWdlLlZFUlRFWCwKICAgICAgICAgICAgICAgICAgICBidWZmZXI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3VuaWZvcm0nCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICBsYWJlbDogJ1RWIFN0YXRpYyBCaW5kIEdyb3VwIExheW91dCcKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBDcmVhdGUgYmluZCBncm91cAogICAgICAgICAgICB0aGlzLnN0YXRlLnVuaWZvcm1zLmJpbmRHcm91cCA9IGRldmljZS5jcmVhdGVCaW5kR3JvdXAoewogICAgICAgICAgICAgICAgbGF5b3V0OiB0aGlzLnN0YXRlLnVuaWZvcm1zLmxheW91dCwKICAgICAgICAgICAgICAgIGVudHJpZXM6IFt7CiAgICAgICAgICAgICAgICAgICAgYmluZGluZzogMCwKICAgICAgICAgICAgICAgICAgICByZXNvdXJjZTogewogICAgICAgICAgICAgICAgICAgICAgICBidWZmZXI6IHRoaXMuc3RhdGUudW5pZm9ybXMuYnVmZmVyCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICBsYWJlbDogJ1RWIFN0YXRpYyBCaW5kIEdyb3VwJwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHRoaXMubG9nKCdpbmZvJywgJ1RWIHN0YXRpYyB1bmlmb3JtIGJ1ZmZlcnMgY3JlYXRlZCBzdWNjZXNzZnVsbHknKTsKICAgICAgICAgICAgCiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgdGhpcy5sb2coJ2Vycm9yJywgJ0ZhaWxlZCB0byBjcmVhdGUgVFYgc3RhdGljIHVuaWZvcm1zOicsIGVycm9yKTsKICAgICAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgICAgfQogICAgfQogICAgCiAgICAvKioKICAgICAqIFdyaXRlIHBhcmFtZXRlciB2YWx1ZXMgdG8gR1BVIHVuaWZvcm0gYnVmZmVyCiAgICAgKiBAcGFyYW0ge0dQVURldmljZX0gZGV2aWNlIC0gV2ViR1BVIGRldmljZQogICAgICogQHBhcmFtIHtPYmplY3R9IG1hcHBlZFBhcmFtcyAtIFN0YXRpYy1zcGVjaWZpYyBwYXJhbWV0ZXIgdmFsdWVzCiAgICAgKi8KICAgIHdyaXRlVW5pZm9ybXMoZGV2aWNlLCBtYXBwZWRQYXJhbXMpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICAvLyBXcml0ZSBpbnRvIHByZS1hbGxvY2F0ZWQgYnVmZmVyIOKAlCBhdm9pZHMgcGVyLWZyYW1lIEZsb2F0MzJBcnJheSBhbGxvY2F0aW9uCiAgICAgICAgICAgIHRoaXMudW5pZm9ybURhdGFbMF0gID0gbWFwcGVkUGFyYW1zLnRpbWU7ICAgICAgICAgIC8vIHRpbWU6IGYzMgogICAgICAgICAgICB0aGlzLnVuaWZvcm1EYXRhWzFdICA9IG1hcHBlZFBhcmFtcy5pbnRlbnNpdHk7ICAgICAvLyBpbnRlbnNpdHk6IGYzMgogICAgICAgICAgICB0aGlzLnVuaWZvcm1EYXRhWzJdICA9IDAuMDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBfcGFkMjogZjMyIChyZXNlcnZlZCkKICAgICAgICAgICAgdGhpcy51bmlmb3JtRGF0YVszXSAgPSBtYXBwZWRQYXJhbXMuc3BlZWQ7ICAgICAgICAgLy8gc3BlZWQ6IGYzMgogICAgICAgICAgICB0aGlzLnVuaWZvcm1EYXRhWzRdICA9IG1hcHBlZFBhcmFtcy5jb250cmFzdDsgICAgICAvLyBjb250cmFzdDogZjMyCiAgICAgICAgICAgIHRoaXMudW5pZm9ybURhdGFbNV0gID0gMC4wOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIF9wYWQ1OiBmMzIgKHJlc2VydmVkKQogICAgICAgICAgICB0aGlzLnVuaWZvcm1EYXRhWzZdICA9IG1hcHBlZFBhcmFtcy5icmlnaHRuZXNzOyAgICAvLyBicmlnaHRuZXNzOiBmMzIKICAgICAgICAgICAgdGhpcy51bmlmb3JtRGF0YVs3XSAgPSAwLjA7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFkZGluZzE6IGYzMgogICAgICAgICAgICB0aGlzLnVuaWZvcm1EYXRhWzhdICA9IG1hcHBlZFBhcmFtcy5yZXNvbHV0aW9uWDsgICAvLyByZXNvbHV0aW9uLng6IGYzMgogICAgICAgICAgICB0aGlzLnVuaWZvcm1EYXRhWzldICA9IG1hcHBlZFBhcmFtcy5yZXNvbHV0aW9uWTsgICAvLyByZXNvbHV0aW9uLnk6IGYzMgogICAgICAgICAgICB0aGlzLnVuaWZvcm1EYXRhWzEwXSA9IDAuMDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYWRkaW5nMi54OiBmMzIKICAgICAgICAgICAgdGhpcy51bmlmb3JtRGF0YVsxMV0gPSAwLjA7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFkZGluZzIueTogZjMyCiAgICAgICAgICAgIGNvbnN0IHVuaWZvcm1EYXRhID0gdGhpcy51bmlmb3JtRGF0YTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIFdyaXRlIHRvIEdQVSBidWZmZXIKICAgICAgICAgICAgZGV2aWNlLnF1ZXVlLndyaXRlQnVmZmVyKAogICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS51bmlmb3Jtcy5idWZmZXIsCiAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgdW5pZm9ybURhdGEuYnVmZmVyCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIAogICAgICAgICAgICB0aGlzLnN0YXRlLnVuaWZvcm1zLm5lZWRzVXBkYXRlID0gZmFsc2U7CiAgICAgICAgICAgIAogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIHRoaXMubG9nKCdlcnJvcicsICdGYWlsZWQgdG8gd3JpdGUgVFYgc3RhdGljIHVuaWZvcm1zOicsIGVycm9yKTsKICAgICAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgICAgfQogICAgfQogICAgCiAgICAvKioKICAgICAqIEdldCBUViBzdGF0aWMtc3BlY2lmaWMgc3RhdGUgZm9yIGRlYnVnZ2luZwogICAgICogQHJldHVybnMge09iamVjdH0gRXh0ZW5kZWQgc3RhdGUgd2l0aCBzdGF0aWMgaW5mbwogICAgICovCiAgICBnZXRFZmZlY3RTdGF0ZSgpIHsKICAgICAgICBjb25zdCBiYXNlU3RhdGUgPSBzdXBlci5nZXRFZmZlY3RTdGF0ZSgpOwogICAgICAgIAogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIC4uLmJhc2VTdGF0ZSwKICAgICAgICAgICAgc3RhdGljQ29uZmlnOiB0aGlzLmNvbmZpZywKICAgICAgICAgICAgY3VycmVudFRpbWU6IHRoaXMuc3RhdGUucGFyYW1ldGVycy50aW1lLnRvRml4ZWQoMikKICAgICAgICB9OwogICAgfQp9CgpUVlN0YXRpY0VmZmVjdDsKCgovLyBQaXhlbGl6YXRpb25FZmZlY3QgLSBEeW5hbWljIHBpeGVsaXphdGlvbiBwb3N0LXByb2Nlc3NpbmcKLy8gWC1heGlzIGNvbnRyb2xzIHBpeGVsIGdyYW51bGFyaXR5ICh0dW5hYmxlIG1pbi9tYXggcm93cykKLy8gWS1heGlzIGNvbnRyb2xzIG9wYWNpdHkvYmxlbmQgKGJvdHRvbT1vcGFxdWUsIHRvcD10cmFuc3BhcmVudCkKLy8gQmFzZWQgb24gd2ViX0dQVV9taXhlci9lZmZlY3RzL2VmZmVjdHMvUGl4ZWxpemF0aW9uRWZmZWN0LmpzCgpjbGFzcyBQaXhlbGl6YXRpb25FZmZlY3QgZXh0ZW5kcyBFZmZlY3QgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoMSwgJ1BpeGVsaXphdGlvbicpOwogICAgICAgIAogICAgICAgIC8vIEVmZmVjdC1zcGVjaWZpYyBtZXRhZGF0YQogICAgICAgIHRoaXMuc3RhdGUubWV0YWRhdGEgPSB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnRHluYW1pYyBwaXhlbGl6YXRpb24gd2l0aCBhZGp1c3RhYmxlIGdyaWQgc2l6ZScsCiAgICAgICAgICAgIHBhcmFtZXRlck5hbWVzOiB7IAogICAgICAgICAgICAgICAgeDogJ1BpeGVsIEdyYW51bGFyaXR5IChyb3dzKScsIAogICAgICAgICAgICAgICAgeTogJ09wYWNpdHkvQmxlbmQgKGJvdHRvbT1vcGFxdWUsIHRvcD10cmFuc3BhcmVudCknIAogICAgICAgICAgICB9LAogICAgICAgICAgICBpc0luaXRpYWxpemVkOiBmYWxzZSwKICAgICAgICAgICAgbGFzdFVwZGF0ZVRpbWU6IDAKICAgICAgICB9OwogICAgICAgIAogICAgICAgIC8vIFRVTkFCTEUgQ09ORklHVVJBVElPTgogICAgICAgIC8vIEFkanVzdCB0aGVzZSB2YWx1ZXMgdG8gY2hhbmdlIHBpeGVsaXphdGlvbiByYW5nZQogICAgICAgIHRoaXMuY29uZmlnID0gewogICAgICAgICAgICBtaW5QaXhlbFJvd3M6IDIsICAgICAgLy8gTGVmdCBvZiBYLWF4aXMgKHZlcnkgY2h1bmt5IC0gbGFyZ2UgcGl4ZWxzKQogICAgICAgICAgICBtYXhQaXhlbFJvd3M6IDExMSwgICAgIC8vIFJpZ2h0IG9mIFgtYXhpcyAoZmluZSAtIHNtYWxsIHBpeGVscykKICAgICAgICAgICAgZGVmYXVsdFBpeGVsUm93czogMjAgIC8vIFN0YXJ0aW5nIHZhbHVlIChtZWRpdW0gcGl4ZWxzKQogICAgICAgIH07CgogICAgICAgIC8vIFNldCBkZWZhdWx0IHBhcmFtZXRlcnMgdG8gY3JlYXRlIG1lZGl1bS1zaXplZCBwaXhlbHMgKFggY29udHJvbHMgZ3JhbnVsYXJpdHkgbm93KQogICAgICAgIGNvbnN0IGRlZmF1bHRYID0gKHRoaXMuY29uZmlnLmRlZmF1bHRQaXhlbFJvd3MgLSB0aGlzLmNvbmZpZy5taW5QaXhlbFJvd3MpIC8gCiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLmNvbmZpZy5tYXhQaXhlbFJvd3MgLSB0aGlzLmNvbmZpZy5taW5QaXhlbFJvd3MpOwogICAgICAgIHRoaXMuc3RhdGUucGFyYW1ldGVycy54ID0gZGVmYXVsdFg7CiAgICAgICAgCiAgICAgICAgLy8gU2V0IGRlZmF1bHQgWSB0byBvcGFxdWUgKGJsZW5kIGZhY3RvciA9IDApCiAgICAgICAgdGhpcy5zdGF0ZS5wYXJhbWV0ZXJzLnkgPSAwOwoKICAgICAgICAvLyBQcmUtYWxsb2NhdGVkIHVuaWZvcm0gYnVmZmVyIOKAlCByZXVzZWQgZXZlcnkgZnJhbWUgdG8gYXZvaWQgR0MgcHJlc3N1cmUKICAgICAgICB0aGlzLnVuaWZvcm1EYXRhID0gbmV3IEZsb2F0MzJBcnJheSg4KTsKCiAgICAgICAgdGhpcy5sb2coJ2luZm8nLCBgQ3JlYXRlZCBQaXhlbGl6YXRpb25FZmZlY3Qgd2l0aCBjb25maWc6YCwgdGhpcy5jb25maWcpOwogICAgfQoKICAgIC8qKgogICAgICogTWFwIG5vcm1hbGl6ZWQgWFkgcGFyYW1ldGVycyB0byBwaXhlbGl6YXRpb24tc3BlY2lmaWMgdmFsdWVzCiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAtIE5vcm1hbGl6ZWQgWCBwYXJhbWV0ZXIgKDAtMSkgLSBjb250cm9scyBwaXhlbCBncmFudWxhcml0eSAobGVmdD1jaHVua3ksIHJpZ2h0PWZpbmUpCiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAtIE5vcm1hbGl6ZWQgWSBwYXJhbWV0ZXIgKDAtMSkgLSBjb250cm9scyBibGVuZC9vcGFjaXR5IChib3R0b209b3BhcXVlLCB0b3A9dHJhbnNwYXJlbnQpCiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBQaXhlbGl6YXRpb24tc3BlY2lmaWMgcGFyYW1ldGVyIHZhbHVlcwogICAgICovCiAgICBtYXBQYXJhbWV0ZXJzKHgsIHkpIHsKICAgICAgICAvLyBYIGNvbnRyb2xzIHBpeGVsIGdyYW51bGFyaXR5IHVzaW5nIExPR0FSSVRITUlDIHNjYWxpbmcgZm9yIG1vcmUgZ3JhZHVhbC9uYXR1cmFsIGZlZWwKICAgICAgICAvLyAwID0gbGFyZ2UgcGl4ZWxzIChtaW5QaXhlbFJvd3MpLCAxID0gc21hbGwgcGl4ZWxzIChtYXhQaXhlbFJvd3MpCiAgICAgICAgLy8gRm9ybXVsYTogcGl4ZWxSb3dzID0gbWluUGl4ZWxSb3dzICogKG1heFBpeGVsUm93cy9taW5QaXhlbFJvd3MpXngKICAgICAgICBjb25zdCBtaW5Sb3dzID0gdGhpcy5jb25maWcubWluUGl4ZWxSb3dzOwogICAgICAgIGNvbnN0IG1heFJvd3MgPSB0aGlzLmNvbmZpZy5tYXhQaXhlbFJvd3M7CiAgICAgICAgY29uc3QgcGl4ZWxSb3dzID0gbWluUm93cyAqIE1hdGgucG93KG1heFJvd3MgLyBtaW5Sb3dzLCB4KTsKICAgICAgICAKICAgICAgICAvLyBDYWxjdWxhdGUgcGl4ZWwgY29sdW1ucyB0byBtYWludGFpbiBzcXVhcmUgcGl4ZWxzIGJhc2VkIG9uIGNhbnZhcyBhc3BlY3QgcmF0aW8KICAgICAgICAvLyBUaGlzIHdpbGwgYmUgdXBkYXRlZCB3aGVuIHdlIGhhdmUgYWN0dWFsIGNhbnZhcyBkaW1lbnNpb25zCiAgICAgICAgY29uc3QgYXNwZWN0UmF0aW8gPSAxNiAvIDk7IC8vIERlZmF1bHQgYXNwZWN0IHJhdGlvLCB3aWxsIGJlIHVwZGF0ZWQgZnJvbSBjYW52YXMKICAgICAgICBjb25zdCBwaXhlbENvbHMgPSBNYXRoLnJvdW5kKHBpeGVsUm93cyAqIGFzcGVjdFJhdGlvKTsKICAgICAgICAKICAgICAgICAvLyBZIGNvbnRyb2xzIGJsZW5kIGZhY3RvcjogMCA9IHNvbGlkIG9wYXF1ZSBwaXhlbHMgKGJvdHRvbSksIDEgPSBmb2dneS90cmFuc3BhcmVudCAodG9wKQogICAgICAgIGNvbnN0IGJsZW5kRmFjdG9yID0geTsKICAgICAgICAKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBwaXhlbFJvd3M6IE1hdGgucm91bmQocGl4ZWxSb3dzKSwKICAgICAgICAgICAgcGl4ZWxDb2xzOiBwaXhlbENvbHMsCiAgICAgICAgICAgIGJsZW5kRmFjdG9yOiBibGVuZEZhY3RvciwKICAgICAgICAgICAgZ3JhbnVsYXJpdHk6IHggLy8gTm9ybWFsaXplZCBncmFudWxhcml0eSBmb3IgZGVidWdnaW5nIChub3cgZnJvbSBYKQogICAgICAgIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGUgR1BVIHVuaWZvcm0gYnVmZmVycyBhbmQgYmluZCBncm91cCBsYXlvdXQgZm9yIHBpeGVsaXphdGlvbgogICAgICogQHBhcmFtIHtHUFVEZXZpY2V9IGRldmljZSAtIFdlYkdQVSBkZXZpY2UKICAgICAqLwogICAgYXN5bmMgY3JlYXRlVW5pZm9ybXMoZGV2aWNlKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdGhpcy5sb2coJ2RlYnVnJywgJ0NyZWF0aW5nIHBpeGVsaXphdGlvbiB1bmlmb3JtIGJ1ZmZlcnMuLi4nKTsKCiAgICAgICAgICAgIC8vIERlZmluZSB1bmlmb3JtIGJ1ZmZlciBsYXlvdXQgZm9yIHBpeGVsaXphdGlvbiBwYXJhbWV0ZXJzCiAgICAgICAgICAgIC8vIFN0cnVjdCBFZmZlY3RVbmlmb3JtcyB7CiAgICAgICAgICAgIC8vICAgICBwaXhlbFJvd3M6IGYzMiwKICAgICAgICAgICAgLy8gICAgIHBpeGVsQ29sczogZjMyLCAKICAgICAgICAgICAgLy8gICAgIGNhbnZhc1dpZHRoOiBmMzIsCiAgICAgICAgICAgIC8vICAgICBjYW52YXNIZWlnaHQ6IGYzMiwKICAgICAgICAgICAgLy8gICAgIGJsZW5kRmFjdG9yOiBmMzIsCiAgICAgICAgICAgIC8vICAgICB0aW1lOiBmMzIsCiAgICAgICAgICAgIC8vICAgICBfcGFkZGluZzE6IGYzMiwKICAgICAgICAgICAgLy8gICAgIF9wYWRkaW5nMjogZjMyLAogICAgICAgICAgICAvLyB9CiAgICAgICAgICAgIGNvbnN0IHVuaWZvcm1CdWZmZXJTaXplID0gOCAqIDQ7IC8vIDggZjMyIHZhbHVlcyAqIDQgYnl0ZXMgZWFjaCA9IDMyIGJ5dGVzCgogICAgICAgICAgICAvLyBDcmVhdGUgdW5pZm9ybSBidWZmZXIKICAgICAgICAgICAgdGhpcy5zdGF0ZS51bmlmb3Jtcy5idWZmZXIgPSBkZXZpY2UuY3JlYXRlQnVmZmVyKHsKICAgICAgICAgICAgICAgIHNpemU6IHVuaWZvcm1CdWZmZXJTaXplLAogICAgICAgICAgICAgICAgdXNhZ2U6IEdQVUJ1ZmZlclVzYWdlLlVOSUZPUk0gfCBHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVCwKICAgICAgICAgICAgICAgIGxhYmVsOiAnUGl4ZWxpemF0aW9uIEVmZmVjdCBVbmlmb3JtcycKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBDcmVhdGUgYmluZCBncm91cCBsYXlvdXQgZm9yIGVmZmVjdCB1bmlmb3JtcyAoZ3JvdXAgMSkKICAgICAgICAgICAgdGhpcy5zdGF0ZS51bmlmb3Jtcy5sYXlvdXQgPSBkZXZpY2UuY3JlYXRlQmluZEdyb3VwTGF5b3V0KHsKICAgICAgICAgICAgICAgIGVudHJpZXM6IFt7CiAgICAgICAgICAgICAgICAgICAgYmluZGluZzogMCwKICAgICAgICAgICAgICAgICAgICB2aXNpYmlsaXR5OiBHUFVTaGFkZXJTdGFnZS5GUkFHTUVOVCwKICAgICAgICAgICAgICAgICAgICBidWZmZXI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3VuaWZvcm0nCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICBsYWJlbDogJ1BpeGVsaXphdGlvbiBFZmZlY3QgQmluZCBHcm91cCBMYXlvdXQnCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gQ3JlYXRlIGJpbmQgZ3JvdXAKICAgICAgICAgICAgdGhpcy5zdGF0ZS51bmlmb3Jtcy5iaW5kR3JvdXAgPSBkZXZpY2UuY3JlYXRlQmluZEdyb3VwKHsKICAgICAgICAgICAgICAgIGxheW91dDogdGhpcy5zdGF0ZS51bmlmb3Jtcy5sYXlvdXQsCiAgICAgICAgICAgICAgICBlbnRyaWVzOiBbewogICAgICAgICAgICAgICAgICAgIGJpbmRpbmc6IDAsCiAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2U6IHsKICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyOiB0aGlzLnN0YXRlLnVuaWZvcm1zLmJ1ZmZlcgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgbGFiZWw6ICdQaXhlbGl6YXRpb24gRWZmZWN0IEJpbmQgR3JvdXAnCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgdGhpcy5sb2coJ2luZm8nLCAnUGl4ZWxpemF0aW9uIHVuaWZvcm0gYnVmZmVycyBjcmVhdGVkIHN1Y2Nlc3NmdWxseScpOwoKICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICB0aGlzLmxvZygnZXJyb3InLCAnRmFpbGVkIHRvIGNyZWF0ZSBwaXhlbGl6YXRpb24gdW5pZm9ybXM6JywgZXJyb3IpOwogICAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBXcml0ZSBwYXJhbWV0ZXIgdmFsdWVzIHRvIEdQVSB1bmlmb3JtIGJ1ZmZlcgogICAgICogQHBhcmFtIHtHUFVEZXZpY2V9IGRldmljZSAtIFdlYkdQVSBkZXZpY2UKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBtYXBwZWRQYXJhbXMgLSBQaXhlbGl6YXRpb24tc3BlY2lmaWMgcGFyYW1ldGVyIHZhbHVlcwogICAgICovCiAgICB3cml0ZVVuaWZvcm1zKGRldmljZSwgbWFwcGVkUGFyYW1zKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgLy8gR2V0IGNhbnZhcyBkaW1lbnNpb25zICh3aWxsIGJlIHByb3ZpZGVkIGJ5IHJlbmRlcmVyKQogICAgICAgICAgICAvLyBGb3Igbm93LCB1c2UgZGVmYXVsdCBkaW1lbnNpb25zIC0gdGhpcyB3aWxsIGJlIHVwZGF0ZWQgd2hlbiBpbnRlZ3JhdGVkCiAgICAgICAgICAgIGNvbnN0IGNhbnZhc1dpZHRoID0gdGhpcy5jYW52YXNXaWR0aCB8fCAxOTIwOwogICAgICAgICAgICBjb25zdCBjYW52YXNIZWlnaHQgPSB0aGlzLmNhbnZhc0hlaWdodCB8fCAxMDgwOwoKICAgICAgICAgICAgLy8gUmVjYWxjdWxhdGUgcGl4ZWwgY29sdW1ucyBiYXNlZCBvbiBhY3R1YWwgY2FudmFzIGFzcGVjdCByYXRpbwogICAgICAgICAgICBjb25zdCBhc3BlY3RSYXRpbyA9IGNhbnZhc1dpZHRoIC8gY2FudmFzSGVpZ2h0OwogICAgICAgICAgICBjb25zdCBwaXhlbENvbHMgPSBNYXRoLnJvdW5kKG1hcHBlZFBhcmFtcy5waXhlbFJvd3MgKiBhc3BlY3RSYXRpbyk7CgogICAgICAgICAgICAvLyBXcml0ZSBpbnRvIHByZS1hbGxvY2F0ZWQgYnVmZmVyIOKAlCBhdm9pZHMgcGVyLWZyYW1lIEZsb2F0MzJBcnJheSBhbGxvY2F0aW9uCiAgICAgICAgICAgIHRoaXMudW5pZm9ybURhdGFbMF0gPSBtYXBwZWRQYXJhbXMucGl4ZWxSb3dzOyAgICAgIC8vIHBpeGVsUm93czogZjMyCiAgICAgICAgICAgIHRoaXMudW5pZm9ybURhdGFbMV0gPSBwaXhlbENvbHM7ICAgICAgICAgICAgICAgICAgIC8vIHBpeGVsQ29sczogZjMyCiAgICAgICAgICAgIHRoaXMudW5pZm9ybURhdGFbMl0gPSBjYW52YXNXaWR0aDsgICAgICAgICAgICAgICAgIC8vIGNhbnZhc1dpZHRoOiBmMzIKICAgICAgICAgICAgdGhpcy51bmlmb3JtRGF0YVszXSA9IGNhbnZhc0hlaWdodDsgICAgICAgICAgICAgICAgLy8gY2FudmFzSGVpZ2h0OiBmMzIKICAgICAgICAgICAgdGhpcy51bmlmb3JtRGF0YVs0XSA9IG1hcHBlZFBhcmFtcy5ibGVuZEZhY3RvcjsgICAgLy8gYmxlbmRGYWN0b3I6IGYzMiAoMD1zb2xpZCwgMT1mb2dneSkKICAgICAgICAgICAgdGhpcy51bmlmb3JtRGF0YVs1XSA9IHRoaXMuc3RhdGUucGFyYW1ldGVycy50aW1lOyAgLy8gdGltZTogZjMyCiAgICAgICAgICAgIHRoaXMudW5pZm9ybURhdGFbNl0gPSAwLjA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIF9wYWRkaW5nMTogZjMyCiAgICAgICAgICAgIHRoaXMudW5pZm9ybURhdGFbN10gPSAwLjA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIF9wYWRkaW5nMjogZjMyCiAgICAgICAgICAgIGNvbnN0IHVuaWZvcm1EYXRhID0gdGhpcy51bmlmb3JtRGF0YTsKCiAgICAgICAgICAgIC8vIFdyaXRlIHRvIEdQVSBidWZmZXIKICAgICAgICAgICAgZGV2aWNlLnF1ZXVlLndyaXRlQnVmZmVyKAogICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS51bmlmb3Jtcy5idWZmZXIsCiAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgdW5pZm9ybURhdGEuYnVmZmVyCiAgICAgICAgICAgICk7CgogICA