diff --git a/weed/images/favicon.go b/weed/images/favicon.go deleted file mode 100644 index 2f0af200d..000000000 --- a/weed/images/favicon.go +++ /dev/null @@ -1,236 +0,0 @@ -// Code generated by go-bindata. -// sources: -// favicon/favicon.ico - -package images - -import ( - "bytes" - "compress/gzip" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "strings" - "time" -) - -func bindataRead(data []byte, name string) ([]byte, error) { - gz, err := gzip.NewReader(bytes.NewBuffer(data)) - if err != nil { - return nil, fmt.Errorf("Read %q: %v", name, err) - } - - var buf bytes.Buffer - _, err = io.Copy(&buf, gz) - clErr := gz.Close() - - if err != nil { - return nil, fmt.Errorf("Read %q: %v", name, err) - } - if clErr != nil { - return nil, err - } - - return buf.Bytes(), nil -} - -type asset struct { - bytes []byte - info os.FileInfo -} - -type bindataFileInfo struct { - name string - size int64 - mode os.FileMode - modTime time.Time -} - -func (fi bindataFileInfo) Name() string { - return fi.name -} -func (fi bindataFileInfo) Size() int64 { - return fi.size -} -func (fi bindataFileInfo) Mode() os.FileMode { - return fi.mode -} -func (fi bindataFileInfo) ModTime() time.Time { - return fi.modTime -} -func (fi bindataFileInfo) IsDir() bool { - return false -} -func (fi bindataFileInfo) Sys() interface{} { - return nil -} - -var _favicon = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xec\x94\x5f\x48\x53\x51\x1c\xc7\xbf\x77\xce\xeb\xf1\xff\x9d\x53\x37\xe7\xbf\x4d\xcd\x2c\x08\xa2\x87\xea\xd1\x82\x9e\xa2\x88\x5e\x7a\x8a\x82\x1e\xf2\x21\x7a\x28\x42\xc9\x7a\xb0\x08\x22\x4d\x08\xfa\x43\x25\x61\x05\x4b\xac\xb7\x7a\x92\x8a\x82\xa2\x34\x59\x5c\x4d\x5b\x39\x2d\xfb\xb3\x9c\xe0\x52\xb7\x5a\x6e\x73\xeb\xdc\xbb\xed\xb6\x5d\xc7\x89\x7a\xa8\xa0\xfb\x81\x7b\xef\x39\xbf\xef\x3d\xf7\xfe\xce\x79\xf8\x00\x1c\x74\x10\x04\xe9\x49\xd0\x94\x09\xd4\x03\xb0\x5a\x63\xf3\x1e\x02\x74\xd2\x5a\x03\xad\x09\x52\x1d\xb1\xba\x0c\x87\x1f\x70\xb1\xab\xff\xd0\x2a\x0c\x9d\xde\x0e\xf1\xe4\x66\xbc\xba\xb2\x0f\xe1\xc0\x3c\x5e\x77\xef\x87\xe7\xe9\x4d\xcc\x3a\x1f\x21\x1a\x8d\x22\x1a\x89\xc0\x7d\xbf\x0b\x03\xcd\xab\x31\xde\x73\x18\x6f\x6e\xb5\x61\xea\xf1\x0d\x84\xbf\xf9\x31\x76\xfd\x20\xbe\x4e\xb9\x20\xb6\x6f\xc5\xb3\xd6\xb5\x78\x7e\x62\x13\x7d\xae\x83\xa3\xad\x11\x73\xae\x7e\xbc\x38\xb3\x03\x23\x67\x77\x62\x61\xd6\x03\x67\x57\x13\x1c\xc7\x37\x62\xa2\xf7\x28\x22\xe1\x10\x7c\x93\x22\x42\x7e\x2f\x82\x73\xd3\x18\x68\x59\x03\x97\xbd\x05\x43\x1d\xdb\xa0\xa1\xa1\xf1\xaf\x51\x5b\x97\x3c\xab\x29\x20\xe6\xa4\x69\x71\x35\x21\x56\x1b\x25\x3e\xaf\xac\x22\x31\x12\x2f\x94\x59\x48\x79\x05\x45\x7e\xb9\x84\xde\x4a\x4d\xca\xfa\x0c\x43\x11\xbd\xe7\x1a\xa5\x71\x3e\xa5\x80\x14\x0a\x89\x2c\xfe\x19\x92\x17\x9f\xf3\x94\x2c\x92\x9d\x93\x9b\xf4\xf3\x0c\x7d\x66\x4a\xa7\x9c\xee\xb7\x37\xf9\xcb\x48\x9e\xb5\xd2\xab\x11\x49\x9e\xd5\x27\x37\x03\xc5\xb3\x8e\x63\x1b\xe0\x79\xd2\x8b\x4f\x0f\xaf\xca\x2e\x95\x1c\x2b\xf9\x75\x7e\x7c\x50\x76\xe0\xe8\xf9\x5d\xb2\x2f\xbd\xc3\x77\x11\x59\x0c\x61\xf2\x76\x3b\x66\xc4\x3e\x0c\x1e\x59\x8f\xc0\xf4\x84\xec\xd6\x0f\x7d\xe7\xe0\x7f\x3f\x22\x7b\x33\xf4\xe5\xb3\xec\x54\xc9\x9d\x8b\xc1\x00\x75\x73\x2b\x86\xa9\xcb\xdf\xdd\xe9\x94\x1d\xed\xb2\x37\x53\x4f\xdb\xe1\x7b\x2b\xe2\xe3\xbd\x4b\x78\x79\x71\x0f\x82\xbe\x19\x38\x2f\xef\xa5\xdf\xee\xc0\xe8\x85\xdd\x58\xf0\xba\xe1\x7e\xd0\x8d\xb1\x6b\x07\x64\x9f\x8b\xa7\xb6\xfc\xb9\xc3\xd3\xd0\xd0\xf8\x7b\xac\xb4\x31\xe3\x86\x15\x15\x8c\x54\xbf\x9c\xe7\x19\x39\x97\xc5\xb3\xf2\x65\x44\x32\x79\xbd\x31\x81\x2a\xae\xcb\xe3\x53\x49\x8d\x6b\x79\x35\xaa\xf5\xb6\x1a\x76\x0e\x43\xb5\x54\xb5\xe6\x24\x58\xd2\xa0\xa9\x8a\xd9\x3f\xa5\xd2\x9c\x2e\x2f\xb7\x28\x43\x8b\x90\x26\xcf\x34\x97\x29\xe3\x42\x4b\x9a\x9c\xe7\x75\x26\xc6\x5f\x69\xce\x1b\x0d\x4b\xca\xca\x41\x16\x4b\xfb\x2a\x29\x55\xe7\xea\xf3\x2a\xfa\x49\x2e\x18\x98\x79\x41\xa1\x6a\xbd\x72\x90\xb9\x34\xcd\xcb\x67\xf6\x4f\xb2\x99\xfb\xcb\xe2\x18\x31\x74\x19\x7a\x56\x0c\xe6\xe2\xff\x97\xef\x01\x00\x00\xff\xff\x3e\xd4\x17\xe7\x36\x0e\x00\x00") - -func faviconBytes() ([]byte, error) { - return bindataRead( - _favicon, - "favicon/favicon.ico", - ) -} - -func favicon() (*asset, error) { - bytes, err := faviconBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "favicon/favicon.ico", size: 3638, mode: os.FileMode(420), modTime: time.Unix(1460621502, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -// Asset loads and returns the asset for the given name. -// It returns an error if the asset could not be found or -// could not be loaded. -func Asset(name string) ([]byte, error) { - cannonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[cannonicalName]; ok { - a, err := f() - if err != nil { - return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err) - } - return a.bytes, nil - } - return nil, fmt.Errorf("Asset %s not found", name) -} - -// MustAsset is like Asset but panics when Asset would return an error. -// It simplifies safe initialization of global variables. -func MustAsset(name string) []byte { - a, err := Asset(name) - if err != nil { - panic("asset: Asset(" + name + "): " + err.Error()) - } - - return a -} - -// AssetInfo loads and returns the asset info for the given name. -// It returns an error if the asset could not be found or -// could not be loaded. -func AssetInfo(name string) (os.FileInfo, error) { - cannonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[cannonicalName]; ok { - a, err := f() - if err != nil { - return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err) - } - return a.info, nil - } - return nil, fmt.Errorf("AssetInfo %s not found", name) -} - -// AssetNames returns the names of the assets. -func AssetNames() []string { - names := make([]string, 0, len(_bindata)) - for name := range _bindata { - names = append(names, name) - } - return names -} - -// _bindata is a table, holding each asset generator, mapped to its name. -var _bindata = map[string]func() (*asset, error){ - "favicon/favicon.ico": favicon, -} - -// AssetDir returns the file names below a certain -// directory embedded in the file by go-bindata. -// For example if you run go-bindata on data/... and data contains the -// following hierarchy: -// data/ -// foo.txt -// img/ -// a.png -// b.png -// then AssetDir("data") would return []string{"foo.txt", "img"} -// AssetDir("data/img") would return []string{"a.png", "b.png"} -// AssetDir("foo.txt") and AssetDir("notexist") would return an error -// AssetDir("") will return []string{"data"}. -func AssetDir(name string) ([]string, error) { - node := _bintree - if len(name) != 0 { - cannonicalName := strings.Replace(name, "\\", "/", -1) - pathList := strings.Split(cannonicalName, "/") - for _, p := range pathList { - node = node.Children[p] - if node == nil { - return nil, fmt.Errorf("Asset %s not found", name) - } - } - } - if node.Func != nil { - return nil, fmt.Errorf("Asset %s not found", name) - } - rv := make([]string, 0, len(node.Children)) - for childName := range node.Children { - rv = append(rv, childName) - } - return rv, nil -} - -type bintree struct { - Func func() (*asset, error) - Children map[string]*bintree -} - -var _bintree = &bintree{nil, map[string]*bintree{ - "favicon": &bintree{nil, map[string]*bintree{ - "favicon.ico": &bintree{favicon, map[string]*bintree{}}, - }}, -}} - -// RestoreAsset restores an asset under the given directory -func RestoreAsset(dir, name string) error { - data, err := Asset(name) - if err != nil { - return err - } - info, err := AssetInfo(name) - if err != nil { - return err - } - err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755)) - if err != nil { - return err - } - err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode()) - if err != nil { - return err - } - err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) - if err != nil { - return err - } - return nil -} - -// RestoreAssets restores an asset under the given directory recursively -func RestoreAssets(dir, name string) error { - children, err := AssetDir(name) - // File - if err != nil { - return RestoreAsset(dir, name) - } - // Dir - for _, child := range children { - err = RestoreAssets(dir, filepath.Join(name, child)) - if err != nil { - return err - } - } - return nil -} - -func _filePath(dir, name string) string { - cannonicalName := strings.Replace(name, "\\", "/", -1) - return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...) -} diff --git a/weed/server/common.go b/weed/server/common.go index 12adbf1b4..215ee1036 100644 --- a/weed/server/common.go +++ b/weed/server/common.go @@ -12,21 +12,24 @@ import ( "time" "github.com/chrislusf/seaweedfs/weed/glog" - "github.com/chrislusf/seaweedfs/weed/images" "github.com/chrislusf/seaweedfs/weed/operation" "github.com/chrislusf/seaweedfs/weed/security" "github.com/chrislusf/seaweedfs/weed/stats" "github.com/chrislusf/seaweedfs/weed/storage" "github.com/chrislusf/seaweedfs/weed/util" + + _ "github.com/chrislusf/seaweedfs/weed/statik" + statik "github.com/rakyll/statik/fs" ) var serverStats *stats.ServerStats var startTime = time.Now() +var statikFS http.FileSystem func init() { serverStats = stats.NewServerStats() go serverStats.Start() - + statikFS, _ = statik.New() } func writeJson(w http.ResponseWriter, r *http.Request, httpStatus int, obj interface{}) (err error) { @@ -191,14 +194,7 @@ func statsMemoryHandler(w http.ResponseWriter, r *http.Request) { writeJsonQuiet(w, r, http.StatusOK, m) } -func faviconHandler(w http.ResponseWriter, r *http.Request) { - data, err := images.Asset("favicon/favicon.ico") - if err != nil { - glog.V(2).Infoln("favicon read error:", err) - return - } - - if e := writeResponseContent("favicon.ico", "image/x-icon", bytes.NewReader(data), w, r); e != nil { - glog.V(2).Infoln("response write error:", e) - } +func handleStaticResources(defaultMux *http.ServeMux) { + defaultMux.Handle("/favicon.ico", http.FileServer(statikFS)) + defaultMux.Handle("/seaweedfsstatic/", http.StripPrefix("/seaweedfsstatic", http.FileServer(statikFS))) } diff --git a/weed/server/filer_server.go b/weed/server/filer_server.go index 84e1ea4b8..2aabb9932 100644 --- a/weed/server/filer_server.go +++ b/weed/server/filer_server.go @@ -37,6 +37,7 @@ type FilerServer struct { } func NewFilerServer(defaultMux, readonlyMux *http.ServeMux, option *FilerOption) (fs *FilerServer, err error) { + fs = &FilerServer{ option: option, } @@ -56,7 +57,7 @@ func NewFilerServer(defaultMux, readonlyMux *http.ServeMux, option *FilerOption) notification.LoadConfiguration(v.Sub("notification")) - defaultMux.HandleFunc("/favicon.ico", faviconHandler) + handleStaticResources(defaultMux) defaultMux.HandleFunc("/", fs.filerHandler) if defaultMux != readonlyMux { readonlyMux.HandleFunc("/", fs.readonlyFilerHandler) @@ -85,8 +86,8 @@ func LoadConfiguration(configFileName string, required bool) { glog.Errorf("Failed to load %s.toml file from current directory, or $HOME/.seaweedfs/, or /etc/seaweedfs/"+ "\n\nPlease follow this example and add a filer.toml file to "+ "current directory, or $HOME/.seaweedfs/, or /etc/seaweedfs/:\n"+ - " https://github.com/chrislusf/seaweedfs/blob/master/weed/%s.toml\n" + - "\n\nOr use this command to generate the default toml file\n" + + " https://github.com/chrislusf/seaweedfs/blob/master/weed/%s.toml\n"+ + "\n\nOr use this command to generate the default toml file\n"+ " weed scaffold -config=%s -output=.\n", configFileName, configFileName, configFileName) } diff --git a/weed/server/filer_ui/templates.go b/weed/server/filer_ui/templates.go index c1454f74c..aad838bf3 100644 --- a/weed/server/filer_ui/templates.go +++ b/weed/server/filer_ui/templates.go @@ -44,7 +44,7 @@ var StatusTpl = template.Must(template.New("status").Funcs(funcMap).Parse(` diff --git a/weed/server/master_ui/templates.go b/weed/server/master_ui/templates.go index 554ed3a11..3cbc281ea 100644 --- a/weed/server/master_ui/templates.go +++ b/weed/server/master_ui/templates.go @@ -15,7 +15,7 @@ var StatusTpl = template.Must(template.New("status").Parse(`
diff --git a/weed/server/volume_server.go b/weed/server/volume_server.go index 037fca2c2..01c49da6d 100644 --- a/weed/server/volume_server.go +++ b/weed/server/volume_server.go @@ -43,6 +43,7 @@ func NewVolumeServer(adminMux, publicMux *http.ServeMux, ip string, vs.guard = security.NewGuard(whiteList, "") + handleStaticResources(adminMux) adminMux.HandleFunc("/ui/index.html", vs.uiStatusHandler) adminMux.HandleFunc("/status", vs.guard.WhiteList(vs.statusHandler)) adminMux.HandleFunc("/admin/assign_volume", vs.guard.WhiteList(vs.assignVolumeHandler)) @@ -64,7 +65,7 @@ func NewVolumeServer(adminMux, publicMux *http.ServeMux, ip string, adminMux.HandleFunc("/", vs.privateStoreHandler) if publicMux != adminMux { // separated admin and public port - publicMux.HandleFunc("/favicon.ico", faviconHandler) + handleStaticResources(publicMux) publicMux.HandleFunc("/", vs.publicReadOnlyHandler) } diff --git a/weed/server/volume_server_ui/templates.go b/weed/server/volume_server_ui/templates.go index 5f01588f4..d69435a6c 100644 --- a/weed/server/volume_server_ui/templates.go +++ b/weed/server/volume_server_ui/templates.go @@ -50,7 +50,7 @@ var StatusTpl = template.Must(template.New("status").Funcs(funcMap).Parse(` diff --git a/weed/images/favicon/favicon.ico b/weed/static/favicon.ico similarity index 100% rename from weed/images/favicon/favicon.ico rename to weed/static/favicon.ico diff --git a/weed/static/seaweed50x50.png b/weed/static/seaweed50x50.png new file mode 100644 index 000000000..8c0b313be Binary files /dev/null and b/weed/static/seaweed50x50.png differ diff --git a/weed/statik/statik.go b/weed/statik/statik.go new file mode 100644 index 000000000..1e77cfe67 --- /dev/null +++ b/weed/statik/statik.go @@ -0,0 +1,13 @@ +// Code generated by statik. DO NOT EDIT. + +// Package statik contains static assets. +package statik + +import ( + "github.com/rakyll/statik/fs" +) + +func init() { + data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\x89\x89\xb8H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00 \x00favicon.icoUT\x05\x00\x01s\x8bDW\xec\x95KL\x13]\x18\x86\xdf)\x9d\xc3\xe1R\x98r\xa7\xf4\x87\x0e\xf0#\x9a\x98\x18\x17\xea\x12M\\\x19\x8da\xe3\xcah\xe2B\x16\xc6\x85\xc6@D\x17hL\x8c\\\x12\x13/Q\x89AM\x90\xa0;\\\x115\x9aH\x94Kj\x06\x04\xab\xb4h\xbd\xd4\x96\x84\n\xb4ZiKkfza\x18\xdaqg\x8c\xce\x934=\xdf\xf7\x9c\xaf\x9ds\x16\xef\x00\x0ct\xe08\xf1\x9b\xa2\x89\x05\xea\x00X,\xb1\xba\x8f\x02],P\x0f\x80\x13\xfb\x88\xf5%\x18\xac\xc0\xc4>\xc3'6b\xbc\xb3\x11\xc2\xf9]xs\xf3\x08\xc2\x81E\xbc\xed9\n\xcf\x8b{\x98\xb7=C4\x1aE4\x12\x81\xebq7F\x9a7\xc1\xd1w\x12\xef\xee\xb7\xc1=t\x17\xe1\x1f~L\xdf9\x8e\xefn;\x84\xf6=\x18m\xdd\x82\x97\xe7vb\xb4u+\xacm\x0dX\xb0\x0f\xe3\xd5\xc5}\x98\xbc\xb4\x1fK\xf3\x1e\xd8\xba\x9b`=\xbb\x033\xfd\xa7\x11 \x87\xe0s\n\x08\xf9\xbd\x08.\xccb\xa4e3\xec\xbd-\x18\xef\xd8\x0b\x0d\x0d\x8d?\x8d\x9aZyU\x9dG\xcbdeQ\x15\xa5\x16\x9e\xe7\xf9x\xfd_%\x8d\x91\xd8Pn\xa2\x15f\xb3\xd9,m.\x06PR\x9a\x9c\xcf0\x16\x00\xc8)\x14\xd7\x06\x83\xc1\x90G\xf3\xb9\x84\x8b\xff\x0c\xcd\x8d\xd7\x84\x10\x92I\xb3\xb2sV\xfe\x1b\x19z\x16r\x18\x1d~\x1b\xf5\xf1\x8cm\x90\xe7\xac^\xb6A\x96\xb3\xd63\xdb\xe1y\xde\x8f/OoIY*f\xac\x98\xaf\x8b\x8e1)\x03\xa7\xae\x1c\x90\xf2\xd2;\xf1\x10\x91\xe5\x10\x9c\x03\xed\x98\x13\x061vj\x1b\x02\xb33R\xb6~\x1a\xbc\x0c\xff\xc7I)7C\xdf\xbeJ\x99*f\xe7r0\x00G_+&:\x1b\xf1\xe1A\x97\x94\xd1\xf6\xdef\xb8\x87z\xe1{/\xe0\xf3\xa3\xebx}\xed\x10\x82\xbe9\xd8n\x1c\x86s\xa0\x03SW\x0fb\xc9\xeb\x82\xebI\x0f\xa6o\x1f\x93\xf2\\\xb8\xb0;\xddQ544\xfe&6\xf0\xaa\xba~\xbdY\xc5\xea\xd7\x11\xa2\xe2\x99L\xa2\xe6\xff\xa7b\x92\xd7\x15&P\xe8\xda\\\xb2\x9a\xd5\xba\x86(Q\xcc\xf3\xd5\xea\x1e\xc6*\xb1k\xc9N\xa0\xf4(\xadT}~\xf1\x1dW\x96\xcaW\x98\x92K\x13\x97\xc2\xb3e\xe5\xc9u\xbe)\x85'DW\xba\xb6-\xf7\xa4\xd0\xb8\xa6\x9d\xbc\xc8\"\xf1\\\xc5%J\xaf\xbc\xaf\x82_x\xce\xa8\xea\xf3\xf2\x15\xf3\xc9\x8b\xcc!\x84\xe4\x1a\x90\x16\x96\x10\x9a\x95^\x83%\x99\x8c\x8a\x86.C\xaf\xa6\xa1:\xfc\xef\xf23\x00\x00\xff\xffPK\x07\x08>\xd4\x17\xe7u\x02\x00\x006\x0e\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00j\x8dGM\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00 \x00seaweed50x50.pngUT\x05\x00\x01\xb9E\xba[\x00\x14\x0d\xeb\xf2\x89PNG\x0d\n\x1a\n\x00\x00\x00\x0dIHDR\x00\x00\x002\x00\x00\x002\x08\x06\x00\x00\x00\x1e?\x88\xb1\x00\x00\x0c\xdbIDATx\x01\xd5\x9a\x05p\x1c9\xb7F\xcf\x95\xd4=hNLI\xbc\xcc\xccL\x8f\x99\x0b\x1e33\x16?fffff\xe6e\xe6\x0d'\x8e\x1d3\x0dx\xba[\xba\xffx\xb6k\xca\xe3\x8aSY\xd7\xe2W\xa5\x01\xa9G\xe9#]j\xc5\xb2x\xec\xd9\xd2\x93\xa76\xbf\xe2\xc9S\xado<\xb3\x96\x1d\x08\x8a\xf0\x01\x90\x11t\xb2\xdf\xce\xdc1U\xfc\xe9\xdb\x0e\x15\x7f\xce\xb5!\xbe\xf2\xd7\x1e_\xff\xae\xbf{\xad^mf\xca\x07HRrr\xf0c\xae\xaa|\x87\x82\x91\xef\xfe\xed\xff<\xf1C\xff\xb1|Q=U\x10>XR(G\xc2\xb7>44#_\xfe3\xff\xea\x7f\xe9\x895\xc3\x07U\n_|G\x7fp\x1f\x08\x9f\x10\x01#\x00\xa0\n\x9a\xbf\x03\x08\x04E\xcc\x85\x10\xbf\xd7^\x8d\xcbA\x04\x10\xc0\n\x88\xb0]\xe7\x05\x11`\xa4\xec\x18,X\xde3\xc9\xb6\x9d\xf0\n\x92C\x98\x0b\x05Q\xb8l\xa8\xc8\xe7\xde8\xcag\xdd\xb0\x9f\x89j\xf4\xde\xec\x8e\x00\xd05'B\xd7\xa4.|G\x0e\xf4\xc5\x8cV\x0bL\xf4\x17\x19-Go\xcf\xea\x8a\xf0\x96\xa4\n\x08X\xc9\xcd\xcc\xe4}o\x01\xe4\x8d\xe5&\xaf/\xd4yy\xae\xc6\xc9\xb5\x041\x19\"a\x17g4\xec*+PpH1j7\x07\x91\x85\xddx\x84\xde1\xbfm\x17\x8c\x80W\xce%w\xbe-\x9d\xad\xa5\xfc\xe1\xcb\x0b\x04\x85L=\x83\x83\xc7Y[\xbf\x18\xf5\x86\xae$\xbfIc!\xcb\xd0\xd4\x83j/D\x9c\x8f\xe7\x92\xd8\x82\xb5\xa8\x0f\xbd\xd7\x1aA\xacAC\x80d\xdb<>\x80\x87\xaeb\x07\x99\xbf@\x90\\-\xaf\xa0B\xb1\xb4\xca\xc0@\x1bd\xedRv\xae\xb6\xd8\x1c,r\x881h\xe6A\xbbc\xe7\xde-k:c\xe7Rg\x0e\x80\xd4CPz\x14Y\x00v\xf6;.HB_\xff4\xce\xb5P\x95^3\xb0\x16\x90\xddop\x8f\x12\xe7\xc0\x18\xd4{\xc8\x02(\xe0L\xa7_[)\xc0\x1e@$P)\xcf\xb1\xb2z\x19\x1a\x1cH\xe8\x9a\x95X\xe1\x1d\x931\x881\xe0\x94\xae\x19\xabv\xda\xf9A\x94s\x866P\xacI\x08>\xdaqA\x1e\x85\xe4mN\xa8\xb2K.\x01\xd0\x9d1y\x07Hd\x84\xdb'\xab,\xd4S\x8e\xacl\xd2\x95\x1a\xac\xdb$.l\xd0\x0d)\xa2\x00`@\x00\xe4<7,\x17\xc6\"o\xa5~\xefF/\xd9\x01\xa2Pt\xa6\x0d\xd2\xc7\x91\xe5f\x17DP\x86\xf6\xbd\xc2\xe0\xc01\xbc/R\xabO\x82\xd1\x1e\xa7\xc4\x18Dz\x17I\xe9\x95\xbc\xcdy\xd1\x14\x1d\xa1\x95\x82W\xd0\xed \x02\xb5\xd4\xf3\xc7//\xd0L\x03\xa8\x10\x17\xd7\x18\x1c<\xca\xf8\xd8\xd3,-_\xc3\xe9\xd3\xb7\x90fU@\xbb%\x82\x8d\x1d\xc6\xc8\xae;\xa0(\xc0[\xde\x12Av\x85\x00P1\x10;\xc2f\x06\xaa \xe0\xb6'\xd0\xb9Z\n\x02`(\x97\xe7\x99:\xf4_\xcc\xce\xde\xc9\x993\xf7\x03\x80t!\x88\n\x11Qd1\x08\x82\x9e\xd3-\xba\x11N\xf4\x82)D\xce=\xda\x9d\x13\xf0\x08\x1e%\xd8\xdc\xf9\x01\xb7\xcb|\x94\x8a\xcb\x84\xe0XY\xb9\xb2\xf7fd\x0b\xc2Q\x88-\x91O\x88[\x0d4*\xa2\x85R\xef\xca\xed\xd9\xb8v\x07P\x80\xb4\x85ilP\xab\x0c\x92\x89\xa0\"\xbb\x87\xdfre\x8e\xe1\xe1\xd7Y\\\xbc\x8efs\x04\xd0\x9ep\x1bE\x8eRs\x8d\xe1\xa3\xcf`\x8c!\xf4\x8f\xb0y\xf1\x0d`,\x08\xdd\x02O{\xa2\x8dv\xc3g\x0fq\xb7O\xf2n\xcd\xbf\x1bD\xc8\xbf\x06\x14\xc1\x8b\xc1\xae/P:\xfe\x1c\xc9\xf5\x0f\xd3\xb2\x06\xcd+\xe2\x1e\x10\x11e|\xe2qF\xda\x10++W0;{\x07\xaa\xa6gA\x8d\x11\xac1\x94\x97g\xb1\x1ah\xdc\xf00\xce\x08\xb1\xb1\xd8\xf5EL\xbb_\xabC\x84\x91Id\xe5,f}\x01\xad\x0c\x12\x06\xc70\xed\xefa\xe4\x00R[\x011h\xb9\x1f\xb3\xd4\xee\x1bzsL\xea\xeb\x84}\x07\xd0\xbe!\xcc\xeaz\xa8\x03N\x1bB6V\x10\x9f\xe1U\xf1a[\x1e\xa9T\xcer\xf9\xe5\x7f\x8d\xb5 \x0b\x8b\xd7S\xaf\x8f\x83\x04PC\xb1\xb4\xc2\xdc\xdc-,-]\x07\xa2\x80\x80\x13l\xac\x98\x8de\xca\xb3\x87\x11`\xf3\xd0\xd5\x84\x89\xcb\x88\x93\x16\xf6\xe4+h\xb1\x82?x\x15vh\x0c9s\x98P\xa8\xe0\xa3b\xc7w\\\x1b&\xdb\xf2\x9fV\x03\xe33\xb2R?\x1c\xb8\nw\xecy\xe4\xd8\x0b\x84\x81}\xf8\x03W`\xdb\xf3\x9b\x13/\xa3\xa5\ni;\x90\x98\xad\xf9\x8e\xbfHV\xa8\xd0\x1a\x1c#\xf5\x8a\xf7\x01r\xc9\xd7\xfe\xda\xef\x84\xdf~\xee\xac4\x1b\xfbI\x93>\x94\x9c\xd0\xb5\x98\x98|\x94\xb9\xb3\xb7\x93t\xccJ\xbb\xd5mT\x8a(:C\xec3\x9c\x11l\x14cE\xda\x0dL\x96\x80\x08\xd8\x084 \xc1\xa3\xc6m+\xfa\x02\x88\x01\x14\xcd\xa3\x13\x00\x1a\x90,\x05\xeb\xc0X\x807wZ\xa4\xf3\xfb\x00\xf84%\x15C\xa6\xb0\xb1\x99\x91\xa6\x1e\x02|\xe1\xad\x15u\x9b\xf5 \xd6V\xaa \xddH\x0dj\xa9V\xa7\x01H\x92*\xa0=a4\xa8\x92*\xa8\x8d\xc8\x04\xac\x0f\x98\xdc\xf9D\x1c\x82 >\x80\x08\x88\x83|j%\x00\x02\x04r\xf5~61(\x90\xaf4\x12\xa1(\xea\x95\x00\x04qx\x94V\xe6I\xb3\xd0s,\xe4\x10@BO\x08\xee\x1f8\xc2\xe4\xe4c\xcc\x9e\xbd\x03\xd4\xe4\xa6&\xf9=(!\xf1d\xc6\x10\x04\x8c\x80\xa1\xf7\xb4\x06\x14\xc9\xe7\xea\x91\x82\xa2\x17T*k\xcfk\xde\x142\x0d$I\x06As\x88\x1c\x04e\x1bD`b\xe2\x89N[]\xbd\x94\xf5\xb5\x8b\xba&e\xf2\xe7u\x1fb4\xf5x\x85P\xc8C\xac\x80hOq\xff\xb6\x1f\x95i\xdeB\x16\xd0v#h\xcf\x80\xa3+a\xdf\xbe\x97\x19\x1f\x7f\x92\xf9\xf9\x9b\x99\x99\xb9\x0b\xef\x8b\x80v\x00\xc6\xdbp\x1b\xebSll\x1c\x02\xd1\xfcqV\xa1\x18\xe5\x19\\\xbb\x10\xe7%\xd1\xf3\x03\xc9y\xa1\xf3\x7f7\x87\xe0\\y\xa4\\\x99\xe7\xc0\x81\xffca\xe1&\xa6\xa7\x1f@\xd5\x00\xda\x1d\xf3>\xa6V\x9b\x00r3\x03\xd4\x07\xf0\xa1\xe7\xd1V\xf7\xba\xe4\xbb\xc0\xf5B\x044\x0d;.\xda\xee#\x08\x03\x9dg\x8e\xb8\x13n5\x98n\xb8\x15\xe3\xe9\x1f8\xc5\xf2\xd2Uh\xb0;\x82\x02h+\x83\xd8\x815 \xecMy\xaduN\x05\x05\x1f\xba\x8b\x86\xeev\x1c\xa4\x821)\xd5\xea\x0cg\xdb\xce\x9d\xb4\xf2P\xab\x06c\x93\xb6\xb9\xbdD\x14\xd5h\xe5\xfd=\xc7\x95\x92\xc3$)8\x83X\x0bF\xba\x03\x9a\xdf\x84 \xe0\xcc9nVQ\x1f \xf3t\xe7D\x90\xbc\xaa%\x04\xe8\x1e/\x9d_\xceEu\xc6\xc6\x9f&\xcb\xca,-]\xd3]\xf1\xc1\xa1#\x8c\x8d=C\x7f\xdf)NO?\x08\xe2\xc0\x91\xe7\x82s\x1c\xa8\x05E\xb3\x14L\x0e\x1a\xb4\xdb\x14 \x13p\x16\xb19\x90\xe6\xf6\x9e\xed\\eP\xc0\x1a\xa1\x10Y\\\xd1\xe1\x83\x92d\x81\xd4\x87\xddA\xfa\x06N\xb2\x7f\xf49\x8e\x1e\xf9\xa4\xee\xe1B\xa9\xbc\xc4\xd4\xd4\xbf\x11|\x81\xd9\xb9;XZ\xbb\x0e\x9c\x01\xcd\xb7\x17\xd8y\xb0\x865\x80\x81\xcc\xefn\"I\x86\xcay\x9e\x89\x01c\x0d\xc3\xfd\x05F\xfb\nT\x0b\x8e\xc8\x1aD\x95$\xf5,\xd5\x12fW\x9b4\x12\xcfN9U\xd3q\xf0Ni\x92\x9bT\xa5:\xcb\xea\xeae\x9c\x99\xb9\x1fO\x19\x11\xc0{r[\xce\x9b\x01\xcd3u\x08@\x80m\xab\xbd\x8b\xce;f\"\xcb5\x97\x0c\xa0\xe5\"\x8b\x85\x12+\xc5\x88V\x14\x11e\x9e\x81z\x93\xe1R\x93\x81j\xcc\xf1\xf9\x1a+\xb5\xa4\xf7\xb7[\xb6\xbf\xb8p= y\x03cR\x96V\xae\xc5S\xe1\xca\xe1\x02\x9fpI?\xd5\xc8\xe4fc\xe8/e\xdc:2\xcbg\\\xfe*\x97\x0d\xad\x82\x98ff\xeea}}\n\x9c\x01\x94F\x1aP\xb1|\xfeU/\xf0-7=\xc1\x93s\x1fM\xa5\x7f\x10\x1f\x0e\xd3\xf4}\x0cU=?w\xdf\xdf\xf2\xcd\xff\xf7\x91L\xaf]\xbag\x0eD!x$Sn\x1b)\xf2\xafNhe\x81\xd5\xa0|\xee\x08\xac&\xf0\xeb+\x8e\x16\x06\x1aM\xd8l\xa1\n\x18@r\x10\x95f\xe7\x00nv\xe6n\xb2\xb4\x02\x92\xc7uc8\xb3\x91\x80\x08\x7f~\xe2\x1a>\xee\xa2\xa3\xdcs\xe8i\xa6W\xcbx\x1d\xe3\xc0\xfe\"\xb5\xc2\xb5\x1c\x9e~\x9e\xd9z\x05\x00D \xec\x81$(\x84\x8c\xd5&\xfc\xef|B6\xe6\x01\xa5\x16\x84\xdf_\xef\xa3\xe1\xe9\x80!\n\x1buH3\x90\xde\xff\xf41\xebkWsf\xfa\xbeNBD\xc26\xa7\xa5\xeb\xb8'V\x07\xf8\xb1\x17\xeeauc\x9e\xa3gA\x81\xeb/\x0e\x1c\xcfn\xe2\x8b\xfe\xeb\x93xee\x1f\x88\xee\xdd\xb4\xbcB\x96\xa1>c\xad\xb5\xf5\x9er\x95\xab\xf3`\xbc\xcah\xa8!Y\x82\x84\x8c\xa2f\x8c\xfa&x\xbf-\xeb\xe7 Ys\x82\x10\xe2\x9e\x1b\xe8 \xa5\xaa\x80\xe7\x9fN]\xc27<\xfa\xf1\xd8B\xc6\xa7^\xfb\x0cqi\x04u\x03\xd4\x12G\xcb\x1b\x90\xbds\x10\x804\x80O\xc1g\x0cK\x8b;\xfd\"\x13\xabs\xdc\xd1~\xff\x8c\xf2\"\xd7D\x0d\xa2V\x83J\xd2\x84\xe0!Ka[bt\xec&\x1f\xf2l.\x10\x94@\xe0O\x0e_\xcd\xd3\x0b\xe3|\xc4\x81\xa3\xdcV\x9b\xe0tk\x1d\x1fx{\x94\x18\x883l\x96P\x0e FS\xb2V\xca\xf4\\J_\xd12\xd8\x1f\xf1\xcaR\xca\xc6R\x03\x8c@b \xdb\x9e\x86\x04\x05\x84\x9d\n\x01\x82\x805y\xf6V\x10\xcf\xb1\x95\x01~y\xe56\xe4eE\xa8\x13\x82\x01\xd5n\xe4A\x95=)\x18H#.w\x9er\xab\xc9\xe3\xae\xc2\xfe\xfe\x12U\xcd\xd8\x108\xd9PX[\x87\x90Aj\xa1ez*$\xf9\xae\xdf\xfa\xcfS?\xf4\x9f\xcb\x87\x1a\xbb\xfdQ\x8d\xb3`r\xc7\xd2\xbc\xed4#\x93\x03gy\xb9\xb2w\xe1\\\xc0\xc5\x9e\xcd\xd8B)\xc6\xc6\x8e\x8b\xab\x868Mym\xba\x86\xa6\x162\xdb\x0d\xf7%+|\xeb\xc3C\xb3\xf2\xf7\xff\xf1\xe8\xb7\xfe\xca\xe3\xeb\xdf\xf1\x0f\xaf\xd7+\x9b;`\xba{eL\xbe\xe2ta\xbac\"\x90\x97\xdco\x8b\x9d) \nF\xc1\x04\x10%6\x82Ch$\xb9\xa9+\x00\x14\x9c\xf01W\x96\x1b_z\xf7\xc0\xf7\xb9\xad?\xdaR\x90\x1b\xc7\xe3o\x98^\xcb\xc6w\x8d\x9e\x02\x18A\x8ca\xa7\xd4\xe7\xa6\xf7\x0ej\xa7\xfd\x1b\x81\xc9\x017w\xd7T\xf1gn;T\xf8\xe9\x0f\x01\xed\xf2ln\xbd\x85\x11\xa3\x00\x00\x00\x00IEND\xaeB`\x82\x01\x00\x00\xff\xffPK\x07\x08&\xd2\xc7\x1f\x1e\x0d\x00\x00\x14\x0d\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x89\x89\xb8H>\xd4\x17\xe7u\x02\x00\x006\x0e\x00\x00\x0b\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00favicon.icoUT\x05\x00\x01s\x8bDWPK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00j\x8dGM&\xd2\xc7\x1f\x1e\x0d\x00\x00\x14\x0d\x00\x00\x10\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb7\x02\x00\x00seaweed50x50.pngUT\x05\x00\x01\xb9E\xba[PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x89\x00\x00\x00\x1c\x10\x00\x00\x00\x00" + fs.Register(data) +} diff --git a/weed/weed.go b/weed/weed.go index b04a5a0d3..340da6625 100644 --- a/weed/weed.go +++ b/weed/weed.go @@ -1,3 +1,6 @@ +//go:generate statik -src=./static +// install this first "go get github.com/rakyll/statik" + package main import (