From 21153883cc5174547f7425e1b567e7c788958920 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 23 Aug 2024 23:15:31 +0000 Subject: [PATCH] chore(deps): update module github.com/rs/zerolog to v1.33.0 --- go.mod | 4 +- go.sum | 12 + vendor/github.com/mattn/go-colorable/LICENSE | 21 + .../github.com/mattn/go-colorable/README.md | 48 + .../mattn/go-colorable/colorable_appengine.go | 38 + .../mattn/go-colorable/colorable_others.go | 38 + .../mattn/go-colorable/colorable_windows.go | 1047 +++++++++++++++++ .../github.com/mattn/go-colorable/go.test.sh | 12 + .../mattn/go-colorable/noncolorable.go | 57 + vendor/github.com/mattn/go-isatty/LICENSE | 9 + vendor/github.com/mattn/go-isatty/README.md | 50 + vendor/github.com/mattn/go-isatty/doc.go | 2 + vendor/github.com/mattn/go-isatty/go.test.sh | 12 + .../github.com/mattn/go-isatty/isatty_bsd.go | 19 + .../mattn/go-isatty/isatty_others.go | 16 + .../mattn/go-isatty/isatty_plan9.go | 23 + .../mattn/go-isatty/isatty_solaris.go | 21 + .../mattn/go-isatty/isatty_tcgets.go | 19 + .../mattn/go-isatty/isatty_windows.go | 125 ++ vendor/github.com/rs/zerolog/README.md | 107 +- vendor/github.com/rs/zerolog/array.go | 55 +- vendor/github.com/rs/zerolog/console.go | 217 +++- vendor/github.com/rs/zerolog/context.go | 73 +- vendor/github.com/rs/zerolog/ctx.go | 23 +- vendor/github.com/rs/zerolog/encoder.go | 12 +- vendor/github.com/rs/zerolog/encoder_cbor.go | 3 + vendor/github.com/rs/zerolog/encoder_json.go | 12 + vendor/github.com/rs/zerolog/event.go | 103 +- vendor/github.com/rs/zerolog/example.jsonl | 7 + vendor/github.com/rs/zerolog/fields.go | 41 +- vendor/github.com/rs/zerolog/globals.go | 60 +- .../rs/zerolog/internal/cbor/cbor.go | 8 +- .../rs/zerolog/internal/cbor/decode_stream.go | 68 +- .../rs/zerolog/internal/cbor/string.go | 59 +- .../rs/zerolog/internal/cbor/time.go | 22 +- .../rs/zerolog/internal/cbor/types.go | 83 +- .../rs/zerolog/internal/json/string.go | 38 +- .../rs/zerolog/internal/json/time.go | 29 +- .../rs/zerolog/internal/json/types.go | 58 +- vendor/github.com/rs/zerolog/log.go | 101 +- vendor/github.com/rs/zerolog/pretty.png | Bin 84064 -> 118839 bytes vendor/github.com/rs/zerolog/sampler.go | 2 +- vendor/github.com/rs/zerolog/syslog.go | 9 + vendor/github.com/rs/zerolog/writer.go | 256 +++- vendor/modules.txt | 8 +- 45 files changed, 2746 insertions(+), 281 deletions(-) create mode 100644 vendor/github.com/mattn/go-colorable/LICENSE create mode 100644 vendor/github.com/mattn/go-colorable/README.md create mode 100644 vendor/github.com/mattn/go-colorable/colorable_appengine.go create mode 100644 vendor/github.com/mattn/go-colorable/colorable_others.go create mode 100644 vendor/github.com/mattn/go-colorable/colorable_windows.go create mode 100644 vendor/github.com/mattn/go-colorable/go.test.sh create mode 100644 vendor/github.com/mattn/go-colorable/noncolorable.go create mode 100644 vendor/github.com/mattn/go-isatty/LICENSE create mode 100644 vendor/github.com/mattn/go-isatty/README.md create mode 100644 vendor/github.com/mattn/go-isatty/doc.go create mode 100644 vendor/github.com/mattn/go-isatty/go.test.sh create mode 100644 vendor/github.com/mattn/go-isatty/isatty_bsd.go create mode 100644 vendor/github.com/mattn/go-isatty/isatty_others.go create mode 100644 vendor/github.com/mattn/go-isatty/isatty_plan9.go create mode 100644 vendor/github.com/mattn/go-isatty/isatty_solaris.go create mode 100644 vendor/github.com/mattn/go-isatty/isatty_tcgets.go create mode 100644 vendor/github.com/mattn/go-isatty/isatty_windows.go create mode 100644 vendor/github.com/rs/zerolog/example.jsonl diff --git a/go.mod b/go.mod index 4e5b2d9..59a7e1a 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.17 require ( github.com/mackerelio/go-osstat v0.2.5 - github.com/rs/zerolog v1.25.0 + github.com/rs/zerolog v1.33.0 github.com/shirou/gopsutil v3.21.8+incompatible gopkg.in/yaml.v2 v2.4.0 ) @@ -12,5 +12,7 @@ require ( require ( github.com/StackExchange/wmi v1.2.1 // indirect github.com/go-ole/go-ole v1.2.5 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect golang.org/x/sys v0.20.0 // indirect ) diff --git a/go.sum b/go.sum index c0a5a98..02fe3eb 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,7 @@ github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -8,10 +9,18 @@ github.com/mackerelio/go-osstat v0.2.0 h1:UVn9Am/OOj2Ig0LNNHLqiHeXsZWmMNcMPZ3h+z github.com/mackerelio/go-osstat v0.2.0/go.mod h1:UzRL8dMCCTqG5WdRtsxbuljMpZt9PCAGXqxPst5QtaY= github.com/mackerelio/go-osstat v0.2.5 h1:+MqTbZUhoIt4m8qzkVoXUJg1EuifwlAJSk4Yl2GXh+o= github.com/mackerelio/go-osstat v0.2.5/go.mod h1:atxwWF+POUZcdtR1wnsUcQxTytoHG4uhl2AKKzrOajY= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.25.0 h1:Rj7XygbUHKUlDPcVdoLyR91fJBsduXj5fRxyqIQj/II= github.com/rs/zerolog v1.25.0/go.mod h1:7KHcEGe0QZPOm2IE4Kpb5rTh6n1h2hIgS5OOnu1rUaI= +github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= +github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= github.com/shirou/gopsutil v3.21.8+incompatible h1:sh0foI8tMRlCidUJR+KzqWYWxrkuuPIGiO6Vp+KXdCU= github.com/shirou/gopsutil v3.21.8+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= @@ -32,6 +41,9 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210915083310-ed5796bab164 h1:7ZDGnxgHAMw7thfC5bEos0RDAccZKxioiWBhfIe+tvw= golang.org/x/sys v0.0.0-20210915083310-ed5796bab164/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= diff --git a/vendor/github.com/mattn/go-colorable/LICENSE b/vendor/github.com/mattn/go-colorable/LICENSE new file mode 100644 index 0000000..91b5cef --- /dev/null +++ b/vendor/github.com/mattn/go-colorable/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Yasuhiro Matsumoto + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/mattn/go-colorable/README.md b/vendor/github.com/mattn/go-colorable/README.md new file mode 100644 index 0000000..ca04837 --- /dev/null +++ b/vendor/github.com/mattn/go-colorable/README.md @@ -0,0 +1,48 @@ +# go-colorable + +[![Build Status](https://github.com/mattn/go-colorable/workflows/test/badge.svg)](https://github.com/mattn/go-colorable/actions?query=workflow%3Atest) +[![Codecov](https://codecov.io/gh/mattn/go-colorable/branch/master/graph/badge.svg)](https://codecov.io/gh/mattn/go-colorable) +[![GoDoc](https://godoc.org/github.com/mattn/go-colorable?status.svg)](http://godoc.org/github.com/mattn/go-colorable) +[![Go Report Card](https://goreportcard.com/badge/mattn/go-colorable)](https://goreportcard.com/report/mattn/go-colorable) + +Colorable writer for windows. + +For example, most of logger packages doesn't show colors on windows. (I know we can do it with ansicon. But I don't want.) +This package is possible to handle escape sequence for ansi color on windows. + +## Too Bad! + +![](https://raw.githubusercontent.com/mattn/go-colorable/gh-pages/bad.png) + + +## So Good! + +![](https://raw.githubusercontent.com/mattn/go-colorable/gh-pages/good.png) + +## Usage + +```go +logrus.SetFormatter(&logrus.TextFormatter{ForceColors: true}) +logrus.SetOutput(colorable.NewColorableStdout()) + +logrus.Info("succeeded") +logrus.Warn("not correct") +logrus.Error("something error") +logrus.Fatal("panic") +``` + +You can compile above code on non-windows OSs. + +## Installation + +``` +$ go get github.com/mattn/go-colorable +``` + +# License + +MIT + +# Author + +Yasuhiro Matsumoto (a.k.a mattn) diff --git a/vendor/github.com/mattn/go-colorable/colorable_appengine.go b/vendor/github.com/mattn/go-colorable/colorable_appengine.go new file mode 100644 index 0000000..416d1bb --- /dev/null +++ b/vendor/github.com/mattn/go-colorable/colorable_appengine.go @@ -0,0 +1,38 @@ +//go:build appengine +// +build appengine + +package colorable + +import ( + "io" + "os" + + _ "github.com/mattn/go-isatty" +) + +// NewColorable returns new instance of Writer which handles escape sequence. +func NewColorable(file *os.File) io.Writer { + if file == nil { + panic("nil passed instead of *os.File to NewColorable()") + } + + return file +} + +// NewColorableStdout returns new instance of Writer which handles escape sequence for stdout. +func NewColorableStdout() io.Writer { + return os.Stdout +} + +// NewColorableStderr returns new instance of Writer which handles escape sequence for stderr. +func NewColorableStderr() io.Writer { + return os.Stderr +} + +// EnableColorsStdout enable colors if possible. +func EnableColorsStdout(enabled *bool) func() { + if enabled != nil { + *enabled = true + } + return func() {} +} diff --git a/vendor/github.com/mattn/go-colorable/colorable_others.go b/vendor/github.com/mattn/go-colorable/colorable_others.go new file mode 100644 index 0000000..766d946 --- /dev/null +++ b/vendor/github.com/mattn/go-colorable/colorable_others.go @@ -0,0 +1,38 @@ +//go:build !windows && !appengine +// +build !windows,!appengine + +package colorable + +import ( + "io" + "os" + + _ "github.com/mattn/go-isatty" +) + +// NewColorable returns new instance of Writer which handles escape sequence. +func NewColorable(file *os.File) io.Writer { + if file == nil { + panic("nil passed instead of *os.File to NewColorable()") + } + + return file +} + +// NewColorableStdout returns new instance of Writer which handles escape sequence for stdout. +func NewColorableStdout() io.Writer { + return os.Stdout +} + +// NewColorableStderr returns new instance of Writer which handles escape sequence for stderr. +func NewColorableStderr() io.Writer { + return os.Stderr +} + +// EnableColorsStdout enable colors if possible. +func EnableColorsStdout(enabled *bool) func() { + if enabled != nil { + *enabled = true + } + return func() {} +} diff --git a/vendor/github.com/mattn/go-colorable/colorable_windows.go b/vendor/github.com/mattn/go-colorable/colorable_windows.go new file mode 100644 index 0000000..1846ad5 --- /dev/null +++ b/vendor/github.com/mattn/go-colorable/colorable_windows.go @@ -0,0 +1,1047 @@ +//go:build windows && !appengine +// +build windows,!appengine + +package colorable + +import ( + "bytes" + "io" + "math" + "os" + "strconv" + "strings" + "sync" + "syscall" + "unsafe" + + "github.com/mattn/go-isatty" +) + +const ( + foregroundBlue = 0x1 + foregroundGreen = 0x2 + foregroundRed = 0x4 + foregroundIntensity = 0x8 + foregroundMask = (foregroundRed | foregroundBlue | foregroundGreen | foregroundIntensity) + backgroundBlue = 0x10 + backgroundGreen = 0x20 + backgroundRed = 0x40 + backgroundIntensity = 0x80 + backgroundMask = (backgroundRed | backgroundBlue | backgroundGreen | backgroundIntensity) + commonLvbUnderscore = 0x8000 + + cENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x4 +) + +const ( + genericRead = 0x80000000 + genericWrite = 0x40000000 +) + +const ( + consoleTextmodeBuffer = 0x1 +) + +type wchar uint16 +type short int16 +type dword uint32 +type word uint16 + +type coord struct { + x short + y short +} + +type smallRect struct { + left short + top short + right short + bottom short +} + +type consoleScreenBufferInfo struct { + size coord + cursorPosition coord + attributes word + window smallRect + maximumWindowSize coord +} + +type consoleCursorInfo struct { + size dword + visible int32 +} + +var ( + kernel32 = syscall.NewLazyDLL("kernel32.dll") + procGetConsoleScreenBufferInfo = kernel32.NewProc("GetConsoleScreenBufferInfo") + procSetConsoleTextAttribute = kernel32.NewProc("SetConsoleTextAttribute") + procSetConsoleCursorPosition = kernel32.NewProc("SetConsoleCursorPosition") + procFillConsoleOutputCharacter = kernel32.NewProc("FillConsoleOutputCharacterW") + procFillConsoleOutputAttribute = kernel32.NewProc("FillConsoleOutputAttribute") + procGetConsoleCursorInfo = kernel32.NewProc("GetConsoleCursorInfo") + procSetConsoleCursorInfo = kernel32.NewProc("SetConsoleCursorInfo") + procSetConsoleTitle = kernel32.NewProc("SetConsoleTitleW") + procGetConsoleMode = kernel32.NewProc("GetConsoleMode") + procSetConsoleMode = kernel32.NewProc("SetConsoleMode") + procCreateConsoleScreenBuffer = kernel32.NewProc("CreateConsoleScreenBuffer") +) + +// Writer provides colorable Writer to the console +type Writer struct { + out io.Writer + handle syscall.Handle + althandle syscall.Handle + oldattr word + oldpos coord + rest bytes.Buffer + mutex sync.Mutex +} + +// NewColorable returns new instance of Writer which handles escape sequence from File. +func NewColorable(file *os.File) io.Writer { + if file == nil { + panic("nil passed instead of *os.File to NewColorable()") + } + + if isatty.IsTerminal(file.Fd()) { + var mode uint32 + if r, _, _ := procGetConsoleMode.Call(file.Fd(), uintptr(unsafe.Pointer(&mode))); r != 0 && mode&cENABLE_VIRTUAL_TERMINAL_PROCESSING != 0 { + return file + } + var csbi consoleScreenBufferInfo + handle := syscall.Handle(file.Fd()) + procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) + return &Writer{out: file, handle: handle, oldattr: csbi.attributes, oldpos: coord{0, 0}} + } + return file +} + +// NewColorableStdout returns new instance of Writer which handles escape sequence for stdout. +func NewColorableStdout() io.Writer { + return NewColorable(os.Stdout) +} + +// NewColorableStderr returns new instance of Writer which handles escape sequence for stderr. +func NewColorableStderr() io.Writer { + return NewColorable(os.Stderr) +} + +var color256 = map[int]int{ + 0: 0x000000, + 1: 0x800000, + 2: 0x008000, + 3: 0x808000, + 4: 0x000080, + 5: 0x800080, + 6: 0x008080, + 7: 0xc0c0c0, + 8: 0x808080, + 9: 0xff0000, + 10: 0x00ff00, + 11: 0xffff00, + 12: 0x0000ff, + 13: 0xff00ff, + 14: 0x00ffff, + 15: 0xffffff, + 16: 0x000000, + 17: 0x00005f, + 18: 0x000087, + 19: 0x0000af, + 20: 0x0000d7, + 21: 0x0000ff, + 22: 0x005f00, + 23: 0x005f5f, + 24: 0x005f87, + 25: 0x005faf, + 26: 0x005fd7, + 27: 0x005fff, + 28: 0x008700, + 29: 0x00875f, + 30: 0x008787, + 31: 0x0087af, + 32: 0x0087d7, + 33: 0x0087ff, + 34: 0x00af00, + 35: 0x00af5f, + 36: 0x00af87, + 37: 0x00afaf, + 38: 0x00afd7, + 39: 0x00afff, + 40: 0x00d700, + 41: 0x00d75f, + 42: 0x00d787, + 43: 0x00d7af, + 44: 0x00d7d7, + 45: 0x00d7ff, + 46: 0x00ff00, + 47: 0x00ff5f, + 48: 0x00ff87, + 49: 0x00ffaf, + 50: 0x00ffd7, + 51: 0x00ffff, + 52: 0x5f0000, + 53: 0x5f005f, + 54: 0x5f0087, + 55: 0x5f00af, + 56: 0x5f00d7, + 57: 0x5f00ff, + 58: 0x5f5f00, + 59: 0x5f5f5f, + 60: 0x5f5f87, + 61: 0x5f5faf, + 62: 0x5f5fd7, + 63: 0x5f5fff, + 64: 0x5f8700, + 65: 0x5f875f, + 66: 0x5f8787, + 67: 0x5f87af, + 68: 0x5f87d7, + 69: 0x5f87ff, + 70: 0x5faf00, + 71: 0x5faf5f, + 72: 0x5faf87, + 73: 0x5fafaf, + 74: 0x5fafd7, + 75: 0x5fafff, + 76: 0x5fd700, + 77: 0x5fd75f, + 78: 0x5fd787, + 79: 0x5fd7af, + 80: 0x5fd7d7, + 81: 0x5fd7ff, + 82: 0x5fff00, + 83: 0x5fff5f, + 84: 0x5fff87, + 85: 0x5fffaf, + 86: 0x5fffd7, + 87: 0x5fffff, + 88: 0x870000, + 89: 0x87005f, + 90: 0x870087, + 91: 0x8700af, + 92: 0x8700d7, + 93: 0x8700ff, + 94: 0x875f00, + 95: 0x875f5f, + 96: 0x875f87, + 97: 0x875faf, + 98: 0x875fd7, + 99: 0x875fff, + 100: 0x878700, + 101: 0x87875f, + 102: 0x878787, + 103: 0x8787af, + 104: 0x8787d7, + 105: 0x8787ff, + 106: 0x87af00, + 107: 0x87af5f, + 108: 0x87af87, + 109: 0x87afaf, + 110: 0x87afd7, + 111: 0x87afff, + 112: 0x87d700, + 113: 0x87d75f, + 114: 0x87d787, + 115: 0x87d7af, + 116: 0x87d7d7, + 117: 0x87d7ff, + 118: 0x87ff00, + 119: 0x87ff5f, + 120: 0x87ff87, + 121: 0x87ffaf, + 122: 0x87ffd7, + 123: 0x87ffff, + 124: 0xaf0000, + 125: 0xaf005f, + 126: 0xaf0087, + 127: 0xaf00af, + 128: 0xaf00d7, + 129: 0xaf00ff, + 130: 0xaf5f00, + 131: 0xaf5f5f, + 132: 0xaf5f87, + 133: 0xaf5faf, + 134: 0xaf5fd7, + 135: 0xaf5fff, + 136: 0xaf8700, + 137: 0xaf875f, + 138: 0xaf8787, + 139: 0xaf87af, + 140: 0xaf87d7, + 141: 0xaf87ff, + 142: 0xafaf00, + 143: 0xafaf5f, + 144: 0xafaf87, + 145: 0xafafaf, + 146: 0xafafd7, + 147: 0xafafff, + 148: 0xafd700, + 149: 0xafd75f, + 150: 0xafd787, + 151: 0xafd7af, + 152: 0xafd7d7, + 153: 0xafd7ff, + 154: 0xafff00, + 155: 0xafff5f, + 156: 0xafff87, + 157: 0xafffaf, + 158: 0xafffd7, + 159: 0xafffff, + 160: 0xd70000, + 161: 0xd7005f, + 162: 0xd70087, + 163: 0xd700af, + 164: 0xd700d7, + 165: 0xd700ff, + 166: 0xd75f00, + 167: 0xd75f5f, + 168: 0xd75f87, + 169: 0xd75faf, + 170: 0xd75fd7, + 171: 0xd75fff, + 172: 0xd78700, + 173: 0xd7875f, + 174: 0xd78787, + 175: 0xd787af, + 176: 0xd787d7, + 177: 0xd787ff, + 178: 0xd7af00, + 179: 0xd7af5f, + 180: 0xd7af87, + 181: 0xd7afaf, + 182: 0xd7afd7, + 183: 0xd7afff, + 184: 0xd7d700, + 185: 0xd7d75f, + 186: 0xd7d787, + 187: 0xd7d7af, + 188: 0xd7d7d7, + 189: 0xd7d7ff, + 190: 0xd7ff00, + 191: 0xd7ff5f, + 192: 0xd7ff87, + 193: 0xd7ffaf, + 194: 0xd7ffd7, + 195: 0xd7ffff, + 196: 0xff0000, + 197: 0xff005f, + 198: 0xff0087, + 199: 0xff00af, + 200: 0xff00d7, + 201: 0xff00ff, + 202: 0xff5f00, + 203: 0xff5f5f, + 204: 0xff5f87, + 205: 0xff5faf, + 206: 0xff5fd7, + 207: 0xff5fff, + 208: 0xff8700, + 209: 0xff875f, + 210: 0xff8787, + 211: 0xff87af, + 212: 0xff87d7, + 213: 0xff87ff, + 214: 0xffaf00, + 215: 0xffaf5f, + 216: 0xffaf87, + 217: 0xffafaf, + 218: 0xffafd7, + 219: 0xffafff, + 220: 0xffd700, + 221: 0xffd75f, + 222: 0xffd787, + 223: 0xffd7af, + 224: 0xffd7d7, + 225: 0xffd7ff, + 226: 0xffff00, + 227: 0xffff5f, + 228: 0xffff87, + 229: 0xffffaf, + 230: 0xffffd7, + 231: 0xffffff, + 232: 0x080808, + 233: 0x121212, + 234: 0x1c1c1c, + 235: 0x262626, + 236: 0x303030, + 237: 0x3a3a3a, + 238: 0x444444, + 239: 0x4e4e4e, + 240: 0x585858, + 241: 0x626262, + 242: 0x6c6c6c, + 243: 0x767676, + 244: 0x808080, + 245: 0x8a8a8a, + 246: 0x949494, + 247: 0x9e9e9e, + 248: 0xa8a8a8, + 249: 0xb2b2b2, + 250: 0xbcbcbc, + 251: 0xc6c6c6, + 252: 0xd0d0d0, + 253: 0xdadada, + 254: 0xe4e4e4, + 255: 0xeeeeee, +} + +// `\033]0;TITLESTR\007` +func doTitleSequence(er *bytes.Reader) error { + var c byte + var err error + + c, err = er.ReadByte() + if err != nil { + return err + } + if c != '0' && c != '2' { + return nil + } + c, err = er.ReadByte() + if err != nil { + return err + } + if c != ';' { + return nil + } + title := make([]byte, 0, 80) + for { + c, err = er.ReadByte() + if err != nil { + return err + } + if c == 0x07 || c == '\n' { + break + } + title = append(title, c) + } + if len(title) > 0 { + title8, err := syscall.UTF16PtrFromString(string(title)) + if err == nil { + procSetConsoleTitle.Call(uintptr(unsafe.Pointer(title8))) + } + } + return nil +} + +// returns Atoi(s) unless s == "" in which case it returns def +func atoiWithDefault(s string, def int) (int, error) { + if s == "" { + return def, nil + } + return strconv.Atoi(s) +} + +// Write writes data on console +func (w *Writer) Write(data []byte) (n int, err error) { + w.mutex.Lock() + defer w.mutex.Unlock() + var csbi consoleScreenBufferInfo + procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + + handle := w.handle + + var er *bytes.Reader + if w.rest.Len() > 0 { + var rest bytes.Buffer + w.rest.WriteTo(&rest) + w.rest.Reset() + rest.Write(data) + er = bytes.NewReader(rest.Bytes()) + } else { + er = bytes.NewReader(data) + } + var plaintext bytes.Buffer +loop: + for { + c1, err := er.ReadByte() + if err != nil { + plaintext.WriteTo(w.out) + break loop + } + if c1 != 0x1b { + plaintext.WriteByte(c1) + continue + } + _, err = plaintext.WriteTo(w.out) + if err != nil { + break loop + } + c2, err := er.ReadByte() + if err != nil { + break loop + } + + switch c2 { + case '>': + continue + case ']': + w.rest.WriteByte(c1) + w.rest.WriteByte(c2) + er.WriteTo(&w.rest) + if bytes.IndexByte(w.rest.Bytes(), 0x07) == -1 { + break loop + } + er = bytes.NewReader(w.rest.Bytes()[2:]) + err := doTitleSequence(er) + if err != nil { + break loop + } + w.rest.Reset() + continue + // https://github.com/mattn/go-colorable/issues/27 + case '7': + procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) + w.oldpos = csbi.cursorPosition + continue + case '8': + procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&w.oldpos))) + continue + case 0x5b: + // execute part after switch + default: + continue + } + + w.rest.WriteByte(c1) + w.rest.WriteByte(c2) + er.WriteTo(&w.rest) + + var buf bytes.Buffer + var m byte + for i, c := range w.rest.Bytes()[2:] { + if ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || c == '@' { + m = c + er = bytes.NewReader(w.rest.Bytes()[2+i+1:]) + w.rest.Reset() + break + } + buf.Write([]byte(string(c))) + } + if m == 0 { + break loop + } + + switch m { + case 'A': + n, err = atoiWithDefault(buf.String(), 1) + if err != nil { + continue + } + procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) + csbi.cursorPosition.y -= short(n) + procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) + case 'B': + n, err = atoiWithDefault(buf.String(), 1) + if err != nil { + continue + } + procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) + csbi.cursorPosition.y += short(n) + procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) + case 'C': + n, err = atoiWithDefault(buf.String(), 1) + if err != nil { + continue + } + procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) + csbi.cursorPosition.x += short(n) + procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) + case 'D': + n, err = atoiWithDefault(buf.String(), 1) + if err != nil { + continue + } + procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) + csbi.cursorPosition.x -= short(n) + if csbi.cursorPosition.x < 0 { + csbi.cursorPosition.x = 0 + } + procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) + case 'E': + n, err = strconv.Atoi(buf.String()) + if err != nil { + continue + } + procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) + csbi.cursorPosition.x = 0 + csbi.cursorPosition.y += short(n) + procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) + case 'F': + n, err = strconv.Atoi(buf.String()) + if err != nil { + continue + } + procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) + csbi.cursorPosition.x = 0 + csbi.cursorPosition.y -= short(n) + procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) + case 'G': + n, err = strconv.Atoi(buf.String()) + if err != nil { + continue + } + if n < 1 { + n = 1 + } + procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) + csbi.cursorPosition.x = short(n - 1) + procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) + case 'H', 'f': + procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) + if buf.Len() > 0 { + token := strings.Split(buf.String(), ";") + switch len(token) { + case 1: + n1, err := strconv.Atoi(token[0]) + if err != nil { + continue + } + csbi.cursorPosition.y = short(n1 - 1) + case 2: + n1, err := strconv.Atoi(token[0]) + if err != nil { + continue + } + n2, err := strconv.Atoi(token[1]) + if err != nil { + continue + } + csbi.cursorPosition.x = short(n2 - 1) + csbi.cursorPosition.y = short(n1 - 1) + } + } else { + csbi.cursorPosition.y = 0 + } + procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) + case 'J': + n := 0 + if buf.Len() > 0 { + n, err = strconv.Atoi(buf.String()) + if err != nil { + continue + } + } + var count, written dword + var cursor coord + procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) + switch n { + case 0: + cursor = coord{x: csbi.cursorPosition.x, y: csbi.cursorPosition.y} + count = dword(csbi.size.x) - dword(csbi.cursorPosition.x) + dword(csbi.size.y-csbi.cursorPosition.y)*dword(csbi.size.x) + case 1: + cursor = coord{x: csbi.window.left, y: csbi.window.top} + count = dword(csbi.size.x) - dword(csbi.cursorPosition.x) + dword(csbi.window.top-csbi.cursorPosition.y)*dword(csbi.size.x) + case 2: + cursor = coord{x: csbi.window.left, y: csbi.window.top} + count = dword(csbi.size.x) - dword(csbi.cursorPosition.x) + dword(csbi.size.y-csbi.cursorPosition.y)*dword(csbi.size.x) + } + procFillConsoleOutputCharacter.Call(uintptr(handle), uintptr(' '), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) + procFillConsoleOutputAttribute.Call(uintptr(handle), uintptr(csbi.attributes), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) + case 'K': + n := 0 + if buf.Len() > 0 { + n, err = strconv.Atoi(buf.String()) + if err != nil { + continue + } + } + procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) + var cursor coord + var count, written dword + switch n { + case 0: + cursor = coord{x: csbi.cursorPosition.x, y: csbi.cursorPosition.y} + count = dword(csbi.size.x - csbi.cursorPosition.x) + case 1: + cursor = coord{x: csbi.window.left, y: csbi.cursorPosition.y} + count = dword(csbi.size.x - csbi.cursorPosition.x) + case 2: + cursor = coord{x: csbi.window.left, y: csbi.cursorPosition.y} + count = dword(csbi.size.x) + } + procFillConsoleOutputCharacter.Call(uintptr(handle), uintptr(' '), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) + procFillConsoleOutputAttribute.Call(uintptr(handle), uintptr(csbi.attributes), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) + case 'X': + n := 0 + if buf.Len() > 0 { + n, err = strconv.Atoi(buf.String()) + if err != nil { + continue + } + } + procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) + var cursor coord + var written dword + cursor = coord{x: csbi.cursorPosition.x, y: csbi.cursorPosition.y} + procFillConsoleOutputCharacter.Call(uintptr(handle), uintptr(' '), uintptr(n), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) + procFillConsoleOutputAttribute.Call(uintptr(handle), uintptr(csbi.attributes), uintptr(n), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) + case 'm': + procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) + attr := csbi.attributes + cs := buf.String() + if cs == "" { + procSetConsoleTextAttribute.Call(uintptr(handle), uintptr(w.oldattr)) + continue + } + token := strings.Split(cs, ";") + for i := 0; i < len(token); i++ { + ns := token[i] + if n, err = strconv.Atoi(ns); err == nil { + switch { + case n == 0 || n == 100: + attr = w.oldattr + case n == 4: + attr |= commonLvbUnderscore + case (1 <= n && n <= 3) || n == 5: + attr |= foregroundIntensity + case n == 7 || n == 27: + attr = + (attr &^ (foregroundMask | backgroundMask)) | + ((attr & foregroundMask) << 4) | + ((attr & backgroundMask) >> 4) + case n == 22: + attr &^= foregroundIntensity + case n == 24: + attr &^= commonLvbUnderscore + case 30 <= n && n <= 37: + attr &= backgroundMask + if (n-30)&1 != 0 { + attr |= foregroundRed + } + if (n-30)&2 != 0 { + attr |= foregroundGreen + } + if (n-30)&4 != 0 { + attr |= foregroundBlue + } + case n == 38: // set foreground color. + if i < len(token)-2 && (token[i+1] == "5" || token[i+1] == "05") { + if n256, err := strconv.Atoi(token[i+2]); err == nil { + if n256foreAttr == nil { + n256setup() + } + attr &= backgroundMask + attr |= n256foreAttr[n256%len(n256foreAttr)] + i += 2 + } + } else if len(token) == 5 && token[i+1] == "2" { + var r, g, b int + r, _ = strconv.Atoi(token[i+2]) + g, _ = strconv.Atoi(token[i+3]) + b, _ = strconv.Atoi(token[i+4]) + i += 4 + if r > 127 { + attr |= foregroundRed + } + if g > 127 { + attr |= foregroundGreen + } + if b > 127 { + attr |= foregroundBlue + } + } else { + attr = attr & (w.oldattr & backgroundMask) + } + case n == 39: // reset foreground color. + attr &= backgroundMask + attr |= w.oldattr & foregroundMask + case 40 <= n && n <= 47: + attr &= foregroundMask + if (n-40)&1 != 0 { + attr |= backgroundRed + } + if (n-40)&2 != 0 { + attr |= backgroundGreen + } + if (n-40)&4 != 0 { + attr |= backgroundBlue + } + case n == 48: // set background color. + if i < len(token)-2 && token[i+1] == "5" { + if n256, err := strconv.Atoi(token[i+2]); err == nil { + if n256backAttr == nil { + n256setup() + } + attr &= foregroundMask + attr |= n256backAttr[n256%len(n256backAttr)] + i += 2 + } + } else if len(token) == 5 && token[i+1] == "2" { + var r, g, b int + r, _ = strconv.Atoi(token[i+2]) + g, _ = strconv.Atoi(token[i+3]) + b, _ = strconv.Atoi(token[i+4]) + i += 4 + if r > 127 { + attr |= backgroundRed + } + if g > 127 { + attr |= backgroundGreen + } + if b > 127 { + attr |= backgroundBlue + } + } else { + attr = attr & (w.oldattr & foregroundMask) + } + case n == 49: // reset foreground color. + attr &= foregroundMask + attr |= w.oldattr & backgroundMask + case 90 <= n && n <= 97: + attr = (attr & backgroundMask) + attr |= foregroundIntensity + if (n-90)&1 != 0 { + attr |= foregroundRed + } + if (n-90)&2 != 0 { + attr |= foregroundGreen + } + if (n-90)&4 != 0 { + attr |= foregroundBlue + } + case 100 <= n && n <= 107: + attr = (attr & foregroundMask) + attr |= backgroundIntensity + if (n-100)&1 != 0 { + attr |= backgroundRed + } + if (n-100)&2 != 0 { + attr |= backgroundGreen + } + if (n-100)&4 != 0 { + attr |= backgroundBlue + } + } + procSetConsoleTextAttribute.Call(uintptr(handle), uintptr(attr)) + } + } + case 'h': + var ci consoleCursorInfo + cs := buf.String() + if cs == "5>" { + procGetConsoleCursorInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&ci))) + ci.visible = 0 + procSetConsoleCursorInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&ci))) + } else if cs == "?25" { + procGetConsoleCursorInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&ci))) + ci.visible = 1 + procSetConsoleCursorInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&ci))) + } else if cs == "?1049" { + if w.althandle == 0 { + h, _, _ := procCreateConsoleScreenBuffer.Call(uintptr(genericRead|genericWrite), 0, 0, uintptr(consoleTextmodeBuffer), 0, 0) + w.althandle = syscall.Handle(h) + if w.althandle != 0 { + handle = w.althandle + } + } + } + case 'l': + var ci consoleCursorInfo + cs := buf.String() + if cs == "5>" { + procGetConsoleCursorInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&ci))) + ci.visible = 1 + procSetConsoleCursorInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&ci))) + } else if cs == "?25" { + procGetConsoleCursorInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&ci))) + ci.visible = 0 + procSetConsoleCursorInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&ci))) + } else if cs == "?1049" { + if w.althandle != 0 { + syscall.CloseHandle(w.althandle) + w.althandle = 0 + handle = w.handle + } + } + case 's': + procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) + w.oldpos = csbi.cursorPosition + case 'u': + procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&w.oldpos))) + } + } + + return len(data), nil +} + +type consoleColor struct { + rgb int + red bool + green bool + blue bool + intensity bool +} + +func (c consoleColor) foregroundAttr() (attr word) { + if c.red { + attr |= foregroundRed + } + if c.green { + attr |= foregroundGreen + } + if c.blue { + attr |= foregroundBlue + } + if c.intensity { + attr |= foregroundIntensity + } + return +} + +func (c consoleColor) backgroundAttr() (attr word) { + if c.red { + attr |= backgroundRed + } + if c.green { + attr |= backgroundGreen + } + if c.blue { + attr |= backgroundBlue + } + if c.intensity { + attr |= backgroundIntensity + } + return +} + +var color16 = []consoleColor{ + {0x000000, false, false, false, false}, + {0x000080, false, false, true, false}, + {0x008000, false, true, false, false}, + {0x008080, false, true, true, false}, + {0x800000, true, false, false, false}, + {0x800080, true, false, true, false}, + {0x808000, true, true, false, false}, + {0xc0c0c0, true, true, true, false}, + {0x808080, false, false, false, true}, + {0x0000ff, false, false, true, true}, + {0x00ff00, false, true, false, true}, + {0x00ffff, false, true, true, true}, + {0xff0000, true, false, false, true}, + {0xff00ff, true, false, true, true}, + {0xffff00, true, true, false, true}, + {0xffffff, true, true, true, true}, +} + +type hsv struct { + h, s, v float32 +} + +func (a hsv) dist(b hsv) float32 { + dh := a.h - b.h + switch { + case dh > 0.5: + dh = 1 - dh + case dh < -0.5: + dh = -1 - dh + } + ds := a.s - b.s + dv := a.v - b.v + return float32(math.Sqrt(float64(dh*dh + ds*ds + dv*dv))) +} + +func toHSV(rgb int) hsv { + r, g, b := float32((rgb&0xFF0000)>>16)/256.0, + float32((rgb&0x00FF00)>>8)/256.0, + float32(rgb&0x0000FF)/256.0 + min, max := minmax3f(r, g, b) + h := max - min + if h > 0 { + if max == r { + h = (g - b) / h + if h < 0 { + h += 6 + } + } else if max == g { + h = 2 + (b-r)/h + } else { + h = 4 + (r-g)/h + } + } + h /= 6.0 + s := max - min + if max != 0 { + s /= max + } + v := max + return hsv{h: h, s: s, v: v} +} + +type hsvTable []hsv + +func toHSVTable(rgbTable []consoleColor) hsvTable { + t := make(hsvTable, len(rgbTable)) + for i, c := range rgbTable { + t[i] = toHSV(c.rgb) + } + return t +} + +func (t hsvTable) find(rgb int) consoleColor { + hsv := toHSV(rgb) + n := 7 + l := float32(5.0) + for i, p := range t { + d := hsv.dist(p) + if d < l { + l, n = d, i + } + } + return color16[n] +} + +func minmax3f(a, b, c float32) (min, max float32) { + if a < b { + if b < c { + return a, c + } else if a < c { + return a, b + } else { + return c, b + } + } else { + if a < c { + return b, c + } else if b < c { + return b, a + } else { + return c, a + } + } +} + +var n256foreAttr []word +var n256backAttr []word + +func n256setup() { + n256foreAttr = make([]word, 256) + n256backAttr = make([]word, 256) + t := toHSVTable(color16) + for i, rgb := range color256 { + c := t.find(rgb) + n256foreAttr[i] = c.foregroundAttr() + n256backAttr[i] = c.backgroundAttr() + } +} + +// EnableColorsStdout enable colors if possible. +func EnableColorsStdout(enabled *bool) func() { + var mode uint32 + h := os.Stdout.Fd() + if r, _, _ := procGetConsoleMode.Call(h, uintptr(unsafe.Pointer(&mode))); r != 0 { + if r, _, _ = procSetConsoleMode.Call(h, uintptr(mode|cENABLE_VIRTUAL_TERMINAL_PROCESSING)); r != 0 { + if enabled != nil { + *enabled = true + } + return func() { + procSetConsoleMode.Call(h, uintptr(mode)) + } + } + } + if enabled != nil { + *enabled = true + } + return func() {} +} diff --git a/vendor/github.com/mattn/go-colorable/go.test.sh b/vendor/github.com/mattn/go-colorable/go.test.sh new file mode 100644 index 0000000..012162b --- /dev/null +++ b/vendor/github.com/mattn/go-colorable/go.test.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +set -e +echo "" > coverage.txt + +for d in $(go list ./... | grep -v vendor); do + go test -race -coverprofile=profile.out -covermode=atomic "$d" + if [ -f profile.out ]; then + cat profile.out >> coverage.txt + rm profile.out + fi +done diff --git a/vendor/github.com/mattn/go-colorable/noncolorable.go b/vendor/github.com/mattn/go-colorable/noncolorable.go new file mode 100644 index 0000000..05d6f74 --- /dev/null +++ b/vendor/github.com/mattn/go-colorable/noncolorable.go @@ -0,0 +1,57 @@ +package colorable + +import ( + "bytes" + "io" +) + +// NonColorable holds writer but removes escape sequence. +type NonColorable struct { + out io.Writer +} + +// NewNonColorable returns new instance of Writer which removes escape sequence from Writer. +func NewNonColorable(w io.Writer) io.Writer { + return &NonColorable{out: w} +} + +// Write writes data on console +func (w *NonColorable) Write(data []byte) (n int, err error) { + er := bytes.NewReader(data) + var plaintext bytes.Buffer +loop: + for { + c1, err := er.ReadByte() + if err != nil { + plaintext.WriteTo(w.out) + break loop + } + if c1 != 0x1b { + plaintext.WriteByte(c1) + continue + } + _, err = plaintext.WriteTo(w.out) + if err != nil { + break loop + } + c2, err := er.ReadByte() + if err != nil { + break loop + } + if c2 != 0x5b { + continue + } + + for { + c, err := er.ReadByte() + if err != nil { + break loop + } + if ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || c == '@' { + break + } + } + } + + return len(data), nil +} diff --git a/vendor/github.com/mattn/go-isatty/LICENSE b/vendor/github.com/mattn/go-isatty/LICENSE new file mode 100644 index 0000000..65dc692 --- /dev/null +++ b/vendor/github.com/mattn/go-isatty/LICENSE @@ -0,0 +1,9 @@ +Copyright (c) Yasuhiro MATSUMOTO + +MIT License (Expat) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/mattn/go-isatty/README.md b/vendor/github.com/mattn/go-isatty/README.md new file mode 100644 index 0000000..3841835 --- /dev/null +++ b/vendor/github.com/mattn/go-isatty/README.md @@ -0,0 +1,50 @@ +# go-isatty + +[![Godoc Reference](https://godoc.org/github.com/mattn/go-isatty?status.svg)](http://godoc.org/github.com/mattn/go-isatty) +[![Codecov](https://codecov.io/gh/mattn/go-isatty/branch/master/graph/badge.svg)](https://codecov.io/gh/mattn/go-isatty) +[![Coverage Status](https://coveralls.io/repos/github/mattn/go-isatty/badge.svg?branch=master)](https://coveralls.io/github/mattn/go-isatty?branch=master) +[![Go Report Card](https://goreportcard.com/badge/mattn/go-isatty)](https://goreportcard.com/report/mattn/go-isatty) + +isatty for golang + +## Usage + +```go +package main + +import ( + "fmt" + "github.com/mattn/go-isatty" + "os" +) + +func main() { + if isatty.IsTerminal(os.Stdout.Fd()) { + fmt.Println("Is Terminal") + } else if isatty.IsCygwinTerminal(os.Stdout.Fd()) { + fmt.Println("Is Cygwin/MSYS2 Terminal") + } else { + fmt.Println("Is Not Terminal") + } +} +``` + +## Installation + +``` +$ go get github.com/mattn/go-isatty +``` + +## License + +MIT + +## Author + +Yasuhiro Matsumoto (a.k.a mattn) + +## Thanks + +* k-takata: base idea for IsCygwinTerminal + + https://github.com/k-takata/go-iscygpty diff --git a/vendor/github.com/mattn/go-isatty/doc.go b/vendor/github.com/mattn/go-isatty/doc.go new file mode 100644 index 0000000..17d4f90 --- /dev/null +++ b/vendor/github.com/mattn/go-isatty/doc.go @@ -0,0 +1,2 @@ +// Package isatty implements interface to isatty +package isatty diff --git a/vendor/github.com/mattn/go-isatty/go.test.sh b/vendor/github.com/mattn/go-isatty/go.test.sh new file mode 100644 index 0000000..012162b --- /dev/null +++ b/vendor/github.com/mattn/go-isatty/go.test.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +set -e +echo "" > coverage.txt + +for d in $(go list ./... | grep -v vendor); do + go test -race -coverprofile=profile.out -covermode=atomic "$d" + if [ -f profile.out ]; then + cat profile.out >> coverage.txt + rm profile.out + fi +done diff --git a/vendor/github.com/mattn/go-isatty/isatty_bsd.go b/vendor/github.com/mattn/go-isatty/isatty_bsd.go new file mode 100644 index 0000000..d569c0c --- /dev/null +++ b/vendor/github.com/mattn/go-isatty/isatty_bsd.go @@ -0,0 +1,19 @@ +//go:build (darwin || freebsd || openbsd || netbsd || dragonfly || hurd) && !appengine +// +build darwin freebsd openbsd netbsd dragonfly hurd +// +build !appengine + +package isatty + +import "golang.org/x/sys/unix" + +// IsTerminal return true if the file descriptor is terminal. +func IsTerminal(fd uintptr) bool { + _, err := unix.IoctlGetTermios(int(fd), unix.TIOCGETA) + return err == nil +} + +// IsCygwinTerminal return true if the file descriptor is a cygwin or msys2 +// terminal. This is also always false on this environment. +func IsCygwinTerminal(fd uintptr) bool { + return false +} diff --git a/vendor/github.com/mattn/go-isatty/isatty_others.go b/vendor/github.com/mattn/go-isatty/isatty_others.go new file mode 100644 index 0000000..3150322 --- /dev/null +++ b/vendor/github.com/mattn/go-isatty/isatty_others.go @@ -0,0 +1,16 @@ +//go:build appengine || js || nacl || wasm +// +build appengine js nacl wasm + +package isatty + +// IsTerminal returns true if the file descriptor is terminal which +// is always false on js and appengine classic which is a sandboxed PaaS. +func IsTerminal(fd uintptr) bool { + return false +} + +// IsCygwinTerminal() return true if the file descriptor is a cygwin or msys2 +// terminal. This is also always false on this environment. +func IsCygwinTerminal(fd uintptr) bool { + return false +} diff --git a/vendor/github.com/mattn/go-isatty/isatty_plan9.go b/vendor/github.com/mattn/go-isatty/isatty_plan9.go new file mode 100644 index 0000000..bae7f9b --- /dev/null +++ b/vendor/github.com/mattn/go-isatty/isatty_plan9.go @@ -0,0 +1,23 @@ +//go:build plan9 +// +build plan9 + +package isatty + +import ( + "syscall" +) + +// IsTerminal returns true if the given file descriptor is a terminal. +func IsTerminal(fd uintptr) bool { + path, err := syscall.Fd2path(int(fd)) + if err != nil { + return false + } + return path == "/dev/cons" || path == "/mnt/term/dev/cons" +} + +// IsCygwinTerminal return true if the file descriptor is a cygwin or msys2 +// terminal. This is also always false on this environment. +func IsCygwinTerminal(fd uintptr) bool { + return false +} diff --git a/vendor/github.com/mattn/go-isatty/isatty_solaris.go b/vendor/github.com/mattn/go-isatty/isatty_solaris.go new file mode 100644 index 0000000..0c3acf2 --- /dev/null +++ b/vendor/github.com/mattn/go-isatty/isatty_solaris.go @@ -0,0 +1,21 @@ +//go:build solaris && !appengine +// +build solaris,!appengine + +package isatty + +import ( + "golang.org/x/sys/unix" +) + +// IsTerminal returns true if the given file descriptor is a terminal. +// see: https://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libc/port/gen/isatty.c +func IsTerminal(fd uintptr) bool { + _, err := unix.IoctlGetTermio(int(fd), unix.TCGETA) + return err == nil +} + +// IsCygwinTerminal return true if the file descriptor is a cygwin or msys2 +// terminal. This is also always false on this environment. +func IsCygwinTerminal(fd uintptr) bool { + return false +} diff --git a/vendor/github.com/mattn/go-isatty/isatty_tcgets.go b/vendor/github.com/mattn/go-isatty/isatty_tcgets.go new file mode 100644 index 0000000..6778765 --- /dev/null +++ b/vendor/github.com/mattn/go-isatty/isatty_tcgets.go @@ -0,0 +1,19 @@ +//go:build (linux || aix || zos) && !appengine +// +build linux aix zos +// +build !appengine + +package isatty + +import "golang.org/x/sys/unix" + +// IsTerminal return true if the file descriptor is terminal. +func IsTerminal(fd uintptr) bool { + _, err := unix.IoctlGetTermios(int(fd), unix.TCGETS) + return err == nil +} + +// IsCygwinTerminal return true if the file descriptor is a cygwin or msys2 +// terminal. This is also always false on this environment. +func IsCygwinTerminal(fd uintptr) bool { + return false +} diff --git a/vendor/github.com/mattn/go-isatty/isatty_windows.go b/vendor/github.com/mattn/go-isatty/isatty_windows.go new file mode 100644 index 0000000..8e3c991 --- /dev/null +++ b/vendor/github.com/mattn/go-isatty/isatty_windows.go @@ -0,0 +1,125 @@ +//go:build windows && !appengine +// +build windows,!appengine + +package isatty + +import ( + "errors" + "strings" + "syscall" + "unicode/utf16" + "unsafe" +) + +const ( + objectNameInfo uintptr = 1 + fileNameInfo = 2 + fileTypePipe = 3 +) + +var ( + kernel32 = syscall.NewLazyDLL("kernel32.dll") + ntdll = syscall.NewLazyDLL("ntdll.dll") + procGetConsoleMode = kernel32.NewProc("GetConsoleMode") + procGetFileInformationByHandleEx = kernel32.NewProc("GetFileInformationByHandleEx") + procGetFileType = kernel32.NewProc("GetFileType") + procNtQueryObject = ntdll.NewProc("NtQueryObject") +) + +func init() { + // Check if GetFileInformationByHandleEx is available. + if procGetFileInformationByHandleEx.Find() != nil { + procGetFileInformationByHandleEx = nil + } +} + +// IsTerminal return true if the file descriptor is terminal. +func IsTerminal(fd uintptr) bool { + var st uint32 + r, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, fd, uintptr(unsafe.Pointer(&st)), 0) + return r != 0 && e == 0 +} + +// Check pipe name is used for cygwin/msys2 pty. +// Cygwin/MSYS2 PTY has a name like: +// \{cygwin,msys}-XXXXXXXXXXXXXXXX-ptyN-{from,to}-master +func isCygwinPipeName(name string) bool { + token := strings.Split(name, "-") + if len(token) < 5 { + return false + } + + if token[0] != `\msys` && + token[0] != `\cygwin` && + token[0] != `\Device\NamedPipe\msys` && + token[0] != `\Device\NamedPipe\cygwin` { + return false + } + + if token[1] == "" { + return false + } + + if !strings.HasPrefix(token[2], "pty") { + return false + } + + if token[3] != `from` && token[3] != `to` { + return false + } + + if token[4] != "master" { + return false + } + + return true +} + +// getFileNameByHandle use the undocomented ntdll NtQueryObject to get file full name from file handler +// since GetFileInformationByHandleEx is not available under windows Vista and still some old fashion +// guys are using Windows XP, this is a workaround for those guys, it will also work on system from +// Windows vista to 10 +// see https://stackoverflow.com/a/18792477 for details +func getFileNameByHandle(fd uintptr) (string, error) { + if procNtQueryObject == nil { + return "", errors.New("ntdll.dll: NtQueryObject not supported") + } + + var buf [4 + syscall.MAX_PATH]uint16 + var result int + r, _, e := syscall.Syscall6(procNtQueryObject.Addr(), 5, + fd, objectNameInfo, uintptr(unsafe.Pointer(&buf)), uintptr(2*len(buf)), uintptr(unsafe.Pointer(&result)), 0) + if r != 0 { + return "", e + } + return string(utf16.Decode(buf[4 : 4+buf[0]/2])), nil +} + +// IsCygwinTerminal() return true if the file descriptor is a cygwin or msys2 +// terminal. +func IsCygwinTerminal(fd uintptr) bool { + if procGetFileInformationByHandleEx == nil { + name, err := getFileNameByHandle(fd) + if err != nil { + return false + } + return isCygwinPipeName(name) + } + + // Cygwin/msys's pty is a pipe. + ft, _, e := syscall.Syscall(procGetFileType.Addr(), 1, fd, 0, 0) + if ft != fileTypePipe || e != 0 { + return false + } + + var buf [2 + syscall.MAX_PATH]uint16 + r, _, e := syscall.Syscall6(procGetFileInformationByHandleEx.Addr(), + 4, fd, fileNameInfo, uintptr(unsafe.Pointer(&buf)), + uintptr(len(buf)*2), 0, 0) + if r == 0 || e != 0 { + return false + } + + l := *(*uint32)(unsafe.Pointer(&buf)) + return isCygwinPipeName(string(utf16.Decode(buf[2 : 2+l/2]))) +} diff --git a/vendor/github.com/rs/zerolog/README.md b/vendor/github.com/rs/zerolog/README.md index 536e3e4..1306a6c 100644 --- a/vendor/github.com/rs/zerolog/README.md +++ b/vendor/github.com/rs/zerolog/README.md @@ -1,6 +1,6 @@ # Zero Allocation JSON Logger -[![godoc](http://img.shields.io/badge/godoc-reference-blue.svg?style=flat)](https://godoc.org/github.com/rs/zerolog) [![license](http://img.shields.io/badge/license-MIT-red.svg?style=flat)](https://raw.githubusercontent.com/rs/zerolog/master/LICENSE) [![Build Status](https://travis-ci.org/rs/zerolog.svg?branch=master)](https://travis-ci.org/rs/zerolog) [![Coverage](http://gocover.io/_badge/github.com/rs/zerolog)](http://gocover.io/github.com/rs/zerolog) +[![godoc](http://img.shields.io/badge/godoc-reference-blue.svg?style=flat)](https://godoc.org/github.com/rs/zerolog) [![license](http://img.shields.io/badge/license-MIT-red.svg?style=flat)](https://raw.githubusercontent.com/rs/zerolog/master/LICENSE) [![Build Status](https://github.com/rs/zerolog/actions/workflows/test.yml/badge.svg)](https://github.com/rs/zerolog/actions/workflows/test.yml) [![Go Coverage](https://github.com/rs/zerolog/wiki/coverage.svg)](https://raw.githack.com/wiki/rs/zerolog/coverage.html) The zerolog package provides a fast and simple logger dedicated to JSON output. @@ -24,7 +24,7 @@ Find out [who uses zerolog](https://github.com/rs/zerolog/wiki/Who-uses-zerolog) * [Sampling](#log-sampling) * [Hooks](#hooks) * [Contextual fields](#contextual-logging) -* `context.Context` integration +* [`context.Context` integration](#contextcontext-integration) * [Integration with `net/http`](#integration-with-nethttp) * [JSON and CBOR encoding formats](#binary-encoding) * [Pretty logging for development](#pretty-logging) @@ -60,7 +60,7 @@ func main() { // Output: {"time":1516134303,"level":"debug","message":"hello world"} ``` > Note: By default log writes to `os.Stderr` -> Note: The default log level for `log.Print` is *debug* +> Note: The default log level for `log.Print` is *trace* ### Contextual Logging @@ -399,6 +399,8 @@ log.Logger = log.With().Str("foo", "bar").Logger() ### Add file and line number to log +Equivalent of `Llongfile`: + ```go log.Logger = log.With().Caller().Logger() log.Info().Msg("hello world") @@ -406,10 +408,21 @@ log.Info().Msg("hello world") // Output: {"level": "info", "message": "hello world", "caller": "/go/src/your_project/some_file:21"} ``` +Equivalent of `Lshortfile`: + +```go +zerolog.CallerMarshalFunc = func(pc uintptr, file string, line int) string { + return filepath.Base(file) + ":" + strconv.Itoa(line) +} +log.Logger = log.With().Caller().Logger() +log.Info().Msg("hello world") + +// Output: {"level": "info", "message": "hello world", "caller": "some_file:21"} +``` ### Thread-safe, lock-free, non-blocking writer -If your writer might be slow or not thread-safe and you need your log producers to never get slowed down by a slow writer, you can use a `diode.Writer` as follow: +If your writer might be slow or not thread-safe and you need your log producers to never get slowed down by a slow writer, you can use a `diode.Writer` as follows: ```go wr := diode.NewWriter(os.Stdout, 1000, 10*time.Millisecond, func(missed int) { @@ -490,6 +503,58 @@ stdlog.Print("hello world") // Output: {"foo":"bar","message":"hello world"} ``` +### context.Context integration + +Go contexts are commonly passed throughout Go code, and this can help you pass +your Logger into places it might otherwise be hard to inject. The `Logger` +instance may be attached to Go context (`context.Context`) using +`Logger.WithContext(ctx)` and extracted from it using `zerolog.Ctx(ctx)`. +For example: + +```go +func f() { + logger := zerolog.New(os.Stdout) + ctx := context.Background() + + // Attach the Logger to the context.Context + ctx = logger.WithContext(ctx) + someFunc(ctx) +} + +func someFunc(ctx context.Context) { + // Get Logger from the go Context. if it's nil, then + // `zerolog.DefaultContextLogger` is returned, if + // `DefaultContextLogger` is nil, then a disabled logger is returned. + logger := zerolog.Ctx(ctx) + logger.Info().Msg("Hello") +} +``` + +A second form of `context.Context` integration allows you to pass the current +context.Context into the logged event, and retrieve it from hooks. This can be +useful to log trace and span IDs or other information stored in the go context, +and facilitates the unification of logging and tracing in some systems: + +```go +type TracingHook struct{} + +func (h TracingHook) Run(e *zerolog.Event, level zerolog.Level, msg string) { + ctx := e.GetCtx() + spanId := getSpanIdFromContext(ctx) // as per your tracing framework + e.Str("span-id", spanId) +} + +func f() { + // Setup the logger + logger := zerolog.New(os.Stdout) + logger = logger.Hook(TracingHook{}) + + ctx := context.Background() + // Use the Ctx function to make the context available to the hook + logger.Info().Ctx(ctx).Msg("Hello") +} +``` + ### Integration with `net/http` The `github.com/rs/zerolog/hlog` package provides some helpers to integrate zerolog with `http.Handler`. @@ -560,11 +625,11 @@ func main() { // Output (Line 1: Console; Line 2: Stdout) // 12:36PM INF Hello World! // {"level":"info","time":"2019-11-07T12:36:38+03:00","message":"Hello World!"} -``` +``` ## Global Settings -Some settings can be changed and will by applied to all loggers: +Some settings can be changed and will be applied to all loggers: * `log.Logger`: You can set this value to customize the global logger (the one used by package level methods). * `zerolog.SetGlobalLevel`: Can raise the minimum level of all loggers. Call this with `zerolog.Disabled` to disable logging altogether (quiet mode). @@ -573,10 +638,14 @@ Some settings can be changed and will by applied to all loggers: * `zerolog.LevelFieldName`: Can be set to customize level field name. * `zerolog.MessageFieldName`: Can be set to customize message field name. * `zerolog.ErrorFieldName`: Can be set to customize `Err` field name. -* `zerolog.TimeFieldFormat`: Can be set to customize `Time` field value formatting. If set with `zerolog.TimeFormatUnix`, `zerolog.TimeFormatUnixMs` or `zerolog.TimeFormatUnixMicro`, times are formated as UNIX timestamp. +* `zerolog.TimeFieldFormat`: Can be set to customize `Time` field value formatting. If set with `zerolog.TimeFormatUnix`, `zerolog.TimeFormatUnixMs` or `zerolog.TimeFormatUnixMicro`, times are formatted as UNIX timestamp. * `zerolog.DurationFieldUnit`: Can be set to customize the unit for time.Duration type fields added by `Dur` (default: `time.Millisecond`). * `zerolog.DurationFieldInteger`: If set to `true`, `Dur` fields are formatted as integers instead of floats (default: `false`). * `zerolog.ErrorHandler`: Called whenever zerolog fails to write an event on its output. If not set, an error is printed on the stderr. This handler must be thread safe and non-blocking. +* `zerolog.FloatingPointPrecision`: If set to a value other than -1, controls the number +of digits when formatting float numbers in JSON. See +[strconv.FormatFloat](https://pkg.go.dev/strconv#FormatFloat) +for more details. ## Field Types @@ -604,7 +673,7 @@ Most fields are also available in the slice format (`Strs` for `[]string`, `Errs ## Binary Encoding -In addition to the default JSON encoding, `zerolog` can produce binary logs using [CBOR](http://cbor.io) encoding. The choice of encoding can be decided at compile time using the build tag `binary_log` as follows: +In addition to the default JSON encoding, `zerolog` can produce binary logs using [CBOR](https://cbor.io) encoding. The choice of encoding can be decided at compile time using the build tag `binary_log` as follows: ```bash go build -tags binary_log . @@ -617,11 +686,11 @@ with zerolog library is [CSD](https://github.com/toravir/csd/). * [grpc-zerolog](https://github.com/cheapRoc/grpc-zerolog): Implementation of `grpclog.LoggerV2` interface using `zerolog` * [overlog](https://github.com/Trendyol/overlog): Implementation of `Mapped Diagnostic Context` interface using `zerolog` -* [zerologr](https://github.com/hn8/zerologr): Implementation of `logr.LogSink` interface using `zerolog` +* [zerologr](https://github.com/go-logr/zerologr): Implementation of `logr.LogSink` interface using `zerolog` ## Benchmarks -See [logbench](http://hackemist.com/logbench/) for more comprehensive and up-to-date benchmarks. +See [logbench](http://bench.zerolog.io/) for more comprehensive and up-to-date benchmarks. All operations are allocation free (those numbers *include* JSON encoding): @@ -682,6 +751,8 @@ Log a static string, without any context or `printf`-style templating: ## Caveats +### Field duplication + Note that zerolog does no de-duplication of fields. Using the same key multiple times creates multiple keys in final JSON: ```go @@ -693,3 +764,19 @@ logger.Info(). ``` In this case, many consumers will take the last value, but this is not guaranteed; check yours if in doubt. + +### Concurrency safety + +Be careful when calling UpdateContext. It is not concurrency safe. Use the With method to create a child logger: + +```go +func handler(w http.ResponseWriter, r *http.Request) { + // Create a child logger for concurrency safety + logger := log.Logger.With().Logger() + + // Add context fields, for example User-Agent from HTTP headers + logger.UpdateContext(func(c zerolog.Context) zerolog.Context { + ... + }) +} +``` diff --git a/vendor/github.com/rs/zerolog/array.go b/vendor/github.com/rs/zerolog/array.go index 0f7f53e..ba35b28 100644 --- a/vendor/github.com/rs/zerolog/array.go +++ b/vendor/github.com/rs/zerolog/array.go @@ -49,7 +49,7 @@ func (*Array) MarshalZerologArray(*Array) { func (a *Array) write(dst []byte) []byte { dst = enc.AppendArrayStart(dst) if len(a.buf) > 0 { - dst = append(append(dst, a.buf...)) + dst = append(dst, a.buf...) } dst = enc.AppendArrayEnd(dst) putArray(a) @@ -57,7 +57,7 @@ func (a *Array) write(dst []byte) []byte { } // Object marshals an object that implement the LogObjectMarshaler -// interface and append append it to the array. +// interface and appends it to the array. func (a *Array) Object(obj LogObjectMarshaler) *Array { e := Dict() obj.MarshalZerologObject(e) @@ -67,19 +67,19 @@ func (a *Array) Object(obj LogObjectMarshaler) *Array { return a } -// Str append append the val as a string to the array. +// Str appends the val as a string to the array. func (a *Array) Str(val string) *Array { a.buf = enc.AppendString(enc.AppendArrayDelim(a.buf), val) return a } -// Bytes append append the val as a string to the array. +// Bytes appends the val as a string to the array. func (a *Array) Bytes(val []byte) *Array { a.buf = enc.AppendBytes(enc.AppendArrayDelim(a.buf), val) return a } -// Hex append append the val as a hex string to the array. +// Hex appends the val as a hex string to the array. func (a *Array) Hex(val []byte) *Array { a.buf = enc.AppendHex(enc.AppendArrayDelim(a.buf), val) return a @@ -115,97 +115,97 @@ func (a *Array) Err(err error) *Array { return a } -// Bool append append the val as a bool to the array. +// Bool appends the val as a bool to the array. func (a *Array) Bool(b bool) *Array { a.buf = enc.AppendBool(enc.AppendArrayDelim(a.buf), b) return a } -// Int append append i as a int to the array. +// Int appends i as a int to the array. func (a *Array) Int(i int) *Array { a.buf = enc.AppendInt(enc.AppendArrayDelim(a.buf), i) return a } -// Int8 append append i as a int8 to the array. +// Int8 appends i as a int8 to the array. func (a *Array) Int8(i int8) *Array { a.buf = enc.AppendInt8(enc.AppendArrayDelim(a.buf), i) return a } -// Int16 append append i as a int16 to the array. +// Int16 appends i as a int16 to the array. func (a *Array) Int16(i int16) *Array { a.buf = enc.AppendInt16(enc.AppendArrayDelim(a.buf), i) return a } -// Int32 append append i as a int32 to the array. +// Int32 appends i as a int32 to the array. func (a *Array) Int32(i int32) *Array { a.buf = enc.AppendInt32(enc.AppendArrayDelim(a.buf), i) return a } -// Int64 append append i as a int64 to the array. +// Int64 appends i as a int64 to the array. func (a *Array) Int64(i int64) *Array { a.buf = enc.AppendInt64(enc.AppendArrayDelim(a.buf), i) return a } -// Uint append append i as a uint to the array. +// Uint appends i as a uint to the array. func (a *Array) Uint(i uint) *Array { a.buf = enc.AppendUint(enc.AppendArrayDelim(a.buf), i) return a } -// Uint8 append append i as a uint8 to the array. +// Uint8 appends i as a uint8 to the array. func (a *Array) Uint8(i uint8) *Array { a.buf = enc.AppendUint8(enc.AppendArrayDelim(a.buf), i) return a } -// Uint16 append append i as a uint16 to the array. +// Uint16 appends i as a uint16 to the array. func (a *Array) Uint16(i uint16) *Array { a.buf = enc.AppendUint16(enc.AppendArrayDelim(a.buf), i) return a } -// Uint32 append append i as a uint32 to the array. +// Uint32 appends i as a uint32 to the array. func (a *Array) Uint32(i uint32) *Array { a.buf = enc.AppendUint32(enc.AppendArrayDelim(a.buf), i) return a } -// Uint64 append append i as a uint64 to the array. +// Uint64 appends i as a uint64 to the array. func (a *Array) Uint64(i uint64) *Array { a.buf = enc.AppendUint64(enc.AppendArrayDelim(a.buf), i) return a } -// Float32 append append f as a float32 to the array. +// Float32 appends f as a float32 to the array. func (a *Array) Float32(f float32) *Array { - a.buf = enc.AppendFloat32(enc.AppendArrayDelim(a.buf), f) + a.buf = enc.AppendFloat32(enc.AppendArrayDelim(a.buf), f, FloatingPointPrecision) return a } -// Float64 append append f as a float64 to the array. +// Float64 appends f as a float64 to the array. func (a *Array) Float64(f float64) *Array { - a.buf = enc.AppendFloat64(enc.AppendArrayDelim(a.buf), f) + a.buf = enc.AppendFloat64(enc.AppendArrayDelim(a.buf), f, FloatingPointPrecision) return a } -// Time append append t formated as string using zerolog.TimeFieldFormat. +// Time appends t formatted as string using zerolog.TimeFieldFormat. func (a *Array) Time(t time.Time) *Array { a.buf = enc.AppendTime(enc.AppendArrayDelim(a.buf), t, TimeFieldFormat) return a } -// Dur append append d to the array. +// Dur appends d to the array. func (a *Array) Dur(d time.Duration) *Array { - a.buf = enc.AppendDuration(enc.AppendArrayDelim(a.buf), d, DurationFieldUnit, DurationFieldInteger) + a.buf = enc.AppendDuration(enc.AppendArrayDelim(a.buf), d, DurationFieldUnit, DurationFieldInteger, FloatingPointPrecision) return a } -// Interface append append i marshaled using reflection. +// Interface appends i marshaled using reflection. func (a *Array) Interface(i interface{}) *Array { if obj, ok := i.(LogObjectMarshaler); ok { return a.Object(obj) @@ -231,3 +231,10 @@ func (a *Array) MACAddr(ha net.HardwareAddr) *Array { a.buf = enc.AppendMACAddr(enc.AppendArrayDelim(a.buf), ha) return a } + +// Dict adds the dict Event to the array +func (a *Array) Dict(dict *Event) *Array { + dict.buf = enc.AppendEndMarker(dict.buf) + a.buf = append(enc.AppendArrayDelim(a.buf), dict.buf...) + return a +} diff --git a/vendor/github.com/rs/zerolog/console.go b/vendor/github.com/rs/zerolog/console.go index c078382..7e65e86 100644 --- a/vendor/github.com/rs/zerolog/console.go +++ b/vendor/github.com/rs/zerolog/console.go @@ -12,6 +12,8 @@ import ( "strings" "sync" "time" + + "github.com/mattn/go-colorable" ) const ( @@ -26,6 +28,8 @@ const ( colorBold = 1 colorDarkGray = 90 + + unknownLevel = "???" ) var ( @@ -55,12 +59,24 @@ type ConsoleWriter struct { // TimeFormat specifies the format for timestamp in output. TimeFormat string + // TimeLocation tells ConsoleWriter’s default FormatTimestamp + // how to localize the time. + TimeLocation *time.Location + // PartsOrder defines the order of parts in output. PartsOrder []string // PartsExclude defines parts to not display in output. PartsExclude []string + // FieldsOrder defines the order of contextual fields in output. + FieldsOrder []string + + fieldIsOrdered map[string]int + + // FieldsExclude defines contextual fields to not display in output. + FieldsExclude []string + FormatTimestamp Formatter FormatLevel Formatter FormatCaller Formatter @@ -69,25 +85,39 @@ type ConsoleWriter struct { FormatFieldValue Formatter FormatErrFieldName Formatter FormatErrFieldValue Formatter + + FormatExtra func(map[string]interface{}, *bytes.Buffer) error + + FormatPrepare func(map[string]interface{}) error } // NewConsoleWriter creates and initializes a new ConsoleWriter. func NewConsoleWriter(options ...func(w *ConsoleWriter)) ConsoleWriter { w := ConsoleWriter{ - Out: os.Stdout, - TimeFormat: consoleDefaultTimeFormat, - PartsOrder: consoleDefaultPartsOrder(), + Out: os.Stdout, + TimeFormat: consoleDefaultTimeFormat, + PartsOrder: consoleDefaultPartsOrder(), } for _, opt := range options { opt(&w) } + // Fix color on Windows + if w.Out == os.Stdout || w.Out == os.Stderr { + w.Out = colorable.NewColorable(w.Out.(*os.File)) + } + return w } // Write transforms the JSON input with formatters and appends to w.Out. func (w ConsoleWriter) Write(p []byte) (n int, err error) { + // Fix color on Windows + if w.Out == os.Stdout || w.Out == os.Stderr { + w.Out = colorable.NewColorable(w.Out.(*os.File)) + } + if w.PartsOrder == nil { w.PartsOrder = consoleDefaultPartsOrder() } @@ -107,33 +137,74 @@ func (w ConsoleWriter) Write(p []byte) (n int, err error) { return n, fmt.Errorf("cannot decode event: %s", err) } + if w.FormatPrepare != nil { + err = w.FormatPrepare(evt) + if err != nil { + return n, err + } + } + for _, p := range w.PartsOrder { w.writePart(buf, evt, p) } w.writeFields(evt, buf) + if w.FormatExtra != nil { + err = w.FormatExtra(evt, buf) + if err != nil { + return n, err + } + } + err = buf.WriteByte('\n') if err != nil { return n, err } + _, err = buf.WriteTo(w.Out) return len(p), err } +// Call the underlying writer's Close method if it is an io.Closer. Otherwise +// does nothing. +func (w ConsoleWriter) Close() error { + if closer, ok := w.Out.(io.Closer); ok { + return closer.Close() + } + return nil +} + // writeFields appends formatted key-value pairs to buf. func (w ConsoleWriter) writeFields(evt map[string]interface{}, buf *bytes.Buffer) { var fields = make([]string, 0, len(evt)) for field := range evt { + var isExcluded bool + for _, excluded := range w.FieldsExclude { + if field == excluded { + isExcluded = true + break + } + } + if isExcluded { + continue + } + switch field { case LevelFieldName, TimestampFieldName, MessageFieldName, CallerFieldName: continue } fields = append(fields, field) } - sort.Strings(fields) - if len(fields) > 0 { + if len(w.FieldsOrder) > 0 { + w.orderFields(fields) + } else { + sort.Strings(fields) + } + + // Write space only if something has already been written to the buffer, and if there are fields. + if buf.Len() > 0 && len(fields) > 0 { buf.WriteByte(' ') } @@ -194,7 +265,7 @@ func (w ConsoleWriter) writeFields(evt map[string]interface{}, buf *bytes.Buffer case json.Number: buf.WriteString(fv(fValue)) default: - b, err := json.Marshal(fValue) + b, err := InterfaceMarshalFunc(fValue) if err != nil { fmt.Fprintf(buf, colorize("[error: %v]", colorRed, w.NoColor), err) } else { @@ -229,13 +300,13 @@ func (w ConsoleWriter) writePart(buf *bytes.Buffer, evt map[string]interface{}, } case TimestampFieldName: if w.FormatTimestamp == nil { - f = consoleDefaultFormatTimestamp(w.TimeFormat, w.NoColor) + f = consoleDefaultFormatTimestamp(w.TimeFormat, w.TimeLocation, w.NoColor) } else { f = w.FormatTimestamp } case MessageFieldName: if w.FormatMessage == nil { - f = consoleDefaultFormatMessage + f = consoleDefaultFormatMessage(w.NoColor, evt[LevelFieldName]) } else { f = w.FormatMessage } @@ -256,11 +327,37 @@ func (w ConsoleWriter) writePart(buf *bytes.Buffer, evt map[string]interface{}, var s = f(evt[p]) if len(s) > 0 { + if buf.Len() > 0 { + buf.WriteByte(' ') // Write space only if not the first part + } buf.WriteString(s) - if p != w.PartsOrder[len(w.PartsOrder)-1] { // Skip space for last part - buf.WriteByte(' ') + } +} + +// orderFields takes an array of field names and an array representing field order +// and returns an array with any ordered fields at the beginning, in order, +// and the remaining fields after in their original order. +func (w ConsoleWriter) orderFields(fields []string) { + if w.fieldIsOrdered == nil { + w.fieldIsOrdered = make(map[string]int) + for i, fieldName := range w.FieldsOrder { + w.fieldIsOrdered[fieldName] = i } } + sort.Slice(fields, func(i, j int) bool { + ii, iOrdered := w.fieldIsOrdered[fields[i]] + jj, jOrdered := w.fieldIsOrdered[fields[j]] + if iOrdered && jOrdered { + return ii < jj + } + if iOrdered { + return true + } + if jOrdered { + return false + } + return fields[i] < fields[j] + }) } // needsQuote returns true when the string s should be quoted in output. @@ -273,8 +370,13 @@ func needsQuote(s string) bool { return false } -// colorize returns the string s wrapped in ANSI code c, unless disabled is true. +// colorize returns the string s wrapped in ANSI code c, unless disabled is true or c is 0. func colorize(s interface{}, c int, disabled bool) string { + e := os.Getenv("NO_COLOR") + if e != "" || c == 0 { + disabled = true + } + if disabled { return fmt.Sprintf("%s", s) } @@ -292,72 +394,74 @@ func consoleDefaultPartsOrder() []string { } } -func consoleDefaultFormatTimestamp(timeFormat string, noColor bool) Formatter { +func consoleDefaultFormatTimestamp(timeFormat string, location *time.Location, noColor bool) Formatter { if timeFormat == "" { timeFormat = consoleDefaultTimeFormat } + if location == nil { + location = time.Local + } + return func(i interface{}) string { t := "" switch tt := i.(type) { case string: - ts, err := time.Parse(TimeFieldFormat, tt) + ts, err := time.ParseInLocation(TimeFieldFormat, tt, location) if err != nil { t = tt } else { - t = ts.Format(timeFormat) + t = ts.In(location).Format(timeFormat) } case json.Number: i, err := tt.Int64() if err != nil { t = tt.String() } else { - var sec, nsec int64 = i, 0 + var sec, nsec int64 + switch TimeFieldFormat { - case TimeFormatUnixMs: - nsec = int64(time.Duration(i) * time.Millisecond) - sec = 0 + case TimeFormatUnixNano: + sec, nsec = 0, i case TimeFormatUnixMicro: - nsec = int64(time.Duration(i) * time.Microsecond) - sec = 0 + sec, nsec = 0, int64(time.Duration(i)*time.Microsecond) + case TimeFormatUnixMs: + sec, nsec = 0, int64(time.Duration(i)*time.Millisecond) + default: + sec, nsec = i, 0 } - ts := time.Unix(sec, nsec).UTC() - t = ts.Format(timeFormat) + + ts := time.Unix(sec, nsec) + t = ts.In(location).Format(timeFormat) } } return colorize(t, colorDarkGray, noColor) } } +func stripLevel(ll string) string { + if len(ll) == 0 { + return unknownLevel + } + if len(ll) > 3 { + ll = ll[:3] + } + return strings.ToUpper(ll) +} + func consoleDefaultFormatLevel(noColor bool) Formatter { return func(i interface{}) string { - var l string if ll, ok := i.(string); ok { - switch ll { - case LevelTraceValue: - l = colorize("TRC", colorMagenta, noColor) - case LevelDebugValue: - l = colorize("DBG", colorYellow, noColor) - case LevelInfoValue: - l = colorize("INF", colorGreen, noColor) - case LevelWarnValue: - l = colorize("WRN", colorRed, noColor) - case LevelErrorValue: - l = colorize(colorize("ERR", colorRed, noColor), colorBold, noColor) - case LevelFatalValue: - l = colorize(colorize("FTL", colorRed, noColor), colorBold, noColor) - case LevelPanicValue: - l = colorize(colorize("PNC", colorRed, noColor), colorBold, noColor) - default: - l = colorize("???", colorBold, noColor) - } - } else { - if i == nil { - l = colorize("???", colorBold, noColor) - } else { - l = strings.ToUpper(fmt.Sprintf("%s", i))[0:3] + level, _ := ParseLevel(ll) + fl, ok := FormattedLevels[level] + if ok { + return colorize(fl, LevelColors[level], noColor) } + return stripLevel(ll) } - return l + if i == nil { + return unknownLevel + } + return stripLevel(fmt.Sprintf("%s", i)) } } @@ -379,11 +483,18 @@ func consoleDefaultFormatCaller(noColor bool) Formatter { } } -func consoleDefaultFormatMessage(i interface{}) string { - if i == nil { - return "" +func consoleDefaultFormatMessage(noColor bool, level interface{}) Formatter { + return func(i interface{}) string { + if i == nil || i == "" { + return "" + } + switch level { + case LevelInfoValue, LevelWarnValue, LevelErrorValue, LevelFatalValue, LevelPanicValue: + return colorize(fmt.Sprintf("%s", i), colorBold, noColor) + default: + return fmt.Sprintf("%s", i) + } } - return fmt.Sprintf("%s", i) } func consoleDefaultFormatFieldName(noColor bool) Formatter { @@ -398,12 +509,12 @@ func consoleDefaultFormatFieldValue(i interface{}) string { func consoleDefaultFormatErrFieldName(noColor bool) Formatter { return func(i interface{}) string { - return colorize(fmt.Sprintf("%s=", i), colorRed, noColor) + return colorize(fmt.Sprintf("%s=", i), colorCyan, noColor) } } func consoleDefaultFormatErrFieldValue(noColor bool) Formatter { return func(i interface{}) string { - return colorize(fmt.Sprintf("%s", i), colorRed, noColor) + return colorize(colorize(fmt.Sprintf("%s", i), colorBold, noColor), colorRed, noColor) } } diff --git a/vendor/github.com/rs/zerolog/context.go b/vendor/github.com/rs/zerolog/context.go index f398e31..ff9a3ae 100644 --- a/vendor/github.com/rs/zerolog/context.go +++ b/vendor/github.com/rs/zerolog/context.go @@ -1,8 +1,9 @@ package zerolog import ( + "context" "fmt" - "io/ioutil" + "io" "math" "net" "time" @@ -22,7 +23,7 @@ func (c Context) Logger() Logger { // Only map[string]interface{} and []interface{} are accepted. []interface{} must // alternate string keys and arbitrary values, and extraneous ones are ignored. func (c Context) Fields(fields interface{}) Context { - c.l.context = appendFields(c.l.context, fields) + c.l.context = appendFields(c.l.context, fields, c.l.stack) return c } @@ -56,7 +57,7 @@ func (c Context) Array(key string, arr LogArrayMarshaler) Context { // Object marshals an object that implement the LogObjectMarshaler interface. func (c Context) Object(key string, obj LogObjectMarshaler) Context { - e := newEvent(levelWriterAdapter{ioutil.Discard}, 0) + e := newEvent(LevelWriterAdapter{io.Discard}, 0) e.Object(key, obj) c.l.context = enc.AppendObjectData(c.l.context, e.buf) putEvent(e) @@ -65,7 +66,7 @@ func (c Context) Object(key string, obj LogObjectMarshaler) Context { // EmbedObject marshals and Embeds an object that implement the LogObjectMarshaler interface. func (c Context) EmbedObject(obj LogObjectMarshaler) Context { - e := newEvent(levelWriterAdapter{ioutil.Discard}, 0) + e := newEvent(LevelWriterAdapter{io.Discard}, 0) e.EmbedObject(obj) c.l.context = enc.AppendObjectData(c.l.context, e.buf) putEvent(e) @@ -162,9 +163,34 @@ func (c Context) Errs(key string, errs []error) Context { // Err adds the field "error" with serialized err to the logger context. func (c Context) Err(err error) Context { + if c.l.stack && ErrorStackMarshaler != nil { + switch m := ErrorStackMarshaler(err).(type) { + case nil: + case LogObjectMarshaler: + c = c.Object(ErrorStackFieldName, m) + case error: + if m != nil && !isNilValue(m) { + c = c.Str(ErrorStackFieldName, m.Error()) + } + case string: + c = c.Str(ErrorStackFieldName, m) + default: + c = c.Interface(ErrorStackFieldName, m) + } + } + return c.AnErr(ErrorFieldName, err) } +// Ctx adds the context.Context to the logger context. The context.Context is +// not rendered in the error message, but is made available for hooks to use. +// A typical use case is to extract tracing information from the +// context.Context. +func (c Context) Ctx(ctx context.Context) Context { + c.l.ctx = ctx + return c +} + // Bool adds the field key with val as a bool to the logger context. func (c Context) Bool(key string, b bool) Context { c.l.context = enc.AppendBool(enc.AppendKey(c.l.context, key), b) @@ -299,25 +325,25 @@ func (c Context) Uints64(key string, i []uint64) Context { // Float32 adds the field key with f as a float32 to the logger context. func (c Context) Float32(key string, f float32) Context { - c.l.context = enc.AppendFloat32(enc.AppendKey(c.l.context, key), f) + c.l.context = enc.AppendFloat32(enc.AppendKey(c.l.context, key), f, FloatingPointPrecision) return c } // Floats32 adds the field key with f as a []float32 to the logger context. func (c Context) Floats32(key string, f []float32) Context { - c.l.context = enc.AppendFloats32(enc.AppendKey(c.l.context, key), f) + c.l.context = enc.AppendFloats32(enc.AppendKey(c.l.context, key), f, FloatingPointPrecision) return c } // Float64 adds the field key with f as a float64 to the logger context. func (c Context) Float64(key string, f float64) Context { - c.l.context = enc.AppendFloat64(enc.AppendKey(c.l.context, key), f) + c.l.context = enc.AppendFloat64(enc.AppendKey(c.l.context, key), f, FloatingPointPrecision) return c } // Floats64 adds the field key with f as a []float64 to the logger context. func (c Context) Floats64(key string, f []float64) Context { - c.l.context = enc.AppendFloats64(enc.AppendKey(c.l.context, key), f) + c.l.context = enc.AppendFloats64(enc.AppendKey(c.l.context, key), f, FloatingPointPrecision) return c } @@ -329,8 +355,9 @@ func (ts timestampHook) Run(e *Event, level Level, msg string) { var th = timestampHook{} -// Timestamp adds the current local time as UNIX timestamp to the logger context with the "time" key. +// Timestamp adds the current local time to the logger context with the "time" key, formatted using zerolog.TimeFieldFormat. // To customize the key name, change zerolog.TimestampFieldName. +// To customize the time format, change zerolog.TimeFieldFormat. // // NOTE: It won't dedupe the "time" key if the *Context has one already. func (c Context) Timestamp() Context { @@ -338,13 +365,13 @@ func (c Context) Timestamp() Context { return c } -// Time adds the field key with t formated as string using zerolog.TimeFieldFormat. +// Time adds the field key with t formatted as string using zerolog.TimeFieldFormat. func (c Context) Time(key string, t time.Time) Context { c.l.context = enc.AppendTime(enc.AppendKey(c.l.context, key), t, TimeFieldFormat) return c } -// Times adds the field key with t formated as string using zerolog.TimeFieldFormat. +// Times adds the field key with t formatted as string using zerolog.TimeFieldFormat. func (c Context) Times(key string, t []time.Time) Context { c.l.context = enc.AppendTimes(enc.AppendKey(c.l.context, key), t, TimeFieldFormat) return c @@ -352,22 +379,42 @@ func (c Context) Times(key string, t []time.Time) Context { // Dur adds the fields key with d divided by unit and stored as a float. func (c Context) Dur(key string, d time.Duration) Context { - c.l.context = enc.AppendDuration(enc.AppendKey(c.l.context, key), d, DurationFieldUnit, DurationFieldInteger) + c.l.context = enc.AppendDuration(enc.AppendKey(c.l.context, key), d, DurationFieldUnit, DurationFieldInteger, FloatingPointPrecision) return c } // Durs adds the fields key with d divided by unit and stored as a float. func (c Context) Durs(key string, d []time.Duration) Context { - c.l.context = enc.AppendDurations(enc.AppendKey(c.l.context, key), d, DurationFieldUnit, DurationFieldInteger) + c.l.context = enc.AppendDurations(enc.AppendKey(c.l.context, key), d, DurationFieldUnit, DurationFieldInteger, FloatingPointPrecision) return c } // Interface adds the field key with obj marshaled using reflection. func (c Context) Interface(key string, i interface{}) Context { + if obj, ok := i.(LogObjectMarshaler); ok { + return c.Object(key, obj) + } c.l.context = enc.AppendInterface(enc.AppendKey(c.l.context, key), i) return c } +// Type adds the field key with val's type using reflection. +func (c Context) Type(key string, val interface{}) Context { + c.l.context = enc.AppendType(enc.AppendKey(c.l.context, key), val) + return c +} + +// Any is a wrapper around Context.Interface. +func (c Context) Any(key string, i interface{}) Context { + return c.Interface(key, i) +} + +// Reset removes all the context fields. +func (c Context) Reset() Context { + c.l.context = enc.AppendBeginMarker(make([]byte, 0, 500)) + return c +} + type callerHook struct { callerSkipFrameCount int } diff --git a/vendor/github.com/rs/zerolog/ctx.go b/vendor/github.com/rs/zerolog/ctx.go index 966d17e..60432d1 100644 --- a/vendor/github.com/rs/zerolog/ctx.go +++ b/vendor/github.com/rs/zerolog/ctx.go @@ -14,10 +14,15 @@ func init() { type ctxKey struct{} -// WithContext returns a copy of ctx with l associated. If an instance of Logger -// is already in the context, the context is not updated. +// WithContext returns a copy of ctx with the receiver attached. The Logger +// attached to the provided Context (if any) will not be effected. If the +// receiver's log level is Disabled it will only be attached to the returned +// Context if the provided Context has a previously attached Logger. If the +// provided Context has no attached Logger, a Disabled Logger will not be +// attached. // -// For instance, to add a field to an existing logger in the context, use this +// Note: to modify the existing Logger attached to a Context (instead of +// replacing it in a new Context), use UpdateContext with the following // notation: // // ctx := r.Context() @@ -25,17 +30,13 @@ type ctxKey struct{} // l.UpdateContext(func(c Context) Context { // return c.Str("bar", "baz") // }) -func (l *Logger) WithContext(ctx context.Context) context.Context { - if lp, ok := ctx.Value(ctxKey{}).(*Logger); ok { - if lp == l { - // Do not store same logger. - return ctx - } - } else if l.level == Disabled { +// +func (l Logger) WithContext(ctx context.Context) context.Context { + if _, ok := ctx.Value(ctxKey{}).(*Logger); !ok && l.level == Disabled { // Do not store disabled logger. return ctx } - return context.WithValue(ctx, ctxKey{}, l) + return context.WithValue(ctx, ctxKey{}, &l) } // Ctx returns the Logger associated with the ctx. If no logger diff --git a/vendor/github.com/rs/zerolog/encoder.go b/vendor/github.com/rs/zerolog/encoder.go index 09b24e8..4dbaf38 100644 --- a/vendor/github.com/rs/zerolog/encoder.go +++ b/vendor/github.com/rs/zerolog/encoder.go @@ -13,13 +13,13 @@ type encoder interface { AppendBool(dst []byte, val bool) []byte AppendBools(dst []byte, vals []bool) []byte AppendBytes(dst, s []byte) []byte - AppendDuration(dst []byte, d time.Duration, unit time.Duration, useInt bool) []byte - AppendDurations(dst []byte, vals []time.Duration, unit time.Duration, useInt bool) []byte + AppendDuration(dst []byte, d time.Duration, unit time.Duration, useInt bool, precision int) []byte + AppendDurations(dst []byte, vals []time.Duration, unit time.Duration, useInt bool, precision int) []byte AppendEndMarker(dst []byte) []byte - AppendFloat32(dst []byte, val float32) []byte - AppendFloat64(dst []byte, val float64) []byte - AppendFloats32(dst []byte, vals []float32) []byte - AppendFloats64(dst []byte, vals []float64) []byte + AppendFloat32(dst []byte, val float32, precision int) []byte + AppendFloat64(dst []byte, val float64, precision int) []byte + AppendFloats32(dst []byte, vals []float32, precision int) []byte + AppendFloats64(dst []byte, vals []float64, precision int) []byte AppendHex(dst, s []byte) []byte AppendIPAddr(dst []byte, ip net.IP) []byte AppendIPPrefix(dst []byte, pfx net.IPNet) []byte diff --git a/vendor/github.com/rs/zerolog/encoder_cbor.go b/vendor/github.com/rs/zerolog/encoder_cbor.go index 7b0dafe..36cb994 100644 --- a/vendor/github.com/rs/zerolog/encoder_cbor.go +++ b/vendor/github.com/rs/zerolog/encoder_cbor.go @@ -24,6 +24,9 @@ func init() { func appendJSON(dst []byte, j []byte) []byte { return cbor.AppendEmbeddedJSON(dst, j) } +func appendCBOR(dst []byte, c []byte) []byte { + return cbor.AppendEmbeddedCBOR(dst, c) +} // decodeIfBinaryToString - converts a binary formatted log msg to a // JSON formatted String Log message. diff --git a/vendor/github.com/rs/zerolog/encoder_json.go b/vendor/github.com/rs/zerolog/encoder_json.go index 0e0450e..6f96c68 100644 --- a/vendor/github.com/rs/zerolog/encoder_json.go +++ b/vendor/github.com/rs/zerolog/encoder_json.go @@ -6,6 +6,7 @@ package zerolog // JSON encoded byte stream. import ( + "encoding/base64" "github.com/rs/zerolog/internal/json" ) @@ -25,6 +26,17 @@ func init() { func appendJSON(dst []byte, j []byte) []byte { return append(dst, j...) } +func appendCBOR(dst []byte, cbor []byte) []byte { + dst = append(dst, []byte("\"data:application/cbor;base64,")...) + l := len(dst) + enc := base64.StdEncoding + n := enc.EncodedLen(len(cbor)) + for i := 0; i < n; i++ { + dst = append(dst, '.') + } + enc.Encode(dst[l:], cbor) + return append(dst, '"') +} func decodeIfBinaryToString(in []byte) string { return string(in) diff --git a/vendor/github.com/rs/zerolog/event.go b/vendor/github.com/rs/zerolog/event.go index 6aaa618..56de606 100644 --- a/vendor/github.com/rs/zerolog/event.go +++ b/vendor/github.com/rs/zerolog/event.go @@ -1,6 +1,7 @@ package zerolog import ( + "context" "fmt" "net" "os" @@ -24,9 +25,10 @@ type Event struct { w LevelWriter level Level done func(msg string) - stack bool // enable error stack trace - ch []Hook // hooks from context - skipFrame int // The number of additional frames to skip when printing the caller. + stack bool // enable error stack trace + ch []Hook // hooks from context + skipFrame int // The number of additional frames to skip when printing the caller. + ctx context.Context // Optional Go context for event } func putEvent(e *Event) { @@ -129,6 +131,13 @@ func (e *Event) Msgf(format string, v ...interface{}) { e.msg(fmt.Sprintf(format, v...)) } +func (e *Event) MsgFunc(createMsg func() string) { + if e == nil { + return + } + e.msg(createMsg()) +} + func (e *Event) msg(msg string) { for _, hook := range e.ch { hook.Run(e, e.level, msg) @@ -155,7 +164,7 @@ func (e *Event) Fields(fields interface{}) *Event { if e == nil { return e } - e.buf = appendFields(e.buf, fields) + e.buf = appendFields(e.buf, fields, e.stack) return e } @@ -257,18 +266,24 @@ func (e *Event) Strs(key string, vals []string) *Event { return e } -// Stringer adds the field key with val.String() (or null if val is nil) to the *Event context. +// Stringer adds the field key with val.String() (or null if val is nil) +// to the *Event context. func (e *Event) Stringer(key string, val fmt.Stringer) *Event { if e == nil { return e } + e.buf = enc.AppendStringer(enc.AppendKey(e.buf, key), val) + return e +} - if val != nil { - e.buf = enc.AppendString(enc.AppendKey(e.buf, key), val.String()) +// Stringers adds the field key with vals where each individual val +// is used as val.String() (or null if val is empty) to the *Event +// context. +func (e *Event) Stringers(key string, vals []fmt.Stringer) *Event { + if e == nil { return e } - - e.buf = enc.AppendInterface(enc.AppendKey(e.buf, key), nil) + e.buf = enc.AppendStringers(enc.AppendKey(e.buf, key), vals) return e } @@ -305,6 +320,18 @@ func (e *Event) RawJSON(key string, b []byte) *Event { return e } +// RawCBOR adds already encoded CBOR to the log line under key. +// +// No sanity check is performed on b +// Note: The full featureset of CBOR is supported as data will not be mapped to json but stored as data-url +func (e *Event) RawCBOR(key string, b []byte) *Event { + if e == nil { + return e + } + e.buf = appendCBOR(enc.AppendKey(e.buf, key), b) + return e +} + // AnErr adds the field key with serialized err to the *Event context. // If err is nil, no field is added. func (e *Event) AnErr(key string, err error) *Event { @@ -392,6 +419,28 @@ func (e *Event) Stack() *Event { return e } +// Ctx adds the Go Context to the *Event context. The context is not rendered +// in the output message, but is available to hooks and to Func() calls via the +// GetCtx() accessor. A typical use case is to extract tracing information from +// the Go Ctx. +func (e *Event) Ctx(ctx context.Context) *Event { + if e != nil { + e.ctx = ctx + } + return e +} + +// GetCtx retrieves the Go context.Context which is optionally stored in the +// Event. This allows Hooks and functions passed to Func() to retrieve values +// which are stored in the context.Context. This can be useful in tracing, +// where span information is commonly propagated in the context.Context. +func (e *Event) GetCtx() context.Context { + if e == nil || e.ctx == nil { + return context.Background() + } + return e.ctx +} + // Bool adds the field key with val as a bool to the *Event context. func (e *Event) Bool(key string, b bool) *Event { if e == nil { @@ -595,7 +644,7 @@ func (e *Event) Float32(key string, f float32) *Event { if e == nil { return e } - e.buf = enc.AppendFloat32(enc.AppendKey(e.buf, key), f) + e.buf = enc.AppendFloat32(enc.AppendKey(e.buf, key), f, FloatingPointPrecision) return e } @@ -604,7 +653,7 @@ func (e *Event) Floats32(key string, f []float32) *Event { if e == nil { return e } - e.buf = enc.AppendFloats32(enc.AppendKey(e.buf, key), f) + e.buf = enc.AppendFloats32(enc.AppendKey(e.buf, key), f, FloatingPointPrecision) return e } @@ -613,7 +662,7 @@ func (e *Event) Float64(key string, f float64) *Event { if e == nil { return e } - e.buf = enc.AppendFloat64(enc.AppendKey(e.buf, key), f) + e.buf = enc.AppendFloat64(enc.AppendKey(e.buf, key), f, FloatingPointPrecision) return e } @@ -622,7 +671,7 @@ func (e *Event) Floats64(key string, f []float64) *Event { if e == nil { return e } - e.buf = enc.AppendFloats64(enc.AppendKey(e.buf, key), f) + e.buf = enc.AppendFloats64(enc.AppendKey(e.buf, key), f, FloatingPointPrecision) return e } @@ -639,7 +688,7 @@ func (e *Event) Timestamp() *Event { return e } -// Time adds the field key with t formated as string using zerolog.TimeFieldFormat. +// Time adds the field key with t formatted as string using zerolog.TimeFieldFormat. func (e *Event) Time(key string, t time.Time) *Event { if e == nil { return e @@ -648,7 +697,7 @@ func (e *Event) Time(key string, t time.Time) *Event { return e } -// Times adds the field key with t formated as string using zerolog.TimeFieldFormat. +// Times adds the field key with t formatted as string using zerolog.TimeFieldFormat. func (e *Event) Times(key string, t []time.Time) *Event { if e == nil { return e @@ -664,7 +713,7 @@ func (e *Event) Dur(key string, d time.Duration) *Event { if e == nil { return e } - e.buf = enc.AppendDuration(enc.AppendKey(e.buf, key), d, DurationFieldUnit, DurationFieldInteger) + e.buf = enc.AppendDuration(enc.AppendKey(e.buf, key), d, DurationFieldUnit, DurationFieldInteger, FloatingPointPrecision) return e } @@ -675,7 +724,7 @@ func (e *Event) Durs(key string, d []time.Duration) *Event { if e == nil { return e } - e.buf = enc.AppendDurations(enc.AppendKey(e.buf, key), d, DurationFieldUnit, DurationFieldInteger) + e.buf = enc.AppendDurations(enc.AppendKey(e.buf, key), d, DurationFieldUnit, DurationFieldInteger, FloatingPointPrecision) return e } @@ -690,10 +739,15 @@ func (e *Event) TimeDiff(key string, t time.Time, start time.Time) *Event { if t.After(start) { d = t.Sub(start) } - e.buf = enc.AppendDuration(enc.AppendKey(e.buf, key), d, DurationFieldUnit, DurationFieldInteger) + e.buf = enc.AppendDuration(enc.AppendKey(e.buf, key), d, DurationFieldUnit, DurationFieldInteger, FloatingPointPrecision) return e } +// Any is a wrapper around Event.Interface. +func (e *Event) Any(key string, i interface{}) *Event { + return e.Interface(key, i) +} + // Interface adds the field key with i marshaled using reflection. func (e *Event) Interface(key string, i interface{}) *Event { if e == nil { @@ -706,6 +760,15 @@ func (e *Event) Interface(key string, i interface{}) *Event { return e } +// Type adds the field key with val's type using reflection. +func (e *Event) Type(key string, val interface{}) *Event { + if e == nil { + return e + } + e.buf = enc.AppendType(enc.AppendKey(e.buf, key), val) + return e +} + // CallerSkipFrame instructs any future Caller calls to skip the specified number of frames. // This includes those added via hooks from the context. func (e *Event) CallerSkipFrame(skip int) *Event { @@ -731,11 +794,11 @@ func (e *Event) caller(skip int) *Event { if e == nil { return e } - _, file, line, ok := runtime.Caller(skip + e.skipFrame) + pc, file, line, ok := runtime.Caller(skip + e.skipFrame) if !ok { return e } - e.buf = enc.AppendString(enc.AppendKey(e.buf, CallerFieldName), CallerMarshalFunc(file, line)) + e.buf = enc.AppendString(enc.AppendKey(e.buf, CallerFieldName), CallerMarshalFunc(pc, file, line)) return e } diff --git a/vendor/github.com/rs/zerolog/example.jsonl b/vendor/github.com/rs/zerolog/example.jsonl new file mode 100644 index 0000000..d73193d --- /dev/null +++ b/vendor/github.com/rs/zerolog/example.jsonl @@ -0,0 +1,7 @@ +{"time":"5:41PM","level":"info","message":"Starting listener","listen":":8080","pid":37556} +{"time":"5:41PM","level":"debug","message":"Access","database":"myapp","host":"localhost:4962","pid":37556} +{"time":"5:41PM","level":"info","message":"Access","method":"GET","path":"/users","pid":37556,"resp_time":23} +{"time":"5:41PM","level":"info","message":"Access","method":"POST","path":"/posts","pid":37556,"resp_time":532} +{"time":"5:41PM","level":"warn","message":"Slow request","method":"POST","path":"/posts","pid":37556,"resp_time":532} +{"time":"5:41PM","level":"info","message":"Access","method":"GET","path":"/users","pid":37556,"resp_time":10} +{"time":"5:41PM","level":"error","message":"Database connection lost","database":"myapp","pid":37556,"error":"connection reset by peer"} diff --git a/vendor/github.com/rs/zerolog/fields.go b/vendor/github.com/rs/zerolog/fields.go index c1eb5ce..99f5271 100644 --- a/vendor/github.com/rs/zerolog/fields.go +++ b/vendor/github.com/rs/zerolog/fields.go @@ -12,13 +12,13 @@ func isNilValue(i interface{}) bool { return (*[2]uintptr)(unsafe.Pointer(&i))[1] == 0 } -func appendFields(dst []byte, fields interface{}) []byte { +func appendFields(dst []byte, fields interface{}, stack bool) []byte { switch fields := fields.(type) { case []interface{}: if n := len(fields); n&0x1 == 1 { // odd number fields = fields[:n-1] } - dst = appendFieldList(dst, fields) + dst = appendFieldList(dst, fields, stack) case map[string]interface{}: keys := make([]string, 0, len(fields)) for key := range fields { @@ -28,13 +28,13 @@ func appendFields(dst []byte, fields interface{}) []byte { kv := make([]interface{}, 2) for _, key := range keys { kv[0], kv[1] = key, fields[key] - dst = appendFieldList(dst, kv) + dst = appendFieldList(dst, kv, stack) } } return dst } -func appendFieldList(dst []byte, kvList []interface{}) []byte { +func appendFieldList(dst []byte, kvList []interface{}, stack bool) []byte { for i, n := 0, len(kvList); i < n; i += 2 { key, val := kvList[i], kvList[i+1] if key, ok := key.(string); ok { @@ -74,6 +74,21 @@ func appendFieldList(dst []byte, kvList []interface{}) []byte { default: dst = enc.AppendInterface(dst, m) } + + if stack && ErrorStackMarshaler != nil { + dst = enc.AppendKey(dst, ErrorStackFieldName) + switch m := ErrorStackMarshaler(val).(type) { + case nil: + case error: + if m != nil && !isNilValue(m) { + dst = enc.AppendString(dst, m.Error()) + } + case string: + dst = enc.AppendString(dst, m) + default: + dst = enc.AppendInterface(dst, m) + } + } case []error: dst = enc.AppendArrayStart(dst) for i, err := range val { @@ -124,13 +139,13 @@ func appendFieldList(dst []byte, kvList []interface{}) []byte { case uint64: dst = enc.AppendUint64(dst, val) case float32: - dst = enc.AppendFloat32(dst, val) + dst = enc.AppendFloat32(dst, val, FloatingPointPrecision) case float64: - dst = enc.AppendFloat64(dst, val) + dst = enc.AppendFloat64(dst, val, FloatingPointPrecision) case time.Time: dst = enc.AppendTime(dst, val, TimeFieldFormat) case time.Duration: - dst = enc.AppendDuration(dst, val, DurationFieldUnit, DurationFieldInteger) + dst = enc.AppendDuration(dst, val, DurationFieldUnit, DurationFieldInteger, FloatingPointPrecision) case *string: if val != nil { dst = enc.AppendString(dst, *val) @@ -205,13 +220,13 @@ func appendFieldList(dst []byte, kvList []interface{}) []byte { } case *float32: if val != nil { - dst = enc.AppendFloat32(dst, *val) + dst = enc.AppendFloat32(dst, *val, FloatingPointPrecision) } else { dst = enc.AppendNil(dst) } case *float64: if val != nil { - dst = enc.AppendFloat64(dst, *val) + dst = enc.AppendFloat64(dst, *val, FloatingPointPrecision) } else { dst = enc.AppendNil(dst) } @@ -223,7 +238,7 @@ func appendFieldList(dst []byte, kvList []interface{}) []byte { } case *time.Duration: if val != nil { - dst = enc.AppendDuration(dst, *val, DurationFieldUnit, DurationFieldInteger) + dst = enc.AppendDuration(dst, *val, DurationFieldUnit, DurationFieldInteger, FloatingPointPrecision) } else { dst = enc.AppendNil(dst) } @@ -252,13 +267,13 @@ func appendFieldList(dst []byte, kvList []interface{}) []byte { case []uint64: dst = enc.AppendUints64(dst, val) case []float32: - dst = enc.AppendFloats32(dst, val) + dst = enc.AppendFloats32(dst, val, FloatingPointPrecision) case []float64: - dst = enc.AppendFloats64(dst, val) + dst = enc.AppendFloats64(dst, val, FloatingPointPrecision) case []time.Time: dst = enc.AppendTimes(dst, val, TimeFieldFormat) case []time.Duration: - dst = enc.AppendDurations(dst, val, DurationFieldUnit, DurationFieldInteger) + dst = enc.AppendDurations(dst, val, DurationFieldUnit, DurationFieldInteger, FloatingPointPrecision) case nil: dst = enc.AppendNil(dst) case net.IP: diff --git a/vendor/github.com/rs/zerolog/globals.go b/vendor/github.com/rs/zerolog/globals.go index e561d8f..9a9be71 100644 --- a/vendor/github.com/rs/zerolog/globals.go +++ b/vendor/github.com/rs/zerolog/globals.go @@ -1,6 +1,7 @@ package zerolog import ( + "bytes" "encoding/json" "strconv" "sync/atomic" @@ -19,6 +20,10 @@ const ( // TimeFormatUnixMicro defines a time format that makes time fields to be // serialized as Unix timestamp integers in microseconds. TimeFormatUnixMicro = "UNIXMICRO" + + // TimeFormatUnixNano defines a time format that makes time fields to be + // serialized as Unix timestamp integers in nanoseconds. + TimeFormatUnixNano = "UNIXNANO" ) var ( @@ -61,7 +66,7 @@ var ( CallerSkipFrameCount = 2 // CallerMarshalFunc allows customization of global caller marshaling - CallerMarshalFunc = func(file string, line int) string { + CallerMarshalFunc = func(pc uintptr, file string, line int) string { return file + ":" + strconv.Itoa(line) } @@ -77,11 +82,25 @@ var ( } // InterfaceMarshalFunc allows customization of interface marshaling. - // Default: "encoding/json.Marshal" - InterfaceMarshalFunc = json.Marshal + // Default: "encoding/json.Marshal" with disabled HTML escaping + InterfaceMarshalFunc = func(v interface{}) ([]byte, error) { + var buf bytes.Buffer + encoder := json.NewEncoder(&buf) + encoder.SetEscapeHTML(false) + err := encoder.Encode(v) + if err != nil { + return nil, err + } + b := buf.Bytes() + if len(b) > 0 { + // Remove trailing \n which is added by Encode. + return b[:len(b)-1], nil + } + return b, nil + } // TimeFieldFormat defines the time format of the Time field type. If set to - // TimeFormatUnix, TimeFormatUnixMs or TimeFormatUnixMicro, the time is formatted as an UNIX + // TimeFormatUnix, TimeFormatUnixMs, TimeFormatUnixMicro or TimeFormatUnixNano, the time is formatted as a UNIX // timestamp as integer. TimeFieldFormat = time.RFC3339 @@ -104,6 +123,39 @@ var ( // DefaultContextLogger is returned from Ctx() if there is no logger associated // with the context. DefaultContextLogger *Logger + + // LevelColors are used by ConsoleWriter's consoleDefaultFormatLevel to color + // log levels. + LevelColors = map[Level]int{ + TraceLevel: colorBlue, + DebugLevel: 0, + InfoLevel: colorGreen, + WarnLevel: colorYellow, + ErrorLevel: colorRed, + FatalLevel: colorRed, + PanicLevel: colorRed, + } + + // FormattedLevels are used by ConsoleWriter's consoleDefaultFormatLevel + // for a short level name. + FormattedLevels = map[Level]string{ + TraceLevel: "TRC", + DebugLevel: "DBG", + InfoLevel: "INF", + WarnLevel: "WRN", + ErrorLevel: "ERR", + FatalLevel: "FTL", + PanicLevel: "PNC", + } + + // TriggerLevelWriterBufferReuseLimit is a limit in bytes that a buffer is dropped + // from the TriggerLevelWriter buffer pool if the buffer grows above the limit. + TriggerLevelWriterBufferReuseLimit = 64 * 1024 + + // FloatingPointPrecision, if set to a value other than -1, controls the number + // of digits when formatting float numbers in JSON. See strconv.FormatFloat for + // more details. + FloatingPointPrecision = -1 ) var ( diff --git a/vendor/github.com/rs/zerolog/internal/cbor/cbor.go b/vendor/github.com/rs/zerolog/internal/cbor/cbor.go index 969f591..1bf1443 100644 --- a/vendor/github.com/rs/zerolog/internal/cbor/cbor.go +++ b/vendor/github.com/rs/zerolog/internal/cbor/cbor.go @@ -26,7 +26,8 @@ const ( additionalTypeBreak byte = 31 // Tag Sub-types. - additionalTypeTimestamp byte = 01 + additionalTypeTimestamp byte = 01 + additionalTypeEmbeddedCBOR byte = 63 // Extended Tags - from https://www.iana.org/assignments/cbor-tags/cbor-tags.xhtml additionalTypeTagNetworkAddr uint16 = 260 @@ -67,7 +68,7 @@ const ( var IntegerTimeFieldFormat = time.RFC3339 // NanoTimeFieldFormat indicates the format of timestamp decoded -// from a float value (time in seconds and nano seconds). +// from a float value (time in seconds and nanoseconds). var NanoTimeFieldFormat = time.RFC3339Nano func appendCborTypePrefix(dst []byte, major byte, number uint64) []byte { @@ -91,7 +92,8 @@ func appendCborTypePrefix(dst []byte, major byte, number uint64) []byte { minor = additionalTypeIntUint64 } - dst = append(dst, byte(major|minor)) + + dst = append(dst, major|minor) byteCount-- for ; byteCount >= 0; byteCount-- { dst = append(dst, byte(number>>(uint(byteCount)*8))) diff --git a/vendor/github.com/rs/zerolog/internal/cbor/decode_stream.go b/vendor/github.com/rs/zerolog/internal/cbor/decode_stream.go index e3cf3b7..5633e66 100644 --- a/vendor/github.com/rs/zerolog/internal/cbor/decode_stream.go +++ b/vendor/github.com/rs/zerolog/internal/cbor/decode_stream.go @@ -5,6 +5,7 @@ package cbor import ( "bufio" "bytes" + "encoding/base64" "fmt" "io" "math" @@ -43,7 +44,7 @@ func readByte(src *bufio.Reader) byte { return b } -func decodeIntAdditonalType(src *bufio.Reader, minor byte) int64 { +func decodeIntAdditionalType(src *bufio.Reader, minor byte) int64 { val := int64(0) if minor <= 23 { val = int64(minor) @@ -77,7 +78,7 @@ func decodeInteger(src *bufio.Reader) int64 { if major != majorTypeUnsignedInt && major != majorTypeNegativeInt { panic(fmt.Errorf("Major type is: %d in decodeInteger!! (expected 0 or 1)", major)) } - val := decodeIntAdditonalType(src, minor) + val := decodeIntAdditionalType(src, minor) if major == 0 { return val } @@ -94,7 +95,7 @@ func decodeFloat(src *bufio.Reader) (float64, int) { switch minor { case additionalTypeFloat16: - panic(fmt.Errorf("float16 is not suppported in decodeFloat")) + panic(fmt.Errorf("float16 is not supported in decodeFloat")) case additionalTypeFloat32: pb := readNBytes(src, 4) @@ -204,7 +205,7 @@ func decodeString(src *bufio.Reader, noQuotes bool) []byte { if !noQuotes { result = append(result, '"') } - length := decodeIntAdditonalType(src, minor) + length := decodeIntAdditionalType(src, minor) len := int(length) pbs := readNBytes(src, len) result = append(result, pbs...) @@ -213,6 +214,31 @@ func decodeString(src *bufio.Reader, noQuotes bool) []byte { } return append(result, '"') } +func decodeStringToDataUrl(src *bufio.Reader, mimeType string) []byte { + pb := readByte(src) + major := pb & maskOutAdditionalType + minor := pb & maskOutMajorType + if major != majorTypeByteString { + panic(fmt.Errorf("Major type is: %d in decodeString", major)) + } + length := decodeIntAdditionalType(src, minor) + l := int(length) + enc := base64.StdEncoding + lEnc := enc.EncodedLen(l) + result := make([]byte, len("\"data:;base64,\"")+len(mimeType)+lEnc) + dest := result + u := copy(dest, "\"data:") + dest = dest[u:] + u = copy(dest, mimeType) + dest = dest[u:] + u = copy(dest, ";base64,") + dest = dest[u:] + pbs := readNBytes(src, l) + enc.Encode(dest, pbs) + dest = dest[lEnc:] + dest[0] = '"' + return result +} func decodeUTF8String(src *bufio.Reader) []byte { pb := readByte(src) @@ -222,7 +248,7 @@ func decodeUTF8String(src *bufio.Reader) []byte { panic(fmt.Errorf("Major type is: %d in decodeUTF8String", major)) } result := []byte{'"'} - length := decodeIntAdditonalType(src, minor) + length := decodeIntAdditionalType(src, minor) len := int(length) pbs := readNBytes(src, len) @@ -238,7 +264,7 @@ func decodeUTF8String(src *bufio.Reader) []byte { return append(dst, '"') } } - // The string has no need for encoding an therefore is directly + // The string has no need for encoding and therefore is directly // appended to the byte slice. result = append(result, pbs...) return append(result, '"') @@ -257,7 +283,7 @@ func array2Json(src *bufio.Reader, dst io.Writer) { if minor == additionalTypeInfiniteCount { unSpecifiedCount = true } else { - length := decodeIntAdditonalType(src, minor) + length := decodeIntAdditionalType(src, minor) len = int(length) } for i := 0; unSpecifiedCount || i < len; i++ { @@ -266,7 +292,7 @@ func array2Json(src *bufio.Reader, dst io.Writer) { if e != nil { panic(e) } - if pb[0] == byte(majorTypeSimpleAndFloat|additionalTypeBreak) { + if pb[0] == majorTypeSimpleAndFloat|additionalTypeBreak { readByte(src) break } @@ -277,7 +303,7 @@ func array2Json(src *bufio.Reader, dst io.Writer) { if e != nil { panic(e) } - if pb[0] == byte(majorTypeSimpleAndFloat|additionalTypeBreak) { + if pb[0] == majorTypeSimpleAndFloat|additionalTypeBreak { readByte(src) break } @@ -301,7 +327,7 @@ func map2Json(src *bufio.Reader, dst io.Writer) { if minor == additionalTypeInfiniteCount { unSpecifiedCount = true } else { - length := decodeIntAdditonalType(src, minor) + length := decodeIntAdditionalType(src, minor) len = int(length) } dst.Write([]byte{'{'}) @@ -311,7 +337,7 @@ func map2Json(src *bufio.Reader, dst io.Writer) { if e != nil { panic(e) } - if pb[0] == byte(majorTypeSimpleAndFloat|additionalTypeBreak) { + if pb[0] == majorTypeSimpleAndFloat|additionalTypeBreak { readByte(src) break } @@ -326,7 +352,7 @@ func map2Json(src *bufio.Reader, dst io.Writer) { if e != nil { panic(e) } - if pb[0] == byte(majorTypeSimpleAndFloat|additionalTypeBreak) { + if pb[0] == majorTypeSimpleAndFloat|additionalTypeBreak { readByte(src) break } @@ -349,10 +375,24 @@ func decodeTagData(src *bufio.Reader) []byte { switch minor { case additionalTypeTimestamp: return decodeTimeStamp(src) + case additionalTypeIntUint8: + val := decodeIntAdditionalType(src, minor) + switch byte(val) { + case additionalTypeEmbeddedCBOR: + pb := readByte(src) + dataMajor := pb & maskOutAdditionalType + if dataMajor != majorTypeByteString { + panic(fmt.Errorf("Unsupported embedded Type: %d in decodeEmbeddedCBOR", dataMajor)) + } + src.UnreadByte() + return decodeStringToDataUrl(src, "application/cbor") + default: + panic(fmt.Errorf("Unsupported Additional Tag Type: %d in decodeTagData", val)) + } // Tag value is larger than 256 (so uint16). case additionalTypeIntUint16: - val := decodeIntAdditonalType(src, minor) + val := decodeIntAdditionalType(src, minor) switch uint16(val) { case additionalTypeEmbeddedJSON: @@ -383,7 +423,7 @@ func decodeTagData(src *bufio.Reader) []byte { case additionalTypeTagNetworkPrefix: pb := readByte(src) - if pb != byte(majorTypeMap|0x1) { + if pb != majorTypeMap|0x1 { panic(fmt.Errorf("IP Prefix is NOT of MAP of 1 elements as expected")) } octets := decodeString(src, true) diff --git a/vendor/github.com/rs/zerolog/internal/cbor/string.go b/vendor/github.com/rs/zerolog/internal/cbor/string.go index ff42afa..9fc9a4f 100644 --- a/vendor/github.com/rs/zerolog/internal/cbor/string.go +++ b/vendor/github.com/rs/zerolog/internal/cbor/string.go @@ -1,12 +1,14 @@ package cbor +import "fmt" + // AppendStrings encodes and adds an array of strings to the dst byte array. func (e Encoder) AppendStrings(dst []byte, vals []string) []byte { major := majorTypeArray l := len(vals) if l <= additionalMax { lb := byte(l) - dst = append(dst, byte(major|lb)) + dst = append(dst, major|lb) } else { dst = appendCborTypePrefix(dst, major, uint64(l)) } @@ -23,13 +25,38 @@ func (Encoder) AppendString(dst []byte, s string) []byte { l := len(s) if l <= additionalMax { lb := byte(l) - dst = append(dst, byte(major|lb)) + dst = append(dst, major|lb) } else { dst = appendCborTypePrefix(dst, majorTypeUtf8String, uint64(l)) } return append(dst, s...) } +// AppendStringers encodes and adds an array of Stringer values +// to the dst byte array. +func (e Encoder) AppendStringers(dst []byte, vals []fmt.Stringer) []byte { + if len(vals) == 0 { + return e.AppendArrayEnd(e.AppendArrayStart(dst)) + } + dst = e.AppendArrayStart(dst) + dst = e.AppendStringer(dst, vals[0]) + if len(vals) > 1 { + for _, val := range vals[1:] { + dst = e.AppendStringer(dst, val) + } + } + return e.AppendArrayEnd(dst) +} + +// AppendStringer encodes and adds the Stringer value to the dst +// byte array. +func (e Encoder) AppendStringer(dst []byte, val fmt.Stringer) []byte { + if val == nil { + return e.AppendNil(dst) + } + return e.AppendString(dst, val.String()) +} + // AppendBytes encodes and adds an array of bytes to the dst byte array. func (Encoder) AppendBytes(dst, s []byte) []byte { major := majorTypeByteString @@ -37,7 +64,7 @@ func (Encoder) AppendBytes(dst, s []byte) []byte { l := len(s) if l <= additionalMax { lb := byte(l) - dst = append(dst, byte(major|lb)) + dst = append(dst, major|lb) } else { dst = appendCborTypePrefix(dst, major, uint64(l)) } @@ -50,7 +77,7 @@ func AppendEmbeddedJSON(dst, s []byte) []byte { minor := additionalTypeEmbeddedJSON // Append the TAG to indicate this is Embedded JSON. - dst = append(dst, byte(major|additionalTypeIntUint16)) + dst = append(dst, major|additionalTypeIntUint16) dst = append(dst, byte(minor>>8)) dst = append(dst, byte(minor&0xff)) @@ -60,7 +87,29 @@ func AppendEmbeddedJSON(dst, s []byte) []byte { l := len(s) if l <= additionalMax { lb := byte(l) - dst = append(dst, byte(major|lb)) + dst = append(dst, major|lb) + } else { + dst = appendCborTypePrefix(dst, major, uint64(l)) + } + return append(dst, s...) +} + +// AppendEmbeddedCBOR adds a tag and embeds input CBOR as such. +func AppendEmbeddedCBOR(dst, s []byte) []byte { + major := majorTypeTags + minor := additionalTypeEmbeddedCBOR + + // Append the TAG to indicate this is Embedded JSON. + dst = append(dst, major|additionalTypeIntUint8) + dst = append(dst, minor) + + // Append the CBOR Object as Byte String. + major = majorTypeByteString + + l := len(s) + if l <= additionalMax { + lb := byte(l) + dst = append(dst, major|lb) } else { dst = appendCborTypePrefix(dst, major, uint64(l)) } diff --git a/vendor/github.com/rs/zerolog/internal/cbor/time.go b/vendor/github.com/rs/zerolog/internal/cbor/time.go index 12f6a1d..7c0ecce 100644 --- a/vendor/github.com/rs/zerolog/internal/cbor/time.go +++ b/vendor/github.com/rs/zerolog/internal/cbor/time.go @@ -7,7 +7,7 @@ import ( func appendIntegerTimestamp(dst []byte, t time.Time) []byte { major := majorTypeTags minor := additionalTypeTimestamp - dst = append(dst, byte(major|minor)) + dst = append(dst, major|minor) secs := t.Unix() var val uint64 if secs < 0 { @@ -17,19 +17,19 @@ func appendIntegerTimestamp(dst []byte, t time.Time) []byte { major = majorTypeUnsignedInt val = uint64(secs) } - dst = appendCborTypePrefix(dst, major, uint64(val)) + dst = appendCborTypePrefix(dst, major, val) return dst } func (e Encoder) appendFloatTimestamp(dst []byte, t time.Time) []byte { major := majorTypeTags minor := additionalTypeTimestamp - dst = append(dst, byte(major|minor)) + dst = append(dst, major|minor) secs := t.Unix() nanos := t.Nanosecond() var val float64 - val = float64(secs)*1.0 + float64(nanos)*1E-9 - return e.AppendFloat64(dst, val) + val = float64(secs)*1.0 + float64(nanos)*1e-9 + return e.AppendFloat64(dst, val, -1) } // AppendTime encodes and adds a timestamp to the dst byte array. @@ -50,7 +50,7 @@ func (e Encoder) AppendTimes(dst []byte, vals []time.Time, unused string) []byte } if l <= additionalMax { lb := byte(l) - dst = append(dst, byte(major|lb)) + dst = append(dst, major|lb) } else { dst = appendCborTypePrefix(dst, major, uint64(l)) } @@ -64,17 +64,17 @@ func (e Encoder) AppendTimes(dst []byte, vals []time.Time, unused string) []byte // AppendDuration encodes and adds a duration to the dst byte array. // useInt field indicates whether to store the duration as seconds (integer) or // as seconds+nanoseconds (float). -func (e Encoder) AppendDuration(dst []byte, d time.Duration, unit time.Duration, useInt bool) []byte { +func (e Encoder) AppendDuration(dst []byte, d time.Duration, unit time.Duration, useInt bool, unused int) []byte { if useInt { return e.AppendInt64(dst, int64(d/unit)) } - return e.AppendFloat64(dst, float64(d)/float64(unit)) + return e.AppendFloat64(dst, float64(d)/float64(unit), unused) } // AppendDurations encodes and adds an array of durations to the dst byte array. // useInt field indicates whether to store the duration as seconds (integer) or // as seconds+nanoseconds (float). -func (e Encoder) AppendDurations(dst []byte, vals []time.Duration, unit time.Duration, useInt bool) []byte { +func (e Encoder) AppendDurations(dst []byte, vals []time.Duration, unit time.Duration, useInt bool, unused int) []byte { major := majorTypeArray l := len(vals) if l == 0 { @@ -82,12 +82,12 @@ func (e Encoder) AppendDurations(dst []byte, vals []time.Duration, unit time.Dur } if l <= additionalMax { lb := byte(l) - dst = append(dst, byte(major|lb)) + dst = append(dst, major|lb) } else { dst = appendCborTypePrefix(dst, major, uint64(l)) } for _, d := range vals { - dst = e.AppendDuration(dst, d, unit, useInt) + dst = e.AppendDuration(dst, d, unit, useInt, unused) } return dst } diff --git a/vendor/github.com/rs/zerolog/internal/cbor/types.go b/vendor/github.com/rs/zerolog/internal/cbor/types.go index a41c797..454d68b 100644 --- a/vendor/github.com/rs/zerolog/internal/cbor/types.go +++ b/vendor/github.com/rs/zerolog/internal/cbor/types.go @@ -4,21 +4,22 @@ import ( "fmt" "math" "net" + "reflect" ) // AppendNil inserts a 'Nil' object into the dst byte array. func (Encoder) AppendNil(dst []byte) []byte { - return append(dst, byte(majorTypeSimpleAndFloat|additionalTypeNull)) + return append(dst, majorTypeSimpleAndFloat|additionalTypeNull) } // AppendBeginMarker inserts a map start into the dst byte array. func (Encoder) AppendBeginMarker(dst []byte) []byte { - return append(dst, byte(majorTypeMap|additionalTypeInfiniteCount)) + return append(dst, majorTypeMap|additionalTypeInfiniteCount) } // AppendEndMarker inserts a map end into the dst byte array. func (Encoder) AppendEndMarker(dst []byte) []byte { - return append(dst, byte(majorTypeSimpleAndFloat|additionalTypeBreak)) + return append(dst, majorTypeSimpleAndFloat|additionalTypeBreak) } // AppendObjectData takes an object in form of a byte array and appends to dst. @@ -30,12 +31,12 @@ func (Encoder) AppendObjectData(dst []byte, o []byte) []byte { // AppendArrayStart adds markers to indicate the start of an array. func (Encoder) AppendArrayStart(dst []byte) []byte { - return append(dst, byte(majorTypeArray|additionalTypeInfiniteCount)) + return append(dst, majorTypeArray|additionalTypeInfiniteCount) } // AppendArrayEnd adds markers to indicate the end of an array. func (Encoder) AppendArrayEnd(dst []byte) []byte { - return append(dst, byte(majorTypeSimpleAndFloat|additionalTypeBreak)) + return append(dst, majorTypeSimpleAndFloat|additionalTypeBreak) } // AppendArrayDelim adds markers to indicate end of a particular array element. @@ -56,7 +57,7 @@ func (Encoder) AppendBool(dst []byte, val bool) []byte { if val { b = additionalTypeBoolTrue } - return append(dst, byte(majorTypeSimpleAndFloat|b)) + return append(dst, majorTypeSimpleAndFloat|b) } // AppendBools encodes and inserts an array of boolean values into the dst byte array. @@ -68,7 +69,7 @@ func (e Encoder) AppendBools(dst []byte, vals []bool) []byte { } if l <= additionalMax { lb := byte(l) - dst = append(dst, byte(major|lb)) + dst = append(dst, major|lb) } else { dst = appendCborTypePrefix(dst, major, uint64(l)) } @@ -88,7 +89,7 @@ func (Encoder) AppendInt(dst []byte, val int) []byte { } if contentVal <= additionalMax { lb := byte(contentVal) - dst = append(dst, byte(major|lb)) + dst = append(dst, major|lb) } else { dst = appendCborTypePrefix(dst, major, uint64(contentVal)) } @@ -104,7 +105,7 @@ func (e Encoder) AppendInts(dst []byte, vals []int) []byte { } if l <= additionalMax { lb := byte(l) - dst = append(dst, byte(major|lb)) + dst = append(dst, major|lb) } else { dst = appendCborTypePrefix(dst, major, uint64(l)) } @@ -128,7 +129,7 @@ func (e Encoder) AppendInts8(dst []byte, vals []int8) []byte { } if l <= additionalMax { lb := byte(l) - dst = append(dst, byte(major|lb)) + dst = append(dst, major|lb) } else { dst = appendCborTypePrefix(dst, major, uint64(l)) } @@ -152,7 +153,7 @@ func (e Encoder) AppendInts16(dst []byte, vals []int16) []byte { } if l <= additionalMax { lb := byte(l) - dst = append(dst, byte(major|lb)) + dst = append(dst, major|lb) } else { dst = appendCborTypePrefix(dst, major, uint64(l)) } @@ -176,7 +177,7 @@ func (e Encoder) AppendInts32(dst []byte, vals []int32) []byte { } if l <= additionalMax { lb := byte(l) - dst = append(dst, byte(major|lb)) + dst = append(dst, major|lb) } else { dst = appendCborTypePrefix(dst, major, uint64(l)) } @@ -196,7 +197,7 @@ func (Encoder) AppendInt64(dst []byte, val int64) []byte { } if contentVal <= additionalMax { lb := byte(contentVal) - dst = append(dst, byte(major|lb)) + dst = append(dst, major|lb) } else { dst = appendCborTypePrefix(dst, major, uint64(contentVal)) } @@ -212,7 +213,7 @@ func (e Encoder) AppendInts64(dst []byte, vals []int64) []byte { } if l <= additionalMax { lb := byte(l) - dst = append(dst, byte(major|lb)) + dst = append(dst, major|lb) } else { dst = appendCborTypePrefix(dst, major, uint64(l)) } @@ -236,7 +237,7 @@ func (e Encoder) AppendUints(dst []byte, vals []uint) []byte { } if l <= additionalMax { lb := byte(l) - dst = append(dst, byte(major|lb)) + dst = append(dst, major|lb) } else { dst = appendCborTypePrefix(dst, major, uint64(l)) } @@ -260,7 +261,7 @@ func (e Encoder) AppendUints8(dst []byte, vals []uint8) []byte { } if l <= additionalMax { lb := byte(l) - dst = append(dst, byte(major|lb)) + dst = append(dst, major|lb) } else { dst = appendCborTypePrefix(dst, major, uint64(l)) } @@ -284,7 +285,7 @@ func (e Encoder) AppendUints16(dst []byte, vals []uint16) []byte { } if l <= additionalMax { lb := byte(l) - dst = append(dst, byte(major|lb)) + dst = append(dst, major|lb) } else { dst = appendCborTypePrefix(dst, major, uint64(l)) } @@ -308,7 +309,7 @@ func (e Encoder) AppendUints32(dst []byte, vals []uint32) []byte { } if l <= additionalMax { lb := byte(l) - dst = append(dst, byte(major|lb)) + dst = append(dst, major|lb) } else { dst = appendCborTypePrefix(dst, major, uint64(l)) } @@ -324,9 +325,9 @@ func (Encoder) AppendUint64(dst []byte, val uint64) []byte { contentVal := val if contentVal <= additionalMax { lb := byte(contentVal) - dst = append(dst, byte(major|lb)) + dst = append(dst, major|lb) } else { - dst = appendCborTypePrefix(dst, major, uint64(contentVal)) + dst = appendCborTypePrefix(dst, major, contentVal) } return dst } @@ -340,7 +341,7 @@ func (e Encoder) AppendUints64(dst []byte, vals []uint64) []byte { } if l <= additionalMax { lb := byte(l) - dst = append(dst, byte(major|lb)) + dst = append(dst, major|lb) } else { dst = appendCborTypePrefix(dst, major, uint64(l)) } @@ -351,7 +352,7 @@ func (e Encoder) AppendUints64(dst []byte, vals []uint64) []byte { } // AppendFloat32 encodes and inserts a single precision float value into the dst byte array. -func (Encoder) AppendFloat32(dst []byte, val float32) []byte { +func (Encoder) AppendFloat32(dst []byte, val float32, unused int) []byte { switch { case math.IsNaN(float64(val)): return append(dst, "\xfa\x7f\xc0\x00\x00"...) @@ -367,11 +368,11 @@ func (Encoder) AppendFloat32(dst []byte, val float32) []byte { for i := uint(0); i < 4; i++ { buf[i] = byte(n >> ((3 - i) * 8)) } - return append(append(dst, byte(major|subType)), buf[0], buf[1], buf[2], buf[3]) + return append(append(dst, major|subType), buf[0], buf[1], buf[2], buf[3]) } // AppendFloats32 encodes and inserts an array of single precision float value into the dst byte array. -func (e Encoder) AppendFloats32(dst []byte, vals []float32) []byte { +func (e Encoder) AppendFloats32(dst []byte, vals []float32, unused int) []byte { major := majorTypeArray l := len(vals) if l == 0 { @@ -379,18 +380,18 @@ func (e Encoder) AppendFloats32(dst []byte, vals []float32) []byte { } if l <= additionalMax { lb := byte(l) - dst = append(dst, byte(major|lb)) + dst = append(dst, major|lb) } else { dst = appendCborTypePrefix(dst, major, uint64(l)) } for _, v := range vals { - dst = e.AppendFloat32(dst, v) + dst = e.AppendFloat32(dst, v, unused) } return dst } // AppendFloat64 encodes and inserts a double precision float value into the dst byte array. -func (Encoder) AppendFloat64(dst []byte, val float64) []byte { +func (Encoder) AppendFloat64(dst []byte, val float64, unused int) []byte { switch { case math.IsNaN(val): return append(dst, "\xfb\x7f\xf8\x00\x00\x00\x00\x00\x00"...) @@ -402,7 +403,7 @@ func (Encoder) AppendFloat64(dst []byte, val float64) []byte { major := majorTypeSimpleAndFloat subType := additionalTypeFloat64 n := math.Float64bits(val) - dst = append(dst, byte(major|subType)) + dst = append(dst, major|subType) for i := uint(1); i <= 8; i++ { b := byte(n >> ((8 - i) * 8)) dst = append(dst, b) @@ -411,7 +412,7 @@ func (Encoder) AppendFloat64(dst []byte, val float64) []byte { } // AppendFloats64 encodes and inserts an array of double precision float values into the dst byte array. -func (e Encoder) AppendFloats64(dst []byte, vals []float64) []byte { +func (e Encoder) AppendFloats64(dst []byte, vals []float64, unused int) []byte { major := majorTypeArray l := len(vals) if l == 0 { @@ -419,12 +420,12 @@ func (e Encoder) AppendFloats64(dst []byte, vals []float64) []byte { } if l <= additionalMax { lb := byte(l) - dst = append(dst, byte(major|lb)) + dst = append(dst, major|lb) } else { dst = appendCborTypePrefix(dst, major, uint64(l)) } for _, v := range vals { - dst = e.AppendFloat64(dst, v) + dst = e.AppendFloat64(dst, v, unused) } return dst } @@ -438,9 +439,17 @@ func (e Encoder) AppendInterface(dst []byte, i interface{}) []byte { return AppendEmbeddedJSON(dst, marshaled) } +// AppendType appends the parameter type (as a string) to the input byte slice. +func (e Encoder) AppendType(dst []byte, i interface{}) []byte { + if i == nil { + return e.AppendString(dst, "") + } + return e.AppendString(dst, reflect.TypeOf(i).String()) +} + // AppendIPAddr encodes and inserts an IP Address (IPv4 or IPv6). func (e Encoder) AppendIPAddr(dst []byte, ip net.IP) []byte { - dst = append(dst, byte(majorTypeTags|additionalTypeIntUint16)) + dst = append(dst, majorTypeTags|additionalTypeIntUint16) dst = append(dst, byte(additionalTypeTagNetworkAddr>>8)) dst = append(dst, byte(additionalTypeTagNetworkAddr&0xff)) return e.AppendBytes(dst, ip) @@ -448,21 +457,21 @@ func (e Encoder) AppendIPAddr(dst []byte, ip net.IP) []byte { // AppendIPPrefix encodes and inserts an IP Address Prefix (Address + Mask Length). func (e Encoder) AppendIPPrefix(dst []byte, pfx net.IPNet) []byte { - dst = append(dst, byte(majorTypeTags|additionalTypeIntUint16)) + dst = append(dst, majorTypeTags|additionalTypeIntUint16) dst = append(dst, byte(additionalTypeTagNetworkPrefix>>8)) dst = append(dst, byte(additionalTypeTagNetworkPrefix&0xff)) // Prefix is a tuple (aka MAP of 1 pair of elements) - // first element is prefix, second is mask length. - dst = append(dst, byte(majorTypeMap|0x1)) + dst = append(dst, majorTypeMap|0x1) dst = e.AppendBytes(dst, pfx.IP) maskLen, _ := pfx.Mask.Size() return e.AppendUint8(dst, uint8(maskLen)) } -// AppendMACAddr encodes and inserts an Hardware (MAC) address. +// AppendMACAddr encodes and inserts a Hardware (MAC) address. func (e Encoder) AppendMACAddr(dst []byte, ha net.HardwareAddr) []byte { - dst = append(dst, byte(majorTypeTags|additionalTypeIntUint16)) + dst = append(dst, majorTypeTags|additionalTypeIntUint16) dst = append(dst, byte(additionalTypeTagNetworkAddr>>8)) dst = append(dst, byte(additionalTypeTagNetworkAddr&0xff)) return e.AppendBytes(dst, ha) @@ -470,7 +479,7 @@ func (e Encoder) AppendMACAddr(dst []byte, ha net.HardwareAddr) []byte { // AppendHex adds a TAG and inserts a hex bytes as a string. func (e Encoder) AppendHex(dst []byte, val []byte) []byte { - dst = append(dst, byte(majorTypeTags|additionalTypeIntUint16)) + dst = append(dst, majorTypeTags|additionalTypeIntUint16) dst = append(dst, byte(additionalTypeTagHexString>>8)) dst = append(dst, byte(additionalTypeTagHexString&0xff)) return e.AppendBytes(dst, val) diff --git a/vendor/github.com/rs/zerolog/internal/json/string.go b/vendor/github.com/rs/zerolog/internal/json/string.go index 815906f..fd7770f 100644 --- a/vendor/github.com/rs/zerolog/internal/json/string.go +++ b/vendor/github.com/rs/zerolog/internal/json/string.go @@ -1,6 +1,9 @@ package json -import "unicode/utf8" +import ( + "fmt" + "unicode/utf8" +) const hex = "0123456789abcdef" @@ -34,7 +37,7 @@ func (e Encoder) AppendStrings(dst []byte, vals []string) []byte { // // The operation loops though each byte in the string looking // for characters that need json or utf8 encoding. If the string -// does not need encoding, then the string is appended in it's +// does not need encoding, then the string is appended in its // entirety to the byte slice. // If we encounter a byte that does need encoding, switch up // the operation and perform a byte-by-byte read-encode-append. @@ -53,14 +56,39 @@ func (Encoder) AppendString(dst []byte, s string) []byte { return append(dst, '"') } } - // The string has no need for encoding an therefore is directly + // The string has no need for encoding and therefore is directly // appended to the byte slice. dst = append(dst, s...) // End with a double quote return append(dst, '"') } -// appendStringComplex is used by appendString to take over an in +// AppendStringers encodes the provided Stringer list to json and +// appends the encoded Stringer list to the input byte slice. +func (e Encoder) AppendStringers(dst []byte, vals []fmt.Stringer) []byte { + if len(vals) == 0 { + return append(dst, '[', ']') + } + dst = append(dst, '[') + dst = e.AppendStringer(dst, vals[0]) + if len(vals) > 1 { + for _, val := range vals[1:] { + dst = e.AppendStringer(append(dst, ','), val) + } + } + return append(dst, ']') +} + +// AppendStringer encodes the input Stringer to json and appends the +// encoded Stringer value to the input byte slice. +func (e Encoder) AppendStringer(dst []byte, val fmt.Stringer) []byte { + if val == nil { + return e.AppendInterface(dst, nil) + } + return e.AppendString(dst, val.String()) +} + +//// appendStringComplex is used by appendString to take over an in // progress JSON string encoding that encountered a character that needs // to be encoded. func appendStringComplex(dst []byte, s string, i int) []byte { @@ -71,7 +99,7 @@ func appendStringComplex(dst []byte, s string, i int) []byte { r, size := utf8.DecodeRuneInString(s[i:]) if r == utf8.RuneError && size == 1 { // In case of error, first append previous simple characters to - // the byte slice if any and append a remplacement character code + // the byte slice if any and append a replacement character code // in place of the invalid sequence. if start < i { dst = append(dst, s[start:i]...) diff --git a/vendor/github.com/rs/zerolog/internal/json/time.go b/vendor/github.com/rs/zerolog/internal/json/time.go index 5aff6be..08cbbd9 100644 --- a/vendor/github.com/rs/zerolog/internal/json/time.go +++ b/vendor/github.com/rs/zerolog/internal/json/time.go @@ -7,9 +7,10 @@ import ( const ( // Import from zerolog/global.go - timeFormatUnix = "" - timeFormatUnixMs = "UNIXMS" + timeFormatUnix = "" + timeFormatUnixMs = "UNIXMS" timeFormatUnixMicro = "UNIXMICRO" + timeFormatUnixNano = "UNIXNANO" ) // AppendTime formats the input time with the given format @@ -22,6 +23,8 @@ func (e Encoder) AppendTime(dst []byte, t time.Time, format string) []byte { return e.AppendInt64(dst, t.UnixNano()/1000000) case timeFormatUnixMicro: return e.AppendInt64(dst, t.UnixNano()/1000) + case timeFormatUnixNano: + return e.AppendInt64(dst, t.UnixNano()) } return append(t.AppendFormat(append(dst, '"'), format), '"') } @@ -33,7 +36,11 @@ func (Encoder) AppendTimes(dst []byte, vals []time.Time, format string) []byte { case timeFormatUnix: return appendUnixTimes(dst, vals) case timeFormatUnixMs: - return appendUnixMsTimes(dst, vals) + return appendUnixNanoTimes(dst, vals, 1000000) + case timeFormatUnixMicro: + return appendUnixNanoTimes(dst, vals, 1000) + case timeFormatUnixNano: + return appendUnixNanoTimes(dst, vals, 1) } if len(vals) == 0 { return append(dst, '[', ']') @@ -64,15 +71,15 @@ func appendUnixTimes(dst []byte, vals []time.Time) []byte { return dst } -func appendUnixMsTimes(dst []byte, vals []time.Time) []byte { +func appendUnixNanoTimes(dst []byte, vals []time.Time, div int64) []byte { if len(vals) == 0 { return append(dst, '[', ']') } dst = append(dst, '[') - dst = strconv.AppendInt(dst, vals[0].UnixNano()/1000000, 10) + dst = strconv.AppendInt(dst, vals[0].UnixNano()/div, 10) if len(vals) > 1 { for _, t := range vals[1:] { - dst = strconv.AppendInt(append(dst, ','), t.UnixNano()/1000000, 10) + dst = strconv.AppendInt(append(dst, ','), t.UnixNano()/div, 10) } } dst = append(dst, ']') @@ -81,24 +88,24 @@ func appendUnixMsTimes(dst []byte, vals []time.Time) []byte { // AppendDuration formats the input duration with the given unit & format // and appends the encoded string to the input byte slice. -func (e Encoder) AppendDuration(dst []byte, d time.Duration, unit time.Duration, useInt bool) []byte { +func (e Encoder) AppendDuration(dst []byte, d time.Duration, unit time.Duration, useInt bool, precision int) []byte { if useInt { return strconv.AppendInt(dst, int64(d/unit), 10) } - return e.AppendFloat64(dst, float64(d)/float64(unit)) + return e.AppendFloat64(dst, float64(d)/float64(unit), precision) } // AppendDurations formats the input durations with the given unit & format // and appends the encoded string list to the input byte slice. -func (e Encoder) AppendDurations(dst []byte, vals []time.Duration, unit time.Duration, useInt bool) []byte { +func (e Encoder) AppendDurations(dst []byte, vals []time.Duration, unit time.Duration, useInt bool, precision int) []byte { if len(vals) == 0 { return append(dst, '[', ']') } dst = append(dst, '[') - dst = e.AppendDuration(dst, vals[0], unit, useInt) + dst = e.AppendDuration(dst, vals[0], unit, useInt, precision) if len(vals) > 1 { for _, d := range vals[1:] { - dst = e.AppendDuration(append(dst, ','), d, unit, useInt) + dst = e.AppendDuration(append(dst, ','), d, unit, useInt, precision) } } dst = append(dst, ']') diff --git a/vendor/github.com/rs/zerolog/internal/json/types.go b/vendor/github.com/rs/zerolog/internal/json/types.go index 9e35266..7930491 100644 --- a/vendor/github.com/rs/zerolog/internal/json/types.go +++ b/vendor/github.com/rs/zerolog/internal/json/types.go @@ -4,6 +4,7 @@ import ( "fmt" "math" "net" + "reflect" "strconv" ) @@ -278,7 +279,7 @@ func (Encoder) AppendUints32(dst []byte, vals []uint32) []byte { // AppendUint64 converts the input uint64 to a string and // appends the encoded string to the input byte slice. func (Encoder) AppendUint64(dst []byte, val uint64) []byte { - return strconv.AppendUint(dst, uint64(val), 10) + return strconv.AppendUint(dst, val, 10) } // AppendUints64 encodes the input uint64s to json and @@ -298,9 +299,9 @@ func (Encoder) AppendUints64(dst []byte, vals []uint64) []byte { return dst } -func appendFloat(dst []byte, val float64, bitSize int) []byte { +func appendFloat(dst []byte, val float64, bitSize, precision int) []byte { // JSON does not permit NaN or Infinity. A typical JSON encoder would fail - // with an error, but a logging library wants the data to get thru so we + // with an error, but a logging library wants the data to get through so we // make a tradeoff and store those types as string. switch { case math.IsNaN(val): @@ -310,26 +311,47 @@ func appendFloat(dst []byte, val float64, bitSize int) []byte { case math.IsInf(val, -1): return append(dst, `"-Inf"`...) } - return strconv.AppendFloat(dst, val, 'f', -1, bitSize) + // convert as if by es6 number to string conversion + // see also https://cs.opensource.google/go/go/+/refs/tags/go1.20.3:src/encoding/json/encode.go;l=573 + strFmt := byte('f') + // If precision is set to a value other than -1, we always just format the float using that precision. + if precision == -1 { + // Use float32 comparisons for underlying float32 value to get precise cutoffs right. + if abs := math.Abs(val); abs != 0 { + if bitSize == 64 && (abs < 1e-6 || abs >= 1e21) || bitSize == 32 && (float32(abs) < 1e-6 || float32(abs) >= 1e21) { + strFmt = 'e' + } + } + } + dst = strconv.AppendFloat(dst, val, strFmt, precision, bitSize) + if strFmt == 'e' { + // Clean up e-09 to e-9 + n := len(dst) + if n >= 4 && dst[n-4] == 'e' && dst[n-3] == '-' && dst[n-2] == '0' { + dst[n-2] = dst[n-1] + dst = dst[:n-1] + } + } + return dst } // AppendFloat32 converts the input float32 to a string and // appends the encoded string to the input byte slice. -func (Encoder) AppendFloat32(dst []byte, val float32) []byte { - return appendFloat(dst, float64(val), 32) +func (Encoder) AppendFloat32(dst []byte, val float32, precision int) []byte { + return appendFloat(dst, float64(val), 32, precision) } // AppendFloats32 encodes the input float32s to json and // appends the encoded string list to the input byte slice. -func (Encoder) AppendFloats32(dst []byte, vals []float32) []byte { +func (Encoder) AppendFloats32(dst []byte, vals []float32, precision int) []byte { if len(vals) == 0 { return append(dst, '[', ']') } dst = append(dst, '[') - dst = appendFloat(dst, float64(vals[0]), 32) + dst = appendFloat(dst, float64(vals[0]), 32, precision) if len(vals) > 1 { for _, val := range vals[1:] { - dst = appendFloat(append(dst, ','), float64(val), 32) + dst = appendFloat(append(dst, ','), float64(val), 32, precision) } } dst = append(dst, ']') @@ -338,21 +360,21 @@ func (Encoder) AppendFloats32(dst []byte, vals []float32) []byte { // AppendFloat64 converts the input float64 to a string and // appends the encoded string to the input byte slice. -func (Encoder) AppendFloat64(dst []byte, val float64) []byte { - return appendFloat(dst, val, 64) +func (Encoder) AppendFloat64(dst []byte, val float64, precision int) []byte { + return appendFloat(dst, val, 64, precision) } // AppendFloats64 encodes the input float64s to json and // appends the encoded string list to the input byte slice. -func (Encoder) AppendFloats64(dst []byte, vals []float64) []byte { +func (Encoder) AppendFloats64(dst []byte, vals []float64, precision int) []byte { if len(vals) == 0 { return append(dst, '[', ']') } dst = append(dst, '[') - dst = appendFloat(dst, vals[0], 64) + dst = appendFloat(dst, vals[0], 64, precision) if len(vals) > 1 { for _, val := range vals[1:] { - dst = appendFloat(append(dst, ','), val, 64) + dst = appendFloat(append(dst, ','), val, 64, precision) } } dst = append(dst, ']') @@ -369,6 +391,14 @@ func (e Encoder) AppendInterface(dst []byte, i interface{}) []byte { return append(dst, marshaled...) } +// AppendType appends the parameter type (as a string) to the input byte slice. +func (e Encoder) AppendType(dst []byte, i interface{}) []byte { + if i == nil { + return e.AppendString(dst, "") + } + return e.AppendString(dst, reflect.TypeOf(i).String()) +} + // AppendObjectData takes in an object that is already in a byte array // and adds it to the dst. func (Encoder) AppendObjectData(dst []byte, o []byte) []byte { diff --git a/vendor/github.com/rs/zerolog/log.go b/vendor/github.com/rs/zerolog/log.go index 6227386..6c1d4ea 100644 --- a/vendor/github.com/rs/zerolog/log.go +++ b/vendor/github.com/rs/zerolog/log.go @@ -24,7 +24,7 @@ // // Sub-loggers let you chain loggers with additional context: // -// sublogger := log.With().Str("component": "foo").Logger() +// sublogger := log.With().Str("component", "foo").Logger() // sublogger.Info().Msg("hello world") // // Output: {"time":1494567715,"level":"info","message":"hello world","component":"foo"} // @@ -82,8 +82,9 @@ // log.Warn().Msg("") // // Output: {"level":"warn","severity":"warn"} // +// # Caveats // -// Caveats +// Field duplication: // // There is no fields deduplication out-of-the-box. // Using the same key multiple times creates new key in final JSON each time. @@ -96,14 +97,30 @@ // // In this case, many consumers will take the last value, // but this is not guaranteed; check yours if in doubt. +// +// Concurrency safety: +// +// Be careful when calling UpdateContext. It is not concurrency safe. Use the With method to create a child logger: +// +// func handler(w http.ResponseWriter, r *http.Request) { +// // Create a child logger for concurrency safety +// logger := log.Logger.With().Logger() +// +// // Add context fields, for example User-Agent from HTTP headers +// logger.UpdateContext(func(c zerolog.Context) zerolog.Context { +// ... +// }) +// } package zerolog import ( + "context" + "errors" "fmt" "io" - "io/ioutil" "os" "strconv" + "strings" ) // Level defines log levels. @@ -159,24 +176,24 @@ func (l Level) String() string { // ParseLevel converts a level string into a zerolog Level value. // returns an error if the input string does not match known values. func ParseLevel(levelStr string) (Level, error) { - switch levelStr { - case LevelFieldMarshalFunc(TraceLevel): + switch { + case strings.EqualFold(levelStr, LevelFieldMarshalFunc(TraceLevel)): return TraceLevel, nil - case LevelFieldMarshalFunc(DebugLevel): + case strings.EqualFold(levelStr, LevelFieldMarshalFunc(DebugLevel)): return DebugLevel, nil - case LevelFieldMarshalFunc(InfoLevel): + case strings.EqualFold(levelStr, LevelFieldMarshalFunc(InfoLevel)): return InfoLevel, nil - case LevelFieldMarshalFunc(WarnLevel): + case strings.EqualFold(levelStr, LevelFieldMarshalFunc(WarnLevel)): return WarnLevel, nil - case LevelFieldMarshalFunc(ErrorLevel): + case strings.EqualFold(levelStr, LevelFieldMarshalFunc(ErrorLevel)): return ErrorLevel, nil - case LevelFieldMarshalFunc(FatalLevel): + case strings.EqualFold(levelStr, LevelFieldMarshalFunc(FatalLevel)): return FatalLevel, nil - case LevelFieldMarshalFunc(PanicLevel): + case strings.EqualFold(levelStr, LevelFieldMarshalFunc(PanicLevel)): return PanicLevel, nil - case LevelFieldMarshalFunc(Disabled): + case strings.EqualFold(levelStr, LevelFieldMarshalFunc(Disabled)): return Disabled, nil - case LevelFieldMarshalFunc(NoLevel): + case strings.EqualFold(levelStr, LevelFieldMarshalFunc(NoLevel)): return NoLevel, nil } i, err := strconv.Atoi(levelStr) @@ -189,6 +206,21 @@ func ParseLevel(levelStr string) (Level, error) { return Level(i), nil } +// UnmarshalText implements encoding.TextUnmarshaler to allow for easy reading from toml/yaml/json formats +func (l *Level) UnmarshalText(text []byte) error { + if l == nil { + return errors.New("can't unmarshal a nil *Level") + } + var err error + *l, err = ParseLevel(string(text)) + return err +} + +// MarshalText implements encoding.TextMarshaler to allow for easy writing into toml/yaml/json formats +func (l Level) MarshalText() ([]byte, error) { + return []byte(LevelFieldMarshalFunc(l)), nil +} + // A Logger represents an active logging object that generates lines // of JSON output to an io.Writer. Each logging operation makes a single // call to the Writer's Write method. There is no guarantee on access @@ -201,6 +233,7 @@ type Logger struct { context []byte hooks []Hook stack bool + ctx context.Context } // New creates a root logger with given output writer. If the output writer implements @@ -212,11 +245,11 @@ type Logger struct { // you may consider using sync wrapper. func New(w io.Writer) Logger { if w == nil { - w = ioutil.Discard + w = io.Discard } lw, ok := w.(LevelWriter) if !ok { - lw = levelWriterAdapter{w} + lw = LevelWriterAdapter{w} } return Logger{w: lw, level: TraceLevel} } @@ -258,7 +291,8 @@ func (l Logger) With() Context { // UpdateContext updates the internal logger's context. // -// Use this method with caution. If unsure, prefer the With method. +// Caution: This method is not concurrency safe. +// Use the With method to create a child logger before modifying the context from concurrent goroutines. func (l *Logger) UpdateContext(update func(c Context) Context) { if l == disabledLogger { return @@ -291,8 +325,13 @@ func (l Logger) Sample(s Sampler) Logger { } // Hook returns a logger with the h Hook. -func (l Logger) Hook(h Hook) Logger { - l.hooks = append(l.hooks, h) +func (l Logger) Hook(hooks ...Hook) Logger { + if len(hooks) == 0 { + return l + } + newHooks := make([]Hook, len(l.hooks), len(l.hooks)+len(hooks)) + copy(newHooks, l.hooks) + l.hooks = append(newHooks, hooks...) return l } @@ -348,7 +387,14 @@ func (l *Logger) Err(err error) *Event { // // You must call Msg on the returned event in order to send the event. func (l *Logger) Fatal() *Event { - return l.newEvent(FatalLevel, func(msg string) { os.Exit(1) }) + return l.newEvent(FatalLevel, func(msg string) { + if closer, ok := l.w.(io.Closer); ok { + // Close the writer to flush any buffered message. Otherwise the message + // will be lost as os.Exit() terminates the program immediately. + closer.Close() + } + os.Exit(1) + }) } // Panic starts a new message with panic level. The panic() function @@ -361,7 +407,7 @@ func (l *Logger) Panic() *Event { // WithLevel starts a new message with level. Unlike Fatal and Panic // methods, WithLevel does not terminate the program or stop the ordinary -// flow of a gourotine when used with their respective levels. +// flow of a goroutine when used with their respective levels. // // You must call Msg on the returned event in order to send the event. func (l *Logger) WithLevel(level Level) *Event { @@ -413,6 +459,14 @@ func (l *Logger) Printf(format string, v ...interface{}) { } } +// Println sends a log event using debug level and no extra field. +// Arguments are handled in the manner of fmt.Println. +func (l *Logger) Println(v ...interface{}) { + if e := l.Debug(); e.Enabled() { + e.CallerSkipFrame(1).Msg(fmt.Sprintln(v...)) + } +} + // Write implements the io.Writer interface. This is useful to set as a writer // for the standard library log. func (l Logger) Write(p []byte) (n int, err error) { @@ -428,11 +482,15 @@ func (l Logger) Write(p []byte) (n int, err error) { func (l *Logger) newEvent(level Level, done func(string)) *Event { enabled := l.should(level) if !enabled { + if done != nil { + done("") + } return nil } e := newEvent(l.w, level) e.done = done e.ch = l.hooks + e.ctx = l.ctx if level != NoLevel && LevelFieldName != "" { e.Str(LevelFieldName, LevelFieldMarshalFunc(level)) } @@ -447,6 +505,9 @@ func (l *Logger) newEvent(level Level, done func(string)) *Event { // should returns true if the log event should be logged. func (l *Logger) should(lvl Level) bool { + if l.w == nil { + return false + } if lvl < l.level || lvl < GlobalLevel() { return false } diff --git a/vendor/github.com/rs/zerolog/pretty.png b/vendor/github.com/rs/zerolog/pretty.png index 242033686debf04c5b1756c166d05d09767594e3..1449e45d142c74d023eccd28c7f9e03b0af2d2b9 100644 GIT binary patch literal 118839 zcmcfobxa>!8wLmuR@@zmyB8=fKiu7&;>C-*6?cb1ad&qwP~6=q#og_PE${n0Z@w?t z&1V1Eot)$(lgymSoLkO)-PaYaq#%imK!5-M0J5}{m(0{9L!VKt@x@8l)#7cEX4IccYi zJ>(2uE@cqbjMw>X%DM-rAWnfGm%DoqRnTaE;w-Jc-Qv}24+#hs$yK7oLiqoDy6XL2 z0{`#AEBw&2lD=I_GatiET8UEO6q)|_QI>dgQgGSgPM=LtpA6>rH zDj$T$6>)P3kp2C2`t#o8y5WsOR_e+3`u?2V1`qgjz+>?ekRTO%&s_dm?kik*x!LkE z{$m)k1{)D*+58-)SAopvbCk(u{AE5T4*e@E}uiN;%CH# z+PlN`zE$DezzFudGySe_?dZ`f4b`bDUO(|x4*4EjuU(qhI1*})zTfm;JT2M>6_g)v z{kwHZZlQny&cC=VSY77RMRyOSeY3t)~_Gj>D9N97{ctSQse zr7lUtb!r%KE7)bQm0We-RRN(@jy^do2r}hY7+RKUDh}?BSrPT`-<0M!PA+((ZO36% zdq@|pzxF2t$I8L8QhRe2HL2(y1h-#@ua$o@p;l|3+#*|-8@@pV^}iOtBUC%0gvc#c zD_J+2-;vO4P1e{1@B;SEPwtqQwlo2;Ffdp>5y zAecG5Dgmo`PoF1)3bxn>8*11J;%cf4cB~IoTEtFd5ud$Z%)GdpBv0F&`*Kt^6Zmxs z0?$nJ?8Ru->-nJqPCQ9Zv4Zg{a|Dy!k^;?Gk`6R6c~?)kWW~fw;?;Dh5EQ0*tYcD9 za?TK0SObHOID}BFTRKy0?TNNvtlm3xrxZf6H)U(M_)t}lLOQD{i2YG?oBB!yL^wXCWzDP~#I1Xv40 zow~TNJhKNL9cvSVn~N$D5CjNsaZ^LR19du6;b`XKDy>rVTpBCwtyHj^T|_B`RU0yl z*c1T3$fY?Xa#hACB!*F_LX!HD9Rn?VS)Z91Ry&K9(Gu-P%z-p;G=FQ+H2y7qZdXOh zbj7#79h63yd3b3e##9M=i2QcBvqwe_0Dtm`rL)?TmB)ES1-bZAX_9X_;j@2c-v3oF zkecqxCtMIu0%_H>z7-e|^UC9ua5fHHpDRzYh$}x|mdKDnBi~u2UknyrT+*K~GZQ)q zo*hOw3@zd45iq{4v`5it)+HX=TCd=jZ+peO;^f$FzYf5d;``ODm@f`P`hRa6gk}P>PpMhx6z_0%7Q3 zg<$HU5MD-O=dsSVr|nT(QOB0DeG0l*w%V>4IRa%RHGF#pZI0&7plLBt~Rymwq$r zb+;C8YbS9&-o^X~eyT)ub=EXY9kJ{J<4wE?=~2I*pLWyHpG+(zaFq7LW4jL%blu%~ zg|=tmq9kq^?q8eHu9ABVf%=R@KbvU0tG0`k4cjLLJ@^P|mYqU`#VQH|KMM^KLiB`| zaRb)#bA!=y%QB8Ox3AaP5Vt;Gew*tLBHzZ5{Xv{nv0}~>Qb|h^2E5Ns^$90v77&PA zmU{A5`sO<{%q~lo8M5v41U4sI7#VjXRQdwH_mOYUII`QBDbL6L>q~Y7WY1(N*Z>gs zw;?Pv*TWXu(L|t_Ig_yvt|b9Off1cEhln&cE4e;3H9rkywqHTYS5Hc*qU}f#pBwCa z&6!Fb5bxy`8Wb5zJjq(4MK98G&ELBuWJw(pMNjv}l`CS|3taHWvSP@J!8I^(Vk*u| ze6!rO2(}>_4eoBJ*OPOlNJot8`}DCp%U(yGB!-e?KOuXAQDVtwqj$p-dsuHJN!B{0 zdc}`}ktZ7y{|BGfJpu2Q-?q1C(@W++)VF>Yu;|mapnl# zu&;VsZMWu-Y+;)4-}Y!>KIFmc3YgvOH;=e3Z#m|(*y(W7%lNo%%E4+3+Fxm*^jx0hSutLqSXABqtV?-s1J2vfC7NGX z$84`wh#B@~Jf-Rnfyoebu|j$x6LRa5bZyqc8LV^+I70~lB5ET z$oa<&Jybr7L9yD?E+zM&yS3Y`hW}Z z;jL+=$0OM}9&`vd;|O@*(+AFlt3gi+3~5TZFkT9#RM>%`wFbv+m4M!{AQ(X|f&3%@ zBmDQI`>&iLGFT@feZpiB@$n~WDC{pG6G7VQ#{gxqA zk+1gHh7%QtD$EZom_D~@$7e{r=X(0A7_wlh|SHi}V8%;xPUm;>&YmFR&p5SZl)E*X;7vA+U$Z!40d;dt1xRzh zJ$-*HuiBqmM@}I;V1)x7p4XmrVg&>lC=%aud4<0?fZhFz`|jL+64L+f*Xs)zhr!0t zpBF!n`{256&&uub{=@pqr!)MUc^jk?2R=q#W65*mN_^cJeR|;B)2p|*c;>Lp;Gaq^4KyG@ivg5m?Utlmpj*^9G8*gSOX9u?FF9@7Wi&aqg@|nk@Q$MB(R-&mCLH$M zcY$+E8pjc+997%zid;{ZD31mi3ASH0Z)1pC*;)cBkdu}7mTcLp@< zGQ9}a-+b1wzj_@8Ik@}GPVWjfx_(I_&}wt3cRuEH+{@6nN6M^a%4_Opc1U~ZOEKI$ zu<6xkWecy0FMJ=WPiKLKUb2K&(S}co=N(^Q7M)kdU!685G4;ykF_K223mr`uG&cqF zi%^oD9(*5jTvA|V){Cn*u1D2SAGe80Z<+Mkby{4B1h3aU7~Z(-Eo9$y$(f5?8$9>C+-=3f8}xyRhjN8EqS;2aY}TJ8M^;$&hO*YjeA}9 zE(MAU4{e^05JHf#3a3=76B=&^y-VCnM!+976O-~Yox=Uo<1t7e)qPt>uaYn?UKgQK^-k-xI;QXSb`T?Ls_Gi{bsA*AAESIAYhKVYV z%&6Uk1vG*p2_HWB(cB+@$w&U4#D#Ikv{*=X-DP^4N9Wk>mXSp4q~!p#E>f!2o<5sU&W5n{%QS zD3bsy39L6E5Z8a$=+aICP-^hbIyMR#hm4?fB`g8`4 z_M%?>RGnJt3yqNQSR<974jlwhiiA%W7mch!bHUN%MfLdnD4G)rpe;SJpUMO781Ct@ zrGnhvtfk6Cki!=(!8Rm_LV!1XI2`q58uW0S37<_qsun7$U*!0kgjeCjB1%A>Ttb4v z6@qYJ&lCY4t-tV>gWqHLqFu}5n#p=LFZlMe68gRxXl^`pD7h&P2V3^abP8+{b^`iK z*KWs2orZS~YDoIFLR=g%N>XVD zX&pF>4Rj3Z6}}p8R_TZ9=&R_(WhbVoPL(`^8q3NcCFaU#yf@6``Bzql(Uc3J*JJ3s zIj4yd@Cc;Pfw-CPy(3?7;l)J&AZ!1zqaX>=O+cTWoq}3EUrh>~PC;RK*F%*Uh|6IV zy;?@Gp(F7~(TWkRKr}h;0Y!N;cSOg&d0m6DT}bT0AON)dgZ3S%p<_1``$wnkqICSlvF)1I<9*K|NFuZhTUyU!2BlZ*O-O z+Y0(a3UOCvM$|~N?|^wVv*-HD`7Y{DdPH>ji}f$IvJ*8{41moU$WklOwY#z<-w`8k zd-hrlGB~k4TKLh7Ogi*2GUN@s@;aEPv2dFi%}`$ATkz@bsFdC9?^RfgZEUTHchn{O zZPcD_phL#xFlBkfF}a?BTu*dQ%SR3dcC{r>=WnV-^&sO$sq- z{A}m|QZx^(>nCZI{2E*gG86bMD_-o@S5#QQU&;R7af{`K-;JzzYai4=GI`Skh>`Mz zt+pgb(wEHH$Gthbsz?Tzxi2YwtO>5BaF7{2*C|3)0=;sS3!ZeqYoP{6yR98!`SCPg zWyh)0nCIx`GlR$<+wb;cl+bxC_xynW+qta%QAOJxSN97NIbY0>6wbjUo%VB7sxrmW3 zRT@D>7115dXh5y>3-Die$lJa5RWx3JarBrIY@GlbXWc%lp1vDDN#sq6vdR?XMTZw|ST=pzv6CCSQw)1--q0S^Ze+)0)X!I&T zf$@w0W{QfT{rpYP+3N4nU%f&R^R2_ms8uiZ7TejdXJ*rtzy5U}9r9;sDmWl+sej@3 z&LuP_h=ZA*n~}Nw*JmM>1T>su)4w^95dJI?h_Tj6V|^bch%%g6rwd?U2XH_P%Zi6v z#!(RdB{M3-lX*&y5f;7ILI^4ei28bF<}%w_(JCQQ(lU-Hs2EwW02*9Y#jw<9DAnGsc4v7(MFRq1ZECt7`ng9hbsmQn-DBpbeOI(<*$-(r1_EN?oS+DLP@ zUkC2k%O%s;0e|SM7w`|ir%$pw3gZpmc7EGMP^h86g3W)eMEz9kLJtJbjO5^Zv z*Aq1|3;^1lwt(qZ_8`!B=C03+ro<(Xv(4)F7OWmPg2it$Wv}IS`D%jQnv`I0-Z3k# zlN)16-Xw?5?PeeKj)qZl^J|kRDDhGSj$Xh`EVudH2RIPjBKlPuKQmaWYE`2ITW-a8nkK zMzZ&z@LzkRZHvRQKL&%~x z5JuVBIn*-A;^MTi2~+?O7x-&M$a-?v*>v*Tiuwak)`)(U4wHEIzHYmVzR9Sry@iHa zoJL3KJrYczl3*zF=w=h(Va;#hw8RhBOv2J~0su@_T&_B*u=OpSC??Lqr|sEp>*aj8 z)x(u|d?fZ1NI;Zhe*(6;D2|D4wP2G$=iuZI@b&R*S9^lE6U6^A3f;4V_@VSLV;_RJ zad=FOT0bcuB+@!ln%Jv{|LxXXP8e!4cD^)Vf1*H_&QvKQ{>P75rJ5M$lU2S$lRxk9 znFMa5?Q_Vdz6j@?5Oa+fX4fJWXkcYba;sEbkSsDt1X{>F3y53W*&)ZpC32$CjQ$uu z)3C!x?7t5WkZRDnGi#{gTr1;-{f48wF|Lq%ENR&9-D+8~RRx!IZMK2OnFrMA$H^*= zr|i!ZtL3u&Ob?T^8LAs~9;)US((AB-ZS=Z!*Nw7UY5^dsvt9t|7Qt^Vzpvc)r5ucO zyV7bhxmBrm^Q|xTN$}{chzbhu-#yD(7^}UgE6066A~ZEnPRvr=eA)7PGFD?5#6)6^ zU3?&~jc=`m#voaYo-+;2T;1U1V8$PWpY_xTi`Sc5X%?i_{0j(SyIs7Xx*~yiRl_0t zYkdo|8JtexIbaA0suzxqe_w9Uj95HA3IS+=-fj7WlEbr4jHc`Ox}SicH6CUCTZUAt z2fkkgUW!5eL%%T2IH{A<<8r*7q20#FKh+Dt(X$P~wLaH_9c7sko$M}qd~qdjoBH52 zV=~~zzFvsxO(fe7bPRk1ecDuwitDdCesCL6#}(YZam#+a&5@Xfp+rm4R8uRR1A4Sp zbW*z4@DK@QKYZtIEbI7CRU?t-rF%EOQlS60>gE>|mcM*$EHWh9331VBVXj$Ufz!LYC}T*a?NRW=ryI%&{_o0d`D>sZ+S zHif=!Ls{X_e9u)af5>%N&5iQEz8Qx{-Nm4pVB2F$3c7J2xClq%PQg`1AEzd!u-edJ z>#-;5!-5u?i=Cs|S)!u2>DHF{2qaw$a>ST*K3G+2+3cZ(*+t()*t=(ZsLacj4U+5~ z1iR)3E_kF%e^12l;_Lxp$>|xx5CGligJ^|6j5~4OV60{r6{l)Xq1JX;(>k9@7*z@c(~GyfOo1gYg~&g$(l(YqlrLF;oZard zwn8?7OkUbm8toK%7Dzpo&O0QnIq7s&9V-8WY_>^~tARPC*3ZR}3m$SxaHac6Lv%At zjZ1T~wY9A-bF41&Er)e>Pmbshttk0Vbda5N6n@Q(jxwSyS*r+{1dxMl$mP1UpIXLz zq<=YHmi9B&dvg<-@aFNGaCPT-Cc}q+JGL^&>20*hUn89oC>#^=O>Ej9o^+(qQ}`O{ zqxngeXOILc&JT>pBy!}DQDyy73U$JoXa%VGxw)IbH^QC$Wqd#b)(qz&|>3B76ulRqp#5HEyJ#5Bv>5nu;31j@+aMHNR zdXe{?D->;aeQxx)5B{MsOl)qGaYFwRR-5G~%+c*Ti1~vSi52T|oTz%?{5V(=d*Y=Q zs`HkB6Wu?H!gn4$c8uaz^P{z9>mSOmjpc)1Y_#q`L-zc~i+^e{q?2ztLrB~T#l!)$ zn#no@Xg2(t?X&Yx?Rved%h-X57lw*=Ky-xJWSD!-6@h!=WFn)g@jT zr>3J}nLa5SQQcZ8Yx!VE^2T4Ze`QBrfybQ}d9mif@jnWHl|OPw!8wNU>rjd+q)qq9-|h@P7A}a;o3Y9co*c`2y**++98h4yTSR8ABF9I?aaBRO{GH zGVzZ9P#(&AW3mC3d)S2>m_*Ro=aiJ9{d$90bZM_hoYnb>;rM0P4bv7TCwlpLp@Ye2 zH(Onej?2v(Y&AIzT4yHp@6U3=Rjl*$)?cZp@P-7Ih8k?L@e{o42Q?8lb?eTo2w;I8 zyfi#xTFly3i`m6lVRfCZBrQ^#shHD+?nb? z%sQhF2z|as{b;w~dr%nPE~w?o7z!(7ytxI%^v$|a0 z@gMevN+b@g+EGIi(#FVlhysR1@u|E9g80@-l^{UqXvwR<#0OKa{j7Qg;=O@iJQ=*# z7~v|6fJq_{Wvj+LfdCB$NCjWOdb{>#5~9!hR?6MKXBnTnRj@{eDmAW8Eb9r9gg`An znCDi6`S@m5v zu7}w&h*HVf&ubNiPy1f^m_j#YxXf;(L0?@3oOg38qMSZPqCc2DBYEmwYfrN_fdh|* z*UmnhQM0dbYN#nKTb~TCYz+Z~MQmOK+?}Z^L^mD}JF9&@8mf3&`yGbUsp@R_xcL?F zgOHQoF}R%Lh&C>R5aionHk<|EauHcRPI&SLltgqUw-5M-f*A=W8Yj{7soOS6)M~PHI>GU(RXYbIre39p*-q#T>%^RAnLYSvEj-k|)jz~W9qyG3ie1rL$znin2>4`Dd; zkOkY%%sd{Y$-(G|Nsa?}qRY5s|0XW+!!xIOwV130TC`L^NJHjd|E~0eGHP2ohw0Vtv`QH>4Jas5>!$W6J=-t zf1E@~1aY?C>!9M`c*{qH_SWTFE34?M4TM<8sH7qQW^#_J;kP(FBwJ7cFYhf;Aa*C% zz2+T+<8~^7!O)R5H%EtX2=w7-!lsjw8QK1YWx~!!NVhgoj-8b}s3%sgGV9~>ZxM3@ zccn9>K^k8J2ZTwiPc7w|gJO!=QfE6sCb~jf=PK$9qg&RIQIC#XWE0ETk^ z_v>r;h2(tyk)|PUnGbYBei;{iKeT_aDy|X~eBM2a2jM7QIh|h4S0a$~f(5|NSPfr0 z9(HuOwiz2_xGTTVWmh$AvPCDVg#}Aum<3U{t*Q0cKRQ_5!i^z*F z-^dD{v4e$XzDWl4_oER5pRUe=wA|5qJegl;x-SRj$cRIb*JvN$?Wsf_M%F_}-qd~0 zug1wC{hhs#?y3tnhdhza$V7pHgN0qM^#24|Rys#lVY6Fk%}wniFFI`&0|^TS>Rvmt$O_pLjI zlkVu@<1^015U}1-oN-g{sn!_uGiY?Z4?ckG8X;}=bK3RFWKf9x+Do#)x<6G=XnOHw z{QW4f?BD9NO7bLF<9!TbtUu&D!X6Ipo}jz}gdFP}xgpJ@?I5!?2U~4)u)#N}Vw_t@ z<-e%J21=v{>t@YX6}{Xpikf2!tswm8-HteBD4gzddvF-}b}&&-J1*p_1KP}Z{8F}? z*Ia(OKZuytj?Hu)GYIHsr|W*JjWwR@ua}!L^D+13_C9|Wb)W}&*mU2}vzDJ?VHRJl zrm(Excv*NJ(tghic%go5$H=3U@;H3S5?!B2_Vzylfzf{lV{fp*|5fT`1 z-8;KZm;`|xXVWg$5G2KoF;gcxy@p6^cySi$hAsYMPq9C~_g;0{jmrU!gsb#isBnOB zTq`7LyNAB$iN2r{sY!@X9xS9kZ(~FUzX(7U#mEFuaWpWq3HmFZ5B@Mxx-o|R@HJ*o zKs;anRokaE81((d%g4v+-o^qQGSAmy^+xzSbE4w-sHOkFJ%+nxsm04)ak@|^@<;F~ z`0mqhASg1jDxpx)@lC*;*=|JY-*z8CSvwXAr5`vA=HDU2CH8v(|(okFUF{qo~g_-bkug15JMMf~DL+Ia_;{a#C# zUC7C7JB{?lZR9<}9fmOE;xcS+0y&gDEPt57WLVq9qD9|PSJi+n6u!&Bvi;DSeNz_V z_>eq&tHbNuG?X6+x8u>@%#xwZZ3b(8D-n_)D_w4bbiQuiE|x;aZ0WT9f@B&I_PWGg zC@8!2F5Hi435Ibvo(|{dBq%jKOpUtl2FhDdi~$MYxts*vmUAa%VI0n#8tYRG0y(xOyq*+CPwQce9GApdxU5dxNx9#@a;mHYDOLRR*Cn!DUF}Pc#B1cD z&tDpGp$1mIH*W1pdBVH-D=xk(lJDbX56Nq3X#!A$CIF;#YO9jEY^NsSXtpN+4M<gxt2%318vlcqg@+ABhynApfYup75*2x{oZmezo_95V}4v_%@tq zV*&ayzzr%-_iBfi;~m$jf7w>RfbOx#-0sy2-MaUKT_;aJRsU^sM$*8k8M6s=1|M%9pioa`JZG~-Zt+}^H2|7ipV znmsJ**epOV!UF)Z+R}1EKh5s8iXUE&<+06F^F|g4KE_YAV@8;A--4+ro1JYf9v=XG z8Vf{k{&ZM?+4;I``}~=s>_jWbg~+q}&h@<5Cs>}R?+BNu-D~|)u|1Y9wG3@Rxy?mQ z8wYSXpup@f>Q>c~K38r48s$ zka<*GRoA!c6g&ZX{a+X4p&_mJI;$O=KMylOFhah+rLfPwVg;A1+08LVrYRJo2IWXV ze#+#dbQH}pOpZ9|v^avSDdXRJ#%Tk0l&(TjD9rr9TL*Mb4LqX~)u%t(P1O(9;0+!H zk?_F^rbUBR-@kK>HAy0Ibo%Yc1S{hb5kMHd>AG9HH6>*^q_07P+0a=Uib&ez_ilTX zF3(+G0_CRjO*l-R^b?pl9TW}>A$Yo z)X4lUgvXshYiotKHO4+j0UW=!akc`az4Zu6+|h>PO2x~oXj7fjJ8nX!+ctM;LZCw= zicPUCg-WcAx6jr$eo3imq*1+|$ELphG*tA8kNgRR2zdX>zu2Mq`gN$_e$C$Z;8N6b zAU`K3EU3a8dvHX~W{uaAFZmY6dmzoskhrqyiK7}jE=qJ%qhs&Qmc?hl<^r{t85!hw zWp2~eGv+n*1HulB1S$A5!FCP9Hd;o%{K z{dI(VcY*dQG(HbxQf_!1Tl9iA8!=%_!lCm3McXo9fodF;y{lu$xUE7=oqSVQX6Q*y z#X8vagUx3*u&og(!Q;#H_fCCI#hS`?Mxx_`qaKk40>EE!MbILl-S|G#SHiZ%Nlta5 z#6D{XYVen`_Ml*@yeMX?PuY1UlzsO-cuAADRR=$!wRf(>D^+px zONjTUiNZA#p2{W{1f59}tc94>CFFAe=x516EG_UL`lgg{$ui63L*j<@nfd~(fg2Rk03T7>`R^q0czu_l{QPwX+J4;m&!qzu1LRXLL42?W*CL!)*5ReiPHhS^$jn@+9 z)Z_X;*UG+4FIG`GWpVBj{xa3;#xU4KmP24>`gs#`wm@R<@OjYPY@TT7FrFvflM& z#H~5fnq#c9=B6pKX(T49g zRcw(HV&T6VH{i|rwy3z0w``+mEd+PNSev>#3xDvjW32!VjiLGK$Y@u6wrypM?AeZ zB&wAfA~h(dryH3ZmXi;Qlpj+UAVb(^BVO|*Jv=B&5_VY0_y048%kjx%^qz3U=P0(dhylP)e6bSpCeq@Yt5%+db&@eZbkdgb=lUyHqzgD8M$FzMy z)5(vb@Ppmj=8gF@!*(3W6a(U`I#qD1_8}cSYkX|4$oIgrXRl6m_M&vhkaFb>A{L{bZ<$$?1#*b<(A65v*}z;z?%{>-jd;1$<*l)QW`U3;fw0EhYEXX@+0*vwhj1rvvr`=> zdlGzj87&J18U5#ry=14ik30zryqxd!Z5`jbi!Z5r`_Se>ZYN)2oV93~NG;(hZv_1W zDswgBLpeYNY=K_JG_sVKB9;)+u{5~>^SYJ~nTA%x4_{CvXg>1ua=>7PkdvhQ3!CYC=EDzvndxH^fM zhe(k_=LPiYC8P@x3+zDs%|fkDHF&ujHyg>uL8=*q$6a82KH3byIGR`X+C20!TMSw( zjyakg?lZ8=p%6>&ttcq@^K(D;WTkFj##kUN?Pw^|3A`r2>$Y(d-^s^K>zqR?0Dj%2 z(ABIKc&N#;_jqp*$WC3rE?~Y?Ev-Y~A3~}mR)}5w!FfB!7LwOyA1bCZmTk3JdQ z@TgP-e5cdx&DOftq~M7CK|lcZNL_|^LRR`^0Zru5rua)}CgEDOg#`(VqJ?#EZdcMY zmO0H}FpU1&{l(e(U?5vV<$T%LhIVQ<{`yO{ro|)yUyd%HWMNkr%S4oy`^(%JN4XoU zsnY+b@Bb+sj)1greuJJwwwAH(knmD@TC9;#WQqJPtSWsLz4r85Y!#>f0mTMa7pdv~ zB9EwR2b}r1ew^0+lDB#1QAWj&$0^7aOFjWfYc1}w;?d&&f9kRkSx8xVq1=w=1J|Ed z!?-4DA?y~0#yDz^)Q$fM3tdcBT?@Y&gqWEzj>PFZybzhIfe9Lp21vxps+AD#!b zeq$n%laUn|SxL3Dj~$aAE^O2*3DF5sIVAjWDk=Z*L;R?%L?j@V&6%X}y9}4lg_~35TJ!!JEYwey zrOqCEr++q35uN^7*@`c?%Ov$oP$9)UL`5Yd`6H3*`Q1y&M-C38!d6vu)*36N=`|>X z;0?nhPBGG1%#DV*N?0PnNJL!WtOD0mhA_{nvsctgOKb(j8lGkHs3uL$ECP7sJf?6?l*x?Agkr%YbyV!&_1G ziHm`W`DS9g99Q9^pf7u=f;ENcn_G7p*VOv2f!;YGO>$GT>9Pn!N0sfo-tYEVpgOm= z$CB?M<1}^npZtbt>O(!#)CleJh7ougFIUaFGsBoI$F(}HQx{{p%_ae0m=7E>c>}fl zIn29M=nqc_(Qf4U&BIH!70ZrNq!KO5)XVSvwGHt0{aXr6Gud{PYVp0=Czh@)gN5TV z9F&_ko7tK8(~Pn2sozyZpCt(ar5Tp`rv=!|qQaNqlzfbyN@wF$gu;VZh>uVKw{a<6-FHXL$WI9E2oazoJ0k#AnH z)S)qcLHkdbQ6r#uR{*_>=^`Nh5z~3(Q#eZ4?Qfr3)BOgJJ1gS<5z~eF|DVNl>H@>a z;f2P~@4SsY1Z^pUU)y+)(n&HtdUt-j7|={uuQj>nE%+wojA9rBw9ZIa3ssr03R(A- zSG&mBjL&ypoyWfs95<7&wHeOu%1V)@;L{T!C&z5O_7!#1AFQ0)Pk`^dJ=cqjuwGJ5 z^|%&wt6g`3pe2a=aD8z+z&D!ry47Ln1;;_koV%itJ3fP`oIEWQne=`vizl=H70^x1 zcwvo1y7|Rt=&t&;s6R%0^YHsKmnuT)rCnXF(_*}Rx^Kx8#Hlc!`smwoI*HGm7a}4t zU_4hX`HE+uxlP)C&>H<}++F+<6@Q*BV^8}X^9NX7x54=rG|1_4JNwVrSQLH<^=w!s z&0E`c=rqb-9gD!4F{3}BtNN9OBy8tjSL#z;Td)KTg4cfofHyPA{j)cv=>L>>ZGT1j zT&sO=n}0s`Z^^RkHyRv-6!2oqNmQmEDgWcCJ@1}sGU5!%n}~>(s?NOpjk_n9X$hO4 z<#Kaf@)}*6D?8n2x7nH>*p&m%;-`{CkohB@3h>7Z&?>Vxwkqi(ml#|tZwGaGvr>kZ zdkQ98{Q!;`#tYD4#FKMllyX0tj-V#Uu$nfil=Kv?E%{v;LBKg9CEXbaZrp{4P_msr z-W4TgWyfZ>QP;FgXsj%;AK$Mt{DFwv89+cBj9G8vCWMdgX?Xh1q>K0=_Tkp3vK5%Q zeR7^G;_57b^T!g;(CRk7-Wo;4ybiCLDKx1zN;L1-%Wk%q3|#p5b=?3nG>x@~YR!xE z?&u5oEeYS4_hJzxf$4v7=c~McWC~3?&rQkZU*OQF^|?)7Vrv?ap8fUBtL4G+m^H=e zgB4f&&M(U|;aP3u#cwZle|4(0pN_QGfBopZIvkk4eu*0GRjH!o;HTwgWMgLH+SZ8f ziL5=~tL^T@gP@B5yR8nK4p#HaG536k@uk@B0u@&`!ok}N_|$*hYz^Lz%xc_~;_No# z;4%i-X5x+|TZi`dRq=;;9tRh~$f^;mPuH8y`;&8i+=v*IeLLm-d+TO?TZ>K>zIuXv z{d(5;oK>Wg?-k1VhOd;J5;NWwLwH0c+JjqEIH#8qSinXX_|6zxZRgBTtk{Lov-zTI zn_TPh|J(YZ&ms?^j12F<_isydRMG1ddMd6>wQ4FnG={B1=>XUE5J z=XCIR*3Mus^zX9r*Q9`aMJ{_MIt;wlW;dz#a>T)a1V>gJ&OJ*KkC1k}KVF$?_l;VO zRvz!2Xv`{M91a)I;aPIiPq1$_j`i^N_ug*&3r<#*wF4ur z$I1RVy)K0RoY9S@-;3b9=y%gD`^n?x!*NWGqtxR&y{pv@R~2ZnpYA7tm-hC^<#AZ` z^|RZ=27)b@&3AW&@s-*%QqA{2UM27v(EV5*bu3P^mNm$`(F2qGYzs#I!E;$~$nUup z-`G|Xf)nO;FjTJxA(O)Y#|7}z(3g4MXFA9Y4fvY>>gjV5x<4xNqhcu1Z^Dlw3)JaT zhiuLE(AT;V+TEhcr;Yv-S>MIEj}n&bomPBM3-W#TSsi|&E4&TT)tk#c_u>1tc@QeQ z=j*~>WgIT1r`P|2xKC`y-)QS<+S-Y+cKd*IO! zH@n(?Ve9{1?}zX5F1b||i1<&jmxP-(a3VK|FtQ`u*mfF`TO&d2dqxc@CX;Zs5yM>Z z#uRl+)P_tv*Igc&h62@tOBE{FyhBK&ye|g57EVX~-hf}y8YMZ7mZFR&B|VC2&?Cm9 za8fn;-3^CjPR)4HdWc^L9Vf-;D}$KNf$!$#&Fy`&pX%f;R55Nnx_M4+sn++mB#@-L z_9!3(`0}Elziy>wVDzz=Da&eGVfD&cbRZU2|$6uBt3FN#w*jimg zA(Gtz;M~5UWw$+9_E7t52+>fMy65s?8D0yJJc(s>W!GRnwe=5B1l2ukLp4S!k`w9ULjnmu zXM^|y_ZqF*B>xFBe`iXfKmh;*FkLb~?oNh)l*#Af%#oU#cXQ$IUlTQ;mVr*&;hlMl zKeZR6-;P<_z8Xd#j+hx-D#X;qJlRLvRlc zAy|MwaCdhJ5VRqVRDZ&u4%YpyZp9OHeT zkzqBBH?8LGZW82%0nr*{#`-p_a_`SBtAO(s9bNGUs37}=_stR-NIW*)skBWdR z*Q?~(`-!5`_jbiEMe{nL<|c8S?B;6BH!YeNU$M7A_ns+v$@j!{HPy{xR zQoTL0af;s*yfNe*dt4SPLF&16Cs~m$;4J7lZpUm4HijGHbF^tjZ|N<446EsRa6daf zv9LFJOXw`svZPJSR1*v9Xee0k3vMv0Y|xRjdr-*cb=KNoqu?v@Di>rF;5uIx^L}0Z z%E1v?#(!52GQX_92z=^Tvm3)O`%s{c4>m8L>z9%dZud5RHGDjqOUhe>?b28r6ET_=CF#8v%p1Z88K`hww!OxuSvMS zhoN(?n*RZ+7GU$AkApFY=)@A`gvX4#oRD)Xl@8laMC+-SP6(VAr+2!c{*O zT={?U_BkrX*9gs&k-B*F_PZF>(=kSWguf(YJHH67;H;NjsF~Q;48=NK8Jg=~RfuJk z#q97iIVx2LS$d5Yut?RvC<1n&&+8FxUp)?j@`g61FytuLWr8Sn2N zcgL*e7jsK$E6Qi#Zjk33SI%Pl0;yxn?b+s`k-f16T}l{-VR{MyDT&j|{*9s#d+&U_ z3~l52iCAuNPOOIzmZi5m)PYH}8R^QEKznBJ0G_NQANbC7L{bSIoWw-;?ZfU(G8WRZ znyAY(2^2D?hP!O5^cZta_*5yC%^B?Owc@S+m=D8a?}QfaGX53>oLMMd{z_gow2vOF z9S9;$l*T&VbFhC$dvEPby`V(73R%cz4lfNMYhH za-e`gh8&enxLVZi19ZD`D@n>Qzb(eG+W*Df^r@M`7pZ zX8M2%ryQciZTHH-aRTkP@p%*p$N|5o#X@^SEI?bX|4 z|2Hh)qJgO1px{8G!mJ{QmFxe#t^_FQ$`r;LqP>Ftli^@}>hFX*9nXp)3 z{Ba`Sfzo1VI9y$KlMy?-NaswxrC6JAdOa=gAN&9d2S<($=&AUqG!Ugg$OISDVF3HP zQ`Uv$qWS2U*UfAf_~pe!#t-$tvVWrGw8c0Np*zJ>#KoRHkHczYs8Y z_FYotFB`TZ*&EQ!IJao&Puoq)z4Z#F470j}4*pNb^cV@^`{el8AJfmnOn$=>RGa=b zfWg7XDS0P#(6JEr0rsHdwpOljRp=}fep<42>Em_QD?8|u zBx+L2^Q4|#=FHlxTr!fjxU8K>t=a1!RG9*&-T>n#L(+y&6|dF7V}JS_P;2kaI*ZB< z8OQyBgsDYW9v`o5yU>JdbJ966m>whOdJPvR zOrKd`ohWaYZ*70Voq5AkaD{7KEx{7Ps2M(O9=K_ihIL4m(hk`Gfvr-n<+AfEEf`Vhvq@n1^V%2tLf_!5izU^ zA>?tLz!GAdK`nW#4K>&*Q79c}&=%55Z1*T~I;F{A^;rXenkH7(TYZj+4`lD%3zn)* zq`5Gja@IP%-K=^F0%HPWT!uAxH?cwpXsPtn zANuf$O}WadS6Sb>T#MV{*m71B3}!XI6x*rIn4>P)QaV8(h85o=8%9?K&gu5v=B#t2 z{ive1_t^DlDxbfS#vl4bEj33~BTg|c8zjEf&0>IQSh=lo2vH_D8Wf(w&Zkz+8rYDd zF8oA=E{hSriYp*UTG>B#w#7YHp#?WohXw$#FM0AU z=AX4fvd*S@p`pv`y4gl7fimA}i+>8bqQ|lLj4{Rv)D%4J2u(P&=OgZ$fmyzkk@)0? z$ZM_a$Xo{BO9?M>gf&zrnEqm*|kTNonG zbNP*SVTB-nc7fKHrh-Z}>c)(QElx{B|B;QWsaq8C0`bVPQ95LQW@e_N5Z<%SAKASB z*_FMDZ(_-jOqAoj(|drFsg@ntl$8z350|z5c=cEqX#-!c4cuDbcfw_2;C$H~Fp#gh zx9m5egp*#5KoF=;iI!D@GO#_|V;l1RHE-gYV zO#(pH*XR1AQ=s_uun?okz)n5MujwW{^`B2K^1OS#=M14I7$+LKNg zF(OszF`i+ipZ9j&3af`x#G6KG_0nv4>iZy%F3&%@QDF?={S_tQ$LG1}He8h|&yC}| zueET@u|AN#!Hx-v5{DbffGdhyd}=D*6tPsUtE+vD*2u!fnEpchQcZrQHHNLXE|{k5 zuvE&fna5@y6w%Ub(C^`VnGBTI|Jb4y@CKAd59U zIX3dY0Dz5pYmKh3D%zLD*7a)Y-c)YEE$srvZhA&G{KnsHx%r31C*gt@CV-XO8~ydS z-ycXb%dN5<)TbX;t8_I+J$=YQMfYJZVZIRf4#S=1q$>_TY|=8;z8UGkl5xFS zqvOwxg`XvS*G_oEW3JOJqMi}gK|5S3L!7w{uKrHe)(OTrWlPi_;a(-jR znAdIG&v^9N(9=gow2GZ+ZSqoA)0%yrry<|>eVY$KvT-$v^nN*(GzBZ3Q)7F8nZZ_+9(XVei zpv^^-(>I~G-fX0F)yGV3E15DC@I!y)Wvn3ty8Qa9r04{{S*PUqav91d(<|pGN33+p z){NU(UeNCPB``PXOl)s3VLIPYxQqV8Pd-%7-HSj*SgY3y;~Za7;)q8^MRUc;k|aU4 zaE!n=ShD})ASa;dBSTz$nV~6-d30uD`>yXWqJ6eGQpVlk(H~h^xl2wZL$I?&S28nazIb{5l?X3i ziN+vCFmVA3sn(LmQDbl1DSD)1(cF?ayHgCGO)gy9+6oMQQY(py{K1C#A_aP#3y-|0W0Z zQTx#=-4rTd{PV<+L&$sjjX@ZzfJUq;gsLW~p=ES=89To9sojO*+rNJ1#dSZ~N~)?j zB*2KJ{EdC`f>gXALrU_GBz(d>x;{gp&c`ys;%}rb^iwMa*_`0AW{q&A55d9caDZWE zV%2FP2>~Vvsr3+G=y%f#@#f~-4c<<%L80o2n+llb`)hPYUp3)uhJ$V2Us<>f_WQQ! zp5eNp*4IK04IMS2k(!^IO#Ejzo_1>bHuUXJ@8{N+9#-X7uHFN70>&0WUtB9VYn%A( z!(xs%@K!X2?w41uzwkoVVLWMV_$0Ea7G7MEp3x@x41HW2qvz zk&;>m>NHA3n_eko5lrcezY0zN=?CO0Z2R5CGyjFbUc|I)ml9z^3rG|A0CdOyVlFtr z+59LK!Mxlro*FKRjW}uMbkyZY0D%MW1-gRUv@ijxs{zpmQL-N+Q4#O{!o-cL&7adi zoCiLGU4f|JvdH7?3x*`iSc7tUK$e7z*kn>gW-Jum6RLezY;&r~$|V_Sm?BdlhMdS7 zt|{XIc6?UVwke;-!JqQ^Skvz3mp)Md8PT2&L*f!ua&Elvur_XyuVbQPe~ z`V}ooMy~T@_dCb%HGR3-K%OV9t!p`HN?Tcm$LSs^auvSd@))V=bg%_<7y83ckhF{% zSoGPN4kcf1l*=caE0rP!10VrJpxEOXYcBeaShKz@iGh!N4~rHI}WIgcLe$$7lK zie0GGZn4uy&4_}j+`rc4rto^zOPSt{8%pit&LRdnw+8#|naD+HOzkaupiXKW9*=u8 z=7sWSyP23k%~LwP_4`vj5O+B{Q-{r)f6LRasI74q15A-FS6U(X5xux@a3x_9fPYZ` z{HY|1eR-8(bArKIcv~@Bn1E;b;QBPSO{A;Ku#m2c3?ducsv?Jzxg4kUa3{ti^=LH> zoGCZ6H@}i48WSvFFQ;O16`1+)15}wTtOUqP8Dvk-%yjp!$(u&W`WhQBVRc`@1K7-O zu3MXORo*qge?*qUDAZ?;;#6+NKs^Ax|Et$oB$cVUij7U(z)L4_f`Wsss3?_G zI&jbP-EW)5o``CWFjl|RmXGqi$5V)xPwJrE#~tjccqg6oVM ztL_-Lg?Ft#yP%I;&=p`71t1sX>?J~YbXgR4M^N&`skkMHWUDCR^L4c$;ZIBG79nU< zrn4Ie4r`~{+VG{N{s0vsLQw7qlB^~HBUy-vE~0-NDN@UE<5C9XDO#7#4E}@3jt$Zm zCJcml*POD618U(fnwm-gM;JXWJa0is2ET#&?A=qr&SC&sgK0mJk@n)E(Se~%24D22 zP|xP0va&>@MnDOG3L-P0{k;)^z1UqbV?nZEC;sb-2L(2cgM>soy1EY z-0VC|{i;m6gHdG^ssnOcATueUpH|GmDejJo!3Q<*awx+Zb3TPhvOW<3|D5lc_t^R|HrsVr@ zakr~BUR~}swKlznN=2D$v{aUXqIk-am#L>U_M1$l!72tCJllnr-}#K=sUrUN)%wvT zAdJ?(JEyDr<+$o{Pc7SEhoT+zU)41YO8dP`zhiLch41=u_;zH*U+zU?0~93ZpC0CV z+*xQ!gD@sKK%GVG?;6foJVaq*YvAny;K*8{>P0EXynn+|_0v36bc6~U=w2S)^ggcT z1lkv|k}(bddN<=|ucteDHflM3r)Pm7xRPnBf9BVxG}w%>spfl4uWPHM6~cV1=Mz^{ z)I?IIbEN;1E8jqQa;BHlOdrqwP(IrW{Y2l|(sCGroe}^0>c%}a1!qR?4?imh(?tyc#P25ReSpuRS6K2j9K53mx-)ydA9O zw`A3$T;Zt!pR!eR+dZO94f@P0)#Sv!33wPL4Z!Of**Bi4HZY|j*QRpQ{G4gqxfJ-u zP}p0Sluy}+ShN&c!-W(L2{n=mmj8Y8C)2l!?Br0JMNrPTj9QWmx;>Zw?fKB|dD2pa z$_fMYPcMBzO*uP}s}$?<^>~n!*GCAEG!%5Q?j3jRTC3k)tVnnaqWYRR{aaE76B8K@ zpq7&h+P7h5IjKn!APVzW4X90cLv1w}hKmYuOu1Gipq2{{YNiT`>wx>yv=T|=UR+)f zsdu5={~cx_{5yZg-L_22h;u>uQTbjL=`q|r%b6^@NP`QDCS9eG#IlRfjkgZ>Kd(oPsGkvh4j2expygVl~I&bxdGIn@2deXee zoPlcgi=U6AnX9dPM*SEyd6OGwvx?}d&|%x`U-_3c)NtSKYth)OYOS8;B*L)-Fd&8$SQDPI$z%sT-m1b zF#X>Qlxjei#%XF}qcD4mFgxp-wbs6oH`AZ~%I8d#&xO}Kl2{qd_sbDDR%p0qZ=Ms8 zY_Th9--=w!S47nkc%)HjEIMtvNe)w<7kb{iRXRZHtg5LiP9o&inU^&zDo;{5OwxuSaHD&Xl+ffeHk$6XYKM}Sk$W=5Oc1cC)JT5l1osGqJ z?=COmfv_(QEZC4SJWHL*2bTjdyM-&9K2ckB{3-Ma*+K6gpNfG2Cf8#W_bSVL}dxCZuWjL-~P%*-g+?0&BwJM%! z!)7;NdSo;rPAK^eI!&r6xfR6t!`KkN>8IkiJvI#PJ3&i+!*`fhBCu(3^kHrO7ZPQE z|9X*eJPU2%vl+3yv`rC#9x*igV^3s->~;Vh^m5QaAE~CPhQnd&CYTk|Fcq2~IR06- ztB|?)Ek}s}WS0=!3YF)9U+%AaFAHwPv_yYP&X>0!SB=UICf$8YHQjWX=E@)-iBo&$ z(EgpDzYKD7_RyPSc<<96*6^FgPQZPb`JZB{^J8Hwz$3gN-C@GkBYl0rn*%QT!H3X*X`a)NCs~f0-^_o#D zKT4j1p&onp+w41sUu>F*c)oX``#oJRT;R4fLxl!QDT+vgj5g2V+pJ3Q4Z}}jB>$=% zhr3YqB}Mey`XNwe7YrcnU^}zj_cgDgxC|YxWUM)HE;RHp{&2N7=xzn233qGTp-->N z{bKf_>xM#8Zs z<}k7i^TwC2$s#S~OB;Bg>O?$LUOaYpM+4jYX}MBdvLfZ*b-5^(){)jCH*u zbqPabb?O~nE4VOV#AzY}5|cZ+P83$>*3QOm65Y<*TIJmEg5WVMb8wX1W`fNtE)uIy zETX&jIw&DW(Y3RO{mkQiyhS-@yZe{O=fS+_L-t``eYlFk!-H7oW4xD@k$)fj#wb zdV2p0Gfw_`()7VS&!o|@Zsto^TwKRWmtYwEFZF1zx7akZc+pdPLo0HTWb(IbMZXsgOnlPyc>1176@PW0YGq3CWCe$|UXFC5kOc^Y1YAVn8Z zER(7)lsAF*JkY83xwy8m>-xrUR~W#>$`+m{IFkS55&iQYDd+BnG!~88;h!gy_4Q;J zGc&uOTp1=14Jo57lt5LYd#Bcf*-7^m({qs6zpB~oddL3xy?p@#Ba>*p{5T%7m26F$ z#|@8Rvd^}QOQfM~*dw(@_swNPr-`E&G?#XFxKohH*7~Jje=`OTKhZM7_@EnLclX#% z%3hugqQiGiqLJvz3#1dHJe*U+82s8hDDeT_e}^`?gZpQoBMM?r=rF&#D zO*l9laZSPlw|E*z0|Xujb2jl;vglT#53adZ%HRHMmlk$)1Fa}0lzM5 zP^WnPn61GI_M1(pNGtl#MN%-<2vOVpAfs?aJAC=f@WU5xuU~=E2cI^qXZ4v;WlfCyb2~eZBrq^Y zx^xz8;WvKsBmks0-}caowX7|x zQoA8ITfRgH&0Moj$K%NiaRMb>?t8VhE%_R2PHia3Y3cQeYyK*iDt_-Syg00a!`3CM{Vw!-^93(W) zlgH_(tNj`SSYWcBQY5?3l!Ti}$n7q|>+l<=$y)oG)}Y4i$I{~e#>CgEZc3+jNy$JU z_RI`Ae-QB=jFO$W2ltDhfL^TQ)2{{Ymja1=Npu|G%UUzh9E8`fvb;ROpV&x}HqiSE zhKlE|Po~8x2Q?qD0R8Iznq&j z)@5E9O-3d*cA;1}B*gIchnAX0Q@2cqGSr_pRk6!mFN)k77fS8zduibgh%{j9oTr2= zvWxi!ujfy0C={PYfE|EHTNn7+5?;efak%K@P1SXPXYW&2l3E*8P>4$pQ#UT(>5aPV zJG10vpwaf0h19ifSU!XA^I;*2B0{*}xD+`U{n+V_<<-7e%>SuaU*@N=D}>T?W?7 z5#@`vem&nHn?Lc%TH#rd#<^vJP_>-i-=wvSK9_Puh2swtZfn7Yjf`X7OBuYxkaMm3 z0Db!D+;~ZPWZAXCXPF3{k-GI63Sug0K(BvZO4Z=~)ElC5))B>ach-{cp{GcCL`dL} z4AJ}VtFWCOh1W85FXn}SmE%hOpTkOuH8y;PVm|#E#h}S&uOGqCO1|QVH+O;qF-a2!hx-k%UH&b zX6i>luk=Qg^)36JyI)U160>}43o#yfqMFt%7J4s+wU0;D>4_D=yin zW20lsPufAg3AqU3{Stp+etL5kACoRzz6XrR7$#6Tj}Lw137JG+AEL=H0j;K?8Kf|; zhtB2NJGdi)nDh(t@(2L8RqVkkx4Nm|l)GkZkV+UZ+TjP>I>Kv+Z5H1cWDGLCb7N|n z;-QKQ^KL1>0lm4u=Us1&%U*v|yWprjO!jgXoz9Mh#|qQ?v)gEtuPosDxax#CJxT&i5BU+ty&Nq9H4g^P1@oUd)zL1T^)H=Xi7Qz?|_PXXbt&B z#l^*UyeDs*2HtOZecaf_^BEH)VYwR~$=L9DhRmJ3`ug#N!T~CT4Q^vcP^ay7Mq==7 z^Z>VeY`L#*0VnL{bW_#F1{b}OtB|0CBoOyac`&!Jl+EeZ*%HRzihD+v6qt8CAgn?p zp{3&ek|X?b?RY?PhtxgTgGUWe(J__<>K>rf%kIwHTCFozng87~3xdKm*-w65Q78Vz zcoc44uc=(`IP1b^X zo%l@=fo~J_BaBtMO--Cqx@n0zOMkn^7QJ=kah#GondA^&C!N9QBRu`jf+$aG9rG#1 z9M|(L$FKu33mp_pl7QacIOH*+^%&rc;iin`5C;lQHNLvuMouht+)qa2&5YKVEy^1T zySeWzT)1`Q+pW`nU?Bn&hsRQH*k@)KWct)DL@l&%xK^QEaq9ju@qY1sQP96^M;cii zd)}|;Nz|Y?8g2;@l(ROuIaPYzxT0V=>O6n8yj6UC-#Vb1BL^Al`fSE_cJ|xE6b+5j zzxB32kl{$sP&lHd*GS+yib$1+>MSoOh7~{ue4xdqo^%K4=xfU%Qw7CmvF5IR_P~NP zmp7&&a2Yp372lj7+I;>InmC-klqmCZY*{lZV3M!w{-xdso<67U*Oa_rQ#_9RA2FEgyxGke)$GH7TP3pAh}ctELN@ z6r^Xw)K`TR{m33_Um14)8}%x15?xA=GaSM}YX_B_(7Z@nDDi$uc_}1}-WrkrvdB?3Y!yQ?HC31Y|eGmfO zx@=G7RpwSlAR$;}J+((qp0I^}ij!OP4)tKUz^0};v}|G{YTB}bVj69?vFr}_w+#FB zug@w- z`KoW?8nVjsLJ=OielP&i5(-S0RRxb$Bm&aE=~!4$Eg z1S}tck8VeMdh9Gwhj%p9 zId7-a@qNAg%JcDcJi;V3mAu>f1s!>|?!WWKSpY*ESMH8L zUN!aO==ZEJMp+*|kexCW3wk}vJfeOB=)UH>j$CXQWb83Ix|)BN{cE?eRqvWrz{5!@ zCZIM7N7eJ2+2iEVYMe@{EC|(ZlcTvy@hGO}Vcgqt?pT>{n-A?=i{j~A3mV*-6EfQc zMPv`Y^972LA^n3npq;3p)o-mYjvm=|Z2$mRN{jXswv|oPD}P!5`Kh17VeA%6RqZ4# zEt_NBa9lk||J~P*jqd{hzlC*0tRwQnoODNt(a2*F))8oYok_vq@6-DH zXfl!!?|z$5EcJPNW98<84gqmIXr4=}dawxW>M}*(;Qc%2VB6sD2rRl&!sWDp!KTn%PO{QBa3q3(BDwVb`|WKdiaIDrb{Mbg*xGZ2d0Y4>oU@21 zY;QhfPIvlohrtXn_;a_$m{)xbQk@w!-v9vbGU41Lgc(GzgG&KmUs49+kA|v2(CyVho5g*48O`$l7Wigl%nV9g=^_lhkN^nmqPcK1y z?{rUwy;DJW>3i0SUyP(dI6ZvdHiQp)(V8M71N7EZ^>{wlIZRo8%@stTcYjo8;7MXI-n^<<+Wg`=TF zjK%P8m*X>S%m-LM$;@gBE`@A zx@Hc3jY-Fk)k{s*(Itol-(E`@pV$0+z5J`}c<0AySX*ik&ZV;dLQW_SHAZi4W zmR;1yX$uY{uZ({gL&J`DI#5feQ3tRUxkR z7+^!~Mh;8X>+E%9wS8H3%*@~wS|zE5LCs+&dO;owYgpJ{U{LrC{}lS*lWA6eO1O& zp7&>pJvV1)h`#gc)oub`vIy04=C3buhVC%uKJQI{LdY1%>w9S0YX8uhhqxGFT|c)` znBdv0jC_iZb4#g6SIC<)-^Y9zNik$@=h5?DGc*y=nmW+OuHZoI=A;LDw`Qxs1_FZ*V2jDlB> ztZZo4os2%qj*K;I&y|r2lZ6OkY6!}pGsmp}Mo((8U|vnHI?HFQDrpm_T^D?W*YirEd|D$NhV8stTsb4NBEFqb{KWs?ERY!KovE1x*FOZ0nii;K z%2r81H4WcYK(M1Iv7?H&ug|TwH+QP0jGd`;_VsOq;&HpLy^i;-tjWRY+P6^RlGdyg zjoJMAk~TRXA22Zp!!LRr^WL-^&XNt?PCKOad|0VU>~@`Uh`bZ)h{x;RHh)EwT$7^d z1Y%xwYIUZ=%LbmlC|#jpsV6U?gpK2cMi{b45?WI~g` z*QL%pOpl)_t2oE}X(GouNq!Lr(;s{A*a_737{a|d&vtUg<=#qZf|J^2?AqkeFZtl!H(QtW**hwP9!O~dlL3ut6uAxQP?bJ#$kCV<>KKRJHe7J96&|D zqF+;Jn~|cPNV?L1#J&9Fjo-DcYJV?m@c~39-YpxSPv~Md#W(nAYH7VvG)VsOBm-{Z z3Cj0&&MgdeCp*b)N{BEm19us>>_*E9;qbYjW*)y;Ji!K%weB$}&lbvQO1J#vl`2wf3x~j;8uC#2+F`A}qfit=H_7;ONxuFmpCnt|y0k^~(s_o0;3}kv}3u zRv?KS_j?~KmVEscO%aRfbK_XmDdfDdjEoSdrMi$iH8v}Mw71*)!TYSQP`^EO;9h|5 zy_()d;Z^vWX3~m#ksD2yE>H*5?XkLugh0OWHCX+wsT&S^*Et$}+y%DN}k)Oy6xmj!dw%x_50@RmSlKJvvE!nj1?UUI)YW#F?T6UuXVX zn5qj9tE4*IIe;Z)Mr%nc39kvzqBFy;QlDdj${kT_xw&25soh>AHE%WBIwwdN%!erJ zrha|a_}%43WKMcU&X8sP#CrP_uae|8Rt{pjrE)X18Fo6D$yH_2Q|+rz=2 zb=!{>Q=(UQ-_itA zczZ8To|sZ(ybcCc{}vrj=Hi^6)kxm6WawLO{(7@hlW)oGW_U++k0CR*QBTo#y=miKYcsr2yj`|<4EuPd3?#Tu}kMTTsJgNlf_Zm;93xGN`s zgkZ$ZXl8;=gMR3xqK}Et;v@a8g?vSjGGI0lZ^O!@-FXoE*dbQIY;X|}SN!owd0yO{ zn2CkXvq@;gWKgK^nJP9ss#|ni)&U(BzSJfmM`G(|^GL7=TO^|;XiDRO%97E}7KNc7 z$_Ft(nA@e>#sqEC5GF0XSZB2UDEtfZmcb+R_w9%aO~?TwuEl zrzih<@a|=@>B-!K3^%M}EiQ=|YO}G*E&Be(EV1C*i`QPD$)W6h{F$FzX6qka|K|2* zq0eqUwsa*eEqXx*-yK8PvA1rXd#5B}2v1%tqE9Z7y z(N|ne<)wK#SU#{boF33vFq;ApYEXI8_bZiahbj6f{jV>ea$|;hUoB} zoC6nV8x|xGU$2TKGWnMLAw~2@{?2|Wit3hzu#n}kGP^f-USlf{Kkw;qNuYOQQyR?z zqdmxL_CBkQU_4EfZ*fJ!_+u#=_clBE+T+TE(72@sQPp8*-)TIB`)kM7{FR2h&?yNw zaHs%|2L;IMA}Sun029>|I@o^f(X9!4n7w9ak#}f52V*67*gr2_nd&*+9Gn?^yAA5> zIVh-XOjcb`S5JDgQ^422>6lh4e}a{4^3wA`=;O|#&3&yDxfSUZW!!#*sN`$Et{-edS~w#TY6asvBtsuu@55KW3lAl%$loY>G39v?TWP5>_2 z=yd+O-$~vU!>I1IM_?jvi-rz}N1&d1TNEGmmQE#pj)^7Xj1R)ZRmg5OVGC$NS&w-!oNr3BjRs_%O!fQWN?&5wC`kC z-aJ2@?B$nyB7yvWIV}HISSgp3h*R&N-9NE{SY3!l(VZmt2zHJUPaF4gys`1#yeC>& zqH;!TI$`;1J)<0bh_iSa-mxHxj34lDm?44JDPK$i*-+!R;s5vip_diw?Y~#;l4>+# zDtBn~Ju`p-+NRWxGtx^F;I093WrwDca7w?3An1OKA%$j2((if(YORF#C3-}oe0{i* z%kI&HTEtAhVl94YlgJbK&nXWFqGCLKdHcg41P87R5kKoK50O4zlQA{Ssk?@Sii&P} ziaU6(VSm;I+Q#U$NSgZo*M+1MvUuXR9V-%}Kkn+~nw~U+*)4M@5_<7MX2a?PW?E6fDG(5K?1YErfQ>$@vYJ^~h0sRi# zjItf;s(;4FFvtOOxex}l->YnCEMvRqBQd*SIqf}yAWm~6LHm6*iWqQv2!_){I|UaQ zNfuKZOCA>}6L{}`HBo%rt{(i8pVL-Ylc)9$2L*v85Qkd0xU#CEl7(q-Okskl#NP6I zzaYFKO0DrfwMHny$NVZsI^+~*`*DQxyl*P>bK(4r&z+_7>#a6pVoaB~Y`kQAEh zC!Ru-P=3()%>vTQVY)WZr8z+cT540pt5AHhQ&{w#S`N7%xx)zW8s|CuREzWFg>%FH z!0=t^myXw73!LphI;h6Q{n!dO`ccHlNPx@olrM>hDGH!Sbwaciwc5KR%+BUs9#NQ_ zHu$l&{JK=Sz^BJ%e}c(L!A>Sr=aswJ*;UbbDZSZy#-%feM%&fdU|LChD*n;!F!%-Q zRb_R#X-cuwZNHD*XRCK`GB40)_1JzCV{3zwb9aTORr#7qdkU$gcwYxg+CVj>>+Y3y;@^8=@v+Ah_aWE&4L>Bb#&9kkqdp1?-x2Z03p&Z^ENa?-RgX(F#{x2u2M3;tlGkKu>ZLH}JVa<$ zIbnCY?8ehT#FPoklImC@z`tsfn=(_Gi!1B;?`c(0TB9ZV=!3}h>DfA89b=V%W{H>~ zoE!$-uh@c9nrh_CE}OBdI#~O30l3VhBmp>{^ILJ~wQDNg->3H;eYRN{n9=XE|3PRh zxlqIYdboSu8?=jrdJk&W{MV`flfM=B&Xi=!@1uTtyq?;^o@r;%PmdyQSrf6hlTEv& zI+j%?I~+#)RGN4a{F%x>S!73;7H|RaC~+3vFIuU@)nS~~2b8!G6IpU^!RcbL1yeHJ z4D%Y(J2tx=zxA!G?fZHBMV!Xd>vseByomWp6 z=PWwJ2zGCqY?t(LL&7r5s+ySRjY)lDvDjXsb&G=6z8=*oO9^EBaEW0$gXkck>MLpR4RvE&hj_oG;31yLK9 zto-Ka3ATfUaC*amGt9F0d5|tTrEed;IWNqwAx#Vv5zd{f$XDeuDG9f||MMk?Ze3nf z=f!(*IU}9m1OM&Ibq^#a`BRPhBrTpV2F^Ke@O?#-Bvnb?KW)4F8cs4k@76oRHAfMd zuY3z}P{GJ9ocp!F4|-I{^$ZLgVnV|;bzFmXfGU66`KhkRO6fqIXeGW*rY#Hy+x#%R zA_MgN=;LF+%jbrc`LGiyFC!Qh*L@Lxt9c@N|A)yu)|>v{@Qj71kNn?0-^+h??pAyo z6N1f8dqNiFaGc!SGPP)q=`uruxV&Rup4ZCJQymCClyc#jaLWw@4+!Kld7yGzV3ng%|M!HP-dOTpyc| zYC-P(k$0!JWsDQunIl^jyRcwSwH!`A>x$YYzjONtQd5HUPV6ORk5%tsRmyE54b^gH zmqGgdHM@rmsTdP8^Kg{dEqJdAsd={eYwo??R!&ak3h33oMQ=EOT}*ItHAIIU)5j!= z7EbS`=1g?`hdg-NH%8*TnS&T{Gx9T8_|Jj&qH$^rF1mP>y-2E3zMMikEA7__MN}W$ z`?HQ@u+~?~Jrob)0aU8V`jsZJ6IzA2#^XSHOV~ zLl6N#Z+r-HB>H)O>wS5~8=x`$t}j5*RWCTqDXHmI=XHo*7Yo|Hct(L~S@i*)4HAk^ z8MP(?MM)=~y<~ZMd>tEAh!OSW^1He?E7CIQ_u8WEF%)xat}O0I_;-DS1h*P|R{cHX zJXdGUBT}n;m48x(TD*Xb|4>IqabTT_&l!V4%;9TXaS{w%H}e(l%>TpMS2o45we1e> z8Z5YLaCdk20Ko|s++olJ*TG$aJHZ_ig1fuB4eoko@8@~nbAG_7nyUHI-LtB@XRUSL zm-*D`D9!E-EjSiJ{-h>KBqSMq#UMFKak1IH5L_WP7b29cHC5OY9b~+R$oy>|XgO-U z_rJPNHnxFum5je)BX(qhNv zBAFYXju-4W;y<{y2lwy2xrW0G#Bluu_zp!->1sEK(6715GIC}P;1h14U^s{x^+Rkq z4)z(3>OQ&{Jsf2?X`=d0y)76$Qq{z?io?r5@I^UkZ{B%N_e5+jk=CP3{%Q%Sa`UcS zQ6aO-Hc`jvQnDh}sbaef5erS78uH&!j8 zn1N=R2NMfL#kxaFyJFn2lxC7)sf!05m7N8x`OiA%a7Vd4m@WZ2V-p+O;$KZTmX>8u zf!xitm;mGSRNW&Jn+PfFOVQO*_te(%KhfDpE*alvx_3`Vg*^57+_ni6A)D?bx_Li` zmvJCfA0o(UFqj?B*pcz@G>8VBiZq?qb$al3P|i5de!p3$=3EjaH@nwZG+_H&xc#k7 zJ#Rh^=Ntdc6kY0Q1`gJy15+yYSM_}`k=6Tpm-9|eX#zUFYv0{ZNS%`@BG9`r@@Kj? zaPK5pyU6<^gQr<_4*$#ZILyM8wol?QJmM$63(!9$MtUYCL+F)|$kQj!T}D1BHggG3 zJ+#fpP?hWIdV#Mu!X=$68SN*6#}-ppbCZU`4iNRgMTzRQ9(PrDL{+-(x(RWH;OM8E z*LWw7ifV&VzbE+AWgcnRg21pvOneI(Ss9HFzaIUdGGGfyuv2?#gLF4h03T z%*-%EgQWhFj^Z2f^kQ^_8#9iF`7n zhC;yULDQ~SJPsYhoK$Sr%fV_g{};~UhJs*b>ZW5dLOdZmCkUNPmkz-IMUyH*F0jSt z>sNVyon^4Oam~|>)(H;BTJEofTQzo>i}}B$w^>Gi-yibtZ1Jl<9ip^PA^Ex&B?R(A zQoLDM@X4bf&fCb`62DW)jGy=4?pRiS%WzPkiphQT{_EYZn~O^X+-2 z-bnPz?8-M%=nuO`F@}bqPBe|d_*y7LxInMc8XDXpYSxquZ%_@bFyU=RTNNBSY0xu} zk_e6i6J}dXTaj^C&KYW`Wh}Q-LLclqzZB_#zgAhwB3$J7ind0JHJ8^d>J^V2l=iId?i z65yC+7q`nV03hN=zf9W8ug;FwrM#ettVSXcJv`ervkhJ*?phbf2TUg5eHTc05Fv^e zPpT;Ihv(aVJu=`Ib1D4sgFy|sK~3IJRF1*hQHQLNV8TW*C&7)u)!(xTD{n$BR#{s+ z7H*#AdqQG%@MUd3)Q^pbog0cd!&EZaQS-lJ8DqfgOKUn}E*Ml)C<*`|9vUrkyzR5~ zg1x;koP><^sf0%YtJ%3QRTNIF+*UZu--m7^fzy?hFpg-Uj6foLD{ zjKAJz@~sC!%tN+gnemg~vuj}re!-pcRiwPr!*hPKupD~`<4m_|5Ix;rK}*Pd+EN!U z^>(Ql#9Z>BG*BhR`vW2L+}Xw(ku^RO7Ui}W|89XW=>TN{z=w_;1EXDm=M$1#q1kO~ z9~s7arzAZ-A2dQNo7~px`%L?GniK@#dvJep!Ku{!ZZPseQ2aQI?3n(;Vw*IIXy@wu z6Y}?Uq2?0?&mT>mzU&(5J>tc`n#Uh%l@YZE=uQ=dXJfi*iLyIu$H)ViAo1b5ix1Un zm5fL}Z;kTEs8YDiTWf~=U>}$N>j1%1bV5!;*mRn{C4=~o-}!BwZ}vo8v^flRB3dTD z35did7ZX2AkdAY0ztG@Lbo*b2knbr)gCMO?yR1LD=&3bM!vR{rXDRV_?Kc_02}kQy zr#CK$Q^lWqqkk(+x27j{Z47(ib2xqlBCN5e1cwo5emQRZlM(}SoNXvJ=Tm88@x zTyr&@_9ftcg?A*Gx-aRlRcBEq^~X*N5QE9O6hY$Q_@%?vSkqjQ$d!jKm$$wNn@S@w zS9eJ75<-rpq=23i&9u~YjUD;eCy+t$e91?138naC-q9c9YCkCiu1d7JPEa1VaQCN^^MEawe$hTX9Hq$93CPR88b6&Z%3@u4e8sFl)O&pP zpMz*=YIr8rB=$AC9>2YQ3X47OrX7A*oF9^d@Zr&o<*N<1u5JG~Bknk&gvy9{4YrN< z;ZfyoEiNJA{25I{c{wi|YiIM{h2!bLgRF|O36AlV*xym(4Mb0^p+ASxiT3Gq)(CG@ zq9icB%^HCy0I=gfM*(mERkPTuBj&`l2mR@(YTtYc>DIzh99wU;`T>@d-{hd@dPQ0r zk<}G}9~dK-J-C(KNaTQgT0QwfF(jG!!8KAO%+CmQ6A_KMcDn}PLflq1Rc2FSsTkFS z6e)${KZDq<{7t;l5VCWLTK`7A;_Vm0k?e0-StkG2edFEHs8l?UG1meYbS&`O?3YVF zdT}5dUr0Su;j*g#?utx;0&+wh&Q-m<=|}Z>sENP`w6lY#XaY?AEpNs27mQXruxNq0 zK%>jEN-5s}2@Ty3Uyd3&cJLK(Zby*kPpekA_2R*4(O&k6YQmJ`>ddPokZZ)Zs>4)~%c zug6PR{H*c+Ix&p+Y;eaDP*FI{Vk)CSpi11iyh^y9z+S{p;EVTK&-F`nJOeUO&WU>N zq2g5K^K3Chh^ZR3!l7~z;&+8heYKj%{H{{nntU^H^)in_21aS0b4&?2i9lHFY2f+N z)o4dRAt;!dI#YQ{aAV?iN5Q48{yK}_b^ksqy-c~_I3?m+iIp&5GrNVxy__s0(k=lc z6;&SSLe49-KR-BxRK_XCKWBggzIm8rh&&e3@cFbcdHw(aSp@wx@(=;Rr;7NRf=PZy z9E=}P;eY%&1on_6%;oCQHMxNoYGkUa%c|*F89tRAs=emw&uKvw*v`QiAz!EXzZ#-q zY47zK%9ovzv?33UD(xWxtnH=0n#V@>VzWbXFoKi5?rA*`5-lyJxq1^8H4;x9pJr)D zR3ZY%)eS=|&P5jW6WpSgCnP%X4~}IVsBbB9|BhpQcs(Xo9TWoc$WMl=WHWgWjX}eh z)L$S`Byz=`N7c&PY$lF|L-t4k`Lk-^md0{1D+bt_bp71m7^dI^)wku!37pI&k}Ozaf3Ct`+cS79GbDKW zDL3uORWa46+J)`o?+KFX$Nf*8ytMpW9;654PIeVSC6Z%f7(067pHnP!) z&ax$^_@?mCy@Lj(@rK17+CjsXq7gnaDop-O^_(77-pt_*;XQQ$kv*LQj(4OTVt#*eH;M&~#}0tgP}l^W4{uLz@L%;>|6S#ht6Af0slzQ~f}bU?S!HkGtiqWA6^4Xa(` zC)-J#y>*nX^~)tK*>&GjqMGQn*PgBUuL=~dBRv;;Vdu{yf&5Bx3kHin{6A+)#1?YB z(MpJuBy#$&IB-3GfM3Vr{0_#oOu5UE>{mu~=iCoWlJc*8=-a3hObC(xp6l;WNC90Q zxzupyWk7f7Jg)#*76;u9^P6=olX3Qn>F9c8`luTXh8Db;oSmdv_~9{;vCF?3JwM$} zNkXrlD(!tX%*ghI3@LlV?|Gmx-@!{#;;{8L16(_~EDso);m)=c23#Qa-BALN<$+wr zWQEMJ5IkElX9if6K%_NS?vwVZ@Y?* zR6H=_0xS=@>dv7IC}IJ0VoAv81^mmFGA5lyhcT=ei5mHo=OeglYQ8)_?^X6I$WYhb zAbHStSA+9$J$zm|4_=O&|4e0^ob0Q3dpouf0>rktT)}_9ihk6HfT8cX`a%|CS14#> zNod5_E3Z^TPC<<`iA{G>(WaULZnTy(_^LPnu1l_4nZ@R8m9Ri^qUu2&=^O9 zkhEbjlV}S7vFt_MaKzKdXz1XHBNm7n*ys*iz^W}uW`_r8fYJ+gs;U!?ME8{(_cpW# zQXWOxstRjJw&clggYTF&bw~fWz`oL&mB{`4x&&*pw^@FSWBP3Ra`!h}c5n%ID^tsH zq-5MHX}wsdCLB?hG_ah7Oh~Nv>udukFpb2x}U7a?!Hyw-?%SFx*{QS4FG;KlvKU6*j$-z5o4YaWAZ!?g?vj9 zdYfvc>_lkFh@4mbM#ZdUvt}s_Yl(*l6)0A~I`hoR_>)mT?^yX9JjVZ%^?-0E_&WPI z!hj3@G&$Q^OBcH@_?bw;UEI=A9vFea;RHT6{Vq=5MFMOtw@R%?bnWOBGqv2=Jliv) zkp<*2cVsW#JkUjajt0p+N&;DoM2&0pi_Ma)4W%wA}uH`Dv2MFS1c@L+3^z_y-?02udPx-Zf-_xfQlbmlI27j1&2M)wsUmV9@>G}5fH z)+`6fWp^d!oX>2Zbh;zmJ_FB7Yq%Pqe6(1f$>ZunqVu=eE0kWVyrBx26kvdj5DU&r zfmSQ6BFYxBjYf|BQA>g#b~FbwR)6u-$I?ou8Wtxd7rA;$(e^y7z|e^$3+LENrM67z z3(le5(P zHO-u{B+h3GC{!@5gxkp3S=ds`h;b(u?Ue_}Rf(;C-1@>7`wQMK9{YMCLf&!d-+}8}!OW@Q@821ru|FO2?o8#8RMfcT z<$%ubC;y62!WNp`ADrx*-9JXw2avL6bx#r!!J%D#0CyH1UE zMcXlax>|2yz!BUS8XR_3Li~S-VGutG@`4>@l_eV)tnSI!l0Fh<8Z7biEv1j}!G`l* z65o$5$0zo)N0cj1iN6ScNsGpB&n8UOnwK0gt|aDgp9jr%xl8-Z?iCh?p}SJDBLKt@p#T~Q$p+vf2NNq4G40l+ z5Qq$`EmE{M>LJz$cD^$y7wfA3N&#ks<&)86!>2@H{%Mt}K&sZfjqz;tn|d^WndvtJ$~Vdgpw+V!fwHEK$`mR!x4 z!d5f(7qqx)n|qFj*u)319H2}Ag8wg=HulG-`r?npJA0n2gCQ&8Qi3e>Z#9|;i4Y`KhQ zIM1?aE4$y(HvaTvdVcJjvdHx^7ZCS!TlAsR3C;)KvU3GL`1_wMTm*+i>2t3{bJ<|U z1)Gpb-j3$;nUP0$4cP9s+mZtqG)z#>2S?_oO*1%fwfYcb%YrIXGr6Q(re$E5;8#NZ z>=1bkniNNO3C4AJ%}P|Eb#Ih_==GnMKYX|Xx(*jEm%k+SK0M6sXQpAX?w_dg z(%}H))IC&UGTVuv=61j0BD-IGUW1N1cr@x>D~Lr-@C{mymb}6ox9sM5{=!d~{8Cl<-b9e)_tk+TCKH zP(>#zF-+0Ck@n!>g<@+ejY5{O<52Ws*=|@(+MJHJB|eb578~ zNcXgcZjx?Qxx!o#28a z7VO$v5ZpPM_v!nUdEDFE$sM?xv{P?Y0dR1deaZ&_tOL&iy0cc^pcfYrC3QDC-P=Ms zx5Bbx!XQiknWwI}wsw;9wORjI)N_+vdbj^VhRt1vc5i@anxEZU(<%=c-hqg{Papx5 z_P}e?i40wvVd-cz|Be0VPhQu!OR;4ioR-383 zu$&Kp_@4(|JuA6N;Z!HjP{+QuUv1)txiVa z6VTJ`>nrz1bH0+K7ptn>9e8HngOX(Zx=e;Jnzh$>|67(;wdxEsT1(r`-YRj!0mfIy zb=K$RG8e~3#t2}lRFvf)vLrhF_++o^{;JGNUdJzSaWQQ!Tf4R09%KR^vR&S%LeS{$ zOjIuW zJo)T8o=@EJIy^3b8qP}BV}CpQq<0G}^^o36l5Cq|^v8Grd2Ch`9ba-(0U%1dJB!RF zlCdyN)2Snmhvh=>$i{00M8$HHSGEKG)l~^9ZKP6{+mG03ZU6)-L#RNl z-D{Ppt}4%e5SCwcZIS_i-$Vsa=B-v6c-{AoEWP5XP9?nO;O85oE{aS2o7X!}nGEy1 zxy#I)wEN3Fj^&twgnx>p=yhx}H(u?7JseB~L3B`j52ARgLLzn3xB?P1pcT02cHb0? zm%4?~4ggI*P|-OgA4!uGCZ{($7J5Lk>!c}R0S)30FdDuG$3=o;Z~ED1VP04p&kIjH z4P|OAz!**<)P1Vj{Drvit<}GOiO?UQDiPCax$+td$9;Fxpz?p?|J`W90!(Hn5LbQgUI8LaKh)9hcIM0I}NrP4rQ9*d(An`E~h4pml{CO%Zd5U*oJX(n;R6B;S~^Q8&*OAR^p!hMI%Od%Ic0lVtO8*L!K zwtjF6MnZ{$nE`=2P$?+sZ8hI}u~IixNkDiHkLmLW`-ks+h+@F|!T1&MFmo{CEn|4g z%!rSE{I7!oY2f@KDzWJGR+!~DF_|@$ILE<-Rrg08=hX_=+%=Dbbx={`Tq6#^dhU$Q z4-X8cU_Dhr0WM;=NAW=B7ShS2=@|r8orxUNaH*WP93hKl5l3g1oqk{xKn%DuSnEcD z0N^>N12VSBZwzfc!@4piWbK8}zv07OJ4qtFfwN4Ag>Tb%9E+pI1hXVT&xXm9l7KnEKbt&=iUz(a0~Lwhz80p z7X^9&qs#sQ`em8gspKGEJMiykfG1o_v=d`H_GoHt7$ti{+o`#&J;RKn{ zIe3*3E#FzfZVa$EW|a=XfF87H+pnR7$3PS00COaBk49Z&PuiEC)oESw^* z{5vWS0o7a`nV5B)b#P9*px*Xe!EWAaSz~Iq(h%X3FlH*JzoUyenzz=gUYN_rjJR-; z!MpJA_OIwoq_}4TFoAdDQw4^gNn2!;3VOMf*UDJ^smRJo4rm>Ml@`9CErlh&2pzvW zsYXV3M|#7jv|E6frb0m+($oMf43L;7BnnXq8w)vO0{_7Jt);^196aRRDoIsD2eI>s zWv#uRAzB#sz@}i_Jq`GJ_6@MS6?*U`=(^&Im45c)L>CS zf`mpQ6k8opkaXuVc7f^EpM+TYj*gANEj+aD(pUjt>t)3Cnc_NdxB{lc<;YCBj*7K} zch@iLS~80AliO^8jlIgv`mN(Q$|dRL#$c$WNg~!3jI>YlbX5?SW$rKY_KOpSa@%K5 z4GnrIKs59ZteTmU*)Vum4jW!RoT4%`=9^1<`w?0he@JvvKw;r(#e<@9RrA$(TpLjE z;}Bm1uf8(Wug8W1QrDf$0GMc@PE2Tk0_V)RVRq0M2oeEOszM#1?Ke?y1K>c)WK#+S z1Xr4eZ7&Bnlke{Dq5uMS&vMWW-O%hWWBe*|iLWP9of(nkPA?A&DDEjqha%cC7yy8C z5qHY~`STm4cIHz(QM)s($;zafZ0ngH&O1=XBg1n`5ce+z2F9QE{M+GEFp#-uP{8lF z=}d!FV{w@f;tl+jhNL^Ym6>U*DlL-`Ij|5W45OpFS(>zqR0yDEudiU~m}R|it5?IX zoo?|iGnN`wngYG8KFBtDvH%3S7@cj(9aZ@jTtTy2&H^=>_ zrQn0HW~E!{$R`EHwvc!vH3G{0#2!l{4(sjXQbouFaqAbUR+h&IT)K z2gJ=DBVotYL^F8&{N*;Tdz>a^b%fNWZ|xz8QK03_mzg?VA(JtpP4AZcNS!+1 zlhuzuJ~*Nx3iYB@GXXya>zM;e9@@G)=^ks7g~A4ggZUQLOdK@CmDH?H9 zqjk6QS9JEEy543_uGvfLVM+n@Qj4>5%)j6cec_#w;Qu6#?XfB@Dssum}5d&-yU`f{4~b_U&tM`=A8FDNbJvS_?m)0W&a>{MFTM@l6HKP*p1ktGAsKPckHmb&C$~(p6}zEah`JZ<_R=nIKO`~|vlbagjZo;Y44i^g%lifvm z)taZr-m34@S(&LSq|5gM=K-g}Zcnx@(@j2LtUy}_!|oz*xwa~0VLS|b5;QqO#*5?B z>XzJ8Pd!9vmG8k)H8=tv1WkSsx4DXz@ln5(oT@Mkk2DtY=%O!QtoYt(SEQKXohC*H zWFRf57t@60LX5_;-AVU6fLyFq=U|+N^qO}iG4tyEA1nM}BmfWT-CecuM#dpySO6w5 za(1x2g>oUQs>4y@A~cNJpa9dVEr&4T615@|=A=mZO3di&P13dQ1{RR1>T@1N*Ksb)Ry!k^>-&@@ zj371~``*FSn7W>QEOfFI;-VR9rnvO#&E|#r$GshaF=|Dvt$nj|@`rlE52~W(s~D9& zlvI92N+otR<(JT8(IRW0g%$?^1QeXgG*fyOO<8WiK&(T?v1L+F7^%?Gm%w7>X5-=3 zlso1y($546vs8eSq(0fSHGYsUOqf^QKGyhdce=S}G7AcFrFDm7_2>bgF5LO?v~gEE zGdGgadct>3bl3_zU-8i90*MFQA3ZRlD+f$I*!VS>n@wHBne#hKVjKI24>BF+UCB=|7xJS)(;8VvW=rUaSZ@hHC~h5i`2Q7 zIqnd`P}J6DTLl`{<7z>6Y>@I zmUA54lwt*&JI*U6u&kv(a5YYI2udBOkJjPDRCU0L9-uP=W-YbE7$# zIgiGWR8Q;I?1!LYa?hO{Aej~2)G8yJhM6wStYMudVbz**?c-EdlF@qgt?TBG(ZJ^3 zdY#QnJ!)nQEm-Q%!C{q+=jeu^4Hh7S)5MdWirKi!gQBRhFXiL#V}<8cdFkltSChlZ zJ6<6dBTi%Qu@Ywd($=n%%paZm-zq#4J5&n~aet*EZ{Z@WHJmgt}w+-0<}@zV;>ZaFwO zOQXdT7_{FI@!0;V|1K#u7a{0jWTUe$edQkj4*6*$DzwG0H~KxLTKK6qU}oF=17{TD ztemZ#&H4V$j-A)u?dHeK`nJlJ!}%W4o4+Y8GN?ltqx@GUvvKd;o=0G=a@?R0m?mEG z4c^<*oM@uD%|}N+j+w)PtI^Eb=CgeqZ5uH=i=$nl#f`Bq8lL?MPvNzfp+B6n>qmV^q@w5m6yvoZ2E0K+R1n;z#5;p3gyL7g)>6DzNSmWh3G1nC`%b zV*$#h1XO^JjSTkGw@0!(XDvG7w_N`%bn1J^tn4hK0hn~!pBL#r>8ng<)ZHv9vNI%u zPyMPs(U<ep57Ry`f6z0@S=0K_QHaT&xLatf5-H8 zeD%$b_$n;^mT!Eia8Fb}X0MV^5;E(Z!^6Q*|OZ6*x&DV_eK*2f(lM5ap!&v_Eru&P-taraRox-rv zdg^jPCak3L_3VfDtI~3dD|{x<+hE81BO0B>$X;oAq*?)wySBco=ftqLViT`n;F0Cr zPE?*t-43Vy5VV5^0GncScW{V^pL--aKIUs?yT3KoBN*fAod0tW6cPEoe`(pzX>9U> z3TEoQ-2sStw&W3$hMaWCy8zh65|X93tlSMUo6eX!SS~Mmk&_iej0QUg`tf=cfF2L( zY?Ap;=0yZY^@F8~&;Ay-V4PTk?sB?Tfj*fV{suRp>$q>n9eUBHo$50zmGb!h`gGKd zpOH1f-?g9H*+pl_E)hSi)`kG-Na~)2%TeScX=B+301YprTdpL_0>!Zg^}96p+22S# zk}200-3MV8C@?s%yzj4fp#Txgs|d0!7+s&Wi)Zw@H5brXUo%#($|tC61?i_yygEGnC{OQw3-YH7{xv!b9Q=Ha zhb|{C-Q&oV>tp||JP(5jf)xZj&+ep%`rS`sqKr>6+pX9AqBXAEe4$hQ^vcqz>#1cKE;fRxd&0dTLf4$JtVZ4tE6Z2TI?wBX!99^?A^A4ydw?Fd&wNK1T?iV|g-dOt z+MtwNY1Jp@K}fla@BY?%cHP)e#5V2Cq)*uBu=N{ErtIbRCiy`I!iL(iHn*fNE-$b9 z9=&T&n>vxr*Wu|%YIF4*Abetee-!@Fl{8(z!7HyhD!WKxSlwM)&s0UhY_wg9!a=Pb)(DMt%m9yF|xkty!DL9PzY=}Yv}csAwXW#^hF=3OzgjgVrb)->T337H7ypuejQrX3eZOSJpmx{H=)4!r zesv&GHYbyf!ff`JIF!-20?G#}_9_OZL4{WL+n0D@L4RS7_Kr@cpsHjYh*+XAqwQmRLak@yRn>UxL-Fe~WF*mvuMrPFZ z5Fc*(x|&Rjtznqvv9tY?sewhp-MTJa$WddJsdLJh%!g-xr89t2Mpt zn~@<`{e?UtWNqg^g~_PgQL=AA0eM8_wH2MG`+xRz|1?%n`!|rHEj#Gef5~@j5&47C z+z|kQ^t(R}JGQrb@<+kfpRi6a_QO!&uZ{i%=@}xddU7|w-^RPD7E7e2zeQ$l5|(;X9NG7`5$P1P(Q>S>OTj4za}Qz z>W5KN9^EouI?bbl|MAnY*ZP9bZY~}Ft}u|eTS~j~8Uz zfft=j-l`4qdy~9!(eSGKFM^59-yA3FQ_CW?$vOWy?Xnwv<#^=ZL8n@341^X)A|LlX+a+kdWNd#r}n&D{80i#4sq|`q7n{qC&&O|AE(vMB}C8eaf zv$EctXy5%WG~NJok4-2*oF8$*`fUIFUE}O{ul?jN@f>uW{m_m!N>NVs{q3U6N5`ONXLqlqk}*Y<9rBn8>aW$piqHNeN*eas zcgE1RPCcuZxGh-3QV$1Fg|#v90o;cl{o-3OGERT}biF7w0rKMvkO(DzUV4gVti3ut zFs))s8u^M{8-Bo+pM-e4d>mQVvs&4ZG}?2llS1FIGif7f&re=-Nf*0D|Lv(H{-^9i zFTfSGkbHl0X!p3fWI+i1bDv;l!z)Tsv43@hqTMt+r^DfM7956};`aJnG2Yrj>fLH- zau&4Ymd99M;*Ajz`<1`quFZl2klw;kOIG^ia%lOJu$SkKmtLnal6-FLh2L#{Xv|Om zCgKa(wiRj*Prt>&yNzn{i=)T)$MA!7J;JlSZ4*axn|wAeu?lt;4~YY1YDc{cVcq+&+rcQFxr3>b=#`@8-!|5?nY|z@v>% zm$TIP_IIxP3zIz?uIei2VZ^Q=7Kdo6T$I!^;FuNn`tO-zt=>cLPY&3;PTP^frJs zj`D@|w%gVK2sx-V06KPLtxSuX-+G^1>}lZ5-gR{E&fP z86mr91TC(P53LWc_NvihITJtuB+^m`aq$#%-^I5Q`_b-s@Hebzk{7B9YJ29FA%+g* z=^8fQPu_BaDi?T9X3{Jpvk91IR&>UugE4lzzatCnXOFVs>%!WoUf{f5pWH=&XV&D*>MR28`&*YBea~JHj z6od~Pg`CZ3@G?c0XGV^K?hXo4@~oSyPhAP6OF!pRJ8zGs6LTBMMzUC^B)vkUGORLH(7y zT$6`no#m>3i@LRJ#9ub-9!*VQ4Mm+}?c5yOV5B<3n-AHec^4(fs z?k3^GPfakE-<@BVEMfLGb#6(79r8`_?>N0zC;KwP#o5;M9OhWCtTFa$Y*H`r6%`9K z+>w=%Ne^088>awh_N9HX(f0Sz zQ5Wqc<4NJwx`^^WPFsvnp_)suV=J_S%i_a@*q#gOt}Ki$!0DH48{+ zkz4Kbtm z#%6`}_M_)OL7nlyXZvj^j?6gp7nNteF=*cBnFckvP;=aa&r_VAJfwH<`!!l&p(tQY z?aCYCX=xT_-<9mD8g>DQ6a-XdO5ep+_8cg=&PzeM8xUy7i1lTUZsFfl9Tkc72{Q|(A4eU2SKGr^A{>C2eAHaF1Sd!X)zO)`CWSN3 z>w1nopwp}2W!-AR^hFyAc$?8`PXtrTSA=RLO)~w zjvAX?Z5DJr?5*A)kh9wwU1t5Fe%k;$0gq`CJ3RU00ETRZUcim?Fm?!YgkP;``625* z`aA9Bx*W^@Z~+91E^@*_@fn!zyT2R9N_fT_`YG>iW?)3RJQ|0%RFPGx{jMzx`14ot zvoS`n0zvJLeVIUH1LXh6dnNWGZYxAvm;Njn@G=4HI3J_@G7nlKuyBVRUK`(LYMP0o zhswUv;n&4a|2W+26o^)!cw9*pA%0&OC1T2bJAZ2kO&4MYtBjU?;O!D@a>(G`PfE0k zdFW0IvrS9=cXgNa)%OW8*j;^gg=kV4kx@>rJw%*_rGQPYL6_ao44qBh zONuLXumEZjzGu^#eti5v+vEI?JOqI_V88RVoiY5C3y~ zGdmPue0@!MeoC~zRp@caz_ge^?rojd_6bXOunz#OK%?k zY{T6^=-Mw4Qiy<3nW}k;KJ0XFc#NASZYk}@2z7NNIFd4BOg#kDE3Pdug9N87+l=M8 zs_aJBm<$Ck*u1LIcA|h+OP{J&M2rQN+Xz}wD%HJhO6kSH(X_C-r=hm$Bn&xe%h2>laPNdUqJn4cQL(rAKYFM@1{dV*XOvHN@$zoSet8t7ea4-bN zIe><7v5 zn)5+Aj=7O#94}y{#8j{2}sM-T9qY>h>b5PU&%FQjQ z=xj`vprxFnfm@QFvO+&!@4BsN>A5R!qPe5m7vgu^e}G7ZbwV42Si$>!Q~?g}&IheZ z+JcIP3+&fqxxy4&lLJfhvue=|<;Qj3A!_4xPY0>o<=dU=Z+*&7g~=n7y;M2_xYZ7| z{>p~D-iO0-%Bdn1bgz>f5;wWBY9sDVp}y~tJasUCt5OTl%IGWdO`yagCjX=s4B9>o z@BNfPlpCtWSYKLM{z|ksxQGa&rmv$hf2mvD_Stk`K;$#~D5ARk)7`=T%f`=_vubI) zbaGa*)BQ+dyZ9o04T8YWu;F6%+|11ROU@PtP#WUxT)OK-NjhGOa>SbopP>Fl5g>+95`sJ*V5yjgeaUt1AFZ?sqKNV+i^aAs$Y}Id}f&I84)V{Yl{E#N(R3X zyt1fl^)C?9C*lr-kcrQHMp#^johRQ#Dg`o2w=dv))ASN?D^W-fqQgXB;X?y4A*4`j zwDh5NeH&dzo7OaO8S9tC7aY-E-lllj6qUhgq_Akp0Q*@|C1^iJ3Swl`?ggR_ESDSE zSbwhvZm{k~!s>iam|VocdlZ=&N{l6?>n>-~HPTl9m+Ak*+FQod*@aP?4^rH{#T|;f zySuwP6f5r5;!s?QySqCScPZ}f?k;oselp27nPh%U!XE;JCnsm0z3;WxT9@6jw4?TD zrW|;45w?T;wU;_YBh^q6{PExJ?D6pl^gnQ=X>9EMOX#ZFSMo>gR{q5qo%@w)AZHFkzvr6*XB?Sk`<3%S78y# zluFjzCxO{t`qAu*u7=r&P{3J6GcLXt4H5411xJyladznm?)!_idD#;oI~zwYP~TqM zjGi{_QXPljvHye$T5<2^P3!!NXQf#$y}1X2#KUhqD2zjxl9hrKpLX9lwpzy%=S7|l z2zu3X_p^*6cL#>%KY?`fX|tSCjgBS>yj%PDg2Vlr=Pw{*;i94vc8`>n6g5xef2z_m z`a5S>AOxVe;M%zfDlpetYkPwO6~&zY+@qj@+L@KGBjLy$)cvYqJ5dd)hBC3Dpt=-*(O^}i~*3LF@dXHBrU0B zVloe2%9{@vk;qG*nuz(OKLo{F;8>-x-`7 za5nmUuvN68F4UGwa?q?1o869>#pxl+ck5>3<9q=lk0BuM!z9{3UF?UU4RJs{7`_;m z3t`N>VHY2Onv_Q z)xVyEsBsFJ(t3X__V^E=uaoabk=?_SWMOJuxiv>1N?y^vf2EnFA zoI)m4d9#tNK|Mpp7p7RM#atq|(b+NYjgDg}Q1t8VE07AFu5J;(Qqp(Q5!*U{m+qn} zD#xRH@n6eRH{O0>9^26VfzWR5cU453(roFaedA7g^fCRA#dk^}1Uis5O=N}14pCK- z7(@cTwwUZ#lW}U0|vv@ z#=q`d_p8UMBqap_45mM*Kf|3dqbV+A+-oQnVv53c?R#`5yMeQx^V5&% z!d*SR4>81C2&nmz3Y^Wnk3fs_bK>3So=2$w5&)%^K~L6f&-b5zJC$}BVtQvWA4aG5 za#yBQW?f1HYE+f^%B}iQq|T=Hr&#;WAKSFOz`zf*Ox3s?G?c%3NmL3mv#5X?^tE-A zmVTd+)QE!4>M+D+T3nc&1LExL`?{IpR&)~e+&o1IC^X=Jq^bt-QX6t(5*dEpeI3e0 ze@kmDu9VNvLA6t#XczY&I`d?v92#q`%7L`LW8EKMk=9!{)bzqZZIpZ{FU^g8;etvj z(Y!GKAh|3?)aYo_#(rdj-~k_uTX=YyRn*g_Du1KNZFx?8X}{ z8HY3~8pboEfIU%9u=|K9-W_^L2c`OSM93$Qxvj_hBpI$r9`YqxA2!ut1Wa+jK^K6!5qHPjX7~n{X1ph`|31#dKsQ9)TL91btjk1 z#V;wOUm1g3k^oi006cCNw(^&H^Aa|K7b=cn>;~Ov(p{9XUk^th{k@XNBAy!yteV*} zn-2=eVdQFg-$tGoSPzB(q-$9mmxqp}^gRoMp(0R=oU3=Th4AKebsjc02;Yqw@hOqr zT@R!_#tGY-?xU?g`CJ-n{*Q>V1OJ~*ya5IeNS#YV{@+<%Ds@{Vwts*AzekkA_xbih zJZ}-#{dzbhko@O$d7WEt!T9s}pP!otKgwI0qVSpz>+Cl&j%l&D_-~JnRg$sKEtP*q zp6&a#e+!S35R|6(?X)~Pp1D(tFm9`{_w91fs%Elax%#QFpOMx^o+m{qBaB6R8&8y- zn9QHf?jqRI3sAz!!2dw7I>s*5fZnoMzB=(5J&!=pgdhKEsv}B-w%TT#{Y;QLSHzk)U35^ixG&y%jN< z)7wX{$tNkrjt6}M4!4m}ubDXjKr2eIMz%9JCKUoCv0i7liLH|iEG-LdHe&##4u1)_ z2U;ZW-J&tC;ntxsufF`N{TgbzYd27Ivo@VN-wJcn2AuilbDXvuw-nWu&A5=!uieo3 zv%GHC)m_6tFxHZuXE|Z17Easy+=hBMx?$@9;y0Hq{O^zb&i+GNR^%dLEZ)2 z7=#xu!QBQ5u(8k44-k-o(!)u2!ouis)nxjM)tD8!KQLjuNvm(fhzquaB05??{pWyW zz~!4cae>sR_03RDo%`#X%+)z+cLim+yLl)G2=fD7!ua?F8#fKd1n^(JzGkoU%xNzV z{{bdEP&gpxRd!jWvEOA>zxNh~WL$Gre9+0&czAcy<*X7=Pc*w;aDChis6tPu^BRKSQ)=$aL>vIuZRu|RL zX4ul3@{6UST57SD9Kx;BNkLjr90}>4i*DiJJiN{CnPN_h?wemL%@WTkigw}deDh+8MmqJ|MwVlvgrRAgB~&df5xDTez9RzWMzwM7f*wZ zvoK?{Alr2S$P@Empen3ZFF2P5ijF!76OJo8-+1^$jis7Q-HC8gDO}uhRNBxaUPE&4AW66%% z!myU_1z!NmtGOXEqjmw%%y`r6pubx1NO2T7+(%xA|79YKqJL1IfM@Rn(k0@yd2_$z zhxtc-1m*$%!Bs3`(HZP8Zl<1o)iap?*Rx5DB>Rk3`&cvx;DFP-oWm_=>y)o=ZKWb2 zf4>ond8oZe$SNFN{&jjpDxy{ENMbhIB^L@U00yM!Wh?4%aC^++VB$fW@F4k5mqDi< z%-n(IOtwrUkg$)@vLxdCkeI0KNg4&W9x9PtFZQ_1=P>Ai0x}%{DMf+JFG!d4U0>5v zLW>q58vBIgg{6NwpG^}|qX0n(D!cNw5-ZGVXz&SMU+U--N%Bds;P*80S?AY$WwiFWjkGZocqTnRb5@%H7Er*!+65jojl&} zqhZkOK9BDUerqMiZB2&z8K@IMJ22LN)H#QwBs*4!%W_SXg}G!P2h3q0&IUThZJ%=1 zy?;7I;9LwtD7wsU?L4*eQprt66TY^)Ki=5!UU1tE_#@|4&HmC+`Z!Y2a|fpSJ}&pV zldfULHy)ml8RYf0CT}KGED+oUO0NbGwY3x##RPwdy_xfVsW-VxoIZET%6u)iyX)iPnLPiQX;1HC;$=MkQ#j!)l9KYb2|#ReQ22IMY*oy@clr(y%q(K!M8gA3 z$>a1n1h}He+{x79ahzVPHh?4`% z`0w)!)`T?&sA_Agm)oUIiT^ngf(e2IaxU-pyeLhG^zDqz4mOXsa#^>*a2Ju`N-B9j z>r71$z?XuyLVBO?DrBy{{OY_@$Ft4(wFKP1;b=l+GuZMQ?Db*^T)0Y(uDa7D$G`v- zVZcAZbWh!@6?bt7Tv5%=H3tCdE4PuaNILCx>(qS3hj2$}5M!Khq}P@LFlz)^K1eWy zX<#*_Vl$UbIUR+I+utGk>uHo)AU8jjcupR_Mm0nWuz-TT@#t=DV!|+xKgcA%)6gke z<{a8mcibr-B-oDG~eI8pg_d}C83;{53kj~wDEN(h9fr#65 z&gIL~ktnF&rmhDi93>BmaDXxPiv+XYphJ8{0Rm%7s0A&~DH$e+9YJvP=is|O{6IXs ze{ghBF*b`0UXR<*$R;5iQVEGbG*DhW@bq+cQq0&yYQd%c``Gj2kGpXxci673_v`&; zZpx9l^ov18S(?tYimUbUbf_Wh^^L3bz_$}9`Ls6ot5sN^anZ=m!F;!-AYQNCx8x*S zKUG*hbj&b!N%0iY$k;q|;jr-ze5^6snjqN2aQ}D_G1y@-w%Q`a#UqZzc6?WiNRc5; zdoVyLIEy>EWRFlIFpD>>Wp*jb$maP)Ypac#x7aN~hXu%%ZgDPYd8Jc3eUhQRc;sY> zOw7t+>x?gN@w{v3=%SP}*rts^az9ucH+os9+Niy-G4(C7A-EW^ZdgHDITdRgTmiCb zt=jjnVxt05I&?Pv)UaSr;GdKhU9cR4kQRDr^BRiL9D!2-rTlVpGGoh*kIYPWvU)vJ zfkTvfdCB`lf;{f2tIg}hy0aDL@fALcR@0^KH0#y;UwP;>evd&O8_2>&#ZpPd!Zd8O z2^xX9VMf!vxcUqt?d`w7vVXs7#3EHR8x%coJuosARf|o-K>wVw`W>CcIOrHcV3ykN z54Nef8duvP5z$C`q_;d>^i?XRM^n~$PGO`%vk2qHA*Yz*Z*e!wfEifA$8z(N0rRJAV=LehaB6C(DkA(Il~A^1un3 zW5bbD6ElNHi{-t!?_{vQc$sJ3d~#FwkujNfu7DDhGo2GWt8ToBP z56aMl$yr0*<;HbU31Wi6)P?~IP>q()kehk_RDx!VrfN6{nAlp33&J4- zk%<+F&%J7n-Z#`rrMrO`n4BzsK=KunBF(E%|J|g%`=s||vI?G<@J#?iCEjC?M9Y@N z2WPe0ML=CNJdbPb;fS@BZHU5&Slizf6nTB6nEOZb<(;%a*Yotct4+6fTg|$dkIGaB zyNS$GEV@XC6yAa+6fh;xSKrIOD$YC_neUsk49N0l%S>Lq7bk^_wIofS2q&IguJ=tl z^(tbbqMG+nW+G>E#W_^*>(1UTGCwzdtA0~iqB?)$}bO!fr- zAreMZCQ`NKUCoAbkY_L<0UQ%+nvDC(-oW|uiDw*1Ge_rd*c3dmwUNIEqjL!)_W@mCZyxaCtx z?iMlvr5~O#Y{kJrF^YV%Fhe?_KQOOT(N4j0%t6#r6iaQFJv61n%LQcX`EtEF^E2!+ zb>G|jX>3a52Zx)iMsEuUkYD8Sbrt-MOUQg*oX(kcx~@8=6#3Kexcyo)rdCs97oSmI zyRFh3B#H^w(+mfAKc94NKo;NxRCZr4~lZ-5(7Sr0^hHMcCN0 zytmoi`6%+m>-!Te;Tw_!!qA`q1EKTg~!cL0Y?vj3_g{qJJ$@te3e4s z3JpNn`zZnvcT_sLeJ^;j@ENwjVwyklndY1Gw26hBf>a-G;Scgu0e{2}ADiD@Yq}{e zat+@SkE^`$e?S0+cS;*dW77&jG#iHCHVqDL_~spaSp?_>mex16UlK_kK6RbxF^%Cs zltiw+PM@+h$ynAB{woR3)DQjJSwccd6W!Ec4jc{NqSVu{Ntx~$QVRpwJ7}!^1>`yX zOy65c0RudbePPu>S+9IvzI!Fdv>pd_B0)fqwTJLB$l<}RpY755+Zu8Wc;id--Q21Q zf3kZP(-&Z%x4L{KqJxpXyE|2x&)=-0i2i&{*WH}g#?+vDIPKU*(B(OvVuXc}-9|;Q zK#!(>hIV{c4Uq%9Z2JA#F#n~B*eSXF_O)&YnrrAA{3CII$7UH11D7;JkzJI1LS?pI zS!E4=t|I6x!_~EiucnFo+F9Nrl8FNK^uN3Sf<$OwtWD&KRMWGcG%We=&~p{%>(L_8 z?B{5sdVl-w+di9hL!3M6q9gwq%z89BTW6o8+nJ76R_*&K7FiL`2Qf}@z=TAP1ZrwY zj*D3iZfIfN>4RqQTX;Bq=@cIDJnefYH0YRzh<^Tr0%N_NEUm@B29X!bP{R-950tVz z&QLZ(!-Co^F#xpBwYNrCV*}#NJoarJjbNb0wp~p>VsJ(BOfK}5C^CGqzp=%L9hKr_ zC6%g#c>ZLqt;dd9zjThIU95ez=f*xmnEjRL)cwB86X9!8DCcLsT+h^rMMCBPqu=U# z+5GonLc5i+a%WXUL;r;OOp%9hj&8lMMTff6``UajvP7Be`;CJMaoy8Wlmi~$fCvDT zN?1%3d`oechGWQVt@zC>AE}A0fQ>bcab_hpGCFI~Vdx|B(_DG6`Bc`W5QCkSWgup8 zkJ|1mlctR2$wc6$2tl#xy}3)^e9s>eMz;O8N9CeL^tTn4++(bhvnR`yn+>`no5| zDCvQ3*R6a8k?a;Iv4dyY%qIN>-lfkW#!n&uiXn`6HJt zc~oHWIv2;@W4_b*c-ns9~94F*T+H#n=t;qq)Q1xFc`L7i=>K8*~Ee=YkLhT1C=aj(XsCfNShJ4VbneIEG)F4 zD==Wrc2U+`ZC4RgaRqqYwG_W5RjEZECn}Uuk%htL|L|AhST>Sagkt`}MK2f$G|$!* z5j060TAbpY&8~RXv9RI}HjmZIBAw#=iK;|Gz+ioQDgPM(QFi~M5efJu%BbNO1MIVR<<`!OS$_(lEFtD6a!) zmCgz+bFNQUlw89(MCT+Fq{}7rlbzyWyGG44bPJ)Upcs&$5p{9d7$sdR8bj;YYfS9h zexcU;T;M$YI6bki1FAWSPWF2@3hn?<=})SfEIQms(lU2s{_Tl$R+C>PiDIi^fKcTe zOEuxAF`K;O1CKQjC*dIKp5`s zN1*^Hahcj~&QR>a;xIrqb8vLYp@-`t7}3w{nxEt#3JIs%*Id5g-;q9>D9|AC`Hv9P zBewI%$yPUp3Q^tQgkX`Yvm}u$^j)p>1e$u{D;u}~oWTAxSLjb&$gix)9Q9_~)DMbO@ zfjya;W%wycb2D-=;7>9}!<+Mdk~Vc70k1kJrFxFNSY>4ouiK%k1rU`c>`atZoo{}^)w?lX57d23D%8udT%}hx}N5OJPxf zQ?c%G=cY-%R_}YR{x;Ok^ZA{GH8k8mG_ZYW*KYC-=pL8sV{xJjZeWtJWOyC-?ySW` zeN;ft?@?a7!!bs4u%~y0k&?BPB3i0UePrql+Iao(PXy@Y;iO%3Q>xwWNbJh^MLkdJ zAG0{?BRHkF)VmQSv7loJ1LggCP&B{rK*;I*sx7OeXCpp>MjHQh2yppJ3nKBJF!(lD z&jsZNU$^Apz$5JUE-~edbSY;(GbALSfWsJ>njli;?L2f9S)NZ(gkE)&wrVVI8r;35 z7^#DB=Jb9H1>H`2zf8xNej}R%>#FEY*v?S3K4)xy!**$BKHVgAh}gI`6nn#_#czCB zlR=cmC5n&Xz`Ei*Kg&3ME;f<5W^TMwQe7!Wf8okK^S z2={_?9Zv)(6S$t_+<*N!b@qe}1&<2EO03)86op~w#I}!GT+jqVhgL83B@a|}Iu{2# zNka>8{0#;p8VRN02yY#%Yw)YIDNQC1xq33efrmu%K>>=nr#u^kWf+$CW2asCHmG-G zc+%``RY`WJ3E$hgkia{4M@EvnS~S4^gB;cWq%?gc2KA_RgvpzDphW!2fJV4tHV6EN z>XhrWpYcM-8Z)D6Q>#`rk2mcY-qMo3nB%y(l3Iy9K;*7NufBIo;{PH^pQJiHPc!5T zL9CfF02OdB!cHxAOB&R+3fejayG@Jb&2TG94;ye_9xgdtIxt=c} zZ08ccQ-kUzK)p*$sh7cq>O^sDwKk9g@L$KEurjUU>)rBbvD%e{z@eHAUbK1qPVzp6r;2`YzlY@`StBYtSX2 z(g(qK@8tJtWpvS+X)FuX@iywlVv7TGUhY10iO)76nsT3kYQvKP-Er9O1j}U&BdXHdR?fm85WX-I=tv$*8Q6_&KP^H+pbRySh|Q&`Hp}vhd;*9rjR!m|Z)&+g zdP#)yP_vOIj6Xy3_iOpI6V)1s{Z6i7x!@E1>rIZP$}HKs|IYQv zR`vZc0k_YWq-U+Er++^{WQ`4;o1TWZ-Ql{BdE2ge+d%#Jlzraek_gwkh$37=?2XYP zb1-EsqT|~RU0~qzyj@4d$;YQy3kD8X`(g_I=|armr=5nD4NpAZl_vFE@$$?>9s4q< z-hsK%UqQ3Wn!1~FgEBsgM8?jvywKXL8oa@ieD^!&&lY6g7D{D^ch3nX`s47w!D?cE z8b?R)iOMgE>tR+TjyWWD!Zjt?e()=Ao&8a%i!sqJXTm2&RBf{UibqKixBV5w0k7$A zY<;b|C>1VS@d{~rDDggB@(s@38Eb#$nuw%a!pyb^%b*qV8IpJS{cU4BxPS|`r9)%S zcJ%o(n00uTPSl|3B{dh(fe@LP`F!z9kQe{U=3tiW>BkNv%e?1mYTbi=tLK%SF|74I z6BXwlC1g?}-TN>Q=_O&t(8q|&;XM7SmmD4It%z|;$Wl~S+b#^R?|DC}0}An)3EKqn zPxAWneH!{&)@4ZSpu1~7Ra~s3BaNVOxUNmCCo2_8vyX+OPdp|0YtTv`ABqv!m#5%t zdvL;dVd+wTLzM8?08D0|xP<8=*F}D^p94^z4S~+X?cp@rICR%;eEw;=FLK}7e^rKT=& z@{~zlm&5tNpCKnC4i^hZ8!6v8Zk5za;u2GrUmow6o2wVS*0c8TUH+}u0mlIdeiLw$ z!5{hz_j!|&HgHO?fBLXi4zIiBnu;rL+0j0@vb@>kE=H$s2e*{Mv_4@lV`dX&=SAD-)x=X9LW+vnt?jl%HR{t% zEk`uEl47RVH8CFML1qUHtq<#yZ1z z$MGTc`Nses>k~Ggc5hWn$`9V~j8R=5SzowrZ~tnX9q~=I=XF({Gmrpx(cM#rZ30yg z%}HZ2Ri#bRO4Z!hu5B8U6@&mk`RsQr*+LrrYGlfv>cD9EN;odgWS$y9KG>-B2tn1> zjU8ns+iG7`W%p;wH}z|@=+)(W-oOTf)Zd@gqIT)Ytrw6!AqcZC{91Kj>7$&lBU9PX z2KKs7#scV#pPu3zF7IbWa$LN8>aE1!Cb~FCIFCXMG{(=(rg~CX78log@v>xQW?Sd~ z3SnaM{;4EAdynB?S|<3qchy0r)cPFUDy5J_(cYvX1y|}L%Qg^ zu5QxgI;$Oypp*G&ikDkmliKLfQazFJFZ33KFqxo}x^C|S>cy1<{^TX&!UK|))9GSh zCDM;KZ=Vb{?5}nRvlqm9dw)WXg16{bJo?#H5C}k z4Lz=prFzkQUFml>y={Qr%0?}n))FVy2qvIyH!u#pEE(XagsbiTB zhzCP4>(xjO5$Tgxl~U1-Ov=kh$ulGg7&UHP6Ri7C9UT}^2aTjJP7R%QSvPX)IGrSP3XFW%G5>AhvT>_o6GtVbEDi-`a zR?gW~A$biYvSTP>VjxhK^4L$EgXr@mhf8r!6DE-|^)d$W)z~B6vTMvAKOwIo9moAKz9 zs*p$P5Vv0m-kI$m_m~*Q(zqP*v&w#z5G3ps_OJ8#Ie#?r9iXTBI>c_g*eQ4Eb^M@| z!(;JQ6d>f#krClT?Nv+MHKX7|>hRo;)`O-eOL&OH{1GQmpMrzXqdzgEi5&9-BR@XG z?eS*eF?XK=R#|T1BOl?RFW`M~4(szFX$rmn4^>q`F|GuRxOBX@&vVN!$KX7(u1rS) zc7fDTM0*SJdemOw!PhJwTJC=x=VwvhGhGK-i(85A{#LN~y|y|m%tc~-+f*Ao_i@>6 zcw;%3%w#vOF3Kn&pdJOqB5%gF_*U-qWUR%N;pdXE(LgWdy~ll9+OO zXeqgB_vBSuTOghBxRV#$*?+q}G%$yjnDlYkVj+FyJ(V>xE~jOXjPCHeyZ!s~+zi&!;=hzd{;fqO1)5zclQo; zEF8>JMhSaCDb#;aIVK60nl7qBdDSEuN>MW_D>Jd&J)gIOCW8?`9r;#7+cY;S1Z%tv z_Px(OIUamO&ECf?%EK30CEkZ29egnv9pMr6W>C^iok<7welQ*F1y&O>57r z|E*N^HeK6tjZvk41i+1YRV`2KaxBvMIR2b4BRos@?|NX%< zBBPy&aJm+d>;3&%*DZ5f1SEvy!2I?9yLf8Fe{mcD>6&rwjYfBj)2Cuc-oN+ouWZApqg5B>K|3}?!UPtfJm6@IEuvyC!NOLx&6p5n02ks@!zsVdK|n85 z^V09(Y*tFT=ZQTYDYMo10|^L=F8_D^D6C*^MLp$&H@~kIi?xM)Lt> zb)}>TY8TQJpUVwm04)Df1Tmb7Qq$Jg$}Lz4GnKm`MC?_)fq z(Q5fKqfuyHbpb<(x9g%oay+*+i7?5iZ!c8K5Dp+VeP`lUo3&e9Gu!Rg-1Q3yLp;45 zLuLKdhKSkeWbYe&{PCfrs4&>5p(xBGbt%oL^mQGJa@_O{O&V;KR+~^fv=-AJYzckN zhvNMAEOF(9O^1$OOqU+W^7^vHHVT$Qe`v}Kqdr}Jx?J``Sr<;^>|0L%k(_dv**R<{#LLnXVUIQZA*OT*?UcuBCmK(N3~+G-Tt z>pkIjb0Qncb_W7(!`wdcH*D|5{k$ik`_|?hHB=9~z9YW0E`z2!VQEbKjD#W_wt>vv zV5G~d`|Im#$Aym9`#OV-4-2Xx81GD@qWeLt=hyCN)#UJZh7EdVg6HG#{_gXrMs}>i ze>*vVnpj&(#zDt_JyFngf5Gj{BC@Wm^Ty9m{>64>Jb!zNH<^5JZx)H? zBkI?WLBu#BKy7=8rN+;o1L5S85 z7R`8HmZXlmV_`qEz0pX3! zTCF}Htxwt9v+E+QZjKH14>|HdZ>wPSPhZJc8ylOf825+*wPK@W^GR81oUd=kBHO(< zS_S`BCu&M`K=m=xI34Z8)wXiMO3~6GRzH8tBobLBUrJYTf&&rqv{FQ@tc z37AT=MKKR`=@!Sf!86>olx&BhaTTu34U$Lgg^%AHQ$JkosEa(i9k+0sa7$)=u#_~N zx41spNHtH#e|Evss8jTHwi%stU{eUH2p-EktdMECQT$TI6W__-;?fQS0L_7#!vce% zF<}smOi+)06M_A~Zxoa1iwaYQ+GxjLR@`w`+!63zwofk7b>Bv;PcAUnT-%47`wsk0 zHMjF-rU+1yG?BG0dkx<88RR}5jeX8(r62xUGE%;2Qg} z@Q6P54j}y%19V50W}@E*@}R@cd?36}1G66`me7;?i$-daLESzK`zoGM36ThtzE3a6 zDu`*{&?F6Kt)KlqF6&d-j^fM6@spoIoShqf*VJ1V2pM8A+CNd+k0Df-K3M&%t7bIv zhx6kbiMU^lola!0S}VqA8-Fr-(3nZ@m!l7=p7j`OYvVn|`eoos8=}n%+CBwx=z0kA z=HEhdiMZ&StO&3S^jEor*y0xN;V5`;HXdNV9JF8~#Wahj3cgb9Pfi5y@bbXg@gH7#LS*Uk7wdn$R+ z_o@A6RL9R&=x&DBcWy4@1^wGg28Mxt)2XAa1auXlKmeQ{#>fYy?s5N_1j&d8U>N90 zanJuV_`WILxaRHgJ9KW4HR>Brzl zzNlWja$=Cy>BoBA&v%4~*J!$VP57~_>q%WH2!;@ zN5)qk*Si-l~_XYsn#d1>3bWl`Oe6VO2<6w8bSXxZ$mI}S7oju%zq|ms(ygVPu=8&ChxU0t{mV+X`_PPNw2{${S6c7R z&x~_MdH2L5twwf2pQ*n~S{`n5EG|ex!$x*Ia~A1ERg9kW8snpaXC9yq1Ser_KL(bj z`k|-lq%s4%lO`ZAAS$?8TdP#YRS1sdo(Il&7aQh#Gw-4UzRt|^bIu3MWdn9_v#aCRYZ<>U=?FcuRmBz8R@!JboNwM8jw#EVTJG)hc=wE9XPtbw z9}pg~-h)(6xy@Xp%J<3jZSIdiL~m^0E}uDfT=mJ1vpINV1$~2;zre6~SDSYNDpaoY zDwkhR+QB#G7r4r^r_=ep5L|^1-tllIq^HZZ*g*pU9c?$njO-Q`JT1ul(`SqLtQC~J zr6e8Y-|=63Uiv03-a!R#48<2DEsrJ}Rb1+R_qDn>)l_|%VDx9F!Bvf>ihlEZhe!lG zx`YsyEe8rA)Rum?qSD6A8BBav1G`2i=ASAjWk;&eQK#ebL?+XlyY{9hXU1y&m|Z8V zTc2-~QFdQ?VEa8@8p}8|-u!r*aX|r+eQcgWB)$~kkm{9y+8mO7jdqr+2$~!;T3suE z>i$5N!NxIHERvo?QT&a^I|UvE{-M&sMEE1gBjNgLeL8XSChxS(r4FuPuR%>ZozRjStWIxg!|{7tj3 zg85%bPwk97MwvkVKLTF6(?g+itX2fTAog?oVkSe9s1gRYCqqdb0GL?XQRp@!;R6&YHdb1-IT%-#cHmu2iAX~t5VyFHUoriKKsc@bwSWX{rCYG z;t&Aa`@SmrP+!5H-wczSEIQN%_&A5uZ)8iG2`wW1eBQRokaN+|b_h1wydRSjBP6^y zJsF<(k_WOe;0h2g`yZNUy_^)Fp#A&a%w^rG?ox(qrhk-R;rKIfwqDoWAY!kSMhXZ# zo{FL(|Iw7!VjV`9Gsu6q`#T8aA74l5F^yyFfS{WTqjPmgb{1=OOC*zA2VFCaL7u!NAZHHj+X~P@MG&Eq6?|JJbBo)g_wAE7?63A~p zr0y)YUXb2=zfQ_B=YdD1hTq_|x4i6W@LMk`B`hfW3sUnxCzd|a)qxj!>lQs*nO{Zr zZd`9O{k-9l!kd|BIPYO$o zi{{CLfbO(>GKO}Rrr)gSWu?>rz}nc10_Y@Tsq33q#S0_bb{$AptN_4mORpr{i@&Ae zrFp^=DE#cCl|1_s9PmhCu;^$f+%6Ew6iBVI6>U#cgf1*Jusos7(v9Y^*f2Fx7;&6C zmLAnvYE(6RgFTkY%>8F(LN@s8HS_j)hCr*|iaqqj{_F*h&{Q<+LDCX4py=bBxtEXM zKmN|u>oHi{D2D+CBtP#+Ci@xKHQ`MhERt`m-?FzrMUGSxAb-7#g39d0<91 zASxD|vGP1#Xf3y^IPd-EhJhiIi)nFkZdo%#b+=G-t?hbYJ^A zVR3J3nTO z7QHX}o!TW)1or-~Vd^?^!d_3KeeO_TL}9EcwOQ^(R~>R+f3b`3-cg()SQ1)9iQ;1u z&g~g#@e>Piz|dcel5ojgwe!o*oy9@+$Q1fxm)%37pVEf>m11-8(6A>ATKkHUINr${ zP1ipXYRU+sYTf6*Y?X_jGep1atI+2h9XLk57S;vG5B1<29r>63*e#5KUTBdq%5Qki z1K;I`K|YVxtBB3SDV34(r1iUi^5Y4vH{LA=`@)(Edl*zM7vmpN>m7IbyGvy`s7`aK zffO4~|F?CpR#PXxvb!!g;2$X=3sWvtyW~?SbtM4mrfDM3WAe?!%){lh%D>9&_+o}~ zG(6kzmawU8_IUk$T0)qwhBjVt$i z7?%R!`7x?iZ{b*)hZPa^^+0RZJ)>gR&r8Rp2(h;!tpm|OU0LW4r2nNZt^gxx9W`MW zizqUffwSFQc;5J&RyPRGgX13)mmAmU*EnB@+3007cirt7S`5;oxo`4RS~4;sXc-01 zGZ&X&m$ZphOvq+F5qlh^ol? zgUA@t$Rw^b?Bd0FvKsDl6(U^qRnuap87CG$~~m+NGDeI*O5O(6fThL6R~w3hvO#7v)}x1BmYaw7sL5WzglJd?(2r?ecTo- zl^+n1pd&@OLajI!QAJ;RBmvnHxai$(GkZ8WoU7@F?7xH&n!`CZ7=-g7ux3Dw4gKqj zJeKX{nEhHG8%4%(Pj69$R~?!Ry*!?F&K;Q;+v-9g&$FfJ{n`WLlQo&;We6)ocdp&M zaKc-Bbk>h=;*iNHWZ2o=(bH~b>A|I!tk?I8@z+lrG3!t22TaLLyp2AQv_d?#-*}c03@H$oh_gq5Ap6)*EbJ z5L9>9Eqm$_xbldSd0DB3*7i0HYBfqti4&Ws^;*5Zy@40o!zJ`&cZa;9yn4l#3LqU? zFN9{FiWXJS$yZRz+KPUuR|hr@pltU(YWYq@i0vQ(ojTQ!qCi(eAtGs*ulTu2Slxphcka{9+8$lYoSQ}bv{%}Bks^eqoX=K|ye|_PYQc&IsSO5n zE(a@87y`hDIR!}XH_z165rKy!BqRl8x9+uAL;q}hpGHhHh7cD|YXpYRVuK-x7(Zj9 zyS-;#)`MVhZoN!s4c-63L?gvyJ&?_T9*c`VjJu`|gIp;iL8C|G0u~S@BZYQ#-y4*^ z?SYyjTw58lH26N-@@{%wO$W<|)-r!=AWtW7CfA^bH9QT`J%_Y4*MUvhPSK9eFuP)5 zsHNR$Q}QvVzch;4Ny!n_ipOzg$@5xAY@CQB9Q7G&xetfcUA6B_RXoe9+dzdW-ZGtt zhVccHFhcCwb?Fo}y*lMyNa35}G1r8NgsAaCXLRH_XmGLuiOa?*SHMsXX5)Fg$fNJ# zqw|rOGFwA!L&gT{sP3PS)VYvg8Zy38804O)vwTFcQ@W%f%T5yNU}fyz=tH*OU)@8yGt)6lYkl=yJH%?3SG3*J%kNP zf%(<7n54s}__(_@fa|e{GwB_7%L%{=eW2h>G* zH%w$QJrU(}j>VC=D*ZA^(7edq_>Y+pL>gYHk@nO~;@7%7ZvsCZb5t~=R7z**RBk}; z%#8~Vs2Cb6Bcm12vGK`2mUUu`uJT(a*K#KIQ);)xx3wkFkG3#qK413lt7@NB@17yW zo5svqDXGG#qhLoaPGDfb2a(*#5zZ}iUdmk)TsugLK^f=A{1#SHgyVyOS8Yn-o;DIP z_tn$xG4>qJFK!t`15I$jdJY7tvjcfA%f<923J1MMZOI5*c89Je@5H}v9ew&UD2>1# z*n!+gz}2;#L)~SG@aT?#+N?pVSbAv+sBAJMCr5(be0PnU`M00XlRiCbX>ySj zD0x^*lmF=SdZ!zLf@BvFKr<@k22acMD^!{UMe?R=6<)0nLu{L}_uFIw(6!7SHd{jM zTO%vLoAE&zFc6Xm4Ihtb=U2+R%+Kp>JNOobUfxzTPo6)T6Mq-Zd}`HUByJ+-&tlqE z38{IFX>rF{wEWW|^yroUQT$dbZ+`xrB^RXMuzj2?1HL*t@ffRA!g!h-mBNg7OO;DT>5$=Eo-_3&6j9fzGqTE>A8 zqA9KobzKif04TniNj7Yw(Up8pMds+y+qh(zBNBpoZV;(^2S91n{;@8-pss>5!-lvP zqcUcsE5f-?bR}z$T>9^8Zw)R+&dVyjExJ9;bV)&!{s8M9xq!fv%Tzo0iudDfqvyV% z4DU})zw(T?!~LWqWx*b`y}o`Ehk=Q+dAIM@NYz|3-m7gp1IegJd;sm}a4`vqFd(U> z!1!Wte0kpS(Qp`06g_#_X=H&UIh%+J2|9cG(UvaJ5H>c3nsrTWvpeke4{EJ|>t$i4>3p%5f8~&e%eh^o5(T^C)u9Rb zsU*+WQV{Hb$tyywHD?L&mUOJJZ9w4%TJ_?X=3mZw3Nkw4AD=I(+kDYn{uL@2Aj5^$ zt6|-oX%-LD!MV@2dmJ3pyS+HB5^ao3zAFyVNidr%F1B#nT|!H8bKEPgJY9!B_I~Y# ze-!t6J@^5=#X;(xi7Ok;Ndg`4ezg+R>t?HH*pqJ^+Dmck4WS7oMV)@O~xJo zV7$93(V!F6*?~ZG6^-_tnbg*b~@%xz4LT*{r;aEHNl_8mMnd}2gtN3kc@OFdM zRt{(DDynC4e;5umA=5_H|@V z-6(S7L{p`wrp|AeYTfd&J&Pl$16QhsG z4Lhw$pU)@#R=xR<%3}6c{(|yoCC75lz~N`Muq4(DHw?*jQ&#oz*0!FMhb7~OhgXI*}$~ZA7=80QuQj*=qj%2>= zR)h#L{4yhJW_ojDy}XOF^~|#pvl_84GJ`8H7Zyog;Mb(F`9dk{in#@hcY_`8WJV-`qhoyLmGo=9XHUt>aF!21?EMkDV_^EVR&M-c^r5 z*Nk&)Mq`ZQEC5OG7i0nO=iDL^5GN@w-^~|~(&n!U8`1~Fm{#FXO>GD7I`6&Qy!*P= zC*}ir)fIoITwDwsf;(UB54^rm8#i66zUbyD1`_Iw1f2Vp#a|p@{vsW zSaC|^7{nAw#05Lun_`jAkaUyyU%GLM_}}S<5&)*r-Hz)?c@cy8JO=MTH#gM(JzwzR z%BFAm_Z6U>6*yw*S~y9|8vm3wD7Em(qhsVhbX z6e>=bmL{iH)?i_Pn0@29gl-{DPzKT@4DIL$gY$i~rg|y`J!5{bvWW@yCCQd60QmY? z@AE6GK%sZd60Ok(hHUG{69MS`3#7bwSq%evAM2!uK6cF(>xV!guC^kVmj$p@^aR+k zOaKEBfrNH{x`RGnAA(-N1F#z#8P!uKltN@-uk4BU-e+r-n9L`-Z{uo$nbKt^(K1K~ zZLh<|>}85E(~)hgj@^M(WJJ-CD`lCHR-VHm{s3?YkuJISHRSKpK{c(OXrqNMwuB2B zW3=tWaTgwt0dw1-o}iu{WyfJ3Z5yXSD)}PJsB-YupZ0^ilbq=*Y06+@s>C~{jCIvw z?xS^_hRnt*m2*6vIA#7-7R$d{65l=o0NJyJ;P2Je#c%#Vbf5QdkMBmigGhTH){WNF z`hzBABy-EvM)4&0UYZF37&_Xm4Z)WPcI(^$Ydnhu!jkC{dS7wg=9DQR3 z|6Ce{_r@LdpXWVXwU{K$IT_zfU+#1E5D$ay=Spoi4vg~yC#h*oHuV9_wbVLe6FOp@ zK6Tt*V+4mJIjRBGob27i27n1$qaAya>RZLm&a%@)cMPE+>{G|0r6BRVqS!7X%?H$1 zvt`ONf98x`C`mt0?X3y0TbvIJ(Kae%Zgqa_n;0LmqBflq)Aw>1sUEaG-0F*hM=yb(0Fhl(~; z_mc~Y!fVJZ#}LKAt*rohQ8}4R)2dA7`0rNIwj8-~RAKCiAI8AL-x7Vh=F zSEKoQ(!x7P2C1O4?C`_ekW84jsSwpS_QL>vP@HgCxP3*6iQ{v1*0gn=K;q|+o|@PL z87e~{0Hec}3*!w&K1Hz&o_Cfg=IJ!AM%AN^4D`~oq^;#ZtGt(A_^F-?Or}#PPyvtA)U$Ze7g_<~j+m;)RE!Pv z%=fQN$s#~7AA(#3Uhm0bz6Jw`lURV#?-Y%#vkJ@IqwIK6rSv$BE|?2GD4_4%N^4q; zQk-{|>V2OLi%>~MB}o-=SrmLe6>imSxL_b$3e@N3u4Go0c_2PLD`2)8&h0g^5VoT=u z4LV6-zF$4#6ux>5&@dnzOFPcdqcHJPwu`{PGu;if5I1l#yn1f;Tn1Lon(Vb1q*@PY z_Y~xx&zgS+NE9BgPo13K~h8oz?RGrMT*sD%-H}9rT}8I zbB+O@POa7MxmawM0b)o@EvkRN^WQarP?FyWhVRuiNj*B{SF4Ys|Kq-p^n&rg1B` zS6<%*W-={=;&I|Gi!#~rOvMeAmLLKo;xxukM^X^_Xy+KA>v_Pvpx&#nPdaw*<)gyjHl5oUZ8DEqlV$hkK7uOTyW0I&td-dk5?^Mra9U_ja(~~8Kf6wg z1`XYxgTn2Mpn}P6Zd}XJg4G6Wwd#!wHZ3O@jyYVvZ!q_q&3gzOvYW(`BLgEtK9_0%@ekZIU=M55|{ERU|ep6AyY&-ktnM=Txv2pdGX z-P4v`Ls*fYCb!~jh?!pXZO7v1;`K|5uLtpr04D3Vy-rOei?5E;bDi>%luDjP?3P;Y zmPSawfNFS~T)jtw#RtXnF%MVgwl;9NI)a*n>h{AGu@1lUt(S*sHNhxDd!TGG-=c0$ zDvFo;aY314ZA1RgD9oH)ZKr)|V;Kw@+L8J(*i4-E6i*LAYCs5=28?kY zhAW6O>J8q<2(I5e9a;V-cZY=OH}WeZ+XWRzp)v?=qP{$?G&i3JS$(0vTgc?G|DsLx z4go{V&Q$m^&Q{F$^weSix>zweaxIJf-ggBy z!`N!**R+3@mjl6kAoffcAZOx1q|C>9yhwsHrUYq92^pzkM z2=UWJKMTQ~O;+rk(zj7098#f{CpK&!XLJ;nxmor1PjF9RjRgDooMv8El*3YRI_*Wm z;=a9>Gk=@H<0SA1&sFWNrIYQuVIj!A@w*T2Kw$W^#@Tf1h_K^BZm& z>YSjJ$Lj6rR_iW3V(dIVeh0GnwVqau>(;rqpSyP@JfkF`-ch-l|Y z8Vf!ipB_q)X08^Qo6%FSbAKWSzV^Soob-KEJF-2}sdZcPE0piaa2`bZj zD-N#ICJ`LB!2sERb0~IXT-}SRXvE`wvOB#AXtjXw464SOlYZGeBl{b`e6qEKFk$6o zf7&<`<%ubOpSg=b8w9-&2BdX;1p%-q@Bj_tFD^!F#Fwb{>&U2*gQtg-W@pP-x$|~v z3Rq#9Y%J*mk}MyRENFqd^?oMolN=usx*QIu!*(nZA;iP>`}LJX_kFMtH);BK!4YU9 z%9{^;X$b_nA4_5HoS;wV3TtAtd>d&_5s0@z^xBlo%k7b0JRu*3ETw?~L z?p}~uSsD6AYiz13>}3SNN8XymbQFiUeWFiFS-wC18=l+h@J)br`(l-n#{x?4?)hXu zu2oXsrdU8O266<;C&H4Qi(qNCuJ4FISHHEZnU>Pb6qMxO&xaw*ce;~93N2OJxpQA8 z+z#{(^~Yz`P7FRYC3_m1fZoP&OP2DeVzP9>A$b`^I;zNa2)~L$#5d^~Y&!L&vIlB$ z(>Nn>a5&P8T$Qw!D;Z^*Qo~1AbTdA_oCq@7Nk~6* zL3=(jq@Pxm>edmrqi*fg=P%iDN7}f*#YoNQevZv03$8|dbpacePI!IT=CbX`{6}p8 zw+l8PlQOEsVc8ue-4kW7+%}6W(Lw&L%ZHWG^dHVLq{Yf*8Z~3%bhawlfqferFI>v< zK-KPzYpy?dtD%Kebp)$<-21X$8h{P7ahaO&n-uuO*PMJ=JGXY>HukS@jm%Z4RT=-p zU%NfI029G-p<=L6rhcszOYm==^qu$e=cA+WssjQzC}3cAUVM2iTgd$Q@O!ZDtOSVUAgM*!v9YjwJVyBh+ zkI{0Wix)Ccqt2*Y9EEJ`vLZZaPhG+~Y{#dQ|4-|-pzbWA%v%U(>H$sIBZyz3hDqwv1Yp8oY5rmVX^=HJ{ znmE2h@Uv^gfD6y(i zaGn&!Y&X!{X|k#_*gTT~C>pHE-%>Mcf^o~Kc;k{}@41)T)N_AFKP}(gyT!GnE)PUC z#HQh6I#*|UZu7>>k4kT48^6Rt-yolFuNPtS4r9fAB$yiZpeEsNP`x^>=daw~~) zOSjWn2%#FeE>Ur9FO|_7143j;bWQuEeLm7EwN4D2?18ttWuYH3SFBn`C$?JWPejX0cU^76h1~oV- zl+nVb_T`0%p#f^)u<8Q-WO$(j+5_nX9ida`A`P~pxZNf|`|y;pv_K`~?8HNo-`uEo z%UAa#dxf{qE4F2s7aH$W!BfIEEZoaj-$fyV?5c$ql5vVBWSRH6BB88I4XB7%O@5<5 z6|wc?=yykl7|97U&ZT)b|Bk;2>^QFqt&sKDxlP3zNt59vtG)|`8(d4PsS+kV ztHi zgqZ7OUbuPBewtmSFH9`FJ&YXY@$}FwJT46j9_TSCFtuRiR@=*PIUcqR%J7`g8(N%5 zX7^Z|!`Kz#;Pw4_-Jv{U3Yuj}y`nj`ghk9EO%n9<3zMYWRmlRPhobA5uOHZ~rYlnz z*XmILp}lXW;TU9q%5n<3)S7zImk3MB@rhsxRL7$*m}pT21y60&V1XEtGSnCv1w0-0tgP8R$YuFegS>eqZ+ zqZRvJGIyN$uhrPdA09|QM863IxyJ)&1M39z=1%U^m!b!W!6||!{_yC7y%L+<@{&GX zRv5J-gwJP6V6TXxr+&A$Rz+#s8|F2u*N*mBNTY47VzNMkEqEyI&BO5WIZ3+cNFw`d z(ZzyTvpAF5dwmSUmb9(FAGHo(1gav|?WmswuotOg<*${Qx%Etsij91&R6)g+WbLv@C>z0S5C-QT^|5ADx*;Vfl4T3(g)~}Gr@*#^P@%d9(4N@3=T1IftsjGx8I;96C#&fLgyM(oXg$55xsuY-2YpN3 z_%md{rhbiFNelL3k76E1wDZGjQb4gLoO51BMF%Z<9BU&-?~l$khnBgjei2J0d0RK| zO#ye`{A)KlU(?N$#HYxw%*Z5Gtk<=Z#JmrG&KksJQ!_u#A2!?Yo7F_S#bF)5WGe8s zt^5v}W&^$nK^xm5ZE5iG7hZC7=xSKmmXYcko1pz!|FW>Bnz~wc6+7St&nog|V_T7uRa-cOsWqss+08*CS@xkX2)T z?1;XUzKXzxH`nH(1jM8DE&VDE*z;70UrVzz(Bhj`^kk;%Jf&B$s@;zJJ}Rk6S4^ot z9p$u$)!-{zFoyDh9AG*=DQ-GrKxaXlII1Ok@LPo*Ki|8mx&Hh^9{{z2SidgcJ!?>N zQ#+oy*r?h_i z@A#_LZ39i~?Q@3(%fg7nZD*t6+}sG#0XfCo%<%#HqP<}>IxDow<|(qQit-*Y;`MOr~+LrK@1Be<%m5S{>Jm62@iH(faV&LGU-2tvA( zAcK0RK9RUfk6v(Fb$hpKUZJ9JI7*YB^ps@7wc%R%!Hxg%8a<2NX65?JXhOck zdPI1zEM3`oP?c!FyC3nOM$siw4Uydy#kAS(#bwGZ1a?;Ry}QsEyh3{t97kAwOWY~fN zs?pfz#~cly9{j!yGG&15@&f_=INDL-AD9r0X3aKc>C-yOW1ALtntdEjVL%i@n#HBf z!|x{l(1NNd`(_l;b1@QrLbOnFNhWU4yyZvXbFH{g>4^xan8KH~QA`D5c6#D?g z%O=VFOj+4EmKArfdiysHuql(9i>L5&^ZI;scnk1xM0{s&yT4nj`^}F4@BQEAMd z`EXV)gbS^N^*T3V=9G^<#ODd=&m7|O$lO0j>>XHTcVK4cv~6p-1SEQW*$zC{hk4IT>vOphI3a_NP zSOIO^qOhP=`|-{oF&__{rbm%{z(>e6L3P9Fk)-e8S0;ujlON3G^66iaA5VOIM`&#L zf6l8-<7Ho&P7t2AH@q56CiCmQcPz;eUCk~qM_4KU3}$0(SaV4km6TS)(5n|3g6Df( zUiF+L9EpcOl$`OnCmXHas&U`|pT7eYp2Z3sN8Kfbc2RFlmm{lYcX_ig`n}n2&nDYf z1+|aO;o#N^E-JyI*uSwV`sA=q7dddy*gnj>jyrCiDeKvz_1F7H>`t}&8r6W%j$I5A zxOz(&x4~KOZ_$%{T9HeR;`a`&jO=$`@pW5r?xuK zDGukYv;@TH8M=jN>W2yddVL$iR+p`zg)E6U4Ad;!!pccub*cW^U{$;N$`O*3!fi&&2Lz@6Zv@ns`F%wa{8NKCiruqy4{^;4i z?wl3`i{aWGNFKfE-sr;#M76V-4KDZgkFNk){1-^08Uo>_k~X%R4?@-HK_G$VLnurE?L}`tvB{2GPmbo{ws?{Pzq_7>HgGr!LQyR zAC*7^d}hV`9pjbh2zYsg`~XQg7xTI^2!3dLOJV>Kf*%@Oo#S0SsQLf_{M}U;8fGDC zjk*4uFHAyfV9^7!qK{V_0l{oXBez$tmsV@U^ef`kxLY2>KL_6V_F=#RB}8?)>3^oe zzOQ|Is@QeU_dYbePQR5l=6yTe50ZI*k)S5vc6AJ@{|6j>i)vOFAf9e?a^#3>NJOY! zoORr3`ci-bV7PjzdP&GgNgAG?G8o|%ZpdduKD|vF+2e|*uSxPwfqjbZp`5+X+0pY= z0K`By7!eXW=v1b{qHtdvN)|L0S$O{-%u}cKi-4+a-U~pO+T~|cgOqoI^Op7`JdRsj zBGb)P#`E&L1FhKOCHKTjt=WDgq4ycci;?zvV!&07#|0v1?AR7NHGNT8Zz9N^eSt%2 znnf4|qn;T80<=X@N+nXwopsvC70IyoBL<_Myqr#>kRK#OP& z@OWIB>_oL_TKH;rc?5#;7bb;Ve+95ZJ{rXB?N`$G;dY1W=J?>`S0s{nXD^qx^8&2V z=#KN6N`<~pNxM|yfom%saasBFQCAciVf%5OHx&JEdAnOCtNEN_MKZ*AOs9~;9p#u@p2P|eA)l; z(JuRw0wKT4=4Q;dr1QLj6V0-vdQ?$dV!{pG&qbj~VdlK5$iq~gM2Sg+#2??kf1e($ zq5a#-WH8V~1Qra@NXx#8!jb}#;ijE5>b%&)nyv`21x!Ot+wvO82>)o@h8G-g!0JD02egDV^-xujHm`ePGkOc${F)K)hqK zIqlcDo??D^Sm%I&?NZa`ac_JboL!<<9InCesP7n~s4Z32h>T z0F^9F6=PN)K&1f~{ZWLDmCIM<)`92YFFPF9ah)B%jUu5Qt{_CE_7!1eBTrS2n}KON zrW&r{?~6aje$Avq)=+8tE8ZqgnFP$tJPJV4d%2c5lFR1qsA`O}YlYx`6H!Hh1Cz9TvB4jy4Y;9;8md7_R_S*TFSWAAliGVvN% z{5dbN!GGj<9)Lvn$?I{B+zBE}aea*fNX`&9a~mG5UXDhQ9^TwwM1H*dNk)M?6m>)I-1u@$J|=O~Pm)8U$g zhJj##8!q1c-ut+yORuU8ei%@SB?8%z&xGtrM0HRap2W z_&ViHj;PH&ztk;^$1s8bEdIH{+*D=4cR%x~-Zi;2yaOwrWIi>Itz&1$SEe2i3XM7k z>G8XF$X=g+bncCPqV*>UK*-Q~j9AE4dr1@h*@w62@~~8Quz2>1Pkrcn=+9DlubcJZ zW-T*ISPuW&lfdx$*0)~ix1}mtw}}<6RGV-d7*M8xQ@f%_cNXcd*(6jl@$b9*BPH#< zMh`i;_;26uBSn>*{!SWEIwW#T_`RpEy~bNDD}X;EYItzb+)%JUY;F&8s5Kqbf|(bI zQ$-pO6t%CB)Zi?_kVJ{jCuGCAbYCcDa?GkplCU2}R=0hRNRXT)&~0InmqS#AICfIq zPSgqJR8bdkwsdib8d-=TG(}NT+e=aSq5F=u2oA>b#1Qo;ER?QC#oeZkZ#_ObtyM+f z&dLX=YVRSN`{G7hpcZ3?FZd=Vz*_Je2O8K!zN>V1p16ppWmI2D(fi$geJ~f+I76p_ zTsif{cLE*P*tQpD* zy;&;U`S>LIM*U*2!x`r3O*bq@E>=&%Dq(XcxfT@PyqdwD=PE&(@Dh;L=fKbd&9N)i z{YP1VHBNaRrkmsgIXS+ummqEa!fBPer1)gAu|FiT!>Db|nJrlpvGiWSPu~LU44h|1 zg0sWkX!PozsZs5;)*onV`VmL>&)tv5EkwA+8x2q;1Um2Md+oSw3*(KxMQxGukNYF~ z6kSEN-wv$vb>v5L++|a*<6NH{hsMqZUj+Nt`PCe`=^C3K^0|!l#mKY4Ln%_6Ev>}F zj_s%O;UQ1bu{PNcIoFLTY9R3zs-D`JaPnCF`9{9G}q!H zV57j-o_k2fvV}+krgw|-QE&ClVz>E?G2!a3XGzE?0+k~nVc`m+%;hS6f4WxfqTevo zzQsKKOe=%2tq|Opazc(NY%Jxa|4hqzE&zkZmU**Ns2BNGll_^N4syopq$jE&RIT;i zm$kV`=#GbzAYwx6;^#xvcaoRc=$$Sut7cdcIHf6ikV@SB&~O^A3N-y2F7mJT2ngb7 zDM4XlMQ_nIQm(NYlQc@mG!kJ<^@}1^W{M1*<(Dr)--A!qs>68xA)bV7FSHf3D$x#3 z#OhCJ!5<)2Xwqs5_#mBE7BC$3oa z7I#aV-()J6t`=fzntyF%|89dOAHGSrt_kj-hsr<}D?o*JwZtkLX+7A-jL#QtlRiuR zcyA|c^SpHv^iEyN#rSg@en|pL3K8^FZC9t+1WeD9wwIL+SkzrANSLfxLGZ2{qIV}; z+hU>+xS#x_m&*V1`4^fW*M{GX4!;!(M<~c+y}SM!cGBtV?xRpGSJEIx2bujdyG+JL zLU;XaR8Ox`^Pxal%XlQ%Q!#x}LR$U=q{eBRoz2@5+~(T&#$-;Jzps}`5dYeHcRLD? z@A!irjqCQNrf>gDr@!0mrR9jUP~>?7&vH3G>?fX$XWI^L)V83&0hxHah6qJM&a!3( z&L)}ybh!ek&1NZejZijUa=4pYca{67ky8FNlX9fRwYes`;2`RgYXAA8rb>rj%5D%W zA`Y$njW8pHIgv(+bCY*a{FOKHj-Ixk2~HJ}J$`uVr#dc#p|b{2)q%Iybm>b9d~?)b zu?F3thLpi!bQNoG9P{=H{cS{v6CkabQDG}3U{AWk( z7uCkI&Q-Y4d6|c)ZRzoM*m-fQd_PH1N%Oy4Y>U>$$Bo%ToiDd<^EOgAGzf5{q&3&V zGv(%1gZpA(4(B3}YtG+7Hn(jvPianHrHZ zR9_Ja&NMEa7l*#yE`7{gHLsN(-aYYt`tk*Ai=XIrM4H_^`Jf?ik5|NHw}BtkQN!Gt zpiFXschU_FV5ZiaDGD8Zdvm?MtmGw9dN|Rs_2hfLcp`CtuO6t#Eo@$YP8%5?4GF+e zQQ$9ye1Cn>@G0n5W*Wp|x^Hi2lEBee(R0sQT}{xI7P@cb1U#_vTyG42=-9dYCA+dS3Ls^uzQE(0vs6AN$>-fVcT{M5RfAu^%7+XfKaFCQ zjyYR-Tg2n$p7UBP)yAcQtNvQ*3A8x5fA6FcJ7iO>8Cu5!fNK52P)3~liVx*ziR5s6TK?0zlrgvRoXu8rn~ zK4A$@hmvn3(Fv>Zpe2Y1%!c}d#pCUgMeK3*F|T_V}W;!NgdZ)?}yEF-5;l#x52*|Z>nk<_yoyG{|-Eow|Z^Nu;t67 zxIXM&F1%{jJyla)7ewAvu_t9O$F{{^gblvEdah*PKU$lRsI1Q6=eI>s!f)E6y*g$$ zNWJH4zW>?p*FS*hBh!MdIa|pJU5vO=XTNwhX~x&)u@xRdj?fBHPdPviX=|wY4B`~H zG93z-k%;_oRZcb`b1si-?{r(rT=ARVsVa_Dc_)u@wcXHYTyvxEZ-DWptaI*ME~t%PNC9=L|mPK1eBd}N9$)n8rMZrzFZ))kAeFOPqG zzH4R4gvBnZsHG8`nSt}(?RBU^@J?^?kO5_%&6%H#?eQjTk~!`D=f%1CF`>SNgrvmy z5Br6K{sF&1ZQONlb$A`2f{$3lN0Ec@hPK?sCVmvcB+^C2BydXqS@IJd;#CK)E%?vgC9(FRc7Cd#`c{(a!?2(2E)6~8X(-PC+XOPVu!V*^`jD-y$|rx6HVtf{Kh z4DF@)T=@HVS28Kh<1ej{DRaJ|k12S7QuH(dre~NSaZges_n%mJ`&S8*JZ>Tobn6N^ zxd_D!%-85;&7yMO5jG`t$*aF0cRf%2pcZ+mvB-S$|1%39G4|Uk5=v5TsF;3EhlWP* zy89?>UWPcCuVQ_TUSPGK&&3?7S*ZkHj_YS4eeu|;rzQPN4q zb>AM#*6BP)8n%)6htP8TTgQHFsz4|R5xviKkBI91Lufg=esTJ4+)dYidyIZc+MonIY!-HEeP>V} zvwz@srFgNw+A?}*y%Ki$^g2R6i^J7$XD=~9%OL!U5*YxYU-3l-AZ-BDan|Gka(rajp_?1pTYVj!MP z+5R?*Isb>Ir783;3I6x{O6r*@GXxM)77EBQJNO9F5dH7-57MQugc^wEt*YFmV6F=@Nca>uG{jxW@#1=h`x(F*7K}|Gp39!-1;a|NKECI0K}g7lR-)t-pu076jJ+ zf77(gk#gi91s`~SW_z3o6uU26*gGTGOu9?nA6bQcd#lq?G0lE>>yYw!a?a+oz%^(& z9Nd|0i)J<5z8+|#O&5!SxyK`(Q2*zwjQ|1p{~fKT4Hq?SbgT;c>y`79;}<_WlSIY= zXrCO-$cpfI1o1lmoU? zUEug9f8x&H>sq7$rUrT%%d*@6Kr>xQ*sk)U)A!>sC?ffDkNi6mMQUcs`8s04Fa|#O zR;`hne5DXc8hzYw#4R2%5gkVpsV_FBZt_w(AS{k~gPXP~E|iOpte+i*!*YO2Pn5{!moRX{b7ZUpu)<8I%`DU(wvPpb{g$&5_ zFRyrDwsGUtfS7${B#vu4{YBMjodE2Wm#Tlj{bpLdraRl|{vl?BjvcLD1o6!>D&=Y1 z8!5&ElQA()WI4(s_`HZI;mz9?J;vz5;dosWv@+Qi0HPe3Zu+(&`21r#r0&U-sO!Fb zbYJ)SY*wrkvlA)fLCPP3zxQWvq!5Kk4U=Kw}=%;~D&p zt3w9AR!^+QZVUy}SH1%s{;5(+qwzIK@mg-~NkzkBA5j@Fe|8n$lvxlRYqeDOf4;Y5d|ImBl!P8np;Bu(NN=D7|AyD=E``hJZdp zp_l#No{Gj#D6F>a!G5p>0uFj!w$0Smg>S#bNPCgk2M$RArt6bK^^cyuFepr!liz1M zAKwW$Y)TFfxlHUsC{8B~=ZPi60EzGLrWi5t!+!2%AU~cZNikD*m`y(3dv(}~$0rw; zzFmI3&T7*ye^?aU9biI+Mn=N38+fYP4!TZh`ThDF9u=ND)6J-xIvL5qTb1W;`=j|C z;^Wlf!K?&z2epu`3sU@4#OuEh#!WV7zheKs7DXe?9vgPF@{&?ne2{*K61#|we8c+Q zoF}vf9!*3X&4Cm1r@<^`J)8v(#2p3*ejl7KzK2ca#$b43^)e9ItHwN-;4pqnK82{V zIJ7LCs;#q9S4CY{$7R4l94pNl@8n&cN*!Rv)2t58*Z(l2o(gr5cL1%o{(wd&%^PV5 zjk}NRVQ-T}oa!7~d6soG_sIX~Wb(yj6X>3ckM}a(4flM8va@bxe6u0>zSl*E7&i7eaQBxLi_6S zoGULZRpIMP(hKuq3>4Gx>U_I%Nh&27%{Eps;@qc$s7y{>VyGX@W(wj{9(zy-wA;=v zedEaD1=9B0G)Zhf+~8;hn;)ZgG%WoW?oVHyMJ1Kp6j7P$Z}9kS$FEC&5r|3tZNCdM zLzmU|R$I#XvnJ9B#+;A&9#}3e$gv_p45jxidBY6^8+#;!3#qlPuD72W%BQjTj0Trk zr;X-m(K;GiaPFp`3i5w4FF<2yUiRxNO7@Q*>k0j3EUko*&%{yi&rI8)p%U@+ssq^peByIpZbs5e+BhyKij`q zH*1efop*j-UJcT$MAODP8G-<_hDCa3V(jdDmKw2p~Pw8Fv9Xp(eT&FLX9 z)rMCW=ZTSETITkhjJl-s7!0SqzBTJ4FJ1i*IGgLeXHUC(`C6zn=8lKnl~171J8j~P zR>@GH$uHNo&9f=5{-Ut35&`Ji)n07d8vV>TXs{*?rC++VLAcg1rV@+@$x~L>YJz8c zxG@_-yO_)0o-hW6%wDgFJMKlJf2oi9Lk&3Yu9W_ULwpD=B^Ic&cgTSTNXV~eB>s-v z6TP|kksddlluLMbw6F%i*Zdc;=H|6M{qJV4vV^Cck&w%Z6*fs6pvZ2Uw;E@@^G3o~ z#~df8uopz!)lC}#56f+Rb!TNCvBX^M7t?Qep@Hz~ToHEbcOev*u%e3E>fJC#-;Ji~ zKB?>Vy(Vtd<^ctvgUKddbmdm8s1*LW4=}*R93^F{dFE{<`wZHQ zywsy@cT>5Wdp=f}4~M8%ZAr?}f>mfH7OtMKWAhuq-!9xZIhKEIx*J9wYjo*_o|uub zy^>7$j*GrC2NOPk#mS}uvwSW3+DNYxG>ikI_jBiz8-1_dj$3k4h!}!>r#bI=s<6q2 z%}}s;wo56+h&dW6FC9QAU%!~tff!ajVfs!UrE{O@uHU^FBe0T%mVMheZSvfx$DMaR zyfT0Yxp6yh!KWeP0?Z1FudmEVbO6PbUWY%C7KFJ<6Au-vitGJvN-js4<|pD9EEN%X zpzG2>?s86FRh7S?bqx`0qE|0}`2V8qt)k+Hws76TA;Agm?hxGFo!|tA;O@bj;O-Ed z;O_1O_u%gC!5vO#?|mNbeYsDU!QiE7s;gMFYRdnA6Gu6TTDL2q#KH0GAtiKXGc6OAy-UO1!%@4|YE?L@A6_Fb1V+e*g@} zZ5Y6}{QjOguhv(xIPuj<<_5vUGQ5dJT+$*B?pLo)-_4+z-*I&Tj4WWGoIux>&XQEN zJQlg|Z?w7}jGT7#hvmP~Ll96ZwD`@PHkFmk@!3*;ZtZgHJ!;d|7?B>tTx__XD*ES| z%hn{56Z<-y#q)?joHrJ#sOTi(`W=j1t_i)j3$^F>W=Pk(HdDq_XnnRV?@9?Mh$9;1 zn$<|!H_fLIUvKq3?q1Jpy51AeDE&xMO%N!B*c+f5m&y`vOf$JdUg=O|?=Oam!H>n0 zPOi=q)-poK+neH^Bb16{OcgB>uv(pph=WPXOfekyQXuE8p>U#PY`s5zj}x+g)Wo3w z6y#u8R;e@Q^GcMm?50PM2a-6|!v1C&j+mcQN-2>_v5n_Wo8jVS84Y+u510g-xa)i) z2@a-Th zJRcXY`wwH(IgmmF8!T}fn4Qkjj|la54_j%i*!}`4?O98$L}(1>S>(H17g^f9&Op_* zM0dd(xAPdB(MV%_#AxDP8P+7u!Nu7(lX7NpIuAWlM_)y=uTC}(1+QHfT{`n`RSDd% zj0PPp6T4po!Hn4QTz+QCtEVHMu9qjJZf#~p!lO*-3(MR4Xwkbrjw--!NY*QTNIOH7EmyUZ+QK%cegLR%UkcTv-Tg9 z@Al0a8X!0dg8)N+$T3a-ae?}-HSOXx__AH^a`hy*m`ml9j#j>lX{y2OwWktE<}>YV z+h_Yd?7jVH@ygPl^S~XjU1rAy4;r0%z8`GBEB?gtj3O>1G-S}ttCV?s=OGR`{s?vm zej4dge1Q5T4IcBLQhDeJ{rl%*^iAD@7(h~YhjhazgscC(D>Gk|e#6M_2`90i#mJFT zHrDmY(nH_L#wv)PPoS;b9}f6(j~_Im+EFe-0OX$#fG3W&yeuWbhzerya_pV`VJT`v?y~E2G@C)NUH)-g z)eAY5;mz>M0Rlje$s+o8GkSh?XCB}gkX*5GHK)2$u5Damd%8eRSf6&*ne%=IWB6C=c0AAg%ul;5w)0LA%aY$|U@@$}8IM0G8M88%`97xGYf^CC z^{Yze?GJa5`FuMGvk|!LBYB%7R&NUTtS{ATD$bgEg*20|`vyqQC8?4MyzEO<%5j}P zTE$sk-#AHHS!`KYY#nmg{8oD&>wr6NJWF15x%nvc`ttON?~5wWua@gSB@<#r3?8R( zNHIcpt`<5M^f<3?b3RIKCk-7t5pj5Fd^l+Xdl~-d@o>uw*goSC^d`Zsa^RHda3%q}468u{jG)lx5kEOAZF`Nj4*p zJD%5v^)+8tu@JJ-gT-y{(G6oqV%35p!yg;1ms_Jelk=9$iF&YpBrCCqtB8HuK@==R z^-L%`(>yuDfO^&J!_U9jEkx4ElS6)Uq-d9h0LfqIK;u54+#5oGMiDx)mZ)fUSnUG$ z9p9o6Plz^|#Sr$`gOdJJFX7yZK??(eFeJnlFy3N2gZex0H)8w7M1w!@8SG+fJ;8FH zkmu5bBFL3)L!39+C)3M>GaPMc7;%uo4LT|$VHU6WqjvHNRV@!{nOT|)?C)Mv&1)Eo zTU}k#@z7@hAZZG5l8X(}u6?=`wjft_kvld=*=<1X$)w$E%t2izi*EmSQv0{OQSDU+ zO<3SaDT7D9^;vpFhLsiXz2~y`WB|v#7E=q?@myszA0ty%=G8#J?Jk03#%+{j-uv_f zE_#Ss$@^X7dX@1T=f$8&dJ4CT_d7>PRFqX_Bser)+oB&nOZV0%Ccu@%_>;8C=V zbk$h!*opY?L61084|skg4IbD7C>>+4OOTM8Co)cm!*rz5#4Shz(UKsf%hjT#QYCfL z@m7+OZDt}!F=$Y?2LW3j0f;)z{NW~f*v^~q$U;-_OMI@birNQP{-28`*m8!bKcDKX z4`_shW_bfp(zgfojbEbx2vnG1Su&UgL&K=mvpB%tmE`${*6rM+cUfjV8TS5BLu7!o zYC=7Q$}|9*JTzX@K}!Yz+)*YkjP+Ir(=_L$W==nBB_pfN!T;5Ehx0CvU$FkA-tp?f zr6&*(JtMe$I8eVg*~5HfN}rB3JI`*4@?&R{MSVGG8OR%MyV(rC1;9O%K*0uTeDBAQ ze>>1^EcIiMEoxeQQ|A08SK4TNs86e82tzq z5L6JXdIuvrmc&Hc(HE1<yBf zdzD#XUaw_lM5_Kw^P4NNaB!etHz`?DZQikb_Rs44+)5i&Z39rCgY-OxY@N{33x{7| z4oxI7MnZn}wKL{Laxkyx=%=Qiw{0Rkgn^UUbtQ!@ESyc#Zh=$=F2LmXj;*u9EA5Y! z{u8XN)YMR!55k_gRhgC<#R6|9rHNgQ8FVMFf5geeM9XVXO_7F&DKY1ib>IRa!XUJk zw}Rz!EeM<4JZ8Z%zc}qYjaPWJgG&V3{CX^SC>5V?R$&B$ab)RLWCHsVZL2~qSGm0R ziGmSaE*A#3TutR|O9g-ChI^AF!24FToSpe+&G$O;04+^-YS@t@n6Li=@5dAbKj~Z^ zFcRmS^}9od=obS`J#~E*{R;KBY|(XH2=Wh)K3GB8&e^0BPoYECd3Hq$H!-?F6jTHM zXq>-V3uz@KMdMKaxm`P1xw<@KfB7dR(W(~LHzty)q@)=1Tx0Qr6MtT@T0a9DsBEX` zMS(yqrGfsW7zJEm&XCL>=1;{)F{3S>96_odn1T|!cCCUTs%8E}3QxsdU(I8rgfyMm zmTaKu>&GQzsjE>+k)^hDBxJIryS#~FZLFzGPhGrT4(C(N#mw%lBD5sw=N<4nd4n>+ zfJ>4N&_bu5+hjA+r9uMJz*$XG@)FmvdtjM7%EzcN2F>axs$@k$v5tyc9CZ~J-LmWg zof5n50;jgSYbSsJxvFcDn?>12?DiH}AK8I7-s1#m05%VVcBo9Zg$MOY8j&i~2!c

0hOT$`donwI~(&Fqvi(oj|qzVR4* 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]V;ZJ?Jx7eS(*KURO{y5^Zh7CMY>g9 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

8fq~0=I!v4AnE;d}cbadUlY^=u7 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 diff --git a/vendor/github.com/rs/zerolog/sampler.go b/vendor/github.com/rs/zerolog/sampler.go index 1be98c4..83ce2ed 100644 --- a/vendor/github.com/rs/zerolog/sampler.go +++ b/vendor/github.com/rs/zerolog/sampler.go @@ -84,7 +84,7 @@ func (s *BurstSampler) Sample(lvl Level) bool { } func (s *BurstSampler) inc() uint32 { - now := time.Now().UnixNano() + now := TimestampFunc().UnixNano() resetAt := atomic.LoadInt64(&s.resetAt) var c uint32 if now > resetAt { diff --git a/vendor/github.com/rs/zerolog/syslog.go b/vendor/github.com/rs/zerolog/syslog.go index c408283..a2b7285 100644 --- a/vendor/github.com/rs/zerolog/syslog.go +++ b/vendor/github.com/rs/zerolog/syslog.go @@ -78,3 +78,12 @@ func (sw syslogWriter) WriteLevel(level Level, p []byte) (n int, err error) { n = len(p) return } + +// Call the underlying writer's Close method if it is an io.Closer. Otherwise +// does nothing. +func (sw syslogWriter) Close() error { + if c, ok := sw.w.(io.Closer); ok { + return c.Close() + } + return nil +} diff --git a/vendor/github.com/rs/zerolog/writer.go b/vendor/github.com/rs/zerolog/writer.go index 98c932e..41b394d 100644 --- a/vendor/github.com/rs/zerolog/writer.go +++ b/vendor/github.com/rs/zerolog/writer.go @@ -1,7 +1,12 @@ package zerolog import ( + "bytes" "io" + "path" + "runtime" + "strconv" + "strings" "sync" ) @@ -12,14 +17,25 @@ type LevelWriter interface { WriteLevel(level Level, p []byte) (n int, err error) } -type levelWriterAdapter struct { +// LevelWriterAdapter adapts an io.Writer to support the LevelWriter interface. +type LevelWriterAdapter struct { io.Writer } -func (lw levelWriterAdapter) WriteLevel(l Level, p []byte) (n int, err error) { +// WriteLevel simply writes everything to the adapted writer, ignoring the level. +func (lw LevelWriterAdapter) WriteLevel(l Level, p []byte) (n int, err error) { return lw.Write(p) } +// Call the underlying writer's Close method if it is an io.Closer. Otherwise +// does nothing. +func (lw LevelWriterAdapter) Close() error { + if closer, ok := lw.Writer.(io.Closer); ok { + return closer.Close() + } + return nil +} + type syncWriter struct { mu sync.Mutex lw LevelWriter @@ -33,7 +49,7 @@ func SyncWriter(w io.Writer) io.Writer { if lw, ok := w.(LevelWriter); ok { return &syncWriter{lw: lw} } - return &syncWriter{lw: levelWriterAdapter{w}} + return &syncWriter{lw: LevelWriterAdapter{w}} } // Write implements the io.Writer interface. @@ -50,6 +66,15 @@ func (s *syncWriter) WriteLevel(l Level, p []byte) (n int, err error) { return s.lw.WriteLevel(l, p) } +func (s *syncWriter) Close() error { + s.mu.Lock() + defer s.mu.Unlock() + if closer, ok := s.lw.(io.Closer); ok { + return closer.Close() + } + return nil +} + type multiLevelWriter struct { writers []LevelWriter } @@ -82,6 +107,20 @@ func (t multiLevelWriter) WriteLevel(l Level, p []byte) (n int, err error) { return n, err } +// Calls close on all the underlying writers that are io.Closers. If any of the +// Close methods return an error, the remainder of the closers are not closed +// and the error is returned. +func (t multiLevelWriter) Close() error { + for _, w := range t.writers { + if closer, ok := w.(io.Closer); ok { + if err := closer.Close(); err != nil { + return err + } + } + } + return nil +} + // MultiLevelWriter creates a writer that duplicates its writes to all the // provided writers, similar to the Unix tee(1) command. If some writers // implement LevelWriter, their WriteLevel method will be used instead of Write. @@ -91,8 +130,217 @@ func MultiLevelWriter(writers ...io.Writer) LevelWriter { if lw, ok := w.(LevelWriter); ok { lwriters = append(lwriters, lw) } else { - lwriters = append(lwriters, levelWriterAdapter{w}) + lwriters = append(lwriters, LevelWriterAdapter{w}) } } return multiLevelWriter{lwriters} } + +// TestingLog is the logging interface of testing.TB. +type TestingLog interface { + Log(args ...interface{}) + Logf(format string, args ...interface{}) + Helper() +} + +// TestWriter is a writer that writes to testing.TB. +type TestWriter struct { + T TestingLog + + // Frame skips caller frames to capture the original file and line numbers. + Frame int +} + +// NewTestWriter creates a writer that logs to the testing.TB. +func NewTestWriter(t TestingLog) TestWriter { + return TestWriter{T: t} +} + +// Write to testing.TB. +func (t TestWriter) Write(p []byte) (n int, err error) { + t.T.Helper() + + n = len(p) + + // Strip trailing newline because t.Log always adds one. + p = bytes.TrimRight(p, "\n") + + // Try to correct the log file and line number to the caller. + if t.Frame > 0 { + _, origFile, origLine, _ := runtime.Caller(1) + _, frameFile, frameLine, ok := runtime.Caller(1 + t.Frame) + if ok { + erase := strings.Repeat("\b", len(path.Base(origFile))+len(strconv.Itoa(origLine))+3) + t.T.Logf("%s%s:%d: %s", erase, path.Base(frameFile), frameLine, p) + return n, err + } + } + t.T.Log(string(p)) + + return n, err +} + +// ConsoleTestWriter creates an option that correctly sets the file frame depth for testing.TB log. +func ConsoleTestWriter(t TestingLog) func(w *ConsoleWriter) { + return func(w *ConsoleWriter) { + w.Out = TestWriter{T: t, Frame: 6} + } +} + +// FilteredLevelWriter writes only logs at Level or above to Writer. +// +// It should be used only in combination with MultiLevelWriter when you +// want to write to multiple destinations at different levels. Otherwise +// you should just set the level on the logger and filter events early. +// When using MultiLevelWriter then you set the level on the logger to +// the lowest of the levels you use for writers. +type FilteredLevelWriter struct { + Writer LevelWriter + Level Level +} + +// Write writes to the underlying Writer. +func (w *FilteredLevelWriter) Write(p []byte) (int, error) { + return w.Writer.Write(p) +} + +// WriteLevel calls WriteLevel of the underlying Writer only if the level is equal +// or above the Level. +func (w *FilteredLevelWriter) WriteLevel(level Level, p []byte) (int, error) { + if level >= w.Level { + return w.Writer.WriteLevel(level, p) + } + return len(p), nil +} + +var triggerWriterPool = &sync.Pool{ + New: func() interface{} { + return bytes.NewBuffer(make([]byte, 0, 1024)) + }, +} + +// TriggerLevelWriter buffers log lines at the ConditionalLevel or below +// until a trigger level (or higher) line is emitted. Log lines with level +// higher than ConditionalLevel are always written out to the destination +// writer. If trigger never happens, buffered log lines are never written out. +// +// It can be used to configure "log level per request". +type TriggerLevelWriter struct { + // Destination writer. If LevelWriter is provided (usually), its WriteLevel is used + // instead of Write. + io.Writer + + // ConditionalLevel is the level (and below) at which lines are buffered until + // a trigger level (or higher) line is emitted. Usually this is set to DebugLevel. + ConditionalLevel Level + + // TriggerLevel is the lowest level that triggers the sending of the conditional + // level lines. Usually this is set to ErrorLevel. + TriggerLevel Level + + buf *bytes.Buffer + triggered bool + mu sync.Mutex +} + +func (w *TriggerLevelWriter) WriteLevel(l Level, p []byte) (n int, err error) { + w.mu.Lock() + defer w.mu.Unlock() + + // At first trigger level or above log line, we flush the buffer and change the + // trigger state to triggered. + if !w.triggered && l >= w.TriggerLevel { + err := w.trigger() + if err != nil { + return 0, err + } + } + + // Unless triggered, we buffer everything at and below ConditionalLevel. + if !w.triggered && l <= w.ConditionalLevel { + if w.buf == nil { + w.buf = triggerWriterPool.Get().(*bytes.Buffer) + } + + // We prefix each log line with a byte with the level. + // Hopefully we will never have a level value which equals a newline + // (which could interfere with reconstruction of log lines in the trigger method). + w.buf.WriteByte(byte(l)) + w.buf.Write(p) + return len(p), nil + } + + // Anything above ConditionalLevel is always passed through. + // Once triggered, everything is passed through. + if lw, ok := w.Writer.(LevelWriter); ok { + return lw.WriteLevel(l, p) + } + return w.Write(p) +} + +// trigger expects lock to be held. +func (w *TriggerLevelWriter) trigger() error { + if w.triggered { + return nil + } + w.triggered = true + + if w.buf == nil { + return nil + } + + p := w.buf.Bytes() + for len(p) > 0 { + // We do not use bufio.Scanner here because we already have full buffer + // in the memory and we do not want extra copying from the buffer to + // scanner's token slice, nor we want to hit scanner's token size limit, + // and we also want to preserve newlines. + i := bytes.IndexByte(p, '\n') + line := p[0 : i+1] + p = p[i+1:] + // We prefixed each log line with a byte with the level. + level := Level(line[0]) + line = line[1:] + var err error + if lw, ok := w.Writer.(LevelWriter); ok { + _, err = lw.WriteLevel(level, line) + } else { + _, err = w.Write(line) + } + if err != nil { + return err + } + } + + return nil +} + +// Trigger forces flushing the buffer and change the trigger state to +// triggered, if the writer has not already been triggered before. +func (w *TriggerLevelWriter) Trigger() error { + w.mu.Lock() + defer w.mu.Unlock() + + return w.trigger() +} + +// Close closes the writer and returns the buffer to the pool. +func (w *TriggerLevelWriter) Close() error { + w.mu.Lock() + defer w.mu.Unlock() + + if w.buf == nil { + return nil + } + + // We return the buffer only if it has not grown above the limit. + // This prevents accumulation of large buffers in the pool just + // because occasionally a large buffer might be needed. + if w.buf.Cap() <= TriggerLevelWriterBufferReuseLimit { + w.buf.Reset() + triggerWriterPool.Put(w.buf) + } + w.buf = nil + + return nil +} diff --git a/vendor/modules.txt b/vendor/modules.txt index 5f20128..5f6fd3b 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -9,7 +9,13 @@ github.com/go-ole/go-ole/oleutil ## explicit; go 1.18 github.com/mackerelio/go-osstat/loadavg github.com/mackerelio/go-osstat/memory -# github.com/rs/zerolog v1.25.0 +# github.com/mattn/go-colorable v0.1.13 +## explicit; go 1.15 +github.com/mattn/go-colorable +# github.com/mattn/go-isatty v0.0.19 +## explicit; go 1.15 +github.com/mattn/go-isatty +# github.com/rs/zerolog v1.33.0 ## explicit; go 1.15 github.com/rs/zerolog github.com/rs/zerolog/internal/cbor -- 2.39.5