aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md2
-rw-r--r--README_ZH.md2
-rw-r--r--cmd/fix.go154
-rw-r--r--cmd/serve.go1
-rw-r--r--cmd/web.go5
-rw-r--r--conf/app.ini6
-rw-r--r--gogs.go6
-rw-r--r--models/action.go23
-rw-r--r--models/login.go83
-rw-r--r--models/models.go7
-rw-r--r--models/publickey.go14
-rw-r--r--models/repo.go69
-rw-r--r--models/user.go2
-rw-r--r--models/webhook.go133
-rw-r--r--modules/bin/conf.go494
-rw-r--r--modules/cron/cron.go4
-rw-r--r--modules/hooks/hooks.go95
-rw-r--r--modules/setting/setting.go23
-rwxr-xr-xpublic/css/gogs.css96
-rw-r--r--routers/admin/admin.go3
-rw-r--r--routers/admin/auths.go18
-rw-r--r--routers/admin/user.go5
-rw-r--r--routers/install.go3
-rw-r--r--routers/org/org.go11
-rw-r--r--routers/repo/setting.go16
-rw-r--r--templates/VERSION2
-rw-r--r--templates/admin/config.tmpl15
-rw-r--r--templates/org/org.tmpl85
-rw-r--r--templates/repo/nav.tmpl1
29 files changed, 880 insertions, 498 deletions
diff --git a/README.md b/README.md
index 88870819..d34aa5a6 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@ Gogs(Go Git Service) is a Self Hosted Git Service in the Go Programming Language
![Demo](http://gowalker.org/public/gogs_demo.gif)
-##### Current version: 0.4.2 Alpha
+##### Current version: 0.4.3 Alpha
### NOTICES
diff --git a/README_ZH.md b/README_ZH.md
index 84af15a6..ebffa33e 100644
--- a/README_ZH.md
+++ b/README_ZH.md
@@ -5,7 +5,7 @@ Gogs(Go Git Service) 是一个由 Go 语言编写的自助 Git 托管服务。
![Demo](http://gowalker.org/public/gogs_demo.gif)
-##### 当前版本:0.4.2 Alpha
+##### 当前版本:0.4.3 Alpha
## 开发目的
diff --git a/cmd/fix.go b/cmd/fix.go
index 3c2278ba..95ab3ae6 100644
--- a/cmd/fix.go
+++ b/cmd/fix.go
@@ -5,10 +5,16 @@
package cmd
import (
+ "bufio"
"fmt"
+ "io"
+ "io/ioutil"
"os"
+ "path"
+ "strings"
"github.com/codegangsta/cli"
+
"github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/setting"
)
@@ -16,28 +22,152 @@ import (
var CmdFix = cli.Command{
Name: "fix",
Usage: "This command for upgrade from old version",
- Description: `Fix provide upgrade from old version`,
Action: runFix,
+ Subcommands: fixCommands,
Flags: []cli.Flag{},
}
-func runFix(k *cli.Context) {
- workDir, _ := setting.WorkDir()
- newLogger(workDir)
+func runFix(ctx *cli.Context) {
+}
- setting.NewConfigContext()
- models.LoadModelsConfig()
+var fixCommands = []cli.Command{
+ {
+ Name: "location",
+ Usage: "Change Gogs app location",
+ Description: `Command location fixes location change of Gogs
+
+gogs fix location <old Gogs path>
+`,
+ Action: runFixLocation,
+ },
+}
+
+// rewriteAuthorizedKeys replaces old Gogs path to the new one.
+func rewriteAuthorizedKeys(sshPath, oldPath, newPath string) error {
+ fr, err := os.Open(sshPath)
+ if err != nil {
+ return err
+ }
+ defer fr.Close()
+
+ tmpPath := sshPath + ".tmp"
+ fw, err := os.Create(tmpPath)
+ if err != nil {
+ return err
+ }
+ defer fw.Close()
+
+ oldPath = "command=\"" + oldPath + " serv"
+ newPath = "command=\"" + newPath + " serv"
+ buf := bufio.NewReader(fr)
+ for {
+ line, errRead := buf.ReadString('\n')
+ line = strings.TrimSpace(line)
+
+ if errRead != nil {
+ if errRead != io.EOF {
+ return errRead
+ }
+
+ // Reached end of file, if nothing to read then break,
+ // otherwise handle the last line.
+ if len(line) == 0 {
+ break
+ }
+ }
+
+ // Still finding the line, copy the line that currently read.
+ if _, err = fw.WriteString(strings.Replace(line, oldPath, newPath, 1) + "\n"); err != nil {
+ return err
+ }
- if models.UseSQLite3 {
- os.Chdir(workDir)
+ if errRead == io.EOF {
+ break
+ }
}
- models.SetEngine()
+ if err = os.Remove(sshPath); err != nil {
+ return err
+ }
+ return os.Rename(tmpPath, sshPath)
+}
+
+func rewriteUpdateHook(path, appPath string) error {
+ rp := strings.NewReplacer("\\", "/", " ", "\\ ")
+ if err := ioutil.WriteFile(path, []byte(fmt.Sprintf(models.TPL_UPDATE_HOOK,
+ setting.ScriptType, rp.Replace(appPath))), os.ModePerm); err != nil {
+ return err
+ }
+ return nil
+}
- err := models.Fix()
+func walkDir(rootPath, recPath, appPath string, depth int) error {
+ depth++
+ if depth > 3 {
+ return nil
+ } else if depth == 3 {
+ if err := rewriteUpdateHook(path.Join(rootPath, "hooks/update"), appPath); err != nil {
+ return err
+ }
+ }
+
+ dir, err := os.Open(rootPath)
+ if err != nil {
+ return err
+ }
+ defer dir.Close()
+
+ fis, err := dir.Readdir(0)
if err != nil {
+ return err
+ }
+
+ for _, fi := range fis {
+ if strings.Contains(fi.Name(), ".DS_Store") {
+ continue
+ }
+
+ relPath := path.Join(recPath, fi.Name())
+ curPath := path.Join(rootPath, fi.Name())
+ if fi.IsDir() {
+ if err = walkDir(curPath, relPath, appPath, depth); err != nil {
+ return err
+ }
+ }
+ }
+ return nil
+}
+
+func runFixLocation(ctx *cli.Context) {
+ if len(ctx.Args()) != 1 {
+ fmt.Println("Incorrect arguments number, expect 1")
+ os.Exit(2)
+ }
+
+ execPath, _ := setting.ExecPath()
+
+ oldPath := ctx.Args().First()
+ fmt.Printf("Old location: %s\n", oldPath)
+ fmt.Println("This command should be executed in the new Gogs path")
+ fmt.Printf("Do you want to change Gogs app path from old location to:\n")
+ fmt.Printf("-> %s?\n", execPath)
+ fmt.Print("Press <enter> to continue, use <Ctrl+c> to exit.")
+ fmt.Scanln()
+
+ // Fix in authorized_keys file.
+ sshPath := path.Join(models.SshPath, "authorized_keys")
+ fmt.Printf("Fixing pathes in file: %s\n", sshPath)
+ if err := rewriteAuthorizedKeys(sshPath, oldPath, execPath); err != nil {
+ fmt.Println(err)
+ os.Exit(1)
+ }
+
+ // Fix position in gogs-repositories.
+ setting.NewConfigContext()
+ fmt.Printf("Fixing pathes in repositories: %s\n", setting.RepoRootPath)
+ if err := walkDir(setting.RepoRootPath, "", execPath, 0); err != nil {
fmt.Println(err)
- } else {
- fmt.Println("Fix successfully!")
+ os.Exit(1)
}
+ fmt.Println("Fix position finished!")
}
diff --git a/cmd/serve.go b/cmd/serve.go
index 302f8568..3a17bf9f 100644
--- a/cmd/serve.go
+++ b/cmd/serve.go
@@ -36,7 +36,6 @@ func newLogger(logPath string) {
}
qlog.SetOutput(f)
- //qlog.SetOutputLevel(qlog.Ldebug)
qlog.Info("Start logging serv...")
}
diff --git a/cmd/web.go b/cmd/web.go
index 30db037a..2b14b077 100644
--- a/cmd/web.go
+++ b/cmd/web.go
@@ -27,6 +27,7 @@ import (
"github.com/gogits/gogs/routers/admin"
"github.com/gogits/gogs/routers/api/v1"
"github.com/gogits/gogs/routers/dev"
+ "github.com/gogits/gogs/routers/org"
"github.com/gogits/gogs/routers/repo"
"github.com/gogits/gogs/routers/user"
)
@@ -186,6 +187,10 @@ func runWeb(*cli.Context) {
reqOwner := middleware.RequireOwner()
+ m.Group("/o", func(r martini.Router) {
+ r.Get("/:org", org.Organization)
+ })
+
m.Group("/:username/:reponame", func(r martini.Router) {
r.Get("/settings", repo.Setting)
r.Post("/settings", bindIgnErr(auth.RepoSettingForm{}), repo.SettingPost)
diff --git a/conf/app.ini b/conf/app.ini
index 1fc88757..c792c0fb 100644
--- a/conf/app.ini
+++ b/conf/app.ini
@@ -66,6 +66,12 @@ ENABLE_CACHE_AVATAR = false
; Mail notification
ENABLE_NOTIFY_MAIL = false
+[webhook]
+; Cron task interval in minutes
+TASK_INTERVAL = 1
+; Deliver timeout in seconds
+DELIVER_TIMEOUT = 5
+
[mailer]
ENABLED = false
; Buffer length of channel, keep it as it is if you don't know what it is.
diff --git a/gogs.go b/gogs.go
index aabcbe82..41a71c72 100644
--- a/gogs.go
+++ b/gogs.go
@@ -17,7 +17,7 @@ import (
"github.com/gogits/gogs/modules/setting"
)
-const APP_VER = "0.4.2.0605 Alpha"
+const APP_VER = "0.4.3.0610 Alpha"
func init() {
runtime.GOMAXPROCS(runtime.NumCPU())
@@ -31,10 +31,10 @@ func main() {
app.Version = APP_VER
app.Commands = []cli.Command{
cmd.CmdWeb,
- // cmd.CmdFix,
- cmd.CmdDump,
cmd.CmdServ,
cmd.CmdUpdate,
+ cmd.CmdFix,
+ cmd.CmdDump,
}
app.Flags = append(app.Flags, []cli.Flag{}...)
app.Run(os.Args)
diff --git a/models/action.go b/models/action.go
index 9fc9d89b..e39b04a1 100644
--- a/models/action.go
+++ b/models/action.go
@@ -15,7 +15,6 @@ import (
qlog "github.com/qiniu/log"
"github.com/gogits/gogs/modules/base"
- "github.com/gogits/gogs/modules/hooks"
"github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/setting"
)
@@ -131,35 +130,35 @@ func CommitRepoAction(userId, repoUserId int64, userName, actEmail string,
}
repoLink := fmt.Sprintf("%s%s/%s", setting.AppUrl, repoUserName, repoName)
- commits := make([]*hooks.PayloadCommit, len(commit.Commits))
+ commits := make([]*PayloadCommit, len(commit.Commits))
for i, cmt := range commit.Commits {
- commits[i] = &hooks.PayloadCommit{
+ commits[i] = &PayloadCommit{
Id: cmt.Sha1,
Message: cmt.Message,
Url: fmt.Sprintf("%s/commit/%s", repoLink, cmt.Sha1),
- Author: &hooks.PayloadAuthor{
+ Author: &PayloadAuthor{
Name: cmt.AuthorName,
Email: cmt.AuthorEmail,
},
}
}
- p := &hooks.Payload{
+ p := &Payload{
Ref: refFullName,
Commits: commits,
- Repo: &hooks.PayloadRepo{
+ Repo: &PayloadRepo{
Id: repo.Id,
Name: repo.LowerName,
Url: repoLink,
Description: repo.Description,
Website: repo.Website,
Watchers: repo.NumWatches,
- Owner: &hooks.PayloadAuthor{
+ Owner: &PayloadAuthor{
Name: repoUserName,
Email: actEmail,
},
Private: repo.IsPrivate,
},
- Pusher: &hooks.PayloadAuthor{
+ Pusher: &PayloadAuthor{
Name: repo.Owner.LowerName,
Email: repo.Owner.Email,
},
@@ -172,7 +171,13 @@ func CommitRepoAction(userId, repoUserId int64, userName, actEmail string,
}
p.Secret = w.Secret
- hooks.AddHookTask(&hooks.HookTask{hooks.HTT_WEBHOOK, w.Url, p, w.ContentType, w.IsSsl})
+ CreateHookTask(&HookTask{
+ Type: WEBHOOK,
+ Url: w.Url,
+ Payload: p,
+ ContentType: w.ContentType,
+ IsSsl: w.IsSsl,
+ })
}
return nil
}
diff --git a/models/login.go b/models/login.go
index 984a9f8c..863ba44e 100644
--- a/models/login.go
+++ b/models/login.go
@@ -1,4 +1,4 @@
-// Copyright github.com/juju2013. All rights reserved.
+// Copyright 2014 The Gogs Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
@@ -20,12 +20,13 @@ import (
"github.com/gogits/gogs/modules/log"
)
-// Login types.
+type LoginType int
+
const (
- LT_NOTYPE = iota
- LT_PLAIN
- LT_LDAP
- LT_SMTP
+ NOTYPE LoginType = iota
+ PLAIN
+ LDAP
+ SMTP
)
var (
@@ -34,9 +35,9 @@ var (
ErrAuthenticationUserUsed = errors.New("Authentication has been used by some users")
)
-var LoginTypes = map[int]string{
- LT_LDAP: "LDAP",
- LT_SMTP: "SMTP",
+var LoginTypes = map[LoginType]string{
+ LDAP: "LDAP",
+ SMTP: "SMTP",
}
// Ensure structs implmented interface.
@@ -49,7 +50,6 @@ type LDAPConfig struct {
ldap.Ldapsource
}
-// implement
func (cfg *LDAPConfig) FromDB(bs []byte) error {
return json.Unmarshal(bs, &cfg.Ldapsource)
}
@@ -65,7 +65,6 @@ type SMTPConfig struct {
TLS bool
}
-// implement
func (cfg *SMTPConfig) FromDB(bs []byte) error {
return json.Unmarshal(bs, cfg)
}
@@ -76,13 +75,13 @@ func (cfg *SMTPConfig) ToDB() ([]byte, error) {
type LoginSource struct {
Id int64
- Type int
- Name string `xorm:"unique"`
- IsActived bool `xorm:"not null default false"`
+ Type LoginType
+ Name string `xorm:"UNIQUE"`
+ IsActived bool `xorm:"NOT NULL DEFAULT false"`
Cfg core.Conversion `xorm:"TEXT"`
- Created time.Time `xorm:"created"`
- Updated time.Time `xorm:"updated"`
- AllowAutoRegister bool `xorm:"not null default false"`
+ AllowAutoRegister bool `xorm:"NOT NULL DEFAULT false"`
+ Created time.Time `xorm:"CREATED"`
+ Updated time.Time `xorm:"UPDATED"`
}
func (source *LoginSource) TypeString() string {
@@ -97,21 +96,25 @@ func (source *LoginSource) SMTP() *SMTPConfig {
return source.Cfg.(*SMTPConfig)
}
-// for xorm callback
func (source *LoginSource) BeforeSet(colName string, val xorm.Cell) {
if colName == "type" {
ty := (*val).(int64)
- switch ty {
- case LT_LDAP:
+ switch LoginType(ty) {
+ case LDAP:
source.Cfg = new(LDAPConfig)
- case LT_SMTP:
+ case SMTP:
source.Cfg = new(SMTPConfig)
}
}
}
+func CreateSource(source *LoginSource) error {
+ _, err := orm.Insert(source)
+ return err
+}
+
func GetAuths() ([]*LoginSource, error) {
- var auths = make([]*LoginSource, 0)
+ var auths = make([]*LoginSource, 0, 5)
err := orm.Find(&auths)
return auths, err
}
@@ -121,18 +124,12 @@ func GetLoginSourceById(id int64) (*LoginSource, error) {
has, err := orm.Id(id).Get(source)
if err != nil {
return nil, err
- }
- if !has {
+ } else if !has {
return nil, ErrAuthenticationNotExist
}
return source, nil
}
-func AddSource(source *LoginSource) error {
- _, err := orm.Insert(source)
- return err
-}
-
func UpdateSource(source *LoginSource) error {
_, err := orm.Id(source.Id).AllCols().Update(source)
return err
@@ -164,14 +161,14 @@ func UserSignIn(uname, passwd string) (*User, error) {
return nil, err
}
- if u.LoginType == LT_NOTYPE {
+ if u.LoginType == NOTYPE {
if has {
- u.LoginType = LT_PLAIN
+ u.LoginType = PLAIN
}
}
// for plain login, user must have existed.
- if u.LoginType == LT_PLAIN {
+ if u.LoginType == PLAIN {
if !has {
return nil, ErrUserNotExist
}
@@ -191,22 +188,20 @@ func UserSignIn(uname, passwd string) (*User, error) {
}
for _, source := range sources {
- if source.Type == LT_LDAP {
+ if source.Type == LDAP {
u, err := LoginUserLdapSource(nil, uname, passwd,
source.Id, source.Cfg.(*LDAPConfig), true)
if err == nil {
return u, nil
- } else {
- log.Warn("Fail to login(%s) by LDAP(%s): %v", uname, source.Name, err)
}
- } else if source.Type == LT_SMTP {
+ log.Warn("Fail to login(%s) by LDAP(%s): %v", uname, source.Name, err)
+ } else if source.Type == SMTP {
u, err := LoginUserSMTPSource(nil, uname, passwd,
source.Id, source.Cfg.(*SMTPConfig), true)
if err == nil {
return u, nil
- } else {
- log.Warn("Fail to login(%s) by SMTP(%s): %v", uname, source.Name, err)
}
+ log.Warn("Fail to login(%s) by SMTP(%s): %v", uname, source.Name, err)
}
}
@@ -224,10 +219,10 @@ func UserSignIn(uname, passwd string) (*User, error) {
}
switch u.LoginType {
- case LT_LDAP:
+ case LDAP:
return LoginUserLdapSource(u, u.LoginName, passwd,
source.Id, source.Cfg.(*LDAPConfig), false)
- case LT_SMTP:
+ case SMTP:
return LoginUserSMTPSource(u, u.LoginName, passwd,
source.Id, source.Cfg.(*SMTPConfig), false)
}
@@ -252,7 +247,7 @@ func LoginUserLdapSource(user *User, name, passwd string, sourceId int64, cfg *L
user = &User{
LowerName: strings.ToLower(name),
Name: strings.ToLower(name),
- LoginType: LT_LDAP,
+ LoginType: LDAP,
LoginSource: sourceId,
LoginName: name,
IsActive: true,
@@ -320,9 +315,8 @@ func SmtpAuth(host string, port int, a smtp.Auth, useTls bool) error {
return err
}
return nil
- } else {
- return ErrUnsupportedLoginType
}
+ return ErrUnsupportedLoginType
}
// Query if name/passwd can login against the LDAP direcotry pool
@@ -358,13 +352,12 @@ func LoginUserSMTPSource(user *User, name, passwd string, sourceId int64, cfg *S
user = &User{
LowerName: strings.ToLower(loginName),
Name: strings.ToLower(loginName),
- LoginType: LT_SMTP,
+ LoginType: SMTP,
LoginSource: sourceId,
LoginName: name,
IsActive: true,
Passwd: passwd,
Email: name,
}
-
return RegisterUser(user)
}
diff --git a/models/models.go b/models/models.go
index fa65ef30..a59c0517 100644
--- a/models/models.go
+++ b/models/models.go
@@ -35,7 +35,7 @@ func init() {
tables = append(tables, new(User), new(PublicKey), new(Repository), new(Watch),
new(Action), new(Access), new(Issue), new(Comment), new(Oauth2), new(Follow),
new(Mirror), new(Release), new(LoginSource), new(Webhook), new(IssueUser),
- new(Milestone), new(Label))
+ new(Milestone), new(Label), new(HookTask))
}
func LoadModelsConfig() {
@@ -46,7 +46,9 @@ func LoadModelsConfig() {
DbCfg.Host = setting.Cfg.MustValue("database", "HOST")
DbCfg.Name = setting.Cfg.MustValue("database", "NAME")
DbCfg.User = setting.Cfg.MustValue("database", "USER")
- DbCfg.Pwd = setting.Cfg.MustValue("database", "PASSWD")
+ if len(DbCfg.Pwd) == 0 {
+ DbCfg.Pwd = setting.Cfg.MustValue("database", "PASSWD")
+ }
DbCfg.SslMode = setting.Cfg.MustValue("database", "SSL_MODE")
DbCfg.Path = setting.Cfg.MustValue("database", "PATH", "data/gogs.db")
}
@@ -67,7 +69,6 @@ func NewTestEngine(x *xorm.Engine) (err error) {
}
cnnstr := fmt.Sprintf("user=%s password=%s host=%s port=%s dbname=%s sslmode=%s",
DbCfg.User, DbCfg.Pwd, host, port, DbCfg.Name, DbCfg.SslMode)
- //fmt.Println(cnnstr)
x, err = xorm.NewEngine("postgres", cnnstr)
case "sqlite3":
if !EnableSQLite3 {
diff --git a/models/publickey.go b/models/publickey.go
index 556db964..76dc0cc7 100644
--- a/models/publickey.go
+++ b/models/publickey.go
@@ -37,7 +37,7 @@ var (
var sshOpLocker = sync.Mutex{}
var (
- sshPath string // SSH directory.
+ SshPath string // SSH directory.
appPath string // Execution(binary) path.
)
@@ -67,9 +67,9 @@ func init() {
}
// Determine and create .ssh path.
- sshPath = filepath.Join(homeDir(), ".ssh")
- if err = os.MkdirAll(sshPath, os.ModePerm); err != nil {
- qlog.Fatalf("publickey.init(fail to create sshPath(%s)): %v\n", sshPath, err)
+ SshPath = filepath.Join(homeDir(), ".ssh")
+ if err = os.MkdirAll(SshPath, os.ModePerm); err != nil {
+ qlog.Fatalf("publickey.init(fail to create SshPath(%s)): %v\n", SshPath, err)
}
}
@@ -94,7 +94,7 @@ func saveAuthorizedKeyFile(key *PublicKey) error {
sshOpLocker.Lock()
defer sshOpLocker.Unlock()
- fpath := filepath.Join(sshPath, "authorized_keys")
+ fpath := filepath.Join(SshPath, "authorized_keys")
f, err := os.OpenFile(fpath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0600)
if err != nil {
return err
@@ -216,8 +216,8 @@ func DeletePublicKey(key *PublicKey) error {
return err
}
- fpath := filepath.Join(sshPath, "authorized_keys")
- tmpPath := filepath.Join(sshPath, "authorized_keys.tmp")
+ fpath := filepath.Join(SshPath, "authorized_keys")
+ tmpPath := filepath.Join(SshPath, "authorized_keys.tmp")
log.Trace("publickey.DeletePublicKey(authorized_keys): %s", fpath)
if err = rewriteAuthorizedKeys(key, fpath, tmpPath); err != nil {
diff --git a/models/repo.go b/models/repo.go
index 869059fa..7eab83c2 100644
--- a/models/repo.go
+++ b/models/repo.go
@@ -28,6 +28,10 @@ import (
"github.com/gogits/gogs/modules/setting"
)
+const (
+ TPL_UPDATE_HOOK = "#!/usr/bin/env %s\n%s update $1 $2 $3\n"
+)
+
var (
ErrRepoAlreadyExist = errors.New("Repository already exist")
ErrRepoNotExist = errors.New("Repository does not exist")
@@ -109,11 +113,11 @@ func NewRepoContext() {
// Repository represents a git repository.
type Repository struct {
Id int64
- OwnerId int64 `xorm:"unique(s)"`
+ OwnerId int64 `xorm:"UNIQUE(s)"`
Owner *User `xorm:"-"`
ForkId int64
- LowerName string `xorm:"unique(s) index not null"`
- Name string `xorm:"index not null"`
+ LowerName string `xorm:"UNIQUE(s) INDEX NOT NULL"`
+ Name string `xorm:"INDEX NOT NULL"`
Description string
Website string
NumWatches int
@@ -131,8 +135,8 @@ type Repository struct {
IsBare bool
IsGoget bool
DefaultBranch string
- Created time.Time `xorm:"created"`
- Updated time.Time `xorm:"updated"`
+ Created time.Time `xorm:"CREATED"`
+ Updated time.Time `xorm:"UPDATED"`
}
func (repo *Repository) GetOwner() (err error) {
@@ -184,6 +188,25 @@ type Mirror struct {
NextUpdate time.Time
}
+// MirrorRepository creates a mirror repository from source.
+func MirrorRepository(repoId int64, userName, repoName, repoPath, url string) error {
+ _, stderr, err := com.ExecCmd("git", "clone", "--mirror", url, repoPath)
+ if err != nil {
+ return errors.New("git clone --mirror: " + stderr)
+ }
+
+ if _, err = orm.InsertOne(&Mirror{
+ RepoId: repoId,
+ RepoName: strings.ToLower(userName + "/" + repoName),
+ Interval: 24,
+ NextUpdate: time.Now().Add(24 * time.Hour),
+ }); err != nil {
+ return err
+ }
+
+ return git.UnpackRefs(repoPath)
+}
+
func GetMirror(repoId int64) (*Mirror, error) {
m := &Mirror{RepoId: repoId}
has, err := orm.Get(m)
@@ -223,25 +246,6 @@ func MirrorUpdate() {
}
}
-// MirrorRepository creates a mirror repository from source.
-func MirrorRepository(repoId int64, userName, repoName, repoPath, url string) error {
- _, stderr, err := com.ExecCmd("git", "clone", "--mirror", url, repoPath)
- if err != nil {
- return errors.New("git clone --mirror: " + stderr)
- }
-
- if _, err = orm.InsertOne(&Mirror{
- RepoId: repoId,
- RepoName: strings.ToLower(userName + "/" + repoName),
- Interval: 24,
- NextUpdate: time.Now().Add(24 * time.Hour),
- }); err != nil {
- return err
- }
-
- return git.UnpackRefs(repoPath)
-}
-
// MigrateRepository migrates a existing repository from other project hosting.
func MigrateRepository(user *User, name, desc string, private, mirror bool, url string) (*Repository, error) {
repo, err := CreateRepository(user, name, desc, "", "", private, mirror, false)
@@ -450,7 +454,7 @@ func initRepository(f string, user *User, repo *Repository, initReadme bool, rep
rp := strings.NewReplacer("\\", "/", " ", "\\ ")
// hook/post-update
if err := createHookUpdate(filepath.Join(repoPath, "hooks", "update"),
- fmt.Sprintf("#!/usr/bin/env %s\n%s update $1 $2 $3\n", setting.ScriptType,
+ fmt.Sprintf(TPL_UPDATE_HOOK, setting.ScriptType,
rp.Replace(appPath))); err != nil {
return err
}
@@ -746,16 +750,11 @@ func DeleteRepository(userId, repoId int64, userName string) (err error) {
sess.Rollback()
return err
}
- if err = sess.Commit(); err != nil {
- sess.Rollback()
- return err
- }
if err = os.RemoveAll(RepoPath(userName, repo.Name)); err != nil {
- // TODO: log and delete manully
- log.Error("delete repo %s/%s failed: %v", userName, repo.Name, err)
+ sess.Rollback()
return err
}
- return nil
+ return sess.Commit()
}
// GetRepositoryByName returns the repository by given name under user if exists.
@@ -832,11 +831,11 @@ func GetCollaborativeRepos(uname string) ([]*Repository, error) {
repos := make([]*Repository, 0, 10)
for _, access := range accesses {
- if strings.HasPrefix(access.RepoName, uname) {
+ infos := strings.Split(access.RepoName, "/")
+ if infos[0] == uname {
continue
}
-
- infos := strings.Split(access.RepoName, "/")
+
u, err := GetUserByName(infos[0])
if err != nil {
return nil, err
diff --git a/models/user.go b/models/user.go
index 78ab4642..04ea1fd6 100644
--- a/models/user.go
+++ b/models/user.go
@@ -47,7 +47,7 @@ type User struct {
FullName string
Email string `xorm:"unique not null"`
Passwd string `xorm:"not null"`
- LoginType int
+ LoginType LoginType
LoginSource int64 `xorm:"not null default 0"`
LoginName string
Type int
diff --git a/models/webhook.go b/models/webhook.go
index f10fa213..ffd47c8f 100644
--- a/models/webhook.go
+++ b/models/webhook.go
@@ -7,29 +7,35 @@ package models
import (
"encoding/json"
"errors"
+ "time"
+ "github.com/gogits/gogs/modules/httplib"
"github.com/gogits/gogs/modules/log"
+ "github.com/gogits/gogs/modules/setting"
)
var (
ErrWebhookNotExist = errors.New("Webhook does not exist")
)
-// Content types.
+type HookContentType int
+
const (
- CT_JSON = iota + 1
- CT_FORM
+ JSON HookContentType = iota + 1
+ FORM
)
+// HookEvent represents events that will delivery hook.
type HookEvent struct {
PushOnly bool `json:"push_only"`
}
+// Webhook represents a web hook object.
type Webhook struct {
Id int64
RepoId int64
Url string `xorm:"TEXT"`
- ContentType int
+ ContentType HookContentType
Secret string `xorm:"TEXT"`
Events string `xorm:"TEXT"`
*HookEvent `xorm:"-"`
@@ -37,6 +43,7 @@ type Webhook struct {
IsActive bool
}
+// GetEvent handles conversion from Events to HookEvent.
func (w *Webhook) GetEvent() {
w.HookEvent = &HookEvent{}
if err := json.Unmarshal([]byte(w.Events), w.HookEvent); err != nil {
@@ -44,12 +51,14 @@ func (w *Webhook) GetEvent() {
}
}
-func (w *Webhook) SaveEvent() error {
+// UpdateEvent handles conversion from HookEvent to Events.
+func (w *Webhook) UpdateEvent() error {
data, err := json.Marshal(w.HookEvent)
w.Events = string(data)
return err
}
+// HasPushEvent returns true if hook enbaled push event.
func (w *Webhook) HasPushEvent() bool {
if w.PushOnly {
return true
@@ -57,18 +66,12 @@ func (w *Webhook) HasPushEvent() bool {
return false
}
-// CreateWebhook creates new webhook.
+// CreateWebhook creates a new web hook.
func CreateWebhook(w *Webhook) error {
_, err := orm.Insert(w)
return err
}
-// UpdateWebhook updates information of webhook.
-func UpdateWebhook(w *Webhook) error {
- _, err := orm.AllCols().Update(w)
- return err
-}
-
// GetWebhookById returns webhook by given ID.
func GetWebhookById(hookId int64) (*Webhook, error) {
w := &Webhook{Id: hookId}
@@ -93,8 +96,114 @@ func GetWebhooksByRepoId(repoId int64) (ws []*Webhook, err error) {
return ws, err
}
+// UpdateWebhook updates information of webhook.
+func UpdateWebhook(w *Webhook) error {
+ _, err := orm.AllCols().Update(w)
+ return err
+}
+
// DeleteWebhook deletes webhook of repository.
func DeleteWebhook(hookId int64) error {
_, err := orm.Delete(&Webhook{Id: hookId})
return err
}
+
+// ___ ___ __ ___________ __
+// / | \ ____ ____ | | _\__ ___/____ _____| | __
+// / ~ \/ _ \ / _ \| |/ / | | \__ \ / ___/ |/ /
+// \ Y ( <_> | <_> ) < | | / __ \_\___ \| <
+// \___|_ / \____/ \____/|__|_ \ |____| (____ /____ >__|_ \
+// \/ \/ \/ \/ \/
+
+type HookTaskType int
+
+const (
+ WEBHOOK HookTaskType = iota + 1
+ SERVICE
+)
+
+type PayloadAuthor struct {
+ Name string `json:"name"`
+ Email string `json:"email"`
+}
+
+type PayloadCommit struct {
+ Id string `json:"id"`
+ Message string `json:"message"`
+ Url string `json:"url"`
+ Author *PayloadAuthor `json:"author"`
+}
+
+type PayloadRepo struct {
+ Id int64 `json:"id"`
+ Name string `json:"name"`
+ Url string `json:"url"`
+ Description string `json:"description"`
+ Website string `json:"website"`
+ Watchers int `json:"watchers"`
+ Owner *PayloadAuthor `json:"author"`
+ Private bool `json:"private"`
+}
+
+// Payload represents a payload information of hook.
+type Payload struct {
+ Secret string `json:"secret"`
+ Ref string `json:"ref"`
+ Commits []*PayloadCommit `json:"commits"`
+ Repo *PayloadRepo `json:"repository"`
+ Pusher *PayloadAuthor `json:"pusher"`
+}
+
+// HookTask represents a hook task.
+type HookTask struct {
+ Id int64
+ Type HookTaskType
+ Url string
+ *Payload `xorm:"-"`
+ PayloadContent string `xorm:"TEXT"`
+ ContentType HookContentType
+ IsSsl bool
+ IsDeliveried bool
+}
+
+// CreateHookTask creates a new hook task,
+// it handles conversion from Payload to PayloadContent.
+func CreateHookTask(t *HookTask) error {
+ data, err := json.Marshal(t.Payload)
+ if err != nil {
+ return err
+ }
+ t.PayloadContent = string(data)
+ _, err = orm.Insert(t)
+ return err
+}
+
+// UpdateHookTask updates information of hook task.
+func UpdateHookTask(t *HookTask) error {
+ _, err := orm.AllCols().Update(t)
+ return err
+}
+
+// DeliverHooks checks and delivers undelivered hooks.
+func DeliverHooks() {
+ timeout := time.Duration(setting.WebhookDeliverTimeout) * time.Second
+ orm.Where("is_deliveried=?", false).Iterate(new(HookTask),
+ func(idx int, bean interface{}) error {
+ t := bean.(*HookTask)
+ // Only support JSON now.
+ if _, err := httplib.Post(t.Url).SetTimeout(timeout, timeout).
+ Body([]byte(t.PayloadContent)).Response(); err != nil {
+ log.Error("webhook.DeliverHooks(Delivery): %v", err)
+ return nil
+ }
+
+ t.IsDeliveried = true
+ if err := UpdateHookTask(t); err != nil {
+ log.Error("webhook.DeliverHooks(UpdateHookTask): %v", err)
+ return nil
+ }
+
+ log.Trace("Hook delivered: %s", t.PayloadContent)
+ return nil
+ })
+}
diff --git a/modules/bin/conf.go b/modules/bin/conf.go
index f2b3fb87..c07f87b7 100644
--- a/modules/bin/conf.go
+++ b/modules/bin/conf.go
@@ -1,11 +1,11 @@
package bin
import (
- "bytes"
- "compress/gzip"
- "fmt"
- "io"
- "strings"
+ "bytes"
+ "compress/gzip"
+ "fmt"
+ "io"
+ "strings"
)
func bindata_read(data []byte, name string) ([]byte, error) {
@@ -29,225 +29,230 @@ func conf_app_ini() ([]byte, error) {
return bindata_read([]byte{
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x00, 0xff, 0xb4, 0x58,
0xed, 0x72, 0xdb, 0xb8, 0xd5, 0xfe, 0xcf, 0xab, 0x40, 0xf4, 0xee, 0xbe,
- 0x9b, 0x74, 0x6c, 0x49, 0x76, 0x1a, 0x27, 0x6b, 0x6f, 0x66, 0x56, 0x96,
- 0x28, 0x9b, 0x8d, 0xf5, 0x11, 0x92, 0x76, 0x9a, 0x66, 0x3c, 0x1c, 0x9a,
- 0x84, 0x24, 0xd4, 0x24, 0x41, 0x13, 0x90, 0x15, 0xf5, 0x5f, 0x6f, 0xa1,
- 0xd3, 0xab, 0xe9, 0xf5, 0xf4, 0x47, 0x2f, 0xa3, 0xcf, 0x01, 0x49, 0x99,
- 0x52, 0xb4, 0xd9, 0xf4, 0x6b, 0x76, 0x27, 0x16, 0x81, 0x83, 0x83, 0x73,
- 0x9e, 0xf3, 0x8d, 0x33, 0xd6, 0xcb, 0x73, 0x96, 0x85, 0x29, 0x67, 0x7a,
- 0x11, 0x6a, 0xa6, 0x16, 0x72, 0xa5, 0x98, 0xcc, 0x18, 0x7f, 0xe4, 0xc5,
- 0x9a, 0xe5, 0xe1, 0x1c, 0x1b, 0x42, 0x27, 0xdc, 0xea, 0x4d, 0xa7, 0xc1,
- 0xb8, 0x37, 0xb2, 0xd9, 0x5b, 0x76, 0x21, 0xe7, 0xea, 0x14, 0xff, 0xb2,
- 0x0b, 0xa1, 0x99, 0xc7, 0x8b, 0x47, 0x11, 0x95, 0xfb, 0x57, 0x93, 0x8b,
- 0x09, 0xf6, 0x45, 0x3a, 0xef, 0xcc, 0x42, 0xac, 0xca, 0xac, 0x9d, 0x67,
- 0x73, 0xeb, 0x8c, 0xf5, 0x17, 0x61, 0x06, 0x4e, 0x20, 0x17, 0x33, 0xb6,
- 0x96, 0x4b, 0x56, 0x2c, 0x33, 0x96, 0xc8, 0x28, 0x4c, 0x92, 0xb5, 0xe5,
- 0x5e, 0x8f, 0x83, 0x6b, 0xcf, 0x76, 0x71, 0x72, 0x2e, 0x34, 0xa8, 0x6d,
- 0xa1, 0x17, 0xbc, 0x60, 0xad, 0x98, 0x3f, 0xb6, 0x0e, 0x58, 0x2b, 0x2f,
- 0x64, 0xdc, 0x62, 0x12, 0x0b, 0x9a, 0x2b, 0x8d, 0x95, 0x98, 0xcf, 0xc2,
- 0x65, 0x02, 0x5e, 0xaa, 0xa4, 0x31, 0x1c, 0x46, 0x93, 0x01, 0xc9, 0x86,
- 0x6f, 0xcb, 0xfa, 0x54, 0xf0, 0x5c, 0x2a, 0xa1, 0x65, 0xb1, 0xbe, 0xb5,
- 0xdc, 0xc9, 0xc4, 0xc7, 0x86, 0xe5, 0xf5, 0x5d, 0x67, 0xea, 0x07, 0xfe,
- 0xc7, 0x29, 0xd1, 0xdd, 0x85, 0x6a, 0x01, 0x42, 0x05, 0xe9, 0x79, 0x71,
- 0x6b, 0x4d, 0xdd, 0x89, 0x3f, 0xe9, 0x4f, 0xae, 0xb0, 0xb3, 0xd0, 0x3a,
- 0xb7, 0x06, 0x93, 0x51, 0xcf, 0x19, 0xe3, 0xcb, 0x08, 0xb9, 0x90, 0x4a,
- 0x1b, 0x3e, 0xc1, 0xb5, 0x4b, 0x24, 0xdf, 0x3f, 0xaf, 0xe9, 0x5f, 0xa8,
- 0xd3, 0x4e, 0xe7, 0xfb, 0xe7, 0x25, 0x39, 0x3e, 0xbe, 0x7f, 0x7e, 0xe9,
- 0xfb, 0xd3, 0x60, 0x3a, 0x71, 0xfd, 0x17, 0xaa, 0x63, 0x99, 0x8f, 0xde,
- 0x60, 0x40, 0xba, 0x59, 0x9b, 0x1d, 0x7c, 0xbc, 0xec, 0x76, 0xbb, 0x96,
- 0xe7, 0x5d, 0xd6, 0xdf, 0xc7, 0xc7, 0xd0, 0x7b, 0x20, 0x54, 0x78, 0x97,
- 0x70, 0xd6, 0x1f, 0x8c, 0x09, 0xff, 0x8c, 0x89, 0xac, 0xd6, 0x3e, 0x95,
- 0x31, 0xb7, 0x26, 0xc3, 0xe1, 0x95, 0x33, 0xb6, 0x6b, 0x55, 0x67, 0x61,
- 0xa2, 0xb8, 0x35, 0x70, 0xbc, 0xde, 0xf9, 0x95, 0x1d, 0xb8, 0x93, 0x6b,
- 0xdf, 0x76, 0xc9, 0x04, 0x9b, 0xad, 0x33, 0x76, 0xc1, 0x33, 0x5e, 0x84,
- 0x9a, 0x33, 0xa5, 0x79, 0xae, 0x4e, 0xb1, 0xf2, 0x1d, 0x8b, 0x62, 0x98,
- 0x55, 0x2f, 0x3a, 0x5a, 0x76, 0xe6, 0x30, 0x64, 0x27, 0x5a, 0x2a, 0x2d,
- 0xd3, 0x0e, 0xa9, 0xad, 0x0c, 0xc1, 0x5c, 0x1a, 0xf3, 0x7c, 0x77, 0x31,
- 0x21, 0x95, 0x3b, 0xaa, 0x88, 0x3a, 0xf9, 0xfd, 0xbc, 0x13, 0x15, 0xeb,
- 0x1c, 0x67, 0x74, 0xa2, 0x3a, 0xf3, 0x8a, 0x6d, 0x10, 0xf1, 0x42, 0xb7,
- 0x41, 0x7f, 0x18, 0x85, 0x6f, 0x75, 0xb1, 0xe4, 0xec, 0x30, 0x5e, 0x62,
- 0x43, 0xc8, 0xec, 0xed, 0x9b, 0xd7, 0x27, 0xdd, 0x45, 0x37, 0xed, 0x2a,
- 0x76, 0x48, 0xf0, 0xbd, 0x4d, 0xd7, 0xf4, 0xa7, 0xcd, 0x3f, 0x87, 0x69,
- 0x9e, 0xf0, 0x76, 0x24, 0x53, 0xab, 0x6f, 0xbb, 0x7e, 0x30, 0x74, 0xae,
- 0x48, 0x99, 0xa6, 0x14, 0x1d, 0xc3, 0x36, 0xe7, 0xa9, 0xf5, 0xce, 0xfe,
- 0xb8, 0x97, 0xe0, 0x9e, 0xaf, 0xcd, 0xfe, 0x19, 0xbb, 0xce, 0x73, 0xb8,
- 0x4a, 0x02, 0xb8, 0x12, 0x26, 0x67, 0x4c, 0x73, 0x70, 0x27, 0x85, 0xc3,
- 0x2c, 0x86, 0xd2, 0x10, 0x25, 0x62, 0x33, 0x01, 0x4c, 0x49, 0x65, 0x90,
- 0x37, 0x5c, 0x07, 0x3e, 0x66, 0x56, 0xd9, 0x0a, 0xce, 0xc6, 0x8d, 0x53,
- 0xd3, 0x32, 0xff, 0xcc, 0xa3, 0xa5, 0xe6, 0xb1, 0xe5, 0xf9, 0x3d, 0xdf,
- 0xe9, 0x07, 0xc6, 0xec, 0xd3, 0x9e, 0x7f, 0x49, 0x26, 0xb4, 0x3e, 0xc5,
- 0xa1, 0x0e, 0xe1, 0x3b, 0xfc, 0xb6, 0xe1, 0xa7, 0xe9, 0x5a, 0x3d, 0x24,
- 0xc6, 0x53, 0xa1, 0xe1, 0xbc, 0xe0, 0xaa, 0xf4, 0x56, 0x2c, 0x0a, 0xcd,
- 0x5f, 0x62, 0x43, 0xe8, 0x1f, 0x14, 0xb9, 0x7d, 0xc1, 0xa2, 0x85, 0xa4,
- 0x60, 0x19, 0x9c, 0xd7, 0x7e, 0x68, 0xce, 0x5a, 0x97, 0x13, 0x8f, 0xbc,
- 0xe0, 0xe8, 0xf8, 0x75, 0xbb, 0x8b, 0xff, 0x8e, 0x4e, 0x5f, 0xbe, 0xec,
- 0x9e, 0x58, 0x55, 0xb8, 0x91, 0x95, 0xac, 0x2a, 0x40, 0x0a, 0x29, 0xb5,
- 0x35, 0xed, 0x79, 0xde, 0x87, 0x01, 0x7b, 0x0b, 0x11, 0x86, 0x74, 0x51,
- 0xe3, 0xda, 0x2c, 0x59, 0x1f, 0x30, 0x5e, 0xc7, 0x4f, 0xe9, 0x4f, 0x24,
- 0x59, 0xc1, 0x1f, 0x96, 0xa2, 0xe0, 0xa5, 0x60, 0xf0, 0x78, 0x31, 0x5b,
- 0x1f, 0xce, 0x96, 0x49, 0xd2, 0x82, 0x13, 0x5e, 0x6d, 0x62, 0xa7, 0xa4,
- 0xaf, 0xd9, 0xd6, 0xf2, 0x1b, 0xae, 0x56, 0x05, 0x01, 0xe9, 0x6f, 0xfc,
- 0xa6, 0x1d, 0xdf, 0x01, 0x8e, 0x30, 0x4e, 0x45, 0x76, 0x6b, 0x02, 0x29,
- 0x5a, 0x16, 0x42, 0x23, 0xde, 0x9c, 0x31, 0x90, 0xbb, 0xba, 0x82, 0x27,
- 0xf6, 0xdf, 0x35, 0x5c, 0xf1, 0xd9, 0xb3, 0xfe, 0x65, 0x6f, 0x7c, 0x61,
- 0x33, 0xff, 0xd2, 0xf1, 0x98, 0x3f, 0x61, 0xef, 0x6c, 0x7b, 0xca, 0x3e,
- 0x4e, 0xae, 0x5d, 0x66, 0x74, 0x1b, 0xf4, 0xfc, 0x1e, 0xf3, 0x7a, 0x43,
- 0xfb, 0xd9, 0x33, 0xcb, 0xb3, 0xfb, 0xae, 0xed, 0x07, 0xb0, 0x3e, 0x18,
- 0x3c, 0xfb, 0xbf, 0x9f, 0x87, 0x03, 0xfb, 0x83, 0x8b, 0xff, 0xff, 0xff,
- 0x37, 0xcf, 0xc1, 0xa9, 0xb7, 0xd4, 0xf2, 0x30, 0x91, 0x73, 0x44, 0x47,
- 0xc1, 0x53, 0x9e, 0xde, 0x41, 0xd7, 0x38, 0x5c, 0x2b, 0x0b, 0xbe, 0xef,
- 0x8c, 0x03, 0xd7, 0x1e, 0xd9, 0xa3, 0x73, 0x84, 0xc2, 0xa0, 0xf7, 0xd1,
- 0xc3, 0xf9, 0xd7, 0x56, 0x7f, 0x32, 0x79, 0xe7, 0xd8, 0x26, 0xc7, 0x34,
- 0x20, 0x0d, 0xc2, 0x15, 0x57, 0x32, 0xe5, 0xf5, 0xf6, 0xe6, 0x5c, 0x93,
- 0x46, 0x64, 0x51, 0xc1, 0x63, 0x41, 0xa8, 0x94, 0xc9, 0x02, 0xd6, 0xbb,
- 0xb5, 0x7a, 0x7d, 0xdf, 0xb9, 0xb1, 0x83, 0x3e, 0x60, 0x0b, 0xae, 0xe8,
- 0xd7, 0xc8, 0x19, 0x23, 0xfa, 0xe8, 0xb6, 0xa3, 0x37, 0x5d, 0xcb, 0xb5,
- 0x3d, 0x9b, 0x7c, 0x86, 0xac, 0xf4, 0x8b, 0x44, 0x70, 0x5d, 0xf0, 0x63,
- 0x19, 0xe7, 0x31, 0xd3, 0x92, 0x21, 0x57, 0xce, 0x44, 0x91, 0x32, 0x7e,
- 0x98, 0x86, 0x22, 0x61, 0x33, 0x18, 0xa0, 0xe0, 0x73, 0xa1, 0x74, 0x19,
- 0x4e, 0xe0, 0x79, 0xe1, 0x78, 0x14, 0xe0, 0x36, 0x32, 0xcd, 0x15, 0xb8,
- 0x8e, 0x87, 0x8e, 0x3b, 0x6a, 0xe0, 0x3b, 0x90, 0x5c, 0xb1, 0x4c, 0x6a,
- 0x86, 0x9c, 0x2a, 0x57, 0xd5, 0x61, 0x5c, 0x40, 0x81, 0x60, 0xac, 0xc4,
- 0xa0, 0x89, 0x89, 0x8c, 0x28, 0x92, 0xcb, 0x4c, 0x97, 0x56, 0xdd, 0x64,
- 0x0f, 0xc3, 0xde, 0x85, 0xc7, 0x4f, 0xc6, 0x0d, 0xa6, 0x46, 0xc4, 0x14,
- 0x91, 0xc7, 0x94, 0x98, 0x9b, 0x7c, 0x04, 0x51, 0x1f, 0x05, 0x5f, 0x81,
- 0xed, 0x5a, 0x2f, 0x44, 0x36, 0x6f, 0x43, 0xb2, 0xf7, 0xd7, 0x8e, 0x6b,
- 0x07, 0x9e, 0x73, 0x31, 0x06, 0xfc, 0x37, 0x8e, 0xfd, 0xa1, 0xc1, 0xa1,
- 0x1f, 0x46, 0x88, 0xb3, 0xf0, 0x11, 0x6e, 0x03, 0x59, 0x14, 0xcb, 0x45,
- 0xa4, 0x97, 0x05, 0xb7, 0xec, 0xb1, 0xb9, 0xb7, 0xdf, 0xeb, 0x5f, 0xda,
- 0x41, 0xef, 0x06, 0xc6, 0x77, 0x1b, 0xa7, 0x46, 0x84, 0x01, 0x94, 0x11,
- 0x33, 0x11, 0x95, 0xfa, 0x57, 0xf4, 0xe3, 0x89, 0xef, 0x0c, 0x3f, 0x06,
- 0x84, 0xc1, 0x86, 0xdc, 0xfa, 0x44, 0x90, 0x51, 0x16, 0x2f, 0x89, 0x06,
- 0x0d, 0x46, 0xe7, 0xcb, 0xd9, 0xcc, 0xe4, 0x87, 0x6c, 0x8e, 0x48, 0x47,
- 0x82, 0x88, 0x50, 0x89, 0x32, 0x9e, 0x1c, 0xb0, 0x7b, 0xce, 0x73, 0x2a,
- 0x48, 0x90, 0x49, 0x98, 0x7c, 0x50, 0x55, 0xa6, 0x58, 0x66, 0x3f, 0x68,
- 0x76, 0x9f, 0x01, 0xc3, 0x15, 0x55, 0x44, 0xb3, 0xd9, 0x86, 0x4b, 0x8e,
- 0x07, 0xc1, 0xf9, 0xf5, 0x70, 0x48, 0x39, 0xd6, 0x26, 0x8c, 0x8e, 0xc8,
- 0x86, 0x63, 0xaa, 0x9c, 0x88, 0x1b, 0x24, 0x9d, 0x35, 0x0c, 0x09, 0x80,
- 0x8c, 0xf9, 0xca, 0x92, 0xe9, 0x5d, 0x9f, 0xff, 0xce, 0xee, 0xfb, 0xa6,
- 0x60, 0xd4, 0xe5, 0xf3, 0x85, 0xaa, 0xd5, 0x2b, 0x4b, 0x0f, 0x25, 0x69,
- 0x3a, 0x72, 0xca, 0x54, 0xaa, 0xf3, 0xf6, 0x9c, 0x7e, 0x53, 0x72, 0x3c,
- 0x7d, 0xf5, 0xe6, 0x35, 0xf6, 0xde, 0xbf, 0xaf, 0x36, 0x1e, 0x1e, 0xcc,
- 0xea, 0xf1, 0xab, 0x3a, 0x57, 0xd4, 0x6c, 0x66, 0x85, 0x4c, 0x61, 0xe0,
- 0x18, 0xf1, 0xaf, 0xac, 0xa1, 0x3b, 0x19, 0x3d, 0xed, 0x41, 0xf1, 0xa5,
- 0xf1, 0x31, 0x12, 0x92, 0xfc, 0x20, 0x0f, 0x95, 0x5a, 0xc9, 0x22, 0xae,
- 0xb3, 0xc9, 0x26, 0x93, 0x50, 0x66, 0x93, 0xe1, 0x52, 0x2f, 0xbe, 0xc4,
- 0xb0, 0xda, 0x68, 0xa3, 0x34, 0x2f, 0x96, 0x77, 0x5f, 0xee, 0xf7, 0xaf,
- 0x1c, 0x7b, 0xec, 0x07, 0x8e, 0xe1, 0x52, 0x7d, 0x94, 0xf1, 0x5b, 0x16,
- 0xdd, 0xc9, 0xd4, 0xb8, 0xbc, 0xc9, 0xdb, 0xa8, 0x95, 0x61, 0x2e, 0x2a,
- 0x56, 0xa4, 0x4f, 0x87, 0xe4, 0xb3, 0x7a, 0xd7, 0xfe, 0x65, 0x55, 0x59,
- 0x6b, 0xb2, 0x06, 0x89, 0x89, 0xf4, 0x8e, 0x11, 0xa2, 0x43, 0xff, 0xc8,
- 0x42, 0xfc, 0x89, 0x5b, 0xfe, 0xe4, 0x9d, 0x3d, 0xfe, 0xc6, 0x43, 0x51,
- 0x04, 0x6c, 0x02, 0x2d, 0xef, 0x79, 0x66, 0x99, 0xa2, 0xa8, 0x59, 0x94,
- 0x08, 0x8e, 0x18, 0x10, 0x71, 0x59, 0x28, 0x38, 0x62, 0x43, 0x1b, 0x28,
- 0xb1, 0x5f, 0xb3, 0x43, 0x48, 0x2a, 0x89, 0x52, 0x15, 0x53, 0x71, 0x91,
- 0x28, 0x33, 0x0a, 0xa5, 0x4e, 0xce, 0xcb, 0xe2, 0xd5, 0x41, 0x5d, 0xfe,
- 0x23, 0x8f, 0xf4, 0x06, 0x1e, 0xb3, 0xf3, 0x1f, 0xc3, 0xb3, 0x5a, 0xad,
- 0x2a, 0x56, 0x00, 0x4a, 0x99, 0x8b, 0x8c, 0x0e, 0x84, 0x93, 0xc8, 0x66,
- 0xb2, 0xcd, 0x8d, 0x7f, 0x7d, 0x33, 0x39, 0xa4, 0xa4, 0xf2, 0xb7, 0x0f,
- 0xe2, 0x2a, 0x0f, 0x6c, 0x29, 0x25, 0x4b, 0xc8, 0x8e, 0x0d, 0x97, 0xbd,
- 0x18, 0x7f, 0xf5, 0x54, 0x05, 0x71, 0x05, 0xc9, 0xc3, 0xc3, 0xbf, 0x0d,
- 0x07, 0x72, 0x98, 0x71, 0x7e, 0xf6, 0xf7, 0xbf, 0xfd, 0xe5, 0x1f, 0x7f,
- 0xfe, 0x2b, 0x25, 0xfd, 0x3d, 0x3e, 0x52, 0x84, 0xf9, 0xa2, 0x0a, 0x8c,
- 0x4a, 0x82, 0x76, 0xb7, 0xe1, 0x22, 0x67, 0x6c, 0xaf, 0x93, 0xec, 0x3d,
- 0x55, 0x4a, 0x8e, 0x13, 0x3c, 0x8b, 0xc8, 0x31, 0x56, 0x5c, 0xdc, 0xc9,
- 0x7d, 0xa8, 0xc1, 0x0f, 0xb2, 0xb6, 0xae, 0xcf, 0x47, 0x73, 0x71, 0x78,
- 0x57, 0x3b, 0xda, 0xf1, 0xaf, 0xb8, 0xe7, 0xd7, 0x8f, 0x6e, 0x39, 0x69,
- 0x85, 0xa0, 0x5e, 0x09, 0xad, 0xf7, 0x25, 0xb6, 0x7f, 0x01, 0xc6, 0x7d,
- 0x96, 0x47, 0x0c, 0x56, 0xac, 0x9f, 0x50, 0xf8, 0x15, 0xe1, 0x7f, 0xe1,
- 0xcc, 0x3e, 0xa9, 0x0d, 0x76, 0xff, 0x0b, 0x99, 0x0d, 0xe3, 0x86, 0xdd,
- 0xbe, 0x41, 0xe4, 0x2f, 0x8f, 0x6c, 0x4b, 0x1c, 0x51, 0x79, 0xda, 0xea,
- 0xe5, 0x78, 0x8a, 0xa9, 0xa1, 0x6c, 0x99, 0x90, 0xd7, 0xf1, 0x43, 0x96,
- 0xab, 0x86, 0x72, 0x67, 0xf8, 0xa8, 0x88, 0xad, 0xde, 0xa0, 0x37, 0xf5,
- 0x4d, 0x46, 0x2d, 0x57, 0xea, 0x0e, 0xaa, 0xda, 0xaf, 0xda, 0xb2, 0x8b,
- 0x3e, 0xea, 0x03, 0xf0, 0x7b, 0x0c, 0x13, 0x2a, 0x14, 0x48, 0x3a, 0x32,
- 0x8b, 0xd5, 0x16, 0xc7, 0x93, 0x2e, 0xda, 0x27, 0x70, 0xba, 0xe9, 0x91,
- 0x22, 0x27, 0xdd, 0x9a, 0x51, 0x29, 0x8b, 0xc9, 0x55, 0x4d, 0x59, 0xc0,
- 0x20, 0x43, 0x0e, 0x42, 0x7d, 0x64, 0xd4, 0x5c, 0x6f, 0xca, 0xc0, 0x19,
- 0x33, 0x07, 0x4e, 0x59, 0xeb, 0xf4, 0xa4, 0xfb, 0xf2, 0xc7, 0x16, 0x16,
- 0xea, 0x53, 0x58, 0x7b, 0xea, 0x32, 0x8f, 0x8e, 0x8e, 0x8f, 0x8e, 0x5a,
- 0x55, 0x45, 0x31, 0x0d, 0x8e, 0x52, 0x60, 0xb6, 0x1f, 0x0f, 0xca, 0x23,
- 0x4f, 0xb8, 0x94, 0xb0, 0x54, 0x8d, 0xef, 0x3e, 0x4c, 0x30, 0x21, 0xdd,
- 0x38, 0x03, 0x03, 0x8a, 0xc9, 0x40, 0x67, 0x6c, 0x5a, 0xc8, 0x47, 0x11,
- 0x83, 0xa9, 0xe9, 0x75, 0xe6, 0x4c, 0xe6, 0x24, 0xb9, 0x2a, 0x85, 0xc3,
- 0x99, 0x53, 0xd3, 0xbe, 0x2c, 0xc2, 0x47, 0x2a, 0x56, 0xeb, 0x9a, 0x6a,
- 0xcd, 0x69, 0x24, 0x24, 0x16, 0xa8, 0x84, 0xa5, 0x7c, 0x4f, 0x1d, 0x3d,
- 0x7a, 0xdd, 0xf6, 0xbc, 0x8d, 0x4e, 0x97, 0xba, 0xd2, 0x6a, 0x57, 0xb5,
- 0x9e, 0xf4, 0xaf, 0x78, 0x24, 0xe2, 0x9e, 0x97, 0x4b, 0x55, 0xd5, 0x35,
- 0x48, 0x1d, 0xb0, 0x5c, 0xca, 0xc4, 0x83, 0xfb, 0x1c, 0x6c, 0x2a, 0x63,
- 0xcd, 0xf0, 0x09, 0xa3, 0x93, 0x97, 0xaf, 0x7f, 0x3c, 0x38, 0xea, 0x76,
- 0x0f, 0x42, 0x8c, 0x13, 0x9f, 0x05, 0x37, 0x60, 0x92, 0xde, 0xa7, 0xe8,
- 0x10, 0x0f, 0xf1, 0xf7, 0x30, 0x2e, 0x04, 0x58, 0x76, 0xcc, 0x22, 0x8b,
- 0x55, 0x56, 0xdf, 0x8a, 0xde, 0x0d, 0x0d, 0x52, 0xcd, 0x91, 0x3a, 0xf7,
- 0xd3, 0xfa, 0x9a, 0x9f, 0x6b, 0x61, 0x03, 0x6d, 0x3a, 0xf4, 0x0d, 0x5a,
- 0x65, 0x63, 0x77, 0x51, 0x37, 0xda, 0xb5, 0x4a, 0xb8, 0xd3, 0xab, 0x74,
- 0x8f, 0xa4, 0xbc, 0x17, 0xdc, 0xd4, 0xf4, 0xba, 0x73, 0xad, 0x1a, 0x56,
- 0x11, 0x90, 0x9e, 0x01, 0xfa, 0x56, 0xa1, 0xe9, 0x84, 0x53, 0x36, 0x34,
- 0xa8, 0x05, 0x1b, 0xe0, 0xe0, 0x76, 0x26, 0x3a, 0x2a, 0x8f, 0x6c, 0xd8,
- 0xad, 0x8a, 0xd1, 0x92, 0x21, 0xc2, 0xf2, 0xda, 0xb5, 0x1b, 0x6d, 0x94,
- 0x9d, 0x99, 0xc1, 0x54, 0x51, 0xe5, 0x34, 0xf7, 0x6f, 0x9d, 0xa5, 0xc9,
- 0xaf, 0x6e, 0xd0, 0xa8, 0xf3, 0x2d, 0xb9, 0xe0, 0xb8, 0xd9, 0x78, 0x12,
- 0x1d, 0x01, 0xa0, 0x05, 0x5a, 0x91, 0x3a, 0x0a, 0xb6, 0x98, 0xbc, 0x39,
- 0xf9, 0x2d, 0x46, 0xe2, 0x8b, 0x7e, 0x50, 0x07, 0x40, 0xe0, 0x3b, 0x46,
- 0xad, 0x72, 0xe3, 0x89, 0x4b, 0x22, 0x66, 0xdc, 0xf0, 0xd9, 0x73, 0xdc,
- 0xb3, 0x3d, 0x0f, 0x1d, 0x2c, 0xfa, 0xed, 0xa1, 0xbd, 0x7b, 0x7e, 0x83,
- 0x41, 0x0c, 0x1f, 0x53, 0x0b, 0x36, 0x5b, 0x66, 0xd1, 0xc1, 0xc6, 0xcf,
- 0xd5, 0x22, 0x3c, 0x22, 0xef, 0xc6, 0xdf, 0xe3, 0x57, 0x27, 0x95, 0x7b,
- 0xc7, 0xaf, 0x5a, 0xcd, 0x3b, 0x88, 0x66, 0x73, 0x85, 0x33, 0x08, 0x2e,
- 0x7b, 0xde, 0xe5, 0xf0, 0x7a, 0xdc, 0xc7, 0x25, 0x66, 0xeb, 0x49, 0x46,
- 0x73, 0x01, 0x86, 0xd4, 0x2d, 0x11, 0xc9, 0x10, 0x05, 0x42, 0x18, 0xfd,
- 0x5a, 0xe9, 0x1a, 0xbb, 0xbc, 0xcc, 0xbc, 0x83, 0x30, 0xac, 0x7a, 0x64,
- 0x0a, 0x43, 0x9f, 0x86, 0xd4, 0x24, 0x8c, 0x38, 0x35, 0xde, 0xd5, 0xba,
- 0x71, 0x8d, 0xa7, 0x29, 0xaf, 0xf4, 0xe8, 0x52, 0xe2, 0x07, 0x91, 0x89,
- 0xe5, 0x4e, 0x40, 0x56, 0xfb, 0xb8, 0xcc, 0xbd, 0x71, 0xfa, 0x84, 0x48,
- 0xd5, 0x79, 0xd6, 0xbd, 0xff, 0x85, 0xbb, 0xd3, 0x7f, 0x5b, 0x9f, 0xd0,
- 0x3e, 0x95, 0x0f, 0x27, 0xd5, 0xe4, 0xdb, 0x48, 0x08, 0x55, 0x57, 0xd4,
- 0xcc, 0x08, 0x94, 0x86, 0x0c, 0x76, 0x68, 0x54, 0x4b, 0x39, 0xea, 0x29,
- 0x79, 0x47, 0x94, 0xfa, 0x6c, 0x39, 0x59, 0xc0, 0x95, 0xd2, 0x34, 0x24,
- 0xc5, 0x14, 0xcf, 0x43, 0xf3, 0x4c, 0x91, 0x82, 0x52, 0xe4, 0xf0, 0x34,
- 0x7a, 0xef, 0x50, 0x75, 0xe8, 0x54, 0xc7, 0x0e, 0x4c, 0xdc, 0xb7, 0xac,
- 0x6a, 0x5a, 0xad, 0x56, 0xff, 0x9b, 0x4d, 0xfe, 0x4e, 0x7f, 0xdf, 0x35,
- 0x7e, 0x53, 0x2b, 0xee, 0x17, 0x30, 0x03, 0xa9, 0x39, 0xe0, 0x77, 0xcb,
- 0x39, 0xfd, 0x70, 0xd0, 0x61, 0xd1, 0xdf, 0x0f, 0x61, 0x61, 0xf4, 0xb7,
- 0x8b, 0x42, 0x16, 0xf4, 0xa3, 0x8f, 0x49, 0x18, 0x83, 0xcb, 0x6e, 0x6a,
- 0x2c, 0x39, 0x58, 0x57, 0xf6, 0x8d, 0x4d, 0xe9, 0xdd, 0x7c, 0x5a, 0x75,
- 0x8a, 0xaf, 0xb1, 0x31, 0xaa, 0x97, 0xc3, 0x19, 0x99, 0xa1, 0x5d, 0xad,
- 0xdf, 0x6e, 0x8e, 0x6d, 0x4e, 0x18, 0x34, 0x76, 0xc9, 0x69, 0xb1, 0x41,
- 0x4b, 0x8f, 0x27, 0x75, 0x7e, 0xc0, 0x76, 0x39, 0xb9, 0xe3, 0x87, 0x71,
- 0x2d, 0x7a, 0xed, 0x30, 0x81, 0xad, 0x18, 0x8a, 0xa3, 0x4c, 0x61, 0x81,
- 0x98, 0xa8, 0x58, 0x21, 0x35, 0x7e, 0x3f, 0x57, 0xa8, 0xf7, 0x91, 0x01,
- 0x74, 0x26, 0x69, 0xa8, 0x84, 0xcb, 0xd6, 0x49, 0xfb, 0xc5, 0x97, 0x09,
- 0x00, 0xd3, 0x77, 0xe0, 0x4e, 0xfc, 0x9e, 0xdf, 0x88, 0xfc, 0x51, 0xf8,
- 0x19, 0xf1, 0x9a, 0x21, 0x5d, 0x2d, 0xcd, 0x98, 0x0e, 0x56, 0x0a, 0x5c,
- 0x60, 0x60, 0x92, 0x73, 0x8b, 0x87, 0x81, 0x1b, 0x80, 0x8f, 0x7a, 0xbf,
- 0x0f, 0xe8, 0x95, 0xcb, 0xab, 0x4d, 0x60, 0x8c, 0x40, 0x8c, 0x14, 0x32,
- 0x35, 0x02, 0x4d, 0xcc, 0xf4, 0xd7, 0xf8, 0x1c, 0xbf, 0x41, 0x39, 0x09,
- 0x33, 0x30, 0x64, 0x3f, 0xfd, 0x84, 0xaf, 0x03, 0x86, 0x78, 0x1e, 0x9d,
- 0x1b, 0xbe, 0x9e, 0xf3, 0x07, 0x64, 0xa8, 0x4b, 0x67, 0x68, 0x9e, 0xdc,
- 0xde, 0x98, 0x80, 0x9d, 0xa7, 0xd4, 0xef, 0x91, 0xd6, 0x31, 0x3a, 0xeb,
- 0xf5, 0x97, 0x7a, 0x0d, 0x30, 0x6b, 0x7e, 0xfc, 0x42, 0x33, 0xfb, 0x73,
- 0x2e, 0x50, 0x51, 0xcc, 0xc3, 0x03, 0x89, 0x43, 0x0c, 0x48, 0x96, 0xe7,
- 0x31, 0x4f, 0x38, 0x4d, 0xd9, 0x33, 0x1a, 0xbe, 0x53, 0x88, 0x4d, 0x14,
- 0xdb, 0x70, 0xbd, 0x36, 0xc2, 0x6c, 0x9e, 0x27, 0x1a, 0x1e, 0x90, 0xed,
- 0x33, 0x7f, 0xd6, 0xb0, 0xe7, 0x19, 0x73, 0x79, 0x55, 0xf5, 0xcb, 0x92,
- 0x4f, 0x0f, 0x05, 0xe5, 0x5b, 0x6d, 0x05, 0x48, 0x8a, 0x14, 0x14, 0xce,
- 0xf9, 0x9e, 0xe4, 0xee, 0xda, 0x28, 0x2e, 0x63, 0x0c, 0xa4, 0x01, 0x52,
- 0xce, 0xc8, 0x6b, 0xbe, 0x13, 0xfa, 0x38, 0x8f, 0x38, 0x2c, 0x36, 0xbc,
- 0x57, 0x0b, 0x9e, 0x35, 0xdb, 0x0b, 0x30, 0x49, 0x70, 0xdd, 0xd7, 0xb8,
- 0x36, 0xcb, 0x45, 0x15, 0x32, 0x3a, 0xca, 0x29, 0x1c, 0x96, 0x99, 0xf8,
- 0x5c, 0xe6, 0x85, 0x65, 0x9c, 0xef, 0xc4, 0x04, 0x91, 0x34, 0x5f, 0x5f,
- 0xf1, 0x0d, 0x06, 0x97, 0xcd, 0x6e, 0xa6, 0x7e, 0x3f, 0xdd, 0xbc, 0x4b,
- 0x99, 0x34, 0xb3, 0x83, 0x13, 0x2d, 0x6e, 0xe1, 0xf4, 0xb5, 0xc9, 0x7c,
- 0x5b, 0x84, 0x81, 0x08, 0xe7, 0x19, 0x2e, 0x14, 0x51, 0x0d, 0x5e, 0x39,
- 0x54, 0x9b, 0x34, 0xd9, 0x6a, 0x4c, 0xf1, 0x5f, 0x25, 0xdc, 0x19, 0xeb,
- 0xb7, 0xa7, 0xf4, 0x6f, 0x9f, 0xc4, 0x4b, 0x0b, 0x73, 0xea, 0x28, 0x90,
- 0xff, 0xa2, 0x30, 0x63, 0x77, 0xa4, 0x26, 0x27, 0xf8, 0xd0, 0x24, 0xf1,
- 0x2a, 0x27, 0x7e, 0x6a, 0x1d, 0xfd, 0xdc, 0x78, 0x4a, 0x6d, 0x1d, 0xb4,
- 0x8e, 0xb7, 0xbe, 0x6f, 0xc9, 0x2e, 0xb6, 0x73, 0x63, 0xbb, 0x5e, 0x13,
- 0xba, 0x4d, 0x5e, 0xde, 0x85, 0xef, 0xe9, 0x59, 0x73, 0x03, 0xe1, 0xc0,
- 0xa5, 0xe3, 0xa6, 0x59, 0x87, 0x81, 0xe9, 0xef, 0x3f, 0x03, 0x00, 0x00,
- 0xff, 0xff, 0x77, 0x1f, 0xe2, 0xa5, 0x2d, 0x18, 0x00, 0x00,
- },
+ 0x9b, 0x74, 0x6c, 0x49, 0x76, 0x1a, 0x27, 0x6b, 0x6f, 0x66, 0x96, 0x96,
+ 0x28, 0x9b, 0x8d, 0x25, 0x39, 0x24, 0xed, 0x34, 0xcd, 0x78, 0x38, 0x34,
+ 0x09, 0x49, 0xa8, 0x49, 0x82, 0x26, 0x20, 0x2b, 0xea, 0xbf, 0xde, 0x42,
+ 0xa7, 0x57, 0xd3, 0xeb, 0xe9, 0x8f, 0x5e, 0x46, 0x9f, 0x03, 0x92, 0x32,
+ 0xe5, 0x68, 0xb3, 0xe9, 0xd7, 0xec, 0x4e, 0x2c, 0x02, 0x07, 0x07, 0xe7,
+ 0x3c, 0xe7, 0x1b, 0x27, 0xcc, 0x2e, 0x0a, 0x96, 0x47, 0x19, 0x67, 0x7a,
+ 0x11, 0x69, 0xa6, 0x16, 0x72, 0xa5, 0x98, 0xcc, 0x19, 0x7f, 0xe0, 0xe5,
+ 0x9a, 0x15, 0xd1, 0x1c, 0x1b, 0x42, 0xa7, 0xdc, 0xb2, 0x2f, 0x2f, 0xc3,
+ 0x89, 0x3d, 0x76, 0xd8, 0x5b, 0x76, 0x26, 0xe7, 0xea, 0x18, 0xff, 0xb2,
+ 0x33, 0xa1, 0x99, 0xcf, 0xcb, 0x07, 0x11, 0x57, 0xfb, 0x17, 0xd3, 0xb3,
+ 0x29, 0xf6, 0x45, 0x36, 0xef, 0xcd, 0x22, 0xac, 0xca, 0xbc, 0x5b, 0xe4,
+ 0x73, 0xeb, 0x84, 0x0d, 0x16, 0x51, 0x0e, 0x4e, 0x20, 0x17, 0x33, 0xb6,
+ 0x96, 0x4b, 0x56, 0x2e, 0x73, 0x96, 0xca, 0x38, 0x4a, 0xd3, 0xb5, 0xe5,
+ 0x5d, 0x4d, 0xc2, 0x2b, 0xdf, 0xf1, 0x70, 0x72, 0x2e, 0x34, 0xa8, 0x1d,
+ 0xa1, 0x17, 0xbc, 0x64, 0x9d, 0x84, 0x3f, 0x74, 0xf6, 0x58, 0xa7, 0x28,
+ 0x65, 0xd2, 0x61, 0x12, 0x0b, 0x9a, 0x2b, 0x8d, 0x95, 0x84, 0xcf, 0xa2,
+ 0x65, 0x0a, 0x5e, 0xaa, 0xa2, 0x31, 0x1c, 0xc6, 0xd3, 0x21, 0xc9, 0x86,
+ 0x6f, 0xcb, 0xfa, 0x54, 0xf2, 0x42, 0x2a, 0xa1, 0x65, 0xb9, 0xbe, 0xb1,
+ 0xbc, 0xe9, 0x34, 0xc0, 0x86, 0xe5, 0x0f, 0x3c, 0xf7, 0x32, 0x08, 0x83,
+ 0x8f, 0x97, 0x44, 0x77, 0x1b, 0xa9, 0x05, 0x08, 0x15, 0xa4, 0xe7, 0xe5,
+ 0x8d, 0x75, 0xe9, 0x4d, 0x83, 0xe9, 0x60, 0x7a, 0x81, 0x9d, 0x85, 0xd6,
+ 0x85, 0x35, 0x9c, 0x8e, 0x6d, 0x77, 0x82, 0x2f, 0x23, 0xe4, 0x42, 0x2a,
+ 0x6d, 0xf8, 0x84, 0x57, 0x1e, 0x91, 0x7c, 0xff, 0xbc, 0xa1, 0x7f, 0xa1,
+ 0x8e, 0x7b, 0xbd, 0xef, 0x9f, 0x57, 0xe4, 0xf8, 0xf8, 0xfe, 0xf9, 0x79,
+ 0x10, 0x5c, 0x86, 0x97, 0x53, 0x2f, 0x78, 0xa1, 0x7a, 0x96, 0xf9, 0xb0,
+ 0x87, 0x43, 0xd2, 0xcd, 0xda, 0xec, 0xe0, 0xe3, 0x65, 0xbf, 0xdf, 0xb7,
+ 0x7c, 0xff, 0xbc, 0xf9, 0x3e, 0x3c, 0x84, 0xde, 0x43, 0xa1, 0xa2, 0xdb,
+ 0x94, 0xb3, 0xc1, 0x70, 0x42, 0xf8, 0xe7, 0x4c, 0xe4, 0x8d, 0xf6, 0x99,
+ 0x4c, 0xb8, 0x35, 0x1d, 0x8d, 0x2e, 0xdc, 0x89, 0xd3, 0xa8, 0x3a, 0x8b,
+ 0x52, 0xc5, 0xad, 0xa1, 0xeb, 0xdb, 0xa7, 0x17, 0x4e, 0xe8, 0x4d, 0xaf,
+ 0x02, 0xc7, 0x23, 0x13, 0x6c, 0xb6, 0x4e, 0xd8, 0x19, 0xcf, 0x79, 0x19,
+ 0x69, 0xce, 0x94, 0xe6, 0x85, 0x3a, 0xc6, 0xca, 0x77, 0x2c, 0x4e, 0x60,
+ 0x56, 0xbd, 0xe8, 0x69, 0xd9, 0x9b, 0xc3, 0x90, 0xbd, 0x78, 0xa9, 0xb4,
+ 0xcc, 0x7a, 0xa4, 0xb6, 0x32, 0x04, 0x73, 0x69, 0xcc, 0xf3, 0xdd, 0xd9,
+ 0x94, 0x54, 0xee, 0xa9, 0x32, 0xee, 0x15, 0x77, 0xf3, 0x5e, 0x5c, 0xae,
+ 0x0b, 0x9c, 0xd1, 0xa9, 0xea, 0xcd, 0x6b, 0xb6, 0x61, 0xcc, 0x4b, 0xdd,
+ 0x05, 0xfd, 0x7e, 0x1c, 0xbd, 0xd5, 0xe5, 0x92, 0xb3, 0xfd, 0x64, 0x89,
+ 0x0d, 0x21, 0xf3, 0xb7, 0x6f, 0x5e, 0x1f, 0xf5, 0x17, 0xfd, 0xac, 0xaf,
+ 0xd8, 0x3e, 0xc1, 0xf7, 0x36, 0x5b, 0xd3, 0x9f, 0x2e, 0xff, 0x1c, 0x65,
+ 0x45, 0xca, 0xbb, 0xb1, 0xcc, 0xac, 0x81, 0xe3, 0x05, 0xe1, 0xc8, 0xbd,
+ 0x20, 0x65, 0xda, 0x52, 0xf4, 0x0c, 0xdb, 0x82, 0x67, 0xd6, 0x3b, 0xe7,
+ 0xe3, 0x4e, 0x82, 0x3b, 0xbe, 0x36, 0xfb, 0x27, 0xec, 0xaa, 0x28, 0xe0,
+ 0x2a, 0x29, 0xe0, 0x4a, 0x99, 0x9c, 0x31, 0xcd, 0xc1, 0x9d, 0x14, 0x8e,
+ 0xf2, 0x04, 0x4a, 0x43, 0x94, 0x98, 0xcd, 0x04, 0x30, 0x25, 0x95, 0x41,
+ 0xde, 0x72, 0x1d, 0xf8, 0x98, 0x59, 0x65, 0x2b, 0x38, 0x1b, 0x37, 0x4e,
+ 0x4d, 0xcb, 0xfc, 0x33, 0x8f, 0x97, 0x9a, 0x27, 0x96, 0x1f, 0xd8, 0x81,
+ 0x3b, 0x08, 0x8d, 0xd9, 0x2f, 0xed, 0xe0, 0x9c, 0x4c, 0x68, 0x7d, 0x4a,
+ 0x22, 0x1d, 0xc1, 0x77, 0xf8, 0x4d, 0xcb, 0x4f, 0xb3, 0xb5, 0xba, 0x4f,
+ 0x8d, 0xa7, 0x42, 0xc3, 0x79, 0xc9, 0x55, 0xe5, 0xad, 0x58, 0x14, 0x9a,
+ 0xbf, 0xc4, 0x86, 0xd0, 0x3f, 0x28, 0x72, 0xfb, 0x92, 0xc5, 0x0b, 0x49,
+ 0xc1, 0x32, 0x3c, 0x6d, 0xfc, 0xd0, 0x9c, 0xb5, 0xce, 0xa7, 0x3e, 0x79,
+ 0xc1, 0xc1, 0xe1, 0xeb, 0x6e, 0x1f, 0xff, 0x1d, 0x1c, 0xbf, 0x7c, 0xd9,
+ 0x3f, 0xb2, 0xea, 0x70, 0x23, 0x2b, 0x59, 0x75, 0x80, 0x94, 0x52, 0x6a,
+ 0xeb, 0xd2, 0xf6, 0xfd, 0x0f, 0x43, 0xf6, 0x16, 0x22, 0x8c, 0xe8, 0xa2,
+ 0xd6, 0xb5, 0x79, 0xba, 0xde, 0x63, 0xbc, 0x89, 0x9f, 0xca, 0x9f, 0x48,
+ 0xb2, 0x92, 0xdf, 0x2f, 0x45, 0xc9, 0x2b, 0xc1, 0xe0, 0xf1, 0x62, 0xb6,
+ 0xde, 0x9f, 0x2d, 0xd3, 0xb4, 0x03, 0x27, 0xbc, 0xd8, 0xc4, 0x4e, 0x45,
+ 0xdf, 0xb0, 0x6d, 0xe4, 0x37, 0x5c, 0xad, 0x1a, 0x02, 0xd2, 0xdf, 0xf8,
+ 0x4d, 0x37, 0xb9, 0x05, 0x1c, 0x51, 0x92, 0x89, 0xfc, 0xc6, 0x04, 0x52,
+ 0xbc, 0x2c, 0x85, 0x46, 0xbc, 0xb9, 0x13, 0x20, 0x77, 0x71, 0x01, 0x4f,
+ 0x1c, 0xbc, 0x6b, 0xb9, 0xe2, 0xb3, 0x67, 0x83, 0x73, 0x7b, 0x72, 0xe6,
+ 0xb0, 0xe0, 0xdc, 0xf5, 0x59, 0x30, 0x65, 0xef, 0x1c, 0xe7, 0x92, 0x7d,
+ 0x9c, 0x5e, 0x79, 0xcc, 0xe8, 0x36, 0xb4, 0x03, 0x9b, 0xf9, 0xf6, 0xc8,
+ 0x79, 0xf6, 0xcc, 0xf2, 0x9d, 0x81, 0xe7, 0x04, 0x21, 0xac, 0x0f, 0x06,
+ 0xcf, 0xfe, 0xef, 0xe7, 0xd1, 0xd0, 0xf9, 0xe0, 0xe1, 0xff, 0xff, 0xff,
+ 0xcd, 0x73, 0x70, 0xb2, 0x97, 0x5a, 0xee, 0xa7, 0x72, 0x8e, 0xe8, 0x28,
+ 0x79, 0xc6, 0xb3, 0x5b, 0xe8, 0x9a, 0x44, 0x6b, 0x65, 0xc1, 0xf7, 0xdd,
+ 0x49, 0xe8, 0x39, 0x63, 0x67, 0x7c, 0x8a, 0x50, 0x18, 0xda, 0x1f, 0x7d,
+ 0x9c, 0x7f, 0x6d, 0x0d, 0xa6, 0xd3, 0x77, 0xae, 0x63, 0x72, 0x4c, 0x0b,
+ 0xd2, 0x30, 0x5a, 0x71, 0x25, 0x33, 0xde, 0x6c, 0x6f, 0xce, 0xb5, 0x69,
+ 0x44, 0x1e, 0x97, 0x3c, 0x11, 0x84, 0x4a, 0x95, 0x2c, 0x60, 0xbd, 0x1b,
+ 0xcb, 0x1e, 0x04, 0xee, 0xb5, 0x13, 0x0e, 0x00, 0x5b, 0x78, 0x41, 0xbf,
+ 0xc6, 0xee, 0x04, 0xd1, 0x47, 0xb7, 0x1d, 0xbc, 0xe9, 0x5b, 0x9e, 0xe3,
+ 0x3b, 0xe4, 0x33, 0x64, 0xa5, 0x5f, 0x24, 0x82, 0xeb, 0x82, 0x1f, 0xcb,
+ 0x39, 0x4f, 0x98, 0x96, 0x0c, 0xb9, 0x72, 0x26, 0xca, 0x8c, 0xf1, 0xfd,
+ 0x2c, 0x12, 0x29, 0x9b, 0xc1, 0x00, 0x25, 0x9f, 0x0b, 0xa5, 0xab, 0x70,
+ 0x02, 0xcf, 0x33, 0xd7, 0xa7, 0x00, 0x77, 0x90, 0x69, 0x2e, 0xc0, 0x75,
+ 0x32, 0x72, 0xbd, 0x71, 0x0b, 0xdf, 0xa1, 0xe4, 0x8a, 0xe5, 0x52, 0x33,
+ 0xe4, 0x54, 0xb9, 0xaa, 0x0f, 0xe3, 0x02, 0x0a, 0x04, 0x63, 0x25, 0x06,
+ 0x4d, 0x4c, 0x64, 0xc4, 0xb1, 0x5c, 0xe6, 0xba, 0xb2, 0xea, 0x26, 0x7b,
+ 0x18, 0xf6, 0x1e, 0x3c, 0x7e, 0x3a, 0x69, 0x31, 0x35, 0x22, 0x66, 0x88,
+ 0x3c, 0xa6, 0xc4, 0xdc, 0xe4, 0x23, 0x88, 0xfa, 0x20, 0xf8, 0x0a, 0x6c,
+ 0xd7, 0x7a, 0x21, 0xf2, 0x79, 0x17, 0x92, 0xbd, 0xbf, 0x72, 0x3d, 0x27,
+ 0xf4, 0xdd, 0xb3, 0x09, 0xe0, 0xbf, 0x76, 0x9d, 0x0f, 0x2d, 0x0e, 0x83,
+ 0x28, 0x46, 0x9c, 0x45, 0x0f, 0x70, 0x1b, 0xc8, 0xa2, 0x58, 0x21, 0x62,
+ 0xbd, 0x2c, 0xb9, 0xe5, 0x4c, 0xcc, 0xbd, 0x03, 0x7b, 0x70, 0xee, 0x84,
+ 0xf6, 0x35, 0x8c, 0xef, 0xb5, 0x4e, 0x8d, 0x09, 0x03, 0x28, 0x23, 0x66,
+ 0x22, 0xae, 0xf4, 0xaf, 0xe9, 0x27, 0xd3, 0xc0, 0x1d, 0x7d, 0x0c, 0x09,
+ 0x83, 0x0d, 0xb9, 0xf5, 0x69, 0xc5, 0x6f, 0x17, 0x52, 0xde, 0x51, 0x4c,
+ 0x0e, 0x4a, 0x14, 0x2f, 0x1d, 0xa9, 0x3b, 0x08, 0x0b, 0xf5, 0x1f, 0xa2,
+ 0x94, 0xa4, 0x86, 0xfa, 0x88, 0x69, 0x65, 0x05, 0xb6, 0xff, 0x2e, 0x74,
+ 0x27, 0xc0, 0xf1, 0xda, 0x26, 0x06, 0x07, 0x04, 0x1c, 0x4f, 0x05, 0x22,
+ 0x02, 0x65, 0x2e, 0xe3, 0x72, 0xa9, 0x89, 0x1c, 0xce, 0x2c, 0xf3, 0x44,
+ 0x59, 0x43, 0x87, 0x0c, 0xe7, 0x85, 0x81, 0x3b, 0x76, 0x90, 0x5e, 0x71,
+ 0xe0, 0x15, 0x6e, 0x23, 0x03, 0x51, 0xcd, 0xa8, 0x44, 0x1a, 0xb6, 0xc4,
+ 0x3e, 0x5d, 0xce, 0x66, 0x26, 0x1b, 0xe5, 0x73, 0xe4, 0x15, 0xa4, 0xa3,
+ 0x18, 0x75, 0x2f, 0xe7, 0xe9, 0x1e, 0xbb, 0xe3, 0xbc, 0xa0, 0xf2, 0x07,
+ 0x04, 0x84, 0xc9, 0x3e, 0x75, 0x1d, 0x4c, 0x64, 0xfe, 0x83, 0x66, 0x77,
+ 0x39, 0x2c, 0xb6, 0xa2, 0xfa, 0x6b, 0x36, 0xbb, 0x08, 0x80, 0xc9, 0x30,
+ 0x3c, 0xbd, 0x1a, 0x8d, 0x28, 0xa3, 0x3b, 0x64, 0x91, 0x03, 0xf2, 0x98,
+ 0x09, 0xd5, 0x69, 0x44, 0x29, 0x52, 0xdc, 0x1a, 0x6e, 0x43, 0x8a, 0x11,
+ 0x50, 0x55, 0x81, 0xf6, 0xaf, 0x4e, 0x7f, 0xe7, 0x0c, 0x02, 0x53, 0x9e,
+ 0x9a, 0x62, 0xfd, 0x42, 0x35, 0x60, 0x56, 0x85, 0x8e, 0x4a, 0x02, 0x1d,
+ 0x39, 0x66, 0x2a, 0xd3, 0x45, 0x77, 0x4e, 0xbf, 0x29, 0x15, 0x1f, 0xbf,
+ 0x7a, 0xf3, 0x1a, 0x7b, 0xef, 0xdf, 0xd7, 0x1b, 0xf7, 0xf7, 0x66, 0xf5,
+ 0xf0, 0x55, 0x93, 0x99, 0x1a, 0x36, 0xb3, 0x52, 0x66, 0x70, 0xa7, 0x04,
+ 0xd9, 0x46, 0x59, 0x23, 0x6f, 0x3a, 0x7e, 0xdc, 0x83, 0xe2, 0x4b, 0xe3,
+ 0xd1, 0x24, 0x24, 0x79, 0x5d, 0x11, 0x29, 0xb5, 0x92, 0x65, 0xd2, 0xe4,
+ 0xae, 0x4d, 0xde, 0xa2, 0x3c, 0x2a, 0xa3, 0xa5, 0x5e, 0x7c, 0x89, 0x61,
+ 0xbd, 0xd1, 0x45, 0x23, 0xb0, 0x58, 0xde, 0x7e, 0xb9, 0x3f, 0xb8, 0x70,
+ 0x9d, 0x49, 0x10, 0xba, 0x86, 0x4b, 0xfd, 0x51, 0x65, 0x8b, 0xaa, 0xc4,
+ 0x4f, 0x2f, 0x4d, 0x80, 0x99, 0x2a, 0x81, 0xca, 0x1c, 0x15, 0xa2, 0x66,
+ 0x45, 0xfa, 0xf4, 0x48, 0x3e, 0xcb, 0xbe, 0x0a, 0xce, 0xeb, 0x3a, 0xde,
+ 0x90, 0xb5, 0x48, 0x4c, 0x5e, 0xe9, 0x19, 0x21, 0x7a, 0xf4, 0x8f, 0x2c,
+ 0xc5, 0x9f, 0xb8, 0x15, 0x4c, 0xdf, 0x39, 0x93, 0x6f, 0x3c, 0x14, 0xc7,
+ 0xc0, 0x26, 0xd4, 0xf2, 0x8e, 0xe7, 0x96, 0x29, 0xc1, 0x9a, 0xc5, 0xa9,
+ 0xe0, 0x88, 0x38, 0x91, 0x54, 0x65, 0x89, 0x23, 0x12, 0xb5, 0x81, 0x12,
+ 0xfb, 0x0d, 0x3b, 0x78, 0x9c, 0x92, 0x28, 0x8c, 0x09, 0x95, 0x32, 0x89,
+ 0xa2, 0xa6, 0x50, 0x58, 0xe5, 0xbc, 0x2a, 0x95, 0x3d, 0x74, 0x01, 0x7f,
+ 0xe4, 0xb1, 0xde, 0xc0, 0x63, 0x76, 0xfe, 0x63, 0x78, 0x56, 0xab, 0x55,
+ 0xcd, 0x0a, 0x40, 0x29, 0x73, 0x91, 0xd1, 0x81, 0x70, 0x12, 0xf9, 0x4c,
+ 0x76, 0xb9, 0xf1, 0xaf, 0x6f, 0x26, 0x87, 0x94, 0x54, 0x6c, 0x77, 0x41,
+ 0x5c, 0x67, 0x9d, 0x2d, 0xa5, 0x64, 0x05, 0xd9, 0xa1, 0xe1, 0xb2, 0x13,
+ 0xe3, 0xaf, 0x9e, 0xaa, 0x21, 0xae, 0x21, 0xb9, 0xbf, 0xff, 0xb7, 0xe1,
+ 0x40, 0xc6, 0x34, 0xce, 0xcf, 0xfe, 0xfe, 0xb7, 0xbf, 0xfc, 0xe3, 0xcf,
+ 0x7f, 0xa5, 0x12, 0xb3, 0xc3, 0x47, 0xca, 0xa8, 0x58, 0xd4, 0x81, 0x51,
+ 0x4b, 0xd0, 0xed, 0xb7, 0x5c, 0xe4, 0x84, 0xed, 0x74, 0x92, 0x9d, 0xa7,
+ 0x2a, 0xc9, 0x71, 0x82, 0xe7, 0x31, 0x39, 0xc6, 0x8a, 0x8b, 0x5b, 0xb9,
+ 0x0b, 0x35, 0xf8, 0x41, 0xde, 0xd5, 0xcd, 0xf9, 0x78, 0x2e, 0xf6, 0x6f,
+ 0x1b, 0x47, 0x3b, 0xfc, 0x15, 0xf7, 0xfc, 0xfa, 0xd1, 0x2d, 0x27, 0xad,
+ 0x11, 0xd4, 0x2b, 0xa1, 0xf5, 0xae, 0xc4, 0xf6, 0x2f, 0xc0, 0xb8, 0xcb,
+ 0xf2, 0x88, 0xc1, 0x9a, 0xf5, 0x23, 0x0a, 0xbf, 0x22, 0xfc, 0x2f, 0x9c,
+ 0xd9, 0x25, 0xb5, 0xc1, 0xee, 0x7f, 0x21, 0xb3, 0x61, 0xdc, 0xb2, 0xdb,
+ 0x37, 0x88, 0xfc, 0xe5, 0x91, 0x6d, 0x89, 0x63, 0x2a, 0x86, 0x5b, 0x9d,
+ 0x23, 0xcf, 0x30, 0xa3, 0x54, 0x0d, 0x1a, 0xf2, 0x3a, 0x7e, 0xc8, 0x6a,
+ 0xd5, 0x50, 0x3e, 0x19, 0x75, 0x6a, 0x62, 0xcb, 0x1e, 0xda, 0x97, 0x81,
+ 0xc9, 0xa8, 0xd5, 0x4a, 0xd3, 0xaf, 0xd5, 0xfb, 0x75, 0x13, 0x78, 0x36,
+ 0xd8, 0xaa, 0x80, 0x75, 0x49, 0xdb, 0xe2, 0x78, 0xd4, 0xb7, 0x5a, 0xb5,
+ 0xf0, 0xa8, 0xdf, 0x30, 0xaa, 0x64, 0x31, 0xb9, 0xaa, 0x2d, 0x0b, 0x18,
+ 0xe4, 0xc8, 0x41, 0xa8, 0xc6, 0x8c, 0x5a, 0xf9, 0x4d, 0x19, 0x38, 0x61,
+ 0xe6, 0xc0, 0x31, 0xeb, 0x1c, 0x1f, 0xf5, 0x5f, 0xfe, 0xd8, 0xc1, 0x42,
+ 0x73, 0x0a, 0x6b, 0x8f, 0x3d, 0xed, 0xc1, 0xc1, 0xe1, 0xc1, 0x41, 0xa7,
+ 0xae, 0x28, 0xa6, 0x9d, 0x52, 0x0a, 0xcc, 0x76, 0xe3, 0x41, 0x79, 0xe4,
+ 0x11, 0x97, 0x0a, 0x96, 0xba, 0xcd, 0xde, 0x85, 0x09, 0xe6, 0xb1, 0x6b,
+ 0x77, 0x68, 0x40, 0x31, 0x19, 0xe8, 0x84, 0x5d, 0x96, 0xf2, 0x41, 0x24,
+ 0x60, 0x6a, 0x3a, 0xab, 0x39, 0x93, 0x05, 0x49, 0xae, 0x2a, 0xe1, 0x70,
+ 0xe6, 0xd8, 0x34, 0x4b, 0x8b, 0xe8, 0x81, 0x8a, 0xd5, 0xba, 0xa1, 0x5a,
+ 0x73, 0x1a, 0x40, 0x89, 0x05, 0x2a, 0x61, 0x25, 0xdf, 0xe3, 0xfc, 0x80,
+ 0xce, 0xba, 0x3b, 0xef, 0xa2, 0xaf, 0xa6, 0x1e, 0xb8, 0xde, 0x55, 0x9d,
+ 0x47, 0xfd, 0x6b, 0x1e, 0xa9, 0xb8, 0xe3, 0xd5, 0x52, 0x5d, 0x75, 0x0d,
+ 0x52, 0x7b, 0xac, 0x90, 0x32, 0xf5, 0xe1, 0x3e, 0x7b, 0x9b, 0xca, 0xd8,
+ 0x30, 0x7c, 0xc4, 0xe8, 0xe8, 0xe5, 0xeb, 0x1f, 0xf7, 0x0e, 0xfa, 0xfd,
+ 0xbd, 0x08, 0xc3, 0xcb, 0x67, 0xc1, 0x0d, 0x98, 0xa4, 0xf7, 0x31, 0xfa,
+ 0xd1, 0x7d, 0xfc, 0xdd, 0x4f, 0x4a, 0xea, 0x56, 0x7a, 0x66, 0x91, 0x25,
+ 0x2a, 0x6f, 0x6e, 0x45, 0xa7, 0x88, 0x76, 0xac, 0xe1, 0x48, 0x73, 0xc2,
+ 0x71, 0x73, 0xcd, 0xcf, 0x8d, 0xb0, 0xa1, 0x36, 0xf3, 0xc0, 0x06, 0xad,
+ 0xaa, 0x8d, 0x3c, 0x6b, 0xda, 0xfa, 0x46, 0x25, 0xdc, 0xe9, 0xd7, 0xba,
+ 0xc7, 0x68, 0xab, 0x04, 0x37, 0x35, 0xbd, 0xe9, 0x93, 0xeb, 0xf6, 0x58,
+ 0x84, 0xa4, 0x67, 0x88, 0x2e, 0x59, 0x68, 0x3a, 0xe1, 0x56, 0x0d, 0x0d,
+ 0x6a, 0xc1, 0x06, 0x38, 0xb8, 0x9d, 0x89, 0x8e, 0xda, 0x23, 0x5b, 0x76,
+ 0xab, 0x63, 0xb4, 0x62, 0x88, 0xb0, 0xbc, 0xf2, 0x9c, 0x56, 0x1b, 0xe5,
+ 0xe4, 0x66, 0x0c, 0x56, 0x54, 0x39, 0xcd, 0xfd, 0x5b, 0x67, 0x69, 0xce,
+ 0x6c, 0xda, 0x41, 0xea, 0xb3, 0x2b, 0x2e, 0x38, 0x6e, 0x36, 0x1e, 0x45,
+ 0x47, 0x00, 0x50, 0x4b, 0xb7, 0x89, 0x82, 0x2d, 0x26, 0x6f, 0x8e, 0x7e,
+ 0x8b, 0x01, 0xfc, 0x6c, 0xb0, 0x69, 0x06, 0x4d, 0x8f, 0x07, 0x26, 0xd5,
+ 0xc6, 0x23, 0x97, 0x54, 0xcc, 0xb8, 0xe1, 0xb3, 0xe3, 0xb8, 0xef, 0xf8,
+ 0x3e, 0xfa, 0x65, 0x74, 0xf7, 0x23, 0xe7, 0xe9, 0xf9, 0x0d, 0x06, 0x09,
+ 0x7c, 0x4c, 0x2d, 0xd8, 0x6c, 0x99, 0xc7, 0x7b, 0x1b, 0x3f, 0x57, 0x8b,
+ 0xe8, 0x80, 0xbc, 0x1b, 0x7f, 0x0f, 0x5f, 0x1d, 0xd5, 0xee, 0x9d, 0xbc,
+ 0xea, 0xb4, 0xef, 0x20, 0x9a, 0xcd, 0x15, 0xee, 0x30, 0x3c, 0xb7, 0xfd,
+ 0xf3, 0xd1, 0xd5, 0x64, 0x80, 0x4b, 0xcc, 0xd6, 0xa3, 0x8c, 0xe6, 0x02,
+ 0x8c, 0xc4, 0x5b, 0x22, 0x92, 0x21, 0x4a, 0x84, 0x30, 0xfa, 0xb5, 0xca,
+ 0x35, 0x9e, 0xf2, 0x32, 0xd3, 0x15, 0xc2, 0xb0, 0xee, 0xc8, 0x29, 0x0c,
+ 0x03, 0x1a, 0x89, 0xd3, 0x28, 0xe6, 0xd4, 0xe6, 0xd7, 0xeb, 0xc6, 0x35,
+ 0x1e, 0x67, 0xca, 0xca, 0xa3, 0x2b, 0x89, 0xef, 0x45, 0x2e, 0x96, 0x4f,
+ 0x02, 0xb2, 0xde, 0xc7, 0x65, 0xde, 0xb5, 0x3b, 0x20, 0x44, 0xea, 0xce,
+ 0xb3, 0x99, 0x34, 0xce, 0xbc, 0x27, 0xdd, 0xbe, 0xf5, 0x09, 0xed, 0x53,
+ 0xf5, 0x4c, 0x53, 0xcf, 0xd9, 0xad, 0x84, 0x50, 0x77, 0x45, 0xed, 0x8c,
+ 0x40, 0x69, 0xc8, 0x60, 0x87, 0x46, 0xb5, 0x92, 0xa3, 0x99, 0xc9, 0x9f,
+ 0x88, 0xd2, 0x9c, 0xad, 0xe6, 0x18, 0xb8, 0x52, 0x96, 0x45, 0xa4, 0x98,
+ 0xe2, 0x45, 0x64, 0x1e, 0x45, 0x32, 0x50, 0x8a, 0x02, 0x9e, 0x46, 0xaf,
+ 0x2b, 0xaa, 0x09, 0x9d, 0xfa, 0xd8, 0x9e, 0x89, 0xfb, 0x8e, 0x55, 0xcf,
+ 0xc6, 0xf5, 0xea, 0x7f, 0xb3, 0xc9, 0x7f, 0xd2, 0xdf, 0xf7, 0x8d, 0xdf,
+ 0x34, 0x8a, 0x07, 0x25, 0xcc, 0x40, 0x6a, 0x0e, 0xf9, 0xed, 0x72, 0x4e,
+ 0x3f, 0x5c, 0x74, 0x58, 0xf4, 0xf7, 0x43, 0x54, 0x1a, 0xfd, 0x9d, 0xb2,
+ 0x94, 0x25, 0xfd, 0x18, 0x60, 0xee, 0xc6, 0x98, 0xf4, 0x34, 0x35, 0x56,
+ 0x1c, 0xac, 0x0b, 0xe7, 0xda, 0xa1, 0xf4, 0x6e, 0x3e, 0xad, 0x26, 0xc5,
+ 0x37, 0xd8, 0x18, 0xd5, 0xab, 0x51, 0x90, 0xcc, 0xd0, 0xad, 0xd7, 0x6f,
+ 0x36, 0xc7, 0x36, 0x27, 0x0c, 0x1a, 0x4f, 0xc9, 0x69, 0xb1, 0x45, 0x4b,
+ 0x4f, 0x35, 0x4d, 0x7e, 0xc0, 0x76, 0xf5, 0x4e, 0x80, 0x1f, 0xc6, 0xb5,
+ 0xe8, 0x6d, 0xc5, 0x04, 0xb6, 0x62, 0x28, 0x8e, 0x32, 0x83, 0x05, 0x12,
+ 0xa2, 0x62, 0xa5, 0xd4, 0xf8, 0xfd, 0x5c, 0xa1, 0xde, 0xc7, 0x06, 0xd0,
+ 0x99, 0xa4, 0x11, 0x16, 0x2e, 0xdb, 0x24, 0xed, 0x17, 0x5f, 0x26, 0x00,
+ 0xcc, 0xfa, 0xa1, 0x37, 0x0d, 0xec, 0xa0, 0x15, 0xf9, 0xe3, 0xe8, 0x33,
+ 0xe2, 0x35, 0x47, 0xba, 0x5a, 0x9a, 0x47, 0x01, 0xb0, 0x52, 0xe0, 0x02,
+ 0x03, 0x93, 0x9c, 0x5b, 0x3c, 0x0c, 0xdc, 0x00, 0x7c, 0x6c, 0xff, 0x3e,
+ 0xa4, 0x37, 0x35, 0xbf, 0x31, 0x81, 0x31, 0x02, 0x31, 0x52, 0xc8, 0xd4,
+ 0x08, 0x34, 0x31, 0xd3, 0x5f, 0xe3, 0x73, 0xf8, 0x06, 0xe5, 0x24, 0xca,
+ 0xc1, 0x90, 0xfd, 0xf4, 0x13, 0xbe, 0xf6, 0x18, 0xe2, 0x79, 0x7c, 0x6a,
+ 0xf8, 0xfa, 0xee, 0x1f, 0x90, 0xa1, 0xce, 0xdd, 0x91, 0x79, 0xe0, 0x7b,
+ 0x63, 0x02, 0x76, 0x9e, 0x51, 0xbf, 0x47, 0x5a, 0x27, 0xe8, 0xac, 0xd7,
+ 0x5f, 0xea, 0x35, 0xc4, 0x64, 0xfb, 0xf1, 0x0b, 0xcd, 0x9c, 0xcf, 0x85,
+ 0x40, 0x45, 0x31, 0xcf, 0x1c, 0x24, 0x0e, 0x31, 0x20, 0x59, 0x9e, 0x27,
+ 0x3c, 0xe5, 0x34, 0xd3, 0xcf, 0x68, 0xd4, 0xcf, 0x20, 0x36, 0x51, 0x6c,
+ 0xc3, 0xf5, 0xda, 0x08, 0xb3, 0x79, 0x0c, 0x69, 0x79, 0x40, 0xbe, 0xcb,
+ 0xfc, 0x79, 0xcb, 0x9e, 0x27, 0xcc, 0xe3, 0x75, 0xd5, 0xaf, 0x4a, 0x3e,
+ 0x3d, 0x4b, 0x54, 0x2f, 0xc3, 0x35, 0x20, 0x19, 0x52, 0x50, 0x34, 0xe7,
+ 0x3b, 0x92, 0xbb, 0xe7, 0xa0, 0xb8, 0x4c, 0x30, 0x90, 0x86, 0x48, 0x39,
+ 0x63, 0xbf, 0xfd, 0x2a, 0x19, 0xe0, 0x3c, 0xe2, 0xb0, 0xdc, 0xf0, 0x5e,
+ 0x2d, 0x78, 0xde, 0x6e, 0x2f, 0xc0, 0x24, 0xc5, 0x75, 0x5f, 0xe3, 0xda,
+ 0x2e, 0x17, 0x75, 0xc8, 0xe8, 0xb8, 0xa0, 0x70, 0x58, 0xe6, 0xe2, 0x73,
+ 0x95, 0x17, 0x96, 0x49, 0xf1, 0x24, 0x26, 0x88, 0xa4, 0xfd, 0xd6, 0x8b,
+ 0x6f, 0x30, 0x38, 0x6f, 0x77, 0x33, 0xcd, 0x6b, 0xed, 0xe6, 0x15, 0xcc,
+ 0xa4, 0x99, 0x27, 0x38, 0xd1, 0xe2, 0x16, 0x4e, 0x5f, 0x9b, 0xcc, 0xb7,
+ 0x45, 0x18, 0x8a, 0x68, 0x9e, 0xe3, 0x42, 0x11, 0x37, 0xe0, 0x55, 0x43,
+ 0xb5, 0x49, 0x93, 0x9d, 0xd6, 0x14, 0xff, 0x55, 0xc2, 0x27, 0x63, 0xfd,
+ 0xf6, 0x94, 0xfe, 0xed, 0x93, 0x78, 0x65, 0x61, 0x4e, 0x1d, 0x05, 0xf2,
+ 0x5f, 0x1c, 0xe5, 0xec, 0x96, 0xd4, 0xe4, 0x04, 0x1f, 0x9a, 0x24, 0x5e,
+ 0xe7, 0xc4, 0x4f, 0x9d, 0x83, 0x9f, 0x5b, 0x0f, 0xb7, 0x9d, 0xbd, 0xce,
+ 0xe1, 0xd6, 0xf7, 0x0d, 0xd9, 0xc5, 0xa1, 0xa7, 0x12, 0xbf, 0x0d, 0xdd,
+ 0x26, 0x2f, 0x3f, 0x85, 0xef, 0xf1, 0x11, 0x75, 0x03, 0xe1, 0xd0, 0xa3,
+ 0xe3, 0xa6, 0x59, 0x87, 0x81, 0xe9, 0xef, 0x3f, 0x03, 0x00, 0x00, 0xff,
+ 0xff, 0x20, 0xc7, 0xce, 0x30, 0x9b, 0x18, 0x00, 0x00,
+ },
"conf/app.ini",
)
}
@@ -893,7 +898,7 @@ func conf_content_git_bare_zip() ([]byte, error) {
0x28, 0x3f, 0xfe, 0xba, 0x0a, 0x40, 0x72, 0xf5, 0xcf, 0xf9, 0x6a, 0x9b,
0x11, 0xa6, 0xf9, 0x31, 0xfa, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x01,
0x81, 0x55, 0x99, 0xb6, 0x26, 0x00, 0x00,
- },
+ },
"conf/content/git-bare.zip",
)
}
@@ -946,7 +951,7 @@ func conf_etc_supervisord_conf() ([]byte, error) {
0x8d, 0x88, 0x90, 0x28, 0xbf, 0x3f, 0xd4, 0xfe, 0xe7, 0x05, 0xbd, 0x28,
0xc2, 0x24, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xbc, 0x75, 0xb0, 0x31,
0xf7, 0x04, 0x00, 0x00,
- },
+ },
"conf/etc/supervisord.conf",
)
}
@@ -970,7 +975,7 @@ func conf_gitignore_android() ([]byte, error) {
0xb8, 0xa3, 0xb5, 0xe2, 0x2c, 0x81, 0x0c, 0xe2, 0x75, 0xc9, 0xf2, 0x07,
0x2f, 0x5e, 0x58, 0x0b, 0x39, 0x3d, 0xa4, 0xf9, 0x3f, 0x00, 0x00, 0xff,
0xff, 0x00, 0x96, 0x67, 0x2c, 0x0e, 0x01, 0x00, 0x00,
- },
+ },
"conf/gitignore/Android",
)
}
@@ -989,7 +994,7 @@ func conf_gitignore_c() ([]byte, error) {
0xeb, 0x8e, 0x79, 0xeb, 0x31, 0x1d, 0x73, 0xb8, 0xa3, 0x8d, 0x6e, 0xdd,
0xea, 0xd7, 0xf5, 0x1f, 0x00, 0x00, 0xff, 0xff, 0xca, 0x54, 0xa9, 0x22,
0x8f, 0x00, 0x00, 0x00,
- },
+ },
"conf/gitignore/C",
)
}
@@ -1065,7 +1070,7 @@ func conf_gitignore_c_sharp() ([]byte, error) {
0x8b, 0x52, 0xd1, 0xf6, 0x63, 0x0e, 0x6e, 0xd8, 0x98, 0xaa, 0x6a, 0xd8,
0xb4, 0xfb, 0xc9, 0x76, 0x55, 0xfd, 0xd7, 0x1f, 0x9f, 0xfe, 0x0b, 0x00,
0x00, 0xff, 0xff, 0xfe, 0xac, 0xdb, 0x69, 0xf1, 0x05, 0x00, 0x00,
- },
+ },
"conf/gitignore/C Sharp",
)
}
@@ -1081,7 +1086,7 @@ func conf_gitignore_c_() ([]byte, error) {
0x5c, 0x92, 0x58, 0x82, 0xa6, 0x32, 0x27, 0x31, 0x13, 0x4c, 0x02, 0x89,
0x44, 0x2e, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0xa4, 0xe6, 0x21, 0x26,
0x7e, 0x00, 0x00, 0x00,
- },
+ },
"conf/gitignore/C++",
)
}
@@ -1106,7 +1111,7 @@ func conf_gitignore_google_go() ([]byte, error) {
0x22, 0xd5, 0x42, 0x03, 0xe7, 0x8f, 0xcc, 0x91, 0xf3, 0x76, 0xe7, 0x08,
0x5a, 0xe9, 0x27, 0x00, 0x00, 0xff, 0xff, 0x3c, 0xab, 0x59, 0x6f, 0xfb,
0x00, 0x00, 0x00,
- },
+ },
"conf/gitignore/Google Go",
)
}
@@ -1128,7 +1133,7 @@ func conf_gitignore_java() ([]byte, error) {
0xc4, 0xd9, 0x51, 0x29, 0x52, 0x96, 0x20, 0x55, 0xb3, 0x54, 0x7b, 0x4f,
0x6c, 0x82, 0x2e, 0x7d, 0x5c, 0x72, 0x5c, 0xc7, 0x47, 0x00, 0x00, 0x00,
0xff, 0xff, 0xe7, 0xd6, 0xf7, 0xa4, 0xbc, 0x00, 0x00, 0x00,
- },
+ },
"conf/gitignore/Java",
)
}
@@ -1153,7 +1158,7 @@ func conf_gitignore_objective_c() ([]byte, error) {
0xc9, 0x07, 0xae, 0xa1, 0xb9, 0x4c, 0x22, 0x3f, 0x5b, 0x4d, 0x65, 0x7b,
0x3d, 0x9f, 0x60, 0x5c, 0x71, 0xf9, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xa9,
0x17, 0x4f, 0x2a, 0x18, 0x01, 0x00, 0x00,
- },
+ },
"conf/gitignore/Objective-C",
)
}
@@ -1180,7 +1185,7 @@ func conf_gitignore_python() ([]byte, error) {
0x78, 0xeb, 0xf6, 0x9c, 0x58, 0x85, 0x7f, 0x28, 0x58, 0x2b, 0xb6, 0xa6,
0x1c, 0xdd, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x02, 0xf0, 0xe2, 0xc0,
0x3a, 0x01, 0x00, 0x00,
- },
+ },
"conf/gitignore/Python",
)
}
@@ -1200,7 +1205,7 @@ func conf_gitignore_ruby() ([]byte, error) {
0x41, 0xb1, 0xbc, 0x23, 0x4d, 0xdf, 0x7d, 0xf0, 0x88, 0x6c, 0xbf, 0x3b,
0xf1, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb1, 0xca, 0xf7, 0x91, 0x9e,
0x00, 0x00, 0x00,
- },
+ },
"conf/gitignore/Ruby",
)
}
@@ -2189,7 +2194,7 @@ func conf_license_affero_gpl() ([]byte, error) {
0x42, 0xc2, 0x5f, 0x88, 0x57, 0x1b, 0xd8, 0x89, 0x3e, 0x15, 0x0e, 0xb8,
0x30, 0xdf, 0x60, 0x88, 0xff, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x0c, 0xd2,
0xa8, 0x4c, 0xc3, 0x86, 0x00, 0x00,
- },
+ },
"conf/license/Affero GPL",
)
}
@@ -2527,7 +2532,7 @@ func conf_license_apache_v2_license() ([]byte, error) {
0x37, 0x23, 0x02, 0x0e, 0x94, 0x00, 0x65, 0xa1, 0x3f, 0x7d, 0xb3, 0x2f,
0x4c, 0x4b, 0x32, 0x5f, 0x77, 0xe7, 0xe7, 0x9a, 0xff, 0x6f, 0x00, 0x00,
0x00, 0xff, 0xff, 0xa8, 0x76, 0x8d, 0x12, 0x3b, 0x2c, 0x00, 0x00,
- },
+ },
"conf/license/Apache v2 License",
)
}
@@ -2809,7 +2814,7 @@ func conf_license_artistic_license_2_0() ([]byte, error) {
0xdd, 0x89, 0x97, 0xd6, 0xcf, 0xf7, 0x8f, 0x92, 0x0f, 0xb9, 0xfb, 0x77,
0x00, 0x00, 0x00, 0xff, 0xff, 0xaf, 0x26, 0x8b, 0xf2, 0xb7, 0x22, 0x00,
0x00,
- },
+ },
"conf/license/Artistic License 2.0",
)
}
@@ -2883,7 +2888,7 @@ func conf_license_bsd_3_clause_license() ([]byte, error) {
0x95, 0xb8, 0xec, 0x49, 0x8a, 0xac, 0xd8, 0xd0, 0x39, 0xee, 0xdb, 0xbf,
0x02, 0x00, 0x00, 0xff, 0xff, 0x84, 0xcd, 0xba, 0x22, 0xc1, 0x05, 0x00,
0x00,
- },
+ },
"conf/license/BSD (3-Clause) License",
)
}
@@ -3459,7 +3464,7 @@ func conf_license_gpl_v2() ([]byte, error) {
0x4d, 0xee, 0x25, 0x41, 0xb2, 0x70, 0x4f, 0xe6, 0xf0, 0xef, 0xb7, 0x30,
0xc7, 0xff, 0x7e, 0x8b, 0x83, 0x22, 0xe6, 0xff, 0x06, 0x00, 0x00, 0xff,
0xff, 0x82, 0x4d, 0xf9, 0x2b, 0x69, 0x46, 0x00, 0x00,
- },
+ },
"conf/license/GPL v2",
)
}
@@ -3521,7 +3526,7 @@ func conf_license_mit_license() ([]byte, error) {
0x42, 0x26, 0x78, 0x8e, 0x5c, 0x15, 0x81, 0x29, 0xe2, 0xdb, 0xf0, 0xd3,
0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x49, 0x86, 0xab, 0x31, 0x29, 0x04,
0x00, 0x00,
- },
+ },
"conf/license/MIT License",
)
}
@@ -3537,7 +3542,7 @@ func conf_mysql_sql() ([]byte, error) {
0xa1, 0xe0, 0xec, 0xef, 0xe3, 0x03, 0xd2, 0x06, 0xe2, 0xc4, 0xa7, 0xa7,
0xe6, 0xa5, 0x16, 0x25, 0xe6, 0xc4, 0x27, 0x67, 0x5a, 0x73, 0x01, 0x02,
0x00, 0x00, 0xff, 0xff, 0xcd, 0xf5, 0x53, 0x80, 0x6d, 0x00, 0x00, 0x00,
- },
+ },
"conf/mysql.sql",
)
}
@@ -3557,12 +3562,11 @@ func conf_supervisor_ini() ([]byte, error) {
0xa1, 0xed, 0x82, 0x8e, 0x38, 0x6f, 0x11, 0x92, 0x13, 0x67, 0x75, 0xe7,
0xeb, 0xe5, 0xe4, 0x86, 0xef, 0xd7, 0xc1, 0x18, 0xfa, 0x04, 0x00, 0x00,
0xff, 0xff, 0x61, 0x60, 0x15, 0x6f, 0xc9, 0x00, 0x00, 0x00,
- },
+ },
"conf/supervisor.ini",
)
}
-
// Asset loads and returns the asset for the given name.
// It returns an error if the asset could not be found or
// could not be loaded.
@@ -3584,7 +3588,7 @@ func AssetNames() []string {
}
// _bindata is a table, holding each asset generator, mapped to its name.
-var _bindata = map[string] func() ([]byte, error) {
+var _bindata = map[string]func() ([]byte, error){
"conf/app.ini": conf_app_ini,
"conf/content/git-bare.zip": conf_content_git_bare_zip,
"conf/etc/supervisord.conf": conf_etc_supervisord_conf,
diff --git a/modules/cron/cron.go b/modules/cron/cron.go
index 27b1fc41..c06e649b 100644
--- a/modules/cron/cron.go
+++ b/modules/cron/cron.go
@@ -5,13 +5,17 @@
package cron
import (
+ "fmt"
+
"github.com/robfig/cron"
"github.com/gogits/gogs/models"
+ "github.com/gogits/gogs/modules/setting"
)
func NewCronContext() {
c := cron.New()
c.AddFunc("@every 1h", models.MirrorUpdate)
+ c.AddFunc(fmt.Sprintf("@every %dm", setting.WebhookTaskInterval), models.DeliverHooks)
c.Start()
}
diff --git a/modules/hooks/hooks.go b/modules/hooks/hooks.go
deleted file mode 100644
index 6ae4418b..00000000
--- a/modules/hooks/hooks.go
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright 2014 The Gogs Authors. All rights reserved.
-// Use of this source code is governed by a MIT-style
-// license that can be found in the LICENSE file.
-
-package hooks
-
-import (
- "encoding/json"
- "time"
-
- "github.com/gogits/gogs/modules/httplib"
- "github.com/gogits/gogs/modules/log"
-)
-
-// Hook task types.
-const (
- HTT_WEBHOOK = iota + 1
- HTT_SERVICE
-)
-
-type PayloadAuthor struct {
- Name string `json:"name"`
- Email string `json:"email"`
-}
-
-type PayloadCommit struct {
- Id string `json:"id"`
- Message string `json:"message"`
- Url string `json:"url"`
- Author *PayloadAuthor `json:"author"`
-}
-
-type PayloadRepo struct {
- Id int64 `json:"id"`
- Name string `json:"name"`
- Url string `json:"url"`
- Description string `json:"description"`
- Website string `json:"website"`
- Watchers int `json:"watchers"`
- Owner *PayloadAuthor `json:"author"`
- Private bool `json:"private"`
-}
-
-// Payload represents payload information of hook.
-type Payload struct {
- Secret string `json:"secret"`
- Ref string `json:"ref"`
- Commits []*PayloadCommit `json:"commits"`
- Repo *PayloadRepo `json:"repository"`
- Pusher *PayloadAuthor `json:"pusher"`
-}
-
-// HookTask represents hook task.
-type HookTask struct {
- Type int
- Url string
- *Payload
- ContentType int
- IsSsl bool
-}
-
-var (
- taskQueue = make(chan *HookTask, 1000)
-)
-
-// AddHookTask adds new hook task to task queue.
-func AddHookTask(t *HookTask) {
- taskQueue <- t
-}
-
-func init() {
- go handleQueue()
-}
-
-func handleQueue() {
- for {
- select {
- case t := <-taskQueue:
- // Only support JSON now.
- data, err := json.MarshalIndent(t.Payload, "", "\t")
- if err != nil {
- log.Error("hooks.handleQueue(json): %v", err)
- continue
- }
-
- _, err = httplib.Post(t.Url).SetTimeout(5*time.Second, 5*time.Second).
- Body(data).Response()
- if err != nil {
- log.Error("hooks.handleQueue: Fail to deliver hook: %v", err)
- continue
- }
- log.Info("Hook delivered: %s", string(data))
- }
- }
-}
diff --git a/modules/setting/setting.go b/modules/setting/setting.go
index 2f64511a..73ec8ddd 100644
--- a/modules/setting/setting.go
+++ b/modules/setting/setting.go
@@ -53,6 +53,10 @@ var (
CookieUserName string
CookieRememberName string
+ // Webhook settings.
+ WebhookTaskInterval int
+ WebhookDeliverTimeout int
+
// Repository settings.
RepoRootPath string
ScriptType string
@@ -86,8 +90,7 @@ var (
RunUser string
)
-// WorkDir returns absolute path of work directory.
-func WorkDir() (string, error) {
+func ExecPath() (string, error) {
file, err := exec.LookPath(os.Args[0])
if err != nil {
return "", err
@@ -96,7 +99,13 @@ func WorkDir() (string, error) {
if err != nil {
return "", err
}
- return path.Dir(strings.Replace(p, "\\", "/", -1)), nil
+ return p, nil
+}
+
+// WorkDir returns absolute path of work directory.
+func WorkDir() (string, error) {
+ execPath, err := ExecPath()
+ return path.Dir(strings.Replace(execPath, "\\", "/", -1)), err
}
// NewConfigContext initializes configuration context.
@@ -187,9 +196,9 @@ var Service struct {
RequireSignInView bool
EnableCacheAvatar bool
NotifyMail bool
+ LdapAuth bool
ActiveCodeLives int
ResetPwdCodeLives int
- LdapAuth bool
}
func newService() {
@@ -390,6 +399,11 @@ func newNotifyMailService() {
log.Info("Notify Mail Service Enabled")
}
+func newWebhookService() {
+ WebhookTaskInterval = Cfg.MustInt("webhook", "TASK_INTERVAL", 1)
+ WebhookDeliverTimeout = Cfg.MustInt("webhook", "DELIVER_TIMEOUT", 5)
+}
+
func NewServices() {
newService()
newLogService()
@@ -398,4 +412,5 @@ func NewServices() {
newMailService()
newRegisterMailService()
newNotifyMailService()
+ newWebhookService()
}
diff --git a/public/css/gogs.css b/public/css/gogs.css
index 79fd4bf9..1e29eeba 100755
--- a/public/css/gogs.css
+++ b/public/css/gogs.css
@@ -10,7 +10,7 @@ body {
html, body {
height: 100%;
- font-family: Helvetica, Arial, sans-serif;
+ font-family: Arial, Helvetica, sans-serif;
}
/* override bs3 */
@@ -1643,7 +1643,7 @@ html, body {
vertical-align: top;
}
-#label-color-change-ipt2{
+#label-color-change-ipt2 {
margin-top: 1px;
}
@@ -1814,4 +1814,96 @@ html, body {
#release-preview {
margin: 6px 0;
+}
+
+/* organization */
+
+#body-nav.org-nav {
+ height: 140px;
+ padding: 16px 0;
+}
+
+.org-nav .org-logo {
+ margin-right: 16px;
+ width: 100px;
+ height: 100px;
+}
+
+.org-nav .org-name {
+ margin-top: 0;
+}
+
+.org-description {
+ font-size: 16px;
+}
+
+.org-meta li, .org-meta li a, .org-repo-update, .org-repo-status, .org-team-meta {
+ color: #888;
+}
+
+.org-meta li {
+ margin-right: 12px;
+}
+
+.org-meta li a:hover {
+ text-decoration: underline;
+}
+
+.org-meta .fa {
+ margin-left: 0;
+}
+
+.org-sidebar {
+ margin-top: -100px;
+}
+
+.org-panel .panel-heading {
+ font-size: 18px;
+}
+
+.org-repo-status {
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+}
+
+.org-repo-item {
+ border-bottom: 1px solid #DDD;
+ padding-bottom: 18px;
+}
+
+.org-member img {
+ width: 60px;
+ height: 60px;
+ border-radius: 4px;
+}
+
+.org-member {
+ display: inline-block;
+ padding: 2px;
+}
+
+.org-team-name {
+ font-size: 15px;
+ margin-bottom: 0;
+ color: #444;
+}
+
+.org-team {
+ border-bottom: 1px solid #DDD;
+ margin-bottom: 12px;
+}
+
+.org-team:last-child {
+ border: none;
+}
+
+.org-team a {
+ display: block;
+}
+
+.org-team a:hover {
+ text-decoration: none;
+}
+
+.org-team a:hover .org-team-name {
+ color: #0079bc !important;
} \ No newline at end of file
diff --git a/routers/admin/admin.go b/routers/admin/admin.go
index 6f8868a6..56eba88a 100644
--- a/routers/admin/admin.go
+++ b/routers/admin/admin.go
@@ -193,6 +193,9 @@ func Config(ctx *middleware.Context) {
ctx.Data["DbCfg"] = models.DbCfg
+ ctx.Data["WebhookTaskInterval"] = setting.WebhookTaskInterval
+ ctx.Data["WebhookDeliverTimeout"] = setting.WebhookDeliverTimeout
+
ctx.Data["MailerEnabled"] = false
if setting.MailService != nil {
ctx.Data["MailerEnabled"] = true
diff --git a/routers/admin/auths.go b/routers/admin/auths.go
index c4702afc..e0b99714 100644
--- a/routers/admin/auths.go
+++ b/routers/admin/auths.go
@@ -38,8 +38,8 @@ func NewAuthSourcePost(ctx *middleware.Context, form auth.AuthenticationForm) {
}
var u core.Conversion
- switch form.Type {
- case models.LT_LDAP:
+ switch models.LoginType(form.Type) {
+ case models.LDAP:
u = &models.LDAPConfig{
Ldapsource: ldap.Ldapsource{
Host: form.Host,
@@ -53,7 +53,7 @@ func NewAuthSourcePost(ctx *middleware.Context, form auth.AuthenticationForm) {
Name: form.AuthName,
},
}
- case models.LT_SMTP:
+ case models.SMTP:
u = &models.SMTPConfig{
Auth: form.SmtpAuth,
Host: form.SmtpHost,
@@ -66,14 +66,14 @@ func NewAuthSourcePost(ctx *middleware.Context, form auth.AuthenticationForm) {
}
var source = &models.LoginSource{
- Type: form.Type,
+ Type: models.LoginType(form.Type),
Name: form.AuthName,
IsActived: true,
AllowAutoRegister: form.AllowAutoRegister,
Cfg: u,
}
- if err := models.AddSource(source); err != nil {
+ if err := models.CreateSource(source); err != nil {
ctx.Handle(500, "admin.auths.NewAuth", err)
return
}
@@ -116,8 +116,8 @@ func EditAuthSourcePost(ctx *middleware.Context, form auth.AuthenticationForm) {
}
var config core.Conversion
- switch form.Type {
- case models.LT_LDAP:
+ switch models.LoginType(form.Type) {
+ case models.LDAP:
config = &models.LDAPConfig{
Ldapsource: ldap.Ldapsource{
Host: form.Host,
@@ -131,7 +131,7 @@ func EditAuthSourcePost(ctx *middleware.Context, form auth.AuthenticationForm) {
Name: form.AuthName,
},
}
- case models.LT_SMTP:
+ case models.SMTP:
config = &models.SMTPConfig{
Auth: form.SmtpAuth,
Host: form.SmtpHost,
@@ -147,7 +147,7 @@ func EditAuthSourcePost(ctx *middleware.Context, form auth.AuthenticationForm) {
Id: form.Id,
Name: form.AuthName,
IsActived: form.IsActived,
- Type: form.Type,
+ Type: models.LoginType(form.Type),
AllowAutoRegister: form.AllowAutoRegister,
Cfg: config,
}
diff --git a/routers/admin/user.go b/routers/admin/user.go
index fa98bd32..596fe7b1 100644
--- a/routers/admin/user.go
+++ b/routers/admin/user.go
@@ -51,12 +51,13 @@ func NewUserPost(ctx *middleware.Context, form auth.RegisterForm) {
Email: form.Email,
Passwd: form.Password,
IsActive: true,
- LoginType: models.LT_PLAIN,
+ LoginType: models.PLAIN,
}
if len(form.LoginType) > 0 {
fields := strings.Split(form.LoginType, "-")
- u.LoginType, _ = strconv.Atoi(fields[0])
+ tp, _ := strconv.Atoi(fields[0])
+ u.LoginType = models.LoginType(tp)
u.LoginSource, _ = strconv.ParseInt(fields[1], 10, 64)
u.LoginName = form.LoginName
fmt.Println(u.LoginType, u.LoginSource, u.LoginName)
diff --git a/routers/install.go b/routers/install.go
index f44391a4..eb0fc199 100644
--- a/routers/install.go
+++ b/routers/install.go
@@ -14,7 +14,6 @@ import (
"github.com/Unknwon/goconfig"
"github.com/go-martini/martini"
"github.com/go-xorm/xorm"
- qlog "github.com/qiniu/log"
"github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/auth"
@@ -56,7 +55,7 @@ func GlobalInit() {
if setting.InstallLock {
if err := models.NewEngine(); err != nil {
- qlog.Fatal(err)
+ log.Fatal("Fail to initialize ORM engine: %v", err)
}
models.HasEngine = true
diff --git a/routers/org/org.go b/routers/org/org.go
new file mode 100644
index 00000000..1c02e773
--- /dev/null
+++ b/routers/org/org.go
@@ -0,0 +1,11 @@
+package org
+
+import (
+ "github.com/go-martini/martini"
+ "github.com/gogits/gogs/modules/middleware"
+)
+
+func Organization(ctx *middleware.Context, params martini.Params) {
+ ctx.Data["Title"] = "Organization Name" + params["org"]
+ ctx.HTML(200, "org/org")
+}
diff --git a/routers/repo/setting.go b/routers/repo/setting.go
index 0232dbcf..ac9ce7c7 100644
--- a/routers/repo/setting.go
+++ b/routers/repo/setting.go
@@ -244,9 +244,9 @@ func WebHooksAddPost(ctx *middleware.Context, form auth.NewWebhookForm) {
return
}
- ct := models.CT_JSON
+ ct := models.JSON
if form.ContentType == "2" {
- ct = models.CT_FORM
+ ct = models.FORM
}
w := &models.Webhook{
@@ -259,8 +259,8 @@ func WebHooksAddPost(ctx *middleware.Context, form auth.NewWebhookForm) {
},
IsActive: form.Active,
}
- if err := w.SaveEvent(); err != nil {
- ctx.Handle(500, "setting.WebHooksAddPost(SaveEvent)", err)
+ if err := w.UpdateEvent(); err != nil {
+ ctx.Handle(500, "setting.WebHooksAddPost(UpdateEvent)", err)
return
} else if err := models.CreateWebhook(w); err != nil {
ctx.Handle(500, "setting.WebHooksAddPost(CreateWebhook)", err)
@@ -311,9 +311,9 @@ func WebHooksEditPost(ctx *middleware.Context, params martini.Params, form auth.
return
}
- ct := models.CT_JSON
+ ct := models.JSON
if form.ContentType == "2" {
- ct = models.CT_FORM
+ ct = models.FORM
}
w := &models.Webhook{
@@ -327,8 +327,8 @@ func WebHooksEditPost(ctx *middleware.Context, params martini.Params, form auth.
},
IsActive: form.Active,
}
- if err := w.SaveEvent(); err != nil {
- ctx.Handle(500, "setting.WebHooksEditPost(SaveEvent)", err)
+ if err := w.UpdateEvent(); err != nil {
+ ctx.Handle(500, "setting.WebHooksEditPost(UpdateEvent)", err)
return
} else if err := models.UpdateWebhook(w); err != nil {
ctx.Handle(500, "setting.WebHooksEditPost(WebHooksEditPost)", err)
diff --git a/templates/VERSION b/templates/VERSION
index 7ba2c25f..dc83da78 100644
--- a/templates/VERSION
+++ b/templates/VERSION
@@ -1 +1 @@
-0.4.2.0605 Alpha \ No newline at end of file
+0.4.3.0610 Alpha \ No newline at end of file
diff --git a/templates/admin/config.tmpl b/templates/admin/config.tmpl
index a8e9d1ae..583ee25e 100644
--- a/templates/admin/config.tmpl
+++ b/templates/admin/config.tmpl
@@ -91,6 +91,21 @@
<div class="panel panel-default">
<div class="panel-heading">
+ Webhook Configuration
+ </div>
+
+ <div class="panel-body">
+ <dl class="dl-horizontal admin-dl-horizontal">
+ <dt>Task Interval</dt>
+ <dd>{{.WebhookTaskInterval}} minutes</dd>
+ <dt>Deliver Timeout</dt>
+ <dd>{{.WebhookDeliverTimeout}} seconds</dd>
+ </dl>
+ </div>
+ </div>
+
+ <div class="panel panel-default">
+ <div class="panel-heading">
Mailer Configuration
</div>
diff --git a/templates/org/org.tmpl b/templates/org/org.tmpl
new file mode 100644
index 00000000..872e50be
--- /dev/null
+++ b/templates/org/org.tmpl
@@ -0,0 +1,85 @@
+{{template "base/head" .}}
+{{template "base/navbar" .}}
+<div id="body-nav" class="org-nav">
+ <div class="container clearfix">
+ <div class="col-md-8" id="org-nav-wrapper">
+ <img class="pull-left org-logo" src="https://avatars3.githubusercontent.com/u/6656686?s=140" alt="" width="100"/>
+ <div id="org-nav-info">
+ <h2 class="org-name">Organization Name</h2>
+ <p class="org-description">Gogs(Go Git Service) is a Self Hosted Git Service in the Go Programming Language.</p>
+ <ul class="org-meta list-inline">
+ <li><i class="fa fa-link"></i><a href="#">http://gogs.io</a></li>
+ <li><i class="fa fa-envelope"></i><a href="#">info@gogs.io</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+</div>
+<div id="body" class="container">
+ <div id="org">
+ <div class="org-main col-md-8">
+ <div class="org-toolbar clearfix">
+ <button class="btn pull-right btn-success"><i class="fa fa-plus"></i> New Repository</button>
+ </div>
+ <hr style="width: 100%;border-color: #DDD"/>
+ <div class="org-repo-list" id="org-repo-list">
+ <div class="org-repo-item">
+ <div class="org-repo-status pull-right">
+ <ul class="list-inline">
+ <li><strong>Go</strong></li>
+ <li><i class="i fa fa-star"></i><strong>6</strong></li>
+ <li><i class="fa fa-code-fork"></i><strong>2</strong></li>
+ </ul>
+ </div>
+ <h3 class="org-repo-name"><a href="#">gogs</a></h3>
+ <p class="org-repo-description">Gogs(Go Git Service) is a Self Hosted Git Service in the Go Programming Language.</p>
+ <p class="org-repo-update">Updated 17 hours ago</p>
+ </div>
+ <div class="org-repo-item">
+ <div class="org-repo-status pull-right">
+ <ul class="list-inline">
+ <li><strong>Go</strong></li>
+ <li><i class="i fa fa-star"></i><strong>6</strong></li>
+ <li><i class="fa fa-code-fork"></i><strong>2</strong></li>
+ </ul>
+ </div>
+ <h3 class="org-repo-name"><a href="#">gogs</a></h3>
+ <p class="org-repo-description">Gogs(Go Git Service) is a Self Hosted Git Service in the Go Programming Language.</p>
+ <p class="org-repo-update">Updated 17 hours ago</p>
+ </div>
+ </div>
+ </div>
+ <div class="org-sidebar col-md-4">
+ <div class="org-panel panel panel-default" id="org-sidebar-members">
+ <div class="panel-heading"><strong>Members</strong></div>
+ <div class="panel-body">
+ <a class="org-member" href="#" data-toggle="tooltip" title="username" data-placement="bottom"><img src="https://avatars3.githubusercontent.com/u/6656686?s=140" alt=""/></a>
+ <a class="org-member" href="#" data-toggle="tooltip" title="username" data-placement="bottom"><img src="https://avatars3.githubusercontent.com/u/6656686?s=140" alt=""/></a>
+ <a class="org-member" href="#" data-toggle="tooltip" title="username" data-placement="bottom"><img src="https://avatars3.githubusercontent.com/u/6656686?s=140" alt=""/></a>
+ </div>
+ </div>
+ <div class="org-panel panel panel-default" id="org-sidebar-teams">
+ <div class="panel-heading"><strong>Teams</strong></div>
+ <div class="panel-body">
+ <div class="org-team">
+ <a href="#">
+ <p class="org-team-name"><strong>Team name</strong></p>
+ <p class="org-team-meta">
+ 4 members · 10 repositories
+ </p>
+ </a>
+ </div>
+ <div class="org-team">
+ <a href="#">
+ <p class="org-team-name"><strong>Team name</strong></p>
+ <p class="org-team-meta">
+ 4 members · 10 repositories
+ </p>
+ </a>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+{{template "base/footer" .}}
diff --git a/templates/repo/nav.tmpl b/templates/repo/nav.tmpl
index 70e1745f..ea7799b3 100644
--- a/templates/repo/nav.tmpl
+++ b/templates/repo/nav.tmpl
@@ -27,6 +27,7 @@
<hr/>
<div class="clone-zip text-center">
<a class="btn btn-success btn-lg" href="{{.RepoLink}}/archive/{{.BranchName}}/{{.Repository.Name}}.zip" rel="nofollow"><i class="fa fa-suitcase"></i>Download ZIP</a>
+ <a class="btn btn-success btn-lg" href="{{.RepoLink}}/archive/{{.BranchName}}/{{.Repository.Name}}.tar.gz" rel="nofollow"><i class="fa fa-suitcase"></i>Download TAR.GZ</a>
</div>
</div>
</div>