templates.swift 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. /*
  2. *
  3. * Copyright 2017, Google Inc.
  4. * All rights reserved.
  5. *
  6. * Redistribution and use in source and binary forms, with or without
  7. * modification, are permitted provided that the following conditions are
  8. * met:
  9. *
  10. * * Redistributions of source code must retain the above copyright
  11. * notice, this list of conditions and the following disclaimer.
  12. * * Redistributions in binary form must reproduce the above
  13. * copyright notice, this list of conditions and the following disclaimer
  14. * in the documentation and/or other materials provided with the
  15. * distribution.
  16. * * Neither the name of Google Inc. nor the names of its
  17. * contributors may be used to endorse or promote products derived from
  18. * this software without specific prior written permission.
  19. *
  20. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  21. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  22. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  23. * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  24. * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  25. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  26. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  27. * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  28. * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  29. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  30. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  31. *
  32. */
  33. // GENERATED: DO NOT EDIT
  34. //
  35. // This file contains base64 encodings of templates used for Swift GRPC code generation.
  36. //
  37. func loadTemplates() -> [String:String] {
  38. var templates : [String:String] = [:]
  39. templates["client-call-bidistreaming.swift"] = "Ly8vIHt7IG1ldGhvZC5uYW1lIH19IChCaWRpcmVjdGlvbmFsIFN0cmVhbWluZykKcHVibGljIGNsYXNzIHt7IC58Y2FsbDpwcm90b0ZpbGUsc2VydmljZSxtZXRob2QgfX0gewogIHByaXZhdGUgdmFyIGNhbGwgOiBDYWxsCgogIC8vLyBDcmVhdGUgYSBjYWxsLgogIGZpbGVwcml2YXRlIGluaXQoXyBjaGFubmVsOiBDaGFubmVsKSB7CiAgICBzZWxmLmNhbGwgPSBjaGFubmVsLm1ha2VDYWxsKCJ7eyAufHBhdGg6cHJvdG9GaWxlLHNlcnZpY2UsbWV0aG9kIH19IikKICB9CgogIC8vLyBDYWxsIHRoaXMgdG8gc3RhcnQgYSBjYWxsLiBOb25ibG9ja2luZy4KICBmaWxlcHJpdmF0ZSBmdW5jIHN0YXJ0KG1ldGFkYXRhOk1ldGFkYXRhLCBjb21wbGV0aW9uOkBlc2NhcGluZyAoQ2FsbFJlc3VsdCktPigpKQogICAgdGhyb3dzIC0+IHt7IC58Y2FsbDpwcm90b0ZpbGUsc2VydmljZSxtZXRob2QgfX0gewogICAgICB0cnkgc2VsZi5jYWxsLnN0YXJ0KC5iaWRpU3RyZWFtaW5nLCBtZXRhZGF0YTptZXRhZGF0YSwgY29tcGxldGlvbjpjb21wbGV0aW9uKQogICAgICByZXR1cm4gc2VsZgogIH0KCiAgLy8vIENhbGwgdGhpcyB0byB3YWl0IGZvciBhIHJlc3VsdC4gQmxvY2tzLgogIHB1YmxpYyBmdW5jIHJlY2VpdmUoKSB0aHJvd3MgLT4ge3sgbWV0aG9kfG91dHB1dCB9fSB7CiAgICB2YXIgcmV0dXJuRXJyb3IgOiB7eyAufGNsaWVudGVycm9yOnByb3RvRmlsZSxzZXJ2aWNlIH19PwogICAgdmFyIHJldHVybk1lc3NhZ2UgOiB7eyBtZXRob2R8b3V0cHV0IH19IQogICAgbGV0IHNlbSA9IERpc3BhdGNoU2VtYXBob3JlKHZhbHVlOiAwKQogICAgZG8gewogICAgICB0cnkgY2FsbC5yZWNlaXZlTWVzc2FnZSgpIHsoZGF0YSkgaW4KICAgICAgICBpZiBsZXQgZGF0YSA9IGRhdGEgewogICAgICAgICAgcmV0dXJuTWVzc2FnZSA9IHRyeT8ge3sgbWV0aG9kfG91dHB1dCB9fShwcm90b2J1ZjpkYXRhKQogICAgICAgICAgaWYgcmV0dXJuTWVzc2FnZSA9PSBuaWwgewogICAgICAgICAgICByZXR1cm5FcnJvciA9IHt7IC58Y2xpZW50ZXJyb3I6cHJvdG9GaWxlLHNlcnZpY2UgfX0uaW52YWxpZE1lc3NhZ2VSZWNlaXZlZAogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm5FcnJvciA9IHt7IC58Y2xpZW50ZXJyb3I6cHJvdG9GaWxlLHNlcnZpY2UgfX0uZW5kT2ZTdHJlYW0KICAgICAgICB9CiAgICAgICAgc2VtLnNpZ25hbCgpCiAgICAgIH0KICAgICAgXyA9IHNlbS53YWl0KHRpbWVvdXQ6IERpc3BhdGNoVGltZS5kaXN0YW50RnV0dXJlKQogICAgfQogICAgaWYgbGV0IHJldHVybkVycm9yID0gcmV0dXJuRXJyb3IgewogICAgICB0aHJvdyByZXR1cm5FcnJvcgogICAgfQogICAgcmV0dXJuIHJldHVybk1lc3NhZ2UKICB9CgogIC8vLyBDYWxsIHRoaXMgdG8gd2FpdCBmb3IgYSByZXN1bHQuIE5vbmJsb2NraW5nLgogIHB1YmxpYyBmdW5jIHJlY2VpdmUoY29tcGxldGlvbjpAZXNjYXBpbmcgKHt7IG1ldGhvZHxvdXRwdXQgfX0/LCB7eyAufGNsaWVudGVycm9yOnByb3RvRmlsZSxzZXJ2aWNlIH19PyktPigpKSB0aHJvd3MgewogICAgZG8gewogICAgICB0cnkgY2FsbC5yZWNlaXZlTWVzc2FnZSgpIHsoZGF0YSkgaW4KICAgICAgICBpZiBsZXQgZGF0YSA9IGRhdGEgewogICAgICAgICAgaWYgbGV0IHJldHVybk1lc3NhZ2UgPSB0cnk/IHt7IG1ldGhvZHxvdXRwdXQgfX0ocHJvdG9idWY6ZGF0YSkgewogICAgICAgICAgICBjb21wbGV0aW9uKHJldHVybk1lc3NhZ2UsIG5pbCkKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbXBsZXRpb24obmlsLCB7eyAufGNsaWVudGVycm9yOnByb3RvRmlsZSxzZXJ2aWNlIH19LmludmFsaWRNZXNzYWdlUmVjZWl2ZWQpCiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbXBsZXRpb24obmlsLCB7eyAufGNsaWVudGVycm9yOnByb3RvRmlsZSxzZXJ2aWNlIH19LmVuZE9mU3RyZWFtKQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgLy8vIENhbGwgdGhpcyB0byBzZW5kIGVhY2ggbWVzc2FnZSBpbiB0aGUgcmVxdWVzdCBzdHJlYW0uCiAgcHVibGljIGZ1bmMgc2VuZChfIG1lc3NhZ2U6e3sgbWV0aG9kfGlucHV0IH19KSB0aHJvd3MgewogICAgbGV0IG1lc3NhZ2VEYXRhID0gdHJ5IG1lc3NhZ2Uuc2VyaWFsaXplUHJvdG9idWYoKQogICAgdHJ5IGNhbGwuc2VuZE1lc3NhZ2UoZGF0YTptZXNzYWdlRGF0YSkKICB9CgogIC8vLyBDYWxsIHRoaXMgdG8gY2xvc2UgdGhlIHNlbmRpbmcgY29ubmVjdGlvbi4gQmxvY2tpbmcKICBwdWJsaWMgZnVuYyBjbG9zZVNlbmQoKSB0aHJvd3MgewogICAgbGV0IHNlbSA9IERpc3BhdGNoU2VtYXBob3JlKHZhbHVlOiAwKQogICAgdHJ5IGNhbGwuY2xvc2UoKSB7CiAgICAgIHNlbS5zaWduYWwoKQogICAgfQogICAgXyA9IHNlbS53YWl0KHRpbWVvdXQ6IERpc3BhdGNoVGltZS5kaXN0YW50RnV0dXJlKQogIH0KCiAgLy8vIENhbGwgdGhpcyB0byBjbG9zZSB0aGUgc2VuZGluZyBjb25uZWN0aW9uLiBOb25ibG9ja2luZwogIHB1YmxpYyBmdW5jIGNsb3NlU2VuZChjb21wbGV0aW9uOkBlc2NhcGluZyAoKS0+KCkpIHRocm93cyB7CiAgICB0cnkgY2FsbC5jbG9zZSgpIHsKICAgICAgY29tcGxldGlvbigpCiAgICB9CiAgfQp9"
  40. templates["client-call-clientstreaming.swift"] = "Ly8vIHt7IG1ldGhvZC5uYW1lIH19IChDbGllbnQgU3RyZWFtaW5nKQpwdWJsaWMgY2xhc3Mge3sgLnxjYWxsOnByb3RvRmlsZSxzZXJ2aWNlLG1ldGhvZCB9fSB7CiAgcHJpdmF0ZSB2YXIgY2FsbCA6IENhbGwKCiAgLy8vIENyZWF0ZSBhIGNhbGwuCiAgZmlsZXByaXZhdGUgaW5pdChfIGNoYW5uZWw6IENoYW5uZWwpIHsKICAgIHNlbGYuY2FsbCA9IGNoYW5uZWwubWFrZUNhbGwoInt7IC58cGF0aDpwcm90b0ZpbGUsc2VydmljZSxtZXRob2QgfX0iKQogIH0KCiAgLy8vIENhbGwgdGhpcyB0byBzdGFydCBhIGNhbGwuCiAgZmlsZXByaXZhdGUgZnVuYyBzdGFydChtZXRhZGF0YTpNZXRhZGF0YSwgY29tcGxldGlvbjpAZXNjYXBpbmcgKENhbGxSZXN1bHQpLT4oKSkKICAgIHRocm93cyAtPiB7eyAufGNhbGw6cHJvdG9GaWxlLHNlcnZpY2UsbWV0aG9kIH19IHsKICAgICAgdHJ5IHNlbGYuY2FsbC5zdGFydCguY2xpZW50U3RyZWFtaW5nLCBtZXRhZGF0YTptZXRhZGF0YSwgY29tcGxldGlvbjpjb21wbGV0aW9uKQogICAgICByZXR1cm4gc2VsZgogIH0KCiAgLy8vIENhbGwgdGhpcyB0byBzZW5kIGVhY2ggbWVzc2FnZSBpbiB0aGUgcmVxdWVzdCBzdHJlYW0uCiAgcHVibGljIGZ1bmMgc2VuZChfIG1lc3NhZ2U6IHt7IG1ldGhvZHxpbnB1dCB9fSkgdGhyb3dzIHsKICAgIGxldCBtZXNzYWdlRGF0YSA9IHRyeSBtZXNzYWdlLnNlcmlhbGl6ZVByb3RvYnVmKCkKICAgIHRyeSBjYWxsLnNlbmRNZXNzYWdlKGRhdGE6bWVzc2FnZURhdGEpCiAgfQoKICAvLy8gQ2FsbCB0aGlzIHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uIGFuZCB3YWl0IGZvciBhIHJlc3BvbnNlLiBCbG9ja2luZy4KICBwdWJsaWMgZnVuYyBjbG9zZUFuZFJlY2VpdmUoKSB0aHJvd3MgLT4ge3sgbWV0aG9kfG91dHB1dCB9fSB7CiAgICB2YXIgcmV0dXJuRXJyb3IgOiB7eyAufGNsaWVudGVycm9yOnByb3RvRmlsZSxzZXJ2aWNlIH19PwogICAgdmFyIHJldHVyblJlc3BvbnNlIDoge3sgbWV0aG9kfG91dHB1dCB9fSEKICAgIGxldCBzZW0gPSBEaXNwYXRjaFNlbWFwaG9yZSh2YWx1ZTogMCkKICAgIGRvIHsKICAgICAgdHJ5IGNhbGwucmVjZWl2ZU1lc3NhZ2UoKSB7KHJlc3BvbnNlRGF0YSkgaW4KICAgICAgICBpZiBsZXQgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2VEYXRhLAogICAgICAgICAgbGV0IHJlc3BvbnNlID0gdHJ5PyB7eyBtZXRob2R8b3V0cHV0IH19KHByb3RvYnVmOnJlc3BvbnNlRGF0YSkgewogICAgICAgICAgcmV0dXJuUmVzcG9uc2UgPSByZXNwb25zZQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm5FcnJvciA9IHt7IC58Y2xpZW50ZXJyb3I6cHJvdG9GaWxlLHNlcnZpY2UgfX0uaW52YWxpZE1lc3NhZ2VSZWNlaXZlZAogICAgICAgIH0KICAgICAgICBzZW0uc2lnbmFsKCkKICAgICAgfQogICAgICB0cnkgY2FsbC5jbG9zZShjb21wbGV0aW9uOnt9KQogICAgICBfID0gc2VtLndhaXQodGltZW91dDogRGlzcGF0Y2hUaW1lLmRpc3RhbnRGdXR1cmUpCiAgICB9IGNhdGNoIChsZXQgZXJyb3IpIHsKICAgICAgdGhyb3cgZXJyb3IKICAgIH0KICAgIGlmIGxldCByZXR1cm5FcnJvciA9IHJldHVybkVycm9yIHsKICAgICAgdGhyb3cgcmV0dXJuRXJyb3IKICAgIH0KICAgIHJldHVybiByZXR1cm5SZXNwb25zZQogIH0KCiAgLy8vIENhbGwgdGhpcyB0byBjbG9zZSB0aGUgY29ubmVjdGlvbiBhbmQgd2FpdCBmb3IgYSByZXNwb25zZS4gTm9uYmxvY2tpbmcuCiAgcHVibGljIGZ1bmMgY2xvc2VBbmRSZWNlaXZlKGNvbXBsZXRpb246QGVzY2FwaW5nICh7eyBtZXRob2R8b3V0cHV0IH19Pywge3sgLnxjbGllbnRlcnJvcjpwcm90b0ZpbGUsc2VydmljZSB9fT8pLT4oKSkKICAgIHRocm93cyB7CiAgICAgIGRvIHsKICAgICAgICB0cnkgY2FsbC5yZWNlaXZlTWVzc2FnZSgpIHsocmVzcG9uc2VEYXRhKSBpbgogICAgICAgICAgaWYgbGV0IHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlRGF0YSwKICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gdHJ5PyB7eyBtZXRob2R8b3V0cHV0IH19KHByb3RvYnVmOnJlc3BvbnNlRGF0YSkgewogICAgICAgICAgICBjb21wbGV0aW9uKHJlc3BvbnNlLCBuaWwpCiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb21wbGV0aW9uKG5pbCwge3sgLnxjbGllbnRlcnJvcjpwcm90b0ZpbGUsc2VydmljZSB9fS5pbnZhbGlkTWVzc2FnZVJlY2VpdmVkKQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0cnkgY2FsbC5jbG9zZShjb21wbGV0aW9uOnt9KQogICAgICB9IGNhdGNoIChsZXQgZXJyb3IpIHsKICAgICAgICB0aHJvdyBlcnJvcgogICAgICB9CiAgfQp9Cg=="
  41. templates["client-call-serverstreaming.swift"] = "Ly8vIHt7IG1ldGhvZC5uYW1lIH19IChTZXJ2ZXIgU3RyZWFtaW5nKQpwdWJsaWMgY2xhc3Mge3sgLnxjYWxsOnByb3RvRmlsZSxzZXJ2aWNlLG1ldGhvZCB9fSB7CiAgcHJpdmF0ZSB2YXIgY2FsbCA6IENhbGwKCiAgLy8vIENyZWF0ZSBhIGNhbGwuCiAgZmlsZXByaXZhdGUgaW5pdChfIGNoYW5uZWw6IENoYW5uZWwpIHsKICAgIHNlbGYuY2FsbCA9IGNoYW5uZWwubWFrZUNhbGwoInt7IC58cGF0aDpwcm90b0ZpbGUsc2VydmljZSxtZXRob2QgfX0iKQogIH0KCiAgLy8vIENhbGwgdGhpcyBvbmNlIHdpdGggdGhlIG1lc3NhZ2UgdG8gc2VuZC4KICBmaWxlcHJpdmF0ZSBmdW5jIHN0YXJ0KHJlcXVlc3Q6IHt7IG1ldGhvZHxpbnB1dCB9fSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBNZXRhZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb246IEBlc2NhcGluZyAoQ2FsbFJlc3VsdCkgLT4gKCkpCiAgICB0aHJvd3MgLT4ge3sgLnxjYWxsOnByb3RvRmlsZSxzZXJ2aWNlLG1ldGhvZCB9fSB7CiAgICAgIGxldCByZXF1ZXN0RGF0YSA9IHRyeSByZXF1ZXN0LnNlcmlhbGl6ZVByb3RvYnVmKCkKICAgICAgdHJ5IGNhbGwuc3RhcnQoLnNlcnZlclN0cmVhbWluZywKICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6bWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6cmVxdWVzdERhdGEsCiAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb246Y29tcGxldGlvbikKICAgICAgcmV0dXJuIHNlbGYKICB9CgogIC8vLyBDYWxsIHRoaXMgdG8gd2FpdCBmb3IgYSByZXN1bHQuIEJsb2NraW5nLgogIHB1YmxpYyBmdW5jIHJlY2VpdmUoKSB0aHJvd3MgLT4ge3sgbWV0aG9kfG91dHB1dCB9fSB7CiAgICB2YXIgcmV0dXJuRXJyb3IgOiB7eyAufGNsaWVudGVycm9yOnByb3RvRmlsZSxzZXJ2aWNlIH19PwogICAgdmFyIHJlc3BvbnNlIDoge3sgbWV0aG9kfG91dHB1dCB9fSEKICAgIGxldCBzZW0gPSBEaXNwYXRjaFNlbWFwaG9yZSh2YWx1ZTogMCkKICAgIGRvIHsKICAgICAgdHJ5IGNhbGwucmVjZWl2ZU1lc3NhZ2UoKSB7KHJlc3BvbnNlRGF0YSkgaW4KICAgICAgICBpZiBsZXQgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2VEYXRhIHsKICAgICAgICAgIHJlc3BvbnNlID0gdHJ5PyB7eyBtZXRob2R8b3V0cHV0IH19KHByb3RvYnVmOnJlc3BvbnNlRGF0YSkKICAgICAgICAgIGlmIHJlc3BvbnNlID09IG5pbCB7CiAgICAgICAgICAgIHJldHVybkVycm9yID0ge3sgLnxjbGllbnRlcnJvcjpwcm90b0ZpbGUsc2VydmljZSB9fS5pbnZhbGlkTWVzc2FnZVJlY2VpdmVkCiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybkVycm9yID0ge3sgLnxjbGllbnRlcnJvcjpwcm90b0ZpbGUsc2VydmljZSB9fS5lbmRPZlN0cmVhbQogICAgICAgIH0KICAgICAgICBzZW0uc2lnbmFsKCkKICAgICAgfQogICAgICBfID0gc2VtLndhaXQodGltZW91dDogRGlzcGF0Y2hUaW1lLmRpc3RhbnRGdXR1cmUpCiAgICB9CiAgICBpZiBsZXQgcmV0dXJuRXJyb3IgPSByZXR1cm5FcnJvciB7CiAgICAgIHRocm93IHJldHVybkVycm9yCiAgICB9CiAgICByZXR1cm4gcmVzcG9uc2UKICB9CgogIC8vLyBDYWxsIHRoaXMgdG8gd2FpdCBmb3IgYSByZXN1bHQuIE5vbmJsb2NraW5nLgogIHB1YmxpYyBmdW5jIHJlY2VpdmUoY29tcGxldGlvbjpAZXNjYXBpbmcgKHt7IG1ldGhvZHxvdXRwdXQgfX0/LCB7eyAufGNsaWVudGVycm9yOnByb3RvRmlsZSxzZXJ2aWNlIH19PyktPigpKSB0aHJvd3MgewogICAgZG8gewogICAgICB0cnkgY2FsbC5yZWNlaXZlTWVzc2FnZSgpIHsocmVzcG9uc2VEYXRhKSBpbgogICAgICAgIGlmIGxldCByZXNwb25zZURhdGEgPSByZXNwb25zZURhdGEgewogICAgICAgICAgaWYgbGV0IHJlc3BvbnNlID0gdHJ5PyB7eyBtZXRob2R8b3V0cHV0IH19KHByb3RvYnVmOnJlc3BvbnNlRGF0YSkgewogICAgICAgICAgICBjb21wbGV0aW9uKHJlc3BvbnNlLCBuaWwpCiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb21wbGV0aW9uKG5pbCwge3sgLnxjbGllbnRlcnJvcjpwcm90b0ZpbGUsc2VydmljZSB9fS5pbnZhbGlkTWVzc2FnZVJlY2VpdmVkKQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb21wbGV0aW9uKG5pbCwge3sgLnxjbGllbnRlcnJvcjpwcm90b0ZpbGUsc2VydmljZSB9fS5lbmRPZlN0cmVhbSkKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn0K"
  42. templates["client-call-unary.swift"] = "Ly8vIHt7IG1ldGhvZC5uYW1lIH19IChVbmFyeSkKcHVibGljIGNsYXNzIHt7IC58Y2FsbDpwcm90b0ZpbGUsc2VydmljZSxtZXRob2QgfX0gewogIHByaXZhdGUgdmFyIGNhbGwgOiBDYWxsCgogIC8vLyBDcmVhdGUgYSBjYWxsLgogIGZpbGVwcml2YXRlIGluaXQoXyBjaGFubmVsOiBDaGFubmVsKSB7CiAgICBzZWxmLmNhbGwgPSBjaGFubmVsLm1ha2VDYWxsKCJ7eyAufHBhdGg6cHJvdG9GaWxlLHNlcnZpY2UsbWV0aG9kIH19IikKICB9CgogIC8vLyBSdW4gdGhlIGNhbGwuIEJsb2NrcyB1bnRpbCB0aGUgcmVwbHkgaXMgcmVjZWl2ZWQuCiAgZmlsZXByaXZhdGUgZnVuYyBydW4ocmVxdWVzdDoge3sgbWV0aG9kfGlucHV0IH19LAogICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBNZXRhZGF0YSkgdGhyb3dzIC0+IHt7IG1ldGhvZHxvdXRwdXQgfX0gewogICAgbGV0IHNlbSA9IERpc3BhdGNoU2VtYXBob3JlKHZhbHVlOiAwKQogICAgdmFyIGNhbGxSZXN1bHQgOiBDYWxsUmVzdWx0IQogICAgdmFyIHJlc3BvbnNlIDoge3sgbWV0aG9kfG91dHB1dCB9fT8KICAgIGxldCByZXF1ZXN0RGF0YSA9IHRyeSByZXF1ZXN0LnNlcmlhbGl6ZVByb3RvYnVmKCkKICAgIHRyeSBjYWxsLnN0YXJ0KC51bmFyeSwKICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOm1ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgbWVzc2FnZTpyZXF1ZXN0RGF0YSkKICAgIHsoX2NhbGxSZXN1bHQpIGluCiAgICAgIGNhbGxSZXN1bHQgPSBfY2FsbFJlc3VsdAogICAgICBpZiBsZXQgcmVzcG9uc2VEYXRhID0gY2FsbFJlc3VsdC5yZXN1bHREYXRhIHsKICAgICAgICByZXNwb25zZSA9IHRyeT8ge3sgbWV0aG9kfG91dHB1dCB9fShwcm90b2J1ZjpyZXNwb25zZURhdGEpCiAgICAgIH0KICAgICAgc2VtLnNpZ25hbCgpCiAgICB9CiAgICBfID0gc2VtLndhaXQodGltZW91dDogRGlzcGF0Y2hUaW1lLmRpc3RhbnRGdXR1cmUpCiAgICBpZiBsZXQgcmVzcG9uc2UgPSByZXNwb25zZSB7CiAgICAgIHJldHVybiByZXNwb25zZQogICAgfSBlbHNlIHsKICAgICAgdGhyb3cge3sgLnxjbGllbnRlcnJvcjpwcm90b0ZpbGUsc2VydmljZSB9fS5lcnJvcihjOiBjYWxsUmVzdWx0KQogICAgfQogIH0KCiAgLy8vIFN0YXJ0IHRoZSBjYWxsLiBOb25ibG9ja2luZy4KICBmaWxlcHJpdmF0ZSBmdW5jIHN0YXJ0KHJlcXVlc3Q6IHt7IG1ldGhvZHxpbnB1dCB9fSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBNZXRhZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb246IEBlc2NhcGluZyAoe3sgbWV0aG9kfG91dHB1dCB9fT8sIENhbGxSZXN1bHQpLT4oKSkKICAgIHRocm93cyAtPiB7eyAufGNhbGw6cHJvdG9GaWxlLHNlcnZpY2UsbWV0aG9kIH19IHsKCiAgICAgIGxldCByZXF1ZXN0RGF0YSA9IHRyeSByZXF1ZXN0LnNlcmlhbGl6ZVByb3RvYnVmKCkKICAgICAgdHJ5IGNhbGwuc3RhcnQoLnVuYXJ5LAogICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YTptZXRhZGF0YSwKICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTpyZXF1ZXN0RGF0YSkKICAgICAgeyhjYWxsUmVzdWx0KSBpbgogICAgICAgIGlmIGxldCByZXNwb25zZURhdGEgPSBjYWxsUmVzdWx0LnJlc3VsdERhdGEsCiAgICAgICAgICBsZXQgcmVzcG9uc2UgPSB0cnk/IHt7IG1ldGhvZHxvdXRwdXQgfX0ocHJvdG9idWY6cmVzcG9uc2VEYXRhKSB7CiAgICAgICAgICBjb21wbGV0aW9uKHJlc3BvbnNlLCBjYWxsUmVzdWx0KQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb21wbGV0aW9uKG5pbCwgY2FsbFJlc3VsdCkKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHNlbGYKICB9Cn0K"
  43. templates["client.pb.swift"] = "LyoKICogRE8gTk9UIEVESVQuCiAqCiAqIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLgogKiBTb3VyY2U6IHt7IHByb3RvRmlsZS5uYW1lIH19CiAqCiAqLwoKLyoKICoKICogQ29weXJpZ2h0IDIwMTcsIEdvb2dsZSBJbmMuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCiAqIG1ldDoKICoKICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCiAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQogKiBkaXN0cmlidXRpb24uCiAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwogKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAogKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCiAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQogKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQogKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogKgogKi8KCmltcG9ydCBGb3VuZGF0aW9uCmltcG9ydCBEaXNwYXRjaAppbXBvcnQgZ1JQQwovLy17JSBmb3Igc2VydmljZSBpbiBwcm90b0ZpbGUuc2VydmljZSAlfQoKLy8vIFR5cGUgZm9yIGVycm9ycyB0aHJvd24gZnJvbSBnZW5lcmF0ZWQgY2xpZW50IGNvZGUuCnB1YmxpYyBlbnVtIHt7IC58Y2xpZW50ZXJyb3I6cHJvdG9GaWxlLHNlcnZpY2UgfX0gOiBFcnJvciB7CiAgY2FzZSBlbmRPZlN0cmVhbQogIGNhc2UgaW52YWxpZE1lc3NhZ2VSZWNlaXZlZAogIGNhc2UgZXJyb3IoYzogQ2FsbFJlc3VsdCkKfQoKLy8teyUgZm9yIG1ldGhvZCBpbiBzZXJ2aWNlLm1ldGhvZCAlfQovLy17JSBpZiBub3QgbWV0aG9kLmNsaWVudFN0cmVhbWluZyBhbmQgbm90IG1ldGhvZC5zZXJ2ZXJTdHJlYW1pbmcgJX0KLy8teyUgaW5jbHVkZSAiY2xpZW50LWNhbGwtdW5hcnkuc3dpZnQiICV9Ci8vLXslIGVuZGlmICV9Ci8vLXslIGlmIG5vdCBtZXRob2QuY2xpZW50U3RyZWFtaW5nIGFuZCBtZXRob2Quc2VydmVyU3RyZWFtaW5nICV9Ci8vLXslIGluY2x1ZGUgImNsaWVudC1jYWxsLXNlcnZlcnN0cmVhbWluZy5zd2lmdCIgJX0KLy8teyUgZW5kaWYgJX0KLy8teyUgaWYgbWV0aG9kLmNsaWVudFN0cmVhbWluZyBhbmQgbm90IG1ldGhvZC5zZXJ2ZXJTdHJlYW1pbmcgJX0KLy8teyUgaW5jbHVkZSAiY2xpZW50LWNhbGwtY2xpZW50c3RyZWFtaW5nLnN3aWZ0IiAlfQovLy17JSBlbmRpZiAlfQovLy17JSBpZiBtZXRob2QuY2xpZW50U3RyZWFtaW5nIGFuZCBtZXRob2Quc2VydmVyU3RyZWFtaW5nICV9Ci8vLXslIGluY2x1ZGUgImNsaWVudC1jYWxsLWJpZGlzdHJlYW1pbmcuc3dpZnQiICV9Ci8vLXslIGVuZGlmICV9Ci8vLXslIGVuZGZvciAlfQoKLy8vIENhbGwgbWV0aG9kcyBvZiB0aGlzIGNsYXNzIHRvIG1ha2UgQVBJIGNhbGxzLgpwdWJsaWMgY2xhc3Mge3sgLnxzZXJ2aWNlY2xhc3M6cHJvdG9GaWxlLHNlcnZpY2UgfX0gewogIHByaXZhdGUgdmFyIGNoYW5uZWw6IENoYW5uZWwKCiAgLy8vIFRoaXMgbWV0YWRhdGEgd2lsbCBiZSBzZW50IHdpdGggYWxsIHJlcXVlc3RzLgogIHB1YmxpYyB2YXIgbWV0YWRhdGEgOiBNZXRhZGF0YQoKICAvLy8gVGhpcyBwcm9wZXJ0eSBhbGxvd3MgdGhlIHNlcnZpY2UgaG9zdCBuYW1lIHRvIGJlIG92ZXJyaWRkZW4uCiAgLy8vIEZvciBleGFtcGxlLCBpdCBjYW4gYmUgdXNlZCB0byBtYWtlIGNhbGxzIHRvICJsb2NhbGhvc3Q6ODA4MCIKICAvLy8gYXBwZWFyIHRvIGJlIHRvICJleGFtcGxlLmNvbSIuCiAgcHVibGljIHZhciBob3N0IDogU3RyaW5nIHsKICAgIGdldCB7CiAgICAgIHJldHVybiBzZWxmLmNoYW5uZWwuaG9zdAogICAgfQogICAgc2V0IHsKICAgICAgc2VsZi5jaGFubmVsLmhvc3QgPSBuZXdWYWx1ZQogICAgfQogIH0KCiAgLy8vIENyZWF0ZSBhIGNsaWVudCB0aGF0IG1ha2VzIGluc2VjdXJlIGNvbm5lY3Rpb25zLgogIHB1YmxpYyBpbml0KGFkZHJlc3M6IFN0cmluZykgewogICAgZ1JQQy5pbml0aWFsaXplKCkKICAgIGNoYW5uZWwgPSBDaGFubmVsKGFkZHJlc3M6YWRkcmVzcykKICAgIG1ldGFkYXRhID0gTWV0YWRhdGEoKQogIH0KCiAgLy8vIENyZWF0ZSBhIGNsaWVudCB0aGF0IG1ha2VzIHNlY3VyZSBjb25uZWN0aW9ucy4KICBwdWJsaWMgaW5pdChhZGRyZXNzOiBTdHJpbmcsIGNlcnRpZmljYXRlczogU3RyaW5nPywgaG9zdDogU3RyaW5nPykgewogICAgZ1JQQy5pbml0aWFsaXplKCkKICAgIGNoYW5uZWwgPSBDaGFubmVsKGFkZHJlc3M6YWRkcmVzcywgY2VydGlmaWNhdGVzOmNlcnRpZmljYXRlcywgaG9zdDpob3N0KQogICAgbWV0YWRhdGEgPSBNZXRhZGF0YSgpCiAgfQoKICAvLy17JSBmb3IgbWV0aG9kIGluIHNlcnZpY2UubWV0aG9kICV9CiAgLy8teyUgaWYgbm90IG1ldGhvZC5jbGllbnRTdHJlYW1pbmcgYW5kIG5vdCBtZXRob2Quc2VydmVyU3RyZWFtaW5nICV9CiAgLy8vIFN5bmNocm9ub3VzLiBVbmFyeS4KICBwdWJsaWMgZnVuYyB7eyBtZXRob2QubmFtZXxsb3dlcmNhc2UgfX0oXyByZXF1ZXN0OiB7eyBtZXRob2R8aW5wdXQgfX0pCiAgICB0aHJvd3MKICAgIC0+IHt7IG1ldGhvZHxvdXRwdXQgfX0gewogICAgICByZXR1cm4gdHJ5IHt7IC58Y2FsbDpwcm90b0ZpbGUsc2VydmljZSxtZXRob2QgfX0oY2hhbm5lbCkucnVuKHJlcXVlc3Q6cmVxdWVzdCwgbWV0YWRhdGE6bWV0YWRhdGEpCiAgfQogIC8vLyBBc3luY2hyb25vdXMuIFVuYXJ5LgogIHB1YmxpYyBmdW5jIHt7IG1ldGhvZC5uYW1lfGxvd2VyY2FzZSB9fShfIHJlcXVlc3Q6IHt7IG1ldGhvZHxpbnB1dCB9fSwKICAgICAgICAgICAgICAgICAgY29tcGxldGlvbjogQGVzY2FwaW5nICh7eyBtZXRob2R8b3V0cHV0IH19PywgQ2FsbFJlc3VsdCktPigpKQogICAgdGhyb3dzCiAgICAtPiB7eyAufGNhbGw6cHJvdG9GaWxlLHNlcnZpY2UsbWV0aG9kIH19IHsKICAgICAgcmV0dXJuIHRyeSB7eyAufGNhbGw6cHJvdG9GaWxlLHNlcnZpY2UsbWV0aG9kIH19KGNoYW5uZWwpLnN0YXJ0KHJlcXVlc3Q6cmVxdWVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOm1ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbjpjb21wbGV0aW9uKQogIH0KICAvLy17JSBlbmRpZiAlfQogIC8vLXslIGlmIG5vdCBtZXRob2QuY2xpZW50U3RyZWFtaW5nIGFuZCBtZXRob2Quc2VydmVyU3RyZWFtaW5nICV9CiAgLy8vIEFzeW5jaHJvbm91cy4gU2VydmVyLXN0cmVhbWluZy4KICAvLy8gU2VuZCB0aGUgaW5pdGlhbCBtZXNzYWdlLgogIC8vLyBVc2UgbWV0aG9kcyBvbiB0aGUgcmV0dXJuZWQgb2JqZWN0IHRvIGdldCBzdHJlYW1lZCByZXNwb25zZXMuCiAgcHVibGljIGZ1bmMge3sgbWV0aG9kLm5hbWV8bG93ZXJjYXNlIH19KF8gcmVxdWVzdDoge3sgbWV0aG9kfGlucHV0IH19LCBjb21wbGV0aW9uOiBAZXNjYXBpbmcgKENhbGxSZXN1bHQpLT4oKSkKICAgIHRocm93cwogICAgLT4ge3sgLnxjYWxsOnByb3RvRmlsZSxzZXJ2aWNlLG1ldGhvZCB9fSB7CiAgICAgIHJldHVybiB0cnkge3sgLnxjYWxsOnByb3RvRmlsZSxzZXJ2aWNlLG1ldGhvZCB9fShjaGFubmVsKS5zdGFydChyZXF1ZXN0OnJlcXVlc3QsIG1ldGFkYXRhOm1ldGFkYXRhLCBjb21wbGV0aW9uOmNvbXBsZXRpb24pCiAgfQogIC8vLXslIGVuZGlmICV9CiAgLy8teyUgaWYgbWV0aG9kLmNsaWVudFN0cmVhbWluZyBhbmQgbm90IG1ldGhvZC5zZXJ2ZXJTdHJlYW1pbmcgJX0KICAvLy8gQXN5bmNocm9ub3VzLiBDbGllbnQtc3RyZWFtaW5nLgogIC8vLyBVc2UgbWV0aG9kcyBvbiB0aGUgcmV0dXJuZWQgb2JqZWN0IHRvIHN0cmVhbSBtZXNzYWdlcyBhbmQKICAvLy8gdG8gY2xvc2UgdGhlIGNvbm5lY3Rpb24gYW5kIHdhaXQgZm9yIGEgZmluYWwgcmVzcG9uc2UuCiAgcHVibGljIGZ1bmMge3sgbWV0aG9kLm5hbWV8bG93ZXJjYXNlIH19KGNvbXBsZXRpb246IEBlc2NhcGluZyAoQ2FsbFJlc3VsdCktPigpKQogICAgdGhyb3dzCiAgICAtPiB7eyAufGNhbGw6cHJvdG9GaWxlLHNlcnZpY2UsbWV0aG9kIH19IHsKICAgICAgcmV0dXJuIHRyeSB7eyAufGNhbGw6cHJvdG9GaWxlLHNlcnZpY2UsbWV0aG9kIH19KGNoYW5uZWwpLnN0YXJ0KG1ldGFkYXRhOm1ldGFkYXRhLCBjb21wbGV0aW9uOmNvbXBsZXRpb24pCiAgfQogIC8vLXslIGVuZGlmICV9CiAgLy8teyUgaWYgbWV0aG9kLmNsaWVudFN0cmVhbWluZyBhbmQgbWV0aG9kLnNlcnZlclN0cmVhbWluZyAlfQogIC8vLyBBc3luY2hyb25vdXMuIEJpZGlyZWN0aW9uYWwtc3RyZWFtaW5nLgogIC8vLyBVc2UgbWV0aG9kcyBvbiB0aGUgcmV0dXJuZWQgb2JqZWN0IHRvIHN0cmVhbSBtZXNzYWdlcywKICAvLy8gdG8gd2FpdCBmb3IgcmVwbGllcywgYW5kIHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uLgogIHB1YmxpYyBmdW5jIHt7IG1ldGhvZC5uYW1lfGxvd2VyY2FzZSB9fShjb21wbGV0aW9uOiBAZXNjYXBpbmcgKENhbGxSZXN1bHQpLT4oKSkKICAgIHRocm93cwogICAgLT4ge3sgLnxjYWxsOnByb3RvRmlsZSxzZXJ2aWNlLG1ldGhvZCB9fSB7CiAgICAgIHJldHVybiB0cnkge3sgLnxjYWxsOnByb3RvRmlsZSxzZXJ2aWNlLG1ldGhvZCB9fShjaGFubmVsKS5zdGFydChtZXRhZGF0YTptZXRhZGF0YSwgY29tcGxldGlvbjpjb21wbGV0aW9uKQogIH0KICAvLy17JSBlbmRpZiAlfQogIC8vLXslIGVuZGZvciAlfQp9Ci8vLXslIGVuZGZvciAlfQo="
  44. templates["server-session-bidistreaming.swift"] = "Ly8ge3sgbWV0aG9kLm5hbWUgfX0gKEJpZGlyZWN0aW9uYWwgU3RyZWFtaW5nKQpwdWJsaWMgY2xhc3Mge3sgLnxzZXNzaW9uOnByb3RvRmlsZSxzZXJ2aWNlLG1ldGhvZCB9fSA6IHt7IC58c2VydmljZTpwcm90b0ZpbGUsc2VydmljZSB9fVNlc3Npb24gewogIHByaXZhdGUgdmFyIHByb3ZpZGVyIDoge3sgLnxwcm92aWRlcjpwcm90b0ZpbGUsc2VydmljZSB9fQoKICAvLy8gQ3JlYXRlIGEgc2Vzc2lvbi4KICBmaWxlcHJpdmF0ZSBpbml0KGhhbmRsZXI6Z1JQQy5IYW5kbGVyLCBwcm92aWRlcjoge3sgLnxwcm92aWRlcjpwcm90b0ZpbGUsc2VydmljZSB9fSkgewogICAgc2VsZi5wcm92aWRlciA9IHByb3ZpZGVyCiAgICBzdXBlci5pbml0KGhhbmRsZXI6aGFuZGxlcikKICB9CgogIC8vLyBSZWNlaXZlIGEgbWVzc2FnZS4gQmxvY2tzIHVudGlsIGEgbWVzc2FnZSBpcyByZWNlaXZlZCBvciB0aGUgY2xpZW50IGNsb3NlcyB0aGUgY29ubmVjdGlvbi4KICBwdWJsaWMgZnVuYyByZWNlaXZlKCkgdGhyb3dzIC0+IHt7IG1ldGhvZHxpbnB1dCB9fSB7CiAgICBsZXQgc2VtID0gRGlzcGF0Y2hTZW1hcGhvcmUodmFsdWU6IDApCiAgICB2YXIgcmVxdWVzdE1lc3NhZ2UgOiB7eyBtZXRob2R8aW5wdXQgfX0/CiAgICB0cnkgc2VsZi5oYW5kbGVyLnJlY2VpdmVNZXNzYWdlKCkgeyhyZXF1ZXN0RGF0YSkgaW4KICAgICAgaWYgbGV0IHJlcXVlc3REYXRhID0gcmVxdWVzdERhdGEgewogICAgICAgIGRvIHsKICAgICAgICAgIHJlcXVlc3RNZXNzYWdlID0gdHJ5IHt7IG1ldGhvZHxpbnB1dCB9fShwcm90b2J1ZjpyZXF1ZXN0RGF0YSkKICAgICAgICB9IGNhdGNoIChsZXQgZXJyb3IpIHsKICAgICAgICAgIHByaW50KCJlcnJvciBcKGVycm9yKSIpCiAgICAgICAgfQogICAgICB9CiAgICAgIHNlbS5zaWduYWwoKQogICAgfQogICAgXyA9IHNlbS53YWl0KHRpbWVvdXQ6IERpc3BhdGNoVGltZS5kaXN0YW50RnV0dXJlKQogICAgaWYgbGV0IHJlcXVlc3RNZXNzYWdlID0gcmVxdWVzdE1lc3NhZ2UgewogICAgICByZXR1cm4gcmVxdWVzdE1lc3NhZ2UKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IHt7IC58c2VydmVyZXJyb3I6cHJvdG9GaWxlLHNlcnZpY2UgfX0uZW5kT2ZTdHJlYW0KICAgIH0KICB9CgogIC8vLyBTZW5kIGEgbWVzc2FnZS4gTm9uYmxvY2tpbmcuCiAgcHVibGljIGZ1bmMgc2VuZChfIHJlc3BvbnNlOiB7eyBtZXRob2R8b3V0cHV0IH19KSB0aHJvd3MgewogICAgdHJ5IGhhbmRsZXIuc2VuZFJlc3BvbnNlKG1lc3NhZ2U6cmVzcG9uc2Uuc2VyaWFsaXplUHJvdG9idWYoKSkge30KICB9CgogIC8vLyBDbG9zZSBhIGNvbm5lY3Rpb24uIEJsb2NrcyB1bnRpbCB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQuCiAgcHVibGljIGZ1bmMgY2xvc2UoKSB0aHJvd3MgewogICAgbGV0IHNlbSA9IERpc3BhdGNoU2VtYXBob3JlKHZhbHVlOiAwKQogICAgdHJ5IHNlbGYuaGFuZGxlci5zZW5kU3RhdHVzKHN0YXR1c0NvZGU6c2VsZi5zdGF0dXNDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c01lc3NhZ2U6c2VsZi5zdGF0dXNNZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nTWV0YWRhdGE6c2VsZi50cmFpbGluZ01ldGFkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW0uc2lnbmFsKCkKICAgIH0KICAgIF8gPSBzZW0ud2FpdCh0aW1lb3V0OiBEaXNwYXRjaFRpbWUuZGlzdGFudEZ1dHVyZSkKICB9CgogIC8vLyBSdW4gdGhlIHNlc3Npb24uIEludGVybmFsLgogIGZpbGVwcml2YXRlIGZ1bmMgcnVuKHF1ZXVlOkRpc3BhdGNoUXVldWUpIHRocm93cyB7CiAgICB0cnkgc2VsZi5oYW5kbGVyLnNlbmRNZXRhZGF0YShpbml0aWFsTWV0YWRhdGE6aW5pdGlhbE1ldGFkYXRhKSB7CiAgICAgIHF1ZXVlLmFzeW5jIHsKICAgICAgICBkbyB7CiAgICAgICAgICB0cnkgc2VsZi5wcm92aWRlci57eyBtZXRob2QubmFtZXxsb3dlcmNhc2UgfX0oc2Vzc2lvbjpzZWxmKQogICAgICAgIH0gY2F0Y2ggKGxldCBlcnJvcikgewogICAgICAgICAgcHJpbnQoImVycm9yIFwoZXJyb3IpIikKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn0K"
  45. templates["server-session-clientstreaming.swift"] = "Ly8ge3sgbWV0aG9kLm5hbWUgfX0gKENsaWVudCBTdHJlYW1pbmcpCnB1YmxpYyBjbGFzcyB7eyAufHNlc3Npb246cHJvdG9GaWxlLHNlcnZpY2UsbWV0aG9kIH19IDoge3sgLnxzZXJ2aWNlOnByb3RvRmlsZSxzZXJ2aWNlIH19U2Vzc2lvbiB7CiAgcHJpdmF0ZSB2YXIgcHJvdmlkZXIgOiB7eyAufHByb3ZpZGVyOnByb3RvRmlsZSxzZXJ2aWNlIH19CgogIC8vLyBDcmVhdGUgYSBzZXNzaW9uLgogIGZpbGVwcml2YXRlIGluaXQoaGFuZGxlcjpnUlBDLkhhbmRsZXIsIHByb3ZpZGVyOiB7eyAufHByb3ZpZGVyOnByb3RvRmlsZSxzZXJ2aWNlIH19KSB7CiAgICBzZWxmLnByb3ZpZGVyID0gcHJvdmlkZXIKICAgIHN1cGVyLmluaXQoaGFuZGxlcjpoYW5kbGVyKQogIH0KCiAgLy8vIFJlY2VpdmUgYSBtZXNzYWdlLiBCbG9ja3MgdW50aWwgYSBtZXNzYWdlIGlzIHJlY2VpdmVkIG9yIHRoZSBjbGllbnQgY2xvc2VzIHRoZSBjb25uZWN0aW9uLgogIHB1YmxpYyBmdW5jIHJlY2VpdmUoKSB0aHJvd3MgLT4ge3sgbWV0aG9kfGlucHV0IH19IHsKICAgIGxldCBzZW0gPSBEaXNwYXRjaFNlbWFwaG9yZSh2YWx1ZTogMCkKICAgIHZhciByZXF1ZXN0TWVzc2FnZSA6IHt7IG1ldGhvZHxpbnB1dCB9fT8KICAgIHRyeSBzZWxmLmhhbmRsZXIucmVjZWl2ZU1lc3NhZ2UoKSB7KHJlcXVlc3REYXRhKSBpbgogICAgICBpZiBsZXQgcmVxdWVzdERhdGEgPSByZXF1ZXN0RGF0YSB7CiAgICAgICAgcmVxdWVzdE1lc3NhZ2UgPSB0cnk/IHt7IG1ldGhvZHxpbnB1dCB9fShwcm90b2J1ZjpyZXF1ZXN0RGF0YSkKICAgICAgfQogICAgICBzZW0uc2lnbmFsKCkKICAgIH0KICAgIF8gPSBzZW0ud2FpdCh0aW1lb3V0OiBEaXNwYXRjaFRpbWUuZGlzdGFudEZ1dHVyZSkKICAgIGlmIHJlcXVlc3RNZXNzYWdlID09IG5pbCB7CiAgICAgIHRocm93IHt7IC58c2VydmVyZXJyb3I6cHJvdG9GaWxlLHNlcnZpY2UgfX0uZW5kT2ZTdHJlYW0KICAgIH0KICAgIHJldHVybiByZXF1ZXN0TWVzc2FnZSEKICB9CgogIC8vLyBTZW5kIGEgcmVzcG9uc2UgYW5kIGNsb3NlIHRoZSBjb25uZWN0aW9uLgogIHB1YmxpYyBmdW5jIHNlbmRBbmRDbG9zZShfIHJlc3BvbnNlOiB7eyBtZXRob2R8b3V0cHV0IH19KSB0aHJvd3MgewogICAgdHJ5IHNlbGYuaGFuZGxlci5zZW5kUmVzcG9uc2UobWVzc2FnZTpyZXNwb25zZS5zZXJpYWxpemVQcm90b2J1ZigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzQ29kZTpzZWxmLnN0YXR1c0NvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNNZXNzYWdlOnNlbGYuc3RhdHVzTWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nTWV0YWRhdGE6c2VsZi50cmFpbGluZ01ldGFkYXRhKQogIH0KCiAgLy8vIFJ1biB0aGUgc2Vzc2lvbi4gSW50ZXJuYWwuCiAgZmlsZXByaXZhdGUgZnVuYyBydW4ocXVldWU6RGlzcGF0Y2hRdWV1ZSkgdGhyb3dzIHsKICAgIHRyeSBzZWxmLmhhbmRsZXIuc2VuZE1ldGFkYXRhKGluaXRpYWxNZXRhZGF0YTppbml0aWFsTWV0YWRhdGEpIHsKICAgICAgcXVldWUuYXN5bmMgewogICAgICAgIGRvIHsKICAgICAgICAgIHRyeSBzZWxmLnByb3ZpZGVyLnt7IG1ldGhvZC5uYW1lfGxvd2VyY2FzZSB9fShzZXNzaW9uOnNlbGYpCiAgICAgICAgfSBjYXRjaCAobGV0IGVycm9yKSB7CiAgICAgICAgICBwcmludCgiZXJyb3IgXChlcnJvcikiKQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQo="
  46. templates["server-session-serverstreaming.swift"] = "Ly8ge3sgbWV0aG9kLm5hbWUgfX0gKFNlcnZlciBTdHJlYW1pbmcpCnB1YmxpYyBjbGFzcyB7eyAufHNlc3Npb246cHJvdG9GaWxlLHNlcnZpY2UsbWV0aG9kIH19IDoge3sgLnxzZXJ2aWNlOnByb3RvRmlsZSxzZXJ2aWNlIH19U2Vzc2lvbiB7CiAgcHJpdmF0ZSB2YXIgcHJvdmlkZXIgOiB7eyAufHByb3ZpZGVyOnByb3RvRmlsZSxzZXJ2aWNlIH19CgogIC8vLyBDcmVhdGUgYSBzZXNzaW9uLgogIGZpbGVwcml2YXRlIGluaXQoaGFuZGxlcjpnUlBDLkhhbmRsZXIsIHByb3ZpZGVyOiB7eyAufHByb3ZpZGVyOnByb3RvRmlsZSxzZXJ2aWNlIH19KSB7CiAgICBzZWxmLnByb3ZpZGVyID0gcHJvdmlkZXIKICAgIHN1cGVyLmluaXQoaGFuZGxlcjpoYW5kbGVyKQogIH0KCiAgLy8vIFNlbmQgYSBtZXNzYWdlLiBOb25ibG9ja2luZy4KICBwdWJsaWMgZnVuYyBzZW5kKF8gcmVzcG9uc2U6IHt7IG1ldGhvZHxvdXRwdXQgfX0pIHRocm93cyB7CiAgICB0cnkgaGFuZGxlci5zZW5kUmVzcG9uc2UobWVzc2FnZTpyZXNwb25zZS5zZXJpYWxpemVQcm90b2J1ZigpKSB7fQogIH0KCiAgLy8vIFJ1biB0aGUgc2Vzc2lvbi4gSW50ZXJuYWwuCiAgZmlsZXByaXZhdGUgZnVuYyBydW4ocXVldWU6RGlzcGF0Y2hRdWV1ZSkgdGhyb3dzIHsKICAgIHRyeSBzZWxmLmhhbmRsZXIucmVjZWl2ZU1lc3NhZ2UoaW5pdGlhbE1ldGFkYXRhOmluaXRpYWxNZXRhZGF0YSkgeyhyZXF1ZXN0RGF0YSkgaW4KICAgICAgaWYgbGV0IHJlcXVlc3REYXRhID0gcmVxdWVzdERhdGEgewogICAgICAgIGRvIHsKICAgICAgICAgIGxldCByZXF1ZXN0TWVzc2FnZSA9IHRyeSB7eyBtZXRob2R8aW5wdXQgfX0ocHJvdG9idWY6cmVxdWVzdERhdGEpCiAgICAgICAgICAvLyB0byBrZWVwIHByb3ZpZGVycyBmcm9tIGJsb2NraW5nIHRoZSBzZXJ2ZXIgdGhyZWFkLAogICAgICAgICAgLy8gd2UgZGlzcGF0Y2ggdGhlbSB0byBhbm90aGVyIHF1ZXVlLgogICAgICAgICAgcXVldWUuYXN5bmMgewogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgdHJ5IHNlbGYucHJvdmlkZXIue3sgbWV0aG9kLm5hbWV8bG93ZXJjYXNlIH19KHJlcXVlc3Q6cmVxdWVzdE1lc3NhZ2UsIHNlc3Npb246IHNlbGYpCiAgICAgICAgICAgICAgdHJ5IHNlbGYuaGFuZGxlci5zZW5kU3RhdHVzKHN0YXR1c0NvZGU6c2VsZi5zdGF0dXNDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNNZXNzYWdlOnNlbGYuc3RhdHVzTWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmdNZXRhZGF0YTpzZWxmLnRyYWlsaW5nTWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb246e30pCiAgICAgICAgICAgIH0gY2F0Y2ggKGxldCBlcnJvcikgewogICAgICAgICAgICAgIHByaW50KCJlcnJvcjogXChlcnJvcikiKQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAobGV0IGVycm9yKSB7CiAgICAgICAgICBwcmludCgiZXJyb3I6IFwoZXJyb3IpIikKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn0K"
  47. templates["server-session-unary.swift"] = "Ly8ge3sgbWV0aG9kLm5hbWUgfX0gKFVuYXJ5KQpwdWJsaWMgY2xhc3Mge3sgLnxzZXNzaW9uOnByb3RvRmlsZSxzZXJ2aWNlLG1ldGhvZCB9fSA6IHt7IC58c2VydmljZTpwcm90b0ZpbGUsc2VydmljZSB9fVNlc3Npb24gewogIHByaXZhdGUgdmFyIHByb3ZpZGVyIDoge3sgLnxwcm92aWRlcjpwcm90b0ZpbGUsc2VydmljZSB9fQoKICAvLy8gQ3JlYXRlIGEgc2Vzc2lvbi4KICBmaWxlcHJpdmF0ZSBpbml0KGhhbmRsZXI6Z1JQQy5IYW5kbGVyLCBwcm92aWRlcjoge3sgLnxwcm92aWRlcjpwcm90b0ZpbGUsc2VydmljZSB9fSkgewogICAgc2VsZi5wcm92aWRlciA9IHByb3ZpZGVyCiAgICBzdXBlci5pbml0KGhhbmRsZXI6aGFuZGxlcikKICB9CgogIC8vLyBSdW4gdGhlIHNlc3Npb24uIEludGVybmFsLgogIGZpbGVwcml2YXRlIGZ1bmMgcnVuKHF1ZXVlOkRpc3BhdGNoUXVldWUpIHRocm93cyB7CiAgICB0cnkgaGFuZGxlci5yZWNlaXZlTWVzc2FnZShpbml0aWFsTWV0YWRhdGE6aW5pdGlhbE1ldGFkYXRhKSB7KHJlcXVlc3REYXRhKSBpbgogICAgICBpZiBsZXQgcmVxdWVzdERhdGEgPSByZXF1ZXN0RGF0YSB7CiAgICAgICAgbGV0IHJlcXVlc3RNZXNzYWdlID0gdHJ5IHt7IG1ldGhvZHxpbnB1dCB9fShwcm90b2J1ZjpyZXF1ZXN0RGF0YSkKICAgICAgICBsZXQgcmVwbHlNZXNzYWdlID0gdHJ5IHNlbGYucHJvdmlkZXIue3sgbWV0aG9kLm5hbWV8bG93ZXJjYXNlIH19KHJlcXVlc3Q6cmVxdWVzdE1lc3NhZ2UsIHNlc3Npb246IHNlbGYpCiAgICAgICAgdHJ5IHNlbGYuaGFuZGxlci5zZW5kUmVzcG9uc2UobWVzc2FnZTpyZXBseU1lc3NhZ2Uuc2VyaWFsaXplUHJvdG9idWYoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOnNlbGYuc3RhdHVzQ29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNNZXNzYWdlOnNlbGYuc3RhdHVzTWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbGluZ01ldGFkYXRhOnNlbGYudHJhaWxpbmdNZXRhZGF0YSkKICAgICAgfQogICAgfQogIH0KfQo="
  48. templates["server.pb.swift"] = "LyoKICogRE8gTk9UIEVESVQuCiAqCiAqIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLgogKiBTb3VyY2U6IHt7IHByb3RvRmlsZS5uYW1lIH19CiAqCiAqLwoKLyoKICoKICogQ29weXJpZ2h0IDIwMTcsIEdvb2dsZSBJbmMuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCiAqIG1ldDoKICoKICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCiAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQogKiBkaXN0cmlidXRpb24uCiAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwogKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAogKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCiAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQogKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQogKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogKgogKi8KCmltcG9ydCBGb3VuZGF0aW9uCmltcG9ydCBEaXNwYXRjaAppbXBvcnQgZ1JQQwovLy17JSBmb3Igc2VydmljZSBpbiBwcm90b0ZpbGUuc2VydmljZSAlfQoKLy8vIFR5cGUgZm9yIGVycm9ycyB0aHJvd24gZnJvbSBnZW5lcmF0ZWQgc2VydmVyIGNvZGUuCnB1YmxpYyBlbnVtIHt7IC58c2VydmVyZXJyb3I6cHJvdG9GaWxlLHNlcnZpY2UgfX0gOiBFcnJvciB7CiAgY2FzZSBlbmRPZlN0cmVhbQp9CgovLy8gVG8gYnVpbGQgYSBzZXJ2ZXIsIGltcGxlbWVudCBhIGNsYXNzIHRoYXQgY29uZm9ybXMgdG8gdGhpcyBwcm90b2NvbC4KcHVibGljIHByb3RvY29sIHt7IC58cHJvdmlkZXI6cHJvdG9GaWxlLHNlcnZpY2UgfX0gewogIC8vLXslIGZvciBtZXRob2QgaW4gc2VydmljZS5tZXRob2QgJX0KICAvLy17JSBpZiBub3QgbWV0aG9kLmNsaWVudFN0cmVhbWluZyBhbmQgbm90IG1ldGhvZC5zZXJ2ZXJTdHJlYW1pbmcgJX0KICBmdW5jIHt7IG1ldGhvZC5uYW1lfGxvd2VyY2FzZSB9fShyZXF1ZXN0IDoge3sgbWV0aG9kfGlucHV0IH19LCBzZXNzaW9uIDoge3sgLnxzZXNzaW9uOnByb3RvRmlsZSxzZXJ2aWNlLG1ldGhvZCB9fSkgdGhyb3dzIC0+IHt7IG1ldGhvZHxvdXRwdXQgfX0KICAvLy17JSBlbmRpZiAlfQogIC8vLXslIGlmIG5vdCBtZXRob2QuY2xpZW50U3RyZWFtaW5nIGFuZCBtZXRob2Quc2VydmVyU3RyZWFtaW5nICV9CiAgZnVuYyB7eyBtZXRob2QubmFtZXxsb3dlcmNhc2UgfX0ocmVxdWVzdCA6IHt7IG1ldGhvZHxpbnB1dCB9fSwgc2Vzc2lvbiA6IHt7IC58c2Vzc2lvbjpwcm90b0ZpbGUsc2VydmljZSxtZXRob2QgfX0pIHRocm93cwogIC8vLXslIGVuZGlmICV9CiAgLy8teyUgaWYgbWV0aG9kLmNsaWVudFN0cmVhbWluZyBhbmQgbm90IG1ldGhvZC5zZXJ2ZXJTdHJlYW1pbmcgJX0KICBmdW5jIHt7IG1ldGhvZC5uYW1lfGxvd2VyY2FzZSB9fShzZXNzaW9uIDoge3sgLnxzZXNzaW9uOnByb3RvRmlsZSxzZXJ2aWNlLG1ldGhvZCB9fSkgdGhyb3dzCiAgLy8teyUgZW5kaWYgJX0KICAvLy17JSBpZiBtZXRob2QuY2xpZW50U3RyZWFtaW5nIGFuZCBtZXRob2Quc2VydmVyU3RyZWFtaW5nICV9CiAgZnVuYyB7eyBtZXRob2QubmFtZXxsb3dlcmNhc2UgfX0oc2Vzc2lvbiA6IHt7IC58c2Vzc2lvbjpwcm90b0ZpbGUsc2VydmljZSxtZXRob2QgfX0pIHRocm93cwogIC8vLXslIGVuZGlmICV9CiAgLy8teyUgZW5kZm9yICV9Cn0KCi8vLyBDb21tb24gcHJvcGVydGllcyBhdmFpbGFibGUgaW4gZWFjaCBzZXJ2aWNlIHNlc3Npb24uCnB1YmxpYyBjbGFzcyB7eyAufHNlcnZpY2U6cHJvdG9GaWxlLHNlcnZpY2UgfX1TZXNzaW9uIHsKICBmaWxlcHJpdmF0ZSB2YXIgaGFuZGxlciA6IGdSUEMuSGFuZGxlcgogIHB1YmxpYyB2YXIgcmVxdWVzdE1ldGFkYXRhIDogTWV0YWRhdGEgeyByZXR1cm4gaGFuZGxlci5yZXF1ZXN0TWV0YWRhdGEgfQoKICBwdWJsaWMgdmFyIHN0YXR1c0NvZGUgOiBJbnQgPSAwCiAgcHVibGljIHZhciBzdGF0dXNNZXNzYWdlIDogU3RyaW5nID0gIk9LIgogIHB1YmxpYyB2YXIgaW5pdGlhbE1ldGFkYXRhIDogTWV0YWRhdGEgPSBNZXRhZGF0YSgpCiAgcHVibGljIHZhciB0cmFpbGluZ01ldGFkYXRhIDogTWV0YWRhdGEgPSBNZXRhZGF0YSgpCgogIGZpbGVwcml2YXRlIGluaXQoaGFuZGxlcjpnUlBDLkhhbmRsZXIpIHsKICAgIHNlbGYuaGFuZGxlciA9IGhhbmRsZXIKICB9Cn0KCi8vLXslIGZvciBtZXRob2QgaW4gc2VydmljZS5tZXRob2QgJX0KLy8teyUgaWYgbm90IG1ldGhvZC5jbGllbnRTdHJlYW1pbmcgYW5kIG5vdCBtZXRob2Quc2VydmVyU3RyZWFtaW5nICV9Ci8vLXslIGluY2x1ZGUgInNlcnZlci1zZXNzaW9uLXVuYXJ5LnN3aWZ0IiAlfQovLy17JSBlbmRpZiAlfQovLy17JSBpZiBub3QgbWV0aG9kLmNsaWVudFN0cmVhbWluZyBhbmQgbWV0aG9kLnNlcnZlclN0cmVhbWluZyAlfQovLy17JSBpbmNsdWRlICJzZXJ2ZXItc2Vzc2lvbi1zZXJ2ZXJzdHJlYW1pbmcuc3dpZnQiICV9Ci8vLXslIGVuZGlmICV9Ci8vLXslIGlmIG1ldGhvZC5jbGllbnRTdHJlYW1pbmcgYW5kIG5vdCBtZXRob2Quc2VydmVyU3RyZWFtaW5nICV9Ci8vLXslIGluY2x1ZGUgInNlcnZlci1zZXNzaW9uLWNsaWVudHN0cmVhbWluZy5zd2lmdCIgJX0KLy8teyUgZW5kaWYgJX0KLy8teyUgaWYgbWV0aG9kLmNsaWVudFN0cmVhbWluZyBhbmQgbWV0aG9kLnNlcnZlclN0cmVhbWluZyAlfQovLy17JSBpbmNsdWRlICJzZXJ2ZXItc2Vzc2lvbi1iaWRpc3RyZWFtaW5nLnN3aWZ0IiAlfQovLy17JSBlbmRpZiAlfQovLy17JSBlbmRmb3IgJX0KCi8vLyBNYWluIHNlcnZlciBmb3IgZ2VuZXJhdGVkIHNlcnZpY2UKcHVibGljIGNsYXNzIHt7IC58c2VydmVyOnByb3RvRmlsZSxzZXJ2aWNlIH19IHsKICBwcml2YXRlIHZhciBhZGRyZXNzOiBTdHJpbmcKICBwcml2YXRlIHZhciBzZXJ2ZXI6IGdSUEMuU2VydmVyCiAgcHJpdmF0ZSB2YXIgcHJvdmlkZXI6IHt7IC58cHJvdmlkZXI6cHJvdG9GaWxlLHNlcnZpY2UgfX0/CgogIC8vLyBDcmVhdGUgYSBzZXJ2ZXIgdGhhdCBhY2NlcHRzIGluc2VjdXJlIGNvbm5lY3Rpb25zLgogIHB1YmxpYyBpbml0KGFkZHJlc3M6U3RyaW5nLAogICAgICAgICAgICAgIHByb3ZpZGVyOnt7IC58cHJvdmlkZXI6cHJvdG9GaWxlLHNlcnZpY2UgfX0pIHsKICAgIGdSUEMuaW5pdGlhbGl6ZSgpCiAgICBzZWxmLmFkZHJlc3MgPSBhZGRyZXNzCiAgICBzZWxmLnByb3ZpZGVyID0gcHJvdmlkZXIKICAgIHNlbGYuc2VydmVyID0gZ1JQQy5TZXJ2ZXIoYWRkcmVzczphZGRyZXNzKQogIH0KCiAgLy8vIENyZWF0ZSBhIHNlcnZlciB0aGF0IGFjY2VwdHMgc2VjdXJlIGNvbm5lY3Rpb25zLgogIHB1YmxpYyBpbml0PyhhZGRyZXNzOlN0cmluZywKICAgICAgICAgICAgICAgY2VydGlmaWNhdGVVUkw6VVJMLAogICAgICAgICAgICAgICBrZXlVUkw6VVJMLAogICAgICAgICAgICAgICBwcm92aWRlcjp7eyAufHByb3ZpZGVyOnByb3RvRmlsZSxzZXJ2aWNlIH19KSB7CiAgICBnUlBDLmluaXRpYWxpemUoKQogICAgc2VsZi5hZGRyZXNzID0gYWRkcmVzcwogICAgc2VsZi5wcm92aWRlciA9IHByb3ZpZGVyCiAgICBndWFyZAogICAgICBsZXQgY2VydGlmaWNhdGUgPSB0cnk/IFN0cmluZyhjb250ZW50c09mOiBjZXJ0aWZpY2F0ZVVSTCksCiAgICAgIGxldCBrZXkgPSB0cnk/IFN0cmluZyhjb250ZW50c09mOiBrZXlVUkwpCiAgICAgIGVsc2UgewogICAgICAgIHJldHVybiBuaWwKICAgIH0KICAgIHNlbGYuc2VydmVyID0gZ1JQQy5TZXJ2ZXIoYWRkcmVzczphZGRyZXNzLCBrZXk6a2V5LCBjZXJ0czpjZXJ0aWZpY2F0ZSkKICB9CgogIC8vLyBTdGFydCB0aGUgc2VydmVyLgogIHB1YmxpYyBmdW5jIHN0YXJ0KHF1ZXVlOkRpc3BhdGNoUXVldWUgPSBEaXNwYXRjaFF1ZXVlLmdsb2JhbCgpKSB7CiAgICBndWFyZCBsZXQgcHJvdmlkZXIgPSBzZWxmLnByb3ZpZGVyIGVsc2UgewogICAgICBhc3NlcnQoZmFsc2UpIC8vIHRoZSBzZXJ2ZXIgcmVxdWlyZXMgYSBwcm92aWRlcgogICAgfQogICAgc2VydmVyLnJ1biB7KGhhbmRsZXIpIGluCiAgICAgIHByaW50KCJTZXJ2ZXIgcmVjZWl2ZWQgcmVxdWVzdCB0byAiICsgaGFuZGxlci5ob3N0CiAgICAgICAgKyAiIGNhbGxpbmcgIiArIGhhbmRsZXIubWV0aG9kCiAgICAgICAgKyAiIGZyb20gIiArIGhhbmRsZXIuY2FsbGVyCiAgICAgICAgKyAiIHdpdGggIiArIFN0cmluZyhkZXNjcmliaW5nOmhhbmRsZXIucmVxdWVzdE1ldGFkYXRhKSApCgogICAgICBkbyB7CiAgICAgICAgc3dpdGNoIGhhbmRsZXIubWV0aG9kIHsKICAgICAgICAvLy17JSBmb3IgbWV0aG9kIGluIHNlcnZpY2UubWV0aG9kICV9CiAgICAgICAgY2FzZSAie3sgLnxwYXRoOnByb3RvRmlsZSxzZXJ2aWNlLG1ldGhvZCB9fSI6CiAgICAgICAgICB0cnkge3sgLnxzZXNzaW9uOnByb3RvRmlsZSxzZXJ2aWNlLG1ldGhvZCB9fShoYW5kbGVyOmhhbmRsZXIsIHByb3ZpZGVyOnByb3ZpZGVyKS5ydW4ocXVldWU6cXVldWUpCiAgICAgICAgLy8teyUgZW5kZm9yICV9CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIGJyZWFrIC8vIGhhbmRsZSB1bmtub3duIHJlcXVlc3RzCiAgICAgICAgfQogICAgICB9IGNhdGNoIChsZXQgZXJyb3IpIHsKICAgICAgICBwcmludCgiU2VydmVyIGVycm9yOiBcKGVycm9yKSIpCiAgICAgIH0KICAgIH0KICB9Cn0KLy8teyUgZW5kZm9yICV9Cg=="
  49. return templates
  50. }