LyoKICAkSWQkCgogICBDb3B5cmlnaHQgKGMpIDIwMDQgSmVyZW15IFJheW5lci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgIEplcmVteSBSYXluZXIgbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIG9yIHdhcnJhbnRpZXMgYWJvdXQKICAgdGhlIGZpdG5lc3Mgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHBhcnRpY3VsYXIgcHVycG9zZSwKICAgaW5jbHVkaW5nIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIG1lcmNoYW50YWJpbGl0eS4KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KcGFja2FnZSBjb20uamF2YW5pY3VzLmJwd2o7CgppbXBvcnQgc2ptLnBhcnNlLio7CmltcG9ydCBzam0ucGFyc2UudG9rZW5zLio7CgovKioKICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIEphdmEgcGFyc2VyIGFzIHNwZWNpZmllZCBpbiBKTFN2My4KICoKICogQGF1dGhvciBKZXJlbXkgUmF5bmVyCiAqCiAqLwpjbGFzcyBKYXZhUGFyc2VyIHsKCiAgICBwdWJsaWMgUGFyc2VyIHN0YXJ0KCkgewogICAgICAgIHJldHVybiBjb21waWxhdGlvblVuaXQoKTsKICAgIH0KCiAgICAvLyAtLS0tLSAgdXRpbGl0eSBtZXRob2RzICAtLS0tLS0tLS0KICAgIHByb3RlY3RlZCB2b2lkIGxvZyhTdHJpbmcgcykgewogICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKHMpOwogICAgfQoKICAgIHByb3RlY3RlZCBBbHRlcm5hdGlvbiBhbHRlcm5hdGlvbihTdHJpbmcgbmFtZSkgewogICAgICAgIHJldHVybiBuZXcgQWx0ZXJuYXRpb24obmFtZSk7CiAgICB9CgogICAgcHJvdGVjdGVkIFNlcXVlbmNlIHNlcXVlbmNlKFN0cmluZyBuYW1lKSB7CiAgICAgICAgcmV0dXJuIG5ldyBUcmFja1NlcXVlbmNlKG5hbWUpOwogICAgfQoKICAgIHByb3RlY3RlZCBSZXBldGl0aW9uIHJlcGV0aXRpb24oUGFyc2VyIHBhcnNlcjEpIHsKICAgICAgICByZXR1cm4gbmV3IFJlcGV0aXRpb24ocGFyc2VyMSk7CiAgICB9CgogICAgcHJvdGVjdGVkIFBhcnNlciB6ZXJvT3JPbmUoUGFyc2VyIHBhcnNlcjEpIHsKICAgICAgICByZXR1cm4gYWx0ZXJuYXRpb24oInplcm8gb3Igb25lIikKICAgICAgICAgICAgICAgIC5hZGQobmV3IEVtcHR5KCkpCiAgICAgICAgICAgICAgICAuYWRkKHBhcnNlcjEpCiAgICAgICAgICAgIDsKICAgIH0KCiAgICBwcm90ZWN0ZWQgUGFyc2VyIG9uZU9yTW9yZShQYXJzZXIgcGFyc2VyMSkgewogICAgICAgIHJldHVybiBzZXF1ZW5jZSgib25lIG9yIG1vcmUgIiArIHBhcnNlcjEuZ2V0TmFtZSgpKQogICAgICAgICAgICAuYWRkKHBhcnNlcjEpCiAgICAgICAgICAgIC5hZGQocmVwZXRpdGlvbihwYXJzZXIxKSk7CiAgICB9CgoKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLSBNYWluIEdyYW1tYXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIC8qKiBJZGVudGlmaWVyOgogICAgICogICAgICBJREVOVElGSUVSCiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgaWRlbnRpZmllcigpIHsKICAgICAgICBsb2coImlkZW50aWZpZXIiKTsKICAgICAgICAvL0B0b2RvCiAgICAgICAgUGFyc2VyIHAgPSBuZXcgV29yZCgpOwogICAgICAgIHJldHVybiBwOwogICAgfQoKICAgIC8qKiBRdWFsaWZpZWRJZGVudGlmaWVyOgogICAgICogICAgICBJZGVudGlmaWVyIHsuIElkZW50aWZpZXIgfQogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIHF1YWxpZmllZElkZW50aWZpZXIoKSB7CiAgICAgICAgbG9nKCJxdWFsaWZpZXJJZGVudGlmaWVyIik7CiAgICAgICAgaWYgKHF1YWxpZmllZElkZW50aWZpZXIgIT0gbnVsbCkgcmV0dXJuIHF1YWxpZmllZElkZW50aWZpZXI7CiAgICAgICAgcXVhbGlmaWVkSWRlbnRpZmllciA9IHNlcXVlbmNlKCI8cXVhbGlmaWVkSWRlbnRpZmllcj4iKTsKICAgICAgICBxdWFsaWZpZWRJZGVudGlmaWVyLmFkZChpZGVudGlmaWVyKCkpOwogICAgICAgIHF1YWxpZmllZElkZW50aWZpZXIuYWRkKHJlcGV0aXRpb24oCiAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UoIjxxdWFsaWZpZWRJZGVudGlmaWVyJDE+IikKICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCcuJykpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoaWRlbnRpZmllcigpKQogICAgICAgICAgICApKTsKICAgICAgICByZXR1cm4gcXVhbGlmaWVkSWRlbnRpZmllcjsKICAgIH0KCiAgICAvKiogTGl0ZXJhbDoKICAgICAqICAgICAgSW50ZWdlckxpdGVyYWwKICAgICAqICAgICAgRmxvYXRpbmdQb2ludExpdGVyYWwKICAgICAqICAgICAgQ2hhcmFjdGVyTGl0ZXJhbAogICAgICogICAgICBTdHJpbmdMaXRlcmFsCiAgICAgKiAgICAgIEJvb2xlYW5MaXRlcmFsCiAgICAgKiAgICAgIE51bGxMaXRlcmFsCiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgbGl0ZXJhbCgpIHsKICAgICAgICBsb2coImxpdGVyYWwiKTsKICAgICAgICBpZiAobGl0ZXJhbCAhPSBudWxsKSByZXR1cm4gbGl0ZXJhbDsKICAgICAgICBsaXRlcmFsID0gYWx0ZXJuYXRpb24oIjxsaXRlcmFsPiIpOwogICAgICAgIGxpdGVyYWwuYWRkKGludGVnZXJMaXRlcmFsKCkpOwogICAgICAgIGxpdGVyYWwuYWRkKGZsb2F0aW5nUG9pbnRMaXRlcmFsKCkpOwogICAgICAgIGxpdGVyYWwuYWRkKGNoYXJhY3RlckxpdGVyYWwoKSk7CiAgICAgICAgbGl0ZXJhbC5hZGQoc3RyaW5nTGl0ZXJhbCgpKTsKICAgICAgICBsaXRlcmFsLmFkZChib29sZWFuTGl0ZXJhbCgpKTsKICAgICAgICBsaXRlcmFsLmFkZChudWxsTGl0ZXJhbCgpKTsKICAgICAgICByZXR1cm4gbGl0ZXJhbDsKICAgIH0KCiAgICAvKiogRXhwcmVzc2lvbjoKICAgICAqICAgICAgRXhwcmVzc2lvbjEgW0Fzc2lnbm1lbnRPcGVyYXRvciBFeHByZXNzaW9uMV0KICAgICAqLwogICAgcHVibGljIFBhcnNlciBleHByZXNzaW9uKCkgewogICAgICAgIGxvZygiZXhwcmVzc2lvbiIpOwogICAgICAgIGlmIChleHByZXNzaW9uICE9IG51bGwpIHJldHVybiBleHByZXNzaW9uOwogICAgICAgIGV4cHJlc3Npb24gPSBzZXF1ZW5jZSgiPGV4cHJlc3Npb24+Iik7CiAgICAgICAgZXhwcmVzc2lvbi5hZGQoZXhwcmVzc2lvbjEoKSk7CiAgICAgICAgZXhwcmVzc2lvbi5hZGQoemVyb09yT25lKAogICAgICAgICAgICAgICAgc2VxdWVuY2UoIjxleHByZXNzaW9uJDE+IikKICAgICAgICAgICAgICAgICAgICAuYWRkKGFzc2lnbm1lbnRPcGVyYXRvcigpKQogICAgICAgICAgICAgICAgICAgIC5hZGQoZXhwcmVzc2lvbjEoKSkKICAgICAgICAgICAgKSk7CiAgICAgICAgcmV0dXJuIGV4cHJlc3Npb247CiAgICB9CgoKICAgIC8qKiBBc3NpZ25tZW50T3BlcmF0b3I6CiAgICAgKiAgICAgID0KICAgICAqICAgICAgKz0KICAgICAqICAgICAgLT0KICAgICAqICAgICAgKj0KICAgICAqICAgICAgLz0KICAgICAqICAgICAgJj0KICAgICAqICAgICAgfD0KICAgICAqICAgICAgXj0KICAgICAqICAgICAgJT0KICAgICAqICAgICAgPDw9CiAgICAgKiAgICAgID4+PQogICAgICogICAgICA+Pj49CiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgYXNzaWdubWVudE9wZXJhdG9yKCkgewogICAgICAgIGxvZygiYXNzaWdubWVudE9wZXJhdG9yIik7CiAgICAgICAgaWYgKGFzc2lnbm1lbnRPcGVyYXRvciAhPSBudWxsKSByZXR1cm4gYXNzaWdubWVudE9wZXJhdG9yOwogICAgICAgIGFzc2lnbm1lbnRPcGVyYXRvciA9IGFsdGVybmF0aW9uKCI8YXNzaWdubWVudE9wZXJhdG9yPiIpOwogICAgICAgIGFzc2lnbm1lbnRPcGVyYXRvci5hZGQobmV3IFN5bWJvbCgiPSIpKTsKICAgICAgICBhc3NpZ25tZW50T3BlcmF0b3IuYWRkKG5ldyBTeW1ib2woIis9IikpOwogICAgICAgIGFzc2lnbm1lbnRPcGVyYXRvci5hZGQobmV3IFN5bWJvbCgiLT0iKSk7CiAgICAgICAgYXNzaWdubWVudE9wZXJhdG9yLmFkZChuZXcgU3ltYm9sKCIqPSIpKTsKICAgICAgICBhc3NpZ25tZW50T3BlcmF0b3IuYWRkKG5ldyBTeW1ib2woIi89IikpOwogICAgICAgIGFzc2lnbm1lbnRPcGVyYXRvci5hZGQobmV3IFN5bWJvbCgiJj0iKSk7CiAgICAgICAgYXNzaWdubWVudE9wZXJhdG9yLmFkZChuZXcgU3ltYm9sKCJ8PSIpKTsKICAgICAgICBhc3NpZ25tZW50T3BlcmF0b3IuYWRkKG5ldyBTeW1ib2woIl49IikpOwogICAgICAgIGFzc2lnbm1lbnRPcGVyYXRvci5hZGQobmV3IFN5bWJvbCgiJT0iKSk7CiAgICAgICAgYXNzaWdubWVudE9wZXJhdG9yLmFkZChuZXcgU3ltYm9sKCI8PD0iKSk7CiAgICAgICAgYXNzaWdubWVudE9wZXJhdG9yLmFkZChuZXcgU3ltYm9sKCI+Pj0iKSk7CiAgICAgICAgYXNzaWdubWVudE9wZXJhdG9yLmFkZChuZXcgU3ltYm9sKCI+Pj49IikpOwogICAgICAgIHJldHVybiBhc3NpZ25tZW50T3BlcmF0b3I7CiAgICB9CgogICAgLyoqIFR5cGU6CiAgICAgKiAgICAgIElkZW50aWZpZXIgW1R5cGVBcmd1bWVudHNdeyAuICAgSWRlbnRpZmllciBbVHlwZUFyZ3VtZW50c119IEJyYWNrZXRzT3B0CiAgICAgKiAgICAgIEJhc2ljVHlwZQogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIHR5cGUoKSB7CiAgICAgICAgbG9nKCJ0eXBlIik7CiAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgcmV0dXJuIHR5cGU7CiAgICAgICAgdHlwZSA9IGFsdGVybmF0aW9uKCI8dHlwZT4iKTsKICAgICAgICB0eXBlLmFkZChzZXF1ZW5jZSgiPHR5cGUkMT4iKQogICAgICAgICAgICAgICAgLmFkZChpZGVudGlmaWVyKCkpCiAgICAgICAgICAgICAgICAuYWRkKHplcm9Pck9uZSh0eXBlQXJndW1lbnRzKCkpKQogICAgICAgICAgICAgICAgLmFkZChyZXBldGl0aW9uKAogICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlKCI8dHlwZSQyPiIpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgiLiIpKQogICAgICAgICAgICAgICAgICAgICAgICAuYWRkKGlkZW50aWZpZXIoKSkKICAgICAgICAgICAgICAgICAgICAgICAgLmFkZCh6ZXJvT3JPbmUodHlwZUFyZ3VtZW50cygpKSkKICAgICAgICAgICAgICAgICkpCiAgICAgICAgICAgICAgICAuYWRkKGJyYWNrZXRzT3B0KCkpCiAgICAgICAgICAgICk7CiAgICAgICAgdHlwZS5hZGQoYmFzaWNUeXBlKCkpOwogICAgICAgIHJldHVybiB0eXBlOwogICAgfQoKICAgIC8qKiBUeXBlQXJndW1lbnRzOgogICAgICogICAgICA8IFR5cGVBcmd1bWVudCB7LCBUeXBlQXJndW1lbnR9PgogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIHR5cGVBcmd1bWVudHMoKSB7CiAgICAgICAgbG9nKCJ0eXBlQXJndW1lbnRzIik7CiAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMgIT0gbnVsbCkgcmV0dXJuIHR5cGVBcmd1bWVudHM7CiAgICAgICAgdHlwZUFyZ3VtZW50cyA9IHNlcXVlbmNlKCI8dHlwZUFyZ3VtZW50cz4iKTsKICAgICAgICB0eXBlQXJndW1lbnRzLmFkZChuZXcgU3ltYm9sKCI8IikpOwogICAgICAgIHR5cGVBcmd1bWVudHMuYWRkKHR5cGVBcmd1bWVudCgpKTsKICAgICAgICB0eXBlQXJndW1lbnRzLmFkZChyZXBldGl0aW9uKAogICAgICAgICAgICAgICAgc2VxdWVuY2UoIjx0eXBlQXJndW1lbnRzJDE+IikKICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woIiwiKSkKICAgICAgICAgICAgICAgICAgICAuYWRkKHR5cGVBcmd1bWVudCgpKQogICAgICAgICAgICApKTsKICAgICAgICByZXR1cm4gdHlwZUFyZ3VtZW50czsKICAgIH0KCiAgICAvKiogVHlwZUFyZ3VtZW50OgogICAgICogICAgICBUeXBlCiAgICAgKiAgICAgID8gWyhleHRlbmRzIHxzdXBlciApIFR5cGVdCiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgdHlwZUFyZ3VtZW50KCkgewogICAgICAgIGxvZygidHlwZUFyZ3VtZW50Iik7CiAgICAgICAgaWYgKHR5cGVBcmd1bWVudCAhPSBudWxsKSByZXR1cm4gdHlwZUFyZ3VtZW50OwogICAgICAgIHR5cGVBcmd1bWVudCA9IGFsdGVybmF0aW9uKCI8dHlwZUFyZ3VtZW50PiIpOwogICAgICAgIHR5cGVBcmd1bWVudC5hZGQodHlwZSgpKTsKICAgICAgICB0eXBlQXJndW1lbnQuYWRkKHNlcXVlbmNlKCI8dHlwZUFyZ3VtZW50JDE+IikKICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgiPyIpKQogICAgICAgICAgICAgICAgLmFkZCh6ZXJvT3JPbmUoCiAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UoIjx0eXBlQXJndW1lbnQkMj4iKQogICAgICAgICAgICAgICAgICAgICAgICAuYWRkKGFsdGVybmF0aW9uKCI8dHlwZUFyZ3VtZW50JGE+IikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQobmV3IExpdGVyYWwoImV4dGVuZHMiKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQobmV3IExpdGVyYWwoInN1cGVyIikpCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgLmFkZCh0eXBlKCkpCiAgICAgICAgICAgICAgICApKQogICAgICAgICAgICApCiAgICAgICAgOwogICAgICAgIHJldHVybiB0eXBlQXJndW1lbnQ7CiAgICB9CgogICAgLyoqIFJhd1R5cGU6CiAgICAgKiAgICAgIElkZW50aWZpZXIgeyAuICAgSWRlbnRpZmllciB9IEJyYWNrZXRzT3B0CiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgcmF3VHlwZSgpIHsKICAgICAgICBsb2coInJhd1R5cGUiKTsKICAgICAgICBpZiAocmF3VHlwZSAhPSBudWxsKSByZXR1cm4gcmF3VHlwZTsKICAgICAgICByYXdUeXBlID0gc2VxdWVuY2UoIjxyYXdUeXBlPiIpOwogICAgICAgIHJhd1R5cGUuYWRkKGlkZW50aWZpZXIoKSk7CiAgICAgICAgcmF3VHlwZS5hZGQocmVwZXRpdGlvbigKICAgICAgICAgICAgICAgIHNlcXVlbmNlKCI8cmF3VHlwZSQxPiIpCiAgICAgICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCIuIikpCiAgICAgICAgICAgICAgICAgICAgLmFkZChpZGVudGlmaWVyKCkpCiAgICAgICAgICAgICkpOwogICAgICAgIHJhd1R5cGUuYWRkKGJyYWNrZXRzT3B0KCkpOwogICAgICAgIHJldHVybiByYXdUeXBlOwogICAgfQoKICAgIC8qKiBTdGF0ZW1lbnRFeHByZXNzaW9uOgogICAgICogICAgICBFeHByZXNzaW9uCiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgc3RhdGVtZW50RXhwcmVzc2lvbigpIHsKICAgICAgICBsb2coInN0YXRlbWVudEV4cHJlc3Npb24iKTsKICAgICAgICBpZiAoc3RhdGVtZW50RXhwcmVzc2lvbiAhPSBudWxsKSByZXR1cm4gc3RhdGVtZW50RXhwcmVzc2lvbjsKICAgICAgICBzdGF0ZW1lbnRFeHByZXNzaW9uID0gZXhwcmVzc2lvbigpOwogICAgICAgIHJldHVybiBzdGF0ZW1lbnRFeHByZXNzaW9uOwogICAgfQoKICAgIC8qKiBDb25zdGFudEV4cHJlc3Npb246CiAgICAgKiAgICAgIEV4cHJlc3Npb24KICAgICAqLwogICAgcHVibGljIFBhcnNlciBjb25zdGFudEV4cHJlc3Npb24oKSB7CiAgICAgICAgbG9nKCJjb25zdGFudEV4cHJlc3Npb24iKTsKICAgICAgICBpZiAoY29uc3RhbnRFeHByZXNzaW9uICE9IG51bGwpIHJldHVybiBjb25zdGFudEV4cHJlc3Npb247CiAgICAgICAgY29uc3RhbnRFeHByZXNzaW9uID0gZXhwcmVzc2lvbigpOwogICAgICAgIHJldHVybiBjb25zdGFudEV4cHJlc3Npb247CiAgICB9CgogICAgLyoqIEV4cHJlc3Npb24xOgogICAgICogICAgICBFeHByZXNzaW9uMiBbRXhwcmVzc2lvbjFSZXN0XQogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIGV4cHJlc3Npb24xKCkgewogICAgICAgIGxvZygiZXhwcmVzc2lvbjEiKTsKICAgICAgICBpZiAoZXhwcmVzc2lvbjEgIT0gbnVsbCkgcmV0dXJuIGV4cHJlc3Npb24xOwogICAgICAgIGV4cHJlc3Npb24xID0gc2VxdWVuY2UoIjxleHByZXNzaW9uMT4iKTsKICAgICAgICBleHByZXNzaW9uMS5hZGQoZXhwcmVzc2lvbjIoKSk7CiAgICAgICAgZXhwcmVzc2lvbjEuYWRkKHplcm9Pck9uZShleHByZXNzaW9uMVJlc3QoKSkpOwogICAgICAgIHJldHVybiBleHByZXNzaW9uMTsKICAgIH0KCiAgICAvKiogRXhwcmVzc2lvbjFSZXN0OgogICAgICogICAgICBbID8gICBFeHByZXNzaW9uIDogICBFeHByZXNzaW9uMV0KICAgICAqLwogICAgcHVibGljIFBhcnNlciBleHByZXNzaW9uMVJlc3QoKSB7CiAgICAgICAgbG9nKCJleHByZXNzaW9uMVJlc3QiKTsKICAgICAgICBpZiAoZXhwcmVzc2lvbjFSZXN0ICE9IG51bGwpIHJldHVybiBleHByZXNzaW9uMVJlc3Q7CiAgICAgICAgZXhwcmVzc2lvbjFSZXN0ID0gemVyb09yT25lKAogICAgICAgICAgICBzZXF1ZW5jZSgiPGV4cHJlc3Npb24xUmVzdCQxPiIpCiAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woIj8iKSkKICAgICAgICAgICAgICAgIC5hZGQoZXhwcmVzc2lvbigpKQogICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCI6IikpCiAgICAgICAgICAgICAgICAuYWRkKGV4cHJlc3Npb24xKCkpCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjFSZXN0OwogICAgfQoKICAgIC8qKiBFeHByZXNzaW9uMiA6CiAgICAgKiAgICAgIEV4cHJlc3Npb24zIFtFeHByZXNzaW9uMlJlc3RdCiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgZXhwcmVzc2lvbjIoKSB7CiAgICAgICAgbG9nKCJleHByZXNzaW9uMiIpOwogICAgICAgIGlmIChleHByZXNzaW9uMiAhPSBudWxsKSByZXR1cm4gZXhwcmVzc2lvbjI7CiAgICAgICAgZXhwcmVzc2lvbjIgPSBzZXF1ZW5jZSgiPGV4cHJlc3Npb24yPiIpOwogICAgICAgIGV4cHJlc3Npb24yLmFkZChleHByZXNzaW9uMygpKTsKICAgICAgICBleHByZXNzaW9uMi5hZGQoemVyb09yT25lKGV4cHJlc3Npb24yUmVzdCgpKSk7CiAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24yOwogICAgfQoKICAgIC8qKiBFeHByZXNzaW9uMlJlc3Q6CiAgICAgKiAgICAgIHtJbmZpeG9wIEV4cHJlc3Npb24zfQogICAgICogICAgICBFeHByZXNzaW9uMyBpbnN0YW5jZW9mIFR5cGUKICAgICAqLwogICAgcHVibGljIFBhcnNlciBleHByZXNzaW9uMlJlc3QoKSB7CiAgICAgICAgbG9nKCJleHByZXNzaW9uMlJlc3QiKTsKICAgICAgICBpZiAoZXhwcmVzc2lvbjJSZXN0ICE9IG51bGwpIHJldHVybiBleHByZXNzaW9uMlJlc3Q7CiAgICAgICAgZXhwcmVzc2lvbjJSZXN0ID0gYWx0ZXJuYXRpb24oIjxleHByZXNzaW9uMlJlc3QkYT4iKTsKICAgICAgICBleHByZXNzaW9uMlJlc3QuYWRkKHJlcGV0aXRpb24oCiAgICAgICAgICAgICAgICBzZXF1ZW5jZSgiPGV4cHJlc3Npb24yUmVzdCQxPiIpCiAgICAgICAgICAgICAgICAgICAgLmFkZChpbmZpeE9wKCkpCiAgICAgICAgICAgICAgICAgICAgLmFkZChleHByZXNzaW9uMygpKQogICAgICAgICAgICApKTsKICAgICAgICBleHByZXNzaW9uMlJlc3QuYWRkKHNlcXVlbmNlKCI8ZXhwcmVzc2lvbjJSZXN0JDI+IikKICAgICAgICAgICAgICAgIC5hZGQoZXhwcmVzc2lvbjMoKSkKICAgICAgICAgICAgICAgIC5hZGQobmV3IExpdGVyYWwoImluc3RhbmNlb2YiKSkKICAgICAgICAgICAgICAgIC5hZGQodHlwZSgpKQogICAgICAgICAgICApOwogICAgICAgIHJldHVybiBleHByZXNzaW9uMlJlc3Q7CiAgICB9CgogICAgLyoqIEluZml4b3A6CiAgICAgKiAgICAgIHx8CiAgICAgKiAgICAgICYmCiAgICAgKiAgICAgIHwKICAgICAqICAgICAgXgogICAgICogICAgICAmCiAgICAgKiAgICAgID09CiAgICAgKiAgICAgICE9CiAgICAgKiAgICAgIDwKICAgICAqICAgICAgPgogICAgICogICAgICA8PQogICAgICogICAgICA+PQogICAgICogICAgICA8PAogICAgICogICAgICA+PgogICAgICogICAgICA+Pj4KICAgICAqICAgICAgKwogICAgICogICAgICAqCiAgICAgKiAgICAgIC8KICAgICAqICAgICAgJQogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIGluZml4T3AoKSB7CiAgICAgICAgbG9nKCJpbmZpeE9wIik7CiAgICAgICAgaWYgKGluZml4T3AgIT0gbnVsbCkgcmV0dXJuIGluZml4T3A7CiAgICAgICAgaW5maXhPcCA9IGFsdGVybmF0aW9uKCI8aW5maXhPcD4iKTsKICAgICAgICBpbmZpeE9wLmFkZChuZXcgU3ltYm9sKCJ8fCIpKTsKICAgICAgICBpbmZpeE9wLmFkZChuZXcgU3ltYm9sKCImJiIpKTsKICAgICAgICBpbmZpeE9wLmFkZChuZXcgU3ltYm9sKCJ8IikpOwogICAgICAgIGluZml4T3AuYWRkKG5ldyBTeW1ib2woIl4iKSk7CiAgICAgICAgaW5maXhPcC5hZGQobmV3IFN5bWJvbCgiJiIpKTsKICAgICAgICBpbmZpeE9wLmFkZChuZXcgU3ltYm9sKCI9PSIpKTsKICAgICAgICBpbmZpeE9wLmFkZChuZXcgU3ltYm9sKCIhPSIpKTsKICAgICAgICBpbmZpeE9wLmFkZChuZXcgU3ltYm9sKCI8IikpOwogICAgICAgIGluZml4T3AuYWRkKG5ldyBTeW1ib2woIj4iKSk7CiAgICAgICAgaW5maXhPcC5hZGQobmV3IFN5bWJvbCgiPD0iKSk7CiAgICAgICAgaW5maXhPcC5hZGQobmV3IFN5bWJvbCgiPj0iKSk7CiAgICAgICAgaW5maXhPcC5hZGQobmV3IFN5bWJvbCgiPDwiKSk7CiAgICAgICAgaW5maXhPcC5hZGQobmV3IFN5bWJvbCgiPj4iKSk7CiAgICAgICAgaW5maXhPcC5hZGQobmV3IFN5bWJvbCgiPj4+IikpOwogICAgICAgIGluZml4T3AuYWRkKG5ldyBTeW1ib2woIisiKSk7CiAgICAgICAgaW5maXhPcC5hZGQobmV3IFN5bWJvbCgiKiIpKTsKICAgICAgICBpbmZpeE9wLmFkZChuZXcgU3ltYm9sKCIvIikpOwogICAgICAgIGluZml4T3AuYWRkKG5ldyBTeW1ib2woIiUiKSk7CiAgICAgICAgcmV0dXJuIGluZml4T3A7CiAgICB9CgogICAgLyoqIEV4cHJlc3Npb24zOgogICAgICogICAgICBQcmVmaXhPcCBFeHByZXNzaW9uMwogICAgICogICAgICAoICAgKEV4cHJ8VHlwZSkgKSAgIEV4cHJlc3Npb24zCiAgICAgKiAgICAgIFByaW1hcnkge1NlbGVjdG9yfSB7UG9zdGZpeE9wfQogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIGV4cHJlc3Npb24zKCkgewogICAgICAgIGxvZygiZXhwcmVzc2lvbjMiKTsKICAgICAgICBpZiAoZXhwcmVzc2lvbjMgIT0gbnVsbCkgcmV0dXJuIGV4cHJlc3Npb24zOwogICAgICAgIGV4cHJlc3Npb24zID0gYWx0ZXJuYXRpb24oIjxleHByZXNzaW9uMz4iKTsKICAgICAgICBleHByZXNzaW9uMy5hZGQoc2VxdWVuY2UoIjxleHByZXNzaW9uMyQxPiIpCiAgICAgICAgICAgICAgICAuYWRkKHByZWZpeE9wKCkpCiAgICAgICAgICAgICAgICAuYWRkKGV4cHJlc3Npb24zKCkpCiAgICAgICAgICAgICk7CiAgICAgICAgZXhwcmVzc2lvbjMuYWRkKHNlcXVlbmNlKCI8ZXhwcmVzc2lvbjMkMj4iKQogICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCIoIikpCiAgICAgICAgICAgICAgICAuYWRkKGFsdGVybmF0aW9uKCI8ZXhwcmVzc2lvbjMkYSIpCiAgICAgICAgICAgICAgICAgICAgLmFkZChleHByKCkpCiAgICAgICAgICAgICAgICAgICAgLmFkZCh0eXBlKCkpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woIikiKSkKICAgICAgICAgICAgICAgIC5hZGQoZXhwcmVzc2lvbjMoKSkKICAgICAgICAgICAgKTsKICAgICAgICBleHByZXNzaW9uMy5hZGQoc2VxdWVuY2UoIjxleHByZXNzaW9uMyQzPiIpCiAgICAgICAgICAgICAgICAuYWRkKHByaW1hcnkoKSkKICAgICAgICAgICAgICAgIC5hZGQocmVwZXRpdGlvbihzZWxlY3RvcigpKSkKICAgICAgICAgICAgICAgIC5hZGQocmVwZXRpdGlvbihwb3N0Zml4T3AoKSkpCiAgICAgICAgICAgICk7CiAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24zOwogICAgfQoKICAgIC8qKiBQcmltYXJ5OgogICAgICogICAgICAoIEV4cHJlc3Npb24pCiAgICAgKiAgICAgIE5vbldpbGRjYXJkVHlwZUFyZ3VtZW50cyAoRXhwbGljaXRHZW5lcmljSW52b2NhdGlvblN1ZmZpeCB8dGhpcyBBcmd1bWVudHMpCiAgICAgKiAgICAgIHRoaXMgW0FyZ3VtZW50c10KICAgICAqICAgICAgc3VwZXIgU3VwZXJTdWZmaXgKICAgICAqICAgICAgTGl0ZXJhbAogICAgICogICAgICBuZXcgQ3JlYXRvcgogICAgICogICAgICBJZGVudGlmaWVyIHsuIElkZW50aWZpZXIgfVsgSWRlbnRpZmllclN1ZmZpeF0KICAgICAqICAgICAgQmFzaWNUeXBlIEJyYWNrZXRzT3B0LmNsYXNzCiAgICAgKiAgICAgIHZvaWQuY2xhc3MKICAgICAqLwogICAgcHVibGljIFBhcnNlciBwcmltYXJ5KCkgewogICAgICAgIGxvZygicHJpbWFyeSIpOwogICAgICAgIGlmIChwcmltYXJ5ICE9IG51bGwpIHJldHVybiBwcmltYXJ5OwogICAgICAgIHByaW1hcnkgPSBhbHRlcm5hdGlvbigiPHByaW1hcnk+Iik7CiAgICAgICAgICAgIC8vICggRXhwcmVzc2lvbikKICAgICAgICAgICAgcHJpbWFyeS5hZGQoc2VxdWVuY2UoIjxwcmltYXJ5JDE+IikKICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgiKCIpKQogICAgICAgICAgICAgICAgLmFkZChleHByZXNzaW9uKCkpCiAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woIikiKSkKICAgICAgICAgICAgKTsKICAgICAgICAgICAgLy8gTm9uV2lsZGNhcmRUeXBlQXJndW1lbnRzIChFeHBsaWNpdEdlbmVyaWNJbnZvY2F0aW9uU3VmZml4IHx0aGlzIEFyZ3VtZW50cykKICAgICAgICAgICAgcHJpbWFyeS5hZGQoc2VxdWVuY2UoIjxwcmltYXJ5JDI+IikKICAgICAgICAgICAgICAgIC5hZGQobm9uV2lsZGNhcmRUeXBlQXJndW1lbnRzKCkpCiAgICAgICAgICAgICAgICAuYWRkKGFsdGVybmF0aW9uKCI8cHJpbWFyeSRhPiIpCiAgICAgICAgICAgICAgICAgICAgLmFkZChleHBsaWNpdEdlbmVyaWNJbnZvY2F0aW9uU3VmZml4KCkpCiAgICAgICAgICAgICAgICAgICAgLmFkZChuZXcgTGl0ZXJhbCgidGhpcyIpKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApOwogICAgICAgICAgICAvLyB0aGlzIFtBcmd1bWVudHNdCiAgICAgICAgICAgIHByaW1hcnkuYWRkKHNlcXVlbmNlKCI8cHJpbWFyeSQzPiIpCiAgICAgICAgICAgICAgICAuYWRkKG5ldyBMaXRlcmFsKCJ0aGlzIikpCiAgICAgICAgICAgICAgICAuYWRkKHplcm9Pck9uZShhcmd1bWVudHMoKSkpCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIC8vIHN1cGVyIFN1cGVyU3VmZml4CiAgICAgICAgICAgIHByaW1hcnkuYWRkKHNlcXVlbmNlKCI8cHJpbWFyeSQ0PiIpCiAgICAgICAgICAgICAgICAuYWRkKG5ldyBMaXRlcmFsKCJ0aGlzIikpCiAgICAgICAgICAgICAgICAuYWRkKHN1cGVyU3VmZml4KCkpCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIC8vIExpdGVyYWwKICAgICAgICAgICAgcHJpbWFyeS5hZGQobGl0ZXJhbCgpKTsKICAgICAgICAgICAgLy8gbmV3IENyZWF0b3IKICAgICAgICAgICAgcHJpbWFyeS5hZGQoc2VxdWVuY2UoIjxwcmltYXJ5JDU+IikKICAgICAgICAgICAgICAgIC5hZGQobmV3IExpdGVyYWwoIm5ldyIpKQogICAgICAgICAgICAgICAgLmFkZChjcmVhdG9yKCkpCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIC8vIElkZW50aWZpZXIgey4gSWRlbnRpZmllciB9WyBJZGVudGlmaWVyU3VmZml4XQogICAgICAgICAgICBwcmltYXJ5LmFkZChzZXF1ZW5jZSgiPHByaW1hcnkkNj4iKQogICAgICAgICAgICAgICAgLmFkZChpZGVudGlmaWVyKCkpCiAgICAgICAgICAgICAgICAuYWRkKHJlcGV0aXRpb24oc2VxdWVuY2UoIjxwcmltYXJ5JDc+IikKICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJy4nKSkKICAgICAgICAgICAgICAgICAgICAuYWRkKGlkZW50aWZpZXIoKSkKICAgICAgICAgICAgICAgICkpCiAgICAgICAgICAgICAgICAuYWRkKHplcm9Pck9uZShpZGVudGlmaWVyU3VmZml4KCkpKQogICAgICAgICAgICApOwogICAgICAgICAgICAvLyBCYXNpY1R5cGUgQnJhY2tldHNPcHQuY2xhc3MKICAgICAgICAgICAgcHJpbWFyeS5hZGQoc2VxdWVuY2UoIjxwcmltYXJ5JDg+IikKICAgICAgICAgICAgICAgIC5hZGQoYmFzaWNUeXBlKCkpCiAgICAgICAgICAgICAgICAuYWRkKGJyYWNrZXRzT3B0KCkpCiAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJy4nKSkKICAgICAgICAgICAgICAgIC5hZGQobmV3IExpdGVyYWwoImNsYXNzIikpCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIC8vIHZvaWQuY2xhc3MKICAgICAgICAgICAgcHJpbWFyeS5hZGQoc2VxdWVuY2UoIjxwcmltYXJ5JDk+IikKICAgICAgICAgICAgICAgIC5hZGQobmV3IExpdGVyYWwoInZvaWQiKSkKICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgiLiIpKQogICAgICAgICAgICAgICAgLmFkZChuZXcgTGl0ZXJhbCgiY2xhc3MiKSkKICAgICAgICAgICAgKTsKICAgICAgICByZXR1cm4gcHJpbWFyeTsKICAgIH0KCiAgICAvKiogSWRlbnRpZmllclN1ZmZpeDoKICAgICAqICAgICAgWyAoXSBCcmFja2V0c09wdCAgIC4gY2xhc3MgfCBFeHByZXNzaW9uXSkKICAgICAqICAgICAgQXJndW1lbnRzCiAgICAgKiAgICAgIC4gICAoY2xhc3MgfCBFeHBsaWNpdEdlbmVyaWNJbnZvY2F0aW9uIHx0aGlzIHxzdXBlciBBcmd1bWVudHMgfG5ldyBbTm9uV2lsZGNhcmRUeXBlQXJndW1lbnRzXSBJbm5lckNyZWF0b3IgKQogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIGlkZW50aWZpZXJTdWZmaXgoKSB7CiAgICAgICAgbG9nKCJpZGVudGlmaWVyU3VmZml4Iik7CiAgICAgICAgaWYgKGlkZW50aWZpZXJTdWZmaXggIT0gbnVsbCkgcmV0dXJuIGlkZW50aWZpZXJTdWZmaXg7CiAgICAgICAgaWRlbnRpZmllclN1ZmZpeCA9IGFsdGVybmF0aW9uKCI8aWRlbnRpZmllclN1ZmZpeD4iKTsKCiAgICAgICAgICAgICAgICAvLyBbIChdIEJyYWNrZXRzT3B0ICAgLiBjbGFzcyB8IEV4cHJlc3Npb25dKQogICAgICAgICAgICAgICAgaWRlbnRpZmllclN1ZmZpeC5hZGQoc2VxdWVuY2UoIjxpZGVudGlmaWVyU3VmZml4JDE+IikKICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCdbJykpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoYWx0ZXJuYXRpb24oIjxpZGVudGlmaWVyU3VmZml4JGEiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChzZXF1ZW5jZSgiPGlkZW50aWZpZXJTdWZmaXgkMT4iKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnXScpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoYnJhY2tldHNPcHQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJy4nKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBMaXRlcmFsKCJjbGFzcyIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChzZXF1ZW5jZSgiPGlkZW50aWZpZXJTdWZmaXgkMj4iKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoZXhwcmVzc2lvbigpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnXScpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIC8vIEFyZ3VtZW50cwogICAgICAgICAgICAgICAgaWRlbnRpZmllclN1ZmZpeC5hZGQoYXJndW1lbnRzKCkpOwoKICAgICAgICAgICAgICAgIC8vIC4gICAoY2xhc3MgfCBFeHBsaWNpdEdlbmVyaWNJbnZvY2F0aW9uIHx0aGlzIHxzdXBlciBBcmd1bWVudHMgfG5ldyBbTm9uV2lsZGNhcmRUeXBlQXJndW1lbnRzXSBJbm5lckNyZWF0b3IgKQogICAgICAgICAgICAgICAgaWRlbnRpZmllclN1ZmZpeC5hZGQoc2VxdWVuY2UoIjxpZGVudGlmaWVyU3VmZml4JDM+IikKICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJy4nKSkKICAgICAgICAgICAgICAgICAgICAuYWRkKGFsdGVybmF0aW9uKCI8aWRlbnRpZmllcnlTdWZmaXgkYT4iKQogICAgICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBMaXRlcmFsKCJjbGFzcyIpKQogICAgICAgICAgICAgICAgICAgICAgICAuYWRkKGV4cGxpY2l0R2VuZXJpY0ludm9jYXRpb24oKSkKICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChuZXcgTGl0ZXJhbCgidGhpcyIpKQogICAgICAgICAgICAgICAgICAgICAgICAuYWRkKHNlcXVlbmNlKCI8aWRlbnRpZmllclN1ZmZpeCQ0PiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBMaXRlcmFsKCJzdXBlciIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChhcmd1bWVudHMoKSkKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAuYWRkKHNlcXVlbmNlKCI8aWRlbnRpZmllclN1ZmZpeCQ1PiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBMaXRlcmFsKCJuZXciKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoemVyb09yT25lKG5vbldpbGRjYXJkVHlwZUFyZ3VtZW50cygpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoaW5uZXJDcmVhdG9yKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApOwogICAgICAgIHJldHVybiBpZGVudGlmaWVyU3VmZml4OwogICAgfQoKICAgIC8qKiBFeHBsaWNpdEdlbmVyaWNJbnZvY2F0aW9uOgogICAgICogICAgICBOb25XaWxkY2FyZFR5cGVBcmd1bWVudHMgRXhwbGljaXRHZW5lcmljSW52b2NhdGlvblN1ZmZpeAogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIGV4cGxpY2l0R2VuZXJpY0ludm9jYXRpb24oKSB7CiAgICAgICAgbG9nKCJleHBsaWNpdEdlbmVyaWNJbnZvY2F0aW9uIik7CiAgICAgICAgaWYgKGV4cGxpY2l0R2VuZXJpY0ludm9jYXRpb24gIT0gbnVsbCkgcmV0dXJuIGV4cGxpY2l0R2VuZXJpY0ludm9jYXRpb247CiAgICAgICAgZXhwbGljaXRHZW5lcmljSW52b2NhdGlvbiA9IHNlcXVlbmNlKCI8ZXhwbGljaXRHZW5lcmljSW52b2NhdGlvbj4iKTsKICAgICAgICBleHBsaWNpdEdlbmVyaWNJbnZvY2F0aW9uLmFkZChub25XaWxkY2FyZFR5cGVBcmd1bWVudHMoKSk7CiAgICAgICAgZXhwbGljaXRHZW5lcmljSW52b2NhdGlvbi5hZGQoZXhwbGljaXRHZW5lcmljSW52b2NhdGlvblN1ZmZpeCgpKTsKICAgICAgICByZXR1cm4gZXhwbGljaXRHZW5lcmljSW52b2NhdGlvbjsKICAgIH0KCiAgICAvKiogTm9uV2lsZGNhcmRUeXBlQXJndW1lbnRzOgogICAgICogICAgICA8IFR5cGVMaXN0PgogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIG5vbldpbGRjYXJkVHlwZUFyZ3VtZW50cygpIHsKICAgICAgICBsb2coIm5vbldpbGRjYXJkVHlwZUFyZ3VtZW50cyIpOwogICAgICAgIGlmIChub25XaWxkY2FyZFR5cGVBcmd1bWVudHMgIT0gbnVsbCkgcmV0dXJuIG5vbldpbGRjYXJkVHlwZUFyZ3VtZW50czsKICAgICAgICBub25XaWxkY2FyZFR5cGVBcmd1bWVudHMgPSBzZXF1ZW5jZSgiPG5vbldpbGRjYXJkVHlwZUFyZ3VtZW50cz4iKTsKICAgICAgICBub25XaWxkY2FyZFR5cGVBcmd1bWVudHMuYWRkKG5ldyBTeW1ib2woIjwiKSk7CiAgICAgICAgbm9uV2lsZGNhcmRUeXBlQXJndW1lbnRzLmFkZCh0eXBlTGlzdCgpKTsKICAgICAgICBub25XaWxkY2FyZFR5cGVBcmd1bWVudHMuYWRkKG5ldyBTeW1ib2woIj4iKSk7CiAgICAgICAgcmV0dXJuIG5vbldpbGRjYXJkVHlwZUFyZ3VtZW50czsKICAgIH0KCiAgICAvKiogRXhwbGljaXRHZW5lcmljSW52b2NhdGlvblN1ZmZpeDoKICAgICAqICAgICAgc3VwZXIgU3VwZXJTdWZmaXgKICAgICAqICAgICAgSWRlbnRpZmllciBBcmd1bWVudHMKICAgICAqLwogICAgcHVibGljIFBhcnNlciBleHBsaWNpdEdlbmVyaWNJbnZvY2F0aW9uU3VmZml4KCkgewogICAgICAgIGxvZygiZXhwbGljaXRHZW5lcmljSW52b2NhdGlvblN1ZmZpeCIpOwogICAgICAgIGlmIChleHBsaWNpdEdlbmVyaWNJbnZvY2F0aW9uU3VmZml4ICE9IG51bGwpIHJldHVybiBleHBsaWNpdEdlbmVyaWNJbnZvY2F0aW9uU3VmZml4OwogICAgICAgIGV4cGxpY2l0R2VuZXJpY0ludm9jYXRpb25TdWZmaXggPSBhbHRlcm5hdGlvbigiPGV4cGxpY2l0R2VuZXJpY0ludm9jYXRpb25TdWZmaXgkYT4iKTsKICAgICAgICAgICAgZXhwbGljaXRHZW5lcmljSW52b2NhdGlvblN1ZmZpeC5hZGQoc2VxdWVuY2UoIjxleHBsaWNpdEdlbmVyaWNJbnZvY2F0aW9uU3VmZml4JDE+IikKICAgICAgICAgICAgICAgIC5hZGQobmV3IExpdGVyYWwoInN1cGVyIikpCiAgICAgICAgICAgICAgICAuYWRkKHN1cGVyU3VmZml4KCkpKTsKICAgICAgICAgICAgZXhwbGljaXRHZW5lcmljSW52b2NhdGlvblN1ZmZpeC5hZGQoc2VxdWVuY2UoIjxleHBsaWNpdEdlbmVyaWNJbnZvY2F0aW9uU3VmZml4JDI+IikKICAgICAgICAgICAgICAgIC5hZGQoaWRlbnRpZmllcigpKQogICAgICAgICAgICAgICAgLmFkZChhcmd1bWVudHMoKSkKICAgICAgICAgICAgKTsKICAgICAgICByZXR1cm4gZXhwbGljaXRHZW5lcmljSW52b2NhdGlvblN1ZmZpeDsKICAgIH0KCiAgICAvKiogUHJlZml4T3A6CiAgICAgKiAgICAgICsrCiAgICAgKiAgICAgIC0tCiAgICAgKiAgICAgICEKICAgICAqICAgICAgfgogICAgICogICAgICArCiAgICAgKiAgICAgIC0KICAgICAqLwogICAgcHVibGljIFBhcnNlciBwcmVmaXhPcCgpIHsKICAgICAgICBsb2coInByZWZpeE9wIik7CiAgICAgICAgaWYgKHByZWZpeE9wICE9IG51bGwpIHJldHVybiBwcmVmaXhPcDsKICAgICAgICBwcmVmaXhPcCA9IGFsdGVybmF0aW9uKCI8cHJlZml4T3A+Iik7CiAgICAgICAgcHJlZml4T3AuYWRkKG5ldyBTeW1ib2woIisrIikpOwogICAgICAgIHByZWZpeE9wLmFkZChuZXcgU3ltYm9sKCItLSIpKTsKICAgICAgICBwcmVmaXhPcC5hZGQobmV3IFN5bWJvbCgnIScpKTsKICAgICAgICBwcmVmaXhPcC5hZGQobmV3IFN5bWJvbCgnficpKTsKICAgICAgICBwcmVmaXhPcC5hZGQobmV3IFN5bWJvbCgnKycpKTsKICAgICAgICBwcmVmaXhPcC5hZGQobmV3IFN5bWJvbCgnLScpKTsKICAgICAgICByZXR1cm4gcHJlZml4T3A7CiAgICB9CgogICAgLyoqIFBvc3RmaXhPcDoKICAgICAqICAgICAgKysKICAgICAqICAgICAgLS0KICAgICAqLwogICAgcHVibGljIFBhcnNlciBwb3N0Zml4T3AoKSB7CiAgICAgICAgbG9nKCJwb3N0Zml4T3AiKTsKICAgICAgICBpZiAocG9zdGZpeE9wICE9IG51bGwpIHJldHVybiBwb3N0Zml4T3A7CiAgICAgICAgcG9zdGZpeE9wID0gYWx0ZXJuYXRpb24oIjxwb3N0Zml4T3A+Iik7CiAgICAgICAgcG9zdGZpeE9wLmFkZChuZXcgU3ltYm9sKCIrKyIpKTsKICAgICAgICBwb3N0Zml4T3AuYWRkKG5ldyBTeW1ib2woIi0tIikpOwogICAgICAgIHJldHVybiBwb3N0Zml4T3A7CiAgICB9CgogICAgLyoqIFNlbGVjdG9yOgogICAgICogICAgICAuIElkZW50aWZpZXIgW0FyZ3VtZW50c10KICAgICAqICAgICAgLiBFeHBsaWNpdEdlbmVyaWNJbnZvY2F0aW9uCiAgICAgKiAgICAgIC50aGlzCiAgICAgKiAgICAgIC5zdXBlciBTdXBlclN1ZmZpeAogICAgICogICAgICAubmV3IFtOb25XaWxkY2FyZFR5cGVBcmd1bWVudHNdIElubmVyQ3JlYXRvcgogICAgICogICAgICBbIEV4cHJlc3Npb25dCiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgc2VsZWN0b3IoKSB7CiAgICAgICAgbG9nKCJzZWxlY3RvciIpOwogICAgICAgIGlmIChzZWxlY3RvciAhPSBudWxsKSByZXR1cm4gc2VsZWN0b3I7CiAgICAgICAgc2VsZWN0b3IgPSBhbHRlcm5hdGlvbigiPHNlbGVjdG9yPiIpOwogICAgICAgICAgICBzZWxlY3Rvci5hZGQoc2VxdWVuY2UoIjxzZWxlY3RvciQxPiIpCiAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJy4nKSkKICAgICAgICAgICAgICAgIC5hZGQoaWRlbnRpZmllcigpKQogICAgICAgICAgICAgICAgLmFkZCh6ZXJvT3JPbmUoYXJndW1lbnRzKCkpKQogICAgICAgICAgICApOwogICAgICAgICAgICBzZWxlY3Rvci5hZGQoc2VxdWVuY2UoIjxzZWxlY3RvciQyPiIpCiAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJy4nKSkKICAgICAgICAgICAgICAgIC5hZGQoZXhwbGljaXRHZW5lcmljSW52b2NhdGlvbigpKQogICAgICAgICAgICApOwogICAgICAgICAgICBzZWxlY3Rvci5hZGQoc2VxdWVuY2UoIjxzZWxlY3RvciQzPiIpCiAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJy4nKSkKICAgICAgICAgICAgICAgIC5hZGQobmV3IExpdGVyYWwoInRoaXMiKSkKICAgICAgICAgICAgKTsKICAgICAgICAgICAgc2VsZWN0b3IuYWRkKHNlcXVlbmNlKCI8c2VsZWN0b3IkND4iKQogICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCcuJykpCiAgICAgICAgICAgICAgICAuYWRkKG5ldyBMaXRlcmFsKCJzdXBlciIpKQogICAgICAgICAgICAgICAgLmFkZChzdXBlclN1ZmZpeCgpKQogICAgICAgICAgICApOwogICAgICAgICAgICBzZWxlY3Rvci5hZGQoc2VxdWVuY2UoIjxzZWxlY3RvciQ1PiIpCiAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJy4nKSkKICAgICAgICAgICAgICAgIC5hZGQobmV3IExpdGVyYWwoIm5ldyIpKQogICAgICAgICAgICAgICAgLmFkZCh6ZXJvT3JPbmUobm9uV2lsZGNhcmRUeXBlQXJndW1lbnRzKCkpKQogICAgICAgICAgICAgICAgLmFkZChpbm5lckNyZWF0b3IoKSkKICAgICAgICAgICAgKTsKICAgICAgICAgICAgc2VsZWN0b3IuYWRkKHNlcXVlbmNlKCI8c2VsZWN0b3IkNj4iKQogICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCdbJykpCiAgICAgICAgICAgICAgICAuYWRkKGV4cHJlc3Npb24oKSkKICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnXScpKQogICAgICAgICAgICApOwogICAgICAgIHJldHVybiBzZWxlY3RvcjsKICAgIH0KCiAgICAvKiogU3VwZXJTdWZmaXg6CiAgICAgKiAgICAgIEFyZ3VtZW50cwogICAgICogICAgICAuIElkZW50aWZpZXIgW0FyZ3VtZW50c10KICAgICAqLwogICAgcHVibGljIFBhcnNlciBzdXBlclN1ZmZpeCgpIHsKICAgICAgICBsb2coInN1cGVyU3VmZml4Iik7CiAgICAgICAgaWYgKHN1cGVyU3VmZml4ICE9IG51bGwpIHJldHVybiBzdXBlclN1ZmZpeDsKICAgICAgICBzdXBlclN1ZmZpeCA9IGFsdGVybmF0aW9uKCI8c3VwZXJTdWZmaXg+Iik7CiAgICAgICAgICAgIHN1cGVyU3VmZml4LmFkZChhcmd1bWVudHMoKSk7CiAgICAgICAgICAgIHN1cGVyU3VmZml4LmFkZChzZXF1ZW5jZSgiPHN1cGVyU3VmZml4JDE+IikKICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnLicpKQogICAgICAgICAgICAgICAgLmFkZChpZGVudGlmaWVyKCkpCiAgICAgICAgICAgICAgICAuYWRkKHplcm9Pck9uZShhcmd1bWVudHMoKSkpCiAgICAgICAgICAgICk7CiAgICAgICAgcmV0dXJuIHN1cGVyU3VmZml4OwogICAgfQoKICAgIC8qKiBCYXNpY1R5cGU6CiAgICAgKiAgICAgIGJ5dGUKICAgICAqICAgICAgc2hvcnQKICAgICAqICAgICAgY2hhcgogICAgICogICAgICBpbnQKICAgICAqICAgICAgbG9uZwogICAgICogICAgICBmbG9hdAogICAgICogICAgICBkb3VibGUKICAgICAqICAgICAgYm9vbGVhbgogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIGJhc2ljVHlwZSgpIHsKICAgICAgICBsb2coImJhc2ljVHlwZSIpOwogICAgICAgIGlmIChiYXNpY1R5cGUgIT0gbnVsbCkgcmV0dXJuIGJhc2ljVHlwZTsKICAgICAgICBiYXNpY1R5cGUgPSBhbHRlcm5hdGlvbigiPGJhc2ljVHlwZT4iKTsKICAgICAgICAgICAgYmFzaWNUeXBlLmFkZChuZXcgTGl0ZXJhbCgiYnl0ZSIpKTsKICAgICAgICAgICAgYmFzaWNUeXBlLmFkZChuZXcgTGl0ZXJhbCgic2hvcnQiKSk7CiAgICAgICAgICAgIGJhc2ljVHlwZS5hZGQobmV3IExpdGVyYWwoImNoYXIiKSk7CiAgICAgICAgICAgIGJhc2ljVHlwZS5hZGQobmV3IExpdGVyYWwoImludCIpKTsKICAgICAgICAgICAgYmFzaWNUeXBlLmFkZChuZXcgTGl0ZXJhbCgibG9uZyIpKTsKICAgICAgICAgICAgYmFzaWNUeXBlLmFkZChuZXcgTGl0ZXJhbCgiZmxvYXQiKSk7CiAgICAgICAgICAgIGJhc2ljVHlwZS5hZGQobmV3IExpdGVyYWwoImRvdWJsZSIpKTsKICAgICAgICAgICAgYmFzaWNUeXBlLmFkZChuZXcgTGl0ZXJhbCgiYm9vbGVhbiIpKTsKICAgICAgICByZXR1cm4gYmFzaWNUeXBlOwogICAgfQoKICAgIC8qKiBBcmd1bWVudHNPcHQ6CiAgICAgKiAgICAgIFsgQXJndW1lbnRzIF0KICAgICAqLwogICAgcHVibGljIFBhcnNlciBhcmd1bWVudHNPcHQoKSB7CiAgICAgICAgbG9nKCJhcmd1bWVudHNPcHQiKTsKICAgICAgICBpZiAoYXJndW1lbnRzT3B0ICE9IG51bGwpIHJldHVybiBhcmd1bWVudHNPcHQ7CiAgICAgICAgYXJndW1lbnRzT3B0ID0gemVyb09yT25lKGFyZ3VtZW50cygpKTsKICAgICAgICByZXR1cm4gYXJndW1lbnRzT3B0OwogICAgfQoKICAgIC8qKiBBcmd1bWVudHM6CiAgICAgKiAgICAgICggW0V4cHJlc3Npb24geywgRXhwcmVzc2lvbiB9XSkKICAgICAqLwogICAgcHVibGljIFBhcnNlciBhcmd1bWVudHMoKSB7CiAgICAgICAgbG9nKCJhcmd1bWVudHMiKTsKICAgICAgICBpZiAoYXJndW1lbnRzICE9IG51bGwpIHJldHVybiBhcmd1bWVudHM7CiAgICAgICAgYXJndW1lbnRzID0gc2VxdWVuY2UoIjxhcmd1bWVudHM+Iik7CiAgICAgICAgICAgIGFyZ3VtZW50cy5hZGQobmV3IFN5bWJvbCgnKCcpKTsKICAgICAgICAgICAgYXJndW1lbnRzLmFkZCh6ZXJvT3JPbmUoc2VxdWVuY2UoIjxhcmd1bWVudHMkMT4iKQogICAgICAgICAgICAgICAgLmFkZChleHByZXNzaW9uKCkpCiAgICAgICAgICAgICAgICAuYWRkKHJlcGV0aXRpb24oc2VxdWVuY2UoIjxhcmd1bWVudHMkMj4iKQogICAgICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnLCcpKQogICAgICAgICAgICAgICAgICAgIC5hZGQoZXhwcmVzc2lvbigpKQogICAgICAgICAgICAgICAgKSkKICAgICAgICAgICAgKSk7CiAgICAgICAgICAgIGFyZ3VtZW50cy5hZGQobmV3IFN5bWJvbCgnKScpKTsKICAgICAgICByZXR1cm4gYXJndW1lbnRzOwogICAgfQoKICAgIC8qKiBCcmFja2V0c09wdDoKICAgICAqICAgICAge1tdfQogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIGJyYWNrZXRzT3B0KCkgewogICAgICAgIGxvZygiYnJhY2tldHNPcHQiKTsKICAgICAgICBpZiAoYnJhY2tldHNPcHQgIT0gbnVsbCkgcmV0dXJuIGJyYWNrZXRzT3B0OwogICAgICAgIGJyYWNrZXRzT3B0ID0gcmVwZXRpdGlvbihzZXF1ZW5jZSgiPGJyYWNrZXRzT3B0JDE+IikKICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCdbJykpCiAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnXScpKQogICAgICAgICk7CiAgICAgICAgcmV0dXJuIGJyYWNrZXRzT3B0OwogICAgfQoKICAgIC8qKiBDcmVhdG9yOgogICAgICogICAgICBbTm9uV2lsZGNhcmRUeXBlQXJndW1lbnRzXSBDcmVhdGVkTmFtZSAoIEFycmF5Q3JlYXRvclJlc3QgIHwgQ2xhc3NDcmVhdG9yUmVzdCApCiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgY3JlYXRvcigpIHsKICAgICAgICBsb2coImNyZWF0b3IiKTsKICAgICAgICBpZiAoY3JlYXRvciAhPSBudWxsKSByZXR1cm4gY3JlYXRvcjsKICAgICAgICBjcmVhdG9yID0gc2VxdWVuY2UoIjxjcmVhdG9yPiIpOwogICAgICAgICAgICBjcmVhdG9yLmFkZCh6ZXJvT3JPbmUobm9uV2lsZGNhcmRUeXBlQXJndW1lbnRzKCkpKTsKICAgICAgICAgICAgY3JlYXRvci5hZGQoY3JlYXRlZE5hbWUoKSk7CiAgICAgICAgICAgIGNyZWF0b3IuYWRkKGFsdGVybmF0aW9uKCI8Y3JlYXRvciRhPiIpCiAgICAgICAgICAgICAgICAuYWRkKGFycmF5Q3JlYXRvclJlc3QoKSkKICAgICAgICAgICAgICAgIC5hZGQoY2xhc3NDcmVhdG9yUmVzdCgpKQogICAgICAgICAgICApOwogICAgICAgIHJldHVybiBjcmVhdG9yOwogICAgfQoKICAgIC8qKiBDcmVhdGVkTmFtZToKICAgICAqICAgICAgSWRlbnRpZmllciBbTm9uV2lsZGNhcmRUeXBlQXJndW1lbnRzXSB7LiBJZGVudGlmaWVyIFtOb25XaWxkY2FyZFR5cGVBcmd1bWVudHNdfQogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIGNyZWF0ZWROYW1lKCkgewogICAgICAgIGxvZygiY3JlYXRlZE5hbWUiKTsKICAgICAgICBpZiAoY3JlYXRlZE5hbWUgIT0gbnVsbCkgcmV0dXJuIGNyZWF0ZWROYW1lOwogICAgICAgIGNyZWF0ZWROYW1lID0gc2VxdWVuY2UoIjxjcmVhdGVkTmFtZT4iKTsKICAgICAgICAgICAgY3JlYXRlZE5hbWUuYWRkKGlkZW50aWZpZXIoKSk7CiAgICAgICAgICAgIGNyZWF0ZWROYW1lLmFkZCh6ZXJvT3JPbmUobm9uV2lsZGNhcmRUeXBlQXJndW1lbnRzKCkpKTsKICAgICAgICAgICAgY3JlYXRlZE5hbWUuYWRkKHJlcGV0aXRpb24oc2VxdWVuY2UoIjxjcmVhdGVkTmFtZSQxPiIpCiAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJy4nKSkKICAgICAgICAgICAgICAgIC5hZGQoaWRlbnRpZmllcigpKQogICAgICAgICAgICAgICAgLmFkZCh6ZXJvT3JPbmUobm9uV2lsZGNhcmRUeXBlQXJndW1lbnRzKCkpKQogICAgICAgICAgICApKTsKICAgICAgICByZXR1cm4gY3JlYXRlZE5hbWU7CiAgICB9CgogICAgLyoqIElubmVyQ3JlYXRvcjoKICAgICAqICAgICAgSWRlbnRpZmllciBDbGFzc0NyZWF0b3JSZXN0CiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgaW5uZXJDcmVhdG9yKCkgewogICAgICAgIGxvZygiaW5uZXJDcmVhdG9yIik7CiAgICAgICAgaWYgKGlubmVyQ3JlYXRvciAhPSBudWxsKSByZXR1cm4gaW5uZXJDcmVhdG9yOwogICAgICAgIGlubmVyQ3JlYXRvciA9IHNlcXVlbmNlKCI8aW5uZXJDcmVhdG9yPiIpOwogICAgICAgICAgICBpbm5lckNyZWF0b3IuYWRkKGlkZW50aWZpZXIoKSk7CiAgICAgICAgICAgIGlubmVyQ3JlYXRvci5hZGQoY2xhc3NDcmVhdG9yUmVzdCgpKTsKICAgICAgICByZXR1cm4gaW5uZXJDcmVhdG9yOwogICAgfQoKICAgIC8qKiBBcnJheUNyZWF0b3JSZXN0OgogICAgICogICAgICBbIChdIEJyYWNrZXRzT3B0IEFycmF5SW5pdGlhbGl6ZXIgfCBFeHByZXNzaW9uXSB7WyBFeHByZXNzaW9uXX0gQnJhY2tldHNPcHQgKQogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIGFycmF5Q3JlYXRvclJlc3QoKSB7CiAgICAgICAgbG9nKCJhcnJheUNyZWF0b3JSZXN0Iik7CiAgICAgICAgaWYgKGFycmF5Q3JlYXRvclJlc3QgIT0gbnVsbCkgcmV0dXJuIGFycmF5Q3JlYXRvclJlc3Q7CiAgICAgICAgYXJyYXlDcmVhdG9yUmVzdCA9IHNlcXVlbmNlKCI8YXJyYXlDcmVhdG9yUmVzdD4iKTsKICAgICAgICAgICAgYXJyYXlDcmVhdG9yUmVzdC5hZGQobmV3IFN5bWJvbCgnWycpKTsKICAgICAgICAgICAgYXJyYXlDcmVhdG9yUmVzdC5hZGQoYWx0ZXJuYXRpb24oIjxhcnJheUNyZWF0b3JSZXN0JGE+IikKICAgICAgICAgICAgICAgIC5hZGQoc2VxdWVuY2UoIjxhcnJheUNyZWF0b3JSZXN0JDE+IikKICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJ10nKSkKICAgICAgICAgICAgICAgICAgICAuYWRkKGJyYWNrZXRzT3B0KCkpCiAgICAgICAgICAgICAgICAgICAgLmFkZChhcnJheUluaXRpYWxpemVyKCkpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkKHNlcXVlbmNlKCI8YXJyYXlDcmVhdG9yJDI+IikKICAgICAgICAgICAgICAgICAgICAuYWRkKGV4cHJlc3Npb24oKSkKICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJ10nKSkKICAgICAgICAgICAgICAgICAgICAuYWRkKHJlcGV0aXRpb24oc2VxdWVuY2UoIjxhcnJheUNyZWF0b3IkMz4iKQogICAgICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJ1snKSkKICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChleHByZXNzaW9uKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnXScpKQogICAgICAgICAgICAgICAgICAgICkpCiAgICAgICAgICAgICAgICAgICAgLmFkZChicmFja2V0c09wdCgpKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApOwogICAgICAgIHJldHVybiBhcnJheUNyZWF0b3JSZXN0OwogICAgfQoKICAgIC8qKiBDbGFzc0NyZWF0b3JSZXN0OgogICAgICogICAgICBBcmd1bWVudHMgW0NsYXNzQm9keV0KICAgICAqLwogICAgcHVibGljIFBhcnNlciBjbGFzc0NyZWF0b3JSZXN0KCkgewogICAgICAgIGxvZygiY2xhc3NDcmVhdG9yUmVzdCIpOwogICAgICAgIGlmIChjbGFzc0NyZWF0b3JSZXN0ICE9IG51bGwpIHJldHVybiBjbGFzc0NyZWF0b3JSZXN0OwogICAgICAgIGNsYXNzQ3JlYXRvclJlc3QgPSBzZXF1ZW5jZSgiPGNsYXNzQ3JlYXRvclJlc3Q+Iik7CiAgICAgICAgICAgIGNsYXNzQ3JlYXRvclJlc3QuYWRkKGFyZ3VtZW50cygpKTsKICAgICAgICAgICAgY2xhc3NDcmVhdG9yUmVzdC5hZGQoemVyb09yT25lKGNsYXNzQm9keSgpKSk7CiAgICAgICAgcmV0dXJuIGNsYXNzQ3JlYXRvclJlc3Q7CiAgICB9CgogICAgLyoqIEFycmF5SW5pdGlhbGl6ZXI6CiAgICAgKiAgICAgIHsgW1ZhcmlhYmxlSW5pdGlhbGl6ZXIgeywgVmFyaWFibGVJbml0aWFsaXplcn0gWyxdXX0KICAgICAqLwogICAgcHVibGljIFBhcnNlciBhcnJheUluaXRpYWxpemVyKCkgewogICAgICAgIGxvZygiYXJyYXlJbml0aWFsaXplciIpOwogICAgICAgIGlmIChhcnJheUluaXRpYWxpemVyICE9IG51bGwpIHJldHVybiBhcnJheUluaXRpYWxpemVyOwogICAgICAgIGFycmF5SW5pdGlhbGl6ZXIgPSBzZXF1ZW5jZSgiPGFycmF5SW5pdGlhbGl6ZXI+Iik7CiAgICAgICAgYXJyYXlJbml0aWFsaXplci5hZGQobmV3IFN5bWJvbCgieyIpKTsKICAgICAgICBhcnJheUluaXRpYWxpemVyLmFkZCh6ZXJvT3JPbmUoc2VxdWVuY2UoIjxhcnJheUluaXRpYWxpemVyJDE+IikKICAgICAgICAgICAgICAgIC5hZGQodmFyaWFibGVJbml0aWFsaXplcigpKQogICAgICAgICAgICAgICAgLmFkZChyZXBldGl0aW9uKHNlcXVlbmNlKCI8YXJyYXlJbml0aWFsaXplciQyPiIpCiAgICAgICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCIsIikpCiAgICAgICAgICAgICAgICAgICAgLmFkZCh2YXJpYWJsZUluaXRpYWxpemVyKCkpCiAgICAgICAgICAgICAgICApKQogICAgICAgICAgICAgICAgLmFkZCh6ZXJvT3JPbmUobmV3IFN5bWJvbCgnLCcpKSkKICAgICAgICAgICAgKSk7CiAgICAgICAgYXJyYXlJbml0aWFsaXplci5hZGQobmV3IFN5bWJvbCgifSIpKTsKICAgICAgICByZXR1cm4gYXJyYXlJbml0aWFsaXplcjsKICAgIH0KCiAgICAvKiogVmFyaWFibGVJbml0aWFsaXplcjoKICAgICAqICAgICAgQXJyYXlJbml0aWFsaXplcgogICAgICogICAgICBFeHByZXNzaW9uCiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgdmFyaWFibGVJbml0aWFsaXplcigpIHsKICAgICAgICBsb2coInZhcmlhYmxlSW5pdGlhbGl6ZXIiKTsKICAgICAgICBpZiAodmFyaWFibGVJbml0aWFsaXplciAhPSBudWxsKSByZXR1cm4gdmFyaWFibGVJbml0aWFsaXplcjsKICAgICAgICB2YXJpYWJsZUluaXRpYWxpemVyID0gYWx0ZXJuYXRpb24oIjx2YXJpYWJsZUluaXRpYWxpemVyPiIpOwogICAgICAgICAgICB2YXJpYWJsZUluaXRpYWxpemVyLmFkZChhcnJheUluaXRpYWxpemVyKCkpOwogICAgICAgICAgICB2YXJpYWJsZUluaXRpYWxpemVyLmFkZChleHByZXNzaW9uKCkpOwogICAgICAgIHJldHVybiB2YXJpYWJsZUluaXRpYWxpemVyOwogICAgfQoKICAgIC8qKiBQYXJFeHByZXNzaW9uOgogICAgICogICAgICAoIEV4cHJlc3Npb24pCiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgcGFyRXhwcmVzc2lvbigpIHsKICAgICAgICBsb2coInBhckV4cHJlc3Npb24iKTsKICAgICAgICBpZiAocGFyRXhwcmVzc2lvbiAhPSBudWxsKSByZXR1cm4gcGFyRXhwcmVzc2lvbjsKICAgICAgICBwYXJFeHByZXNzaW9uID0gc2VxdWVuY2UoIjxwYXJFeHByZXNzaW9uPiIpOwogICAgICAgICAgICBwYXJFeHByZXNzaW9uLmFkZChuZXcgU3ltYm9sKCcoJykpOwogICAgICAgICAgICBwYXJFeHByZXNzaW9uLmFkZChleHByZXNzaW9uKCkpOwogICAgICAgICAgICBwYXJFeHByZXNzaW9uLmFkZChuZXcgU3ltYm9sKCcpJykpOwogICAgICAgIHJldHVybiBwYXJFeHByZXNzaW9uOwogICAgfQoKICAgIC8qKiBCbG9jazoKICAgICAqICAgICAgeyBCbG9ja1N0YXRlbWVudHN9CiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgYmxvY2soKSB7CiAgICAgICAgbG9nKCJibG9jayIpOwogICAgICAgIGlmIChibG9jayAhPSBudWxsKSByZXR1cm4gYmxvY2s7CiAgICAgICAgYmxvY2sgPSBzZXF1ZW5jZSgiPGJsb2NrPiIpOwogICAgICAgIGJsb2NrLmFkZChuZXcgU3ltYm9sKCd7JykpOwogICAgICAgIGJsb2NrLmFkZChibG9ja1N0YXRlbWVudHMoKSk7CiAgICAgICAgYmxvY2suYWRkKG5ldyBTeW1ib2woJ30nKSk7CiAgICAgICAgcmV0dXJuIGJsb2NrOwogICAgfQoKICAgIC8qKiBCbG9ja1N0YXRlbWVudHM6CiAgICAgKiAgICAgIHsgQmxvY2tTdGF0ZW1lbnQgfQogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIGJsb2NrU3RhdGVtZW50cygpIHsKICAgICAgICBsb2coImJsb2NrU3RhdGVtZW50cyIpOwogICAgICAgIGlmIChibG9ja1N0YXRlbWVudHMgIT0gbnVsbCkgcmV0dXJuIGJsb2NrU3RhdGVtZW50czsKICAgICAgICBibG9ja1N0YXRlbWVudHMgPSByZXBldGl0aW9uKGJsb2NrU3RhdGVtZW50KCkpOwogICAgICAgIHJldHVybiBibG9ja1N0YXRlbWVudHM7CiAgICB9CgogICAgLyoqIEJsb2NrU3RhdGVtZW50OgogICAgICogICAgICBMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQKICAgICAqICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uCiAgICAgKiAgICAgIFtJZGVudGlmaWVyOl0gU3RhdGVtZW50CiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgYmxvY2tTdGF0ZW1lbnQoKSB7CiAgICAgICAgbG9nKCJibG9ja1N0YXRlbWVudCIpOwogICAgICAgIGlmIChibG9ja1N0YXRlbWVudCAhPSBudWxsKSByZXR1cm4gYmxvY2tTdGF0ZW1lbnQ7CiAgICAgICAgYmxvY2tTdGF0ZW1lbnQgPSBhbHRlcm5hdGlvbigiPGJsb2NrU3RhdGVtZW50PiIpOwogICAgICAgICAgICBibG9ja1N0YXRlbWVudC5hZGQobG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KCkpOwogICAgICAgICAgICBibG9ja1N0YXRlbWVudC5hZGQoY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKCkpOwogICAgICAgICAgICBibG9ja1N0YXRlbWVudC5hZGQoc2VxdWVuY2UoIjxibG9ja1N0YXRlbWVudCQxPiIpCiAgICAgICAgICAgICAgICAuYWRkKHplcm9Pck9uZShzZXF1ZW5jZSgiPGJsb2NrU3RhdGVtZW50JDI+IikKICAgICAgICAgICAgICAgICAgICAuYWRkKGlkZW50aWZpZXIoKSkKICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woIjoiKSkKICAgICAgICAgICAgICAgICkpCiAgICAgICAgICAgICAgICAuYWRkKHN0YXRlbWVudCgpKQogICAgICAgICAgICApOwogICAgICAgIHJldHVybiBibG9ja1N0YXRlbWVudDsKICAgIH0KCiAgICAvKiogTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50OgogICAgICogICAgICBbZmluYWxdIFR5cGUgVmFyaWFibGVEZWNsYXJhdG9yczsKICAgICAqLwogICAgcHVibGljIFBhcnNlciBsb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQoKSB7CiAgICAgICAgbG9nKCJsb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQiKTsKICAgICAgICBpZiAobG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50ICE9IG51bGwpIHJldHVybiBsb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQ7CiAgICAgICAgbG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50ID0gc2VxdWVuY2UoIjxsb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQ+Iik7CiAgICAgICAgICAgIGxvY2FsVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5hZGQoemVyb09yT25lKG5ldyBMaXRlcmFsKCJmaW5hbCIpKSk7CiAgICAgICAgICAgIGxvY2FsVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5hZGQodHlwZSgpKTsKICAgICAgICAgICAgbG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50LmFkZCh2YXJpYWJsZURlY2xhcmF0b3JzKCkpOwogICAgICAgICAgICBsb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQuYWRkKG5ldyBTeW1ib2woJzsnKSk7CiAgICAgICAgcmV0dXJuIGxvY2FsVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudDsKICAgIH0KCiAgICAvKiogU3RhdGVtZW50OgogICAgICogICAgICBCbG9jawogICAgICogICAgICBhc3NlcnQgRXhwcmVzc2lvbiBbOiBFeHByZXNzaW9uXTsKICAgICAqICAgICAgaWYgUGFyRXhwcmVzc2lvbiBTdGF0ZW1lbnQgW2Vsc2UgU3RhdGVtZW50XQogICAgICogICAgICBmb3IoRm9yQ29udHJvbCkgU3RhdGVtZW50CiAgICAgKiAgICAgIHdoaWxlIFBhckV4cHJlc3Npb24gU3RhdGVtZW50CiAgICAgKiAgICAgIGRvIFN0YXRlbWVudCB3aGlsZSBQYXJFeHByZXNzaW9uIDsKICAgICAqICAgICAgdHJ5IEJsb2NrICggQ2F0Y2hlcyB8IFtDYXRjaGVzXSBmaW5hbGx5IEJsb2NrICkKICAgICAqICAgICAgc3dpdGNoIFBhckV4cHJlc3Npb257IFN3aXRjaEJsb2NrU3RhdGVtZW50R3JvdXBzfQogICAgICogICAgICBzeW5jaHJvbml6ZWQgUGFyRXhwcmVzc2lvbiBCbG9jawogICAgICogICAgICByZXR1cm4gW0V4cHJlc3Npb25dOwogICAgICogICAgICB0aHJvdyBFeHByZXNzaW9uIDsKICAgICAqICAgICAgYnJlYWsgW0lkZW50aWZpZXJdCiAgICAgKiAgICAgIGNvbnRpbnVlIFtJZGVudGlmaWVyXQogICAgICogICAgICA7CiAgICAgKiAgICAgIEV4cHJlc3Npb25TdGF0ZW1lbnQKICAgICAqICAgICAgSWRlbnRpZmllciA6ICAgU3RhdGVtZW50CiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgc3RhdGVtZW50KCkgewogICAgICAgIGxvZygic3RhdGVtZW50Iik7CiAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSByZXR1cm4gc3RhdGVtZW50OwogICAgICAgIHN0YXRlbWVudCA9IGFsdGVybmF0aW9uKCI8c3RhdGVtZW50PiIpOwogICAgICAgICAgICAvL0Jsb2NrCiAgICAgICAgICAgICBzdGF0ZW1lbnQuYWRkKGJsb2NrKCkpOwogICAgICAgICAgICAvL2Fzc2VydCBFeHByZXNzaW9uIFs6IEV4cHJlc3Npb25dOwogICAgICAgICAgICBzdGF0ZW1lbnQuYWRkKHNlcXVlbmNlKCI8c3RhdGVtZW50JDE+IikKICAgICAgICAgICAgICAgIC5hZGQobmV3IExpdGVyYWwoImFzc2VydCIpKQogICAgICAgICAgICAgICAgLmFkZChleHByZXNzaW9uKCkpCiAgICAgICAgICAgICAgICAuYWRkKHplcm9Pck9uZSgKICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZSgiPHN0YXRlbWVudCQyPiIpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnOicpKQogICAgICAgICAgICAgICAgICAgICAgICAuYWRkKGV4cHJlc3Npb24oKSkKICAgICAgICAgICAgICAgICkpCiAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJzsnKSkKICAgICAgICAgICAgKTsKICAgICAgICAgICAgLy9pZiBQYXJFeHByZXNzaW9uIFN0YXRlbWVudCBbZWxzZSBTdGF0ZW1lbnRdCiAgICAgICAgICAgIHN0YXRlbWVudC5hZGQoc2VxdWVuY2UoIjxzdGF0ZW1lbnQkMz4iKQogICAgICAgICAgICAgICAgLmFkZChuZXcgTGl0ZXJhbCgiaWYiKSkKICAgICAgICAgICAgICAgIC5hZGQocGFyRXhwcmVzc2lvbigpKQogICAgICAgICAgICAgICAgLmFkZChzdGF0ZW1lbnQoKSkKICAgICAgICAgICAgICAgIC5hZGQoemVyb09yT25lKAogICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlKCI8c3RhdGVtZW50JDQ+IikKICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChuZXcgTGl0ZXJhbCgiZWxzZSIpKQogICAgICAgICAgICAgICAgICAgICAgICAuYWRkKHN0YXRlbWVudCgpKQogICAgICAgICAgICAgICAgKSkKICAgICAgICAgICAgKTsKICAgICAgICAgICAgLy9mb3IgKEZvckNvbnRyb2wpIFN0YXRlbWVudAogICAgICAgICAgICBzdGF0ZW1lbnQuYWRkKHNlcXVlbmNlKCI8c3RhdGVtZW50JDU+IikKICAgICAgICAgICAgICAgIC5hZGQobmV3IExpdGVyYWwoImZvciIpKQogICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCcoJykpCiAgICAgICAgICAgICAgICAuYWRkKGZvckNvbnRyb2woKSkKICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnKScpKQogICAgICAgICAgICAgICAgLmFkZChzdGF0ZW1lbnQoKSkKICAgICAgICAgICAgKTsKICAgICAgICAgICAgLy93aGlsZSBQYXJFeHByZXNzaW9uIFN0YXRlbWVudAogICAgICAgICAgICBzdGF0ZW1lbnQuYWRkKHNlcXVlbmNlKCI8c3RhdGVtZW50JDY+IikKICAgICAgICAgICAgICAgIC5hZGQobmV3IExpdGVyYWwoIndoaWxlIikpCiAgICAgICAgICAgICAgICAuYWRkKHBhckV4cHJlc3Npb24oKSkKICAgICAgICAgICAgICAgIC5hZGQoc3RhdGVtZW50KCkpCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIC8vZG8gU3RhdGVtZW50IHdoaWxlIFBhckV4cHJlc3Npb24gOwogICAgICAgICAgICBzdGF0ZW1lbnQuYWRkKHNlcXVlbmNlKCI8c3RhdGVtZW50JDc+IikKICAgICAgICAgICAgICAgIC5hZGQobmV3IExpdGVyYWwoImRvIikpCiAgICAgICAgICAgICAgICAuYWRkKHN0YXRlbWVudCgpKQogICAgICAgICAgICAgICAgLmFkZChuZXcgTGl0ZXJhbCgid2hpbGUiKSkKICAgICAgICAgICAgICAgIC5hZGQocGFyRXhwcmVzc2lvbigpKQogICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCc7JykpCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIC8vdHJ5IEJsb2NrICggQ2F0Y2hlcyB8IFtDYXRjaGVzXSBmaW5hbGx5IEJsb2NrICkKICAgICAgICAgICAgc3RhdGVtZW50LmFkZChzZXF1ZW5jZSgiPHN0YXRlbWVudCQ4PiIpCiAgICAgICAgICAgICAgICAuYWRkKG5ldyBMaXRlcmFsKCJ0cnkiKSkKICAgICAgICAgICAgICAgIC5hZGQoYmxvY2soKSkKICAgICAgICAgICAgICAgIC5hZGQoYWx0ZXJuYXRpb24oIjxzdGF0ZW1lbnQkYT4iKQogICAgICAgICAgICAgICAgICAgIC5hZGQoY2F0Y2hlcygpKQogICAgICAgICAgICAgICAgICAgIC5hZGQoc2VxdWVuY2UoIjxzdGF0ZW1lbnQkOT4iKQogICAgICAgICAgICAgICAgICAgICAgICAuYWRkKHplcm9Pck9uZShjYXRjaGVzKCkpKQogICAgICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBMaXRlcmFsKCJmaW5hbGx5IikpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoYmxvY2soKSkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIC8vc3dpdGNoIFBhckV4cHJlc3Npb257IFN3aXRjaEJsb2NrU3RhdGVtZW50R3JvdXBzfQogICAgICAgICAgICBzdGF0ZW1lbnQuYWRkKHNlcXVlbmNlKCI8c3RhdGVtZW50JDEwPiIpCiAgICAgICAgICAgICAgICAuYWRkKG5ldyBMaXRlcmFsKCJzd2l0Y2giKSkKICAgICAgICAgICAgICAgIC5hZGQocGFyRXhwcmVzc2lvbigpKQogICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCd7JykpCiAgICAgICAgICAgICAgICAuYWRkKHN3aXRjaEJsb2NrU3RhdGVtZW50R3JvdXBzKCkpCiAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJ30nKSkKICAgICAgICAgICAgKTsKICAgICAgICAgICAgLy9zeW5jaHJvbml6ZWQgUGFyRXhwcmVzc2lvbiBCbG9jawogICAgICAgICAgICBzdGF0ZW1lbnQuYWRkKHNlcXVlbmNlKCI8c3RhdGVtZW50JDExPiIpCiAgICAgICAgICAgICAgICAuYWRkKG5ldyBMaXRlcmFsKCJzeW5jaHJvbml6ZWQiKSkKICAgICAgICAgICAgICAgIC5hZGQocGFyRXhwcmVzc2lvbigpKQogICAgICAgICAgICAgICAgLmFkZChibG9jaygpKQogICAgICAgICAgICApOwogICAgICAgICAgICAvL3JldHVybiBbRXhwcmVzc2lvbl07CiAgICAgICAgICAgIHN0YXRlbWVudC5hZGQoc2VxdWVuY2UoIjxzdGF0ZW1lbnQkMTI+IikKICAgICAgICAgICAgICAgIC5hZGQobmV3IExpdGVyYWwoInJldHVybiIpKQogICAgICAgICAgICAgICAgLmFkZCh6ZXJvT3JPbmUoZXhwcmVzc2lvbigpKSkKICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnOycpKQogICAgICAgICAgICApOwogICAgICAgICAgICAvL3Rocm93IEV4cHJlc3Npb24gOwogICAgICAgICAgICBzdGF0ZW1lbnQuYWRkKHNlcXVlbmNlKCI8c3RhdGVtZW50JDEzPiIpCiAgICAgICAgICAgICAgICAuYWRkKG5ldyBMaXRlcmFsKCJ0aHJvdyIpKQogICAgICAgICAgICAgICAgLmFkZChleHByZXNzaW9uKCkpCiAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJzsnKSkKICAgICAgICAgICAgKTsKICAgICAgICAgICAgLy9icmVhayBbSWRlbnRpZmllcl0KICAgICAgICAgICAgc3RhdGVtZW50LmFkZChzZXF1ZW5jZSgiPHN0YXRlbWVudCQxND4iKQogICAgICAgICAgICAgICAgLmFkZChuZXcgTGl0ZXJhbCgiYnJlYWsiKSkKICAgICAgICAgICAgICAgIC5hZGQoemVyb09yT25lKGlkZW50aWZpZXIoKSkpCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIC8vY29udGludWUgW0lkZW50aWZpZXJdCiAgICAgICAgICAgIHN0YXRlbWVudC5hZGQoc2VxdWVuY2UoIjxzdGF0ZW1lbnQkMTU+IikKICAgICAgICAgICAgICAgIC5hZGQobmV3IExpdGVyYWwoImNvbnRpbnVlIikpCiAgICAgICAgICAgICAgICAuYWRkKHplcm9Pck9uZShpZGVudGlmaWVyKCkpKQogICAgICAgICAgICApOwogICAgICAgICAgICAvLzsKICAgICAgICAgICAgc3RhdGVtZW50LmFkZChuZXcgU3ltYm9sKCc7JykpOwogICAgICAgICAgICAvL0V4cHJlc3Npb25TdGF0ZW1lbnQKICAgICAgICAgICAgc3RhdGVtZW50LmFkZChleHByZXNzaW9uU3RhdGVtZW50KCkpOwogICAgICAgICAgICAvL0lkZW50aWZpZXIgOiAgIFN0YXRlbWVudAogICAgICAgICAgICBzdGF0ZW1lbnQuYWRkKHNlcXVlbmNlKCI8c3RhdGVtZW50JDE2PiIpCiAgICAgICAgICAgICAgICAuYWRkKGlkZW50aWZpZXIoKSkKICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnOicpKQogICAgICAgICAgICAgICAgLmFkZChzdGF0ZW1lbnQoKSkKICAgICAgICAgICAgKTsKICAgICAgICByZXR1cm4gc3RhdGVtZW50OwogICAgfQoKICAgIC8qKiBDYXRjaGVzOgogICAgICogICAgICBDYXRjaENsYXVzZSB7Q2F0Y2hDbGF1c2V9CiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgY2F0Y2hlcygpIHsKICAgICAgICBsb2coImNhdGNoZXMiKTsKICAgICAgICBpZiAoY2F0Y2hlcyAhPSBudWxsKSByZXR1cm4gY2F0Y2hlczsKICAgICAgICBjYXRjaGVzID0gc2VxdWVuY2UoIjxjYXRjaGVzPiIpOwogICAgICAgICAgICBjYXRjaGVzLmFkZChjYXRjaENsYXVzZSgpKTsKICAgICAgICAgICAgY2F0Y2hlcy5hZGQocmVwZXRpdGlvbihjYXRjaENsYXVzZSgpKSk7CiAgICAgICAgcmV0dXJuIGNhdGNoZXM7CiAgICB9CgogICAgLyoqIENhdGNoQ2xhdXNlOgogICAgICogICAgICBjYXRjaCggRm9ybWFsUGFyYW1ldGVyKSBCbG9jawogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIGNhdGNoQ2xhdXNlKCkgewogICAgICAgIGxvZygiY2F0Y2hDbGF1c2UiKTsKICAgICAgICBpZiAoY2F0Y2hDbGF1c2UgIT0gbnVsbCkgcmV0dXJuIGNhdGNoQ2xhdXNlOwogICAgICAgIGNhdGNoQ2xhdXNlID0gc2VxdWVuY2UoIjxjYXRjaENsYXVzZT4iKTsKICAgICAgICAgICAgY2F0Y2hDbGF1c2UuYWRkKG5ldyBMaXRlcmFsKCJjYXRjaCIpKTsKICAgICAgICAgICAgY2F0Y2hDbGF1c2UuYWRkKG5ldyBTeW1ib2woJygnKSk7CiAgICAgICAgICAgIGNhdGNoQ2xhdXNlLmFkZChmb3JtYWxQYXJhbWV0ZXIoKSk7CiAgICAgICAgICAgIGNhdGNoQ2xhdXNlLmFkZChuZXcgU3ltYm9sKCcpJykpOwogICAgICAgICAgICBjYXRjaENsYXVzZS5hZGQoYmxvY2soKSk7CiAgICAgICAgcmV0dXJuIGNhdGNoQ2xhdXNlOwogICAgfQoKICAgIC8qKiBTd2l0Y2hCbG9ja1N0YXRlbWVudEdyb3VwczoKICAgICAqICAgICAgeyBTd2l0Y2hCbG9ja1N0YXRlbWVudEdyb3VwIH0KICAgICAqLwogICAgcHVibGljIFBhcnNlciBzd2l0Y2hCbG9ja1N0YXRlbWVudEdyb3VwcygpIHsKICAgICAgICBsb2coInN3aXRjaEJsb2NrU3RhdGVtZW50R3JvdXBzIik7CiAgICAgICAgaWYgKHN3aXRjaEJsb2NrU3RhdGVtZW50R3JvdXBzICE9IG51bGwpIHJldHVybiBzd2l0Y2hCbG9ja1N0YXRlbWVudEdyb3VwczsKICAgICAgICBzd2l0Y2hCbG9ja1N0YXRlbWVudEdyb3VwcyA9IHJlcGV0aXRpb24oc3dpdGNoQmxvY2tTdGF0ZW1lbnRHcm91cCgpKTsKICAgICAgICByZXR1cm4gc3dpdGNoQmxvY2tTdGF0ZW1lbnRHcm91cHM7CiAgICB9CgogICAgLyoqIFN3aXRjaEJsb2NrU3RhdGVtZW50R3JvdXA6CiAgICAgKiAgICAgIFN3aXRjaExhYmVsIEJsb2NrU3RhdGVtZW50cwogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIHN3aXRjaEJsb2NrU3RhdGVtZW50R3JvdXAoKSB7CiAgICAgICAgbG9nKCJzd2l0Y2hCbG9ja1N0YXRlbWVudEdyb3VwIik7CiAgICAgICAgaWYgKHN3aXRjaEJsb2NrU3RhdGVtZW50R3JvdXAgIT0gbnVsbCkgcmV0dXJuIHN3aXRjaEJsb2NrU3RhdGVtZW50R3JvdXA7CiAgICAgICAgc3dpdGNoQmxvY2tTdGF0ZW1lbnRHcm91cCA9IHNlcXVlbmNlKCI8c3dpdGNoQmxvY2tTdGF0ZW1lbnRHcm91cD4iKTsKICAgICAgICAgICAgc3dpdGNoQmxvY2tTdGF0ZW1lbnRHcm91cC5hZGQoc3dpdGNoTGFiZWwoKSk7CiAgICAgICAgICAgIHN3aXRjaEJsb2NrU3RhdGVtZW50R3JvdXAuYWRkKGJsb2NrU3RhdGVtZW50cygpKTsKICAgICAgICByZXR1cm4gc3dpdGNoQmxvY2tTdGF0ZW1lbnRHcm91cDsKICAgIH0KCiAgICAvKiogU3dpdGNoTGFiZWw6CiAgICAgKiAgICAgIGNhc2UgQ29uc3RhbnRFeHByZXNzaW9uIDoKICAgICAqICAgICAgZGVmYXVsdDoKICAgICAqLwogICAgcHVibGljIFBhcnNlciBzd2l0Y2hMYWJlbCgpIHsKICAgICAgICBsb2coInN3aXRjaExhYmVsIik7CiAgICAgICAgaWYgKHN3aXRjaExhYmVsICE9IG51bGwpIHJldHVybiBzd2l0Y2hMYWJlbDsKICAgICAgICBzd2l0Y2hMYWJlbCA9IGFsdGVybmF0aW9uKCI8c3dpdGNoTGFiZWw+Iik7CiAgICAgICAgICAgIHN3aXRjaExhYmVsLmFkZChzZXF1ZW5jZSgiPHN3aXRjaExhYmVsJDE+IikKICAgICAgICAgICAgICAgIC5hZGQobmV3IExpdGVyYWwoImNhc2UiKSkKICAgICAgICAgICAgICAgIC5hZGQoY29uc3RhbnRFeHByZXNzaW9uKCkpCiAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woIjoiKSkKICAgICAgICAgICAgKTsKICAgICAgICAgICAgc3dpdGNoTGFiZWwuYWRkKG5ldyBMaXRlcmFsKCJkZWZhdWx0IikpOwogICAgICAgICAgICBzd2l0Y2hMYWJlbC5hZGQobmV3IFN5bWJvbCgiOiIpKTsKICAgICAgICByZXR1cm4gc3dpdGNoTGFiZWw7CiAgICB9CgogICAgLyoqIE1vcmVTdGF0ZW1lbnRFeHByZXNzaW9uczoKICAgICAqICAgICAgeywgU3RhdGVtZW50RXhwcmVzc2lvbiB9CiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgbW9yZVN0YXRlbWVudEV4cHJlc3Npb25zKCkgewogICAgICAgIGxvZygibW9yZVN0YXRlbWVudEV4cHJlc3Npb25zIik7CiAgICAgICAgaWYgKG1vcmVTdGF0ZW1lbnRFeHByZXNzaW9ucyAhPSBudWxsKSByZXR1cm4gbW9yZVN0YXRlbWVudEV4cHJlc3Npb25zOwogICAgICAgIG1vcmVTdGF0ZW1lbnRFeHByZXNzaW9ucyA9IHJlcGV0aXRpb24oc2VxdWVuY2UoIjxtb3JlU3RhdGVtZW50RXhwcmVzc2lvbnMkMT4iKQogICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJywnKSkKICAgICAgICAgICAgLmFkZChzdGF0ZW1lbnRFeHByZXNzaW9uKCkpCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gbW9yZVN0YXRlbWVudEV4cHJlc3Npb25zOwogICAgfQoKICAgIC8qKiBGb3JDb250cm9sOgogICAgICogICAgICA7ICAgW0V4cHJlc3Npb25dIDsgICBGb3JVcGRhdGVPcHQKICAgICAqICAgICAgU3RhdGVtZW50RXhwcmVzc2lvbiBNb3JlU3RhdGVtZW50RXhwcmVzc2lvbnM7ICAgW0V4cHJlc3Npb25dOyBGb3JVcGRhdGVPcHQKICAgICAqICAgICAgW2ZpbmFsXSBbQW5ub3RhdGlvbnNdIFR5cGUgSWRlbnRpZmllciBGb3JDb250cm9sUmVzdAogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIGZvckNvbnRyb2woKSB7CiAgICAgICAgbG9nKCJmb3JDb250cm9sIik7CiAgICAgICAgaWYgKGZvckNvbnRyb2wgIT0gbnVsbCkgcmV0dXJuIGZvckNvbnRyb2w7CiAgICAgICAgZm9yQ29udHJvbCA9IGFsdGVybmF0aW9uKCI8Zm9yQ29udHJvbD4iKTsKICAgICAgICAgICAgZm9yQ29udHJvbC5hZGQoc2VxdWVuY2UoIjxmb3JDb250cm9sJDE+IikKICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnOycpKQogICAgICAgICAgICAgICAgLmFkZCh6ZXJvT3JPbmUoZXhwcmVzc2lvbigpKSkKICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnOycpKQogICAgICAgICAgICAgICAgLmFkZCh6ZXJvT3JPbmUoZm9yVXBkYXRlKCkpKQogICAgICAgICAgICApOwogICAgICAgICAgICBmb3JDb250cm9sLmFkZChzZXF1ZW5jZSgiPGZvckNvbnRyb2wkMj4iKQogICAgICAgICAgICAgICAgLmFkZChzdGF0ZW1lbnRFeHByZXNzaW9uKCkpCiAgICAgICAgICAgICAgICAuYWRkKG1vcmVTdGF0ZW1lbnRFeHByZXNzaW9ucygpKQogICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCc7JykpCiAgICAgICAgICAgICAgICAuYWRkKHplcm9Pck9uZShleHByZXNzaW9uKCkpKQogICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCc7JykpCiAgICAgICAgICAgICAgICAuYWRkKHplcm9Pck9uZShmb3JVcGRhdGUoKSkpCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvckNvbnRyb2wuYWRkKHNlcXVlbmNlKCI8Zm9yQ29udHJvbCQzPiIpCiAgICAgICAgICAgICAgICAuYWRkKHplcm9Pck9uZShuZXcgTGl0ZXJhbCgiZmluYWwiKSkpCiAgICAgICAgICAgICAgICAuYWRkKHplcm9Pck9uZShhbm5vdGF0aW9ucygpKSkKICAgICAgICAgICAgICAgIC5hZGQodHlwZSgpKQogICAgICAgICAgICAgICAgLmFkZChpZGVudGlmaWVyKCkpCiAgICAgICAgICAgICAgICAuYWRkKGZvckNvbnRyb2xSZXN0KCkpCiAgICAgICAgICAgICk7CiAgICAgICAgcmV0dXJuIGZvckNvbnRyb2w7CiAgICB9CgogICAgLyoqIEZvckNvbnRyb2xSZXN0OgogICAgICogICAgICBWYXJpYWJsZURlY2xhcmF0b3JzUmVzdDsgICBbRXhwcmVzc2lvbl0gOyAgIEZvclVwZGF0ZU9wdAogICAgICogICAgICA6IEV4cHJlc3Npb24KICAgICAqLwogICAgcHVibGljIFBhcnNlciBmb3JDb250cm9sUmVzdCgpIHsKICAgICAgICBsb2coImZvckNvbnRyb2xSZXN0Iik7CiAgICAgICAgaWYgKGZvckNvbnRyb2xSZXN0ICE9IG51bGwpIHJldHVybiBmb3JDb250cm9sUmVzdDsKICAgICAgICBmb3JDb250cm9sUmVzdCA9IGFsdGVybmF0aW9uKCI8Zm9yQ29udHJvbFJlc3Q+Iik7CiAgICAgICAgICAgIGZvckNvbnRyb2xSZXN0LmFkZChzZXF1ZW5jZSgiPGZvckNvbnRyb2xSZXN0JDE+IikKICAgICAgICAgICAgICAgIC5hZGQodmFyaWFibGVEZWNsYXJhdG9yc1Jlc3QoKSkKICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnOycpKQogICAgICAgICAgICAgICAgLmFkZCh6ZXJvT3JPbmUoZXhwcmVzc2lvbigpKSkKICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnOycpKQogICAgICAgICAgICAgICAgLmFkZCh6ZXJvT3JPbmUoZm9yVXBkYXRlKCkpKQogICAgICAgICAgICApOwogICAgICAgICAgICBmb3JDb250cm9sUmVzdC5hZGQoc2VxdWVuY2UoIjxmb3JDb250cm9sUmVzdCQyPiIpCiAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJzonKSkKICAgICAgICAgICAgICAgIC5hZGQoZXhwcmVzc2lvbigpKQogICAgICAgICAgICApOwogICAgICAgIHJldHVybiBmb3JDb250cm9sUmVzdDsKICAgIH0KCiAgICAvKiogRm9yVXBkYXRlOgogICAgICogICAgICBTdGF0ZW1lbnRFeHByZXNzaW9uIE1vcmVTdGF0ZW1lbnRFeHByZXNzaW9ucwogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIGZvclVwZGF0ZSgpIHsKICAgICAgICBsb2coImZvclVwZGF0ZSIpOwogICAgICAgIGlmIChmb3JVcGRhdGUgIT0gbnVsbCkgcmV0dXJuIGZvclVwZGF0ZTsKICAgICAgICBmb3JVcGRhdGUgPSBzZXF1ZW5jZSgiPGZvclVwZGF0ZT4iKTsKICAgICAgICAgICAgZm9yVXBkYXRlLmFkZChzdGF0ZW1lbnRFeHByZXNzaW9uKCkpOwogICAgICAgICAgICBmb3JVcGRhdGUuYWRkKG1vcmVTdGF0ZW1lbnRFeHByZXNzaW9ucygpKTsKICAgICAgICByZXR1cm4gZm9yVXBkYXRlOwogICAgfQoKCiAgICAvKiogTW9kaWZpZXJzT3B0OgogICAgICogICAgICB7IE1vZGlmaWVyIH0KICAgICAqLwogICAgcHVibGljIFBhcnNlciBtb2RpZmllcnNPcHQoKSB7CiAgICAgICAgbG9nKCJtb2RpZmllcnNPcHQiKTsKICAgICAgICBpZiAobW9kaWZpZXJzT3B0ICE9IG51bGwpIHJldHVybiBtb2RpZmllcnNPcHQ7CiAgICAgICAgbW9kaWZpZXJzT3B0ID0gcmVwZXRpdGlvbihtb2RpZmllcigpKTsKICAgICAgICByZXR1cm4gbW9kaWZpZXJzT3B0OwogICAgfQoKICAgIC8qKiBNb2RpZmllcjoKICAgICAqICAgICAgQW5ub3RhdGlvbgogICAgICogICAgICBwdWJsaWMKICAgICAqICAgICAgcHJvdGVjdGVkCiAgICAgKiAgICAgIHByaXZhdGUKICAgICAqICAgICAgc3RhdGljCiAgICAgKiAgICAgIGFic3RyYWN0CiAgICAgKiAgICAgIGZpbmFsCiAgICAgKiAgICAgIG5hdGl2ZQogICAgICogICAgICBzeW5jaHJvbml6ZWQKICAgICAqICAgICAgdHJhbnNpZW50CiAgICAgKiAgICAgIHZvbGF0aWxlCiAgICAgKiAgICAgIHN0cmljdGZwCiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgbW9kaWZpZXIoKSB7CiAgICAgICAgbG9nKCJtb2RpZmllciIpOwogICAgICAgIGlmIChtb2RpZmllciAhPSBudWxsKSByZXR1cm4gbW9kaWZpZXI7CiAgICAgICAgbW9kaWZpZXIgPSBhbHRlcm5hdGlvbigiPG1vZGlmaWVyPiIpOwogICAgICAgICAgICBtb2RpZmllci5hZGQoYW5ub3RhdGlvbigpKTsKICAgICAgICAgICAgbW9kaWZpZXIuYWRkKG5ldyBMaXRlcmFsKCJwdWJsaWMiKSk7CiAgICAgICAgICAgIG1vZGlmaWVyLmFkZChuZXcgTGl0ZXJhbCgicHJvdGVjdGVkIikpOwogICAgICAgICAgICBtb2RpZmllci5hZGQobmV3IExpdGVyYWwoInByaXZhdGUiKSk7CiAgICAgICAgICAgIG1vZGlmaWVyLmFkZChuZXcgTGl0ZXJhbCgic3RhdGljIikpOwogICAgICAgICAgICBtb2RpZmllci5hZGQobmV3IExpdGVyYWwoImFic3RyYWN0IikpOwogICAgICAgICAgICBtb2RpZmllci5hZGQobmV3IExpdGVyYWwoImZpbmFsIikpOwogICAgICAgICAgICBtb2RpZmllci5hZGQobmV3IExpdGVyYWwoIm5hdGl2ZSIpKTsKICAgICAgICAgICAgbW9kaWZpZXIuYWRkKG5ldyBMaXRlcmFsKCJzeW5jaHJvbml6ZWQiKSk7CiAgICAgICAgICAgIG1vZGlmaWVyLmFkZChuZXcgTGl0ZXJhbCgidHJhbnNpZW50IikpOwogICAgICAgICAgICBtb2RpZmllci5hZGQobmV3IExpdGVyYWwoInZvbGF0aWxlIikpOwogICAgICAgICAgICBtb2RpZmllci5hZGQobmV3IExpdGVyYWwoInN0cmljdGZwIikpOwogICAgICAgIHJldHVybiBtb2RpZmllcjsKICAgIH0KCiAgICAvKiogVmFyaWFibGVEZWNsYXJhdG9yczoKICAgICAqICAgICAgVmFyaWFibGVEZWNsYXJhdG9yIHssICAgVmFyaWFibGVEZWNsYXJhdG9yIH0KICAgICAqLwogICAgcHVibGljIFBhcnNlciB2YXJpYWJsZURlY2xhcmF0b3JzKCkgewogICAgICAgIGxvZygidmFyaWFibGVEZWNsYXJhdG9ycyIpOwogICAgICAgIGlmICh2YXJpYWJsZURlY2xhcmF0b3JzICE9IG51bGwpIHJldHVybiB2YXJpYWJsZURlY2xhcmF0b3JzOwogICAgICAgIHZhcmlhYmxlRGVjbGFyYXRvcnMgPSBzZXF1ZW5jZSgiPHZhcmlhYmxlRGVjbGFyYXRvcnM+Iik7CiAgICAgICAgICAgIHZhcmlhYmxlRGVjbGFyYXRvcnMuYWRkKHZhcmlhYmxlRGVjbGFyYXRvcigpKTsKICAgICAgICAgICAgdmFyaWFibGVEZWNsYXJhdG9ycy5hZGQocmVwZXRpdGlvbihzZXF1ZW5jZSgiPHZhcmlhYmxlRGVjbGFyYXRvcnMkMT4iKQogICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCcsJykpCiAgICAgICAgICAgICAgICAuYWRkKHZhcmlhYmxlRGVjbGFyYXRvcigpKQogICAgICAgICAgICApKTsKICAgICAgICByZXR1cm4gdmFyaWFibGVEZWNsYXJhdG9yczsKICAgIH0KCiAgICAvKiogVmFyaWFibGVEZWNsYXJhdG9yc1Jlc3Q6CiAgICAgKiAgICAgIFZhcmlhYmxlRGVjbGFyYXRvclJlc3QgeywgICBWYXJpYWJsZURlY2xhcmF0b3IgfQogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIHZhcmlhYmxlRGVjbGFyYXRvcnNSZXN0KCkgewogICAgICAgIGxvZygidmFyaWFibGVEZWNsYXJhdG9yc1Jlc3QiKTsKICAgICAgICBpZiAodmFyaWFibGVEZWNsYXJhdG9yc1Jlc3QgIT0gbnVsbCkgcmV0dXJuIHZhcmlhYmxlRGVjbGFyYXRvcnNSZXN0OwogICAgICAgIHZhcmlhYmxlRGVjbGFyYXRvcnNSZXN0ID0gc2VxdWVuY2UoIjx2YXJpYWJsZURlY2xhcmF0b3JzUmVzdD4iKTsKICAgICAgICAgICAgdmFyaWFibGVEZWNsYXJhdG9yc1Jlc3QuYWRkKHZhcmlhYmxlRGVjbGFyYXRvclJlc3QoKSk7CiAgICAgICAgICAgIHZhcmlhYmxlRGVjbGFyYXRvcnNSZXN0LmFkZChyZXBldGl0aW9uKHNlcXVlbmNlKCI8dmFyaWFibGVEZWNsYXJhdG9yc1Jlc3QkMT4iKQogICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCcsJykpCiAgICAgICAgICAgICAgICAuYWRkKHZhcmlhYmxlRGVjbGFyYXRvcigpKQogICAgICAgICAgICApKTsKICAgICAgICByZXR1cm4gdmFyaWFibGVEZWNsYXJhdG9yc1Jlc3Q7CiAgICB9CgogICAgLyoqIENvbnN0YW50RGVjbGFyYXRvcnNSZXN0OgogICAgICogICAgICBDb25zdGFudERlY2xhcmF0b3JSZXN0IHssICAgQ29uc3RhbnREZWNsYXJhdG9yIH0KICAgICAqLwogICAgcHVibGljIFBhcnNlciBjb25zdGFudERlY2xhcmF0b3JzUmVzdCgpIHsKICAgICAgICBsb2coImNvbnN0YW50RGVjbGFyYXRvcnNSZXN0Iik7CiAgICAgICAgaWYgKGNvbnN0YW50RGVjbGFyYXRvcnNSZXN0ICE9IG51bGwpIHJldHVybiBjb25zdGFudERlY2xhcmF0b3JzUmVzdDsKICAgICAgICBjb25zdGFudERlY2xhcmF0b3JzUmVzdCA9IHNlcXVlbmNlKCI8Y29uc3RhbnREZWNsYXJhdG9yc1Jlc3Q+Iik7CiAgICAgICAgICAgIGNvbnN0YW50RGVjbGFyYXRvcnNSZXN0LmFkZChjb25zdGFudERlY2xhcmF0b3JSZXN0KCkpOwogICAgICAgICAgICBjb25zdGFudERlY2xhcmF0b3JzUmVzdC5hZGQocmVwZXRpdGlvbihzZXF1ZW5jZSgiPGNvbnN0YW50RGVjbGFyYXRvcnNSZXN0JDE+IikKICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnLCcpKQogICAgICAgICAgICAgICAgLmFkZChjb25zdGFudERlY2xhcmF0b3IoKSkKICAgICAgICAgICAgKSk7CiAgICAgICAgcmV0dXJuIGNvbnN0YW50RGVjbGFyYXRvcnNSZXN0OwogICAgfQoKICAgIC8qKiBWYXJpYWJsZURlY2xhcmF0b3I6CiAgICAgKiAgICAgIElkZW50aWZpZXIgVmFyaWFibGVEZWNsYXJhdG9yUmVzdAogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIHZhcmlhYmxlRGVjbGFyYXRvcigpIHsKICAgICAgICBsb2coInZhcmlhYmxlRGVjbGFyYXRvciIpOwogICAgICAgIGlmICh2YXJpYWJsZURlY2xhcmF0b3IgIT0gbnVsbCkgcmV0dXJuIHZhcmlhYmxlRGVjbGFyYXRvcjsKICAgICAgICB2YXJpYWJsZURlY2xhcmF0b3IgPSBzZXF1ZW5jZSgiPHZhcmlhYmxlRGVjbGFyYXRvcj4iKTsKICAgICAgICB2YXJpYWJsZURlY2xhcmF0b3IuYWRkKGlkZW50aWZpZXIoKSk7CiAgICAgICAgdmFyaWFibGVEZWNsYXJhdG9yLmFkZCh2YXJpYWJsZURlY2xhcmF0b3JSZXN0KCkpOwogICAgICAgIHJldHVybiB2YXJpYWJsZURlY2xhcmF0b3I7CiAgICB9CgogICAgLyoqIENvbnN0YW50RGVjbGFyYXRvcjoKICAgICAqICAgICAgSWRlbnRpZmllciBDb25zdGFudERlY2xhcmF0b3JSZXN0CiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgY29uc3RhbnREZWNsYXJhdG9yKCkgewogICAgICAgIGxvZygiY29uc3RhbnREZWNsYXJhdG9yIik7CiAgICAgICAgaWYgKGNvbnN0YW50RGVjbGFyYXRvciAhPSBudWxsKSByZXR1cm4gY29uc3RhbnREZWNsYXJhdG9yOwogICAgICAgIGNvbnN0YW50RGVjbGFyYXRvciA9IHNlcXVlbmNlKCI8Y29uc3RhbnREZWNsYXJhdG9yPiIpOwogICAgICAgICAgICBjb25zdGFudERlY2xhcmF0b3IuYWRkKGlkZW50aWZpZXIoKSk7CiAgICAgICAgICAgIGNvbnN0YW50RGVjbGFyYXRvci5hZGQoY29uc3RhbnREZWNsYXJhdG9yUmVzdCgpKTsKICAgICAgICByZXR1cm4gY29uc3RhbnREZWNsYXJhdG9yOwogICAgfQoKICAgIC8qKiBWYXJpYWJsZURlY2xhcmF0b3JSZXN0OgogICAgICogICAgICBCcmFja2V0c09wdCBbID0gICBWYXJpYWJsZUluaXRpYWxpemVyXQogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIHZhcmlhYmxlRGVjbGFyYXRvclJlc3QoKSB7CiAgICAgICAgbG9nKCJ2YXJpYWJsZURlY2xhcmF0b3JSZXN0Iik7CiAgICAgICAgaWYgKHZhcmlhYmxlRGVjbGFyYXRvclJlc3QgIT0gbnVsbCkgcmV0dXJuIHZhcmlhYmxlRGVjbGFyYXRvclJlc3Q7CiAgICAgICAgdmFyaWFibGVEZWNsYXJhdG9yUmVzdCA9IHNlcXVlbmNlKCI8dmFyaWFibGVEZWNsYXJhdG9yUmVzdD4iKTsKICAgICAgICAgICAgdmFyaWFibGVEZWNsYXJhdG9yUmVzdC5hZGQoYnJhY2tldHNPcHQoKSk7CiAgICAgICAgICAgIHZhcmlhYmxlRGVjbGFyYXRvclJlc3QuYWRkKHplcm9Pck9uZShzZXF1ZW5jZSgiPHZhcmlhYmxlRGVjbGFyYXRvclJlc3QkMT4iKQogICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCc9JykpCiAgICAgICAgICAgICAgICAuYWRkKHZhcmlhYmxlSW5pdGlhbGl6ZXIoKSkKICAgICAgICAgICAgKSk7CiAgICAgICAgcmV0dXJuIHZhcmlhYmxlRGVjbGFyYXRvclJlc3Q7CiAgICB9CgogICAgLyoqIENvbnN0YW50RGVjbGFyYXRvclJlc3Q6CiAgICAgKiAgICAgIEJyYWNrZXRzT3B0ID0gICBWYXJpYWJsZUluaXRpYWxpemVyCiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgY29uc3RhbnREZWNsYXJhdG9yUmVzdCgpIHsKICAgICAgICBsb2coImNvbnN0YW50RGVjbGFyYXRvclJlc3QiKTsKICAgICAgICBpZiAoY29uc3RhbnREZWNsYXJhdG9yUmVzdCAhPSBudWxsKSByZXR1cm4gY29uc3RhbnREZWNsYXJhdG9yUmVzdDsKICAgICAgICBjb25zdGFudERlY2xhcmF0b3JSZXN0ID0gc2VxdWVuY2UoIjxjb25zdGFudERlY2xhcmF0b3JSZXN0PiIpOwogICAgICAgICAgICBjb25zdGFudERlY2xhcmF0b3JSZXN0LmFkZChicmFja2V0c09wdCgpKTsKICAgICAgICAgICAgY29uc3RhbnREZWNsYXJhdG9yUmVzdC5hZGQobmV3IFN5bWJvbCgnPScpKTsKICAgICAgICAgICAgY29uc3RhbnREZWNsYXJhdG9yUmVzdC5hZGQodmFyaWFibGVJbml0aWFsaXplcigpKTsKICAgICAgICByZXR1cm4gY29uc3RhbnREZWNsYXJhdG9yUmVzdDsKICAgIH0KCiAgICAvKiogVmFyaWFibGVEZWNsYXJhdG9ySWQ6CiAgICAgKiAgICAgIElkZW50aWZpZXIgQnJhY2tldHNPcHQKICAgICAqLwogICAgcHVibGljIFBhcnNlciB2YXJpYWJsZURlY2xhcmF0b3JJZCgpIHsKICAgICAgICBsb2coInZhcmlhYmxlRGVjbGFyYXRvcklkIik7CiAgICAgICAgaWYgKHZhcmlhYmxlRGVjbGFyYXRvcklkICE9IG51bGwpIHJldHVybiB2YXJpYWJsZURlY2xhcmF0b3JJZDsKICAgICAgICB2YXJpYWJsZURlY2xhcmF0b3JJZCA9ICBzZXF1ZW5jZSgiPHZhcmlhYmxlRGVjbGFyYXRvcklkPiIpOwogICAgICAgICAgICB2YXJpYWJsZURlY2xhcmF0b3JJZC5hZGQoaWRlbnRpZmllcigpKTsKICAgICAgICAgICAgdmFyaWFibGVEZWNsYXJhdG9ySWQuYWRkKGJyYWNrZXRzT3B0KCkpOwogICAgICAgIHJldHVybiB2YXJpYWJsZURlY2xhcmF0b3JJZDsKICAgIH0KCiAgICAvKiogQ29tcGlsYXRpb25Vbml0OgogICAgICogICAgICBbQW5ub3RhdGlvbnMgb3B0IHBhY2thZ2UgUXVhbGlmaWVkSWRlbnRpZmllciA7ICBdIHtJbXBvcnREZWNsYXJhdGlvbn0ge1R5cGVEZWNsYXJhdGlvbn0KICAgICAqLwogICAgcHVibGljIFBhcnNlciBjb21waWxhdGlvblVuaXQoKSB7CiAgICAgICAgbG9nKCJjb21waWxhdGlvblVuaXQiKTsKICAgICAgICBpZiAoY29tcGlsYXRpb25Vbml0ICE9IG51bGwpIHJldHVybiBjb21waWxhdGlvblVuaXQ7CiAgICAgICAgY29tcGlsYXRpb25Vbml0ID0gc2VxdWVuY2UoIjxjb21waWxhdGlvblVuaXQ+Iik7CiAgICAgICAgICAgIGNvbXBpbGF0aW9uVW5pdC5hZGQoemVyb09yT25lKAogICAgICAgICAgICAgICAgc2VxdWVuY2UoIjxjb21waWxhdGlvblVuaXQkMT4iKQogICAgICAgICAgICAgICAgICAgIC8vdG9kbyAuYWRkKHplcm9Pck9uZShhbm5vdGF0aW9ucygpKSkKICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBMaXRlcmFsKCJwYWNrYWdlIikpCiAgICAgICAgICAgICAgICAgICAgLmFkZChxdWFsaWZpZWRJZGVudGlmaWVyKCkpCiAgICAgICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCc7JykpCiAgICAgICAgICAgICkpOwogICAgICAgICAgICBjb21waWxhdGlvblVuaXQuYWRkKHJlcGV0aXRpb24oaW1wb3J0RGVjbGFyYXRpb24oKSkpOwogICAgICAgICAgICBjb21waWxhdGlvblVuaXQuYWRkKHJlcGV0aXRpb24odHlwZURlY2xhcmF0aW9uKCkpKTsKICAgICAgICByZXR1cm4gY29tcGlsYXRpb25Vbml0OwogICAgfQoKICAgIC8qKiBJbXBvcnREZWNsYXJhdGlvbjoKICAgICAqICAgICAgaW1wb3J0IFtzdGF0aWNdIElkZW50aWZpZXIgeyAuICAgSWRlbnRpZmllciB9IFsgIC4qICAgXTsKICAgICAqLwogICAgcHVibGljIFBhcnNlciBpbXBvcnREZWNsYXJhdGlvbigpIHsKICAgICAgICBsb2coImltcG9ydERlY2xhcmF0aW9uIik7CiAgICAgICAgaWYgKGltcG9ydERlY2xhcmF0aW9uICE9IG51bGwpIHJldHVybiBpbXBvcnREZWNsYXJhdGlvbjsKICAgICAgICBpbXBvcnREZWNsYXJhdGlvbiA9IHNlcXVlbmNlKCI8aW1wb3J0RGVjbGFyYXRpb24+Iik7CiAgICAgICAgICAgIGltcG9ydERlY2xhcmF0aW9uLmFkZChuZXcgTGl0ZXJhbCgiaW1wb3J0IikpOwogICAgICAgICAgICBpbXBvcnREZWNsYXJhdGlvbi5hZGQoemVyb09yT25lKG5ldyBMaXRlcmFsKCJzdGF0aWMiKSkpOwogICAgICAgICAgICBpbXBvcnREZWNsYXJhdGlvbi5hZGQoaWRlbnRpZmllcigpKTsKICAgICAgICAgICAgaW1wb3J0RGVjbGFyYXRpb24uYWRkKHJlcGV0aXRpb24oc2VxdWVuY2UoIjxpbXBvcnREZWNsYXJhdGlvbiQxPiIpCiAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJy4nKSkKICAgICAgICAgICAgICAgIC5hZGQoaWRlbnRpZmllcigpKQogICAgICAgICAgICApKTsKICAgICAgICAgICAgaW1wb3J0RGVjbGFyYXRpb24uYWRkKHplcm9Pck9uZShuZXcgU3ltYm9sKCIuKiIpKSk7CiAgICAgICAgICAgIGltcG9ydERlY2xhcmF0aW9uLmFkZChuZXcgU3ltYm9sKCc7JykpOwogICAgICAgIHJldHVybiBpbXBvcnREZWNsYXJhdGlvbjsKICAgIH0KCiAgICAvKiogVHlwZURlY2xhcmF0aW9uOgogICAgICogICAgICBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24KICAgICAqICAgICAgOwogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIHR5cGVEZWNsYXJhdGlvbigpIHsKICAgICAgICBsb2coInR5cGVEZWNsYXJhdGlvbiIpOwogICAgICAgIGlmICh0eXBlRGVjbGFyYXRpb24gIT0gbnVsbCkgcmV0dXJuIHR5cGVEZWNsYXJhdGlvbjsKICAgICAgICB0eXBlRGVjbGFyYXRpb24gPSBhbHRlcm5hdGlvbigiPHR5cGVEZWNsYXJhdGlvbj4iKTsKICAgICAgICAgICAgdHlwZURlY2xhcmF0aW9uLmFkZChjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24oKSk7CiAgICAgICAgICAgIHR5cGVEZWNsYXJhdGlvbi5hZGQobmV3IFN5bWJvbCgnOycpKTsKICAgICAgICByZXR1cm4gdHlwZURlY2xhcmF0aW9uOwogICAgfQoKICAgIC8qKiBDbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb246CiAgICAgKiAgICAgIE1vZGlmaWVyc09wdCAoQ2xhc3NEZWNsYXJhdGlvbiB8IEludGVyZmFjZURlY2xhcmF0aW9uKQogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbigpIHsKICAgICAgICBsb2coImNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbiIpOwogICAgICAgIGlmIChjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gIT0gbnVsbCkgcmV0dXJuIGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbjsKICAgICAgICBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24gPSBzZXF1ZW5jZSgiPGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbj4iKTsKICAgICAgICBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uYWRkKG1vZGlmaWVyc09wdCgpKTsKICAgICAgICBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb24uYWRkKGFsdGVybmF0aW9uKCI8Y2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uJGE+IikKICAgICAgICAgICAgICAgIC5hZGQoY2xhc3NEZWNsYXJhdGlvbigpKQogICAgICAgICAgICAgICAgLmFkZChpbnRlcmZhY2VEZWNsYXJhdGlvbigpKQogICAgICAgICAgICApOwogICAgICAgIHJldHVybiBjbGFzc09ySW50ZXJmYWNlRGVjbGFyYXRpb247CiAgICB9CgogICAgLyoqIENsYXNzRGVjbGFyYXRpb246CiAgICAgKiAgICAgIE5vcm1hbENsYXNzRGVjbGFyYXRpb24gICAgICAgICAgIC8vIG5vdGUgZXJyb3IgaW4gSkxTpDE4IG1ha2VzIHRoaXMgbG9vayBsaWtlIGEgU2VxdWVuY2Ugbm90IGFuIEFsdGVybmF0aW9uCiAgICAgKiAgICAgIEVudW1EZWNsYXJhdGlvbgogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIGNsYXNzRGVjbGFyYXRpb24oKSB7CiAgICAgICAgbG9nKCJjbGFzc0RlY2xhcmF0aW9uIik7CiAgICAgICAgaWYgKGNsYXNzRGVjbGFyYXRpb24gIT0gbnVsbCkgcmV0dXJuIGNsYXNzRGVjbGFyYXRpb247CiAgICAgICAgY2xhc3NEZWNsYXJhdGlvbiA9IGFsdGVybmF0aW9uKCI8Y2xhc3NEZWNsYXJhdGlvbj4iKTsKICAgICAgICBjbGFzc0RlY2xhcmF0aW9uLmFkZChub3JtYWxDbGFzc0RlY2xhcmF0aW9uKCkpOwogICAgICAgIC8vdG9kbyBjbGFzc0RlY2xhcmF0aW9uLmFkZChlbnVtRGVjbGFyYXRpb24oKSk7CiAgICAgICAgcmV0dXJuIGNsYXNzRGVjbGFyYXRpb247CiAgICB9CgogICAgLyoqIE5vcm1hbENsYXNzRGVjbGFyYXRpb246CiAgICAgKiAgICAgIGNsYXNzIElkZW50aWZpZXIgVHlwZVBhcmFtZXRlcnMgb3B0IFtleHRlbmRzIFR5cGVdIFtpbXBsZW1lbnRzIFR5cGVMaXN0XSBDbGFzc0JvZHkKICAgICAqLwogICAgcHVibGljIFBhcnNlciBub3JtYWxDbGFzc0RlY2xhcmF0aW9uKCkgewogICAgICAgIGxvZygibm9ybWFsQ2xhc3NEZWNsYXJhdGlvbiIpOwogICAgICAgIGlmIChub3JtYWxDbGFzc0RlY2xhcmF0aW9uICE9IG51bGwpIHJldHVybiBub3JtYWxDbGFzc0RlY2xhcmF0aW9uOwogICAgICAgIG5vcm1hbENsYXNzRGVjbGFyYXRpb24gPSBzZXF1ZW5jZSgiPG5vcm1hbENsYXNzRGVjbGFyYXRpb24+Iik7CiAgICAgICAgICAgIG5vcm1hbENsYXNzRGVjbGFyYXRpb24uYWRkKG5ldyBMaXRlcmFsKCJjbGFzcyIpKTsKICAgICAgICAgICAgbm9ybWFsQ2xhc3NEZWNsYXJhdGlvbi5hZGQoaWRlbnRpZmllcigpKTsKICAgICAgICAgICAgbm9ybWFsQ2xhc3NEZWNsYXJhdGlvbi5hZGQoemVyb09yT25lKHR5cGVQYXJhbWV0ZXJzKCkpKTsKICAgICAgICAgICAgbm9ybWFsQ2xhc3NEZWNsYXJhdGlvbi5hZGQoemVyb09yT25lKHNlcXVlbmNlKCI8bm9ybWFsQ2xhc3NEZWNsYXJhdGlvbiQxPiIpCiAgICAgICAgICAgICAgICAuYWRkKG5ldyBMaXRlcmFsKCJleHRlbmRzIikpCiAgICAgICAgICAgICAgICAuYWRkKHR5cGUoKSkKICAgICAgICAgICAgKSk7CiAgICAgICAgICAgIG5vcm1hbENsYXNzRGVjbGFyYXRpb24uYWRkKHplcm9Pck9uZShzZXF1ZW5jZSgiPG5vcm1hbENsYXNzRGVjbGFyYXRpb24kMj4iKQogICAgICAgICAgICAgICAgLmFkZChuZXcgTGl0ZXJhbCgiaW1wbGVtZW50cyIpKQogICAgICAgICAgICAgICAgLmFkZCh0eXBlTGlzdCgpKQogICAgICAgICAgICApKTsKICAgICAgICAgICAgbm9ybWFsQ2xhc3NEZWNsYXJhdGlvbi5hZGQoY2xhc3NCb2R5KCkpOwogICAgICAgIHJldHVybiBub3JtYWxDbGFzc0RlY2xhcmF0aW9uOwogICAgfQoKICAgIC8qKiBUeXBlUGFyYW1ldGVyczoKICAgICAqICAgICAgPCBUeXBlUGFyYW1ldGVyIHssIFR5cGVQYXJhbWV0ZXJ9PgogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIHR5cGVQYXJhbWV0ZXJzKCkgewogICAgICAgIGxvZygidHlwZVBhcmFtZXRlcnMiKTsKICAgICAgICBpZiAodHlwZVBhcmFtZXRlcnMgIT0gbnVsbCkgcmV0dXJuIHR5cGVQYXJhbWV0ZXJzOwogICAgICAgIHR5cGVQYXJhbWV0ZXJzID0gc2VxdWVuY2UoIjx0eXBlUGFyYW1ldGVycz4iKTsKICAgICAgICAgICAgdHlwZVBhcmFtZXRlcnMuYWRkKG5ldyBTeW1ib2woJzwnKSk7CiAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzLmFkZCh0eXBlUGFyYW1ldGVyKCkpOwogICAgICAgICAgICB0eXBlUGFyYW1ldGVycy5hZGQocmVwZXRpdGlvbihzZXF1ZW5jZSgiPHR5cGVQYXJhbWV0ZXJzJDE+IikKICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnLCcpKQogICAgICAgICAgICAgICAgLmFkZCh0eXBlUGFyYW1ldGVyKCkpCiAgICAgICAgICAgICkpOwogICAgICAgICAgICB0eXBlUGFyYW1ldGVycy5hZGQobmV3IFN5bWJvbCgnPicpKTsKICAgICAgICByZXR1cm4gdHlwZVBhcmFtZXRlcnM7CiAgICB9CgogICAgLyoqIFR5cGVQYXJhbWV0ZXI6CiAgICAgKiAgICAgIElkZW50aWZpZXIgW2V4dGVuZHNCb3VuZF0KICAgICAqLwogICAgcHVibGljIFBhcnNlciB0eXBlUGFyYW1ldGVyKCkgewogICAgICAgIGxvZygidHlwZVBhcmFtZXRlciIpOwogICAgICAgIGlmICh0eXBlUGFyYW1ldGVyICE9IG51bGwpIHJldHVybiB0eXBlUGFyYW1ldGVyOwogICAgICAgIHR5cGVQYXJhbWV0ZXIgPSBzZXF1ZW5jZSgiPHR5cGVQYXJhbWV0ZXI+Iik7CiAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIuYWRkKGlkZW50aWZpZXIoKSk7CiAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIuYWRkKHplcm9Pck9uZShzZXF1ZW5jZSgiPHR5cGVQYXJhbWV0ZXIkMT4iKQogICAgICAgICAgICAgICAgLmFkZChuZXcgTGl0ZXJhbCgiZXh0ZW5kcyIpKQogICAgICAgICAgICAgICAgLmFkZChib3VuZCgpKQogICAgICAgICAgICApKTsKICAgICAgICByZXR1cm4gdHlwZVBhcmFtZXRlcjsKICAgIH0KCiAgICAvKiogQm91bmQ6CiAgICAgKiAgICAgIFR5cGUgeyZUeXBlfQogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIGJvdW5kKCkgewogICAgICAgIGxvZygiYm91bmQiKTsKICAgICAgICBpZiAoYm91bmQgIT0gbnVsbCkgcmV0dXJuIGJvdW5kOwogICAgICAgIGJvdW5kID0gc2VxdWVuY2UoIjxib3VuZD4iKTsKICAgICAgICAgICAgYm91bmQuYWRkKHR5cGUoKSk7CiAgICAgICAgICAgIGJvdW5kLmFkZChyZXBldGl0aW9uKHNlcXVlbmNlKCI8Ym91bmQkMT4iKQogICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCcmJykpCiAgICAgICAgICAgICAgICAuYWRkKHR5cGUoKSkKICAgICAgICAgICAgKSk7CiAgICAgICAgcmV0dXJuIGJvdW5kOwogICAgfQoKICAgIC8qKiBFbnVtRGVjbGFyYXRpb246CiAgICAgKiAgICAgIENsYXNzTW9kaWZpZXJzIG9wdCBlbnVtIElkZW50aWZpZXJbaW1wbGVtZW50cyBUeXBlTGlzdF0gRW51bUJvZHkKICAgICAqLwogICAgcHVibGljIFBhcnNlciBlbnVtRGVjbGFyYXRpb24oKSB7CiAgICAgICAgbG9nKCJlbnVtRGVjbGFyYXRpb24iKTsKICAgICAgICBpZiAoZW51bURlY2xhcmF0aW9uICE9IG51bGwpIHJldHVybiBlbnVtRGVjbGFyYXRpb247CiAgICAgICAgZW51bURlY2xhcmF0aW9uID0gc2VxdWVuY2UoIjxlbnVtRGVjbGFyYXRpb24+Iik7CiAgICAgICAgICAgIGVudW1EZWNsYXJhdGlvbi5hZGQoemVyb09yT25lKGNsYXNzTW9kaWZpZXJzKCkpKTsKICAgICAgICAgICAgZW51bURlY2xhcmF0aW9uLmFkZChuZXcgTGl0ZXJhbCgiZW51bSIpKTsKICAgICAgICAgICAgZW51bURlY2xhcmF0aW9uLmFkZChpZGVudGlmaWVyKCkpOwogICAgICAgICAgICBlbnVtRGVjbGFyYXRpb24uYWRkKHplcm9Pck9uZShzZXF1ZW5jZSgiPGVudW1EZWNsYXJhdGlvbiQxPiIpCiAgICAgICAgICAgICAgICAuYWRkKG5ldyBMaXRlcmFsKCJpbXBsZW1lbnRzIikpCiAgICAgICAgICAgICAgICAuYWRkKHR5cGVMaXN0KCkpCiAgICAgICAgICAgICkpOwogICAgICAgICAgICBlbnVtRGVjbGFyYXRpb24uYWRkKGVudW1Cb2R5KCkpOwogICAgICAgIHJldHVybiBlbnVtRGVjbGFyYXRpb247CiAgICB9CgogICAgLyoqIEVudW1Cb2R5OgogICAgICogICAgICB7IEVudW1Db25zdGFudHMgb3B0ICxvcHQgRW51bUJvZHlEZWNsYXJhdGlvbnMgb3B0IH0KICAgICAqLwogICAgcHVibGljIFBhcnNlciBlbnVtQm9keSgpIHsKICAgICAgICBsb2coImVudW1Cb2R5Iik7CiAgICAgICAgaWYgKGVudW1Cb2R5ICE9IG51bGwpIHJldHVybiBlbnVtQm9keTsKICAgICAgICBlbnVtQm9keSA9IHNlcXVlbmNlKCI8ZW51bUJvZHk+Iik7CiAgICAgICAgICAgIGVudW1Cb2R5LmFkZChuZXcgU3ltYm9sKCd7JykpOwogICAgICAgICAgICBlbnVtQm9keS5hZGQoemVyb09yT25lKGVudW1Db25zdGFudHMoKSkpOwogICAgICAgICAgICBlbnVtQm9keS5hZGQoemVyb09yT25lKG5ldyBTeW1ib2woJywnKSkpOwogICAgICAgICAgICBlbnVtQm9keS5hZGQoemVyb09yT25lKGVudW1Cb2R5RGVjbGFyYXRpb25zKCkpKTsKICAgICAgICAgICAgZW51bUJvZHkuYWRkKG5ldyBTeW1ib2woJ30nKSk7CiAgICAgICAgcmV0dXJuIGVudW1Cb2R5OwogICAgfQoKICAgIC8qKiBFbnVtQ29uc3RhbnRzOgogICAgICogICAgICBFbnVtQ29uc3RhbnQKICAgICAqICAgICAgRW51bUNvbnN0YW50cyAsIEVudW1Db25zdGFudAogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIGVudW1Db25zdGFudHMoKSB7CiAgICAgICAgbG9nKCJlbnVtQ29uc3RhbnRzIik7CiAgICAgICAgaWYgKGVudW1Db25zdGFudHMgIT0gbnVsbCkgcmV0dXJuIGVudW1Db25zdGFudHM7CiAgICAgICAgZW51bUNvbnN0YW50cyA9IGFsdGVybmF0aW9uKCI8ZW51bUNvbnN0YW50cz4iKTsKICAgICAgICAgICAgZW51bUNvbnN0YW50cy5hZGQoZW51bUNvbnN0YW50KCkpOwogICAgICAgICAgICBlbnVtQ29uc3RhbnRzLmFkZChzZXF1ZW5jZSgiPGVudW1Db25zdGFudHMkMT4iKQogICAgICAgICAgICAgICAgLmFkZChlbnVtQ29uc3RhbnRzKCkpCiAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJywnKSkKICAgICAgICAgICAgICAgIC5hZGQoZW51bUNvbnN0YW50KCkpCiAgICAgICAgICAgICk7CiAgICAgICAgcmV0dXJuIGVudW1Db25zdGFudHM7CiAgICB9CgogICAgLyoqIEVudW1Db25zdGFudDoKICAgICAqICAgICAgQW5ub3RhdGlvbnMgSWRlbnRpZmllciBFbnVtQXJndW1lbnRzIG9wdCBDbGFzc0JvZHkgb3B0CiAgICAgKgogICAgICogTi5CLiBKUlIgY2hhbmdlZCB0byBFbnVtQXJndW1lbnRzIC0gY2hlY2sgd2l0aCBKTFN2MyBzcGVjIHJldmlzaW9ucyAoYnVnIHJlcG9ydGVkIGluIGdyYW1tYXIpCiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgZW51bUNvbnN0YW50KCkgewogICAgICAgIGxvZygiZW51bUNvbnN0YW50Iik7CiAgICAgICAgaWYgKGVudW1Db25zdGFudCAhPSBudWxsKSByZXR1cm4gZW51bUNvbnN0YW50OwogICAgICAgIGVudW1Db25zdGFudCA9IHNlcXVlbmNlKCI8ZW51bUNvbnN0YW50PiIpOwogICAgICAgICAgICBlbnVtQ29uc3RhbnQuYWRkKGFubm90YXRpb25zKCkpOwogICAgICAgICAgICBlbnVtQ29uc3RhbnQuYWRkKGlkZW50aWZpZXIoKSk7CiAgICAgICAgICAgIGVudW1Db25zdGFudC5hZGQoemVyb09yT25lKGVudW1Bcmd1bWVudHMoKSkpOwogICAgICAgICAgICBlbnVtQ29uc3RhbnQuYWRkKHplcm9Pck9uZShjbGFzc0JvZHkoKSkpOwogICAgICAgIHJldHVybiBlbnVtQ29uc3RhbnQ7CiAgICB9CgogICAgLyoqIEVudW1Bcmd1bWVudHM6CiAgICAgKiAgICAgICggQXJndW1lbnRMaXN0b3B0ICkKICAgICAqCiAgICAgKiBOLkIuIEpSUiBjaGFuZ2VkIHRvIEVudW1Bcmd1bWVudHMgLSBjaGVjayB3aXRoIEpMU3YzIHNwZWMgcmV2aXNpb25zIChidWcgcmVwb3J0ZWQgaW4gZ3JhbW1hcikKICAgICAqLwogICAgcHVibGljIFBhcnNlciBlbnVtQXJndW1lbnRzKCkgewogICAgICAgIGxvZygiZW51bUFyZ3VtZW50cyIpOwogICAgICAgIGlmIChlbnVtQXJndW1lbnRzICE9IG51bGwpIHJldHVybiBlbnVtQXJndW1lbnRzOwogICAgICAgIGVudW1Bcmd1bWVudHMgPSBzZXF1ZW5jZSgiPGVudW1Bcmd1bWVudHM+Iik7CiAgICAgICAgICAgIGVudW1Bcmd1bWVudHMuYWRkKG5ldyBTeW1ib2woJygnKSk7CiAgICAgICAgICAgIGVudW1Bcmd1bWVudHMuYWRkKHplcm9Pck9uZShhcmd1bWVudExpc3QoKSkpOwogICAgICAgICAgICBlbnVtQXJndW1lbnRzLmFkZChuZXcgU3ltYm9sKCcpJykpOwogICAgICAgIHJldHVybiBlbnVtQXJndW1lbnRzOwogICAgfQoKICAgIC8qKiBFbnVtQm9keURlY2xhcmF0aW9uczoKICAgICAqICAgICAgOyBDbGFzc0JvZHlEZWNsYXJhdGlvbnNvcHQKICAgICAqCiAgICAgKiB0b2RvIHRoYXQgc2VtaWNvbG9uIGxvb2tzIGEgYml0IGRvZGd5Li4uIGplegogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIGVudW1Cb2R5RGVjbGFyYXRpb25zKCkgewogICAgICAgIGxvZygiZW51bUJvZHlEZWNsYXJhdGlvbnMiKTsKICAgICAgICBpZiAoZW51bUJvZHlEZWNsYXJhdGlvbnMgIT0gbnVsbCkgcmV0dXJuIGVudW1Cb2R5RGVjbGFyYXRpb25zOwogICAgICAgIGVudW1Cb2R5RGVjbGFyYXRpb25zID0gc2VxdWVuY2UoIjxlbnVtQm9keURlY2xhcmF0aW9ucz4iKTsKICAgICAgICAgICAgZW51bUJvZHlEZWNsYXJhdGlvbnMuYWRkKG5ldyBTeW1ib2woJzsnKSk7CiAgICAgICAgICAgIGVudW1Cb2R5RGVjbGFyYXRpb25zLmFkZCh6ZXJvT3JPbmUoY2xhc3NCb2R5RGVjbGFyYXRpb25zKCkpKTsKICAgICAgICByZXR1cm4gZW51bUJvZHlEZWNsYXJhdGlvbnM7CiAgICB9CgogICAgLyoqIEludGVyZmFjZURlY2xhcmF0aW9uOgogICAgICogICAgICBOb3JtYWxJbnRlcmZhY2VEZWNsYXJhdGlvbgogICAgICogICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgaW50ZXJmYWNlRGVjbGFyYXRpb24oKSB7CiAgICAgICAgbG9nKCJpbnRlcmZhY2VEZWNsYXJhdGlvbiIpOwogICAgICAgIGlmIChpbnRlcmZhY2VEZWNsYXJhdGlvbiAhPSBudWxsKSByZXR1cm4gaW50ZXJmYWNlRGVjbGFyYXRpb247CiAgICAgICAgaW50ZXJmYWNlRGVjbGFyYXRpb24gPSBhbHRlcm5hdGlvbigiPGludGVyZmFjZURlY2xhcmF0aW9uPiIpOwogICAgICAgICAgICBpbnRlcmZhY2VEZWNsYXJhdGlvbi5hZGQobm9ybWFsSW50ZXJmYWNlRGVjbGFyYXRpb24oKSk7CiAgICAgICAgICAgIGludGVyZmFjZURlY2xhcmF0aW9uLmFkZChhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKCkpOwogICAgICAgIHJldHVybiBpbnRlcmZhY2VEZWNsYXJhdGlvbjsKICAgIH0KCiAgICAvKiogTm9ybWFsSW50ZXJmYWNlRGVjbGFyYXRpb246CiAgICAgKiAgICAgIGludGVyZmFjZSBJZGVudGlmaWVyIFR5cGVQYXJhbWV0ZXJzIG9wdFtleHRlbmRzIFR5cGVMaXN0XSBJbnRlcmZhY2VCb2R5CiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgbm9ybWFsSW50ZXJmYWNlRGVjbGFyYXRpb24oKSB7CiAgICAgICAgbG9nKCJub3JtYWxJbnRlcmZhY2VEZWNsYXJhdGlvbiIpOwogICAgICAgIGlmIChub3JtYWxJbnRlcmZhY2VEZWNsYXJhdGlvbiAhPSBudWxsKSByZXR1cm4gbm9ybWFsSW50ZXJmYWNlRGVjbGFyYXRpb247CiAgICAgICAgbm9ybWFsSW50ZXJmYWNlRGVjbGFyYXRpb24gPSBzZXF1ZW5jZSgiPG5vcm1hbEludGVyZmFjZURlY2xhcmF0aW9uPiIpOwogICAgICAgICAgICBub3JtYWxJbnRlcmZhY2VEZWNsYXJhdGlvbi5hZGQobmV3IExpdGVyYWwoImludGVyZmFjZSIpKTsKICAgICAgICAgICAgbm9ybWFsSW50ZXJmYWNlRGVjbGFyYXRpb24uYWRkKGlkZW50aWZpZXIoKSk7CiAgICAgICAgICAgIG5vcm1hbEludGVyZmFjZURlY2xhcmF0aW9uLmFkZCh6ZXJvT3JPbmUodHlwZVBhcmFtZXRlcnMoKSkpOwogICAgICAgICAgICBub3JtYWxJbnRlcmZhY2VEZWNsYXJhdGlvbi5hZGQoemVyb09yT25lKHNlcXVlbmNlKCI8bm9ybWFsSW50ZXJmYWNlRGVjbGFyYXRpb24kMT4iKQogICAgICAgICAgICAgICAgLmFkZChuZXcgTGl0ZXJhbCgiZXh0ZW5kcyIpKQogICAgICAgICAgICAgICAgLmFkZCh0eXBlTGlzdCgpKQogICAgICAgICAgICApKTsKICAgICAgICAgICAgbm9ybWFsSW50ZXJmYWNlRGVjbGFyYXRpb24uYWRkKGludGVyZmFjZUJvZHkoKSk7CiAgICAgICAgcmV0dXJuIG5vcm1hbEludGVyZmFjZURlY2xhcmF0aW9uOwogICAgfQoKICAgIC8qKiBUeXBlTGlzdDoKICAgICAqICAgICAgVHlwZSB7ICwgICBUeXBlfQogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIHR5cGVMaXN0KCkgewogICAgICAgIGxvZygidHlwZUxpc3QiKTsKICAgICAgICBpZiAodHlwZUxpc3QgIT0gbnVsbCkgcmV0dXJuIHR5cGVMaXN0OwogICAgICAgIHR5cGVMaXN0ID0gc2VxdWVuY2UoIjx0eXBlTGlzdD4iKTsKICAgICAgICAgICAgdHlwZUxpc3QuYWRkKHR5cGUoKSk7CiAgICAgICAgICAgIHR5cGVMaXN0LmFkZChyZXBldGl0aW9uKHNlcXVlbmNlKCI8dHlwZUxpc3QkMT4iKQogICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCcsJykpCiAgICAgICAgICAgICAgICAuYWRkKHR5cGUoKSkKICAgICAgICAgICAgKSk7CiAgICAgICAgcmV0dXJuIHR5cGVMaXN0OwogICAgfQoKICAgIC8qKiBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOgogICAgICogICAgICBJbnRlcmZhY2VNb2RpZmllcnMgb3B0IEAgaW50ZXJmYWNlIElkZW50aWZpZXIgQW5ub3RhdGlvblR5cGVCb2R5CiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbigpIHsKICAgICAgICBsb2coImFubm90YXRpb25UeXBlRGVjbGFyYXRpb24iKTsKICAgICAgICBpZiAoYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiAhPSBudWxsKSByZXR1cm4gYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKICAgICAgICBhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uID0gc2VxdWVuY2UoIjxhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uPiIpOwogICAgICAgICAgICBhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uLmFkZCh6ZXJvT3JPbmUoaW50ZXJmYWNlTW9kaWZpZXJzKCkpKTsKICAgICAgICAgICAgYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbi5hZGQobmV3IFN5bWJvbCgnQCcpKTsKICAgICAgICAgICAgYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbi5hZGQobmV3IExpdGVyYWwoImludGVyZmFjZSIpKTsgLy8gQHRvZG8gaXMgdGhpcyBjb3JyZWN0PwogICAgICAgICAgICBhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uLmFkZChpZGVudGlmaWVyKCkpOwogICAgICAgICAgICBhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uLmFkZChhbm5vdGF0aW9uVHlwZUJvZHkoKSk7CiAgICAgICAgcmV0dXJuIGFubm90YXRpb25UeXBlRGVjbGFyYXRpb247CiAgICB9CgogICAgLyoqIEFubm90YXRpb25UeXBlQm9keToKICAgICAqICAgICAgeyBBbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbnMgfQogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIGFubm90YXRpb25UeXBlQm9keSgpIHsKICAgICAgICBsb2coImFubm90YXRpb25UeXBlQm9keSIpOwogICAgICAgIGlmIChhbm5vdGF0aW9uVHlwZUJvZHkgIT0gbnVsbCkgcmV0dXJuIGFubm90YXRpb25UeXBlQm9keTsKICAgICAgICBhbm5vdGF0aW9uVHlwZUJvZHkgPSBzZXF1ZW5jZSgiPGFubm90YXRpb25UeXBlQm9keT4iKTsKICAgICAgICAgICAgYW5ub3RhdGlvblR5cGVCb2R5LmFkZChuZXcgU3ltYm9sKCd7JykpOwogICAgICAgICAgICBhbm5vdGF0aW9uVHlwZUJvZHkuYWRkKGFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9ucygpKTsKICAgICAgICAgICAgYW5ub3RhdGlvblR5cGVCb2R5LmFkZChuZXcgU3ltYm9sKCd9JykpOwogICAgICAgIHJldHVybiBhbm5vdGF0aW9uVHlwZUJvZHk7CiAgICB9CgogICAgLyoqIEFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9uczoKICAgICAqICAgICAgQW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb24KICAgICAqICAgICAgQW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb25zIEFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgYW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb25zKCkgewogICAgICAgIGxvZygiYW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb25zIik7CiAgICAgICAgaWYgKGFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9ucyAhPSBudWxsKSByZXR1cm4gYW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb25zOwogICAgICAgIGFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9ucyA9IGFsdGVybmF0aW9uKCI8YW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb25zPiIpOwogICAgICAgICAgICBhbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbnMuYWRkKGFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9uKCkpOwogICAgICAgICAgICBhbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbnMuYWRkKHNlcXVlbmNlKCI8YW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb25zJDE+IikKICAgICAgICAgICAgICAgIC5hZGQoYW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb25zKCkpCiAgICAgICAgICAgICAgICAuYWRkKGFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9uKCkpCiAgICAgICAgICAgICk7CiAgICAgICAgcmV0dXJuIGFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9uczsKICAgIH0KCiAgICAvKiogQW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb246CiAgICAgKiAgICAgIEFic3RyYWN0TWV0aG9kTW9kaWZpZXJzIG9wdCBUeXBlIElkZW50aWZpZXIgKCApIERlZmF1bHRWYWx1ZW9wdCA7CiAgICAgKiAgICAgIENvbnN0YW50RGVjbGFyYXRpb24KICAgICAqICAgICAgQ2xhc3NEZWNsYXJhdGlvbgogICAgICogICAgICBJbnRlcmZhY2VEZWNsYXJhdGlvbgogICAgICogICAgICBFbnVtRGVjbGFyYXRpb24KICAgICAqICAgICAgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbgogICAgICogICAgICA7CiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgYW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb24oKSB7CiAgICAgICAgbG9nKCJhbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbiIpOwogICAgICAgIGlmIChhbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbiAhPSBudWxsKSByZXR1cm4gYW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb247CiAgICAgICAgYW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb24gPSBhbHRlcm5hdGlvbigiPGFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9uPiIpOwogICAgICAgICAgICBhbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbi5hZGQoc2VxdWVuY2UoIjxhbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbiQxPiIpCiAgICAgICAgICAgICAgICAuYWRkKHplcm9Pck9uZShhYnN0cmFjdE1ldGhvZE1vZGlmaWVycygpKSkKICAgICAgICAgICAgICAgIC5hZGQodHlwZSgpKQogICAgICAgICAgICAgICAgLmFkZChpZGVudGlmaWVyKCkpCiAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJygnKSkgICAvLyBAdG9kbyAtIGlzIHRoaXMgcmlnaHQKICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnKScpKQogICAgICAgICAgICAgICAgLmFkZCh6ZXJvT3JPbmUoZGVmYXVsdFZhbHVlKCkpKQogICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCc7JykpCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9uLmFkZChjb25zdGFudERlY2xhcmF0aW9uKCkpOwogICAgICAgICAgICBhbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbi5hZGQoY2xhc3NEZWNsYXJhdGlvbigpKTsKICAgICAgICAgICAgYW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb24uYWRkKGludGVyZmFjZURlY2xhcmF0aW9uKCkpOwogICAgICAgICAgICBhbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbi5hZGQoZW51bURlY2xhcmF0aW9uKCkpOwogICAgICAgICAgICBhbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbi5hZGQoYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbigpKTsKICAgICAgICAgICAgYW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb24uYWRkKG5ldyBTeW1ib2woJzsnKSk7CiAgICAgICAgcmV0dXJuIGFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9uOwogICAgfQoKICAgIC8qKiBEZWZhdWx0VmFsdWU6CiAgICAgKiAgICAgIGRlZmF1bHQgRWxlbWVudFZhbHVlCiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgZGVmYXVsdFZhbHVlKCkgewogICAgICAgIGxvZygiZGVmYXVsdFZhbHVlIik7CiAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSByZXR1cm4gZGVmYXVsdFZhbHVlOwogICAgICAgIGRlZmF1bHRWYWx1ZSA9IHNlcXVlbmNlKCI8ZGVmYXVsdFZhbHVlPiIpOwogICAgICAgICAgICBkZWZhdWx0VmFsdWUuYWRkKG5ldyBMaXRlcmFsKCJkZWZhdWx0IikpOwogICAgICAgICAgICBkZWZhdWx0VmFsdWUuYWRkKGVsZW1lbnRWYWx1ZSgpKTsKICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwogICAgfQoKICAgIC8qKiBDbGFzc0JvZHk6CiAgICAgKiAgICAgIHsge0NsYXNzQm9keURlY2xhcmF0aW9ufX0KICAgICAqLwogICAgcHVibGljIFBhcnNlciBjbGFzc0JvZHkoKSB7CiAgICAgICAgbG9nKCJjbGFzc0JvZHkiKTsKICAgICAgICBpZiAoY2xhc3NCb2R5ICE9IG51bGwpIHJldHVybiBjbGFzc0JvZHk7CiAgICAgICAgY2xhc3NCb2R5ID0gc2VxdWVuY2UoIjxjbGFzc0JvZHk+Iik7CiAgICAgICAgICAgIGNsYXNzQm9keS5hZGQobmV3IFN5bWJvbCgneycpKTsKICAgICAgICAgICAgLy90b2RvIGNsYXNzQm9keS5hZGQocmVwZXRpdGlvbihjbGFzc0JvZHlEZWNsYXJhdGlvbigpKSk7CiAgICAgICAgICAgIGNsYXNzQm9keS5hZGQobmV3IFN5bWJvbCgnfScpKTsKICAgICAgICByZXR1cm4gY2xhc3NCb2R5OwogICAgfQoKICAgIC8qKiBJbnRlcmZhY2VCb2R5OgogICAgICogICAgICB7IHtJbnRlcmZhY2VCb2R5RGVjbGFyYXRpb259fQogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIGludGVyZmFjZUJvZHkoKSB7CiAgICAgICAgbG9nKCJpbnRlcmZhY2VCb2R5Iik7CiAgICAgICAgaWYgKGludGVyZmFjZUJvZHkgIT0gbnVsbCkgcmV0dXJuIGludGVyZmFjZUJvZHk7CiAgICAgICAgaW50ZXJmYWNlQm9keSA9IHNlcXVlbmNlKCI8aW50ZXJmYWNlQm9keT4iKTsKICAgICAgICAgICAgaW50ZXJmYWNlQm9keS5hZGQobmV3IFN5bWJvbCgneycpKTsKICAgICAgICAgICAgaW50ZXJmYWNlQm9keS5hZGQocmVwZXRpdGlvbihpbnRlcmZhY2VCb2R5RGVjbGFyYXRpb24oKSkpOwogICAgICAgICAgICBpbnRlcmZhY2VCb2R5LmFkZChuZXcgU3ltYm9sKCd9JykpOwogICAgICAgIHJldHVybiBpbnRlcmZhY2VCb2R5OwogICAgfQoKICAgIC8qKiBDbGFzc0JvZHlEZWNsYXJhdGlvbjoKICAgICAqICAgICAgOwogICAgICogICAgICBbc3RhdGljXSBCbG9jawogICAgICogICAgICBNb2RpZmllcnNPcHQgTWVtYmVyRGVjbAogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIGNsYXNzQm9keURlY2xhcmF0aW9uKCkgewogICAgICAgIGxvZygiY2xhc3NCb2R5RGVjbGFyYXRpb24iKTsKICAgICAgICBpZiAoY2xhc3NCb2R5RGVjbGFyYXRpb24gIT0gbnVsbCkgcmV0dXJuIGNsYXNzQm9keURlY2xhcmF0aW9uOwogICAgICAgIGNsYXNzQm9keURlY2xhcmF0aW9uID0gYWx0ZXJuYXRpb24oIjxjbGFzc0JvZHlEZWNsYXJhdGlvbj4iKTsKICAgICAgICAgICAgY2xhc3NCb2R5RGVjbGFyYXRpb24uYWRkKG5ldyBTeW1ib2woJzsnKSk7CiAgICAgICAgICAgIGNsYXNzQm9keURlY2xhcmF0aW9uLmFkZChzZXF1ZW5jZSgiPGNsYXNzQm9keURlY2xhcmF0aW9uJDE+IikKICAgICAgICAgICAgICAgIC5hZGQoemVyb09yT25lKG5ldyBMaXRlcmFsKCJzdGF0aWMiKSkpCiAgICAgICAgICAgICAgICAuYWRkKGJsb2NrKCkpCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNsYXNzQm9keURlY2xhcmF0aW9uLmFkZChzZXF1ZW5jZSgiPGNsYXNzQm9keURlY2xhcmF0aW9uJDI+IikKICAgICAgICAgICAgICAgIC5hZGQobW9kaWZpZXJzT3B0KCkpCiAgICAgICAgICAgICAgICAuYWRkKG1lbWJlckRlY2woKSkKICAgICAgICAgICAgKTsKICAgICAgICByZXR1cm4gY2xhc3NCb2R5RGVjbGFyYXRpb247CiAgICB9CgogICAgLyoqIE1lbWJlckRlY2w6CiAgICAgKiAgICAgIEdlbmVyaWNNZXRob2RPckNvbnN0cnVjdG9yRGVjbAogICAgICogICAgICBNZXRob2RPckZpZWxkRGVjbAogICAgICogICAgICB2b2lkIElkZW50aWZpZXIgTWV0aG9kRGVjbGFyYXRvclJlc3QKICAgICAqICAgICAgSWRlbnRpZmllciBDb25zdHJ1Y3RvckRlY2xhcmF0b3JSZXN0CiAgICAgKiAgICAgIENsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbgogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIG1lbWJlckRlY2woKSB7CiAgICAgICAgbG9nKCJtZW1iZXJEZWNsIik7CiAgICAgICAgaWYgKG1lbWJlckRlY2wgIT0gbnVsbCkgcmV0dXJuIG1lbWJlckRlY2w7CiAgICAgICAgbWVtYmVyRGVjbCA9IGFsdGVybmF0aW9uKCI8bWVtYmVyRGVjbD4iKTsKICAgICAgICAgICAgbWVtYmVyRGVjbC5hZGQoZ2VuZXJpY01ldGhvZE9yQ29uc3RydWN0b3JEZWNsKCkpOwogICAgICAgICAgICBtZW1iZXJEZWNsLmFkZChtZXRob2RPckZpZWxkRGVjbCgpKTsKICAgICAgICAgICAgbWVtYmVyRGVjbC5hZGQoc2VxdWVuY2UoIjxtZW1iZXJEZWNsJDE+IikKICAgICAgICAgICAgICAgIC5hZGQobmV3IExpdGVyYWwoInZvaWQiKSkKICAgICAgICAgICAgICAgIC5hZGQoaWRlbnRpZmllcigpKQogICAgICAgICAgICAgICAgLmFkZChtZXRob2REZWNsYXJhdG9yUmVzdCgpKQogICAgICAgICAgICApOwogICAgICAgICAgICBtZW1iZXJEZWNsLmFkZChzZXF1ZW5jZSgiPG1lbWJlckRlY2wkMj4iKQogICAgICAgICAgICAgICAgLmFkZChpZGVudGlmaWVyKCkpCiAgICAgICAgICAgICAgICAuYWRkKGNvbnN0cnVjdG9yRGVjbGFyYXRvclJlc3QoKSkKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbWVtYmVyRGVjbC5hZGQoY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uKCkpOwogICAgICAgIHJldHVybiBtZW1iZXJEZWNsOwogICAgfQoKICAgIC8qKiBHZW5lcmljTWV0aG9kT3JDb25zdHJ1Y3RvckRlY2w6CiAgICAgKiAgICAgIFR5cGVQYXJhbWV0ZXJzIEdlbmVyaWNNZXRob2RPckNvbnN0cnVjdG9yUmVzdAogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIGdlbmVyaWNNZXRob2RPckNvbnN0cnVjdG9yRGVjbCgpIHsKICAgICAgICBsb2coImdlbmVyaWNNZXRob2RPckNvbnN0cnVjdG9yRGVjbCIpOwogICAgICAgIGlmIChnZW5lcmljTWV0aG9kT3JDb25zdHJ1Y3RvckRlY2wgIT0gbnVsbCkgcmV0dXJuIGdlbmVyaWNNZXRob2RPckNvbnN0cnVjdG9yRGVjbDsKICAgICAgICBnZW5lcmljTWV0aG9kT3JDb25zdHJ1Y3RvckRlY2wgPSBzZXF1ZW5jZSgiPGdlbmVyaWNNZXRob2RPckNvbnN0cnVjdG9yRGVjbD4iKTsKICAgICAgICAgICAgZ2VuZXJpY01ldGhvZE9yQ29uc3RydWN0b3JEZWNsLmFkZCh0eXBlUGFyYW1ldGVycygpKTsKICAgICAgICAgICAgZ2VuZXJpY01ldGhvZE9yQ29uc3RydWN0b3JEZWNsLmFkZChnZW5lcmljTWV0aG9kT3JDb25zdHJ1Y3RvclJlc3QoKSk7CiAgICAgICAgcmV0dXJuIGdlbmVyaWNNZXRob2RPckNvbnN0cnVjdG9yRGVjbDsKICAgIH0KCiAgICAvKiogR2VuZXJpY01ldGhvZE9yQ29uc3RydWN0b3JSZXN0OgogICAgICogICAgICBUeXBlIElkZW50aWZpZXIgTWV0aG9kRGVjbGFyYXRvclJlc3QKICAgICAqICAgICAgSWRlbnRpZmllciBDb25zdHJ1Y3RvckRlY2xhcmF0b3JSZXN0CiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgZ2VuZXJpY01ldGhvZE9yQ29uc3RydWN0b3JSZXN0KCkgewogICAgICAgIGxvZygiZ2VuZXJpY01ldGhvZE9yQ29uc3RydWN0b3JSZXN0Iik7CiAgICAgICAgaWYgKGdlbmVyaWNNZXRob2RPckNvbnN0cnVjdG9yUmVzdCAhPSBudWxsKSByZXR1cm4gZ2VuZXJpY01ldGhvZE9yQ29uc3RydWN0b3JSZXN0OwogICAgICAgIGdlbmVyaWNNZXRob2RPckNvbnN0cnVjdG9yUmVzdCA9IGFsdGVybmF0aW9uKCI8Z2VuZXJpY01ldGhvZE9yQ29uc3RydWN0b3JSZXN0PiIpOwogICAgICAgICAgICBnZW5lcmljTWV0aG9kT3JDb25zdHJ1Y3RvclJlc3QuYWRkKHNlcXVlbmNlKCI8Z2VuZXJpY01ldGhvZE9yQ29uc3RydWN0b3JSZXN0JDE+IikKICAgICAgICAgICAgICAgIC5hZGQodHlwZSgpKQogICAgICAgICAgICAgICAgLmFkZChpZGVudGlmaWVyKCkpCiAgICAgICAgICAgICAgICAuYWRkKG1ldGhvZERlY2xhcmF0b3JSZXN0KCkpCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGdlbmVyaWNNZXRob2RPckNvbnN0cnVjdG9yUmVzdC5hZGQoc2VxdWVuY2UoIjxnZW5lcmljTWV0aG9kT3JDb25zdHJ1Y3RvclJlc3QkMj4iKQogICAgICAgICAgICAgICAgLmFkZChpZGVudGlmaWVyKCkpCiAgICAgICAgICAgICAgICAuYWRkKGNvbnN0cnVjdG9yRGVjbGFyYXRvclJlc3QoKSkKICAgICAgICAgICAgKTsKICAgICAgICByZXR1cm4gZ2VuZXJpY01ldGhvZE9yQ29uc3RydWN0b3JSZXN0OwogICAgfQoKICAgIC8qKiBNZXRob2RPckZpZWxkRGVjbDoKICAgICAqICAgICAgVHlwZSBJZGVudGlmaWVyIE1ldGhvZE9yRmllbGRSZXN0CiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgbWV0aG9kT3JGaWVsZERlY2woKSB7CiAgICAgICAgbG9nKCJtZXRob2RPckZpZWxkRGVjbCIpOwogICAgICAgIGlmIChtZXRob2RPckZpZWxkRGVjbCAhPSBudWxsKSByZXR1cm4gbWV0aG9kT3JGaWVsZERlY2w7CiAgICAgICAgbWV0aG9kT3JGaWVsZERlY2wgPSBzZXF1ZW5jZSgiPG1ldGhvZE9yRmllbGREZWNsPiIpOwogICAgICAgICAgICBtZXRob2RPckZpZWxkRGVjbC5hZGQodHlwZSgpKTsKICAgICAgICAgICAgbWV0aG9kT3JGaWVsZERlY2wuYWRkKGlkZW50aWZpZXIoKSk7CiAgICAgICAgICAgIG1ldGhvZE9yRmllbGREZWNsLmFkZChtZXRob2RPckZpZWxkUmVzdCgpKTsKICAgICAgICByZXR1cm4gbWV0aG9kT3JGaWVsZERlY2w7CiAgICB9CgogICAgLyoqIE1ldGhvZE9yRmllbGRSZXN0OgogICAgICogICAgICBWYXJpYWJsZURlY2xhcmF0b3JSZXN0CiAgICAgKiAgICAgIE1ldGhvZERlY2xhcmF0b3JSZXN0CiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgbWV0aG9kT3JGaWVsZFJlc3QoKSB7CiAgICAgICAgbG9nKCJtZXRob2RPckZpZWxkUmVzdCIpOwogICAgICAgIGlmIChtZXRob2RPckZpZWxkUmVzdCAhPSBudWxsKSByZXR1cm4gbWV0aG9kT3JGaWVsZFJlc3Q7CiAgICAgICAgbWV0aG9kT3JGaWVsZFJlc3QgPSBhbHRlcm5hdGlvbigiPG1ldGhvZE9yRmllbGRSZXN0PiIpOwogICAgICAgICAgICBtZXRob2RPckZpZWxkUmVzdC5hZGQodmFyaWFibGVEZWNsYXJhdG9yUmVzdCgpKTsKICAgICAgICAgICAgbWV0aG9kT3JGaWVsZFJlc3QuYWRkKG1ldGhvZERlY2xhcmF0b3JSZXN0KCkpOwogICAgICAgIHJldHVybiBtZXRob2RPckZpZWxkUmVzdDsKICAgIH0KCiAgICAvKiogSW50ZXJmYWNlQm9keURlY2xhcmF0aW9uOgogICAgICogICAgICA7CiAgICAgKiAgICAgIE1vZGlmaWVyc09wdCBJbnRlcmZhY2VNZW1iZXJEZWNsCiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgaW50ZXJmYWNlQm9keURlY2xhcmF0aW9uKCkgewogICAgICAgIGxvZygiaW50ZXJmYWNlQm9keURlY2xhcmF0aW9uIik7CiAgICAgICAgaWYgKGludGVyZmFjZUJvZHlEZWNsYXJhdGlvbiAhPSBudWxsKSByZXR1cm4gaW50ZXJmYWNlQm9keURlY2xhcmF0aW9uOwogICAgICAgIGludGVyZmFjZUJvZHlEZWNsYXJhdGlvbiA9IGFsdGVybmF0aW9uKCI8aW50ZXJmYWNlQm9keURlY2xhcmF0aW9uPiIpOwogICAgICAgICAgICBpbnRlcmZhY2VCb2R5RGVjbGFyYXRpb24uYWRkKG5ldyBTeW1ib2woJzsnKSk7CiAgICAgICAgICAgIGludGVyZmFjZUJvZHlEZWNsYXJhdGlvbi5hZGQoc2VxdWVuY2UoIjxpbnRlcmZhY2VCb2R5RGVjbGFyYXRpb24kMT4iKQogICAgICAgICAgICAgICAgLmFkZChtb2RpZmllcnNPcHQoKSkKICAgICAgICAgICAgICAgIC5hZGQoaW50ZXJmYWNlTWVtYmVyRGVjbCgpKQogICAgICAgICAgICApOwogICAgICAgIHJldHVybiBpbnRlcmZhY2VCb2R5RGVjbGFyYXRpb247CiAgICB9CgogICAgLyoqIEludGVyZmFjZU1lbWJlckRlY2w6CiAgICAgKiAgICAgIEludGVyZmFjZU1ldGhvZE9yRmllbGREZWNsCiAgICAgKiAgICAgIEludGVyZmFjZUdlbmVyaWNNZXRob2REZWNsCiAgICAgKiAgICAgIHZvaWQgSWRlbnRpZmllciBWb2lkSW50ZXJmYWNlTWV0aG9kRGVjbGFyYXRvclJlc3QKICAgICAqICAgICAgQ2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgaW50ZXJmYWNlTWVtYmVyRGVjbCgpIHsKICAgICAgICBsb2coImludGVyZmFjZU1lbWJlckRlY2wiKTsKICAgICAgICBpZiAoaW50ZXJmYWNlTWVtYmVyRGVjbCAhPSBudWxsKSByZXR1cm4gaW50ZXJmYWNlTWVtYmVyRGVjbDsKICAgICAgICBpbnRlcmZhY2VNZW1iZXJEZWNsID0gYWx0ZXJuYXRpb24oIjxpbnRlcmZhY2VNZW1iZXJEZWNsPiIpOwogICAgICAgICAgICBpbnRlcmZhY2VNZW1iZXJEZWNsLmFkZChpbnRlcmZhY2VNZXRob2RPckZpZWxkRGVjbCgpKTsKICAgICAgICAgICAgaW50ZXJmYWNlTWVtYmVyRGVjbC5hZGQoaW50ZXJmYWNlR2VuZXJpY01ldGhvZERlY2woKSk7CiAgICAgICAgICAgIGludGVyZmFjZU1lbWJlckRlY2wuYWRkKHNlcXVlbmNlKCI8aW50ZXJmYWNlTWVtYmVyRGVjbCQxPiIpCiAgICAgICAgICAgICAgICAuYWRkKG5ldyBMaXRlcmFsKCJ2b2lkIikpCiAgICAgICAgICAgICAgICAuYWRkKGlkZW50aWZpZXIoKSkKICAgICAgICAgICAgICAgIC5hZGQodm9pZEludGVyZmFjZU1ldGhvZERlY2xhcmF0b3JSZXN0KCkpCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGludGVyZmFjZU1lbWJlckRlY2wuYWRkKGNsYXNzT3JJbnRlcmZhY2VEZWNsYXJhdGlvbigpKTsKICAgICAgICByZXR1cm4gaW50ZXJmYWNlTWVtYmVyRGVjbDsKICAgIH0KCiAgICAvKiogSW50ZXJmYWNlTWV0aG9kT3JGaWVsZERlY2w6CiAgICAgKiAgICAgIFR5cGUgSWRlbnRpZmllciBJbnRlcmZhY2VNZXRob2RPckZpZWxkUmVzdAogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIGludGVyZmFjZU1ldGhvZE9yRmllbGREZWNsKCkgewogICAgICAgIGxvZygiaW50ZXJmYWNlTWV0aG9kT3JGaWVsZERlY2wiKTsKICAgICAgICBpZiAoaW50ZXJmYWNlTWV0aG9kT3JGaWVsZERlY2wgIT0gbnVsbCkgcmV0dXJuIGludGVyZmFjZU1ldGhvZE9yRmllbGREZWNsOwogICAgICAgIGludGVyZmFjZU1ldGhvZE9yRmllbGREZWNsID0gc2VxdWVuY2UoIjxpbnRlcmZhY2VNZXRob2RPckZpZWxkRGVjbD4iKTsKICAgICAgICAgICAgaW50ZXJmYWNlTWV0aG9kT3JGaWVsZERlY2wuYWRkKHR5cGUoKSk7CiAgICAgICAgICAgIGludGVyZmFjZU1ldGhvZE9yRmllbGREZWNsLmFkZChpZGVudGlmaWVyKCkpOwogICAgICAgICAgICBpbnRlcmZhY2VNZXRob2RPckZpZWxkRGVjbC5hZGQoaW50ZXJmYWNlTWV0aG9kT3JGaWVsZFJlc3QoKSk7CiAgICAgICAgcmV0dXJuIGludGVyZmFjZU1ldGhvZE9yRmllbGREZWNsOwogICAgfQoKICAgIC8qKiBJbnRlcmZhY2VNZXRob2RPckZpZWxkUmVzdDoKICAgICAqICAgICAgQ29uc3RhbnREZWNsYXJhdG9yc1Jlc3Q7CiAgICAgKiAgICAgIEludGVyZmFjZU1ldGhvZERlY2xhcmF0b3JSZXN0CiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgaW50ZXJmYWNlTWV0aG9kT3JGaWVsZFJlc3QoKSB7CiAgICAgICAgbG9nKCJpbnRlcmZhY2VNZXRob2RPckZpZWxkUmVzdCIpOwogICAgICAgIGlmIChpbnRlcmZhY2VNZXRob2RPckZpZWxkUmVzdCAhPSBudWxsKSByZXR1cm4gaW50ZXJmYWNlTWV0aG9kT3JGaWVsZFJlc3Q7CiAgICAgICAgaW50ZXJmYWNlTWV0aG9kT3JGaWVsZFJlc3QgPSBhbHRlcm5hdGlvbigiPGludGVyZmFjZU1ldGhvZE9yRmllbGRSZXN0PiIpOwogICAgICAgICAgICBpbnRlcmZhY2VNZXRob2RPckZpZWxkUmVzdC5hZGQoc2VxdWVuY2UoIjxpbnRlcmZhY2VNZXRob2RPckZpZWxkUmVzdCQxPiIpCiAgICAgICAgICAgICAgICAuYWRkKGNvbnN0YW50RGVjbGFyYXRvcnNSZXN0KCkpCiAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJzsnKSkKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaW50ZXJmYWNlTWV0aG9kT3JGaWVsZFJlc3QuYWRkKGludGVyZmFjZU1ldGhvZERlY2xhcmF0b3JSZXN0KCkpOwogICAgICAgIHJldHVybiBpbnRlcmZhY2VNZXRob2RPckZpZWxkUmVzdDsKICAgIH0KCiAgICAvKiogTWV0aG9kRGVjbGFyYXRvclJlc3Q6CiAgICAgKiAgICAgIEZvcm1hbFBhcmFtZXRlcnMgQnJhY2tldHNPcHRbdGhyb3dzUXVhbGlmaWVkSWRlbnRpZmllckxpc3RdKCBNZXRob2RCb2R5IHw7ICApCiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgbWV0aG9kRGVjbGFyYXRvclJlc3QoKSB7CiAgICAgICAgbG9nKCJtZXRob2REZWNsYXJhdG9yUmVzdCIpOwogICAgICAgIGlmIChtZXRob2REZWNsYXJhdG9yUmVzdCAhPSBudWxsKSByZXR1cm4gbWV0aG9kRGVjbGFyYXRvclJlc3Q7CiAgICAgICAgbWV0aG9kRGVjbGFyYXRvclJlc3QgPSBzZXF1ZW5jZSgiPG1ldGhvZERlY2xhcmF0b3JSZXN0PiIpOwogICAgICAgICAgICBtZXRob2REZWNsYXJhdG9yUmVzdC5hZGQoZm9ybWFsUGFyYW1ldGVycygpKTsKICAgICAgICAgICAgbWV0aG9kRGVjbGFyYXRvclJlc3QuYWRkKGJyYWNrZXRzT3B0KCkpOwogICAgICAgICAgICBtZXRob2REZWNsYXJhdG9yUmVzdC5hZGQoemVyb09yT25lKHNlcXVlbmNlKCI8bWV0aG9kRGVjbGFyYXRvclJlc3QkMT4iKQogICAgICAgICAgICAgICAgLmFkZChuZXcgTGl0ZXJhbCgidGhyb3dzIikpCiAgICAgICAgICAgICAgICAuYWRkKHF1YWxpZmllZElkZW50aWZpZXJMaXN0KCkpCiAgICAgICAgICAgICkpOwogICAgICAgICAgICBtZXRob2REZWNsYXJhdG9yUmVzdC5hZGQoYWx0ZXJuYXRpb24oIjxtZXRob2REZWNsYXJhdG9yUmVzdCRhPiIpCiAgICAgICAgICAgICAgICAuYWRkKG1ldGhvZEJvZHkoKSkKICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnOycpKQogICAgICAgICAgICApOwogICAgICAgIHJldHVybiBtZXRob2REZWNsYXJhdG9yUmVzdDsKICAgIH0KCiAgICAvKiogVm9pZE1ldGhvZERlY2xhcmF0b3JSZXN0OgogICAgICogICAgICBGb3JtYWxQYXJhbWV0ZXJzIFt0aHJvd3MgUXVhbGlmaWVkSWRlbnRpZmllckxpc3RdICggTWV0aG9kQm9keSB8OyAgKQogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIHZvaWRNZXRob2REZWNsYXJhdG9yUmVzdCgpIHsKICAgICAgICBsb2coInZvaWRNZXRob2REZWNsYXJhdG9yUmVzdCIpOwogICAgICAgIGlmICh2b2lkTWV0aG9kRGVjbGFyYXRvclJlc3QgIT0gbnVsbCkgcmV0dXJuIHZvaWRNZXRob2REZWNsYXJhdG9yUmVzdDsKICAgICAgICB2b2lkTWV0aG9kRGVjbGFyYXRvclJlc3QgPSBzZXF1ZW5jZSgiPHZvaWRNZXRob2REZWNsYXJhdG9yUmVzdD4iKTsKICAgICAgICAgICAgdm9pZE1ldGhvZERlY2xhcmF0b3JSZXN0LmFkZChmb3JtYWxQYXJhbWV0ZXJzKCkpOwogICAgICAgICAgICB2b2lkTWV0aG9kRGVjbGFyYXRvclJlc3QuYWRkKHplcm9Pck9uZShzZXF1ZW5jZSgiPHZvaWRNZXRob2REZWNsYXJhdG9yUmVzdCQxPiIpCiAgICAgICAgICAgICAgICAuYWRkKG5ldyBMaXRlcmFsKCJ0aHJvd3MiKSkKICAgICAgICAgICAgICAgIC5hZGQocXVhbGlmaWVkSWRlbnRpZmllckxpc3QoKSkKICAgICAgICAgICAgKSk7CiAgICAgICAgICAgIHZvaWRNZXRob2REZWNsYXJhdG9yUmVzdC5hZGQoYWx0ZXJuYXRpb24oIjx2b2lkTWV0aG9kRGVjbGFyYXRvclJlc3QkYT4iKQogICAgICAgICAgICAgICAgLmFkZChtZXRob2RCb2R5KCkpCiAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJzsnKSkKICAgICAgICAgICAgKTsKICAgICAgICByZXR1cm4gdm9pZE1ldGhvZERlY2xhcmF0b3JSZXN0OwogICAgfQoKICAgIC8qKiBJbnRlcmZhY2VNZXRob2REZWNsYXJhdG9yUmVzdDoKICAgICAqICAgICAgRm9ybWFsUGFyYW1ldGVycyBCcmFja2V0c09wdCBbdGhyb3dzIFF1YWxpZmllZElkZW50aWZpZXJMaXN0XTsKICAgICAqLwogICAgcHVibGljIFBhcnNlciBpbnRlcmZhY2VNZXRob2REZWNsYXJhdG9yUmVzdCgpIHsKICAgICAgICBsb2coImludGVyZmFjZU1ldGhvZERlY2xhcmF0b3JSZXN0Iik7CiAgICAgICAgaWYgKGludGVyZmFjZU1ldGhvZERlY2xhcmF0b3JSZXN0ICE9IG51bGwpIHJldHVybiBpbnRlcmZhY2VNZXRob2REZWNsYXJhdG9yUmVzdDsKICAgICAgICBpbnRlcmZhY2VNZXRob2REZWNsYXJhdG9yUmVzdCA9IHNlcXVlbmNlKCI8aW50ZXJmYWNlTWV0aG9kRGVjbGFyYXRvclJlc3Q+Iik7CiAgICAgICAgICAgIGludGVyZmFjZU1ldGhvZERlY2xhcmF0b3JSZXN0LmFkZChmb3JtYWxQYXJhbWV0ZXJzKCkpOwogICAgICAgICAgICBpbnRlcmZhY2VNZXRob2REZWNsYXJhdG9yUmVzdC5hZGQoYnJhY2tldHNPcHQoKSk7CiAgICAgICAgICAgIGludGVyZmFjZU1ldGhvZERlY2xhcmF0b3JSZXN0LmFkZCh6ZXJvT3JPbmUoc2VxdWVuY2UoIjxpbnRlcmZhY2VNZXRob2REZWNsYXJhdG9yUmVzdCQxPiIpCiAgICAgICAgICAgICAgICAuYWRkKG5ldyBMaXRlcmFsKCJ0aHJvd3MiKSkKICAgICAgICAgICAgICAgIC5hZGQocXVhbGlmaWVkSWRlbnRpZmllckxpc3QoKSkKICAgICAgICAgICAgKSk7CiAgICAgICAgcmV0dXJuIGludGVyZmFjZU1ldGhvZERlY2xhcmF0b3JSZXN0OwogICAgfQoKICAgIC8qKiBJbnRlcmZhY2VHZW5lcmljTWV0aG9kRGVjbDoKICAgICAqICAgICAgVHlwZVBhcmFtZXRlcnMgVHlwZSBJZGVudGlmaWVyIEludGVyZmFjZU1ldGhvZERlY2xhcmF0b3JSZXN0CiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgaW50ZXJmYWNlR2VuZXJpY01ldGhvZERlY2woKSB7CiAgICAgICAgbG9nKCJpbnRlcmZhY2VHZW5lcmljTWV0aG9kRGVjbCIpOwogICAgICAgIGlmIChpbnRlcmZhY2VHZW5lcmljTWV0aG9kRGVjbCAhPSBudWxsKSByZXR1cm4gaW50ZXJmYWNlR2VuZXJpY01ldGhvZERlY2w7CiAgICAgICAgaW50ZXJmYWNlR2VuZXJpY01ldGhvZERlY2wgPSBzZXF1ZW5jZSgiPGludGVyZmFjZUdlbmVyaWNNZXRob2REZWNsPiIpOwogICAgICAgICAgICBpbnRlcmZhY2VHZW5lcmljTWV0aG9kRGVjbC5hZGQodHlwZVBhcmFtZXRlcnMoKSk7CiAgICAgICAgICAgIGludGVyZmFjZUdlbmVyaWNNZXRob2REZWNsLmFkZCh0eXBlKCkpOwogICAgICAgICAgICBpbnRlcmZhY2VHZW5lcmljTWV0aG9kRGVjbC5hZGQoaWRlbnRpZmllcigpKTsKICAgICAgICAgICAgaW50ZXJmYWNlR2VuZXJpY01ldGhvZERlY2wuYWRkKGludGVyZmFjZU1ldGhvZERlY2xhcmF0b3JSZXN0KCkpOwogICAgICAgIHJldHVybiBpbnRlcmZhY2VHZW5lcmljTWV0aG9kRGVjbDsKICAgIH0KCiAgICAvKiogVm9pZEludGVyZmFjZU1ldGhvZERlY2xhcmF0b3JSZXN0OgogICAgICogICAgICBGb3JtYWxQYXJhbWV0ZXJzIFt0aHJvd3MgUXVhbGlmaWVkSWRlbnRpZmllckxpc3RdOwogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIHZvaWRJbnRlcmZhY2VNZXRob2REZWNsYXJhdG9yUmVzdCgpIHsKICAgICAgICBsb2coInZvaWRJbnRlcmZhY2VNZXRob2REZWNsYXJhdG9yUmVzdCIpOwogICAgICAgIGlmICh2b2lkSW50ZXJmYWNlTWV0aG9kRGVjbGFyYXRvclJlc3QgIT0gbnVsbCkgcmV0dXJuIHZvaWRJbnRlcmZhY2VNZXRob2REZWNsYXJhdG9yUmVzdDsKICAgICAgICB2b2lkSW50ZXJmYWNlTWV0aG9kRGVjbGFyYXRvclJlc3QgPSBzZXF1ZW5jZSgiPHZvaWRJbnRlcmZhY2VNZXRob2REZWNsYXJhdG9yUmVzdD4iKTsKICAgICAgICAgICAgdm9pZEludGVyZmFjZU1ldGhvZERlY2xhcmF0b3JSZXN0LmFkZChmb3JtYWxQYXJhbWV0ZXJzKCkpOwogICAgICAgICAgICB2b2lkSW50ZXJmYWNlTWV0aG9kRGVjbGFyYXRvclJlc3QuYWRkKHplcm9Pck9uZShzZXF1ZW5jZSgiPHZvaWRJbnRlcmZhY2VNZXRob2REZWNsYXJhdG9yUmVzdCQxPiIpCiAgICAgICAgICAgICAgICAuYWRkKG5ldyBMaXRlcmFsKCJ0aHJvd3MiKSkKICAgICAgICAgICAgICAgIC5hZGQocXVhbGlmaWVkSWRlbnRpZmllckxpc3QoKSkKICAgICAgICAgICAgKSk7CiAgICAgICAgICAgIHZvaWRJbnRlcmZhY2VNZXRob2REZWNsYXJhdG9yUmVzdC5hZGQobmV3IFN5bWJvbCgnOycpKTsKICAgICAgICByZXR1cm4gdm9pZEludGVyZmFjZU1ldGhvZERlY2xhcmF0b3JSZXN0OwogICAgfQoKICAgIC8qKiBDb25zdHJ1Y3RvckRlY2xhcmF0b3JSZXN0OgogICAgICogICAgICBGb3JtYWxQYXJhbWV0ZXJzIFt0aHJvd3MgUXVhbGlmaWVkSWRlbnRpZmllckxpc3RdIE1ldGhvZEJvZHkKICAgICAqLwogICAgcHVibGljIFBhcnNlciBjb25zdHJ1Y3RvckRlY2xhcmF0b3JSZXN0KCkgewogICAgICAgIGxvZygiY29uc3RydWN0b3JEZWNsYXJhdG9yUmVzdCIpOwogICAgICAgIGlmIChjb25zdHJ1Y3RvckRlY2xhcmF0b3JSZXN0ICE9IG51bGwpIHJldHVybiBjb25zdHJ1Y3RvckRlY2xhcmF0b3JSZXN0OwogICAgICAgIGNvbnN0cnVjdG9yRGVjbGFyYXRvclJlc3QgPSBzZXF1ZW5jZSgiPGNvbnN0cnVjdG9yRGVjbGFyYXRvclJlc3Q+Iik7CiAgICAgICAgICAgIGNvbnN0cnVjdG9yRGVjbGFyYXRvclJlc3QuYWRkKGZvcm1hbFBhcmFtZXRlcnMoKSk7CiAgICAgICAgICAgIGNvbnN0cnVjdG9yRGVjbGFyYXRvclJlc3QuYWRkKHplcm9Pck9uZShzZXF1ZW5jZSgiPGNvbnN0cnVjdG9yRGVjbGFyYXRvclJlc3QkMT4iKQogICAgICAgICAgICAgICAgLmFkZChuZXcgTGl0ZXJhbCgidGhyb3dzIikpCiAgICAgICAgICAgICAgICAuYWRkKHF1YWxpZmllZElkZW50aWZpZXJMaXN0KCkpCiAgICAgICAgICAgICkpOwogICAgICAgICAgICBjb25zdHJ1Y3RvckRlY2xhcmF0b3JSZXN0LmFkZChtZXRob2RCb2R5KCkpOwogICAgICAgIHJldHVybiBjb25zdHJ1Y3RvckRlY2xhcmF0b3JSZXN0OwogICAgfQoKICAgIC8qKiBRdWFsaWZpZWRJZGVudGlmaWVyTGlzdDoKICAgICAqICAgICAgUXVhbGlmaWVkSWRlbnRpZmllciB7ICwgICBRdWFsaWZpZWRJZGVudGlmaWVyfQogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIHF1YWxpZmllZElkZW50aWZpZXJMaXN0KCkgewogICAgICAgIGxvZygicXVhbGlmaWVkSWRlbnRpZmllckxpc3QiKTsKICAgICAgICBpZiAocXVhbGlmaWVkSWRlbnRpZmllckxpc3QgIT0gbnVsbCkgcmV0dXJuIHF1YWxpZmllZElkZW50aWZpZXJMaXN0OwogICAgICAgIHF1YWxpZmllZElkZW50aWZpZXJMaXN0ID0gc2VxdWVuY2UoIjxxdWFsaWZpZWRJZGVudGlmaWVyTGlzdD4iKTsKICAgICAgICBxdWFsaWZpZWRJZGVudGlmaWVyTGlzdC5hZGQocXVhbGlmaWVkSWRlbnRpZmllcigpKTsKICAgICAgICBxdWFsaWZpZWRJZGVudGlmaWVyTGlzdC5hZGQocmVwZXRpdGlvbihzZXF1ZW5jZSgiPHF1YWxpZmllZElkZW50aWZpZXJMaXN0JDE+IikKICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnLCcpKQogICAgICAgICAgICAgICAgLmFkZChxdWFsaWZpZWRJZGVudGlmaWVyKCkpCiAgICAgICAgICAgICkpOwogICAgICAgIHJldHVybiBxdWFsaWZpZWRJZGVudGlmaWVyTGlzdDsKICAgIH0KCiAgICAvKiogRm9ybWFsUGFyYW1ldGVyczoKICAgICAqICAgICAgKCBbRm9ybWFsUGFyYW1ldGVyRGVjbHNdKQogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIGZvcm1hbFBhcmFtZXRlcnMoKSB7CiAgICAgICAgbG9nKCJmb3JtYWxQYXJhbWV0ZXJzIik7CiAgICAgICAgaWYgKGZvcm1hbFBhcmFtZXRlcnMgIT0gbnVsbCkgcmV0dXJuIGZvcm1hbFBhcmFtZXRlcnM7CiAgICAgICAgZm9ybWFsUGFyYW1ldGVycyA9IHNlcXVlbmNlKCI8Zm9ybWFsUGFyYW1ldGVycz4iKTsKICAgICAgICAgICAgZm9ybWFsUGFyYW1ldGVycy5hZGQobmV3IFN5bWJvbCgnKCcpKTsKICAgICAgICAgICAgZm9ybWFsUGFyYW1ldGVycy5hZGQoemVyb09yT25lKGZvcm1hbFBhcmFtZXRlckRlY2xzKCkpKTsKICAgICAgICAgICAgZm9ybWFsUGFyYW1ldGVycy5hZGQobmV3IFN5bWJvbCgnKScpKTsKICAgICAgICByZXR1cm4gZm9ybWFsUGFyYW1ldGVyczsKICAgIH0KCiAgICAvKiogRm9ybWFsUGFyYW1ldGVyRGVjbHM6CiAgICAgKiAgICAgIFtmaW5hbF0gW0Fubm90YXRpb25zXSBUeXBlIEZvcm1hbFBhcmFtZXRlckRlY2xzUmVzdF0KICAgICAqIHRvZG8gLSBpcyBsYXN0IHBhcmFtZXRlciBvcHRpb25hbCEhIT8/Pz8KICAgICAqLwogICAgcHVibGljIFBhcnNlciBmb3JtYWxQYXJhbWV0ZXJEZWNscygpIHsKICAgICAgICBsb2coImZvcm1hbFBhcmFtZXRlckRlY2xzIik7CiAgICAgICAgaWYgKGZvcm1hbFBhcmFtZXRlckRlY2xzICE9IG51bGwpIHJldHVybiBmb3JtYWxQYXJhbWV0ZXJEZWNsczsKICAgICAgICBmb3JtYWxQYXJhbWV0ZXJEZWNscyA9IHNlcXVlbmNlKCI8Zm9ybWFsUGFyYW1ldGVyRGVjbHM+Iik7CiAgICAgICAgICAgIGZvcm1hbFBhcmFtZXRlckRlY2xzLmFkZCh6ZXJvT3JPbmUobmV3IExpdGVyYWwoImZpbmFsIikpKTsKICAgICAgICAgICAgZm9ybWFsUGFyYW1ldGVyRGVjbHMuYWRkKHplcm9Pck9uZShhbm5vdGF0aW9ucygpKSk7CiAgICAgICAgICAgIGZvcm1hbFBhcmFtZXRlckRlY2xzLmFkZCh0eXBlKCkpOwogICAgICAgICAgICBmb3JtYWxQYXJhbWV0ZXJEZWNscy5hZGQoZm9ybWFsUGFyYW1ldGVyRGVjbHNSZXN0KCkpOwogICAgICAgIHJldHVybiBmb3JtYWxQYXJhbWV0ZXJEZWNsczsKICAgIH0KCiAgICAvKiogRm9ybWFsUGFyYW1ldGVyRGVjbHNSZXN0OgogICAgICogICAgICBWYXJpYWJsZURlY2xhcmF0b3JJZCBbLCBGb3JtYWxQYXJhbWV0ZXJEZWNsc10KICAgICAqICAgICAgLi4uIFZhcmlhYmxlRGVjbGFyYXRvcklkCiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgZm9ybWFsUGFyYW1ldGVyRGVjbHNSZXN0KCkgewogICAgICAgIGxvZygiZm9ybWFsUGFyYW1ldGVyRGVjbHNSZXN0Iik7CiAgICAgICAgaWYgKGZvcm1hbFBhcmFtZXRlckRlY2xzUmVzdCAhPSBudWxsKSByZXR1cm4gZm9ybWFsUGFyYW1ldGVyRGVjbHNSZXN0OwogICAgICAgIGZvcm1hbFBhcmFtZXRlckRlY2xzUmVzdCA9IGFsdGVybmF0aW9uKCI8Zm9ybWFsUGFyYW1ldGVyRGVjbHNSZXN0PiIpOwogICAgICAgIGZvcm1hbFBhcmFtZXRlckRlY2xzUmVzdC5hZGQoc2VxdWVuY2UoIjxmb3JtYWxQYXJhbWV0ZXJEZWNsc1Jlc3QkMT4iKQogICAgICAgICAgICAgICAgLmFkZCh2YXJpYWJsZURlY2xhcmF0b3JJZCgpKQogICAgICAgICAgICAgICAgLmFkZCh6ZXJvT3JPbmUoc2VxdWVuY2UoIjxmb3JtYWxQYXJhbWV0ZXJEZWNsc1Jlc3QkMj4iKQogICAgICAgICAgICAgICAgICAgIC5hZGQobmV3IFN5bWJvbCgnLCcpKQogICAgICAgICAgICAgICAgICAgIC5hZGQoZm9ybWFsUGFyYW1ldGVyRGVjbHMoKSkKICAgICAgICAgICAgICAgICkpCiAgICAgICAgICAgICk7CiAgICAgICAgZm9ybWFsUGFyYW1ldGVyRGVjbHNSZXN0LmFkZChzZXF1ZW5jZSgiPGZvcm1hbFBhcmFtZXRlckRlY2xzUmVzdCQzPiIpCiAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woIi4uLiIpKSAgLy90b2RvIC0gdGhpcyBkb2Vzbid0IHNlZW0gcmlnaHQgOi0pCiAgICAgICAgICAgICAgICAuYWRkKHZhcmlhYmxlRGVjbGFyYXRvcklkKCkpCiAgICAgICAgICAgICk7CiAgICAgICAgcmV0dXJuIGZvcm1hbFBhcmFtZXRlckRlY2xzUmVzdDsKICAgIH0KCiAgICAvKiogTWV0aG9kQm9keToKICAgICAqICAgICAgQmxvY2sKICAgICAqLwogICAgcHVibGljIFBhcnNlciBtZXRob2RCb2R5KCkgewogICAgICAgIGxvZygibWV0aG9kQm9keSIpOwogICAgICAgIGlmIChtZXRob2RCb2R5ICE9IG51bGwpIHJldHVybiBtZXRob2RCb2R5OwogICAgICAgIG1ldGhvZEJvZHkgPSBibG9jaygpOwogICAgICAgIHJldHVybiBtZXRob2RCb2R5OwogICAgfQoKCiAgICAvLyAtPS09LT0tPS09LT0tPS09LT0tIEVORCBPRiBKTFMgQ0hBUFRFUiAxOCAtPS09LT0tPS09LT0tPS09LQoKCgoKCgogICAgLy8gLS0tLS0tIGFsdGVyZWQgSkxTdjOkOC4xLjEgLS0tLS0tCiAgICAvKiogQ2xhc3NNb2RpZmllcnM6CiAgICAgKiAgICAgIENsYXNzTW9kaWZpZXIge0NsYXNzTW9kaWZpZXJ9CiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgY2xhc3NNb2RpZmllcnMoKSB7CiAgICAgICAgbG9nKCJjbGFzc01vZGlmaWVycyIpOwogICAgICAgIGlmIChjbGFzc01vZGlmaWVycyAhPSBudWxsKSByZXR1cm4gY2xhc3NNb2RpZmllcnM7CiAgICAgICAgY2xhc3NNb2RpZmllcnMgPSBvbmVPck1vcmUoY2xhc3NNb2RpZmllcigpKTsKICAgICAgICByZXR1cm4gY2xhc3NNb2RpZmllcnM7CiAgICB9CiAgICAvKiogQ2xhc3NNb2RpZmllcjogb25lIG9mCiAgICAgKiAgICAgIEFubm90YXRpb24gcHVibGljIHByb3RlY3RlZCBwcml2YXRlCiAgICAgKiAgICAgIGFic3RyYWN0IHN0YXRpYyBmaW5hbCBzdHJpY3RmcAogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIGNsYXNzTW9kaWZpZXIoKSB7CiAgICAgICAgbG9nKCJjbGFzc01vZGlmaWVyIik7CiAgICAgICAgaWYgKGNsYXNzTW9kaWZpZXIgIT0gbnVsbCkgcmV0dXJuIGNsYXNzTW9kaWZpZXI7CiAgICAgICAgY2xhc3NNb2RpZmllciA9IG5ldyBBbHRlcm5hdGlvbigiPGNsYXNzIG1vZGlmaWVyPiIpOwogICAgICAgICAgICBjbGFzc01vZGlmaWVyLmFkZChhbm5vdGF0aW9uKCkpOwogICAgICAgICAgICBjbGFzc01vZGlmaWVyLmFkZChuZXcgTGl0ZXJhbCgicHVibGljIikpOwogICAgICAgICAgICBjbGFzc01vZGlmaWVyLmFkZChuZXcgTGl0ZXJhbCgicHJvdGVjdGVkIikpOwogICAgICAgICAgICBjbGFzc01vZGlmaWVyLmFkZChuZXcgTGl0ZXJhbCgicHJpdmF0ZSIpKTsKICAgICAgICAgICAgY2xhc3NNb2RpZmllci5hZGQobmV3IExpdGVyYWwoImFic3RyYWN0IikpOwogICAgICAgICAgICBjbGFzc01vZGlmaWVyLmFkZChuZXcgTGl0ZXJhbCgic3RhdGljIikpOwogICAgICAgICAgICBjbGFzc01vZGlmaWVyLmFkZChuZXcgTGl0ZXJhbCgiZmluYWwiKSk7CiAgICAgICAgICAgIGNsYXNzTW9kaWZpZXIuYWRkKG5ldyBMaXRlcmFsKCJzdHJpY3RmcCIpKTsKICAgICAgICByZXR1cm4gY2xhc3NNb2RpZmllcjsKICAgIH0KCiAgICAvLyAtLS0tLS0gYWx0ZXJlZCBKTFN2M6Q4LjEuNiAtLS0tLS0KICAgIC8qKiBDbGFzc0JvZHlEZWNsYXJhdGlvbnM6CiAgICAgKiAgICAgIENsYXNzQm9keURlY2xhcmF0aW9uIHtDbGFzc0JvZHlEZWNsYXJhdGlvbn0KICAgICAqLwogICAgcHVibGljIFBhcnNlciBjbGFzc0JvZHlEZWNsYXJhdGlvbnMoKSB7CiAgICAgICAgbG9nKCJjbGFzc0JvZHlEZWNsYXJhdGlvbnMiKTsKICAgICAgICBpZiAoY2xhc3NCb2R5RGVjbGFyYXRpb25zICE9IG51bGwpIHJldHVybiBjbGFzc0JvZHlEZWNsYXJhdGlvbnM7CiAgICAgICAgY2xhc3NCb2R5RGVjbGFyYXRpb25zID0gb25lT3JNb3JlKGNsYXNzQm9keURlY2xhcmF0aW9uKCkpOwogICAgICAgIHJldHVybiBjbGFzc0JvZHlEZWNsYXJhdGlvbnM7CiAgICB9CgogICAgLy8gLS0tLS0tIEpMU3YzpDguNC4xIC0tLS0tLQogICAgLyoqIEZvcm1hbFBhcmFtZXRlcjoKICAgICAqICAgICAgVmFyaWFibGVNb2RpZmllcnMgVHlwZSBWYXJpYWJsZURlY2xhcmF0b3JJZAogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIGZvcm1hbFBhcmFtZXRlcigpIHsKICAgICAgICBsb2coImZvcm1hbFBhcmFtZXRlciIpOwogICAgICAgIGlmIChmb3JtYWxQYXJhbWV0ZXIgIT0gbnVsbCkgcmV0dXJuIGZvcm1hbFBhcmFtZXRlcjsKICAgICAgICBmb3JtYWxQYXJhbWV0ZXIgPSBzZXF1ZW5jZSgiPGZvcm1hbFBhcmFtZXRlcj4iKTsKICAgICAgICAgICAgZm9ybWFsUGFyYW1ldGVyLmFkZCh2YXJpYWJsZU1vZGlmaWVycygpKTsKICAgICAgICAgICAgZm9ybWFsUGFyYW1ldGVyLmFkZCh0eXBlKCkpOwogICAgICAgICAgICBmb3JtYWxQYXJhbWV0ZXIuYWRkKHZhcmlhYmxlRGVjbGFyYXRvcklkKCkpOwogICAgICAgIHJldHVybiBmb3JtYWxQYXJhbWV0ZXI7CiAgICB9CgogICAgLyoqIC0tLS0tLS0gYWx0ZXJlZCBKTFN2M6Q4LjQuMSAtLS0tLS0tLQogICAgICogIFZhcmlhYmxlTW9kaWZpZXJzOgogICAgICogICAgICBWYXJpYWJsZU1vZGlmaWVyIHtWYXJpYWJsZU1vZGlmaWVyfQogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIHZhcmlhYmxlTW9kaWZpZXJzKCkgewogICAgICAgIGxvZygidmFyaWFibGVNb2RpZmllcnMiKTsKICAgICAgICBpZiAodmFyaWFibGVNb2RpZmllcnMgIT0gbnVsbCkgcmV0dXJuIHZhcmlhYmxlTW9kaWZpZXJzOwogICAgICAgIHZhcmlhYmxlTW9kaWZpZXJzID0gb25lT3JNb3JlKHZhcmlhYmxlTW9kaWZpZXIoKSk7CiAgICAgICAgcmV0dXJuIHZhcmlhYmxlTW9kaWZpZXJzOwogICAgfQoKICAgIC8qKiBWYXJpYWJsZU1vZGlmaWVyOiBvbmUgb2YKICAgICAqICAgICAgZmluYWwgQW5ub3RhdGlvbgogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIHZhcmlhYmxlTW9kaWZpZXIoKSB7CiAgICAgICAgbG9nKCJ2YXJpYWJsZU1vZGlmaWVyIik7CiAgICAgICAgaWYgKHZhcmlhYmxlTW9kaWZpZXIgIT0gbnVsbCkgcmV0dXJuIHZhcmlhYmxlTW9kaWZpZXI7CiAgICAgICAgdmFyaWFibGVNb2RpZmllciA9IGFsdGVybmF0aW9uKCI8dmFyaWFibGVNb2RpZmllcj4iKTsKICAgICAgICAgICAgdmFyaWFibGVNb2RpZmllci5hZGQobmV3IExpdGVyYWwoImZpbmFsIikpOwogICAgICAgICAgICB2YXJpYWJsZU1vZGlmaWVyLmFkZChhbm5vdGF0aW9uKCkpOwogICAgICAgIHJldHVybiB2YXJpYWJsZU1vZGlmaWVyOwogICAgfQoKICAgIC8vIC0tLS0tLS0tLS0gYWx0ZXJlZCBKTFN2M6Q5LjEuMSAtLS0tLS0tLS0tLS0tCiAgICAvKiogSW50ZXJmYWNlTW9kaWZpZXJzOgogICAgICogICAgICBJbnRlcmZhY2VNb2RpZmllciB7SW50ZXJmYWNlTW9kaWZpZXJ9CiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgaW50ZXJmYWNlTW9kaWZpZXJzKCkgewogICAgICAgIGxvZygiaW50ZXJmYWNlTW9kaWZpZXJzIik7CiAgICAgICAgaWYgKGludGVyZmFjZU1vZGlmaWVycyAhPSBudWxsKSByZXR1cm4gaW50ZXJmYWNlTW9kaWZpZXJzOwogICAgICAgIGludGVyZmFjZU1vZGlmaWVycyA9IG9uZU9yTW9yZShpbnRlcmZhY2VNb2RpZmllcigpKTsKICAgICAgICByZXR1cm4gaW50ZXJmYWNlTW9kaWZpZXJzOwogICAgfQoKICAgIC8qKiBJbnRlcmZhY2VNb2RpZmllcjogb25lIG9mCiAgICAgKiAgICAgIEFubm90YXRpb24gcHVibGljIHByb3RlY3RlZCBwcml2YXRlCiAgICAgKiAgICAgIGFic3RyYWN0IHN0YXRpYyBzdHJpY3RmcAogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIGludGVyZmFjZU1vZGlmaWVyKCkgewogICAgICAgIGxvZygiaW50ZXJmYWNlTW9kaWZpZXIiKTsKICAgICAgICBpZiAoaW50ZXJmYWNlTW9kaWZpZXIgIT0gbnVsbCkgcmV0dXJuIGludGVyZmFjZU1vZGlmaWVyOwogICAgICAgIGludGVyZmFjZU1vZGlmaWVyID0gYWx0ZXJuYXRpb24oIjxpbnRlcmZhY2VNb2RpZmllcj4iKTsKICAgICAgICAgICAgaW50ZXJmYWNlTW9kaWZpZXIuYWRkKGFubm90YXRpb24oKSk7CiAgICAgICAgICAgIGludGVyZmFjZU1vZGlmaWVyLmFkZChuZXcgTGl0ZXJhbCgicHVibGljIikpOwogICAgICAgICAgICBpbnRlcmZhY2VNb2RpZmllci5hZGQobmV3IExpdGVyYWwoInByb3RlY3RlZCIpKTsKICAgICAgICAgICAgaW50ZXJmYWNlTW9kaWZpZXIuYWRkKG5ldyBMaXRlcmFsKCJwcml2YXRlIikpOwogICAgICAgICAgICBpbnRlcmZhY2VNb2RpZmllci5hZGQobmV3IExpdGVyYWwoImFic3RyYWN0IikpOwogICAgICAgICAgICBpbnRlcmZhY2VNb2RpZmllci5hZGQobmV3IExpdGVyYWwoInN0YXRpYyIpKTsKICAgICAgICAgICAgaW50ZXJmYWNlTW9kaWZpZXIuYWRkKG5ldyBMaXRlcmFsKCJzdHJpY3RmcCIpKTsKICAgICAgICByZXR1cm4gaW50ZXJmYWNlTW9kaWZpZXI7CiAgICB9CgogICAgLy8gLS0tLS0tLS0tLSBKTFN2M6Q5LjMgLS0tLS0tLS0tLS0tLS0tCiAgICAvKiogQ29uc3RhbnREZWNsYXJhdGlvbjoKICAgICAqICAgICAgQ29uc3RhbnRNb2RpZmllcnMgb3B0IFR5cGUgVmFyaWFibGVEZWNsYXJhdG9ycyA7CiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgY29uc3RhbnREZWNsYXJhdGlvbigpIHsKICAgICAgICBsb2coImNvbnN0YW50RGVjbGFyYXRpb24iKTsKICAgICAgICBpZiAoY29uc3RhbnREZWNsYXJhdGlvbiAhPSBudWxsKSByZXR1cm4gY29uc3RhbnREZWNsYXJhdGlvbjsKICAgICAgICBjb25zdGFudERlY2xhcmF0aW9uID0gc2VxdWVuY2UoIjxjb25zdGFudERlY2xhcmF0aW9uPiIpOwogICAgICAgICAgICBjb25zdGFudERlY2xhcmF0aW9uLmFkZCh6ZXJvT3JPbmUoY29uc3RhbnRNb2RpZmllcnMoKSkpOwogICAgICAgICAgICBjb25zdGFudERlY2xhcmF0aW9uLmFkZCh0eXBlKCkpOwogICAgICAgICAgICBjb25zdGFudERlY2xhcmF0aW9uLmFkZCh2YXJpYWJsZURlY2xhcmF0b3JzKCkpOwogICAgICAgICAgICBjb25zdGFudERlY2xhcmF0aW9uLmFkZChuZXcgU3ltYm9sKCc7JykpOwogICAgICAgIHJldHVybiBjb25zdGFudERlY2xhcmF0aW9uOwogICAgfQoKICAgIC8qKiAtLS0tLS0tLS0tIGFsdGVyZWQgSkxTdjOkOS4zIC0tLS0tLS0tLS0tLS0tLQogICAgICogQ29uc3RhbnRNb2RpZmllcnM6CiAgICAgKiAgICAgIENvbnN0YW50TW9kaWZpZXIge0NvbnN0YW50TW9kaWZpZXJ9CiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgY29uc3RhbnRNb2RpZmllcnMoKSB7CiAgICAgICAgbG9nKCJjb25zdGFudE1vZGlmaWVycyIpOwogICAgICAgIGlmIChjb25zdGFudE1vZGlmaWVycyAhPSBudWxsKSByZXR1cm4gY29uc3RhbnRNb2RpZmllcnM7CiAgICAgICAgY29uc3RhbnRNb2RpZmllcnMgPSBvbmVPck1vcmUoY29uc3RhbnRNb2RpZmllcigpKTsKICAgICAgICByZXR1cm4gY29uc3RhbnRNb2RpZmllcnM7CiAgICB9CgogICAgLyoqIENvbnN0YW50TW9kaWZpZXI6IG9uZSBvZgogICAgICogICAgICBBbm5vdGF0aW9uIHB1YmxpYyBzdGF0aWMgZmluYWwKICAgICAqLwogICAgcHVibGljIFBhcnNlciBjb25zdGFudE1vZGlmaWVyKCkgewogICAgICAgIGxvZygiY29uc3RhbnRNb2RpZmllciIpOwogICAgICAgIGlmIChjb25zdGFudE1vZGlmaWVyICE9IG51bGwpIHJldHVybiBjb25zdGFudE1vZGlmaWVyOwogICAgICAgIGNvbnN0YW50TW9kaWZpZXIgPSBhbHRlcm5hdGlvbigiPGNvbnN0YW50TW9kaWZpZXI+Iik7CiAgICAgICAgICAgIGNvbnN0YW50TW9kaWZpZXIuYWRkKGFubm90YXRpb24oKSk7CiAgICAgICAgICAgIGNvbnN0YW50TW9kaWZpZXIuYWRkKG5ldyBMaXRlcmFsKCJwdWJsaWMiKSk7CiAgICAgICAgICAgIGNvbnN0YW50TW9kaWZpZXIuYWRkKG5ldyBMaXRlcmFsKCJzdGF0aWMiKSk7CiAgICAgICAgICAgIGNvbnN0YW50TW9kaWZpZXIuYWRkKG5ldyBMaXRlcmFsKCJmaW5hbCIpKTsKICAgICAgICByZXR1cm4gY29uc3RhbnRNb2RpZmllcjsKICAgIH0KCiAgICAvLyAtLS0tLS0tLS0tIGFsdGVyZWQgSkxTdjOkOS40IC0tLS0tLS0tLS0tLS0tLQogICAgLyoqIEFic3RyYWN0TWV0aG9kTW9kaWZpZXJzOgogICAgICogICAgICBBYnN0cmFjdE1ldGhvZE1vZGlmaWVyIHtBYnN0cmFjdE1ldGhvZE1vZGlmaWVyfQogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIGFic3RyYWN0TWV0aG9kTW9kaWZpZXJzKCkgewogICAgICAgIGxvZygiYWJzdHJhY3RNZXRob2RNb2RpZmllcnMiKTsKICAgICAgICBpZiAoYWJzdHJhY3RNZXRob2RNb2RpZmllcnMgIT0gbnVsbCkgcmV0dXJuIGFic3RyYWN0TWV0aG9kTW9kaWZpZXJzOwogICAgICAgIGFic3RyYWN0TWV0aG9kTW9kaWZpZXJzID0gb25lT3JNb3JlKGFic3RyYWN0TWV0aG9kTW9kaWZpZXIoKSk7CiAgICAgICAgcmV0dXJuIGFic3RyYWN0TWV0aG9kTW9kaWZpZXJzOwogICAgfQoKICAgIC8qKiBBYnN0cmFjdE1ldGhvZE1vZGlmaWVyOiBvbmUgb2YKICAgICAqICAgICAgQW5ub3RhdGlvbiBwdWJsaWMgYWJzdHJhY3QKICAgICAqLwogICAgcHVibGljIFBhcnNlciBhYnN0cmFjdE1ldGhvZE1vZGlmaWVyKCkgewogICAgICAgIGxvZygiYWJzdHJhY3RNZXRob2RNb2RpZmllciIpOwogICAgICAgIGlmIChhYnN0cmFjdE1ldGhvZE1vZGlmaWVyICE9IG51bGwpIHJldHVybiBhYnN0cmFjdE1ldGhvZE1vZGlmaWVyOwogICAgICAgIGFic3RyYWN0TWV0aG9kTW9kaWZpZXIgPSBhbHRlcm5hdGlvbigiPGFic3RyYWN0TWV0aG9kTW9kaWZpZXI+Iik7CiAgICAgICAgICAgIGFic3RyYWN0TWV0aG9kTW9kaWZpZXIuYWRkKGFubm90YXRpb24oKSk7CiAgICAgICAgICAgIGFic3RyYWN0TWV0aG9kTW9kaWZpZXIuYWRkKG5ldyBMaXRlcmFsKCJwdWJsaWMiKSk7CiAgICAgICAgICAgIGFic3RyYWN0TWV0aG9kTW9kaWZpZXIuYWRkKG5ldyBMaXRlcmFsKCJhYnN0cmFjdCIpKTsKICAgICAgICByZXR1cm4gYWJzdHJhY3RNZXRob2RNb2RpZmllcjsKICAgIH0KCiAgICAvLyAtLS0tLS0tLS0tIGFsdGVyZWQgSkxTdjOkOS43IC0tLS0tLS0tLS0tLS0tLQogICAgLyoqIEFubm90YXRpb25zOgogICAgICogICAgICBBbm5vdGF0aW9uIHtBbm5vdGF0aW9ufQogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIGFubm90YXRpb25zKCkgewogICAgICAgIGxvZygiYW5ub3RhdGlvbnMiKTsKICAgICAgICBpZiAoYW5ub3RhdGlvbnMgIT0gbnVsbCkgcmV0dXJuIGFubm90YXRpb25zOwogICAgICAgIGFubm90YXRpb25zID0gb25lT3JNb3JlKGFubm90YXRpb24oKSk7CiAgICAgICAgcmV0dXJuIGFubm90YXRpb25zOwogICAgfQoKICAgIC8qKiBBbm5vdGF0aW9uOgogICAgICogICAgICBOb3JtYWxBbm5vdGF0aW9uCiAgICAgKiAgICAgIE1hcmtlckFubm90YXRpb24KICAgICAqICAgICAgU2luZ2xlRWxlbWVudEFubm90YXRpb24KICAgICAqLwogICAgcHVibGljIFBhcnNlciBhbm5vdGF0aW9uKCkgewogICAgICAgIGxvZygiYW5ub3RhdGlvbiIpOwogICAgICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwpIHJldHVybiBhbm5vdGF0aW9uOwogICAgICAgIGFubm90YXRpb24gPSBhbHRlcm5hdGlvbigiPGFubm90YXRpb24+Iik7CiAgICAgICAgYW5ub3RhdGlvbi5hZGQobm9ybWFsQW5ub3RhdGlvbigpKTsKICAgICAgICBhbm5vdGF0aW9uLmFkZChtYXJrZXJBbm5vdGF0aW9uKCkpOwogICAgICAgIGFubm90YXRpb24uYWRkKHNpbmdsZUVsZW1lbnRBbm5vdGF0aW9uKCkpOwogICAgICAgIHJldHVybiBhbm5vdGF0aW9uOwogICAgfQoKICAgIC8qKiBOb3JtYWxBbm5vdGF0aW9uOgogICAgICogICAgICBAIFR5cGVOYW1lICggRWxlbWVudFZhbHVlUGFpcnMgb3B0ICkKICAgICAqLwogICAgcHVibGljIFBhcnNlciBub3JtYWxBbm5vdGF0aW9uKCkgewogICAgICAgIGxvZygibm9ybWFsQW5ub3RhdGlvbiIpOwogICAgICAgIGlmIChub3JtYWxBbm5vdGF0aW9uICE9IG51bGwpIHJldHVybiBub3JtYWxBbm5vdGF0aW9uOwogICAgICAgIG5vcm1hbEFubm90YXRpb24gPSBzZXF1ZW5jZSgiPG5vcm1hbEFubm90YXRpb24+Iik7CiAgICAgICAgICAgIG5vcm1hbEFubm90YXRpb24uYWRkKG5ldyBTeW1ib2woJ0AnKSk7CiAgICAgICAgICAgIG5vcm1hbEFubm90YXRpb24uYWRkKHR5cGVOYW1lKCkpOwogICAgICAgICAgICBub3JtYWxBbm5vdGF0aW9uLmFkZChuZXcgU3ltYm9sKCcoJykpOwogICAgICAgICAgICBub3JtYWxBbm5vdGF0aW9uLmFkZCh6ZXJvT3JPbmUoZWxlbWVudFZhbHVlUGFpcnMoKSkpOwogICAgICAgICAgICBub3JtYWxBbm5vdGF0aW9uLmFkZChuZXcgU3ltYm9sKCcpJykpOwogICAgICAgIHJldHVybiBub3JtYWxBbm5vdGF0aW9uOwogICAgfQoKICAgIC8qKiBFbGVtZW50VmFsdWVQYWlyczoKICAgICAqICAgICAgRWxlbWVudFZhbHVlUGFpcgogICAgICogICAgICBFbGVtZW50VmFsdWVQYWlycyAsIEVsZW1lbnRWYWx1ZVBhaXIKICAgICAqLwogICAgcHVibGljIFBhcnNlciBlbGVtZW50VmFsdWVQYWlycygpIHsKICAgICAgICBsb2coImVsZW1lbnRWYWx1ZVBhaXJzIik7CiAgICAgICAgaWYgKGVsZW1lbnRWYWx1ZVBhaXJzICE9IG51bGwpIHJldHVybiBlbGVtZW50VmFsdWVQYWlyczsKICAgICAgICBlbGVtZW50VmFsdWVQYWlycyA9IGFsdGVybmF0aW9uKCI8ZWxlbWVudFZhbHVlUGFpcnM+Iik7CiAgICAgICAgZWxlbWVudFZhbHVlUGFpcnMuYWRkKGVsZW1lbnRWYWx1ZVBhaXIoKSk7CiAgICAgICAgZWxlbWVudFZhbHVlUGFpcnMuYWRkKHNlcXVlbmNlKCI8ZWxlbWVudFZhbHVlUGFpcnMkMT4iKQogICAgICAgICAgICAgICAgLmFkZChlbGVtZW50VmFsdWVQYWlycygpKQogICAgICAgICAgICAgICAgLmFkZChuZXcgU3ltYm9sKCcsJykpCiAgICAgICAgICAgICAgICAuYWRkKGVsZW1lbnRWYWx1ZVBhaXIoKSkKICAgICAgICAgICAgKTsKICAgICAgICByZXR1cm4gZWxlbWVudFZhbHVlUGFpcnM7CiAgICB9CgogICAgLyoqIEVsZW1lbnRWYWx1ZVBhaXI6CiAgICAgKiAgICAgIElkZW50aWZpZXIgPSBFbGVtZW50VmFsdWUKICAgICAqLwogICAgcHVibGljIFBhcnNlciBlbGVtZW50VmFsdWVQYWlyKCkgewogICAgICAgIGxvZygiZWxlbWVudFZhbHVlUGFpciIpOwogICAgICAgIGlmIChlbGVtZW50VmFsdWVQYWlyICE9IG51bGwpIHJldHVybiBlbGVtZW50VmFsdWVQYWlyOwogICAgICAgIGVsZW1lbnRWYWx1ZVBhaXIgPSBzZXF1ZW5jZSgiPGVsZW1lbnRWYWx1ZVBhaXI+Iik7CiAgICAgICAgICAgIGVsZW1lbnRWYWx1ZVBhaXIuYWRkKGlkZW50aWZpZXIoKSk7CiAgICAgICAgICAgIGVsZW1lbnRWYWx1ZVBhaXIuYWRkKG5ldyBTeW1ib2woJz0nKSk7CiAgICAgICAgICAgIGVsZW1lbnRWYWx1ZVBhaXIuYWRkKGVsZW1lbnRWYWx1ZSgpKTsKICAgICAgICByZXR1cm4gZWxlbWVudFZhbHVlUGFpcjsKICAgIH0KCiAgICAvKiogRWxlbWVudFZhbHVlOgogICAgICogICAgICBDb25kaXRpb25hbEV4cHJlc3Npb24KICAgICAqICAgICAgQW5ub3RhdGlvbgogICAgICogICAgICBFbGVtZW50VmFsdWVBcnJheUluaXRpYWxpemVyCiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgZWxlbWVudFZhbHVlKCkgewogICAgICAgIGxvZygiZWxlbWVudFZhbHVlIik7CiAgICAgICAgaWYgKGVsZW1lbnRWYWx1ZSAhPSBudWxsKSByZXR1cm4gZWxlbWVudFZhbHVlOwogICAgICAgIGVsZW1lbnRWYWx1ZSA9IGFsdGVybmF0aW9uKCI8ZWxlbWVudFZhbHVlPiIpOwogICAgICAgIGVsZW1lbnRWYWx1ZS5hZGQoY29uZGl0aW9uYWxFeHByZXNzaW9uKCkpOwogICAgICAgIGVsZW1lbnRWYWx1ZS5hZGQoYW5ub3RhdGlvbigpKTsKICAgICAgICBlbGVtZW50VmFsdWUuYWRkKGVsZW1lbnRWYWx1ZUFycmF5SW5pdGlhbGl6ZXIoKSk7CiAgICAgICAgcmV0dXJuIGVsZW1lbnRWYWx1ZTsKICAgIH0KCiAgICAvKiogRWxlbWVudFZhbHVlQXJyYXlJbml0aWFsaXplcjoKICAgICAqICAgICAgeyBFbGVtZW50VmFsdWVzb3B0ICxvcHQgfQogICAgICovCiAgICBwdWJsaWMgUGFyc2VyIGVsZW1lbnRWYWx1ZUFycmF5SW5pdGlhbGl6ZXIoKSB7CiAgICAgICAgbG9nKCJlbGVtZW50VmFsdWVBcnJheUluaXRpYWxpemVyIik7CiAgICAgICAgaWYgKGVsZW1lbnRWYWx1ZUFycmF5SW5pdGlhbGl6ZXIgIT0gbnVsbCkgcmV0dXJuIGVsZW1lbnRWYWx1ZUFycmF5SW5pdGlhbGl6ZXI7CiAgICAgICAgZWxlbWVudFZhbHVlQXJyYXlJbml0aWFsaXplciA9IHNlcXVlbmNlKCI8ZWxlbWVudFZhbHVlQXJyYXlJbml0aWFsaXplcj4iKTsKICAgICAgICAgICAgZWxlbWVudFZhbHVlQXJyYXlJbml0aWFsaXplci5hZGQobmV3IFN5bWJvbCgneycpKTsKICAgICAgICAgICAgZWxlbWVudFZhbHVlQXJyYXlJbml0aWFsaXplci5hZGQoemVyb09yT25lKGVsZW1lbnRWYWx1ZXMoKSkpOwogICAgICAgICAgICBlbGVtZW50VmFsdWVBcnJheUluaXRpYWxpemVyLmFkZCh6ZXJvT3JPbmUobmV3IFN5bWJvbCgnLCcpKSk7CiAgICAgICAgICAgIGVsZW1lbnRWYWx1ZUFycmF5SW5pdGlhbGl6ZXIuYWRkKG5ldyBTeW1ib2woJ30nKSk7CiAgICAgICAgcmV0dXJuIGVsZW1lbnRWYWx1ZUFycmF5SW5pdGlhbGl6ZXI7CiAgICB9CgogICAgLyoqIEVsZW1lbnRWYWx1ZXM6CiAgICAgKiAgICAgIEVsZW1lbnRWYWx1ZQogICAgICogICAgICBFbGVtZW50VmFsdWVzICwgRWxlbWVudFZhbHVlCiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgZWxlbWVudFZhbHVlcygpIHsKICAgICAgICBsb2coImVsZW1lbnRWYWx1ZXMiKTsKICAgICAgICBpZiAoZWxlbWVudFZhbHVlcyAhPSBudWxsKSByZXR1cm4gZWxlbWVudFZhbHVlczsKICAgICAgICBlbGVtZW50VmFsdWVzID0gYWx0ZXJuYXRpb24oIjxlbGVtZW50VmFsdWVzPiIpOwogICAgICAgIGVsZW1lbnRWYWx1ZXMuYWRkKGVsZW1lbnRWYWx1ZSgpKTsKICAgICAgICBlbGVtZW50VmFsdWVzLmFkZChzZXF1ZW5jZSgiPGVsZW1lbnRWYWx1ZXMkMT4iKQogICAgICAgICAgICAgICAgLmFkZChlbGVtZW50VmFsdWVzKCkpCiAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJywnKSkKICAgICAgICAgICAgICAgIC5hZGQoZWxlbWVudFZhbHVlKCkpCiAgICAgICAgICAgICk7CiAgICAgICAgcmV0dXJuIGVsZW1lbnRWYWx1ZXM7CiAgICB9CgogICAgLyoqIE1hcmtlckFubm90YXRpb246CiAgICAgKiAgICAgIEAgVHlwZU5hbWUKICAgICAqLwogICAgcHVibGljIFBhcnNlciBtYXJrZXJBbm5vdGF0aW9uKCkgewogICAgICAgIGxvZygibWFya2VyQW5ub3RhdGlvbiIpOwogICAgICAgIGlmIChtYXJrZXJBbm5vdGF0aW9uICE9IG51bGwpIHJldHVybiBtYXJrZXJBbm5vdGF0aW9uOwogICAgICAgIG1hcmtlckFubm90YXRpb24gPSBzZXF1ZW5jZSgiPG1hcmtlckFubm90YXRpb24+Iik7CiAgICAgICAgICAgIG1hcmtlckFubm90YXRpb24uYWRkKG5ldyBTeW1ib2woJ0AnKSk7CiAgICAgICAgICAgIG1hcmtlckFubm90YXRpb24uYWRkKHR5cGVOYW1lKCkpOwogICAgICAgIHJldHVybiBtYXJrZXJBbm5vdGF0aW9uOwogICAgfQoKICAgIC8qKiBTaW5nbGVFbGVtZW50QW5ub3RhdGlvbjoKICAgICAqICAgICAgQCBUeXBlTmFtZSAoIEVsZW1lbnRWYWx1ZSApCiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgc2luZ2xlRWxlbWVudEFubm90YXRpb24oKSB7CiAgICAgICAgbG9nKCJzaW5nbGVFbGVtZW50QW5ub3RhdGlvbiIpOwogICAgICAgIGlmIChzaW5nbGVFbGVtZW50QW5ub3RhdGlvbiAhPSBudWxsKSByZXR1cm4gc2luZ2xlRWxlbWVudEFubm90YXRpb247CiAgICAgICAgc2luZ2xlRWxlbWVudEFubm90YXRpb24gPSBzZXF1ZW5jZSgiPHNpbmdsZUVsZW1lbnRBbm5vdGF0aW9uPiIpOwogICAgICAgICAgICBzaW5nbGVFbGVtZW50QW5ub3RhdGlvbi5hZGQobmV3IFN5bWJvbCgnQCcpKTsKICAgICAgICAgICAgc2luZ2xlRWxlbWVudEFubm90YXRpb24uYWRkKHR5cGVOYW1lKCkpOwogICAgICAgICAgICBzaW5nbGVFbGVtZW50QW5ub3RhdGlvbi5hZGQobmV3IFN5bWJvbCgnKCcpKTsKICAgICAgICAgICAgc2luZ2xlRWxlbWVudEFubm90YXRpb24uYWRkKGVsZW1lbnRWYWx1ZSgpKTsKICAgICAgICAgICAgc2luZ2xlRWxlbWVudEFubm90YXRpb24uYWRkKG5ldyBTeW1ib2woJyknKSk7CiAgICAgICAgcmV0dXJuIHNpbmdsZUVsZW1lbnRBbm5vdGF0aW9uOwogICAgfQoKICAgIC8vIC0tLS0tLS0tIEpMU3YzpDE1LjkgLS0tLS0tLS0tLS0KICAgIC8qKiBBcmd1bWVudExpc3Q6CiAgICAgKiAgICAgIEV4cHJlc3Npb24KICAgICAqICAgICAgQXJndW1lbnRMaXN0ICxFeHByZXNzaW9uCiAgICAgKi8KICAgIHB1YmxpYyBQYXJzZXIgYXJndW1lbnRMaXN0KCkgewogICAgICAgIGxvZygiYXJndW1lbnRMaXN0Iik7CiAgICAgICAgaWYgKGFyZ3VtZW50TGlzdCAhPSBudWxsKSByZXR1cm4gYXJndW1lbnRMaXN0OwogICAgICAgIGFyZ3VtZW50TGlzdCA9IGFsdGVybmF0aW9uKCI8YXJndW1lbnRMaXN0PiIpOwogICAgICAgIGFyZ3VtZW50TGlzdC5hZGQoZXhwcmVzc2lvbigpKTsKICAgICAgICBhcmd1bWVudExpc3QuYWRkKHNlcXVlbmNlKCI8YXJndW1lbnRMaXN0JDE+IikKICAgICAgICAgICAgICAgIC5hZGQoYXJndW1lbnRMaXN0KCkpCiAgICAgICAgICAgICAgICAuYWRkKG5ldyBTeW1ib2woJywnKSkKICAgICAgICAgICAgICAgIC5hZGQoZXhwcmVzc2lvbigpKQogICAgICAgICAgICApOwogICAgICAgIHJldHVybiBhcmd1bWVudExpc3Q7CiAgICB9CgoKICAgIC8vIHRvZG8gLS0tLS0tLSB0eXBvcyBhbmQgYWJicmV2aWF0aW9ucyBpbiBzcGVjIC0tLS0tLS0tLS0tLQogICAgcHVibGljIFBhcnNlciB0eXBlTmFtZSgpIHsKICAgICAgICBsb2coInR5cGVOYW1lIik7CiAgICAgICAgaWYgKHR5cGVOYW1lICE9IG51bGwpIHJldHVybiB0eXBlTmFtZTsKICAgICAgICB0eXBlTmFtZSA9IHR5cGUoKTsKICAgICAgICByZXR1cm4gdHlwZU5hbWU7CiAgICB9CgogICAgcHVibGljIFBhcnNlciBleHByKCkgewogICAgICAgIGxvZygiZXhwciIpOwogICAgICAgIGlmIChleHByICE9IG51bGwpIHJldHVybiBleHByOwogICAgICAgIGV4cHIgPSBleHByZXNzaW9uKCk7CiAgICAgICAgcmV0dXJuIGV4cHI7CiAgICB9CgogICAgcHVibGljIFBhcnNlciBleHByZXNzaW9uU3RhdGVtZW50KCkgewogICAgICAgIGxvZygiZXhwcmVzc2lvblN0YXRlbWVudCIpOwogICAgICAgIGlmIChleHByZXNzaW9uU3RhdGVtZW50ICE9IG51bGwpIHJldHVybiBleHByZXNzaW9uU3RhdGVtZW50OwogICAgICAgIGV4cHJlc3Npb25TdGF0ZW1lbnQgPSBzdGF0ZW1lbnRFeHByZXNzaW9uKCk7CiAgICAgICAgcmV0dXJuIGV4cHJlc3Npb25TdGF0ZW1lbnQ7CiAgICB9CgogICAgLy8gQW5ub3RhdGlvbnMgcmVmZXJzIHRvIKQxNS4yNSwgYnV0IHRoaXMgaXMgcmVwbGFjZWQgd2l0aCBFeHByZXNzaW9ucwogICAgLy8gdG9kbyAtIGNvbmRpdGlvbmFsZXhwcmVzc2lvbnMgaW4gYW5ub3RhdGlvbnMgbWF5IG5vdCB3b3JrLCBvciB0b28gbXVjaCBtaWdodCBiZSBhbGxvd2VkIGluIGFubm90YXRpb25zLi4uCiAgICBwdWJsaWMgUGFyc2VyIGNvbmRpdGlvbmFsRXhwcmVzc2lvbigpIHsKICAgICAgICBsb2coImNvbmRpdGlvbmFsRXhwcmVzc2lvbiIpOwogICAgICAgIGlmIChjb25kaXRpb25hbEV4cHJlc3Npb24gIT0gbnVsbCkgcmV0dXJuIGNvbmRpdGlvbmFsRXhwcmVzc2lvbjsKICAgICAgICBjb25kaXRpb25hbEV4cHJlc3Npb24gPSBleHByZXNzaW9uKCk7CiAgICAgICAgcmV0dXJuIGNvbmRpdGlvbmFsRXhwcmVzc2lvbjsKICAgIH0KCgogICAgLy8gdG9kbyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgoKCiAgICBwdWJsaWMgUGFyc2VyIG51bGxMaXRlcmFsKCkgewogICAgICAgIGxvZygibnVsbExpdGVyYWwiKTsKICAgICAgICBpZiAobnVsbExpdGVyYWwgIT0gbnVsbCkgcmV0dXJuIG51bGxMaXRlcmFsOwogICAgICAgIC8vdG9kbwogICAgICAgIG51bGxMaXRlcmFsID0gbmV3IFdvcmQoKTsKICAgICAgICByZXR1cm4gbnVsbExpdGVyYWw7CiAgICB9CgogICAgcHVibGljIFBhcnNlciBib29sZWFuTGl0ZXJhbCgpIHsKICAgICAgICBsb2coImJvb2xlYW5MaXRlcmFsIik7CiAgICAgICAgaWYgKGJvb2xlYW5MaXRlcmFsICE9IG51bGwpIHJldHVybiBib29sZWFuTGl0ZXJhbDsKICAgICAgICAvL3RvZG8KICAgICAgICBib29sZWFuTGl0ZXJhbCA9IG5ldyBXb3JkKCk7CiAgICAgICAgcmV0dXJuIGJvb2xlYW5MaXRlcmFsOwogICAgfQoKICAgIHB1YmxpYyBQYXJzZXIgc3RyaW5nTGl0ZXJhbCgpIHsKICAgICAgICBsb2coInN0cmluZ0xpdGVyYWwiKTsKICAgICAgICBpZiAoc3RyaW5nTGl0ZXJhbCAhPSBudWxsKSByZXR1cm4gc3RyaW5nTGl0ZXJhbDsKICAgICAgICAvL3RvZG8KICAgICAgICBzdHJpbmdMaXRlcmFsID0gbmV3IFdvcmQoKTsKICAgICAgICByZXR1cm4gc3RyaW5nTGl0ZXJhbDsKICAgIH0KCiAgICBwdWJsaWMgUGFyc2VyIGNoYXJhY3RlckxpdGVyYWwoKSB7CiAgICAgICAgbG9nKCJjaGFyYWN0ZXJMaXRlcmFsIik7CiAgICAgICAgaWYgKGNoYXJhY3RlckxpdGVyYWwgIT0gbnVsbCkgcmV0dXJuIGNoYXJhY3RlckxpdGVyYWw7CiAgICAgICAgLy90b2RvCiAgICAgICAgY2hhcmFjdGVyTGl0ZXJhbCA9IG5ldyBXb3JkKCk7CiAgICAgICAgcmV0dXJuIGNoYXJhY3RlckxpdGVyYWw7CiAgICB9CgogICAgcHVibGljIFBhcnNlciBmbG9hdGluZ1BvaW50TGl0ZXJhbCgpIHsKICAgICAgICBsb2coImZsb2F0aW5nUG9pbnRMaXRlcmFsIik7CiAgICAgICAgaWYgKGZsb2F0aW5nUG9pbnRMaXRlcmFsICE9IG51bGwpIHJldHVybiBmbG9hdGluZ1BvaW50TGl0ZXJhbDsKICAgICAgICAvL3RvZG8KICAgICAgICBmbG9hdGluZ1BvaW50TGl0ZXJhbCA9IG5ldyBOdW0oKTsKICAgICAgICByZXR1cm4gZmxvYXRpbmdQb2ludExpdGVyYWw7CiAgICB9CgogICAgcHVibGljIFBhcnNlciBpbnRlZ2VyTGl0ZXJhbCgpIHsKICAgICAgICBsb2coImludGVnZXJMaXRlcmFsIik7CiAgICAgICAgaWYgKGludGVnZXJMaXRlcmFsICE9IG51bGwpIHJldHVybiBpbnRlZ2VyTGl0ZXJhbDsKICAgICAgICAvL3RvZG8KICAgICAgICBpbnRlZ2VyTGl0ZXJhbCA9IG5ldyBOdW0oKTsKICAgICAgICByZXR1cm4gaW50ZWdlckxpdGVyYWw7CiAgICB9CgogICAgLy8gVGhlIGZvbGxvd2luZyBzaW5nbGV0b25zIGFyZSB1c2VkIHRvIHByZXZlbnQgbGVmdCByZWN1cnNpb24gaW4gZ3JhbW1hcgogICAgcHJvdGVjdGVkIFNlcXVlbmNlIHF1YWxpZmllZElkZW50aWZpZXI7CiAgICBwcm90ZWN0ZWQgQWx0ZXJuYXRpb24gbGl0ZXJhbDsKICAgIHByb3RlY3RlZCBBbHRlcm5hdGlvbiBhc3NpZ25tZW50T3BlcmF0b3I7CiAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgdHlwZUFyZ3VtZW50czsKICAgIHByb3RlY3RlZCBBbHRlcm5hdGlvbiB0eXBlQXJndW1lbnQ7CiAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgcmF3VHlwZTsKICAgIHByb3RlY3RlZCBQYXJzZXIgc3RhdGVtZW50RXhwcmVzc2lvbjsKICAgIHByb3RlY3RlZCBQYXJzZXIgY29uc3RhbnRFeHByZXNzaW9uOwogICAgcHJvdGVjdGVkIFNlcXVlbmNlIGV4cHJlc3Npb24xOwogICAgcHJvdGVjdGVkIFBhcnNlciBleHByZXNzaW9uMVJlc3Q7CiAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgZXhwcmVzc2lvbjI7CiAgICBwcm90ZWN0ZWQgQWx0ZXJuYXRpb24gZXhwcmVzc2lvbjJSZXN0OwogICAgcHJvdGVjdGVkIEFsdGVybmF0aW9uIGluZml4T3A7CiAgICBwcm90ZWN0ZWQgQWx0ZXJuYXRpb24gcHJpbWFyeTsKICAgIHByb3RlY3RlZCBBbHRlcm5hdGlvbiBpZGVudGlmaWVyU3VmZml4OwogICAgcHJvdGVjdGVkIFNlcXVlbmNlIGV4cGxpY2l0R2VuZXJpY0ludm9jYXRpb247CiAgICBwcm90ZWN0ZWQgU2VxdWVuY2Ugbm9uV2lsZGNhcmRUeXBlQXJndW1lbnRzOwogICAgcHJvdGVjdGVkIEFsdGVybmF0aW9uIGV4cGxpY2l0R2VuZXJpY0ludm9jYXRpb25TdWZmaXg7CiAgICBwcm90ZWN0ZWQgQWx0ZXJuYXRpb24gcHJlZml4T3A7CiAgICBwcm90ZWN0ZWQgQWx0ZXJuYXRpb24gcG9zdGZpeE9wOwogICAgcHJvdGVjdGVkIEFsdGVybmF0aW9uIHNlbGVjdG9yOwogICAgcHJvdGVjdGVkIEFsdGVybmF0aW9uIHN1cGVyU3VmZml4OwogICAgcHJvdGVjdGVkIEFsdGVybmF0aW9uIGJhc2ljVHlwZTsKICAgIHByb3RlY3RlZCBQYXJzZXIgYXJndW1lbnRzT3B0OwogICAgcHJvdGVjdGVkIFNlcXVlbmNlIGFyZ3VtZW50czsKICAgIHByb3RlY3RlZCBSZXBldGl0aW9uIGJyYWNrZXRzT3B0OwogICAgcHJvdGVjdGVkIFNlcXVlbmNlIGNyZWF0b3I7CiAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgY3JlYXRlZE5hbWU7CiAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgaW5uZXJDcmVhdG9yOwogICAgcHJvdGVjdGVkIFNlcXVlbmNlIGFycmF5Q3JlYXRvclJlc3Q7CiAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgY2xhc3NDcmVhdG9yUmVzdDsKICAgIHByb3RlY3RlZCBBbHRlcm5hdGlvbiB2YXJpYWJsZUluaXRpYWxpemVyOwogICAgcHJvdGVjdGVkIFNlcXVlbmNlIHBhckV4cHJlc3Npb247CiAgICBwcm90ZWN0ZWQgUmVwZXRpdGlvbiBibG9ja1N0YXRlbWVudHM7CiAgICBwcm90ZWN0ZWQgQWx0ZXJuYXRpb24gYmxvY2tTdGF0ZW1lbnQ7CiAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgbG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50OwogICAgcHJvdGVjdGVkIEFsdGVybmF0aW9uIHN0YXRlbWVudDsKICAgIHByb3RlY3RlZCBTZXF1ZW5jZSBjYXRjaGVzOwogICAgcHJvdGVjdGVkIFNlcXVlbmNlIGNhdGNoQ2xhdXNlOwogICAgcHJvdGVjdGVkIFJlcGV0aXRpb24gc3dpdGNoQmxvY2tTdGF0ZW1lbnRHcm91cHM7CiAgICBwcm90ZWN0ZWQgU2VxdWVuY2Ugc3dpdGNoQmxvY2tTdGF0ZW1lbnRHcm91cDsKICAgIHByb3RlY3RlZCBBbHRlcm5hdGlvbiBzd2l0Y2hMYWJlbDsKICAgIHByb3RlY3RlZCBSZXBldGl0aW9uIG1vcmVTdGF0ZW1lbnRFeHByZXNzaW9uczsKICAgIHByb3RlY3RlZCBBbHRlcm5hdGlvbiBmb3JDb250cm9sOwogICAgcHJvdGVjdGVkIEFsdGVybmF0aW9uIGZvckNvbnRyb2xSZXN0OwogICAgcHJvdGVjdGVkIFNlcXVlbmNlIGZvclVwZGF0ZTsKICAgIHByb3RlY3RlZCBSZXBldGl0aW9uIG1vZGlmaWVyc09wdDsKICAgIHByb3RlY3RlZCBBbHRlcm5hdGlvbiBtb2RpZmllcjsKICAgIHByb3RlY3RlZCBTZXF1ZW5jZSB2YXJpYWJsZURlY2xhcmF0b3JzOwogICAgcHJvdGVjdGVkIFNlcXVlbmNlIHZhcmlhYmxlRGVjbGFyYXRvcnNSZXN0OwogICAgcHJvdGVjdGVkIFNlcXVlbmNlIGNvbnN0YW50RGVjbGFyYXRvcnNSZXN0OwogICAgcHJvdGVjdGVkIFNlcXVlbmNlIGNvbnN0YW50RGVjbGFyYXRvcjsKICAgIHByb3RlY3RlZCBTZXF1ZW5jZSB2YXJpYWJsZURlY2xhcmF0b3JSZXN0OwogICAgcHJvdGVjdGVkIFNlcXVlbmNlIGNvbnN0YW50RGVjbGFyYXRvclJlc3Q7CiAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgdmFyaWFibGVEZWNsYXJhdG9ySWQ7CiAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgY29tcGlsYXRpb25Vbml0OwogICAgcHJvdGVjdGVkIFNlcXVlbmNlIGltcG9ydERlY2xhcmF0aW9uOwogICAgcHJvdGVjdGVkIEFsdGVybmF0aW9uIHR5cGVEZWNsYXJhdGlvbjsKICAgIHByb3RlY3RlZCBTZXF1ZW5jZSBub3JtYWxDbGFzc0RlY2xhcmF0aW9uOwogICAgcHJvdGVjdGVkIFNlcXVlbmNlIHR5cGVQYXJhbWV0ZXJzOwogICAgcHJvdGVjdGVkIFNlcXVlbmNlIHR5cGVQYXJhbWV0ZXI7CiAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgYm91bmQ7CiAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgZW51bURlY2xhcmF0aW9uOwogICAgcHJvdGVjdGVkIFNlcXVlbmNlIGVudW1Cb2R5OwogICAgcHJvdGVjdGVkIEFsdGVybmF0aW9uIGVudW1Db25zdGFudHM7CiAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgZW51bUNvbnN0YW50OwogICAgcHJvdGVjdGVkIFNlcXVlbmNlIGVudW1Bcmd1bWVudHM7CiAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgZW51bUJvZHlEZWNsYXJhdGlvbnM7CiAgICBwcm90ZWN0ZWQgQWx0ZXJuYXRpb24gaW50ZXJmYWNlRGVjbGFyYXRpb247CiAgICBwcm90ZWN0ZWQgU2VxdWVuY2Ugbm9ybWFsSW50ZXJmYWNlRGVjbGFyYXRpb247CiAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgdHlwZUxpc3Q7CiAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKICAgIHByb3RlY3RlZCBTZXF1ZW5jZSBhbm5vdGF0aW9uVHlwZUJvZHk7CiAgICBwcm90ZWN0ZWQgQWx0ZXJuYXRpb24gYW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb25zOwogICAgcHJvdGVjdGVkIEFsdGVybmF0aW9uIGFubm90YXRpb25UeXBlRWxlbWVudERlY2xhcmF0aW9uOwogICAgcHJvdGVjdGVkIFNlcXVlbmNlIGRlZmF1bHRWYWx1ZTsKICAgIHByb3RlY3RlZCBTZXF1ZW5jZSBjbGFzc0JvZHk7CiAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgaW50ZXJmYWNlQm9keTsKICAgIHByb3RlY3RlZCBBbHRlcm5hdGlvbiBjbGFzc0JvZHlEZWNsYXJhdGlvbjsKICAgIHByb3RlY3RlZCBBbHRlcm5hdGlvbiBtZW1iZXJEZWNsOwogICAgcHJvdGVjdGVkIFNlcXVlbmNlIGdlbmVyaWNNZXRob2RPckNvbnN0cnVjdG9yRGVjbDsKICAgIHByb3RlY3RlZCBBbHRlcm5hdGlvbiBnZW5lcmljTWV0aG9kT3JDb25zdHJ1Y3RvclJlc3Q7CiAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgbWV0aG9kT3JGaWVsZERlY2w7CiAgICBwcm90ZWN0ZWQgQWx0ZXJuYXRpb24gbWV0aG9kT3JGaWVsZFJlc3Q7CiAgICBwcm90ZWN0ZWQgQWx0ZXJuYXRpb24gaW50ZXJmYWNlQm9keURlY2xhcmF0aW9uOwogICAgcHJvdGVjdGVkIEFsdGVybmF0aW9uIGludGVyZmFjZU1lbWJlckRlY2w7CiAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgaW50ZXJmYWNlTWV0aG9kT3JGaWVsZERlY2w7CiAgICBwcm90ZWN0ZWQgQWx0ZXJuYXRpb24gaW50ZXJmYWNlTWV0aG9kT3JGaWVsZFJlc3Q7CiAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgbWV0aG9kRGVjbGFyYXRvclJlc3Q7CiAgICBwcm90ZWN0ZWQgU2VxdWVuY2Ugdm9pZE1ldGhvZERlY2xhcmF0b3JSZXN0OwogICAgcHJvdGVjdGVkIFNlcXVlbmNlIGludGVyZmFjZU1ldGhvZERlY2xhcmF0b3JSZXN0OwogICAgcHJvdGVjdGVkIFNlcXVlbmNlIGludGVyZmFjZUdlbmVyaWNNZXRob2REZWNsOwogICAgcHJvdGVjdGVkIFNlcXVlbmNlIHZvaWRJbnRlcmZhY2VNZXRob2REZWNsYXJhdG9yUmVzdDsKICAgIHByb3RlY3RlZCBTZXF1ZW5jZSBjb25zdHJ1Y3RvckRlY2xhcmF0b3JSZXN0OwogICAgcHJvdGVjdGVkIFNlcXVlbmNlIGZvcm1hbFBhcmFtZXRlcnM7CiAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgZm9ybWFsUGFyYW1ldGVyRGVjbHM7CiAgICBwcm90ZWN0ZWQgUGFyc2VyIG1ldGhvZEJvZHk7CiAgICBwcm90ZWN0ZWQgQWx0ZXJuYXRpb24gY2xhc3NNb2RpZmllcjsKICAgIHByb3RlY3RlZCBQYXJzZXIgY2xhc3NCb2R5RGVjbGFyYXRpb25zOwogICAgcHJvdGVjdGVkIFNlcXVlbmNlIGZvcm1hbFBhcmFtZXRlcjsKICAgIHByb3RlY3RlZCBQYXJzZXIgdmFyaWFibGVNb2RpZmllcnM7CiAgICBwcm90ZWN0ZWQgQWx0ZXJuYXRpb24gdmFyaWFibGVNb2RpZmllcjsKICAgIHByb3RlY3RlZCBQYXJzZXIgaW50ZXJmYWNlTW9kaWZpZXJzOwogICAgcHJvdGVjdGVkIEFsdGVybmF0aW9uIGludGVyZmFjZU1vZGlmaWVyOwogICAgcHJvdGVjdGVkIFNlcXVlbmNlIGNvbnN0YW50RGVjbGFyYXRpb247CiAgICBwcm90ZWN0ZWQgUGFyc2VyIGNvbnN0YW50TW9kaWZpZXJzOwogICAgcHJvdGVjdGVkIEFsdGVybmF0aW9uIGNvbnN0YW50TW9kaWZpZXI7CiAgICBwcm90ZWN0ZWQgUGFyc2VyIGFic3RyYWN0TWV0aG9kTW9kaWZpZXJzOwogICAgcHJvdGVjdGVkIEFsdGVybmF0aW9uIGFic3RyYWN0TWV0aG9kTW9kaWZpZXI7CiAgICBwcm90ZWN0ZWQgU2VxdWVuY2Ugbm9ybWFsQW5ub3RhdGlvbjsKICAgIHByb3RlY3RlZCBTZXF1ZW5jZSBlbGVtZW50VmFsdWVQYWlyOwogICAgcHJvdGVjdGVkIFNlcXVlbmNlIGVsZW1lbnRWYWx1ZUFycmF5SW5pdGlhbGl6ZXI7CiAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgbWFya2VyQW5ub3RhdGlvbjsKICAgIHByb3RlY3RlZCBTZXF1ZW5jZSBzaW5nbGVFbGVtZW50QW5ub3RhdGlvbjsKICAgIHByb3RlY3RlZCBTZXF1ZW5jZSBleHByZXNzaW9uOwogICAgcHJvdGVjdGVkIEFsdGVybmF0aW9uIHR5cGU7CiAgICBwcm90ZWN0ZWQgQWx0ZXJuYXRpb24gZXhwcmVzc2lvbjM7CiAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgYXJyYXlJbml0aWFsaXplcjsKICAgIHByb3RlY3RlZCBTZXF1ZW5jZSB2YXJpYWJsZURlY2xhcmF0b3I7CiAgICBwcm90ZWN0ZWQgQWx0ZXJuYXRpb24gY2xhc3NEZWNsYXJhdGlvbjsKICAgIHByb3RlY3RlZCBQYXJzZXIgYW5ub3RhdGlvbnM7CiAgICBwcm90ZWN0ZWQgQWx0ZXJuYXRpb24gYW5ub3RhdGlvbjsKICAgIHByb3RlY3RlZCBBbHRlcm5hdGlvbiBlbGVtZW50VmFsdWU7CiAgICBwcm90ZWN0ZWQgQWx0ZXJuYXRpb24gZWxlbWVudFZhbHVlczsKICAgIHByb3RlY3RlZCBBbHRlcm5hdGlvbiBlbGVtZW50VmFsdWVQYWlyczsKICAgIHByb3RlY3RlZCBBbHRlcm5hdGlvbiBmb3JtYWxQYXJhbWV0ZXJEZWNsc1Jlc3Q7CiAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgcXVhbGlmaWVkSWRlbnRpZmllckxpc3Q7CiAgICBwcm90ZWN0ZWQgU2VxdWVuY2UgY2xhc3NPckludGVyZmFjZURlY2xhcmF0aW9uOwogICAgcHJvdGVjdGVkIFNlcXVlbmNlIGJsb2NrOwogICAgcHJvdGVjdGVkIFBhcnNlciBjbGFzc01vZGlmaWVyczsKICAgIHByb3RlY3RlZCBBbHRlcm5hdGlvbiBhcmd1bWVudExpc3Q7CiAgICBwcm90ZWN0ZWQgUGFyc2VyIHR5cGVOYW1lOwogICAgcHJvdGVjdGVkIFBhcnNlciBleHByOwogICAgcHJvdGVjdGVkIFBhcnNlciBleHByZXNzaW9uU3RhdGVtZW50OwogICAgcHJvdGVjdGVkIFBhcnNlciBjb25kaXRpb25hbEV4cHJlc3Npb247CiAgICBwcm90ZWN0ZWQgUGFyc2VyIG51bGxMaXRlcmFsOwogICAgcHJvdGVjdGVkIFBhcnNlciBib29sZWFuTGl0ZXJhbDsKICAgIHByb3RlY3RlZCBQYXJzZXIgc3RyaW5nTGl0ZXJhbDsKICAgIHByb3RlY3RlZCBQYXJzZXIgY2hhcmFjdGVyTGl0ZXJhbDsKICAgIHByb3RlY3RlZCBQYXJzZXIgZmxvYXRpbmdQb2ludExpdGVyYWw7CiAgICBwcm90ZWN0ZWQgUGFyc2VyIGludGVnZXJMaXRlcmFsOwoKfQoK