restRoleBundle top-level property

MasonBundle restRoleBundle
final

Implementation

final restRoleBundle = MasonBundle.fromJson(<String, dynamic>{
  "files": [
    {
      "path": "lib/core/rest/app_rest.dart",
      "data":
          "aW1wb3J0ICdkYXJ0OmFzeW5jJzsKaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOwppbXBvcnQgJ2RhcnQ6bWF0aCc7CgppbXBvcnQgJ3BhY2thZ2U6Zmx1dHRlci9mb3VuZGF0aW9uLmRhcnQnOwoKaW1wb3J0ICcuLi9lbnYvYXBwX2Vudi5kYXJ0JzsKaW1wb3J0ICdyZXN0X3RyYW5zcG9ydC5kYXJ0JzsKCi8vLyBUaGUgUkVTVCBjbGllbnQgb2YgdGhlIGFwcC4gVGhlIGNvZGUgb2YgdGhlIGFwcCBtYWtlcyBpdHMgcmVxdWVzdHMgaGVyZSwKLy8vIGFuZCBnZXRzIGVhY2ggYW5zd2VyIG9yIGEgW1Jlc3RGYWlsdXJlXS4KZmluYWwgQXBwUmVzdENsaWVudCBhcHBSZXN0ID0gQXBwUmVzdENsaWVudCgKICB0cmFuc3BvcnQ6IGNyZWF0ZVJlc3RUcmFuc3BvcnQoKSwKICBiYXNlQWRkcmVzczogQXBwRW52LnJlc3RCYXNlVXJsLAogIHRva2Vuczoge3t7cmVzdF90b2tlbnN9fX0sCik7CgovLy8gV2h5IGEgY2FsbCBmYWlsZWQuCmVudW0gUmVzdEZhaWx1cmVSZWFzb24gewogIC8vLyBBIHJlbGF0aXZlIHBhdGgsIGFuZCBubyBhZGRyZXNzIHRvIGpvaW4gaXQgdG86CiAgLy8vIGBSRVNUX0JBU0VfVVJMYCBpbiBgLmVudmAgaXMgZW1wdHksIG9yIGlzIG5vIGFkZHJlc3Mgb2YgYSBzZXJ2ZXIuCiAgbm90Q29uZmlndXJlZCwKCiAgLy8vIFRoZSByZXF1ZXN0IGRpZCBub3QgcmVhY2ggYSBzZXJ2ZXIsIG9yIHRoZSBjb25uZWN0aW9uIGJyb2tlLgogIG5ldHdvcmssCgogIC8vLyBObyBjb21wbGV0ZSBhbnN3ZXIgd2l0aGluIHRoZSB0aW1lb3V0IG9mIHRoZSBhdHRlbXB0LCBvciBubyB0b2tlbiBvZiB0aGUKICAvLy8gdXNlciB3aXRoaW4gW0FwcFJlc3RDbGllbnQudG9rZW5XYWl0XS4gSXQgaXMgbmV2ZXIgcmVwZWF0ZWQ6IHRoZSB1c2VyCiAgLy8vIGhhcyB3YWl0ZWQgbG9uZyBlbm91Z2guCiAgdGltZW91dCwKCiAgLy8vIFRoZSBjYWxsZXIgY2FuY2VsbGVkIHRoZSBjYWxsIHdpdGggYSBbUmVzdENhbmNlbF0uCiAgY2FuY2VsbGVkLAoKICAvLy8gQSA0MDEsIGFmdGVyIG9uZSByZWZyZXNoIG9mIHRoZSB0b2tlbiB3aGVyZSB0aGUgY2xpZW50IGFkZGVkIG9uZS4gSXQKICAvLy8gc2lnbnMgbm9ib2R5IG91dCwgc2luY2UgYSBzZXJ2ZXIgbWF5IHJlZnVzZSBmb3Igb3RoZXIgcmVhc29uczogdGhlIGFwcAogIC8vLyBkZWNpZGVzIHdoYXQgaXQgbWVhbnMuCiAgdW5hdXRob3JpemVkLAoKICAvLy8gQSA0MDMuCiAgZm9yYmlkZGVuLAoKICAvLy8gQSA0MDQuCiAgbm90Rm91bmQsCgogIC8vLyBBIDQwOS4KICBjb25mbGljdCwKCiAgLy8vIEFueSBvdGhlciA0eHgsIG9yIGEgcmVsYXRpdmUgcGF0aCB0aGF0IGNsaW1icyBvdXQgb2YgdGhlIGFkZHJlc3Mgb2YgdGhlCiAgLy8vIEFQSSwgd2hpY2ggbm8gc2VydmVyIGdvdC4KICByZWplY3RlZCwKCiAgLy8vIEEgNDI5LgogIHRvb01hbnlSZXF1ZXN0cywKCiAgLy8vIEEgNXh4LgogIHNlcnZlciwKCiAgLy8vIEEgYm9keSB0aGF0IFtSZXN0UmVzcG9uc2UuZGVjb2RlZF0gZG9lcyBub3QgdGFrZS4KICBpbnZhbGlkUmVzcG9uc2UsCgogIC8vLyBBbnl0aGluZyBlbHNlLCBzdWNoIGFzIGEgcmVkaXJlY3Qgb2YgYSBgUE9TVGAuCiAgdW5rbm93biwKfQoKLy8vIFRoZSBvbmx5IHRoaW5nIHRoYXQgYSBjYWxsIG9mIFtBcHBSZXN0Q2xpZW50XSB0aHJvd3MuCmZpbmFsIGNsYXNzIFJlc3RGYWlsdXJlIGltcGxlbWVudHMgRXhjZXB0aW9uIHsKICAvLy8gQ3JlYXRlcyB0aGUgZmFpbHVyZS4KICBjb25zdCBSZXN0RmFpbHVyZSgKICAgIHRoaXMucmVhc29uLCB7CiAgICB0aGlzLnN0YXR1cywKICAgIHRoaXMucmVzcG9uc2UsCiAgICB0aGlzLnJldHJ5QWZ0ZXIsCiAgICB0aGlzLmRldmVsb3BlckhpbnQsCiAgfSk7CgogIC8vLyBXaHkgdGhlIGNhbGwgZmFpbGVkLCB3aGljaCB0aGUgYXBwIHNob3dzIGluIGEgdGV4dCBvZiBpdHMgb3duLgogIGZpbmFsIFJlc3RGYWlsdXJlUmVhc29uIHJlYXNvbjsKCiAgLy8vIFRoZSBzdGF0dXMgb2YgdGhlIGFuc3dlciwgaWYgYSBzZXJ2ZXIgYW5zd2VyZWQuCiAgZmluYWwgaW50PyBzdGF0dXM7CgogIC8vLyBUaGUgYW5zd2VyIG9mIGEgc2VydmVyIHRoYXQgcmVmdXNlZCwgd2hvc2UgYm9keSBtYXkgc2F5IHdoeToKICAvLy8gYGZhaWx1cmUucmVzcG9uc2U/LmRlY29kZWQoLi4uKWAuCiAgZmluYWwgUmVzdFJlc3BvbnNlPyByZXNwb25zZTsKCiAgLy8vIFRoZSB3YWl0IHRoYXQgdGhlIHNlcnZlciBuYW1lZCwgd2hpY2ggdGhlIGNsaWVudCBkaWQgbm90IHRha2U6IHRoZQogIC8vLyBtZXRob2QgZG9lcyBub3QgcmVwZWF0LCB0aGUgd2FpdCBpcyB0b28gbG9uZywgb3IgdGhlIHJlcGVhdHMgYXJlIG92ZXIuCiAgZmluYWwgRHVyYXRpb24/IHJldHJ5QWZ0ZXI7CgogIC8vLyBGb3IgdGhlIGRldmVsb3BlciwgaW4gZGVidWcgbW9kZSBvbmx5LiBJdCBuZXZlciBoYXMgYSB0b2tlbi4KICBmaW5hbCBTdHJpbmc/IGRldmVsb3BlckhpbnQ7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+IFsKICAgICAgICAnUmVzdEZhaWx1cmUoJHtyZWFzb24ubmFtZX0nLAogICAgICAgIGlmIChzdGF0dXMgIT0gbnVsbCkgJywgJHN0YXR1cycsCiAgICAgICAgaWYgKGRldmVsb3BlckhpbnQgIT0gbnVsbCkgJzogJGRldmVsb3BlckhpbnQnLAogICAgICAgICcpJywKICAgICAgXS5qb2luKCk7Cn0KCi8vLyBXaGF0IGEgc2VydmVyIGFuc3dlcmVkOiB0aGUgYW5zd2VyIG9mIGEgY2FsbCB3aXRoIGEgc3RhdHVzIG9mIHN1Y2Nlc3Mgb3IKLy8vIHdpdGggMzA0LCBhbmQgdGhlIHJlZnVzYWwgaW4gW1Jlc3RGYWlsdXJlLnJlc3BvbnNlXS4KZmluYWwgY2xhc3MgUmVzdFJlc3BvbnNlIHsKICAvLy8gQ3JlYXRlcyB0aGUgcmVzcG9uc2U7IGEgdGVzdCBvZiB0aGUgY29kZSBvZiB0aGUgYXBwIG1heSB0b28uCiAgY29uc3QgUmVzdFJlc3BvbnNlKHsKICAgIHJlcXVpcmVkIHRoaXMuc3RhdHVzLAogICAgcmVxdWlyZWQgdGhpcy5oZWFkZXJzLAogICAgcmVxdWlyZWQgdGhpcy5ieXRlcywKICB9KTsKCiAgLy8vIFRoZSBzdGF0dXMgb2YgdGhlIGFuc3dlci4KICBmaW5hbCBpbnQgc3RhdHVzOwoKICAvLy8gVGhlIGhlYWRlcnMsIGVhY2ggbmFtZSBpbiBsb3dlciBjYXNlLCBhbmQgc2V2ZXJhbCB2YWx1ZXMgb2Ygb25lIGhlYWRlcgogIC8vLyBqb2luZWQgYnkgYCwgYC4gU28gc2V2ZXJhbCBgc2V0LWNvb2tpZWAgdmFsdWVzIGNhbm5vdCBiZSB0b2xkIGFwYXJ0IGhlcmUuCiAgLy8vIEEgYm9keSB0aGF0IHRoZSBwcm92aWRlciBkZWNvZGVkIGhhcyBuZWl0aGVyIGBjb250ZW50LWVuY29kaW5nYCBub3IKICAvLy8gYGNvbnRlbnQtbGVuZ3RoYCBoZXJlLCBhbmQgYSBib2R5IGluIGEgY29kaW5nIHRoYXQgaXQgZGlkIG5vdCBkZWNvZGUgaGFzCiAgLy8vIGJvdGguCiAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzOwoKICAvLy8gVGhlIGJvZHk6IGRlY29kZWQgd2hlbiBbaGVhZGVyc10gaGF2ZSBubyBgY29udGVudC1lbmNvZGluZ2AsIGFuZCBvdGhlcndpc2UKICAvLy8gaW4gdGhhdCBjb2RpbmcuCiAgZmluYWwgTGlzdDxpbnQ+IGJ5dGVzOwoKICAvLy8gVGhlIGJvZHkgYXMgVVRGLTguCiAgU3RyaW5nIGdldCB0ZXh0ID0+IHV0ZjguZGVjb2RlKGJ5dGVzLCBhbGxvd01hbGZvcm1lZDogdHJ1ZSk7CgogIC8vLyBbcGFyc2VdIGFwcGxpZWQgdG8gdGhlIEpTT04gb2YgdGhlIGJvZHksIHN1Y2ggYXMKICAvLy8gYHJlc3BvbnNlLmRlY29kZWQoTm90ZS5mcm9tSnNvbilgLgogIC8vLwogIC8vLyBBIGJvZHkgdGhhdCBpcyBubyBKU09OLCBhIGJvZHkgb2YgYW5vdGhlciB0eXBlIHRoYW4gW3BhcnNlXSB0YWtlcywgYW5kCiAgLy8vIGFueSBlcnJvciBvZiBbcGFyc2VdIGZhaWwgd2l0aCBbUmVzdEZhaWx1cmVSZWFzb24uaW52YWxpZFJlc3BvbnNlXSwgYWxzbwogIC8vLyBhbiBlcnJvciBvZiB0aGUgZnV0dXJlIG9mIGFuIGBhc3luY2AgW3BhcnNlXS4KICAvLy8KICAvLy8gVGhlIEpTT04gb2YgYSBsaXN0IGlzIGEgYExpc3Q8ZHluYW1pYz5gIGFuZCB0aGF0IG9mIGFuIG9iamVjdCBhCiAgLy8vIGBNYXA8U3RyaW5nLCBkeW5hbWljPmAsIHdoYXRldmVyIHRoZXkgaG9sZC4gU28gYSBmdW5jdGlvbiBvZiBhIGxpc3QgdGFrZXMKICAvLy8gYSBgTGlzdDxkeW5hbWljPmAgYW5kIGNhc3RzIGl0cyBpdGVtcyBpbnNpZGU6CiAgLy8vIGAoTGlzdDxkeW5hbWljPiBqc29uKSA9PiBbZm9yIChmaW5hbCBpdGVtIGluIGpzb24pIE5vdGUuZnJvbUpzb24oaXRlbSBhcyBNYXA8U3RyaW5nLCBkeW5hbWljPildYC4KICAvLy8gT25lIHRoYXQgdGFrZXMgYSBgTGlzdDxNYXA8U3RyaW5nLCBkeW5hbWljPj5gIGZhaWxzIHdpdGggZXZlcnkgYm9keS4KICBUIGRlY29kZWQ8VCwgSj4oVCBGdW5jdGlvbihKIGpzb24pIHBhcnNlKSB7CiAgICB0cnkgewogICAgICBmaW5hbCBqc29uID0ganNvbkRlY29kZSh0ZXh0KTsKICAgICAgaWYgKGpzb24gaXMhIEopIHsKICAgICAgICB0aHJvdyBSZXN0RmFpbHVyZSgKICAgICAgICAgIFJlc3RGYWlsdXJlUmVhc29uLmludmFsaWRSZXNwb25zZSwKICAgICAgICAgIHN0YXR1czogc3RhdHVzLAogICAgICAgICAgcmVzcG9uc2U6IHRoaXMsCiAgICAgICAgICBkZXZlbG9wZXJIaW50OiAnVGhlIEpTT04gb2YgdGhlIGJvZHkgaXMgbm8gJEouIEEgbGlzdCBvZiBKU09OIGlzIGEgJwogICAgICAgICAgICAgICdMaXN0PGR5bmFtaWM+IGFuZCBhbiBvYmplY3QgYSBNYXA8U3RyaW5nLCBkeW5hbWljPiwgc28gYSB0eXBlZCAnCiAgICAgICAgICAgICAgJ2xpc3QgbmVlZHMgYSBjYXN0OiB0YWtlIG9uZSBvZiB0aG9zZSwgYW5kIGNhc3QgaW5zaWRlLicsCiAgICAgICAgKTsKICAgICAgfQogICAgICBmaW5hbCBwYXJzZWQgPSBwYXJzZShqc29uKTsKICAgICAgaWYgKHBhcnNlZCBpcyBGdXR1cmU8T2JqZWN0Pz4pIHsKICAgICAgICByZXR1cm4gcGFyc2VkLmNhdGNoRXJyb3IoX25vdEZpdHRpbmcpIGFzIFQ7CiAgICAgIH0KICAgICAgcmV0dXJuIHBhcnNlZDsKICAgIH0gb24gUmVzdEZhaWx1cmUgewogICAgICByZXRocm93OwogICAgfSBvbiBPYmplY3QgY2F0Y2ggKGVycm9yLCBzdGFja1RyYWNlKSB7CiAgICAgIF9ub3RGaXR0aW5nKGVycm9yLCBzdGFja1RyYWNlKTsKICAgIH0KICB9CgogIC8vLyBGYWlscyB3aXRoIFtSZXN0RmFpbHVyZVJlYXNvbi5pbnZhbGlkUmVzcG9uc2VdIGZvciBbZXJyb3JdLiBUaGUgaGludCBoYXMKICAvLy8gaXRzIHR5cGUgYW5kIG5vdCBpdHMgdGV4dCwgd2hpY2ggbWF5IHF1b3RlIHRoZSBib2R5LgogIE5ldmVyIF9ub3RGaXR0aW5nKE9iamVjdCBlcnJvciwgU3RhY2tUcmFjZSBzdGFja1RyYWNlKSA9PgogICAgICBFcnJvci50aHJvd1dpdGhTdGFja1RyYWNlKAogICAgICAgIFJlc3RGYWlsdXJlKAogICAgICAgICAgUmVzdEZhaWx1cmVSZWFzb24uaW52YWxpZFJlc3BvbnNlLAogICAgICAgICAgc3RhdHVzOiBzdGF0dXMsCiAgICAgICAgICByZXNwb25zZTogdGhpcywKICAgICAgICAgIGRldmVsb3BlckhpbnQ6ICdUaGUgYm9keSBkb2VzIG5vdCBmaXQ6ICR7ZXJyb3IucnVudGltZVR5cGV9LicsCiAgICAgICAgKSwKICAgICAgICBzdGFja1RyYWNlLAogICAgICApOwoKICBAb3ZlcnJpZGUKICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnUmVzdFJlc3BvbnNlKCRzdGF0dXMpJzsKfQoKLy8vIEVuZHMgYSBjYWxsLCBzdWNoIGFzIG9uZSBvZiBhIHNjcmVlbiB0aGF0IHRoZSB1c2VyIGxlZnQ6IHRoZSBjYWxsIGZhaWxzCi8vLyB3aXRoIFtSZXN0RmFpbHVyZVJlYXNvbi5jYW5jZWxsZWRdIGF0IG9uY2UgYW5kIGl0cyBjb25uZWN0aW9uIGNsb3Nlcy4KZmluYWwgY2xhc3MgUmVzdENhbmNlbCB7CiAgZmluYWwgTGlzdDx2b2lkIEZ1bmN0aW9uKCk+IF9saXN0ZW5lcnMgPSBbXTsKICBib29sIF9pc0NhbmNlbGxlZCA9IGZhbHNlOwoKICAvLy8gV2hldGhlciBbY2FuY2VsXSB3YXMgY2FsbGVkLgogIGJvb2wgZ2V0IGlzQ2FuY2VsbGVkID0+IF9pc0NhbmNlbGxlZDsKCiAgLy8vIEVuZHMgdGhlIGNhbGxzIHRoYXQgd2VyZSBnaXZlbiB0aGlzIG9iamVjdC4KICB2b2lkIGNhbmNlbCgpIHsKICAgIGlmIChfaXNDYW5jZWxsZWQpIHJldHVybjsKICAgIF9pc0NhbmNlbGxlZCA9IHRydWU7CiAgICBmb3IgKGZpbmFsIGxpc3RlbmVyIGluIFsuLi5fbGlzdGVuZXJzXSkgewogICAgICBsaXN0ZW5lcigpOwogICAgfQogIH0KfQoKLy8vIFdobyB0aGUgcmVxdWVzdHMgb2YgdGhlIGFwcCBhcmUgbWFkZSBmb3IuIEluIGFuIGFwcCB3aXRob3V0IHNpZ24taW4sIHRoZQovLy8gY2xpZW50IGhhcyBub25lLgphYnN0cmFjdCBpbnRlcmZhY2UgY2xhc3MgUmVzdFRva2VucyB7CiAgLy8vIFRoZSBpZCBvZiB0aGUgdXNlciByaWdodCBub3csIG9yIGBudWxsYCB3aGVuIG5vYm9keSBpcyBzaWduZWQgaW4uIEEKICAvLy8gcmVxdWVzdCBvZiBvbmUgdXNlciBuZXZlciByZXBlYXRzIGFzIGFub3RoZXIuCiAgU3RyaW5nPyBnZXQgb3duZXI7CgogIC8vLyBUaGUgdG9rZW4gb2YgdGhlIHVzZXIsIG9yIGBudWxsYCBmb3Igbm8gaGVhZGVyLgogIC8vLwogIC8vLyBJdCBmYWlscyB3aXRoIGEgW1Jlc3RGYWlsdXJlXS4KICBGdXR1cmU8U3RyaW5nPz4gY3VycmVudCgpOwoKICAvLy8gQSB0b2tlbiB0byB1c2UgaW4gcGxhY2Ugb2YgW3JlamVjdGVkXSwgd2hpY2ggYSBzZXJ2ZXIgcmVmdXNlZCwgb3IgYG51bGxgCiAgLy8vIHdoZW4gbm9ib2R5IGlzIHNpZ25lZCBpbi4gQ2FsbHMgYXQgdGhlIHNhbWUgdGltZSBzaGFyZSBvbmUgcmVmcmVzaC4KICAvLy8KICAvLy8gSXQgZmFpbHMgd2l0aCBhIFtSZXN0RmFpbHVyZV0uCiAgRnV0dXJlPFN0cmluZz8+IGFmdGVyKFN0cmluZyByZWplY3RlZCk7Cn0KCi8vLyBUaGUgaGVhZGVycyB0aGF0IGdvIG9ubHkgdG8gdGhlIG9yaWdpbiB0aGV5IHdlcmUgZ2l2ZW4gZm9yLgpjb25zdCBMaXN0PFN0cmluZz4gX29yaWdpbkhlYWRlcnMgPSBbCiAgJ2F1dGhvcml6YXRpb24nLAogICdjb29raWUnLAogICdwcm94eS1hdXRob3JpemF0aW9uJywKXTsKCi8vLyBIb3cgbWFueSB0aW1lcyBhIGNhbGwgcmVwZWF0cyBhZnRlciBhIGNvbm5lY3Rpb24gdGhhdCBmYWlsZWQsIG9yIGFmdGVyCi8vLyBvbmUgb2YgW19yZXBlYXRlZFN0YXR1c2VzXS4KY29uc3QgaW50IF9tYXhSZXBlYXRzID0gMjsKCi8vLyBUaGUgd2FpdHMgYmVmb3JlIHRoZSByZXBlYXRzLCBmb3IgYSBzZXJ2ZXIgdGhhdCBuYW1lcyBub25lLgpjb25zdCBMaXN0PER1cmF0aW9uPiBfcmVwZWF0V2FpdHMgPSBbCiAgRHVyYXRpb24obWlsbGlzZWNvbmRzOiA1MDApLAogIER1cmF0aW9uKHNlY29uZHM6IDEpLApdOwoKLy8vIEhvdyBtdWNoIGEgd2FpdCBvZiBbX3JlcGVhdFdhaXRzXSBncm93cyBhdCBtb3N0LCBzbyB0aGF0IHRoZSBkZXZpY2VzIG9mCi8vLyBtYW55IHVzZXJzIGRvIG5vdCByZXBlYXQgYXQgdGhlIHNhbWUgbW9tZW50Lgpjb25zdCBpbnQgX21heEppdHRlck1pbGxpc2Vjb25kcyA9IDI1MDsKCi8vLyBUaGUgbG9uZ2VzdCB3YWl0IHRoYXQgYSBzZXJ2ZXIgY2FuIG1ha2UgYSBjYWxsIHRha2UgYmVmb3JlIGl0IHJlcGVhdHMuCmNvbnN0IER1cmF0aW9uIF9tYXhXYWl0ID0gRHVyYXRpb24oc2Vjb25kczogMzApOwoKLy8vIFRoZSBsb25nZXN0IHdhaXQgb2YgYSBgUmV0cnktQWZ0ZXJgIHRoYXQgdGhlIGNsaWVudCB0ZWxscyBvZiwgaW4gc2Vjb25kczoKLy8vIGEgeWVhci4gQSBsb25nZXIgb25lIGNvdW50cyBhcyB0aGlzLCBzbyB0aGF0IG5vIG51bWJlciBvdmVyZmxvd3MuCmNvbnN0IGludCBfbWF4UmV0cnlBZnRlclNlY29uZHMgPSAzNjUgKiAyNCAqIDYwICogNjA7CgovLy8gVGhlIGZvcm0gb2YgYSB3YWl0IGluIHNlY29uZHMgaW4gYFJldHJ5LUFmdGVyYC4KZmluYWwgUmVnRXhwIF9yZXRyeUFmdGVyU2Vjb25kcyA9IFJlZ0V4cChyJ15cZCskJyk7CgovLy8gVGhlIHN0YXR1c2VzIGFmdGVyIHdoaWNoIGBHRVRgIGFuZCBgSEVBRGAgcmVwZWF0Lgpjb25zdCBTZXQ8aW50PiBfcmVwZWF0ZWRTdGF0dXNlcyA9IHs0MjksIDUwMiwgNTAzLCA1MDR9OwoKLy8vIFRoZSBzdGF0dXNlcyBvZiBhIHJlZGlyZWN0IHRoYXQgYEdFVGAgYW5kIGBIRUFEYCBmb2xsb3cuCmNvbnN0IFNldDxpbnQ+IF9yZWRpcmVjdHMgPSB7MzAxLCAzMDIsIDMwMywgMzA3LCAzMDh9OwoKLy8vIEhvdyBtYW55IHJlZGlyZWN0cyBhIGNhbGwgZm9sbG93cyBhdCBtb3N0Lgpjb25zdCBpbnQgX21heFJlZGlyZWN0cyA9IDU7Cgpjb25zdCBMaXN0PFN0cmluZz4gX21vbnRocyA9IFsKICAnSmFuJywKICAnRmViJywKICAnTWFyJywKICAnQXByJywKICAnTWF5JywKICAnSnVuJywKICAnSnVsJywKICAnQXVnJywKICAnU2VwJywKICAnT2N0JywKICAnTm92JywKICAnRGVjJywKXTsKCi8vLyBUaGUgZm9ybSBvZiBhbiBIVFRQIGRhdGUgdGhhdCBhIHNlcnZlciBzZW5kcyB0b2RheSwgc3VjaCBhcwovLy8gYFN1biwgMDYgTm92IDE5OTQgMDg6NDk6MzcgR01UYC4KZmluYWwgUmVnRXhwIF9odHRwRGF0ZSA9IFJlZ0V4cCgKICByJ15bQS1aYS16XXszfSwgKFxkezJ9KSAoW0EtWmEtel17M30pIChcZHs0fSkgKFxkezJ9KTooXGR7Mn0pOihcZHsyfSkgR01UJCcsCik7CgovLy8gQSBwYXRoIHRoYXQgaXMgYW4gYWRkcmVzcyBvZiBpdHMgb3duOiBvbmx5IGBodHRwOi8vYCBhbmQgYGh0dHBzOi8vYCBtYWtlCi8vLyBvbmUsIHNvIGAvL290aGVyLmV4YW1wbGUveGAgc3RheXMgYSBwYXRoIG9uIHRoZSBzZXJ2ZXIgb2YgdGhlIGFwcC4KZmluYWwgUmVnRXhwIF9hYnNvbHV0ZSA9IFJlZ0V4cChyJ15odHRwcz86Ly8nLCBjYXNlU2Vuc2l0aXZlOiBmYWxzZSk7CgovLy8gV2hhdCBlbmRzIHRoZSBwYXRoIGluIGEgcmVsYXRpdmUgcGF0aC4KZmluYWwgUmVnRXhwIF9xdWVyeU9yRnJhZ21lbnQgPSBSZWdFeHAoJ1s/I10nKTsKCi8vLyBBIGRvdCBvZiBhIHBhdGgsIGVuY29kZWQuCmZpbmFsIFJlZ0V4cCBfZW5jb2RlZERvdCA9IFJlZ0V4cCgnJTJlJywgY2FzZVNlbnNpdGl2ZTogZmFsc2UpOwoKLy8vIFdoYXQgYSBzZXJ2ZXIgbWF5IHRha2UgZm9yIGEgc2xhc2ggb2YgYSBwYXRoLgpmaW5hbCBSZWdFeHAgX3NsYXNoID0gUmVnRXhwKHInL3xcXHwlMmZ8JTVjJywgY2FzZVNlbnNpdGl2ZTogZmFsc2UpOwoKZmluYWwgUmFuZG9tIF9yYW5kb20gPSBSYW5kb20oKTsKCi8vLyBUaGUgUkVTVCBjbGllbnQgb2YgdGhlIGFwcCwgW2FwcFJlc3RdLCBvdmVyIHRoZSB0cmFuc3BvcnQgb2YgdGhlIHByb3ZpZGVyCi8vLyBvZiB0aGUgUkVTVCByb2xlLgovLy8KLy8vIFdoYXQgaXQgZ3VhcmFudGVlcyBpcyBoZXJlLCBzbyBpdCBpcyB0aGUgc2FtZSB3aXRoIGV2ZXJ5IHByb3ZpZGVyOgovLy8gLSBBIHBhdGggaXMgcmVsYXRpdmUgdG8gW2Jhc2VBZGRyZXNzXSwgd2l0aCBvciB3aXRob3V0IGEgbGVhZGluZyBzbGFzaCwgYW5kCi8vLyAgIHN0YXlzIHVuZGVyIGl0OiBvbmUgdGhhdCBjbGltYnMgb3V0IHdpdGggYC4uYCBmYWlscyB3aXRoCi8vLyAgIFtSZXN0RmFpbHVyZVJlYXNvbi5yZWplY3RlZF0gYmVmb3JlIGFueXRoaW5nIGlzIHNlbnQuIEFuIGFkZHJlc3Mgd2l0aAovLy8gICBgaHR0cDovL2Agb3IgYGh0dHBzOi8vYCBnb2VzIHdoZXJlIGl0IHNheXMuCi8vLyAtIEEgY2FsbCBmYWlscyBvbmx5IHdpdGggYSBbUmVzdEZhaWx1cmVdLgovLy8gLSBUaGUgdG9rZW4gb2YgdGhlIHVzZXIgZ29lcyBvbmx5IHRvIHRoZSBvcmlnaW4gb2YgW2Jhc2VBZGRyZXNzXSwgYW5kIGEKLy8vICAgcmVkaXJlY3QgdG8gYW5vdGhlciBvcmlnaW4gdGFrZXMgaXQgYXdheSwgd2l0aCB0aGUgY29va2llcyBvZiB0aGUgY2FsbGVyLgovLy8gLSBBIDQwMSBvZiBhIHJlcXVlc3Qgd2l0aCB0aGF0IHRva2VuIGdldHMgYSBuZXcgdG9rZW4gb25jZSBhbmQgcmVwZWF0cwovLy8gICBvbmNlLCB3aGF0ZXZlciB0aGUgbWV0aG9kLCBmb3IgdGhlIHNhbWUgdXNlciBvbmx5LgovLy8gLSBgR0VUYCBhbmQgYEhFQURgIHJlcGVhdCB0d2ljZSBhdCBtb3N0IGFmdGVyIGEgY29ubmVjdGlvbiB0aGF0IGZhaWxlZCBhbmQKLy8vICAgYWZ0ZXIgNDI5LCA1MDIsIDUwMyBhbmQgNTA0LCBrZWVwaW5nIHRvIGBSZXRyeS1BZnRlcmAuIE90aGVyIG1ldGhvZHMKLy8vICAgbmV2ZXIgcmVwZWF0LCBzaW5jZSB0aGUgc2VydmVyIG1heSBoYXZlIGRvbmUgd2hhdCB0aGV5IGFza2VkLgovLy8gLSBUaGUgdGltZW91dCBpcyBwZXIgYXR0ZW1wdCwgc28gYSBgR0VUYCB3aXRoIGl0cyByZXBlYXRzIG1heSB0YWtlIGxvbmdlciwKLy8vICAgYW5kIGEgW1Jlc3RDYW5jZWxdIGVuZHMgYSBjYWxsIGF0IG9uY2UuCi8vLyAtIEEgZGVidWcgYnVpbGQgcHJpbnRzIG9uZSBsaW5lIGZvciBlYWNoIGF0dGVtcHQsIHdpdGggbm8gdG9rZW4gYW5kIG5vCi8vLyAgIHF1ZXJ5LgpmaW5hbCBjbGFzcyBBcHBSZXN0Q2xpZW50IHsKICAvLy8gQ3JlYXRlcyBhIGNsaWVudC4gVGhlIGFwcCBoYXMgb25lLCBbYXBwUmVzdF0sIGFuZCBhIHRlc3QgY3JlYXRlcyBvbmUgb3ZlcgogIC8vLyBhIHRyYW5zcG9ydCBvZiBpdHMgb3duLgogIEFwcFJlc3RDbGllbnQoewogICAgcmVxdWlyZWQgdGhpcy5fdHJhbnNwb3J0LAogICAgcmVxdWlyZWQgdGhpcy5fYmFzZUFkZHJlc3MsCiAgICB0aGlzLl90b2tlbnMsCiAgICB0aGlzLnRpbWVvdXQgPSBjb25zdCBEdXJhdGlvbihzZWNvbmRzOiAzMCksCiAgICB0aGlzLnRva2VuV2FpdCA9IGNvbnN0IER1cmF0aW9uKHNlY29uZHM6IDEwKSwKICB9KTsKCiAgLy8vIEhvdyBsb25nIG9uZSBhdHRlbXB0IG9mIGEgY2FsbCB0YWtlcyBhdCBtb3N0LCB1bmxlc3MgdGhlIGNhbGwgbmFtZXMKICAvLy8gYW5vdGhlciB0aW1lLgogIGZpbmFsIER1cmF0aW9uIHRpbWVvdXQ7CgogIC8vLyBIb3cgbG9uZyB0aGUgY2xpZW50IHdhaXRzIGZvciB0aGUgdG9rZW4gb2YgdGhlIHVzZXIgYXQgbW9zdCwgZWFjaCB0aW1lCiAgLy8vIHRoYXQgaXQgbmVlZHMgb25lLCBhbmQgd2l0aGluIHRoZSB0aW1lb3V0IG9mIHRoZSBhdHRlbXB0LiBBIGZvcmNlZCByZWZyZXNoCiAgLy8vIG9uIGEgZGV2aWNlIHdpdGhvdXQgYSBuZXR3b3JrIG1heSB0YWtlIGEgbWludXRlIGJlZm9yZSBpdCBmYWlscywgYW5kIGEKICAvLy8gcmVxdWVzdCBkb2VzIG5vdCB3YWl0IGZvciB0aGF0LgogIGZpbmFsIER1cmF0aW9uIHRva2VuV2FpdDsKCiAgUmVzdFRyYW5zcG9ydCBfdHJhbnNwb3J0OwogIFN0cmluZz8gX2Jhc2VBZGRyZXNzOwogIFJlc3RUb2tlbnM/IF90b2tlbnM7CgogIC8vLyBGb3IgYSB0ZXN0OiByZXBsYWNlcyB3aGF0IGlzIGdpdmVuLCBhbmQgd2l0aCBbbm9CYXNlQWRkcmVzc10gb3IgW25vVG9rZW5zXQogIC8vLyB0YWtlcyBhd2F5IHRoZSBhZGRyZXNzIG9yIHRoZSB0b2tlbnMuIFRoZSBjb2RlIG9mIHRoZSBhcHAgbmV2ZXIgY2FsbHMgaXQuCiAgdm9pZCB1c2UoewogICAgUmVzdFRyYW5zcG9ydD8gdHJhbnNwb3J0LAogICAgU3RyaW5nPyBiYXNlQWRkcmVzcywKICAgIFJlc3RUb2tlbnM/IHRva2VucywKICAgIGJvb2wgbm9CYXNlQWRkcmVzcyA9IGZhbHNlLAogICAgYm9vbCBub1Rva2VucyA9IGZhbHNlLAogIH0pIHsKICAgIF90cmFuc3BvcnQgPSB0cmFuc3BvcnQgPz8gX3RyYW5zcG9ydDsKICAgIF9iYXNlQWRkcmVzcyA9IG5vQmFzZUFkZHJlc3MgPyBudWxsIDogYmFzZUFkZHJlc3MgPz8gX2Jhc2VBZGRyZXNzOwogICAgX3Rva2VucyA9IG5vVG9rZW5zID8gbnVsbCA6IHRva2VucyA/PyBfdG9rZW5zOwogIH0KCiAgLy8vIFNlbmRzIGEgYEdFVGAsIHdoaWNoIHRoZSBjbGllbnQgcmVwZWF0cyBhcyBbQXBwUmVzdENsaWVudF0gdGVsbHMuCiAgRnV0dXJlPFJlc3RSZXNwb25zZT4gZ2V0KAogICAgU3RyaW5nIHBhdGgsIHsKICAgIE1hcDxTdHJpbmcsIFN0cmluZz4/IHF1ZXJ5LAogICAgTWFwPFN0cmluZywgU3RyaW5nPj8gaGVhZGVycywKICAgIER1cmF0aW9uPyB0aW1lb3V0LAogICAgUmVzdENhbmNlbD8gY2FuY2VsLAogIH0pID0+CiAgICAgIF9yZXF1ZXN0KAogICAgICAgICdHRVQnLAogICAgICAgIHBhdGgsCiAgICAgICAgcXVlcnk6IHF1ZXJ5LAogICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsCiAgICAgICAgdGltZW91dDogdGltZW91dCwKICAgICAgICBjYW5jZWw6IGNhbmNlbCwKICAgICAgKTsKCiAgLy8vIFNlbmRzIGEgYEhFQURgLCB3aGljaCB0aGUgY2xpZW50IHJlcGVhdHMgYXMgW0FwcFJlc3RDbGllbnRdIHRlbGxzLgogIEZ1dHVyZTxSZXN0UmVzcG9uc2U+IGhlYWQoCiAgICBTdHJpbmcgcGF0aCwgewogICAgTWFwPFN0cmluZywgU3RyaW5nPj8gcXVlcnksCiAgICBNYXA8U3RyaW5nLCBTdHJpbmc+PyBoZWFkZXJzLAogICAgRHVyYXRpb24/IHRpbWVvdXQsCiAgICBSZXN0Q2FuY2VsPyBjYW5jZWwsCiAgfSkgPT4KICAgICAgX3JlcXVlc3QoCiAgICAgICAgJ0hFQUQnLAogICAgICAgIHBhdGgsCiAgICAgICAgcXVlcnk6IHF1ZXJ5LAogICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsCiAgICAgICAgdGltZW91dDogdGltZW91dCwKICAgICAgICBjYW5jZWw6IGNhbmNlbCwKICAgICAgKTsKCiAgLy8vIFNlbmRzIGEgYFBPU1RgIHdpdGggW2pzb25dIGFzIGl0cyBib2R5LCBvciB3aXRoIFtieXRlc10uCiAgRnV0dXJlPFJlc3RSZXNwb25zZT4gcG9zdCgKICAgIFN0cmluZyBwYXRoLCB7CiAgICBPYmplY3Q/IGpzb24sCiAgICBMaXN0PGludD4/IGJ5dGVzLAogICAgTWFwPFN0cmluZywgU3RyaW5nPj8gcXVlcnksCiAgICBNYXA8U3RyaW5nLCBTdHJpbmc+PyBoZWFkZXJzLAogICAgRHVyYXRpb24/IHRpbWVvdXQsCiAgICBSZXN0Q2FuY2VsPyBjYW5jZWwsCiAgfSkgPT4KICAgICAgX3JlcXVlc3QoCiAgICAgICAgJ1BPU1QnLAogICAgICAgIHBhdGgsCiAgICAgICAganNvbjoganNvbiwKICAgICAgICBieXRlczogYnl0ZXMsCiAgICAgICAgcXVlcnk6IHF1ZXJ5LAogICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsCiAgICAgICAgdGltZW91dDogdGltZW91dCwKICAgICAgICBjYW5jZWw6IGNhbmNlbCwKICAgICAgKTsKCiAgLy8vIFNlbmRzIGEgYFBVVGAgd2l0aCBbanNvbl0gYXMgaXRzIGJvZHksIG9yIHdpdGggW2J5dGVzXS4KICBGdXR1cmU8UmVzdFJlc3BvbnNlPiBwdXQoCiAgICBTdHJpbmcgcGF0aCwgewogICAgT2JqZWN0PyBqc29uLAogICAgTGlzdDxpbnQ+PyBieXRlcywKICAgIE1hcDxTdHJpbmcsIFN0cmluZz4/IHF1ZXJ5LAogICAgTWFwPFN0cmluZywgU3RyaW5nPj8gaGVhZGVycywKICAgIER1cmF0aW9uPyB0aW1lb3V0LAogICAgUmVzdENhbmNlbD8gY2FuY2VsLAogIH0pID0+CiAgICAgIF9yZXF1ZXN0KAogICAgICAgICdQVVQnLAogICAgICAgIHBhdGgsCiAgICAgICAganNvbjoganNvbiwKICAgICAgICBieXRlczogYnl0ZXMsCiAgICAgICAgcXVlcnk6IHF1ZXJ5LAogICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsCiAgICAgICAgdGltZW91dDogdGltZW91dCwKICAgICAgICBjYW5jZWw6IGNhbmNlbCwKICAgICAgKTsKCiAgLy8vIFNlbmRzIGEgYFBBVENIYCB3aXRoIFtqc29uXSBhcyBpdHMgYm9keSwgb3Igd2l0aCBbYnl0ZXNdLgogIEZ1dHVyZTxSZXN0UmVzcG9uc2U+IHBhdGNoKAogICAgU3RyaW5nIHBhdGgsIHsKICAgIE9iamVjdD8ganNvbiwKICAgIExpc3Q8aW50Pj8gYnl0ZXMsCiAgICBNYXA8U3RyaW5nLCBTdHJpbmc+PyBxdWVyeSwKICAgIE1hcDxTdHJpbmcsIFN0cmluZz4/IGhlYWRlcnMsCiAgICBEdXJhdGlvbj8gdGltZW91dCwKICAgIFJlc3RDYW5jZWw/IGNhbmNlbCwKICB9KSA9PgogICAgICBfcmVxdWVzdCgKICAgICAgICAnUEFUQ0gnLAogICAgICAgIHBhdGgsCiAgICAgICAganNvbjoganNvbiwKICAgICAgICBieXRlczogYnl0ZXMsCiAgICAgICAgcXVlcnk6IHF1ZXJ5LAogICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsCiAgICAgICAgdGltZW91dDogdGltZW91dCwKICAgICAgICBjYW5jZWw6IGNhbmNlbCwKICAgICAgKTsKCiAgLy8vIFNlbmRzIGEgYERFTEVURWAsIHdpdGggW2pzb25dIGFzIGl0cyBib2R5IG9yIHdpdGggW2J5dGVzXSBpZiBpdCBoYXMgb25lLgogIEZ1dHVyZTxSZXN0UmVzcG9uc2U+IGRlbGV0ZSgKICAgIFN0cmluZyBwYXRoLCB7CiAgICBPYmplY3Q/IGpzb24sCiAgICBMaXN0PGludD4/IGJ5dGVzLAogICAgTWFwPFN0cmluZywgU3RyaW5nPj8gcXVlcnksCiAgICBNYXA8U3RyaW5nLCBTdHJpbmc+PyBoZWFkZXJzLAogICAgRHVyYXRpb24/IHRpbWVvdXQsCiAgICBSZXN0Q2FuY2VsPyBjYW5jZWwsCiAgfSkgPT4KICAgICAgX3JlcXVlc3QoCiAgICAgICAgJ0RFTEVURScsCiAgICAgICAgcGF0aCwKICAgICAgICBqc29uOiBqc29uLAogICAgICAgIGJ5dGVzOiBieXRlcywKICAgICAgICBxdWVyeTogcXVlcnksCiAgICAgICAgaGVhZGVyczogaGVhZGVycywKICAgICAgICB0aW1lb3V0OiB0aW1lb3V0LAogICAgICAgIGNhbmNlbDogY2FuY2VsLAogICAgICApOwoKICAvLy8gTWFrZXMgdGhlIGNhbGwsIGFuZCB0dXJucyBhbnkgZXJyb3Igb2YgYW5vdGhlciBraW5kIGludG8gYSBmYWlsdXJlIHdpdGgKICAvLy8gdGhlIHJlYXNvbiBbUmVzdEZhaWx1cmVSZWFzb24udW5rbm93bl0uIEl0cyBoaW50IGhhcyB0aGUgdHlwZSBvZiB0aGUKICAvLy8gZXJyb3IgYW5kIG5vdCBpdHMgdGV4dCwgd2hpY2ggbWF5IHF1b3RlIGEgaGVhZGVyLgogIEZ1dHVyZTxSZXN0UmVzcG9uc2U+IF9yZXF1ZXN0KAogICAgU3RyaW5nIG1ldGhvZCwKICAgIFN0cmluZyBwYXRoLCB7CiAgICBPYmplY3Q/IGpzb24sCiAgICBMaXN0PGludD4/IGJ5dGVzLAogICAgTWFwPFN0cmluZywgU3RyaW5nPj8gcXVlcnksCiAgICBNYXA8U3RyaW5nLCBTdHJpbmc+PyBoZWFkZXJzLAogICAgRHVyYXRpb24/IHRpbWVvdXQsCiAgICBSZXN0Q2FuY2VsPyBjYW5jZWwsCiAgfSkgYXN5bmMgewogICAgdHJ5IHsKICAgICAgaWYgKGpzb24gIT0gbnVsbCAmJiBieXRlcyAhPSBudWxsKSB7CiAgICAgICAgdGhyb3cgY29uc3QgUmVzdEZhaWx1cmUoCiAgICAgICAgICBSZXN0RmFpbHVyZVJlYXNvbi51bmtub3duLAogICAgICAgICAgZGV2ZWxvcGVySGludDogJ0EgY2FsbCB0YWtlcyBqc29uIG9yIGJ5dGVzLCBub3QgYm90aC4nLAogICAgICAgICk7CiAgICAgIH0KICAgICAgZmluYWwgYmFzZSA9IF9iYXNlT2YoX2Jhc2VBZGRyZXNzKTsKICAgICAgZmluYWwgYm9keSA9IGpzb24gIT0gbnVsbCA/IHV0ZjguZW5jb2RlKGpzb25FbmNvZGUoanNvbikpIDogYnl0ZXM7CiAgICAgIHJldHVybiBhd2FpdCBfQ2FsbCgKICAgICAgICBjbGllbnQ6IHRoaXMsCiAgICAgICAgbWV0aG9kOiBtZXRob2QsCiAgICAgICAgYmFzZTogYmFzZSwKICAgICAgICB0YXJnZXQ6IF9hZGRyZXNzT2YocGF0aCwgcXVlcnksIGJhc2UpLAogICAgICAgIGhlYWRlcnM6IHsKICAgICAgICAgIGZvciAoZmluYWwgTWFwRW50cnkoOmtleSwgOnZhbHVlKSBpbiAoaGVhZGVycyA/PyBjb25zdCB7fSkuZW50cmllcykKICAgICAgICAgICAga2V5LnRvTG93ZXJDYXNlKCk6IHZhbHVlLAogICAgICAgICAgaWYgKGpzb24gIT0gbnVsbCAmJiBfaGFzTm9Db250ZW50VHlwZShoZWFkZXJzKSkKICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywKICAgICAgICAgIC8vIFdpdGhvdXQgaXQgYSBzdGFjayBtYXkgc2VuZCB0aGUgYm9keSBpbiBjaHVua3MsIHdoaWNoIG1hbnkgdXBsb2FkCiAgICAgICAgICAvLyBhZGRyZXNzZXMgcmVmdXNlLgogICAgICAgICAgaWYgKGJvZHkgIT0gbnVsbCkgJ2NvbnRlbnQtbGVuZ3RoJzogJyR7Ym9keS5sZW5ndGh9JywKICAgICAgICB9LAogICAgICAgIGJvZHk6IGJvZHksCiAgICAgICAgdGltZW91dDogdGltZW91dCA/PyB0aGlzLnRpbWVvdXQsCiAgICAgICAgY2FuY2VsOiBjYW5jZWwsCiAgICAgICkucnVuKCk7CiAgICB9IG9uIFJlc3RGYWlsdXJlIHsKICAgICAgcmV0aHJvdzsKICAgIH0gb24gT2JqZWN0IGNhdGNoIChlcnJvciwgc3RhY2tUcmFjZSkgewogICAgICBFcnJvci50aHJvd1dpdGhTdGFja1RyYWNlKAogICAgICAgIFJlc3RGYWlsdXJlKAogICAgICAgICAgUmVzdEZhaWx1cmVSZWFzb24udW5rbm93biwKICAgICAgICAgIGRldmVsb3BlckhpbnQ6ICdUaGUgY2FsbCBlbmRlZCB3aXRoIGEgJHtlcnJvci5ydW50aW1lVHlwZX0uJywKICAgICAgICApLAogICAgICAgIHN0YWNrVHJhY2UsCiAgICAgICk7CiAgICB9CiAgfQoKICBib29sIF9oYXNOb0NvbnRlbnRUeXBlKE1hcDxTdHJpbmcsIFN0cmluZz4/IGhlYWRlcnMpID0+CiAgICAgIGhlYWRlcnMgPT0gbnVsbCB8fAogICAgICAhaGVhZGVycy5rZXlzLmFueSgobmFtZSkgPT4gbmFtZS50b0xvd2VyQ2FzZSgpID09ICdjb250ZW50LXR5cGUnKTsKCiAgLy8vIFRoZSBhZGRyZXNzIG9mIFtwYXRoXSB3aXRoIFtxdWVyeV07IHNlZSBbQXBwUmVzdENsaWVudF0uCiAgVXJpIF9hZGRyZXNzT2YoU3RyaW5nIHBhdGgsIE1hcDxTdHJpbmcsIFN0cmluZz4/IHF1ZXJ5LCBVcmk/IGJhc2UpIHsKICAgIGZpbmFsIFVyaSBhZGRyZXNzOwogICAgaWYgKF9hYnNvbHV0ZS5oYXNNYXRjaChwYXRoKSkgewogICAgICBhZGRyZXNzID0gVXJpLnBhcnNlKHBhdGgpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGJhc2UgPT0gbnVsbCkgewogICAgICAgIHRocm93IFJlc3RGYWlsdXJlKAogICAgICAgICAgUmVzdEZhaWx1cmVSZWFzb24ubm90Q29uZmlndXJlZCwKICAgICAgICAgIGRldmVsb3BlckhpbnQ6IF9iYXNlUHJvYmxlbShfYmFzZUFkZHJlc3MpLAogICAgICAgICk7CiAgICAgIH0KICAgICAgZmluYWwgcm9vdCA9IGJhc2UudG9TdHJpbmcoKS5yZXBsYWNlRmlyc3QoUmVnRXhwKHInLyskJyksICcnKTsKICAgICAgZmluYWwgcmVsYXRpdmUgPSBwYXRoLnJlcGxhY2VGaXJzdChSZWdFeHAoJ14vKycpLCAnJyk7CiAgICAgIGlmIChfY2xpbWJzT3V0KHJlbGF0aXZlKSkgewogICAgICAgIHRocm93IFJlc3RGYWlsdXJlKAogICAgICAgICAgUmVzdEZhaWx1cmVSZWFzb24ucmVqZWN0ZWQsCiAgICAgICAgICBkZXZlbG9wZXJIaW50OiAnVGhlIHBhdGggIiR7cmVsYXRpdmUuc3BsaXQoX3F1ZXJ5T3JGcmFnbWVudCkuZmlyc3R9IiAnCiAgICAgICAgICAgICAgJ2NsaW1icyBvdXQgb2YgdGhlIGFkZHJlc3Mgb2YgdGhlIEFQSSwgc28gbm90aGluZyB3YXMgc2VudC4gS2VlcCAnCiAgICAgICAgICAgICAgJ3doYXQgYSB1c2VyIHR5cGVzIG91dCBvZiBhIHBhdGgsIG9yIGVuY29kZSBpdCB3aXRoICcKICAgICAgICAgICAgICAnVXJpLmVuY29kZUNvbXBvbmVudC4nLAogICAgICAgICk7CiAgICAgIH0KICAgICAgYWRkcmVzcyA9IFVyaS5wYXJzZShyZWxhdGl2ZS5pc0VtcHR5ID8gcm9vdCA6ICckcm9vdC8kcmVsYXRpdmUnKTsKICAgIH0KICAgIGZpbmFsIGFkZGVkID0gWwogICAgICBmb3IgKGZpbmFsIE1hcEVudHJ5KDprZXksIDp2YWx1ZSkgaW4gKHF1ZXJ5ID8/IGNvbnN0IHt9KS5lbnRyaWVzKQogICAgICAgICcke1VyaS5lbmNvZGVDb21wb25lbnQoa2V5KX09JHtVcmkuZW5jb2RlQ29tcG9uZW50KHZhbHVlKX0nLAogICAgXTsKICAgIGlmIChhZGRlZC5pc0VtcHR5KSByZXR1cm4gYWRkcmVzcy5yZW1vdmVGcmFnbWVudCgpOwogICAgcmV0dXJuIGFkZHJlc3MucmVtb3ZlRnJhZ21lbnQoKS5yZXBsYWNlKAogICAgICAgICAgcXVlcnk6IFtpZiAoYWRkcmVzcy5xdWVyeS5pc05vdEVtcHR5KSBhZGRyZXNzLnF1ZXJ5LCAuLi5hZGRlZF0KICAgICAgICAgICAgICAuam9pbignJicpLAogICAgICAgICk7CiAgfQoKICAvLy8gV2hldGhlciB0aGUgW3JlbGF0aXZlXSBwYXRoLCBqb2luZWQgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIEFQSSwgY2xpbWJzIG91dAogIC8vLyBvZiB0aGUgcGF0aCBvZiB0aGF0IGFkZHJlc3M6IGAuLmAgdGhhdCBnb2VzIGFib3ZlIHdoZXJlIGl0IHN0YXJ0ZWQsCiAgLy8vIHdyaXR0ZW4gYXMgaXQgaXMgb3IgZW5jb2RlZCwgd2l0aCBhIHNsYXNoIHRoYXQgbWF5IGJlIGVuY29kZWQgdG9vLCBzaW5jZSBhCiAgLy8vIHNlcnZlciBtYXkgZGVjb2RlIGl0LiBTbyB0aGUgdG9rZW4gb2YgdGhlIHVzZXIgZ29lcyB0byBubyBvdGhlciBzZXJ2aWNlCiAgLy8vIGJlaGluZCBvbmUgaG9zdC4KICBib29sIF9jbGltYnNPdXQoU3RyaW5nIHJlbGF0aXZlKSB7CiAgICBmaW5hbCBzZWdtZW50cyA9IHJlbGF0aXZlCiAgICAgICAgLnNwbGl0KF9xdWVyeU9yRnJhZ21lbnQpCiAgICAgICAgLmZpcnN0CiAgICAgICAgLnJlcGxhY2VBbGwoX2VuY29kZWREb3QsICcuJykKICAgICAgICAuc3BsaXQoX3NsYXNoKTsKICAgIHZhciBkZXB0aCA9IDA7CiAgICBmb3IgKGZpbmFsIHNlZ21lbnQgaW4gc2VnbWVudHMpIHsKICAgICAgaWYgKHNlZ21lbnQgPT0gJy4uJykgewogICAgICAgIGlmICgtLWRlcHRoIDwgMCkgcmV0dXJuIHRydWU7CiAgICAgIH0gZWxzZSBpZiAoc2VnbWVudC5pc05vdEVtcHR5ICYmIHNlZ21lbnQgIT0gJy4nKSB7CiAgICAgICAgZGVwdGgrKzsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLy8vIFRoZSBhZGRyZXNzIGluIFt2YWx1ZV0gdGhhdCBwYXRocyBhcmUgcmVsYXRpdmUgdG8sIG9yIGBudWxsYCB3aGVuIGl0IGlzCiAgLy8vIG5vbmU6IGl0IGhhcyBubyB2YWx1ZSwgaXMgbm8gYWRkcmVzcyBvZiBhbiBgaHR0cGAgb3IgYGh0dHBzYCBzZXJ2ZXIsIG9yCiAgLy8vIGhhcyBhIHF1ZXJ5LCBhIGZyYWdtZW50IG9yIGEgdXNlci4KICBVcmk/IF9iYXNlT2YoU3RyaW5nPyB2YWx1ZSkgewogICAgZmluYWwgdXJpID0gdmFsdWUgPT0gbnVsbCA/IG51bGwgOiBVcmkudHJ5UGFyc2UodmFsdWUpOwogICAgaWYgKHVyaSA9PSBudWxsIHx8CiAgICAgICAgISh1cmkuaXNTY2hlbWUoJ2h0dHAnKSB8fCB1cmkuaXNTY2hlbWUoJ2h0dHBzJykpIHx8CiAgICAgICAgdXJpLmhvc3QuaXNFbXB0eSB8fAogICAgICAgIHVyaS5oYXNRdWVyeSB8fAogICAgICAgIHVyaS5oYXNGcmFnbWVudCB8fAogICAgICAgIHVyaS51c2VySW5mby5pc05vdEVtcHR5KSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuIHVyaTsKICB9CgogIC8vLyBXaGF0IHRoZSBoaW50IG9mIGEgcmVsYXRpdmUgcGF0aCBzYXlzIGZvciBbdmFsdWVdLCB3aGljaCBbX2Jhc2VPZl0gZGlkCiAgLy8vIG5vdCB0YWtlLiBJdCBkb2VzIG5vdCBxdW90ZSB0aGUgdmFsdWUsIHdoaWNoIG1heSBoYXZlIGEgdXNlci4KICBTdHJpbmcgX2Jhc2VQcm9ibGVtKFN0cmluZz8gdmFsdWUpID0+IHZhbHVlID09IG51bGwgfHwgdmFsdWUuaXNFbXB0eQogICAgICA/ICdSRVNUX0JBU0VfVVJMIGluIC5lbnYgaXMgZW1wdHksIGFuZCB0aGUgcGF0aCBpcyByZWxhdGl2ZS4gUHV0IHRoZSAnCiAgICAgICAgICAnYWRkcmVzcyBvZiB5b3VyIFJFU1QgQVBJIHRoZXJlLCBzdWNoIGFzICcKICAgICAgICAgICdodHRwczovL2FwaS5leGFtcGxlLmNvbS92MSwgYW5kIHN0YXJ0IGZsdXR0ZXIgcnVuIGFnYWluLiBUaGUgJwogICAgICAgICAgJ3NlY3Rpb24gIlZhbHVlcyBpbiAuZW52IiBvZiB0aGUgUkVBRE1FIHRlbGxzIGhvdy4nCiAgICAgIDogJ1JFU1RfQkFTRV9VUkwgaW4gLmVudiBpcyBubyBhZGRyZXNzIG9mIGEgc2VydmVyOiBpdCBuZWVkcyBodHRwOi8vIG9yICcKICAgICAgICAgICdodHRwczovLywgYSBob3N0LCBhbmQgbm8gcXVlcnksIGZyYWdtZW50IG9yIHVzZXIuJzsKfQoKLy8vIE9uZSBjYWxsIG9mIFtBcHBSZXN0Q2xpZW50XSwgb3ZlciBpdHMgYXR0ZW1wdHMuCmZpbmFsIGNsYXNzIF9DYWxsIHsKICBfQ2FsbCh7CiAgICByZXF1aXJlZCB0aGlzLmNsaWVudCwKICAgIHJlcXVpcmVkIHRoaXMubWV0aG9kLAogICAgcmVxdWlyZWQgdGhpcy5iYXNlLAogICAgcmVxdWlyZWQgdGhpcy50YXJnZXQsCiAgICByZXF1aXJlZCB0aGlzLmhlYWRlcnMsCiAgICByZXF1aXJlZCB0aGlzLmJvZHksCiAgICByZXF1aXJlZCB0aGlzLnRpbWVvdXQsCiAgICByZXF1aXJlZCB0aGlzLmNhbmNlbCwKICB9KSA6IF9jYWxsZXJIYXNBdXRob3JpemF0aW9uID0gaGVhZGVycy5jb250YWluc0tleSgnYXV0aG9yaXphdGlvbicpOwoKICBmaW5hbCBBcHBSZXN0Q2xpZW50IGNsaWVudDsKICBmaW5hbCBTdHJpbmcgbWV0aG9kOwoKICAvLy8gVGhlIGFkZHJlc3MgdGhhdCBwYXRocyBhcmUgcmVsYXRpdmUgdG8sIHdob3NlIG9yaWdpbiBnZXRzIHRoZSB0b2tlbi4KICBmaW5hbCBVcmk/IGJhc2U7CgogIC8vLyBUaGUgYWRkcmVzcyBvZiB0aGUgbmV4dCBhdHRlbXB0LCB3aGljaCBhIHJlZGlyZWN0IGNoYW5nZXMuCiAgVXJpIHRhcmdldDsKCiAgLy8vIFRoZSBoZWFkZXJzIHRoYXQgdGhlIGNhbGxlciBnYXZlLCB3aGljaCBhIHJlZGlyZWN0IHRvIGFub3RoZXIgb3JpZ2luCiAgLy8vIHRha2VzIGF3YXkgZnJvbS4KICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnM7CgogIGZpbmFsIExpc3Q8aW50Pj8gYm9keTsKICBmaW5hbCBEdXJhdGlvbiB0aW1lb3V0OwogIGZpbmFsIFJlc3RDYW5jZWw/IGNhbmNlbDsKCiAgLy8vIEEgaGVhZGVyIGBhdXRob3JpemF0aW9uYCBvZiB0aGUgY2FsbGVyIHN0YXlzLCBhbmQgdGhlIHRva2VuIHN0YXlzIG91dC4KICBmaW5hbCBib29sIF9jYWxsZXJIYXNBdXRob3JpemF0aW9uOwoKICAvLy8gVGhlIHVzZXIgd2hvbSB0aGUgY2FsbCBpcyBtYWRlIGZvciwgb25jZSBhIHJlYWQgb2YgdGhlIHRva2VuIHRvbGQuCiAgU3RyaW5nPyBfb3duZXI7CgogIC8vLyBUaGUgdG9rZW4gdGhhdCB0aGUgbGFzdCBhdHRlbXB0IHNlbnQsIGlmIGFueS4KICBTdHJpbmc/IF9zZW50OwoKICAvLy8gVGhlIHRva2VuIG9mIGEgcmVmcmVzaCwgZm9yIHRoZSBhdHRlbXB0IGFmdGVyIGl0LgogIFN0cmluZz8gX3JlZnJlc2hlZDsKCiAgLy8vIFdoZXRoZXIgdGhlIGNhbGwgaGFzIG1hZGUgaXRzIG9uZSByZWZyZXNoLgogIGJvb2wgX2RpZFJlZnJlc2ggPSBmYWxzZTsKCiAgYm9vbCBnZXQgX2lzU2FmZSA9PiBtZXRob2QgPT0gJ0dFVCcgfHwgbWV0aG9kID09ICdIRUFEJzsKCiAgLy8vIFRoZSBhdHRlbXB0cyBvZiB0aGUgY2FsbDsgc2VlIFtBcHBSZXN0Q2xpZW50XS4KICBGdXR1cmU8UmVzdFJlc3BvbnNlPiBydW4oKSBhc3luYyB7CiAgICB2YXIgcmVwZWF0cyA9IDA7CiAgICB2YXIgaG9wcyA9IDA7CiAgICBmb3IgKDs7KSB7CiAgICAgIGZpbmFsIFJlc3RSZXBseSByZXBseTsKICAgICAgdHJ5IHsKICAgICAgICByZXBseSA9IGF3YWl0IF9hdHRlbXB0KCk7CiAgICAgIH0gb24gUmVzdENvbm5lY3Rpb25GYWlsZWQgY2F0Y2ggKGZhaWx1cmUpIHsKICAgICAgICBpZiAoIV9pc1NhZmUgfHwgcmVwZWF0cyA9PSBfbWF4UmVwZWF0cykgewogICAgICAgICAgdGhyb3cgUmVzdEZhaWx1cmUoCiAgICAgICAgICAgIFJlc3RGYWlsdXJlUmVhc29uLm5ldHdvcmssCiAgICAgICAgICAgIGRldmVsb3BlckhpbnQ6IGZhaWx1cmUuaGludCwKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGF3YWl0IF93YWl0KF9yZXBlYXRXYWl0KHJlcGVhdHMrKykpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CgogICAgICBmaW5hbCBzdGF0dXMgPSByZXBseS5zdGF0dXM7CiAgICAgIGZpbmFsIHJlc3BvbnNlID0gUmVzdFJlc3BvbnNlKAogICAgICAgIHN0YXR1czogc3RhdHVzLAogICAgICAgIGhlYWRlcnM6IHJlcGx5LmhlYWRlcnMsCiAgICAgICAgYnl0ZXM6IHJlcGx5LmJ5dGVzLAogICAgICApOwogICAgICBpZiAoc3RhdHVzID09IDQwMSAmJiBfc2VudCAhPSBudWxsICYmICFfZGlkUmVmcmVzaCkgewogICAgICAgIGF3YWl0IF9yZWZyZXNoKF9zZW50ISwgcmVzcG9uc2UpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChfcmVkaXJlY3RzLmNvbnRhaW5zKHN0YXR1cykpIHsKICAgICAgICBfZm9sbG93KHJlc3BvbnNlLCBob3BzKyspOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChzdGF0dXMgPT0gMzA0IHx8IChzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMCkpIHJldHVybiByZXNwb25zZTsKCiAgICAgIGZpbmFsIHJldHJ5QWZ0ZXIgPSBfcmV0cnlBZnRlck9mKHJlcGx5LmhlYWRlcnMpOwogICAgICBpZiAoX2lzU2FmZSAmJgogICAgICAgICAgX3JlcGVhdGVkU3RhdHVzZXMuY29udGFpbnMoc3RhdHVzKSAmJgogICAgICAgICAgcmVwZWF0cyA8IF9tYXhSZXBlYXRzICYmCiAgICAgICAgICAocmV0cnlBZnRlciA9PSBudWxsIHx8IHJldHJ5QWZ0ZXIgPD0gX21heFdhaXQpKSB7CiAgICAgICAgYXdhaXQgX3dhaXQocmV0cnlBZnRlciA/PyBfcmVwZWF0V2FpdChyZXBlYXRzKSk7CiAgICAgICAgcmVwZWF0cysrOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIHRocm93IFJlc3RGYWlsdXJlKAogICAgICAgIF9yZWFzb25PZihzdGF0dXMpLAogICAgICAgIHN0YXR1czogc3RhdHVzLAogICAgICAgIHJlc3BvbnNlOiByZXNwb25zZSwKICAgICAgICByZXRyeUFmdGVyOiByZXRyeUFmdGVyLAogICAgICAgIGRldmVsb3BlckhpbnQ6IF9yZWFzb25PZihzdGF0dXMpID09IFJlc3RGYWlsdXJlUmVhc29uLnVua25vd24KICAgICAgICAgICAgPyAnVGhlIHNlcnZlciBhbnN3ZXJlZCB3aXRoIHRoZSBzdGF0dXMgJHN0YXR1cy4nCiAgICAgICAgICAgIDogbnVsbCwKICAgICAgKTsKICAgIH0KICB9CgogIC8vLyBPbmUgYXR0ZW1wdDogdGhlIHRva2VuIG9mIHRoZSB1c2VyIHdoZXJlIGl0IG1heSBnbywgYW5kIG9uZSBleGNoYW5nZSwKICAvLy8gd2l0aGluIHRoZSB0aW1lb3V0LiBBIGRlYnVnIGJ1aWxkIHByaW50cyBvbmUgbGluZSBmb3IgaXQuCiAgRnV0dXJlPFJlc3RSZXBseT4gX2F0dGVtcHQoKSBhc3luYyB7CiAgICBmaW5hbCBsaW1pdCA9IF9MaW1pdCh0aW1lb3V0LCBjYW5jZWwpOwogICAgZmluYWwgd2F0Y2ggPSBTdG9wd2F0Y2goKS4uc3RhcnQoKTsKICAgIHZhciBvdXRjb21lID0gUmVzdEZhaWx1cmVSZWFzb24udW5rbm93bi5uYW1lOwogICAgdHJ5IHsKICAgICAgZmluYWwgc2VudCA9IGF3YWl0IF90b2tlbkZvcihsaW1pdCk7CiAgICAgIF9zZW50ID0gc2VudDsKICAgICAgZmluYWwgZXhjaGFuZ2UgPSBSZXN0RXhjaGFuZ2UoCiAgICAgICAgbWV0aG9kOiBtZXRob2QsCiAgICAgICAgdXJpOiB0YXJnZXQsCiAgICAgICAgaGVhZGVyczogewogICAgICAgICAgLi4uaGVhZGVycywKICAgICAgICAgIGlmIChzZW50ICE9IG51bGwpICdhdXRob3JpemF0aW9uJzogJ0JlYXJlciAkc2VudCcsCiAgICAgICAgfSwKICAgICAgICBib2R5OiBib2R5LAogICAgICAgIHN0b3A6IGxpbWl0LnN0b3AsCiAgICAgICk7CiAgICAgIGZpbmFsIHJlcGx5ID0gYXdhaXQgbGltaXQucmFjZSgoKSA9PiBjbGllbnQuX3RyYW5zcG9ydC5zZW5kKGV4Y2hhbmdlKSk7CiAgICAgIG91dGNvbWUgPSAnJHtyZXBseS5zdGF0dXN9JzsKICAgICAgcmV0dXJuIHJlcGx5OwogICAgfSBvbiBSZXN0Q29ubmVjdGlvbkZhaWxlZCB7CiAgICAgIG91dGNvbWUgPSBSZXN0RmFpbHVyZVJlYXNvbi5uZXR3b3JrLm5hbWU7CiAgICAgIHJldGhyb3c7CiAgICB9IG9uIFJlc3RGYWlsdXJlIGNhdGNoIChmYWlsdXJlKSB7CiAgICAgIG91dGNvbWUgPSBmYWlsdXJlLnJlYXNvbi5uYW1lOwogICAgICByZXRocm93OwogICAgfSBmaW5hbGx5IHsKICAgICAgbGltaXQuY2xvc2UoKTsKICAgICAgaWYgKGtEZWJ1Z01vZGUpIHsKICAgICAgICAvLyBUaGUgb3JpZ2luIGFuZCB0aGUgcGF0aCBhbG9uZTogdGhlIHF1ZXJ5IG1heSBoYXZlIGEga2V5LgogICAgICAgIGRlYnVnUHJpbnQoCiAgICAgICAgICAnUkVTVCAkbWV0aG9kICR7dGFyZ2V0Lm9yaWdpbn0ke3RhcmdldC5wYXRofSAkb3V0Y29tZSAnCiAgICAgICAgICAnKCR7d2F0Y2guZWxhcHNlZE1pbGxpc2Vjb25kc30gbXMpJywKICAgICAgICApOwogICAgICB9CiAgICB9CiAgfQoKICAvLy8gVGhlIHRva2VuIGZvciB0aGUgbmV4dCBhdHRlbXB0LCBvciBgbnVsbGAgZm9yIG5vbmU6IGFuIGF0dGVtcHQgdG8KICAvLy8gYW5vdGhlciBvcmlnaW4gZ2V0cyBub25lLCBhbmQgbmVpdGhlciBkb2VzIGEgY2FsbCB3aXRoIGEgaGVhZGVyCiAgLy8vIGBhdXRob3JpemF0aW9uYCBvZiBpdHMgb3duLgogIEZ1dHVyZTxTdHJpbmc/PiBfdG9rZW5Gb3IoX0xpbWl0IGxpbWl0KSBhc3luYyB7CiAgICBmaW5hbCB0b2tlbnMgPSBjbGllbnQuX3Rva2VuczsKICAgIGZpbmFsIG9yaWdpbiA9IGJhc2U/Lm9yaWdpbjsKICAgIGlmICh0b2tlbnMgPT0gbnVsbCB8fAogICAgICAgIF9jYWxsZXJIYXNBdXRob3JpemF0aW9uIHx8CiAgICAgICAgb3JpZ2luID09IG51bGwgfHwKICAgICAgICB0YXJnZXQub3JpZ2luICE9IG9yaWdpbikgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmIChfcmVmcmVzaGVkIGNhc2UgZmluYWwgcmVmcmVzaGVkPykgewogICAgICBfcmVmcmVzaGVkID0gbnVsbDsKICAgICAgcmV0dXJuIHJlZnJlc2hlZDsKICAgIH0KICAgIGZpbmFsIChvd25lciwgdG9rZW4pID0gYXdhaXQgbGltaXQucmFjZSgKICAgICAgKCkgPT4gX3Rva2VuT2ZPd25lcih0b2tlbnMpLAogICAgICB3aXRoaW46IGNsaWVudC50b2tlbldhaXQsCiAgICApOwogICAgZmluYWwgYmVmb3JlID0gX293bmVyOwogICAgaWYgKGJlZm9yZSAhPSBudWxsICYmIG93bmVyICE9IGJlZm9yZSkgdGhyb3cgX290aGVyVXNlcigpOwogICAgX293bmVyID0gb3duZXI7CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8gVGhlIHVzZXIgb2YgW3Rva2Vuc10gYW5kIHRoYXQgdXNlcidzIHRva2VuLiBXaGVuIHRoZSB1c2VyIGNoYW5nZXMgZHVyaW5nCiAgLy8vIHRoZSByZWFkLCBhcyB3aGVuIHRoZSBhcHAgc3RhcnRzLCB0aGUgdG9rZW4gbWF5IGJlIG9mIHRoZSB1c2VyIGJlZm9yZSwgc28KICAvLy8gaXQgcmVhZHMgb25jZSBtb3JlLCBhbmQgZmFpbHMgd2hlbiB0aGUgdXNlciBjaGFuZ2VzIGFnYWluLgogIEZ1dHVyZTwoU3RyaW5nPywgU3RyaW5nPyk+IF90b2tlbk9mT3duZXIoUmVzdFRva2VucyB0b2tlbnMpIGFzeW5jIHsKICAgIGZpbmFsIG93bmVyID0gdG9rZW5zLm93bmVyOwogICAgZmluYWwgdG9rZW4gPSBhd2FpdCB0b2tlbnMuY3VycmVudCgpOwogICAgaWYgKHRva2Vucy5vd25lciA9PSBvd25lcikgcmV0dXJuIChvd25lciwgdG9rZW4pOwogICAgZmluYWwgbmV4dCA9IHRva2Vucy5vd25lcjsKICAgIGZpbmFsIGFnYWluID0gYXdhaXQgdG9rZW5zLmN1cnJlbnQoKTsKICAgIGlmICh0b2tlbnMub3duZXIgIT0gbmV4dCkgdGhyb3cgX290aGVyVXNlcigpOwogICAgcmV0dXJuIChuZXh0LCBhZ2Fpbik7CiAgfQoKICAvLy8gR2V0cyB0aGUgdG9rZW4gdGhhdCByZXBsYWNlcyBbcmVqZWN0ZWRdLCBvbmNlIGluIGEgY2FsbCwgZm9yIHRoZSBzYW1lCiAgLy8vIHVzZXIuIFRoZSBzZXJ2ZXIgdGhhdCByZWZ1c2VkIGl0IGRpZCBub3RoaW5nIHlldCwgc28gZXZlcnkgbWV0aG9kCiAgLy8vIHJlcGVhdHMgYWZ0ZXIgaXQuCiAgRnV0dXJlPHZvaWQ+IF9yZWZyZXNoKFN0cmluZyByZWplY3RlZCwgUmVzdFJlc3BvbnNlIHJlc3BvbnNlKSBhc3luYyB7CiAgICBfZGlkUmVmcmVzaCA9IHRydWU7CiAgICBmaW5hbCB0b2tlbnMgPSBjbGllbnQuX3Rva2VucyE7CiAgICBmaW5hbCBsaW1pdCA9IF9MaW1pdCh0aW1lb3V0LCBjYW5jZWwpOwogICAgdHJ5IHsKICAgICAgZmluYWwgdG9rZW4gPSBhd2FpdCBsaW1pdC5yYWNlKAogICAgICAgICgpID0+IHRva2Vucy5hZnRlcihyZWplY3RlZCksCiAgICAgICAgd2l0aGluOiBjbGllbnQudG9rZW5XYWl0LAogICAgICApOwogICAgICBpZiAodG9rZW4gPT0gbnVsbCB8fCB0b2tlbnMub3duZXIgIT0gX293bmVyKSB7CiAgICAgICAgdGhyb3cgX290aGVyVXNlcihyZXNwb25zZTogcmVzcG9uc2UpOwogICAgICB9CiAgICAgIF9yZWZyZXNoZWQgPSB0b2tlbjsKICAgIH0gZmluYWxseSB7CiAgICAgIGxpbWl0LmNsb3NlKCk7CiAgICB9CiAgfQoKICBSZXN0RmFpbHVyZSBfb3RoZXJVc2VyKHtSZXN0UmVzcG9uc2U/IHJlc3BvbnNlfSkgPT4gUmVzdEZhaWx1cmUoCiAgICAgICAgUmVzdEZhaWx1cmVSZWFzb24udW5hdXRob3JpemVkLAogICAgICAgIHN0YXR1czogcmVzcG9uc2U/LnN0YXR1cywKICAgICAgICByZXNwb25zZTogcmVzcG9uc2UsCiAgICAgICAgZGV2ZWxvcGVySGludDogJ1RoZSB1c2VyIG9mIHRoZSBzZXNzaW9uIGNoYW5nZWQgZHVyaW5nIHRoZSBjYWxsLCBzbyAnCiAgICAgICAgICAgICdpdCBkaWQgbm90IHJlcGVhdCBmb3IgdGhlIG5ldyB1c2VyLicsCiAgICAgICk7CgogIC8vLyBHb2VzIG9uIHRvIHRoZSBhZGRyZXNzIHRoYXQgdGhlIHJlZGlyZWN0IGluIFtyZXNwb25zZV0gbmFtZXM6IGZvciBgR0VUYAogIC8vLyBhbmQgYEhFQURgIG9ubHksIHNpbmNlIHRoZSBzZXJ2ZXIgbWF5IGhhdmUgZG9uZSB3aGF0IGFub3RoZXIgbWV0aG9kCiAgLy8vIGFza2VkLiBBIGhvcCB0byBhbm90aGVyIG9yaWdpbiB0YWtlcyB0aGUgaGVhZGVycyBvZiB0aGUgY2FsbGVyIHRoYXQgYXJlCiAgLy8vIG9ubHkgZm9yIHRoZSBvcmlnaW4gdGhleSB3ZXJlIGdpdmVuIGZvci4KICB2b2lkIF9mb2xsb3coUmVzdFJlc3BvbnNlIHJlc3BvbnNlLCBpbnQgaG9wcykgewogICAgUmVzdEZhaWx1cmUgcmVmdXNlZChTdHJpbmcgaGludCkgPT4gUmVzdEZhaWx1cmUoCiAgICAgICAgICBSZXN0RmFpbHVyZVJlYXNvbi51bmtub3duLAogICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsCiAgICAgICAgICByZXNwb25zZTogcmVzcG9uc2UsCiAgICAgICAgICBkZXZlbG9wZXJIaW50OiBoaW50LAogICAgICAgICk7CiAgICBpZiAoIV9pc1NhZmUpIHsKICAgICAgdGhyb3cgcmVmdXNlZCgKICAgICAgICAnVGhlIHNlcnZlciBhbnN3ZXJlZCBhICRtZXRob2Qgd2l0aCBhIHJlZGlyZWN0LCB3aGljaCBvbmx5IEdFVCBhbmQgJwogICAgICAgICdIRUFEIGZvbGxvdy4gQ2FsbCB0aGUgYWRkcmVzcyB0aGF0IGl0IG5hbWVzIHlvdXJzZWxmLCBpZiB5b3UgbWVhbiB0by4nLAogICAgICApOwogICAgfQogICAgaWYgKGhvcHMgPT0gX21heFJlZGlyZWN0cykgewogICAgICB0aHJvdyByZWZ1c2VkKCdNb3JlIHRoYW4gJF9tYXhSZWRpcmVjdHMgcmVkaXJlY3RzLicpOwogICAgfQogICAgZmluYWwgbG9jYXRpb24gPSByZXNwb25zZS5oZWFkZXJzWydsb2NhdGlvbiddOwogICAgaWYgKGxvY2F0aW9uID09IG51bGwpIHRocm93IHJlZnVzZWQoJ0EgcmVkaXJlY3Qgd2l0aG91dCBhIGxvY2F0aW9uLicpOwogICAgZmluYWwgbmV4dCA9IHRhcmdldC5yZXNvbHZlKGxvY2F0aW9uKS5yZW1vdmVGcmFnbWVudCgpOwogICAgaWYgKCEobmV4dC5pc1NjaGVtZSgnaHR0cCcpIHx8IG5leHQuaXNTY2hlbWUoJ2h0dHBzJykpKSB7CiAgICAgIHRocm93IHJlZnVzZWQoJ0EgcmVkaXJlY3QgdG8gYW4gYWRkcmVzcyB0aGF0IGlzIG5vIGh0dHAgb3IgaHR0cHMgb25lLicpOwogICAgfQogICAgaWYgKG5leHQub3JpZ2luICE9IHRhcmdldC5vcmlnaW4pIF9vcmlnaW5IZWFkZXJzLmZvckVhY2goaGVhZGVycy5yZW1vdmUpOwogICAgdGFyZ2V0ID0gbmV4dDsKICB9CgogIC8vLyBXYWl0cyBmb3IgW2R1cmF0aW9uXSwgd2hpY2ggYSBjYW5jZWwgZW5kcyBhdCBvbmNlLgogIEZ1dHVyZTx2b2lkPiBfd2FpdChEdXJhdGlvbiBkdXJhdGlvbikgYXN5bmMgewogICAgZmluYWwgbGltaXQgPSBfTGltaXQobnVsbCwgY2FuY2VsKTsKICAgIGZpbmFsIHdhaXRlZCA9IENvbXBsZXRlcjx2b2lkPigpOwogICAgZmluYWwgdGltZXIgPSBUaW1lcihkdXJhdGlvbiwgd2FpdGVkLmNvbXBsZXRlKTsKICAgIHRyeSB7CiAgICAgIGF3YWl0IGxpbWl0LnJhY2UoKCkgPT4gd2FpdGVkLmZ1dHVyZSk7CiAgICB9IGZpbmFsbHkgewogICAgICB0aW1lci5jYW5jZWwoKTsKICAgICAgbGltaXQuY2xvc2UoKTsKICAgIH0KICB9CgogIHN0YXRpYyBEdXJhdGlvbiBfcmVwZWF0V2FpdChpbnQgcmVwZWF0cykgPT4KICAgICAgX3JlcGVhdFdhaXRzW3JlcGVhdHNdICsKICAgICAgRHVyYXRpb24obWlsbGlzZWNvbmRzOiBfcmFuZG9tLm5leHRJbnQoX21heEppdHRlck1pbGxpc2Vjb25kcykpOwoKICAvLy8gVGhlIHdhaXQgdGhhdCBbaGVhZGVyc10gbmFtZSwgaW4gc2Vjb25kcyBvciBhcyBhbiBIVFRQIGRhdGUsIG9yIGBudWxsYAogIC8vLyB3aXRob3V0IG9uZSB0aGF0IHRoZSBjbGllbnQgY2FuIHJlYWQuCiAgc3RhdGljIER1cmF0aW9uPyBfcmV0cnlBZnRlck9mKE1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycykgewogICAgZmluYWwgdmFsdWUgPSBoZWFkZXJzWydyZXRyeS1hZnRlciddPy50cmltKCk7CiAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICBpZiAoX3JldHJ5QWZ0ZXJTZWNvbmRzLmhhc01hdGNoKHZhbHVlKSkgewogICAgICBmaW5hbCBzZWNvbmRzID0gaW50LnRyeVBhcnNlKHZhbHVlKSA/PyBfbWF4UmV0cnlBZnRlclNlY29uZHM7CiAgICAgIHJldHVybiBEdXJhdGlvbihzZWNvbmRzOiBtaW4oc2Vjb25kcywgX21heFJldHJ5QWZ0ZXJTZWNvbmRzKSk7CiAgICB9CiAgICBmaW5hbCBtYXRjaCA9IF9odHRwRGF0ZS5maXJzdE1hdGNoKHZhbHVlKTsKICAgIGZpbmFsIG1vbnRoID0gbWF0Y2ggPT0gbnVsbCA/IC0xIDogX21vbnRocy5pbmRleE9mKG1hdGNoWzJdISk7CiAgICBpZiAobWF0Y2ggPT0gbnVsbCB8fCBtb250aCA8IDApIHJldHVybiBudWxsOwogICAgZmluYWwgd2FpdCA9IERhdGVUaW1lLnV0YygKICAgICAgaW50LnBhcnNlKG1hdGNoWzNdISksCiAgICAgIG1vbnRoICsgMSwKICAgICAgaW50LnBhcnNlKG1hdGNoWzFdISksCiAgICAgIGludC5wYXJzZShtYXRjaFs0XSEpLAogICAgICBpbnQucGFyc2UobWF0Y2hbNV0hKSwKICAgICAgaW50LnBhcnNlKG1hdGNoWzZdISksCiAgICApLmRpZmZlcmVuY2UoRGF0ZVRpbWUubm93KCkpOwogICAgcmV0dXJuIHdhaXQuaXNOZWdhdGl2ZSA/IER1cmF0aW9uLnplcm8gOiB3YWl0OwogIH0KCiAgc3RhdGljIFJlc3RGYWlsdXJlUmVhc29uIF9yZWFzb25PZihpbnQgc3RhdHVzKSA9PiBzd2l0Y2ggKHN0YXR1cykgewogICAgICAgIDQwMSA9PiBSZXN0RmFpbHVyZVJlYXNvbi51bmF1dGhvcml6ZWQsCiAgICAgICAgNDAzID0+IFJlc3RGYWlsdXJlUmVhc29uLmZvcmJpZGRlbiwKICAgICAgICA0MDQgPT4gUmVzdEZhaWx1cmVSZWFzb24ubm90Rm91bmQsCiAgICAgICAgNDA5ID0+IFJlc3RGYWlsdXJlUmVhc29uLmNvbmZsaWN0LAogICAgICAgIDQyOSA9PiBSZXN0RmFpbHVyZVJlYXNvbi50b29NYW55UmVxdWVzdHMsCiAgICAgICAgPj0gNDAwICYmIDwgNTAwID0+IFJlc3RGYWlsdXJlUmVhc29uLnJlamVjdGVkLAogICAgICAgID49IDUwMCAmJiA8IDYwMCA9PiBSZXN0RmFpbHVyZVJlYXNvbi5zZXJ2ZXIsCiAgICAgICAgXyA9PiBSZXN0RmFpbHVyZVJlYXNvbi51bmtub3duLAogICAgICB9Owp9CgovLy8gV2hhdCBlbmRzIGFuIGF0dGVtcHQgb3IgYSB3YWl0OiBpdHMgdGltZW91dCwgaWYgaXQgaGFzIG9uZSwgYW5kIHRoZSBjYW5jZWwKLy8vIG9mIHRoZSBjYWxsZXIuIFRoZSBjYWxsIGVuZHMgdGhlbiwgYWxzbyB3aGVuIGEgcHJvdmlkZXIgZG9lcyBub3Qgc3RvcC4KZmluYWwgY2xhc3MgX0xpbWl0IHsKICBfTGltaXQoRHVyYXRpb24/IHRpbWVvdXQsIHRoaXMuX2NhbmNlbCkgewogICAgZmluYWwgY2FuY2VsID0gX2NhbmNlbDsKICAgIGlmIChjYW5jZWwgIT0gbnVsbCkgewogICAgICBpZiAoY2FuY2VsLmlzQ2FuY2VsbGVkKSB7CiAgICAgICAgX2NhbmNlbGxlZCgpOwogICAgICB9IGVsc2UgewogICAgICAgIGNhbmNlbC5fbGlzdGVuZXJzLmFkZChfY2FuY2VsbGVkKTsKICAgICAgfQogICAgfQogICAgaWYgKHRpbWVvdXQgIT0gbnVsbCkgewogICAgICBfdGltZXIgPSBUaW1lcigKICAgICAgICB0aW1lb3V0LAogICAgICAgICgpID0+IF9lbmQoCiAgICAgICAgICBSZXN0RmFpbHVyZSgKICAgICAgICAgICAgUmVzdEZhaWx1cmVSZWFzb24udGltZW91dCwKICAgICAgICAgICAgZGV2ZWxvcGVySGludDoKICAgICAgICAgICAgICAgICdObyBjb21wbGV0ZSBhbnN3ZXIgd2l0aGluICR7dGltZW91dC5pbk1pbGxpc2Vjb25kc30gbXMuJywKICAgICAgICAgICksCiAgICAgICAgKSwKICAgICAgKTsKICAgIH0KICB9CgogIGZpbmFsIFJlc3RDYW5jZWw/IF9jYW5jZWw7CiAgZmluYWwgQ29tcGxldGVyPHZvaWQ+IF9zdG9wID0gQ29tcGxldGVyKCk7CiAgVGltZXI/IF90aW1lcjsKICBSZXN0RmFpbHVyZT8gX2VuZGVkOwogIHZvaWQgRnVuY3Rpb24oUmVzdEZhaWx1cmUgZmFpbHVyZSk/IF9yYWNpbmc7CgogIC8vLyBDb21wbGV0ZXMgd2hlbiB0aGUgYXR0ZW1wdCBoYXMgdG8gc3RvcC4KICBGdXR1cmU8dm9pZD4gZ2V0IHN0b3AgPT4gX3N0b3AuZnV0dXJlOwoKICB2b2lkIF9jYW5jZWxsZWQoKSA9PiBfZW5kKGNvbnN0IFJlc3RGYWlsdXJlKFJlc3RGYWlsdXJlUmVhc29uLmNhbmNlbGxlZCkpOwoKICB2b2lkIF9lbmQoUmVzdEZhaWx1cmUgZmFpbHVyZSkgewogICAgaWYgKF9lbmRlZCAhPSBudWxsKSByZXR1cm47CiAgICBfZW5kZWQgPSBmYWlsdXJlOwogICAgX3N0b3AuY29tcGxldGUoKTsKICAgIF9yYWNpbmc/LmNhbGwoZmFpbHVyZSk7CiAgfQoKICAvLy8gV2hhdCBbd29ya10gZ2l2ZXMsIHVubGVzcyB0aGUgbGltaXQgZW5kcyBmaXJzdCBvciBbd2l0aGluXSBpcyBvdmVyLgogIC8vLyBXaGF0ZXZlciBbd29ya10gZG9lcyBhZnRlciB0aGF0IGdvZXMgbm93aGVyZS4KICBGdXR1cmU8VD4gcmFjZTxUPihGdXR1cmU8VD4gRnVuY3Rpb24oKSB3b3JrLCB7RHVyYXRpb24/IHdpdGhpbn0pIGFzeW5jIHsKICAgIGlmIChfZW5kZWQgY2FzZSBmaW5hbCBmYWlsdXJlPykgdGhyb3cgZmFpbHVyZTsKICAgIGZpbmFsIHJlc3VsdCA9IENvbXBsZXRlcjxUPigpOwogICAgdm9pZCBlbmQoUmVzdEZhaWx1cmUgZmFpbHVyZSkgewogICAgICBpZiAoIXJlc3VsdC5pc0NvbXBsZXRlZCkgcmVzdWx0LmNvbXBsZXRlRXJyb3IoZmFpbHVyZSk7CiAgICB9CgogICAgX3JhY2luZyA9IGVuZDsKICAgIGZpbmFsIHdhaXQgPSB3aXRoaW4gPT0gbnVsbAogICAgICAgID8gbnVsbAogICAgICAgIDogVGltZXIoCiAgICAgICAgICAgIHdpdGhpbiwKICAgICAgICAgICAgKCkgPT4gZW5kKAogICAgICAgICAgICAgIFJlc3RGYWlsdXJlKAogICAgICAgICAgICAgICAgUmVzdEZhaWx1cmVSZWFzb24udGltZW91dCwKICAgICAgICAgICAgICAgIGRldmVsb3BlckhpbnQ6ICdUaGUgdG9rZW4gb2YgdGhlIHVzZXIgZGlkIG5vdCBjb21lIHdpdGhpbiAnCiAgICAgICAgICAgICAgICAgICAgJyR7d2l0aGluLmluTWlsbGlzZWNvbmRzfSBtcy4nLAogICAgICAgICAgICAgICksCiAgICAgICAgICAgICksCiAgICAgICAgICApOwogICAgdW5hd2FpdGVkKAogICAgICBGdXR1cmU8VD4uc3luYyh3b3JrKS50aGVuKAogICAgICAgICh2YWx1ZSkgewogICAgICAgICAgaWYgKCFyZXN1bHQuaXNDb21wbGV0ZWQpIHJlc3VsdC5jb21wbGV0ZSh2YWx1ZSk7CiAgICAgICAgfSwKICAgICAgICBvbkVycm9yOiAoT2JqZWN0IGVycm9yLCBTdGFja1RyYWNlIHN0YWNrVHJhY2UpIHsKICAgICAgICAgIGlmICghcmVzdWx0LmlzQ29tcGxldGVkKSByZXN1bHQuY29tcGxldGVFcnJvcihlcnJvciwgc3RhY2tUcmFjZSk7CiAgICAgICAgfSwKICAgICAgKSwKICAgICk7CiAgICB0cnkgewogICAgICByZXR1cm4gYXdhaXQgcmVzdWx0LmZ1dHVyZTsKICAgIH0gZmluYWxseSB7CiAgICAgIHdhaXQ/LmNhbmNlbCgpOwogICAgICBfcmFjaW5nID0gbnVsbDsKICAgIH0KICB9CgogIC8vLyBFbmRzIHRoZSB0aW1lciBvZiB0aGUgbGltaXQsIG9uY2Ugd2hhdCBpdCBsaW1pdHMgaXMgb3Zlci4KICB2b2lkIGNsb3NlKCkgewogICAgX3RpbWVyPy5jYW5jZWwoKTsKICAgIF9jYW5jZWw/Ll9saXN0ZW5lcnMucmVtb3ZlKF9jYW5jZWxsZWQpOwogIH0KfQoKLy8vIFRoZSB0cmFuc3BvcnQgb2YgdGhlIHByb3ZpZGVyIG9mIHRoZSBSRVNUIHJvbGUuIE9ubHkgdGhlIGNsaWVudCBvZiB0aGUgYXBwCi8vLyBhbmQgYSB0ZXN0IG9mIHRoZSBwcm92aWRlciBjYWxsIHRoaXMuClJlc3RUcmFuc3BvcnQgY3JlYXRlUmVzdFRyYW5zcG9ydCgpID0+IF9yZXN0VHJhbnNwb3J0OwoKe3t7c21mX3Jlc3RfX2ltcGxlbWVudGF0aW9uc319fQo=",
      "type": "text"
    },
    {
      "path": "lib/core/rest/rest_transport.dart",
      "data":
          "Ly8vIE9uZSBleGNoYW5nZSB3aXRoIGEgc2VydmVyLCBhcyB0aGUgcHJvdmlkZXIgb2YgdGhlIFJFU1Qgcm9sZSBzZW5kcyBpdC4KZmluYWwgY2xhc3MgUmVzdEV4Y2hhbmdlIHsKICAvLy8gQ3JlYXRlcyB0aGUgZXhjaGFuZ2U7IG9ubHkgdGhlIGNsaWVudCBvZiB0aGUgYXBwIGRvZXMuCiAgY29uc3QgUmVzdEV4Y2hhbmdlKHsKICAgIHJlcXVpcmVkIHRoaXMubWV0aG9kLAogICAgcmVxdWlyZWQgdGhpcy51cmksCiAgICByZXF1aXJlZCB0aGlzLmhlYWRlcnMsCiAgICByZXF1aXJlZCB0aGlzLnN0b3AsCiAgICB0aGlzLmJvZHksCiAgfSk7CgogIC8vLyBUaGUgbWV0aG9kLCBpbiB1cHBlciBjYXNlLgogIGZpbmFsIFN0cmluZyBtZXRob2Q7CgogIC8vLyBUaGUgd2hvbGUgYWRkcmVzcywgd2l0aCBpdHMgcXVlcnkuCiAgZmluYWwgVXJpIHVyaTsKCiAgLy8vIFRoZSBoZWFkZXJzLCBlYWNoIG5hbWUgaW4gbG93ZXIgY2FzZSwgd2l0aCBgY29udGVudC1sZW5ndGhgIGZvciBhIGJvZHkuCiAgLy8vIFRoZXkgbWF5IGhvbGQgYSB0b2tlbi4KICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnM7CgogIC8vLyBUaGUgYm9keSwgb3IgYG51bGxgIGZvciBub25lLgogIGZpbmFsIExpc3Q8aW50Pj8gYm9keTsKCiAgLy8vIENvbXBsZXRlcyB3aGVuIHRoZSBleGNoYW5nZSBoYXMgdG8gc3RvcDogYSB0aW1lb3V0LCBvciBhIGNhbmNlbC4KICBmaW5hbCBGdXR1cmU8dm9pZD4gc3RvcDsKCiAgLy8vIE5hbWVzIG5vIGhlYWRlciBhbmQgbm8gcXVlcnksIHNvIHRoYXQgYSB0b2tlbiBuZXZlciByZWFjaGVzIGEgbG9nLgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdSZXN0RXhjaGFuZ2UoJG1ldGhvZCAke3VyaS5vcmlnaW59JHt1cmkucGF0aH0pJzsKfQoKLy8vIFdoYXQgYSBzZXJ2ZXIgYW5zd2VyZWQuCmZpbmFsIGNsYXNzIFJlc3RSZXBseSB7CiAgLy8vIENyZWF0ZXMgdGhlIHJlcGx5OyBhIHByb3ZpZGVyIGRvZXMsIGZyb20gd2hhdCB0aGUgc2VydmVyIGFuc3dlcmVkLgogIGNvbnN0IFJlc3RSZXBseSh7CiAgICByZXF1aXJlZCB0aGlzLnN0YXR1cywKICAgIHJlcXVpcmVkIHRoaXMuaGVhZGVycywKICAgIHJlcXVpcmVkIHRoaXMuYnl0ZXMsCiAgfSk7CgogIC8vLyBUaGUgc3RhdHVzIG9mIHRoZSBhbnN3ZXIuCiAgZmluYWwgaW50IHN0YXR1czsKCiAgLy8vIFRoZSBoZWFkZXJzLCBlYWNoIG5hbWUgaW4gbG93ZXIgY2FzZSwgYW5kIHNldmVyYWwgdmFsdWVzIG9mIG9uZSBoZWFkZXIKICAvLy8gam9pbmVkIGJ5IGAsIGAuCiAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzOwoKICAvLy8gVGhlIGJvZHksIGFzIHRoZSBwcm92aWRlciBkZWNvZGVkIGl0IG9yIGFzIGl0IGNhbWUuCiAgZmluYWwgTGlzdDxpbnQ+IGJ5dGVzOwp9CgovLy8gVGhlIHJlcXVlc3QgZGlkIG5vdCByZWFjaCBhIHNlcnZlciwgb3IgdGhlIGNvbm5lY3Rpb24gYnJva2UuIE5vIG90aGVyCi8vLyBleGNlcHRpb24gb2YgYSBwcm92aWRlciB0ZWxscyB0aGF0LgpmaW5hbCBjbGFzcyBSZXN0Q29ubmVjdGlvbkZhaWxlZCBpbXBsZW1lbnRzIEV4Y2VwdGlvbiB7CiAgLy8vIENyZWF0ZXMgdGhlIGZhaWx1cmUgd2l0aCBbaGludF0sIGZvciB0aGUgZGV2ZWxvcGVyIG9mIHRoZSBhcHAuCiAgY29uc3QgUmVzdENvbm5lY3Rpb25GYWlsZWQodGhpcy5oaW50KTsKCiAgLy8vIFdoYXQgd2VudCB3cm9uZy4gSXQgaGFzIG5vIGhlYWRlciwgbm8gcXVlcnkgYW5kIG5vIGJvZHkuCiAgZmluYWwgU3RyaW5nIGhpbnQ7CgogIEBvdmVycmlkZQogIFN0cmluZyB0b1N0cmluZygpID0+ICdSZXN0Q29ubmVjdGlvbkZhaWxlZDogJGhpbnQnOwp9CgovLy8gT25lIGV4Y2hhbmdlIG9uIHRoZSB3aXJlLCB3aGljaCBpcyBhbGwgdGhhdCBhIHByb3ZpZGVyIG9mIHRoZSBSRVNUIHJvbGUKLy8vIGRvZXMuIGBhcHBSZXN0YCBkb2VzIHRoZSByZXN0IHdpdGggd2hhdCB0aGUgcHJvdmlkZXIgcmVwb3J0cywgc28gZXZlcnkKLy8vIHByb3ZpZGVyIGtlZXBzIHRoZSBzYW1lIGd1YXJhbnRlZXMuCi8vLwovLy8gRXZlcnkgcHJvdmlkZXIga2VlcHMgdG8gdGhpcy4gT25seSBhIHJ1bm5pbmcgYXBwIHNob3dzIHdoZXRoZXIgaXQgZG9lczoKLy8vIC0gW3NlbmRdIG1ha2VzIG9uZSBhdHRlbXB0LiBBIHByb3ZpZGVyIHJlcGVhdHMgbm90aGluZy4KLy8vIC0gSXQgZm9sbG93cyBubyByZWRpcmVjdDogYSAzeHggaXMgYSByZXBseS4gYGFwcFJlc3RgIGZvbGxvd3MgdGhlbSwgc2luY2UKLy8vICAgaXQga25vd3Mgd2hpY2ggaGVhZGVyIG1heSBnbyB3aGVyZS4KLy8vIC0gQW55IHN0YXR1cyBpcyBhIHJlcGx5LCBhbmQgaXQga2VlcHMgdGhlIGhlYWRlcnMgb2YgdGhlIHJlcGx5LCB3aXRoIHRoZWlyCi8vLyAgIG5hbWVzIGluIGxvd2VyIGNhc2UuIEEgcHJvdmlkZXIgd2hvc2Ugc3RhY2sgZGVjb2RlZCBhIGJvZHkgbGVhdmVzIG91dAovLy8gICBgY29udGVudC1lbmNvZGluZ2AgYW5kIGl0cyBgY29udGVudC1sZW5ndGhgLCB3aGljaCBubyBsb25nZXIgdGVsbCBvZiB0aGUKLy8vICAgYnl0ZXMuIEEgYm9keSBpbiBhIGNvZGluZyB0aGF0IHRoZSBzdGFjayBkaWQgbm90IGRlY29kZSBrZWVwcyB0aGVtLgovLy8gLSBBIGZhaWx1cmUgdG8gY29ubmVjdCwgYSBUTFMgaGFuZHNoYWtlIG9yIGEgY2VydGlmaWNhdGUgdGhhdCBmYWlscywgYW5kIGEKLy8vICAgY29ubmVjdGlvbiB0aGF0IGJyZWFrcyBhcmUgW1Jlc3RDb25uZWN0aW9uRmFpbGVkXS4gT24gYGRhcnQ6aW9gIHRob3NlIGFyZQovLy8gICBgU29ja2V0RXhjZXB0aW9uYCwgYEh0dHBFeGNlcHRpb25gIGFuZCBgVGxzRXhjZXB0aW9uYC4gQW55IG90aGVyIGVycm9yIGlzCi8vLyAgIGEgYnVnIG9mIHRoZSBwcm92aWRlciwgd2hpY2ggcmVhY2hlcyB0aGUgY2FsbGVyIGFzIHRoZSByZWFzb24gYHVua25vd25gLgovLy8gLSBXaGVuIFtSZXN0RXhjaGFuZ2Uuc3RvcF0gY29tcGxldGVzLCBpdCBjbG9zZXMgdGhlIGNvbm5lY3Rpb24gYXQgb25jZS4gSXQKLy8vICAgbmVlZHMgbm8gdGltZW91dCBvZiBpdHMgb3duOiBgYXBwUmVzdGAgc3RvcHMgZXZlcnkgZXhjaGFuZ2UuIE9uIGBkYXJ0OmlvYAovLy8gICB0aGUgY2FsbCBlbmRzIGF0IG9uY2UsIGJ1dCBhIFRMUyBoYW5kc2hha2Ugb24gaXRzIHdheSBjYW5ub3QgYmUgZW5kZWQsIG5vdAovLy8gICBldmVuIGJ5IGBjbG9zZShmb3JjZTogdHJ1ZSlgOiBpdHMgc29ja2V0IGNsb3NlcyB3aGVuIHRoZSBoYW5kc2hha2UgZW5kcyBvcgovLy8gICB0aGUgc2VydmVyIGVuZHMgaXQuIEEgcHJvdmlkZXIgdGhhdCBzaGFyZXMgb25lIGBIdHRwQ2xpZW50YCBjYW5ub3QgZW5kIGEKLy8vICAgVENQIGNvbm5lY3Qgb24gaXRzIHdheSBlaXRoZXI6IHRoZSBzeXN0ZW0gZW5kcyBpdC4KLy8vIC0gT24gYGRhcnQ6aW9gLCBvbmUgdGhhdCBrZWVwcyBhbiBgSHR0cENsaWVudGAgbWFrZXMgYSBuZXcgb25lIHdoZW4KLy8vICAgYEh0dHBPdmVycmlkZXNgIGNoYW5nZSwgYXMgdGhleSBkbyB3aGVuIGEgdGVzdCBzdGFydHMgb3IgY2xvc2VzIGEKLy8vICAgYFJlc3RUZXN0U2VydmVyYC4KLy8vIC0gSXQgc2VuZHMgW1Jlc3RFeGNoYW5nZS51cmldIGFzIGl0IGlzLCB3aXRoIHRob3NlIGhlYWRlcnMgYW5kIHRoYXQgYm9keS4KLy8vICAgSXRzIHN0YWNrIG1heSBhZGQgdGhlIGhlYWRlcnMgb2YgdGhlIHRyYW5zcG9ydCBpdHNlbGYsIHN1Y2ggYXMgYGhvc3RgLAovLy8gICBgdXNlci1hZ2VudGAgYW5kIGBhY2NlcHQtZW5jb2RpbmdgLiBJdCBhZGRzIG5vIGNyZWRlbnRpYWwgb3IgY29va2llLCBhbmQKLy8vICAga2VlcHMgbm9uZSBiZXR3ZWVuIHR3byBjYWxscy4KLy8vIC0gSXQgd3JpdGVzIG5vIGhlYWRlciwgbm8gcXVlcnkgYW5kIG5vIGJvZHkgdG8gYSBsb2cgb3IgYSBoaW50LgovLy8gLSBJdHMgZnVuY3Rpb24gdGFrZXMgbm8gYXJndW1lbnRzLCBuZXZlciB0aHJvd3MgYW5kIGRvZXMgbm90IHdhaXQsIGFuZCB0aGUKLy8vICAgaW1wbGVtZW50YXRpb24gd29ya3MgZnJvbSB0aGUgZmlyc3QgY2FsbC4KYWJzdHJhY3QgaW50ZXJmYWNlIGNsYXNzIFJlc3RUcmFuc3BvcnQgewogIC8vLyBTZW5kcyBbZXhjaGFuZ2VdIGFuZCBjb21wbGV0ZXMgd2l0aCB3aGF0IHRoZSBzZXJ2ZXIgYW5zd2VyZWQuCiAgRnV0dXJlPFJlc3RSZXBseT4gc2VuZChSZXN0RXhjaGFuZ2UgZXhjaGFuZ2UpOwp9Cg==",
      "type": "text"
    },
    {
      "path": "test/core/rest/app_rest_test.dart",
      "data":
          "aW1wb3J0ICdwYWNrYWdlOmZsdXR0ZXJfdGVzdC9mbHV0dGVyX3Rlc3QuZGFydCc7CmltcG9ydCAncGFja2FnZTp7e2FwcF9uYW1lfX0vY29yZS9yZXN0L2FwcF9yZXN0LmRhcnQnOwoKaW1wb3J0ICdyZXN0X3Rlc3Rfc2VydmVyLmRhcnQnOwoKdm9pZCBtYWluKCkgewogIGxhdGUgUmVzdFRlc3RTZXJ2ZXIgc2VydmVyOwogIGxhdGUgQXBwUmVzdENsaWVudCBjbGllbnQ7CgogIHNldFVwKCgpIGFzeW5jIHsKICAgIHNlcnZlciA9IGF3YWl0IFJlc3RUZXN0U2VydmVyLnN0YXJ0KCk7CiAgICBjbGllbnQgPSBBcHBSZXN0Q2xpZW50KAogICAgICB0cmFuc3BvcnQ6IGNyZWF0ZVJlc3RUcmFuc3BvcnQoKSwKICAgICAgYmFzZUFkZHJlc3M6ICcke3NlcnZlci5hZGRyZXNzfS92MScsCiAgICApOwogIH0pOwoKICB0ZWFyRG93bigoKSA9PiBzZXJ2ZXIuY2xvc2UoKSk7CgogIHRlc3QoJ2EgcmVsYXRpdmUgcGF0aCByZWFjaGVzIHRoZSBhZGRyZXNzLCBhbmQgdGhlIGJvZHkgaXMgZGVjb2RlZCcsCiAgICAgICgpIGFzeW5jIHsKICAgIHNlcnZlci5hbnN3ZXJKc29uKCdHRVQnLCAnL3YxL25vdGVzJywgWydhJywgJ2InXSk7CgogICAgZmluYWwgbm90ZXMgPSBhd2FpdCBjbGllbnQuZ2V0KCdub3RlcycsIHF1ZXJ5OiB7J3BhZ2UnOiAnMSd9KTsKCiAgICBleHBlY3Qobm90ZXMuZGVjb2RlZCgoTGlzdDxPYmplY3Q/PiBqc29uKSA9PiBqc29uLmxlbmd0aCksIDIpOwogICAgZXhwZWN0KHNlcnZlci5yZXF1ZXN0cy5zaW5nbGUudXJpLnRvU3RyaW5nKCksICcvdjEvbm90ZXM/cGFnZT0xJyk7CiAgfSk7CgogIHRlc3QoJ2EgNDA0IGZhaWxzIHdpdGggbm90Rm91bmQnLCAoKSBhc3luYyB7CiAgICBhd2FpdCBleHBlY3RMYXRlcigKICAgICAgY2xpZW50LmdldCgnbm90ZXMnKSwKICAgICAgdGhyb3dzQSgKICAgICAgICBpc0E8UmVzdEZhaWx1cmU+KCkKICAgICAgICAgICAgLmhhdmluZygoZmFpbHVyZSkgPT4gZmFpbHVyZS5yZWFzb24sICdyZWFzb24nLCBSZXN0RmFpbHVyZVJlYXNvbi5ub3RGb3VuZCkKICAgICAgICAgICAgLmhhdmluZygoZmFpbHVyZSkgPT4gZmFpbHVyZS5zdGF0dXMsICdzdGF0dXMnLCA0MDQpLAogICAgICApLAogICAgKTsKICB9KTsKfQo=",
      "type": "text"
    },
    {
      "path": "test/core/rest/rest_test_server.dart",
      "data":
          "aW1wb3J0ICdkYXJ0OmNvbnZlcnQnOwppbXBvcnQgJ2RhcnQ6aW8nOwoKaW1wb3J0ICdwYWNrYWdlOmZsdXR0ZXJfdGVzdC9mbHV0dGVyX3Rlc3QuZGFydCc7CgovLy8gQSByZXF1ZXN0IHRoYXQgYSBbUmVzdFRlc3RTZXJ2ZXJdIGdvdC4KZmluYWwgY2xhc3MgUmVzdFRlc3RSZXF1ZXN0IHsKICAvLy8gQ3JlYXRlcyB0aGUgbm90ZSBvZiBhIHJlcXVlc3QuCiAgY29uc3QgUmVzdFRlc3RSZXF1ZXN0KHsKICAgIHJlcXVpcmVkIHRoaXMubWV0aG9kLAogICAgcmVxdWlyZWQgdGhpcy51cmksCiAgICByZXF1aXJlZCB0aGlzLmhlYWRlcnMsCiAgICByZXF1aXJlZCB0aGlzLmJ5dGVzLAogIH0pOwoKICAvLy8gVGhlIG1ldGhvZC4KICBmaW5hbCBTdHJpbmcgbWV0aG9kOwoKICAvLy8gVGhlIHBhdGggYW5kIHRoZSBxdWVyeS4KICBmaW5hbCBVcmkgdXJpOwoKICAvLy8gVGhlIGhlYWRlcnMsIGVhY2ggbmFtZSBpbiBsb3dlciBjYXNlLgogIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyczsKCiAgLy8vIFRoZSBib2R5LgogIGZpbmFsIExpc3Q8aW50PiBieXRlczsKCiAgLy8vIFRoZSBib2R5IGFzIFVURi04LgogIFN0cmluZyBnZXQgYm9keSA9PiB1dGY4LmRlY29kZShieXRlcyk7Cn0KCi8vLyBBIGxvY2FsIHNlcnZlciBmb3IgdGhlIHRlc3RzIG9mIHRoZSBhcHAsIGZvciBjb2RlIHRoYXQgbWFrZXMgcmVxdWVzdHMKLy8vIHRocm91Z2ggYGFwcFJlc3RgLgovLy8KLy8vIGBmbHV0dGVyIHRlc3RgIGhhcyB0d28gdHJhcHMgZm9yIGEgcmVxdWVzdCwgYW5kIHRoaXMgc2VydmVyIGlzIHRoZSBhbnN3ZXIKLy8vIHRvIHRoZSBmaXJzdDoKLy8vIC0gVGhlIGJpbmRpbmcgb2YgdGhlIHRlc3RzIGdpdmVzIGV2ZXJ5IGBIdHRwQ2xpZW50YCBhIHN0YW5kLWluIHRoYXQgYW5zd2VycwovLy8gICA0MDAgdG8gZXZlcnl0aGluZywgd2hpY2ggd291bGQgcmVhY2ggdGhlIGNvZGUgYXMgdGhlIHJlYXNvbiBgcmVqZWN0ZWRgLgovLy8gICBbc3RhcnRdIHRha2VzIHRoZSBzdGFuZC1pbiBhd2F5LCBhbmQgdGhlIFtjbG9zZV0gb2YgdGhlIGxhc3Qgc2VydmVyIHRoYXQKLy8vICAgaXMgb3BlbiBwdXRzIGl0IGJhY2suCi8vLyAtIEluc2lkZSBgdGVzdFdpZGdldHNgLCB0aGUgdGltZSBpcyBmYWtlLCBhbmQgYSByZWFsIHNvY2tldCBuZXZlciBjb21wbGV0ZXMKLy8vICAgdGhlcmUuIE1ha2UgdGhlIHJlcXVlc3QgaW4gYHRlc3Rlci5ydW5Bc3luY2AsIGFuZCBsZXQgaXQgZW5kIGJlZm9yZSB0aGUKLy8vICAgdGVzdCBkb2VzLCBzaW5jZSB0aGUgdGltZXIgb2YgYSByZXF1ZXN0IHRoYXQgaXMgc3RpbGwgcnVubmluZyBmYWlscyB0aGUKLy8vICAgdGVzdC4gQSBwbGFpbiBgdGVzdCgpYCBydW5zIGluIHJlYWwgdGltZSBhbmQgbmVlZHMgbm90aGluZy4KLy8vCi8vLyBGaWxlcyBvZiB0ZXN0cyBydW4gYXQgb25jZSwgc28gYSBzZXJ2ZXIgdGFrZXMgYSBmcmVlIHBvcnQ6IGdpdmUgdGhlIGNsaWVudAovLy8gW2FkZHJlc3NdLgpmaW5hbCBjbGFzcyBSZXN0VGVzdFNlcnZlciB7CiAgUmVzdFRlc3RTZXJ2ZXIuXyh0aGlzLl9zZXJ2ZXIpIHsKICAgIF9zZXJ2ZXIubGlzdGVuKF9zZXJ2ZSwgb25FcnJvcjogZXJyb3JzLmFkZCk7CiAgfQoKICAvLy8gU3RhcnRzIGEgc2VydmVyIG9uIGEgZnJlZSBwb3J0IG9mIHRoaXMgbWFjaGluZS4KICBzdGF0aWMgRnV0dXJlPFJlc3RUZXN0U2VydmVyPiBzdGFydCgpIGFzeW5jIHsKICAgIFRlc3RXaWRnZXRzRmx1dHRlckJpbmRpbmcuZW5zdXJlSW5pdGlhbGl6ZWQoKTsKICAgIGZpbmFsIHNlcnZlciA9IGF3YWl0IEh0dHBTZXJ2ZXIuYmluZChJbnRlcm5ldEFkZHJlc3MubG9vcGJhY2tJUHY0LCAwKTsKICAgIGlmIChfb3BlbisrID09IDApIHsKICAgICAgX292ZXJyaWRlcyA9IEh0dHBPdmVycmlkZXMuY3VycmVudDsKICAgICAgSHR0cE92ZXJyaWRlcy5nbG9iYWwgPSBudWxsOwogICAgfQogICAgcmV0dXJuIFJlc3RUZXN0U2VydmVyLl8oc2VydmVyKTsKICB9CgogIC8vLyBIb3cgbWFueSBzZXJ2ZXJzIGFyZSBvcGVuOiB0aGUgc3RhbmQtaW4gY29tZXMgYmFjayB3aXRoIHRoZSBsYXN0IGNsb3NlLgogIHN0YXRpYyBpbnQgX29wZW4gPSAwOwoKICAvLy8gV2hhdCBbc3RhcnRdIHRvb2sgYXdheS4KICBzdGF0aWMgSHR0cE92ZXJyaWRlcz8gX292ZXJyaWRlczsKCiAgZmluYWwgSHR0cFNlcnZlciBfc2VydmVyOwogIGJvb2wgX2Nsb3NlZCA9IGZhbHNlOwogIGZpbmFsIE1hcDxTdHJpbmcsIEZ1dHVyZTx2b2lkPiBGdW5jdGlvbihIdHRwUmVxdWVzdCByZXF1ZXN0KT4gX2Fuc3dlcnMgPSB7fTsKCiAgLy8vIFRoZSByZXF1ZXN0cyB0aGF0IHRoZSBzZXJ2ZXIgZ290IGluIGZ1bGwsIGluIG9yZGVyLgogIGZpbmFsIExpc3Q8UmVzdFRlc3RSZXF1ZXN0PiByZXF1ZXN0cyA9IFtdOwoKICAvLy8gV2hhdCB3ZW50IHdyb25nIHdpdGggYSByZXF1ZXN0LCBzdWNoIGFzIGEgY2xpZW50IHRoYXQgbGVmdCBkdXJpbmcgaXRzCiAgLy8vIHVwbG9hZCwgd2hpY2ggaXMgd2hhdCBhIGNhbmNlbCBkb2VzLgogIGZpbmFsIExpc3Q8T2JqZWN0PiBlcnJvcnMgPSBbXTsKCiAgLy8vIFRoZSBhZGRyZXNzIG9mIHRoZSBzZXJ2ZXIuCiAgU3RyaW5nIGdldCBhZGRyZXNzID0+ICdodHRwOi8vJHtfc2VydmVyLmFkZHJlc3MuYWRkcmVzc306JHtfc2VydmVyLnBvcnR9JzsKCiAgLy8vIEFuc3dlcnMgYSByZXF1ZXN0IG9mIFttZXRob2RdIGZvciBbcGF0aF0gd2l0aCBbaGFuZGxlcl0sIHdoaWNoIGNsb3NlcyB0aGUKICAvLy8gcmVzcG9uc2UuIEFueSBvdGhlciByZXF1ZXN0IGdldHMgYSA0MDQuCiAgdm9pZCBhbnN3ZXIoCiAgICBTdHJpbmcgbWV0aG9kLAogICAgU3RyaW5nIHBhdGgsCiAgICBGdXR1cmU8dm9pZD4gRnVuY3Rpb24oSHR0cFJlcXVlc3QgcmVxdWVzdCkgaGFuZGxlciwKICApID0+CiAgICAgIF9hbnN3ZXJzWyckbWV0aG9kICRwYXRoJ10gPSBoYW5kbGVyOwoKICAvLy8gQW5zd2VycyBhIHJlcXVlc3Qgb2YgW21ldGhvZF0gZm9yIFtwYXRoXSB3aXRoIFt2YWx1ZV0gYXMgSlNPTi4KICB2b2lkIGFuc3dlckpzb24oCiAgICBTdHJpbmcgbWV0aG9kLAogICAgU3RyaW5nIHBhdGgsCiAgICBPYmplY3Q/IHZhbHVlLCB7CiAgICBpbnQgc3RhdHVzID0gMjAwLAogIH0pID0+CiAgICAgIGFuc3dlcihtZXRob2QsIHBhdGgsIChyZXF1ZXN0KSBhc3luYyB7CiAgICAgICAgcmVxdWVzdC5yZXNwb25zZQogICAgICAgICAgLi5zdGF0dXNDb2RlID0gc3RhdHVzCiAgICAgICAgICAuLmhlYWRlcnMuY29udGVudFR5cGUgPSBDb250ZW50VHlwZS5qc29uCiAgICAgICAgICAuLndyaXRlKGpzb25FbmNvZGUodmFsdWUpKTsKICAgICAgICBhd2FpdCByZXF1ZXN0LnJlc3BvbnNlLmNsb3NlKCk7CiAgICAgIH0pOwoKICAvLy8gU3RvcHMgdGhlIHNlcnZlci4gVGhlIGxhc3Qgc2VydmVyIHRoYXQgaXMgb3BlbiBwdXRzIGJhY2sgd2hhdCBbc3RhcnRdCiAgLy8vIHRvb2sgYXdheS4KICBGdXR1cmU8dm9pZD4gY2xvc2UoKSBhc3luYyB7CiAgICBpZiAoX2Nsb3NlZCkgcmV0dXJuOwogICAgX2Nsb3NlZCA9IHRydWU7CiAgICBhd2FpdCBfc2VydmVyLmNsb3NlKGZvcmNlOiB0cnVlKTsKICAgIGlmICgtLV9vcGVuID09IDApIEh0dHBPdmVycmlkZXMuZ2xvYmFsID0gX292ZXJyaWRlczsKICB9CgogIEZ1dHVyZTx2b2lkPiBfc2VydmUoSHR0cFJlcXVlc3QgcmVxdWVzdCkgYXN5bmMgewogICAgdHJ5IHsKICAgICAgYXdhaXQgX2Fuc3dlcihyZXF1ZXN0KTsKICAgIH0gb24gSU9FeGNlcHRpb24gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGVycm9ycy5hZGQoZXJyb3IpOwogICAgfQogIH0KCiAgRnV0dXJlPHZvaWQ+IF9hbnN3ZXIoSHR0cFJlcXVlc3QgcmVxdWVzdCkgYXN5bmMgewogICAgZmluYWwgYnl0ZXMgPSBhd2FpdCByZXF1ZXN0LmZvbGQ8TGlzdDxpbnQ+PigKICAgICAgW10sCiAgICAgIChhbGwsIHBhcnQpID0+IGFsbC4uYWRkQWxsKHBhcnQpLAogICAgKTsKICAgIGZpbmFsIGhlYWRlcnMgPSA8U3RyaW5nLCBTdHJpbmc+e307CiAgICByZXF1ZXN0LmhlYWRlcnMuZm9yRWFjaCgKICAgICAgKG5hbWUsIHZhbHVlcykgPT4gaGVhZGVyc1tuYW1lXSA9IHZhbHVlcy5qb2luKCcsICcpLAogICAgKTsKICAgIHJlcXVlc3RzLmFkZCgKICAgICAgUmVzdFRlc3RSZXF1ZXN0KAogICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsCiAgICAgICAgdXJpOiByZXF1ZXN0LnVyaSwKICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLAogICAgICAgIGJ5dGVzOiBieXRlcywKICAgICAgKSwKICAgICk7CiAgICBmaW5hbCBhbnN3ZXIgPSBfYW5zd2Vyc1snJHtyZXF1ZXN0Lm1ldGhvZH0gJHtyZXF1ZXN0LnVyaS5wYXRofSddOwogICAgaWYgKGFuc3dlciAhPSBudWxsKSByZXR1cm4gYW5zd2VyKHJlcXVlc3QpOwogICAgcmVxdWVzdC5yZXNwb25zZS5zdGF0dXNDb2RlID0gSHR0cFN0YXR1cy5ub3RGb3VuZDsKICAgIGF3YWl0IHJlcXVlc3QucmVzcG9uc2UuY2xvc2UoKTsKICB9Cn0K",
      "type": "text"
    }
  ],
  "hooks": [],
  "name": "rest_role",
  "description":
      "The template of the REST role of SMF: the client of the app, the transport that a provider implements, and a local server for the tests of the app.",
  "version": "0.1.0+1",
  "environment": {"mason": "^0.1.1"},
  "vars": {}
});