Browse Source

⬆️ Build `go-std` with Go-1.19 and `GOAMD64=v3` (#7598)

* ⬆️ Bump Go from 1.14 to 1.19

* ♻️ Move qtc + easyjson from Dockerfile to Go code

* ⬆️ Upgrade dependencies with Go-1.19 + generators

* 🔥 Drop unnecessary `GO111MODULE=on`

* 🎨 Shift `-prefork` to the end to ease comparison

* ⚡️ Set GOAMD64=v3 for AVX2, SSE4.2… instructions

See https://github.com/golang/go/wiki/MinimumRequirements#amd64

* ⬆️ Upgrade indirect dependencies

* 🎨 Rename module: go-std/src -> go-std/app

This change sets the default executable name to "app".
We may also drop the `-o app` in the Dockerfile.
0uep 2 years ago
parent
commit
5b4091300e
28 changed files with 197 additions and 188 deletions
  1. 6 8
      frameworks/Go/go-std/go-mgo-prefork.dockerfile
  2. 5 6
      frameworks/Go/go-std/go-mgo.dockerfile
  3. 6 8
      frameworks/Go/go-std/go-my-prefork.dockerfile
  4. 5 7
      frameworks/Go/go-std/go-my.dockerfile
  5. 5 7
      frameworks/Go/go-std/go-pgx-easyjson.dockerfile
  6. 5 7
      frameworks/Go/go-std/go-pgx-prefork-easyjson.dockerfile
  7. 8 7
      frameworks/Go/go-std/go-pgx-prefork-quicktemplate.dockerfile
  8. 8 7
      frameworks/Go/go-std/go-pgx-prefork.dockerfile
  9. 8 7
      frameworks/Go/go-std/go-pgx-quicktemplate.dockerfile
  10. 8 7
      frameworks/Go/go-std/go-pgx.dockerfile
  11. 5 7
      frameworks/Go/go-std/go.dockerfile
  12. 23 14
      frameworks/Go/go-std/src/go.mod
  13. 55 31
      frameworks/Go/go-std/src/go.sum
  14. 2 2
      frameworks/Go/go-std/src/handlers/handlers.go
  15. 1 1
      frameworks/Go/go-std/src/handlers/handlers_easyjson.go
  16. 2 0
      frameworks/Go/go-std/src/handlers/message.go
  17. 8 14
      frameworks/Go/go-std/src/handlers/message_easyjson.go
  18. 3 3
      frameworks/Go/go-std/src/main.go
  19. 1 1
      frameworks/Go/go-std/src/storage/db.go
  20. 1 1
      frameworks/Go/go-std/src/storage/mgo.go
  21. 1 1
      frameworks/Go/go-std/src/storage/mysql.go
  22. 1 1
      frameworks/Go/go-std/src/storage/pgx.go
  23. 1 1
      frameworks/Go/go-std/src/storage/pq.go
  24. 2 0
      frameworks/Go/go-std/src/storage/world.go
  25. 3 14
      frameworks/Go/go-std/src/storage/world_easyjson.go
  26. 3 1
      frameworks/Go/go-std/src/templates/fortune.go
  27. 3 7
      frameworks/Go/go-std/src/templates/fortune_easyjson.go
  28. 18 18
      frameworks/Go/go-std/src/templates/fortunes.qtpl.go

+ 6 - 8
frameworks/Go/go-std/go-mgo-prefork.dockerfile

@@ -1,18 +1,16 @@
-FROM golang:1.14
+FROM docker.io/golang:1.19
 
 
-ENV GO111MODULE on
 WORKDIR /go-std
 WORKDIR /go-std
 
 
 COPY ./src /go-std
 COPY ./src /go-std
 
 
-RUN go get github.com/valyala/quicktemplate/qtc
-RUN go get -u github.com/mailru/easyjson/...
 RUN go mod download
 RUN go mod download
 
 
-RUN go generate ./templates
-RUN easyjson -pkg
-RUN go build -ldflags="-s -w" -o app .
+# generate easyjson and quicktemplate code
+RUN go generate -x ./...
+
+RUN GOAMD64=v3 go build -ldflags="-s -w" -o app .
 
 
 EXPOSE 8080
 EXPOSE 8080
 
 
-CMD ./app -db mgo -prefork -db_connection_string "tfb-database"
+CMD ./app -db mgo -db_connection_string "tfb-database" -prefork

+ 5 - 6
frameworks/Go/go-std/go-mgo.dockerfile

@@ -1,16 +1,15 @@
-FROM golang:1.14
+FROM docker.io/golang:1.19
 
 
-ENV GO111MODULE on
 WORKDIR /go-std
 WORKDIR /go-std
 
 
 COPY ./src /go-std
 COPY ./src /go-std
 
 
-RUN go get github.com/valyala/quicktemplate/qtc
-RUN go get -u github.com/mailru/easyjson/...
 RUN go mod download
 RUN go mod download
 
 
-RUN go generate ./templates
-RUN go build -ldflags="-s -w" -o app .
+# generate easyjson and quicktemplate code
+RUN go generate -x ./...
+
+RUN GOAMD64=v3 go build -ldflags="-s -w" -o app .
 
 
 EXPOSE 8080
 EXPOSE 8080
 
 

+ 6 - 8
frameworks/Go/go-std/go-my-prefork.dockerfile

@@ -1,18 +1,16 @@
-FROM golang:1.14
+FROM docker.io/golang:1.19
 
 
-ENV GO111MODULE on
 WORKDIR /go-std
 WORKDIR /go-std
 
 
 COPY ./src /go-std
 COPY ./src /go-std
 
 
-RUN go get github.com/valyala/quicktemplate/qtc
-RUN go get -u github.com/mailru/easyjson/...
 RUN go mod download
 RUN go mod download
 
 
-RUN go generate ./templates
-RUN easyjson -pkg
-RUN go build -ldflags="-s -w" -o app .
+# generate easyjson and quicktemplate code
+RUN go generate -x ./...
+
+RUN GOAMD64=v3 go build -ldflags="-s -w" -o app .
 
 
 EXPOSE 8080
 EXPOSE 8080
 
 
-CMD ./app -db mysql -prefork -db_connection_string "benchmarkdbuser:benchmarkdbpass@tcp(tfb-database:3306)/hello_world?interpolateParams=true"
+CMD ./app -db mysql -db_connection_string "benchmarkdbuser:benchmarkdbpass@tcp(tfb-database:3306)/hello_world?interpolateParams=true" -prefork

+ 5 - 7
frameworks/Go/go-std/go-my.dockerfile

@@ -1,17 +1,15 @@
-FROM golang:1.14
+FROM docker.io/golang:1.19
 
 
-ENV GO111MODULE on
 WORKDIR /go-std
 WORKDIR /go-std
 
 
 COPY ./src /go-std
 COPY ./src /go-std
 
 
-RUN go get github.com/valyala/quicktemplate/qtc
-RUN go get -u github.com/mailru/easyjson/...
 RUN go mod download
 RUN go mod download
 
 
-RUN go generate ./templates
-RUN easyjson -pkg
-RUN go build -ldflags="-s -w" -o app .
+# generate easyjson and quicktemplate code
+RUN go generate -x ./...
+
+RUN GOAMD64=v3 go build -ldflags="-s -w" -o app .
 
 
 EXPOSE 8080
 EXPOSE 8080
 
 

+ 5 - 7
frameworks/Go/go-std/go-pgx-easyjson.dockerfile

@@ -1,17 +1,15 @@
-FROM golang:1.14
+FROM docker.io/golang:1.19
 
 
-ENV GO111MODULE on
 WORKDIR /go-std
 WORKDIR /go-std
 
 
 COPY ./src /go-std
 COPY ./src /go-std
 
 
-RUN go get github.com/valyala/quicktemplate/qtc
-RUN go get -u github.com/mailru/easyjson/...
 RUN go mod download
 RUN go mod download
 
 
-RUN go generate ./templates
-RUN easyjson -pkg
-RUN go build -ldflags="-s -w" -o app .
+# generate easyjson and quicktemplate code
+RUN go generate -x ./...
+
+RUN GOAMD64=v3 go build -ldflags="-s -w" -o app .
 
 
 EXPOSE 8080
 EXPOSE 8080
 
 

+ 5 - 7
frameworks/Go/go-std/go-pgx-prefork-easyjson.dockerfile

@@ -1,17 +1,15 @@
-FROM golang:1.14
+FROM docker.io/golang:1.19
 
 
-ENV GO111MODULE on
 WORKDIR /go-std
 WORKDIR /go-std
 
 
 COPY ./src /go-std
 COPY ./src /go-std
 
 
-RUN go get github.com/valyala/quicktemplate/qtc
-RUN go get -u github.com/mailru/easyjson/...
 RUN go mod download
 RUN go mod download
 
 
-RUN go generate ./templates
-RUN easyjson -pkg
-RUN go build -ldflags="-s -w" -o app .
+# generate easyjson and quicktemplate code
+RUN go generate -x ./...
+
+RUN GOAMD64=v3 go build -ldflags="-s -w" -o app .
 
 
 EXPOSE 8080
 EXPOSE 8080
 
 

+ 8 - 7
frameworks/Go/go-std/go-pgx-prefork-quicktemplate.dockerfile

@@ -1,17 +1,18 @@
-FROM golang:1.14
+FROM docker.io/golang:1.19
 
 
-ENV GO111MODULE on
 WORKDIR /go-std
 WORKDIR /go-std
 
 
 COPY ./src /go-std
 COPY ./src /go-std
 
 
-RUN go get github.com/valyala/quicktemplate/qtc
-RUN go get -u github.com/mailru/easyjson/...
 RUN go mod download
 RUN go mod download
 
 
-RUN go generate ./templates
-RUN easyjson -pkg
-RUN go build -ldflags="-s -w" -o app .
+# next line intentionnaly commented to prevent generating easyjson code:
+# RUN go generate -x ./...
+
+# generate only quicktempalte code:
+RUN go generate -x ./templates
+
+RUN GOAMD64=v3 go build -ldflags="-s -w" -o app .
 
 
 EXPOSE 8080
 EXPOSE 8080
 
 

+ 8 - 7
frameworks/Go/go-std/go-pgx-prefork.dockerfile

@@ -1,17 +1,18 @@
-FROM golang:1.14
+FROM docker.io/golang:1.19
 
 
-ENV GO111MODULE on
 WORKDIR /go-std
 WORKDIR /go-std
 
 
 COPY ./src /go-std
 COPY ./src /go-std
 
 
-RUN go get github.com/valyala/quicktemplate/qtc
-RUN go get -u github.com/mailru/easyjson/...
 RUN go mod download
 RUN go mod download
 
 
-RUN go generate ./templates
-RUN easyjson -pkg
-RUN go build -ldflags="-s -w" -o app .
+# next line intentionnaly commented to prevent generating easyjson code:
+# RUN go generate -x ./...
+
+# generate only quicktempalte code:
+RUN go generate -x ./templates
+
+RUN GOAMD64=v3 go build -ldflags="-s -w" -o app .
 
 
 EXPOSE 8080
 EXPOSE 8080
 
 

+ 8 - 7
frameworks/Go/go-std/go-pgx-quicktemplate.dockerfile

@@ -1,17 +1,18 @@
-FROM golang:1.14
+FROM docker.io/golang:1.19
 
 
-ENV GO111MODULE on
 WORKDIR /go-std
 WORKDIR /go-std
 
 
 COPY ./src /go-std
 COPY ./src /go-std
 
 
-RUN go get github.com/valyala/quicktemplate/qtc
-RUN go get -u github.com/mailru/easyjson/...
 RUN go mod download
 RUN go mod download
 
 
-RUN go generate ./templates
-RUN easyjson -pkg
-RUN go build -ldflags="-s -w" -o app .
+# next line intentionnaly commented to prevent generating easyjson code:
+# RUN go generate -x ./...
+
+# generate only quicktempalte code:
+RUN go generate -x ./templates
+
+RUN GOAMD64=v3 go build -ldflags="-s -w" -o app .
 
 
 EXPOSE 8080
 EXPOSE 8080
 
 

+ 8 - 7
frameworks/Go/go-std/go-pgx.dockerfile

@@ -1,17 +1,18 @@
-FROM golang:1.14
+FROM docker.io/golang:1.19
 
 
-ENV GO111MODULE on
 WORKDIR /go-std
 WORKDIR /go-std
 
 
 COPY ./src /go-std
 COPY ./src /go-std
 
 
-RUN go get github.com/valyala/quicktemplate/qtc
-RUN go get -u github.com/mailru/easyjson/...
 RUN go mod download
 RUN go mod download
 
 
-RUN go generate ./templates
-RUN easyjson -pkg
-RUN go build -ldflags="-s -w" -o app .
+# next line intentionnaly commented to prevent generating easyjson code:
+# RUN go generate -x ./...
+
+# generate only quicktempalte code:
+RUN go generate -x ./templates
+
+RUN GOAMD64=v3 go build -ldflags="-s -w" -o app .
 
 
 EXPOSE 8080
 EXPOSE 8080
 
 

+ 5 - 7
frameworks/Go/go-std/go.dockerfile

@@ -1,17 +1,15 @@
-FROM golang:1.14
+FROM docker.io/golang:1.19
 
 
-ENV GO111MODULE on
 WORKDIR /go-std
 WORKDIR /go-std
 
 
 COPY ./src /go-std
 COPY ./src /go-std
 
 
-RUN go get github.com/valyala/quicktemplate/qtc
-RUN go get -u github.com/mailru/easyjson/...
 RUN go mod download
 RUN go mod download
 
 
-RUN go generate ./templates
-RUN easyjson -pkg
-RUN go build -ldflags="-s -w" -o app .
+# generate easyjson and quicktemplate code
+RUN go generate -x ./...
+
+RUN GOAMD64=v3 go build -ldflags="-s -w" -o app .
 
 
 EXPOSE 8080
 EXPOSE 8080
 
 

+ 23 - 14
frameworks/Go/go-std/src/go.mod

@@ -1,19 +1,28 @@
-module go-std/src
+module go-std/app
+
+go 1.19
+
+require (
+	github.com/go-sql-driver/mysql v1.6.0
+	github.com/jackc/pgx v3.6.2+incompatible
+	github.com/mailru/easyjson v0.7.7
+	github.com/valyala/quicktemplate v1.7.0
+	gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22
+)
 
 
 require (
 require (
 	github.com/cockroachdb/apd v1.1.0 // indirect
 	github.com/cockroachdb/apd v1.1.0 // indirect
-	github.com/go-sql-driver/mysql v1.4.1
+	github.com/gofrs/uuid v4.3.0+incompatible // indirect
 	github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 // indirect
 	github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 // indirect
-	github.com/jackc/pgx v3.3.0+incompatible
-	github.com/kr/pretty v0.1.0 // indirect
-	github.com/lib/pq v1.0.0 // indirect
-	github.com/mailru/easyjson v0.0.0-20190221075403-6243d8e04c3f
-	github.com/pkg/errors v0.8.1 // indirect
-	github.com/satori/go.uuid v1.2.0 // indirect
-	github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24 // indirect
-	github.com/valyala/quicktemplate v1.0.2
-	google.golang.org/appengine v1.4.0 // indirect
-	gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
-	gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce
-	gopkg.in/yaml.v2 v2.2.2 // indirect
+	github.com/josharian/intern v1.0.0 // indirect
+	github.com/kr/pretty v0.3.0 // indirect
+	github.com/lib/pq v1.10.7 // indirect
+	github.com/pkg/errors v0.9.1 // indirect
+	github.com/rogpeppe/go-internal v1.9.0 // indirect
+	github.com/shopspring/decimal v1.3.1 // indirect
+	github.com/valyala/bytebufferpool v1.0.0 // indirect
+	golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 // indirect
+	golang.org/x/text v0.3.7 // indirect
+	gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
+	gopkg.in/yaml.v2 v2.4.0 // indirect
 )
 )

+ 55 - 31
frameworks/Go/go-std/src/go.sum

@@ -1,42 +1,66 @@
+github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y=
+github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
 github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I=
 github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I=
 github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
 github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
-github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA=
-github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
-github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
+github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
+github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
+github.com/gofrs/uuid v4.3.0+incompatible h1:CaSVZxm5B+7o45rtab4jC2G37WGYX1zQfuU2i6DSvnc=
+github.com/gofrs/uuid v4.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
+github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 h1:vr3AYkKovP8uR8AvSGGUK1IDqRa5lAAvEkZG1LKaCRc=
 github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 h1:vr3AYkKovP8uR8AvSGGUK1IDqRa5lAAvEkZG1LKaCRc=
 github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ=
 github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ=
-github.com/jackc/pgx v3.3.0+incompatible h1:Wa90/+qsITBAPkAZjiByeIGHFcj3Ztu+VzrrIpHjL90=
-github.com/jackc/pgx v3.3.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I=
-github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
-github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
-github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
+github.com/jackc/pgx v3.6.2+incompatible h1:2zP5OD7kiyR3xzRYMhOcXVvkDZsImVXfj+yIyTQf3/o=
+github.com/jackc/pgx v3.6.2+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I=
+github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
+github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
+github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
+github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
+github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
-github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
-github.com/lib/pq v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A=
-github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
-github.com/mailru/easyjson v0.0.0-20190221075403-6243d8e04c3f h1:B6PQkurxGG1rqEX96oE14gbj8bqvYC5dtks9r5uGmlE=
-github.com/mailru/easyjson v0.0.0-20190221075403-6243d8e04c3f/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
-github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
-github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
-github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
-github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24 h1:pntxY8Ary0t43dCZ5dqY4YTJCObLY1kIXl0uzMv+7DE=
-github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw=
+github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
+github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
+github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
+github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
+github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
+github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8=
+github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
 github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
 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/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
-github.com/valyala/fasthttp v0.0.0-20180905170723-c6fd90e432cc/go.mod h1:+g/po7GqyG5E+1CNgquiIxJnsXEi5vwFn5weFujbO78=
-github.com/valyala/quicktemplate v1.0.2 h1:ZeVRKan1W/25u5f9ilDo5HWtdxD+QxR10WrZwxqLM54=
-github.com/valyala/quicktemplate v1.0.2/go.mod h1:KZAB+RlYlfNtBUGQMzIrnE8uuNgD2SbUn5CpZyod0sk=
-golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508=
-google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+github.com/valyala/fasthttp v1.30.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus=
+github.com/valyala/quicktemplate v1.7.0 h1:LUPTJmlVcb46OOUY3IeD9DojFpAVbsG+5WFTcjMJzCM=
+github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8=
+github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc=
+golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
+golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 h1:Y/gsMcFOcR+6S6f3YeMKl5g+dZMEWqcz5Czj/GWYbkM=
+golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce h1:xcEWjVhvbDy+nHP67nPDDpbYrY+ILlfndk4bRioVHaU=
-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=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 h1:VpOs+IwYnYBaFnrNAeB8UUWtL3vEUnzSCL1nVjPhqrw=
+gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=

+ 2 - 2
frameworks/Go/go-std/src/handlers/handlers.go

@@ -7,8 +7,8 @@ import (
 	"sort"
 	"sort"
 	"strconv"
 	"strconv"
 
 
-	"go-std/src/storage"
-	"go-std/src/templates"
+	"go-std/app/storage"
+	"go-std/app/templates"
 )
 )
 
 
 func queriesParam(r *http.Request) int {
 func queriesParam(r *http.Request) int {

+ 1 - 1
frameworks/Go/go-std/src/handlers/handlers_easyjson.go

@@ -4,7 +4,7 @@ import (
 	"log"
 	"log"
 	"net/http"
 	"net/http"
 
 
-	"go-std/src/storage"
+	"go-std/app/storage"
 
 
 	"github.com/mailru/easyjson"
 	"github.com/mailru/easyjson"
 )
 )

+ 2 - 0
frameworks/Go/go-std/src/handlers/message.go

@@ -1,5 +1,7 @@
 package handlers
 package handlers
 
 
+//go:generate go run github.com/mailru/easyjson/... -all -disable_members_unescape ${GOFILE}
+
 import "sync"
 import "sync"
 
 
 // Message struct
 // Message struct

+ 8 - 14
frameworks/Go/go-std/src/handlers/message_easyjson.go

@@ -4,7 +4,6 @@ package handlers
 
 
 import (
 import (
 	json "encoding/json"
 	json "encoding/json"
-
 	easyjson "github.com/mailru/easyjson"
 	easyjson "github.com/mailru/easyjson"
 	jlexer "github.com/mailru/easyjson/jlexer"
 	jlexer "github.com/mailru/easyjson/jlexer"
 	jwriter "github.com/mailru/easyjson/jwriter"
 	jwriter "github.com/mailru/easyjson/jwriter"
@@ -18,7 +17,7 @@ var (
 	_ easyjson.Marshaler
 	_ easyjson.Marshaler
 )
 )
 
 
-func easyjson89aae3efDecodeGoStdSrc(in *jlexer.Lexer, out *Message) {
+func easyjson4086215fDecodeGoStdSrcHandlers(in *jlexer.Lexer, out *Message) {
 	isTopLevel := in.IsStart()
 	isTopLevel := in.IsStart()
 	if in.IsNull() {
 	if in.IsNull() {
 		if isTopLevel {
 		if isTopLevel {
@@ -29,7 +28,7 @@ func easyjson89aae3efDecodeGoStdSrc(in *jlexer.Lexer, out *Message) {
 	}
 	}
 	in.Delim('{')
 	in.Delim('{')
 	for !in.IsDelim('}') {
 	for !in.IsDelim('}') {
-		key := in.UnsafeString()
+		key := in.UnsafeFieldName(true)
 		in.WantColon()
 		in.WantColon()
 		if in.IsNull() {
 		if in.IsNull() {
 			in.Skip()
 			in.Skip()
@@ -49,18 +48,13 @@ func easyjson89aae3efDecodeGoStdSrc(in *jlexer.Lexer, out *Message) {
 		in.Consumed()
 		in.Consumed()
 	}
 	}
 }
 }
-func easyjson89aae3efEncodeGoStdSrc(out *jwriter.Writer, in Message) {
+func easyjson4086215fEncodeGoStdSrcHandlers(out *jwriter.Writer, in Message) {
 	out.RawByte('{')
 	out.RawByte('{')
 	first := true
 	first := true
 	_ = first
 	_ = first
 	{
 	{
 		const prefix string = ",\"message\":"
 		const prefix string = ",\"message\":"
-		if first {
-			first = false
-			out.RawString(prefix[1:])
-		} else {
-			out.RawString(prefix)
-		}
+		out.RawString(prefix[1:])
 		out.String(string(in.Message))
 		out.String(string(in.Message))
 	}
 	}
 	out.RawByte('}')
 	out.RawByte('}')
@@ -69,23 +63,23 @@ func easyjson89aae3efEncodeGoStdSrc(out *jwriter.Writer, in Message) {
 // MarshalJSON supports json.Marshaler interface
 // MarshalJSON supports json.Marshaler interface
 func (v Message) MarshalJSON() ([]byte, error) {
 func (v Message) MarshalJSON() ([]byte, error) {
 	w := jwriter.Writer{}
 	w := jwriter.Writer{}
-	easyjson89aae3efEncodeGoStdSrc(&w, v)
+	easyjson4086215fEncodeGoStdSrcHandlers(&w, v)
 	return w.Buffer.BuildBytes(), w.Error
 	return w.Buffer.BuildBytes(), w.Error
 }
 }
 
 
 // MarshalEasyJSON supports easyjson.Marshaler interface
 // MarshalEasyJSON supports easyjson.Marshaler interface
 func (v Message) MarshalEasyJSON(w *jwriter.Writer) {
 func (v Message) MarshalEasyJSON(w *jwriter.Writer) {
-	easyjson89aae3efEncodeGoStdSrc(w, v)
+	easyjson4086215fEncodeGoStdSrcHandlers(w, v)
 }
 }
 
 
 // UnmarshalJSON supports json.Unmarshaler interface
 // UnmarshalJSON supports json.Unmarshaler interface
 func (v *Message) UnmarshalJSON(data []byte) error {
 func (v *Message) UnmarshalJSON(data []byte) error {
 	r := jlexer.Lexer{Data: data}
 	r := jlexer.Lexer{Data: data}
-	easyjson89aae3efDecodeGoStdSrc(&r, v)
+	easyjson4086215fDecodeGoStdSrcHandlers(&r, v)
 	return r.Error()
 	return r.Error()
 }
 }
 
 
 // UnmarshalEasyJSON supports easyjson.Unmarshaler interface
 // UnmarshalEasyJSON supports easyjson.Unmarshaler interface
 func (v *Message) UnmarshalEasyJSON(l *jlexer.Lexer) {
 func (v *Message) UnmarshalEasyJSON(l *jlexer.Lexer) {
-	easyjson89aae3efDecodeGoStdSrc(l, v)
+	easyjson4086215fDecodeGoStdSrcHandlers(l, v)
 }
 }

+ 3 - 3
frameworks/Go/go-std/src/main.go

@@ -7,9 +7,9 @@ import (
 	"net/http"
 	"net/http"
 	"runtime"
 	"runtime"
 
 
-	"go-std/src/handlers"
-	"go-std/src/storage"
-	"go-std/src/templates"
+	"go-std/app/handlers"
+	"go-std/app/storage"
+	"go-std/app/templates"
 )
 )
 
 
 func initSyncPools() {
 func initSyncPools() {

+ 1 - 1
frameworks/Go/go-std/src/storage/db.go

@@ -4,7 +4,7 @@ import (
 	"errors"
 	"errors"
 	"fmt"
 	"fmt"
 
 
-	"go-std/src/templates"
+	"go-std/app/templates"
 )
 )
 
 
 const (
 const (

+ 1 - 1
frameworks/Go/go-std/src/storage/mgo.go

@@ -5,7 +5,7 @@ import (
 	"log"
 	"log"
 	"math/rand"
 	"math/rand"
 
 
-	"go-std/src/templates"
+	"go-std/app/templates"
 
 
 	mgo "gopkg.in/mgo.v2"
 	mgo "gopkg.in/mgo.v2"
 	"gopkg.in/mgo.v2/bson"
 	"gopkg.in/mgo.v2/bson"

+ 1 - 1
frameworks/Go/go-std/src/storage/mysql.go

@@ -7,7 +7,7 @@ import (
 	"math/rand"
 	"math/rand"
 	"sort"
 	"sort"
 
 
-	"go-std/src/templates"
+	"go-std/app/templates"
 
 
 	_ "github.com/go-sql-driver/mysql" // postgresql import
 	_ "github.com/go-sql-driver/mysql" // postgresql import
 )
 )

+ 1 - 1
frameworks/Go/go-std/src/storage/pgx.go

@@ -6,7 +6,7 @@ import (
 	"math/rand"
 	"math/rand"
 	"sort"
 	"sort"
 
 
-	"go-std/src/templates"
+	"go-std/app/templates"
 
 
 	"github.com/jackc/pgx"
 	"github.com/jackc/pgx"
 )
 )

+ 1 - 1
frameworks/Go/go-std/src/storage/pq.go

@@ -7,7 +7,7 @@ package storage
 // 	"math/rand"
 // 	"math/rand"
 // 	"sort"
 // 	"sort"
 
 
-// 	"go-std/src/templates"
+// 	"go-std/app/templates"
 
 
 // 	_ "github.com/lib/pq" // postgresql import
 // 	_ "github.com/lib/pq" // postgresql import
 // )
 // )

+ 2 - 0
frameworks/Go/go-std/src/storage/world.go

@@ -1,5 +1,7 @@
 package storage
 package storage
 
 
+//go:generate go run github.com/mailru/easyjson/... -all -disable_members_unescape ${GOFILE}
+
 import "sync"
 import "sync"
 
 
 //easyjson:json
 //easyjson:json

+ 3 - 14
frameworks/Go/go-std/src/storage/world_easyjson.go

@@ -4,7 +4,6 @@ package storage
 
 
 import (
 import (
 	json "encoding/json"
 	json "encoding/json"
-
 	easyjson "github.com/mailru/easyjson"
 	easyjson "github.com/mailru/easyjson"
 	jlexer "github.com/mailru/easyjson/jlexer"
 	jlexer "github.com/mailru/easyjson/jlexer"
 	jwriter "github.com/mailru/easyjson/jwriter"
 	jwriter "github.com/mailru/easyjson/jwriter"
@@ -95,7 +94,7 @@ func easyjson4da0dabeDecodeGoStdSrcStorage1(in *jlexer.Lexer, out *World) {
 	}
 	}
 	in.Delim('{')
 	in.Delim('{')
 	for !in.IsDelim('}') {
 	for !in.IsDelim('}') {
-		key := in.UnsafeString()
+		key := in.UnsafeFieldName(true)
 		in.WantColon()
 		in.WantColon()
 		if in.IsNull() {
 		if in.IsNull() {
 			in.Skip()
 			in.Skip()
@@ -123,22 +122,12 @@ func easyjson4da0dabeEncodeGoStdSrcStorage1(out *jwriter.Writer, in World) {
 	_ = first
 	_ = first
 	{
 	{
 		const prefix string = ",\"id\":"
 		const prefix string = ",\"id\":"
-		if first {
-			first = false
-			out.RawString(prefix[1:])
-		} else {
-			out.RawString(prefix)
-		}
+		out.RawString(prefix[1:])
 		out.Int(int(in.ID))
 		out.Int(int(in.ID))
 	}
 	}
 	{
 	{
 		const prefix string = ",\"randomnumber\":"
 		const prefix string = ",\"randomnumber\":"
-		if first {
-			first = false
-			out.RawString(prefix[1:])
-		} else {
-			out.RawString(prefix)
-		}
+		out.RawString(prefix)
 		out.Int(int(in.RandomNumber))
 		out.Int(int(in.RandomNumber))
 	}
 	}
 	out.RawByte('}')
 	out.RawByte('}')

+ 3 - 1
frameworks/Go/go-std/src/templates/fortune.go

@@ -5,7 +5,9 @@ import (
 	"sync"
 	"sync"
 )
 )
 
 
-//go:generate qtc
+//go:generate go run github.com/valyala/quicktemplate/qtc
+
+//go:generate go run github.com/mailru/easyjson/... -all -disable_members_unescape ${GOFILE}
 
 
 const (
 const (
 	fortuneHTML = `<!DOCTYPE html>
 	fortuneHTML = `<!DOCTYPE html>

+ 3 - 7
frameworks/Go/go-std/src/templates/fortune_easyjson.go

@@ -28,7 +28,7 @@ func easyjson2f1218d5DecodeGoStdSrcTemplates(in *jlexer.Lexer, out *Fortune) {
 	}
 	}
 	in.Delim('{')
 	in.Delim('{')
 	for !in.IsDelim('}') {
 	for !in.IsDelim('}') {
-		key := in.UnsafeString()
+		key := in.UnsafeFieldName(true)
 		in.WantColon()
 		in.WantColon()
 		if in.IsNull() {
 		if in.IsNull() {
 			in.Skip()
 			in.Skip()
@@ -56,12 +56,8 @@ func easyjson2f1218d5EncodeGoStdSrcTemplates(out *jwriter.Writer, in Fortune) {
 	_ = first
 	_ = first
 	if in.ID != 0 {
 	if in.ID != 0 {
 		const prefix string = ",\"id\":"
 		const prefix string = ",\"id\":"
-		if first {
-			first = false
-			out.RawString(prefix[1:])
-		} else {
-			out.RawString(prefix)
-		}
+		first = false
+		out.RawString(prefix[1:])
 		out.Int(int(in.ID))
 		out.Int(int(in.ID))
 	}
 	}
 	if in.Message != "" {
 	if in.Message != "" {

+ 18 - 18
frameworks/Go/go-std/src/templates/fortunes.qtpl.go

@@ -1,4 +1,4 @@
-// This file is automatically generated by qtc from "fortunes.qtpl".
+// Code generated by qtc from "fortunes.qtpl". DO NOT EDIT.
 // See https://github.com/valyala/quicktemplate for details.
 // See https://github.com/valyala/quicktemplate for details.
 
 
 //line fortunes.qtpl:1
 //line fortunes.qtpl:1
@@ -19,7 +19,7 @@ var (
 
 
 //line fortunes.qtpl:1
 //line fortunes.qtpl:1
 func StreamFortunePage(qw422016 *qt422016.Writer, rows []Fortune) {
 func StreamFortunePage(qw422016 *qt422016.Writer, rows []Fortune) {
-	//line fortunes.qtpl:1
+//line fortunes.qtpl:1
 	qw422016.N().S(`<!DOCTYPE html>
 	qw422016.N().S(`<!DOCTYPE html>
 <html>
 <html>
 <head>
 <head>
@@ -29,23 +29,23 @@ func StreamFortunePage(qw422016 *qt422016.Writer, rows []Fortune) {
 <table>
 <table>
 <tr><th>id</th><th>message</th></tr>
 <tr><th>id</th><th>message</th></tr>
 `)
 `)
-	//line fortunes.qtpl:9
+//line fortunes.qtpl:9
 	for _, r := range rows {
 	for _, r := range rows {
-		//line fortunes.qtpl:9
+//line fortunes.qtpl:9
 		qw422016.N().S(`
 		qw422016.N().S(`
 <tr><td>`)
 <tr><td>`)
-		//line fortunes.qtpl:10
+//line fortunes.qtpl:10
 		qw422016.N().D(int(r.ID))
 		qw422016.N().D(int(r.ID))
-		//line fortunes.qtpl:10
+//line fortunes.qtpl:10
 		qw422016.N().S(`</td><td>`)
 		qw422016.N().S(`</td><td>`)
-		//line fortunes.qtpl:10
+//line fortunes.qtpl:10
 		qw422016.E().S(r.Message)
 		qw422016.E().S(r.Message)
-		//line fortunes.qtpl:10
+//line fortunes.qtpl:10
 		qw422016.N().S(`</td></tr>
 		qw422016.N().S(`</td></tr>
 `)
 `)
-		//line fortunes.qtpl:11
+//line fortunes.qtpl:11
 	}
 	}
-	//line fortunes.qtpl:11
+//line fortunes.qtpl:11
 	qw422016.N().S(`
 	qw422016.N().S(`
 </table>
 </table>
 </body>
 </body>
@@ -56,26 +56,26 @@ func StreamFortunePage(qw422016 *qt422016.Writer, rows []Fortune) {
 
 
 //line fortunes.qtpl:15
 //line fortunes.qtpl:15
 func WriteFortunePage(qq422016 qtio422016.Writer, rows []Fortune) {
 func WriteFortunePage(qq422016 qtio422016.Writer, rows []Fortune) {
-	//line fortunes.qtpl:15
+//line fortunes.qtpl:15
 	qw422016 := qt422016.AcquireWriter(qq422016)
 	qw422016 := qt422016.AcquireWriter(qq422016)
-	//line fortunes.qtpl:15
+//line fortunes.qtpl:15
 	StreamFortunePage(qw422016, rows)
 	StreamFortunePage(qw422016, rows)
-	//line fortunes.qtpl:15
+//line fortunes.qtpl:15
 	qt422016.ReleaseWriter(qw422016)
 	qt422016.ReleaseWriter(qw422016)
 //line fortunes.qtpl:15
 //line fortunes.qtpl:15
 }
 }
 
 
 //line fortunes.qtpl:15
 //line fortunes.qtpl:15
 func FortunePage(rows []Fortune) string {
 func FortunePage(rows []Fortune) string {
-	//line fortunes.qtpl:15
+//line fortunes.qtpl:15
 	qb422016 := qt422016.AcquireByteBuffer()
 	qb422016 := qt422016.AcquireByteBuffer()
-	//line fortunes.qtpl:15
+//line fortunes.qtpl:15
 	WriteFortunePage(qb422016, rows)
 	WriteFortunePage(qb422016, rows)
-	//line fortunes.qtpl:15
+//line fortunes.qtpl:15
 	qs422016 := string(qb422016.B)
 	qs422016 := string(qb422016.B)
-	//line fortunes.qtpl:15
+//line fortunes.qtpl:15
 	qt422016.ReleaseByteBuffer(qb422016)
 	qt422016.ReleaseByteBuffer(qb422016)
-	//line fortunes.qtpl:15
+//line fortunes.qtpl:15
 	return qs422016
 	return qs422016
 //line fortunes.qtpl:15
 //line fortunes.qtpl:15
 }
 }