@@ -0,0 +1,17 @@ | |||
[run] | |||
init_cmds = [["./gogs", "web"]] | |||
watch_all = true | |||
watch_dirs = [ | |||
"$WORKDIR/conf/locale", | |||
"$WORKDIR/cmd", | |||
"$WORKDIR/models", | |||
"$WORKDIR/modules", | |||
"$WORKDIR/routers" | |||
] | |||
watch_exts = [".go", ".ini"] | |||
build_delay = 1500 | |||
cmds = [ | |||
["go", "install"], | |||
["go", "build"], | |||
["./gogs", "web"] | |||
] |
@@ -36,3 +36,4 @@ gogs | |||
__pycache__ | |||
*.pem | |||
output* | |||
config.codekit |
@@ -1,23 +0,0 @@ | |||
{ | |||
"version": 0, | |||
"gopm": { | |||
"enable": false, | |||
"install": false | |||
}, | |||
"go_install": true, | |||
"watch_ext": [], | |||
"dir_structure": { | |||
"watch_all": true, | |||
"controllers": "routers", | |||
"models": "", | |||
"others": [ | |||
"modules", | |||
"$GOPATH/src/github.com/gogits/logs", | |||
"$GOPATH/src/github.com/gogits/git" | |||
] | |||
}, | |||
"cmd_args": [ | |||
"web" | |||
], | |||
"envs": [] | |||
} |
@@ -10,11 +10,12 @@ import ( | |||
"os/exec" | |||
"path" | |||
"path/filepath" | |||
"strconv" | |||
"strings" | |||
"github.com/codegangsta/cli" | |||
"github.com/Unknwon/com" | |||
"github.com/gogits/gogs/models" | |||
"github.com/gogits/gogs/modules/log" | |||
"github.com/gogits/gogs/modules/setting" | |||
@@ -81,22 +82,22 @@ func runServ(k *cli.Context) { | |||
keys := strings.Split(os.Args[2], "-") | |||
if len(keys) != 2 { | |||
println("Gogs: auth file format error") | |||
log.GitLogger.Fatal("Invalid auth file format: %s", os.Args[2]) | |||
log.GitLogger.Fatal(2, "Invalid auth file format: %s", os.Args[2]) | |||
} | |||
keyId, err := strconv.ParseInt(keys[1], 10, 64) | |||
keyId, err := com.StrTo(keys[1]).Int64() | |||
if err != nil { | |||
println("Gogs: auth file format error") | |||
log.GitLogger.Fatal("Invalid auth file format: %v", err) | |||
log.GitLogger.Fatal(2, "Invalid auth file format: %v", err) | |||
} | |||
user, err := models.GetUserByKeyId(keyId) | |||
if err != nil { | |||
if err == models.ErrUserNotKeyOwner { | |||
println("Gogs: you are not the owner of SSH key") | |||
log.GitLogger.Fatal("Invalid owner of SSH key: %d", keyId) | |||
log.GitLogger.Fatal(2, "Invalid owner of SSH key: %d", keyId) | |||
} | |||
println("Gogs: internal error:", err) | |||
log.GitLogger.Fatal("Fail to get user by key ID(%d): %v", keyId, err) | |||
log.GitLogger.Fatal(2, "Fail to get user by key ID(%d): %v", keyId, err) | |||
} | |||
cmd := os.Getenv("SSH_ORIGINAL_COMMAND") | |||
@@ -110,7 +111,7 @@ func runServ(k *cli.Context) { | |||
rr := strings.SplitN(repoPath, "/", 2) | |||
if len(rr) != 2 { | |||
println("Gogs: unavailable repository", args) | |||
log.GitLogger.Fatal("Unavailable repository: %v", args) | |||
log.GitLogger.Fatal(2, "Unavailable repository: %v", args) | |||
} | |||
repoUserName := rr[0] | |||
repoName := strings.TrimSuffix(rr[1], ".git") | |||
@@ -122,10 +123,10 @@ func runServ(k *cli.Context) { | |||
if err != nil { | |||
if err == models.ErrUserNotExist { | |||
println("Gogs: given repository owner are not registered") | |||
log.GitLogger.Fatal("Unregistered owner: %s", repoUserName) | |||
log.GitLogger.Fatal(2, "Unregistered owner: %s", repoUserName) | |||
} | |||
println("Gogs: internal error:", err) | |||
log.GitLogger.Fatal("Fail to get repository owner(%s): %v", repoUserName, err) | |||
log.GitLogger.Fatal(2, "Fail to get repository owner(%s): %v", repoUserName, err) | |||
} | |||
// Access check. | |||
@@ -134,20 +135,20 @@ func runServ(k *cli.Context) { | |||
has, err := models.HasAccess(user.Name, path.Join(repoUserName, repoName), models.WRITABLE) | |||
if err != nil { | |||
println("Gogs: internal error:", err) | |||
log.GitLogger.Fatal("Fail to check write access:", err) | |||
log.GitLogger.Fatal(2, "Fail to check write access:", err) | |||
} else if !has { | |||
println("You have no right to write this repository") | |||
log.GitLogger.Fatal("User %s has no right to write repository %s", user.Name, repoPath) | |||
log.GitLogger.Fatal(2, "User %s has no right to write repository %s", user.Name, repoPath) | |||
} | |||
case isRead: | |||
repo, err := models.GetRepositoryByName(repoUser.Id, repoName) | |||
if err != nil { | |||
if err == models.ErrRepoNotExist { | |||
println("Gogs: given repository does not exist") | |||
log.GitLogger.Fatal("Repository does not exist: %s/%s", repoUser.Name, repoName) | |||
log.GitLogger.Fatal(2, "Repository does not exist: %s/%s", repoUser.Name, repoName) | |||
} | |||
println("Gogs: internal error:", err) | |||
log.GitLogger.Fatal("Fail to get repository: %v", err) | |||
log.GitLogger.Fatal(2, "Fail to get repository: %v", err) | |||
} | |||
if !repo.IsPrivate { | |||
@@ -157,10 +158,10 @@ func runServ(k *cli.Context) { | |||
has, err := models.HasAccess(user.Name, path.Join(repoUserName, repoName), models.READABLE) | |||
if err != nil { | |||
println("Gogs: internal error:", err) | |||
log.GitLogger.Fatal("Fail to check read access:", err) | |||
log.GitLogger.Fatal(2, "Fail to check read access:", err) | |||
} else if !has { | |||
println("You have no right to access this repository") | |||
log.GitLogger.Fatal("User %s has no right to read repository %s", user.Name, repoPath) | |||
log.GitLogger.Fatal(2, "User %s has no right to read repository %s", user.Name, repoPath) | |||
} | |||
default: | |||
println("Unknown command") | |||
@@ -175,29 +176,27 @@ func runServ(k *cli.Context) { | |||
gitcmd.Stdout = os.Stdout | |||
gitcmd.Stdin = os.Stdin | |||
gitcmd.Stderr = os.Stderr | |||
err = gitcmd.Run() | |||
if err != nil { | |||
println("Gogs: internal error:", err) | |||
log.GitLogger.Fatal("Fail to execute git command: %v", err) | |||
if err = gitcmd.Run(); err != nil { | |||
println("Gogs: internal error:", err.Error()) | |||
log.GitLogger.Fatal(2, "Fail to execute git command: %v", err) | |||
} | |||
if isWrite { | |||
tasks, err := models.GetUpdateTasksByUuid(uuid) | |||
if err != nil { | |||
log.GitLogger.Fatal("Fail to get update task: %v", err) | |||
log.GitLogger.Fatal(2, "Fail to get update task: %v", err) | |||
} | |||
for _, task := range tasks { | |||
err = models.Update(task.RefName, task.OldCommitId, task.NewCommitId, | |||
user.Name, repoUserName, repoName, user.Id) | |||
if err != nil { | |||
log.GitLogger.Fatal("Fail to update: %v", err) | |||
log.GitLogger.Fatal(2, "Fail to update: %v", err) | |||
} | |||
} | |||
err = models.DelUpdateTasksByUuid(uuid) | |||
if err != nil { | |||
log.GitLogger.Fatal("Fail to del update task: %v", err) | |||
if err = models.DelUpdateTasksByUuid(uuid); err != nil { | |||
log.GitLogger.Fatal(2, "Fail to del update task: %v", err) | |||
} | |||
} | |||
} |
@@ -8,6 +8,7 @@ import ( | |||
"os" | |||
"github.com/codegangsta/cli" | |||
"github.com/gogits/gogs/models" | |||
"github.com/gogits/gogs/modules/log" | |||
) | |||
@@ -30,9 +31,9 @@ func runUpdate(c *cli.Context) { | |||
args := c.Args() | |||
if len(args) != 3 { | |||
log.GitLogger.Fatal("received less 3 parameters") | |||
log.GitLogger.Fatal(2, "received less 3 parameters") | |||
} else if args[0] == "" { | |||
log.GitLogger.Fatal("refName is empty, shouldn't use") | |||
log.GitLogger.Fatal(2, "refName is empty, shouldn't use") | |||
} | |||
uuid := os.Getenv("uuid") | |||
@@ -45,6 +46,6 @@ func runUpdate(c *cli.Context) { | |||
} | |||
if err := models.AddUpdateTask(&task); err != nil { | |||
log.GitLogger.Fatal(err.Error()) | |||
log.GitLogger.Fatal(2, err.Error()) | |||
} | |||
} |
@@ -12,13 +12,16 @@ import ( | |||
"os" | |||
"path" | |||
"github.com/Unknwon/macaron" | |||
"github.com/codegangsta/cli" | |||
"github.com/go-martini/martini" | |||
"github.com/macaron-contrib/i18n" | |||
"github.com/macaron-contrib/session" | |||
"github.com/gogits/gogs/modules/auth" | |||
"github.com/gogits/gogs/modules/auth/apiv1" | |||
"github.com/gogits/gogs/modules/avatar" | |||
"github.com/gogits/gogs/modules/base" | |||
"github.com/gogits/gogs/modules/captcha" | |||
"github.com/gogits/gogs/modules/log" | |||
"github.com/gogits/gogs/modules/middleware" | |||
"github.com/gogits/gogs/modules/middleware/binding" | |||
@@ -27,7 +30,7 @@ import ( | |||
"github.com/gogits/gogs/routers/admin" | |||
"github.com/gogits/gogs/routers/api/v1" | |||
"github.com/gogits/gogs/routers/dev" | |||
"github.com/gogits/gogs/routers/org" | |||
// "github.com/gogits/gogs/routers/org" | |||
"github.com/gogits/gogs/routers/repo" | |||
"github.com/gogits/gogs/routers/user" | |||
) | |||
@@ -43,61 +46,72 @@ and it takes care of all the other things for you`, | |||
// checkVersion checks if binary matches the version of temolate files. | |||
func checkVersion() { | |||
data, err := ioutil.ReadFile(path.Join(setting.StaticRootPath, "templates/VERSION")) | |||
data, err := ioutil.ReadFile(path.Join(setting.StaticRootPath, "templates/.VERSION")) | |||
if err != nil { | |||
log.Fatal("Fail to read 'templates/VERSION': %v", err) | |||
log.Fatal(4, "Fail to read 'templates/.VERSION': %v", err) | |||
} | |||
if string(data) != setting.AppVer { | |||
log.Fatal("Binary and template file version does not match, did you forget to recompile?") | |||
log.Fatal(4, "Binary and template file version does not match, did you forget to recompile?") | |||
} | |||
} | |||
func newMartini() *martini.ClassicMartini { | |||
r := martini.NewRouter() | |||
m := martini.New() | |||
m.Use(middleware.Logger()) | |||
m.Use(martini.Recovery()) | |||
m.Use(middleware.Static("public", | |||
middleware.StaticOptions{SkipLogging: !setting.DisableRouterLog})) | |||
m.MapTo(r, (*martini.Routes)(nil)) | |||
m.Action(r.Handle) | |||
return &martini.ClassicMartini{m, r} | |||
// newMacaron initializes Macaron instance. | |||
func newMacaron() *macaron.Macaron { | |||
m := macaron.New() | |||
m.Use(macaron.Logger()) | |||
m.Use(macaron.Recovery()) | |||
if setting.EnableGzip { | |||
m.Use(macaron.Gzip()) | |||
} | |||
m.Use(macaron.Static("public", | |||
macaron.StaticOptions{ | |||
SkipLogging: !setting.DisableRouterLog, | |||
}, | |||
)) | |||
m.Use(macaron.Renderer(macaron.RenderOptions{ | |||
Directory: path.Join(setting.StaticRootPath, "templates"), | |||
Funcs: []template.FuncMap{base.TemplateFuncs}, | |||
IndentJSON: macaron.Env != macaron.PROD, | |||
})) | |||
m.Use(i18n.I18n(i18n.LocaleOptions{ | |||
Langs: setting.Langs, | |||
Names: setting.Names, | |||
Redirect: true, | |||
})) | |||
m.Use(session.Sessioner(session.Options{ | |||
Provider: setting.SessionProvider, | |||
Config: *setting.SessionConfig, | |||
})) | |||
m.Use(middleware.Contexter()) | |||
return m | |||
} | |||
func runWeb(*cli.Context) { | |||
routers.GlobalInit() | |||
checkVersion() | |||
m := newMartini() | |||
// Middlewares. | |||
m.Use(middleware.Renderer(middleware.RenderOptions{ | |||
Directory: path.Join(setting.StaticRootPath, "templates"), | |||
Funcs: []template.FuncMap{base.TemplateFuncs}, | |||
IndentJSON: true, | |||
})) | |||
m.Use(middleware.InitContext()) | |||
m := newMacaron() | |||
reqSignIn := middleware.Toggle(&middleware.ToggleOptions{SignInRequire: true}) | |||
ignSignIn := middleware.Toggle(&middleware.ToggleOptions{SignInRequire: setting.Service.RequireSignInView}) | |||
ignSignInAndCsrf := middleware.Toggle(&middleware.ToggleOptions{DisableCsrf: true}) | |||
reqSignOut := middleware.Toggle(&middleware.ToggleOptions{SignOutRequire: true}) | |||
bindIgnErr := binding.BindIgnErr | |||
// Routers. | |||
m.Get("/", ignSignIn, routers.Home) | |||
m.Get("/install", bindIgnErr(auth.InstallForm{}), routers.Install) | |||
m.Post("/install", bindIgnErr(auth.InstallForm{}), routers.InstallPost) | |||
m.Group("", func(r martini.Router) { | |||
// m.Get("/install", bindIgnErr(auth.InstallForm{}), routers.Install) | |||
// m.Post("/install", bindIgnErr(auth.InstallForm{}), routers.InstallPost) | |||
m.Group("", func(r *macaron.Router) { | |||
r.Get("/issues", user.Issues) | |||
r.Get("/pulls", user.Pulls) | |||
r.Get("/stars", user.Stars) | |||
}, reqSignIn) | |||
m.Group("/api", func(_ martini.Router) { | |||
m.Group("/v1", func(r martini.Router) { | |||
// API routers. | |||
m.Group("/api", func(_ *macaron.Router) { | |||
m.Group("/v1", func(r *macaron.Router) { | |||
// Miscellaneous. | |||
r.Post("/markdown", bindIgnErr(apiv1.MarkdownForm{}), v1.Markdown) | |||
r.Post("/markdown/raw", v1.MarkdownRaw) | |||
@@ -118,58 +132,62 @@ func runWeb(*cli.Context) { | |||
os.MkdirAll("public/img/avatar/", os.ModePerm) | |||
m.Get("/avatar/:hash", avt.ServeHTTP) | |||
m.Group("/user", func(r martini.Router) { | |||
// User routers. | |||
m.Group("/user", func(r *macaron.Router) { | |||
r.Get("/login", user.SignIn) | |||
r.Post("/login", bindIgnErr(auth.LogInForm{}), user.SignInPost) | |||
r.Post("/login", bindIgnErr(auth.SignInForm{}), user.SignInPost) | |||
r.Get("/login/:name", user.SocialSignIn) | |||
r.Get("/sign_up", user.SignUp) | |||
r.Post("/sign_up", bindIgnErr(auth.RegisterForm{}), user.SignUpPost) | |||
r.Get("/reset_password", user.ResetPasswd) | |||
r.Post("/reset_password", user.ResetPasswdPost) | |||
}, reqSignOut) | |||
m.Group("/user", func(r martini.Router) { | |||
r.Get("/delete", user.Delete) | |||
r.Post("/delete", user.DeletePost) | |||
r.Get("/settings", user.Setting) | |||
r.Post("/settings", bindIgnErr(auth.UpdateProfileForm{}), user.SettingPost) | |||
m.Group("/user", func(r *macaron.Router) { | |||
r.Get("/settings", user.Settings) | |||
r.Post("/settings", bindIgnErr(auth.UpdateProfileForm{}), user.SettingsPost) | |||
m.Group("/settings", func(r *macaron.Router) { | |||
r.Get("/password", user.SettingsPassword) | |||
r.Post("/password", bindIgnErr(auth.ChangePasswordForm{}), user.SettingsPasswordPost) | |||
r.Get("/ssh", user.SettingsSSHKeys) | |||
r.Post("/ssh", bindIgnErr(auth.AddSSHKeyForm{}), user.SettingsSSHKeysPost) | |||
r.Get("/social", user.SettingsSocial) | |||
r.Route("/delete", "GET,POST", user.SettingsDelete) | |||
}) | |||
}, reqSignIn) | |||
m.Group("/user", func(r martini.Router) { | |||
r.Get("/feeds", binding.Bind(auth.FeedsForm{}), user.Feeds) | |||
m.Group("/user", func(r *macaron.Router) { | |||
// r.Get("/feeds", binding.Bind(auth.FeedsForm{}), user.Feeds) | |||
r.Any("/activate", user.Activate) | |||
r.Get("/email2user", user.Email2User) | |||
r.Get("/forget_password", user.ForgotPasswd) | |||
r.Post("/forget_password", user.ForgotPasswdPost) | |||
r.Get("/logout", user.SignOut) | |||
}) | |||
m.Group("/user/settings", func(r martini.Router) { | |||
r.Get("/social", user.SettingSocial) | |||
r.Get("/password", user.SettingPassword) | |||
r.Post("/password", bindIgnErr(auth.UpdatePasswdForm{}), user.SettingPasswordPost) | |||
r.Any("/ssh", bindIgnErr(auth.AddSSHKeyForm{}), user.SettingSSHKeys) | |||
r.Get("/notification", user.SettingNotification) | |||
r.Get("/security", user.SettingSecurity) | |||
}, reqSignIn) | |||
m.Get("/user/:username", ignSignIn, user.Profile) | |||
m.Get("/user/:username", ignSignIn, user.Profile) // TODO: Legacy | |||
// Captcha service. | |||
cpt := captcha.NewCaptcha("/captcha/", setting.Cache) | |||
m.Map(cpt) | |||
m.Get("/captcha/*", cpt.Handler) | |||
m.Group("/repo", func(r martini.Router) { | |||
m.Group("/repo", func(r *macaron.Router) { | |||
r.Get("/create", repo.Create) | |||
r.Post("/create", bindIgnErr(auth.CreateRepoForm{}), repo.CreatePost) | |||
r.Get("/migrate", repo.Migrate) | |||
r.Post("/migrate", bindIgnErr(auth.MigrateRepoForm{}), repo.MigratePost) | |||
// r.Get("/migrate", repo.Migrate) | |||
// r.Post("/migrate", bindIgnErr(auth.MigrateRepoForm{}), repo.MigratePost) | |||
}, reqSignIn) | |||
adminReq := middleware.Toggle(&middleware.ToggleOptions{SignInRequire: true, AdminRequire: true}) | |||
m.Get("/admin", adminReq, admin.Dashboard) | |||
m.Group("/admin", func(r martini.Router) { | |||
m.Group("/admin", func(r *macaron.Router) { | |||
r.Get("/users", admin.Users) | |||
r.Get("/repos", admin.Repositories) | |||
r.Get("/auths", admin.Auths) | |||
r.Get("/config", admin.Config) | |||
r.Get("/monitor", admin.Monitor) | |||
}, adminReq) | |||
m.Group("/admin/users", func(r martini.Router) { | |||
m.Group("/admin/users", func(r *macaron.Router) { | |||
r.Get("/new", admin.NewUser) | |||
r.Post("/new", bindIgnErr(auth.RegisterForm{}), admin.NewUserPost) | |||
r.Get("/:userid", admin.EditUser) | |||
@@ -177,7 +195,7 @@ func runWeb(*cli.Context) { | |||
r.Get("/:userid/delete", admin.DeleteUser) | |||
}, adminReq) | |||
m.Group("/admin/auths", func(r martini.Router) { | |||
m.Group("/admin/auths", func(r *macaron.Router) { | |||
r.Get("/new", admin.NewAuthSource) | |||
r.Post("/new", bindIgnErr(auth.AuthenticationForm{}), admin.NewAuthSourcePost) | |||
r.Get("/:authid", admin.EditAuthSource) | |||
@@ -187,103 +205,104 @@ func runWeb(*cli.Context) { | |||
m.Get("/:username", ignSignIn, user.Profile) | |||
if martini.Env == martini.Dev { | |||
if macaron.Env == macaron.DEV { | |||
m.Get("/template/**", dev.TemplatePreview) | |||
dev.RegisterDebugRoutes(m) | |||
} | |||
reqTrueOwner := middleware.RequireTrueOwner() | |||
m.Group("/org", func(r martini.Router) { | |||
r.Get("/create", org.New) | |||
r.Post("/create", bindIgnErr(auth.CreateOrgForm{}), org.NewPost) | |||
r.Get("/:org", org.Home) | |||
r.Get("/:org/dashboard", org.Dashboard) | |||
r.Get("/:org/members", org.Members) | |||
r.Get("/:org/teams", org.Teams) | |||
r.Get("/:org/teams/new", org.NewTeam) | |||
r.Post("/:org/teams/new", bindIgnErr(auth.CreateTeamForm{}), org.NewTeamPost) | |||
r.Get("/:org/teams/:team/edit", org.EditTeam) | |||
r.Get("/:org/team/:team", org.SingleTeam) | |||
r.Get("/:org/settings", org.Settings) | |||
r.Post("/:org/settings", bindIgnErr(auth.OrgSettingForm{}), org.SettingsPost) | |||
r.Post("/:org/settings/delete", org.DeletePost) | |||
}, reqSignIn) | |||
m.Group("/:username/:reponame", func(r martini.Router) { | |||
r.Get("/settings", repo.Setting) | |||
r.Post("/settings", bindIgnErr(auth.RepoSettingForm{}), repo.SettingPost) | |||
m.Group("/settings", func(r martini.Router) { | |||
r.Get("/collaboration", repo.Collaboration) | |||
r.Post("/collaboration", repo.CollaborationPost) | |||
r.Get("/hooks", repo.WebHooks) | |||
r.Get("/hooks/add", repo.WebHooksAdd) | |||
r.Post("/hooks/add", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksAddPost) | |||
r.Get("/hooks/:id", repo.WebHooksEdit) | |||
r.Post("/hooks/:id", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksEditPost) | |||
}) | |||
}, reqSignIn, middleware.RepoAssignment(true), reqTrueOwner) | |||
m.Group("/:username/:reponame", func(r martini.Router) { | |||
r.Get("/action/:action", repo.Action) | |||
m.Group("/issues", func(r martini.Router) { | |||
r.Get("/new", repo.CreateIssue) | |||
r.Post("/new", bindIgnErr(auth.CreateIssueForm{}), repo.CreateIssuePost) | |||
r.Post("/:index", bindIgnErr(auth.CreateIssueForm{}), repo.UpdateIssue) | |||
r.Post("/:index/label", repo.UpdateIssueLabel) | |||
r.Post("/:index/milestone", repo.UpdateIssueMilestone) | |||
r.Post("/:index/assignee", repo.UpdateAssignee) | |||
r.Get("/:index/attachment/:id", repo.IssueGetAttachment) | |||
r.Post("/labels/new", bindIgnErr(auth.CreateLabelForm{}), repo.NewLabel) | |||
r.Post("/labels/edit", bindIgnErr(auth.CreateLabelForm{}), repo.UpdateLabel) | |||
r.Post("/labels/delete", repo.DeleteLabel) | |||
r.Get("/milestones", repo.Milestones) | |||
r.Get("/milestones/new", repo.NewMilestone) | |||
r.Post("/milestones/new", bindIgnErr(auth.CreateMilestoneForm{}), repo.NewMilestonePost) | |||
r.Get("/milestones/:index/edit", repo.UpdateMilestone) | |||
r.Post("/milestones/:index/edit", bindIgnErr(auth.CreateMilestoneForm{}), repo.UpdateMilestonePost) | |||
r.Get("/milestones/:index/:action", repo.UpdateMilestone) | |||
}) | |||
r.Post("/comment/:action", repo.Comment) | |||
r.Get("/releases/new", repo.NewRelease) | |||
r.Get("/releases/edit/:tagname", repo.EditRelease) | |||
}, reqSignIn, middleware.RepoAssignment(true)) | |||
m.Group("/:username/:reponame", func(r martini.Router) { | |||
r.Post("/releases/new", bindIgnErr(auth.NewReleaseForm{}), repo.NewReleasePost) | |||
r.Post("/releases/edit/:tagname", bindIgnErr(auth.EditReleaseForm{}), repo.EditReleasePost) | |||
}, reqSignIn, middleware.RepoAssignment(true, true)) | |||
m.Group("/:username/:reponame", func(r martini.Router) { | |||
r.Get("/issues", repo.Issues) | |||
r.Get("/issues/:index", repo.ViewIssue) | |||
r.Get("/pulls", repo.Pulls) | |||
r.Get("/branches", repo.Branches) | |||
}, ignSignIn, middleware.RepoAssignment(true)) | |||
m.Group("/:username/:reponame", func(r martini.Router) { | |||
r.Get("/src/:branchname", repo.Single) | |||
r.Get("/src/:branchname/**", repo.Single) | |||
// reqTrueOwner := middleware.RequireTrueOwner() | |||
// m.Group("/org", func(r *macaron.Router) { | |||
// r.Get("/create", org.New) | |||
// r.Post("/create", bindIgnErr(auth.CreateOrgForm{}), org.NewPost) | |||
// r.Get("/:org", org.Home) | |||
// r.Get("/:org/dashboard", org.Dashboard) | |||
// r.Get("/:org/members", org.Members) | |||
// r.Get("/:org/teams", org.Teams) | |||
// r.Get("/:org/teams/new", org.NewTeam) | |||
// r.Post("/:org/teams/new", bindIgnErr(auth.CreateTeamForm{}), org.NewTeamPost) | |||
// r.Get("/:org/teams/:team/edit", org.EditTeam) | |||
// r.Get("/:org/team/:team", org.SingleTeam) | |||
// r.Get("/:org/settings", org.Settings) | |||
// r.Post("/:org/settings", bindIgnErr(auth.OrgSettingForm{}), org.SettingsPost) | |||
// r.Post("/:org/settings/delete", org.DeletePost) | |||
// }, reqSignIn) | |||
// m.Group("/:username/:reponame", func(r *macaron.Router) { | |||
// r.Get("/settings", repo.Setting) | |||
// r.Post("/settings", bindIgnErr(auth.RepoSettingForm{}), repo.SettingPost) | |||
// m.Group("/settings", func(r *macaron.Router) { | |||
// r.Get("/collaboration", repo.Collaboration) | |||
// r.Post("/collaboration", repo.CollaborationPost) | |||
// r.Get("/hooks", repo.WebHooks) | |||
// r.Get("/hooks/add", repo.WebHooksAdd) | |||
// r.Post("/hooks/add", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksAddPost) | |||
// r.Get("/hooks/:id", repo.WebHooksEdit) | |||
// r.Post("/hooks/:id", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksEditPost) | |||
// }) | |||
// }, reqSignIn, middleware.RepoAssignment(true), reqTrueOwner) | |||
// m.Group("/:username/:reponame", func(r *macaron.Router) { | |||
// r.Get("/action/:action", repo.Action) | |||
// m.Group("/issues", func(r *macaron.Router) { | |||
// r.Get("/new", repo.CreateIssue) | |||
// r.Post("/new", bindIgnErr(auth.CreateIssueForm{}), repo.CreateIssuePost) | |||
// r.Post("/:index", bindIgnErr(auth.CreateIssueForm{}), repo.UpdateIssue) | |||
// r.Post("/:index/label", repo.UpdateIssueLabel) | |||
// r.Post("/:index/milestone", repo.UpdateIssueMilestone) | |||
// r.Post("/:index/assignee", repo.UpdateAssignee) | |||
// r.Get("/:index/attachment/:id", repo.IssueGetAttachment) | |||
// r.Post("/labels/new", bindIgnErr(auth.CreateLabelForm{}), repo.NewLabel) | |||
// r.Post("/labels/edit", bindIgnErr(auth.CreateLabelForm{}), repo.UpdateLabel) | |||
// r.Post("/labels/delete", repo.DeleteLabel) | |||
// r.Get("/milestones", repo.Milestones) | |||
// r.Get("/milestones/new", repo.NewMilestone) | |||
// r.Post("/milestones/new", bindIgnErr(auth.CreateMilestoneForm{}), repo.NewMilestonePost) | |||
// r.Get("/milestones/:index/edit", repo.UpdateMilestone) | |||
// r.Post("/milestones/:index/edit", bindIgnErr(auth.CreateMilestoneForm{}), repo.UpdateMilestonePost) | |||
// r.Get("/milestones/:index/:action", repo.UpdateMilestone) | |||
// }) | |||
// r.Post("/comment/:action", repo.Comment) | |||
// r.Get("/releases/new", repo.NewRelease) | |||
// r.Get("/releases/edit/:tagname", repo.EditRelease) | |||
// }, reqSignIn, middleware.RepoAssignment(true)) | |||
// m.Group("/:username/:reponame", func(r *macaron.Router) { | |||
// r.Post("/releases/new", bindIgnErr(auth.NewReleaseForm{}), repo.NewReleasePost) | |||
// r.Post("/releases/edit/:tagname", bindIgnErr(auth.EditReleaseForm{}), repo.EditReleasePost) | |||
// }, reqSignIn, middleware.RepoAssignment(true, true)) | |||
// m.Group("/:username/:reponame", func(r *macaron.Router) { | |||
// r.Get("/issues", repo.Issues) | |||
// r.Get("/issues/:index", repo.ViewIssue) | |||
// r.Get("/pulls", repo.Pulls) | |||
// r.Get("/branches", repo.Branches) | |||
// }, ignSignIn, middleware.RepoAssignment(true)) | |||
m.Group("/:username/:reponame", func(r *macaron.Router) { | |||
r.Get("/src/:branchname", repo.Home) | |||
r.Get("/src/:branchname/*", repo.Home) | |||
r.Get("/raw/:branchname/**", repo.SingleDownload) | |||
r.Get("/commits/:branchname", repo.Commits) | |||
r.Get("/commits/:branchname/search", repo.SearchCommits) | |||
r.Get("/commits/:branchname/**", repo.FileHistory) | |||
r.Get("/commit/:branchname", repo.Diff) | |||
r.Get("/commit/:branchname/**", repo.Diff) | |||
r.Get("/releases", repo.Releases) | |||
r.Get("/archive/:branchname/:reponame.zip", repo.ZipDownload) | |||
r.Get("/archive/:branchname/:reponame.tar.gz", repo.TarGzDownload) | |||
// r.Get("/commits/:branchname", repo.Commits) | |||
// r.Get("/commits/:branchname/search", repo.SearchCommits) | |||
// r.Get("/commits/:branchname/**", repo.FileHistory) | |||
// r.Get("/commit/:branchname", repo.Diff) | |||
// r.Get("/commit/:branchname/**", repo.Diff) | |||
// r.Get("/releases", repo.Releases) | |||
r.Get("/archive/*.*", repo.Download) | |||
}, ignSignIn, middleware.RepoAssignment(true, true)) | |||
m.Group("/:username", func(r martini.Router) { | |||
r.Get("/:reponame", middleware.RepoAssignment(true, true, true), repo.Single) | |||
r.Any("/:reponame/**", repo.Http) | |||
m.Group("/:username", func(r *macaron.Router) { | |||
r.Get("/:reponame", middleware.RepoAssignment(true, true, true), repo.Home) | |||
m.Group("/:reponame", func(r *macaron.Router) { | |||
r.Any("/*", repo.Http) | |||
}) | |||
}, ignSignInAndCsrf) | |||
// Not found handler. | |||
@@ -298,10 +317,10 @@ func runWeb(*cli.Context) { | |||
case setting.HTTPS: | |||
err = http.ListenAndServeTLS(listenAddr, setting.CertFile, setting.KeyFile, m) | |||
default: | |||
log.Fatal("Invalid protocol: %s", setting.Protocol) | |||
log.Fatal(4, "Invalid protocol: %s", setting.Protocol) | |||
} | |||
if err != nil { | |||
log.Fatal("Fail to start server: %v", err) | |||
log.Fatal(4, "Fail to start server: %v", err) | |||
} | |||
} |
@@ -1,9 +0,0 @@ | |||
## NOTICE | |||
This directory only used for development, and us [go-bindata](https://github.com/jteeuwen/go-bindata) to store in memory for releases. | |||
To apply any change in this directory, install [go-bindata](https://github.com/jteeuwen/go-bindata), and then execute following command in root of source directory: | |||
``` | |||
$ go-bindata -ignore="\\.DS_Store|README.md" -o modules/bin/conf.go -pkg="bin" conf/... | |||
``` |
@@ -28,6 +28,8 @@ KEY_FILE = custom/https/key.pem | |||
; Upper level of template and static file path | |||
; default is the path where Gogs is executed | |||
STATIC_ROOT_PATH = | |||
; Application level GZIP support | |||
ENABLE_GZIP = false | |||
[database] | |||
; Either "mysql", "postgres" or "sqlite3", it's your choice | |||
@@ -125,14 +127,6 @@ SCOPES = all | |||
AUTH_URL = https://open.t.qq.com/cgi-bin/oauth2/authorize | |||
TOKEN_URL = https://open.t.qq.com/cgi-bin/oauth2/access_token | |||
[oauth.twitter] | |||
ENABLED = false | |||
CLIENT_ID = | |||
CLIENT_SECRET = | |||
SCOPES = all | |||
AUTH_URL = https://api.twitter.com/oauth/authorize | |||
TOKEN_URL = https://api.twitter.com/oauth/access_token | |||
[oauth.weibo] | |||
ENABLED = false | |||
CLIENT_ID = | |||
@@ -147,8 +141,8 @@ ADAPTER = memory | |||
; For "memory" only, GC interval in seconds, default is 60 | |||
INTERVAL = 60 | |||
; For "redis" and "memcache", connection host address | |||
; redis: ":6039" | |||
; memcache: "127.0.0.1:11211" | |||
; redis: `:6039` | |||
; memcache: `127.0.0.1:11211` | |||
HOST = | |||
[session] | |||
@@ -156,9 +150,9 @@ HOST = | |||
PROVIDER = file | |||
; Provider config options | |||
; memory: not have any config yet | |||
; file: session file path, e.g. "data/sessions" | |||
; redis: config like redis server addr, poolSize, password, e.g. "127.0.0.1:6379,100,astaxie" | |||
; mysql: go-sql-driver/mysql dsn config string, e.g. "root:password@/session_table" | |||
; file: session file path, e.g. `data/sessions` | |||
; redis: config like redis server addr, poolSize, password, e.g. `127.0.0.1:6379,100,gogs` | |||
; mysql: go-sql-driver/mysql dsn config string, e.g. `root:password@/session_table` | |||
PROVIDER_CONFIG = data/sessions | |||
; Session cookie name | |||
COOKIE_NAME = i_like_gogits | |||
@@ -182,15 +176,15 @@ DISABLE_GRAVATAR = false | |||
[attachment] | |||
; Whether attachments are enabled. Defaults to `true` | |||
ENABLE = | |||
; Path for attachments. Defaults to files/attachments | |||
PATH = | |||
ENABLE = true | |||
; Path for attachments. Defaults to `data/attachments` | |||
PATH = data/attachments | |||
; One or more allowed types, e.g. image/jpeg|image/png | |||
ALLOWED_TYPES = | |||
ALLOWED_TYPES = image/jpeg|image/png | |||
; Max size of each file. Defaults to 32MB | |||
MAX_SIZE | |||
MAX_SIZE = 32 | |||
; Max number of files per upload. Defaults to 10 | |||
MAX_FILES = | |||
MAX_FILES = 10 | |||
[log] | |||
ROOT_PATH = | |||
@@ -209,7 +203,6 @@ LEVEL = | |||
; For "file" mode only | |||
[log.file] | |||
LEVEL = | |||
FILE_NAME = log/gogs.log | |||
; This enables automated log rotate(switch of following options), default is true | |||
LOG_ROTATE = true | |||
; Max line number of single file, default is 1000000 | |||
@@ -253,3 +246,7 @@ LEVEL = | |||
DRIVER = | |||
; Based on xorm, e.g.: root:root@localhost/gogs?charset=utf8 | |||
CONN = | |||
[i18n] | |||
LANGS = en-US,zh-CN | |||
NAMES = English,简体中文 |
@@ -0,0 +1,23 @@ | |||
Copyright (c) 2014 | |||
All rights reserved. | |||
Redistribution and use in source and binary forms, with or without | |||
modification, are permitted provided that the following conditions are met: | |||
* Redistributions of source code must retain the above copyright notice, this | |||
list of conditions and the following disclaimer. | |||
* Redistributions in binary form must reproduce the above copyright notice, | |||
this list of conditions and the following disclaimer in the documentation | |||
and/or other materials provided with the distribution. | |||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | |||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | |||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
@@ -0,0 +1,116 @@ | |||
CC0 1.0 Universal | |||
Statement of Purpose | |||
The laws of most jurisdictions throughout the world automatically confer | |||
exclusive Copyright and Related Rights (defined below) upon the creator and | |||
subsequent owner(s) (each and all, an "owner") of an original work of | |||
authorship and/or a database (each, a "Work"). | |||
Certain owners wish to permanently relinquish those rights to a Work for the | |||
purpose of contributing to a commons of creative, cultural and scientific | |||
works ("Commons") that the public can reliably and without fear of later | |||
claims of infringement build upon, modify, incorporate in other works, reuse | |||
and redistribute as freely as possible in any form whatsoever and for any | |||
purposes, including without limitation commercial purposes. These owners may | |||
contribute to the Commons to promote the ideal of a free culture and the | |||
further production of creative, cultural and scientific works, or to gain | |||
reputation or greater distribution for their Work in part through the use and | |||
efforts of others. | |||
For these and/or other purposes and motivations, and without any expectation | |||
of additional consideration or compensation, the person associating CC0 with a | |||
Work (the "Affirmer"), to the extent that he or she is an owner of Copyright | |||
and Related Rights in the Work, voluntarily elects to apply CC0 to the Work | |||
and publicly distribute the Work under its terms, with knowledge of his or her | |||
Copyright and Related Rights in the Work and the meaning and intended legal | |||
effect of CC0 on those rights. | |||
1. Copyright and Related Rights. A Work made available under CC0 may be | |||
protected by copyright and related or neighboring rights ("Copyright and | |||
Related Rights"). Copyright and Related Rights include, but are not limited | |||
to, the following: | |||
i. the right to reproduce, adapt, distribute, perform, display, communicate, | |||
and translate a Work; | |||
ii. moral rights retained by the original author(s) and/or performer(s); | |||
iii. publicity and privacy rights pertaining to a person's image or likeness | |||
depicted in a Work; | |||
iv. rights protecting against unfair competition in regards to a Work, | |||
subject to the limitations in paragraph 4(a), below; | |||
v. rights protecting the extraction, dissemination, use and reuse of data in | |||
a Work; | |||
vi. database rights (such as those arising under Directive 96/9/EC of the | |||
European Parliament and of the Council of 11 March 1996 on the legal | |||
protection of databases, and under any national implementation thereof, | |||
including any amended or successor version of such directive); and | |||
vii. other similar, equivalent or corresponding rights throughout the world | |||
based on applicable law or treaty, and any national implementations thereof. | |||
2. Waiver. To the greatest extent permitted by, but not in contravention of, | |||
applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and | |||
unconditionally waives, abandons, and surrenders all of Affirmer's Copyright | |||
and Related Rights and associated claims and causes of action, whether now | |||
known or unknown (including existing as well as future claims and causes of | |||
action), in the Work (i) in all territories worldwide, (ii) for the maximum | |||
duration provided by applicable law or treaty (including future time | |||
extensions), (iii) in any current or future medium and for any number of | |||
copies, and (iv) for any purpose whatsoever, including without limitation | |||
commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes | |||
the Waiver for the benefit of each member of the public at large and to the | |||
detriment of Affirmer's heirs and successors, fully intending that such Waiver | |||
shall not be subject to revocation, rescission, cancellation, termination, or | |||
any other legal or equitable action to disrupt the quiet enjoyment of the Work | |||
by the public as contemplated by Affirmer's express Statement of Purpose. | |||
3. Public License Fallback. Should any part of the Waiver for any reason be | |||
judged legally invalid or ineffective under applicable law, then the Waiver | |||
shall be preserved to the maximum extent permitted taking into account | |||
Affirmer's express Statement of Purpose. In addition, to the extent the Waiver | |||
is so judged Affirmer hereby grants to each affected person a royalty-free, | |||
non transferable, non sublicensable, non exclusive, irrevocable and | |||
unconditional license to exercise Affirmer's Copyright and Related Rights in | |||
the Work (i) in all territories worldwide, (ii) for the maximum duration | |||
provided by applicable law or treaty (including future time extensions), (iii) | |||
in any current or future medium and for any number of copies, and (iv) for any | |||
purpose whatsoever, including without limitation commercial, advertising or | |||
promotional purposes (the "License"). The License shall be deemed effective as | |||
of the date CC0 was applied by Affirmer to the Work. Should any part of the | |||
License for any reason be judged legally invalid or ineffective under | |||
applicable law, such partial invalidity or ineffectiveness shall not | |||
invalidate the remainder of the License, and in such case Affirmer hereby | |||
affirms that he or she will not (i) exercise any of his or her remaining | |||
Copyright and Related Rights in the Work or (ii) assert any associated claims | |||
and causes of action with respect to the Work, in either case contrary to | |||
Affirmer's express Statement of Purpose. | |||
4. Limitations and Disclaimers. | |||
a. No trademark or patent rights held by Affirmer are waived, abandoned, | |||
surrendered, licensed or otherwise affected by this document. | |||
b. Affirmer offers the Work as-is and makes no representations or warranties | |||
of any kind concerning the Work, express, implied, statutory or otherwise, | |||
including without limitation warranties of title, merchantability, fitness | |||
for a particular purpose, non infringement, or the absence of latent or | |||
other defects, accuracy, or the present or absence of errors, whether or not | |||
discoverable, all to the greatest extent permissible under applicable law. | |||
c. Affirmer disclaims responsibility for clearing rights of other persons | |||
that may apply to the Work or any use thereof, including without limitation | |||
any person's Copyright and Related Rights in the Work. Further, Affirmer | |||
disclaims responsibility for obtaining any necessary consents, permissions | |||
or other rights required for any use of the Work. | |||
d. Affirmer understands and acknowledges that Creative Commons is not a | |||
party to this document and has no duty or obligation with respect to this | |||
CC0 or use of the Work. | |||
For more information, please see | |||
<http://creativecommons.org/publicdomain/zero/1.0/> |
@@ -0,0 +1,203 @@ | |||
Eclipse Public License - v 1.0 | |||
THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC | |||
LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM | |||
CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. | |||
1. DEFINITIONS | |||
"Contribution" means: | |||
a) in the case of the initial Contributor, the initial code and documentation | |||
distributed under this Agreement, and | |||
b) in the case of each subsequent Contributor: | |||
i) changes to the Program, and | |||
ii) additions to the Program; | |||
where such changes and/or additions to the Program originate from and are | |||
distributed by that particular Contributor. A Contribution 'originates' | |||
from a Contributor if it was added to the Program by such Contributor | |||
itself or anyone acting on such Contributor's behalf. Contributions do not | |||
include additions to the Program which: (i) are separate modules of | |||
software distributed in conjunction with the Program under their own | |||
license agreement, and (ii) are not derivative works of the Program. | |||
"Contributor" means any person or entity that distributes the Program. | |||
"Licensed Patents" mean patent claims licensable by a Contributor which are | |||
necessarily infringed by the use or sale of its Contribution alone or when | |||
combined with the Program. | |||
"Program" means the Contributions distributed in accordance with this | |||
Agreement. | |||
"Recipient" means anyone who receives the Program under this Agreement, | |||
including all Contributors. | |||
2. GRANT OF RIGHTS | |||
a) Subject to the terms of this Agreement, each Contributor hereby grants | |||
Recipient a non-exclusive, worldwide, royalty-free copyright license to | |||
reproduce, prepare derivative works of, publicly display, publicly | |||
perform, distribute and sublicense the Contribution of such Contributor, | |||
if any, and such derivative works, in source code and object code form. | |||
b) Subject to the terms of this Agreement, each Contributor hereby grants | |||
Recipient a non-exclusive, worldwide, royalty-free patent license under | |||
Licensed Patents to make, use, sell, offer to sell, import and otherwise | |||
transfer the Contribution of such Contributor, if any, in source code and | |||
object code form. This patent license shall apply to the combination of | |||
the Contribution and the Program if, at the time the Contribution is | |||
added by the Contributor, such addition of the Contribution causes such | |||
combination to be covered by the Licensed Patents. The patent license | |||
shall not apply to any other combinations which include the Contribution. | |||
No hardware per se is licensed hereunder. | |||
c) Recipient understands that although each Contributor grants the licenses | |||
to its Contributions set forth herein, no assurances are provided by any | |||
Contributor that the Program does not infringe the patent or other | |||
intellectual property rights of any other entity. Each Contributor | |||
disclaims any liability to Recipient for claims brought by any other | |||
entity based on infringement of intellectual property rights or | |||
otherwise. As a condition to exercising the rights and licenses granted | |||
hereunder, each Recipient hereby assumes sole responsibility to secure | |||
any other intellectual property rights needed, if any. For example, if a | |||
third party patent license is required to allow Recipient to distribute | |||
the Program, it is Recipient's responsibility to acquire that license | |||
before distributing the Program. | |||
d) Each Contributor represents that to its knowledge it has sufficient | |||
copyright rights in its Contribution, if any, to grant the copyright | |||
license set forth in this Agreement. | |||
3. REQUIREMENTS | |||
A Contributor may choose to distribute the Program in object code form under | |||
its own license agreement, provided that: | |||
a) it complies with the terms and conditions of this Agreement; and | |||
b) its license agreement: | |||
i) effectively disclaims on behalf of all Contributors all warranties | |||
and conditions, express and implied, including warranties or | |||
conditions of title and non-infringement, and implied warranties or | |||
conditions of merchantability and fitness for a particular purpose; | |||
ii) effectively excludes on behalf of all Contributors all liability for | |||
damages, including direct, indirect, special, incidental and | |||
consequential damages, such as lost profits; | |||
iii) states that any provisions which differ from this Agreement are | |||
offered by that Contributor alone and not by any other party; and | |||
iv) states that source code for the Program is available from such | |||
Contributor, and informs licensees how to obtain it in a reasonable | |||
manner on or through a medium customarily used for software exchange. | |||
When the Program is made available in source code form: | |||
a) it must be made available under this Agreement; and | |||
b) a copy of this Agreement must be included with each copy of the Program. | |||
Contributors may not remove or alter any copyright notices contained | |||
within the Program. | |||
Each Contributor must identify itself as the originator of its Contribution, | |||
if | |||
any, in a manner that reasonably allows subsequent Recipients to identify the | |||
originator of the Contribution. | |||
4. COMMERCIAL DISTRIBUTION | |||
Commercial distributors of software may accept certain responsibilities with | |||
respect to end users, business partners and the like. While this license is | |||
intended to facilitate the commercial use of the Program, the Contributor who | |||
includes the Program in a commercial product offering should do so in a manner | |||
which does not create potential liability for other Contributors. Therefore, | |||
if a Contributor includes the Program in a commercial product offering, such | |||
Contributor ("Commercial Contributor") hereby agrees to defend and indemnify | |||
every other Contributor ("Indemnified Contributor") against any losses, | |||
damages and costs (collectively "Losses") arising from claims, lawsuits and | |||
other legal actions brought by a third party against the Indemnified | |||
Contributor to the extent caused by the acts or omissions of such Commercial | |||
Contributor in connection with its distribution of the Program in a commercial | |||
product offering. The obligations in this section do not apply to any claims | |||
or Losses relating to any actual or alleged intellectual property | |||
infringement. In order to qualify, an Indemnified Contributor must: | |||
a) promptly notify the Commercial Contributor in writing of such claim, and | |||
b) allow the Commercial Contributor to control, and cooperate with the | |||
Commercial Contributor in, the defense and any related settlement | |||
negotiations. The Indemnified Contributor may participate in any such claim at | |||
its own expense. | |||
For example, a Contributor might include the Program in a commercial product | |||
offering, Product X. That Contributor is then a Commercial Contributor. If | |||
that Commercial Contributor then makes performance claims, or offers | |||
warranties related to Product X, those performance claims and warranties are | |||
such Commercial Contributor's responsibility alone. Under this section, the | |||
Commercial Contributor would have to defend claims against the other | |||
Contributors related to those performance claims and warranties, and if a | |||
court requires any other Contributor to pay any damages as a result, the | |||
Commercial Contributor must pay those damages. | |||
5. NO WARRANTY | |||
EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN | |||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR | |||
IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, | |||
NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each | |||
Recipient is solely responsible for determining the appropriateness of using | |||
and distributing the Program and assumes all risks associated with its | |||
exercise of rights under this Agreement , including but not limited to the | |||
risks and costs of program errors, compliance with applicable laws, damage to | |||
or loss of data, programs or equipment, and unavailability or interruption of | |||
operations. | |||
6. DISCLAIMER OF LIABILITY | |||
EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY | |||
CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION | |||
LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |||
ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE | |||
EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY | |||
OF SUCH DAMAGES. | |||
7. GENERAL | |||
If any provision of this Agreement is invalid or unenforceable under | |||
applicable law, it shall not affect the validity or enforceability of the | |||
remainder of the terms of this Agreement, and without further action by the | |||
parties hereto, such provision shall be reformed to the minimum extent | |||
necessary to make such provision valid and enforceable. | |||
If Recipient institutes patent litigation against any entity (including a | |||
cross-claim or counterclaim in a lawsuit) alleging that the Program itself | |||
(excluding combinations of the Program with other software or hardware) | |||
infringes such Recipient's patent(s), then such Recipient's rights granted | |||
under Section 2(b) shall terminate as of the date such litigation is filed. | |||
All Recipient's rights under this Agreement shall terminate if it fails to | |||
comply with any of the material terms or conditions of this Agreement and does | |||
not cure such failure in a reasonable period of time after becoming aware of | |||
such noncompliance. If all Recipient's rights under this Agreement terminate, | |||
Recipient agrees to cease use and distribution of the Program as soon as | |||
reasonably practicable. However, Recipient's obligations under this Agreement | |||
and any licenses granted by Recipient relating to the Program shall continue | |||
and survive. | |||
Everyone is permitted to copy and distribute copies of this Agreement, but in | |||
order to avoid inconsistency the Agreement is copyrighted and may only be | |||
modified in the following manner. The Agreement Steward reserves the right to | |||
publish new versions (including revisions) of this Agreement from time to | |||
time. No one other than the Agreement Steward has the right to modify this | |||
Agreement. The Eclipse Foundation is the initial Agreement Steward. The | |||
Eclipse Foundation may assign the responsibility to serve as the Agreement | |||
Steward to a suitable separate entity. Each new version of the Agreement will | |||
be given a distinguishing version number. The Program (including | |||
Contributions) may always be distributed subject to the version of the | |||
Agreement under which it was received. In addition, after a new version of the | |||
Agreement is published, Contributor may elect to distribute the Program | |||
(including its Contributions) under the new version. Except as expressly | |||
stated in Sections 2(a) and 2(b) above, Recipient receives no rights or | |||
licenses to the intellectual property of any Contributor under this Agreement, | |||
whether expressly, by implication, estoppel or otherwise. All rights in the | |||
Program not expressly granted under this Agreement are reserved. | |||
This Agreement is governed by the laws of the State of New York and the | |||
intellectual property laws of the United States of America. No party to this | |||
Agreement will bring a legal action under this Agreement more than one year | |||
after the cause of action arose. Each party waives its rights to a jury trial in | |||
any resulting litigation. |
@@ -0,0 +1,674 @@ | |||
GNU GENERAL PUBLIC LICENSE | |||
Version 3, 29 June 2007 | |||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> | |||
Everyone is permitted to copy and distribute verbatim copies | |||
of this license document, but changing it is not allowed. | |||
Preamble | |||
The GNU General Public License is a free, copyleft license for | |||
software and other kinds of works. | |||
The licenses for most software and other practical works are designed | |||
to take away your freedom to share and change the works. By contrast, | |||
the GNU General Public License is intended to guarantee your freedom to | |||
share and change all versions of a program--to make sure it remains free | |||
software for all its users. We, the Free Software Foundation, use the | |||
GNU General Public License for most of our software; it applies also to | |||
any other work released this way by its authors. You can apply it to | |||
your programs, too. | |||
When we speak of free software, we are referring to freedom, not | |||
price. Our General Public Licenses are designed to make sure that you | |||
have the freedom to distribute copies of free software (and charge for | |||
them if you wish), that you receive source code or can get it if you | |||
want it, that you can change the software or use pieces of it in new | |||
free programs, and that you know you can do these things. | |||
To protect your rights, we need to prevent others from denying you | |||
these rights or asking you to surrender the rights. Therefore, you have | |||
certain responsibilities if you distribute copies of the software, or if | |||
you modify it: responsibilities to respect the freedom of others. | |||
For example, if you distribute copies of such a program, whether | |||
gratis or for a fee, you must pass on to the recipients the same | |||
freedoms that you received. You must make sure that they, too, receive | |||
or can get the source code. And you must show them these terms so they | |||
know their rights. | |||
Developers that use the GNU GPL protect your rights with two steps: | |||
(1) assert copyright on the software, and (2) offer you this License | |||
giving you legal permission to copy, distribute and/or modify it. | |||
For the developers' and authors' protection, the GPL clearly explains | |||
that there is no warranty for this free software. For both users' and | |||
authors' sake, the GPL requires that modified versions be marked as | |||
changed, so that their problems will not be attributed erroneously to | |||
authors of previous versions. | |||
Some devices are designed to deny users access to install or run | |||
modified versions of the software inside them, although the manufacturer | |||
can do so. This is fundamentally incompatible with the aim of | |||
protecting users' freedom to change the software. The systematic | |||
pattern of such abuse occurs in the area of products for individuals to | |||
use, which is precisely where it is most unacceptable. Therefore, we | |||
have designed this version of the GPL to prohibit the practice for those | |||
products. If such problems arise substantially in other domains, we | |||
stand ready to extend this provision to those domains in future versions | |||
of the GPL, as needed to protect the freedom of users. | |||
Finally, every program is threatened constantly by software patents. | |||
States should not allow patents to restrict development and use of | |||
software on general-purpose computers, but in those that do, we wish to | |||
avoid the special danger that patents applied to a free program could | |||
make it effectively proprietary. To prevent this, the GPL assures that | |||
patents cannot be used to render the program non-free. | |||
The precise terms and conditions for copying, distribution and | |||
modification follow. | |||
TERMS AND CONDITIONS | |||
0. Definitions. | |||
"This License" refers to version 3 of the GNU General Public License. | |||
"Copyright" also means copyright-like laws that apply to other kinds of | |||
works, such as semiconductor masks. | |||
"The Program" refers to any copyrightable work licensed under this | |||
License. Each licensee is addressed as "you". "Licensees" and | |||
"recipients" may be individuals or organizations. | |||
To "modify" a work means to copy from or adapt all or part of the work | |||
in a fashion requiring copyright permission, other than the making of an | |||
exact copy. The resulting work is called a "modified version" of the | |||
earlier work or a work "based on" the earlier work. | |||
A "covered work" means either the unmodified Program or a work based | |||
on the Program. | |||
To "propagate" a work means to do anything with it that, without | |||
permission, would make you directly or secondarily liable for | |||
infringement under applicable copyright law, except executing it on a | |||
computer or modifying a private copy. Propagation includes copying, | |||
distribution (with or without modification), making available to the | |||
public, and in some countries other activities as well. | |||
To "convey" a work means any kind of propagation that enables other | |||
parties to make or receive copies. Mere interaction with a user through | |||
a computer network, with no transfer of a copy, is not conveying. | |||
An interactive user interface displays "Appropriate Legal Notices" | |||
to the extent that it includes a convenient and prominently visible | |||
feature that (1) displays an appropriate copyright notice, and (2) | |||
tells the user that there is no warranty for the work (except to the | |||
extent that warranties are provided), that licensees may convey the | |||
work under this License, and how to view a copy of this License. If | |||
the interface presents a list of user commands or options, such as a | |||
menu, a prominent item in the list meets this criterion. | |||
1. Source Code. | |||
The "source code" for a work means the preferred form of the work | |||
for making modifications to it. "Object code" means any non-source | |||
form of a work. | |||
A "Standard Interface" means an interface that either is an official | |||
standard defined by a recognized standards body, or, in the case of | |||
interfaces specified for a particular programming language, one that | |||
is widely used among developers working in that language. | |||
The "System Libraries" of an executable work include anything, other | |||
than the work as a whole, that (a) is included in the normal form of | |||
packaging a Major Component, but which is not part of that Major | |||
Component, and (b) serves only to enable use of the work with that | |||
Major Component, or to implement a Standard Interface for which an | |||
implementation is available to the public in source code form. A | |||
"Major Component", in this context, means a major essential component | |||
(kernel, window system, and so on) of the specific operating system | |||
(if any) on which the executable work runs, or a compiler used to | |||
produce the work, or an object code interpreter used to run it. | |||
The "Corresponding Source" for a work in object code form means all | |||
the source code needed to generate, install, and (for an executable | |||
work) run the object code and to modify the work, including scripts to | |||
control those activities. However, it does not include the work's | |||
System Libraries, or general-purpose tools or generally available free | |||
programs which are used unmodified in performing those activities but | |||
which are not part of the work. For example, Corresponding Source | |||
includes interface definition files associated with source files for | |||
the work, and the source code for shared libraries and dynamically | |||
linked subprograms that the work is specifically designed to require, | |||
such as by intimate data communication or control flow between those | |||
subprograms and other parts of the work. | |||
The Corresponding Source need not include anything that users | |||
can regenerate automatically from other parts of the Corresponding | |||
Source. | |||
The Corresponding Source for a work in source code form is that | |||
same work. | |||
2. Basic Permissions. | |||
All rights granted under this License are granted for the term of | |||
copyright on the Program, and are irrevocable provided the stated | |||
conditions are met. This License explicitly affirms your unlimited | |||
permission to run the unmodified Program. The output from running a | |||
covered work is covered by this License only if the output, given its | |||
content, constitutes a covered work. This License acknowledges your | |||
rights of fair use or other equivalent, as provided by copyright law. | |||
You may make, run and propagate covered works that you do not | |||
convey, without conditions so long as your license otherwise remains | |||
in force. You may convey covered works to others for the sole purpose | |||
of having them make modifications exclusively for you, or provide you | |||
with facilities for running those works, provided that you comply with | |||
the terms of this License in conveying all material for which you do | |||
not control copyright. Those thus making or running the covered works | |||
for you must do so exclusively on your behalf, under your direction | |||
and control, on terms that prohibit them from making any copies of | |||
your copyrighted material outside their relationship with you. | |||
Conveying under any other circumstances is permitted solely under | |||
the conditions stated below. Sublicensing is not allowed; section 10 | |||
makes it unnecessary. | |||
3. Protecting Users' Legal Rights From Anti-Circumvention Law. | |||
No covered work shall be deemed part of an effective technological | |||
measure under any applicable law fulfilling obligations under article | |||
11 of the WIPO copyright treaty adopted on 20 December 1996, or | |||
similar laws prohibiting or restricting circumvention of such | |||
measures. | |||
When you convey a covered work, you waive any legal power to forbid | |||
circumvention of technological measures to the extent such circumvention | |||
is effected by exercising rights under this License with respect to | |||
the covered work, and you disclaim any intention to limit operation or | |||
modification of the work as a means of enforcing, against the work's | |||
users, your or third parties' legal rights to forbid circumvention of | |||
technological measures. | |||
4. Conveying Verbatim Copies. | |||
You may convey verbatim copies of the Program's source code as you | |||
receive it, in any medium, provided that you conspicuously and | |||
appropriately publish on each copy an appropriate copyright notice; | |||
keep intact all notices stating that this License and any | |||
non-permissive terms added in accord with section 7 apply to the code; | |||
keep intact all notices of the absence of any warranty; and give all | |||
recipients a copy of this License along with the Program. | |||
You may charge any price or no price for each copy that you convey, | |||
and you may offer support or warranty protection for a fee. | |||
5. Conveying Modified Source Versions. | |||
You may convey a work based on the Program, or the modifications to | |||
produce it from the Program, in the form of source code under the | |||
terms of section 4, provided that you also meet all of these conditions: | |||
a) The work must carry prominent notices stating that you modified | |||
it, and giving a relevant date. | |||
b) The work must carry prominent notices stating that it is | |||
released under this License and any conditions added under section | |||
7. This requirement modifies the requirement in section 4 to | |||
"keep intact all notices". | |||
c) You must license the entire work, as a whole, under this | |||
License to anyone who comes into possession of a copy. This | |||
License will therefore apply, along with any applicable section 7 | |||
additional terms, to the whole of the work, and all its parts, | |||
regardless of how they are packaged. This License gives no | |||
permission to license the work in any other way, but it does not | |||
invalidate such permission if you have separately received it. | |||
d) If the work has interactive user interfaces, each must display | |||
Appropriate Legal Notices; however, if the Program has interactive | |||
interfaces that do not display Appropriate Legal Notices, your | |||
work need not make them do so. | |||
A compilation of a covered work with other separate and independent | |||
works, which are not by their nature extensions of the covered work, | |||
and which are not combined with it such as to form a larger program, | |||
in or on a volume of a storage or distribution medium, is called an | |||
"aggregate" if the compilation and its resulting copyright are not | |||
used to limit the access or legal rights of the compilation's users | |||
beyond what the individual works permit. Inclusion of a covered work | |||
in an aggregate does not cause this License to apply to the other | |||
parts of the aggregate. | |||
6. Conveying Non-Source Forms. | |||
You may convey a covered work in object code form under the terms | |||
of sections 4 and 5, provided that you also convey the | |||
machine-readable Corresponding Source under the terms of this License, | |||
in one of these ways: | |||
a) Convey the object code in, or embodied in, a physical product | |||
(including a physical distribution medium), accompanied by the | |||
Corresponding Source fixed on a durable physical medium | |||
customarily used for software interchange. | |||
b) Convey the object code in, or embodied in, a physical product | |||
(including a physical distribution medium), accompanied by a | |||
written offer, valid for at least three years and valid for as | |||
long as you offer spare parts or customer support for that product | |||
model, to give anyone who possesses the object code either (1) a | |||
copy of the Corresponding Source for all the software in the | |||
product that is covered by this License, on a durable physical | |||
medium customarily used for software interchange, for a price no | |||
more than your reasonable cost of physically performing this | |||
conveying of source, or (2) access to copy the | |||
Corresponding Source from a network server at no charge. | |||
c) Convey individual copies of the object code with a copy of the | |||
written offer to provide the Corresponding Source. This | |||
alternative is allowed only occasionally and noncommercially, and | |||
only if you received the object code with such an offer, in accord | |||
with subsection 6b. | |||
d) Convey the object code by offering access from a designated | |||
place (gratis or for a charge), and offer equivalent access to the | |||
Corresponding Source in the same way through the same place at no | |||
further charge. You need not require recipients to copy the | |||
Corresponding Source along with the object code. If the place to | |||
copy the object code is a network server, the Corresponding Source | |||
may be on a different server (operated by you or a third party) | |||
that supports equivalent copying facilities, provided you maintain | |||
clear directions next to the object code saying where to find the | |||
Corresponding Source. Regardless of what server hosts the | |||
Corresponding Source, you remain obligated to ensure that it is | |||
available for as long as needed to satisfy these requirements. | |||
e) Convey the object code using peer-to-peer transmission, provided | |||
you inform other peers where the object code and Corresponding | |||
Source of the work are being offered to the general public at no | |||
charge under subsection 6d. | |||
A separable portion of the object code, whose source code is excluded | |||
from the Corresponding Source as a System Library, need not be | |||
included in conveying the object code work. | |||
A "User Product" is either (1) a "consumer product", which means any | |||
tangible personal property which is normally used for personal, family, | |||
or household purposes, or (2) anything designed or sold for incorporation | |||
into a dwelling. In determining whether a product is a consumer product, | |||
doubtful cases shall be resolved in favor of coverage. For a particular | |||
product received by a particular user, "normally used" refers to a | |||
typical or common use of that class of product, regardless of the status | |||
of the particular user or of the way in which the particular user | |||
actually uses, or expects or is expected to use, the product. A product | |||
is a consumer product regardless of whether the product has substantial | |||
commercial, industrial or non-consumer uses, unless such uses represent | |||
the only significant mode of use of the product. | |||
"Installation Information" for a User Product means any methods, | |||
procedures, authorization keys, or other information required to install | |||
and execute modified versions of a covered work in that User Product from | |||
a modified version of its Corresponding Source. The information must | |||
suffice to ensure that the continued functioning of the modified object | |||
code is in no case prevented or interfered with solely because | |||
modification has been made. | |||
If you convey an object code work under this section in, or with, or | |||
specifically for use in, a User Product, and the conveying occurs as | |||
part of a transaction in which the right of possession and use of the | |||
User Product is transferred to the recipient in perpetuity or for a | |||
fixed term (regardless of how the transaction is characterized), the | |||
Corresponding Source conveyed under this section must be accompanied | |||
by the Installation Information. But this requirement does not apply | |||
if neither you nor any third party retains the ability to install | |||
modified object code on the User Product (for example, the work has | |||
been installed in ROM). | |||
The requirement to provide Installation Information does not include a | |||
requirement to continue to provide support service, warranty, or updates | |||
for a work that has been modified or installed by the recipient, or for | |||
the User Product in which it has been modified or installed. Access to a | |||
network may be denied when the modification itself materially and | |||
adversely affects the operation of the network or violates the rules and | |||
protocols for communication across the network. | |||
Corresponding Source conveyed, and Installation Information provided, | |||
in accord with this section must be in a format that is publicly | |||
documented (and with an implementation available to the public in | |||
source code form), and must require no special password or key for | |||
unpacking, reading or copying. | |||
7. Additional Terms. | |||
"Additional permissions" are terms that supplement the terms of this | |||
License by making exceptions from one or more of its conditions. | |||
Additional permissions that are applicable to the entire Program shall | |||
be treated as though they were included in this License, to the extent | |||
that they are valid under applicable law. If additional permissions | |||
apply only to part of the Program, that part may be used separately | |||
under those permissions, but the entire Program remains governed by | |||
this License without regard to the additional permissions. | |||
When you convey a copy of a covered work, you may at your option | |||
remove any additional permissions from that copy, or from any part of | |||
it. (Additional permissions may be written to require their own | |||
removal in certain cases when you modify the work.) You may place | |||
additional permissions on material, added by you to a covered work, | |||
for which you have or can give appropriate copyright permission. | |||
Notwithstanding any other provision of this License, for material you | |||
add to a covered work, you may (if authorized by the copyright holders of | |||
that material) supplement the terms of this License with terms: | |||
a) Disclaiming warranty or limiting liability differently from the | |||
terms of sections 15 and 16 of this License; or | |||
b) Requiring preservation of specified reasonable legal notices or | |||
author attributions in that material or in the Appropriate Legal | |||
Notices displayed by works containing it; or | |||
c) Prohibiting misrepresentation of the origin of that material, or | |||
requiring that modified versions of such material be marked in | |||
reasonable ways as different from the original version; or | |||
d) Limiting the use for publicity purposes of names of licensors or | |||
authors of the material; or | |||
e) Declining to grant rights under trademark law for use of some | |||
trade names, trademarks, or service marks; or | |||
f) Requiring indemnification of licensors and authors of that | |||
material by anyone who conveys the material (or modified versions of | |||
it) with contractual assumptions of liability to the recipient, for | |||
any liability that these contractual assumptions directly impose on | |||
those licensors and authors. | |||
All other non-permissive additional terms are considered "further | |||
restrictions" within the meaning of section 10. If the Program as you | |||
received it, or any part of it, contains a notice stating that it is | |||
governed by this License along with a term that is a further | |||
restriction, you may remove that term. If a license document contains | |||
a further restriction but permits relicensing or conveying under this | |||
License, you may add to a covered work material governed by the terms | |||
of that license document, provided that the further restriction does | |||
not survive such relicensing or conveying. | |||
If you add terms to a covered work in accord with this section, you | |||
must place, in the relevant source files, a statement of the | |||
additional terms that apply to those files, or a notice indicating | |||
where to find the applicable terms. | |||
Additional terms, permissive or non-permissive, may be stated in the | |||
form of a separately written license, or stated as exceptions; | |||
the above requirements apply either way. | |||
8. Termination. | |||
You may not propagate or modify a covered work except as expressly | |||
provided under this License. Any attempt otherwise to propagate or | |||
modify it is void, and will automatically terminate your rights under | |||
this License (including any patent licenses granted under the third | |||
paragraph of section 11). | |||
However, if you cease all violation of this License, then your | |||
license from a particular copyright holder is reinstated (a) | |||
provisionally, unless and until the copyright holder explicitly and | |||
finally terminates your license, and (b) permanently, if the copyright | |||
holder fails to notify you of the violation by some reasonable means | |||
prior to 60 days after the cessation. | |||
Moreover, your license from a particular copyright holder is | |||
reinstated permanently if the copyright holder notifies you of the | |||
violation by some reasonable means, this is the first time you have | |||
received notice of violation of this License (for any work) from that | |||
copyright holder, and you cure the violation prior to 30 days after | |||
your receipt of the notice. | |||
Termination of your rights under this section does not terminate the | |||
licenses of parties who have received copies or rights from you under | |||
this License. If your rights have been terminated and not permanently | |||
reinstated, you do not qualify to receive new licenses for the same | |||
material under section 10. | |||
9. Acceptance Not Required for Having Copies. | |||
You are not required to accept this License in order to receive or | |||
run a copy of the Program. Ancillary propagation of a covered work | |||
occurring solely as a consequence of using peer-to-peer transmission | |||
to receive a copy likewise does not require acceptance. However, | |||
nothing other than this License grants you permission to propagate or | |||
modify any covered work. These actions infringe copyright if you do | |||
not accept this License. Therefore, by modifying or propagating a | |||
covered work, you indicate your acceptance of this License to do so. | |||
10. Automatic Licensing of Downstream Recipients. | |||
Each time you convey a covered work, the recipient automatically | |||
receives a license from the original licensors, to run, modify and | |||
propagate that work, subject to this License. You are not responsible | |||
for enforcing compliance by third parties with this License. | |||
An "entity transaction" is a transaction transferring control of an | |||
organization, or substantially all assets of one, or subdividing an | |||
organization, or merging organizations. If propagation of a covered | |||
work results from an entity transaction, each party to that | |||
transaction who receives a copy of the work also receives whatever | |||
licenses to the work the party's predecessor in interest had or could | |||
give under the previous paragraph, plus a right to possession of the | |||
Corresponding Source of the work from the predecessor in interest, if | |||
the predecessor has it or can get it with reasonable efforts. | |||
You may not impose any further restrictions on the exercise of the | |||
rights granted or affirmed under this License. For example, you may | |||
not impose a license fee, royalty, or other charge for exercise of | |||
rights granted under this License, and you may not initiate litigation | |||
(including a cross-claim or counterclaim in a lawsuit) alleging that | |||
any patent claim is infringed by making, using, selling, offering for | |||
sale, or importing the Program or any portion of it. | |||
11. Patents. | |||
A "contributor" is a copyright holder who authorizes use under this | |||
License of the Program or a work on which the Program is based. The | |||
work thus licensed is called the contributor's "contributor version". | |||
A contributor's "essential patent claims" are all patent claims | |||
owned or controlled by the contributor, whether already acquired or | |||
hereafter acquired, that would be infringed by some manner, permitted | |||
by this License, of making, using, or selling its contributor version, | |||
but do not include claims that would be infringed only as a | |||
consequence of further modification of the contributor version. For | |||
purposes of this definition, "control" includes the right to grant | |||
patent sublicenses in a manner consistent with the requirements of | |||
this License. | |||
Each contributor grants you a non-exclusive, worldwide, royalty-free | |||
patent license under the contributor's essential patent claims, to | |||
make, use, sell, offer for sale, import and otherwise run, modify and | |||
propagate the contents of its contributor version. | |||
In the following three paragraphs, a "patent license" is any express | |||
agreement or commitment, however denominated, not to enforce a patent | |||
(such as an express permission to practice a patent or covenant not to | |||
sue for patent infringement). To "grant" such a patent license to a | |||
party means to make such an agreement or commitment not to enforce a | |||
patent against the party. | |||
If you convey a covered work, knowingly relying on a patent license, | |||
and the Corresponding Source of the work is not available for anyone | |||
to copy, free of charge and under the terms of this License, through a | |||
publicly available network server or other readily accessible means, | |||
then you must either (1) cause the Corresponding Source to be so | |||
available, or (2) arrange to deprive yourself of the benefit of the | |||
patent license for this particular work, or (3) arrange, in a manner | |||
consistent with the requirements of this License, to extend the patent | |||
license to downstream recipients. "Knowingly relying" means you have | |||
actual knowledge that, but for the patent license, your conveying the | |||
covered work in a country, or your recipient's use of the covered work | |||
in a country, would infringe one or more identifiable patents in that | |||
country that you have reason to believe are valid. | |||
If, pursuant to or in connection with a single transaction or | |||
arrangement, you convey, or propagate by procuring conveyance of, a | |||
covered work, and grant a patent license to some of the parties | |||
receiving the covered work authorizing them to use, propagate, modify | |||
or convey a specific copy of the covered work, then the patent license | |||
you grant is automatically extended to all recipients of the covered | |||
work and works based on it. | |||
A patent license is "discriminatory" if it does not include within | |||
the scope of its coverage, prohibits the exercise of, or is | |||
conditioned on the non-exercise of one or more of the rights that are | |||
specifically granted under this License. You may not convey a covered | |||
work if you are a party to an arrangement with a third party that is | |||
in the business of distributing software, under which you make payment | |||
to the third party based on the extent of your activity of conveying | |||
the work, and under which the third party grants, to any of the | |||
parties who would receive the covered work from you, a discriminatory | |||
patent license (a) in connection with copies of the covered work | |||
conveyed by you (or copies made from those copies), or (b) primarily | |||
for and in connection with specific products or compilations that | |||
contain the covered work, unless you entered into that arrangement, | |||
or that patent license was granted, prior to 28 March 2007. | |||
Nothing in this License shall be construed as excluding or limiting | |||
any implied license or other defenses to infringement that may | |||
otherwise be available to you under applicable patent law. | |||
12. No Surrender of Others' Freedom. | |||
If conditions are imposed on you (whether by court order, agreement or | |||
otherwise) that contradict the conditions of this License, they do not | |||
excuse you from the conditions of this License. If you cannot convey a | |||
covered work so as to satisfy simultaneously your obligations under this | |||
License and any other pertinent obligations, then as a consequence you may | |||
not convey it at all. For example, if you agree to terms that obligate you | |||
to collect a royalty for further conveying from those to whom you convey | |||
the Program, the only way you could satisfy both those terms and this | |||
License would be to refrain entirely from conveying the Program. | |||
13. Use with the GNU Affero General Public License. | |||
Notwithstanding any other provision of this License, you have | |||
permission to link or combine any covered work with a work licensed | |||
under version 3 of the GNU Affero General Public License into a single | |||
combined work, and to convey the resulting work. The terms of this | |||
License will continue to apply to the part which is the covered work, | |||
but the special requirements of the GNU Affero General Public License, | |||
section 13, concerning interaction through a network will apply to the | |||
combination as such. | |||
14. Revised Versions of this License. | |||
The Free Software Foundation may publish revised and/or new versions of | |||
the GNU General Public License from time to time. Such new versions will | |||
be similar in spirit to the present version, but may differ in detail to | |||
address new problems or concerns. | |||
Each version is given a distinguishing version number. If the | |||
Program specifies that a certain numbered version of the GNU General | |||
Public License "or any later version" applies to it, you have the | |||
option of following the terms and conditions either of that numbered | |||
version or of any later version published by the Free Software | |||
Foundation. If the Program does not specify a version number of the | |||
GNU General Public License, you may choose any version ever published | |||
by the Free Software Foundation. | |||
If the Program specifies that a proxy can decide which future | |||
versions of the GNU General Public License can be used, that proxy's | |||
public statement of acceptance of a version permanently authorizes you | |||
to choose that version for the Program. | |||
Later license versions may give you additional or different | |||
permissions. However, no additional obligations are imposed on any | |||
author or copyright holder as a result of your choosing to follow a | |||
later version. | |||
15. Disclaimer of Warranty. | |||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY | |||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT | |||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY | |||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, | |||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | |||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM | |||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF | |||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION. | |||
16. Limitation of Liability. | |||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | |||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS | |||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY | |||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE | |||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF | |||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD | |||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), | |||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF | |||
SUCH DAMAGES. | |||
17. Interpretation of Sections 15 and 16. | |||
If the disclaimer of warranty and limitation of liability provided | |||
above cannot be given local legal effect according to their terms, | |||
reviewing courts shall apply local law that most closely approximates | |||
an absolute waiver of all civil liability in connection with the | |||
Program, unless a warranty or assumption of liability accompanies a | |||
copy of the Program in return for a fee. | |||
END OF TERMS AND CONDITIONS | |||
How to Apply These Terms to Your New Programs | |||
If you develop a new program, and you want it to be of the greatest | |||
possible use to the public, the best way to achieve this is to make it | |||
free software which everyone can redistribute and change under these terms. | |||
To do so, attach the following notices to the program. It is safest | |||
to attach them to the start of each source file to most effectively | |||
state the exclusion of warranty; and each file should have at least | |||
the "copyright" line and a pointer to where the full notice is found. | |||
{one line to give the program's name and a brief idea of what it does.} | |||
Copyright (C) {year} {name of author} | |||
This program is free software: you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation, either version 3 of the License, or | |||
(at your option) any later version. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
Also add information on how to contact you by electronic and paper mail. | |||
If the program does terminal interaction, make it output a short | |||
notice like this when it starts in an interactive mode: | |||
{project} Copyright (C) {year} {fullname} | |||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. | |||
This is free software, and you are welcome to redistribute it | |||
under certain conditions; type `show c' for details. | |||
The hypothetical commands `show w' and `show c' should show the appropriate | |||
parts of the General Public License. Of course, your program's commands | |||
might be different; for a GUI interface, you would use an "about box". | |||
You should also get your employer (if you work as a programmer) or school, | |||
if any, to sign a "copyright disclaimer" for the program, if necessary. | |||
For more information on this, and how to apply and follow the GNU GPL, see | |||
<http://www.gnu.org/licenses/>. | |||
The GNU General Public License does not permit incorporating your program | |||
into proprietary programs. If your program is a subroutine library, you | |||
may consider it more useful to permit linking proprietary applications with | |||
the library. If this is what you want to do, use the GNU Lesser General | |||
Public License instead of this License. But first, please read | |||
<http://www.gnu.org/philosophy/why-not-lgpl.html>. |
@@ -0,0 +1,13 @@ | |||
Copyright (c) 2014 | |||
Permission to use, copy, modify, and/or distribute this software for any | |||
purpose with or without fee is hereby granted, provided that the above | |||
copyright notice and this permission notice appear in all copies. | |||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
@@ -0,0 +1,504 @@ | |||
GNU LESSER GENERAL PUBLIC LICENSE | |||
Version 2.1, February 1999 | |||
Copyright (C) 1991, 1999 Free Software Foundation, Inc. | |||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||
Everyone is permitted to copy and distribute verbatim copies | |||
of this license document, but changing it is not allowed. | |||
(This is the first released version of the Lesser GPL. It also counts | |||
as the successor of the GNU Library Public License, version 2, hence | |||
the version number 2.1.) | |||
Preamble | |||
The licenses for most software are designed to take away your | |||
freedom to share and change it. By contrast, the GNU General Public | |||
Licenses are intended to guarantee your freedom to share and change | |||
free software--to make sure the software is free for all its users. | |||
This license, the Lesser General Public License, applies to some | |||
specially designated software packages--typically libraries--of the | |||
Free Software Foundation and other authors who decide to use it. You | |||
can use it too, but we suggest you first think carefully about whether | |||
this license or the ordinary General Public License is the better | |||
strategy to use in any particular case, based on the explanations below. | |||
When we speak of free software, we are referring to freedom of use, | |||
not price. Our General Public Licenses are designed to make sure that | |||
you have the freedom to distribute copies of free software (and charge | |||
for this service if you wish); that you receive source code or can get | |||
it if you want it; that you can change the software and use pieces of | |||
it in new free programs; and that you are informed that you can do | |||
these things. | |||
To protect your rights, we need to make restrictions that forbid | |||
distributors to deny you these rights or to ask you to surrender these | |||
rights. These restrictions translate to certain responsibilities for | |||
you if you distribute copies of the library or if you modify it. | |||
For example, if you distribute copies of the library, whether gratis | |||
or for a fee, you must give the recipients all the rights that we gave | |||
you. You must make sure that they, too, receive or can get the source | |||
code. If you link other code with the library, you must provide | |||
complete object files to the recipients, so that they can relink them | |||
with the library after making changes to the library and recompiling | |||
it. And you must show them these terms so they know their rights. | |||
We protect your rights with a two-step method: (1) we copyright the | |||
library, and (2) we offer you this license, which gives you legal | |||
permission to copy, distribute and/or modify the library. | |||
To protect each distributor, we want to make it very clear that | |||
there is no warranty for the free library. Also, if the library is | |||
modified by someone else and passed on, the recipients should know | |||
that what they have is not the original version, so that the original | |||
author's reputation will not be affected by problems that might be | |||
introduced by others. | |||
Finally, software patents pose a constant threat to the existence of | |||
any free program. We wish to make sure that a company cannot | |||
effectively restrict the users of a free program by obtaining a | |||
restrictive license from a patent holder. Therefore, we insist that | |||
any patent license obtained for a version of the library must be | |||
consistent with the full freedom of use specified in this license. | |||
Most GNU software, including some libraries, is covered by the | |||
ordinary GNU General Public License. This license, the GNU Lesser | |||
General Public License, applies to certain designated libraries, and | |||
is quite different from the ordinary General Public License. We use | |||
this license for certain libraries in order to permit linking those | |||
libraries into non-free programs. | |||
When a program is linked with a library, whether statically or using | |||
a shared library, the combination of the two is legally speaking a | |||
combined work, a derivative of the original library. The ordinary | |||
General Public License therefore permits such linking only if the | |||
entire combination fits its criteria of freedom. The Lesser General | |||
Public License permits more lax criteria for linking other code with | |||
the library. | |||
We call this license the "Lesser" General Public License because it | |||
does Less to protect the user's freedom than the ordinary General | |||
Public License. It also provides other free software developers Less | |||
of an advantage over competing non-free programs. These disadvantages | |||
are the reason we use the ordinary General Public License for many | |||
libraries. However, the Lesser license provides advantages in certain | |||
special circumstances. | |||
For example, on rare occasions, there may be a special need to | |||
encourage the widest possible use of a certain library, so that it becomes | |||
a de-facto standard. To achieve this, non-free programs must be | |||
allowed to use the library. A more frequent case is that a free | |||
library does the same job as widely used non-free libraries. In this | |||
case, there is little to gain by limiting the free library to free | |||
software only, so we use the Lesser General Public License. | |||
In other cases, permission to use a particular library in non-free | |||
programs enables a greater number of people to use a large body of | |||
free software. For example, permission to use the GNU C Library in | |||
non-free programs enables many more people to use the whole GNU | |||
operating system, as well as its variant, the GNU/Linux operating | |||
system. | |||
Although the Lesser General Public License is Less protective of the | |||
users' freedom, it does ensure that the user of a program that is | |||
linked with the Library has the freedom and the wherewithal to run | |||
that program using a modified version of the Library. | |||
The precise terms and conditions for copying, distribution and | |||
modification follow. Pay close attention to the difference between a | |||
"work based on the library" and a "work that uses the library". The | |||
former contains code derived from the library, whereas the latter must | |||
be combined with the library in order to run. | |||
GNU LESSER GENERAL PUBLIC LICENSE | |||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION | |||
0. This License Agreement applies to any software library or other | |||
program which contains a notice placed by the copyright holder or | |||
other authorized party saying it may be distributed under the terms of | |||
this Lesser General Public License (also called "this License"). | |||
Each licensee is addressed as "you". | |||
A "library" means a collection of software functions and/or data | |||
prepared so as to be conveniently linked with application programs | |||
(which use some of those functions and data) to form executables. | |||
The "Library", below, refers to any such software library or work | |||
which has been distributed under these terms. A "work based on the | |||
Library" means either the Library or any derivative work under | |||
copyright law: that is to say, a work containing the Library or a | |||
portion of it, either verbatim or with modifications and/or translated | |||
straightforwardly into another language. (Hereinafter, translation is | |||
included without limitation in the term "modification".) | |||
"Source code" for a work means the preferred form of the work for | |||
making modifications to it. For a library, complete source code means | |||
all the source code for all modules it contains, plus any associated | |||
interface definition files, plus the scripts used to control compilation | |||
and installation of the library. | |||
Activities other than copying, distribution and modification are not | |||
covered by this License; they are outside its scope. The act of | |||
running a program using the Library is not restricted, and output from | |||
such a program is covered only if its contents constitute a work based | |||
on the Library (independent of the use of the Library in a tool for | |||
writing it). Whether that is true depends on what the Library does | |||
and what the program that uses the Library does. | |||
1. You may copy and distribute verbatim copies of the Library's | |||
complete source code as you receive it, in any medium, provided that | |||
you conspicuously and appropriately publish on each copy an | |||
appropriate copyright notice and disclaimer of warranty; keep intact | |||
all the notices that refer to this License and to the absence of any | |||
warranty; and distribute a copy of this License along with the | |||
Library. | |||
You may charge a fee for the physical act of transferring a copy, | |||
and you may at your option offer warranty protection in exchange for a | |||
fee. | |||
2. You may modify your copy or copies of the Library or any portion | |||
of it, thus forming a work based on the Library, and copy and | |||
distribute such modifications or work under the terms of Section 1 | |||
above, provided that you also meet all of these conditions: | |||
a) The modified work must itself be a software library. | |||
b) You must cause the files modified to carry prominent notices | |||
stating that you changed the files and the date of any change. | |||
c) You must cause the whole of the work to be licensed at no | |||
charge to all third parties under the terms of this License. | |||
d) If a facility in the modified Library refers to a function or a | |||
table of data to be supplied by an application program that uses | |||
the facility, other than as an argument passed when the facility | |||
is invoked, then you must make a good faith effort to ensure that, | |||
in the event an application does not supply such function or | |||
table, the facility still operates, and performs whatever part of | |||
its purpose remains meaningful. | |||
(For example, a function in a library to compute square roots has | |||
a purpose that is entirely well-defined independent of the | |||
application. Therefore, Subsection 2d requires that any | |||
application-supplied function or table used by this function must | |||
be optional: if the application does not supply it, the square | |||
root function must still compute square roots.) | |||
These requirements apply to the modified work as a whole. If | |||
identifiable sections of that work are not derived from the Library, | |||
and can be reasonably considered independent and separate works in | |||
themselves, then this License, and its terms, do not apply to those | |||
sections when you distribute them as separate works. But when you | |||
distribute the same sections as part of a whole which is a work based | |||
on the Library, the distribution of the whole must be on the terms of | |||
this License, whose permissions for other licensees extend to the | |||
entire whole, and thus to each and every part regardless of who wrote | |||
it. | |||
Thus, it is not the intent of this section to claim rights or contest | |||
your rights to work written entirely by you; rather, the intent is to | |||
exercise the right to control the distribution of derivative or | |||
collective works based on the Library. | |||
In addition, mere aggregation of another work not based on the Library | |||
with the Library (or with a work based on the Library) on a volume of | |||
a storage or distribution medium does not bring the other work under | |||
the scope of this License. | |||
3. You may opt to apply the terms of the ordinary GNU General Public | |||
License instead of this License to a given copy of the Library. To do | |||
this, you must alter all the notices that refer to this License, so | |||
that they refer to the ordinary GNU General Public License, version 2, | |||
instead of to this License. (If a newer version than version 2 of the | |||
ordinary GNU General Public License has appeared, then you can specify | |||
that version instead if you wish.) Do not make any other change in | |||
these notices. | |||
Once this change is made in a given copy, it is irreversible for | |||
that copy, so the ordinary GNU General Public License applies to all | |||
subsequent copies and derivative works made from that copy. | |||
This option is useful when you wish to copy part of the code of | |||
the Library into a program that is not a library. | |||
4. You may copy and distribute the Library (or a portion or | |||
derivative of it, under Section 2) in object code or executable form | |||
under the terms of Sections 1 and 2 above provided that you accompany | |||
it with the complete corresponding machine-readable source code, which | |||
must be distributed under the terms of Sections 1 and 2 above on a | |||
medium customarily used for software interchange. | |||
If distribution of object code is made by offering access to copy | |||
from a designated place, then offering equivalent access to copy the | |||
source code from the same place satisfies the requirement to | |||
distribute the source code, even though third parties are not | |||
compelled to copy the source along with the object code. | |||
5. A program that contains no derivative of any portion of the | |||
Library, but is designed to work with the Library by being compiled or | |||
linked with it, is called a "work that uses the Library". Such a | |||
work, in isolation, is not a derivative work of the Library, and | |||
therefore falls outside the scope of this License. | |||
However, linking a "work that uses the Library" with the Library | |||
creates an executable that is a derivative of the Library (because it | |||
contains portions of the Library), rather than a "work that uses the | |||
library". The executable is therefore covered by this License. | |||
Section 6 states terms for distribution of such executables. | |||
When a "work that uses the Library" uses material from a header file | |||
that is part of the Library, the object code for the work may be a | |||
derivative work of the Library even though the source code is not. | |||
Whether this is true is especially significant if the work can be | |||
linked without the Library, or if the work is itself a library. The | |||
threshold for this to be true is not precisely defined by law. | |||
If such an object file uses only numerical parameters, data | |||
structure layouts and accessors, and small macros and small inline | |||
functions (ten lines or less in length), then the use of the object | |||
file is unrestricted, regardless of whether it is legally a derivative | |||
work. (Executables containing this object code plus portions of the | |||
Library will still fall under Section 6.) | |||
Otherwise, if the work is a derivative of the Library, you may | |||
distribute the object code for the work under the terms of Section 6. | |||
Any executables containing that work also fall under Section 6, | |||
whether or not they are linked directly with the Library itself. | |||
6. As an exception to the Sections above, you may also combine or | |||
link a "work that uses the Library" with the Library to produce a | |||
work containing portions of the Library, and distribute that work | |||
under terms of your choice, provided that the terms permit | |||
modification of the work for the customer's own use and reverse | |||
engineering for debugging such modifications. | |||
You must give prominent notice with each copy of the work that the | |||
Library is used in it and that the Library and its use are covered by | |||
this License. You must supply a copy of this License. If the work | |||
during execution displays copyright notices, you must include the | |||
copyright notice for the Library among them, as well as a reference | |||
directing the user to the copy of this License. Also, you must do one | |||
of these things: | |||
a) Accompany the work with the complete corresponding | |||
machine-readable source code for the Library including whatever | |||
changes were used in the work (which must be distributed under | |||
Sections 1 and 2 above); and, if the work is an executable linked | |||
with the Library, with the complete machine-readable "work that | |||
uses the Library", as object code and/or source code, so that the | |||
user can modify the Library and then relink to produce a modified | |||
executable containing the modified Library. (It is understood | |||
that the user who changes the contents of definitions files in the | |||
Library will not necessarily be able to recompile the application | |||
to use the modified definitions.) | |||
b) Use a suitable shared library mechanism for linking with the | |||
Library. A suitable mechanism is one that (1) uses at run time a | |||
copy of the library already present on the user's computer system, | |||
rather than copying library functions into the executable, and (2) | |||
will operate properly with a modified version of the library, if | |||
the user installs one, as long as the modified version is | |||
interface-compatible with the version that the work was made with. | |||
c) Accompany the work with a written offer, valid for at | |||
least three years, to give the same user the materials | |||
specified in Subsection 6a, above, for a charge no more | |||
than the cost of performing this distribution. | |||
d) If distribution of the work is made by offering access to copy | |||
from a designated place, offer equivalent access to copy the above | |||
specified materials from the same place. | |||
e) Verify that the user has already received a copy of these | |||
materials or that you have already sent this user a copy. | |||
For an executable, the required form of the "work that uses the | |||
Library" must include any data and utility programs needed for | |||
reproducing the executable from it. However, as a special exception, | |||
the materials to be distributed need not include anything that is | |||
normally distributed (in either source or binary form) with the major | |||
components (compiler, kernel, and so on) of the operating system on | |||
which the executable runs, unless that component itself accompanies | |||
the executable. | |||
It may happen that this requirement contradicts the license | |||
restrictions of other proprietary libraries that do not normally | |||
accompany the operating system. Such a contradiction means you cannot | |||
use both them and the Library together in an executable that you | |||
distribute. | |||
7. You may place library facilities that are a work based on the | |||
Library side-by-side in a single library together with other library | |||
facilities not covered by this License, and distribute such a combined | |||
library, provided that the separate distribution of the work based on | |||
the Library and of the other library facilities is otherwise | |||
permitted, and provided that you do these two things: | |||
a) Accompany the combined library with a copy of the same work | |||
based on the Library, uncombined with any other library | |||
facilities. This must be distributed under the terms of the | |||
Sections above. | |||
b) Give prominent notice with the combined library of the fact | |||
that part of it is a work based on the Library, and explaining | |||
where to find the accompanying uncombined form of the same work. | |||
8. You may not copy, modify, sublicense, link with, or distribute | |||
the Library except as expressly provided under this License. Any | |||
attempt otherwise to copy, modify, sublicense, link with, or | |||
distribute the Library is void, and will automatically terminate your | |||
rights under this License. However, parties who have received copies, | |||
or rights, from you under this License will not have their licenses | |||
terminated so long as such parties remain in full compliance. | |||
9. You are not required to accept this License, since you have not | |||
signed it. However, nothing else grants you permission to modify or | |||
distribute the Library or its derivative works. These actions are | |||
prohibited by law if you do not accept this License. Therefore, by | |||
modifying or distributing the Library (or any work based on the | |||
Library), you indicate your acceptance of this License to do so, and | |||
all its terms and conditions for copying, distributing or modifying | |||
the Library or works based on it. | |||
10. Each time you redistribute the Library (or any work based on the | |||
Library), the recipient automatically receives a license from the | |||
original licensor to copy, distribute, link with or modify the Library | |||
subject to these terms and conditions. You may not impose any further | |||
restrictions on the recipients' exercise of the rights granted herein. | |||
You are not responsible for enforcing compliance by third parties with | |||
this License. | |||
11. If, as a consequence of a court judgment or allegation of patent | |||
infringement or for any other reason (not limited to patent issues), | |||
conditions are imposed on you (whether by court order, agreement or | |||
otherwise) that contradict the conditions of this License, they do not | |||
excuse you from the conditions of this License. If you cannot | |||
distribute so as to satisfy simultaneously your obligations under this | |||
License and any other pertinent obligations, then as a consequence you | |||
may not distribute the Library at all. For example, if a patent | |||
license would not permit royalty-free redistribution of the Library by | |||
all those who receive copies directly or indirectly through you, then | |||
the only way you could satisfy both it and this License would be to | |||
refrain entirely from distribution of the Library. | |||
If any portion of this section is held invalid or unenforceable under any | |||
particular circumstance, the balance of the section is intended to apply, | |||
and the section as a whole is intended to apply in other circumstances. | |||
It is not the purpose of this section to induce you to infringe any | |||
patents or other property right claims or to contest validity of any | |||
such claims; this section has the sole purpose of protecting the | |||
integrity of the free software distribution system which is | |||
implemented by public license practices. Many people have made | |||
generous contributions to the wide range of software distributed | |||
through that system in reliance on consistent application of that | |||
system; it is up to the author/donor to decide if he or she is willing | |||
to distribute software through any other system and a licensee cannot | |||
impose that choice. | |||
This section is intended to make thoroughly clear what is believed to | |||
be a consequence of the rest of this License. | |||
12. If the distribution and/or use of the Library is restricted in | |||
certain countries either by patents or by copyrighted interfaces, the | |||
original copyright holder who places the Library under this License may add | |||
an explicit geographical distribution limitation excluding those countries, | |||
so that distribution is permitted only in or among countries not thus | |||
excluded. In such case, this License incorporates the limitation as if | |||
written in the body of this License. | |||
13. The Free Software Foundation may publish revised and/or new | |||
versions of the Lesser General Public License from time to time. | |||
Such new versions will be similar in spirit to the present version, | |||
but may differ in detail to address new problems or concerns. | |||
Each version is given a distinguishing version number. If the Library | |||
specifies a version number of this License which applies to it and | |||
"any later version", you have the option of following the terms and | |||
conditions either of that version or of any later version published by | |||
the Free Software Foundation. If the Library does not specify a | |||
license version number, you may choose any version ever published by | |||
the Free Software Foundation. | |||
14. If you wish to incorporate parts of the Library into other free | |||
programs whose distribution conditions are incompatible with these, | |||
write to the author to ask for permission. For software which is | |||
copyrighted by the Free Software Foundation, write to the Free | |||
Software Foundation; we sometimes make exceptions for this. Our | |||
decision will be guided by the two goals of preserving the free status | |||
of all derivatives of our free software and of promoting the sharing | |||
and reuse of software generally. | |||
NO WARRANTY | |||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO | |||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. | |||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR | |||
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY | |||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE | |||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | |||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE | |||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME | |||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. | |||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN | |||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY | |||
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU | |||
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR | |||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE | |||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING | |||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A | |||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF | |||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH | |||
DAMAGES. | |||
END OF TERMS AND CONDITIONS | |||
How to Apply These Terms to Your New Libraries | |||
If you develop a new library, and you want it to be of the greatest | |||
possible use to the public, we recommend making it free software that | |||
everyone can redistribute and change. You can do so by permitting | |||
redistribution under these terms (or, alternatively, under the terms of the | |||
ordinary General Public License). | |||
To apply these terms, attach the following notices to the library. It is | |||
safest to attach them to the start of each source file to most effectively | |||
convey the exclusion of warranty; and each file should have at least the | |||
"copyright" line and a pointer to where the full notice is found. | |||
{description} | |||
Copyright (C) {year} {fullname} | |||
This library is free software; you can redistribute it and/or | |||
modify it under the terms of the GNU Lesser General Public | |||
License as published by the Free Software Foundation; either | |||
version 2.1 of the License, or (at your option) any later version. | |||
This library is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
Lesser General Public License for more details. | |||
You should have received a copy of the GNU Lesser General Public | |||
License along with this library; if not, write to the Free Software | |||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 | |||
USA | |||
Also add information on how to contact you by electronic and paper mail. | |||
You should also get your employer (if you work as a programmer) or your | |||
school, if any, to sign a "copyright disclaimer" for the library, if | |||
necessary. Here is a sample; alter the names: | |||
Yoyodyne, Inc., hereby disclaims all copyright interest in the | |||
library `Frob' (a library for tweaking knobs) written by James Random | |||
Hacker. | |||
{signature of Ty Coon}, 1 April 1990 | |||
Ty Coon, President of Vice | |||
That's all there is to it! |
@@ -0,0 +1,165 @@ | |||
GNU LESSER GENERAL PUBLIC LICENSE | |||
Version 3, 29 June 2007 | |||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> | |||
Everyone is permitted to copy and distribute verbatim copies | |||
of this license document, but changing it is not allowed. | |||
This version of the GNU Lesser General Public License incorporates | |||
the terms and conditions of version 3 of the GNU General Public | |||
License, supplemented by the additional permissions listed below. | |||
0. Additional Definitions. | |||
As used herein, "this License" refers to version 3 of the GNU Lesser | |||
General Public License, and the "GNU GPL" refers to version 3 of the GNU | |||
General Public License. | |||
"The Library" refers to a covered work governed by this License, | |||
other than an Application or a Combined Work as defined below. | |||
An "Application" is any work that makes use of an interface provided | |||
by the Library, but which is not otherwise based on the Library. | |||
Defining a subclass of a class defined by the Library is deemed a mode | |||
of using an interface provided by the Library. | |||
A "Combined Work" is a work produced by combining or linking an | |||
Application with the Library. The particular version of the Library | |||
with which the Combined Work was made is also called the "Linked | |||
Version". | |||
The "Minimal Corresponding Source" for a Combined Work means the | |||
Corresponding Source for the Combined Work, excluding any source code | |||
for portions of the Combined Work that, considered in isolation, are | |||
based on the Application, and not on the Linked Version. | |||
The "Corresponding Application Code" for a Combined Work means the | |||
object code and/or source code for the Application, including any data | |||
and utility programs needed for reproducing the Combined Work from the | |||
Application, but excluding the System Libraries of the Combined Work. | |||
1. Exception to Section 3 of the GNU GPL. | |||
You may convey a covered work under sections 3 and 4 of this License | |||
without being bound by section 3 of the GNU GPL. | |||
2. Conveying Modified Versions. | |||
If you modify a copy of the Library, and, in your modifications, a | |||
facility refers to a function or data to be supplied by an Application | |||
that uses the facility (other than as an argument passed when the | |||
facility is invoked), then you may convey a copy of the modified | |||
version: | |||
a) under this License, provided that you make a good faith effort to | |||
ensure that, in the event an Application does not supply the | |||
function or data, the facility still operates, and performs | |||
whatever part of its purpose remains meaningful, or | |||
b) under the GNU GPL, with none of the additional permissions of | |||
this License applicable to that copy. | |||
3. Object Code Incorporating Material from Library Header Files. | |||
The object code form of an Application may incorporate material from | |||
a header file that is part of the Library. You may convey such object | |||
code under terms of your choice, provided that, if the incorporated | |||
material is not limited to numerical parameters, data structure | |||
layouts and accessors, or small macros, inline functions and templates | |||
(ten or fewer lines in length), you do both of the following: | |||
a) Give prominent notice with each copy of the object code that the | |||
Library is used in it and that the Library and its use are | |||
covered by this License. | |||
b) Accompany the object code with a copy of the GNU GPL and this license | |||
document. | |||
4. Combined Works. | |||
You may convey a Combined Work under terms of your choice that, | |||
taken together, effectively do not restrict modification of the | |||
portions of the Library contained in the Combined Work and reverse | |||
engineering for debugging such modifications, if you also do each of | |||
the following: | |||
a) Give prominent notice with each copy of the Combined Work that | |||
the Library is used in it and that the Library and its use are | |||
covered by this License. | |||
b) Accompany the Combined Work with a copy of the GNU GPL and this license | |||
document. | |||
c) For a Combined Work that displays copyright notices during | |||
execution, include the copyright notice for the Library among | |||
these notices, as well as a reference directing the user to the | |||
copies of the GNU GPL and this license document. | |||
d) Do one of the following: | |||
0) Convey the Minimal Corresponding Source under the terms of this | |||
License, and the Corresponding Application Code in a form | |||
suitable for, and under terms that permit, the user to | |||
recombine or relink the Application with a modified version of | |||
the Linked Version to produce a modified Combined Work, in the | |||
manner specified by section 6 of the GNU GPL for conveying | |||
Corresponding Source. | |||
1) Use a suitable shared library mechanism for linking with the | |||
Library. A suitable mechanism is one that (a) uses at run time | |||
a copy of the Library already present on the user's computer | |||
system, and (b) will operate properly with a modified version | |||
of the Library that is interface-compatible with the Linked | |||
Version. | |||
e) Provide Installation Information, but only if you would otherwise | |||
be required to provide such information under section 6 of the | |||
GNU GPL, and only to the extent that such information is | |||
necessary to install and execute a modified version of the | |||
Combined Work produced by recombining or relinking the | |||
Application with a modified version of the Linked Version. (If | |||
you use option 4d0, the Installation Information must accompany | |||
the Minimal Corresponding Source and Corresponding Application | |||
Code. If you use option 4d1, you must provide the Installation | |||
Information in the manner specified by section 6 of the GNU GPL | |||
for conveying Corresponding Source.) | |||
5. Combined Libraries. | |||
You may place library facilities that are a work based on the | |||
Library side by side in a single library together with other library | |||
facilities that are not Applications and are not covered by this | |||
License, and convey such a combined library under terms of your | |||
choice, if you do both of the following: | |||
a) Accompany the combined library with a copy of the same work based | |||
on the Library, uncombined with any other library facilities, | |||
conveyed under the terms of this License. | |||
b) Give prominent notice with the combined library that part of it | |||
is a work based on the Library, and explaining where to find the | |||
accompanying uncombined form of the same work. | |||
6. Revised Versions of the GNU Lesser General Public License. | |||
The Free Software Foundation may publish revised and/or new versions | |||
of the GNU Lesser General Public License from time to time. Such new | |||
versions will be similar in spirit to the present version, but may | |||
differ in detail to address new problems or concerns. | |||
Each version is given a distinguishing version number. If the | |||
Library as you received it specifies that a certain numbered version | |||
of the GNU Lesser General Public License "or any later version" | |||
applies to it, you have the option of following the terms and | |||
conditions either of that published version or of any later version | |||
published by the Free Software Foundation. If the Library as you | |||
received it does not specify a version number of the GNU Lesser | |||
General Public License, you may choose any version of the GNU Lesser | |||
General Public License ever published by the Free Software Foundation. | |||
If the Library as you received it specifies that a proxy can decide | |||
whether future versions of the GNU Lesser General Public License shall | |||
apply, that proxy's public statement of acceptance of any version is | |||
permanent authorization for you to choose that version for the | |||
Library. |
@@ -0,0 +1,362 @@ | |||
Mozilla Public License, version 2.0 | |||
1. Definitions | |||
1.1. "Contributor" | |||
means each individual or legal entity that creates, contributes to the | |||
creation of, or owns Covered Software. | |||
1.2. "Contributor Version" | |||
means the combination of the Contributions of others (if any) used by a | |||
Contributor and that particular Contributor's Contribution. | |||
1.3. "Contribution" | |||
means Covered Software of a particular Contributor. | |||
1.4. "Covered Software" | |||
means Source Code Form to which the initial Contributor has attached the | |||
notice in Exhibit A, the Executable Form of such Source Code Form, and | |||
Modifications of such Source Code Form, in each case including portions | |||
thereof. | |||
1.5. "Incompatible With Secondary Licenses" | |||
means | |||
a. that the initial Contributor has attached the notice described in | |||
Exhibit B to the Covered Software; or | |||
b. that the Covered Software was made available under the terms of | |||
version 1.1 or earlier of the License, but not also under the terms of | |||
a Secondary License. | |||
1.6. "Executable Form" | |||
means any form of the work other than Source Code Form. | |||
1.7. "Larger Work" | |||
means a work that combines Covered Software with other material, in a | |||
separate file or files, that is not Covered Software. | |||
1.8. "License" | |||
means this document. | |||
1.9. "Licensable" | |||
means having the right to grant, to the maximum extent possible, whether | |||
at the time of the initial grant or subsequently, any and all of the | |||
rights conveyed by this License. | |||
1.10. "Modifications" | |||
means any of the following: | |||
a. any file in Source Code Form that results from an addition to, | |||
deletion from, or modification of the contents of Covered Software; or | |||
b. any new file in Source Code Form that contains any Covered Software. | |||
1.11. "Patent Claims" of a Contributor | |||
means any patent claim(s), including without limitation, method, | |||
process, and apparatus claims, in any patent Licensable by such | |||
Contributor that would be infringed, but for the grant of the License, | |||
by the making, using, selling, offering for sale, having made, import, | |||
or transfer of either its Contributions or its Contributor Version. | |||
1.12. "Secondary License" | |||
means either the GNU General Public License, Version 2.0, the GNU Lesser | |||
General Public License, Version 2.1, the GNU Affero General Public | |||
License, Version 3.0, or any later versions of those licenses. | |||
1.13. "Source Code Form" | |||
means the form of the work preferred for making modifications. | |||
1.14. "You" (or "Your") | |||
means an individual or a legal entity exercising rights under this | |||
License. For legal entities, "You" includes any entity that controls, is | |||
controlled by, or is under common control with You. For purposes of this | |||
definition, "control" means (a) the power, direct or indirect, to cause | |||
the direction or management of such entity, whether by contract or | |||
otherwise, or (b) ownership of more than fifty percent (50%) of the | |||
outstanding shares or beneficial ownership of such entity. | |||
2. License Grants and Conditions | |||
2.1. Grants | |||
Each Contributor hereby grants You a world-wide, royalty-free, | |||
non-exclusive license: | |||
a. under intellectual property rights (other than patent or trademark) | |||
Licensable by such Contributor to use, reproduce, make available, | |||
modify, display, perform, distribute, and otherwise exploit its | |||
Contributions, either on an unmodified basis, with Modifications, or | |||
as part of a Larger Work; and | |||
b. under Patent Claims of such Contributor to make, use, sell, offer for | |||
sale, have made, import, and otherwise transfer either its | |||
Contributions or its Contributor Version. | |||
2.2. Effective Date | |||
The licenses granted in Section 2.1 with respect to any Contribution | |||
become effective for each Contribution on the date the Contributor first | |||
distributes such Contribution. | |||
2.3. Limitations on Grant Scope | |||
The licenses granted in this Section 2 are the only rights granted under | |||
this License. No additional rights or licenses will be implied from the | |||
distribution or licensing of Covered Software under this License. | |||
Notwithstanding Section 2.1(b) above, no patent license is granted by a | |||
Contributor: | |||
a. for any code that a Contributor has removed from Covered Software; or | |||
b. for infringements caused by: (i) Your and any other third party's | |||
modifications of Covered Software, or (ii) the combination of its | |||
Contributions with other software (except as part of its Contributor | |||
Version); or | |||
c. under Patent Claims infringed by Covered Software in the absence of | |||
its Contributions. | |||
This License does not grant any rights in the trademarks, service marks, | |||
or logos of any Contributor (except as may be necessary to comply with | |||
the notice requirements in Section 3.4). | |||
2.4. Subsequent Licenses | |||
No Contributor makes additional grants as a result of Your choice to | |||
distribute the Covered Software under a subsequent version of this | |||
License (see Section 10.2) or under the terms of a Secondary License (if | |||
permitted under the terms of Section 3.3). | |||
2.5. Representation | |||
Each Contributor represents that the Contributor believes its | |||
Contributions are its original creation(s) or it has sufficient rights to | |||
grant the rights to its Contributions conveyed by this License. | |||
2.6. Fair Use | |||
This License is not intended to limit any rights You have under | |||
applicable copyright doctrines of fair use, fair dealing, or other | |||
equivalents. | |||
2.7. Conditions | |||
Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in | |||
Section 2.1. | |||
3. Responsibilities | |||
3.1. Distribution of Source Form | |||
All distribution of Covered Software in Source Code Form, including any | |||
Modifications that You create or to which You contribute, must be under | |||
the terms of this License. You must inform recipients that the Source | |||
Code Form of the Covered Software is governed by the terms of this | |||
License, and how they can obtain a copy of this License. You may not | |||
attempt to alter or restrict the recipients' rights in the Source Code | |||
Form. | |||
3.2. Distribution of Executable Form | |||
If You distribute Covered Software in Executable Form then: | |||
a. such Covered Software must also be made available in Source Code Form, | |||
as described in Section 3.1, and You must inform recipients of the | |||
Executable Form how they can obtain a copy of such Source Code Form by | |||
reasonable means in a timely manner, at a charge no more than the cost | |||
of distribution to the recipient; and | |||
b. You may distribute such Executable Form under the terms of this | |||
License, or sublicense it under different terms, provided that the | |||
license for the Executable Form does not attempt to limit or alter the | |||
recipients' rights in the Source Code Form under this License. | |||
3.3. Distribution of a Larger Work | |||
You may create and distribute a Larger Work under terms of Your choice, | |||
provided that You also comply with the requirements of this License for | |||
the Covered Software. If the Larger Work is a combination of Covered | |||
Software with a work governed by one or more Secondary Licenses, and the | |||
Covered Software is not Incompatible With Secondary Licenses, this | |||
License permits You to additionally distribute such Covered Software | |||
under the terms of such Secondary License(s), so that the recipient of | |||
the Larger Work may, at their option, further distribute the Covered | |||
Software under the terms of either this License or such Secondary | |||
License(s). | |||
3.4. Notices | |||
You may not remove or alter the substance of any license notices | |||
(including copyright notices, patent notices, disclaimers of warranty, or | |||
limitations of liability) contained within the Source Code Form of the | |||
Covered Software, except that You may alter any license notices to the | |||
extent required to remedy known factual inaccuracies. | |||
3.5. Application of Additional Terms | |||
You may choose to offer, and to charge a fee for, warranty, support, | |||
indemnity or liability obligations to one or more recipients of Covered | |||
Software. However, You may do so only on Your own behalf, and not on | |||
behalf of any Contributor. You must make it absolutely clear that any | |||
such warranty, support, indemnity, or liability obligation is offered by | |||
You alone, and You hereby agree to indemnify every Contributor for any | |||
liability incurred by such Contributor as a result of warranty, support, | |||
indemnity or liability terms You offer. You may include additional | |||
disclaimers of warranty and limitations of liability specific to any | |||
jurisdiction. | |||
4. Inability to Comply Due to Statute or Regulation | |||
If it is impossible for You to comply with any of the terms of this License | |||
with respect to some or all of the Covered Software due to statute, | |||
judicial order, or regulation then You must: (a) comply with the terms of | |||
this License to the maximum extent possible; and (b) describe the | |||
limitations and the code they affect. Such description must be placed in a | |||
text file included with all distributions of the Covered Software under | |||
this License. Except to the extent prohibited by statute or regulation, | |||
such description must be sufficiently detailed for a recipient of ordinary | |||
skill to be able to understand it. | |||
5. Termination | |||
5.1. The rights granted under this License will terminate automatically if You | |||
fail to comply with any of its terms. However, if You become compliant, | |||
then the rights granted under this License from a particular Contributor | |||
are reinstated (a) provisionally, unless and until such Contributor | |||
explicitly and finally terminates Your grants, and (b) on an ongoing | |||
basis, if such Contributor fails to notify You of the non-compliance by | |||
some reasonable means prior to 60 days after You have come back into | |||
compliance. Moreover, Your grants from a particular Contributor are | |||
reinstated on an ongoing basis if such Contributor notifies You of the | |||
non-compliance by some reasonable means, this is the first time You have | |||
received notice of non-compliance with this License from such | |||
Contributor, and You become compliant prior to 30 days after Your receipt | |||
of the notice. | |||
5.2. If You initiate litigation against any entity by asserting a patent | |||
infringement claim (excluding declaratory judgment actions, | |||
counter-claims, and cross-claims) alleging that a Contributor Version | |||
directly or indirectly infringes any patent, then the rights granted to | |||
You by any and all Contributors for the Covered Software under Section | |||
2.1 of this License shall terminate. | |||
5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user | |||
license agreements (excluding distributors and resellers) which have been | |||
validly granted by You or Your distributors under this License prior to | |||
termination shall survive termination. | |||
6. Disclaimer of Warranty | |||
Covered Software is provided under this License on an "as is" basis, | |||
without warranty of any kind, either expressed, implied, or statutory, | |||
including, without limitation, warranties that the Covered Software is free | |||
of defects, merchantable, fit for a particular purpose or non-infringing. | |||
The entire risk as to the quality and performance of the Covered Software | |||
is with You. Should any Covered Software prove defective in any respect, | |||
You (not any Contributor) assume the cost of any necessary servicing, | |||
repair, or correction. This disclaimer of warranty constitutes an essential | |||
part of this License. No use of any Covered Software is authorized under | |||
this License except under this disclaimer. | |||
7. Limitation of Liability | |||
Under no circumstances and under no legal theory, whether tort (including | |||
negligence), contract, or otherwise, shall any Contributor, or anyone who | |||
distributes Covered Software as permitted above, be liable to You for any | |||
direct, indirect, special, incidental, or consequential damages of any | |||
character including, without limitation, damages for lost profits, loss of | |||
goodwill, work stoppage, computer failure or malfunction, or any and all | |||
other commercial damages or losses, even if such party shall have been | |||
informed of the possibility of such damages. This limitation of liability | |||
shall not apply to liability for death or personal injury resulting from | |||
such party's negligence to the extent applicable law prohibits such | |||
limitation. Some jurisdictions do not allow the exclusion or limitation of | |||
incidental or consequential damages, so this exclusion and limitation may | |||
not apply to You. | |||
8. Litigation | |||
Any litigation relating to this License may be brought only in the courts | |||
of a jurisdiction where the defendant maintains its principal place of | |||
business and such litigation shall be governed by laws of that | |||
jurisdiction, without reference to its conflict-of-law provisions. Nothing | |||
in this Section shall prevent a party's ability to bring cross-claims or | |||
counter-claims. | |||
9. Miscellaneous | |||
This License represents the complete agreement concerning the subject | |||
matter hereof. If any provision of this License is held to be | |||
unenforceable, such provision shall be reformed only to the extent | |||
necessary to make it enforceable. Any law or regulation which provides that | |||
the language of a contract shall be construed against the drafter shall not | |||
be used to construe this License against a Contributor. | |||
10. Versions of the License | |||
10.1. New Versions | |||
Mozilla Foundation is the license steward. Except as provided in Section | |||
10.3, no one other than the license steward has the right to modify or | |||
publish new versions of this License. Each version will be given a | |||
distinguishing version number. | |||
10.2. Effect of New Versions | |||
You may distribute the Covered Software under the terms of the version | |||
of the License under which You originally received the Covered Software, | |||
or under the terms of any subsequent version published by the license | |||
steward. | |||
10.3. Modified Versions | |||
If you create software not governed by this License, and you want to | |||
create a new license for such software, you may create and use a | |||
modified version of this License if you rename the license and remove | |||
any references to the name of the license steward (except to note that | |||
such modified license differs from this License). | |||
10.4. Distributing Source Code Form that is Incompatible With Secondary | |||
Licenses If You choose to distribute Source Code Form that is | |||
Incompatible With Secondary Licenses under the terms of this version of | |||
the License, the notice described in Exhibit B of this License must be | |||
attached. | |||
Exhibit A - Source Code Form License Notice | |||
This Source Code Form is subject to the | |||
terms of the Mozilla Public License, v. | |||
2.0. If a copy of the MPL was not | |||
distributed with this file, You can | |||
obtain one at | |||
http://mozilla.org/MPL/2.0/. | |||
If it is not possible or desirable to put the notice in a particular file, | |||
then You may include the notice in a location (such as a LICENSE file in a | |||
relevant directory) where a recipient would be likely to look for such a | |||
notice. | |||
You may add additional accurate notices of copyright ownership. | |||
Exhibit B - "Incompatible With Secondary Licenses" Notice | |||
This Source Code Form is "Incompatible | |||
With Secondary Licenses", as defined by | |||
the Mozilla Public License, v. 2.0. |
@@ -0,0 +1,177 @@ | |||
app_desc = A painless self-hosted Git service written in Go | |||
home = Home | |||
dashboard = Dashboard | |||
explore = Explore | |||
help = Help | |||
sign_in = Sign In | |||
sign_out = Sign Out | |||
sign_up = Sign Up | |||
register = Register | |||
website = Website | |||
version = Version | |||
page = Page | |||
template = Template | |||
language = Language | |||
username = Username | |||
email = E-mail | |||
password = Password | |||
re_type = Re-Type | |||
captcha = Captcha | |||
repository = Repository | |||
organization = Organization | |||
mirror = Mirror | |||
new_repo = New Repository | |||
new_migrate = New Migration | |||
new_org = New Organization | |||
manage_org = Manage Organizations | |||
admin_panel = Admin Panel | |||
account_settings = Account Settings | |||
settings = Settings | |||
news_feed = News Feed | |||
pull_requests = Pull Requests | |||
issues = Issues | |||
cancel = Cancel | |||
[home] | |||
uname_holder = Username or E-mail | |||
password_holder = Password | |||
switch_dashboard_context = Switch Dashboard Context | |||
my_repos = My Repositories | |||
collaborative_repos = Collaborative Repositories | |||
my_orgs = My Organizations | |||
my_mirrors = My Mirrors | |||
[auth] | |||
create_new_account = Create New Account | |||
register_hepler_msg = Already have an account? Sign in now! | |||
disable_register_prompt = Sorry, registration has been disabled. Please contact the site administrator. | |||
remember_me = Remember Me | |||
forget_password = Fotget password? | |||
sign_up_now = Need an account? Sign up now. | |||
[form] | |||
UserName = Username | |||
Email = E-mail address | |||
Password = Password | |||
Retype = Re-type password | |||
SSHTitle = SSH key name | |||
require_error = ` cannot be empty.` | |||
alpha_dash_error = ` must be valid alpha or numeric or dash(-_) characters.` | |||
alpha_dash_dot_error = ` must be valid alpha or numeric or dash(-_) or dot characters.` | |||
min_size_error = ` must contain at least %s characters.` | |||
max_size_error = ` must contain at most %s characters.` | |||
email_error = ` is not a valid e-mail address.` | |||
url_error = ` is not a valid URL.` | |||
unknown_error = Unknown error: | |||
captcha_incorrect = Captcha didn't match. | |||
password_not_match = Password and re-type password are not same. | |||
username_been_taken = Username has been already taken. | |||
repo_name_been_taken = Repository name has been already taken. | |||
email_been_used = E-mail address has been already used. | |||
ssh_key_been_used = Public key name has been used. | |||
illegal_username = Your username contains illegal characters. | |||
illegal_repo_name = Repository name contains illegal characters. | |||
username_password_incorrect = Username or password is not correct. | |||
invalid_ssh_key = Sorry, we're not able to verify your SSH key: %s | |||
still_own_repo = Your account still have ownership of repository, you have to delete or transfer them first. | |||
[settings] | |||
profile = Profile | |||
password = Password | |||
ssh_keys = SSH Keys | |||
social = Social Accounts | |||
delete = Delete Accoount | |||
public_profile = Public Profile | |||
profile_desc = Your Email address is public and will be used for any account related notifications, and any web based operations made via the site. | |||
full_name = Full Name | |||
website = Website | |||
location = Location | |||
update_profile = Update Profile | |||
update_profile_success = Your profile has been successfully updated. | |||
change_password = Change Password | |||
old_password = Current Password | |||
new_password = New Password | |||
password_incorrect = Current password is not correct. | |||
change_password_success = Password is changed successfully. You can now sign in via new password. | |||
manage_ssh_keys = Manage SSH Keys | |||
add_key = Add Key | |||
ssh_desc = This is a list of SSH keys associated with your account. Remove any keys that you do not recognize. | |||
ssh_helper = <strong>Need help?</strong> Check out our guide to <a href="https://help.github.com/articles/generating-ssh-keys">generating SSH keys</a> or troubleshoot <a href="https://help.github.com/ssh-issues/">common SSH Problems</a>. | |||
add_new_key = Add SSH Key | |||
key_name = Key Name | |||
key_content = Content | |||
add_key_success = New SSH Key has been added! | |||
delete_key = Delete | |||
add_on = Added on | |||
last_used = Last used on | |||
no_activity = No recent activity | |||
manage_social = Manage Associated Social Accounts | |||
delete_account = Delete Your Account | |||
delete_prompt = The operation will delete your account permanently, and <strong>CANNOT</strong> be undo! | |||
confirm_delete_account = Confirm Deletion | |||
[repo] | |||
owner = Owner | |||
repo_name = Repository Name | |||
repo_name_helper = Great repository names are short, memorable and <strong>unique</strong>. | |||
visibility = Visibility | |||
visiblity_helper = This repository is <span class="label label-red label-radius">Private</span> | |||
repo_desc = Description | |||
repo_lang = Language | |||
repo_lang_helper = Select a .gitignore file | |||
license = License | |||
license_helper = Select a license file | |||
init_readme = Initialize this repository with a README.md | |||
create_repo = Create Repository | |||
[action] | |||
create_repo = created repository <a href="/%s">%s</a> | |||
commit_repo = pushed to <a href="/%s/src/%s">%s</a> at <a href="/%s">%s</a> | |||
create_issue = opened issue <a href="/%s/issues/%s">%s#%s</a> | |||
comment_issue = commented on issue <a href="/%s/issues/%s">%s#%s</a> | |||
[tool] | |||
ago = ago | |||
from_now = from now | |||
now = now | |||
1s = 1 second %s | |||
1m = 1 mintue %s | |||
1h = 1 hour %s | |||
1d = 1 day %s | |||
1w = 1 week %s | |||
1mon = 1 month %s | |||
1y = 1 year %s | |||
seconds = %d seconds %s | |||
minutes = %d minutes %s | |||
hours = %d hours %s | |||
days = %d days %s | |||
weeks = %d weeks %s | |||
months = %d months %s | |||
years = %d years %s | |||
@@ -0,0 +1,176 @@ | |||
app_desc = 基于 Go 语言的自助 Git 服务 | |||
home = 首页 | |||
dashboard = 控制面板 | |||
explore = 探索 | |||
help = 帮助 | |||
sign_in = 登录 | |||
sign_out = 退出 | |||
sign_up = 注册 | |||
register = 注册 | |||
website = 官方网站 | |||
version = 当前版本 | |||
page = 页面 | |||
template = 模板 | |||
language = 语言选项 | |||
username = 用户名 | |||
email = 邮箱 | |||
password = 密码 | |||
re_type = 确认密码 | |||
captcha = 验证码 | |||
repository = 仓库 | |||
organization = 组织 | |||
mirror = 镜像 | |||
new_repo = 创建新的仓库 | |||
new_migrate = 迁移外部仓库 | |||
new_org = 创建新的组织 | |||
manage_org = 管理我的组织 | |||
admin_panel = 管理面板 | |||
account_settings = 帐户设置 | |||
settings = 帐户设置 | |||
news_feed = 最新活动 | |||
pull_requests = 合并请求 | |||
issues = 工单管理 | |||
cancel = 取消 | |||
[home] | |||
uname_holder = 用户名或邮箱 | |||
password_holder = 密码 | |||
switch_dashboard_context = 切换控制面板用户 | |||
my_repos = 我的仓库 | |||
collaborative_repos = 参与协作的仓库 | |||
my_orgs = 我的组织 | |||
my_mirrors = 我的镜像 | |||
[auth] | |||
create_new_account = 创建帐户 | |||
register_hepler_msg = 已经注册?立即登录! | |||
disable_register_prompt = 对不起,注册功能已被关闭。请联系网站管理员。 | |||
remember_me = 记住登录 | |||
forget_password = 忘记密码? | |||
sign_up_now = 还没帐户?马上注册。 | |||
[form] | |||
UserName = 用户名 | |||
Email = 邮箱地址 | |||
Password = 密码 | |||
Retype = 确认密码 | |||
SSHTitle = SSH 密钥名称 | |||
require_error = 不能为空。 | |||
alpha_dash_error = 必须为英文字母、阿拉伯数字或横线(-_)。 | |||
alpha_dash_dot_error = 必须为英文字母、阿拉伯数字、横线(-_)或点。 | |||
min_size_error = 长度最小为 %s 个字符。 | |||
max_size_error = 长度最大为 %s 个字符。 | |||
email_error = 不是一个有效的邮箱地址。 | |||
url_error = 不是一个有效的 URL。 | |||
unknown_error = 未知错误: | |||
captcha_incorrect = 验证码未匹配。 | |||
password_not_match = 密码与确认密码未匹配。 | |||
username_been_taken = 用户名已经被占用。 | |||
repo_name_been_taken = 仓库名称已经被占用。 | |||
email_been_used = 邮箱地址已经被使用。 | |||
ssh_key_been_used = SSH 密钥已经被使用。 | |||
illegal_username = 您的用户名包含非法字符。 | |||
illegal_repo_name = 仓库名称包含非法字符。 | |||
username_password_incorrect = 用户名或密码不正确。 | |||
invalid_ssh_key = 很抱歉,我们无法验证您输入的 SSH 密钥:%s | |||
still_own_repo = 您的帐户仍然是某些仓库的拥有者,您必须先转移或删除它们才能执行删除帐户操作! | |||
[settings] | |||
profile = 个人信息 | |||
password = 修改密码 | |||
ssh_keys = 管理 SSH 密钥 | |||
social = 社交帐号绑定 | |||
delete = 删除帐户 | |||
public_profile = 公开信息 | |||
profile_desc = 您的邮箱地址将会被公开,并被用于接收帐户的所有提醒和通知。 | |||
full_name = 自定义名称 | |||
website = 个人网站 | |||
location = 所在地区 | |||
update_profile = 更新信息 | |||
update_profile_success = 您的个人信息已经更新成功! | |||
change_password = 修改密码 | |||
old_password = 当前密码 | |||
new_password = 新的密码 | |||
password_incorrect = 当前密码不正确! | |||
change_password_success = 密码修改成功!您现在可以使用新的密码登录。 | |||
manage_ssh_keys = 管理 SSH 密钥 | |||
add_key = 增加密钥 | |||
ssh_desc = 以下是与您帐户所关联的 SSH 密钥,如果您发现有陌生的密钥,请立即删除它! | |||
ssh_helper = <strong>需要帮助?</strong> 请查看有关 <a href="https://help.github.com/articles/generating-ssh-keys">如何生成 SSH 密钥</a> 或 <a href="https://help.github.com/ssh-issues/">常见 SSH 问题</a> 寻找答案。 | |||
add_new_key = 增加 SSH 密钥 | |||
key_name = 密钥名称 | |||
key_content = 密钥内容 | |||
add_key_success = 新的 SSH 密钥添加成功! | |||
delete_key = 删除 | |||
add_on = 增加于 | |||
last_used = 上次使用在 | |||
no_activity = 没有最近活动 | |||
manage_social = 管理关联社交帐户 | |||
delete_account = 删除当前帐户 | |||
delete_prompt = 删除操作会永久清除您的帐户信息,并且 <strong>不可恢复</strong>! | |||
confirm_delete_account = 确认删除帐户 | |||
[repo] | |||
owner = 拥有者 | |||
repo_name = 仓库名称 | |||
repo_name_helper = 伟大的仓库名称一般都较短、令人深刻并且 <strong>独一无二</strong> 的。 | |||
visibility = 可见性 | |||
visiblity_helper = 本仓库将是 <span class="label label-red label-radius">私有的</span> | |||
repo_desc = 仓库描述 | |||
repo_lang = 仓库语言 | |||
repo_lang_helper = 请选择 .gitignore 文件 | |||
license = 授权许可 | |||
license_helper = 请选择授权许可文件 | |||
init_readme = 使用 README.md 文件初始化仓库 | |||
create_repo = 创建仓库 | |||
[action] | |||
create_repo = 创建了仓库 <a href="/%s">%s</a> | |||
commit_repo = 推送了 <a href="/%s/src/%s">%s</a> 分支的代码到 <a href="/%s">%s</a> | |||
create_issue = 创建了工单 <a href="/%s/issues/%s">%s#%s</a> | |||
comment_issue = 评论了工单 <a href="/%s/issues/%s">%s#%s</a> | |||
[tool] | |||
ago = 之前 | |||
from_now = 之后 | |||
now = 现在 | |||
1s = 1 秒%s | |||
1m = 1 分钟%s | |||
1h = 1 小时%s | |||
1d = 1 天%s | |||
1w = 1 周%s | |||
1mon = 1 月%s | |||
1y = 1 年%s | |||
seconds = %d 秒%s | |||
minutes = %d 分钟%s | |||
hours = %d 小时%s | |||
days = %d 天%s | |||
weeks = %d 周%s | |||
months = %d 月%s | |||
years = %d 年%s | |||
@@ -1,8 +0,0 @@ | |||
[program:gogs] | |||
user=git | |||
command = /home/git/gogs/start.sh | |||
directory = /home/git/gogs | |||
autostart = true | |||
stdout_logfile = /var/gogs.log | |||
stderr_logfile = /var/gogs-error.log | |||
environment=HOME="/home/git" |
@@ -4,7 +4,7 @@ | |||
// Use of this source code is governed by a MIT-style | |||
// license that can be found in the LICENSE file. | |||
// Gogs(Go Git Service) is a Self Hosted Git Service in the Go Programming Language. | |||
// Gogs(Go Git Service) is a painless self-hosted Git Service written in Go. | |||
package main | |||
import ( | |||
@@ -17,7 +17,7 @@ import ( | |||
"github.com/gogits/gogs/modules/setting" | |||
) | |||
const APP_VER = "0.4.5.0712 Alpha" | |||
const APP_VER = "0.4.7.0725 Alpha" | |||
func init() { | |||
runtime.GOMAXPROCS(runtime.NumCPU()) |
@@ -8,30 +8,31 @@ import ( | |||
"encoding/json" | |||
"errors" | |||
"fmt" | |||
"path" | |||
"regexp" | |||
"strings" | |||
"time" | |||
"unicode" | |||
"github.com/gogits/git" | |||
"github.com/gogits/gogs/modules/base" | |||
"github.com/gogits/gogs/modules/git" | |||
"github.com/gogits/gogs/modules/log" | |||
"github.com/gogits/gogs/modules/setting" | |||
) | |||
// Operation types of user action. | |||
type ActionType int | |||
const ( | |||
OP_CREATE_REPO = iota + 1 | |||
OP_DELETE_REPO | |||
OP_STAR_REPO | |||
OP_FOLLOW_REPO | |||
OP_COMMIT_REPO | |||
OP_CREATE_ISSUE | |||
OP_PULL_REQUEST | |||
OP_TRANSFER_REPO | |||
OP_PUSH_TAG | |||
OP_COMMENT_ISSUE | |||
CREATE_REPO ActionType = iota + 1 // 1 | |||
DELETE_REPO // 2 | |||
STAR_REPO // 3 | |||
FOLLOW_REPO // 4 | |||
COMMIT_REPO // 5 | |||
CREATE_ISSUE // 6 | |||
PULL_REQUEST // 7 | |||
TRANSFER_REPO // 8 | |||
PUSH_TAG // 9 | |||
COMMENT_ISSUE // 10 | |||
) | |||
var ( | |||
@@ -53,7 +54,7 @@ func init() { | |||
type Action struct { | |||
Id int64 | |||
UserId int64 // Receiver user id. | |||
OpType int | |||
OpType ActionType | |||
ActUserId int64 // Action user id. | |||
ActUserName string // Action user name. | |||
ActEmail string | |||
@@ -67,7 +68,7 @@ type Action struct { | |||
} | |||
func (a Action) GetOpType() int { | |||
return a.OpType | |||
return int(a.OpType) | |||
} | |||
func (a Action) GetActUserName() string { | |||
@@ -86,6 +87,10 @@ func (a Action) GetRepoName() string { | |||
return a.RepoName | |||
} | |||
func (a Action) GetRepoLink() string { | |||
return path.Join(a.RepoUserName, a.RepoName) | |||
} | |||
func (a Action) GetBranch() string { | |||
return a.RefName | |||
} | |||
@@ -94,6 +99,14 @@ func (a Action) GetContent() string { | |||
return a.Content | |||
} | |||
func (a Action) GetCreate() time.Time { | |||
return a.Created | |||
} | |||
func (a Action) GetIssueInfos() []string { | |||
return strings.SplitN(a.Content, "|", 2) | |||
} | |||
func updateIssuesCommit(userId, repoId int64, repoUserName, repoName string, commits []*base.PushCommit) error { | |||
for _, c := range commits { | |||
refs := IssueKeywordsPat.FindAllString(c.Message, -1) | |||
@@ -160,12 +173,11 @@ func updateIssuesCommit(userId, repoId int64, repoUserName, repoName string, com | |||
// CommitRepoAction adds new action for committing repository. | |||
func CommitRepoAction(userId, repoUserId int64, userName, actEmail string, | |||
repoId int64, repoUserName, repoName string, refFullName string, commit *base.PushCommits) error { | |||
// log.Trace("action.CommitRepoAction(start): %d/%s", userId, repoName) | |||
opType := OP_COMMIT_REPO | |||
opType := COMMIT_REPO | |||
// Check it's tag push or branch. | |||
if strings.HasPrefix(refFullName, "refs/tags/") { | |||
opType = OP_PUSH_TAG | |||
opType = PUSH_TAG | |||
commit = &base.PushCommits{} | |||
} | |||
@@ -269,26 +281,26 @@ func CommitRepoAction(userId, repoUserId int64, userName, actEmail string, | |||
// NewRepoAction adds new action for creating repository. | |||
func NewRepoAction(u *User, repo *Repository) (err error) { | |||
if err = NotifyWatchers(&Action{ActUserId: u.Id, ActUserName: u.Name, ActEmail: u.Email, | |||
OpType: OP_CREATE_REPO, RepoId: repo.Id, RepoUserName: repo.Owner.Name, RepoName: repo.Name, | |||
OpType: CREATE_REPO, RepoId: repo.Id, RepoUserName: repo.Owner.Name, RepoName: repo.Name, | |||
IsPrivate: repo.IsPrivate}); err != nil { | |||
log.Error("action.NewRepoAction(notify watchers): %d/%s", u.Id, repo.Name) | |||
log.Error(4, "NotifyWatchers: %d/%s", u.Id, repo.Name) | |||
return err | |||
} | |||
log.Trace("action.NewRepoAction: %s/%s", u.LowerName, repo.LowerName) | |||
log.Trace("action.NewRepoAction: %s/%s", u.Name, repo.Name) | |||
return err | |||
} | |||
// TransferRepoAction adds new action for transfering repository. | |||
func TransferRepoAction(user, newUser *User, repo *Repository) (err error) { | |||
if err = NotifyWatchers(&Action{ActUserId: user.Id, ActUserName: user.Name, ActEmail: user.Email, | |||
OpType: OP_TRANSFER_REPO, RepoId: repo.Id, RepoName: repo.Name, Content: newUser.Name, | |||
func TransferRepoAction(u, newUser *User, repo *Repository) (err error) { | |||
if err = NotifyWatchers(&Action{ActUserId: u.Id, ActUserName: u.Name, ActEmail: u.Email, | |||
OpType: TRANSFER_REPO, RepoId: repo.Id, RepoName: repo.Name, Content: newUser.Name, | |||
IsPrivate: repo.IsPrivate}); err != nil { | |||
log.Error("action.TransferRepoAction(notify watchers): %d/%s", user.Id, repo.Name) | |||
log.Error(4, "NotifyWatchers: %d/%s", u.Id, repo.Name) | |||
return err | |||
} | |||
log.Trace("action.TransferRepoAction: %s/%s", user.LowerName, repo.LowerName) | |||
log.Trace("action.TransferRepoAction: %s/%s", u.Name, repo.Name) | |||
return err | |||
} | |||
@@ -13,9 +13,10 @@ import ( | |||
"strings" | |||
"time" | |||
"github.com/Unknwon/com" | |||
"github.com/gogits/git" | |||
"github.com/gogits/gogs/modules/base" | |||
"github.com/gogits/gogs/modules/log" | |||
"github.com/gogits/gogs/modules/process" | |||
) | |||
@@ -118,8 +119,8 @@ func ParsePatch(pid int64, cmd *exec.Cmd, reader io.Reader) (*Diff, error) { | |||
// Parse line number. | |||
ranges := strings.Split(ss[len(ss)-2][1:], " ") | |||
leftLine, _ = base.StrTo(strings.Split(ranges[0], ",")[0][1:]).Int() | |||
rightLine, _ = base.StrTo(strings.Split(ranges[1], ",")[0]).Int() | |||
leftLine, _ = com.StrTo(strings.Split(ranges[0], ",")[0][1:]).Int() | |||
rightLine, _ = com.StrTo(strings.Split(ranges[1], ",")[0]).Int() | |||
continue | |||
case line[0] == '+': | |||
curFile.Addition++ | |||
@@ -214,7 +215,7 @@ func GetDiff(repoPath, commitid string) (*Diff, error) { | |||
select { | |||
case <-time.After(5 * time.Minute): | |||
if errKill := process.Kill(pid); errKill != nil { | |||
log.Error("git_diff.ParsePatch(Kill): %v", err) | |||
log.Error(4, "git_diff.ParsePatch(Kill): %v", err) | |||
} | |||
<-done | |||
// return "", ErrExecTimeout.Error(), ErrExecTimeout |
@@ -13,9 +13,9 @@ import ( | |||
"strings" | |||
"time" | |||
"github.com/Unknwon/com" | |||
"github.com/go-xorm/xorm" | |||
"github.com/gogits/gogs/modules/base" | |||
"github.com/gogits/gogs/modules/log" | |||
) | |||
@@ -72,7 +72,7 @@ func (i *Issue) GetLabels() error { | |||
strIds := strings.Split(strings.TrimSuffix(i.LabelIds[1:], "|"), "|$") | |||
i.Labels = make([]*Label, 0, len(strIds)) | |||
for _, strId := range strIds { | |||
id, _ := base.StrTo(strId).Int64() | |||
id, _ := com.StrTo(strId).Int64() | |||
if id > 0 { | |||
l, err := GetLabelById(id) | |||
if err != nil { | |||
@@ -337,7 +337,7 @@ func GetIssueUserPairsByRepoIds(rids []int64, isClosed bool, page int) ([]*Issue | |||
buf := bytes.NewBufferString("") | |||
for _, rid := range rids { | |||
buf.WriteString("repo_id=") | |||
buf.WriteString(base.ToStr(rid)) | |||
buf.WriteString(com.ToStr(rid)) | |||
buf.WriteString(" OR ") | |||
} | |||
cond := strings.TrimSuffix(buf.String(), " OR ") | |||
@@ -564,7 +564,7 @@ func UpdateLabel(l *Label) error { | |||
// DeleteLabel delete a label of given repository. | |||
func DeleteLabel(repoId int64, strId string) error { | |||
id, _ := base.StrTo(strId).Int64() | |||
id, _ := com.StrTo(strId).Int64() | |||
l, err := GetLabelById(id) | |||
if err != nil { | |||
if err == ErrLabelNotExist { |
@@ -164,15 +164,14 @@ func UserSignIn(uname, passwd string) (*User, error) { | |||
if u.LoginType == NOTYPE { | |||
if has { | |||
u.LoginType = PLAIN | |||
} else { | |||
return nil, ErrUserNotExist | |||
} | |||
} | |||
// for plain login, user must have existed. | |||
// For plain login, user must exist to reach this line. | |||
// Now verify password. | |||
if u.LoginType == PLAIN { | |||
if !has { | |||
return nil, ErrUserNotExist | |||
} | |||
newUser := &User{Passwd: passwd, Salt: u.Salt} | |||
newUser.EncodePasswd() | |||
if u.Passwd != newUser.Passwd { | |||
@@ -233,18 +232,18 @@ func UserSignIn(uname, passwd string) (*User, error) { | |||
// Query if name/passwd can login against the LDAP direcotry pool | |||
// Create a local user if success | |||
// Return the same LoginUserPlain semantic | |||
func LoginUserLdapSource(user *User, name, passwd string, sourceId int64, cfg *LDAPConfig, autoRegister bool) (*User, error) { | |||
func LoginUserLdapSource(u *User, name, passwd string, sourceId int64, cfg *LDAPConfig, autoRegister bool) (*User, error) { | |||
mail, logged := cfg.Ldapsource.SearchEntry(name, passwd) | |||
if !logged { | |||
// user not in LDAP, do nothing | |||
return nil, ErrUserNotExist | |||
} | |||
if !autoRegister { | |||
return user, nil | |||
return u, nil | |||
} | |||
// fake a local user creation | |||
user = &User{ | |||
u = &User{ | |||
LowerName: strings.ToLower(name), | |||
Name: strings.ToLower(name), | |||
LoginType: LDAP, | |||
@@ -255,7 +254,8 @@ func LoginUserLdapSource(user *User, name, passwd string, sourceId int64, cfg *L | |||
Email: mail, | |||
} | |||
return CreateUser(user) | |||
err := CreateUser(u) | |||
return u, err | |||
} | |||
type loginAuth struct { | |||
@@ -322,7 +322,7 @@ func SmtpAuth(host string, port int, a smtp.Auth, useTls bool) error { | |||
// Query if name/passwd can login against the LDAP direcotry pool | |||
// Create a local user if success | |||
// Return the same LoginUserPlain semantic | |||
func LoginUserSMTPSource(user *User, name, passwd string, sourceId int64, cfg *SMTPConfig, autoRegister bool) (*User, error) { | |||
func LoginUserSMTPSource(u *User, name, passwd string, sourceId int64, cfg *SMTPConfig, autoRegister bool) (*User, error) { | |||
var auth smtp.Auth | |||
if cfg.Auth == SMTP_PLAIN { | |||
auth = smtp.PlainAuth("", name, passwd, cfg.Host) | |||
@@ -340,7 +340,7 @@ func LoginUserSMTPSource(user *User, name, passwd string, sourceId int64, cfg *S | |||
} | |||
if !autoRegister { | |||
return user, nil | |||
return u, nil | |||
} | |||
var loginName = name | |||
@@ -349,7 +349,7 @@ func LoginUserSMTPSource(user *User, name, passwd string, sourceId int64, cfg *S | |||
loginName = name[:idx] | |||
} | |||
// fake a local user creation | |||
user = &User{ | |||
u = &User{ | |||
LowerName: strings.ToLower(loginName), | |||
Name: strings.ToLower(loginName), | |||
LoginType: SMTP, | |||
@@ -359,5 +359,6 @@ func LoginUserSMTPSource(user *User, name, passwd string, sourceId int64, cfg *S | |||
Passwd: passwd, | |||
Email: name, | |||
} | |||
return CreateUser(user) | |||
err := CreateUser(u) | |||
return u, err | |||
} |
@@ -54,7 +54,7 @@ func exePath() (string, error) { | |||
func homeDir() string { | |||
home, err := com.HomeDir() | |||
if err != nil { | |||
log.Fatal("Fail to get home directory: %v", err) | |||
log.Fatal(4, "Fail to get home directory: %v", err) | |||
} | |||
return home | |||
} | |||
@@ -63,25 +63,28 @@ func init() { | |||
var err error | |||
if appPath, err = exePath(); err != nil { | |||
log.Fatal("publickey.init(fail to get app path): %v\n", err) | |||
log.Fatal(4, "fail to get app path: %v\n", err) | |||
} | |||
appPath = strings.Replace(appPath, "\\", "/", -1) | |||
// Determine and create .ssh path. | |||
SshPath = filepath.Join(homeDir(), ".ssh") | |||
if err = os.MkdirAll(SshPath, os.ModePerm); err != nil { | |||
log.Fatal("publickey.init(fail to create SshPath(%s)): %v\n", SshPath, err) | |||
log.Fatal(4, "fail to create SshPath(%s): %v\n", SshPath, err) | |||
} | |||
} | |||
// PublicKey represents a SSH key. | |||
type PublicKey struct { | |||
Id int64 | |||
OwnerId int64 `xorm:"UNIQUE(s) INDEX NOT NULL"` | |||
Name string `xorm:"UNIQUE(s) NOT NULL"` | |||
Fingerprint string | |||
Content string `xorm:"TEXT NOT NULL"` | |||
Created time.Time `xorm:"CREATED"` | |||
Updated time.Time `xorm:"UPDATED"` | |||
Id int64 | |||
OwnerId int64 `xorm:"UNIQUE(s) INDEX NOT NULL"` | |||
Name string `xorm:"UNIQUE(s) NOT NULL"` | |||
Fingerprint string | |||
Content string `xorm:"TEXT NOT NULL"` | |||
Created time.Time `xorm:"CREATED"` | |||
Updated time.Time | |||
HasRecentActivity bool `xorm:"-"` | |||
HasUsed bool `xorm:"-"` | |||
} | |||
// GetAuthorizedString generates and returns formatted public key string for authorized_keys file. | |||
@@ -89,6 +92,59 @@ func (key *PublicKey) GetAuthorizedString() string { | |||
return fmt.Sprintf(_TPL_PUBLICK_KEY, appPath, key.Id, key.Content) | |||
} | |||
var ( | |||
MinimumKeySize = map[string]int{ | |||
"(ED25519)": 256, | |||
"(ECDSA)": 256, | |||
"(NTRU)": 1087, | |||
"(MCE)": 1702, | |||
"(McE)": 1702, | |||
"(RSA)": 2048, | |||
} | |||
) | |||
// CheckPublicKeyString checks if the given public key string is recognized by SSH. | |||
func CheckPublicKeyString(content string) (bool, error) { | |||
if strings.ContainsAny(content, "\n\r") { | |||
return false, errors.New("Only a single line with a single key please") | |||
} | |||
// write the key to a file… | |||
tmpFile, err := ioutil.TempFile(os.TempDir(), "keytest") | |||
if err != nil { | |||
return false, err | |||
} | |||
tmpPath := tmpFile.Name() | |||
defer os.Remove(tmpPath) | |||
tmpFile.WriteString(content) | |||
tmpFile.Close() | |||
// … see if ssh-keygen recognizes its contents | |||
stdout, stderr, err := process.Exec("CheckPublicKeyString", "ssh-keygen", "-l", "-f", tmpPath) | |||
if err != nil { | |||
return false, errors.New("ssh-keygen -l -f: " + stderr) | |||
} else if len(stdout) < 2 { | |||
return false, errors.New("ssh-keygen returned not enough output to evaluate the key") | |||
} | |||
sshKeygenOutput := strings.Split(stdout, " ") | |||
if len(sshKeygenOutput) < 4 { | |||
return false, errors.New("Not enough fields returned by ssh-keygen -l -f") | |||
} | |||
keySize, err := com.StrTo(sshKeygenOutput[0]).Int() | |||
if err != nil { | |||
return false, errors.New("Cannot get key size of the given key") | |||
} | |||
keyType := strings.TrimSpace(sshKeygenOutput[len(sshKeygenOutput)-1]) | |||
if minimumKeySize := MinimumKeySize[keyType]; minimumKeySize == 0 { | |||
return false, errors.New("Sorry, unrecognized public key type") | |||
} else if keySize < minimumKeySize { | |||
return false, fmt.Errorf("The minimum accepted size of a public key %s is %d", keyType, minimumKeySize) | |||
} | |||
return true, nil | |||
} | |||
// saveAuthorizedKeyFile writes SSH key content to authorized_keys file. | |||
func saveAuthorizedKeyFile(key *PublicKey) error { | |||
sshOpLocker.Lock() | |||
@@ -144,10 +200,18 @@ 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) | |||
func ListPublicKey(uid int64) ([]*PublicKey, error) { | |||
keys := make([]*PublicKey, 0, 5) | |||
err := x.Find(&keys, &PublicKey{OwnerId: uid}) | |||
return keys, err | |||
if err != nil { | |||
return nil, err | |||
} | |||
for _, key := range keys { | |||
key.HasUsed = key.Updated.After(key.Created) | |||
key.HasRecentActivity = key.Updated.Add(7 * 24 * time.Hour).After(time.Now()) | |||
} | |||
return keys, nil | |||
} | |||
// rewriteAuthorizedKeys finds and deletes corresponding line in authorized_keys file. | |||
@@ -218,8 +282,6 @@ func DeletePublicKey(key *PublicKey) error { | |||
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 { | |||
return err | |||
} else if err = os.Remove(fpath); err != nil { |
@@ -14,7 +14,6 @@ import ( | |||
"path" | |||
"path/filepath" | |||
"regexp" | |||
"runtime" | |||
"sort" | |||
"strings" | |||
"time" | |||
@@ -23,10 +22,7 @@ import ( | |||
"github.com/Unknwon/cae/zip" | |||
"github.com/Unknwon/com" | |||
"github.com/gogits/git" | |||
"github.com/gogits/gogs/modules/base" | |||
"github.com/gogits/gogs/modules/bin" | |||
"github.com/gogits/gogs/modules/git" | |||
"github.com/gogits/gogs/modules/log" | |||
"github.com/gogits/gogs/modules/process" | |||
"github.com/gogits/gogs/modules/setting" | |||
@@ -47,35 +43,27 @@ var ( | |||
) | |||
var ( | |||
LanguageIgns, Licenses []string | |||
Gitignores, Licenses []string | |||
) | |||
var ( | |||
DescriptionPattern = regexp.MustCompile(`https?://\S+`) | |||
) | |||
// getAssetList returns corresponding asset list in 'conf'. | |||
func getAssetList(prefix string) []string { | |||
assets := make([]string, 0, 15) | |||
for _, name := range bin.AssetNames() { | |||
if strings.HasPrefix(name, prefix) { | |||
assets = append(assets, strings.TrimPrefix(name, prefix+"/")) | |||
} | |||
} | |||
return assets | |||
} | |||
func LoadRepoConfig() { | |||
// Load .gitignore and license files. | |||
types := []string{"gitignore", "license"} | |||
typeFiles := make([][]string, 2) | |||
for i, t := range types { | |||
files := getAssetList(path.Join("conf", t)) | |||
files, err := com.StatDir(path.Join("conf", t)) | |||
if err != nil { | |||
log.Fatal(4, "Fail to get %s files: %v", t, err) | |||
} | |||
customPath := path.Join(setting.CustomPath, "conf", t) | |||
if com.IsDir(customPath) { | |||
customFiles, err := com.StatDir(customPath) | |||
if err != nil { | |||
log.Fatal("Fail to get custom %s files: %v", t, err) | |||
log.Fatal(4, "Fail to get custom %s files: %v", t, err) | |||
} | |||
for _, f := range customFiles { | |||
@@ -87,34 +75,33 @@ func LoadRepoConfig() { | |||
typeFiles[i] = files | |||
} | |||
LanguageIgns = typeFiles[0] | |||
Gitignores = typeFiles[0] | |||
Licenses = typeFiles[1] | |||
sort.Strings(LanguageIgns) | |||
sort.Strings(Gitignores) | |||
sort.Strings(Licenses) | |||
} | |||
func NewRepoContext() { | |||
zip.Verbose = false | |||
// Check Git version. | |||
ver, err := git.GetVersion() | |||
if err != nil { | |||
log.Fatal(4, "Fail to get Git version: %v", err) | |||
} | |||
if ver.Major < 2 && ver.Minor < 8 { | |||
log.Fatal(4, "Gogs requires Git version greater or equal to 1.8.0") | |||
} | |||
// Check if server has basic git setting. | |||
stdout, stderr, err := process.Exec("NewRepoContext(get setting)", "git", "config", "--get", "user.name") | |||
if err != nil { | |||
log.Fatal("repo.NewRepoContext(fail to get git user.name): %s", stderr) | |||
log.Fatal(4, "Fail to get git user.name: %s", stderr) | |||
} else if err != nil || len(strings.TrimSpace(stdout)) == 0 { | |||
if _, stderr, err = process.Exec("NewRepoContext(set email)", "git", "config", "--global", "user.email", "gogitservice@gmail.com"); err != nil { | |||
log.Fatal("repo.NewRepoContext(fail to set git user.email): %s", stderr) | |||
log.Fatal(4, "Fail to set git user.email: %s", stderr) | |||
} else if _, stderr, err = process.Exec("NewRepoContext(set name)", "git", "config", "--global", "user.name", "Gogs"); err != nil { | |||
log.Fatal("repo.NewRepoContext(fail to set git user.name): %s", stderr) | |||
} | |||
} | |||
barePath := path.Join(setting.RepoRootPath, "git-bare.zip") | |||
if !com.IsExist(barePath) { | |||
data, err := bin.Asset("conf/content/git-bare.zip") | |||
if err != nil { | |||
log.Fatal("Fail to get asset 'git-bare.zip': %v", err) | |||
} else if err := ioutil.WriteFile(barePath, data, os.ModePerm); err != nil { | |||
log.Fatal("Fail to write asset 'git-bare.zip': %v", err) | |||
log.Fatal(4, "Fail to set git user.name: %s", stderr) | |||
} | |||
} | |||
} | |||
@@ -135,12 +122,16 @@ type Repository struct { | |||
NumIssues int | |||
NumClosedIssues int | |||
NumOpenIssues int `xorm:"-"` | |||
NumPulls int | |||
NumClosedPulls int | |||
NumOpenPulls int `xorm:"-"` | |||
NumMilestones int `xorm:"NOT NULL DEFAULT 0"` | |||
NumClosedMilestones int `xorm:"NOT NULL DEFAULT 0"` | |||
NumOpenMilestones int `xorm:"-"` | |||
NumTags int `xorm:"-"` | |||
IsPrivate bool | |||
IsMirror bool | |||
IsFork bool `xorm:"NOT NULL DEFAULT false"` | |||
IsBare bool | |||
IsGoget bool | |||
DefaultBranch string | |||
@@ -153,11 +144,11 @@ func (repo *Repository) GetOwner() (err error) { | |||
return err | |||
} | |||
// DescriptionHtml does special handles to description and return HTML string. | |||
func (repo *Repository) DescriptionHtml() template.HTML { | |||
sanitize := func(s string) string { | |||
// TODO(nuss-justin): Improve sanitization. Strip all tags? | |||
ss := html.EscapeString(s) | |||
return fmt.Sprintf(`<a href="%s" target="_blank">%s</a>`, ss, ss) | |||
} | |||
return template.HTML(DescriptionPattern.ReplaceAllStringFunc(repo.Description, sanitize)) | |||
@@ -225,7 +216,8 @@ func MirrorRepository(repoId int64, userName, repoName, repoPath, url string) er | |||
return err | |||
} | |||
return git.UnpackRefs(repoPath) | |||
// return git.UnpackRefs(repoPath) | |||
return nil | |||
} | |||
func GetMirror(repoId int64) (*Mirror, error) { | |||
@@ -257,14 +249,14 @@ func MirrorUpdate() { | |||
repoPath, fmt.Sprintf("MirrorUpdate: %s", repoPath), | |||
"git", "remote", "update"); err != nil { | |||
return errors.New("git remote update: " + stderr) | |||
} else if err = git.UnpackRefs(repoPath); err != nil { | |||
return errors.New("UnpackRefs: " + err.Error()) | |||
} | |||
} // else if err = git.UnpackRefs(repoPath); err != nil { | |||
// return errors.New("UnpackRefs: " + err.Error()) | |||
// } | |||
m.NextUpdate = time.Now().Add(time.Duration(m.Interval) * time.Hour) | |||
return UpdateMirror(m) | |||
}); err != nil { | |||
log.Error("repo.MirrorUpdate: %v", err) | |||
log.Error(4, "repo.MirrorUpdate: %v", err) | |||
} | |||
} | |||
@@ -317,7 +309,7 @@ func MigrateRepository(u *User, name, desc string, private, mirror bool, url str | |||
// extractGitBareZip extracts git-bare.zip to repository path. | |||
func extractGitBareZip(repoPath string) error { | |||
z, err := zip.Open(filepath.Join(setting.RepoRootPath, "git-bare.zip")) | |||
z, err := zip.Open(path.Join(setting.ConfRootPath, "content/git-bare.zip")) | |||
if err != nil { | |||
return err | |||
} | |||
@@ -361,34 +353,18 @@ func createHookUpdate(hookPath, content string) error { | |||
return err | |||
} | |||
// SetRepoEnvs sets environment variables for command update. | |||
func SetRepoEnvs(userId int64, userName, repoName, repoUserName string) { | |||
os.Setenv("userId", base.ToStr(userId)) | |||
os.Setenv("userName", userName) | |||
os.Setenv("repoName", repoName) | |||
os.Setenv("repoUserName", repoUserName) | |||
} | |||
// InitRepository initializes README and .gitignore if needed. | |||
func initRepository(f string, user *User, repo *Repository, initReadme bool, repoLang, license string) error { | |||
repoPath := RepoPath(user.Name, repo.Name) | |||
func initRepository(f string, u *User, repo *Repository, initReadme bool, repoLang, license string) error { | |||
repoPath := RepoPath(u.Name, repo.Name) | |||
// Create bare new repository. | |||
if err := extractGitBareZip(repoPath); err != nil { | |||
return err | |||
} | |||
if runtime.GOOS == "windows" { | |||
rp := strings.NewReplacer("\\", "/") | |||
appPath = "\"" + rp.Replace(appPath) + "\"" | |||
} else { | |||
rp := strings.NewReplacer("\\", "/", " ", "\\ ") | |||
appPath = rp.Replace(appPath) | |||
} | |||
// hook/post-update | |||
if err := createHookUpdate(filepath.Join(repoPath, "hooks", "update"), | |||
fmt.Sprintf(TPL_UPDATE_HOOK, setting.ScriptType, appPath)); err != nil { | |||
fmt.Sprintf(TPL_UPDATE_HOOK, setting.ScriptType, "\""+appPath+"\"")); err != nil { | |||
return err | |||
} | |||
@@ -405,7 +381,7 @@ func initRepository(f string, user *User, repo *Repository, initReadme bool, rep | |||
} | |||
// Clone to temprory path and do the init commit. | |||
tmpDir := filepath.Join(os.TempDir(), base.ToStr(time.Now().Nanosecond())) | |||
tmpDir := filepath.Join(os.TempDir(), com.ToStr(time.Now().Nanosecond())) | |||
os.MkdirAll(tmpDir, os.ModePerm) | |||
_, stderr, err := process.Exec( | |||
@@ -426,12 +402,11 @@ func initRepository(f string, user *User, repo *Repository, initReadme bool, rep | |||
} | |||
// .gitignore | |||
if repoLang != "" { | |||
filePath := "conf/gitignore/" + repoLang | |||
filePath := "conf/gitignore/" + repoLang | |||
if com.IsFile(filePath) { | |||
targetPath := path.Join(tmpDir, fileName["gitign"]) | |||
data, err := bin.Asset(filePath) | |||
if err == nil { | |||
if err = ioutil.WriteFile(targetPath, data, os.ModePerm); err != nil { | |||
if com.IsFile(filePath) { | |||
if err = com.Copy(filePath, targetPath); err != nil { | |||
return err | |||
} | |||
} else { | |||
@@ -443,15 +418,16 @@ func initRepository(f string, user *User, repo *Repository, initReadme bool, rep | |||
} | |||
} | |||
} | |||
} else { | |||
delete(fileName, "gitign") | |||
} | |||
// LICENSE | |||
if license != "" { | |||
filePath := "conf/license/" + license | |||
filePath = "conf/license/" + license | |||
if com.IsFile(filePath) { | |||
targetPath := path.Join(tmpDir, fileName["license"]) | |||
data, err := bin.Asset(filePath) | |||
if err == nil { | |||
if err = ioutil.WriteFile(targetPath, data, os.ModePerm); err != nil { | |||
if com.IsFile(filePath) { | |||
if err = com.Copy(filePath, targetPath); err != nil { | |||
return err | |||
} | |||
} else { | |||
@@ -463,16 +439,16 @@ func initRepository(f string, user *User, repo *Repository, initReadme bool, rep | |||
} | |||
} | |||
} | |||
} else { | |||
delete(fileName, "license") | |||
} | |||
if len(fileName) == 0 { | |||
return nil | |||
} | |||
SetRepoEnvs(user.Id, user.Name, repo.Name, user.Name) | |||
// Apply changes and commit. | |||
return initRepoCommit(tmpDir, user.NewGitSig()) | |||
return initRepoCommit(tmpDir, u.NewGitSig()) | |||
} | |||
// CreateRepository creates a repository for given user or organization. | |||
@@ -549,15 +525,15 @@ func CreateRepository(u *User, name, desc, lang, license string, private, mirror | |||
} | |||
} | |||
rawSql := "UPDATE `user` SET num_repos = num_repos + 1 WHERE id = ?" | |||
if _, err = sess.Exec(rawSql, u.Id); err != nil { | |||
if _, err = sess.Exec( | |||
"UPDATE `user` SET num_repos = num_repos + 1 WHERE id = ?", u.Id); err != nil { | |||
sess.Rollback() | |||
return nil, err | |||
} | |||
// Update owner team info and count. | |||
if u.IsOrganization() { | |||
t.RepoIds += "$" + base.ToStr(repo.Id) + "|" | |||
t.RepoIds += "$" + com.ToStr(repo.Id) + "|" | |||
t.NumRepos++ | |||
if _, err = sess.Id(t.Id).AllCols().Update(t); err != nil { | |||
sess.Rollback() | |||
@@ -572,24 +548,24 @@ func CreateRepository(u *User, name, desc, lang, license string, private, mirror | |||
if u.IsOrganization() { | |||
ous, err := GetOrgUsersByOrgId(u.Id) | |||
if err != nil { | |||
log.Error("repo.CreateRepository(GetOrgUsersByOrgId): %v", err) | |||
log.Error(4, "repo.CreateRepository(GetOrgUsersByOrgId): %v", err) | |||
} else { | |||
for _, ou := range ous { | |||
if err = WatchRepo(ou.Uid, repo.Id, true); err != nil { | |||
log.Error("repo.CreateRepository(WatchRepo): %v", err) | |||
log.Error(4, "repo.CreateRepository(WatchRepo): %v", err) | |||
} | |||
} | |||
} | |||
} | |||
if err = WatchRepo(u.Id, repo.Id, true); err != nil { | |||
log.Error("repo.CreateRepository(WatchRepo2): %v", err) | |||
log.Error(4, "WatchRepo2: %v", err) | |||
} | |||
if err = NewRepoAction(u, repo); err != nil { | |||
log.Error("repo.CreateRepository(NewRepoAction): %v", err) | |||
log.Error(4, "NewRepoAction: %v", err) | |||
} | |||
// No need for init for mirror. | |||
// No need for init mirror. | |||
if mirror { | |||
return repo, nil | |||
} | |||
@@ -597,11 +573,11 @@ func CreateRepository(u *User, name, desc, lang, license string, private, mirror | |||
repoPath := RepoPath(u.Name, repo.Name) | |||
if err = initRepository(repoPath, u, repo, initReadme, lang, license); err != nil { | |||
if err2 := os.RemoveAll(repoPath); err2 != nil { | |||
log.Error("repo.CreateRepository(initRepository): %v", err) | |||
return nil, errors.New(fmt.Sprintf( | |||
"delete repo directory %s/%s failed(2): %v", u.Name, repo.Name, err2)) | |||
log.Error(4, "initRepository: %v", err) | |||
return nil, fmt.Errorf( | |||
"delete repo directory %s/%s failed(2): %v", u.Name, repo.Name, err2) | |||
} | |||
return nil, err | |||
return nil, fmt.Errorf("initRepository: %v", err) | |||
} | |||
_, stderr, err := process.ExecDir(-1, | |||
@@ -982,15 +958,12 @@ func WatchRepo(uid, rid int64, watch bool) (err error) { | |||
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 = x.Exec(rawSql, rid) | |||
_, err = x.Exec("UPDATE `repository` SET num_watches = num_watches + 1 WHERE id = ?", rid) | |||
} else { | |||
if _, err = x.Delete(&Watch{0, uid, rid}); err != nil { | |||
return err | |||
} | |||
rawSql := "UPDATE `repository` SET num_watches = num_watches - 1 WHERE id = ?" | |||
_, err = x.Exec(rawSql, rid) | |||
_, err = x.Exec("UPDATE `repository` SET num_watches = num_watches - 1 WHERE id = ?", rid) | |||
} | |||
return err | |||
} |
@@ -10,9 +10,8 @@ import ( | |||
"os/exec" | |||
"strings" | |||
"github.com/gogits/git" | |||
"github.com/gogits/gogs/modules/base" | |||
"github.com/gogits/gogs/modules/git" | |||
"github.com/gogits/gogs/modules/log" | |||
) | |||
@@ -47,8 +46,6 @@ func DelUpdateTasksByUuid(uuid string) error { | |||
} | |||
func Update(refName, oldCommitId, newCommitId, userName, repoUserName, repoName string, userId int64) error { | |||
//fmt.Println(refName, oldCommitId, newCommitId) | |||
//fmt.Println(userName, repoUserName, repoName) | |||
isNew := strings.HasPrefix(oldCommitId, "0000000") | |||
if isNew && | |||
strings.HasPrefix(newCommitId, "0000000") { | |||
@@ -82,12 +79,12 @@ func Update(refName, oldCommitId, newCommitId, userName, repoUserName, repoName | |||
return fmt.Errorf("runUpdate.GetRepositoryByName userId: %v", err) | |||
} | |||
// if tags push | |||
// Push tags. | |||
if strings.HasPrefix(refName, "refs/tags/") { | |||
tagName := git.RefEndName(refName) | |||
tag, err := repo.GetTag(tagName) | |||
if err != nil { | |||
log.GitLogger.Fatal("runUpdate.GetTag: %v", err) | |||
log.GitLogger.Fatal(4, "runUpdate.GetTag: %v", err) | |||
} | |||
var actEmail string | |||
@@ -96,7 +93,7 @@ func Update(refName, oldCommitId, newCommitId, userName, repoUserName, repoName | |||
} else { | |||
cmt, err := tag.Commit() | |||
if err != nil { | |||
log.GitLogger.Fatal("runUpdate.GetTag Commit: %v", err) | |||
log.GitLogger.Fatal(4, "runUpdate.GetTag Commit: %v", err) | |||
} | |||
actEmail = cmt.Committer.Email | |||
} | |||
@@ -105,7 +102,7 @@ func Update(refName, oldCommitId, newCommitId, userName, repoUserName, repoName | |||
if err = CommitRepoAction(userId, ru.Id, userName, actEmail, | |||
repos.Id, repoUserName, repoName, refName, commit); err != nil { | |||
log.GitLogger.Fatal("runUpdate.models.CommitRepoAction: %s/%s:%v", repoUserName, repoName, err) | |||
log.GitLogger.Fatal(4, "runUpdate.models.CommitRepoAction: %s/%s:%v", repoUserName, repoName, err) | |||
} | |||
return err | |||
} | |||
@@ -135,7 +132,7 @@ func Update(refName, oldCommitId, newCommitId, userName, repoUserName, repoName | |||
// if commits push | |||
commits := make([]*base.PushCommit, 0) | |||
var maxCommits = 3 | |||
var maxCommits = 2 | |||
var actEmail string | |||
for e := l.Front(); e != nil; e = e.Next() { | |||
commit := e.Value.(*git.Commit) |
@@ -14,9 +14,10 @@ import ( | |||
"strings" | |||
"time" | |||
"github.com/gogits/git" | |||
"github.com/Unknwon/com" | |||
"github.com/gogits/gogs/modules/base" | |||
"github.com/gogits/gogs/modules/git" | |||
"github.com/gogits/gogs/modules/log" | |||
"github.com/gogits/gogs/modules/setting" | |||
) | |||
@@ -77,6 +78,14 @@ type User struct { | |||
Members []*User `xorm:"-"` | |||
} | |||
// DashboardLink returns the user dashboard page link. | |||
func (u *User) DashboardLink() string { | |||
if u.IsOrganization() { | |||
return "/org/" + u.Name + "/dashboard" | |||
} | |||
return "/" | |||
} | |||
// HomeLink returns the user home page link. | |||
func (u *User) HomeLink() string { | |||
return "/user/" + u.Name | |||
@@ -157,23 +166,23 @@ func GetUserSalt() string { | |||
} | |||
// CreateUser creates record of a new user. | |||
func CreateUser(u *User) (*User, error) { | |||
func CreateUser(u *User) error { | |||
if !IsLegalName(u.Name) { | |||
return nil, ErrUserNameIllegal | |||
return ErrUserNameIllegal | |||
} | |||
isExist, err := IsUserExist(u.Name) | |||
if err != nil { | |||
return nil, err | |||
return err | |||
} else if isExist { | |||
return nil, ErrUserAlreadyExist | |||
return ErrUserAlreadyExist | |||
} | |||
isExist, err = IsEmailUsed(u.Email) | |||
if err != nil { | |||
return nil, err | |||
return err | |||
} else if isExist { | |||
return nil, ErrEmailAlreadyUsed | |||
return ErrEmailAlreadyUsed | |||
} | |||
u.LowerName = strings.ToLower(u.Name) | |||
@@ -186,21 +195,17 @@ func CreateUser(u *User) (*User, error) { | |||
sess := x.NewSession() | |||
defer sess.Close() | |||
if err = sess.Begin(); err != nil { | |||
return nil, err | |||
return err | |||
} | |||
if _, err = sess.Insert(u); err != nil { | |||
sess.Rollback() | |||
return nil, err | |||
} | |||
if err = os.MkdirAll(UserPath(u.Name), os.ModePerm); err != nil { | |||
return err | |||
} else if err = os.MkdirAll(UserPath(u.Name), os.ModePerm); err != nil { | |||
sess.Rollback() | |||
return nil, err | |||
} | |||
if err = sess.Commit(); err != nil { | |||
return nil, err | |||
return err | |||
} else if err = sess.Commit(); err != nil { | |||
return err | |||
} | |||
// Auto-set admin for user whose ID is 1. | |||
@@ -209,7 +214,7 @@ func CreateUser(u *User) (*User, error) { | |||
u.IsActive = true | |||
_, err = x.Id(u.Id).UseBool().Update(u) | |||
} | |||
return u, err | |||
return err | |||
} | |||
// CountUsers returns number of users. | |||
@@ -237,7 +242,7 @@ func getVerifyUser(code string) (user *User) { | |||
if user, err = GetUserByName(string(b)); user != nil { | |||
return user | |||
} | |||
log.Error("user.getVerifyUser: %v", err) | |||
log.Error(4, "user.getVerifyUser: %v", err) | |||
} | |||
return nil | |||
@@ -250,7 +255,7 @@ func VerifyUserActiveCode(code string) (user *User) { | |||
if user = getVerifyUser(code); user != nil { | |||
// time limit code | |||
prefix := code[:base.TimeLimitCodeLength] | |||
data := base.ToStr(user.Id) + user.Email + user.LowerName + user.Passwd + user.Rands | |||
data := com.ToStr(user.Id) + user.Email + user.LowerName + user.Passwd + user.Rands | |||
if base.VerifyTimeLimitCode(data, minutes, prefix) { | |||
return user | |||
@@ -260,12 +265,16 @@ func VerifyUserActiveCode(code string) (user *User) { | |||
} | |||
// ChangeUserName changes all corresponding setting from old user name to new one. | |||
func ChangeUserName(user *User, newUserName string) (err error) { | |||
func ChangeUserName(u *User, newUserName string) (err error) { | |||
if !IsLegalName(newUserName) { | |||
return ErrUserNameIllegal | |||
} | |||
newUserName = strings.ToLower(newUserName) | |||
// Update accesses of user. | |||
accesses := make([]Access, 0, 10) | |||
if err = x.Find(&accesses, &Access{UserName: user.LowerName}); err != nil { | |||
if err = x.Find(&accesses, &Access{UserName: u.LowerName}); err != nil { | |||
return err | |||
} | |||
@@ -277,28 +286,28 @@ func ChangeUserName(user *User, newUserName string) (err error) { | |||
for i := range accesses { | |||
accesses[i].UserName = newUserName | |||
if strings.HasPrefix(accesses[i].RepoName, user.LowerName+"/") { | |||
accesses[i].RepoName = strings.Replace(accesses[i].RepoName, user.LowerName, newUserName, 1) | |||
if strings.HasPrefix(accesses[i].RepoName, u.LowerName+"/") { | |||
accesses[i].RepoName = strings.Replace(accesses[i].RepoName, u.LowerName, newUserName, 1) | |||
} | |||
if err = UpdateAccessWithSession(sess, &accesses[i]); err != nil { | |||
return err | |||
} | |||
} | |||
repos, err := GetRepositories(user.Id, true) | |||
repos, err := GetRepositories(u.Id, true) | |||
if err != nil { | |||
return err | |||
} | |||
for i := range repos { | |||
accesses = make([]Access, 0, 10) | |||
// Update accesses of user repository. | |||
if err = x.Find(&accesses, &Access{RepoName: user.LowerName + "/" + repos[i].LowerName}); err != nil { | |||
if err = x.Find(&accesses, &Access{RepoName: u.LowerName + "/" + repos[i].LowerName}); err != nil { | |||
return err | |||
} | |||
for j := range accesses { | |||
// if the access is not the user's access (already updated above) | |||
if accesses[j].UserName != user.LowerName { | |||
if accesses[j].UserName != u.LowerName { | |||
accesses[j].RepoName = newUserName + "/" + repos[i].LowerName | |||
if err = UpdateAccessWithSession(sess, &accesses[j]); err != nil { | |||
return err | |||
@@ -308,7 +317,7 @@ func ChangeUserName(user *User, newUserName string) (err error) { | |||
} | |||
// Change user directory name. | |||
if err = os.Rename(UserPath(user.LowerName), UserPath(newUserName)); err != nil { | |||
if err = os.Rename(UserPath(u.LowerName), UserPath(newUserName)); err != nil { | |||
sess.Rollback() | |||
return err | |||
} | |||
@@ -317,7 +326,7 @@ func ChangeUserName(user *User, newUserName string) (err error) { | |||
} | |||
// UpdateUser updates user's information. | |||
func UpdateUser(u *User) (err error) { | |||
func UpdateUser(u *User) error { | |||
u.LowerName = strings.ToLower(u.Name) | |||
if len(u.Location) > 255 { | |||
@@ -330,7 +339,7 @@ func UpdateUser(u *User) (err error) { | |||
u.Description = u.Description[:255] | |||
} | |||
_, err = x.Id(u.Id).AllCols().Update(u) | |||
_, err := x.Id(u.Id).AllCols().Update(u) | |||
return err | |||
} | |||
@@ -340,7 +349,7 @@ func DeleteUser(u *User) error { | |||
// Check ownership of repository. | |||
count, err := GetRepositoryCount(u) | |||
if err != nil { | |||
return errors.New("modesl.GetRepositories(GetRepositoryCount): " + err.Error()) | |||
return errors.New("GetRepositoryCount: " + err.Error()) | |||
} else if count > 0 { | |||
return ErrUserOwnRepos | |||
} |
@@ -47,7 +47,7 @@ type Webhook struct { | |||
func (w *Webhook) GetEvent() { | |||
w.HookEvent = &HookEvent{} | |||
if err := json.Unmarshal([]byte(w.Events), w.HookEvent); err != nil { | |||
log.Error("webhook.GetEvent(%d): %v", w.Id, err) | |||
log.Error(4, "webhook.GetEvent(%d): %v", w.Id, err) | |||
} | |||
} | |||
@@ -193,13 +193,13 @@ func DeliverHooks() { | |||
// 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) | |||
log.Error(4, "webhook.DeliverHooks(Delivery): %v", err) | |||
return nil | |||
} | |||
t.IsDeliveried = true | |||
if err := UpdateHookTask(t); err != nil { | |||
log.Error("webhook.DeliverHooks(UpdateHookTask): %v", err) | |||
log.Error(4, "webhook.DeliverHooks(UpdateHookTask): %v", err) | |||
return nil | |||
} | |||
@@ -5,12 +5,9 @@ | |||
package auth | |||
import ( | |||
"net/http" | |||
"reflect" | |||
"github.com/Unknwon/macaron" | |||
"github.com/macaron-contrib/i18n" | |||
"github.com/go-martini/martini" | |||
"github.com/gogits/gogs/modules/base" | |||
"github.com/gogits/gogs/modules/middleware/binding" | |||
) | |||
@@ -25,17 +22,6 @@ type AdminEditUserForm struct { | |||
LoginType int `form:"login_type"` | |||
} | |||
func (f *AdminEditUserForm) Name(field string) string { | |||
names := map[string]string{ | |||
"Email": "E-mail address", | |||
"Website": "Website", | |||
"Location": "Location", | |||
"Avatar": "Gravatar Email", | |||
} | |||
return names[field] | |||
} | |||
func (f *AdminEditUserForm) Validate(errors *binding.Errors, req *http.Request, context martini.Context) { | |||
data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) | |||
validate(errors, data, f) | |||
func (f *AdminEditUserForm) Validate(ctx *macaron.Context, errs *binding.Errors, l i18n.Locale) { | |||
validate(errs, ctx.Data, f, l) | |||
} |
@@ -5,13 +5,12 @@ | |||
package apiv1 | |||
import ( | |||
"net/http" | |||
"reflect" | |||
"github.com/go-martini/martini" | |||
"github.com/Unknwon/macaron" | |||
"github.com/macaron-contrib/i18n" | |||
"github.com/gogits/gogs/modules/auth" | |||
"github.com/gogits/gogs/modules/base" | |||
"github.com/gogits/gogs/modules/log" | |||
"github.com/gogits/gogs/modules/middleware/binding" | |||
) | |||
@@ -22,17 +21,16 @@ type MarkdownForm struct { | |||
Context string `form:"context"` | |||
} | |||
func (f *MarkdownForm) Validate(errs *binding.Errors, req *http.Request, ctx martini.Context) { | |||
data := ctx.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) | |||
validateApiReq(errs, data, f) | |||
func (f *MarkdownForm) Validate(ctx *macaron.Context, errs *binding.Errors, l i18n.Locale) { | |||
validateApiReq(errs, ctx.Data, f, l) | |||
} | |||
func validateApiReq(errs *binding.Errors, data base.TmplData, f interface{}) { | |||
func validateApiReq(errs *binding.Errors, data map[string]interface{}, f interface{}, l i18n.Locale) { | |||
if errs.Count() == 0 { | |||
return | |||
} else if len(errs.Overall) > 0 { | |||
for _, err := range errs.Overall { | |||
log.Error("%s: %v", reflect.TypeOf(f), err) | |||
log.Error(4, "%s: %v", reflect.TypeOf(f), err) | |||
} | |||
return | |||
} |
@@ -7,49 +7,152 @@ package auth | |||
import ( | |||
"net/http" | |||
"reflect" | |||
"strings" | |||
"github.com/go-martini/martini" | |||
"github.com/macaron-contrib/i18n" | |||
"github.com/macaron-contrib/session" | |||
"github.com/gogits/gogs/modules/base" | |||
"github.com/gogits/gogs/models" | |||
"github.com/gogits/gogs/modules/log" | |||
"github.com/gogits/gogs/modules/middleware/binding" | |||
"github.com/gogits/gogs/modules/setting" | |||
) | |||
type AuthenticationForm struct { | |||
Id int64 `form:"id"` | |||
Type int `form:"type"` | |||
AuthName string `form:"name" binding:"Required;MaxSize(50)"` | |||
Domain string `form:"domain"` | |||
Host string `form:"host"` | |||
Port int `form:"port"` | |||
UseSSL bool `form:"usessl"` | |||
BaseDN string `form:"base_dn"` | |||
Attributes string `form:"attributes"` | |||
Filter string `form:"filter"` | |||
MsAdSA string `form:"ms_ad_sa"` | |||
IsActived bool `form:"is_actived"` | |||
SmtpAuth string `form:"smtpauth"` | |||
SmtpHost string `form:"smtphost"` | |||
SmtpPort int `form:"smtpport"` | |||
Tls bool `form:"tls"` | |||
AllowAutoRegister bool `form:"allowautoregister"` | |||
// SignedInId returns the id of signed in user. | |||
func SignedInId(header http.Header, sess session.Store) int64 { | |||
if !models.HasEngine { | |||
return 0 | |||
} | |||
if setting.Service.EnableReverseProxyAuth { | |||
webAuthUser := header.Get(setting.ReverseProxyAuthUser) | |||
if len(webAuthUser) > 0 { | |||
u, err := models.GetUserByName(webAuthUser) | |||
if err != nil { | |||
if err != models.ErrUserNotExist { | |||
log.Error(4, "GetUserByName: %v", err) | |||
} | |||
return 0 | |||
} | |||
return u.Id | |||
} | |||
} | |||
uid := sess.Get("uid") | |||
if uid == nil { | |||
return 0 | |||
} | |||
if id, ok := uid.(int64); ok { | |||
if _, err := models.GetUserById(id); err != nil { | |||
if err != models.ErrUserNotExist { | |||
log.Error(4, "GetUserById: %v", err) | |||
} | |||
return 0 | |||
} | |||
return id | |||
} | |||
return 0 | |||
} | |||
func (f *AuthenticationForm) Name(field string) string { | |||
names := map[string]string{ | |||
"AuthName": "Authentication's name", | |||
"Domain": "Domain name", | |||
"Host": "Host address", | |||
"Port": "Port Number", | |||
"UseSSL": "Use SSL", | |||
"BaseDN": "Base DN", | |||
"Attributes": "Search attributes", | |||
"Filter": "Search filter", | |||
"MsAdSA": "Ms Ad SA", | |||
} | |||
return names[field] | |||
// SignedInUser returns the user object of signed user. | |||
func SignedInUser(header http.Header, sess session.Store) *models.User { | |||
uid := SignedInId(header, sess) | |||
if uid <= 0 { | |||
return nil | |||
} | |||
u, err := models.GetUserById(uid) | |||
if err != nil { | |||
log.Error(4, "GetUserById: %v", err) | |||
return nil | |||
} | |||
return u | |||
} | |||
func (f *AuthenticationForm) Validate(errors *binding.Errors, req *http.Request, context martini.Context) { | |||
data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) | |||
validate(errors, data, f) | |||
// AssignForm assign form values back to the template data. | |||
func AssignForm(form interface{}, data map[string]interface{}) { | |||
typ := reflect.TypeOf(form) | |||
val := reflect.ValueOf(form) | |||
if typ.Kind() == reflect.Ptr { | |||
typ = typ.Elem() | |||
val = val.Elem() | |||
} | |||
for i := 0; i < typ.NumField(); i++ { | |||
field := typ.Field(i) | |||
fieldName := field.Tag.Get("form") | |||
// Allow ignored fields in the struct | |||
if fieldName == "-" { | |||
continue | |||
} | |||
data[fieldName] = val.Field(i).Interface() | |||
} | |||
} | |||
func GetMinMaxSize(field reflect.StructField) string { | |||
for _, rule := range strings.Split(field.Tag.Get("binding"), ";") { | |||
if strings.HasPrefix(rule, "MinSize(") || strings.HasPrefix(rule, "MaxSize(") { | |||
return rule[8 : len(rule)-1] | |||
} | |||
} | |||
return "" | |||
} | |||
func validate(errs *binding.Errors, data map[string]interface{}, f interface{}, l i18n.Locale) { | |||
if errs.Count() == 0 { | |||
return | |||
} else if len(errs.Overall) > 0 { | |||
for _, err := range errs.Overall { | |||
log.Error(4, "%s: %v", reflect.TypeOf(f), err) | |||
} | |||
return | |||
} | |||
data["HasError"] = true | |||
AssignForm(f, data) | |||
typ := reflect.TypeOf(f) | |||
val := reflect.ValueOf(f) | |||
if typ.Kind() == reflect.Ptr { | |||
typ = typ.Elem() | |||
val = val.Elem() | |||
} | |||
for i := 0; i < typ.NumField(); i++ { | |||
field := typ.Field(i) | |||
fieldName := field.Tag.Get("form") | |||
// Allow ignored fields in the struct | |||
if fieldName == "-" { | |||
continue | |||
} | |||
if err, ok := errs.Fields[field.Name]; ok { | |||
data["Err_"+field.Name] = true | |||
trName := l.Tr("form." + field.Name) | |||
switch err { | |||
case binding.BindingRequireError: | |||
data["ErrorMsg"] = trName + l.Tr("form.require_error") | |||
case binding.BindingAlphaDashError: | |||
data["ErrorMsg"] = trName + l.Tr("form.alpha_dash_error") | |||
case binding.BindingAlphaDashDotError: | |||
data["ErrorMsg"] = trName + l.Tr("form.alpha_dash_dot_error") | |||
case binding.BindingMinSizeError: | |||
data["ErrorMsg"] = trName + l.Tr("form.min_size_error", GetMinMaxSize(field)) | |||
case binding.BindingMaxSizeError: | |||
data["ErrorMsg"] = trName + l.Tr("form.max_size_error", GetMinMaxSize(field)) | |||
case binding.BindingEmailError: | |||
data["ErrorMsg"] = trName + l.Tr("form.email_error") | |||
case binding.BindingUrlError: | |||
data["ErrorMsg"] = trName + l.Tr("form.url_error") | |||
default: | |||
data["ErrorMsg"] = l.Tr("form.unknown_error") + " " + err | |||
} | |||
return | |||
} | |||
} | |||
} |
@@ -0,0 +1,36 @@ | |||
// 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 auth | |||
import ( | |||
"github.com/Unknwon/macaron" | |||
"github.com/macaron-contrib/i18n" | |||
"github.com/gogits/gogs/modules/middleware/binding" | |||
) | |||
type AuthenticationForm struct { | |||
Id int64 `form:"id"` | |||
Type int `form:"type"` | |||
AuthName string `form:"name" binding:"Required;MaxSize(50)"` | |||
Domain string `form:"domain"` | |||
Host string `form:"host"` | |||
Port int `form:"port"` | |||
UseSSL bool `form:"usessl"` | |||
BaseDN string `form:"base_dn"` | |||
Attributes string `form:"attributes"` | |||
Filter string `form:"filter"` | |||
MsAdSA string `form:"ms_ad_sa"` | |||
IsActived bool `form:"is_actived"` | |||
SmtpAuth string `form:"smtpauth"` | |||
SmtpHost string `form:"smtphost"` | |||
SmtpPort int `form:"smtpport"` | |||
Tls bool `form:"tls"` | |||
AllowAutoRegister bool `form:"allowautoregister"` | |||
} | |||
func (f *AuthenticationForm) Validate(ctx *macaron.Context, errs *binding.Errors, l i18n.Locale) { | |||
validate(errs, ctx.Data, f, l) | |||
} |
@@ -55,7 +55,7 @@ func LoginUser(name, passwd string) (a string, r bool) { | |||
func (ls Ldapsource) SearchEntry(name, passwd string) (string, bool) { | |||
l, err := ldapDial(ls) | |||
if err != nil { | |||
log.Error("LDAP Connect error, %s:%v", ls.Host, err) | |||
log.Error(4, "LDAP Connect error, %s:%v", ls.Host, err) | |||
ls.Enabled = false | |||
return "", false | |||
} |
@@ -5,12 +5,9 @@ | |||
package auth | |||
import ( | |||
"net/http" | |||
"reflect" | |||
"github.com/Unknwon/macaron" | |||
"github.com/macaron-contrib/i18n" | |||
"github.com/go-martini/martini" | |||
"github.com/gogits/gogs/modules/base" | |||
"github.com/gogits/gogs/modules/middleware/binding" | |||
) | |||
@@ -26,17 +23,8 @@ type CreateOrgForm struct { | |||
Email string `form:"email" binding:"Required;Email;MaxSize(50)"` | |||
} | |||
func (f *CreateOrgForm) Name(field string) string { | |||
names := map[string]string{ | |||
"OrgName": "Organization name", | |||
"Email": "E-mail address", | |||
} | |||
return names[field] | |||
} | |||
func (f *CreateOrgForm) Validate(errs *binding.Errors, req *http.Request, ctx martini.Context) { | |||
data := ctx.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) | |||
validate(errs, data, f) | |||
func (f *CreateOrgForm) Validate(ctx *macaron.Context, errs *binding.Errors, l i18n.Locale) { | |||
validate(errs, ctx.Data, f, l) | |||
} | |||
type OrgSettingForm struct { | |||
@@ -47,20 +35,8 @@ type OrgSettingForm struct { | |||
Location string `form:"location" binding:"MaxSize(50)"` | |||
} | |||
func (f *OrgSettingForm) Name(field string) string { | |||
names := map[string]string{ | |||
"DisplayName": "Display name", | |||
"Email": "E-mail address", | |||
"Description": "Description", | |||
"Website": "Website address", | |||
"Location": "Location", | |||
} | |||
return names[field] | |||
} | |||
func (f *OrgSettingForm) Validate(errors *binding.Errors, req *http.Request, context martini.Context) { | |||
data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) | |||
validate(errors, data, f) | |||
func (f *OrgSettingForm) Validate(ctx *macaron.Context, errs *binding.Errors, l i18n.Locale) { | |||
validate(errs, ctx.Data, f, l) | |||
} | |||
// ___________ | |||
@@ -76,15 +52,6 @@ type CreateTeamForm struct { | |||
Permission string `form:"permission"` | |||
} | |||
func (f *CreateTeamForm) Name(field string) string { | |||
names := map[string]string{ | |||
"TeamName": "Team name", | |||
"Description": "Team description", | |||
} | |||
return names[field] | |||
} | |||
func (f *CreateTeamForm) Validate(errs *binding.Errors, req *http.Request, ctx martini.Context) { | |||
data := ctx.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) | |||
validate(errs, data, f) | |||
func (f *CreateTeamForm) Validate(ctx *macaron.Context, errs *binding.Errors, l i18n.Locale) { | |||
validate(errs, ctx.Data, f, l) | |||
} |
@@ -1,33 +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 auth | |||
import ( | |||
"net/http" | |||
"reflect" | |||
"github.com/go-martini/martini" | |||
"github.com/gogits/gogs/modules/base" | |||
"github.com/gogits/gogs/modules/middleware/binding" | |||
) | |||
type AddSSHKeyForm struct { | |||
KeyName string `form:"keyname" binding:"Required"` | |||
KeyContent string `form:"key_content" binding:"Required"` | |||
} | |||
func (f *AddSSHKeyForm) Name(field string) string { | |||
names := map[string]string{ | |||
"KeyName": "SSH key name", | |||
"KeyContent": "SSH key content", | |||
} | |||
return names[field] | |||
} | |||
func (f *AddSSHKeyForm) Validate(errors *binding.Errors, req *http.Request, context martini.Context) { | |||
data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) | |||
validate(errors, data, f) | |||
} |
@@ -0,0 +1,21 @@ | |||
// 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 auth | |||
import ( | |||
"github.com/Unknwon/macaron" | |||
"github.com/macaron-contrib/i18n" | |||
"github.com/gogits/gogs/modules/middleware/binding" | |||
) | |||
type AddSSHKeyForm struct { | |||
SSHTitle string `form:"title" binding:"Required"` | |||
Content string `form:"content" binding:"Required"` | |||
} | |||
func (f *AddSSHKeyForm) Validate(ctx *macaron.Context, errs *binding.Errors, l i18n.Locale) { | |||
validate(errs, ctx.Data, f, l) | |||
} |
@@ -1,252 +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 auth | |||
import ( | |||
"net/http" | |||
"reflect" | |||
"github.com/go-martini/martini" | |||
"github.com/gogits/gogs/modules/base" | |||
"github.com/gogits/gogs/modules/middleware/binding" | |||
) | |||
// __________ .__ __ | |||
// \______ \ ____ ______ ____ _____|__|/ |_ ___________ ___.__. | |||
// | _// __ \\____ \ / _ \/ ___/ \ __\/ _ \_ __ < | | | |||
// | | \ ___/| |_> > <_> )___ \| || | ( <_> ) | \/\___ | | |||
// |____|_ /\___ > __/ \____/____ >__||__| \____/|__| / ____| | |||
// \/ \/|__| \/ \/ | |||
type CreateRepoForm struct { | |||
Uid int64 `form:"uid" binding:"Required"` | |||
RepoName string `form:"repo" binding:"Required;AlphaDash;MaxSize(100)"` | |||
Private bool `form:"private"` | |||
Description string `form:"desc" binding:"MaxSize(255)"` | |||
Language string `form:"language"` | |||
License string `form:"license"` | |||
InitReadme bool `form:"initReadme"` | |||
} | |||
func (f *CreateRepoForm) Name(field string) string { | |||
names := map[string]string{ | |||
"RepoName": "Repository name", | |||
"Description": "Description", | |||
} | |||
return names[field] | |||
} | |||
func (f *CreateRepoForm) Validate(errors *binding.Errors, req *http.Request, context martini.Context) { | |||
data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) | |||
validate(errors, data, f) | |||
} | |||
type MigrateRepoForm struct { | |||
Url string `form:"url" binding:"Url"` | |||
AuthUserName string `form:"auth_username"` | |||
AuthPasswd string `form:"auth_password"` | |||
Uid int64 `form:"uid" binding:"Required"` | |||
RepoName string `form:"repo" binding:"Required;AlphaDash;MaxSize(100)"` | |||
Mirror bool `form:"mirror"` | |||
Private bool `form:"private"` | |||
Description string `form:"desc" binding:"MaxSize(255)"` | |||
} | |||
func (f *MigrateRepoForm) Name(field string) string { | |||
names := map[string]string{ | |||
"Url": "Migration URL", | |||
"RepoName": "Repository name", | |||
"Description": "Description", | |||
} | |||
return names[field] | |||
} | |||
func (f *MigrateRepoForm) Validate(errors *binding.Errors, req *http.Request, context martini.Context) { | |||
data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) | |||
validate(errors, data, f) | |||
} | |||
type RepoSettingForm struct { | |||
RepoName string `form:"name" binding:"Required;AlphaDash;MaxSize(100)"` | |||
Description string `form:"desc" binding:"MaxSize(255)"` | |||
Website string `form:"site" binding:"Url;MaxSize(100)"` | |||
Branch string `form:"branch"` | |||
Interval int `form:"interval"` | |||
Private bool `form:"private"` | |||
GoGet bool `form:"goget"` | |||
} | |||
func (f *RepoSettingForm) Name(field string) string { | |||
names := map[string]string{ | |||
"RepoName": "Repository name", | |||
"Description": "Description", | |||
"Website": "Website address", | |||
} | |||
return names[field] | |||
} | |||
func (f *RepoSettingForm) Validate(errors *binding.Errors, req *http.Request, context martini.Context) { | |||
data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) | |||
validate(errors, data, f) | |||
} | |||
// __ __ ___. .__ .__ __ | |||
// / \ / \ ____\_ |__ | |__ | |__ ____ | | __ | |||
// \ \/\/ // __ \| __ \| | \| | \ / _ \| |/ / | |||
// \ /\ ___/| \_\ \ Y \ Y ( <_> ) < | |||
// \__/\ / \___ >___ /___| /___| /\____/|__|_ \ | |||
// \/ \/ \/ \/ \/ \/ | |||
type NewWebhookForm struct { | |||
Url string `form:"url" binding:"Required;Url"` | |||
ContentType string `form:"content_type" binding:"Required"` | |||
Secret string `form:"secret""` | |||
PushOnly bool `form:"push_only"` | |||
Active bool `form:"active"` | |||
} | |||
func (f *NewWebhookForm) Name(field string) string { | |||
names := map[string]string{ | |||
"Url": "Payload URL", | |||
"ContentType": "Content type", | |||
} | |||
return names[field] | |||
} | |||
func (f *NewWebhookForm) Validate(errors *binding.Errors, req *http.Request, context martini.Context) { | |||
data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) | |||
validate(errors, data, f) | |||
} | |||
// .___ | |||
// | | ______ ________ __ ____ | |||
// | |/ ___// ___/ | \_/ __ \ | |||
// | |\___ \ \___ \| | /\ ___/ | |||
// |___/____ >____ >____/ \___ > | |||
// \/ \/ \/ | |||
type CreateIssueForm struct { | |||
IssueName string `form:"title" binding:"Required;MaxSize(50)"` | |||
MilestoneId int64 `form:"milestoneid"` | |||
AssigneeId int64 `form:"assigneeid"` | |||
Labels string `form:"labels"` | |||
Content string `form:"content"` | |||
} | |||
func (f *CreateIssueForm) Name(field string) string { | |||
names := map[string]string{ | |||
"IssueName": "Issue name", | |||
} | |||
return names[field] | |||
} | |||
func (f *CreateIssueForm) Validate(errors *binding.Errors, req *http.Request, context martini.Context) { | |||
data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) | |||
validate(errors, data, f) | |||
} | |||
// _____ .__.__ __ | |||
// / \ |__| | ____ _______/ |_ ____ ____ ____ | |||
// / \ / \| | | _/ __ \ / ___/\ __\/ _ \ / \_/ __ \ | |||
// / Y \ | |_\ ___/ \___ \ | | ( <_> ) | \ ___/ | |||
// \____|__ /__|____/\___ >____ > |__| \____/|___| /\___ > | |||
// \/ \/ \/ \/ \/ | |||
type CreateMilestoneForm struct { | |||
Title string `form:"title" binding:"Required;MaxSize(50)"` | |||
Content string `form:"content"` | |||
Deadline string `form:"due_date"` | |||
} | |||
func (f *CreateMilestoneForm) Name(field string) string { | |||
names := map[string]string{ | |||
"Title": "Milestone name", | |||
} | |||
return names[field] | |||
} | |||
func (f *CreateMilestoneForm) Validate(errors *binding.Errors, req *http.Request, context martini.Context) { | |||
data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) | |||
validate(errors, data, f) | |||
} | |||
// .____ ___. .__ | |||
// | | _____ \_ |__ ____ | | | |||
// | | \__ \ | __ \_/ __ \| | | |||
// | |___ / __ \| \_\ \ ___/| |__ | |||
// |_______ (____ /___ /\___ >____/ | |||
// \/ \/ \/ \/ | |||
type CreateLabelForm struct { | |||
Title string `form:"title" binding:"Required;MaxSize(50)"` | |||
Color string `form:"color" binding:"Required;Size(7)"` | |||
} | |||
func (f *CreateLabelForm) Name(field string) string { | |||
names := map[string]string{ | |||
"Title": "Label name", | |||
"Color": "Label color", | |||
} | |||
return names[field] | |||
} | |||
func (f *CreateLabelForm) Validate(errors *binding.Errors, req *http.Request, context martini.Context) { | |||
data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) | |||
validate(errors, data, f) | |||
} | |||
// __________ .__ | |||
// \______ \ ____ | | ____ _____ ______ ____ | |||
// | _// __ \| | _/ __ \\__ \ / ___// __ \ | |||
// | | \ ___/| |_\ ___/ / __ \_\___ \\ ___/ | |||
// |____|_ /\___ >____/\___ >____ /____ >\___ > | |||
// \/ \/ \/ \/ \/ \/ | |||
type NewReleaseForm struct { | |||
TagName string `form:"tag_name" binding:"Required"` | |||
Target string `form:"tag_target" binding:"Required"` | |||
Title string `form:"title" binding:"Required"` | |||
Content string `form:"content" binding:"Required"` | |||
Draft string `form:"draft"` | |||
Prerelease bool `form:"prerelease"` | |||
} | |||
func (f *NewReleaseForm) Name(field string) string { | |||
names := map[string]string{ | |||
"TagName": "Tag name", | |||
"Target": "Target", | |||
"Title": "Release title", | |||
"Content": "Release content", | |||
} | |||
return names[field] | |||
} | |||
func (f *NewReleaseForm) Validate(errors *binding.Errors, req *http.Request, context martini.Context) { | |||
data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) | |||
validate(errors, data, f) | |||
} | |||
type EditReleaseForm struct { | |||
Target string `form:"tag_target" binding:"Required"` | |||
Title string `form:"title" binding:"Required"` | |||
Content string `form:"content" binding:"Required"` | |||
Draft string `form:"draft"` | |||
Prerelease bool `form:"prerelease"` | |||
} | |||
func (f *EditReleaseForm) Name(field string) string { | |||
names := map[string]string{ | |||
"Target": "Target", | |||
"Title": "Release title", | |||
"Content": "Release content", | |||
} | |||
return names[field] | |||
} | |||
func (f *EditReleaseForm) Validate(errors *binding.Errors, req *http.Request, context martini.Context) { | |||
data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) | |||
validate(errors, data, f) | |||
} |
@@ -0,0 +1,165 @@ | |||
// 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 auth | |||
import ( | |||
"github.com/Unknwon/macaron" | |||
"github.com/macaron-contrib/i18n" | |||
"github.com/gogits/gogs/modules/middleware/binding" | |||
) | |||
// _______________________________________ _________.______________________ _______________.___. | |||
// \______ \_ _____/\______ \_____ \ / _____/| \__ ___/\_____ \\______ \__ | | | |||
// | _/| __)_ | ___// | \ \_____ \ | | | | / | \| _// | | | |||
// | | \| \ | | / | \/ \| | | | / | \ | \\____ | | |||
// |____|_ /_______ / |____| \_______ /_______ /|___| |____| \_______ /____|_ // ______| | |||
// \/ \/ \/ \/ \/ \/ \/ | |||
type CreateRepoForm struct { | |||
Uid int64 `form:"uid" binding:"Required"` | |||
RepoName string `form:"repo_name" binding:"Required;AlphaDash;MaxSize(100)"` | |||
Private bool `form:"private"` | |||
Description string `form:"desc" binding:"MaxSize(255)"` | |||
Gitignore string `form:"gitignore"` | |||
License string `form:"license"` | |||
InitReadme bool `form:"init_readme"` | |||
} | |||
func (f *CreateRepoForm) Validate(ctx *macaron.Context, errs *binding.Errors, l i18n.Locale) { | |||
validate(errs, ctx.Data, f, l) | |||
} | |||
type MigrateRepoForm struct { | |||
Url string `form:"url" binding:"Url"` | |||
AuthUserName string `form:"auth_username"` | |||
AuthPasswd string `form:"auth_password"` | |||
Uid int64 `form:"uid" binding:"Required"` | |||
RepoName string `form:"repo" binding:"Required;AlphaDash;MaxSize(100)"` | |||
Mirror bool `form:"mirror"` | |||
Private bool `form:"private"` | |||
Description string `form:"desc" binding:"MaxSize(255)"` | |||
} | |||
func (f *MigrateRepoForm) Validate(ctx *macaron.Context, errs *binding.Errors, l i18n.Locale) { | |||
validate(errs, ctx.Data, f, l) | |||
} | |||
type RepoSettingForm struct { | |||
RepoName string `form:"name" binding:"Required;AlphaDash;MaxSize(100)"` | |||
Description string `form:"desc" binding:"MaxSize(255)"` | |||
Website string `form:"site" binding:"Url;MaxSize(100)"` | |||
Branch string `form:"branch"` | |||
Interval int `form:"interval"` | |||
Private bool `form:"private"` | |||
GoGet bool `form:"goget"` | |||
} | |||
func (f *RepoSettingForm) Validate(ctx *macaron.Context, errs *binding.Errors, l i18n.Locale) { | |||
validate(errs, ctx.Data, f, l) | |||
} | |||
// __ __ ___. .__ .__ __ | |||
// / \ / \ ____\_ |__ | |__ | |__ ____ | | __ | |||
// \ \/\/ // __ \| __ \| | \| | \ / _ \| |/ / | |||
// \ /\ ___/| \_\ \ Y \ Y ( <_> ) < | |||
// \__/\ / \___ >___ /___| /___| /\____/|__|_ \ | |||
// \/ \/ \/ \/ \/ \/ | |||
type NewWebhookForm struct { | |||
Url string `form:"url" binding:"Required;Url"` | |||
ContentType string `form:"content_type" binding:"Required"` | |||
Secret string `form:"secret""` | |||
PushOnly bool `form:"push_only"` | |||
Active bool `form:"active"` | |||
} | |||
func (f *NewWebhookForm) Validate(ctx *macaron.Context, errs *binding.Errors, l i18n.Locale) { | |||
validate(errs, ctx.Data, f, l) | |||
} | |||
// .___ | |||
// | | ______ ________ __ ____ | |||
// | |/ ___// ___/ | \_/ __ \ | |||
// | |\___ \ \___ \| | /\ ___/ | |||
// |___/____ >____ >____/ \___ > | |||
// \/ \/ \/ | |||
type CreateIssueForm struct { | |||
IssueName string `form:"title" binding:"Required;MaxSize(50)"` | |||
MilestoneId int64 `form:"milestoneid"` | |||
AssigneeId int64 `form:"assigneeid"` | |||
Labels string `form:"labels"` | |||
Content string `form:"content"` | |||
} | |||
func (f *CreateIssueForm) Validate(ctx *macaron.Context, errs *binding.Errors, l i18n.Locale) { | |||
validate(errs, ctx.Data, f, l) | |||
} | |||
// _____ .__.__ __ | |||
// / \ |__| | ____ _______/ |_ ____ ____ ____ | |||
// / \ / \| | | _/ __ \ / ___/\ __\/ _ \ / \_/ __ \ | |||
// / Y \ | |_\ ___/ \___ \ | | ( <_> ) | \ ___/ | |||
// \____|__ /__|____/\___ >____ > |__| \____/|___| /\___ > | |||
// \/ \/ \/ \/ \/ | |||
type CreateMilestoneForm struct { | |||
Title string `form:"title" binding:"Required;MaxSize(50)"` | |||
Content string `form:"content"` | |||
Deadline string `form:"due_date"` | |||
} | |||
func (f *CreateMilestoneForm) Validate(ctx *macaron.Context, errs *binding.Errors, l i18n.Locale) { | |||
validate(errs, ctx.Data, f, l) | |||
} | |||
// .____ ___. .__ | |||
// | | _____ \_ |__ ____ | | | |||
// | | \__ \ | __ \_/ __ \| | | |||
// | |___ / __ \| \_\ \ ___/| |__ | |||
// |_______ (____ /___ /\___ >____/ | |||
// \/ \/ \/ \/ | |||
type CreateLabelForm struct { | |||
Title string `form:"title" binding:"Required;MaxSize(50)"` | |||
Color string `form:"color" binding:"Required;Size(7)"` | |||
} | |||
func (f *CreateLabelForm) Validate(ctx *macaron.Context, errs *binding.Errors, l i18n.Locale) { | |||
validate(errs, ctx.Data, f, l) | |||
} | |||
// __________ .__ | |||
// \______ \ ____ | | ____ _____ ______ ____ | |||
// | _// __ \| | _/ __ \\__ \ / ___// __ \ | |||
// | | \ ___/| |_\ ___/ / __ \_\___ \\ ___/ | |||
// |____|_ /\___ >____/\___ >____ /____ >\___ > | |||
// \/ \/ \/ \/ \/ \/ | |||
type NewReleaseForm struct { | |||
TagName string `form:"tag_name" binding:"Required"` | |||
Target string `form:"tag_target" binding:"Required"` | |||
Title string `form:"title" binding:"Required"` | |||
Content string `form:"content" binding:"Required"` | |||
Draft string `form:"draft"` | |||
Prerelease bool `form:"prerelease"` | |||
} | |||
func (f *NewReleaseForm) Validate(ctx *macaron.Context, errs *binding.Errors, l i18n.Locale) { | |||
validate(errs, ctx.Data, f, l) | |||
} | |||
type EditReleaseForm struct { | |||
Target string `form:"tag_target" binding:"Required"` | |||
Title string `form:"title" binding:"Required"` | |||
Content string `form:"content" binding:"Required"` | |||
Draft string `form:"draft"` | |||
Prerelease bool `form:"prerelease"` | |||
} | |||
func (f *EditReleaseForm) Validate(ctx *macaron.Context, errs *binding.Errors, l i18n.Locale) { | |||
validate(errs, ctx.Data, f, l) | |||
} |
@@ -1,299 +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 auth | |||
import ( | |||
"net/http" | |||
"reflect" | |||
"strings" | |||
"github.com/go-martini/martini" | |||
"github.com/gogits/session" | |||
"github.com/gogits/gogs/models" | |||
"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" | |||
) | |||
// Web form interface. | |||
type Form interface { | |||
Name(field string) string | |||
} | |||
type RegisterForm struct { | |||
UserName string `form:"username" binding:"Required;AlphaDashDot;MaxSize(30)"` | |||
Email string `form:"email" binding:"Required;Email;MaxSize(50)"` | |||
Password string `form:"passwd" binding:"Required;MinSize(6);MaxSize(30)"` | |||
RetypePasswd string `form:"retypepasswd"` | |||
LoginType string `form:"logintype"` | |||
LoginName string `form:"loginname"` | |||
} | |||
func (f *RegisterForm) Name(field string) string { | |||
names := map[string]string{ | |||
"UserName": "Username", | |||
"Email": "E-mail address", | |||
"Password": "Password", | |||
"RetypePasswd": "Re-type password", | |||
} | |||
return names[field] | |||
} | |||
func (f *RegisterForm) Validate(errs *binding.Errors, req *http.Request, ctx martini.Context) { | |||
data := ctx.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) | |||
validate(errs, data, f) | |||
} | |||
type LogInForm struct { | |||
UserName string `form:"username" binding:"Required;MaxSize(35)"` | |||
Password string `form:"passwd" binding:"Required;MinSize(6);MaxSize(30)"` | |||
Remember bool `form:"remember"` | |||
} | |||
func (f *LogInForm) Name(field string) string { | |||
names := map[string]string{ | |||
"UserName": "Username", | |||
"Password": "Password", | |||
} | |||
return names[field] | |||
} | |||
func (f *LogInForm) Validate(errs *binding.Errors, req *http.Request, ctx martini.Context) { | |||
data := ctx.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) | |||
validate(errs, data, f) | |||
} | |||
func GetMinMaxSize(field reflect.StructField) string { | |||
for _, rule := range strings.Split(field.Tag.Get("binding"), ";") { | |||
if strings.HasPrefix(rule, "MinSize(") || strings.HasPrefix(rule, "MaxSize(") { | |||
return rule[8 : len(rule)-1] | |||
} | |||
} | |||
return "" | |||
} | |||
func validate(errs *binding.Errors, data base.TmplData, f Form) { | |||
if errs.Count() == 0 { | |||
return | |||
} else if len(errs.Overall) > 0 { | |||
for _, err := range errs.Overall { | |||
log.Error("%s: %v", reflect.TypeOf(f), err) | |||
} | |||
return | |||
} | |||
data["HasError"] = true | |||
AssignForm(f, data) | |||
typ := reflect.TypeOf(f) | |||
val := reflect.ValueOf(f) | |||
if typ.Kind() == reflect.Ptr { | |||
typ = typ.Elem() | |||
val = val.Elem() | |||
} | |||
for i := 0; i < typ.NumField(); i++ { | |||
field := typ.Field(i) | |||
fieldName := field.Tag.Get("form") | |||
// Allow ignored fields in the struct | |||
if fieldName == "-" { | |||
continue | |||
} | |||
if err, ok := errs.Fields[field.Name]; ok { | |||
data["Err_"+field.Name] = true | |||
switch err { | |||
case binding.BindingRequireError: | |||
data["ErrorMsg"] = f.Name(field.Name) + " cannot be empty" | |||
case binding.BindingAlphaDashError: | |||
data["ErrorMsg"] = f.Name(field.Name) + " must be valid alpha or numeric or dash(-_) characters" | |||
case binding.BindingAlphaDashDotError: | |||
data["ErrorMsg"] = f.Name(field.Name) + " must be valid alpha or numeric or dash(-_) or dot characters" | |||
case binding.BindingMinSizeError: | |||
data["ErrorMsg"] = f.Name(field.Name) + " must contain at least " + GetMinMaxSize(field) + " characters" | |||
case binding.BindingMaxSizeError: | |||
data["ErrorMsg"] = f.Name(field.Name) + " must contain at most " + GetMinMaxSize(field) + " characters" | |||
case binding.BindingEmailError: | |||
data["ErrorMsg"] = f.Name(field.Name) + " is not a valid e-mail address" | |||
case binding.BindingUrlError: | |||
data["ErrorMsg"] = f.Name(field.Name) + " is not a valid URL" | |||
default: | |||
data["ErrorMsg"] = "Unknown error: " + err | |||
} | |||
return | |||
} | |||
} | |||
} | |||
// AssignForm assign form values back to the template data. | |||
func AssignForm(form interface{}, data base.TmplData) { | |||
typ := reflect.TypeOf(form) | |||
val := reflect.ValueOf(form) | |||
if typ.Kind() == reflect.Ptr { | |||
typ = typ.Elem() | |||
val = val.Elem() | |||
} | |||
for i := 0; i < typ.NumField(); i++ { | |||
field := typ.Field(i) | |||
fieldName := field.Tag.Get("form") | |||
// Allow ignored fields in the struct | |||
if fieldName == "-" { | |||
continue | |||
} | |||
data[fieldName] = val.Field(i).Interface() | |||
} | |||
} | |||
type InstallForm struct { | |||
Database string `form:"database" binding:"Required"` | |||
Host string `form:"host"` | |||
User string `form:"user"` | |||
Passwd string `form:"passwd"` | |||
DatabaseName string `form:"database_name"` | |||
SslMode string `form:"ssl_mode"` | |||
DatabasePath string `form:"database_path"` | |||
RepoRootPath string `form:"repo_path"` | |||
RunUser string `form:"run_user"` | |||
Domain string `form:"domain"` | |||
AppUrl string `form:"app_url"` | |||
AdminName string `form:"admin_name" binding:"Required;AlphaDashDot;MaxSize(30)"` | |||
AdminPasswd string `form:"admin_pwd" binding:"Required;MinSize(6);MaxSize(30)"` | |||
AdminEmail string `form:"admin_email" binding:"Required;Email;MaxSize(50)"` | |||
SmtpHost string `form:"smtp_host"` | |||
SmtpEmail string `form:"mailer_user"` | |||
SmtpPasswd string `form:"mailer_pwd"` | |||
RegisterConfirm string `form:"register_confirm"` | |||
MailNotify string `form:"mail_notify"` | |||
} | |||
func (f *InstallForm) Name(field string) string { | |||
names := map[string]string{ | |||
"Database": "Database name", | |||
"AdminName": "Admin user name", | |||
"AdminPasswd": "Admin password", | |||
"AdminEmail": "Admin e-maill address", | |||
} | |||
return names[field] | |||
} | |||
func (f *InstallForm) Validate(errors *binding.Errors, req *http.Request, context martini.Context) { | |||
data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) | |||
validate(errors, data, f) | |||
} | |||
// SignedInId returns the id of signed in user. | |||
func SignedInId(header http.Header, sess session.SessionStore) int64 { | |||
if !models.HasEngine { | |||
return 0 | |||
} | |||
if setting.Service.EnableReverseProxyAuth { | |||
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 | |||
} | |||
} | |||
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) | |||
} | |||
return 0 | |||
} | |||
return id | |||
} | |||
return 0 | |||
} | |||
// SignedInUser returns the user object of signed user. | |||
func SignedInUser(header http.Header, sess session.SessionStore) *models.User { | |||
uid := SignedInId(header, sess) | |||
if uid <= 0 { | |||
return nil | |||
} | |||
u, err := models.GetUserById(uid) | |||
if err != nil { | |||
log.Error("user.SignedInUser: %v", err) | |||
return nil | |||
} | |||
return u | |||
} | |||
// IsSignedIn check if any user has signed in. | |||
func IsSignedIn(header http.Header, sess session.SessionStore) bool { | |||
return SignedInId(header, sess) > 0 | |||
} | |||
type FeedsForm struct { | |||
UserId int64 `form:"userid" binding:"Required"` | |||
Page int64 `form:"p"` | |||
} | |||
type UpdateProfileForm struct { | |||
UserName string `form:"username" binding:"Required;AlphaDash;MaxSize(30)"` | |||
FullName string `form:"fullname" binding:"MaxSize(40)"` | |||
Email string `form:"email" binding:"Required;Email;MaxSize(50)"` | |||
Website string `form:"website" binding:"Url;MaxSize(50)"` | |||
Location string `form:"location" binding:"MaxSize(50)"` | |||
Avatar string `form:"avatar" binding:"Required;Email;MaxSize(50)"` | |||
} | |||
func (f *UpdateProfileForm) Name(field string) string { | |||
names := map[string]string{ | |||
"UserName": "Username", | |||
"Email": "E-mail address", | |||
"Website": "Website address", | |||
"Location": "Location", | |||
"Avatar": "Gravatar Email", | |||
} | |||
return names[field] | |||
} | |||
func (f *UpdateProfileForm) Validate(errs *binding.Errors, req *http.Request, ctx martini.Context) { | |||
data := ctx.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) | |||
validate(errs, data, f) | |||
} | |||
type UpdatePasswdForm struct { | |||
OldPasswd string `form:"oldpasswd" binding:"Required;MinSize(6);MaxSize(30)"` | |||
NewPasswd string `form:"newpasswd" binding:"Required;MinSize(6);MaxSize(30)"` | |||
RetypePasswd string `form:"retypepasswd"` | |||
} | |||
func (f *UpdatePasswdForm) Name(field string) string { | |||
names := map[string]string{ | |||
"OldPasswd": "Old password", | |||
"NewPasswd": "New password", | |||
"RetypePasswd": "Re-type password", | |||
} | |||
return names[field] | |||
} | |||
func (f *UpdatePasswdForm) Validate(errs *binding.Errors, req *http.Request, ctx martini.Context) { | |||
data := ctx.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) | |||
validate(errs, data, f) | |||
} |
@@ -0,0 +1,98 @@ | |||
// 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 auth | |||
import ( | |||
"github.com/Unknwon/macaron" | |||
"github.com/macaron-contrib/i18n" | |||
"github.com/gogits/gogs/modules/middleware/binding" | |||
) | |||
type InstallForm struct { | |||
Database string `form:"database" binding:"Required"` | |||
Host string `form:"host"` | |||
User string `form:"user"` | |||
Passwd string `form:"passwd"` | |||
DatabaseName string `form:"database_name"` | |||
SslMode string `form:"ssl_mode"` | |||
DatabasePath string `form:"database_path"` | |||
RepoRootPath string `form:"repo_path"` | |||
RunUser string `form:"run_user"` | |||
Domain string `form:"domain"` | |||
AppUrl string `form:"app_url"` | |||
AdminName string `form:"admin_name" binding:"Required;AlphaDashDot;MaxSize(30)"` | |||
AdminPasswd string `form:"admin_pwd" binding:"Required;MinSize(6);MaxSize(30)"` | |||
AdminEmail string `form:"admin_email" binding:"Required;Email;MaxSize(50)"` | |||
SmtpHost string `form:"smtp_host"` | |||
SmtpEmail string `form:"mailer_user"` | |||
SmtpPasswd string `form:"mailer_pwd"` | |||
RegisterConfirm string `form:"register_confirm"` | |||
MailNotify string `form:"mail_notify"` | |||
} | |||
func (f *InstallForm) Validate(ctx *macaron.Context, errs *binding.Errors, l i18n.Locale) { | |||
validate(errs, ctx.Data, f, l) | |||
} | |||
// _____ ____ _________________ ___ | |||
// / _ \ | | \__ ___/ | \ | |||
// / /_\ \| | / | | / ~ \ | |||
// / | \ | / | | \ Y / | |||
// \____|__ /______/ |____| \___|_ / | |||
// \/ \/ | |||
type RegisterForm struct { | |||
UserName string `form:"uname" binding:"Required;AlphaDashDot;MaxSize(35)"` | |||
Email string `form:"email" binding:"Required;Email;MaxSize(50)"` | |||
Password string `form:"password" binding:"Required;MinSize(6);MaxSize(30)"` | |||
Retype string `form:"retype"` | |||
LoginType string `form:"logintype"` | |||
LoginName string `form:"loginname"` | |||
} | |||
func (f *RegisterForm) Validate(ctx *macaron.Context, errs *binding.Errors, l i18n.Locale) { | |||
validate(errs, ctx.Data, f, l) | |||
} | |||
type SignInForm struct { | |||
UserName string `form:"uname" binding:"Required;MaxSize(35)"` | |||
Password string `form:"password" binding:"Required;MinSize(6);MaxSize(30)"` | |||
Remember bool `form:"remember"` | |||
} | |||
func (f *SignInForm) Validate(ctx *macaron.Context, errs *binding.Errors, l i18n.Locale) { | |||
validate(errs, ctx.Data, f, l) | |||
} | |||
// __________________________________________.___ _______ ________ _________ | |||
// / _____/\_ _____/\__ ___/\__ ___/| |\ \ / _____/ / _____/ | |||
// \_____ \ | __)_ | | | | | |/ | \/ \ ___ \_____ \ | |||
// / \ | \ | | | | | / | \ \_\ \/ \ | |||
// /_______ //_______ / |____| |____| |___\____|__ /\______ /_______ / | |||
// \/ \/ \/ \/ \/ | |||
type UpdateProfileForm struct { | |||
UserName string `form:"uname" binding:"Required;MaxSize(35)"` | |||
FullName string `form:"fullname" binding:"MaxSize(40)"` | |||
Email string `form:"email" binding:"Required;Email;MaxSize(50)"` | |||
Website string `form:"website" binding:"Url;MaxSize(50)"` | |||
Location string `form:"location" binding:"MaxSize(50)"` | |||
Avatar string `form:"avatar" binding:"Required;Email;MaxSize(50)"` | |||
} | |||
func (f *UpdateProfileForm) Validate(ctx *macaron.Context, errs *binding.Errors, l i18n.Locale) { | |||
validate(errs, ctx.Data, f, l) | |||
} | |||
type ChangePasswordForm struct { | |||
OldPassword string `form:"old_password" binding:"Required;MinSize(6);MaxSize(30)"` | |||
Password string `form:"password" binding:"Required;MinSize(6);MaxSize(30)"` | |||
Retype string `form:"retype"` | |||
} | |||
func (f *ChangePasswordForm) Validate(ctx *macaron.Context, errs *binding.Errors, l i18n.Locale) { | |||
validate(errs, ctx.Data, f, l) | |||
} |
@@ -5,9 +5,7 @@ | |||
package base | |||
type ( | |||
// Type TmplData represents data in the templates. | |||
TmplData map[string]interface{} | |||
TplName string | |||
TplName string | |||
ApiJsonErr struct { | |||
Message string `json:"message"` |
@@ -51,7 +51,7 @@ var mailDomains = map[string]string{ | |||
var TemplateFuncs template.FuncMap = map[string]interface{}{ | |||
"GoVer": func() string { | |||
return runtime.Version() | |||
return strings.Title(runtime.Version()) | |||
}, | |||
"AppName": func() string { | |||
return setting.AppName | |||
@@ -69,7 +69,8 @@ var TemplateFuncs template.FuncMap = map[string]interface{}{ | |||
return fmt.Sprint(time.Since(startTime).Nanoseconds()/1e6) + "ms" | |||
}, | |||
"AvatarLink": AvatarLink, | |||
"str2html": Str2html, | |||
"str2html": Str2html, // TODO: Legacy | |||
"Str2html": Str2html, | |||
"TimeSince": TimeSince, | |||
"FileSize": FileSize, | |||
"Subtract": Subtract, | |||
@@ -98,10 +99,14 @@ var TemplateFuncs template.FuncMap = map[string]interface{}{ | |||
"DiffTypeToStr": DiffTypeToStr, | |||
"DiffLineTypeToStr": DiffLineTypeToStr, | |||
"ShortSha": ShortSha, | |||
"Oauth2Icon": Oauth2Icon, | |||
"Oauth2Name": Oauth2Name, | |||
"Md5": EncodeMd5, | |||
"ActionContent2Commits": ActionContent2Commits, | |||
"Oauth2Icon": Oauth2Icon, | |||
"Oauth2Name": Oauth2Name, | |||
"CreateCaptcha": func() string { return "" }, | |||
} | |||
// TODO: Legacy | |||
type Actioner interface { | |||
GetOpType() int | |||
GetActUserName() string | |||
@@ -117,11 +122,11 @@ type Actioner interface { | |||
func ActionIcon(opType int) string { | |||
switch opType { | |||
case 1: // Create repository. | |||
return "plus-circle" | |||
return "repo" | |||
case 5, 9: // Commit repository. | |||
return "arrow-circle-o-right" | |||
return "git-commit" | |||
case 6: // Create issue. | |||
return "exclamation-circle" | |||
return "issue-opened" | |||
case 8: // Transfer repository. | |||
return "share" | |||
case 10: // Comment issue. | |||
@@ -131,6 +136,7 @@ func ActionIcon(opType int) string { | |||
} | |||
} | |||
// TODO: Legacy | |||
const ( | |||
TPL_CREATE_REPO = `<a href="/user/%s">%s</a> created repository <a href="/%s">%s</a>` | |||
TPL_COMMIT_REPO = `<a href="/user/%s">%s</a> pushed to <a href="/%s/src/%s">%s</a> at <a href="/%s">%s</a>%s` | |||
@@ -155,6 +161,15 @@ type PushCommits struct { | |||
Commits []*PushCommit | |||
} | |||
func ActionContent2Commits(act Actioner) *PushCommits { | |||
var push *PushCommits | |||
if err := json.Unmarshal([]byte(act.GetContent()), &push); err != nil { | |||
return nil | |||
} | |||
return push | |||
} | |||
// TODO: Legacy | |||
// ActionDesc accepts int that represents action operation type | |||
// and returns the description. | |||
func ActionDesc(act Actioner) string { |
@@ -13,10 +13,13 @@ import ( | |||
"fmt" | |||
"hash" | |||
"math" | |||
"strconv" | |||
r "math/rand" | |||
"strings" | |||
"time" | |||
"github.com/Unknwon/com" | |||
"github.com/Unknwon/i18n" | |||
"github.com/gogits/gogs/modules/setting" | |||
) | |||
@@ -42,6 +45,33 @@ func GetRandomString(n int, alphabets ...byte) string { | |||
return string(bytes) | |||
} | |||
// RandomCreateBytes generate random []byte by specify chars. | |||
func RandomCreateBytes(n int, alphabets ...byte) []byte { | |||
const alphanum = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" | |||
var bytes = make([]byte, n) | |||
var randby bool | |||
if num, err := rand.Read(bytes); num != n || err != nil { | |||
r.Seed(time.Now().UnixNano()) | |||
randby = true | |||
} | |||
for i, b := range bytes { | |||
if len(alphabets) == 0 { | |||
if randby { | |||
bytes[i] = alphanum[r.Intn(len(alphanum))] | |||
} else { | |||
bytes[i] = alphanum[b%byte(len(alphanum))] | |||
} | |||
} else { | |||
if randby { | |||
bytes[i] = alphabets[r.Intn(len(alphabets))] | |||
} else { | |||
bytes[i] = alphabets[b%byte(len(alphabets))] | |||
} | |||
} | |||
} | |||
return bytes | |||
} | |||
// http://code.google.com/p/go/source/browse/pbkdf2/pbkdf2.go?repo=crypto | |||
func PBKDF2(password, salt []byte, iter, keyLen int, h func() hash.Hash) []byte { | |||
prf := hmac.New(h, password) | |||
@@ -89,7 +119,7 @@ func VerifyTimeLimitCode(data string, minutes int, code string) bool { | |||
// split code | |||
start := code[:12] | |||
lives := code[12:18] | |||
if d, err := StrTo(lives).Int(); err == nil { | |||
if d, err := com.StrTo(lives).Int(); err == nil { | |||
minutes = d | |||
} | |||
@@ -133,7 +163,7 @@ func CreateTimeLimitCode(data string, minutes int, startInf interface{}) string | |||
// create sha1 encode string | |||
sh := sha1.New() | |||
sh.Write([]byte(data + setting.SecretKey + startStr + endStr + ToStr(minutes))) | |||
sh.Write([]byte(data + setting.SecretKey + startStr + endStr + com.ToStr(minutes))) | |||
encoded := hex.EncodeToString(sh.Sum(nil)) | |||
code := fmt.Sprintf("%s%06d%s", startStr, minutes, encoded) | |||
@@ -240,53 +270,53 @@ func TimeSincePro(then time.Time) string { | |||
} | |||
// TimeSince calculates the time interval and generate user-friendly string. | |||
func TimeSince(then time.Time) string { | |||
func TimeSince(then time.Time, lang string) string { | |||
now := time.Now() | |||
lbl := "ago" | |||
lbl := i18n.Tr(lang, "tool.ago") | |||
diff := now.Unix() - then.Unix() | |||
if then.After(now) { | |||
lbl = "from now" | |||
lbl = i18n.Tr(lang, "tool.from_now") | |||
diff = then.Unix() - now.Unix() | |||
} | |||
switch { | |||
case diff <= 0: | |||
return "now" | |||
return i18n.Tr(lang, "tool.now") | |||
case diff <= 2: | |||
return fmt.Sprintf("1 second %s", lbl) | |||
return i18n.Tr(lang, "tool.1s", lbl) | |||
case diff < 1*Minute: | |||
return fmt.Sprintf("%d seconds %s", diff, lbl) | |||
return i18n.Tr(lang, "tool.seconds", diff, lbl) | |||
case diff < 2*Minute: | |||
return fmt.Sprintf("1 minute %s", lbl) | |||
return i18n.Tr(lang, "tool.1m", lbl) | |||
case diff < 1*Hour: | |||
return fmt.Sprintf("%d minutes %s", diff/Minute, lbl) | |||
return i18n.Tr(lang, "tool.minutes", diff/Minute, lbl) | |||
case diff < 2*Hour: | |||
return fmt.Sprintf("1 hour %s", lbl) | |||
return i18n.Tr(lang, "tool.1h", lbl) | |||
case diff < 1*Day: | |||
return fmt.Sprintf("%d hours %s", diff/Hour, lbl) | |||
return i18n.Tr(lang, "tool.hours", diff/Hour, lbl) | |||
case diff < 2*Day: | |||
return fmt.Sprintf("1 day %s", lbl) | |||
return i18n.Tr(lang, "tool.1d", lbl) | |||
case diff < 1*Week: | |||
return fmt.Sprintf("%d days %s", diff/Day, lbl) | |||
return i18n.Tr(lang, "tool.days", diff/Day, lbl) | |||
case diff < 2*Week: | |||
return fmt.Sprintf("1 week %s", lbl) | |||
return i18n.Tr(lang, "tool.1w", lbl) | |||
case diff < 1*Month: | |||
return fmt.Sprintf("%d weeks %s", diff/Week, lbl) | |||
return i18n.Tr(lang, "tool.weeks", diff/Week, lbl) | |||
case diff < 2*Month: | |||
return fmt.Sprintf("1 month %s", lbl) | |||
return i18n.Tr(lang, "tool.1mon", lbl) | |||
case diff < 1*Year: | |||
return fmt.Sprintf("%d months %s", diff/Month, lbl) | |||
return i18n.Tr(lang, "tool.months", diff/Month, lbl) | |||
case diff < 2*Year: | |||
return fmt.Sprintf("1 year %s", lbl) | |||
return i18n.Tr(lang, "tool.1y", lbl) | |||
default: | |||
return fmt.Sprintf("%d years %s", diff/Year, lbl) | |||
return i18n.Tr(lang, "tool.years", diff/Year, lbl) | |||
} | |||
} | |||
@@ -439,88 +469,3 @@ func DateFormat(t time.Time, format string) string { | |||
format = replacer.Replace(format) | |||
return t.Format(format) | |||
} | |||
// convert string to specify type | |||
type StrTo string | |||
func (f StrTo) Exist() bool { | |||
return string(f) != string(0x1E) | |||
} | |||
func (f StrTo) Int() (int, error) { | |||
v, err := strconv.ParseInt(f.String(), 10, 32) | |||
return int(v), err | |||
} | |||
func (f StrTo) Int64() (int64, error) { | |||
v, err := strconv.ParseInt(f.String(), 10, 64) | |||
return int64(v), err | |||
} | |||
func (f StrTo) MustInt() int { | |||
v, _ := f.Int() | |||
return v | |||
} | |||
func (f StrTo) MustInt64() int64 { | |||
v, _ := f.Int64() | |||
return v | |||
} | |||
func (f StrTo) String() string { | |||
if f.Exist() { | |||
return string(f) | |||
} | |||
return "" | |||
} | |||
// convert any type to string | |||
func ToStr(value interface{}, args ...int) (s string) { | |||
switch v := value.(type) { | |||
case bool: | |||
s = strconv.FormatBool(v) | |||
case float32: | |||
s = strconv.FormatFloat(float64(v), 'f', argInt(args).Get(0, -1), argInt(args).Get(1, 32)) | |||
case float64: | |||
s = strconv.FormatFloat(v, 'f', argInt(args).Get(0, -1), argInt(args).Get(1, 64)) | |||
case int: | |||
s = strconv.FormatInt(int64(v), argInt(args).Get(0, 10)) | |||
case int8: | |||
s = strconv.FormatInt(int64(v), argInt(args).Get(0, 10)) | |||
case int16: | |||
s = strconv.FormatInt(int64(v), argInt(args).Get(0, 10)) | |||
case int32: | |||
s = strconv.FormatInt(int64(v), argInt(args).Get(0, 10)) | |||
case int64: | |||
s = strconv.FormatInt(v, argInt(args).Get(0, 10)) | |||
case uint: | |||
s = strconv.FormatUint(uint64(v), argInt(args).Get(0, 10)) | |||
case uint8: | |||
s = strconv.FormatUint(uint64(v), argInt(args).Get(0, 10)) | |||
case uint16: | |||
s = strconv.FormatUint(uint64(v), argInt(args).Get(0, 10)) | |||
case uint32: | |||
s = strconv.FormatUint(uint64(v), argInt(args).Get(0, 10)) | |||
case uint64: | |||
s = strconv.FormatUint(v, argInt(args).Get(0, 10)) | |||
case string: | |||
s = v | |||
case []byte: | |||
s = string(v) | |||
default: | |||
s = fmt.Sprintf("%v", v) | |||
} | |||
return s | |||
} | |||
type argInt []int | |||
func (a argInt) Get(i int, args ...int) (r int) { | |||
if i >= 0 && i < len(a) { | |||
r = a[i] | |||
} else if len(args) > 0 { | |||
r = args[0] | |||
} | |||
return | |||
} |
@@ -0,0 +1,201 @@ | |||
// 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 captcha a middleware that provides captcha service for Macaron. | |||
package captcha | |||
import ( | |||
"fmt" | |||
"html/template" | |||
"net/http" | |||
"path" | |||
"strings" | |||
"github.com/Unknwon/macaron" | |||
"github.com/gogits/cache" | |||
"github.com/gogits/gogs/modules/base" | |||
"github.com/gogits/gogs/modules/log" | |||
) | |||
var ( | |||
defaultChars = []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} | |||
) | |||
const ( | |||
// default captcha attributes | |||
challengeNums = 6 | |||
expiration = 600 | |||
fieldIdName = "captcha_id" | |||
fieldCaptchaName = "captcha" | |||
cachePrefix = "captcha_" | |||
defaultURLPrefix = "/captcha/" | |||
) | |||
// Captcha struct | |||
type Captcha struct { | |||
store cache.Cache | |||
// url prefix for captcha image | |||
URLPrefix string | |||
// specify captcha id input field name | |||
FieldIdName string | |||
// specify captcha result input field name | |||
FieldCaptchaName string | |||
// captcha image width and height | |||
StdWidth int | |||
StdHeight int | |||
// captcha chars nums | |||
ChallengeNums int | |||
// captcha expiration seconds | |||
Expiration int64 | |||
// cache key prefix | |||
CachePrefix string | |||
} | |||
// generate key string | |||
func (c *Captcha) key(id string) string { | |||
return c.CachePrefix + id | |||
} | |||
// generate rand chars with default chars | |||
func (c *Captcha) genRandChars() []byte { | |||
return base.RandomCreateBytes(c.ChallengeNums, defaultChars...) | |||
} | |||
// beego filter handler for serve captcha image | |||
func (c *Captcha) Handler(ctx *macaron.Context) { | |||
var chars []byte | |||
id := path.Base(ctx.Req.RequestURI) | |||
if i := strings.Index(id, "."); i != -1 { | |||
id = id[:i] | |||
} | |||
key := c.key(id) | |||
if v, ok := c.store.Get(key).([]byte); ok { | |||
chars = v | |||
} else { | |||
ctx.Status(404) | |||
ctx.Write([]byte("captcha not found")) | |||
return | |||
} | |||
// reload captcha | |||
if len(ctx.Query("reload")) > 0 { | |||
chars = c.genRandChars() | |||
if err := c.store.Put(key, chars, c.Expiration); err != nil { | |||
ctx.Status(500) | |||
ctx.Write([]byte("captcha reload error")) | |||
log.Error(4, "Reload Create Captcha Error: %v", err) | |||
return | |||
} | |||
} | |||
img := NewImage(chars, c.StdWidth, c.StdHeight) | |||
if _, err := img.WriteTo(ctx.RW()); err != nil { | |||
log.Error(4, "Write Captcha Image Error: %v", err) | |||
} | |||
} | |||
// tempalte func for output html | |||
func (c *Captcha) CreateCaptchaHtml() template.HTML { | |||
value, err := c.CreateCaptcha() | |||
if err != nil { | |||
log.Error(4, "Create Captcha Error: %v", err) | |||
return "" | |||
} | |||
// create html | |||
return template.HTML(fmt.Sprintf(`<input type="hidden" name="%s" value="%s">`+ | |||
`<a class="captcha" href="javascript:">`+ | |||
`<img onclick="this.src=('%s%s.png?reload='+(new Date()).getTime())" class="captcha-img" src="%s%s.png">`+ | |||
`</a>`, c.FieldIdName, value, c.URLPrefix, value, c.URLPrefix, value)) | |||
} | |||
// create a new captcha id | |||
func (c *Captcha) CreateCaptcha() (string, error) { | |||
// generate captcha id | |||
id := string(base.RandomCreateBytes(15)) | |||
// get the captcha chars | |||
chars := c.genRandChars() | |||
// save to store | |||
if err := c.store.Put(c.key(id), chars, c.Expiration); err != nil { | |||
return "", err | |||
} | |||
return id, nil | |||
} | |||
// verify from a request | |||
func (c *Captcha) VerifyReq(req *http.Request) bool { | |||
req.ParseForm() | |||
return c.Verify(req.Form.Get(c.FieldIdName), req.Form.Get(c.FieldCaptchaName)) | |||
} | |||
// direct verify id and challenge string | |||
func (c *Captcha) Verify(id string, challenge string) (success bool) { | |||
if len(challenge) == 0 || len(id) == 0 { | |||
return | |||
} | |||
var chars []byte | |||
key := c.key(id) | |||
if v, ok := c.store.Get(key).([]byte); ok && len(v) == len(challenge) { | |||
chars = v | |||
} else { | |||
return | |||
} | |||
defer func() { | |||
// finally remove it | |||
c.store.Delete(key) | |||
}() | |||
// verify challenge | |||
for i, c := range chars { | |||
if c != challenge[i]-48 { | |||
return | |||
} | |||
} | |||
return true | |||
} | |||
// create a new captcha.Captcha | |||
func NewCaptcha(urlPrefix string, store cache.Cache) *Captcha { | |||
cpt := &Captcha{} | |||
cpt.store = store | |||
cpt.FieldIdName = fieldIdName | |||
cpt.FieldCaptchaName = fieldCaptchaName | |||
cpt.ChallengeNums = challengeNums | |||
cpt.Expiration = expiration | |||
cpt.CachePrefix = cachePrefix | |||
cpt.StdWidth = stdWidth | |||
cpt.StdHeight = stdHeight | |||
if len(urlPrefix) == 0 { | |||
urlPrefix = defaultURLPrefix | |||
} | |||
if urlPrefix[len(urlPrefix)-1] != '/' { | |||
urlPrefix += "/" | |||
} | |||
cpt.URLPrefix = urlPrefix | |||
base.TemplateFuncs["CreateCaptcha"] = cpt.CreateCaptchaHtml | |||
return cpt | |||
} |
@@ -0,0 +1,487 @@ | |||
// 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 captcha | |||
import ( | |||
"bytes" | |||
"image" | |||
"image/color" | |||
"image/png" | |||
"io" | |||
"math" | |||
) | |||
const ( | |||
fontWidth = 11 | |||
fontHeight = 18 | |||
blackChar = 1 | |||
// Standard width and height of a captcha image. | |||
stdWidth = 240 | |||
stdHeight = 80 | |||
// Maximum absolute skew factor of a single digit. | |||
maxSkew = 0.7 | |||
// Number of background circles. | |||
circleCount = 20 | |||
) | |||
var font = [][]byte{ | |||
{ // 0 | |||
0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, | |||
0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, | |||
0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, | |||
0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, | |||
1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, | |||
1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, | |||
1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, | |||
1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, | |||
1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, | |||
1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, | |||
1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, | |||
1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, | |||
1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, | |||
1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, | |||
0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, | |||
0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, | |||
0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, | |||
0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, | |||
}, | |||
{ // 1 | |||
0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, | |||
0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, | |||
0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, | |||
0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, | |||
0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, | |||
0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, | |||
0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, | |||
0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, | |||
0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, | |||
0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, | |||
0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, | |||
0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, | |||
0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, | |||
0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, | |||
0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, | |||
0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, | |||
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |||
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |||
}, | |||
{ // 2 | |||
0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, | |||
0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, | |||
1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, | |||
0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, | |||
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, | |||
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, | |||
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, | |||
0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, | |||
0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, | |||
0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, | |||
0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, | |||
0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, | |||
0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, | |||
0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, | |||
0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, | |||
0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, | |||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |||
}, | |||
{ // 3 | |||
0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, | |||
1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, | |||
1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, | |||
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, | |||
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, | |||
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, | |||
0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, | |||
0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, | |||
0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, | |||
0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, | |||
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, | |||
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, | |||
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, | |||
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, | |||
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, | |||
1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, | |||
1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, | |||
0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, | |||
}, | |||
{ // 4 | |||
0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, | |||
0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, | |||
0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, | |||
0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, | |||
0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, | |||
0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, | |||
0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, | |||
0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, | |||
0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, | |||
0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, | |||
1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, | |||
1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, | |||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |||
0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, | |||
0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, | |||
0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, | |||
0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, | |||
}, | |||
{ // 5 | |||
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, | |||
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, | |||
0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, | |||
0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, | |||
0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, | |||
0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, | |||
0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, | |||
0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, | |||
0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, | |||
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, | |||
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, | |||
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, | |||
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, | |||
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, | |||
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, | |||
1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, | |||
1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, | |||
0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, | |||
}, | |||
{ // 6 | |||
0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, | |||
0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, | |||
0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, | |||
0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, | |||
0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, | |||
0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, | |||
1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, | |||
1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, | |||
1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, | |||
1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, | |||
1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, | |||
1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, | |||
1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, | |||
0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, | |||
0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, | |||
0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, | |||
0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, | |||
}, | |||
{ // 7 | |||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |||
1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, | |||
1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, | |||
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, | |||
0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, | |||
0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, | |||
0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, | |||
0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, | |||
0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, | |||
0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, | |||
0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, | |||
0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, | |||
0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, | |||
0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, | |||
0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, | |||
0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, | |||
0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, | |||
}, | |||
{ // 8 | |||
0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, | |||
0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, | |||
0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, | |||
0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, | |||
0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, | |||
0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, | |||
0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, | |||
0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, | |||
0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, | |||
0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, | |||
0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, | |||
1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, | |||
1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, | |||
1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, | |||
1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, | |||
1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, | |||
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, | |||
0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, | |||
}, | |||
{ // 9 | |||
0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, | |||
0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, | |||
0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, | |||
1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, | |||
1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, | |||
1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, | |||
1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, | |||
1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, | |||
0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, | |||
0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, | |||
0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, | |||
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, | |||
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, | |||
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, | |||
0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, | |||
0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, | |||
0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, | |||
0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, | |||
}, | |||
} | |||
type Image struct { | |||
*image.Paletted | |||
numWidth int | |||
numHeight int | |||
dotSize int | |||
} | |||
var prng = &siprng{} | |||
// randIntn returns a pseudorandom non-negative int in range [0, n). | |||
func randIntn(n int) int { | |||
return prng.Intn(n) | |||
} | |||
// randInt returns a pseudorandom int in range [from, to]. | |||
func randInt(from, to int) int { | |||
return prng.Intn(to+1-from) + from | |||
} | |||
// randFloat returns a pseudorandom float64 in range [from, to]. | |||
func randFloat(from, to float64) float64 { | |||
return (to-from)*prng.Float64() + from | |||
} | |||
func randomPalette() color.Palette { | |||
p := make([]color.Color, circleCount+1) | |||
// Transparent color. | |||
p[0] = color.RGBA{0xFF, 0xFF, 0xFF, 0x00} | |||
// Primary color. | |||
prim := color.RGBA{ | |||
uint8(randIntn(129)), | |||
uint8(randIntn(129)), | |||
uint8(randIntn(129)), | |||
0xFF, | |||
} | |||
p[1] = prim | |||
// Circle colors. | |||
for i := 2; i <= circleCount; i++ { | |||
p[i] = randomBrightness(prim, 255) | |||
} | |||
return p | |||
} | |||
// NewImage returns a new captcha image of the given width and height with the | |||
// given digits, where each digit must be in range 0-9. | |||
func NewImage(digits []byte, width, height int) *Image { | |||
m := new(Image) | |||
m.Paletted = image.NewPaletted(image.Rect(0, 0, width, height), randomPalette()) | |||
m.calculateSizes(width, height, len(digits)) | |||
// Randomly position captcha inside the image. | |||
maxx := width - (m.numWidth+m.dotSize)*len(digits) - m.dotSize | |||
maxy := height - m.numHeight - m.dotSize*2 | |||
var border int | |||
if width > height { | |||
border = height / 5 | |||
} else { | |||
border = width / 5 | |||
} | |||
x := randInt(border, maxx-border) | |||
y := randInt(border, maxy-border) | |||
// Draw digits. | |||
for _, n := range digits { | |||
m.drawDigit(font[n], x, y) | |||
x += m.numWidth + m.dotSize | |||
} | |||
// Draw strike-through line. | |||
m.strikeThrough() | |||
// Apply wave distortion. | |||
m.distort(randFloat(5, 10), randFloat(100, 200)) | |||
// Fill image with random circles. | |||
m.fillWithCircles(circleCount, m.dotSize) | |||
return m | |||
} | |||
// encodedPNG encodes an image to PNG and returns | |||
// the result as a byte slice. | |||
func (m *Image) encodedPNG() []byte { | |||
var buf bytes.Buffer | |||
if err := png.Encode(&buf, m.Paletted); err != nil { | |||
panic(err.Error()) | |||
} | |||
return buf.Bytes() | |||
} | |||
// WriteTo writes captcha image in PNG format into the given writer. | |||
func (m *Image) WriteTo(w io.Writer) (int64, error) { | |||
n, err := w.Write(m.encodedPNG()) | |||
return int64(n), err | |||
} | |||
func (m *Image) calculateSizes(width, height, ncount int) { | |||
// Goal: fit all digits inside the image. | |||
var border int | |||
if width > height { | |||
border = height / 4 | |||
} else { | |||
border = width / 4 | |||
} | |||
// Convert everything to floats for calculations. | |||
w := float64(width - border*2) | |||
h := float64(height - border*2) | |||
// fw takes into account 1-dot spacing between digits. | |||
fw := float64(fontWidth + 1) | |||
fh := float64(fontHeight) | |||
nc := float64(ncount) | |||
// Calculate the width of a single digit taking into account only the | |||
// width of the image. | |||
nw := w / nc | |||
// Calculate the height of a digit from this width. | |||
nh := nw * fh / fw | |||
// Digit too high? | |||
if nh > h { | |||
// Fit digits based on height. | |||
nh = h | |||
nw = fw / fh * nh | |||
} | |||
// Calculate dot size. | |||
m.dotSize = int(nh / fh) | |||
// Save everything, making the actual width smaller by 1 dot to account | |||
// for spacing between digits. | |||
m.numWidth = int(nw) - m.dotSize | |||
m.numHeight = int(nh) | |||
} | |||
func (m *Image) drawHorizLine(fromX, toX, y int, colorIdx uint8) { | |||
for x := fromX; x <= toX; x++ { | |||
m.SetColorIndex(x, y, colorIdx) | |||
} | |||
} | |||
func (m *Image) drawCircle(x, y, radius int, colorIdx uint8) { | |||
f := 1 - radius | |||
dfx := 1 | |||
dfy := -2 * radius | |||
xo := 0 | |||
yo := radius | |||
m.SetColorIndex(x, y+radius, colorIdx) | |||
m.SetColorIndex(x, y-radius, colorIdx) | |||
m.drawHorizLine(x-radius, x+radius, y, colorIdx) | |||
for xo < yo { | |||
if f >= 0 { | |||
yo-- | |||
dfy += 2 | |||
f += dfy | |||
} | |||
xo++ | |||
dfx += 2 | |||
f += dfx | |||
m.drawHorizLine(x-xo, x+xo, y+yo, colorIdx) | |||
m.drawHorizLine(x-xo, x+xo, y-yo, colorIdx) | |||
m.drawHorizLine(x-yo, x+yo, y+xo, colorIdx) | |||
m.drawHorizLine(x-yo, x+yo, y-xo, colorIdx) | |||
} | |||
} | |||
func (m *Image) fillWithCircles(n, maxradius int) { | |||
maxx := m.Bounds().Max.X | |||
maxy := m.Bounds().Max.Y | |||
for i := 0; i < n; i++ { | |||
colorIdx := uint8(randInt(1, circleCount-1)) | |||
r := randInt(1, maxradius) | |||
m.drawCircle(randInt(r, maxx-r), randInt(r, maxy-r), r, colorIdx) | |||
} | |||
} | |||
func (m *Image) strikeThrough() { | |||
maxx := m.Bounds().Max.X | |||
maxy := m.Bounds().Max.Y | |||
y := randInt(maxy/3, maxy-maxy/3) | |||
amplitude := randFloat(5, 20) | |||
period := randFloat(80, 180) | |||
dx := 2.0 * math.Pi / period | |||
for x := 0; x < maxx; x++ { | |||
xo := amplitude * math.Cos(float64(y)*dx) | |||
yo := amplitude * math.Sin(float64(x)*dx) | |||
for yn := 0; yn < m.dotSize; yn++ { | |||
r := randInt(0, m.dotSize) | |||
m.drawCircle(x+int(xo), y+int(yo)+(yn*m.dotSize), r/2, 1) | |||
} | |||
} | |||
} | |||
func (m *Image) drawDigit(digit []byte, x, y int) { | |||
skf := randFloat(-maxSkew, maxSkew) | |||
xs := float64(x) | |||
r := m.dotSize / 2 | |||
y += randInt(-r, r) | |||
for yo := 0; yo < fontHeight; yo++ { | |||
for xo := 0; xo < fontWidth; xo++ { | |||
if digit[yo*fontWidth+xo] != blackChar { | |||
continue | |||
} | |||
m.drawCircle(x+xo*m.dotSize, y+yo*m.dotSize, r, 1) | |||
} | |||
xs += skf | |||
x = int(xs) | |||
} | |||
} | |||
func (m *Image) distort(amplude float64, period float64) { | |||
w := m.Bounds().Max.X | |||
h := m.Bounds().Max.Y | |||
oldm := m.Paletted | |||
newm := image.NewPaletted(image.Rect(0, 0, w, h), oldm.Palette) | |||
dx := 2.0 * math.Pi / period | |||
for x := 0; x < w; x++ { | |||
for y := 0; y < h; y++ { | |||
xo := amplude * math.Sin(float64(y)*dx) | |||
yo := amplude * math.Cos(float64(x)*dx) | |||
newm.SetColorIndex(x, y, oldm.ColorIndexAt(x+int(xo), y+int(yo))) | |||
} | |||
} | |||
m.Paletted = newm | |||
} | |||
func randomBrightness(c color.RGBA, max uint8) color.RGBA { | |||
minc := min3(c.R, c.G, c.B) | |||
maxc := max3(c.R, c.G, c.B) | |||
if maxc > max { | |||
return c | |||
} | |||
n := randIntn(int(max-maxc)) - int(minc) | |||
return color.RGBA{ | |||
uint8(int(c.R) + n), | |||
uint8(int(c.G) + n), | |||
uint8(int(c.B) + n), | |||
uint8(c.A), | |||
} | |||
} | |||
func min3(x, y, z uint8) (m uint8) { | |||
m = x | |||
if y < m { | |||
m = y | |||
} | |||
if z < m { | |||
m = z | |||
} | |||
return | |||
} | |||
func max3(x, y, z uint8) (m uint8) { | |||
m = x | |||
if y > m { | |||
m = y | |||
} | |||
if z > m { | |||
m = z | |||
} | |||
return | |||
} |
@@ -0,0 +1,42 @@ | |||
// 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 captcha | |||
import ( | |||
"testing" | |||
"github.com/astaxie/beego/utils" | |||
) | |||
type byteCounter struct { | |||
n int64 | |||
} | |||
func (bc *byteCounter) Write(b []byte) (int, error) { | |||
bc.n += int64(len(b)) | |||
return len(b), nil | |||
} | |||
func BenchmarkNewImage(b *testing.B) { | |||
b.StopTimer() | |||
d := utils.RandomCreateBytes(challengeNums, defaultChars...) | |||
b.StartTimer() | |||
for i := 0; i < b.N; i++ { | |||
NewImage(d, stdWidth, stdHeight) | |||
} | |||
} | |||
func BenchmarkImageWriteTo(b *testing.B) { | |||
b.StopTimer() | |||
d := utils.RandomCreateBytes(challengeNums, defaultChars...) | |||
b.StartTimer() | |||
counter := &byteCounter{} | |||
for i := 0; i < b.N; i++ { | |||
img := NewImage(d, stdWidth, stdHeight) | |||
img.WriteTo(counter) | |||
b.SetBytes(counter.n) | |||
counter.n = 0 | |||
} | |||
} |
@@ -0,0 +1,267 @@ | |||
// 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 captcha | |||
import ( | |||
"crypto/rand" | |||
"encoding/binary" | |||
"io" | |||
"sync" | |||
) | |||
// siprng is PRNG based on SipHash-2-4. | |||
type siprng struct { | |||
mu sync.Mutex | |||
k0, k1, ctr uint64 | |||
} | |||
// siphash implements SipHash-2-4, accepting a uint64 as a message. | |||
func siphash(k0, k1, m uint64) uint64 { | |||
// Initialization. | |||
v0 := k0 ^ 0x736f6d6570736575 | |||
v1 := k1 ^ 0x646f72616e646f6d | |||
v2 := k0 ^ 0x6c7967656e657261 | |||
v3 := k1 ^ 0x7465646279746573 | |||
t := uint64(8) << 56 | |||
// Compression. | |||
v3 ^= m | |||
// Round 1. | |||
v0 += v1 | |||
v1 = v1<<13 | v1>>(64-13) | |||
v1 ^= v0 | |||
v0 = v0<<32 | v0>>(64-32) | |||
v2 += v3 | |||
v3 = v3<<16 | v3>>(64-16) | |||
v3 ^= v2 | |||
v0 += v3 | |||
v3 = v3<<21 | v3>>(64-21) | |||
v3 ^= v0 | |||
v2 += v1 | |||
v1 = v1<<17 | v1>>(64-17) | |||
v1 ^= v2 | |||
v2 = v2<<32 | v2>>(64-32) | |||
// Round 2. | |||
v0 += v1 | |||
v1 = v1<<13 | v1>>(64-13) | |||
v1 ^= v0 | |||
v0 = v0<<32 | v0>>(64-32) | |||
v2 += v3 | |||
v3 = v3<<16 | v3>>(64-16) | |||
v3 ^= v2 | |||
v0 += v3 | |||
v3 = v3<<21 | v3>>(64-21) | |||
v3 ^= v0 | |||
v2 += v1 | |||
v1 = v1<<17 | v1>>(64-17) | |||
v1 ^= v2 | |||
v2 = v2<<32 | v2>>(64-32) | |||
v0 ^= m | |||
// Compress last block. | |||
v3 ^= t | |||
// Round 1. | |||
v0 += v1 | |||
v1 = v1<<13 | v1>>(64-13) | |||
v1 ^= v0 | |||
v0 = v0<<32 | v0>>(64-32) | |||
v2 += v3 | |||
v3 = v3<<16 | v3>>(64-16) | |||
v3 ^= v2 | |||
v0 += v3 | |||
v3 = v3<<21 | v3>>(64-21) | |||
v3 ^= v0 | |||
v2 += v1 | |||
v1 = v1<<17 | v1>>(64-17) | |||
v1 ^= v2 | |||
v2 = v2<<32 | v2>>(64-32) | |||
// Round 2. | |||
v0 += v1 | |||
v1 = v1<<13 | v1>>(64-13) | |||
v1 ^= v0 | |||
v0 = v0<<32 | v0>>(64-32) | |||
v2 += v3 | |||
v3 = v3<<16 | v3>>(64-16) | |||
v3 ^= v2 | |||
v0 += v3 | |||
v3 = v3<<21 | v3>>(64-21) | |||
v3 ^= v0 | |||
v2 += v1 | |||
v1 = v1<<17 | v1>>(64-17) | |||
v1 ^= v2 | |||
v2 = v2<<32 | v2>>(64-32) | |||
v0 ^= t | |||
// Finalization. | |||
v2 ^= 0xff | |||
// Round 1. | |||
v0 += v1 | |||
v1 = v1<<13 | v1>>(64-13) | |||
v1 ^= v0 | |||
v0 = v0<<32 | v0>>(64-32) | |||
v2 += v3 | |||
v3 = v3<<16 | v3>>(64-16) | |||
v3 ^= v2 | |||
v0 += v3 | |||
v3 = v3<<21 | v3>>(64-21) | |||
v3 ^= v0 | |||
v2 += v1 | |||
v1 = v1<<17 | v1>>(64-17) | |||
v1 ^= v2 | |||
v2 = v2<<32 | v2>>(64-32) | |||
// Round 2. | |||
v0 += v1 | |||
v1 = v1<<13 | v1>>(64-13) | |||
v1 ^= v0 | |||
v0 = v0<<32 | v0>>(64-32) | |||
v2 += v3 | |||
v3 = v3<<16 | v3>>(64-16) | |||
v3 ^= v2 | |||
v0 += v3 | |||
v3 = v3<<21 | v3>>(64-21) | |||
v3 ^= v0 | |||
v2 += v1 | |||
v1 = v1<<17 | v1>>(64-17) | |||
v1 ^= v2 | |||
v2 = v2<<32 | v2>>(64-32) | |||
// Round 3. | |||
v0 += v1 | |||
v1 = v1<<13 | v1>>(64-13) | |||
v1 ^= v0 | |||
v0 = v0<<32 | v0>>(64-32) | |||
v2 += v3 | |||
v3 = v3<<16 | v3>>(64-16) | |||
v3 ^= v2 | |||
v0 += v3 | |||
v3 = v3<<21 | v3>>(64-21) | |||
v3 ^= v0 | |||
v2 += v1 | |||
v1 = v1<<17 | v1>>(64-17) | |||
v1 ^= v2 | |||
v2 = v2<<32 | v2>>(64-32) | |||
// Round 4. | |||
v0 += v1 | |||
v1 = v1<<13 | v1>>(64-13) | |||
v1 ^= v0 | |||
v0 = v0<<32 | v0>>(64-32) | |||
v2 += v3 | |||
v3 = v3<<16 | v3>>(64-16) | |||
v3 ^= v2 | |||
v0 += v3 | |||
v3 = v3<<21 | v3>>(64-21) | |||
v3 ^= v0 | |||
v2 += v1 | |||
v1 = v1<<17 | v1>>(64-17) | |||
v1 ^= v2 | |||
v2 = v2<<32 | v2>>(64-32) | |||
return v0 ^ v1 ^ v2 ^ v3 | |||
} | |||
// rekey sets a new PRNG key, which is read from crypto/rand. | |||
func (p *siprng) rekey() { | |||
var k [16]byte | |||
if _, err := io.ReadFull(rand.Reader, k[:]); err != nil { | |||
panic(err.Error()) | |||
} | |||
p.k0 = binary.LittleEndian.Uint64(k[0:8]) | |||
p.k1 = binary.LittleEndian.Uint64(k[8:16]) | |||
p.ctr = 1 | |||
} | |||
// Uint64 returns a new pseudorandom uint64. | |||
// It rekeys PRNG on the first call and every 64 MB of generated data. | |||
func (p *siprng) Uint64() uint64 { | |||
p.mu.Lock() | |||
if p.ctr == 0 || p.ctr > 8*1024*1024 { | |||
p.rekey() | |||
} | |||
v := siphash(p.k0, p.k1, p.ctr) | |||
p.ctr++ | |||
p.mu.Unlock() | |||
return v | |||
} | |||
func (p *siprng) Int63() int64 { | |||
return int64(p.Uint64() & 0x7fffffffffffffff) | |||
} | |||
func (p *siprng) Uint32() uint32 { | |||
return uint32(p.Uint64()) | |||
} | |||
func (p *siprng) Int31() int32 { | |||
return int32(p.Uint32() & 0x7fffffff) | |||
} | |||
func (p *siprng) Intn(n int) int { | |||
if n <= 0 { | |||
panic("invalid argument to Intn") | |||
} | |||
if n <= 1<<31-1 { | |||
return int(p.Int31n(int32(n))) | |||
} | |||
return int(p.Int63n(int64(n))) | |||
} | |||
func (p *siprng) Int63n(n int64) int64 { | |||
if n <= 0 { | |||
panic("invalid argument to Int63n") | |||
} | |||
max := int64((1 << 63) - 1 - (1<<63)%uint64(n)) | |||
v := p.Int63() | |||
for v > max { | |||
v = p.Int63() | |||
} | |||
return v % n | |||
} | |||
func (p *siprng) Int31n(n int32) int32 { | |||
if n <= 0 { | |||
panic("invalid argument to Int31n") | |||
} | |||
max := int32((1 << 31) - 1 - (1<<31)%uint32(n)) | |||
v := p.Int31() | |||
for v > max { | |||
v = p.Int31() | |||
} | |||
return v % n | |||
} | |||
func (p *siprng) Float64() float64 { return float64(p.Int63()) / (1 << 63) } |
@@ -0,0 +1,23 @@ | |||
// 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 captcha | |||
import "testing" | |||
func TestSiphash(t *testing.T) { | |||
good := uint64(0xe849e8bb6ffe2567) | |||
cur := siphash(0, 0, 0) | |||
if cur != good { | |||
t.Fatalf("siphash: expected %x, got %x", good, cur) | |||
} | |||
} | |||
func BenchmarkSiprng(b *testing.B) { | |||
b.SetBytes(8) | |||
p := &siprng{} | |||
for i := 0; i < b.N; i++ { | |||
p.Uint64() | |||
} | |||
} |
@@ -0,0 +1,26 @@ | |||
// 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 git | |||
import ( | |||
"bytes" | |||
"errors" | |||
"io" | |||
"github.com/Unknwon/com" | |||
) | |||
type Blob struct { | |||
repo *Repository | |||
*TreeEntry | |||
} | |||
func (b *Blob) Data() (io.Reader, error) { | |||
stdout, stderr, err := com.ExecCmdDirBytes(b.repo.Path, "git", "show", b.Id.String()) | |||
if err != nil { | |||
return nil, errors.New(string(stderr)) | |||
} | |||
return bytes.NewBuffer(stdout), nil | |||
} |
@@ -0,0 +1,78 @@ | |||
// 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 git | |||
import ( | |||
"container/list" | |||
"strings" | |||
) | |||
// Commit represents a git commit. | |||
type Commit struct { | |||
Tree | |||
Id sha1 // The id of this commit object | |||
Author *Signature | |||
Committer *Signature | |||
CommitMessage string | |||
parents []sha1 // sha1 strings | |||
} | |||
// Return the commit message. Same as retrieving CommitMessage directly. | |||
func (c *Commit) Message() string { | |||
return c.CommitMessage | |||
} | |||
func (c *Commit) Summary() string { | |||
return strings.Split(c.CommitMessage, "\n")[0] | |||
} | |||
// Return oid of the parent number n (0-based index). Return nil if no such parent exists. | |||
func (c *Commit) ParentId(n int) (id sha1, err error) { | |||
if n >= len(c.parents) { | |||
err = IdNotExist | |||
return | |||
} | |||
return c.parents[n], nil | |||
} | |||
// Return parent number n (0-based index) | |||
func (c *Commit) Parent(n int) (*Commit, error) { | |||
id, err := c.ParentId(n) | |||
if err != nil { | |||
return nil, err | |||
} | |||
parent, err := c.repo.getCommit(id) | |||
if err != nil { | |||
return nil, err | |||
} | |||
return parent, nil | |||
} | |||
// Return the number of parents of the commit. 0 if this is the | |||
// root commit, otherwise 1,2,... | |||
func (c *Commit) ParentCount() int { | |||
return len(c.parents) | |||
} | |||
func (c *Commit) CommitsBefore() (*list.List, error) { | |||
return c.repo.getCommitsBefore(c.Id) | |||
} | |||
func (c *Commit) CommitsBeforeUntil(commitId string) (*list.List, error) { | |||
ec, err := c.repo.GetCommit(commitId) | |||
if err != nil { | |||
return nil, err | |||
} | |||
return c.repo.CommitsBetween(c, ec) | |||
} | |||
func (c *Commit) CommitsCount() (int, error) { | |||
return c.repo.commitsCount(c.Id) | |||
} | |||
func (c *Commit) GetCommitOfRelPath(relPath string) (*Commit, error) { | |||
return c.repo.getCommitOfRelPath(c.Id, relPath) | |||
} |
@@ -0,0 +1,36 @@ | |||
// 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 git | |||
import ( | |||
"fmt" | |||
"github.com/Unknwon/com" | |||
) | |||
type ArchiveType int | |||
const ( | |||
ZIP ArchiveType = iota + 1 | |||
TARGZ | |||
) | |||
func (c *Commit) CreateArchive(path string, archiveType ArchiveType) error { | |||
var format string | |||
switch archiveType { | |||
case ZIP: | |||
format = "zip" | |||
case TARGZ: | |||
format = "tar.gz" | |||
default: | |||
return fmt.Errorf("unknown format: %v", archiveType) | |||
} | |||
_, stderr, err := com.ExecCmdDir(c.repo.Path, "git", "archive", "--format="+format, "-o", path, c.Id.String()) | |||
if err != nil { | |||
return fmt.Errorf("%s", stderr) | |||
} | |||
return nil | |||
} |
@@ -0,0 +1,27 @@ | |||
// 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 git | |||
import ( | |||
"path/filepath" | |||
) | |||
// Repository represents a Git repository. | |||
type Repository struct { | |||
Path string | |||
commitCache map[sha1]*Commit | |||
tagCache map[sha1]*Tag | |||
} | |||
// OpenRepository opens the repository at the given path. | |||
func OpenRepository(repoPath string) (*Repository, error) { | |||
repoPath, err := filepath.Abs(repoPath) | |||
if err != nil { | |||
return nil, err | |||
} | |||
return &Repository{Path: repoPath}, nil | |||
} |
@@ -0,0 +1,38 @@ | |||
// 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 git | |||
import ( | |||
"errors" | |||
"strings" | |||
"github.com/Unknwon/com" | |||
) | |||
func IsBranchExist(repoPath, branchName string) bool { | |||
_, _, err := com.ExecCmdDir(repoPath, "git", "show-ref", "--verify", "refs/heads/"+branchName) | |||
return err == nil | |||
} | |||
func (repo *Repository) IsBranchExist(branchName string) bool { | |||
return IsBranchExist(repo.Path, branchName) | |||
} | |||
func (repo *Repository) GetBranches() ([]string, error) { | |||
stdout, stderr, err := com.ExecCmdDir(repo.Path, "git", "show-ref", "--heads") | |||
if err != nil { | |||
return nil, errors.New(stderr) | |||
} | |||
infos := strings.Split(stdout, "\n") | |||
branches := make([]string, len(infos)-1) | |||
for i, info := range infos[:len(infos)-1] { | |||
parts := strings.Split(info, " ") | |||
if len(parts) != 2 { | |||
continue // NOTE: I should believe git will not give me wrong string. | |||
} | |||
branches[i] = strings.TrimPrefix(parts[1], "refs/heads/") | |||
} | |||
return branches, nil | |||
} |
@@ -0,0 +1,234 @@ | |||
// 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 git | |||
import ( | |||
"bytes" | |||
"container/list" | |||
"errors" | |||
"strings" | |||
"sync" | |||
"github.com/Unknwon/com" | |||
) | |||
func (repo *Repository) getCommitIdOfRef(refpath string) (string, error) { | |||
stdout, stderr, err := com.ExecCmdDir(repo.Path, "git", "show-ref", "--verify", refpath) | |||
if err != nil { | |||
return "", errors.New(stderr) | |||
} | |||
return strings.Split(stdout, " ")[0], nil | |||
} | |||
func (repo *Repository) GetCommitIdOfBranch(branchName string) (string, error) { | |||
return repo.getCommitIdOfRef("refs/heads/" + branchName) | |||
} | |||
// get branch's last commit or a special commit by id string | |||
func (repo *Repository) GetCommitOfBranch(branchName string) (*Commit, error) { | |||
commitId, err := repo.GetCommitIdOfBranch(branchName) | |||
if err != nil { | |||
return nil, err | |||
} | |||
return repo.GetCommit(commitId) | |||
} | |||
// Parse commit information from the (uncompressed) raw | |||
// data from the commit object. | |||
// \n\n separate headers from message | |||
func parseCommitData(data []byte) (*Commit, error) { | |||
commit := new(Commit) | |||
commit.parents = make([]sha1, 0, 1) | |||
// we now have the contents of the commit object. Let's investigate... | |||
nextline := 0 | |||
l: | |||
for { | |||
eol := bytes.IndexByte(data[nextline:], '\n') | |||
switch { | |||
case eol > 0: | |||
line := data[nextline : nextline+eol] | |||
spacepos := bytes.IndexByte(line, ' ') | |||
reftype := line[:spacepos] | |||
switch string(reftype) { | |||
case "tree": | |||
id, err := NewIdFromString(string(line[spacepos+1:])) | |||
if err != nil { | |||
return nil, err | |||
} | |||
commit.Tree.Id = id | |||
case "parent": | |||
// A commit can have one or more parents | |||
oid, err := NewIdFromString(string(line[spacepos+1:])) | |||
if err != nil { | |||
return nil, err | |||
} | |||
commit.parents = append(commit.parents, oid) | |||
case "author": | |||
sig, err := newSignatureFromCommitline(line[spacepos+1:]) | |||
if err != nil { | |||
return nil, err | |||
} | |||
commit.Author = sig | |||
case "committer": | |||
sig, err := newSignatureFromCommitline(line[spacepos+1:]) | |||
if err != nil { | |||
return nil, err | |||
} | |||
commit.Committer = sig | |||
} | |||
nextline += eol + 1 | |||
case eol == 0: | |||
commit.CommitMessage = string(data[nextline+1:]) | |||
break l | |||
default: | |||
break l | |||
} | |||
} | |||
return commit, nil | |||
} | |||
func (repo *Repository) getCommit(id sha1) (*Commit, error) { | |||
if repo.commitCache != nil { | |||
if c, ok := repo.commitCache[id]; ok { | |||
return c, nil | |||
} | |||
} else { | |||
repo.commitCache = make(map[sha1]*Commit, 10) | |||
} | |||
data, bytErr, err := com.ExecCmdDirBytes(repo.Path, "git", "cat-file", "-p", id.String()) | |||
if err != nil { | |||
return nil, errors.New(string(bytErr)) | |||
} | |||
commit, err := parseCommitData(data) | |||
if err != nil { | |||
return nil, err | |||
} | |||
commit.repo = repo | |||
commit.Id = id | |||
repo.commitCache[id] = commit | |||
return commit, nil | |||
} | |||
// Find the commit object in the repository. | |||
func (repo *Repository) GetCommit(commitId string) (*Commit, error) { | |||
id, err := NewIdFromString(commitId) | |||
if err != nil { | |||
return nil, err | |||
} | |||
return repo.getCommit(id) | |||
} | |||
func (repo *Repository) commitsCount(id sha1) (int, error) { | |||
stdout, stderr, err := com.ExecCmdDir(repo.Path, "git", "rev-list", "--count", id.String()) | |||
if err != nil { | |||
return 0, errors.New(stderr) | |||
} | |||
return com.StrTo(strings.TrimSpace(stdout)).Int() | |||
} | |||
// used only for single tree, (] | |||
func (repo *Repository) CommitsBetween(last *Commit, before *Commit) (*list.List, error) { | |||
l := list.New() | |||
if last == nil || last.ParentCount() == 0 { | |||
return l, nil | |||
} | |||
var err error | |||
cur := last | |||
for { | |||
if cur.Id.Equal(before.Id) { | |||
break | |||
} | |||
l.PushBack(cur) | |||
if cur.ParentCount() == 0 { | |||
break | |||
} | |||
cur, err = cur.Parent(0) | |||
if err != nil { | |||
return nil, err | |||
} | |||
} | |||
return l, nil | |||
} | |||
func (repo *Repository) commitsBefore(lock *sync.Mutex, l *list.List, parent *list.Element, id sha1, limit int) error { | |||
commit, err := repo.getCommit(id) | |||
if err != nil { | |||
return err | |||
} | |||
var e *list.Element | |||
if parent == nil { | |||
e = l.PushBack(commit) | |||
} else { | |||
var in = parent | |||
for { | |||
if in == nil { | |||
break | |||
} else if in.Value.(*Commit).Id.Equal(commit.Id) { | |||
return nil | |||
} else { | |||
if in.Next() == nil { | |||
break | |||
} | |||
if in.Value.(*Commit).Committer.When.Equal(commit.Committer.When) { | |||
break | |||
} | |||
if in.Value.(*Commit).Committer.When.After(commit.Committer.When) && | |||
in.Next().Value.(*Commit).Committer.When.Before(commit.Committer.When) { | |||
break | |||
} | |||
} | |||
in = in.Next() | |||
} | |||
e = l.InsertAfter(commit, in) | |||
} | |||
var pr = parent | |||
if commit.ParentCount() > 1 { | |||
pr = e | |||
} | |||
for i := 0; i < commit.ParentCount(); i++ { | |||
id, err := commit.ParentId(i) | |||
if err != nil { | |||
return err | |||
} | |||
err = repo.commitsBefore(lock, l, pr, id, 0) | |||
if err != nil { | |||
return err | |||
} | |||
} | |||
return nil | |||
} | |||
func (repo *Repository) getCommitsBefore(id sha1) (*list.List, error) { | |||
l := list.New() | |||
lock := new(sync.Mutex) | |||
err := repo.commitsBefore(lock, l, nil, id, 0) | |||
return l, err | |||
} | |||
func (repo *Repository) getCommitOfRelPath(id sha1, relPath string) (*Commit, error) { | |||
stdout, _, err := com.ExecCmdDir(repo.Path, "git", "log", "-1", prettyLogFormat, id.String(), "--", relPath) | |||
if err != nil { | |||
return nil, err | |||
} | |||
id, err = NewIdFromString(string(stdout)) | |||
if err != nil { | |||
return nil, err | |||
} | |||
return repo.getCommit(id) | |||
} |
@@ -0,0 +1,14 @@ | |||
// 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 git | |||
type ObjectType string | |||
const ( | |||
COMMIT ObjectType = "commit" | |||
TREE ObjectType = "tree" | |||
BLOB ObjectType = "blob" | |||
TAG ObjectType = "tag" | |||
) |
@@ -0,0 +1,96 @@ | |||
// 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 git | |||
import ( | |||
"errors" | |||
"strings" | |||
"github.com/Unknwon/com" | |||
) | |||
func IsTagExist(repoPath, tagName string) bool { | |||
_, _, err := com.ExecCmdDir(repoPath, "git", "show-ref", "--verify", "refs/tags/"+tagName) | |||
return err == nil | |||
} | |||
func (repo *Repository) IsTagExist(tagName string) bool { | |||
return IsTagExist(repo.Path, tagName) | |||
} | |||
// GetTags returns all tags of given repository. | |||
func (repo *Repository) GetTags() ([]string, error) { | |||
stdout, stderr, err := com.ExecCmdDir(repo.Path, "git", "tag", "-l") | |||
if err != nil { | |||
return nil, errors.New(stderr) | |||
} | |||
tags := strings.Split(stdout, "\n") | |||
return tags[:len(tags)-1], nil | |||
} | |||
func (repo *Repository) getTag(id sha1) (*Tag, error) { | |||
if repo.tagCache != nil { | |||
if t, ok := repo.tagCache[id]; ok { | |||
return t, nil | |||
} | |||
} else { | |||
repo.tagCache = make(map[sha1]*Tag, 10) | |||
} | |||
// Get tag type. | |||
tp, stderr, err := com.ExecCmdDir(repo.Path, "git", "cat-file", "-t", id.String()) | |||
if err != nil { | |||
return nil, errors.New(stderr) | |||
} | |||
// Tag is a commit. | |||
if ObjectType(tp) == COMMIT { | |||
tag := &Tag{ | |||
Id: id, | |||
Object: id, | |||
Type: string(COMMIT), | |||
repo: repo, | |||
} | |||
repo.tagCache[id] = tag | |||
return tag, nil | |||
} | |||
// Tag with message. | |||
data, bytErr, err := com.ExecCmdDirBytes(repo.Path, "git", "cat-file", "-p", id.String()) | |||
if err != nil { | |||
return nil, errors.New(string(bytErr)) | |||
} | |||
tag, err := parseTagData(data) | |||
if err != nil { | |||
return nil, err | |||
} | |||
tag.Id = id | |||
tag.repo = repo | |||
repo.tagCache[id] = tag | |||
return tag, nil | |||
} | |||
// GetTag returns a Git tag by given name. | |||
func (repo *Repository) GetTag(tagName string) (*Tag, error) { | |||
stdout, stderr, err := com.ExecCmdDir(repo.Path, "git", "show-ref", "--tags", tagName) | |||
if err != nil { | |||
return nil, errors.New(stderr) | |||
} | |||
id, err := NewIdFromString(strings.Split(stdout, " ")[0]) | |||
if err != nil { | |||
return nil, err | |||
} | |||
tag, err := repo.getTag(id) | |||
if err != nil { | |||
return nil, err | |||
} | |||
tag.Name = tagName | |||
return tag, nil | |||
} |
@@ -0,0 +1,32 @@ | |||
// 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 git | |||
import ( | |||
"fmt" | |||
"github.com/Unknwon/com" | |||
) | |||
// Find the tree object in the repository. | |||
func (repo *Repository) GetTree(idStr string) (*Tree, error) { | |||
id, err := NewIdFromString(idStr) | |||
if err != nil { | |||
return nil, err | |||
} | |||
return repo.getTree(id) | |||
} | |||
func (repo *Repository) getTree(id sha1) (*Tree, error) { | |||
treePath := filepathFromSHA1(repo.Path, id.String()) | |||
if !com.IsFile(treePath) { | |||
_, _, err := com.ExecCmdDir(repo.Path, "git", "ls-tree", id.String()) | |||
if err != nil { | |||
return nil, fmt.Errorf("repo.getTree: %v", ErrNotExist) | |||
} | |||
} | |||
return NewTree(repo, id), nil | |||
} |
@@ -0,0 +1,87 @@ | |||
// 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 git | |||
import ( | |||
"encoding/hex" | |||
"errors" | |||
"fmt" | |||
"strings" | |||
) | |||
var ( | |||
IdNotExist = errors.New("sha1 id not exist") | |||
) | |||
type sha1 [20]byte | |||
// Return true if s has the same sha1 as caller. | |||
// Support 40-length-string, []byte, sha1 | |||
func (id sha1) Equal(s2 interface{}) bool { | |||
switch v := s2.(type) { | |||
case string: | |||
if len(v) != 40 { | |||
return false | |||
} | |||
return v == id.String() | |||
case []byte: | |||
if len(v) != 20 { | |||
return false | |||
} | |||
for i, v := range v { | |||
if id[i] != v { | |||
return false | |||
} | |||
} | |||
case sha1: | |||
for i, v := range v { | |||
if id[i] != v { | |||
return false | |||
} | |||
} | |||
default: | |||
return false | |||
} | |||
return true | |||
} | |||
// Return string (hex) representation of the Oid | |||
func (s sha1) String() string { | |||
result := make([]byte, 0, 40) | |||
hexvalues := []byte("0123456789abcdef") | |||
for i := 0; i < 20; i++ { | |||
result = append(result, hexvalues[s[i]>>4]) | |||
result = append(result, hexvalues[s[i]&0xf]) | |||
} | |||
return string(result) | |||
} | |||
// Create a new sha1 from a 20 byte slice. | |||
func NewId(b []byte) (sha1, error) { | |||
var id sha1 | |||
if len(b) != 20 { | |||
return id, errors.New("Length must be 20") | |||
} | |||
for i := 0; i < 20; i++ { | |||
id[i] = b[i] | |||
} | |||
return id, nil | |||
} | |||
// Create a new sha1 from a Sha1 string of length 40. | |||
func NewIdFromString(s string) (sha1, error) { | |||
s = strings.TrimSpace(s) | |||
var id sha1 | |||
if len(s) != 40 { | |||
return id, fmt.Errorf("Length must be 40") | |||
} | |||
b, err := hex.DecodeString(s) | |||
if err != nil { | |||
return id, err | |||
} | |||
return NewId(b) | |||
} |
@@ -0,0 +1,40 @@ | |||
// 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 git | |||
import ( | |||
"bytes" | |||
"strconv" | |||
"time" | |||
) | |||
// Author and Committer information | |||
type Signature struct { | |||
Email string | |||
Name string | |||
When time.Time | |||
} | |||
// Helper to get a signature from the commit line, which looks like this: | |||
// author Patrick Gundlach <gundlach@speedata.de> 1378823654 +0200 | |||
// but without the "author " at the beginning (this method should) | |||
// be used for author and committer. | |||
// | |||
// FIXME: include timezone! | |||
func newSignatureFromCommitline(line []byte) (*Signature, error) { | |||
sig := new(Signature) | |||
emailstart := bytes.IndexByte(line, '<') | |||
sig.Name = string(line[:emailstart-1]) | |||
emailstop := bytes.IndexByte(line, '>') | |||
sig.Email = string(line[emailstart+1 : emailstop]) | |||
timestop := bytes.IndexByte(line[emailstop+2:], ' ') | |||
timestring := string(line[emailstop+2 : emailstop+2+timestop]) | |||
seconds, err := strconv.ParseInt(timestring, 10, 64) | |||
if err != nil { | |||
return nil, err | |||
} | |||
sig.When = time.Unix(seconds, 0) | |||
return sig, nil | |||
} |
@@ -0,0 +1,67 @@ | |||
// 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 git | |||
import ( | |||
"bytes" | |||
) | |||
// Tag represents a Git tag. | |||
type Tag struct { | |||
Name string | |||
Id sha1 | |||
repo *Repository | |||
Object sha1 // The id of this commit object | |||
Type string | |||
Tagger *Signature | |||
TagMessage string | |||
} | |||
func (tag *Tag) Commit() (*Commit, error) { | |||
return tag.repo.getCommit(tag.Object) | |||
} | |||
// Parse commit information from the (uncompressed) raw | |||
// data from the commit object. | |||
// \n\n separate headers from message | |||
func parseTagData(data []byte) (*Tag, error) { | |||
tag := new(Tag) | |||
// we now have the contents of the commit object. Let's investigate... | |||
nextline := 0 | |||
l: | |||
for { | |||
eol := bytes.IndexByte(data[nextline:], '\n') | |||
switch { | |||
case eol > 0: | |||
line := data[nextline : nextline+eol] | |||
spacepos := bytes.IndexByte(line, ' ') | |||
reftype := line[:spacepos] | |||
switch string(reftype) { | |||
case "object": | |||
id, err := NewIdFromString(string(line[spacepos+1:])) | |||
if err != nil { | |||
return nil, err | |||
} | |||
tag.Object = id | |||
case "type": | |||
// A commit can have one or more parents | |||
tag.Type = string(line[spacepos+1:]) | |||
case "tagger": | |||
sig, err := newSignatureFromCommitline(line[spacepos+1:]) | |||
if err != nil { | |||
return nil, err | |||
} | |||
tag.Tagger = sig | |||
} | |||
nextline += eol + 1 | |||
case eol == 0: | |||
tag.TagMessage = string(data[nextline+1:]) | |||
break l | |||
default: | |||
break l | |||
} | |||
} | |||
return tag, nil | |||
} |
@@ -0,0 +1,124 @@ | |||
// 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 git | |||
import ( | |||
"bytes" | |||
"errors" | |||
"strings" | |||
"github.com/Unknwon/com" | |||
) | |||
var ( | |||
ErrNotExist = errors.New("error not exist") | |||
) | |||
// A tree is a flat directory listing. | |||
type Tree struct { | |||
Id sha1 | |||
repo *Repository | |||
// parent tree | |||
ptree *Tree | |||
entries Entries | |||
entriesParsed bool | |||
} | |||
// Parse tree information from the (uncompressed) raw | |||
// data from the tree object. | |||
func parseTreeData(tree *Tree, data []byte) ([]*TreeEntry, error) { | |||
entries := make([]*TreeEntry, 0, 10) | |||
l := len(data) | |||
pos := 0 | |||
for pos < l { | |||
entry := new(TreeEntry) | |||
entry.ptree = tree | |||
step := 6 | |||
switch string(data[pos : pos+step]) { | |||
case "100644": | |||
entry.mode = ModeBlob | |||
entry.Type = BLOB | |||
case "100755": | |||
entry.mode = ModeExec | |||
entry.Type = BLOB | |||
case "120000": | |||
entry.mode = ModeSymlink | |||
entry.Type = BLOB | |||
case "160000": | |||
entry.mode = ModeCommit | |||
entry.Type = COMMIT | |||
case "040000": | |||
entry.mode = ModeTree | |||
entry.Type = TREE | |||
default: | |||
return nil, errors.New("unknown type: " + string(data[pos:pos+step])) | |||
} | |||
pos += step + 6 // Skip string type of entry type. | |||
step = 40 | |||
id, err := NewIdFromString(string(data[pos : pos+step])) | |||
if err != nil { | |||
return nil, err | |||
} | |||
entry.Id = id | |||
pos += step + 1 // Skip half of sha1. | |||
step = bytes.IndexByte(data[pos:], '\n') | |||
entry.name = string(data[pos : pos+step]) | |||
pos += step + 1 | |||
entries = append(entries, entry) | |||
} | |||
return entries, nil | |||
} | |||
func (t *Tree) SubTree(rpath string) (*Tree, error) { | |||
if len(rpath) == 0 { | |||
return t, nil | |||
} | |||
paths := strings.Split(rpath, "/") | |||
var err error | |||
var g = t | |||
var p = t | |||
var te *TreeEntry | |||
for _, name := range paths { | |||
te, err = p.GetTreeEntryByPath(name) | |||
if err != nil { | |||
return nil, err | |||
} | |||
g, err = t.repo.getTree(te.Id) | |||
if err != nil { | |||
return nil, err | |||
} | |||
g.ptree = p | |||
p = g | |||
} | |||
return g, nil | |||
} | |||
func (t *Tree) ListEntries(relpath string) (Entries, error) { | |||
if t.entriesParsed { | |||
return t.entries, nil | |||
} | |||
t.entriesParsed = true | |||
stdout, _, err := com.ExecCmdDirBytes(t.repo.Path, | |||
"git", "ls-tree", t.Id.String()) | |||
if err != nil { | |||
return nil, err | |||
} | |||
t.entries, err = parseTreeData(t, stdout) | |||
return t.entries, err | |||
} | |||
func NewTree(repo *Repository, id sha1) *Tree { | |||
tree := new(Tree) | |||
tree.Id = id | |||
tree.repo = repo | |||
return tree | |||
} |
@@ -0,0 +1,46 @@ | |||
// 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 git | |||
import ( | |||
"fmt" | |||
"path" | |||
"strings" | |||
) | |||
func (t *Tree) GetTreeEntryByPath(relpath string) (*TreeEntry, error) { | |||
if len(relpath) == 0 { | |||
return &TreeEntry{ | |||
Id: t.Id, | |||
Type: TREE, | |||
mode: ModeTree, | |||
}, nil | |||
// return nil, fmt.Errorf("GetTreeEntryByPath(empty relpath): %v", ErrNotExist) | |||
} | |||
relpath = path.Clean(relpath) | |||
parts := strings.Split(relpath, "/") | |||
var err error | |||
tree := t | |||
for i, name := range parts { | |||
if i == len(parts)-1 { | |||
entries, err := tree.ListEntries(path.Dir(relpath)) | |||
if err != nil { | |||
return nil, err | |||
} | |||
for _, v := range entries { | |||
if v.name == name { | |||
return v, nil | |||
} | |||
} | |||
} else { | |||
tree, err = tree.SubTree(name) | |||
if err != nil { | |||
return nil, err | |||
} | |||
} | |||
} | |||
return nil, fmt.Errorf("GetTreeEntryByPath: %v", ErrNotExist) | |||
} |
@@ -0,0 +1,109 @@ | |||
// 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 git | |||
import ( | |||
"sort" | |||
"strings" | |||
"github.com/Unknwon/com" | |||
) | |||
type EntryMode int | |||
// There are only a few file modes in Git. They look like unix file modes, but they can only be | |||
// one of these. | |||
const ( | |||
ModeBlob EntryMode = 0100644 | |||
ModeExec EntryMode = 0100755 | |||
ModeSymlink EntryMode = 0120000 | |||
ModeCommit EntryMode = 0160000 | |||
ModeTree EntryMode = 0040000 | |||
) | |||
type TreeEntry struct { | |||
Id sha1 | |||
Type ObjectType | |||
mode EntryMode | |||
name string | |||
ptree *Tree | |||
commited bool | |||
size int64 | |||
sized bool | |||
} | |||
func (te *TreeEntry) Name() string { | |||
return te.name | |||
} | |||
func (te *TreeEntry) Size() int64 { | |||
if te.IsDir() { | |||
return 0 | |||
} | |||
if te.sized { | |||
return te.size | |||
} | |||
stdout, _, err := com.ExecCmdDir(te.ptree.repo.Path, "git", "cat-file", "-s", te.Id.String()) | |||
if err != nil { | |||
return 0 | |||
} | |||
te.sized = true | |||
te.size = com.StrTo(strings.TrimSpace(stdout)).MustInt64() | |||
return te.size | |||
} | |||
func (te *TreeEntry) IsDir() bool { | |||
return te.mode == ModeTree | |||
} | |||
func (te *TreeEntry) EntryMode() EntryMode { | |||
return te.mode | |||
} | |||
func (te *TreeEntry) Blob() *Blob { | |||
return &Blob{ | |||
repo: te.ptree.repo, | |||
TreeEntry: te, | |||
} | |||
} | |||
type Entries []*TreeEntry | |||
var sorter = []func(t1, t2 *TreeEntry) bool{ | |||
func(t1, t2 *TreeEntry) bool { | |||
return t1.IsDir() && !t2.IsDir() | |||
}, | |||
func(t1, t2 *TreeEntry) bool { | |||
return t1.name < t2.name | |||
}, | |||
} | |||
func (bs Entries) Len() int { return len(bs) } | |||
func (bs Entries) Swap(i, j int) { bs[i], bs[j] = bs[j], bs[i] } | |||
func (bs Entries) Less(i, j int) bool { | |||
t1, t2 := bs[i], bs[j] | |||
var k int | |||
for k = 0; k < len(sorter)-1; k++ { | |||
sort := sorter[k] | |||
switch { | |||
case sort(t1, t2): | |||
return true | |||
case sort(t2, t1): | |||
return false | |||
} | |||
} | |||
return sorter[k](t1, t2) | |||
} | |||
func (bs Entries) Sort() { | |||
sort.Sort(bs) | |||
} |
@@ -0,0 +1,27 @@ | |||
// 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 git | |||
import ( | |||
"path/filepath" | |||
"strings" | |||
) | |||
const prettyLogFormat = `--pretty=format:%H` | |||
func RefEndName(refStr string) string { | |||
index := strings.LastIndex(refStr, "/") | |||
if index != -1 { | |||
return refStr[index+1:] | |||
} | |||
return refStr | |||
} | |||
// If the object is stored in its own file (i.e not in a pack file), | |||
// this function returns the full path to the object file. | |||
// It does not test if the file exists. | |||
func filepathFromSHA1(rootdir, sha1 string) string { | |||
return filepath.Join(rootdir, "objects", sha1[:2], sha1[2:]) | |||
} |
@@ -0,0 +1,43 @@ | |||
// 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 git | |||
import ( | |||
"errors" | |||
"strings" | |||
"github.com/Unknwon/com" | |||
) | |||
// Version represents version of Git. | |||
type Version struct { | |||
Major, Minor, Patch int | |||
} | |||
// GetVersion returns current Git version installed. | |||
func GetVersion() (Version, error) { | |||
stdout, stderr, err := com.ExecCmd("git", "version") | |||
if err != nil { | |||
return Version{}, errors.New(stderr) | |||
} | |||
infos := strings.Split(stdout, " ") | |||
if len(infos) < 3 { | |||
return Version{}, errors.New("not enough output") | |||
} | |||
v := Version{} | |||
for i, s := range strings.Split(strings.TrimSpace(infos[2]), ".") { | |||
switch i { | |||
case 0: | |||
v.Major, _ = com.StrTo(s).Int() | |||
case 1: | |||
v.Minor, _ = com.StrTo(s).Int() | |||
case 2: | |||
v.Patch, _ = com.StrTo(s).Int() | |||
} | |||
} | |||
return v, nil | |||
} |
@@ -0,0 +1,73 @@ | |||
// 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 log | |||
import ( | |||
"encoding/json" | |||
"log" | |||
"os" | |||
"runtime" | |||
) | |||
type Brush func(string) string | |||
func NewBrush(color string) Brush { | |||
pre := "\033[" | |||
reset := "\033[0m" | |||
return func(text string) string { | |||
return pre + color + "m" + text + reset | |||
} | |||
} | |||
var colors = []Brush{ | |||
NewBrush("1;36"), // Trace cyan | |||
NewBrush("1;34"), // Debug blue | |||
NewBrush("1;32"), // Info green | |||
NewBrush("1;33"), // Warn yellow | |||
NewBrush("1;31"), // Error red | |||
NewBrush("1;35"), // Critical purple | |||
NewBrush("1;31"), // Fatal red | |||
} | |||
// ConsoleWriter implements LoggerInterface and writes messages to terminal. | |||
type ConsoleWriter struct { | |||
lg *log.Logger | |||
Level int `json:"level"` | |||
} | |||
// create ConsoleWriter returning as LoggerInterface. | |||
func NewConsole() LoggerInterface { | |||
return &ConsoleWriter{ | |||
lg: log.New(os.Stdout, "", log.Ldate|log.Ltime), | |||
Level: TRACE, | |||
} | |||
} | |||
func (cw *ConsoleWriter) Init(config string) error { | |||
return json.Unmarshal([]byte(config), cw) | |||
} | |||
func (cw *ConsoleWriter) WriteMsg(msg string, skip, level int) error { | |||
if cw.Level > level { | |||
return nil | |||
} | |||
if runtime.GOOS == "windows" { | |||
cw.lg.Println(msg) | |||
} else { | |||
cw.lg.Println(colors[level](msg)) | |||
} | |||
return nil | |||
} | |||
func (_ *ConsoleWriter) Destroy() { | |||
} | |||
func (_ *ConsoleWriter) Flush() { | |||
} | |||
func init() { | |||
Register("console", NewConsole) | |||
} |
@@ -0,0 +1,237 @@ | |||
// 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 log | |||
import ( | |||
"encoding/json" | |||
"errors" | |||
"fmt" | |||
"io/ioutil" | |||
"log" | |||
"os" | |||
"path/filepath" | |||
"strings" | |||
"sync" | |||
"time" | |||
) | |||
// FileLogWriter implements LoggerInterface. | |||
// It writes messages by lines limit, file size limit, or time frequency. | |||
type FileLogWriter struct { | |||
*log.Logger | |||
mw *MuxWriter | |||
// The opened file | |||
Filename string `json:"filename"` | |||
Maxlines int `json:"maxlines"` | |||
maxlines_curlines int | |||
// Rotate at size | |||
Maxsize int `json:"maxsize"` | |||
maxsize_cursize int | |||
// Rotate daily | |||
Daily bool `json:"daily"` | |||
Maxdays int64 `json:"maxdays` | |||
daily_opendate int | |||
Rotate bool `json:"rotate"` | |||
startLock sync.Mutex // Only one log can write to the file | |||
Level int `json:"level"` | |||
} | |||
// an *os.File writer with locker. | |||
type MuxWriter struct { | |||
sync.Mutex | |||
fd *os.File | |||
} | |||
// write to os.File. | |||
func (l *MuxWriter) Write(b []byte) (int, error) { | |||
l.Lock() | |||
defer l.Unlock() | |||
return l.fd.Write(b) | |||
} | |||
// set os.File in writer. | |||
func (l *MuxWriter) SetFd(fd *os.File) { | |||
if l.fd != nil { | |||
l.fd.Close() | |||
} | |||
l.fd = fd | |||
} | |||
// create a FileLogWriter returning as LoggerInterface. | |||
func NewFileWriter() LoggerInterface { | |||
w := &FileLogWriter{ | |||
Filename: "", | |||
Maxlines: 1000000, | |||
Maxsize: 1 << 28, //256 MB | |||
Daily: true, | |||
Maxdays: 7, | |||
Rotate: true, | |||
Level: TRACE, | |||
} | |||
// use MuxWriter instead direct use os.File for lock write when rotate | |||
w.mw = new(MuxWriter) | |||
// set MuxWriter as Logger's io.Writer | |||
w.Logger = log.New(w.mw, "", log.Ldate|log.Ltime) | |||
return w | |||
} | |||
// Init file logger with json config. | |||
// config like: | |||
// { | |||
// "filename":"log/gogs.log", | |||
// "maxlines":10000, | |||
// "maxsize":1<<30, | |||
// "daily":true, | |||
// "maxdays":15, | |||
// "rotate":true | |||
// } | |||
func (w *FileLogWriter) Init(config string) error { | |||
if err := json.Unmarshal([]byte(config), w); err != nil { | |||
return err | |||
} | |||
if len(w.Filename) == 0 { | |||
return errors.New("config must have filename") | |||
} | |||
return w.StartLogger() | |||
} | |||
// start file logger. create log file and set to locker-inside file writer. | |||
func (w *FileLogWriter) StartLogger() error { | |||
fd, err := w.createLogFile() | |||
if err != nil { | |||
return err | |||
} | |||
w.mw.SetFd(fd) | |||
if err = w.initFd(); err != nil { | |||
return err | |||
} | |||
return nil | |||
} | |||
func (w *FileLogWriter) docheck(size int) { | |||
w.startLock.Lock() | |||
defer w.startLock.Unlock() | |||
if w.Rotate && ((w.Maxlines > 0 && w.maxlines_curlines >= w.Maxlines) || | |||
(w.Maxsize > 0 && w.maxsize_cursize >= w.Maxsize) || | |||
(w.Daily && time.Now().Day() != w.daily_opendate)) { | |||
if err := w.DoRotate(); err != nil { | |||
fmt.Fprintf(os.Stderr, "FileLogWriter(%q): %s\n", w.Filename, err) | |||
return | |||
} | |||
} | |||
w.maxlines_curlines++ | |||
w.maxsize_cursize += size | |||
} | |||
// write logger message into file. | |||
func (w *FileLogWriter) WriteMsg(msg string, skip, level int) error { | |||
if level < w.Level { | |||
return nil | |||
} | |||
n := 24 + len(msg) // 24 stand for the length "2013/06/23 21:00:22 [T] " | |||
w.docheck(n) | |||
w.Logger.Println(msg) | |||
return nil | |||
} | |||
func (w *FileLogWriter) createLogFile() (*os.File, error) { | |||
// Open the log file | |||
return os.OpenFile(w.Filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0660) | |||
} | |||
func (w *FileLogWriter) initFd() error { | |||
fd := w.mw.fd | |||
finfo, err := fd.Stat() | |||
if err != nil { | |||
return fmt.Errorf("get stat: %s\n", err) | |||
} | |||
w.maxsize_cursize = int(finfo.Size()) | |||
w.daily_opendate = time.Now().Day() | |||
if finfo.Size() > 0 { | |||
content, err := ioutil.ReadFile(w.Filename) | |||
if err != nil { | |||
return err | |||
} | |||
w.maxlines_curlines = len(strings.Split(string(content), "\n")) | |||
} else { | |||
w.maxlines_curlines = 0 | |||
} | |||
return nil | |||
} | |||
// DoRotate means it need to write file in new file. | |||
// new file name like xx.log.2013-01-01.2 | |||
func (w *FileLogWriter) DoRotate() error { | |||
_, err := os.Lstat(w.Filename) | |||
if err == nil { // file exists | |||
// Find the next available number | |||
num := 1 | |||
fname := "" | |||
for ; err == nil && num <= 999; num++ { | |||
fname = w.Filename + fmt.Sprintf(".%s.%03d", time.Now().Format("2006-01-02"), num) | |||
_, err = os.Lstat(fname) | |||
} | |||
// return error if the last file checked still existed | |||
if err == nil { | |||
return fmt.Errorf("rotate: cannot find free log number to rename %s\n", w.Filename) | |||
} | |||
// block Logger's io.Writer | |||
w.mw.Lock() | |||
defer w.mw.Unlock() | |||
fd := w.mw.fd | |||
fd.Close() | |||
// close fd before rename | |||
// Rename the file to its newfound home | |||
if err = os.Rename(w.Filename, fname); err != nil { | |||
return fmt.Errorf("Rotate: %s\n", err) | |||
} | |||
// re-start logger | |||
if err = w.StartLogger(); err != nil { | |||
return fmt.Errorf("Rotate StartLogger: %s\n", err) | |||
} | |||
go w.deleteOldLog() | |||
} | |||
return nil | |||
} | |||
func (w *FileLogWriter) deleteOldLog() { | |||
dir := filepath.Dir(w.Filename) | |||
filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { | |||
if !info.IsDir() && info.ModTime().Unix() < (time.Now().Unix()-60*60*24*w.Maxdays) { | |||
if strings.HasPrefix(filepath.Base(path), filepath.Base(w.Filename)) { | |||
os.Remove(path) | |||
} | |||
} | |||
return nil | |||
}) | |||
} | |||
// destroy file logger, close file writer. | |||
func (w *FileLogWriter) Destroy() { | |||
w.mw.fd.Close() | |||
} | |||
// flush file logger. | |||
// there are no buffering messages in file logger in memory. | |||
// flush file means sync file from disk. | |||
func (w *FileLogWriter) Flush() { | |||
w.mw.fd.Sync() | |||
} | |||
func init() { | |||
Register("file", NewFileWriter) | |||
} |
@@ -2,32 +2,29 @@ | |||
// Use of this source code is governed by a MIT-style | |||
// license that can be found in the LICENSE file. | |||
// Package log is a wrapper of logs for short calling name. | |||
package log | |||
import ( | |||
"fmt" | |||
"os" | |||
"path" | |||
"github.com/gogits/logs" | |||
"path/filepath" | |||
"runtime" | |||
"strings" | |||
"sync" | |||
) | |||
var ( | |||
loggers []*logs.BeeLogger | |||
GitLogger *logs.BeeLogger | |||
loggers []*Logger | |||
GitLogger *Logger | |||
) | |||
func init() { | |||
NewLogger(0, "console", `{"level": 0}`) | |||
} | |||
func NewLogger(bufLen int64, mode, config string) { | |||
logger := logs.NewLogger(bufLen) | |||
logger := newLogger(bufLen) | |||
isExist := false | |||
for _, l := range loggers { | |||
if l.Adapter == mode { | |||
if l.adapter == mode { | |||
isExist = true | |||
l = logger | |||
} | |||
@@ -35,15 +32,14 @@ func NewLogger(bufLen int64, mode, config string) { | |||
if !isExist { | |||
loggers = append(loggers, logger) | |||
} | |||
logger.SetLogFuncCallDepth(3) | |||
if err := logger.SetLogger(mode, config); err != nil { | |||
Fatal("Fail to set logger(%s): %v", mode, err) | |||
Fatal(1, "Fail to set logger(%s): %v", mode, err) | |||
} | |||
} | |||
func NewGitLogger(logPath string) { | |||
os.MkdirAll(path.Dir(logPath), os.ModePerm) | |||
GitLogger = logs.NewLogger(0) | |||
GitLogger = newLogger(0) | |||
GitLogger.SetLogger("file", fmt.Sprintf(`{"level":0,"filename":"%s","rotate":false}`, logPath)) | |||
} | |||
@@ -65,28 +61,237 @@ func Info(format string, v ...interface{}) { | |||
} | |||
} | |||
func Error(format string, v ...interface{}) { | |||
func Warn(format string, v ...interface{}) { | |||
for _, logger := range loggers { | |||
logger.Error(format, v...) | |||
logger.Warn(format, v...) | |||
} | |||
} | |||
func Warn(format string, v ...interface{}) { | |||
func Error(skip int, format string, v ...interface{}) { | |||
for _, logger := range loggers { | |||
logger.Warn(format, v...) | |||
logger.Error(skip, format, v...) | |||
} | |||
} | |||
func Critical(format string, v ...interface{}) { | |||
func Critical(skip int, format string, v ...interface{}) { | |||
for _, logger := range loggers { | |||
logger.Critical(format, v...) | |||
logger.Critical(skip, format, v...) | |||
} | |||
} | |||
func Fatal(format string, v ...interface{}) { | |||
Error(format, v...) | |||
func Fatal(skip int, format string, v ...interface{}) { | |||
Error(skip, format, v...) | |||
for _, l := range loggers { | |||
l.Close() | |||
} | |||
os.Exit(2) | |||
os.Exit(1) | |||
} | |||
// .___ _______________________________________________________ _________ ___________ | |||
// | |\ \__ ___/\_ _____/\______ \_ _____/ _ \ \_ ___ \\_ _____/ | |||
// | |/ | \| | | __)_ | _/| __)/ /_\ \/ \ \/ | __)_ | |||
// | / | \ | | \ | | \| \/ | \ \____| \ | |||
// |___\____|__ /____| /_______ / |____|_ /\___ /\____|__ /\______ /_______ / | |||
// \/ \/ \/ \/ \/ \/ \/ | |||
type LogLevel int | |||
const ( | |||
TRACE = iota | |||
DEBUG | |||
INFO | |||
WARN | |||
ERROR | |||
CRITICAL | |||
FATAL | |||
) | |||
// LoggerInterface represents behaviors of a logger provider. | |||
type LoggerInterface interface { | |||
Init(config string) error | |||
WriteMsg(msg string, skip, level int) error | |||
Destroy() | |||
Flush() | |||
} | |||
type loggerType func() LoggerInterface | |||
var adapters = make(map[string]loggerType) | |||
// Register registers given logger provider to adapters. | |||
func Register(name string, log loggerType) { | |||
if log == nil { | |||
panic("log: register provider is nil") | |||
} | |||
if _, dup := adapters[name]; dup { | |||
panic("log: register called twice for provider \"" + name + "\"") | |||
} | |||
adapters[name] = log | |||
} | |||
type logMsg struct { | |||
skip, level int | |||
msg string | |||
} | |||
// Logger is default logger in beego application. | |||
// it can contain several providers and log message into all providers. | |||
type Logger struct { | |||
adapter string | |||
lock sync.Mutex | |||
level int | |||
msg chan *logMsg | |||
outputs map[string]LoggerInterface | |||
quit chan bool | |||
} | |||
// newLogger initializes and returns a new logger. | |||
func newLogger(buffer int64) *Logger { | |||
l := &Logger{ | |||
msg: make(chan *logMsg, buffer), | |||
outputs: make(map[string]LoggerInterface), | |||
quit: make(chan bool), | |||
} | |||
go l.StartLogger() | |||
return l | |||
} | |||
// SetLogger sets new logger instanse with given logger adapter and config. | |||
func (l *Logger) SetLogger(adapter string, config string) error { | |||
l.lock.Lock() | |||
defer l.lock.Unlock() | |||
if log, ok := adapters[adapter]; ok { | |||
lg := log() | |||
if err := lg.Init(config); err != nil { | |||
return err | |||
} | |||
l.outputs[adapter] = lg | |||
l.adapter = adapter | |||
} else { | |||
panic("log: unknown adapter \"" + adapter + "\" (forgotten Register?)") | |||
} | |||
return nil | |||
} | |||
// DelLogger removes a logger adapter instance. | |||
func (l *Logger) DelLogger(adapter string) error { | |||
l.lock.Lock() | |||
defer l.lock.Unlock() | |||
if lg, ok := l.outputs[adapter]; ok { | |||
lg.Destroy() | |||
delete(l.outputs, adapter) | |||
} else { | |||
panic("log: unknown adapter \"" + adapter + "\" (forgotten Register?)") | |||
} | |||
return nil | |||
} | |||
func (l *Logger) writerMsg(skip, level int, msg string) error { | |||
if l.level > level { | |||
return nil | |||
} | |||
lm := &logMsg{ | |||
skip: skip, | |||
level: level, | |||
} | |||
// Only error information needs locate position for debugging. | |||
if lm.level >= ERROR { | |||
pc, file, line, ok := runtime.Caller(skip) | |||
if ok { | |||
// Get caller function name. | |||
fn := runtime.FuncForPC(pc) | |||
var fnName string | |||
if fn == nil { | |||
fnName = "?()" | |||
} else { | |||
fnName = strings.TrimLeft(filepath.Ext(fn.Name()), ".") + "()" | |||
} | |||
lm.msg = fmt.Sprintf("[%s:%d %s] %s", filepath.Base(file), line, fnName, msg) | |||
} else { | |||
lm.msg = msg | |||
} | |||
} else { | |||
lm.msg = msg | |||
} | |||
l.msg <- lm | |||
return nil | |||
} | |||
// StartLogger starts logger chan reading. | |||
func (l *Logger) StartLogger() { | |||
for { | |||
select { | |||
case bm := <-l.msg: | |||
for _, l := range l.outputs { | |||
l.WriteMsg(bm.msg, bm.skip, bm.level) | |||
} | |||
case <-l.quit: | |||
return | |||
} | |||
} | |||
} | |||
// Flush flushs all chan data. | |||
func (l *Logger) Flush() { | |||
for _, l := range l.outputs { | |||
l.Flush() | |||
} | |||
} | |||
// Close closes logger, flush all chan data and destroy all adapter instances. | |||
func (l *Logger) Close() { | |||
l.quit <- true | |||
for { | |||
if len(l.msg) > 0 { | |||
bm := <-l.msg | |||
for _, l := range l.outputs { | |||
l.WriteMsg(bm.msg, bm.skip, bm.level) | |||
} | |||
} else { | |||
break | |||
} | |||
} | |||
for _, l := range l.outputs { | |||
l.Flush() | |||
l.Destroy() | |||
} | |||
} | |||
func (l *Logger) Trace(format string, v ...interface{}) { | |||
msg := fmt.Sprintf("[T] "+format, v...) | |||
l.writerMsg(0, TRACE, msg) | |||
} | |||
func (l *Logger) Debug(format string, v ...interface{}) { | |||
msg := fmt.Sprintf("[D] "+format, v...) | |||
l.writerMsg(0, DEBUG, msg) | |||
} | |||
func (l *Logger) Info(format string, v ...interface{}) { | |||
msg := fmt.Sprintf("[I] "+format, v...) | |||
l.writerMsg(0, INFO, msg) | |||
} | |||
func (l *Logger) Warn(format string, v ...interface{}) { | |||
msg := fmt.Sprintf("[W] "+format, v...) | |||
l.writerMsg(0, WARN, msg) | |||
} | |||
func (l *Logger) Error(skip int, format string, v ...interface{}) { | |||
msg := fmt.Sprintf("[E] "+format, v...) | |||
l.writerMsg(skip, ERROR, msg) | |||
} | |||
func (l *Logger) Critical(skip int, format string, v ...interface{}) { | |||
msg := fmt.Sprintf("[C] "+format, v...) | |||
l.writerMsg(skip, CRITICAL, msg) | |||
} | |||
func (l *Logger) Fatal(skip int, format string, v ...interface{}) { | |||
msg := fmt.Sprintf("[F] "+format, v...) | |||
l.writerMsg(skip, FATAL, msg) | |||
l.Close() | |||
os.Exit(1) | |||
} |
@@ -10,10 +10,12 @@ import ( | |||
"fmt" | |||
"path" | |||
"github.com/Unknwon/com" | |||
"github.com/Unknwon/macaron" | |||
"github.com/gogits/gogs/models" | |||
"github.com/gogits/gogs/modules/base" | |||
"github.com/gogits/gogs/modules/log" | |||
"github.com/gogits/gogs/modules/middleware" | |||
"github.com/gogits/gogs/modules/setting" | |||
) | |||
@@ -55,7 +57,7 @@ func GetMailTmplData(u *models.User) map[interface{}]interface{} { | |||
// create a time limit code for user active | |||
func CreateUserActiveCode(u *models.User, startInf interface{}) string { | |||
minutes := setting.Service.ActiveCodeLives | |||
data := base.ToStr(u.Id) + u.Email + u.LowerName + u.Passwd + u.Rands | |||
data := com.ToStr(u.Id) + u.Email + u.LowerName + u.Passwd + u.Rands | |||
code := base.CreateTimeLimitCode(data, minutes, startInf) | |||
// add tail hex username | |||
@@ -64,7 +66,7 @@ func CreateUserActiveCode(u *models.User, startInf interface{}) string { | |||
} | |||
// Send user register mail with active code | |||
func SendRegisterMail(r *middleware.Render, u *models.User) { | |||
func SendRegisterMail(r macaron.Render, u *models.User) { | |||
code := CreateUserActiveCode(u, nil) | |||
subject := "Register success, Welcome" | |||
@@ -72,7 +74,7 @@ func SendRegisterMail(r *middleware.Render, u *models.User) { | |||
data["Code"] = code | |||
body, err := r.HTMLString(string(AUTH_REGISTER_SUCCESS), data) | |||
if err != nil { | |||
log.Error("mail.SendRegisterMail(fail to render): %v", err) | |||
log.Error(4, "mail.SendRegisterMail(fail to render): %v", err) | |||
return | |||
} | |||
@@ -83,7 +85,7 @@ func SendRegisterMail(r *middleware.Render, u *models.User) { | |||
} | |||
// Send email verify active email. | |||
func SendActiveMail(r *middleware.Render, u *models.User) { | |||
func SendActiveMail(r macaron.Render, u *models.User) { | |||
code := CreateUserActiveCode(u, nil) | |||
subject := "Verify your e-mail address" | |||
@@ -92,7 +94,7 @@ func SendActiveMail(r *middleware.Render, u *models.User) { | |||
data["Code"] = code | |||
body, err := r.HTMLString(string(AUTH_ACTIVE), data) | |||
if err != nil { | |||
log.Error("mail.SendActiveMail(fail to render): %v", err) | |||
log.Error(4, "mail.SendActiveMail(fail to render): %v", err) | |||
return | |||
} | |||
@@ -103,7 +105,7 @@ func SendActiveMail(r *middleware.Render, u *models.User) { | |||
} | |||
// Send reset password email. | |||
func SendResetPasswdMail(r *middleware.Render, u *models.User) { | |||
func SendResetPasswdMail(r macaron.Render, u *models.User) { | |||
code := CreateUserActiveCode(u, nil) | |||
subject := "Reset your password" | |||
@@ -112,7 +114,7 @@ func SendResetPasswdMail(r *middleware.Render, u *models.User) { | |||
data["Code"] = code | |||
body, err := r.HTMLString(string(AUTH_RESET_PASSWORD), data) | |||
if err != nil { | |||
log.Error("mail.SendResetPasswdMail(fail to render): %v", err) | |||
log.Error(4, "mail.SendResetPasswdMail(fail to render): %v", err) | |||
return | |||
} | |||
@@ -157,7 +159,7 @@ func SendIssueNotifyMail(u, owner *models.User, repo *models.Repository, issue * | |||
} | |||
// SendIssueMentionMail sends mail notification for who are mentioned in issue. | |||
func SendIssueMentionMail(r *middleware.Render, u, owner *models.User, | |||
func SendIssueMentionMail(r macaron.Render, u, owner *models.User, | |||
repo *models.Repository, issue *models.Issue, tos []string) error { | |||
if len(tos) == 0 { | |||
@@ -182,7 +184,7 @@ func SendIssueMentionMail(r *middleware.Render, u, owner *models.User, | |||
} | |||
// SendCollaboratorMail sends mail notification to new collaborator. | |||
func SendCollaboratorMail(r *middleware.Render, u, owner *models.User, | |||
func SendCollaboratorMail(r macaron.Render, u, owner *models.User, | |||
repo *models.Repository) error { | |||
subject := fmt.Sprintf("%s added you to %s", owner.Name, repo.Name) |
@@ -56,7 +56,7 @@ func processMailQueue() { | |||
if len(msg.Info) > 0 { | |||
info = ", info: " + msg.Info | |||
} | |||
log.Error(fmt.Sprintf("Async sent email %d succeed, not send emails: %s%s err: %s", num, tos, info, err)) | |||
log.Error(4, fmt.Sprintf("Async sent email %d succeed, not send emails: %s%s err: %s", num, tos, info, err)) | |||
} else { | |||
log.Trace(fmt.Sprintf("Async sent email %d succeed, sent emails: %s%s", num, tos, info)) | |||
} |
@@ -8,7 +8,7 @@ import ( | |||
"net/url" | |||
"strings" | |||
"github.com/go-martini/martini" | |||
"github.com/Unknwon/macaron" | |||
"github.com/gogits/gogs/modules/setting" | |||
) | |||
@@ -20,7 +20,7 @@ type ToggleOptions struct { | |||
DisableCsrf bool | |||
} | |||
func Toggle(options *ToggleOptions) martini.Handler { | |||
func Toggle(options *ToggleOptions) macaron.Handler { | |||
return func(ctx *Context) { | |||
// Cannot view any page before installation. | |||
if !setting.InstallLock { | |||
@@ -49,7 +49,7 @@ func Toggle(options *ToggleOptions) martini.Handler { | |||
ctx.Redirect("/user/login") | |||
return | |||
} else if !ctx.User.IsActive && setting.Service.RegisterEmailConfirm { | |||
ctx.Data["Title"] = "Activate Your Account" | |||
// ctx.Data["Title"] = "Activate Your Account" | |||
ctx.HTML(200, "user/activate") | |||
return | |||
} |
@@ -16,7 +16,8 @@ import ( | |||
"strings" | |||
"unicode/utf8" | |||
"github.com/go-martini/martini" | |||
"github.com/Unknwon/macaron" | |||
"github.com/macaron-contrib/i18n" | |||
) | |||
/* | |||
@@ -37,44 +38,44 @@ import ( | |||
// your own error handling, use Form or Json middleware directly. | |||
// An interface pointer can be added as a second argument in order | |||
// to map the struct to a specific interface. | |||
func Bind(obj interface{}, ifacePtr ...interface{}) martini.Handler { | |||
return func(context martini.Context, req *http.Request) { | |||
contentType := req.Header.Get("Content-Type") | |||
func Bind(obj interface{}, ifacePtr ...interface{}) macaron.Handler { | |||
return func(ctx *macaron.Context) { | |||
contentType := ctx.Req.Header.Get("Content-Type") | |||
if strings.Contains(contentType, "form-urlencoded") { | |||
context.Invoke(Form(obj, ifacePtr...)) | |||
ctx.Invoke(Form(obj, ifacePtr...)) | |||
} else if strings.Contains(contentType, "multipart/form-data") { | |||
context.Invoke(MultipartForm(obj, ifacePtr...)) | |||
ctx.Invoke(MultipartForm(obj, ifacePtr...)) | |||
} else if strings.Contains(contentType, "json") { | |||
context.Invoke(Json(obj, ifacePtr...)) | |||
ctx.Invoke(Json(obj, ifacePtr...)) | |||
} else { | |||
context.Invoke(Json(obj, ifacePtr...)) | |||
if getErrors(context).Count() > 0 { | |||
context.Invoke(Form(obj, ifacePtr...)) | |||
ctx.Invoke(Json(obj, ifacePtr...)) | |||
if getErrors(ctx).Count() > 0 { | |||
ctx.Invoke(Form(obj, ifacePtr...)) | |||
} | |||
} | |||
context.Invoke(ErrorHandler) | |||
ctx.Invoke(ErrorHandler) | |||
} | |||
} | |||
// BindIgnErr will do the exactly same thing as Bind but without any | |||
// error handling, which user has freedom to deal with them. | |||
// This allows user take advantages of validation. | |||
func BindIgnErr(obj interface{}, ifacePtr ...interface{}) martini.Handler { | |||
return func(context martini.Context, req *http.Request) { | |||
func BindIgnErr(obj interface{}, ifacePtr ...interface{}) macaron.Handler { | |||
return func(ctx *macaron.Context, req *http.Request) { | |||
contentType := req.Header.Get("Content-Type") | |||
if strings.Contains(contentType, "form-urlencoded") { | |||
context.Invoke(Form(obj, ifacePtr...)) | |||
ctx.Invoke(Form(obj, ifacePtr...)) | |||
} else if strings.Contains(contentType, "multipart/form-data") { | |||
context.Invoke(MultipartForm(obj, ifacePtr...)) | |||
ctx.Invoke(MultipartForm(obj, ifacePtr...)) | |||
} else if strings.Contains(contentType, "json") { | |||
context.Invoke(Json(obj, ifacePtr...)) | |||
ctx.Invoke(Json(obj, ifacePtr...)) | |||
} else { | |||
context.Invoke(Json(obj, ifacePtr...)) | |||
if getErrors(context).Count() > 0 { | |||
context.Invoke(Form(obj, ifacePtr...)) | |||
ctx.Invoke(Json(obj, ifacePtr...)) | |||
if getErrors(ctx).Count() > 0 { | |||
ctx.Invoke(Form(obj, ifacePtr...)) | |||
} | |||
} | |||
} | |||
@@ -89,12 +90,12 @@ func BindIgnErr(obj interface{}, ifacePtr ...interface{}) martini.Handler { | |||
// keys, for example: key=val1&key=val2&key=val3 | |||
// An interface pointer can be added as a second argument in order | |||
// to map the struct to a specific interface. | |||
func Form(formStruct interface{}, ifacePtr ...interface{}) martini.Handler { | |||
return func(context martini.Context, req *http.Request) { | |||
func Form(formStruct interface{}, ifacePtr ...interface{}) macaron.Handler { | |||
return func(ctx *macaron.Context) { | |||
ensureNotPointer(formStruct) | |||
formStruct := reflect.New(reflect.TypeOf(formStruct)) | |||
errors := newErrors() | |||
parseErr := req.ParseForm() | |||
parseErr := ctx.Req.ParseForm() | |||
// Format validation of the request body or the URL would add considerable overhead, | |||
// and ParseForm does not complain when URL encoding is off. | |||
@@ -104,14 +105,14 @@ func Form(formStruct interface{}, ifacePtr ...interface{}) martini.Handler { | |||
errors.Overall[BindingDeserializationError] = parseErr.Error() | |||
} | |||
mapForm(formStruct, req.Form, errors) | |||
mapForm(formStruct, ctx.Req.Form, errors) | |||
validateAndMap(formStruct, context, errors, ifacePtr...) | |||
validateAndMap(formStruct, ctx, errors, ifacePtr...) | |||
} | |||
} | |||
func MultipartForm(formStruct interface{}, ifacePtr ...interface{}) martini.Handler { | |||
return func(context martini.Context, req *http.Request) { | |||
func MultipartForm(formStruct interface{}, ifacePtr ...interface{}) macaron.Handler { | |||
return func(ctx *macaron.Context) { | |||
ensureNotPointer(formStruct) | |||
formStruct := reflect.New(reflect.TypeOf(formStruct)) | |||
errors := newErrors() | |||
@@ -119,7 +120,7 @@ func MultipartForm(formStruct interface{}, ifacePtr ...interface{}) martini.Hand | |||
// Workaround for multipart forms returning nil instead of an error | |||
// when content is not multipart | |||
// https://code.google.com/p/go/issues/detail?id=6334 | |||
multipartReader, err := req.MultipartReader() | |||
multipartReader, err := ctx.Req.MultipartReader() | |||
if err != nil { | |||
errors.Overall[BindingDeserializationError] = err.Error() | |||
} else { | |||
@@ -129,12 +130,12 @@ func MultipartForm(formStruct interface{}, ifacePtr ...interface{}) martini.Hand | |||
errors.Overall[BindingDeserializationError] = parseErr.Error() | |||
} | |||
req.MultipartForm = form | |||
ctx.Req.MultipartForm = form | |||
} | |||
mapForm(formStruct, req.MultipartForm.Value, errors) | |||
mapForm(formStruct, ctx.Req.MultipartForm.Value, errors) | |||
validateAndMap(formStruct, context, errors, ifacePtr...) | |||
validateAndMap(formStruct, ctx, errors, ifacePtr...) | |||
} | |||
} | |||
@@ -143,21 +144,21 @@ func MultipartForm(formStruct interface{}, ifacePtr ...interface{}) martini.Hand | |||
// validated, but no error handling is actually performed here. | |||
// An interface pointer can be added as a second argument in order | |||
// to map the struct to a specific interface. | |||
func Json(jsonStruct interface{}, ifacePtr ...interface{}) martini.Handler { | |||
return func(context martini.Context, req *http.Request) { | |||
func Json(jsonStruct interface{}, ifacePtr ...interface{}) macaron.Handler { | |||
return func(ctx *macaron.Context) { | |||
ensureNotPointer(jsonStruct) | |||
jsonStruct := reflect.New(reflect.TypeOf(jsonStruct)) | |||
errors := newErrors() | |||
if req.Body != nil { | |||
defer req.Body.Close() | |||
if ctx.Req.Body != nil { | |||
defer ctx.Req.Body.Close() | |||
} | |||
if err := json.NewDecoder(req.Body).Decode(jsonStruct.Interface()); err != nil && err != io.EOF { | |||
if err := json.NewDecoder(ctx.Req.Body).Decode(jsonStruct.Interface()); err != nil && err != io.EOF { | |||
errors.Overall[BindingDeserializationError] = err.Error() | |||
} | |||
validateAndMap(jsonStruct, context, errors, ifacePtr...) | |||
validateAndMap(jsonStruct, ctx, errors, ifacePtr...) | |||
} | |||
} | |||
@@ -165,15 +166,15 @@ func Json(jsonStruct interface{}, ifacePtr ...interface{}) martini.Handler { | |||
// passed in is a Validator, then the user-defined Validate method | |||
// is executed, and its errors are mapped to the context. This middleware | |||
// performs no error handling: it merely detects them and maps them. | |||
func Validate(obj interface{}) martini.Handler { | |||
return func(context martini.Context, req *http.Request) { | |||
func Validate(obj interface{}) macaron.Handler { | |||
return func(ctx *macaron.Context, l i18n.Locale) { | |||
errors := newErrors() | |||
validateStruct(errors, obj) | |||
if validator, ok := obj.(Validator); ok { | |||
validator.Validate(errors, req, context) | |||
validator.Validate(ctx, errors, l) | |||
} | |||
context.Map(*errors) | |||
ctx.Map(*errors) | |||
} | |||
} | |||
@@ -387,9 +388,7 @@ func setWithProperType(valueKind reflect.Kind, val string, structField reflect.V | |||
} | |||
} | |||
// Don't pass in pointers to bind to. Can lead to bugs. See: | |||
// https://github.com/codegangsta/martini-contrib/issues/40 | |||
// https://github.com/codegangsta/martini-contrib/pull/34#issuecomment-29683659 | |||
// Don't pass in pointers to bind to. Can lead to bugs. | |||
func ensureNotPointer(obj interface{}) { | |||
if reflect.TypeOf(obj).Kind() == reflect.Ptr { | |||
panic("Pointers are not accepted as binding models") | |||
@@ -399,13 +398,13 @@ func ensureNotPointer(obj interface{}) { | |||
// Performs validation and combines errors from validation | |||
// with errors from deserialization, then maps both the | |||
// resulting struct and the errors to the context. | |||
func validateAndMap(obj reflect.Value, context martini.Context, errors *Errors, ifacePtr ...interface{}) { | |||
context.Invoke(Validate(obj.Interface())) | |||
errors.Combine(getErrors(context)) | |||
context.Map(*errors) | |||
context.Map(obj.Elem().Interface()) | |||
func validateAndMap(obj reflect.Value, ctx *macaron.Context, errors *Errors, ifacePtr ...interface{}) { | |||
ctx.Invoke(Validate(obj.Interface())) | |||
errors.Combine(getErrors(ctx)) | |||
ctx.Map(*errors) | |||
ctx.Map(obj.Elem().Interface()) | |||
if len(ifacePtr) > 0 { | |||
context.MapTo(obj.Elem().Interface(), ifacePtr[0]) | |||
ctx.MapTo(obj.Elem().Interface(), ifacePtr[0]) | |||
} | |||
} | |||
@@ -413,8 +412,8 @@ func newErrors() *Errors { | |||
return &Errors{make(map[string]string), make(map[string]string)} | |||
} | |||
func getErrors(context martini.Context) Errors { | |||
return context.Get(reflect.TypeOf(Errors{})).Interface().(Errors) | |||
func getErrors(ctx *macaron.Context) Errors { | |||
return ctx.GetVal(reflect.TypeOf(Errors{})).Interface().(Errors) | |||
} | |||
type ( | |||
@@ -422,7 +421,7 @@ type ( | |||
// validation before the request even gets to your application. | |||
// The Validate method will be executed during the validation phase. | |||
Validator interface { | |||
Validate(*Errors, *http.Request, martini.Context) | |||
Validate(*macaron.Context, *Errors, i18n.Locale) | |||
} | |||
) | |||
@@ -5,42 +5,33 @@ | |||
package middleware | |||
import ( | |||
"crypto/hmac" | |||
"crypto/sha1" | |||
"encoding/base64" | |||
"fmt" | |||
"html/template" | |||
"io" | |||
"net/http" | |||
"net/url" | |||
"path/filepath" | |||
"strconv" | |||
"path" | |||
"strings" | |||
"time" | |||
"github.com/go-martini/martini" | |||
"github.com/gogits/cache" | |||
"github.com/gogits/git" | |||
"github.com/gogits/session" | |||
"github.com/Unknwon/macaron" | |||
"github.com/macaron-contrib/i18n" | |||
"github.com/macaron-contrib/session" | |||
"github.com/gogits/gogs/models" | |||
"github.com/gogits/gogs/modules/auth" | |||
"github.com/gogits/gogs/modules/base" | |||
"github.com/gogits/gogs/modules/git" | |||
"github.com/gogits/gogs/modules/log" | |||
"github.com/gogits/gogs/modules/setting" | |||
) | |||
// Context represents context of a request. | |||
type Context struct { | |||
*Render | |||
c martini.Context | |||
p martini.Params | |||
Req *http.Request | |||
Res http.ResponseWriter | |||
Flash *Flash | |||
Session session.SessionStore | |||
Cache cache.Cache | |||
*macaron.Context | |||
i18n.Locale | |||
Flash *session.Flash | |||
Session session.Store | |||
User *models.User | |||
IsSigned bool | |||
@@ -68,7 +59,8 @@ type Context struct { | |||
HTTPS string | |||
Git string | |||
} | |||
Mirror *models.Mirror | |||
CommitsCount int | |||
Mirror *models.Mirror | |||
} | |||
} | |||
@@ -107,12 +99,12 @@ func (ctx *Context) HasError() bool { | |||
} | |||
// HTML calls render.HTML underlying but reduce one argument. | |||
func (ctx *Context) HTML(status int, name base.TplName, htmlOpt ...HTMLOptions) { | |||
ctx.Render.HTML(status, string(name), ctx.Data, htmlOpt...) | |||
func (ctx *Context) HTML(status int, name base.TplName) { | |||
ctx.Render.HTML(status, string(name), ctx.Data) | |||
} | |||
// RenderWithErr used for page has form validation but need to prompt error to users. | |||
func (ctx *Context) RenderWithErr(msg string, tpl base.TplName, form auth.Form) { | |||
func (ctx *Context) RenderWithErr(msg string, tpl base.TplName, form interface{}) { | |||
if form != nil { | |||
auth.AssignForm(form, ctx.Data) | |||
} | |||
@@ -124,8 +116,8 @@ func (ctx *Context) RenderWithErr(msg string, tpl base.TplName, form auth.Form) | |||
// Handle handles and logs error by given status. | |||
func (ctx *Context) Handle(status int, title string, err error) { | |||
if err != nil { | |||
log.Error("%s: %v", title, err) | |||
if martini.Dev != martini.Prod { | |||
log.Error(4, "%s: %v", title, err) | |||
if macaron.Env != macaron.PROD { | |||
ctx.Data["ErrorMsg"] = err | |||
} | |||
} | |||
@@ -139,106 +131,6 @@ func (ctx *Context) Handle(status int, title string, err error) { | |||
ctx.HTML(status, base.TplName(fmt.Sprintf("status/%d", status))) | |||
} | |||
func (ctx *Context) GetCookie(name string) string { | |||
cookie, err := ctx.Req.Cookie(name) | |||
if err != nil { | |||
return "" | |||
} | |||
return cookie.Value | |||
} | |||
func (ctx *Context) SetCookie(name string, value string, others ...interface{}) { | |||
cookie := http.Cookie{} | |||
cookie.Name = name | |||
cookie.Value = value | |||
if len(others) > 0 { | |||
switch v := others[0].(type) { | |||
case int: | |||
cookie.MaxAge = v | |||
case int64: | |||
cookie.MaxAge = int(v) | |||
case int32: | |||
cookie.MaxAge = int(v) | |||
} | |||
} | |||
// default "/" | |||
if len(others) > 1 { | |||
if v, ok := others[1].(string); ok && len(v) > 0 { | |||
cookie.Path = v | |||
} | |||
} else { | |||
cookie.Path = "/" | |||
} | |||
// default empty | |||
if len(others) > 2 { | |||
if v, ok := others[2].(string); ok && len(v) > 0 { | |||
cookie.Domain = v | |||
} | |||
} | |||
// default empty | |||
if len(others) > 3 { | |||
switch v := others[3].(type) { | |||
case bool: | |||
cookie.Secure = v | |||
default: | |||
if others[3] != nil { | |||
cookie.Secure = true | |||
} | |||
} | |||
} | |||
// default false. for session cookie default true | |||
if len(others) > 4 { | |||
if v, ok := others[4].(bool); ok && v { | |||
cookie.HttpOnly = true | |||
} | |||
} | |||
ctx.Res.Header().Add("Set-Cookie", cookie.String()) | |||
} | |||
// Get secure cookie from request by a given key. | |||
func (ctx *Context) GetSecureCookie(Secret, key string) (string, bool) { | |||
val := ctx.GetCookie(key) | |||
if val == "" { | |||
return "", false | |||
} | |||
parts := strings.SplitN(val, "|", 3) | |||
if len(parts) != 3 { | |||
return "", false | |||
} | |||
vs := parts[0] | |||
timestamp := parts[1] | |||
sig := parts[2] | |||
h := hmac.New(sha1.New, []byte(Secret)) | |||
fmt.Fprintf(h, "%s%s", vs, timestamp) | |||
if fmt.Sprintf("%02x", h.Sum(nil)) != sig { | |||
return "", false | |||
} | |||
res, _ := base64.URLEncoding.DecodeString(vs) | |||
return string(res), true | |||
} | |||
// Set Secure cookie for response. | |||
func (ctx *Context) SetSecureCookie(Secret, name, value string, others ...interface{}) { | |||
vs := base64.URLEncoding.EncodeToString([]byte(value)) | |||
timestamp := strconv.FormatInt(time.Now().UnixNano(), 10) | |||
h := hmac.New(sha1.New, []byte(Secret)) | |||
fmt.Fprintf(h, "%s%s", vs, timestamp) | |||
sig := fmt.Sprintf("%02x", h.Sum(nil)) | |||
cookie := strings.Join([]string{vs, timestamp, sig}, "|") | |||
ctx.SetCookie(name, cookie, others...) | |||
} | |||
func (ctx *Context) CsrfToken() string { | |||
if len(ctx.csrfToken) > 0 { | |||
return ctx.csrfToken | |||
@@ -271,16 +163,16 @@ func (ctx *Context) ServeFile(file string, names ...string) { | |||
if len(names) > 0 { | |||
name = names[0] | |||
} else { | |||
name = filepath.Base(file) | |||
name = path.Base(file) | |||
} | |||
ctx.Res.Header().Set("Content-Description", "File Transfer") | |||
ctx.Res.Header().Set("Content-Type", "application/octet-stream") | |||
ctx.Res.Header().Set("Content-Disposition", "attachment; filename="+name) | |||
ctx.Res.Header().Set("Content-Transfer-Encoding", "binary") | |||
ctx.Res.Header().Set("Expires", "0") | |||
ctx.Res.Header().Set("Cache-Control", "must-revalidate") | |||
ctx.Res.Header().Set("Pragma", "public") | |||
http.ServeFile(ctx.Res, ctx.Req, file) | |||
ctx.Resp.Header().Set("Content-Description", "File Transfer") | |||
ctx.Resp.Header().Set("Content-Type", "application/octet-stream") | |||
ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+name) | |||
ctx.Resp.Header().Set("Content-Transfer-Encoding", "binary") | |||
ctx.Resp.Header().Set("Expires", "0") | |||
ctx.Resp.Header().Set("Cache-Control", "must-revalidate") | |||
ctx.Resp.Header().Set("Pragma", "public") | |||
http.ServeFile(ctx.Resp, ctx.Req, file) | |||
} | |||
func (ctx *Context) ServeContent(name string, r io.ReadSeeker, params ...interface{}) { | |||
@@ -291,87 +183,52 @@ func (ctx *Context) ServeContent(name string, r io.ReadSeeker, params ...interfa | |||
modtime = v | |||
} | |||
} | |||
ctx.Res.Header().Set("Content-Description", "File Transfer") | |||
ctx.Res.Header().Set("Content-Type", "application/octet-stream") | |||
ctx.Res.Header().Set("Content-Disposition", "attachment; filename="+name) | |||
ctx.Res.Header().Set("Content-Transfer-Encoding", "binary") | |||
ctx.Res.Header().Set("Expires", "0") | |||
ctx.Res.Header().Set("Cache-Control", "must-revalidate") | |||
ctx.Res.Header().Set("Pragma", "public") | |||
http.ServeContent(ctx.Res, ctx.Req, name, modtime, r) | |||
} | |||
type Flash struct { | |||
url.Values | |||
ErrorMsg, SuccessMsg string | |||
} | |||
func (f *Flash) Error(msg string) { | |||
f.Set("error", msg) | |||
f.ErrorMsg = msg | |||
ctx.Resp.Header().Set("Content-Description", "File Transfer") | |||
ctx.Resp.Header().Set("Content-Type", "application/octet-stream") | |||
ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+name) | |||
ctx.Resp.Header().Set("Content-Transfer-Encoding", "binary") | |||
ctx.Resp.Header().Set("Expires", "0") | |||
ctx.Resp.Header().Set("Cache-Control", "must-revalidate") | |||
ctx.Resp.Header().Set("Pragma", "public") | |||
http.ServeContent(ctx.Resp, ctx.Req, name, modtime, r) | |||
} | |||
func (f *Flash) Success(msg string) { | |||
f.Set("success", msg) | |||
f.SuccessMsg = msg | |||
} | |||
// InitContext initializes a classic context for a request. | |||
func InitContext() martini.Handler { | |||
return func(res http.ResponseWriter, r *http.Request, c martini.Context, rd *Render) { | |||
// Contexter initializes a classic context for a request. | |||
func Contexter() macaron.Handler { | |||
return func(c *macaron.Context, l i18n.Locale, sess session.Store, f *session.Flash) { | |||
ctx := &Context{ | |||
c: c, | |||
// p: p, | |||
Req: r, | |||
Res: res, | |||
Cache: setting.Cache, | |||
Render: rd, | |||
Context: c, | |||
Locale: l, | |||
Flash: f, | |||
Session: sess, | |||
} | |||
ctx.Data["PageStartTime"] = time.Now() | |||
// start session | |||
ctx.Session = setting.SessionManager.SessionStart(res, r) | |||
// Cache: setting.Cache, | |||
// Get flash. | |||
values, err := url.ParseQuery(ctx.GetCookie("gogs_flash")) | |||
if err != nil { | |||
log.Error("InitContext.ParseQuery(flash): %v", err) | |||
} else if len(values) > 0 { | |||
ctx.Flash = &Flash{Values: values} | |||
ctx.Flash.ErrorMsg = ctx.Flash.Get("error") | |||
ctx.Flash.SuccessMsg = ctx.Flash.Get("success") | |||
ctx.Data["Flash"] = ctx.Flash | |||
ctx.SetCookie("gogs_flash", "", -1) | |||
// Compute current URL for real-time change language. | |||
link := ctx.Req.RequestURI | |||
i := strings.Index(link, "?") | |||
if i > -1 { | |||
link = link[:i] | |||
} | |||
ctx.Flash = &Flash{Values: url.Values{}} | |||
ctx.Data["Link"] = link | |||
rw := res.(martini.ResponseWriter) | |||
rw.Before(func(martini.ResponseWriter) { | |||
ctx.Session.SessionRelease(res) | |||
if flash := ctx.Flash.Encode(); len(flash) > 0 { | |||
ctx.SetCookie("gogs_flash", flash, 0) | |||
} | |||
}) | |||
ctx.Data["PageStartTime"] = time.Now() | |||
// Get user from session if logined. | |||
user := auth.SignedInUser(ctx.req.Header, ctx.Session) | |||
ctx.User = user | |||
ctx.IsSigned = user != nil | |||
ctx.Data["IsSigned"] = ctx.IsSigned | |||
if user != nil { | |||
ctx.Data["SignedUser"] = user | |||
ctx.Data["SignedUserId"] = user.Id | |||
ctx.Data["SignedUserName"] = user.Name | |||
ctx.User = auth.SignedInUser(ctx.Req.Header, ctx.Session) | |||
if ctx.User != nil { | |||
ctx.IsSigned = true | |||
ctx.Data["IsSigned"] = ctx.IsSigned | |||
ctx.Data["SignedUser"] = ctx.User | |||
ctx.Data["SignedUserId"] = ctx.User.Id | |||
ctx.Data["SignedUserName"] = ctx.User.Name | |||
ctx.Data["IsAdmin"] = ctx.User.IsAdmin | |||
} | |||
// If request sends files, parse them here otherwise the Query() can't be parsed and the CsrfToken will be invalid. | |||
if r.Method == "POST" && strings.Contains(r.Header.Get("Content-Type"), "multipart/form-data") { | |||
if err = ctx.Req.ParseMultipartForm(setting.AttachmentMaxSize << 20); err != nil && !strings.Contains(err.Error(), "EOF") { // 32MB max size | |||
ctx.Handle(500, "issue.Comment(ctx.Req.ParseMultipartForm)", err) | |||
if ctx.Req.Method == "POST" && strings.Contains(ctx.Req.Header.Get("Content-Type"), "multipart/form-data") { | |||
if err := ctx.Req.ParseMultipartForm(setting.AttachmentMaxSize << 20); err != nil && !strings.Contains(err.Error(), "EOF") { // 32MB max size | |||
ctx.Handle(500, "ParseMultipartForm", err) | |||
return | |||
} | |||
} | |||
@@ -381,7 +238,5 @@ func InitContext() martini.Handler { | |||
ctx.Data["CsrfTokenHtml"] = template.HTML(`<input type="hidden" name="_csrf" value="` + ctx.csrfToken + `">`) | |||
c.Map(ctx) | |||
c.Next() | |||
} | |||
} |
@@ -1,52 +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 middleware | |||
import ( | |||
"fmt" | |||
"log" | |||
"net/http" | |||
"runtime" | |||
"time" | |||
"github.com/go-martini/martini" | |||
"github.com/gogits/gogs/modules/setting" | |||
) | |||
var isWindows bool | |||
func init() { | |||
isWindows = runtime.GOOS == "windows" | |||
} | |||
func Logger() martini.Handler { | |||
return func(res http.ResponseWriter, req *http.Request, ctx martini.Context, log *log.Logger) { | |||
if setting.DisableRouterLog { | |||
return | |||
} | |||
start := time.Now() | |||
log.Printf("Started %s %s", req.Method, req.URL.Path) | |||
rw := res.(martini.ResponseWriter) | |||
ctx.Next() | |||
content := fmt.Sprintf("Completed %v %s in %v", rw.Status(), http.StatusText(rw.Status()), time.Since(start)) | |||
if !isWindows { | |||
switch rw.Status() { | |||
case 200: | |||
content = fmt.Sprintf("\033[1;32m%s\033[0m", content) | |||
case 304: | |||
content = fmt.Sprintf("\033[1;33m%s\033[0m", content) | |||
case 404: | |||
content = fmt.Sprintf("\033[1;31m%s\033[0m", content) | |||
case 500: | |||
content = fmt.Sprintf("\033[1;36m%s\033[0m", content) | |||
} | |||
} | |||
log.Println(content) | |||
} | |||
} |
@@ -1,281 +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. | |||
// foked from https://github.com/martini-contrib/render/blob/master/render.go | |||
package middleware | |||
import ( | |||
"bytes" | |||
"encoding/json" | |||
"fmt" | |||
"html/template" | |||
"io" | |||
"io/ioutil" | |||
"net/http" | |||
"os" | |||
"path/filepath" | |||
"time" | |||
"github.com/go-martini/martini" | |||
"github.com/gogits/gogs/modules/base" | |||
) | |||
const ( | |||
ContentType = "Content-Type" | |||
ContentLength = "Content-Length" | |||
ContentJSON = "application/json" | |||
ContentHTML = "text/html" | |||
ContentXHTML = "application/xhtml+xml" | |||
defaultCharset = "UTF-8" | |||
) | |||
var helperFuncs = template.FuncMap{ | |||
"yield": func() (string, error) { | |||
return "", fmt.Errorf("yield called with no layout defined") | |||
}, | |||
} | |||
type Delims struct { | |||
Left string | |||
Right string | |||
} | |||
type RenderOptions struct { | |||
Directory string | |||
Layout string | |||
Extensions []string | |||
Funcs []template.FuncMap | |||
Delims Delims | |||
Charset string | |||
IndentJSON bool | |||
HTMLContentType string | |||
} | |||
type HTMLOptions struct { | |||
Layout string | |||
} | |||
func Renderer(options ...RenderOptions) martini.Handler { | |||
opt := prepareOptions(options) | |||
cs := prepareCharset(opt.Charset) | |||
t := compile(opt) | |||
return func(res http.ResponseWriter, req *http.Request, c martini.Context) { | |||
var tc *template.Template | |||
if martini.Env == martini.Dev { | |||
tc = compile(opt) | |||
} else { | |||
tc, _ = t.Clone() | |||
} | |||
rd := &Render{res, req, tc, opt, cs, base.TmplData{}, time.Time{}} | |||
rd.Data["TmplLoadTimes"] = func() string { | |||
if rd.startTime.IsZero() { | |||
return "" | |||
} | |||
return fmt.Sprint(time.Since(rd.startTime).Nanoseconds()/1e6) + "ms" | |||
} | |||
c.Map(rd.Data) | |||
c.Map(rd) | |||
} | |||
} | |||
func prepareCharset(charset string) string { | |||
if len(charset) != 0 { | |||
return "; charset=" + charset | |||
} | |||
return "; charset=" + defaultCharset | |||
} | |||
func prepareOptions(options []RenderOptions) RenderOptions { | |||
var opt RenderOptions | |||
if len(options) > 0 { | |||
opt = options[0] | |||
} | |||
if len(opt.Directory) == 0 { | |||
opt.Directory = "templates" | |||
} | |||
if len(opt.Extensions) == 0 { | |||
opt.Extensions = []string{".tmpl"} | |||
} | |||
if len(opt.HTMLContentType) == 0 { | |||
opt.HTMLContentType = ContentHTML | |||
} | |||
return opt | |||
} | |||
func compile(options RenderOptions) *template.Template { | |||
dir := options.Directory | |||
t := template.New(dir) | |||
t.Delims(options.Delims.Left, options.Delims.Right) | |||
template.Must(t.Parse("Martini")) | |||
filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { | |||
r, err := filepath.Rel(dir, path) | |||
if err != nil { | |||
return err | |||
} | |||
ext := filepath.Ext(r) | |||
for _, extension := range options.Extensions { | |||
if ext == extension { | |||
buf, err := ioutil.ReadFile(path) | |||
if err != nil { | |||
panic(err) | |||
} | |||
name := (r[0 : len(r)-len(ext)]) | |||
tmpl := t.New(filepath.ToSlash(name)) | |||
for _, funcs := range options.Funcs { | |||
tmpl = tmpl.Funcs(funcs) | |||
} | |||
template.Must(tmpl.Funcs(helperFuncs).Parse(string(buf))) | |||
break | |||
} | |||
} | |||
return nil | |||
}) | |||
return t | |||
} | |||
type Render struct { | |||
http.ResponseWriter | |||
req *http.Request | |||
t *template.Template | |||
opt RenderOptions | |||
compiledCharset string | |||
Data base.TmplData | |||
startTime time.Time | |||
} | |||
func (r *Render) JSON(status int, v interface{}) { | |||
var result []byte | |||
var err error | |||
if r.opt.IndentJSON { | |||
result, err = json.MarshalIndent(v, "", " ") | |||
} else { | |||
result, err = json.Marshal(v) | |||
} | |||
if err != nil { | |||
http.Error(r, err.Error(), 500) | |||
return | |||
} | |||
r.Header().Set(ContentType, ContentJSON+r.compiledCharset) | |||
r.WriteHeader(status) | |||
r.Write(result) | |||
} | |||
func (r *Render) JSONString(v interface{}) (string, error) { | |||
var result []byte | |||
var err error | |||
if r.opt.IndentJSON { | |||
result, err = json.MarshalIndent(v, "", " ") | |||
} else { | |||
result, err = json.Marshal(v) | |||
} | |||
if err != nil { | |||
return "", err | |||
} | |||
return string(result), nil | |||
} | |||
func (r *Render) renderBytes(name string, binding interface{}, htmlOpt ...HTMLOptions) (*bytes.Buffer, error) { | |||
opt := r.prepareHTMLOptions(htmlOpt) | |||
if len(opt.Layout) > 0 { | |||
r.addYield(name, binding) | |||
name = opt.Layout | |||
} | |||
out, err := r.execute(name, binding) | |||
if err != nil { | |||
return nil, err | |||
} | |||
return out, nil | |||
} | |||
func (r *Render) HTML(status int, name string, binding interface{}, htmlOpt ...HTMLOptions) { | |||
r.startTime = time.Now() | |||
out, err := r.renderBytes(name, binding, htmlOpt...) | |||
if err != nil { | |||
http.Error(r, err.Error(), http.StatusInternalServerError) | |||
return | |||
} | |||
r.Header().Set(ContentType, r.opt.HTMLContentType+r.compiledCharset) | |||
r.WriteHeader(status) | |||
io.Copy(r, out) | |||
} | |||
func (r *Render) HTMLString(name string, binding interface{}, htmlOpt ...HTMLOptions) (string, error) { | |||
if out, err := r.renderBytes(name, binding, htmlOpt...); err != nil { | |||
return "", err | |||
} else { | |||
return out.String(), nil | |||
} | |||
} | |||
func (r *Render) Error(status int, message ...string) { | |||
r.WriteHeader(status) | |||
if len(message) > 0 { | |||
r.Write([]byte(message[0])) | |||
} | |||
} | |||
func (r *Render) Redirect(location string, status ...int) { | |||
code := http.StatusFound | |||
if len(status) == 1 { | |||
code = status[0] | |||
} | |||
http.Redirect(r, r.req, location, code) | |||
} | |||
func (r *Render) Template() *template.Template { | |||
return r.t | |||
} | |||
func (r *Render) execute(name string, binding interface{}) (*bytes.Buffer, error) { | |||
buf := new(bytes.Buffer) | |||
return buf, r.t.ExecuteTemplate(buf, name, binding) | |||
} | |||
func (r *Render) addYield(name string, binding interface{}) { | |||
funcs := template.FuncMap{ | |||
"yield": func() (template.HTML, error) { | |||
buf, err := r.execute(name, binding) | |||
return template.HTML(buf.String()), err | |||
}, | |||
} | |||
r.t.Funcs(funcs) | |||
} | |||
func (r *Render) prepareHTMLOptions(htmlOpt []HTMLOptions) HTMLOptions { | |||
if len(htmlOpt) > 0 { | |||
return htmlOpt[0] | |||
} | |||
return HTMLOptions{ | |||
Layout: r.opt.Layout, | |||
} | |||
} |
@@ -10,20 +10,19 @@ import ( | |||
"net/url" | |||
"strings" | |||
"github.com/go-martini/martini" | |||
"github.com/gogits/git" | |||
"github.com/Unknwon/macaron" | |||
"github.com/gogits/gogs/models" | |||
"github.com/gogits/gogs/modules/git" | |||
"github.com/gogits/gogs/modules/log" | |||
"github.com/gogits/gogs/modules/setting" | |||
) | |||
func RepoAssignment(redirect bool, args ...bool) martini.Handler { | |||
return func(ctx *Context, params martini.Params) { | |||
// valid brachname | |||
func RepoAssignment(redirect bool, args ...bool) macaron.Handler { | |||
return func(ctx *Context) { | |||
// To valid brach name. | |||
var validBranch bool | |||
// display bare quick start if it is a bare repo | |||
// To display bare quick start if it is a bare repo. | |||
var displayBare bool | |||
if len(args) >= 1 { | |||
@@ -35,51 +34,53 @@ func RepoAssignment(redirect bool, args ...bool) martini.Handler { | |||
} | |||
var ( | |||
user *models.User | |||
err error | |||
u *models.User | |||
err error | |||
) | |||
userName := params["username"] | |||
repoName := params["reponame"] | |||
refName := params["branchname"] | |||
userName := ctx.Params(":username") | |||
repoName := ctx.Params(":reponame") | |||
refName := ctx.Params(":branchname") | |||
if len(refName) == 0 { | |||
refName = ctx.Params(":path") | |||
} | |||
// TODO: need more advanced onwership and access level check. | |||
// Collaborators who have write access can be seen as owners. | |||
if ctx.IsSigned { | |||
ctx.Repo.IsOwner, err = models.HasAccess(ctx.User.Name, userName+"/"+repoName, models.WRITABLE) | |||
if err != nil { | |||
ctx.Handle(500, "RepoAssignment(HasAccess)", err) | |||
ctx.Handle(500, "HasAccess", err) | |||
return | |||
} | |||
ctx.Repo.IsTrueOwner = ctx.User.LowerName == strings.ToLower(userName) | |||
} | |||
if !ctx.Repo.IsTrueOwner { | |||
user, err = models.GetUserByName(userName) | |||
u, err = models.GetUserByName(userName) | |||
if err != nil { | |||
if err == models.ErrUserNotExist { | |||
ctx.Handle(404, "RepoAssignment(GetUserByName)", err) | |||
ctx.Handle(404, "GetUserByName", err) | |||
return | |||
} else if redirect { | |||
ctx.Redirect("/") | |||
return | |||
} | |||
ctx.Handle(500, "RepoAssignment(GetUserByName)", err) | |||
ctx.Handle(500, "GetUserByName", err) | |||
return | |||
} | |||
} else { | |||
user = ctx.User | |||
u = ctx.User | |||
} | |||
if user == nil { | |||
if u == nil { | |||
if redirect { | |||
ctx.Redirect("/") | |||
return | |||
} | |||
ctx.Handle(403, "RepoAssignment", errors.New("invliad user account for single repository")) | |||
ctx.Handle(404, "RepoAssignment", errors.New("invliad user account for single repository")) | |||
return | |||
} | |||
ctx.Repo.Owner = user | |||
ctx.Repo.Owner = u | |||
// Organization owner team members are true owners as well. | |||
if ctx.IsSigned && ctx.Repo.Owner.IsOrganization() && ctx.Repo.Owner.IsOrgOwner(ctx.User.Id) { | |||
@@ -87,16 +88,19 @@ func RepoAssignment(redirect bool, args ...bool) martini.Handler { | |||
} | |||
// get repository | |||
repo, err := models.GetRepositoryByName(user.Id, repoName) | |||
repo, err := models.GetRepositoryByName(u.Id, repoName) | |||
if err != nil { | |||
if err == models.ErrRepoNotExist { | |||
ctx.Handle(404, "RepoAssignment", err) | |||
ctx.Handle(404, "GetRepositoryByName", err) | |||
return | |||
} else if redirect { | |||
ctx.Redirect("/") | |||
return | |||
} | |||
ctx.Handle(500, "RepoAssignment", err) | |||
ctx.Handle(500, "GetRepositoryByName", err) | |||
return | |||
} else if err = repo.GetOwner(); err != nil { | |||
ctx.Handle(500, "GetOwner", err) | |||
return | |||
} | |||
@@ -108,16 +112,16 @@ func RepoAssignment(redirect bool, args ...bool) martini.Handler { | |||
// Check access. | |||
if repo.IsPrivate && !ctx.Repo.IsOwner { | |||
if ctx.User == nil { | |||
ctx.Handle(404, "RepoAssignment(HasAccess)", nil) | |||
ctx.Handle(404, "HasAccess", nil) | |||
return | |||
} | |||
hasAccess, err := models.HasAccess(ctx.User.Name, ctx.Repo.Owner.Name+"/"+repo.Name, models.READABLE) | |||
if err != nil { | |||
ctx.Handle(500, "RepoAssignment(HasAccess)", err) | |||
ctx.Handle(500, "HasAccess", err) | |||
return | |||
} else if !hasAccess { | |||
ctx.Handle(404, "RepoAssignment(HasAccess)", nil) | |||
ctx.Handle(404, "HasAccess", nil) | |||
return | |||
} | |||
} | |||
@@ -127,7 +131,7 @@ func RepoAssignment(redirect bool, args ...bool) martini.Handler { | |||
if repo.IsMirror { | |||
ctx.Repo.Mirror, err = models.GetMirror(repo.Id) | |||
if err != nil { | |||
ctx.Handle(500, "RepoAssignment(GetMirror)", err) | |||
ctx.Handle(500, "GetMirror", err) | |||
return | |||
} | |||
ctx.Data["MirrorInterval"] = ctx.Repo.Mirror.Interval | |||
@@ -144,34 +148,33 @@ func RepoAssignment(redirect bool, args ...bool) martini.Handler { | |||
return | |||
} | |||
ctx.Repo.GitRepo = gitRepo | |||
ctx.Repo.RepoLink = "/" + user.Name + "/" + repo.Name | |||
ctx.Repo.RepoLink = "/" + u.Name + "/" + repo.Name | |||
tags, err := ctx.Repo.GitRepo.GetTags() | |||
if err != nil { | |||
ctx.Handle(500, "RepoAssignment(GetTags))", err) | |||
ctx.Handle(500, "GetTags", err) | |||
return | |||
} | |||
ctx.Repo.Repository.NumTags = len(tags) | |||
ctx.Data["Title"] = user.Name + "/" + repo.Name | |||
ctx.Data["Title"] = u.Name + "/" + repo.Name | |||
ctx.Data["Repository"] = repo | |||
ctx.Data["Owner"] = user | |||
ctx.Data["Owner"] = ctx.Repo.Repository.Owner | |||
ctx.Data["RepoLink"] = ctx.Repo.RepoLink | |||
ctx.Data["IsRepositoryOwner"] = ctx.Repo.IsOwner | |||
ctx.Data["IsRepositoryTrueOwner"] = ctx.Repo.IsTrueOwner | |||
ctx.Data["BranchName"] = "" | |||
if setting.SshPort != 22 { | |||
ctx.Repo.CloneLink.SSH = fmt.Sprintf("ssh://%s@%s/%s/%s.git", setting.RunUser, setting.Domain, user.LowerName, repo.LowerName) | |||
ctx.Repo.CloneLink.SSH = fmt.Sprintf("ssh://%s@%s/%s/%s.git", setting.RunUser, setting.Domain, u.LowerName, repo.LowerName) | |||
} else { | |||
ctx.Repo.CloneLink.SSH = fmt.Sprintf("%s@%s:%s/%s.git", setting.RunUser, setting.Domain, user.LowerName, repo.LowerName) | |||
ctx.Repo.CloneLink.SSH = fmt.Sprintf("%s@%s:%s/%s.git", setting.RunUser, setting.Domain, u.LowerName, repo.LowerName) | |||
} | |||
ctx.Repo.CloneLink.HTTPS = fmt.Sprintf("%s%s/%s.git", setting.AppUrl, user.LowerName, repo.LowerName) | |||
ctx.Repo.CloneLink.HTTPS = fmt.Sprintf("%s%s/%s.git", setting.AppUrl, u.LowerName, repo.LowerName) | |||
ctx.Data["CloneLink"] = ctx.Repo.CloneLink | |||
if ctx.Repo.Repository.IsGoget { | |||
ctx.Data["GoGetLink"] = fmt.Sprintf("%s%s/%s", setting.AppUrl, user.LowerName, repo.LowerName) | |||
ctx.Data["GoGetImport"] = fmt.Sprintf("%s/%s/%s", setting.Domain, user.LowerName, repo.LowerName) | |||
ctx.Data["GoGetLink"] = fmt.Sprintf("%s%s/%s", setting.AppUrl, u.LowerName, repo.LowerName) | |||
ctx.Data["GoGetImport"] = fmt.Sprintf("%s/%s/%s", setting.Domain, u.LowerName, repo.LowerName) | |||
} | |||
// when repo is bare, not valid branch | |||
@@ -211,7 +214,7 @@ func RepoAssignment(redirect bool, args ...bool) martini.Handler { | |||
return | |||
} | |||
} else { | |||
ctx.Handle(404, "RepoAssignment invalid repo", nil) | |||
ctx.Handle(404, "RepoAssignment invalid repo", errors.New("branch or tag not exist")) | |||
return | |||
} | |||
@@ -222,7 +225,7 @@ func RepoAssignment(redirect bool, args ...bool) martini.Handler { | |||
} else { | |||
brs, err := gitRepo.GetBranches() | |||
if err != nil { | |||
ctx.Handle(500, "RepoAssignment(GetBranches))", err) | |||
ctx.Handle(500, "GetBranches", err) | |||
return | |||
} | |||
refName = brs[0] | |||
@@ -233,6 +236,13 @@ func RepoAssignment(redirect bool, args ...bool) martini.Handler { | |||
ctx.Data["IsBranch"] = ctx.Repo.IsBranch | |||
ctx.Data["IsCommit"] = ctx.Repo.IsCommit | |||
ctx.Repo.CommitsCount, err = ctx.Repo.Commit.CommitsCount() | |||
if err != nil { | |||
ctx.Handle(500, "CommitsCount", err) | |||
return | |||
} | |||
ctx.Data["CommitsCount"] = ctx.Repo.CommitsCount | |||
} | |||
log.Debug("displayBare: %v; IsBare: %v", displayBare, ctx.Repo.Repository.IsBare) | |||
@@ -240,7 +250,7 @@ func RepoAssignment(redirect bool, args ...bool) martini.Handler { | |||
// repo is bare and display enable | |||
if displayBare && ctx.Repo.Repository.IsBare { | |||
log.Debug("Bare repository: %s", ctx.Repo.RepoLink) | |||
ctx.HTML(200, "repo/single_bare") | |||
ctx.HTML(200, "repo/bare") | |||
return | |||
} | |||
@@ -251,9 +261,10 @@ func RepoAssignment(redirect bool, args ...bool) martini.Handler { | |||
ctx.Data["TagName"] = ctx.Repo.TagName | |||
brs, err := ctx.Repo.GitRepo.GetBranches() | |||
if err != nil { | |||
log.Error("RepoAssignment(GetBranches): %v", err) | |||
log.Error(4, "GetBranches: %v", err) | |||
} | |||
ctx.Data["Branches"] = brs | |||
ctx.Data["BrancheCount"] = len(brs) | |||
// If not branch selected, try default one. | |||
// If default branch doesn't exists, fall back to some other branch. | |||
@@ -267,11 +278,11 @@ func RepoAssignment(redirect bool, args ...bool) martini.Handler { | |||
ctx.Data["BranchName"] = ctx.Repo.BranchName | |||
ctx.Data["CommitId"] = ctx.Repo.CommitId | |||
ctx.Data["IsRepositoryWatching"] = ctx.Repo.IsWatching | |||
ctx.Data["IsWatchingRepo"] = ctx.Repo.IsWatching | |||
} | |||
} | |||
func RequireTrueOwner() martini.Handler { | |||
func RequireTrueOwner() macaron.Handler { | |||
return func(ctx *Context) { | |||
if !ctx.Repo.IsTrueOwner { | |||
if !ctx.IsSigned { |
@@ -1,127 +0,0 @@ | |||
// Copyright 2013 The Martini Authors. All rights reserved. | |||
// Copyright 2014 The Gogs Authors. All rights reserved. | |||
// Use of this source code is governed by a MIT-style | |||
// license that can be found in the LICENSE file. | |||
package middleware | |||
import ( | |||
"log" | |||
"net/http" | |||
"path" | |||
"runtime" | |||
"strings" | |||
"github.com/go-martini/martini" | |||
"github.com/gogits/gogs/modules/setting" | |||
) | |||
// StaticOptions is a struct for specifying configuration options for the martini.Static middleware. | |||
type StaticOptions struct { | |||
// Prefix is the optional prefix used to serve the static directory content | |||
Prefix string | |||
// SkipLogging will disable [Static] log messages when a static file is served. | |||
SkipLogging bool | |||
// IndexFile defines which file to serve as index if it exists. | |||
IndexFile string | |||
// Expires defines which user-defined function to use for producing a HTTP Expires Header | |||
// https://developers.google.com/speed/docs/insights/LeverageBrowserCaching | |||
Expires func() string | |||
} | |||
func prepareStaticOptions(options []StaticOptions) StaticOptions { | |||
var opt StaticOptions | |||
if len(options) > 0 { | |||
opt = options[0] | |||
} | |||
// Defaults | |||
if len(opt.IndexFile) == 0 { | |||
opt.IndexFile = "index.html" | |||
} | |||
// Normalize the prefix if provided | |||
if opt.Prefix != "" { | |||
// Ensure we have a leading '/' | |||
if opt.Prefix[0] != '/' { | |||
opt.Prefix = "/" + opt.Prefix | |||
} | |||
// Remove any trailing '/' | |||
opt.Prefix = strings.TrimRight(opt.Prefix, "/") | |||
} | |||
return opt | |||
} | |||
// Static returns a middleware handler that serves static files in the given directory. | |||
func Static(directory string, staticOpt ...StaticOptions) martini.Handler { | |||
if runtime.GOOS == "windows" { | |||
if len(directory) < 2 || directory[1] != ':' { | |||
directory = path.Join(setting.StaticRootPath, directory) | |||
} | |||
} else if !path.IsAbs(directory) { | |||
directory = path.Join(setting.StaticRootPath, directory) | |||
} | |||
dir := http.Dir(directory) | |||
opt := prepareStaticOptions(staticOpt) | |||
return func(res http.ResponseWriter, req *http.Request, log *log.Logger) { | |||
if req.Method != "GET" && req.Method != "HEAD" { | |||
return | |||
} | |||
file := req.URL.Path | |||
// if we have a prefix, filter requests by stripping the prefix | |||
if opt.Prefix != "" { | |||
if !strings.HasPrefix(file, opt.Prefix) { | |||
return | |||
} | |||
file = file[len(opt.Prefix):] | |||
if file != "" && file[0] != '/' { | |||
return | |||
} | |||
} | |||
f, err := dir.Open(file) | |||
if err != nil { | |||
// discard the error? | |||
return | |||
} | |||
defer f.Close() | |||
fi, err := f.Stat() | |||
if err != nil { | |||
return | |||
} | |||
// try to serve index file | |||
if fi.IsDir() { | |||
// redirect if missing trailing slash | |||
if !strings.HasSuffix(req.URL.Path, "/") { | |||
http.Redirect(res, req, req.URL.Path+"/", http.StatusFound) | |||
return | |||
} | |||
file = path.Join(file, opt.IndexFile) | |||
f, err = dir.Open(file) | |||
if err != nil { | |||
return | |||
} | |||
defer f.Close() | |||
fi, err = f.Stat() | |||
if err != nil || fi.IsDir() { | |||
return | |||
} | |||
} | |||
if !opt.SkipLogging { | |||
log.Println("[Static] Serving " + file) | |||
} | |||
// Add an Expires header to the static content | |||
if opt.Expires != nil { | |||
res.Header().Set("Expires", opt.Expires()) | |||
} | |||
http.ServeContent(res, req, file, fi.ModTime(), f) | |||
} | |||
} |
@@ -78,7 +78,7 @@ func ExecDir(timeout time.Duration, dir, desc, cmdName string, args ...string) ( | |||
select { | |||
case <-time.After(timeout): | |||
if errKill := Kill(pid); errKill != nil { | |||
log.Error("Exec(%d:%s): %v", pid, desc, errKill) | |||
log.Error(4, "Exec(%d:%s): %v", pid, desc, errKill) | |||
} | |||
<-done | |||
return "", ErrExecTimeout.Error(), ErrExecTimeout |
@@ -14,12 +14,12 @@ import ( | |||
"github.com/Unknwon/com" | |||
"github.com/Unknwon/goconfig" | |||
"github.com/macaron-contrib/session" | |||
"github.com/gogits/cache" | |||
"github.com/gogits/session" | |||
"github.com/gogits/gogs/modules/bin" | |||
"github.com/gogits/gogs/modules/log" | |||
// "github.com/gogits/gogs-ng/modules/ssh" | |||
) | |||
type Scheme string | |||
@@ -45,6 +45,7 @@ var ( | |||
DisableRouterLog bool | |||
CertFile, KeyFile string | |||
StaticRootPath string | |||
EnableGzip bool | |||
// Security settings. | |||
InstallLock bool | |||
@@ -89,15 +90,22 @@ var ( | |||
// Session settings. | |||
SessionProvider string | |||
SessionConfig *session.Config | |||
SessionManager *session.Manager | |||
// Global setting objects. | |||
Cfg *goconfig.ConfigFile | |||
CustomPath string // Custom directory path. | |||
ProdMode bool | |||
RunUser string | |||
Cfg *goconfig.ConfigFile | |||
ConfRootPath string | |||
CustomPath string // Custom directory path. | |||
ProdMode bool | |||
RunUser string | |||
// I18n settings. | |||
Langs, Names []string | |||
) | |||
func init() { | |||
log.NewLogger(0, "console", `{"level": 0}`) | |||
} | |||
func ExecPath() (string, error) { | |||
file, err := exec.LookPath(os.Args[0]) | |||
if err != nil { | |||
@@ -121,16 +129,13 @@ func WorkDir() (string, error) { | |||
func NewConfigContext() { | |||
workDir, err := WorkDir() | |||
if err != nil { | |||
log.Fatal("Fail to get work directory: %v", err) | |||
log.Fatal(4, "Fail to get work directory: %v", err) | |||
} | |||
ConfRootPath = path.Join(workDir, "conf") | |||
data, err := bin.Asset("conf/app.ini") | |||
Cfg, err = goconfig.LoadConfigFile(path.Join(workDir, "conf/app.ini")) | |||
if err != nil { | |||
log.Fatal("Fail to read 'conf/app.ini': %v", err) | |||
} | |||
Cfg, err = goconfig.LoadFromData(data) | |||
if err != nil { | |||
log.Fatal("Fail to parse 'conf/app.ini': %v", err) | |||
log.Fatal(4, "Fail to parse 'conf/app.ini': %v", err) | |||
} | |||
CustomPath = os.Getenv("GOGS_CUSTOM") | |||
@@ -141,10 +146,10 @@ func NewConfigContext() { | |||
cfgPath := path.Join(CustomPath, "conf/app.ini") | |||
if com.IsFile(cfgPath) { | |||
if err = Cfg.AppendFiles(cfgPath); err != nil { | |||
log.Fatal("Fail to load custom 'conf/app.ini': %v", err) | |||
log.Fatal(4, "Fail to load custom 'conf/app.ini': %v", err) | |||
} | |||
} else { | |||
log.Warn("No custom 'conf/app.ini' found") | |||
log.Warn("No custom 'conf/app.ini' found, please go to '/install'") | |||
} | |||
AppName = Cfg.MustValue("", "APP_NAME", "Gogs: Go Git Service") | |||
@@ -165,6 +170,7 @@ func NewConfigContext() { | |||
DisableRouterLog = Cfg.MustBool("server", "DISABLE_ROUTER_LOG") | |||
StaticRootPath = Cfg.MustValue("server", "STATIC_ROOT_PATH", workDir) | |||
LogRootPath = Cfg.MustValue("log", "ROOT_PATH", path.Join(workDir, "log")) | |||
EnableGzip = Cfg.MustBool("server", "ENABLE_GZIP") | |||
InstallLock = Cfg.MustBool("security", "INSTALL_LOCK") | |||
SecretKey = Cfg.MustValue("security", "SECRET_KEY") | |||
@@ -173,14 +179,14 @@ func NewConfigContext() { | |||
CookieRememberName = Cfg.MustValue("security", "COOKIE_REMEMBER_NAME") | |||
ReverseProxyAuthUser = Cfg.MustValue("security", "REVERSE_PROXY_AUTHENTICATION_USER", "X-WEBAUTH-USER") | |||
AttachmentPath = Cfg.MustValue("attachment", "PATH", "files/attachments") | |||
AttachmentAllowedTypes = Cfg.MustValue("attachment", "ALLOWED_TYPES", "*/*") | |||
AttachmentPath = Cfg.MustValue("attachment", "PATH", "data/attachments") | |||
AttachmentAllowedTypes = Cfg.MustValue("attachment", "ALLOWED_TYPES", "image/jpeg|image/png") | |||
AttachmentMaxSize = Cfg.MustInt64("attachment", "MAX_SIZE", 32) | |||
AttachmentMaxFiles = Cfg.MustInt("attachment", "MAX_FILES", 10) | |||
AttachmentEnabled = Cfg.MustBool("attachment", "ENABLE", true) | |||
if err = os.MkdirAll(AttachmentPath, os.ModePerm); err != nil { | |||
log.Fatal("Could not create directory %s: %s", AttachmentPath, err) | |||
log.Fatal(4, "Could not create directory %s: %s", AttachmentPath, err) | |||
} | |||
RunUser = Cfg.MustValue("", "RUN_USER") | |||
@@ -190,13 +196,13 @@ func NewConfigContext() { | |||
} | |||
// Does not check run user when the install lock is off. | |||
if InstallLock && RunUser != curUser { | |||
log.Fatal("Expect user(%s) but current user is: %s", RunUser, curUser) | |||
log.Fatal(4, "Expect user(%s) but current user is: %s", RunUser, curUser) | |||
} | |||
// Determine and create root git reposiroty path. | |||
homeDir, err := com.HomeDir() | |||
if err != nil { | |||
log.Fatal("Fail to get home directory: %v", err) | |||
log.Fatal(4, "Fail to get home directory: %v", err) | |||
} | |||
RepoRootPath = Cfg.MustValue("repository", "ROOT", filepath.Join(homeDir, "gogs-repositories")) | |||
if !filepath.IsAbs(RepoRootPath) { | |||
@@ -206,13 +212,16 @@ func NewConfigContext() { | |||
} | |||
if err = os.MkdirAll(RepoRootPath, os.ModePerm); err != nil { | |||
log.Fatal("Fail to create repository root path(%s): %v", RepoRootPath, err) | |||
log.Fatal(4, "Fail to create repository root path(%s): %v", RepoRootPath, err) | |||
} | |||
ScriptType = Cfg.MustValue("repository", "SCRIPT_TYPE", "bash") | |||
PictureService = Cfg.MustValueRange("picture", "SERVICE", "server", | |||
[]string{"server"}) | |||
DisableGravatar = Cfg.MustBool("picture", "DISABLE_GRAVATAR") | |||
Langs = Cfg.MustValueArray("i18n", "LANGS", ",") | |||
Names = Cfg.MustValueArray("i18n", "NAMES", ",") | |||
} | |||
var Service struct { | |||
@@ -255,7 +264,7 @@ func newLogService() { | |||
mode = strings.TrimSpace(mode) | |||
modeSec := "log." + mode | |||
if _, err := Cfg.GetSection(modeSec); err != nil { | |||
log.Fatal("Unknown log mode: %s", mode) | |||
log.Fatal(4, "Unknown log mode: %s", mode) | |||
} | |||
// Log level. | |||
@@ -263,7 +272,7 @@ func newLogService() { | |||
[]string{"Trace", "Debug", "Info", "Warn", "Error", "Critical"}) | |||
level, ok := logLevels[levelName] | |||
if !ok { | |||
log.Fatal("Unknown log level: %s", levelName) | |||
log.Fatal(4, "Unknown log level: %s", levelName) | |||
} | |||
// Generate log configuration. | |||
@@ -318,15 +327,15 @@ func newCacheService() { | |||
case "memory": | |||
CacheConfig = fmt.Sprintf(`{"interval":%d}`, Cfg.MustInt("cache", "INTERVAL", 60)) | |||
case "redis", "memcache": | |||
CacheConfig = fmt.Sprintf(`{"conn":"%s"}`, Cfg.MustValue("cache", "HOST")) | |||
CacheConfig = fmt.Sprintf(`{"conn":"%s"}`, strings.Trim(Cfg.MustValue("cache", "HOST"), "\" ")) | |||
default: | |||
log.Fatal("Unknown cache adapter: %s", CacheAdapter) | |||
log.Fatal(4, "Unknown cache adapter: %s", CacheAdapter) | |||
} | |||
var err error | |||
Cache, err = cache.NewCache(CacheAdapter, CacheConfig) | |||
if err != nil { | |||
log.Fatal("Init cache system failed, adapter: %s, config: %s, %v\n", | |||
log.Fatal(4, "Init cache system failed, adapter: %s, config: %s, %v\n", | |||
CacheAdapter, CacheConfig, err) | |||
} | |||
@@ -338,12 +347,12 @@ func newSessionService() { | |||
[]string{"memory", "file", "redis", "mysql"}) | |||
SessionConfig = new(session.Config) | |||
SessionConfig.ProviderConfig = Cfg.MustValue("session", "PROVIDER_CONFIG") | |||
SessionConfig.ProviderConfig = strings.Trim(Cfg.MustValue("session", "PROVIDER_CONFIG"), "\" ") | |||
SessionConfig.CookieName = Cfg.MustValue("session", "COOKIE_NAME", "i_like_gogits") | |||
SessionConfig.CookieSecure = Cfg.MustBool("session", "COOKIE_SECURE") | |||
SessionConfig.Secure = Cfg.MustBool("session", "COOKIE_SECURE") | |||
SessionConfig.EnableSetCookie = Cfg.MustBool("session", "ENABLE_SET_COOKIE", true) | |||
SessionConfig.GcIntervalTime = Cfg.MustInt64("session", "GC_INTERVAL_TIME", 86400) | |||
SessionConfig.SessionLifeTime = Cfg.MustInt64("session", "SESSION_LIFE_TIME", 86400) | |||
SessionConfig.Gclifetime = Cfg.MustInt64("session", "GC_INTERVAL_TIME", 86400) | |||
SessionConfig.Maxlifetime = Cfg.MustInt64("session", "SESSION_LIFE_TIME", 86400) | |||
SessionConfig.SessionIDHashFunc = Cfg.MustValueRange("session", "SESSION_ID_HASHFUNC", | |||
"sha1", []string{"sha1", "sha256", "md5"}) | |||
SessionConfig.SessionIDHashKey = Cfg.MustValue("session", "SESSION_ID_HASHKEY") | |||
@@ -352,14 +361,6 @@ func newSessionService() { | |||
os.MkdirAll(path.Dir(SessionConfig.ProviderConfig), os.ModePerm) | |||
} | |||
var err error | |||
SessionManager, err = session.NewManager(SessionProvider, *SessionConfig) | |||
if err != nil { | |||
log.Fatal("Init session system failed, provider: %s, %v", | |||
SessionProvider, err) | |||
} | |||
go SessionManager.GC() | |||
log.Info("Session Service Enabled") | |||
} | |||
@@ -441,4 +442,5 @@ func NewServices() { | |||
newRegisterMailService() | |||
newNotifyMailService() | |||
newWebhookService() | |||
// ssh.Listen("2022") | |||
} |
@@ -0,0 +1,119 @@ | |||
// 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. | |||
// Prototype, git client looks like do not recognize req.Reply. | |||
package ssh | |||
import ( | |||
"fmt" | |||
"io/ioutil" | |||
"net" | |||
"os" | |||
"os/exec" | |||
"strings" | |||
"code.google.com/p/go.crypto/ssh" | |||
"github.com/Unknwon/com" | |||
"github.com/gogits/gogs-ng/modules/log" | |||
) | |||
func handleServerConn(keyId string, chans <-chan ssh.NewChannel) { | |||
for newChan := range chans { | |||
if newChan.ChannelType() != "session" { | |||
newChan.Reject(ssh.UnknownChannelType, "unknown channel type") | |||
continue | |||
} | |||
channel, requests, err := newChan.Accept() | |||
if err != nil { | |||
log.Error(3, "Could not accept channel: %v", err) | |||
continue | |||
} | |||
go func(in <-chan *ssh.Request) { | |||
defer channel.Close() | |||
for req := range in { | |||
ok, payload := false, strings.TrimLeft(string(req.Payload), "\x00") | |||
fmt.Println("Request:", req.Type, req.WantReply, payload) | |||
switch req.Type { | |||
case "env": | |||
args := strings.Split(strings.Replace(payload, "\x00", "", -1), "\v") | |||
if len(args) != 2 { | |||
break | |||
} | |||
args[0] = strings.TrimLeft(args[0], "\x04") | |||
_, _, err := com.ExecCmdBytes("env", args[0]+"="+args[1]) | |||
if err != nil { | |||
log.Error(3, "env: %v", err) | |||
channel.Stderr().Write([]byte(err.Error())) | |||
break | |||
} | |||
ok = true | |||
case "exec": | |||
os.Setenv("SSH_ORIGINAL_COMMAND", strings.TrimLeft(payload, "'(")) | |||
log.Info("Payload: %v", strings.TrimLeft(payload, "'(")) | |||
cmd := exec.Command("/Users/jiahuachen/Applications/Go/src/github.com/gogits/gogs-ng/gogs-ng", "serv", "key-"+keyId) | |||
cmd.Stdout = channel | |||
cmd.Stdin = channel | |||
cmd.Stderr = channel.Stderr() | |||
if err := cmd.Run(); err != nil { | |||
log.Error(3, "exec: %v", err) | |||
} else { | |||
ok = true | |||
} | |||
} | |||
fmt.Println("Done:", ok) | |||
req.Reply(ok, nil) // BUG: Git on Mac seems not know this reply and hang? | |||
} | |||
fmt.Println("Done!!!") | |||
}(requests) | |||
} | |||
} | |||
func listen(config *ssh.ServerConfig, port string) { | |||
listener, err := net.Listen("tcp", "0.0.0.0:"+port) | |||
if err != nil { | |||
panic(err) | |||
} | |||
for { | |||
// Once a ServerConfig has been configured, connections can be accepted. | |||
conn, err := listener.Accept() | |||
if err != nil { | |||
log.Error(3, "Fail to accept incoming connection: %v", err) | |||
continue | |||
} | |||
// Before use, a handshake must be performed on the incoming net.Conn. | |||
sConn, chans, reqs, err := ssh.NewServerConn(conn, config) | |||
if err != nil { | |||
log.Error(3, "Fail to handshake: %v", err) | |||
continue | |||
} | |||
// The incoming Request channel must be serviced. | |||
go ssh.DiscardRequests(reqs) | |||
go handleServerConn(sConn.Permissions.Extensions["key-id"], chans) | |||
} | |||
} | |||
// Listen starts a SSH server listens on given port. | |||
func Listen(port string) { | |||
config := &ssh.ServerConfig{ | |||
PublicKeyCallback: func(conn ssh.ConnMetadata, key ssh.PublicKey) (*ssh.Permissions, error) { | |||
// keyCache[string(ssh.MarshalAuthorizedKey(key))] = 2 | |||
return &ssh.Permissions{Extensions: map[string]string{"key-id": "2"}}, nil | |||
}, | |||
} | |||
privateBytes, err := ioutil.ReadFile("/Users/jiahuachen/.ssh/id_rsa") | |||
if err != nil { | |||
panic("failed to load private key") | |||
} | |||
private, err := ssh.ParsePrivateKey(privateBytes) | |||
if err != nil { | |||
panic("failed to parse private key") | |||
} | |||
config.AddHostKey(private) | |||
go listen(config, port) | |||
} |
@@ -0,0 +1 @@ | |||
.hljs{display:block;overflow-x:auto;padding:.5em;color:#333;background:#f8f8f8}.hljs-comment,.hljs-template_comment,.diff .hljs-header,.hljs-javadoc{color:#998;font-style:italic}.hljs-keyword,.css .rule .hljs-keyword,.hljs-winutils,.javascript .hljs-title,.nginx .hljs-title,.hljs-subst,.hljs-request,.hljs-status{color:#333;font-weight:bold}.hljs-number,.hljs-hexcolor,.ruby .hljs-constant{color:#099}.hljs-string,.hljs-tag .hljs-value,.hljs-phpdoc,.tex .hljs-formula{color:#d14}.hljs-title,.hljs-id,.coffeescript .hljs-params,.scss .hljs-preprocessor{color:#900;font-weight:bold}.javascript .hljs-title,.lisp .hljs-title,.clojure .hljs-title,.hljs-subst{font-weight:normal}.hljs-class .hljs-title,.haskell .hljs-type,.vhdl .hljs-literal,.tex .hljs-command{color:#458;font-weight:bold}.hljs-tag,.hljs-tag .hljs-title,.hljs-rules .hljs-property,.django .hljs-tag .hljs-keyword{color:#000080;font-weight:normal}.hljs-attribute,.hljs-variable,.lisp .hljs-body{color:#008080}.hljs-regexp{color:#009926}.hljs-symbol,.ruby .hljs-symbol .hljs-string,.lisp .hljs-keyword,.tex .hljs-special,.hljs-prompt{color:#990073}.hljs-built_in,.lisp .hljs-title,.clojure .hljs-built_in{color:#0086b3}.hljs-preprocessor,.hljs-pragma,.hljs-pi,.hljs-doctype,.hljs-shebang,.hljs-cdata{color:#999;font-weight:bold}.hljs-deletion{background:#fdd}.hljs-addition{background:#dfd}.diff .hljs-change{background:#0086b3}.hljs-chunk{color:#aaa} |
@@ -0,0 +1,814 @@ | |||
* { | |||
padding: 0; | |||
margin: 0; | |||
} | |||
html { | |||
font-size: 13px; | |||
font-family: Helvetica, "Microsoft Yahei", Menlo, Monaco, Consolas, "Courier New", monospace; | |||
-ms-text-size-adjust: 100%; | |||
-webkit-text-size-adjust: 100%; | |||
line-height: 24px; | |||
color: #444444; | |||
background-color: #fafafa; | |||
} | |||
input, | |||
textarea, | |||
select, | |||
option, | |||
button { | |||
font-family: Helvetica, "Microsoft Yahei", Menlo, Monaco, Consolas, "Courier New", monospace; | |||
} | |||
article, | |||
aside, | |||
details, | |||
figcaption, | |||
figure, | |||
footer, | |||
header, | |||
main, | |||
nav, | |||
section, | |||
summary, | |||
.block { | |||
display: block; | |||
} | |||
.inline { | |||
display: inline; | |||
} | |||
.inline-block { | |||
display: inline-block; | |||
} | |||
.dis-table { | |||
display: table; | |||
} | |||
.dis-table-cell { | |||
display: table-cell; | |||
} | |||
.dis-flex { | |||
display: flex; | |||
} | |||
audio, | |||
canvas, | |||
progress, | |||
video { | |||
display: inline-block; | |||
vertical-align: baseline; | |||
} | |||
audio:not([controls]) { | |||
display: none; | |||
height: 0; | |||
} | |||
[hidden], | |||
template .hidden { | |||
display: none; | |||
} | |||
.opacity { | |||
opacity: 0; | |||
} | |||
.opacity-half { | |||
opacity: .5; | |||
} | |||
a, | |||
.text-link { | |||
color: #428bca; | |||
text-decoration: none; | |||
} | |||
a:hover, | |||
.text-link:hover { | |||
color: #399ade; | |||
text-decoration: none; | |||
} | |||
a:focus, | |||
.text-link:focus { | |||
outline: none; | |||
} | |||
b, | |||
strong, | |||
.text-bold { | |||
font-weight: bold; | |||
} | |||
dfn, | |||
.text-italic { | |||
font-style: italic; | |||
} | |||
h1, | |||
.text-h1 { | |||
font-size: 2em; | |||
margin-bottom: 0.67em; | |||
} | |||
h2, | |||
.text-h2 { | |||
font-size: 1.6em; | |||
margin-bottom: 0.625em; | |||
} | |||
h3, | |||
.text-h3 { | |||
font: 1.2em; | |||
margin-bottom: 0.5em; | |||
} | |||
h4, | |||
h5, | |||
h6, | |||
.text-h4, | |||
.text-h5, | |||
.text-h6 { | |||
font-size: 1em; | |||
margin-bottom: .3em; | |||
} | |||
small, | |||
.text-small { | |||
font-size: .8em; | |||
} | |||
sub, | |||
sup, | |||
.text-sup, | |||
.text-sub { | |||
font-size: .7em; | |||
line-height: 0; | |||
position: relative; | |||
vertical-align: baseline; | |||
} | |||
sup, | |||
.text-sup { | |||
top: -0.5em; | |||
} | |||
sub, | |||
.text-sub { | |||
bottom: -0.25em; | |||
} | |||
.figure, | |||
.blockquote { | |||
margin: 1em 1.5em; | |||
} | |||
pre { | |||
overflow: auto; | |||
margin: 0; | |||
padding: .4em 1em; | |||
} | |||
code, | |||
kbd, | |||
pre, | |||
samp { | |||
font-family: monospace, monospace; | |||
font-size: 1em; | |||
} | |||
.text-left { | |||
text-align: left; | |||
} | |||
.text-right { | |||
text-align: right; | |||
} | |||
.text-center { | |||
text-align: center; | |||
} | |||
.list-no-style { | |||
list-style: none; | |||
} | |||
img { | |||
border: none; | |||
} | |||
svg:not(:root) { | |||
overflow: hidden; | |||
} | |||
label { | |||
font-weight: bold; | |||
} | |||
input, | |||
.ipt { | |||
padding: .6em; | |||
line-height: normal; | |||
border: 1px solid #bbbbbb; | |||
} | |||
input:focus, | |||
.ipt:focus { | |||
background-color: #f2fffc; | |||
outline: none; | |||
} | |||
button { | |||
overflow: visible; | |||
padding: .6em 1.2em; | |||
} | |||
button, | |||
select { | |||
text-transform: none; | |||
} | |||
button:focus, | |||
select:focus { | |||
outline: none; | |||
} | |||
button, | |||
input[type="button"], | |||
input[type="reset"], | |||
input[type="submit"] { | |||
-webkit-appearance: button; | |||
-moz-appearance: button; | |||
cursor: pointer; | |||
background-color: #888888; | |||
color: #fafafa; | |||
border: none; | |||
} | |||
button:hover, | |||
input[type="button"]:hover, | |||
input[type="reset"]:hover, | |||
input[type="submit"]:hover { | |||
background-color: #444444; | |||
color: #ffffff; | |||
} | |||
button[disabled], | |||
html input[disabled] { | |||
cursor: default; | |||
} | |||
button::-moz-focus-inner, | |||
input::-moz-focus-inner { | |||
border: 0; | |||
padding: 0; | |||
} | |||
input[type="checkbox"], | |||
input[type="radio"] { | |||
box-sizing: border-box; | |||
padding: 0; | |||
} | |||
input[type="search"] { | |||
-webkit-appearance: textfield; | |||
-moz-appearance: textfield; | |||
-moz-box-sizing: content-box; | |||
-webkit-box-sizing: content-box; | |||
box-sizing: content-box; | |||
} | |||
fieldset { | |||
border: 1px solid #bbbbbb; | |||
margin: 0 2px; | |||
padding: 0.4em 0.8em 0.8em; | |||
} | |||
legend { | |||
border: 0; | |||
padding: 0; | |||
} | |||
textarea { | |||
overflow: auto; | |||
border: 1px solid #bbbbbb; | |||
padding: .6em; | |||
} | |||
textarea:focus { | |||
background-color: #f2fffc; | |||
outline: none; | |||
} | |||
optgroup { | |||
font-weight: bold; | |||
} | |||
table { | |||
border-collapse: collapse; | |||
border-spacing: 0; | |||
} | |||
td, | |||
th { | |||
padding: 0; | |||
} | |||
hr { | |||
-moz-box-sizing: content-box; | |||
box-sizing: content-box; | |||
height: 0; | |||
border: none; | |||
border-bottom: 1px solid #dddddd; | |||
margin-bottom: .75em; | |||
} | |||
p code { | |||
color: #b63b2c; | |||
} | |||
.radius { | |||
border-radius: .25em; | |||
} | |||
.text-truncate { | |||
overflow: hidden; | |||
text-overflow: ellipsis; | |||
white-space: nowrap; | |||
display: inline-block; | |||
vertical-align: top; | |||
} | |||
pre { | |||
line-height: 1.6; | |||
overflow: auto; | |||
padding: 0; | |||
} | |||
.left { | |||
float: left; | |||
} | |||
.right { | |||
float: right; | |||
} | |||
.clear::after { | |||
clear: both; | |||
content: " "; | |||
width: 0; | |||
height: 0; | |||
display: block; | |||
} | |||
.hide { | |||
display: none; | |||
} | |||
.grid-1-12 { | |||
width: 8.33%; | |||
} | |||
.grid-2-12, | |||
.grid-1-6 { | |||
width: 16.67%; | |||
} | |||
.grid-3-12, | |||
.grid-1-4 { | |||
width: 25%; | |||
} | |||
.grid-4-12, | |||
.grid-1-3 { | |||
width: 33%; | |||
} | |||
.grid-5-12 { | |||
width: 41.67%; | |||
} | |||
.grid-6-12, | |||
.grid-1-2 { | |||
width: 50%; | |||
} | |||
.grid-7-12 { | |||
width: 58.33%; | |||
} | |||
.grid-8-12, | |||
.grid-2-3 { | |||
width: 66.67%; | |||
} | |||
.grid-9-12, | |||
.grid-3-4 { | |||
width: 75%; | |||
} | |||
.grid-10-12, | |||
.grid-5-6 { | |||
width: 83.33%; | |||
} | |||
.grid-11-12 { | |||
width: 91.67%; | |||
} | |||
*[class*="grid-"] { | |||
box-sizing: content-box; | |||
} | |||
.grid-1-5 { | |||
width: 20%; | |||
} | |||
.grid-2-5 { | |||
width: 40%; | |||
} | |||
.grid-3-5 { | |||
width: 60%; | |||
} | |||
.grid-4-5 { | |||
width: 80%; | |||
} | |||
.btn-small { | |||
font-size: 10.8px; | |||
padding: .4em .9em; | |||
} | |||
.btn-large { | |||
font-size: 14.4px; | |||
} | |||
.btn-green { | |||
background-color: #65ad4e; | |||
border: 1px solid #65ad4e; | |||
} | |||
.btn-green:hover { | |||
background-color: #71bf57; | |||
color: #FFF; | |||
} | |||
.btn-blue { | |||
background-color: #428bca; | |||
border: 1px solid #428bca; | |||
} | |||
.btn-blue:hover { | |||
background-color: #539cdb; | |||
color: #FFF; | |||
} | |||
.btn-red { | |||
background-color: #d9453d; | |||
border: 1px solid #d9453d; | |||
} | |||
.btn-red:hover { | |||
background-color: #ff635a; | |||
color: #FFF; | |||
} | |||
.btn-orange { | |||
background-color: #df7514; | |||
border: 1px solid #df7514; | |||
} | |||
.btn-orange:hover { | |||
background-color: #df8229; | |||
color: #FFF; | |||
} | |||
.btn-black { | |||
background-color: #444444; | |||
border: 1px solid #444444; | |||
} | |||
.btn-black:hover { | |||
background-color: #383838; | |||
color: #FFF; | |||
} | |||
.btn-gray { | |||
background-color: #f0f0f0; | |||
color: #444444; | |||
border: 1px solid #d0d0d0; | |||
} | |||
.btn-gray:hover { | |||
background-color: #fafafa; | |||
color: #444444; | |||
} | |||
.btn-active { | |||
box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1) inset, 0 0 4px rgba(0, 0, 0, 0.15) inset; | |||
} | |||
.btn-radius { | |||
border-radius: .25em; | |||
} | |||
.btn-left-radius { | |||
border-top-left-radius: .25em; | |||
border-bottom-left-radius: .25em; | |||
} | |||
.btn-right-radius { | |||
border-top-right-radius: .25em; | |||
border-bottom-right-radius: .25em; | |||
} | |||
.btn-block { | |||
display: block; | |||
width: 100%; | |||
box-sizing: content-box; | |||
text-align: center; | |||
} | |||
.btn-disabled { | |||
opacity: .6; | |||
cursor: not-allowed; | |||
box-shadow: none; | |||
background-image: none !important; | |||
border: none; | |||
} | |||
.btn-disabled:hover { | |||
background-image: none !important; | |||
color: #ffffff; | |||
} | |||
.ipt:focus { | |||
border-color: #428bca; | |||
} | |||
.ipt-radius { | |||
border-radius: .25em; | |||
} | |||
.ipt-small { | |||
font-size: 9.6px; | |||
} | |||
.ipt-large { | |||
font-size: 14.4px; | |||
} | |||
.ipt-disabled, | |||
input[disabled] { | |||
background-color: #f2f2f2 !important; | |||
color: #888; | |||
cursor: not-allowed; | |||
} | |||
.ipt-disabled:focus, | |||
input[disabled]:focus { | |||
background-color: #f2f2f2 !important; | |||
} | |||
.ipt-readonly:focus, | |||
input[readonly]:focus { | |||
background-color: #f2f2f2 !important; | |||
} | |||
.ipt-error { | |||
border-color: #b63b2c !important; | |||
background-color: #fff0f0 !important; | |||
} | |||
.form label { | |||
margin-right: 1em; | |||
} | |||
.form .help { | |||
color: #999999; | |||
padding-top: .6em; | |||
display: inline-block; | |||
} | |||
.form-stack label { | |||
display: block; | |||
} | |||
.form-stack .field { | |||
margin-bottom: 1em; | |||
} | |||
.form-align label, | |||
.form-align .form-label { | |||
display: inline-block; | |||
width: 120px; | |||
text-align: right; | |||
margin-right: 1em; | |||
} | |||
.form-align .field { | |||
margin-bottom: 1em; | |||
} | |||
label.req:after { | |||
content: "*"; | |||
color: #d9453d; | |||
} | |||
ul.menu > li { | |||
list-style: none; | |||
} | |||
ul.menu > li > a { | |||
padding: .8em 1.2em; | |||
} | |||
ul.menu > li > a:hover { | |||
background-color: #eaeaea; | |||
color: #444444; | |||
} | |||
ul.menu > li.current > a, | |||
ul.menu > li.hover > a { | |||
color: #444444; | |||
} | |||
ul.menu > li.head { | |||
font-weight: bold; | |||
padding: .8em 1.2em; | |||
} | |||
ul.menu > li.down:hover > ul.menu-down { | |||
display: block; | |||
} | |||
ul.menu > li.border-bottom { | |||
border-bottom: 1px solid #bbbbbb; | |||
height: 0; | |||
margin: .5em 0; | |||
} | |||
ul.menu-line > li, | |||
ul.menu-line > li > a { | |||
display: inline-block; | |||
} | |||
ul.menu-line > li.down { | |||
position: relative; | |||
} | |||
ul.menu-line > li.down > a:after { | |||
content: "\25BE"; | |||
margin-left: .4em; | |||
} | |||
ul.menu-line > li.down > ul.menu-down { | |||
top: 2.1em; | |||
width: 150%; | |||
} | |||
ul.menu-line > li.hover { | |||
position: relative; | |||
} | |||
ul.menu-line > li.hover > a:after { | |||
position: absolute; | |||
content: "\25B4"; | |||
left: 50%; | |||
bottom: -1.1em; | |||
margin-left: -4px; | |||
} | |||
ul.menu-vertical > li > a, | |||
ul.menu-down > li > a, | |||
ul.menu-vertical > li.head, | |||
ul.menu-down > li.head { | |||
display: block; | |||
padding: .4em 1.2em; | |||
} | |||
ul.menu-vertical > li.down, | |||
ul.menu-down > li.down { | |||
position: relative; | |||
} | |||
ul.menu-vertical > li.down > a:after, | |||
ul.menu-down > li.down > a:after { | |||
content: "\25B8"; | |||
position: absolute; | |||
right: .6em; | |||
} | |||
ul.menu-vertical > li.hover, | |||
ul.menu-down > li.hover { | |||
position: relative; | |||
} | |||
ul.menu-vertical > li.hover > a:after, | |||
ul.menu-down > li.hover > a:after { | |||
content: "\25B8"; | |||
position: absolute; | |||
left: .5em; | |||
} | |||
ul.menu-border, | |||
ul.menu-down { | |||
border: 1px solid #bbbbbb; | |||
} | |||
ul.menu-border > li.head, | |||
ul.menu-down > li.head { | |||
border-bottom: 1px solid #bbbbbb; | |||
} | |||
ul.menu-down { | |||
position: absolute; | |||
display: none; | |||
z-index: 99; | |||
box-shadow: 0 0 2px #666666; | |||
background-color: #ffffff; | |||
} | |||
ul.menu-radius { | |||
border-radius: .3em; | |||
} | |||
ul.menu-radius > li:first-child { | |||
border-top-left-radius: .3em; | |||
border-top-right-radius: .3em; | |||
} | |||
ul.menu-radius > li:first-child > a { | |||
border-top-left-radius: .2em; | |||
border-top-right-radius: .2em; | |||
} | |||
ul.menu-radius > li:last-child { | |||
border-bottom-left-radius: .3em; | |||
border-bottom-right-radius: .3em; | |||
} | |||
ul.menu-radius > li:last-child > a { | |||
border-bottom-left-radius: .2em; | |||
border-bottom-right-radius: .2em; | |||
} | |||
.drop { | |||
position: relative; | |||
} | |||
.drop:hover > .drop-down { | |||
position: absolute; | |||
top: 0; | |||
left: 0; | |||
width: 200%; | |||
display: block; | |||
} | |||
.drop > .drop-down { | |||
display: none; | |||
border: 1px solid #bbbbbb; | |||
box-shadow: 0 0 3px #666666; | |||
background-color: #ffffff; | |||
} | |||
.drop-bottom:after { | |||
content: "\25BE"; | |||
margin-left: .4em; | |||
} | |||
.drop-top:after { | |||
content: "\25B4"; | |||
margin-left: .4em; | |||
} | |||
.panel { | |||
border: 1px solid #cccccc; | |||
} | |||
.panel .panel-header { | |||
font-size: 16px; | |||
padding: .6em 1.2em; | |||
background-color: #eeeeee; | |||
border-bottom: 1px solid #cccccc; | |||
} | |||
.panel .panel-body .panel-desc { | |||
margin-bottom: 20px; | |||
} | |||
.panel .panel-content { | |||
padding: 1em 1.2em; | |||
} | |||
.panel .panel-footer { | |||
padding: .6em 1.2em; | |||
background-color: #eeeeee; | |||
border-top: 1px solid #cccccc; | |||
} | |||
.panel.panel-radius { | |||
border-radius: .3em; | |||
} | |||
.panel.panel-radius .panel-header { | |||
border-top-left-radius: .3em; | |||
border-top-right-radius: .3em; | |||
} | |||
.panel.panel-radius .panel-footer { | |||
border-bottom-left-radius: .3em; | |||
border-bottom-right-radius: .3em; | |||
} | |||
.panel.panel-warning { | |||
border-color: #F0C36D; | |||
} | |||
.panel.panel-warning > .panel-header { | |||
background-color: #F9EDBE; | |||
border-color: #F0C36D; | |||
} | |||
.label { | |||
padding: 2px 6px; | |||
color: #ffffff; | |||
} | |||
.label-red { | |||
background-color: #d9453d; | |||
} | |||
.label-blue { | |||
background-color: #428bca; | |||
} | |||
.label-gray { | |||
background-color: #999999; | |||
} | |||
.label-green { | |||
background-color: #65ad4e; | |||
} | |||
.label-orange { | |||
background-color: #df7514; | |||
} | |||
.label-black { | |||
background-color: #444444; | |||
} | |||
.label-radius { | |||
border-radius: .2em; | |||
} | |||
.label-link { | |||
color: #ffffff; | |||
} | |||
.label-link:hover { | |||
color: #ffffff; | |||
} | |||
.breads .bread:after { | |||
content: "/"; | |||
font-weight: bold; | |||
margin: 0 4px 0 7px; | |||
color: #444444; | |||
} | |||
.breads .bread:last-child:after { | |||
content: ""; | |||
margin: 0; | |||
} | |||
.alert { | |||
padding: .6em 1.5em; | |||
margin-bottom: 10px; | |||
} | |||
.alert i { | |||
margin-right: 8px; | |||
} | |||
.alert-radius { | |||
border-radius: .25em; | |||
} | |||
.alert-red { | |||
color: #d9453d; | |||
border: 1px solid #be2d25; | |||
background-color: #fae9e8; | |||
} | |||
.alert-blue { | |||
color: #428bca; | |||
border: 1px solid #3071a9; | |||
background-color: #f5f9fc; | |||
} | |||
.alert-green { | |||
color: #65ad4e; | |||
border: 1px solid #508a3e; | |||
background-color: #edf6eb; | |||
} | |||
.alert-gray { | |||
color: #999999; | |||
border: 1px solid #808080; | |||
background-color: #f2f2f2; | |||
} | |||
.alert-orange { | |||
color: #df7514; | |||
border: 1px solid #b05c10; | |||
background-color: #fcecdd; | |||
} | |||
table th, | |||
table td { | |||
padding: .3em .6em; | |||
line-height: 30px; | |||
} | |||
.table-border { | |||
border: 1px solid #d6d6d6; | |||
} | |||
.table-border tr { | |||
border-top: 1px solid #eaeaea; | |||
} | |||
.table-border tr th, | |||
.table-border tr td { | |||
border-top: 1px solid #eaeaea; | |||
} | |||
.table-border tr:first-child { | |||
border-top: none; | |||
} | |||
.table-border thead { | |||
border-bottom: 1px solid #d6d6d6; | |||
} | |||
.table-block { | |||
width: 100%; | |||
box-sizing: border-box; | |||
} | |||
.table-radius { | |||
border-collapse: separate !important; | |||
border-radius: .3em; | |||
} | |||
.table-radius thead:first-child { | |||
border-top-left-radius: .3em; | |||
border-top-right-radius: .3em; | |||
} | |||
.table-radius thead:first-child tr:first-child { | |||
border-top-left-radius: .3em; | |||
} | |||
.table-radius thead:first-child tr:first-child > th:first-child { | |||
border-top-left-radius: .3em; | |||
} | |||
.table-radius thead:first-child tr:first-child > th:last-child { | |||
border-top-right-radius: .3em; | |||
} | |||
.table-radius tbody { | |||
border-bottom-left-radius: .3em; | |||
border-bottom-right-radius: .3em; | |||
} | |||
.table-radius tbody tr:last-child { | |||
border-bottom-left-radius: .3em; | |||
border-bottom-right-radius: .3em; | |||
} | |||
.table-radius tbody tr:last-child > td:first-child { | |||
border-bottom-left-radius: .3em; | |||
} | |||
.table-radius tbody tr:last-child > td:last-child { | |||
border-bottom-right-radius: .3em; | |||
} |
@@ -0,0 +1,504 @@ | |||
<?xml version="1.0" standalone="no"?> | |||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > | |||
<svg xmlns="http://www.w3.org/2000/svg"> | |||
<metadata></metadata> | |||
<defs> | |||
<font id="fontawesomeregular" horiz-adv-x="1536" > | |||
<font-face units-per-em="1792" ascent="1536" descent="-256" /> | |||
<missing-glyph horiz-adv-x="448" /> | |||
<glyph unicode=" " horiz-adv-x="448" /> | |||
<glyph unicode="	" horiz-adv-x="448" /> | |||
<glyph unicode=" " horiz-adv-x="448" /> | |||
<glyph unicode="¨" horiz-adv-x="1792" /> | |||
<glyph unicode="©" horiz-adv-x="1792" /> | |||
<glyph unicode="®" horiz-adv-x="1792" /> | |||
<glyph unicode="´" horiz-adv-x="1792" /> | |||
<glyph unicode="Æ" horiz-adv-x="1792" /> | |||
<glyph unicode="Ø" horiz-adv-x="1792" /> | |||
<glyph unicode=" " horiz-adv-x="768" /> | |||
<glyph unicode=" " horiz-adv-x="1537" /> | |||
<glyph unicode=" " horiz-adv-x="768" /> | |||
<glyph unicode=" " horiz-adv-x="1537" /> | |||
<glyph unicode=" " horiz-adv-x="512" /> | |||
<glyph unicode=" " horiz-adv-x="384" /> | |||
<glyph unicode=" " horiz-adv-x="256" /> | |||
<glyph unicode=" " horiz-adv-x="256" /> | |||
<glyph unicode=" " horiz-adv-x="192" /> | |||
<glyph unicode=" " horiz-adv-x="307" /> | |||
<glyph unicode=" " horiz-adv-x="85" /> | |||
<glyph unicode=" " horiz-adv-x="307" /> | |||
<glyph unicode=" " horiz-adv-x="384" /> | |||
<glyph unicode="™" horiz-adv-x="1792" /> | |||
<glyph unicode="∞" horiz-adv-x="1792" /> | |||
<glyph unicode="≠" horiz-adv-x="1792" /> | |||
<glyph unicode="◼" horiz-adv-x="500" d="M0 0z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M93 1350q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78z" /> | |||
<glyph unicode="" d="M0 -64q0 50 34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5 q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 704q0 143 55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5z M256 704q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 32v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5 t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768zM128 1120q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317 q54 43 100.5 115.5t46.5 131.5v11v13.5t-0.5 13t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 940q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138z " /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 889q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 889q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354 q-25 27 -25 48zM221 829l306 -297l-73 -421l378 199l377 -199l-72 421l306 297l-422 62l-189 382l-189 -382z" /> | |||
<glyph unicode="" horiz-adv-x="1408" d="M0 131q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5q0 -120 -73 -189.5t-194 -69.5 h-874q-121 0 -194 69.5t-73 189.5zM320 1024q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5z" /> | |||
<glyph unicode="" horiz-adv-x="1920" d="M0 -96v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113zM128 64v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45zM128 320q0 -26 19 -45t45 -19h128 q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128zM128 704q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128zM128 1088q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19 h-128q-26 0 -45 -19t-19 -45v-128zM512 -64q0 -26 19 -45t45 -19h768q26 0 45 19t19 45v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512zM512 704q0 -26 19 -45t45 -19h768q26 0 45 19t19 45v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512zM1536 64 v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45zM1536 320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128zM1536 704q0 -26 19 -45t45 -19h128q26 0 45 19t19 45 v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128zM1536 1088q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 128v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90zM0 896v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90zM896 128v384q0 52 38 90t90 38h512q52 0 90 -38 t38 -90v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90zM896 896v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 96v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM0 608v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM0 1120v192q0 40 28 68t68 28h320q40 0 68 -28 t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM640 96v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM640 608v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68zM640 1120v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM1280 96v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM1280 608v192 q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM1280 1120v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 96v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM0 608v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM0 1120v192q0 40 28 68t68 28h320q40 0 68 -28 t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM640 96v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68zM640 608v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68zM640 1120v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M121 608q0 40 28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68t-28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68z" /> | |||
<glyph unicode="" horiz-adv-x="1408" d="M110 214q0 40 28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68t-28 -68l-294 -294l294 -294q28 -28 28 -68t-28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294 q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 704q0 143 55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90t-37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5z M256 704q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5zM384 672v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224q13 0 22.5 -9.5t9.5 -22.5v-64 q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 704q0 143 55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90t-37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5z M256 704q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5zM384 672v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5z" /> | |||
<glyph unicode="" d="M0 640q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181 q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298zM640 768v640q0 52 38 90t90 38t90 -38t38 -90v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 -96v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM384 -96v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM768 -96v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-576 q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM1152 -96v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM1536 -96v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23z" /> | |||
<glyph unicode="" d="M0 531v222q0 12 8 23t19 13l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10 q129 -119 165 -170q7 -8 7 -22q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108 q-44 -23 -91 -38q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5z M512 640q0 -106 75 -181t181 -75t181 75t75 181t-75 181t-181 75t-181 -75t-75 -181z" /> | |||
<glyph unicode="" horiz-adv-x="1408" d="M0 1056v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23zM256 76q0 -22 7 -40.5 t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5v948h-896v-948zM384 224v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM640 224v576q0 14 9 23t23 9h64 q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23zM896 224v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M26 636.5q1 13.5 11 21.5l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5zM256 64 v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45z" /> | |||
<glyph unicode="" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22 v-376z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM512 544v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23z" /> | |||
<glyph unicode="" horiz-adv-x="1920" d="M50 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256 q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73zM809 540q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 96v320q0 40 28 68t68 28h465l135 -136q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68zM325 985q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39q17 -41 -14 -70 l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70zM1152 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM1408 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM418 620q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM416 672q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23z" /> | |||
<glyph unicode="" d="M0 64v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552q25 -61 25 -123v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM197 576h316l95 -192h320l95 192h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8 t-2.5 -8z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM512 320v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55t-32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56z" /> | |||
<glyph unicode="" d="M0 640q0 156 61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5 t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q14 0 25 -9l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298z" /> | |||
<glyph unicode="" d="M0 0v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129 q-19 -19 -45 -19t-45 19t-19 45zM18 800v7q65 268 270 434.5t480 166.5q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179 q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 160v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113zM128 160q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832z M256 288v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM256 544v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5z M256 800v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM512 288v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5z M512 544v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5zM512 800v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5z " /> | |||
<glyph unicode="" horiz-adv-x="1152" d="M0 96v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68zM320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M64 1280q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110zM320 320v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19 q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 650q0 151 67 291t179 242.5t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32 q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32 q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314z" /> | |||
<glyph unicode="" horiz-adv-x="768" d="M0 448v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45z" /> | |||
<glyph unicode="" horiz-adv-x="1152" d="M0 448v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45zM908 464q0 21 12 35.5t29 25t34 23t29 35.5t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5 q15 0 25 -5q70 -27 112.5 -93t42.5 -142t-42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 448v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45zM908 464q0 21 12 35.5t29 25t34 23t29 35.5t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5 q15 0 25 -5q70 -27 112.5 -93t42.5 -142t-42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5zM1008 228q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5 q140 -59 225 -188.5t85 -282.5t-85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45zM1109 -7q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19 q13 0 26 -5q211 -91 338 -283.5t127 -422.5t-127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45z" /> | |||
<glyph unicode="" horiz-adv-x="1408" d="M0 0v640h640v-640h-640zM0 768v640h640v-640h-640zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM256 256v128h128v-128h-128zM256 1024v128h128v-128h-128zM768 0v640h384v-128h128v128h128v-384h-384v128h-128v-384h-128zM768 768v640h640v-640h-640z M896 896h384v384h-384v-384zM1024 0v128h128v-128h-128zM1024 1024v128h128v-128h-128zM1280 0v128h128v-128h-128z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 0v1408h63v-1408h-63zM94 1v1407h32v-1407h-32zM189 1v1407h31v-1407h-31zM346 1v1407h31v-1407h-31zM472 1v1407h62v-1407h-62zM629 1v1407h31v-1407h-31zM692 1v1407h31v-1407h-31zM755 1v1407h31v-1407h-31zM880 1v1407h63v-1407h-63zM1037 1v1407h63v-1407h-63z M1163 1v1407h63v-1407h-63zM1289 1v1407h63v-1407h-63zM1383 1v1407h63v-1407h-63zM1541 1v1407h94v-1407h-94zM1666 1v1407h32v-1407h-32zM1729 0v1408h63v-1408h-63z" /> | |||
<glyph unicode="" d="M0 864v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117zM192 1088q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5z" /> | |||
<glyph unicode="" horiz-adv-x="1920" d="M0 864v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117zM192 1088q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5zM704 1408h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M10 184q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23 t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57 q38 -15 59 -43q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5zM575 1056 q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" /> | |||
<glyph unicode="" horiz-adv-x="1280" d="M0 7v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 160v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v160h-224 q-13 0 -22.5 9.5t-9.5 22.5zM384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1408 576q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" /> | |||
<glyph unicode="" horiz-adv-x="1920" d="M0 128v896q0 106 75 181t181 75h224l51 136q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181zM512 576q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5 t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5zM672 576q0 119 84.5 203.5t203.5 84.5t203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 -128l2 79q23 7 56 12.5t57 10.5t49.5 14.5t44.5 29t31 50.5l237 616l280 724h75h53q8 -14 11 -21l205 -480q33 -78 106 -257.5t114 -274.5q15 -34 58 -144.5t72 -168.5q20 -45 35 -57q19 -15 88 -29.5t84 -20.5q6 -38 6 -57q0 -4 -0.5 -13t-0.5 -13q-63 0 -190 8 t-191 8q-76 0 -215 -7t-178 -8q0 43 4 78l131 28q1 0 12.5 2.5t15.5 3.5t14.5 4.5t15 6.5t11 8t9 11t2.5 14q0 16 -31 96.5t-72 177.5t-42 100l-450 2q-26 -58 -76.5 -195.5t-50.5 -162.5q0 -22 14 -37.5t43.5 -24.5t48.5 -13.5t57 -8.5t41 -4q1 -19 1 -58q0 -9 -2 -27 q-58 0 -174.5 10t-174.5 10q-8 0 -26.5 -4t-21.5 -4q-80 -14 -188 -14zM555 527q33 0 136.5 -2t160.5 -2q19 0 57 2q-87 253 -184 452z" /> | |||
<glyph unicode="" horiz-adv-x="1408" d="M0 -128l2 94q15 4 85 16t106 27q7 12 12.5 27t8.5 33.5t5.5 32.5t3 37.5t0.5 34v35.5v30q0 982 -22 1025q-4 8 -22 14.5t-44.5 11t-49.5 7t-48.5 4.5t-30.5 3l-4 83q98 2 340 11.5t373 9.5q23 0 68.5 -0.5t67.5 -0.5q70 0 136.5 -13t128.5 -42t108 -71t74 -104.5 t28 -137.5q0 -52 -16.5 -95.5t-39 -72t-64.5 -57.5t-73 -45t-84 -40q154 -35 256.5 -134t102.5 -248q0 -100 -35 -179.5t-93.5 -130.5t-138 -85.5t-163.5 -48.5t-176 -14q-44 0 -132 3t-132 3q-106 0 -307 -11t-231 -12zM533 1292q0 -50 4 -151t4 -152q0 -27 -0.5 -80 t-0.5 -79q0 -46 1 -69q42 -7 109 -7q82 0 143 13t110 44.5t74.5 89.5t25.5 142q0 70 -29 122.5t-79 82t-108 43.5t-124 14q-50 0 -130 -13zM538.5 165q0.5 -37 4.5 -83.5t12 -66.5q74 -32 140 -32q376 0 376 335q0 114 -41 180q-27 44 -61.5 74t-67.5 46.5t-80.5 25 t-84 10.5t-94.5 2q-73 0 -101 -10q0 -53 -0.5 -159t-0.5 -158q0 -8 -1 -67.5t-0.5 -96.5z" /> | |||
<glyph unicode="" horiz-adv-x="1024" d="M0 -126l17 85q6 2 81.5 21.5t111.5 37.5q28 35 41 101q1 7 62 289t114 543.5t52 296.5v25q-24 13 -54.5 18.5t-69.5 8t-58 5.5l19 103q33 -2 120 -6.5t149.5 -7t120.5 -2.5q48 0 98.5 2.5t121 7t98.5 6.5q-5 -39 -19 -89q-30 -10 -101.5 -28.5t-108.5 -33.5 q-8 -19 -14 -42.5t-9 -40t-7.5 -45.5t-6.5 -42q-27 -148 -87.5 -419.5t-77.5 -355.5q-2 -9 -13 -58t-20 -90t-16 -83.5t-6 -57.5l1 -18q17 -4 185 -31q-3 -44 -16 -99q-11 0 -32.5 -1.5t-32.5 -1.5q-29 0 -87 10t-86 10q-138 2 -206 2q-51 0 -143 -9t-121 -11z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 1023v383l81 1l54 -27q12 -5 211 -5q44 0 132 2t132 2q36 0 107.5 -0.5t107.5 -0.5h293q6 0 21 -0.5t20.5 0t16 3t17.5 9t15 17.5l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 48t-14.5 73.5t-7.5 35.5 q-6 8 -12 12.5t-15.5 6t-13 2.5t-18 0.5t-16.5 -0.5q-17 0 -66.5 0.5t-74.5 0.5t-64 -2t-71 -6q-9 -81 -8 -136q0 -94 2 -388t2 -455q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9 t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27q19 42 19 383q0 101 -3 303t-3 303v117q0 2 0.5 15.5t0.5 25t-1 25.5t-3 24t-5 14q-11 12 -162 12q-33 0 -93 -12t-80 -26q-19 -13 -34 -72.5t-31.5 -111t-42.5 -53.5q-42 26 -56 44zM1414 109.5q9 18.5 42 18.5h80v1024 h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80q33 0 42 -18.5t-11 -44.5l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5z" /> | |||
<glyph unicode="" d="M0 1023v383l81 1l54 -27q12 -5 211 -5q44 0 132 2t132 2q70 0 246.5 1t304.5 0.5t247 -4.5q33 -1 56 31l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 47.5t-15 73.5t-7 36q-10 13 -27 19q-5 2 -66 2q-30 0 -93 1 t-103 1t-94 -2t-96 -7q-9 -81 -8 -136l1 -152v52q0 -55 1 -154t1.5 -180t0.5 -153q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29 t78 27q7 16 11.5 74t6 145.5t1.5 155t-0.5 153.5t-0.5 89q0 7 -2.5 21.5t-2.5 22.5q0 7 0.5 44t1 73t0 76.5t-3 67.5t-6.5 32q-11 12 -162 12q-41 0 -163 -13.5t-138 -24.5q-19 -12 -34 -71.5t-31.5 -111.5t-42.5 -54q-42 26 -56 44zM5 -64q0 28 26 49q4 3 36 30t59.5 49 t57.5 41.5t42 19.5q13 0 20.5 -10.5t10 -28.5t2.5 -33.5t-1.5 -33t-1.5 -19.5h1024q0 2 -1.5 19.5t-1.5 33t2.5 33.5t10 28.5t20.5 10.5q12 0 42 -19.5t57.5 -41.5t59.5 -49t36 -30q26 -21 26 -49t-26 -49q-4 -3 -36 -30t-59.5 -49t-57.5 -41.5t-42 -19.5q-13 0 -20.5 10.5 t-10 28.5t-2.5 33.5t1.5 33t1.5 19.5h-1024q0 -2 1.5 -19.5t1.5 -33t-2.5 -33.5t-10 -28.5t-20.5 -10.5q-12 0 -42 19.5t-57.5 41.5t-59.5 49t-36 30q-26 21 -26 49z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 64v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 448v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45zM0 832v128q0 26 19 45t45 19h1536 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1536q-26 0 -45 19t-19 45zM0 1216v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 64v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM128 832v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM384 448v128q0 26 19 45t45 19h896 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45zM512 1216v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 64v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM128 832v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1536q-26 0 -45 19t-19 45zM384 448v128q0 26 19 45t45 19h1280 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45zM512 1216v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 64v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 448v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 832v128q0 26 19 45t45 19h1664 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 1216v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 32v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5zM0 416v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5 t-9.5 22.5zM0 800v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5zM0 1184v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192 q-13 0 -22.5 9.5t-9.5 22.5zM384 32v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5zM384 416v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5 t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5zM384 800v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5zM384 1184v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-192 q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 32v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5zM0 1184v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5 t-9.5 22.5zM32 704q0 14 9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23zM640 416v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088 q-13 0 -22.5 9.5t-9.5 22.5zM640 800v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 32v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5zM0 416v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23t-9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5z M0 1184v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5zM640 416v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5 t-9.5 22.5zM640 800v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 288v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5q39 -17 39 -59v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5 t-84.5 203.5z" /> | |||
<glyph unicode="" horiz-adv-x="1920" d="M0 32v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216z M256 128v192l320 320l160 -160l512 512l416 -416v-448h-1408zM256 960q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136z" /> | |||
<glyph unicode="" d="M0 -128v416l832 832l416 -416l-832 -832h-416zM128 128h128v-128h107l91 91l-235 235l-91 -91v-107zM298 384q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17zM896 1184l166 165q36 38 90 38q53 0 91 -38l235 -234 q37 -39 37 -91q0 -53 -37 -90l-166 -166z" /> | |||
<glyph unicode="" horiz-adv-x="1024" d="M0 896q0 212 150 362t362 150t362 -150t150 -362q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179zM256 896q0 -106 75 -181t181 -75t181 75t75 181t-75 181t-181 75t-181 -75t-75 -181z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73v1088q-148 0 -273 -73t-198 -198t-73 -273z" /> | |||
<glyph unicode="" horiz-adv-x="1024" d="M0 512q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275q0 -212 -150 -362t-362 -150t-362 150t-150 362zM256 384q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5 t37.5 90.5q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29v-190 q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM640 256v288l672 672l288 -288l-672 -672h-288zM736 448h96v-96h56l116 116l-152 152l-116 -116v-56zM944 688q16 -16 33 1l350 350q17 17 1 33t-33 -1l-350 -350q-17 -17 -1 -33zM1376 1280l92 92 q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68l-92 -92z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h255q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29v-259 q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM256 704q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45l-384 -384 q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5t-38.5 114t-17.5 122z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3 q20 -8 20 -29v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM257 768q0 33 24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110q24 -24 24 -57t-24 -57l-814 -814q-24 -24 -57 -24t-57 24l-430 430 q-24 24 -24 57z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 640q0 26 19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45t-19 -45l-256 -256 q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45z" /> | |||
<glyph unicode="" horiz-adv-x="1024" d="M0 -64v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 -64v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710q19 19 32 13t13 -32v-710q4 11 13 19l710 710q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45 t-45 -19h-128q-26 0 -45 19t-19 45z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M122 640q0 26 19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19l710 710q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45z" /> | |||
<glyph unicode="" horiz-adv-x="1408" d="M0 -96v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31l-1328 -738q-23 -13 -39.5 -3t-16.5 36z" /> | |||
<glyph unicode="" d="M0 -64v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45zM896 -64v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45z" /> | |||
<glyph unicode="" d="M0 -64v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 -96v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19l-710 -710q-19 -19 -32 -13t-13 32z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 -96v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710q-19 -19 -32 -13t-13 32v710 q-5 -10 -13 -19l-710 -710q-19 -19 -32 -13t-13 32z" /> | |||
<glyph unicode="" horiz-adv-x="1024" d="M0 -96v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710q-19 -19 -32 -13t-13 32z" /> | |||
<glyph unicode="" horiz-adv-x="1538" d="M1 64v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM1 525q-6 13 13 32l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13z" /> | |||
<glyph unicode="" horiz-adv-x="1280" d="M154 704q0 26 19 45l742 742q19 19 45 19t45 -19l166 -166q19 -19 19 -45t-19 -45l-531 -531l531 -531q19 -19 19 -45t-19 -45l-166 -166q-19 -19 -45 -19t-45 19l-742 742q-19 19 -19 45z" /> | |||
<glyph unicode="" horiz-adv-x="1280" d="M90 128q0 26 19 45l531 531l-531 531q-19 19 -19 45t19 45l166 166q19 19 45 19t45 -19l742 -742q19 -19 19 -45t-19 -45l-742 -742q-19 -19 -45 -19t-45 19l-166 166q-19 19 -19 45z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM320 576q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19 t19 45v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM320 576q0 -26 19 -45t45 -19h768q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19 t-19 -45v-128z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM387 414q0 -27 19 -46l90 -90q19 -19 46 -19q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19 l90 90q19 19 19 46q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM252 621q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45q0 28 -18 46l-91 90 q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM417 939q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26 t37.5 -59q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213zM640 160q0 -14 9 -23t23 -9 h192q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM512 160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320 q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160zM640 1056q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160z" /> | |||
<glyph unicode="" d="M0 576v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143 q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45zM339 512q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5h-109q-26 0 -45 19 t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM429 480q0 13 10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23l-137 -137l137 -137q10 -10 10 -23t-10 -23l-146 -146q-10 -10 -23 -10t-23 10l-137 137 l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM346 640q0 26 19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45z" /> | |||
<glyph unicode="" d="M0 643q0 157 61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5t-61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61t-245 164t-163.5 246t-61 300zM224 643q0 -162 89 -299l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199 t-73 -274zM471 185q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5q0 161 -87 295z" /> | |||
<glyph unicode="" d="M64 576q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5t32.5 -90.5v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90 z" /> | |||
<glyph unicode="" d="M0 512v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M53 565q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651q37 -39 37 -91q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75 q-38 38 -38 90z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M53 704q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 416q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45t-19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123 q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22t-13.5 30t-10.5 24q-127 285 -127 451z" /> | |||
<glyph unicode="" d="M0 -64v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23t-10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45zM781 800q0 13 10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448 q26 0 45 -19t19 -45v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23z" /> | |||
<glyph unicode="" d="M13 32q0 13 10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23zM768 704v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10 t23 -10l114 -114q10 -10 10 -23t-10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45z" /> | |||
<glyph unicode="" horiz-adv-x="1408" d="M0 608v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68z" /> | |||
<glyph unicode="" horiz-adv-x="1408" d="M0 608v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M122.5 408.5q13.5 51.5 59.5 77.5l266 154l-266 154q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5 l-266 -154l266 -154q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM624 1126l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5l18 621q0 12 -10 18 q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18zM640 161q0 -13 10 -23t23 -10h192q13 0 22 9.5t9 23.5v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190z" /> | |||
<glyph unicode="" d="M0 544v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23v-320q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68 t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23zM376 1120q0 -40 28 -68t68 -28h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68zM608 180q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5v56v468v192h-320v-192v-468v-56zM870 1024h194q40 0 68 28 t28 68t-28 68t-68 28q-43 0 -69 -31z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 121q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96 q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5zM384 448q0 -26 19 -45t45 -19q24 0 45 19 q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45t-19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45z" /> | |||
<glyph unicode="" horiz-adv-x="1408" d="M0 -160q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64zM256 640q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100 t113.5 -122.5t72.5 -150.5t27.5 -184q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 576q0 34 20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69t-20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69zM128 576q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5q-152 236 -381 353 q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353zM592 704q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34t-14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 576q0 38 20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5q16 -10 16 -27q0 -7 -1 -9q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87 q-143 65 -263.5 173t-208.5 245q-20 31 -20 69zM128 576q167 -258 427 -375l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353zM592 704q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34t-14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5zM896 0l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69t-20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95zM1056 286l280 502q8 -45 8 -84q0 -139 -79 -253.5t-209 -164.5z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M16 61l768 1408q17 31 47 49t65 18t65 -18t47 -49l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126zM752 992l17 -457q0 -10 10 -16.5t24 -6.5h185q14 0 23.5 6.5t10.5 16.5l18 459q0 12 -10 19q-13 11 -24 11h-220 q-11 0 -24 -11q-10 -7 -10 -21zM768 161q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190z" /> | |||
<glyph unicode="" horiz-adv-x="1408" d="M0 477q-1 13 9 25l96 97q9 9 23 9q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16 l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 -128v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90zM128 -128h288v288h-288v-288zM128 224 h288v320h-288v-320zM128 608h288v288h-288v-288zM384 1088q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288zM480 -128h320v288h-320v-288zM480 224h320v320h-320v-320zM480 608h320v288h-320 v-288zM864 -128h320v288h-320v-288zM864 224h320v320h-320v-320zM864 608h320v288h-320v-288zM1152 1088q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288zM1248 -128h288v288h-288v-288z M1248 224h288v320h-288v-320zM1248 608h288v288h-288v-288z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 160v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23t-9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192 h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23zM0 1056v192q0 14 9 23t23 9h224q250 0 410 -225q-60 -92 -137 -273q-22 45 -37 72.5 t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23zM743 353q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23t-9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192 q-32 0 -85 -0.5t-81 -1t-73 1t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 640q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5t-120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5 t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281z" /> | |||
<glyph unicode="" d="M0 576v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5 t-98.5 362zM0 960v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45zM1024 960v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M90 250.5q0 26.5 19 45.5l742 741q19 19 45 19t45 -19l742 -741q19 -19 19 -45.5t-19 -45.5l-166 -165q-19 -19 -45 -19t-45 19l-531 531l-531 -531q-19 -19 -45 -19t-45 19l-166 165q-19 19 -19 45.5z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M90 773.5q0 26.5 19 45.5l166 165q19 19 45 19t45 -19l531 -531l531 531q19 19 45 19t45 -19l166 -165q19 -19 19 -45.5t-19 -45.5l-742 -741q-19 -19 -45 -19t-45 19l-742 741q-19 19 -19 45.5z" /> | |||
<glyph unicode="" horiz-adv-x="1920" d="M0 704q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45z M640 1120q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20z " /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 1216q0 26 19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024 q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45zM384 0q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5zM1280 0q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5 t-90.5 -37.5t-90.5 37.5t-37.5 90.5z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 224v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158z" /> | |||
<glyph unicode="" horiz-adv-x="1920" d="M0 224v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5t-0.5 12.5zM73 56q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43 q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43z" /> | |||
<glyph unicode="" horiz-adv-x="768" d="M64 64q0 26 19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 640q0 26 19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45z" /> | |||
<glyph unicode="" horiz-adv-x="1920" d="M0 32v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216z M256 128v384h256v-384h-256zM640 128v896h256v-896h-256zM1024 128v640h256v-640h-256zM1408 128v1024h256v-1024h-256z" /> | |||
<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 286q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109 q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4q21 -63 74.5 -104 t121.5 -42q-116 -90 -261 -90q-26 0 -50 3z" /> | |||
<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-192v608h203l30 224h-233v143q0 54 28 83t96 29l132 1v207q-96 9 -180 9q-136 0 -218 -80.5t-82 -225.5v-166h-224v-224h224v-608h-544 q-119 0 -203.5 84.5t-84.5 203.5z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 0v1280q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5zM128 0h1536v128h-1536v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM256 1216h384v128h-384v-128zM512 574 q0 -159 112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5zM640 574q0 106 75 181t181 75t181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181zM736 576q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9 t9 23t-9 23t-23 9q-66 0 -113 -47t-47 -113z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 752q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41q0 -17 -49 -66t-66 -49 q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5zM192 768q0 -80 56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56 t56 136t-56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136z" /> | |||
<glyph unicode="" horiz-adv-x="1920" d="M0 549v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8 q144 -133 144 -160q0 -9 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90 q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5zM384 640q0 -106 75 -181t181 -75 t181 75t75 181t-75 181t-181 75t-181 -75t-75 -181zM1152 58v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31 v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31zM1152 1082v140q0 16 149 31q13 29 30 52 q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71 q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31zM1408 128q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5q0 52 -38 90t-90 38t-90 -38t-38 -90zM1408 1152q0 -53 37.5 -90.5 t90.5 -37.5t90.5 37.5t37.5 90.5q0 52 -38 90t-90 38t-90 -38t-38 -90z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 768q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257t-94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25 t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224zM616 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5 t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132z" /> | |||
<glyph unicode="" d="M0 128v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5zM128 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM384 128h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5 t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85 t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640z" /> | |||
<glyph unicode="" d="M0 512v640q0 53 37.5 90.5t90.5 37.5h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -74 49 -163q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186 q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5zM128 1088q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM384 512h32q16 0 35.5 -9 t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 32 18 69t-17.5 73.5 t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640z" /> | |||
<glyph unicode="" horiz-adv-x="896" d="M0 889q0 37 56 46l502 73l225 455q19 41 49 41v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 940q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138z M128 940q0 -168 187 -355l581 -560l580 559q188 188 188 356q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5 t-21.5 -143z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 288v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5q0 -4 1 -20t0.5 -26.5t-3 -23.5 t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5zM384 448v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45t-19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45z" /> | |||
<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM223 1030q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86z M237 122h231v694h-231v-694zM595 122h231v388q0 38 7 56q15 35 45 59.5t74 24.5q116 0 116 -157v-371h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694z" /> | |||
<glyph unicode="" horiz-adv-x="1152" d="M0 320q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19 t-19 45zM416 672q0 -14 9 -23t23 -9t23 9t9 23v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832 q-119 0 -203.5 84.5t-84.5 203.5zM685 576q0 13 10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23z" /> | |||
<glyph unicode="" d="M0 448v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45t-19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45zM894.5 78.5q0.5 10.5 3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113 t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5q0 4 -1 20t-0.5 26.5z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 928v128q0 40 28 68t68 28h288v96q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91t97.5 -37q75 0 133.5 -45.5 t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143zM128 928q0 -78 94.5 -162t235.5 -113q-74 162 -74 371 h-256v-96zM1206 653q141 29 235.5 113t94.5 162v96h-256q0 -209 -74 -371z" /> | |||
<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-224q-16 0 -24.5 1t-19.5 5t-16 14.5t-5 27.5v239q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204 q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52 t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -103t0.5 -68q0 -22 -11 -33.5t-22 -13t-33 -1.5h-224q-119 0 -203.5 84.5t-84.5 203.5zM271 315q3 5 13 2 q10 -5 7 -12q-5 -7 -13 -2q-10 5 -7 12zM304 290q6 6 16 -3q9 -11 2 -16q-6 -7 -16 3q-9 11 -2 16zM335 233q-9 13 0 18q9 7 17 -6q9 -12 0 -19q-8 -6 -17 7zM370 206q8 9 20 -3q12 -11 4 -19q-8 -9 -20 3q-13 11 -4 19zM419 168q4 11 19 7q16 -5 13 -16q-4 -12 -19 -6 q-17 4 -13 15zM481 154q0 11 16 11q17 2 17 -11q0 -11 -16 -11q-17 -2 -17 11zM540 158q-2 12 14 15q16 2 18 -9q2 -10 -14 -14t-18 8z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 -32v320q0 40 28 68t68 28h427q21 -56 70.5 -92t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68zM325 936q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69q-17 -40 -59 -40 h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40zM1152 64q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM1408 64q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" /> | |||
<glyph unicode="" d="M0 433q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -10 1 -18.5t3 -17t4 -13.5t6.5 -16t6.5 -17q16 -40 25 -118.5t9 -136.5q0 -165 -70 -327.5 t-196 -288t-281 -180.5q-124 -44 -326 -44q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5zM128 434q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5 q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24 q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5z" /> | |||
<glyph unicode="" horiz-adv-x="1408" d="M0 1069q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235 t235 -174q2 -1 19 -11.5t24 -14t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -52.5 3.5 t-57.5 12.5t-47.5 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-128 79 -264.5 215.5t-215.5 264.5q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47.5t-12.5 57.5t-3.5 52.5z" /> | |||
<glyph unicode="" horiz-adv-x="1408" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM128 288q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47 t-47 -113v-832z" /> | |||
<glyph unicode="" horiz-adv-x="1280" d="M0 7v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62zM128 38l423 406l89 85l89 -85l423 -406 v1242h-1024v-1242z" /> | |||
<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 905q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5t320.5 -216.5 q6 -2 30 -11t33 -12.5t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170.5 126.5 t-126.5 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5t-3.5 16.5q0 13 20.5 33.5t45 38.5t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M44 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5 q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145z" /> | |||
<glyph unicode="" horiz-adv-x="1024" d="M95 631v296h255v218q0 186 104 288.5t277 102.5q147 0 228 -12v-264h-157q-86 0 -116 -36t-30 -108v-189h293l-39 -296h-254v-759h-306v759h-255z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -39.5 7t-12.5 30v211q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44 l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3 q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -89t0.5 -54q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 96v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68z" /> | |||
<glyph unicode="" horiz-adv-x="1920" d="M0 32v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v608h-1664v-608zM128 1024h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600 q-13 0 -22.5 -9.5t-9.5 -22.5v-224zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" /> | |||
<glyph unicode="" horiz-adv-x="1408" d="M0 192q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136zM0 697v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5t259 -181.5q114 -113 181.5 -259t80.5 -306q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5 t-391.5 184.5q-25 2 -41.5 20t-16.5 43zM0 1201v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294q187 -186 294 -425.5t120 -501.5q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102 q-25 1 -42.5 19.5t-17.5 43.5z" /> | |||
<glyph unicode="" d="M0 160v320q0 25 16 75l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113zM128 160q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5v320q0 13 -9.5 22.5t-22.5 9.5h-1216 q-13 0 -22.5 -9.5t-9.5 -22.5v-320zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM880 320q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM1136 320q0 33 23.5 56.5t56.5 23.5 t56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 672v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50 t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113zM768 633q377 -42 768 -341v954q-394 -302 -768 -343v-270z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 128q190 161 287 397.5t97 498.5q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38 t-38 90zM183 128h1298q-164 181 -246.5 411.5t-82.5 484.5q0 256 -320 256t-320 -256q0 -254 -82.5 -484.5t-246.5 -411.5zM656 0q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16z" /> | |||
<glyph unicode="" d="M2 435q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70l-53 -186l188 -48 q40 -10 52 -51q10 -42 -20 -70l-138 -135l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53 q-41 -12 -70 19q-31 29 -19 70l53 186l-188 48q-40 10 -52 51z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 128v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179q0 -105 -75.5 -181 t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5zM128 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM384 128h32q72 0 167 -32 t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139 q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106q-69 -57 -140 -57h-32v-640z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 769q0 103 76 179t180 76h374q-22 60 -22 128q0 122 81.5 189t206.5 67q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5v-640 q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181zM128 768q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119 q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-2 3 -3.5 4.5t-4 4.5t-4.5 5q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5 t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576q-50 0 -89 -38.5t-39 -89.5zM1536 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" /> | |||
<glyph unicode="" d="M0 640q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5t-90.5 -37.5h-640 q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5zM128 640q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140 v-32h640v32q0 72 32 167t64 193.5t32 179.5q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576q-20 0 -48.5 15t-55 33t-68 33t-84.5 15 q-67 0 -97.5 -44.5t-30.5 -115.5zM1152 -64q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" /> | |||
<glyph unicode="" d="M0 640q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317q0 -142 -77.5 -230t-217.5 -87 l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5zM128 640q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33t55 33t48.5 15v-576q0 -50 38.5 -89 t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112 q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5zM1152 1344q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM251 640q0 -27 18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502 q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM256 576q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18 l362 362l91 91q18 18 18 45t-18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM252 641q0 -27 18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19 t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45t-18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM252 639q0 -27 18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45t-18 45l-91 91 q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM226 979q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18 q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13 q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10t17 -20q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5 t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13 q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25 t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5 t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q7 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4 q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5q15 10 -7 16q-17 5 -43 -12q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8 q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 10.5t-9.5 10.5q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5 q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26 q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-5 7 -8 9q-12 4 -27 -5 q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14 q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5 q-16 0 -22 -1q-146 -80 -235 -222zM877 26q0 -6 2 -16q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7 t-10 1.5t-11.5 -7q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M21 0q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90zM256 64q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM768 960q0 185 131.5 316.5t316.5 131.5q58 0 121.5 -16.5 t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25q0 -39 -23 -106q-47 -134 -164.5 -217.5t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 64v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 576v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 1088v256q0 26 19 45t45 19h1664 q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM640 640h1024v128h-1024v-128zM1024 128h640v128h-640v-128zM1280 1152h384v128h-384v-128z" /> | |||
<glyph unicode="" horiz-adv-x="1408" d="M5 1241q17 39 59 39h1280q42 0 59 -39q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 160v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113zM0 736v384q0 66 47 113t113 47h352v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113v-384h-1792z M640 1280h512v128h-512v-128zM768 512v128h256v-128h-256z" /> | |||
<glyph unicode="" d="M0 -64v448q0 42 40 59q39 17 69 -14l144 -144l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45 v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19l-144 144l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19 t-19 45z" /> | |||
<glyph unicode="" horiz-adv-x="1920" d="M0 671q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5zM128 1280q0 106 75 181t181 75t181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181zM256 3q0 53 3.5 103.5 t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5 zM576 896q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5zM1280 1280q0 106 75 181t181 75t181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181zM1327 640q81 117 81 256q0 29 -5 66q66 -23 133 -23 q59 0 119 21.5t97.5 42.5t43.5 21q124 0 124 -353q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M16 1088q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l206 -207q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204t-85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88 q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204zM208 1088q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15t21.5 -21.5t18.5 -19q33 31 33 73 q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67zM911 383q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26l147 146q28 28 28 67q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5 q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73z" /> | |||
<glyph unicode="" horiz-adv-x="1920" d="M0 448q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M115.5 -64.5q-34.5 63.5 21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399l503 -793q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5zM476 384h712l-272 429l-20 31v37v399h-128v-399v-37 l-20 -31z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M1 157q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148q4 -48 -10 -97q4 -1 12 -5 l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56l-507 -398l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84 q-136 0 -222 78q-90 84 -79 207zM168 176q-25 -66 21 -108q39 -36 113 -36q100 0 192 59q81 51 106 117t-21 108q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117zM168 976q25 -66 106 -117q92 -59 192 -59q74 0 113 36q46 42 21 108t-106 117q-92 59 -192 59 q-74 0 -113 -36q-46 -42 -21 -108zM672 448l9 -8q2 -2 7 -6q4 -4 11 -12t11 -12l26 -26l160 96l96 -32l736 576l-128 64l-768 -431v-113zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 576q0 26 19 45t45 19t45 -19 t19 -45t-19 -45t-45 -19t-45 19t-19 45zM1018 391l582 -327l128 64l-520 408l-177 -138q-2 -3 -13 -7z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 224v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68zM128 256h512v256q0 40 20 88t48 76l316 316v416h-384 v-416q0 -40 -28 -68t-68 -28h-416v-640zM213 1024h299v299zM768 -128h896v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640zM853 640h299v299z" /> | |||
<glyph unicode="" horiz-adv-x="1408" d="M4 1023q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581 q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776 q-113 115 -113 271z" /> | |||
<glyph unicode="" d="M0 -32v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 0h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20 t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280zM384 0h768v384h-768v-384zM640 928q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v320q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320z" /> | |||
<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5z" /> | |||
<glyph unicode="" d="M0 64v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM0 576v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM0 1088v128q0 26 19 45t45 19h1408 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 128q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136zM0 640q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136zM0 1152q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136zM512 32v192 q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5zM512 544v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5z M512 1056v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M15 438q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105v-159h-362q-6 36 -6 54zM19 -190 l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66zM34 1400l136 127h106v-404h108v-99 h-335v99h107q0 41 0.5 122t0.5 121v12h-2q-8 -17 -50 -54zM512 32v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5zM512 544v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5v-192 q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5zM512 1056v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 544v64q0 14 9 23t23 9h1728q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23zM384 972q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6l-14 2q-50 149 -103 205 q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743q-28 35 -51 80q-48 97 -48 188zM414 154q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22 q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71h411q7 -39 7 -92q0 -111 -41 -212q-23 -55 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156z" /> | |||
<glyph unicode="" d="M0 -32v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-1472q-14 0 -23 -9t-9 -23zM0 1405q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5 t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2 q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195 q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39q-37 2 -45 4z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 160v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113zM128 160q0 -14 9 -23t23 -9h320q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192zM128 544q0 -14 9 -23t23 -9h320 q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192zM128 928q0 -14 9 -23t23 -9h320q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192zM640 160q0 -14 9 -23t23 -9h320q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9 t-9 -23v-192zM640 544q0 -14 9 -23t23 -9h320q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192zM640 928q0 -14 9 -23t23 -9h320q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192zM1152 160q0 -14 9 -23t23 -9h320q14 0 23 9t9 23 v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192zM1152 544q0 -14 9 -23t23 -9h320q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192zM1152 928q0 -14 9 -23t23 -9h320q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M27 160q0 27 18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45t-18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45zM128 1408l98 30l30 98l30 -98l98 -30l-98 -30l-30 -98l-30 98zM320 1216l196 60l60 196l60 -196l196 -60l-196 -60 l-60 -196l-60 196zM768 1408l98 30l30 98l30 -98l98 -30l-98 -30l-30 -98l-30 98zM1083 1062l107 -107l293 293l-107 107zM1408 768l98 30l30 98l30 -98l98 -30l-98 -30l-30 -98l-30 98z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M64 192q0 26 19 45t45 19v320q0 8 -0.5 35t0 38t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45v-1024q0 -15 -4 -26.5t-13.5 -18.5t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5 q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM384 128q0 -52 38 -90t90 -38 t90 38t38 90t-38 90t-90 38t-90 -38t-38 -90zM1280 128q0 -52 38 -90t90 -38t90 38t38 90t-38 90t-90 38t-90 -38t-38 -90z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63 q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5 q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423z" /> | |||
<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5 q-104 0 -194.5 -28.5t-153 -76.5t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118 q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5z" /> | |||
<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM276 309q0 -43 18.5 -77.5t48.5 -56.5t69 -37t77.5 -21t76.5 -6q60 0 120.5 15.5t113.5 46t86 82.5t33 117 q0 49 -20 89.5t-49 66.5t-58 47.5t-49 44t-20 44.5t15.5 42.5t37.5 39.5t44 42t37.5 59.5t15.5 82.5q0 60 -22.5 99.5t-72.5 90.5h83l88 64h-265q-85 0 -161 -32t-127.5 -98t-51.5 -153q0 -93 64.5 -154.5t158.5 -61.5q22 0 43 3q-13 -29 -13 -54q0 -44 40 -94 q-175 -12 -257 -63q-47 -29 -75.5 -73t-28.5 -95zM395 338q0 46 25 80t65.5 51.5t82 25t84.5 7.5q20 0 31 -2q2 -1 23 -16.5t26 -19t23 -18t24.5 -22t19 -22.5t17 -26t9 -26.5t4.5 -31.5q0 -76 -58.5 -112.5t-139.5 -36.5q-41 0 -80.5 9.5t-75.5 28.5t-58 53t-22 78z M462 969q0 61 32 104t92 43q53 0 93.5 -45t58 -101t17.5 -107q0 -60 -33 -99.5t-92 -39.5q-53 0 -93 42.5t-57.5 96.5t-17.5 106zM960 672h128v-160h64v160h128v64h-128v128h-64v-128h-128v-64z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M32 182q0 81 44.5 150t118.5 115q131 82 404 100q-32 42 -47.5 74t-15.5 73q0 36 21 85q-46 -4 -68 -4q-148 0 -249.5 96.5t-101.5 244.5q0 82 36 159t99 131q77 66 182.5 98t217.5 32h418l-138 -88h-131q74 -63 112 -133t38 -160q0 -72 -24.5 -129.5t-59 -93t-69.5 -65 t-59.5 -61.5t-24.5 -66q0 -36 32 -70.5t77.5 -68t90.5 -73.5t77 -104t32 -142q0 -90 -48 -173q-72 -122 -211 -179.5t-298 -57.5q-132 0 -246.5 41.5t-171.5 137.5q-37 60 -37 131zM218 228q0 -70 35 -123.5t91.5 -83t119 -44t127.5 -14.5q58 0 111.5 13t99 39t73 73 t27.5 109q0 25 -7 49t-14.5 42t-27 41.5t-29.5 35t-38.5 34.5t-36.5 29t-41.5 30t-36.5 26q-16 2 -48 2q-53 0 -105 -7t-107.5 -25t-97 -46t-68.5 -74.5t-27 -105.5zM324 1222q0 -46 10 -97.5t31.5 -103t52 -92.5t75 -67t96.5 -26q38 0 78 16.5t66 43.5q53 57 53 159 q0 58 -17 125t-48.5 129.5t-84.5 103.5t-117 41q-42 0 -82.5 -19.5t-65.5 -52.5q-47 -59 -47 -160zM1084 731v108h212v217h105v-217h213v-108h-213v-219h-105v219h-212z" /> | |||
<glyph unicode="" horiz-adv-x="1920" d="M0 64v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45zM128 384q106 0 181 -75t75 -181h1152q0 106 75 181t181 75v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512zM640 640q0 70 21 142 t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142t-21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142zM762 791l77 -80q42 37 55 57h2v-288h-128v-96h384v96h-128v448h-114z" /> | |||
<glyph unicode="" horiz-adv-x="1024" d="M0 832q0 26 19 45t45 19h896q26 0 45 -19t19 -45t-19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45z" /> | |||
<glyph unicode="" horiz-adv-x="1024" d="M0 320q0 26 19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45z" /> | |||
<glyph unicode="" horiz-adv-x="640" d="M64 640q0 26 19 45l448 448q19 19 45 19t45 -19t19 -45v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45z" /> | |||
<glyph unicode="" horiz-adv-x="640" d="M0 192v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45t-19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 32v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h608v1152h-640v-1120zM896 0h608q13 0 22.5 9.5t9.5 22.5v1120h-640v-1152z" /> | |||
<glyph unicode="" horiz-adv-x="1024" d="M0 448q0 26 19 45t45 19h896q26 0 45 -19t19 -45t-19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45zM0 832q0 26 19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45z" /> | |||
<glyph unicode="" horiz-adv-x="1024" d="M0 448q0 26 19 45t45 19h896q26 0 45 -19t19 -45t-19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45z" /> | |||
<glyph unicode="" horiz-adv-x="1024" d="M0 832q0 26 19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 32v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113zM0 1098q0 78 41.5 130t118.5 52h1472 q65 0 112.5 -47t47.5 -113q0 -79 -49 -151t-122 -123q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5z" /> | |||
<glyph unicode="" d="M0 1217q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122zM19 -80v991h330v-991h-330zM531 -80q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5v-568 h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329z" /> | |||
<glyph unicode="" d="M0 832v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298t-61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12 q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M40 736q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18 q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5 q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5 t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 384q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29q-141 221 -141 483zM128 384q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5z M320 832q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM710 241q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91l101 382q6 26 -7.5 48.5t-38.5 29.5t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5 t-63 -98.5zM768 1024q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM1216 832q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM1408 384q0 -53 37.5 -90.5 t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 640q0 174 120 321.5t326 233t450 85.5t450 -85.5t326 -233t120 -321.5t-120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5 t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281zM128 640q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5t-381.5 -69.5 t-282 -187.5t-104.5 -255z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 768q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257t-94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25 t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224zM128 768q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52t-286 -52t-211.5 -141t-78.5 -191zM616 132 q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22 t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132z" /> | |||
<glyph unicode="" horiz-adv-x="896" d="M1 551l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 -32v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 681q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17 q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5z M384 128q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180zM768 1310v98q0 26 19 45t45 19t45 -19t19 -45v-98q-42 2 -64 2t-64 -2z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 96v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88v-672q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68zM256 1312q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5v64 q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64zM768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1280 640h299l-299 299v-299z" /> | |||
<glyph unicode="" horiz-adv-x="1024" d="M0 960q0 99 44.5 184.5t117 142t164 89t186.5 32.5t186.5 -32.5t164 -89t117 -142t44.5 -184.5q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47q0 -46 -31.5 -71t-77.5 -25 q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268zM128 960q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228 q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134zM480 1088q0 13 9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5 q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 256q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22zM0 800v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23 t23 9q12 0 24 -10l319 -319q9 -9 9 -23t-9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5z" /> | |||
<glyph unicode="" horiz-adv-x="1920" d="M0 448q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5z M512 608q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5z" /> | |||
<glyph unicode="" horiz-adv-x="1920" d="M0 448q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5z M512 672q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24z" /> | |||
<glyph unicode="" horiz-adv-x="1408" d="M0 131q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89 q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5 t81 -103t47.5 -132.5t24 -138t5.5 -131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190zM256 192q0 26 19 45t45 19t45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45zM320 1024q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5 t-271.5 112.5t-112.5 271.5z" /> | |||
<glyph unicode="" horiz-adv-x="1408" d="M0 768v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48 q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5 t-131.5 271.5v132q-164 20 -274 128t-110 252zM1152 832q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 96v832q0 92 66 158t158 66h64v-1280h-64q-92 0 -158 66t-66 158zM384 -128v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128v-1280h-1024zM640 1152h512v128h-512v-128zM1504 -128v1280h64q92 0 158 -66t66 -158v-832q0 -92 -66 -158t-158 -66h-64z " /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 128q190 161 287 397.5t97 498.5q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38 t-38 90zM656 0q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16z" /> | |||
<glyph unicode="" horiz-adv-x="1920" d="M0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM256 480v736q0 26 19 45t45 19h1152q159 0 271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158zM1408 704h64q80 0 136 56t56 136 t-56 136t-136 56h-64v-384z" /> | |||
<glyph unicode="" horiz-adv-x="1408" d="M0 832v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128 q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111zM768 416v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5z" /> | |||
<glyph unicode="" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM384 160v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64 q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23zM384 416v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23zM384 672v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23zM1024 1024h376 q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" /> | |||
<glyph unicode="" horiz-adv-x="1408" d="M0 -192v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45zM128 -128h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224h384v1536h-1152v-1536zM256 160v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM256 416v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM256 672v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM256 928v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM256 1184v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM512 416v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM512 672v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM512 928v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM512 1184v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM768 416v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM768 672v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM768 928v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM768 1184v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM1024 160v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM1024 416v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM1024 672v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM1024 928v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM1024 1184v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5z" /> | |||
<glyph unicode="" horiz-adv-x="1408" d="M0 -192v1280q0 26 19 45t45 19h320v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45zM128 -128h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224h384v1152h-256 v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152zM256 160v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM256 416v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5 v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM256 672v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM512 416v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64 q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM512 672v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM512 1056q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128 v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320zM768 416v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5 v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM768 672v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM1024 160v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5 v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM1024 416v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM1024 672v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5 v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5z" /> | |||
<glyph unicode="" horiz-adv-x="1920" d="M64 192q0 26 19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45v-1152q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128 q-26 0 -45 19t-19 45zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM384 128q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM896 800q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192 q14 0 23 9t9 23v224h224q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192zM1280 128q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 96v832q0 92 66 158t158 66h32v-1280h-32q-92 0 -158 66t-66 158zM352 -128v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160v-1280h-1088zM512 416q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23v192 q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192zM640 1152h512v128h-512v-128zM1536 -128v1280h32q92 0 158 -66t66 -158v-832q0 -92 -66 -158t-158 -66h-32z" /> | |||
<glyph unicode="" horiz-adv-x="1920" d="M0 512v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q261 -58 287 -93l1 -3q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5 t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M64 1152l32 128h480l32 128h960l32 -192l-64 -32v-800l128 -192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320zM384 768q0 -53 37.5 -90.5t90.5 -37.5h128v384h-256v-256z" /> | |||
<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 192q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45 v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896z" /> | |||
<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 576q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45 v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128z" /> | |||
<glyph unicode="" horiz-adv-x="1024" d="M45 576q0 13 10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23zM429 576q0 13 10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23 l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23z" /> | |||
<glyph unicode="" horiz-adv-x="1024" d="M13 160q0 13 10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23zM397 160q0 13 10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10 l466 -466q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23z" /> | |||
<glyph unicode="" horiz-adv-x="1152" d="M77 224q0 13 10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23zM77 608q0 13 10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23 l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23z" /> | |||
<glyph unicode="" horiz-adv-x="1152" d="M77 672q0 13 10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23zM77 1056q0 13 10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10 l50 -50q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23z" /> | |||
<glyph unicode="" horiz-adv-x="640" d="M45 576q0 13 10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23z" /> | |||
<glyph unicode="" horiz-adv-x="640" d="M13 160q0 13 10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23z" /> | |||
<glyph unicode="" horiz-adv-x="1152" d="M77 352q0 13 10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23z" /> | |||
<glyph unicode="" horiz-adv-x="1152" d="M77 800q0 13 10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23z" /> | |||
<glyph unicode="" horiz-adv-x="1920" d="M0 288v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113zM128 544q0 -13 9.5 -22.5 t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832z" /> | |||
<glyph unicode="" horiz-adv-x="1920" d="M0 96v96h160h1600h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68zM256 416v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088q-66 0 -113 47t-47 113zM384 416q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5 t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-704zM864 112q0 -16 16 -16h160q16 0 16 16t-16 16h-160q-16 0 -16 -16z" /> | |||
<glyph unicode="" horiz-adv-x="1152" d="M0 160v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-832q-66 0 -113 47t-47 113zM128 288q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960zM512 128 q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" /> | |||
<glyph unicode="" horiz-adv-x="768" d="M0 128v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90zM96 288q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704zM288 1136 q0 -16 16 -16h160q16 0 16 16t-16 16h-160q-16 0 -16 -16zM304 128q0 -33 23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5t-23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 192v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136z M896 192v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 832v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136zM896 832v384 q0 80 56 136t136 56h384q80 0 136 -56t56 -136v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136z" /> | |||
<glyph unicode="" horiz-adv-x="1568" d="M0 640q0 66 47 113t113 47t113 -47t47 -113t-47 -113t-113 -47t-113 47t-47 113zM176 1088q0 73 51.5 124.5t124.5 51.5t124.5 -51.5t51.5 -124.5t-51.5 -124.5t-124.5 -51.5t-124.5 51.5t-51.5 124.5zM208 192q0 60 42 102t102 42q59 0 101.5 -42t42.5 -102t-42.5 -102 t-101.5 -42q-60 0 -102 42t-42 102zM608 1280q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136zM672 0q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5zM1136 192q0 46 33 79t79 33t79 -33t33 -79 t-33 -79t-79 -33t-79 33t-33 79zM1168 1088q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM1344 640q0 40 28 68t68 28t68 -28t28 -68t-28 -68t-68 -28t-68 28t-28 68z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 896q0 26 19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101 t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19l-512 512q-19 19 -19 45z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 496q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218q0 -87 -27 -168q136 -160 136 -398q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86t-170 -47.5t-171.5 -22t-167 -4.5 q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331zM224 320q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11 q-152 21 -195 21q-118 0 -187 -84t-69 -204zM384 320q0 40 12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82t-12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82zM1024 320q0 40 12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82t-12.5 -82t-43 -76t-72.5 -34t-72.5 34 t-43 76t-12.5 82z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 224v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158zM128 224q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64 q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960z" /> | |||
<glyph unicode="" horiz-adv-x="1920" d="M0 224v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158zM128 331l256 315q44 53 116 87.5 t140 34.5h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-853zM171 163q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40z " /> | |||
<glyph unicode="" horiz-adv-x="1792" /> | |||
<glyph unicode="" horiz-adv-x="1792" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM128 640q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5zM384 896q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5zM402 461q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38 q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5q-37 -121 -138 -195t-228 -74t-228 74t-138 195zM896 896q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM128 640q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5zM384 896q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5zM402 307q37 121 138 195t228 74t228 -74t138 -195q8 -25 -4 -48.5 t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5zM896 896q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM128 640q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5zM384 448q0 26 19 45t45 19h640q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45zM384 896q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5 t-90.5 -37.5t-90.5 37.5t-37.5 90.5zM896 896q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5z" /> | |||
<glyph unicode="" horiz-adv-x="1920" d="M0 512q0 212 150 362t362 150h896q212 0 362 -150t150 -362t-150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150t-150 362zM192 448q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23v128 q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128zM1152 384q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM1408 640q0 -53 37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5z" /> | |||
<glyph unicode="" horiz-adv-x="1920" d="M0 128v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5zM128 128h1664v896h-1664v-896zM256 272v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16zM256 528v96 q0 16 16 16h224q16 0 16 -16v-96q0 -16 -16 -16h-224q-16 0 -16 16zM256 784v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16zM512 272v96q0 16 16 16h864q16 0 16 -16v-96q0 -16 -16 -16h-864q-16 0 -16 16zM512 784v96q0 16 16 16h96q16 0 16 -16v-96 q0 -16 -16 -16h-96q-16 0 -16 16zM640 528v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16zM768 784v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16zM896 528v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16z M1024 784v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16zM1152 528v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16zM1280 784v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16zM1408 528v96q0 16 16 16h112v240 q0 16 16 16h96q16 0 16 -16v-352q0 -16 -16 -16h-224q-16 0 -16 16zM1536 272v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M64 1280q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64zM320 320v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86 q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56zM448 426 q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M64 1280q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64zM320 320v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86 q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56zM448 426 q205 96 384 110v192q-181 -16 -384 -117v-185zM448 836q215 111 384 118v197q-172 -8 -384 -126v-189zM832 730h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15 t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2q-23 0 -49 -3v-222zM1280 828q148 -42 384 90v189q-169 -91 -306 -91q-45 0 -78 8v-196z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M13 160q0 13 10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23zM640 32v64q0 14 9 23t23 9h960q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-960 q-14 0 -23 9t-9 23z" /> | |||
<glyph unicode="" horiz-adv-x="1920" d="M45 576q0 13 10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23zM712 -52l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5 l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5zM1293 160q0 13 10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 896q0 26 19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45l397 -397v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45zM384 896q0 26 19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221 q169 -173 169 -509q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M2 900.5q9 27.5 54 34.5l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5z M832 310l59 -31l318 -168l-60 355l-12 66l49 47l257 250l-356 52l-66 10l-30 60l-159 322v-963z" /> | |||
<glyph unicode="" horiz-adv-x="1408" d="M2 561q-5 22 4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 928v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864 q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23zM512 301l595 595h-595v-595zM557 256h595v595z" /> | |||
<glyph unicode="" horiz-adv-x="1024" d="M0 64q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136 q0 -52 -26 -96.5t-70 -69.5q-2 -287 -226 -414q-68 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136zM96 64q0 -40 28 -68t68 -28t68 28t28 68t-28 68t-68 28t-68 -28t-28 -68zM96 1216q0 -40 28 -68 t68 -28t68 28t28 68t-28 68t-68 28t-68 -28t-28 -68zM736 1088q0 -40 28 -68t68 -28t68 28t28 68t-28 68t-68 28t-68 -28t-28 -68z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 448q0 14 9 23t23 9h320q14 0 23 -9t9 -23t-9 -23t-23 -9h-320q-14 0 -23 9t-9 23zM16 1088q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56l-239 -18l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68 l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204zM128 32q0 13 9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-256 -256q-10 -9 -23 -9q-12 0 -23 9q-9 10 -9 23zM544 -96v320q0 14 9 23t23 9t23 -9t9 -23v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23zM633 364 l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56zM1056 1184v320q0 14 9 23t23 9t23 -9t9 -23v-320 q0 -14 -9 -23t-23 -9t-23 9t-9 23zM1216 1120q0 13 9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23zM1280 960q0 14 9 23t23 9h320q14 0 23 -9t9 -23t-9 -23t-23 -9h-320q-14 0 -23 9t-9 23z" /> | |||
<glyph unicode="" horiz-adv-x="1024" d="M96.5 986q-2.5 15 5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5t-10.5 37.5v45q0 83 65 156.5 t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25zM384 40v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28z" /> | |||
<glyph unicode="" horiz-adv-x="640" d="M0 64v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45zM128 1152v192q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-192 q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45z" /> | |||
<glyph unicode="" horiz-adv-x="640" d="M98 1344q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45zM128 64v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45z" /> | |||
<glyph unicode="" d="M5 0v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258zM1013 713q0 64 26 117t65 86.5 t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5t-65.5 -51.5t-30.5 -63h232v80h126v-206h-514l-3 27q-4 28 -4 46z " /> | |||
<glyph unicode="" d="M5 0v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258zM1015 -183q0 64 26 117t65 86.5 t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73h232v80h126v-206h-514l-4 27q-3 45 -3 46z" /> | |||
<glyph unicode="" horiz-adv-x="1920" d="M1.5 146.5q5.5 37.5 30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5zM128 128h768l336 384h-768z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 0v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5 q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124 q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89 q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1z" /> | |||
<glyph unicode="" horiz-adv-x="1152" d="M0 704v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45 t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5zM256 704v512q0 132 94 226t226 94t226 -94t94 -226v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226z" /> | |||
<glyph unicode="" horiz-adv-x="1408" d="M13 64q0 13 10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23t-10 -23l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -221 -147.5 -384.5 t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23zM128 704v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113l-101 -101 q-42 103 -42 214zM384 704v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" /> | |||
<glyph unicode="" horiz-adv-x="1280" d="M0 576v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150t-33.5 170.5zM640 79 q119 63 213 137q235 184 235 360v640h-448v-1137z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 -128v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90zM128 -128h1408v1024h-1408v-1024z M384 1088q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288zM1152 1088q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288z" /> | |||
<glyph unicode="" horiz-adv-x="1408" d="M3.5 940q-8.5 25 3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96 q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37 zM384 1344q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M36 464l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85 q-3 -1 -9 -1q-14 0 -23 9l-64 64q-17 19 -5 39zM1248 1088q0 -40 28 -68t68 -28t68 28t28 68t-28 68t-68 28t-68 -28t-28 -68z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 0l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM346 640q0 -26 19 -45l454 -454q19 -19 45 -19t45 19l102 102q19 19 19 45t-19 45l-307 307l307 307 q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM506 288q0 -26 19 -45l102 -102q19 -19 45 -19t45 19l454 454q19 19 19 45t-19 45l-454 454 q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM250 544q0 -26 19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19l102 102 q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM250 736q0 -26 19 -45l454 -454q19 -19 45 -19t45 19l454 454q19 19 19 45t-19 45l-102 102 q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45z" /> | |||
<glyph unicode="" horiz-adv-x="1408" d="M0 1408h1408l-128 -1438l-578 -162l-574 162zM262 1114l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674l16 175h-884z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M12 75l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208l59 297h1505l-266 -1333l-804 -267z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 0v352q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23v-352q0 -22 -20 -30q-8 -2 -12 -2q-13 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5 l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30zM832 1280q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" /> | |||
<glyph unicode="" horiz-adv-x="1152" d="M0 96v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181v-320h736q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28 t-28 68z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM128 640q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5zM256 640q0 212 150 362t362 150t362 -150t150 -362t-150 -362t-362 -150t-362 150t-150 362zM384 640q0 -159 112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5t-112.5 271.5 t-271.5 112.5t-271.5 -112.5t-112.5 -271.5zM512 640q0 106 75 181t181 75t181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181z" /> | |||
<glyph unicode="" horiz-adv-x="1408" d="M0 608v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68zM512 608v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68zM1024 608v192q0 40 28 68t68 28h192 q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68z" /> | |||
<glyph unicode="" horiz-adv-x="384" d="M0 96v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68zM0 608v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68zM0 1120v192q0 40 28 68t68 28h192q40 0 68 -28 t28 -68v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68z" /> | |||
<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 256q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5z M256 575q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128q13 0 23 10t9 24q-13 232 -177 396t-396 177q-14 1 -24 -9t-10 -23v-128zM256 959q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128 q13 0 23 10q11 9 9 23q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM512 320q0 -37 32 -56q16 -8 32 -8q17 0 32 9l544 320q32 18 32 55t-32 55l-544 320q-31 19 -64 1 q-32 -19 -32 -56v-640z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M54 448.5q0 53.5 37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136t-136 56t-136 -56l-125 126q-37 37 -37 90.5z M342 512q0 -26 19 -45l362 -362q18 -18 45 -18t45 18l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45zM452 512l572 572l316 -316l-572 -572z" /> | |||
<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 576q0 -26 19 -45t45 -19h896q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128 z" /> | |||
<glyph unicode="" horiz-adv-x="1408" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM128 288q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47 t-47 -113v-832zM256 672v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23z" /> | |||
<glyph unicode="" horiz-adv-x="1024" d="M3 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18z" /> | |||
<glyph unicode="" horiz-adv-x="1024" d="M3 1261q9 19 29 19h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34z" /> | |||
<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM218 640q0 -26 19 -45l358 -358q19 -19 45 -19t45 19l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19 t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45z" /> | |||
<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 128h288l544 544l-288 288l-544 -544v-288zM352 320v56l52 52l152 -152l-52 -52h-56v96h-96zM494 494 q-14 13 3 30l291 291q17 17 30 3q14 -13 -3 -30l-291 -291q-17 -17 -30 -3zM864 1024l288 -288l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28z" /> | |||
<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM282 320q0 -26 19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59 v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45z" /> | |||
<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 448q0 -181 167 -404q10 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5t224 23.5v-160 q0 -42 40 -59q12 -5 24 -5q26 0 45 19l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM512 241v542l512 256v-542zM640 448l256 128l-256 128v-256z" /> | |||
<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 160q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5v960q0 13 -9.5 22.5t-22.5 9.5h-960 q-13 0 -22.5 -9.5t-9.5 -22.5v-960zM391 861q17 35 57 35h640q40 0 57 -35q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66z" /> | |||
<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 160q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5v960q0 13 -9.5 22.5t-22.5 9.5h-960 q-13 0 -22.5 -9.5t-9.5 -22.5v-960zM391 419q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66q-17 -35 -57 -35h-640q-40 0 -57 35z" /> | |||
<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 160q0 -14 9 -23t23 -9h960q14 0 23 9t9 23v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960z M512 320v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52t-27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57z" /> | |||
<glyph unicode="" horiz-adv-x="1024" d="M0 514v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5 t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5 l12 3l5 2q13 5 26 -2q12 -7 15 -21l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5z" /> | |||
<glyph unicode="" horiz-adv-x="1024" d="M0 32v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215 h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23z" /> | |||
<glyph unicode="" horiz-adv-x="1024" d="M52 171l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242 t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48 t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50t53 -63.5t31.5 -76.5t13 -94q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5 t-17.5 18q-17 21 -2 41z" /> | |||
<glyph unicode="" horiz-adv-x="898" d="M0 605v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171 q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22z" /> | |||
<glyph unicode="" horiz-adv-x="1027" d="M4 1360q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103 q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214z" /> | |||
<glyph unicode="" horiz-adv-x="1280" d="M0 256v128q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315t-126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9 h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23zM487 747h320q106 0 171 62t65 162t-65 162t-171 62h-320v-448z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 672v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111 q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23z M373 896l32 -128h225l35 128h-292zM436 640l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5l81 299h-159zM822 768h139l-35 128h-70zM1118 896l34 -128h230l33 128h-297zM1187 640l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3l78 300h-162z" /> | |||
<glyph unicode="" horiz-adv-x="1280" d="M56 0l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89 t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200zM522 182q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30t24.5 40t9.5 51q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1 t-47.5 -1v-338zM522 674q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307z" /> | |||
<glyph unicode="" d="M0 -160v1600q0 40 28 68t68 28h800v-544q0 -40 28 -68t68 -28h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM1024 1024v472q22 -14 36 -28l408 -408q14 -14 28 -36h-472z" /> | |||
<glyph unicode="" d="M0 -160v1600q0 40 28 68t68 28h800v-544q0 -40 28 -68t68 -28h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM384 160q0 -14 9 -23t23 -9h704q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64zM384 416q0 -14 9 -23t23 -9h704 q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64zM384 672q0 -14 9 -23t23 -9h704q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64zM1024 1024v472q22 -14 36 -28l408 -408q14 -14 28 -36h-472z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M34 108q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35zM899 768v106h70l230 662h162l230 -662h70v-106h-288v106h75l-47 144h-243l-47 -144h75v-106 h-287zM988 -166l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121v-233h-584v90zM1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18 t-7.5 -29z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M34 108q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35zM899 -150h70l230 662h162l230 -662h70v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287 v106zM988 768v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248v119h121v-233h-584zM1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29 z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M34 108q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35zM896 -32q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9 t-9 23v192zM896 288v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23zM896 800v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23zM896 1312v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23 v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M34 108q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35zM896 -32q0 14 9 23t23 9h256q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9 t-9 23v192zM896 288v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23zM896 800v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23zM896 1312v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23 v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23z" /> | |||
<glyph unicode="" d="M34 108q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35zM946 261q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5q0 -62 -13 -121.5t-41 -114 t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5zM976 1351l192 185h123v-654h165v-114h-469v114h167v432q0 7 0.5 19t0.5 17 v16h-2l-7 -12q-8 -13 -26 -31l-62 -58zM1085 261q0 -57 36.5 -95t104.5 -38q50 0 85 27t35 68q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94z" /> | |||
<glyph unicode="" d="M34 108q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35zM946 1285q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5q0 -62 -13 -121.5t-41 -114 t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5zM976 327l192 185h123v-654h165v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16 h-2l-7 -12q-8 -13 -26 -31l-62 -58zM1085 1285q0 -57 36.5 -95t104.5 -38q50 0 85 27t35 68q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 64v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45zM128 192q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45zM480 64v641q0 25 18 43.5t43 20.5q24 2 76 59 t101 121q68 87 101 120q18 18 31 48t17.5 48.5t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135 q0 -86 -55 -149q15 -44 15 -76q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 448q0 -26 19 -45t45 -19h288q26 0 45 19t19 45v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640zM128 960q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45zM480 447v641q0 26 19 44.5t45 19.5q35 1 158 44 q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76q55 -61 55 -149q-1 -78 -57.5 -135t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39 t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121t-76 59q-25 2 -43 20.5t-18 43.5z" /> | |||
<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM218 366q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73 q20 84 20 260q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5q-20 -87 -20 -260zM300 551v70h232v-70h-80v-423h-74v423h-78zM396 1313l24 -69t23 -69q35 -103 46 -158v-201h74v201l90 296h-75l-51 -195l-53 195 h-78zM542 205v290h66v-270q0 -24 1 -26q1 -15 15 -15q20 0 42 31v280h67v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 16 -6 54zM654 936q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87v130q0 58 -21 87q-29 38 -78 38q-51 0 -78 -38q-21 -29 -21 -87v-130zM721 923 v156q0 52 32 52t32 -52v-156q0 -51 -32 -51t-32 51zM790 128v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67zM857 200q16 -16 33 -16q29 0 29 49v157q0 50 -29 50q-17 0 -33 -16v-224zM907 893q0 -37 6 -55 q11 -27 43 -27q36 0 77 45v-40h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293zM1037 247v129q0 59 20 86q29 38 80 38t78 -38q21 -28 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68v-9q0 -29 -2 -43q-3 -22 -15 -40 q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86zM1103 355h66v34q0 51 -33 51t-33 -51v-34z" /> | |||
<glyph unicode="" d="M27 260q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99q-26 112 -26 350zM138 509h105v-569h100v569h107v94h-312 v-94zM266 1536h106l71 -263l68 263h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187zM463 43q0 -49 8 -73q12 -37 58 -37q48 0 102 61v-54h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391zM614 1028v175q0 80 28 117q38 51 105 51 q69 0 106 -51q28 -37 28 -117v-175q0 -81 -28 -118q-37 -51 -106 -51q-67 0 -105 51q-28 38 -28 118zM704 1011q0 -70 43 -70t43 70v210q0 69 -43 69t-43 -69v-210zM798 -60h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89 v-663zM887 36v301q22 22 45 22q39 0 39 -67v-211q0 -67 -39 -67q-23 0 -45 22zM955 971v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75zM1130 100q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54 q2 9 2 58v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51q-28 -37 -28 -116v-173zM1219 245v46q0 68 45 68t45 -68v-46h-90z" /> | |||
<glyph unicode="" horiz-adv-x="1408" d="M5 384q-10 17 0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45l164 -286q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17zM536 539q18 32 531 942q25 45 64 45h241q22 0 31 -15q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37 q-10 -15 -32 -15h-239q-42 0 -66 45z" /> | |||
<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM227 396q8 -13 24 -13h185q31 0 50 36l199 352q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29 l125 -216v-1l-196 -346q-9 -14 0 -28zM638 516q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1l409 723q8 16 0 28q-7 12 -24 12h-187q-30 0 -49 -35z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 640q0 96 1 150t8.5 136.5t22.5 147.5q16 73 69 123t124 58q222 25 671 25t671 -25q71 -8 124.5 -58t69.5 -123q14 -65 21.5 -147.5t8.5 -136.5t1 -150t-1 -150t-8.5 -136.5t-22.5 -147.5q-16 -73 -69 -123t-124 -58q-222 -25 -671 -25t-671 25q-71 8 -124.5 58 t-69.5 123q-14 65 -21.5 147.5t-8.5 136.5t-1 150zM640 320q0 -38 33 -56q16 -8 31 -8q20 0 34 10l512 320q30 17 30 54t-30 54l-512 320q-31 20 -65 2q-33 -18 -33 -56v-640z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M64 558l338 271l494 -305l-342 -285zM64 1099l490 319l342 -285l-494 -304zM407 166v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284l147 96v-108l-490 -293v-1l-1 1l-1 -1v1zM896 524l494 305l338 -271l-489 -319zM896 1133l343 285l489 -319l-338 -270z" /> | |||
<glyph unicode="" horiz-adv-x="1408" d="M0 -255v736h121v-618h928v618h120v-701l-1 -35v-1h-1132l-35 1h-1zM221 -17v151l707 1v-151zM227 243l14 150l704 -65l-13 -150zM270 563l39 146l683 -183l-39 -146zM395 928l77 130l609 -360l-77 -130zM707 1303l125 86l398 -585l-124 -85zM1136 1510l149 26l121 -697 l-149 -26z" /> | |||
<glyph unicode="" d="M0 69v1142q0 81 58 139t139 58h1142q81 0 139 -58t58 -139v-1142q0 -81 -58 -139t-139 -58h-1142q-81 0 -139 58t-58 139zM171 110q0 -26 17.5 -43.5t43.5 -17.5h1069q25 0 43 17.5t18 43.5v648h-135q20 -63 20 -131q0 -126 -64 -232.5t-174 -168.5t-240 -62 q-197 0 -337 135.5t-140 327.5q0 68 20 131h-141v-648zM461 643q0 -124 90.5 -211.5t217.5 -87.5q128 0 218.5 87.5t90.5 211.5t-90.5 211.5t-218.5 87.5q-127 0 -217.5 -87.5t-90.5 -211.5zM1050 1003q0 -29 20 -49t49 -20h174q29 0 49 20t20 49v165q0 28 -20 48.5 t-49 20.5h-174q-29 0 -49 -20.5t-20 -48.5v-165z" /> | |||
<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM274 640q0 -88 62 -150t150 -62t150 62t62 150t-62 150t-150 62t-150 -62t-62 -150zM838 640q0 -88 62 -150 t150 -62t150 62t62 150t-62 150t-150 62t-150 -62t-62 -150z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM309 384h94l104 160h522l104 -160h94l-459 691zM567 608l201 306l201 -306h-402z" /> | |||
<glyph unicode="" horiz-adv-x="1408" d="M0 1222q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34 t-6 39.5t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158zM173 285l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18t-76.5 27 t-73 43.5t-52 61.5q-25 96 -57 292zM243 1240q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5q-20 27 -56 44.5t-58 22t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43zM481 657q4 -91 77.5 -155t165.5 -56q91 8 152 84 t50 168q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5zM599 710q14 41 52 58q36 18 72.5 12t64 -35.5t27.5 -67.5q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82z" /> | |||
<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM260 1060q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63 q24 13 39.5 23t31 29t19.5 40q48 267 80 473q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54zM385 384q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71q0 7 5.5 26.5t3 32 t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6zM436 1073q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5t-52.5 16t-54.5 32.5zM607 653q-2 49 25.5 93t72.5 64 q70 31 141.5 -10t81.5 -118q8 -66 -36 -121t-110 -61t-119 40t-56 113zM687.5 660.5q0.5 -52.5 43.5 -70.5q39 -23 81 4t36 72q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5z" /> | |||
<glyph unicode="" horiz-adv-x="1024" d="M78 779v217q91 30 155 84q64 55 103 132q39 78 54 196h219v-388h364v-241h-364v-394q0 -136 14 -172q13 -37 52 -60q50 -31 117 -31q117 0 232 76v-242q-102 -48 -178 -65q-77 -19 -173 -19q-105 0 -186 27q-78 25 -138 75q-58 51 -79 105q-22 54 -22 161v539h-170z" /> | |||
<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM413 744h127v-404q0 -78 17 -121q17 -42 59 -78q43 -37 104 -57q62 -20 140 -20q67 0 129 14q57 13 134 49v181 q-88 -56 -174 -56q-51 0 -88 23q-29 17 -39 45q-11 30 -11 129v295h274v181h-274v291h-164q-11 -90 -40 -147t-78 -99q-48 -40 -116 -63v-163z" /> | |||
<glyph unicode="" horiz-adv-x="768" d="M3 237q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19t-5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35z" /> | |||
<glyph unicode="" horiz-adv-x="768" d="M3 1043q-8 19 5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M64 637q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 544v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23z" /> | |||
<glyph unicode="" horiz-adv-x="1408" d="M0 634q0 228 113 374q112 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32 q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503zM683 1131q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 -27v557h682v-651zM0 614v565l682 94v-659h-682zM757 -131v661h907v-786zM757 614v669l907 125v-794h-907z" /> | |||
<glyph unicode="" horiz-adv-x="1408" d="M0 337v430q0 42 30 72t73 30q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30t-73 30t-30 73zM241 886q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20l-71 -131q107 -55 171 -153.5t64 -215.5 h-925zM245 184v666h918v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78zM455 1092q0 -16 11 -27.5t27 -11.5t27.5 11.5t11.5 27.5t-11.5 27.5 t-27.5 11.5t-27 -11.5t-11 -27.5zM876 1092q0 -16 11.5 -27.5t27.5 -11.5t27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5zM1203 337v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73z" /> | |||
<glyph unicode="" d="M11 -115q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49t-14 -48q3 -17 37 -26q20 -6 84.5 -18.5 t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54q110 143 124 195q-12 112 -16 310q-2 90 24 151.5 t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5t-40.5 -33.5t-61 -14q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5 t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5t15.5 47.5q1 -31 8 -56.5t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13 t16.5 -9.5q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5t-30 -18.5t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5 q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43q-19 4 -51 9.5t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5zM321 495q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54 t7 -70.5q46 24 7 92q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5 t60 -22.5q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7 q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15 q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5 t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19 q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63 q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18zM372 630q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-7 -10 -1 -12zM603 1190q2 -5 5 -6 q10 0 7 -15q-3 -20 8 -20q3 0 3 3q3 17 -2.5 30t-11.5 15q-9 2 -9 -7zM634 1110q0 12 19 15h10q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5zM721 1122q24 11 32 -2q3 -6 -3 -9q-4 -1 -11.5 6.5t-17.5 4.5zM835 1196l4 -2q14 -4 18 -31q0 -3 8 2l2 3q0 11 -5 19.5t-11 12.5 t-9 3q-14 -1 -7 -7zM851 1381.5q-1 -2.5 3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9zM981 1002q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20q-2 8 -6.5 11.5t-13 5 t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM112 640q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81t99.5 48l37 13 q4 1 13 3.5t13 4.5q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21zM126 775q302 0 606 80q-120 213 -244 378q-138 -65 -234 -186t-128 -272zM350 134q184 -150 418 -150q132 0 256 52q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5 t-103 -148zM609 1276q1 1 2 1q-1 0 -2 -1zM613 1277q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5l12.5 17.5q-185 164 -433 164q-76 0 -155 -19zM909 797q25 -53 44 -95q2 -6 6.5 -17.5t7.5 -16.5q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5 t36.5 -6t25 -4.5l10 -2q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5zM1007 565q87 -239 128 -469q111 75 185 189.5t96 250.5q-210 60 -409 29z" /> | |||
<glyph unicode="" d="M0 1024q0 159 112.5 271.5t271.5 112.5q130 0 234 -80q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225 t-55.5 273.5q0 73 16 150q-80 104 -80 234zM376 399q0 -92 122 -157.5t291 -65.5q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12 t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5 q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 640q0 75 53 128l587 587q53 53 128 53t128 -53l265 -265l-398 -399l-188 188q-42 42 -99 42q-59 0 -100 -41l-120 -121q-42 -40 -42 -99q0 -58 42 -100l406 -408q30 -28 67 -37l6 -4h28q60 0 99 41l619 619l2 -3q53 -53 53 -128t-53 -128l-587 -587 q-52 -53 -127.5 -53t-128.5 53l-587 587q-53 53 -53 128zM302 660q0 21 14 35l121 120q13 15 35 15t36 -15l252 -252l574 575q15 15 36 15t36 -15l120 -120q14 -15 14 -36t-14 -36l-730 -730q-17 -15 -37 -15q-4 0 -6 1q-18 2 -30 14l-407 408q-14 15 -14 36z" /> | |||
<glyph unicode="" d="M0 -64v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM160 192q0 -14 9 -23t23 -9h480q14 0 23 9t9 23v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024zM832 576q0 -14 9 -23t23 -9h480q14 0 23 9t9 23 v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640z" /> | |||
<glyph unicode="" horiz-adv-x="1280" d="M0 480q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192 q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43q-40 0 -68 28t-28 68zM416 1280q0 93 65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5t-65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5z" /> | |||
<glyph unicode="" horiz-adv-x="1024" d="M0 416v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68z M288 1280q0 93 65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5t-65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM399.5 766q8.5 -37 24.5 -59l349 -473l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5 t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M44 363q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29q-4 -15 -20 -20 l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20zM320 640q0 -117 45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5 t-45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5z" /> | |||
<glyph unicode="" d="M0 640q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61 t-245 164t-164 245t-61 298zM128 640q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M64 1088v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1536q-26 0 -45 19t-19 45zM128 -64v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM704 704q0 -26 19 -45t45 -19h256 q26 0 45 19t19 45t-19 45t-45 19h-256q-26 0 -45 -19t-19 -45z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M32 576q0 26 19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19t19 -45t-19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19 t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45z M512 1152q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5h-640z" /> | |||
<glyph unicode="" horiz-adv-x="1920" d="M-1 1004q0 11 3 16l4 6q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24 q17 19 38 30q53 26 239 24q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5 t13 3t20 0.5l288 2q39 5 64 -2.5t31 -16.5l6 -10q23 -64 -150 -294q-24 -32 -65 -85q-78 -100 -90 -131q-17 -41 14 -81q17 -21 81 -82h1l1 -1l1 -1l2 -2q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12 q-30 21 -70 64t-68.5 77.5t-61 58t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211 t-130.5 272q-6 16 -6 27z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 391q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5q0 -68 -37 -139.5 t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5zM181 320q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5zM413.5 230.5 q-40.5 92.5 6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5q-45 -102 -158 -150t-224 -12q-107 34 -147.5 126.5zM495 257.5q9 -34.5 43 -50.5t74.5 -2.5t62.5 47.5q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5zM705 399 q-17 -31 13 -45q14 -5 29 0.5t22 18.5q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5zM1165 1274q-6 28 9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158 q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5zM1224 1047q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5t54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37z" /> | |||
<glyph unicode="" d="M0 638q0 187 83.5 349.5t229.5 269.5t325 137v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495zM398 -34q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211q-171 -94 -368 -94q-196 0 -367 94zM898 909v485q179 -30 325 -137t229.5 -269.5 t83.5 -349.5q0 -280 -181 -495q-204 99 -330.5 306.5t-126.5 459.5z" /> | |||
<glyph unicode="" horiz-adv-x="1408" d="M0 -211q0 19 13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23 t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 138.5q73 -25 127.5 -61.5t84.5 -76.5t48 -85t20.5 -89 t-0.5 -85.5t-13 -76.5t-19 -62t-17 -42l-7 -15q1 -5 1 -50.5t-1 -71.5q3 7 10 18.5t30.5 43t50.5 58t71 55.5t91.5 44.5t112 14.5t132.5 -24q-2 -78 -21.5 -141.5t-50 -104.5t-69.5 -71.5t-81.5 -45.5t-84.5 -24t-80 -9.5t-67.5 1t-46.5 4.5l-17 3q-23 -147 -73 -283 q6 7 18 18.5t49.5 41t77.5 52.5t99.5 42t117.5 20t129 -23.5t137 -77.5q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32z" /> | |||
<glyph unicode="" horiz-adv-x="1280" d="M21 217v66h1238v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5zM21 354v255h1238v-255h-1238zM21 682v255h1238v-255h-1238zM21 1010v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5v-67h-1238z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM384 544v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23t-9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM384 640q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23z" /> | |||
<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 160q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5v960q0 13 -9.5 22.5t-22.5 9.5h-960 q-13 0 -22.5 -9.5t-9.5 -22.5v-960zM448 640q0 33 27 52l448 320q17 12 37 12q26 0 45 -19t19 -45v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM512 640q0 106 75 181t181 75t181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 320q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5zM416 1348q-2 16 6 42 q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455l198 99l58 -114l-256 -128q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5z" /> | |||
<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM128 806q16 -8 25.5 -26t21.5 -20q21 -3 54.5 8.5t58 10.5t41.5 -30q11 -18 18.5 -38.5t15 -48t12.5 -40.5 q17 -46 53 -187q36 -146 57 -197q42 -99 103 -125q43 -12 85 -1.5t76 31.5q131 77 250 237q104 139 172.5 292.5t82.5 226.5q16 85 -21 132q-52 65 -187 45q-17 -3 -41 -12.5t-57.5 -30.5t-64.5 -48.5t-59.5 -70t-44.5 -91.5q80 7 113.5 -16t26.5 -99q-5 -52 -52 -143 q-43 -78 -71 -99q-44 -32 -87 14q-23 24 -37.5 64.5t-19 73t-10 84t-8.5 71.5q-23 129 -34 164q-12 37 -35.5 69t-50.5 40q-57 16 -127 -25q-54 -32 -136.5 -106t-122.5 -102v-7z" /> | |||
<glyph unicode="" horiz-adv-x="1152" d="M0 608v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31 l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26z" /> | |||
<glyph unicode="" horiz-adv-x="1408" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM128 288q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47 t-47 -113v-832zM256 672v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-14 0 -23 9t-9 23z" /> | |||
<glyph unicode="" horiz-adv-x="2176" d="M0 576q0 12 38.5 20.5t96.5 10.5q-7 25 -7 49q0 33 9.5 56.5t22.5 23.5h64v64h128q158 0 268 -64h1113q42 -7 106.5 -18t80.5 -14q89 -15 150 -40.5t83.5 -47.5t22.5 -40t-22.5 -40t-83.5 -47.5t-150 -40.5q-16 -3 -80.5 -14t-106.5 -18h-1113q-110 -64 -268 -64h-128v64 h-64q-13 0 -22.5 23.5t-9.5 56.5q0 24 7 49q-58 2 -96.5 10.5t-38.5 20.5zM323 336h29q157 0 273 64h1015q-217 -38 -456 -80q-57 0 -113 -24t-83 -48l-28 -24l-288 -288q-26 -26 -70.5 -45t-89.5 -19h-96zM323 816l93 464h96q46 0 90 -19t70 -45l288 -288q4 -4 11 -10.5 t30.5 -23t48.5 -29t61.5 -23t72.5 -10.5l456 -80h-1015q-116 64 -273 64h-29zM1739 484l81 -30q68 48 68 122t-68 122l-81 -30q53 -36 53 -92t-53 -92z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 796q0 47 27.5 85t71.5 53l157 53l-53 159q-8 24 -8 47q0 60 42 102.5t102 42.5q47 0 85 -27t53 -72l54 -160l310 105l-54 160q-8 24 -8 47q0 59 42.5 102t101.5 43q47 0 85.5 -27.5t53.5 -71.5l53 -161l162 55q21 6 43 6q60 0 102.5 -39.5t42.5 -98.5q0 -45 -30 -81.5 t-74 -51.5l-157 -54l105 -316l164 56q24 8 46 8q62 0 103.5 -40.5t41.5 -101.5q0 -97 -93 -130l-172 -59l56 -167q7 -21 7 -47q0 -59 -42 -102t-101 -43q-47 0 -85.5 27t-53.5 72l-55 165l-310 -106l55 -164q8 -24 8 -47q0 -59 -42 -102t-102 -43q-47 0 -85 27t-53 72 l-55 163l-153 -53q-29 -9 -50 -9q-61 0 -101.5 40t-40.5 101q0 47 27.5 85t71.5 53l156 53l-105 313l-156 -54q-26 -8 -48 -8q-60 0 -101 40.5t-41 100.5zM620 811l105 -313l310 105l-105 315z" /> | |||
<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 352q0 -40 28 -68t68 -28h832q40 0 68 28t28 68v436q-31 -35 -64 -55q-34 -22 -132.5 -85t-151.5 -99 q-98 -69 -164 -69t-164 69q-46 32 -141.5 92.5t-142.5 92.5q-12 8 -33 27t-31 27v-436zM256 928q0 -37 30.5 -76.5t67.5 -64.5q47 -32 137.5 -89t129.5 -83q3 -2 17 -11.5t21 -14t21 -13t23.5 -13t21.5 -9.5t22.5 -7.5t20.5 -2.5t20.5 2.5t22.5 7.5t21.5 9.5t23.5 13t21 13 t21 14t17 11.5l267 174q35 23 66.5 62.5t31.5 73.5q0 41 -27.5 70t-68.5 29h-832q-40 0 -68 -28t-28 -68z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 640q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348zM41 640q0 -173 68 -331.5t182.5 -273t273 -182.5t331.5 -68t331.5 68t273 182.5t182.5 273t68 331.5 t-68 331.5t-182.5 273t-273 182.5t-331.5 68t-331.5 -68t-273 -182.5t-182.5 -273t-68 -331.5zM127 640q0 163 67 313l367 -1005q-196 95 -315 281t-119 411zM254 1062q105 160 274.5 253.5t367.5 93.5q147 0 280.5 -53t238.5 -149h-10q-55 0 -92 -40.5t-37 -95.5 q0 -12 2 -24t4 -21.5t8 -23t9 -21t12 -22.5t12.5 -21t14.5 -24t14 -23q63 -107 63 -212q0 -19 -2.5 -38.5t-10 -49.5t-11.5 -44t-17.5 -59t-17.5 -58l-76 -256l-278 826q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-75 1 -202 10q-12 1 -20.5 -5t-11.5 -15 t-1.5 -18.5t9 -16.5t19.5 -8l80 -8l120 -328l-168 -504l-280 832q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-7 0 -23 0.5t-26 0.5zM679 -97l230 670l237 -647q1 -6 5 -11q-126 -44 -255 -44q-112 0 -217 32zM1282 -24l235 678q59 169 59 276q0 42 -6 79 q95 -174 95 -369q0 -209 -104 -385.5t-279 -278.5z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 455q0 140 100.5 263.5t275 205.5t391.5 108v-172q-217 -38 -356.5 -150t-139.5 -255q0 -152 154.5 -267t388.5 -145v1360l272 133v-1536l-272 -128q-228 20 -414 102t-293 208.5t-107 272.5zM1134 860v172q277 -33 481 -157l140 79l37 -390l-525 114l147 83 q-119 70 -280 99z" /> | |||
<glyph unicode="" horiz-adv-x="2048" d="M0 -128q0 26 20.5 45t48.5 19h1782q28 0 48.5 -19t20.5 -45v-128h-1920v128zM0 1024v128l960 384l960 -384v-128h-128q0 -26 -20.5 -45t-48.5 -19h-1526q-28 0 -48.5 19t-20.5 45h-128zM128 0v64q0 26 20.5 45t48.5 19h59v768h256v-768h128v768h256v-768h128v768h256 v-768h128v768h256v-768h59q28 0 48.5 -19t20.5 -45v-64h-1664z" /> | |||
<glyph unicode="" horiz-adv-x="2304" d="M0 1024q0 23 22 31l1120 352q4 1 10 1t10 -1l1120 -352q22 -8 22 -31t-22 -31l-1120 -352q-4 -1 -10 -1t-10 1l-652 206q-43 -34 -71 -111.5t-34 -178.5q63 -36 63 -109q0 -69 -58 -107l58 -433q2 -14 -8 -25q-9 -11 -24 -11h-192q-15 0 -24 11q-10 11 -8 25l58 433 q-58 38 -58 107q0 73 65 111q11 207 98 330l-333 104q-22 8 -22 31zM512 384l18 316l574 -181q22 -7 48 -7t48 7l574 181l18 -316q4 -69 -82 -128t-235 -93.5t-323 -34.5t-323 34.5t-235 93.5t-82 128z" /> | |||
<glyph unicode="" d="M109 1536q58 -15 108 -15q43 0 111 15q63 -111 133.5 -229.5t167 -276.5t138.5 -227q37 61 109.5 177.5t117.5 190t105 176t107 189.5q54 -14 107 -14q56 0 114 14q-28 -39 -60 -88.5t-49.5 -78.5t-56.5 -96t-49 -84q-146 -248 -353 -610l13 -707q-62 11 -105 11 q-41 0 -105 -11l13 707q-40 69 -168.5 295.5t-216.5 374.5t-181 287z" /> | |||
<glyph unicode="" horiz-adv-x="1280" d="M111 182q0 81 44.5 150t118.5 115q131 82 404 100q-32 41 -47.5 73.5t-15.5 73.5q0 40 21 85q-46 -4 -68 -4q-148 0 -249.5 96.5t-101.5 244.5q0 82 36 159t99 131q76 66 182 98t218 32h417l-137 -88h-132q75 -63 113 -133t38 -160q0 -72 -24.5 -129.5t-59.5 -93 t-69.5 -65t-59 -61.5t-24.5 -66q0 -36 32 -70.5t77 -68t90.5 -73.5t77.5 -104t32 -142q0 -91 -49 -173q-71 -122 -209.5 -179.5t-298.5 -57.5q-132 0 -246.5 41.5t-172.5 137.5q-36 59 -36 131zM297 228q0 -56 23.5 -102t61 -75.5t87 -50t100 -29t101.5 -8.5q58 0 111.5 13 t99 39t73 73t27.5 109q0 25 -7 49t-14.5 42t-27 41.5t-29.5 35t-38.5 34.5t-36.5 29t-41.5 30t-36.5 26q-16 2 -49 2q-53 0 -104.5 -7t-107 -25t-97 -46t-68.5 -74.5t-27 -105.5zM403 1222q0 -46 10 -97.5t31.5 -103t52 -92.5t75 -67t96.5 -26q37 0 77.5 16.5t65.5 43.5 q53 56 53 159q0 59 -17 125.5t-48 129t-84 103.5t-117 41q-42 0 -82.5 -19.5t-66.5 -52.5q-46 -59 -46 -160z" /> | |||
<glyph unicode="" horiz-adv-x="1984" d="M0 722q0 94 66 160t160 66q83 0 148 -55q248 158 592 164l134 423q4 14 17.5 21.5t28.5 4.5l347 -82q22 50 68.5 81t102.5 31q77 0 131.5 -54.5t54.5 -131.5t-54.5 -132t-131.5 -55q-76 0 -130.5 54t-55.5 131l-315 74l-116 -366q327 -14 560 -166q64 58 151 58 q94 0 160 -66t66 -160q0 -62 -31 -114t-83 -82q5 -33 5 -61q0 -121 -68.5 -230.5t-197.5 -193.5q-125 -82 -285.5 -125.5t-335.5 -43.5q-176 0 -336.5 43.5t-284.5 125.5q-129 84 -197.5 193t-68.5 231q0 29 5 66q-48 31 -77 81.5t-29 109.5zM77 722q0 -67 51 -111 q49 131 180 235q-36 25 -82 25q-62 0 -105.5 -43.5t-43.5 -105.5zM178 465q0 -101 59.5 -194t171.5 -166q116 -75 265.5 -115.5t313.5 -40.5t313.5 40.5t265.5 115.5q112 73 171.5 166t59.5 194t-59.5 193.5t-171.5 165.5q-116 75 -265.5 115.5t-313.5 40.5t-313.5 -40.5 t-265.5 -115.5q-112 -73 -171.5 -165.5t-59.5 -193.5zM555 572q0 57 41.5 98t97.5 41t96.5 -41t40.5 -98q0 -56 -40.5 -96t-96.5 -40q-57 0 -98 40t-41 96zM661 209.5q0 16.5 11 27.5t27 11t27 -11q77 -77 265 -77h2q188 0 265 77q11 11 27 11t27 -11t11 -27.5t-11 -27.5 q-99 -99 -319 -99h-2q-220 0 -319 99q-11 11 -11 27.5zM1153 572q0 57 41.5 98t97.5 41t96.5 -41t40.5 -98q0 -56 -40.5 -96t-96.5 -40q-57 0 -98 40t-41 96zM1555 1350q0 -45 32 -77t77 -32t77 32t32 77t-32 77t-77 32t-77 -32t-32 -77zM1672 843q131 -105 178 -238 q57 46 57 117q0 62 -43.5 105.5t-105.5 43.5q-49 0 -86 -28z" /> | |||
<glyph unicode="" d="M0 193v894q0 133 94 227t226 94h896q132 0 226 -94t94 -227v-894q0 -133 -94 -227t-226 -94h-896q-132 0 -226 94t-94 227zM155 709q0 -37 19.5 -67.5t52.5 -45.5q-7 -25 -7 -54q0 -98 74 -181.5t201.5 -132t278.5 -48.5q150 0 277.5 48.5t201.5 132t74 181.5q0 27 -6 54 q35 14 57 45.5t22 70.5q0 51 -36 87.5t-87 36.5q-60 0 -98 -48q-151 107 -375 115l83 265l206 -49q1 -50 36.5 -85t84.5 -35q50 0 86 35.5t36 85.5t-36 86t-86 36q-36 0 -66 -20.5t-45 -53.5l-227 54q-9 2 -17.5 -2.5t-11.5 -14.5l-95 -302q-224 -4 -381 -113q-36 43 -93 43 q-51 0 -87 -36.5t-36 -87.5zM493 613q0 37 26 63t63 26t63 -26t26 -63t-26 -64t-63 -27t-63 27t-26 64zM560 375q0 11 8 18q7 7 17.5 7t17.5 -7q49 -51 172 -51h1h1q122 0 173 51q7 7 17.5 7t17.5 -7t7 -18t-7 -18q-65 -64 -208 -64h-1h-1q-143 0 -207 64q-8 7 -8 18z M882 613q0 37 26 63t63 26t63 -26t26 -63t-26 -64t-63 -27t-63 27t-26 64zM1143 1120q0 30 21 51t50 21q30 0 51 -21t21 -51q0 -29 -21 -50t-51 -21q-29 0 -50 21t-21 50z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM320 502q0 -82 57.5 -139t139.5 -57q81 0 138.5 56.5t57.5 136.5v280q0 19 13.5 33t33.5 14 q19 0 32.5 -14t13.5 -33v-54l60 -28l90 27v62q0 79 -58 135t-138 56t-138 -55.5t-58 -134.5v-283q0 -20 -14 -33.5t-33 -13.5t-32.5 13.5t-13.5 33.5v120h-151v-122zM806 500q0 -80 58 -137t139 -57t138.5 57t57.5 139v122h-150v-126q0 -20 -13.5 -33.5t-33.5 -13.5 q-19 0 -32.5 14t-13.5 33v123l-90 -26l-60 28v-123z" /> | |||
<glyph unicode="" horiz-adv-x="1920" d="M0 336v266h328v-262q0 -43 30 -72.5t72 -29.5t72 29.5t30 72.5v620q0 171 126.5 292t301.5 121q176 0 302 -122t126 -294v-136l-195 -58l-131 61v118q0 42 -30 72t-72 30t-72 -30t-30 -72v-612q0 -175 -126 -299t-303 -124q-178 0 -303.5 125.5t-125.5 303.5zM1062 332 v268l131 -61l195 58v-270q0 -42 30 -71.5t72 -29.5t72 29.5t30 71.5v275h328v-266q0 -178 -125.5 -303.5t-303.5 -125.5q-177 0 -303 124.5t-126 300.5z" /> | |||
<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM64 640h704v-704h480q93 0 158.5 65.5t65.5 158.5v480h-704v704h-480q-93 0 -158.5 -65.5t-65.5 -158.5v-480z " /> | |||
<glyph unicode="" horiz-adv-x="2048" d="M0 271v697h328v286h204v-983h-532zM205 435h123v369h-123v-369zM614 271h205v697h-205v-697zM614 1050h205v204h-205v-204zM901 26v163h328v82h-328v697h533v-942h-533zM1106 435h123v369h-123v-369zM1516 26v163h327v82h-327v697h532v-942h-532zM1720 435h123v369h-123 v-369z" /> | |||
<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM293 388l211 41v206q55 -19 116 -19q125 0 213.5 95t88.5 229t-88.5 229t-213.5 95q-74 0 -141 -36h-186v-840z M504 804v277q28 17 70 17q53 0 91 -45t38 -109t-38 -109.5t-91 -45.5q-43 0 -70 15zM636 -39l211 41v206q51 -19 117 -19q125 0 213 95t88 229t-88 229t-213 95q-20 0 -39 -3q-23 -78 -78 -136q-87 -95 -211 -101v-636zM847 377v277q28 17 70 17q53 0 91 -45.5t38 -109.5 t-38 -109t-91 -45q-43 0 -70 15z" /> | |||
<glyph unicode="" horiz-adv-x="2038" d="M41 455q0 15 8.5 26.5t22.5 14.5l486 106q-8 14 -8 25t5.5 17.5t16 11.5t20 7t23 4.5t18.5 4.5q4 1 15.5 7.5t17.5 6.5q15 0 28 -16t20 -33q163 37 172 37q17 0 29.5 -11t12.5 -28q0 -15 -8.5 -26t-23.5 -14l-182 -40l-1 -16q-1 -26 81.5 -117.5t104.5 -91.5q47 0 119 80 t72 129q0 36 -23.5 53t-51 18.5t-51 11.5t-23.5 34q0 16 10 34l-68 19q43 44 43 117q0 26 -5 58q82 16 144 16q44 0 71.5 -1.5t48.5 -8.5t31 -13.5t20.5 -24.5t15.5 -33.5t17 -47.5t24 -60l50 25q-3 -40 -23 -60t-42.5 -21t-40 -6.5t-16.5 -20.5l1 -21q75 3 143.5 -20.5 t118 -58.5t101 -94.5t84 -108t75.5 -120.5q33 -56 78.5 -109t75.5 -80.5t99 -88.5q-48 -30 -108.5 -57.5t-138.5 -59t-114 -47.5q-44 37 -74 115t-43.5 164.5t-33 180.5t-42.5 168.5t-72.5 123t-122.5 48.5l-10 -2l-6 -4q4 -5 13 -14q6 -5 28 -23.5t25.5 -22t19 -18 t18 -20.5t11.5 -21t10.5 -27.5t4.5 -31t4 -40.5l1 -33q1 -26 -2.5 -57.5t-7.5 -52t-12.5 -58.5t-11.5 -53q-35 1 -101 -9.5t-98 -10.5q-39 0 -72 10q-2 16 -2 47q0 74 3 96q2 13 31.5 41.5t57 59t26.5 51.5q-24 2 -43 -24q-36 -53 -111.5 -99.5t-136.5 -46.5q-25 0 -75.5 63 t-106.5 139.5t-84 96.5q-6 4 -27 30q-482 -112 -513 -112q-16 0 -28 11t-12 27zM764 676q10 1 32.5 7t34.5 6q19 0 35 -10l-96 -20zM822 568l48 12l109 -177l-73 -48zM859 884q16 30 36 46.5t54 29.5t65.5 36t46 36.5t50 55t43.5 50.5q12 -9 28 -31.5t32 -36.5t38 -13l12 1 v-76l22 -1q247 95 371 190q28 21 50 39t42.5 37.5t33 31t29.5 34t24 31t24.5 37t23 38t27 47.5t29.5 53l7 9q-2 -53 -43 -139q-79 -165 -205 -264t-306 -142q-14 -3 -42 -7.5t-50 -9.5t-39 -14q3 -19 24.5 -46t21.5 -34q0 -11 -26 -30q-5 5 -13.5 15.5t-12 14.5t-10.5 11.5 t-10 10.5l-8 8t-8.5 7.5t-8 5t-8.5 4.5q-7 3 -14.5 5t-20.5 2.5t-22 0.5h-32.5h-37.5q-126 0 -217 -43zM1061 45h31l10 -83l-41 -12v95zM1061 -79q39 26 131.5 47.5t146.5 21.5q9 0 22.5 -15.5t28 -42.5t26 -50t24 -51t14.5 -33q-121 -45 -244 -45q-61 0 -125 11zM1116 29 q21 2 60.5 8.5t72 10t60.5 3.5h14q3 -15 3 -16q0 -7 -17.5 -14.5t-46 -13t-54 -9.5t-53.5 -7.5t-32 -4.5zM1947 1528l1 3l2 4l-1 -5zM1950 1535v1v-1zM1950 1535l1 1z" /> | |||
<glyph unicode="" d="M0 520q0 89 19.5 172.5t49 145.5t70.5 118.5t78.5 94t78.5 69.5t64.5 46.5t42.5 24.5q14 8 51 26.5t54.5 28.5t48 30t60.5 44q36 28 58 72.5t30 125.5q129 -155 186 -193q44 -29 130 -68t129 -66q21 -13 39 -25t60.5 -46.5t76 -70.5t75 -95t69 -122t47 -148.5 t19.5 -177.5q0 -164 -62 -304.5t-166 -236t-242.5 -149.5t-290.5 -54t-293 57.5t-247.5 157t-170.5 241.5t-64 302zM333 256q-2 -112 74 -164q29 -20 62.5 -28.5t103.5 -8.5q57 0 132 32.5t134 71t120 70.5t93 31q26 -1 65 -31.5t71.5 -67t68 -67.5t55.5 -32q35 -3 58.5 14 t55.5 63q28 41 42.5 101t14.5 106q0 22 -5 44.5t-16.5 45t-34 36.5t-52.5 14q-33 0 -97 -41.5t-129 -83.5t-101 -42q-27 -1 -63.5 19t-76 49t-83.5 58t-100 49t-111 19q-115 -1 -197 -78.5t-84 -178.5zM685.5 -76q-0.5 -10 7.5 -20q34 -32 87.5 -46t102.5 -12.5t99 4.5 q41 4 84.5 20.5t65 30t28.5 20.5q12 12 7 29q-5 19 -24 5q-30 -22 -87 -39t-131 -17q-129 0 -193 49q-5 4 -13 4q-11 0 -26 -12q-7 -6 -7.5 -16zM852 31q9 -8 17.5 -4.5t31.5 23.5q3 2 10.5 8.5t10.5 8.5t10 7t11.5 7t12.5 5t15 4.5t16.5 2.5t20.5 1q27 0 44.5 -7.5 t23 -14.5t13.5 -22q10 -17 12.5 -20t12.5 1q23 12 14 34q-19 47 -39 61q-23 15 -76 15q-47 0 -71 -10q-29 -12 -78 -56q-26 -24 -12 -44z" /> | |||
<glyph unicode="" d="M0 78q0 72 44.5 128t113.5 72q-22 86 1 173t88 152l12 12l151 -152l-11 -11q-37 -37 -37 -89t37 -90q37 -37 89 -37t89 37l30 30l151 152l161 160l151 -152l-160 -160l-151 -152l-30 -30q-65 -64 -151.5 -87t-171.5 -2q-16 -70 -72 -115t-129 -45q-85 0 -145 60.5 t-60 145.5zM2 1202q0 85 60 145.5t145 60.5q76 0 133.5 -49t69.5 -123q84 20 169.5 -3.5t149.5 -87.5l12 -12l-152 -152l-12 12q-37 37 -89 37t-89 -37t-37 -89.5t37 -89.5l29 -29l152 -152l160 -160l-151 -152l-161 160l-151 152l-30 30q-68 67 -90 159.5t5 179.5 q-70 15 -115 71t-45 129zM446 803l161 160l152 152l29 30q67 67 159 89.5t178 -3.5q11 75 68.5 126t135.5 51q85 0 145 -60.5t60 -145.5q0 -77 -51 -135t-127 -69q26 -85 3 -176.5t-90 -158.5l-12 -12l-151 152l12 12q37 37 37 89t-37 89t-89 37t-89 -37l-30 -30l-152 -152 l-160 -160zM776 793l152 152l160 -160l152 -152l29 -30q64 -64 87.5 -150.5t2.5 -171.5q76 -11 126.5 -68.5t50.5 -134.5q0 -85 -60 -145.5t-145 -60.5q-74 0 -131 47t-71 118q-86 -28 -179.5 -6t-161.5 90l-11 12l151 152l12 -12q37 -37 89 -37t89 37t37 89t-37 89l-30 30 l-152 152z" /> | |||
<glyph unicode="" d="M0 -16v1078q3 9 4 10q5 6 20 11q106 35 149 50v384l558 -198q2 0 160.5 55t316 108.5t161.5 53.5q20 0 20 -21v-418l147 -47v-1079l-774 246q-14 -6 -375 -127.5t-368 -121.5q-13 0 -18 13q0 1 -1 3zM39 15l694 232v1032l-694 -233v-1031zM147 293q6 4 82 92 q21 24 85.5 115t78.5 118q17 30 51 98.5t36 77.5q-8 1 -110 -33q-8 -2 -27.5 -7.5t-34.5 -9.5t-17 -5q-2 -2 -2 -10.5t-1 -9.5q-5 -10 -31 -15q-23 -7 -47 0q-18 4 -28 21q-4 6 -5 23q6 2 24.5 5t29.5 6q58 16 105 32q100 35 102 35q10 2 43 19.5t44 21.5q9 3 21.5 8 t14.5 5.5t6 -0.5q2 -12 -1 -33q0 -2 -12.5 -27t-26.5 -53.5t-17 -33.5q-25 -50 -77 -131l64 -28q12 -6 74.5 -32t67.5 -28q4 -1 10.5 -25.5t4.5 -30.5q-1 -3 -12.5 0.5t-31.5 11.5l-20 9q-44 20 -87 49q-7 5 -41 31.5t-38 28.5q-67 -103 -134 -181q-81 -95 -105 -110 q-4 -2 -19.5 -4t-18.5 0zM268 933l1 3q3 -3 19.5 -5t26.5 0t58 16q36 12 55 14q17 0 21 -17q3 -15 -4 -28q-12 -23 -50 -38q-30 -12 -60 -12q-26 3 -49 26q-14 15 -18 41zM310 -116q0 8 5 13.5t13 5.5q4 0 18 -7.5t30.5 -16.5t20.5 -11q73 -37 159.5 -61.5t157.5 -24.5 q95 0 167 14.5t157 50.5q15 7 30.5 15.5t34 19t28.5 16.5l-43 73l158 -13l-54 -160l-40 66q-130 -83 -276 -108q-58 -12 -91 -12h-84q-79 0 -199.5 39t-183.5 85q-8 7 -8 16zM777 1294l573 -184v380zM885 453l102 -31l45 110l211 -65l37 -135l102 -31l-181 657l-100 31z M1071 630l76 185l63 -227z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 -96v1088q0 66 47 113t113 47h128q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-128q-66 0 -113 47t-47 113zM512 -96v1536q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-163q58 -34 93 -93t35 -128v-768q0 -106 -75 -181 t-181 -75h-864q-66 0 -113 47t-47 113zM640 896h896v256h-160q-40 0 -68 28t-28 68v160h-640v-512zM736 0q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128zM736 256q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v128q0 14 -9 23t-23 9 h-128q-14 0 -23 -9t-9 -23v-128zM736 512q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128zM992 0q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128zM992 256q0 -14 9 -23t23 -9h128 q14 0 23 9t9 23v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128zM992 512q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128zM1248 0q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23 v-128zM1248 256q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128zM1248 512q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128z" /> | |||
<glyph unicode="" d="M0 -192v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45zM256 160q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM256 416q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM256 672q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM256 928q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM256 1184q0 -14 9 -23 t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM512 96v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23zM512 416q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9 t-9 -23v-64zM512 672q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM512 928q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM512 1184q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM768 416q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM768 672q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM768 928q0 -14 9 -23 t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM768 1184q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM1024 160q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9 t-9 -23v-64zM1024 416q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM1024 672q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM1024 928q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM1024 1184q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64z" /> | |||
<glyph unicode="" horiz-adv-x="1280" d="M64 1056q0 40 28 68t68 28t68 -28l228 -228h368l228 228q28 28 68 28t68 -28t28 -68t-28 -68l-292 -292v-824q0 -46 -33 -79t-79 -33t-79 33t-33 79v384h-64v-384q0 -46 -33 -79t-79 -33t-79 33t-33 79v824l-292 292q-28 28 -28 68zM416 1152q0 93 65.5 158.5t158.5 65.5 t158.5 -65.5t65.5 -158.5t-65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5z" /> | |||
<glyph unicode="" horiz-adv-x="1664" d="M0 724q0 80 42 139.5t119 59.5q76 0 141.5 -55.5t100.5 -134t35 -152.5q0 -80 -42 -139t-119 -59q-76 0 -141.5 55.5t-100.5 133.5t-35 152zM256 19q0 86 56 191.5t139.5 192.5t187.5 146t193 59q118 0 255 -97.5t229 -237t92 -254.5q0 -46 -17 -76.5t-48.5 -45 t-64.5 -20t-76 -5.5q-68 0 -187.5 45t-182.5 45q-66 0 -192.5 -44.5t-200.5 -44.5q-183 0 -183 146zM333 1163q0 60 19 113.5t63 92.5t105 39q77 0 138.5 -57.5t91.5 -135t30 -151.5q0 -60 -19 -113.5t-63 -92.5t-105 -39q-76 0 -138 57.5t-92 135.5t-30 151zM884 1064 q0 74 30 151.5t91.5 135t138.5 57.5q61 0 105 -39t63 -92.5t19 -113.5q0 -73 -30 -151t-92 -135.5t-138 -57.5q-61 0 -105 39t-63 92.5t-19 113.5zM1226 581q0 74 35 152.5t100.5 134t141.5 55.5q77 0 119 -59.5t42 -139.5q0 -74 -35 -152t-100.5 -133.5t-141.5 -55.5 q-77 0 -119 59t-42 139z" /> | |||
<glyph unicode="" horiz-adv-x="768" d="M64 1008q0 128 42.5 249.5t117.5 200t160 78.5t160 -78.5t117.5 -200t42.5 -249.5q0 -145 -57 -243.5t-152 -135.5l45 -821q2 -26 -16 -45t-44 -19h-192q-26 0 -44 19t-16 45l45 821q-95 37 -152 135.5t-57 243.5z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 256v768q0 40 23 73t61 47l704 256q22 8 44 8t44 -8l704 -256q38 -14 61 -47t23 -73v-768q0 -35 -18 -65t-49 -47l-704 -384q-28 -16 -61 -16t-61 16l-704 384q-31 17 -49 47t-18 65zM134 1026l698 -254l698 254l-698 254zM896 -93l640 349v636l-640 -233v-752z" /> | |||
<glyph unicode="" horiz-adv-x="2304" d="M0 96v416q0 38 21.5 70t56.5 48l434 186v400q0 38 21.5 70t56.5 48l448 192q23 10 50 10t50 -10l448 -192q35 -16 56.5 -48t21.5 -70v-400l434 -186q36 -16 57 -48t21 -70v-416q0 -36 -19 -67t-52 -47l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-5 2 -7 4q-2 -2 -7 -4 l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-33 16 -52 47t-19 67zM172 531l404 -173l404 173l-404 173zM640 -96l384 192v314l-384 -164v-342zM647 1219l441 -189l441 189l-441 189zM1152 651l384 165v266l-384 -164v-267zM1196 531l404 -173l404 173l-404 173zM1664 -96 l384 192v314l-384 -164v-342z" /> | |||
<glyph unicode="" horiz-adv-x="2048" d="M0 22v1260h594q87 0 155 -14t126.5 -47.5t90 -96.5t31.5 -154q0 -181 -172 -263q114 -32 172 -115t58 -204q0 -75 -24.5 -136.5t-66 -103.5t-98.5 -71t-121 -42t-134 -13h-611zM277 236h296q205 0 205 167q0 180 -199 180h-302v-347zM277 773h281q78 0 123.5 36.5 t45.5 113.5q0 144 -190 144h-260v-294zM1137 477q0 208 130.5 345.5t336.5 137.5q138 0 240.5 -68t153 -179t50.5 -248q0 -17 -2 -47h-658q0 -111 57.5 -171.5t166.5 -60.5q63 0 122 32t76 87h221q-100 -307 -427 -307q-214 0 -340.5 132t-126.5 347zM1337 1073h511v124 h-511v-124zM1388 576h408q-18 195 -200 195q-90 0 -146 -52.5t-62 -142.5z" /> | |||
<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM128 254h382q117 0 197 57.5t80 170.5q0 158 -143 200q107 52 107 164q0 57 -19.5 96.5t-56.5 60.5t-79 29.5 t-97 8.5h-371v-787zM301 388v217h189q124 0 124 -113q0 -104 -128 -104h-185zM301 723v184h163q119 0 119 -90q0 -94 -106 -94h-176zM838 538q0 -135 79 -217t213 -82q205 0 267 191h-138q-11 -34 -47.5 -54t-75.5 -20q-68 0 -104 38t-36 107h411q1 10 1 30 q0 132 -74.5 220.5t-203.5 88.5q-128 0 -210 -86t-82 -216zM964 911v77h319v-77h-319zM996 600q4 56 39 89t91 33q113 0 124 -122h-254z" /> | |||
<glyph unicode="" horiz-adv-x="2048" d="M0 764q0 86 61 146.5t146 60.5q73 0 130 -46t73 -117l783 -315q49 29 106 29q14 0 21 -1l173 248q1 114 82 194.5t195 80.5q115 0 196.5 -81t81.5 -196t-81.5 -196.5t-196.5 -81.5l-265 -194q-8 -80 -67.5 -133.5t-138.5 -53.5q-73 0 -130 46t-73 117l-783 315 q-51 -30 -106 -30q-85 0 -146 61t-61 147zM55 764q0 -64 44.5 -108.5t107.5 -44.5q11 0 33 4l-64 26q-33 14 -52.5 44.5t-19.5 66.5q0 50 35.5 85.5t85.5 35.5q20 0 41 -8v1l76 -31q-20 37 -56.5 59t-78.5 22q-63 0 -107.5 -44.5t-44.5 -107.5zM1164 244q19 -37 55.5 -59 t79.5 -22q63 0 107.5 44.5t44.5 107.5t-44.5 108t-107.5 45q-13 0 -33 -4q2 -1 20 -8t21.5 -8.5t18.5 -8.5t19 -10t16 -11t15.5 -13.5t11 -14.5t10 -18t5 -21t2.5 -25q0 -50 -35.5 -85.5t-85.5 -35.5q-14 0 -31.5 4.5t-29 9t-31.5 13.5t-28 12zM1584 767q0 -77 54.5 -131.5 t131.5 -54.5t132 54.5t55 131.5t-55 131.5t-132 54.5q-76 0 -131 -54.5t-55 -131.5zM1623 767q0 62 43.5 105.5t104.5 43.5t105 -44t44 -105t-43.5 -104.5t-105.5 -43.5q-61 0 -104.5 43.5t-43.5 104.5z" /> | |||
<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM128 693q0 -53 38 -91t92 -38q36 0 66 18l489 -197q10 -44 45.5 -73t81.5 -29q50 0 86.5 34t41.5 83l167 122 q71 0 122 50.5t51 122.5t-51 123t-122 51q-72 0 -122.5 -50.5t-51.5 -121.5l-108 -155q-2 0 -6.5 0.5t-6.5 0.5q-35 0 -67 -19l-489 197q-10 44 -45.5 73t-80.5 29q-54 0 -92 -38t-38 -92zM162 693q0 40 28 68t68 28q27 0 49.5 -14t34.5 -37l-48 19q-29 11 -56.5 -2 t-38.5 -41q-12 -29 -0.5 -57t39.5 -40v-1l40 -16q-14 -2 -20 -2q-40 0 -68 27.5t-28 67.5zM855 369q5 -2 47 -19q29 -12 58 0.5t41 41.5q11 29 -1 57.5t-41 40.5l-40 16q14 2 21 2q39 0 67 -27.5t28 -67.5t-28 -67.5t-67 -27.5q-59 0 -85 51zM1118 695q0 48 34 82t83 34 q48 0 82 -34t34 -82t-34 -82t-82 -34q-49 0 -83 34t-34 82zM1142 696q0 -39 27.5 -66t65.5 -27t65.5 27t27.5 66q0 38 -27.5 65.5t-65.5 27.5t-65.5 -27.5t-27.5 -65.5z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M16 970l433 -17l180 -379l-147 92q-63 -72 -111.5 -144.5t-72.5 -125t-39.5 -94.5t-18.5 -63l-4 -21l-190 357q-17 26 -18 56t6 47l8 18q35 63 114 188zM270.5 158q-3.5 28 4 65t12 55t21.5 64t19 53q78 -12 509 -28l-15 -368l-2 -22l-420 29q-36 3 -67 31.5t-47 65.5 q-11 27 -14.5 55zM294 1124l225 356q20 31 60 45t80 10q24 -2 48.5 -12t42 -21t41.5 -33t36 -34.5t36 -39.5t32 -35q-47 -63 -265 -435l-317 187zM782 1524l405 -1q31 3 58 -10.5t39 -28.5l11 -15q39 -61 112 -190l142 83l-220 -373l-419 20l151 86q-34 89 -75 166 t-75.5 123.5t-64.5 80t-47 46.5zM953 197l211 362l7 -173q170 -16 283 -5t170 33l56 22l-188 -359q-12 -29 -36.5 -46.5t-43.5 -20.5l-18 -4q-71 -7 -219 -12l8 -164zM1218 847l313 195l19 11l212 -363q18 -37 12.5 -76t-27.5 -74q-13 -20 -33 -37t-38 -28t-48.5 -22 t-47 -16t-51.5 -14t-46 -12q-34 72 -265 436z" /> | |||
<glyph unicode="" horiz-adv-x="1984" d="M0 160v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5t179 63.5h704q98 0 179 -63.5t104 -157.5l105 -419h28q93 0 158.5 -65.5t65.5 -158.5v-384q0 -14 -9 -23t-23 -9h-128v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-928v-128q0 -80 -56 -136 t-136 -56t-136 56t-56 136v128h-96q-14 0 -23 9t-9 23zM160 448q0 -66 47 -113t113 -47t113 47t47 113t-47 113t-113 47t-113 -47t-47 -113zM516 768h952l-89 357q-2 8 -14 17.5t-21 9.5h-704q-9 0 -21 -9.5t-14 -17.5zM1472 448q0 -66 47 -113t113 -47t113 47t47 113 t-47 113t-113 47t-113 -47t-47 -113z" /> | |||
<glyph unicode="" horiz-adv-x="1984" d="M0 32v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5t179 63.5h128v224q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-224h64q98 0 179 -63.5t104 -157.5l105 -419h28q93 0 158.5 -65.5t65.5 -158.5v-384q0 -14 -9 -23t-23 -9h-128v-64q0 -80 -56 -136t-136 -56 t-136 56t-56 136v64h-928v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-96q-14 0 -23 9t-9 23zM160 320q0 -66 47 -113t113 -47t113 47t47 113t-47 113t-113 47t-113 -47t-47 -113zM516 640h952l-89 357q-2 8 -14 17.5t-21 9.5h-704q-9 0 -21 -9.5t-14 -17.5zM1472 320 q0 -66 47 -113t113 -47t113 47t47 113t-47 113t-113 47t-113 -47t-47 -113z" /> | |||
<glyph unicode="" d="M32 64q0 26 19 45l402 403h-229q-26 0 -45 19t-19 45t19 45l402 403h-197q-26 0 -45 19t-19 45t19 45l384 384q19 19 45 19t45 -19l384 -384q19 -19 19 -45t-19 -45t-45 -19h-197l402 -403q19 -19 19 -45t-19 -45t-45 -19h-229l402 -403q19 -19 19 -45t-19 -45t-45 -19 h-462q1 -17 6 -87.5t5 -108.5q0 -25 -18 -42.5t-43 -17.5h-320q-25 0 -43 17.5t-18 42.5q0 38 5 108.5t6 87.5h-462q-26 0 -45 19t-19 45z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM237 886q0 -31 20.5 -52t51.5 -21q11 0 40 8q133 37 307 37q159 0 309.5 -34t253.5 -95q21 -12 40 -12 q29 0 50.5 20.5t21.5 51.5q0 47 -40 70q-126 73 -293 110.5t-343 37.5q-204 0 -364 -47q-23 -7 -38.5 -25.5t-15.5 -48.5zM289 637q0 -25 17.5 -42.5t42.5 -17.5q7 0 37 8q122 33 251 33q279 0 488 -124q24 -13 38 -13q25 0 42.5 17.5t17.5 42.5q0 40 -35 61 q-237 141 -548 141q-153 0 -303 -42q-48 -13 -48 -64zM321 406q0 -20 13.5 -34.5t35.5 -14.5q5 0 37 8q132 27 243 27q226 0 397 -103q19 -11 33 -11q19 0 33 13.5t14 34.5q0 32 -30 51q-193 115 -447 115q-133 0 -287 -34q-42 -9 -42 -52z" /> | |||
<glyph unicode="" d="M0 11v1258q0 58 40.5 98.5t98.5 40.5h1258q58 0 98.5 -40.5t40.5 -98.5v-1258q0 -58 -40.5 -98.5t-98.5 -40.5h-1258q-58 0 -98.5 40.5t-40.5 98.5zM71 11q0 -28 20 -48t48 -20h1258q28 0 48 20t20 48v1258q0 28 -20 48t-48 20h-1258q-28 0 -48 -20t-20 -48v-1258z M121 11v141l711 195l-212 439q4 1 12 2.5t12 1.5q170 32 303.5 21.5t221 -46t143.5 -94.5q27 -28 -25 -42q-64 -16 -256 -62l-97 198q-111 7 -240 -16l188 -387l533 145v-496q0 -7 -5.5 -12.5t-12.5 -5.5h-1258q-7 0 -12.5 5.5t-5.5 12.5zM121 709v560q0 7 5.5 12.5 t12.5 5.5h1258q7 0 12.5 -5.5t5.5 -12.5v-428q-85 30 -188 52q-294 64 -645 12l-18 -3l-65 134h-233l85 -190q-132 -51 -230 -137zM246 413q-24 203 166 305l129 -270l-255 -61q-14 -3 -26 4.5t-14 21.5z" /> | |||
<glyph unicode="" horiz-adv-x="2304" d="M0 405l17 128q2 9 9 9t9 -9l20 -128l-20 -126q-2 -9 -9 -9t-9 9zM79 405l23 207q0 9 9 9q8 0 10 -9l26 -207l-26 -203q-2 -9 -10 -9q-9 0 -9 10zM169 405l21 245q2 12 12 12q11 0 11 -12l25 -245l-25 -237q0 -11 -11 -11q-10 0 -12 11zM259 405l21 252q0 13 13 13 q12 0 14 -13l23 -252l-23 -244q-2 -13 -14 -13q-13 0 -13 13zM350 405l20 234q0 6 4.5 10.5t10.5 4.5q14 0 16 -15l21 -234l-21 -246q-2 -16 -16 -16q-6 0 -10.5 4.5t-4.5 11.5zM401 159zM442 405l18 380q2 18 18 18q7 0 12 -5.5t5 -12.5l21 -380l-21 -246q0 -7 -5 -12.5 t-12 -5.5q-16 0 -18 18zM534 403l16 468q2 19 20 19q8 0 13.5 -5.5t5.5 -13.5l19 -468l-19 -244q0 -8 -5.5 -13.5t-13.5 -5.5q-18 0 -20 19zM628 405l16 506q0 9 6.5 15.5t14.5 6.5q9 0 15 -6.5t7 -15.5l18 -506l-18 -242q-2 -21 -22 -21q-19 0 -21 21zM723 405l14 -241 q1 -10 7.5 -16.5t15.5 -6.5q22 0 24 23l16 241l-16 523q-1 10 -7.5 17t-16.5 7q-9 0 -16 -7t-7 -17zM784 164zM817 405l14 510q0 11 7.5 18t17.5 7t17.5 -7t7.5 -18l15 -510l-15 -239q0 -10 -7.5 -17.5t-17.5 -7.5t-17 7t-8 18zM913 404l12 492q1 12 9 20t19 8t18.5 -8 t8.5 -20l14 -492l-14 -236q0 -11 -8 -19t-19 -8t-19 8t-9 19zM1010 405q0 -1 11 -236v-1q0 -10 6 -17q9 -11 23 -11q11 0 20 9q9 7 9 20l1 24l11 211l-12 586q0 16 -13 24q-8 5 -16 5t-16 -5q-13 -8 -13 -24l-1 -6zM1079 169zM1103 404l12 636v3q2 15 12 24q9 7 20 7 q8 0 15 -5q14 -8 16 -26l14 -639l-14 -231q0 -13 -9 -22t-22 -9t-22 9t-10 22l-6 114zM1204 174v899q0 23 28 33q85 34 181 34q195 0 338 -131.5t160 -323.5q53 22 110 22q117 0 200 -83t83 -201q0 -117 -83 -199.5t-200 -82.5h-786q-13 2 -22 11t-9 22z" /> | |||
<glyph unicode="" d="M0 0v170q119 -84 325 -127t443 -43t443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128zM0 384v170q119 -84 325 -127t443 -43t443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128zM0 768 v170q119 -84 325 -127t443 -43t443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128zM0 1152v128q0 69 103 128t280 93.5t385 34.5t385 -34.5t280 -93.5t103 -128v-128q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5 t-103 128z" /> | |||
<glyph unicode="" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM257 60q9 40 56 91.5t132 96.5q14 9 23 -6q2 -2 2 -4 q52 85 107 197q68 136 104 262q-24 82 -30.5 159.5t6.5 127.5q11 40 42 40h21h1q23 0 35 -15q18 -21 9 -68q-2 -6 -4 -8q1 -3 1 -8v-30q-2 -123 -14 -192q55 -164 146 -238q33 -26 84 -56q59 7 117 7q147 0 177 -49q16 -22 2 -52q0 -1 -1 -2l-2 -2v-1q-6 -38 -71 -38 q-48 0 -115 20t-130 53q-221 -24 -392 -83q-153 -262 -242 -262q-15 0 -28 7l-24 12q-1 1 -6 5q-10 10 -6 36zM318 54q52 24 137 158q-51 -40 -87.5 -84t-49.5 -74zM592 313q135 54 284 81q-2 1 -13 9.5t-16 13.5q-76 67 -127 176q-27 -86 -83 -197q-30 -56 -45 -83z M714 842q1 7 7 44q0 3 7 43q1 4 4 8q-1 1 -1 2t-0.5 1.5t-0.5 1.5q-1 22 -13 36q0 -1 -1 -2v-2q-15 -42 -2 -132zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376zM1098 353q76 -28 124 -28q14 0 18 1q0 1 -2 3q-24 24 -140 24z" /> | |||
<glyph unicode="" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM233 661h70l164 -661h159l128 485q7 20 10 46q2 16 2 24 h4l3 -24q1 -3 3.5 -20t5.5 -26l128 -485h159l164 661h70v107h-300v-107h90l-99 -438q-5 -20 -7 -46l-2 -21h-4l-3 21q-1 5 -4 21t-5 25l-144 545h-114l-144 -545q-2 -9 -4.5 -24.5t-3.5 -21.5l-4 -21h-4l-2 21q-2 26 -7 46l-99 438h90v107h-300v-107zM1024 1024h376 q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" /> | |||
<glyph unicode="" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM429 0h281v106h-75l103 161q5 7 10 16.5t7.5 13.5t3.5 4 h2q1 -4 5 -10q2 -4 4.5 -7.5t6 -8t6.5 -8.5l107 -161h-76v-106h291v106h-68l-192 273l195 282h67v107h-279v-107h74l-103 -159q-4 -7 -10 -16.5t-9 -13.5l-2 -3h-2q-1 4 -5 10q-6 11 -17 23l-106 159h76v107h-290v-107h68l189 -272l-194 -283h-68v-106zM1024 1024h376 q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" /> | |||
<glyph unicode="" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM416 0h327v106h-93v167h137q76 0 118 15q67 23 106.5 87 t39.5 146q0 81 -37 141t-100 87q-48 19 -130 19h-368v-107h92v-555h-92v-106zM650 386v268h120q52 0 83 -18q56 -33 56 -115q0 -89 -62 -120q-31 -15 -78 -15h-119zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" /> | |||
<glyph unicode="" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM256 0v192l192 192l128 -128l384 384l320 -320v-320 h-1024zM256 704q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" /> | |||
<glyph unicode="" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-128v-128h-128v128h-512v-1536zM384 192q0 25 8 52q21 63 120 396 v128h128v-128h79q22 0 39 -13t23 -34l107 -349q8 -27 8 -52q0 -83 -72.5 -137.5t-183.5 -54.5t-183.5 54.5t-72.5 137.5zM512 192q0 -26 37.5 -45t90.5 -19t90.5 19t37.5 45t-37.5 45t-90.5 19t-90.5 -19t-37.5 -45zM512 896h128v128h-128v-128zM512 1152h128v128h-128v-128 zM640 768h128v128h-128v-128zM640 1024h128v128h-128v-128zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" /> | |||
<glyph unicode="" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM256 288v192q0 14 9 23t23 9h131l166 167q16 15 35 7 q20 -8 20 -30v-544q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-166 167h-131q-14 0 -23 9t-9 23zM762 206.5q1 -26.5 20 -44.5q20 -17 44 -17q27 0 47 20q87 93 87 219t-87 219q-18 19 -45 20t-46 -17t-20 -44.5t18 -46.5q52 -57 52 -131t-52 -131q-19 -20 -18 -46.5z M973.5 54.5q2.5 -26.5 23.5 -42.5q18 -15 40 -15q31 0 50 24q129 159 129 363t-129 363q-16 21 -43 24t-47 -14q-21 -17 -23.5 -43.5t14.5 -47.5q100 -123 100 -282t-100 -282q-17 -21 -14.5 -47.5zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" /> | |||
<glyph unicode="" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM256 256v384q0 52 38 90t90 38h384q52 0 90 -38t38 -90 v-384q0 -52 -38 -90t-90 -38h-384q-52 0 -90 38t-38 90zM960 403v90l265 266q9 9 23 9q4 0 12 -2q20 -8 20 -30v-576q0 -22 -20 -30q-8 -2 -12 -2q-14 0 -23 9zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" /> | |||
<glyph unicode="" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM254 429q-14 19 0 38l226 301q8 11 21 12.5t24 -6.5 l51 -38q11 -8 12.5 -21t-6.5 -24l-182 -243l182 -243q8 -11 6.5 -24t-12.5 -21l-51 -38q-11 -8 -24 -6.5t-21 12.5zM636 43l138 831q2 13 13 20.5t24 5.5l63 -10q13 -2 20.5 -13t5.5 -24l-138 -831q-2 -13 -13 -20.5t-24 -5.5l-63 10q-13 2 -20.5 13t-5.5 24zM947.5 181 q-1.5 13 6.5 24l182 243l-182 243q-8 11 -6.5 24t12.5 21l51 38q11 8 24 6.5t21 -12.5l226 -301q14 -19 0 -38l-226 -301q-8 -11 -21 -12.5t-24 6.5l-51 38q-11 8 -12.5 21zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" /> | |||
<glyph unicode="" d="M39 1286h283q26 -218 70 -398.5t104.5 -317t121.5 -235.5t140 -195q169 169 287 406q-142 72 -223 220t-81 333q0 192 104 314.5t284 122.5q178 0 273 -105.5t95 -297.5q0 -159 -58 -286q-7 -1 -19.5 -3t-46 -2t-63 6t-62 25.5t-50.5 51.5q31 103 31 184q0 87 -29 132 t-79 45q-53 0 -85 -49.5t-32 -140.5q0 -186 105 -293.5t267 -107.5q62 0 121 14v-198q-101 -23 -198 -23q-65 -136 -165.5 -271t-181.5 -215.5t-128 -106.5q-80 -45 -162 3q-28 17 -60.5 43.5t-85 83.5t-102.5 128.5t-107.5 184t-105.5 244t-91.5 314.5t-70.5 390z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 367v546q0 41 34 64l819 546q21 13 43 13t43 -13l819 -546q34 -23 34 -64v-546q0 -41 -34 -64l-819 -546q-21 -13 -43 -13t-43 13l-819 546q-34 23 -34 64zM154 511l193 129l-193 129v-258zM216 367l603 -402v359l-334 223zM216 913l269 -180l334 223v359zM624 640 l272 -182l272 182l-272 182zM973 -35l603 402l-269 180l-334 -223v-359zM973 956l334 -223l269 180l-603 402v-359zM1445 640l193 -129v258z" /> | |||
<glyph unicode="" horiz-adv-x="2048" d="M0 407q0 110 55 203t147 147q-12 39 -12 82q0 115 82 196t199 81q95 0 172 -58q75 154 222.5 248t326.5 94q166 0 306 -80.5t221.5 -218.5t81.5 -301q0 -6 -0.5 -18t-0.5 -18q111 -46 179.5 -145.5t68.5 -221.5q0 -164 -118 -280.5t-285 -116.5q-4 0 -11.5 0.5t-10.5 0.5 h-1209h-1h-2h-5q-170 10 -288 125.5t-118 280.5zM468 498q0 -122 84 -193t208 -71q137 0 240 99q-16 20 -47.5 56.5t-43.5 50.5q-67 -65 -144 -65q-55 0 -93.5 33.5t-38.5 87.5q0 53 38.5 87t91.5 34q44 0 84.5 -21t73 -55t65 -75t69 -82t77 -75t97 -55t121.5 -21 q121 0 204.5 71.5t83.5 190.5q0 121 -84 192t-207 71q-143 0 -241 -97q14 -16 29.5 -34t34.5 -40t29 -34q66 64 142 64q52 0 92 -33t40 -84q0 -57 -37 -91.5t-94 -34.5q-43 0 -82.5 21t-72 55t-65.5 75t-69.5 82t-77.5 75t-96.5 55t-118.5 21q-122 0 -207 -70.5t-85 -189.5z " /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 640q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348zM128 640q0 -190 90 -361l194 194q-28 82 -28 167t28 167l-194 194q-90 -171 -90 -361zM512 640 q0 -159 112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5zM535 -38q171 -90 361 -90t361 90l-194 194q-82 -28 -167 -28t-167 28zM535 1318l194 -194q82 28 167 28t167 -28l194 194q-171 90 -361 90t-361 -90z M1380 473l194 -194q90 171 90 361t-90 361l-194 -194q28 -82 28 -167t-28 -167z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 640q0 222 101 414.5t276.5 317t390.5 155.5v-260q-221 -45 -366.5 -221t-145.5 -406q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5q0 230 -145.5 406t-366.5 221v260q215 -31 390.5 -155.5t276.5 -317t101 -414.5 q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M19 662q8 217 116 406t305 318h5q0 -1 -1 -3q-8 -8 -28 -33.5t-52 -76.5t-60 -110.5t-44.5 -135.5t-14 -150.5t39 -157.5t108.5 -154q50 -50 102 -69.5t90.5 -11.5t69.5 23.5t47 32.5l16 16q39 51 53 116.5t6.5 122.5t-21 107t-26.5 80l-14 29q-10 25 -30.5 49.5t-43 41 t-43.5 29.5t-35 19l-13 6l104 115q39 -17 78 -52t59 -61l19 -27q1 48 -18.5 103.5t-40.5 87.5l-20 31l161 183l160 -181q-33 -46 -52.5 -102.5t-22.5 -90.5l-4 -33q22 37 61.5 72.5t67.5 52.5l28 17l103 -115q-44 -14 -85 -50t-60 -65l-19 -29q-31 -56 -48 -133.5t-7 -170 t57 -156.5q33 -45 77.5 -60.5t85 -5.5t76 26.5t57.5 33.5l21 16q60 53 96.5 115t48.5 121.5t10 121.5t-18 118t-37 107.5t-45.5 93t-45 72t-34.5 47.5l-13 17q-14 13 -7 13l10 -3q40 -29 62.5 -46t62 -50t64 -58t58.5 -65t55.5 -77t45.5 -88t38 -103t23.5 -117t10.5 -136 q3 -259 -108 -465t-312 -321t-456 -115q-185 0 -351 74t-283.5 198t-184 293t-60.5 353z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 640q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348zM44 640q0 -173 67.5 -331t181.5 -272t272 -181.5t331 -67.5t331 67.5t272 181.5t181.5 272t67.5 331 t-67.5 331t-181.5 272t-272 181.5t-331 67.5t-331 -67.5t-272 -181.5t-181.5 -272t-67.5 -331zM87 640q0 205 98 385l57 -33q-30 -56 -49 -112l82 -28q-35 -100 -35 -212q0 -109 36 -212l-83 -28q22 -60 49 -112l-57 -33q-98 180 -98 385zM206 217l58 34q29 -49 73 -99 l65 57q148 -168 368 -212l-17 -86q65 -12 121 -13v-66q-208 6 -385 109.5t-283 275.5zM207 1063q106 172 282 275.5t385 109.5v-66q-65 -2 -121 -13l17 -86q-220 -42 -368 -211l-65 56q-38 -42 -73 -98zM415 805q33 93 99 169l185 -162q59 68 147 86l-48 240q44 10 98 10 t98 -10l-48 -240q88 -18 147 -86l185 162q66 -76 99 -169l-233 -80q14 -42 14 -85t-14 -85l232 -80q-31 -92 -98 -169l-185 162q-57 -67 -147 -85l48 -241q-52 -10 -98 -10t-98 10l48 241q-90 18 -147 85l-185 -162q-67 77 -98 169l232 80q-14 42 -14 85t14 85zM918 -102 q56 1 121 13l-17 86q220 44 368 212l65 -57q44 50 73 99l58 -34q-106 -172 -283 -275.5t-385 -109.5v66zM918 1382v66q209 -6 385 -109.5t282 -275.5l-57 -33q-35 56 -73 98l-65 -56q-148 169 -368 211l17 86q-56 11 -121 13zM1516 428q36 103 36 212q0 112 -35 212l82 28 q-19 56 -49 112l57 33q98 -180 98 -385t-98 -385l-57 33q27 52 49 112z" /> | |||
<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 218q0 -45 20 -78.5t54 -51t72 -25.5t81 -8q224 0 224 188q0 67 -48 99t-126 46q-27 5 -51.5 20.5 t-24.5 39.5q0 44 49 52q77 15 122 70t45 134q0 24 -10 52q37 9 49 13v125q-78 -29 -135 -29q-50 29 -110 29q-86 0 -145 -57t-59 -143q0 -50 29.5 -102t73.5 -67v-3q-38 -17 -38 -85q0 -53 41 -77v-3q-113 -37 -113 -139zM382 225q0 64 98 64q102 0 102 -61q0 -66 -93 -66 q-107 0 -107 63zM395 693q0 90 77 90q36 0 55 -25.5t19 -63.5q0 -85 -74 -85q-77 0 -77 84zM755 1072q0 -36 25 -62.5t60 -26.5t59.5 27t24.5 62q0 36 -24 63.5t-60 27.5t-60.5 -27t-24.5 -64zM771 350h137q-2 27 -2 82v387q0 46 2 69h-137q3 -23 3 -71v-392q0 -50 -3 -75z M966 771q36 3 37 3q3 0 11 -0.5t12 -0.5v-2h-2v-217q0 -37 2.5 -64t11.5 -56.5t24.5 -48.5t43.5 -31t66 -12q64 0 108 24v121q-30 -21 -68 -21q-53 0 -53 82v225h52q9 0 26.5 -1t26.5 -1v117h-105q0 82 3 102h-140q4 -24 4 -55v-47h-60v-117z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M68 7q0 165 182 225v4q-67 41 -67 126q0 109 63 137v4q-72 24 -119.5 108.5t-47.5 165.5q0 139 95 231.5t235 92.5q96 0 178 -47q98 0 218 47v-202q-36 -12 -79 -22q16 -43 16 -84q0 -127 -73 -216.5t-197 -112.5q-40 -8 -59.5 -27t-19.5 -58q0 -31 22.5 -51.5t58 -32 t78.5 -22t86 -25.5t78.5 -37.5t58 -64t22.5 -98.5q0 -304 -363 -304q-69 0 -130 12.5t-116 41t-87.5 82t-32.5 127.5zM272 18q0 -101 172 -101q151 0 151 105q0 100 -165 100q-158 0 -158 -104zM293 775q0 -135 124 -135q119 0 119 137q0 61 -30 102t-89 41 q-124 0 -124 -145zM875 1389q0 59 39.5 103t98.5 44q58 0 96.5 -44.5t38.5 -102.5t-39 -101.5t-96 -43.5q-58 0 -98 43.5t-40 101.5zM901 220q4 45 4 134v609q0 94 -4 128h222q-4 -33 -4 -124v-613q0 -89 4 -134h-222zM1217 901v190h96v76q0 54 -6 89h227q-6 -41 -6 -165 h171v-190q-15 0 -43.5 2t-42.5 2h-85v-365q0 -131 87 -131q61 0 109 33v-196q-71 -39 -174 -39q-62 0 -107 20t-70 50t-39.5 78t-18.5 92t-4 103v351h2v4q-7 0 -19 1t-18 1q-21 0 -59 -6z" /> | |||
<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM368 1135l323 -589v-435h134v436l343 588h-150q-21 -39 -63.5 -118.5t-68 -128.5t-59.5 -118.5t-60 -128.5h-3 q-21 48 -44.5 97t-52 105.5t-46.5 92t-54 104.5t-49 95h-150z" /> | |||
<glyph unicode="" horiz-adv-x="1280" d="M57 953q0 119 46.5 227t124.5 186t186 124t226 46q158 0 292.5 -78t212.5 -212.5t78 -292.5t-78 -292t-212.5 -212t-292.5 -78q-64 0 -131 14q-21 5 -32.5 23.5t-6.5 39.5q5 20 23 31.5t39 7.5q51 -13 108 -13q97 0 186 38t153 102t102 153t38 186t-38 186t-102 153 t-153 102t-186 38t-186 -38t-153 -102t-102 -153t-38 -186q0 -114 52 -218q10 -20 3.5 -40t-25.5 -30t-39.5 -3t-30.5 26q-64 123 -64 265zM113.5 38.5q10.5 121.5 29.5 217t54 186t69 155.5t74 125q61 90 132 165q-16 35 -16 77q0 80 56.5 136.5t136.5 56.5t136.5 -56.5 t56.5 -136.5t-57 -136.5t-136 -56.5q-60 0 -111 35q-62 -67 -115 -146q-247 -371 -202 -859q1 -22 -12.5 -38.5t-34.5 -18.5h-5q-20 0 -35 13.5t-17 33.5q-14 126 -3.5 247.5z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M18 264q0 275 252 466q-8 19 -8 52q0 20 11 49t24 45q-1 22 7.5 53t22.5 43q0 139 92.5 288.5t217.5 209.5q139 66 324 66q133 0 266 -55q49 -21 90 -48t71 -56t55 -68t42 -74t32.5 -84.5t25.5 -89.5t22 -98l1 -5q55 -83 55 -150q0 -14 -9 -40t-9 -38q0 -1 1.5 -3.5 t3.5 -5t2 -3.5q77 -114 120.5 -214.5t43.5 -208.5q0 -43 -19.5 -100t-55.5 -57q-9 0 -19.5 7.5t-19 17.5t-19 26t-16 26.5t-13.5 26t-9 17.5q-1 1 -3 1l-5 -4q-59 -154 -132 -223q20 -20 61.5 -38.5t69 -41.5t35.5 -65q-2 -4 -4 -16t-7 -18q-64 -97 -302 -97q-53 0 -110.5 9 t-98 20t-104.5 30q-15 5 -23 7q-14 4 -46 4.5t-40 1.5q-41 -45 -127.5 -65t-168.5 -20q-35 0 -69 1.5t-93 9t-101 20.5t-74.5 40t-32.5 64q0 40 10 59.5t41 48.5q11 2 40.5 13t49.5 12q4 0 14 2q2 2 2 4l-2 3q-48 11 -108 105.5t-73 156.5l-5 3q-4 0 -12 -20 q-18 -41 -54.5 -74.5t-77.5 -37.5h-1q-4 0 -6 4.5t-5 5.5q-23 54 -23 100z" /> | |||
<glyph unicode="" horiz-adv-x="2048" d="M0 858q0 169 97.5 311t264 223.5t363.5 81.5q176 0 332.5 -66t262 -182.5t136.5 -260.5q-31 4 -70 4q-169 0 -311 -77t-223.5 -208.5t-81.5 -287.5q0 -78 23 -152q-35 -3 -68 -3q-26 0 -50 1.5t-55 6.5t-44.5 7t-54.5 10.5t-50 10.5l-253 -127l72 218q-290 203 -290 490z M380 1075q0 -39 33 -64.5t76 -25.5q41 0 66 24.5t25 65.5t-25 66t-66 25q-43 0 -76 -25.5t-33 -65.5zM816 404q0 143 81.5 264t223.5 191.5t311 70.5q161 0 303 -70.5t227.5 -192t85.5 -263.5q0 -117 -68.5 -223.5t-185.5 -193.5l55 -181l-199 109q-150 -37 -218 -37 q-169 0 -311 70.5t-223.5 191.5t-81.5 264zM888 1075q0 -39 33 -64.5t76 -25.5q41 0 65.5 24.5t24.5 65.5t-24.5 66t-65.5 25q-43 0 -76 -25.5t-33 -65.5zM1160 568q0 -28 22.5 -50.5t49.5 -22.5q40 0 65.5 22t25.5 51q0 28 -25.5 50t-65.5 22q-27 0 -49.5 -22.5 t-22.5 -49.5zM1559 568q0 -28 22.5 -50.5t49.5 -22.5q39 0 65 22t26 51q0 28 -26 50t-65 22q-27 0 -49.5 -22.5t-22.5 -49.5z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 508q-2 40 32 59l1664 960q15 9 32 9q20 0 36 -11q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-453 185l-242 -295q-18 -23 -49 -23q-13 0 -22 4q-19 7 -30.5 23.5t-11.5 36.5v349l864 1059l-1069 -925l-395 162q-37 14 -40 55z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 508q-3 39 32 59l1664 960q35 21 68 -2q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-527 215l-298 -327q-18 -21 -47 -21q-14 0 -23 4q-19 7 -30 23.5t-11 36.5v452l-472 193q-37 14 -40 55zM209 522l336 -137l863 639l-478 -797l492 -201 l221 1323z" /> | |||
<glyph unicode="" d="M0 832v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298t-61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12 q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45zM512 480v64q0 14 9 23t23 9h224v352 q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23z" /> | |||
<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM128 640q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M62 1338q0 26 12 48t36 22q46 0 138.5 -3.5t138.5 -3.5q42 0 126.5 3.5t126.5 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17 -43.5t-38.5 -14.5t-49.5 -4t-43 -13q-35 -21 -35 -160l1 -320q0 -21 1 -32q13 -3 39 -3h699q25 0 38 3q1 11 1 32l1 320q0 139 -35 160 q-18 11 -58.5 12.5t-66 13t-25.5 49.5q0 26 12.5 48t37.5 22q44 0 132 -3.5t132 -3.5q43 0 129 3.5t129 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17.5 -44t-40 -14.5t-51.5 -3t-44 -12.5q-35 -23 -35 -161l1 -943q0 -119 34 -140q16 -10 46 -13.5t53.5 -4.5t41.5 -15.5t18 -44.5 q0 -26 -12 -48t-36 -22q-44 0 -132.5 3.5t-133.5 3.5q-44 0 -132 -3.5t-132 -3.5q-24 0 -37 20.5t-13 45.5q0 31 17 46t39 17t51 7t45 15q33 21 33 140l-1 391q0 21 -1 31q-13 4 -50 4h-675q-38 0 -51 -4q-1 -10 -1 -31l-1 -371q0 -142 37 -164q16 -10 48 -13t57 -3.5 t45 -15t20 -45.5q0 -26 -12.5 -48t-36.5 -22q-47 0 -139.5 3.5t-138.5 3.5q-43 0 -128 -3.5t-127 -3.5q-23 0 -35.5 21t-12.5 45q0 30 15.5 45t36 17.5t47.5 7.5t42 15q33 23 33 143l-1 57v813q0 3 0.5 26t0 36.5t-1.5 38.5t-3.5 42t-6.5 36.5t-11 31.5t-16 18 q-15 10 -45 12t-53 2t-41 14t-18 45z" /> | |||
<glyph unicode="" horiz-adv-x="1280" d="M24 926q0 166 88 286q88 118 209 159q111 37 417 37h479q25 0 43 -18t18 -43v-73q0 -29 -18.5 -61t-42.5 -32q-50 0 -54 -1q-26 -6 -32 -31q-3 -11 -3 -64v-1152q0 -25 -18 -43t-43 -18h-108q-25 0 -43 18t-18 43v1218h-143v-1218q0 -25 -17.5 -43t-43.5 -18h-108 q-26 0 -43.5 18t-17.5 43v496q-147 12 -245 59q-126 58 -192 179q-64 117 -64 259z" /> | |||
<glyph unicode="" d="M0 736v64q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-64q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM128 -96v672h256v-672q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM128 960v416q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-416h-256zM512 224v64q0 40 28 68 t68 28h320q40 0 68 -28t28 -68v-64q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM640 64h256v-160q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v160zM640 448v928q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-928h-256zM1024 992v64q0 40 28 68t68 28h320q40 0 68 -28 t28 -68v-64q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM1152 -96v928h256v-928q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM1152 1216v160q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-160h-256z" /> | |||
<glyph unicode="" d="M0 640q0 133 93.5 226.5t226.5 93.5q126 0 218 -86l360 180q-2 22 -2 34q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5q-126 0 -218 86l-360 -180q2 -22 2 -34t-2 -34l360 -180q92 86 218 86q133 0 226.5 -93.5t93.5 -226.5 t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5q0 12 2 34l-360 180q-92 -86 -218 -86q-133 0 -226.5 93.5t-93.5 226.5z" /> | |||
<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 640q0 -88 62.5 -150.5t150.5 -62.5q83 0 145 57l241 -120q-2 -16 -2 -23q0 -88 63 -150.5t151 -62.5 t150.5 62.5t62.5 150.5t-62.5 151t-150.5 63q-84 0 -145 -58l-241 120q2 16 2 23t-2 23l241 120q61 -58 145 -58q88 0 150.5 63t62.5 151t-62.5 150.5t-150.5 62.5t-151 -62.5t-63 -150.5q0 -7 2 -23l-241 -120q-62 57 -145 57q-88 0 -150.5 -62.5t-62.5 -150.5z" /> | |||
<glyph unicode="" horiz-adv-x="1792" d="M0 448q0 143 55.5 273.5t150 225t225 150t273.5 55.5q182 0 343 -89l64 64q19 19 45.5 19t45.5 -19l68 -68l243 244l46 -46l-244 -243l68 -68q19 -19 19 -45.5t-19 -45.5l-64 -64q89 -161 89 -343q0 -143 -55.5 -273.5t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5 t-225 150t-150 225t-55.5 273.5zM170 615q10 -24 35 -34q13 -5 24 -5q42 0 60 40q34 84 98.5 148.5t148.5 98.5q25 11 35 35t0 49t-34 35t-49 0q-108 -44 -191 -127t-127 -191q-10 -25 0 -49zM1376 1472q0 13 9 23q10 9 23 9t23 -9l90 -91q10 -9 10 -22.5t-10 -22.5 q-10 -10 -22 -10q-13 0 -23 10l-91 90q-9 10 -9 23zM1536 1408v96q0 14 9 23t23 9t23 -9t9 -23v-96q0 -14 -9 -23t-23 -9t-23 9t-9 23zM1605 1242.5q0 13.5 10 22.5q9 10 22.5 10t22.5 -10l91 -90q9 -10 9 -23t-9 -23q-11 -9 -23 -9t-23 9l-90 91q-10 9 -10 22.5z M1605 1381.5q0 13.5 10 22.5l90 91q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-91 -90q-10 -10 -22 -10q-13 0 -23 10q-10 9 -10 22.5zM1632 1312q0 14 9 23t23 9h96q14 0 23 -9t9 -23t-9 -23t-23 -9h-96q-14 0 -23 9t-9 23z" /> | |||
<glyph unicode="" horiz-adv-x="1792" /> | |||
<glyph unicode="" horiz-adv-x="1792" /> | |||
<glyph unicode="" horiz-adv-x="1792" /> | |||
<glyph unicode="" horiz-adv-x="1792" /> | |||
<glyph unicode="" horiz-adv-x="1792" /> | |||
<glyph unicode="" horiz-adv-x="1792" /> | |||
<glyph unicode="" horiz-adv-x="1792" /> | |||
<glyph unicode="" horiz-adv-x="1792" /> | |||
<glyph unicode="" horiz-adv-x="1792" /> | |||
<glyph unicode="" horiz-adv-x="1792" /> | |||
<glyph unicode="" horiz-adv-x="1792" /> | |||
<glyph unicode="" horiz-adv-x="1792" /> | |||
<glyph unicode="" horiz-adv-x="1792" /> | |||
<glyph horiz-adv-x="1792" /> | |||
<glyph horiz-adv-x="1792" /> | |||
<glyph horiz-adv-x="1792" /> | |||
<glyph horiz-adv-x="1792" /> | |||
<glyph horiz-adv-x="1792" /> | |||
<glyph horiz-adv-x="1792" /> | |||
<glyph horiz-adv-x="1792" /> | |||
<glyph horiz-adv-x="1792" /> | |||
<glyph horiz-adv-x="1792" /> | |||
<glyph horiz-adv-x="1792" /> | |||
<glyph horiz-adv-x="1792" /> | |||
<glyph horiz-adv-x="1792" /> | |||
<glyph horiz-adv-x="1792" /> | |||
<glyph horiz-adv-x="1792" /> | |||
</font> | |||
</defs></svg> |
@@ -0,0 +1,237 @@ | |||
@font-face { | |||
font-family: 'octicons'; | |||
src: url('octicons.eot?#iefix') format('embedded-opentype'), | |||
url('octicons.woff') format('woff'), | |||
url('octicons.ttf') format('truetype'), | |||
url('octicons.svg#octicons') format('svg'); | |||
font-weight: normal; | |||
font-style: normal; | |||
} | |||
/* | |||
.octicon is optimized for 16px. | |||
.mega-octicon is optimized for 32px but can be used larger. | |||
*/ | |||
.octicon { | |||
font: normal normal 16px octicons; | |||
line-height: 1; | |||
display: inline-block; | |||
text-decoration: none; | |||
-webkit-font-smoothing: antialiased; | |||
-moz-osx-font-smoothing: grayscale; | |||
} | |||
.mega-octicon { | |||
font: normal normal 32px octicons; | |||
line-height: 1; | |||
display: inline-block; | |||
text-decoration: none; | |||
-webkit-font-smoothing: antialiased; | |||
-moz-osx-font-smoothing: grayscale; | |||
} | |||
.octicon-alert:before { content: '\f02d'} /* */ | |||
.octicon-alignment-align:before { content: '\f08a'} /* */ | |||
.octicon-alignment-aligned-to:before { content: '\f08e'} /* */ | |||
.octicon-alignment-unalign:before { content: '\f08b'} /* */ | |||
.octicon-arrow-down:before { content: '\f03f'} /* */ | |||
.octicon-arrow-left:before { content: '\f040'} /* */ | |||
.octicon-arrow-right:before { content: '\f03e'} /* */ | |||
.octicon-arrow-small-down:before { content: '\f0a0'} /* */ | |||
.octicon-arrow-small-left:before { content: '\f0a1'} /* */ | |||
.octicon-arrow-small-right:before { content: '\f071'} /* */ | |||
.octicon-arrow-small-up:before { content: '\f09f'} /* */ | |||
.octicon-arrow-up:before { content: '\f03d'} /* */ | |||
.octicon-beer:before { content: '\f069'} /* */ | |||
.octicon-book:before { content: '\f007'} /* */ | |||
.octicon-bookmark:before { content: '\f07b'} /* */ | |||
.octicon-briefcase:before { content: '\f0d3'} /* */ | |||
.octicon-broadcast:before { content: '\f048'} /* */ | |||
.octicon-browser:before { content: '\f0c5'} /* */ | |||
.octicon-bug:before { content: '\f091'} /* */ | |||
.octicon-calendar:before { content: '\f068'} /* */ | |||
.octicon-check:before { content: '\f03a'} /* */ | |||
.octicon-checklist:before { content: '\f076'} /* */ | |||
.octicon-chevron-down:before { content: '\f0a3'} /* */ | |||
.octicon-chevron-left:before { content: '\f0a4'} /* */ | |||
.octicon-chevron-right:before { content: '\f078'} /* */ | |||
.octicon-chevron-up:before { content: '\f0a2'} /* */ | |||
.octicon-circle-slash:before { content: '\f084'} /* */ | |||
.octicon-circuit-board:before { content: '\f0d6'} /* */ | |||
.octicon-clippy:before { content: '\f035'} /* */ | |||
.octicon-clock:before { content: '\f046'} /* */ | |||
.octicon-cloud-download:before { content: '\f00b'} /* */ | |||
.octicon-cloud-upload:before { content: '\f00c'} /* */ | |||
.octicon-code:before { content: '\f05f'} /* */ | |||
.octicon-color-mode:before { content: '\f065'} /* */ | |||
.octicon-comment-add:before, | |||
.octicon-comment:before { content: '\f02b'} /* */ | |||
.octicon-comment-discussion:before { content: '\f04f'} /* */ | |||
.octicon-credit-card:before { content: '\f045'} /* */ | |||
.octicon-dash:before { content: '\f0ca'} /* */ | |||
.octicon-dashboard:before { content: '\f07d'} /* */ | |||
.octicon-database:before { content: '\f096'} /* */ | |||
.octicon-device-camera:before { content: '\f056'} /* */ | |||
.octicon-device-camera-video:before { content: '\f057'} /* */ | |||
.octicon-device-desktop:before { content: '\f27c'} /* */ | |||
.octicon-device-mobile:before { content: '\f038'} /* */ | |||
.octicon-diff:before { content: '\f04d'} /* */ | |||
.octicon-diff-added:before { content: '\f06b'} /* */ | |||
.octicon-diff-ignored:before { content: '\f099'} /* */ | |||
.octicon-diff-modified:before { content: '\f06d'} /* */ | |||
.octicon-diff-removed:before { content: '\f06c'} /* */ | |||
.octicon-diff-renamed:before { content: '\f06e'} /* */ | |||
.octicon-ellipsis:before { content: '\f09a'} /* */ | |||
.octicon-eye-unwatch:before, | |||
.octicon-eye-watch:before, | |||
.octicon-eye:before { content: '\f04e'} /* */ | |||
.octicon-file-binary:before { content: '\f094'} /* */ | |||
.octicon-file-code:before { content: '\f010'} /* */ | |||
.octicon-file-directory:before { content: '\f016'} /* */ | |||
.octicon-file-media:before { content: '\f012'} /* */ | |||
.octicon-file-pdf:before { content: '\f014'} /* */ | |||
.octicon-file-submodule:before { content: '\f017'} /* */ | |||
.octicon-file-symlink-directory:before { content: '\f0b1'} /* */ | |||
.octicon-file-symlink-file:before { content: '\f0b0'} /* */ | |||
.octicon-file-text:before { content: '\f011'} /* */ | |||
.octicon-file-zip:before { content: '\f013'} /* */ | |||
.octicon-flame:before { content: '\f0d2'} /* */ | |||
.octicon-fold:before { content: '\f0cc'} /* */ | |||
.octicon-gear:before { content: '\f02f'} /* */ | |||
.octicon-gift:before { content: '\f042'} /* */ | |||
.octicon-gist:before { content: '\f00e'} /* */ | |||
.octicon-gist-secret:before { content: '\f08c'} /* */ | |||
.octicon-git-branch-create:before, | |||
.octicon-git-branch-delete:before, | |||
.octicon-git-branch:before { content: '\f020'} /* */ | |||
.octicon-git-commit:before { content: '\f01f'} /* */ | |||
.octicon-git-compare:before { content: '\f0ac'} /* */ | |||
.octicon-git-merge:before { content: '\f023'} /* */ | |||
.octicon-git-pull-request-abandoned:before, | |||
.octicon-git-pull-request:before { content: '\f009'} /* */ | |||
.octicon-globe:before { content: '\f0b6'} /* */ | |||
.octicon-graph:before { content: '\f043'} /* */ | |||
.octicon-heart:before { content: '\2665'} /* ♥ */ | |||
.octicon-history:before { content: '\f07e'} /* */ | |||
.octicon-home:before { content: '\f08d'} /* */ | |||
.octicon-horizontal-rule:before { content: '\f070'} /* */ | |||
.octicon-hourglass:before { content: '\f09e'} /* */ | |||
.octicon-hubot:before { content: '\f09d'} /* */ | |||
.octicon-inbox:before { content: '\f0cf'} /* */ | |||
.octicon-info:before { content: '\f059'} /* */ | |||
.octicon-issue-closed:before { content: '\f028'} /* */ | |||
.octicon-issue-opened:before { content: '\f026'} /* */ | |||
.octicon-issue-reopened:before { content: '\f027'} /* */ | |||
.octicon-jersey:before { content: '\f019'} /* */ | |||
.octicon-jump-down:before { content: '\f072'} /* */ | |||
.octicon-jump-left:before { content: '\f0a5'} /* */ | |||
.octicon-jump-right:before { content: '\f0a6'} /* */ | |||
.octicon-jump-up:before { content: '\f073'} /* */ | |||
.octicon-key:before { content: '\f049'} /* */ | |||
.octicon-keyboard:before { content: '\f00d'} /* */ | |||
.octicon-law:before { content: '\f0d8'} /* */ | |||
.octicon-light-bulb:before { content: '\f000'} /* */ | |||
.octicon-link:before { content: '\f05c'} /* */ | |||
.octicon-link-external:before { content: '\f07f'} /* */ | |||
.octicon-list-ordered:before { content: '\f062'} /* */ | |||
.octicon-list-unordered:before { content: '\f061'} /* */ | |||
.octicon-location:before { content: '\f060'} /* */ | |||
.octicon-gist-private:before, | |||
.octicon-mirror-private:before, | |||
.octicon-git-fork-private:before, | |||
.octicon-lock:before { content: '\f06a'} /* */ | |||
.octicon-logo-github:before { content: '\f092'} /* */ | |||
.octicon-mail:before { content: '\f03b'} /* */ | |||
.octicon-mail-read:before { content: '\f03c'} /* */ | |||
.octicon-mail-reply:before { content: '\f051'} /* */ | |||
.octicon-mark-github:before { content: '\f00a'} /* */ | |||
.octicon-markdown:before { content: '\f0c9'} /* */ | |||
.octicon-megaphone:before { content: '\f077'} /* */ | |||
.octicon-mention:before { content: '\f0be'} /* */ | |||
.octicon-microscope:before { content: '\f089'} /* */ | |||
.octicon-milestone:before { content: '\f075'} /* */ | |||
.octicon-mirror-public:before, | |||
.octicon-mirror:before { content: '\f024'} /* */ | |||
.octicon-mortar-board:before { content: '\f0d7'} /* */ | |||
.octicon-move-down:before { content: '\f0a8'} /* */ | |||
.octicon-move-left:before { content: '\f074'} /* */ | |||
.octicon-move-right:before { content: '\f0a9'} /* */ | |||
.octicon-move-up:before { content: '\f0a7'} /* */ | |||
.octicon-mute:before { content: '\f080'} /* */ | |||
.octicon-no-newline:before { content: '\f09c'} /* */ | |||
.octicon-octoface:before { content: '\f008'} /* */ | |||
.octicon-organization:before { content: '\f037'} /* */ | |||
.octicon-package:before { content: '\f0c4'} /* */ | |||
.octicon-paintcan:before { content: '\f0d1'} /* */ | |||
.octicon-pencil:before { content: '\f058'} /* */ | |||
.octicon-person-add:before, | |||
.octicon-person-follow:before, | |||
.octicon-person:before { content: '\f018'} /* */ | |||
.octicon-pin:before { content: '\f041'} /* */ | |||
.octicon-playback-fast-forward:before { content: '\f0bd'} /* */ | |||
.octicon-playback-pause:before { content: '\f0bb'} /* */ | |||
.octicon-playback-play:before { content: '\f0bf'} /* */ | |||
.octicon-playback-rewind:before { content: '\f0bc'} /* */ | |||
.octicon-plug:before { content: '\f0d4'} /* */ | |||
.octicon-repo-create:before, | |||
.octicon-gist-new:before, | |||
.octicon-file-directory-create:before, | |||
.octicon-file-add:before, | |||
.octicon-plus:before { content: '\f05d'} /* */ | |||
.octicon-podium:before { content: '\f0af'} /* */ | |||
.octicon-primitive-dot:before { content: '\f052'} /* */ | |||
.octicon-primitive-square:before { content: '\f053'} /* */ | |||
.octicon-pulse:before { content: '\f085'} /* */ | |||
.octicon-puzzle:before { content: '\f0c0'} /* */ | |||
.octicon-question:before { content: '\f02c'} /* */ | |||
.octicon-quote:before { content: '\f063'} /* */ | |||
.octicon-radio-tower:before { content: '\f030'} /* */ | |||
.octicon-repo-delete:before, | |||
.octicon-repo:before { content: '\f001'} /* */ | |||
.octicon-repo-clone:before { content: '\f04c'} /* */ | |||
.octicon-repo-force-push:before { content: '\f04a'} /* */ | |||
.octicon-gist-fork:before, | |||
.octicon-repo-forked:before { content: '\f002'} /* */ | |||
.octicon-repo-pull:before { content: '\f006'} /* */ | |||
.octicon-repo-push:before { content: '\f005'} /* */ | |||
.octicon-rocket:before { content: '\f033'} /* */ | |||
.octicon-rss:before { content: '\f034'} /* */ | |||
.octicon-ruby:before { content: '\f047'} /* */ | |||
.octicon-screen-full:before { content: '\f066'} /* */ | |||
.octicon-screen-normal:before { content: '\f067'} /* */ | |||
.octicon-search-save:before, | |||
.octicon-search:before { content: '\f02e'} /* */ | |||
.octicon-server:before { content: '\f097'} /* */ | |||
.octicon-settings:before { content: '\f07c'} /* */ | |||
.octicon-log-in:before, | |||
.octicon-sign-in:before { content: '\f036'} /* */ | |||
.octicon-log-out:before, | |||
.octicon-sign-out:before { content: '\f032'} /* */ | |||
.octicon-split:before { content: '\f0c6'} /* */ | |||
.octicon-squirrel:before { content: '\f0b2'} /* */ | |||
.octicon-star-add:before, | |||
.octicon-star-delete:before, | |||
.octicon-star:before { content: '\f02a'} /* */ | |||
.octicon-steps:before { content: '\f0c7'} /* */ | |||
.octicon-stop:before { content: '\f08f'} /* */ | |||
.octicon-repo-sync:before, | |||
.octicon-sync:before { content: '\f087'} /* */ | |||
.octicon-tag-remove:before, | |||
.octicon-tag-add:before, | |||
.octicon-tag:before { content: '\f015'} /* */ | |||
.octicon-telescope:before { content: '\f088'} /* */ | |||
.octicon-terminal:before { content: '\f0c8'} /* */ | |||
.octicon-three-bars:before { content: '\f05e'} /* */ | |||
.octicon-tools:before { content: '\f031'} /* */ | |||
.octicon-trashcan:before { content: '\f0d0'} /* */ | |||
.octicon-triangle-down:before { content: '\f05b'} /* */ | |||
.octicon-triangle-left:before { content: '\f044'} /* */ | |||
.octicon-triangle-right:before { content: '\f05a'} /* */ | |||
.octicon-triangle-up:before { content: '\f0aa'} /* */ | |||
.octicon-unfold:before { content: '\f039'} /* */ | |||
.octicon-unmute:before { content: '\f0ba'} /* */ | |||
.octicon-versions:before { content: '\f064'} /* */ | |||
.octicon-remove-close:before, | |||
.octicon-x:before { content: '\f081'} /* */ | |||
.octicon-zap:before { content: '\26A1'} /* ⚡ */ |