diff --git a/README.md b/README.md
index 627455f7..4759801d 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
-
+
This repository provides easy to understand code snippets on how to get started with web development with the Go programming language using the [Iris](https://github.com/kataras/iris) web framework.
@@ -159,11 +159,16 @@ To read the Iris documentation please navigate to [the wiki pages](https://githu
* [ORM](orm)
* [Using xorm(Mysql, MyMysql, Postgres, Tidb, **SQLite**, MsSql, MsSql, Oracle)](orm/xorm/main.go)
* [Using gorm](orm/gorm/main.go)
+* [Desktop App](desktop-app)
+ * [Blink](desktop-app/blink)
+ * [Lorca](desktop-app/lorca)
+ * [Webview](desktop-app/webview)
* [Miscellaneous](miscellaneous)
* [HTTP Method Override](https://github.com/kataras/iris/blob/master/middleware/methodoverride/methodoverride_test.go) **NEW**
* [Request Logger](http_request/request-logger/main.go)
* [log requests to a file](http_request/request-logger/request-logger-file/main.go)
- * [Localization and Internationalization](miscellaneous/i18n/main.go)
+ * [Localization and Internationalization](i18n/main.go)
+ * [Sitemap.xml](sitemap/main.go)
* [Recovery](miscellaneous/recover/main.go)
* [Profiling (pprof)](miscellaneous/pprof/main.go)
* [Internal Application File Logger](miscellaneous/file-logger/main.go)
@@ -189,7 +194,7 @@ To read the Iris documentation please navigate to [the wiki pages](https://githu
* [Cookies](cookies)
* [Basic](cookies/basic/main.go)
* [Encode/Decode (securecookie)](cookies/securecookie/main.go)
-[Sessions](sessions)
+* [Sessions](sessions)
* [Overview](sessions/overview/main.go)
* [Middleware](sessions/middleware/main.go)
* [Secure Cookie](sessions/securecookie/main.go)
diff --git a/desktop-app/blink/main.go b/desktop-app/blink/main.go
new file mode 100644
index 00000000..87ae931d
--- /dev/null
+++ b/desktop-app/blink/main.go
@@ -0,0 +1,40 @@
+package main
+
+import (
+ "github.com/kataras/iris/v12"
+ "github.com/raintean/blink"
+)
+
+const addr = "127.0.0.1:8080"
+
+/*
+ $ go build -ldflags -H=windowsgui -o myapp.exe # build for windows
+ $ ./myapp.exe # run the app
+*/
+func main() {
+ go runServer()
+ showAndWaitWindow()
+}
+
+func runServer() {
+ app := iris.New()
+ app.Get("/", func(ctx iris.Context) {
+ ctx.HTML("
Hello Desktop
")
+ })
+ app.Run(iris.Addr(addr))
+}
+
+func showAndWaitWindow() {
+ blink.SetDebugMode(true)
+ if err := blink.InitBlink(); err != nil {
+ panic(err)
+ }
+
+ view := blink.NewWebView(false, 800, 600)
+ view.LoadURL(addr)
+ view.SetWindowTitle("My App")
+ view.MoveToCenter()
+ view.ShowWindow()
+
+ <-view.Destroy
+}
diff --git a/desktop-app/lorca/main.go b/desktop-app/lorca/main.go
new file mode 100644
index 00000000..aa191dd5
--- /dev/null
+++ b/desktop-app/lorca/main.go
@@ -0,0 +1,40 @@
+package main
+
+import (
+ "github.com/kataras/iris/v12"
+ "github.com/zserge/lorca"
+)
+
+const addr = "127.0.0.1:8080"
+
+/*
+ $ go build -ldflags="-H windowsgui" -o myapp.exe # build for windows
+ $ ./myapp.exe # run
+*/
+func main() {
+ go runServer()
+ showAndWaitWindow()
+}
+
+func runServer() {
+ app := iris.New()
+ app.Get("/", func(ctx iris.Context) {
+ ctx.HTML("My AppHello Desktop
")
+ })
+ app.Run(iris.Addr(addr))
+}
+
+func showAndWaitWindow() {
+ webview, err := lorca.New("http://"+addr, "", 800, 600)
+ if err != nil {
+ panic(err)
+ }
+ defer webview.Close()
+
+ // webview.SetBounds(lorca.Bounds{
+ // WindowState: lorca.WindowStateFullscreen,
+ // })
+
+ // Wait for the browser window to be closed
+ <-webview.Done()
+}
diff --git a/desktop-app/webview/main.go b/desktop-app/webview/main.go
new file mode 100644
index 00000000..3c211139
--- /dev/null
+++ b/desktop-app/webview/main.go
@@ -0,0 +1,39 @@
+package main
+
+import (
+ "github.com/kataras/iris/v12"
+ "github.com/zserge/webview"
+)
+
+const addr = "127.0.0.1:8080"
+
+/*
+ # Windows requires special linker flags for GUI apps.
+ # It's also recommended to use TDM-GCC-64 compiler for CGo.
+ # http://tdm-gcc.tdragon.net/download
+ #
+ #
+ $ go build -ldflags="-H windowsgui" -o myapp.exe # build for windows
+ $ ./myapp.exe # run
+ #
+ #
+ # Note: if you see "use option -std=c99 or -std=gnu99 to compile your code"
+ # please refer to: https://github.com/zserge/webview/issues/188
+*/
+func main() {
+ go runServer()
+ showAndWaitWindow()
+}
+
+func runServer() {
+ app := iris.New()
+ app.Get("/", func(ctx iris.Context) {
+ ctx.HTML(" Hello Desktop
")
+ })
+ app.Run(iris.Addr(addr))
+}
+
+func showAndWaitWindow() {
+ webview.Open("My App",
+ addr, 800, 600, true)
+}
diff --git a/i18n/hosts b/i18n/hosts
new file mode 100644
index 00000000..fb394e4b
--- /dev/null
+++ b/i18n/hosts
@@ -0,0 +1,26 @@
+# Copyright (c) 1993-2009 Microsoft Corp.
+#
+# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
+#
+# This file contains the mappings of IP addresses to host names. Each
+# entry should be kept on an individual line. The IP address should
+# be placed in the first column followed by the corresponding host name.
+# The IP address and the host name should be separated by at least one
+# space.
+#
+# Additionally, comments (such as these) may be inserted on individual
+# lines or following the machine name denoted by a '#' symbol.
+#
+# For example:
+#
+# 102.54.94.97 rhino.acme.com # source server
+# 38.25.63.10 x.acme.com # x client host
+
+# localhost name resolution is handled within DNS itself.
+# 127.0.0.1 localhost
+# ::1 localhost
+127.0.0.1 mydomain.com
+127.0.0.1 en.mydomain.com
+127.0.0.1 el.mydomain.com
+127.0.0.1 el-gr.mydomain.com
+127.0.0.1 zh.mydomain.com
\ No newline at end of file
diff --git a/miscellaneous/i18n/locales/locale_el-GR.ini b/i18n/locales/el-GR/locale_el-GR.ini
similarity index 100%
rename from miscellaneous/i18n/locales/locale_el-GR.ini
rename to i18n/locales/el-GR/locale_el-GR.ini
diff --git a/miscellaneous/i18n/locales/locale_multi_first_el-GR.ini b/i18n/locales/el-GR/locale_multi_first_el-GR.ini
similarity index 100%
rename from miscellaneous/i18n/locales/locale_multi_first_el-GR.ini
rename to i18n/locales/el-GR/locale_multi_first_el-GR.ini
diff --git a/miscellaneous/i18n/locales/locale_multi_second_el-GR.ini b/i18n/locales/el-GR/locale_multi_second_el-GR.ini
similarity index 100%
rename from miscellaneous/i18n/locales/locale_multi_second_el-GR.ini
rename to i18n/locales/el-GR/locale_multi_second_el-GR.ini
diff --git a/miscellaneous/i18n/locales/locale_en-US.ini b/i18n/locales/en-US/locale_en-US.ini
similarity index 100%
rename from miscellaneous/i18n/locales/locale_en-US.ini
rename to i18n/locales/en-US/locale_en-US.ini
diff --git a/miscellaneous/i18n/locales/locale_multi_first_en-US.ini b/i18n/locales/en-US/locale_multi_first_en-US.ini
similarity index 100%
rename from miscellaneous/i18n/locales/locale_multi_first_en-US.ini
rename to i18n/locales/en-US/locale_multi_first_en-US.ini
diff --git a/miscellaneous/i18n/locales/locale_multi_second_en-US.ini b/i18n/locales/en-US/locale_multi_second_en-US.ini
similarity index 100%
rename from miscellaneous/i18n/locales/locale_multi_second_en-US.ini
rename to i18n/locales/en-US/locale_multi_second_en-US.ini
diff --git a/miscellaneous/i18n/locales/locale_zh-CN.ini b/i18n/locales/zh-CN/locale_zh-CN.ini
similarity index 100%
rename from miscellaneous/i18n/locales/locale_zh-CN.ini
rename to i18n/locales/zh-CN/locale_zh-CN.ini
diff --git a/i18n/main.go b/i18n/main.go
new file mode 100644
index 00000000..4cb926a3
--- /dev/null
+++ b/i18n/main.go
@@ -0,0 +1,89 @@
+package main
+
+import (
+ "github.com/kataras/iris/v12"
+)
+
+func newApp() *iris.Application {
+ app := iris.New()
+
+ // Configure i18n.
+ // First parameter: Glob filpath patern,
+ // Second variadic parameter: Optional language tags, the first one is the default/fallback one.
+ app.I18n.Load("./locales/*/*.ini", "en-US", "el-GR", "zh-CN")
+ // app.I18n.LoadAssets for go-bindata.
+
+ // Default values:
+ // app.I18n.URLParameter = "lang"
+ // app.I18n.Subdomain = true
+ //
+ // Set to false to disallow path (local) redirects,
+ // see https://github.com/kataras/iris/issues/1369.
+ // app.I18n.PathRedirect = true
+
+ app.Get("/", func(ctx iris.Context) {
+ hi := ctx.Tr("hi", "iris")
+
+ locale := ctx.GetLocale()
+
+ ctx.Writef("From the language %s translated output: %s", locale.Language(), hi)
+ })
+
+ app.Get("/some-path", func(ctx iris.Context) {
+ ctx.Writef("%s", ctx.Tr("hi", "iris"))
+ })
+
+ app.Get("/other", func(ctx iris.Context) {
+ language := ctx.GetLocale().Language()
+
+ fromFirstFileValue := ctx.Tr("key1")
+ fromSecondFileValue := ctx.Tr("key2")
+ ctx.Writef("From the language: %s, translated output:\n%s=%s\n%s=%s",
+ language, "key1", fromFirstFileValue,
+ "key2", fromSecondFileValue)
+ })
+
+ // using in inside your views:
+ view := iris.HTML("./views", ".html")
+ app.RegisterView(view)
+
+ app.Get("/templates", func(ctx iris.Context) {
+ ctx.View("index.html", iris.Map{
+ "tr": ctx.Tr, // word, arguments... {call .tr "hi" "iris"}}
+ })
+
+ // Note that,
+ // Iris automatically adds a "tr" global template function as well,
+ // the only differene is the way you call it inside your templates and
+ // that it accepts a language code as its first argument: {{ tr "el-GR" "hi" "iris"}}
+ })
+ //
+
+ return app
+}
+
+func main() {
+ app := newApp()
+
+ // go to http://localhost:8080/el-gr/some-path
+ // ^ (by path prefix)
+ //
+ // or http://el.mydomain.com8080/some-path
+ // ^ (by subdomain - test locally with the hosts file)
+ //
+ // or http://localhost:8080/zh-CN/templates
+ // ^ (by path prefix with uppercase)
+ //
+ // or http://localhost:8080/some-path?lang=el-GR
+ // ^ (by url parameter)
+ //
+ // or http://localhost:8080 (default is en-US)
+ // or http://localhost:8080/?lang=zh-CN
+ //
+ // go to http://localhost:8080/other?lang=el-GR
+ // or http://localhost:8080/other (default is en-US)
+ // or http://localhost:8080/other?lang=en-US
+ //
+ // or use cookies to set the language.
+ app.Run(iris.Addr(":8080"), iris.WithSitemap("http://localhost:8080"))
+}
diff --git a/i18n/main_test.go b/i18n/main_test.go
new file mode 100644
index 00000000..f625c29c
--- /dev/null
+++ b/i18n/main_test.go
@@ -0,0 +1,86 @@
+package main
+
+import (
+ "fmt"
+ "strings"
+ "testing"
+
+ "github.com/kataras/iris/v12/httptest"
+)
+
+func TestI18n(t *testing.T) {
+ app := newApp()
+
+ const (
+ expectedf = "From the language %s translated output: %s"
+
+ enUS = "hello, iris"
+ elGR = "γεια, iris"
+ zhCN = "您好,iris"
+ )
+
+ var (
+ tests = map[string]string{
+ "en-US": fmt.Sprintf(expectedf, "en-US", enUS),
+ "el-GR": fmt.Sprintf(expectedf, "el-GR", elGR),
+ "zh-CN": fmt.Sprintf(expectedf, "zh-CN", zhCN),
+ }
+
+ elgrMulti = fmt.Sprintf("From the language: %s, translated output:\n%s=%s\n%s=%s", "el-GR",
+ "key1",
+ "αυτό είναι μια τιμή από το πρώτο αρχείο: locale_multi_first",
+ "key2",
+ "αυτό είναι μια τιμή από το δεύτερο αρχείο μετάφρασης: locale_multi_second")
+ enusMulti = fmt.Sprintf("From the language: %s, translated output:\n%s=%s\n%s=%s", "en-US",
+ "key1",
+ "this is a value from the first file: locale_multi_first",
+ "key2",
+ "this is a value from the second file: locale_multi_second")
+ )
+
+ e := httptest.New(t, app)
+ // default should be en-US.
+ e.GET("/").Expect().Status(httptest.StatusOK).Body().Equal(tests["en-US"])
+
+ for lang, body := range tests {
+ e.GET("/").WithQueryString("lang=" + lang).Expect().Status(httptest.StatusOK).
+ Body().Equal(body)
+
+ // test lowercase.
+ e.GET("/").WithQueryString("lang=" + strings.ToLower(lang)).Expect().Status(httptest.StatusOK).
+ Body().Equal(body)
+
+ // test first part (e.g. en instead of en-US).
+ langFirstPart := strings.Split(lang, "-")[0]
+ e.GET("/").WithQueryString("lang=" + langFirstPart).Expect().Status(httptest.StatusOK).
+ Body().Equal(body)
+
+ // test accept-language header prefix (i18n wrapper).
+ e.GET("/"+lang).WithHeader("Accept-Language", lang).Expect().Status(httptest.StatusOK).
+ Body().Equal(body)
+
+ // test path prefix (i18n router wrapper).
+ e.GET("/" + lang).Expect().Status(httptest.StatusOK).
+ Body().Equal(body)
+
+ // test path prefix with first part.
+ e.GET("/" + langFirstPart).Expect().Status(httptest.StatusOK).
+ Body().Equal(body)
+ }
+
+ e.GET("/other").WithQueryString("lang=el-GR").Expect().Status(httptest.StatusOK).
+ Body().Equal(elgrMulti)
+ e.GET("/other").WithQueryString("lang=en-US").Expect().Status(httptest.StatusOK).
+ Body().Equal(enusMulti)
+
+ // test path prefix (i18n router wrapper).
+ e.GET("/el-gr/other").Expect().Status(httptest.StatusOK).
+ Body().Equal(elgrMulti)
+ e.GET("/en/other").Expect().Status(httptest.StatusOK).
+ Body().Equal(enusMulti)
+
+ e.GET("/el-GRtemplates").Expect().Status(httptest.StatusNotFound)
+ e.GET("/el-templates").Expect().Status(httptest.StatusNotFound)
+
+ e.GET("/el/templates").Expect().Status(httptest.StatusOK).Body().Contains(elGR).Contains(zhCN)
+}
diff --git a/i18n/views/index.html b/i18n/views/index.html
new file mode 100644
index 00000000..32bc8a6b
--- /dev/null
+++ b/i18n/views/index.html
@@ -0,0 +1,9 @@
+Test translate current locale template function [dynamic] ("word", arguments...)
call .tr "hi" "iris"
+
+{{call .tr "hi" "iris"}}
+
+
+
+Test translate of any language template function [static] ("language", "word", arguments...)
tr "zh-CN" "hi" "iris"
+
+{{tr "zh-CN" "hi" "iris"}}
\ No newline at end of file
diff --git a/miscellaneous/i18n/main.go b/miscellaneous/i18n/main.go
deleted file mode 100644
index 15fdbb5f..00000000
--- a/miscellaneous/i18n/main.go
+++ /dev/null
@@ -1,94 +0,0 @@
-package main
-
-import (
- "github.com/kataras/iris/v12"
- "github.com/kataras/iris/v12/middleware/i18n"
-)
-
-func newApp() *iris.Application {
- app := iris.New()
-
- globalLocale := i18n.New(i18n.Config{
- Default: "en-US",
- URLParameter: "lang",
- Languages: map[string]string{
- "en-US": "./locales/locale_en-US.ini",
- "el-GR": "./locales/locale_el-GR.ini",
- "zh-CN": "./locales/locale_zh-CN.ini",
- },
- })
- app.Use(globalLocale)
-
- app.Get("/", func(ctx iris.Context) {
- // it tries to find the language by:
- // ctx.Values().GetString("language")
- // if that was empty then
- // it tries to find from the URLParameter set on the configuration
- // if not found then
- // it tries to find the language by the "language" cookie
- // if didn't found then it it set to the Default set on the configuration
-
- // hi is the key, 'iris' is the %s on the .ini file
- // the second parameter is optional
-
- // hi := ctx.Translate("hi", "iris")
- // or:
- hi := i18n.Translate(ctx, "hi", "iris")
-
- language := ctx.Values().GetString(ctx.Application().ConfigurationReadOnly().GetTranslateLanguageContextKey())
- // return is form of 'en-US'
-
- // The first succeed language found saved at the cookie with name ("language"),
- // you can change that by changing the value of the: iris.TranslateLanguageContextKey
- ctx.Writef("From the language %s translated output: %s", language, hi)
- })
-
- multiLocale := i18n.New(i18n.Config{
- Default: "en-US",
- URLParameter: "lang",
- Languages: map[string]string{
- "en-US": "./locales/locale_multi_first_en-US.ini, ./locales/locale_multi_second_en-US.ini",
- "el-GR": "./locales/locale_multi_first_el-GR.ini, ./locales/locale_multi_second_el-GR.ini",
- },
- })
-
- app.Get("/multi", multiLocale, func(ctx iris.Context) {
- language := ctx.Values().GetString(ctx.Application().ConfigurationReadOnly().GetTranslateLanguageContextKey())
-
- fromFirstFileValue := i18n.Translate(ctx, "key1")
- fromSecondFileValue := i18n.Translate(ctx, "key2")
- ctx.Writef("From the language: %s, translated output:\n%s=%s\n%s=%s",
- language, "key1", fromFirstFileValue,
- "key2", fromSecondFileValue)
- })
-
- // using in inside your templates:
- view := iris.HTML("./templates", ".html")
- app.RegisterView(view)
-
- app.Get("/templates", func(ctx iris.Context) {
- ctx.View("index.html", iris.Map{
- "tr": ctx.Translate,
- })
- // it will return "hello, iris"
- // when {{call .tr "hi" "iris"}}
- })
- //
-
- return app
-}
-
-func main() {
- app := newApp()
-
- // go to http://localhost:8080/?lang=el-GR
- // or http://localhost:8080 (default is en-US)
- // or http://localhost:8080/?lang=zh-CN
- //
- // go to http://localhost:8080/multi?lang=el-GR
- // or http://localhost:8080/multi (default is en-US)
- // or http://localhost:8080/multi?lang=en-US
- //
- // or use cookies to set the language.
- app.Run(iris.Addr(":8080"))
-}
diff --git a/miscellaneous/i18n/main_test.go b/miscellaneous/i18n/main_test.go
deleted file mode 100644
index 5c9b9b4b..00000000
--- a/miscellaneous/i18n/main_test.go
+++ /dev/null
@@ -1,48 +0,0 @@
-package main
-
-import (
- "fmt"
- "testing"
-
- "github.com/kataras/iris/v12/httptest"
-)
-
-func TestI18n(t *testing.T) {
- app := newApp()
-
- expectedf := "From the language %s translated output: %s"
- var (
- elgr = fmt.Sprintf(expectedf, "el-GR", "γεια, iris")
- enus = fmt.Sprintf(expectedf, "en-US", "hello, iris")
- zhcn = fmt.Sprintf(expectedf, "zh-CN", "您好,iris")
-
- elgrMulti = fmt.Sprintf("From the language: %s, translated output:\n%s=%s\n%s=%s", "el-GR",
- "key1",
- "αυτό είναι μια τιμή από το πρώτο αρχείο: locale_multi_first",
- "key2",
- "αυτό είναι μια τιμή από το δεύτερο αρχείο μετάφρασης: locale_multi_second")
- enusMulti = fmt.Sprintf("From the language: %s, translated output:\n%s=%s\n%s=%s", "en-US",
- "key1",
- "this is a value from the first file: locale_multi_first",
- "key2",
- "this is a value from the second file: locale_multi_second")
- )
-
- e := httptest.New(t, app)
- // default is en-US
- e.GET("/").Expect().Status(httptest.StatusOK).Body().Equal(enus)
- // default is en-US if lang query unable to be found
- e.GET("/").Expect().Status(httptest.StatusOK).Body().Equal(enus)
-
- e.GET("/").WithQueryString("lang=el-GR").Expect().Status(httptest.StatusOK).
- Body().Equal(elgr)
- e.GET("/").WithQueryString("lang=en-US").Expect().Status(httptest.StatusOK).
- Body().Equal(enus)
- e.GET("/").WithQueryString("lang=zh-CN").Expect().Status(httptest.StatusOK).
- Body().Equal(zhcn)
-
- e.GET("/multi").WithQueryString("lang=el-GR").Expect().Status(httptest.StatusOK).
- Body().Equal(elgrMulti)
- e.GET("/multi").WithQueryString("lang=en-US").Expect().Status(httptest.StatusOK).
- Body().Equal(enusMulti)
-}
diff --git a/miscellaneous/i18n/templates/index.html b/miscellaneous/i18n/templates/index.html
deleted file mode 100644
index 7fc7cae8..00000000
--- a/miscellaneous/i18n/templates/index.html
+++ /dev/null
@@ -1 +0,0 @@
-{{call .tr "hi" "iris"}}
\ No newline at end of file
diff --git a/sitemap/main.go b/sitemap/main.go
new file mode 100644
index 00000000..fc1d3261
--- /dev/null
+++ b/sitemap/main.go
@@ -0,0 +1,38 @@
+package main
+
+import (
+ "time"
+
+ "github.com/kataras/iris/v12"
+)
+
+const startURL = "http://localhost:8080"
+
+func main() {
+ app := newApp()
+
+ // http://localhost:8080/sitemap.xml
+ // Lists only online GET static routes.
+ //
+ // Reference: https://www.sitemaps.org/protocol.html
+ app.Run(iris.Addr(":8080"), iris.WithSitemap(startURL))
+}
+
+func newApp() *iris.Application {
+ app := iris.New()
+ app.Logger().SetLevel("debug")
+
+ lastModified, _ := time.Parse("2006-01-02T15:04:05-07:00", "2019-12-13T21:50:33+02:00")
+ app.Get("/home", handler).SetLastMod(lastModified).SetChangeFreq("hourly").SetPriority(1)
+ app.Get("/articles", handler).SetChangeFreq("daily")
+ app.Get("/path1", handler)
+ app.Get("/path2", handler)
+
+ app.Post("/this-should-not-be-listed", handler)
+ app.Get("/this/{myparam}/should/not/be/listed", handler)
+ app.Get("/this-should-not-be-listed-offline", handler).SetStatusOffline()
+
+ return app
+}
+
+func handler(ctx iris.Context) { ctx.WriteString(ctx.Path()) }
diff --git a/sitemap/main_test.go b/sitemap/main_test.go
new file mode 100644
index 00000000..432fc9a5
--- /dev/null
+++ b/sitemap/main_test.go
@@ -0,0 +1,18 @@
+package main
+
+import (
+ "testing"
+
+ "github.com/kataras/iris/v12"
+ "github.com/kataras/iris/v12/httptest"
+)
+
+func TestSitemap(t *testing.T) {
+ const expectedFullSitemapXML = `http://localhost:8080/home2019-12-13T21:50:33+02:00hourly1http://localhost:8080/articlesdailyhttp://localhost:8080/path1http://localhost:8080/path2`
+
+ app := newApp()
+ app.Configure(iris.WithSitemap(startURL))
+
+ e := httptest.New(t, app)
+ e.GET("/sitemap.xml").Expect().Status(httptest.StatusOK).Body().Equal(expectedFullSitemapXML)
+}
diff --git a/tutorial/url-shortener/go.mod b/tutorial/url-shortener/go.mod
index 5abddc82..7131f514 100644
--- a/tutorial/url-shortener/go.mod
+++ b/tutorial/url-shortener/go.mod
@@ -3,17 +3,7 @@ module github.com/iris-contrib/examples/tutorial/url-shortener
go 1.13
require (
- github.com/ajg/form v1.5.1 // indirect
github.com/etcd-io/bbolt v1.3.3
- github.com/google/go-querystring v1.0.0 // indirect
- github.com/imkira/go-interpol v1.1.0 // indirect
github.com/iris-contrib/go.uuid v2.0.0+incompatible
- github.com/kataras/iris/v12 v12.0.1
- github.com/moul/http2curl v1.0.0 // indirect
- github.com/sergi/go-diff v1.0.0 // indirect
- github.com/valyala/fasthttp v1.5.0 // indirect
- github.com/xeipuuv/gojsonschema v1.2.0 // indirect
- github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 // indirect
- github.com/yudai/gojsondiff v1.0.0 // indirect
- github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 // indirect
+ github.com/kataras/iris/v12 v12.1.0
)
diff --git a/tutorial/url-shortener/go.sum b/tutorial/url-shortener/go.sum
deleted file mode 100644
index 07009dbe..00000000
--- a/tutorial/url-shortener/go.sum
+++ /dev/null
@@ -1,158 +0,0 @@
-github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8=
-github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
-github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
-github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a h1:3SgJcK9l5uPdBC/X17wanyJAMxM33+4ZhEIV96MIH8U=
-github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw=
-github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible h1:rZgFj+Gtf3NMi/U5FvCvhzaxzW/TaPYgUYx3bAPz9DE=
-github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w=
-github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY=
-github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7 h1:mreN1m/5VJ/Zc3b4pzj9qU6D9SRQ6Vm+3KfI328t3S8=
-github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM=
-github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398 h1:WDC6ySpJzbxGWFh4aMxFFC28wwGp5pEuoTtvA4q/qQ4=
-github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0=
-github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU=
-github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY=
-github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
-github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible h1:Ppm0npCCsmuR9oQaBtRuZcmILVE74aXE+AmrJj8L2ns=
-github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g=
-github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
-github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
-github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
-github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
-github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
-github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4=
-github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
-github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
-github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 h1:clC1lXBpe2kTj2VHdaIu9ajZQe4kcEY9j0NsnDDBZ3o=
-github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM=
-github.com/etcd-io/bbolt v1.3.3 h1:gSJmxrs37LgTqR/oyJBWok6k6SvXEUerFTbltIhXkBM=
-github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw=
-github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
-github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
-github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4 h1:GY1+t5Dr9OKADM64SYnQjw/w99HMYvQ0A8/JoUkxVmc=
-github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA=
-github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
-github.com/gavv/httpexpect v2.0.0+incompatible h1:1X9kcRshkSKEjNJJxX9Y9mQ5BRfbxU5kORdjhlA1yX8=
-github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc=
-github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98=
-github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo=
-github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw=
-github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM=
-github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
-github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk=
-github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
-github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q=
-github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
-github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
-github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
-github.com/imkira/go-interpol v1.1.0 h1:KIiKr0VSG2CUW1hl1jpiyuzuJeKUUpC8iM1AIE7N1Vk=
-github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA=
-github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
-github.com/iris-contrib/blackfriday v2.0.0+incompatible h1:o5sHQHHm0ToHUlAJSTjW9UWicjJSDDauOOQ2AHuIVp4=
-github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI=
-github.com/iris-contrib/go.uuid v2.0.0+incompatible h1:XZubAYg61/JwnJNbZilGjf3b3pB80+OQg2qf6c8BfWE=
-github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0=
-github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI=
-github.com/iris-contrib/schema v0.0.1 h1:10g/WnoRR+U+XXHWKBHeNy/+tZmM2kcAVGLOsz+yaDA=
-github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw=
-github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs=
-github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
-github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5 h1:rhqTjzJlm7EbkELJDKMTU7udov+Se0xZkWmugr6zGok=
-github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q=
-github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U=
-github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA=
-github.com/kataras/golog v0.0.9 h1:J7Dl82843nbKQDrQM/abbNJZvQjS6PfmkkffhOTXEpM=
-github.com/kataras/golog v0.0.9/go.mod h1:12HJgwBIZFNGL0EJnMRhmvGA0PQGx8VFwrZtM4CqbAk=
-github.com/kataras/iris v11.1.1+incompatible h1:c2iRKvKLpTYMXKdVB8YP/+A67NtZFt9kFFy+ZwBhWD0=
-github.com/kataras/iris/v12 v12.0.1 h1:Wo5S7GMWv5OAzJmvFTvss/C4TS1W0uo6LkDlSymT4rM=
-github.com/kataras/iris/v12 v12.0.1/go.mod h1:udK4vLQKkdDqMGJJVd/msuMtN6hpYJhg/lSzuxjhO+U=
-github.com/kataras/neffos v0.0.10/go.mod h1:ZYmJC07hQPW67eKuzlfY7SO3bC0mw83A3j6im82hfqw=
-github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d h1:V5Rs9ztEWdp58oayPq/ulmlqJJZeJP6pP79uP3qjcao=
-github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0=
-github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
-github.com/klauspost/compress v1.9.0 h1:GhthINjveNZAdFUD8QoQYfjxnOONZgztK/Yr6M23UTY=
-github.com/klauspost/compress v1.9.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
-github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
-github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
-github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
-github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
-github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
-github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw=
-github.com/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed/go.mod h1:dSsfyI2zABAdhcbvkXqgxOxrCsbYeHCPgrZkku60dSg=
-github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQGvsUt6O3Pj+LDCQ=
-github.com/microcosm-cc/bluemonday v1.0.2 h1:5lPfLTTAvAbtS0VqT+94yOtFnGfUWYyx0+iToC3Os3s=
-github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc=
-github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
-github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
-github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
-github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
-github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
-github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
-github.com/moul/http2curl v1.0.0 h1:dRMWoAtb+ePxMlLkrCbAqh4TlPHXvoGUSQ323/9Zahs=
-github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ=
-github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM=
-github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4=
-github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
-github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
-github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
-github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
-github.com/ryanuber/columnize v2.1.0+incompatible h1:j1Wcmh8OrK4Q7GXY+V7SVSY8nUWQxHW5TkBe7YUl+2s=
-github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
-github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ=
-github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
-github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo=
-github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
-github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
-github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
-github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
-github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
-github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
-github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
-github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
-github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
-github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
-github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
-github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
-github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
-github.com/valyala/fasthttp v1.5.0 h1:dhq+O9pmNZFF6qAXpasMO1xSm7dL4qEz2ylfZN8BG9w=
-github.com/valyala/fasthttp v1.5.0/go.mod h1:eriCz9OhZjKCGfJ185a/IDgNl0bg9IbzfpcslMZXU1c=
-github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio=
-github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c=
-github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
-github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=
-github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
-github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=
-github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
-github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
-github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY=
-github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI=
-github.com/yudai/gojsondiff v1.0.0 h1:27cbfqXLVEJ1o8I6v3y9lg8Ydm53EKqHXAOMxEGlCOA=
-github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg=
-github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 h1:BHyfKlQyqbsFN5p3IfnEUduWvb9is428/nNb5L3U01M=
-github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM=
-golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
-golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI=
-golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM=
-golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
-gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
-gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=