From 63baf76ab2f4a510b4fb981e81feb5ae533b1639 Mon Sep 17 00:00:00 2001 From: Unknown Date: Tue, 3 Jun 2014 12:51:53 -0400 Subject: Fix #214 --- modules/setting/setting.go | 2 ++ 1 file changed, 2 insertions(+) (limited to 'modules/setting/setting.go') diff --git a/modules/setting/setting.go b/modules/setting/setting.go index 8cca57ef..2f64511a 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -330,6 +330,7 @@ func newSessionService() { type Mailer struct { Name string Host string + From string User, Passwd string } @@ -363,6 +364,7 @@ func newMailService() { User: Cfg.MustValue("mailer", "USER"), Passwd: Cfg.MustValue("mailer", "PASSWD"), } + MailService.From = Cfg.MustValue("mailer", "FROM", MailService.User) log.Info("Mail Service Enabled") } -- cgit v1.2.3 From 302c863cda651130286838309d3d897cace93534 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sun, 8 Jun 2014 04:45:34 -0400 Subject: Fix #242 --- conf/app.ini | 6 + gogs.go | 2 +- models/action.go | 23 ++- models/models.go | 2 +- models/webhook.go | 130 ++++++++++-- modules/bin/conf.go | 494 ++++++++++++++++++++++---------------------- modules/cron/cron.go | 4 + modules/hooks/hooks.go | 95 --------- modules/setting/setting.go | 12 +- routers/admin/admin.go | 3 + routers/install.go | 3 +- routers/repo/setting.go | 16 +- templates/VERSION | 2 +- templates/admin/config.tmpl | 15 ++ 14 files changed, 432 insertions(+), 375 deletions(-) delete mode 100644 modules/hooks/hooks.go (limited to 'modules/setting/setting.go') 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..8a633a30 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.2.0608 Alpha" func init() { runtime.GOMAXPROCS(runtime.NumCPU()) 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/models.go b/models/models.go index fa65ef30..dca77e00 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() { diff --git a/models/webhook.go b/models/webhook.go index f10fa213..e68edc81 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:"-"` @@ -44,7 +50,7 @@ func (w *Webhook) GetEvent() { } } -func (w *Webhook) SaveEvent() error { +func (w *Webhook) UpdateEvent() error { data, err := json.Marshal(w.HookEvent) w.Events = string(data) return err @@ -57,18 +63,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 +93,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 = 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 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 { + Id int64 + Type int + 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..35c91651 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 @@ -187,9 +191,9 @@ var Service struct { RequireSignInView bool EnableCacheAvatar bool NotifyMail bool + LdapAuth bool ActiveCodeLives int ResetPwdCodeLives int - LdapAuth bool } func newService() { @@ -390,6 +394,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 +407,5 @@ func NewServices() { newMailService() newRegisterMailService() newNotifyMailService() + newWebhookService() } 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/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/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..cf75962a 100644 --- a/templates/VERSION +++ b/templates/VERSION @@ -1 +1 @@ -0.4.2.0605 Alpha \ No newline at end of file +0.4.2.0608 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 @@ -89,6 +89,21 @@ +
+
+ Webhook Configuration +
+ +
+
+
Task Interval
+
{{.WebhookTaskInterval}} minutes
+
Deliver Timeout
+
{{.WebhookDeliverTimeout}} seconds
+
+
+
+
Mailer Configuration -- cgit v1.2.3 From a3e1383cac3dfa2a71b04b47a295e9836fcb0d50 Mon Sep 17 00:00:00 2001 From: Unknown Date: Tue, 10 Jun 2014 19:11:53 -0400 Subject: Add gogs fix location command --- README.md | 2 +- README_ZH.md | 2 +- cmd/fix.go | 154 +++++++++++++++++++++++++++++++++++++++++---- cmd/serve.go | 1 - gogs.go | 6 +- models/models.go | 5 +- models/publickey.go | 14 ++--- models/repo.go | 6 +- modules/setting/setting.go | 11 +++- templates/VERSION | 2 +- 10 files changed, 171 insertions(+), 32 deletions(-) (limited to 'modules/setting/setting.go') 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 +`, + 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 to continue, use 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/gogs.go b/gogs.go index 8a633a30..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.0608 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/models.go b/models/models.go index dca77e00..a59c0517 100644 --- a/models/models.go +++ b/models/models.go @@ -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 deb25b2a..3eca78c4 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") @@ -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 } diff --git a/modules/setting/setting.go b/modules/setting/setting.go index 35c91651..73ec8ddd 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -90,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 @@ -100,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. diff --git a/templates/VERSION b/templates/VERSION index cf75962a..dc83da78 100644 --- a/templates/VERSION +++ b/templates/VERSION @@ -1 +1 @@ -0.4.2.0608 Alpha \ No newline at end of file +0.4.3.0610 Alpha \ No newline at end of file -- cgit v1.2.3 From 6c8d630bef3a58860237856c648e56f4b9cea97d Mon Sep 17 00:00:00 2001 From: Unknown Date: Fri, 20 Jun 2014 00:25:23 -0400 Subject: Add database log adapter --- conf/app.ini | 2 + gogs.go | 2 +- modules/bin/conf.go | 454 +++++++++++++++++++++++---------------------- modules/log/log.go | 4 +- modules/setting/setting.go | 6 +- templates/VERSION | 2 +- 6 files changed, 239 insertions(+), 231 deletions(-) (limited to 'modules/setting/setting.go') diff --git a/conf/app.ini b/conf/app.ini index c792c0fb..52f0c7ed 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -233,5 +233,7 @@ RECEIVERS = ; For "database" mode only [log.database] LEVEL = +; Either "mysql" or "postgres" DRIVER = +; Based on xorm, e.g.: root:root@localhost/gogs?charset=utf8 CONN = diff --git a/gogs.go b/gogs.go index 7e1459e5..f8b31c9f 100644 --- a/gogs.go +++ b/gogs.go @@ -17,7 +17,7 @@ import ( "github.com/gogits/gogs/modules/setting" ) -const APP_VER = "0.4.4.0619 Alpha" +const APP_VER = "0.4.4.0620 Alpha" func init() { runtime.GOMAXPROCS(runtime.NumCPU()) diff --git a/modules/bin/conf.go b/modules/bin/conf.go index c07f87b7..80139536 100644 --- a/modules/bin/conf.go +++ b/modules/bin/conf.go @@ -27,231 +27,235 @@ func bindata_read(data []byte, name string) ([]byte, error) { 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, 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, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x00, 0xff, 0xb4, 0x59, + 0xdd, 0x72, 0xdb, 0xc8, 0xb1, 0xbe, 0xc7, 0x53, 0x8c, 0x79, 0x76, 0xcf, + 0xda, 0xa7, 0x24, 0x92, 0x92, 0x8f, 0x65, 0xad, 0xb4, 0xae, 0x98, 0x22, + 0x41, 0x09, 0xb1, 0x48, 0x6a, 0x01, 0x48, 0x8e, 0xe3, 0x52, 0xa1, 0x20, + 0x60, 0x48, 0x4e, 0x04, 0x60, 0x20, 0xcc, 0x50, 0x14, 0x73, 0x97, 0x57, + 0x48, 0xe5, 0x69, 0xf2, 0x3c, 0xb9, 0xc8, 0x63, 0xe4, 0xeb, 0x01, 0x40, + 0x81, 0x34, 0xd7, 0xeb, 0xfc, 0x55, 0x52, 0x16, 0x31, 0xd3, 0xd3, 0xd3, + 0xfd, 0xf5, 0xff, 0xec, 0x29, 0xeb, 0xe5, 0x39, 0xcb, 0xc2, 0x94, 0x33, + 0x3d, 0x0f, 0x35, 0x53, 0x73, 0xb9, 0x54, 0x4c, 0x66, 0x8c, 0x3f, 0xf2, + 0x62, 0xc5, 0xf2, 0x70, 0x86, 0x0d, 0xa1, 0x13, 0x6e, 0xf5, 0xae, 0xae, + 0x82, 0x71, 0x6f, 0x64, 0xb3, 0x77, 0xec, 0x5c, 0xce, 0xd4, 0x09, 0xfe, + 0x65, 0xe7, 0x42, 0x33, 0x8f, 0x17, 0x8f, 0x22, 0x2a, 0xf7, 0x2f, 0x27, + 0xe7, 0x13, 0xec, 0x8b, 0x74, 0xd6, 0x99, 0x86, 0x58, 0x95, 0x59, 0x3b, + 0xcf, 0x66, 0xd6, 0x29, 0xeb, 0xcf, 0xc3, 0x0c, 0x9c, 0x40, 0x2e, 0xa6, + 0x6c, 0x25, 0x17, 0xac, 0x58, 0x64, 0x2c, 0x91, 0x51, 0x98, 0x24, 0x2b, + 0xcb, 0xbd, 0x1e, 0x07, 0xd7, 0x9e, 0xed, 0xe2, 0xe4, 0x4c, 0x68, 0x50, + 0xdb, 0x42, 0xcf, 0x79, 0xc1, 0x5a, 0x31, 0x7f, 0x6c, 0xed, 0xb1, 0x56, + 0x5e, 0xc8, 0xb8, 0xc5, 0x24, 0x16, 0x34, 0x57, 0x1a, 0x2b, 0x31, 0x9f, + 0x86, 0x8b, 0x04, 0xbc, 0x54, 0x49, 0x63, 0x38, 0x8c, 0x26, 0x03, 0x92, + 0x0d, 0xdf, 0x96, 0xf5, 0xb9, 0xe0, 0xb9, 0x54, 0x42, 0xcb, 0x62, 0x75, + 0x6b, 0xb9, 0x93, 0x89, 0x8f, 0x0d, 0xcb, 0xeb, 0xbb, 0xce, 0x95, 0x1f, + 0xf8, 0x9f, 0xae, 0x88, 0xee, 0x2e, 0x54, 0x73, 0x10, 0x2a, 0x48, 0xcf, + 0x8b, 0x5b, 0xeb, 0xca, 0x9d, 0xf8, 0x93, 0xfe, 0xe4, 0x12, 0x3b, 0x73, + 0xad, 0x73, 0x6b, 0x30, 0x19, 0xf5, 0x9c, 0x31, 0xbe, 0x8c, 0x90, 0x73, + 0xa9, 0xb4, 0xe1, 0x13, 0x5c, 0xbb, 0x44, 0xf2, 0xfd, 0xcb, 0x9a, 0xfe, + 0x95, 0x3a, 0xe9, 0x74, 0xbe, 0x7f, 0x59, 0x92, 0xe3, 0xe3, 0xfb, 0x97, + 0x17, 0xbe, 0x7f, 0x15, 0x5c, 0x4d, 0x5c, 0xff, 0x95, 0xea, 0x58, 0xe6, + 0xa3, 0x37, 0x18, 0x90, 0x6e, 0xd6, 0x7a, 0x07, 0x1f, 0xaf, 0xbb, 0xdd, + 0xae, 0xe5, 0x79, 0x17, 0xf5, 0xf7, 0xe1, 0x21, 0xf4, 0x1e, 0x08, 0x15, + 0xde, 0x25, 0x9c, 0xf5, 0x07, 0x63, 0xc2, 0x3f, 0x63, 0x22, 0xab, 0xb5, + 0x4f, 0x65, 0xcc, 0xad, 0xc9, 0x70, 0x78, 0xe9, 0x8c, 0xed, 0x5a, 0xd5, + 0x69, 0x98, 0x28, 0x6e, 0x0d, 0x1c, 0xaf, 0x77, 0x76, 0x69, 0x07, 0xee, + 0xe4, 0xda, 0xb7, 0x5d, 0x32, 0xc1, 0x7a, 0xeb, 0x94, 0x9d, 0xf3, 0x8c, + 0x17, 0xa1, 0xe6, 0x4c, 0x69, 0x9e, 0xab, 0x13, 0xac, 0x7c, 0xc7, 0xa2, + 0x18, 0x66, 0xd5, 0xf3, 0x8e, 0x96, 0x9d, 0x19, 0x0c, 0xd9, 0x89, 0x16, + 0x4a, 0xcb, 0xb4, 0x43, 0x6a, 0x2b, 0x43, 0x30, 0x93, 0xc6, 0x3c, 0xdf, + 0x9d, 0x4f, 0x48, 0xe5, 0x8e, 0x2a, 0xa2, 0x4e, 0x7e, 0x3f, 0xeb, 0x44, + 0xc5, 0x2a, 0xc7, 0x19, 0x9d, 0xa8, 0xce, 0xac, 0x62, 0x1b, 0x44, 0xbc, + 0xd0, 0x6d, 0xd0, 0xef, 0x47, 0xe1, 0x3b, 0x5d, 0x2c, 0x38, 0xdb, 0x8f, + 0x17, 0xd8, 0x10, 0x32, 0x7b, 0x77, 0xfc, 0xf6, 0xa8, 0x3b, 0xef, 0xa6, + 0x5d, 0xc5, 0xf6, 0x09, 0xbe, 0x77, 0xe9, 0x8a, 0xfe, 0xb4, 0xf9, 0x53, + 0x98, 0xe6, 0x09, 0x6f, 0x47, 0x32, 0xb5, 0xfa, 0xb6, 0xeb, 0x07, 0x43, + 0xe7, 0x92, 0x94, 0x69, 0x4a, 0xd1, 0x31, 0x6c, 0x73, 0x9e, 0x5a, 0x1f, + 0xec, 0x4f, 0x3b, 0x09, 0xee, 0xf9, 0xca, 0xec, 0x9f, 0xb2, 0xeb, 0x3c, + 0x87, 0xab, 0x24, 0x80, 0x2b, 0x61, 0x72, 0xca, 0x34, 0x07, 0x77, 0x52, + 0x38, 0xcc, 0x62, 0x28, 0x0d, 0x51, 0x22, 0x36, 0x15, 0xc0, 0x94, 0x54, + 0x06, 0x79, 0xc3, 0x75, 0xe0, 0x63, 0x66, 0x95, 0x2d, 0xe1, 0x6c, 0xdc, + 0x38, 0x35, 0x2d, 0xf3, 0x27, 0x1e, 0x2d, 0x34, 0x8f, 0x2d, 0xcf, 0xef, + 0xf9, 0x4e, 0x3f, 0x30, 0x66, 0xbf, 0xea, 0xf9, 0x17, 0x64, 0x42, 0xeb, + 0x73, 0x1c, 0xea, 0x10, 0xbe, 0xc3, 0x6f, 0x1b, 0x7e, 0x9a, 0xae, 0xd4, + 0x43, 0x62, 0x3c, 0x15, 0x1a, 0xce, 0x0a, 0xae, 0x4a, 0x6f, 0xc5, 0xa2, + 0xd0, 0xfc, 0x35, 0x36, 0x84, 0xfe, 0x41, 0x91, 0xdb, 0x17, 0x2c, 0x9a, + 0x4b, 0x0a, 0x96, 0xc1, 0x59, 0xed, 0x87, 0xe6, 0xac, 0x75, 0x31, 0xf1, + 0xc8, 0x0b, 0x0e, 0x0e, 0xdf, 0xb6, 0xbb, 0xf8, 0xdf, 0xc1, 0xc9, 0xeb, + 0xd7, 0xdd, 0x23, 0xab, 0x0a, 0x37, 0xb2, 0x92, 0x55, 0x05, 0x48, 0x21, + 0xa5, 0xb6, 0xae, 0x7a, 0x9e, 0xf7, 0x71, 0xc0, 0xde, 0x41, 0x84, 0x21, + 0x5d, 0xd4, 0xb8, 0x36, 0x4b, 0x56, 0x7b, 0x8c, 0xd7, 0xf1, 0x53, 0xfa, + 0x13, 0x49, 0x56, 0xf0, 0x87, 0x85, 0x28, 0x78, 0x29, 0x18, 0x3c, 0x5e, + 0x4c, 0x57, 0xfb, 0xd3, 0x45, 0x92, 0xb4, 0xe0, 0x84, 0x97, 0xeb, 0xd8, + 0x29, 0xe9, 0x6b, 0xb6, 0xb5, 0xfc, 0x86, 0xab, 0x55, 0x41, 0x40, 0xfa, + 0x1b, 0xbf, 0x69, 0xc7, 0x77, 0x80, 0x23, 0x8c, 0x53, 0x91, 0xdd, 0x9a, + 0x40, 0x8a, 0x16, 0x85, 0xd0, 0x88, 0x37, 0x67, 0x0c, 0xe4, 0x2e, 0x2f, + 0xe1, 0x89, 0xfd, 0x0f, 0x0d, 0x57, 0x7c, 0xf1, 0xa2, 0x7f, 0xd1, 0x1b, + 0x9f, 0xdb, 0xcc, 0xbf, 0x70, 0x3c, 0xe6, 0x4f, 0xd8, 0x07, 0xdb, 0xbe, + 0x62, 0x9f, 0x26, 0xd7, 0x2e, 0x33, 0xba, 0x0d, 0x7a, 0x7e, 0x8f, 0x79, + 0xbd, 0xa1, 0xfd, 0xe2, 0x85, 0xe5, 0xd9, 0x7d, 0xd7, 0xf6, 0x03, 0x58, + 0x1f, 0x0c, 0x5e, 0xfc, 0xcf, 0xfb, 0xe1, 0xc0, 0xfe, 0xe8, 0xe2, 0xff, + 0xff, 0xfb, 0x7f, 0x2f, 0xc1, 0xa9, 0xb7, 0xd0, 0x72, 0x3f, 0x91, 0x33, + 0x44, 0x47, 0xc1, 0x53, 0x9e, 0xde, 0x41, 0xd7, 0x38, 0x5c, 0x29, 0x0b, + 0xbe, 0xef, 0x8c, 0x03, 0xd7, 0x1e, 0xd9, 0xa3, 0x33, 0x84, 0xc2, 0xa0, + 0xf7, 0xc9, 0xc3, 0xf9, 0xb7, 0x56, 0x7f, 0x32, 0xf9, 0xe0, 0xd8, 0x26, + 0xc7, 0x34, 0x20, 0x0d, 0xc2, 0x25, 0x57, 0x32, 0xe5, 0xf5, 0xf6, 0xfa, + 0x5c, 0x93, 0x46, 0x64, 0x51, 0xc1, 0x63, 0x41, 0xa8, 0x94, 0xc9, 0x02, + 0xd6, 0xbb, 0xb5, 0x7a, 0x7d, 0xdf, 0xb9, 0xb1, 0x83, 0x3e, 0x60, 0x0b, + 0x2e, 0xe9, 0xd7, 0xc8, 0x19, 0x23, 0xfa, 0xe8, 0xb6, 0x83, 0xe3, 0xae, + 0xe5, 0xda, 0x9e, 0x4d, 0x3e, 0x43, 0x56, 0xfa, 0x45, 0x22, 0xb8, 0x2e, + 0xf8, 0xb1, 0x8c, 0xf3, 0x98, 0x69, 0xc9, 0x90, 0x2b, 0xa7, 0xa2, 0x48, + 0x19, 0xdf, 0x4f, 0x43, 0x91, 0xb0, 0x29, 0x0c, 0x50, 0xf0, 0x99, 0x50, + 0xba, 0x0c, 0x27, 0xf0, 0x3c, 0x77, 0x3c, 0x0a, 0x70, 0x1b, 0x99, 0xe6, + 0x12, 0x5c, 0xc7, 0x43, 0xc7, 0x1d, 0x35, 0xf0, 0x1d, 0x48, 0xae, 0x58, + 0x26, 0x35, 0x43, 0x4e, 0x95, 0xcb, 0xea, 0x30, 0x2e, 0xa0, 0x40, 0x30, + 0x56, 0x62, 0xd0, 0xc4, 0x44, 0x46, 0x14, 0xc9, 0x45, 0xa6, 0x4b, 0xab, + 0xae, 0xb3, 0x87, 0x61, 0xef, 0xc2, 0xe3, 0x27, 0xe3, 0x06, 0x53, 0x23, + 0x62, 0x8a, 0xc8, 0x63, 0x4a, 0xcc, 0x4c, 0x3e, 0x82, 0xa8, 0x8f, 0x82, + 0x2f, 0xc1, 0x76, 0xa5, 0xe7, 0x22, 0x9b, 0xb5, 0x21, 0xd9, 0xcf, 0xd7, + 0x8e, 0x6b, 0x07, 0x9e, 0x73, 0x3e, 0x06, 0xfc, 0x37, 0x8e, 0xfd, 0xb1, + 0xc1, 0xa1, 0x1f, 0x46, 0x88, 0xb3, 0xf0, 0x11, 0x6e, 0x03, 0x59, 0x14, + 0xcb, 0x45, 0xa4, 0x17, 0x05, 0xb7, 0xec, 0xb1, 0xb9, 0xb7, 0xdf, 0xeb, + 0x5f, 0xd8, 0x41, 0xef, 0x06, 0xc6, 0x77, 0x1b, 0xa7, 0x46, 0x84, 0x01, + 0x94, 0x11, 0x53, 0x11, 0x95, 0xfa, 0x57, 0xf4, 0xe3, 0x89, 0xef, 0x0c, + 0x3f, 0x05, 0x84, 0xc1, 0x9a, 0xdc, 0xfa, 0xbc, 0xe4, 0x77, 0x73, 0x29, + 0xef, 0x29, 0x26, 0xfb, 0x05, 0x8a, 0x97, 0x0e, 0xd5, 0x3d, 0x84, 0x85, + 0xfa, 0x8f, 0x61, 0x42, 0x52, 0x43, 0x7d, 0xc4, 0xb4, 0xb2, 0xfc, 0x9e, + 0xf7, 0x21, 0x70, 0xc6, 0xc0, 0xf1, 0xa6, 0x47, 0x0c, 0x0e, 0x08, 0x38, + 0x9e, 0x08, 0x44, 0x04, 0xca, 0x5c, 0xca, 0xe5, 0x42, 0x13, 0x39, 0x9c, + 0x59, 0x66, 0xb1, 0xb2, 0x06, 0x36, 0x19, 0xce, 0x0d, 0x7c, 0x67, 0x64, + 0x23, 0xbd, 0xe2, 0xc0, 0x1b, 0xdc, 0x46, 0x06, 0xa2, 0x9a, 0x51, 0x8a, + 0x34, 0x68, 0x88, 0x7d, 0xb6, 0x98, 0x4e, 0x4d, 0x36, 0xca, 0x66, 0xc8, + 0x2b, 0x48, 0x47, 0x11, 0xea, 0x5e, 0xc6, 0x93, 0x3d, 0x76, 0xcf, 0x79, + 0x4e, 0xe5, 0x0f, 0x08, 0x08, 0x93, 0x7d, 0xaa, 0x3a, 0x18, 0xcb, 0xec, + 0x07, 0xcd, 0xee, 0x33, 0x58, 0x6c, 0x49, 0xf5, 0xd7, 0x6c, 0xb6, 0x11, + 0x00, 0xe3, 0x41, 0x70, 0x76, 0x3d, 0x1c, 0x52, 0x46, 0xb7, 0xc9, 0x22, + 0x07, 0xe4, 0x31, 0x63, 0xaa, 0xd3, 0x88, 0x52, 0xa4, 0xb8, 0x15, 0xdc, + 0x86, 0x14, 0x23, 0xa0, 0xca, 0x02, 0xed, 0x5d, 0x9f, 0xfd, 0xd6, 0xee, + 0xfb, 0xa6, 0x3c, 0xd5, 0xc5, 0xfa, 0x95, 0xaa, 0xc1, 0x2c, 0x0b, 0x1d, + 0x95, 0x04, 0x3a, 0x72, 0xc2, 0x54, 0xaa, 0xf3, 0xf6, 0x8c, 0x7e, 0x53, + 0x2a, 0x3e, 0x79, 0x73, 0xfc, 0x16, 0x7b, 0x3f, 0xff, 0x5c, 0x6d, 0x3c, + 0x3c, 0x98, 0xd5, 0xc3, 0x37, 0x75, 0x66, 0xaa, 0xd9, 0x4c, 0x0b, 0x99, + 0xc2, 0x9d, 0x62, 0x64, 0x1b, 0x65, 0x0d, 0xdd, 0xc9, 0xe8, 0x79, 0x0f, + 0x8a, 0x2f, 0x8c, 0x47, 0x93, 0x90, 0xe4, 0x75, 0x79, 0xa8, 0xd4, 0x52, + 0x16, 0x71, 0x9d, 0xbb, 0xd6, 0x79, 0x8b, 0xf2, 0xa8, 0x0c, 0x17, 0x7a, + 0xfe, 0x25, 0x86, 0xd5, 0x46, 0x1b, 0x8d, 0xc0, 0x7c, 0x71, 0xf7, 0xe5, + 0x7e, 0xff, 0xd2, 0xb1, 0xc7, 0x7e, 0xe0, 0x18, 0x2e, 0xd5, 0x47, 0x99, + 0x2d, 0xca, 0x12, 0x3f, 0xb9, 0x32, 0x01, 0x66, 0xaa, 0x04, 0x2a, 0x73, + 0x98, 0x8b, 0x8a, 0x15, 0xe9, 0xd3, 0x21, 0xf9, 0xac, 0xde, 0xb5, 0x7f, + 0x51, 0xd5, 0xf1, 0x9a, 0xac, 0x41, 0x62, 0xf2, 0x4a, 0xc7, 0x08, 0xd1, + 0xa1, 0x7f, 0x64, 0x21, 0xfe, 0xc8, 0x2d, 0x7f, 0xf2, 0xc1, 0x1e, 0x7f, + 0xe3, 0xa1, 0x28, 0x02, 0x36, 0x81, 0x96, 0xf7, 0x3c, 0xb3, 0x4c, 0x09, + 0xd6, 0x2c, 0x4a, 0x04, 0x47, 0xc4, 0x89, 0xb8, 0x2c, 0x4b, 0x1c, 0x91, + 0xa8, 0x0d, 0x94, 0xd8, 0xaf, 0xd9, 0xc1, 0xe3, 0x94, 0x44, 0x61, 0x8c, + 0xa9, 0x94, 0x49, 0x14, 0x35, 0x85, 0xc2, 0x2a, 0x67, 0x65, 0xa9, 0xec, + 0xa0, 0x0b, 0xf8, 0x03, 0x8f, 0xf4, 0x1a, 0x1e, 0xb3, 0xf3, 0x6f, 0xc3, + 0xb3, 0x5c, 0x2e, 0x2b, 0x56, 0x00, 0x4a, 0x99, 0x8b, 0x8c, 0x0e, 0x84, + 0x93, 0xc8, 0xa6, 0xb2, 0xcd, 0x8d, 0x7f, 0x7d, 0x33, 0x39, 0xa4, 0xa4, + 0x62, 0xbb, 0x0b, 0xe2, 0x2a, 0xeb, 0x6c, 0x28, 0x25, 0x4b, 0xc8, 0x0e, + 0x0d, 0x97, 0x9d, 0x18, 0x7f, 0xf5, 0x54, 0x05, 0x71, 0x05, 0xc9, 0xc3, + 0xc3, 0xbf, 0x0c, 0x07, 0x32, 0xa6, 0x71, 0x7e, 0xf6, 0xb7, 0xbf, 0xfe, + 0xf9, 0xef, 0x7f, 0xfa, 0x0b, 0x95, 0x98, 0x1d, 0x3e, 0x52, 0x84, 0xf9, + 0xbc, 0x0a, 0x8c, 0x4a, 0x82, 0x76, 0xb7, 0xe1, 0x22, 0xa7, 0x6c, 0xa7, + 0x93, 0xec, 0x3c, 0x55, 0x4a, 0x8e, 0x13, 0x3c, 0x8b, 0xc8, 0x31, 0x96, + 0x5c, 0xdc, 0xc9, 0x5d, 0xa8, 0xc1, 0x0f, 0xb2, 0xb6, 0xae, 0xcf, 0x47, + 0x33, 0xb1, 0x7f, 0x57, 0x3b, 0xda, 0xe1, 0xaf, 0xb8, 0xe7, 0xd7, 0x8f, + 0x6e, 0x38, 0x69, 0x85, 0xa0, 0x5e, 0x0a, 0xad, 0x77, 0x25, 0xb6, 0x7f, + 0x02, 0xc6, 0x5d, 0x96, 0x47, 0x0c, 0x56, 0xac, 0x9f, 0x51, 0xf8, 0x15, + 0xe1, 0x7f, 0xe1, 0xcc, 0x2e, 0xa9, 0x0d, 0x76, 0xff, 0x0d, 0x99, 0x0d, + 0xe3, 0x86, 0xdd, 0xbe, 0x41, 0xe4, 0x2f, 0x8f, 0x6c, 0x4a, 0x1c, 0x51, + 0x31, 0xdc, 0xe8, 0x1c, 0x79, 0x8a, 0x19, 0xa5, 0x6c, 0xd0, 0x90, 0xd7, + 0xf1, 0x43, 0x96, 0xab, 0x86, 0x72, 0x6b, 0xd4, 0xa9, 0x88, 0xad, 0xde, + 0xa0, 0x77, 0xe5, 0x9b, 0x8c, 0x5a, 0xae, 0xd4, 0xfd, 0x5a, 0xb5, 0x5f, + 0x35, 0x81, 0xe7, 0xfd, 0x8d, 0x0a, 0x58, 0x95, 0xb4, 0x0d, 0x8e, 0x47, + 0x5d, 0xab, 0x51, 0x0b, 0x8f, 0xba, 0x35, 0xa3, 0x52, 0x16, 0x93, 0xab, + 0x9a, 0xb2, 0x80, 0x41, 0x86, 0x1c, 0x84, 0x6a, 0xcc, 0xa8, 0x95, 0x5f, + 0x97, 0x81, 0x53, 0x66, 0x0e, 0x9c, 0xb0, 0xd6, 0xc9, 0x51, 0xf7, 0xf5, + 0x8f, 0x2d, 0x2c, 0xd4, 0xa7, 0xb0, 0xf6, 0xdc, 0xd3, 0x1e, 0x1c, 0x1c, + 0x1e, 0x1c, 0xb4, 0xaa, 0x8a, 0x62, 0xda, 0x29, 0xa5, 0xc0, 0x6c, 0x37, + 0x1e, 0x94, 0x47, 0x9e, 0x71, 0x29, 0x61, 0xa9, 0xda, 0xec, 0x5d, 0x98, + 0x60, 0x1e, 0xbb, 0x71, 0x06, 0x06, 0x14, 0x93, 0x81, 0x4e, 0xd9, 0x55, + 0x21, 0x1f, 0x45, 0x0c, 0xa6, 0xa6, 0xb3, 0x9a, 0x31, 0x99, 0x93, 0xe4, + 0xaa, 0x14, 0x0e, 0x67, 0x4e, 0x4c, 0xb3, 0x34, 0x0f, 0x1f, 0xa9, 0x58, + 0xad, 0x6a, 0xaa, 0x15, 0xa7, 0x01, 0x94, 0x58, 0xa0, 0x12, 0x96, 0xf2, + 0x3d, 0xcf, 0x0f, 0xe8, 0xac, 0xdb, 0xb3, 0x36, 0xfa, 0x6a, 0xea, 0x81, + 0xab, 0x5d, 0xd5, 0x7a, 0xd6, 0xbf, 0xe2, 0x91, 0x88, 0x7b, 0x5e, 0x2e, + 0x55, 0x55, 0xd7, 0x20, 0xb5, 0xc7, 0x72, 0x29, 0x13, 0x0f, 0xee, 0xb3, + 0xb7, 0xae, 0x8c, 0x35, 0xc3, 0x67, 0x8c, 0x8e, 0x5e, 0xbf, 0xfd, 0x71, + 0xef, 0xa0, 0xdb, 0xdd, 0x0b, 0x31, 0xbc, 0x3c, 0x09, 0x6e, 0xc0, 0x24, + 0xbd, 0x4f, 0xd0, 0x8f, 0xee, 0xe3, 0xef, 0x7e, 0x5c, 0x50, 0xb7, 0xd2, + 0x31, 0x8b, 0x2c, 0x56, 0x59, 0x7d, 0x2b, 0x3a, 0x45, 0xb4, 0x63, 0x35, + 0x47, 0x9a, 0x13, 0x4e, 0xea, 0x6b, 0xde, 0xd7, 0xc2, 0x06, 0xda, 0xcc, + 0x03, 0x6b, 0xb4, 0xca, 0x36, 0xf2, 0xbc, 0x6e, 0xeb, 0x6b, 0x95, 0x70, + 0xa7, 0x57, 0xe9, 0x1e, 0xa1, 0xad, 0x12, 0xdc, 0xd4, 0xf4, 0xba, 0x4f, + 0xae, 0xda, 0x63, 0x11, 0x90, 0x9e, 0x01, 0xba, 0x64, 0xa1, 0xe9, 0x84, + 0x53, 0x36, 0x34, 0xa8, 0x05, 0x6b, 0xe0, 0xe0, 0x76, 0x26, 0x3a, 0x2a, + 0x8f, 0x6c, 0xd8, 0xad, 0x8a, 0xd1, 0x92, 0x21, 0xc2, 0xf2, 0xda, 0xb5, + 0x1b, 0x6d, 0x94, 0x9d, 0x99, 0x31, 0x58, 0x51, 0xe5, 0x34, 0xf7, 0x6f, + 0x9c, 0xa5, 0x39, 0xb3, 0x6e, 0x07, 0xa9, 0xcf, 0x2e, 0xb9, 0xe0, 0xb8, + 0xd9, 0x78, 0x16, 0x1d, 0x01, 0x40, 0x2d, 0xdd, 0x3a, 0x0a, 0x36, 0x98, + 0x1c, 0x1f, 0xfd, 0x3f, 0x06, 0xf0, 0xf3, 0xfe, 0xba, 0x19, 0x34, 0x3d, + 0x1e, 0x98, 0x94, 0x1b, 0xcf, 0x5c, 0x12, 0x31, 0xe5, 0x86, 0xcf, 0x8e, + 0xe3, 0x9e, 0xed, 0x79, 0xe8, 0x97, 0xd1, 0xdd, 0x0f, 0xed, 0xed, 0xf3, + 0x6b, 0x0c, 0x62, 0xf8, 0x98, 0x9a, 0xb3, 0xe9, 0x22, 0x8b, 0xf6, 0xd6, + 0x7e, 0xae, 0xe6, 0xe1, 0x01, 0x79, 0x37, 0xfe, 0x1e, 0xbe, 0x39, 0xaa, + 0xdc, 0x3b, 0x7e, 0xd3, 0x6a, 0xde, 0x41, 0x34, 0xeb, 0x2b, 0x9c, 0x41, + 0x70, 0xd1, 0xf3, 0x2e, 0x86, 0xd7, 0xe3, 0x3e, 0x2e, 0x31, 0x5b, 0xcf, + 0x32, 0x9a, 0x0b, 0x30, 0x12, 0x6f, 0x88, 0x48, 0x86, 0x28, 0x10, 0xc2, + 0xe8, 0xd7, 0x4a, 0xd7, 0xd8, 0xe6, 0x65, 0xa6, 0x2b, 0x84, 0x61, 0xd5, + 0x91, 0x53, 0x18, 0xfa, 0x34, 0x12, 0x27, 0x61, 0xc4, 0xa9, 0xcd, 0xaf, + 0xd6, 0x8d, 0x6b, 0x3c, 0xcf, 0x94, 0xa5, 0x47, 0x97, 0x12, 0x3f, 0x88, + 0x4c, 0x2c, 0xb6, 0x02, 0xb2, 0xda, 0xc7, 0x65, 0xee, 0x8d, 0xd3, 0x27, + 0x44, 0xaa, 0xce, 0xb3, 0x9e, 0x34, 0xce, 0xdd, 0xad, 0x6e, 0xdf, 0xfa, + 0x8c, 0xf6, 0xa9, 0x7c, 0xa6, 0xa9, 0xe6, 0xec, 0x46, 0x42, 0xa8, 0xba, + 0xa2, 0x66, 0x46, 0xa0, 0x34, 0x64, 0xb0, 0x43, 0xa3, 0x5a, 0xca, 0x51, + 0xcf, 0xe4, 0x5b, 0xa2, 0xd4, 0x67, 0xcb, 0x39, 0x06, 0xae, 0x94, 0xa6, + 0x21, 0x29, 0xa6, 0x78, 0x1e, 0x9a, 0x47, 0x91, 0x14, 0x94, 0x22, 0x87, + 0xa7, 0xd1, 0xeb, 0x8a, 0xaa, 0x43, 0xa7, 0x3a, 0xb6, 0x67, 0xe2, 0xbe, + 0x65, 0x55, 0xb3, 0x71, 0xb5, 0xfa, 0x9f, 0x6c, 0xf2, 0xb7, 0xfa, 0xfb, + 0xae, 0xf1, 0x9b, 0x5a, 0x71, 0xbf, 0x80, 0x19, 0x48, 0xcd, 0x01, 0xbf, + 0x5b, 0xcc, 0xe8, 0x87, 0x83, 0x0e, 0x8b, 0xfe, 0x7e, 0x0c, 0x0b, 0xa3, + 0xbf, 0x5d, 0x14, 0xb2, 0xa0, 0x1f, 0x7d, 0xcc, 0xdd, 0x18, 0x93, 0xb6, + 0x53, 0x63, 0xc9, 0xc1, 0xba, 0xb4, 0x6f, 0x6c, 0x4a, 0xef, 0xe6, 0xd3, + 0xaa, 0x53, 0x7c, 0x8d, 0x8d, 0x51, 0xbd, 0x1c, 0x05, 0xc9, 0x0c, 0xed, + 0x6a, 0xfd, 0x76, 0x7d, 0x6c, 0x7d, 0xc2, 0xa0, 0xb1, 0x4d, 0x4e, 0x8b, + 0x0d, 0x5a, 0x7a, 0xaa, 0xa9, 0xf3, 0x03, 0xb6, 0xcb, 0x77, 0x02, 0xfc, + 0x30, 0xae, 0x45, 0x6f, 0x2b, 0x26, 0xb0, 0x15, 0x43, 0x71, 0x94, 0x29, + 0x2c, 0x10, 0x13, 0x15, 0x2b, 0xa4, 0xc6, 0xef, 0x97, 0x0a, 0xf5, 0x3e, + 0x32, 0x80, 0x4e, 0x25, 0x8d, 0xb0, 0x70, 0xd9, 0x3a, 0x69, 0xbf, 0xfa, + 0x32, 0x01, 0x60, 0xd6, 0x0f, 0xdc, 0x89, 0xdf, 0xf3, 0x1b, 0x91, 0x3f, + 0x0a, 0x9f, 0x10, 0xaf, 0x19, 0xd2, 0xd5, 0xc2, 0x3c, 0x0a, 0x80, 0x95, + 0x02, 0x17, 0x18, 0x98, 0xe4, 0xdc, 0xe0, 0x61, 0xe0, 0x06, 0xe0, 0xa3, + 0xde, 0xef, 0x02, 0x7a, 0x53, 0xf3, 0x6a, 0x13, 0x18, 0x23, 0x10, 0x23, + 0x85, 0x4c, 0x8d, 0x40, 0x13, 0x53, 0xfd, 0x35, 0x3e, 0x87, 0xc7, 0x28, + 0x27, 0x61, 0x06, 0x86, 0xec, 0xa7, 0x9f, 0xf0, 0xb5, 0xc7, 0x10, 0xcf, + 0xa3, 0x33, 0xc3, 0xd7, 0x73, 0x7e, 0x8f, 0x0c, 0x75, 0xe1, 0x0c, 0xcd, + 0x03, 0xdf, 0xb1, 0x09, 0xd8, 0x59, 0x4a, 0xfd, 0x1e, 0x69, 0x1d, 0xa3, + 0xb3, 0x5e, 0x7d, 0xa9, 0xd7, 0x00, 0x93, 0xed, 0xa7, 0x2f, 0x34, 0xb3, + 0x9f, 0x72, 0x81, 0x8a, 0x62, 0x9e, 0x39, 0x48, 0x1c, 0x62, 0x40, 0xb2, + 0xbc, 0x8c, 0x79, 0xc2, 0x69, 0xa6, 0x9f, 0xd2, 0xa8, 0x9f, 0x42, 0x6c, + 0xa2, 0xd8, 0x84, 0xeb, 0xad, 0x11, 0x66, 0xfd, 0x18, 0xd2, 0xf0, 0x80, + 0x6c, 0x97, 0xf9, 0xb3, 0x86, 0x3d, 0x4f, 0x99, 0xcb, 0xab, 0xaa, 0x5f, + 0x96, 0x7c, 0x7a, 0x96, 0x28, 0x5f, 0x86, 0x2b, 0x40, 0x52, 0xa4, 0xa0, + 0x70, 0xc6, 0x77, 0x24, 0x77, 0xd7, 0x46, 0x71, 0x19, 0x63, 0x20, 0x0d, + 0x90, 0x72, 0x46, 0x5e, 0xf3, 0x55, 0xd2, 0xc7, 0x79, 0xc4, 0x61, 0xb1, + 0xe6, 0xbd, 0x9c, 0xf3, 0xac, 0xd9, 0x5e, 0x80, 0x49, 0x82, 0xeb, 0xbe, + 0xc6, 0xb5, 0x59, 0x2e, 0xaa, 0x90, 0xd1, 0x51, 0x4e, 0xe1, 0xb0, 0xc8, + 0xc4, 0x53, 0x99, 0x17, 0x16, 0x71, 0xbe, 0x15, 0x13, 0x44, 0xd2, 0x7c, + 0xeb, 0xc5, 0x37, 0x18, 0x5c, 0x34, 0xbb, 0x99, 0xfa, 0xb5, 0x76, 0xfd, + 0x0a, 0x66, 0xd2, 0xcc, 0x16, 0x4e, 0xb4, 0xb8, 0x81, 0xd3, 0xd7, 0x26, + 0xf3, 0x4d, 0x11, 0x06, 0x22, 0x9c, 0x65, 0xb8, 0x50, 0x44, 0x35, 0x78, + 0xe5, 0x50, 0x6d, 0xd2, 0x64, 0xab, 0x31, 0xc5, 0x7f, 0x95, 0x70, 0x6b, + 0xac, 0xdf, 0x9c, 0xd2, 0xbf, 0x7d, 0x12, 0x2f, 0x2d, 0xcc, 0xa9, 0xa3, + 0x40, 0xfe, 0x8b, 0xc2, 0x8c, 0xdd, 0x91, 0x9a, 0x9c, 0xe0, 0x43, 0x93, + 0xc4, 0xab, 0x9c, 0xf8, 0xb9, 0x75, 0xf0, 0xbe, 0xf1, 0x70, 0xdb, 0xda, + 0x6b, 0x1d, 0x6e, 0x7c, 0xdf, 0x92, 0x5d, 0x6c, 0x7a, 0x2a, 0xf1, 0x9a, + 0xd0, 0xad, 0xf3, 0xf2, 0x36, 0x7c, 0xcf, 0x8f, 0xa8, 0x0d, 0x08, 0x37, + 0x5f, 0x53, 0xd9, 0xc6, 0xc3, 0xa6, 0x35, 0x70, 0x89, 0x7b, 0x49, 0x78, + 0x86, 0x93, 0x31, 0xfd, 0x37, 0x8a, 0x27, 0x59, 0xa4, 0xa5, 0x84, 0x27, + 0xe6, 0x61, 0xf4, 0x84, 0xfe, 0x79, 0xbf, 0x7e, 0xb1, 0x37, 0xe9, 0xe7, + 0x37, 0xc8, 0xce, 0x05, 0x3a, 0x89, 0x77, 0x0b, 0x3d, 0x3d, 0xb6, 0xc8, + 0x79, 0x88, 0xc9, 0x3f, 0x02, 0x00, 0x00, 0xff, 0xff, 0xb6, 0x1e, 0x92, + 0x4d, 0xf7, 0x18, 0x00, 0x00, }, "conf/app.ini", ) diff --git a/modules/log/log.go b/modules/log/log.go index f83ec0ad..a62baad1 100644 --- a/modules/log/log.go +++ b/modules/log/log.go @@ -33,7 +33,9 @@ func NewLogger(bufLen int64, mode, config string) { loggers = append(loggers, logger) } logger.SetLogFuncCallDepth(3) - logger.SetLogger(mode, config) + if err := logger.SetLogger(mode, config); err != nil { + Fatal("Fail to set logger(%s): %v", mode, err) + } } func Trace(format string, v ...interface{}) { diff --git a/modules/setting/setting.go b/modules/setting/setting.go index 73ec8ddd..93e02210 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -255,20 +255,20 @@ func newLogService() { Cfg.MustBool(modeSec, "DAILY_ROTATE", true), Cfg.MustInt(modeSec, "MAX_DAYS", 7)) case "conn": - LogConfigs[i] = fmt.Sprintf(`{"level":"%s","reconnectOnMsg":%v,"reconnect":%v,"net":"%s","addr":"%s"}`, level, + LogConfigs[i] = fmt.Sprintf(`{"level":%s,"reconnectOnMsg":%v,"reconnect":%v,"net":"%s","addr":"%s"}`, level, Cfg.MustBool(modeSec, "RECONNECT_ON_MSG"), Cfg.MustBool(modeSec, "RECONNECT"), Cfg.MustValueRange(modeSec, "PROTOCOL", "tcp", []string{"tcp", "unix", "udp"}), Cfg.MustValue(modeSec, "ADDR", ":7020")) case "smtp": - LogConfigs[i] = fmt.Sprintf(`{"level":"%s","username":"%s","password":"%s","host":"%s","sendTos":"%s","subject":"%s"}`, level, + LogConfigs[i] = fmt.Sprintf(`{"level":%s,"username":"%s","password":"%s","host":"%s","sendTos":"%s","subject":"%s"}`, level, Cfg.MustValue(modeSec, "USER", "example@example.com"), Cfg.MustValue(modeSec, "PASSWD", "******"), Cfg.MustValue(modeSec, "HOST", "127.0.0.1:25"), Cfg.MustValue(modeSec, "RECEIVERS", "[]"), Cfg.MustValue(modeSec, "SUBJECT", "Diagnostic message from serve")) case "database": - LogConfigs[i] = fmt.Sprintf(`{"level":"%s","driver":"%s","conn":"%s"}`, level, + LogConfigs[i] = fmt.Sprintf(`{"level":%s,"driver":"%s","conn":"%s"}`, level, Cfg.MustValue(modeSec, "DRIVER"), Cfg.MustValue(modeSec, "CONN")) } diff --git a/templates/VERSION b/templates/VERSION index d86ece15..0848cb02 100644 --- a/templates/VERSION +++ b/templates/VERSION @@ -1 +1 @@ -0.4.4.0619 Alpha \ No newline at end of file +0.4.4.0620 Alpha \ No newline at end of file -- cgit v1.2.3 From ad5ec45dd63aa2563d113e6a9ce31180246aa5f2 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sat, 21 Jun 2014 00:51:41 -0400 Subject: Fix #165 --- .gopmfile | 1 - conf/app.ini | 4 + gogs.go | 2 +- models/access.go | 8 +- models/action.go | 2 +- models/issue.go | 84 ++++---- models/login.go | 18 +- models/models.go | 48 ++--- models/oauth2.go | 32 +-- models/publickey.go | 12 +- models/release.go | 10 +- models/repo.go | 64 +++--- models/user.go | 54 ++--- models/webhook.go | 18 +- modules/auth/user.go | 42 ++-- modules/bin/conf.go | 462 +++++++++++++++++++++-------------------- modules/middleware/context.go | 2 +- modules/setting/setting.go | 32 +-- modules/social/social.go | 10 +- routers/admin/admin.go | 13 +- routers/repo/issue.go | 4 +- routers/repo/setting.go | 2 +- templates/VERSION | 2 +- templates/admin/config.tmpl | 4 +- templates/admin/dashboard.tmpl | 4 + 25 files changed, 484 insertions(+), 450 deletions(-) (limited to 'modules/setting/setting.go') diff --git a/.gopmfile b/.gopmfile index 3a0f3fc2..b8aa0237 100644 --- a/.gopmfile +++ b/.gopmfile @@ -19,7 +19,6 @@ github.com/gogits/session = `commit:7ab78d4` github.com/juju2013/goldap = `commit:f4a7f67` github.com/lib/pq = `commit:529edd9` github.com/nfnt/resize = `commit:8aee0d9` -github.com/qiniu/log = `commit:891d1cb` [res] include = templates|public diff --git a/conf/app.ini b/conf/app.ini index 52f0c7ed..111261db 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -51,6 +51,8 @@ SECRET_KEY = !#@FDEWREWR&*( LOGIN_REMEMBER_DAYS = 7 COOKIE_USERNAME = gogs_awesome COOKIE_REMEMBER_NAME = gogs_incredible +; Reverse proxy authentication header name of user ID +REVERSE_PROXY_AUTHENTICATION_UID = X-WEBAUTH-UID [service] ACTIVE_CODE_LIVE_MINUTES = 180 @@ -65,6 +67,8 @@ REQUIRE_SIGNIN_VIEW = false ENABLE_CACHE_AVATAR = false ; Mail notification ENABLE_NOTIFY_MAIL = false +; More detail: https://github.com/gogits/gogs/issues/165 +ENABLE_REVERSE_PROXY_AUTHENTICATION = false [webhook] ; Cron task interval in minutes diff --git a/gogs.go b/gogs.go index f8b31c9f..7719ee0a 100644 --- a/gogs.go +++ b/gogs.go @@ -17,7 +17,7 @@ import ( "github.com/gogits/gogs/modules/setting" ) -const APP_VER = "0.4.4.0620 Alpha" +const APP_VER = "0.4.5.0621 Alpha" func init() { runtime.GOMAXPROCS(runtime.NumCPU()) diff --git a/models/access.go b/models/access.go index 4a202dc6..cf31fc13 100644 --- a/models/access.go +++ b/models/access.go @@ -30,7 +30,7 @@ type Access struct { func AddAccess(access *Access) error { access.UserName = strings.ToLower(access.UserName) access.RepoName = strings.ToLower(access.RepoName) - _, err := orm.Insert(access) + _, err := x.Insert(access) return err } @@ -38,13 +38,13 @@ func AddAccess(access *Access) error { func UpdateAccess(access *Access) error { access.UserName = strings.ToLower(access.UserName) access.RepoName = strings.ToLower(access.RepoName) - _, err := orm.Id(access.Id).Update(access) + _, err := x.Id(access.Id).Update(access) return err } // DeleteAccess deletes access record. func DeleteAccess(access *Access) error { - _, err := orm.Delete(access) + _, err := x.Delete(access) return err } @@ -67,7 +67,7 @@ func HasAccess(uname, repoName string, mode int) (bool, error) { UserName: strings.ToLower(uname), RepoName: strings.ToLower(repoName), } - has, err := orm.Get(access) + has, err := x.Get(access) if err != nil { return false, err } else if !has { diff --git a/models/action.go b/models/action.go index 28468233..8ecdf1de 100644 --- a/models/action.go +++ b/models/action.go @@ -209,7 +209,7 @@ func TransferRepoAction(user, newUser *User, repo *Repository) (err error) { // GetFeeds returns action list of given user in given context. func GetFeeds(userid, offset int64, isProfile bool) ([]*Action, error) { actions := make([]*Action, 0, 20) - sess := orm.Limit(20, int(offset)).Desc("id").Where("user_id=?", userid) + sess := x.Limit(20, int(offset)).Desc("id").Where("user_id=?", userid) if isProfile { sess.Where("is_private=?", false).And("act_user_id=?", userid) } else { diff --git a/models/issue.go b/models/issue.go index 7db728ec..11f6dd4e 100644 --- a/models/issue.go +++ b/models/issue.go @@ -92,7 +92,7 @@ func (i *Issue) GetAssignee() (err error) { // CreateIssue creates new issue for repository. func NewIssue(issue *Issue) (err error) { - sess := orm.NewSession() + sess := x.NewSession() defer sess.Close() if err = sess.Begin(); err != nil { return err @@ -114,7 +114,7 @@ func NewIssue(issue *Issue) (err error) { // GetIssueByIndex returns issue by given index in repository. func GetIssueByIndex(rid, index int64) (*Issue, error) { issue := &Issue{RepoId: rid, Index: index} - has, err := orm.Get(issue) + has, err := x.Get(issue) if err != nil { return nil, err } else if !has { @@ -126,7 +126,7 @@ func GetIssueByIndex(rid, index int64) (*Issue, error) { // GetIssueById returns an issue by ID. func GetIssueById(id int64) (*Issue, error) { issue := &Issue{Id: id} - has, err := orm.Get(issue) + has, err := x.Get(issue) if err != nil { return nil, err } else if !has { @@ -137,7 +137,7 @@ func GetIssueById(id int64) (*Issue, error) { // GetIssues returns a list of issues by given conditions. func GetIssues(uid, rid, pid, mid int64, page int, isClosed bool, labelIds, sortType string) ([]Issue, error) { - sess := orm.Limit(20, (page-1)*20) + sess := x.Limit(20, (page-1)*20) if rid > 0 { sess.Where("repo_id=?", rid).And("is_closed=?", isClosed) @@ -193,13 +193,13 @@ const ( // GetIssuesByLabel returns a list of issues by given label and repository. func GetIssuesByLabel(repoId int64, label string) ([]*Issue, error) { issues := make([]*Issue, 0, 10) - err := orm.Where("repo_id=?", repoId).And("label_ids like '%$" + label + "|%'").Find(&issues) + err := x.Where("repo_id=?", repoId).And("label_ids like '%$" + label + "|%'").Find(&issues) return issues, err } // GetIssueCountByPoster returns number of issues of repository by poster. func GetIssueCountByPoster(uid, rid int64, isClosed bool) int64 { - count, _ := orm.Where("repo_id=?", rid).And("poster_id=?", uid).And("is_closed=?", isClosed).Count(new(Issue)) + count, _ := x.Where("repo_id=?", rid).And("poster_id=?", uid).And("is_closed=?", isClosed).Count(new(Issue)) return count } @@ -241,7 +241,7 @@ func NewIssueUserPairs(rid, iid, oid, pid, aid int64, repoName string) (err erro isNeedAddPoster = false } iu.IsAssigned = iu.Uid == aid - if _, err = orm.Insert(iu); err != nil { + if _, err = x.Insert(iu); err != nil { return err } } @@ -249,7 +249,7 @@ func NewIssueUserPairs(rid, iid, oid, pid, aid int64, repoName string) (err erro iu.Uid = pid iu.IsPoster = true iu.IsAssigned = iu.Uid == aid - if _, err = orm.Insert(iu); err != nil { + if _, err = x.Insert(iu); err != nil { return err } } @@ -270,7 +270,7 @@ func PairsContains(ius []*IssueUser, issueId int64) int { // GetIssueUserPairs returns issue-user pairs by given repository and user. func GetIssueUserPairs(rid, uid int64, isClosed bool) ([]*IssueUser, error) { ius := make([]*IssueUser, 0, 10) - err := orm.Where("is_closed=?", isClosed).Find(&ius, &IssueUser{RepoId: rid, Uid: uid}) + err := x.Where("is_closed=?", isClosed).Find(&ius, &IssueUser{RepoId: rid, Uid: uid}) return ius, err } @@ -285,7 +285,7 @@ func GetIssueUserPairsByRepoIds(rids []int64, isClosed bool, page int) ([]*Issue cond := strings.TrimSuffix(buf.String(), " OR ") ius := make([]*IssueUser, 0, 10) - sess := orm.Limit(20, (page-1)*20).Where("is_closed=?", isClosed) + sess := x.Limit(20, (page-1)*20).Where("is_closed=?", isClosed) if len(cond) > 0 { sess.And(cond) } @@ -296,7 +296,7 @@ func GetIssueUserPairsByRepoIds(rids []int64, isClosed bool, page int) ([]*Issue // GetIssueUserPairsByMode returns issue-user pairs by given repository and user. func GetIssueUserPairsByMode(uid, rid int64, isClosed bool, page, filterMode int) ([]*IssueUser, error) { ius := make([]*IssueUser, 0, 10) - sess := orm.Limit(20, (page-1)*20).Where("uid=?", uid).And("is_closed=?", isClosed) + sess := x.Limit(20, (page-1)*20).Where("uid=?", uid).And("is_closed=?", isClosed) if rid > 0 { sess.And("repo_id=?", rid) } @@ -335,7 +335,7 @@ func GetIssueStats(rid, uid int64, isShowClosed bool, filterMode int) *IssueStat issue := new(Issue) tmpSess := &xorm.Session{} - sess := orm.Where("repo_id=?", rid) + sess := x.Where("repo_id=?", rid) *tmpSess = *sess stats.OpenCount, _ = tmpSess.And("is_closed=?", false).Count(issue) *tmpSess = *sess @@ -347,7 +347,7 @@ func GetIssueStats(rid, uid int64, isShowClosed bool, filterMode int) *IssueStat } if filterMode != FM_MENTION { - sess = orm.Where("repo_id=?", rid) + sess = x.Where("repo_id=?", rid) switch filterMode { case FM_ASSIGN: sess.And("assignee_id=?", uid) @@ -361,16 +361,16 @@ func GetIssueStats(rid, uid int64, isShowClosed bool, filterMode int) *IssueStat *tmpSess = *sess stats.ClosedCount, _ = tmpSess.And("is_closed=?", true).Count(issue) } else { - sess := orm.Where("repo_id=?", rid).And("uid=?", uid).And("is_mentioned=?", true) + sess := x.Where("repo_id=?", rid).And("uid=?", uid).And("is_mentioned=?", true) *tmpSess = *sess stats.OpenCount, _ = tmpSess.And("is_closed=?", false).Count(new(IssueUser)) *tmpSess = *sess stats.ClosedCount, _ = tmpSess.And("is_closed=?", true).Count(new(IssueUser)) } nofilter: - stats.AssignCount, _ = orm.Where("repo_id=?", rid).And("is_closed=?", isShowClosed).And("assignee_id=?", uid).Count(issue) - stats.CreateCount, _ = orm.Where("repo_id=?", rid).And("is_closed=?", isShowClosed).And("poster_id=?", uid).Count(issue) - stats.MentionCount, _ = orm.Where("repo_id=?", rid).And("uid=?", uid).And("is_closed=?", isShowClosed).And("is_mentioned=?", true).Count(new(IssueUser)) + stats.AssignCount, _ = x.Where("repo_id=?", rid).And("is_closed=?", isShowClosed).And("assignee_id=?", uid).Count(issue) + stats.CreateCount, _ = x.Where("repo_id=?", rid).And("is_closed=?", isShowClosed).And("poster_id=?", uid).Count(issue) + stats.MentionCount, _ = x.Where("repo_id=?", rid).And("uid=?", uid).And("is_closed=?", isShowClosed).And("is_mentioned=?", true).Count(new(IssueUser)) return stats } @@ -378,28 +378,28 @@ nofilter: func GetUserIssueStats(uid int64, filterMode int) *IssueStats { stats := &IssueStats{} issue := new(Issue) - stats.AssignCount, _ = orm.Where("assignee_id=?", uid).And("is_closed=?", false).Count(issue) - stats.CreateCount, _ = orm.Where("poster_id=?", uid).And("is_closed=?", false).Count(issue) + stats.AssignCount, _ = x.Where("assignee_id=?", uid).And("is_closed=?", false).Count(issue) + stats.CreateCount, _ = x.Where("poster_id=?", uid).And("is_closed=?", false).Count(issue) return stats } // UpdateIssue updates information of issue. func UpdateIssue(issue *Issue) error { - _, err := orm.Id(issue.Id).AllCols().Update(issue) + _, err := x.Id(issue.Id).AllCols().Update(issue) return err } // UpdateIssueUserByStatus updates issue-user pairs by issue status. func UpdateIssueUserPairsByStatus(iid int64, isClosed bool) error { rawSql := "UPDATE `issue_user` SET is_closed = ? WHERE issue_id = ?" - _, err := orm.Exec(rawSql, isClosed, iid) + _, err := x.Exec(rawSql, isClosed, iid) return err } // UpdateIssueUserPairByAssignee updates issue-user pair for assigning. func UpdateIssueUserPairByAssignee(aid, iid int64) error { rawSql := "UPDATE `issue_user` SET is_assigned = ? WHERE issue_id = ?" - if _, err := orm.Exec(rawSql, false, iid); err != nil { + if _, err := x.Exec(rawSql, false, iid); err != nil { return err } @@ -408,14 +408,14 @@ func UpdateIssueUserPairByAssignee(aid, iid int64) error { return nil } rawSql = "UPDATE `issue_user` SET is_assigned = true WHERE uid = ? AND issue_id = ?" - _, err := orm.Exec(rawSql, aid, iid) + _, err := x.Exec(rawSql, aid, iid) return err } // UpdateIssueUserPairByRead updates issue-user pair for reading. func UpdateIssueUserPairByRead(uid, iid int64) error { rawSql := "UPDATE `issue_user` SET is_read = ? WHERE uid = ? AND issue_id = ?" - _, err := orm.Exec(rawSql, true, uid, iid) + _, err := x.Exec(rawSql, true, uid, iid) return err } @@ -423,16 +423,16 @@ func UpdateIssueUserPairByRead(uid, iid int64) error { func UpdateIssueUserPairsByMentions(uids []int64, iid int64) error { for _, uid := range uids { iu := &IssueUser{Uid: uid, IssueId: iid} - has, err := orm.Get(iu) + has, err := x.Get(iu) if err != nil { return err } iu.IsMentioned = true if has { - _, err = orm.Id(iu.Id).AllCols().Update(iu) + _, err = x.Id(iu.Id).AllCols().Update(iu) } else { - _, err = orm.Insert(iu) + _, err = x.Insert(iu) } if err != nil { return err @@ -467,7 +467,7 @@ func (m *Label) CalOpenIssues() { // NewLabel creates new label of repository. func NewLabel(l *Label) error { - _, err := orm.Insert(l) + _, err := x.Insert(l) return err } @@ -478,7 +478,7 @@ func GetLabelById(id int64) (*Label, error) { } l := &Label{Id: id} - has, err := orm.Get(l) + has, err := x.Get(l) if err != nil { return nil, err } else if !has { @@ -490,13 +490,13 @@ func GetLabelById(id int64) (*Label, error) { // GetLabels returns a list of labels of given repository ID. func GetLabels(repoId int64) ([]*Label, error) { labels := make([]*Label, 0, 10) - err := orm.Where("repo_id=?", repoId).Find(&labels) + err := x.Where("repo_id=?", repoId).Find(&labels) return labels, err } // UpdateLabel updates label information. func UpdateLabel(l *Label) error { - _, err := orm.Id(l.Id).Update(l) + _, err := x.Id(l.Id).Update(l) return err } @@ -516,7 +516,7 @@ func DeleteLabel(repoId int64, strId string) error { return err } - sess := orm.NewSession() + sess := x.NewSession() defer sess.Close() if err = sess.Begin(); err != nil { return err @@ -569,7 +569,7 @@ func (m *Milestone) CalOpenIssues() { // NewMilestone creates new milestone of repository. func NewMilestone(m *Milestone) (err error) { - sess := orm.NewSession() + sess := x.NewSession() defer sess.Close() if err = sess.Begin(); err != nil { return err @@ -591,7 +591,7 @@ func NewMilestone(m *Milestone) (err error) { // GetMilestoneById returns the milestone by given ID. func GetMilestoneById(id int64) (*Milestone, error) { m := &Milestone{Id: id} - has, err := orm.Get(m) + has, err := x.Get(m) if err != nil { return nil, err } else if !has { @@ -603,7 +603,7 @@ func GetMilestoneById(id int64) (*Milestone, error) { // GetMilestoneByIndex returns the milestone of given repository and index. func GetMilestoneByIndex(repoId, idx int64) (*Milestone, error) { m := &Milestone{RepoId: repoId, Index: idx} - has, err := orm.Get(m) + has, err := x.Get(m) if err != nil { return nil, err } else if !has { @@ -615,13 +615,13 @@ func GetMilestoneByIndex(repoId, idx int64) (*Milestone, error) { // GetMilestones returns a list of milestones of given repository and status. func GetMilestones(repoId int64, isClosed bool) ([]*Milestone, error) { miles := make([]*Milestone, 0, 10) - err := orm.Where("repo_id=?", repoId).And("is_closed=?", isClosed).Find(&miles) + err := x.Where("repo_id=?", repoId).And("is_closed=?", isClosed).Find(&miles) return miles, err } // UpdateMilestone updates information of given milestone. func UpdateMilestone(m *Milestone) error { - _, err := orm.Id(m.Id).Update(m) + _, err := x.Id(m.Id).Update(m) return err } @@ -632,7 +632,7 @@ func ChangeMilestoneStatus(m *Milestone, isClosed bool) (err error) { return err } - sess := orm.NewSession() + sess := x.NewSession() defer sess.Close() if err = sess.Begin(); err != nil { return err @@ -658,7 +658,7 @@ func ChangeMilestoneStatus(m *Milestone, isClosed bool) (err error) { // ChangeMilestoneAssign changes assignment of milestone for issue. func ChangeMilestoneAssign(oldMid, mid int64, issue *Issue) (err error) { - sess := orm.NewSession() + sess := x.NewSession() defer sess.Close() if err = sess.Begin(); err != nil { return err @@ -717,7 +717,7 @@ func ChangeMilestoneAssign(oldMid, mid int64, issue *Issue) (err error) { // DeleteMilestone deletes a milestone. func DeleteMilestone(m *Milestone) (err error) { - sess := orm.NewSession() + sess := x.NewSession() defer sess.Close() if err = sess.Begin(); err != nil { return err @@ -777,7 +777,7 @@ type Comment struct { // CreateComment creates comment of issue or commit. func CreateComment(userId, repoId, issueId, commitId, line int64, cmtType int, content string) error { - sess := orm.NewSession() + sess := x.NewSession() defer sess.Close() if err := sess.Begin(); err != nil { return err @@ -816,6 +816,6 @@ func CreateComment(userId, repoId, issueId, commitId, line int64, cmtType int, c // GetIssueComments returns list of comment by given issue id. func GetIssueComments(issueId int64) ([]Comment, error) { comments := make([]Comment, 0, 10) - err := orm.Asc("created").Find(&comments, &Comment{IssueId: issueId}) + err := x.Asc("created").Find(&comments, &Comment{IssueId: issueId}) return comments, err } diff --git a/models/login.go b/models/login.go index 863ba44e..98c5c64e 100644 --- a/models/login.go +++ b/models/login.go @@ -109,19 +109,19 @@ func (source *LoginSource) BeforeSet(colName string, val xorm.Cell) { } func CreateSource(source *LoginSource) error { - _, err := orm.Insert(source) + _, err := x.Insert(source) return err } func GetAuths() ([]*LoginSource, error) { var auths = make([]*LoginSource, 0, 5) - err := orm.Find(&auths) + err := x.Find(&auths) return auths, err } func GetLoginSourceById(id int64) (*LoginSource, error) { source := new(LoginSource) - has, err := orm.Id(id).Get(source) + has, err := x.Id(id).Get(source) if err != nil { return nil, err } else if !has { @@ -131,19 +131,19 @@ func GetLoginSourceById(id int64) (*LoginSource, error) { } func UpdateSource(source *LoginSource) error { - _, err := orm.Id(source.Id).AllCols().Update(source) + _, err := x.Id(source.Id).AllCols().Update(source) return err } func DelLoginSource(source *LoginSource) error { - cnt, err := orm.Count(&User{LoginSource: source.Id}) + cnt, err := x.Count(&User{LoginSource: source.Id}) if err != nil { return err } if cnt > 0 { return ErrAuthenticationUserUsed } - _, err = orm.Id(source.Id).Delete(&LoginSource{}) + _, err = x.Id(source.Id).Delete(&LoginSource{}) return err } @@ -156,7 +156,7 @@ func UserSignIn(uname, passwd string) (*User, error) { u = &User{LowerName: strings.ToLower(uname)} } - has, err := orm.Get(u) + has, err := x.Get(u) if err != nil { return nil, err } @@ -182,7 +182,7 @@ func UserSignIn(uname, passwd string) (*User, error) { } else { if !has { var sources []LoginSource - if err = orm.UseBool().Find(&sources, + if err = x.UseBool().Find(&sources, &LoginSource{IsActived: true, AllowAutoRegister: true}); err != nil { return nil, err } @@ -209,7 +209,7 @@ func UserSignIn(uname, passwd string) (*User, error) { } var source LoginSource - hasSource, err := orm.Id(u.LoginSource).Get(&source) + hasSource, err := x.Id(u.LoginSource).Get(&source) if err != nil { return nil, err } else if !hasSource { diff --git a/models/models.go b/models/models.go index a59c0517..d6273d7f 100644 --- a/models/models.go +++ b/models/models.go @@ -18,7 +18,7 @@ import ( ) var ( - orm *xorm.Engine + x *xorm.Engine tables []interface{} HasEngine bool @@ -88,7 +88,7 @@ func NewTestEngine(x *xorm.Engine) (err error) { func SetEngine() (err error) { switch DbCfg.Type { case "mysql": - orm, err = xorm.NewEngine("mysql", fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8", + x, err = xorm.NewEngine("mysql", fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8", DbCfg.User, DbCfg.Pwd, DbCfg.Host, DbCfg.Name)) case "postgres": var host, port = "127.0.0.1", "5432" @@ -99,11 +99,11 @@ func SetEngine() (err error) { if len(fields) > 1 && len(strings.TrimSpace(fields[1])) > 0 { port = fields[1] } - orm, err = xorm.NewEngine("postgres", fmt.Sprintf("user=%s password=%s host=%s port=%s dbname=%s sslmode=%s", + x, err = xorm.NewEngine("postgres", fmt.Sprintf("user=%s password=%s host=%s port=%s dbname=%s sslmode=%s", DbCfg.User, DbCfg.Pwd, host, port, DbCfg.Name, DbCfg.SslMode)) case "sqlite3": os.MkdirAll(path.Dir(DbCfg.Path), os.ModePerm) - orm, err = xorm.NewEngine("sqlite3", DbCfg.Path) + x, err = xorm.NewEngine("sqlite3", DbCfg.Path) default: return fmt.Errorf("Unknown database type: %s", DbCfg.Type) } @@ -120,11 +120,11 @@ func SetEngine() (err error) { if err != nil { return fmt.Errorf("models.init(fail to create xorm.log): %v", err) } - orm.Logger = xorm.NewSimpleLogger(f) + x.Logger = xorm.NewSimpleLogger(f) - orm.ShowSQL = true - orm.ShowDebug = true - orm.ShowErr = true + x.ShowSQL = true + x.ShowDebug = true + x.ShowErr = true return nil } @@ -132,7 +132,7 @@ func NewEngine() (err error) { if err = SetEngine(); err != nil { return err } - if err = orm.Sync(tables...); err != nil { + if err = x.Sync2(tables...); err != nil { return fmt.Errorf("sync database struct error: %v\n", err) } return nil @@ -147,24 +147,24 @@ type Statistic struct { } func GetStatistic() (stats Statistic) { - stats.Counter.User, _ = orm.Count(new(User)) - stats.Counter.PublicKey, _ = orm.Count(new(PublicKey)) - stats.Counter.Repo, _ = orm.Count(new(Repository)) - stats.Counter.Watch, _ = orm.Count(new(Watch)) - stats.Counter.Action, _ = orm.Count(new(Action)) - stats.Counter.Access, _ = orm.Count(new(Access)) - stats.Counter.Issue, _ = orm.Count(new(Issue)) - stats.Counter.Comment, _ = orm.Count(new(Comment)) - stats.Counter.Mirror, _ = orm.Count(new(Mirror)) - stats.Counter.Oauth, _ = orm.Count(new(Oauth2)) - stats.Counter.Release, _ = orm.Count(new(Release)) - stats.Counter.LoginSource, _ = orm.Count(new(LoginSource)) - stats.Counter.Webhook, _ = orm.Count(new(Webhook)) - stats.Counter.Milestone, _ = orm.Count(new(Milestone)) + stats.Counter.User, _ = x.Count(new(User)) + stats.Counter.PublicKey, _ = x.Count(new(PublicKey)) + stats.Counter.Repo, _ = x.Count(new(Repository)) + stats.Counter.Watch, _ = x.Count(new(Watch)) + stats.Counter.Action, _ = x.Count(new(Action)) + stats.Counter.Access, _ = x.Count(new(Access)) + stats.Counter.Issue, _ = x.Count(new(Issue)) + stats.Counter.Comment, _ = x.Count(new(Comment)) + stats.Counter.Mirror, _ = x.Count(new(Mirror)) + stats.Counter.Oauth, _ = x.Count(new(Oauth2)) + stats.Counter.Release, _ = x.Count(new(Release)) + stats.Counter.LoginSource, _ = x.Count(new(LoginSource)) + stats.Counter.Webhook, _ = x.Count(new(Webhook)) + stats.Counter.Milestone, _ = x.Count(new(Milestone)) return } // DumpDatabase dumps all data from database to file system. func DumpDatabase(filePath string) error { - return orm.DumpAllToFile(filePath) + return x.DumpAllToFile(filePath) } diff --git a/models/oauth2.go b/models/oauth2.go index 61044d68..4b024a26 100644 --- a/models/oauth2.go +++ b/models/oauth2.go @@ -8,16 +8,16 @@ import ( "errors" ) -// OT: Oauth2 Type +type OauthType int + const ( - OT_GITHUB = iota + 1 - OT_GOOGLE - OT_TWITTER - OT_QQ - OT_WEIBO - OT_BITBUCKET - OT_OSCHINA - OT_FACEBOOK + GITHUB OauthType = iota + 1 + GOOGLE + TWITTER + QQ + WEIBO + BITBUCKET + FACEBOOK ) var ( @@ -35,18 +35,18 @@ type Oauth2 struct { } func BindUserOauth2(userId, oauthId int64) error { - _, err := orm.Id(oauthId).Update(&Oauth2{Uid: userId}) + _, err := x.Id(oauthId).Update(&Oauth2{Uid: userId}) return err } func AddOauth2(oa *Oauth2) error { - _, err := orm.Insert(oa) + _, err := x.Insert(oa) return err } func GetOauth2(identity string) (oa *Oauth2, err error) { oa = &Oauth2{Identity: identity} - isExist, err := orm.Get(oa) + isExist, err := x.Get(oa) if err != nil { return } else if !isExist { @@ -60,7 +60,7 @@ func GetOauth2(identity string) (oa *Oauth2, err error) { func GetOauth2ById(id int64) (oa *Oauth2, err error) { oa = new(Oauth2) - has, err := orm.Id(id).Get(oa) + has, err := x.Id(id).Get(oa) if err != nil { return nil, err } else if !has { @@ -71,18 +71,18 @@ func GetOauth2ById(id int64) (oa *Oauth2, err error) { // GetOauthByUserId returns list of oauthes that are releated to given user. func GetOauthByUserId(uid int64) (oas []*Oauth2, err error) { - err = orm.Find(&oas, Oauth2{Uid: uid}) + err = x.Find(&oas, Oauth2{Uid: uid}) return oas, err } // DeleteOauth2ById deletes a oauth2 by ID. func DeleteOauth2ById(id int64) error { - _, err := orm.Delete(&Oauth2{Id: id}) + _, err := x.Delete(&Oauth2{Id: id}) return err } // CleanUnbindOauth deletes all unbind OAuthes. func CleanUnbindOauth() error { - _, err := orm.Delete(&Oauth2{Uid: -1}) + _, err := x.Delete(&Oauth2{Uid: -1}) return err } diff --git a/models/publickey.go b/models/publickey.go index b0021a68..35768b48 100644 --- a/models/publickey.go +++ b/models/publickey.go @@ -107,7 +107,7 @@ func saveAuthorizedKeyFile(key *PublicKey) error { // AddPublicKey adds new public key to database and authorized_keys file. func AddPublicKey(key *PublicKey) (err error) { - has, err := orm.Get(key) + has, err := x.Get(key) if err != nil { return err } else if has { @@ -130,11 +130,11 @@ func AddPublicKey(key *PublicKey) (err error) { key.Fingerprint = strings.Split(stdout, " ")[1] // Save SSH key. - if _, err = orm.Insert(key); err != nil { + if _, err = x.Insert(key); err != nil { return err } else if err = saveAuthorizedKeyFile(key); err != nil { // Roll back. - if _, err2 := orm.Delete(key); err2 != nil { + if _, err2 := x.Delete(key); err2 != nil { return err2 } return err @@ -146,7 +146,7 @@ func AddPublicKey(key *PublicKey) (err error) { // ListPublicKey returns a list of all public keys that user has. func ListPublicKey(uid int64) ([]PublicKey, error) { keys := make([]PublicKey, 0, 5) - err := orm.Find(&keys, &PublicKey{OwnerId: uid}) + err := x.Find(&keys, &PublicKey{OwnerId: uid}) return keys, err } @@ -205,14 +205,14 @@ func rewriteAuthorizedKeys(key *PublicKey, p, tmpP string) error { // DeletePublicKey deletes SSH key information both in database and authorized_keys file. func DeletePublicKey(key *PublicKey) error { - has, err := orm.Get(key) + has, err := x.Get(key) if err != nil { return err } else if !has { return ErrKeyNotExist } - if _, err = orm.Delete(key); err != nil { + if _, err = x.Delete(key); err != nil { return err } diff --git a/models/release.go b/models/release.go index 32e8c92c..3e1a7811 100644 --- a/models/release.go +++ b/models/release.go @@ -43,7 +43,7 @@ func IsReleaseExist(repoId int64, tagName string) (bool, error) { return false, nil } - return orm.Get(&Release{RepoId: repoId, LowerTagName: strings.ToLower(tagName)}) + return x.Get(&Release{RepoId: repoId, LowerTagName: strings.ToLower(tagName)}) } func createTag(gitRepo *git.Repository, rel *Release) error { @@ -86,7 +86,7 @@ func CreateRelease(gitRepo *git.Repository, rel *Release) error { return err } rel.LowerTagName = strings.ToLower(rel.TagName) - _, err = orm.InsertOne(rel) + _, err = x.InsertOne(rel) return err } @@ -100,13 +100,13 @@ func GetRelease(repoId int64, tagName string) (*Release, error) { } rel := &Release{RepoId: repoId, LowerTagName: strings.ToLower(tagName)} - _, err = orm.Get(rel) + _, err = x.Get(rel) return rel, err } // GetReleasesByRepoId returns a list of releases of repository. func GetReleasesByRepoId(repoId int64) (rels []*Release, err error) { - err = orm.Desc("created").Find(&rels, Release{RepoId: repoId}) + err = x.Desc("created").Find(&rels, Release{RepoId: repoId}) return rels, err } @@ -141,6 +141,6 @@ func UpdateRelease(gitRepo *git.Repository, rel *Release) (err error) { if err = createTag(gitRepo, rel); err != nil { return err } - _, err = orm.Id(rel.Id).AllCols().Update(rel) + _, err = x.Id(rel.Id).AllCols().Update(rel) return err } diff --git a/models/repo.go b/models/repo.go index 6b98d0e4..4ccaccbf 100644 --- a/models/repo.go +++ b/models/repo.go @@ -147,7 +147,7 @@ func (repo *Repository) GetOwner() (err error) { // IsRepositoryExist returns true if the repository with given name under user has already existed. func IsRepositoryExist(u *User, repoName string) (bool, error) { repo := Repository{OwnerId: u.Id} - has, err := orm.Where("lower_name = ?", strings.ToLower(repoName)).Get(&repo) + has, err := x.Where("lower_name = ?", strings.ToLower(repoName)).Get(&repo) if err != nil { return has, err } else if !has { @@ -197,7 +197,7 @@ func MirrorRepository(repoId int64, userName, repoName, repoPath, url string) er return errors.New("git clone --mirror: " + stderr) } - if _, err = orm.InsertOne(&Mirror{ + if _, err = x.InsertOne(&Mirror{ RepoId: repoId, RepoName: strings.ToLower(userName + "/" + repoName), Interval: 24, @@ -211,7 +211,7 @@ func MirrorRepository(repoId int64, userName, repoName, repoPath, url string) er func GetMirror(repoId int64) (*Mirror, error) { m := &Mirror{RepoId: repoId} - has, err := orm.Get(m) + has, err := x.Get(m) if err != nil { return nil, err } else if !has { @@ -221,13 +221,13 @@ func GetMirror(repoId int64) (*Mirror, error) { } func UpdateMirror(m *Mirror) error { - _, err := orm.Id(m.Id).Update(m) + _, err := x.Id(m.Id).Update(m) return err } // MirrorUpdate checks and updates mirror repositories. func MirrorUpdate() { - if err := orm.Iterate(new(Mirror), func(idx int, bean interface{}) error { + if err := x.Iterate(new(Mirror), func(idx int, bean interface{}) error { m := bean.(*Mirror) if m.NextUpdate.After(time.Now()) { return nil @@ -481,7 +481,7 @@ func CreateRepository(user *User, name, desc, lang, license string, private, mir repoPath := RepoPath(user.Name, repo.Name) - sess := orm.NewSession() + sess := x.NewSession() defer sess.Close() sess.Begin() @@ -566,13 +566,13 @@ func CreateRepository(user *User, name, desc, lang, license string, private, mir // It also auto-gets corresponding users. func GetRepositoriesWithUsers(num, offset int) ([]*Repository, error) { repos := make([]*Repository, 0, num) - if err := orm.Limit(num, offset).Asc("id").Find(&repos); err != nil { + if err := x.Limit(num, offset).Asc("id").Find(&repos); err != nil { return nil, err } for _, repo := range repos { repo.Owner = &User{Id: repo.OwnerId} - has, err := orm.Get(repo.Owner) + has, err := x.Get(repo.Owner) if err != nil { return nil, err } else if !has { @@ -597,11 +597,11 @@ func TransferOwnership(user *User, newOwner string, repo *Repository) (err error // Update accesses. accesses := make([]Access, 0, 10) - if err = orm.Find(&accesses, &Access{RepoName: user.LowerName + "/" + repo.LowerName}); err != nil { + if err = x.Find(&accesses, &Access{RepoName: user.LowerName + "/" + repo.LowerName}); err != nil { return err } - sess := orm.NewSession() + sess := x.NewSession() defer sess.Close() if err = sess.Begin(); err != nil { return err @@ -662,11 +662,11 @@ func TransferOwnership(user *User, newOwner string, repo *Repository) (err error func ChangeRepositoryName(userName, oldRepoName, newRepoName string) (err error) { // Update accesses. accesses := make([]Access, 0, 10) - if err = orm.Find(&accesses, &Access{RepoName: strings.ToLower(userName + "/" + oldRepoName)}); err != nil { + if err = x.Find(&accesses, &Access{RepoName: strings.ToLower(userName + "/" + oldRepoName)}); err != nil { return err } - sess := orm.NewSession() + sess := x.NewSession() defer sess.Close() if err = sess.Begin(); err != nil { return err @@ -697,21 +697,21 @@ func UpdateRepository(repo *Repository) error { if len(repo.Website) > 255 { repo.Website = repo.Website[:255] } - _, err := orm.Id(repo.Id).AllCols().Update(repo) + _, err := x.Id(repo.Id).AllCols().Update(repo) return err } // DeleteRepository deletes a repository for a user or orgnaztion. func DeleteRepository(userId, repoId int64, userName string) (err error) { repo := &Repository{Id: repoId, OwnerId: userId} - has, err := orm.Get(repo) + has, err := x.Get(repo) if err != nil { return err } else if !has { return ErrRepoNotExist } - sess := orm.NewSession() + sess := x.NewSession() defer sess.Close() if err = sess.Begin(); err != nil { return err @@ -750,7 +750,7 @@ func DeleteRepository(userId, repoId int64, userName string) (err error) { } // Delete comments. - if err = orm.Iterate(&Issue{RepoId: repoId}, func(idx int, bean interface{}) error { + if err = x.Iterate(&Issue{RepoId: repoId}, func(idx int, bean interface{}) error { issue := bean.(*Issue) if _, err = sess.Delete(&Comment{IssueId: issue.Id}); err != nil { sess.Rollback() @@ -785,7 +785,7 @@ func GetRepositoryByName(userId int64, repoName string) (*Repository, error) { OwnerId: userId, LowerName: strings.ToLower(repoName), } - has, err := orm.Get(repo) + has, err := x.Get(repo) if err != nil { return nil, err } else if !has { @@ -797,7 +797,7 @@ func GetRepositoryByName(userId int64, repoName string) (*Repository, error) { // GetRepositoryById returns the repository by given id if exists. func GetRepositoryById(id int64) (*Repository, error) { repo := &Repository{} - has, err := orm.Id(id).Get(repo) + has, err := x.Id(id).Get(repo) if err != nil { return nil, err } else if !has { @@ -809,7 +809,7 @@ func GetRepositoryById(id int64) (*Repository, error) { // GetRepositories returns a list of repositories of given user. func GetRepositories(uid int64, private bool) ([]*Repository, error) { repos := make([]*Repository, 0, 10) - sess := orm.Desc("updated") + sess := x.Desc("updated") if !private { sess.Where("is_private=?", false) } @@ -820,19 +820,19 @@ func GetRepositories(uid int64, private bool) ([]*Repository, error) { // GetRecentUpdatedRepositories returns the list of repositories that are recently updated. func GetRecentUpdatedRepositories() (repos []*Repository, err error) { - err = orm.Where("is_private=?", false).Limit(5).Desc("updated").Find(&repos) + err = x.Where("is_private=?", false).Limit(5).Desc("updated").Find(&repos) return repos, err } // GetRepositoryCount returns the total number of repositories of user. func GetRepositoryCount(user *User) (int64, error) { - return orm.Count(&Repository{OwnerId: user.Id}) + return x.Count(&Repository{OwnerId: user.Id}) } // GetCollaboratorNames returns a list of user name of repository's collaborators. func GetCollaboratorNames(repoName string) ([]string, error) { accesses := make([]*Access, 0, 10) - if err := orm.Find(&accesses, &Access{RepoName: strings.ToLower(repoName)}); err != nil { + if err := x.Find(&accesses, &Access{RepoName: strings.ToLower(repoName)}); err != nil { return nil, err } @@ -847,7 +847,7 @@ func GetCollaboratorNames(repoName string) ([]string, error) { func GetCollaborativeRepos(uname string) ([]*Repository, error) { uname = strings.ToLower(uname) accesses := make([]*Access, 0, 10) - if err := orm.Find(&accesses, &Access{UserName: uname}); err != nil { + if err := x.Find(&accesses, &Access{UserName: uname}); err != nil { return nil, err } @@ -876,7 +876,7 @@ func GetCollaborativeRepos(uname string) ([]*Repository, error) { // GetCollaborators returns a list of users of repository's collaborators. func GetCollaborators(repoName string) (us []*User, err error) { accesses := make([]*Access, 0, 10) - if err = orm.Find(&accesses, &Access{RepoName: strings.ToLower(repoName)}); err != nil { + if err = x.Find(&accesses, &Access{RepoName: strings.ToLower(repoName)}); err != nil { return nil, err } @@ -900,18 +900,18 @@ type Watch struct { // Watch or unwatch repository. func WatchRepo(uid, rid int64, watch bool) (err error) { if watch { - if _, err = orm.Insert(&Watch{RepoId: rid, UserId: uid}); err != nil { + if _, err = x.Insert(&Watch{RepoId: rid, UserId: uid}); err != nil { return err } rawSql := "UPDATE `repository` SET num_watches = num_watches + 1 WHERE id = ?" - _, err = orm.Exec(rawSql, rid) + _, err = x.Exec(rawSql, rid) } else { - if _, err = orm.Delete(&Watch{0, uid, rid}); err != nil { + if _, err = x.Delete(&Watch{0, uid, rid}); err != nil { return err } rawSql := "UPDATE `repository` SET num_watches = num_watches - 1 WHERE id = ?" - _, err = orm.Exec(rawSql, rid) + _, err = x.Exec(rawSql, rid) } return err } @@ -919,7 +919,7 @@ func WatchRepo(uid, rid int64, watch bool) (err error) { // GetWatchers returns all watchers of given repository. func GetWatchers(rid int64) ([]*Watch, error) { watches := make([]*Watch, 0, 10) - err := orm.Find(&watches, &Watch{RepoId: rid}) + err := x.Find(&watches, &Watch{RepoId: rid}) return watches, err } @@ -933,7 +933,7 @@ func NotifyWatchers(act *Action) error { // Add feed for actioner. act.UserId = act.ActUserId - if _, err = orm.InsertOne(act); err != nil { + if _, err = x.InsertOne(act); err != nil { return errors.New("repo.NotifyWatchers(create action): " + err.Error()) } @@ -944,7 +944,7 @@ func NotifyWatchers(act *Action) error { act.Id = 0 act.UserId = watches[i].UserId - if _, err = orm.InsertOne(act); err != nil { + if _, err = x.InsertOne(act); err != nil { return errors.New("repo.NotifyWatchers(create action): " + err.Error()) } } @@ -953,7 +953,7 @@ func NotifyWatchers(act *Action) error { // IsWatching checks if user has watched given repository. func IsWatching(uid, rid int64) bool { - has, _ := orm.Get(&Watch{0, uid, rid}) + has, _ := x.Get(&Watch{0, uid, rid}) return has } diff --git a/models/user.go b/models/user.go index 04ea1fd6..50d81c94 100644 --- a/models/user.go +++ b/models/user.go @@ -110,7 +110,7 @@ func IsUserExist(name string) (bool, error) { if len(name) == 0 { return false, nil } - return orm.Get(&User{LowerName: strings.ToLower(name)}) + return x.Get(&User{LowerName: strings.ToLower(name)}) } // IsEmailUsed returns true if the e-mail has been used. @@ -118,7 +118,7 @@ func IsEmailUsed(email string) (bool, error) { if len(email) == 0 { return false, nil } - return orm.Get(&User{Email: email}) + return x.Get(&User{Email: email}) } // GetUserSalt returns a user salt token @@ -153,10 +153,10 @@ func RegisterUser(user *User) (*User, error) { user.Rands = GetUserSalt() user.Salt = GetUserSalt() user.EncodePasswd() - if _, err = orm.Insert(user); err != nil { + if _, err = x.Insert(user); err != nil { return nil, err } else if err = os.MkdirAll(UserPath(user.Name), os.ModePerm); err != nil { - if _, err := orm.Id(user.Id).Delete(&User{}); err != nil { + if _, err := x.Id(user.Id).Delete(&User{}); err != nil { return nil, errors.New(fmt.Sprintf( "both create userpath %s and delete table record faild: %v", user.Name, err)) } @@ -166,7 +166,7 @@ func RegisterUser(user *User) (*User, error) { if user.Id == 1 { user.IsAdmin = true user.IsActive = true - _, err = orm.Id(user.Id).UseBool().Update(user) + _, err = x.Id(user.Id).UseBool().Update(user) } return user, err } @@ -174,7 +174,7 @@ func RegisterUser(user *User) (*User, error) { // GetUsers returns given number of user objects with offset. func GetUsers(num, offset int) ([]User, error) { users := make([]User, 0, num) - err := orm.Limit(num, offset).Asc("id").Find(&users) + err := x.Limit(num, offset).Asc("id").Find(&users) return users, err } @@ -218,11 +218,11 @@ func ChangeUserName(user *User, newUserName string) (err error) { // Update accesses of user. accesses := make([]Access, 0, 10) - if err = orm.Find(&accesses, &Access{UserName: user.LowerName}); err != nil { + if err = x.Find(&accesses, &Access{UserName: user.LowerName}); err != nil { return err } - sess := orm.NewSession() + sess := x.NewSession() defer sess.Close() if err = sess.Begin(); err != nil { return err @@ -245,7 +245,7 @@ func ChangeUserName(user *User, newUserName string) (err error) { for i := range repos { accesses = make([]Access, 0, 10) // Update accesses of user repository. - if err = orm.Find(&accesses, &Access{RepoName: user.LowerName + "/" + repos[i].LowerName}); err != nil { + if err = x.Find(&accesses, &Access{RepoName: user.LowerName + "/" + repos[i].LowerName}); err != nil { return err } @@ -278,7 +278,7 @@ func UpdateUser(u *User) (err error) { u.Website = u.Website[:255] } - _, err = orm.Id(u.Id).AllCols().Update(u) + _, err = x.Id(u.Id).AllCols().Update(u) return err } @@ -295,33 +295,33 @@ func DeleteUser(user *User) error { // TODO: check issues, other repos' commits // Delete all followers. - if _, err = orm.Delete(&Follow{FollowId: user.Id}); err != nil { + if _, err = x.Delete(&Follow{FollowId: user.Id}); err != nil { return err } // Delete oauth2. - if _, err = orm.Delete(&Oauth2{Uid: user.Id}); err != nil { + if _, err = x.Delete(&Oauth2{Uid: user.Id}); err != nil { return err } // Delete all feeds. - if _, err = orm.Delete(&Action{UserId: user.Id}); err != nil { + if _, err = x.Delete(&Action{UserId: user.Id}); err != nil { return err } // Delete all watches. - if _, err = orm.Delete(&Watch{UserId: user.Id}); err != nil { + if _, err = x.Delete(&Watch{UserId: user.Id}); err != nil { return err } // Delete all accesses. - if _, err = orm.Delete(&Access{UserName: user.LowerName}); err != nil { + if _, err = x.Delete(&Access{UserName: user.LowerName}); err != nil { return err } // Delete all SSH keys. keys := make([]*PublicKey, 0, 10) - if err = orm.Find(&keys, &PublicKey{OwnerId: user.Id}); err != nil { + if err = x.Find(&keys, &PublicKey{OwnerId: user.Id}); err != nil { return err } for _, key := range keys { @@ -335,7 +335,13 @@ func DeleteUser(user *User) error { return err } - _, err = orm.Delete(user) + _, err = x.Delete(user) + return err +} + +// DeleteInactivateUsers deletes all inactivate users. +func DeleteInactivateUsers() error { + _, err := x.Where("is_active=?", false).Delete(new(User)) return err } @@ -347,7 +353,7 @@ func UserPath(userName string) string { func GetUserByKeyId(keyId int64) (*User, error) { user := new(User) rawSql := "SELECT a.* FROM `user` AS a, public_key AS b WHERE a.id = b.owner_id AND b.id=?" - has, err := orm.Sql(rawSql, keyId).Get(user) + has, err := x.Sql(rawSql, keyId).Get(user) if err != nil { return nil, err } else if !has { @@ -359,7 +365,7 @@ func GetUserByKeyId(keyId int64) (*User, error) { // GetUserById returns the user object by given ID if exists. func GetUserById(id int64) (*User, error) { u := new(User) - has, err := orm.Id(id).Get(u) + has, err := x.Id(id).Get(u) if err != nil { return nil, err } else if !has { @@ -374,7 +380,7 @@ func GetUserByName(name string) (*User, error) { return nil, ErrUserNotExist } user := &User{LowerName: strings.ToLower(name)} - has, err := orm.Get(user) + has, err := x.Get(user) if err != nil { return nil, err } else if !has { @@ -415,7 +421,7 @@ func GetUserByEmail(email string) (*User, error) { return nil, ErrUserNotExist } user := &User{Email: strings.ToLower(email)} - has, err := orm.Get(user) + has, err := x.Get(user) if err != nil { return nil, err } else if !has { @@ -439,7 +445,7 @@ func SearchUserByName(key string, limit int) (us []*User, err error) { key = strings.ToLower(key) us = make([]*User, 0, limit) - err = orm.Limit(limit).Where("lower_name like '%" + key + "%'").Find(&us) + err = x.Limit(limit).Where("lower_name like '%" + key + "%'").Find(&us) return us, err } @@ -452,7 +458,7 @@ type Follow struct { // FollowUser marks someone be another's follower. func FollowUser(userId int64, followId int64) (err error) { - session := orm.NewSession() + session := x.NewSession() defer session.Close() session.Begin() @@ -477,7 +483,7 @@ func FollowUser(userId int64, followId int64) (err error) { // UnFollowUser unmarks someone be another's follower. func UnFollowUser(userId int64, unFollowId int64) (err error) { - session := orm.NewSession() + session := x.NewSession() defer session.Close() session.Begin() diff --git a/models/webhook.go b/models/webhook.go index ffd47c8f..9044befb 100644 --- a/models/webhook.go +++ b/models/webhook.go @@ -68,14 +68,14 @@ func (w *Webhook) HasPushEvent() bool { // CreateWebhook creates a new web hook. func CreateWebhook(w *Webhook) error { - _, err := orm.Insert(w) + _, err := x.Insert(w) return err } // GetWebhookById returns webhook by given ID. func GetWebhookById(hookId int64) (*Webhook, error) { w := &Webhook{Id: hookId} - has, err := orm.Get(w) + has, err := x.Get(w) if err != nil { return nil, err } else if !has { @@ -86,25 +86,25 @@ func GetWebhookById(hookId int64) (*Webhook, error) { // GetActiveWebhooksByRepoId returns all active webhooks of repository. func GetActiveWebhooksByRepoId(repoId int64) (ws []*Webhook, err error) { - err = orm.Find(&ws, &Webhook{RepoId: repoId, IsActive: true}) + err = x.Find(&ws, &Webhook{RepoId: repoId, IsActive: true}) return ws, err } // GetWebhooksByRepoId returns all webhooks of repository. func GetWebhooksByRepoId(repoId int64) (ws []*Webhook, err error) { - err = orm.Find(&ws, &Webhook{RepoId: repoId}) + err = x.Find(&ws, &Webhook{RepoId: repoId}) return ws, err } // UpdateWebhook updates information of webhook. func UpdateWebhook(w *Webhook) error { - _, err := orm.AllCols().Update(w) + _, err := x.AllCols().Update(w) return err } // DeleteWebhook deletes webhook of repository. func DeleteWebhook(hookId int64) error { - _, err := orm.Delete(&Webhook{Id: hookId}) + _, err := x.Delete(&Webhook{Id: hookId}) return err } @@ -174,20 +174,20 @@ func CreateHookTask(t *HookTask) error { return err } t.PayloadContent = string(data) - _, err = orm.Insert(t) + _, err = x.Insert(t) return err } // UpdateHookTask updates information of hook task. func UpdateHookTask(t *HookTask) error { - _, err := orm.AllCols().Update(t) + _, err := x.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), + x.Where("is_deliveried=?", false).Iterate(new(HookTask), func(idx int, bean interface{}) error { t := bean.(*HookTask) // Only support JSON now. diff --git a/modules/auth/user.go b/modules/auth/user.go index 3763c0fc..fdbba31a 100644 --- a/modules/auth/user.go +++ b/modules/auth/user.go @@ -16,20 +16,32 @@ import ( "github.com/gogits/gogs/modules/base" "github.com/gogits/gogs/modules/log" "github.com/gogits/gogs/modules/middleware/binding" + "github.com/gogits/gogs/modules/setting" ) // SignedInId returns the id of signed in user. -func SignedInId(sess session.SessionStore) int64 { +func SignedInId(header http.Header, sess session.SessionStore) int64 { if !models.HasEngine { return 0 } - uid := sess.Get("userId") - if uid == nil { - return 0 + id, _ := base.StrTo(header.Get(setting.ReverseProxyAuthUid)).Int64() + if id <= 0 { + uid := sess.Get("userId") + if uid == nil { + return 0 + } + var ok bool + if id, ok = uid.(int64); !ok { + return 0 + } } - if id, ok := uid.(int64); ok { + + if id > 0 { if _, err := models.GetUserById(id); err != nil { + if err != models.ErrUserNotExist { + log.Error("auth.user.SignedInId(GetUserById): %v", err) + } return 0 } return id @@ -37,21 +49,9 @@ func SignedInId(sess session.SessionStore) int64 { return 0 } -// SignedInName returns the name of signed in user. -func SignedInName(sess session.SessionStore) string { - uname := sess.Get("userName") - if uname == nil { - return "" - } - if s, ok := uname.(string); ok { - return s - } - return "" -} - // SignedInUser returns the user object of signed user. -func SignedInUser(sess session.SessionStore) *models.User { - uid := SignedInId(sess) +func SignedInUser(header http.Header, sess session.SessionStore) *models.User { + uid := SignedInId(header, sess) if uid <= 0 { return nil } @@ -65,8 +65,8 @@ func SignedInUser(sess session.SessionStore) *models.User { } // IsSignedIn check if any user has signed in. -func IsSignedIn(sess session.SessionStore) bool { - return SignedInId(sess) > 0 +func IsSignedIn(header http.Header, sess session.SessionStore) bool { + return SignedInId(header, sess) > 0 } type FeedsForm struct { diff --git a/modules/bin/conf.go b/modules/bin/conf.go index 80139536..71a9fac8 100644 --- a/modules/bin/conf.go +++ b/modules/bin/conf.go @@ -29,233 +29,241 @@ func conf_app_ini() ([]byte, error) { return bindata_read([]byte{ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x00, 0xff, 0xb4, 0x59, 0xdd, 0x72, 0xdb, 0xc8, 0xb1, 0xbe, 0xc7, 0x53, 0x8c, 0x79, 0x76, 0xcf, - 0xda, 0xa7, 0x24, 0x92, 0x92, 0x8f, 0x65, 0xad, 0xb4, 0xae, 0x98, 0x22, - 0x41, 0x09, 0xb1, 0x48, 0x6a, 0x01, 0x48, 0x8e, 0xe3, 0x52, 0xa1, 0x20, - 0x60, 0x48, 0x4e, 0x04, 0x60, 0x20, 0xcc, 0x50, 0x14, 0x73, 0x97, 0x57, - 0x48, 0xe5, 0x69, 0xf2, 0x3c, 0xb9, 0xc8, 0x63, 0xe4, 0xeb, 0x01, 0x40, - 0x81, 0x34, 0xd7, 0xeb, 0xfc, 0x55, 0x52, 0x16, 0x31, 0xd3, 0xd3, 0xd3, - 0xfd, 0xf5, 0xff, 0xec, 0x29, 0xeb, 0xe5, 0x39, 0xcb, 0xc2, 0x94, 0x33, - 0x3d, 0x0f, 0x35, 0x53, 0x73, 0xb9, 0x54, 0x4c, 0x66, 0x8c, 0x3f, 0xf2, - 0x62, 0xc5, 0xf2, 0x70, 0x86, 0x0d, 0xa1, 0x13, 0x6e, 0xf5, 0xae, 0xae, - 0x82, 0x71, 0x6f, 0x64, 0xb3, 0x77, 0xec, 0x5c, 0xce, 0xd4, 0x09, 0xfe, - 0x65, 0xe7, 0x42, 0x33, 0x8f, 0x17, 0x8f, 0x22, 0x2a, 0xf7, 0x2f, 0x27, - 0xe7, 0x13, 0xec, 0x8b, 0x74, 0xd6, 0x99, 0x86, 0x58, 0x95, 0x59, 0x3b, - 0xcf, 0x66, 0xd6, 0x29, 0xeb, 0xcf, 0xc3, 0x0c, 0x9c, 0x40, 0x2e, 0xa6, - 0x6c, 0x25, 0x17, 0xac, 0x58, 0x64, 0x2c, 0x91, 0x51, 0x98, 0x24, 0x2b, - 0xcb, 0xbd, 0x1e, 0x07, 0xd7, 0x9e, 0xed, 0xe2, 0xe4, 0x4c, 0x68, 0x50, - 0xdb, 0x42, 0xcf, 0x79, 0xc1, 0x5a, 0x31, 0x7f, 0x6c, 0xed, 0xb1, 0x56, - 0x5e, 0xc8, 0xb8, 0xc5, 0x24, 0x16, 0x34, 0x57, 0x1a, 0x2b, 0x31, 0x9f, - 0x86, 0x8b, 0x04, 0xbc, 0x54, 0x49, 0x63, 0x38, 0x8c, 0x26, 0x03, 0x92, - 0x0d, 0xdf, 0x96, 0xf5, 0xb9, 0xe0, 0xb9, 0x54, 0x42, 0xcb, 0x62, 0x75, - 0x6b, 0xb9, 0x93, 0x89, 0x8f, 0x0d, 0xcb, 0xeb, 0xbb, 0xce, 0x95, 0x1f, - 0xf8, 0x9f, 0xae, 0x88, 0xee, 0x2e, 0x54, 0x73, 0x10, 0x2a, 0x48, 0xcf, - 0x8b, 0x5b, 0xeb, 0xca, 0x9d, 0xf8, 0x93, 0xfe, 0xe4, 0x12, 0x3b, 0x73, - 0xad, 0x73, 0x6b, 0x30, 0x19, 0xf5, 0x9c, 0x31, 0xbe, 0x8c, 0x90, 0x73, - 0xa9, 0xb4, 0xe1, 0x13, 0x5c, 0xbb, 0x44, 0xf2, 0xfd, 0xcb, 0x9a, 0xfe, - 0x95, 0x3a, 0xe9, 0x74, 0xbe, 0x7f, 0x59, 0x92, 0xe3, 0xe3, 0xfb, 0x97, - 0x17, 0xbe, 0x7f, 0x15, 0x5c, 0x4d, 0x5c, 0xff, 0x95, 0xea, 0x58, 0xe6, - 0xa3, 0x37, 0x18, 0x90, 0x6e, 0xd6, 0x7a, 0x07, 0x1f, 0xaf, 0xbb, 0xdd, - 0xae, 0xe5, 0x79, 0x17, 0xf5, 0xf7, 0xe1, 0x21, 0xf4, 0x1e, 0x08, 0x15, - 0xde, 0x25, 0x9c, 0xf5, 0x07, 0x63, 0xc2, 0x3f, 0x63, 0x22, 0xab, 0xb5, - 0x4f, 0x65, 0xcc, 0xad, 0xc9, 0x70, 0x78, 0xe9, 0x8c, 0xed, 0x5a, 0xd5, - 0x69, 0x98, 0x28, 0x6e, 0x0d, 0x1c, 0xaf, 0x77, 0x76, 0x69, 0x07, 0xee, - 0xe4, 0xda, 0xb7, 0x5d, 0x32, 0xc1, 0x7a, 0xeb, 0x94, 0x9d, 0xf3, 0x8c, - 0x17, 0xa1, 0xe6, 0x4c, 0x69, 0x9e, 0xab, 0x13, 0xac, 0x7c, 0xc7, 0xa2, - 0x18, 0x66, 0xd5, 0xf3, 0x8e, 0x96, 0x9d, 0x19, 0x0c, 0xd9, 0x89, 0x16, - 0x4a, 0xcb, 0xb4, 0x43, 0x6a, 0x2b, 0x43, 0x30, 0x93, 0xc6, 0x3c, 0xdf, - 0x9d, 0x4f, 0x48, 0xe5, 0x8e, 0x2a, 0xa2, 0x4e, 0x7e, 0x3f, 0xeb, 0x44, - 0xc5, 0x2a, 0xc7, 0x19, 0x9d, 0xa8, 0xce, 0xac, 0x62, 0x1b, 0x44, 0xbc, - 0xd0, 0x6d, 0xd0, 0xef, 0x47, 0xe1, 0x3b, 0x5d, 0x2c, 0x38, 0xdb, 0x8f, - 0x17, 0xd8, 0x10, 0x32, 0x7b, 0x77, 0xfc, 0xf6, 0xa8, 0x3b, 0xef, 0xa6, - 0x5d, 0xc5, 0xf6, 0x09, 0xbe, 0x77, 0xe9, 0x8a, 0xfe, 0xb4, 0xf9, 0x53, - 0x98, 0xe6, 0x09, 0x6f, 0x47, 0x32, 0xb5, 0xfa, 0xb6, 0xeb, 0x07, 0x43, - 0xe7, 0x92, 0x94, 0x69, 0x4a, 0xd1, 0x31, 0x6c, 0x73, 0x9e, 0x5a, 0x1f, - 0xec, 0x4f, 0x3b, 0x09, 0xee, 0xf9, 0xca, 0xec, 0x9f, 0xb2, 0xeb, 0x3c, - 0x87, 0xab, 0x24, 0x80, 0x2b, 0x61, 0x72, 0xca, 0x34, 0x07, 0x77, 0x52, - 0x38, 0xcc, 0x62, 0x28, 0x0d, 0x51, 0x22, 0x36, 0x15, 0xc0, 0x94, 0x54, - 0x06, 0x79, 0xc3, 0x75, 0xe0, 0x63, 0x66, 0x95, 0x2d, 0xe1, 0x6c, 0xdc, - 0x38, 0x35, 0x2d, 0xf3, 0x27, 0x1e, 0x2d, 0x34, 0x8f, 0x2d, 0xcf, 0xef, - 0xf9, 0x4e, 0x3f, 0x30, 0x66, 0xbf, 0xea, 0xf9, 0x17, 0x64, 0x42, 0xeb, - 0x73, 0x1c, 0xea, 0x10, 0xbe, 0xc3, 0x6f, 0x1b, 0x7e, 0x9a, 0xae, 0xd4, - 0x43, 0x62, 0x3c, 0x15, 0x1a, 0xce, 0x0a, 0xae, 0x4a, 0x6f, 0xc5, 0xa2, - 0xd0, 0xfc, 0x35, 0x36, 0x84, 0xfe, 0x41, 0x91, 0xdb, 0x17, 0x2c, 0x9a, - 0x4b, 0x0a, 0x96, 0xc1, 0x59, 0xed, 0x87, 0xe6, 0xac, 0x75, 0x31, 0xf1, - 0xc8, 0x0b, 0x0e, 0x0e, 0xdf, 0xb6, 0xbb, 0xf8, 0xdf, 0xc1, 0xc9, 0xeb, - 0xd7, 0xdd, 0x23, 0xab, 0x0a, 0x37, 0xb2, 0x92, 0x55, 0x05, 0x48, 0x21, - 0xa5, 0xb6, 0xae, 0x7a, 0x9e, 0xf7, 0x71, 0xc0, 0xde, 0x41, 0x84, 0x21, - 0x5d, 0xd4, 0xb8, 0x36, 0x4b, 0x56, 0x7b, 0x8c, 0xd7, 0xf1, 0x53, 0xfa, - 0x13, 0x49, 0x56, 0xf0, 0x87, 0x85, 0x28, 0x78, 0x29, 0x18, 0x3c, 0x5e, - 0x4c, 0x57, 0xfb, 0xd3, 0x45, 0x92, 0xb4, 0xe0, 0x84, 0x97, 0xeb, 0xd8, - 0x29, 0xe9, 0x6b, 0xb6, 0xb5, 0xfc, 0x86, 0xab, 0x55, 0x41, 0x40, 0xfa, - 0x1b, 0xbf, 0x69, 0xc7, 0x77, 0x80, 0x23, 0x8c, 0x53, 0x91, 0xdd, 0x9a, - 0x40, 0x8a, 0x16, 0x85, 0xd0, 0x88, 0x37, 0x67, 0x0c, 0xe4, 0x2e, 0x2f, - 0xe1, 0x89, 0xfd, 0x0f, 0x0d, 0x57, 0x7c, 0xf1, 0xa2, 0x7f, 0xd1, 0x1b, - 0x9f, 0xdb, 0xcc, 0xbf, 0x70, 0x3c, 0xe6, 0x4f, 0xd8, 0x07, 0xdb, 0xbe, - 0x62, 0x9f, 0x26, 0xd7, 0x2e, 0x33, 0xba, 0x0d, 0x7a, 0x7e, 0x8f, 0x79, - 0xbd, 0xa1, 0xfd, 0xe2, 0x85, 0xe5, 0xd9, 0x7d, 0xd7, 0xf6, 0x03, 0x58, - 0x1f, 0x0c, 0x5e, 0xfc, 0xcf, 0xfb, 0xe1, 0xc0, 0xfe, 0xe8, 0xe2, 0xff, - 0xff, 0xfb, 0x7f, 0x2f, 0xc1, 0xa9, 0xb7, 0xd0, 0x72, 0x3f, 0x91, 0x33, - 0x44, 0x47, 0xc1, 0x53, 0x9e, 0xde, 0x41, 0xd7, 0x38, 0x5c, 0x29, 0x0b, - 0xbe, 0xef, 0x8c, 0x03, 0xd7, 0x1e, 0xd9, 0xa3, 0x33, 0x84, 0xc2, 0xa0, - 0xf7, 0xc9, 0xc3, 0xf9, 0xb7, 0x56, 0x7f, 0x32, 0xf9, 0xe0, 0xd8, 0x26, - 0xc7, 0x34, 0x20, 0x0d, 0xc2, 0x25, 0x57, 0x32, 0xe5, 0xf5, 0xf6, 0xfa, - 0x5c, 0x93, 0x46, 0x64, 0x51, 0xc1, 0x63, 0x41, 0xa8, 0x94, 0xc9, 0x02, - 0xd6, 0xbb, 0xb5, 0x7a, 0x7d, 0xdf, 0xb9, 0xb1, 0x83, 0x3e, 0x60, 0x0b, - 0x2e, 0xe9, 0xd7, 0xc8, 0x19, 0x23, 0xfa, 0xe8, 0xb6, 0x83, 0xe3, 0xae, - 0xe5, 0xda, 0x9e, 0x4d, 0x3e, 0x43, 0x56, 0xfa, 0x45, 0x22, 0xb8, 0x2e, - 0xf8, 0xb1, 0x8c, 0xf3, 0x98, 0x69, 0xc9, 0x90, 0x2b, 0xa7, 0xa2, 0x48, - 0x19, 0xdf, 0x4f, 0x43, 0x91, 0xb0, 0x29, 0x0c, 0x50, 0xf0, 0x99, 0x50, - 0xba, 0x0c, 0x27, 0xf0, 0x3c, 0x77, 0x3c, 0x0a, 0x70, 0x1b, 0x99, 0xe6, - 0x12, 0x5c, 0xc7, 0x43, 0xc7, 0x1d, 0x35, 0xf0, 0x1d, 0x48, 0xae, 0x58, - 0x26, 0x35, 0x43, 0x4e, 0x95, 0xcb, 0xea, 0x30, 0x2e, 0xa0, 0x40, 0x30, - 0x56, 0x62, 0xd0, 0xc4, 0x44, 0x46, 0x14, 0xc9, 0x45, 0xa6, 0x4b, 0xab, - 0xae, 0xb3, 0x87, 0x61, 0xef, 0xc2, 0xe3, 0x27, 0xe3, 0x06, 0x53, 0x23, - 0x62, 0x8a, 0xc8, 0x63, 0x4a, 0xcc, 0x4c, 0x3e, 0x82, 0xa8, 0x8f, 0x82, - 0x2f, 0xc1, 0x76, 0xa5, 0xe7, 0x22, 0x9b, 0xb5, 0x21, 0xd9, 0xcf, 0xd7, - 0x8e, 0x6b, 0x07, 0x9e, 0x73, 0x3e, 0x06, 0xfc, 0x37, 0x8e, 0xfd, 0xb1, - 0xc1, 0xa1, 0x1f, 0x46, 0x88, 0xb3, 0xf0, 0x11, 0x6e, 0x03, 0x59, 0x14, - 0xcb, 0x45, 0xa4, 0x17, 0x05, 0xb7, 0xec, 0xb1, 0xb9, 0xb7, 0xdf, 0xeb, - 0x5f, 0xd8, 0x41, 0xef, 0x06, 0xc6, 0x77, 0x1b, 0xa7, 0x46, 0x84, 0x01, - 0x94, 0x11, 0x53, 0x11, 0x95, 0xfa, 0x57, 0xf4, 0xe3, 0x89, 0xef, 0x0c, - 0x3f, 0x05, 0x84, 0xc1, 0x9a, 0xdc, 0xfa, 0xbc, 0xe4, 0x77, 0x73, 0x29, - 0xef, 0x29, 0x26, 0xfb, 0x05, 0x8a, 0x97, 0x0e, 0xd5, 0x3d, 0x84, 0x85, - 0xfa, 0x8f, 0x61, 0x42, 0x52, 0x43, 0x7d, 0xc4, 0xb4, 0xb2, 0xfc, 0x9e, - 0xf7, 0x21, 0x70, 0xc6, 0xc0, 0xf1, 0xa6, 0x47, 0x0c, 0x0e, 0x08, 0x38, - 0x9e, 0x08, 0x44, 0x04, 0xca, 0x5c, 0xca, 0xe5, 0x42, 0x13, 0x39, 0x9c, - 0x59, 0x66, 0xb1, 0xb2, 0x06, 0x36, 0x19, 0xce, 0x0d, 0x7c, 0x67, 0x64, - 0x23, 0xbd, 0xe2, 0xc0, 0x1b, 0xdc, 0x46, 0x06, 0xa2, 0x9a, 0x51, 0x8a, - 0x34, 0x68, 0x88, 0x7d, 0xb6, 0x98, 0x4e, 0x4d, 0x36, 0xca, 0x66, 0xc8, - 0x2b, 0x48, 0x47, 0x11, 0xea, 0x5e, 0xc6, 0x93, 0x3d, 0x76, 0xcf, 0x79, - 0x4e, 0xe5, 0x0f, 0x08, 0x08, 0x93, 0x7d, 0xaa, 0x3a, 0x18, 0xcb, 0xec, - 0x07, 0xcd, 0xee, 0x33, 0x58, 0x6c, 0x49, 0xf5, 0xd7, 0x6c, 0xb6, 0x11, - 0x00, 0xe3, 0x41, 0x70, 0x76, 0x3d, 0x1c, 0x52, 0x46, 0xb7, 0xc9, 0x22, - 0x07, 0xe4, 0x31, 0x63, 0xaa, 0xd3, 0x88, 0x52, 0xa4, 0xb8, 0x15, 0xdc, - 0x86, 0x14, 0x23, 0xa0, 0xca, 0x02, 0xed, 0x5d, 0x9f, 0xfd, 0xd6, 0xee, - 0xfb, 0xa6, 0x3c, 0xd5, 0xc5, 0xfa, 0x95, 0xaa, 0xc1, 0x2c, 0x0b, 0x1d, - 0x95, 0x04, 0x3a, 0x72, 0xc2, 0x54, 0xaa, 0xf3, 0xf6, 0x8c, 0x7e, 0x53, - 0x2a, 0x3e, 0x79, 0x73, 0xfc, 0x16, 0x7b, 0x3f, 0xff, 0x5c, 0x6d, 0x3c, - 0x3c, 0x98, 0xd5, 0xc3, 0x37, 0x75, 0x66, 0xaa, 0xd9, 0x4c, 0x0b, 0x99, - 0xc2, 0x9d, 0x62, 0x64, 0x1b, 0x65, 0x0d, 0xdd, 0xc9, 0xe8, 0x79, 0x0f, - 0x8a, 0x2f, 0x8c, 0x47, 0x93, 0x90, 0xe4, 0x75, 0x79, 0xa8, 0xd4, 0x52, - 0x16, 0x71, 0x9d, 0xbb, 0xd6, 0x79, 0x8b, 0xf2, 0xa8, 0x0c, 0x17, 0x7a, - 0xfe, 0x25, 0x86, 0xd5, 0x46, 0x1b, 0x8d, 0xc0, 0x7c, 0x71, 0xf7, 0xe5, - 0x7e, 0xff, 0xd2, 0xb1, 0xc7, 0x7e, 0xe0, 0x18, 0x2e, 0xd5, 0x47, 0x99, - 0x2d, 0xca, 0x12, 0x3f, 0xb9, 0x32, 0x01, 0x66, 0xaa, 0x04, 0x2a, 0x73, - 0x98, 0x8b, 0x8a, 0x15, 0xe9, 0xd3, 0x21, 0xf9, 0xac, 0xde, 0xb5, 0x7f, - 0x51, 0xd5, 0xf1, 0x9a, 0xac, 0x41, 0x62, 0xf2, 0x4a, 0xc7, 0x08, 0xd1, - 0xa1, 0x7f, 0x64, 0x21, 0xfe, 0xc8, 0x2d, 0x7f, 0xf2, 0xc1, 0x1e, 0x7f, - 0xe3, 0xa1, 0x28, 0x02, 0x36, 0x81, 0x96, 0xf7, 0x3c, 0xb3, 0x4c, 0x09, - 0xd6, 0x2c, 0x4a, 0x04, 0x47, 0xc4, 0x89, 0xb8, 0x2c, 0x4b, 0x1c, 0x91, - 0xa8, 0x0d, 0x94, 0xd8, 0xaf, 0xd9, 0xc1, 0xe3, 0x94, 0x44, 0x61, 0x8c, - 0xa9, 0x94, 0x49, 0x14, 0x35, 0x85, 0xc2, 0x2a, 0x67, 0x65, 0xa9, 0xec, - 0xa0, 0x0b, 0xf8, 0x03, 0x8f, 0xf4, 0x1a, 0x1e, 0xb3, 0xf3, 0x6f, 0xc3, - 0xb3, 0x5c, 0x2e, 0x2b, 0x56, 0x00, 0x4a, 0x99, 0x8b, 0x8c, 0x0e, 0x84, - 0x93, 0xc8, 0xa6, 0xb2, 0xcd, 0x8d, 0x7f, 0x7d, 0x33, 0x39, 0xa4, 0xa4, - 0x62, 0xbb, 0x0b, 0xe2, 0x2a, 0xeb, 0x6c, 0x28, 0x25, 0x4b, 0xc8, 0x0e, - 0x0d, 0x97, 0x9d, 0x18, 0x7f, 0xf5, 0x54, 0x05, 0x71, 0x05, 0xc9, 0xc3, - 0xc3, 0xbf, 0x0c, 0x07, 0x32, 0xa6, 0x71, 0x7e, 0xf6, 0xb7, 0xbf, 0xfe, - 0xf9, 0xef, 0x7f, 0xfa, 0x0b, 0x95, 0x98, 0x1d, 0x3e, 0x52, 0x84, 0xf9, - 0xbc, 0x0a, 0x8c, 0x4a, 0x82, 0x76, 0xb7, 0xe1, 0x22, 0xa7, 0x6c, 0xa7, - 0x93, 0xec, 0x3c, 0x55, 0x4a, 0x8e, 0x13, 0x3c, 0x8b, 0xc8, 0x31, 0x96, - 0x5c, 0xdc, 0xc9, 0x5d, 0xa8, 0xc1, 0x0f, 0xb2, 0xb6, 0xae, 0xcf, 0x47, - 0x33, 0xb1, 0x7f, 0x57, 0x3b, 0xda, 0xe1, 0xaf, 0xb8, 0xe7, 0xd7, 0x8f, - 0x6e, 0x38, 0x69, 0x85, 0xa0, 0x5e, 0x0a, 0xad, 0x77, 0x25, 0xb6, 0x7f, - 0x02, 0xc6, 0x5d, 0x96, 0x47, 0x0c, 0x56, 0xac, 0x9f, 0x51, 0xf8, 0x15, - 0xe1, 0x7f, 0xe1, 0xcc, 0x2e, 0xa9, 0x0d, 0x76, 0xff, 0x0d, 0x99, 0x0d, - 0xe3, 0x86, 0xdd, 0xbe, 0x41, 0xe4, 0x2f, 0x8f, 0x6c, 0x4a, 0x1c, 0x51, - 0x31, 0xdc, 0xe8, 0x1c, 0x79, 0x8a, 0x19, 0xa5, 0x6c, 0xd0, 0x90, 0xd7, - 0xf1, 0x43, 0x96, 0xab, 0x86, 0x72, 0x6b, 0xd4, 0xa9, 0x88, 0xad, 0xde, - 0xa0, 0x77, 0xe5, 0x9b, 0x8c, 0x5a, 0xae, 0xd4, 0xfd, 0x5a, 0xb5, 0x5f, - 0x35, 0x81, 0xe7, 0xfd, 0x8d, 0x0a, 0x58, 0x95, 0xb4, 0x0d, 0x8e, 0x47, - 0x5d, 0xab, 0x51, 0x0b, 0x8f, 0xba, 0x35, 0xa3, 0x52, 0x16, 0x93, 0xab, - 0x9a, 0xb2, 0x80, 0x41, 0x86, 0x1c, 0x84, 0x6a, 0xcc, 0xa8, 0x95, 0x5f, - 0x97, 0x81, 0x53, 0x66, 0x0e, 0x9c, 0xb0, 0xd6, 0xc9, 0x51, 0xf7, 0xf5, - 0x8f, 0x2d, 0x2c, 0xd4, 0xa7, 0xb0, 0xf6, 0xdc, 0xd3, 0x1e, 0x1c, 0x1c, - 0x1e, 0x1c, 0xb4, 0xaa, 0x8a, 0x62, 0xda, 0x29, 0xa5, 0xc0, 0x6c, 0x37, - 0x1e, 0x94, 0x47, 0x9e, 0x71, 0x29, 0x61, 0xa9, 0xda, 0xec, 0x5d, 0x98, - 0x60, 0x1e, 0xbb, 0x71, 0x06, 0x06, 0x14, 0x93, 0x81, 0x4e, 0xd9, 0x55, - 0x21, 0x1f, 0x45, 0x0c, 0xa6, 0xa6, 0xb3, 0x9a, 0x31, 0x99, 0x93, 0xe4, - 0xaa, 0x14, 0x0e, 0x67, 0x4e, 0x4c, 0xb3, 0x34, 0x0f, 0x1f, 0xa9, 0x58, - 0xad, 0x6a, 0xaa, 0x15, 0xa7, 0x01, 0x94, 0x58, 0xa0, 0x12, 0x96, 0xf2, - 0x3d, 0xcf, 0x0f, 0xe8, 0xac, 0xdb, 0xb3, 0x36, 0xfa, 0x6a, 0xea, 0x81, - 0xab, 0x5d, 0xd5, 0x7a, 0xd6, 0xbf, 0xe2, 0x91, 0x88, 0x7b, 0x5e, 0x2e, - 0x55, 0x55, 0xd7, 0x20, 0xb5, 0xc7, 0x72, 0x29, 0x13, 0x0f, 0xee, 0xb3, - 0xb7, 0xae, 0x8c, 0x35, 0xc3, 0x67, 0x8c, 0x8e, 0x5e, 0xbf, 0xfd, 0x71, - 0xef, 0xa0, 0xdb, 0xdd, 0x0b, 0x31, 0xbc, 0x3c, 0x09, 0x6e, 0xc0, 0x24, - 0xbd, 0x4f, 0xd0, 0x8f, 0xee, 0xe3, 0xef, 0x7e, 0x5c, 0x50, 0xb7, 0xd2, - 0x31, 0x8b, 0x2c, 0x56, 0x59, 0x7d, 0x2b, 0x3a, 0x45, 0xb4, 0x63, 0x35, - 0x47, 0x9a, 0x13, 0x4e, 0xea, 0x6b, 0xde, 0xd7, 0xc2, 0x06, 0xda, 0xcc, - 0x03, 0x6b, 0xb4, 0xca, 0x36, 0xf2, 0xbc, 0x6e, 0xeb, 0x6b, 0x95, 0x70, - 0xa7, 0x57, 0xe9, 0x1e, 0xa1, 0xad, 0x12, 0xdc, 0xd4, 0xf4, 0xba, 0x4f, - 0xae, 0xda, 0x63, 0x11, 0x90, 0x9e, 0x01, 0xba, 0x64, 0xa1, 0xe9, 0x84, - 0x53, 0x36, 0x34, 0xa8, 0x05, 0x6b, 0xe0, 0xe0, 0x76, 0x26, 0x3a, 0x2a, - 0x8f, 0x6c, 0xd8, 0xad, 0x8a, 0xd1, 0x92, 0x21, 0xc2, 0xf2, 0xda, 0xb5, - 0x1b, 0x6d, 0x94, 0x9d, 0x99, 0x31, 0x58, 0x51, 0xe5, 0x34, 0xf7, 0x6f, - 0x9c, 0xa5, 0x39, 0xb3, 0x6e, 0x07, 0xa9, 0xcf, 0x2e, 0xb9, 0xe0, 0xb8, - 0xd9, 0x78, 0x16, 0x1d, 0x01, 0x40, 0x2d, 0xdd, 0x3a, 0x0a, 0x36, 0x98, - 0x1c, 0x1f, 0xfd, 0x3f, 0x06, 0xf0, 0xf3, 0xfe, 0xba, 0x19, 0x34, 0x3d, - 0x1e, 0x98, 0x94, 0x1b, 0xcf, 0x5c, 0x12, 0x31, 0xe5, 0x86, 0xcf, 0x8e, - 0xe3, 0x9e, 0xed, 0x79, 0xe8, 0x97, 0xd1, 0xdd, 0x0f, 0xed, 0xed, 0xf3, - 0x6b, 0x0c, 0x62, 0xf8, 0x98, 0x9a, 0xb3, 0xe9, 0x22, 0x8b, 0xf6, 0xd6, - 0x7e, 0xae, 0xe6, 0xe1, 0x01, 0x79, 0x37, 0xfe, 0x1e, 0xbe, 0x39, 0xaa, - 0xdc, 0x3b, 0x7e, 0xd3, 0x6a, 0xde, 0x41, 0x34, 0xeb, 0x2b, 0x9c, 0x41, - 0x70, 0xd1, 0xf3, 0x2e, 0x86, 0xd7, 0xe3, 0x3e, 0x2e, 0x31, 0x5b, 0xcf, - 0x32, 0x9a, 0x0b, 0x30, 0x12, 0x6f, 0x88, 0x48, 0x86, 0x28, 0x10, 0xc2, - 0xe8, 0xd7, 0x4a, 0xd7, 0xd8, 0xe6, 0x65, 0xa6, 0x2b, 0x84, 0x61, 0xd5, - 0x91, 0x53, 0x18, 0xfa, 0x34, 0x12, 0x27, 0x61, 0xc4, 0xa9, 0xcd, 0xaf, - 0xd6, 0x8d, 0x6b, 0x3c, 0xcf, 0x94, 0xa5, 0x47, 0x97, 0x12, 0x3f, 0x88, - 0x4c, 0x2c, 0xb6, 0x02, 0xb2, 0xda, 0xc7, 0x65, 0xee, 0x8d, 0xd3, 0x27, - 0x44, 0xaa, 0xce, 0xb3, 0x9e, 0x34, 0xce, 0xdd, 0xad, 0x6e, 0xdf, 0xfa, - 0x8c, 0xf6, 0xa9, 0x7c, 0xa6, 0xa9, 0xe6, 0xec, 0x46, 0x42, 0xa8, 0xba, - 0xa2, 0x66, 0x46, 0xa0, 0x34, 0x64, 0xb0, 0x43, 0xa3, 0x5a, 0xca, 0x51, - 0xcf, 0xe4, 0x5b, 0xa2, 0xd4, 0x67, 0xcb, 0x39, 0x06, 0xae, 0x94, 0xa6, - 0x21, 0x29, 0xa6, 0x78, 0x1e, 0x9a, 0x47, 0x91, 0x14, 0x94, 0x22, 0x87, - 0xa7, 0xd1, 0xeb, 0x8a, 0xaa, 0x43, 0xa7, 0x3a, 0xb6, 0x67, 0xe2, 0xbe, - 0x65, 0x55, 0xb3, 0x71, 0xb5, 0xfa, 0x9f, 0x6c, 0xf2, 0xb7, 0xfa, 0xfb, - 0xae, 0xf1, 0x9b, 0x5a, 0x71, 0xbf, 0x80, 0x19, 0x48, 0xcd, 0x01, 0xbf, - 0x5b, 0xcc, 0xe8, 0x87, 0x83, 0x0e, 0x8b, 0xfe, 0x7e, 0x0c, 0x0b, 0xa3, - 0xbf, 0x5d, 0x14, 0xb2, 0xa0, 0x1f, 0x7d, 0xcc, 0xdd, 0x18, 0x93, 0xb6, - 0x53, 0x63, 0xc9, 0xc1, 0xba, 0xb4, 0x6f, 0x6c, 0x4a, 0xef, 0xe6, 0xd3, - 0xaa, 0x53, 0x7c, 0x8d, 0x8d, 0x51, 0xbd, 0x1c, 0x05, 0xc9, 0x0c, 0xed, - 0x6a, 0xfd, 0x76, 0x7d, 0x6c, 0x7d, 0xc2, 0xa0, 0xb1, 0x4d, 0x4e, 0x8b, - 0x0d, 0x5a, 0x7a, 0xaa, 0xa9, 0xf3, 0x03, 0xb6, 0xcb, 0x77, 0x02, 0xfc, - 0x30, 0xae, 0x45, 0x6f, 0x2b, 0x26, 0xb0, 0x15, 0x43, 0x71, 0x94, 0x29, - 0x2c, 0x10, 0x13, 0x15, 0x2b, 0xa4, 0xc6, 0xef, 0x97, 0x0a, 0xf5, 0x3e, - 0x32, 0x80, 0x4e, 0x25, 0x8d, 0xb0, 0x70, 0xd9, 0x3a, 0x69, 0xbf, 0xfa, - 0x32, 0x01, 0x60, 0xd6, 0x0f, 0xdc, 0x89, 0xdf, 0xf3, 0x1b, 0x91, 0x3f, - 0x0a, 0x9f, 0x10, 0xaf, 0x19, 0xd2, 0xd5, 0xc2, 0x3c, 0x0a, 0x80, 0x95, - 0x02, 0x17, 0x18, 0x98, 0xe4, 0xdc, 0xe0, 0x61, 0xe0, 0x06, 0xe0, 0xa3, - 0xde, 0xef, 0x02, 0x7a, 0x53, 0xf3, 0x6a, 0x13, 0x18, 0x23, 0x10, 0x23, - 0x85, 0x4c, 0x8d, 0x40, 0x13, 0x53, 0xfd, 0x35, 0x3e, 0x87, 0xc7, 0x28, - 0x27, 0x61, 0x06, 0x86, 0xec, 0xa7, 0x9f, 0xf0, 0xb5, 0xc7, 0x10, 0xcf, - 0xa3, 0x33, 0xc3, 0xd7, 0x73, 0x7e, 0x8f, 0x0c, 0x75, 0xe1, 0x0c, 0xcd, - 0x03, 0xdf, 0xb1, 0x09, 0xd8, 0x59, 0x4a, 0xfd, 0x1e, 0x69, 0x1d, 0xa3, - 0xb3, 0x5e, 0x7d, 0xa9, 0xd7, 0x00, 0x93, 0xed, 0xa7, 0x2f, 0x34, 0xb3, - 0x9f, 0x72, 0x81, 0x8a, 0x62, 0x9e, 0x39, 0x48, 0x1c, 0x62, 0x40, 0xb2, - 0xbc, 0x8c, 0x79, 0xc2, 0x69, 0xa6, 0x9f, 0xd2, 0xa8, 0x9f, 0x42, 0x6c, - 0xa2, 0xd8, 0x84, 0xeb, 0xad, 0x11, 0x66, 0xfd, 0x18, 0xd2, 0xf0, 0x80, - 0x6c, 0x97, 0xf9, 0xb3, 0x86, 0x3d, 0x4f, 0x99, 0xcb, 0xab, 0xaa, 0x5f, - 0x96, 0x7c, 0x7a, 0x96, 0x28, 0x5f, 0x86, 0x2b, 0x40, 0x52, 0xa4, 0xa0, - 0x70, 0xc6, 0x77, 0x24, 0x77, 0xd7, 0x46, 0x71, 0x19, 0x63, 0x20, 0x0d, - 0x90, 0x72, 0x46, 0x5e, 0xf3, 0x55, 0xd2, 0xc7, 0x79, 0xc4, 0x61, 0xb1, - 0xe6, 0xbd, 0x9c, 0xf3, 0xac, 0xd9, 0x5e, 0x80, 0x49, 0x82, 0xeb, 0xbe, - 0xc6, 0xb5, 0x59, 0x2e, 0xaa, 0x90, 0xd1, 0x51, 0x4e, 0xe1, 0xb0, 0xc8, - 0xc4, 0x53, 0x99, 0x17, 0x16, 0x71, 0xbe, 0x15, 0x13, 0x44, 0xd2, 0x7c, - 0xeb, 0xc5, 0x37, 0x18, 0x5c, 0x34, 0xbb, 0x99, 0xfa, 0xb5, 0x76, 0xfd, - 0x0a, 0x66, 0xd2, 0xcc, 0x16, 0x4e, 0xb4, 0xb8, 0x81, 0xd3, 0xd7, 0x26, - 0xf3, 0x4d, 0x11, 0x06, 0x22, 0x9c, 0x65, 0xb8, 0x50, 0x44, 0x35, 0x78, - 0xe5, 0x50, 0x6d, 0xd2, 0x64, 0xab, 0x31, 0xc5, 0x7f, 0x95, 0x70, 0x6b, - 0xac, 0xdf, 0x9c, 0xd2, 0xbf, 0x7d, 0x12, 0x2f, 0x2d, 0xcc, 0xa9, 0xa3, - 0x40, 0xfe, 0x8b, 0xc2, 0x8c, 0xdd, 0x91, 0x9a, 0x9c, 0xe0, 0x43, 0x93, - 0xc4, 0xab, 0x9c, 0xf8, 0xb9, 0x75, 0xf0, 0xbe, 0xf1, 0x70, 0xdb, 0xda, - 0x6b, 0x1d, 0x6e, 0x7c, 0xdf, 0x92, 0x5d, 0x6c, 0x7a, 0x2a, 0xf1, 0x9a, - 0xd0, 0xad, 0xf3, 0xf2, 0x36, 0x7c, 0xcf, 0x8f, 0xa8, 0x0d, 0x08, 0x37, - 0x5f, 0x53, 0xd9, 0xc6, 0xc3, 0xa6, 0x35, 0x70, 0x89, 0x7b, 0x49, 0x78, - 0x86, 0x93, 0x31, 0xfd, 0x37, 0x8a, 0x27, 0x59, 0xa4, 0xa5, 0x84, 0x27, - 0xe6, 0x61, 0xf4, 0x84, 0xfe, 0x79, 0xbf, 0x7e, 0xb1, 0x37, 0xe9, 0xe7, - 0x37, 0xc8, 0xce, 0x05, 0x3a, 0x89, 0x77, 0x0b, 0x3d, 0x3d, 0xb6, 0xc8, - 0x79, 0x88, 0xc9, 0x3f, 0x02, 0x00, 0x00, 0xff, 0xff, 0xb6, 0x1e, 0x92, - 0x4d, 0xf7, 0x18, 0x00, 0x00, + 0xda, 0xa7, 0x24, 0x92, 0x92, 0x8f, 0x65, 0xaf, 0xbc, 0xae, 0x63, 0x8a, + 0x04, 0x25, 0x1c, 0xf3, 0x47, 0x0b, 0x40, 0xf2, 0x2a, 0x2e, 0x15, 0x0a, + 0x02, 0x86, 0xe4, 0x44, 0x00, 0x06, 0xc2, 0x0c, 0x45, 0x31, 0x77, 0x79, + 0x85, 0x54, 0x9e, 0x26, 0xcf, 0x93, 0x8b, 0x3c, 0x46, 0xbe, 0x1e, 0x00, + 0x14, 0x28, 0x73, 0xb5, 0xce, 0x5f, 0x25, 0x65, 0x11, 0xf3, 0xd3, 0xd3, + 0xdd, 0xf3, 0xf5, 0xd7, 0xdd, 0xb3, 0xef, 0x59, 0x2f, 0xcf, 0x59, 0x16, + 0xa6, 0x9c, 0xe9, 0x45, 0xa8, 0x99, 0x5a, 0xc8, 0x95, 0x62, 0x32, 0x63, + 0xfc, 0x9e, 0x17, 0x6b, 0x96, 0x87, 0x73, 0x4c, 0x08, 0x9d, 0x70, 0xab, + 0x77, 0x7e, 0x1e, 0x4c, 0x7a, 0x63, 0x9b, 0x7d, 0x60, 0xa7, 0x72, 0xae, + 0x8e, 0xf1, 0x2f, 0x3b, 0x15, 0x9a, 0x79, 0xbc, 0xb8, 0x17, 0x51, 0x39, + 0x3f, 0x9a, 0x9e, 0x4e, 0x31, 0x2f, 0xd2, 0x79, 0x67, 0x16, 0x62, 0x54, + 0x66, 0xed, 0x3c, 0x9b, 0x5b, 0xef, 0x59, 0x7f, 0x11, 0x66, 0x90, 0x84, + 0xe5, 0x62, 0xc6, 0xd6, 0x72, 0xc9, 0x8a, 0x65, 0xc6, 0x12, 0x19, 0x85, + 0x49, 0xb2, 0xb6, 0xdc, 0x8b, 0x49, 0x70, 0xe1, 0xd9, 0x2e, 0x76, 0xce, + 0x85, 0xc6, 0x6a, 0x5b, 0xe8, 0x05, 0x2f, 0x58, 0x2b, 0xe6, 0xf7, 0xad, + 0x3d, 0xd6, 0xca, 0x0b, 0x19, 0xb7, 0x98, 0xc4, 0x80, 0xe6, 0x4a, 0x63, + 0x24, 0xe6, 0xb3, 0x70, 0x99, 0x40, 0x96, 0x2a, 0xd7, 0x18, 0x09, 0xe3, + 0xe9, 0x80, 0x74, 0xc3, 0xb7, 0x65, 0x7d, 0x29, 0x78, 0x2e, 0x95, 0xd0, + 0xb2, 0x58, 0x5f, 0x5b, 0xee, 0x74, 0xea, 0x63, 0xc2, 0xf2, 0xfa, 0xae, + 0x73, 0xee, 0x07, 0xfe, 0xd5, 0x39, 0xad, 0xbb, 0x09, 0xd5, 0x02, 0x0b, + 0x15, 0xb4, 0xe7, 0xc5, 0xb5, 0x75, 0xee, 0x4e, 0xfd, 0x69, 0x7f, 0x3a, + 0xc2, 0xcc, 0x42, 0xeb, 0xdc, 0x1a, 0x4c, 0xc7, 0x3d, 0x67, 0x82, 0x2f, + 0xa3, 0xe4, 0x42, 0x2a, 0x6d, 0xe4, 0x04, 0x17, 0x2e, 0x2d, 0xf9, 0xfe, + 0x65, 0xbd, 0xfe, 0x95, 0x3a, 0xee, 0x74, 0xbe, 0x7f, 0x59, 0x2e, 0xc7, + 0xc7, 0xf7, 0x2f, 0xcf, 0x7c, 0xff, 0x3c, 0x38, 0x9f, 0xba, 0xfe, 0x2b, + 0xd5, 0xb1, 0xcc, 0x47, 0x6f, 0x30, 0x20, 0xdb, 0xac, 0xcd, 0x0c, 0x3e, + 0x5e, 0x77, 0xbb, 0x5d, 0xcb, 0xf3, 0xce, 0xea, 0xef, 0xc3, 0x43, 0xd8, + 0x3d, 0x10, 0x2a, 0xbc, 0x49, 0x38, 0xeb, 0x0f, 0x26, 0xe4, 0xff, 0x8c, + 0x89, 0xac, 0xb6, 0x3e, 0x95, 0x31, 0xb7, 0xa6, 0xc3, 0xe1, 0xc8, 0x99, + 0xd8, 0xb5, 0xa9, 0xb3, 0x30, 0x51, 0xdc, 0x1a, 0x38, 0x5e, 0xef, 0x64, + 0x64, 0x07, 0xee, 0xf4, 0xc2, 0xb7, 0x5d, 0xba, 0x82, 0xcd, 0xd4, 0x7b, + 0x76, 0xca, 0x33, 0x5e, 0x84, 0x9a, 0x33, 0xa5, 0x79, 0xae, 0x8e, 0x31, + 0xf2, 0x1d, 0x8b, 0x62, 0x5c, 0xab, 0x5e, 0x74, 0xb4, 0xec, 0xcc, 0x71, + 0x91, 0x9d, 0x68, 0xa9, 0xb4, 0x4c, 0x3b, 0x64, 0xb6, 0x32, 0x0b, 0xe6, + 0xd2, 0x5c, 0xcf, 0x77, 0xa7, 0x53, 0x32, 0xb9, 0xa3, 0x8a, 0xa8, 0x93, + 0xdf, 0xce, 0x3b, 0x51, 0xb1, 0xce, 0xb1, 0x47, 0x27, 0xaa, 0x33, 0xaf, + 0xc4, 0x06, 0x11, 0x2f, 0x74, 0x1b, 0xeb, 0xf7, 0xa3, 0xf0, 0x83, 0x2e, + 0x96, 0x9c, 0xed, 0xc7, 0x4b, 0x4c, 0x08, 0x99, 0x7d, 0x78, 0xf7, 0xf6, + 0xa8, 0xbb, 0xe8, 0xa6, 0x5d, 0xc5, 0xf6, 0xc9, 0x7d, 0x1f, 0xd2, 0x35, + 0xfd, 0x69, 0xf3, 0x87, 0x30, 0xcd, 0x13, 0xde, 0x8e, 0x64, 0x6a, 0xf5, + 0x6d, 0xd7, 0x0f, 0x86, 0xce, 0x88, 0x8c, 0x69, 0x6a, 0xd1, 0x31, 0x62, + 0x73, 0x9e, 0x5a, 0x9f, 0xec, 0xab, 0x9d, 0x0b, 0x6e, 0xf9, 0xda, 0xcc, + 0xbf, 0x67, 0x17, 0x79, 0x0e, 0xa8, 0x24, 0x70, 0x57, 0xc2, 0xe4, 0x8c, + 0x69, 0x0e, 0xe9, 0x64, 0x70, 0x98, 0xc5, 0x30, 0x1a, 0xaa, 0x44, 0x6c, + 0x26, 0xe0, 0x53, 0x32, 0x19, 0xcb, 0x1b, 0xd0, 0x01, 0xc6, 0xcc, 0x28, + 0x5b, 0x01, 0x6c, 0xdc, 0x80, 0x9a, 0x86, 0xf9, 0x03, 0x8f, 0x96, 0x9a, + 0xc7, 0x96, 0xe7, 0xf7, 0x7c, 0xa7, 0x1f, 0x98, 0x6b, 0x3f, 0xef, 0xf9, + 0x67, 0x74, 0x85, 0xd6, 0x97, 0x38, 0xd4, 0x21, 0xb0, 0xc3, 0xaf, 0x1b, + 0x38, 0x4d, 0xd7, 0xea, 0x2e, 0x31, 0x48, 0x85, 0x85, 0xf3, 0x82, 0xab, + 0x12, 0xad, 0x18, 0x14, 0x9a, 0xbf, 0xc6, 0x84, 0xd0, 0x3f, 0x28, 0x82, + 0x7d, 0xc1, 0xa2, 0x85, 0xa4, 0x60, 0x19, 0x9c, 0xd4, 0x38, 0x34, 0x7b, + 0xad, 0xb3, 0xa9, 0x47, 0x28, 0x38, 0x38, 0x7c, 0xdb, 0xee, 0xe2, 0x7f, + 0x07, 0xc7, 0xaf, 0x5f, 0x77, 0x8f, 0xac, 0x2a, 0xdc, 0xe8, 0x96, 0xac, + 0x2a, 0x40, 0x0a, 0x29, 0xb5, 0x75, 0xde, 0xf3, 0xbc, 0xcf, 0x03, 0xf6, + 0x01, 0x2a, 0x0c, 0xe9, 0xa0, 0xc6, 0xb1, 0x59, 0xb2, 0xde, 0x63, 0xbc, + 0x8e, 0x9f, 0x12, 0x4f, 0xa4, 0x59, 0xc1, 0xef, 0x96, 0xa2, 0xe0, 0xa5, + 0x62, 0x40, 0xbc, 0x98, 0xad, 0xf7, 0x67, 0xcb, 0x24, 0x69, 0x01, 0x84, + 0xa3, 0x4d, 0xec, 0x94, 0xeb, 0x6b, 0xb1, 0xb5, 0xfe, 0x46, 0xaa, 0x55, + 0xb9, 0x80, 0xec, 0x37, 0xb8, 0x69, 0xc7, 0x37, 0x70, 0x47, 0x18, 0xa7, + 0x22, 0xbb, 0x36, 0x81, 0x14, 0x2d, 0x0b, 0xa1, 0x11, 0x6f, 0xce, 0x04, + 0x9e, 0x1b, 0x8d, 0x80, 0xc4, 0xfe, 0xa7, 0x06, 0x14, 0x5f, 0xbc, 0xe8, + 0x9f, 0xf5, 0x26, 0xa7, 0x36, 0xf3, 0xcf, 0x1c, 0x8f, 0xf9, 0x53, 0xf6, + 0xc9, 0xb6, 0xcf, 0xd9, 0xd5, 0xf4, 0xc2, 0x65, 0xc6, 0xb6, 0x41, 0xcf, + 0xef, 0x31, 0xaf, 0x37, 0xb4, 0x5f, 0xbc, 0xb0, 0x3c, 0xbb, 0xef, 0xda, + 0x7e, 0x80, 0xdb, 0x87, 0x80, 0x17, 0xff, 0xf5, 0x71, 0x38, 0xb0, 0x3f, + 0xbb, 0xf8, 0xff, 0x7f, 0xff, 0xcf, 0x4b, 0x48, 0xea, 0x2d, 0xb5, 0xdc, + 0x4f, 0xe4, 0x1c, 0xd1, 0x51, 0xf0, 0x94, 0xa7, 0x37, 0xb0, 0x35, 0x0e, + 0xd7, 0xca, 0x02, 0xf6, 0x9d, 0x49, 0xe0, 0xda, 0x63, 0x7b, 0x7c, 0x82, + 0x50, 0x18, 0xf4, 0xae, 0x3c, 0xec, 0x7f, 0x6b, 0xf5, 0xa7, 0xd3, 0x4f, + 0x8e, 0x6d, 0x38, 0xa6, 0xe1, 0xd2, 0x20, 0x5c, 0x71, 0x25, 0x53, 0x5e, + 0x4f, 0x6f, 0xf6, 0x35, 0xd7, 0x88, 0x2c, 0x2a, 0x78, 0x2c, 0x4a, 0xaf, + 0xb8, 0x44, 0x8a, 0x0a, 0xa8, 0x29, 0xe4, 0xc3, 0x9a, 0x85, 0x4b, 0x78, + 0x39, 0x03, 0xc0, 0x0c, 0xde, 0xd9, 0x82, 0x87, 0x31, 0x14, 0x31, 0x54, + 0x0a, 0x20, 0x2e, 0xc1, 0x2c, 0xcc, 0x19, 0x58, 0xae, 0x7d, 0x69, 0xbb, + 0x9e, 0x1d, 0x80, 0x30, 0x7e, 0xb9, 0x0a, 0x7a, 0x17, 0xfe, 0x99, 0x3d, + 0x01, 0xac, 0x00, 0xad, 0x29, 0x58, 0xcf, 0xc1, 0x2d, 0xb2, 0x5f, 0xf6, + 0x3f, 0xdb, 0x27, 0x34, 0xb3, 0x8f, 0xef, 0x8a, 0x93, 0x00, 0x92, 0x6b, + 0xab, 0xd7, 0xf7, 0x9d, 0x4b, 0x3b, 0xe8, 0xe3, 0x76, 0x82, 0x11, 0xfd, + 0x1a, 0x3b, 0x13, 0x04, 0x39, 0x19, 0x75, 0xf0, 0xae, 0x0b, 0xd1, 0x9e, + 0x4d, 0xd0, 0x24, 0x30, 0xfc, 0xea, 0x22, 0x44, 0x08, 0x69, 0x92, 0x71, + 0x1e, 0x33, 0x2d, 0x19, 0x28, 0x79, 0x26, 0x8a, 0x94, 0xf1, 0xfd, 0x34, + 0x14, 0x09, 0x9b, 0xe1, 0x9e, 0x0b, 0x3e, 0x17, 0x4a, 0x97, 0x51, 0x0b, + 0x99, 0xa7, 0x8e, 0x47, 0x3c, 0x62, 0x83, 0xd0, 0x46, 0x90, 0x3a, 0x19, + 0x3a, 0xee, 0xb8, 0x71, 0x8d, 0x03, 0xc9, 0x15, 0xcb, 0xa4, 0x66, 0xa0, + 0x6e, 0xb9, 0xaa, 0x36, 0xe3, 0x00, 0x8a, 0x37, 0x03, 0x06, 0x06, 0x87, + 0x99, 0x00, 0x8c, 0x22, 0xb9, 0xcc, 0x74, 0x09, 0x9e, 0x0d, 0x49, 0x19, + 0xf1, 0xae, 0xb1, 0xbe, 0x21, 0xd4, 0xa8, 0x98, 0x22, 0xc0, 0x99, 0x12, + 0x73, 0x43, 0x7b, 0x50, 0xf5, 0x5e, 0xf0, 0x15, 0xc4, 0xae, 0xf5, 0x42, + 0x64, 0xf3, 0x36, 0x34, 0xfb, 0xf9, 0xc2, 0x71, 0xed, 0xc0, 0x73, 0x4e, + 0x27, 0xb8, 0xe5, 0x4b, 0xc7, 0xfe, 0xdc, 0x90, 0xd0, 0x0f, 0x23, 0x84, + 0x73, 0x78, 0x0f, 0x74, 0x42, 0x17, 0xc5, 0x72, 0x11, 0xe9, 0x65, 0xc1, + 0x2d, 0x7b, 0x62, 0xce, 0xed, 0xf7, 0xfa, 0x67, 0x76, 0xd0, 0xbb, 0x04, + 0xc6, 0xdc, 0xc6, 0xae, 0x31, 0xf9, 0x00, 0xc6, 0x88, 0x59, 0x75, 0x8b, + 0xf5, 0xfa, 0xc9, 0xd4, 0x77, 0x86, 0x57, 0x01, 0xf9, 0xa0, 0xb9, 0x5c, + 0x82, 0x27, 0x62, 0xae, 0xb1, 0xeb, 0xd8, 0xa4, 0x09, 0x22, 0x7f, 0xa4, + 0xac, 0xc5, 0xf2, 0x86, 0xf8, 0x8c, 0xc2, 0x42, 0x68, 0x55, 0xb2, 0xaa, + 0x50, 0x6a, 0xc9, 0x55, 0xe7, 0xe0, 0xe8, 0x4d, 0x2d, 0xf3, 0x39, 0x24, + 0x6c, 0x0e, 0xb1, 0xbe, 0xac, 0xf8, 0xcd, 0x42, 0xca, 0x5b, 0xe2, 0x97, + 0x7e, 0x01, 0x5c, 0xe9, 0x50, 0xdd, 0xc2, 0x23, 0xf0, 0xf1, 0x7d, 0x98, + 0x90, 0x6b, 0xe0, 0x63, 0xf0, 0x93, 0xb2, 0xfc, 0x9e, 0xf7, 0x29, 0x70, + 0x26, 0xb8, 0xac, 0xcb, 0x1e, 0x69, 0x79, 0x40, 0xb7, 0xc3, 0x13, 0x01, + 0x8c, 0x22, 0x65, 0xa7, 0x5c, 0x2e, 0x35, 0x2d, 0x47, 0x60, 0xca, 0x2c, + 0x56, 0xd6, 0xc0, 0x26, 0x74, 0xb8, 0x81, 0xef, 0x8c, 0x6d, 0xa4, 0x0a, + 0x6c, 0x78, 0x83, 0xd3, 0x08, 0x05, 0x94, 0xff, 0x4a, 0x1d, 0x07, 0x0d, + 0x63, 0x4f, 0x96, 0xb3, 0x99, 0x61, 0xd6, 0x6c, 0x0e, 0x8e, 0x04, 0xa2, + 0x23, 0xe4, 0xf0, 0x8c, 0x27, 0x7b, 0xec, 0x96, 0xf3, 0x9c, 0x52, 0x39, + 0xdc, 0x2c, 0x0c, 0x93, 0x56, 0x39, 0x3d, 0x96, 0xd9, 0x0f, 0x9a, 0xdd, + 0x66, 0x80, 0xc5, 0x8a, 0x6a, 0x09, 0x33, 0xd9, 0x46, 0x30, 0x4f, 0x06, + 0xc1, 0xc9, 0xc5, 0x70, 0x48, 0xd9, 0xc9, 0x26, 0x53, 0x0f, 0x08, 0x96, + 0x13, 0x0a, 0x14, 0x30, 0x0e, 0xe8, 0x7a, 0x0d, 0x6c, 0x92, 0x61, 0x74, + 0x1b, 0x65, 0xb1, 0xe1, 0x5d, 0x9c, 0xfc, 0xbf, 0xdd, 0xf7, 0x4d, 0xaa, + 0xad, 0x0b, 0x8f, 0x57, 0xaa, 0xbe, 0xb1, 0x32, 0x69, 0x53, 0x7a, 0x4b, + 0xcd, 0x55, 0xa8, 0x54, 0xe7, 0xed, 0x39, 0xfd, 0xa6, 0x6b, 0x38, 0x7e, + 0xf3, 0xee, 0x2d, 0xe6, 0x7e, 0xfe, 0xb9, 0x9a, 0xb8, 0xbb, 0x33, 0xa3, + 0x87, 0x6f, 0x6a, 0x96, 0xad, 0xc5, 0xcc, 0x0a, 0x99, 0x02, 0xb3, 0x31, + 0x98, 0x53, 0x59, 0x43, 0x77, 0x3a, 0x7e, 0x9c, 0x83, 0xe1, 0x26, 0x80, + 0x4d, 0x34, 0x13, 0xb4, 0xf3, 0x50, 0xa9, 0x95, 0x2c, 0xe2, 0x9a, 0x87, + 0x37, 0x1c, 0x4c, 0x39, 0x41, 0x12, 0x15, 0x7c, 0xed, 0xc3, 0x6a, 0xa2, + 0x5d, 0x22, 0xe4, 0xeb, 0xf9, 0xfe, 0xc8, 0x01, 0x02, 0x02, 0xc3, 0x01, + 0xf5, 0x47, 0xc9, 0x7c, 0x65, 0xb9, 0x32, 0x3d, 0x37, 0x51, 0x5c, 0x03, + 0x2d, 0xcc, 0x45, 0xbb, 0x01, 0x36, 0xd2, 0xcf, 0x22, 0x14, 0x55, 0x35, + 0xc9, 0x0e, 0x3c, 0x1a, 0x8e, 0xec, 0x18, 0x25, 0x3a, 0xf4, 0x8f, 0x2c, + 0xc4, 0x1f, 0xb8, 0xe5, 0x4f, 0x3f, 0xd9, 0x93, 0x6f, 0xdc, 0x14, 0x45, + 0xf0, 0x4d, 0xa0, 0xe5, 0x2d, 0xcf, 0x2c, 0x53, 0x4e, 0x68, 0x16, 0x25, + 0x02, 0xac, 0xc7, 0x44, 0x5c, 0xa6, 0x58, 0x8e, 0x70, 0xd7, 0xc6, 0x95, + 0x98, 0xaf, 0xc5, 0x01, 0x71, 0x4a, 0x22, 0xc9, 0xc7, 0x94, 0x96, 0x25, + 0x12, 0xb4, 0x42, 0x91, 0x20, 0xe7, 0x65, 0xda, 0xef, 0x80, 0x3e, 0x7f, + 0xcf, 0x23, 0xbd, 0x71, 0x8f, 0x99, 0xf9, 0x97, 0xdd, 0xb3, 0x5a, 0xad, + 0x2a, 0x51, 0x70, 0x94, 0x32, 0x07, 0x19, 0x1b, 0xc8, 0x4f, 0x22, 0x9b, + 0xc9, 0x36, 0x37, 0xf8, 0xfa, 0xe6, 0xe5, 0xd0, 0x92, 0x0a, 0x87, 0x5d, + 0x2e, 0xae, 0xa8, 0x6d, 0xcb, 0x28, 0x59, 0xba, 0xec, 0xd0, 0x48, 0xd9, + 0xe9, 0xe3, 0x67, 0x77, 0x55, 0x2e, 0xae, 0x5c, 0x72, 0x77, 0xf7, 0x4f, + 0xbb, 0x03, 0xb4, 0x6c, 0xc0, 0xcf, 0xfe, 0xfa, 0x97, 0x3f, 0xfd, 0xed, + 0x8f, 0x7f, 0xa6, 0x74, 0xb9, 0x03, 0x23, 0x45, 0x98, 0x2f, 0xaa, 0xc0, + 0xa8, 0x34, 0x68, 0x77, 0x1b, 0x10, 0x79, 0xcf, 0x76, 0x82, 0x64, 0xe7, + 0xae, 0x52, 0x73, 0xec, 0xe0, 0x59, 0x44, 0xc0, 0x58, 0x71, 0x71, 0x23, + 0x77, 0x79, 0x0d, 0x38, 0xc8, 0xda, 0xba, 0xde, 0x1f, 0xcd, 0xc5, 0xfe, + 0x4d, 0x0d, 0xb4, 0xc3, 0xdf, 0x80, 0xe7, 0xf3, 0x5b, 0xb7, 0x40, 0x5a, + 0x79, 0x50, 0xaf, 0x84, 0xd6, 0xbb, 0x88, 0xed, 0x1f, 0x70, 0xe3, 0xae, + 0x9b, 0x47, 0x0c, 0x56, 0xa2, 0x1f, 0xbd, 0xf0, 0x1b, 0xca, 0xff, 0xca, + 0x9e, 0x5d, 0x5a, 0x1b, 0xdf, 0xfd, 0x27, 0x74, 0x36, 0x82, 0x1b, 0xf7, + 0xf6, 0x0d, 0x2a, 0x7f, 0xbd, 0x65, 0x5b, 0xe3, 0x88, 0x32, 0xee, 0x56, + 0x15, 0xcc, 0x53, 0xf4, 0x5b, 0x65, 0xb1, 0x09, 0x5e, 0xc7, 0x0f, 0x59, + 0x8e, 0x9a, 0x95, 0x4f, 0xda, 0xb6, 0x6a, 0xb1, 0xd5, 0x1b, 0xf4, 0xce, + 0x7d, 0xc3, 0xa8, 0xe5, 0x48, 0x5d, 0x7b, 0x56, 0xf3, 0x55, 0x41, 0x7b, + 0xda, 0xdf, 0xca, 0x80, 0x55, 0x4a, 0xdb, 0x92, 0x78, 0xd4, 0xb5, 0x1a, + 0xb9, 0xf0, 0xa8, 0x5b, 0x0b, 0x2a, 0x75, 0x31, 0x5c, 0xd5, 0xd4, 0x05, + 0x02, 0x32, 0x70, 0x90, 0x29, 0xdc, 0x50, 0x3d, 0x6f, 0xd2, 0xc0, 0x7b, + 0x66, 0x36, 0x1c, 0xb3, 0xd6, 0xf1, 0x51, 0xf7, 0xf5, 0x8f, 0x2d, 0x0c, + 0xd4, 0xbb, 0x30, 0xf6, 0x58, 0x9f, 0x1f, 0x1c, 0x1c, 0x1e, 0x1c, 0xb4, + 0xaa, 0x8c, 0x62, 0x6a, 0x36, 0xa5, 0x20, 0x6c, 0xb7, 0x3f, 0x88, 0x47, + 0x1e, 0xfd, 0x52, 0xba, 0xa5, 0x6a, 0x19, 0x76, 0xf9, 0x04, 0x05, 0xc2, + 0xa5, 0x33, 0x30, 0x4e, 0x31, 0x0c, 0xf4, 0x9e, 0x9d, 0x17, 0xf2, 0x5e, + 0x50, 0x75, 0x69, 0xca, 0xb7, 0x39, 0x93, 0x39, 0x69, 0xae, 0x4a, 0xe5, + 0xb0, 0xe7, 0xd8, 0x54, 0x64, 0x8b, 0xf0, 0x9e, 0x92, 0xd5, 0xba, 0x5e, + 0xb5, 0xe6, 0xd4, 0x4c, 0x93, 0x08, 0x64, 0xc2, 0x52, 0xbf, 0xc7, 0x5e, + 0x08, 0x5d, 0x42, 0x7b, 0xde, 0x46, 0x8f, 0x40, 0xf5, 0x7c, 0x35, 0xab, + 0x5a, 0x8f, 0xf6, 0x57, 0x32, 0x12, 0x71, 0xcb, 0xcb, 0xa1, 0x2a, 0xeb, + 0x1a, 0x4f, 0xed, 0xb1, 0x5c, 0xca, 0xc4, 0x03, 0x7c, 0xf6, 0x36, 0x99, + 0xb1, 0x16, 0xf8, 0xe8, 0xa3, 0xa3, 0xd7, 0x6f, 0x7f, 0xdc, 0x3b, 0xe8, + 0x76, 0xf7, 0x42, 0x34, 0x62, 0x0f, 0x82, 0x1b, 0x67, 0x92, 0xdd, 0xc7, + 0xa8, 0xad, 0xf7, 0xf1, 0x77, 0x3f, 0x2e, 0xa8, 0x5a, 0xe9, 0x98, 0x41, + 0x16, 0xab, 0xac, 0x3e, 0x15, 0xe5, 0x28, 0x6a, 0xbe, 0x5a, 0x22, 0xf5, + 0x3c, 0xc7, 0xf5, 0x31, 0x1f, 0x6b, 0x65, 0x03, 0x6d, 0x7a, 0x9b, 0x8d, + 0xb7, 0xca, 0x5a, 0xf5, 0xb4, 0x6e, 0x51, 0x6a, 0x93, 0x70, 0xa6, 0x57, + 0xd9, 0x1e, 0xa1, 0xac, 0x12, 0xdc, 0xe4, 0xf4, 0xba, 0xe6, 0xaf, 0x4a, + 0x7d, 0x11, 0x90, 0x9d, 0x41, 0x59, 0xbf, 0x61, 0x87, 0x53, 0x16, 0x34, + 0xc8, 0x05, 0x1b, 0xc7, 0x01, 0x76, 0x26, 0x3a, 0x2a, 0x44, 0x36, 0xee, + 0xad, 0x8a, 0xd1, 0x52, 0x20, 0xc2, 0xf2, 0xc2, 0xb5, 0x1b, 0x65, 0x94, + 0x9d, 0x99, 0x96, 0x5e, 0x51, 0xe6, 0x34, 0xe7, 0x6f, 0xed, 0xa5, 0x9e, + 0xb9, 0xae, 0x0f, 0xa9, 0x98, 0x2f, 0xa5, 0x60, 0xbb, 0x99, 0x78, 0x54, + 0x1d, 0x01, 0x40, 0x25, 0xdd, 0x26, 0x0a, 0xb6, 0x84, 0xbc, 0x3b, 0xfa, + 0xdf, 0x6e, 0xd7, 0x3a, 0xed, 0x6f, 0x8a, 0x41, 0x53, 0xe3, 0x41, 0x48, + 0x39, 0xf1, 0x28, 0x25, 0x11, 0x33, 0x6e, 0xe4, 0xec, 0xd8, 0xee, 0xd9, + 0x9e, 0x47, 0x2d, 0xc9, 0xc8, 0x19, 0xda, 0x4f, 0xf7, 0x6f, 0x7c, 0x10, + 0x03, 0x63, 0x6a, 0xc1, 0x66, 0xcb, 0x2c, 0xda, 0xdb, 0xe0, 0x5c, 0x2d, + 0xc2, 0x03, 0x42, 0x37, 0xfe, 0x1e, 0xbe, 0x39, 0xaa, 0xe0, 0x1d, 0xbf, + 0x69, 0x35, 0xcf, 0xa0, 0x35, 0x9b, 0x23, 0x9c, 0x41, 0x70, 0xd6, 0xf3, + 0xce, 0x86, 0x17, 0x93, 0x3e, 0x0e, 0x31, 0x53, 0x8f, 0x3a, 0x9a, 0x03, + 0xd0, 0xde, 0x6f, 0xa9, 0x48, 0x17, 0x51, 0x20, 0x84, 0x51, 0xaf, 0x95, + 0xd0, 0x78, 0x2a, 0xcb, 0x74, 0x8a, 0x08, 0xc3, 0xaa, 0xec, 0xa7, 0x30, + 0xf4, 0xa9, 0xbd, 0x4f, 0xc2, 0x88, 0x53, 0x2f, 0x51, 0x8d, 0x1b, 0x68, + 0x3c, 0xf6, 0xc7, 0x25, 0xa2, 0x4b, 0x8d, 0xef, 0x44, 0x26, 0x96, 0x4f, + 0x02, 0xb2, 0x9a, 0xc7, 0x61, 0xee, 0xa5, 0xd3, 0x27, 0x8f, 0x54, 0x95, + 0x67, 0xdd, 0xce, 0x9c, 0xba, 0x4f, 0x5a, 0x0a, 0xeb, 0x0b, 0xca, 0xa7, + 0xf2, 0xc9, 0xa9, 0x7a, 0x33, 0x68, 0x10, 0x42, 0x55, 0x15, 0x35, 0x19, + 0x81, 0x68, 0xc8, 0xf8, 0x0e, 0x85, 0x6a, 0xa9, 0x47, 0xfd, 0xbe, 0xf0, + 0x44, 0x95, 0x7a, 0x6f, 0xd9, 0x2c, 0x01, 0x4a, 0x69, 0x1a, 0x92, 0x61, + 0x8a, 0xe7, 0xa1, 0x79, 0xe0, 0x49, 0xb1, 0x52, 0xe4, 0x40, 0x1a, 0xbd, + 0x14, 0xa9, 0x3a, 0x74, 0xaa, 0x6d, 0x7b, 0x26, 0xee, 0x5b, 0x56, 0xd5, + 0xe7, 0x57, 0xa3, 0xff, 0xce, 0x22, 0xff, 0x49, 0x7d, 0xdf, 0x35, 0xb8, + 0xa9, 0x0d, 0xf7, 0x0b, 0x5c, 0x03, 0x99, 0x39, 0xe0, 0x37, 0xcb, 0x39, + 0xfd, 0x70, 0x50, 0x61, 0xd1, 0xdf, 0xcf, 0x61, 0x61, 0xec, 0xb7, 0x8b, + 0x42, 0x16, 0xf4, 0xa3, 0x5f, 0x08, 0xea, 0xa8, 0x9f, 0x52, 0x63, 0x29, + 0xc1, 0x1a, 0xa1, 0x85, 0x22, 0x7a, 0x37, 0x9f, 0x56, 0x4d, 0xf1, 0xb5, + 0x6f, 0x8c, 0xe9, 0x65, 0xbf, 0x49, 0xd7, 0xd0, 0xae, 0xc6, 0xaf, 0x37, + 0xdb, 0x36, 0x3b, 0x8c, 0x37, 0x9e, 0x2e, 0xa7, 0xc1, 0xc6, 0x5a, 0x7a, + 0x76, 0xaa, 0xf9, 0x01, 0xd3, 0xe5, 0x9b, 0x07, 0x7e, 0x18, 0x68, 0xd1, + 0x3b, 0x91, 0x09, 0x6c, 0x45, 0xcf, 0x00, 0x32, 0xc5, 0x0d, 0xc4, 0xb4, + 0x8a, 0x15, 0x52, 0xe3, 0xf7, 0x4b, 0x85, 0x7c, 0x1f, 0x19, 0x87, 0xce, + 0x24, 0xf5, 0xc9, 0x80, 0x6c, 0x4d, 0xda, 0xaf, 0xbe, 0x26, 0x80, 0xd1, + 0xf4, 0x34, 0x70, 0xa7, 0x7e, 0xcf, 0x6f, 0x44, 0xfe, 0x38, 0x7c, 0x40, + 0xbc, 0x66, 0xa0, 0xab, 0xa5, 0x79, 0xe0, 0x80, 0x28, 0x05, 0x29, 0xb8, + 0x60, 0xd2, 0x73, 0x4b, 0x86, 0x71, 0x37, 0x1c, 0x3e, 0xee, 0xfd, 0x12, + 0xd0, 0xfb, 0xa0, 0x57, 0x5f, 0x81, 0xb9, 0x04, 0x12, 0xa4, 0xc0, 0xd4, + 0x08, 0x34, 0x31, 0xd3, 0xcf, 0xc9, 0x39, 0x7c, 0x87, 0x74, 0x12, 0x66, + 0x10, 0xc8, 0x7e, 0xfa, 0x09, 0x5f, 0x7b, 0x0c, 0xf1, 0x3c, 0x3e, 0x31, + 0x72, 0x3d, 0xe7, 0x77, 0x60, 0xa8, 0x33, 0x67, 0x68, 0x1e, 0x2b, 0xdf, + 0x99, 0x80, 0x9d, 0xa7, 0x54, 0xef, 0x91, 0xd5, 0x31, 0x2a, 0xeb, 0xf5, + 0xd7, 0x76, 0x0d, 0xd0, 0x3e, 0x5f, 0x7d, 0x65, 0x99, 0xfd, 0x90, 0x0b, + 0x64, 0x14, 0xf3, 0x64, 0x43, 0xea, 0x90, 0x00, 0xd2, 0xe5, 0x65, 0xcc, + 0x13, 0x4e, 0x0f, 0x07, 0x33, 0x7a, 0x4f, 0x48, 0xa1, 0x36, 0xad, 0xd8, + 0x76, 0xd7, 0x5b, 0xa3, 0xcc, 0xe6, 0x61, 0xa7, 0x81, 0x80, 0x6c, 0xd7, + 0xf5, 0x67, 0x8d, 0xfb, 0xa4, 0xe7, 0x9b, 0x2a, 0xeb, 0x97, 0x29, 0x9f, + 0xde, 0x3e, 0xca, 0x57, 0xee, 0xca, 0x21, 0x29, 0x28, 0x28, 0x9c, 0xf3, + 0x1d, 0xe4, 0xee, 0xda, 0x48, 0x2e, 0x13, 0x34, 0xa4, 0x01, 0x28, 0x67, + 0xec, 0x35, 0x5f, 0x58, 0x7d, 0xec, 0x47, 0x1c, 0x16, 0x1b, 0xd9, 0xab, + 0x05, 0xcf, 0x9a, 0xe5, 0x05, 0x84, 0x24, 0x38, 0xee, 0x39, 0xa9, 0xcd, + 0x74, 0x51, 0x85, 0x8c, 0x8e, 0x72, 0x0a, 0x87, 0x65, 0x26, 0x1e, 0x4a, + 0x5e, 0x58, 0xc6, 0xf9, 0x93, 0x98, 0xa0, 0x25, 0xcd, 0x77, 0x6b, 0x7c, + 0x43, 0xc0, 0x59, 0xb3, 0x9a, 0xa9, 0x5f, 0x9e, 0x37, 0x2f, 0x7a, 0x86, + 0x66, 0x9e, 0xf8, 0x89, 0x06, 0xb7, 0xfc, 0xf4, 0x5c, 0x67, 0xbe, 0xad, + 0xc2, 0x40, 0x84, 0xf3, 0x0c, 0x07, 0x8a, 0xa8, 0x76, 0x5e, 0xd9, 0x54, + 0x1b, 0x9a, 0x6c, 0x35, 0xba, 0xf8, 0x67, 0x17, 0x3e, 0x69, 0xeb, 0xb7, + 0xbb, 0xf4, 0x6f, 0xef, 0xc4, 0xcb, 0x1b, 0xe6, 0x54, 0x51, 0x80, 0xff, + 0xa2, 0x30, 0x63, 0x37, 0x64, 0x26, 0x27, 0xf7, 0xa1, 0x48, 0xe2, 0x15, + 0x27, 0x7e, 0x69, 0x1d, 0x7c, 0x6c, 0x3c, 0x42, 0xb7, 0xf6, 0x5a, 0x87, + 0x5b, 0xdf, 0xd7, 0x74, 0x2f, 0x36, 0x3d, 0x95, 0x78, 0x4d, 0xd7, 0x6d, + 0x78, 0xf9, 0xa9, 0xfb, 0x1e, 0x1f, 0x84, 0x1b, 0x2e, 0xdc, 0x7e, 0x19, + 0x66, 0x5b, 0x8f, 0xb4, 0xd6, 0xc0, 0x25, 0xe9, 0xe5, 0xc2, 0x13, 0xec, + 0x8c, 0xe9, 0xbf, 0xb7, 0x3c, 0xc8, 0x22, 0x2d, 0x35, 0x3c, 0x36, 0x8f, + 0xbc, 0xc7, 0xf4, 0xcf, 0xc7, 0xcd, 0x7f, 0x7d, 0x30, 0xf4, 0xf3, 0x7f, + 0x60, 0xe7, 0x02, 0x95, 0xc4, 0x87, 0xa5, 0x9e, 0xbd, 0xb3, 0x08, 0x3c, + 0x24, 0xe4, 0xef, 0x01, 0x00, 0x00, 0xff, 0xff, 0xca, 0xc7, 0x79, 0x5b, + 0xc3, 0x19, 0x00, 0x00, }, "conf/app.ini", ) diff --git a/modules/middleware/context.go b/modules/middleware/context.go index 8c837d08..19556118 100644 --- a/modules/middleware/context.go +++ b/modules/middleware/context.go @@ -358,7 +358,7 @@ func InitContext() martini.Handler { }) // Get user from session if logined. - user := auth.SignedInUser(ctx.Session) + user := auth.SignedInUser(ctx.req.Header, ctx.Session) ctx.User = user ctx.IsSigned = user != nil diff --git a/modules/setting/setting.go b/modules/setting/setting.go index 93e02210..12989963 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -47,11 +47,12 @@ var ( StaticRootPath string // Security settings. - InstallLock bool - SecretKey string - LogInRememberDays int - CookieUserName string - CookieRememberName string + InstallLock bool + SecretKey string + LogInRememberDays int + CookieUserName string + CookieRememberName string + ReverseProxyAuthUid string // Webhook settings. WebhookTaskInterval int @@ -163,6 +164,7 @@ func NewConfigContext() { LogInRememberDays = Cfg.MustInt("security", "LOGIN_REMEMBER_DAYS") CookieUserName = Cfg.MustValue("security", "COOKIE_USERNAME") CookieRememberName = Cfg.MustValue("security", "COOKIE_REMEMBER_NAME") + ReverseProxyAuthUid = Cfg.MustValue("security", "REVERSE_PROXY_AUTHENTICATION_UID", "X-WEBAUTH-UID") RunUser = Cfg.MustValue("", "RUN_USER") curUser := os.Getenv("USER") @@ -191,14 +193,15 @@ func NewConfigContext() { } var Service struct { - RegisterEmailConfirm bool - DisableRegistration bool - RequireSignInView bool - EnableCacheAvatar bool - NotifyMail bool - LdapAuth bool - ActiveCodeLives int - ResetPwdCodeLives int + RegisterEmailConfirm bool + DisableRegistration bool + RequireSignInView bool + EnableCacheAvatar bool + EnableNotifyMail bool + EnableReverseProxyAuth bool + LdapAuth bool + ActiveCodeLives int + ResetPwdCodeLives int } func newService() { @@ -207,6 +210,7 @@ func newService() { Service.DisableRegistration = Cfg.MustBool("service", "DISABLE_REGISTRATION") Service.RequireSignInView = Cfg.MustBool("service", "REQUIRE_SIGNIN_VIEW") Service.EnableCacheAvatar = Cfg.MustBool("service", "ENABLE_CACHE_AVATAR") + Service.EnableReverseProxyAuth = Cfg.MustBool("service", "ENABLE_REVERSE_PROXY_AUTHENTICATION") } var logLevels = map[string]string{ @@ -395,7 +399,7 @@ func newNotifyMailService() { log.Warn("Notify Mail Service: Mail Service is not enabled") return } - Service.NotifyMail = true + Service.EnableNotifyMail = true log.Info("Notify Mail Service Enabled") } diff --git a/modules/social/social.go b/modules/social/social.go index 62f4d518..326a463f 100644 --- a/modules/social/social.go +++ b/modules/social/social.go @@ -120,7 +120,7 @@ type SocialGithub struct { } func (s *SocialGithub) Type() int { - return models.OT_GITHUB + return int(models.GITHUB) } func newGitHubOauth(config *oauth.Config) { @@ -174,7 +174,7 @@ type SocialGoogle struct { } func (s *SocialGoogle) Type() int { - return models.OT_GOOGLE + return int(models.GOOGLE) } func newGoogleOauth(config *oauth.Config) { @@ -229,7 +229,7 @@ type SocialTencent struct { } func (s *SocialTencent) Type() int { - return models.OT_QQ + return int(models.QQ) } func newTencentOauth(config *oauth.Config) { @@ -295,7 +295,7 @@ type SocialTwitter struct { } func (s *SocialTwitter) Type() int { - return models.OT_TWITTER + return int(models.TWITTER) } func newTwitterOauth(config *oauth.Config) { @@ -351,7 +351,7 @@ type SocialWeibo struct { } func (s *SocialWeibo) Type() int { - return models.OT_WEIBO + return int(models.WEIBO) } func newWeiboOauth(config *oauth.Config) { diff --git a/routers/admin/admin.go b/routers/admin/admin.go index a14ffae0..1567a300 100644 --- a/routers/admin/admin.go +++ b/routers/admin/admin.go @@ -102,8 +102,11 @@ func updateSystemStatus() { } // Operation types. +type AdminOperation int + const ( - OT_CLEAN_OAUTH = iota + 1 + CLEAN_UNBIND_OAUTH AdminOperation = iota + 1 + CLEAN_INACTIVATE_USER ) func Dashboard(ctx *middleware.Context) { @@ -116,10 +119,13 @@ func Dashboard(ctx *middleware.Context) { var err error var success string - switch op { - case OT_CLEAN_OAUTH: + switch AdminOperation(op) { + case CLEAN_UNBIND_OAUTH: success = "All unbind OAuthes have been deleted." err = models.CleanUnbindOauth() + case CLEAN_INACTIVATE_USER: + success = "All inactivate accounts have been deleted." + err = models.DeleteInactivateUsers() } if err != nil { @@ -190,6 +196,7 @@ func Config(ctx *middleware.Context) { ctx.Data["StaticRootPath"] = setting.StaticRootPath ctx.Data["LogRootPath"] = setting.LogRootPath ctx.Data["ScriptType"] = setting.ScriptType + ctx.Data["ReverseProxyAuthUid"] = setting.ReverseProxyAuthUid ctx.Data["Service"] = setting.Service diff --git a/routers/repo/issue.go b/routers/repo/issue.go index 808fb52b..11c573f5 100644 --- a/routers/repo/issue.go +++ b/routers/repo/issue.go @@ -250,7 +250,7 @@ func CreateIssuePost(ctx *middleware.Context, params martini.Params, form auth.C } // Mail watchers and mentions. - if setting.Service.NotifyMail { + if setting.Service.EnableNotifyMail { tos, err := mailer.SendIssueNotifyMail(ctx.User, ctx.Repo.Owner, ctx.Repo.Repository, issue) if err != nil { ctx.Handle(500, "issue.CreateIssue(SendIssueNotifyMail)", err) @@ -685,7 +685,7 @@ func Comment(ctx *middleware.Context, params martini.Params) { } // Mail watchers and mentions. - if setting.Service.NotifyMail { + if setting.Service.EnableNotifyMail { issue.Content = content tos, err := mailer.SendIssueNotifyMail(ctx.User, ctx.Repo.Owner, ctx.Repo.Repository, issue) if err != nil { diff --git a/routers/repo/setting.go b/routers/repo/setting.go index ac9ce7c7..6313971c 100644 --- a/routers/repo/setting.go +++ b/routers/repo/setting.go @@ -192,7 +192,7 @@ func CollaborationPost(ctx *middleware.Context) { return } - if setting.Service.NotifyMail { + if setting.Service.EnableNotifyMail { if err = mailer.SendCollaboratorMail(ctx.Render, u, ctx.User, ctx.Repo.Repository); err != nil { ctx.Handle(500, "setting.CollaborationPost(SendCollaboratorMail)", err) return diff --git a/templates/VERSION b/templates/VERSION index 0848cb02..7d143dcc 100644 --- a/templates/VERSION +++ b/templates/VERSION @@ -1 +1 @@ -0.4.4.0620 Alpha \ No newline at end of file +0.4.5.0621 Alpha \ No newline at end of file diff --git a/templates/admin/config.tmpl b/templates/admin/config.tmpl index 583ee25e..22be5900 100644 --- a/templates/admin/config.tmpl +++ b/templates/admin/config.tmpl @@ -36,6 +36,8 @@
{{.LogRootPath}}
Script Type
{{.ScriptType}}
+
Reverse Authentication UID
+
{{.ReverseProxyAuthUid}}
@@ -77,7 +79,7 @@
Require Sign In View
Mail Notification
-
+
Enable Cache Avatar

diff --git a/templates/admin/dashboard.tmpl b/templates/admin/dashboard.tmpl index f709cb3f..aa2080d8 100644 --- a/templates/admin/dashboard.tmpl +++ b/templates/admin/dashboard.tmpl @@ -32,6 +32,10 @@ Clean unbind OAuthes Run + + Delete inactivate accounts + Run + -- cgit v1.2.3 From 29a40c97f367a432e4038f20f09d7bf76ce4ab93 Mon Sep 17 00:00:00 2001 From: niphor Date: Tue, 24 Jun 2014 14:28:47 +0800 Subject: RepoRootPath must be absolute path --- modules/setting/setting.go | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'modules/setting/setting.go') diff --git a/modules/setting/setting.go b/modules/setting/setting.go index 12989963..cb7734bb 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -182,6 +182,12 @@ func NewConfigContext() { log.Fatal("Fail to get home directory: %v", err) } RepoRootPath = Cfg.MustValue("repository", "ROOT", filepath.Join(homeDir, "gogs-repositories")) + if !filepath.IsAbs(RepoRootPath) { + RepoRootPath = filepath.Join(workDir, RepoRootPath) + } else { + RepoRootPath = filepath.Clean(RepoRootPath) + } + if err = os.MkdirAll(RepoRootPath, os.ModePerm); err != nil { log.Fatal("Fail to create repository root path(%s): %v", RepoRootPath, err) } -- cgit v1.2.3 From b2801a2e985f11e940a0cd420cea57242ea26d4c Mon Sep 17 00:00:00 2001 From: Unknown Date: Tue, 24 Jun 2014 13:55:47 -0400 Subject: Fix #165 --- README.md | 3 - README_ZH.md | 3 - conf/app.ini | 4 +- gogs.go | 2 +- modules/auth/user.go | 28 +-- modules/bin/conf.go | 471 ++++++++++++++++++++++---------------------- modules/setting/setting.go | 14 +- routers/admin/admin.go | 2 +- templates/VERSION | 2 +- templates/admin/config.tmpl | 4 +- 10 files changed, 264 insertions(+), 269 deletions(-) (limited to 'modules/setting/setting.go') diff --git a/README.md b/README.md index 847844f3..af33b0e8 100644 --- a/README.md +++ b/README.md @@ -75,9 +75,6 @@ There are 5 ways to install Gogs: The [core team](http://gogs.io/team) of this project. See [contributors page](https://github.com/gogits/gogs/graphs/contributors) for full list of contributors. -[![Clone in Koding](http://learn.koding.com/btn/clone_d.png)][koding] -[koding]: https://koding.com/Teamwork?import=https://github.com/gogits/gogs/archive/master.zip&c=git1 - ## License This project is under the MIT License. See the [LICENSE](https://github.com/gogits/gogs/blob/master/LICENSE) file for the full license text. diff --git a/README_ZH.md b/README_ZH.md index f67cf037..26746ccb 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -66,9 +66,6 @@ Gogs 完全使用 Go 语言来实现对 Git 数据的操作,实现 **零** 依 本项目的 [开发团队](http://gogs.io/team)。您可以通过查看 [贡献者页面](https://github.com/gogits/gogs/graphs/contributors) 获取完整的贡献者列表。 -[![Clone in Koding](http://learn.koding.com/btn/clone_d.png)][koding] -[koding]: https://koding.com/Teamwork?import=https://github.com/gogits/gogs/archive/master.zip&c=git1 - ## 授权许可 本项目采用 MIT 开源授权许可证,完整的授权说明已放置在 [LICENSE](https://github.com/gogits/gogs/blob/master/LICENSE) 文件中。 \ No newline at end of file diff --git a/conf/app.ini b/conf/app.ini index 111261db..296509f7 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -51,8 +51,8 @@ SECRET_KEY = !#@FDEWREWR&*( LOGIN_REMEMBER_DAYS = 7 COOKIE_USERNAME = gogs_awesome COOKIE_REMEMBER_NAME = gogs_incredible -; Reverse proxy authentication header name of user ID -REVERSE_PROXY_AUTHENTICATION_UID = X-WEBAUTH-UID +; Reverse proxy authentication header name of user name +REVERSE_PROXY_AUTHENTICATION_USER = X-WEBAUTH-USER [service] ACTIVE_CODE_LIVE_MINUTES = 180 diff --git a/gogs.go b/gogs.go index a39d2d43..75d3eb4b 100644 --- a/gogs.go +++ b/gogs.go @@ -17,7 +17,7 @@ import ( "github.com/gogits/gogs/modules/setting" ) -const APP_VER = "0.4.5.0623 Alpha" +const APP_VER = "0.4.5.0624 Alpha" func init() { runtime.GOMAXPROCS(runtime.NumCPU()) diff --git a/modules/auth/user.go b/modules/auth/user.go index 284a4644..20f99336 100644 --- a/modules/auth/user.go +++ b/modules/auth/user.go @@ -25,23 +25,25 @@ func SignedInId(header http.Header, sess session.SessionStore) int64 { return 0 } - var id int64 if setting.Service.EnableReverseProxyAuth { - id, _ = base.StrTo(header.Get(setting.ReverseProxyAuthUid)).Int64() - } - - if id <= 0 { - uid := sess.Get("userId") - if uid == nil { - return 0 - } - var ok bool - if id, ok = uid.(int64); !ok { - return 0 + webAuthUser := header.Get(setting.ReverseProxyAuthUser) + if len(webAuthUser) > 0 { + u, err := models.GetUserByName(webAuthUser) + if err != nil { + if err != models.ErrUserNotExist { + log.Error("auth.user.SignedInId(GetUserByName): %v", err) + } + return 0 + } + return u.Id } } - if id > 0 { + uid := sess.Get("userId") + if uid == nil { + return 0 + } + if id, ok := uid.(int64); ok { if _, err := models.GetUserById(id); err != nil { if err != models.ErrUserNotExist { log.Error("auth.user.SignedInId(GetUserById): %v", err) diff --git a/modules/bin/conf.go b/modules/bin/conf.go index 71a9fac8..fa0822d7 100644 --- a/modules/bin/conf.go +++ b/modules/bin/conf.go @@ -28,242 +28,241 @@ func bindata_read(data []byte, name string) ([]byte, error) { func conf_app_ini() ([]byte, error) { return bindata_read([]byte{ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x00, 0xff, 0xb4, 0x59, - 0xdd, 0x72, 0xdb, 0xc8, 0xb1, 0xbe, 0xc7, 0x53, 0x8c, 0x79, 0x76, 0xcf, - 0xda, 0xa7, 0x24, 0x92, 0x92, 0x8f, 0x65, 0xaf, 0xbc, 0xae, 0x63, 0x8a, - 0x04, 0x25, 0x1c, 0xf3, 0x47, 0x0b, 0x40, 0xf2, 0x2a, 0x2e, 0x15, 0x0a, - 0x02, 0x86, 0xe4, 0x44, 0x00, 0x06, 0xc2, 0x0c, 0x45, 0x31, 0x77, 0x79, - 0x85, 0x54, 0x9e, 0x26, 0xcf, 0x93, 0x8b, 0x3c, 0x46, 0xbe, 0x1e, 0x00, - 0x14, 0x28, 0x73, 0xb5, 0xce, 0x5f, 0x25, 0x65, 0x11, 0xf3, 0xd3, 0xd3, - 0xdd, 0xf3, 0xf5, 0xd7, 0xdd, 0xb3, 0xef, 0x59, 0x2f, 0xcf, 0x59, 0x16, - 0xa6, 0x9c, 0xe9, 0x45, 0xa8, 0x99, 0x5a, 0xc8, 0x95, 0x62, 0x32, 0x63, - 0xfc, 0x9e, 0x17, 0x6b, 0x96, 0x87, 0x73, 0x4c, 0x08, 0x9d, 0x70, 0xab, - 0x77, 0x7e, 0x1e, 0x4c, 0x7a, 0x63, 0x9b, 0x7d, 0x60, 0xa7, 0x72, 0xae, - 0x8e, 0xf1, 0x2f, 0x3b, 0x15, 0x9a, 0x79, 0xbc, 0xb8, 0x17, 0x51, 0x39, - 0x3f, 0x9a, 0x9e, 0x4e, 0x31, 0x2f, 0xd2, 0x79, 0x67, 0x16, 0x62, 0x54, - 0x66, 0xed, 0x3c, 0x9b, 0x5b, 0xef, 0x59, 0x7f, 0x11, 0x66, 0x90, 0x84, - 0xe5, 0x62, 0xc6, 0xd6, 0x72, 0xc9, 0x8a, 0x65, 0xc6, 0x12, 0x19, 0x85, - 0x49, 0xb2, 0xb6, 0xdc, 0x8b, 0x49, 0x70, 0xe1, 0xd9, 0x2e, 0x76, 0xce, - 0x85, 0xc6, 0x6a, 0x5b, 0xe8, 0x05, 0x2f, 0x58, 0x2b, 0xe6, 0xf7, 0xad, - 0x3d, 0xd6, 0xca, 0x0b, 0x19, 0xb7, 0x98, 0xc4, 0x80, 0xe6, 0x4a, 0x63, - 0x24, 0xe6, 0xb3, 0x70, 0x99, 0x40, 0x96, 0x2a, 0xd7, 0x18, 0x09, 0xe3, - 0xe9, 0x80, 0x74, 0xc3, 0xb7, 0x65, 0x7d, 0x29, 0x78, 0x2e, 0x95, 0xd0, - 0xb2, 0x58, 0x5f, 0x5b, 0xee, 0x74, 0xea, 0x63, 0xc2, 0xf2, 0xfa, 0xae, - 0x73, 0xee, 0x07, 0xfe, 0xd5, 0x39, 0xad, 0xbb, 0x09, 0xd5, 0x02, 0x0b, - 0x15, 0xb4, 0xe7, 0xc5, 0xb5, 0x75, 0xee, 0x4e, 0xfd, 0x69, 0x7f, 0x3a, - 0xc2, 0xcc, 0x42, 0xeb, 0xdc, 0x1a, 0x4c, 0xc7, 0x3d, 0x67, 0x82, 0x2f, - 0xa3, 0xe4, 0x42, 0x2a, 0x6d, 0xe4, 0x04, 0x17, 0x2e, 0x2d, 0xf9, 0xfe, - 0x65, 0xbd, 0xfe, 0x95, 0x3a, 0xee, 0x74, 0xbe, 0x7f, 0x59, 0x2e, 0xc7, - 0xc7, 0xf7, 0x2f, 0xcf, 0x7c, 0xff, 0x3c, 0x38, 0x9f, 0xba, 0xfe, 0x2b, - 0xd5, 0xb1, 0xcc, 0x47, 0x6f, 0x30, 0x20, 0xdb, 0xac, 0xcd, 0x0c, 0x3e, - 0x5e, 0x77, 0xbb, 0x5d, 0xcb, 0xf3, 0xce, 0xea, 0xef, 0xc3, 0x43, 0xd8, - 0x3d, 0x10, 0x2a, 0xbc, 0x49, 0x38, 0xeb, 0x0f, 0x26, 0xe4, 0xff, 0x8c, - 0x89, 0xac, 0xb6, 0x3e, 0x95, 0x31, 0xb7, 0xa6, 0xc3, 0xe1, 0xc8, 0x99, - 0xd8, 0xb5, 0xa9, 0xb3, 0x30, 0x51, 0xdc, 0x1a, 0x38, 0x5e, 0xef, 0x64, - 0x64, 0x07, 0xee, 0xf4, 0xc2, 0xb7, 0x5d, 0xba, 0x82, 0xcd, 0xd4, 0x7b, - 0x76, 0xca, 0x33, 0x5e, 0x84, 0x9a, 0x33, 0xa5, 0x79, 0xae, 0x8e, 0x31, - 0xf2, 0x1d, 0x8b, 0x62, 0x5c, 0xab, 0x5e, 0x74, 0xb4, 0xec, 0xcc, 0x71, - 0x91, 0x9d, 0x68, 0xa9, 0xb4, 0x4c, 0x3b, 0x64, 0xb6, 0x32, 0x0b, 0xe6, - 0xd2, 0x5c, 0xcf, 0x77, 0xa7, 0x53, 0x32, 0xb9, 0xa3, 0x8a, 0xa8, 0x93, - 0xdf, 0xce, 0x3b, 0x51, 0xb1, 0xce, 0xb1, 0x47, 0x27, 0xaa, 0x33, 0xaf, - 0xc4, 0x06, 0x11, 0x2f, 0x74, 0x1b, 0xeb, 0xf7, 0xa3, 0xf0, 0x83, 0x2e, - 0x96, 0x9c, 0xed, 0xc7, 0x4b, 0x4c, 0x08, 0x99, 0x7d, 0x78, 0xf7, 0xf6, - 0xa8, 0xbb, 0xe8, 0xa6, 0x5d, 0xc5, 0xf6, 0xc9, 0x7d, 0x1f, 0xd2, 0x35, - 0xfd, 0x69, 0xf3, 0x87, 0x30, 0xcd, 0x13, 0xde, 0x8e, 0x64, 0x6a, 0xf5, - 0x6d, 0xd7, 0x0f, 0x86, 0xce, 0x88, 0x8c, 0x69, 0x6a, 0xd1, 0x31, 0x62, - 0x73, 0x9e, 0x5a, 0x9f, 0xec, 0xab, 0x9d, 0x0b, 0x6e, 0xf9, 0xda, 0xcc, - 0xbf, 0x67, 0x17, 0x79, 0x0e, 0xa8, 0x24, 0x70, 0x57, 0xc2, 0xe4, 0x8c, - 0x69, 0x0e, 0xe9, 0x64, 0x70, 0x98, 0xc5, 0x30, 0x1a, 0xaa, 0x44, 0x6c, - 0x26, 0xe0, 0x53, 0x32, 0x19, 0xcb, 0x1b, 0xd0, 0x01, 0xc6, 0xcc, 0x28, - 0x5b, 0x01, 0x6c, 0xdc, 0x80, 0x9a, 0x86, 0xf9, 0x03, 0x8f, 0x96, 0x9a, - 0xc7, 0x96, 0xe7, 0xf7, 0x7c, 0xa7, 0x1f, 0x98, 0x6b, 0x3f, 0xef, 0xf9, - 0x67, 0x74, 0x85, 0xd6, 0x97, 0x38, 0xd4, 0x21, 0xb0, 0xc3, 0xaf, 0x1b, - 0x38, 0x4d, 0xd7, 0xea, 0x2e, 0x31, 0x48, 0x85, 0x85, 0xf3, 0x82, 0xab, - 0x12, 0xad, 0x18, 0x14, 0x9a, 0xbf, 0xc6, 0x84, 0xd0, 0x3f, 0x28, 0x82, - 0x7d, 0xc1, 0xa2, 0x85, 0xa4, 0x60, 0x19, 0x9c, 0xd4, 0x38, 0x34, 0x7b, - 0xad, 0xb3, 0xa9, 0x47, 0x28, 0x38, 0x38, 0x7c, 0xdb, 0xee, 0xe2, 0x7f, - 0x07, 0xc7, 0xaf, 0x5f, 0x77, 0x8f, 0xac, 0x2a, 0xdc, 0xe8, 0x96, 0xac, - 0x2a, 0x40, 0x0a, 0x29, 0xb5, 0x75, 0xde, 0xf3, 0xbc, 0xcf, 0x03, 0xf6, - 0x01, 0x2a, 0x0c, 0xe9, 0xa0, 0xc6, 0xb1, 0x59, 0xb2, 0xde, 0x63, 0xbc, - 0x8e, 0x9f, 0x12, 0x4f, 0xa4, 0x59, 0xc1, 0xef, 0x96, 0xa2, 0xe0, 0xa5, - 0x62, 0x40, 0xbc, 0x98, 0xad, 0xf7, 0x67, 0xcb, 0x24, 0x69, 0x01, 0x84, - 0xa3, 0x4d, 0xec, 0x94, 0xeb, 0x6b, 0xb1, 0xb5, 0xfe, 0x46, 0xaa, 0x55, - 0xb9, 0x80, 0xec, 0x37, 0xb8, 0x69, 0xc7, 0x37, 0x70, 0x47, 0x18, 0xa7, - 0x22, 0xbb, 0x36, 0x81, 0x14, 0x2d, 0x0b, 0xa1, 0x11, 0x6f, 0xce, 0x04, - 0x9e, 0x1b, 0x8d, 0x80, 0xc4, 0xfe, 0xa7, 0x06, 0x14, 0x5f, 0xbc, 0xe8, - 0x9f, 0xf5, 0x26, 0xa7, 0x36, 0xf3, 0xcf, 0x1c, 0x8f, 0xf9, 0x53, 0xf6, - 0xc9, 0xb6, 0xcf, 0xd9, 0xd5, 0xf4, 0xc2, 0x65, 0xc6, 0xb6, 0x41, 0xcf, - 0xef, 0x31, 0xaf, 0x37, 0xb4, 0x5f, 0xbc, 0xb0, 0x3c, 0xbb, 0xef, 0xda, - 0x7e, 0x80, 0xdb, 0x87, 0x80, 0x17, 0xff, 0xf5, 0x71, 0x38, 0xb0, 0x3f, - 0xbb, 0xf8, 0xff, 0x7f, 0xff, 0xcf, 0x4b, 0x48, 0xea, 0x2d, 0xb5, 0xdc, - 0x4f, 0xe4, 0x1c, 0xd1, 0x51, 0xf0, 0x94, 0xa7, 0x37, 0xb0, 0x35, 0x0e, - 0xd7, 0xca, 0x02, 0xf6, 0x9d, 0x49, 0xe0, 0xda, 0x63, 0x7b, 0x7c, 0x82, - 0x50, 0x18, 0xf4, 0xae, 0x3c, 0xec, 0x7f, 0x6b, 0xf5, 0xa7, 0xd3, 0x4f, - 0x8e, 0x6d, 0x38, 0xa6, 0xe1, 0xd2, 0x20, 0x5c, 0x71, 0x25, 0x53, 0x5e, - 0x4f, 0x6f, 0xf6, 0x35, 0xd7, 0x88, 0x2c, 0x2a, 0x78, 0x2c, 0x4a, 0xaf, - 0xb8, 0x44, 0x8a, 0x0a, 0xa8, 0x29, 0xe4, 0xc3, 0x9a, 0x85, 0x4b, 0x78, - 0x39, 0x03, 0xc0, 0x0c, 0xde, 0xd9, 0x82, 0x87, 0x31, 0x14, 0x31, 0x54, - 0x0a, 0x20, 0x2e, 0xc1, 0x2c, 0xcc, 0x19, 0x58, 0xae, 0x7d, 0x69, 0xbb, - 0x9e, 0x1d, 0x80, 0x30, 0x7e, 0xb9, 0x0a, 0x7a, 0x17, 0xfe, 0x99, 0x3d, - 0x01, 0xac, 0x00, 0xad, 0x29, 0x58, 0xcf, 0xc1, 0x2d, 0xb2, 0x5f, 0xf6, - 0x3f, 0xdb, 0x27, 0x34, 0xb3, 0x8f, 0xef, 0x8a, 0x93, 0x00, 0x92, 0x6b, - 0xab, 0xd7, 0xf7, 0x9d, 0x4b, 0x3b, 0xe8, 0xe3, 0x76, 0x82, 0x11, 0xfd, - 0x1a, 0x3b, 0x13, 0x04, 0x39, 0x19, 0x75, 0xf0, 0xae, 0x0b, 0xd1, 0x9e, - 0x4d, 0xd0, 0x24, 0x30, 0xfc, 0xea, 0x22, 0x44, 0x08, 0x69, 0x92, 0x71, - 0x1e, 0x33, 0x2d, 0x19, 0x28, 0x79, 0x26, 0x8a, 0x94, 0xf1, 0xfd, 0x34, - 0x14, 0x09, 0x9b, 0xe1, 0x9e, 0x0b, 0x3e, 0x17, 0x4a, 0x97, 0x51, 0x0b, - 0x99, 0xa7, 0x8e, 0x47, 0x3c, 0x62, 0x83, 0xd0, 0x46, 0x90, 0x3a, 0x19, - 0x3a, 0xee, 0xb8, 0x71, 0x8d, 0x03, 0xc9, 0x15, 0xcb, 0xa4, 0x66, 0xa0, - 0x6e, 0xb9, 0xaa, 0x36, 0xe3, 0x00, 0x8a, 0x37, 0x03, 0x06, 0x06, 0x87, - 0x99, 0x00, 0x8c, 0x22, 0xb9, 0xcc, 0x74, 0x09, 0x9e, 0x0d, 0x49, 0x19, - 0xf1, 0xae, 0xb1, 0xbe, 0x21, 0xd4, 0xa8, 0x98, 0x22, 0xc0, 0x99, 0x12, - 0x73, 0x43, 0x7b, 0x50, 0xf5, 0x5e, 0xf0, 0x15, 0xc4, 0xae, 0xf5, 0x42, - 0x64, 0xf3, 0x36, 0x34, 0xfb, 0xf9, 0xc2, 0x71, 0xed, 0xc0, 0x73, 0x4e, - 0x27, 0xb8, 0xe5, 0x4b, 0xc7, 0xfe, 0xdc, 0x90, 0xd0, 0x0f, 0x23, 0x84, - 0x73, 0x78, 0x0f, 0x74, 0x42, 0x17, 0xc5, 0x72, 0x11, 0xe9, 0x65, 0xc1, - 0x2d, 0x7b, 0x62, 0xce, 0xed, 0xf7, 0xfa, 0x67, 0x76, 0xd0, 0xbb, 0x04, - 0xc6, 0xdc, 0xc6, 0xae, 0x31, 0xf9, 0x00, 0xc6, 0x88, 0x59, 0x75, 0x8b, - 0xf5, 0xfa, 0xc9, 0xd4, 0x77, 0x86, 0x57, 0x01, 0xf9, 0xa0, 0xb9, 0x5c, - 0x82, 0x27, 0x62, 0xae, 0xb1, 0xeb, 0xd8, 0xa4, 0x09, 0x22, 0x7f, 0xa4, - 0xac, 0xc5, 0xf2, 0x86, 0xf8, 0x8c, 0xc2, 0x42, 0x68, 0x55, 0xb2, 0xaa, - 0x50, 0x6a, 0xc9, 0x55, 0xe7, 0xe0, 0xe8, 0x4d, 0x2d, 0xf3, 0x39, 0x24, - 0x6c, 0x0e, 0xb1, 0xbe, 0xac, 0xf8, 0xcd, 0x42, 0xca, 0x5b, 0xe2, 0x97, - 0x7e, 0x01, 0x5c, 0xe9, 0x50, 0xdd, 0xc2, 0x23, 0xf0, 0xf1, 0x7d, 0x98, - 0x90, 0x6b, 0xe0, 0x63, 0xf0, 0x93, 0xb2, 0xfc, 0x9e, 0xf7, 0x29, 0x70, - 0x26, 0xb8, 0xac, 0xcb, 0x1e, 0x69, 0x79, 0x40, 0xb7, 0xc3, 0x13, 0x01, - 0x8c, 0x22, 0x65, 0xa7, 0x5c, 0x2e, 0x35, 0x2d, 0x47, 0x60, 0xca, 0x2c, - 0x56, 0xd6, 0xc0, 0x26, 0x74, 0xb8, 0x81, 0xef, 0x8c, 0x6d, 0xa4, 0x0a, - 0x6c, 0x78, 0x83, 0xd3, 0x08, 0x05, 0x94, 0xff, 0x4a, 0x1d, 0x07, 0x0d, - 0x63, 0x4f, 0x96, 0xb3, 0x99, 0x61, 0xd6, 0x6c, 0x0e, 0x8e, 0x04, 0xa2, - 0x23, 0xe4, 0xf0, 0x8c, 0x27, 0x7b, 0xec, 0x96, 0xf3, 0x9c, 0x52, 0x39, - 0xdc, 0x2c, 0x0c, 0x93, 0x56, 0x39, 0x3d, 0x96, 0xd9, 0x0f, 0x9a, 0xdd, - 0x66, 0x80, 0xc5, 0x8a, 0x6a, 0x09, 0x33, 0xd9, 0x46, 0x30, 0x4f, 0x06, - 0xc1, 0xc9, 0xc5, 0x70, 0x48, 0xd9, 0xc9, 0x26, 0x53, 0x0f, 0x08, 0x96, - 0x13, 0x0a, 0x14, 0x30, 0x0e, 0xe8, 0x7a, 0x0d, 0x6c, 0x92, 0x61, 0x74, - 0x1b, 0x65, 0xb1, 0xe1, 0x5d, 0x9c, 0xfc, 0xbf, 0xdd, 0xf7, 0x4d, 0xaa, - 0xad, 0x0b, 0x8f, 0x57, 0xaa, 0xbe, 0xb1, 0x32, 0x69, 0x53, 0x7a, 0x4b, - 0xcd, 0x55, 0xa8, 0x54, 0xe7, 0xed, 0x39, 0xfd, 0xa6, 0x6b, 0x38, 0x7e, - 0xf3, 0xee, 0x2d, 0xe6, 0x7e, 0xfe, 0xb9, 0x9a, 0xb8, 0xbb, 0x33, 0xa3, - 0x87, 0x6f, 0x6a, 0x96, 0xad, 0xc5, 0xcc, 0x0a, 0x99, 0x02, 0xb3, 0x31, - 0x98, 0x53, 0x59, 0x43, 0x77, 0x3a, 0x7e, 0x9c, 0x83, 0xe1, 0x26, 0x80, - 0x4d, 0x34, 0x13, 0xb4, 0xf3, 0x50, 0xa9, 0x95, 0x2c, 0xe2, 0x9a, 0x87, - 0x37, 0x1c, 0x4c, 0x39, 0x41, 0x12, 0x15, 0x7c, 0xed, 0xc3, 0x6a, 0xa2, - 0x5d, 0x22, 0xe4, 0xeb, 0xf9, 0xfe, 0xc8, 0x01, 0x02, 0x02, 0xc3, 0x01, - 0xf5, 0x47, 0xc9, 0x7c, 0x65, 0xb9, 0x32, 0x3d, 0x37, 0x51, 0x5c, 0x03, - 0x2d, 0xcc, 0x45, 0xbb, 0x01, 0x36, 0xd2, 0xcf, 0x22, 0x14, 0x55, 0x35, - 0xc9, 0x0e, 0x3c, 0x1a, 0x8e, 0xec, 0x18, 0x25, 0x3a, 0xf4, 0x8f, 0x2c, - 0xc4, 0x1f, 0xb8, 0xe5, 0x4f, 0x3f, 0xd9, 0x93, 0x6f, 0xdc, 0x14, 0x45, - 0xf0, 0x4d, 0xa0, 0xe5, 0x2d, 0xcf, 0x2c, 0x53, 0x4e, 0x68, 0x16, 0x25, - 0x02, 0xac, 0xc7, 0x44, 0x5c, 0xa6, 0x58, 0x8e, 0x70, 0xd7, 0xc6, 0x95, - 0x98, 0xaf, 0xc5, 0x01, 0x71, 0x4a, 0x22, 0xc9, 0xc7, 0x94, 0x96, 0x25, - 0x12, 0xb4, 0x42, 0x91, 0x20, 0xe7, 0x65, 0xda, 0xef, 0x80, 0x3e, 0x7f, - 0xcf, 0x23, 0xbd, 0x71, 0x8f, 0x99, 0xf9, 0x97, 0xdd, 0xb3, 0x5a, 0xad, - 0x2a, 0x51, 0x70, 0x94, 0x32, 0x07, 0x19, 0x1b, 0xc8, 0x4f, 0x22, 0x9b, - 0xc9, 0x36, 0x37, 0xf8, 0xfa, 0xe6, 0xe5, 0xd0, 0x92, 0x0a, 0x87, 0x5d, - 0x2e, 0xae, 0xa8, 0x6d, 0xcb, 0x28, 0x59, 0xba, 0xec, 0xd0, 0x48, 0xd9, - 0xe9, 0xe3, 0x67, 0x77, 0x55, 0x2e, 0xae, 0x5c, 0x72, 0x77, 0xf7, 0x4f, - 0xbb, 0x03, 0xb4, 0x6c, 0xc0, 0xcf, 0xfe, 0xfa, 0x97, 0x3f, 0xfd, 0xed, - 0x8f, 0x7f, 0xa6, 0x74, 0xb9, 0x03, 0x23, 0x45, 0x98, 0x2f, 0xaa, 0xc0, - 0xa8, 0x34, 0x68, 0x77, 0x1b, 0x10, 0x79, 0xcf, 0x76, 0x82, 0x64, 0xe7, - 0xae, 0x52, 0x73, 0xec, 0xe0, 0x59, 0x44, 0xc0, 0x58, 0x71, 0x71, 0x23, - 0x77, 0x79, 0x0d, 0x38, 0xc8, 0xda, 0xba, 0xde, 0x1f, 0xcd, 0xc5, 0xfe, - 0x4d, 0x0d, 0xb4, 0xc3, 0xdf, 0x80, 0xe7, 0xf3, 0x5b, 0xb7, 0x40, 0x5a, - 0x79, 0x50, 0xaf, 0x84, 0xd6, 0xbb, 0x88, 0xed, 0x1f, 0x70, 0xe3, 0xae, - 0x9b, 0x47, 0x0c, 0x56, 0xa2, 0x1f, 0xbd, 0xf0, 0x1b, 0xca, 0xff, 0xca, - 0x9e, 0x5d, 0x5a, 0x1b, 0xdf, 0xfd, 0x27, 0x74, 0x36, 0x82, 0x1b, 0xf7, - 0xf6, 0x0d, 0x2a, 0x7f, 0xbd, 0x65, 0x5b, 0xe3, 0x88, 0x32, 0xee, 0x56, - 0x15, 0xcc, 0x53, 0xf4, 0x5b, 0x65, 0xb1, 0x09, 0x5e, 0xc7, 0x0f, 0x59, - 0x8e, 0x9a, 0x95, 0x4f, 0xda, 0xb6, 0x6a, 0xb1, 0xd5, 0x1b, 0xf4, 0xce, - 0x7d, 0xc3, 0xa8, 0xe5, 0x48, 0x5d, 0x7b, 0x56, 0xf3, 0x55, 0x41, 0x7b, - 0xda, 0xdf, 0xca, 0x80, 0x55, 0x4a, 0xdb, 0x92, 0x78, 0xd4, 0xb5, 0x1a, - 0xb9, 0xf0, 0xa8, 0x5b, 0x0b, 0x2a, 0x75, 0x31, 0x5c, 0xd5, 0xd4, 0x05, - 0x02, 0x32, 0x70, 0x90, 0x29, 0xdc, 0x50, 0x3d, 0x6f, 0xd2, 0xc0, 0x7b, - 0x66, 0x36, 0x1c, 0xb3, 0xd6, 0xf1, 0x51, 0xf7, 0xf5, 0x8f, 0x2d, 0x0c, - 0xd4, 0xbb, 0x30, 0xf6, 0x58, 0x9f, 0x1f, 0x1c, 0x1c, 0x1e, 0x1c, 0xb4, - 0xaa, 0x8c, 0x62, 0x6a, 0x36, 0xa5, 0x20, 0x6c, 0xb7, 0x3f, 0x88, 0x47, - 0x1e, 0xfd, 0x52, 0xba, 0xa5, 0x6a, 0x19, 0x76, 0xf9, 0x04, 0x05, 0xc2, - 0xa5, 0x33, 0x30, 0x4e, 0x31, 0x0c, 0xf4, 0x9e, 0x9d, 0x17, 0xf2, 0x5e, - 0x50, 0x75, 0x69, 0xca, 0xb7, 0x39, 0x93, 0x39, 0x69, 0xae, 0x4a, 0xe5, - 0xb0, 0xe7, 0xd8, 0x54, 0x64, 0x8b, 0xf0, 0x9e, 0x92, 0xd5, 0xba, 0x5e, - 0xb5, 0xe6, 0xd4, 0x4c, 0x93, 0x08, 0x64, 0xc2, 0x52, 0xbf, 0xc7, 0x5e, - 0x08, 0x5d, 0x42, 0x7b, 0xde, 0x46, 0x8f, 0x40, 0xf5, 0x7c, 0x35, 0xab, - 0x5a, 0x8f, 0xf6, 0x57, 0x32, 0x12, 0x71, 0xcb, 0xcb, 0xa1, 0x2a, 0xeb, - 0x1a, 0x4f, 0xed, 0xb1, 0x5c, 0xca, 0xc4, 0x03, 0x7c, 0xf6, 0x36, 0x99, - 0xb1, 0x16, 0xf8, 0xe8, 0xa3, 0xa3, 0xd7, 0x6f, 0x7f, 0xdc, 0x3b, 0xe8, - 0x76, 0xf7, 0x42, 0x34, 0x62, 0x0f, 0x82, 0x1b, 0x67, 0x92, 0xdd, 0xc7, - 0xa8, 0xad, 0xf7, 0xf1, 0x77, 0x3f, 0x2e, 0xa8, 0x5a, 0xe9, 0x98, 0x41, - 0x16, 0xab, 0xac, 0x3e, 0x15, 0xe5, 0x28, 0x6a, 0xbe, 0x5a, 0x22, 0xf5, - 0x3c, 0xc7, 0xf5, 0x31, 0x1f, 0x6b, 0x65, 0x03, 0x6d, 0x7a, 0x9b, 0x8d, - 0xb7, 0xca, 0x5a, 0xf5, 0xb4, 0x6e, 0x51, 0x6a, 0x93, 0x70, 0xa6, 0x57, - 0xd9, 0x1e, 0xa1, 0xac, 0x12, 0xdc, 0xe4, 0xf4, 0xba, 0xe6, 0xaf, 0x4a, - 0x7d, 0x11, 0x90, 0x9d, 0x41, 0x59, 0xbf, 0x61, 0x87, 0x53, 0x16, 0x34, - 0xc8, 0x05, 0x1b, 0xc7, 0x01, 0x76, 0x26, 0x3a, 0x2a, 0x44, 0x36, 0xee, - 0xad, 0x8a, 0xd1, 0x52, 0x20, 0xc2, 0xf2, 0xc2, 0xb5, 0x1b, 0x65, 0x94, - 0x9d, 0x99, 0x96, 0x5e, 0x51, 0xe6, 0x34, 0xe7, 0x6f, 0xed, 0xa5, 0x9e, - 0xb9, 0xae, 0x0f, 0xa9, 0x98, 0x2f, 0xa5, 0x60, 0xbb, 0x99, 0x78, 0x54, - 0x1d, 0x01, 0x40, 0x25, 0xdd, 0x26, 0x0a, 0xb6, 0x84, 0xbc, 0x3b, 0xfa, - 0xdf, 0x6e, 0xd7, 0x3a, 0xed, 0x6f, 0x8a, 0x41, 0x53, 0xe3, 0x41, 0x48, - 0x39, 0xf1, 0x28, 0x25, 0x11, 0x33, 0x6e, 0xe4, 0xec, 0xd8, 0xee, 0xd9, - 0x9e, 0x47, 0x2d, 0xc9, 0xc8, 0x19, 0xda, 0x4f, 0xf7, 0x6f, 0x7c, 0x10, - 0x03, 0x63, 0x6a, 0xc1, 0x66, 0xcb, 0x2c, 0xda, 0xdb, 0xe0, 0x5c, 0x2d, - 0xc2, 0x03, 0x42, 0x37, 0xfe, 0x1e, 0xbe, 0x39, 0xaa, 0xe0, 0x1d, 0xbf, - 0x69, 0x35, 0xcf, 0xa0, 0x35, 0x9b, 0x23, 0x9c, 0x41, 0x70, 0xd6, 0xf3, - 0xce, 0x86, 0x17, 0x93, 0x3e, 0x0e, 0x31, 0x53, 0x8f, 0x3a, 0x9a, 0x03, - 0xd0, 0xde, 0x6f, 0xa9, 0x48, 0x17, 0x51, 0x20, 0x84, 0x51, 0xaf, 0x95, - 0xd0, 0x78, 0x2a, 0xcb, 0x74, 0x8a, 0x08, 0xc3, 0xaa, 0xec, 0xa7, 0x30, - 0xf4, 0xa9, 0xbd, 0x4f, 0xc2, 0x88, 0x53, 0x2f, 0x51, 0x8d, 0x1b, 0x68, - 0x3c, 0xf6, 0xc7, 0x25, 0xa2, 0x4b, 0x8d, 0xef, 0x44, 0x26, 0x96, 0x4f, - 0x02, 0xb2, 0x9a, 0xc7, 0x61, 0xee, 0xa5, 0xd3, 0x27, 0x8f, 0x54, 0x95, - 0x67, 0xdd, 0xce, 0x9c, 0xba, 0x4f, 0x5a, 0x0a, 0xeb, 0x0b, 0xca, 0xa7, - 0xf2, 0xc9, 0xa9, 0x7a, 0x33, 0x68, 0x10, 0x42, 0x55, 0x15, 0x35, 0x19, - 0x81, 0x68, 0xc8, 0xf8, 0x0e, 0x85, 0x6a, 0xa9, 0x47, 0xfd, 0xbe, 0xf0, - 0x44, 0x95, 0x7a, 0x6f, 0xd9, 0x2c, 0x01, 0x4a, 0x69, 0x1a, 0x92, 0x61, - 0x8a, 0xe7, 0xa1, 0x79, 0xe0, 0x49, 0xb1, 0x52, 0xe4, 0x40, 0x1a, 0xbd, - 0x14, 0xa9, 0x3a, 0x74, 0xaa, 0x6d, 0x7b, 0x26, 0xee, 0x5b, 0x56, 0xd5, - 0xe7, 0x57, 0xa3, 0xff, 0xce, 0x22, 0xff, 0x49, 0x7d, 0xdf, 0x35, 0xb8, - 0xa9, 0x0d, 0xf7, 0x0b, 0x5c, 0x03, 0x99, 0x39, 0xe0, 0x37, 0xcb, 0x39, - 0xfd, 0x70, 0x50, 0x61, 0xd1, 0xdf, 0xcf, 0x61, 0x61, 0xec, 0xb7, 0x8b, - 0x42, 0x16, 0xf4, 0xa3, 0x5f, 0x08, 0xea, 0xa8, 0x9f, 0x52, 0x63, 0x29, - 0xc1, 0x1a, 0xa1, 0x85, 0x22, 0x7a, 0x37, 0x9f, 0x56, 0x4d, 0xf1, 0xb5, - 0x6f, 0x8c, 0xe9, 0x65, 0xbf, 0x49, 0xd7, 0xd0, 0xae, 0xc6, 0xaf, 0x37, - 0xdb, 0x36, 0x3b, 0x8c, 0x37, 0x9e, 0x2e, 0xa7, 0xc1, 0xc6, 0x5a, 0x7a, - 0x76, 0xaa, 0xf9, 0x01, 0xd3, 0xe5, 0x9b, 0x07, 0x7e, 0x18, 0x68, 0xd1, - 0x3b, 0x91, 0x09, 0x6c, 0x45, 0xcf, 0x00, 0x32, 0xc5, 0x0d, 0xc4, 0xb4, - 0x8a, 0x15, 0x52, 0xe3, 0xf7, 0x4b, 0x85, 0x7c, 0x1f, 0x19, 0x87, 0xce, - 0x24, 0xf5, 0xc9, 0x80, 0x6c, 0x4d, 0xda, 0xaf, 0xbe, 0x26, 0x80, 0xd1, - 0xf4, 0x34, 0x70, 0xa7, 0x7e, 0xcf, 0x6f, 0x44, 0xfe, 0x38, 0x7c, 0x40, - 0xbc, 0x66, 0xa0, 0xab, 0xa5, 0x79, 0xe0, 0x80, 0x28, 0x05, 0x29, 0xb8, - 0x60, 0xd2, 0x73, 0x4b, 0x86, 0x71, 0x37, 0x1c, 0x3e, 0xee, 0xfd, 0x12, - 0xd0, 0xfb, 0xa0, 0x57, 0x5f, 0x81, 0xb9, 0x04, 0x12, 0xa4, 0xc0, 0xd4, - 0x08, 0x34, 0x31, 0xd3, 0xcf, 0xc9, 0x39, 0x7c, 0x87, 0x74, 0x12, 0x66, - 0x10, 0xc8, 0x7e, 0xfa, 0x09, 0x5f, 0x7b, 0x0c, 0xf1, 0x3c, 0x3e, 0x31, - 0x72, 0x3d, 0xe7, 0x77, 0x60, 0xa8, 0x33, 0x67, 0x68, 0x1e, 0x2b, 0xdf, - 0x99, 0x80, 0x9d, 0xa7, 0x54, 0xef, 0x91, 0xd5, 0x31, 0x2a, 0xeb, 0xf5, - 0xd7, 0x76, 0x0d, 0xd0, 0x3e, 0x5f, 0x7d, 0x65, 0x99, 0xfd, 0x90, 0x0b, - 0x64, 0x14, 0xf3, 0x64, 0x43, 0xea, 0x90, 0x00, 0xd2, 0xe5, 0x65, 0xcc, - 0x13, 0x4e, 0x0f, 0x07, 0x33, 0x7a, 0x4f, 0x48, 0xa1, 0x36, 0xad, 0xd8, - 0x76, 0xd7, 0x5b, 0xa3, 0xcc, 0xe6, 0x61, 0xa7, 0x81, 0x80, 0x6c, 0xd7, - 0xf5, 0x67, 0x8d, 0xfb, 0xa4, 0xe7, 0x9b, 0x2a, 0xeb, 0x97, 0x29, 0x9f, - 0xde, 0x3e, 0xca, 0x57, 0xee, 0xca, 0x21, 0x29, 0x28, 0x28, 0x9c, 0xf3, - 0x1d, 0xe4, 0xee, 0xda, 0x48, 0x2e, 0x13, 0x34, 0xa4, 0x01, 0x28, 0x67, - 0xec, 0x35, 0x5f, 0x58, 0x7d, 0xec, 0x47, 0x1c, 0x16, 0x1b, 0xd9, 0xab, - 0x05, 0xcf, 0x9a, 0xe5, 0x05, 0x84, 0x24, 0x38, 0xee, 0x39, 0xa9, 0xcd, - 0x74, 0x51, 0x85, 0x8c, 0x8e, 0x72, 0x0a, 0x87, 0x65, 0x26, 0x1e, 0x4a, - 0x5e, 0x58, 0xc6, 0xf9, 0x93, 0x98, 0xa0, 0x25, 0xcd, 0x77, 0x6b, 0x7c, - 0x43, 0xc0, 0x59, 0xb3, 0x9a, 0xa9, 0x5f, 0x9e, 0x37, 0x2f, 0x7a, 0x86, - 0x66, 0x9e, 0xf8, 0x89, 0x06, 0xb7, 0xfc, 0xf4, 0x5c, 0x67, 0xbe, 0xad, - 0xc2, 0x40, 0x84, 0xf3, 0x0c, 0x07, 0x8a, 0xa8, 0x76, 0x5e, 0xd9, 0x54, - 0x1b, 0x9a, 0x6c, 0x35, 0xba, 0xf8, 0x67, 0x17, 0x3e, 0x69, 0xeb, 0xb7, - 0xbb, 0xf4, 0x6f, 0xef, 0xc4, 0xcb, 0x1b, 0xe6, 0x54, 0x51, 0x80, 0xff, - 0xa2, 0x30, 0x63, 0x37, 0x64, 0x26, 0x27, 0xf7, 0xa1, 0x48, 0xe2, 0x15, - 0x27, 0x7e, 0x69, 0x1d, 0x7c, 0x6c, 0x3c, 0x42, 0xb7, 0xf6, 0x5a, 0x87, - 0x5b, 0xdf, 0xd7, 0x74, 0x2f, 0x36, 0x3d, 0x95, 0x78, 0x4d, 0xd7, 0x6d, - 0x78, 0xf9, 0xa9, 0xfb, 0x1e, 0x1f, 0x84, 0x1b, 0x2e, 0xdc, 0x7e, 0x19, - 0x66, 0x5b, 0x8f, 0xb4, 0xd6, 0xc0, 0x25, 0xe9, 0xe5, 0xc2, 0x13, 0xec, - 0x8c, 0xe9, 0xbf, 0xb7, 0x3c, 0xc8, 0x22, 0x2d, 0x35, 0x3c, 0x36, 0x8f, - 0xbc, 0xc7, 0xf4, 0xcf, 0xc7, 0xcd, 0x7f, 0x7d, 0x30, 0xf4, 0xf3, 0x7f, - 0x60, 0xe7, 0x02, 0x95, 0xc4, 0x87, 0xa5, 0x9e, 0xbd, 0xb3, 0x08, 0x3c, - 0x24, 0xe4, 0xef, 0x01, 0x00, 0x00, 0xff, 0xff, 0xca, 0xc7, 0x79, 0x5b, - 0xc3, 0x19, 0x00, 0x00, + 0xeb, 0x72, 0xdb, 0xc8, 0x95, 0xfe, 0x8f, 0xa7, 0x68, 0x73, 0x67, 0x76, + 0xec, 0x2d, 0x89, 0xa4, 0xe4, 0xb5, 0xec, 0x91, 0xc7, 0xb5, 0xa6, 0x48, + 0x50, 0xc2, 0x9a, 0x17, 0x0d, 0x00, 0xc9, 0xa3, 0xb8, 0x54, 0x28, 0x08, + 0x68, 0x92, 0x1d, 0x01, 0x68, 0x08, 0xdd, 0x14, 0xc5, 0xfc, 0xcb, 0x2b, + 0xa4, 0xf2, 0x34, 0x79, 0x9e, 0xfc, 0xc8, 0x63, 0xe4, 0x3b, 0x0d, 0x80, + 0x02, 0x65, 0x8e, 0xc6, 0xb9, 0x55, 0x52, 0x16, 0xd1, 0xdd, 0xe7, 0xf4, + 0xb9, 0x7c, 0xe7, 0xd6, 0xf3, 0x9e, 0xf5, 0xf2, 0x9c, 0x65, 0x61, 0xca, + 0x99, 0x5e, 0x84, 0x9a, 0xa9, 0x85, 0x5c, 0x29, 0x26, 0x33, 0xc6, 0xef, + 0x79, 0xb1, 0x66, 0x79, 0x38, 0xc7, 0x86, 0xd0, 0x09, 0xb7, 0x7a, 0xe7, + 0xe7, 0xc1, 0xa4, 0x37, 0xb6, 0xd9, 0x07, 0x76, 0x2a, 0xe7, 0xea, 0x18, + 0xff, 0xb2, 0x53, 0xa1, 0x99, 0xc7, 0x8b, 0x7b, 0x11, 0x95, 0xfb, 0xa3, + 0xe9, 0xe9, 0x14, 0xfb, 0x22, 0x9d, 0x77, 0x66, 0x21, 0x56, 0x65, 0xd6, + 0xce, 0xb3, 0xb9, 0xf5, 0x9e, 0xf5, 0x17, 0x61, 0x06, 0x4e, 0x38, 0x2e, + 0x66, 0x6c, 0x2d, 0x97, 0xac, 0x58, 0x66, 0x2c, 0x91, 0x51, 0x98, 0x24, + 0x6b, 0xcb, 0xbd, 0x98, 0x04, 0x17, 0x9e, 0xed, 0x82, 0x72, 0x2e, 0x34, + 0x4e, 0xdb, 0x42, 0x2f, 0x78, 0xc1, 0x5a, 0x31, 0xbf, 0x6f, 0xed, 0xb1, + 0x56, 0x5e, 0xc8, 0xb8, 0xc5, 0x24, 0x16, 0x34, 0x57, 0x1a, 0x2b, 0x31, + 0x9f, 0x85, 0xcb, 0x04, 0xbc, 0x54, 0x79, 0xc6, 0x70, 0x18, 0x4f, 0x07, + 0x24, 0x1b, 0xbe, 0x2d, 0xeb, 0x4b, 0xc1, 0x73, 0xa9, 0x84, 0x96, 0xc5, + 0xfa, 0xda, 0x72, 0xa7, 0x53, 0x1f, 0x1b, 0x96, 0xd7, 0x77, 0x9d, 0x73, + 0x3f, 0xf0, 0xaf, 0xce, 0xe9, 0xdc, 0x4d, 0xa8, 0x16, 0x38, 0xa8, 0x20, + 0x3d, 0x2f, 0xae, 0xad, 0x73, 0x77, 0xea, 0x4f, 0xfb, 0xd3, 0x11, 0x76, + 0x16, 0x5a, 0xe7, 0xd6, 0x60, 0x3a, 0xee, 0x39, 0x13, 0x7c, 0x19, 0x21, + 0x17, 0x52, 0x69, 0xc3, 0x27, 0xb8, 0x70, 0xe9, 0xc8, 0xf7, 0x2f, 0xeb, + 0xf3, 0xaf, 0xd4, 0x71, 0xa7, 0xf3, 0xfd, 0xcb, 0xf2, 0x38, 0x3e, 0xbe, + 0x7f, 0x79, 0xe6, 0xfb, 0xe7, 0xc1, 0xf9, 0xd4, 0xf5, 0x5f, 0xa9, 0x8e, + 0x65, 0x3e, 0x7a, 0x83, 0x01, 0xe9, 0x66, 0x6d, 0x76, 0xf0, 0xf1, 0xba, + 0xdb, 0xed, 0x5a, 0x9e, 0x77, 0x56, 0x7f, 0x1f, 0x1e, 0x42, 0xef, 0x81, + 0x50, 0xe1, 0x4d, 0xc2, 0x59, 0x7f, 0x30, 0x21, 0xfb, 0x67, 0x4c, 0x64, + 0xb5, 0xf6, 0xa9, 0x8c, 0xb9, 0x35, 0x1d, 0x0e, 0x47, 0xce, 0xc4, 0xae, + 0x55, 0x9d, 0x85, 0x89, 0xe2, 0xd6, 0xc0, 0xf1, 0x7a, 0x27, 0x23, 0x3b, + 0x70, 0xa7, 0x17, 0xbe, 0xed, 0x92, 0x0b, 0x36, 0x5b, 0xef, 0xd9, 0x29, + 0xcf, 0x78, 0x11, 0x6a, 0xce, 0x94, 0xe6, 0xb9, 0x3a, 0xc6, 0xca, 0x77, + 0x2c, 0x8a, 0xe1, 0x56, 0xbd, 0xe8, 0x68, 0xd9, 0x99, 0xc3, 0x91, 0x9d, + 0x68, 0xa9, 0xb4, 0x4c, 0x3b, 0xa4, 0xb6, 0x32, 0x07, 0xe6, 0xd2, 0xb8, + 0xe7, 0xbb, 0xd3, 0x29, 0xa9, 0xdc, 0x51, 0x45, 0xd4, 0xc9, 0x6f, 0xe7, + 0x9d, 0xa8, 0x58, 0xe7, 0xa0, 0xd1, 0x89, 0xea, 0xcc, 0x2b, 0xb6, 0x41, + 0xc4, 0x0b, 0xdd, 0xc6, 0xf9, 0xfd, 0x28, 0xfc, 0xa0, 0x8b, 0x25, 0x67, + 0xfb, 0xf1, 0x12, 0x1b, 0x42, 0x66, 0x1f, 0xde, 0xbd, 0x3d, 0xea, 0x2e, + 0xba, 0x69, 0x57, 0xb1, 0x7d, 0x32, 0xdf, 0x87, 0x74, 0x4d, 0x7f, 0xda, + 0xfc, 0x21, 0x4c, 0xf3, 0x84, 0xb7, 0x23, 0x99, 0x5a, 0x7d, 0xdb, 0xf5, + 0x83, 0xa1, 0x33, 0x22, 0x65, 0x9a, 0x52, 0x74, 0x0c, 0xdb, 0x9c, 0xa7, + 0xd6, 0x27, 0xfb, 0x6a, 0xe7, 0x81, 0x5b, 0xbe, 0x36, 0xfb, 0xef, 0xd9, + 0x45, 0x9e, 0x03, 0x2a, 0x09, 0xcc, 0x95, 0x30, 0x39, 0x63, 0x9a, 0x83, + 0x3b, 0x29, 0x1c, 0x66, 0x31, 0x94, 0x86, 0x28, 0x11, 0x9b, 0x09, 0xd8, + 0x94, 0x54, 0xc6, 0xf1, 0x06, 0x74, 0x80, 0x31, 0xb3, 0xca, 0x56, 0x00, + 0x1b, 0x37, 0xa0, 0xa6, 0x65, 0xfe, 0xc0, 0xa3, 0xa5, 0xe6, 0xb1, 0xe5, + 0xf9, 0x3d, 0xdf, 0xe9, 0x07, 0xc6, 0xed, 0xe7, 0x3d, 0xff, 0x8c, 0x5c, + 0x68, 0x7d, 0x89, 0x43, 0x1d, 0x02, 0x3b, 0xfc, 0xba, 0x81, 0xd3, 0x74, + 0xad, 0xee, 0x12, 0x83, 0x54, 0x68, 0x38, 0x2f, 0xb8, 0x2a, 0xd1, 0x8a, + 0x45, 0xa1, 0xf9, 0x6b, 0x6c, 0x08, 0xfd, 0x83, 0x22, 0xd8, 0x17, 0x2c, + 0x5a, 0x48, 0x0a, 0x96, 0xc1, 0x49, 0x8d, 0x43, 0x43, 0x6b, 0x9d, 0x4d, + 0x3d, 0x42, 0xc1, 0xc1, 0xe1, 0xdb, 0x76, 0x17, 0xff, 0x3b, 0x38, 0x7e, + 0xfd, 0xba, 0x7b, 0x64, 0x55, 0xe1, 0x46, 0x5e, 0xb2, 0xaa, 0x00, 0x29, + 0xa4, 0xd4, 0xd6, 0x79, 0xcf, 0xf3, 0x3e, 0x0f, 0xd8, 0x07, 0x88, 0x30, + 0xa4, 0x8b, 0x1a, 0xd7, 0x66, 0xc9, 0x7a, 0x8f, 0xf1, 0x3a, 0x7e, 0x4a, + 0x3c, 0x91, 0x64, 0x05, 0xbf, 0x5b, 0x8a, 0x82, 0x97, 0x82, 0x01, 0xf1, + 0x62, 0xb6, 0xde, 0x9f, 0x2d, 0x93, 0xa4, 0x05, 0x10, 0x8e, 0x36, 0xb1, + 0x53, 0x9e, 0xaf, 0xd9, 0xd6, 0xf2, 0x1b, 0xae, 0x56, 0x65, 0x02, 0xd2, + 0xdf, 0xe0, 0xa6, 0x1d, 0xdf, 0xc0, 0x1c, 0x61, 0x9c, 0x8a, 0xec, 0xda, + 0x04, 0x52, 0xb4, 0x2c, 0x84, 0x46, 0xbc, 0x39, 0x13, 0x58, 0x6e, 0x34, + 0x02, 0x12, 0xfb, 0x9f, 0x1a, 0x50, 0x7c, 0xf1, 0xa2, 0x7f, 0xd6, 0x9b, + 0x9c, 0xda, 0xcc, 0x3f, 0x73, 0x3c, 0xe6, 0x4f, 0xd9, 0x27, 0xdb, 0x3e, + 0x67, 0x57, 0xd3, 0x0b, 0x97, 0x19, 0xdd, 0x06, 0x3d, 0xbf, 0xc7, 0xbc, + 0xde, 0xd0, 0x7e, 0xf1, 0xc2, 0xf2, 0xec, 0xbe, 0x6b, 0xfb, 0x01, 0xbc, + 0x0f, 0x06, 0x2f, 0xfe, 0xeb, 0xe3, 0x70, 0x60, 0x7f, 0x76, 0xf1, 0xff, + 0xff, 0xfe, 0x9f, 0x97, 0xe0, 0xd4, 0x5b, 0x6a, 0xb9, 0x9f, 0xc8, 0x39, + 0xa2, 0xa3, 0xe0, 0x29, 0x4f, 0x6f, 0xa0, 0x6b, 0x1c, 0xae, 0x95, 0x05, + 0xec, 0x3b, 0x93, 0xc0, 0xb5, 0xc7, 0xf6, 0xf8, 0x04, 0xa1, 0x30, 0xe8, + 0x5d, 0x79, 0xa0, 0x7f, 0x6b, 0xf5, 0xa7, 0xd3, 0x4f, 0x8e, 0x6d, 0x72, + 0x4c, 0xc3, 0xa4, 0x41, 0xb8, 0xe2, 0x4a, 0xa6, 0xbc, 0xde, 0xde, 0xd0, + 0x35, 0xcf, 0x88, 0x2c, 0x2a, 0x78, 0x2c, 0x4a, 0xab, 0xb8, 0x94, 0x14, + 0x15, 0x50, 0x53, 0xc8, 0x87, 0x35, 0x0b, 0x97, 0xb0, 0x72, 0x06, 0x80, + 0x19, 0xbc, 0xb3, 0x05, 0x0f, 0x63, 0x08, 0x62, 0x52, 0x29, 0x80, 0xb8, + 0x54, 0xd5, 0x87, 0xe5, 0xda, 0x97, 0xb6, 0xeb, 0xd9, 0x01, 0x52, 0xc6, + 0x2f, 0x57, 0x41, 0xef, 0xc2, 0x3f, 0xb3, 0x27, 0x00, 0x16, 0xc0, 0x35, + 0xdd, 0xe4, 0xbd, 0x5f, 0xf6, 0x3f, 0xdb, 0x27, 0xb4, 0xb5, 0x4f, 0x0b, + 0x55, 0x5e, 0x02, 0x50, 0xae, 0xad, 0x5e, 0xdf, 0x77, 0x2e, 0xed, 0xa0, + 0x0f, 0x0f, 0x05, 0x23, 0xfa, 0x35, 0x76, 0x26, 0x08, 0x74, 0x52, 0xec, + 0xe0, 0x5d, 0x17, 0xcc, 0x3d, 0x9b, 0xe0, 0x49, 0x80, 0xf8, 0xd5, 0x43, + 0x88, 0x12, 0x23, 0x0d, 0xe7, 0x31, 0xd3, 0x92, 0x21, 0x2d, 0xcf, 0x44, + 0x91, 0x32, 0xbe, 0x9f, 0x86, 0x22, 0x61, 0x33, 0xf8, 0xba, 0xe0, 0x73, + 0xa1, 0x74, 0x19, 0xb9, 0xe0, 0x79, 0xea, 0x78, 0x94, 0x4b, 0x6c, 0x24, + 0xb5, 0x11, 0xb8, 0x4e, 0x86, 0x8e, 0x3b, 0x6e, 0xb8, 0x72, 0x20, 0xb9, + 0x62, 0x99, 0xd4, 0x0c, 0xe9, 0x5b, 0xae, 0x2a, 0x62, 0x5c, 0x40, 0x31, + 0x67, 0x00, 0xc1, 0x60, 0x34, 0x13, 0x84, 0x51, 0x24, 0x97, 0x99, 0x2e, + 0x01, 0xb4, 0x49, 0x54, 0x86, 0xbd, 0x6b, 0xf4, 0x6f, 0x30, 0x35, 0x22, + 0xa6, 0x08, 0x72, 0xa6, 0xc4, 0xdc, 0xa4, 0x3e, 0x88, 0x7a, 0x2f, 0xf8, + 0x0a, 0x6c, 0xd7, 0x7a, 0x21, 0xb2, 0x79, 0x1b, 0x92, 0xfd, 0x7c, 0xe1, + 0xb8, 0x76, 0xe0, 0x39, 0xa7, 0x13, 0x78, 0xfa, 0xd2, 0xb1, 0x3f, 0x37, + 0x38, 0xf4, 0xc3, 0x08, 0x21, 0x1d, 0xde, 0x03, 0xa1, 0x90, 0x45, 0xb1, + 0x5c, 0x44, 0x7a, 0x59, 0x70, 0xcb, 0x9e, 0x98, 0x7b, 0xfb, 0xbd, 0xfe, + 0x99, 0x1d, 0xf4, 0x2e, 0x81, 0x33, 0xb7, 0x41, 0x35, 0x26, 0x1b, 0x40, + 0x19, 0x31, 0xab, 0x3c, 0x59, 0x9f, 0x9f, 0x4c, 0x7d, 0x67, 0x78, 0x15, + 0x90, 0x0d, 0x9a, 0xc7, 0x25, 0x72, 0x45, 0xcc, 0x35, 0xa8, 0x8e, 0x4d, + 0xa9, 0xa0, 0x02, 0x80, 0xb2, 0xb5, 0x58, 0xde, 0x50, 0x4e, 0xa3, 0xd0, + 0x10, 0x5a, 0x95, 0x99, 0x55, 0x28, 0xb5, 0xe4, 0xaa, 0x73, 0x70, 0xf4, + 0xa6, 0xe6, 0xf9, 0x1c, 0x16, 0x36, 0x97, 0x58, 0x5f, 0x56, 0xfc, 0x66, + 0x21, 0xe5, 0x2d, 0xe5, 0x98, 0x7e, 0x01, 0x6c, 0xe9, 0x50, 0xdd, 0xc2, + 0x22, 0xb0, 0xf1, 0x7d, 0x98, 0x90, 0x69, 0x60, 0x63, 0xe4, 0x28, 0x65, + 0xf9, 0x3d, 0xef, 0x53, 0xe0, 0x4c, 0xe0, 0xac, 0xcb, 0x1e, 0x49, 0x79, + 0x40, 0xde, 0xe1, 0x89, 0x00, 0x4e, 0x51, 0xb6, 0x53, 0x2e, 0x97, 0x9a, + 0x8e, 0x23, 0x38, 0x65, 0x16, 0x2b, 0x6b, 0x60, 0x13, 0x3a, 0xdc, 0xc0, + 0x77, 0xc6, 0x36, 0xca, 0x05, 0x08, 0xde, 0xe0, 0x36, 0x42, 0x01, 0xd5, + 0xc0, 0x52, 0xc6, 0x41, 0x43, 0xd9, 0x93, 0xe5, 0x6c, 0x66, 0xb2, 0x6b, + 0x36, 0x47, 0x9e, 0x04, 0xaa, 0x23, 0xd4, 0xf1, 0x8c, 0x27, 0x7b, 0xec, + 0x96, 0xf3, 0x9c, 0xca, 0x39, 0xcc, 0x2c, 0x4c, 0x36, 0xad, 0xea, 0x7a, + 0x2c, 0xb3, 0x1f, 0x34, 0xbb, 0xcd, 0x00, 0x8b, 0x15, 0xf5, 0x13, 0x66, + 0xb3, 0x8d, 0x80, 0x9e, 0x0c, 0x82, 0x93, 0x8b, 0xe1, 0x90, 0x2a, 0x94, + 0x4d, 0xaa, 0x1e, 0x10, 0x2c, 0x27, 0x14, 0x2c, 0xc8, 0x3a, 0x48, 0xd9, + 0x6b, 0x60, 0x93, 0x14, 0x23, 0x6f, 0x94, 0x0d, 0x87, 0x77, 0x71, 0xf2, + 0xff, 0x76, 0xdf, 0x37, 0xe5, 0xb6, 0x6e, 0x3e, 0x5e, 0xa9, 0xda, 0x63, + 0x65, 0xe1, 0xa6, 0x12, 0x97, 0x1a, 0x57, 0xa8, 0x54, 0xe7, 0xed, 0x39, + 0xfd, 0x26, 0x37, 0x1c, 0xbf, 0x79, 0xf7, 0x16, 0x7b, 0x3f, 0xff, 0x5c, + 0x6d, 0xdc, 0xdd, 0x99, 0xd5, 0xc3, 0x37, 0x75, 0xa6, 0xad, 0xd9, 0xcc, + 0x0a, 0x99, 0x02, 0xb3, 0x31, 0xb2, 0xa7, 0xb2, 0x86, 0xee, 0x74, 0xfc, + 0xb8, 0x07, 0xc5, 0x37, 0x41, 0x6c, 0xa0, 0x9d, 0x87, 0x4a, 0xad, 0x64, + 0x11, 0xd7, 0xb9, 0x78, 0x93, 0x87, 0xa9, 0x2e, 0x48, 0x4a, 0x07, 0x5f, + 0xdb, 0xb0, 0xda, 0x68, 0x97, 0x08, 0xf9, 0x7a, 0xbf, 0x3f, 0x72, 0x80, + 0x80, 0xc0, 0x31, 0x5c, 0xaa, 0x8f, 0x32, 0xfb, 0x95, 0x2d, 0xcb, 0xf4, + 0xdc, 0x44, 0x71, 0x0d, 0xb4, 0x30, 0x17, 0xed, 0x06, 0xd8, 0x48, 0x3e, + 0x8b, 0x50, 0x54, 0xf5, 0x25, 0x3b, 0xf0, 0x68, 0xf2, 0x64, 0xc7, 0x08, + 0xd1, 0xa1, 0x7f, 0x64, 0x21, 0xfe, 0xc0, 0x2d, 0x7f, 0xfa, 0xc9, 0x9e, + 0x7c, 0x23, 0x51, 0x14, 0xc1, 0x36, 0x81, 0x96, 0xb7, 0x3c, 0xb3, 0x4c, + 0x4b, 0xa1, 0x59, 0x94, 0x08, 0x64, 0x3e, 0x26, 0xe2, 0xb2, 0xcc, 0x72, + 0x84, 0xbb, 0x36, 0xa6, 0xc4, 0x7e, 0xcd, 0x0e, 0x88, 0x53, 0x12, 0x85, + 0x3e, 0xa6, 0xd2, 0x2c, 0x51, 0xa4, 0x15, 0x1a, 0x05, 0x39, 0x2f, 0x4b, + 0x7f, 0x07, 0x29, 0xf4, 0xf7, 0x3c, 0xd2, 0x1b, 0xf3, 0x98, 0x9d, 0x7f, + 0xd9, 0x3c, 0xab, 0xd5, 0xaa, 0x62, 0x05, 0x43, 0x29, 0x73, 0x91, 0xd1, + 0x81, 0xec, 0x24, 0xb2, 0x99, 0x6c, 0x73, 0x83, 0xaf, 0x6f, 0x3e, 0x0e, + 0x29, 0xa9, 0x79, 0xd8, 0x65, 0xe2, 0x2a, 0xb5, 0x6d, 0x29, 0x25, 0x4b, + 0x93, 0x1d, 0x1a, 0x2e, 0x3b, 0x6d, 0xfc, 0x2c, 0x55, 0x65, 0xe2, 0xca, + 0x24, 0x77, 0x77, 0xff, 0xb4, 0x39, 0x90, 0x96, 0x0d, 0xf8, 0xd9, 0x5f, + 0xff, 0xf2, 0xa7, 0xbf, 0xfd, 0xf1, 0xcf, 0x54, 0x32, 0x77, 0x60, 0xa4, + 0x08, 0xf3, 0x45, 0x15, 0x18, 0x95, 0x04, 0xed, 0x6e, 0x03, 0x22, 0xef, + 0xd9, 0x4e, 0x90, 0xec, 0xa4, 0x2a, 0x25, 0x07, 0x05, 0xcf, 0x22, 0x02, + 0xc6, 0x8a, 0x8b, 0x1b, 0xb9, 0xcb, 0x6a, 0xc0, 0x41, 0xd6, 0xd6, 0x35, + 0x7d, 0x34, 0x17, 0xfb, 0x37, 0x35, 0xd0, 0x0e, 0x7f, 0x03, 0x9e, 0xcf, + 0x93, 0x6e, 0x81, 0xb4, 0xb2, 0xa0, 0x5e, 0x09, 0xad, 0x77, 0x25, 0xb6, + 0x7f, 0xc0, 0x8c, 0xbb, 0x3c, 0x8f, 0x18, 0xac, 0x58, 0x3f, 0x5a, 0xe1, + 0x37, 0x84, 0xff, 0x15, 0x9a, 0x5d, 0x52, 0x1b, 0xdb, 0xfd, 0x27, 0x64, + 0x36, 0x8c, 0x1b, 0x7e, 0xfb, 0x06, 0x91, 0xbf, 0x26, 0xd9, 0x96, 0x38, + 0xa2, 0x8a, 0xbb, 0xd5, 0x09, 0xf3, 0x14, 0x33, 0x57, 0xd9, 0x70, 0x22, + 0xaf, 0xe3, 0x87, 0x2c, 0x57, 0xcd, 0xc9, 0x27, 0xa3, 0x5b, 0x75, 0xd8, + 0xea, 0x0d, 0x7a, 0xe7, 0xbe, 0xc9, 0xa8, 0xe5, 0x4a, 0xdd, 0x7f, 0x56, + 0xfb, 0x55, 0x53, 0x7b, 0xda, 0xdf, 0xaa, 0x80, 0x55, 0x49, 0xdb, 0xe2, + 0x78, 0xd4, 0xb5, 0x1a, 0xb5, 0xf0, 0xa8, 0x5b, 0x33, 0x2a, 0x65, 0x31, + 0xb9, 0xaa, 0x29, 0x0b, 0x18, 0x64, 0xc8, 0x41, 0xa6, 0x79, 0x43, 0x07, + 0xbd, 0x29, 0x03, 0xef, 0x99, 0x21, 0x38, 0x66, 0xad, 0xe3, 0xa3, 0xee, + 0xeb, 0x1f, 0x5b, 0x58, 0xa8, 0xa9, 0xb0, 0xf6, 0xd8, 0xa3, 0x1f, 0x1c, + 0x1c, 0x1e, 0x1c, 0xb4, 0xaa, 0x8a, 0x62, 0x7a, 0x36, 0xa5, 0xc0, 0x6c, + 0xb7, 0x3d, 0x28, 0x8f, 0x3c, 0xda, 0xa5, 0x34, 0x4b, 0x35, 0x36, 0xec, + 0xb2, 0x09, 0x1a, 0x84, 0x4b, 0x67, 0x60, 0x8c, 0x62, 0x32, 0xd0, 0x7b, + 0x76, 0x5e, 0xc8, 0x7b, 0x41, 0x1d, 0xa6, 0x69, 0xdf, 0xe6, 0x4c, 0xe6, + 0x24, 0xb9, 0x2a, 0x85, 0x03, 0xcd, 0xb1, 0xe9, 0xc8, 0x16, 0xe1, 0x3d, + 0x15, 0xab, 0x75, 0x7d, 0x6a, 0xcd, 0x69, 0xa0, 0x26, 0x16, 0xa8, 0x84, + 0xa5, 0x7c, 0x8f, 0xf3, 0x10, 0x26, 0x85, 0xf6, 0xbc, 0x8d, 0x39, 0x81, + 0x7a, 0xfa, 0x6a, 0x57, 0xb5, 0x1e, 0xf5, 0xaf, 0x78, 0x24, 0xe2, 0x96, + 0x97, 0x4b, 0x55, 0xd5, 0x35, 0x96, 0xda, 0x63, 0xb9, 0x94, 0x89, 0x07, + 0xf8, 0xec, 0x6d, 0x2a, 0x63, 0xcd, 0xf0, 0xd1, 0x46, 0x47, 0xaf, 0xdf, + 0xfe, 0xb8, 0x77, 0xd0, 0xed, 0xee, 0x85, 0x18, 0xc6, 0x1e, 0x04, 0x37, + 0xc6, 0x24, 0xbd, 0x8f, 0xd1, 0x5f, 0xef, 0xe3, 0xef, 0x7e, 0x5c, 0x50, + 0xb7, 0xd2, 0x31, 0x8b, 0x2c, 0x56, 0x59, 0x7d, 0x2b, 0xda, 0x51, 0xf4, + 0x7c, 0x35, 0x47, 0x9a, 0x7b, 0x8e, 0xeb, 0x6b, 0x3e, 0xd6, 0xc2, 0x06, + 0xda, 0xcc, 0x37, 0x1b, 0x6b, 0x95, 0xbd, 0xea, 0x69, 0x3d, 0xa6, 0xd4, + 0x2a, 0xe1, 0x4e, 0xaf, 0xd2, 0x3d, 0x42, 0x5b, 0x25, 0x78, 0xd9, 0x98, + 0x57, 0x7d, 0x7f, 0xd5, 0xee, 0x8b, 0x80, 0xf4, 0x0c, 0xca, 0xfe, 0x0d, + 0x14, 0x4e, 0xd9, 0xd0, 0xa0, 0x16, 0x6c, 0x0c, 0x07, 0xd8, 0x99, 0xe8, + 0xa8, 0x10, 0xd9, 0xf0, 0x5b, 0x15, 0xa3, 0x25, 0x43, 0x84, 0xe5, 0x85, + 0x6b, 0x37, 0xda, 0x28, 0x3b, 0x33, 0x63, 0xbd, 0xa2, 0xca, 0x69, 0xee, + 0xdf, 0xa2, 0xa5, 0xb9, 0xb9, 0xee, 0x0f, 0xa9, 0x99, 0x2f, 0xb9, 0x80, + 0xdc, 0x6c, 0x3c, 0x8a, 0x8e, 0x00, 0xa0, 0x96, 0x6e, 0x13, 0x05, 0x5b, + 0x4c, 0xde, 0x1d, 0xfd, 0x6f, 0xb7, 0x6b, 0x9d, 0xf6, 0x37, 0xcd, 0xa0, + 0xe9, 0xf1, 0xc0, 0xa4, 0xdc, 0x78, 0xe4, 0x92, 0x88, 0x19, 0x37, 0x7c, + 0x76, 0x90, 0x7b, 0xb6, 0xe7, 0xd1, 0x50, 0x32, 0x72, 0x86, 0xf6, 0x53, + 0xfa, 0x8d, 0x0d, 0x62, 0x60, 0x4c, 0x2d, 0xd8, 0x6c, 0x99, 0x45, 0x7b, + 0x1b, 0x9c, 0xab, 0x45, 0x78, 0x40, 0xe8, 0xc6, 0xdf, 0xc3, 0x37, 0x47, + 0x15, 0xbc, 0xe3, 0x37, 0xad, 0xe6, 0x1d, 0x74, 0x66, 0x73, 0x85, 0x33, + 0x08, 0xce, 0x7a, 0xde, 0xd9, 0xf0, 0x62, 0xd2, 0xc7, 0x25, 0x66, 0xeb, + 0x51, 0x46, 0x73, 0x01, 0x46, 0xfc, 0x2d, 0x11, 0xc9, 0x11, 0x05, 0x42, + 0x18, 0xfd, 0x5a, 0x09, 0x8d, 0xa7, 0xbc, 0xcc, 0xb4, 0x88, 0x30, 0xac, + 0xda, 0x7e, 0x0a, 0x43, 0x9f, 0x46, 0xfc, 0x24, 0x8c, 0x38, 0xcd, 0x12, + 0xd5, 0xba, 0x81, 0xc6, 0xe3, 0x8c, 0x5c, 0x22, 0xba, 0x94, 0xf8, 0x4e, + 0x64, 0x62, 0xf9, 0x24, 0x20, 0xab, 0x7d, 0x5c, 0xe6, 0x5e, 0x3a, 0x7d, + 0xb2, 0x48, 0xd5, 0x79, 0xd6, 0xe3, 0xcc, 0xa9, 0xfb, 0x64, 0xa4, 0xb0, + 0xbe, 0xa0, 0x7d, 0x2a, 0x9f, 0x9d, 0xaa, 0x77, 0x83, 0x46, 0x42, 0xa8, + 0xba, 0xa2, 0x66, 0x46, 0xa0, 0x34, 0x64, 0x6c, 0x87, 0x46, 0xb5, 0x94, + 0xa3, 0x7e, 0x63, 0x78, 0x22, 0x4a, 0x4d, 0x5b, 0x0e, 0x4b, 0x80, 0x52, + 0x9a, 0x86, 0xa4, 0x98, 0xe2, 0x79, 0x68, 0x1e, 0x79, 0x52, 0x9c, 0x14, + 0x39, 0x90, 0x46, 0xaf, 0x45, 0xaa, 0x0e, 0x9d, 0x8a, 0x6c, 0xcf, 0xc4, + 0x7d, 0xcb, 0xaa, 0x66, 0xfd, 0x6a, 0xf5, 0xdf, 0xd9, 0xe4, 0x3f, 0xe9, + 0xef, 0xbb, 0x06, 0x37, 0xb5, 0xe2, 0x7e, 0x01, 0x37, 0x90, 0x9a, 0x03, + 0x7e, 0xb3, 0x9c, 0xd3, 0x0f, 0x07, 0x1d, 0x16, 0xfd, 0xfd, 0x1c, 0x16, + 0x46, 0x7f, 0xbb, 0x28, 0x64, 0x41, 0x3f, 0xfa, 0x85, 0xa0, 0xa9, 0xfa, + 0x69, 0x6a, 0x2c, 0x39, 0x58, 0x23, 0x8c, 0x50, 0x94, 0xde, 0xcd, 0xa7, + 0x55, 0xa7, 0xf8, 0xda, 0x36, 0x46, 0xf5, 0x72, 0xde, 0x24, 0x37, 0xb4, + 0xab, 0xf5, 0xeb, 0x0d, 0xd9, 0x86, 0xc2, 0x58, 0xe3, 0xe9, 0x71, 0x5a, + 0x6c, 0x9c, 0xa5, 0xa7, 0xa7, 0x3a, 0x3f, 0x60, 0xbb, 0x7c, 0xf7, 0xc0, + 0x0f, 0x03, 0x2d, 0x7a, 0x2b, 0x32, 0x81, 0xad, 0xe8, 0x29, 0x40, 0xa6, + 0xf0, 0x40, 0x4c, 0xa7, 0x58, 0x21, 0x35, 0x7e, 0xbf, 0x54, 0xa8, 0xf7, + 0x91, 0x31, 0xe8, 0x4c, 0xd2, 0x9c, 0x0c, 0xc8, 0xd6, 0x49, 0xfb, 0xd5, + 0xd7, 0x09, 0x60, 0x34, 0x3d, 0x0d, 0xdc, 0xa9, 0xdf, 0xf3, 0x1b, 0x91, + 0x3f, 0x0e, 0x1f, 0x10, 0xaf, 0x19, 0xd2, 0xd5, 0xd2, 0x3c, 0x72, 0x80, + 0x95, 0x02, 0x17, 0x38, 0x98, 0xe4, 0xdc, 0xe2, 0x61, 0xcc, 0x0d, 0x83, + 0x8f, 0x7b, 0xbf, 0x04, 0xf4, 0x46, 0xe8, 0xd5, 0x2e, 0x30, 0x4e, 0x20, + 0x46, 0x0a, 0x99, 0x1a, 0x81, 0x26, 0x66, 0xfa, 0x39, 0x3e, 0x87, 0xef, + 0x50, 0x4e, 0xc2, 0x0c, 0x0c, 0xd9, 0x4f, 0x3f, 0xe1, 0x6b, 0x8f, 0x21, + 0x9e, 0xc7, 0x27, 0x86, 0xaf, 0xe7, 0xfc, 0x0e, 0x19, 0xea, 0xcc, 0x19, + 0x9a, 0x07, 0xcb, 0x77, 0x26, 0x60, 0xe7, 0x29, 0xf5, 0x7b, 0xa4, 0x75, + 0x8c, 0xce, 0x7a, 0xfd, 0xb5, 0x5e, 0x03, 0x8c, 0xcf, 0x57, 0x5f, 0x69, + 0x66, 0x3f, 0xe4, 0x02, 0x15, 0xc5, 0x3c, 0xdb, 0x90, 0x38, 0xc4, 0x80, + 0x64, 0x79, 0x19, 0xf3, 0x84, 0xd3, 0xc3, 0xc1, 0x8c, 0xde, 0x13, 0x52, + 0x88, 0x4d, 0x27, 0xb6, 0xcd, 0xf5, 0xd6, 0x08, 0xb3, 0x79, 0xdc, 0x69, + 0x20, 0x20, 0xdb, 0xe5, 0xfe, 0xac, 0xe1, 0x4f, 0x7a, 0xc2, 0xa9, 0xaa, + 0x7e, 0x59, 0xf2, 0xe9, 0xed, 0xa3, 0x7c, 0xe9, 0xae, 0x0c, 0x92, 0x22, + 0x05, 0x85, 0x73, 0xbe, 0x23, 0xb9, 0xbb, 0x36, 0x8a, 0xcb, 0x04, 0x03, + 0x69, 0x80, 0x94, 0x33, 0xf6, 0x9a, 0xaf, 0xac, 0x3e, 0xe8, 0x11, 0x87, + 0xc5, 0x86, 0xf7, 0x6a, 0xc1, 0xb3, 0x66, 0x7b, 0x01, 0x26, 0x09, 0xae, + 0x7b, 0x8e, 0x6b, 0xb3, 0x5c, 0x54, 0x21, 0xa3, 0xa3, 0x9c, 0xc2, 0x61, + 0x99, 0x89, 0x87, 0x32, 0x2f, 0x2c, 0xe3, 0xfc, 0x49, 0x4c, 0xd0, 0x91, + 0xe6, 0xdb, 0x35, 0xbe, 0xc1, 0xe0, 0xac, 0xd9, 0xcd, 0xd4, 0xaf, 0xcf, + 0x9b, 0x57, 0x3d, 0x93, 0x66, 0x9e, 0xd8, 0x89, 0x16, 0xb7, 0xec, 0xf4, + 0xdc, 0x64, 0xbe, 0x2d, 0xc2, 0x40, 0x84, 0xf3, 0x0c, 0x17, 0x8a, 0xa8, + 0x36, 0x5e, 0x39, 0x54, 0x9b, 0x34, 0xd9, 0x6a, 0x4c, 0xf1, 0xcf, 0x1e, + 0x7c, 0x32, 0xd6, 0x6f, 0x4f, 0xe9, 0xdf, 0x3e, 0x89, 0x97, 0x1e, 0xe6, + 0xd4, 0x51, 0x20, 0xff, 0x45, 0x61, 0xc6, 0x6e, 0x48, 0x4d, 0x4e, 0xe6, + 0x43, 0x93, 0xc4, 0xab, 0x9c, 0xf8, 0xa5, 0x75, 0xf0, 0xb1, 0xf1, 0x10, + 0xdd, 0xda, 0x6b, 0x1d, 0x6e, 0x7d, 0x5f, 0x93, 0x5f, 0x6c, 0x7a, 0x2a, + 0xf1, 0x9a, 0xa6, 0xdb, 0xe4, 0xe5, 0xa7, 0xe6, 0x7b, 0x7c, 0x14, 0x6e, + 0x98, 0x70, 0xfb, 0x75, 0x98, 0x6d, 0x3d, 0xd4, 0x5a, 0x03, 0x97, 0xb8, + 0x97, 0x07, 0x4f, 0x40, 0x19, 0xd3, 0x7f, 0x73, 0x79, 0x90, 0x45, 0x5a, + 0x4a, 0x78, 0x6c, 0x1e, 0x7a, 0x8f, 0xe9, 0x9f, 0x8f, 0x9b, 0xff, 0x02, + 0x61, 0xd2, 0xcf, 0xff, 0x21, 0x3b, 0x17, 0xe8, 0x24, 0x3e, 0x2c, 0xf5, + 0xec, 0x9d, 0x45, 0xe0, 0x21, 0x26, 0x7f, 0x0f, 0x00, 0x00, 0xff, 0xff, + 0xc9, 0x2e, 0x07, 0x65, 0xc7, 0x19, 0x00, 0x00, }, "conf/app.ini", ) diff --git a/modules/setting/setting.go b/modules/setting/setting.go index cb7734bb..f03aa8ae 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -47,12 +47,12 @@ var ( StaticRootPath string // Security settings. - InstallLock bool - SecretKey string - LogInRememberDays int - CookieUserName string - CookieRememberName string - ReverseProxyAuthUid string + InstallLock bool + SecretKey string + LogInRememberDays int + CookieUserName string + CookieRememberName string + ReverseProxyAuthUser string // Webhook settings. WebhookTaskInterval int @@ -164,7 +164,7 @@ func NewConfigContext() { LogInRememberDays = Cfg.MustInt("security", "LOGIN_REMEMBER_DAYS") CookieUserName = Cfg.MustValue("security", "COOKIE_USERNAME") CookieRememberName = Cfg.MustValue("security", "COOKIE_REMEMBER_NAME") - ReverseProxyAuthUid = Cfg.MustValue("security", "REVERSE_PROXY_AUTHENTICATION_UID", "X-WEBAUTH-UID") + ReverseProxyAuthUser = Cfg.MustValue("security", "REVERSE_PROXY_AUTHENTICATION_USER", "X-WEBAUTH-USER") RunUser = Cfg.MustValue("", "RUN_USER") curUser := os.Getenv("USER") diff --git a/routers/admin/admin.go b/routers/admin/admin.go index 140e1e9f..50a3823a 100644 --- a/routers/admin/admin.go +++ b/routers/admin/admin.go @@ -206,7 +206,7 @@ func Config(ctx *middleware.Context) { ctx.Data["StaticRootPath"] = setting.StaticRootPath ctx.Data["LogRootPath"] = setting.LogRootPath ctx.Data["ScriptType"] = setting.ScriptType - ctx.Data["ReverseProxyAuthUid"] = setting.ReverseProxyAuthUid + ctx.Data["ReverseProxyAuthUser"] = setting.ReverseProxyAuthUser ctx.Data["Service"] = setting.Service diff --git a/templates/VERSION b/templates/VERSION index ca3b3f1b..8c2be60b 100644 --- a/templates/VERSION +++ b/templates/VERSION @@ -1 +1 @@ -0.4.5.0623 Alpha \ No newline at end of file +0.4.5.0624 Alpha \ No newline at end of file diff --git a/templates/admin/config.tmpl b/templates/admin/config.tmpl index 22be5900..10a53b53 100644 --- a/templates/admin/config.tmpl +++ b/templates/admin/config.tmpl @@ -36,8 +36,8 @@
{{.LogRootPath}}
Script Type
{{.ScriptType}}
-
Reverse Authentication UID
-
{{.ReverseProxyAuthUid}}
+
Reverse Authentication User
+
{{.ReverseProxyAuthUser}}
-- cgit v1.2.3