mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	Fix #242
This commit is contained in:
		@@ -66,6 +66,12 @@ ENABLE_CACHE_AVATAR = false
 | 
				
			|||||||
; Mail notification
 | 
					; Mail notification
 | 
				
			||||||
ENABLE_NOTIFY_MAIL = false
 | 
					ENABLE_NOTIFY_MAIL = false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[webhook]
 | 
				
			||||||
 | 
					; Cron task interval in minutes
 | 
				
			||||||
 | 
					TASK_INTERVAL = 1
 | 
				
			||||||
 | 
					; Deliver timeout in seconds
 | 
				
			||||||
 | 
					DELIVER_TIMEOUT = 5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[mailer]
 | 
					[mailer]
 | 
				
			||||||
ENABLED = false
 | 
					ENABLED = false
 | 
				
			||||||
; Buffer length of channel, keep it as it is if you don't know what it is.
 | 
					; Buffer length of channel, keep it as it is if you don't know what it is.
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								gogs.go
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								gogs.go
									
									
									
									
									
								
							@@ -17,7 +17,7 @@ import (
 | 
				
			|||||||
	"github.com/gogits/gogs/modules/setting"
 | 
						"github.com/gogits/gogs/modules/setting"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const APP_VER = "0.4.2.0605 Alpha"
 | 
					const APP_VER = "0.4.2.0608 Alpha"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func init() {
 | 
					func init() {
 | 
				
			||||||
	runtime.GOMAXPROCS(runtime.NumCPU())
 | 
						runtime.GOMAXPROCS(runtime.NumCPU())
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,6 @@ import (
 | 
				
			|||||||
	qlog "github.com/qiniu/log"
 | 
						qlog "github.com/qiniu/log"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/gogits/gogs/modules/base"
 | 
						"github.com/gogits/gogs/modules/base"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/hooks"
 | 
					 | 
				
			||||||
	"github.com/gogits/gogs/modules/log"
 | 
						"github.com/gogits/gogs/modules/log"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/setting"
 | 
						"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)
 | 
						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 {
 | 
						for i, cmt := range commit.Commits {
 | 
				
			||||||
		commits[i] = &hooks.PayloadCommit{
 | 
							commits[i] = &PayloadCommit{
 | 
				
			||||||
			Id:      cmt.Sha1,
 | 
								Id:      cmt.Sha1,
 | 
				
			||||||
			Message: cmt.Message,
 | 
								Message: cmt.Message,
 | 
				
			||||||
			Url:     fmt.Sprintf("%s/commit/%s", repoLink, cmt.Sha1),
 | 
								Url:     fmt.Sprintf("%s/commit/%s", repoLink, cmt.Sha1),
 | 
				
			||||||
			Author: &hooks.PayloadAuthor{
 | 
								Author: &PayloadAuthor{
 | 
				
			||||||
				Name:  cmt.AuthorName,
 | 
									Name:  cmt.AuthorName,
 | 
				
			||||||
				Email: cmt.AuthorEmail,
 | 
									Email: cmt.AuthorEmail,
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	p := &hooks.Payload{
 | 
						p := &Payload{
 | 
				
			||||||
		Ref:     refFullName,
 | 
							Ref:     refFullName,
 | 
				
			||||||
		Commits: commits,
 | 
							Commits: commits,
 | 
				
			||||||
		Repo: &hooks.PayloadRepo{
 | 
							Repo: &PayloadRepo{
 | 
				
			||||||
			Id:          repo.Id,
 | 
								Id:          repo.Id,
 | 
				
			||||||
			Name:        repo.LowerName,
 | 
								Name:        repo.LowerName,
 | 
				
			||||||
			Url:         repoLink,
 | 
								Url:         repoLink,
 | 
				
			||||||
			Description: repo.Description,
 | 
								Description: repo.Description,
 | 
				
			||||||
			Website:     repo.Website,
 | 
								Website:     repo.Website,
 | 
				
			||||||
			Watchers:    repo.NumWatches,
 | 
								Watchers:    repo.NumWatches,
 | 
				
			||||||
			Owner: &hooks.PayloadAuthor{
 | 
								Owner: &PayloadAuthor{
 | 
				
			||||||
				Name:  repoUserName,
 | 
									Name:  repoUserName,
 | 
				
			||||||
				Email: actEmail,
 | 
									Email: actEmail,
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			Private: repo.IsPrivate,
 | 
								Private: repo.IsPrivate,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		Pusher: &hooks.PayloadAuthor{
 | 
							Pusher: &PayloadAuthor{
 | 
				
			||||||
			Name:  repo.Owner.LowerName,
 | 
								Name:  repo.Owner.LowerName,
 | 
				
			||||||
			Email: repo.Owner.Email,
 | 
								Email: repo.Owner.Email,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
@@ -172,7 +171,13 @@ func CommitRepoAction(userId, repoUserId int64, userName, actEmail string,
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		p.Secret = w.Secret
 | 
							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
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,7 +35,7 @@ func init() {
 | 
				
			|||||||
	tables = append(tables, new(User), new(PublicKey), new(Repository), new(Watch),
 | 
						tables = append(tables, new(User), new(PublicKey), new(Repository), new(Watch),
 | 
				
			||||||
		new(Action), new(Access), new(Issue), new(Comment), new(Oauth2), new(Follow),
 | 
							new(Action), new(Access), new(Issue), new(Comment), new(Oauth2), new(Follow),
 | 
				
			||||||
		new(Mirror), new(Release), new(LoginSource), new(Webhook), new(IssueUser),
 | 
							new(Mirror), new(Release), new(LoginSource), new(Webhook), new(IssueUser),
 | 
				
			||||||
		new(Milestone), new(Label))
 | 
							new(Milestone), new(Label), new(HookTask))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func LoadModelsConfig() {
 | 
					func LoadModelsConfig() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,29 +7,35 @@ package models
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"encoding/json"
 | 
						"encoding/json"
 | 
				
			||||||
	"errors"
 | 
						"errors"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/gogits/gogs/modules/httplib"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/log"
 | 
						"github.com/gogits/gogs/modules/log"
 | 
				
			||||||
 | 
						"github.com/gogits/gogs/modules/setting"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
	ErrWebhookNotExist = errors.New("Webhook does not exist")
 | 
						ErrWebhookNotExist = errors.New("Webhook does not exist")
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Content types.
 | 
					type HookContentType int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
	CT_JSON = iota + 1
 | 
						JSON HookContentType = iota + 1
 | 
				
			||||||
	CT_FORM
 | 
						FORM
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// HookEvent represents events that will delivery hook.
 | 
				
			||||||
type HookEvent struct {
 | 
					type HookEvent struct {
 | 
				
			||||||
	PushOnly bool `json:"push_only"`
 | 
						PushOnly bool `json:"push_only"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Webhook represents a web hook object.
 | 
				
			||||||
type Webhook struct {
 | 
					type Webhook struct {
 | 
				
			||||||
	Id          int64
 | 
						Id          int64
 | 
				
			||||||
	RepoId      int64
 | 
						RepoId      int64
 | 
				
			||||||
	Url         string `xorm:"TEXT"`
 | 
						Url         string `xorm:"TEXT"`
 | 
				
			||||||
	ContentType int
 | 
						ContentType HookContentType
 | 
				
			||||||
	Secret      string `xorm:"TEXT"`
 | 
						Secret      string `xorm:"TEXT"`
 | 
				
			||||||
	Events      string `xorm:"TEXT"`
 | 
						Events      string `xorm:"TEXT"`
 | 
				
			||||||
	*HookEvent  `xorm:"-"`
 | 
						*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)
 | 
						data, err := json.Marshal(w.HookEvent)
 | 
				
			||||||
	w.Events = string(data)
 | 
						w.Events = string(data)
 | 
				
			||||||
	return err
 | 
						return err
 | 
				
			||||||
@@ -57,18 +63,12 @@ func (w *Webhook) HasPushEvent() bool {
 | 
				
			|||||||
	return false
 | 
						return false
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// CreateWebhook creates new webhook.
 | 
					// CreateWebhook creates a new web hook.
 | 
				
			||||||
func CreateWebhook(w *Webhook) error {
 | 
					func CreateWebhook(w *Webhook) error {
 | 
				
			||||||
	_, err := orm.Insert(w)
 | 
						_, err := orm.Insert(w)
 | 
				
			||||||
	return err
 | 
						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.
 | 
					// GetWebhookById returns webhook by given ID.
 | 
				
			||||||
func GetWebhookById(hookId int64) (*Webhook, error) {
 | 
					func GetWebhookById(hookId int64) (*Webhook, error) {
 | 
				
			||||||
	w := &Webhook{Id: hookId}
 | 
						w := &Webhook{Id: hookId}
 | 
				
			||||||
@@ -93,8 +93,114 @@ func GetWebhooksByRepoId(repoId int64) (ws []*Webhook, err error) {
 | 
				
			|||||||
	return ws, err
 | 
						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.
 | 
					// DeleteWebhook deletes webhook of repository.
 | 
				
			||||||
func DeleteWebhook(hookId int64) error {
 | 
					func DeleteWebhook(hookId int64) error {
 | 
				
			||||||
	_, err := orm.Delete(&Webhook{Id: hookId})
 | 
						_, err := orm.Delete(&Webhook{Id: hookId})
 | 
				
			||||||
	return err
 | 
						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
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,224 +29,229 @@ func conf_app_ini() ([]byte, error) {
 | 
				
			|||||||
	return bindata_read([]byte{
 | 
						return bindata_read([]byte{
 | 
				
			||||||
		0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x00, 0xff, 0xb4, 0x58,
 | 
							0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x00, 0xff, 0xb4, 0x58,
 | 
				
			||||||
		0xed, 0x72, 0xdb, 0xb8, 0xd5, 0xfe, 0xcf, 0xab, 0x40, 0xf4, 0xee, 0xbe,
 | 
							0xed, 0x72, 0xdb, 0xb8, 0xd5, 0xfe, 0xcf, 0xab, 0x40, 0xf4, 0xee, 0xbe,
 | 
				
			||||||
		0x9b, 0x74, 0x6c, 0x49, 0x76, 0x1a, 0x27, 0x6b, 0x6f, 0x66, 0x56, 0x96,
 | 
							0x9b, 0x74, 0x6c, 0x49, 0x76, 0x1a, 0x27, 0x6b, 0x6f, 0x66, 0x96, 0x96,
 | 
				
			||||||
		0x28, 0x9b, 0x8d, 0xf5, 0x11, 0x92, 0x76, 0x9a, 0x66, 0x3c, 0x1c, 0x9a,
 | 
							0x28, 0x9b, 0x8d, 0x25, 0x39, 0x24, 0xed, 0x34, 0xcd, 0x78, 0x38, 0x34,
 | 
				
			||||||
		0x84, 0x24, 0xd4, 0x24, 0x41, 0x13, 0x90, 0x15, 0xf5, 0x5f, 0x6f, 0xa1,
 | 
							0x09, 0x49, 0xa8, 0x49, 0x82, 0x26, 0x20, 0x2b, 0xea, 0xbf, 0xde, 0x42,
 | 
				
			||||||
		0xd3, 0xab, 0xe9, 0xf5, 0xf4, 0x47, 0x2f, 0xa3, 0xcf, 0x01, 0x49, 0x99,
 | 
							0xa7, 0x57, 0xd3, 0xeb, 0xe9, 0x8f, 0x5e, 0x46, 0x9f, 0x03, 0x92, 0x32,
 | 
				
			||||||
		0x52, 0xb4, 0xd9, 0xf4, 0x6b, 0x76, 0x27, 0x16, 0x81, 0x83, 0x83, 0x73,
 | 
							0xe5, 0x68, 0xb3, 0xe9, 0xd7, 0xec, 0x4e, 0x2c, 0x02, 0x07, 0x07, 0xe7,
 | 
				
			||||||
		0x9e, 0xf3, 0x8d, 0x33, 0xd6, 0xcb, 0x73, 0x96, 0x85, 0x29, 0x67, 0x7a,
 | 
							0x3c, 0xe7, 0x1b, 0x27, 0xcc, 0x2e, 0x0a, 0x96, 0x47, 0x19, 0x67, 0x7a,
 | 
				
			||||||
		0x11, 0x6a, 0xa6, 0x16, 0x72, 0xa5, 0x98, 0xcc, 0x18, 0x7f, 0xe4, 0xc5,
 | 
							0x11, 0x69, 0xa6, 0x16, 0x72, 0xa5, 0x98, 0xcc, 0x19, 0x7f, 0xe0, 0xe5,
 | 
				
			||||||
		0x9a, 0xe5, 0xe1, 0x1c, 0x1b, 0x42, 0x27, 0xdc, 0xea, 0x4d, 0xa7, 0xc1,
 | 
							0x9a, 0x15, 0xd1, 0x1c, 0x1b, 0x42, 0xa7, 0xdc, 0xb2, 0x2f, 0x2f, 0xc3,
 | 
				
			||||||
		0xb8, 0x37, 0xb2, 0xd9, 0x5b, 0x76, 0x21, 0xe7, 0xea, 0x14, 0xff, 0xb2,
 | 
							0x89, 0x3d, 0x76, 0xd8, 0x5b, 0x76, 0x26, 0xe7, 0xea, 0x18, 0xff, 0xb2,
 | 
				
			||||||
		0x0b, 0xa1, 0x99, 0xc7, 0x8b, 0x47, 0x11, 0x95, 0xfb, 0x57, 0x93, 0x8b,
 | 
							0x33, 0xa1, 0x99, 0xcf, 0xcb, 0x07, 0x11, 0x57, 0xfb, 0x17, 0xd3, 0xb3,
 | 
				
			||||||
		0x09, 0xf6, 0x45, 0x3a, 0xef, 0xcc, 0x42, 0xac, 0xca, 0xac, 0x9d, 0x67,
 | 
							0x29, 0xf6, 0x45, 0x36, 0xef, 0xcd, 0x22, 0xac, 0xca, 0xbc, 0x5b, 0xe4,
 | 
				
			||||||
		0x73, 0xeb, 0x8c, 0xf5, 0x17, 0x61, 0x06, 0x4e, 0x20, 0x17, 0x33, 0xb6,
 | 
							0x73, 0xeb, 0x84, 0x0d, 0x16, 0x51, 0x0e, 0x4e, 0x20, 0x17, 0x33, 0xb6,
 | 
				
			||||||
		0x96, 0x4b, 0x56, 0x2c, 0x33, 0x96, 0xc8, 0x28, 0x4c, 0x92, 0xb5, 0xe5,
 | 
							0x96, 0x4b, 0x56, 0x2e, 0x73, 0x96, 0xca, 0x38, 0x4a, 0xd3, 0xb5, 0xe5,
 | 
				
			||||||
		0x5e, 0x8f, 0x83, 0x6b, 0xcf, 0x76, 0x71, 0x72, 0x2e, 0x34, 0xa8, 0x6d,
 | 
							0x5d, 0x4d, 0xc2, 0x2b, 0xdf, 0xf1, 0x70, 0x72, 0x2e, 0x34, 0xa8, 0x1d,
 | 
				
			||||||
		0xa1, 0x17, 0xbc, 0x60, 0xad, 0x98, 0x3f, 0xb6, 0x0e, 0x58, 0x2b, 0x2f,
 | 
							0xa1, 0x17, 0xbc, 0x64, 0x9d, 0x84, 0x3f, 0x74, 0xf6, 0x58, 0xa7, 0x28,
 | 
				
			||||||
		0x64, 0xdc, 0x62, 0x12, 0x0b, 0x9a, 0x2b, 0x8d, 0x95, 0x98, 0xcf, 0xc2,
 | 
							0x65, 0xd2, 0x61, 0x12, 0x0b, 0x9a, 0x2b, 0x8d, 0x95, 0x84, 0xcf, 0xa2,
 | 
				
			||||||
		0x65, 0x02, 0x5e, 0xaa, 0xa4, 0x31, 0x1c, 0x46, 0x93, 0x01, 0xc9, 0x86,
 | 
							0x65, 0x0a, 0x5e, 0xaa, 0xa2, 0x31, 0x1c, 0xc6, 0xd3, 0x21, 0xc9, 0x86,
 | 
				
			||||||
		0x6f, 0xcb, 0xfa, 0x54, 0xf0, 0x5c, 0x2a, 0xa1, 0x65, 0xb1, 0xbe, 0xb5,
 | 
							0x6f, 0xcb, 0xfa, 0x54, 0xf2, 0x42, 0x2a, 0xa1, 0x65, 0xb9, 0xbe, 0xb1,
 | 
				
			||||||
		0xdc, 0xc9, 0xc4, 0xc7, 0x86, 0xe5, 0xf5, 0x5d, 0x67, 0xea, 0x07, 0xfe,
 | 
							0xbc, 0xe9, 0x34, 0xc0, 0x86, 0xe5, 0x0f, 0x3c, 0xf7, 0x32, 0x08, 0x83,
 | 
				
			||||||
		0xc7, 0x29, 0xd1, 0xdd, 0x85, 0x6a, 0x01, 0x42, 0x05, 0xe9, 0x79, 0x71,
 | 
							0x8f, 0x97, 0x44, 0x77, 0x1b, 0xa9, 0x05, 0x08, 0x15, 0xa4, 0xe7, 0xe5,
 | 
				
			||||||
		0x6b, 0x4d, 0xdd, 0x89, 0x3f, 0xe9, 0x4f, 0xae, 0xb0, 0xb3, 0xd0, 0x3a,
 | 
							0x8d, 0x75, 0xe9, 0x4d, 0x83, 0xe9, 0x60, 0x7a, 0x81, 0x9d, 0x85, 0xd6,
 | 
				
			||||||
		0xb7, 0x06, 0x93, 0x51, 0xcf, 0x19, 0xe3, 0xcb, 0x08, 0xb9, 0x90, 0x4a,
 | 
							0x85, 0x35, 0x9c, 0x8e, 0x6d, 0x77, 0x82, 0x2f, 0x23, 0xe4, 0x42, 0x2a,
 | 
				
			||||||
		0x1b, 0x3e, 0xc1, 0xb5, 0x4b, 0x24, 0xdf, 0x3f, 0xaf, 0xe9, 0x5f, 0xa8,
 | 
							0x6d, 0xf8, 0x84, 0x57, 0x1e, 0x91, 0x7c, 0xff, 0xbc, 0xa1, 0x7f, 0xa1,
 | 
				
			||||||
		0xd3, 0x4e, 0xe7, 0xfb, 0xe7, 0x25, 0x39, 0x3e, 0xbe, 0x7f, 0x7e, 0xe9,
 | 
							0x8e, 0x7b, 0xbd, 0xef, 0x9f, 0x57, 0xe4, 0xf8, 0xf8, 0xfe, 0xf9, 0x79,
 | 
				
			||||||
		0xfb, 0xd3, 0x60, 0x3a, 0x71, 0xfd, 0x17, 0xaa, 0x63, 0x99, 0x8f, 0xde,
 | 
							0x10, 0x5c, 0x86, 0x97, 0x53, 0x2f, 0x78, 0xa1, 0x7a, 0x96, 0xf9, 0xb0,
 | 
				
			||||||
		0x60, 0x40, 0xba, 0x59, 0x9b, 0x1d, 0x7c, 0xbc, 0xec, 0x76, 0xbb, 0x96,
 | 
							0x87, 0x43, 0xd2, 0xcd, 0xda, 0xec, 0xe0, 0xe3, 0x65, 0xbf, 0xdf, 0xb7,
 | 
				
			||||||
		0xe7, 0x5d, 0xd6, 0xdf, 0xc7, 0xc7, 0xd0, 0x7b, 0x20, 0x54, 0x78, 0x97,
 | 
							0x7c, 0xff, 0xbc, 0xf9, 0x3e, 0x3c, 0x84, 0xde, 0x43, 0xa1, 0xa2, 0xdb,
 | 
				
			||||||
		0x70, 0xd6, 0x1f, 0x8c, 0x09, 0xff, 0x8c, 0x89, 0xac, 0xd6, 0x3e, 0x95,
 | 
							0x94, 0xb3, 0xc1, 0x70, 0x42, 0xf8, 0xe7, 0x4c, 0xe4, 0x8d, 0xf6, 0x99,
 | 
				
			||||||
		0x31, 0xb7, 0x26, 0xc3, 0xe1, 0x95, 0x33, 0xb6, 0x6b, 0x55, 0x67, 0x61,
 | 
							0x4c, 0xb8, 0x35, 0x1d, 0x8d, 0x2e, 0xdc, 0x89, 0xd3, 0xa8, 0x3a, 0x8b,
 | 
				
			||||||
		0xa2, 0xb8, 0x35, 0x70, 0xbc, 0xde, 0xf9, 0x95, 0x1d, 0xb8, 0x93, 0x6b,
 | 
							0x52, 0xc5, 0xad, 0xa1, 0xeb, 0xdb, 0xa7, 0x17, 0x4e, 0xe8, 0x4d, 0xaf,
 | 
				
			||||||
		0xdf, 0x76, 0xc9, 0x04, 0x9b, 0xad, 0x33, 0x76, 0xc1, 0x33, 0x5e, 0x84,
 | 
							0x02, 0xc7, 0x23, 0x13, 0x6c, 0xb6, 0x4e, 0xd8, 0x19, 0xcf, 0x79, 0x19,
 | 
				
			||||||
		0x9a, 0x33, 0xa5, 0x79, 0xae, 0x4e, 0xb1, 0xf2, 0x1d, 0x8b, 0x62, 0x98,
 | 
							0x69, 0xce, 0x94, 0xe6, 0x85, 0x3a, 0xc6, 0xca, 0x77, 0x2c, 0x4e, 0x60,
 | 
				
			||||||
		0x55, 0x2f, 0x3a, 0x5a, 0x76, 0xe6, 0x30, 0x64, 0x27, 0x5a, 0x2a, 0x2d,
 | 
							0x56, 0xbd, 0xe8, 0x69, 0xd9, 0x9b, 0xc3, 0x90, 0xbd, 0x78, 0xa9, 0xb4,
 | 
				
			||||||
		0xd3, 0x0e, 0xa9, 0xad, 0x0c, 0xc1, 0x5c, 0x1a, 0xf3, 0x7c, 0x77, 0x31,
 | 
							0xcc, 0x7a, 0xa4, 0xb6, 0x32, 0x04, 0x73, 0x69, 0xcc, 0xf3, 0xdd, 0xd9,
 | 
				
			||||||
		0x21, 0x95, 0x3b, 0xaa, 0x88, 0x3a, 0xf9, 0xfd, 0xbc, 0x13, 0x15, 0xeb,
 | 
							0x94, 0x54, 0xee, 0xa9, 0x32, 0xee, 0x15, 0x77, 0xf3, 0x5e, 0x5c, 0xae,
 | 
				
			||||||
		0x1c, 0x67, 0x74, 0xa2, 0x3a, 0xf3, 0x8a, 0x6d, 0x10, 0xf1, 0x42, 0xb7,
 | 
							0x0b, 0x9c, 0xd1, 0xa9, 0xea, 0xcd, 0x6b, 0xb6, 0x61, 0xcc, 0x4b, 0xdd,
 | 
				
			||||||
		0x41, 0x7f, 0x18, 0x85, 0x6f, 0x75, 0xb1, 0xe4, 0xec, 0x30, 0x5e, 0x62,
 | 
							0x05, 0xfd, 0x7e, 0x1c, 0xbd, 0xd5, 0xe5, 0x92, 0xb3, 0xfd, 0x64, 0x89,
 | 
				
			||||||
		0x43, 0xc8, 0xec, 0xed, 0x9b, 0xd7, 0x27, 0xdd, 0x45, 0x37, 0xed, 0x2a,
 | 
							0x0d, 0x21, 0xf3, 0xb7, 0x6f, 0x5e, 0x1f, 0xf5, 0x17, 0xfd, 0xac, 0xaf,
 | 
				
			||||||
		0x76, 0x48, 0xf0, 0xbd, 0x4d, 0xd7, 0xf4, 0xa7, 0xcd, 0x3f, 0x87, 0x69,
 | 
							0xd8, 0x3e, 0xc1, 0xf7, 0x36, 0x5b, 0xd3, 0x9f, 0x2e, 0xff, 0x1c, 0x65,
 | 
				
			||||||
		0x9e, 0xf0, 0x76, 0x24, 0x53, 0xab, 0x6f, 0xbb, 0x7e, 0x30, 0x74, 0xae,
 | 
							0x45, 0xca, 0xbb, 0xb1, 0xcc, 0xac, 0x81, 0xe3, 0x05, 0xe1, 0xc8, 0xbd,
 | 
				
			||||||
		0x48, 0x99, 0xa6, 0x14, 0x1d, 0xc3, 0x36, 0xe7, 0xa9, 0xf5, 0xce, 0xfe,
 | 
							0x20, 0x65, 0xda, 0x52, 0xf4, 0x0c, 0xdb, 0x82, 0x67, 0xd6, 0x3b, 0xe7,
 | 
				
			||||||
		0xb8, 0x97, 0xe0, 0x9e, 0xaf, 0xcd, 0xfe, 0x19, 0xbb, 0xce, 0x73, 0xb8,
 | 
							0xe3, 0x4e, 0x82, 0x3b, 0xbe, 0x36, 0xfb, 0x27, 0xec, 0xaa, 0x28, 0xe0,
 | 
				
			||||||
		0x4a, 0x02, 0xb8, 0x12, 0x26, 0x67, 0x4c, 0x73, 0x70, 0x27, 0x85, 0xc3,
 | 
							0x2a, 0x29, 0xe0, 0x4a, 0x99, 0x9c, 0x31, 0xcd, 0xc1, 0x9d, 0x14, 0x8e,
 | 
				
			||||||
		0x2c, 0x86, 0xd2, 0x10, 0x25, 0x62, 0x33, 0x01, 0x4c, 0x49, 0x65, 0x90,
 | 
							0xf2, 0x04, 0x4a, 0x43, 0x94, 0x98, 0xcd, 0x04, 0x30, 0x25, 0x95, 0x41,
 | 
				
			||||||
		0x37, 0x5c, 0x07, 0x3e, 0x66, 0x56, 0xd9, 0x0a, 0xce, 0xc6, 0x8d, 0x53,
 | 
							0xde, 0x72, 0x1d, 0xf8, 0x98, 0x59, 0x65, 0x2b, 0x38, 0x1b, 0x37, 0x4e,
 | 
				
			||||||
		0xd3, 0x32, 0xff, 0xcc, 0xa3, 0xa5, 0xe6, 0xb1, 0xe5, 0xf9, 0x3d, 0xdf,
 | 
							0x4d, 0xcb, 0xfc, 0x33, 0x8f, 0x97, 0x9a, 0x27, 0x96, 0x1f, 0xd8, 0x81,
 | 
				
			||||||
		0xe9, 0x07, 0xc6, 0xec, 0xd3, 0x9e, 0x7f, 0x49, 0x26, 0xb4, 0x3e, 0xc5,
 | 
							0x3b, 0x08, 0x8d, 0xd9, 0x2f, 0xed, 0xe0, 0x9c, 0x4c, 0x68, 0x7d, 0x4a,
 | 
				
			||||||
		0xa1, 0x0e, 0xe1, 0x3b, 0xfc, 0xb6, 0xe1, 0xa7, 0xe9, 0x5a, 0x3d, 0x24,
 | 
							0x22, 0x1d, 0xc1, 0x77, 0xf8, 0x4d, 0xcb, 0x4f, 0xb3, 0xb5, 0xba, 0x4f,
 | 
				
			||||||
		0xc6, 0x53, 0xa1, 0xe1, 0xbc, 0xe0, 0xaa, 0xf4, 0x56, 0x2c, 0x0a, 0xcd,
 | 
							0x8d, 0xa7, 0x42, 0xc3, 0x79, 0xc9, 0x55, 0xe5, 0xad, 0x58, 0x14, 0x9a,
 | 
				
			||||||
		0x5f, 0x62, 0x43, 0xe8, 0x1f, 0x14, 0xb9, 0x7d, 0xc1, 0xa2, 0x85, 0xa4,
 | 
							0xbf, 0xc4, 0x86, 0xd0, 0x3f, 0x28, 0x72, 0xfb, 0x92, 0xc5, 0x0b, 0x49,
 | 
				
			||||||
		0x60, 0x19, 0x9c, 0xd7, 0x7e, 0x68, 0xce, 0x5a, 0x97, 0x13, 0x8f, 0xbc,
 | 
							0xc1, 0x32, 0x3c, 0x6d, 0xfc, 0xd0, 0x9c, 0xb5, 0xce, 0xa7, 0x3e, 0x79,
 | 
				
			||||||
		0xe0, 0xe8, 0xf8, 0x75, 0xbb, 0x8b, 0xff, 0x8e, 0x4e, 0x5f, 0xbe, 0xec,
 | 
							0xc1, 0xc1, 0xe1, 0xeb, 0x6e, 0x1f, 0xff, 0x1d, 0x1c, 0xbf, 0x7c, 0xd9,
 | 
				
			||||||
		0x9e, 0x58, 0x55, 0xb8, 0x91, 0x95, 0xac, 0x2a, 0x40, 0x0a, 0x29, 0xb5,
 | 
							0x3f, 0xb2, 0xea, 0x70, 0x23, 0x2b, 0x59, 0x75, 0x80, 0x94, 0x52, 0x6a,
 | 
				
			||||||
		0x35, 0xed, 0x79, 0xde, 0x87, 0x01, 0x7b, 0x0b, 0x11, 0x86, 0x74, 0x51,
 | 
							0xeb, 0xd2, 0xf6, 0xfd, 0x0f, 0x43, 0xf6, 0x16, 0x22, 0x8c, 0xe8, 0xa2,
 | 
				
			||||||
		0xe3, 0xda, 0x2c, 0x59, 0x1f, 0x30, 0x5e, 0xc7, 0x4f, 0xe9, 0x4f, 0x24,
 | 
							0xd6, 0xb5, 0x79, 0xba, 0xde, 0x63, 0xbc, 0x89, 0x9f, 0xca, 0x9f, 0x48,
 | 
				
			||||||
		0x59, 0xc1, 0x1f, 0x96, 0xa2, 0xe0, 0xa5, 0x60, 0xf0, 0x78, 0x31, 0x5b,
 | 
							0xb2, 0x92, 0xdf, 0x2f, 0x45, 0xc9, 0x2b, 0xc1, 0xe0, 0xf1, 0x62, 0xb6,
 | 
				
			||||||
		0x1f, 0xce, 0x96, 0x49, 0xd2, 0x82, 0x13, 0x5e, 0x6d, 0x62, 0xa7, 0xa4,
 | 
							0xde, 0x9f, 0x2d, 0xd3, 0xb4, 0x03, 0x27, 0xbc, 0xd8, 0xc4, 0x4e, 0x45,
 | 
				
			||||||
		0xaf, 0xd9, 0xd6, 0xf2, 0x1b, 0xae, 0x56, 0x05, 0x01, 0xe9, 0x6f, 0xfc,
 | 
							0xdf, 0xb0, 0x6d, 0xe4, 0x37, 0x5c, 0xad, 0x1a, 0x02, 0xd2, 0xdf, 0xf8,
 | 
				
			||||||
		0xa6, 0x1d, 0xdf, 0x01, 0x8e, 0x30, 0x4e, 0x45, 0x76, 0x6b, 0x02, 0x29,
 | 
							0x4d, 0x37, 0xb9, 0x05, 0x1c, 0x51, 0x92, 0x89, 0xfc, 0xc6, 0x04, 0x52,
 | 
				
			||||||
		0x5a, 0x16, 0x42, 0x23, 0xde, 0x9c, 0x31, 0x90, 0xbb, 0xba, 0x82, 0x27,
 | 
							0xbc, 0x2c, 0x85, 0x46, 0xbc, 0xb9, 0x13, 0x20, 0x77, 0x71, 0x01, 0x4f,
 | 
				
			||||||
		0xf6, 0xdf, 0x35, 0x5c, 0xf1, 0xd9, 0xb3, 0xfe, 0x65, 0x6f, 0x7c, 0x61,
 | 
							0x1c, 0xbc, 0x6b, 0xb9, 0xe2, 0xb3, 0x67, 0x83, 0x73, 0x7b, 0x72, 0xe6,
 | 
				
			||||||
		0x33, 0xff, 0xd2, 0xf1, 0x98, 0x3f, 0x61, 0xef, 0x6c, 0x7b, 0xca, 0x3e,
 | 
							0xb0, 0xe0, 0xdc, 0xf5, 0x59, 0x30, 0x65, 0xef, 0x1c, 0xe7, 0x92, 0x7d,
 | 
				
			||||||
		0x4e, 0xae, 0x5d, 0x66, 0x74, 0x1b, 0xf4, 0xfc, 0x1e, 0xf3, 0x7a, 0x43,
 | 
							0x9c, 0x5e, 0x79, 0xcc, 0xe8, 0x36, 0xb4, 0x03, 0x9b, 0xf9, 0xf6, 0xc8,
 | 
				
			||||||
		0xfb, 0xd9, 0x33, 0xcb, 0xb3, 0xfb, 0xae, 0xed, 0x07, 0xb0, 0x3e, 0x18,
 | 
							0x79, 0xf6, 0xcc, 0xf2, 0x9d, 0x81, 0xe7, 0x04, 0x21, 0xac, 0x0f, 0x06,
 | 
				
			||||||
		0x3c, 0xfb, 0xbf, 0x9f, 0x87, 0x03, 0xfb, 0x83, 0x8b, 0xff, 0xff, 0xff,
 | 
							0xcf, 0xfe, 0xef, 0xe7, 0xd1, 0xd0, 0xf9, 0xe0, 0xe1, 0xff, 0xff, 0xff,
 | 
				
			||||||
		0x37, 0xcf, 0xc1, 0xa9, 0xb7, 0xd4, 0xf2, 0x30, 0x91, 0x73, 0x44, 0x47,
 | 
							0xcd, 0x73, 0x70, 0xb2, 0x97, 0x5a, 0xee, 0xa7, 0x72, 0x8e, 0xe8, 0x28,
 | 
				
			||||||
		0xc1, 0x53, 0x9e, 0xde, 0x41, 0xd7, 0x38, 0x5c, 0x2b, 0x0b, 0xbe, 0xef,
 | 
							0x79, 0xc6, 0xb3, 0x5b, 0xe8, 0x9a, 0x44, 0x6b, 0x65, 0xc1, 0xf7, 0xdd,
 | 
				
			||||||
		0x8c, 0x03, 0xd7, 0x1e, 0xd9, 0xa3, 0x73, 0x84, 0xc2, 0xa0, 0xf7, 0xd1,
 | 
							0x49, 0xe8, 0x39, 0x63, 0x67, 0x7c, 0x8a, 0x50, 0x18, 0xda, 0x1f, 0x7d,
 | 
				
			||||||
		0xc3, 0xf9, 0xd7, 0x56, 0x7f, 0x32, 0x79, 0xe7, 0xd8, 0x26, 0xc7, 0x34,
 | 
							0x9c, 0x7f, 0x6d, 0x0d, 0xa6, 0xd3, 0x77, 0xae, 0x63, 0x72, 0x4c, 0x0b,
 | 
				
			||||||
		0x20, 0x0d, 0xc2, 0x15, 0x57, 0x32, 0xe5, 0xf5, 0xf6, 0xe6, 0x5c, 0x93,
 | 
							0xd2, 0x30, 0x5a, 0x71, 0x25, 0x33, 0xde, 0x6c, 0x6f, 0xce, 0xb5, 0x69,
 | 
				
			||||||
		0x46, 0x64, 0x51, 0xc1, 0x63, 0x41, 0xa8, 0x94, 0xc9, 0x02, 0xd6, 0xbb,
 | 
							0x44, 0x1e, 0x97, 0x3c, 0x11, 0x84, 0x4a, 0x95, 0x2c, 0x60, 0xbd, 0x1b,
 | 
				
			||||||
		0xb5, 0x7a, 0x7d, 0xdf, 0xb9, 0xb1, 0x83, 0x3e, 0x60, 0x0b, 0xae, 0xe8,
 | 
							0xcb, 0x1e, 0x04, 0xee, 0xb5, 0x13, 0x0e, 0x00, 0x5b, 0x78, 0x41, 0xbf,
 | 
				
			||||||
		0xd7, 0xc8, 0x19, 0x23, 0xfa, 0xe8, 0xb6, 0xa3, 0x37, 0x5d, 0xcb, 0xb5,
 | 
							0xc6, 0xee, 0x04, 0xd1, 0x47, 0xb7, 0x1d, 0xbc, 0xe9, 0x5b, 0x9e, 0xe3,
 | 
				
			||||||
		0x3d, 0x9b, 0x7c, 0x86, 0xac, 0xf4, 0x8b, 0x44, 0x70, 0x5d, 0xf0, 0x63,
 | 
							0x3b, 0xe4, 0x33, 0x64, 0xa5, 0x5f, 0x24, 0x82, 0xeb, 0x82, 0x1f, 0xcb,
 | 
				
			||||||
		0x19, 0xe7, 0x31, 0xd3, 0x92, 0x21, 0x57, 0xce, 0x44, 0x91, 0x32, 0x7e,
 | 
							0x39, 0x4f, 0x98, 0x96, 0x0c, 0xb9, 0x72, 0x26, 0xca, 0x8c, 0xf1, 0xfd,
 | 
				
			||||||
		0x98, 0x86, 0x22, 0x61, 0x33, 0x18, 0xa0, 0xe0, 0x73, 0xa1, 0x74, 0x19,
 | 
							0x2c, 0x12, 0x29, 0x9b, 0xc1, 0x00, 0x25, 0x9f, 0x0b, 0xa5, 0xab, 0x70,
 | 
				
			||||||
		0x4e, 0xe0, 0x79, 0xe1, 0x78, 0x14, 0xe0, 0x36, 0x32, 0xcd, 0x15, 0xb8,
 | 
							0x02, 0xcf, 0x33, 0xd7, 0xa7, 0x00, 0x77, 0x90, 0x69, 0x2e, 0xc0, 0x75,
 | 
				
			||||||
		0x8e, 0x87, 0x8e, 0x3b, 0x6a, 0xe0, 0x3b, 0x90, 0x5c, 0xb1, 0x4c, 0x6a,
 | 
							0x32, 0x72, 0xbd, 0x71, 0x0b, 0xdf, 0xa1, 0xe4, 0x8a, 0xe5, 0x52, 0x33,
 | 
				
			||||||
		0x86, 0x9c, 0x2a, 0x57, 0xd5, 0x61, 0x5c, 0x40, 0x81, 0x60, 0xac, 0xc4,
 | 
							0xe4, 0x54, 0xb9, 0xaa, 0x0f, 0xe3, 0x02, 0x0a, 0x04, 0x63, 0x25, 0x06,
 | 
				
			||||||
		0xa0, 0x89, 0x89, 0x8c, 0x28, 0x92, 0xcb, 0x4c, 0x97, 0x56, 0xdd, 0x64,
 | 
							0x4d, 0x4c, 0x64, 0xc4, 0xb1, 0x5c, 0xe6, 0xba, 0xb2, 0xea, 0x26, 0x7b,
 | 
				
			||||||
		0x0f, 0xc3, 0xde, 0x85, 0xc7, 0x4f, 0xc6, 0x0d, 0xa6, 0x46, 0xc4, 0x14,
 | 
							0x18, 0xf6, 0x1e, 0x3c, 0x7e, 0x3a, 0x69, 0x31, 0x35, 0x22, 0x66, 0x88,
 | 
				
			||||||
		0x91, 0xc7, 0x94, 0x98, 0x9b, 0x7c, 0x04, 0x51, 0x1f, 0x05, 0x5f, 0x81,
 | 
							0x3c, 0xa6, 0xc4, 0xdc, 0xe4, 0x23, 0x88, 0xfa, 0x20, 0xf8, 0x0a, 0x6c,
 | 
				
			||||||
		0xed, 0x5a, 0x2f, 0x44, 0x36, 0x6f, 0x43, 0xb2, 0xf7, 0xd7, 0x8e, 0x6b,
 | 
							0xd7, 0x7a, 0x21, 0xf2, 0x79, 0x17, 0x92, 0xbd, 0xbf, 0x72, 0x3d, 0x27,
 | 
				
			||||||
		0x07, 0x9e, 0x73, 0x31, 0x06, 0xfc, 0x37, 0x8e, 0xfd, 0xa1, 0xc1, 0xa1,
 | 
							0xf4, 0xdd, 0xb3, 0x09, 0xe0, 0xbf, 0x76, 0x9d, 0x0f, 0x2d, 0x0e, 0x83,
 | 
				
			||||||
		0x1f, 0x46, 0x88, 0xb3, 0xf0, 0x11, 0x6e, 0x03, 0x59, 0x14, 0xcb, 0x45,
 | 
							0x28, 0x46, 0x9c, 0x45, 0x0f, 0x70, 0x1b, 0xc8, 0xa2, 0x58, 0x21, 0x62,
 | 
				
			||||||
		0xa4, 0x97, 0x05, 0xb7, 0xec, 0xb1, 0xb9, 0xb7, 0xdf, 0xeb, 0x5f, 0xda,
 | 
							0xbd, 0x2c, 0xb9, 0xe5, 0x4c, 0xcc, 0xbd, 0x03, 0x7b, 0x70, 0xee, 0x84,
 | 
				
			||||||
		0x41, 0xef, 0x06, 0xc6, 0x77, 0x1b, 0xa7, 0x46, 0x84, 0x01, 0x94, 0x11,
 | 
							0xf6, 0x35, 0x8c, 0xef, 0xb5, 0x4e, 0x8d, 0x09, 0x03, 0x28, 0x23, 0x66,
 | 
				
			||||||
		0x33, 0x11, 0x95, 0xfa, 0x57, 0xf4, 0xe3, 0x89, 0xef, 0x0c, 0x3f, 0x06,
 | 
							0x22, 0xae, 0xf4, 0xaf, 0xe9, 0x27, 0xd3, 0xc0, 0x1d, 0x7d, 0x0c, 0x09,
 | 
				
			||||||
		0x84, 0xc1, 0x86, 0xdc, 0xfa, 0x44, 0x90, 0x51, 0x16, 0x2f, 0x89, 0x06,
 | 
							0x83, 0x0d, 0xb9, 0xf5, 0x69, 0xc5, 0x6f, 0x17, 0x52, 0xde, 0x51, 0x4c,
 | 
				
			||||||
		0x0d, 0x46, 0xe7, 0xcb, 0xd9, 0xcc, 0xe4, 0x87, 0x6c, 0x8e, 0x48, 0x47,
 | 
							0x0e, 0x4a, 0x14, 0x2f, 0x1d, 0xa9, 0x3b, 0x08, 0x0b, 0xf5, 0x1f, 0xa2,
 | 
				
			||||||
		0x82, 0x88, 0x50, 0x89, 0x32, 0x9e, 0x1c, 0xb0, 0x7b, 0xce, 0x73, 0x2a,
 | 
							0x94, 0xa4, 0x86, 0xfa, 0x88, 0x69, 0x65, 0x05, 0xb6, 0xff, 0x2e, 0x74,
 | 
				
			||||||
		0x48, 0x90, 0x49, 0x98, 0x7c, 0x50, 0x55, 0xa6, 0x58, 0x66, 0x3f, 0x68,
 | 
							0x27, 0xc0, 0xf1, 0xda, 0x26, 0x06, 0x07, 0x04, 0x1c, 0x4f, 0x05, 0x22,
 | 
				
			||||||
		0x76, 0x9f, 0x01, 0xc3, 0x15, 0x55, 0x44, 0xb3, 0xd9, 0x86, 0x4b, 0x8e,
 | 
							0x02, 0x65, 0x2e, 0xe3, 0x72, 0xa9, 0x89, 0x1c, 0xce, 0x2c, 0xf3, 0x44,
 | 
				
			||||||
		0x07, 0xc1, 0xf9, 0xf5, 0x70, 0x48, 0x39, 0xd6, 0x26, 0x8c, 0x8e, 0xc8,
 | 
							0x59, 0x43, 0x87, 0x0c, 0xe7, 0x85, 0x81, 0x3b, 0x76, 0x90, 0x5e, 0x71,
 | 
				
			||||||
		0x86, 0x63, 0xaa, 0x9c, 0x88, 0x1b, 0x24, 0x9d, 0x35, 0x0c, 0x09, 0x80,
 | 
							0xe0, 0x15, 0x6e, 0x23, 0x03, 0x51, 0xcd, 0xa8, 0x44, 0x1a, 0xb6, 0xc4,
 | 
				
			||||||
		0x8c, 0xf9, 0xca, 0x92, 0xe9, 0x5d, 0x9f, 0xff, 0xce, 0xee, 0xfb, 0xa6,
 | 
							0x3e, 0x5d, 0xce, 0x66, 0x26, 0x1b, 0xe5, 0x73, 0xe4, 0x15, 0xa4, 0xa3,
 | 
				
			||||||
		0x60, 0xd4, 0xe5, 0xf3, 0x85, 0xaa, 0xd5, 0x2b, 0x4b, 0x0f, 0x25, 0x69,
 | 
							0x18, 0x75, 0x2f, 0xe7, 0xe9, 0x1e, 0xbb, 0xe3, 0xbc, 0xa0, 0xf2, 0x07,
 | 
				
			||||||
		0x3a, 0x72, 0xca, 0x54, 0xaa, 0xf3, 0xf6, 0x9c, 0x7e, 0x53, 0x72, 0x3c,
 | 
							0x04, 0x84, 0xc9, 0x3e, 0x75, 0x1d, 0x4c, 0x64, 0xfe, 0x83, 0x66, 0x77,
 | 
				
			||||||
		0x7d, 0xf5, 0xe6, 0x35, 0xf6, 0xde, 0xbf, 0xaf, 0x36, 0x1e, 0x1e, 0xcc,
 | 
							0x39, 0x2c, 0xb6, 0xa2, 0xfa, 0x6b, 0x36, 0xbb, 0x08, 0x80, 0xc9, 0x30,
 | 
				
			||||||
		0xea, 0xf1, 0xab, 0x3a, 0x57, 0xd4, 0x6c, 0x66, 0x85, 0x4c, 0x61, 0xe0,
 | 
							0x3c, 0xbd, 0x1a, 0x8d, 0x28, 0xa3, 0x3b, 0x64, 0x91, 0x03, 0xf2, 0x98,
 | 
				
			||||||
		0x18, 0xf1, 0xaf, 0xac, 0xa1, 0x3b, 0x19, 0x3d, 0xed, 0x41, 0xf1, 0xa5,
 | 
							0x09, 0xd5, 0x69, 0x44, 0x29, 0x52, 0xdc, 0x1a, 0x6e, 0x43, 0x8a, 0x11,
 | 
				
			||||||
		0xf1, 0x31, 0x12, 0x92, 0xfc, 0x20, 0x0f, 0x95, 0x5a, 0xc9, 0x22, 0xae,
 | 
							0x50, 0x55, 0x81, 0xf6, 0xaf, 0x4e, 0x7f, 0xe7, 0x0c, 0x02, 0x53, 0x9e,
 | 
				
			||||||
		0xb3, 0xc9, 0x26, 0x93, 0x50, 0x66, 0x93, 0xe1, 0x52, 0x2f, 0xbe, 0xc4,
 | 
							0x9a, 0x62, 0xfd, 0x42, 0x35, 0x60, 0x56, 0x85, 0x8e, 0x4a, 0x02, 0x1d,
 | 
				
			||||||
		0xb0, 0xda, 0x68, 0xa3, 0x34, 0x2f, 0x96, 0x77, 0x5f, 0xee, 0xf7, 0xaf,
 | 
							0x39, 0x66, 0x2a, 0xd3, 0x45, 0x77, 0x4e, 0xbf, 0x29, 0x15, 0x1f, 0xbf,
 | 
				
			||||||
		0x1c, 0x7b, 0xec, 0x07, 0x8e, 0xe1, 0x52, 0x7d, 0x94, 0xf1, 0x5b, 0x16,
 | 
							0x7a, 0xf3, 0x1a, 0x7b, 0xef, 0xdf, 0xd7, 0x1b, 0xf7, 0xf7, 0x66, 0xf5,
 | 
				
			||||||
		0xdd, 0xc9, 0xd4, 0xb8, 0xbc, 0xc9, 0xdb, 0xa8, 0x95, 0x61, 0x2e, 0x2a,
 | 
							0xf0, 0x55, 0x93, 0x99, 0x1a, 0x36, 0xb3, 0x52, 0x66, 0x70, 0xa7, 0x04,
 | 
				
			||||||
		0x56, 0xa4, 0x4f, 0x87, 0xe4, 0xb3, 0x7a, 0xd7, 0xfe, 0x65, 0x55, 0x59,
 | 
							0xd9, 0x46, 0x59, 0x23, 0x6f, 0x3a, 0x7e, 0xdc, 0x83, 0xe2, 0x4b, 0xe3,
 | 
				
			||||||
		0x6b, 0xb2, 0x06, 0x89, 0x89, 0xf4, 0x8e, 0x11, 0xa2, 0x43, 0xff, 0xc8,
 | 
							0xd1, 0x24, 0x24, 0x79, 0x5d, 0x11, 0x29, 0xb5, 0x92, 0x65, 0xd2, 0xe4,
 | 
				
			||||||
		0x42, 0xfc, 0x89, 0x5b, 0xfe, 0xe4, 0x9d, 0x3d, 0xfe, 0xc6, 0x43, 0x51,
 | 
							0xae, 0x4d, 0xde, 0xa2, 0x3c, 0x2a, 0xa3, 0xa5, 0x5e, 0x7c, 0x89, 0x61,
 | 
				
			||||||
		0x04, 0x6c, 0x02, 0x2d, 0xef, 0x79, 0x66, 0x99, 0xa2, 0xa8, 0x59, 0x94,
 | 
							0xbd, 0xd1, 0x45, 0x23, 0xb0, 0x58, 0xde, 0x7e, 0xb9, 0x3f, 0xb8, 0x70,
 | 
				
			||||||
		0x08, 0x8e, 0x18, 0x10, 0x71, 0x59, 0x28, 0x38, 0x62, 0x43, 0x1b, 0x28,
 | 
							0x9d, 0x49, 0x10, 0xba, 0x86, 0x4b, 0xfd, 0x51, 0x65, 0x8b, 0xaa, 0xc4,
 | 
				
			||||||
		0xb1, 0x5f, 0xb3, 0x43, 0x48, 0x2a, 0x89, 0x52, 0x15, 0x53, 0x71, 0x91,
 | 
							0x4f, 0x2f, 0x4d, 0x80, 0x99, 0x2a, 0x81, 0xca, 0x1c, 0x15, 0xa2, 0x66,
 | 
				
			||||||
		0x28, 0x33, 0x0a, 0xa5, 0x4e, 0xce, 0xcb, 0xe2, 0xd5, 0x41, 0x5d, 0xfe,
 | 
							0x45, 0xfa, 0xf4, 0x48, 0x3e, 0xcb, 0xbe, 0x0a, 0xce, 0xeb, 0x3a, 0xde,
 | 
				
			||||||
		0x23, 0x8f, 0xf4, 0x06, 0x1e, 0xb3, 0xf3, 0x1f, 0xc3, 0xb3, 0x5a, 0xad,
 | 
							0x90, 0xb5, 0x48, 0x4c, 0x5e, 0xe9, 0x19, 0x21, 0x7a, 0xf4, 0x8f, 0x2c,
 | 
				
			||||||
		0x2a, 0x56, 0x00, 0x4a, 0x99, 0x8b, 0x8c, 0x0e, 0x84, 0x93, 0xc8, 0x66,
 | 
							0xc5, 0x9f, 0xb8, 0x15, 0x4c, 0xdf, 0x39, 0x93, 0x6f, 0x3c, 0x14, 0xc7,
 | 
				
			||||||
		0xb2, 0xcd, 0x8d, 0x7f, 0x7d, 0x33, 0x39, 0xa4, 0xa4, 0xf2, 0xb7, 0x0f,
 | 
							0xc0, 0x26, 0xd4, 0xf2, 0x8e, 0xe7, 0x96, 0x29, 0xc1, 0x9a, 0xc5, 0xa9,
 | 
				
			||||||
		0xe2, 0x2a, 0x0f, 0x6c, 0x29, 0x25, 0x4b, 0xc8, 0x8e, 0x0d, 0x97, 0xbd,
 | 
							0xe0, 0x88, 0x38, 0x91, 0x54, 0x65, 0x89, 0x23, 0x12, 0xb5, 0x81, 0x12,
 | 
				
			||||||
		0x18, 0x7f, 0xf5, 0x54, 0x05, 0x71, 0x05, 0xc9, 0xc3, 0xc3, 0xbf, 0x0d,
 | 
							0xfb, 0x0d, 0x3b, 0x78, 0x9c, 0x92, 0x28, 0x8c, 0x09, 0x95, 0x32, 0x89,
 | 
				
			||||||
		0x07, 0x72, 0x98, 0x71, 0x7e, 0xf6, 0xf7, 0xbf, 0xfd, 0xe5, 0x1f, 0x7f,
 | 
							0xa2, 0xa6, 0x50, 0x58, 0xe5, 0xbc, 0x2a, 0x95, 0x3d, 0x74, 0x01, 0x7f,
 | 
				
			||||||
		0xfe, 0x2b, 0x25, 0xfd, 0x3d, 0x3e, 0x52, 0x84, 0xf9, 0xa2, 0x0a, 0x8c,
 | 
							0xe4, 0xb1, 0xde, 0xc0, 0x63, 0x76, 0xfe, 0x63, 0x78, 0x56, 0xab, 0x55,
 | 
				
			||||||
		0x4a, 0x82, 0x76, 0xb7, 0xe1, 0x22, 0x67, 0x6c, 0xaf, 0x93, 0xec, 0x3d,
 | 
							0xcd, 0x0a, 0x40, 0x29, 0x73, 0x91, 0xd1, 0x81, 0x70, 0x12, 0xf9, 0x4c,
 | 
				
			||||||
		0x55, 0x4a, 0x8e, 0x13, 0x3c, 0x8b, 0xc8, 0x31, 0x56, 0x5c, 0xdc, 0xc9,
 | 
							0x76, 0xb9, 0xf1, 0xaf, 0x6f, 0x26, 0x87, 0x94, 0x54, 0x6c, 0x77, 0x41,
 | 
				
			||||||
		0x7d, 0xa8, 0xc1, 0x0f, 0xb2, 0xb6, 0xae, 0xcf, 0x47, 0x73, 0x71, 0x78,
 | 
							0x5c, 0x67, 0x9d, 0x2d, 0xa5, 0x64, 0x05, 0xd9, 0xa1, 0xe1, 0xb2, 0x13,
 | 
				
			||||||
		0x57, 0x3b, 0xda, 0xf1, 0xaf, 0xb8, 0xe7, 0xd7, 0x8f, 0x6e, 0x39, 0x69,
 | 
							0xe3, 0xaf, 0x9e, 0xaa, 0x21, 0xae, 0x21, 0xb9, 0xbf, 0xff, 0xb7, 0xe1,
 | 
				
			||||||
		0x85, 0xa0, 0x5e, 0x09, 0xad, 0xf7, 0x25, 0xb6, 0x7f, 0x01, 0xc6, 0x7d,
 | 
							0x40, 0xc6, 0x34, 0xce, 0xcf, 0xfe, 0xfe, 0xb7, 0xbf, 0xfc, 0xe3, 0xcf,
 | 
				
			||||||
		0x96, 0x47, 0x0c, 0x56, 0xac, 0x9f, 0x50, 0xf8, 0x15, 0xe1, 0x7f, 0xe1,
 | 
							0x7f, 0xa5, 0x12, 0xb3, 0xc3, 0x47, 0xca, 0xa8, 0x58, 0xd4, 0x81, 0x51,
 | 
				
			||||||
		0xcc, 0x3e, 0xa9, 0x0d, 0x76, 0xff, 0x0b, 0x99, 0x0d, 0xe3, 0x86, 0xdd,
 | 
							0x4b, 0xd0, 0xed, 0xb7, 0x5c, 0xe4, 0x84, 0xed, 0x74, 0x92, 0x9d, 0xa7,
 | 
				
			||||||
		0xbe, 0x41, 0xe4, 0x2f, 0x8f, 0x6c, 0x4b, 0x1c, 0x51, 0x79, 0xda, 0xea,
 | 
							0x2a, 0xc9, 0x71, 0x82, 0xe7, 0x31, 0x39, 0xc6, 0x8a, 0x8b, 0x5b, 0xb9,
 | 
				
			||||||
		0xe5, 0x78, 0x8a, 0xa9, 0xa1, 0x6c, 0x99, 0x90, 0xd7, 0xf1, 0x43, 0x96,
 | 
							0x0b, 0x35, 0xf8, 0x41, 0xde, 0xd5, 0xcd, 0xf9, 0x78, 0x2e, 0xf6, 0x6f,
 | 
				
			||||||
		0xab, 0x86, 0x72, 0x67, 0xf8, 0xa8, 0x88, 0xad, 0xde, 0xa0, 0x37, 0xf5,
 | 
							0x1b, 0x47, 0x3b, 0xfc, 0x15, 0xf7, 0xfc, 0xfa, 0xd1, 0x2d, 0x27, 0xad,
 | 
				
			||||||
		0x4d, 0x46, 0x2d, 0x57, 0xea, 0x0e, 0xaa, 0xda, 0xaf, 0xda, 0xb2, 0x8b,
 | 
							0x11, 0xd4, 0x2b, 0xa1, 0xf5, 0xae, 0xc4, 0xf6, 0x2f, 0xc0, 0xb8, 0xcb,
 | 
				
			||||||
		0x3e, 0xea, 0x03, 0xf0, 0x7b, 0x0c, 0x13, 0x2a, 0x14, 0x48, 0x3a, 0x32,
 | 
							0xf2, 0x88, 0xc1, 0x9a, 0xf5, 0x23, 0x0a, 0xbf, 0x22, 0xfc, 0x2f, 0x9c,
 | 
				
			||||||
		0x8b, 0xd5, 0x16, 0xc7, 0x93, 0x2e, 0xda, 0x27, 0x70, 0xba, 0xe9, 0x91,
 | 
							0xd9, 0x25, 0xb5, 0xc1, 0xee, 0x7f, 0x21, 0xb3, 0x61, 0xdc, 0xb2, 0xdb,
 | 
				
			||||||
		0x22, 0x27, 0xdd, 0x9a, 0x51, 0x29, 0x8b, 0xc9, 0x55, 0x4d, 0x59, 0xc0,
 | 
							0x37, 0x88, 0xfc, 0xe5, 0x91, 0x6d, 0x89, 0x63, 0x2a, 0x86, 0x5b, 0x9d,
 | 
				
			||||||
		0x20, 0x43, 0x0e, 0x42, 0x7d, 0x64, 0xd4, 0x5c, 0x6f, 0xca, 0xc0, 0x19,
 | 
							0x23, 0xcf, 0x30, 0xa3, 0x54, 0x0d, 0x1a, 0xf2, 0x3a, 0x7e, 0xc8, 0x6a,
 | 
				
			||||||
		0x33, 0x07, 0x4e, 0x59, 0xeb, 0xf4, 0xa4, 0xfb, 0xf2, 0xc7, 0x16, 0x16,
 | 
							0xd5, 0x50, 0x3e, 0x19, 0x75, 0x6a, 0x62, 0xcb, 0x1e, 0xda, 0x97, 0x81,
 | 
				
			||||||
		0xea, 0x53, 0x58, 0x7b, 0xea, 0x32, 0x8f, 0x8e, 0x8e, 0x8f, 0x8e, 0x5a,
 | 
							0xc9, 0xa8, 0xd5, 0x4a, 0xd3, 0xaf, 0xd5, 0xfb, 0x75, 0x13, 0x78, 0x36,
 | 
				
			||||||
		0x55, 0x45, 0x31, 0x0d, 0x8e, 0x52, 0x60, 0xb6, 0x1f, 0x0f, 0xca, 0x23,
 | 
							0xd8, 0xaa, 0x80, 0x75, 0x49, 0xdb, 0xe2, 0x78, 0xd4, 0xb7, 0x5a, 0xb5,
 | 
				
			||||||
		0x4f, 0xb8, 0x94, 0xb0, 0x54, 0x8d, 0xef, 0x3e, 0x4c, 0x30, 0x21, 0xdd,
 | 
							0xf0, 0xa8, 0xdf, 0x30, 0xaa, 0x64, 0x31, 0xb9, 0xaa, 0x2d, 0x0b, 0x18,
 | 
				
			||||||
		0x38, 0x03, 0x03, 0x8a, 0xc9, 0x40, 0x67, 0x6c, 0x5a, 0xc8, 0x47, 0x11,
 | 
							0xe4, 0xc8, 0x41, 0xa8, 0xc6, 0x8c, 0x5a, 0xf9, 0x4d, 0x19, 0x38, 0x61,
 | 
				
			||||||
		0x83, 0xa9, 0xe9, 0x75, 0xe6, 0x4c, 0xe6, 0x24, 0xb9, 0x2a, 0x85, 0xc3,
 | 
							0xe6, 0xc0, 0x31, 0xeb, 0x1c, 0x1f, 0xf5, 0x5f, 0xfe, 0xd8, 0xc1, 0x42,
 | 
				
			||||||
		0x99, 0x53, 0xd3, 0xbe, 0x2c, 0xc2, 0x47, 0x2a, 0x56, 0xeb, 0x9a, 0x6a,
 | 
							0x73, 0x0a, 0x6b, 0x8f, 0x3d, 0xed, 0xc1, 0xc1, 0xe1, 0xc1, 0x41, 0xa7,
 | 
				
			||||||
		0xcd, 0x69, 0x24, 0x24, 0x16, 0xa8, 0x84, 0xa5, 0x7c, 0x4f, 0x1d, 0x3d,
 | 
							0xae, 0x28, 0xa6, 0x9d, 0x52, 0x0a, 0xcc, 0x76, 0xe3, 0x41, 0x79, 0xe4,
 | 
				
			||||||
		0x7a, 0xdd, 0xf6, 0xbc, 0x8d, 0x4e, 0x97, 0xba, 0xd2, 0x6a, 0x57, 0xb5,
 | 
							0x11, 0x97, 0x0a, 0x96, 0xba, 0xcd, 0xde, 0x85, 0x09, 0xe6, 0xb1, 0x6b,
 | 
				
			||||||
		0x9e, 0xf4, 0xaf, 0x78, 0x24, 0xe2, 0x9e, 0x97, 0x4b, 0x55, 0xd5, 0x35,
 | 
							0x77, 0x68, 0x40, 0x31, 0x19, 0xe8, 0x84, 0x5d, 0x96, 0xf2, 0x41, 0x24,
 | 
				
			||||||
		0x48, 0x1d, 0xb0, 0x5c, 0xca, 0xc4, 0x83, 0xfb, 0x1c, 0x6c, 0x2a, 0x63,
 | 
							0x60, 0x6a, 0x3a, 0xab, 0x39, 0x93, 0x05, 0x49, 0xae, 0x2a, 0xe1, 0x70,
 | 
				
			||||||
		0xcd, 0xf0, 0x09, 0xa3, 0x93, 0x97, 0xaf, 0x7f, 0x3c, 0x38, 0xea, 0x76,
 | 
							0xe6, 0xd8, 0x34, 0x4b, 0x8b, 0xe8, 0x81, 0x8a, 0xd5, 0xba, 0xa1, 0x5a,
 | 
				
			||||||
		0x0f, 0x42, 0x8c, 0x13, 0x9f, 0x05, 0x37, 0x60, 0x92, 0xde, 0xa7, 0xe8,
 | 
							0x73, 0x1a, 0x40, 0x89, 0x05, 0x2a, 0x61, 0x25, 0xdf, 0xe3, 0xfc, 0x80,
 | 
				
			||||||
		0x10, 0x0f, 0xf1, 0xf7, 0x30, 0x2e, 0x04, 0x58, 0x76, 0xcc, 0x22, 0x8b,
 | 
							0xce, 0xba, 0x3b, 0xef, 0xa2, 0xaf, 0xa6, 0x1e, 0xb8, 0xde, 0x55, 0x9d,
 | 
				
			||||||
		0x55, 0x56, 0xdf, 0x8a, 0xde, 0x0d, 0x0d, 0x52, 0xcd, 0x91, 0x3a, 0xf7,
 | 
							0x47, 0xfd, 0x6b, 0x1e, 0xa9, 0xb8, 0xe3, 0xd5, 0x52, 0x5d, 0x75, 0x0d,
 | 
				
			||||||
		0xd3, 0xfa, 0x9a, 0x9f, 0x6b, 0x61, 0x03, 0x6d, 0x3a, 0xf4, 0x0d, 0x5a,
 | 
							0x52, 0x7b, 0xac, 0x90, 0x32, 0xf5, 0xe1, 0x3e, 0x7b, 0x9b, 0xca, 0xd8,
 | 
				
			||||||
		0x65, 0x63, 0x77, 0x51, 0x37, 0xda, 0xb5, 0x4a, 0xb8, 0xd3, 0xab, 0x74,
 | 
							0x30, 0x7c, 0xc4, 0xe8, 0xe8, 0xe5, 0xeb, 0x1f, 0xf7, 0x0e, 0xfa, 0xfd,
 | 
				
			||||||
		0x8f, 0xa4, 0xbc, 0x17, 0xdc, 0xd4, 0xf4, 0xba, 0x73, 0xad, 0x1a, 0x56,
 | 
							0xbd, 0x08, 0xc3, 0xcb, 0x67, 0xc1, 0x0d, 0x98, 0xa4, 0xf7, 0x31, 0xfa,
 | 
				
			||||||
		0x11, 0x90, 0x9e, 0x01, 0xfa, 0x56, 0xa1, 0xe9, 0x84, 0x53, 0x36, 0x34,
 | 
							0xd1, 0x7d, 0xfc, 0xdd, 0x4f, 0x4a, 0xea, 0x56, 0x7a, 0x66, 0x91, 0x25,
 | 
				
			||||||
		0xa8, 0x05, 0x1b, 0xe0, 0xe0, 0x76, 0x26, 0x3a, 0x2a, 0x8f, 0x6c, 0xd8,
 | 
							0x2a, 0x6f, 0x6e, 0x45, 0xa7, 0x88, 0x76, 0xac, 0xe1, 0x48, 0x73, 0xc2,
 | 
				
			||||||
		0xad, 0x8a, 0xd1, 0x92, 0x21, 0xc2, 0xf2, 0xda, 0xb5, 0x1b, 0x6d, 0x94,
 | 
							0x71, 0x73, 0xcd, 0xcf, 0x8d, 0xb0, 0xa1, 0x36, 0xf3, 0xc0, 0x06, 0xad,
 | 
				
			||||||
		0x9d, 0x99, 0xc1, 0x54, 0x51, 0xe5, 0x34, 0xf7, 0x6f, 0x9d, 0xa5, 0xc9,
 | 
							0xaa, 0x8d, 0x3c, 0x6b, 0xda, 0xfa, 0x46, 0x25, 0xdc, 0xe9, 0xd7, 0xba,
 | 
				
			||||||
		0xaf, 0x6e, 0xd0, 0xa8, 0xf3, 0x2d, 0xb9, 0xe0, 0xb8, 0xd9, 0x78, 0x12,
 | 
							0xc7, 0x68, 0xab, 0x04, 0x37, 0x35, 0xbd, 0xe9, 0x93, 0xeb, 0xf6, 0x58,
 | 
				
			||||||
		0x1d, 0x01, 0xa0, 0x05, 0x5a, 0x91, 0x3a, 0x0a, 0xb6, 0x98, 0xbc, 0x39,
 | 
							0x84, 0xa4, 0x67, 0x88, 0x2e, 0x59, 0x68, 0x3a, 0xe1, 0x56, 0x0d, 0x0d,
 | 
				
			||||||
		0xf9, 0x2d, 0x46, 0xe2, 0x8b, 0x7e, 0x50, 0x07, 0x40, 0xe0, 0x3b, 0x46,
 | 
							0x6a, 0xc1, 0x06, 0x38, 0xb8, 0x9d, 0x89, 0x8e, 0xda, 0x23, 0x5b, 0x76,
 | 
				
			||||||
		0xad, 0x72, 0xe3, 0x89, 0x4b, 0x22, 0x66, 0xdc, 0xf0, 0xd9, 0x73, 0xdc,
 | 
							0xab, 0x63, 0xb4, 0x62, 0x88, 0xb0, 0xbc, 0xf2, 0x9c, 0x56, 0x1b, 0xe5,
 | 
				
			||||||
		0xb3, 0x3d, 0x0f, 0x1d, 0x2c, 0xfa, 0xed, 0xa1, 0xbd, 0x7b, 0x7e, 0x83,
 | 
							0xe4, 0x66, 0x0c, 0x56, 0x54, 0x39, 0xcd, 0xfd, 0x5b, 0x67, 0x69, 0xce,
 | 
				
			||||||
		0x41, 0x0c, 0x1f, 0x53, 0x0b, 0x36, 0x5b, 0x66, 0xd1, 0xc1, 0xc6, 0xcf,
 | 
							0x6c, 0xda, 0x41, 0xea, 0xb3, 0x2b, 0x2e, 0x38, 0x6e, 0x36, 0x1e, 0x45,
 | 
				
			||||||
		0xd5, 0x22, 0x3c, 0x22, 0xef, 0xc6, 0xdf, 0xe3, 0x57, 0x27, 0x95, 0x7b,
 | 
							0x47, 0x00, 0x50, 0x4b, 0xb7, 0x89, 0x82, 0x2d, 0x26, 0x6f, 0x8e, 0x7e,
 | 
				
			||||||
		0xc7, 0xaf, 0x5a, 0xcd, 0x3b, 0x88, 0x66, 0x73, 0x85, 0x33, 0x08, 0x2e,
 | 
							0x8b, 0x01, 0xfc, 0x6c, 0xb0, 0x69, 0x06, 0x4d, 0x8f, 0x07, 0x26, 0xd5,
 | 
				
			||||||
		0x7b, 0xde, 0xe5, 0xf0, 0x7a, 0xdc, 0xc7, 0x25, 0x66, 0xeb, 0x49, 0x46,
 | 
							0xc6, 0x23, 0x97, 0x54, 0xcc, 0xb8, 0xe1, 0xb3, 0xe3, 0xb8, 0xef, 0xf8,
 | 
				
			||||||
		0x73, 0x01, 0x86, 0xd4, 0x2d, 0x11, 0xc9, 0x10, 0x05, 0x42, 0x18, 0xfd,
 | 
							0x3e, 0xfa, 0x65, 0x74, 0xf7, 0x23, 0xe7, 0xe9, 0xf9, 0x0d, 0x06, 0x09,
 | 
				
			||||||
		0x5a, 0xe9, 0x1a, 0xbb, 0xbc, 0xcc, 0xbc, 0x83, 0x30, 0xac, 0x7a, 0x64,
 | 
							0x7c, 0x4c, 0x2d, 0xd8, 0x6c, 0x99, 0xc7, 0x7b, 0x1b, 0x3f, 0x57, 0x8b,
 | 
				
			||||||
		0x0a, 0x43, 0x9f, 0x86, 0xd4, 0x24, 0x8c, 0x38, 0x35, 0xde, 0xd5, 0xba,
 | 
							0xe8, 0x80, 0xbc, 0x1b, 0x7f, 0x0f, 0x5f, 0x1d, 0xd5, 0xee, 0x9d, 0xbc,
 | 
				
			||||||
		0x71, 0x8d, 0xa7, 0x29, 0xaf, 0xf4, 0xe8, 0x52, 0xe2, 0x07, 0x91, 0x89,
 | 
							0xea, 0xb4, 0xef, 0x20, 0x9a, 0xcd, 0x15, 0xee, 0x30, 0x3c, 0xb7, 0xfd,
 | 
				
			||||||
		0xe5, 0x4e, 0x40, 0x56, 0xfb, 0xb8, 0xcc, 0xbd, 0x71, 0xfa, 0x84, 0x48,
 | 
							0xf3, 0xd1, 0xd5, 0x64, 0x80, 0x4b, 0xcc, 0xd6, 0xa3, 0x8c, 0xe6, 0x02,
 | 
				
			||||||
		0xd5, 0x79, 0xd6, 0xbd, 0xff, 0x85, 0xbb, 0xd3, 0x7f, 0x5b, 0x9f, 0xd0,
 | 
							0x8c, 0xc4, 0x5b, 0x22, 0x92, 0x21, 0x4a, 0x84, 0x30, 0xfa, 0xb5, 0xca,
 | 
				
			||||||
		0x3e, 0x95, 0x0f, 0x27, 0xd5, 0xe4, 0xdb, 0x48, 0x08, 0x55, 0x57, 0xd4,
 | 
							0x35, 0x9e, 0xf2, 0x32, 0xd3, 0x15, 0xc2, 0xb0, 0xee, 0xc8, 0x29, 0x0c,
 | 
				
			||||||
		0xcc, 0x08, 0x94, 0x86, 0x0c, 0x76, 0x68, 0x54, 0x4b, 0x39, 0xea, 0x29,
 | 
							0x03, 0x1a, 0x89, 0xd3, 0x28, 0xe6, 0xd4, 0xe6, 0xd7, 0xeb, 0xc6, 0x35,
 | 
				
			||||||
		0x79, 0x47, 0x94, 0xfa, 0x6c, 0x39, 0x59, 0xc0, 0x95, 0xd2, 0x34, 0x24,
 | 
							0x1e, 0x67, 0xca, 0xca, 0xa3, 0x2b, 0x89, 0xef, 0x45, 0x2e, 0x96, 0x4f,
 | 
				
			||||||
		0xc5, 0x14, 0xcf, 0x43, 0xf3, 0x4c, 0x91, 0x82, 0x52, 0xe4, 0xf0, 0x34,
 | 
							0x02, 0xb2, 0xde, 0xc7, 0x65, 0xde, 0xb5, 0x3b, 0x20, 0x44, 0xea, 0xce,
 | 
				
			||||||
		0x7a, 0xef, 0x50, 0x75, 0xe8, 0x54, 0xc7, 0x0e, 0x4c, 0xdc, 0xb7, 0xac,
 | 
							0xb3, 0x99, 0x34, 0xce, 0xbc, 0x27, 0xdd, 0xbe, 0xf5, 0x09, 0xed, 0x53,
 | 
				
			||||||
		0x6a, 0x5a, 0xad, 0x56, 0xff, 0x9b, 0x4d, 0xfe, 0x4e, 0x7f, 0xdf, 0x35,
 | 
							0xf5, 0x4c, 0x53, 0xcf, 0xd9, 0xad, 0x84, 0x50, 0x77, 0x45, 0xed, 0x8c,
 | 
				
			||||||
		0x7e, 0x53, 0x2b, 0xee, 0x17, 0x30, 0x03, 0xa9, 0x39, 0xe0, 0x77, 0xcb,
 | 
							0x40, 0x69, 0xc8, 0x60, 0x87, 0x46, 0xb5, 0x92, 0xa3, 0x99, 0xc9, 0x9f,
 | 
				
			||||||
		0x39, 0xfd, 0x70, 0xd0, 0x61, 0xd1, 0xdf, 0x0f, 0x61, 0x61, 0xf4, 0xb7,
 | 
							0x88, 0xd2, 0x9c, 0xad, 0xe6, 0x18, 0xb8, 0x52, 0x96, 0x45, 0xa4, 0x98,
 | 
				
			||||||
		0x8b, 0x42, 0x16, 0xf4, 0xa3, 0x8f, 0x49, 0x18, 0x83, 0xcb, 0x6e, 0x6a,
 | 
							0xe2, 0x45, 0x64, 0x1e, 0x45, 0x32, 0x50, 0x8a, 0x02, 0x9e, 0x46, 0xaf,
 | 
				
			||||||
		0x2c, 0x39, 0x58, 0x57, 0xf6, 0x8d, 0x4d, 0xe9, 0xdd, 0x7c, 0x5a, 0x75,
 | 
							0x2b, 0xaa, 0x09, 0x9d, 0xfa, 0xd8, 0x9e, 0x89, 0xfb, 0x8e, 0x55, 0xcf,
 | 
				
			||||||
		0x8a, 0xaf, 0xb1, 0x31, 0xaa, 0x97, 0xc3, 0x19, 0x99, 0xa1, 0x5d, 0xad,
 | 
							0xc6, 0xf5, 0xea, 0x7f, 0xb3, 0xc9, 0x7f, 0xd2, 0xdf, 0xf7, 0x8d, 0xdf,
 | 
				
			||||||
		0xdf, 0x6e, 0x8e, 0x6d, 0x4e, 0x18, 0x34, 0x76, 0xc9, 0x69, 0xb1, 0x41,
 | 
							0x34, 0x8a, 0x07, 0x25, 0xcc, 0x40, 0x6a, 0x0e, 0xf9, 0xed, 0x72, 0x4e,
 | 
				
			||||||
		0x4b, 0x8f, 0x27, 0x75, 0x7e, 0xc0, 0x76, 0x39, 0xb9, 0xe3, 0x87, 0x71,
 | 
							0x3f, 0x5c, 0x74, 0x58, 0xf4, 0xf7, 0x43, 0x54, 0x1a, 0xfd, 0x9d, 0xb2,
 | 
				
			||||||
		0x2d, 0x7a, 0xed, 0x30, 0x81, 0xad, 0x18, 0x8a, 0xa3, 0x4c, 0x61, 0x81,
 | 
							0x94, 0x25, 0xfd, 0x18, 0x60, 0xee, 0xc6, 0x98, 0xf4, 0x34, 0x35, 0x56,
 | 
				
			||||||
		0x98, 0xa8, 0x58, 0x21, 0x35, 0x7e, 0x3f, 0x57, 0xa8, 0xf7, 0x91, 0x01,
 | 
							0x1c, 0xac, 0x0b, 0xe7, 0xda, 0xa1, 0xf4, 0x6e, 0x3e, 0xad, 0x26, 0xc5,
 | 
				
			||||||
		0x74, 0x26, 0x69, 0xa8, 0x84, 0xcb, 0xd6, 0x49, 0xfb, 0xc5, 0x97, 0x09,
 | 
							0x37, 0xd8, 0x18, 0xd5, 0xab, 0x51, 0x90, 0xcc, 0xd0, 0xad, 0xd7, 0x6f,
 | 
				
			||||||
		0x00, 0xd3, 0x77, 0xe0, 0x4e, 0xfc, 0x9e, 0xdf, 0x88, 0xfc, 0x51, 0xf8,
 | 
							0x36, 0xc7, 0x36, 0x27, 0x0c, 0x1a, 0x4f, 0xc9, 0x69, 0xb1, 0x45, 0x4b,
 | 
				
			||||||
		0x19, 0xf1, 0x9a, 0x21, 0x5d, 0x2d, 0xcd, 0x98, 0x0e, 0x56, 0x0a, 0x5c,
 | 
							0x4f, 0x35, 0x4d, 0x7e, 0xc0, 0x76, 0xf5, 0x4e, 0x80, 0x1f, 0xc6, 0xb5,
 | 
				
			||||||
		0x60, 0x60, 0x92, 0x73, 0x8b, 0x87, 0x81, 0x1b, 0x80, 0x8f, 0x7a, 0xbf,
 | 
							0xe8, 0x6d, 0xc5, 0x04, 0xb6, 0x62, 0x28, 0x8e, 0x32, 0x83, 0x05, 0x12,
 | 
				
			||||||
		0x0f, 0xe8, 0x95, 0xcb, 0xab, 0x4d, 0x60, 0x8c, 0x40, 0x8c, 0x14, 0x32,
 | 
							0xa2, 0x62, 0xa5, 0xd4, 0xf8, 0xfd, 0x5c, 0xa1, 0xde, 0xc7, 0x06, 0xd0,
 | 
				
			||||||
		0x35, 0x02, 0x4d, 0xcc, 0xf4, 0xd7, 0xf8, 0x1c, 0xbf, 0x41, 0x39, 0x09,
 | 
							0x99, 0xa4, 0x11, 0x16, 0x2e, 0xdb, 0x24, 0xed, 0x17, 0x5f, 0x26, 0x00,
 | 
				
			||||||
		0x33, 0x30, 0x64, 0x3f, 0xfd, 0x84, 0xaf, 0x03, 0x86, 0x78, 0x1e, 0x9d,
 | 
							0xcc, 0xfa, 0xa1, 0x37, 0x0d, 0xec, 0xa0, 0x15, 0xf9, 0xe3, 0xe8, 0x33,
 | 
				
			||||||
		0x1b, 0xbe, 0x9e, 0xf3, 0x07, 0x64, 0xa8, 0x4b, 0x67, 0x68, 0x9e, 0xdc,
 | 
							0xe2, 0x35, 0x47, 0xba, 0x5a, 0x9a, 0x47, 0x01, 0xb0, 0x52, 0xe0, 0x02,
 | 
				
			||||||
		0xde, 0x98, 0x80, 0x9d, 0xa7, 0xd4, 0xef, 0x91, 0xd6, 0x31, 0x3a, 0xeb,
 | 
							0x03, 0x93, 0x9c, 0x5b, 0x3c, 0x0c, 0xdc, 0x00, 0x7c, 0x6c, 0xff, 0x3e,
 | 
				
			||||||
		0xf5, 0x97, 0x7a, 0x0d, 0x30, 0x6b, 0x7e, 0xfc, 0x42, 0x33, 0xfb, 0x73,
 | 
							0xa4, 0x37, 0x35, 0xbf, 0x31, 0x81, 0x31, 0x02, 0x31, 0x52, 0xc8, 0xd4,
 | 
				
			||||||
		0x2e, 0x50, 0x51, 0xcc, 0xc3, 0x03, 0x89, 0x43, 0x0c, 0x48, 0x96, 0xe7,
 | 
							0x08, 0x34, 0x31, 0xd3, 0x5f, 0xe3, 0x73, 0xf8, 0x06, 0xe5, 0x24, 0xca,
 | 
				
			||||||
		0x31, 0x4f, 0x38, 0x4d, 0xd9, 0x33, 0x1a, 0xbe, 0x53, 0x88, 0x4d, 0x14,
 | 
							0xc1, 0x90, 0xfd, 0xf4, 0x13, 0xbe, 0xf6, 0x18, 0xe2, 0x79, 0x7c, 0x6a,
 | 
				
			||||||
		0xdb, 0x70, 0xbd, 0x36, 0xc2, 0x6c, 0x9e, 0x27, 0x1a, 0x1e, 0x90, 0xed,
 | 
							0xf8, 0xfa, 0xee, 0x1f, 0x90, 0xa1, 0xce, 0xdd, 0x91, 0x79, 0xe0, 0x7b,
 | 
				
			||||||
		0x33, 0x7f, 0xd6, 0xb0, 0xe7, 0x19, 0x73, 0x79, 0x55, 0xf5, 0xcb, 0x92,
 | 
							0x63, 0x02, 0x76, 0x9e, 0x51, 0xbf, 0x47, 0x5a, 0x27, 0xe8, 0xac, 0xd7,
 | 
				
			||||||
		0x4f, 0x0f, 0x05, 0xe5, 0x5b, 0x6d, 0x05, 0x48, 0x8a, 0x14, 0x14, 0xce,
 | 
							0x5f, 0xea, 0x35, 0xc4, 0x64, 0xfb, 0xf1, 0x0b, 0xcd, 0x9c, 0xcf, 0x85,
 | 
				
			||||||
		0xf9, 0x9e, 0xe4, 0xee, 0xda, 0x28, 0x2e, 0x63, 0x0c, 0xa4, 0x01, 0x52,
 | 
							0x40, 0x45, 0x31, 0xcf, 0x1c, 0x24, 0x0e, 0x31, 0x20, 0x59, 0x9e, 0x27,
 | 
				
			||||||
		0xce, 0xc8, 0x6b, 0xbe, 0x13, 0xfa, 0x38, 0x8f, 0x38, 0x2c, 0x36, 0xbc,
 | 
							0x3c, 0xe5, 0x34, 0xd3, 0xcf, 0x68, 0xd4, 0xcf, 0x20, 0x36, 0x51, 0x6c,
 | 
				
			||||||
		0x57, 0x0b, 0x9e, 0x35, 0xdb, 0x0b, 0x30, 0x49, 0x70, 0xdd, 0xd7, 0xb8,
 | 
							0xc3, 0xf5, 0xda, 0x08, 0xb3, 0x79, 0x0c, 0x69, 0x79, 0x40, 0xbe, 0xcb,
 | 
				
			||||||
		0x36, 0xcb, 0x45, 0x15, 0x32, 0x3a, 0xca, 0x29, 0x1c, 0x96, 0x99, 0xf8,
 | 
							0xfc, 0x79, 0xcb, 0x9e, 0x27, 0xcc, 0xe3, 0x75, 0xd5, 0xaf, 0x4a, 0x3e,
 | 
				
			||||||
		0x5c, 0xe6, 0x85, 0x65, 0x9c, 0xef, 0xc4, 0x04, 0x91, 0x34, 0x5f, 0x5f,
 | 
							0x3d, 0x4b, 0x54, 0x2f, 0xc3, 0x35, 0x20, 0x19, 0x52, 0x50, 0x34, 0xe7,
 | 
				
			||||||
		0xf1, 0x0d, 0x06, 0x97, 0xcd, 0x6e, 0xa6, 0x7e, 0x3f, 0xdd, 0xbc, 0x4b,
 | 
							0x3b, 0x92, 0xbb, 0xe7, 0xa0, 0xb8, 0x4c, 0x30, 0x90, 0x86, 0x48, 0x39,
 | 
				
			||||||
		0x99, 0x34, 0xb3, 0x83, 0x13, 0x2d, 0x6e, 0xe1, 0xf4, 0xb5, 0xc9, 0x7c,
 | 
							0x63, 0xbf, 0xfd, 0x2a, 0x19, 0xe0, 0x3c, 0xe2, 0xb0, 0xdc, 0xf0, 0x5e,
 | 
				
			||||||
		0x5b, 0x84, 0x81, 0x08, 0xe7, 0x19, 0x2e, 0x14, 0x51, 0x0d, 0x5e, 0x39,
 | 
							0x2d, 0x78, 0xde, 0x6e, 0x2f, 0xc0, 0x24, 0xc5, 0x75, 0x5f, 0xe3, 0xda,
 | 
				
			||||||
		0x54, 0x9b, 0x34, 0xd9, 0x6a, 0x4c, 0xf1, 0x5f, 0x25, 0xdc, 0x19, 0xeb,
 | 
							0x2e, 0x17, 0x75, 0xc8, 0xe8, 0xb8, 0xa0, 0x70, 0x58, 0xe6, 0xe2, 0x73,
 | 
				
			||||||
		0xb7, 0xa7, 0xf4, 0x6f, 0x9f, 0xc4, 0x4b, 0x0b, 0x73, 0xea, 0x28, 0x90,
 | 
							0x95, 0x17, 0x96, 0x49, 0xf1, 0x24, 0x26, 0x88, 0xa4, 0xfd, 0xd6, 0x8b,
 | 
				
			||||||
		0xff, 0xa2, 0x30, 0x63, 0x77, 0xa4, 0x26, 0x27, 0xf8, 0xd0, 0x24, 0xf1,
 | 
							0x6f, 0x30, 0x38, 0x6f, 0x77, 0x33, 0xcd, 0x6b, 0xed, 0xe6, 0x15, 0xcc,
 | 
				
			||||||
		0x2a, 0x27, 0x7e, 0x6a, 0x1d, 0xfd, 0xdc, 0x78, 0x4a, 0x6d, 0x1d, 0xb4,
 | 
							0xa4, 0x99, 0x27, 0x38, 0xd1, 0xe2, 0x16, 0x4e, 0x5f, 0x9b, 0xcc, 0xb7,
 | 
				
			||||||
		0x8e, 0xb7, 0xbe, 0x6f, 0xc9, 0x2e, 0xb6, 0x73, 0x63, 0xbb, 0x5e, 0x13,
 | 
							0x45, 0x18, 0x8a, 0x68, 0x9e, 0xe3, 0x42, 0x11, 0x37, 0xe0, 0x55, 0x43,
 | 
				
			||||||
		0xba, 0x4d, 0x5e, 0xde, 0x85, 0xef, 0xe9, 0x59, 0x73, 0x03, 0xe1, 0xc0,
 | 
							0xb5, 0x49, 0x93, 0x9d, 0xd6, 0x14, 0xff, 0x55, 0xc2, 0x27, 0x63, 0xfd,
 | 
				
			||||||
		0xa5, 0xe3, 0xa6, 0x59, 0x87, 0x81, 0xe9, 0xef, 0x3f, 0x03, 0x00, 0x00,
 | 
							0xf6, 0x94, 0xfe, 0xed, 0x93, 0x78, 0x65, 0x61, 0x4e, 0x1d, 0x05, 0xf2,
 | 
				
			||||||
		0xff, 0xff, 0x77, 0x1f, 0xe2, 0xa5, 0x2d, 0x18, 0x00, 0x00,
 | 
							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",
 | 
							"conf/app.ini",
 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
@@ -3562,7 +3567,6 @@ func conf_supervisor_ini() ([]byte, error) {
 | 
				
			|||||||
	)
 | 
						)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
// Asset loads and returns the asset for the given name.
 | 
					// Asset loads and returns the asset for the given name.
 | 
				
			||||||
// It returns an error if the asset could not be found or
 | 
					// It returns an error if the asset could not be found or
 | 
				
			||||||
// could not be loaded.
 | 
					// could not be loaded.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,13 +5,17 @@
 | 
				
			|||||||
package cron
 | 
					package cron
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/robfig/cron"
 | 
						"github.com/robfig/cron"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/gogits/gogs/models"
 | 
						"github.com/gogits/gogs/models"
 | 
				
			||||||
 | 
						"github.com/gogits/gogs/modules/setting"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewCronContext() {
 | 
					func NewCronContext() {
 | 
				
			||||||
	c := cron.New()
 | 
						c := cron.New()
 | 
				
			||||||
	c.AddFunc("@every 1h", models.MirrorUpdate)
 | 
						c.AddFunc("@every 1h", models.MirrorUpdate)
 | 
				
			||||||
 | 
						c.AddFunc(fmt.Sprintf("@every %dm", setting.WebhookTaskInterval), models.DeliverHooks)
 | 
				
			||||||
	c.Start()
 | 
						c.Start()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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))
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -53,6 +53,10 @@ var (
 | 
				
			|||||||
	CookieUserName     string
 | 
						CookieUserName     string
 | 
				
			||||||
	CookieRememberName string
 | 
						CookieRememberName string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Webhook settings.
 | 
				
			||||||
 | 
						WebhookTaskInterval   int
 | 
				
			||||||
 | 
						WebhookDeliverTimeout int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Repository settings.
 | 
						// Repository settings.
 | 
				
			||||||
	RepoRootPath string
 | 
						RepoRootPath string
 | 
				
			||||||
	ScriptType   string
 | 
						ScriptType   string
 | 
				
			||||||
@@ -187,9 +191,9 @@ var Service struct {
 | 
				
			|||||||
	RequireSignInView    bool
 | 
						RequireSignInView    bool
 | 
				
			||||||
	EnableCacheAvatar    bool
 | 
						EnableCacheAvatar    bool
 | 
				
			||||||
	NotifyMail           bool
 | 
						NotifyMail           bool
 | 
				
			||||||
 | 
						LdapAuth             bool
 | 
				
			||||||
	ActiveCodeLives      int
 | 
						ActiveCodeLives      int
 | 
				
			||||||
	ResetPwdCodeLives    int
 | 
						ResetPwdCodeLives    int
 | 
				
			||||||
	LdapAuth             bool
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func newService() {
 | 
					func newService() {
 | 
				
			||||||
@@ -390,6 +394,11 @@ func newNotifyMailService() {
 | 
				
			|||||||
	log.Info("Notify Mail Service Enabled")
 | 
						log.Info("Notify Mail Service Enabled")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func newWebhookService() {
 | 
				
			||||||
 | 
						WebhookTaskInterval = Cfg.MustInt("webhook", "TASK_INTERVAL", 1)
 | 
				
			||||||
 | 
						WebhookDeliverTimeout = Cfg.MustInt("webhook", "DELIVER_TIMEOUT", 5)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewServices() {
 | 
					func NewServices() {
 | 
				
			||||||
	newService()
 | 
						newService()
 | 
				
			||||||
	newLogService()
 | 
						newLogService()
 | 
				
			||||||
@@ -398,4 +407,5 @@ func NewServices() {
 | 
				
			|||||||
	newMailService()
 | 
						newMailService()
 | 
				
			||||||
	newRegisterMailService()
 | 
						newRegisterMailService()
 | 
				
			||||||
	newNotifyMailService()
 | 
						newNotifyMailService()
 | 
				
			||||||
 | 
						newWebhookService()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -193,6 +193,9 @@ func Config(ctx *middleware.Context) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	ctx.Data["DbCfg"] = models.DbCfg
 | 
						ctx.Data["DbCfg"] = models.DbCfg
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ctx.Data["WebhookTaskInterval"] = setting.WebhookTaskInterval
 | 
				
			||||||
 | 
						ctx.Data["WebhookDeliverTimeout"] = setting.WebhookDeliverTimeout
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ctx.Data["MailerEnabled"] = false
 | 
						ctx.Data["MailerEnabled"] = false
 | 
				
			||||||
	if setting.MailService != nil {
 | 
						if setting.MailService != nil {
 | 
				
			||||||
		ctx.Data["MailerEnabled"] = true
 | 
							ctx.Data["MailerEnabled"] = true
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,7 +14,6 @@ import (
 | 
				
			|||||||
	"github.com/Unknwon/goconfig"
 | 
						"github.com/Unknwon/goconfig"
 | 
				
			||||||
	"github.com/go-martini/martini"
 | 
						"github.com/go-martini/martini"
 | 
				
			||||||
	"github.com/go-xorm/xorm"
 | 
						"github.com/go-xorm/xorm"
 | 
				
			||||||
	qlog "github.com/qiniu/log"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/gogits/gogs/models"
 | 
						"github.com/gogits/gogs/models"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/auth"
 | 
						"github.com/gogits/gogs/modules/auth"
 | 
				
			||||||
@@ -56,7 +55,7 @@ func GlobalInit() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	if setting.InstallLock {
 | 
						if setting.InstallLock {
 | 
				
			||||||
		if err := models.NewEngine(); err != nil {
 | 
							if err := models.NewEngine(); err != nil {
 | 
				
			||||||
			qlog.Fatal(err)
 | 
								log.Fatal("Fail to initialize ORM engine: %v", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		models.HasEngine = true
 | 
							models.HasEngine = true
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -244,9 +244,9 @@ func WebHooksAddPost(ctx *middleware.Context, form auth.NewWebhookForm) {
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ct := models.CT_JSON
 | 
						ct := models.JSON
 | 
				
			||||||
	if form.ContentType == "2" {
 | 
						if form.ContentType == "2" {
 | 
				
			||||||
		ct = models.CT_FORM
 | 
							ct = models.FORM
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	w := &models.Webhook{
 | 
						w := &models.Webhook{
 | 
				
			||||||
@@ -259,8 +259,8 @@ func WebHooksAddPost(ctx *middleware.Context, form auth.NewWebhookForm) {
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
		IsActive: form.Active,
 | 
							IsActive: form.Active,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if err := w.SaveEvent(); err != nil {
 | 
						if err := w.UpdateEvent(); err != nil {
 | 
				
			||||||
		ctx.Handle(500, "setting.WebHooksAddPost(SaveEvent)", err)
 | 
							ctx.Handle(500, "setting.WebHooksAddPost(UpdateEvent)", err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	} else if err := models.CreateWebhook(w); err != nil {
 | 
						} else if err := models.CreateWebhook(w); err != nil {
 | 
				
			||||||
		ctx.Handle(500, "setting.WebHooksAddPost(CreateWebhook)", err)
 | 
							ctx.Handle(500, "setting.WebHooksAddPost(CreateWebhook)", err)
 | 
				
			||||||
@@ -311,9 +311,9 @@ func WebHooksEditPost(ctx *middleware.Context, params martini.Params, form auth.
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ct := models.CT_JSON
 | 
						ct := models.JSON
 | 
				
			||||||
	if form.ContentType == "2" {
 | 
						if form.ContentType == "2" {
 | 
				
			||||||
		ct = models.CT_FORM
 | 
							ct = models.FORM
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	w := &models.Webhook{
 | 
						w := &models.Webhook{
 | 
				
			||||||
@@ -327,8 +327,8 @@ func WebHooksEditPost(ctx *middleware.Context, params martini.Params, form auth.
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
		IsActive: form.Active,
 | 
							IsActive: form.Active,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if err := w.SaveEvent(); err != nil {
 | 
						if err := w.UpdateEvent(); err != nil {
 | 
				
			||||||
		ctx.Handle(500, "setting.WebHooksEditPost(SaveEvent)", err)
 | 
							ctx.Handle(500, "setting.WebHooksEditPost(UpdateEvent)", err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	} else if err := models.UpdateWebhook(w); err != nil {
 | 
						} else if err := models.UpdateWebhook(w); err != nil {
 | 
				
			||||||
		ctx.Handle(500, "setting.WebHooksEditPost(WebHooksEditPost)", err)
 | 
							ctx.Handle(500, "setting.WebHooksEditPost(WebHooksEditPost)", err)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1 +1 @@
 | 
				
			|||||||
0.4.2.0605 Alpha
 | 
					0.4.2.0608 Alpha
 | 
				
			||||||
@@ -89,6 +89,21 @@
 | 
				
			|||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <div class="panel panel-default">
 | 
				
			||||||
 | 
					            <div class="panel-heading">
 | 
				
			||||||
 | 
					                Webhook Configuration
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            <div class="panel-body">
 | 
				
			||||||
 | 
					                <dl class="dl-horizontal admin-dl-horizontal">
 | 
				
			||||||
 | 
					                    <dt>Task Interval</dt>
 | 
				
			||||||
 | 
					                    <dd>{{.WebhookTaskInterval}} minutes</dd>
 | 
				
			||||||
 | 
					                    <dt>Deliver Timeout</dt>
 | 
				
			||||||
 | 
					                    <dd>{{.WebhookDeliverTimeout}} seconds</dd>
 | 
				
			||||||
 | 
					                </dl>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <div class="panel panel-default">
 | 
					        <div class="panel panel-default">
 | 
				
			||||||
            <div class="panel-heading">
 | 
					            <div class="panel-heading">
 | 
				
			||||||
                Mailer Configuration
 | 
					                Mailer Configuration
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user