diff --git a/.example/os/gres/gres.go b/.example/os/gres/gres.go index 124627c5d..010fcf163 100644 --- a/.example/os/gres/gres.go +++ b/.example/os/gres/gres.go @@ -8,7 +8,8 @@ import ( func main() { gres.Dump() - g.Dump(gres.Scan("/root/image/", "*", true)) - g.Dump(gres.Scan("/template", "*")) - g.Dump(gres.Scan("/template/layout2", "*.html", true)) + g.Dump(gres.Scan("/root/image/logo", "*")) + //g.Dump(gres.Scan("/root/image/", "*", true)) + //g.Dump(gres.Scan("/template", "*")) + //g.Dump(gres.Scan("/template/layout2", "*.html", true)) } diff --git a/.example/os/gview/resource/main3.go b/.example/os/gview/resource/main3.go new file mode 100644 index 000000000..ad3dbfa1d --- /dev/null +++ b/.example/os/gview/resource/main3.go @@ -0,0 +1,18 @@ +package main + +import ( + "fmt" + + "github.com/gogf/gf/frame/g" + "github.com/gogf/gf/os/gres" + _ "github.com/gogf/gf/os/gres/testdata" +) + +func main() { + gres.Dump() + + v := g.View() + s, err := v.Parse("index.html") + fmt.Println(err) + fmt.Println(s) +} diff --git a/.example/util/gregex/gregex.go b/.example/text/gregex/gregex.go similarity index 100% rename from .example/util/gregex/gregex.go rename to .example/text/gregex/gregex.go diff --git a/.example/util/gstr/gstr_hidestr.go b/.example/text/gstr/gstr_hidestr.go similarity index 100% rename from .example/util/gstr/gstr_hidestr.go rename to .example/text/gstr/gstr_hidestr.go diff --git a/.example/util/gstr/gstr_substr.go b/.example/text/gstr/gstr_substr.go similarity index 100% rename from .example/util/gstr/gstr_substr.go rename to .example/text/gstr/gstr_substr.go diff --git a/.example/util/gi18n/gi18n-dir.go b/.example/util/gi18n/gi18n-dir.go new file mode 100644 index 000000000..3c6e9c534 --- /dev/null +++ b/.example/util/gi18n/gi18n-dir.go @@ -0,0 +1,18 @@ +package main + +import ( + "fmt" + + "github.com/gogf/gf/util/gi18n" +) + +func main() { + t := gi18n.New() + t.SetLanguage("ja") + err := t.SetPath("./i18n-dir") + if err != nil { + panic(err) + } + fmt.Println(t.Translate(`hello`)) + fmt.Println(t.Translate(`{#hello}}{#world}}!`)) +} diff --git a/.example/util/gi18n/gi18n-file.go b/.example/util/gi18n/gi18n-file.go new file mode 100644 index 000000000..ac8232945 --- /dev/null +++ b/.example/util/gi18n/gi18n-file.go @@ -0,0 +1,18 @@ +package main + +import ( + "fmt" + + "github.com/gogf/gf/util/gi18n" +) + +func main() { + t := gi18n.New() + t.SetLanguage("ja") + err := t.SetPath("./i18n-file") + if err != nil { + panic(err) + } + fmt.Println(t.Translate(`hello`)) + fmt.Println(t.Translate(`{#hello}}{#world}}!`)) +} diff --git a/.example/util/gi18n/gi18n.go b/.example/util/gi18n/gi18n.go new file mode 100644 index 000000000..1df9ed49a --- /dev/null +++ b/.example/util/gi18n/gi18n.go @@ -0,0 +1,15 @@ +package main + +import ( + "fmt" + + "github.com/gogf/gf/util/gi18n" +) + +func main() { + t := gi18n.New() + t.SetLanguage("ja") + fmt.Println(t.Translate(`hello`)) + fmt.Println(t.Translate(`{#hello}}{#world}}!`)) + +} diff --git a/.example/util/gi18n/i18n-dir/en/hello.toml b/.example/util/gi18n/i18n-dir/en/hello.toml new file mode 100644 index 000000000..1680a362c --- /dev/null +++ b/.example/util/gi18n/i18n-dir/en/hello.toml @@ -0,0 +1,2 @@ + +hello = "Hello" \ No newline at end of file diff --git a/.example/util/gi18n/i18n-dir/en/world.toml b/.example/util/gi18n/i18n-dir/en/world.toml new file mode 100644 index 000000000..f9afd1e67 --- /dev/null +++ b/.example/util/gi18n/i18n-dir/en/world.toml @@ -0,0 +1,2 @@ + +world = "World" \ No newline at end of file diff --git a/.example/util/gi18n/i18n-dir/ja/hello.yaml b/.example/util/gi18n/i18n-dir/ja/hello.yaml new file mode 100644 index 000000000..ec827cd49 --- /dev/null +++ b/.example/util/gi18n/i18n-dir/ja/hello.yaml @@ -0,0 +1,2 @@ + +hello: "こんにちは" \ No newline at end of file diff --git a/.example/util/gi18n/i18n-dir/ja/world.yaml b/.example/util/gi18n/i18n-dir/ja/world.yaml new file mode 100644 index 000000000..04e828b42 --- /dev/null +++ b/.example/util/gi18n/i18n-dir/ja/world.yaml @@ -0,0 +1 @@ +world: "世界" \ No newline at end of file diff --git a/.example/util/gi18n/i18n-dir/ru/hello.ini b/.example/util/gi18n/i18n-dir/ru/hello.ini new file mode 100644 index 000000000..d2e2af1ca --- /dev/null +++ b/.example/util/gi18n/i18n-dir/ru/hello.ini @@ -0,0 +1 @@ +hello = Привет \ No newline at end of file diff --git a/.example/util/gi18n/i18n-dir/ru/world.ini b/.example/util/gi18n/i18n-dir/ru/world.ini new file mode 100644 index 000000000..fffaf192d --- /dev/null +++ b/.example/util/gi18n/i18n-dir/ru/world.ini @@ -0,0 +1 @@ +world=мир \ No newline at end of file diff --git a/.example/util/gi18n/i18n-dir/zh-CN/hello.json b/.example/util/gi18n/i18n-dir/zh-CN/hello.json new file mode 100644 index 000000000..b8eb10e94 --- /dev/null +++ b/.example/util/gi18n/i18n-dir/zh-CN/hello.json @@ -0,0 +1,3 @@ +{ + "hello": "你好" +} \ No newline at end of file diff --git a/.example/util/gi18n/i18n-dir/zh-CN/world.json b/.example/util/gi18n/i18n-dir/zh-CN/world.json new file mode 100644 index 000000000..9d6392149 --- /dev/null +++ b/.example/util/gi18n/i18n-dir/zh-CN/world.json @@ -0,0 +1,3 @@ +{ + "world": "世界" +} \ No newline at end of file diff --git a/.example/util/gi18n/i18n-dir/zh-TW/hello.xml b/.example/util/gi18n/i18n-dir/zh-TW/hello.xml new file mode 100644 index 000000000..a4e52ef07 --- /dev/null +++ b/.example/util/gi18n/i18n-dir/zh-TW/hello.xml @@ -0,0 +1,4 @@ + + + 你好 + \ No newline at end of file diff --git a/.example/util/gi18n/i18n-dir/zh-TW/world.xml b/.example/util/gi18n/i18n-dir/zh-TW/world.xml new file mode 100644 index 000000000..877b402c5 --- /dev/null +++ b/.example/util/gi18n/i18n-dir/zh-TW/world.xml @@ -0,0 +1,4 @@ + + + 世界 + \ No newline at end of file diff --git a/.example/util/gi18n/i18n-file/en.toml b/.example/util/gi18n/i18n-file/en.toml new file mode 100644 index 000000000..17df41597 --- /dev/null +++ b/.example/util/gi18n/i18n-file/en.toml @@ -0,0 +1,3 @@ + +hello = "Hello" +world = "World" \ No newline at end of file diff --git a/.example/util/gi18n/i18n-file/ja.yaml b/.example/util/gi18n/i18n-file/ja.yaml new file mode 100644 index 000000000..0166fcefb --- /dev/null +++ b/.example/util/gi18n/i18n-file/ja.yaml @@ -0,0 +1,3 @@ + +hello: "こんにちは" +world: "世界" \ No newline at end of file diff --git a/.example/util/gi18n/i18n-file/ru.ini b/.example/util/gi18n/i18n-file/ru.ini new file mode 100644 index 000000000..f04620fab --- /dev/null +++ b/.example/util/gi18n/i18n-file/ru.ini @@ -0,0 +1,2 @@ +hello = Привет +world = мир \ No newline at end of file diff --git a/.example/util/gi18n/i18n-file/zh-CN.json b/.example/util/gi18n/i18n-file/zh-CN.json new file mode 100644 index 000000000..1de75ba1a --- /dev/null +++ b/.example/util/gi18n/i18n-file/zh-CN.json @@ -0,0 +1,4 @@ +{ + "hello": "你好", + "world": "世界" +} \ No newline at end of file diff --git a/.example/util/gi18n/i18n-file/zh-TW.xml b/.example/util/gi18n/i18n-file/zh-TW.xml new file mode 100644 index 000000000..9a4356f4c --- /dev/null +++ b/.example/util/gi18n/i18n-file/zh-TW.xml @@ -0,0 +1,5 @@ + + + 你好 + 世界 + \ No newline at end of file diff --git a/.example/util/gi18n/i18n/en.toml b/.example/util/gi18n/i18n/en.toml new file mode 100644 index 000000000..17df41597 --- /dev/null +++ b/.example/util/gi18n/i18n/en.toml @@ -0,0 +1,3 @@ + +hello = "Hello" +world = "World" \ No newline at end of file diff --git a/.example/util/gi18n/i18n/ja.toml b/.example/util/gi18n/i18n/ja.toml new file mode 100644 index 000000000..8ca47ed7f --- /dev/null +++ b/.example/util/gi18n/i18n/ja.toml @@ -0,0 +1,3 @@ + +hello = "こんにちは" +world = "世界" \ No newline at end of file diff --git a/.example/util/gi18n/i18n/ru.toml b/.example/util/gi18n/i18n/ru.toml new file mode 100644 index 000000000..938434a5a --- /dev/null +++ b/.example/util/gi18n/i18n/ru.toml @@ -0,0 +1,3 @@ + +hello = "Привет" +world = "мир" \ No newline at end of file diff --git a/.example/util/gi18n/i18n/zh-CN.toml b/.example/util/gi18n/i18n/zh-CN.toml new file mode 100644 index 000000000..b3a52c527 --- /dev/null +++ b/.example/util/gi18n/i18n/zh-CN.toml @@ -0,0 +1,2 @@ +hello = "你好" +world = "世界" \ No newline at end of file diff --git a/.example/util/gi18n/i18n/zh-TW.toml b/.example/util/gi18n/i18n/zh-TW.toml new file mode 100644 index 000000000..b3a52c527 --- /dev/null +++ b/.example/util/gi18n/i18n/zh-TW.toml @@ -0,0 +1,2 @@ +hello = "你好" +world = "世界" \ No newline at end of file diff --git a/.example/util/gi18n/resource/gi18n-resource.go b/.example/util/gi18n/resource/gi18n-resource.go new file mode 100644 index 000000000..48ea52528 --- /dev/null +++ b/.example/util/gi18n/resource/gi18n-resource.go @@ -0,0 +1,20 @@ +package main + +import ( + "fmt" + + "github.com/gogf/gf/frame/g" + + _ "github.com/gogf/gf/os/gres/testdata" +) + +func main() { + t := g.I18n() + t.SetLanguage("ja") + err := t.SetPath("/i18n-dir") + if err != nil { + panic(err) + } + fmt.Println(t.Translate(`hello`)) + fmt.Println(t.Translate(`{{hello}}{{world}}!`)) +} diff --git a/database/gdb/gdb_func.go b/database/gdb/gdb_func.go index cffab7410..9bd473b12 100644 --- a/database/gdb/gdb_func.go +++ b/database/gdb/gdb_func.go @@ -27,17 +27,17 @@ type apiString interface { } const ( - OrmTagForStruct = "orm" - OrmTagForUnique = "unique" - OrmTagForPrimary = "primary" + ORM_TAG_FOR_STRUCT = "orm" + ORM_TAG_FOR_UNIQUE = "unique" + ORM_TAG_FOR_PRIMARY = "primary" ) // 获得struct对象对应的where查询条件 func GetWhereConditionOfStruct(pointer interface{}) (where string, args []interface{}) { array := ([]string)(nil) - for tag, field := range structs.TagMapField(pointer, []string{OrmTagForStruct}, true) { + for tag, field := range structs.TagMapField(pointer, []string{ORM_TAG_FOR_STRUCT}, true) { array = strings.Split(tag, ",") - if len(array) > 1 && gstr.InArray([]string{OrmTagForUnique, OrmTagForPrimary}, array[1]) { + if len(array) > 1 && gstr.InArray([]string{ORM_TAG_FOR_UNIQUE, ORM_TAG_FOR_PRIMARY}, array[1]) { return array[0], []interface{}{field.Value()} } if len(where) > 0 { @@ -52,7 +52,7 @@ func GetWhereConditionOfStruct(pointer interface{}) (where string, args []interf // 获得orm标签与属性的映射关系 func GetOrmMappingOfStruct(pointer interface{}) map[string]string { mapping := make(map[string]string) - for tag, attr := range structs.TagMapName(pointer, []string{OrmTagForStruct}, true) { + for tag, attr := range structs.TagMapName(pointer, []string{ORM_TAG_FOR_STRUCT}, true) { mapping[strings.Split(tag, ",")[0]] = attr } return mapping @@ -172,7 +172,7 @@ func getInsertOperationByOption(option int) string { // 将对象转换为map,如果对象带有继承对象,那么执行递归转换。 // 该方法用于将变量传递给数据库执行之前。 func structToMap(obj interface{}) map[string]interface{} { - data := gconv.Map(obj, OrmTagForStruct) + data := gconv.Map(obj, ORM_TAG_FOR_STRUCT) for key, value := range data { rv := reflect.ValueOf(value) kind := rv.Kind() diff --git a/debug/gdebug/gdebug.go b/debug/gdebug/gdebug.go index 132990cfa..002b3525c 100644 --- a/debug/gdebug/gdebug.go +++ b/debug/gdebug/gdebug.go @@ -10,6 +10,7 @@ package gdebug import ( "bytes" "fmt" + "path/filepath" "runtime" "strings" ) @@ -187,6 +188,12 @@ func CallerFilePath() string { return path } +// CallerDirectory returns the directory of the caller. +func CallerDirectory() string { + _, path, _ := Caller() + return filepath.Dir(path) +} + // CallerFileLine returns the file path along with the line number of the caller. func CallerFileLine() string { _, path, line := Caller() diff --git a/encoding/gjson/gjson_api_new_load.go b/encoding/gjson/gjson_api_new_load.go index 53384901c..8341ff5c8 100644 --- a/encoding/gjson/gjson_api_new_load.go +++ b/encoding/gjson/gjson_api_new_load.go @@ -161,7 +161,7 @@ func doLoadContent(dataType string, data []byte, safe ...bool) (*Json, error) { dataType = checkDataType(data) } switch dataType { - case "json", ".json": + case "json", ".json", ".js": case "xml", ".xml": if data, err = gxml.ToJson(data); err != nil { diff --git a/frame/g/g_object.go b/frame/g/g_object.go index 2abdfe826..eb5d1753c 100644 --- a/frame/g/g_object.go +++ b/frame/g/g_object.go @@ -17,6 +17,7 @@ import ( "github.com/gogf/gf/os/gcfg" "github.com/gogf/gf/os/gres" "github.com/gogf/gf/os/gview" + "github.com/gogf/gf/util/gi18n" ) // Server returns an instance of http server with specified name. @@ -56,6 +57,12 @@ func Resource(name ...string) *gres.Resource { return gins.Resource(name...) } +// I18n returns an instance of gi18n.Translator. +// The parameter is the name for the instance. +func I18n(name ...string) *gi18n.Translator { + return gins.I18n(name...) +} + // Res is alias of Resource. // See Resource. func Res(name ...string) *gres.Resource { diff --git a/frame/gins/gins.go b/frame/gins/gins.go index 5d48999ad..19afbb333 100644 --- a/frame/gins/gins.go +++ b/frame/gins/gins.go @@ -26,6 +26,7 @@ import ( "github.com/gogf/gf/text/gregex" "github.com/gogf/gf/text/gstr" "github.com/gogf/gf/util/gconv" + "github.com/gogf/gf/util/gi18n" ) const ( @@ -85,6 +86,12 @@ func Resource(name ...string) *gres.Resource { return gres.Instance(name...) } +// I18n returns an instance of gi18n.Translator. +// The parameter is the name for the instance. +func I18n(name ...string) *gi18n.Translator { + return gi18n.Instance(name...) +} + // Database returns an instance of database ORM object // with specified configuration group name. func Database(name ...string) gdb.DB { diff --git a/os/gfile/gfile_scan.go b/os/gfile/gfile_scan.go index 269c6a74f..1ecb9c8ce 100644 --- a/os/gfile/gfile_scan.go +++ b/os/gfile/gfile_scan.go @@ -35,7 +35,7 @@ func ScanDir(path string, pattern string, recursive ...bool) ([]string, error) { // // Note that it returns only files, exclusive of directories. func ScanDirFile(path string, pattern string, recursive ...bool) ([]string, error) { - isRecursive := true + isRecursive := false if len(recursive) > 0 { isRecursive = recursive[0] } diff --git a/os/gres/gres.go b/os/gres/gres.go index f9be294ea..3a927be02 100644 --- a/os/gres/gres.go +++ b/os/gres/gres.go @@ -7,6 +7,11 @@ // Package gres provides resource management and packing/unpacking feature between files and bytes. package gres +const ( + // Separator for directories. + Separator = "/" +) + var ( // Default resource object. defaultResource = Instance() @@ -54,14 +59,22 @@ func IsEmpty() bool { return defaultResource.tree.IsEmpty() } -// Scan returns the files under the given path, the parameter should be a folder type. +// ScanDir returns the files under the given path, the parameter should be a folder type. // // The pattern parameter supports multiple file name patterns, // using the ',' symbol to separate multiple patterns. // // It scans directory recursively if given parameter is true. -func Scan(path string, pattern string, recursive ...bool) []*File { - return defaultResource.Scan(path, pattern, recursive...) +func ScanDir(path string, pattern string, recursive ...bool) []*File { + return defaultResource.ScanDir(path, pattern, recursive...) +} + +// ScanDirFile returns all sub-files with absolute paths of given , +// It scans directory recursively if given parameter is true. +// +// Note that it returns only files, exclusive of directories. +func ScanDirFile(path string, pattern string, recursive ...bool) []*File { + return defaultResource.ScanDirFile(path, pattern, recursive...) } // Dump prints the files of the default resource object. diff --git a/os/gres/gres_http_file.go b/os/gres/gres_http_file.go index 33f8295ff..c35554268 100644 --- a/os/gres/gres_http_file.go +++ b/os/gres/gres_http_file.go @@ -18,7 +18,7 @@ func (f *File) Close() error { // Readdir implements Readdir interface of http.File. func (f *File) Readdir(count int) ([]os.FileInfo, error) { - files := f.resource.Scan(f.Name(), "*", false) + files := f.resource.ScanDir(f.Name(), "*", false) if len(files) > 0 { if count < 0 || count > len(files) { count = len(files) diff --git a/os/gres/gres_resource.go b/os/gres/gres_resource.go index 29581ff4f..8d30dd07c 100644 --- a/os/gres/gres_resource.go +++ b/os/gres/gres_resource.go @@ -122,13 +122,40 @@ func (r *Resource) IsEmpty() bool { return r.tree.IsEmpty() } -// Scan returns the files under the given path, the parameter should be a folder type. +// ScanDir returns the files under the given path, the parameter should be a folder type. // // The pattern parameter supports multiple file name patterns, // using the ',' symbol to separate multiple patterns. // // It scans directory recursively if given parameter is true. -func (r *Resource) Scan(path string, pattern string, recursive ...bool) []*File { +func (r *Resource) ScanDir(path string, pattern string, recursive ...bool) []*File { + isRecursive := false + if len(recursive) > 0 { + isRecursive = recursive[0] + } + return r.doScanDir(path, pattern, isRecursive, false) +} + +// ScanDirFile returns all sub-files with absolute paths of given , +// It scans directory recursively if given parameter is true. +// +// Note that it returns only files, exclusive of directories. +func (r *Resource) ScanDirFile(path string, pattern string, recursive ...bool) []*File { + isRecursive := false + if len(recursive) > 0 { + isRecursive = recursive[0] + } + return r.doScanDir(path, pattern, isRecursive, true) +} + +// doScanDir is an internal method which scans directory +// and returns the absolute path list of files that are not sorted. +// +// The pattern parameter supports multiple file name patterns, +// using the ',' symbol to separate multiple patterns. +// +// It scans directory recursively if given parameter is true. +func (r *Resource) doScanDir(path string, pattern string, recursive bool, onlyFile bool) []*File { if path != "/" { for path[len(path)-1] == '/' { path = path[:len(path)-1] @@ -150,6 +177,9 @@ func (r *Resource) Scan(path string, pattern string, recursive ...bool) []*File } first = false } + if onlyFile && value.(*File).FileInfo().IsDir() { + return true + } name = key.(string) if len(name) <= length { return true @@ -157,7 +187,11 @@ func (r *Resource) Scan(path string, pattern string, recursive ...bool) []*File if path != name[:length] { return false } - if len(recursive) == 0 || !recursive[0] { + // To avoid of, eg: /i18n and /i18n-dir + if !first && name[length] != '/' { + return true + } + if !recursive { if strings.IndexByte(name[length+1:], '/') != -1 { return true } diff --git a/os/gres/testdata/files/i18n-dir/en/hello.toml b/os/gres/testdata/files/i18n-dir/en/hello.toml new file mode 100644 index 000000000..1680a362c --- /dev/null +++ b/os/gres/testdata/files/i18n-dir/en/hello.toml @@ -0,0 +1,2 @@ + +hello = "Hello" \ No newline at end of file diff --git a/os/gres/testdata/files/i18n-dir/en/world.toml b/os/gres/testdata/files/i18n-dir/en/world.toml new file mode 100644 index 000000000..f9afd1e67 --- /dev/null +++ b/os/gres/testdata/files/i18n-dir/en/world.toml @@ -0,0 +1,2 @@ + +world = "World" \ No newline at end of file diff --git a/os/gres/testdata/files/i18n-dir/ja/hello.yaml b/os/gres/testdata/files/i18n-dir/ja/hello.yaml new file mode 100644 index 000000000..ec827cd49 --- /dev/null +++ b/os/gres/testdata/files/i18n-dir/ja/hello.yaml @@ -0,0 +1,2 @@ + +hello: "こんにちは" \ No newline at end of file diff --git a/os/gres/testdata/files/i18n-dir/ja/world.yaml b/os/gres/testdata/files/i18n-dir/ja/world.yaml new file mode 100644 index 000000000..04e828b42 --- /dev/null +++ b/os/gres/testdata/files/i18n-dir/ja/world.yaml @@ -0,0 +1 @@ +world: "世界" \ No newline at end of file diff --git a/os/gres/testdata/files/i18n-dir/ru/hello.ini b/os/gres/testdata/files/i18n-dir/ru/hello.ini new file mode 100644 index 000000000..d2e2af1ca --- /dev/null +++ b/os/gres/testdata/files/i18n-dir/ru/hello.ini @@ -0,0 +1 @@ +hello = Привет \ No newline at end of file diff --git a/os/gres/testdata/files/i18n-dir/ru/world.ini b/os/gres/testdata/files/i18n-dir/ru/world.ini new file mode 100644 index 000000000..fffaf192d --- /dev/null +++ b/os/gres/testdata/files/i18n-dir/ru/world.ini @@ -0,0 +1 @@ +world=мир \ No newline at end of file diff --git a/os/gres/testdata/files/i18n-dir/zh-CN/hello.json b/os/gres/testdata/files/i18n-dir/zh-CN/hello.json new file mode 100644 index 000000000..b8eb10e94 --- /dev/null +++ b/os/gres/testdata/files/i18n-dir/zh-CN/hello.json @@ -0,0 +1,3 @@ +{ + "hello": "你好" +} \ No newline at end of file diff --git a/os/gres/testdata/files/i18n-dir/zh-CN/world.json b/os/gres/testdata/files/i18n-dir/zh-CN/world.json new file mode 100644 index 000000000..9d6392149 --- /dev/null +++ b/os/gres/testdata/files/i18n-dir/zh-CN/world.json @@ -0,0 +1,3 @@ +{ + "world": "世界" +} \ No newline at end of file diff --git a/os/gres/testdata/files/i18n-dir/zh-TW/hello.xml b/os/gres/testdata/files/i18n-dir/zh-TW/hello.xml new file mode 100644 index 000000000..a4e52ef07 --- /dev/null +++ b/os/gres/testdata/files/i18n-dir/zh-TW/hello.xml @@ -0,0 +1,4 @@ + + + 你好 + \ No newline at end of file diff --git a/os/gres/testdata/files/i18n-dir/zh-TW/world.xml b/os/gres/testdata/files/i18n-dir/zh-TW/world.xml new file mode 100644 index 000000000..877b402c5 --- /dev/null +++ b/os/gres/testdata/files/i18n-dir/zh-TW/world.xml @@ -0,0 +1,4 @@ + + + 世界 + \ No newline at end of file diff --git a/os/gres/testdata/files/i18n-file/en.toml b/os/gres/testdata/files/i18n-file/en.toml new file mode 100644 index 000000000..17df41597 --- /dev/null +++ b/os/gres/testdata/files/i18n-file/en.toml @@ -0,0 +1,3 @@ + +hello = "Hello" +world = "World" \ No newline at end of file diff --git a/os/gres/testdata/files/i18n-file/ja.yaml b/os/gres/testdata/files/i18n-file/ja.yaml new file mode 100644 index 000000000..0166fcefb --- /dev/null +++ b/os/gres/testdata/files/i18n-file/ja.yaml @@ -0,0 +1,3 @@ + +hello: "こんにちは" +world: "世界" \ No newline at end of file diff --git a/os/gres/testdata/files/i18n-file/ru.ini b/os/gres/testdata/files/i18n-file/ru.ini new file mode 100644 index 000000000..f04620fab --- /dev/null +++ b/os/gres/testdata/files/i18n-file/ru.ini @@ -0,0 +1,2 @@ +hello = Привет +world = мир \ No newline at end of file diff --git a/os/gres/testdata/files/i18n-file/zh-CN.json b/os/gres/testdata/files/i18n-file/zh-CN.json new file mode 100644 index 000000000..1de75ba1a --- /dev/null +++ b/os/gres/testdata/files/i18n-file/zh-CN.json @@ -0,0 +1,4 @@ +{ + "hello": "你好", + "world": "世界" +} \ No newline at end of file diff --git a/os/gres/testdata/files/i18n-file/zh-TW.xml b/os/gres/testdata/files/i18n-file/zh-TW.xml new file mode 100644 index 000000000..9a4356f4c --- /dev/null +++ b/os/gres/testdata/files/i18n-file/zh-TW.xml @@ -0,0 +1,5 @@ + + + 你好 + 世界 + \ No newline at end of file diff --git a/os/gres/testdata/files/i18n/en.toml b/os/gres/testdata/files/i18n/en.toml new file mode 100644 index 000000000..17df41597 --- /dev/null +++ b/os/gres/testdata/files/i18n/en.toml @@ -0,0 +1,3 @@ + +hello = "Hello" +world = "World" \ No newline at end of file diff --git a/os/gres/testdata/files/i18n/ja.toml b/os/gres/testdata/files/i18n/ja.toml new file mode 100644 index 000000000..8ca47ed7f --- /dev/null +++ b/os/gres/testdata/files/i18n/ja.toml @@ -0,0 +1,3 @@ + +hello = "こんにちは" +world = "世界" \ No newline at end of file diff --git a/os/gres/testdata/files/i18n/ru.toml b/os/gres/testdata/files/i18n/ru.toml new file mode 100644 index 000000000..938434a5a --- /dev/null +++ b/os/gres/testdata/files/i18n/ru.toml @@ -0,0 +1,3 @@ + +hello = "Привет" +world = "мир" \ No newline at end of file diff --git a/os/gres/testdata/files/i18n/zh-CN.toml b/os/gres/testdata/files/i18n/zh-CN.toml new file mode 100644 index 000000000..b3a52c527 --- /dev/null +++ b/os/gres/testdata/files/i18n/zh-CN.toml @@ -0,0 +1,2 @@ +hello = "你好" +world = "世界" \ No newline at end of file diff --git a/os/gres/testdata/files/i18n/zh-TW.toml b/os/gres/testdata/files/i18n/zh-TW.toml new file mode 100644 index 000000000..b3a52c527 --- /dev/null +++ b/os/gres/testdata/files/i18n/zh-TW.toml @@ -0,0 +1,2 @@ +hello = "你好" +world = "世界" \ No newline at end of file diff --git a/os/gres/testdata/files/template/index.html b/os/gres/testdata/files/template/index.html new file mode 100644 index 000000000..5044efbc3 --- /dev/null +++ b/os/gres/testdata/files/template/index.html @@ -0,0 +1 @@ +It's the index template file. \ No newline at end of file diff --git a/os/gres/testdata/testdata.go b/os/gres/testdata/testdata.go index 228f35f9e..988f7391a 100644 --- a/os/gres/testdata/testdata.go +++ b/os/gres/testdata/testdata.go @@ -3,7 +3,7 @@ package testdata import "github.com/gogf/gf/os/gres" func init() { - if err := gres.Add([]byte{80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 157, 99, 19, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 9, 0, 47, 99, 111, 110, 102, 105, 103, 85, 84, 5, 0, 1, 10, 150, 90, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 152, 99, 19, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 9, 0, 47, 99, 111, 110, 102, 105, 103, 45, 99, 117, 115, 116, 111, 109, 85, 84, 5, 0, 1, 0, 150, 90, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 225, 99, 19, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 9, 0, 47, 99, 111, 110, 102, 105, 103, 45, 99, 117, 115, 116, 111, 109, 47, 99, 111, 110, 102, 105, 103, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 134, 150, 90, 93, 118, 105, 101, 119, 112, 97, 116, 104, 32, 61, 32, 34, 47, 104, 111, 109, 101, 47, 119, 119, 119, 47, 116, 101, 109, 112, 108, 97, 116, 101, 115, 34, 10, 91, 114, 101, 100, 105, 115, 93, 10, 32, 32, 32, 32, 100, 105, 115, 107, 32, 32, 61, 32, 34, 49, 50, 55, 46, 48, 46, 48, 46, 49, 58, 54, 51, 55, 57, 44, 52, 34, 10, 32, 32, 32, 32, 99, 97, 99, 104, 101, 32, 61, 32, 34, 49, 50, 55, 46, 48, 46, 48, 46, 49, 58, 54, 51, 55, 57, 44, 53, 34, 80, 75, 7, 8, 84, 68, 54, 219, 102, 0, 0, 0, 102, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 230, 99, 19, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 9, 0, 47, 99, 111, 110, 102, 105, 103, 45, 99, 117, 115, 116, 111, 109, 47, 109, 121, 46, 105, 110, 105, 85, 84, 5, 0, 1, 144, 150, 90, 93, 118, 105, 101, 119, 112, 97, 116, 104, 32, 61, 32, 34, 47, 104, 111, 109, 101, 47, 119, 119, 119, 47, 116, 101, 109, 112, 108, 97, 116, 101, 115, 34, 10, 91, 114, 101, 100, 105, 115, 93, 10, 32, 32, 32, 32, 100, 105, 115, 107, 32, 32, 61, 32, 34, 49, 50, 55, 46, 48, 46, 48, 46, 49, 58, 54, 51, 55, 57, 44, 54, 34, 10, 32, 32, 32, 32, 99, 97, 99, 104, 101, 32, 61, 32, 34, 49, 50, 55, 46, 48, 46, 48, 46, 49, 58, 54, 51, 55, 57, 44, 55, 34, 80, 75, 7, 8, 48, 7, 229, 132, 102, 0, 0, 0, 102, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 150, 99, 19, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 9, 0, 47, 99, 111, 110, 102, 105, 103, 47, 99, 111, 110, 102, 105, 103, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 253, 149, 90, 93, 118, 105, 101, 119, 112, 97, 116, 104, 32, 61, 32, 34, 47, 104, 111, 109, 101, 47, 119, 119, 119, 47, 116, 101, 109, 112, 108, 97, 116, 101, 115, 34, 10, 91, 114, 101, 100, 105, 115, 93, 10, 32, 32, 32, 32, 100, 105, 115, 107, 32, 32, 61, 32, 34, 49, 50, 55, 46, 48, 46, 48, 46, 49, 58, 54, 51, 55, 57, 44, 48, 34, 10, 32, 32, 32, 32, 99, 97, 99, 104, 101, 32, 61, 32, 34, 49, 50, 55, 46, 48, 46, 48, 46, 49, 58, 54, 51, 55, 57, 44, 49, 34, 80, 75, 7, 8, 156, 194, 144, 100, 102, 0, 0, 0, 102, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 225, 99, 19, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 9, 0, 47, 99, 111, 110, 102, 105, 103, 47, 109, 121, 46, 105, 110, 105, 85, 84, 5, 0, 1, 135, 150, 90, 93, 118, 105, 101, 119, 112, 97, 116, 104, 32, 61, 32, 34, 47, 104, 111, 109, 101, 47, 119, 119, 119, 47, 116, 101, 109, 112, 108, 97, 116, 101, 115, 34, 10, 91, 114, 101, 100, 105, 115, 93, 10, 32, 32, 32, 32, 100, 105, 115, 107, 32, 32, 61, 32, 34, 49, 50, 55, 46, 48, 46, 48, 46, 49, 58, 54, 51, 55, 57, 44, 50, 34, 10, 32, 32, 32, 32, 99, 97, 99, 104, 101, 32, 61, 32, 34, 49, 50, 55, 46, 48, 46, 48, 46, 49, 58, 54, 51, 55, 57, 44, 51, 34, 80, 75, 7, 8, 248, 129, 67, 59, 102, 0, 0, 0, 102, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 161, 85, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 9, 0, 47, 100, 105, 114, 49, 85, 84, 5, 0, 1, 175, 148, 82, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 161, 85, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 9, 0, 47, 100, 105, 114, 49, 47, 116, 101, 115, 116, 49, 85, 84, 5, 0, 1, 175, 148, 82, 93, 116, 101, 115, 116, 49, 32, 99, 111, 110, 116, 101, 110, 116, 10, 80, 75, 7, 8, 130, 50, 74, 209, 14, 0, 0, 0, 14, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 161, 85, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 9, 0, 47, 100, 105, 114, 50, 85, 84, 5, 0, 1, 175, 148, 82, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 161, 85, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 9, 0, 47, 100, 105, 114, 50, 47, 116, 101, 115, 116, 50, 85, 84, 5, 0, 1, 175, 148, 82, 93, 116, 101, 115, 116, 50, 32, 99, 111, 110, 116, 101, 110, 116, 10, 80, 75, 7, 8, 129, 137, 125, 58, 14, 0, 0, 0, 14, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 130, 109, 14, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 9, 0, 47, 114, 111, 111, 116, 85, 84, 5, 0, 1, 37, 16, 84, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 132, 101, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 9, 0, 47, 114, 111, 111, 116, 47, 99, 115, 115, 85, 84, 5, 0, 1, 152, 176, 82, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 132, 101, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 9, 0, 47, 114, 111, 111, 116, 47, 99, 115, 115, 47, 115, 116, 121, 108, 101, 46, 99, 115, 115, 85, 84, 5, 0, 1, 152, 176, 82, 93, 42, 32, 123, 10, 32, 32, 32, 32, 102, 111, 110, 116, 45, 115, 105, 122, 101, 58, 32, 51, 50, 112, 120, 59, 10, 32, 32, 32, 32, 116, 101, 120, 116, 45, 97, 108, 105, 103, 110, 58, 32, 99, 101, 110, 116, 101, 114, 59, 10, 125, 80, 75, 7, 8, 42, 222, 98, 234, 50, 0, 0, 0, 50, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 74, 101, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 9, 0, 47, 114, 111, 111, 116, 47, 105, 109, 97, 103, 101, 85, 84, 5, 0, 1, 44, 176, 82, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 36, 101, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 9, 0, 47, 114, 111, 111, 116, 47, 105, 109, 97, 103, 101, 47, 108, 111, 103, 111, 46, 112, 110, 103, 85, 84, 5, 0, 1, 228, 175, 82, 93, 137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 50, 0, 0, 0, 50, 8, 6, 0, 0, 0, 30, 63, 136, 177, 0, 0, 0, 1, 115, 82, 71, 66, 0, 174, 206, 28, 233, 0, 0, 0, 9, 112, 72, 89, 115, 0, 0, 11, 19, 0, 0, 11, 19, 1, 0, 154, 156, 24, 0, 0, 2, 174, 105, 84, 88, 116, 88, 77, 76, 58, 99, 111, 109, 46, 97, 100, 111, 98, 101, 46, 120, 109, 112, 0, 0, 0, 0, 0, 60, 120, 58, 120, 109, 112, 109, 101, 116, 97, 32, 120, 109, 108, 110, 115, 58, 120, 61, 34, 97, 100, 111, 98, 101, 58, 110, 115, 58, 109, 101, 116, 97, 47, 34, 32, 120, 58, 120, 109, 112, 116, 107, 61, 34, 88, 77, 80, 32, 67, 111, 114, 101, 32, 53, 46, 52, 46, 48, 34, 62, 10, 32, 32, 32, 60, 114, 100, 102, 58, 82, 68, 70, 32, 120, 109, 108, 110, 115, 58, 114, 100, 102, 61, 34, 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 119, 51, 46, 111, 114, 103, 47, 49, 57, 57, 57, 47, 48, 50, 47, 50, 50, 45, 114, 100, 102, 45, 115, 121, 110, 116, 97, 120, 45, 110, 115, 35, 34, 62, 10, 32, 32, 32, 32, 32, 32, 60, 114, 100, 102, 58, 68, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 32, 114, 100, 102, 58, 97, 98, 111, 117, 116, 61, 34, 34, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 120, 109, 108, 110, 115, 58, 120, 109, 112, 61, 34, 104, 116, 116, 112, 58, 47, 47, 110, 115, 46, 97, 100, 111, 98, 101, 46, 99, 111, 109, 47, 120, 97, 112, 47, 49, 46, 48, 47, 34, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 120, 109, 108, 110, 115, 58, 100, 99, 61, 34, 104, 116, 116, 112, 58, 47, 47, 112, 117, 114, 108, 46, 111, 114, 103, 47, 100, 99, 47, 101, 108, 101, 109, 101, 110, 116, 115, 47, 49, 46, 49, 47, 34, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 120, 109, 108, 110, 115, 58, 116, 105, 102, 102, 61, 34, 104, 116, 116, 112, 58, 47, 47, 110, 115, 46, 97, 100, 111, 98, 101, 46, 99, 111, 109, 47, 116, 105, 102, 102, 47, 49, 46, 48, 47, 34, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 120, 109, 112, 58, 67, 114, 101, 97, 116, 101, 68, 97, 116, 101, 62, 50, 48, 49, 57, 45, 48, 53, 45, 48, 54, 84, 49, 50, 58, 51, 50, 58, 49, 53, 90, 60, 47, 120, 109, 112, 58, 67, 114, 101, 97, 116, 101, 68, 97, 116, 101, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 120, 109, 112, 58, 67, 114, 101, 97, 116, 111, 114, 84, 111, 111, 108, 62, 65, 100, 111, 98, 101, 32, 70, 105, 114, 101, 119, 111, 114, 107, 115, 32, 67, 83, 52, 60, 47, 120, 109, 112, 58, 67, 114, 101, 97, 116, 111, 114, 84, 111, 111, 108, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 120, 109, 112, 58, 77, 111, 100, 105, 102, 121, 68, 97, 116, 101, 62, 50, 48, 49, 57, 45, 48, 53, 45, 48, 54, 84, 49, 53, 58, 53, 54, 58, 51, 56, 90, 60, 47, 120, 109, 112, 58, 77, 111, 100, 105, 102, 121, 68, 97, 116, 101, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 100, 99, 58, 102, 111, 114, 109, 97, 116, 62, 105, 109, 97, 103, 101, 47, 112, 110, 103, 60, 47, 100, 99, 58, 102, 111, 114, 109, 97, 116, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 116, 105, 102, 102, 58, 79, 114, 105, 101, 110, 116, 97, 116, 105, 111, 110, 62, 49, 60, 47, 116, 105, 102, 102, 58, 79, 114, 105, 101, 110, 116, 97, 116, 105, 111, 110, 62, 10, 32, 32, 32, 32, 32, 32, 60, 47, 114, 100, 102, 58, 68, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 62, 10, 32, 32, 32, 60, 47, 114, 100, 102, 58, 82, 68, 70, 62, 10, 60, 47, 120, 58, 120, 109, 112, 109, 101, 116, 97, 62, 10, 240, 91, 212, 3, 0, 0, 10, 127, 73, 68, 65, 84, 104, 5, 237, 88, 91, 111, 84, 215, 25, 93, 103, 110, 103, 110, 182, 199, 6, 204, 197, 24, 39, 24, 227, 16, 18, 5, 66, 83, 4, 42, 130, 144, 168, 85, 83, 210, 70, 74, 85, 34, 66, 85, 41, 85, 212, 180, 79, 125, 232, 99, 171, 62, 20, 84, 169, 15, 81, 251, 7, 218, 190, 71, 109, 138, 130, 34, 133, 18, 32, 225, 106, 162, 38, 33, 142, 12, 118, 77, 76, 32, 181, 185, 4, 99, 123, 108, 207, 229, 204, 153, 233, 90, 251, 204, 57, 30, 12, 38, 78, 99, 75, 41, 242, 150, 246, 204, 153, 125, 89, 223, 183, 190, 219, 222, 103, 172, 63, 156, 24, 172, 224, 62, 104, 161, 251, 128, 131, 161, 176, 64, 228, 235, 230, 201, 5, 143, 44, 120, 100, 158, 44, 176, 16, 90, 243, 100, 216, 255, 25, 246, 190, 241, 72, 100, 182, 38, 176, 184, 80, 189, 182, 233, 74, 48, 23, 215, 2, 31, 215, 255, 246, 101, 124, 25, 252, 47, 36, 226, 19, 112, 136, 170, 238, 41, 110, 145, 84, 5, 33, 78, 70, 217, 195, 148, 92, 246, 165, 127, 137, 111, 31, 187, 84, 197, 46, 7, 166, 34, 54, 113, 98, 194, 102, 159, 13, 246, 61, 137, 72, 144, 75, 33, 5, 246, 134, 112, 5, 109, 209, 50, 210, 17, 79, 92, 177, 108, 225, 86, 41, 132, 155, 78, 8, 19, 156, 143, 83, 178, 132, 243, 113, 86, 77, 107, 101, 24, 97, 215, 133, 42, 88, 30, 43, 35, 67, 236, 40, 39, 52, 62, 74, 220, 171, 78, 24, 19, 100, 145, 224, 152, 116, 185, 23, 246, 140, 68, 36, 40, 111, 64, 42, 216, 84, 231, 160, 53, 81, 66, 130, 130, 52, 174, 38, 208, 18, 201, 140, 147, 204, 192, 100, 4, 23, 114, 81, 20, 57, 104, 207, 194, 130, 82, 42, 71, 236, 134, 72, 5, 79, 164, 28, 172, 136, 151, 144, 12, 151, 141, 245, 133, 173, 38, 3, 102, 75, 97, 244, 79, 68, 113, 158, 248, 218, 19, 169, 98, 235, 121, 122, 187, 43, 145, 16, 213, 156, 164, 146, 43, 104, 165, 205, 153, 60, 26, 233, 9, 1, 151, 43, 150, 249, 54, 32, 68, 179, 216, 51, 49, 23, 143, 179, 139, 232, 169, 145, 56, 70, 74, 150, 241, 206, 76, 225, 32, 37, 68, 98, 117, 220, 197, 55, 26, 10, 198, 195, 6, 155, 170, 58, 53, 155, 132, 221, 16, 229, 154, 140, 139, 229, 118, 4, 167, 70, 109, 26, 214, 50, 161, 44, 35, 78, 111, 190, 129, 131, 113, 13, 228, 184, 97, 37, 73, 236, 88, 148, 67, 134, 36, 10, 252, 237, 146, 132, 154, 4, 152, 206, 103, 1, 202, 43, 14, 123, 179, 237, 98, 39, 215, 55, 210, 202, 242, 140, 183, 90, 59, 166, 154, 135, 13, 172, 77, 184, 248, 86, 83, 14, 73, 122, 216, 199, 22, 86, 128, 93, 221, 236, 99, 175, 76, 150, 240, 84, 83, 158, 6, 170, 64, 249, 52, 19, 118, 32, 73, 11, 164, 132, 242, 97, 75, 99, 30, 49, 110, 84, 46, 40, 169, 37, 164, 92, 46, 223, 214, 181, 222, 23, 46, 133, 234, 169, 216, 102, 90, 89, 77, 138, 213, 54, 31, 91, 68, 31, 111, 200, 155, 125, 50, 128, 143, 141, 74, 229, 54, 236, 10, 127, 7, 216, 174, 133, 69, 52, 212, 86, 98, 11, 119, 58, 182, 228, 220, 225, 17, 49, 222, 84, 95, 68, 29, 149, 242, 5, 9, 84, 61, 22, 139, 33, 145, 72, 32, 153, 76, 34, 30, 183, 205, 152, 198, 13, 16, 53, 21, 233, 102, 198, 123, 59, 187, 242, 107, 58, 184, 146, 248, 97, 230, 68, 146, 100, 100, 109, 145, 80, 243, 148, 182, 2, 236, 68, 60, 142, 72, 36, 130, 10, 13, 167, 166, 117, 69, 146, 105, 97, 248, 174, 79, 58, 38, 52, 21, 254, 181, 45, 200, 17, 97, 22, 184, 79, 33, 181, 130, 27, 28, 134, 146, 44, 226, 11, 17, 240, 208, 208, 16, 6, 6, 46, 33, 159, 207, 99, 205, 154, 118, 180, 181, 181, 193, 113, 156, 96, 141, 160, 133, 211, 194, 248, 239, 203, 81, 145, 26, 73, 202, 131, 20, 61, 188, 212, 46, 153, 60, 211, 58, 53, 225, 135, 195, 97, 227, 141, 15, 207, 157, 195, 224, 224, 32, 26, 51, 25, 116, 118, 118, 34, 195, 239, 98, 177, 72, 61, 188, 213, 162, 181, 134, 134, 248, 55, 177, 75, 212, 79, 165, 217, 151, 113, 155, 209, 180, 240, 65, 146, 136, 90, 116, 51, 87, 232, 172, 208, 137, 17, 10, 133, 112, 228, 200, 81, 124, 115, 203, 86, 236, 222, 179, 7, 99, 217, 49, 156, 56, 121, 18, 199, 222, 121, 135, 150, 211, 41, 226, 53, 137, 19, 176, 188, 105, 19, 217, 179, 167, 71, 78, 158, 206, 208, 19, 9, 134, 173, 138, 134, 111, 36, 97, 75, 217, 127, 28, 56, 128, 203, 151, 47, 163, 175, 175, 15, 207, 255, 104, 55, 126, 250, 242, 203, 232, 191, 120, 209, 68, 129, 66, 90, 235, 93, 122, 177, 142, 57, 187, 138, 134, 154, 158, 135, 1, 17, 41, 174, 122, 189, 136, 21, 72, 10, 104, 99, 153, 131, 49, 59, 134, 222, 222, 94, 252, 228, 165, 151, 140, 182, 191, 223, 191, 15, 63, 222, 187, 23, 123, 95, 124, 17, 7, 15, 30, 196, 133, 222, 62, 134, 89, 220, 88, 84, 238, 80, 164, 69, 105, 249, 24, 141, 81, 141, 58, 13, 27, 204, 4, 199, 195, 28, 247, 155, 188, 97, 219, 54, 222, 62, 114, 4, 227, 217, 113, 236, 165, 145, 126, 254, 202, 43, 248, 254, 174, 239, 161, 235, 236, 123, 216, 183, 111, 63, 70, 70, 70, 16, 141, 70, 141, 231, 180, 79, 10, 47, 165, 142, 106, 83, 72, 213, 48, 150, 32, 77, 165, 89, 203, 19, 236, 34, 165, 85, 114, 169, 172, 113, 250, 204, 25, 14, 144, 100, 166, 1, 103, 206, 116, 225, 252, 249, 243, 248, 148, 214, 251, 219, 107, 175, 161, 187, 187, 219, 204, 9, 195, 71, 214, 179, 122, 173, 32, 77, 203, 56, 126, 243, 67, 42, 151, 203, 225, 173, 183, 14, 97, 224, 211, 75, 184, 56, 48, 128, 30, 98, 159, 237, 234, 194, 67, 107, 59, 112, 152, 4, 123, 122, 122, 188, 124, 145, 85, 184, 95, 152, 242, 184, 110, 20, 181, 248, 65, 142, 72, 121, 255, 74, 160, 128, 210, 50, 159, 72, 54, 155, 53, 242, 23, 47, 89, 130, 3, 111, 188, 129, 147, 199, 223, 69, 166, 177, 201, 156, 192, 202, 17, 145, 245, 181, 148, 178, 138, 95, 37, 182, 239, 110, 9, 20, 162, 138, 129, 135, 109, 224, 12, 190, 194, 74, 24, 127, 254, 203, 95, 241, 206, 177, 99, 36, 115, 201, 76, 10, 95, 45, 75, 79, 5, 141, 64, 132, 54, 167, 191, 136, 40, 239, 124, 227, 248, 178, 106, 215, 122, 207, 85, 111, 40, 201, 59, 58, 58, 204, 88, 58, 157, 70, 71, 123, 59, 98, 12, 165, 100, 42, 101, 198, 90, 91, 91, 77, 14, 201, 194, 106, 82, 56, 199, 10, 83, 168, 230, 129, 25, 228, 135, 78, 229, 172, 198, 85, 173, 170, 182, 148, 1, 84, 5, 215, 210, 250, 106, 169, 84, 26, 171, 90, 90, 140, 55, 124, 5, 219, 218, 86, 5, 97, 101, 192, 185, 78, 162, 60, 105, 102, 155, 249, 8, 60, 162, 18, 167, 131, 80, 214, 180, 173, 178, 177, 156, 60, 226, 186, 172, 223, 91, 182, 96, 215, 51, 207, 224, 224, 155, 111, 6, 59, 7, 175, 94, 195, 158, 23, 118, 99, 227, 134, 13, 198, 162, 126, 101, 209, 130, 155, 197, 176, 57, 184, 252, 235, 138, 132, 170, 194, 140, 145, 200, 24, 239, 80, 169, 184, 110, 10, 94, 216, 42, 254, 159, 251, 193, 115, 120, 245, 143, 127, 194, 71, 31, 127, 28, 224, 235, 225, 183, 191, 249, 53, 218, 105, 184, 160, 114, 17, 72, 4, 101, 12, 37, 187, 188, 226, 55, 67, 68, 130, 100, 49, 9, 210, 221, 41, 105, 235, 224, 211, 38, 18, 43, 149, 76, 25, 220, 191, 239, 119, 216, 186, 117, 11, 78, 159, 62, 109, 200, 109, 219, 182, 13, 207, 238, 218, 133, 52, 61, 227, 112, 141, 36, 200, 189, 10, 159, 203, 249, 176, 193, 19, 174, 223, 52, 167, 80, 184, 194, 210, 185, 140, 231, 140, 154, 95, 177, 86, 175, 126, 16, 199, 143, 29, 197, 223, 95, 127, 29, 253, 253, 253, 104, 104, 200, 96, 199, 142, 237, 216, 177, 125, 187, 89, 35, 99, 74, 151, 106, 154, 220, 97, 40, 97, 89, 254, 63, 141, 114, 247, 4, 149, 120, 44, 85, 194, 38, 222, 175, 116, 24, 138, 189, 154, 194, 70, 33, 38, 176, 241, 241, 113, 227, 214, 58, 134, 153, 198, 69, 84, 227, 202, 49, 155, 85, 105, 96, 50, 138, 163, 183, 108, 83, 1, 53, 239, 147, 9, 20, 33, 230, 119, 23, 231, 204, 61, 170, 246, 192, 213, 97, 43, 44, 37, 191, 100, 37, 147, 9, 122, 186, 100, 242, 207, 236, 165, 30, 82, 71, 114, 222, 254, 60, 129, 27, 52, 184, 114, 218, 199, 15, 114, 68, 151, 243, 56, 39, 122, 121, 211, 28, 102, 104, 168, 132, 106, 147, 154, 128, 36, 68, 73, 169, 83, 61, 197, 174, 231, 90, 18, 186, 206, 140, 17, 252, 253, 177, 152, 87, 81, 170, 5, 32, 20, 10, 7, 57, 20, 98, 17, 214, 161, 123, 142, 107, 132, 173, 82, 172, 111, 225, 23, 10, 188, 126, 144, 184, 240, 21, 110, 133, 124, 49, 32, 33, 29, 56, 101, 116, 186, 194, 91, 246, 16, 195, 179, 150, 132, 230, 3, 34, 230, 7, 137, 168, 218, 188, 199, 155, 166, 226, 208, 39, 195, 33, 35, 76, 2, 229, 102, 117, 207, 62, 158, 187, 69, 66, 9, 126, 134, 158, 24, 231, 148, 121, 217, 178, 227, 36, 16, 134, 235, 120, 10, 69, 99, 54, 172, 72, 140, 198, 42, 99, 128, 161, 247, 193, 104, 156, 152, 12, 233, 170, 193, 44, 30, 140, 34, 34, 108, 115, 0, 50, 105, 141, 39, 40, 92, 100, 109, 30, 164, 55, 11, 97, 252, 43, 27, 53, 175, 10, 210, 183, 182, 5, 201, 174, 65, 41, 172, 27, 230, 80, 49, 132, 227, 195, 9, 108, 229, 197, 49, 197, 115, 69, 5, 192, 247, 142, 71, 64, 196, 104, 5, 90, 84, 150, 184, 81, 136, 224, 236, 72, 204, 184, 59, 26, 141, 240, 4, 46, 227, 218, 133, 115, 232, 57, 113, 8, 35, 215, 62, 131, 157, 76, 163, 229, 161, 199, 208, 249, 196, 118, 196, 23, 45, 69, 172, 228, 160, 123, 60, 204, 251, 88, 2, 27, 235, 167, 174, 242, 174, 64, 165, 4, 155, 60, 160, 88, 146, 215, 84, 40, 174, 147, 252, 241, 91, 113, 207, 192, 83, 203, 204, 90, 125, 220, 70, 68, 3, 10, 49, 157, 240, 159, 21, 66, 248, 39, 99, 113, 67, 93, 17, 203, 153, 156, 178, 186, 26, 49, 140, 44, 17, 203, 210, 197, 202, 137, 158, 137, 8, 28, 43, 204, 53, 101, 44, 29, 189, 130, 236, 133, 46, 188, 250, 203, 95, 152, 245, 181, 123, 190, 253, 228, 78, 188, 240, 179, 95, 97, 164, 229, 81, 84, 162, 49, 244, 79, 150, 112, 163, 152, 192, 35, 105, 190, 92, 241, 106, 164, 151, 43, 113, 145, 12, 53, 221, 48, 114, 46, 101, 240, 229, 234, 35, 118, 93, 115, 228, 109, 141, 251, 107, 180, 78, 237, 14, 34, 26, 212, 66, 145, 81, 21, 59, 194, 112, 105, 102, 204, 46, 227, 101, 82, 175, 185, 242, 128, 94, 112, 134, 73, 98, 136, 185, 52, 201, 80, 178, 105, 178, 100, 185, 136, 150, 129, 119, 209, 60, 214, 141, 179, 61, 231, 5, 131, 117, 235, 30, 134, 195, 3, 79, 218, 185, 86, 4, 135, 142, 30, 193, 15, 55, 52, 97, 221, 163, 59, 209, 215, 250, 36, 172, 84, 19, 38, 152, 123, 199, 25, 202, 153, 113, 201, 112, 205, 251, 143, 226, 95, 33, 62, 66, 25, 131, 148, 49, 74, 50, 113, 122, 70, 36, 100, 206, 233, 36, 36, 235, 174, 68, 52, 33, 50, 218, 168, 126, 147, 73, 124, 141, 160, 106, 2, 209, 233, 172, 42, 167, 185, 20, 99, 215, 9, 69, 208, 60, 248, 1, 50, 215, 78, 161, 144, 94, 129, 229, 171, 58, 241, 244, 230, 13, 56, 220, 245, 161, 217, 227, 127, 236, 254, 206, 118, 212, 47, 239, 68, 100, 116, 0, 15, 20, 243, 232, 95, 247, 60, 92, 230, 77, 170, 82, 54, 111, 164, 189, 186, 49, 231, 124, 25, 222, 183, 145, 161, 60, 50, 114, 125, 164, 59, 191, 131, 242, 123, 231, 212, 212, 136, 148, 87, 87, 171, 181, 136, 138, 171, 72, 169, 119, 244, 29, 68, 98, 236, 19, 184, 225, 4, 9, 86, 80, 96, 233, 28, 186, 121, 11, 19, 147, 121, 94, 211, 67, 104, 72, 37, 177, 164, 177, 30, 17, 94, 217, 157, 10, 171, 98, 113, 24, 67, 171, 159, 197, 224, 178, 71, 16, 45, 121, 94, 187, 187, 12, 79, 166, 39, 125, 230, 207, 25, 61, 82, 187, 69, 202, 171, 251, 109, 234, 153, 162, 153, 149, 101, 42, 87, 72, 44, 65, 250, 243, 247, 81, 78, 196, 249, 210, 68, 111, 49, 220, 30, 88, 218, 4, 75, 89, 171, 192, 87, 5, 227, 163, 222, 203, 67, 224, 217, 227, 230, 188, 185, 42, 168, 48, 167, 112, 111, 127, 246, 229, 222, 235, 123, 86, 68, 238, 5, 160, 185, 16, 67, 99, 112, 197, 70, 68, 156, 9, 164, 135, 187, 249, 102, 71, 79, 69, 147, 176, 226, 236, 97, 94, 193, 93, 158, 65, 185, 44, 42, 197, 73, 83, 210, 221, 112, 28, 195, 43, 159, 198, 245, 197, 29, 8, 115, 174, 150, 192, 23, 201, 154, 105, 254, 171, 19, 161, 181, 45, 150, 91, 39, 98, 99, 160, 125, 39, 226, 139, 215, 99, 189, 157, 197, 170, 230, 20, 172, 168, 206, 18, 30, 131, 156, 47, 51, 39, 134, 254, 115, 21, 159, 176, 236, 78, 102, 90, 145, 77, 122, 222, 178, 104, 4, 227, 177, 153, 52, 156, 229, 248, 87, 39, 34, 65, 36, 19, 42, 187, 60, 87, 44, 92, 175, 231, 237, 53, 227, 32, 145, 206, 161, 160, 43, 24, 237, 29, 226, 225, 102, 243, 128, 204, 172, 89, 140, 65, 150, 116, 133, 91, 164, 236, 120, 241, 163, 176, 155, 131, 54, 55, 68, 164, 136, 81, 136, 185, 225, 22, 145, 203, 59, 8, 241, 79, 130, 168, 41, 214, 94, 5, 12, 211, 242, 110, 145, 127, 194, 241, 223, 67, 29, 112, 21, 173, 159, 27, 14, 198, 12, 115, 71, 132, 112, 170, 94, 17, 86, 233, 171, 78, 4, 151, 39, 99, 60, 32, 89, 223, 89, 193, 164, 115, 137, 149, 170, 123, 60, 198, 243, 196, 251, 211, 192, 72, 159, 195, 143, 57, 38, 226, 157, 59, 250, 79, 248, 240, 112, 220, 88, 94, 175, 7, 50, 188, 222, 31, 212, 116, 46, 204, 69, 114, 123, 104, 83, 159, 115, 74, 196, 135, 213, 75, 154, 94, 170, 164, 176, 14, 50, 61, 248, 132, 230, 131, 132, 68, 204, 11, 145, 170, 238, 250, 242, 210, 64, 46, 97, 155, 47, 18, 194, 246, 238, 29, 122, 250, 63, 111, 11, 68, 190, 110, 14, 92, 240, 200, 130, 71, 230, 201, 2, 247, 77, 104, 253, 23, 249, 35, 174, 63, 129, 132, 9, 199, 0, 0, 0, 0, 73, 69, 78, 68, 174, 66, 96, 130, 80, 75, 7, 8, 108, 239, 160, 128, 148, 13, 0, 0, 148, 13, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 99, 107, 14, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 9, 0, 47, 114, 111, 111, 116, 47, 105, 110, 100, 101, 120, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 42, 12, 84, 93, 60, 104, 116, 109, 108, 62, 10, 9, 60, 104, 101, 97, 100, 62, 10, 9, 9, 60, 108, 105, 110, 107, 32, 114, 101, 108, 61, 34, 115, 116, 121, 108, 101, 115, 104, 101, 101, 116, 34, 32, 104, 114, 101, 102, 61, 34, 99, 115, 115, 47, 115, 116, 121, 108, 101, 46, 99, 115, 115, 34, 32, 116, 121, 112, 101, 61, 34, 116, 101, 120, 116, 47, 99, 115, 115, 34, 32, 47, 62, 10, 9, 60, 47, 104, 101, 97, 100, 62, 10, 9, 60, 98, 111, 100, 121, 62, 10, 9, 60, 100, 105, 118, 62, 60, 105, 109, 103, 32, 115, 114, 99, 61, 34, 105, 109, 97, 103, 101, 47, 108, 111, 103, 111, 46, 112, 110, 103, 34, 62, 60, 47, 100, 105, 118, 62, 10, 9, 84, 104, 105, 115, 32, 105, 115, 32, 116, 104, 101, 32, 105, 110, 100, 101, 120, 32, 102, 114, 111, 109, 32, 103, 114, 101, 115, 46, 10, 9, 60, 47, 98, 111, 100, 121, 62, 10, 60, 47, 104, 116, 109, 108, 62, 80, 75, 7, 8, 97, 237, 248, 84, 182, 0, 0, 0, 182, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 173, 129, 15, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 85, 84, 5, 0, 1, 167, 132, 85, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 195, 130, 15, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 85, 84, 5, 0, 1, 175, 134, 85, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 21, 50, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 47, 99, 111, 110, 116, 97, 105, 110, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 202, 85, 82, 93, 123, 123, 100, 101, 102, 105, 110, 101, 32, 34, 99, 111, 110, 116, 97, 105, 110, 101, 114, 34, 125, 125, 10, 60, 104, 49, 62, 67, 79, 78, 84, 65, 73, 78, 69, 82, 60, 47, 104, 49, 62, 10, 123, 123, 101, 110, 100, 125, 125, 80, 75, 7, 8, 37, 7, 219, 239, 49, 0, 0, 0, 49, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 21, 50, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 47, 102, 111, 111, 116, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 202, 85, 82, 93, 123, 123, 100, 101, 102, 105, 110, 101, 32, 34, 102, 111, 111, 116, 101, 114, 34, 125, 125, 10, 60, 104, 49, 62, 70, 79, 79, 84, 69, 82, 60, 47, 104, 49, 62, 10, 123, 123, 101, 110, 100, 125, 125, 80, 75, 7, 8, 84, 198, 59, 72, 43, 0, 0, 0, 43, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 21, 50, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 47, 104, 101, 97, 100, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 202, 85, 82, 93, 123, 123, 100, 101, 102, 105, 110, 101, 32, 34, 104, 101, 97, 100, 101, 114, 34, 125, 125, 10, 32, 32, 32, 32, 60, 104, 49, 62, 72, 69, 65, 68, 69, 82, 60, 47, 104, 49, 62, 10, 123, 123, 101, 110, 100, 125, 125, 80, 75, 7, 8, 250, 123, 144, 211, 47, 0, 0, 0, 47, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 195, 130, 15, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 47, 108, 97, 121, 111, 117, 116, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 175, 134, 85, 93, 60, 33, 68, 79, 67, 84, 89, 80, 69, 32, 104, 116, 109, 108, 62, 10, 60, 104, 116, 109, 108, 62, 10, 60, 104, 101, 97, 100, 62, 10, 32, 32, 32, 32, 60, 116, 105, 116, 108, 101, 62, 71, 111, 70, 114, 97, 109, 101, 32, 76, 97, 121, 111, 117, 116, 60, 47, 116, 105, 116, 108, 101, 62, 10, 32, 32, 32, 32, 123, 123, 116, 101, 109, 112, 108, 97, 116, 101, 32, 34, 104, 101, 97, 100, 101, 114, 34, 125, 125, 10, 60, 47, 104, 101, 97, 100, 62, 10, 60, 98, 111, 100, 121, 62, 10, 32, 32, 32, 32, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 99, 111, 110, 116, 97, 105, 110, 101, 114, 34, 62, 10, 32, 32, 32, 32, 123, 123, 116, 101, 109, 112, 108, 97, 116, 101, 32, 34, 99, 111, 110, 116, 97, 105, 110, 101, 114, 34, 125, 125, 10, 32, 32, 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, 32, 32, 32, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 102, 111, 111, 116, 101, 114, 34, 62, 10, 32, 32, 32, 32, 123, 123, 116, 101, 109, 112, 108, 97, 116, 101, 32, 34, 102, 111, 111, 116, 101, 114, 34, 125, 125, 10, 32, 32, 32, 32, 60, 47, 100, 105, 118, 62, 10, 60, 47, 98, 111, 100, 121, 62, 10, 60, 47, 104, 116, 109, 108, 62, 80, 75, 7, 8, 202, 206, 145, 33, 250, 0, 0, 0, 250, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 197, 129, 15, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 85, 84, 5, 0, 1, 210, 132, 85, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 21, 50, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 102, 111, 111, 116, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 202, 85, 82, 93, 60, 104, 49, 62, 70, 79, 79, 84, 69, 82, 60, 47, 104, 49, 62, 80, 75, 7, 8, 90, 108, 244, 205, 15, 0, 0, 0, 15, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 21, 50, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 104, 101, 97, 100, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 202, 85, 82, 93, 60, 104, 49, 62, 72, 69, 65, 68, 69, 82, 60, 47, 104, 49, 62, 80, 75, 7, 8, 44, 61, 217, 60, 15, 0, 0, 0, 15, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 21, 50, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 108, 97, 121, 111, 117, 116, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 202, 85, 82, 93, 123, 123, 105, 110, 99, 108, 117, 100, 101, 32, 34, 104, 101, 97, 100, 101, 114, 46, 104, 116, 109, 108, 34, 32, 46, 125, 125, 10, 123, 123, 105, 110, 99, 108, 117, 100, 101, 32, 46, 109, 97, 105, 110, 84, 112, 108, 32, 46, 125, 125, 10, 123, 123, 105, 110, 99, 108, 117, 100, 101, 32, 34, 102, 111, 111, 116, 101, 114, 46, 104, 116, 109, 108, 34, 32, 46, 125, 125, 80, 75, 7, 8, 4, 249, 231, 7, 78, 0, 0, 0, 78, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 173, 129, 15, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 109, 97, 105, 110, 85, 84, 5, 0, 1, 167, 132, 85, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 21, 50, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 109, 97, 105, 110, 47, 109, 97, 105, 110, 49, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 202, 85, 82, 93, 60, 104, 49, 62, 77, 65, 73, 78, 49, 60, 47, 104, 49, 62, 80, 75, 7, 8, 204, 77, 237, 99, 14, 0, 0, 0, 14, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 21, 50, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 109, 97, 105, 110, 47, 109, 97, 105, 110, 50, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 202, 85, 82, 93, 60, 104, 49, 62, 77, 65, 73, 78, 50, 60, 47, 104, 49, 62, 80, 75, 7, 8, 98, 63, 121, 229, 14, 0, 0, 0, 14, 0, 0, 0, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 157, 99, 19, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 0, 0, 0, 0, 47, 99, 111, 110, 102, 105, 103, 85, 84, 5, 0, 1, 10, 150, 90, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 152, 99, 19, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 62, 0, 0, 0, 47, 99, 111, 110, 102, 105, 103, 45, 99, 117, 115, 116, 111, 109, 85, 84, 5, 0, 1, 0, 150, 90, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 225, 99, 19, 79, 84, 68, 54, 219, 102, 0, 0, 0, 102, 0, 0, 0, 26, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 131, 0, 0, 0, 47, 99, 111, 110, 102, 105, 103, 45, 99, 117, 115, 116, 111, 109, 47, 99, 111, 110, 102, 105, 103, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 134, 150, 90, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 230, 99, 19, 79, 48, 7, 229, 132, 102, 0, 0, 0, 102, 0, 0, 0, 21, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 58, 1, 0, 0, 47, 99, 111, 110, 102, 105, 103, 45, 99, 117, 115, 116, 111, 109, 47, 109, 121, 46, 105, 110, 105, 85, 84, 5, 0, 1, 144, 150, 90, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 150, 99, 19, 79, 156, 194, 144, 100, 102, 0, 0, 0, 102, 0, 0, 0, 19, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 236, 1, 0, 0, 47, 99, 111, 110, 102, 105, 103, 47, 99, 111, 110, 102, 105, 103, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 253, 149, 90, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 225, 99, 19, 79, 248, 129, 67, 59, 102, 0, 0, 0, 102, 0, 0, 0, 14, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 156, 2, 0, 0, 47, 99, 111, 110, 102, 105, 103, 47, 109, 121, 46, 105, 110, 105, 85, 84, 5, 0, 1, 135, 150, 90, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 161, 85, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 71, 3, 0, 0, 47, 100, 105, 114, 49, 85, 84, 5, 0, 1, 175, 148, 82, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 161, 85, 13, 79, 130, 50, 74, 209, 14, 0, 0, 0, 14, 0, 0, 0, 11, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 131, 3, 0, 0, 47, 100, 105, 114, 49, 47, 116, 101, 115, 116, 49, 85, 84, 5, 0, 1, 175, 148, 82, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 161, 85, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 211, 3, 0, 0, 47, 100, 105, 114, 50, 85, 84, 5, 0, 1, 175, 148, 82, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 161, 85, 13, 79, 129, 137, 125, 58, 14, 0, 0, 0, 14, 0, 0, 0, 11, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 15, 4, 0, 0, 47, 100, 105, 114, 50, 47, 116, 101, 115, 116, 50, 85, 84, 5, 0, 1, 175, 148, 82, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 130, 109, 14, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 95, 4, 0, 0, 47, 114, 111, 111, 116, 85, 84, 5, 0, 1, 37, 16, 84, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 132, 101, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 155, 4, 0, 0, 47, 114, 111, 111, 116, 47, 99, 115, 115, 85, 84, 5, 0, 1, 152, 176, 82, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 132, 101, 13, 79, 42, 222, 98, 234, 50, 0, 0, 0, 50, 0, 0, 0, 19, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 219, 4, 0, 0, 47, 114, 111, 111, 116, 47, 99, 115, 115, 47, 115, 116, 121, 108, 101, 46, 99, 115, 115, 85, 84, 5, 0, 1, 152, 176, 82, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 74, 101, 13, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 87, 5, 0, 0, 47, 114, 111, 111, 116, 47, 105, 109, 97, 103, 101, 85, 84, 5, 0, 1, 44, 176, 82, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 36, 101, 13, 79, 108, 239, 160, 128, 148, 13, 0, 0, 148, 13, 0, 0, 20, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 153, 5, 0, 0, 47, 114, 111, 111, 116, 47, 105, 109, 97, 103, 101, 47, 108, 111, 103, 111, 46, 112, 110, 103, 85, 84, 5, 0, 1, 228, 175, 82, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 99, 107, 14, 79, 97, 237, 248, 84, 182, 0, 0, 0, 182, 0, 0, 0, 16, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 120, 19, 0, 0, 47, 114, 111, 111, 116, 47, 105, 110, 100, 101, 120, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 42, 12, 84, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 173, 129, 15, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 117, 20, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 85, 84, 5, 0, 1, 167, 132, 85, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 195, 130, 15, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 181, 20, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 85, 84, 5, 0, 1, 175, 134, 85, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 21, 50, 13, 79, 37, 7, 219, 239, 49, 0, 0, 0, 49, 0, 0, 0, 32, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 253, 20, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 47, 99, 111, 110, 116, 97, 105, 110, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 202, 85, 82, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 21, 50, 13, 79, 84, 198, 59, 72, 43, 0, 0, 0, 43, 0, 0, 0, 29, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 133, 21, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 47, 102, 111, 111, 116, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 202, 85, 82, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 21, 50, 13, 79, 250, 123, 144, 211, 47, 0, 0, 0, 47, 0, 0, 0, 29, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 4, 22, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 47, 104, 101, 97, 100, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 202, 85, 82, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 195, 130, 15, 79, 202, 206, 145, 33, 250, 0, 0, 0, 250, 0, 0, 0, 29, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 135, 22, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 47, 108, 97, 121, 111, 117, 116, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 175, 134, 85, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 197, 129, 15, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 213, 23, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 85, 84, 5, 0, 1, 210, 132, 85, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 21, 50, 13, 79, 90, 108, 244, 205, 15, 0, 0, 0, 15, 0, 0, 0, 29, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 29, 24, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 102, 111, 111, 116, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 202, 85, 82, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 21, 50, 13, 79, 44, 61, 217, 60, 15, 0, 0, 0, 15, 0, 0, 0, 29, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 128, 24, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 104, 101, 97, 100, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 202, 85, 82, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 21, 50, 13, 79, 4, 249, 231, 7, 78, 0, 0, 0, 78, 0, 0, 0, 29, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 227, 24, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 108, 97, 121, 111, 117, 116, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 202, 85, 82, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 173, 129, 15, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 133, 25, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 109, 97, 105, 110, 85, 84, 5, 0, 1, 167, 132, 85, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 21, 50, 13, 79, 204, 77, 237, 99, 14, 0, 0, 0, 14, 0, 0, 0, 33, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 210, 25, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 109, 97, 105, 110, 47, 109, 97, 105, 110, 49, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 202, 85, 82, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 21, 50, 13, 79, 98, 63, 121, 229, 14, 0, 0, 0, 14, 0, 0, 0, 33, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 56, 26, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 109, 97, 105, 110, 47, 109, 97, 105, 110, 50, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 202, 85, 82, 93, 80, 75, 5, 6, 0, 0, 0, 0, 29, 0, 29, 0, 97, 8, 0, 0, 158, 26, 0, 0, 0, 0}); err != nil { + if err := gres.Add([]byte{80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 9, 0, 47, 99, 111, 110, 102, 105, 103, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 9, 0, 47, 99, 111, 110, 102, 105, 103, 45, 99, 117, 115, 116, 111, 109, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 9, 0, 47, 99, 111, 110, 102, 105, 103, 45, 99, 117, 115, 116, 111, 109, 47, 99, 111, 110, 102, 105, 103, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 118, 105, 101, 119, 112, 97, 116, 104, 32, 61, 32, 34, 47, 104, 111, 109, 101, 47, 119, 119, 119, 47, 116, 101, 109, 112, 108, 97, 116, 101, 115, 34, 10, 91, 114, 101, 100, 105, 115, 93, 10, 32, 32, 32, 32, 100, 105, 115, 107, 32, 32, 61, 32, 34, 49, 50, 55, 46, 48, 46, 48, 46, 49, 58, 54, 51, 55, 57, 44, 52, 34, 10, 32, 32, 32, 32, 99, 97, 99, 104, 101, 32, 61, 32, 34, 49, 50, 55, 46, 48, 46, 48, 46, 49, 58, 54, 51, 55, 57, 44, 53, 34, 80, 75, 7, 8, 84, 68, 54, 219, 102, 0, 0, 0, 102, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 9, 0, 47, 99, 111, 110, 102, 105, 103, 45, 99, 117, 115, 116, 111, 109, 47, 109, 121, 46, 105, 110, 105, 85, 84, 5, 0, 1, 45, 201, 99, 93, 118, 105, 101, 119, 112, 97, 116, 104, 32, 61, 32, 34, 47, 104, 111, 109, 101, 47, 119, 119, 119, 47, 116, 101, 109, 112, 108, 97, 116, 101, 115, 34, 10, 91, 114, 101, 100, 105, 115, 93, 10, 32, 32, 32, 32, 100, 105, 115, 107, 32, 32, 61, 32, 34, 49, 50, 55, 46, 48, 46, 48, 46, 49, 58, 54, 51, 55, 57, 44, 54, 34, 10, 32, 32, 32, 32, 99, 97, 99, 104, 101, 32, 61, 32, 34, 49, 50, 55, 46, 48, 46, 48, 46, 49, 58, 54, 51, 55, 57, 44, 55, 34, 80, 75, 7, 8, 48, 7, 229, 132, 102, 0, 0, 0, 102, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 9, 0, 47, 99, 111, 110, 102, 105, 103, 47, 99, 111, 110, 102, 105, 103, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 118, 105, 101, 119, 112, 97, 116, 104, 32, 61, 32, 34, 47, 104, 111, 109, 101, 47, 119, 119, 119, 47, 116, 101, 109, 112, 108, 97, 116, 101, 115, 34, 10, 91, 114, 101, 100, 105, 115, 93, 10, 32, 32, 32, 32, 100, 105, 115, 107, 32, 32, 61, 32, 34, 49, 50, 55, 46, 48, 46, 48, 46, 49, 58, 54, 51, 55, 57, 44, 48, 34, 10, 32, 32, 32, 32, 99, 97, 99, 104, 101, 32, 61, 32, 34, 49, 50, 55, 46, 48, 46, 48, 46, 49, 58, 54, 51, 55, 57, 44, 49, 34, 80, 75, 7, 8, 156, 194, 144, 100, 102, 0, 0, 0, 102, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 9, 0, 47, 99, 111, 110, 102, 105, 103, 47, 109, 121, 46, 105, 110, 105, 85, 84, 5, 0, 1, 45, 201, 99, 93, 118, 105, 101, 119, 112, 97, 116, 104, 32, 61, 32, 34, 47, 104, 111, 109, 101, 47, 119, 119, 119, 47, 116, 101, 109, 112, 108, 97, 116, 101, 115, 34, 10, 91, 114, 101, 100, 105, 115, 93, 10, 32, 32, 32, 32, 100, 105, 115, 107, 32, 32, 61, 32, 34, 49, 50, 55, 46, 48, 46, 48, 46, 49, 58, 54, 51, 55, 57, 44, 50, 34, 10, 32, 32, 32, 32, 99, 97, 99, 104, 101, 32, 61, 32, 34, 49, 50, 55, 46, 48, 46, 48, 46, 49, 58, 54, 51, 55, 57, 44, 51, 34, 80, 75, 7, 8, 248, 129, 67, 59, 102, 0, 0, 0, 102, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 9, 0, 47, 100, 105, 114, 49, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 9, 0, 47, 100, 105, 114, 49, 47, 116, 101, 115, 116, 49, 85, 84, 5, 0, 1, 45, 201, 99, 93, 116, 101, 115, 116, 49, 32, 99, 111, 110, 116, 101, 110, 116, 10, 80, 75, 7, 8, 130, 50, 74, 209, 14, 0, 0, 0, 14, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 9, 0, 47, 100, 105, 114, 50, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 9, 0, 47, 100, 105, 114, 50, 47, 116, 101, 115, 116, 50, 85, 84, 5, 0, 1, 45, 201, 99, 93, 116, 101, 115, 116, 50, 32, 99, 111, 110, 116, 101, 110, 116, 10, 80, 75, 7, 8, 129, 137, 125, 58, 14, 0, 0, 0, 14, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 161, 73, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 9, 0, 47, 105, 49, 56, 110, 85, 84, 5, 0, 1, 30, 58, 106, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 162, 73, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 9, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 85, 84, 5, 0, 1, 32, 58, 106, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 161, 73, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 9, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 101, 110, 85, 84, 5, 0, 1, 31, 58, 106, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 236, 22, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 9, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 101, 110, 47, 104, 101, 108, 108, 111, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 156, 225, 105, 93, 10, 104, 101, 108, 108, 111, 32, 61, 32, 34, 72, 101, 108, 108, 111, 34, 80, 75, 7, 8, 114, 235, 106, 99, 16, 0, 0, 0, 16, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 241, 22, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 9, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 101, 110, 47, 119, 111, 114, 108, 100, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 166, 225, 105, 93, 10, 119, 111, 114, 108, 100, 32, 61, 32, 34, 87, 111, 114, 108, 100, 34, 80, 75, 7, 8, 157, 17, 117, 39, 16, 0, 0, 0, 16, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 161, 73, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 9, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 106, 97, 85, 84, 5, 0, 1, 31, 58, 106, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 34, 23, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 9, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 106, 97, 47, 104, 101, 108, 108, 111, 46, 121, 97, 109, 108, 85, 84, 5, 0, 1, 0, 226, 105, 93, 10, 104, 101, 108, 108, 111, 58, 32, 34, 227, 129, 147, 227, 130, 147, 227, 129, 171, 227, 129, 161, 227, 129, 175, 34, 80, 75, 7, 8, 188, 102, 42, 89, 25, 0, 0, 0, 25, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 42, 23, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 9, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 106, 97, 47, 119, 111, 114, 108, 100, 46, 121, 97, 109, 108, 85, 84, 5, 0, 1, 17, 226, 105, 93, 119, 111, 114, 108, 100, 58, 32, 34, 228, 184, 150, 231, 149, 140, 34, 80, 75, 7, 8, 158, 65, 95, 108, 15, 0, 0, 0, 15, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 161, 73, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 9, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 114, 117, 85, 84, 5, 0, 1, 31, 58, 106, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 100, 23, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 9, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 114, 117, 47, 104, 101, 108, 108, 111, 46, 105, 110, 105, 85, 84, 5, 0, 1, 124, 226, 105, 93, 104, 101, 108, 108, 111, 32, 61, 32, 208, 159, 209, 128, 208, 184, 208, 178, 208, 181, 209, 130, 80, 75, 7, 8, 110, 248, 192, 182, 20, 0, 0, 0, 20, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 0, 24, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 9, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 114, 117, 47, 119, 111, 114, 108, 100, 46, 105, 110, 105, 85, 84, 5, 0, 1, 177, 226, 105, 93, 119, 111, 114, 108, 100, 61, 208, 188, 208, 184, 209, 128, 80, 75, 7, 8, 89, 25, 94, 98, 12, 0, 0, 0, 12, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 162, 73, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 9, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 122, 104, 45, 67, 78, 85, 84, 5, 0, 1, 32, 58, 106, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 185, 24, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 9, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 122, 104, 45, 67, 78, 47, 104, 101, 108, 108, 111, 46, 106, 115, 111, 110, 85, 84, 5, 0, 1, 15, 228, 105, 93, 123, 10, 32, 32, 32, 32, 34, 104, 101, 108, 108, 111, 34, 58, 32, 34, 228, 189, 160, 229, 165, 189, 34, 10, 125, 80, 75, 7, 8, 190, 33, 11, 186, 25, 0, 0, 0, 25, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 183, 24, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 9, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 122, 104, 45, 67, 78, 47, 119, 111, 114, 108, 100, 46, 106, 115, 111, 110, 85, 84, 5, 0, 1, 11, 228, 105, 93, 123, 10, 32, 32, 32, 32, 34, 119, 111, 114, 108, 100, 34, 58, 32, 34, 228, 184, 150, 231, 149, 140, 34, 10, 125, 80, 75, 7, 8, 10, 237, 75, 254, 25, 0, 0, 0, 25, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 162, 73, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 9, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 122, 104, 45, 84, 87, 85, 84, 5, 0, 1, 32, 58, 106, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 58, 24, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 9, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 122, 104, 45, 84, 87, 47, 104, 101, 108, 108, 111, 46, 120, 109, 108, 85, 84, 5, 0, 1, 33, 227, 105, 93, 60, 63, 120, 109, 108, 32, 118, 101, 114, 115, 105, 111, 110, 61, 34, 49, 46, 48, 34, 32, 101, 110, 99, 111, 100, 105, 110, 103, 61, 34, 117, 116, 102, 45, 56, 34, 63, 62, 10, 60, 105, 49, 56, 110, 62, 10, 32, 32, 32, 32, 60, 104, 101, 108, 108, 111, 62, 228, 189, 160, 229, 165, 189, 60, 47, 104, 101, 108, 108, 111, 62, 10, 60, 47, 105, 49, 56, 110, 62, 80, 75, 7, 8, 16, 122, 22, 143, 79, 0, 0, 0, 79, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 67, 24, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 9, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 122, 104, 45, 84, 87, 47, 119, 111, 114, 108, 100, 46, 120, 109, 108, 85, 84, 5, 0, 1, 46, 227, 105, 93, 60, 63, 120, 109, 108, 32, 118, 101, 114, 115, 105, 111, 110, 61, 34, 49, 46, 48, 34, 32, 101, 110, 99, 111, 100, 105, 110, 103, 61, 34, 117, 116, 102, 45, 56, 34, 63, 62, 10, 60, 105, 49, 56, 110, 62, 10, 32, 32, 32, 32, 60, 119, 111, 114, 108, 100, 62, 228, 184, 150, 231, 149, 140, 60, 47, 119, 111, 114, 108, 100, 62, 10, 60, 47, 105, 49, 56, 110, 62, 80, 75, 7, 8, 250, 38, 76, 149, 79, 0, 0, 0, 79, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 162, 73, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 9, 0, 47, 105, 49, 56, 110, 45, 102, 105, 108, 101, 85, 84, 5, 0, 1, 33, 58, 106, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 101, 24, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 9, 0, 47, 105, 49, 56, 110, 45, 102, 105, 108, 101, 47, 101, 110, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 111, 227, 105, 93, 10, 104, 101, 108, 108, 111, 32, 61, 32, 34, 72, 101, 108, 108, 111, 34, 10, 119, 111, 114, 108, 100, 32, 61, 32, 34, 87, 111, 114, 108, 100, 34, 80, 75, 7, 8, 99, 119, 45, 64, 32, 0, 0, 0, 32, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 112, 24, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 9, 0, 47, 105, 49, 56, 110, 45, 102, 105, 108, 101, 47, 106, 97, 46, 121, 97, 109, 108, 85, 84, 5, 0, 1, 133, 227, 105, 93, 10, 104, 101, 108, 108, 111, 58, 32, 34, 227, 129, 147, 227, 130, 147, 227, 129, 171, 227, 129, 161, 227, 129, 175, 34, 10, 119, 111, 114, 108, 100, 58, 32, 34, 228, 184, 150, 231, 149, 140, 34, 80, 75, 7, 8, 20, 198, 203, 88, 41, 0, 0, 0, 41, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 125, 24, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 9, 0, 47, 105, 49, 56, 110, 45, 102, 105, 108, 101, 47, 114, 117, 46, 105, 110, 105, 85, 84, 5, 0, 1, 158, 227, 105, 93, 104, 101, 108, 108, 111, 32, 61, 32, 208, 159, 209, 128, 208, 184, 208, 178, 208, 181, 209, 130, 10, 119, 111, 114, 108, 100, 32, 61, 32, 208, 188, 208, 184, 209, 128, 80, 75, 7, 8, 216, 229, 125, 35, 35, 0, 0, 0, 35, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 147, 24, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 9, 0, 47, 105, 49, 56, 110, 45, 102, 105, 108, 101, 47, 122, 104, 45, 67, 78, 46, 106, 115, 111, 110, 85, 84, 5, 0, 1, 199, 227, 105, 93, 123, 10, 32, 32, 34, 104, 101, 108, 108, 111, 34, 58, 32, 34, 228, 189, 160, 229, 165, 189, 34, 44, 10, 32, 32, 34, 119, 111, 114, 108, 100, 34, 58, 32, 34, 228, 184, 150, 231, 149, 140, 34, 10, 125, 80, 75, 7, 8, 62, 80, 47, 182, 44, 0, 0, 0, 44, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 166, 24, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 9, 0, 47, 105, 49, 56, 110, 45, 102, 105, 108, 101, 47, 122, 104, 45, 84, 87, 46, 120, 109, 108, 85, 84, 5, 0, 1, 232, 227, 105, 93, 60, 63, 120, 109, 108, 32, 118, 101, 114, 115, 105, 111, 110, 61, 34, 49, 46, 48, 34, 32, 101, 110, 99, 111, 100, 105, 110, 103, 61, 34, 117, 116, 102, 45, 56, 34, 63, 62, 10, 60, 105, 49, 56, 110, 62, 10, 32, 32, 32, 32, 60, 104, 101, 108, 108, 111, 62, 228, 189, 160, 229, 165, 189, 60, 47, 104, 101, 108, 108, 111, 62, 10, 32, 32, 32, 32, 60, 119, 111, 114, 108, 100, 62, 228, 184, 150, 231, 149, 140, 60, 47, 119, 111, 114, 108, 100, 62, 10, 60, 47, 105, 49, 56, 110, 62, 80, 75, 7, 8, 201, 64, 202, 211, 105, 0, 0, 0, 105, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 101, 24, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 9, 0, 47, 105, 49, 56, 110, 47, 101, 110, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 111, 227, 105, 93, 10, 104, 101, 108, 108, 111, 32, 61, 32, 34, 72, 101, 108, 108, 111, 34, 10, 119, 111, 114, 108, 100, 32, 61, 32, 34, 87, 111, 114, 108, 100, 34, 80, 75, 7, 8, 99, 119, 45, 64, 32, 0, 0, 0, 32, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 113, 64, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 9, 0, 47, 105, 49, 56, 110, 47, 106, 97, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 214, 41, 106, 93, 10, 104, 101, 108, 108, 111, 32, 61, 32, 34, 227, 129, 147, 227, 130, 147, 227, 129, 171, 227, 129, 161, 227, 129, 175, 34, 10, 119, 111, 114, 108, 100, 32, 61, 32, 34, 228, 184, 150, 231, 149, 140, 34, 80, 75, 7, 8, 81, 103, 32, 118, 43, 0, 0, 0, 43, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 121, 64, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 9, 0, 47, 105, 49, 56, 110, 47, 114, 117, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 231, 41, 106, 93, 10, 104, 101, 108, 108, 111, 32, 61, 32, 34, 208, 159, 209, 128, 208, 184, 208, 178, 208, 181, 209, 130, 34, 10, 119, 111, 114, 108, 100, 32, 61, 32, 34, 208, 188, 208, 184, 209, 128, 34, 80, 75, 7, 8, 99, 56, 186, 107, 40, 0, 0, 0, 40, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 130, 64, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 9, 0, 47, 105, 49, 56, 110, 47, 122, 104, 45, 67, 78, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 245, 41, 106, 93, 104, 101, 108, 108, 111, 32, 61, 32, 34, 228, 189, 160, 229, 165, 189, 34, 10, 119, 111, 114, 108, 100, 32, 61, 32, 34, 228, 184, 150, 231, 149, 140, 34, 80, 75, 7, 8, 233, 222, 202, 141, 33, 0, 0, 0, 33, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 132, 64, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 9, 0, 47, 105, 49, 56, 110, 47, 122, 104, 45, 84, 87, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 249, 41, 106, 93, 104, 101, 108, 108, 111, 32, 61, 32, 34, 228, 189, 160, 229, 165, 189, 34, 10, 119, 111, 114, 108, 100, 32, 61, 32, 34, 228, 184, 150, 231, 149, 140, 34, 80, 75, 7, 8, 233, 222, 202, 141, 33, 0, 0, 0, 33, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 9, 0, 47, 114, 111, 111, 116, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 9, 0, 47, 114, 111, 111, 116, 47, 99, 115, 115, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 9, 0, 47, 114, 111, 111, 116, 47, 99, 115, 115, 47, 115, 116, 121, 108, 101, 46, 99, 115, 115, 85, 84, 5, 0, 1, 45, 201, 99, 93, 42, 32, 123, 10, 32, 32, 32, 32, 102, 111, 110, 116, 45, 115, 105, 122, 101, 58, 32, 51, 50, 112, 120, 59, 10, 32, 32, 32, 32, 116, 101, 120, 116, 45, 97, 108, 105, 103, 110, 58, 32, 99, 101, 110, 116, 101, 114, 59, 10, 125, 80, 75, 7, 8, 42, 222, 98, 234, 50, 0, 0, 0, 50, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 9, 0, 47, 114, 111, 111, 116, 47, 105, 109, 97, 103, 101, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 9, 0, 47, 114, 111, 111, 116, 47, 105, 109, 97, 103, 101, 47, 108, 111, 103, 111, 46, 112, 110, 103, 85, 84, 5, 0, 1, 45, 201, 99, 93, 137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 50, 0, 0, 0, 50, 8, 6, 0, 0, 0, 30, 63, 136, 177, 0, 0, 0, 1, 115, 82, 71, 66, 0, 174, 206, 28, 233, 0, 0, 0, 9, 112, 72, 89, 115, 0, 0, 11, 19, 0, 0, 11, 19, 1, 0, 154, 156, 24, 0, 0, 2, 174, 105, 84, 88, 116, 88, 77, 76, 58, 99, 111, 109, 46, 97, 100, 111, 98, 101, 46, 120, 109, 112, 0, 0, 0, 0, 0, 60, 120, 58, 120, 109, 112, 109, 101, 116, 97, 32, 120, 109, 108, 110, 115, 58, 120, 61, 34, 97, 100, 111, 98, 101, 58, 110, 115, 58, 109, 101, 116, 97, 47, 34, 32, 120, 58, 120, 109, 112, 116, 107, 61, 34, 88, 77, 80, 32, 67, 111, 114, 101, 32, 53, 46, 52, 46, 48, 34, 62, 10, 32, 32, 32, 60, 114, 100, 102, 58, 82, 68, 70, 32, 120, 109, 108, 110, 115, 58, 114, 100, 102, 61, 34, 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 119, 51, 46, 111, 114, 103, 47, 49, 57, 57, 57, 47, 48, 50, 47, 50, 50, 45, 114, 100, 102, 45, 115, 121, 110, 116, 97, 120, 45, 110, 115, 35, 34, 62, 10, 32, 32, 32, 32, 32, 32, 60, 114, 100, 102, 58, 68, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 32, 114, 100, 102, 58, 97, 98, 111, 117, 116, 61, 34, 34, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 120, 109, 108, 110, 115, 58, 120, 109, 112, 61, 34, 104, 116, 116, 112, 58, 47, 47, 110, 115, 46, 97, 100, 111, 98, 101, 46, 99, 111, 109, 47, 120, 97, 112, 47, 49, 46, 48, 47, 34, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 120, 109, 108, 110, 115, 58, 100, 99, 61, 34, 104, 116, 116, 112, 58, 47, 47, 112, 117, 114, 108, 46, 111, 114, 103, 47, 100, 99, 47, 101, 108, 101, 109, 101, 110, 116, 115, 47, 49, 46, 49, 47, 34, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 120, 109, 108, 110, 115, 58, 116, 105, 102, 102, 61, 34, 104, 116, 116, 112, 58, 47, 47, 110, 115, 46, 97, 100, 111, 98, 101, 46, 99, 111, 109, 47, 116, 105, 102, 102, 47, 49, 46, 48, 47, 34, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 120, 109, 112, 58, 67, 114, 101, 97, 116, 101, 68, 97, 116, 101, 62, 50, 48, 49, 57, 45, 48, 53, 45, 48, 54, 84, 49, 50, 58, 51, 50, 58, 49, 53, 90, 60, 47, 120, 109, 112, 58, 67, 114, 101, 97, 116, 101, 68, 97, 116, 101, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 120, 109, 112, 58, 67, 114, 101, 97, 116, 111, 114, 84, 111, 111, 108, 62, 65, 100, 111, 98, 101, 32, 70, 105, 114, 101, 119, 111, 114, 107, 115, 32, 67, 83, 52, 60, 47, 120, 109, 112, 58, 67, 114, 101, 97, 116, 111, 114, 84, 111, 111, 108, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 120, 109, 112, 58, 77, 111, 100, 105, 102, 121, 68, 97, 116, 101, 62, 50, 48, 49, 57, 45, 48, 53, 45, 48, 54, 84, 49, 53, 58, 53, 54, 58, 51, 56, 90, 60, 47, 120, 109, 112, 58, 77, 111, 100, 105, 102, 121, 68, 97, 116, 101, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 100, 99, 58, 102, 111, 114, 109, 97, 116, 62, 105, 109, 97, 103, 101, 47, 112, 110, 103, 60, 47, 100, 99, 58, 102, 111, 114, 109, 97, 116, 62, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 60, 116, 105, 102, 102, 58, 79, 114, 105, 101, 110, 116, 97, 116, 105, 111, 110, 62, 49, 60, 47, 116, 105, 102, 102, 58, 79, 114, 105, 101, 110, 116, 97, 116, 105, 111, 110, 62, 10, 32, 32, 32, 32, 32, 32, 60, 47, 114, 100, 102, 58, 68, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 62, 10, 32, 32, 32, 60, 47, 114, 100, 102, 58, 82, 68, 70, 62, 10, 60, 47, 120, 58, 120, 109, 112, 109, 101, 116, 97, 62, 10, 240, 91, 212, 3, 0, 0, 10, 127, 73, 68, 65, 84, 104, 5, 237, 88, 91, 111, 84, 215, 25, 93, 103, 110, 103, 110, 182, 199, 6, 204, 197, 24, 39, 24, 227, 16, 18, 5, 66, 83, 4, 42, 130, 144, 168, 85, 83, 210, 70, 74, 85, 34, 66, 85, 41, 85, 212, 180, 79, 125, 232, 99, 171, 62, 20, 84, 169, 15, 81, 251, 7, 218, 190, 71, 109, 138, 130, 34, 133, 18, 32, 225, 106, 162, 38, 33, 142, 12, 118, 77, 76, 32, 181, 185, 4, 99, 123, 108, 207, 229, 204, 153, 233, 90, 251, 204, 57, 30, 12, 38, 78, 99, 75, 41, 242, 150, 246, 204, 153, 125, 89, 223, 183, 190, 219, 222, 103, 172, 63, 156, 24, 172, 224, 62, 104, 161, 251, 128, 131, 161, 176, 64, 228, 235, 230, 201, 5, 143, 44, 120, 100, 158, 44, 176, 16, 90, 243, 100, 216, 255, 25, 246, 190, 241, 72, 100, 182, 38, 176, 184, 80, 189, 182, 233, 74, 48, 23, 215, 2, 31, 215, 255, 246, 101, 124, 25, 252, 47, 36, 226, 19, 112, 136, 170, 238, 41, 110, 145, 84, 5, 33, 78, 70, 217, 195, 148, 92, 246, 165, 127, 137, 111, 31, 187, 84, 197, 46, 7, 166, 34, 54, 113, 98, 194, 102, 159, 13, 246, 61, 137, 72, 144, 75, 33, 5, 246, 134, 112, 5, 109, 209, 50, 210, 17, 79, 92, 177, 108, 225, 86, 41, 132, 155, 78, 8, 19, 156, 143, 83, 178, 132, 243, 113, 86, 77, 107, 101, 24, 97, 215, 133, 42, 88, 30, 43, 35, 67, 236, 40, 39, 52, 62, 74, 220, 171, 78, 24, 19, 100, 145, 224, 152, 116, 185, 23, 246, 140, 68, 36, 40, 111, 64, 42, 216, 84, 231, 160, 53, 81, 66, 130, 130, 52, 174, 38, 208, 18, 201, 140, 147, 204, 192, 100, 4, 23, 114, 81, 20, 57, 104, 207, 194, 130, 82, 42, 71, 236, 134, 72, 5, 79, 164, 28, 172, 136, 151, 144, 12, 151, 141, 245, 133, 173, 38, 3, 102, 75, 97, 244, 79, 68, 113, 158, 248, 218, 19, 169, 98, 235, 121, 122, 187, 43, 145, 16, 213, 156, 164, 146, 43, 104, 165, 205, 153, 60, 26, 233, 9, 1, 151, 43, 150, 249, 54, 32, 68, 179, 216, 51, 49, 23, 143, 179, 139, 232, 169, 145, 56, 70, 74, 150, 241, 206, 76, 225, 32, 37, 68, 98, 117, 220, 197, 55, 26, 10, 198, 195, 6, 155, 170, 58, 53, 155, 132, 221, 16, 229, 154, 140, 139, 229, 118, 4, 167, 70, 109, 26, 214, 50, 161, 44, 35, 78, 111, 190, 129, 131, 113, 13, 228, 184, 97, 37, 73, 236, 88, 148, 67, 134, 36, 10, 252, 237, 146, 132, 154, 4, 152, 206, 103, 1, 202, 43, 14, 123, 179, 237, 98, 39, 215, 55, 210, 202, 242, 140, 183, 90, 59, 166, 154, 135, 13, 172, 77, 184, 248, 86, 83, 14, 73, 122, 216, 199, 22, 86, 128, 93, 221, 236, 99, 175, 76, 150, 240, 84, 83, 158, 6, 170, 64, 249, 52, 19, 118, 32, 73, 11, 164, 132, 242, 97, 75, 99, 30, 49, 110, 84, 46, 40, 169, 37, 164, 92, 46, 223, 214, 181, 222, 23, 46, 133, 234, 169, 216, 102, 90, 89, 77, 138, 213, 54, 31, 91, 68, 31, 111, 200, 155, 125, 50, 128, 143, 141, 74, 229, 54, 236, 10, 127, 7, 216, 174, 133, 69, 52, 212, 86, 98, 11, 119, 58, 182, 228, 220, 225, 17, 49, 222, 84, 95, 68, 29, 149, 242, 5, 9, 84, 61, 22, 139, 33, 145, 72, 32, 153, 76, 34, 30, 183, 205, 152, 198, 13, 16, 53, 21, 233, 102, 198, 123, 59, 187, 242, 107, 58, 184, 146, 248, 97, 230, 68, 146, 100, 100, 109, 145, 80, 243, 148, 182, 2, 236, 68, 60, 142, 72, 36, 130, 10, 13, 167, 166, 117, 69, 146, 105, 97, 248, 174, 79, 58, 38, 52, 21, 254, 181, 45, 200, 17, 97, 22, 184, 79, 33, 181, 130, 27, 28, 134, 146, 44, 226, 11, 17, 240, 208, 208, 16, 6, 6, 46, 33, 159, 207, 99, 205, 154, 118, 180, 181, 181, 193, 113, 156, 96, 141, 160, 133, 211, 194, 248, 239, 203, 81, 145, 26, 73, 202, 131, 20, 61, 188, 212, 46, 153, 60, 211, 58, 53, 225, 135, 195, 97, 227, 141, 15, 207, 157, 195, 224, 224, 32, 26, 51, 25, 116, 118, 118, 34, 195, 239, 98, 177, 72, 61, 188, 213, 162, 181, 134, 134, 248, 55, 177, 75, 212, 79, 165, 217, 151, 113, 155, 209, 180, 240, 65, 146, 136, 90, 116, 51, 87, 232, 172, 208, 137, 17, 10, 133, 112, 228, 200, 81, 124, 115, 203, 86, 236, 222, 179, 7, 99, 217, 49, 156, 56, 121, 18, 199, 222, 121, 135, 150, 211, 41, 226, 53, 137, 19, 176, 188, 105, 19, 217, 179, 167, 71, 78, 158, 206, 208, 19, 9, 134, 173, 138, 134, 111, 36, 97, 75, 217, 127, 28, 56, 128, 203, 151, 47, 163, 175, 175, 15, 207, 255, 104, 55, 126, 250, 242, 203, 232, 191, 120, 209, 68, 129, 66, 90, 235, 93, 122, 177, 142, 57, 187, 138, 134, 154, 158, 135, 1, 17, 41, 174, 122, 189, 136, 21, 72, 10, 104, 99, 153, 131, 49, 59, 134, 222, 222, 94, 252, 228, 165, 151, 140, 182, 191, 223, 191, 15, 63, 222, 187, 23, 123, 95, 124, 17, 7, 15, 30, 196, 133, 222, 62, 134, 89, 220, 88, 84, 238, 80, 164, 69, 105, 249, 24, 141, 81, 141, 58, 13, 27, 204, 4, 199, 195, 28, 247, 155, 188, 97, 219, 54, 222, 62, 114, 4, 227, 217, 113, 236, 165, 145, 126, 254, 202, 43, 248, 254, 174, 239, 161, 235, 236, 123, 216, 183, 111, 63, 70, 70, 70, 16, 141, 70, 141, 231, 180, 79, 10, 47, 165, 142, 106, 83, 72, 213, 48, 150, 32, 77, 165, 89, 203, 19, 236, 34, 165, 85, 114, 169, 172, 113, 250, 204, 25, 14, 144, 100, 166, 1, 103, 206, 116, 225, 252, 249, 243, 248, 148, 214, 251, 219, 107, 175, 161, 187, 187, 219, 204, 9, 195, 71, 214, 179, 122, 173, 32, 77, 203, 56, 126, 243, 67, 42, 151, 203, 225, 173, 183, 14, 97, 224, 211, 75, 184, 56, 48, 128, 30, 98, 159, 237, 234, 194, 67, 107, 59, 112, 152, 4, 123, 122, 122, 188, 124, 145, 85, 184, 95, 152, 242, 184, 110, 20, 181, 248, 65, 142, 72, 121, 255, 74, 160, 128, 210, 50, 159, 72, 54, 155, 53, 242, 23, 47, 89, 130, 3, 111, 188, 129, 147, 199, 223, 69, 166, 177, 201, 156, 192, 202, 17, 145, 245, 181, 148, 178, 138, 95, 37, 182, 239, 110, 9, 20, 162, 138, 129, 135, 109, 224, 12, 190, 194, 74, 24, 127, 254, 203, 95, 241, 206, 177, 99, 36, 115, 201, 76, 10, 95, 45, 75, 79, 5, 141, 64, 132, 54, 167, 191, 136, 40, 239, 124, 227, 248, 178, 106, 215, 122, 207, 85, 111, 40, 201, 59, 58, 58, 204, 88, 58, 157, 70, 71, 123, 59, 98, 12, 165, 100, 42, 101, 198, 90, 91, 91, 77, 14, 201, 194, 106, 82, 56, 199, 10, 83, 168, 230, 129, 25, 228, 135, 78, 229, 172, 198, 85, 173, 170, 182, 148, 1, 84, 5, 215, 210, 250, 106, 169, 84, 26, 171, 90, 90, 140, 55, 124, 5, 219, 218, 86, 5, 97, 101, 192, 185, 78, 162, 60, 105, 102, 155, 249, 8, 60, 162, 18, 167, 131, 80, 214, 180, 173, 178, 177, 156, 60, 226, 186, 172, 223, 91, 182, 96, 215, 51, 207, 224, 224, 155, 111, 6, 59, 7, 175, 94, 195, 158, 23, 118, 99, 227, 134, 13, 198, 162, 126, 101, 209, 130, 155, 197, 176, 57, 184, 252, 235, 138, 132, 170, 194, 140, 145, 200, 24, 239, 80, 169, 184, 110, 10, 94, 216, 42, 254, 159, 251, 193, 115, 120, 245, 143, 127, 194, 71, 31, 127, 28, 224, 235, 225, 183, 191, 249, 53, 218, 105, 184, 160, 114, 17, 72, 4, 101, 12, 37, 187, 188, 226, 55, 67, 68, 130, 100, 49, 9, 210, 221, 41, 105, 235, 224, 211, 38, 18, 43, 149, 76, 25, 220, 191, 239, 119, 216, 186, 117, 11, 78, 159, 62, 109, 200, 109, 219, 182, 13, 207, 238, 218, 133, 52, 61, 227, 112, 141, 36, 200, 189, 10, 159, 203, 249, 176, 193, 19, 174, 223, 52, 167, 80, 184, 194, 210, 185, 140, 231, 140, 154, 95, 177, 86, 175, 126, 16, 199, 143, 29, 197, 223, 95, 127, 29, 253, 253, 253, 104, 104, 200, 96, 199, 142, 237, 216, 177, 125, 187, 89, 35, 99, 74, 151, 106, 154, 220, 97, 40, 97, 89, 254, 63, 141, 114, 247, 4, 149, 120, 44, 85, 194, 38, 222, 175, 116, 24, 138, 189, 154, 194, 70, 33, 38, 176, 241, 241, 113, 227, 214, 58, 134, 153, 198, 69, 84, 227, 202, 49, 155, 85, 105, 96, 50, 138, 163, 183, 108, 83, 1, 53, 239, 147, 9, 20, 33, 230, 119, 23, 231, 204, 61, 170, 246, 192, 213, 97, 43, 44, 37, 191, 100, 37, 147, 9, 122, 186, 100, 242, 207, 236, 165, 30, 82, 71, 114, 222, 254, 60, 129, 27, 52, 184, 114, 218, 199, 15, 114, 68, 151, 243, 56, 39, 122, 121, 211, 28, 102, 104, 168, 132, 106, 147, 154, 128, 36, 68, 73, 169, 83, 61, 197, 174, 231, 90, 18, 186, 206, 140, 17, 252, 253, 177, 152, 87, 81, 170, 5, 32, 20, 10, 7, 57, 20, 98, 17, 214, 161, 123, 142, 107, 132, 173, 82, 172, 111, 225, 23, 10, 188, 126, 144, 184, 240, 21, 110, 133, 124, 49, 32, 33, 29, 56, 101, 116, 186, 194, 91, 246, 16, 195, 179, 150, 132, 230, 3, 34, 230, 7, 137, 168, 218, 188, 199, 155, 166, 226, 208, 39, 195, 33, 35, 76, 2, 229, 102, 117, 207, 62, 158, 187, 69, 66, 9, 126, 134, 158, 24, 231, 148, 121, 217, 178, 227, 36, 16, 134, 235, 120, 10, 69, 99, 54, 172, 72, 140, 198, 42, 99, 128, 161, 247, 193, 104, 156, 152, 12, 233, 170, 193, 44, 30, 140, 34, 34, 108, 115, 0, 50, 105, 141, 39, 40, 92, 100, 109, 30, 164, 55, 11, 97, 252, 43, 27, 53, 175, 10, 210, 183, 182, 5, 201, 174, 65, 41, 172, 27, 230, 80, 49, 132, 227, 195, 9, 108, 229, 197, 49, 197, 115, 69, 5, 192, 247, 142, 71, 64, 196, 104, 5, 90, 84, 150, 184, 81, 136, 224, 236, 72, 204, 184, 59, 26, 141, 240, 4, 46, 227, 218, 133, 115, 232, 57, 113, 8, 35, 215, 62, 131, 157, 76, 163, 229, 161, 199, 208, 249, 196, 118, 196, 23, 45, 69, 172, 228, 160, 123, 60, 204, 251, 88, 2, 27, 235, 167, 174, 242, 174, 64, 165, 4, 155, 60, 160, 88, 146, 215, 84, 40, 174, 147, 252, 241, 91, 113, 207, 192, 83, 203, 204, 90, 125, 220, 70, 68, 3, 10, 49, 157, 240, 159, 21, 66, 248, 39, 99, 113, 67, 93, 17, 203, 153, 156, 178, 186, 26, 49, 140, 44, 17, 203, 210, 197, 202, 137, 158, 137, 8, 28, 43, 204, 53, 101, 44, 29, 189, 130, 236, 133, 46, 188, 250, 203, 95, 152, 245, 181, 123, 190, 253, 228, 78, 188, 240, 179, 95, 97, 164, 229, 81, 84, 162, 49, 244, 79, 150, 112, 163, 152, 192, 35, 105, 190, 92, 241, 106, 164, 151, 43, 113, 145, 12, 53, 221, 48, 114, 46, 101, 240, 229, 234, 35, 118, 93, 115, 228, 109, 141, 251, 107, 180, 78, 237, 14, 34, 26, 212, 66, 145, 81, 21, 59, 194, 112, 105, 102, 204, 46, 227, 101, 82, 175, 185, 242, 128, 94, 112, 134, 73, 98, 136, 185, 52, 201, 80, 178, 105, 178, 100, 185, 136, 150, 129, 119, 209, 60, 214, 141, 179, 61, 231, 5, 131, 117, 235, 30, 134, 195, 3, 79, 218, 185, 86, 4, 135, 142, 30, 193, 15, 55, 52, 97, 221, 163, 59, 209, 215, 250, 36, 172, 84, 19, 38, 152, 123, 199, 25, 202, 153, 113, 201, 112, 205, 251, 143, 226, 95, 33, 62, 66, 25, 131, 148, 49, 74, 50, 113, 122, 70, 36, 100, 206, 233, 36, 36, 235, 174, 68, 52, 33, 50, 218, 168, 126, 147, 73, 124, 141, 160, 106, 2, 209, 233, 172, 42, 167, 185, 20, 99, 215, 9, 69, 208, 60, 248, 1, 50, 215, 78, 161, 144, 94, 129, 229, 171, 58, 241, 244, 230, 13, 56, 220, 245, 161, 217, 227, 127, 236, 254, 206, 118, 212, 47, 239, 68, 100, 116, 0, 15, 20, 243, 232, 95, 247, 60, 92, 230, 77, 170, 82, 54, 111, 164, 189, 186, 49, 231, 124, 25, 222, 183, 145, 161, 60, 50, 114, 125, 164, 59, 191, 131, 242, 123, 231, 212, 212, 136, 148, 87, 87, 171, 181, 136, 138, 171, 72, 169, 119, 244, 29, 68, 98, 236, 19, 184, 225, 4, 9, 86, 80, 96, 233, 28, 186, 121, 11, 19, 147, 121, 94, 211, 67, 104, 72, 37, 177, 164, 177, 30, 17, 94, 217, 157, 10, 171, 98, 113, 24, 67, 171, 159, 197, 224, 178, 71, 16, 45, 121, 94, 187, 187, 12, 79, 166, 39, 125, 230, 207, 25, 61, 82, 187, 69, 202, 171, 251, 109, 234, 153, 162, 153, 149, 101, 42, 87, 72, 44, 65, 250, 243, 247, 81, 78, 196, 249, 210, 68, 111, 49, 220, 30, 88, 218, 4, 75, 89, 171, 192, 87, 5, 227, 163, 222, 203, 67, 224, 217, 227, 230, 188, 185, 42, 168, 48, 167, 112, 111, 127, 246, 229, 222, 235, 123, 86, 68, 238, 5, 160, 185, 16, 67, 99, 112, 197, 70, 68, 156, 9, 164, 135, 187, 249, 102, 71, 79, 69, 147, 176, 226, 236, 97, 94, 193, 93, 158, 65, 185, 44, 42, 197, 73, 83, 210, 221, 112, 28, 195, 43, 159, 198, 245, 197, 29, 8, 115, 174, 150, 192, 23, 201, 154, 105, 254, 171, 19, 161, 181, 45, 150, 91, 39, 98, 99, 160, 125, 39, 226, 139, 215, 99, 189, 157, 197, 170, 230, 20, 172, 168, 206, 18, 30, 131, 156, 47, 51, 39, 134, 254, 115, 21, 159, 176, 236, 78, 102, 90, 145, 77, 122, 222, 178, 104, 4, 227, 177, 153, 52, 156, 229, 248, 87, 39, 34, 65, 36, 19, 42, 187, 60, 87, 44, 92, 175, 231, 237, 53, 227, 32, 145, 206, 161, 160, 43, 24, 237, 29, 226, 225, 102, 243, 128, 204, 172, 89, 140, 65, 150, 116, 133, 91, 164, 236, 120, 241, 163, 176, 155, 131, 54, 55, 68, 164, 136, 81, 136, 185, 225, 22, 145, 203, 59, 8, 241, 79, 130, 168, 41, 214, 94, 5, 12, 211, 242, 110, 145, 127, 194, 241, 223, 67, 29, 112, 21, 173, 159, 27, 14, 198, 12, 115, 71, 132, 112, 170, 94, 17, 86, 233, 171, 78, 4, 151, 39, 99, 60, 32, 89, 223, 89, 193, 164, 115, 137, 149, 170, 123, 60, 198, 243, 196, 251, 211, 192, 72, 159, 195, 143, 57, 38, 226, 157, 59, 250, 79, 248, 240, 112, 220, 88, 94, 175, 7, 50, 188, 222, 31, 212, 116, 46, 204, 69, 114, 123, 104, 83, 159, 115, 74, 196, 135, 213, 75, 154, 94, 170, 164, 176, 14, 50, 61, 248, 132, 230, 131, 132, 68, 204, 11, 145, 170, 238, 250, 242, 210, 64, 46, 97, 155, 47, 18, 194, 246, 238, 29, 122, 250, 63, 111, 11, 68, 190, 110, 14, 92, 240, 200, 130, 71, 230, 201, 2, 247, 77, 104, 253, 23, 249, 35, 174, 63, 129, 132, 9, 199, 0, 0, 0, 0, 73, 69, 78, 68, 174, 66, 96, 130, 80, 75, 7, 8, 108, 239, 160, 128, 148, 13, 0, 0, 148, 13, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 9, 0, 47, 114, 111, 111, 116, 47, 105, 110, 100, 101, 120, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 60, 104, 116, 109, 108, 62, 10, 9, 60, 104, 101, 97, 100, 62, 10, 9, 9, 60, 108, 105, 110, 107, 32, 114, 101, 108, 61, 34, 115, 116, 121, 108, 101, 115, 104, 101, 101, 116, 34, 32, 104, 114, 101, 102, 61, 34, 99, 115, 115, 47, 115, 116, 121, 108, 101, 46, 99, 115, 115, 34, 32, 116, 121, 112, 101, 61, 34, 116, 101, 120, 116, 47, 99, 115, 115, 34, 32, 47, 62, 10, 9, 60, 47, 104, 101, 97, 100, 62, 10, 9, 60, 98, 111, 100, 121, 62, 10, 9, 60, 100, 105, 118, 62, 60, 105, 109, 103, 32, 115, 114, 99, 61, 34, 105, 109, 97, 103, 101, 47, 108, 111, 103, 111, 46, 112, 110, 103, 34, 62, 60, 47, 100, 105, 118, 62, 10, 9, 84, 104, 105, 115, 32, 105, 115, 32, 116, 104, 101, 32, 105, 110, 100, 101, 120, 32, 102, 114, 111, 109, 32, 103, 114, 101, 115, 46, 10, 9, 60, 47, 98, 111, 100, 121, 62, 10, 60, 47, 104, 116, 109, 108, 62, 80, 75, 7, 8, 97, 237, 248, 84, 182, 0, 0, 0, 182, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 106, 55, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 85, 84, 5, 0, 1, 201, 26, 106, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 106, 55, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 105, 110, 100, 101, 120, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 201, 26, 106, 93, 73, 116, 39, 115, 32, 116, 104, 101, 32, 105, 110, 100, 101, 120, 32, 116, 101, 109, 112, 108, 97, 116, 101, 32, 102, 105, 108, 101, 46, 80, 75, 7, 8, 189, 150, 40, 0, 29, 0, 0, 0, 29, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 47, 99, 111, 110, 116, 97, 105, 110, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 123, 123, 100, 101, 102, 105, 110, 101, 32, 34, 99, 111, 110, 116, 97, 105, 110, 101, 114, 34, 125, 125, 10, 60, 104, 49, 62, 67, 79, 78, 84, 65, 73, 78, 69, 82, 60, 47, 104, 49, 62, 10, 123, 123, 101, 110, 100, 125, 125, 80, 75, 7, 8, 37, 7, 219, 239, 49, 0, 0, 0, 49, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 47, 102, 111, 111, 116, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 123, 123, 100, 101, 102, 105, 110, 101, 32, 34, 102, 111, 111, 116, 101, 114, 34, 125, 125, 10, 60, 104, 49, 62, 70, 79, 79, 84, 69, 82, 60, 47, 104, 49, 62, 10, 123, 123, 101, 110, 100, 125, 125, 80, 75, 7, 8, 84, 198, 59, 72, 43, 0, 0, 0, 43, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 47, 104, 101, 97, 100, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 123, 123, 100, 101, 102, 105, 110, 101, 32, 34, 104, 101, 97, 100, 101, 114, 34, 125, 125, 10, 32, 32, 32, 32, 60, 104, 49, 62, 72, 69, 65, 68, 69, 82, 60, 47, 104, 49, 62, 10, 123, 123, 101, 110, 100, 125, 125, 80, 75, 7, 8, 250, 123, 144, 211, 47, 0, 0, 0, 47, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 47, 108, 97, 121, 111, 117, 116, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 60, 33, 68, 79, 67, 84, 89, 80, 69, 32, 104, 116, 109, 108, 62, 10, 60, 104, 116, 109, 108, 62, 10, 60, 104, 101, 97, 100, 62, 10, 32, 32, 32, 32, 60, 116, 105, 116, 108, 101, 62, 71, 111, 70, 114, 97, 109, 101, 32, 76, 97, 121, 111, 117, 116, 60, 47, 116, 105, 116, 108, 101, 62, 10, 32, 32, 32, 32, 123, 123, 116, 101, 109, 112, 108, 97, 116, 101, 32, 34, 104, 101, 97, 100, 101, 114, 34, 125, 125, 10, 60, 47, 104, 101, 97, 100, 62, 10, 60, 98, 111, 100, 121, 62, 10, 32, 32, 32, 32, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 99, 111, 110, 116, 97, 105, 110, 101, 114, 34, 62, 10, 32, 32, 32, 32, 123, 123, 116, 101, 109, 112, 108, 97, 116, 101, 32, 34, 99, 111, 110, 116, 97, 105, 110, 101, 114, 34, 125, 125, 10, 32, 32, 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, 32, 32, 32, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 102, 111, 111, 116, 101, 114, 34, 62, 10, 32, 32, 32, 32, 123, 123, 116, 101, 109, 112, 108, 97, 116, 101, 32, 34, 102, 111, 111, 116, 101, 114, 34, 125, 125, 10, 32, 32, 32, 32, 60, 47, 100, 105, 118, 62, 10, 60, 47, 98, 111, 100, 121, 62, 10, 60, 47, 104, 116, 109, 108, 62, 80, 75, 7, 8, 202, 206, 145, 33, 250, 0, 0, 0, 250, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 102, 111, 111, 116, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 60, 104, 49, 62, 70, 79, 79, 84, 69, 82, 60, 47, 104, 49, 62, 80, 75, 7, 8, 90, 108, 244, 205, 15, 0, 0, 0, 15, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 104, 101, 97, 100, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 60, 104, 49, 62, 72, 69, 65, 68, 69, 82, 60, 47, 104, 49, 62, 80, 75, 7, 8, 44, 61, 217, 60, 15, 0, 0, 0, 15, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 108, 97, 121, 111, 117, 116, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 123, 123, 105, 110, 99, 108, 117, 100, 101, 32, 34, 104, 101, 97, 100, 101, 114, 46, 104, 116, 109, 108, 34, 32, 46, 125, 125, 10, 123, 123, 105, 110, 99, 108, 117, 100, 101, 32, 46, 109, 97, 105, 110, 84, 112, 108, 32, 46, 125, 125, 10, 123, 123, 105, 110, 99, 108, 117, 100, 101, 32, 34, 102, 111, 111, 116, 101, 114, 46, 104, 116, 109, 108, 34, 32, 46, 125, 125, 80, 75, 7, 8, 4, 249, 231, 7, 78, 0, 0, 0, 78, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 109, 97, 105, 110, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 109, 97, 105, 110, 47, 109, 97, 105, 110, 49, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 60, 104, 49, 62, 77, 65, 73, 78, 49, 60, 47, 104, 49, 62, 80, 75, 7, 8, 204, 77, 237, 99, 14, 0, 0, 0, 14, 0, 0, 0, 80, 75, 3, 4, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 9, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 109, 97, 105, 110, 47, 109, 97, 105, 110, 50, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 60, 104, 49, 62, 77, 65, 73, 78, 50, 60, 47, 104, 49, 62, 80, 75, 7, 8, 98, 63, 121, 229, 14, 0, 0, 0, 14, 0, 0, 0, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 0, 0, 0, 0, 47, 99, 111, 110, 102, 105, 103, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 62, 0, 0, 0, 47, 99, 111, 110, 102, 105, 103, 45, 99, 117, 115, 116, 111, 109, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 84, 68, 54, 219, 102, 0, 0, 0, 102, 0, 0, 0, 26, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 131, 0, 0, 0, 47, 99, 111, 110, 102, 105, 103, 45, 99, 117, 115, 116, 111, 109, 47, 99, 111, 110, 102, 105, 103, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 48, 7, 229, 132, 102, 0, 0, 0, 102, 0, 0, 0, 21, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 58, 1, 0, 0, 47, 99, 111, 110, 102, 105, 103, 45, 99, 117, 115, 116, 111, 109, 47, 109, 121, 46, 105, 110, 105, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 156, 194, 144, 100, 102, 0, 0, 0, 102, 0, 0, 0, 19, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 236, 1, 0, 0, 47, 99, 111, 110, 102, 105, 103, 47, 99, 111, 110, 102, 105, 103, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 248, 129, 67, 59, 102, 0, 0, 0, 102, 0, 0, 0, 14, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 156, 2, 0, 0, 47, 99, 111, 110, 102, 105, 103, 47, 109, 121, 46, 105, 110, 105, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 71, 3, 0, 0, 47, 100, 105, 114, 49, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 130, 50, 74, 209, 14, 0, 0, 0, 14, 0, 0, 0, 11, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 131, 3, 0, 0, 47, 100, 105, 114, 49, 47, 116, 101, 115, 116, 49, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 211, 3, 0, 0, 47, 100, 105, 114, 50, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 129, 137, 125, 58, 14, 0, 0, 0, 14, 0, 0, 0, 11, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 15, 4, 0, 0, 47, 100, 105, 114, 50, 47, 116, 101, 115, 116, 50, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 161, 73, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 95, 4, 0, 0, 47, 105, 49, 56, 110, 85, 84, 5, 0, 1, 30, 58, 106, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 162, 73, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 155, 4, 0, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 85, 84, 5, 0, 1, 32, 58, 106, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 161, 73, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 219, 4, 0, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 101, 110, 85, 84, 5, 0, 1, 31, 58, 106, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 236, 22, 31, 79, 114, 235, 106, 99, 16, 0, 0, 0, 16, 0, 0, 0, 23, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 30, 5, 0, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 101, 110, 47, 104, 101, 108, 108, 111, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 156, 225, 105, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 241, 22, 31, 79, 157, 17, 117, 39, 16, 0, 0, 0, 16, 0, 0, 0, 23, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 124, 5, 0, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 101, 110, 47, 119, 111, 114, 108, 100, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 166, 225, 105, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 161, 73, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 218, 5, 0, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 106, 97, 85, 84, 5, 0, 1, 31, 58, 106, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 34, 23, 31, 79, 188, 102, 42, 89, 25, 0, 0, 0, 25, 0, 0, 0, 23, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 29, 6, 0, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 106, 97, 47, 104, 101, 108, 108, 111, 46, 121, 97, 109, 108, 85, 84, 5, 0, 1, 0, 226, 105, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 42, 23, 31, 79, 158, 65, 95, 108, 15, 0, 0, 0, 15, 0, 0, 0, 23, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 132, 6, 0, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 106, 97, 47, 119, 111, 114, 108, 100, 46, 121, 97, 109, 108, 85, 84, 5, 0, 1, 17, 226, 105, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 161, 73, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 225, 6, 0, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 114, 117, 85, 84, 5, 0, 1, 31, 58, 106, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 100, 23, 31, 79, 110, 248, 192, 182, 20, 0, 0, 0, 20, 0, 0, 0, 22, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 36, 7, 0, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 114, 117, 47, 104, 101, 108, 108, 111, 46, 105, 110, 105, 85, 84, 5, 0, 1, 124, 226, 105, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 0, 24, 31, 79, 89, 25, 94, 98, 12, 0, 0, 0, 12, 0, 0, 0, 22, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 133, 7, 0, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 114, 117, 47, 119, 111, 114, 108, 100, 46, 105, 110, 105, 85, 84, 5, 0, 1, 177, 226, 105, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 162, 73, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 222, 7, 0, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 122, 104, 45, 67, 78, 85, 84, 5, 0, 1, 32, 58, 106, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 185, 24, 31, 79, 190, 33, 11, 186, 25, 0, 0, 0, 25, 0, 0, 0, 26, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 36, 8, 0, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 122, 104, 45, 67, 78, 47, 104, 101, 108, 108, 111, 46, 106, 115, 111, 110, 85, 84, 5, 0, 1, 15, 228, 105, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 183, 24, 31, 79, 10, 237, 75, 254, 25, 0, 0, 0, 25, 0, 0, 0, 26, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 142, 8, 0, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 122, 104, 45, 67, 78, 47, 119, 111, 114, 108, 100, 46, 106, 115, 111, 110, 85, 84, 5, 0, 1, 11, 228, 105, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 162, 73, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 248, 8, 0, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 122, 104, 45, 84, 87, 85, 84, 5, 0, 1, 32, 58, 106, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 58, 24, 31, 79, 16, 122, 22, 143, 79, 0, 0, 0, 79, 0, 0, 0, 25, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 62, 9, 0, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 122, 104, 45, 84, 87, 47, 104, 101, 108, 108, 111, 46, 120, 109, 108, 85, 84, 5, 0, 1, 33, 227, 105, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 67, 24, 31, 79, 250, 38, 76, 149, 79, 0, 0, 0, 79, 0, 0, 0, 25, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 221, 9, 0, 0, 47, 105, 49, 56, 110, 45, 100, 105, 114, 47, 122, 104, 45, 84, 87, 47, 119, 111, 114, 108, 100, 46, 120, 109, 108, 85, 84, 5, 0, 1, 46, 227, 105, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 162, 73, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 124, 10, 0, 0, 47, 105, 49, 56, 110, 45, 102, 105, 108, 101, 85, 84, 5, 0, 1, 33, 58, 106, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 101, 24, 31, 79, 99, 119, 45, 64, 32, 0, 0, 0, 32, 0, 0, 0, 18, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 189, 10, 0, 0, 47, 105, 49, 56, 110, 45, 102, 105, 108, 101, 47, 101, 110, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 111, 227, 105, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 112, 24, 31, 79, 20, 198, 203, 88, 41, 0, 0, 0, 41, 0, 0, 0, 18, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 38, 11, 0, 0, 47, 105, 49, 56, 110, 45, 102, 105, 108, 101, 47, 106, 97, 46, 121, 97, 109, 108, 85, 84, 5, 0, 1, 133, 227, 105, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 125, 24, 31, 79, 216, 229, 125, 35, 35, 0, 0, 0, 35, 0, 0, 0, 17, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 152, 11, 0, 0, 47, 105, 49, 56, 110, 45, 102, 105, 108, 101, 47, 114, 117, 46, 105, 110, 105, 85, 84, 5, 0, 1, 158, 227, 105, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 147, 24, 31, 79, 62, 80, 47, 182, 44, 0, 0, 0, 44, 0, 0, 0, 21, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 3, 12, 0, 0, 47, 105, 49, 56, 110, 45, 102, 105, 108, 101, 47, 122, 104, 45, 67, 78, 46, 106, 115, 111, 110, 85, 84, 5, 0, 1, 199, 227, 105, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 166, 24, 31, 79, 201, 64, 202, 211, 105, 0, 0, 0, 105, 0, 0, 0, 20, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 123, 12, 0, 0, 47, 105, 49, 56, 110, 45, 102, 105, 108, 101, 47, 122, 104, 45, 84, 87, 46, 120, 109, 108, 85, 84, 5, 0, 1, 232, 227, 105, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 101, 24, 31, 79, 99, 119, 45, 64, 32, 0, 0, 0, 32, 0, 0, 0, 13, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 47, 13, 0, 0, 47, 105, 49, 56, 110, 47, 101, 110, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 111, 227, 105, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 113, 64, 31, 79, 81, 103, 32, 118, 43, 0, 0, 0, 43, 0, 0, 0, 13, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 147, 13, 0, 0, 47, 105, 49, 56, 110, 47, 106, 97, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 214, 41, 106, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 121, 64, 31, 79, 99, 56, 186, 107, 40, 0, 0, 0, 40, 0, 0, 0, 13, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 2, 14, 0, 0, 47, 105, 49, 56, 110, 47, 114, 117, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 231, 41, 106, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 130, 64, 31, 79, 233, 222, 202, 141, 33, 0, 0, 0, 33, 0, 0, 0, 16, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 110, 14, 0, 0, 47, 105, 49, 56, 110, 47, 122, 104, 45, 67, 78, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 245, 41, 106, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 132, 64, 31, 79, 233, 222, 202, 141, 33, 0, 0, 0, 33, 0, 0, 0, 16, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 214, 14, 0, 0, 47, 105, 49, 56, 110, 47, 122, 104, 45, 84, 87, 46, 116, 111, 109, 108, 85, 84, 5, 0, 1, 249, 41, 106, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 62, 15, 0, 0, 47, 114, 111, 111, 116, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 122, 15, 0, 0, 47, 114, 111, 111, 116, 47, 99, 115, 115, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 42, 222, 98, 234, 50, 0, 0, 0, 50, 0, 0, 0, 19, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 186, 15, 0, 0, 47, 114, 111, 111, 116, 47, 99, 115, 115, 47, 115, 116, 121, 108, 101, 46, 99, 115, 115, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 54, 16, 0, 0, 47, 114, 111, 111, 116, 47, 105, 109, 97, 103, 101, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 108, 239, 160, 128, 148, 13, 0, 0, 148, 13, 0, 0, 20, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 120, 16, 0, 0, 47, 114, 111, 111, 116, 47, 105, 109, 97, 103, 101, 47, 108, 111, 103, 111, 46, 112, 110, 103, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 97, 237, 248, 84, 182, 0, 0, 0, 182, 0, 0, 0, 16, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 87, 30, 0, 0, 47, 114, 111, 111, 116, 47, 105, 110, 100, 101, 120, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 106, 55, 31, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 84, 31, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 85, 84, 5, 0, 1, 201, 26, 106, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 106, 55, 31, 79, 189, 150, 40, 0, 29, 0, 0, 0, 29, 0, 0, 0, 20, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 148, 31, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 105, 110, 100, 101, 120, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 201, 26, 106, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 252, 31, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 37, 7, 219, 239, 49, 0, 0, 0, 49, 0, 0, 0, 32, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 68, 32, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 47, 99, 111, 110, 116, 97, 105, 110, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 84, 198, 59, 72, 43, 0, 0, 0, 43, 0, 0, 0, 29, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 204, 32, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 47, 102, 111, 111, 116, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 250, 123, 144, 211, 47, 0, 0, 0, 47, 0, 0, 0, 29, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 75, 33, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 47, 104, 101, 97, 100, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 202, 206, 145, 33, 250, 0, 0, 0, 250, 0, 0, 0, 29, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 206, 33, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 49, 47, 108, 97, 121, 111, 117, 116, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 28, 35, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 90, 108, 244, 205, 15, 0, 0, 0, 15, 0, 0, 0, 29, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 100, 35, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 102, 111, 111, 116, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 44, 61, 217, 60, 15, 0, 0, 0, 15, 0, 0, 0, 29, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 199, 35, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 104, 101, 97, 100, 101, 114, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 4, 249, 231, 7, 78, 0, 0, 0, 78, 0, 0, 0, 29, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 42, 36, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 108, 97, 121, 111, 117, 116, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 9, 0, 0, 0, 0, 0, 0, 0, 16, 0, 237, 65, 204, 36, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 109, 97, 105, 110, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 204, 77, 237, 99, 14, 0, 0, 0, 14, 0, 0, 0, 33, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 25, 37, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 109, 97, 105, 110, 47, 109, 97, 105, 110, 49, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 1, 2, 20, 3, 20, 0, 8, 0, 0, 0, 48, 95, 26, 79, 98, 63, 121, 229, 14, 0, 0, 0, 14, 0, 0, 0, 33, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 129, 127, 37, 0, 0, 47, 116, 101, 109, 112, 108, 97, 116, 101, 47, 108, 97, 121, 111, 117, 116, 50, 47, 109, 97, 105, 110, 47, 109, 97, 105, 110, 50, 46, 104, 116, 109, 108, 85, 84, 5, 0, 1, 45, 201, 99, 93, 80, 75, 5, 6, 0, 0, 0, 0, 58, 0, 58, 0, 157, 16, 0, 0, 229, 37, 0, 0, 0, 0}); err != nil { panic(err) } } diff --git a/os/gview/gview.go b/os/gview/gview.go index 9ec056e82..c6dcc2059 100644 --- a/os/gview/gview.go +++ b/os/gview/gview.go @@ -24,11 +24,12 @@ import ( // View object for template engine. type View struct { - mu sync.RWMutex - paths *garray.StringArray // Searching path array. - data map[string]interface{} // Global template variables. - funcMap map[string]interface{} // Global template function map. - delimiters []string // Customized template delimiters. + mu sync.RWMutex + paths *garray.StringArray // Searching path array. + data map[string]interface{} // Global template variables. + funcMap map[string]interface{} // Global template function map. + i18nEnabled bool // Is i18n enabled in this template. + delimiters []string // Customized template delimiters. } // Params is type for template params. @@ -59,10 +60,11 @@ func ParseContent(content string, params Params) (string, error) { // The parameter specifies the template directory path to load template files. func New(path ...string) *View { view := &View{ - paths: garray.NewStringArray(true), - data: make(map[string]interface{}), - funcMap: make(map[string]interface{}), - delimiters: make([]string, 2), + paths: garray.NewStringArray(true), + data: make(map[string]interface{}), + funcMap: make(map[string]interface{}), + i18nEnabled: true, + delimiters: make([]string, 2), } if len(path) > 0 && len(path[0]) > 0 { view.SetPath(path[0]) diff --git a/os/gview/gview_config.go b/os/gview/gview_config.go index b2d2e9e67..5b0da3d1a 100644 --- a/os/gview/gview_config.go +++ b/os/gview/gview_config.go @@ -51,3 +51,10 @@ func (view *View) BindFuncMap(funcMap FuncMap) { } view.mu.Unlock() } + +// SetI18nEnabled enables/disables i18n feature in this template. +func (view *View) SetI18nEnabled(enabled bool) { + view.mu.Lock() + view.i18nEnabled = enabled + view.mu.Unlock() +} diff --git a/os/gview/gview_doparse.go b/os/gview/gview_doparse.go index 2d1861105..de6c857d3 100644 --- a/os/gview/gview_doparse.go +++ b/os/gview/gview_doparse.go @@ -13,6 +13,8 @@ import ( "strings" "text/template" + "github.com/gogf/gf/util/gi18n" + "github.com/gogf/gf/os/gfcache" "github.com/gogf/gf/os/gres" @@ -47,12 +49,9 @@ func (view *View) getTemplate(path string, pattern string) (tpl *template.Templa r := templates.GetOrSetFuncLock(path, func() interface{} { tpl = template.New(path).Delims(view.delimiters[0], view.delimiters[1]).Funcs(view.funcMap) // Firstly checking the resource manager. - if files := gres.Scan(path, pattern, true); len(files) > 0 { + if files := gres.ScanDirFile(path, pattern, true); len(files) > 0 { var err error for _, v := range files { - if v.FileInfo().IsDir() { - continue - } _, err = tpl.New(v.FileInfo().Name()).Parse(string(v.Content())) if err != nil { glog.Error(err) @@ -82,19 +81,17 @@ func (view *View) getTemplate(path string, pattern string) (tpl *template.Templa // searchFile returns the found absolute path for , and its template folder path. func (view *View) searchFile(file string) (path string, folder string, err error) { - separator := gfile.Separator // Firstly checking the resource manager. - separator = "/" view.paths.RLockFunc(func(array []string) { f := (*gres.File)(nil) for _, v := range array { - v = strings.TrimRight(v, separator) - if f = gres.Get(v + separator + file); f != nil { + v = strings.TrimRight(v, "/") + if f = gres.Get(v + "/" + file); f != nil { path = f.Name() folder = gfile.Dir(path) break } - if f = gres.Get(v + separator + "template" + separator + file); f != nil { + if f = gres.Get(v + "/template/" + file); f != nil { path = f.Name() folder = gfile.Dir(path) break @@ -105,19 +102,29 @@ func (view *View) searchFile(file string) (path string, folder string, err error if path == "" { view.paths.RLockFunc(func(array []string) { for _, v := range array { - v = strings.TrimRight(v, separator) + v = strings.TrimRight(v, gfile.Separator) if path, _ = gspath.Search(v, file); path != "" { folder = v break } - if path, _ = gspath.Search(v+separator+"template", file); path != "" { - folder = v + separator + "template" + if path, _ = gspath.Search(v+gfile.Separator+"template", file); path != "" { + folder = v + gfile.Separator + "template" break } } }) } - + // Checking the configuration file in default paths. + if path == "" && !gres.IsEmpty() { + for _, v := range []string{"/template", "/template/"} { + if file := gres.Get(v + file); file != nil { + path = file.Name() + folder = gfile.Dir(path) + return + } + } + } + // Error checking. if path == "" { buffer := bytes.NewBuffer(nil) if view.paths.Len() > 0 { @@ -131,7 +138,7 @@ func (view *View) searchFile(file string) (path string, folder string, err error } buffer.WriteString(fmt.Sprintf("\n%d. %s", index, v)) index++ - buffer.WriteString(fmt.Sprintf("\n%d. %s", index, strings.TrimRight(v, "/")+separator+"template")) + buffer.WriteString(fmt.Sprintf("\n%d. %s", index, strings.TrimRight(v, "/")+gfile.Separator+"template")) index++ } }) @@ -202,7 +209,11 @@ func (view *View) Parse(file string, params ...Params) (parsed string, err error if err := tpl.Execute(buffer, vars); err != nil { return "", err } - return gstr.Replace(buffer.String(), "", ""), nil + result := gstr.Replace(buffer.String(), "", "") + if view.i18nEnabled { + result = gi18n.T(result) + } + return result, nil } // ParseContent parses given template content @@ -254,5 +265,9 @@ func (view *View) ParseContent(content string, params ...Params) (string, error) if err := tpl.Execute(buffer, vars); err != nil { return "", err } - return gstr.Replace(buffer.String(), "", ""), nil + result := gstr.Replace(buffer.String(), "", "") + if view.i18nEnabled { + result = gi18n.T(result) + } + return result, nil } diff --git a/os/gview/gview_unit_test.go b/os/gview/gview_unit_basic_test.go similarity index 94% rename from os/gview/gview_unit_test.go rename to os/gview/gview_unit_basic_test.go index 9c04e2a04..867fcfca4 100644 --- a/os/gview/gview_unit_test.go +++ b/os/gview/gview_unit_basic_test.go @@ -1,3 +1,9 @@ +// Copyright 2017 gf Author(https://github.com/gogf/gf). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + package gview_test import ( @@ -16,7 +22,7 @@ func init() { os.Setenv("GF_GVIEW_ERRORPRINT", "false") } -func TestView_Basic(t *testing.T) { +func Test_Basic(t *testing.T) { gtest.Case(t, func() { str := `hello {{.name}},version:{{.version}};hello {{GetName}},version:{{GetVersion}};{{.other}}` pwd := gfile.Pwd() @@ -45,7 +51,7 @@ func TestView_Basic(t *testing.T) { }) } -func TestView_Func(t *testing.T) { +func Test_Func(t *testing.T) { gtest.Case(t, func() { str := `{{eq 1 1}};{{eq 1 2}};{{eq "A" "B"}}` result, err := gview.ParseContent(str, nil) @@ -162,7 +168,7 @@ func TestView_Func(t *testing.T) { }) } -func TestView_FuncInclude(t *testing.T) { +func Test_FuncInclude(t *testing.T) { gtest.Case(t, func() { header := `

HEADER

` main := `

hello gf

` @@ -200,7 +206,7 @@ func TestView_FuncInclude(t *testing.T) { }) } -func TestView_SetPath(t *testing.T) { +func Test_SetPath(t *testing.T) { gtest.Case(t, func() { view := gview.Instance("addpath") err := view.AddPath("tmp") @@ -230,7 +236,7 @@ func TestView_SetPath(t *testing.T) { }) } -func TestView_ParseContent(t *testing.T) { +func Test_ParseContent(t *testing.T) { gtest.Case(t, func() { str := `{{.name}}` view := gview.New() diff --git a/os/gview/gview_unit_i18n_test.go b/os/gview/gview_unit_i18n_test.go new file mode 100644 index 000000000..d7e18eb21 --- /dev/null +++ b/os/gview/gview_unit_i18n_test.go @@ -0,0 +1,49 @@ +// Copyright 2019 gf Author(https://github.com/gogf/gf). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +package gview_test + +import ( + "testing" + + "github.com/gogf/gf/debug/gdebug" + "github.com/gogf/gf/os/gfile" + + "github.com/gogf/gf/frame/g" + "github.com/gogf/gf/test/gtest" +) + +func Test_I18n(t *testing.T) { + gtest.Case(t, func() { + content := `{{.name}} says "{#hello}{#world}!"` + expect1 := `john says "你好世界!"` + expect2 := `john says "こんにちは世界!"` + expect3 := `john says "{#hello}{#world}!"` + + g.I18n().SetPath(gdebug.CallerDirectory() + gfile.Separator + "testdata" + gfile.Separator + "i18n") + + g.I18n().SetLanguage("zh-CN") + result1, err := g.View().ParseContent(content, g.Map{ + "name": "john", + }) + gtest.Assert(err, nil) + gtest.Assert(result1, expect1) + + g.I18n().SetLanguage("ja") + result2, err := g.View().ParseContent(content, g.Map{ + "name": "john", + }) + gtest.Assert(err, nil) + gtest.Assert(result2, expect2) + + g.I18n().SetLanguage("none") + result3, err := g.View().ParseContent(content, g.Map{ + "name": "john", + }) + gtest.Assert(err, nil) + gtest.Assert(result3, expect3) + }) +} diff --git a/os/gview/testdata/i18n/en.toml b/os/gview/testdata/i18n/en.toml new file mode 100644 index 000000000..17df41597 --- /dev/null +++ b/os/gview/testdata/i18n/en.toml @@ -0,0 +1,3 @@ + +hello = "Hello" +world = "World" \ No newline at end of file diff --git a/os/gview/testdata/i18n/ja.toml b/os/gview/testdata/i18n/ja.toml new file mode 100644 index 000000000..8ca47ed7f --- /dev/null +++ b/os/gview/testdata/i18n/ja.toml @@ -0,0 +1,3 @@ + +hello = "こんにちは" +world = "世界" \ No newline at end of file diff --git a/os/gview/testdata/i18n/ru.toml b/os/gview/testdata/i18n/ru.toml new file mode 100644 index 000000000..938434a5a --- /dev/null +++ b/os/gview/testdata/i18n/ru.toml @@ -0,0 +1,3 @@ + +hello = "Привет" +world = "мир" \ No newline at end of file diff --git a/os/gview/testdata/i18n/zh-CN.toml b/os/gview/testdata/i18n/zh-CN.toml new file mode 100644 index 000000000..b3a52c527 --- /dev/null +++ b/os/gview/testdata/i18n/zh-CN.toml @@ -0,0 +1,2 @@ +hello = "你好" +world = "世界" \ No newline at end of file diff --git a/os/gview/testdata/i18n/zh-TW.toml b/os/gview/testdata/i18n/zh-TW.toml new file mode 100644 index 000000000..b3a52c527 --- /dev/null +++ b/os/gview/testdata/i18n/zh-TW.toml @@ -0,0 +1,2 @@ +hello = "你好" +world = "世界" \ No newline at end of file diff --git a/text/gregex/gregex.go b/text/gregex/gregex.go index 5a2d1e9da..8ad0292ee 100644 --- a/text/gregex/gregex.go +++ b/text/gregex/gregex.go @@ -100,14 +100,14 @@ func ReplaceFunc(pattern string, src []byte, replaceFunc func(b []byte) []byte) } } -// ReplaceFunc replace all matched in bytes +// ReplaceFuncMatch replace all matched in bytes // with custom replacement function . // The parameter type for is [][]byte, // which is the result contains all sub-patterns of using Match function. func ReplaceFuncMatch(pattern string, src []byte, replaceFunc func(match [][]byte) []byte) ([]byte, error) { if r, err := getRegexp(pattern); err == nil { return r.ReplaceAllFunc(src, func(bytes []byte) []byte { - match, _ := Match(pattern, src) + match, _ := Match(pattern, bytes) return replaceFunc(match) }), nil } else { @@ -131,7 +131,7 @@ func ReplaceStringFunc(pattern string, src string, replaceFunc func(s string) st func ReplaceStringFuncMatch(pattern string, src string, replaceFunc func(match []string) string) (string, error) { if r, err := getRegexp(pattern); err == nil { return string(r.ReplaceAllFunc([]byte(src), func(bytes []byte) []byte { - match, _ := MatchString(pattern, src) + match, _ := MatchString(pattern, string(bytes)) return []byte(replaceFunc(match)) })), nil } else { diff --git a/util/gi18n/gi18n.go b/util/gi18n/gi18n.go new file mode 100644 index 000000000..dad50f059 --- /dev/null +++ b/util/gi18n/gi18n.go @@ -0,0 +1,38 @@ +// Copyright 2019 gf Author(https://github.com/gogf/gf). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +// Package gi18n implements internationalization and localization. +package gi18n + +var ( + defaultTranslator = Instance() +) + +// SetPath sets the directory path storing i18n files. +func SetPath(path string) error { + return defaultTranslator.SetPath(path) +} + +// SetLanguage sets the language for translator. +func SetLanguage(language string) { + defaultTranslator.SetLanguage(language) +} + +// SetDelimiters sets the delimiters for translator. +func SetDelimiters(left, right string) { + defaultTranslator.SetDelimiters(left, right) +} + +// T is alias of Translate. +func T(content string, language ...string) string { + return defaultTranslator.T(content, language...) +} + +// Translate translates with configured language. +// The parameter specifies custom translation language ignoring configured language. +func Translate(content string, language ...string) string { + return defaultTranslator.Translate(content, language...) +} diff --git a/util/gi18n/gi18n_instance.go b/util/gi18n/gi18n_instance.go new file mode 100644 index 000000000..3d46d26d5 --- /dev/null +++ b/util/gi18n/gi18n_instance.go @@ -0,0 +1,31 @@ +// Copyright 2019 gf Author(https://github.com/gogf/gf). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +package gi18n + +import "github.com/gogf/gf/container/gmap" + +const ( + // Default group name for instance usage. + DEFAULT_NAME = "default" +) + +var ( + // Instances map. + instances = gmap.NewStrAnyMap(true) +) + +// Instance returns an instance of Resource. +// The parameter is the name for the instance. +func Instance(name ...string) *Translator { + key := DEFAULT_NAME + if len(name) > 0 && name[0] != "" { + key = name[0] + } + return instances.GetOrSetFuncLock(key, func() interface{} { + return New() + }).(*Translator) +} diff --git a/util/gi18n/gi18n_translator.go b/util/gi18n/gi18n_translator.go new file mode 100644 index 000000000..683bbe93a --- /dev/null +++ b/util/gi18n/gi18n_translator.go @@ -0,0 +1,208 @@ +// Copyright 2019 gf Author(https://github.com/gogf/gf). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +package gi18n + +import ( + "errors" + "fmt" + "strings" + "sync" + + "github.com/gogf/gf/os/gfsnotify" + + "github.com/gogf/gf/text/gregex" + + "github.com/gogf/gf/util/gconv" + + "github.com/gogf/gf/encoding/gjson" + + "github.com/gogf/gf/os/gfile" + "github.com/gogf/gf/os/gres" +) + +// Translator, it is concurrent safe, supporting hot reload. +type Translator struct { + mu sync.RWMutex + data map[string]map[string]string // Translating map. + pattern string // Pattern for regex parsing. + options Options // configuration options. +} + +type Options struct { + Path string // I18n files storage path. + Language string // Local language. + Delimiters []string // Delimiters for variable parsing. +} + +var ( + defaultDelimiters = []string{"{#", "}"} +) + +func New(options ...Options) *Translator { + var opts Options + if len(options) > 0 { + opts = options[0] + } else { + opts = DefaultOptions() + } + if len(opts.Delimiters) == 0 { + opts.Delimiters = defaultDelimiters + } + return &Translator{ + options: opts, + pattern: fmt.Sprintf( + `%s(\w+)%s`, + gregex.Quote(opts.Delimiters[0]), + gregex.Quote(opts.Delimiters[1]), + ), + } +} + +func DefaultOptions() Options { + path := "i18n" + realPath, _ := gfile.Search(path) + if realPath != "" { + path = realPath + } else { + path = "/" + path + } + return Options{ + Path: path, + Delimiters: []string{"{#", "}"}, + } +} + +// SetPath sets the directory path storing i18n files. +func (t *Translator) SetPath(path string) error { + if gres.Contains(path) { + t.options.Path = path + } else { + realPath, _ := gfile.Search(path) + if realPath == "" { + return errors.New(fmt.Sprintf(`%s does not exist`, path)) + } + t.options.Path = realPath + } + return nil +} + +// SetLanguage sets the language for translator. +func (t *Translator) SetLanguage(language string) { + t.options.Language = language +} + +// SetDelimiters sets the delimiters for translator. +func (t *Translator) SetDelimiters(left, right string) { + t.pattern = fmt.Sprintf(`%s(\w+)%s`, gregex.Quote(left), gregex.Quote(right)) +} + +// T is alias of Translate. +func (t *Translator) T(content string, language ...string) string { + return t.Translate(content, language...) +} + +// Translate translates with configured language. +// The parameter specifies custom translation language ignoring configured language. +func (t *Translator) Translate(content string, language ...string) string { + t.init() + t.mu.RLock() + defer t.mu.RUnlock() + var data map[string]string + if len(language) > 0 { + data = t.data[language[0]] + } else { + data = t.data[t.options.Language] + } + if data == nil { + return content + } + // Parse content as name. + if v, ok := data[content]; ok { + return v + } + // Parse content as variables container. + result, _ := gregex.ReplaceStringFuncMatch(t.pattern, content, func(match []string) string { + if v, ok := data[match[1]]; ok { + return v + } + return match[0] + }) + return result +} + +func (t *Translator) init() { + t.mu.RLock() + if t.data != nil { + t.mu.RUnlock() + return + } + t.mu.RUnlock() + + t.mu.Lock() + defer t.mu.Unlock() + if gres.Contains(t.options.Path) { + files := gres.ScanDirFile(t.options.Path, "*.*", true) + if len(files) > 0 { + var path string + var name string + var lang string + var array []string + t.data = make(map[string]map[string]string) + for _, file := range files { + name = file.Name() + path = name[len(t.options.Path)+1:] + array = strings.Split(path, "/") + if len(array) > 1 { + lang = array[0] + } else { + lang = gfile.Name(array[0]) + } + if t.data[lang] == nil { + t.data[lang] = make(map[string]string) + } + j, _ := gjson.LoadContent(file.Content()) + if j != nil { + for k, v := range j.ToMap() { + t.data[lang][k] = gconv.String(v) + } + } + } + } + } else { + files, _ := gfile.ScanDirFile(t.options.Path, "*.*", true) + if len(files) > 0 { + var path string + var lang string + var array []string + t.data = make(map[string]map[string]string) + for _, file := range files { + path = file[len(t.options.Path)+1:] + array = strings.Split(path, "/") + if len(array) > 1 { + lang = array[0] + } else { + lang = gfile.Name(array[0]) + } + if t.data[lang] == nil { + t.data[lang] = make(map[string]string) + } + j, _ := gjson.LoadContent(gfile.GetBytes(file)) + if j != nil { + for k, v := range j.ToMap() { + t.data[lang][k] = gconv.String(v) + } + } + } + _, _ = gfsnotify.Add(path, func(event *gfsnotify.Event) { + t.mu.Lock() + t.data = nil + t.mu.Unlock() + gfsnotify.Exit() + }) + } + } +} diff --git a/util/gi18n/gi18n_unit_test.go b/util/gi18n/gi18n_unit_test.go new file mode 100644 index 000000000..4af872213 --- /dev/null +++ b/util/gi18n/gi18n_unit_test.go @@ -0,0 +1,31 @@ +// Copyright 2019 gf Author(https://github.com/gogf/gf). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +package gi18n_test + +import ( + "testing" + + "github.com/gogf/gf/util/gi18n" + + "github.com/gogf/gf/debug/gdebug" + "github.com/gogf/gf/os/gfile" + + "github.com/gogf/gf/test/gtest" +) + +func Test_Basic(t *testing.T) { + gtest.Case(t, func() { + t := gi18n.New(gi18n.Options{ + Path: gdebug.CallerDirectory() + gfile.Separator + "testdata" + gfile.Separator + "i18n", + }) + t.SetLanguage("none") + gtest.Assert(t.T("{#hello}{#world}"), "{#hello}{#world}") + + t.SetLanguage("ja") + gtest.Assert(t.T("{#hello}{#world}"), "こんにちは世界") + }) +} diff --git a/util/gi18n/testdata/i18n-dir/en/hello.toml b/util/gi18n/testdata/i18n-dir/en/hello.toml new file mode 100644 index 000000000..1680a362c --- /dev/null +++ b/util/gi18n/testdata/i18n-dir/en/hello.toml @@ -0,0 +1,2 @@ + +hello = "Hello" \ No newline at end of file diff --git a/util/gi18n/testdata/i18n-dir/en/world.toml b/util/gi18n/testdata/i18n-dir/en/world.toml new file mode 100644 index 000000000..f9afd1e67 --- /dev/null +++ b/util/gi18n/testdata/i18n-dir/en/world.toml @@ -0,0 +1,2 @@ + +world = "World" \ No newline at end of file diff --git a/util/gi18n/testdata/i18n-dir/ja/hello.yaml b/util/gi18n/testdata/i18n-dir/ja/hello.yaml new file mode 100644 index 000000000..ec827cd49 --- /dev/null +++ b/util/gi18n/testdata/i18n-dir/ja/hello.yaml @@ -0,0 +1,2 @@ + +hello: "こんにちは" \ No newline at end of file diff --git a/util/gi18n/testdata/i18n-dir/ja/world.yaml b/util/gi18n/testdata/i18n-dir/ja/world.yaml new file mode 100644 index 000000000..04e828b42 --- /dev/null +++ b/util/gi18n/testdata/i18n-dir/ja/world.yaml @@ -0,0 +1 @@ +world: "世界" \ No newline at end of file diff --git a/util/gi18n/testdata/i18n-dir/ru/hello.ini b/util/gi18n/testdata/i18n-dir/ru/hello.ini new file mode 100644 index 000000000..d2e2af1ca --- /dev/null +++ b/util/gi18n/testdata/i18n-dir/ru/hello.ini @@ -0,0 +1 @@ +hello = Привет \ No newline at end of file diff --git a/util/gi18n/testdata/i18n-dir/ru/world.ini b/util/gi18n/testdata/i18n-dir/ru/world.ini new file mode 100644 index 000000000..fffaf192d --- /dev/null +++ b/util/gi18n/testdata/i18n-dir/ru/world.ini @@ -0,0 +1 @@ +world=мир \ No newline at end of file diff --git a/util/gi18n/testdata/i18n-dir/zh-CN/hello.json b/util/gi18n/testdata/i18n-dir/zh-CN/hello.json new file mode 100644 index 000000000..b8eb10e94 --- /dev/null +++ b/util/gi18n/testdata/i18n-dir/zh-CN/hello.json @@ -0,0 +1,3 @@ +{ + "hello": "你好" +} \ No newline at end of file diff --git a/util/gi18n/testdata/i18n-dir/zh-CN/world.json b/util/gi18n/testdata/i18n-dir/zh-CN/world.json new file mode 100644 index 000000000..9d6392149 --- /dev/null +++ b/util/gi18n/testdata/i18n-dir/zh-CN/world.json @@ -0,0 +1,3 @@ +{ + "world": "世界" +} \ No newline at end of file diff --git a/util/gi18n/testdata/i18n-dir/zh-TW/hello.xml b/util/gi18n/testdata/i18n-dir/zh-TW/hello.xml new file mode 100644 index 000000000..a4e52ef07 --- /dev/null +++ b/util/gi18n/testdata/i18n-dir/zh-TW/hello.xml @@ -0,0 +1,4 @@ + + + 你好 + \ No newline at end of file diff --git a/util/gi18n/testdata/i18n-dir/zh-TW/world.xml b/util/gi18n/testdata/i18n-dir/zh-TW/world.xml new file mode 100644 index 000000000..877b402c5 --- /dev/null +++ b/util/gi18n/testdata/i18n-dir/zh-TW/world.xml @@ -0,0 +1,4 @@ + + + 世界 + \ No newline at end of file diff --git a/util/gi18n/testdata/i18n-file/en.toml b/util/gi18n/testdata/i18n-file/en.toml new file mode 100644 index 000000000..17df41597 --- /dev/null +++ b/util/gi18n/testdata/i18n-file/en.toml @@ -0,0 +1,3 @@ + +hello = "Hello" +world = "World" \ No newline at end of file diff --git a/util/gi18n/testdata/i18n-file/ja.yaml b/util/gi18n/testdata/i18n-file/ja.yaml new file mode 100644 index 000000000..0166fcefb --- /dev/null +++ b/util/gi18n/testdata/i18n-file/ja.yaml @@ -0,0 +1,3 @@ + +hello: "こんにちは" +world: "世界" \ No newline at end of file diff --git a/util/gi18n/testdata/i18n-file/ru.ini b/util/gi18n/testdata/i18n-file/ru.ini new file mode 100644 index 000000000..f04620fab --- /dev/null +++ b/util/gi18n/testdata/i18n-file/ru.ini @@ -0,0 +1,2 @@ +hello = Привет +world = мир \ No newline at end of file diff --git a/util/gi18n/testdata/i18n-file/zh-CN.json b/util/gi18n/testdata/i18n-file/zh-CN.json new file mode 100644 index 000000000..1de75ba1a --- /dev/null +++ b/util/gi18n/testdata/i18n-file/zh-CN.json @@ -0,0 +1,4 @@ +{ + "hello": "你好", + "world": "世界" +} \ No newline at end of file diff --git a/util/gi18n/testdata/i18n-file/zh-TW.xml b/util/gi18n/testdata/i18n-file/zh-TW.xml new file mode 100644 index 000000000..9a4356f4c --- /dev/null +++ b/util/gi18n/testdata/i18n-file/zh-TW.xml @@ -0,0 +1,5 @@ + + + 你好 + 世界 + \ No newline at end of file diff --git a/util/gi18n/testdata/i18n/en.toml b/util/gi18n/testdata/i18n/en.toml new file mode 100644 index 000000000..17df41597 --- /dev/null +++ b/util/gi18n/testdata/i18n/en.toml @@ -0,0 +1,3 @@ + +hello = "Hello" +world = "World" \ No newline at end of file diff --git a/util/gi18n/testdata/i18n/ja.toml b/util/gi18n/testdata/i18n/ja.toml new file mode 100644 index 000000000..8ca47ed7f --- /dev/null +++ b/util/gi18n/testdata/i18n/ja.toml @@ -0,0 +1,3 @@ + +hello = "こんにちは" +world = "世界" \ No newline at end of file diff --git a/util/gi18n/testdata/i18n/ru.toml b/util/gi18n/testdata/i18n/ru.toml new file mode 100644 index 000000000..938434a5a --- /dev/null +++ b/util/gi18n/testdata/i18n/ru.toml @@ -0,0 +1,3 @@ + +hello = "Привет" +world = "мир" \ No newline at end of file diff --git a/util/gi18n/testdata/i18n/zh-CN.toml b/util/gi18n/testdata/i18n/zh-CN.toml new file mode 100644 index 000000000..b3a52c527 --- /dev/null +++ b/util/gi18n/testdata/i18n/zh-CN.toml @@ -0,0 +1,2 @@ +hello = "你好" +world = "世界" \ No newline at end of file diff --git a/util/gi18n/testdata/i18n/zh-TW.toml b/util/gi18n/testdata/i18n/zh-TW.toml new file mode 100644 index 000000000..b3a52c527 --- /dev/null +++ b/util/gi18n/testdata/i18n/zh-TW.toml @@ -0,0 +1,2 @@ +hello = "你好" +world = "世界" \ No newline at end of file