mirror of
https://github.com/acaloiaro/newsbox
synced 2026-07-21 10:12:26 +00:00
Initial commit
This commit is contained in:
commit
8ae801ae5f
120 changed files with 23132 additions and 0 deletions
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
bin
|
||||
tmp
|
||||
node_modules
|
||||
44
Dockerfile
Normal file
44
Dockerfile
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
# This is a multi-stage Dockerfile and requires >= Docker 17.05
|
||||
# https://docs.docker.com/engine/userguide/eng-image/multistage-build/
|
||||
FROM gobuffalo/buffalo:v0.18.7 as builder
|
||||
|
||||
ENV GOPROXY http://proxy.golang.org
|
||||
|
||||
RUN mkdir -p /src/github.com/zenitylabs/newsbox
|
||||
WORKDIR /src/github.com/zenitylabs/newsbox
|
||||
|
||||
# this will cache the npm install step, unless package.json changes
|
||||
ADD package.json .
|
||||
ADD yarn.lock .yarnrc.yml ./
|
||||
RUN mkdir .yarn
|
||||
COPY .yarn .yarn
|
||||
RUN yarn install
|
||||
# Copy the Go Modules manifests
|
||||
COPY go.mod go.mod
|
||||
COPY go.sum go.sum
|
||||
# cache deps before building and copying source so that we don't need to re-download as much
|
||||
# and so that source changes don't invalidate our downloaded layer
|
||||
RUN go mod download
|
||||
|
||||
ADD . .
|
||||
RUN buffalo build --static -o /bin/app
|
||||
|
||||
FROM alpine
|
||||
RUN apk add --no-cache bash
|
||||
RUN apk add --no-cache ca-certificates
|
||||
|
||||
WORKDIR /bin/
|
||||
|
||||
COPY --from=builder /bin/app .
|
||||
|
||||
# Uncomment to run the binary in "production" mode:
|
||||
# ENV GO_ENV=production
|
||||
|
||||
# Bind the app to 0.0.0.0 so it can be seen from outside the container
|
||||
ENV ADDR=0.0.0.0
|
||||
|
||||
EXPOSE 3000
|
||||
|
||||
# Uncomment to run the migrations before running the binary:
|
||||
# CMD /bin/app migrate; /bin/app
|
||||
CMD exec /bin/app
|
||||
29
README.md
Normal file
29
README.md
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
# Newsbox
|
||||
|
||||
Newsbox provides a dedicated email address to put you in control of how you receive email.
|
||||
|
||||
With newsletter platforms like Substack on the rise, and newsletter powerhouses like Morning Brew expanding their offerings, we often find ourselves with the mixed feeling of not wanting to give our personal email addresses to yet another list, but wanting to subscribe to high quality content.
|
||||
|
||||
Newsbox is an open source solution to meet those seemingly conflicting needs.
|
||||
|
||||
Either spin up your own instance, or sign up to a hosted instance like https://newsbox.email
|
||||
|
||||
# Features & Goals
|
||||
|
||||
[x] Subscribe to email newsletters without your personal email address
|
||||
|
||||
[x] Define *when* you want to receive newsletter emails every day
|
||||
|
||||
[x] Be self-hostable
|
||||
|
||||
[ ] Digest of all mail for the day
|
||||
|
||||
[ ] Block/Pause/Resume mail from chosen senders
|
||||
|
||||
[ ] Provide a curated list of newsletters that can be subscribed to within the interface
|
||||
|
||||
[ ] Provide user-controlled Unsusbcribe functionality
|
||||
|
||||
## Setup
|
||||
|
||||
This is a work in progress and documentation is forthcoming.
|
||||
24
actions/actions_test.go
Normal file
24
actions/actions_test.go
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
package actions
|
||||
|
||||
import (
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/gobuffalo/suite/v4"
|
||||
)
|
||||
|
||||
type ActionSuite struct {
|
||||
*suite.Action
|
||||
}
|
||||
|
||||
func Test_ActionSuite(t *testing.T) {
|
||||
action, err := suite.NewActionWithFixtures(App(), os.DirFS("../fixtures"))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
as := &ActionSuite{
|
||||
Action: action,
|
||||
}
|
||||
suite.Run(t, as)
|
||||
}
|
||||
178
actions/app.go
Normal file
178
actions/app.go
Normal file
|
|
@ -0,0 +1,178 @@
|
|||
package actions
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
|
||||
"newsbox/internal"
|
||||
"newsbox/locales"
|
||||
"newsbox/models"
|
||||
"newsbox/public"
|
||||
|
||||
"github.com/gobuffalo/buffalo"
|
||||
"github.com/gobuffalo/buffalo-pop/v3/pop/popmw"
|
||||
"github.com/gobuffalo/envy"
|
||||
csrf "github.com/gobuffalo/mw-csrf"
|
||||
i18n "github.com/gobuffalo/mw-i18n/v2"
|
||||
paramlogger "github.com/gobuffalo/mw-paramlogger"
|
||||
"github.com/gobuffalo/pop/v6"
|
||||
"github.com/gofrs/uuid"
|
||||
"github.com/markbates/goth/gothic"
|
||||
)
|
||||
|
||||
// ENV is used to help switch settings based on where the
|
||||
// application is being run. Default is "development".
|
||||
var ENV = envy.Get("GO_ENV", "development")
|
||||
|
||||
var (
|
||||
app *buffalo.App
|
||||
T *i18n.Translator
|
||||
)
|
||||
|
||||
func App() *buffalo.App {
|
||||
if app == nil {
|
||||
app = buffalo.New(buffalo.Options{
|
||||
Env: ENV,
|
||||
SessionName: "_newsbox_session",
|
||||
})
|
||||
|
||||
// Log request parameters (filters apply).
|
||||
app.Use(paramlogger.ParameterLogger)
|
||||
|
||||
// Protect against CSRF attacks. https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)
|
||||
// Remove to disable this.
|
||||
cs := csrf.New
|
||||
app.Use(cs)
|
||||
|
||||
// Wraps each request in a transaction.
|
||||
// c.Value("tx").(*pop.Connection)
|
||||
// Remove to disable this.
|
||||
app.Use(popmw.Transaction(models.DB))
|
||||
|
||||
// Setup and use translations:
|
||||
app.Use(translations())
|
||||
|
||||
// Inject site-side template variables to be used in template
|
||||
app.Use(InjectSiteTemplateVariables)
|
||||
|
||||
// Inject critical flash messages
|
||||
app.Use(InjectFlashMessages)
|
||||
|
||||
// Inject a "tx" into th context for every request
|
||||
app.Use(popmw.Transaction(models.DB))
|
||||
|
||||
// Set the current user and require authorization
|
||||
app.Use(SetCurrentUser)
|
||||
app.Use(Authorize)
|
||||
|
||||
app.GET("/", HomeHandler)
|
||||
|
||||
// Authentication
|
||||
auth := app.Group("/login")
|
||||
auth.GET("/", LoginIndex)
|
||||
auth.POST("/", AuthUser)
|
||||
auth.Middleware.Skip(Authorize, LoginIndex, AuthUser)
|
||||
|
||||
// Logout
|
||||
app.GET("/logout", AuthLogout)
|
||||
|
||||
// Oauth
|
||||
oauth := app.Group("/oauth")
|
||||
app.Middleware.Skip(Authorize, HomeHandler)
|
||||
bah := buffalo.WrapHandlerFunc(gothic.BeginAuthHandler)
|
||||
oauth.Middleware.Skip(Authorize, bah, OauthCallback)
|
||||
oauth.GET("{provider}", bah)
|
||||
oauth.GET("{provider}/callback", OauthCallback)
|
||||
oauth.DELETE("", AuthLogout)
|
||||
|
||||
// User Registration
|
||||
users := app.Group("/users")
|
||||
users.GET("/new", UsersNew)
|
||||
users.POST("/", UsersCreate)
|
||||
users.Middleware.Remove(Authorize)
|
||||
|
||||
// Email verification
|
||||
email_verification := app.Group("/users/email_verification")
|
||||
email_verification.GET("/{email_verification_id}", UserEmailVerificationHandler)
|
||||
email_verification.Middleware.Remove(Authorize)
|
||||
|
||||
// Webhooks
|
||||
webhooks := app.Group("/webhooks")
|
||||
webhooks.Middleware.Remove(cs)
|
||||
webhooks.POST("/mailgun", MailgunWebhook)
|
||||
webhooks.Middleware.Remove(Authorize)
|
||||
|
||||
// Legal
|
||||
legal := app.Group("/legal")
|
||||
legal.GET("/tos", TOSHandler)
|
||||
legal.Middleware.Remove(Authorize)
|
||||
|
||||
// Profile
|
||||
profile := app.Group("/profile")
|
||||
profile.GET("/", ShowProfile)
|
||||
profile.GET("/edit", EditProfile)
|
||||
profile.POST("/update", UpdateProfile)
|
||||
profile.POST("/changepassword", UpdatePassword)
|
||||
|
||||
// Messages
|
||||
app.Resource("/messages", MessagesResource{})
|
||||
messages := app.Group("/messages")
|
||||
messages.GET("/{message_id}/content", MessagesResource{}.ShowContent)
|
||||
|
||||
app.ServeFiles("/", http.FS(public.FS())) // serve files from the public directory
|
||||
}
|
||||
|
||||
return app
|
||||
}
|
||||
|
||||
// translations will load locale files, set up the translator `actions.T`,
|
||||
// and will return a middleware to use to load the correct locale for each
|
||||
// request.
|
||||
// for more information: https://gobuffalo.io/en/docs/localization
|
||||
func translations() buffalo.MiddlewareFunc {
|
||||
var err error
|
||||
if T, err = i18n.New(locales.FS(), "en-US"); err != nil {
|
||||
app.Stop(err)
|
||||
}
|
||||
return T.Middleware()
|
||||
}
|
||||
|
||||
func InjectSiteTemplateVariables(next buffalo.Handler) buffalo.Handler {
|
||||
return func(c buffalo.Context) error {
|
||||
c.Set("site_domain", internal.SiteDomain())
|
||||
c.Set("site_name", internal.SiteName())
|
||||
c.Set("analytics_enabled", internal.AnalyticsEnabled())
|
||||
c.Set("analytics_enabled_self_hosting", internal.AnalyticsSelfHostingEnabled())
|
||||
c.Set("payments_enabled", internal.PaymentsEnabled())
|
||||
|
||||
err := next(c)
|
||||
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
func InjectFlashMessages(next buffalo.Handler) buffalo.Handler {
|
||||
return func(c buffalo.Context) error {
|
||||
if uid := c.Session().Get("current_user_id"); uid != nil {
|
||||
tx := c.Value("tx").(*pop.Connection)
|
||||
u := &models.User{}
|
||||
err := tx.EagerPreload().Find(u, uid)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if u.Email.Interface() == "" {
|
||||
c.Flash().Add("action_required", "Edit your profile and add an email address.")
|
||||
} else if u.EmailVerification.ID != uuid.Nil {
|
||||
c.Flash().Add("action_required", fmt.Sprintf("Account is pending email verification of: %s", u.Email.Interface()))
|
||||
} else {
|
||||
c.Flash().Delete("action_required")
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
err := next(c)
|
||||
|
||||
return err
|
||||
}
|
||||
}
|
||||
87
actions/auth.go
Normal file
87
actions/auth.go
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
package actions
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"newsbox/models"
|
||||
|
||||
"github.com/gobuffalo/buffalo"
|
||||
"github.com/gobuffalo/pop/v6"
|
||||
"github.com/gobuffalo/validate"
|
||||
"github.com/gofrs/uuid"
|
||||
"github.com/pkg/errors"
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
)
|
||||
|
||||
// AuthLogout handles session logouts
|
||||
func AuthLogout(c buffalo.Context) error {
|
||||
c.Session().Clear()
|
||||
c.Flash().Add("success", "You have been logged out")
|
||||
return c.Redirect(302, "/")
|
||||
}
|
||||
|
||||
// LoginIndex shows a landing page to login
|
||||
func LoginIndex(c buffalo.Context) error {
|
||||
c.Set("user", models.User{})
|
||||
return c.Render(200, r.HTML("auth/index.plush.html"))
|
||||
}
|
||||
|
||||
// AuthUser attempts to log the user in with an existing account using username and password
|
||||
func AuthUser(c buffalo.Context) error {
|
||||
u := &models.User{}
|
||||
c.Set("user", u)
|
||||
if err := c.Bind(u); err != nil {
|
||||
return errors.WithStack(err)
|
||||
}
|
||||
|
||||
tx := c.Value("tx").(*pop.Connection)
|
||||
|
||||
// find a user with the email
|
||||
emailStr := strings.ToLower(strings.TrimSpace(u.Email.Interface().(string)))
|
||||
err := tx.EagerPreload().Where("email = ?", emailStr).First(u)
|
||||
|
||||
// The user has a pending email verification
|
||||
if u.EmailVerification.ID != uuid.Nil {
|
||||
verrs := validate.NewErrors()
|
||||
verrs.Add("email", "User exists: pending email verification")
|
||||
c.Set("errors", verrs)
|
||||
return c.Render(http.StatusUnauthorized, r.HTML("auth/new.plush.html"))
|
||||
}
|
||||
|
||||
// helper function to handle bad attempts
|
||||
bad := func() error {
|
||||
verrs := validate.NewErrors()
|
||||
verrs.Add("email", "invalid email/password")
|
||||
|
||||
c.Set("errors", verrs)
|
||||
|
||||
return c.Render(http.StatusUnauthorized, r.HTML("auth/new.plush.html"))
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
if errors.Cause(err) == sql.ErrNoRows {
|
||||
// couldn't find an user with the supplied email address.
|
||||
return bad()
|
||||
}
|
||||
return errors.WithStack(err)
|
||||
}
|
||||
|
||||
// confirm that the given password matches the hashed password from the db
|
||||
err = bcrypt.CompareHashAndPassword([]byte(u.PasswordHash), []byte(u.Password))
|
||||
if err != nil {
|
||||
return bad()
|
||||
}
|
||||
c.Session().Set("current_user_id", u.ID)
|
||||
|
||||
c.Flash().Add("success", fmt.Sprintf("Welcome Back, %s!", u.Name))
|
||||
|
||||
redirectURL := "/profile"
|
||||
if redir, ok := c.Session().Get("redirectURL").(string); ok && redir != "" {
|
||||
redirectURL = redir
|
||||
}
|
||||
|
||||
return c.Redirect(302, redirectURL)
|
||||
}
|
||||
89
actions/auth_test.go
Normal file
89
actions/auth_test.go
Normal file
|
|
@ -0,0 +1,89 @@
|
|||
package actions
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"newsbox/models"
|
||||
)
|
||||
|
||||
func (as *ActionSuite) createUser() (*models.User, error) {
|
||||
u := &models.User{
|
||||
Email: "mark@example.com",
|
||||
Password: "password",
|
||||
PasswordConfirmation: "password",
|
||||
}
|
||||
|
||||
verrs, err := u.Create(as.DB)
|
||||
as.False(verrs.HasAny())
|
||||
|
||||
return u, err
|
||||
}
|
||||
|
||||
func (as *ActionSuite) Test_Auth_Signin() {
|
||||
res := as.HTML("/auth/").Get()
|
||||
as.Equal(200, res.Code)
|
||||
as.Contains(res.Body.String(), `<a href="/auth/new/">Sign In</a>`)
|
||||
}
|
||||
|
||||
func (as *ActionSuite) Test_Auth_New() {
|
||||
res := as.HTML("/auth/new").Get()
|
||||
as.Equal(200, res.Code)
|
||||
as.Contains(res.Body.String(), "Sign In")
|
||||
}
|
||||
|
||||
func (as *ActionSuite) Test_Auth_Create() {
|
||||
u, err := as.createUser()
|
||||
as.NoError(err)
|
||||
|
||||
tcases := []struct {
|
||||
Email string
|
||||
Password string
|
||||
Status int
|
||||
RedirectURL string
|
||||
|
||||
Identifier string
|
||||
}{
|
||||
{u.Email, u.Password, http.StatusFound, "/", "Valid"},
|
||||
{"noexist@example.com", "password", http.StatusUnauthorized, "", "Email Invalid"},
|
||||
{u.Email, "invalidPassword", http.StatusUnauthorized, "", "Password Invalid"},
|
||||
}
|
||||
|
||||
for _, tcase := range tcases {
|
||||
as.Run(tcase.Identifier, func() {
|
||||
res := as.HTML("/auth").Post(&models.User{
|
||||
Email: tcase.Email,
|
||||
Password: tcase.Password,
|
||||
})
|
||||
|
||||
as.Equal(tcase.Status, res.Code)
|
||||
as.Equal(tcase.RedirectURL, res.Location())
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (as *ActionSuite) Test_Auth_Redirect() {
|
||||
u, err := as.createUser()
|
||||
as.NoError(err)
|
||||
|
||||
tcases := []struct {
|
||||
redirectURL interface{}
|
||||
resultLocation string
|
||||
|
||||
identifier string
|
||||
}{
|
||||
{"/some/url", "/some/url", "RedirectURL defined"},
|
||||
{nil, "/", "RedirectURL nil"},
|
||||
{"", "/", "RedirectURL empty"},
|
||||
}
|
||||
|
||||
for _, tcase := range tcases {
|
||||
as.Run(tcase.identifier, func() {
|
||||
as.Session.Set("redirectURL", tcase.redirectURL)
|
||||
|
||||
res := as.HTML("/auth").Post(u)
|
||||
|
||||
as.Equal(302, res.Code)
|
||||
as.Equal(res.Location(), tcase.resultLocation)
|
||||
})
|
||||
}
|
||||
}
|
||||
13
actions/home.go
Normal file
13
actions/home.go
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
package actions
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"github.com/gobuffalo/buffalo"
|
||||
)
|
||||
|
||||
// HomeHandler is a default handler to serve up
|
||||
// a home page.
|
||||
func HomeHandler(c buffalo.Context) error {
|
||||
return c.Render(http.StatusOK, r.HTML("home/index.plush.html"))
|
||||
}
|
||||
10
actions/home_test.go
Normal file
10
actions/home_test.go
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
package actions
|
||||
|
||||
import "net/http"
|
||||
|
||||
func (as *ActionSuite) Test_HomeHandler() {
|
||||
res := as.HTML("/").Get()
|
||||
|
||||
as.Equal(http.StatusOK, res.Code)
|
||||
as.Contains(res.Body.String(), "Welcome to Buffalo")
|
||||
}
|
||||
10
actions/legal.go
Normal file
10
actions/legal.go
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
package actions
|
||||
|
||||
import (
|
||||
"github.com/gobuffalo/buffalo"
|
||||
)
|
||||
|
||||
// TOSHanlder serves the terms of service
|
||||
func TOSHandler(c buffalo.Context) error {
|
||||
return c.Render(200, r.HTML("legal/index.plush.md", "plain_layout.plush.html"))
|
||||
}
|
||||
107
actions/mailgun.go
Normal file
107
actions/mailgun.go
Normal file
|
|
@ -0,0 +1,107 @@
|
|||
package actions
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"log"
|
||||
"net/http"
|
||||
"newsbox/internal"
|
||||
"newsbox/models"
|
||||
"newsbox/workers"
|
||||
"strings"
|
||||
|
||||
"github.com/gobuffalo/buffalo"
|
||||
"github.com/gobuffalo/envy"
|
||||
"github.com/gobuffalo/pop/v6"
|
||||
"github.com/gofrs/uuid"
|
||||
"github.com/mailgun/mailgun-go/v4"
|
||||
)
|
||||
|
||||
// MailgunWebhook handles new message webhooks from Mailgun
|
||||
func MailgunWebhook(c buffalo.Context) (err error) {
|
||||
mgApiKey, err := envy.MustGet("MAILGUN_API_KEY")
|
||||
if err != nil {
|
||||
log.Println("MAILGUN_API_KEY not set")
|
||||
return errors.New("mailgun api key not set")
|
||||
}
|
||||
|
||||
mg := mailgun.NewMailgun(internal.SiteDomain(), mgApiKey)
|
||||
m := &models.Message{}
|
||||
if err = c.Bind(m); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
sig := mailgun.Signature{
|
||||
TimeStamp: fmt.Sprintf("%d", m.Timestamp),
|
||||
Token: m.Token,
|
||||
Signature: m.Signature,
|
||||
}
|
||||
|
||||
verified, err := mg.VerifyWebhookSignature(sig)
|
||||
if err != nil {
|
||||
log.Printf("mailgun signature verificaton failed: %s\n", err)
|
||||
c.Response().WriteHeader(http.StatusNotAcceptable)
|
||||
return
|
||||
}
|
||||
|
||||
if !verified {
|
||||
log.Printf("mailgun signature verificaton failed: %s\n", err)
|
||||
c.Response().WriteHeader(http.StatusNotAcceptable)
|
||||
return
|
||||
}
|
||||
|
||||
// Naively extract the username from the recipient and check a user exists that corresponds with that user
|
||||
username := usernameFromRecipient(m.To)
|
||||
if username == "" {
|
||||
err = fmt.Errorf("couldn't extract username from email address: %s", m.To)
|
||||
log.Println(err)
|
||||
return err
|
||||
}
|
||||
|
||||
tx := c.Value("tx").(*pop.Connection)
|
||||
u := &models.User{}
|
||||
err = tx.EagerPreload().Where("username = ?", username).First(u)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return err
|
||||
}
|
||||
|
||||
if u.ID == uuid.Nil {
|
||||
err = fmt.Errorf("no such user: %v", u)
|
||||
return
|
||||
}
|
||||
|
||||
m.OwnerID = u.ID
|
||||
|
||||
if err = tx.Save(m); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
js, _ := json.MarshalIndent(&m, "", "\t")
|
||||
_, err = workers.W.EnqueueJob("incoming_email", js)
|
||||
if err != nil {
|
||||
c.Response().Write([]byte("Unable to queue message"))
|
||||
c.Response().WriteHeader(400)
|
||||
return
|
||||
}
|
||||
|
||||
c.Response().Write(js)
|
||||
c.Response().WriteHeader(200)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// usernameFromRecipient extracts the Newsbox username from the recipient's email address
|
||||
// recipients may be of the following forms:
|
||||
// <username>@<site domain>
|
||||
// <username>+<anything>@<site domain>
|
||||
func usernameFromRecipient(recipient string) (username string) {
|
||||
if strings.Contains(recipient, "+") {
|
||||
username = strings.Split(recipient, "+")[0]
|
||||
} else {
|
||||
username = strings.Split(recipient, "@")[0]
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
5
actions/mailgun_test.go
Normal file
5
actions/mailgun_test.go
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
package actions
|
||||
|
||||
func (as *ActionSuite) Test_Mailgun_MailgunWebhook() {
|
||||
as.Fail("Not Implemented!")
|
||||
}
|
||||
296
actions/messages.go
Normal file
296
actions/messages.go
Normal file
|
|
@ -0,0 +1,296 @@
|
|||
package actions
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
|
||||
"github.com/gobuffalo/buffalo"
|
||||
"github.com/gobuffalo/buffalo/render"
|
||||
"github.com/gobuffalo/pop/v6"
|
||||
"github.com/gobuffalo/x/responder"
|
||||
"github.com/gofrs/uuid"
|
||||
|
||||
"newsbox/models"
|
||||
)
|
||||
|
||||
// This file is generated by Buffalo. It offers a basic structure for
|
||||
// adding, editing and deleting a page. If your model is more
|
||||
// complex or you need more than the basic implementation you need to
|
||||
// edit this file.
|
||||
|
||||
// Following naming logic is implemented in Buffalo:
|
||||
// Model: Singular (Message)
|
||||
// DB Table: Plural (messages)
|
||||
// Resource: Plural (Messages)
|
||||
// Path: Plural (/messages)
|
||||
// View Template Folder: Plural (/templates/messages/)
|
||||
|
||||
// MessagesResource is the resource for the Message model
|
||||
type MessagesResource struct {
|
||||
buffalo.Resource
|
||||
}
|
||||
|
||||
// List gets all Messages. This function is mapped to the path
|
||||
// GET /messages
|
||||
func (v MessagesResource) List(c buffalo.Context) error {
|
||||
// Get the DB connection from the context
|
||||
tx, ok := c.Value("tx").(*pop.Connection)
|
||||
if !ok {
|
||||
return fmt.Errorf("no transaction found")
|
||||
}
|
||||
|
||||
messages := &models.Messages{}
|
||||
|
||||
// Paginate results. Params "page" and "per_page" control pagination.
|
||||
// Default values are "page=1" and "per_page=20".
|
||||
q := tx.PaginateFromParams(c.Params())
|
||||
|
||||
// Retrieve all Messages from the DB
|
||||
ownerID := c.Session().Get("current_user_id").(uuid.UUID).String()
|
||||
if err := q.Where("owner_id = ?", ownerID).All(messages); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return responder.Wants("html", func(c buffalo.Context) error {
|
||||
// Add the paginator to the context so it can be used in the template.
|
||||
c.Set("pagination", q.Paginator)
|
||||
|
||||
c.Set("messages", messages)
|
||||
return c.Render(http.StatusOK, r.HTML("messages/index.plush.html"))
|
||||
}).Wants("json", func(c buffalo.Context) error {
|
||||
return c.Render(200, r.JSON(messages))
|
||||
}).Wants("xml", func(c buffalo.Context) error {
|
||||
return c.Render(200, r.XML(messages))
|
||||
}).Respond(c)
|
||||
}
|
||||
|
||||
// Show gets the data for one Message. This function is mapped to
|
||||
// the path GET /messages/{message_id}
|
||||
func (v MessagesResource) Show(c buffalo.Context) error {
|
||||
// Get the DB connection from the context
|
||||
tx, ok := c.Value("tx").(*pop.Connection)
|
||||
if !ok {
|
||||
return fmt.Errorf("no transaction found")
|
||||
}
|
||||
|
||||
// Allocate an empty Message
|
||||
message := &models.Message{}
|
||||
|
||||
// To find the Message the parameter message_id is used.
|
||||
if err := tx.Find(message, c.Param("message_id")); err != nil {
|
||||
return c.Error(http.StatusNotFound, err)
|
||||
}
|
||||
|
||||
return responder.Wants("html", func(c buffalo.Context) error {
|
||||
c.Set("message", message)
|
||||
|
||||
return c.Render(http.StatusOK, r.HTML("messages/show.plush.html"))
|
||||
}).Wants("json", func(c buffalo.Context) error {
|
||||
return c.Render(200, r.JSON(message))
|
||||
}).Wants("xml", func(c buffalo.Context) error {
|
||||
return c.Render(200, r.XML(message))
|
||||
}).Respond(c)
|
||||
}
|
||||
|
||||
// ShowContent gets the HTML content of one Message.
|
||||
func (v MessagesResource) ShowContent(c buffalo.Context) error {
|
||||
// Get the DB connection from the context
|
||||
tx, ok := c.Value("tx").(*pop.Connection)
|
||||
if !ok {
|
||||
return fmt.Errorf("no transaction found")
|
||||
}
|
||||
|
||||
// Allocate an empty Message
|
||||
message := &models.Message{}
|
||||
|
||||
// To find the Message the parameter message_id is used.
|
||||
if err := tx.Find(message, c.Param("message_id")); err != nil {
|
||||
return c.Error(http.StatusNotFound, err)
|
||||
}
|
||||
|
||||
return responder.Wants("html", func(c buffalo.Context) error {
|
||||
c.Set("message", message)
|
||||
|
||||
return c.Render(http.StatusOK, r.Func("text/html", func(w io.Writer, data render.Data) (err error) {
|
||||
_, err = w.Write([]byte(message.BodyHTML))
|
||||
return
|
||||
}))
|
||||
|
||||
}).Wants("json", func(c buffalo.Context) error {
|
||||
return c.Render(200, r.JSON(message))
|
||||
}).Wants("xml", func(c buffalo.Context) error {
|
||||
return c.Render(200, r.XML(message))
|
||||
}).Respond(c)
|
||||
}
|
||||
|
||||
// New renders the form for creating a new Message.
|
||||
// This function is mapped to the path GET /messages/new
|
||||
func (v MessagesResource) New(c buffalo.Context) error {
|
||||
c.Set("message", &models.Message{})
|
||||
|
||||
return c.Render(http.StatusOK, r.HTML("messages/new.plush.html"))
|
||||
}
|
||||
|
||||
// Create adds a Message to the DB. This function is mapped to the
|
||||
// path POST /messages
|
||||
func (v MessagesResource) Create(c buffalo.Context) error {
|
||||
// Allocate an empty Message
|
||||
message := &models.Message{}
|
||||
|
||||
// Bind message to the html form elements
|
||||
if err := c.Bind(message); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Get the DB connection from the context
|
||||
tx, ok := c.Value("tx").(*pop.Connection)
|
||||
if !ok {
|
||||
return fmt.Errorf("no transaction found")
|
||||
}
|
||||
|
||||
// Validate the data from the html form
|
||||
verrs, err := tx.ValidateAndCreate(message)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if verrs.HasAny() {
|
||||
return responder.Wants("html", func(c buffalo.Context) error {
|
||||
// Make the errors available inside the html template
|
||||
c.Set("errors", verrs)
|
||||
|
||||
// Render again the new.html template that the user can
|
||||
// correct the input.
|
||||
c.Set("message", message)
|
||||
|
||||
return c.Render(http.StatusUnprocessableEntity, r.HTML("messages/new.plush.html"))
|
||||
}).Wants("json", func(c buffalo.Context) error {
|
||||
return c.Render(http.StatusUnprocessableEntity, r.JSON(verrs))
|
||||
}).Wants("xml", func(c buffalo.Context) error {
|
||||
return c.Render(http.StatusUnprocessableEntity, r.XML(verrs))
|
||||
}).Respond(c)
|
||||
}
|
||||
|
||||
return responder.Wants("html", func(c buffalo.Context) error {
|
||||
// If there are no errors set a success message
|
||||
c.Flash().Add("success", T.Translate(c, "message.created.success"))
|
||||
|
||||
// and redirect to the show page
|
||||
return c.Redirect(http.StatusSeeOther, "/messages/%v", message.ID)
|
||||
}).Wants("json", func(c buffalo.Context) error {
|
||||
return c.Render(http.StatusCreated, r.JSON(message))
|
||||
}).Wants("xml", func(c buffalo.Context) error {
|
||||
return c.Render(http.StatusCreated, r.XML(message))
|
||||
}).Respond(c)
|
||||
}
|
||||
|
||||
// Edit renders a edit form for a Message. This function is
|
||||
// mapped to the path GET /messages/{message_id}/edit
|
||||
func (v MessagesResource) Edit(c buffalo.Context) error {
|
||||
// Get the DB connection from the context
|
||||
tx, ok := c.Value("tx").(*pop.Connection)
|
||||
if !ok {
|
||||
return fmt.Errorf("no transaction found")
|
||||
}
|
||||
|
||||
// Allocate an empty Message
|
||||
message := &models.Message{}
|
||||
|
||||
if err := tx.Find(message, c.Param("message_id")); err != nil {
|
||||
return c.Error(http.StatusNotFound, err)
|
||||
}
|
||||
|
||||
c.Set("message", message)
|
||||
return c.Render(http.StatusOK, r.HTML("messages/edit.plush.html"))
|
||||
}
|
||||
|
||||
// Update changes a Message in the DB. This function is mapped to
|
||||
// the path PUT /messages/{message_id}
|
||||
func (v MessagesResource) Update(c buffalo.Context) error {
|
||||
// Get the DB connection from the context
|
||||
tx, ok := c.Value("tx").(*pop.Connection)
|
||||
if !ok {
|
||||
return fmt.Errorf("no transaction found")
|
||||
}
|
||||
|
||||
// Allocate an empty Message
|
||||
message := &models.Message{}
|
||||
|
||||
if err := tx.Find(message, c.Param("message_id")); err != nil {
|
||||
return c.Error(http.StatusNotFound, err)
|
||||
}
|
||||
|
||||
// Bind Message to the html form elements
|
||||
if err := c.Bind(message); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
verrs, err := tx.ValidateAndUpdate(message)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if verrs.HasAny() {
|
||||
return responder.Wants("html", func(c buffalo.Context) error {
|
||||
// Make the errors available inside the html template
|
||||
c.Set("errors", verrs)
|
||||
|
||||
// Render again the edit.html template that the user can
|
||||
// correct the input.
|
||||
c.Set("message", message)
|
||||
|
||||
return c.Render(http.StatusUnprocessableEntity, r.HTML("messages/edit.plush.html"))
|
||||
}).Wants("json", func(c buffalo.Context) error {
|
||||
return c.Render(http.StatusUnprocessableEntity, r.JSON(verrs))
|
||||
}).Wants("xml", func(c buffalo.Context) error {
|
||||
return c.Render(http.StatusUnprocessableEntity, r.XML(verrs))
|
||||
}).Respond(c)
|
||||
}
|
||||
|
||||
return responder.Wants("html", func(c buffalo.Context) error {
|
||||
// If there are no errors set a success message
|
||||
c.Flash().Add("success", T.Translate(c, "message.updated.success"))
|
||||
|
||||
// and redirect to the show page
|
||||
return c.Redirect(http.StatusSeeOther, "/messages/%v", message.ID)
|
||||
}).Wants("json", func(c buffalo.Context) error {
|
||||
return c.Render(http.StatusOK, r.JSON(message))
|
||||
}).Wants("xml", func(c buffalo.Context) error {
|
||||
return c.Render(http.StatusOK, r.XML(message))
|
||||
}).Respond(c)
|
||||
}
|
||||
|
||||
// Destroy deletes a Message from the DB. This function is mapped
|
||||
// to the path DELETE /messages/{message_id}
|
||||
func (v MessagesResource) Destroy(c buffalo.Context) error {
|
||||
// Get the DB connection from the context
|
||||
tx, ok := c.Value("tx").(*pop.Connection)
|
||||
if !ok {
|
||||
return fmt.Errorf("no transaction found")
|
||||
}
|
||||
|
||||
// Allocate an empty Message
|
||||
message := &models.Message{}
|
||||
|
||||
// To find the Message the parameter message_id is used.
|
||||
if err := tx.Find(message, c.Param("message_id")); err != nil {
|
||||
return c.Error(http.StatusNotFound, err)
|
||||
}
|
||||
|
||||
if err := tx.Destroy(message); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return responder.Wants("html", func(c buffalo.Context) error {
|
||||
// If there are no errors set a flash message
|
||||
c.Flash().Add("success", T.Translate(c, "message.destroyed.success"))
|
||||
|
||||
// Redirect to the index page
|
||||
return c.Redirect(http.StatusSeeOther, "/messages")
|
||||
}).Wants("json", func(c buffalo.Context) error {
|
||||
return c.Render(http.StatusOK, r.JSON(message))
|
||||
}).Wants("xml", func(c buffalo.Context) error {
|
||||
return c.Render(http.StatusOK, r.XML(message))
|
||||
}).Respond(c)
|
||||
}
|
||||
29
actions/messages_test.go
Normal file
29
actions/messages_test.go
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
package actions
|
||||
|
||||
func (as *ActionSuite) Test_MessagesResource_List() {
|
||||
as.Fail("Not Implemented!")
|
||||
}
|
||||
|
||||
func (as *ActionSuite) Test_MessagesResource_Show() {
|
||||
as.Fail("Not Implemented!")
|
||||
}
|
||||
|
||||
func (as *ActionSuite) Test_MessagesResource_Create() {
|
||||
as.Fail("Not Implemented!")
|
||||
}
|
||||
|
||||
func (as *ActionSuite) Test_MessagesResource_Update() {
|
||||
as.Fail("Not Implemented!")
|
||||
}
|
||||
|
||||
func (as *ActionSuite) Test_MessagesResource_Destroy() {
|
||||
as.Fail("Not Implemented!")
|
||||
}
|
||||
|
||||
func (as *ActionSuite) Test_MessagesResource_New() {
|
||||
as.Fail("Not Implemented!")
|
||||
}
|
||||
|
||||
func (as *ActionSuite) Test_MessagesResource_Edit() {
|
||||
as.Fail("Not Implemented!")
|
||||
}
|
||||
68
actions/oauth.go
Normal file
68
actions/oauth.go
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
package actions
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
"newsbox/internal"
|
||||
"newsbox/models"
|
||||
|
||||
"github.com/gobuffalo/buffalo"
|
||||
"github.com/gobuffalo/nulls"
|
||||
"github.com/gobuffalo/pop/v6"
|
||||
"github.com/markbates/going/defaults"
|
||||
"github.com/markbates/goth"
|
||||
"github.com/markbates/goth/gothic"
|
||||
"github.com/markbates/goth/providers/github"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
func init() {
|
||||
gothic.Store = App().SessionStore
|
||||
callbackBaseURL := internal.BaseUrl()
|
||||
callbackURL := fmt.Sprintf("%s%s", callbackBaseURL, "/oauth/github/callback")
|
||||
goth.UseProviders(
|
||||
github.New(os.Getenv("GH_OAUTH_CLIENT_ID"), os.Getenv("GH_OAUTH_CLIENT_SECRET"), callbackURL),
|
||||
)
|
||||
}
|
||||
|
||||
// AuthCallback handles Oauth callback requests
|
||||
func OauthCallback(c buffalo.Context) error {
|
||||
gu, err := gothic.CompleteUserAuth(c.Response(), c.Request())
|
||||
if err != nil {
|
||||
return c.Error(401, err)
|
||||
}
|
||||
tx := c.Value("tx").(*pop.Connection)
|
||||
q := tx.Where("provider = ? and provider_id = ?", gu.Provider, gu.UserID)
|
||||
exists, err := q.Exists("users")
|
||||
if err != nil {
|
||||
return errors.WithStack(err)
|
||||
}
|
||||
u := &models.User{}
|
||||
if exists {
|
||||
if err = q.First(u); err != nil {
|
||||
return errors.WithStack(err)
|
||||
}
|
||||
}
|
||||
|
||||
u.Provider = gu.Provider
|
||||
u.Username = gu.RawData["login"].(string)
|
||||
u.Name = defaults.String(gu.Name, gu.NickName)
|
||||
u.ProviderID = gu.UserID
|
||||
if gu.Email != "" {
|
||||
u.Email = nulls.NewString(gu.Email)
|
||||
}
|
||||
|
||||
if err = tx.Save(u); err != nil {
|
||||
return errors.WithStack(err)
|
||||
}
|
||||
|
||||
c.Session().Set("current_user_id", u.ID)
|
||||
if err = c.Session().Save(); err != nil {
|
||||
return errors.WithStack(err)
|
||||
}
|
||||
|
||||
c.Flash().Add("success", fmt.Sprintf("Welcome Back, %s!", u.Name))
|
||||
|
||||
return c.Redirect(302, "/")
|
||||
}
|
||||
240
actions/profiles.go
Normal file
240
actions/profiles.go
Normal file
|
|
@ -0,0 +1,240 @@
|
|||
package actions
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"github.com/gobuffalo/buffalo"
|
||||
"github.com/gobuffalo/pop/v6"
|
||||
"github.com/gobuffalo/x/responder"
|
||||
"github.com/gofrs/uuid"
|
||||
"github.com/pkg/errors"
|
||||
|
||||
"newsbox/internal"
|
||||
"newsbox/mill"
|
||||
"newsbox/models"
|
||||
"newsbox/workers"
|
||||
)
|
||||
|
||||
// Show gets the profile data for a user and renders it
|
||||
func ShowProfile(c buffalo.Context) error {
|
||||
// Get the DB connection from the context
|
||||
tx, ok := c.Value("tx").(*pop.Connection)
|
||||
if !ok {
|
||||
return fmt.Errorf("no transaction found")
|
||||
}
|
||||
|
||||
// Allocate an empty User
|
||||
user := &models.User{}
|
||||
ownerID := c.Session().Get("current_user_id").(uuid.UUID)
|
||||
|
||||
if err := tx.Eager().Find(user, ownerID); err != nil {
|
||||
return c.Error(http.StatusNotFound, err)
|
||||
}
|
||||
|
||||
loc := internal.ZoneLocation(user.Preferences.TimeZoneUtcOffset)
|
||||
dt := time.Date(0000, 0, 0, user.Preferences.EmailHourOfDay, 00, 00, 00, loc).Hour()
|
||||
dz := loc.String()
|
||||
|
||||
return responder.Wants("html", func(c buffalo.Context) error {
|
||||
c.Set("user", user)
|
||||
c.Set("delivery_time", dt)
|
||||
c.Set("delivery_time_zone", dz)
|
||||
|
||||
return c.Render(http.StatusOK, r.HTML("profiles/show.plush.html"))
|
||||
}).Wants("json", func(c buffalo.Context) error {
|
||||
return c.Render(200, r.JSON(user))
|
||||
}).Wants("xml", func(c buffalo.Context) error {
|
||||
return c.Render(200, r.XML(user))
|
||||
}).Respond(c)
|
||||
}
|
||||
|
||||
// Edit renders a edit form for a user's profile
|
||||
func EditProfile(c buffalo.Context) error {
|
||||
// Get the DB connection from the context
|
||||
tx, ok := c.Value("tx").(*pop.Connection)
|
||||
if !ok {
|
||||
return fmt.Errorf("no transaction found")
|
||||
}
|
||||
|
||||
// Allocate an empty User
|
||||
user := &models.User{}
|
||||
ownerID := c.Session().Get("current_user_id").(uuid.UUID)
|
||||
|
||||
if err := tx.Eager().Find(user, ownerID); err != nil {
|
||||
return c.Error(http.StatusNotFound, err)
|
||||
}
|
||||
|
||||
c.Set("user", user)
|
||||
return c.Render(http.StatusOK, r.HTML("profiles/edit.plush.html"))
|
||||
}
|
||||
|
||||
// Update updates a user's profile in the DB
|
||||
func UpdateProfile(c buffalo.Context) error {
|
||||
// Get the DB connection from the context
|
||||
tx, ok := c.Value("tx").(*pop.Connection)
|
||||
if !ok {
|
||||
return fmt.Errorf("no transaction found")
|
||||
}
|
||||
|
||||
// Allocate an empty User
|
||||
user := &models.User{}
|
||||
ownerID := c.Session().Get("current_user_id").(uuid.UUID)
|
||||
|
||||
if err := tx.Find(user, ownerID); err != nil {
|
||||
return c.Error(http.StatusNotFound, err)
|
||||
}
|
||||
|
||||
// The user before any updates take place
|
||||
origUser := *user
|
||||
|
||||
// Bind User to the html form elements
|
||||
if err := c.Bind(user); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
verrs, err := tx.ValidateAndSave(user)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if verrs.HasAny() {
|
||||
return responder.Wants("html", func(c buffalo.Context) error {
|
||||
// Make the errors available inside the html template
|
||||
c.Set("errors", verrs)
|
||||
|
||||
// Render again the edit.html template that the user can
|
||||
// correct the input.
|
||||
c.Set("user", user)
|
||||
|
||||
return c.Render(http.StatusBadRequest, r.HTML("profiles/edit.plush.html"))
|
||||
}).Wants("json", func(c buffalo.Context) error {
|
||||
return c.Render(http.StatusBadRequest, r.JSON(verrs))
|
||||
}).Wants("xml", func(c buffalo.Context) error {
|
||||
return c.Render(http.StatusBadRequest, r.XML(verrs))
|
||||
}).Respond(c)
|
||||
}
|
||||
|
||||
verrs, err = tx.ValidateAndSave(&user.Preferences)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if verrs.HasAny() {
|
||||
return responder.Wants("html", func(c buffalo.Context) error {
|
||||
// Make the errors available inside the html template
|
||||
c.Set("errors", verrs)
|
||||
|
||||
// Render again the edit.html template that the user can
|
||||
// correct the input.
|
||||
c.Set("user", user)
|
||||
|
||||
return c.Render(http.StatusBadRequest, r.HTML("profiles/edit.plush.html"))
|
||||
}).Wants("json", func(c buffalo.Context) error {
|
||||
return c.Render(http.StatusBadRequest, r.JSON(verrs))
|
||||
}).Wants("xml", func(c buffalo.Context) error {
|
||||
return c.Render(http.StatusBadRequest, r.XML(verrs))
|
||||
}).Respond(c)
|
||||
}
|
||||
|
||||
var emailChanged bool
|
||||
if origUser.Email != user.Email {
|
||||
// Remove any pre-existing email verifications to ensure that the user doesn't end up in an unfixiable state with
|
||||
// multiple pending verifications
|
||||
err = tx.RawQuery("DELETE FROM user_email_verifications WHERE owner_id = ?", user.ID).Exec()
|
||||
if err != nil {
|
||||
return errors.WithStack(err)
|
||||
}
|
||||
|
||||
uev := &models.UserEmailVerification{OwnerID: user.ID}
|
||||
err = tx.Save(uev)
|
||||
if err != nil {
|
||||
return errors.WithStack(err)
|
||||
}
|
||||
|
||||
invitationAddr := user.Email.Interface().(string)
|
||||
params := mill.EmailAddressChangeEmailJob{
|
||||
Recipient: invitationAddr,
|
||||
VerificationURL: fmt.Sprintf("%s/users/email_verification/%s", internal.BaseUrl(), uev.ID),
|
||||
}
|
||||
paramsJSON, _ := json.Marshal(params)
|
||||
|
||||
_, err = workers.W.EnqueueJob("email_address_changes", paramsJSON)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
emailChanged = true
|
||||
}
|
||||
|
||||
return responder.Wants("html", func(c buffalo.Context) error {
|
||||
if emailChanged {
|
||||
c.Flash().Add("success", T.Translate(c, "profile.email.updated.success"))
|
||||
} else {
|
||||
// If there are no errors set a success message
|
||||
c.Flash().Add("success", T.Translate(c, "profile.updated.success"))
|
||||
}
|
||||
// and redirect to the show page
|
||||
return c.Redirect(http.StatusSeeOther, "/profile/")
|
||||
}).Wants("json", func(c buffalo.Context) error {
|
||||
return c.Render(http.StatusOK, r.JSON(user))
|
||||
}).Wants("xml", func(c buffalo.Context) error {
|
||||
return c.Render(http.StatusOK, r.XML(user))
|
||||
}).Respond(c)
|
||||
}
|
||||
|
||||
// UpdatePassword updates a user's password
|
||||
func UpdatePassword(c buffalo.Context) error {
|
||||
// Get the DB connection from the context
|
||||
tx, ok := c.Value("tx").(*pop.Connection)
|
||||
if !ok {
|
||||
return fmt.Errorf("no transaction found")
|
||||
}
|
||||
|
||||
// The user that will be bound to the form values
|
||||
user := &models.User{}
|
||||
ownerID := c.Session().Get("current_user_id").(uuid.UUID)
|
||||
|
||||
if err := tx.Find(user, ownerID); err != nil {
|
||||
return c.Error(http.StatusNotFound, err)
|
||||
}
|
||||
|
||||
// Bind user variable to form values
|
||||
if err := c.Bind(user); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
verrs, err := tx.ValidateAndUpdate(user)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if verrs.HasAny() {
|
||||
return responder.Wants("html", func(c buffalo.Context) error {
|
||||
// Make the errors available inside the html template
|
||||
c.Set("errors", verrs)
|
||||
|
||||
// Render again the edit.html template that the user can
|
||||
// correct the input.
|
||||
c.Set("user", user)
|
||||
|
||||
return c.Render(http.StatusBadRequest, r.HTML("profiles/edit.plush.html"))
|
||||
}).Wants("json", func(c buffalo.Context) error {
|
||||
return c.Render(http.StatusBadRequest, r.JSON(verrs))
|
||||
}).Respond(c)
|
||||
}
|
||||
|
||||
return responder.Wants("html", func(c buffalo.Context) error {
|
||||
// If there are no errors set a success message
|
||||
c.Flash().Add("success", T.Translate(c, "user.updated.success"))
|
||||
|
||||
// and redirect to the show page
|
||||
return c.Redirect(http.StatusSeeOther, "/profile/")
|
||||
}).Wants("json", func(c buffalo.Context) error {
|
||||
return c.Render(http.StatusOK, r.JSON(user))
|
||||
}).Wants("xml", func(c buffalo.Context) error {
|
||||
return c.Render(http.StatusOK, r.XML(user))
|
||||
}).Respond(c)
|
||||
}
|
||||
29
actions/profiles_test.go
Normal file
29
actions/profiles_test.go
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
package actions
|
||||
|
||||
func (as *ActionSuite) Test_ProfilesResource_List() {
|
||||
as.Fail("Not Implemented!")
|
||||
}
|
||||
|
||||
func (as *ActionSuite) Test_ProfilesResource_Show() {
|
||||
as.Fail("Not Implemented!")
|
||||
}
|
||||
|
||||
func (as *ActionSuite) Test_ProfilesResource_Create() {
|
||||
as.Fail("Not Implemented!")
|
||||
}
|
||||
|
||||
func (as *ActionSuite) Test_ProfilesResource_Update() {
|
||||
as.Fail("Not Implemented!")
|
||||
}
|
||||
|
||||
func (as *ActionSuite) Test_ProfilesResource_Destroy() {
|
||||
as.Fail("Not Implemented!")
|
||||
}
|
||||
|
||||
func (as *ActionSuite) Test_ProfilesResource_New() {
|
||||
as.Fail("Not Implemented!")
|
||||
}
|
||||
|
||||
func (as *ActionSuite) Test_ProfilesResource_Edit() {
|
||||
as.Fail("Not Implemented!")
|
||||
}
|
||||
58
actions/render.go
Normal file
58
actions/render.go
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
package actions
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"newsbox/public"
|
||||
"newsbox/templates"
|
||||
"text/template"
|
||||
|
||||
"github.com/gobuffalo/buffalo/render"
|
||||
)
|
||||
|
||||
var r *render.Engine
|
||||
|
||||
func init() {
|
||||
r = render.New(render.Options{
|
||||
// HTML layout to be used for all HTML requests:
|
||||
HTMLLayout: "application.plush.html",
|
||||
|
||||
TemplateEngines: map[string]render.TemplateEngine{
|
||||
".tmpl": GoTemplateEngine,
|
||||
},
|
||||
|
||||
// fs.FS containing templates
|
||||
TemplatesFS: templates.FS(),
|
||||
|
||||
// fs.FS containing assets
|
||||
AssetsFS: public.FS(),
|
||||
|
||||
// Add template helpers here:
|
||||
Helpers: render.Helpers{
|
||||
// for non-bootstrap form helpers uncomment the lines
|
||||
// below and import "github.com/gobuffalo/helpers/forms"
|
||||
// forms.FormKey: forms.Form,
|
||||
// forms.FormForKey: forms.FormFor,
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
func GoTemplateEngine(input string, data map[string]interface{}, helpers map[string]interface{}) (string, error) {
|
||||
// since go templates don't have the concept of an optional map argument like Plush does
|
||||
// add this "null" map so it can be used in templates like this:
|
||||
// {{ partial "flash.html" .nilOpts }}
|
||||
data["nilOpts"] = map[string]interface{}{}
|
||||
|
||||
t := template.New(input)
|
||||
if helpers != nil {
|
||||
t = t.Funcs(helpers)
|
||||
}
|
||||
|
||||
t, err := t.Parse(input)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
bb := &bytes.Buffer{}
|
||||
err = t.Execute(bb, data)
|
||||
return bb.String(), err
|
||||
}
|
||||
32
actions/user_verification.go
Normal file
32
actions/user_verification.go
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
package actions
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"newsbox/internal"
|
||||
"newsbox/models"
|
||||
|
||||
"github.com/gobuffalo/buffalo"
|
||||
"github.com/gobuffalo/pop/v6"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
// UserEmailVerificatioHandler
|
||||
func UserEmailVerificationHandler(c buffalo.Context) error {
|
||||
tx := c.Value("tx").(*pop.Connection)
|
||||
|
||||
q := tx.Where("id = ?", c.Param("email_verification_id"))
|
||||
uev := &models.UserEmailVerification{}
|
||||
if err := q.EagerPreload().First(uev); err != nil {
|
||||
return errors.WithStack(err)
|
||||
}
|
||||
|
||||
tx.Destroy(uev)
|
||||
|
||||
c.Session().Set("current_user_id", uev.OwnerID)
|
||||
c.Flash().Add("success", fmt.Sprintf("Welcome to %s!", internal.SiteName()))
|
||||
|
||||
// and redirect to the show page
|
||||
return c.Redirect(http.StatusSeeOther, "/")
|
||||
|
||||
}
|
||||
5
actions/user_verification_test.go
Normal file
5
actions/user_verification_test.go
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
package actions
|
||||
|
||||
func (as *ActionSuite) Test_UserVerification_UserVerificationHandler() {
|
||||
as.Fail("Not Implemented!")
|
||||
}
|
||||
102
actions/users.go
Normal file
102
actions/users.go
Normal file
|
|
@ -0,0 +1,102 @@
|
|||
package actions
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
|
||||
"github.com/gobuffalo/buffalo"
|
||||
"github.com/gobuffalo/pop/v6"
|
||||
"github.com/pkg/errors"
|
||||
|
||||
"newsbox/internal"
|
||||
"newsbox/mill"
|
||||
"newsbox/models"
|
||||
"newsbox/workers"
|
||||
)
|
||||
|
||||
// UsersNew renders the users form
|
||||
func UsersNew(c buffalo.Context) error {
|
||||
u := models.User{}
|
||||
c.Set("user", u)
|
||||
return c.Render(200, r.HTML("users/new.plush.html"))
|
||||
}
|
||||
|
||||
// UsersCreate registers a new user with the application.
|
||||
func UsersCreate(c buffalo.Context) error {
|
||||
u := &models.User{}
|
||||
if err := c.Bind(u); err != nil {
|
||||
return errors.WithStack(err)
|
||||
}
|
||||
|
||||
tx := c.Value("tx").(*pop.Connection)
|
||||
verrs, err := u.Create(tx)
|
||||
if err != nil {
|
||||
return errors.WithStack(err)
|
||||
}
|
||||
|
||||
if verrs.HasAny() {
|
||||
c.Set("user", u)
|
||||
c.Set("errors", verrs)
|
||||
return c.Render(200, r.HTML("users/new.plush.html"))
|
||||
}
|
||||
|
||||
uev := &models.UserEmailVerification{OwnerID: u.ID}
|
||||
err = tx.Save(uev)
|
||||
if err != nil {
|
||||
return errors.WithStack(err)
|
||||
}
|
||||
|
||||
invitationAddr := u.Email.Interface().(string)
|
||||
params := mill.WelcomeEmailJob{
|
||||
Recipient: invitationAddr,
|
||||
VerificationURL: fmt.Sprintf("%s/users/email_verification/%s", internal.BaseUrl(), uev.ID),
|
||||
}
|
||||
paramsJSON, _ := json.Marshal(params)
|
||||
|
||||
_, err = workers.W.EnqueueJob("welcome_emails", paramsJSON)
|
||||
if err != nil {
|
||||
c.Redirect(302, "/")
|
||||
return err
|
||||
}
|
||||
|
||||
c.Flash().Add("success", fmt.Sprintf("Email verification sent to: %s", invitationAddr))
|
||||
|
||||
return c.Redirect(302, "/")
|
||||
}
|
||||
|
||||
// SetCurrentUser attempts to find a user based on the current_user_id
|
||||
// in the session. If one is found it is set on the context.
|
||||
func SetCurrentUser(next buffalo.Handler) buffalo.Handler {
|
||||
return func(c buffalo.Context) error {
|
||||
if uid := c.Session().Get("current_user_id"); uid != nil {
|
||||
u := &models.User{}
|
||||
tx := c.Value("tx").(*pop.Connection)
|
||||
err := tx.Find(u, uid)
|
||||
if err != nil {
|
||||
c.Session().Set("current_user_id", nil)
|
||||
return next(c)
|
||||
} else {
|
||||
c.Set("current_user", u)
|
||||
}
|
||||
}
|
||||
return next(c)
|
||||
}
|
||||
}
|
||||
|
||||
// Authorize require a user be logged in before accessing a route
|
||||
func Authorize(next buffalo.Handler) buffalo.Handler {
|
||||
return func(c buffalo.Context) error {
|
||||
if uid := c.Session().Get("current_user_id"); uid == nil {
|
||||
c.Session().Set("redirectURL", c.Request().URL.String())
|
||||
|
||||
err := c.Session().Save()
|
||||
if err != nil {
|
||||
return errors.WithStack(err)
|
||||
}
|
||||
|
||||
c.Flash().Add("danger", "You must be authorized to see that page")
|
||||
return c.Redirect(302, "/login")
|
||||
}
|
||||
return next(c)
|
||||
}
|
||||
}
|
||||
29
actions/users_test.go
Normal file
29
actions/users_test.go
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
package actions
|
||||
|
||||
import (
|
||||
"newsbox/models"
|
||||
)
|
||||
|
||||
func (as *ActionSuite) Test_Users_New() {
|
||||
res := as.HTML("/users/new").Get()
|
||||
as.Equal(200, res.Code)
|
||||
}
|
||||
|
||||
func (as *ActionSuite) Test_Users_Create() {
|
||||
count, err := as.DB.Count("users")
|
||||
as.NoError(err)
|
||||
as.Equal(0, count)
|
||||
|
||||
u := &models.User{
|
||||
Email: "mark@example.com",
|
||||
Password: "password",
|
||||
PasswordConfirmation: "password",
|
||||
}
|
||||
|
||||
res := as.HTML("/users").Post(u)
|
||||
as.Equal(302, res.Code)
|
||||
|
||||
count, err = as.DB.Count("users")
|
||||
as.NoError(err)
|
||||
as.Equal(1, count)
|
||||
}
|
||||
133
assets/css/_buffalo.scss
Normal file
133
assets/css/_buffalo.scss
Normal file
|
|
@ -0,0 +1,133 @@
|
|||
.container {
|
||||
min-width: 320px;
|
||||
}
|
||||
|
||||
header {
|
||||
background-color: #62a5ee;
|
||||
padding: 10px 20px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.logo {
|
||||
img {
|
||||
width: 80px;
|
||||
}
|
||||
}
|
||||
|
||||
.titles {
|
||||
h1 {
|
||||
font-size: 30px;
|
||||
font-weight: 300;
|
||||
color: white;
|
||||
margin-bottom: 13px;
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-weight: 300;
|
||||
font-size: 18px;
|
||||
display: inline-block;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
a {
|
||||
color: white;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
i {
|
||||
margin-right: 5px;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.documentation {
|
||||
margin-left: 28px;
|
||||
}
|
||||
}
|
||||
|
||||
.subtitle {
|
||||
color: white;
|
||||
margin: 0;
|
||||
padding: 13px 0;
|
||||
background-color: #2a3543;
|
||||
margin-bottom: 20px;
|
||||
|
||||
h3 {
|
||||
font-size: 22px;
|
||||
font-weight: 400;
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
|
||||
table {
|
||||
font-size: 14px;
|
||||
|
||||
&.table tbody tr td {
|
||||
border-top: 0;
|
||||
padding: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
.foot {
|
||||
text-align: right;
|
||||
color: #c5c5c5;
|
||||
font-weight: 300;
|
||||
|
||||
a {
|
||||
color: #8b8b8b;
|
||||
text-decoration: underline;
|
||||
}
|
||||
}
|
||||
|
||||
.centered {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
@media all and (max-width: 770px) {
|
||||
.titles {
|
||||
h1 {
|
||||
font-size: 25px;
|
||||
margin: 15px 0 5px 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media all and (max-width: 640px) {
|
||||
.titles {
|
||||
h1 {
|
||||
font-size: 23px;
|
||||
margin: 15px 0 5px 0;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
.documentation {
|
||||
margin-left: 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media all and (max-width: 530px) {
|
||||
.titles {
|
||||
h1 {
|
||||
font-size: 20px;
|
||||
margin: 5px 0;
|
||||
}
|
||||
|
||||
.documentation {
|
||||
margin-left: 0px;
|
||||
margin-top: 5px;
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
|
||||
.logo {
|
||||
padding: 0;
|
||||
|
||||
img {
|
||||
width: 100%
|
||||
}
|
||||
}
|
||||
}
|
||||
3
assets/css/_profile.scss
Normal file
3
assets/css/_profile.scss
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
h2 {
|
||||
font-size: 22px;
|
||||
}
|
||||
4
assets/css/application.scss
Normal file
4
assets/css/application.scss
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
@import "~bootstrap/scss/bootstrap.scss";
|
||||
@import "buffalo";
|
||||
@import "profile";
|
||||
|
||||
BIN
assets/images/favicon.ico
Normal file
BIN
assets/images/favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
721
assets/images/logo.svg
Normal file
721
assets/images/logo.svg
Normal file
|
|
@ -0,0 +1,721 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Buffalo_x5F_Gopher" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
|
||||
y="0px" viewBox="0 0 900 900" enable-background="new 0 0 900 900" xml:space="preserve">
|
||||
<g>
|
||||
<path fill="none" stroke="#211915" stroke-width="16" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M168.4,188c69-72,165.9-117.3,273.3-117.3C651.2,70.7,821,240.4,821,449.8C821,659.3,651.2,829,441.7,829
|
||||
C232.3,829,62.5,659.2,62.5,449.8l-0.2,0c-0.1-1.1,0.1-2.2,0-3.2c-1.7-27.6-3.4-55.2-5.1-82.8c-0.7-11.6-1.6-23.1-2.1-34.7
|
||||
c-0.2-3.6-0.6-7.2-0.3-10.7c0.9-13.3,12.8-11,24.1-13.5c0,0,0-87.7,0-87.7s0.8-15,24.2-15L127,188h9.4l-0.5-20.2
|
||||
c0,0-7.2-0.7-7.9-6.7c0,0-0.7-5.4,1.6-6.4c0,0,2.4-1.6,2.4,5.9c0,0,1.2,2.6,3,2.6l0.2-19.4c0,0,0.2-3.2,2.7-3.2
|
||||
c0,0,3.1-0.7,3.1,2.7c0,0,0,27.4,0,27.6c0,0.2,3.1-1.6,3.3-2c0.6-1,0.4-2.4,0.5-3.5c0.1-1.8-0.1-8.4,1.6-8.8
|
||||
c2.2-0.6,2.7,3.2,2.8,4.8c0.3,3.5-0.2,8-2.6,10.9c-0.4,0.5-4.6,3.6-4.6,3.2c0,0-0.7,12.7-0.7,12.7h0.3H168.4z"/>
|
||||
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="494.644" y1="540.6563" x2="494.644" y2="70.5313">
|
||||
<stop offset="0" style="stop-color:#D17C56"/>
|
||||
<stop offset="0.4089" style="stop-color:#D0805B"/>
|
||||
<stop offset="1" style="stop-color:#B2E6EA"/>
|
||||
</linearGradient>
|
||||
<path fill="url(#SVGID_1_)" d="M168.3,187c69-71.8,166-116.4,273.4-116.4C651.2,70.5,821,240.3,821,449.8c0,24.3-2.3,48.1-6.7,71.2
|
||||
l-151.9,7.4l-63.2,12.3L181.9,230.2L168.3,187z"/>
|
||||
<polygon fill="#AF7133" points="764.3,649 645.2,607.4 574.6,597.2 578.2,548 625.4,538.5 638.4,538.5 809.4,538.8 809.4,541.5
|
||||
805.7,556.7 798.1,579.7 788,606.2 779.7,620.5 772.9,634.6 "/>
|
||||
<polygon fill="#AF7133" points="62.3,448.3 55.2,332.5 54.7,318.3 56.1,313 58.6,309.7 64.1,307.2 75.7,305.4 78.7,304.8
|
||||
78.4,266.1 78.4,228.5 79.2,215.5 82.6,208.9 88.7,204.3 98,201.8 101.9,201.5 109.9,197.4 127,187 181.9,187.5 202.6,176.4
|
||||
217.8,175.5 248.9,173.6 258.2,173.1 268.8,178.1 275.9,183 283.2,190.4 285.2,203.6 290.3,302.5 287.4,449.8 291.4,561.8
|
||||
297.1,624.2 271.1,629.4 160.1,651.5 125.2,658.6 117.2,646.1 104.9,624.2 92.4,597.5 77.9,557.1 72.1,535 68.7,518.5 65.6,498.2
|
||||
63.5,477.8 62.8,459.5 "/>
|
||||
<polygon fill="#7B3D24" points="764.8,648.5 643.8,607.5 574.8,596.1 294.7,624.7 125.2,658.6 141.7,681.7 154.8,697.7 181.9,726
|
||||
227.5,762.7 261.6,783.5 316.2,807.7 359.8,820.1 382,824.3 412.7,827.9 439.1,829 454.4,829 482.9,826.8 518.3,821.2 543.9,815.1
|
||||
566.1,808.1 595.4,796.5 612.4,788.5 621.6,783.7 649.3,767.2 668.1,754.1 694.8,732.2 712.8,715 734.5,690.8 751.3,668.8 "/>
|
||||
<path fill="#AF7133" d="M305.9,673.9l-53.1,1.8l20.8,73.5l28.7,6l48.7,1.3h83.3l15-3c0,0,36.7-9.5,37.7-9.5
|
||||
c1,0,61.4-15.4,61.4-15.4l76.9-19.2v-19l-24.8-26.3l-49.2-6.9L305.9,673.9z"/>
|
||||
<path fill="#BC9E6C" d="M533.5,231.3l-10.1-4.3h-14.3l-25.7-6h-34.6l-39.4,6h-51.6l-25.7,3.3c-26.8,15.8-41.1,46-52.2,73.8
|
||||
c-8.9,22.4-19.3,45-21.9,69.2c-1.3,11.8-0.2,24.8,2.9,37.2l-2.1,2.1l-1.3,5.4l6.7,22.8l32.7,35.6l67.7,35.5l55.7,12.5l44.9-1.9
|
||||
l23.7-14.7l66.2-31.5l30.4-14.3l16.3-42.7v-12l0.5-0.4c9.5-45.1-4.3-80.4-24.7-118.8c-12.4-23.3-21.6-43.6-45.7-57.9"/>
|
||||
<path fill="#6AD7E5" d="M299.1,463.3c-19.8-66.4,11.8-149.6,89.2-149.4l47.1-1.4h41l-0.1,0.3c77.4-0.2,109,83,89.2,149.3l-12.4,8.4
|
||||
l-26.4,19.6l-10.2,10.4h-15.1l-24.6,11.7l-14.4,6.1l-28.5,2.7l-33.3-0.9l-28.8-11.6L332.2,490l-25.7-19.4L299.1,463.3z"/>
|
||||
<path fill="#F6D2A2" d="M406.2,438.7c4.5-2.6,10.4-5.5,15.7-5.1c5.1,0.4,10.1,1.6,15.2,2.4c4.8,0.8,9.3,0.8,13.9,2.6
|
||||
c4.6,1.8,9,4.9,12.1,8.7c3.6,4.5,1.6,11.4-3.7,14.5c-9.8,5.8-18.4-5.6-28.3-5.5c-9.5,0.1-18.1,9.1-27.3,1.3
|
||||
C397.8,452.6,400.3,442.1,406.2,438.7z"/>
|
||||
<path fill="#FFFFFF" d="M443.5,474.3c4.4-1.2,5.2-6.8,3.9-10.7c-1.6-5-8.2-8.4-13.4-5.9c-4.3,2-2.8,6.4-2.9,11.4
|
||||
C430.9,475.8,438.5,475.6,443.5,474.3z"/>
|
||||
<path fill="#FFFFFF" d="M412.3,461.6c1.7,0.5,3.6,0,5.3-0.6c3.3-1.2,9.3-5.8,11.6-3.9c2.7,2.1,1.5,15.5,0.8,15.9
|
||||
c-3.4,2-8.4,2.9-13.3,1.3c-5.9-1.9-3.6-7-3.5-10.8c0-0.6,0.4-1.1,0.3-1.7"/>
|
||||
<ellipse transform="matrix(0.128 -0.9918 0.9918 0.128 45.5048 835.4331)" fill="#FFFFFF" cx="497.8" cy="391.8" rx="49" ry="49"/>
|
||||
|
||||
<ellipse transform="matrix(0.128 -0.9918 0.9918 0.128 -72.0028 704.4983)" fill="#FFFFFF" cx="364.6" cy="393.2" rx="49" ry="49"/>
|
||||
|
||||
<ellipse transform="matrix(0.128 -0.9918 0.9918 0.128 7.9834 574.7572)" fill="#FFFFFF" cx="330.8" cy="282.8" rx="24.3" ry="24.3"/>
|
||||
<path fill="#726958" d="M294.2,271.6c-5.3-1.7-11.7-13.6-14.2-18.3c-5.1-9.2-8.4-19.4-9-30c-0.3-5.5,0.1-17.7,7.4-19.5
|
||||
c9.1-2.3,14.1,11.7,20.6,15.8c9.3,5.9,21.7,4.5,32,2.4c0,0,0.7,4.5,0.8,4.8c0.1,0.9,0.7,2.3,0.5,3.1c-0.2,1.1-2,1.6-2.9,2.1
|
||||
c-3.2,1.7-6,3.6-8.9,5.8c-1.9,1.5-3.5,3.2-5.2,5c-0.8,0.8-1.6,1.5-2.3,2.4c-0.7,0.9-1.3,1.9-2,2.8c-1.9,2.1-3.2,4.6-4.9,6.8
|
||||
c-1.4,1.7-3,3.5-4,5.5c-1,1.9-2.4,3.7-3.2,5.6c-0.5,1.3-0.7,2.5-1.8,3.5C296,270.3,295,270.9,294.2,271.6z"/>
|
||||
<path fill="#BC9E6C" d="M259.4,518c-6.9,4-17,12.8-21.8,17.6c-2.6,2.6-11.7,10.7-13,14.3c-2.5,6.8,7.5,2.5,8.8,8.6
|
||||
c1.5,6.9-5.1,11,5.3,10.7c5.8-0.2,11.4-2.1,16.7-4c8.7-3.2,20.5-5.3,30.2-10.6l0.2-4l0.2-3.6l-8.3-8.3l-10.3-17.8l-2.7-2.8H259.4z"
|
||||
/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M317.5,664.9c-8.3,6.8-16.6,13.6-20.8,23.6c-5,11.8-0.9,27.8,13.1,28.6c9.8,0.5,27-6.3,35.6-10.5c8.8-4.3,23.5-13.1,31.8-18.9"/>
|
||||
<path fill="#BC9E6C" d="M283.3,259c-6.4,0-28.9,8-30.7,14.9c-3.2,12.2,24.7,15.7,32.6,17.2l8.9-19.5L283.3,259z"/>
|
||||
|
||||
<ellipse transform="matrix(0.9918 -0.128 0.128 0.9918 -31.8144 70.6109)" fill="#FFFFFF" cx="533.5" cy="282.8" rx="24.3" ry="24.3"/>
|
||||
<path fill="#726958" d="M533.5,222.1c10.2,2.1,22.6,3.5,32-2.3c6.5-4.1,11.6-18.1,20.6-15.8c7.2,1.8,7.7,14,7.3,19.6
|
||||
c-0.6,10.5-4,20.7-9,30c-2.6,4.7-9.7,17.1-15,18.7l-10.3-13.7l-11-15.8l-12.1-10.1l-3.6-2.7L533.5,222.1"/>
|
||||
<path fill="#BC9E6C" d="M286,546.9c-2.6,33.1,6.4,70.2,20.1,100.1c6,13.2,15.1,24.5,28.5,30.6c21.6,9.8,46.8,10.5,70.1,11.8
|
||||
c9.1,0.5,21,1.2,29.2,1.4c8.3-0.2,16.6-0.9,25.7-1.4c23.3-1.4,48.5-2,70.1-11.8c13.4-6.1,22.5-17.4,28.5-30.6
|
||||
c13.7-29.9,22.6-67,20.1-100.1l-5.7,3.1l-14.7,3.2l-9.7,2.9l-6.4,17.7l-21.9,20.6l-19.4,3.1l-11.7,1.6l-7.5,7.5l-8.2-8.7l-8.4,8.4
|
||||
L454,609l-28.3-1.8l-12.5,0.4l-18.5-9.1l-8.6,2.1l-16-4.2l-38.1-12.9l-12.2-14.2l-4.4-11.7l-9.6-2.5L286,546.9z"/>
|
||||
<path fill="#BC9E6C" d="M604.9,518.3c6.9,4.3,17,12.7,21.8,17.4c2.6,2.6,11.7,10.6,13,14.2c2.5,6.8-7.5,2.4-8.8,8.5
|
||||
c-1.5,6.9,5.1,11-5.3,10.7c-5.8-0.2-11.4-2.1-16.7-4.1c-8.7-3.2-20.5-5.3-30.2-10.6l-0.5-7.6l8.2-6.1l6.7-7.4l2.5-8.9l3.1-5.8
|
||||
L604.9,518.3"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M546.8,664.9c8.3,6.8,16.6,13.6,20.8,23.6c5,11.8,0.9,27.8-13.1,28.6c-9.8,0.5-27-6.3-35.6-10.5c-8.8-4.3-23.5-13.1-31.8-18.9"/>
|
||||
<path fill="#BC9E6C" d="M579.2,289.8c7.9-1.5,35.6-3.4,32.4-15.6c-1.8-6.9-24.2-15-30.6-15l-11.6,13L579.2,289.8z"/>
|
||||
<path fill="#493628" d="M294.8,462.1c27.8-1.2,51.6,19.5,64.3,42l-7-10.7c14.2-2.2,32.2,4.7,41.5,16c10.4-3,16.9,0.6,20.6,5.3
|
||||
c10.2-6.8,25.1-3.8,35,0c3.6-5,10.5-8.4,21.4-5.3c9.3-11.4,27.3-18.2,41.5-16l-7,10.7c12.7-22.6,36.5-43.3,64.3-42
|
||||
c18.5-14.8,29.8-30.7,33-54.6l-0.5,3c31.9-6.5,36.9,118.6-6.8,107.6l3.5,0.6c-1.8,22.1-31.5,38.1-51.5,37.4l3.2,0.1
|
||||
c-5.7,28.7-35.4,46.9-59.5,42.9c0,0.6-3.7,8.1-13,7.7c-7.4-0.3-3.8-6.7-7.3-10.7c-0.2,2.7-3.1,10.9-6.7,11.8
|
||||
c-3.7,0.9-3.9,1.4-12.4-0.9c-0.7,11.1-7.6,27.4-16.7,34.5c-8.2-5.6-18-24.8-20.4-34.8c-4.6,3.2-7.8,3.6-12.1,0.1
|
||||
c-2.4-1.9-8.3-8.2-8.5-10.8c-3.5,4,0,10.4-7.3,10.7c-4.5,0.2-9.9-5.7-10-10c-26.2-1.2-56.8-11.9-62.6-40.6l3.2-0.1
|
||||
c-20,0.7-49.7-15.3-51.5-37.4l3.5-0.6c-43.7,11-40-114.1-8.1-107.6c2.3,9.1,5.7,17.9,10.3,25.5
|
||||
C277.3,446.1,285.6,454.7,294.8,462.1z"/>
|
||||
<path fill="#6E5128" d="M432.7,288.4c9.9-0.2,20.7-0.6,29.5,3.5c10.5,4.9,17.9,23.8,13,34.9c-4.8,11-16.3,17-27.5,19.7
|
||||
c-18.9,4.5-49.7,0.8-58.7-19.7c-4.9-11.1,2.5-30,13-34.9C411.1,287.7,422.6,288.1,432.7,288.4"/>
|
||||
<polygon fill="#5B5B5F" points="234.5,539 241.6,543.7 245.8,550.9 248,556.8 248,563.5 247.4,567.7 234.4,568.9 232.8,567.7
|
||||
233.4,558.5 228.7,554.3 224.2,553.9 226.6,546.9 "/>
|
||||
<polygon fill="#5B5B5F" points="621.4,543.9 625.4,540.7 628.9,538.9 633.4,542.6 640.1,549.8 639.6,553.3 635.6,555.1
|
||||
630.8,556.7 630.2,563.4 631.5,567.7 625.6,569.2 616.7,567.7 615,564.5 615,557.5 616.4,550 "/>
|
||||
<polygon fill="#BC9E6C" points="377.2,686.7 365.7,695 342.3,707.7 323.7,715 311.4,716.8 304.9,715.7 299.6,713.1 296,705.7
|
||||
294.7,699.4 295.8,691 297.1,684.3 306,675.5 316.5,665.6 321.4,670.5 330.4,675.5 346.7,681.7 359.8,685.3 "/>
|
||||
<path fill="#BC9E6C" d="M546.8,664.9c8.3,6.8,16.6,13.6,20.8,23.6c5,11.8,0.9,27.8-13.1,28.6c-9.8,0.5-27-6.3-35.6-10.5
|
||||
c-8.8-4.3-23.5-13.1-31.8-18.9l9-1.1l18.4-3.6l17.6-6.6l11.4-8.1L546.8,664.9z"/>
|
||||
<polygon fill="#5B5B5F" points="566.1,686.2 557.7,687.4 548.1,690.5 537.1,697.7 527.8,706.3 526,709.2 533.7,712.4 547.7,716.3
|
||||
555.1,717 561.1,715.3 566.1,711.6 569.7,705.6 569,698.2 567.5,690.1 "/>
|
||||
<polygon fill="#5B5B5F" points="297.1,684.3 307.6,687.3 318.3,692.1 331.2,701.6 339.1,709.5 326.4,713.9 311.4,716.8
|
||||
304.9,715.7 299.6,713.1 294.7,701.6 293.4,695.3 296.2,688.8 "/>
|
||||
<polygon fill="#AF7133" points="722.3,673.7 706.4,665.5 685.4,665.5 680.8,691.3 693.6,691 "/>
|
||||
<polygon fill="#7B3D24" points="618.1,528.1 662.4,497.5 772.4,497.5 787.4,498 813.1,520.5 812.8,528.3 809.4,538.8 727.8,538.6
|
||||
631.4,538.6 "/>
|
||||
<polygon fill="#FFD6AC" points="647.5,608.8 808.1,548.1 806.4,554.1 654.9,611.3 "/>
|
||||
<path fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M762.5,559v-6.2
|
||||
c0,0-2.6-0.1-2.9-2.1c0,0-0.3-1.7,0.4-2.1c0,0,0.7-0.5,0.7,2c0,0,0.4,0.9,1,0.9l0-6.4c0,0,0.4-1.1,1.3-1.1c0,0,1.4-0.2,1.4,0.9
|
||||
c0,0,0,9.1,0,9.1c0,0.1,0.6-0.5,0.7-0.7c0.2-0.3-0.1-0.8,0-1.2c0-0.6-0.1-2.8,0.4-2.9c0.7-0.2,0.8,1.1,0.9,1.6
|
||||
c0.1,1.2,0.2,2.6-0.7,3.6c-0.1,0.2-1.3,1-1.3,0.9c0,0,0,3.7,0,3.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M754.5,626v-6.2
|
||||
c0,0-2.6-0.1-2.9-2.1c0,0-0.3-1.7,0.4-2.1c0,0,0.7-0.5,0.7,2c0,0,0.4,0.9,1,0.9l0-6.4c0,0,0.4-1.1,1.3-1.1c0,0,1.4-0.2,1.4,0.9
|
||||
c0,0,0,9.1,0,9.1c0,0.1,0.6-0.5,0.7-0.7c0.2-0.3-0.1-0.8,0-1.2c0-0.6-0.1-2.8,0.4-2.9c0.7-0.2,0.8,1.1,0.9,1.6
|
||||
c0.1,1.2,0.2,2.6-0.7,3.6c-0.1,0.2-1.3,1-1.3,0.9c0,0,0,3.7,0,3.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M676.5,564v-6.2
|
||||
c0,0,2-0.1,2.2-2.1c0,0,0-1.7-0.7-2.1c0,0-0.9-0.5-0.9,2c0,0-0.4,0.9-1,0.9l-0.1-6.4c0,0,0.2-1.1-0.6-1.1c0,0-0.8-0.2-0.8,0.9
|
||||
c0,0,0,9.1,0,9.1c0,0.1-1.3-0.5-1.4-0.7c-0.2-0.3-0.3-0.8-0.3-1.2c0-0.6,0-2.8-0.6-2.9c-0.7-0.2-0.9,1.1-1,1.6
|
||||
c-0.1,1.2,0.5,2.6,1.3,3.6c0.1,0.2,1.9,1,1.9,0.9c0,0,0,3.7,0,3.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M593.5,590v-6.2
|
||||
c0,0,2-0.1,2.2-2.1c0,0,0-1.7-0.7-2.1c0,0-0.9-0.5-0.9,2c0,0-0.4,0.9-1,0.9l-0.1-6.4c0,0,0.2-1.1-0.6-1.1c0,0-0.8-0.2-0.8,0.9
|
||||
c0,0,0,9.1,0,9.1c0,0.1-1.3-0.5-1.4-0.7c-0.2-0.3-0.3-0.8-0.3-1.2c0-0.6,0-2.8-0.6-2.9c-0.7-0.2-0.9,1.1-1,1.6
|
||||
c-0.1,1.2,0.5,2.6,1.3,3.6c0.1,0.2,1.9,1,1.9,0.9c0,0,0,3.7,0,3.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M136.4,187l-0.5-19.8c0,0-7.2-0.3-7.9-6.3c0,0-0.7-5.3,1.6-6.3c0,0,2.4-1.5,2.4,5.9c0,0,1.2,2.6,3,2.6l0.2-19.4
|
||||
c0,0,0.7-3.2,3.2-3.2c0,0,3.6-0.7,3.6,2.7c0,0,0,27.4,0,27.6c0,0.2,2.6-1.6,2.8-2c0.6-1,0.2-2.4,0.2-3.5c0.1-1.8-0.2-8.4,1.4-8.8
|
||||
c2.2-0.6,2.6,3.2,2.7,4.8c0.3,3.5-0.2,8-2.6,10.9c-0.4,0.5-4.7,3.1-4.7,2.7c0,0-0.8,11.9-0.8,11.9"/>
|
||||
<path fill="#ACDD00" d="M762,559v-6.2c0,0-2.4-0.1-2.6-2.1c0,0-0.2-1.7,0.5-2.1c0,0,0.8-0.5,0.8,2c0,0,0.4,0.9,1,0.9l0.1-6.4
|
||||
c0,0,0.2-1.1,1-1.1c0,0,1.2-0.2,1.2,0.9c0,0,0,9.1,0,9.1c0,0.1,0.9-0.5,1-0.7c0.2-0.3,0.1-0.8,0.1-1.2c0-0.6-0.1-2.8,0.5-2.9
|
||||
c0.7-0.2,0.9,1.1,0.9,1.6c0.1,1.2-0.1,2.6-0.9,3.6c-0.1,0.2-1.6,1-1.6,0.9c0,0,0,3.7,0,3.7H762z"/>
|
||||
<path fill="#ACDD00" d="M754,626v-6.2c0,0-2.4-0.1-2.6-2.1c0,0-0.2-1.7,0.5-2.1c0,0,0.8-0.5,0.8,2c0,0,0.4,0.9,1,0.9l0.1-6.4
|
||||
c0,0,0.2-1.1,1-1.1c0,0,1.2-0.2,1.2,0.9c0,0,0,9.1,0,9.1c0,0.1,0.9-0.5,1-0.7c0.2-0.3,0.1-0.8,0.1-1.2c0-0.6-0.1-2.8,0.5-2.9
|
||||
c0.7-0.2,0.9,1.1,0.9,1.6c0.1,1.2-0.1,2.6-0.9,3.6c-0.1,0.2-1.6,1-1.6,0.9c0,0,0,3.7,0,3.7H754z"/>
|
||||
<path fill="#ACDD00" d="M676,564v-6.2c0,0,2.2-0.1,2.4-2.1c0,0,0.1-1.7-0.6-2.1c0,0-0.8-0.5-0.8,2c0,0-0.4,0.9-1,0.9l-0.1-6.4
|
||||
c0,0,0-1.1-0.9-1.1c0,0-1-0.2-1,0.9c0,0,0,9.1,0,9.1c0,0.1-1.1-0.5-1.1-0.7c-0.2-0.3-0.1-0.8-0.2-1.2c0-0.6,0-2.8-0.5-2.9
|
||||
c-0.7-0.2-0.9,1.1-0.9,1.6c-0.1,1.2,0.2,2.6,1,3.6c0.1,0.2,1.7,1,1.7,0.9c0,0,0,3.7,0,3.7H676z"/>
|
||||
<path fill="#ACDD00" d="M593,590v-6.2c0,0,2.2-0.1,2.4-2.1c0,0,0.1-1.7-0.6-2.1c0,0-0.8-0.5-0.8,2c0,0-0.4,0.9-1,0.9l-0.1-6.4
|
||||
c0,0,0-1.1-0.9-1.1c0,0-1-0.2-1,0.9c0,0,0,9.1,0,9.1c0,0.1-1.1-0.5-1.1-0.7c-0.2-0.3-0.1-0.8-0.2-1.2c0-0.6,0-2.8-0.5-2.9
|
||||
c-0.7-0.2-0.9,1.1-0.9,1.6c-0.1,1.2,0.2,2.6,1,3.6c0.1,0.2,1.7,1,1.7,0.9c0,0,0,3.7,0,3.7H593z"/>
|
||||
<path fill="#ACDD00" d="M136.4,187l-0.5-19.8c0,0-7.2-0.3-7.9-6.3c0,0-0.7-5.3,1.6-6.3c0,0,2.4-1.5,2.4,5.9c0,0,1.2,2.6,3,2.6
|
||||
l0.2-19.4c0,0,0.7-3.2,3.2-3.2c0,0,3.6-0.7,3.6,2.7c0,0,0,27.4,0,27.6c0,0.2,2.6-1.6,2.8-2c0.6-1,0.2-2.4,0.2-3.5
|
||||
c0.1-1.8-0.2-8.4,1.4-8.8c2.2-0.6,2.6,3.2,2.7,4.8c0.3,3.5-0.2,8-2.6,10.9c-0.4,0.5-4.7,3.1-4.7,2.7c0,0-0.8,11.9-0.8,11.9
|
||||
L136.4,187z"/>
|
||||
|
||||
<radialGradient id="SVGID_2_" cx="737.6794" cy="406.1918" r="45.3992" gradientTransform="matrix(0.937 -0.3492 0.3492 0.937 -91.5873 282.9574)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0" style="stop-color:#C47826"/>
|
||||
<stop offset="0" style="stop-color:#B55314"/>
|
||||
<stop offset="0.8092" style="stop-color:#C98F31"/>
|
||||
</radialGradient>
|
||||
<path fill="url(#SVGID_2_)" d="M700,424.1c-2.6-6.1-4.2-13.1-3.9-20.2c1-25,22.1-44.5,47.2-43.4c25,1,44.5,22.1,43.4,47.2
|
||||
c-0.7,16.4-11.4,32.5-25,39.3L700,424.1z"/>
|
||||
<path fill="#FFFFFF" d="M705,234.9c0-0.2,1-0.4,1.7-0.5c2.6-0.4,5.2-0.4,7.8,0c4.1,0.6,7.9,2.2,11.2,4.8c4.6,3.7,7.4,9.1,9.1,14.7
|
||||
c0,0,17.3-3,19.2,14c6.3,0,15.6-1.2,18.1,6.5c2.2,6.8-1.9,11.1-7,12.9c-2.2,0.8-4.6,1.2-6.7,1.1c-12.3-0.3-24.6-0.2-36.9,0
|
||||
c-21.3-0.2-54.4-0.6-75.7,0c-2.2,0.1-4.5-0.3-6.7-1.1c-5.1-1.9-9.2-6.1-7-12.9c2.5-7.6,11.8-6.5,18.1-6.5c1.9-17,19.5-14,19.5-14
|
||||
C676.9,229.4,705,234.9,705,234.9L705,234.9z"/>
|
||||
<path fill="#FFFFFF" d="M380.7,167.5c-0.7,0-5.5,0-6.3,0c-21.3-0.2-54.4-0.6-75.7,0c-2.2,0.1-4.5-0.3-6.7-1.1
|
||||
c-5.1-1.9-9.2-6.1-7-12.9c2.5-7.6,11.8-6.5,18.1-6.5c1.9-17,19.5-14,19.5-14c7.2-24.6,35.3-19,35.3-19v0c0-0.2,1-0.4,1.7-0.5
|
||||
c2.6-0.4,5.2-0.4,7.8,0c4.1,0.6,7.9,2.2,11.2,4.8c4.6,3.7,7.4,9.1,9.1,14.7c0,0,17.3-3,19.2,14c7.1-3.8,12.9-0.8,16.2,3.4"/>
|
||||
<path fill="#FFFFFF" d="M599.3,332.3c2.3-11.3,15-9.9,15-9.9h0c0-0.1,0.4-0.2,0.8-0.3c1.2-0.3,2.3-0.4,3.5-0.3
|
||||
c1.9,0.1,3.6,0.7,5.2,1.7c2.2,1.5,3.7,3.8,4.6,6.2c0,0,7.6-2,9.1,5.5c2.8-0.2,6.9-1.1,8.3,2.2c1.3,3-0.4,5-2.6,6.1
|
||||
c-0.9,0.4-2,0.7-3,0.8c-5.5,0.3-11,0.9-16.5,1.4c-6,0.5-14.1,1.1-21.6,1.7"/>
|
||||
<path fill="#FFFFFF" d="M661.5,433c-1.9-0.2-3.7-0.4-5.6-0.6c-3.7-0.4-9.4-1.1-13.1-1.4c-0.4,0-0.8-0.1-1.1-0.3
|
||||
c-0.9-0.4-1.5-1.2-1-2.4c0.6-1.3,2.2-0.9,3.3-0.8c0.6-2.9,3.6-2.1,3.6-2.1c1.7-4.1,6.5-2.6,6.5-2.6l0,0c0,0,0.2-0.1,0.3-0.1
|
||||
c0.5,0,0.9,0,1.4,0.2c0.7,0.2,1.3,0.5,1.8,1c0.7,0.7,1.1,1.7,1.3,2.7c0,0,2.2-0.1,2.9,1.7"/>
|
||||
<path fill="#493628" d="M508.6,255.4c0,1.2-0.3,2.8-0.5,4.2c-0.4,2.9-1.4,5.7-2.2,8.5c5.9-6.6,12.4-10.7,16.5-19.3
|
||||
c4.6-9.6,11.1-15.9,11.1-26.7c-0.9-11.9-7-31.3-22.1-31.3c-4.4-9.4-17-17.2-24.2-15.5c-0.9-15.8-22.3-25.7-38.8-21.3l-0.1,0
|
||||
c-8.3-6.8-20.1-8.6-31.2,0c-16.7-4.5-38.2,5.6-38.6,21.7c-6.9-2.6-20.9,5.2-25.5,15c-15.1,0-21.2,19.4-22.1,31.3
|
||||
c0,10.8,6.5,17.1,11.1,26.7c4.1,8.7,10.6,12.8,16.5,19.3c-0.8-2.7-1.8-5.6-2.2-8.5c-0.2-1.4-0.5-3-0.5-4.2l0,0.1
|
||||
c3.2,6.8,3.4,12.8,9.5,17.8c5.4,4.5,12,6.4,17.9,8.8c-1.2-2-2.4-10,0-13.3c1.4,7,20.1,16.5,27.3,15.3c-1.2,0-1.3-8.5-1.3-11.3
|
||||
c6.4,0,16.9,6.7,23.1,10.2c6.2-3.5,16.6-10.3,23.1-10.2c0,2.8-0.1,11.4-1.3,11.3c7.3,1.1,25.9-8.3,27.3-15.3
|
||||
c2.4,3.3,1.2,11.3,0,13.3c5.8-2.4,12.4-4.4,17.9-8.8C505.2,268.3,505.3,262.3,508.6,255.4"/>
|
||||
<polygon fill="#AF7133" points="788,500.5 787.4,498 787.4,473.5 786.9,465.5 783.4,459.5 783.4,451.5 783.4,438.5 786.4,431.5
|
||||
786.4,422.5 783.7,416.9 782.4,410.5 774.4,410.5 774.4,425.5 772.4,430.5 772.4,456.5 766.4,453.1 766.4,446.5 755.4,444.1
|
||||
755.4,405.5 754.8,402.8 752.2,400.2 745.5,398.8 735.8,392.5 711.4,392.5 702.3,387.8 679.4,386.5 676.4,386.5 669.3,390.8
|
||||
665.4,395.5 665.4,407.5 662.3,410.3 661.4,428.3 661.4,497.5 772.4,497.5 "/>
|
||||
<polygon fill="#444242" points="433.2,512 433.1,512.5 431.4,515.4 431,518.2 431.8,521.7 432.8,520.5 433.9,518.2 433.5,516.5
|
||||
433.5,513.3 433.9,512 "/>
|
||||
<polygon fill="#444242" points="437.6,513.2 438.6,515.1 439.1,517.4 438.9,520.6 438.1,522.2 436.4,518.9 437.1,517.5
|
||||
437.4,516.1 437.3,514 "/>
|
||||
<polygon fill="#5B5B5F" points="435.4,520 436.5,522.1 438,525.7 439,530.5 439,532.5 438.4,533.7 437.1,534.8 435.6,535.1
|
||||
433.9,534.7 432.7,533.5 432.2,532 432.9,526.4 433.9,523.5 435,520.9 435.3,520.6 435.1,519.7 433.9,518.3 432.1,522.2
|
||||
430.4,526.7 429.4,531.1 429.6,533.8 430.3,535.4 432.1,536.5 433.9,536.8 436.2,536.8 438.4,536.2 439.8,535.1 440.5,534
|
||||
440.7,532 440.5,529.6 439.4,525.4 436.9,519.3 436.4,518.9 "/>
|
||||
<polygon fill="#5B5B5F" points="433.7,512.9 433.5,514 433.5,516.5 434.6,519.1 435.4,520 436.4,518.9 437.1,517.5 437.4,516.1
|
||||
437.2,513.2 "/>
|
||||
<polygon fill="#726958" points="435.3,520.4 434.1,523.4 433,528.3 433,530.5 433.5,529.7 434.6,529 435.6,528.8 437.3,529.4
|
||||
438.4,530.5 438.1,528.3 437.6,525.3 436.4,522.3 "/>
|
||||
<circle fill="#444242" cx="435.4" cy="532" r="3.2"/>
|
||||
<rect x="432" y="536" fill="#727176" width="8" height="104"/>
|
||||
<path fill="#444242" d="M435,542h-3c0,0,0-5.5,0-5.5c0-0.2,0.9,0.2,0.9,0.2c0.4,0.2,0.7,0.3,1.2,0.4c0.5,0.1,0.7,0.1,0.7,0.6
|
||||
c0,0.7,0.2,1.4,0.2,2.1C435,540.6,435,542,435,542z"/>
|
||||
<rect x="437" y="542" fill="#444242" width="3" height="4"/>
|
||||
<rect x="437" y="550" fill="#444242" width="3" height="4"/>
|
||||
<rect x="432" y="546" fill="#444242" width="3" height="4"/>
|
||||
<rect x="432" y="554" fill="#444242" width="3" height="4"/>
|
||||
<rect x="437" y="558" fill="#444242" width="3" height="4"/>
|
||||
<rect x="437" y="566" fill="#444242" width="3" height="4"/>
|
||||
<rect x="432" y="562" fill="#444242" width="3" height="4"/>
|
||||
<rect x="432" y="570" fill="#444242" width="3" height="4"/>
|
||||
<rect x="437" y="574" fill="#444242" width="3" height="4"/>
|
||||
<rect x="437" y="582" fill="#444242" width="3" height="4"/>
|
||||
<rect x="432" y="578" fill="#444242" width="3" height="4"/>
|
||||
<rect x="432" y="586" fill="#444242" width="3" height="4"/>
|
||||
<rect x="437" y="590" fill="#444242" width="3" height="4"/>
|
||||
<rect x="437" y="598" fill="#444242" width="3" height="4"/>
|
||||
<rect x="432" y="594" fill="#444242" width="3" height="4"/>
|
||||
<rect x="432" y="602" fill="#444242" width="3" height="4"/>
|
||||
<rect x="437" y="606" fill="#444242" width="3" height="4"/>
|
||||
<rect x="437" y="614" fill="#444242" width="3" height="4"/>
|
||||
<rect x="432" y="610" fill="#444242" width="3" height="4"/>
|
||||
<rect x="432" y="618" fill="#444242" width="3" height="4"/>
|
||||
<rect x="437" y="622" fill="#444242" width="3" height="4"/>
|
||||
<rect x="437" y="630" fill="#444242" width="3" height="4"/>
|
||||
<rect x="432" y="626" fill="#444242" width="3" height="4"/>
|
||||
<rect x="432" y="634" fill="#444242" width="3" height="4"/>
|
||||
<path fill="none" d="M569.8,218.1c-0.3-1.4,0.2-2.7,1.3-3.3"/>
|
||||
<path fill="none" d="M197.9,758.5c-1.9,0-3.6-0.4-5.5-0.2"/>
|
||||
<path fill="none" d="M189.4,760c0.1-0.2,0.3-0.3,0.5-0.2"/>
|
||||
<path opacity="0.2" d="M693.3,673.8c0.9,1.1,2.1,2,3,3.1c0.7,0.9,1.2,2.5,2.4,2.8c1.5,0.3,2.7-0.6,4.2,0c1.4,0.6,2.9,1.3,3.9,2.4
|
||||
c-3.9,2.7-7.5,5.6-11.9,7.6c-1.4,0.6-2.5,0.5-3.9,0.8c-2.9,0.5-6.7,2.2-9.5,0.7c-0.1-1,0.2-2.2,0.2-3.3c0-3.2,0.8-6.3,1.6-9.3
|
||||
c0.6-2.3,0.6-4.7,1-7c0.2-1.2,0.6-2.4,0.9-3.6c0.2-0.6,0.1-2,1-2.2c0.9-0.2,2.8,2.4,3.2,3C690.7,670.5,691.9,672.2,693.3,673.8z"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M154.5,242v54.4c0,0-13.7-3-13.7,25.7c0,0-7.3-3-7.3,12.1V419"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="78.5" y1="461" x2="78.5" y2="555"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="182.5" y1="394" x2="182.5" y2="647"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M658.4,520.5"/>
|
||||
<path opacity="0.2" d="M754,626v7.6c0,0-2.6,0.1-2.9,2.1c0,0-0.2,1.7,0.7,2.1c0,0,1,0.5,1-2c0,0,0.5-0.9,1.2-0.9l0.1,6.4
|
||||
c0,0-0.1,1.1,0.9,1.1c0,0,1.1,0.2,1.1-0.9c0,0,0-9.1,0-9.1c0-0.1,1.4,0.5,1.4,0.7c0.2,0.3,0.2,0.8,0.3,1.2c0.1,0.6,0,2.8,0.6,2.9
|
||||
c0.9,0.2,1-1.1,1.1-1.6c0.1-1.2-0.4-2.6-1.3-3.6c-0.2-0.2-2.1-1-2.1-0.9c0,0,0-5.1,0-5.1"/>
|
||||
<path opacity="0.2" d="M673.2,564.3l-1.5,7c0,0-2.3-0.4-3,1.5c0,0-0.4,1.7,0.4,2.2c0,0,0.9,0.7,1.4-1.7c0,0,0.7-0.7,1.4-0.6
|
||||
l-1.3,6.3c0,0-0.6,1,0.4,1.2c0,0,0.7,0.4,1-0.7c0,0,1.9-8.8,2-8.9c0-0.1,1.5,0.9,1.5,1c0.2,0.4,0.2,0.9,0.1,1.2
|
||||
c-0.1,0.6-0.5,2.7,0.1,3c0.8,0.4,1.3-0.8,1.4-1.3c0.3-1.1-0.1-2.7-0.8-3.9c-0.1-0.2-2.1-1.5-2.1-1.4c0,0,1-4.5,1-4.5"/>
|
||||
<path opacity="0.2" d="M590.2,591.3c-0.5,1.2-1,2.3-1.4,3.5c-0.2,0.5-0.4,1-0.6,1.5c-0.1,0.1-0.3,0.4-0.3,0.5
|
||||
c-0.1,0.5,0.7,0.5,1,0.5c0.2,0,0.4-0.2,0.6-0.2c0.3-0.1,0.6-0.1,0.9-0.1c0.3,0,0.7,0.1,1,0.2c0.3,0.1,0.5,0.2,0.8,0.3
|
||||
c0.9,0.1-0.2-0.9-0.4-1.1c-0.1-0.1-1.1-1-1.1-0.9c0.2-0.7,0.6-1.4,0.9-2.1c0.3-0.8,0.9-1.8,1.5-2.4c0.3-0.4-1.7-0.5-1.7-0.5
|
||||
C590.5,590.6,590.5,590.5,590.2,591.3z"/>
|
||||
<path opacity="0.2" d="M762.1,559.2l-1.4,5.2c0,0-2.3-0.6-2.9,0.8c0,0-0.4,1.2,0.4,1.7c0,0,0.9,0.6,1.4-1.1c0,0,0.7-0.5,1.3-0.3
|
||||
l-1.2,4.7c0,0-0.5,0.7,0.4,0.9c0,0,0.7,0.4,0.9-0.4c0,0,1.8-6.5,1.8-6.6c0-0.1,1.5,0.8,1.5,0.9c0.2,0.3,0.2,0.7,0.2,0.9
|
||||
c-0.1,0.5-0.5,2,0.1,2.3c0.8,0.4,1.3-0.5,1.4-0.8c0.3-0.8-0.1-2.1-0.8-3c-0.1-0.2-2.1-1.4-2.1-1.3c0,0,0.9-3.3,0.9-3.3"/>
|
||||
<line fill="none" x1="845" y1="521" x2="846" y2="521"/>
|
||||
<path opacity="0.3" fill="#C47826" d="M599.4,524c6-0.9,16.9,7.9,21.1,11.9c7.3,6.8,5,15,10.4,22.4c0.7-3.5,4.2-3.7,7.4-3.4
|
||||
c1.7-11.1-12.2-19.4-18.5-26.7c-2.3-2.7-3.6-4.8-6.9-6.6c-1.3-0.7-13.7-4.3-14-1c-0.1,1.7-0.3,4.2-0.1,5.4"/>
|
||||
<path opacity="0.3" fill="#C47826" d="M686.7,269.8c2.9-0.4,5-2.5,8.1-2.6c4.2-0.1,8,2.3,12.3,2.6c7,0.5,13.8-3.3,20.7-1.9
|
||||
c3.5,0.7,3.9,2.7,6.4,3.9c2.5,1.2,5.4,0.6,8,1.4c-0.8,5.6-12.6,4.2-15.9,2.8c-2.6-1.1-4.1-3.5-7-3.3c-2.2,0.2-5.5,2.3-8,2.7
|
||||
c-2.9,0.6-6.2,0.9-9.1,1c-6.6,0.3-12.9-2.6-19.5-2.1c-4,0.3-9.8,2.8-11.7-2.7c2.7-0.1,4.9-0.9,7.4-1.4
|
||||
C680.9,269.6,683.8,270.2,686.7,269.8z"/>
|
||||
<path opacity="0.3" fill="#C47826" d="M744.8,255.3c-3.8-1.9-7-1.3-10.7,0.2c1.8,1,3.9,0.7,5.7,1.7c1.3,0.7,2.7,1.6,3.9,2.5
|
||||
c1.3,1,2.4,2.3,3.2,3.7c0.2,0.4,1.9,4.5,1.6,4.5c6.9-1.1,4.8,8.9,0.9,11.3c-5.1,3.1-11.9,2.5-17.8,2.3c-15.1-0.6-30,3.6-45,3
|
||||
c-13.3-0.5-32.7-2-37.4-17.8c-7,3.2-27.2,4.8-14.6,17.4c6.3,6.3,14.1,4.1,22.2,3.9c10.4-0.2,20.9-0.7,31.3,0.1
|
||||
c14.3,1.2,28.8,2,43.1,1.4c7.3-0.3,14.4-1.5,21.5-2c5.6-0.5,13.1,1.3,17.2-3.6c3.4-4.1,2.9-12.8-2.3-15.1c-2.3-1-6.1-0.1-8.8-0.3
|
||||
c-4.4-0.3-4.1-1.1-6.1-4.1C750.7,261.1,748.3,257,744.8,255.3z"/>
|
||||
<path opacity="0.3" fill="#C47826" d="M731.5,246.1c0.4,0.9,1.4,2.3,1,3.2c-6.6-7.7-16.1-9.9-25.9-7.8c-2.8,0.6-3.9,2.8-6.8,2
|
||||
c-4-1.1-7.9-2-12.1-1.6c-5.8,0.5-11.2,3.6-15.2,7.6c1.3-5.8,5.4-8.7,10.1-11.6c2.7-1.7,5.8-2.6,9-2.9c2.5-0.2,5.3-0.6,7.8-0.3
|
||||
c2.4,0.3,4.2,1.3,6.6,0.8c2.5-0.5,5.2-0.7,7.8-0.5c4.9,0.4,10.5,2.4,13.6,6.3C728.6,242.9,730.6,244.4,731.5,246.1z"/>
|
||||
<path opacity="0.3" fill="#C47826" d="M616.2,322.7c2.7,0,5.8,0.2,6.7,3.1c0.5,1.8,0.5,4.3,2,5.8c1.5,1.4,4.9-0.4,5.9,1.7
|
||||
c0.8,1.6-1.9,3.5-3.1,4.3c-1.5,0.9-2.5,0.8-4.1,0.6c0.9,1.3,3.5,1,4,2.2c0.9,2-4.4,2.7-5.5,2.9c-4,0.8-8.2,1.1-11.7,3.3
|
||||
c4.4-0.1,8.7-1,13-1.2c3.1-0.1,6.1,0,9.2-0.1c2.5-0.1,4.7-0.7,7.1-1c2.3-0.4,5.3,0,6.2-2.6c0.6-1.6,0.3-3.5-0.5-4.9
|
||||
c-0.9-1.8-2-1.8-3.9-1.7c-0.9,0-2.3,0.8-3.1,0.5c-1.4-0.5-2.7-3.9-3.8-5c-1.2-1.2-2.8-1.2-4.3-1c-2,0.3-1.7,0.1-2.9-1.7
|
||||
c-1.1-1.6-3.1-4-4.9-4.7c-2.1-0.9-5.6-1.7-7.4,0c0.8,0,1.7-0.4,2.5-0.1"/>
|
||||
<path opacity="0.3" fill="#C47826" d="M357.5,115.2c7.3-0.6,13,3.6,18,8.3c5.3,5,3.4,9,3.2,15.5c5.2,0.2,16.1,2.7,10,10.1
|
||||
c-4.6,5.5-11.1,3.2-16.4,1.1c4.7,3.1-4.7,7.9-7.2,9c-5.6,2.4-12.2,2.8-18.1,3.5c-5.7,0.7-11.7-0.5-17.4-1.1
|
||||
c-5.8-0.6-11-0.7-16.3-3.5c-2.7-1.5-6.1-2.8-7.9-5.4c-1.1-1.6-0.8-4.2-2.4-5.2c-2.4-1.6-8.7-1-11.5-0.2c-3.5,1-7.1,3.5-7.6,7.3
|
||||
c-2.4,17.9,26.2,11.1,35.2,12.2c14.2,1.8,28.9-0.3,43.1,0.3c4.1,0.2,10.9,1.1,14.7,0.3c4-0.9,5.4-6.8,9.2-8.9
|
||||
c9.9-5.5,22.3-4.2,33.1-6.1c6.2-1.1,1.6-5.9-2.4-6.8c-1.9-0.4-4-0.7-6-0.2c-5.8,1.5-2.8-1.2-6-5.1c-2.2-2.6-6.5-7.4-10.2-7.7
|
||||
c-2.6-0.2-5,1.6-7.2-0.3c-2.3-1.9-2.2-6.2-3.9-8.6c-1.7-2.4-4.5-5.7-6.8-7.6c-6.3-5.3-13.6-2.1-20.6-0.8c-0.1,0.4,0.2,0.4,0.2,0.8"
|
||||
/>
|
||||
<path opacity="0.3" fill="#C47826" d="M658.7,426.7c-0.4-0.1-1.3-2.1-1.6-2.5c-1-1.2-1.9-1.7-3.5-1.3c0.9,0.5,2.5,0.8,2.7,2.1
|
||||
c0.2,1.6-1.2,1.7-2.4,2c2.2,1.4-3.4,2-4,2.1c-1.5,0.2-3.8-1.4-3.8-3.2c-1,0.1-1.2,0.8-2,1.2c-0.8,0.4-1.8,0.1-2.6,0.5
|
||||
c-1.8,0.8-0.5,2.6,0.8,3.4c1.3,0.7,3,0.3,4.4,0.3c2,0,4,0.1,6,0.4c1.4,0.2,2.6,0.7,4.1,0.8c1.6,0.1,3.1,0.2,4.6,0.4
|
||||
C662.2,430.2,661.9,427.1,658.7,426.7z"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M291.8,561.5c1.1,0,0.4,3.1,1.3,5.3"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M293.8,573.5c1.2,0.7,1.6,1.9,1.3,3.3"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="298" y1="566" x2="298" y2="570"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M571.8,562.1c0.1,3.2-0.4,6.2-0.7,9.3"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="566" y1="559" x2="566" y2="562"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M565.1,572.8c-0.1,1.8-0.3,3.6-0.7,5.3"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M510.4,694.1c3.1,2.4,7.4,2.4,10.7,4.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M517.1,691.5c-0.1,0.5,0.2,0.7,0.7,0.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M521.1,693.5c0.6,0.5,1.2,0.7,2,0.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M351.8,690.1c-0.6,1.3-1.9,2.3-3.3,2.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M357.8,693.5c-3.2,1.7-6.7,3.2-10,4.7"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="340" y1="696" x2="342" y2="696"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M304.4,713.5c2.8-6,7.2-18.7,14.7-20"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M559.8,713.5c-1.7-7.4-6.1-17-12.7-21.3"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M488,585.1c10.1,1.2,17.1-2.9,21.3-11.7c13.8,0.8,17.7-6.1,22.2-18.3"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M348.5,571.6c1.9,5.1,7.5,7.8,13.5,7.5"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M509,190.6c-5-3.7-12.8-1.7-13.8,5.8c-5.1-2.3-11.2-4.8-16.2,0.2"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M353,190.6c3.7-1.6,7.8-2,11.7-1.2c3.7,11.3,19.6-11.8,24.3,2.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M414.5,180.1c0-1.3,2.7-4,7.5-4.2c7.3-0.2,6.7,4.6,10.8,5.4c7.7,1.6,17.6-5.6,23.7,3.2"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M485,244.6c6.1-2.2,10.3-5.5,17.7-4.8c0.2-0.8,0.3-1.7,0.5-2.5c7.2,1,9.8-4.9,10.2-10.8"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M345.5,219.1c0.1,8.3,9.8,16.6,17.7,12.1c-1.7,11.8,9.6,12.2,18.3,11.8"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M401,228.1c12.7,10,28,18.1,44.7,9.2c4.3,10.1,22.6,3.4,25.8-4.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M413,210.1c5.5-2.3,11.8-1.5,18-1.5"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M487.9,175.8c-2.7-0.3-3,1.7-4.7,3c-1.5,1.2-4.6,0.2-5.4,1.2"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M447.8,155.6c-2.7-0.5-2.5,3-2.5,4.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M380,174.1c1.8,1.3,10.1,0.1,12.3,5.7c2.2,0.3,5,0.6,7.2,0.3"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M571.4,261.4c1.8-1.5,4.9-4.2,5.7-6.6"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M579.7,250.3c1.1-1.3,2-3.1,2-4.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M571.1,254.6c1.1-0.4,2.7-1.5,3.2-2.5"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M543.1,228.1c0.6,0.2,1.3,0.3,2,0.2"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M581.1,210c1.1-0.5,2.6-0.7,3.8-0.2"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M286.9,253.5c1.9,2.6,4.3,6.2,7,8"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M288.9,248.5c0.4,0.8,1.2,1.5,2,2"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M294.4,256c0.8,0.2,1.7,0.3,2.5,0.5"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M278.4,210.5c-2.2,0.8-2.8,4.2-2.5,6.5"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M311.9,229.5c1.2,0.7,3.2,0.5,5,0.5"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="322" y1="228" x2="324" y2="228"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="316" y1="233" x2="317" y2="233"/>
|
||||
<path fill="none" d="M575.8,449.5c0,0,2.9-2,3.6-3"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M569.2,464.5c-0.8,1.1-1.4,2.2-1.8,3.6"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M617.2,457.3c3.7,18.6-2.9,38.5-15.6,52.2"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M575.4,447.8c1.3-2.5,3.4-4.4,4.6-6.9"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M584.6,435.7c1.8-2.1,3-4.8,3.5-7.5"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M577.7,435.7c0.7-0.8,1.3-1.8,1.7-2.9"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M533.4,241.8c0,0.2,1,1.2,2.3,1.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M532.2,248.1c0.2,0.4,0.4,0.7,0.6,1.2"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M539.7,246.4c2.7,0.4,5.2,2.3,7.5,4"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M325.1,240.7c-1.7,0.8-3.5,1.7-4,3.5"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M323.4,247.6c1.2-0.9,2.6-1.6,4-1.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M314.7,253.3c0.3-0.7,0.9-1.1,1.7-1.2"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M425.8,342.5c2,0.9,5.8,0.9,7.5,0"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M438.4,341.9c1.6,0.2,3.1,0,4.6-0.6"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="432" y1="336" x2="436" y2="336"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M276.2,430.5c0.1,2.5,2,4.9,3.5,6.3"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M283.1,442.6c0.3,1.5,1.3,2.8,2.9,3.5"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M282.5,434c0,0.8,0.4,1.5,1.2,1.7"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="276" y1="264" x2="277" y2="264"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="280" y1="264" x2="281" y2="264"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="278" y1="269" x2="280" y2="269"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M581.1,264.8c1,0.1,2-0.1,2.9-0.6"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="579" y1="270" x2="581" y2="270"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="588" y1="268" x2="589" y2="268"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M604.5,522.3c0.5,0.2,1,0.7,1.3,1.1"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M608.4,525.6c0.5,0.5,1.1,0.9,1.6,1.3"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M604.8,525.4c0.5,0.1,0.9,0.4,1.3,0.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M618.7,560.8c0.5,0.2,1,0.3,1.5,0.5"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="623" y1="562" x2="625" y2="562"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M630.1,545.9c1.2,0.7,2.3,2.1,3,3"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M228.5,549.8c0.7-0.8,1.8-1.6,3-2"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="238" y1="565" x2="240" y2="565"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M241.9,565.2c-0.4-0.4,0.3-0.5,1-0.5"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="239" y1="562" x2="241" y2="562"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M322.4,660.5c2.9,6.9,11.8,11.9,19,13"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M330.4,660.5c0.5,0.7,1.2,1,2,1"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="338" y1="665" x2="341" y2="665"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M415.4,680.5c8.2,0,21.6-2.4,28,1"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M514.4,673.5c4.8,0.7,8.8-2.2,13-4"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M535.4,665.5c1.3-0.8,2.6-1.4,4-2"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M526.4,661.5c1.9-0.1,3.3-0.4,5-1"/>
|
||||
|
||||
<circle fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" cx="435.4" cy="532" r="3.2"/>
|
||||
<path fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M435.4,520.2
|
||||
c0,0,3.2,4.8,3.2,11.4"/>
|
||||
<path fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M435.4,520.2
|
||||
c0,0-3.2,4.9-3.2,11.5"/>
|
||||
<path fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M436.6,518.5
|
||||
c0.2,0.4,0.7,1.8,1.1,2.8c0.4,1.1,0.9,2.2,1.3,3.3c1,2.8,2.2,6.2,1.4,9.2c-0.5,1.9-2.1,2.7-3.9,2.9c-2.1,0.3-5.2,0.2-6.4-1.8
|
||||
c-0.9-1.5-0.8-3.5-0.5-5.2c0.3-1.7,0.8-3.4,1.4-5.1c0.4-1.1,0.9-2.2,1.3-3.3c0.5-1.1,1-2.2,1.5-3.3"/>
|
||||
<path fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M433.2,512.6
|
||||
c0,0-4.1,4-1.2,9.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M437,512.6
|
||||
c0,0,4,4.1,1.1,9.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M433.9,512.9
|
||||
c0,0-1.7,3.9,1.6,7.3"/>
|
||||
<path fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M437,512.9
|
||||
c0,0,1.7,3.9-1.6,7.3"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="431.2" y1="536" x2="430.9" y2="639.5"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="439.2" y1="535.7" x2="439.4" y2="639.5"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M479,529.6c7.3-11.8,17.8-9.6,29.8-12.2c1.1-12.7,13.7-21.7,25.4-16.4c2.1-8.8,10.1-13.9,18.3-10.3"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M273.5,483.1c6.6-1.4,18.7-5.7,25.6-3c8.5,3.4,7.8,11.6,15,15.1c4.5,2.3,13.1-2,19.8,2.5c7.2,4.8,11.4,10.9,11.9,19.6
|
||||
c13.4,0.2,34.9-0.2,37.2,16.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M285.5,525.1c7.6,8.7,22.4,21.2,36,11.9c6.4,6.5,14.9,10.2,24,10.6"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M398.4,549.5c0.3,8.1-2,12.8,5.8,16.5c-3.8,10.5,3.8,15.5,14.2,15.5"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M476.4,545.5c2,11.4-4.8,19.2-16.3,20.1c10.5,3.5,9.7,16.9-2.9,22.4c5.8,8.1,1.6,10.7-2.8,17.5"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M245,472.6c-3.3-5.5-2.3-12.2,4.2-15.3c-2.7-6.3-1-10.2,3.3-14.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M542.4,531.5c11.1,1.5,30.3-8.1,30-24"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M285.5,205v-5.4c0-17.4-27-26.5-27-26.5l-55.8,3.1l-20.4,10.3H127l-23.9,14.8c-23.5,0-24.2,15.5-24.2,15.5s0,87.9,0,87.9
|
||||
c-11.3,2.5-23.2,0.2-24.1,13.6c-0.2,3.5,0.2,7.2,0.3,10.8c0.5,11.6,1.4,23.1,2.1,34.7c1.7,27.6,3.4,55.2,5.1,82.8
|
||||
c0.1,1.1,0.4,1.9,0.5,3"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M230.5,174v31.6c0,0-21,0-21,5.3c0,5.3,0,28.8,0,28.8V398"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="182.5" y1="187" x2="182.5" y2="334"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M154.5,242v54.4c0,0-13.7-3-13.7,25.7c0,0-7.3-3-7.3,12.1V419"/>
|
||||
|
||||
<polyline fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
|
||||
102.5,201 102.5,276 98.3,282.9 100.4,330.5 "/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="78.5" y1="461" x2="78.5" y2="555"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="111.5" y1="406" x2="111.5" y2="423"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="249.5" y1="215" x2="249.5" y2="342"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="182.5" y1="394" x2="182.5" y2="647"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M618.4,528.1l44.6-31.6v-86.2l3-2.8v-9.7c0-7.7,11.9-11.7,11.9-11.7l24.6,1.4l9,4.5h24.3l10,6.5c10.3,0,10.2,6.9,10.2,6.9v38.7
|
||||
l11,2.3v6.7l6,3.3v-26l2-5V410h7.4l1.5,6.7l3,5.8v9l-3,7v21l4,7v32.7l25.1,20.9H659"/>
|
||||
|
||||
<polyline fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
|
||||
665.8,407.1 679,417.8 679,453 "/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M681.1,386.6l0.8,13.7c0,0,9.1,0.1,9.1,2.5c0,2.3,0,12.7,0,12.7v9.5"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="711" y1="392" x2="711" y2="457"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M723,416v24.5c0,0,6.4-1.3,6.4,11.3c0,0,3.6-1.3,3.6,5.3V494"/>
|
||||
|
||||
<polyline fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
|
||||
746,398 746,431.5 748.1,434.5 747.1,455.2 "/>
|
||||
|
||||
<polyline fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
|
||||
772.8,456.4 777,462 777,483 "/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="766" y1="480" x2="766" y2="494"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="757" y1="453" x2="757" y2="494"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="742" y1="488" x2="742" y2="496"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="670" y1="467" x2="670" y2="496"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="691" y1="442" x2="691" y2="496"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="711" y1="483" x2="711" y2="496"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="663" y1="497" x2="773" y2="497"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M628.8,538.8c0.6-0.6,180.6,0,180.6,0"/>
|
||||
|
||||
<polyline fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
|
||||
553.4,658.4 602.3,664.8 627.5,690 627.5,709 "/>
|
||||
|
||||
<polyline fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
|
||||
273.7,749.1 252.9,675.5 307.6,673.3 "/>
|
||||
<path fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M253.3,675.5c3.2,0,50.2,54.6,50.2,54.6v24.4l-29.4-5.4"/>
|
||||
|
||||
<polyline fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
|
||||
303,754.5 441.4,754.5 627.2,709 "/>
|
||||
|
||||
<polyline fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
|
||||
395.3,717.7 344.9,723.9 302.9,730.1 "/>
|
||||
|
||||
<polyline fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
|
||||
543.9,729.8 412.7,730 399.5,716.8 395.3,717.7 "/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="399.5" y1="716.8" x2="390.1" y2="755"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="412.7" y1="730" x2="412.4" y2="755"/>
|
||||
|
||||
<polyline fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
|
||||
764.8,648.5 641.7,606.8 574.8,596.1 "/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="297.1" y1="624.2" x2="125.2" y2="658.6"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M705.5,234.9c0-0.2,0.7-0.4,1.4-0.5c2.6-0.4,5.1-0.4,7.7,0c4.1,0.6,7.9,2.2,11.1,4.8c4.6,3.7,7.4,9.1,9,14.7c0,0,17.3-3,19.2,14
|
||||
c6.3,0,15.6-1.2,18.1,6.5c2.2,6.8-1.9,11.1-7,12.9c-2.2,0.8-4.6,1.2-6.7,1.1c-12.3-0.3-24.6-0.2-36.9,0c-21.3-0.2-54.4-0.6-75.7,0
|
||||
c-2.2,0.1-4.5-0.3-6.7-1.1c-5.1-1.9-9.2-6.1-7-12.9c2.5-7.6,11.8-6.5,18.1-6.5c1.9-17,19.8-14,19.8-14
|
||||
C677.1,229.4,705.5,234.9,705.5,234.9L705.5,234.9z"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M670.4,271.7c3.4,2.3,6.9,4.2,11.3,3.5c1.6-0.3,3.2-1.9,4.7-2.1c1.4-0.1,0.8,0.1,2,0.5c1.9,0.6,3.6,2.2,5.7,2.8
|
||||
c2.9,0.8,6.2,1,9.2,0.8c4.7-0.4,12.7-1.7,16.1-4.9c2.9,1.9,4.8,4.5,8.6,5.2c5.1,1,10.8-1.1,15.1-2.5"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M380.7,167.5c-0.7,0-5.5,0-6.3,0c-21.3-0.2-54.4-0.6-75.7,0c-2.2,0.1-4.5-0.3-6.7-1.1c-5.1-1.9-9.2-6.1-7-12.9
|
||||
c2.5-7.6,11.8-6.5,18.1-6.5c1.9-17,19.8-14,19.8-14c7.2-24.6,35.6-19,35.6-19v0c0-0.2,0.7-0.4,1.4-0.5c2.6-0.4,5.1-0.4,7.7,0
|
||||
c4.1,0.6,7.9,2.2,11.1,4.8c4.6,3.7,7.4,9.1,9,14.7c0,0,17.3-3,19.2,14c7.1-3.8,12.9-0.8,16.2,3.4"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M323.4,150.7c3.4,2.3,6.9,4.2,11.3,3.5c1.6-0.3,3.2-1.9,4.7-2.1c1.4-0.1,0.8,0.1,2,0.5c1.9,0.6,3.6,2.2,5.7,2.8
|
||||
c2.9,0.8,6.2,1,9.2,0.8c4.7-0.4,12.7-1.7,16.1-4.9c2.9,1.9,4.8,4.5,8.6,5.2c2.5,0.5,8.7,0.9,11.2,0.4"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M599.3,332.3c2.3-11.3,15-9.9,15-9.9h0c0-0.1,0.4-0.2,0.8-0.3c1.2-0.3,2.3-0.4,3.5-0.3c1.9,0.1,3.6,0.7,5.2,1.7
|
||||
c2.2,1.5,3.7,3.8,4.6,6.2c0,0,7.6-2,9.1,5.5c2.8-0.2,6.9-1.1,8.3,2.2c1.3,3-0.4,5-2.6,6.1c-0.9,0.4-2,0.7-3,0.8
|
||||
c-5.5,0.3-11,0.9-16.5,1.4c-6,0.5-14.1,1.1-21.6,1.7"/>
|
||||
|
||||
<path fill="none" stroke="#211915" stroke-width="1.3466" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M601.3,340.2c1.6,0.9,3.2,1.6,5.2,1.1c0.7-0.2,1.4-1,2-1.1c0.6-0.1,0.4,0,0.9,0.1c0.9,0.2,1.7,0.8,2.7,1c1.4,0.3,2.8,0.2,4.1,0
|
||||
c2.1-0.3,5.6-1.3,7-2.8c1.4,0.7,2.3,1.8,4.1,2c2.3,0.2,4.8-0.9,6.6-1.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M661.5,433
|
||||
c-1.9-0.2-3.7-0.4-5.6-0.6c-3.7-0.4-9.4-1.1-13.1-1.4c-0.4,0-0.8-0.1-1.1-0.3c-0.9-0.4-1.5-1.2-1-2.4c0.6-1.3,2.2-0.9,3.3-0.8
|
||||
c0.6-2.9,3.6-2.1,3.6-2.1c1.7-4.1,6.5-2.6,6.5-2.6l0,0c0,0,0.2-0.1,0.3-0.1c0.5,0,0.9,0,1.4,0.2c0.7,0.2,1.3,0.5,1.8,1
|
||||
c0.7,0.7,1.1,1.7,1.3,2.7c0,0,2.2-0.1,2.9,1.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M647.4,428.5c0.5,0.5,1.1,0.9,1.9,0.8c0.3,0,0.6-0.3,0.9-0.3c0.2,0,0.1,0,0.3,0.1c0.3,0.1,0.6,0.4,0.9,0.6c0.5,0.2,1,0.3,1.6,0.3
|
||||
c0.8,0,2.2-0.1,2.9-0.6c0.5,0.4,0.8,0.9,1.4,1.1c0.9,0.3,1.9,0,2.7-0.2"/>
|
||||
<path fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M762.5,559v-6.2
|
||||
c0,0-2.6-0.1-2.9-2.1c0,0-0.3-1.7,0.4-2.1c0,0,0.7-0.5,0.7,2c0,0,0.4,0.9,1,0.9l0-6.4c0,0,0.4-1.1,1.3-1.1c0,0,1.4-0.2,1.4,0.9
|
||||
c0,0,0,9.1,0,9.1c0,0.1,0.6-0.5,0.7-0.7c0.2-0.3-0.1-0.8,0-1.2c0-0.6-0.1-2.8,0.4-2.9c0.7-0.2,0.8,1.1,0.9,1.6
|
||||
c0.1,1.2,0.2,2.6-0.7,3.6c-0.1,0.2-1.3,1-1.3,0.9c0,0,0,3.7,0,3.7"/>
|
||||
|
||||
<path fill="none" stroke="#211915" stroke-width="0.7513" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M759.1,559.8c0.6,0,1.4,0.2,1.9,0.1c0.5-0.1,0.8-0.4,1.4-0.4c1.5,0.1,3.1,0.2,4.6,0.3c0.8,0.1,1.9-0.1,2.7,0"/>
|
||||
<path fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M754.5,626v-6.2
|
||||
c0,0-2.6-0.1-2.9-2.1c0,0-0.3-1.7,0.4-2.1c0,0,0.7-0.5,0.7,2c0,0,0.4,0.9,1,0.9l0-6.4c0,0,0.4-1.1,1.3-1.1c0,0,1.4-0.2,1.4,0.9
|
||||
c0,0,0,9.1,0,9.1c0,0.1,0.6-0.5,0.7-0.7c0.2-0.3-0.1-0.8,0-1.2c0-0.6-0.1-2.8,0.4-2.9c0.7-0.2,0.8,1.1,0.9,1.6
|
||||
c0.1,1.2,0.2,2.6-0.7,3.6c-0.1,0.2-1.3,1-1.3,0.9c0,0,0,3.7,0,3.7"/>
|
||||
|
||||
<path fill="none" stroke="#211915" stroke-width="0.7513" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M751.1,626.8c0.6,0,1.4,0.2,1.9,0.1c0.5-0.1,0.8-0.4,1.4-0.4c1.5,0.1,3.1,0.2,4.6,0.3c0.8,0.1,1.9-0.1,2.7,0"/>
|
||||
<path fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M676.5,564v-6.2
|
||||
c0,0,2-0.1,2.2-2.1c0,0,0-1.7-0.7-2.1c0,0-0.9-0.5-0.9,2c0,0-0.4,0.9-1,0.9l-0.1-6.4c0,0,0.2-1.1-0.6-1.1c0,0-0.8-0.2-0.8,0.9
|
||||
c0,0,0,9.1,0,9.1c0,0.1-1.3-0.5-1.4-0.7c-0.2-0.3-0.3-0.8-0.3-1.2c0-0.6,0-2.8-0.6-2.9c-0.7-0.2-0.9,1.1-1,1.6
|
||||
c-0.1,1.2,0.5,2.6,1.3,3.6c0.1,0.2,1.9,1,1.9,0.9c0,0,0,3.7,0,3.7"/>
|
||||
|
||||
<path fill="none" stroke="#211915" stroke-width="0.7513" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M678.6,564.8c-0.6,0-1.4,0.2-1.9,0.1c-0.5-0.1-0.8-0.4-1.4-0.4c-1.5,0.1-3.1,0.2-4.6,0.3c-0.8,0.1-1.9-0.1-2.7,0"/>
|
||||
<path fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M593.5,590v-6.2
|
||||
c0,0,2-0.1,2.2-2.1c0,0,0-1.7-0.7-2.1c0,0-0.9-0.5-0.9,2c0,0-0.4,0.9-1,0.9l-0.1-6.4c0,0,0.2-1.1-0.6-1.1c0,0-0.8-0.2-0.8,0.9
|
||||
c0,0,0,9.1,0,9.1c0,0.1-1.3-0.5-1.4-0.7c-0.2-0.3-0.3-0.8-0.3-1.2c0-0.6,0-2.8-0.6-2.9c-0.7-0.2-0.9,1.1-1,1.6
|
||||
c-0.1,1.2,0.5,2.6,1.3,3.6c0.1,0.2,1.9,1,1.9,0.9c0,0,0,3.7,0,3.7"/>
|
||||
|
||||
<path fill="none" stroke="#211915" stroke-width="0.7513" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M595.6,590.8c-0.6,0-1.4,0.2-1.9,0.1c-0.5-0.1-0.8-0.4-1.4-0.4c-1.5,0.1-3.1,0.2-4.6,0.3c-0.8,0.1-1.9-0.1-2.7,0"/>
|
||||
|
||||
<polygon fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
|
||||
706.4,665 685.4,665 680.8,691 693.6,690.9 722.3,673.4 "/>
|
||||
|
||||
<polyline fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
|
||||
686.4,666 699,680 719.9,674.8 "/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="699" y1="680" x2="697.1" y2="688.8"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="601.8" y1="664.9" x2="560.5" y2="725.8"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M136.4,187l-0.5-19.8c0,0-7.2-0.3-7.9-6.3c0,0-0.7-5.3,1.6-6.3c0,0,2.4-1.5,2.4,5.9c0,0,1.2,2.6,3,2.6l0.2-19.4
|
||||
c0,0,0.7-3.2,3.2-3.2c0,0,3.6-0.7,3.6,2.7c0,0,0,27.4,0,27.6c0,0.2,2.6-1.6,2.8-2c0.6-1,0.2-2.4,0.2-3.5c0.1-1.8-0.2-8.4,1.4-8.8
|
||||
c2.2-0.6,2.6,3.2,2.7,4.8c0.3,3.5-0.2,8-2.6,10.9c-0.4,0.5-4.7,3.1-4.7,2.7c0,0-0.8,11.9-0.8,11.9"/>
|
||||
<ellipse transform="matrix(0.128 -0.9918 0.9918 0.128 -74.1595 701.2955)" cx="361.7" cy="392.8" rx="14.3" ry="14.3"/>
|
||||
<ellipse transform="matrix(0.128 -0.9918 0.9918 0.128 45.52 835.4486)" cx="497.8" cy="391.8" rx="14.3" ry="14.3"/>
|
||||
<path d="M438.1,441.2c-5.7,0.6-12.5-0.3-15.2-1.8c-1.6-0.9-3.2-2-4.1-3.5c-2.6-4.1,3-6.4,6.5-7.4c3.2-0.9,6.4-1.1,9.7-0.8
|
||||
c2.7,0.2,5.3,0.7,7.7,1.8c2.4,1.1,3.6,1.6,4.3,3.9C448.5,438.4,443.8,440.6,438.1,441.2z"/>
|
||||
|
||||
<ellipse transform="matrix(0.128 -0.9918 0.9918 0.128 45.5048 835.4331)" fill="none" stroke="#000000" stroke-width="3.6235" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" cx="497.8" cy="391.8" rx="49" ry="49"/>
|
||||
|
||||
<ellipse transform="matrix(0.128 -0.9918 0.9918 0.128 -72.0028 704.4983)" fill="none" stroke="#000000" stroke-width="3.6235" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" cx="364.6" cy="393.2" rx="49" ry="49"/>
|
||||
<ellipse transform="matrix(0.128 -0.9918 0.9918 0.128 -74.1595 701.2955)" cx="361.7" cy="392.8" rx="14.3" ry="14.3"/>
|
||||
<ellipse transform="matrix(0.128 -0.9918 0.9918 0.128 45.52 835.4486)" cx="497.8" cy="391.8" rx="14.3" ry="14.3"/>
|
||||
<ellipse transform="matrix(0.1279 -0.9918 0.9918 0.1279 -5.0822 559.8978)" cx="315.8" cy="282.8" rx="7.1" ry="7.1"/>
|
||||
|
||||
<ellipse transform="matrix(0.128 -0.9918 0.9918 0.128 7.9834 574.7572)" fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" cx="330.8" cy="282.8" rx="24.3" ry="24.3"/>
|
||||
|
||||
<path fill="none" stroke="#000000" stroke-width="3.6235" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M405.8,440c4.4-2.8,10.1-6,15.5-5.8c5.1,0.1,10.2,1.1,15.3,1.6c4.8,0.5,9.3,0.3,14,1.9c4.7,1.6,9.2,4.4,12.5,8.2
|
||||
c3.8,4.3,2.1,11.3-3,14.7c-9.6,6.3-18.6-4.7-28.5-4.1c-9.5,0.5-17.6,9.9-27.2,2.6C398,454.3,400,443.7,405.8,440z"/>
|
||||
|
||||
<path fill="none" stroke="#000000" stroke-width="3.6235" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M431.8,458c-0.3,3.9-0.5,9.8,0,11.9c1,3.6,5.5,3.8,10.6,3.4c6.1-0.5,5-4.5,5-5.7c0-0.8-0.4-4.6-0.3-5.5"/>
|
||||
|
||||
<path fill="none" stroke="#000000" stroke-width="3.6235" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M412.4,462.5c-0.3,3.9-0.3,5.8,0.2,7.9c1,3.6,5.5,3.8,10.6,3.4c6.1-0.5,7.7-1.3,7.7-2.8c0-1,0.5-12.1,0.6-13"/>
|
||||
|
||||
<path fill="none" stroke="#000000" stroke-width="3.6235" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M438.1,441.2c-5.7,0.6-12.5-0.3-15.2-1.8c-1.6-0.9-3.2-2-4.1-3.5c-2.6-4.1,3-6.4,6.5-7.4c3.2-0.9,6.4-1.1,9.7-0.8
|
||||
c2.7,0.2,5.3,0.7,7.7,1.8c2.4,1.1,3.6,1.6,4.3,3.9C448.5,438.4,443.8,440.6,438.1,441.2z"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M261,410.5c-3.1-12.4-4.1-25.4-2.9-37.2c2.6-24.3,12.9-46.9,21.9-69.3c11.1-27.8,25.4-58,52.2-73.8"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M330.9,222c-10.2,2.1-22.6,3.5-32-2.4c-6.5-4.1-11.5-18.1-20.6-15.8c-7.2,1.8-7.7,14-7.4,19.5c0.6,10.5,3.9,20.8,9,30
|
||||
c2.6,4.7,8.9,16.6,14.2,18.3"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M286,546.9c-2.6,33.1,6.4,70.2,20.1,100.1c6,13.2,15.1,24.5,28.5,30.6c21.6,9.8,46.8,10.5,70.1,11.8c9.1,0.5,21,1.2,29.2,1.4"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M259.4,518.3c-6.9,4.3-17,12.7-21.8,17.4c-2.6,2.6-11.7,10.6-13,14.2c-2.5,6.8,7.5,2.4,8.8,8.5c1.5,6.9-5.1,11,5.3,10.7
|
||||
c5.8-0.2,11.4-2.1,16.7-4.1c8.7-3.2,20.5-5.3,30.2-10.6"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M317.5,664.9c-8.3,6.8-16.6,13.6-20.8,23.6c-5,11.8-0.9,27.8,13.1,28.6c9.8,0.5,27-6.3,35.6-10.5c8.8-4.3,23.5-13.1,31.8-18.9"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M283.3,259c-6.4,0-28.9,8-30.7,14.9c-3.2,12.2,24.7,15.7,32.6,17.2"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M234.4,538.8c6.3,2.1,10.2,8.2,12.3,12.6c2.2,4.7,3,10.8,0.9,16.2"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M628.8,538.8c-6.3,2.1-10.2,8.2-12.3,12.6c-2.2,4.7-3,10.8-0.9,16.2"/>
|
||||
<ellipse transform="matrix(0.9918 -0.1279 0.1279 0.9918 -31.6962 72.2437)" cx="546.5" cy="282.8" rx="7.1" ry="7.1"/>
|
||||
|
||||
<ellipse transform="matrix(0.9918 -0.128 0.128 0.9918 -31.8144 70.6109)" fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" cx="533.5" cy="282.8" rx="24.3" ry="24.3"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M476.3,312.8c77.4-0.2,109,83,89.2,149.3"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M388.3,313.8c-77.4-0.2-109,83-89.2,149.3"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M432.7,288.4c9.9-0.2,20.7-0.6,29.5,3.5c10.5,4.9,17.9,23.8,13,34.9c-4.8,11-16.3,17-27.5,19.7c-18.9,4.5-49.7,0.8-58.7-19.7
|
||||
c-4.9-11.1,2.5-30,13-34.9C411.1,287.7,422.6,288.1,432.7,288.4"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M532.2,230.2c24.2,14.3,33.4,34.7,45.8,58c20.4,38.4,34.4,73.7,24.8,118.8"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M533.5,222.1c10.2,2.1,22.6,3.5,32-2.3c6.5-4.1,11.6-18.1,20.6-15.8c7.2,1.8,7.7,14,7.3,19.6c-0.6,10.5-4,20.7-9,30
|
||||
c-2.6,4.7-9.7,17.1-15,18.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M578.3,546.9c2.6,33.1-6.4,70.2-20.1,100.1c-6,13.2-15.1,24.5-28.5,30.6c-21.6,9.8-46.8,10.5-70.1,11.8c-9.1,0.5-17.4,1.2-25.7,1.4
|
||||
"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M604.9,518.3c6.9,4.3,17,12.7,21.8,17.4c2.6,2.6,11.7,10.6,13,14.2c2.5,6.8-7.5,2.4-8.8,8.5c-1.5,6.9,5.1,11-5.3,10.7
|
||||
c-5.8-0.2-11.4-2.1-16.7-4.1c-8.7-3.2-20.5-5.3-30.2-10.6"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M546.8,664.9c8.3,6.8,16.6,13.6,20.8,23.6c5,11.8,0.9,27.8-13.1,28.6c-9.8,0.5-27-6.3-35.6-10.5c-8.8-4.3-23.5-13.1-31.8-18.9"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M581,259.2c6.4,0,28.9,8.1,30.6,15c3.2,12.2-24.5,14.1-32.4,15.6"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="5" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M294.8,462.1c27.8-1.2,51.6,19.5,64.3,42l-7-10.7c14.2-2.2,32.2,4.7,41.5,16c10.4-3,16.9,0.6,20.6,5.3c10.2-6.8,25.1-3.8,35,0
|
||||
c3.6-5,10.5-8.4,21.4-5.3c9.3-11.4,27.3-18.2,41.5-16l-7,10.7c12.7-22.6,36.5-43.3,64.3-42c18.5-14.8,29.8-30.7,33-54.6l-0.5,3
|
||||
c31.9-6.5,36.9,118.6-6.8,107.6l3.5,0.6c-1.8,22.1-31.5,38.1-51.5,37.4l3.2,0.1c-5.7,28.7-35.4,46.9-59.5,42.9
|
||||
c0,0.6-3.7,8.1-13,7.7c-7.4-0.3-3.8-6.7-7.3-10.7c-0.2,2.7-3.1,10.9-6.7,11.8c-3.7,0.9-3.9,1.4-12.4-0.9
|
||||
c-0.7,11.1-7.6,27.4-16.7,34.5c-8.2-5.6-18-24.8-20.4-34.8c-4.6,3.2-7.8,3.6-12.1,0.1c-2.4-1.9-8.3-8.2-8.5-10.8
|
||||
c-3.5,4,0,10.4-7.3,10.7c-4.5,0.2-9.9-5.7-10-10c-26.2-1.2-56.8-11.9-62.6-40.6l3.2-0.1c-20,0.7-49.7-15.3-51.5-37.4l3.5-0.6
|
||||
c-43.7,11-40-114.1-8.1-107.6c2.3,9.1,5.7,17.9,10.3,25.5C277.3,446.1,285.6,454.7,294.8,462.1z"/>
|
||||
|
||||
<path fill="none" stroke="#211915" stroke-width="2.8817" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M168.3,187c69-71.8,166-116.4,273.4-116.4C651.2,70.5,821,240.3,821,449.8C821,659.2,651.2,829,441.7,829
|
||||
C232.3,829,62.5,659.2,62.5,449.8"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="5" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M508.6,255.4c0,1.2-0.3,2.8-0.5,4.2c-0.4,2.9-1.4,5.7-2.2,8.5c5.9-6.6,12.4-10.7,16.5-19.3c4.6-9.6,11.1-15.9,11.1-26.7
|
||||
c-0.9-11.9-7-31.3-22.1-31.3c-4.4-9.4-17-17.2-24.2-15.5c-0.9-15.8-22.3-25.7-38.8-21.3l-0.1,0c-8.3-6.8-20.1-8.6-31.2,0
|
||||
c-16.7-4.5-38.2,5.6-38.6,21.7c-6.9-2.6-20.9,5.2-25.5,15c-15.1,0-21.2,19.4-22.1,31.3c0,10.8,6.5,17.1,11.1,26.7
|
||||
c4.1,8.7,10.6,12.8,16.5,19.3c-0.8-2.7-1.8-5.6-2.2-8.5c-0.2-1.4-0.5-3-0.5-4.2l0,0.1c3.2,6.8,3.4,12.8,9.5,17.8
|
||||
c5.4,4.5,12,6.4,17.9,8.8c-1.2-2-2.4-10,0-13.3c1.4,7,20.1,16.5,27.3,15.3c-1.2,0-1.3-8.5-1.3-11.3c6.4,0,16.9,6.7,23.1,10.2
|
||||
c6.2-3.5,16.6-10.3,23.1-10.2c0,2.8-0.1,11.4-1.3,11.3c7.3,1.1,25.9-8.3,27.3-15.3c2.4,3.3,1.2,11.3,0,13.3
|
||||
c5.8-2.4,12.4-4.4,17.9-8.8C505.2,268.3,505.3,262.3,508.6,255.4"/>
|
||||
|
||||
<path fill="none" stroke="#211915" stroke-width="2.0849" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M467.6,315c-6.7,0.9-6.8,7.5-6.3,12.9"/>
|
||||
|
||||
<path fill="none" stroke="#211915" stroke-width="2.0849" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M399.2,315c6.7,0.9,6.8,7.5,6.3,12.9"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M572.4,277.7c0,0,24.9-1.8,28.9,2.2"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M261.4,277.7c0,0,24.9-1.8,28.9,2.2"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M524.6,709.2c10.4-10.9,26.9-24.7,41.5-22.8"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M339.1,709.2c-10.4-10.9-26.9-24.7-41.5-22.8"/>
|
||||
</g>
|
||||
<path fill="none" stroke="#000000" stroke-width="3.6235" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M431.5,468.1"/>
|
||||
<path fill="none" stroke="#000000" stroke-width="3.6235" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M425.1,474.6"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 64 KiB |
12
assets/js/application.js
Normal file
12
assets/js/application.js
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
require("expose-loader?exposes=$,jQuery!jquery");
|
||||
require("bootstrap/dist/js/bootstrap.bundle.js");
|
||||
|
||||
$(() => {
|
||||
copyToClipboard = function(elementId) {
|
||||
console.log("El:", elementId)
|
||||
var el = document.getElementById(elementId);
|
||||
el.select();
|
||||
el.setSelectionRange(0, 99999);
|
||||
navigator.clipboard.writeText(el.value);
|
||||
}
|
||||
});
|
||||
38
cmd/app/main.go
Normal file
38
cmd/app/main.go
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"log"
|
||||
|
||||
"newsbox/actions"
|
||||
)
|
||||
|
||||
// main is the starting point for your Buffalo application.
|
||||
// You can feel free and add to this `main` method, change
|
||||
// what it does, etc...
|
||||
// All we ask is that, at some point, you make sure to
|
||||
// call `app.Serve()`, unless you don't want to start your
|
||||
// application that is. :)
|
||||
func main() {
|
||||
app := actions.App()
|
||||
if err := app.Serve(); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
# Notes about `main.go`
|
||||
|
||||
## SSL Support
|
||||
|
||||
We recommend placing your application behind a proxy, such as
|
||||
Apache or Nginx and letting them do the SSL heavy lifting
|
||||
for you. https://gobuffalo.io/en/docs/proxy
|
||||
|
||||
## Buffalo Build
|
||||
|
||||
When `buffalo build` is run to compile your binary, this `main`
|
||||
function will be at the heart of that binary. It is expected
|
||||
that your `main` function will start your application using
|
||||
the `app.Serve()` method.
|
||||
|
||||
*/
|
||||
13
config/buffalo-app.toml
Normal file
13
config/buffalo-app.toml
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
name = "newsbox"
|
||||
bin = "bin/newsbox"
|
||||
vcs = "git"
|
||||
with_pop = true
|
||||
with_sqlite = false
|
||||
with_dep = false
|
||||
with_webpack = true
|
||||
with_nodejs = true
|
||||
with_yarn = true
|
||||
with_docker = true
|
||||
with_grifts = true
|
||||
as_web = true
|
||||
as_api = false
|
||||
3
config/buffalo-plugins.toml
Normal file
3
config/buffalo-plugins.toml
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
[[plugin]]
|
||||
binary = "buffalo-pop"
|
||||
go_get = "github.com/gobuffalo/buffalo-pop/v3@latest"
|
||||
9
database.yml
Normal file
9
database.yml
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
---
|
||||
development:
|
||||
url: {{envOr "DATABASE_URL" "postgres://postgres:postgres@127.0.0.1:5432/newsbox?sslmode=disable"}}
|
||||
|
||||
test:
|
||||
url: {{envOr "TEST_DATABASE_URL" "postgres://postgres:postgres@127.0.0.1:5432/newsbox_test?sslmode=disable"}}
|
||||
|
||||
production:
|
||||
url: {{envOr "DATABASE_URL" "postgres://postgres:postgres@127.0.0.1:5432/newsbox_production?sslmode=disable"}}
|
||||
15
docker-compose.yml
Normal file
15
docker-compose.yml
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
# docker-compose.yml
|
||||
version: '3'
|
||||
services:
|
||||
database:
|
||||
image: "postgres:15"
|
||||
restart: always
|
||||
volumes:
|
||||
- db:/var/lib/postgresql/data/
|
||||
ports:
|
||||
- 5432:5432
|
||||
environment:
|
||||
- POSTGRES_USER=postgres
|
||||
- POSTGRES_PASSWORD=postgres
|
||||
volumes:
|
||||
db:
|
||||
43
env.sample
Normal file
43
env.sample
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
# The instance's name
|
||||
SITE_NAME=<SITE_NAME>
|
||||
|
||||
# The domain name where this site is reachable
|
||||
SITE_DOMAIN=<SITE_DOMAIN>
|
||||
|
||||
# The scheme to use when building URLs in development. This should be `http` unless your dev environments have TLS
|
||||
# certificates.
|
||||
SITE_PROTOCOL=<SITE_PROTOCOL>
|
||||
|
||||
# Database URL: scheme://username:password@hostname:port/database
|
||||
DATABASE_URL=<DATABASE_URL>
|
||||
|
||||
# Enable Plausible (plausible.io) privacy-respecting analytics
|
||||
ENABLE_ANALYTICS=<ENABLE_ANALYTICS>
|
||||
|
||||
# Enable Plausible (plausible.io) privacy-respecting analytics self-hosting
|
||||
# The plausible analytics script must be accessible at https://SITE_DOMAIN/js/script.js for this to work
|
||||
ENABLE_ANALYTICS_SELF_HOSTING=<ENABLE_ANALYTICS_SELF_HOSTING>
|
||||
|
||||
# Stripe key, if you want to charge for your service
|
||||
# Currently, only Stripe and strip-hosted payment pages are supported.
|
||||
# Consider support for open-source Lago (http://getlago.com/) in addition to Stripe
|
||||
STRIPE_KEY=<STRIPE_KEY>
|
||||
STRIPE_PRICE_ID=<STRIPE_PRICE_ID>
|
||||
|
||||
# Github Oauth credentials configuration
|
||||
# Leave blank to disable Github authentication
|
||||
GH_OAUTH_CLIENT_ID=<GH_OAUTH_CLIENT_ID>
|
||||
GH_OAUTH_CLIENT_SECRET=<GH_OAUTH_CLIENT_SECRET>
|
||||
|
||||
# The API key of the Mailgun account that handles mail for SITE_DOMAIN
|
||||
#
|
||||
# Mailgun delivers messages to newsbox via webhook.
|
||||
# Receiving mail via Mailgun will be factored out in favor of a locally run SMTP server in the near future
|
||||
MAILGUN_API_KEY=<MAILGUN_API_KEY>
|
||||
|
||||
# SMTP configuration for outgoing email
|
||||
SMTP_HOST=<SMTP_HOST>
|
||||
SMTP_PORT=<SMTP_PORT>
|
||||
SMTP_USER=<SMTP_USER>
|
||||
SMTP_PASSWORD=<SMTP_PASSWORD>
|
||||
|
||||
32
fixtures/sample.toml
Normal file
32
fixtures/sample.toml
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
[[scenario]]
|
||||
name = "lots of widgets"
|
||||
|
||||
[[scenario.table]]
|
||||
name = "widgets"
|
||||
|
||||
[[scenario.table.row]]
|
||||
id = "<%= uuidNamed("widget") %>"
|
||||
name = "This is widget #1"
|
||||
body = "some widget body"
|
||||
created_at = "<%= now() %>"
|
||||
updated_at = "<%= now() %>"
|
||||
|
||||
[[scenario.table.row]]
|
||||
id = "<%= uuid() %>"
|
||||
name = "This is widget #2"
|
||||
body = "some widget body"
|
||||
created_at = "<%= now() %>"
|
||||
updated_at = "<%= now() %>"
|
||||
|
||||
[[scenario.table]]
|
||||
name = "users"
|
||||
|
||||
[[scenario.table.row]]
|
||||
id = "<%= uuid() %>"
|
||||
name = "Mark Bates"
|
||||
admin = true
|
||||
age = 41
|
||||
widget_id = "<%= uuidNamed("widget") %>"
|
||||
created_at = "<%= now() %>"
|
||||
updated_at = "<%= now() %>"
|
||||
|
||||
115
go.mod
Normal file
115
go.mod
Normal file
|
|
@ -0,0 +1,115 @@
|
|||
module newsbox
|
||||
|
||||
go 1.18
|
||||
|
||||
require (
|
||||
github.com/btubbs/pgq v0.0.0-20190101193147-0a3335913e86
|
||||
github.com/gin-gonic/gin v1.8.2
|
||||
github.com/gobuffalo/buffalo v0.18.9
|
||||
github.com/gobuffalo/buffalo-pop/v3 v3.0.6
|
||||
github.com/gobuffalo/envy v1.10.2
|
||||
github.com/gobuffalo/grift v1.5.2
|
||||
github.com/gobuffalo/mw-csrf v1.0.1
|
||||
github.com/gobuffalo/mw-i18n/v2 v2.0.2
|
||||
github.com/gobuffalo/mw-paramlogger v1.0.1
|
||||
github.com/gobuffalo/nulls v0.4.2
|
||||
github.com/gobuffalo/pop/v6 v6.0.6
|
||||
github.com/gobuffalo/suite/v4 v4.0.3
|
||||
github.com/gobuffalo/validate v2.0.4+incompatible
|
||||
github.com/gobuffalo/validate/v3 v3.3.3
|
||||
github.com/gobuffalo/x v0.1.0
|
||||
github.com/gofrs/uuid v4.3.0+incompatible
|
||||
github.com/jackc/pgx/v5 v5.2.0
|
||||
github.com/mailgun/mailgun-go/v4 v4.8.1
|
||||
github.com/markbates/going v1.0.3
|
||||
github.com/markbates/goth v1.76.0
|
||||
github.com/pkg/errors v0.9.1
|
||||
golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90
|
||||
)
|
||||
|
||||
replace github.com/gobuffalo/buffalo v0.18.9 => github.com/acaloiaro/buffalo v1.1.1
|
||||
|
||||
replace github.com/gobuffalo/gocraft-work-adapter v0.0.0-20180714213200-7d6504f1dffe => github.com/acaloiaro/gocraft-work-adapter v0.0.0-20220905162749-af49ce80f9ef
|
||||
|
||||
require (
|
||||
github.com/BurntSushi/toml v1.2.0 // indirect
|
||||
github.com/Masterminds/semver/v3 v3.1.1 // indirect
|
||||
github.com/aymerick/douceur v0.2.0 // indirect
|
||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||
github.com/dustin/go-humanize v1.0.0 // indirect
|
||||
github.com/fatih/color v1.13.0 // indirect
|
||||
github.com/fatih/structs v1.1.0 // indirect
|
||||
github.com/felixge/httpsnoop v1.0.1 // indirect
|
||||
github.com/fsnotify/fsnotify v1.5.4 // indirect
|
||||
github.com/go-sql-driver/mysql v1.6.0 // indirect
|
||||
github.com/gobuffalo/events v1.4.3 // indirect
|
||||
github.com/gobuffalo/fizz v1.14.2 // indirect
|
||||
github.com/gobuffalo/flect v0.3.0 // indirect
|
||||
github.com/gobuffalo/github_flavored_markdown v1.1.3 // indirect
|
||||
github.com/gobuffalo/helpers v0.6.7 // indirect
|
||||
github.com/gobuffalo/httptest v1.5.2 // indirect
|
||||
github.com/gobuffalo/logger v1.0.7 // indirect
|
||||
github.com/gobuffalo/meta v0.3.3 // indirect
|
||||
github.com/gobuffalo/plush/v4 v4.1.16 // indirect
|
||||
github.com/gobuffalo/refresh v1.13.2 // indirect
|
||||
github.com/gobuffalo/tags/v3 v3.1.4 // indirect
|
||||
github.com/goccy/go-json v0.9.11 // indirect
|
||||
github.com/golang/protobuf v1.5.0 // indirect
|
||||
github.com/gorilla/css v1.0.0 // indirect
|
||||
github.com/gorilla/handlers v1.5.1 // indirect
|
||||
github.com/gorilla/mux v1.8.0 // indirect
|
||||
github.com/gorilla/securecookie v1.1.1 // indirect
|
||||
github.com/gorilla/sessions v1.2.1 // indirect
|
||||
github.com/guregu/null v4.0.0+incompatible // indirect
|
||||
github.com/inconshreveable/mousetrap v1.0.0 // indirect
|
||||
github.com/jackc/chunkreader/v2 v2.0.1 // indirect
|
||||
github.com/jackc/pgconn v1.12.1 // indirect
|
||||
github.com/jackc/pgio v1.0.0 // indirect
|
||||
github.com/jackc/pgpassfile v1.0.0 // indirect
|
||||
github.com/jackc/pgproto3/v2 v2.3.0 // indirect
|
||||
github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect
|
||||
github.com/jackc/pgtype v1.11.0 // indirect
|
||||
github.com/jackc/pgx/v4 v4.16.1 // indirect
|
||||
github.com/jackc/puddle/v2 v2.1.2 // indirect
|
||||
github.com/jmoiron/sqlx v1.3.5 // indirect
|
||||
github.com/joho/godotenv v1.4.0 // indirect
|
||||
github.com/joomcode/errorx v1.1.0 // indirect
|
||||
github.com/json-iterator/go v1.1.12 // indirect
|
||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
|
||||
github.com/kr/text v0.2.0 // indirect
|
||||
github.com/lib/pq v1.10.7 // indirect
|
||||
github.com/luna-duclos/instrumentedsql v1.1.3 // indirect
|
||||
github.com/mattn/go-colorable v0.1.9 // indirect
|
||||
github.com/mattn/go-isatty v0.0.16 // indirect
|
||||
github.com/mattn/go-sqlite3 v2.0.3+incompatible // indirect
|
||||
github.com/microcosm-cc/bluemonday v1.0.20 // indirect
|
||||
github.com/mitchellh/go-homedir v1.1.0 // indirect
|
||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect
|
||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||
github.com/monoculum/formam v3.5.5+incompatible // indirect
|
||||
github.com/nicksnyder/go-i18n v1.10.1 // indirect
|
||||
github.com/pelletier/go-toml v1.2.0 // indirect
|
||||
github.com/pelletier/go-toml/v2 v2.0.6 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||
github.com/robfig/cron v1.2.0 // indirect
|
||||
github.com/rogpeppe/go-internal v1.9.0 // indirect
|
||||
github.com/sergi/go-diff v1.2.0 // indirect
|
||||
github.com/sirupsen/logrus v1.9.0 // indirect
|
||||
github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d // indirect
|
||||
github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e // indirect
|
||||
github.com/spf13/cobra v1.5.0 // indirect
|
||||
github.com/spf13/pflag v1.0.5 // indirect
|
||||
github.com/stretchr/testify v1.8.1 // indirect
|
||||
github.com/ugorji/go/codec v1.2.7 // indirect
|
||||
go.uber.org/atomic v1.10.0 // indirect
|
||||
golang.org/x/net v0.4.0 // indirect
|
||||
golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43 // indirect
|
||||
golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0 // indirect
|
||||
golang.org/x/sys v0.3.0 // indirect
|
||||
golang.org/x/term v0.3.0 // indirect
|
||||
golang.org/x/text v0.5.0 // indirect
|
||||
google.golang.org/appengine v1.6.6 // indirect
|
||||
google.golang.org/protobuf v1.28.1 // indirect
|
||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
)
|
||||
788
go.sum
Normal file
788
go.sum
Normal file
|
|
@ -0,0 +1,788 @@
|
|||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
|
||||
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
|
||||
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
|
||||
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
|
||||
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
|
||||
cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
|
||||
cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
|
||||
cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
|
||||
cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
|
||||
cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
|
||||
cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
|
||||
cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
|
||||
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
|
||||
cloud.google.com/go v0.67.0/go.mod h1:YNan/mUhNZFrYUor0vqrsQ0Ffl7Xtm/ACOy/vsTS858=
|
||||
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
|
||||
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
|
||||
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
|
||||
cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
|
||||
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
|
||||
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
|
||||
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
|
||||
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
|
||||
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
|
||||
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
|
||||
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
|
||||
cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
|
||||
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
|
||||
cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
|
||||
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
|
||||
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
|
||||
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
|
||||
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
|
||||
github.com/BurntSushi/toml v1.2.0 h1:Rt8g24XnyGTyglgET/PRUNlrUeu9F5L+7FilkXfZgs0=
|
||||
github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
|
||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
||||
github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc=
|
||||
github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
|
||||
github.com/acaloiaro/buffalo v1.1.1 h1:/Oj6NhhlogpnGfsOMhGjpDNthPosXN42PZ/W3/yCF2M=
|
||||
github.com/acaloiaro/buffalo v1.1.1/go.mod h1:n3GIXIy7fZWTgn09AZUHZc8pc/1UGArODsdN4xIRjkY=
|
||||
github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk=
|
||||
github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4=
|
||||
github.com/btubbs/pgq v0.0.0-20190101193147-0a3335913e86 h1:VWFMCbz4J10pLBcNN/GCjiGvmcPrBsNaa8XCvjhnG0s=
|
||||
github.com/btubbs/pgq v0.0.0-20190101193147-0a3335913e86/go.mod h1:/zonZGp1GzMn8IFsphjvGCyHNYWXxV7akoX6IJV3qEo=
|
||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
|
||||
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
|
||||
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
||||
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/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||
github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
||||
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
|
||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||
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/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc=
|
||||
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210816181553-5444fa50b93d/go.mod h1:tmAIfUFEirG/Y8jhZ9M+h36obRZAk/1fcSpXwAVlfqE=
|
||||
github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
|
||||
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
||||
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||
github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51 h1:0JZ+dUmQeA8IIVUMzysrX4/AKuQwWhV2dYQuPZdvdSQ=
|
||||
github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64=
|
||||
github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A=
|
||||
github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg=
|
||||
github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870 h1:E2s37DuLxFhQDg5gKsWoLBOB0n+ZW8s599zru8FJ2/Y=
|
||||
github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0=
|
||||
github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
|
||||
github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
|
||||
github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
|
||||
github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
|
||||
github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ=
|
||||
github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
|
||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||
github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=
|
||||
github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
|
||||
github.com/gin-gonic/gin v1.8.2 h1:UzKToD9/PoFj/V4rvlKqTRKnQYyz8Sc1MJlv4JHPtvY=
|
||||
github.com/gin-gonic/gin v1.8.2/go.mod h1:qw5AYuDrzRTnhvusDsrov+fDIxp9Dleuu12h8nfB398=
|
||||
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||
github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
|
||||
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
|
||||
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
||||
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/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||
github.com/gobuffalo/attrs v1.0.2/go.mod h1:tJ7wJj6XbMNhYwJ8fl2PFDpDcUfsG1spWdUJISvPAZQ=
|
||||
github.com/gobuffalo/buffalo-pop/v3 v3.0.6 h1:XK+dxa4qANzEFxITbVpPSj1MyXpiUdbKyRvRijfDRMA=
|
||||
github.com/gobuffalo/buffalo-pop/v3 v3.0.6/go.mod h1:WX1asexyEdPbCq5uVMO+fb2omfbVPopTp3JKaCg5VnA=
|
||||
github.com/gobuffalo/envy v1.10.1/go.mod h1:AWx4++KnNOW3JOeEvhSaq+mvgAvnMYOY1XSIin4Mago=
|
||||
github.com/gobuffalo/envy v1.10.2 h1:EIi03p9c3yeuRCFPOKcSfajzkLb3hrRjEpHGI8I2Wo4=
|
||||
github.com/gobuffalo/envy v1.10.2/go.mod h1:qGAGwdvDsaEtPhfBzb3o0SfDea8ByGn9j8bKmVft9z8=
|
||||
github.com/gobuffalo/events v1.4.2/go.mod h1:GI0w4OrQDQP/tIIC9FPl04qWs4dTx52DLCCcwVg7Ltc=
|
||||
github.com/gobuffalo/events v1.4.3 h1:JYDq7NbozP10zaN9Ijfem6Ozox2KacU2fU38RyquXM8=
|
||||
github.com/gobuffalo/events v1.4.3/go.mod h1:2BwfpV5X63t8xkUcVqIv4IbyAobJazRSVu1F1pgf3rc=
|
||||
github.com/gobuffalo/fizz v1.14.2 h1:t02ZX47tLq5P9NzxbsNkpvXqqBXsYDk02O2xhw5C2Po=
|
||||
github.com/gobuffalo/fizz v1.14.2/go.mod h1:pZp2NZYEiPRoylV3lKIz0XZOOupizz+SnKq9wb1idxE=
|
||||
github.com/gobuffalo/flect v0.2.5/go.mod h1:1ZyCLIbg0YD7sDkzvFdPoOydPtD8y9JQnrOROolUcM8=
|
||||
github.com/gobuffalo/flect v0.3.0 h1:erfPWM+K1rFNIQeRPdeEXxo8yFr/PO17lhRnS8FUrtk=
|
||||
github.com/gobuffalo/flect v0.3.0/go.mod h1:5pf3aGnsvqvCj50AVni7mJJF8ICxGZ8HomberC3pXLE=
|
||||
github.com/gobuffalo/genny/v2 v2.0.12/go.mod h1:KtMtTcR/U2kHbQxhjCVA16ph6rjBnhw39f6aaxl4hMk=
|
||||
github.com/gobuffalo/github_flavored_markdown v1.1.1/go.mod h1:yU32Pen+eorS58oxh/bNZx76zUOCJwmvyV5FBrvzOKQ=
|
||||
github.com/gobuffalo/github_flavored_markdown v1.1.3 h1:rSMPtx9ePkFB22vJ+dH+m/EUBS8doQ3S8LeEXcdwZHk=
|
||||
github.com/gobuffalo/github_flavored_markdown v1.1.3/go.mod h1:IzgO5xS6hqkDmUh91BW/+Qxo/qYnvfzoz3A7uLkg77I=
|
||||
github.com/gobuffalo/grift v1.5.2 h1:mC0vHRs+nXz+JhkH3sv+rVnnTQRDXrUrOXOPYpgPjpo=
|
||||
github.com/gobuffalo/grift v1.5.2/go.mod h1:Uf/3T2AR1Vv+t84EPmxCjqQ8oyJwXs0FAoLMFUn/JVs=
|
||||
github.com/gobuffalo/helpers v0.6.5/go.mod h1:LA4zcc89tkZsfKpJIWsXLibiqTgZQ4EvDszfxdqr9ZA=
|
||||
github.com/gobuffalo/helpers v0.6.7 h1:C9CedoRSfgWg2ZoIkVXgjI5kgmSpL34Z3qdnzpfNVd8=
|
||||
github.com/gobuffalo/helpers v0.6.7/go.mod h1:j0u1iC1VqlCaJEEVkZN8Ia3TEzfj/zoXANqyJExTMTA=
|
||||
github.com/gobuffalo/here v0.6.7/go.mod h1:vuCfanjqckTuRlqAitJz6QC4ABNnS27wLb816UhsPcc=
|
||||
github.com/gobuffalo/httptest v1.5.1/go.mod h1:uEeEFF2BRyTMNAATqFQAKYvpHrWWPNoJbIB3YPuANNM=
|
||||
github.com/gobuffalo/httptest v1.5.2 h1:GpGy520SfY1QEmyPvaqmznTpG4gEQqQ82HtHqyNEreM=
|
||||
github.com/gobuffalo/httptest v1.5.2/go.mod h1:FA23yjsWLGj92mVV74Qtc8eqluc11VqcWr8/C1vxt4g=
|
||||
github.com/gobuffalo/logger v1.0.6/go.mod h1:J31TBEHR1QLV2683OXTAItYIg8pv2JMHnF/quuAbMjs=
|
||||
github.com/gobuffalo/logger v1.0.7 h1:LTLwWelETXDYyqF/ASf0nxaIcdEOIJNxRokPcfI/xbU=
|
||||
github.com/gobuffalo/logger v1.0.7/go.mod h1:u40u6Bq3VVvaMcy5sRBclD8SXhBYPS0Qk95ubt+1xJM=
|
||||
github.com/gobuffalo/meta v0.3.3 h1:GwPWdbdnp4JrKASvMLa03OtmzISq7z/nE7T6aMqzoYM=
|
||||
github.com/gobuffalo/meta v0.3.3/go.mod h1:o4B099IUFUfK4555Guqxz1zHAqyuUQ/KtHXi8WvVeFE=
|
||||
github.com/gobuffalo/mw-csrf v1.0.1 h1:L4b3ZN5KpnyfqdfI0gu+HHPED5GMyCl1oHWTqE1hIvo=
|
||||
github.com/gobuffalo/mw-csrf v1.0.1/go.mod h1:JAbogWdDR+194rn3Rt8/qf/9RTmFvml9FXEGGAAJ9WU=
|
||||
github.com/gobuffalo/mw-i18n/v2 v2.0.2 h1:GKWuzVTP3MW7km9gwOoMwN4KP1ISxN0T2SoVkqDCZTY=
|
||||
github.com/gobuffalo/mw-i18n/v2 v2.0.2/go.mod h1:SJ1310VJ/5mS2ll4OOPi/UkSJVYzaQuJjvaVaOOtTkc=
|
||||
github.com/gobuffalo/mw-paramlogger v1.0.1 h1:UI94qQEjCRRrVCW9eFybB+S91nbEl6PmOXlccW971+8=
|
||||
github.com/gobuffalo/mw-paramlogger v1.0.1/go.mod h1:h8uLYbTgFF/JV2A3igu7ZkHTHBgD13KU8VhB8ugZ55w=
|
||||
github.com/gobuffalo/nulls v0.4.1/go.mod h1:pp8e1hWTRJZFpMl4fj/CVbSMlaxjeGKkFq4RuBZi3w8=
|
||||
github.com/gobuffalo/nulls v0.4.2 h1:GAqBR29R3oPY+WCC7JL9KKk9erchaNuV6unsOSZGQkw=
|
||||
github.com/gobuffalo/nulls v0.4.2/go.mod h1:EElw2zmBYafU2R9W4Ii1ByIj177wA/pc0JdjtD0EsH8=
|
||||
github.com/gobuffalo/packd v1.0.1/go.mod h1:PP2POP3p3RXGz7Jh6eYEf93S7vA2za6xM7QT85L4+VY=
|
||||
github.com/gobuffalo/plush/v4 v4.1.13/go.mod h1:s3hUyj/JlwEiJ039OBJevojq9xT40D1pgekw0o88CVU=
|
||||
github.com/gobuffalo/plush/v4 v4.1.16 h1:Y6jVVTLdg1BxRXDIbTJz+J8QRzEAtv5ZwYpGdIFR7VU=
|
||||
github.com/gobuffalo/plush/v4 v4.1.16/go.mod h1:6t7swVsarJ8qSLw1qyAH/KbrcSTwdun2ASEQkOznakg=
|
||||
github.com/gobuffalo/pop/v6 v6.0.6 h1:M/CJ9RLibCTN0OtsgASmVtKqyEXJAreF8oamZrHscc4=
|
||||
github.com/gobuffalo/pop/v6 v6.0.6/go.mod h1:toTxNJnsSuSlyK6w0yGb4YXSNIHsi2chQYC2CjBF9Ac=
|
||||
github.com/gobuffalo/refresh v1.13.2 h1:fvzt/czF6Wtk7fw+e5gz6X4h4y5ktAsuBU3v40Bw2iY=
|
||||
github.com/gobuffalo/refresh v1.13.2/go.mod h1:8EmMdKTaFA5vgum98Go24+Vk3zx1DRUuFuATQldx6eI=
|
||||
github.com/gobuffalo/suite/v4 v4.0.3 h1:k75IpZsHUJkK9Ga5wSYdgih38vJV5MDSUUXWol51mro=
|
||||
github.com/gobuffalo/suite/v4 v4.0.3/go.mod h1:PrkbKRdOojfk4q7Km603pFSYRlhBf4BHkC46YIMyTHs=
|
||||
github.com/gobuffalo/tags/v3 v3.1.3/go.mod h1:WAAjKdskZUmdi6EkNjP2SXBwBwRovHsjJsPJbBiPlKc=
|
||||
github.com/gobuffalo/tags/v3 v3.1.4 h1:X/ydLLPhgXV4h04Hp2xlbI2oc5MDaa7eub6zw8oHjsM=
|
||||
github.com/gobuffalo/tags/v3 v3.1.4/go.mod h1:ArRNo3ErlHO8BtdA0REaZxijuWnWzF6PUXngmMXd2I0=
|
||||
github.com/gobuffalo/validate v2.0.4+incompatible h1:ZTxozrIw8qQ5nfhShmc4izjYPTsPhfdXTdhXOd5OS9o=
|
||||
github.com/gobuffalo/validate v2.0.4+incompatible/go.mod h1:N+EtDe0J8252BgfzQUChBgfd6L93m9weay53EWFVsMM=
|
||||
github.com/gobuffalo/validate/v3 v3.3.2/go.mod h1:jiEEw+N7KbAP2aInFxGnfitI0g7HjXqcp5hDD6TaQDU=
|
||||
github.com/gobuffalo/validate/v3 v3.3.3 h1:o7wkIGSvZBYBd6ChQoLxkz2y1pfmhbI4jNJYh6PuNJ4=
|
||||
github.com/gobuffalo/validate/v3 v3.3.3/go.mod h1:YC7FsbJ/9hW/VjQdmXPvFqvRis4vrRYFxr69WiNZw6g=
|
||||
github.com/gobuffalo/x v0.1.0 h1:ILV6PIfyQto7RKfxRutQUuW234x+A5/+FRQpik0hNrM=
|
||||
github.com/gobuffalo/x v0.1.0/go.mod h1:WevpGD+5YOreDJznWevcn8NTmQEW5STSBgIkpkjzqXc=
|
||||
github.com/goccy/go-json v0.9.6/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
|
||||
github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk=
|
||||
github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
|
||||
github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
|
||||
github.com/gofrs/uuid v4.1.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
|
||||
github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
|
||||
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-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
|
||||
github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
||||
github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
||||
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
||||
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
|
||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
||||
github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
||||
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
|
||||
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
||||
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
||||
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
||||
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
||||
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
|
||||
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||
github.com/golang/protobuf v1.5.0 h1:LUVKkCeviFUMKqHa4tXIIij/lbhnMbP7Fn5wKdKkRh4=
|
||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
|
||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
||||
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
|
||||
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||
github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||
github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||
github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||
github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||
github.com/google/pprof v0.0.0-20200905233945-acf8798be1f7/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
||||
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
||||
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
|
||||
github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY=
|
||||
github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c=
|
||||
github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4=
|
||||
github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q=
|
||||
github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
|
||||
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
|
||||
github.com/gorilla/pat v0.0.0-20180118222023-199c85a7f6d1/go.mod h1:YeAe0gNeiNT5hoiZRI4yiOky6jVdNvfO2N6Kav/HmxY=
|
||||
github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ=
|
||||
github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4=
|
||||
github.com/gorilla/sessions v1.1.1/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w=
|
||||
github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7FsgI=
|
||||
github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM=
|
||||
github.com/guregu/null v4.0.0+incompatible h1:4zw0ckM7ECd6FNNddc3Fu4aty9nTlpkkzH7dPn4/4Gw=
|
||||
github.com/guregu/null v4.0.0+incompatible/go.mod h1:ePGpQaN9cw0tj45IR5E5ehMvsFlLlQZAkkOXZurJ3NM=
|
||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
||||
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
|
||||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
||||
github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo=
|
||||
github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
|
||||
github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8=
|
||||
github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
|
||||
github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA=
|
||||
github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE=
|
||||
github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s=
|
||||
github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o=
|
||||
github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY=
|
||||
github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI=
|
||||
github.com/jackc/pgconn v1.12.1 h1:rsDFzIpRk7xT4B8FufgpCCeyjdNpKyghZeSefViE5W8=
|
||||
github.com/jackc/pgconn v1.12.1/go.mod h1:ZkhRC59Llhrq3oSfrikvwQ5NaxYExr6twkdkMLaKono=
|
||||
github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE=
|
||||
github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8=
|
||||
github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE=
|
||||
github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c=
|
||||
github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc=
|
||||
github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak=
|
||||
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
|
||||
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
|
||||
github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78=
|
||||
github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA=
|
||||
github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg=
|
||||
github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM=
|
||||
github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM=
|
||||
github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
|
||||
github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
|
||||
github.com/jackc/pgproto3/v2 v2.3.0 h1:brH0pCGBDkBW07HWlN/oSBXrmo3WB0UvZd1pIuDcL8Y=
|
||||
github.com/jackc/pgproto3/v2 v2.3.0/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
|
||||
github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg=
|
||||
github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E=
|
||||
github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg=
|
||||
github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc=
|
||||
github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw=
|
||||
github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM=
|
||||
github.com/jackc/pgtype v1.11.0 h1:u4uiGPz/1hryuXzyaBhSk6dnIyyG2683olG2OV+UUgs=
|
||||
github.com/jackc/pgtype v1.11.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4=
|
||||
github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y=
|
||||
github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM=
|
||||
github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc=
|
||||
github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs=
|
||||
github.com/jackc/pgx/v4 v4.16.1 h1:JzTglcal01DrghUqt+PmzWsZx/Yh7SC/CTQmSBMTd0Y=
|
||||
github.com/jackc/pgx/v4 v4.16.1/go.mod h1:SIhx0D5hoADaiXZVyv+3gSm3LCIIINTVO0PficsvWGQ=
|
||||
github.com/jackc/pgx/v5 v5.2.0 h1:NdPpngX0Y6z6XDFKqmFQaE+bCtkqzvQIOt1wvBlAqs8=
|
||||
github.com/jackc/pgx/v5 v5.2.0/go.mod h1:Ptn7zmohNsWEsdxRawMzk3gaKma2obW+NWTnKa0S4nk=
|
||||
github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
|
||||
github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
|
||||
github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
|
||||
github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
|
||||
github.com/jackc/puddle/v2 v2.1.2 h1:0f7vaaXINONKTsxYDn4otOAiJanX/BMeAtY//BXqzlg=
|
||||
github.com/jackc/puddle/v2 v2.1.2/go.mod h1:2lpufsF5mRHO6SuZkm0fNYxM6SWHfvyFj62KwNzgels=
|
||||
github.com/jarcoal/httpmock v0.0.0-20180424175123-9c70cfe4a1da/go.mod h1:ks+b9deReOc7jgqp+e7LuFiCBH6Rm5hL32cLcEAArb4=
|
||||
github.com/jmoiron/sqlx v1.3.4/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ=
|
||||
github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g=
|
||||
github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ=
|
||||
github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg=
|
||||
github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
|
||||
github.com/joomcode/errorx v1.1.0 h1:dizuSG6yHzlvXOOGHW00gwsmM4Sb9x/yWEfdtPztqcs=
|
||||
github.com/joomcode/errorx v1.1.0/go.mod h1:eQzdtdlNyN7etw6YCS4W4+lu442waxZYw5yvz0ULrRo=
|
||||
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
|
||||
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
|
||||
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
||||
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
|
||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
|
||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
|
||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
|
||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
|
||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||
github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y=
|
||||
github.com/lestrrat-go/blackmagic v1.0.0/go.mod h1:TNgH//0vYSs8VXDCfkZLgIrVTTXQELZffUV0tz3MtdQ=
|
||||
github.com/lestrrat-go/httpcc v1.0.0/go.mod h1:tGS/u00Vh5N6FHNkExqGGNId8e0Big+++0Gf8MBnAvE=
|
||||
github.com/lestrrat-go/iter v1.0.1/go.mod h1:zIdgO1mRKhn8l9vrZJZz9TUMMFbQbLeTsbqPDrJ/OJc=
|
||||
github.com/lestrrat-go/jwx v1.2.21/go.mod h1:9cfxnOH7G1gN75CaJP2hKGcxFEx5sPh1abRIA/ZJVh4=
|
||||
github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I=
|
||||
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||
github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||
github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||
github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||
github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||
github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw=
|
||||
github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||
github.com/luna-duclos/instrumentedsql v1.1.3 h1:t7mvC0z1jUt5A0UQ6I/0H31ryymuQRnJcWCiqV3lSAA=
|
||||
github.com/luna-duclos/instrumentedsql v1.1.3/go.mod h1:9J1njvFds+zN7y85EDhN9XNQLANWwZt2ULeIC8yMNYs=
|
||||
github.com/mailgun/mailgun-go/v4 v4.8.1 h1:1+MdKakJuXnW2JJDbyPdO1ngAANOyHyVPxQvFF8Sq6c=
|
||||
github.com/mailgun/mailgun-go/v4 v4.8.1/go.mod h1:FJlF9rI5cQT+mrwujtJjPMbIVy3Ebor9bKTVsJ0QU40=
|
||||
github.com/markbates/going v1.0.0/go.mod h1:I6mnB4BPnEeqo85ynXIx1ZFLLbtiLHNXVgWeFO9OGOA=
|
||||
github.com/markbates/going v1.0.3 h1:mY45T5TvW+Xz5A6jY7lf4+NLg9D8+iuStIHyR7M8qsE=
|
||||
github.com/markbates/going v1.0.3/go.mod h1:fQiT6v6yQar9UD6bd/D4Z5Afbk9J6BBVBtLiyY4gp2o=
|
||||
github.com/markbates/goth v1.76.0 h1:lXLpETvTJWYKnfbd9tHK/GfLFsc3ihVB8KGjfDTyIEQ=
|
||||
github.com/markbates/goth v1.76.0/go.mod h1:X6xdNgpapSENS0O35iTBBcMHoJDQDfI9bJl+APCkYMc=
|
||||
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
|
||||
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
||||
github.com/mattn/go-colorable v0.1.9 h1:sqDoxXbdeALODt0DAeJCVp38ps9ZogZEAXjus69YV3U=
|
||||
github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
||||
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||
github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
||||
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
|
||||
github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ=
|
||||
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
||||
github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
|
||||
github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
|
||||
github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
|
||||
github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
|
||||
github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U=
|
||||
github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
|
||||
github.com/microcosm-cc/bluemonday v1.0.16/go.mod h1:Z0r70sCuXHig8YpBzCc5eGHAap2K7e/u082ZUpDRRqM=
|
||||
github.com/microcosm-cc/bluemonday v1.0.20 h1:flpzsq4KU3QIYAYGV/szUat7H+GPOXR0B2JU5A1Wp8Y=
|
||||
github.com/microcosm-cc/bluemonday v1.0.20/go.mod h1:yfBmMi8mxvaZut3Yytv+jTXRY8mxyjJ0/kQBTElld50=
|
||||
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
|
||||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=
|
||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
|
||||
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
|
||||
github.com/monoculum/formam v3.5.5+incompatible h1:iPl5csfEN96G2N2mGu8V/ZB62XLf9ySTpC8KRH6qXec=
|
||||
github.com/monoculum/formam v3.5.5+incompatible/go.mod h1:RKgILGEJq24YyJ2ban8EO0RUVSJlF1pGsEvoLEACr/Q=
|
||||
github.com/mrjones/oauth v0.0.0-20180629183705-f4e24b6d100c/go.mod h1:skjdDftzkFALcuGzYSklqYd8gvat6F1gZJ4YPVbkZpM=
|
||||
github.com/nicksnyder/go-i18n v1.10.1 h1:isfg77E/aCD7+0lD/D00ebR2MV5vgeQ276WYyDaCRQc=
|
||||
github.com/nicksnyder/go-i18n v1.10.1/go.mod h1:e4Di5xjP9oTVrC6y3C7C0HoSYXjSbhh/dU0eUV32nB4=
|
||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||
github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
|
||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||
github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU=
|
||||
github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek=
|
||||
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
|
||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||
github.com/pkg/errors v0.9.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/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/psanford/memfs v0.0.0-20210214183328-a001468d78ef h1:NKxTG6GVGbfMXc2mIk+KphcH6hagbVXhcFkbTgYleTI=
|
||||
github.com/psanford/memfs v0.0.0-20210214183328-a001468d78ef/go.mod h1:tcaRap0jS3eifrEEllL6ZMd9dg8IlDpi2S1oARrQ+NI=
|
||||
github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ=
|
||||
github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k=
|
||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
|
||||
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/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
|
||||
github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=
|
||||
github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc=
|
||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
||||
github.com/serenize/snaker v0.0.0-20171204205717-a683aaf2d516/go.mod h1:Yow6lPLSAXx2ifx470yD/nUe22Dv5vBvxK/UK9UUTVs=
|
||||
github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ=
|
||||
github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
|
||||
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
|
||||
github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ=
|
||||
github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
|
||||
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
|
||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
||||
github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
|
||||
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
||||
github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d h1:yKm7XZV6j9Ev6lojP2XaIshpT4ymkqhMeSghO5Ps00E=
|
||||
github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE=
|
||||
github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e h1:qpG93cPwA5f7s/ZPBJnGOYQNK/vKsaDaseuKT5Asee8=
|
||||
github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA=
|
||||
github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU=
|
||||
github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM=
|
||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
|
||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
||||
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
|
||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||
github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M=
|
||||
github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0=
|
||||
github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY=
|
||||
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
|
||||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
||||
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
||||
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
|
||||
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
|
||||
go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ=
|
||||
go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
|
||||
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
||||
go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
|
||||
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
|
||||
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
|
||||
go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
||||
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
||||
go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
|
||||
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
||||
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
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/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||
golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
|
||||
golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
|
||||
golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
||||
golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
||||
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
||||
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
|
||||
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
|
||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
|
||||
golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
|
||||
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
|
||||
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
|
||||
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
|
||||
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
||||
golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/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-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||
golang.org/x/net v0.0.0-20200927032502-5d4f70055728/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
|
||||
golang.org/x/net v0.0.0-20221002022538-bcab6841153b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
|
||||
golang.org/x/net v0.4.0 h1:Q5QPcMlvfxFTAPV0+07Xz/MpK9NTXu2VDUuy0FeMfaU=
|
||||
golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43 h1:ld7aEMNHoBnnDAX15v1T6z31v8HwR2A9FYOuAhWqkwc=
|
||||
golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0 h1:cu5kTvlzcw1Q5S9f5ip1/cpiB4nXvw1XYzFPGgzLUOY=
|
||||
golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/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-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
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-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ=
|
||||
golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/term v0.3.0 h1:qoo4akIqOcDME5bhc/NgxUdovd6BSS2uMsVjB56q1xI=
|
||||
golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA=
|
||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||
golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM=
|
||||
golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||
golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
|
||||
golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
|
||||
golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
|
||||
golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||
golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||
golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||
golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||
golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||
golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||
golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=
|
||||
golang.org/x/tools v0.0.0-20200929161345-d7fc70abf50f/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
|
||||
golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4=
|
||||
golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
|
||||
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
|
||||
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
||||
google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
||||
google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
|
||||
google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
|
||||
google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
|
||||
google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||
google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||
google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||
google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||
google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||
google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
|
||||
google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
|
||||
google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
|
||||
google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
|
||||
google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=
|
||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
|
||||
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
||||
google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc=
|
||||
google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||
google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
|
||||
google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||
google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||
google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||
google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||
google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||
google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||
google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
|
||||
google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
|
||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
||||
google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
|
||||
google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||
google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||
google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||
google.golang.org/genproto v0.0.0-20200929141702-51c3e5b607fe/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
||||
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
||||
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
|
||||
google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||
google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||
google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
|
||||
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
|
||||
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||
google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||
google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
|
||||
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
|
||||
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
|
||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||
google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
|
||||
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||
gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s=
|
||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
||||
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
||||
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
||||
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
|
||||
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
|
||||
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
||||
15
grifts/db.go
Normal file
15
grifts/db.go
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
package grifts
|
||||
|
||||
import (
|
||||
"github.com/gobuffalo/grift/grift"
|
||||
)
|
||||
|
||||
var _ = grift.Namespace("db", func() {
|
||||
|
||||
grift.Desc("seed", "Seeds a database")
|
||||
grift.Add("seed", func(c *grift.Context) error {
|
||||
// Add DB seeding stuff here
|
||||
return nil
|
||||
})
|
||||
|
||||
})
|
||||
11
grifts/init.go
Normal file
11
grifts/init.go
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
package grifts
|
||||
|
||||
import (
|
||||
"newsbox/actions"
|
||||
|
||||
"github.com/gobuffalo/buffalo"
|
||||
)
|
||||
|
||||
func init() {
|
||||
buffalo.Grifts(actions.App())
|
||||
}
|
||||
3
inflections.json
Normal file
3
inflections.json
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"singular": "plural"
|
||||
}
|
||||
51
internal/buffalo.go
Normal file
51
internal/buffalo.go
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
package internal
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
|
||||
"github.com/gobuffalo/buffalo"
|
||||
"github.com/gobuffalo/envy"
|
||||
)
|
||||
|
||||
var BuffaloConfig = buffalo.Options{
|
||||
Env: Env(),
|
||||
SessionName: "_newsbox_session",
|
||||
}
|
||||
|
||||
func Env() string {
|
||||
return envy.Get("GO_ENV", "development")
|
||||
}
|
||||
|
||||
// SiteDomain returns the site domain
|
||||
// Development default: localhost
|
||||
// Production default: None. Site SITE_DOMAN
|
||||
// When in development and `HOSTNAME` is set, that hostname will override "localhost"
|
||||
// When in development and `HOSTNAME` is not set, and SITE_DOMAIN is set, it will override "localhost"
|
||||
func SiteDomain() string {
|
||||
if Env() == "development" {
|
||||
return envy.Get("HOSTNAME", envy.Get("SITE_DOMAIN", "localhost"))
|
||||
} else {
|
||||
domain, err := envy.MustGet("SITE_DOMAIN")
|
||||
if err != nil {
|
||||
log.Fatalf("SITE_DOMAIN must be set in production")
|
||||
}
|
||||
|
||||
return domain
|
||||
}
|
||||
}
|
||||
|
||||
// BaseUrl returns the URL where the application is avaialble
|
||||
func BaseUrl() string {
|
||||
devScheme := "http"
|
||||
|
||||
if SiteProtocol() != "" {
|
||||
devScheme = "https"
|
||||
}
|
||||
|
||||
if Env() == "development" {
|
||||
return fmt.Sprintf("%s://%s", devScheme, SiteDomain())
|
||||
} else {
|
||||
return fmt.Sprintf("https://%s", SiteDomain())
|
||||
}
|
||||
}
|
||||
74
internal/config.go
Normal file
74
internal/config.go
Normal file
|
|
@ -0,0 +1,74 @@
|
|||
package internal
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
|
||||
"github.com/gobuffalo/envy"
|
||||
)
|
||||
|
||||
// SiteName returns the name of the current site
|
||||
func SiteName() string {
|
||||
return envy.Get("SITE_NAME", "Newsbox")
|
||||
}
|
||||
|
||||
// SiteProtocol returns the scheme (http/https) that the site should use when generating URLs
|
||||
func SiteProtocol() string {
|
||||
return envy.Get("SITE_PROTOCOL", "https")
|
||||
}
|
||||
|
||||
// AnalyticsEnabled returns true if analytics are enabled for this site
|
||||
func AnalyticsEnabled() bool {
|
||||
val, err := strconv.ParseBool(envy.Get("ENABLE_ANALYTICS", "false"))
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return val
|
||||
}
|
||||
|
||||
// AnalyticsSelfHostingEnabled returns true if analytics are enabled for this site and the following enviornment
|
||||
// variable is set: ENABLE_ANALYTICS_SELF_HOSTING
|
||||
func AnalyticsSelfHostingEnabled() bool {
|
||||
if !AnalyticsEnabled() {
|
||||
return false
|
||||
}
|
||||
|
||||
val, err := strconv.ParseBool(envy.Get("ENABLE_ANALYTICS_SELF_HOSTING", "false"))
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return val
|
||||
}
|
||||
|
||||
// PaymentsEnabled returns true if payments are enabled.
|
||||
// Payments are enabled by setting the following environment variables: STRIPE_KEY, STRIPE_PRICE_ID
|
||||
func PaymentsEnabled() bool {
|
||||
val, err := envy.MustGet("STRIPE_KEY")
|
||||
if err != nil || val == "" {
|
||||
return false
|
||||
}
|
||||
|
||||
val, err = envy.MustGet("STRIPE_PRICE_ID")
|
||||
if err != nil || val == "" {
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
// GithubLoginEnabled() returns true if Github oauth logins are enabled
|
||||
// Github oauth logins are enabled by setting the following environment variables: GH_OAUTH_CLIENT_ID, GH_OAUTH_CLIENT_SECRET
|
||||
func GithubLoginEnabled() bool {
|
||||
val, err := envy.MustGet("GH_OAUTH_CLIENT_ID")
|
||||
if err != nil || val == "" {
|
||||
return false
|
||||
}
|
||||
|
||||
val, err = envy.MustGet("GH_OAUTH_CLIENT_SECRET")
|
||||
if err != nil || val == "" {
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
31
internal/time.go
Normal file
31
internal/time.go
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
package internal
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
)
|
||||
|
||||
// TimeInZone returns the current time in the time zone represented as an offset from UTC
|
||||
func TimeInZone(utcOffset int) time.Time {
|
||||
loc := ZoneLocation(utcOffset)
|
||||
t := time.Now()
|
||||
|
||||
return t.In(loc)
|
||||
}
|
||||
|
||||
// ZoneName returns the name of the time zone represented as an offset from UTC
|
||||
func ZoneName(utcOffset int) string {
|
||||
direction := ""
|
||||
if utcOffset >= 0 {
|
||||
direction = "+"
|
||||
}
|
||||
|
||||
return fmt.Sprintf("UTC%s%d", direction, utcOffset)
|
||||
}
|
||||
|
||||
// ZoneLocation returns a Location that represents the time zone with the given offset from UTC
|
||||
func ZoneLocation(utcOffset int) *time.Location {
|
||||
// 60 * 60 are the number of minutes and seconds _east_ of UTC
|
||||
// This number can be positive or negative
|
||||
return time.FixedZone(ZoneName(utcOffset), utcOffset*60*60)
|
||||
}
|
||||
76
job.nomad.hcl
Normal file
76
job.nomad.hcl
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
variable "version" {
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "aws_access_key_id" {
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "aws_secret_access_key" {
|
||||
type = string
|
||||
}
|
||||
|
||||
job "newsbox" {
|
||||
datacenters = ["dc1"]
|
||||
namespace = "default"
|
||||
|
||||
group "task" {
|
||||
network {
|
||||
port "newsbox" {
|
||||
to = 3000
|
||||
host_network = "private"
|
||||
}
|
||||
}
|
||||
|
||||
task "newsbox" {
|
||||
driver = "docker"
|
||||
|
||||
artifact {
|
||||
source = "s3://us-east-1.linodeobjects.com/newsbox-application/newsbox-${var.version}.tar"
|
||||
options {
|
||||
aws_access_key_id = var.aws_access_key_id
|
||||
aws_access_key_secret = var.aws_secret_acccess_key
|
||||
# Leave the archive in tar format
|
||||
archive = false
|
||||
}
|
||||
}
|
||||
|
||||
config {
|
||||
load = "newsbox-${var.version}.tar"
|
||||
image = "newsbox:${var.version}"
|
||||
ports = ["newsbox"]
|
||||
}
|
||||
|
||||
template {
|
||||
data = <<EOF
|
||||
GO_ENV = "production"
|
||||
{{ range nomadService "postgres" }}POSTGRES_HOST = {{ .Address }}
|
||||
POSTGRES_PORT = {{ .Port }}{{ end }}
|
||||
{{ with nomadVar "nomad/jobs/newsbox" }}POSTGRES_USER={{ .POSTGRES_USER }}
|
||||
POSTGRES_PASSWORD={{ .POSTGRES_PASSWORD }}
|
||||
GH_OAUTH_CLIENT_ID={{ .GH_OAUTH_CLIENT_ID }}
|
||||
GH_OAUTH_CLIENT_SECRET={{ .GH_OAUTH_CLIENT_SECRET }}
|
||||
SMTP_PASSWORD={{ .SMTP_PASSWORD }}
|
||||
SESSION_SECRET={{ .SESSION_SECRET }}{{ end }}
|
||||
HOSTNAME=newsbox.email
|
||||
EOF
|
||||
destination = "local/env"
|
||||
env = true
|
||||
}
|
||||
|
||||
env {
|
||||
}
|
||||
|
||||
resources {
|
||||
cpu = 1024
|
||||
memory = 1024
|
||||
}
|
||||
|
||||
service {
|
||||
port = "newsbox"
|
||||
name = "newsbox"
|
||||
provider = "nomad"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
3
locales/all.en-us.yaml
Normal file
3
locales/all.en-us.yaml
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
# For more information on using i18n see: https://github.com/nicksnyder/go-i18n
|
||||
- id: welcome_greeting
|
||||
translation: "Welcome to Buffalo (EN)"
|
||||
15
locales/embed.go
Normal file
15
locales/embed.go
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
package locales
|
||||
|
||||
import (
|
||||
"embed"
|
||||
"io/fs"
|
||||
|
||||
"github.com/gobuffalo/buffalo"
|
||||
)
|
||||
|
||||
//go:embed *.yaml
|
||||
var files embed.FS
|
||||
|
||||
func FS() fs.FS {
|
||||
return buffalo.NewFS(files, "locales")
|
||||
}
|
||||
6
locales/messages.en-us.yaml
Normal file
6
locales/messages.en-us.yaml
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
- id: "message.created.success"
|
||||
translation: "Message was successfully created."
|
||||
- id: "message.updated.success"
|
||||
translation: "Message was successfully updated."
|
||||
- id: "message.destroyed.success"
|
||||
translation: "Message was successfully destroyed."
|
||||
6
locales/profiles.en-us.yaml
Normal file
6
locales/profiles.en-us.yaml
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
- id: "user.created.success"
|
||||
translation: "Your account has been created"
|
||||
- id: "profile.updated.success"
|
||||
translation: "Your profile has been updated"
|
||||
- id: "profile.email.updated.success"
|
||||
translation: "A confirmation email has been sent to your new email address"
|
||||
37
mailers/mailers.go
Normal file
37
mailers/mailers.go
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
package mailers
|
||||
|
||||
import (
|
||||
"log"
|
||||
|
||||
"newsbox/templates"
|
||||
|
||||
"github.com/gobuffalo/buffalo/mail"
|
||||
"github.com/gobuffalo/buffalo/render"
|
||||
"github.com/gobuffalo/envy"
|
||||
)
|
||||
|
||||
var (
|
||||
smtp mail.Sender
|
||||
r *render.Engine
|
||||
)
|
||||
|
||||
func init() {
|
||||
// Pulling config from the env.
|
||||
port := envy.Get("SMTP_PORT", "587")
|
||||
host := envy.Get("SMTP_HOST", "smtp.fastmail.com")
|
||||
user := envy.Get("SMTP_USER", "adriano@zenitylabs.com")
|
||||
password := envy.Get("SMTP_PASSWORD", "")
|
||||
|
||||
var err error
|
||||
smtp, err = mail.NewSMTPSender(host, port, user, password)
|
||||
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
r = render.New(render.Options{
|
||||
HTMLLayout: "mail/layout.plush.html",
|
||||
TemplatesFS: templates.FS(),
|
||||
Helpers: render.Helpers{},
|
||||
})
|
||||
}
|
||||
34
mailers/message_forwarder.go
Normal file
34
mailers/message_forwarder.go
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
package mailers
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"newsbox/internal"
|
||||
"newsbox/models"
|
||||
|
||||
"github.com/gobuffalo/buffalo/mail"
|
||||
"github.com/gobuffalo/buffalo/render"
|
||||
)
|
||||
|
||||
// ForwardMessage forwards messages that are queued to be delivered to users
|
||||
func ForwardMessage(recipient string, msg *models.Message) error {
|
||||
m := mail.NewMessage()
|
||||
|
||||
m.Subject = msg.Subject
|
||||
m.From = fmt.Sprintf("noreply@%s", internal.SiteDomain())
|
||||
m.To = []string{recipient}
|
||||
data := render.Data{"html_content": msg.BodyHTML, "text_content": msg.Body}
|
||||
err := m.AddBody(r.Func("text/html", func(w io.Writer, data render.Data) (err error) {
|
||||
_, err = w.Write([]byte(msg.BodyHTML))
|
||||
return
|
||||
}), data)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = m.AddBody(r.Plain("mail/forwarded_mail.plush.tpl"), data)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return smtp.Send(m)
|
||||
}
|
||||
29
mailers/password_changed.go
Normal file
29
mailers/password_changed.go
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
package mailers
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"newsbox/internal"
|
||||
|
||||
"github.com/gobuffalo/buffalo/mail"
|
||||
"github.com/gobuffalo/buffalo/render"
|
||||
)
|
||||
|
||||
// SendEmailAddressChangedEmail sends an email to recipient containing a special URL that only that can know, for the purpose of
|
||||
// email address verification
|
||||
func SendEmailAddressChangedEmail(recipient, verificationURL string) error {
|
||||
m := mail.NewMessage()
|
||||
|
||||
// fill in with your stuff:
|
||||
m.Subject = fmt.Sprintf("%s password changed: Verify your email address", internal.SiteName())
|
||||
m.From = fmt.Sprintf("noreply@%s", internal.SiteDomain())
|
||||
m.To = []string{recipient}
|
||||
err := m.AddBody(r.HTML("mail/email_changed.plush.html"), render.Data{"verification_url": verificationURL, "site_name": internal.SiteName()})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = m.AddBody(r.Plain("mail/email_changed.plush.tpl"), render.Data{"verification_url": verificationURL, "site_name": internal.SiteName()})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return smtp.Send(m)
|
||||
}
|
||||
25
mailers/welcome_email.go
Normal file
25
mailers/welcome_email.go
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
package mailers
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"newsbox/internal"
|
||||
|
||||
"github.com/gobuffalo/buffalo/mail"
|
||||
"github.com/gobuffalo/buffalo/render"
|
||||
)
|
||||
|
||||
// SendWelcomeEmail sends an email to recipient containing a special URL that only that can know, for the purpose of
|
||||
// email address verification
|
||||
func SendWelcomeEmail(recipient, verificationUrl string) error {
|
||||
m := mail.NewMessage()
|
||||
|
||||
// fill in with your stuff:
|
||||
m.Subject = fmt.Sprintf("Welcome to %s!", internal.SiteName())
|
||||
m.From = fmt.Sprintf("noreply@%s", internal.SiteDomain())
|
||||
m.To = []string{recipient}
|
||||
err := m.AddBody(r.HTML("mail/welcome_email.plush.html"), render.Data{"verification_url": verificationUrl})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return smtp.Send(m)
|
||||
}
|
||||
1
migrations/20221014155009_create_users.down.fizz
Normal file
1
migrations/20221014155009_create_users.down.fizz
Normal file
|
|
@ -0,0 +1 @@
|
|||
drop_table("users")
|
||||
13
migrations/20221014155009_create_users.up.fizz
Normal file
13
migrations/20221014155009_create_users.up.fizz
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
create_table("users") {
|
||||
t.Column("id", "uuid", {primary: true})
|
||||
t.Column("name", "string", {})
|
||||
t.Column("username", "string", {})
|
||||
t.Column("email", "string", {null: true})
|
||||
t.Column("password_hash", "string", {null: true})
|
||||
t.Column("provider", "string", {})
|
||||
t.Column("provider_id", "string", {})
|
||||
t.Timestamps()
|
||||
}
|
||||
|
||||
add_index("users", "username", {"unique": true})
|
||||
add_index("users", "email", {"unique": true})
|
||||
1
migrations/20230110004501_create_messages.down.fizz
Normal file
1
migrations/20230110004501_create_messages.down.fizz
Normal file
|
|
@ -0,0 +1 @@
|
|||
drop_table("messages")
|
||||
12
migrations/20230110004501_create_messages.up.fizz
Normal file
12
migrations/20230110004501_create_messages.up.fizz
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
create_table("messages") {
|
||||
t.Column("id", "uuid", {primary: true})
|
||||
t.Column("owner_id", "uuid", {})
|
||||
t.Column("from", "text", {})
|
||||
t.Column("from_email", "text", {})
|
||||
t.Column("to", "text", {})
|
||||
t.Column("subject", "text", {})
|
||||
t.Column("body", "text", {})
|
||||
t.Column("body_html", "text", {})
|
||||
t.Column("timestamp", "integer", {})
|
||||
t.Timestamps()
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
drop_table("user_email_verifications")
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
create_table("user_email_verifications") {
|
||||
t.Column("id", "uuid", {primary: true})
|
||||
t.Column("owner_id", "uuid", {})
|
||||
t.Timestamps()
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
drop_table("message_deliveries")
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
create_table("message_deliveries") {
|
||||
t.Column("id", "uuid", {primary: true})
|
||||
t.Column("message_id", "uuid", {"null": false})
|
||||
t.Timestamps()
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
drop_table("user_preferences")
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
create_table("user_preferences") {
|
||||
t.Column("id", "uuid", {primary: true})
|
||||
t.Column("owner_id", "uuid", {})
|
||||
t.Column("email_hour_of_day", "integer", {})
|
||||
t.Column("time_zone_utc_offset", "integer", {})
|
||||
t.Timestamps()
|
||||
}
|
||||
327
migrations/schema.sql
Normal file
327
migrations/schema.sql
Normal file
|
|
@ -0,0 +1,327 @@
|
|||
--
|
||||
-- PostgreSQL database dump
|
||||
--
|
||||
|
||||
-- Dumped from database version 15.0 (Debian 15.0-1.pgdg110+1)
|
||||
-- Dumped by pg_dump version 15.0 (Ubuntu 15.0-1.pgdg20.04+1)
|
||||
|
||||
SET statement_timeout = 0;
|
||||
SET lock_timeout = 0;
|
||||
SET idle_in_transaction_session_timeout = 0;
|
||||
SET client_encoding = 'UTF8';
|
||||
SET standard_conforming_strings = on;
|
||||
SELECT pg_catalog.set_config('search_path', '', false);
|
||||
SET check_function_bodies = false;
|
||||
SET xmloption = content;
|
||||
SET client_min_messages = warning;
|
||||
SET row_security = off;
|
||||
|
||||
--
|
||||
-- Name: job_status; Type: TYPE; Schema: public; Owner: newsbox
|
||||
--
|
||||
|
||||
CREATE TYPE public.job_status AS ENUM (
|
||||
'new',
|
||||
'running',
|
||||
'processed',
|
||||
'failed'
|
||||
);
|
||||
|
||||
|
||||
ALTER TYPE public.job_status OWNER TO newsbox;
|
||||
|
||||
SET default_tablespace = '';
|
||||
|
||||
SET default_table_access_method = heap;
|
||||
|
||||
--
|
||||
-- Name: jobs; Type: TABLE; Schema: public; Owner: newsbox
|
||||
--
|
||||
|
||||
CREATE TABLE public.jobs (
|
||||
id integer NOT NULL,
|
||||
type text NOT NULL,
|
||||
queue text NOT NULL,
|
||||
payload jsonb NOT NULL,
|
||||
status public.job_status NOT NULL,
|
||||
retries integer DEFAULT 0 NOT NULL,
|
||||
created_at timestamp without time zone DEFAULT now(),
|
||||
updated_at timestamp without time zone
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.jobs OWNER TO newsbox;
|
||||
|
||||
--
|
||||
-- Name: jobs_id_seq; Type: SEQUENCE; Schema: public; Owner: newsbox
|
||||
--
|
||||
|
||||
CREATE SEQUENCE public.jobs_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
|
||||
|
||||
ALTER TABLE public.jobs_id_seq OWNER TO newsbox;
|
||||
|
||||
--
|
||||
-- Name: jobs_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: newsbox
|
||||
--
|
||||
|
||||
ALTER SEQUENCE public.jobs_id_seq OWNED BY public.jobs.id;
|
||||
|
||||
|
||||
--
|
||||
-- Name: message_deliveries; Type: TABLE; Schema: public; Owner: newsbox
|
||||
--
|
||||
|
||||
CREATE TABLE public.message_deliveries (
|
||||
id uuid NOT NULL,
|
||||
message_id uuid,
|
||||
created_at timestamp without time zone NOT NULL,
|
||||
updated_at timestamp without time zone NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.message_deliveries OWNER TO newsbox;
|
||||
|
||||
--
|
||||
-- Name: messages; Type: TABLE; Schema: public; Owner: newsbox
|
||||
--
|
||||
|
||||
CREATE TABLE public.messages (
|
||||
id uuid NOT NULL,
|
||||
owner_id uuid NOT NULL,
|
||||
"from" text NOT NULL,
|
||||
from_email text NOT NULL,
|
||||
"to" text NOT NULL,
|
||||
subject text NOT NULL,
|
||||
body text NOT NULL,
|
||||
body_html text NOT NULL,
|
||||
"timestamp" integer NOT NULL,
|
||||
created_at timestamp without time zone NOT NULL,
|
||||
updated_at timestamp without time zone NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.messages OWNER TO newsbox;
|
||||
|
||||
--
|
||||
-- Name: pgq_jobs; Type: TABLE; Schema: public; Owner: newsbox
|
||||
--
|
||||
|
||||
CREATE TABLE public.pgq_jobs (
|
||||
id integer NOT NULL,
|
||||
created_at timestamp with time zone DEFAULT now() NOT NULL,
|
||||
queue_name text NOT NULL,
|
||||
data bytea NOT NULL,
|
||||
run_after timestamp with time zone NOT NULL,
|
||||
retry_waits text[] NOT NULL,
|
||||
ran_at timestamp with time zone,
|
||||
error text
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.pgq_jobs OWNER TO newsbox;
|
||||
|
||||
--
|
||||
-- Name: pgq_jobs_id_seq; Type: SEQUENCE; Schema: public; Owner: newsbox
|
||||
--
|
||||
|
||||
CREATE SEQUENCE public.pgq_jobs_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
|
||||
|
||||
ALTER TABLE public.pgq_jobs_id_seq OWNER TO newsbox;
|
||||
|
||||
--
|
||||
-- Name: pgq_jobs_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: newsbox
|
||||
--
|
||||
|
||||
ALTER SEQUENCE public.pgq_jobs_id_seq OWNED BY public.pgq_jobs.id;
|
||||
|
||||
|
||||
--
|
||||
-- Name: schema_migration; Type: TABLE; Schema: public; Owner: newsbox
|
||||
--
|
||||
|
||||
CREATE TABLE public.schema_migration (
|
||||
version character varying(14) NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.schema_migration OWNER TO newsbox;
|
||||
|
||||
--
|
||||
-- Name: user_email_verifications; Type: TABLE; Schema: public; Owner: newsbox
|
||||
--
|
||||
|
||||
CREATE TABLE public.user_email_verifications (
|
||||
id uuid NOT NULL,
|
||||
owner_id uuid NOT NULL,
|
||||
created_at timestamp without time zone NOT NULL,
|
||||
updated_at timestamp without time zone NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.user_email_verifications OWNER TO newsbox;
|
||||
|
||||
--
|
||||
-- Name: user_preferences; Type: TABLE; Schema: public; Owner: newsbox
|
||||
--
|
||||
|
||||
CREATE TABLE public.user_preferences (
|
||||
id uuid NOT NULL,
|
||||
owner_id uuid NOT NULL,
|
||||
email_hour_of_day integer NOT NULL,
|
||||
time_zone_utc_offset integer NOT NULL,
|
||||
created_at timestamp without time zone NOT NULL,
|
||||
updated_at timestamp without time zone NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.user_preferences OWNER TO newsbox;
|
||||
|
||||
--
|
||||
-- Name: users; Type: TABLE; Schema: public; Owner: newsbox
|
||||
--
|
||||
|
||||
CREATE TABLE public.users (
|
||||
id uuid NOT NULL,
|
||||
name character varying(255) NOT NULL,
|
||||
username character varying(255) NOT NULL,
|
||||
email character varying(255),
|
||||
password_hash character varying(255),
|
||||
provider character varying(255) NOT NULL,
|
||||
provider_id character varying(255) NOT NULL,
|
||||
created_at timestamp without time zone NOT NULL,
|
||||
updated_at timestamp without time zone NOT NULL
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE public.users OWNER TO newsbox;
|
||||
|
||||
--
|
||||
-- Name: jobs id; Type: DEFAULT; Schema: public; Owner: newsbox
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY public.jobs ALTER COLUMN id SET DEFAULT nextval('public.jobs_id_seq'::regclass);
|
||||
|
||||
|
||||
--
|
||||
-- Name: pgq_jobs id; Type: DEFAULT; Schema: public; Owner: newsbox
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY public.pgq_jobs ALTER COLUMN id SET DEFAULT nextval('public.pgq_jobs_id_seq'::regclass);
|
||||
|
||||
|
||||
--
|
||||
-- Name: jobs jobs_pkey; Type: CONSTRAINT; Schema: public; Owner: newsbox
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY public.jobs
|
||||
ADD CONSTRAINT jobs_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: message_deliveries message_deliveries_pkey; Type: CONSTRAINT; Schema: public; Owner: newsbox
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY public.message_deliveries
|
||||
ADD CONSTRAINT message_deliveries_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: messages messages_pkey; Type: CONSTRAINT; Schema: public; Owner: newsbox
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY public.messages
|
||||
ADD CONSTRAINT messages_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: pgq_jobs pgq_jobs_pkey; Type: CONSTRAINT; Schema: public; Owner: newsbox
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY public.pgq_jobs
|
||||
ADD CONSTRAINT pgq_jobs_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: user_email_verifications user_email_verifications_pkey; Type: CONSTRAINT; Schema: public; Owner: newsbox
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY public.user_email_verifications
|
||||
ADD CONSTRAINT user_email_verifications_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: user_preferences user_preferences_pkey; Type: CONSTRAINT; Schema: public; Owner: newsbox
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY public.user_preferences
|
||||
ADD CONSTRAINT user_preferences_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: users users_pkey; Type: CONSTRAINT; Schema: public; Owner: newsbox
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY public.users
|
||||
ADD CONSTRAINT users_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: idx_pgq_jobs_fetch; Type: INDEX; Schema: public; Owner: newsbox
|
||||
--
|
||||
|
||||
CREATE INDEX idx_pgq_jobs_fetch ON public.pgq_jobs USING btree (queue_name, run_after) WHERE (ran_at IS NULL);
|
||||
|
||||
|
||||
--
|
||||
-- Name: jobs_created_at_idx; Type: INDEX; Schema: public; Owner: newsbox
|
||||
--
|
||||
|
||||
CREATE INDEX jobs_created_at_idx ON public.jobs USING btree (created_at);
|
||||
|
||||
|
||||
--
|
||||
-- Name: jobs_queue_status_idx; Type: INDEX; Schema: public; Owner: newsbox
|
||||
--
|
||||
|
||||
CREATE INDEX jobs_queue_status_idx ON public.jobs USING btree (queue, status);
|
||||
|
||||
|
||||
--
|
||||
-- Name: schema_migration_version_idx; Type: INDEX; Schema: public; Owner: newsbox
|
||||
--
|
||||
|
||||
CREATE UNIQUE INDEX schema_migration_version_idx ON public.schema_migration USING btree (version);
|
||||
|
||||
|
||||
--
|
||||
-- Name: users_email_idx; Type: INDEX; Schema: public; Owner: newsbox
|
||||
--
|
||||
|
||||
CREATE UNIQUE INDEX users_email_idx ON public.users USING btree (email);
|
||||
|
||||
|
||||
--
|
||||
-- Name: users_username_idx; Type: INDEX; Schema: public; Owner: newsbox
|
||||
--
|
||||
|
||||
CREATE UNIQUE INDEX users_username_idx ON public.users USING btree (username);
|
||||
|
||||
|
||||
--
|
||||
-- PostgreSQL database dump complete
|
||||
--
|
||||
|
||||
131
mill/mill.go
Normal file
131
mill/mill.go
Normal file
|
|
@ -0,0 +1,131 @@
|
|||
package mill
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"encoding/json"
|
||||
"log"
|
||||
"newsbox/internal"
|
||||
"newsbox/mailers"
|
||||
"newsbox/models"
|
||||
"time"
|
||||
|
||||
"github.com/btubbs/pgq"
|
||||
)
|
||||
|
||||
type Handler interface {
|
||||
Perform(payload []byte) (err error)
|
||||
}
|
||||
|
||||
type IncomingEmailHandler struct {
|
||||
Handler
|
||||
Worker *pgq.Worker
|
||||
Db *sql.DB
|
||||
}
|
||||
|
||||
type OutgoingEmailHandler struct {
|
||||
Handler
|
||||
Worker *pgq.Worker
|
||||
Db *sql.DB
|
||||
}
|
||||
|
||||
type WelcomeEmailHandler struct {
|
||||
Handler
|
||||
Worker *pgq.Worker
|
||||
Db *sql.DB
|
||||
}
|
||||
|
||||
type EmailChangedEmailHandler struct {
|
||||
Handler
|
||||
Worker *pgq.Worker
|
||||
Db *sql.DB
|
||||
}
|
||||
|
||||
type WelcomeEmailJob struct {
|
||||
Recipient string
|
||||
VerificationURL string
|
||||
}
|
||||
|
||||
type EmailAddressChangeEmailJob struct {
|
||||
Recipient string
|
||||
VerificationURL string
|
||||
}
|
||||
|
||||
// Process processes incoming models.Message payloads
|
||||
func (h *IncomingEmailHandler) Process(payload []byte) (err error) {
|
||||
var msg models.Message
|
||||
err = json.Unmarshal(payload, &msg)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
var owner models.User
|
||||
err = models.DB.Eager().Find(&owner, msg.OwnerID)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
// Re-address the email to the user's email address
|
||||
msg.To = owner.Email.Interface().(string)
|
||||
|
||||
// Determine time to deliver
|
||||
tzOffset := owner.Preferences.TimeZoneUtcOffset
|
||||
|
||||
t := internal.TimeInZone(tzOffset)
|
||||
et := time.Date(t.Year(), t.Month(), t.Day(), owner.Preferences.EmailHourOfDay, 0, 0, 0, t.Location())
|
||||
diff := et.Sub(t)
|
||||
|
||||
// The message should be delivered later today
|
||||
if diff > 0 {
|
||||
et = t.Add(diff)
|
||||
} else { // The message should be delivered tomorrow
|
||||
et = time.Date(t.Year(), t.Month(), t.Day()+1, owner.Preferences.EmailHourOfDay, 0, 0, 0, t.Location())
|
||||
}
|
||||
|
||||
log.Println("Queueing for:", et)
|
||||
log.Println("Assumed location:", t.Location())
|
||||
job, _ := json.MarshalIndent(&msg, "", "\t")
|
||||
_, err = h.Worker.EnqueueJob("outgoing_email", job, pgq.After(et))
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// Process processes outgoing models.Message payloads
|
||||
func (w *OutgoingEmailHandler) Process(payload []byte) (err error) {
|
||||
var msg models.Message
|
||||
err = json.Unmarshal(payload, &msg)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
var owner models.User
|
||||
err = models.DB.Find(&owner, msg.OwnerID)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
err = mailers.ForwardMessage(owner.Email.Interface().(string), &msg)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// Process processes new welcome email jobs
|
||||
func (h *WelcomeEmailHandler) Process(payload []byte) (err error) {
|
||||
var job WelcomeEmailJob
|
||||
err = json.Unmarshal(payload, &job)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
err = mailers.SendWelcomeEmail(job.Recipient, job.VerificationURL)
|
||||
return
|
||||
}
|
||||
|
||||
// Process processes changes to user account email addresses
|
||||
func (h *EmailChangedEmailHandler) Process(payload []byte) (err error) {
|
||||
var job EmailAddressChangeEmailJob
|
||||
err = json.Unmarshal(payload, &job)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
err = mailers.SendEmailAddressChangedEmail(job.Recipient, job.VerificationURL)
|
||||
return
|
||||
}
|
||||
67
models/message.go
Normal file
67
models/message.go
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
package models
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"time"
|
||||
|
||||
"github.com/gobuffalo/pop/v6"
|
||||
"github.com/gobuffalo/validate/v3"
|
||||
"github.com/gobuffalo/validate/v3/validators"
|
||||
"github.com/gofrs/uuid"
|
||||
)
|
||||
|
||||
// Message is used by pop to map your messages database table to your go code.
|
||||
type Message struct {
|
||||
ID uuid.UUID `json:"id" db:"id"`
|
||||
OwnerID uuid.UUID `json:"owner_id" db:"owner_id"`
|
||||
From string `json:"from" db:"from" form:"sender"`
|
||||
FromEmail string `json:"from_email" db:"from_email" form:"sender"`
|
||||
To string `json:"to" db:"to" form:"recipient"`
|
||||
Subject string `json:"subject" db:"subject" form:"subject"`
|
||||
Body string `json:"body" db:"body" form:"body-plain"`
|
||||
BodyHTML string `json:"body_html" db:"body_html" form:"body-html"`
|
||||
Timestamp int64 `json:"timestamp" db:"timestamp" form:"timestamp"`
|
||||
Token string `json:"-" db:"-" form:"token"`
|
||||
Signature string `json:"-" db:"-" form:"signature"`
|
||||
CreatedAt time.Time `json:"created_at" db:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at" db:"updated_at"`
|
||||
}
|
||||
|
||||
// String is not required by pop and may be deleted
|
||||
func (m Message) String() string {
|
||||
jm, _ := json.Marshal(m)
|
||||
return string(jm)
|
||||
}
|
||||
|
||||
// Messages is not required by pop and may be deleted
|
||||
type Messages []Message
|
||||
|
||||
// String is not required by pop and may be deleted
|
||||
func (m Messages) String() string {
|
||||
jm, _ := json.Marshal(m)
|
||||
return string(jm)
|
||||
}
|
||||
|
||||
// Validate gets run every time you call a "pop.Validate*" (pop.ValidateAndSave, pop.ValidateAndCreate, pop.ValidateAndUpdate) method.
|
||||
// This method is not required and may be deleted.
|
||||
func (m *Message) Validate(tx *pop.Connection) (*validate.Errors, error) {
|
||||
return validate.Validate(
|
||||
&validators.StringIsPresent{Field: m.From, Name: "From"},
|
||||
&validators.StringIsPresent{Field: m.FromEmail, Name: "FromEmail"},
|
||||
&validators.StringIsPresent{Field: m.Subject, Name: "Subject"},
|
||||
&validators.StringIsPresent{Field: m.Body, Name: "Body"},
|
||||
&validators.StringIsPresent{Field: m.BodyHTML, Name: "BodyHTML"},
|
||||
), nil
|
||||
}
|
||||
|
||||
// ValidateCreate gets run every time you call "pop.ValidateAndCreate" method.
|
||||
// This method is not required and may be deleted.
|
||||
func (m *Message) ValidateCreate(tx *pop.Connection) (*validate.Errors, error) {
|
||||
return validate.NewErrors(), nil
|
||||
}
|
||||
|
||||
// ValidateUpdate gets run every time you call "pop.ValidateAndUpdate" method.
|
||||
// This method is not required and may be deleted.
|
||||
func (m *Message) ValidateUpdate(tx *pop.Connection) (*validate.Errors, error) {
|
||||
return validate.NewErrors(), nil
|
||||
}
|
||||
51
models/message_delivery.go
Normal file
51
models/message_delivery.go
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
package models
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"time"
|
||||
|
||||
"github.com/gobuffalo/pop/v6"
|
||||
"github.com/gobuffalo/validate/v3"
|
||||
"github.com/gofrs/uuid"
|
||||
)
|
||||
|
||||
// MessageDelivery is used by pop to map your message_deliveries database table to your go code.
|
||||
type MessageDelivery struct {
|
||||
ID uuid.UUID `json:"id" db:"id"`
|
||||
MessageID uuid.UUID `json:"message_id" db:"message_id"`
|
||||
CreatedAt time.Time `json:"created_at" db:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at" db:"updated_at"`
|
||||
}
|
||||
|
||||
// String is not required by pop and may be deleted
|
||||
func (m MessageDelivery) String() string {
|
||||
jm, _ := json.Marshal(m)
|
||||
return string(jm)
|
||||
}
|
||||
|
||||
// MessageDeliveries is not required by pop and may be deleted
|
||||
type MessageDeliveries []MessageDelivery
|
||||
|
||||
// String is not required by pop and may be deleted
|
||||
func (m MessageDeliveries) String() string {
|
||||
jm, _ := json.Marshal(m)
|
||||
return string(jm)
|
||||
}
|
||||
|
||||
// Validate gets run every time you call a "pop.Validate*" (pop.ValidateAndSave, pop.ValidateAndCreate, pop.ValidateAndUpdate) method.
|
||||
// This method is not required and may be deleted.
|
||||
func (m *MessageDelivery) Validate(tx *pop.Connection) (*validate.Errors, error) {
|
||||
return validate.NewErrors(), nil
|
||||
}
|
||||
|
||||
// ValidateCreate gets run every time you call "pop.ValidateAndCreate" method.
|
||||
// This method is not required and may be deleted.
|
||||
func (m *MessageDelivery) ValidateCreate(tx *pop.Connection) (*validate.Errors, error) {
|
||||
return validate.NewErrors(), nil
|
||||
}
|
||||
|
||||
// ValidateUpdate gets run every time you call "pop.ValidateAndUpdate" method.
|
||||
// This method is not required and may be deleted.
|
||||
func (m *MessageDelivery) ValidateUpdate(tx *pop.Connection) (*validate.Errors, error) {
|
||||
return validate.NewErrors(), nil
|
||||
}
|
||||
5
models/message_delivery_test.go
Normal file
5
models/message_delivery_test.go
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
package models
|
||||
|
||||
func (ms *ModelSuite) Test_MessageDelivery() {
|
||||
ms.Fail("This test needs to be implemented!")
|
||||
}
|
||||
5
models/message_test.go
Normal file
5
models/message_test.go
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
package models
|
||||
|
||||
func (ms *ModelSuite) Test_Message() {
|
||||
ms.Fail("This test needs to be implemented!")
|
||||
}
|
||||
22
models/models.go
Normal file
22
models/models.go
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
package models
|
||||
|
||||
import (
|
||||
"log"
|
||||
|
||||
"github.com/gobuffalo/envy"
|
||||
"github.com/gobuffalo/pop/v6"
|
||||
)
|
||||
|
||||
// DB is a connection to your database to be used
|
||||
// throughout your application.
|
||||
var DB *pop.Connection
|
||||
|
||||
func init() {
|
||||
var err error
|
||||
env := envy.Get("GO_ENV", "development")
|
||||
DB, err = pop.Connect(env)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
pop.Debug = env == "development"
|
||||
}
|
||||
24
models/models_test.go
Normal file
24
models/models_test.go
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
package models
|
||||
|
||||
import (
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/gobuffalo/suite/v4"
|
||||
)
|
||||
|
||||
type ModelSuite struct {
|
||||
*suite.Model
|
||||
}
|
||||
|
||||
func Test_ModelSuite(t *testing.T) {
|
||||
model, err := suite.NewModelWithFixtures(os.DirFS("../fixtures"))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
as := &ModelSuite{
|
||||
Model: model,
|
||||
}
|
||||
suite.Run(t, as)
|
||||
}
|
||||
118
models/user.go
Normal file
118
models/user.go
Normal file
|
|
@ -0,0 +1,118 @@
|
|||
package models
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"log"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/gobuffalo/nulls"
|
||||
"github.com/gobuffalo/pop/v6"
|
||||
"github.com/gobuffalo/validate/v3"
|
||||
"github.com/gobuffalo/validate/v3/validators"
|
||||
"github.com/gofrs/uuid"
|
||||
"github.com/pkg/errors"
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
)
|
||||
|
||||
// User is a generated model from buffalo-auth, it serves as the base for username/password authentication.
|
||||
type User struct {
|
||||
ID uuid.UUID `json:"id" db:"id"`
|
||||
Name string `json:"name" db:"name" form:"name"`
|
||||
Username string `json:"username" db:"username" form:"username"`
|
||||
Email nulls.String `json:"email" db:"email" form:"email"`
|
||||
PasswordHash string `json:"password_hash" db:"password_hash"`
|
||||
Provider string `json:"provider" db:"provider"`
|
||||
ProviderID string `json:"provider_id" db:"provider_id"`
|
||||
Password string `json:"-" db:"-" form:"password"`
|
||||
PasswordConfirmation string `json:"-" db:"-" form:"password_confirmation"`
|
||||
CreatedAt time.Time `json:"created_at" db:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at" db:"updated_at"`
|
||||
EmailVerification UserEmailVerification `has_one:"user_email_verification" fk_id:"owner_id"`
|
||||
Preferences UserPreference `has_one:"user_preference" fk_id:"owner_id" form:"preferences"`
|
||||
}
|
||||
|
||||
// Create wraps up the pattern of encrypting the password and
|
||||
// running validations. Useful when writing tests.
|
||||
func (u *User) Create(tx *pop.Connection) (*validate.Errors, error) {
|
||||
emailStr := u.Email.Interface().(string)
|
||||
u.Email = nulls.NewString(strings.ToLower(emailStr))
|
||||
ph, err := bcrypt.GenerateFromPassword([]byte(u.Password), bcrypt.DefaultCost)
|
||||
if err != nil {
|
||||
return validate.NewErrors(), errors.WithStack(err)
|
||||
}
|
||||
u.PasswordHash = string(ph)
|
||||
return tx.ValidateAndCreate(u)
|
||||
}
|
||||
|
||||
// String is not required by pop and may be deleted
|
||||
func (u User) String() string {
|
||||
ju, _ := json.Marshal(u)
|
||||
return string(ju)
|
||||
}
|
||||
|
||||
// Users is not required by pop and may be deleted
|
||||
type Users []User
|
||||
|
||||
// String is not required by pop and may be deleted
|
||||
func (u Users) String() string {
|
||||
ju, _ := json.Marshal(u)
|
||||
return string(ju)
|
||||
}
|
||||
|
||||
// Validate gets run every time you call a "pop.Validate*" (pop.ValidateAndSave, pop.ValidateAndCreate, pop.ValidateAndUpdate) method.
|
||||
// This method is not required and may be deleted.
|
||||
func (u *User) Validate(tx *pop.Connection) (*validate.Errors, error) {
|
||||
var err error
|
||||
return validate.Validate(
|
||||
&validators.EmailIsPresent{Field: u.Email.Interface().(string), Name: "Email", Message: "Not a valid email address"},
|
||||
&validators.FuncValidator{
|
||||
Field: u.Email.Interface().(string),
|
||||
Name: "Email",
|
||||
Message: "%s is already taken",
|
||||
Fn: func() bool {
|
||||
var b bool
|
||||
q := tx.Where("email = ?", u.Email)
|
||||
if u.ID != uuid.Nil {
|
||||
q = q.Where("id != ?", u.ID)
|
||||
}
|
||||
b, err = q.Exists(u)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
return !b
|
||||
},
|
||||
},
|
||||
), err
|
||||
}
|
||||
|
||||
// ValidateCreate gets run every time you call "pop.ValidateAndCreate" method.
|
||||
// This method is not required and may be deleted.
|
||||
func (u *User) ValidateCreate(tx *pop.Connection) (*validate.Errors, error) {
|
||||
var err error
|
||||
return validate.Validate(
|
||||
&validators.StringIsPresent{Field: u.Password, Name: "Password"},
|
||||
&validators.StringsMatch{Name: "Password", Field: u.Password, Field2: u.PasswordConfirmation, Message: "Password does not match confirmation"},
|
||||
), err
|
||||
}
|
||||
|
||||
// ValidateUpdate gets run every time you call "pop.ValidateAndUpdate" method.
|
||||
// This method is not required and may be deleted.
|
||||
func (u *User) ValidateUpdate(tx *pop.Connection) (*validate.Errors, error) {
|
||||
log.Println(u.Preferences)
|
||||
if u.Password != "" || u.PasswordConfirmation != "" {
|
||||
ph, err := bcrypt.GenerateFromPassword([]byte(u.Password), bcrypt.DefaultCost)
|
||||
if err != nil {
|
||||
return validate.NewErrors(), errors.WithStack(err)
|
||||
}
|
||||
u.PasswordHash = string(ph)
|
||||
|
||||
return validate.Validate(
|
||||
&validators.StringIsPresent{Field: u.Password, Name: "Password", Message: "Password must not be empty"},
|
||||
&validators.StringIsPresent{Field: u.PasswordConfirmation, Name: "PasswordConfirmation", Message: "Confirmation must be present"},
|
||||
&validators.StringsMatch{Name: "Password", Field: u.Password, Field2: u.PasswordConfirmation, Message: "Password does not match confirmation"},
|
||||
), nil
|
||||
}
|
||||
|
||||
return validate.NewErrors(), nil
|
||||
}
|
||||
52
models/user_email_verification.go
Normal file
52
models/user_email_verification.go
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
package models
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"time"
|
||||
|
||||
"github.com/gobuffalo/pop/v6"
|
||||
"github.com/gobuffalo/validate/v3"
|
||||
"github.com/gofrs/uuid"
|
||||
)
|
||||
|
||||
// UserEmailVerification is used by pop to map your user_email_verifications database table to your go code.
|
||||
type UserEmailVerification struct {
|
||||
ID uuid.UUID `json:"id" db:"id"`
|
||||
OwnerID uuid.UUID `json:"owner_id" db:"owner_id"`
|
||||
Owner *User `json:"owner" belongs_to:"user"`
|
||||
CreatedAt time.Time `json:"created_at" db:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at" db:"updated_at"`
|
||||
}
|
||||
|
||||
// String is not required by pop and may be deleted
|
||||
func (u UserEmailVerification) String() string {
|
||||
ju, _ := json.Marshal(u)
|
||||
return string(ju)
|
||||
}
|
||||
|
||||
// UserEmailVerifications is not required by pop and may be deleted
|
||||
type UserEmailVerifications []UserEmailVerification
|
||||
|
||||
// String is not required by pop and may be deleted
|
||||
func (u UserEmailVerifications) String() string {
|
||||
ju, _ := json.Marshal(u)
|
||||
return string(ju)
|
||||
}
|
||||
|
||||
// Validate gets run every time you call a "pop.Validate*" (pop.ValidateAndSave, pop.ValidateAndCreate, pop.ValidateAndUpdate) method.
|
||||
// This method is not required and may be deleted.
|
||||
func (u *UserEmailVerification) Validate(tx *pop.Connection) (*validate.Errors, error) {
|
||||
return validate.NewErrors(), nil
|
||||
}
|
||||
|
||||
// ValidateCreate gets run every time you call "pop.ValidateAndCreate" method.
|
||||
// This method is not required and may be deleted.
|
||||
func (u *UserEmailVerification) ValidateCreate(tx *pop.Connection) (*validate.Errors, error) {
|
||||
return validate.NewErrors(), nil
|
||||
}
|
||||
|
||||
// ValidateUpdate gets run every time you call "pop.ValidateAndUpdate" method.
|
||||
// This method is not required and may be deleted.
|
||||
func (u *UserEmailVerification) ValidateUpdate(tx *pop.Connection) (*validate.Errors, error) {
|
||||
return validate.NewErrors(), nil
|
||||
}
|
||||
5
models/user_email_verification_test.go
Normal file
5
models/user_email_verification_test.go
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
package models
|
||||
|
||||
func (ms *ModelSuite) Test_UserEmailVerification() {
|
||||
ms.Fail("This test needs to be implemented!")
|
||||
}
|
||||
58
models/user_preference.go
Normal file
58
models/user_preference.go
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
package models
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"time"
|
||||
|
||||
"github.com/gobuffalo/pop/v6"
|
||||
"github.com/gobuffalo/validate/v3"
|
||||
"github.com/gobuffalo/validate/v3/validators"
|
||||
"github.com/gofrs/uuid"
|
||||
)
|
||||
|
||||
// UserPreference is used by pop to map your user_preferences database table to your go code.
|
||||
type UserPreference struct {
|
||||
ID uuid.UUID `json:"id" db:"id"`
|
||||
OwnerID uuid.UUID `json:"owner_id" db:"owner_id"`
|
||||
Owner *User `json:"owner" belongs_to:"user"`
|
||||
EmailHourOfDay int `json:"email_hour_of_day" db:"email_hour_of_day" form:"email_hour_of_day"` // The hour of the day that the user prefers to receive emails
|
||||
TimeZoneUtcOffset int `json:"time_zone_utc_offset" db:"time_zone_utc_offset" form:"time_zone_utc_offset"` // The user's time zone, represented as a nubmer of hours (negativ or positive) relative to UTC
|
||||
CreatedAt time.Time `json:"created_at" db:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at" db:"updated_at"`
|
||||
}
|
||||
|
||||
// String is not required by pop and may be deleted
|
||||
func (u UserPreference) String() string {
|
||||
ju, _ := json.Marshal(u)
|
||||
return string(ju)
|
||||
}
|
||||
|
||||
// UserPreferences is not required by pop and may be deleted
|
||||
type UserPreferences []UserPreference
|
||||
|
||||
// String is not required by pop and may be deleted
|
||||
func (u UserPreferences) String() string {
|
||||
ju, _ := json.Marshal(u)
|
||||
return string(ju)
|
||||
}
|
||||
|
||||
// Validate gets run every time you call a "pop.Validate*" (pop.ValidateAndSave, pop.ValidateAndCreate, pop.ValidateAndUpdate) method.
|
||||
// This method is not required and may be deleted.
|
||||
func (u *UserPreference) Validate(tx *pop.Connection) (*validate.Errors, error) {
|
||||
return validate.Validate(
|
||||
&validators.IntIsPresent{Field: u.EmailHourOfDay, Name: "EmailHourOfDay"},
|
||||
&validators.IntIsPresent{Field: u.TimeZoneUtcOffset, Name: "TimeZoneUtcOffset"},
|
||||
), nil
|
||||
}
|
||||
|
||||
// ValidateCreate gets run every time you call "pop.ValidateAndCreate" method.
|
||||
// This method is not required and may be deleted.
|
||||
func (u *UserPreference) ValidateCreate(tx *pop.Connection) (*validate.Errors, error) {
|
||||
return validate.NewErrors(), nil
|
||||
}
|
||||
|
||||
// ValidateUpdate gets run every time you call "pop.ValidateAndUpdate" method.
|
||||
// This method is not required and may be deleted.
|
||||
func (u *UserPreference) ValidateUpdate(tx *pop.Connection) (*validate.Errors, error) {
|
||||
return validate.NewErrors(), nil
|
||||
}
|
||||
5
models/user_preference_test.go
Normal file
5
models/user_preference_test.go
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
package models
|
||||
|
||||
func (ms *ModelSuite) Test_UserPreference() {
|
||||
ms.Fail("This test needs to be implemented!")
|
||||
}
|
||||
80
models/user_test.go
Normal file
80
models/user_test.go
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
package models
|
||||
|
||||
func (ms *ModelSuite) Test_User_Create() {
|
||||
count, err := ms.DB.Count("users")
|
||||
ms.NoError(err)
|
||||
ms.Equal(0, count)
|
||||
|
||||
u := &User{
|
||||
Email: "mark@example.com",
|
||||
Password: "password",
|
||||
PasswordConfirmation: "password",
|
||||
}
|
||||
|
||||
ms.Zero(u.PasswordHash)
|
||||
|
||||
verrs, err := u.Create(ms.DB)
|
||||
ms.NoError(err)
|
||||
ms.False(verrs.HasAny())
|
||||
ms.NotZero(u.PasswordHash)
|
||||
|
||||
count, err = ms.DB.Count("users")
|
||||
ms.NoError(err)
|
||||
ms.Equal(1, count)
|
||||
}
|
||||
|
||||
func (ms *ModelSuite) Test_User_Create_ValidationErrors() {
|
||||
count, err := ms.DB.Count("users")
|
||||
ms.NoError(err)
|
||||
ms.Equal(0, count)
|
||||
|
||||
u := &User{
|
||||
Password: "password",
|
||||
}
|
||||
|
||||
ms.Zero(u.PasswordHash)
|
||||
|
||||
verrs, err := u.Create(ms.DB)
|
||||
ms.NoError(err)
|
||||
ms.True(verrs.HasAny())
|
||||
|
||||
count, err = ms.DB.Count("users")
|
||||
ms.NoError(err)
|
||||
ms.Equal(0, count)
|
||||
}
|
||||
|
||||
func (ms *ModelSuite) Test_User_Create_UserExists() {
|
||||
count, err := ms.DB.Count("users")
|
||||
ms.NoError(err)
|
||||
ms.Equal(0, count)
|
||||
|
||||
u := &User{
|
||||
Email: "mark@example.com",
|
||||
Password: "password",
|
||||
PasswordConfirmation: "password",
|
||||
}
|
||||
|
||||
ms.Zero(u.PasswordHash)
|
||||
|
||||
verrs, err := u.Create(ms.DB)
|
||||
ms.NoError(err)
|
||||
ms.False(verrs.HasAny())
|
||||
ms.NotZero(u.PasswordHash)
|
||||
|
||||
count, err = ms.DB.Count("users")
|
||||
ms.NoError(err)
|
||||
ms.Equal(1, count)
|
||||
|
||||
u = &User{
|
||||
Email: "mark@example.com",
|
||||
Password: "password",
|
||||
}
|
||||
|
||||
verrs, err = u.Create(ms.DB)
|
||||
ms.NoError(err)
|
||||
ms.True(verrs.HasAny())
|
||||
|
||||
count, err = ms.DB.Count("users")
|
||||
ms.NoError(err)
|
||||
ms.Equal(1, count)
|
||||
}
|
||||
44
package.json
Normal file
44
package.json
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
{
|
||||
"name": "buffalo",
|
||||
"version": "1.0.0",
|
||||
"main": "index.js",
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
"dev": "webpack --watch",
|
||||
"build": "webpack --mode production --progress"
|
||||
},
|
||||
"repository": "github.com/gobuffalo/buffalo",
|
||||
"dependencies": {
|
||||
"@fortawesome/fontawesome-free": "^5.12.0",
|
||||
"@popperjs/core": "^2.0.0",
|
||||
"bootstrap": "^5.0.0",
|
||||
"jquery": "^3.6.0",
|
||||
"jquery-ujs": "^1.2.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/cli": "^7.0.0",
|
||||
"@babel/core": "^7.0.0",
|
||||
"@babel/preset-env": "^7.0.0",
|
||||
"autoprefixer": "^9.7.6",
|
||||
"babel-loader": "^8.1.0",
|
||||
"copy-webpack-plugin": "~6.4.1",
|
||||
"css-loader": "~3.5.1",
|
||||
"expose-loader": "^3.0.0",
|
||||
"file-loader": "~6.0.0",
|
||||
"glob": "^7.2.0",
|
||||
"gopherjs-loader": "^0.0.1",
|
||||
"mini-css-extract-plugin": "^2.0.0",
|
||||
"npm-install-webpack-plugin": "4.0.5",
|
||||
"postcss-loader": "^3.0.0",
|
||||
"sass": "^1.0.0",
|
||||
"sass-loader": "~10.2.0",
|
||||
"style-loader": "~1.1.3",
|
||||
"terser-webpack-plugin": "~2.3.1",
|
||||
"url-loader": "~4.1.0",
|
||||
"webpack": "~5.65.0",
|
||||
"webpack-cli": "^4.0.0",
|
||||
"webpack-livereload-plugin": "^3.0.0",
|
||||
"webpack-manifest-plugin": "^4.0.0"
|
||||
},
|
||||
"packageManager": "yarn@3.3.1"
|
||||
}
|
||||
5
postcss.config.js
Normal file
5
postcss.config.js
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
module.exports = {
|
||||
plugins: [
|
||||
require('autoprefixer')
|
||||
]
|
||||
}
|
||||
10935
public/assets/application.c0219947d56b0fe0c486.css
Normal file
10935
public/assets/application.c0219947d56b0fe0c486.css
Normal file
File diff suppressed because it is too large
Load diff
146
public/assets/application.d7984b9b397ebbdb30fb.js
Normal file
146
public/assets/application.d7984b9b397ebbdb30fb.js
Normal file
File diff suppressed because one or more lines are too long
BIN
public/assets/images/favicon.ico
Normal file
BIN
public/assets/images/favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
721
public/assets/images/logo.svg
Normal file
721
public/assets/images/logo.svg
Normal file
|
|
@ -0,0 +1,721 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Buffalo_x5F_Gopher" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
|
||||
y="0px" viewBox="0 0 900 900" enable-background="new 0 0 900 900" xml:space="preserve">
|
||||
<g>
|
||||
<path fill="none" stroke="#211915" stroke-width="16" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M168.4,188c69-72,165.9-117.3,273.3-117.3C651.2,70.7,821,240.4,821,449.8C821,659.3,651.2,829,441.7,829
|
||||
C232.3,829,62.5,659.2,62.5,449.8l-0.2,0c-0.1-1.1,0.1-2.2,0-3.2c-1.7-27.6-3.4-55.2-5.1-82.8c-0.7-11.6-1.6-23.1-2.1-34.7
|
||||
c-0.2-3.6-0.6-7.2-0.3-10.7c0.9-13.3,12.8-11,24.1-13.5c0,0,0-87.7,0-87.7s0.8-15,24.2-15L127,188h9.4l-0.5-20.2
|
||||
c0,0-7.2-0.7-7.9-6.7c0,0-0.7-5.4,1.6-6.4c0,0,2.4-1.6,2.4,5.9c0,0,1.2,2.6,3,2.6l0.2-19.4c0,0,0.2-3.2,2.7-3.2
|
||||
c0,0,3.1-0.7,3.1,2.7c0,0,0,27.4,0,27.6c0,0.2,3.1-1.6,3.3-2c0.6-1,0.4-2.4,0.5-3.5c0.1-1.8-0.1-8.4,1.6-8.8
|
||||
c2.2-0.6,2.7,3.2,2.8,4.8c0.3,3.5-0.2,8-2.6,10.9c-0.4,0.5-4.6,3.6-4.6,3.2c0,0-0.7,12.7-0.7,12.7h0.3H168.4z"/>
|
||||
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="494.644" y1="540.6563" x2="494.644" y2="70.5313">
|
||||
<stop offset="0" style="stop-color:#D17C56"/>
|
||||
<stop offset="0.4089" style="stop-color:#D0805B"/>
|
||||
<stop offset="1" style="stop-color:#B2E6EA"/>
|
||||
</linearGradient>
|
||||
<path fill="url(#SVGID_1_)" d="M168.3,187c69-71.8,166-116.4,273.4-116.4C651.2,70.5,821,240.3,821,449.8c0,24.3-2.3,48.1-6.7,71.2
|
||||
l-151.9,7.4l-63.2,12.3L181.9,230.2L168.3,187z"/>
|
||||
<polygon fill="#AF7133" points="764.3,649 645.2,607.4 574.6,597.2 578.2,548 625.4,538.5 638.4,538.5 809.4,538.8 809.4,541.5
|
||||
805.7,556.7 798.1,579.7 788,606.2 779.7,620.5 772.9,634.6 "/>
|
||||
<polygon fill="#AF7133" points="62.3,448.3 55.2,332.5 54.7,318.3 56.1,313 58.6,309.7 64.1,307.2 75.7,305.4 78.7,304.8
|
||||
78.4,266.1 78.4,228.5 79.2,215.5 82.6,208.9 88.7,204.3 98,201.8 101.9,201.5 109.9,197.4 127,187 181.9,187.5 202.6,176.4
|
||||
217.8,175.5 248.9,173.6 258.2,173.1 268.8,178.1 275.9,183 283.2,190.4 285.2,203.6 290.3,302.5 287.4,449.8 291.4,561.8
|
||||
297.1,624.2 271.1,629.4 160.1,651.5 125.2,658.6 117.2,646.1 104.9,624.2 92.4,597.5 77.9,557.1 72.1,535 68.7,518.5 65.6,498.2
|
||||
63.5,477.8 62.8,459.5 "/>
|
||||
<polygon fill="#7B3D24" points="764.8,648.5 643.8,607.5 574.8,596.1 294.7,624.7 125.2,658.6 141.7,681.7 154.8,697.7 181.9,726
|
||||
227.5,762.7 261.6,783.5 316.2,807.7 359.8,820.1 382,824.3 412.7,827.9 439.1,829 454.4,829 482.9,826.8 518.3,821.2 543.9,815.1
|
||||
566.1,808.1 595.4,796.5 612.4,788.5 621.6,783.7 649.3,767.2 668.1,754.1 694.8,732.2 712.8,715 734.5,690.8 751.3,668.8 "/>
|
||||
<path fill="#AF7133" d="M305.9,673.9l-53.1,1.8l20.8,73.5l28.7,6l48.7,1.3h83.3l15-3c0,0,36.7-9.5,37.7-9.5
|
||||
c1,0,61.4-15.4,61.4-15.4l76.9-19.2v-19l-24.8-26.3l-49.2-6.9L305.9,673.9z"/>
|
||||
<path fill="#BC9E6C" d="M533.5,231.3l-10.1-4.3h-14.3l-25.7-6h-34.6l-39.4,6h-51.6l-25.7,3.3c-26.8,15.8-41.1,46-52.2,73.8
|
||||
c-8.9,22.4-19.3,45-21.9,69.2c-1.3,11.8-0.2,24.8,2.9,37.2l-2.1,2.1l-1.3,5.4l6.7,22.8l32.7,35.6l67.7,35.5l55.7,12.5l44.9-1.9
|
||||
l23.7-14.7l66.2-31.5l30.4-14.3l16.3-42.7v-12l0.5-0.4c9.5-45.1-4.3-80.4-24.7-118.8c-12.4-23.3-21.6-43.6-45.7-57.9"/>
|
||||
<path fill="#6AD7E5" d="M299.1,463.3c-19.8-66.4,11.8-149.6,89.2-149.4l47.1-1.4h41l-0.1,0.3c77.4-0.2,109,83,89.2,149.3l-12.4,8.4
|
||||
l-26.4,19.6l-10.2,10.4h-15.1l-24.6,11.7l-14.4,6.1l-28.5,2.7l-33.3-0.9l-28.8-11.6L332.2,490l-25.7-19.4L299.1,463.3z"/>
|
||||
<path fill="#F6D2A2" d="M406.2,438.7c4.5-2.6,10.4-5.5,15.7-5.1c5.1,0.4,10.1,1.6,15.2,2.4c4.8,0.8,9.3,0.8,13.9,2.6
|
||||
c4.6,1.8,9,4.9,12.1,8.7c3.6,4.5,1.6,11.4-3.7,14.5c-9.8,5.8-18.4-5.6-28.3-5.5c-9.5,0.1-18.1,9.1-27.3,1.3
|
||||
C397.8,452.6,400.3,442.1,406.2,438.7z"/>
|
||||
<path fill="#FFFFFF" d="M443.5,474.3c4.4-1.2,5.2-6.8,3.9-10.7c-1.6-5-8.2-8.4-13.4-5.9c-4.3,2-2.8,6.4-2.9,11.4
|
||||
C430.9,475.8,438.5,475.6,443.5,474.3z"/>
|
||||
<path fill="#FFFFFF" d="M412.3,461.6c1.7,0.5,3.6,0,5.3-0.6c3.3-1.2,9.3-5.8,11.6-3.9c2.7,2.1,1.5,15.5,0.8,15.9
|
||||
c-3.4,2-8.4,2.9-13.3,1.3c-5.9-1.9-3.6-7-3.5-10.8c0-0.6,0.4-1.1,0.3-1.7"/>
|
||||
<ellipse transform="matrix(0.128 -0.9918 0.9918 0.128 45.5048 835.4331)" fill="#FFFFFF" cx="497.8" cy="391.8" rx="49" ry="49"/>
|
||||
|
||||
<ellipse transform="matrix(0.128 -0.9918 0.9918 0.128 -72.0028 704.4983)" fill="#FFFFFF" cx="364.6" cy="393.2" rx="49" ry="49"/>
|
||||
|
||||
<ellipse transform="matrix(0.128 -0.9918 0.9918 0.128 7.9834 574.7572)" fill="#FFFFFF" cx="330.8" cy="282.8" rx="24.3" ry="24.3"/>
|
||||
<path fill="#726958" d="M294.2,271.6c-5.3-1.7-11.7-13.6-14.2-18.3c-5.1-9.2-8.4-19.4-9-30c-0.3-5.5,0.1-17.7,7.4-19.5
|
||||
c9.1-2.3,14.1,11.7,20.6,15.8c9.3,5.9,21.7,4.5,32,2.4c0,0,0.7,4.5,0.8,4.8c0.1,0.9,0.7,2.3,0.5,3.1c-0.2,1.1-2,1.6-2.9,2.1
|
||||
c-3.2,1.7-6,3.6-8.9,5.8c-1.9,1.5-3.5,3.2-5.2,5c-0.8,0.8-1.6,1.5-2.3,2.4c-0.7,0.9-1.3,1.9-2,2.8c-1.9,2.1-3.2,4.6-4.9,6.8
|
||||
c-1.4,1.7-3,3.5-4,5.5c-1,1.9-2.4,3.7-3.2,5.6c-0.5,1.3-0.7,2.5-1.8,3.5C296,270.3,295,270.9,294.2,271.6z"/>
|
||||
<path fill="#BC9E6C" d="M259.4,518c-6.9,4-17,12.8-21.8,17.6c-2.6,2.6-11.7,10.7-13,14.3c-2.5,6.8,7.5,2.5,8.8,8.6
|
||||
c1.5,6.9-5.1,11,5.3,10.7c5.8-0.2,11.4-2.1,16.7-4c8.7-3.2,20.5-5.3,30.2-10.6l0.2-4l0.2-3.6l-8.3-8.3l-10.3-17.8l-2.7-2.8H259.4z"
|
||||
/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M317.5,664.9c-8.3,6.8-16.6,13.6-20.8,23.6c-5,11.8-0.9,27.8,13.1,28.6c9.8,0.5,27-6.3,35.6-10.5c8.8-4.3,23.5-13.1,31.8-18.9"/>
|
||||
<path fill="#BC9E6C" d="M283.3,259c-6.4,0-28.9,8-30.7,14.9c-3.2,12.2,24.7,15.7,32.6,17.2l8.9-19.5L283.3,259z"/>
|
||||
|
||||
<ellipse transform="matrix(0.9918 -0.128 0.128 0.9918 -31.8144 70.6109)" fill="#FFFFFF" cx="533.5" cy="282.8" rx="24.3" ry="24.3"/>
|
||||
<path fill="#726958" d="M533.5,222.1c10.2,2.1,22.6,3.5,32-2.3c6.5-4.1,11.6-18.1,20.6-15.8c7.2,1.8,7.7,14,7.3,19.6
|
||||
c-0.6,10.5-4,20.7-9,30c-2.6,4.7-9.7,17.1-15,18.7l-10.3-13.7l-11-15.8l-12.1-10.1l-3.6-2.7L533.5,222.1"/>
|
||||
<path fill="#BC9E6C" d="M286,546.9c-2.6,33.1,6.4,70.2,20.1,100.1c6,13.2,15.1,24.5,28.5,30.6c21.6,9.8,46.8,10.5,70.1,11.8
|
||||
c9.1,0.5,21,1.2,29.2,1.4c8.3-0.2,16.6-0.9,25.7-1.4c23.3-1.4,48.5-2,70.1-11.8c13.4-6.1,22.5-17.4,28.5-30.6
|
||||
c13.7-29.9,22.6-67,20.1-100.1l-5.7,3.1l-14.7,3.2l-9.7,2.9l-6.4,17.7l-21.9,20.6l-19.4,3.1l-11.7,1.6l-7.5,7.5l-8.2-8.7l-8.4,8.4
|
||||
L454,609l-28.3-1.8l-12.5,0.4l-18.5-9.1l-8.6,2.1l-16-4.2l-38.1-12.9l-12.2-14.2l-4.4-11.7l-9.6-2.5L286,546.9z"/>
|
||||
<path fill="#BC9E6C" d="M604.9,518.3c6.9,4.3,17,12.7,21.8,17.4c2.6,2.6,11.7,10.6,13,14.2c2.5,6.8-7.5,2.4-8.8,8.5
|
||||
c-1.5,6.9,5.1,11-5.3,10.7c-5.8-0.2-11.4-2.1-16.7-4.1c-8.7-3.2-20.5-5.3-30.2-10.6l-0.5-7.6l8.2-6.1l6.7-7.4l2.5-8.9l3.1-5.8
|
||||
L604.9,518.3"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M546.8,664.9c8.3,6.8,16.6,13.6,20.8,23.6c5,11.8,0.9,27.8-13.1,28.6c-9.8,0.5-27-6.3-35.6-10.5c-8.8-4.3-23.5-13.1-31.8-18.9"/>
|
||||
<path fill="#BC9E6C" d="M579.2,289.8c7.9-1.5,35.6-3.4,32.4-15.6c-1.8-6.9-24.2-15-30.6-15l-11.6,13L579.2,289.8z"/>
|
||||
<path fill="#493628" d="M294.8,462.1c27.8-1.2,51.6,19.5,64.3,42l-7-10.7c14.2-2.2,32.2,4.7,41.5,16c10.4-3,16.9,0.6,20.6,5.3
|
||||
c10.2-6.8,25.1-3.8,35,0c3.6-5,10.5-8.4,21.4-5.3c9.3-11.4,27.3-18.2,41.5-16l-7,10.7c12.7-22.6,36.5-43.3,64.3-42
|
||||
c18.5-14.8,29.8-30.7,33-54.6l-0.5,3c31.9-6.5,36.9,118.6-6.8,107.6l3.5,0.6c-1.8,22.1-31.5,38.1-51.5,37.4l3.2,0.1
|
||||
c-5.7,28.7-35.4,46.9-59.5,42.9c0,0.6-3.7,8.1-13,7.7c-7.4-0.3-3.8-6.7-7.3-10.7c-0.2,2.7-3.1,10.9-6.7,11.8
|
||||
c-3.7,0.9-3.9,1.4-12.4-0.9c-0.7,11.1-7.6,27.4-16.7,34.5c-8.2-5.6-18-24.8-20.4-34.8c-4.6,3.2-7.8,3.6-12.1,0.1
|
||||
c-2.4-1.9-8.3-8.2-8.5-10.8c-3.5,4,0,10.4-7.3,10.7c-4.5,0.2-9.9-5.7-10-10c-26.2-1.2-56.8-11.9-62.6-40.6l3.2-0.1
|
||||
c-20,0.7-49.7-15.3-51.5-37.4l3.5-0.6c-43.7,11-40-114.1-8.1-107.6c2.3,9.1,5.7,17.9,10.3,25.5
|
||||
C277.3,446.1,285.6,454.7,294.8,462.1z"/>
|
||||
<path fill="#6E5128" d="M432.7,288.4c9.9-0.2,20.7-0.6,29.5,3.5c10.5,4.9,17.9,23.8,13,34.9c-4.8,11-16.3,17-27.5,19.7
|
||||
c-18.9,4.5-49.7,0.8-58.7-19.7c-4.9-11.1,2.5-30,13-34.9C411.1,287.7,422.6,288.1,432.7,288.4"/>
|
||||
<polygon fill="#5B5B5F" points="234.5,539 241.6,543.7 245.8,550.9 248,556.8 248,563.5 247.4,567.7 234.4,568.9 232.8,567.7
|
||||
233.4,558.5 228.7,554.3 224.2,553.9 226.6,546.9 "/>
|
||||
<polygon fill="#5B5B5F" points="621.4,543.9 625.4,540.7 628.9,538.9 633.4,542.6 640.1,549.8 639.6,553.3 635.6,555.1
|
||||
630.8,556.7 630.2,563.4 631.5,567.7 625.6,569.2 616.7,567.7 615,564.5 615,557.5 616.4,550 "/>
|
||||
<polygon fill="#BC9E6C" points="377.2,686.7 365.7,695 342.3,707.7 323.7,715 311.4,716.8 304.9,715.7 299.6,713.1 296,705.7
|
||||
294.7,699.4 295.8,691 297.1,684.3 306,675.5 316.5,665.6 321.4,670.5 330.4,675.5 346.7,681.7 359.8,685.3 "/>
|
||||
<path fill="#BC9E6C" d="M546.8,664.9c8.3,6.8,16.6,13.6,20.8,23.6c5,11.8,0.9,27.8-13.1,28.6c-9.8,0.5-27-6.3-35.6-10.5
|
||||
c-8.8-4.3-23.5-13.1-31.8-18.9l9-1.1l18.4-3.6l17.6-6.6l11.4-8.1L546.8,664.9z"/>
|
||||
<polygon fill="#5B5B5F" points="566.1,686.2 557.7,687.4 548.1,690.5 537.1,697.7 527.8,706.3 526,709.2 533.7,712.4 547.7,716.3
|
||||
555.1,717 561.1,715.3 566.1,711.6 569.7,705.6 569,698.2 567.5,690.1 "/>
|
||||
<polygon fill="#5B5B5F" points="297.1,684.3 307.6,687.3 318.3,692.1 331.2,701.6 339.1,709.5 326.4,713.9 311.4,716.8
|
||||
304.9,715.7 299.6,713.1 294.7,701.6 293.4,695.3 296.2,688.8 "/>
|
||||
<polygon fill="#AF7133" points="722.3,673.7 706.4,665.5 685.4,665.5 680.8,691.3 693.6,691 "/>
|
||||
<polygon fill="#7B3D24" points="618.1,528.1 662.4,497.5 772.4,497.5 787.4,498 813.1,520.5 812.8,528.3 809.4,538.8 727.8,538.6
|
||||
631.4,538.6 "/>
|
||||
<polygon fill="#FFD6AC" points="647.5,608.8 808.1,548.1 806.4,554.1 654.9,611.3 "/>
|
||||
<path fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M762.5,559v-6.2
|
||||
c0,0-2.6-0.1-2.9-2.1c0,0-0.3-1.7,0.4-2.1c0,0,0.7-0.5,0.7,2c0,0,0.4,0.9,1,0.9l0-6.4c0,0,0.4-1.1,1.3-1.1c0,0,1.4-0.2,1.4,0.9
|
||||
c0,0,0,9.1,0,9.1c0,0.1,0.6-0.5,0.7-0.7c0.2-0.3-0.1-0.8,0-1.2c0-0.6-0.1-2.8,0.4-2.9c0.7-0.2,0.8,1.1,0.9,1.6
|
||||
c0.1,1.2,0.2,2.6-0.7,3.6c-0.1,0.2-1.3,1-1.3,0.9c0,0,0,3.7,0,3.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M754.5,626v-6.2
|
||||
c0,0-2.6-0.1-2.9-2.1c0,0-0.3-1.7,0.4-2.1c0,0,0.7-0.5,0.7,2c0,0,0.4,0.9,1,0.9l0-6.4c0,0,0.4-1.1,1.3-1.1c0,0,1.4-0.2,1.4,0.9
|
||||
c0,0,0,9.1,0,9.1c0,0.1,0.6-0.5,0.7-0.7c0.2-0.3-0.1-0.8,0-1.2c0-0.6-0.1-2.8,0.4-2.9c0.7-0.2,0.8,1.1,0.9,1.6
|
||||
c0.1,1.2,0.2,2.6-0.7,3.6c-0.1,0.2-1.3,1-1.3,0.9c0,0,0,3.7,0,3.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M676.5,564v-6.2
|
||||
c0,0,2-0.1,2.2-2.1c0,0,0-1.7-0.7-2.1c0,0-0.9-0.5-0.9,2c0,0-0.4,0.9-1,0.9l-0.1-6.4c0,0,0.2-1.1-0.6-1.1c0,0-0.8-0.2-0.8,0.9
|
||||
c0,0,0,9.1,0,9.1c0,0.1-1.3-0.5-1.4-0.7c-0.2-0.3-0.3-0.8-0.3-1.2c0-0.6,0-2.8-0.6-2.9c-0.7-0.2-0.9,1.1-1,1.6
|
||||
c-0.1,1.2,0.5,2.6,1.3,3.6c0.1,0.2,1.9,1,1.9,0.9c0,0,0,3.7,0,3.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M593.5,590v-6.2
|
||||
c0,0,2-0.1,2.2-2.1c0,0,0-1.7-0.7-2.1c0,0-0.9-0.5-0.9,2c0,0-0.4,0.9-1,0.9l-0.1-6.4c0,0,0.2-1.1-0.6-1.1c0,0-0.8-0.2-0.8,0.9
|
||||
c0,0,0,9.1,0,9.1c0,0.1-1.3-0.5-1.4-0.7c-0.2-0.3-0.3-0.8-0.3-1.2c0-0.6,0-2.8-0.6-2.9c-0.7-0.2-0.9,1.1-1,1.6
|
||||
c-0.1,1.2,0.5,2.6,1.3,3.6c0.1,0.2,1.9,1,1.9,0.9c0,0,0,3.7,0,3.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M136.4,187l-0.5-19.8c0,0-7.2-0.3-7.9-6.3c0,0-0.7-5.3,1.6-6.3c0,0,2.4-1.5,2.4,5.9c0,0,1.2,2.6,3,2.6l0.2-19.4
|
||||
c0,0,0.7-3.2,3.2-3.2c0,0,3.6-0.7,3.6,2.7c0,0,0,27.4,0,27.6c0,0.2,2.6-1.6,2.8-2c0.6-1,0.2-2.4,0.2-3.5c0.1-1.8-0.2-8.4,1.4-8.8
|
||||
c2.2-0.6,2.6,3.2,2.7,4.8c0.3,3.5-0.2,8-2.6,10.9c-0.4,0.5-4.7,3.1-4.7,2.7c0,0-0.8,11.9-0.8,11.9"/>
|
||||
<path fill="#ACDD00" d="M762,559v-6.2c0,0-2.4-0.1-2.6-2.1c0,0-0.2-1.7,0.5-2.1c0,0,0.8-0.5,0.8,2c0,0,0.4,0.9,1,0.9l0.1-6.4
|
||||
c0,0,0.2-1.1,1-1.1c0,0,1.2-0.2,1.2,0.9c0,0,0,9.1,0,9.1c0,0.1,0.9-0.5,1-0.7c0.2-0.3,0.1-0.8,0.1-1.2c0-0.6-0.1-2.8,0.5-2.9
|
||||
c0.7-0.2,0.9,1.1,0.9,1.6c0.1,1.2-0.1,2.6-0.9,3.6c-0.1,0.2-1.6,1-1.6,0.9c0,0,0,3.7,0,3.7H762z"/>
|
||||
<path fill="#ACDD00" d="M754,626v-6.2c0,0-2.4-0.1-2.6-2.1c0,0-0.2-1.7,0.5-2.1c0,0,0.8-0.5,0.8,2c0,0,0.4,0.9,1,0.9l0.1-6.4
|
||||
c0,0,0.2-1.1,1-1.1c0,0,1.2-0.2,1.2,0.9c0,0,0,9.1,0,9.1c0,0.1,0.9-0.5,1-0.7c0.2-0.3,0.1-0.8,0.1-1.2c0-0.6-0.1-2.8,0.5-2.9
|
||||
c0.7-0.2,0.9,1.1,0.9,1.6c0.1,1.2-0.1,2.6-0.9,3.6c-0.1,0.2-1.6,1-1.6,0.9c0,0,0,3.7,0,3.7H754z"/>
|
||||
<path fill="#ACDD00" d="M676,564v-6.2c0,0,2.2-0.1,2.4-2.1c0,0,0.1-1.7-0.6-2.1c0,0-0.8-0.5-0.8,2c0,0-0.4,0.9-1,0.9l-0.1-6.4
|
||||
c0,0,0-1.1-0.9-1.1c0,0-1-0.2-1,0.9c0,0,0,9.1,0,9.1c0,0.1-1.1-0.5-1.1-0.7c-0.2-0.3-0.1-0.8-0.2-1.2c0-0.6,0-2.8-0.5-2.9
|
||||
c-0.7-0.2-0.9,1.1-0.9,1.6c-0.1,1.2,0.2,2.6,1,3.6c0.1,0.2,1.7,1,1.7,0.9c0,0,0,3.7,0,3.7H676z"/>
|
||||
<path fill="#ACDD00" d="M593,590v-6.2c0,0,2.2-0.1,2.4-2.1c0,0,0.1-1.7-0.6-2.1c0,0-0.8-0.5-0.8,2c0,0-0.4,0.9-1,0.9l-0.1-6.4
|
||||
c0,0,0-1.1-0.9-1.1c0,0-1-0.2-1,0.9c0,0,0,9.1,0,9.1c0,0.1-1.1-0.5-1.1-0.7c-0.2-0.3-0.1-0.8-0.2-1.2c0-0.6,0-2.8-0.5-2.9
|
||||
c-0.7-0.2-0.9,1.1-0.9,1.6c-0.1,1.2,0.2,2.6,1,3.6c0.1,0.2,1.7,1,1.7,0.9c0,0,0,3.7,0,3.7H593z"/>
|
||||
<path fill="#ACDD00" d="M136.4,187l-0.5-19.8c0,0-7.2-0.3-7.9-6.3c0,0-0.7-5.3,1.6-6.3c0,0,2.4-1.5,2.4,5.9c0,0,1.2,2.6,3,2.6
|
||||
l0.2-19.4c0,0,0.7-3.2,3.2-3.2c0,0,3.6-0.7,3.6,2.7c0,0,0,27.4,0,27.6c0,0.2,2.6-1.6,2.8-2c0.6-1,0.2-2.4,0.2-3.5
|
||||
c0.1-1.8-0.2-8.4,1.4-8.8c2.2-0.6,2.6,3.2,2.7,4.8c0.3,3.5-0.2,8-2.6,10.9c-0.4,0.5-4.7,3.1-4.7,2.7c0,0-0.8,11.9-0.8,11.9
|
||||
L136.4,187z"/>
|
||||
|
||||
<radialGradient id="SVGID_2_" cx="737.6794" cy="406.1918" r="45.3992" gradientTransform="matrix(0.937 -0.3492 0.3492 0.937 -91.5873 282.9574)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0" style="stop-color:#C47826"/>
|
||||
<stop offset="0" style="stop-color:#B55314"/>
|
||||
<stop offset="0.8092" style="stop-color:#C98F31"/>
|
||||
</radialGradient>
|
||||
<path fill="url(#SVGID_2_)" d="M700,424.1c-2.6-6.1-4.2-13.1-3.9-20.2c1-25,22.1-44.5,47.2-43.4c25,1,44.5,22.1,43.4,47.2
|
||||
c-0.7,16.4-11.4,32.5-25,39.3L700,424.1z"/>
|
||||
<path fill="#FFFFFF" d="M705,234.9c0-0.2,1-0.4,1.7-0.5c2.6-0.4,5.2-0.4,7.8,0c4.1,0.6,7.9,2.2,11.2,4.8c4.6,3.7,7.4,9.1,9.1,14.7
|
||||
c0,0,17.3-3,19.2,14c6.3,0,15.6-1.2,18.1,6.5c2.2,6.8-1.9,11.1-7,12.9c-2.2,0.8-4.6,1.2-6.7,1.1c-12.3-0.3-24.6-0.2-36.9,0
|
||||
c-21.3-0.2-54.4-0.6-75.7,0c-2.2,0.1-4.5-0.3-6.7-1.1c-5.1-1.9-9.2-6.1-7-12.9c2.5-7.6,11.8-6.5,18.1-6.5c1.9-17,19.5-14,19.5-14
|
||||
C676.9,229.4,705,234.9,705,234.9L705,234.9z"/>
|
||||
<path fill="#FFFFFF" d="M380.7,167.5c-0.7,0-5.5,0-6.3,0c-21.3-0.2-54.4-0.6-75.7,0c-2.2,0.1-4.5-0.3-6.7-1.1
|
||||
c-5.1-1.9-9.2-6.1-7-12.9c2.5-7.6,11.8-6.5,18.1-6.5c1.9-17,19.5-14,19.5-14c7.2-24.6,35.3-19,35.3-19v0c0-0.2,1-0.4,1.7-0.5
|
||||
c2.6-0.4,5.2-0.4,7.8,0c4.1,0.6,7.9,2.2,11.2,4.8c4.6,3.7,7.4,9.1,9.1,14.7c0,0,17.3-3,19.2,14c7.1-3.8,12.9-0.8,16.2,3.4"/>
|
||||
<path fill="#FFFFFF" d="M599.3,332.3c2.3-11.3,15-9.9,15-9.9h0c0-0.1,0.4-0.2,0.8-0.3c1.2-0.3,2.3-0.4,3.5-0.3
|
||||
c1.9,0.1,3.6,0.7,5.2,1.7c2.2,1.5,3.7,3.8,4.6,6.2c0,0,7.6-2,9.1,5.5c2.8-0.2,6.9-1.1,8.3,2.2c1.3,3-0.4,5-2.6,6.1
|
||||
c-0.9,0.4-2,0.7-3,0.8c-5.5,0.3-11,0.9-16.5,1.4c-6,0.5-14.1,1.1-21.6,1.7"/>
|
||||
<path fill="#FFFFFF" d="M661.5,433c-1.9-0.2-3.7-0.4-5.6-0.6c-3.7-0.4-9.4-1.1-13.1-1.4c-0.4,0-0.8-0.1-1.1-0.3
|
||||
c-0.9-0.4-1.5-1.2-1-2.4c0.6-1.3,2.2-0.9,3.3-0.8c0.6-2.9,3.6-2.1,3.6-2.1c1.7-4.1,6.5-2.6,6.5-2.6l0,0c0,0,0.2-0.1,0.3-0.1
|
||||
c0.5,0,0.9,0,1.4,0.2c0.7,0.2,1.3,0.5,1.8,1c0.7,0.7,1.1,1.7,1.3,2.7c0,0,2.2-0.1,2.9,1.7"/>
|
||||
<path fill="#493628" d="M508.6,255.4c0,1.2-0.3,2.8-0.5,4.2c-0.4,2.9-1.4,5.7-2.2,8.5c5.9-6.6,12.4-10.7,16.5-19.3
|
||||
c4.6-9.6,11.1-15.9,11.1-26.7c-0.9-11.9-7-31.3-22.1-31.3c-4.4-9.4-17-17.2-24.2-15.5c-0.9-15.8-22.3-25.7-38.8-21.3l-0.1,0
|
||||
c-8.3-6.8-20.1-8.6-31.2,0c-16.7-4.5-38.2,5.6-38.6,21.7c-6.9-2.6-20.9,5.2-25.5,15c-15.1,0-21.2,19.4-22.1,31.3
|
||||
c0,10.8,6.5,17.1,11.1,26.7c4.1,8.7,10.6,12.8,16.5,19.3c-0.8-2.7-1.8-5.6-2.2-8.5c-0.2-1.4-0.5-3-0.5-4.2l0,0.1
|
||||
c3.2,6.8,3.4,12.8,9.5,17.8c5.4,4.5,12,6.4,17.9,8.8c-1.2-2-2.4-10,0-13.3c1.4,7,20.1,16.5,27.3,15.3c-1.2,0-1.3-8.5-1.3-11.3
|
||||
c6.4,0,16.9,6.7,23.1,10.2c6.2-3.5,16.6-10.3,23.1-10.2c0,2.8-0.1,11.4-1.3,11.3c7.3,1.1,25.9-8.3,27.3-15.3
|
||||
c2.4,3.3,1.2,11.3,0,13.3c5.8-2.4,12.4-4.4,17.9-8.8C505.2,268.3,505.3,262.3,508.6,255.4"/>
|
||||
<polygon fill="#AF7133" points="788,500.5 787.4,498 787.4,473.5 786.9,465.5 783.4,459.5 783.4,451.5 783.4,438.5 786.4,431.5
|
||||
786.4,422.5 783.7,416.9 782.4,410.5 774.4,410.5 774.4,425.5 772.4,430.5 772.4,456.5 766.4,453.1 766.4,446.5 755.4,444.1
|
||||
755.4,405.5 754.8,402.8 752.2,400.2 745.5,398.8 735.8,392.5 711.4,392.5 702.3,387.8 679.4,386.5 676.4,386.5 669.3,390.8
|
||||
665.4,395.5 665.4,407.5 662.3,410.3 661.4,428.3 661.4,497.5 772.4,497.5 "/>
|
||||
<polygon fill="#444242" points="433.2,512 433.1,512.5 431.4,515.4 431,518.2 431.8,521.7 432.8,520.5 433.9,518.2 433.5,516.5
|
||||
433.5,513.3 433.9,512 "/>
|
||||
<polygon fill="#444242" points="437.6,513.2 438.6,515.1 439.1,517.4 438.9,520.6 438.1,522.2 436.4,518.9 437.1,517.5
|
||||
437.4,516.1 437.3,514 "/>
|
||||
<polygon fill="#5B5B5F" points="435.4,520 436.5,522.1 438,525.7 439,530.5 439,532.5 438.4,533.7 437.1,534.8 435.6,535.1
|
||||
433.9,534.7 432.7,533.5 432.2,532 432.9,526.4 433.9,523.5 435,520.9 435.3,520.6 435.1,519.7 433.9,518.3 432.1,522.2
|
||||
430.4,526.7 429.4,531.1 429.6,533.8 430.3,535.4 432.1,536.5 433.9,536.8 436.2,536.8 438.4,536.2 439.8,535.1 440.5,534
|
||||
440.7,532 440.5,529.6 439.4,525.4 436.9,519.3 436.4,518.9 "/>
|
||||
<polygon fill="#5B5B5F" points="433.7,512.9 433.5,514 433.5,516.5 434.6,519.1 435.4,520 436.4,518.9 437.1,517.5 437.4,516.1
|
||||
437.2,513.2 "/>
|
||||
<polygon fill="#726958" points="435.3,520.4 434.1,523.4 433,528.3 433,530.5 433.5,529.7 434.6,529 435.6,528.8 437.3,529.4
|
||||
438.4,530.5 438.1,528.3 437.6,525.3 436.4,522.3 "/>
|
||||
<circle fill="#444242" cx="435.4" cy="532" r="3.2"/>
|
||||
<rect x="432" y="536" fill="#727176" width="8" height="104"/>
|
||||
<path fill="#444242" d="M435,542h-3c0,0,0-5.5,0-5.5c0-0.2,0.9,0.2,0.9,0.2c0.4,0.2,0.7,0.3,1.2,0.4c0.5,0.1,0.7,0.1,0.7,0.6
|
||||
c0,0.7,0.2,1.4,0.2,2.1C435,540.6,435,542,435,542z"/>
|
||||
<rect x="437" y="542" fill="#444242" width="3" height="4"/>
|
||||
<rect x="437" y="550" fill="#444242" width="3" height="4"/>
|
||||
<rect x="432" y="546" fill="#444242" width="3" height="4"/>
|
||||
<rect x="432" y="554" fill="#444242" width="3" height="4"/>
|
||||
<rect x="437" y="558" fill="#444242" width="3" height="4"/>
|
||||
<rect x="437" y="566" fill="#444242" width="3" height="4"/>
|
||||
<rect x="432" y="562" fill="#444242" width="3" height="4"/>
|
||||
<rect x="432" y="570" fill="#444242" width="3" height="4"/>
|
||||
<rect x="437" y="574" fill="#444242" width="3" height="4"/>
|
||||
<rect x="437" y="582" fill="#444242" width="3" height="4"/>
|
||||
<rect x="432" y="578" fill="#444242" width="3" height="4"/>
|
||||
<rect x="432" y="586" fill="#444242" width="3" height="4"/>
|
||||
<rect x="437" y="590" fill="#444242" width="3" height="4"/>
|
||||
<rect x="437" y="598" fill="#444242" width="3" height="4"/>
|
||||
<rect x="432" y="594" fill="#444242" width="3" height="4"/>
|
||||
<rect x="432" y="602" fill="#444242" width="3" height="4"/>
|
||||
<rect x="437" y="606" fill="#444242" width="3" height="4"/>
|
||||
<rect x="437" y="614" fill="#444242" width="3" height="4"/>
|
||||
<rect x="432" y="610" fill="#444242" width="3" height="4"/>
|
||||
<rect x="432" y="618" fill="#444242" width="3" height="4"/>
|
||||
<rect x="437" y="622" fill="#444242" width="3" height="4"/>
|
||||
<rect x="437" y="630" fill="#444242" width="3" height="4"/>
|
||||
<rect x="432" y="626" fill="#444242" width="3" height="4"/>
|
||||
<rect x="432" y="634" fill="#444242" width="3" height="4"/>
|
||||
<path fill="none" d="M569.8,218.1c-0.3-1.4,0.2-2.7,1.3-3.3"/>
|
||||
<path fill="none" d="M197.9,758.5c-1.9,0-3.6-0.4-5.5-0.2"/>
|
||||
<path fill="none" d="M189.4,760c0.1-0.2,0.3-0.3,0.5-0.2"/>
|
||||
<path opacity="0.2" d="M693.3,673.8c0.9,1.1,2.1,2,3,3.1c0.7,0.9,1.2,2.5,2.4,2.8c1.5,0.3,2.7-0.6,4.2,0c1.4,0.6,2.9,1.3,3.9,2.4
|
||||
c-3.9,2.7-7.5,5.6-11.9,7.6c-1.4,0.6-2.5,0.5-3.9,0.8c-2.9,0.5-6.7,2.2-9.5,0.7c-0.1-1,0.2-2.2,0.2-3.3c0-3.2,0.8-6.3,1.6-9.3
|
||||
c0.6-2.3,0.6-4.7,1-7c0.2-1.2,0.6-2.4,0.9-3.6c0.2-0.6,0.1-2,1-2.2c0.9-0.2,2.8,2.4,3.2,3C690.7,670.5,691.9,672.2,693.3,673.8z"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M154.5,242v54.4c0,0-13.7-3-13.7,25.7c0,0-7.3-3-7.3,12.1V419"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="78.5" y1="461" x2="78.5" y2="555"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="182.5" y1="394" x2="182.5" y2="647"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M658.4,520.5"/>
|
||||
<path opacity="0.2" d="M754,626v7.6c0,0-2.6,0.1-2.9,2.1c0,0-0.2,1.7,0.7,2.1c0,0,1,0.5,1-2c0,0,0.5-0.9,1.2-0.9l0.1,6.4
|
||||
c0,0-0.1,1.1,0.9,1.1c0,0,1.1,0.2,1.1-0.9c0,0,0-9.1,0-9.1c0-0.1,1.4,0.5,1.4,0.7c0.2,0.3,0.2,0.8,0.3,1.2c0.1,0.6,0,2.8,0.6,2.9
|
||||
c0.9,0.2,1-1.1,1.1-1.6c0.1-1.2-0.4-2.6-1.3-3.6c-0.2-0.2-2.1-1-2.1-0.9c0,0,0-5.1,0-5.1"/>
|
||||
<path opacity="0.2" d="M673.2,564.3l-1.5,7c0,0-2.3-0.4-3,1.5c0,0-0.4,1.7,0.4,2.2c0,0,0.9,0.7,1.4-1.7c0,0,0.7-0.7,1.4-0.6
|
||||
l-1.3,6.3c0,0-0.6,1,0.4,1.2c0,0,0.7,0.4,1-0.7c0,0,1.9-8.8,2-8.9c0-0.1,1.5,0.9,1.5,1c0.2,0.4,0.2,0.9,0.1,1.2
|
||||
c-0.1,0.6-0.5,2.7,0.1,3c0.8,0.4,1.3-0.8,1.4-1.3c0.3-1.1-0.1-2.7-0.8-3.9c-0.1-0.2-2.1-1.5-2.1-1.4c0,0,1-4.5,1-4.5"/>
|
||||
<path opacity="0.2" d="M590.2,591.3c-0.5,1.2-1,2.3-1.4,3.5c-0.2,0.5-0.4,1-0.6,1.5c-0.1,0.1-0.3,0.4-0.3,0.5
|
||||
c-0.1,0.5,0.7,0.5,1,0.5c0.2,0,0.4-0.2,0.6-0.2c0.3-0.1,0.6-0.1,0.9-0.1c0.3,0,0.7,0.1,1,0.2c0.3,0.1,0.5,0.2,0.8,0.3
|
||||
c0.9,0.1-0.2-0.9-0.4-1.1c-0.1-0.1-1.1-1-1.1-0.9c0.2-0.7,0.6-1.4,0.9-2.1c0.3-0.8,0.9-1.8,1.5-2.4c0.3-0.4-1.7-0.5-1.7-0.5
|
||||
C590.5,590.6,590.5,590.5,590.2,591.3z"/>
|
||||
<path opacity="0.2" d="M762.1,559.2l-1.4,5.2c0,0-2.3-0.6-2.9,0.8c0,0-0.4,1.2,0.4,1.7c0,0,0.9,0.6,1.4-1.1c0,0,0.7-0.5,1.3-0.3
|
||||
l-1.2,4.7c0,0-0.5,0.7,0.4,0.9c0,0,0.7,0.4,0.9-0.4c0,0,1.8-6.5,1.8-6.6c0-0.1,1.5,0.8,1.5,0.9c0.2,0.3,0.2,0.7,0.2,0.9
|
||||
c-0.1,0.5-0.5,2,0.1,2.3c0.8,0.4,1.3-0.5,1.4-0.8c0.3-0.8-0.1-2.1-0.8-3c-0.1-0.2-2.1-1.4-2.1-1.3c0,0,0.9-3.3,0.9-3.3"/>
|
||||
<line fill="none" x1="845" y1="521" x2="846" y2="521"/>
|
||||
<path opacity="0.3" fill="#C47826" d="M599.4,524c6-0.9,16.9,7.9,21.1,11.9c7.3,6.8,5,15,10.4,22.4c0.7-3.5,4.2-3.7,7.4-3.4
|
||||
c1.7-11.1-12.2-19.4-18.5-26.7c-2.3-2.7-3.6-4.8-6.9-6.6c-1.3-0.7-13.7-4.3-14-1c-0.1,1.7-0.3,4.2-0.1,5.4"/>
|
||||
<path opacity="0.3" fill="#C47826" d="M686.7,269.8c2.9-0.4,5-2.5,8.1-2.6c4.2-0.1,8,2.3,12.3,2.6c7,0.5,13.8-3.3,20.7-1.9
|
||||
c3.5,0.7,3.9,2.7,6.4,3.9c2.5,1.2,5.4,0.6,8,1.4c-0.8,5.6-12.6,4.2-15.9,2.8c-2.6-1.1-4.1-3.5-7-3.3c-2.2,0.2-5.5,2.3-8,2.7
|
||||
c-2.9,0.6-6.2,0.9-9.1,1c-6.6,0.3-12.9-2.6-19.5-2.1c-4,0.3-9.8,2.8-11.7-2.7c2.7-0.1,4.9-0.9,7.4-1.4
|
||||
C680.9,269.6,683.8,270.2,686.7,269.8z"/>
|
||||
<path opacity="0.3" fill="#C47826" d="M744.8,255.3c-3.8-1.9-7-1.3-10.7,0.2c1.8,1,3.9,0.7,5.7,1.7c1.3,0.7,2.7,1.6,3.9,2.5
|
||||
c1.3,1,2.4,2.3,3.2,3.7c0.2,0.4,1.9,4.5,1.6,4.5c6.9-1.1,4.8,8.9,0.9,11.3c-5.1,3.1-11.9,2.5-17.8,2.3c-15.1-0.6-30,3.6-45,3
|
||||
c-13.3-0.5-32.7-2-37.4-17.8c-7,3.2-27.2,4.8-14.6,17.4c6.3,6.3,14.1,4.1,22.2,3.9c10.4-0.2,20.9-0.7,31.3,0.1
|
||||
c14.3,1.2,28.8,2,43.1,1.4c7.3-0.3,14.4-1.5,21.5-2c5.6-0.5,13.1,1.3,17.2-3.6c3.4-4.1,2.9-12.8-2.3-15.1c-2.3-1-6.1-0.1-8.8-0.3
|
||||
c-4.4-0.3-4.1-1.1-6.1-4.1C750.7,261.1,748.3,257,744.8,255.3z"/>
|
||||
<path opacity="0.3" fill="#C47826" d="M731.5,246.1c0.4,0.9,1.4,2.3,1,3.2c-6.6-7.7-16.1-9.9-25.9-7.8c-2.8,0.6-3.9,2.8-6.8,2
|
||||
c-4-1.1-7.9-2-12.1-1.6c-5.8,0.5-11.2,3.6-15.2,7.6c1.3-5.8,5.4-8.7,10.1-11.6c2.7-1.7,5.8-2.6,9-2.9c2.5-0.2,5.3-0.6,7.8-0.3
|
||||
c2.4,0.3,4.2,1.3,6.6,0.8c2.5-0.5,5.2-0.7,7.8-0.5c4.9,0.4,10.5,2.4,13.6,6.3C728.6,242.9,730.6,244.4,731.5,246.1z"/>
|
||||
<path opacity="0.3" fill="#C47826" d="M616.2,322.7c2.7,0,5.8,0.2,6.7,3.1c0.5,1.8,0.5,4.3,2,5.8c1.5,1.4,4.9-0.4,5.9,1.7
|
||||
c0.8,1.6-1.9,3.5-3.1,4.3c-1.5,0.9-2.5,0.8-4.1,0.6c0.9,1.3,3.5,1,4,2.2c0.9,2-4.4,2.7-5.5,2.9c-4,0.8-8.2,1.1-11.7,3.3
|
||||
c4.4-0.1,8.7-1,13-1.2c3.1-0.1,6.1,0,9.2-0.1c2.5-0.1,4.7-0.7,7.1-1c2.3-0.4,5.3,0,6.2-2.6c0.6-1.6,0.3-3.5-0.5-4.9
|
||||
c-0.9-1.8-2-1.8-3.9-1.7c-0.9,0-2.3,0.8-3.1,0.5c-1.4-0.5-2.7-3.9-3.8-5c-1.2-1.2-2.8-1.2-4.3-1c-2,0.3-1.7,0.1-2.9-1.7
|
||||
c-1.1-1.6-3.1-4-4.9-4.7c-2.1-0.9-5.6-1.7-7.4,0c0.8,0,1.7-0.4,2.5-0.1"/>
|
||||
<path opacity="0.3" fill="#C47826" d="M357.5,115.2c7.3-0.6,13,3.6,18,8.3c5.3,5,3.4,9,3.2,15.5c5.2,0.2,16.1,2.7,10,10.1
|
||||
c-4.6,5.5-11.1,3.2-16.4,1.1c4.7,3.1-4.7,7.9-7.2,9c-5.6,2.4-12.2,2.8-18.1,3.5c-5.7,0.7-11.7-0.5-17.4-1.1
|
||||
c-5.8-0.6-11-0.7-16.3-3.5c-2.7-1.5-6.1-2.8-7.9-5.4c-1.1-1.6-0.8-4.2-2.4-5.2c-2.4-1.6-8.7-1-11.5-0.2c-3.5,1-7.1,3.5-7.6,7.3
|
||||
c-2.4,17.9,26.2,11.1,35.2,12.2c14.2,1.8,28.9-0.3,43.1,0.3c4.1,0.2,10.9,1.1,14.7,0.3c4-0.9,5.4-6.8,9.2-8.9
|
||||
c9.9-5.5,22.3-4.2,33.1-6.1c6.2-1.1,1.6-5.9-2.4-6.8c-1.9-0.4-4-0.7-6-0.2c-5.8,1.5-2.8-1.2-6-5.1c-2.2-2.6-6.5-7.4-10.2-7.7
|
||||
c-2.6-0.2-5,1.6-7.2-0.3c-2.3-1.9-2.2-6.2-3.9-8.6c-1.7-2.4-4.5-5.7-6.8-7.6c-6.3-5.3-13.6-2.1-20.6-0.8c-0.1,0.4,0.2,0.4,0.2,0.8"
|
||||
/>
|
||||
<path opacity="0.3" fill="#C47826" d="M658.7,426.7c-0.4-0.1-1.3-2.1-1.6-2.5c-1-1.2-1.9-1.7-3.5-1.3c0.9,0.5,2.5,0.8,2.7,2.1
|
||||
c0.2,1.6-1.2,1.7-2.4,2c2.2,1.4-3.4,2-4,2.1c-1.5,0.2-3.8-1.4-3.8-3.2c-1,0.1-1.2,0.8-2,1.2c-0.8,0.4-1.8,0.1-2.6,0.5
|
||||
c-1.8,0.8-0.5,2.6,0.8,3.4c1.3,0.7,3,0.3,4.4,0.3c2,0,4,0.1,6,0.4c1.4,0.2,2.6,0.7,4.1,0.8c1.6,0.1,3.1,0.2,4.6,0.4
|
||||
C662.2,430.2,661.9,427.1,658.7,426.7z"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M291.8,561.5c1.1,0,0.4,3.1,1.3,5.3"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M293.8,573.5c1.2,0.7,1.6,1.9,1.3,3.3"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="298" y1="566" x2="298" y2="570"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M571.8,562.1c0.1,3.2-0.4,6.2-0.7,9.3"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="566" y1="559" x2="566" y2="562"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M565.1,572.8c-0.1,1.8-0.3,3.6-0.7,5.3"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M510.4,694.1c3.1,2.4,7.4,2.4,10.7,4.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M517.1,691.5c-0.1,0.5,0.2,0.7,0.7,0.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M521.1,693.5c0.6,0.5,1.2,0.7,2,0.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M351.8,690.1c-0.6,1.3-1.9,2.3-3.3,2.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M357.8,693.5c-3.2,1.7-6.7,3.2-10,4.7"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="340" y1="696" x2="342" y2="696"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M304.4,713.5c2.8-6,7.2-18.7,14.7-20"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M559.8,713.5c-1.7-7.4-6.1-17-12.7-21.3"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M488,585.1c10.1,1.2,17.1-2.9,21.3-11.7c13.8,0.8,17.7-6.1,22.2-18.3"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M348.5,571.6c1.9,5.1,7.5,7.8,13.5,7.5"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M509,190.6c-5-3.7-12.8-1.7-13.8,5.8c-5.1-2.3-11.2-4.8-16.2,0.2"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M353,190.6c3.7-1.6,7.8-2,11.7-1.2c3.7,11.3,19.6-11.8,24.3,2.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M414.5,180.1c0-1.3,2.7-4,7.5-4.2c7.3-0.2,6.7,4.6,10.8,5.4c7.7,1.6,17.6-5.6,23.7,3.2"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M485,244.6c6.1-2.2,10.3-5.5,17.7-4.8c0.2-0.8,0.3-1.7,0.5-2.5c7.2,1,9.8-4.9,10.2-10.8"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M345.5,219.1c0.1,8.3,9.8,16.6,17.7,12.1c-1.7,11.8,9.6,12.2,18.3,11.8"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M401,228.1c12.7,10,28,18.1,44.7,9.2c4.3,10.1,22.6,3.4,25.8-4.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M413,210.1c5.5-2.3,11.8-1.5,18-1.5"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M487.9,175.8c-2.7-0.3-3,1.7-4.7,3c-1.5,1.2-4.6,0.2-5.4,1.2"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M447.8,155.6c-2.7-0.5-2.5,3-2.5,4.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M380,174.1c1.8,1.3,10.1,0.1,12.3,5.7c2.2,0.3,5,0.6,7.2,0.3"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M571.4,261.4c1.8-1.5,4.9-4.2,5.7-6.6"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M579.7,250.3c1.1-1.3,2-3.1,2-4.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M571.1,254.6c1.1-0.4,2.7-1.5,3.2-2.5"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M543.1,228.1c0.6,0.2,1.3,0.3,2,0.2"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M581.1,210c1.1-0.5,2.6-0.7,3.8-0.2"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M286.9,253.5c1.9,2.6,4.3,6.2,7,8"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M288.9,248.5c0.4,0.8,1.2,1.5,2,2"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M294.4,256c0.8,0.2,1.7,0.3,2.5,0.5"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M278.4,210.5c-2.2,0.8-2.8,4.2-2.5,6.5"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M311.9,229.5c1.2,0.7,3.2,0.5,5,0.5"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="322" y1="228" x2="324" y2="228"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="316" y1="233" x2="317" y2="233"/>
|
||||
<path fill="none" d="M575.8,449.5c0,0,2.9-2,3.6-3"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M569.2,464.5c-0.8,1.1-1.4,2.2-1.8,3.6"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M617.2,457.3c3.7,18.6-2.9,38.5-15.6,52.2"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M575.4,447.8c1.3-2.5,3.4-4.4,4.6-6.9"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M584.6,435.7c1.8-2.1,3-4.8,3.5-7.5"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M577.7,435.7c0.7-0.8,1.3-1.8,1.7-2.9"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M533.4,241.8c0,0.2,1,1.2,2.3,1.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M532.2,248.1c0.2,0.4,0.4,0.7,0.6,1.2"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M539.7,246.4c2.7,0.4,5.2,2.3,7.5,4"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M325.1,240.7c-1.7,0.8-3.5,1.7-4,3.5"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M323.4,247.6c1.2-0.9,2.6-1.6,4-1.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M314.7,253.3c0.3-0.7,0.9-1.1,1.7-1.2"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M425.8,342.5c2,0.9,5.8,0.9,7.5,0"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M438.4,341.9c1.6,0.2,3.1,0,4.6-0.6"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="432" y1="336" x2="436" y2="336"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M276.2,430.5c0.1,2.5,2,4.9,3.5,6.3"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M283.1,442.6c0.3,1.5,1.3,2.8,2.9,3.5"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M282.5,434c0,0.8,0.4,1.5,1.2,1.7"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="276" y1="264" x2="277" y2="264"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="280" y1="264" x2="281" y2="264"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="278" y1="269" x2="280" y2="269"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M581.1,264.8c1,0.1,2-0.1,2.9-0.6"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="579" y1="270" x2="581" y2="270"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="588" y1="268" x2="589" y2="268"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M604.5,522.3c0.5,0.2,1,0.7,1.3,1.1"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M608.4,525.6c0.5,0.5,1.1,0.9,1.6,1.3"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M604.8,525.4c0.5,0.1,0.9,0.4,1.3,0.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M618.7,560.8c0.5,0.2,1,0.3,1.5,0.5"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="623" y1="562" x2="625" y2="562"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M630.1,545.9c1.2,0.7,2.3,2.1,3,3"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M228.5,549.8c0.7-0.8,1.8-1.6,3-2"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="238" y1="565" x2="240" y2="565"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M241.9,565.2c-0.4-0.4,0.3-0.5,1-0.5"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="239" y1="562" x2="241" y2="562"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M322.4,660.5c2.9,6.9,11.8,11.9,19,13"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M330.4,660.5c0.5,0.7,1.2,1,2,1"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="338" y1="665" x2="341" y2="665"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M415.4,680.5c8.2,0,21.6-2.4,28,1"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M514.4,673.5c4.8,0.7,8.8-2.2,13-4"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M535.4,665.5c1.3-0.8,2.6-1.4,4-2"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M526.4,661.5c1.9-0.1,3.3-0.4,5-1"/>
|
||||
|
||||
<circle fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" cx="435.4" cy="532" r="3.2"/>
|
||||
<path fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M435.4,520.2
|
||||
c0,0,3.2,4.8,3.2,11.4"/>
|
||||
<path fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M435.4,520.2
|
||||
c0,0-3.2,4.9-3.2,11.5"/>
|
||||
<path fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M436.6,518.5
|
||||
c0.2,0.4,0.7,1.8,1.1,2.8c0.4,1.1,0.9,2.2,1.3,3.3c1,2.8,2.2,6.2,1.4,9.2c-0.5,1.9-2.1,2.7-3.9,2.9c-2.1,0.3-5.2,0.2-6.4-1.8
|
||||
c-0.9-1.5-0.8-3.5-0.5-5.2c0.3-1.7,0.8-3.4,1.4-5.1c0.4-1.1,0.9-2.2,1.3-3.3c0.5-1.1,1-2.2,1.5-3.3"/>
|
||||
<path fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M433.2,512.6
|
||||
c0,0-4.1,4-1.2,9.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M437,512.6
|
||||
c0,0,4,4.1,1.1,9.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M433.9,512.9
|
||||
c0,0-1.7,3.9,1.6,7.3"/>
|
||||
<path fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M437,512.9
|
||||
c0,0,1.7,3.9-1.6,7.3"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="431.2" y1="536" x2="430.9" y2="639.5"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="439.2" y1="535.7" x2="439.4" y2="639.5"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M479,529.6c7.3-11.8,17.8-9.6,29.8-12.2c1.1-12.7,13.7-21.7,25.4-16.4c2.1-8.8,10.1-13.9,18.3-10.3"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M273.5,483.1c6.6-1.4,18.7-5.7,25.6-3c8.5,3.4,7.8,11.6,15,15.1c4.5,2.3,13.1-2,19.8,2.5c7.2,4.8,11.4,10.9,11.9,19.6
|
||||
c13.4,0.2,34.9-0.2,37.2,16.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M285.5,525.1c7.6,8.7,22.4,21.2,36,11.9c6.4,6.5,14.9,10.2,24,10.6"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M398.4,549.5c0.3,8.1-2,12.8,5.8,16.5c-3.8,10.5,3.8,15.5,14.2,15.5"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M476.4,545.5c2,11.4-4.8,19.2-16.3,20.1c10.5,3.5,9.7,16.9-2.9,22.4c5.8,8.1,1.6,10.7-2.8,17.5"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M245,472.6c-3.3-5.5-2.3-12.2,4.2-15.3c-2.7-6.3-1-10.2,3.3-14.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M542.4,531.5c11.1,1.5,30.3-8.1,30-24"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M285.5,205v-5.4c0-17.4-27-26.5-27-26.5l-55.8,3.1l-20.4,10.3H127l-23.9,14.8c-23.5,0-24.2,15.5-24.2,15.5s0,87.9,0,87.9
|
||||
c-11.3,2.5-23.2,0.2-24.1,13.6c-0.2,3.5,0.2,7.2,0.3,10.8c0.5,11.6,1.4,23.1,2.1,34.7c1.7,27.6,3.4,55.2,5.1,82.8
|
||||
c0.1,1.1,0.4,1.9,0.5,3"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M230.5,174v31.6c0,0-21,0-21,5.3c0,5.3,0,28.8,0,28.8V398"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="182.5" y1="187" x2="182.5" y2="334"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M154.5,242v54.4c0,0-13.7-3-13.7,25.7c0,0-7.3-3-7.3,12.1V419"/>
|
||||
|
||||
<polyline fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
|
||||
102.5,201 102.5,276 98.3,282.9 100.4,330.5 "/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="78.5" y1="461" x2="78.5" y2="555"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="111.5" y1="406" x2="111.5" y2="423"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="249.5" y1="215" x2="249.5" y2="342"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="182.5" y1="394" x2="182.5" y2="647"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M618.4,528.1l44.6-31.6v-86.2l3-2.8v-9.7c0-7.7,11.9-11.7,11.9-11.7l24.6,1.4l9,4.5h24.3l10,6.5c10.3,0,10.2,6.9,10.2,6.9v38.7
|
||||
l11,2.3v6.7l6,3.3v-26l2-5V410h7.4l1.5,6.7l3,5.8v9l-3,7v21l4,7v32.7l25.1,20.9H659"/>
|
||||
|
||||
<polyline fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
|
||||
665.8,407.1 679,417.8 679,453 "/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M681.1,386.6l0.8,13.7c0,0,9.1,0.1,9.1,2.5c0,2.3,0,12.7,0,12.7v9.5"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="711" y1="392" x2="711" y2="457"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M723,416v24.5c0,0,6.4-1.3,6.4,11.3c0,0,3.6-1.3,3.6,5.3V494"/>
|
||||
|
||||
<polyline fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
|
||||
746,398 746,431.5 748.1,434.5 747.1,455.2 "/>
|
||||
|
||||
<polyline fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
|
||||
772.8,456.4 777,462 777,483 "/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="766" y1="480" x2="766" y2="494"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="757" y1="453" x2="757" y2="494"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="742" y1="488" x2="742" y2="496"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="670" y1="467" x2="670" y2="496"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="691" y1="442" x2="691" y2="496"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="711" y1="483" x2="711" y2="496"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="663" y1="497" x2="773" y2="497"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M628.8,538.8c0.6-0.6,180.6,0,180.6,0"/>
|
||||
|
||||
<polyline fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
|
||||
553.4,658.4 602.3,664.8 627.5,690 627.5,709 "/>
|
||||
|
||||
<polyline fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
|
||||
273.7,749.1 252.9,675.5 307.6,673.3 "/>
|
||||
<path fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M253.3,675.5c3.2,0,50.2,54.6,50.2,54.6v24.4l-29.4-5.4"/>
|
||||
|
||||
<polyline fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
|
||||
303,754.5 441.4,754.5 627.2,709 "/>
|
||||
|
||||
<polyline fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
|
||||
395.3,717.7 344.9,723.9 302.9,730.1 "/>
|
||||
|
||||
<polyline fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
|
||||
543.9,729.8 412.7,730 399.5,716.8 395.3,717.7 "/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="399.5" y1="716.8" x2="390.1" y2="755"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="412.7" y1="730" x2="412.4" y2="755"/>
|
||||
|
||||
<polyline fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
|
||||
764.8,648.5 641.7,606.8 574.8,596.1 "/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="297.1" y1="624.2" x2="125.2" y2="658.6"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M705.5,234.9c0-0.2,0.7-0.4,1.4-0.5c2.6-0.4,5.1-0.4,7.7,0c4.1,0.6,7.9,2.2,11.1,4.8c4.6,3.7,7.4,9.1,9,14.7c0,0,17.3-3,19.2,14
|
||||
c6.3,0,15.6-1.2,18.1,6.5c2.2,6.8-1.9,11.1-7,12.9c-2.2,0.8-4.6,1.2-6.7,1.1c-12.3-0.3-24.6-0.2-36.9,0c-21.3-0.2-54.4-0.6-75.7,0
|
||||
c-2.2,0.1-4.5-0.3-6.7-1.1c-5.1-1.9-9.2-6.1-7-12.9c2.5-7.6,11.8-6.5,18.1-6.5c1.9-17,19.8-14,19.8-14
|
||||
C677.1,229.4,705.5,234.9,705.5,234.9L705.5,234.9z"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M670.4,271.7c3.4,2.3,6.9,4.2,11.3,3.5c1.6-0.3,3.2-1.9,4.7-2.1c1.4-0.1,0.8,0.1,2,0.5c1.9,0.6,3.6,2.2,5.7,2.8
|
||||
c2.9,0.8,6.2,1,9.2,0.8c4.7-0.4,12.7-1.7,16.1-4.9c2.9,1.9,4.8,4.5,8.6,5.2c5.1,1,10.8-1.1,15.1-2.5"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M380.7,167.5c-0.7,0-5.5,0-6.3,0c-21.3-0.2-54.4-0.6-75.7,0c-2.2,0.1-4.5-0.3-6.7-1.1c-5.1-1.9-9.2-6.1-7-12.9
|
||||
c2.5-7.6,11.8-6.5,18.1-6.5c1.9-17,19.8-14,19.8-14c7.2-24.6,35.6-19,35.6-19v0c0-0.2,0.7-0.4,1.4-0.5c2.6-0.4,5.1-0.4,7.7,0
|
||||
c4.1,0.6,7.9,2.2,11.1,4.8c4.6,3.7,7.4,9.1,9,14.7c0,0,17.3-3,19.2,14c7.1-3.8,12.9-0.8,16.2,3.4"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M323.4,150.7c3.4,2.3,6.9,4.2,11.3,3.5c1.6-0.3,3.2-1.9,4.7-2.1c1.4-0.1,0.8,0.1,2,0.5c1.9,0.6,3.6,2.2,5.7,2.8
|
||||
c2.9,0.8,6.2,1,9.2,0.8c4.7-0.4,12.7-1.7,16.1-4.9c2.9,1.9,4.8,4.5,8.6,5.2c2.5,0.5,8.7,0.9,11.2,0.4"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M599.3,332.3c2.3-11.3,15-9.9,15-9.9h0c0-0.1,0.4-0.2,0.8-0.3c1.2-0.3,2.3-0.4,3.5-0.3c1.9,0.1,3.6,0.7,5.2,1.7
|
||||
c2.2,1.5,3.7,3.8,4.6,6.2c0,0,7.6-2,9.1,5.5c2.8-0.2,6.9-1.1,8.3,2.2c1.3,3-0.4,5-2.6,6.1c-0.9,0.4-2,0.7-3,0.8
|
||||
c-5.5,0.3-11,0.9-16.5,1.4c-6,0.5-14.1,1.1-21.6,1.7"/>
|
||||
|
||||
<path fill="none" stroke="#211915" stroke-width="1.3466" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M601.3,340.2c1.6,0.9,3.2,1.6,5.2,1.1c0.7-0.2,1.4-1,2-1.1c0.6-0.1,0.4,0,0.9,0.1c0.9,0.2,1.7,0.8,2.7,1c1.4,0.3,2.8,0.2,4.1,0
|
||||
c2.1-0.3,5.6-1.3,7-2.8c1.4,0.7,2.3,1.8,4.1,2c2.3,0.2,4.8-0.9,6.6-1.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M661.5,433
|
||||
c-1.9-0.2-3.7-0.4-5.6-0.6c-3.7-0.4-9.4-1.1-13.1-1.4c-0.4,0-0.8-0.1-1.1-0.3c-0.9-0.4-1.5-1.2-1-2.4c0.6-1.3,2.2-0.9,3.3-0.8
|
||||
c0.6-2.9,3.6-2.1,3.6-2.1c1.7-4.1,6.5-2.6,6.5-2.6l0,0c0,0,0.2-0.1,0.3-0.1c0.5,0,0.9,0,1.4,0.2c0.7,0.2,1.3,0.5,1.8,1
|
||||
c0.7,0.7,1.1,1.7,1.3,2.7c0,0,2.2-0.1,2.9,1.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M647.4,428.5c0.5,0.5,1.1,0.9,1.9,0.8c0.3,0,0.6-0.3,0.9-0.3c0.2,0,0.1,0,0.3,0.1c0.3,0.1,0.6,0.4,0.9,0.6c0.5,0.2,1,0.3,1.6,0.3
|
||||
c0.8,0,2.2-0.1,2.9-0.6c0.5,0.4,0.8,0.9,1.4,1.1c0.9,0.3,1.9,0,2.7-0.2"/>
|
||||
<path fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M762.5,559v-6.2
|
||||
c0,0-2.6-0.1-2.9-2.1c0,0-0.3-1.7,0.4-2.1c0,0,0.7-0.5,0.7,2c0,0,0.4,0.9,1,0.9l0-6.4c0,0,0.4-1.1,1.3-1.1c0,0,1.4-0.2,1.4,0.9
|
||||
c0,0,0,9.1,0,9.1c0,0.1,0.6-0.5,0.7-0.7c0.2-0.3-0.1-0.8,0-1.2c0-0.6-0.1-2.8,0.4-2.9c0.7-0.2,0.8,1.1,0.9,1.6
|
||||
c0.1,1.2,0.2,2.6-0.7,3.6c-0.1,0.2-1.3,1-1.3,0.9c0,0,0,3.7,0,3.7"/>
|
||||
|
||||
<path fill="none" stroke="#211915" stroke-width="0.7513" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M759.1,559.8c0.6,0,1.4,0.2,1.9,0.1c0.5-0.1,0.8-0.4,1.4-0.4c1.5,0.1,3.1,0.2,4.6,0.3c0.8,0.1,1.9-0.1,2.7,0"/>
|
||||
<path fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M754.5,626v-6.2
|
||||
c0,0-2.6-0.1-2.9-2.1c0,0-0.3-1.7,0.4-2.1c0,0,0.7-0.5,0.7,2c0,0,0.4,0.9,1,0.9l0-6.4c0,0,0.4-1.1,1.3-1.1c0,0,1.4-0.2,1.4,0.9
|
||||
c0,0,0,9.1,0,9.1c0,0.1,0.6-0.5,0.7-0.7c0.2-0.3-0.1-0.8,0-1.2c0-0.6-0.1-2.8,0.4-2.9c0.7-0.2,0.8,1.1,0.9,1.6
|
||||
c0.1,1.2,0.2,2.6-0.7,3.6c-0.1,0.2-1.3,1-1.3,0.9c0,0,0,3.7,0,3.7"/>
|
||||
|
||||
<path fill="none" stroke="#211915" stroke-width="0.7513" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M751.1,626.8c0.6,0,1.4,0.2,1.9,0.1c0.5-0.1,0.8-0.4,1.4-0.4c1.5,0.1,3.1,0.2,4.6,0.3c0.8,0.1,1.9-0.1,2.7,0"/>
|
||||
<path fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M676.5,564v-6.2
|
||||
c0,0,2-0.1,2.2-2.1c0,0,0-1.7-0.7-2.1c0,0-0.9-0.5-0.9,2c0,0-0.4,0.9-1,0.9l-0.1-6.4c0,0,0.2-1.1-0.6-1.1c0,0-0.8-0.2-0.8,0.9
|
||||
c0,0,0,9.1,0,9.1c0,0.1-1.3-0.5-1.4-0.7c-0.2-0.3-0.3-0.8-0.3-1.2c0-0.6,0-2.8-0.6-2.9c-0.7-0.2-0.9,1.1-1,1.6
|
||||
c-0.1,1.2,0.5,2.6,1.3,3.6c0.1,0.2,1.9,1,1.9,0.9c0,0,0,3.7,0,3.7"/>
|
||||
|
||||
<path fill="none" stroke="#211915" stroke-width="0.7513" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M678.6,564.8c-0.6,0-1.4,0.2-1.9,0.1c-0.5-0.1-0.8-0.4-1.4-0.4c-1.5,0.1-3.1,0.2-4.6,0.3c-0.8,0.1-1.9-0.1-2.7,0"/>
|
||||
<path fill="none" stroke="#211915" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M593.5,590v-6.2
|
||||
c0,0,2-0.1,2.2-2.1c0,0,0-1.7-0.7-2.1c0,0-0.9-0.5-0.9,2c0,0-0.4,0.9-1,0.9l-0.1-6.4c0,0,0.2-1.1-0.6-1.1c0,0-0.8-0.2-0.8,0.9
|
||||
c0,0,0,9.1,0,9.1c0,0.1-1.3-0.5-1.4-0.7c-0.2-0.3-0.3-0.8-0.3-1.2c0-0.6,0-2.8-0.6-2.9c-0.7-0.2-0.9,1.1-1,1.6
|
||||
c-0.1,1.2,0.5,2.6,1.3,3.6c0.1,0.2,1.9,1,1.9,0.9c0,0,0,3.7,0,3.7"/>
|
||||
|
||||
<path fill="none" stroke="#211915" stroke-width="0.7513" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M595.6,590.8c-0.6,0-1.4,0.2-1.9,0.1c-0.5-0.1-0.8-0.4-1.4-0.4c-1.5,0.1-3.1,0.2-4.6,0.3c-0.8,0.1-1.9-0.1-2.7,0"/>
|
||||
|
||||
<polygon fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
|
||||
706.4,665 685.4,665 680.8,691 693.6,690.9 722.3,673.4 "/>
|
||||
|
||||
<polyline fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
|
||||
686.4,666 699,680 719.9,674.8 "/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="699" y1="680" x2="697.1" y2="688.8"/>
|
||||
|
||||
<line fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="601.8" y1="664.9" x2="560.5" y2="725.8"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M136.4,187l-0.5-19.8c0,0-7.2-0.3-7.9-6.3c0,0-0.7-5.3,1.6-6.3c0,0,2.4-1.5,2.4,5.9c0,0,1.2,2.6,3,2.6l0.2-19.4
|
||||
c0,0,0.7-3.2,3.2-3.2c0,0,3.6-0.7,3.6,2.7c0,0,0,27.4,0,27.6c0,0.2,2.6-1.6,2.8-2c0.6-1,0.2-2.4,0.2-3.5c0.1-1.8-0.2-8.4,1.4-8.8
|
||||
c2.2-0.6,2.6,3.2,2.7,4.8c0.3,3.5-0.2,8-2.6,10.9c-0.4,0.5-4.7,3.1-4.7,2.7c0,0-0.8,11.9-0.8,11.9"/>
|
||||
<ellipse transform="matrix(0.128 -0.9918 0.9918 0.128 -74.1595 701.2955)" cx="361.7" cy="392.8" rx="14.3" ry="14.3"/>
|
||||
<ellipse transform="matrix(0.128 -0.9918 0.9918 0.128 45.52 835.4486)" cx="497.8" cy="391.8" rx="14.3" ry="14.3"/>
|
||||
<path d="M438.1,441.2c-5.7,0.6-12.5-0.3-15.2-1.8c-1.6-0.9-3.2-2-4.1-3.5c-2.6-4.1,3-6.4,6.5-7.4c3.2-0.9,6.4-1.1,9.7-0.8
|
||||
c2.7,0.2,5.3,0.7,7.7,1.8c2.4,1.1,3.6,1.6,4.3,3.9C448.5,438.4,443.8,440.6,438.1,441.2z"/>
|
||||
|
||||
<ellipse transform="matrix(0.128 -0.9918 0.9918 0.128 45.5048 835.4331)" fill="none" stroke="#000000" stroke-width="3.6235" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" cx="497.8" cy="391.8" rx="49" ry="49"/>
|
||||
|
||||
<ellipse transform="matrix(0.128 -0.9918 0.9918 0.128 -72.0028 704.4983)" fill="none" stroke="#000000" stroke-width="3.6235" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" cx="364.6" cy="393.2" rx="49" ry="49"/>
|
||||
<ellipse transform="matrix(0.128 -0.9918 0.9918 0.128 -74.1595 701.2955)" cx="361.7" cy="392.8" rx="14.3" ry="14.3"/>
|
||||
<ellipse transform="matrix(0.128 -0.9918 0.9918 0.128 45.52 835.4486)" cx="497.8" cy="391.8" rx="14.3" ry="14.3"/>
|
||||
<ellipse transform="matrix(0.1279 -0.9918 0.9918 0.1279 -5.0822 559.8978)" cx="315.8" cy="282.8" rx="7.1" ry="7.1"/>
|
||||
|
||||
<ellipse transform="matrix(0.128 -0.9918 0.9918 0.128 7.9834 574.7572)" fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" cx="330.8" cy="282.8" rx="24.3" ry="24.3"/>
|
||||
|
||||
<path fill="none" stroke="#000000" stroke-width="3.6235" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M405.8,440c4.4-2.8,10.1-6,15.5-5.8c5.1,0.1,10.2,1.1,15.3,1.6c4.8,0.5,9.3,0.3,14,1.9c4.7,1.6,9.2,4.4,12.5,8.2
|
||||
c3.8,4.3,2.1,11.3-3,14.7c-9.6,6.3-18.6-4.7-28.5-4.1c-9.5,0.5-17.6,9.9-27.2,2.6C398,454.3,400,443.7,405.8,440z"/>
|
||||
|
||||
<path fill="none" stroke="#000000" stroke-width="3.6235" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M431.8,458c-0.3,3.9-0.5,9.8,0,11.9c1,3.6,5.5,3.8,10.6,3.4c6.1-0.5,5-4.5,5-5.7c0-0.8-0.4-4.6-0.3-5.5"/>
|
||||
|
||||
<path fill="none" stroke="#000000" stroke-width="3.6235" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M412.4,462.5c-0.3,3.9-0.3,5.8,0.2,7.9c1,3.6,5.5,3.8,10.6,3.4c6.1-0.5,7.7-1.3,7.7-2.8c0-1,0.5-12.1,0.6-13"/>
|
||||
|
||||
<path fill="none" stroke="#000000" stroke-width="3.6235" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M438.1,441.2c-5.7,0.6-12.5-0.3-15.2-1.8c-1.6-0.9-3.2-2-4.1-3.5c-2.6-4.1,3-6.4,6.5-7.4c3.2-0.9,6.4-1.1,9.7-0.8
|
||||
c2.7,0.2,5.3,0.7,7.7,1.8c2.4,1.1,3.6,1.6,4.3,3.9C448.5,438.4,443.8,440.6,438.1,441.2z"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M261,410.5c-3.1-12.4-4.1-25.4-2.9-37.2c2.6-24.3,12.9-46.9,21.9-69.3c11.1-27.8,25.4-58,52.2-73.8"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M330.9,222c-10.2,2.1-22.6,3.5-32-2.4c-6.5-4.1-11.5-18.1-20.6-15.8c-7.2,1.8-7.7,14-7.4,19.5c0.6,10.5,3.9,20.8,9,30
|
||||
c2.6,4.7,8.9,16.6,14.2,18.3"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M286,546.9c-2.6,33.1,6.4,70.2,20.1,100.1c6,13.2,15.1,24.5,28.5,30.6c21.6,9.8,46.8,10.5,70.1,11.8c9.1,0.5,21,1.2,29.2,1.4"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M259.4,518.3c-6.9,4.3-17,12.7-21.8,17.4c-2.6,2.6-11.7,10.6-13,14.2c-2.5,6.8,7.5,2.4,8.8,8.5c1.5,6.9-5.1,11,5.3,10.7
|
||||
c5.8-0.2,11.4-2.1,16.7-4.1c8.7-3.2,20.5-5.3,30.2-10.6"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M317.5,664.9c-8.3,6.8-16.6,13.6-20.8,23.6c-5,11.8-0.9,27.8,13.1,28.6c9.8,0.5,27-6.3,35.6-10.5c8.8-4.3,23.5-13.1,31.8-18.9"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M283.3,259c-6.4,0-28.9,8-30.7,14.9c-3.2,12.2,24.7,15.7,32.6,17.2"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M234.4,538.8c6.3,2.1,10.2,8.2,12.3,12.6c2.2,4.7,3,10.8,0.9,16.2"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M628.8,538.8c-6.3,2.1-10.2,8.2-12.3,12.6c-2.2,4.7-3,10.8-0.9,16.2"/>
|
||||
<ellipse transform="matrix(0.9918 -0.1279 0.1279 0.9918 -31.6962 72.2437)" cx="546.5" cy="282.8" rx="7.1" ry="7.1"/>
|
||||
|
||||
<ellipse transform="matrix(0.9918 -0.128 0.128 0.9918 -31.8144 70.6109)" fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" cx="533.5" cy="282.8" rx="24.3" ry="24.3"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M476.3,312.8c77.4-0.2,109,83,89.2,149.3"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M388.3,313.8c-77.4-0.2-109,83-89.2,149.3"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M432.7,288.4c9.9-0.2,20.7-0.6,29.5,3.5c10.5,4.9,17.9,23.8,13,34.9c-4.8,11-16.3,17-27.5,19.7c-18.9,4.5-49.7,0.8-58.7-19.7
|
||||
c-4.9-11.1,2.5-30,13-34.9C411.1,287.7,422.6,288.1,432.7,288.4"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M532.2,230.2c24.2,14.3,33.4,34.7,45.8,58c20.4,38.4,34.4,73.7,24.8,118.8"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M533.5,222.1c10.2,2.1,22.6,3.5,32-2.3c6.5-4.1,11.6-18.1,20.6-15.8c7.2,1.8,7.7,14,7.3,19.6c-0.6,10.5-4,20.7-9,30
|
||||
c-2.6,4.7-9.7,17.1-15,18.7"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M578.3,546.9c2.6,33.1-6.4,70.2-20.1,100.1c-6,13.2-15.1,24.5-28.5,30.6c-21.6,9.8-46.8,10.5-70.1,11.8c-9.1,0.5-17.4,1.2-25.7,1.4
|
||||
"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M604.9,518.3c6.9,4.3,17,12.7,21.8,17.4c2.6,2.6,11.7,10.6,13,14.2c2.5,6.8-7.5,2.4-8.8,8.5c-1.5,6.9,5.1,11-5.3,10.7
|
||||
c-5.8-0.2-11.4-2.1-16.7-4.1c-8.7-3.2-20.5-5.3-30.2-10.6"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M546.8,664.9c8.3,6.8,16.6,13.6,20.8,23.6c5,11.8,0.9,27.8-13.1,28.6c-9.8,0.5-27-6.3-35.6-10.5c-8.8-4.3-23.5-13.1-31.8-18.9"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M581,259.2c6.4,0,28.9,8.1,30.6,15c3.2,12.2-24.5,14.1-32.4,15.6"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="5" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M294.8,462.1c27.8-1.2,51.6,19.5,64.3,42l-7-10.7c14.2-2.2,32.2,4.7,41.5,16c10.4-3,16.9,0.6,20.6,5.3c10.2-6.8,25.1-3.8,35,0
|
||||
c3.6-5,10.5-8.4,21.4-5.3c9.3-11.4,27.3-18.2,41.5-16l-7,10.7c12.7-22.6,36.5-43.3,64.3-42c18.5-14.8,29.8-30.7,33-54.6l-0.5,3
|
||||
c31.9-6.5,36.9,118.6-6.8,107.6l3.5,0.6c-1.8,22.1-31.5,38.1-51.5,37.4l3.2,0.1c-5.7,28.7-35.4,46.9-59.5,42.9
|
||||
c0,0.6-3.7,8.1-13,7.7c-7.4-0.3-3.8-6.7-7.3-10.7c-0.2,2.7-3.1,10.9-6.7,11.8c-3.7,0.9-3.9,1.4-12.4-0.9
|
||||
c-0.7,11.1-7.6,27.4-16.7,34.5c-8.2-5.6-18-24.8-20.4-34.8c-4.6,3.2-7.8,3.6-12.1,0.1c-2.4-1.9-8.3-8.2-8.5-10.8
|
||||
c-3.5,4,0,10.4-7.3,10.7c-4.5,0.2-9.9-5.7-10-10c-26.2-1.2-56.8-11.9-62.6-40.6l3.2-0.1c-20,0.7-49.7-15.3-51.5-37.4l3.5-0.6
|
||||
c-43.7,11-40-114.1-8.1-107.6c2.3,9.1,5.7,17.9,10.3,25.5C277.3,446.1,285.6,454.7,294.8,462.1z"/>
|
||||
|
||||
<path fill="none" stroke="#211915" stroke-width="2.8817" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M168.3,187c69-71.8,166-116.4,273.4-116.4C651.2,70.5,821,240.3,821,449.8C821,659.2,651.2,829,441.7,829
|
||||
C232.3,829,62.5,659.2,62.5,449.8"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="5" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M508.6,255.4c0,1.2-0.3,2.8-0.5,4.2c-0.4,2.9-1.4,5.7-2.2,8.5c5.9-6.6,12.4-10.7,16.5-19.3c4.6-9.6,11.1-15.9,11.1-26.7
|
||||
c-0.9-11.9-7-31.3-22.1-31.3c-4.4-9.4-17-17.2-24.2-15.5c-0.9-15.8-22.3-25.7-38.8-21.3l-0.1,0c-8.3-6.8-20.1-8.6-31.2,0
|
||||
c-16.7-4.5-38.2,5.6-38.6,21.7c-6.9-2.6-20.9,5.2-25.5,15c-15.1,0-21.2,19.4-22.1,31.3c0,10.8,6.5,17.1,11.1,26.7
|
||||
c4.1,8.7,10.6,12.8,16.5,19.3c-0.8-2.7-1.8-5.6-2.2-8.5c-0.2-1.4-0.5-3-0.5-4.2l0,0.1c3.2,6.8,3.4,12.8,9.5,17.8
|
||||
c5.4,4.5,12,6.4,17.9,8.8c-1.2-2-2.4-10,0-13.3c1.4,7,20.1,16.5,27.3,15.3c-1.2,0-1.3-8.5-1.3-11.3c6.4,0,16.9,6.7,23.1,10.2
|
||||
c6.2-3.5,16.6-10.3,23.1-10.2c0,2.8-0.1,11.4-1.3,11.3c7.3,1.1,25.9-8.3,27.3-15.3c2.4,3.3,1.2,11.3,0,13.3
|
||||
c5.8-2.4,12.4-4.4,17.9-8.8C505.2,268.3,505.3,262.3,508.6,255.4"/>
|
||||
|
||||
<path fill="none" stroke="#211915" stroke-width="2.0849" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M467.6,315c-6.7,0.9-6.8,7.5-6.3,12.9"/>
|
||||
|
||||
<path fill="none" stroke="#211915" stroke-width="2.0849" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M399.2,315c6.7,0.9,6.8,7.5,6.3,12.9"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M572.4,277.7c0,0,24.9-1.8,28.9,2.2"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M261.4,277.7c0,0,24.9-1.8,28.9,2.2"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M524.6,709.2c10.4-10.9,26.9-24.7,41.5-22.8"/>
|
||||
<path fill="none" stroke="#211915" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M339.1,709.2c-10.4-10.9-26.9-24.7-41.5-22.8"/>
|
||||
</g>
|
||||
<path fill="none" stroke="#000000" stroke-width="3.6235" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M431.5,468.1"/>
|
||||
<path fill="none" stroke="#000000" stroke-width="3.6235" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
|
||||
M425.1,474.6"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 64 KiB |
6
public/assets/manifest.json
Normal file
6
public/assets/manifest.json
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"application.css": "application.c0219947d56b0fe0c486.css",
|
||||
"application.js": "application.d7984b9b397ebbdb30fb.js",
|
||||
"images/logo.svg": "images/logo.svg",
|
||||
"images/favicon.ico": "images/favicon.ico"
|
||||
}
|
||||
15
public/embed.go
Normal file
15
public/embed.go
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
package public
|
||||
|
||||
import (
|
||||
"embed"
|
||||
"io/fs"
|
||||
|
||||
"github.com/gobuffalo/buffalo"
|
||||
)
|
||||
|
||||
//go:embed *
|
||||
var files embed.FS
|
||||
|
||||
func FS() fs.FS {
|
||||
return buffalo.NewFS(files, "public")
|
||||
}
|
||||
2
public/robots.txt
Normal file
2
public/robots.txt
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
User-agent: *
|
||||
Disallow: /
|
||||
18
templates/_flash.plush.html
Normal file
18
templates/_flash.plush.html
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<%= for (k, messages) in flash { %>
|
||||
<%= for (msg) in messages { %>
|
||||
<%= if (k == "action_required") { %>
|
||||
<div class="alert alert-warning fade show" role="alert">
|
||||
<%= msg %>
|
||||
</div>
|
||||
<% } else { %>
|
||||
<div class="alert alert-<%= k %> alert-dismissible fade show" role="alert">
|
||||
<%= msg %>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
|
||||
</div>
|
||||
<% } %>
|
||||
<% } %>
|
||||
<% } %>
|
||||
</div>
|
||||
</div>
|
||||
6
templates/_footer.plush.html
Normal file
6
templates/_footer.plush.html
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
<footer class="footer mt-auto bg-dark">
|
||||
<%= if (payments_enabled) { %>
|
||||
<span class="text-muted"><a href="/legal/tos">Terms of Service</a></span>
|
||||
<% } %>
|
||||
</footer>
|
||||
|
||||
31
templates/application.plush.html
Normal file
31
templates/application.plush.html
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta charset="utf-8">
|
||||
<title><%= site_name %>: Your News Inbox</title>
|
||||
<%= stylesheetTag("application.css") %>
|
||||
<meta name="csrf-param" content="authenticity_token" />
|
||||
<meta name="csrf-token" content="<%= authenticity_token %>" />
|
||||
<link rel="icon" href="<%= assetPath("images/favicon.ico") %>">
|
||||
</head>
|
||||
<body class="d-flex flex-column text-center font-weight-bold text-bg-dark min-vh-100">
|
||||
<div class="container">
|
||||
<%= partial("flash.html") %>
|
||||
<%= partial("nav/navbar.plush.html") %>
|
||||
<%= partial("header/header.plush.html") %>
|
||||
<%= yield %>
|
||||
</div>
|
||||
|
||||
<%= javascriptTag("application.js") %>
|
||||
<%= if (analytics_enabled == "true") { %>
|
||||
<%= if (analytics_enabled_self_hosting) { %>
|
||||
<script defer data-domain="<%= site_domain %>" src="https://<%= site_domain %>/js/script.js"></script>
|
||||
<% } else { %>
|
||||
<script defer data-domain="<%= site_domain %>" src="https://plausible.io/js/script.js"></script>
|
||||
<% } %>
|
||||
<% } %>
|
||||
</body>
|
||||
|
||||
<%= partial("footer.plush.html") %>
|
||||
</html>
|
||||
24
templates/auth/index.plush.html
Normal file
24
templates/auth/index.plush.html
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
<div>
|
||||
<%= if (current_user) { %>
|
||||
<h1><%= current_user.Email %></h1>
|
||||
<%= linkTo(loginPath(), {data-method: "DELETE"}){ %>Sign Out<% } %>
|
||||
<% } else { %>
|
||||
<div class="auth-wrapper">
|
||||
<div class="sign-form">
|
||||
<h1>Sign In</h1>
|
||||
|
||||
<%= formFor(user, {action: loginPath(), method: "POST"}) { %>
|
||||
<%= f.InputTag("Email") %>
|
||||
<%= f.InputTag("Password", {type: "password"}) %>
|
||||
<br/>
|
||||
<button class="btn btn-success">Sign In!</button>
|
||||
<% } %>
|
||||
</div>
|
||||
</div>
|
||||
<br/>
|
||||
<%= linkTo(oauthProviderPath({provider: "github"}), {class: "btn btn-success"}){ %>Github Login<% } %>
|
||||
<%= linkTo(newUsersPath(), {class: "btn btn-success"}){ %>Create Account<% } %>
|
||||
<br/>
|
||||
<% } %>
|
||||
</div>
|
||||
|
||||
11
templates/auth/new.plush.html
Normal file
11
templates/auth/new.plush.html
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<div class="auth-wrapper">
|
||||
<div class="sign-form">
|
||||
<h1>Sign In</h1>
|
||||
|
||||
<%= formFor(user, {action: loginPath(), method: "POST"}) { %>
|
||||
<%= f.InputTag("Email") %>
|
||||
<%= f.InputTag("Password", {type: "password"}) %>
|
||||
<button class="btn btn-success">Sign In!</button>
|
||||
<% } %>
|
||||
</div>
|
||||
</div>
|
||||
15
templates/embed.go
Normal file
15
templates/embed.go
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
package templates
|
||||
|
||||
import (
|
||||
"embed"
|
||||
"io/fs"
|
||||
|
||||
"github.com/gobuffalo/buffalo"
|
||||
)
|
||||
|
||||
//go:embed * */*
|
||||
var files embed.FS
|
||||
|
||||
func FS() fs.FS {
|
||||
return buffalo.NewFS(files, "templates")
|
||||
}
|
||||
2
templates/header/_header.plush.html
Normal file
2
templates/header/_header.plush.html
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
<header class="bg-dark">
|
||||
</header>
|
||||
2
templates/header/empty.plush.html
Normal file
2
templates/header/empty.plush.html
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
|
||||
|
||||
10
templates/home/index.plush.html
Normal file
10
templates/home/index.plush.html
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
<main class="px-3">
|
||||
<h1><%= site_name %></h1>
|
||||
<h3>Your news inbox</h3>
|
||||
<br/>
|
||||
<p class="lead"><%= site_name %> is a newsletter manager</p>
|
||||
<p class="lead">Manage all of your newsletter subscriptions in one place</p>
|
||||
<br/>
|
||||
</main>
|
||||
|
||||
|
||||
322
templates/legal/index.plush.md
Normal file
322
templates/legal/index.plush.md
Normal file
|
|
@ -0,0 +1,322 @@
|
|||
Terms and Conditions
|
||||
====================
|
||||
|
||||
Last updated: November 06, 2022
|
||||
|
||||
Please read these terms and conditions carefully before using Our Service.
|
||||
|
||||
Interpretation and Definitions
|
||||
==============================
|
||||
|
||||
Interpretation
|
||||
--------------
|
||||
|
||||
The words of which the initial letter is capitalized have meanings defined
|
||||
under the following conditions. The following definitions shall have the same
|
||||
meaning regardless of whether they appear in singular or in plural.
|
||||
|
||||
Definitions
|
||||
-----------
|
||||
|
||||
For the purposes of these Terms and Conditions:
|
||||
|
||||
* Beta refers to a public demonstration of the Service for a period of time in which the Company holds itself to a lower standard of quality.
|
||||
|
||||
* Content refers to content such as text, images, or other information that can be posted, uploaded, linked to or otherwise made available by You, regardless of the form of that content.
|
||||
|
||||
* Country refers to: Delaware, United States
|
||||
|
||||
* Company (referred to as either "the Company", "We", "Us" or "Our" in this
|
||||
Agreement) refers to Zenity Labs LLC, 16192 Coastal Highway Lewes, DE
|
||||
19958.
|
||||
|
||||
* Device means any device that can access the Service such as a computer, a
|
||||
smartphone or a digital tablet.
|
||||
|
||||
* Service refers to the Website.
|
||||
|
||||
* Terms and Conditions (also referred as "Terms") mean these Terms and
|
||||
Conditions that form the entire agreement between You and the Company
|
||||
regarding the use of the Service. This Terms and Conditions agreement has
|
||||
been created with the help of the [TermsFeed Terms and Conditions
|
||||
Generator](https://www.termsfeed.com/terms-conditions-generator/).
|
||||
|
||||
* Third-party Social Media Service means any services or content (including
|
||||
data, information, products or services) provided by a third-party that
|
||||
may be displayed, included or made available by the Service.
|
||||
|
||||
* Website refers to Newsbox, accessible from <https://newsbox.email>
|
||||
|
||||
* You means the individual accessing or using the Service, or the company,
|
||||
or other legal entity on behalf of which such individual is accessing or
|
||||
using the Service, as applicable.
|
||||
|
||||
|
||||
Acknowledgment
|
||||
==============
|
||||
|
||||
These are the Terms and Conditions governing the use of this Service and the
|
||||
agreement that operates between You and the Company. These Terms and
|
||||
Conditions set out the rights and obligations of all users regarding the use
|
||||
of the Service.
|
||||
|
||||
Your access to and use of the Service is conditioned on Your acceptance of and
|
||||
compliance with these Terms and Conditions. These Terms and Conditions apply
|
||||
to all visitors, users and others who access or use the Service.
|
||||
|
||||
By accessing or using the Service You agree to be bound by these Terms and
|
||||
Conditions. If You disagree with any part of these Terms and Conditions then
|
||||
You may not access the Service.
|
||||
|
||||
You represent that you are over the age of 18. The Company does not permit
|
||||
those under 18 to use the Service.
|
||||
|
||||
Your access to and use of the Service is also conditioned on Your acceptance
|
||||
of and compliance with the Privacy Policy of the Company. Our Privacy Policy
|
||||
describes Our policies and procedures on the collection, use and disclosure of
|
||||
Your personal information when You use the Application or the Website and
|
||||
tells You about Your privacy rights and how the law protects You. Please read
|
||||
Our Privacy Policy carefully before using Our Service.
|
||||
|
||||
|
||||
Links to Other Websites
|
||||
=======================
|
||||
|
||||
Our Service may contain links to third-party web sites or services that are
|
||||
not owned or controlled by the Company.
|
||||
|
||||
The Company has no control over, and assumes no responsibility for, the
|
||||
content, privacy policies, or practices of any third party web sites or
|
||||
services. You further acknowledge and agree that the Company shall not be
|
||||
responsible or liable, directly or indirectly, for any damage or loss caused
|
||||
or alleged to be caused by or in connection with the use of or reliance on any
|
||||
such content, goods or services available on or through any such web sites or
|
||||
services.
|
||||
|
||||
We strongly advise You to read the terms and conditions and privacy policies
|
||||
of any third-party web sites or services that You visit.
|
||||
|
||||
User Accounts
|
||||
=============
|
||||
|
||||
When You create an account with Us, You must provide Us information that is accurate, complete, and current to the best of your knowledge. Failure to do so constitutes a breach of the Terms, which may result in immediate termination of Your account on Our Service.
|
||||
|
||||
You are responsible for safeguarding the password that You use to access the Service and for any activities or actions under Your password, whether Your password is with Our Service or a Third-Party Social Media Service.
|
||||
|
||||
You agree not to disclose Your password to any third party. You must notify Us immediately upon becoming aware of any breach of security or unauthorized use of Your account.
|
||||
|
||||
You may not use as a username the name of another person or entity or that is not lawfully available for use, a name or trademark that is subject to any rights of another person or entity other than You without appropriate authorization, or a name that is otherwise offensive, vulgar or obscene.
|
||||
|
||||
Content
|
||||
=======
|
||||
|
||||
## Your Right to Post Content
|
||||
|
||||
Our Service allows You to post Content. You are responsible for the Content that You post to the Service, including its legality, reliability, and appropriateness.
|
||||
|
||||
By posting Content to the Service, You grant Us the right and license to use, modify, publicly perform, publicly display, reproduce, and distribute such Content on and through the Service. You retain any and all of Your rights to any Content You submit, post or display on or through the Service and You are responsible for protecting those rights. You agree that this license includes the right for Us to make Your Content available to other users of the Service, who may also use Your Content subject to these Terms.
|
||||
|
||||
You represent and warrant that: (i) the Content is Yours (You own it) or You have the right to use it and grant Us the rights and license as provided in these Terms, and (ii) the posting of Your Content on or through the Service does not violate the privacy rights, publicity rights, copyrights, contract rights or any other rights of any person.
|
||||
|
||||
## Content Restrictions
|
||||
|
||||
The Company is not responsible for the content of the Service's users. You expressly understand and agree that You are solely responsible for the Content and for all activity that occurs under your account.
|
||||
|
||||
You may not transmit any Content that is unlawful, offensive, upsetting, intended to disgust, threatening, libelous, defamatory, obscene or otherwise objectionable. Examples of such objectionable Content include, but are not limited to, the following:
|
||||
|
||||
- Unlawful or promoting unlawful activity.
|
||||
- Defamatory, discriminatory, or mean-spirited content, including references or commentary about religion, race, sexual orientation, gender, national/ethnic origin, or other targeted groups.
|
||||
- Spam, machine – or randomly – generated, constituting unauthorized or unsolicited advertising, chain letters, any other form of unauthorized solicitation, or any form of lottery or gambling.
|
||||
- Containing or installing any viruses, worms, malware, trojan horses, or other content that is designed or intended to disrupt, damage, or limit the functioning of any software, hardware or telecommunications equipment or to damage or obtain unauthorized access to any data or other information of a third person.
|
||||
- Infringing on any proprietary rights of any party, including patent, trademark, trade secret, copyright, right of publicity or other rights.
|
||||
- Impersonating any person or entity including the Company and its employees or representatives.
|
||||
- Violating the privacy of any third person.
|
||||
- False information and features.
|
||||
|
||||
The Company reserves the right, but not the obligation, to, in its sole discretion, determine whether or not any Content is appropriate and complies with this Terms, refuse or remove this Content. The Company further reserves the right to make formatting and edits and change the manner any Content. The Company can also limit or revoke the use of the Service if You post such objectionable Content. As the Company cannot control all content posted by users and/or third parties on the Service, you agree to use the Service at your own risk. You understand that by using the Service You may be exposed to content that You may find offensive, indecent, incorrect or objectionable, and You agree that under no circumstances will the Company be liable in any way for any content, including any errors or omissions in any content, or any loss or damage of any kind incurred as a result of your use of any content.
|
||||
|
||||
## Content Backups
|
||||
|
||||
The Service is in Beta as of November, 2022. During this period we make no guarantee that Content uploaded to the Site is backed up for any period of time.
|
||||
|
||||
You agree not to expect the Company to retain any backups of the Service or its Content.
|
||||
|
||||
# Placing Orders for Services
|
||||
|
||||
By subscribing to the Service, You warrant that You are legally capable of entering into binding contracts.
|
||||
|
||||
## Your Information
|
||||
|
||||
If You wish to subscribe to the Service, You may be asked to supply certain information relevant to Your Order including, without limitation, Your name, Your email, Your phone number, Your credit card number, the expiration date of Your credit card, and Your billing address.
|
||||
|
||||
You represent and warrant that: (i) You have the legal right to use any credit or debit card(s) or other payment method(s) in connection with any Order; and that (ii) the information You supply to us is true, correct and complete.
|
||||
|
||||
By submitting such information, You grant us the right to provide the information to payment processing third parties for purposes of facilitating the completion of Your Order.
|
||||
Order Cancellation
|
||||
|
||||
We reserve the right to refuse or cancel Your Order if fraud or an unauthorized or illegal transaction is suspected.
|
||||
|
||||
## Your Order Cancellation Rights
|
||||
|
||||
Your subscription may be refunded in accordance with these Terms and Conditions.
|
||||
|
||||
## Refunds
|
||||
|
||||
If you subscribe to the Service, and for some reason you decide that you would like a refund, you may do so within 30 days of your last billing and receive a full refund.
|
||||
|
||||
## Prices Policy
|
||||
|
||||
The Company reserves the right to revise its prices at any time prior to accepting an Order.
|
||||
|
||||
The prices quoted may be revised by the Company subsequent to accepting an Order in the event of any occurrence affecting delivery caused by government action, variation in customs duties, higher foreign exchange costs and any other matter beyond the control of the Company. In that event, You will have the right to cancel Your Order.
|
||||
|
||||
## Payments
|
||||
|
||||
Payment can be made through various payment methods we have available, such as Visa, MasterCard, American Express cards or online payment methods such as PayPal, Apple Pay, and Google Pay.
|
||||
|
||||
Payment cards (credit cards or debit cards) are subject to validation checks and authorization by Your card issuer. If we do not receive the required authorization, We will not be liable for any delay or non-delivery of Your Order.
|
||||
|
||||
Termination
|
||||
===========
|
||||
|
||||
We may terminate or suspend Your access immediately, without prior notice or
|
||||
liability, for any reason whatsoever, including without limitation if You
|
||||
breach these Terms and Conditions.
|
||||
|
||||
Upon termination, Your right to use the Service will cease immediately. If you paid for the service, a refund may be issued for unused service.
|
||||
|
||||
Limitation of Liability
|
||||
=======================
|
||||
|
||||
Notwithstanding any damages that You might incur, the entire liability of the
|
||||
Company and any of its suppliers under any provision of this Terms and Your
|
||||
exclusive remedy for all of the foregoing shall be limited to the amount
|
||||
actually paid by You through the Service or 100 USD if You haven't purchased
|
||||
anything through the Service.
|
||||
|
||||
To the maximum extent permitted by applicable law, in no event shall the
|
||||
Company or its suppliers be liable for any special, incidental, indirect, or
|
||||
consequential damages whatsoever (including, but not limited to, damages for
|
||||
loss of profits, loss of data or other information, for business interruption,
|
||||
for personal injury, loss of privacy arising out of or in any way related to
|
||||
the use of or inability to use the Service, third-party software and/or third-
|
||||
party hardware used with the Service, or otherwise in connection with any
|
||||
provision of this Terms), even if the Company or any supplier has been advised
|
||||
of the possibility of such damages and even if the remedy fails of its
|
||||
essential purpose.
|
||||
|
||||
Some states do not allow the exclusion of implied warranties or limitation of
|
||||
liability for incidental or consequential damages, which means that some of
|
||||
the above limitations may not apply. In these states, each party's liability
|
||||
will be limited to the greatest extent permitted by law.
|
||||
|
||||
"AS IS" and "AS AVAILABLE" Disclaimer
|
||||
==========
|
||||
|
||||
The Service is provided to You "AS IS" and "AS AVAILABLE" and with all faults
|
||||
and defects without warranty of any kind. To the maximum extent permitted
|
||||
under applicable law, the Company, on its own behalf and on behalf of its
|
||||
Affiliates and its and their respective licensors and service providers,
|
||||
expressly disclaims all warranties, whether express, implied, statutory or
|
||||
otherwise, with respect to the Service, including all implied warranties of
|
||||
merchantability, fitness for a particular purpose, title and non-infringement,
|
||||
and warranties that may arise out of course of dealing, course of performance,
|
||||
usage or trade practice. Without limitation to the foregoing, the Company
|
||||
provides no warranty or undertaking, and makes no representation of any kind
|
||||
that the Service will meet Your requirements, achieve any intended results, be
|
||||
compatible or work with any other software, applications, systems or services,
|
||||
operate without interruption, meet any performance or reliability standards or
|
||||
be error free or that any errors or defects can or will be corrected.
|
||||
|
||||
Without limiting the foregoing, neither the Company nor any of the company's
|
||||
provider makes any representation or warranty of any kind, express or implied:
|
||||
(i) as to the operation or availability of the Service, or the information,
|
||||
content, and materials or products included thereon; (ii) that the Service
|
||||
will be uninterrupted or error-free; (iii) as to the accuracy, reliability, or
|
||||
currency of any information or content provided through the Service; or (iv)
|
||||
that the Service, its servers, the content, or e-mails sent from or on behalf
|
||||
of the Company are free of viruses, scripts, trojan horses, worms, malware,
|
||||
timebombs or other harmful components.
|
||||
|
||||
Some jurisdictions do not allow the exclusion of certain types of warranties
|
||||
or limitations on applicable statutory rights of a consumer, so some or all of
|
||||
the above exclusions and limitations may not apply to You. But in such a case
|
||||
the exclusions and limitations set forth in this section shall be applied to
|
||||
the greatest extent enforceable under applicable law.
|
||||
|
||||
Governing Law
|
||||
=============
|
||||
|
||||
The laws of the Country, excluding its conflicts of law rules, shall govern
|
||||
this Terms and Your use of the Service. Your use of the Application may also
|
||||
be subject to other local, state, national, or international laws.
|
||||
|
||||
Disputes Resolution
|
||||
===================
|
||||
|
||||
If You have any concern or dispute about the Service, You agree to first try
|
||||
to resolve the dispute informally by contacting the Company.
|
||||
|
||||
For European Union (EU) Users
|
||||
=============================
|
||||
|
||||
If You are a European Union consumer, you will benefit from any mandatory
|
||||
provisions of the law of the country in which you are resident in.
|
||||
|
||||
United States Legal Compliance
|
||||
==============================
|
||||
|
||||
You represent and warrant that (i) You are not located in a country that is
|
||||
subject to the United States government embargo, or that has been designated
|
||||
by the United States government as a "terrorist supporting" country, and (ii)
|
||||
You are not listed on any United States government list of prohibited or
|
||||
restricted parties.
|
||||
|
||||
Severability and Waiver
|
||||
=======================
|
||||
|
||||
Severability
|
||||
------------
|
||||
|
||||
If any provision of these Terms is held to be unenforceable or invalid, such
|
||||
provision will be changed and interpreted to accomplish the objectives of such
|
||||
provision to the greatest extent possible under applicable law and the
|
||||
remaining provisions will continue in full force and effect.
|
||||
|
||||
Waiver
|
||||
------
|
||||
|
||||
Except as provided herein, the failure to exercise a right or to require
|
||||
performance of an obligation under these Terms shall not effect a party's
|
||||
ability to exercise such right or require such performance at any time
|
||||
thereafter nor shall the waiver of a breach constitute a waiver of any
|
||||
subsequent breach.
|
||||
|
||||
Translation Interpretation
|
||||
==========================
|
||||
|
||||
These Terms and Conditions may have been translated if We have made them
|
||||
available to You on our Service. You agree that the original English text
|
||||
shall prevail in the case of a dispute.
|
||||
|
||||
Changes to These Terms and Conditions
|
||||
=====================================
|
||||
|
||||
We reserve the right, at Our sole discretion, to modify or replace these Terms
|
||||
at any time. If a revision is material We will make reasonable efforts to
|
||||
provide at least 30 days' notice prior to any new terms taking effect. What
|
||||
constitutes a material change will be determined at Our sole discretion.
|
||||
|
||||
By continuing to access or use Our Service after those revisions become
|
||||
effective, You agree to be bound by the revised terms. If You do not agree to
|
||||
the new terms, in whole or in part, please stop using the website and the
|
||||
Service.
|
||||
|
||||
Contact Us
|
||||
==========
|
||||
|
||||
If you have any questions about these Terms and Conditions, You can contact
|
||||
us:
|
||||
|
||||
* By email: support@zenitylabs.com
|
||||
|
||||
5
templates/mail/email_changed.plush.html
Normal file
5
templates/mail/email_changed.plush.html
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
<h2>Please confirm your new email address</h2>
|
||||
|
||||
<p>You will not receive email from <%= site_name %> until this email address is verified.</p>
|
||||
|
||||
Open this link to verify your email address: <a href="<%= verification_url %>"><%= verification_url %></a>
|
||||
5
templates/mail/email_changed.plush.tpl
Normal file
5
templates/mail/email_changed.plush.tpl
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
Please confirm your new email address.
|
||||
|
||||
You will not receive mail from <%= site_name %> until this email address is verified.
|
||||
|
||||
Verification URL: <%= verification_url %>
|
||||
1
templates/mail/forwarded_mail.plush.html
Normal file
1
templates/mail/forwarded_mail.plush.html
Normal file
|
|
@ -0,0 +1 @@
|
|||
<%= html_content %>
|
||||
1
templates/mail/forwarded_mail.plush.tpl
Normal file
1
templates/mail/forwarded_mail.plush.tpl
Normal file
|
|
@ -0,0 +1 @@
|
|||
<%= text_content %>
|
||||
1
templates/mail/layout.plush.html
Normal file
1
templates/mail/layout.plush.html
Normal file
|
|
@ -0,0 +1 @@
|
|||
<%= yield %>
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue